MjAwNS0wNy0wNyAgUmVsZWFzZSBNYW5hZ2VyCgoJKiBHQ0MgNC4wLjEgcmVsZWFzZWQuCgoyMDA1LTA0LTIwICBSZWxlYXNlIE1hbmFnZXIKCgkqIEdDQyA0LjAuMCByZWxlYXNlZC4KCgogICAgICAgICAgICAgICAgQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWIKCkNoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpCi0gUmVtb3ZlIGEgdGFiIGluIGNvbnRyaWIvZ3phcHBlbmQvZ3phcHBlbmQuYwotIFVwZGF0ZSBzb21lIGludGVyZmFjZXMgaW4gY29udHJpYiBmb3IgbmV3IHpsaWIgZnVuY3Rpb25zCi0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMKLSBBZGQgV2luZG93cyBDRSBkZWZpbml0aW9uIGZvciBwdHJkaWZmX3QgaW4genV0aWwuaCBbTWFpLCBUcnV0YV0KLSBTdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gSHVyZCBhbmQgS0ZyZWVCU0QgW0Jyb3duXQotIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYwoKQ2hhbmdlcyBpbiAxLjIuMC44ICg0IE5vdmVtYmVyIDIwMDMpCi0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzCi0gQWRkIGV4cGVyaW1lbnRhbCBOT19ESVZJREUgI2RlZmluZSBpbiBhZGxlcjMyLmMKICAgIC0gUG9zc2libHkgZmFzdGVyIG9uIHNvbWUgcHJvY2Vzc29ycyAobGV0IG1lIGtub3cgaWYgaXQgaXMpCi0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXAKLSBGaXggc3RybS0+ZGF0YV90eXBlIG9uIGluZmxhdGUoKSByZXR1cm4gdG8gY29ycmVjdGx5IGluZGljYXRlIEVPQgotIEFkZCBkZWZsYXRlUHJpbWUoKSBmdW5jdGlvbiBmb3IgYXBwZW5kaW5nIGluIHRoZSBtaWRkbGUgb2YgYSBieXRlCi0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0KLSBEZWxldGUgVHVyYm8gQyBjb21tZW50IGluIFJFQURNRSBbVHJ1dGFdCi0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQotIEZpeCBpbmZpbml0ZSBsb29wIG9uIGJhZCBpbnB1dCBpbiBjb25maWd1cmUgc2NyaXB0IFtDaHVyY2hdCi0gRml4IGd6ZW9mKCkgZm9yIGNvbmNhdGVuYXRlZCBnemlwIGZpbGVzIFtKb2huc29uXQotIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0KLSBBZGQgLXAgdG8gbWtkaXIncyBpbiBNYWtlZmlsZS5pbiBbdmRhXQotIEZpeCBjb25maWd1cmUgdG8gcHJvcGVybHkgZGV0ZWN0IHByZXNlbmNlIG9yIGxhY2sgb2YgcHJpbnRmIGZ1bmN0aW9ucwotIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0KLSBBZGQgYSBsaXR0bGUgQ3lnd2luIHN1cHBvcnQgW1dpbHNvbl0KCkNoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpCi0gQ29ycmVjdCBzb21lIGRlYnVnIGZvcm1hdHMgaW4gY29udHJpYi9pbmZiYWNrOQotIENhc3QgYSB0eXBlIGluIGEgZGVidWcgc3RhdGVtZW50IGluIHRyZWVzLmMKLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQotIFVwZGF0ZSBjb250cmliL3VudGd6IHRvIDAuMiB3aXRoIHZhcmlvdXMgZml4ZXMgW1RydXRhXQotIEFkZCBidWlsZCBzdXBwb3J0IGZvciBBbWlnYSBbTmlrbF0KLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjIKLSBBZGQgZHlsaWIgYnVpbGRpbmcgZm9yIE1hYyBPUyBYIGluIGNvbmZpZ3VyZSBhbmQgTWFrZWZpbGUuaW4KLSBSZW1vdmUgb2xkIGRpc3RyaWJ1dGlvbiBzdHVmZiBmcm9tIE1ha2VmaWxlCi0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYCi0gVXBkYXRlIGxpbmtzIGluIFJFQURNRQoKQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykKLSBNaW5vciBGQVEgdXBkYXRlcwotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4wMCBbVm9sbGFudF0KLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdCi0gVXBkYXRlIFBPU1RJTkMgY29tbWVudCBmb3IgNjgwNjAgW05pa2xdCi0gQWRkIGNvbnRyaWIvaW5mYmFjazkgd2l0aCBkZWZsYXRlNjQgZGVjb2RpbmcgKHVuc3VwcG9ydGVkKQotIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdCi0gQWRkIHByYWdtYSBmb3IgZmRvcGVuIG9uIE1WUyBbdmFuIEJ1cmlrXQoKQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQotIEFkZCBPRiB0byBpbmZsYXRlQmFja0VuZCgpIGRlY2xhcmF0aW9uIGluIHpsaWIuaAotIFJlbWVtYmVyIHN0YXJ0IHdoZW4gdXNpbmcgZ3pkb3BlbiBpbiB0aGUgbWlkZGxlIG9mIGEgZmlsZQotIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcwotIFBlcmZvcm0gbW9yZSByaWdvcm91cyBjaGVjayBmb3IgZGlzdGFuY2UtdG9vLWZhciBpbiBpbmZmYXN0LmMKLSBBZGQgWl9CTE9DSyBmbHVzaCBvcHRpb24gdG8gcmV0dXJuIGZyb20gaW5mbGF0ZSBhdCBibG9jayBib3VuZGFyeQotIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQogICAgLSBJbmRpY2F0ZSBiaXRzIHVudXNlZCwgaWYgYXQgYmxvY2sgYm91bmRhcnksIGFuZCBpZiBpbiBsYXN0IGJsb2NrCi0gUmVwbGFjZSBzaXplX3Qgd2l0aCBwdHJkaWZmX3QgaW4gY3JjMzIuYywgYW5kIGNoZWNrIGZvciBjb3JyZWN0IHNpemUKLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQotIEZBUSB1cGRhdGUgcmVnYXJkaW5nIHRoZSBXaW5kb3dzIERMTCBbVHJ1dGFdCi0gSU5ERVggdXBkYXRlOiBhZGQgcW54IGVudHJ5LCByZW1vdmUgYWl4IGVudHJ5IFtUcnV0YV0KLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQotIE1vdmUgY29udHJpYi96bGliX2RsbF9GQVEudHh0IHRvIHdpbjMyL0RMTF9GQVEudHh0OyB1cGRhdGUgW1RydXRhXQotIEFkYXB0IHRoZSB6bGliIGludGVyZmFjZSB0byB0aGUgbmV3IERMTCBjb252ZW50aW9uIGd1aWRlbGluZXMgW1RydXRhXQotIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZwogIHRoZSBXSU5BUEkgY2FsbGluZyBjb252ZW50aW9uLCBmb3IgVmlzdWFsIEJhc2ljIFtWb2xsYW50LCBUcnV0YV0KLSBVcGRhdGUgbXNkb3MgYW5kIHdpbjMyIHNjcmlwdHMgYW5kIG1ha2VmaWxlcyBbVHJ1dGFdCi0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0KLSBBZGQgY29udHJpYi9hZGEgW0FuaXNpbWtvdl0KLSBNb3ZlIGFzbSBmaWxlcyBmcm9tIGNvbnRyaWIvdnN0dWRpby92YzcwXzMyIHRvIGNvbnRyaWIvYXNtMzg2IFtUcnV0YV0KLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0KLSBBZGQgY29udHJpYi9tYXNtNjg2IFtUcnV0YV0KLSBGaXggb2Zmc2V0cyBpbiBjb250cmliL2luZmxhdGU4NiBhbmQgY29udHJpYi9tYXNteDg2L2luZmZhczMyLmFzbQogIFtUcnV0YSwgVm9sbGFudF0KLSBVcGRhdGUgY29udHJpYi9kZWxwaGk7IHJlbmFtZSB0byBjb250cmliL3Bhc2NhbDsgYWRkIGV4YW1wbGUgW1RydXRhXQotIFJlbW92ZSBjb250cmliL2RlbHBoaTI7IGFkZCBhIG5ldyBjb250cmliL2RlbHBoaSBbVHJ1dGFdCi0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sCiAgYW5kIGZpeCBzb21lIG1ldGhvZCBwcm90b3R5cGVzIFtUcnV0YV0KLSBGaXggdGhlIFpDUl9TRUVEMiBjb25zdGFudCB0byBhdm9pZCB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAKICBbVHJ1dGFdCi0gQXZvaWQgdGhlIHVzZSBvZiBiYWNrc2xhc2ggKFwpIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0KLSBGaXggZmlsZSB0aW1lIGhhbmRsaW5nIGluIGNvbnRyaWIvdW50Z3o7IHVwZGF0ZSBtYWtlZmlsZXMgW1RydXRhXQotIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzCiAgW1ZvbGxhbnRdCi0gUmVtb3ZlIGNvbnRyaWIvdnN0dWRpby92YzE1XzE2IFtWb2xsYW50XQotIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0KLSBVcGRhdGUgUkVBRE1FLmNvbnRyaWIgW1RydXRhXQotIEludmVydCB0aGUgYXNzaWdubWVudCBvcmRlciBvZiBtYXRjaF9oZWFkIGFuZCBzLT5wcmV2Wy4uLl0gaW4KICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0KLSBDb21wYXJlIFRPT19GQVIgd2l0aCAzMjc2NyBpbnN0ZWFkIG9mIDMyNzY4LCB0byBhdm9pZCAxNi1iaXQgd2FybmluZ3MKICBbVHJ1dGFdCi0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0KLSBGaXggcHJvdG90eXBlIG9mIHN5bmNzZWFyY2ggaW4gaW5mbGF0ZS5jIFtUcnV0YV0KLSBJbnRyb2R1Y2UgQVNNSU5GIG1hY3JvIHRvIGJlIGVuYWJsZWQgd2hlbiB1c2luZyBhbiBBU00gaW1wbGVtZW50YXRpb24KICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQotIENoYW5nZSBOT19ERUZMQVRFIHRvIE5PX0daQ09NUFJFU1MgW1RydXRhXQotIE1vZGlmeSB0ZXN0X2d6aW8gaW4gZXhhbXBsZS5jIHRvIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFzIGEKICBwYXJhbWV0ZXIgW1RydXRhXQotIEV4aXQgdGhlIGV4YW1wbGUuYyBwcm9ncmFtIGlmIGd6b3BlbiBmYWlscyBbVHJ1dGFdCi0gQWRkIHR5cGUgY2FzdHMgYXJvdW5kIHN0cmxlbiBpbiBleGFtcGxlLmMgW1RydXRhXQotIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUKICB0byB0aGUgdmFyaWFibGUgY29tcGFyZWQgd2l0aCBTVUZGSVhfTEVOIFtUcnV0YV0KLSBVcGRhdGUgZGVmaW5pdGlvbnMgb2YgU1REQyBhbmQgU1REQzk5IGluIHpjb25mLmggW1RydXRhXQotIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdCi0gVXNlIFNZUzE2QklUIGluc3RlYWQgb2YgX18zMkJJVF9fIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KICAxNi0gYW5kIDMyLWJpdCBwbGF0Zm9ybXMgW1RydXRhXQotIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yCiAgVHVyYm8gQyBbVHJ1dGFdCi0gQWRkIGluZm8gYWJvdXQgdGhlIHVzZSBvZiBBU01WLCBBU01JTkYgYW5kIFpMSUJfV0lOQVBJIGluCiAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdCi0gQ3lnd2luIGhhcyB2c25wcmludGYgW1dpbHNvbl0KLSBJbiBXaW5kb3dzMTYsIE9TX0NPREUgaXMgMCwgYXMgaW4gTVNET1MgW1RydXRhXQotIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dCgpDaGFuZ2VzIGluIDEuMi4wLjQgKDEwIEF1Z3VzdCAyMDAzKQotIE1pbm9yIEZBUSB1cGRhdGVzCi0gQmUgbW9yZSBzdHJpY3Qgd2hlbiBjaGVja2luZyBpbmZsYXRlSW5pdDIncyB3aW5kb3dCaXRzIHBhcmFtZXRlcgotIENoYW5nZSBOT19HVU5aSVAgY29tcGlsZSBvcHRpb24gdG8gTk9fR1pJUCB0byBjb3ZlciBkZWZsYXRlIGFzIHdlbGwKLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cwotIEFkZCB1cGRhdGVkIFFOWCBydWxlIGluIGNvbmZpZ3VyZSBhbmQgcW54IGRpcmVjdG9yeSBbQm9ubmVmb3ldCi0gTWFrZSBpbmZsYXRlIGRpc3RhbmNlLXRvby1mYXIgY2hlY2tzIG1vcmUgcmlnb3JvdXMKLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQotIEFkZCBjYXN0aW5nIHRvIHNpemVvZigpIGluIGd6aW8uYyBhbmQgbWluaWd6aXAuYwoKQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpCi0gRml4IHNpbGx5IGVycm9yIGluIGd6dW5nZXRjKCkgaW1wbGVtZW50YXRpb24gW1ZvbGxhbnRdCi0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBhbmQgY29udHJpYi92c3R1ZGlvIFtWb2xsYW50XQotIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYwotIENvcnJlY3QgY2RlY2wgc3VwcG9ydCBpbiB6Y29uZi5pbi5oIFtBbmlzaW1rb3ZdCi0gTWlub3IgRkFRIHVwZGF0ZXMKCkNoYW5nZXMgaW4gMS4yLjAuMiAoMTMgSnVseSAyMDAzKQotIEFkZCBaTElCX1ZFUk5VTSBpbiB6bGliLmggZm9yIG51bWVyaWNhbCBwcmVwcm9jZXNzb3IgY29tcGFyaXNvbnMKLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24KLSBBZGQgQUlYIHRvIGNvbmZpZ3VyZSwgcmVtb3ZlIGFpeCBkaXJlY3RvcnkgW0Jha2tlcl0KLSBBZGQgc29tZSBjYXN0cyB0byBtaW5pZ3ppcC5jCi0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscwotIFJlbW92ZSAjZWxpZidzIGZyb20gY3JjMzIuYwotIENoYW5nZSBsZWF2ZSBsYWJlbCB0byBpbmZfbGVhdmUgaW4gaW5mbGF0ZS5jIGFuZCBpbmZiYWNrLmMgdG8gYXZvaWQKICBsaWJyYXJ5IGNvbmZsaWN0cwotIFJlbW92ZSBpbmZsYXRlIGd6aXAgZGVjb2RpbmcgYnkgZGVmYXVsdC0tb25seSBlbmFibGUgZ3ppcCBkZWNvZGluZyBieQogIHNwZWNpYWwgcmVxdWVzdCBmb3Igc3RyaWN0ZXIgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uCi0gTW9yZSB0eXBlY2FzdGluZyBpbiBkZWZsYXRlLmMgdG8gYXZvaWQgd2FybmluZ3MKLSBSZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gX0NhcGl0YWwgI2RlZmluZXMgW1RydXRhXQotIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcKLSBBZGQgc29tZSBXaW5kb3dzIENFIHRhcmdldCBhZGp1c3RtZW50cyBbTWFpXQotIFJlbW92ZSAjZGVmaW5lIFpMSUJfRExMIGluIHpjb25mLmggW1ZvbGxhbnRdCi0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10KLSBVcGRhdGUgUkZDIFVSTCBpbiBkZWZsYXRlLmMgYW5kIGFsZ29yaXRobS50eHQgW01haV0KLSBBZGQgemxpYl9kbGxfRkFRLnR4dCB0byBjb250cmliIFtUcnV0YV0KLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQotIFVwZGF0ZSBtaW5pemlwIGFuZCB2c3R1ZGlvIFtWb2xsYW50XQotIFJlbW92ZSB2ZXN0aWdpYWwgTkVFRF9EVU1NWV9SRVRVUk4gZnJvbSB6Y29uZi5pbi5oCi0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzCi0gQWRkZWQgaW9zdHJlYW0zIHRvIGNvbnRyaWIgW1NjaHdhcmR0XQotIFJlcGxhY2UgcmV3aW5kKCkgd2l0aCBmc2VlaygpIGZvciBXaW5DRSBbVHJ1dGFdCi0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzCiAgICAtIFJlcG9ydCAwIGZvciBodWZmbWFuIGFuZCBybGUgc3RyYXRlZ2llcyBhbmQgZm9yIGxldmVsID09IDAgb3IgMQogICAgLSBSZXBvcnQgMiBvbmx5IGZvciBsZXZlbCA9PSA2Ci0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWxsb3cgVE9PX0ZBUiBjaGVjayB0byBiZSB0dXJuZWQgb2ZmIGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdCi0gQWRkIGd6Y2xlYXJlcnIoKSBmdW5jdGlvbiBbU291emFdCi0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24KCkNoYW5nZXMgaW4gMS4yLjAuMSAoMTcgTWFyY2ggMjAwMykKLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQogICAgLSBXaGVuIFpfUkxFIHJlcXVlc3RlZCwgcmVzdHJpY3QgbWF0Y2hlcyB0byBkaXN0YW5jZSBvbmUKICAgIC0gVXBkYXRlIHpsaWIuaCwgbWluaWd6aXAuYywgZ3pvcGVuKCksIGd6ZG9wZW4oKSBmb3IgWl9STEUKLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMAotIENsZWFuIHVwIHdoYXQgZ2V0cyBjb21waWxlZCBmb3IgRkFTVEVTVAotIEluY29ycG9yYXRlIGNoYW5nZXMgdG8gemNvbmYuaW4uaCBbVm9sbGFudF0KICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMKICAgIC0gUmVmaW5lIFpMSUJfRExMIGNvbXBpbGF0aW9uCiAgICAtIEluY2x1ZGUgYWRkaXRpb25hbCBoZWFkZXIgZmlsZSBvbiBWTVMgZm9yIG9mZl90IHR5cGVkZWYKLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQotIEFkZCBzb21lIGNhc3RzIGluIGluZmZhc3QuYwotIEVuY2hhbmNlIGNvbW1lbnRzIGluIHpsaWIuaCBvbiB3aGF0IGhhcHBlbnMgaWYgZ3pwcmludGYoKSB0cmllcyB0bwogIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbgotIFJlbW92ZSB1bnVzZWQgc3RhdGUgZnJvbSBpbmZsYXRlQmFja0VuZCgpCi0gUmVtb3ZlIGV4aXQoMCkgZnJvbSBtaW5pZ3ppcC5jLCBleGFtcGxlLmMKLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMKLSBBZGQgImNoZWNrIiB0YXJnZXQgdG8gTWFrZWZpbGUuaW4gdGhhdCBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJ0ZXN0IgotIEFkZCAibW9zdGx5Y2xlYW4iIGFuZCAibWFpbnRhaW5lci1jbGVhbiIgdGFyZ2V0cyB0byBNYWtlZmlsZS5pbgotIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dCi0gVXBkYXRlIGNvbnRyaWIvdGVzdHpsaWIsIGNvbnRyaWIvdnN0dWRpbywgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQotIEFkZCBtc2RvcyBhbmQgd2luMzIgZGlyZWN0b3JpZXMgd2l0aCBtYWtlZmlsZXMgW1RydXRhXQotIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQoKQ2hhbmdlcyBpbiAxLjIuMCAoOSBNYXJjaCAyMDAzKQotIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlCiAgICAtIEFib3V0IDIwJSBmYXN0ZXIKICAgIC0gRG9lcyBub3QgYWxsb2NhdGUgMzJLIHdpbmRvdyB1bmxlc3MgYW5kIHVudGlsIG5lZWRlZAogICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMKICAgIC0gUmF3IGluZmxhdGUgbm8gbG9uZ2VyIG5lZWRzIGFuIGV4dHJhIGR1bW15IGJ5dGUgYXQgZW5kCiAgICAtIEFkZGVkIGluZmxhdGVCYWNrIGZ1bmN0aW9ucyB1c2luZyBhIGNhbGxiYWNrIGludGVyZmFjZS0tZXZlbiBmYXN0ZXIKICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApCiAgICAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24gdG8gcmVjb3JkIHN0YXRlIGZvciByYW5kb20gYWNjZXNzIG9uCiAgICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGRlZmxhdGUgc3RyZWFtcyAoZS5nLiBpbiBnemlwIGZpbGVzKQogICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkKLSBOZXcgYW5kIGltcHJvdmVkIGNyYzMyKCkKICAgIC0gQWJvdXQgNTAlIGZhc3RlciwgdGhhbmtzIHRvIHN1Z2dlc3Rpb25zIGZyb20gUm9kbmV5IEJyb3duCi0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zCi0gRml4IG1lbW9yeSBsZWFrIGluIGRlZmxhdGVJbml0MigpCi0gUGVybWl0IHNldHRpbmcgZGljdGlvbmFyeSBmb3IgcmF3IGRlZmxhdGUgKGZvciBwYXJhbGxlbCBkZWZsYXRlKQotIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpCi0gQ2hlY2sgZm9yIHNvbWUgbWFsbG9jKCkgZmFpbHVyZXMgaW4gZ3ppby5jCi0gRml4IGJ1ZyBpbiBnem9wZW4oKSBvbiBzaW5nbGUtYnl0ZSBmaWxlIDB4MWYKLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyCiAgYW5kIG5leHQgYnVmZmVyIGRvZXNuJ3Qgc3RhcnQgd2l0aCAweDhiCi0gRml4IHVuY29tcHJlc3MoKSB0byByZXR1cm4gWl9EQVRBX0VSUk9SIG9uIHRydW5jYXRlZCBpbnB1dAotIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMKLSBSZW1vdmUgTUFYICNkZWZpbmUgaW4gdHJlZXMuYyAoY29uZmxpY3RlZCB3aXRoIHNvbWUgbGlicmFyaWVzKQotIEZpeCBzdGF0aWMgY29uc3QncyBpbiBkZWZsYXRlLmMsIGd6aW8uYywgYW5kIHp1dGlsLltjaF0KLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQKLSBVc2UgbWFsbG9jKCkgaW5zdGVhZCBvZiBjYWxsb2MoKSBpbiB6dXRpbC5jIGlmIGludCBiaWcgZW5vdWdoCi0gRGVmaW5lIFNUREMgZm9yIEFJWAotIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgKLSBBZGQgSFAtVVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBBZGQgT3BlblVOSVggc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBpbiBjb25maWd1cmUKLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5Ci0gTWFrZSBwcmVmaXggZGlyZWN0b3J5IGlmIG5lZWRlZCB3aGVuIGluc3RhbGxpbmcKLSBDb3JyZWN0IE1hY2ludG9zaCBhdm9pZGFuY2Ugb2YgdHlwZWRlZiBCeXRlIGluIHpjb25mLmgKLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eAotIFVzZSBsaWJ6LmEgaW5zdGVhZCBvZiAtbHogaW4gTWFrZWZpbGUgKGFzc3VyZSB1c2Ugb2YgY29tcGlsZWQgbGlicmFyeSkKLSBVcGRhdGUgY29uZmlndXJlIHRvIGNoZWNrIGZvciBzbnByaW50ZiBvciB2c25wcmludGYgZnVuY3Rpb25zIGFuZCB0aGVpcgogIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbgotIEZpeCBjb25maWd1cmUgcHJvYmxlbSB3aXRoIGNvbXBpbGUtdGltZSBrbm93bGVkZ2Ugb2YgSEFWRV9VTklTVERfSCB0aGF0CiAgaXMgbG9zdCB3aGVuIGxpYnJhcnkgaXMgdXNlZC0tcmVzb2x1dGlvbiBpcyB0byBidWlsZCBuZXcgemNvbmYuaAotIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOgogICAgLSBEb2N1bWVudCByYXcgZGVmbGF0ZSBhbmQgaW5mbGF0ZQogICAgLSBVcGRhdGUgUkZDcyBVUkwKICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQKICAgIC0gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbAogICAgLSBEb2N1bWVudCBzdHJpbmcgbGltaXQgZm9yIGd6cHJpbnRmKCkgYW5kIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdwogICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nCiAgICAtIE5vdGUgcGVybWl0dGVkIHZhbHVlcyBvZiBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpCi0gQWRkIHNvbWUgRkFRcyAoYW5kIGV2ZW4gYW5zd2VycykgdG8gdGhlIEZBUQotIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQotIEFkZCBjb250cmliL2JsYXN0LyBmb3IgUEtXYXJlIERhdGEgQ29tcHJlc3Npb24gTGlicmFyeSBkZWNvbXByZXNzaW9uCi0gQWRkIGNvbnRyaWIvcHVmZi8gc2ltcGxlIGluZmxhdGUgZm9yIGRlZmxhdGUgZm9ybWF0IGRlc2NyaXB0aW9uCgpDaGFuZ2VzIGluIDEuMS40ICgxMSBNYXJjaCAyMDAyKQotIFpGUkVFIHdhcyByZXBlYXRlZCBvbiBzYW1lIGFsbG9jYXRpb24gb24gc29tZSBlcnJvciBjb25kaXRpb25zLgogIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluCiAgaHR0cDovL3d3dy56bGliLm9yZy9hZHZpc29yeS0yMDAyLTAzLTExLnR4dAotIFJldHVybmVkIGluY29ycmVjdCBlcnJvciAoWl9NRU1fRVJST1IpIG9uIHNvbWUgaW52YWxpZCBkYXRhCi0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdwogIGxlc3MgdGhhbiAzMksuCi0gZm9yY2Ugd2luZG93Qml0cyA+IDggdG8gYXZvaWQgYSBidWcgaW4gdGhlIGVuY29kZXIgZm9yIGEgd2luZG93IHNpemUKICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuCgpDaGFuZ2VzIGluIDEuMS4zICg5IEp1bHkgMTk5OCkKLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQKICBvY2Nhc2lvbnMiIChNYXJrKQotIGZpeCBnenJlYWQgYW5kIGd6dGVsbCBmb3IgY29uY2F0ZW5hdGVkIC5neiBmaWxlcyAoRGlkaWVyIExlIEJvdGxhbikKLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUKLSBmaXggY3JjIGNoZWNrIGFmdGVyIGEgZ3plZWsgKEZyYW5rIEZhdWJlcnQpCi0gZml4IG1pbml1bnppcCB3aGVuIHRoZSBsYXN0IGVudHJ5IGluIGEgemlwIGZpbGUgaXMgaXRzZWxmIGEgemlwIGZpbGUKICAoSiBMaWxsZ2UpCi0gYWRkIGNvbnRyaWIvYXNtNTg2IGFuZCBjb250cmliL2FzbTY4NiAoQnJpYW4gUmFpdGVyKQogIFNlZSBodHRwOi8vd3d3Lm11cHBldGxhYnMuY29tL35icmVhZGJveC9zb2Z0d2FyZS9hc3NlbWJseS5odG1sCi0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkKLSBhZGQgc3VwcG9ydCBmb3IgQysrQnVpbGRlciAzIGFuZCBEZWxwaGkgMyBpbiBjb250cmliL2RlbHBoaTIgKERhdmlkZSBNb3JldHRpKQotIGRvIG5vdCBleGl0IHByZW1hdHVyZWx5IGluIHVudGd6IGlmIDAgYXQgc3RhcnQgb2YgYmxvY2sgKE1hZ251cyBIb2xtZ3JlbikKLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpCi0gYWRkZWQgYSBGQVEgZmlsZQoKLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkKLSBEbyBub3QgcmVkZWZpbmUgQnl0ZSBvbiBNYWMgKEJyYWQgUGV0dGl0ICYgSmFzb24gTGluaGFydCkKLSBkZWZpbmUgU0VFS19FTkQgdG9vIGlmIFNFRUtfU0VUIGlzIG5vdCBkZWZpbmVkIChBbGJlcnQgQ2hpbi1BLVlvdW5nKQotIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpCi0gZml4IGEgcHJvYmxlbSBpbiBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDE2LWJpdCBNU0RPUyAoR2lsbGVzIFZvbGxhbnQpCi0gZW11bGF0ZSB1dGltZSgpIGZvciBXSU4zMiBpbiBjb250cmliL3VudGd6ICAoR2lsbGVzIFZvbGxhbnQpCi0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpCi0gdXNlIGxpYmRpciBhbmQgaW5jbHVkZWRpciBpbiBNYWtlZmlsZS5pbiAoVGltIE1vb25leSkKLSBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMgb24gT1NGMSBWNCAoVGltIE1vb25leSkKLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpCi0gZml4IG1ha2V0cmVlLmMgY29tcGlsYXRpb24gZXJyb3IgKEdsZW5uLCBNYXJrKQotIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiBub3cgaW4gUHl0aG9uIDEuNSAoSmVyZW15IEh5bHRvbikKLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikKLSBpbml0aWFsaXplIHN0YXRpYyBkZXNjcmlwdG9ycyBpbiB0cmVlcy5jIGZvciBlbWJlZGRlZCB0YXJnZXRzIChOaWNrIFNtaXRoKQotIHVzZSAiZm9vLWd6IiBpbiBleGFtcGxlLmMgZm9yIFJJU0NPUyBhbmQgVk1TIChOaWNrIFNtaXRoKQotIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpCi0gZml4IGZkb3BlbiBhbmQgaGFsbG9jIG1hY3JvcyBmb3IgTWljcm9zb2Z0IEMgNi4wIChUb20gTGFuZSkKLSBmaXggbWFrZXRyZWUuYyB0byBhbGxvdyBjbGVhbiBjb21waWxhdGlvbiBvZiBpbmZmaXhlZC5oIChNYXJrKQotIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkKLSBjbGVhbnVwIHRyZWVzLmMsIHVzZSBjb21wcmVzc2VkX2xlbiBvbmx5IGluIGRlYnVnIG1vZGUgKENocmlzdGlhbiBTcGllbGVyKQotIE1hbnkgcG9ydGFiaWxpdHkgcGF0Y2hlcyBieSBDaHJpc3RpYW4gU3BpZWxlcjoKICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qCiAgLiBNYWtlX3Ztcy5jb206IGZpeGVkIHNvbWUgdHlwb3MKICAuIE1ha2Vfdm1zLmNvbTogbXNkb3MvTWFrZWZpbGUuKjogcmVtb3ZlZCB6dXRpbC5oIGZyb20gc29tZSBkZXBlbmRlbmN5IGxpc3RzCiAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzCiAgLiBtc2Rvcy9NYWtlZmlsZS4qOiB1c2UgbW9kZWwtZGVwZW5kZW50IG5hbWUgZm9yIHRoZSBidWlsdCB6bGliIGxpYnJhcnkKICAuIG1zZG9zL01ha2VmaWxlLmVteCwgbnQvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5nY2M6CiAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQotIHVzZSBkZWZpbmUgaW5zdGVhZCBvZiB0eXBlZGVmIGZvciBCeXRlZiBhbHNvIGZvciBNU0Mgc21hbGwvbWVkaXVtIChUb20gTGFuZSkKLSByZXBsYWNlIF9fZmFyIHdpdGggX2ZhciBmb3IgYmV0dGVyIHBvcnRhYmlsaXR5IChDaHJpc3RpYW4gU3BpZWxlciwgVG9tIExhbmUpCi0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkKCkNoYW5nZXMgaW4gMS4xLjIgKDE5IE1hcmNoIDk4KQotIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpCiAgU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwvdW56aXAuaHRtbAotIHByZWluaXRpYWxpemUgdGhlIGluZmxhdGUgdGFibGVzIGZvciBmaXhlZCBjb2RlcywgdG8gbWFrZSB0aGUgY29kZQogIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspCi0gc29tZSBzaW1wbGlmaWNhdGlvbnMgYW5kIHNsaWdodCBzcGVlZC11cCB0byB0aGUgaW5mbGF0ZSBjb2RlIChNYXJrKQotIGZpeCBnemVvZiBvbiBub24tY29tcHJlc3NlZCBmaWxlcyAoQWxsYW4gU2NocnVtKQotIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpCi0gdXNlIGRlZmF1bHQgdmFsdWUgb2YgNEsgZm9yIFpfQlVGU0laRSBmb3IgMTYtYml0IE1TRE9TIChUaW0gV2VnbmVyICsgR2xlbm4pCi0gYWRkZWQgb3MyL01ha2VmaWxlLmRlZiBhbmQgb3MyL3psaWIuZGVmIChBbmRyZXcgWmFib2xvdG55KQotIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpCi0gZG8gbm90IHdyYXAgZXh0ZXJuICJDIiBhcm91bmQgc3lzdGVtIGluY2x1ZGVzIChUb20gTGFuZSkKLSBtZW50aW9uIHpsaWIgYmluZGluZyBmb3IgVENMIGluIFJFQURNRSAoQW5kcmVhcyBLdXByaWVzKQotIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpCi0gYWxsb3cgIm1ha2UgaW5zdGFsbCBwcmVmaXg9Li4uIiBldmVuIGFmdGVyIGNvbmZpZ3VyZSAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIGFsbG93ICJjb25maWd1cmUgLS1wcmVmaXggJEhPTUUiIChUaW0gTW9vbmV5KQotIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIG1vdmUgTWFrZWZpbGUuc2FzIHRvIGFtaWdhL01ha2VmaWxlLnNhcwoKQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQotIGZpeCBtYWNyb3MgX3RyX3RhbGx5XyogaW4gZGVmbGF0ZS5oIGZvciBkZWJ1ZyBtb2RlICAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIHJlbW92ZSBibG9jayB0cnVuY2F0aW9uIGhldXJpc3RpYyB3aGljaCBoYWQgdmVyeSBtYXJnaW5hbCBlZmZlY3QgZm9yIHpsaWIKICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUKICBjb21wcmVzc2lvbiByYXRpbyBvbiBzb21lIGZpbGVzLiBUaGlzIGFsc28gYWxsb3dzIGlubGluaW5nIF90cl90YWxseSBmb3IKICBtYXRjaGVzIGluIGRlZmxhdGVfc2xvdy4KLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikKCkNoYW5nZXMgaW4gMS4xLjAgKDI0IEZlYiA5OCkKLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpCi0gcmV2ZXJ0IHRvIHRoZSB6bGliIDEuMC44IGluZmxhdGUgdG8gYXZvaWQgdGhlIGdjYyAyLjguMCBidWcgKEplcmVteSBCdWhsZXIpCi0gY29tcGlsZSB3aXRoIC1ERkFTVEVTVCB0byBnZXQgY29tcHJlc3Npb24gY29kZSBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9ubHkKLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpCi0gaW5jcmVhc2Ugc2l6ZSBvZiBJL08gYnVmZmVycyBpbiBtaW5pZ3ppcC5jIGFuZCBnemlvLmMgKG5vdCBhIGJpZyBnYWluCiAgb24gU3VuIGJ1dCBzaWduaWZpY2FudCBvbiBIUCkKCi0gYWRkIGEgcG9pbnRlciB0byBleHBlcmltZW50YWwgdW56aXAgbGlicmFyeSBpbiBSRUFETUUgKEdpbGxlcyBWb2xsYW50KQotIGluaXRpYWxpemUgdmFyaWFibGUgZ2NjIGluIGNvbmZpZ3VyZSAoQ2hyaXMgSGVyYm9ydGgpCgpDaGFuZ2VzIGluIDEuMC45ICgxNyBGZWIgMTk5OCkKLSBhZGRlZCBnenB1dHMgYW5kIGd6Z2V0cyBmdW5jdGlvbnMKLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQotIGZpeCBnenNlZWsgZm9yIGZpbGVzIGluIHRyYW5zcGFyZW50IG1vZGUgKE1hcmsgRGlla2hhbnMpCi0gZG8gbm90IGFzc3VtZSB0aGF0IHZzcHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChKZW5zIEtyaW5rZSkKLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcwotIGFkZGVkIGNvbXByZXNzMiBpbiB6Y29uZi5oLCB6bGliLmRlZiwgemxpYi5kbnQKLSBuZXcgYXNtIGNvZGUgZnJvbSBHaWxsZXMgVm9sbGFudCBpbiBjb250cmliL2FzbTM4NgotIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOgogLiBSZXBsYWNlIFpBTExPQydzIGluIGh1ZnRfYnVpbGQoKSB3aXRoIHNpbmdsZSBaQUxMT0MgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3KCkKIC4gWkFMTE9DIHRoZSBsZW5ndGggbGlzdCBpbiBpbmZsYXRlX3RyZWVzX2ZpeGVkKCkgaW5zdGVhZCBvZiB1c2luZyBzdGFjawogLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrCiAuIFNpbXBsaWZ5IFpfRklOSVNIIGNoZWNrIGluIGluZmxhdGUoKQoKLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44Ci0gaW4gaW5mdHJlZXMuYywgYXZvaWQgY2MgLU8gYnVnIG9uIEhQIChGYXJzaGlkIEVsYWhpKQotIGluIHpjb25mLmggbW92ZSB0aGUgWkxJQl9ETEwgc3R1ZmYgZWFybGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpCi0gaW5zdGFsbCBsaWJ6LnNvKiB3aXRoIG1vZGUgNzU1IChleGVjdXRhYmxlKSBpbnN0ZWFkIG9mIDY0NCAoTWFyYyBMZWhtYW5uKQotIHJlYWRfYnVmIGJ1ZiBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlZiogaW5zdGVhZCBvZiBjaGFyZioKLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQotIGRvIG5vdCByZWRlY2xhcmUgdW5saW5rIGluIG1pbmlnemlwLmMgZm9yIFdJTjMyIChKb2huIEJvd2xlcikKLSBmaXggY2hlY2sgZm9yIHByZXNlbmNlIG9mIGRpcmVjdG9yaWVzIGluICJtYWtlIGluc3RhbGwiIChJYW4gV2lsbGlzKQoKQ2hhbmdlcyBpbiAxLjAuOCAoMjcgSmFuIDE5OTgpCi0gZml4ZWQgb2Zmc2V0cyBpbiBjb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbSAoR2lsbGVzIFZvbGxhbnQpCi0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpCi0gYWRkZWQgY29tcHJlc3MyKCkgdG8gYWxsb3cgc2V0dGluZyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKLSBpbmNsdWRlIHN5cy90eXBlcy5oIHRvIGdldCBvZmZfdCBvbiBzb21lIHN5c3RlbXMgKE1hcmMgTGVobWFubiAmIFFpbmdMb25nKQotIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZwogIHRoZW0gYXQgcnVuIHRpbWUgKHRoYW5rcyB0byBLZW4gUmFlYnVybiBmb3IgdGhpcyBzdWdnZXN0aW9uKS4gVG8gY3JlYXRlCiAgdHJlZXMuaCwgY29tcGlsZSB3aXRoIEdFTl9UUkVFU19IIGFuZCBydW4gIm1ha2UgdGVzdCIuCi0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQKLSBwYXNzIG1pbmlnemlwIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGZpbGVfY29tcHJlc3MKLSBzaW1wbGlmeWluZyBjb2RlIG9mIGluZmxhdGVTeW5jIHRvIGF2b2lkIGdjYyAyLjggYnVnCgotIHN1cHBvcnQgQ0M9ImdjYyAtV2FsbCIgaW4gY29uZmlndXJlIC1zIChRaW5nTG9uZykKLSBhdm9pZCBhIGZsdXNoIGNhdXNlZCBieSBmdGVsbCBpbiBnem9wZW4gZm9yIHdyaXRlIG1vZGUgKEtlbiBSYWVidXJuKQotIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCi0gemxpYi5saWIgLT4gemxpYi5kbGwgaW4gbXNkb3MvemxpYi5yYyAoR2lsbGVzIFZvbGxhbnQpCi0gY2hlY2sgZm9yIFRBUkdFVF9PU19NQUMgaW4gYWRkaXRpb24gdG8gTUFDT1MgKEJyYWQgUGV0dGl0KQotIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQotIGFkZCBjaGVja3MgZm9yIGd6cHV0YyBhbmQgZ3pwdXRjIGluIGV4YW1wbGUuYwotIGF2b2lkIHdhcm5pbmdzIGluIGd6aW8uYyBhbmQgZGVmbGF0ZS5jIChBbmRyZWFzIEtsZWluZXJ0KQotIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pCi0gZml4ZWQgIm1ha2UgdW5pbnN0YWxsIiBmb3Igc2hhcmVkIGxpYnJhcmllcwotIHVzZSBUcmFjZXYgaW5zdGVhZCBvZiBUcmFjZSBpbiBpbmZibG9jay5jCi0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMKLSBzdXBwcmVzcyArdm5vY29tcGF0d2FybmluZ3MgaW4gY29uZmlndXJlIGZvciBIUFVYIChub3QgYWx3YXlzIHN1cHBvcnRlZCkKCkNoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQotIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCi0gcmV0dXJuIGVycm9yIGZvciBnenNlZWsgdG8gbmVnYXRpdmUgYWJzb2x1dGUgcG9zaXRpb24KLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQotIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCi0gZ2V0X2NyY190YWJsZSBhbmQgaW5mbGF0ZVN5bmNQb2ludCBhcmUgRVhQT1JUZWQgKEdpbGxlcyBWb2xsYW50KQotIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQotIGFkZGVkIG1hbiBwYWdlIHpsaWIuMyAoUmljayBSb2RnZXJzKQotIGZvciBjb250cmliL3VudGd6LCBmaXggbWFrZWRpcigpIGFuZCBpbXByb3ZlIE1ha2VmaWxlCgotIGNoZWNrIGd6c2VlayBpbiB3cml0ZSBtb2RlIGluIGV4YW1wbGUuYwotIGFsbG9jYXRlIGV4dHJhIGJ1ZmZlciBmb3Igc2Vla3Mgb25seSBpZiBnenNlZWsgaXMgYWN0dWFsbHkgY2FsbGVkCi0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKLSBhZGQgaW5mbGF0ZVN5bmNQb2ludCBpbiB6Y29uZi5oCi0gZml4IGxpc3Qgb2YgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIG50L3psaWIuZG50IGFuZCBtZHNvcy96bGliLmRlZgoKQ2hhbmdlcyBpbiAxLjAuNiAoMTkgSmFuIDE5OTgpCi0gYWRkIGZ1bmN0aW9ucyBnenByaW50ZiwgZ3pwdXRjLCBnemdldGMsIGd6dGVsbCwgZ3plb2YsIGd6c2VlaywgZ3pyZXdpbmQgYW5kCiAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKLSBGaXggYSBkZWZsYXRlIGJ1ZyBvY2N1cmluZyBvbmx5IHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMCAodGhhbmtzIHRvCiAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4KLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgotIHJldHVybiBaX0JVRl9FUlJPUiBpbnN0ZWFkIG9mIFpfT0sgaWYgb3V0cHV0IGJ1ZmZlciBmdWxsIGluIHVuY29tcHJlc3MoKQotIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQotIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCi0gbWFrZSBzdGF0aWMgbGlicmFyaWVzIGJ5IGRlZmF1bHQgaW4gY29uZmlndXJlLCBhZGQgLS1zaGFyZWQgb3B0aW9uLgotIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MKLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQogIChidXQgdGhlIHN5bWJvbCBaX1BBUlRJQUxfRkxVU0ggaXMga2VwdCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIDEuMC40KQotIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UKICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQotIG5leHRfaW4gYW5kIGF2YWlsX2luIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGNhbGxpbmcgaW5mbGF0ZUluaXQgb3IKICBpbmZsYXRlSW5pdDIKLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKLSBhZGRlZCBNYWtlZmlsZS5udCAodGhhbmtzIHRvIFN0ZXBoZW4gV2lsbGlhbXMpCi0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6CiAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CiAgICAgICAgMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCiAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgogICAgICAgIEEgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZSB0byB0aGUgemxpYiBneiogZnVuY3Rpb25zCiAgIGNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKICAgY29udHJpYi91bnRnei8gIGJ5ICJQZWRybyBBLiBBcmFuZGEgR3V0aVxpcnJleiIgPHBhYWdAdGlkLmVzPgogICAgICAgIEEgdmVyeSBzaW1wbGUgdGFyLmd6IGZpbGUgZXh0cmFjdG9yIHVzaW5nIHpsaWIKICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CiAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCi0gcGFzcyBwYXJhbXMgLWYgKGZpbHRlcmVkIGRhdGEpLCAtaCAoaHVmZm1hbiBvbmx5KSwgLTEgdG8gLTkgKGNvbXByZXNzaW9uCiAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpCgotIHVzZSBjb25zdCBmb3Igcm9tbWFibGUgY29uc3RhbnRzIGluIGRlZmxhdGUKLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMKLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCi0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiB6RXJyb3IgdG8gY29udmVydCBlcnJvciBjb2RlIHRvIHN0cmluZwogIChmb3IgVGltIFNtaXRoZXJzKQotIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCi0gVXNlIGRlZmF1bHQgbWVtY3B5IGZvciBTeW1hbnRlYyBNU0RPUyBjb21waWxlci4KLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpCi0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKLSBjcmVhdGUgYWxzbyBhIGxpbmsgZm9yIGxpYnouc28uMQotIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQotIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKLSBhZGRlZCAtc29uYW1lIGZvciBMaW51eCBpbiBjb25maWd1cmUgKENodW4tQ2h1bmcgQ2hlbiwKLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpCi0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKLSB3b3JrIGFyb3VuZCBjb21waWxlciBidWcgb24gQXRhcmkgKGNhc3QgWl9OVUxMIGluIGNhbGwgb2Ygcy0+Y2hlY2tmbikKLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwKLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQotIGFkZCBORUVEX0RVTU1ZX1JFVFVSTiBmb3IgQm9ybGFuZAotIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuCi0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQwotIGRlZmluZWQgU1REQyBmb3IgT1MvMiAoRGF2aWQgQ2hhcmxhcCkKLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQotIGluIG1pbmlnemlwLmMsIHVzZSBzdGF0aWMgYnVmZmVycyBvbmx5IGZvciAxNi1iaXQgc3lzdGVtcwotIGZpeCBzdWZmaXggY2hlY2sgZm9yICJtaW5pZ3ppcCAtZCBmb28uZ3oiCi0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCi0gdXNlIF9mZG9wZW4gaW5zdGVhZCBvZiBmZG9wZW4gZm9yIE1TQyA+PSA2LjAgKFRob21hcyBGYW5zbGF1KQotIGFkZGVkIG1ha2VsY2MuYmF0IGZvciBsY2Mtd2luMzIgKFRvbSBTdCBEZW5pcykKLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKLSBBdm9pZCBleHBhbmRlZCAkSWQ6IENoYW5nZUxvZyx2IDEuNSAyMDAyLzA1LzA4IDA0OjM4OjAwIGFvbGl2YSBFeHAgJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgotIGNoZWNrIGZvciB1bmlzdGQuaCBpbiBjb25maWd1cmUgKGZvciBvZmZfdCkKLSByZW1vdmUgdXNlbGVzcyBjaGVjayBwYXJhbWV0ZXIgaW4gaW5mbGF0ZV9ibG9ja3NfZnJlZQotIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3Ci0gZG8gbm90IGZsdXNoIHR3aWNlIGluIGd6Y2xvc2UgKHRoYW5rcyB0byBLZW4gUmFlYnVybikKLSByZW5hbWUgRk9QRU4gYXMgRl9PUEVOIHRvIGF2b2lkIGNsYXNoIHdpdGggL3Vzci9pbmNsdWRlL3N5cy9maWxlLmgKLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAotIHdvcmsgYXJvdW5kIGJ1Z2d5IGZjbG9zZSBvbiBwaXBlcyBmb3IgSFAvVVgKLSBzdXBwb3J0IHpsaWIgRExMIHdpdGggQk9STEFORCBDKysgNS4wICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQotIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKCkNoYW5nZXMgaW4gMS4wLjUgKDMgSmFuIDk4KQotIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCi0gRWxpbWluYXRlIG1lbW9yeSBsZWFrcyBvbiBlcnJvciBjb25kaXRpb25zIGluIGluZmxhdGUKLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQotIFVwZGF0ZSB3ZWIgYWRkcmVzcyBpbiBSRUFETUUKCkNoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikKLSBJbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgZGVmbGF0ZShzLCBaX0ZJTklTSCkgY291bGQgZmFpbCB0byBwcm9kdWNlIGFuIEVPRgogIGJpdCwgc28gdGhlIGRlY29tcHJlc3NvciBjb3VsZCBkZWNvbXByZXNzIGFsbCB0aGUgY29ycmVjdCBkYXRhIGJ1dCB3ZW50CiAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uCi0gemxpYlZlcnNpb24gYW5kIGd6ZXJyb3IgcmV0dXJuIGNvbnN0IGNoYXIqIChuZWVkZWQgZm9yIERMTCkKLSBwb3J0IHRvIFJJU0NPUyAobm8gZmRvcGVuLCBubyBtdWx0aXBsZSBkb3RzLCBubyB1bmxpbmssIG5vIGZpbGVubykKLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpCgpDaGFuZ2VzIGluIDEuMC4zICgyIEp1bCA5NikKLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MKICBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsczsgdGhpcyBtYWtlcyB0aGUgbGlicmFyeSBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cwogIHZlcnNpb25zIGZvciB0aGVzZSBtb2RlbHMuIChObyBlZmZlY3QgaW4gbGFyZ2UgbW9kZWwgb3Igb24gb3RoZXIgc3lzdGVtcy4pCi0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoCiAgYXZhaWxfb3V0IGFzIHplcm8gYnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KLSBhZGRlZCBtZW1jbXAgZm9yIG5vbiBTVERDIGNvbXBpbGVycwotIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkKLSBkZWZpbmUgX18zMkJJVF9fIGlmIF9fMzg2X18gb3IgaTM4NiBpcyBkZWZpbmVkIChwYi4gd2l0aCBXYXRjb20gYW5kIFNDTykKLSBiZXR0ZXIgY2hlY2sgZm9yIDE2LWJpdCBtb2RlIE1TQyAoYXZvaWRzIHByb2JsZW0gd2l0aCBTeW1hbnRlYykKCkNoYW5nZXMgaW4gMS4wLjIgKDIzIE1heSA5NikKLSBhZGRlZCBXaW5kb3dzIERMTCBzdXBwb3J0Ci0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkKLSBmaXhlZCBkZWNsYXJhdGlvbnMgdXNpbmcgQnl0ZWYgaW4gaW5mdXRpbC5jIChwYiB3aXRoIE1TRE9TIG1lZGl1bSBtb2RlbCkKLSBCeXRlZiBpcyBkZWZpbmUncyBpbnN0ZWFkIG9mIHR5cGVkZWYnZCBvbmx5IGZvciBCb3JsYW5kIEMKLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYwotIG1lbnRpb24gaW4gUkVBRE1FIHRoYXQgdGhlIHpsaWIgZm9ybWF0IGlzIG5vdyBSRkMxOTUwCi0gdXBkYXRlZCBNYWtlZmlsZS5kajIKLSBhZGRlZCBhbGdvcml0aG0uZG9jCgpDaGFuZ2VzIGluIDEuMC4xICgyMCBNYXkgOTYpIFsxLjAgc2tpcHBlZCB0byBhdm9pZCBjb25mdXNpb25dCi0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQotIGZpeCBpbmZsYXRlIGJ1ZyB3aXRoIGVtcHR5IHN0b3JlZCBibG9jawotIGZpeCBNU0RPUyBtZWRpdW0gbW9kZWwgd2hpY2ggd2FzIGJyb2tlbiBpbiAwLjk5Ci0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4KLSBCeXRlZiBpcyBkZWZpbmUnZCBpbnN0ZWFkIG9mIHR5cGVkZWYnZWQgKHdvcmsgYXJvdW5kIEJvcmxhbmQgYnVnKQotIGFkZGVkIGFuIElOREVYIGZpbGUKLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksCiAgV2F0Y29tIChNYWtlZmlsZS53YXQpLCBBbWlnYSBTQVMvQyAoTWFrZWZpbGUuc2FzKQotIHNwZWVkIHVwIGFkbGVyMzIgZm9yIG1vZGVybiBtYWNoaW5lcyB3aXRob3V0IGF1dG8taW5jcmVtZW50Ci0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlCi0gc3RhdGljX2luaXRfZG9uZSBpbiB0cmVlcy5jIGlzIGFuIGludAotIGRlZmluZSB1bmxpbmsgYXMgZGVsZXRlIGZvciBWTVMKLSBmaXggY29uZmlndXJlIGZvciBRTlgKLSBhZGQgY29uZmlndXJlIGJyYW5jaCBmb3IgU0NPIGFuZCBIUFVYCi0gYXZvaWQgbWFueSB3YXJuaW5ncyAodW51c2VkIHZhcmlhYmxlcywgZGVhZCBhc3NpZ25tZW50cywgZXRjLi4uKQotIG5vIGZkb3BlbiBmb3IgQmVPUwotIGZpeCB0aGUgV2F0Y29tIGZpeCBmb3IgMzIgYml0IG1vZGUgKGRlZmluZSBGQVIgYXMgZW1wdHkpCi0gcmVtb3ZlZCByZWRlZmluaXRpb24gb2YgQnl0ZSBmb3IgTUtXRVJLUwotIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQoKQ2hhbmdlcyBpbiAwLjk5ICgyNyBKYW4gOTYpCi0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yCi0gYWxsb3cgY29tcHJlc3Npb24gbGV2ZWwgMCAobm8gY29tcHJlc3Npb24pCi0gYWRkIGRlZmxhdGVQYXJhbXMgaW4gemxpYi5oOiBhbGxvdyBkeW5hbWljIGNoYW5nZSBvZiBjb21wcmVzc2lvbiBsZXZlbAogIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KLSB0ZXN0IGxhcmdlIGJ1ZmZlcnMgYW5kIGRlZmxhdGVQYXJhbXMgaW4gZXhhbXBsZS5jCi0gYWRkIG9wdGlvbmFsICJjb25maWd1cmUiIHRvIGJ1aWxkIHpsaWIgYXMgYSBzaGFyZWQgbGlicmFyeQotIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkCi0gZml4ZWQgZGVmbGF0ZSBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIENyYXkpCi0gZml4ZWQgaW5mbGF0ZV9ibG9ja3MgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBBbHBoYSkKLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikKLSBhbHdheXMgcmV0dXJuIFpfQlVGX0VSUk9SIHdoZW4gZGVmbGF0ZSgpIGhhcyBub3RoaW5nIHRvIGRvCi0gZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBub3cgbWFjcm9zIHRvIGFsbG93IHZlcnNpb24gY2hlY2tpbmcKLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYCi0gbWFrZSBmYWxsb2MgY29tcGxldGVseSByZWVudHJhbnQgKGluZnRyZWVzLmMpCi0gZml4ZWQgdmVyeSB1bmxpa2VseSByYWNlIGNvbmRpdGlvbiBpbiBjdF9zdGF0aWNfaW5pdAotIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXIKLSB1c2UgemxpYi0xLjAvKiBpbnN0ZWFkIG9mIHpsaWIvKiBpbnNpZGUgdGhlIHRhci5negotIG1ha2UgemxpYiB3YXJuaW5nLWZyZWUgd2l0aCAiZ2NjIC1PMyAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoCiAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiCi0gYWxsb3cgZ3pyZWFkIG9uIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXMKLSBkZWZsYXRlRW5kIG5vdyByZXR1cm5zIFpfREFUQV9FUlJPUiBpZiBpdCB3YXMgcHJlbWF0dXJlCi0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpCi0gRG9jdW1lbnQgWl9TWU5DX0ZMVVNICi0gYWRkIHVuaW5zdGFsbCBpbiBNYWtlZmlsZQotIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaAotIEJldHRlciB0ZXN0IGluIGN0X2FsaWduIGZvciBwYXJ0aWFsIGZsdXNoCi0gYXZvaWQgaGFybWxlc3Mgd2FybmluZ3MgZm9yIEJvcmxhbmQgQysrCi0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jCi0gYXZvaWQgd2FybmluZyBvbiBmZG9wZW4gKGd6aW8uYykgZm9yIEhQIGNjIC1BYQotIGluY2x1ZGUgc3RkbGliLmggZm9yIFNUREMgY29tcGlsZXJzCi0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5Ci0gaWdub3JlIGVycm9yIGlmIHJhbmxpYiBkb2Vzbid0IGV4aXN0Ci0gY2FsbCByYW5saWIgdHdpY2UgZm9yIE5lWFRTVEVQCi0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmEKLSByZW5hbWVkIGN0XyogYXMgX3RyXyogdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBhcHBsaWNhdGlvbnMKLSBjbGVhciB6LT5tc2cgaW4gaW5mbGF0ZUluaXQyIGJlZm9yZSBhbnkgZXJyb3IgcmV0dXJuCi0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jCi0gZml4ZWQgdHlwbyBpbiB6Y29uZi5oIChfR05VQ19fID0+IF9fR05VQ19fKQotIGNoZWNrIGZvciBXSU4zMiBpbiB6Y29uZi5oIGFuZCB6dXRpbC5jIChhdm9pZCBmYXJtYWxsb2MgaW4gMzItYml0IG1vZGUpCi0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkKLSBpbiBmY2FsbG9jLCBub3JtYWxpemUgcG9pbnRlciBpZiBzaXplID4gNjU1MjAgYnl0ZXMKLSBkb24ndCB1c2Ugc3BlY2lhbCBmY2FsbG9jIGZvciAzMiBiaXQgQm9ybGFuZCBDKysKLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uCi0gdXNlIFpfQklOQVJZIGluc3RlYWQgb2YgQklOQVJZCi0gZG9jdW1lbnQgdGhhdCBnemNsb3NlIGFmdGVyIGd6ZG9wZW4gd2lsbCBjbG9zZSB0aGUgZmlsZQotIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4KLSBmaXggZXJyb3IgY2hlY2tpbmcgaW4gZ3pyZWFkCi0gYWxsb3cgc2tpcHBpbmcgLmd6IGV4dHJhLWZpZWxkIG9uIHBpcGVzCi0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQotIHB1dCB0aGUgY3JjIHRhYmxlIGluIEZBUiBkYXRhIChJIGRpc2xpa2UgbW9yZSBhbmQgbW9yZSB0aGUgbWVkaXVtIG1vZGVsIDopCi0gYWRkZWQgZ2V0X2NyY190YWJsZQotIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuCi0gd29ya2Fyb3VuZCBCb3JsYW5kIEMgYnVnIGluIGRlY2xhcmF0aW9uIG9mIGluZmxhdGVfY29kZXNfbmV3ICYgaW5mbGF0ZV9mYXN0Ci0gZ3VhcmQgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24gb2YgKi5oIChmb3IgcHJlY29tcGlsZWQgaGVhZGVyIG9uIE1hYykKLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLgotIGRvbid0IHVzZSB1bnNpemVkIGFycmF5cyB0byBhdm9pZCBzaWxseSB3YXJuaW5ncyBieSBWaXN1YWwgQysrOgogICAgIHdhcm5pbmcgQzQ3NDY6ICdpbmZsYXRlX21hc2snIDogdW5zaXplZCBhcnJheSB0cmVhdGVkIGFzICAnX19mYXInCiAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLgotIGRlZmluZSBlbnVtIG91dCBvZiBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB0byBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEMrKwoKQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpCi0gZml4IE1TRE9TIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgKG5vdyBlYXNpZXIgdG8gYWRhcHQgdG8gYW55IGNvbXBpbGVyKQotIGlubGluZWQgc2VuZF9iaXRzCi0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0CiAgbm90IGNvbXBsZXRlbHkgZmx1c2hlZCBpbiByYXJlIG9jY2FzaW9ucykuCi0gZGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzYW1lIGZvciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgogIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuCi0gdm9pZHAgLT4gdm9pZHBmIGFuZCB2b2lkbnAgLT4gdm9pZHAgKGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyCiAgdHlwZWRlZnMgYW5kIGJlY2F1c2Ugdm9pZG5wIHdhcyBub3QgbmVhciBpbiBsYXJnZSBtb2RlbCkuCgpDaGFuZ2VzIGluIDAuOTQgKDEzIEF1ZyA5NSkKLSBzdXBwb3J0IE1TRE9TIG1lZGl1bSBtb2RlbAotIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQotIGZpeCBkZWZsYXRlUmVzZXQgKHpsaWIgaGVhZGVyIHdhcyBpbmNvcnJlY3RseSBzdXBwcmVzc2VkKQotIGFkZGVkIHN1cHBvcnQgZm9yIFZNUwotIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkKLSBnemZsdXNoIG5vdyBjYWxscyBmZmx1c2gKLSBGb3IgZGVmbGF0ZSB3aXRoIGZsdXNoLCBmbHVzaCBldmVuIGlmIG5vIG1vcmUgaW5wdXQgaXMgcHJvdmlkZWQuCi0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hCi0gYXZvaWQgY29tcGxleCBleHByZXNzaW9uIGluIGluZmNvZGVzLmMgdHJpZ2dlcmluZyBUdXJibyBDIGJ1ZwotIHdvcmsgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIGdjYyBvbiBBbHBoYSAoaW4gSU5TRVJUX1NUUklORykKLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQotIGFsbG93IHJlbmFtaW5nIG9mIEJ5dGUsIHVJbnQsIGV0Yy4uLiB3aXRoICNkZWZpbmUuCi0gYXZvaWQgd2FybmluZyBhYm91dCAodW51c2VkKSBwb2ludGVyIGJlZm9yZSBzdGFydCBvZiBhcnJheSBpbiBkZWZsYXRlLmMKLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMKLSBhdm9pZCByZXNlcnZlZCB3b3JkICduZXcnIGluIHRyZWVzLmMKCkNoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkKLSB0ZW1wb3JhcmlseSBkaXNhYmxlIGlubGluZSBmdW5jdGlvbnMKLSBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYwotIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSAotIFNldCBiaW5hcnkgbW9kZSBmb3Igc3RkaW4vc3Rkb3V0IGluIG1pbmlnemlwLmMgZm9yIE9TLzIKLSBkb24ndCBldmVuIHVzZSBzaWduZWQgY2hhciBpbiBpbmZsYXRlIChub3QgcG9ydGFibGUgZW5vdWdoKQotIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcwoKQ2hhbmdlcyBpbiAwLjkyICgzIE1heSA5NSkKLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpCi0gQ2xlYXIgYml0IGJ1ZmZlciB3aGVuIHN0YXJ0aW5nIGEgc3RvcmVkIGJsb2NrCi0gbm8gbWVtY3B5IG9uIFB5cmFtaWQKLSBzdXBwcmVzc2VkIGluZnRlc3QuYwotIG9wdGltaXplZCBmaWxsX3dpbmRvdywgcHV0IGxvbmdlc3RfbWF0Y2ggaW5saW5lIGZvciBnY2MKLSBvcHRpbWl6ZWQgaW5mbGF0ZSBvbiBzdG9yZWQgYmxvY2tzLgotIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMKCkNoYW5nZXMgaW4gMC45MSAoMiBNYXkgOTUpCi0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oCi0gRG9jdW1lbnQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgaW4gemNvbmYuaAotIGFkZGVkICJtYWtlIGluc3RhbGwiCi0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jCi0gZGVmbGF0ZShaX0ZVTExfRkxVU0gpIG5vdyB3b3JrcyBldmVuIGlmIG91dHB1dCBidWZmZXIgdG9vIHNob3J0Ci0gYWZ0ZXIgaW5mbGF0ZVN5bmMsIGRvbid0IHNjYXJlIHBlb3BsZSB3aXRoIGp1c3QgImxvIHdvcmxkIgotIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQCgpDaGFuZ2VzIGluIDAuOSAoMSBNYXkgOTUpCi0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcKICB3YXMgTWFyaydzIGJ1ZyBhZnRlciBhbGwgOikKLSBsZXQgYWdhaW4gZ3pyZWFkIGNvcHkgdW5jb21wcmVzc2VkIGRhdGEgdW5jaGFuZ2VkICh3YXMgd29ya2luZyBpbiAwLjcxKQotIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkCi0gYWRkZWQgYSB0ZXN0IG9mIGluZmxhdGVTeW5jIGluIGV4YW1wbGUuYwotIG1vdmVkIE1BWF9XQklUUyB0byB6Y29uZi5oIGJlY2F1c2UgdXNlcnMgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhhdC4KLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkCiAgcG9pbnRlciAoemVybyBvZmZzZXQpCi0gYWRkZWQgTWFrZWZpbGVzIGZvciBNaWNyb3NvZnQgQywgVHVyYm8gQywgQm9ybGFuZCBDKysKLSBmYXN0ZXIgY3JjMzIoKQoKQ2hhbmdlcyBpbiAwLjggKDI5IEFwcmlsIDk1KQotIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQotIGRlZmxhdGUoWl9GSU5JU0gpIG5vdyByZXR1cm5zIFpfU1RSRUFNX0VORCB3aGVuIGRvbmUuIFdhcm5pbmc6IHRoaXMKICBpcyBpbmNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB6bGliIHdoaWNoIHJldHVybmVkIFpfT0suCi0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQogIChhY3R1YWxseSB0aGF0IHdhcyBub3QgYSBjb21waWxlciBidWcsIHNlZSAwLjgxIGFib3ZlKQotIGd6cmVhZCBubyBsb25nZXIgcmVhZHMgb25lIGV4dHJhIGJ5dGUgaW4gY2VydGFpbiBjYXNlcwotIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUKLSBhdm9pZCBtYW55IHdhcm5pbmdzIGZvciBNU0RPUwotIGF2b2lkIHRoZSBFUlJPUiBzeW1ib2wgd2hpY2ggaXMgdXNlZCBieSBNUyBXaW5kb3dzCgpDaGFuZ2VzIGluIDAuNzEgKDE0IEFwcmlsIDk1KQotIEZpeGVkIG1vcmUgTVNET1MgY29tcGlsYXRpb24gcHJvYmxlbXMgOiggVGhlcmUgaXMgc3RpbGwgYSBidWcgd2l0aAogIFR1cmJvQyBsYXJnZSBtb2RlbC4KCkNoYW5nZXMgaW4gMC43ICgxNCBBcHJpbCA5NSkKLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4KLSBTaW1wbGlmaWVkIHRoZSBjcmMzMigpIGludGVyZmFjZS4gVGhlIHByZS0gYW5kIHBvc3QtY29uZGl0aW9uaW5nCiAgKG9uZSdzIGNvbXBsZW1lbnQpIGlzIG5vdyBkb25lIGluc2lkZSBjcmMzMigpLiBXQVJOSU5HOiB0aGlzIGlzCiAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuCgpDaGFuZ2VzIGluIDAuNjEgKDEyIEFwcmlsIDk1KQotIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuCgpDaGFuZ2VzIGluIDAuNiAoMTEgQXByaWwgOTUpCi0gYWRkZWQgbWluaWd6aXAuYwotIGFkZGVkIGd6ZG9wZW4gdG8gcmVvcGVuIGEgZmlsZSBkZXNjcmlwdG9yIGFzIGd6RmlsZQotIGFkZGVkIHRyYW5zcGFyZW50IHJlYWRpbmcgb2Ygbm9uLWd6aXBlZCBmaWxlcyBpbiBnenJlYWQuCi0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkKLSBmaXhlZCBidWcgaW4gZGVzdHJveSAoZ3ppby5jKSAoZG9uJ3QgcmV0dXJuIFpfU1RSRUFNX0VORCBmb3IgZ3pjbG9zZSkuCi0gZG9uJ3QgYWxsb2NhdGUgYmlnIGFycmF5cyBpbiB0aGUgc3RhY2sgKGZvciBNU0RPUykKLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcwoKQ2hhbmdlcyBpbiAwLjU6Ci0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0CiAgbm90IHlldCBaX0ZVTExfRkxVU0guCi0gc3VwcG9ydCBkZWNvbXByZXNzaW9uIGJ1dCBvbmx5IGluIGEgc2luZ2xlIHN0ZXAgKGZvcmNlZCBaX0ZJTklTSCkKLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLgotIGFkZGVkIGRlZmxhdGVSZXNldCBhbmQgaW5mbGF0ZVJlc2V0Ci0gYWRkZWQgYSB2YXJpYWJsZSB6bGliX3ZlcnNpb24gZm9yIGNvbnNpc3RlbmN5IGNoZWNraW5nLgotIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4KICBBZGRlZCBaX0ZJTFRFUkVEIGFuZCBaX0hVRkZNQU5fT05MWSBjb25zdGFudHMuCgpDaGFuZ2VzIGluIDAuNDoKLSBhdm9pZCAiemlwIiBldmVyeXdoZXJlLCB1c2UgemxpYiBpbnN0ZWFkIG9mIHppcGxpYi4KLSBzdXBwcmVzcyBaX0JMT0NLX0ZMVVNILCBpbnRlcnByZXQgWl9QQVJUSUFMX0ZMVVNIIGFzIGJsb2NrIGZsdXNoCiAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguCi0gYWRkZWQgYWRsZXIzMiBhbmQgY3JjMzIKLSByZW5hbWVkIGRlZmxhdGVPcHRpb25zIGFzIGRlZmxhdGVJbml0MiwgY2FsbCBvbmUgb3IgdGhlIG90aGVyIGJ1dCBub3QgYm90aAotIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuCi0gYWRkZWQgaW5mbGF0ZUluaXQyCi0gc2ltcGxpZWQgY29uc2lkZXJhYmx5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdCBieSBub3Qgc3VwcG9ydGluZwogIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyCiAgYW5kIGluZmxhdGVJbml0Mi4KCkNoYW5nZXMgaW4gMC4zOgotIHByZWZpeCBhbGwgbWFjcm8gbmFtZXMgd2l0aCBaXwotIHVzZSBaX0ZJTklTSCBpbnN0ZWFkIG9mIGRlZmxhdGVFbmQgdG8gZmluaXNoIGNvbXByZXNzaW9uLgotIGFkZGVkIFpfSFVGRk1BTl9PTkxZCi0gYWRkZWQgZ3plcnJvcigpCg==