PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KPHRpdGxlPk1vZHVsZSBpYnJvd3NlPC90aXRsZT4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldC5jc3MiIHRpdGxlPSJFRG9jIj4KPC9oZWFkPgo8Ym9keSBiZ2NvbG9yPSJ3aGl0ZSI+CjxkaXYgY2xhc3M9Im5hdmJhciI+PGEgbmFtZT0iI25hdmJhcl90b3AiPjwvYT48dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiBzdW1tYXJ5PSJuYXZpZ2F0aW9uIGJhciI+PHRyPjx0ZD48YSBocmVmPSJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0ib3ZlcnZpZXdGcmFtZSI+T3ZlcnZpZXc8L2E+PC90ZD48dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5lcmxhbmcub3JnLyI+PGltZyBzcmM9ImVybGFuZy5wbmciIGFsaWduPSJyaWdodCIgYm9yZGVyPSIwIiBhbHQ9ImVybGFuZyBsb2dvIj48L2E+PC90ZD48L3RyPjwvdGFibGU+PC9kaXY+Cjxocj4KCjxoMT5Nb2R1bGUgaWJyb3dzZTwvaDE+Cjx1bCBjbGFzcz0iaW5kZXgiPjxsaT48YSBocmVmPSIjZGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uPC9hPjwvbGk+PGxpPjxhIGhyZWY9IiNpbmRleCI+RnVuY3Rpb24gSW5kZXg8L2E+PC9saT48bGk+PGEgaHJlZj0iI2Z1bmN0aW9ucyI+RnVuY3Rpb24gRGV0YWlsczwvYT48L2xpPjwvdWw+VGhlIGlicm93c2UgYXBwbGljYXRpb24gaW1wbGVtZW50cyBhbiBIVFRQIDEuMSBjbGllbnQgaW4gZXJsYW5nLgo8cD5Db3B5cmlnaHQgqSAyMDA1LTIwMTAgQ2hhbmRyYXNoZWtoYXIgTXVsbGFwYXJ0aGk8L3A+Cgo8cD48Yj5WZXJzaW9uOjwvYj4gMi4xLjA8L3A+CjxwPjxiPkJlaGF2aW91cnM6PC9iPiA8YSBocmVmPSJnZW5fc2VydmVyLmh0bWwiPjx0dD5nZW5fc2VydmVyPC90dD48L2E+LjwvcD4KPHA+PGI+QXV0aG9yczo8L2I+IENoYW5kcmFzaGVraGFyIE11bGxhcGFydGhpICg8YSBocmVmPSJtYWlsdG86Y2hhbmRyYXNoZWtoYXIgZG90IG11bGxhcGFydGhpIGF0IGdtYWlsIGRvdCBjb20iPjx0dD5jaGFuZHJhc2hla2hhciBkb3QgbXVsbGFwYXJ0aGkgYXQgZ21haWwgZG90IGNvbTwvdHQ+PC9hPikuPC9wPgoKPGgyPjxhIG5hbWU9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvYT48L2gyPjxwPlRoZSBpYnJvd3NlIGFwcGxpY2F0aW9uIGltcGxlbWVudHMgYW4gSFRUUCAxLjEgY2xpZW50IGluIGVybGFuZy4gVGhpcyAgCm1vZHVsZSBpbXBsZW1lbnRzIHRoZSBBUEkgb2YgdGhlIEhUVFAgY2xpZW50LiBUaGVyZSBpcyBvbmUgbmFtZWQgIApwcm9jZXNzIGNhbGxlZCAnaWJyb3dzZScgd2hpY2ggYXNzaXN0cyBpbiBsb2FkIGJhbGFuY2luZyBhbmQgbWFpbnRhaW5pbmcgY29uZmlndXJhdGlvbi4gVGhlcmUgaXMgb25lIGxvYWQgYmFsYW5jaW5nIHByb2Nlc3MgcGVyIHVuaXF1ZSB3ZWJzZXJ2ZXIuIFRoZXJlIGlzICAKb25lIHByb2Nlc3MgdG8gaGFuZGxlIG9uZSBUQ1AgY29ubmVjdGlvbiB0byBhIHdlYnNlcnZlciAgCihpbXBsZW1lbnRlZCBpbiB0aGUgbW9kdWxlIGlicm93c2VfaHR0cF9jbGllbnQpLiBNdWx0aXBsZSBjb25uZWN0aW9ucyB0byBhICAKd2Vic2VydmVyIGFyZSBzZXR1cCBiYXNlZCBvbiB0aGUgc2V0dGluZ3MgZm9yIGVhY2ggd2Vic2VydmVyLiBUaGUgIAppYnJvd3NlIHByb2Nlc3MgYWxzbyBkZXRlcm1pbmVzIHdoaWNoIGNvbm5lY3Rpb24gdG8gcGlwZWxpbmUgYSAgCmNlcnRhaW4gcmVxdWVzdCBvbi4gIFRoZSBmdW5jdGlvbnMgdG8gY2FsbCBhcmUgc2VuZF9yZXEvMywgIApzZW5kX3JlcS80LCBzZW5kX3JlcS81LCBzZW5kX3JlcS82LjwvcD4KIAogIDxwPkhlcmUgYXJlIGEgZmV3IHNhbXBsZSBpbnZvY2F0aW9ucy48L3A+CiAKICA8Y29kZT4KICBpYnJvd3NlOnNlbmRfcmVxKCJodHRwOi8vaW50cmFuZXQvbWVzc2VuZ2VyLyIsIFtdLCBnZXQpLgogIDxicj48YnI+CiAKICBpYnJvd3NlOnNlbmRfcmVxKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20vIiwgW10sIGdldCwgW10sCiAgICAgICAgICAgICAgICBbe3Byb3h5X3VzZXIsICJYWFhYWCJ9LAogICAgICAgICAgICAgICAgIHtwcm94eV9wYXNzd29yZCwgIlhYWFhYIn0sCiAgICAgICAgICAgICAgICAge3Byb3h5X2hvc3QsICJwcm94eSJ9LAogICAgICAgICAgICAgICAgIHtwcm94eV9wb3J0LCA4MDgwfV0sIDEwMDApLgogIDxicj48YnI+CiAKIGlicm93c2U6c2VuZF9yZXEoImh0dHA6Ly93d3cuZXJsYW5nLm9yZy9kb3dubG9hZC9vdHBfc3JjX1IxMEItMy50YXIuZ3oiLCBbXSwgZ2V0LCBbXSwKICAgICAgICAgICAgICAgIFt7cHJveHlfdXNlciwgIlhYWFhYIn0sCiAgICAgICAgICAgICAgICAge3Byb3h5X3Bhc3N3b3JkLCAiWFhYWFgifSwKICAgICAgICAgICAgICAgICB7cHJveHlfaG9zdCwgInByb3h5In0sCiAgICAgICAgICAgICAgICAge3Byb3h5X3BvcnQsIDgwODB9LAogICAgICAgICAgICAgICAgIHtzYXZlX3Jlc3BvbnNlX3RvX2ZpbGUsIHRydWV9XSwgMTAwMCkuCiAgPGJyPjxicj4KIAogIGlicm93c2U6c2VuZF9yZXEoImh0dHA6Ly93d3cuZXJsYW5nLm9yZyIsIFtdLCBoZWFkKS4KIAogIDxicj48YnI+CiAgaWJyb3dzZTpzZW5kX3JlcSgiaHR0cDovL3d3dy5zdW4uY29tIiwgW10sIG9wdGlvbnMpLgogCiAgPGJyPjxicj4KICBpYnJvd3NlOnNlbmRfcmVxKCJodHRwOi8vd3d3LmJiYy5jby51ayIsIFtdLCB0cmFjZSkuCiAKICA8YnI+PGJyPgogIGlicm93c2U6c2VuZF9yZXEoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIsIFtdLCBnZXQsIFtdLAogICAgICAgICAgICAgICAgICAgIFt7c3RyZWFtX3RvLCBzZWxmKCl9XSkuCiAgPC9jb2RlPgogCjxoMj48YSBuYW1lPSJpbmRleCI+RnVuY3Rpb24gSW5kZXg8L2E+PC9oMj4KPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgc3VtbWFyeT0iZnVuY3Rpb24gaW5kZXgiPjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNhbGxfdHJhY2Vfb2ZmLTAiPmFsbF90cmFjZV9vZmYvMDwvYT48L3RkPjx0ZD5UdXJuIE9mZiBBTEwgdHJhY2luZy48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNjb2RlX2NoYW5nZS0zIj5jb2RlX2NoYW5nZS8zPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI2dldF9jb25maWdfdmFsdWUtMSI+Z2V0X2NvbmZpZ192YWx1ZS8xPC9hPjwvdGQ+PHRkPkludGVybmFsIGV4cG9ydC48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNnZXRfY29uZmlnX3ZhbHVlLTIiPmdldF9jb25maWdfdmFsdWUvMjwvYT48L3RkPjx0ZD5JbnRlcm5hbCBleHBvcnQuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjaGFuZGxlX2NhbGwtMyI+aGFuZGxlX2NhbGwvMzwvYT48L3RkPjx0ZD48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNoYW5kbGVfY2FzdC0yIj5oYW5kbGVfY2FzdC8yPC9hPjwvdGQ+PHRkPjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI2hhbmRsZV9pbmZvLTIiPmhhbmRsZV9pbmZvLzI8L2E+PC90ZD48dGQ+PC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjaW5pdC0xIj5pbml0LzE8L2E+PC90ZD48dGQ+PC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjcmVzY2FuX2NvbmZpZy0wIj5yZXNjYW5fY29uZmlnLzA8L2E+PC90ZD48dGQ+Q2xlYXIgY3VycmVudCBjb25maWd1cmF0aW9uIGZvciBpYnJvd3NlIGFuZCBsb2FkIGZyb20gdGhlIGZpbGUKICBpYnJvd3NlLmNvbmYgaW4gdGhlIElCUk9XU0VfRUJJTi8uLi9wcml2IGRpcmVjdG9yeS48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNyZXNjYW5fY29uZmlnLTEiPnJlc2Nhbl9jb25maWcvMTwvYT48L3RkPjx0ZD48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzZW5kX3JlcS0zIj5zZW5kX3JlcS8zPC9hPjwvdGQ+PHRkPlRoaXMgaXMgdGhlIGJhc2ljIGZ1bmN0aW9uIHRvIHNlbmQgYSBIVFRQIHJlcXVlc3QuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2VuZF9yZXEtNCI+c2VuZF9yZXEvNDwvYT48L3RkPjx0ZD5TYW1lIGFzIHNlbmRfcmVxLzMuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2VuZF9yZXEtNSI+c2VuZF9yZXEvNTwvYT48L3RkPjx0ZD5TYW1lIGFzIHNlbmRfcmVxLzQuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2VuZF9yZXEtNiI+c2VuZF9yZXEvNjwvYT48L3RkPjx0ZD5TYW1lIGFzIHNlbmRfcmVxLzUuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2VuZF9yZXFfZGlyZWN0LTQiPnNlbmRfcmVxX2RpcmVjdC80PC9hPjwvdGQ+PHRkPlNhbWUgYXMgc2VuZF9yZXEvMyBleGNlcHQgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIFBJRAogIHJldHVybmVkIGJ5IHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgb3Igc3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8yLjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3NlbmRfcmVxX2RpcmVjdC01Ij5zZW5kX3JlcV9kaXJlY3QvNTwvYT48L3RkPjx0ZD5TYW1lIGFzIHNlbmRfcmVxLzQgZXhjZXB0IHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBQSUQKICByZXR1cm5lZCBieSBzcGF3bl93b3JrZXJfcHJvY2Vzcy8yIG9yIHNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MvMi48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzZW5kX3JlcV9kaXJlY3QtNiI+c2VuZF9yZXFfZGlyZWN0LzY8L2E+PC90ZD48dGQ+U2FtZSBhcyBzZW5kX3JlcS81IGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgUElECiAgcmV0dXJuZWQgYnkgc3Bhd25fd29ya2VyX3Byb2Nlc3MvMiBvciBzcGF3bl9saW5rX3dvcmtlcl9wcm9jZXNzLzIuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2VuZF9yZXFfZGlyZWN0LTciPnNlbmRfcmVxX2RpcmVjdC83PC9hPjwvdGQ+PHRkPlNhbWUgYXMgc2VuZF9yZXEvNiBleGNlcHQgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIFBJRAogIHJldHVybmVkIGJ5IHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgb3Igc3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8yLjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3NldF9kZXN0LTMiPnNldF9kZXN0LzM8L2E+PC90ZD48dGQ+RGVwcmVjYXRlZC48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzZXRfbWF4X3BpcGVsaW5lX3NpemUtMyI+c2V0X21heF9waXBlbGluZV9zaXplLzM8L2E+PC90ZD48dGQ+U2V0IHRoZSBtYXhpbXVtIHBpcGVsaW5lIHNpemUgZm9yIGVhY2ggY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIEhvc3Q6UG9ydC48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzZXRfbWF4X3Nlc3Npb25zLTMiPnNldF9tYXhfc2Vzc2lvbnMvMzwvYT48L3RkPjx0ZD5TZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgdG8gYSBzcGVjaWZpYyBIb3N0OlBvcnQuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc2hvd19kZXN0X3N0YXR1cy0wIj5zaG93X2Rlc3Rfc3RhdHVzLzA8L2E+PC90ZD48dGQ+U2hvd3Mgc29tZSBpbnRlcm5hbCBpbmZvcm1hdGlvbiBhYm91dCBsb2FkIGJhbGFuY2luZy48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzaG93X2Rlc3Rfc3RhdHVzLTIiPnNob3dfZGVzdF9zdGF0dXMvMjwvYT48L3RkPjx0ZD5TaG93cyBzb21lIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGxvYWQgYmFsYW5jaW5nIHRvIGEKICBzcGVjaWZpZWQgSG9zdDpQb3J0LjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3NwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MtMSI+c3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8xPC9hPjwvdGQ+PHRkPlNhbWUgYXMgc3Bhd25fd29ya2VyX3Byb2Nlc3MvMSBleGNlcHQgdGhlIHRoZSBjYWxsaW5nIHByb2Nlc3MKICBpcyBsaW5rZWQgdG8gdGhlIHdvcmtlciBwcm9jZXNzIHdoaWNoIGlzIHNwYXduZWQuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy0yIj5zcGF3bl9saW5rX3dvcmtlcl9wcm9jZXNzLzI8L2E+PC90ZD48dGQ+U2FtZSBhcyBzcGF3bl93b3JrZXJfcHJvY2Vzcy8yIGV4Y2VwdCB0aGUgdGhlIGNhbGxpbmcgcHJvY2VzcwogIGlzIGxpbmtlZCB0byB0aGUgd29ya2VyIHByb2Nlc3Mgd2hpY2ggaXMgc3Bhd25lZC48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzcGF3bl93b3JrZXJfcHJvY2Vzcy0xIj5zcGF3bl93b3JrZXJfcHJvY2Vzcy8xPC9hPjwvdGQ+PHRkPkNyZWF0ZXMgYSBIVFRQIGNsaWVudCBwcm9jZXNzIHRvIHRoZSBzcGVjaWZpZWQgSG9zdDpQb3J0IHdoaWNoCiAgaXMgbm90IHBhcnQgb2YgdGhlIGxvYWQgYmFsYW5jaW5nIHBvb2wuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc3Bhd25fd29ya2VyX3Byb2Nlc3MtMiI+c3Bhd25fd29ya2VyX3Byb2Nlc3MvMjwvYT48L3RkPjx0ZD5TYW1lIGFzIHNwYXduX3dvcmtlcl9wcm9jZXNzLzEgYnV0IHRha2VzIGFzIGlucHV0IGEgSG9zdCBhbmQgUG9ydAogIGluc3RlYWQgb2YgYSBVUkwuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc3RhcnQtMCI+c3RhcnQvMDwvYT48L3RkPjx0ZD5TdGFydHMgdGhlIGlicm93c2UgcHJvY2VzcyB3aXRob3V0IGxpbmtpbmcuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc3RhcnRfbGluay0wIj5zdGFydF9saW5rLzA8L2E+PC90ZD48dGQ+U3RhcnRzIHRoZSBpYnJvd3NlIHByb2Nlc3MgbGlua2VkIHRvIHRoZSBjYWxsaW5nIHByb2Nlc3MuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjc3RvcC0wIj5zdG9wLzA8L2E+PC90ZD48dGQ+U3RvcCB0aGUgaWJyb3dzZSBwcm9jZXNzLjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3N0b3Bfd29ya2VyX3Byb2Nlc3MtMSI+c3RvcF93b3JrZXJfcHJvY2Vzcy8xPC9hPjwvdGQ+PHRkPlRlcm1pbmF0ZSBhIHdvcmtlciBwcm9jZXNzIHNwYXduZWQgdXNpbmcKICBzcGF3bl93b3JrZXJfcHJvY2Vzcy8yIG9yIHNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MvMi48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiNzdHJlYW1fY2xvc2UtMSI+c3RyZWFtX2Nsb3NlLzE8L2E+PC90ZD48dGQ+VGVsbCBpYnJvd3NlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKICBzcGVjaWZpZWQgc3RyZWFtLjwvdGQ+PC90cj4KPHRyPjx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3N0cmVhbV9uZXh0LTEiPnN0cmVhbV9uZXh0LzE8L2E+PC90ZD48dGQ+VGVsbCBpYnJvd3NlIHRvIHN0cmVhbSB0aGUgbmV4dCBjaHVuayBvZiBkYXRhIHRvIHRoZQogIGNhbGxlci48L3RkPjwvdHI+Cjx0cj48dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9IiN0ZXJtaW5hdGUtMiI+dGVybWluYXRlLzI8L2E+PC90ZD48dGQ+PC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjdHJhY2Vfb2ZmLTAiPnRyYWNlX29mZi8wPC9hPjwvdGQ+PHRkPlR1cm4gdHJhY2luZyBvZmYgZm9yIHRoZSBpYnJvd3NlIHByb2Nlc3MuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjdHJhY2Vfb2ZmLTIiPnRyYWNlX29mZi8yPC9hPjwvdGQ+PHRkPlR1cm4gdHJhY2luZyBPRkYgZm9yIGFsbCBjb25uZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIEhUVFAKICBzZXJ2ZXIuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjdHJhY2Vfb24tMCI+dHJhY2Vfb24vMDwvYT48L3RkPjx0ZD5UdXJuIHRyYWNpbmcgb24gZm9yIHRoZSBpYnJvd3NlIHByb2Nlc3MuPC90ZD48L3RyPgo8dHI+PHRkIHZhbGlnbj0idG9wIj48YSBocmVmPSIjdHJhY2Vfb24tMiI+dHJhY2Vfb24vMjwvYT48L3RkPjx0ZD5UdXJuIHRyYWNpbmcgb24gZm9yIGFsbCBjb25uZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIEhUVFAKICBzZXJ2ZXIuPC90ZD48L3RyPgo8L3RhYmxlPgoKPGgyPjxhIG5hbWU9ImZ1bmN0aW9ucyI+RnVuY3Rpb24gRGV0YWlsczwvYT48L2gyPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0iYWxsX3RyYWNlX29mZi0wIj5hbGxfdHJhY2Vfb2ZmLzA8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5hbGxfdHJhY2Vfb2ZmKCkgLSZndDsgb2s8L3R0PjwvcD4KPC9kaXY+PHA+VHVybiBPZmYgQUxMIHRyYWNpbmc8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJjb2RlX2NoYW5nZS0zIj5jb2RlX2NoYW5nZS8zPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+Y29kZV9jaGFuZ2UoT2xkVnNuLCBTdGF0ZSwgRXh0cmEpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0iZ2V0X2NvbmZpZ192YWx1ZS0xIj5nZXRfY29uZmlnX3ZhbHVlLzE8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5nZXRfY29uZmlnX3ZhbHVlKEtleSkgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+PHA+SW50ZXJuYWwgZXhwb3J0PC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0iZ2V0X2NvbmZpZ192YWx1ZS0yIj5nZXRfY29uZmlnX3ZhbHVlLzI8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5nZXRfY29uZmlnX3ZhbHVlKEtleSwgRGVmVmFsKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5JbnRlcm5hbCBleHBvcnQ8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJoYW5kbGVfY2FsbC0zIj5oYW5kbGVfY2FsbC8zPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+aGFuZGxlX2NhbGwoUmVxdWVzdCwgRnJvbSwgU3RhdGUpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0iaGFuZGxlX2Nhc3QtMiI+aGFuZGxlX2Nhc3QvMjwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PmhhbmRsZV9jYXN0KE1zZywgU3RhdGUpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0iaGFuZGxlX2luZm8tMiI+aGFuZGxlX2luZm8vMjwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PmhhbmRsZV9pbmZvKEluZm8sIFN0YXRlKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9ImluaXQtMSI+aW5pdC8xPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+aW5pdChYMSkgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJyZXNjYW5fY29uZmlnLTAiPnJlc2Nhbl9jb25maWcvMDwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnJlc2Nhbl9jb25maWcoKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5DbGVhciBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZm9yIGlicm93c2UgYW5kIGxvYWQgZnJvbSB0aGUgZmlsZQogIGlicm93c2UuY29uZiBpbiB0aGUgSUJST1dTRV9FQklOLy4uL3ByaXYgZGlyZWN0b3J5LiBDdXJyZW50CiAgY29uZmlndXJhdGlvbiBpcyBjbGVhcmVkIG9ubHkgaWYgdGhlIGlicm93c2UuY29uZiBmaWxlIGlzIHJlYWRhYmxlCiAgdXNpbmcgZmlsZTpjb25zdWx0LzE8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJyZXNjYW5fY29uZmlnLTEiPnJlc2Nhbl9jb25maWcvMTwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnJlc2Nhbl9jb25maWcoRmlsZSkgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZW5kX3JlcS0zIj5zZW5kX3JlcS8zPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c2VuZF9yZXEoVXJsOjpzdHJpbmcoKSwgSGVhZGVyczo6PGEgaHJlZj0iI3R5cGUtaGVhZGVyTGlzdCI+aGVhZGVyTGlzdCgpPC9hPiwgTWV0aG9kOjo8YSBocmVmPSIjdHlwZS1tZXRob2QiPm1ldGhvZCgpPC9hPikgLSZndDsgPGEgaHJlZj0iI3R5cGUtcmVzcG9uc2UiPnJlc3BvbnNlKCk8L2E+PC90dD4KPHVsIGNsYXNzPSJkZWZpbml0aW9ucyI+PGxpPjx0dD48YSBuYW1lPSJ0eXBlLWhlYWRlckxpc3QiPmhlYWRlckxpc3QoKTwvYT4gPSBbezxhIGhyZWY9IiN0eXBlLWhlYWRlciI+aGVhZGVyKCk8L2E+LCA8YSBocmVmPSIjdHlwZS12YWx1ZSI+dmFsdWUoKTwvYT59XTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLWhlYWRlciI+aGVhZGVyKCk8L2E+ID0gYXRvbSgpIHwgc3RyaW5nKCk8L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS12YWx1ZSI+dmFsdWUoKTwvYT4gPSB0ZXJtKCk8L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS1tZXRob2QiPm1ldGhvZCgpPC9hPiA9IGdldCB8IHBvc3QgfCBoZWFkIHwgb3B0aW9ucyB8IHB1dCB8IGRlbGV0ZSB8IHRyYWNlIHwgbWtjb2wgfCBwcm9wZmluZCB8IHByb3BwYXRjaCB8IGxvY2sgfCB1bmxvY2sgfCBtb3ZlIHwgY29weTwvdHQ+PC9saT4KPGxpPjx0dD5TdGF0dXMgPSBzdHJpbmcoKTwvdHQ+PC9saT4KPGxpPjx0dD5SZXNwb25zZUhlYWRlcnMgPSBbPGEgaHJlZj0iI3R5cGUtcmVzcEhlYWRlciI+cmVzcEhlYWRlcigpPC9hPl08L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS1yZXNwSGVhZGVyIj5yZXNwSGVhZGVyKCk8L2E+ID0gezxhIGhyZWY9IiN0eXBlLWhlYWRlck5hbWUiPmhlYWRlck5hbWUoKTwvYT4sIDxhIGhyZWY9IiN0eXBlLWhlYWRlclZhbHVlIj5oZWFkZXJWYWx1ZSgpPC9hPn08L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS1oZWFkZXJOYW1lIj5oZWFkZXJOYW1lKCk8L2E+ID0gc3RyaW5nKCk8L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS1oZWFkZXJWYWx1ZSI+aGVhZGVyVmFsdWUoKTwvYT4gPSBzdHJpbmcoKTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXJlc3BvbnNlIj5yZXNwb25zZSgpPC9hPiA9IHtvaywgU3RhdHVzLCBSZXNwb25zZUhlYWRlcnMsIFJlc3BvbnNlQm9keX0gfCB7aWJyb3dzZV9yZXFfaWQsIDxhIGhyZWY9IiN0eXBlLXJlcV9pZCI+cmVxX2lkKCk8L2E+fSB8IHtlcnJvciwgUmVhc29ufTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXJlcV9pZCI+cmVxX2lkKCk8L2E+ID0gdGVybSgpPC90dD48L2xpPgo8bGk+PHR0PlJlc3BvbnNlQm9keSA9IHN0cmluZygpIHwge2ZpbGUsIEZpbGVuYW1lfTwvdHQ+PC9saT4KPGxpPjx0dD5SZWFzb24gPSB0ZXJtKCk8L3R0PjwvbGk+CjwvdWw+PC9wPgo8L2Rpdj48cD5UaGlzIGlzIHRoZSBiYXNpYyBmdW5jdGlvbiB0byBzZW5kIGEgSFRUUCByZXF1ZXN0LgogIFRoZSBTdGF0dXMgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgSFRUUCBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgd2Vic2VydmVyPC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0ic2VuZF9yZXEtNCI+c2VuZF9yZXEvNDwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnNlbmRfcmVxKFVybCwgSGVhZGVycywgTWV0aG9kOjo8YSBocmVmPSIjdHlwZS1tZXRob2QiPm1ldGhvZCgpPC9hPiwgQm9keTo6PGEgaHJlZj0iI3R5cGUtYm9keSI+Ym9keSgpPC9hPikgLSZndDsgPGEgaHJlZj0iI3R5cGUtcmVzcG9uc2UiPnJlc3BvbnNlKCk8L2E+PC90dD4KPHVsIGNsYXNzPSJkZWZpbml0aW9ucyI+PGxpPjx0dD48YSBuYW1lPSJ0eXBlLWJvZHkiPmJvZHkoKTwvYT4gPSBbXSB8IHN0cmluZygpIHwgYmluYXJ5KCkgfCA8YSBocmVmPSIjdHlwZS1mdW5fYXJpdHlfMCI+ZnVuX2FyaXR5XzAoKTwvYT4gfCB7PGEgaHJlZj0iI3R5cGUtZnVuX2FyaXR5XzEiPmZ1bl9hcml0eV8xKCk8L2E+LCA8YSBocmVmPSIjdHlwZS1pbml0aWFsX3N0YXRlIj5pbml0aWFsX3N0YXRlKCk8L2E+fTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLWluaXRpYWxfc3RhdGUiPmluaXRpYWxfc3RhdGUoKTwvYT4gPSB0ZXJtKCk8L3R0PjwvbGk+CjwvdWw+PC9wPgo8L2Rpdj48cD5TYW1lIGFzIHNlbmRfcmVxLzMuCiAgSWYgYSBsaXN0IGlzIHNwZWNpZmllZCBmb3IgdGhlIGJvZHkgaXQgaGFzIHRvIGJlIGEgZmxhdCBsaXN0LiBUaGUgYm9keSBjYW4gYWxzbyBiZSBhIGZ1bi8wIG9yIGEgZnVuLzEuIDxicj4KICBJZiBmdW4vMCwgdGhlIGNvbm5lY3Rpb24gaGFuZGxpbmcgcHJvY2VzcyB3aWxsIHJlcGVhdGRlbHkgY2FsbCB0aGUgZnVuIHVudGlsIGl0IHJldHVybnMgYW4gZXJyb3Igb3IgZW9mLiA8cHJlPkZ1bigpID0ge29rLCBEYXRhfSB8IGVvZjwvcHJlPjxicj4KICBJZiBmdW4vMSwgdGhlIGNvbm5lY3Rpb24gaGFuZGxpbmcgcHJvY2VzcyB3aWxsIHJlcGVhdGVkbHkgY2FsbCB0aGUgZnVuIHdpdGggdGhlIHN1cHBsaWVkIHN0YXRlIHVudGlsIGl0IHJldHVybnMgYW4gZXJyb3Igb3IgZW9mLiA8cHJlPkZ1bihTdGF0ZSkgPSB7b2ssIERhdGF9IHwge29rLCBEYXRhLCBOZXdTdGF0ZX0gfCBlb2Y8L3ByZT48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZW5kX3JlcS01Ij5zZW5kX3JlcS81PC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c2VuZF9yZXEoVXJsOjpzdHJpbmcoKSwgSGVhZGVyczo6PGEgaHJlZj0iI3R5cGUtaGVhZGVyTGlzdCI+aGVhZGVyTGlzdCgpPC9hPiwgTWV0aG9kOjo8YSBocmVmPSIjdHlwZS1tZXRob2QiPm1ldGhvZCgpPC9hPiwgQm9keTo6PGEgaHJlZj0iI3R5cGUtYm9keSI+Ym9keSgpPC9hPiwgT3B0aW9uczo6PGEgaHJlZj0iI3R5cGUtb3B0aW9uTGlzdCI+b3B0aW9uTGlzdCgpPC9hPikgLSZndDsgPGEgaHJlZj0iI3R5cGUtcmVzcG9uc2UiPnJlc3BvbnNlKCk8L2E+PC90dD4KPHVsIGNsYXNzPSJkZWZpbml0aW9ucyI+PGxpPjx0dD48YSBuYW1lPSJ0eXBlLW9wdGlvbkxpc3QiPm9wdGlvbkxpc3QoKTwvYT4gPSBbPGEgaHJlZj0iI3R5cGUtb3B0aW9uIj5vcHRpb24oKTwvYT5dPC90dD48L2xpPgo8bGk+PHR0PjxhIG5hbWU9InR5cGUtb3B0aW9uIj5vcHRpb24oKTwvYT4gPSB7bWF4X3Nlc3Npb25zLCBpbnRlZ2VyKCl9IHwge3Jlc3BvbnNlX2Zvcm1hdCwgPGEgaHJlZj0iI3R5cGUtcmVzcG9uc2VfZm9ybWF0Ij5yZXNwb25zZV9mb3JtYXQoKTwvYT59IHwge3N0cmVhbV9jaHVua19zaXplLCBpbnRlZ2VyKCl9IHwge21heF9waXBlbGluZV9zaXplLCBpbnRlZ2VyKCl9IHwge3RyYWNlLCA8YSBocmVmPSIjdHlwZS1ib29sZWFuIj5ib29sZWFuKCk8L2E+fSB8IHtpc19zc2wsIDxhIGhyZWY9IiN0eXBlLWJvb2xlYW4iPmJvb2xlYW4oKTwvYT59IHwge3NzbF9vcHRpb25zLCBbU1NMT3B0XX0gfCB7cG9vbF9uYW1lLCBhdG9tKCl9IHwge3Byb3h5X2hvc3QsIHN0cmluZygpfSB8IHtwcm94eV9wb3J0LCBpbnRlZ2VyKCl9IHwge3Byb3h5X3VzZXIsIHN0cmluZygpfSB8IHtwcm94eV9wYXNzd29yZCwgc3RyaW5nKCl9IHwge3VzZV9hYnNvbHV0ZV91cmksIDxhIGhyZWY9IiN0eXBlLWJvb2xlYW4iPmJvb2xlYW4oKTwvYT59IHwge2Jhc2ljX2F1dGgsIHs8YSBocmVmPSIjdHlwZS11c2VybmFtZSI+dXNlcm5hbWUoKTwvYT4sIDxhIGhyZWY9IiN0eXBlLXBhc3N3b3JkIj5wYXNzd29yZCgpPC9hPn19IHwge2Nvb2tpZSwgc3RyaW5nKCl9IHwge2NvbnRlbnRfbGVuZ3RoLCBpbnRlZ2VyKCl9IHwge2NvbnRlbnRfdHlwZSwgc3RyaW5nKCl9IHwge3NhdmVfcmVzcG9uc2VfdG9fZmlsZSwgPGEgaHJlZj0iI3R5cGUtc3J0ZiI+c3J0ZigpPC9hPn0gfCB7c3RyZWFtX3RvLCA8YSBocmVmPSIjdHlwZS1zdHJlYW1fdG8iPnN0cmVhbV90bygpPC9hPn0gfCB7aHR0cF92c24sIHtNYWpvclZzbiwgTWlub3JWc259fSB8IHtob3N0X2hlYWRlciwgc3RyaW5nKCl9IHwge2luYWN0aXZpdHlfdGltZW91dCwgaW50ZWdlcigpfSB8IHtjb25uZWN0X3RpbWVvdXQsIGludGVnZXIoKX0gfCB7c29ja2V0X29wdGlvbnMsIFNvY2tfb3B0c30gfCB7dHJhbnNmZXJfZW5jb2RpbmcsIHtjaHVua2VkLCBDaHVua1NpemV9fSB8IHtoZWFkZXJzX2FzX2lzLCA8YSBocmVmPSIjdHlwZS1ib29sZWFuIj5ib29sZWFuKCk8L2E+fSB8IHtnaXZlX3Jhd19oZWFkZXJzLCA8YSBocmVmPSIjdHlwZS1ib29sZWFuIj5ib29sZWFuKCk8L2E+fSB8IHtwcmVzZXJ2ZV9jaHVua2VkX2VuY29kaW5nLCA8YSBocmVmPSIjdHlwZS1ib29sZWFuIj5ib29sZWFuKCk8L2E+fTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXN0cmVhbV90byI+c3RyZWFtX3RvKCk8L2E+ID0gPGEgaHJlZj0iI3R5cGUtcHJvY2VzcyI+cHJvY2VzcygpPC9hPiB8IHs8YSBocmVmPSIjdHlwZS1wcm9jZXNzIj5wcm9jZXNzKCk8L2E+LCBvbmNlfTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXByb2Nlc3MiPnByb2Nlc3MoKTwvYT4gPSBwaWQoKSB8IGF0b20oKTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXVzZXJuYW1lIj51c2VybmFtZSgpPC9hPiA9IHN0cmluZygpPC90dD48L2xpPgo8bGk+PHR0PjxhIG5hbWU9InR5cGUtcGFzc3dvcmQiPnBhc3N3b3JkKCk8L2E+ID0gc3RyaW5nKCk8L3R0PjwvbGk+CjxsaT48dHQ+U1NMT3B0ID0gdGVybSgpPC90dD48L2xpPgo8bGk+PHR0PlNvY2tfb3B0cyA9IFtTb2NrX29wdF08L3R0PjwvbGk+CjxsaT48dHQ+U29ja19vcHQgPSB0ZXJtKCk8L3R0PjwvbGk+CjxsaT48dHQ+Q2h1bmtTaXplID0gaW50ZWdlcigpPC90dD48L2xpPgo8bGk+PHR0PjxhIG5hbWU9InR5cGUtc3J0ZiI+c3J0ZigpPC9hPiA9IDxhIGhyZWY9IiN0eXBlLWJvb2xlYW4iPmJvb2xlYW4oKTwvYT4gfCA8YSBocmVmPSIjdHlwZS1maWxlbmFtZSI+ZmlsZW5hbWUoKTwvYT48L3R0PjwvbGk+CjxsaT48dHQ+PGEgbmFtZT0idHlwZS1maWxlbmFtZSI+ZmlsZW5hbWUoKTwvYT4gPSBzdHJpbmcoKTwvdHQ+PC9saT4KPGxpPjx0dD48YSBuYW1lPSJ0eXBlLXJlc3BvbnNlX2Zvcm1hdCI+cmVzcG9uc2VfZm9ybWF0KCk8L2E+ID0gbGlzdCB8IGJpbmFyeTwvdHQ+PC9saT4KPC91bD48L3A+CjwvZGl2PjxwPlNhbWUgYXMgc2VuZF9yZXEvNC4KICBGb3IgYSBkZXNjcmlwdGlvbiBvZiBTU0wgT3B0aW9ucywgbG9vayBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5lcmxhbmcub3JnL2RvYy9hcHBzL3NzbC9pbmRleC5odG1sIj5zc2w8L2E+IG1hbnBhZ2UuIElmIHRoZQogIEhUVFAgVmVyc2lvbiB0byB1c2UgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgMS4xLgogIDxicj4KICA8dWw+CiAgPGxpPlRoZSA8Y29kZT5ob3N0X2hlYWRlcjwvY29kZT4gb3B0aW9uIGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSB3aGVyZSBpYnJvd3NlIGlzCiAgY29ubmVjdGluZyB0byBhIGNvbXBvbmVudCBzdWNoIGFzIDxhIGhyZWY9Imh0dHA6Ly93d3cuc3R1bm5lbC5vcmciPnN0dW5uZWw8L2E+IHdoaWNoIHRoZW4gc2V0cyB1cCBhCiAgc2VjdXJlIGNvbm5lY3Rpb24gdG8gYSB3ZWJzZXJ2ZXIuIEluIHRoaXMgY2FzZSwgdGhlIFVSTCBzdXBwbGllZCB0bwogIGlicm93c2UgbXVzdCBoYXZlIHRoZSBzdHVubmVsIGhvc3QvcG9ydCBkZXRhaWxzLCBidXQgdGhhdCB3b24ndAogIG1ha2Ugc2Vuc2UgdG8gdGhlIGRlc3RpbmF0aW9uIHdlYnNlcnZlci4gVGhpcyBvcHRpb24gY2FuIHRoZW4gYmUKICB1c2VkIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgZ28gaW4gdGhlIDxjb2RlPkhvc3Q8L2NvZGU+IGhlYWRlciBpbgogIHRoZSByZXF1ZXN0LjwvbGk+CiAgPGxpPlRoZSA8Y29kZT5zdHJlYW1fdG88L2NvZGU+IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBoYXZlIHRoZSBIVFRQCiAgcmVzcG9uc2Ugc3RyZWFtZWQgdG8gYSBwcm9jZXNzIGFzIG1lc3NhZ2VzIGFzIGRhdGEgYXJyaXZlcyBvbiB0aGUKICBzb2NrZXQuIElmIHRoZSBjYWxsaW5nIHByb2Nlc3Mgd2lzaGVzIHRvIGNvbnRyb2wgdGhlIHJhdGUgYXQgd2hpY2gKICBkYXRhIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciwgdGhlIG9wdGlvbiA8Y29kZT57c3RyZWFtX3RvLAogIHtwcm9jZXNzKCksIG9uY2V9fTwvY29kZT4gY2FuIGJlIHNwZWNpZmllZC4gVGhlIGNhbGxpbmcgcHJvY2VzcwogIHdpbGwgaGF2ZSB0byBpbnZva2UgPGNvZGU+aWJyb3dzZTpzdHJlYW1fbmV4dChSZXF1ZXN0X2lkKTwvY29kZT4gdG8KICByZWNlaXZlIHRoZSBuZXh0IHBhY2tldC48L2xpPgogCiAgPGxpPldoZW4gYm90aCB0aGUgb3B0aW9ucyA8Y29kZT5zYXZlX3Jlc3BvbnNlX3RvX2ZpbGU8L2NvZGU+IGFuZCA8Y29kZT5zdHJlYW1fdG88L2NvZGU+CiAgYXJlIHNwZWNpZmllZCwgdGhlIGZvcm1lciB0YWtlcyBwcmVjZWRlbmNlLjwvbGk+CiAKICA8bGk+Rm9yIHRoZSA8Y29kZT5zYXZlX3Jlc3BvbnNlX3RvX2ZpbGU8L2NvZGU+IG9wdGlvbiwgdGhlIHJlc3BvbnNlIGJvZHkgaXMgc2F2ZWQgdG8KICBmaWxlIG9ubHkgaWYgdGhlIHN0YXR1cyBjb2RlIGlzIGluIHRoZSAyMDAtMjk5IHJhbmdlLiBJZiBub3QsIHRoZSByZXNwb25zZSBib2R5IGlzIHJldHVybmVkCiAgYXMgYSBzdHJpbmcuPC9saT4KICA8bGk+V2hlbmV2ZXIgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBwcm9jZXNzaW5nIG9mIGEgcmVxdWVzdCwgaWJyb3dzZSB3aWxsIHJldHVybiBhcyBtdWNoCiAgaW5mb3JtYXRpb24gYXMgaXQgaGFzLCBzdWNoIGFzIEhUVFAgU3RhdHVzIENvZGUgYW5kIEhUVFAgSGVhZGVycy4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSByZXNwb25zZQogIGlzIG9mIHRoZSBmb3JtIDxjb2RlPntlcnJvciwge1JlYXNvbiwge3N0YXRfY29kZSwgU3RhdHVzQ29kZX0sIEhUVFBfaGVhZGVyc319PC9jb2RlPjwvbGk+CiAKICA8bGk+PHA+VGhlIDxjb2RlPmluYWN0aXZpdHlfdGltZW91dDwvY29kZT4gb3B0aW9uIGlzIHVzZWZ1bCB3aGVuICAKZGVhbGluZyB3aXRoIGxhcmdlIHJlc3BvbnNlIGJvZGllcyBhbmQvb3Igc2xvdyBsaW5rcy4gSW4gdGhlc2UgIApjYXNlcywgaXQgbWlnaHQgYmUgaGFyZCB0byBlc3RpbWF0ZSBob3cgbG9uZyBhIHJlcXVlc3Qgd2lsbCB0YWtlIHRvICAKY29tcGxldGUuIEluIHN1Y2ggY2FzZXMsIHRoZSBjbGllbnQgbWlnaHQgd2FudCB0byB0aW1lb3V0IGlmIG5vICAKZGF0YSBoYXMgYmVlbiByZWNlaXZlZCBvbiB0aGUgbGluayBmb3IgYSBjZXJ0YWluIHRpbWUgaW50ZXJ2YWwuPC9wPgogCiAgVGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgdG8gY2xvc2UgY29ubmVjdGlvbnMgd2hpY2ggYXJlIG5vdCBpbiB1c2UgZm9yCiAgdGhlIHNwZWNpZmllZCB0aW1lb3V0IHZhbHVlLgogIDwvbGk+CiAKICA8bGk+CiAgVGhlIDxjb2RlPmNvbm5lY3RfdGltZW91dDwvY29kZT4gb3B0aW9uIGlzIHRvIHNwZWNpZnkgaG93IGxvbmcgdGhlCiAgY2xpZW50IHByb2Nlc3Mgc2hvdWxkIHdhaXQgZm9yIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudC4gVGhpcyBpcwogIHVzZWZ1bCBpbiBzY2VuYXJpb3Mgd2hlcmUgY29ubmVjdGlvbnMgdG8gc2VydmVycyBhcmUgdXN1YWxseSBzZXR1cAogIHZlcnkgZmFzdCwgYnV0IHJlc3BvbnNlcyBtaWdodCB0YWtlIG11Y2ggbG9uZ2VyIGNvbXBhcmVkIHRvCiAgY29ubmVjdGlvbiBzZXR1cC4gSW4gc3VjaCBjYXNlcywgaXQgaXMgYmV0dGVyIGZvciB0aGUgY2FsbGluZwogIHByb2Nlc3MgdG8gdGltZW91dCBmYXN0ZXIgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIChETlMgbG9va3VwCiAgZGVsYXlzL2ZhaWx1cmVzLCBuZXR3b3JrIHJvdXRpbmcgaXNzdWVzLCBldGMpLiBUaGUgdG90YWwgdGltZW91dAogIHZhbHVlIHNwZWNpZmllZCBmb3IgdGhlIHJlcXVlc3Qgd2lsbCBlbmZvcmNlZC4gVG8gaWxsdXN0cmF0ZSB1c2luZwogIGFuIGV4YW1wbGU6CiAgPGNvZGU+CiAgaWJyb3dzZTpzZW5kX3JlcSgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jZ2ktYmluL3JlcXVlc3QiLCBbXSwgZ2V0LCBbXSwgW3tjb25uZWN0X3RpbWVvdXQsIDEwMH1dLCAxMDAwKS4KICA8L2NvZGU+CiAgSW4gdGhlIGFib3ZlIGludm9jYXRpb24sIGlmIHRoZSBjb25uZWN0aW9uIGlzbid0IGVzdGFibGlzaGVkIHdpdGhpbgogIDEwMCBtaWxsaXNlY29uZHMsIHRoZSByZXF1ZXN0IHdpbGwgZmFpbCB3aXRoCiAgPGNvZGU+e2Vycm9yLCBjb25uX2ZhaWxlZH08L2NvZGU+Ljxicj4KICBJZiBjb25uZWN0aW9uIHNldHVwIHN1Y2NlZWRzLCB0aGUgdG90YWwgdGltZSBhbGxvd2VkIGZvciB0aGUKICByZXF1ZXN0IHRvIGNvbXBsZXRlIHdpbGwgYmUgMTAwMCBtaWxsaXNlY29uZHMgbWludXMgdGhlIHRpbWUgdGFrZW4KICBmb3IgY29ubmVjdGlvbiBzZXR1cC4KICA8L2xpPgogCiAgPGxpPiBUaGUgPGNvZGU+c29ja2V0X29wdGlvbnM8L2NvZGU+IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQKICBzcGVjaWZpYyBvcHRpb25zIG9uIHRoZSBzb2NrZXQuIFRoZSA8Y29kZT57YWN0aXZlLCB0cnVlIHwgZmFsc2UgfCBvbmNlfTwvY29kZT4KICBhbmQgPGNvZGU+e3BhY2tldF90eXBlLCBQYWNrZXRfdHlwZX08L2NvZGU+IHdpbGwgYmUgZmlsdGVyZWQgb3V0IGJ5IGlicm93c2UuICA8L2xpPgogCiAgPGxpPiBUaGUgPGNvZGU+aGVhZGVyc19hc19pczwvY29kZT4gb3B0aW9uIGlzIHRvIGVuYWJsZSB0aGUgY2FsbGVyCiAgdG8gc2VuZCBoZWFkZXJzIGV4YWN0bHkgYXMgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdpdGhvdXQgaWJyb3dzZQogIGFkZGluZyBzb21lIG9mIGl0cyBvd24uIFJlcXVpcmVkIGZvciBzb21lIHBpY2t5IHNlcnZlcnMgYXBwYXJlbnRseS4gIDwvbGk+CiAKICA8bGk+VGhlIDxjb2RlPmdpdmVfcmF3X2hlYWRlcnM8L2NvZGU+IG9wdGlvbiBpcyB0byBlbmFibGUgdGhlCiAgY2FsbGVyIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHJhdyBzdGF0dXMgbGluZSBhbmQgcmF3IHVucGFyc2VkCiAgaGVhZGVycy4gTm90IHF1aXRlIHN1cmUgd2h5IHNvbWVvbmUgd291bGQgd2FudCB0aGlzLCBidXQgb25lIG9mIG15CiAgdXNlcnMgYXNrZWQgZm9yIGl0LCBzbyBoZXJlIGl0IGlzLiA8L2xpPgogCiAgPGxpPiBUaGUgPGNvZGU+cHJlc2VydmVfY2h1bmtlZF9lbmNvZGluZzwvY29kZT4gb3B0aW9uIGVuYWJsZXMgdGhlIGNhbGxlcgogIHRvIHJlY2VpdmUgdGhlIHJhdyBkYXRhIHN0cmVhbSB3aGVuIHRoZSBUcmFuc2Zlci1FbmNvZGluZyBvZiB0aGUgc2VydmVyCiAgcmVzcG9uc2UgaXMgQ2h1bmtlZC4KICA8L2xpPgogIDwvdWw+CiA8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZW5kX3JlcS02Ij5zZW5kX3JlcS82PC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c2VuZF9yZXEoVXJsLCBIZWFkZXJzOjo8YSBocmVmPSIjdHlwZS1oZWFkZXJMaXN0Ij5oZWFkZXJMaXN0KCk8L2E+LCBNZXRob2Q6OjxhIGhyZWY9IiN0eXBlLW1ldGhvZCI+bWV0aG9kKCk8L2E+LCBCb2R5Ojo8YSBocmVmPSIjdHlwZS1ib2R5Ij5ib2R5KCk8L2E+LCBPcHRpb25zOjo8YSBocmVmPSIjdHlwZS1vcHRpb25MaXN0Ij5vcHRpb25MaXN0KCk8L2E+LCBUaW1lb3V0KSAtJmd0OyA8YSBocmVmPSIjdHlwZS1yZXNwb25zZSI+cmVzcG9uc2UoKTwvYT48L3R0Pgo8dWwgY2xhc3M9ImRlZmluaXRpb25zIj48bGk+PHR0PlRpbWVvdXQgPSBpbnRlZ2VyKCkgfCBpbmZpbml0eTwvdHQ+PC9saT4KPC91bD48L3A+CjwvZGl2PjxwPlNhbWUgYXMgc2VuZF9yZXEvNS4KICBBbGwgdGltZW91dCB2YWx1ZXMgYXJlIGluIG1pbGxpc2Vjb25kcy48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZW5kX3JlcV9kaXJlY3QtNCI+c2VuZF9yZXFfZGlyZWN0LzQ8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zZW5kX3JlcV9kaXJlY3QoQ29ubl9waWQsIFVybCwgSGVhZGVycywgTWV0aG9kKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5TYW1lIGFzIHNlbmRfcmVxLzMgZXhjZXB0IHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBQSUQKICByZXR1cm5lZCBieSBzcGF3bl93b3JrZXJfcHJvY2Vzcy8yIG9yIHNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MvMjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNlbmRfcmVxX2RpcmVjdC01Ij5zZW5kX3JlcV9kaXJlY3QvNTwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnNlbmRfcmVxX2RpcmVjdChDb25uX3BpZCwgVXJsLCBIZWFkZXJzLCBNZXRob2QsIEJvZHkpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PjxwPlNhbWUgYXMgc2VuZF9yZXEvNCBleGNlcHQgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIFBJRAogIHJldHVybmVkIGJ5IHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgb3Igc3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8yPC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0ic2VuZF9yZXFfZGlyZWN0LTYiPnNlbmRfcmVxX2RpcmVjdC82PC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c2VuZF9yZXFfZGlyZWN0KENvbm5fcGlkLCBVcmwsIEhlYWRlcnMsIE1ldGhvZCwgQm9keSwgT3B0aW9ucykgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+PHA+U2FtZSBhcyBzZW5kX3JlcS81IGV4Y2VwdCB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgUElECiAgcmV0dXJuZWQgYnkgc3Bhd25fd29ya2VyX3Byb2Nlc3MvMiBvciBzcGF3bl9saW5rX3dvcmtlcl9wcm9jZXNzLzI8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZW5kX3JlcV9kaXJlY3QtNyI+c2VuZF9yZXFfZGlyZWN0Lzc8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zZW5kX3JlcV9kaXJlY3QoQ29ubl9waWQsIFVybCwgSGVhZGVycywgTWV0aG9kLCBCb2R5LCBPcHRpb25zLCBUaW1lb3V0KSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5TYW1lIGFzIHNlbmRfcmVxLzYgZXhjZXB0IHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBQSUQKICByZXR1cm5lZCBieSBzcGF3bl93b3JrZXJfcHJvY2Vzcy8yIG9yIHNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MvMjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNldF9kZXN0LTMiPnNldF9kZXN0LzM8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zZXRfZGVzdChIb3N0LCBQb3J0LCBUKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5EZXByZWNhdGVkLiBVc2Ugc2V0X21heF9zZXNzaW9ucy8zIGFuZCBzZXRfbWF4X3BpcGVsaW5lX3NpemUvMwogIGZvciBhY2hpZXZpbmcgdGhlIHNhbWUgZWZmZWN0LjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNldF9tYXhfcGlwZWxpbmVfc2l6ZS0zIj5zZXRfbWF4X3BpcGVsaW5lX3NpemUvMzwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnNldF9tYXhfcGlwZWxpbmVfc2l6ZShIb3N0OjpzdHJpbmcoKSwgUG9ydDo6aW50ZWdlcigpLCBNYXg6OmludGVnZXIoKSkgLSZndDsgb2s8L3R0PjwvcD4KPC9kaXY+PHA+U2V0IHRoZSBtYXhpbXVtIHBpcGVsaW5lIHNpemUgZm9yIGVhY2ggY29ubmVjdGlvbiB0byBhIHNwZWNpZmljIEhvc3Q6UG9ydC48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzZXRfbWF4X3Nlc3Npb25zLTMiPnNldF9tYXhfc2Vzc2lvbnMvMzwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnNldF9tYXhfc2Vzc2lvbnMoSG9zdDo6c3RyaW5nKCksIFBvcnQ6OmludGVnZXIoKSwgTWF4OjppbnRlZ2VyKCkpIC0mZ3Q7IG9rPC90dD48L3A+CjwvZGl2PjxwPlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCB0byBhIHNwZWNpZmljIEhvc3Q6UG9ydC48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzaG93X2Rlc3Rfc3RhdHVzLTAiPnNob3dfZGVzdF9zdGF0dXMvMDwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnNob3dfZGVzdF9zdGF0dXMoKSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5TaG93cyBzb21lIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGxvYWQgYmFsYW5jaW5nLiBJbmZvCiAgYWJvdXQgd29ya2VycyBzcGF3bmVkIHVzaW5nIHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgb3IKICBzcGF3bl9saW5rX3dvcmtlcl9wcm9jZXNzLzIgaXMgbm90IGluY2x1ZGVkLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNob3dfZGVzdF9zdGF0dXMtMiI+c2hvd19kZXN0X3N0YXR1cy8yPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c2hvd19kZXN0X3N0YXR1cyhIb3N0LCBQb3J0KSAtJmd0OyBhbnkoKTwvdHQ+PC9wPgo8L2Rpdj48cD5TaG93cyBzb21lIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IGxvYWQgYmFsYW5jaW5nIHRvIGEKICBzcGVjaWZpZWQgSG9zdDpQb3J0LiBJbmZvIGFib3V0IHdvcmtlcnMgc3Bhd25lZCB1c2luZwogIHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgb3Igc3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8yIGlzIG5vdAogIGluY2x1ZGVkLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MtMSI+c3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8xPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c3Bhd25fbGlua193b3JrZXJfcHJvY2VzcyhVcmw6OnN0cmluZygpKSAtJmd0OyB7b2ssIHBpZCgpfTwvdHQ+PC9wPgo8L2Rpdj48cD5TYW1lIGFzIHNwYXduX3dvcmtlcl9wcm9jZXNzLzEgZXhjZXB0IHRoZSB0aGUgY2FsbGluZyBwcm9jZXNzCiAgaXMgbGlua2VkIHRvIHRoZSB3b3JrZXIgcHJvY2VzcyB3aGljaCBpcyBzcGF3bmVkLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNwYXduX2xpbmtfd29ya2VyX3Byb2Nlc3MtMiI+c3Bhd25fbGlua193b3JrZXJfcHJvY2Vzcy8yPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c3Bhd25fbGlua193b3JrZXJfcHJvY2VzcyhIb3N0OjpzdHJpbmcoKSwgUG9ydDo6aW50ZWdlcigpKSAtJmd0OyB7b2ssIHBpZCgpfTwvdHQ+PC9wPgo8L2Rpdj48cD5TYW1lIGFzIHNwYXduX3dvcmtlcl9wcm9jZXNzLzIgZXhjZXB0IHRoZSB0aGUgY2FsbGluZyBwcm9jZXNzCiAgaXMgbGlua2VkIHRvIHRoZSB3b3JrZXIgcHJvY2VzcyB3aGljaCBpcyBzcGF3bmVkLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InNwYXduX3dvcmtlcl9wcm9jZXNzLTEiPnNwYXduX3dvcmtlcl9wcm9jZXNzLzE8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zcGF3bl93b3JrZXJfcHJvY2VzcyhVcmw6OnN0cmluZygpKSAtJmd0OyB7b2ssIHBpZCgpfTwvdHQ+PC9wPgo8L2Rpdj48cD5DcmVhdGVzIGEgSFRUUCBjbGllbnQgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIEhvc3Q6UG9ydCB3aGljaAogIGlzIG5vdCBwYXJ0IG9mIHRoZSBsb2FkIGJhbGFuY2luZyBwb29sLiBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcwogIHdoZXJlIHNvbWUgcmVxdWVzdHMgdG8gYSB3ZWJzZXJ2ZXIgbWlnaHQgdGFrZSBhIGxvbmcgdGltZSB3aGVyZWFzCiAgc29tZSBtaWdodCB0YWtlIGEgdmVyeSBzaG9ydCB0aW1lLiBUbyBhdm9pZCBnZXR0aW5nIHRoZXNlIHF1aWNrCiAgcmVxdWVzdHMgc3R1Y2sgaW4gdGhlIHBpcGVsaW5lIGJlaGluZCB0aW1lIGNvbnN1bWluZyByZXF1ZXN0cywgdXNlCiAgdGhpcyBmdW5jdGlvbiB0byBnZXQgYSBoYW5kbGUgdG8gYSBjb25uZWN0aW9uIHByb2Nlc3MuIDxicj4KICA8Yj5Ob3RlOjwvYj4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9ubHkgY3JlYXRlcyBhIHdvcmtlciBwcm9jZXNzLiBObyBjb25uZWN0aW9uCiAgaXMgc2V0dXAuIFRoZSBjb25uZWN0aW9uIGF0dGVtcHQgaXMgbWFkZSBvbmx5IHdoZW4gdGhlIGZpcnN0CiAgcmVxdWVzdCBpcyBzZW50IHZpYSBhbnkgb2YgdGhlIHNlbmRfcmVxX2RpcmVjdC80LDUsNiw3IGZ1bmN0aW9ucy48YnI+CiAgPGI+Tm90ZTo8L2I+IEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIHRvIGNvbnRyb2wKICBwaXBlbGluZSBzaXplIG9uIHN1Y2ggY29ubmVjdGlvbnMuCiA8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzcGF3bl93b3JrZXJfcHJvY2Vzcy0yIj5zcGF3bl93b3JrZXJfcHJvY2Vzcy8yPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c3Bhd25fd29ya2VyX3Byb2Nlc3MoSG9zdDo6c3RyaW5nKCksIFBvcnQ6OmludGVnZXIoKSkgLSZndDsge29rLCBwaWQoKX08L3R0PjwvcD4KPC9kaXY+PHA+U2FtZSBhcyBzcGF3bl93b3JrZXJfcHJvY2Vzcy8xIGJ1dCB0YWtlcyBhcyBpbnB1dCBhIEhvc3QgYW5kIFBvcnQKICBpbnN0ZWFkIG9mIGEgVVJMLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InN0YXJ0LTAiPnN0YXJ0LzA8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zdGFydCgpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PjxwPlN0YXJ0cyB0aGUgaWJyb3dzZSBwcm9jZXNzIHdpdGhvdXQgbGlua2luZy4gVXNlZnVsIHdoZW4gdGVzdGluZyB1c2luZyB0aGUgc2hlbGw8L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzdGFydF9saW5rLTAiPnN0YXJ0X2xpbmsvMDwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnN0YXJ0X2xpbmsoKSAtJmd0OyB7b2ssIHBpZCgpfTwvdHQ+PC9wPgo8L2Rpdj48cD5TdGFydHMgdGhlIGlicm93c2UgcHJvY2VzcyBsaW5rZWQgdG8gdGhlIGNhbGxpbmcgcHJvY2Vzcy4gVXN1YWxseSBpbnZva2VkIGJ5IHRoZSBzdXBlcnZpc29yIGlicm93c2Vfc3VwPC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0ic3RvcC0wIj5zdG9wLzA8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD5zdG9wKCkgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+PHA+U3RvcCB0aGUgaWJyb3dzZSBwcm9jZXNzLiBVc2VmdWwgd2hlbiB0ZXN0aW5nIHVzaW5nIHRoZSBzaGVsbC48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzdG9wX3dvcmtlcl9wcm9jZXNzLTEiPnN0b3Bfd29ya2VyX3Byb2Nlc3MvMTwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnN0b3Bfd29ya2VyX3Byb2Nlc3MoQ29ubl9waWQ6OnBpZCgpKSAtJmd0OyBvazwvdHQ+PC9wPgo8L2Rpdj48cD5UZXJtaW5hdGUgYSB3b3JrZXIgcHJvY2VzcyBzcGF3bmVkIHVzaW5nCiAgc3Bhd25fd29ya2VyX3Byb2Nlc3MvMiBvciBzcGF3bl9saW5rX3dvcmtlcl9wcm9jZXNzLzIuIFJlcXVlc3RzIGluCiAgcHJvZ3Jlc3Mgd2lsbCBnZXQgdGhlIGVycm9yIHJlc3BvbnNlIDxwcmU+e2Vycm9yLCBjbG9zaW5nX29uX3JlcXVlc3R9PC9wcmU+PC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0ic3RyZWFtX2Nsb3NlLTEiPnN0cmVhbV9jbG9zZS8xPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c3RyZWFtX2Nsb3NlKFJlcV9pZDo6PGEgaHJlZj0iI3R5cGUtcmVxX2lkIj5yZXFfaWQoKTwvYT4pIC0mZ3Q7IG9rIHwge2Vycm9yLCB1bmtub3duX3JlcV9pZH08L3R0PjwvcD4KPC9kaXY+PHA+VGVsbCBpYnJvd3NlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUKICBzcGVjaWZpZWQgc3RyZWFtLiAgU2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKICA8Y29kZT5zdHJlYW1fdG88L2NvZGU+IG9wdGlvbi4gTm90ZSB0aGF0IGFsbCByZXF1ZXN0cyBpbiBwcm9ncmVzcyBvbgogIHRoZSBjb25uZWN0aW9uIHdoaWNoIGlzIHNlcnZpbmcgdGhpcyBSZXFfaWQgd2lsbCBiZSBhYm9ydGVkLCBhbmQgYW4KICBlcnJvciByZXR1cm5lZC48L3A+Cgo8aDMgY2xhc3M9ImZ1bmN0aW9uIj48YSBuYW1lPSJzdHJlYW1fbmV4dC0xIj5zdHJlYW1fbmV4dC8xPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+c3RyZWFtX25leHQoUmVxX2lkOjo8YSBocmVmPSIjdHlwZS1yZXFfaWQiPnJlcV9pZCgpPC9hPikgLSZndDsgb2sgfCB7ZXJyb3IsIHVua25vd25fcmVxX2lkfTwvdHQ+PC9wPgo8L2Rpdj48cD5UZWxsIGlicm93c2UgdG8gc3RyZWFtIHRoZSBuZXh0IGNodW5rIG9mIGRhdGEgdG8gdGhlCiAgY2FsbGVyLiBTaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQogIDxjb2RlPnN0cmVhbV90bzwvY29kZT4gb3B0aW9uPC9wPgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0idGVybWluYXRlLTIiPnRlcm1pbmF0ZS8yPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+dGVybWluYXRlKFJlYXNvbiwgU3RhdGUpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PgoKPGgzIGNsYXNzPSJmdW5jdGlvbiI+PGEgbmFtZT0idHJhY2Vfb2ZmLTAiPnRyYWNlX29mZi8wPC9hPjwvaDM+CjxkaXYgY2xhc3M9InNwZWMiPgo8cD48dHQ+dHJhY2Vfb2ZmKCkgLSZndDsgYW55KCk8L3R0PjwvcD4KPC9kaXY+PHA+VHVybiB0cmFjaW5nIG9mZiBmb3IgdGhlIGlicm93c2UgcHJvY2VzczwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InRyYWNlX29mZi0yIj50cmFjZV9vZmYvMjwvYT48L2gzPgo8ZGl2IGNsYXNzPSJzcGVjIj4KPHA+PHR0PnRyYWNlX29mZihIb3N0LCBQb3J0KSAtJmd0OyBvazwvdHQ+PC9wPgo8L2Rpdj48cD5UdXJuIHRyYWNpbmcgT0ZGIGZvciBhbGwgY29ubmVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBIVFRQCiAgc2VydmVyLjwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InRyYWNlX29uLTAiPnRyYWNlX29uLzA8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD50cmFjZV9vbigpIC0mZ3Q7IGFueSgpPC90dD48L3A+CjwvZGl2PjxwPlR1cm4gdHJhY2luZyBvbiBmb3IgdGhlIGlicm93c2UgcHJvY2VzczwvcD4KCjxoMyBjbGFzcz0iZnVuY3Rpb24iPjxhIG5hbWU9InRyYWNlX29uLTIiPnRyYWNlX29uLzI8L2E+PC9oMz4KPGRpdiBjbGFzcz0ic3BlYyI+CjxwPjx0dD50cmFjZV9vbihIb3N0LCBQb3J0KSAtJmd0OyBvazwvdHQ+Cjx1bCBjbGFzcz0iZGVmaW5pdGlvbnMiPjxsaT48dHQ+SG9zdCA9IHN0cmluZygpPC90dD48L2xpPgo8bGk+PHR0PlBvcnQgPSBpbnRlZ2VyKCk8L3R0PjwvbGk+CjwvdWw+PC9wPgo8L2Rpdj48cD5UdXJuIHRyYWNpbmcgb24gZm9yIGFsbCBjb25uZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIEhUVFAKICBzZXJ2ZXIuIEhvc3QgaXMgd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGFzIHRoZSBkb21haW4gbmFtZSBpbiB0aGUgVVJMPC9wPgo8aHI+Cgo8ZGl2IGNsYXNzPSJuYXZiYXIiPjxhIG5hbWU9IiNuYXZiYXJfYm90dG9tIj48L2E+PHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgc3VtbWFyeT0ibmF2aWdhdGlvbiBiYXIiPjx0cj48dGQ+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9Im92ZXJ2aWV3RnJhbWUiPk92ZXJ2aWV3PC9hPjwvdGQ+PHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZXJsYW5nLm9yZy8iPjxpbWcgc3JjPSJlcmxhbmcucG5nIiBhbGlnbj0icmlnaHQiIGJvcmRlcj0iMCIgYWx0PSJlcmxhbmcgbG9nbyI+PC9hPjwvdGQ+PC90cj48L3RhYmxlPjwvZGl2Pgo8cD48aT5HZW5lcmF0ZWQgYnkgRURvYywgTm92IDEwIDIwMTAsIDA2OjA0OjMzLjwvaT48L3A+CjwvYm9keT4KPC9odG1sPgo=