PGh0bWw+CjxoZWFkPgogPHRpdGxlPgogemxpYiBnZW5lcmFsIHB1cnBvc2UgY29tcHJlc3Npb24gbGlicmFyeSB2ZXJzaW9uIDEuMS40CiA8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IldoaXRlIiB0ZXh0PSJCbGFjayIgdmxpbms9IlJlZCIgYWxpbms9Ik5hdnkiIGxpbms9IlJlZCI+CjwhLS0gYmFja2dyb3VuZD0iemxpYmJnLmdpZiIgLS0+Cgo8aDE+IHpsaWIgMS4xLjQgTWFudWFsIDwvaDE+Cjxocj4KPGEgbmFtZT0iQ29udGVudHMiPjxoMj5Db250ZW50czwvaDI+CjxvbCB0eXBlPSJJIj4KPGxpPiA8YSBocmVmPSIjUHJvbG9ndWUiPlByb2xvZ3VlPC9hPgo8bGk+IDxhIGhyZWY9IiNJbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT4KPGxpPiA8YSBocmVmPSIjVXRpbGl0eSBmdW5jdGlvbnMiPlV0aWxpdHkgZnVuY3Rpb25zPC9hPgo8bGk+IDxhIGhyZWY9IiNCYXNpYyBmdW5jdGlvbnMiPkJhc2ljIGZ1bmN0aW9uczwvYT4KPGxpPiA8YSBocmVmPSIjQWR2YW5jZWQgZnVuY3Rpb25zIj5BZHZhbmNlZCBmdW5jdGlvbnM8L2E+CjxsaT4gPGEgaHJlZj0iI0NvbnN0YW50cyI+Q29uc3RhbnRzPC9hPgo8bGk+IDxhIGhyZWY9IiNzdHJ1Y3Qgel9zdHJlYW1fcyI+c3RydWN0IHpfc3RyZWFtX3M8L2E+CjxsaT4gPGEgaHJlZj0iI0NoZWNrc3VtIGZ1bmN0aW9ucyI+Q2hlY2tzdW0gZnVuY3Rpb25zPC9hPgo8bGk+IDxhIGhyZWY9IiNNaXNjIj5NaXNjPC9hPgo8L29sPgo8aHI+CjxhIG5hbWU9IlByb2xvZ3VlIj48aDI+IFByb2xvZ3VlIDwvaDI+CiAgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5IHZlcnNpb24gMS4xLjQsIE1hcmNoIDExdGgsIDIwMDIKICA8cD4KICBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCiAgPHA+CiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KICA8cD4KICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogIDxvbD4KICAgPGxpPiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgOyB5b3UgbXVzdCBub3QKICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAgIDxsaT4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAgIDxsaT4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KICA8L29sPgoKICA8ZGw+CiAgPGR0PkplYW4tbG91cCBHYWlsbHkKICA8ZGQ+PGEgaHJlZj0ibWFpbHRvOmpsb3VwQGd6aXAub3JnIj5qbG91cEBnemlwLm9yZzwvYT4KICA8ZHQ+TWFyayBBZGxlcgogIDxkZD48YSBocmVmPSJtYWlsdG86bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdSI+bWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdTwvYT4KICA8L2RsPgoKICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgogIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzCiAgPGEgaHJlZj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCI+CiAgZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCA8L2E+CiAgKHpsaWIgZm9ybWF0KSwKICA8YSBocmVmPSJmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0Ij4KICByZmMxOTUxLnR4dCA8L2E+CiAgKDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBmb3JtYXQpIGFuZAogIDxhIGhyZWY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1Mi50eHQiPgogIHJmYzE5NTIudHh0IDwvYT4KICAoZ3ppcCBmb3JtYXQpLgogIDxwPgogIFRoaXMgbWFudWFsIGlzIGNvbnZlcnRlZCBmcm9tIHpsaWIuaCBieQogIDxhIGhyZWY9Im1haWx0bzpwaWFpcEBjc2llLm50dS5lZHUudHciPiBwaWFpcCA8L2E+CiAgPHA+CiAgVmlzaXQgPGEgaHJlZj0iaHR0cDovL2Z0cC5jZHJvbS5jb20vcHViL2luZm96aXAvemxpYi8iPgogIGh0dHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvPC9hPgogIGZvciB0aGUgb2ZmaWNpYWwgemxpYiB3ZWIgcGFnZS4KICA8cD4KCjxocj4KPGEgbmFtZT0iSW50cm9kdWN0aW9uIj48aDI+IEludHJvZHVjdGlvbiA8L2gyPgogICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCiAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQKICBkYXRhLiAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZAogIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQogIHN0cmVhbSBpbnRlcmZhY2UuCiAgPHA+CgogICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCiAgZW5vdWdoIChmb3IgZXhhbXBsZSBpZiBhbiBpbnB1dCBmaWxlIGlzIG1tYXAnZWQpLCBvciBjYW4gYmUgZG9uZSBieQogIHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCiAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAogIChwcm92aWRpbmcgbW9yZSBvdXRwdXQgc3BhY2UpIGJlZm9yZSBlYWNoIGNhbGwuCiAgPHA+CgogICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAogIHdpdGggYW4gaW50ZXJmYWNlIHNpbWlsYXIgdG8gdGhhdCBvZiBzdGRpby4KICA8cD4KCiAgICAgVGhlIGxpYnJhcnkgZG9lcyBub3QgaW5zdGFsbCBhbnkgc2lnbmFsIGhhbmRsZXIuIFRoZSBkZWNvZGVyIGNoZWNrcwogIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLCBzbyB0aGUgbGlicmFyeSBzaG91bGQgbmV2ZXIKICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgogIDxwPgoKPGhyPgo8YSBuYW1lPSJVdGlsaXR5IGZ1bmN0aW9ucyI+PGgyPiBVdGlsaXR5IGZ1bmN0aW9ucyA8L2gyPgogICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKICAgPGEgaHJlZj0iI0Jhc2ljIGZ1bmN0aW9ucyI+YmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9uczwvYT4uCiAgIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAogICBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMpLiBUaGUgc291cmNlIGNvZGUgb2YgdGhlc2UKICAgdXRpbGl0eSBmdW5jdGlvbnMgY2FuIGVhc2lseSBiZSBtb2RpZmllZCBpZiB5b3UgbmVlZCBzcGVjaWFsIG9wdGlvbnMuCjxoMz4gRnVuY3Rpb24gbGlzdCA8L2gzPgo8dWw+CjxsaT4gaW50ICA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOwo8bGk+IGludCAgPGEgaHJlZj0iI2NvbXByZXNzMiI+Y29tcHJlc3MyPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4sIGludCBsZXZlbCk7CjxsaT4gaW50ICA8YSBocmVmPSIjdW5jb21wcmVzcyI+dW5jb21wcmVzczwvYT4gKEJ5dGVmICpkZXN0LCAgIHVMb25nZiAqZGVzdExlbiwgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKTsKPGxpPiB0eXBlZGVmIHZvaWRwIGd6RmlsZTsKPGxpPiAgZ3pGaWxlICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7CjxsaT4gZ3pGaWxlICA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4gIChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpOwo8bGk+IGludCAgPGEgaHJlZj0iI2d6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+ICAoZ3pGaWxlIGZpbGUsIHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTsKPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IHZvaWRwIGJ1ZiwgdW5zaWduZWQgbGVuKTsKPGxpPiBpbnQgVkEgICA8YSBocmVmPSIjZ3pwcmludGYiPmd6cHJpbnRmPC9hPiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNnenB1dHMiPmd6cHV0czwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpzKTsKPGxpPiBjaGFyICogIDxhIGhyZWY9IiNnemdldHMiPmd6Z2V0czwvYT4gKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pOwo8bGk+IGludCAgICAgPGEgaHJlZj0iI2d6cHV0YyI+Z3pwdXRjPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBjKTsKPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTsKPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemZsdXNoIj5nemZsdXNoPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCk7CjxsaT4gel9vZmZfdCAgICAgPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPiAoZ3pGaWxlIGZpbGUsIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKPGxpPiB6X29mZl90ICAgICA8YSBocmVmPSIjZ3p0ZWxsIj5nenRlbGw8L2E+IChnekZpbGUgZmlsZSk7CjxsaT4gaW50ICAgICA8YSBocmVmPSIjZ3pyZXdpbmQiPmd6cmV3aW5kPC9hPiAoZ3pGaWxlIGZpbGUpOwo8bGk+IGludCAgPGEgaHJlZj0iI2d6ZW9mIj5nemVvZjwvYT4gKGd6RmlsZSBmaWxlKTsKPGxpPiBpbnQgICAgIDxhIGhyZWY9IiNnemNsb3NlIj5nemNsb3NlPC9hPiAoZ3pGaWxlIGZpbGUpOwo8bGk+IGNvbnN0IGNoYXIgKiAgPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pOwo8L3VsPgo8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+CjxkbD4KPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJjb21wcmVzcyI+Y29tcHJlc3M8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7PC9mb250Pgo8ZGQ+CiAgICAgQ29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAogICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgMC4xJSBsYXJnZXIgdGhhbgogICBzb3VyY2VMZW4gcGx1cyAxMiBieXRlcy4gVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUKICAgY29tcHJlc3NlZCBidWZmZXIuPHA+CiAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byA8YSBocmVmPSIjY29tcHJlc3MiPmNvbXByZXNzPC9hPiBhIHdob2xlIGZpbGUgYXQgb25jZSBpZiB0aGUKICAgaW5wdXQgZmlsZSBpcyBtbWFwJ2VkLjxwPgogICAgIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKICAgZW5vdWdoIG1lbW9yeSwgPGEgaHJlZj0iI1pfQlVGX0VSUk9SIj5aX0JVRl9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CiAgIGJ1ZmZlci48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iY29tcHJlc3MyIj5jb21wcmVzczI8L2E+IChCeXRlZiAqZGVzdCwgICB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwgaW50IGxldmVsKTs8L2ZvbnQ+CjxkZD4KICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gVGhlIGxldmVsCiAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPi4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQogICBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCiAgIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCAwLjElIGxhcmdlciB0aGFuIHNvdXJjZUxlbiBwbHVzCiAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KICAgPHA+CgogICAgIDxhIGhyZWY9IiNjb21wcmVzczIiPmNvbXByZXNzMjwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfTUVNX0VSUk9SIj5aX01FTV9FUlJPUjwvYT4gaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKICAgbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAogICA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJ1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiAoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLCBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pOzwvZm9udD4KPGRkPgogICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAogICBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCiAgIGVudGlyZSB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGhhdmUKICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCiAgIGJ5IHNvbWUgbWVjaGFuaXNtIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgY29tcHJlc3Npb24gbGlicmFyeS4pCiAgIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgYnVmZmVyLiA8cD4KICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYSB3aG9sZSBmaWxlIGF0IG9uY2UgaWYgdGhlCiAgIGlucHV0IGZpbGUgaXMgbW1hcCdlZC4KICAgPHA+CgogICAgIDxhIGhyZWY9IiN1bmNvbXByZXNzIj51bmNvbXByZXNzPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CiAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX0JVRl9FUlJPUiI+Wl9CVUZfRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAogICBidWZmZXIsIG9yIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGlucHV0IGRhdGEgd2FzIGNvcnJ1cHRlZC4KICAgPHA+Cgo8ZHQ+IHR5cGVkZWYgdm9pZHAgZ3pGaWxlOwo8ZGQ+IDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGd6RmlsZSAgPGEgbmFtZT0iZ3pvcGVuIj5nem9wZW48L2E+ICAoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSk7PC9mb250Pgo8ZGQ+CiAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCiAgIGlzIGFzIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwKICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCiAgIEh1ZmZtYW4gb25seSBjb21wcmVzc2lvbiBhcyBpbiAid2IxaCIuIChTZWUgdGhlIGRlc2NyaXB0aW9uCiAgIG9mIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0cmF0ZWd5IHBhcmFtZXRlci4pCiAgIDxwPgoKICAgICA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+IGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdCA7IGluIHRoaXMKICAgY2FzZSA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KICAgPHA+CgogICAgIDxhIGhyZWY9IiNnem9wZW4iPmd6b3BlbjwvYT4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCiAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiA7IGVycm5vCiAgIGNhbiBiZSBjaGVja2VkIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gY2FzZXMgKGlmIGVycm5vIGlzIHplcm8sIHRoZQogICB6bGliIGVycm9yIGlzIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+KS4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBnekZpbGUgIDxhIG5hbWU9Imd6ZG9wZW4iPmd6ZG9wZW48L2E+ICAoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKTs8L2ZvbnQ+CjxkZD4KICAgICA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oKSBhc3NvY2lhdGVzIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gIEZpbGUKICAgZGVzY3JpcHRvcnMgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yCiAgIGZpbGVubyAoaW4gdGhlIGZpbGUgaGFzIGJlZW4gcHJldmlvdXNseSBvcGVuZWQgd2l0aCBmb3BlbikuCiAgIFRoZSBtb2RlIHBhcmFtZXRlciBpcyBhcyBpbiA8YSBocmVmPSIjZ3pvcGVuIj5nem9wZW48L2E+LgogICA8cD4KICAgICBUaGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNnemNsb3NlIj5nemNsb3NlPC9hPiBvbiB0aGUgcmV0dXJuZWQgZ3pGaWxlIHdpbGwgYWxzbyBjbG9zZSB0aGUKICAgZmlsZSBkZXNjcmlwdG9yIGZkLCBqdXN0IGxpa2UgZmNsb3NlKGZkb3BlbihmZCksIG1vZGUpIGNsb3NlcyB0aGUgZmlsZQogICBkZXNjcmlwdG9yIGZkLiBJZiB5b3Ugd2FudCB0byBrZWVwIGZkIG9wZW4sIHVzZSA8YSBocmVmPSIjZ3pkb3BlbiI+Z3pkb3BlbjwvYT4oZHVwKGZkKSwgbW9kZSkuCiAgIDxwPgogICAgIDxhIGhyZWY9IiNnemRvcGVuIj5nemRvcGVuPC9hPiByZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUKICAgdGhlIChkZSljb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9Imd6c2V0cGFyYW1zIj5nenNldHBhcmFtczwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgbGV2ZWwsIGludCBzdHJhdGVneSk7PC9mb250Pgo8ZGQ+CiAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvciBzdHJhdGVneS4gU2VlIHRoZSBkZXNjcmlwdGlvbgogICBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IGZvciB0aGUgbWVhbmluZyBvZiB0aGVzZSBwYXJhbWV0ZXJzLgogICA8cD4KICAgICA8YSBocmVmPSIjZ3pzZXRwYXJhbXMiPmd6c2V0cGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgZmlsZSB3YXMgbm90CiAgIG9wZW5lZCBmb3Igd3JpdGluZy4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6cmVhZCI+Z3pyZWFkPC9hPiAgKGd6RmlsZSBmaWxlLCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7PC9mb250Pgo8ZGQ+CiAgICAgUmVhZHMgdGhlIGdpdmVuIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLgogICBJZiB0aGUgaW5wdXQgZmlsZSB3YXMgbm90IGluIGd6aXAgZm9ybWF0LCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IGNvcGllcyB0aGUgZ2l2ZW4gbnVtYmVyCiAgIG9mIGJ5dGVzIGludG8gdGhlIGJ1ZmZlci4KICAgPHA+CiAgICAgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yCiAgIGVuZCBvZiBmaWxlLCAtMSBmb3IgZXJyb3IpLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgPGEgbmFtZT0iZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gKGd6RmlsZSBmaWxlLCBjb25zdCB2b2lkcCBidWYsIHVuc2lnbmVkIGxlbik7PC9mb250Pgo8ZGQ+CiAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KICAgPGEgaHJlZj0iI2d6d3JpdGUiPmd6d3JpdGU8L2E+IHJldHVybnMgdGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbgogICAoMCBpbiBjYXNlIG9mIGVycm9yKS4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgVkEgICA8YSBuYW1lPSJnenByaW50ZiI+Z3pwcmludGY8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOzwvZm9udD4KPGRkPgogICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKICAgY29udHJvbCBvZiB0aGUgZm9ybWF0IHN0cmluZywgYXMgaW4gZnByaW50Zi4gPGEgaHJlZj0iI2d6cHJpbnRmIj5nenByaW50ZjwvYT4gcmV0dXJucyB0aGUgbnVtYmVyIG9mCiAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZ3pwdXRzIj5nenB1dHM8L2E+IChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcyk7PC9mb250Pgo8ZGQ+CiAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgY29tcHJlc3NlZCBmaWxlLCBleGNsdWRpbmcKICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgogICA8cD4KICAgICAgPGEgaHJlZj0iI2d6cHV0cyI+Z3pwdXRzPC9hPiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgogICAgICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGNoYXIgKiAgPGEgbmFtZT0iZ3pnZXRzIj5nemdldHM8L2E+IChnekZpbGUgZmlsZSwgY2hhciAqYnVmLCBpbnQgbGVuKTs8L2ZvbnQ+CjxkZD4KICAgICAgUmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIHVudGlsIGxlbi0xIGNoYXJhY3RlcnMgYXJlIHJlYWQsIG9yCiAgIGEgbmV3bGluZSBjaGFyYWN0ZXIgaXMgcmVhZCBhbmQgdHJhbnNmZXJyZWQgdG8gYnVmLCBvciBhbiBlbmQtb2YtZmlsZQogICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBUaGUgc3RyaW5nIGlzIHRoZW4gdGVybWluYXRlZCB3aXRoIGEgbnVsbAogICBjaGFyYWN0ZXIuCiAgIDxwPgogICAgICA8YSBocmVmPSIjZ3pnZXRzIj5nemdldHM8L2E+IHJldHVybnMgYnVmLCBvciA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGluIGNhc2Ugb2YgZXJyb3IuCiAgICAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenB1dGMiPmd6cHV0YzwvYT4gKGd6RmlsZSBmaWxlLCBpbnQgYyk7PC9mb250Pgo8ZGQ+CiAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgogICA8YSBocmVmPSIjZ3pwdXRjIj5nenB1dGM8L2E+IHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemdldGMiPmd6Z2V0YzwvYT4gKGd6RmlsZSBmaWxlKTs8L2ZvbnQ+CjxkZD4KICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiA8YSBocmVmPSIjZ3pnZXRjIj5nemdldGM8L2E+IHJldHVybnMgdGhpcyBieXRlCiAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnemZsdXNoIj5nemZsdXNoPC9hPiAoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCk7PC9mb250Pgo8ZGQ+CiAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCiAgIGZsdXNoIGlzIGFzIGluIHRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKSBmdW5jdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgemxpYgogICBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiA8YSBocmVmPSIjZ3plcnJvciI+Z3plcnJvcjwvYT4gYmVsb3cpLiA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYKICAgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgogICA8cD4KICAgICA8YSBocmVmPSIjZ3pmbHVzaCI+Z3pmbHVzaDwvYT4gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgY2FuCiAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gel9vZmZfdCAgICAgPGEgbmFtZT0iZ3pzZWVrIj5nenNlZWs8L2E+IChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpOzwvZm9udD4KPGRkPgogICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgPGEgaHJlZj0iI2d6cmVhZCI+Z3pyZWFkPC9hPiBvciA8YSBocmVmPSIjZ3p3cml0ZSI+Z3p3cml0ZTwvYT4gb24gdGhlCiAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQogICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CiAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgogICA8cD4KICAgICBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoaXMgZnVuY3Rpb24gaXMgZW11bGF0ZWQgYnV0IGNhbiBiZQogICBleHRyZW1lbHkgc2xvdy4gSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nLCBvbmx5IGZvcndhcmQgc2Vla3MgYXJlCiAgIHN1cHBvcnRlZCA7IDxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4gdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKICAgc3RhcnRpbmcgcG9zaXRpb24uCiAgIDxwPgogICAgICA8YSBocmVmPSIjZ3pzZWVrIj5nenNlZWs8L2E+IHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQogICB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLCBpbgogICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgogICB3b3VsZCBiZSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICAgICA8YSBuYW1lPSJnenJld2luZCI+Z3pyZXdpbmQ8L2E+IChnekZpbGUgZmlsZSk7PC9mb250Pgo8ZGQ+CiAgICAgUmV3aW5kcyB0aGUgZ2l2ZW4gZmlsZS4gVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBmb3IgcmVhZGluZy4KICAgICA8cD4KICAgPGEgaHJlZj0iI2d6cmV3aW5kIj5nenJld2luZDwvYT4oZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KTxhIGhyZWY9IiNnenNlZWsiPmd6c2VlazwvYT4oZmlsZSwgMEwsIFNFRUtfU0VUKQogICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHpfb2ZmX3QgICAgIDxhIG5hbWU9Imd6dGVsbCI+Z3p0ZWxsPC9hPiAoZ3pGaWxlIGZpbGUpOzwvZm9udD4KPGRkPgogICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCA8YSBocmVmPSIjZ3pyZWFkIj5nenJlYWQ8L2E+IG9yIDxhIGhyZWY9IiNnendyaXRlIj5nendyaXRlPC9hPiBvbiB0aGUKICAgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBUaGlzIHBvc2l0aW9uIHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCiAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbS4KICAgPHA+CgogICA8YSBocmVmPSIjZ3p0ZWxsIj5nenRlbGw8L2E+KGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gPGEgaHJlZj0iI2d6c2VlayI+Z3pzZWVrPC9hPihmaWxlLCAwTCwgU0VFS19DVVIpCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJnemVvZiI+Z3plb2Y8L2E+IChnekZpbGUgZmlsZSk7PC9mb250Pgo8ZGQ+CiAgICAgUmV0dXJucyAxIHdoZW4gRU9GIGhhcyBwcmV2aW91c2x5IGJlZW4gZGV0ZWN0ZWQgcmVhZGluZyB0aGUgZ2l2ZW4KICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgICAgIDxhIG5hbWU9Imd6Y2xvc2UiPmd6Y2xvc2U8L2E+IChnekZpbGUgZmlsZSk7PC9mb250Pgo8ZGQ+CiAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaWYgbmVjZXNzYXJ5LCBjbG9zZXMgdGhlIGNvbXByZXNzZWQgZmlsZQogICBhbmQgZGVhbGxvY2F0ZXMgYWxsIHRoZSAoZGUpY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIKICAgZXJyb3IgbnVtYmVyIChzZWUgZnVuY3Rpb24gPGEgaHJlZj0iI2d6ZXJyb3IiPmd6ZXJyb3I8L2E+IGJlbG93KS4KICAgPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCBjaGFyICogIDxhIG5hbWU9Imd6ZXJyb3IiPmd6ZXJyb3I8L2E+IChnekZpbGUgZmlsZSwgaW50ICplcnJudW0pOzwvZm9udD4KPGRkPgogICAgIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQogICBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCiAgIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAogICBlcnJudW0gaXMgc2V0IHRvIDxhIGhyZWY9IiNaX0VSUk5PIj5aX0VSUk5PPC9hPiBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCiAgIHRvIGdldCB0aGUgZXhhY3QgZXJyb3IgY29kZS4KICAgPHA+CjwvZGw+Cjxocj4KPGEgbmFtZT0iQmFzaWMgZnVuY3Rpb25zIj48aDI+IEJhc2ljIGZ1bmN0aW9ucyA8L2gyPgo8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KPHVsPgo8bGk+ICBjb25zdCBjaGFyICogIDxhIGhyZWY9IiN6bGliVmVyc2lvbiI+emxpYlZlcnNpb248L2E+ICh2b2lkKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgbGV2ZWwpOwo8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgZmx1c2gpOwo8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlRW5kIj5kZWZsYXRlRW5kPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTsKPGxpPiAgaW50ICA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7CjwvdWw+Cgo8aDM+IEZ1bmN0aW9uIGRlc2NyaXB0aW9uIDwvaDM+CjxkbD4KPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGNvbnN0IGNoYXIgKiAgPGEgbmFtZT0iemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiAodm9pZCk7PC9mb250Pgo8ZGQ+IFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBkaWZmZXJzLCB0aGUgbGlicmFyeSBjb2RlIGFjdHVhbGx5IHVzZWQgaXMKICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBhbmQgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4uCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCBsZXZlbCk7PC9mb250Pgo8ZGQ+CiAgICAgSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBmb3IgY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKICAgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4KICAgSWYgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYXJlIHNldCB0byA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiB1cGRhdGVzIHRoZW0gdG8KICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgIDxwPgoKICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSA8YSBocmVmPSIjWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+LCBvciBiZXR3ZWVuIDAgYW5kIDk6CiAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0CiAgIGFsbCAodGhlIGlucHV0IGRhdGEgaXMgc2ltcGx5IGNvcGllZCBhIGJsb2NrIGF0IGEgdGltZSkuCiAgIDxwPgoKICAgPGEgaHJlZj0iI1pfREVGQVVMVF9DT01QUkVTU0lPTiI+Wl9ERUZBVUxUX0NPTVBSRVNTSU9OPC9hPiByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZAogICBjb21wcmVzc2lvbiAoY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gbGV2ZWwgNikuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CiAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGxldmVsIGlzIG5vdCBhIHZhbGlkIGNvbXByZXNzaW9uIGxldmVsLAogICA8YSBocmVmPSIjWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+IGlmIHRoZSB6bGliIGxpYnJhcnkgdmVyc2lvbiAoPGEgaHJlZj0iI3psaWJfdmVyc2lvbiI+emxpYl92ZXJzaW9uPC9hPikgaXMgaW5jb21wYXRpYmxlCiAgIHdpdGggdGhlIHZlcnNpb24gYXNzdW1lZCBieSB0aGUgY2FsbGVyIChaTElCX1ZFUlNJT04pLgogICA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBkb2VzIG5vdAogICBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTs8L2ZvbnQ+CjxkZD4KICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CiAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKICBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgogIGZvcmNlZCB0byBmbHVzaC48cD4KCiAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCiAgZm9sbG93aW5nIGFjdGlvbnM6CgogIDx1bD4KICA8bGk+IENvbXByZXNzIG1vcmUgaW5wdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCB1cGRhdGUgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPgogICAgYWNjb3JkaW5nbHkuIElmIG5vdCBhbGwgaW5wdXQgY2FuIGJlIHByb2Nlc3NlZCAoYmVjYXVzZSB0aGVyZSBpcyBub3QKICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBhcmUgdXBkYXRlZCBhbmQKICAgIHByb2Nlc3Npbmcgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS4KCiAgPGxpPgogICAgUHJvdmlkZSBtb3JlIG91dHB1dCBzdGFydGluZyBhdCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X291dCI+bmV4dF9vdXQ8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+CiAgICBhY2NvcmRpbmdseS4gVGhpcyBhY3Rpb24gaXMgZm9yY2VkIGlmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgbm9uIHplcm8uCiAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgogICAgc2hvdWxkIGJlIHNldCBvbmx5IHdoZW4gbmVjZXNzYXJ5IChpbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbnMpLgogICAgU29tZSBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KICA8L3VsPiA8cD4KCiAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CiAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nCiAgbW9yZSBvdXRwdXQsIGFuZCB1cGRhdGluZyA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBvciA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IGFjY29yZGluZ2x5IDsgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPgogIHNob3VsZCBuZXZlciBiZSB6ZXJvIGJlZm9yZSB0aGUgY2FsbC4gVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZQogIGNvbXByZXNzZWQgb3V0cHV0IHdoZW4gaXQgd2FudHMsIGZvciBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbAogICg8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+ID09IDApLCBvciBhZnRlciBlYWNoIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPgogIGFuZCB3aXRoIHplcm8gPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlCiAgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCiAgPHA+CgogICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCiAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KICB0aGF0IHRoZSBkZWNvbXByZXNzb3IgY2FuIGdldCBhbGwgaW5wdXQgZGF0YSBhdmFpbGFibGUgc28gZmFyLiAoSW4gcGFydGljdWxhcgogIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IGlzIHplcm8gYWZ0ZXIgdGhlIGNhbGwgaWYgZW5vdWdoIG91dHB1dCBzcGFjZSBoYXMgYmVlbiBwcm92aWRlZAogIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgogIGFsZ29yaXRobXMgYW5kIHNvIGl0IHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBuZWNlc3NhcnkuCiAgPHA+CgogICAgSWYgZmx1c2ggaXMgc2V0IHRvIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4sIGFsbCBvdXRwdXQgaXMgZmx1c2hlZCBhcyB3aXRoCiAgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgYW5kIHRoZSBjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcyByZXNldCBzbyB0aGF0IGRlY29tcHJlc3Npb24gY2FuCiAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuIFVzaW5nIDxhIGhyZWY9IiNaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQogIHRoZSBjb21wcmVzc2lvbi4KICA8cD4KCiAgICBJZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgogIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKICA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlICg8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gcmV0dXJucyB3aXRoIG5vbi16ZXJvCiAgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPikuCiAgPHA+CgogICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4sIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkLAogIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiByZXR1cm5zIHdpdGggPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGVyZQogIHdhcyBlbm91Z2ggb3V0cHV0IHNwYWNlIDsgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4sIHRoaXMgZnVuY3Rpb24gbXVzdCBiZQogIGNhbGxlZCBhZ2FpbiB3aXRoIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+KSBidXQgbm8KICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yIGFuIGVycm9yLiBBZnRlcgogIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBoYXMgcmV0dXJuZWQgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiwgdGhlIG9ubHkgcG9zc2libGUgb3BlcmF0aW9ucyBvbiB0aGUKICBzdHJlYW0gYXJlIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gb3IgPGEgaHJlZj0iI2RlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+LgogIDxwPgoKICAgIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+IGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGFmdGVyIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IGlmIGFsbCB0aGUgY29tcHJlc3Npb24KICBpcyB0byBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAuIEluIHRoaXMgY2FzZSwgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGF0IGxlYXN0CiAgMC4xJSBsYXJnZXIgdGhhbiA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBwbHVzIDEyIGJ5dGVzLiAgSWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGRvZXMgbm90IHJldHVybgogIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4sIHRoZW4gaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgogIDxwPgoKICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHNldHMgc3RybS0mZ3QgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gdG8gdGhlIDxhIGhyZWY9IiNhZGxlcjMyIj5hZGxlcjMyPC9hPiBjaGVja3N1bSBvZiBhbGwgaW5wdXQgcmVhZAogIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gYnl0ZXMpLgogIDxwPgoKICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIG1heSB1cGRhdGUgPGEgaHJlZj0iI2RhdGFfdHlwZSI+ZGF0YV90eXBlPC9hPiBpZiBpdCBjYW4gbWFrZSBhIGdvb2QgZ3Vlc3MgYWJvdXQKICB0aGUgaW5wdXQgZGF0YSB0eXBlICg8YSBocmVmPSIjWl9BU0NJSSI+Wl9BU0NJSTwvYT4gb3IgPGEgaHJlZj0iI1pfQklOQVJZIj5aX0JJTkFSWTwvYT4pLiBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAogIGJpbmFyeS4gVGhpcyBmaWVsZCBpcyBvbmx5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcyBhbmQgZG9lcyBub3QgYWZmZWN0CiAgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgogIDxwPgoKICAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dAogIHByb2Nlc3NlZCBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gaWYgYWxsIGlucHV0IGhhcyBiZWVuCiAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQgKG9ubHkgd2hlbiBmbHVzaCBpcyBzZXQgdG8KICA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKICBpZiA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gb3IgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gd2FzIE5VTEwpLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZQogIChmb3IgZXhhbXBsZSA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBvciA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IHdhcyB6ZXJvKS4KICA8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImRlZmxhdGVFbmQiPmRlZmxhdGVFbmQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KPGRkPgogICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCiAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkKICAgcGVuZGluZyBvdXRwdXQuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc3VjY2VzcywgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgdGhlCiAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50LCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gd2FzIGZyZWVkCiAgIHByZW1hdHVyZWx5IChzb21lIGlucHV0IG9yIG91dHB1dCB3YXMgZGlzY2FyZGVkKS4gSW4gdGhlIGVycm9yIGNhc2UsCiAgIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQogICBkZWFsbG9jYXRlZCkuCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+CjxkZD4KCUluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gZm9yIGRlY29tcHJlc3Npb24uIFRoZSBmaWVsZHMKICAgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkKICAgdGhlIGNhbGxlci4gSWYgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGlzIG5vdCA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAogICB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjb21wcmVzc2lvbiBtZXRob2QpLCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiBkZXRlcm1pbmVzIHRoZQogICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCiAgIGFjY29yZGluZ2x5IDsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+LiAgSWYgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBhbmQgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYXJlIHNldCB0byA8YSBocmVmPSIjWl9OVUxMIj5aX05VTEw8L2E+LCA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiB1cGRhdGVzIHRoZW0gdG8KICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgIDxwPgoKICAgICA8YSBocmVmPSIjaW5mbGF0ZUluaXQiPmluZmxhdGVJbml0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICBtZW1vcnksIDxhIGhyZWY9IiNaX1ZFUlNJT05fRVJST1IiPlpfVkVSU0lPTl9FUlJPUjwvYT4gaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQogICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IKICAgbWVzc2FnZS4gPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKICAgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAgKFNvIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQKICAgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gbWF5IGJlIG1vZGlmaWVkLCBidXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYXJlIHVuY2hhbmdlZC4pCiAgIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGZsdXNoKTs8L2ZvbnQ+CjxkZD4KICAgIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBkZWNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCiAgaW50cm9kdWNlIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkKICBleGNlcHQgd2hlbiBmb3JjZWQgdG8gZmx1c2guCiAgPHA+CgogIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKICBmb2xsb3dpbmcgYWN0aW9uczoKCiAgPHVsPgogIDxsaT4gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgdXBkYXRlIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4KICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CiAgICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciksIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCiAgICB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLgoKICA8bGk+IFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQKICAgIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gYWNjb3JkaW5nbHkuICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSBwcm92aWRlcyBhcyBtdWNoIG91dHB1dCBhcyBwb3NzaWJsZSwKICAgIHVudGlsIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAoc2VlIGJlbG93IGFib3V0IHRoZSBmbHVzaCBwYXJhbWV0ZXIpLgogIDwvdWw+IDxwPgoKICBCZWZvcmUgdGhlIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKICBvbmUgb2YgdGhlIGFjdGlvbnMgaXMgcG9zc2libGUsIGJ5IHByb3ZpZGluZyBtb3JlIGlucHV0IGFuZC9vciBjb25zdW1pbmcKICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgogIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29uc3VtZSB0aGUgdW5jb21wcmVzc2VkIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IKICBleGFtcGxlIHdoZW4gdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCAoPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiA9PSAwKSwgb3IgYWZ0ZXIgZWFjaAogIGNhbGwgb2YgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuIElmIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBhbmQgd2l0aCB6ZXJvIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4sIGl0CiAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQogIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCiAgPHA+CgogICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+IGZsdXNoZXMgYXMgbXVjaAogIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiBpcwogIG5vdCBzcGVjaWZpZWQgZm9yIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIG90aGVyIHRoYW4gPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPgogIGFuZCA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKICBhcyBwb3NzaWJsZSBhbnl3YXkuCiAgPHA+CgogICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIDxhIGhyZWY9IiNaX1NUUkVBTV9FTkQiPlpfU1RSRUFNX0VORDwvYT4gb3IgYW4KICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcAogIChhIHNpbmdsZSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPiksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bwogIDxhIGhyZWY9IiNaX0ZJTklTSCI+Wl9GSU5JU0g8L2E+LiBJbiB0aGlzIGNhc2UgYWxsIHBlbmRpbmcgaW5wdXQgaXMgcHJvY2Vzc2VkIGFuZCBhbGwgcGVuZGluZwogIG91dHB1dCBpcyBmbHVzaGVkIDsgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKICB1bmNvbXByZXNzZWQgZGF0YS4gKFRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtYXkgaGF2ZSBiZWVuIHNhdmVkCiAgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSBuZXh0IG9wZXJhdGlvbiBvbiB0aGlzIHN0cmVhbSBtdXN0CiAgYmUgPGEgaHJlZj0iI2luZmxhdGVFbmQiPmluZmxhdGVFbmQ8L2E+IHRvIGRlYWxsb2NhdGUgdGhlIGRlY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIFRoZSB1c2Ugb2YgPGEgaHJlZj0iI1pfRklOSVNIIj5aX0ZJTklTSDwvYT4KICBpcyBuZXZlciByZXF1aXJlZCwgYnV0IGNhbiBiZSB1c2VkIHRvIGluZm9ybSA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gdGhhdCBhIGZhc3RlciByb3V0aW5lCiAgbWF5IGJlIHVzZWQgZm9yIHRoZSBzaW5nbGUgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgY2FsbC4KICA8cD4KCiAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+CiAgYmVsb3cpLCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4gc2V0cyBzdHJtLTxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IHRvIHRoZSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gb2YgdGhlCiAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gOyBvdGhlcndpc2UKICBpdCBzZXRzIHN0cm0tJmd0IDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+IHRvIHRoZSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZAogIHNvIGZhciAodGhhdCBpcywgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBieXRlcykgYW5kIHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+LCA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9yCiAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkKICBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+IGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlCiAgY29tcHJlc3NvciBhbmQgcmV0dXJucyA8YSBocmVmPSIjWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+IG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCiAgPHA+CgogICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkgcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAogIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VORCI+Wl9TVFJFQU1fRU5EPC9hPiBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCiAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4gaWYgYQogIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIHRoZSBpbnB1dCBkYXRhIHdhcwogIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QKICA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gY2hlY2tzdW0pLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50CiAgKGZvciBleGFtcGxlIGlmIDxhIGhyZWY9IiNuZXh0X2luIj5uZXh0X2luPC9hPiBvciA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiB3YXMgTlVMTCksIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QKICBlbm91Z2ggbWVtb3J5LCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90CiAgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgd2hlbiA8YSBocmVmPSIjWl9GSU5JU0giPlpfRklOSVNIPC9hPiBpcyB1c2VkLiBJbiB0aGUgPGEgaHJlZj0iI1pfREFUQV9FUlJPUiI+Wl9EQVRBX0VSUk9SPC9hPgogIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgdGhlbiBjYWxsIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+IHRvIGxvb2sgZm9yIGEgZ29vZAogIGNvbXByZXNzaW9uIGJsb2NrLgogIDxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gIGludCAgPGEgbmFtZT0iaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250Pgo8ZGQ+CiAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueQogICBwZW5kaW5nIG91dHB1dC4KICAgPHA+CgogICAgIDxhIGhyZWY9IiNpbmZsYXRlRW5kIj5pbmZsYXRlRW5kPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+CiAgIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBlcnJvciBjYXNlLCA8YSBocmVmPSIjbXNnIj5tc2c8L2E+IG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgo8L2RsPgo8aHI+CjxhIG5hbWU9IkFkdmFuY2VkIGZ1bmN0aW9ucyI+PGgyPiBBZHZhbmNlZCBmdW5jdGlvbnMgPC9oMj4KICAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBuZWVkZWQgb25seSBpbiBzb21lIHNwZWNpYWwgYXBwbGljYXRpb25zLgo8aDM+IEZ1bmN0aW9uIGxpc3QgPC9oMz4KPHVsPgo8bGk+ICBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwKPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNkZWZsYXRlUmVzZXQiPmRlZmxhdGVSZXNldDwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7CjxsaT4gaW50ICA8YSBocmVmPSIjZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOwo8bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOwo8bGk+ICBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTsKPGxpPiBpbnQgIDxhIGhyZWY9IiNpbmZsYXRlU3luYyI+aW5mbGF0ZVN5bmM8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOwo8bGk+IGludCAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTsKCjwvdWw+CjxoMz4gRnVuY3Rpb24gZGVzY3JpcHRpb24gPC9oMz4KPGRsPgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiAgaW50ICA8YSBuYW1lPSJkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsIGludCAgd2luZG93Qml0cywgaW50ICBtZW1MZXZlbCwgaW50ICBzdHJhdGVneSk7PC9mb250PgoKPGRkPiBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCiAgIGZpZWxkcyA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4sIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IGFuZCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5CiAgIHRoZSBjYWxsZXIuPHA+CgogICAgIFRoZSBtZXRob2QgcGFyYW1ldGVyIGlzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuIEl0IG11c3QgYmUgPGEgaHJlZj0iI1pfREVGTEFURUQiPlpfREVGTEFURUQ8L2E+IGluCiAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS48cD4KCiAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIHdpbmRvdyBzaXplCiAgICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IgdGhpcwogICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiBMYXJnZXIgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIKICAgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgogICA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiBpcyB1c2VkIGluc3RlYWQuPHA+CgogICAgIFRoZSBtZW1MZXZlbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGhvdyBtdWNoIG1lbW9yeSBzaG91bGQgYmUgYWxsb2NhdGVkCiAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKICAgaXMgc2xvdyBhbmQgcmVkdWNlcyBjb21wcmVzc2lvbiByYXRpbyA7IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeQogICBmb3Igb3B0aW1hbCBzcGVlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4gU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeQogICB1c2FnZSBhcyBhIGZ1bmN0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLjxwPgoKICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiBVc2UgdGhlCiAgIHZhbHVlIDxhIGhyZWY9IiNaX0RFRkFVTFRfU1RSQVRFR1kiPlpfREVGQVVMVF9TVFJBVEVHWTwvYT4gZm9yIG5vcm1hbCBkYXRhLCA8YSBocmVmPSIjWl9GSUxURVJFRCI+Wl9GSUxURVJFRDwvYT4gZm9yIGRhdGEgcHJvZHVjZWQgYnkgYQogICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIG9yIDxhIGhyZWY9IiNaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+IHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KICAgc3RyaW5nIG1hdGNoKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEKICAgc29tZXdoYXQgcmFuZG9tIGRpc3RyaWJ1dGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIGlzCiAgIHR1bmVkIHRvIDxhIGhyZWY9IiNjb21wcmVzcyI+Y29tcHJlc3M8L2E+IHRoZW0gYmV0dGVyLiBUaGUgZWZmZWN0IG9mIDxhIGhyZWY9IiNaX0ZJTFRFUkVEIj5aX0ZJTFRFUkVEPC9hPiBpcyB0byBmb3JjZSBtb3JlCiAgIEh1ZmZtYW4gY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZyA7IGl0IGlzIHNvbWV3aGF0IGludGVybWVkaWF0ZQogICBiZXR3ZWVuIFpfREVGQVVMVCBhbmQgPGEgaHJlZj0iI1pfSFVGRk1BTl9PTkxZIj5aX0hVRkZNQU5fT05MWTwvYT4uIFRoZSBzdHJhdGVneSBwYXJhbWV0ZXIgb25seSBhZmZlY3RzCiAgIHRoZSBjb21wcmVzc2lvbiByYXRpbyBidXQgbm90IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgZXZlbgogICBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuPHA+CgogICAgICA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIDxhIGhyZWY9IiNaX01FTV9FUlJPUiI+Wl9NRU1fRVJST1I8L2E+IGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCiAgIG1lbW9yeSwgPGEgaHJlZj0iI1pfU1RSRUFNX0VSUk9SIj5aX1NUUkVBTV9FUlJPUjwvYT4gaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCiAgIG1ldGhvZCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4gZG9lcwogICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLjxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LCB1SW50ICBkaWN0TGVuZ3RoKTs8L2ZvbnQ+CjxkZD4KICAgICBJbml0aWFsaXplcyB0aGUgY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlCiAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAogICBpbW1lZGlhdGVseSBhZnRlciA8YSBocmVmPSIjZGVmbGF0ZUluaXQiPmRlZmxhdGVJbml0PC9hPiwgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPiBvciA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+LCBiZWZvcmUgYW55CiAgIGNhbGwgb2YgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+LiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKICAgZGljdGlvbmFyeSAoc2VlIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+KS48cD4KCiAgICAgVGhlIGRpY3Rpb25hcnkgc2hvdWxkIGNvbnNpc3Qgb2Ygc3RyaW5ncyAoYnl0ZSBzZXF1ZW5jZXMpIHRoYXQgYXJlIGxpa2VseQogICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CiAgIHVzZWQgc3RyaW5ncyBwcmVmZXJhYmx5IHB1dCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIGRpY3Rpb25hcnkuIFVzaW5nIGEKICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQogICBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5IDsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgogICB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuPHA+CgogICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CiAgIDxhIGhyZWY9IiNkZWZsYXRlSW5pdCI+ZGVmbGF0ZUluaXQ8L2E+IG9yIDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4sIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCiAgIGRpc2NhcmRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIGRpY3Rpb25hcnkgaXMgbGFyZ2VyIHRoYW4gdGhlIHdpbmRvdyBzaXplIGluCiAgIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPiBvciBkZWZsYXRlMi4gVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgc2hvdWxkIGJlCiAgIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LCBub3QgYXQgdGhlIGZyb250LjxwPgoKICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLSZndCA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiBpcyBzZXQgdG8gdGhlIEFkbGVyMzIgdmFsdWUKICAgb2YgdGhlIGRpY3Rpb25hcnkgOyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAoVGhlIEFkbGVyMzIgdmFsdWUKICAgYXBwbGllcyB0byB0aGUgd2hvbGUgZGljdGlvbmFyeSBldmVuIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGRpY3Rpb25hcnkgaXMKICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pPHA+CgogICAgIDxhIGhyZWY9IiNkZWZsYXRlU2V0RGljdGlvbmFyeSI+ZGVmbGF0ZVNldERpY3Rpb25hcnk8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEKICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IGlzCiAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzIHN0cmVhbQogICBvciBpZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJzb3J0KS4gPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4gZG9lcyBub3QKICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLjxwPgoKPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gaW50ICA8YSBuYW1lPSJkZWZsYXRlQ29weSI+ZGVmbGF0ZUNvcHk8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IGRlc3QsIDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc291cmNlKTs8L2ZvbnQ+CjxkZD4KICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLjxwPgoKICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQogICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dAogICBkYXRhIHdpdGggYSBmaWx0ZXIuIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKICAgYnkgY2FsbGluZyA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4uICBOb3RlIHRoYXQgPGEgaHJlZj0iI2RlZmxhdGVDb3B5Ij5kZWZsYXRlQ29weTwvYT4gZHVwbGljYXRlcyB0aGUgaW50ZXJuYWwKICAgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kCiAgIGNhbiBjb25zdW1lIGxvdHMgb2YgbWVtb3J5LjxwPgoKICAgICA8YSBocmVmPSIjZGVmbGF0ZUNvcHkiPmRlZmxhdGVDb3B5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90CiAgIGVub3VnaCBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2Ugc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQKICAgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBiZWluZyBOVUxMKS4gPGEgaHJlZj0iI21zZyI+bXNnPC9hPiBpcyBsZWZ0IHVuY2hhbmdlZCBpbiBib3RoIHNvdXJjZSBhbmQKICAgZGVzdGluYXRpb24uPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImRlZmxhdGVSZXNldCI+ZGVmbGF0ZVJlc2V0PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiBzdHJtKTs8L2ZvbnQ+CjxkZD4gICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjZGVmbGF0ZUVuZCI+ZGVmbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4sCiAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4uCiAgIFRoZSBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcwogICB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNkZWZsYXRlSW5pdDIiPmRlZmxhdGVJbml0MjwvYT4uPHA+CgogICAgICA8YSBocmVmPSIjZGVmbGF0ZVJlc2V0Ij5kZWZsYXRlUmVzZXQ8L2E+IHJldHVybnMgPGEgaHJlZj0iI1pfT0siPlpfT0s8L2E+IGlmIHN1Y2Nlc3MsIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzb3VyY2UKICAgc3RyZWFtIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+IHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiBvciA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBiZWluZyBOVUxMKS48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iZGVmbGF0ZVBhcmFtcyI+ZGVmbGF0ZVBhcmFtczwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpOzwvZm9udD4KPGRkPgogICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgYW5kIGNvbXByZXNzaW9uIHN0cmF0ZWd5LiAgVGhlCiAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiA8YSBocmVmPSIjZGVmbGF0ZUluaXQyIj5kZWZsYXRlSW5pdDI8L2E+LiAgVGhpcyBjYW4gYmUKICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQKICAgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQgYXZhaWxhYmxlIHNvIGZhcgogICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCiAgIHRha2UgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4oKS48cD4KCiAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiwgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBtdXN0IGJlIHNldCBhcyBmb3IKICAgYSBjYWxsIG9mIDxhIGhyZWY9IiNkZWZsYXRlIj5kZWZsYXRlPC9hPigpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0bwogICBiZSBjb21wcmVzc2VkIGFuZCBmbHVzaGVkLiBJbiBwYXJ0aWN1bGFyLCBzdHJtLSZndCA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+IG11c3QgYmUKICAgbm9uLXplcm8uPHA+CgogICAgIDxhIGhyZWY9IiNkZWZsYXRlUGFyYW1zIj5kZWZsYXRlUGFyYW1zPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCiAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgogICBpZiBzdHJtLSZndGF2YWlsX291dCB3YXMgemVyby48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZUluaXQyIj5pbmZsYXRlSW5pdDI8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0sIGludCAgd2luZG93Qml0cyk7PC9mb250PgoKPGRkPiAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4gd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQogICBmaWVsZHMgPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+LCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiwgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gbXVzdCBiZSBpbml0aWFsaXplZAogICBiZWZvcmUgYnkgdGhlIGNhbGxlci48cD4KCiAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CiAgIHNpemUgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvcgogICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGlzIHVzZWQKICAgaW5zdGVhZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdyBzaXplIGlzIGdpdmVuIGFzCiAgIGlucHV0LCA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4oKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaW5zdGVhZCBvZgogICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LjxwPgoKICAgICAgPGEgaHJlZj0iI2luZmxhdGVJbml0MiI+aW5mbGF0ZUluaXQyPC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAogICBtZW1vcnksIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgYSBuZWdhdGl2ZQogICBtZW1MZXZlbCkuIDxhIGhyZWY9IiNtc2ciPm1zZzwvYT4gaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4KICAgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmCiAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPigpLiAoU28gPGEgaHJlZj0iI25leHRfaW4iPm5leHRfaW48L2E+IGFuZCA8YSBocmVmPSIjYXZhaWxfaW4iPmF2YWlsX2luPC9hPiBtYXkgYmUKICAgbW9kaWZpZWQsIGJ1dCA8YSBocmVmPSIjbmV4dF9vdXQiPm5leHRfb3V0PC9hPiBhbmQgPGEgaHJlZj0iI2F2YWlsX291dCI+YXZhaWxfb3V0PC9hPiBhcmUgdW5jaGFuZ2VkLik8cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+ICBpbnQgIDxhIG5hbWU9ImluZmxhdGVTZXREaWN0aW9uYXJ5Ij5pbmZsYXRlU2V0RGljdGlvbmFyeTwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSwgY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnksIHVJbnQgIGRpY3RMZW5ndGgpOzwvZm9udD4KPGRkPgogICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIDxhIGhyZWY9IiNpbmZsYXRlIj5pbmZsYXRlPC9hPgogICBpZiB0aGlzIGNhbGwgcmV0dXJuZWQgPGEgaHJlZj0iI1pfTkVFRF9ESUNUIj5aX05FRURfRElDVDwvYT4uIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgogICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBBZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgogICA8YSBocmVmPSIjaW5mbGF0ZSI+aW5mbGF0ZTwvYT4uIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQogICBkaWN0aW9uYXJ5IChzZWUgPGEgaHJlZj0iI2RlZmxhdGVTZXREaWN0aW9uYXJ5Ij5kZWZsYXRlU2V0RGljdGlvbmFyeTwvYT4pLjxwPgoKICAgICA8YSBocmVmPSIjaW5mbGF0ZVNldERpY3Rpb25hcnkiPmluZmxhdGVTZXREaWN0aW9uYXJ5PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiBhCiAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiBpcwogICBpbmNvbnNpc3RlbnQsIDxhIGhyZWY9IiNaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gaWYgdGhlIGdpdmVuIGRpY3Rpb25hcnkgZG9lc24ndCBtYXRjaCB0aGUKICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIDxhIGhyZWY9IiNpbmZsYXRlU2V0RGljdGlvbmFyeSI+aW5mbGF0ZVNldERpY3Rpb25hcnk8L2E+IGRvZXMgbm90CiAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKICAgPGEgaHJlZj0iI2luZmxhdGUiPmluZmxhdGU8L2E+KCkuPHA+Cgo8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBpbnQgIDxhIG5hbWU9ImluZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gKDxhIGhyZWY9IiN6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT4gc3RybSk7PC9mb250PgoKPGRkPiAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKICBkZXNjcmlwdGlvbiBvZiA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gd2l0aCA8YSBocmVmPSIjWl9GVUxMX0ZMVVNIIj5aX0ZVTExfRkxVU0g8L2E+KSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAogIGF2YWlsYWJsZSBpbnB1dCBpcyBza2lwcGVkLiBObyBvdXRwdXQgaXMgcHJvdmlkZWQuPHA+CgogICAgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4gcmV0dXJucyA8YSBocmVmPSIjWl9PSyI+Wl9PSzwvYT4gaWYgYSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLCA8YSBocmVmPSIjWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPgogIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCA8YSBocmVmPSIjWl9EQVRBX0VSUk9SIj5aX0RBVEFfRVJST1I8L2E+IGlmIG5vIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAogIG9yIDxhIGhyZWY9IiNaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+IGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCiAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBzYXZlIHRoZSBjdXJyZW50IGN1cnJlbnQgdmFsdWUgb2YgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gd2hpY2gKICBpbmRpY2F0ZXMgd2hlcmUgdmFsaWQgY29tcHJlc3NlZCBkYXRhIHdhcyBmb3VuZC4gSW4gdGhlIGVycm9yIGNhc2UsIHRoZQogIGFwcGxpY2F0aW9uIG1heSByZXBlYXRlZGx5IGNhbGwgPGEgaHJlZj0iI2luZmxhdGVTeW5jIj5pbmZsYXRlU3luYzwvYT4sIHByb3ZpZGluZyBtb3JlIGlucHV0IGVhY2ggdGltZSwKICB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS48cD4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgPGEgbmFtZT0iaW5mbGF0ZVJlc2V0Ij5pbmZsYXRlUmVzZXQ8L2E+ICg8YSBocmVmPSIjel9zdHJlYW1wIj56X3N0cmVhbXA8L2E+IHN0cm0pOzwvZm9udD4KPGRkPgogICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byA8YSBocmVmPSIjaW5mbGF0ZUVuZCI+aW5mbGF0ZUVuZDwvYT4gZm9sbG93ZWQgYnkgPGEgaHJlZj0iI2luZmxhdGVJbml0Ij5pbmZsYXRlSW5pdDwvYT4sCiAgIGJ1dCBkb2VzIG5vdCBmcmVlIGFuZCByZWFsbG9jYXRlIGFsbCB0aGUgaW50ZXJuYWwgZGVjb21wcmVzc2lvbiA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPi4KICAgVGhlIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IDxhIGhyZWY9IiNpbmZsYXRlSW5pdDIiPmluZmxhdGVJbml0MjwvYT4uCiAgIDxwPgoKICAgICAgPGEgaHJlZj0iI2luZmxhdGVSZXNldCI+aW5mbGF0ZVJlc2V0PC9hPiByZXR1cm5zIDxhIGhyZWY9IiNaX09LIj5aX09LPC9hPiBpZiBzdWNjZXNzLCBvciA8YSBocmVmPSIjWl9TVFJFQU1fRVJST1IiPlpfU1RSRUFNX0VSUk9SPC9hPiBpZiB0aGUgc291cmNlCiAgIHN0cmVhbSA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gb3IgPGEgaHJlZj0iI3N0YXRlIj5zdGF0ZTwvYT4gYmVpbmcgTlVMTCkuCiAgIDxwPgo8L2RsPgoKPGhyPgo8YSBuYW1lPSJDaGVja3N1bSBmdW5jdGlvbnMiPjxoMj4gQ2hlY2tzdW0gZnVuY3Rpb25zIDwvaDI+CiAgICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcmVsYXRlZCB0byBjb21wcmVzc2lvbiBidXQgYXJlIGV4cG9ydGVkCiAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUKICAgY29tcHJlc3Npb24gbGlicmFyeS4KPGgzPiBGdW5jdGlvbiBsaXN0IDwvaDM+Cjx1bD4KPGxpPiB1TG9uZyAgPGEgaHJlZj0iI2FkbGVyMzIiPmFkbGVyMzI8L2E+ICh1TG9uZyA8YSBocmVmPSIjYWRsZXIiPmFkbGVyPC9hPiwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOwo8bGk+IHVMb25nICA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPiAgICh1TG9uZyBjcmMsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTsKPC91bD4KPGgzPiBGdW5jdGlvbiBkZXNjcmlwdGlvbiA8L2gzPgo8ZGw+Cjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJhZGxlcjMyIj5hZGxlcjMyPC9hPiAodUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKTs8L2ZvbnQ+CjxkZD4KICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCiAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucwogICB0aGUgcmVxdWlyZWQgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGNoZWNrc3VtLgogICA8cD4KICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAogICBtdWNoIGZhc3Rlci4gVXNhZ2UgZXhhbXBsZToKICAgPHByZT4KCiAgICAgdUxvbmcgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oMEwsIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4sIDApOwoKICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgewogICAgICAgPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4gPSA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4oPGEgaHJlZj0iI2FkbGVyIj5hZGxlcjwvYT4sIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgaWYgKDxhIGhyZWY9IiNhZGxlciI+YWRsZXI8L2E+ICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwogICA8L3ByZT4KCjxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IHVMb25nICA8YSBuYW1lPSJjcmMzMiI+Y3JjMzI8L2E+ICAgKHVMb25nIGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pOzwvZm9udD4KPGRkPgogICAgIFVwZGF0ZSBhIHJ1bm5pbmcgY3JjIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUgdXBkYXRlZAogICBjcmMuIElmIGJ1ZiBpcyBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUKICAgZm9yIHRoZSBjcmMuIFByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nIChvbmUncyBjb21wbGVtZW50KSBpcyBwZXJmb3JtZWQKICAgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgogICBVc2FnZSBleGFtcGxlOgogICA8cHJlPgoKICAgICB1TG9uZyBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPigwTCwgPGEgaHJlZj0iI1pfTlVMTCI+Wl9OVUxMPC9hPiwgMCk7CgogICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CiAgICAgICBjcmMgPSA8YSBocmVmPSIjY3JjMzIiPmNyYzMyPC9hPihjcmMsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CiAgIDwvcHJlPgo8L2RsPgo8aHI+CjxhIG5hbWU9InN0cnVjdCB6X3N0cmVhbV9zIj48aDI+IHN0cnVjdCB6X3N0cmVhbV9zIDwvaDI+Cjxmb250IGNvbG9yPSJCbHVlIj4KPGEgbmFtZT0iel9zdHJlYW1fcyI+CjxwcmU+CnR5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgewogICAgQnl0ZWYgICAgKjxhIG5hbWU9Im5leHRfaW4iPm5leHRfaW48L2E+OyAgLyogbmV4dCBpbnB1dCBieXRlICovCiAgICB1SW50ICAgICA8YSBuYW1lPSJhdmFpbF9pbiI+YXZhaWxfaW48L2E+OyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gKi8KICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX2luIj50b3RhbF9pbjwvYT47ICAvKiB0b3RhbCBuYiBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqLwoKICAgIEJ5dGVmICAgICo8YSBuYW1lPSJuZXh0X291dCI+bmV4dF9vdXQ8L2E+OyAvKiBuZXh0IG91dHB1dCBieXRlIHNob3VsZCBiZSBwdXQgdGhlcmUgKi8KICAgIHVJbnQgICAgIDxhIG5hbWU9ImF2YWlsX291dCI+YXZhaWxfb3V0PC9hPjsgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gKi8KICAgIHVMb25nICAgIDxhIG5hbWU9InRvdGFsX291dCI+dG90YWxfb3V0PC9hPjsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLwoKICAgIGNoYXIgICAgICo8YSBuYW1lPSJtc2ciPm1zZzwvYT47ICAgICAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCiAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICo8YSBuYW1lPSJzdGF0ZSI+c3RhdGU8L2E+OyAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KCiAgICBhbGxvY19mdW5jIDxhIG5hbWU9InphbGxvYyI+emFsbG9jPC9hPjsgIC8qIHVzZWQgdG8gYWxsb2NhdGUgdGhlIGludGVybmFsIDxhIGhyZWY9IiNzdGF0ZSI+c3RhdGU8L2E+ICovCiAgICBmcmVlX2Z1bmMgIDxhIG5hbWU9InpmcmVlIj56ZnJlZTwvYT47ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCA8YSBocmVmPSIjc3RhdGUiPnN0YXRlPC9hPiAqLwogICAgdm9pZHBmICAgICA8YSBuYW1lPSJvcGFxdWUiPm9wYXF1ZTwvYT47ICAvKiBwcml2YXRlIGRhdGEgb2JqZWN0IHBhc3NlZCB0byA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiAqLwoKICAgIGludCAgICAgPGEgbmFtZT0iZGF0YV90eXBlIj5kYXRhX3R5cGU8L2E+OyAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBhc2NpaSBvciBiaW5hcnkgKi8KICAgIHVMb25nICAgPGEgbmFtZT0iYWRsZXIiPmFkbGVyPC9hPjsgICAgICAvKiA8YSBocmVmPSIjYWRsZXIzMiI+YWRsZXIzMjwvYT4gdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCiAgICB1TG9uZyAgIDxhIG5hbWU9InJlc2VydmVkIj5yZXNlcnZlZDwvYT47ICAgLyogPGEgaHJlZj0iI3Jlc2VydmVkIj5yZXNlcnZlZDwvYT4gZm9yIGZ1dHVyZSB1c2UgKi8KfSA8YSBocmVmPSIjel9zdHJlYW1fcyI+el9zdHJlYW08L2E+IDsKCnR5cGVkZWYgPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPiBGQVIgKiA8YSBuYW1lPSJ6X3N0cmVhbXAiPnpfc3RyZWFtcDwvYT47ICD/CjwvcHJlPgo8L2ZvbnQ+CiAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSA8YSBocmVmPSIjbmV4dF9pbiI+bmV4dF9pbjwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9pbiI+YXZhaWxfaW48L2E+IHdoZW4gPGEgaHJlZj0iI2F2YWlsX2luIj5hdmFpbF9pbjwvYT4gaGFzCiAgIGRyb3BwZWQgdG8gemVyby4gSXQgbXVzdCB1cGRhdGUgPGEgaHJlZj0iI25leHRfb3V0Ij5uZXh0X291dDwvYT4gYW5kIDxhIGhyZWY9IiNhdmFpbF9vdXQiPmF2YWlsX291dDwvYT4gd2hlbiA8YSBocmVmPSIjYXZhaWxfb3V0Ij5hdmFpbF9vdXQ8L2E+CiAgIGhhcyBkcm9wcGVkIHRvIHplcm8uIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgPGEgaHJlZj0iI3phbGxvYyI+emFsbG9jPC9hPiwgPGEgaHJlZj0iI3pmcmVlIj56ZnJlZTwvYT4gYW5kCiAgIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gYmVmb3JlIGNhbGxpbmcgdGhlIGluaXQgZnVuY3Rpb24uIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUKICAgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgbXVzdCBub3QgYmUgdXBkYXRlZCBieSB0aGUgYXBwbGljYXRpb24uIDxwPgoKICAgVGhlIDxhIGhyZWY9IiNvcGFxdWUiPm9wYXF1ZTwvYT4gdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAogICBwYXJhbWV0ZXIgZm9yIGNhbGxzIG9mIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGN1c3RvbQogICBtZW1vcnkgbWFuYWdlbWVudC4gVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKICAgPGEgaHJlZj0iI29wYXF1ZSI+b3BhcXVlPC9hPiB2YWx1ZS4gPHA+CgogICA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IG11c3QgcmV0dXJuIDxhIGhyZWY9IiNaX05VTEwiPlpfTlVMTDwvYT4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBvYmplY3QuCiAgIElmIHpsaWIgaXMgdXNlZCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCA8YSBocmVmPSIjemFsbG9jIj56YWxsb2M8L2E+IGFuZCA8YSBocmVmPSIjemZyZWUiPnpmcmVlPC9hPiBtdXN0IGJlCiAgIHRocmVhZCBzYWZlLiA8cD4KCiAgIE9uIDE2LWJpdCBzeXN0ZW1zLCB0aGUgZnVuY3Rpb25zIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gYW5kIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+IG11c3QgYmUgYWJsZSB0byBhbGxvY2F0ZQogICBleGFjdGx5IDY1NTM2IGJ5dGVzLCBidXQgd2lsbCBub3QgYmUgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHRoaXMKICAgaWYgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gV0FSTklORzogT24gTVNET1MsCiAgIHBvaW50ZXJzIHJldHVybmVkIGJ5IDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4gZm9yIG9iamVjdHMgb2YgZXhhY3RseSA2NTUzNiBieXRlcyAqbXVzdCoKICAgaGF2ZSB0aGVpciBvZmZzZXQgbm9ybWFsaXplZCB0byB6ZXJvLiBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uCiAgIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeSBlbnN1cmVzIHRoaXMgKHNlZSB6dXRpbC5jKS4gVG8gcmVkdWNlIG1lbW9yeQogICByZXF1aXJlbWVudHMgYW5kIGF2b2lkIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZgogICBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIC1ETUFYX1dCSVRTPTE0IChzZWUgemNvbmYuaCkuCiAgIDxwPgoKICAgVGhlIGZpZWxkcyA8YSBocmVmPSIjdG90YWxfaW4iPnRvdGFsX2luPC9hPiBhbmQgPGEgaHJlZj0iI3RvdGFsX291dCI+dG90YWxfb3V0PC9hPiBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvcgogICBwcm9ncmVzcyByZXBvcnRzLiBBZnRlciBjb21wcmVzc2lvbiwgPGEgaHJlZj0iI3RvdGFsX2luIj50b3RhbF9pbjwvYT4gaG9sZHMgdGhlIHRvdGFsIHNpemUgb2YKICAgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yCiAgIChwYXJ0aWN1bGFybHkgaWYgdGhlIGRlY29tcHJlc3NvciB3YW50cyB0byBkZWNvbXByZXNzIGV2ZXJ5dGhpbmcgaW4KICAgYSBzaW5nbGUgc3RlcCkuIDxwPgoKPGhyPgo8YSBuYW1lPSJDb25zdGFudHMiPjxoMj4gQ29uc3RhbnRzIDwvaDI+Cjxmb250IGNvbG9yPSJCbHVlIj4KPHByZT4KI2RlZmluZSA8YSBuYW1lPSJaX05PX0ZMVVNIIj5aX05PX0ZMVVNIPC9hPiAgICAgIDAKI2RlZmluZSA8YSBuYW1lPSJaX1BBUlRJQUxfRkxVU0giPlpfUEFSVElBTF9GTFVTSDwvYT4gMQoJLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgPGEgaHJlZj0iI1pfU1lOQ19GTFVTSCI+Wl9TWU5DX0ZMVVNIPC9hPiBpbnN0ZWFkICovCiNkZWZpbmUgPGEgbmFtZT0iWl9TWU5DX0ZMVVNIIj5aX1NZTkNfRkxVU0g8L2E+ICAgIDIKI2RlZmluZSA8YSBuYW1lPSJaX0ZVTExfRkxVU0giPlpfRlVMTF9GTFVTSDwvYT4gICAgMwojZGVmaW5lIDxhIG5hbWU9IlpfRklOSVNIIj5aX0ZJTklTSDwvYT4gICAgICAgIDQKLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXMgOyBzZWUgPGEgaHJlZj0iI2RlZmxhdGUiPmRlZmxhdGU8L2E+KCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KCiNkZWZpbmUgPGEgbmFtZT0iWl9PSyI+Wl9PSzwvYT4gICAgICAgICAgICAwCiNkZWZpbmUgPGEgbmFtZT0iWl9TVFJFQU1fRU5EIj5aX1NUUkVBTV9FTkQ8L2E+ICAgIDEKI2RlZmluZSA8YSBuYW1lPSJaX05FRURfRElDVCI+Wl9ORUVEX0RJQ1Q8L2E+ICAgICAyCiNkZWZpbmUgPGEgbmFtZT0iWl9FUlJOTyI+Wl9FUlJOTzwvYT4gICAgICAgICgtMSkKI2RlZmluZSA8YSBuYW1lPSJaX1NUUkVBTV9FUlJPUiI+Wl9TVFJFQU1fRVJST1I8L2E+ICgtMikKI2RlZmluZSA8YSBuYW1lPSJaX0RBVEFfRVJST1IiPlpfREFUQV9FUlJPUjwvYT4gICAoLTMpCiNkZWZpbmUgPGEgbmFtZT0iWl9NRU1fRVJST1IiPlpfTUVNX0VSUk9SPC9hPiAgICAoLTQpCiNkZWZpbmUgPGEgbmFtZT0iWl9CVUZfRVJST1IiPlpfQlVGX0VSUk9SPC9hPiAgICAoLTUpCiNkZWZpbmUgPGEgbmFtZT0iWl9WRVJTSU9OX0VSUk9SIj5aX1ZFUlNJT05fRVJST1I8L2E+ICgtNikKLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlCiAqIHZhbHVlcyBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuCiAqLwoKI2RlZmluZSA8YSBuYW1lPSJaX05PX0NPTVBSRVNTSU9OIj5aX05PX0NPTVBSRVNTSU9OPC9hPiAgICAgICAgIDAKI2RlZmluZSA8YSBuYW1lPSJaX0JFU1RfU1BFRUQiPlpfQkVTVF9TUEVFRDwvYT4gICAgICAgICAgICAgMQojZGVmaW5lIDxhIG5hbWU9IlpfQkVTVF9DT01QUkVTU0lPTiI+Wl9CRVNUX0NPTVBSRVNTSU9OPC9hPiAgICAgICA5CiNkZWZpbmUgPGEgbmFtZT0iWl9ERUZBVUxUX0NPTVBSRVNTSU9OIj5aX0RFRkFVTFRfQ09NUFJFU1NJT048L2E+ICAoLTEpCi8qIGNvbXByZXNzaW9uIGxldmVscyAqLwoKI2RlZmluZSA8YSBuYW1lPSJaX0ZJTFRFUkVEIj5aX0ZJTFRFUkVEPC9hPiAgICAgICAgICAgIDEKI2RlZmluZSA8YSBuYW1lPSJaX0hVRkZNQU5fT05MWSI+Wl9IVUZGTUFOX09OTFk8L2E+ICAgICAgICAyCiNkZWZpbmUgPGEgbmFtZT0iWl9ERUZBVUxUX1NUUkFURUdZIj5aX0RFRkFVTFRfU1RSQVRFR1k8L2E+ICAgIDAKLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgOyBzZWUgPGEgaHJlZj0iI2RlZmxhdGVJbml0MiI+ZGVmbGF0ZUluaXQyPC9hPigpIGJlbG93IGZvciBkZXRhaWxzICovCgojZGVmaW5lIDxhIG5hbWU9IlpfQklOQVJZIj5aX0JJTkFSWTwvYT4gICAwCiNkZWZpbmUgPGEgbmFtZT0iWl9BU0NJSSI+Wl9BU0NJSTwvYT4gICAgMQojZGVmaW5lIDxhIG5hbWU9IlpfVU5LTk9XTiI+Wl9VTktOT1dOPC9hPiAgMgovKiBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIDxhIGhyZWY9IiNkYXRhX3R5cGUiPmRhdGFfdHlwZTwvYT4gZmllbGQgKi8KCiNkZWZpbmUgPGEgbmFtZT0iWl9ERUZMQVRFRCI+Wl9ERUZMQVRFRDwvYT4gICA4Ci8qIFRoZSA8YSBocmVmPSIjZGVmbGF0ZSI+ZGVmbGF0ZTwvYT4gY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KCiNkZWZpbmUgPGEgbmFtZT0iWl9OVUxMIj5aX05VTEw8L2E+ICAwICAvKiBmb3IgaW5pdGlhbGl6aW5nIDxhIGhyZWY9IiN6YWxsb2MiPnphbGxvYzwvYT4sIDxhIGhyZWY9IiN6ZnJlZSI+emZyZWU8L2E+LCA8YSBocmVmPSIjb3BhcXVlIj5vcGFxdWU8L2E+ICovCgojZGVmaW5lIDxhIG5hbWU9InpsaWJfdmVyc2lvbiI+emxpYl92ZXJzaW9uPC9hPiA8YSBocmVmPSIjemxpYlZlcnNpb24iPnpsaWJWZXJzaW9uPC9hPigpCi8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgbGVzcyB0aGFuIDEuMC4yICovCjwvcHJlPgo8L2ZvbnQ+Cgo8aHI+CjxhIG5hbWU9Ik1pc2MiPjxoMj4gTWlzYyA8L2gyPgogPGEgaHJlZj0iI2RlZmxhdGVJbml0Ij5kZWZsYXRlSW5pdDwvYT4gYW5kIDxhIGhyZWY9IiNpbmZsYXRlSW5pdCI+aW5mbGF0ZUluaXQ8L2E+IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2YgPGEgaHJlZj0iI3pfc3RyZWFtX3MiPnpfc3RyZWFtPC9hPi4KIDxwPgogT3RoZXIgZnVuY3Rpb25zOgogPGRsPgogPGZvbnQgY29sb3I9IkJsdWUiPjxkdD4gY29uc3QgY2hhciAgICogIDxhIG5hbWU9InpFcnJvciI+ekVycm9yPC9hPiAgICAgICAgICAgKGludCBlcnIpOzwvZm9udD4KIDxmb250IGNvbG9yPSJCbHVlIj48ZHQ+IGludCAgICAgICAgICAgICA8YSBuYW1lPSJpbmZsYXRlU3luY1BvaW50Ij5pbmZsYXRlU3luY1BvaW50PC9hPiAoPGEgaHJlZj0iI3pfc3RyZWFtcCI+el9zdHJlYW1wPC9hPiB6KTs8L2ZvbnQ+CiA8Zm9udCBjb2xvcj0iQmx1ZSI+PGR0PiBjb25zdCB1TG9uZ2YgKiAgPGEgbmFtZT0iZ2V0X2NyY190YWJsZSI+Z2V0X2NyY190YWJsZTwvYT4gICAgKHZvaWQpOzwvZm9udD4KIDwvZGw+CiA8aHI+CiA8Zm9udCBzaXplPSItMSI+CiBMYXN0IHVwZGF0ZTogV2VkIE9jdCAxMyAyMDo0MjozNCAxOTk5PGJyPgogcGlhcGlAY3NpZS5udHUuZWR1LnR3CiA8L2ZvbnQ+Cgo8L2JvZHk+CjwvaHRtbD4K