ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlbG9nCgpWZXJzaW9uIDcuMTEuMCAoMjIgSmFudWFyaSAyMDA0KQoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDQpCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlIHdpdGggVElNRUNPTkRfIHByZWZpeGVzLiBUaGV5CiAgaGF2ZSBiZWVuIG9ic29sZXRlIHNpbmNlIEFwcmlsIDIybmQgMjAwMiwgYW5kIGlmIHRoaXMgY2F1c2VzIGFueW9uZSBhbnkKICBwcm9ibGVtcyBub3cgaXQgaXMgdmVyeSBlYXN5IHRvIGp1c3QgYWRkIENVUkxfIHRvIHRoZSBuYW1lcy4gVGhpcyBjb3JyZWN0cwogIHRoaXMgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiBjbGVhbmVkIHVwIGhvdyAtLXRyYWNlIHdpdGggbm8gb3B0aW9uIHdhcyB0cmVhdGVkLCBhbmQgYWxzbwogIGFyZ3VtZW50cyBpbiBhIGNvbmZpZyBmaWxlIHdpdGhvdXQgYSByZXF1aXJlZCBwYXJhbWV0ZXIhCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGZldyBpc3N1ZXMgd2hlcmUgY29tcGlsZXJzIHdhcm5lZCBhYm91dCB2YXJpYWJsZXMKICBwb3NzaWJseSBiZWluZyB1c2VkIHVuYXNzaWduZWQuCgotIE1pbm9yIEludGVyaXggYnVpbGQgcHJvYmxlbSBmaXhlZC4KCkRhbmllbCAoMTUgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBzb21lIG5lY2Vzc2FyeSBlc2NhcGluZyBuZWVkZWQgaW4gdGhlCiAgYWNpbmNsdWRlLm00IGZpbGUgd2hlbiBhdXRvbWFrZSAxLjggb3IgbGF0ZXIgaXMgdXNlZC4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA0KQotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgQ3VybF9yZXNvbHYoKSByZXR1cm4gY29kZS4gVGhpcyBleHRlbmRzIHRoZSBmaXgKICBTdGV2ZSBHcmVlbiBwcm92aWRlZCBvbiBkZWNlbWJlciAzLi4uCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNCkKLSBMdWtlIENhbGwgbWFkZSB0aGUgd2luMzIgdmVyc2lvbiBvZiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nIGZ1bmN0aW9uIHN1cHBvcnQKICBiYWNrc3BhY2UuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgaHVnZWhlbHAgc291cmNlIGZpbGUgdG8gY29udGFpbiBib3RoIGEgY29tcHJlc3NlZCBhbmQKICBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IG1vcmUgcGVvcGxlIGVhc2llciBjYW4KICBidWlsZCBjdXJsIHdpdGggdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KCi0gRGllZ28gQ2Fzb3JyYW4gYnJvdWdodCBhbm90aGVyIEFtaWdhT1MgYnVpbGQgcGF0Y2ggZm9yIG5hdGl2ZSBBbWlnYSBidWlsZHMuCgotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgTWFjIE9TIFggZnJhbWV3b3JrIGZpbGVzLgoKLSBCcmlhbiBSIER1ZmZ5IGJyb3VnaHQgYSBzZWN0aW9uIHRvIHRoZSBJTlNUQUxMIGZpbGUgb24gaG93IHRvIGJ1aWxkIGEKICBTU0wtZW5hYmxlZCBjdXJsIHVzaW5nIHRoZSBmcmVlIEJvcmxhbmQgQysrIGNvbXBpbGVyLiBIZSBhbHNvIHVwZGF0ZWQgdGhlCiAgQm9ybGFuZCBsaWIvTWFrZWZpbGUuYjMyLgoKLSBJIGZpeGVkIHRoZSB0ZXN0IGNhc2UgNTA5IHdoaWNoIEkgYnJva2UgeWVzdGVyZGF5LiBOb3cgdGhlIGxpYnRlc3QgYXJlCiAgY29tcGlsZWQgd2l0aCBhbiBpbmNsdWRlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIGxpYnJhcnkncyBzb3VyY2UgZGlyLCBzbwogIHRoYXQgdGhlIGxpYnRlc3RzIGNhbiBpbmNsdWRlIGZpbGVzIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIHdhcyBtYWRlIHRvCiAgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFVTRV9TU0xFQVkgZGVmaW5lIGluIHRoZSBsaWJyYXJ5IHRlc3QgZmlsZXMuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgYnJvdWdodCBjb2RlIHRoYXQgbm93IGFsbG93cyBhIGNhbGxiYWNrIHRvIG1vZGlmaWVkIHRoZSBVUkwKICBldmVuIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgc2ltdWxhdGUgYQogICJmb2xsb3cgbG9jYXRpb24iIHRvIHRoYXQgbmV3IFVSTC4gVGVzdCA1MDkgd2FzIGFkZGVkIHRvIHRlc3QgdGhpcyBmZWF0dXJlLgoKLSBFeHRlbmRlZCB0aGUgdGltZSB3ZSByZXRyeSBzZXJ2ZXJzIGluIHRoZSB0ZXN0IHNjcmlwdCwgYW5kIEkgYWxzbyBtYWRlIGl0CiAgcmV0cnkgdGhlIGh0dHBzIGFuZCBmdHBzIHNlcnZlcnMgYmVmb3JlIHRoZXkgYXJlIGNvbnNpZGVyZWQgYmFkLiBJIGJlbGlldmUKICB0aGUgcHJldmlvdXMgYXBwcm9hY2ggY291bGQgdHVybiBwcm9ibGVtYXRpYyBvbiByZWFsbHkgc2xvdyBob3N0cy4KClZlcnNpb24gNy4xMS4wLXByZTEgKDEyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA0KQotIERvbWluaWNrIE1lZ2xpbyBwb2ludGVkIG91dCBGVFBTIHNob3VsZCB1c2UgZGVmYXVsdCBwb3J0IDk5MCBhY2NvcmRpbmcgdG8KICBJQU5BLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwNCkKLSBGaXhlZCB0aGUgU1BORUdPIGNvbmZpZ3VyZSBjaGVjayB0byBub3QgdXNlIC1SIG9yIG90aGVyIG5vbi1wb3J0YWJsZSBvcHRpb25zCiAgaW4gdGhlIExERkxBR1MuIFJlcG9ydGVkIGJ5IFBpZXJyZSBpbiBidWcgcmVwb3J0ICM4NzI5MzAuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA0KQotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIGZpeCBvbiBvdXIgemxpYiB1c2FnZS4KCi0gRGF2aWQgSiBNZXllcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlIGxhcmdlIGZpbGUgc3VwcG9ydCB0byBsaWJjdXJsIHdhcwogIGFwcGxpZWQuIE5ldyBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgdGhhdCBhY2NlcHQgJ29mZl90JyBhcmd1bWVudHMgYXJlOgoKICBJTkZJTEVTSVpFX0xBUkdFCiAgUkVTVU1FX0ZST01fTEFSR0UKICBNQVhGSUxFU0laRV9MQVJHRQoKRGFuaWVsICg0IEphbnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBEb21pbmljayBNZWdsaW8ncyBjb21tZW50cywgSSBtYWRlIG91ciBwcml2YXRlIHZlcnNpb24gb2YKICBnZXR0aW1lb2ZkYXkoKSBkZWNsYXJlZCBzdGF0aWMuIFRoaXMgd291bGQgb3RoZXJ3aXNlIGNvbGxpZGUgd2l0aCB0aGUgc2FtZQogIGZ1bmN0aW9uIGluIG90aGVyIGxpYnMgKGxpa2UgYXJlcyBmb3IgZXhhbXBsZSkuCgotIEFkZGVkIERvbWluaWNrIE1lZ2xpbydzIGRlc2NyaXB0aW9uIG9uIGhvdyB0byBidWlsZCBsaWJjdXJsIHdpdGggYXJlcwogIG9uIHdpbjMyLgoKRGFuaWVsICgxOSBEZWNlbWJlcikKLSBDVVJMT1BUX0lQUkVTT0xWRSB3YXMgbm90IHBvc3NpYmxlIHRvIHNldC4KCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCB0aGUgZGpncHAgYnVpbGQgZmlsZXMuCgpEYW5pZWwgKDE4IERlY2VtYmVyKQotIEpvaG4gTWNHb3dhbiByZXBvcnRlZCBhIHJlZGlyZWN0LXByb2JsZW0gdGhhdCBoYXBwZW5lZCBpZiBhIHNpdGUgdXNlZCBhIFVSTAogIGxpa2UgInVybC5jb20/dmFyPWNvbnRlbnQiICh3aXRob3V0IGEgcHJvcGVyIHNsYXNoKSBhbmQgZnJvbSB0aGF0IGFkZHJlc3MKICByZWRpcmVjdGVkIHRoZSB1c2VyLWFnZW50IHRvIGFuIGFic29sdXRlIGRpcmVjdG9yeS4KCi0gRGF2aWQgQnlyb24gbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBib3RoIHRoZSAuTkVUIGFuZCBWQzYgdmVyc2lvbnMgb2YKICBNU1ZDCgpEYW5pZWwgKDE2IERlY2VtYmVyKQotIFVwZGF0ZWQgdGVzdCA1MDYgc2luY2UgaXQgc3RhcnRlZCB0byBmYWlsIGFmdGVyIHRoZSBjYWNoZSBwcnVuZSBjaGFuZ2UKICB5ZXN0ZXJkYXkuIEkgYWxzbyBjaGFuZ2VkIGl0IHNsaWdodGx5IHRvIGZlYXR1cmUgYSBjb3VudGVyIGluIGVhY2ggZGVidWcKICBvdXRwdXQgZm9yIGVhc2llciB0cmFjaW5nLgoKRGFuaWVsICgxNSBEZWNlbWJlcikKLSBPbGQgRE5TIGNhY2hlIGVudHJpZXMgYXJlIG5vdyBvbmx5IHBydW5lZCBhZnRlciBjdXJsIGlzIGRvbmUgd2l0aCBhIHJlcXVlc3QsCiAgYW5kIG5vdCBpbiB0aGUgYWN0dWFsIG5hbWUgcmVzb2x2ZSBjYWxsLgoKLSBjb3JyZWN0ZWQgdGhlIC0tZW5hYmxlLWFyZXMgcGF0Y2gKCi0gR2l1c2VwcGUgQXR0YXJkaSBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIHdpdGhpbiBsaWJjdXJsIHRoYXQgcmUtdXNlZAogIGFscmVhZHkgZnJlZWQgbWVtb3J5LgoKRGFuaWVsICgxMCBEZWNlbWJlcikKLSBHaXNsZSBWYW5lbSByZXBvcnRlZCB0aGF0IHRoZSBkaWN0IHN1cHBvcnQgd2FzIGJyb2tlbi4gSSBicm9rZSBpdCBkdXJpbmcgbXkKICBmdHBzLWNoYW5nZXMgb3ZlcmhhdWwuIEkndmUgbm93IGFkZGVkIGEgJ2N1cmxhc3NlcnQnIGZ1bmN0aW9uIHRoYXQgY2FuIGJlCiAgdXNlZCB0byB2ZXJpZnkgZXhwcmVzc2lvbnMsIHRvIHByZXZlbnQgZnV0dXJlIGVycm9ycyBvZiB0aGUgc2FtZQogIGtpbmQuIFRoZXkncmUgb25seSBwcmVzZW50IGluIGRlYnVnLWJ1aWxkcy4KCi0gRGllZ28gQ2Fzb3JyYW4gbWFkZSBjdXJsIGFuZCBsaWJjdXJsIHBvc3NpYmxlIHRvIGJ1aWxkIG5hdGl2ZWx5IChubyBtb3JlCiAgbmVlZCBmb3IgdGhlIGl4ZW11bCBsaWJyYXJ5KSBvbiBBbWlnYU9TLgoKLSBEb21pbmljayBNZWdsaW8gbWFkZSBjb25maWd1cmUgLS1lbmFibGUtYXJlcyBzdXBwb3J0IGEgZ2l2ZW4gcGF0aCB0byB0aGUKICBpbnN0YWxsZWQgYXJlcyBsaWIsIGluc3RlYWQgb2YgYWx3YXlzIHVzaW5nIGl0IGluIHRoZSBjdXJsIHNvdXJjZSB0cmVlLgogIFRoaXMgYWxzbyBmaXhlZCB0aGUgY3VybC1jb25maWcgLS1saWJzIG91dHB1dC4KCi0gRXJpYyBTLiBSYXltb25kIHBhdGNoZWQgYSB2ZXJ5IG1pbm9yIG1hbiBwYWdlIGZvcm1hdCBlcnJvciBpbgogIGxpYmN1cmwtZXJyb3JzLjMKCkRhbmllbCAoOCBEZWNlbWJlcikKLSBGaXhlZCB0aGUgZmxhdyB0aGF0IG1hZGUgLWx6IGFwcGVhciB0d2ljZSBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUuCgotIEFmdGVyIGNvcnJlc3BvbmRhbmNlIHdpdGggR2lzbGUgVmFuZW0sIEkgY2hhbmdlZCB0aGUgJ2Nvbm5lY3Rpb24gYWJvcnRlZCcKICBlcnJvciB0ZXh0IHdoZW4gdGhlIEZUUCByZXNwb25zZSByZWFkZXIgZmFpbGVkIHRvIG1vcmUgc3BlY2lmaWNseSBpZGVudGlmeQogIHdoYXQgdGhlIHByb2JsZW0gaXMuCgotIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBEb21pbmljayBNZWdsaW8sIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgb3V0cHV0cwogICdBc3luY2hETlMnIGFzIGEgZmVhdHVyZSBpZiBsaWJjdXJsIHdhcyBidWlsdCB3aXRoIGFyZXMuIFRoZSBmZWF0dXJlIG5hbWUKICBpcyB0aGUgc2FtZSB0aGF0ICdjdXJsIC1WJyBvdXRwdXRzLCBmb3Igc2ltcGxpY2l0eS4KCkRhbmllbCAoMyBEZWNlbWJlcikKLSBNYXJ0eSBLdWhydCBtYWRlIHRoZSBidWlsZCB1cC10by1kYXRlIG9uIFZNUywgYW5kIG1vdmVkIG1vc3Qgb2YgdGhlIFZNUy0KICBzcGVjaWZpYyBzdHVmZiBpbiB0aGUgY2xpZW50IGNvZGUgdG8gYSBzZXBhcmF0ZSBoZWFkZXIgZmlsZS4KCi0gU3RldmUgR3JlZW4gZml4ZWQgYSByZXR1cm4gY29kZSBidWcgaW4gQ3VybF9yZXNvbHYoKSwgdGhhdCBtYWRlIHRoZSBzb2NrczUKICBjb2RlIGZhaWwuCgotIHN3YWxrYXVzIGF0IHlhaG9vLmNvbSBwYXRjaGVkIGxpYmN1cmwgdG8gaWdub3JlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzCiAgd2hlbiBUcmFuZmVyLUVuY29kaW5nOiBjaHVua2VkIGlzIHVzZWQsIGFzIG1hbmRhdGVkIGJ5IFJGQzI2MTYuCgpEYW5pZWwgKDIgRGVjZW1iZXIpCi0gLS1mdHAtcGFzdiB3YXMgYWRkZWQsIHdoaWNoIHNlcnZlcyB0aGUgb25seSBwdXJwb3NlIG9mIG92ZXJyaWRpbmcgYQogIHByZXZpb3VzbHkgc2V0IC0tZnRwcG9ydCBvcHRpb24uIFN0YXJ0aW5nIG5vdywgLS1mdHAtcG9ydCBpcyBhIHJlY29nbml6ZWQKICBhbGlhcyBmb3IgLS1mdHBwb3J0IGZvciBjb25zaXN0ZW5jeS4KCi0gR2l1c2VwcGUgQXR0YXJkaSBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCB1c2UgTVNHX05PU0lHTkFMIHdoZW4gd2UgdXNlCiAgc2VuZCgpIGFuZCByZWN2KCkuIEkgYWRkZWQgY2hlY2tzIGZvciB0aGUgZGVmaW5lIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZAogIGFkanVzdGVkIHRoZSBjb2RlIGFjY29yZGluZ2x5LiBJZiB0aGUgc3ltYm9sIGlzIHByZXNlbnQsIHdlIHdvbid0IGF0dGVtcHQKICB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLgoKRGFuaWVsICgxIERlY2VtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gc2V0IHVwIGEgYnNkZnRwZC1zc2wgc2VydmVyIGZvciBtZSBhbmQgSSBjb3VsZCBtYWtlIGN1cmwKICBydW4gZmluZSBhZ2FpbnN0IGl0cyBGVFBTIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlc2UgRlRQUy1yZWxhdGVkIHRoaW5ncwogIHdvcms6CiAgIG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IEZUUFMKICAgbyBhY3RpdmUgKFBPUlQpIGFuZCBwYXNzaXZlIChQQVNWKQogICBvIHVwbG9hZCBhbmQgZG93bmxvYWQKICAgbyB2ZXJpZmllZCBhZ2FpbnN0IGJzZGZ0cGQtc3NsIGFuZCBSYWlkZW5GVFBECgpEYW5pZWwgKDI3IE5vdmVtYmVyKQotIEphbWVzIENsYW5jeSBtYWRlIHRoZSBCb3JsYW5kIE1ha2VmaWxlcyB1cCB0byBkYXRlLgoKLSBNYXJrdXMgTW9lbGxlciBpbXByb3ZlZCB0aGUgU1BORUdPIGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjUgTm92ZW1iZXIpCi0gRGF2ZSBNYXkgZmlsZWQgYnVnIHJlcG9ydCAjODQ4MzcxLCBpZGVudGlmeWluZyB0aGF0IGlmIHlvdSdkIGRvIFBPU1Qgb3ZlciBhCiAgcHJveHkgdG8gYSBodHRwcyBzZXJ2ZXIsIGxpYmN1cmwgZGlkbid0IFBPU1QgYXQgYWxsLCBpdCBqdXN0IG1hZGUgYSBHRVQhIEl0CiAgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGxpYmN1cmwgd3JvbmdseSBkaWRuJ3QgY29uc2lkZXIgdGhlIGF1dGhlbnRpY2F0aW9uCiAgIm5lZ290aWF0aW9uIHBoYXNlIiB0byBiZSBjb21wbGV0ZSB5ZXQuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDk1IHRvIHZlcmlmeSBteSBmaXggZm9yIHRoaXMuCgpEYW5pZWwgKDI0IE5vdmVtYmVyKQotIFRoYW5rcyB0byBNYXRoaWFzIEF4ZWxzc29uLCBJJ3ZlIGJlZW4gYWJsZSB0byB3b3JrIG9uIEZUUFMgZm9yIGxpYmN1cmwgYW5kIGl0CiAgc2VlbXMgdG8gd29yayBzb21ld2hhdCBmaW5lIG5vdy4KCiAgVGhlIEZUUFMgc3R1ZmYgaXMgYmFzZWQgb24gUkZDMjIyOCBhbmQgdGhlIG11cnJheS1hdXRoLWZ0cC1zc2wgZHJhZnQKICAodmVyc2lvbiAxMikuIFRoZXJlIHNlZW1zIHRvIGV4aXN0IHF1aXRlIGEgZmV3IHNlcnZlcnMgdGhhdCBoYXZlIGltcGxlbWVudGVkCiAgdGhlIHNlcnZlciBzaWRlIG9mIHRoaXMuCgogIFdlIGNhbiBub3cgdXNlIGZ0cHM6Ly8gVVJMcyB0byBleHBsaWNpdGx5IHN3aXRjaCBvbiBTU0wvVFNMIGZvciB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24gYW5kIHRoZSBkYXRhIGNvbm5lY3Rpb24gKGRlYWxpbmcgd2l0aCB0d28gU1NMIGNvbm5lY3Rpb25zIGZvcmNlZAogIG1lIHRvIGNoYW5nZSBhIGxvdCBvZiBzdHVmZiBpbiBsaWJjdXJsKS4KCiAgQWx0ZXJuYXRpdmVseSwgYW5kIHdoYXQgc2VlbXMgdG8gYmUgdGhlIHJlY29tbWVuZGVkIHdheSwgd2UgY2FuIHNldCB0aGUgbmV3CiAgb3B0aW9uIENVUkxPUFRfRlRQX1NTTCB0byBvbmUgb2YgdGhlc2UgdmFsdWVzOgoKICAgICBDVVJMRlRQU1NMX05PUEUsICAgLSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1NMCiAgICAgQ1VSTEZUUFNTTF9UUlkgICAgIC0gdHJ5IHVzaW5nIFNTTCwgcHJvY2VlZCBhbnl3YXkgb3RoZXJ3aXNlCiAgICAgQ1VSTEZUUFNTTF9DT05UUk9MIC0gU1NMIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIG9yIGZhaWwKICAgICBDVVJMRlRQU1NMX0FMTCAgICAgLSBTU0wgZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9yIGZhaWwKCiAgQW55IGZhaWx1cmUgdG8gc2V0IHRoZSBkZXNpcmVkIGxldmVsIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwgd2l0aCB0aGUgZXJyb3IKICBjb2RlIENVUkxFX0ZUUF9TU0xfRkFJTEVELiBUaGlzIG5ldyBvcHRpb24gbWFrZXMgYSAibm9ybWFsIiBmdHA6Ly8gdHJhbnNmZXIKICBhdHRlbXB0IHRvIGJlIG1hZGUgc2VjdXJlbHkuCgogIEkndmUgYmVlbiBhYmxlIHRvIGxvZ2luIGFuZCBnZXQgZmlsZXMgKHBhc3NpdmVseSkgZnJvbSBNYXRoaWFzJyBzZXJ2ZXIgdXNpbmcKICBib3RoIGZ0cHM6Ly8gYW5kIENVUkxPUFRfRlRQX1NTTC4gKEkndmUgbWFkZSAnY3VybCcgdW5kZXJzdGFuZCB0aGUgLS1mdHAtc3NsCiAgb3B0aW9uIHRoYXQgc2V0cyBDVVJMRlRQU1NMX1RSWS4pCgotIEdheiBJcWJhbCBmaXhlZCBhIHJhbmdlIHN0cmluZyBtZW1vcnkgbGVhay4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIFdpbmRvd3MgYnVpbGRzLgoKLSBBZGRlZCB0aGUgbmV3IEZUUFNTTCBkZWZpbmVzIGluIGN1cmwvY3VybC5oCgpEYW5pZWwgKDIwIE5vdmVtYmVyKQotIEpvc2ggS2FwZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzg0NTI0NyBhcyBoZSBmb3VuZCBhbiBlbmRsZXNzIGxvb3Agd2hlbgogIGdldHRpbmcgYSA0MDcgYmFjayBmcm9tIGEgcHJveHkgd2hlbiBubyB1c2VyK3Bhc3N3b3JkIHdhcyBnaXZlbi4gQWRkZWQgdGVzdAogIGNhc2UgOTQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE5IE5vdmVtYmVyKQotIEtldmluIFJvdGggZml4ZWQgYSBwcm9ncmVzcy1iYXIgcHJvYmxlbSBvbiBXaW5kb3dzLgoKLSBXaGlsZSB3b3JraW5nIHdpdGggTmljb2xhcyBDcm9pc2V0J3MgYnVnIHJlcG9ydCAjODQzNzM5LCBJIG5vdGljZWQgdHdvIG1pbm9yCiAgcHJvYmxlbXMgcmVsYXRlZCB0byBmdHAgcGFydGlhbCBkb3dubG9hZHM6IGlmIGEgcGFydGlhbCB0cmFuc2ZlciBpcwogIGRldGVjdGVkLCB3ZSBtdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHdlIGNhbm5vdCBrbm93IGluIHdoYXQgc3RhdGUgaXQgaXMKICBhbnltb3JlLiBUaGlzIGxvb2tzIGxpa2UgYSBQcm9GVFBEIGJ1ZzoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDMtMTEvMDA3OS5odG1sCgpEYW5pZWwgKDE3IE5vdmVtYmVyKQotIE1hY2llaiBXLiBSb3p5Y2tpIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlIGEgY2FjaGUgdmFyaWFibGUgZm9yIHRoZQogIHdyaXRhYmxlIGFyZ3YgdGVzdC4gVGhpcyB3YXksIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJldHRlciAoZm9yCiAgY3Jvc3MtY29tcGlsZXMgZXRjKQoKRGFuaWVsICgxNSBOb3ZlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIGZvdW5kIG91dCBsaWJjdXJsIHNvbWV0aW1lcyBmcmVlZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlCiAgdHdpY2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyEKCkRhbmllbCAoMTQgTm92ZW1iZXIpCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgcmVzb2x2ZSB0aGF0IHdlIGRpZG4ndAogIHByb3Blcmx5IGJhaWwgb3V0IGZyb20sIHdoZW4gdXNpbmcgYXJlcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIpCi0gRGVmYXVsdCBDb250ZW50LVR5cGUgZm9yIHBhcnRzIGluIG11bHRpcGFydCBmb3JtcG9zdHMgaGFzIGNoYW5nZWQgdG8KICAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi4gIFRoaXMgc2VlbXMgbW9yZSBhcHByb3ByaWF0ZSwgYW5kIEkgYmVsaWV2ZQogIG1vemlsbGEgYW5kIHRoZSBsaWtlcyBkbyB0aGlzLiBJbiB0aGUgc2FtZSBhcmVhOiAuaHRtbCBmaWxlcyBub3cgZ2V0CiAgdGV4dC9odG1sIGFzIENvbnRlbnQtVHlwZS4gKFBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzgzOTgwNikKCi0gR2lzbGUgVmFuZW0gY29ycmVjdGVkIHRoZSAtLXByb2dyZXNzLWJhciBvdXRwdXQgYnkgZG9pbmcgYSBmbHVzaCBvZiB0aGUKICBvdXRwdXQsIHdoaWNoIGFwcGFyZW50bHkgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gYXQgbGVhc3Qgd2luZG93cywgYnV0CiAgcG9zc2libHkgb3RoZXIgcGxhdGZvcm1zIHRvby4KCi0gUGV0ZXIgU3lsdmVzdGVyIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBjb25uZWN0IGNvZGUsIHdoaWNoIG1hZGUgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIG9uIGEgaXB2Ni1lbmFibGVkIHNvbGFyaXMgYm94IGRvIGJhZC4gVGVzdCBjYXNlIDUwNCB0byBiZQogIHNwZWNpZmljLiBJJ3ZlIHNwZW50IHNvbWUgdGltZSB0byBjbGVhbi11cCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uCiAgbm93IHRvIHVzZSBsZXNzIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHR3byBkaWZmZXJlbnQgc2VjdGlvbnM6IGlwdjYgYW5kCiAgaXB2NC4KCkRhbmllbCAoMTEgTm92ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9ORVRSQ19GSUxFLiBVc2UgdGhpcyB0byB0ZWxsIGxpYmN1cmwgd2hpY2ggZmlsZSB0byB1c2UgaW5zdGVhZAogIG9mIHRyeWluZyB0byBmaW5kIGEgLm5ldHJjIGluIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeS4gVGhlCiAgZXhpc3RpbmcgLm5ldHJjIGZpbGUgZmluZGVyIGlzIHNvbWV3aGF0IG5haXZlIGFuZCBpcyBmYXIgZnJvbSBwZXJmZWN0IG9uCiAgc2V2ZXJhbCBwbGF0Zm9ybXMgdGhhdCBhcmVuJ3QgdW5peC1zdHlsZS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc2V0IHdoZW4KICBDVVJMT1BUX05FVFJDIGlzIHNldCwgdGhlIHByZXZpb3VzIGFwcHJvYWNoIHdpbGwgc3RpbGwgYmUgdXNlZC4KCiAgVGhlIGN1cnJlbnQgLm5ldHJjIGNoZWNrIGNvZGUgbm93IGFsc28gc3VwcG9ydCBsb25nZXIgdGhhbiAyNTYgYnl0ZXMgcGF0aAogIG5hbWVzLgoKRGFuaWVsICgxMCBOb3ZlbWJlcikKLSBLYW5nLUppbiBMZWUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUgc2hvdWxkbid0IGJlCiAgd3JpdHRlbiBpbiB0aGUgc291cmNlIGRpciBpZiBhIGRpZmZlcmVudCBidWlsZCBkaXIgaXMgdXNlZC4KCi0gQWZ0ZXIgU+liYXN0aWVuIFdpbGxlbWlqbnMnIGJ1ZyByZXBvcnQsIHdlIG5vdyBjaGVjayB0aGUgc2VwYXJhdG9ycyBwcm9wZXJseQogIGluIHRoZSAyMjktcmVwbHkgc2VydmVycyByZXNwb25kIG9uIGEgRVBTViBjb21tYW5kIGFuZCBiYWlsIG91dCBiZXR0ZXIgaWYKICB0aGUgcmVwbHkgc3RyaW5nIGlzIG5vdCBSRkMyNDI4LWNvbXBsaWFudC4KCkRhbmllbCAoNyBOb3ZlbWJlcikKLSBCYXNlZCBvbiBHaXNsZSBWYW5lbSdzIHBhdGNoLCBJIG1hZGUgY3VybCB0cnkgaGFyZGVyIHRvIGdldCB0aGUgaG9tZQogIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCBpbiBvcmRlciB0byBmaW5kIHRoZSBkZWZhdWx0IC5jdXJscmMgZmlsZS4KICBXZSdyZSBhbHNvIGNvbnNpZGVyaW5nIG1vdmluZyBvdXQgdGhlIEhPTUUtZGlyIGNvZGUgZnJvbSBsaWJjdXJsLCBhbmQKICBpbnN0ZWFkIGhhdmUgdGhlIGFwcCBwYXNzIGluIHRoZSBwYXRoIHRvIHRoZSAubmV0cmMgZmlsZSAod2hpY2ggaXMgdGhlIG9ubHkKICBsb2dpYyBsZWZ0IGluIGxpYmN1cmwgdGhhdCB1c2VzIHRoZSBIT01FIGRpcikuIFRoZW4gY3VybCBjYW4gdXNlIHRoZSBob21lCiAgZGlyIGZvciB0aGF0IHB1cnBvc2UgdG9vLgoKLSBSYWxwaCBNaXRjaGVsbCdzIHVwZGF0ZWQgdGVzdGN1cmwuc2ggdG8gdGhlIHNjcmlwdCB0byB0YWtlIGFuIGV4aXN0aW5nCiAgZGlyZWN0b3J5IG5hbWUgYW5kIGJ1aWxkL3J1bi90ZXN0IGN1cmwgaW4gdGhlcmUgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXBkYXRlCiAgZnJvbSBDVlMuIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBzY3JpcHQgY2FuIG5vdyBiZSB1c2VkIHRvIHRlc3QgZGFpbHkKICB0YXJiYWxscyBldGMuCgotIEdpc2xlIFZhbmVtIGFkZGVkIGEgInJlc291cmNlIGZpbGUiIHRvIHRoZSBXaW5kb3dzIERMTCBidWlsZHMsIHRvIGNvbnRhaW4KICBpbmZvcm1hdGlvbiBzdWNoIGFzIHZlcnNpb24gbnVtYmVyLCBsaWJyYXJ5IG5hbWUsIGNvcHlyaWdodCBpbmZvIGV0Yy4KCkRhbmllbCAoNiBOb3ZlbWJlcikKLSBjdXJsIGNoZWNrcyBpZiB0aGUgZXhpc3RpbmcgbGliY3VybCBzdXBwb3J0cyB0aGluZ3MgbGlrZSAtLW50bG0sIC0tbmVnb3RpYXRlCiAgYW5kIC0ta3JiNCBhbmQgcmV0dXJucyBlcnJvciBpZiBub3QuCgotIEkgYWRkZWQgdGhyZWUgbmV3IGdsb2JhbCBkZWZpbmVzIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXI6CiAgTElCQ1VSTF9WRVJTSU9OX01BSk9SLCBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgYW5kIExJQkNVUkxfVkVSU0lPTl9QQVRDSC4gVGhleQogIGFyZSB0aGUgdGhyZWUgbnVtYmVycyBpbiB0aGUgbGlicmFyeSdzIHZlcnNpb24gbnVtYmVyLCBzZXBhcmF0ZWQgZm9yIGVhc2llcgogIHVzYWdlLiAnbWFrZXRneicgd2FzIHVwZGF0ZWQgYWNjb3JkaW5nbHkgdG8gZ2VuZXJhdGUgdGhlc2UgbnVtYmVycyBwcm9wZXJseQogIHdoZW4gYnVpbGRpbmcgcmVsZWFzZS1hcmNoaXZlcy4KCi0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXgsIHJlcG9ydGVkIGJ5IGJvdGggTWFydHkgS3VocnQgYW5kIEJlbmphbWluCiAgR2VyYXJkLgoKLSBNYXR0IFZlZW5zdHJhIHByb3ZpZGVkIGJ1aWxkIGZpbGVzIHRvIGJ1aWxkIGxpYmN1cmwgYXMgYSAiZnJhbWV3b3JrIiB1bmRlcgogIE1hYyBPUyBYLiBTZWUgdGhlIGxpYi9saWJjdXJsLmZyYW1ld29yay5tYWtlIGZvciBkZXRhaWxzLgoKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIG9mIFRSVUUgYW5kIEZBTFNFIGZyb20gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBmaWxlLgogIFRoZXkncmUgbm90IGluIG91ciBuYW1lIHNwYWNlIHNvIHdlIHNob3VsZCBub3QgZmlkZGxlIHdpdGggdGhlbS4KCkRhbmllbCAoNSBOb3ZlbWJlcikKLSBSZXBsYWNlZCB0aGUgbWFuIHBhZ2UgdG8gSFRNTCBjb252ZXJ0ZXIgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZTogcm9mZml0LgogIE1ha2VzIG5pY2VyIHdlYiBwYWdlcy4KCkRhbmllbCAoNCBOb3ZlbWJlcikKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHRvIGxldCB0aGVtIGJ1aWxkIGN1cmwgZmluZQogIG9uIFdpbmRvd3MuCgotIEtldmluIFJvdGggY29ycmVjdGVkIHRoZSBjeWd3aW4gcGFja2FnZSBnZW5lcmF0b3IgYW5kIHNwZWxsLWZpeGVkIHRoZQogIGNvbW1lbnQgaW4gdGhlIGNhLWJ1bmRsZS5oIGZpbGUuCgpWZXJzaW9uIDcuMTAuOCAoMSBOb3ZlbWJlciAyMDAzKQoKRGFuaWVsICgzMSBPY3RvYmVyKQotIEFzc3VtZSB0aGF0IE1EVE0gb24gYW4gRlRQIHNlcnZlciByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNpbmcgdGhlIFVUQyB0aW1lCiAgem9uZS4gVGhpcyBjaGFuZ2VzIHRoZSB0aW1lIENVUkxJTkZPX0ZJTEVUSU1FIHJldHVybnMgZm9yIGEgZ2l2ZW4gZmlsZSBvdmVyCiAgRlRQLCBhbmQgd2lsbCBjaGFuZ2UgZXhpc3RpbmcgdXNlcyBvZiBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEl0IHdpbGwgbWFrZQogIHRoZSBmdW5jdGlvbmFsaXR5IG1vcmUgc2ltaWxhciB0byBob3cgdGhlIEhUVFAgb25lIGlzIGFscmVhZHkgd29ya2luZy4KCi0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWNhbCBwYXJhbWV0ZXJzIChzdWNoIGFzIC15LCAtWSwgLUMgZXRjKQogIG5vdyByZXBvcnQgZXJyb3IgYW5kIGV4aXQgaWYgdGhlIHBhcmFtZXRlciBpc24ndCB0cnVseSBhIG51bWJlciBncmVhdGVyIHRoYW4KICBvciBlcXVhbCB0byB6ZXJvLiBUaGlzIGhlbHBzIHVzZXJzIHRvIG5vdGljZSBiYWQgdXNhZ2UgZWFybGllci4gQmVmb3JlLCB3aGVuCiAgYSB1c2VyIGZvcmdvdCBvciBtaXNzZWQgdG8gYWRkIGEgbnVtZXJpY2FsIHBhcmFtZXRlciB0byBhbiBvcHRpb24sIHRoZQogIGNvbW1hbmQgbGluZSBwYXJzZXIgd291bGQgc2ltcGx5ICJlYXQiIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFuZCBpdCB3b3VsZAogIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbi4KCkRhbmllbCAoMzAgT2N0b2JlcikKLSBEYXZpZCBIdWxsIG1hZGUgbGliY3VybCBkZWFsIHdpdGggTk9CT0RZIGFuZCBIRUFERVIgZm9yIGZpbGU6Ly8gdGhlIHNhbWUgd2F5CiAgaXQgYWxyZWFkeSBkb2VzIGZvciBGVFA6IGl0IHByb3ZpZGVzIEhUVFAtbG9va2luZyBoZWFkZXJzIHRoYXQgcHJvdmlkZSBpbmZvCiAgb25seSBhYm91dCB0aGUgZmlsZSwgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zZmVyLiBUaGUgY3VybCB0b29sIHRoZW4KICBsZXRzIC0taGVhZCBkbyB0aGlzLgoKRGFuaWVsICgyOSBPY3RvYmVyKQotIHJ1bnRlc3RzLnBsIG5vdyBjaGVja3MgZm9yIGFuZCB1c2UgdmFsZ3JpbmQgaWYgcHJlc2VudC4gSXQgd2lsbCByZWRpcmVjdCB0aGUKICB2YWxncmluZCByZXN1bHRzIGluIGxvZy92YWxncmluZFtudW1dIGJ1dCBpdCBjdXJyZW50bHkgZG9lc24ndCBzY2FuIHRoYXQKICBmaWxlIGZvciBhbnkgZXJyb3JzIG9yIGFueXRoaW5nLCB0aGF0IGlzIHN0aWxsIG9ubHkgbWFkZSBtYW51YWxseS4KCi0gRGF2aWQgSHVsbCBtYWRlIHRoZSBmaWxlOiBVUkwgcGFyc2VyIGFsc28gYWNjZXB0IHRoZSBzb21ld2hhdCBzbG9wcHkgZmlsZQogIHN5bnRheDogZmlsZTovcGF0aC4gSSBhZGRlZCB0ZXN0IGNhc2UgMjAzIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyOCBPY3RvYmVyKQotIERhbiBDIHRyYWNrZWQgZG93biB5ZXQgYW5vdGhlciB3ZWlyZCBiZWhhdmlvciBpbiB0aGUgZ2xpYmMgZ2V0aG9zdGJ5bmFtZV9yKCkKICBmdW5jdGlvbiBmb3Igc29tZSBzcGVjaWZpYyB2ZXJzaW9ucyAocmVwb3J0ZWQgb24gMi4yLjUgYW5kIDIuMS4xKSwgYW5kCiAgcHJvdmlkZWQgYSBmaXguIE9uIExpbnV4IG1hY2hpbmVzIHdpdGggdGhlc2UgZ2xpYmMgdmVyc2lvaW5zLCBub24taXB2NgogIGJ1aWxkcyBvZiBsaWJjdXJsIHdvdWxkIG9mdGVuIGZhaWwgdG8gcmVzb2x2ZSBwZXJmZWN0bHkgcmVzb2x2YWJsZSBob3N0CiAgbmFtZXMuCgpEYW5pZWwgKDI2IE9jdG9iZXIpCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9tc25wcmludGYoKSBjb3VsZCB3cml0ZSB0aGUgdHJhaWxpbmcKICB6ZXJvLWJ5dGUgb3V0c2lkZSBpdHMgZ2l2ZW4gYnVmZmVyIHNpemUuIFRoaXMgY291bGQgaGFwcGVuIGlmIHlvdSBnZW5lcmF0ZWQKICBhIHZlcnkgbG9uZyBlcnJvciBtZXNzYWdlIGFzIHRoZW4gbGliY3VybCB3b3VsZCBvdmVyd3JpdGUgdGhlIEVSUk9SQlVGRkVSCiAgd2l0aCBvbmUgYnl0ZS4gVXNpbmcgYSBub24tZXhpc3RpbmcgdmVyeSBsb25nIGxvY2FsIGZpbGU6Ly8gbmFtZSBpcyBvbmUgY2FzZQogIHRoYXQgY291bGQgbWFrZSB0aGlzIG9jY3VyLgoKRGFuaWVsICgyNCBPY3RvYmVyKQotIERhdmlkIEh1bGwgZmlsZWQgYnVnIHJlcG9ydCAjODI5ODI3LiBJdCBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aXRoIC1DIC0gaWYKICB0aGUgZnVsbCBmaWxlIGFscmVhZHkgd2FzIGRvd25sb2FkZWQgYW5kIHRodXMgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhCiAgNDE2LiBsaWJjdXJsIHdvdWxkIHRoZW4gd3JvbmdseSB1c2UgdGhlIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXIgYW5kIGV4cGVjdAogIHRoYXQgc2l6ZSB0byBnZXQgdHJhbnNmZXIsIGNhdXNpbmcgYSAiaGFuZyIgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbiBhbmQgdGhlbiBhbiBlcnJvciAxOCAoInN0aWxsIE4gYnl0ZXMgZGF0YSBsZWZ0IG9mIHRoZSB0cmFuc2ZlciIpLgoKICBOb3cgd2UgZG9uJ3QgcmV0dXJuIGFueSBlcnJvciBhdCBhbGwsIGJ1dCBJIHRoaW5rIGxpYmN1cmwgc2hvdWxkIHBlcmhhcHMKICByZXR1cm4gc29tZSBraW5kIG9mIGluZm8gc2luY2UgdGhlIHJlcXVlc3RlZCByYW5nZSB3YXMgb3V0IG9mIHRoZSBzaXplIG9mCiAgdGhlIGRvY3VtZW50LgoKLSBCYXNlZCBvbiBEYXZpZCBIdWxsJ3MgZml4IGluIGJ1ZyByZXBvcnQgIzgwNDU5OSwgd2Ugbm93IGNoZWNrIGZvciBzb2xhcmlzIGFuZAogIGdjYyBpbiBjb25maWd1cmUgYW5kIHNldCB0aGUgLW1pbXB1cmUtdGV4dCBsaW5rIGZsYWcgZm9yIGxpbmtpbmcgdGhlIGxpYgogIGJldHRlci4KCi0gSSd2ZSBpbnRyb2R1Y2VkIGEgLXQgb3B0aW9uIHRvIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQuIFdpdGggdGhhdCBvcHRpb24gc2V0LAogIHRoZSBzY3JpcHQgcnVucyBzcGVjaWFsICJtZW1vcnkgdG9ydHVyZSIgdGVzdHMuIEZvciBlYWNoIHRlc3QgY29tbWFuZCBsaW5lCiAgaW4gdGhhdCBzZWN0aW9uLCB0aGUgc2NyaXB0IGZpcnN0IHJ1bnMgdGhlIGNvbW1hbmQgbGluZSBhbmQgY291bnRzIHRoZSB0b3RhbAogIGFtb3VudCBvZiBhbGxvY2F0aW9ucyBtYWRlLiBJdCB0aGVuIHJ1bnMgdGhlIGV4YWN0IHNhbWUgY29tbWFuZCBsaW5lIGFnYWluLAogIGZvcmNpbmcgYWxsb2NhdGlvbiBudW1iZXIgTiB0byBmYWlsLiBJdCB3aWxsIHRyeSBldmVyeSBOIGZyb20gMSB0byB0aGUgdG90YWwKICBudW1iZXIgb2YgYW1vdW50cyBtYWRlLiBGb3IgZXZlcnkgaW52b2tlLCBpdCBjaGVja3MgdGhhdCBubyBtZW1vcnkgd2FzCiAgbGVha2VkIGFzIHRoYXQgd291bGQgaW5kaWNhdGUgYSBiYWQgY2xlYW51cCBzb21ld2hlcmUgaW4gdGhlIGNvZGUuCgogIFRoaXMgaXMganVzdCBiZWdpbm5pbmcgdG8gd29yaywgYW5kIEkndmUgYWxyZWFkeSBtYWRlIHNvbWUgY29ycmVjdGlvbnMgaW4KICBsaWJjdXJsIGNvZGUuIFdoZW4gdGhpcyBjb2RlIHdvcmtzIHNvbWV3aGF0IGZpbmUsIEknbGwgbWFrZSBzdXJlICdtYWtlIHRlc3QnCiAgaW4gdGhlIHJvb3QgZGlyIHdpbGwgcnVuIHRoZXNlIHRlc3RzIGFzIHdlbGwuCgpEYW5pZWwgKDIzIE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBmaXhlZCBob3cgdGhlIENBIHZlcmlmaWNhdGlvbiBpcyBtYWRlLiBWZXJpZmljYXRpb25zIGNhbiBub3cgYmUKICBtYWRlIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgdGhlIHJlc3VsdCBvZiBpdCBjYW4gYmUgaWdub3JlZC4gVGhpcyBhbHNvCiAgYWZmZWN0cyB0aGUgY3VybCB0b29sIGFzIC1rIGNhbiBub3cgYmUgdXNlZCB0b2dldGhlciB3aXRoIC0tY2FjZXJ0IG9yCiAgLS1jYXBhdGguCgpEYW5pZWwgKDIyIE9jdG9iZXIpCi0gR2lzbGUgVmFuZW0gZm91bmQgb3V0IC0tZGlzYWJsZS1lcHJ0IGRpZG4ndCB3b3JrIGFuZCBwYXRjaGVkIGl0LgoKLSBUZXN0IGNhc2UgOTEgd2FzIG1vZGlmaWVkIGFuZCBjb3VsZCBub3cgcmVwZWF0IHRoZSBwcm9ibGVtIEtldmluIFJvdGggaGFzCiAgcmVwb3J0ZWQsIGFuZCB0aGUgYnVnIHdhcyBmaXhlZC4KCi0gRHlsYW4gRWxsaWNvdHQgYWRkZWQgdmMtbGliY3VybC1zc2wtZGxsIGFzIGEgdGFyZ2V0IHRvIHRoZSByb290IG1ha2VmaWxlCiAgdG8gYnVpbGQgYSBzdGF0aWMgbGliY3VybCB0aGF0IGxpbmtzIHdpdGggYSBzaGFyZWQgT3BlblNTTCB1c2luZyBNU1ZDLgoKRGFuaWVsICgyMSBPY3RvYmVyKQotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3czMiBtYWtlZmlsZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmU1ICgyMSBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE5IE9jdG9iZXIpCi0gR2VvcmcgSG9ybiBtYWRlIGxpYmN1cmwgb3V0cHV0IG1vcmUgaW5mbyBvbiBTU0wgZmFpbHVyZXMgd2hlbiByZWNlaXZpbmcKICBkYXRhLgoKVmVyc2lvbiA3LjEwLjgtcHJlNCAoMTggT2N0b2JlciAyMDAzKQoKRGFuaWVsICgxNyBPY3RvYmVyKQotIERvbWluaWNrIE1lZ2xpbyBpbXBsZW1lbnRlZCBDVVJMT1BUX01BWEZJTEVTSVpFIGFuZCAtLW1heC1maWxlc2l6ZS4KCi0gTWFkZSBsaWJjdXJsIHNob3cgdmVyYm9zZSBpbmZvIGFib3V0IHdoYXQgYXV0aCB0eXBlIGFuZCB1c2VyIG5hbWUgdGhhdCBpcwogIGJlaW5nIHNlbnQgaW4gaXRzIEhUVFAgcmVxdWVzdC1oZWFkZXJzLgoKRGFuaWVsICgxNiBPY3RvYmVyKQotIFJlbW92ZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiBhbmQgQ1VSTE9QVF9QQVNTV0REQVRBLiBsaWJjdXJsCiAgbm8gbG9uZ2VyIHByb21wdCBmb3IgcGFzc3dvcmRzIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBQYXNzd29yZCBwcm9tcHRpbmcKICB3YXMgaW5zdGVhZCBtb3ZlZCB0byBjdXJsLCB3aGljaCBub3cgcHJvbXB0cyBmb3IgcGFzc3dvcmQgaWYgLXUgb3IgLVUgbGFjawogIGl0LiBUaGlzIHNvbHZlcyB0aGUgcHJvYmxlbSBLZXZpbiBSb3RoIHJlcG9ydGVkIHdoZW4gY3VybCBwcm9tcHRlZCBmb3IKICBwYXNzd29yZCB0d2ljZSB3aGVuIGRvaW5nIE5UTE0gYXV0aGVudGljYXRpb24uCgotIEkgcmV3cm90ZSB0aGUgU1NMIHN1YmplY3RBbHROYW1lIGNoZWNrIHRvIGF2b2lkIGhhdmluZyB0byByZWx5IG9uIE9wZW5MREFQLQogIGxpY2Vuc2VkIGRlcml2YXRlIGNvZGUuCgpEYW5pZWwgKDE1IE9jdG9iZXIpCi0gQXZvaWQgZG9pbmcgZ2V0c29ja29wdCgpIG9uIFdpbmRvd3MgdG8gdmVyaWZ5IGNvbm5lY3RzLiBJdCBzZWVtcyB0aGF0IHRoaXMKICBob2dzIFdpbmRvd3MgbWFjaGluZXMgd2hlbiBsaWJjdXJsIGlzIGJlaW5nIHVzZWQgbXVsdGktdGhyZWFkZWQgKHdpdGggPiB+NTAKICB0aHJlYWRzKS4gQW5kcmV3IEZ1bGxlciBoZWxwZWQgdXMgdmVyaWZ5IGFuZCB0ZXN0IHRoaXMuCgpEYW5pZWwgKDE0IE9jdG9iZXIpCi0gS2ltbW8gS2lubnVuZW4gZml4ZWQgYSBjcmFzaCB3aXRoIGR1cGhhbmRsZSgpIHdoZW4gQ1VSTERFQlVHIGlzIHNldC4KCi0gR2lzbGUgVmFuZW0gbWFkZSBsaWJjdXJsIGJ1aWxkIGFuZCB3b3JrIHdpdGggSVB2NiBvbiBXaW5kb3dzLgoKRGFuaWVsICgxMyBPY3RvYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgcmVwb3J0ZWQgeWV0IGFub3RoZXIgc2VnZmF1bHQgd2l0aCBhcmVzIGFuZCB0aGUgbXVsdGkKICBpbnRlcmZhY2UuIE1lIGZpeGVkLgoKLSBEb21lbmljbyBBbmRyZW9saSByZW1vdmVkIHRoZSBleHRyYSBMREZMQUdTIGFzc2lnbm1lbnQgaW4gbGliL01ha2VmaWxlLmFtCiAgdGhhdCB3YXMgcmVwb3J0ZWQgYWJvdXQgaW4gdGhlIGRlYmlhbiBidWcgcmVwb3J0ICMyMTIwODYuCgogIERvbWVuaWNvIGFsc28gZml4ZWQgdHdvIG1ha2VmaWxlcyB3aGVyZSB3ZSB1c2VkICdnbnJvZmYnIGluc3RlYWQgb2YgdGhlIG1vcmUKICBwb3J0YWJsZSAkKE5ST0ZGKS4KCkRhbmllbCAoMTIgT2N0b2JlcikKLSBEaXJrIE1hbnNrZSBtYWRlIHRoZSBzaGFyZSBsb2NraW5nIGFyb3VuZCBETlMgbG9va3VwcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8KICBhbGxvdyB0aGUgc2hhcmUgc3lzdGVtJ3MgRE5TIGxvb2t1cHMgdG8gcnVuIHNvbWV3aGF0IG1vcmUKICBpbmRlcGVuZGVudC9mYXN0ZXIuCgpEYW5pZWwgKDkgT2N0b2JlcikKLSBMYWNobGFuIE8nRGVhIGZpeGVkIGEgcmVzdW1lIHByb2JsZW06ICJJZiBJIHNldCBDVVJMT1BUX1JFU1VNRV9GUk9NLCBwZXJmb3JtCiAgYW4gSFRUUCBkb3dubG9hZCwgdGhlbiByZXNldCBDVVJMT1BUX1JFU1VNRV9GUk9NIHRvIDAsIHRoZSBuZXh0IGRvd25sb2FkCiAgc3RpbGwgaGFzIGEgUmFuZ2UgaGVhZGVyIHdpdGggYSBnYXJiYWdlIHZhbHVlLiIgYnVnIHJlcG9ydCAjODIwNTAyCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIHRoZSBpbmV0X3B0b24uYyBmaWxlIGJ1aWxkIGZpbmUgdXNpbmcgTVNWQy4KCi0gVGhlICdzd3MnIHRlc3Qgc3VpdGUgd2ViIHNlcnZlciBub3cgI2luY2x1ZGUgc2V0dXAuaCBmcm9tIHRoZSBsaWIgZGlyZWN0b3J5LgogIFRoaXMgbWFrZXMgaXQgbW9yZSBwb3J0YWJsZSBlYXNpZXIuCgpWZXJzaW9uIDcuMTAuOC1wcmUzICg4IE9jdG9iZXIgMjAwMykKCkRhbmllbCAoOCBPY3RvYmVyKQotIEZyYW5rIFRpY2hlbGVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBmaXhlcyBob3cgbGliY3VybCBjb25uZWN0cyB0byBtdWx0aXBsZQogIGFkZHJlc3NlcywgaWYgb25lIG9mIHRoZW0gZmFpbHMgKGlwdjQtY29kZSkuCgpEYW5pZWwgKDcgT2N0b2JlcikKLSBOZWlsIER1bmJhciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgY2hlY2sgU1NMCiAgc3ViamVjdEFsdE5hbWVzIHdoZW4gbWF0Y2hpbmcgY2VydHMuIFRoaXMgaXMgYXBwYXJlbnRseSBkZXRhaWxlZCBpbiBSRkMyODE4CiAgYXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiBJIGhhZCB0byBhZGQgY29uZmlndXJlIGNoZWNrcyBmb3IgaW5ldF9wdG9uKCkgYW5kCiAgb3VyIG93biAoc3RyaWN0bHkgc3BlYWtpbmcsIGNvZGUgZnJvbSBCSU5EIHdyaXR0ZW4gYnkgUGF1bCBWaXhpZSkgcHJvdmlkZWQKICBjb2RlIGZvciB0aGUgZnVuY3Rpb24gZm9yIHBsYXRmb3JtcyB0aGF0IG1pc3MgaXQuCgotIEhUVFAgUE9TVCB1c2luZyB0aGUgcmVhZCBjYWxsYmFjayBkaWRuJ3Qgd29yaywgYXMgRmxvcmlhbiBTY2hvcHBtYW5uCiAgcmVwb3J0ZWQuCgpEYW5pZWwgKDUgT2N0b2JlcikKLSBTaGFyZWQgcHJvdmlkZWQgYSBmZXcgZml4ZXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG9uIEJlT1MKICBvdXQtb2YtdGhlLWJveC4gTmV3IGNvZGUgZm9yIEJlT1Mtc3R5bGUgbm9uLWJsb2NraW5nIHNvY2tldHMsIHByb3ZpZGVkIGJ5CiAgU2hhcmQgYW5kIEplcmVteSBGcmllc25lci4gTW9kaWZpZWQgdGhlIGF1dG9jb25mIGNoZWNrIGZvciBub24tYmxvY2tpbmcKICBzb2NrZXRzIHRvIGNoZWNrIGZvciB0aGlzIGtpbmQgdG9vLgoKRGFuaWVsICg0IE9jdG9iZXIpCi0gVmluY2VudCBCcm9ubmVyIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHNldCBDVVJMT1BUX0NPT0tJRSBmb3IgYSB0cmFuc2ZlcgogIGFuZCB0aGVuIHNldCBpdCB0byBOVUxMIGluIGEgc3Vic2VxdWVudCBvbmUsIHRoZSBwcmV2aW91cyBjb29raWUgd2FzIHN0aWxsCiAgc2VudCBvZmYhCgotIEpvbiBUdXJuZXIgZml4ZWQgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gaXQgZmFpbGVkIG9uIGFuIEZUUCB0cmFuc2ZlciBkdWUKICB0byBhIGJhZCBwYXRoLCBpdCB3b3VsZCBjYXVzZSB0aGUgbmV4dCB0cmFuc2ZlciB0byB1c2UgYSBiYWQgcGF0aCBhcyB3ZWxsLgoKLSBTaWRkaGFydGhhIFByYWthc2ggSmFpbiBwcm92aWRlZCBhIHBhdGNoIHdpdGggYSBmaXggZm9yIGxpYmN1cmwgd2l0aCBhcmVzLAogIHdoZW4gd29ya2luZyBvbiBJUC1vbmx5IG5hbWVzIGFzIHdlIHRoZW4gY291bGQgcmV0dXJuICJ3YWl0IiBzdGF0dXMgd2hlbiB0aGUKICBuYW1lIGluIGZhY3QgYWxyZWFkeSB3YXMgcmVzb2x2ZWQuIEkgZWRpdGVkIHRoZSBwYXRjaCBzbGlnaHRseSB0byBub3QgZXhwb3NlCiAgYXN5bmMgZGV0YWlscyB0byBub24tYXJlcyBhd2FyZSBzb3VyY2UgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyKQotIE5laWwgU3ByaW5nIHBvc3RlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMzE4MCwgYW5kIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcKICB0aGUgbmFtZSAnYWNjZXNzJyBpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZSBpcyBub3QgdmVyeSB3aXNlIGFzIHNvbWUgY29tcGlsZXJzCiAgY29tcGxhaW4uCgotIFBldGVyIFN5bHZlc3RlciBwcm92aWRlZCBoaXMgYW5kIEplYW4tUGF1bCBNZXJsaW4ncyBjdXJseC5jIGV4YW1wbGUgc291cmNlCiAgY29kZSB0aGF0IHNob3dzIGhvdyB0aGV5IHVzZSBzc2wgYW5kIGNhbGxiYWNrcy4KCkRhbmllbCAoMiBPY3RvYmVyKQotIEphbWVzIE1hY01pbGxhbidzIHBhdGNoIG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYuMi54LgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIpCi0gTXkgZGF1Z2h0ZXIgd2FzIGJvcm4hCgpEYW5pZWwgKDIzIFNlcHRlbWJlcikKLSBBZGRlZCBzdXBwb3J0IGZvciAtNC8tLWlwdjQgYW5kIC02Ly0taXB2NiB0byBmb3JjZSBuYW1lcyB0byByZXNvbHZlIHRvIHRoYXQKICBwYXJ0aWN1bGFyIElQIHZlcnNpb24uIFRoZXkgb25seSB3b3JrIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgotIGN1cmwgLVYgbm93IG91dHB1dHMgJ1NQTkVHTycgYXMgYSBmZWF0dXJlIGluIGNhc2UgbGliY3VybCB3YXMgYnVpbHQgdG8KICBzdXBwb3J0IHRoYXQuCgpWZXJzaW9uIDcuMTAuOC1wcmUyICgyMiBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoMjIgU2VwdGVtYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYSBzZWdmYXVsdCBpbiBsaWJjdXJsIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIHdpdGggYXJlcyBhbmQgZG9pbmcgcmVwZWF0ZWQgb3BlcmF0aW9ucyBhZ2FpbnN0IGEgbm9uLXJlc29sdmluZyBob3N0IG5hbWUuCgpEYW5pZWwgKDE5IFNlcHRlbWJlcikKLSBBZGRlZCB0aGUgQ1VSTE9QVF9JUFJFU09MVkUgb3B0aW9uLCB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWxlY3QKICB3aGF0IGtpbmQgb2YgSVAgYWRkcmVzc2VzIGhlIHdhbnRzIHRvIHVzZSB3aGVuIHJlc29sdmluZyBob3N0IG5hbWVzLiBUaGlzCiAgaXMgb25seSBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIGhvc3QgbmFtZXMgdGhhdCByZXNvbHZlIGFkZHJlc3NlcyB1c2luZyBtb3JlCiAgdGhhbiBvbmUgdmVyc2lvbiBvZiBJUC4KCi0gQXBwbGllZCBNYXJrdXMgTW9lbGxlcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBTUE5FR08gc3VwcG9ydCBpZiBsaWJjdXJsCiAgaXMgYnVpbHQgd2l0aCB0aGUgRkJvcGVuc3NsIGxpYnJhcmllcy4gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucwogIGluZm8gb24gU1BORUdPIGF2YWlsYWJpbGl0eS4gVGhlIHBhdGNoIGFsc28gbWFkZSB0aGUgR1NTQVBJIHN0dWZmIHdvcmsgZmluZQogIHdpdGggdGhlIE1JVCBHU1MtbGlicmFyeSAodGhlIEhlaW1kYWwgb25lIHN0aWxsIHdvcmtzIHRvbykuCgpEYW5pZWwgKDE2IFNlcHRlbWJlcikKLSBEb2luZyBQVVQgd2l0aCAtLWRpZ2VzdCBmYWlsZWQsIGFzIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzgwNTg1My4KCi0gVXNpbmcgLS1hbnlhdXRoIHRoYXQgcGlja2VkIE5UTE0sIGFuZCB0aGVuIGEgcmVkaXJlY3QgY2xvc2VkIHRoZSBjb25uZWN0aW9uCiAgYW5kIHRvb2sgY3VybCB0byBhIHNlY29uZCBOVExNIHBhZ2UgbWFkZSBjdXJsIGZhaWwuIEJ1ZyByZXBvcnQgIzgwNjMyOAogIGlkZW50aWZpZWQgdGhlIHByb2JsZW0sIHRlc3QgY2FzZSA5MCB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE0IFNlcHRlbWJlcikKLSBjb2RlbWFzdHIgYnJvdWdodCBhIHBhdGNoIGZvciBhcmVzIHRvIG1ha2UgdGhlIFdpbmRvd3MgcG9ydGlvbnMgb2YgaXQgd29yawogIHByb3Blcmx5IG9uIE5UNC4gSSB1cGxvYWRlZCBhIG5ldyBkaWZmIGFuZCB1cGRhdGVkIHRoZSBkb2NzIG9uIHdoZXJlIHRvIGdldAogIGl0IGV0Yy4KCi0gSmVmZiBQb2hsbWV5ZXIgdHJhY2tlZCBkb3duIGEgdmVyeSBoYXJkLXRvLWZpbmQgYnVnIHdoZXJlIHdlIHJlbW92ZWQgYQogIGNhY2hlZCBETlMgZW50cnkgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGluIHVzZSwgd2hpY2ggY2F1c2VkICJyYW5kb20iIG1lbW9yeQogIHRvIGdldCBvdmVyd3JpdHRlbiBhbmQgdGh1cyAicmFuZG9tIiBjcmFzaGVzLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIpCi0gQmFzZWQgb24gYSBidWcgcmVwb3J0IGJ5IERhdmlkIEtpbWRvbiwgSSBtYWRlIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2xlYXIKICBhbGwgcG9zc2libGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4KCi0gQnkgZGVmYXVsdCwgZWFzeSBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSBub3cgc2hhcmUgRE5TIGNhY2hlLgoKLSBUaW0gQmFydGxleSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgR1NTTkVHT1RJQVRFIG9wdGlvbiB3b3JrIGZvcgogIE1pY3Jvc29mdCdzICJOZWdvdGlhdGUiIGF1dGhlbnRpY2F0aW9uIGFzIHdlbGwuCgpEYW5pZWwgKDExIFNlcHRlbWJlcikKLSBBIHplcm8tbGVuZ3RoIHByb3h5IHN0cmluZyBjb25mdXNlZCBGVFAgdHJhbnNmZXJzLgoKLSBCam9ybiBSZWVzZSBmb3VuZCBhIGNhc2Ugd2l0aCBhbiB1bmluaXRpYWxpemVkIHBvaW50ZXIsIG9ubHkgcHJlc2VudCB3aGVuCiAgYnVpbHQgZm9yIGFyZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmUxICg4IFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICg3IFNlcHRlbWJlcikKLSBKdXJpaiBTbWFrb3YgZm91bmQgb3V0IHRoYXQgdGhlIG5vbi1PcGVuU1NMIE1ENSBjb2RlIHdhcyBub3Qgd29ya2luZyBvbgogIEFscGhhIChvciBpYTY0KS4gT25seSB0aGUgT3BlblNTTC12ZXJzaW9uIGRpZC4gSSBtYWRlIGEgZml4IEkgdGhpbmsgY29ycmVjdHMKICB0aGUgcHJvYmxlbS4gCgpEYW5pZWwgKDUgU2VwdGVtYmVyKQotIEtldmluIEZpc2sgcmVwb3J0ZWQgdGhhdCBjb25maWd1cmUgLS1lbmFibGUtdGhyZWFkIGRpZG4ndCB3b3JrLiBJIGZpeGVkLgoKLSBEZS1tYWNyb2ZpZWQgdGhlIGxpYi9oYXNoLmMgc291cmNlIGNvZGUgc29tZXdoYXQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyKQotIENVUkxJTkZPX0hUVFBBVVRIX0FWQUlMIGFuZCBDVVJMSU5GT19QUk9YWUFVVEhfQVZBSUwgYWRkZWQsIEJhc2VkIG9uIEpvZXJnCiAgTXVlbGxlci1Ub2xrJ3MgcGF0Y2gsCgpFYXJseSAoNCBTZXB0ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVCAtIGFsbG93cyB1c2VyIHRvIHNldCBzdHJpY3QgdGltZW91dAogIHJlcXVpcmVtZW50cyBvbiB0aGUgRlRQIHNlcnZlcidzIGFiaWxpdHkgdG8gcmVzcG9uZCB0byBpbmRpdmlkdWFsIGNvbW1hbmRzCiAgd2l0aG91dCBwbGFjaW5nIGdsb2JhbCByZXF1aXJlbWVudHMgb24gdHJhbnNmZXIgb3IgY29ubmVjdCB0aW1lLiAgRmlsZXMKICBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGJyYW5jaCBpbnNpZGUgQ3VybF9HZXRGVFBSZXNwb25zZSB0byBjaGVjayBmb3IgCiAgICAgICAgZGF0YS0+c2V0LmZ0cF9yZXNwb25zZV90aW1lb3V0CiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfcmVzcG9uc2VfdGltZW91dCB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCkRhbmllbCAoMyBTZXB0ZW1iZXIpCi0gUGV0ZXIgUGVudGNoZXYgZm91bmQgYW5kIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgdGVzdCBzdWl0ZSdzIHdlYiBzZXJ2ZXIKICBjb2RlLCB0aGF0IG1hZGUgaXQgc2VnZmF1bHQgYXQgdGltZXMuCgotIEr2cmcgTXVlbGxlci1Ub2xrIGltcHJvdmVkIHRoZSBwcm94eSB1c2VyK3Bhc3N3b3JkIGhhbmRsaW5nLCBlc3BlY2lhbGx5CiAgd2hlbiBwcm92aWRpbmcgYSBibGFuayBwYXNzd29yZC4KCkRhbmllbCAoMiBTZXB0ZW1iZXIpCi0gRml4IGZvciBtYWtpbmcgQ09OTkVDVCB0byBwcm94aWVzIGRvIHRoZSBjb3JyZWN0IG1hZ2ljIHRvIGFsbG93IE5UTE0sIERpZ2VzdAogIGFuZCBzaW1pbGFyIHRvIHdvcmsuCgpEYW5pZWwgKDEgU2VwdGVtYmVyKQotIEhlbnJpayBTdG9ybmVyIG1hZGUgbGliY3VybCB3b3JrIGZpbmUgd2l0aCBPcGVuTERBUCAyLjEuMjIgKGN1cnJlbnQpLgoKLSBKZWZmIFBvaGxtZXllciBhZGRlZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIGZvciBub24tcmVzb2x2aW5nIGhvc3RzIHdoZW4KICB1c2luZyBhcmVzIGZvciBsb29rdXBzLgoKRGFuaWVsICgyNSBBdWd1c3QpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIHRoYXQgY3VybCAtayBzdGlsbCBmYWlsZWQgaWYgdGhlIEhUVFBTIHNlcnZlcidzIENOCiAgZmllbGQgd2Fzbid0IG9idGFpbmFibGUuIFRoaXMgd2FzIGR1ZSB0byB0aGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBiZWluZwogIHNldCB0byAxLCBhbmQgbGliY3VybCBmYWlsZWQgaWYgdGhlIENOIHdhcyBtaXNzaW5nLiBTdGFydGluZyBub3csIGhhdmluZyBpdAogIHNldCB0byAxIHdpbGwgc2ltcGx5IG91dHB1dCBhIHdhcm5pbmcgaWYgbm8gQ04gY291bGQgYmUgb2J0YWluZWQgKGFzIGhhdmluZwogIGEgbWlzbWF0Y2ggaXMgT0spLgoKRGFuaWVsICgyMSBBdWd1c3QpCi0gVmluY2VudCBTYW5kZXJzIHByb3ZpZGVkIGEgZml4IGZvciBuYW1lIHJlc29sdmluZyB3aGVuIGxpbmtlZCB3aXRoIHVDbGliYy4KCkRhbmllbCAoMjAgQXVndXN0KQotIEdlcmQgdi4gRWdpZHkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RvcmUgdGhlIEZUUCByZXNwb25zZQogIGNvZGUgZnJvbSBmdHAgc2VydmVycy4gVXNpbmcgY3VybF9lYXN5X2dldGluZm8oKSB3aXRoIENVUkxJTkZPX0hUVFBfQ09ERQogIHJldHVybnMgdGhhdCBkYXRhLiBUaGUgb3B0aW9uIGlzIHRoZXJlZm9yZSBub3cgYWxzbyBrbm93biBhcwogIENVUkxJTkZPX1JFU1BPTlNFX0NPREUuCgotIEFudG9pbmUgQ2FsYW5kbyBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gZG9pbmcgbXVsdGktcGFydC9mb3JtcG9zdCB1c2luZwogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgotIEFudG9pbmUgQ2FsYW5kbyBwb2ludGVkIG91dCB0aGF0IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgZGlkbid0IHNldCB0aGUKICBtc2dzX2luX3F1ZXVlIHRvIDAgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgTlVMTC4KCkRhbmllbCAoMTkgQXVndXN0KQotIEkgbWFkZSBjdXJsIHN1cHBvcnQgbXVsdGlwbGUgLVQgb3B0aW9ucywgYXMgd2VsbCBhcyAtVCAie2ZpbGUxLGZpbGUyfSIKICBzdHlsZSBnbG9iYmluZy4gT25lIC1UIGZvciBlYWNoIFVSTCBpcyBzdXBwb3J0ZWQuCgotIEplZmYgUG9obG1leWVyIGZvdW5kIGEgc2VnZmF1bHQgd2hlbiB1c2luZyBhcmVzLWVuYWJsZWQgbGliY3VybCBhbmQgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIHdoZW4gdHJ5aW5nIGEgbm9uLWV4aXN0aW5nIGhvc3QgbmFtZS4KCi0gTWFkZSB0aGUgbGliY3VybCBwcmludGYgY29kZSBzdXBwb3J0IGxvbmcgbG9uZ3MgaWYgYXZhaWxhYmxlLgoKLSBMb3JlbiBLaXJrYnkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBkaWQgbm90IGNsZWFuIHVwIGFsbCBTU0wtYWxsb2NhdGVkIG1lbW9yeQogIGluIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KCkRhbmllbCAoMTcgQXVndXN0KQotIFNldHRpbmcgQ1VSTE9QVF9XUklURUZVTkNUSU9OIG9yIENVUkxPUFRfUkVBREZVTkNUSU9OIHRvIE5VTEwgd2lsbCBub3cgbWFrZQogIHRoZW0gZ2V0IHRoZSBpbnRlcm5hbCBkZWZhdWx0cyByZXN0b3JlZC4gUHJldmlvdXNseSB0aGlzIGNvdWxkIGNhdXNlIGEKICBzZWdmYXVsdC4gV2Ugc2hvdWxkIGFpbSBhdCBoYXZpbmcgYWxsIHBvaW50ZXItcmVsYXRlZCBvcHRpb25zIGdldCByZXN0b3JlZAogIHRvIGRlZmF1bHQvc2FmZSB2YWx1ZXMgd2hlbiBzZXQgdG8gTlVMTC4KClZlcnNpb24gNy4xMC43ICgxNSBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTQgQXVndXN0KQotIEkgbW9kaWZpZWQgdGhlIG1lbWRlYnVnIHN5c3RlbSB0byByZXR1cm4gZmFpbHVyZSBvbiBtZW1vcnkgYWxsb2NhdGlvbgogIGZ1bmN0aW9ucyBhZnRlciBhIHNldCBhbW91bnQgb2Ygc3VjY2Vzc2Z1bCBvbmVzLiBUaGlzIGVuYWJsZXMgdXMgdG8gdGVzdAogIG91dC1vZi1tZW1vcnkgc2l0dWF0aW9ucyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyIGFuZCB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQKICBjdXJsL2xpYmN1cmwgYmVoYXZlcyBnb29kIGluIHRob3NlLgoKICBUaGlzIG1hZGUgbWUgZmluZCBhbmQgZml4IHNldmVyYWwgc3BvdHMgd2hlcmUgd2UgZGlkIG5vdCBjbGVhbnVwIHByb3Blcmx5CiAgd2hlbiBiYWlsaW5nIG91dCBkdWUgdG8gZXJyb3JzIChsb3cgbWVtb3J5KS4KCi0gQ29ycmVjdGVkIHRlc3QgY2FzZSA3NC4gTWFkZSB1c2luZyAtbyB3aXRoIGJhZCAjW251bV0gY29kZXMgY29tcGxhaW4gYW5kCiAgYmFpbCBvdXQuIE1hZGUgI1tudW1dIHN1cHBvcnQgbnVtYmVycyBsYXJnZXIgdGhhbiA5IGFzIHdlbGwuIEFkZGVkIHRlc3QKICBjYXNlIDg2IGZvciBhIHByb3BlciByYW5nZSBnbG9iYmluZyB0ZXN0IGFzIHdlbGwuCgpWZXJzaW9uIDcuMTAuNy1wcmU0ICgxMiBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTIgQXVndXN0KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBmbGFnIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXN5bmNoIEROUwogIHN1cHBvcnQsIGFuZCB0aGlzIGlzIG5vdyBhbHNvIGRpc3BsYXllZCB3aXRoICdjdXJsIC1WJy4KCi0gQWRkZWQgYSBmZXcgbmV3IG1hbiBwYWdlcyB0byB0aGUgZG9jcy9saWJjdXJsIGRpcjogY3VybF9zaGFyZV9pbml0LAogIGN1cmxfc2hhcmVfc2V0b3B0LCBjdXJsX3NoYXJlX2NsZWFudXAsIGxpYmN1cmwtZWFzeSBhbmQgbGliY3VybC1zaGFyZS4KCkRhbmllbCAoMTEgQXVndXN0KQotIE1pa2UgQ2hlcmVwb3YgbWFkZSB0aGUgbG9jYWwgYmluZGluZyBjb2RlIHdvcmsgZm9yIFdpbmRvd3MsIHdoaWNoIG1ha2VzCiAgdGhlIG9wdGlvbiBDVVJMT1BUX0lOVEVSRkFDRSB3b3JrIG9uIFdpbmRvd3MgYXMgd2VsbC4KCi0gVmluY2VudCBTYW5kZXJzIHVwZGF0ZWQgdGhlIGZvcGVuLmMgZXhhbXBsZSBjb2RlIGEgbG90LgoKLSAtLXByb3h5LW50bG0gaXMgbm93IHN1cHBvcnRlZCBieSB0aGUgY3VybCB0b29sLiBJdCBmb3JjZXMgdGhlIHByb3h5CiAgYXV0aGVudGljYXRpb24gdG8gYmUgbWFkZSB1c2luZyBOVExNLiBJdCBkb2VzIG5vdCB5ZXQgd29yayBmb3IgSFRUUFMgb3ZlcgogIHByb3hpZXMgKG9yIG90aGVyIHByb3h5LXR1bm5lbGluZyBvcHRpb25zKS4gVGVzdCBjYXNlIDgxIGFuZCA4MiBkbyBzb21lCiAgc2ltcGxlIGluaXRpYWwgbnRsbSB0ZXN0aW5nLgoKLSBGb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHdpdGgKICBwcm94eS1hdXRoZW50aWNhdGlvbi4KCi0gSSByZW1vdmVkIC1AIGFuZCAtWiBhcyB2YWxpZCBzaG9ydCBvcHRpb25zLiBUaGV5IHdlcmUgdmVyeSByYXJlbHkgdXNlZCAoQAogIHdhc24ndCBldmVuIGRvY3VtZW50ZWQpLgoKLSBTZXJnZSBTZW1hc2hrbyBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlBVVRILCBhbmQgbWFrZSBpdCB3b3JrIHdoZW4gc2V0IHRvCiAgQ1VSTEFVVEhfTlRMTSBhbmQvb3IgQ1VSTEFVVEhfQkFTSUMuIFRoZSBQUk9YQVVUSCBpcyBzaW1pbGFyIHRvIEhUVFBBVVRILAogIGJ1dCBpcyBmb3IgdGhlIHByb3h5IGNvbm5lY3Rpb24gb25seSwgYW5kIEhUVFBBVVRIIGlzIGZvciB0aGUgcmVtb3RlIGhvc3QuCgotIEZpeGVkIGxvYWRpbmcgb2YgY29va2llcyB3aXRoIGJsYW5rIGNvbnRlbnRzIGZyb20gYSBjb29raWUgamFyLiBBbHNvIG1hZGUgdGhlCiAgY29va2llIGZ1bmN0aW9ucyBpbmZvcm0gb24gYWRkZWQgYW5kIHNraXBwZWQgY29va2llcyAoZm9yIGNvb2tpZSBkZWJ1Z2dpbmcpLgoKVmVyc2lvbiA3LjEwLjctcHJlMyAoOCBBdWd1c3QgMjAwMykKCkRhbmllbCAoOCBBdWd1c3QpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIGZpeCBmb3IgZmlsZTovLyBVUkxzIHdpdGggZHJpdmUgbGV0dGVycyBpbmNsdWRlZC4KCi0gSSBhZGRlZCB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgdG8gdGhlIGNsaWVudCBjb2RlLCB3aGljaCBhY3RpdmF0ZXMgRWFybHkncwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uLCBhbmQgd3JvdGUgdGVzdCBjYXNlIDE0NyB0byB2ZXJpZnkKICBpdC4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUgY3VybC4xIG1hbiBwYWdlIHRvby4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUKICBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UgdG9vLgoKRGFuaWVsICg3IEF1Z3VzdCkKLSBUZXN0IGNhc2UgNjAgZmFpbGVkIG9uIGlhNjQgYW5kIEFNRCBPcHRlcm9uLiBGaXhlZCBub3cuCgotIEZpeGVkIGEgcHJpbnRmIHByb2JsZW0gdGhhdCByZXN1bHRlZCBpbiB1cmxnbG9iYmluZyBidWdzIChidWcgIzIwMzgyNyBpbiB0aGUKICBkZWJpYW4gYnVnIHRyYWNrZXIpLiBBZGRlZCB0ZXN0IGNhc2UgNzQgdG8gdmVyaWZ5IHRoZSBmaXggYW5kIHRvIGRpc2NvdmVyIGlmCiAgdGhpcyBicmVha3MgaW4gdGhlIGZ1dHVyZS4KCi0gIm1ha2UgZGlzdGNoZWNrIiB3b3JrcyBhZ2Fpbi4KClZlcnNpb24gNy4xMC43LXByZTIgKDYgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDUgQXVndXN0KQotIER1bmNhbiBXaWxjb3ggaGVscGVkIG1lIHZlcmlmeSB0aGF0IHRoZSBsYXRlc3QgaW5jYXJuYXRpb24gb2YgbXkgYXJlcyBwYXRjaAogIGJ1aWxkcyBmaW5lIG9uIE1hYyBPUyBYIChzZWUgdGhlIG5ldyBsaWIvUkVBRE1FLmFyZXMpIGZpbGUgZm9yIGFsbCBkZXRhaWxzLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmaWxlZCBidWcgcmVwb3J0ICM3ODMxMTYgYW5kIEVhcmx5IEVobGluZ2VyIHBvc3RlZCBhCiAgYnVnIHJlcG9ydCB0byB0aGUgbGliY3VybCBsaXN0LCBib3RoIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoIEZUUAogIHBlcnNpdGVudCBjb25uZWN0aW9ucyBhbmQgaG93IHRoZSBkaXIgaGllYXJjaHkgd2FzIG5vdCBwcm9wZXJseSByZXNldAogIGJldHdlZW4gZmlsZXMuCgotIERhdmlkIEJ5cm9uJ3MgdGhvdWdodHMgb24gYSBmaXhlZCBNYWtlZmlsZSBpbiB0ZXN0cy8gd2VyZSBhcHBsaWVkLgoKLSBKYW4gU3VuZGluIHJlcG9ydGVkIGEgY2FzZSB3aGVyZSBjdXJsIGlnbm9yZWQgYSBjb29raWUgdGhhdCBicm93c2VycyBkb24ndCwKICB3aGljaCB0dXJuZWQgdXAgdG8gYmUgZHVlIHRvIHRoZSBudW1iZXIgb2YgZG90cyBpbiB0aGUgJ2RvbWFpbicuIEkndmUgbm93CiAgbWFkZSBjdXJsIGZvbGxvdyB0aGUgdGhlIG9yaWdpbmFsIG5ldHNjYXBlIGNvb2tpZSBzcGVjIGxlc3Mgc3RyaWN0IG9uIHRoYXQKICBwYXJ0LgoKRGFuaWVsICg0IEF1Z3VzdCkKLSBEaXJrIE1hbnNrZSBhZGRlZCBjb29raWUgc3VwcG9ydCBmb3IgdGhlIGV4cGVyaW1lbnRhbCwgaGlkZGVuIGFuZCBzdGlsbAogIHVuZG9jdW1lbnRlZCBzaGFyZSBmZWF0dXJlIQoKLSBNYXJrIEZsZXRjaGVyIHByb3ZpZGVkIGFuIGV4Y2VsbGVudCBidWcgcmVwb3J0IHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIEZPTExPV0xPQ0FUSU9OIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLCBhcyBsaWJjdXJsIHdvdWxkIG5vdAogIHByb3Blcmx5IGlnbm9yZSB0aGUgYm9keSBjb250ZW50cyBvZiAzWFggcmVzcG9uc2UgdGhhdCBpbmNsdWRlZCB0aGUKICBMb2NhdGlvbjogaGVhZGVyLgoKRWFybHkgKDYgQXVndXN0KQotIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICBUaGlzIG9wdGlvbiB3aWxsIGZvcmNlIHRoZSB0YXJnZXQgZmlsZSdzIHBhdGggdG8gYmUgY3JlYXRlZCBpZiBpdAogICAgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4KIAogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBpbmNsdWRlL2N1cmwvY3VybC5oCiAgICAgICAgQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgQWRkZWQgZnVuY3Rpb24gZnRwX21rZCwgd2hpY2ggaXNzdWVzIGEgTUtEIGNvbW1hbmQKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfZm9yY2VfY3dkLCB3aGljaCBhdHRlbXB0cyBhIENXRCwKICAgICAgICAgIGFuZCBkb2VzIGEgTUtEIGFuZCByZXRyaWVzIHRoZSBDV0QgaWYgdGhlIG9yaWdpbmFsIENXRAogICAgICAgICAgZmFpbHMKICAgICAgICBNb2RpZmllZCBmdHBfcGVyZm9ybSgpIHRvIGNhbGwgaXRzIGNoYW5nZSBkaXJlY3RvcnkgZnVuY3Rpb24KICAgICAgICAgIHRocm91Z2ggYSBwb2ludGVyLiAgVGhlIHBvaW50ZXIgcG9pbnRzIHRvIGZ0cF9jd2QgYnkgZGVmYXVsdCwKICAgICAgICAgIGFuZCBpcyBtb2RpZmllZCB0byBwb2ludCB0byBmdHBfZm9yY2VfY3dkIElGRgogICAgICAgICAgZGF0YS0+c2V0LmZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIGlzIG5vdCAwLiAgICAgICAgCiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfY3JlYXRlX21pc3NpbmdfZGlycyB0byBzdHJ1Y3QgVXNlckRlZmluZWQKICAgICAgIAotIE1pbm9yIEJ1Z2ZpeCBmb3IgQ1VSTE9QVF9USU1FQ09ORElUSU9OIHdpdGggRlRQIC0gaWYgdGhlIGZpbGUgd2FzIG5vdAogIHByZXNlbnQgdG8gZG8gdGhlIHRpbWUgY29tcGFyaXNvbiwgaXQgd291bGQgZmFpbC4KICBGaWxlcyBhZmZlY3RlZDoKICAgIC0gbGliL2Z0cC5jCiAgICAgICAgSW4gZnRwX3BlcmZvcm0oKSwgdGhlIGNhbGwgdG8gZnRwX2dldGZpbGV0aW1lKCkgdXNlZCB0byBiZSBmb2xsb3dlZAogICAgICAgIGJ5CgkgIGlmIChyZXN1bHQpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgQW5kIHRoZW4gYnkgdGhlIGNvZGUgdGhhdCBhY3R1YWxseSBkaWQgdGhlIHRpbWUgY29tcGFyaXNvbi4KICAgICAgICBUaGUgY29kZSB0aGF0IGRpZCB0aGUgY29tcGFyaXNvbiBoYW5kbGVkIHRoZSBjYXNlIHdoZXJlIHRoZSBmaWxldGltZQogICAgICAgIHdhcyBub3QgYXZhaWxhYmxlIChhcyBpbmRpY2F0ZWQgYnkgaW5mby5maWxldGltZSA8IDAgb3Igc2V0LnRpbWV2YWx1ZSAKICAgICAgICA8IDApLCBzbyBJIHJlcGxhY2VkIHRoZSBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0IHdpdGggYSBzd2l0Y2gocmVzdWx0KQogICAgICAgIHRoYXQgYWxsb3dzIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRSB0byBmYWxsIHRocm91Z2ggdG8gdGhlIAogICAgICAgIG5vcm1hbCB0aW1lIGNvbXBhcmlzb24uCgpEYW5pZWwgKDMgQXVndXN0KQotIFdoZW4gcHJveHkgYXV0aGVudGljYXRpb24gaXMgdXNlZCBpbiBhIENPTk5FQ1QgcmVxdWVzdCAoYXMgdXNlZCBmb3IgYWxsIFNTTAogIGNvbm5lY3RzIGFuZCBvdGhlcndpc2UgZW5mb3JjZWQgdHVubmVsLXRocnUtcHJveHkgcmVxdWVzdHMpLCB0aGUgc2FtZQogIGF1dGhlbnRpY2F0aW9uIGhlYWRlciBpcyBhbHNvIHdyb25nbHkgc2VudCB0byB0aGUgcmVtb3RlIGhvc3QuCgogIFRoaXMgaXMgYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5mbyBsZWFrLiBJJ3ZlIGZpeGVkIGl0IG5vdyBhbmQgbWFpbGVkIGEgcGF0Y2gKICBhbmQgd2FybmluZyB0byB0aGUgbWFpbGluZyBsaXN0cy4KCkRhbmllbCAoMSBBdWd1c3QpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0byBtYWtlIDcuMTAuNiBidWlsZCBjb3JyZWN0bHkgd2l0aCB0aGUKICBjb21wcmVzc2VkIGh1Z2VoZWxwLmMgc291cmNlIGZpbGUuCgpWZXJzaW9uIDcuMTAuNy1wcmUxICgzMSBKdWx5IDIwMDMpCgpEYW5pZWwgKDMwIEp1bHkpCi0gSvZyZyBN/GxsZXItVG9sayB1cGRhdGVkIHRoZSBWQyBtYWtlZmlsZS4KCi0gRGFuaWVsIE5vZ3Vlcm9sIG1hZGUgdGhlIGZ0cCBjb2RlIG91dHB1dCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGluIHNpbWlsYXIKICBzdHlsZSBsaWtlIG90aGVyIGZha2VkIEhUVFAgaGVhZGVycyB3aGVuIE5PQk9EWSBhbmQgSEVBREVSIGFyZSB1c2VkLiBJCiAgdXBkYXRlZCB0d28gY29ycmVzcG9uZGluZyB0ZXN0IGNhc2VzIHRvby4KCi0gTWFydHkgS3VocnQgcG9pbnRlZCBvdXQgYSBjb21waWxhdGlvbiBwcm9ibGVtIG9uIFZNUyBkdWUgdG8gbXkgaGF2aW5nCiAgY2hhbmdlZCBhIHR5cGUgZnJvbSBsb25nIHRvIHRpbWVfdCwgYW5kIEknbSBub3cgY2hhbmdpbmcgaXQgYmFjayB0byB3b3JrCiAgbW9yZSBwb3J0YWJseS4uLgoKICBIZSBhbHNvIGluZGljYXRlZCB0aGF0IGRpc3RyaWJ1dGluZyB0aGUgc3JjL2h1Z2VoZWxwLmMgaW4gYSBjb21wcmVzc2VkIHN0YXRlCiAgbGlrZSBJIGFjY2NpZGVudGFsbHkgZGlkIG1heSBub3QgYmUgdGhlIHNtYXJ0ZXN0IG1vdmUuLi4gSSd2ZSBub3cgZml4ZWQgdGhlCiAgZGlzdHJpYnV0ZSBwcm9jdWRlcmUgdG8gYXV0b21hdGljbHkgZ2VuZXJhdGUgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gd2hlbiBJCiAgbWFrZSByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgyOSBKdWx5KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY2hhbmdlcyB0byB0aGUgbWtoZWxwIHNjcmlwdCBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlCiAgY29tcHJlc3NlZCBoZWxwIHRleHQgb24gc29tZSBwbGF0Zm9ybXMuCgpWZXJzaW9uIDcuMTAuNiAoMjggSnVseSAyMDAzKQoKRGFuaWVsICgyOCBKdWx5KQotIEZyYW7nb2lzIFBvbnMgYnJvdWdodCBhIHBhdGNoIHRoYXQgb25jZSBhZ2FpbiBtYWRlIGN1cmwgZGVhbCB3aXRoIGZ0cCBhbmQKICAiZG91YmxlIHNsYXNoIiBhcyBpbmRpY2F0aW5nIHRoZSByb290IGRpcmVjdG9yeS4gSW4gdGhlIFJGQzE3MzgtZml4IG9mIEFwcmlsCiAgMzAsIHRoYXQgYWJpbGl0eSB3YXMgcmVtb3ZlZCAoc2luY2UgaXQgaXMgbm90IHRoZSAicmlnaHQiIHdheSkuIFNvLCBzdGFydGluZwogIG5vdyB3ZSBjYW4gbGlzdCB0aGUgcm9vdCBkaXIgb2YgYW4gZnRwIHNlcnZlciBib3RoIHRoZXNlIHdheXM6CgogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLyUyZiAgYXMgd2VsbCBhcwogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLy8KCkRhbmllbCAoMjQgSnVseSkKLSBIZW5yeSBCbGFuZCBwb2ludGVkIG91dCB0aGF0IHdlIGluY2x1ZGVkIHN5cy9yZXNvdXJjZS5oIHdpdGhvdXQgZ29vZCByZWFzb24KICBpbiBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gV2l0aG91dCBpdCBpbmNsdWRlZCwgUU5YIGJ1aWxkcyBiZXR0ZXIuLi4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgpEYW5pZWwgKDIzIEp1bHkpCi0gVHJhY3kgQm9laHJlciBleHBlcmllbmNlZCBETlMgY2FjaGUgcHJvYmxlbXMgYW5kIGRpZCBzb21lIG5pY2UgZGVidWdnaW5nCiAgYW5kIHRyYWNraW5nIHdoaWNoIG1hZGUgaXQgZWFzeSBmb3IgbWUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbSBhbmQgVHJhY3kKICBjb3VsZCB2ZXJpZnkgdGhhdCBpdCBkaWQgY3VyZSB0aGUgcHJvYmxlbSEgV2hlbiByZS11c2luZyBhIGNvbm5lY3Rpb24gd2UKICBub3cgbWFrZSBzdXJlIHdlIGRvbid0IHJlLXVzZSB0aGUgJ2Nvbm5lY3RfYWRkcicgc3RydWN0LgoKLSBEYW5pZWwgS291cmlsIGNvcnJlY3RlZCB0aGUgR1NTLU5lZ290aWF0ZSBjb2RlLgoKLSBKdWFuIEYuIENvZGFnbm9uZSBwcm92aWRlZCBmaXhlcyB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIGZpbmUgb24gV2luZG93cwogIGFnYWluLgoKRGFuaWVsICgyMiBKdWx5KQotIEVkaXRlZCB0aGUgY3VybC9jdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJ1aWxkIG9uIFdpbmRvd3MgcHJvcGVybHkuCgpEYW5pZWwgKDIxIEp1bHkpCi0gTW92ZWQgdGhlIHByb3h5IGNyZWRlbnRpYWxzIGZyb20gdGhlIFNlc3Npb25IYW5kbGUgc3RydWN0IHRvIHRoZSBjb25uZWN0ZGF0YQogIHN0cnVjdCwgdG8gbWFrZSBtdWx0aXBsZSBwcm94eSBjb25uZWN0aW9ucyB3aXRoIGRpZmZlcmVyZW50IHVzZXIgbmFtZXMgd29yay4KCi0gQWRqdXN0ZWQgdGhlIE5UTE0gY29kZSB0byBzdXBwb3J0IHByb3h5IGZ1bmN0aW9uYWxpdHkuCgotIE1hZGUgdGhlIGtyYjQgc3R1ZmYgY29tcGlsZSB3aXRoIHRoZSB1c2VyK3Bhc3N3b3JkIGZpZWxkcyBtb3ZlZC4KClZlcnNpb24gNy4xMC42LXByZTQgKDIxIEp1bHkgMjAwMykKCkRhbmllbCAoMjAgSnVseSkKLSBEYXZpZCBHYXJkbmVyIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgNzcwNzU1IHRoYXQgdXNpbmcgdGhlIEZUUCBjb21tYW5kCiAgQ1dEIHdpdGggYSBibGFuayBhcmd1bWVudCBpcyBhIGJhZCBpZGVhIGFuZCBJIG1hZGUgbGliY3VybCBza2lwIGVtcHR5IHBhdGgKICBzZWdtZW50cyBzdGFydGluZyBub3cuCgpEYW5pZWwgKDE4IEp1bHkpCi0gQ3JpcyBwb2ludGVkIG91dCB0aGF0IG15IGZpeCBvbiBKdWx5IDE2dGggZGlkbid0IHdvcmsgZnVsbHkuIEhpcyBwb2ludGluZwogIG91dCB0aGlzIChhbmQgaGlzIHBhdGNoKSBhbHNvIG1hZGUgbWUgcmVhbGl6ZSB0aGF0IHdlIGhhdmUgYSB2ZXJ5IHNpbWlsYXIKICBidWcgaW4gdGhlIEZUUCBjb25uZWN0aW9uIHJlLXVzZSBjb2RlLiBXZSBtdXN0IHN0b3JlIGEgc2VwYXJhdGUgdXNlciBhbmQKICBwYXNzd29yZCBmaWVsZCBmb3IgZWFjaCBjb25uZWN0aW9uIHdlIGtlZXAgKGF0IGxlYXN0IGZvciBGVFAgYW5kIEhUVFArTlRMTQogIGNvbm5lY3Rpb25zLCBzbyBJIG1hZGUgdXMgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkpLgoKLSBTaW5jZSBOVExNIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiBzaW5nbGUgcmVxdWVzdHMsIEkgaGFkIHRvCiAgcmUtYXJyYW5nZSBob3cgd2Ugc3RvcmUgdGhlIE5UTE0gZGF0YSBhbmQgSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdCBzdWl0ZSB0bwogIGZpbmFsbHkgd29yayBwcm9wZXJseSB3aXRoIHBlcnNpc3RhbmN5IHRvIG1ha2UgdGhlIE5UTE0gdGVzdHMgcnVuIGZpbmUKICBhZ2Fpbi4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBoYXZlIHRvIHVwZGF0ZSBsb3RzIG9mIEhUVFAgdGVzdCBjYXNlcy4KCkRhbmllbCAoMTYgSnVseSkKLSBDcmlzIEJhaWxpZmYncyBidWcgcmVwb3J0IDc2ODI3NSBwb2ludGVkIG91dCB0aGF0IHVzaW5nIEJhc2ljIGF1dGggd2l0aAogIHdyb25nIHVzZXIrcGFzc3dvcmQgY2F1c2VkIGFuIGVuZGxlc3MgbG9vcC4gRml4ZWQgbm93LiBIZSBhbHNvIGZvdW5kIG91dCB0aGF0CiAgd2UgZGlkbid0IHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucyB3aXRoIE5UTE0uIEZpeGVkIHRvby4KCi0gRGFuIFdpbnNoaXAgcHJvdmlkZWQgZml4ZXMgZm9yIHRoZSBOVExNIGNvZGUuCgpEYW5pZWwgKDUgSnVseSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYWRkaXRpb25hbCBmaXhlcyBmb3IgdGhlIERPUyBwb3J0LgoKRGFuaWVsICg0IEp1bHkpCi0gUmljayBSaWNoYXJkc29uIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgc2V0dmJ1ZigpIHRvIGFjaGl2ZSBub24tYnVmZmVyaW5nCiAgb24gb3V0cHV0IGlzIG5vLWdvb2QgZm9yIFNDTyBYZW5peCBhbmQgb3RoZXIgdW5peGVzLiBXZSBzd2l0Y2hlZCBvdmVyIHRvCiAgdXNpbmcgcGxhaW4gZmZsdXNoKCkgaW5zdGVhZC4KCi0gRGFuIEdyYXlzb24gcG9pbnRlZCBvdXQgdGhhdCB3ZSBzZXQgdGhlIENVUkxfQ0FfQlVORExFIHZhcmlhYmxlIHdyb25nbHkgaW4KICB0aGUgY29uZmlndXJlIHNjcmlwdCwgYW5kIEkgaGFkIHRvIGNoYW5nZSBzb21lIGJ1aWxkIHN0dWZmIHRvIG1ha2UgdGhlIG5ldwogIHdheSB3b3JrLgoKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB3YXMgYXBwbGllZCB0aGF0IGludHJvZHVjZXMgdGhlIGZvbGxvd2luZzoKCiAgIENVUkxPUFRfU1NMX0NUWF9GVU5DVElPTiB0byBzZXQgYSBjYWxsYmFjayB0aGF0IGdldHMgY2FsbGVkIHdpdGggdGhlCiAgIE9wZW5TU0wncyBzc2xfY3R4IHBvaW50ZXIgcGFzc2VkIGluIGFuZCBhbGxvdyBhIGNhbGxiYWNrIHRvIGFjdCBvbiBpdC4gSWYKICAgYW55dGhpbmcgYnV0IENVUkxFX09LIGlzIHJldHVybmVkLCB0aGF0IHdpbGwgYWxzbyBiZSByZXR1cm5lZCBieSBsaWJjdXJsCiAgIGFsbCB0aGUgd2F5IGJhY2suIElmIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgQ1VSTE9QVF9VUkwsIGxpYmN1cmwgd2lsbAogICBkZXRlY3QgdGhpcyBhbmQgaW5zdGVhZCBnbyB1c2UgdGhlIG5ldyBVUkwuCgogICBDVVJMT1BUX1NTTF9DVFhfREFUQSBpcyBhIHBvaW50ZXIgeW91IHNldCB0byBnZXQgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBzZXQKICAgd2l0aCBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04uCgpEYW5pZWwgKDEgSnVseSkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzIGEgY2xpZW50IHRvIHF1aXQgdGhlIHRlc3Qgc3VpdGUncwogIEhUVFAgc2VydmVyLgoKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgcGF0Y2hlZCBhIGxpYiBoYW5kbGUgbGVhayBpbiB0aGUgbGRhcCBjb2RlLgoKRGFuaWVsICgyNSBKdW5lKQotIE1vcmUgTlRMTS1pbXByb3ZlbWVudHMuIExlc3MgY29kZS4gU21hbGxlciBwYWNrZXRzIGJhY2sgYW5kIGZvcnRoLgoKRGFuaWVsICgyMyBKdW5lKQotIEVyaWMgR2xhc3MgcHJvdmlkZWQgdXMgd2l0aCBhIGJldHRlciBkb2Mgb24gTlRMTSBkZXRhaWxzLCBhbmQgSSBhZGRlZCBtb3JlCiAgY29tbWVudHMgYW5kIGNsYXJpZmllZCB0aGUgY3VycmVudCBjb2RlIG1vcmUuIFVzaW5nIHRoZSBuZXcga25vd2xlZGdlLCB3ZQogIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgdGhlIE5UTE0gc3R1ZmYgd29yayBldmVuIGJldHRlci4KICBFcmljJ3Mgb3JpZ2luYWwgVVJMOiBodHRwOi8vZGF2ZW5wb3J0LnNvdXJjZWZvcmdlLm5ldC9udGxtLmh0bWwKICBWZXJzaW9uIHN0b3JlZCBhbmQgcHJvdmlkZWQgYXQgY3VybCBzaXRlOiBodHRwOi8vY3VybC5oYXh4LnNlL3JmYy9udGxtLmh0bWwKCi0gRml4ZWQgdGhlIG1pbm9yIGNvbXBpbGUgcHJvYmxlbXMgcHJlMyBoYWQgaWYgYnVpbHQgd2l0aG91dCBHU1NBUEkgYW5kL29yCiAgU1NMLgoKVmVyc2lvbiA3LjEwLjYtcHJlMyAoMTkgSnVuZSAyMDAzKQoKRGFuaWVsICgxOSBKdW5lKQotIE1hZGUgY3VybCB1c2UgY3VybF9mcmVlKCkgb24gbWVtb3J5IHJldHVybmVkIGJ5IGN1cmxfZ2V0ZW52KCksIGFzIHRoaXMKICBzaG91bGQgdGhlb3JldGljbHkgbWFrZSBpdCBwb3NzaWJseSB0byBidWlsZCBhbmQgcnVuIGN1cmwgYW5kIGxpYmN1cmwgd2l0aAogIGRpZmZlcmVudCBtZW1vcnkgYWxsb2NhdGlvbiBzY2hlbWVzIHdpdGggbm8gcHJvYmxlbXMuCgpEYW5pZWwgKDE4IEp1bmUpCi0gSW1wcm92ZWQgdGhlIG1raGVscC5wbCBhIGJpdCBmdXJ0aGVyIHRvIG1ha2UgYSBuaWNlciBodWdlaGVscCB0ZXh0IGFuZCB0bwogIGluY2x1ZGUgYSBiZXR0ZXIgY29tbWVudCBpbiB0aGUgdG9wIGZvciB0aGUgZ3ppcCBjb21wcmVzc2VkIHZlcnNpb24uCgpEYW5pZWwgKDE3IEp1bmUpCi0gQ1VSTE9QVF9IVFRQQVVUSCBpcyBub3cgYSBiaXRtYXNrLCBpbiB3aGljaCB5b3Ugc2V0IHdoaWNoIGF1dGhlbnRpY2F0aW9uCiAgdHlwZShzKSB5b3Ugd2FudCB0byB1c2UuIElmIG1vcmUgdGhhbiBvbmUgaXMgc2V0LCBsaWJjdXJsIHdpbGwgdXNlIG9uZSBvZgogIHRoZSBzZWxlY3RlZCBvbmUgYW5kIHRoZSBvbmUgaXQgY29uc2lkZXJzIGlzIG1vcmUgc2VjdXJlLiBUZXN0IGNhc2UgNjcgYW5kCiAgNjggKGZvciBOVExNKSB3ZXJlIGZpeGVkIGFuZCB3ZSd2ZSByZWR1Y2VkIGEgcm91bmQtdHJpcCBmb3Igc3BlY2lmaWMgLS1udGxtCiAgZmVhdGNoZXMsIGFuZCB0ZXN0IGNhc2UgNjkgYW5kIDcwIHdlcmUgYWRkZWQgZm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24KICAicGlja2luZyIuIC0tYW55YXV0aCBpcyB0aGUgbmV3IGNvbW1hbmQgbGluZSB0b29sIG9wdGlvbiwgYW5kIEkgYWxzbyBhZGRlZAogIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAodGhhdCdzIHRoZSBkZWZhdWx0IHR5cGUpLgoKLSBGaXhlZCB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIHVzZSB0aGUgaW5mbyBwcm92aWRlZCBieSB0aGUgbmV3IGN1cmwgLVYKICBvdXRwdXQuCgotIC0tZW5hYmxlLWRlYnVnIG5vdyBzZXRzIHRoZSBDVVJMREVCVUcgZGVmaW5lIGluc3RlYWQgb2YgTUFMTE9DREVCVUcsIGFzIGl0CiAgaXMgbWVhbnQgdG8gYmUgYSBnZW5lcmljIGRlYnVnIGNvbmRpdGlvbmFsLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIGNhbiBub3cgcmV0dXJuIENVUkxfVkVSU0lPTl9ERUJVRyBhcyBhIGZlYXR1cmUgYml0LCB0bwogIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IHdpdGggQ1VSTERFQlVHIHNldC4KCi0gUmFscGggTWl0Y2hlbGwgZm91bmQgb3V0IHRoYXQgc29tZSB3ZWIgYXBwbGljYXRpb25zIHZlcnkgYmFkbHkgdXNlcyB3aGl0ZQogIHNwYWNlcyBpbiBMb2NhdGlvbjogcmVkaXJlY3RzLCBhbmQgYXBwYXJlbnRseSBJRSBpcyBhIGJyb3dzZXIgKHRoZSBvbmx5CiAgb25lPykgdGhhdCBzdXBwb3J0cyB0aGlzIGFib21pbmF0aW9uLiBCYXNlZCBvbiBSYWxwaCdzIHBhdGNoLCBJIGFkZGVkIGNvZGUKICB0aGF0IG5vdyBhdHRlbXB0cyB0byByZXBsYWNlIHdoaXRlIHNwYWNlcyB3aXRoIHRoZSBwcm9wZXIgIiUyMCIgb3IgIisiLgogIFRlc3QgY2FzZSA0MCBhbmQgNDIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgbXkgY2hhbmdlcy4KCi0gY3VybCAtViBub3cgYWxzbyBvdXRwdXRzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGUgYXZhaWxhYmxlIGxpYnJhcnkgb2ZmZXJzIChpZgogIGFueSkuCgotIFRoZSBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IGluY2x1ZGVzICJHU1MiIGlmIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHU1NBUEkKICBzdXBwb3J0LgoKLSBEYXZpZCBPcnJlbGwgcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIHN0aWxsIGNyYXNoZWQgd2hlbiBzZW5kaW5nIEhVR0UgcmVxdWVzdHMKICBvdmVyIEhUVFBTLi4uIEkgZml4ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmUyICgxNiBKdW5lIDIwMDMpCgpEYW5pZWwgKDE2IEp1bmUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBiaXRtYXNrZWQgaW5mb3JtYXRpb24gd2VhdGhlciBOVExNIGFuZAogIEdTU05FR09USUFURSBhcmUgc3VwcG9ydGVkLCBzaW5jZSBpdCBpcyBkb29tZWQgdG8gdmFyeSBvbiBkaWZmZXJlbnQKICBpbnN0YWxsYXRpaW9ucy4KCi0gSSByZW1hZGUgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBNRDUtY29kZSBwcm92aWRlZCBieSBPcGVuU1NMIGlmCiAgdGhhdCBpcyBwcmVzZW50LCBhbmQgb25seSB1c2Ugb3VyIG93biBNRDUtY29kZSBpZiBpdCBpc24ndC4KICAKRGFuaWVsICgxMyBKdW5lKQotIE1vcmUgTlRMTSBoZWxwLCBmaXhlcyBhbmQgcGF0Y2hlcyBmcm9tIENyaXMgQmFpbGlmZi4KCi0gTWFydHkgS3VocnQgYnJvdWdodCBpbmNsdWRlIGZpeGVzIGZvciBtYWtpbmcgVk1TIGJ1aWxkcyB3YXJuaW5nLWZyZWUuCgpEYW5pZWwgKDEyIEp1bmUpCi0gTlRMTSBhdXRoZW50aWNhdGlvbiB3b3JrcyBzb21ld2hhdCBhZ2FpbnN0IHRoZSB0ZXN0IHNlcnZlcnMgcHJvdmlkZWQgYnkKICBNYXRoaWFzIEF4ZWxzc29uIGFuZCBDcmlzIEJhaWxpZmYuIFVzZSBieSBzZXR0aW5nIENVUkxPUFRfSFRUUEFVVEggdG8KICBDVVJMQVVUSF9OVExNIHRvIGxpYmN1cmwsIG9yIC0tbnRsbSBmb3IgdGhlIGN1cmwgdG9vbC4gVGVzdCBjYXNlIDY3IGFuZCA2OAogIHdlcmUgYWRkZWQgZm9yIHRoaXMuIE5UTE0tc3VwcG9ydCByZXF1aXJlcyBPcGVuU1NMLgoKLSBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYSBwYXRjaCwgdGhhdCBncmFudGVkIHRoYXQgZ3ppcCBhbmQgbGlieiBhcmUgYXZhaWxhYmxlCiAgYXQgYnVpbGQtdGltZSwgY29tcHJlc3NlcyB0aGUgaHVnZWhlbHAgdGV4dCBpbiB0aGUgY3VybCBjb21tYW5kIGxpbmUgYW5kCiAgdW5jb21wcmVzc2VzIGl0IGF0IHJlcXVlc3QuIFNhdmVzIHNvbWUgfjYwSyBpbiB0aGUgZmluYWwgb3V0cHV0IGV4ZWN1dGFibGUuCgpEYW5pZWwgKDExIEp1bmUpCi0gTG9uZyBkYXkgb2YgZmlnaHRpbmcgdGhlIE5UTE0gZGVtb25zLgoKRGFuaWVsICgxMCBKdW5lKQotIE1vZGlmaWVkIGhvdyB0byBzZXQgYXV0aCB0eXBlIHRvIGxpYmN1cmwuIE5vdyB1c2UgQ1VSTE9QVF9IVFRQQVVUSCBpbnN0ZWFkLAogIGFuZCBwaWNrIG1ldGhvZC4gU3VwcG9ydGVkIG9uZXMgY3VycmVudGx5IGFyZToKICBDVVJMQVVUSF9CQVNJQyAgICAgLSBkZWZhdWx0IHNlbGVjdGlvbgogIENVUkxBVVRIX0RJR0VTVCAgICAtIGZvcm1lcmx5IENVUkxPUFRfSFRUUERJR0VTVAogIENVUkxBVVRIX0dTU05FR09USUFURQoKLSBEYW5pZWwgS291cmlsIGFkZGVkIEhUVFAgR1NTLU5lZ290aWF0ZSBhdXRoZW50aWNhdGlvbiBzdXBwb3J0LCBhcyBkZWZpbmVkIGluCiAgdGhlIElFVEYgZHJhZnQgZHJhZnQtYnJlemFrLXNwbmVnby1odHRwLTA0LnR4dC4gSW4gdXNlIGFscmVhZHkgYnkgdmFyaW91cwogIE1pY3Jvc29mdCB3ZWIgYXBwbGljYXRpb25zLiAtLW5lZ290aWF0ZSBpcyB0aGUgbmV3IGZhbWlseSBtZW1iZXIuIFRvIHRha2UKICBhZHZhbnRhZ2Ugb2YgdGhpcywgeW91IG5lZWQgb25lIG9mIHRoZXNlIHBhY2thZ2VzOgoKICBvIEhlaW1kYWwgS2VyYmVyb3M1ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5wZGMua3RoLnNlL2hlaW1kYWwvaGVpbWRhbC5odG1sCiAgbyBHU1NBUEkgZnJvbSBHbG9idXMgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5nbG9idXMub3JnLwogIG8gR1NTQVBJIGxpYnJhcmllcyBmcm9tIE1JVCBLZXJiZXJvczUgIGh0dHA6Ly93ZWIubWl0LmVkdS9rZXJiZXJvcy93d3cvCgotIEEgbWlzc2luZyBlbmRpbmcgYnJhY2tldCAoJ10nKSB3aGlsZSBkb2luZyBVUkwgZ2xvYmJpbmcgY291bGQgbGVhZCB0byBhCiAgc2VnZmF1bHQuIFdoaWxlIGZpeGluZyB0aGlzLCBJIGFsc28gaW50cm9kdWNlZCBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIHRoZQogIGdsb2JiaW5nIGNvZGUuIChBbGwgdGhpcyBpcyBhcHBsaWNhdGlvbiBjb2RlIG91dHNpZGUgbGliY3VybC4pCgpEYW5pZWwgKDYgSnVuZSkKLSBEYXZpZCBPcnJlbGwgZm91bmQgb3V0IHRoYXQgc2VuZGluZyBhIGh1Z2UgR0VUIHJlcXVlc3Qgb3ZlciBIVFRQUyBjb3VsZAogIG1ha2UgbGliY3VybCBmYWlsIGFuZCByZXR1cm4gYW4gZXJyb3IgY29kZS4KCkRhbmllbCAoMiBKdW5lKQotIFJpY2hhcmQgQnJhbWFudGUgZm91bmQgb3V0IHRoYXQgIkNvbnRlbnQtTGVuZ3RoOiAwIiB3YXMgbm90IHByb3Blcmx5IHVzZWQgYnkKICBsaWJjdXJsIGlmIHRoZSByZXNwb25zZS1oZWFkZXJzIGluZGljYXRlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHdvdWxkIGJlCiAgY2xvc2VkLgoKLSBEYXZpZCBCeXJvbidzIHBhdGNoIHdhcyBhcHBsaWVkLCB0aGF0IG1ha2VzIHRoZSAtLXByb2dyZXNzLWJhciB0YWtlIHRoZQogIGxvY2FsIHNpemUgaW50byBhY2NvdW50IHdoZW4gZG9pbmcgcmVzdW1lZCBkb3dubG9hZHMuCgotIEZlZWRiYWNrIGZyb20gU2VyZ2UgU2VtYXNoa28gbWFkZSBtZSBjaGFuZ2UgdGhlIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgd2hlbgogIENVUkxFX0hUVFBfUkVUVVJORURfRVJST1IgaXMgcmV0dXJuZWQuCgotIEFub255bW91cyBpbiBidWcgcmVwb3J0ICM3NDUxMjIgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaG91bGQgcmVhbGx5IGJlIHVzaW5nCiAgU1NMX0NUWF9zZXRfb3B0aW9ucyguLi4gU1NMX09QX0FMTCkgdG8gd29yayBhcm91bmQgZmxhd3MgaW4gZXhpc3RpbmcgU1NMCiAgaW1wbGVtZW50YXRpb25zLgoKRGFuaWVsICgyNyBNYXkpCi0gQW5kcmVhcyBMZXkgYW5kIFJpY2ggR3JheSBoZWxwZWQgbWUgcG9pbnQgb3V0IHRoYXQgbm8gdmVyc2lvbiBvZiBIUC1VWCBoYXMKICB0aGUgc3lzL3NlbGVjdC5oIGhlYWRlciBmaWxlIHNvIGluY2x1ZGluZyBpdCB1bmNvbmRpdGlvbmFsbHkgaW4gY3VybC9tdWx0aS5oCiAgaXMgbm90IGEgZ29vZCB0aGluZy4gTm93IHdlIGNoZWNrIGZvciBIUFVYIGFuZCBhdm9pZCB1c2luZyB0aGF0IGhlYWRlciBvbgogIHN1Y2ggc3lzdGVtcy4KCi0gUnVkeSBLb2VudG8gZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBjdXJsJ3MgcmVjZW50IGhhYml0IG9mIFBPU1RpbmcgZGF0YSBpbgogIHR3byBzZXBhcmF0ZSBzZW5kKCkgY2FsbHMsIGZpcnN0IHRoZSBoZWFkZXJzIGFuZCB0aGVuIHRoZSBkYXRhLiBJJ3ZlIG5vdwogIG1hZGUgYSBmaXggdGhhdCBmb3Igc3RhdGljIGFuZCBrbm93biBjb250ZW50IHRoYXQgaXMgbGVzcyB0aGFuIDEwMEsgaW4gc2l6ZSwKICBldmVyeXRoaW5nIGlzIG5vdyBzZW50IGluIG9uZSBzaW5nbGUgc3lzdGVtIGNhbGwgYWdhaW4uIFRoaXMgaXMgYWxzbyBiZXR0ZXIKICBmb3IgbmV0d29yayBwZXJmb3JtYW5jZSByZWFzb25zLgoKLSBJIG1vZGlmaWVkIHRoZSBtYWluIG1ha2VmaWxlIHRvIG5vdCBidWlsZCB0aGUgdGVzdCBzdWl0ZSBhbmQgYSBmZXcgb3RoZXIKICB1bm5lY2Vzc2FyeSB0aGluZ3MgYnkgZGVmYXVsdC4gTm93LCB0aGUgdGVzdCBzdWl0ZSBpcyBidWlsdCB3aGVuICdtYWtlIHRlc3QnCiAgaXMgcnVuLiAgVGhpcyByZWR1Y2VzIGJ1aWxkIHRpbWUgZm9yIHRob3NlIHdobyBkb24ndCBjYXJlIGZvciB0aGUgdGVzdAogIHN1aXRlLCBhbmQgaXQgYWxzbyByZWR1Y2VzIGNvbmZ1c2lvbiBmb3IgcGVvcGxlIHVzaW5nIHBsYXRmb3JtcyB3aGVyZSB0aGUKICB0ZXN0IHN1aXRlIGJ1aWxkIGZhaWxzIQoKRGFuaWVsICgyNiBNYXkpCi0gQ2hyaXMgTGV3aXMgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSAjaWZkZWZzIGluIGN1cmwvbXVsdGkuaCBmb3IgV2luZG93cywKICB3aGljaCBpcyBub3cgY29ycmVjdGVkLgoKLSBKaXMgSm95IGZvdW5kIGFub3RoZXIgZmxhdyBpbiB0aGUgU09DSzUgY29kZSwgYXMgbGliY3VybCB0cmVhdGVkIHRoZSBzb2NrczUKICBwcm94eSBhIGxpdHRsZSB0b28gbXVjaCBsaWtlIGFzIGlmIGl0IHdhcyBhIGh0dHAgcHJveHkuCgpEYW5pZWwgKDIzIE1heSkKLSBSaWNhcmRvIENhZGltZSBmb3VuZCBhIHNvY2tldCBsZWFrIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRob3V0CiAgY29udGVudHMuIFRlc3QgY2FzZXMgMTQ0IGFuZCAxNDUgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gUnVkeSBLb2VudG8gZm91bmQgeWV0IGFub3RoZXIgcHJvYmxlbSB3aGVuIGEgSFRUUCBzZXJ2ZXIgcmV0dXJucyBvbmx5IGEKICBzaW5nbGUtbGluZSBvZiBjb250ZW50cyB3aXRob3V0IGFueSBoZWFkZXJzIGF0IGFsbC4gbGliY3VybCB0aGVuIGZhaWxlZCB0bwogIGNvdW50IHRoZSBkYXRhLCB0aHVzIHJldHVybmluZyBlcnJvciA1MiAibm8gY29udGVudHMiLiBUZXN0IGNhc2UgNjYgd2FzCiAgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvIHJpZ2h0LgoKVmVyc2lvbiA3LjEwLjYtcHJlMSAoMjMgTWF5IDIwMDMpCgpEYW5pZWwgKDIzIE1heSkKLSBKaXMgaW4gYnVnIHJlcG9ydCAjNzQxODQxLCBmaXhlZCBhIGJ1ZyBpbiB0aGUgU09DS1M1IHByb3h5LXVzaW5nIGNvZGUuCgpEYW5pZWwgKDIyIE1heSkKLSBEYXZpZCBSZW1haGwgc2V0IHVwIGEgdGVzdC1zZXJ2ZXIgZm9yIG1lIHByb3ZpZGluZyBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYW5kIEkgd3JvdGUgdGhlIGZpcnN0IHdvcmtpbmcgY29kZSB0aGF0IHN1cHBvcnQgaXQuIFRoZSB0ZXN0IHN1aXRlIHdhcwogIG1vZGlmaWVkIHNsaWdodGx5IGFzIHdlbGwgdG8gd29yayBiZXR0ZXIgZm9yIGl0IGFuZCAtLWRpZ2VzdCB3YXMgYWRkZWQgdG8KICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKGFuZCBDVVJMT1BUX0hUVFBESUdFU1QgdG8gdGhlIGxpYnJhcnkpLi4uICBSRkMyNjE3CiAgaGFzIGFsbCB0aGUgZ29yeSBkZXRhaWxzLgoKRGFuaWVsICgyMSBNYXkpCi0gRGF2aWQgQmFsYXppYyBwb2ludGVkIG91dCB0aGF0IGN1cmxfdW5lc2NhcGUoKSBkaWRuJ3QgY2hlY2sgdGhhdCAlLWNvZGVzCiAgd2VyZSBjb3JyZWN0bHkgZm9sbG93ZWQgYnkgdHdvIGhleGFkZWNpbWFsIGRpZ2l0cyB3aGVuIGl0IHVuZXNjYXBlIHN0cmluZ3MuCiAgTm93LCB3ZSBkbyB0aGUgY2hlY2sgYW5kIG9ubHkgJVhYIGNvZGVzIGFyZSB1bmVzY2FwZWQgaWYgdGhlIFggbGV0dGVycyBhcmUKICBoZXhhZGVjaW1hbHMuCgotIEdpc2xlIFZhbmVtIG1hZGUgY3VybCBidWlsZCB3aXRoIGRqZ3BwIG9uIERPUy4KCi0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgdGhlIG1raGVscC5wbCBzY3JpcHQgdG8gbWFrZSBhIG5pY2VyIG1hbnVhbCB0aGF0IGlzCiAgc2hvd24gd2l0aCBjdXJsIC1NLgoKRGFuaWVsICgyMCBNYXkpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsIG1vcmUgY29uc2VydmF0aXZlLCBub3QKICBleHBlY3RpbmcgaF9hbGlhc2VzIG9mIHRoZSBob3N0ZW50IHN0cnVjdCB0byBhbHdheXMgYmUgbm9uLU5VTEwuCgpEYW5pZWwgKDE5IE1heSkKLSBBcyByZXF1ZXN0ZWQgYnkgTWFydGluIE1pY2hsbWF5ciBpbiBEZWJpYW4gYnVnIHJlcG9ydCAjMTkzNjMwLCBsaWJjdXJsIG5vdwogIHN1cHBvcnRzIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaW4gdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcy4gQWRkZWQKICB0ZXN0IGNhc2UgNjMgdG8gdmVyaWZ5IHRoaXMuCgpWZXJzaW9uIDcuMTAuNSAoMTkgTWF5IDIwMDMpCgpEYW5pZWwgKDE1IE1heSkKLSBDaGFuZ2VkIHRoZSBvcmRlciBmb3IgdGhlIGluX2FkZHJfdCB0ZXN0aW5nLCBhcyAndW5zaWduZWQgbG9uZycgc2VlbXMgdG8gYmUKICBhIHZlcnkgY29tbW9uIHR5cGUgaW5ldF9hZGRyKCkgcmV0dXJucy4KCkRhbmllbCAoMTQgTWF5KQotIEdlb3JnZSBDb21uaW5vcyBwcm92aWRlZCBhIGZpeCB0aGF0IGNhbGxzIHRoZSBwcm9ncmVzcyBtZXRlciB3aGVuIHdhaXRpbmcKICBmb3IgRlRQIGNvbW1hbmQgcmVzcG9uc2VzIHRha2UgPjEgc2Vjb25kLiBJdCdsbCBtYWtlIGFwcGxpY2F0aW9ucyBtb3JlCiAgInJlc3BvbnNpdmUiIGV2ZW4gd2hlbiBkZWFsaW5nIHdpdGggdmVyeSBzbG93IGZ0cCBzZXJ2ZXJzLgoKRGFuaWVsICgxMiBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB1cGxvYWRzIGhhZCB0d28gcXVpcmtzOgogICBvIHdoZW4gdXNpbmcgRlRQIFBPUlQgY29tbWFuZCwgaXQgdXNlZCBibG9ja2luZyBzb2NrZXRzIQogICBvIGl0IGNvdWxkIGxvb3AgYSBsb25nIHRpbWUgd2l0aG91dCBkb2luZyBwcm9ncmVzcyBtZXRlciB1cGRhdGVzCiAgQm90aCBpdGVtcyBhcmUgZml4ZWQgbm93LgoKRGFuaWVsICg5IE1heSkKLSBEYW4gRmFuZHJpY2ggY2hhbmdlZCBDVVJMT1BUX0VOQ09ESU5HIHRvIHNlbGVjdCBhbGwgc3VwcG9ydGVkIGVuY29kaW5ncyBpZgogIHNldCB0byAiIi4gIFRoaXMgZnJlZXMgdGhlIGFwcGxpY2F0aW9uIGZyb20gaGF2aW5nIHRvIGtub3cgd2hpY2ggZW5jb2RpbmdzCiAgdGhlIGxpYnJhcnkgc3VwcG9ydHMuCgotIERhbiBGYW5kcmljaCBwb2ludGVkIG91dCB3ZSBoYWQgdGhyZWUgdW5uZWNlc3NhcnkgZmlsZXMgaW4gQ1ZTIHRoYXQgaXMKICBnZW5lcmF0ZWQgd2l0aCBsaWJ0b29saXplLCBzbyB0aGV5J3JlIG5vdyByZW1vdmVkIGFuZCBsaWJ0b29saXplIGlzIGludm9rZWQKICBhY2NvcmRpbmdseSBpbiB0aGUgYnVpbGRjb25mIHNjcmlwdC4KCi0gQXZlcnkgRmF5IGZvdW5kIG91dCB0aGF0IHRoZSBDVVJMT1BUX0lOVEVSRkFDRSB3YXkgb2YgZmlyc3QgY2hlY2tpbmcgaWYgdGhlCiAgZ2l2ZW4gbmFtZSBpcyBhIG5ldHdvcmsgaW50ZXJmYWNlIGdhdmUgYSByZWFsIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gTGludXgsCiAgc28gbm93IHdlIG1vcmUgYXBwcm9wcmlhdGVseSBmaXJzdCBjaGVjayBpZiBpdCBpcyBhbiBJUCBudW1iZXIgYW5kIGlmIHNvCiAgd2UgZG9uJ3QgY2hlY2sgZm9yIGEgbmV0d29yayBpbnRlcmZhY2Ugd2l0aCB0aGF0IG5hbWUuCgotIENVUkxPUFRfRlRQX1VTRV9FUFJUIGFkZGVkLiBTZXQgdGhpcyB0byBGQUxTRSB0byBkaXNhYmxlIGxpYmN1cmwncyBhdHRlbXB0cwogIHRvIHVzZSBFUFJUIGFuZCBMUFJUIGJlZm9yZSB0aGUgdHJhZGl0aW9uYWwgUE9SVCBjb21tYW5kLiBUaGUgY29tbWFuZCBsaW5lCiAgdG9vbCBzZXRzIHRoaXMgb3B0aW9uIHdpdGggJy0tZGlzYWJsZS1lcHJ0Jy4KClZlcnNpb24gNy4xMC41LXByZTIgKDYgTWF5IDIwMDMpCgpEYW5pZWwgKDYgTWF5KQotIEtldmluIERlbGFmaWVsZCByZXBvcnRlZCBhbm90aGVyIGNhc2Ugd2hlcmUgd2UgZGlkbid0IGNvcnJlY3RseSBjaGVjayBmb3IKICBFQUdBSU4gYnV0IG9ubHkgRVdPVUxEQkxPQ0ssIHdoaWNoIGNhdXNlZCBiYWRuZXNzIG9uIEhQVVguCgpEYW5pZWwgKDQgTWF5KQotIEJlbiBHcmVlYXIgbm90aWNlZCB0aGF0IHRoZSBjaGVjayBmb3IgJ3dyaXRhYmxlIGFyZ3YnIGV4aXRlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHdoZW4gcnVuIGZvciBjcm9zcy1jb21waWxpbmcsIHdoaWNoIHdhc24ndCBuaWNlLiBOb3cgaXQnbGwgZGVmYXVsdCB0bwogIG5vIGFuZCBvdXRwdXQgYSB3YXJuaW5nIGFib3V0IHRoZSBmYWN0IHRoYXQgaXQgd2FzIG5vdCBjaGVja2VkIGZvci4KCkRhbmllbCAoMiBNYXkpCi0gQWRkZWQgdGVzdCBjYXNlIDYyIGFuZCBmaXhlZCBzb21lIG1vcmUgb24gdGhlIGNvb2tpZSBzZW5kaW5nIHdpdGggYSBjdXN0b20KICBIb3N0OiBoZWFkZXIgc2V0LgoKRGFuaWVsICgxIE1heSkKLSBBbmR5IENlZGlsbmlrIGZpeGVkIGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzLgoKLSBNYWRlIHRoZSAiU1NMIHJlYWQgZXJyb3I6IDUiIGVycm9yIG1lc3NhZ2UgbW9yZSB2ZXJib3NlLCBieSBhZGRpbmcgY29kZSB0aGF0CiAgcXVlcmllcyB0aGUgT3BlblNTTCBsaWJyYXJ5IHRvIGZpbGwgaW4gdGhlIGVycm9yIGJ1ZmZlci4KCkRhbmllbCAoMzAgQXByKQotIEFkZGVkIHN5cy9zZWxlY3QuaCBpbmNsdWRlIGluIHRoZSBjdXJsL211bHRpLmggZmlsZSwgYWZ0ZXIgaGF2aW5nIGJlZW4KICByZW1pbmRlZCBhYm91dCB0aGlzIGJ5IFJpY2ggR3JheS4KCi0gSSBtYWRlIGVhY2ggdGVzdCBzZXQgaXRzIG93biBzZXJ2ZXIgcmVxdWlyZW1lbnRzLCB0aHVzIGFiYW5kb25pbmcgdGhlCiAgcHJldmlvdXMgc3lzdGVtIHdoZXJlIHRoZSB0ZXN0IG51bWJlciBpbXBsaWVkIHdoYXQgc2VydmVyKHMpIHRvIHVzZSBmb3IgYQogIHNwZWNpZmljIHRlc3QuCgotIERhdmlkIEJhbGF6aWMgbWFkZSBjdXJsIG1vcmUgUkZDMTczOC1jb21wbGlhbnQgZm9yIEZUUCBVUkxzLCBieSBmaXhpbmcgc28KICB0aGF0IGxpYmN1cmwgbm93IHVzZXMgb25lIENXRCBjb21tYW5kIGZvciBlYWNoIHBhdGggcGFydC4gQSBidW5jaCBvZiB0ZXN0CiAgY2FzZXMgd2VyZSBmaXhlZCB0byB3b3JrIGFjY29yZGluZ2x5LgoKLSBDb29raWUgZml4ZXM6CgogIEEuIFNhdmUgZG9tYWlucyBpbiBqYXJzIGxpa2UgTW96aWxsYSBkb2VzLiBJdCBtZWFucyBhbGwgZG9tYWlucyBzZXQgaW4KICAgICBTZXQtQ29va2llOiBoZWFkZXJzIGFyZSBkb3QtcHJlZml4ZWQuCiAgQi4gU2F2ZSBhbmQgdXNlIHRoZSAndGFpbG1hdGNoJyBmaWVsZCBpbiB0aGUgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgamFycwogICAgICh0aGUgc2Vjb25kIGNvbHVtbikuCiAgQy4gUmVqZWN0IGNvb2tpZXMgdXNpbmcgaWxsZWdhbCBkb21haW5zIGluIHRoZSBTZXQtQ29va2llOiBsaW5lLiBDb25jZXJucwogICAgIGJvdGggZG9tYWlucyB3aXRoIHRvbyBmZXcgZG90cyBvciBkb21haW5zIHRoYXQgYXJlIG91dHNpZGUgdGhlIGN1cnJlbnRseQogICAgIG9wZXJhdGluZyBzZXJ2ZXIgaG9zdCdzIGRvbWFpbi4KICBELiBTZXQgdGhlIHBhdGggcGFydCBieSBkZWZhdWx0IHRvIHRoZSBvbmUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgaWYgbm9uZSB3YXMKICAgICBzZXQgaW4gdGhlIFNldC1Db29raWUgbGluZS4KCiAgVG8gbWFrZSBpdGVtIEMgcmVhbGx5IGdvb2QsIEkgYWxzbyBtYWRlIGxpYmN1cmwgbm90aWNlIGN1c3RvbSBIb3N0OiBoZWFkZXJzCiAgYW5kIGV4dHJhY3QgdGhlIGhvc3QgbmFtZSBzZXQgaW4gdGhlcmUgYW5kIHVzZSB0aGF0IGFzIHRoZSBob3N0IG5hbWUgZm9yIHRoZQogIHNpdGUgd2UncmUgZ2V0dGluZyB0aGUgY29va2llcyBmcm9tLiBUaGlzIGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBzaXRlJ3MKICBJUC1hZGRyZXNzLCBidXQgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGFuZCBzZW5kIGl0cyBjb29raWVzIHByb3Blcmx5IGlmCiAgeW91IHByb3ZpZGUgYSB2YWxpZCBIb3N0OiBuYW1lIGZvciB0aGUgc2l0ZS4KCkRhbmllbCAoMjkgQXByKQotIFBldGVyIEtvdmFjcyBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENVUkxJTkZPX0NPTk5FQ1RfVElNRSB3b3JrIGZpbmUKICB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgKHRvbykuCgpWZXJzaW9uIDcuMTAuNS1wcmUxICgyMyBBcHIgMjAwMykKCkRhbmllbCAoMjMgQXByKQotIFVwZ3JhZGVkIHRvIGxpYnRvb2wgMS41LgoKRGFuaWVsICgyMiBBcHIpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgY3VybF9lYXN5X3NldG9wdCgpIHdpbGwgYWx3YXlzICh3cm9uZ2x5KQogIHJldHVybiBDVVJMRV9PSyBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgc29tZSBnemlwIGRlY29tcHJlc3Npb24gYnVncyBhbmQgZmxhd3MuCgpEYW5pZWwgKDE2IEFwcikKLSBGaXhlZCBtaW5vciB0eXBvIGluIG1hbiBwYWdlLCByZXBvcnRlZCBpbiB0aGUgRGViaWFuIGJ1ZyB0cmFja2VyLgoKRGFuaWVsICgxNSBBcHIpCi0gRml4ZWQgc29tZSBGVFAgdGVzdHMgaW4gdGhlIHRlc3Qgc3VpdGUgdGhhdCBmYWlsZWQgb24gbXkgU29sYXJpcyBob3N0LCBkdWUKICB0byB0aGUgY29uZmlnLmggbm90IGJlaW5nIGluY2x1ZGVkIGJlZm9yZSB0aGUgc3lzdGVtIGhlYWRlcnMuIFdoZW4gZG9uZSB0aGF0CiAgd2F5LCBpdCBkaWQgZ2V0IGEgbWl4ZWQgc2Vuc2Ugb2YgaWYgYmlnIGZpbGVzIGFyZSBzdXBwb3J0ZWQgb3Igbm90IGFuZCB0aGVuCiAgc3RhdCgpIGFuZCBmc3RhdCgpIChhcyB1c2VkIGluIHRlc3QgY2FzZSA1MDUpIGdvdCBjb25mdXNlZCBhbmQgZmFpbGVkIHRvCiAgcmV0dXJuIGEgcHJvcGVyIGZpbGUgc2l6ZS4KCi0gRm9ybXBvc3RpbmcgYSBmaWxlIHVzaW5nIGEgLmh0bWwgc3VmZml4IGlzIG5vdyBwcm9wZXJseSBzZXQgdG8gQ29udGVudC1UeXBlOiAgICB0ZXh0L2h0bWwuCgpEYW5pZWwgKDE0IEFwcikKLSBGaXhlZCB0aGUgU1NMIGVycm9yIGhhbmRsaW5nIHRvIHJldHVybiBwcm9wZXIgU1NMIGVycm9yIG1lc3NhZ2VzIGFnYWluLCB0aGV5CiAgYnJva2UgaW4gNy4xMC40LiBJIGFsc28gYXR0ZW1wdCB0byB0cmFjayBkb3duIENBIGNlcnQgcHJvYmxlbXMgYW5kIHRoZW4KICByZXR1cm4gdGhlIENVUkxFX1NTTF9DQUNFUlQgZXJyb3IgY29kZS4KCi0gVGhlIGN1cmwgdG9vbCBub3cgaW50ZXJjZXB0cyB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlIGFuZCBkaXNwbGF5cwogIGEgZmFpcmx5IGJpZyBhbmQgZXhwbGFuYXRvcnkgZXJyb3IgbWVzc2FnZS4gS2V2aW4gUm90aCBoZWxwZWQgbWUgb3V0IHdpdGgKICB0aGUgd29yZGluZy4KCkRhbmllbCAoMTEgQXByKQotIE5pYyBIaW5lcyBwcm92aWRlZCBhIHNlY29uZCBwYXRjaCBmb3IgZ3ppcCBkZWNvbXByZXNzaW9uLCBhbmQgZml4ZWQgYSBidWcKICB3aGVuIGRlZmxhdGUgb3IgZ3ppcCBjb250ZW50cyB3ZXJlIGRvd25sb2FkZWQgdXNpbmcgY2h1bmtlZCBlbmNvZGluZy4KCi0gRGFuIEZhbmRyaWNoIG1hZGUgbGliY3VybCBzdXBwb3J0IGF1dG9tYXRpYyBkZWNvbXByZXNzaW9uIG9mIGd6aXAgY29udGVudHMKICAoYXMgYW4gYWRkaXRpb24gdG8gdGhlIHByZXZpb3VzIGRlZmxhdGUgc3VwcG9ydCkuCgotIEkgbWFkZSB0aGUgQ1dEIGNvbW1hbmQgZHVyaW5nIEZUUCBzZXNzaW9uIGNvbnNpZGVyIGFsbCAyeHkgY29kZXMgdG8gYmUgT0sKICByZXNwb25zZXMuCgpEYW5pZWwgKDEwIEFwcikKLSBWbGFkIEtydXBpbiBmaXhlZCBhIFVSTCBwYXJzaW5nIGlzc3VlLiBVUkxzIHRoYXQgd2VyZSBub3QgdXNpbmcgYSBzbGFzaAogIGFmdGVyIHRoZSBob3N0IG5hbWUsIGJ1dCBzdGlsbCBoYWQgIj8iIGFuZCBwYXJhbWV0ZXJzIGFwcGVuZGVkLCBhcyBpbgogICJodHRwOi8vaG9zdG5hbWUuY29tP2Zvb2Jhcj1tb28iLCB3ZXJlIG5vdCBwcm9wZXJseSBwYXJzZWQgYnkgbGliY3VybC4KCkRhbmllbCAoOSBBcHIpCi0gTWFkZSBDVVJMT1BUX1RJTUVDT05ESVRJT04gd29yayBmb3IgRlRQIHRyYW5zZmVycywgdXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzCiAgZm9yIEhUVFAuIFRoaXMgdGhlbiBtYWRlIC16IHdvcmsgZm9yIGZ0cCB0cmFuc2ZlcnMgdG9vLiBBZGRlZCB0ZXN0IGNhc2UgMTM5CiAgYW5kIDE0MCBmb3IgdmVyaWZ5aW5nIHRoaXMuCgotIEdldHRpbmcgdGhlIGZpbGUgZGF0ZSBvZiBhbiBmdHAgZmlsZSB1c2VkIHRoZSB3cm9uZyB0aW1lIHpvbmUgd2hlbgogIGRpc3BsYXllZC4gSXQgaXMgc3VwcG9zZWRseSBhbHdheXMgR01ULiBBZGRlZCB0ZXN0IGNhc2UgMTQxIGZvciB0aGlzLgoKLSBNYWRlIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciBzdXBwb3J0IE1EVE0uCgotIFRoZSBkZWZhdWx0IERFQlVHRlVOQ1RJT04sIGFzIGVuYWJsZWQgd2l0aCBDVVJMT1BUX1ZFUkJPU0Ugbm93IG91dHB1dHMKICBDVVJMSU5GT19IRUFERVJfSU4gZGF0YSBhcyB3ZWxsLiBUaGUgbW9zdCBub3RhYmxlIGVmZmVjdCBmcm9tIHRoaXMgaXMgdGhhdAogIHVzaW5nIGN1cmwgLXYsIHlvdSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyAiaGVhZGVycyIgYXMgd2VsbC4gVGhpcyBpcwogIHBlcmhhcHMgbW9zdCB1c2VmdWwgd2hlbiBkb2luZyBmdHAuCgpEYW5pZWwgKDggQXByKQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgZmxhdyBpbiB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gY29kZSwgd2hpY2ggbWlzc2VkCiAgdGhlIGZpcnN0IGxldHRlciBpZiBubyBzcGFjZSBmb2xsb3dlZCB0aGUgY29sb24uCgotIE1hZ251cyBOaWxzc29uIHBvaW50ZWQgb3V0IHRoYXQgc2hhcmUuYyB3YXMgbWlzc2luZyBpbiB0aGUgTVNWQyBwcm9qZWN0CiAgZmlsZS4KCkRhbmllbCAoNiBBcHIpCi0gUnlhbiBXZWF2ZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIHRoZSBDQSBjZXJ0IGJ1bmRsZSBub3QgZ2V0IGluc3RhbGxlZAogIGFueW1vcmUgd2hlbiAnY29uZmlndXJlIC0td2l0aG91dC1zc2wnIGhhcyBiZWVuIHVzZWQuCgpEYW5pZWwgKDQgQXByKQotIE1hcnRpam4gQnJvZW5sYW5kIGZvdW5kIGFub3RoZXIgY2FzZXMgd2hlcmUgYSBzZXJ2ZXIgYXBwbGljYXRpb24gZGlkbid0CiAgbGlrZSB0aGUgYm91bmRhcnkgc3RyaW5nIHVzZWQgYnkgY3VybCB3aGVuIGZvaW5nIGEgbXVsdGktcGFydC9mb3JtcG9zdC4gV2UKICBtb2RpZmllZCB0aGUgYm91bmRhcnkgc3RyaW5nIHRvIGxvb2sgbGlrZSB0aGUgb25lIElFIHVzZXMsIGFzIHRoaXMgaXMKICBwcm9iYWJseSBnb25uYSBtYWtlIGN1cmwgd29yayB3aXRoIG1vcmUgYXBwbGljYXRpb25zLgoKRGFuaWVsICgzIEFwcikKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHRoYXQgYSBidW5jaCBvZiB0ZXN0cyBmYWlscyBvbiBjeWd3aW4uIE9uZSBzZXQgZmFpbHMKICB3aGVuIHVzaW5nIHBlcmwgNS44IChhbmQgdGhleSBydW4gZmluZSB3aXRoIHBlcmwgNS42KSwgYW5kIGFub3RoZXIgc2V0CiAgZmFpbGVkIGJlY2F1c2Ugb2YgYW4gYXJ0aWZhY3QgaW4gdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHRoYXQgSQogIGNvcnJlY3RlZC4gSXQgdHVybmVkIG91dCB0aGUgRlRQIHNlcnZlciBjb2RlIHdhcyBzdGlsbCBoYXZpbmcgYSBmaWxlIG9wZW5lZAogIHdoaWxlIHRoZSBtYWluIHRlc3Qgc2NyaXB0IHJlbW92ZWQgaXQgYW5kIGludm9rZWQgdGhlIEhUVFAgc2VydmVyIHRoYXQKICBhdHRlbXB0ZWQgdG8gY3JlYXRlIHRoZSBzYW1lIGZpbGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgRlRQIHNlcnZlciBrZXB0IG9wZW4uCiAgVGhpcyBvcGVyYXRpb24gd29ya3MgZmluZSBvbiB1bml4LCBidXQgbm90IG9uIGN5Z3dpbi4KClZlcnNpb24gNy4xMC40ICgyIEFwciAyMDAzKQoKRGFuaWVsICgxIEFwcikKLSBBZGRlZCB0ZXN0IGNhc2UgNTA1IHRvIGV4ZXJjaXNlIEZUUCB1cGxvYWQgd2l0aCByZW5hbWUgZG9uZSB3aXRoIGxpYmN1cmwsCiAgYW5kIGZvciB0aGF0IEkgaGFkIHRvIGV4dGVuZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gZGVhbCB3aXRoIHRoZQogIFJORlIgYW5kIFJOVE8gY29tbWFuZHMuCgpEYW5pZWwgKDMxIE1hcikKLSBFdmVuIG1vcmUgU1NMIGNvbmZpZyBjaGVjayBtb2RpZmljYXRpb25zIGFmdGVyIFJpY2hhcmQncyB0ZXN0aW5nLgoKVmVyc2lvbiA3LjEwLjQtcHJlNiAoMzEgTWFyIDIwMDMpCgpEYW5pZWwgKDMxIE1hcikKLSBNb3JlIGZpeGVzIGZvciB0aGUgU1NMIHNlc3Npb24gSUQgY2FjaGUgY2hlY2tzIHdoZW4gU1NMIGNvbmZpZ3MgYXJlIGNoYW5nZWQKICBiZXR3ZWVuIGNvbm5lY3Rpb25zLiBCYXNlZCBvbiB0ZXN0cyBhbmQgdGFsa3Mgd2l0aCBSaWNoYXJkIEJyYW1hbnRlLgoKLSBHdWlsbGF1bWUgQ290dGVuY2VhdSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWRkZWQgQ1VSTE9QVF9VTlJFU1RSSUNURURfQVVUSC4KICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgcHJldmVudCBsaWJjdXJsIGZyb20gbGltaXRpbmcgdG8gd2hpY2ggaG9zdCBpdCBzZW5kcwogIHVzZXIrcGFzc3dvcmQgdG8gd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLiBCeSBkZWZhdWx0LCBsaWJjdXJsIG9ubHkgc2VuZHMKICBuYW1lIGFuZCBwYXNzd29yZCB0byB0aGUgb3JpZ2luYWwgaG9zdCB1c2VkIGluIHRoZSBmaXJzdCBVUkwsIGJ1dCB3aXRoIHRoaXMKICBvcHRpb24gc2V0IGl0IHdpbGwgc2VuZCB0aGUgYXV0aCBpbmZvIHRvIGFsbCBob3N0cyBpdCBmb2xsb3dzIGxvY2F0aW9uCiAgaGVhZGVycyB0by4gVGhlIG5ldyB0b29sIGNvbW1hbmQgbGluZSBvcHRpb24gZm9yIHRoaXMgaXMgbmFtZWQKICAiLS1sb2NhdGlvbi10cnVzdGVkIi4KCi0gRnJhbmtpZSBGb25nIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIGxpYmN1cmwgaWYgeW91IHJlLXVzZWQgYW4gZWFzeSBoYW5kbGUKICB3aXRoIGEgcHJveHksIGFuZCB5b3UgZmlyc3QgbWFkZSBhIGh0dHBzOi8vIGNvbm5jdGlvbiB0byBhIGhvc3QgYW5kIHRoZW4KICBzd2l0Y2hlZCB0byBhIGh0dHA6Ly8gb25lIHRvIHRoZSBzYW1lIGhvc3QuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHJlLXVzZQogIHRoZSBzYW1lIGNvbm5lY3Rpb24gZm9yIGl0IGFuZCBmYWlsIHRvIGdldCB0aGUgc2Vjb25kIFVSTCBwcm9wZXJseQoKRGFuaWVsICgyOSBNYXIpCi0gRGFuIFNoZWFyZXIncyBmaXggdGhhdCBtYWtlcyBjdXJsIGNvbXBsYWluIGlmIGludm9rZWQgd2l0aCBub3RoaW5nIGJ1dCAiY3VybAogIC1PIiB3YXMgYXBwbGllZC4KCkRhbmllbCAoMjYgTWFyKQotIEJyeWFuIEtlbXAgd2FzIGZyaWVuZGx5IGVub3VnaCB0byBsZW5kIG1lIGFuIGFjY291bnQgb24gaGlzIFJlZGhhdCA5IGJveCBhbmQKICBJIGNvdWxkIGZpeCB0aGUgY29uZmlndXJlIHByb2JsZW1zIG9uIHJlZGhhdCA4LjEgYW5kIDkgaW4gbm8gdGltZSB0aGFua3MgdG8KICB0aGlzLiBUaGFua3MgYSBidW5jaCBCcnlhbiEKCkRhbmllbCAoMjUgTWFyKQotIFJlbmFtZWQgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYwoKVmVyc2lvbiA3LjEwLjQtcHJlNSAoMjUgTWFyIDIwMDMpCgpEYW5pZWwgKDI1IE1hcikKLSBSaWNoYXJkIEJyYW1hbnRlIHByb3ZpZGVkIGEgZml4IGZvciBhIGhhbmRsZSByZS11c2UgcHJvYmxlbSBzZWVuIHdoZW4geW91CiAgY2hhbmdlIG9wdGlvbnMgb24gYW4gU1NMLWVuYWJsZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcXVlc3RzLiBQcmV2aW91c2x5LAogIGNoYW5naW5nIHBlZXIgdmVyaWZpY2F0aW9uIG9yIGhvc3QgdmVyaWZpY2F0aW9uIGFuZCBzaW1pbGFyIHRoaW5ncyB3YXMgbm90CiAgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gYSBjb25uZWN0aW9uIHdlcmUgY2hlY2tlZCBmb3IgcmUtdXNlIGFuZCB0aHVzCiAgZW5hYmxpbmcgc3RyaWN0ZXIgY2hlY2sgYmV0d2VlbiByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiBtYWRlIG5vCiAgZGlmZmVyZW5jZSBhbmQgdGhlIGNvbm5lY3Rpb24gd291bGQgdGh1cyBiZSB1c2VkIGVycm9uZW91c2x5LgoKRGFuaWVsICgyNCBNYXIpCi0gR/Z0eiBCYWJpbi1FYmVsbCBwb2ludGVkIG91dCB0aGF0IHRoZSBjYS1idW5kbGUuY3J0IGZpbGUgY29udGFpbmVkIGEKICBjZXJ0aWZpY2F0ZSBmcm9tIFRydXN0Y2VudGVyIHRoYXQgd2FzIGEgZGVtbyBjZXJ0aWZpY2F0ZSBvbmx5IHRoYXQgd2FzIG5ldmVyCiAgaW5kZW5kZWQgdG8gYmUgcGFydCBvZiBhIENBIGJ1bmRsZS4KCkRhbmllbCAoMjEgTWFyKQotIExpZmUgaXMgYSBteXN0ZXJ5LiBXaXRoaW4gYSB0aW1lIHBlcmlvZCBvZiAxNyBob3VycywgVGltIFBvcGUgYW5kIE1pY2hhZWwKICBDaHVyY2hpbGwgZmlsZWQgb25lIGJ1ZyByZXBvcnQgZWFjaCwgYm90aCBpZGVudGlmeWluZyBwcm9ibGVtcyB3aXRoIGEgc2Vjb25kCiAgdHJhbnNmZXIgd2hlbiBkb2luZyBwZXJzaXN0YW50IHRyYW5zZmVycyByZS11c2luZyBhIGNvbm5lY3Rpb24uIFRpbSdzIG9uZSBpcwogICM3MDY2MjQsIGxhYmVsZWQgIk11bHRpcGxlIHVwbG9hZHMgcGVyIGhhbmRsZSBmYWlsIiBhbmQgTWljaGFlbCdzICM3MDcwMDMKICAiRG9lcyBub3Qgc2VuZCBBdXRob3JpemF0aW9uOiBoZWFkZXIgd2hlbiByZXVzaW5nIGNvbm5lY3Rpb24iLiBJIGNvdWxkIHRyYWNrCiAgYm90aCBkb3duIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGxvZ2ljIGFuZCBpdCB0dXJuZWQgb3V0IGxpYmN1cmwgd2FzIG5vdCB1c2luZwogIG5ldyBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIHJlLXVzaW5nIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uIFRoaXMgY29uY2VybmVkCiAgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIGFuZCBpbnZvbHZlZCBleGFjdGx5IHRob3NlIHBpZWNlcyB0aGVzZSB0d28KICByZXBvcnRzIGlkZW50aWZpZWQuIFRoaXMgY29kZSBoYXMgYmVlbiB0aGlzIGZhdWx0eSBzaW5jZSB0aGUgZGF5IEkKICBpbnRyb2R1Y2VkIHBlcnNpc3RhbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwsIG1vcmUgdGhhbiAyIHllYXJzIGFnby4KCkRhbmllbCAoMjAgTWFyIDIwMDMpCi0gRml2ZSB5ZWFyIGFubml2ZXJzYXJ5LiBUb2RheSBmaXZlIHllYXJzIGFnbywgdGhlIGZpcnN0IGV2ZXIgY3VybCByZWxlYXNlIHNhdwogIHRoZSBsaWdodCBvZiBkYXkuCgpEYW5pZWwgKDE3IE1hcikKLSBBbmR5IENlZGlsbmlrIGNvcnJlY3RlZCBmbGF3cyBpbiBzb21lIGxpYmN1cmwgZXhhbXBsZS11c2FnZSBzb3VyY2VzLgoKRGFuaWVsICgxNiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgcmVwb3J0ZWQgdGhhdCB0aGUgZml4IGZyb20gTWFyY2ggMm5kIHdhcyBpbmNvbXBsZXRlLgoKLSBBZGRlZCBjb2RlIHRvIHRoZSBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yIHNlbGVjdCgpIGFyZ3VtZW50IHR5cGVzLiBJJ3ZlCiAgbm90IG1hZGUgYW55IGNvZGUgdXNlIHRoZSByZXN1bHRzIGp1c3QgeWV0IHRob3VnaC4KCkRhbmllbCAoMTUgTWFyKQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIHR3byBwYXRjaGVzIHRvIGJ1aWxkIGJldHRlciBvbiBXaW5kb3dzLgoKLSBBZGp1c3RlZCB0aGUgdGVzdCBzdWl0ZSBjb2RlIHRvIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyKHMpIHJlcXVpcmVkCiAgZm9yIGEgc3BlY2lmaWMgdGVzdCBpcyBwcm9wZXJseSBzdGFydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIGF0dGVtcHRlZC4KICBNYW55IHRlc3RzIG5vdyBydW4gYSBsb3QgZmFzdGVyIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgxNCBNYXIpCi0gQW5vdGhlciBjb25maWd1cmUuaW4gYWRqdXN0bWVudCBtYWRlIHRoZSBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBwcm9wZXJseQogIG9uIEhQVVggbm93LgoKRGFuaWVsICgxMyBNYXIpCi0gUGhpbGlwcGUgUmFvdWx0IGZpeGVkIHByZTQtY29tcGlsZSBxdWlya3MgZm9yIEZyZWVCU0QuCgpWZXJzaW9uIDcuMTAuNC1wcmU0ICgxMyBNYXIgMjAwMykKCkRhbmllbCAoMTMgTWFyKQotIEFkZGVkIGEgYmFja3VwLWNoZWNrIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgYnkgQUNfQ0hFQ0tfRlVOQ1MoKQogIGFzIEkgYmVsaWV2ZSBzb21lIGNoZWNrcyBvbiBIUFVYIG5lZWQgdGhpcy4gQXQgbGVhc3Qgc29tZSBvZiB0aGUgaW5mbyBnaXZlbgogIHRvIHVzIGJ5IFJpY2sgSm9uZXMgc2VlbWVkIHRvIGluZGljYXRlIHRoaXMuCgpEYW5pZWwgKDEyIE1hcikKLSBUaG9tYXMgVG9uaW5vIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIHRoZSBjdXJsIHRvb2wgdG8gZG8gUFVUIG9wZXJhdGlvbnMKICBhcyBpbiAnY3VybCB3d3cuZm9vLmNvbS9kaXIvIC1UIGZpbGUnIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVkIGZvciBleGFtcGxlCiAgc3BhY2Ugb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGRvbid0IGJlbG9uZyBpbiBVUkxzLCBjdXJsIGRpZCBub3QgcHJvcGVybHkKICBVUkwgZW5jb2RlIHRoZW0gYmVmb3JlIHVzaW5nIHRoZW0gaW4gdGhlIFVSTC4KCi0gQWRkZWQgYW4gb3B0aW9uIHRvIGNvbmZpZ3VyZSBjYWxsZWQgLS1lbmFibGUtbGliZ2NjIHRoYXQgc2ltcGx5IGFkZHMgLWxnY2MKICB0byB0aGUgTElCUyB2YXJpYWJsZSwgYXMgdGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtLgoKLSBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUuaW4gZmlsZSwgc28gdGhhdCB0aGUgaGVhZGVycyBhcmUgbm93IGNoZWNrZWQgaW4gYW4KICBvcmRlciBvZiAidmlhbGl0eSIuIFdlIG11c3QgYWxzbyBtYWtlIHN1cmUgdG8gdXNlIHRoZSAiZGVmYXVsdCBoZWFkZXJzIgogIHBhcmFtZXRlciB0byBBQ19DSEVDS19IRUFERVJTKCkgc28gdGhhdCBoZWFkZXJzIGFyZSBjaGVja2VkIHdpdGggdGhlIHByb3BlcgogIHByZXJlcXVpc2l0ZXMgaW5jbHVkZWQgKGkuZSBhbGwgdGhlIG1ham9yIGFuZCBnZW5lcmFsbHkgaW1wb3J0YW50IGhlYWRlcgogIGZpbGVzIGFyZSBpbmNsdWRlZCB0aGVyZSBieSBkZWZhdWx0KS4gVGhpcyBtaWdodCBiZSB3aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMKICBTdW4sIEhQLCBBSVggYW5kIFRydTY0IHN5c3RlbXMgdG8gYmVoYXZlIGdvb2QgYWdhaW4gb24gdGhlIGhlYWRlciBjaGVjawogIGZyb250LgoKLSBSaWNrIEpvbmVzIHBvaW50ZWQgb3V0IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIG9uIEhQLVVYIHRoYXQgSSBhZGRyZXNzZWQuCgotIEkgbWFkZSB0aGUgY29uZmlndXJlIC0taGVscCBvdXRwdXQgbmljZXIgYnkgdXNpbmcgQUNfSEVMUF9TVFJJTkcoKSBhIGxvdAogIG1vcmUuCgpEYW5pZWwgKDExIE1hcikKLSBDaHJpc3RvcGhlIERlbW9yeSBmaXhlZCB0aGUgc29ja2V0IHNlbmRpbmcgY29kZSB0byB3b3JrIGJldHRlciBvbiBIUC1VWAogIHdoZW4gc2VuZGluZyBkYXRhIHRvIGEgc29ja2V0IHRoYXQgd291bGQgYmxvY2suIEl0IHRoZW4gcmV0dXJucyBFQUdBSU4sIG5vdAogIEVXT1VMREJMT0NLLgoKLSBSaWNoYXJkIEdvcnRvbiBpbXByb3ZlZCB0aGUgc2VlZGluZyBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgZ29vZAogIGFuZCByZWxpYWJsZSByYW5kb20gc291cmNlLgoKLSBSaWNoYXJkIEdvcnRvbiBmaXhlZCBhIGZldyB3YXJuaW5ncyB0aGF0IHBvcHBlZCB1cCB3aGVuIHlvdSBidWlsdCBjdXJsCiAgdXNpbmcgdGhlIFN1biBjb21waWxlciBvbiBhIDY0Yml0IFNQQVJDIHBsYXRmb3JtLgoKLSBNYXJ0aW4gQy4gTWFydGluIGZpeGVkIGEgY2FzZSB3aGVyZSBhIGNvbm5lY3QgZmFpbHVyZSB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgZGlkbid0IHByb2R1Y2UgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcuCgpEYW5pZWwgKDEwIE1hcikKLSBSZXZlcnRlZCBsdG1haW4uc2ggYmFjayB0byBsaWJ0b29sIDEuNC4yIHN0YXR1cyBhZ2FpbiwgYXMgdGhlIDEuNC4zIHZlcnNpb24KICBicm9rZSB0aGUgYnVpbGQgb24gbnVtZXJvdXMgcGxhdGZvcm1zLiBJdCBzZWVtcyB0aGF0IGxpYnRvb2wgMS40LjMgcHV0cyBzb21lCiAgcmVxdWlyZW1lbnRzIG9uIHdoYXQgdmVyc2lvbnMgb2YgdGhlIG90aGVyIHRvb2xzIChhdXRvY29uZiArIGF1dG9tYWtlKSB0aGF0CiAgSSBhbSBub3QgZmFtaWxpYXIgd2l0aCBhbmQgdGh1cyBJIGNvdWxkbid0IGZ1bGZpbGwgYXQgdGhpcyBwb2ludC4KCiAgWWVzLCB0aGlzIGlzIG1vcmUgdGhhbiBtaWxkbHkgZnJ1c3RyYXRpbmcuCgpEYW5pZWwgKDcgTWFyKQotIFJ1biBsaWJ0b29saXplIHZlcnNpb24gMS40LjMuCgpWZXJzaW9uIDcuMTAuNC1wcmUzICg0IE1hciAyMDAzKQoKRGFuaWVsICgzIE1hcikKLSBBZGRlZCBzaGFyZS5vYmogdG8gdGhlIFZDNiBhbmQgQm9ybGFuZCBsaWJjdXJsIG1ha2VmaWxlcy4KCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZvdW5kIGFuZCBpbnZlc3RpZ2F0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBvbiBBSVgsCiAgcHJlc3VtYWJseSBvbmx5IG9uIDQuMyBvciBsYXRlci4gZ2V0aG9zdGJ5bmFtZV9yKCkgaXMgbm90IHJldHVybmluZyBkYXRhCiAgdGhhdCBpcyBwb3NzaWJsZSB0byAia2VlcCIgYW5kIGNhY2hlIHRoZSB3YXkgbGliY3VybCBkb2VzLiBCdXQgaW5zdGVhZCB0aGVzZQogIHZlcnNpb25zIG9mIEFJWCB1c2VzIGEgZ2V0aG9zdGJ5bmFtZSgpIHRoYXQgd29ya3MgdGhyZWFkLXNhZmVseSB3ZSBjYW4KICBpbnN0ZWFkIHVzZSB0aGUgb3JkaW5hcnkgZ2V0aG9zdGJ5bmFtZSgpIGFuZCBvdXIgcGFja19ob3N0ZW50KCkgYXBwcm9hY2ggdG8KICBhY2hpZXZlIHdoYXQgd2Ugd2FudC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGF0dGVtcHRzIHRvIGRldGVjdCBBSVggNC4zIG9yCiAgbGF0ZXIgdG8gYWRqdXN0IGZvciB0aGlzLgoKRGFuaWVsICgyIE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSBmb3VuZCBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjEwLjMgd2hlbiB5b3UgZmlyc3QgZGlkIGEKICBQT1NUIGFuZCB0aGVuIGJhY2sgdG8gYSBHRVQgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUuCgpEYW5pZWwgKDI4IEZlYikKLSBSZW1vdmVkIHRoZSBzdHJlcXVhbCBhbmQgc3RybmVxdWFsIGRlZmluZXMgZnJvbSBjdXJsL2N1cmwuaCBoZWFkZXIuIFRoZXkKICB3ZXJlIG5ldmVyIG1lYW50IGZvciB0aGUgcHVibGljIGhlYWRlciBhbnl3YXkuIFBoaWxpcHBlIFJhb3VsdCBicm91Z2h0IGl0CiAgdXAuCgotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBSSVNDIE9TIGJ1aWxkLgoKRGFuaWVsICgyNyBGZWIpCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoZSB2ZXJ5IG1pc2xlYWRpbmcgY3VybF9tdWx0aV9pbmZvX3JlYWQgbWFuIHBhZ2UsIGFuZAogIEkgdXBkYXRlZCBpdCB0byBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkaW5nIHRoYXQgdHVybmVkIG91dCB0bwogIGJlIGhpcyBGVFAgc2VydmVyIHJldHVybmluZyBzaXplIHplcm8gKDAgYnl0ZXMpIHdoZW4gU0laRSB3YXMgdXNlZCBvbiBhIGZpbGUKICB3aGlsZSBiZWluZyBpbiBCSU5BUlkgbW9kZS4gV2Ugbm93IG1ha2UgYSBzZWNvbmQgY2hlY2sgZm9yIHRoZSBhY3R1YWwgc2l6ZQogIGJ5IHNjYW5uaW5nIHRoZSBSRVRSIHJlcGx5IGFueXdheSwgZXZlbiBpZiB0aGUgU0laRSBjb21tYW5kIHJldHVybmVkIDAuCgpEYW5pZWwgKDI2IEZlYikKLSBLeWxlIFNhbGxlZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgaGUgd291bGQgZG8gYSB0cmFuc2ZlciB0aGF0IGRpZG4ndCB1cGRhdGUKICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcHJvcGVybHkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBjYXNlIHdoZXJlIGxpYmN1cmwgd291bGQKICBsb29wIGEgbGl0dGxlIHRvbyBlYWdlcmx5IGluIHRoZSB0cmFuZmVyIGxvb3AsIHdoaWNoIGlzbid0IHJlYWxseSBnb29kIGZvcgogIHRoZSBBUElzLCBlc3BlY2lhbGx5IG5vdCB0aGUgbXVsdGkgQVBJLgoKVmVyc2lvbiA3LjEwLjQtcHJlMiAoMjQgRmViIDIwMDMpCgpEYW5pZWwgKDI0IEZlYikKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgb3V0IHRoYXQgc2V0dGluZyBDVVJMT1BUX01BWENPTk5FQ1RTIHRvIGEgdmFsdWUgaGlnaGVyCiAgdGhhbiA1IGNvdWxkIGNhdXNlIGEgc2VnZmF1bHQuCgotIEkgYmVsaWV2ZSBJIGZpeGVkIHRoZSAnRXhwZWN0OiAxMDAtY29udGludWUnIGJlaGF2aW9yIHRoYXQgaGFzIGJlZW4gYnJva2VuCiAgZm9yIGEgd2hpbGUgKEkgdGhpbmsgc2luY2UgbXkgY2hhbmdlIGRhdGVkIERlYyAxMCAyMDAyKS4gV2hlbiB0aGlzIGhlYWRlciBpcwogIHVzZWQsIGxpYmN1cmwgc2hvdWxkIHdhaXQgZm9yIGEgSFRUUCAxMDAgKG9yIHRpbWVvdXQpIGJlZm9yZSBzZW5kaW5nIHRoZQogIHBvc3QvcHV0IGRhdGEuCgpEYW5pZWwgKDE0IEZlYikKLSBNYXR0aGV3IENsYXJrZSBwcm92aWRlZCBzb21lIGluZm8gd2hhdCB0byBtb2RpZnkgdG8gbWFrZSBjdXJsIGJ1aWxkCiAgZmxhd2xlc3NseSBvbiBBSVggMy4yLjUuCgotIE1hcnRpbiBDLiBNYXJ0aW4gZm91bmQgYW5kIGZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdoZW4KICBydW5uaW5nIG9uIFdpbmRvd3MgYW5kIHRyeWluZyB0byBjb25uZWN0IHRvIGEgcG9ydCB3aXRob3V0IGEgbGlzdGVuZXIuCgpEYW5pZWwgKDEzIEZlYikKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZml4ZWQgQ3VybF9iYXNlNjRfZW5jb2RlKCkgdG8gZGVhbCB3aXRoIHplcm9lcyBpbiB0aGUKICBkYXRhIHRvIGVuY29kZS4KCkRhbmllbCAoNCBGZWIpCi0gSmVhbi1QaGlsaXBwZSBhZGRlZCB0aGUgZmlyc3QgY29kZSB0aGF0IGVuYWJsZXMgdGhlICdzaGFyZScgc3lzdGVtLiBUaGlzCiAgc2hvdWxkIG5vdyBlbmFibGUgc2hhcmluZyBvZiBETlMgZGF0YSBiZXR3ZWVuIHR3byBjdXJsIGVhc3kgaGFuZGxlcy4KCi0gSW5jb3Jwb3JhdGVkIE5pY28gQmFnZ3VzJyBmaXhlcyB0byBhZ2FpbiBjb21waWxlIGZsYXdsZXNzbHkgb24gVk1TLgoKLSBKYW1lcyBCdXJzYSBjb3JyZWN0ZWQgYSBiYWQgY29tbWVudCBpbiB0aGUgcHVibGljIGluY2x1ZGUgZmlsZSBjdXJsL211bHRpLmgKCi0gUGV0ZXIgRm9ycmV0IHJlcG9ydGVkIG9uZSBvZiB0aG9zZSBlcnJvcjowMDAwMDAwMCBjYXNlcyBpbiBsaWJjdXJsIGFnYWluCiAgd2hlbiBjb25uZWN0aW5nIHRvIGEgSFRUUFMgc2l0ZSwgYW5kIHRoaXMgdGltZSBJIGRpZCBkaXNjb3ZlciBzb21lIG9kZGl0aWVzCiAgaW4gaG93IGN1cmwgcmVwb3J0cyBTU0wgZXJyb3JzIGJhY2suIEl0IGNvdWxkIG1pc3Mgc2hvd2luZyB0aGUgYWN0dWFsIGVycm9yLgoKVmVyc2lvbiA3LjEwLjQtcHJlMSAoMyBGZWIgMjAwMykKCkRhbmllbCAoMyBGZWIpCi0gUmVtb3ZlZCB0aGluZ3MgaW4gdGhlIGRvY3Mgc2F5aW5nIGNhcGF0aCBkb2Vzbid0IHdvcmsgb24gV2luZG93cywgYXMgSnVsaWFuCiAgTm9ibGUgdG9sZCB1cyBpdCB3b3JrcyBmaW5lLgoKRGFuaWVsICgzMSBKYW4pCi0gS2V2aW4gUm90aCBmaXhlZCB0aGUgemxpYiBidWlsZCBzdHVmZiBpbiB0aGUgTWluZ3czMiBtYWtlZmlsZS4KCkRhbmllbCAoMzAgSmFuKQotIEtldmluIFJvdGggZm91bmQgb3V0IHRoYXQgY3VybCBvbiBXaW5kb3dzIGFsd2F5cyBjaGVja2VkIGZvciB0aGUgQ0EgY2VydAogIGJ1bmRsZSB1c2luZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHRoZSBwYXRoIHNjYW4sIGV2ZW4gdGhvdWdoCiAgLWsvLS1pbnNlY3VyZSB3YXMgdXNlZC4KCi0gSGFtaXNoIE1hY2tlbnppZSBwb2ludGVkIG91dCB0aGF0IGN1cmwgb25seSBkaWQgc3RyaWN0IGhvc3QgbmFtZSB2ZXJpZnlpbmcKICBpZiBjYXBhdGggb3IgY2FpbmZvIHdhcyB1c2VkLiBOb3cgaXQnbGwgYWx3YXlzIGRvIGl0IHVubGVzcyAtayAvIC0taW5zZWN1cmUKICBpcyB1c2VkIQoKLSBQYXZlbCBDZW5layBwb2ludGVkIG91dCB0aGF0IHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiB3YXMgZG9uZSB3cm9uZ2x5CiAgYXMgdGhlIGZ1bGwgc3RyaW5nIHdhcyBub3QgZmV0Y2hlZC4gQWRkZWQgdGVzdCBjYXNlIDU3IHRvIHZlcmlmeSB0aGF0IGN1cmwKICBkb2VzIGl0IHJpZ2h0IG5vdy4KCkRhbmllbCAoMjkgSmFuKQotIEphbWllIFdpbGtpbnNvbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGN1cmwgYXR0ZW1wdCB0byBjbGVhciBvdXQKICAic2Vuc2l0aXZlIiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHNvIHRoYXQgdGhleSBkb24ndCBhcHBlYXIgaW4gcHMgb3V0cHV0cwogIChvbmx5IG9uIHBsYXRmb3JtcyB0aGF0IGFsbG93IHdyaXRpbmcgdG8gYXJndltdKS4KCi0gSm9obiBNY0dvd2FuIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIGNvdWxkIGJlIGNhbGxlZCB3aXRoIGJhZAogIGFyZ3VtZW50cyBhbmQgdGh1cyBjYXVzZSB0aGUgLS10cmFjZSBvdXRwdXRzIHRvIGdvIHdyb25nLgoKLSBSZW1vdmVkIGFsbCB0aGUgZW1hY3MgbG9jYWwgdmFyaWFibGVzIGZyb20gYWxsIGZpbGVzLiBNYXRzIExpZGVsbCBwcm92aWRlZAogIHRoZSBuZXcgc2FtcGxlLmVtYWNzIGZpbGUgKGZvciBhIHNhbXBsZSBvZiB3aGF0IHRvIGluY2x1ZGUgaW4geW91ciAuZW1hY3MpCiAgYW5kIHRoZSBjdXJsLXN0eWxlLmVsIHRoYXQgc2V0cyBhIGJldHRlciBjLXN0eWxlIGZvciBlZGl0aW5nIGN1cmwgc291cmNlcy4KCi0gRGF2ZSBIYWxiYWtrZW4gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkcyB0aGF0IGNvdWxkIGFjY2lkZW50bHkKICByZXR1cm4gQ1VSTEVfUEFSVElBTF9GSUxFIHdoZW4gY3VybF9lYXN5X3BlcmZvcm0oKSB3YXMgY2FsbGVkIHdpdGggTk9CT0RZCiAgc2V0IFRSVUUuCgpEYW5pZWwgKDI3IEphbikKLSBUaGUgZm9wZW4uYyBleGFtcGxlIHdhcyBmbGF3ZWQgYXMgTmljayBIdW1mcmV5IG5vdGljZWQsIGFuZCBJIGZpeGVkIGl0IHRvCiAgd29yayBhZ2Fpbi4KCkRhbmllbCAoMjQgSmFuKQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrICh0aGUgY29udGVudC10eXBlIHN0cmluZykKICB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuCgpEYW5pZWwgKDIyIEphbiAyMDAzKQotIElhbiBXaWxrZXMgYW5kIExlZ29mZiBWaW5jZW50IGJvdGggaW5kZXBlbmRlbnRseSBwcm92aWRlZCBmaXhlcyBmb3IgbWFraW5nCiAgY3VybC9tdWx0aS5oIHdvcmsgcHJvcGVybHkgd2hlbiBjb21waWxlZCB3aXRoIGEgQysrIGNvbXBpbGVyLgoKRGFuaWVsICgyMCBKYW4gMjAwMykKLSBGaXhlZCAnYnVpbGRjb25mJyB0byBjaGVjayB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcmVxdWlyZWQgdG9vbHMgYmVmb3JlCiAgdGhleSdyZSBhY3R1YWxseSB1c2VkLgoKLSBXcm90ZSAndGVzdGN1cmwuc2gnLCBhIHNjcmlwdCB0YXJnZXRlZCBmb3IgYXV0b21hdGljIGFuZCBkaXN0cmlidXRlZCBjdXJsCiAgdGVzdHMgb24gdmFyaW91cyBwbGF0Zm9ybXMuCgotIERhdmlkIFRoaWVsIHBvaW50ZWQgb3V0IHRoYXQgdGhlIC5uZXRyYyBmaWxlIHdhcyBub3QgYmVpbmcgZGVhbHQgd2l0aAogIHByb3Blcmx5IGFueW1vcmUuIEkgYnJva2UgdGhpcyBpbiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nICJmaXgiLgoKLSBNYXJrdXMgRi5YLkouIE9iZXJodW1lciBwYXRjaGVkIGxpYmN1cmwgdG8gYWxsb2NhdGUgdGhlIHNjcmF0Y2ggYnVmZmVyIG9ubHkKICBvbiBkZW1hbmQgYW5kIHRodXMgd2Ugc2F2ZSAzMktCIGluIGVhY2ggY3VybCBoYW5kbGUgdGhhdCBkb24ndCB1c2UgdGhhdAogIGJ1ZmZlci4gVGhpcyBuZWVkIGFwcGVhcmVkIHdoZW4gc29tZSBwZW9wbGUgc3RhcnRlZCB1c2luZyB0aG91c2FuZHMgb2YKICBzaW11bHRhbmVvdXMgY3VybCBoYW5kbGVzLi4uIDotKQoKRGFuaWVsICgxNiBKYW4gMjAwMykKLSBNYXJrdXMgT2Jlcmh1bWVyIGZpeGVkIGN1cmwtY29uZmlnIC0tY2ZsYWdzIHdoZW4gdGhlIGluY2x1ZGVkaXIgd2FzIG5vdAogIC91c3IvaW5jbHVkZS4KCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBDVVJMSU5GT19QUklWQVRFIHRvIHByb3Blcmx5IHJldHVybiBOVUxMIGlmIGl0IHdhcwogIHNldCB0byBOVUxMIQoKVmVyc2lvbiA3LjEwLjMgKDE0IEphbiAyMDAzKQoKRGFuaWVsICgxMCBKYW4gMjAwMykKLSBTdGV2ZSBPbGlwaGFudCBwb2ludGVkIG91dCB0aGF0IHRlc3QgY2FzZSAxMDUgZGlkIG5vdCB3b3JrIGFueW1vcmUgYW5kIHRoaXMKICB3YXMgZHVlIHRvIGEgbWlzc2luZyBmaXggZm9yIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcuCgpWZXJzaW9uIDcuMTAuMy1wcmU2ICgxMCBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBCcnlhbiBLZW1wIHBvaW50ZWQgb3V0IHRoYXQgY3VybCAtdSBjb3VsZCBub3QgcHJvdmlkZSBhIGJsYW5rIHBhc3N3b3JkCiAgd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIuIEl0IGNhbiBub3cuIC11IHVzZXJuYW1lOiBtYWtlcyB0aGUgcGFzc3dvcmQKICBlbXB0eSwgd2hpbGUgLXUgdXNlcm5hbWUgbWFrZXMgY3VybCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQuCgotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHJlbWFpbmluZyBjb25uZWN0IHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSBvbgogIGlwdjQgc3lzdGVtcyAoTGludXggb25seT8pLCB0aGF0IEkgZml4ZWQgYW5kIEtqZXRpbCB2ZXJpZmllZCB0aGF0IGl0IGZpeGVkCiAgaGlzIHByb2JsZW1zLgoKLSBtZW1hbmFseXplLnBsIG5vdyByZWFkcyBhIGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBubyBsb25nZXIKICB0YWtlcyB0aGUgZGF0YSBvbiBzdGRpbiBhcyBiZWZvcmUuCgpWZXJzaW9uIDcuMTAuMy1wcmU1ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIEZpeGVkIHRlc3RzL21lbWFuYWx5emUucGwgdG8gd29yayB3aXRoIGZpbGUgbmFtZXMgdGhhdCBjb250YWluIGNvbG9ucyAoYXMgb24KICBXaW5kb3dzKS4KICAKLSBLamV0aWwgSmFjb2JzZW4gcXVpY2tseSBwb2ludGVkIG91dCB0aGF0IGxpYi9zaGFyZS5oIHdhcyBtaXNzaW5nLi4uCgpWZXJzaW9uIDcuMTAuMy1wcmU0ICg5IEphbiAyMDAzKQoKRGFuaWVsICg5IEphbiAyMDAzKQotIFVwZGF0ZWQgbGliL3NoYXJlLmMgcXVpdGUgYSBiaXQgdG8gbWF0Y2ggdGhlIGRlc2lnbiBkb2N1bWVudCBhdAogIGh0dHA6Ly9jdXJsLmhheHguc2UvZGV2L3NoYXJpbmcudHh0IGEgbG90IG1vcmUuCgogIEknbGwgdHJ5IHRvIHVwZGF0ZSB0aGUgZG9jdW1lbnQgc29vbmlzaC4gc2hhcmUuYyBpcyBzdGlsbCBub3QgYWN0dWFsbHkgdXNlZAogIGJ5IGxpYmN1cmwsIGJ1dCB0aGUgQVBJIGlzIHNsb3dseSBnZXR0aW5nIHRoZXJlIGFuZCB3ZSBjYW4gc3RhcnQKICBpbXBsZW1lbnRpbmcgY29kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIHN5c3RlbS4KCkRhbmllbCAoOCBKYW4gMjAwMykKLSBVcGRhdGVkIHNoYXJlIHN0dWZmIGluIGN1cmwvY3VybC5oLCBpbmNsdWRpbmcgZGF0YSB0eXBlcywgc3RydWN0cyBhbmQKICBmdW5jdGlvbiBwcm90b3R5cGVzLiBUaGUgY29ycmVzcG9uZGluZyBmaWxlcyBpbiBsaWIvIHdlcmUgYWxzbyBtb2RpZmllZAogIG9mIGNvdXJzZSB0byByZW1haW4gY29tcGlsYWJsZS4gQmFzZWQgb24gaW5wdXQgZnJvbSBKZWFuLVBoaWxpcHBlIGFuZCBhbHNvCiAgdG8gbWFrZSBpdCBtb3JlIGluIGxpbmUgd2l0aCB0aGUgZGVzaWduIGRvY3VtZW50LgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIHBhdGNoZWQgYSB2ZXJ5IHRyaXZpYWwgbWVtb3J5IGxlYWsgaW4KICBjdXJsX2VzY2FwZSgpIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gcmVhbGxvYygpIHJldHVybnMgTlVMTC4uLgoKLSBNYXR0aGV3IEJsYWluIHByb3ZpZGVkIGZlZWRiYWNrIHRvIG1ha2UgdGhlIC0tY3JlYXRlLWRpcnMgc3R1ZmYgYnVpbGQKICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBGaXhlZCB0aGUgI2luY2x1ZGUgaW4gdGVzdHMvbGlidGVzdC9maXJzdC5jIGFzIExlZ29mZiBWaW5jZW50IHBvaW50ZWQgb3V0LgoKRGFuaWVsICg3IEphbiAyMDAzKQotIFBoaWxpcHBlIFJhb3VsdCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgcHJvcGVybHkgc3VwcG9ydAogIHdpbGRjYXJkIGNoZWNrcyBmb3IgY2VydGlmaWNhdGUgbmFtZXMuCgotIFNpbW9uIExpdSBhZGRlZCBDVVJMT1BUX0hUVFAyMDBBTElBU0VTLCB0byBsZXQgYW4gYXBwbGljYXRpb24gc2V0IG90aGVyCiAgc3RyaW5ncyByZWNvZ25pemVkIGFzICJIVFRQIDIwMCIgdG8gYWxsb3cgaHR0cC1saWtlIHByb3RvY29scyB0byBnZXQKICBkb3dubG9hZGVkIGZpbmUgYnkgY3VybC4KCi0gTm93IHVzaW5nIGF1dG9jb25mIDIuNTcgYW5kIGF1dG9tYWtlIDEuNy4yCgotIERvaW5nICJjdXJsIC1JIGZ0cDovL2RvbWFpbi9ub24tZXhpc3RpbmctZmlsZSIgc3RpbGwgb3V0cHV0ZWQgYSBkYXRlIQogIFdheW5lIEhhaWdoIHJlcG9ydGVkLgoKLSBUaGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgd3JpdHRlbiBwcm9wZXJseSB3aXRoIGEgbmV3bGluZSBpbiB0aGUgLS10cmFjZQogIGZpbGUuCgpEYW5pZWwgKDYgSmFuIDIwMDMpCi0gU3RlcmxpbmcgSHVnaGVzIGZpeGVkIGEgcG9zc2libGUgYnVnOiBwcmV2aW91c2x5LCBpZiB5b3UgY2FsbGVkCiAgY3VybF9lYXN5X3BlcmZvcm0gYW5kIHRoZW4gc2V0IHRoZSBnbG9iYWwgZG5zIGNhY2hlLCB0aGUgZ2xvYmFsIGNhY2hlCiAgd291bGRuJ3QgYmUgdXNlZC4gUG9pbnRlZCBvdXQgYnkgSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZS4KCi0gTWF0dGhldyBCbGFpbidzIGZpeGVkIHRoZSBWQzYgbGliY3VybCBtYWtlZmlsZSB0byBpbmNsdWRlIGJldHRlciBkZWJ1ZyBkYXRhCiAgb24gZGVidWcgYnVpbGRzLgo=