KysrKysrKysrKysKUHl0aG9uIE5ld3MKKysrKysrKysrKysKCihlZGl0b3JzOiBjaGVjayBORVdTLmhlbHAgZm9yIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgTkVXUyB1c2luZyBSZVNULikKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBhbHBoYSAxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipYWFggUmVsZWFzZSBkYXRlOiBERC1NTU0tMjAwMiBYWFgqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBPbmUgY2FuIG5vdyBhc3NpZ24gdG8gX19iYXNlc19fIGFuZCBfX25hbWVfXyBvZiBuZXctc3R5bGUgY2xhc3Nlcy4KCi0gZGljdCgpIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzIHNvIHRoYXQgZGljdChvbmU9MSwgdHdvPTIpCiAgaXMgdGhlIGVxdWl2YWxlbnQgb2YgeyJvbmUiOiAxLCAidHdvIjogMn0uICBBY2NvcmRpbmdseSwKICB0aGUgZXhpc3RpbmcgKGJ1dCB1bmRvY3VtZW50ZWQpICdpdGVtcycga2V5d29yZCBhcmd1bWVudCBoYXMKICBiZWVuIGVsaW1pbmF0ZWQuICBUaGlzIG1lYW5zIHRoYXQgZGljdChpdGVtcz1zb21lTWFwcGluZykgbm93IGhhcwogIGEgZGlmZmVyZW50IG1lYW5pbmcgdGhhbiBiZWZvcmUuCgotIGludCgpIG5vdyByZXR1cm5zIGEgbG9uZyBvYmplY3QgaWYgdGhlIGFyZ3VtZW50IGlzIG91dHNpZGUgdGhlCiAgaW50ZWdlciByYW5nZSwgc28gaW50KCI0IioxMDAwKSwgaW50KDFlMjAwKSBhbmQgaW50KDFMPDwxMDAwKSB3aWxsCiAgYWxsIHJldHVybiBsb25nIG9iamVjdHMgaW5zdGVhZCBvZiByYWlzaW5nIGFuIE92ZXJmbG93RXJyb3IuCgotIEFzc2lnbm1lbnQgdG8gX19jbGFzc19fIGlzIGRpc2FsbG93ZWQgaWYgZWl0aGVyIHRoZSBvbGQgb3IgdGhlIG5ldwogIGNsYXNzIGlzIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgdHlwZSBvYmplY3QgKHN1Y2ggYXMgZGVmaW5lZCBieSBhbgogIGV4dGVuc2lvbiBtb2R1bGUpLiAgVGhpcyBwcmV2ZW50cyBhbm9tYWxpZXMgbGlrZSAyLl9fY2xhc3NfXyA9IGJvb2wuCgotIE5ldy1zdHlsZSBvYmplY3QgY3JlYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBoYXZlIGJlZW4gc3BlZCB1cAogIHNpZ25pZmljYW50bHk7IHRoZXkgYXJlIG5vdyBmYXN0ZXIgdGhhbiBjbGFzc2ljIGluc3RhbmNlIGNyZWF0aW9uCiAgYW5kIGRlYWxsb2NhdGlvbi4KCi0gVGhlIF9fc2xvdHNfXyB2YXJpYWJsZSBjYW4gbm93IG1lbnRpb24gInByaXZhdGUiIG5hbWVzLCBhbmQgdGhlCiAgcmlnaHQgdGhpbmcgd2lsbCBoYXBwZW4gKGUuZy4gX19zbG90c19fID0gWyJfX2ZvbyJdKS4KCi0gVGhlIGJ1aWx0LWlucyBzbGljZSgpIGFuZCBidWZmZXIoKSBhcmUgbm93IGNhbGxhYmxlIHR5cGVzLiAgVGhlCiAgdHlwZXMgY2xhc3NvYmogKGZvcm1lcmx5IGNsYXNzKSwgY29kZSwgZnVuY3Rpb24sIGluc3RhbmNlLCBhbmQKICBpbnN0YW5jZW1ldGhvZCAoZm9ybWVybHkgaW5zdGFuY2UtbWV0aG9kKSwgd2hpY2ggaGF2ZSBubyBidWlsdC1pbgogIG5hbWVzIGJ1dCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSB0eXBlcyBtb2R1bGUsIGFyZSBub3cgYWxzbwogIGNhbGxhYmxlLiAgVGhlIHR5cGUgZGljdC1wcm94eSBpcyByZW5hbWVkIHRvIGRpY3Rwcm94eS4KCi0gQ3ljbGVzIGdvaW5nIHRocm91Z2ggdGhlIF9fY2xhc3NfXyBsaW5rIG9mIGEgbmV3LXN0eWxlIGluc3RhbmNlIGFyZQogIG5vdyBkZXRlY3RlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCgotIENsYXNzZXMgdXNpbmcgX19zbG90c19fIGFyZSBub3cgcHJvcGVybHkgZ2FyYmFnZSBjb2xsZWN0ZWQuCiAgW1NGIGJ1ZyA1MTk2MjFdCgotIFRpZ2h0ZW5lZCB0aGUgX19zbG90c19fIHJ1bGVzOiBhIHNsb3QgbmFtZSBtdXN0IGJlIGEgdmFsaWQgUHl0aG9uCiAgaWRlbnRpZmllci4KCi0gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kdWxlIHR5cGUgbm93IHJlcXVpcmVzIGEgbmFtZSBhcmd1bWVudCBhbmQKICB0YWtlcyBhbiBvcHRpb25hbCBkb2NzdHJpbmcgYXJndW1lbnQuICBQcmV2aW91c2x5LCB0aGlzIGNvbnN0cnVjdG9yCiAgaWdub3JlZCBpdHMgYXJndW1lbnRzLiAgQXMgYSBjb25zZXF1ZW5jZSwgZGVyaXZpbmcgYSBjbGFzcyBmcm9tIGEKICBtb2R1bGUgKG5vdCBmcm9tIHRoZSBtb2R1bGUgdHlwZSkgaXMgbm93IGlsbGVnYWw7IHByZXZpb3VzbHkgdGhpcwogIGNyZWF0ZWQgYW4gdW5uYW1lZCBtb2R1bGUsIGp1c3QgbGlrZSBpbnZva2luZyB0aGUgbW9kdWxlIHR5cGUgZGlkLgogIFtTRiBidWcgNTYzMDYwXQoKLSBBIG5ldyB0eXBlIG9iamVjdCwgJ2Jhc2VzdHJpbmcnLCBpcyBhZGRlZC4gIFRoaXMgaXMgYSBjb21tb24gYmFzZSB0eXBlCiAgZm9yICdzdHInIGFuZCAndW5pY29kZScsIGFuZCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mCiAgdHlwZXMuU3RyaW5nVHlwZXMsIGUuZy4gdG8gdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyAiYSBzdHJpbmciOgogIGlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZykgaXMgVHJ1ZSBmb3IgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5ncy4gIFRoaXMKICBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGFuZCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LgoKLSBDaGFuZ2VkIG5ldy1zdHlsZSBjbGFzcyBpbnN0YW50aWF0aW9uIHNvIHRoYXQgd2hlbiBDJ3MgX19uZXdfXwogIG1ldGhvZCByZXR1cm5zIHNvbWV0aGluZyB0aGF0J3Mgbm90IGEgQyBpbnN0YW5jZSwgaXRzIF9faW5pdF9fIGlzCiAgbm90IGNhbGxlZC4gIFtTRiBidWcgIzUzNzQ1MF0KCi0gRml4ZWQgc3VwZXIoKSB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGNsYXNzIG1ldGhvZHMuICBbU0YgYnVnICM1MzU0NDRdCgotIElmIHlvdSB0cnkgdG8gcGlja2xlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgX19zbG90c19fIGJ1dAogIGRvZXNuJ3QgZGVmaW5lIG9yIG92ZXJyaWRlIF9fZ2V0c3RhdGVfXywgYSBUeXBlRXJyb3IgaXMgbm93IHJhaXNlZC4KICBUaGlzIGlzIGRvbmUgYnkgYWRkaW5nIGEgYm96byBfX2dldHN0YXRlX18gdG8gdGhlIGNsYXNzIHRoYXQgYWx3YXlzCiAgcmFpc2VzIFR5cGVFcnJvci4gIChCZWZvcmUsIHRoaXMgd291bGQgYXBwZWFyIHRvIGJlIHBpY2tsZWQsIGJ1dCB0aGUKICBzdGF0ZSBvZiB0aGUgc2xvdHMgd291bGQgYmUgbG9zdC4pCgpDb3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLQoKLSBUaGFua3MgdG8gQXJtaW4gUmlnbywgdGhlIGxhc3Qga25vd24gd2F5IHRvIHByb3Zva2UgYSBzeXN0ZW0gY3Jhc2gKICBieSBjbGV2ZXJseSBhcnJhbmdpbmcgZm9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBtdXRhdGUgYSBsaXN0CiAgZHVyaW5nIGEgbGlzdC5zb3J0KCkgb3BlcmF0aW9uIGhhcyBiZWVuIGZpeGVkLiAgVGhlIGVmZmVjdCBvZgogIGF0dGVtcHRpbmcgdG8gbXV0YXRlIGEgbGlzdCwgb3IgZXZlbiB0byBpbnNwZWN0IGl0cyBjb250ZW50cyBvcgogIGxlbmd0aCwgd2hpbGUgYSBzb3J0IGlzIGluIHByb2dyZXNzLCBpcyBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhdHRlbXB0cyB0byBkZXRlY3QgbXV0YXRpb25zLAogIGFuZCByYWlzZSBWYWx1ZUVycm9yIGlmIG9uZSBvY2N1cnMsIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0CiAgYWxsIG11dGF0aW9ucyB3aWxsIGJlIGNhdWdodCwgb3IgdGhhdCBhbnkgd2lsbCBiZSBjYXVnaHQgYWNyb3NzCiAgcmVsZWFzZXMgb3IgaW1wbGVtZW50YXRpb25zLgoKLSBVbmljb2RlIGZpbGUgbmFtZSBwcm9jZXNzaW5nIGZvciBXaW5kb3dzIChQRVAgMjc3KSBpcyBpbXBsZW1lbnRlZC4KICBBbGwgcGxhdGZvcm1zIG5vdyBoYXZlIGFuIG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgYXR0cmlidXRlLAogIHdoaWNoIGlzIHNldCB0byBUcnVlIG9uIFdpbmRvd3MgTlQvMjAwMC9YUCwgYW5kIEZhbHNlIGVsc2V3aGVyZS4KCi0gQ29kZWMgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2tzIChQRVAgMjkzKSBhcmUgaW1wbGVtZW50ZWQuCiAgRXJyb3IgaGFuZGxpbmcgaW4gdW5pY29kZS5lbmNvZGUgb3Igc3RyLmRlY29kZSBjYW4gbm93IGJlIGN1c3RvbWl6ZWQuCgotIEEgc3VidGxlIGNoYW5nZSB0byB0aGUgc2VtYW50aWNzIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBpbnRlcm4oKToKICBpbnRlcm5lZCBzdHJpbmdzIGFyZSBubyBsb25nZXIgaW1tb3J0YWwuICBZb3UgbXVzdCBrZWVwIGEgcmVmZXJlbmNlCiAgdG8gdGhlIHJldHVybiB2YWx1ZSBpbnRlcm4oKSBhcm91bmQgdG8gZ2V0IHRoZSBiZW5lZml0LgoKLSBVc2Ugb2YgJ05vbmUnIGFzIGEgdmFyaWFibGUsIGFyZ3VtZW50IG9yIGF0dHJpYnV0ZSBuYW1lIG5vdwogIGlzc3VlcyBhIFN5bnRheFdhcm5pbmcuICBJbiB0aGUgZnV0dXJlLCBOb25lIG1heSBiZWNvbWUgYSBrZXl3b3JkLgoKLSBTRVRfTElORU5PIGlzIGdvbmUuICBjb19sbm90YWIgaXMgbm93IGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgd2hlbiB0bwogIGNhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLiAgQyBjb2RlIHRoYXQgYWNjZXNzZWQgZl9saW5lbm8gc2hvdWxkIGNhbGwKICBQeUNvZGVfQWRkcjJMaW5lIGluc3RlYWQgKGZfbGluZW5vIGlzIHN0aWxsIHRoZXJlLCBidXQgbm90IGtlcHQgdXAKICB0byBkYXRlKS4KCi0gVGhlcmUncyBhIG5ldyB3YXJuaW5nIGNhdGVnb3J5LCBGdXR1cmVXYXJuaW5nLiAgVGhpcyBpcyB1c2VkIHRvIHdhcm4KICBhYm91dCBhIG51bWJlciBvZiBzaXR1YXRpb25zIHdoZXJlIHRoZSB2YWx1ZSBvciBzaWduIG9mIGFuIGludGVnZXIKICByZXN1bHQgd2lsbCBjaGFuZ2UgaW4gUHl0aG9uIDIuNCBhcyBhIHJlc3VsdCBvZiBQRVAgMjM3IChpbnRlZ2VyCiAgdW5pZmljYXRpb24pLiAgVGhlIHdhcm5pbmdzIGltcGxlbWVudCBzdGFnZSBCMCBtZW50aW9uZWQgaW4gdGhhdAogIFBFUC4gIFRoZSB3YXJuaW5ncyBhcmUgYWJvdXQgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgoKICAgIC0gT2N0YWwgYW5kIGhleCBsaXRlcmFscyB3aXRob3V0ICdMJyBwcmVmaXggaW4gdGhlIGluY2x1c2l2ZSByYW5nZQogICAgICBbMHg4MDAwMDAwMC4uMHhmZmZmZmZmZl07IHRoZXNlIGFyZSBjdXJyZW50bHkgbmVnYXRpdmUgaW50cywgYnV0CiAgICAgIGluIFB5dGhvbiAyLjQgdGhleSB3aWxsIGJlIHBvc2l0aXZlIGxvbmdzIHdpdGggdGhlIHNhbWUgYml0CiAgICAgIHBhdHRlcm4uCgogICAgLSBMZWZ0IHNoaWZ0cyBvbiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGNhdXNlIHRoZSBvdXRjb21lIHRvIGxvc2UKICAgICAgYml0cyBvciBoYXZlIGEgZGlmZmVyZW50IHNpZ24gdGhhbiB0aGUgbGVmdCBvcGVyYW5kLiAgVG8gYmUKICAgICAgcHJlY2lzZTogeDw8biB3aGVyZSB0aGlzIGN1cnJlbnRseSBkb2Vzbid0IHlpZWxkIHRoZSBzYW1lIHZhbHVlCiAgICAgIGFzIGxvbmcoeCk8PG47IGluIFB5dGhvbiAyLjQsIHRoZSBvdXRjb21lIHdpbGwgYmUgbG9uZyh4KTw8bi4KCiAgICAtIENvbnZlcnNpb25zIGZyb20gaW50cyB0byBzdHJpbmcgdGhhdCBzaG93IG5lZ2F0aXZlIHZhbHVlcyBhcwogICAgICB1bnNpZ25lZCBpbnRzIGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UgWzB4ODAwMDAwMDAuLjB4ZmZmZmZmZmZdOwogICAgICB0aGlzIGFmZmVjdHMgdGhlIGZ1bmN0aW9ucyBoZXgoKSBhbmQgb2N0KCksIGFuZCB0aGUgc3RyaW5nCiAgICAgIGZvcm1hdHRpbmcgY29kZXMgJXUsICVvLCAleCwgYW5kICVYLiAgSW4gUHl0aG9uIDIuNCwgdGhlc2Ugd2lsbAogICAgICBzaG93IHNpZ25lZCB2YWx1ZXMgKGUuZy4gaGV4KC0xKSBjdXJyZW50bHkgcmV0dXJucyAiMHhmZmZmZmZmZiI7CiAgICAgIGluIFB5dGhvbiAyLjQgaXQgd2lsbCByZXR1cm4gIi0weDEiKS4KCiAgICAtIFRoZSBiaXRzIG1hbmlwdWxhdGVkIHVuZGVyIHRoZSBjb3ZlciBieSBzeXMuc2V0Y2hlY2tpbnRlcnZhbCgpIGhhdmUKICAgICAgYmVlbiBjaGFuZ2VkLiAgQm90aCB0aGUgY2hlY2sgaW50ZXJ2YWwgYW5kIHRoZSB0aWNrZXIgdXNlZCB0byBiZQogICAgICBwZXItdGhyZWFkIHZhbHVlcy4gIFRoZXkgYXJlIG5vdyBqdXN0IGEgcGFpciBvZiBnbG9iYWwgdmFyaWFibGVzLiAgSW4KICAgICAgYWRkaXRpb24sIHRoZSBkZWZhdWx0IGNoZWNrIGludGVydmFsIHdhcyBib29zdGVkIGZyb20gMTAgdG8gMTAwCiAgICAgIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4gIFRoaXMgbWF5IGhhdmUgc29tZSBlZmZlY3Qgb24gc3lzdGVtcyB0aGF0CiAgICAgIHJlbGllZCBvbiB0aGUgb2xkIGRlZmF1bHQgdmFsdWUuICBJbiBwYXJ0aWN1bGFyLCBpbiBtdWx0aS10aHJlYWRlZAogICAgICBhcHBsaWNhdGlvbnMgd2hpY2ggdHJ5IHRvIGJlIGhpZ2hseSByZXNwb25zaXZlLCByZXNwb25zZSB0aW1lIHdpbGwKICAgICAgaW5jcmVhc2UgYnkgc29tZSAocGVyaGFwcyBpbXBlcmNlcHRpYmxlKSBhbW91bnQuCgotIFdoZW4gbXVsdGlwbHlpbmcgdmVyeSBsYXJnZSBpbnRlZ2VycywgYSB2ZXJzaW9uIG9mIHRoZSBzby1jYWxsZWQKICBLYXJhdHN1YmEgYWxnb3JpdGhtIGlzIG5vdyB1c2VkLiAgVGhpcyBpcyBtb3N0IGVmZmVjdGl2ZSBpZiB0aGUKICBpbnB1dHMgaGF2ZSByb3VnaGx5IHRoZSBzYW1lIHNpemUuICBJZiB0aGV5IGJvdGggaGF2ZSBhYm91dCBOIGRpZ2l0cywKICBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gaGFzIE8oTioqMS41OCkgcnVudGltZSAodGhlIGV4cG9uZW50IGlzCiAgbG9nX2Jhc2VfMigzKSkgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgTyhOKioyKS4gIE1lYXN1cmVkIHJlc3VsdHMgbWF5CiAgYmUgYmV0dGVyIG9yIHdvcnNlIHRoYW4gdGhhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtIHF1aXJrcy4gIEJlc2lkZXMKICB0aGUgTygpIGltcHJvdmVtZW50IGluIHJhdyBpbnN0cnVjdGlvbiBjb3VudCwgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0KICBhcHBlYXJzIHRvIGhhdmUgbXVjaCBiZXR0ZXIgY2FjaGUgYmVoYXZpb3Igb24gZXh0cmVtZWx5IGxhcmdlIGludGVnZXJzCiAgKHN0YXJ0aW5nIGluIHRoZSBiYWxscGFyayBvZiBhIG1pbGxpb24gYml0cykuICBOb3RlIHRoYXQgdGhpcyBpcyBhCiAgc2ltcGxlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlcmUncyBubyBpbnRlbnQgaGVyZSB0byBjb21wZXRlIHdpdGgsCiAgZS5nLiwgR01QLiAgSXQgZ2l2ZXMgYSB2ZXJ5IG5pY2Ugc3BlZWR1cCB3aGVuIGl0IGFwcGxpZXMsIGJ1dCBhIHBhY2thZ2UKICBkZXZvdGVkIHRvIGZhc3QgbGFyZ2UtaW50ZWdlciBhcml0aG1ldGljIHNob3VsZCBydW4gY2lyY2xlcyBhcm91bmQgaXQuCgotIHUnJWMnIHdpbGwgbm93IHJhaXNlIGEgVmFsdWVFcnJvciBpbiBjYXNlIHRoZSBhcmd1bWVudCBpcyBhbgogIGludGVnZXIgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2Ugb2YgVW5pY29kZSBjb2RlIHBvaW50IG9yZGluYWxzLgoKLSBUaGUgdGVtcGZpbGUgbW9kdWxlIGhhcyBiZWVuIG92ZXJoYXVsZWQgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LiAgVGhlCiAgbWt0ZW1wKCkgZnVuY3Rpb24gaXMgbm93IGRlcHJlY2F0ZWQ7IG5ldywgc2FmZSByZXBsYWNlbWVudHMgYXJlCiAgbWtzdGVtcCgpIChmb3IgZmlsZXMpIGFuZCBta2R0ZW1wKCkgKGZvciBkaXJlY3RvcmllcyksIGFuZCB0aGUKICBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zIE5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFuZCBUZW1wb3JhcnlGaWxlKCkuCiAgVXNlIG9mIHNvbWUgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGlzIG1vZHVsZSBpcyBhbHNvIGRlcHJlY2F0ZWQ7IHRoZQogIG5ldyBmdW5jdGlvbnMgaGF2ZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcm92aWRlIHRoZSBzYW1lCiAgZnVuY3Rpb25hbGl0eS4gIEFsbCBMaWIsIFRvb2xzIGFuZCBEZW1vIG1vZHVsZXMgdGhhdCB1c2VkIHRoZSB1bnNhZmUKICBpbnRlcmZhY2VzIGhhdmUgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgc2FmZSByZXBsYWNlbWVudHMuICBUaGFua3MKICB0byBaYWNrIFdlaW5iZXJnIQoKLSBXaGVuIHggaXMgYW4gb2JqZWN0IHdob3NlIGNsYXNzIGltcGxlbWVudHMgX19tdWxfXyBhbmQgX19ybXVsX18sCiAgMS4wKnggd291bGQgY29ycmVjdGx5IGludm9rZSBfX3JtdWxfXywgYnV0IDEqeCB3b3VsZCBlcnJvbmVvdXNseQogIGludm9rZSBfX211bF9fLiAgVGhpcyB3YXMgZHVlIHRvIHRoZSBzZXF1ZW5jZS1yZXBlYXQgY29kZSBpbiB0aGUgaW50CiAgdHlwZS4gIFRoaXMgaGFzIGJlZW4gZml4ZWQgbm93LgoKLSBQcmV2aW91c2x5LCAic3RyMSBpbiBzdHIyIiByZXF1aXJlZCBzdHIxIHRvIGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAxLgogIFRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcmVsYXhlZCB0byBhbGxvdyBzdHIxIHRvIGJlIGEgc3RyaW5nIG9mCiAgYW55IGxlbmd0aC4gIFRodXMgIidlbCcgaW4gJ2hlbGxvIHdvcmxkJyIgcmV0dXJucyBUcnVlIG5vdy4KCi0gRmlsZSBvYmplY3RzIGFyZSBub3cgdGhlaXIgb3duIGl0ZXJhdG9ycy4gIEZvciBhIGZpbGUgZiwgaXRlcihmKSBub3cKICByZXR1cm5zIGYgKHVubGVzcyBmIGlzIGNsb3NlZCksIGFuZCBmLm5leHQoKSBpcyBzaW1pbGFyIHRvCiAgZi5yZWFkbGluZSgpIHdoZW4gRU9GIGlzIG5vdCByZWFjaGVkOyBob3dldmVyLCBmLm5leHQoKSB1c2VzIGEKICByZWFkYWhlYWQgYnVmZmVyIHRoYXQgbWVzc2VzIHVwIHRoZSBmaWxlIHBvc2l0aW9uLCBzbyBtaXhpbmcKICBmLm5leHQoKSBhbmQgZi5yZWFkbGluZSgpIChvciBvdGhlciBtZXRob2RzKSBkb2Vzbid0IHdvcmsgcmlnaHQuCiAgQ2FsbGluZyBmLnNlZWsoKSBkcm9wcyB0aGUgcmVhZGFoZWFkIGJ1ZmZlciwgYnV0IG90aGVyIG9wZXJhdGlvbnMKICBkb24ndC4gIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGlzIGdpdmVzIGEgbmljZSBhZGRpdGlvbmFsIHNwZWVkIGJvb3N0CiAgdG8gImZvciBsaW5lIGluIGZpbGU6IjsgdGhlIHhyZWFkbGluZXMgbWV0aG9kIGFuZCBjb3JyZXNwb25kaW5nCiAgbW9kdWxlIGFyZSBub3cgb2Jzb2xldGUuICBUaGFua3MgdG8gT3JlbiBUaXJvc2ghCgotIEVuY29kaW5nIGRlY2xhcmF0aW9ucyAoUEVQIDI2MywgcGhhc2UgMSkgaGF2ZSBiZWVuIGltcGxlbWVudGVkLiAgQQogIGNvbW1lbnQgb2YgdGhlIGZvcm0gIiMgLSotIGNvZGluZzogPGVuY29kaW5nbmFtZT4gLSotIiBpbiB0aGUgZmlyc3QKICBvciBzZWNvbmQgbGluZSBvZiBhIFB5dGhvbiBzb3VyY2UgZmlsZSBpbmRpY2F0ZXMgdGhlIGVuY29kaW5nLgoKLSBsaXN0LnNvcnQoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24uICBXaGlsZSBjcm9zcy1wbGF0Zm9ybSByZXN1bHRzCiAgbWF5IHZhcnksIGFuZCBpbiBkYXRhLWRlcGVuZGVudCB3YXlzLCB0aGlzIGlzIG11Y2ggZmFzdGVyIG9uIG1hbnkKICBraW5kcyBvZiBwYXJ0aWFsbHkgb3JkZXJlZCBsaXN0cyB0aGFuIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwKICBhbmQgcmVwb3J0ZWQgdG8gYmUganVzdCBhcyBmYXN0IG9uIHJhbmRvbWx5IG9yZGVyZWQgbGlzdHMgb24KICBzZXZlcmFsIG1ham9yIHBsYXRmb3Jtcy4gIFRoaXMgc29ydCBpcyBhbHNvIHN0YWJsZSAoaWYgQT09QiBhbmQgQQogIHByZWNlZGVzIEIgaW4gdGhlIGxpc3QgYXQgdGhlIHN0YXJ0LCBBIHByZWNlZGVzIEIgYWZ0ZXIgdGhlIHNvcnQgdG9vKSwKICBhbHRob3VnaCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgc3RhYmlsaXR5LiAgQQogIHBvdGVudGlhbCBkcmF3YmFjayBpcyB0aGF0IGxpc3Quc29ydCgpIG1heSByZXF1aXJlIHRlbXAgc3BhY2Ugb2YKICBsZW4obGlzdCkqMiBieXRlcyAoYGAqNGBgIG9uIGEgNjQtYml0IG1hY2hpbmUpLiAgSXQncyB0aGVyZWZvcmUgcG9zc2libGUKICBmb3IgbGlzdC5zb3J0KCkgdG8gcmFpc2UgTWVtb3J5RXJyb3Igbm93LCBldmVuIGlmIGEgY29tcGFyaXNvbiBmdW5jdGlvbgogIGRvZXMgbm90LiAgU2VlIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNTg3MDc2PiBmb3IgZnVsbCBkZXRhaWxzLgoKLSBBbGwgc3RhbmRhcmQgaXRlcmF0b3JzIG5vdyBlbnN1cmUgdGhhdCwgb25jZSBTdG9wSXRlcmF0aW9uIGhhcyBiZWVuCiAgcmFpc2VkLCBhbGwgZnV0dXJlIGNhbGxzIHRvIG5leHQoKSBvbiB0aGUgc2FtZSBpdGVyYXRvciB3aWxsIGFsc28KICByYWlzZSBTdG9wSXRlcmF0aW9uLiAgVGhlcmUgdXNlZCB0byBiZSB2YXJpb3VzIGNvdW50ZXJleGFtcGxlcyB0bwogIHRoaXMgYmVoYXZpb3IsIHdoaWNoIGNvdWxkIGNhdXNlZCBjb25mdXNpb24gb3Igc3VidGxlIHByb2dyYW0KICBicmVha2FnZSwgd2l0aG91dCBhbnkgYmVuZWZpdHMuICAoTm90ZSB0aGF0IHRoaXMgaXMgc3RpbGwgYW4KICBpdGVyYXRvcidzIHJlc3BvbnNpYmlsaXR5OyB0aGUgaXRlcmF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IGVuZm9yY2UKICB0aGlzLikKCi0gQ3RybCtDIGhhbmRsaW5nIG9uIFdpbmRvd3MgaGFzIGJlZW4gbWFkZSBtb3JlIGNvbnNpc3RlbnQgd2l0aAogIG90aGVyIHBsYXRmb3Jtcy4gIEtleWJvYXJkSW50ZXJydXB0IGNhbiBub3cgcmVsaWFibHkgYmUgY2F1Z2h0LAogIGFuZCBDdHJsK0MgYXQgYW4gaW50ZXJhY3RpdmUgcHJvbXB0IG5vIGxvbmdlciB0ZXJtaW5hdGVzIHRoZQogIHByb2Nlc3MgdW5kZXIgTlQvMmsvWFAgKGl0IG5ldmVyIGRpZCB1bmRlciBXaW45eCkuICBDdHJsK0Mgd2lsbAogIGludGVycnVwdCB0aW1lLnNsZWVwKCkgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgYW55IGNoaWxkIHByb2Nlc3NlcwogIGNyZWF0ZWQgdmlhIHRoZSBwb3BlbiBmYW1pbHkgKG9uIHdpbjJrOyB3ZSBjYW4ndCBtYWtlIHdpbjl4IHdvcmsKICByZWxpYWJseSkgYXJlIGFsc28gaW50ZXJydXB0ZWQgKGFzIGdlbmVyYWxseSBoYXBwZW5zIG9uIGZvciBMaW51eC9Vbml4LikKICBbU0YgYnVncyAyMzEyNzMsIDQzOTk5MiBhbmQgNTgxMjMyXQoKLSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSBoYXMgYmVlbiBhZGRlZCBvbiBXaW5kb3dzLiAgVGhpcwogIHJldHVybnMgYSB0dXBsZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFdpbmRvd3MKICBjdXJyZW50bHkgcnVubmluZy4KCi0gU2xpY2VzIGFuZCByZXBldGl0aW9ucyBvZiBidWZmZXIgb2JqZWN0cyBub3cgY29uc2lzdGVudGx5IHJldHVybgogIGEgc3RyaW5nLiAgRm9ybWVybHksIHN0cmluZ3Mgd291bGQgYmUgcmV0dXJuZWQgbW9zdCBvZiB0aGUgdGltZSwKICBidXQgYSBidWZmZXIgb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHJlcGV0aXRpb24gY291bnQKICB3YXMgb25lIG9yIHdoZW4gdGhlIHNsaWNlIHJhbmdlIHdhcyBhbGwgaW5jbHVzaXZlLgoKLSBVbmljb2RlIG9iamVjdHMgaW4gc3lzLnBhdGggYXJlIG5vIGxvbmdlciBpZ25vcmVkIGJ1dCB0cmVhdGVkCiAgYXMgZGlyZWN0b3J5IG5hbWVzLgoKLSBGaXhlZCBzdHJpbmcuc3RhcnRzd2l0aCBhbmQgc3RyaW5nLmVuZHN3aXRoIGJ1aWx0aW4gbWV0aG9kcwogIHNvIHRoZXkgYWNjZXB0IG5lZ2F0aXZlIGluZGljZXMuICBbU0YgYnVnIDQ5Mzk1MV0KCi0gRml4ZWQgYSBidWcgd2l0aCBhIGNvbnRpbnVlIGluc2lkZSBhIHRyeSBibG9jayBhbmQgYSB5aWVsZCBpbiB0aGUKICBmaW5hbGx5IGNsYXVzZS4gIFtTRiBidWcgNTY3NTM4XQoKLSBNb3N0IGJ1aWx0aW4gc2VxdWVuY2VzIG5vdyBzdXBwb3J0ICJleHRlbmRlZCBzbGljZXMiLCBpLmUuIHNsaWNlcwogIHdpdGggYSB0aGlyZCAic3RyaWRlIiBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSwgImhlbGxvIHdvcmxkIls6Oi0xXQogIGdpdmVzICJkbHJvdyBvbGxlaCIuCgotIEEgbmV3IHdhcm5pbmcgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyB3YXMgYWRkZWQgdG8gcHJvdmlkZQogIGRpcmVjdGlvbiBvbiBmZWF0dXJlcyB3aGljaCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVwcmVjYXRlZC4KICBUaGUgd2FybmluZyB3aWxsIG5vdCBiZSBwcmludGVkIGJ5IGRlZmF1bHQuICBUbyBzZWUgdGhlIHBlbmRpbmcKICBkZXByZWNhdGlvbnMsIHVzZSAtV2Fsd2F5czo6UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzo6CiAgYXMgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCkgaW4gY29kZS4KCi0gRGVwcmVjYXRlZCBmZWF0dXJlcyBvZiB4cmFuZ2Ugb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZCBhcwogIHByb21pc2VkLiAgVGhlIHN0YXJ0LCBzdG9wLCBhbmQgc3RlcCBhdHRyaWJ1dGVzIGFuZCB0aGUgdG9saXN0KCkKICBtZXRob2Qgbm8gbG9uZ2VyIGV4aXN0LiAgeHJhbmdlIHJlcGV0aXRpb24gYW5kIHNsaWNpbmcgaGF2ZSBiZWVuCiAgcmVtb3ZlZC4KCi0gTmV3IGJ1aWx0aW4gZnVuY3Rpb24gZW51bWVyYXRlKHgpLCBmcm9tIFBFUCAyNzkuICBFeGFtcGxlOgogIGVudW1lcmF0ZSgiYWJjIikgaXMgYW4gaXRlcmF0b3IgcmV0dXJuaW5nICgwLCJhIiksICgxLCJiIiksICgyLCJjIikuCiAgVGhlIGFyZ3VtZW50IGNhbiBiZSBhbiBhcmJpdHJhcnkgaXRlcmFibGUgb2JqZWN0LgoKLSBUaGUgYXNzZXJ0IHN0YXRlbWVudCBubyBsb25nZXIgdGVzdHMgX19kZWJ1Z19fIGF0IHJ1bnRpbWUuICBUaGlzIG1lYW5zCiAgdGhhdCBhc3NlcnQgc3RhdGVtZW50cyBjYW5ub3QgYmUgZGlzYWJsZWQgYnkgYXNzaWduaW5nIGEgZmFsc2UgdmFsdWUKICB0byBfX2RlYnVnX18uCgotIEEgbWV0aG9kIHpmaWxsKCkgd2FzIGFkZGVkIHRvIHN0ciBhbmQgdW5pY29kZSwgdGhhdCBmaWxscyBhIG51bWVyaWMKICBzdHJpbmcgdG8gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEZvciBleGFtcGxlLAogICIrMTIzIi56ZmlsbCg2KSAtPiAiKzAwMTIzIi4KCi0gQ29tcGxleCBudW1iZXJzIHN1cHBvcnRlZCBkaXZtb2QoKSBhbmQgdGhlIC8vIGFuZCAlIG9wZXJhdG9ycywgYnV0CiAgdGhlc2UgbWFrZSBubyBzZW5zZS4gIFNpbmNlIHRoaXMgd2FzIGRvY3VtZW50ZWQsIHRoZXkncmUgYmVpbmcKICBkZXByZWNhdGVkIG5vdy4KCi0gU3RyaW5nIGFuZCB1bmljb2RlIG1ldGhvZHMgbHN0cmlwKCksIHJzdHJpcCgpIGFuZCBzdHJpcCgpIG5vdyB0YWtlCiAgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcnMgdG8gc3RyaXAuICBGb3IKICBleGFtcGxlLCAiRm9vISEhPyE/IT8iLnJzdHJpcCgiPyEiKSAtPiAiRm9vIi4KCi0gVGhlcmUncyBhIG5ldyBkaWN0aW9uYXJ5IGNvbnN0cnVjdG9yIChhIGNsYXNzIG1ldGhvZCBvZiB0aGUgZGljdAogIGNsYXNzKSwgZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgdmFsdWU9Tm9uZSkuICBJdCBjb25zdHJ1Y3RzIGEKICBkaWN0aW9uYXJ5IHdpdGgga2V5cyB0YWtlbiBmcm9tIHRoZSBpdGVyYWJsZSBhbmQgYWxsIHZhbHVlcyBzZXQgdG8gYQogIHNpbmdsZSB2YWx1ZS4gIEl0IGNhbiBiZSB1c2VkIGZvciBidWlsZGluZyBzZXRzIGFuZCBmb3IgcmVtb3ZpbmcKICBkdXBsaWNhdGVzIGZyb20gc2VxdWVuY2VzLgoKLSBBZGRlZCBhIG5ldyBkaWN0IG1ldGhvZCBwb3Aoa2V5KS4gIFRoaXMgcmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUKICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleS4gIFtTRiBwYXRjaCAjNTM5OTQ5XQoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBib29sLCBoYXMgYmVlbiBhZGRlZCwgYXMgd2VsbCBhcyBidWlsdC1pbgogIG5hbWVzIGZvciBpdHMgdHdvIHZhbHVlcywgVHJ1ZSBhbmQgRmFsc2UuICBDb21wYXJpc29ucyBhbmQgc3VuZHJ5CiAgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IHJldHVybiBhIHRydXRoIHZhbHVlIGhhdmUgYmVlbiBjaGFuZ2VkIHRvCiAgcmV0dXJuIGEgYm9vbCBpbnN0ZWFkLiAgUmVhZCBQRVAgMjg1IGZvciBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcwogIGlzIGJhY2t3YXJkIGNvbXBhdGlibGUuCgotIEZpeGVkIHR3byBidWdzIHJlcG9ydGVkIGFzIFNGICM1MzU5MDU6IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywKICBkZWFsbG9jYXRpbmcgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0IGluIHRoZQogIGdhcmJhZ2UgY29sbGVjdG9yLCBkdWUgdG8gaW50ZXJhY3Rpb24gd2l0aCB0aGUgInRyYXNoY2FuIiBjb2RlOwogIGFjY2VzcyB0byB0aGUgY3VycmVudCBmcmFtZSBkdXJpbmcgZGVzdHJ1Y3Rpb24gb2YgYSBsb2NhbCB2YXJpYWJsZQogIGNvdWxkIGFjY2VzcyBhIHBvaW50ZXIgdG8gZnJlZWQgbWVtb3J5LgoKLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGFsbG9jYXRvciAoInB5bWFsbG9jIikgaGFzIGJlZW4gZW5hYmxlZCBieQogIGRlZmF1bHQuICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAogIGRlYWxsb2NhdGlvbiBoYXMgYmVlbiBzdHJlYW1saW5lZC4gIEEgaGVhZGVyIGZpbGUgaXMgaW5jbHVkZWQsCiAgTWlzYy9weW1lbWNvbXBhdC5oLCB3aGljaCBjYW4gYmUgYnVuZGxlZCB3aXRoIDNyZCBwYXJ0eSBleHRlbnNpb25zCiAgYW5kIGxldHMgdGhlbSB1c2UgdGhlIHNhbWUgQVBJIHdpdGggUHl0aG9uIHZlcnNpb25zIGZyb20gMS41LjIKICBvbndhcmRzLgoKLSBQeUVycl9EaXNwbGF5IHdpbGwgcHJvdmlkZSBmaWxlIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBhbGwgZXhjZXB0aW9ucwogIHRoYXQgaGF2ZSBhbiBhdHRyaWJ1dGUgcHJpbnRfZmlsZV9hbmRfbGluZSwgbm90IGp1c3QgU3ludGF4RXJyb3JzLgoKLSBUaGUgVVRGLTggY29kZWMgd2lsbCBub3cgZW5jb2RlIGFuZCBkZWNvZGUgVW5pY29kZSBzdXJyb2dhdGVzCiAgY29ycmVjdGx5IGFuZCB3aXRob3V0IHJhaXNpbmcgZXhjZXB0aW9ucyBmb3IgdW5wYWlyZWQgb25lcy4KCi0gVW5pdmVyc2FsIG5ld2xpbmVzIChQRVAgMjc4KSBpcyBpbXBsZW1lbnRlZC4gIEJyaWVmbHksIHVzaW5nICdVJwogIGluc3RlYWQgb2YgJ3InIHdoZW4gb3BlbmluZyBhIHRleHQgZmlsZSBmb3IgcmVhZGluZyBjaGFuZ2VzIHRoZSBsaW5lCiAgZW5kaW5nIGNvbnZlbnRpb24gc28gdGhhdCBhbnkgb2YgJ1xyJywgJ1xyXG4nLCBhbmQgJ1xuJyBpcwogIHJlY29nbml6ZWQgKGV2ZW4gbWl4ZWQgaW4gb25lIGZpbGUpOyBhbGwgdGhyZWUgYXJlIGNvbnZlcnRlZCB0bwogICdcbicsIHRoZSBzdGFuZGFyZCBQeXRob24gbGluZSBlbmQgY2hhcmFjdGVyLgoKLSBmaWxlLnhyZWFkbGluZXMoKSBub3cgcmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgZmlsZSBpcyBjbG9zZWQ6CiAgUHJldmlvdXNseSwgYW4geHJlYWRsaW5lcyBvYmplY3Qgd2FzIHJldHVybmVkIHdoaWNoIHdvdWxkIHJhaXNlCiAgYSBWYWx1ZUVycm9yIHdoZW4gdGhlIHhyZWFkbGluZXMubmV4dCgpIG1ldGhvZCB3YXMgY2FsbGVkLgoKLSBzeXMuZXhpdCgpIGluYWR2ZXJ0ZW50bHkgYWxsb3dlZCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LgogIEFuIGV4Y2VwdGlvbiB3aWxsIG5vdyBiZSByYWlzZWQgaWYgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBpcyB1c2VkLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gX3RraW50ZXIgbm93IHJldHVybnMgVGNsIG9iamVjdHMsIGluc3RlYWQgb2Ygc3RyaW5ncy4gT2JqZWN0cyB3aGljaAogIGhhdmUgUHl0aG9uIGVxdWl2YWxlbnRzIGFyZSBjb252ZXJ0ZWQgdG8gUHl0aG9uIG9iamVjdHMsIG90aGVyIG9iamVjdHMKICBhcmUgd3JhcHBlZC4gVGhpcyBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIHRoZSB3YW50b2JqZWN0cyBtZXRob2QsCiAgb3IgVGtpbnRlci53YW50b2JqZWN0cy4KCi0gVGhlIFB5QlNEREIgd3JhcHBlciBhcm91bmQgdGhlIFNsZWVweWNhdCBCZXJrZWxleSBEQiBsaWJyYXJ5IGhhcyBiZWVuCiAgYWRkZWQgYXMgdGhlIHBhY2thZ2UgYnNkZGIuIFRoZSB0cmFkaXRpb25hbCBic2RkYiBtb2R1bGUgaXMgc3RpbGwKICBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUsIGJ1dCBub3QgYnVpbHQgYXV0b21hdGljYWxseSBhbnltb3JlLCBhbmQKICBpcyBub3cgbmFtZWQgYnNkZGIxODUuCgotIHVuaWNvZGVkYXRhIHdhcyB1cGRhdGVkIHRvIFVuaWNvZGUgMy4yLiBJdCBzdXBwb3J0cyBub3JtYWxpemF0aW9uCiAgYW5kIG5hbWVzIGZvciBIYW5ndWwgc3lsbGFibGVzIGFuZCBDSksgdW5pZmllZCBpZGVvZ3JhcGhzLgoKLSByZXNvdXJjZS5nZXRybGltaXQoKSBub3cgcmV0dXJucyBsb25ncyBpbnN0ZWFkIG9mIGludHMuCgotIHJlYWRsaW5lIG5vdyBkeW5hbWljYWxseSBhZGp1c3RzIGl0cyBpbnB1dC9vdXRwdXQgc3RyZWFtIGlmCiAgc3lzLnN0ZGluL3N0ZG91dCBjaGFuZ2VzLgoKLSBUaGUgX3RraW50ZXIgbW9kdWxlIChhbmQgaGVuY2UgVGtpbnRlcikgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IKICBUY2wvVGsgOC4wIGFuZCA4LjEuICBPbmx5IFRjbC9UayB2ZXJzaW9ucyA4LjIsIDguMyBhbmQgOC40IGFyZQogIHN1cHBvcnRlZC4KCi0gY1BpY2tsZS5CYWRQaWNrbGVHZXQgaXMgbm93IGEgY2xhc3MuCgotIFRoZSB0aW1lIHN0YW1wcyBpbiBvcy5zdGF0X3Jlc3VsdCBhcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwogIGFmdGVyIHN0YXRfZmxvYXRfdGltZXMgaGFzIGJlZW4gY2FsbGVkLgoKLSBJZiB0aGUgc2l6ZSBwYXNzZWQgdG8gbW1hcC5tbWFwKCkgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKICBmaWxlIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gW1NGIGJ1ZyA1ODU3OTJdCgotIFRoZSB4cmVhZGxpbmVzIG1vZHVsZSBpcyBzbGF0ZWQgZm9yIG9ic29sZXNjZW5jZS4KCi0gVGhlIHN0cnB0aW1lIGZ1bmN0aW9uIGluIHRoZSB0aW1lIG1vZHVsZSBpcyBub3cgYWx3YXlzIGF2YWlsYWJsZSAoYQogIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHdoZW4gdGhlIEMgbGlicmFyeSBkb2Vzbid0IGRlZmluZSBpdCkuCgotIFRoZSAnbmV3JyBtb2R1bGUgaXMgbm8gbG9uZ2VyIGFuIGV4dGVuc2lvbiwgYnV0IGEgUHl0aG9uIG1vZHVsZSB0aGF0CiAgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXRzIGNvbnRlbnRzIGFyZSBubyBsb25nZXIKICBmdW5jdGlvbnMgYnV0IGNhbGxhYmxlIHR5cGUgb2JqZWN0cy4KCi0gVGhlIGJzZGRiLipvcGVuIGZ1bmN0aW9ucyBjYW4gbm93IHRha2UgJ05vbmUnIGFzIGEgZmlsZW5hbWUuCiAgVGhpcyB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBpbi1tZW1vcnkgYnNkZGIgdGhhdCB3b24ndCBiZQogIHdyaXR0ZW4gdG8gZGlzay4KCi0gcG9zaXgubGNob3duLCBwb3NpeC5raWxscGcsIHBvc2l4Lm1rbm9kLCBhbmQgcG9zaXguZ2V0cGdpZCBoYXZlIGJlZW4KICBhZGRlZCB3aGVyZSBhdmFpbGFibGUuCgotIFRoZSBsb2NhbGUgbW9kdWxlIG5vdyBleHBvc2VzIHRoZSBDIGxpYnJhcnkncyBnZXR0ZXh0IGludGVyZmFjZS4gSXQKICBhbHNvIGhhcyBhIG5ldyBmdW5jdGlvbiBnZXRwcmVmZXJyZWRlbmNvZGluZy4KCi0gQSBzZWN1cml0eSBob2xlICgiZG91YmxlIGZyZWUiKSB3YXMgZm91bmQgaW4gemxpYi0xLjEuMywgYSBwb3B1bGFyCiAgdGhpcmQgcGFydHkgY29tcHJlc3Npb24gbGlicmFyeSB1c2VkIGJ5IHNvbWUgUHl0aG9uIG1vZHVsZXMuICBUaGUKICBob2xlIHdhcyBxdWlja2x5IHBsdWdnZWQgaW4gemxpYi0xLjEuNCwgYW5kIHRoZSBXaW5kb3dzIGJ1aWxkIG9mCiAgUHl0aG9uIG5vdyBzaGlwcyB3aXRoIHpsaWItMS4xLjQuCgotIHB3ZCwgZ3JwLCBhbmQgcmVzb3VyY2UgcmV0dXJuIGVuaGFuY2VkIHR1cGxlcyBub3csIHdpdGggc3ltYm9saWMKICBmaWVsZCBuYW1lcy4KCi0gYXJyYXkuYXJyYXkgaXMgbm93IGEgdHlwZSBvYmplY3QuIEEgbmV3IGZvcm1hdCBjaGFyYWN0ZXIKICAndScgaW5kaWNhdGVzIFB5X1VOSUNPREUgYXJyYXlzLiBGb3IgdGhvc2UsIC50b3VuaWNvZGUgYW5kCiAgLmZyb211bmljb2RlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZS4gQXJyYXlzIG5vdyBzdXBwb3J0IF9faWFkZF9fCiAgYW5kIF9faW11bF9fLgoKLSBkbCBub3cgYnVpbGRzIG9uIGV2ZXJ5IHN5c3RlbSB0aGF0IGhhcyBkbGZjbi5oLiAgRmFpbHVyZSBpbiBjYXNlCiAgb2Ygc2l6ZW9mKGludCkhPXNpemVvZihsb25nKSE9c2l6ZW9mKHZvaWQqKSBpcyBkZWxheWVkIHVudGlsIGRsLm9wZW4KICBpcyBjYWxsZWQuCgotIHNpZ25hbC5zaWdwZW5kaW5nLCBzaWduYWwuc2lncHJvY21hc2sgYW5kIHNpZ25hbC5zaWdzdXNwZW5kIGhhdmUKICBiZWVuIGFkZGVkIHdoZXJlIGF2YWlsYWJsZS4KCi0gVGhlIHN5cyBtb2R1bGUgYWNxdWlyZWQgYSBuZXcgYXR0cmlidXRlLCBhcGlfdmVyc2lvbiwgd2hpY2ggZXZhbHVhdGVzCiAgdG8gdGhlIHZhbHVlIG9mIHRoZSBQWVRIT05fQVBJX1ZFUlNJT04gbWFjcm8gd2l0aCB3aGljaCB0aGUKICBpbnRlcnByZXRlciB3YXMgY29tcGlsZWQuCgotIEZpeGVkIGJ1ZyAjNDcwNTgyOiBzcmUgbW9kdWxlIHdvdWxkIHJldHVybiBhIHR1cGxlIChOb25lLCAnYScsICdhYicpCiAgd2hlbiBhcHBseWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uICdeKChhKWMpPyhhYikkJyBvbiAnYWInLiBJdCBub3cKICByZXR1cm5zIChOb25lLCBOb25lLCAnYWInKSwgYXMgZXhwZWN0ZWQuIEFsc28gZml4ZWQgaGFuZGxpbmcgb2YKICBsYXN0aW5kZXgvbGFzdGdyb3VwIG1hdGNoIGF0dHJpYnV0ZXMgaW4gc2ltaWxhciBjYXNlcy4gRm9yIGV4YW1wbGUsCiAgd2hlbiBydW5uaW5nIHRoZSBleHByZXNzaW9uIHInKGEpKGIpP2InIG92ZXIgJ2FiJywgbGFzdGluZGV4IG11c3QgYmUKICAxLCBub3QgMi4KCi0gRml4ZWQgYnVnICM1ODEwODA6IHNyZSBzY2FubmVyIHdhcyBub3QgY2hlY2tpbmcgdGhlIGJ1ZmZlciBsaW1pdAogIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBjdXJyZW50IHBvaW50ZXIuIFRoaXMgd2FzIGNyZWF0aW5nIGFuIGluZmluaXRlCiAgbG9vcCBpbiB0aGUgc2VhcmNoIGZ1bmN0aW9uLCBvbmNlIHRoZSBwb2ludGVyIGV4Y2VlZGVkIHRoZSBidWZmZXIKICBsaW1pdC4KCi0gVGhlIG9zLmZkb3BlbiBmdW5jdGlvbiBub3cgZW5mb3JjZXMgYSBmaWxlIG1vZGUgc3RhcnRpbmcgd2l0aCB0aGUKICBsZXR0ZXIgJ3InLCAndycgb3IgJ2EnLCBvdGhlcndpc2UgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gVGhpcyBmaXhlcwogIGJ1ZyAjNjIzNDY0LgoKTGlicmFyeQotLS0tLS0tCgotIGRvY3Rlc3QudGVzdG1vZCBjYW4gbm93IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50LCB3aGljaCBtZWFucyB0bwogIHRlc3QgdGhlIGN1cnJlbnQgbW9kdWxlLgoKLSBXaGVuIGNhbmNlbGxpbmcgYSBzZXJ2ZXIgdGhhdCBpbXBsZW1lbnRlZCB0aHJlYWRpbmcgd2l0aCBhIGtleWJvYXJkCiAgaW50ZXJydXB0LCB0aGUgc2VydmVyIHdvdWxkIHNodXQgZG93biBidXQgbm90IHRlcm1pbmF0ZSAod2FpdGluZyBvbgogIGNsaWVudCB0aHJlYWRzKS4gQSBuZXcgbWVtYmVyIHZhcmlhYmxlLCBkYWVtb25fdGhyZWFkcywgd2FzIGFkZGVkIHRvCiAgdGhlIFRocmVhZGluZ01peEluIGNsYXNzIGluIFNvY2tldFNlcnZlci5weSB0byBtYWtlIGl0IGV4cGxpY2l0IHRoYXQKICB0aGlzIGJlaGF2aW9yIG5lZWRzIHRvIGJlIGNvbnRyb2xsZWQuCgotIEEgbmV3IG1vZHVsZSwgb3B0cGFyc2UsIHByb3ZpZGVzIGEgZmFuY3kgYWx0ZXJuYXRpdmUgdG8gZ2V0b3B0IGZvcgogIGNvbW1hbmQgbGluZSBwYXJzaW5nLiAgSXQgaXMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdyZWcKICBXYXJkJ3MgT3B0aWsgcGFja2FnZS4KCi0gVXNlckRpY3QucHkgbm93IGRlZmluZXMgYSBEaWN0TWl4aW4gY2xhc3Mgd2hpY2ggZGVmaW5lcyBhbGwgZGljdGlvbmFyeQogIG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBtaW5pbXVtIG1hcHBpbmcgaW50ZXJmYWNlLgogIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIHdyaXRpbmcgY2xhc3NlcyB0aGF0IG5lZWQgdG8gYmUgc3Vic3RpdHV0YWJsZQogIGZvciBkaWN0aW9uYXJpZXMgKHN1Y2ggYXMgdGhlIHNoZWx2ZSBtb2R1bGUpLgoKLSBzaGVsdmUucHkgbm93IHN1YmNsYXNzZXMgZnJvbSBVc2VyRGljdC5EaWN0TWl4aW4uICBOb3cgc2hlbHZlIHN1cHBvcnRzCiAgYWxsIGRpY3Rpb25hcnkgbWV0aG9kcy4gIFRoaXMgZWFzZXMgdGhlIHRyYW5zaXRpb24gdG8gcGVyc2lzdGVudAogIHN0b3JhZ2UgZm9yIHNjcmlwdHMgb3JpZ2luYWxseSB3cml0dGVuIHdpdGggZGljdGlvbmFyaWVzIGluIG1pbmQuCgotIEEgbmV3IHBhY2thZ2UsIGxvZ2dpbmcsIGltcGxlbWVudHMgdGhlIGxvZ2dpbmcgQVBJIGRlZmluZWQgYnkgUEVQCiAgMjgyLiAgVGhlIGNvZGUgaXMgd3JpdHRlbiBieSBWaW5heSBTYWppcC4KCi0gU3RyZWFtUmVhZGVyLCBTdHJlYW1SZWFkZXJXcml0ZXIgYW5kIFN0cmVhbVJlY29kZXIgaW4gdGhlIGNvZGVjcwogIG1vZHVsZXMgYXJlIGl0ZXJhdG9ycyBub3cuCgotIGd6aXAucHkgbm93IGhhbmRsZXMgZmlsZXMgZXhjZWVkaW5nIDJHQi4gIEZpbGVzIG92ZXIgNEdCIGFsc28gd29yawogIG5vdyAocHJvdmlkZWQgdGhlIE9TIHN1cHBvcnRzIGl0LCBhbmQgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgd2l0aCBsYXJnZQogIGZpbGUgc3VwcG9ydCksIGJ1dCBpbiB0aGF0IGNhc2UgdGhlIHVuZGVybHlpbmcgZ3ppcCBmaWxlIGZvcm1hdCBjYW4KICByZWNvcmQgb25seSB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgMzIgYml0cyBvZiB0aGUgZmlsZSBzaXplLCBzbyB0aGF0CiAgc29tZSB0b29scyB3b3JraW5nIHdpdGggZ3ppcHBlZCBmaWxlcyBtYXkgcmVwb3J0IGFuIGluY29ycmVjdCBmaWxlCiAgc2l6ZS4KCi0geG1sLnNheC5zYXh1dGlscy51bmVzY2FwZSBoYXMgYmVlbiBhZGRlZCwgdG8gcmVwbGFjZSBlbnRpdHkgcmVmZXJlbmNlcwogIHdpdGggdGhlaXIgZW50aXR5IHZhbHVlLgoKLSBRdWV1ZS5RdWV1ZS57cHV0LGdldH0gbm93IHN1cHBvcnQgYW4gb3B0aW9uYWwgdGltZW91dCBhcmd1bWVudC4KCi0gVmFyaW91cyBmZWF0dXJlcyBvZiBUayA4LjQgYXJlIGV4cG9zZWQgaW4gVGtpbnRlci5weS4gVGhlIG11bHRpcGxlCiAgb3B0aW9uIG9mIHRrRmlsZURpYWxvZyBpcyBleHBvc2VkIGFzIGZ1bmN0aW9uIGFza29wZW5maWxleyxuYW1lfXMuCgotIFZhcmlvdXMgY29uZmlndXJlIG1ldGhvZHMgb2YgVGtpbnRlciBoYXZlIGJlZW4gc3RyZWFtLWxpbmVkLCBzbyB0aGF0CiAgdGFnX2NvbmZpZ3VyZSwgaW1hZ2VfY29uZmlndXJlLCB3aW5kb3dfY29uZmlndXJlIG5vdyByZXR1cm4gYQogIGRpY3Rpb25hcnkgd2hlbiBpbnZva2VkIHdpdGggbm8gYXJndW1lbnQuCgotIEltcG9ydGluZyB0aGUgcmVhZGxpbmUgbW9kdWxlIG5vdyBubyBsb25nZXIgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZgogIGNhbGxpbmcgc2V0bG9jYWxlKExDX0NUWVBFLCAiIikuICBUaGUgaW5pdGlhbCAiQyIgbG9jYWxlLCBvcgogIHdoYXRldmVyIGxvY2FsZSBpcyBleHBsaWNpdGx5IHNldCBieSB0aGUgdXNlciwgaXMgcHJlc2VydmVkLiAgSWYgeW91CiAgd2FudCByZXByKCkgb2YgOC1iaXQgc3RyaW5ncyBpbiB5b3VyIHByZWZlcnJlZCBlbmNvZGluZyB0byBwcmVzZXJ2ZQogIGFsbCBwcmludGFibGUgY2hhcmFjdGVycyBvZiB0aGF0IGVuY29kaW5nLCB5b3UgaGF2ZSB0byBhZGQgdGhlCiAgZm9sbG93aW5nIGNvZGUgdG8geW91ciAkUFlUSE9OU1RBUlRVUCBmaWxlIG9yIHRvIHlvdXIgYXBwbGljYXRpb24ncwogIG1haW4oKToKCiAgICBpbXBvcnQgbG9jYWxlCiAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgIiIpCgotIHNodXRpbC5tb3ZlIHdhcyBhZGRlZC4gc2h1dGlsLmNvcHl0cmVlIG5vdyByZXBvcnRzIGVycm9ycyBhcyBhbgogIGV4Y2VwdGlvbiBhdCB0aGUgZW5kLCBpbnN0ZWFkIG9mIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzLgoKLSBFbmNvZGluZyBuYW1lIG5vcm1hbGl6YXRpb24gd2FzIGdlbmVyYWxpemVkIHRvIG5vdCBvbmx5CiAgcmVwbGFjZSBoeXBoZW5zIHdpdGggdW5kZXJzY29yZXMsIGJ1dCBhbHNvIGFsbCBvdGhlciBub24tYWxwaGFudW1lcmljCiAgY2hhcmFjdGVycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBkb3Qgd2hpY2ggaXMgdXNlZCBmb3IgUHl0aG9uCiAgcGFja2FnZSBuYW1lcyBkdXJpbmcgbG9va3VwKS4gVGhlIGFsaWFzZXMucHkgbWFwcGluZyB3YXMgdXBkYXRlZAogIHRvIHRoZSBuZXcgc3RhbmRhcmQuCgotIG1pbWV0eXBlcyBoYXMgdHdvIG5ldyBmdW5jdGlvbnM6IGd1ZXNzX2FsbF9leHRlbnNpb25zKCkgd2hpY2gKICByZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gZXh0ZW5zaW9ucyBmb3IgYSBtaW1lIHR5cGUsIGFuZAogIGFkZF90eXBlKCkgd2hpY2ggYWRkcyBvbmUgbWFwcGluZyBiZXR3ZWVuIGEgbWltZSB0eXBlIGFuZAogIGFuIGV4dGVuc2lvbiB0byB0aGUgZGF0YWJhc2UuCgotIE5ldyBtb2R1bGU6IHNldHMsIGRlZmluZXMgdGhlIGNsYXNzIFNldCB0aGF0IGltcGxlbWVudHMgYSBtdXRhYmxlCiAgc2V0IHR5cGUgdXNpbmcgdGhlIGtleXMgb2YgYSBkaWN0IHRvIHJlcHJlc2VudCB0aGUgc2V0LiAgVGhlcmUncwogIGFsc28gYSBjbGFzcyBJbW11dGFibGVTZXQgd2hpY2ggaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgc2V0cyBvZiBzZXRzCiAgb3Igd2hlbiB5b3UgbmVlZCB0byB1c2Ugc2V0cyBhcyBkaWN0IGtleXMsIGFuZCBhIGNsYXNzIEJhc2VTZXQgd2hpY2gKICBpcyB0aGUgYmFzZSBjbGFzcyBvZiB0aGUgdHdvLiAgKFRoaXMgaXMgbm90IGRvY3VtZW50ZWQgeWV0LCBidXQKICBoZWxwKHNldHMpIGdpdmVzIGEgd2VhbHRoIG9mIGluZm9ybWF0aW9uLikKCi0gQWRkZWQgb3BlcmF0b3IucG93KGEsYikgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBhKipiLgoKLSBBZGRlZCByYW5kb20uc2FtcGxlKHBvcHVsYXRpb24saykgZm9yIHJhbmRvbSBzYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50LgogIFJldHVybnMgYSBrIGxlbmd0aCBsaXN0IG9mIHVuaXF1ZSBlbGVtZW50cyBjaG9zZW4gZnJvbSB0aGUgcG9wdWxhdGlvbi4KCi0gcmFuZG9tLnJhbmRyYW5nZSgtc3lzLm1heGludC0xLCBzeXMubWF4aW50KSBubyBsb25nZXIgcmFpc2VzCiAgT3ZlcmZsb3dFcnJvci4gIFRoYXQgaXMsIGl0IG5vdyBhY2NlcHRzIGFueSBjb21iaW5hdGlvbiBvZiAnc3RhcnQnCiAgYW5kICdzdG9wJyBhcmd1bWVudHMgc28gbG9uZyBhcyBlYWNoIGlzIGluIHRoZSByYW5nZSBvZiBQeXRob24ncwogIGJvdW5kZWQgaW50ZWdlcnMuCgotIE5ldyAiYWxnb3JpdGhtcyIgbW9kdWxlOiBoZWFwcSwgaW1wbGVtZW50cyBhIGhlYXAgcXVldWUuICBUaGFua3MgdG8KICBLZXZpbiBPJ0Nvbm5vciBmb3IgdGhlIGNvZGUgYW5kIEZyYW7nb2lzIFBpbmFyZCBmb3IgYW4gZW50ZXJ0YWluaW5nCiAgd3JpdGUtdXAgZXhwbGFpbmluZyB0aGUgdGhlb3J5IGFuZCBwcmFjdGljYWwgdXNlcyBvZiBoZWFwcy4KCi0gTmV3IGVuY29kaW5nIGZvciB0aGUgUGFsbSBPUyBjaGFyYWN0ZXIgc2V0OiBwYWxtb3MuCgotIGJpbmFzY2lpLmNyYzMyKCkgYW5kIHRoZSB6aXBmaWxlIG1vZHVsZSBoYWQgcHJvYmxlbXMgb24gc29tZSA2NC1iaXQKICBwbGF0Zm9ybXMuICBUaGVzZSBoYXZlIGJlZW4gZml4ZWQuICBPbiBhIHBsYXRmb3JtIHdpdGggOC1ieXRlIEMgbG9uZ3MsCiAgY3JjMzIoKSBub3cgcmV0dXJucyBhIHNpZ25lZC1leHRlbmRlZCA0LWJ5dGUgcmVzdWx0LCBzbyB0aGF0IGl0cyB2YWx1ZQogIGFzIGEgUHl0aG9uIGludCBpcyBlcXVhbCB0byB0aGUgdmFsdWUgY29tcHV0ZWQgYSAzMi1iaXQgcGxhdGZvcm0uCgotIHhtbC5kb20ubWluaWRvbS50b3htbCBhbmQgdG9wcmV0dHl4bWwgbm93IHRha2UgYW4gb3B0aW9uYWwgZW5jb2RpbmcKICBhcmd1bWVudC4KCi0gU29tZSBmaXhlcyBpbiB0aGUgY29weSBtb2R1bGU6IHdoZW4gYW4gb2JqZWN0IGlzIGNvcGllZCB0aHJvdWdoIGl0cwogIF9fcmVkdWNlX18gbWV0aG9kLCB0aGVyZSB3YXMgbm8gY2hlY2sgZm9yIGEgX19zZXRzdGF0ZV9fIG1ldGhvZCBvbgogIHRoZSByZXN1bHQgW1NGIHBhdGNoIDU2NTA4NV07IGRlZXBjb3B5IHNob3VsZCB0cmVhdCBpbnN0YW5jZXMgb2YKICBjdXN0b20gbWV0YWNsYXNzZXMgdGhlIHNhbWUgd2F5IGl0IHRyZWF0cyBpbnN0YW5jZXMgb2YgdHlwZSAndHlwZScKICBbU0YgcGF0Y2ggNTYwNzk0XS4KCi0gU29ja2V0cyBub3cgc3VwcG9ydCB0aW1lb3V0IG1vZGUuICBBZnRlciBzLnNldHRpbWVvdXQoVCksIHdoZXJlIFQgaXMKICBhIGZsb2F0IGV4cHJlc3Npbmcgc2Vjb25kcywgc3Vic2VxdWVudCBvcGVyYXRpb25zIHJhaXNlIGFuIGV4Y2VwdGlvbgogIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gVCBzZWNvbmRzLiAgVG8gZGlzYWJsZSB0aW1lb3V0CiAgbW9kZSwgdXNlIHMuc2V0dGltZW91dChOb25lKS4gIFRoZXJlJ3MgYWxzbyBhIG1vZHVsZSBmdW5jdGlvbiwKICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoVCksIHdoaWNoIHNldHMgdGhlIGRlZmF1bHQgZm9yIGFsbCBzb2NrZXRzCiAgY3JlYXRlZCBoZW5jZWZvcnRoLgoKLSBnZXRvcHQuZ251X2dldG9wdCB3YXMgYWRkZWQuICBUaGlzIHN1cHBvcnRzIEdOVS1zdHlsZSBvcHRpb24KICBwcm9jZXNzaW5nLCB3aGVyZSBvcHRpb25zIGNhbiBiZSBtaXhlZCB3aXRoIG5vbi1vcHRpb24gYXJndW1lbnRzLgoKLSBTdG9wIHVzaW5nIHN0cmluZ3MgZm9yIGV4Y2VwdGlvbnMuICBTdHJpbmcgb2JqZWN0cyB1c2VkIGZvcgogIGV4Y2VwdGlvbnMgYXJlIG5vdyBjbGFzc2VzIGRlcml2aW5nIGZyb20gRXhjZXB0aW9uLiAgVGhlIG9iamVjdHMKICBjaGFuZ2VkIHdlcmU6IFRraW50ZXIuVGNsRXJyb3IsIGJkYi5CZGJRdWl0LCBtYWNwYXRoLm5vcm1fZXJyb3IsCiAgdGFibmFubnkuTmFubnlOYWcsIGFuZCB4ZHJsaWIuRXJyb3IuCgotIENvbnN0YW50cyBCT01fVVRGOCwgQk9NX1VURjE2LCBCT01fVVRGMTZfTEUsIEJPTV9VVEYxNl9CRSwKICBCT01fVVRGMzIsIEJPTV9VVEYzMl9MRSBhbmQgQk9NX1VURjMyX0JFIHRoYXQgcmVwcmVzZW50IHRoZSBCeXRlCiAgT3JkZXIgTWFyayBpbiBVVEYtOCwgVVRGLTE2IGFuZCBVVEYtMzIgZW5jb2RpbmdzIGZvciBsaXR0bGUgYW5kCiAgYmlnIGVuZGlhbiBzeXN0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIGNvZGVjcyBtb2R1bGUuIFRoZSBvbGQgbmFtZXMKICBCT00zMl8qIGFuZCBCT002NF8qIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDIuCgotIEFkZGVkIGNvbnZlcnNpb24gZnVuY3Rpb25zIG1hdGguZGVncmVlcygpIGFuZCBtYXRoLnJhZGlhbnMoKS4KCi0gZnRwbGliLnJldHJsaW5lcygpIG5vdyB0ZXN0cyBmb3IgY2FsbGJhY2sgaXMgTm9uZSByYXRoZXIgdGhhbiB0ZXN0aW5nCiAgZm9yIEZhbHNlLiAgV2FzIGNhdXNpbmcgYW4gZXJyb3Igd2hlbiBnaXZlbiBhIGNhbGxiYWNrIG9iamVjdCB3aGljaAogIHdhcyBjYWxsYWJsZSBidXQgYWxzbyByZXR1cm5lZCBsZW4oKSBhcyB6ZXJvLiAgVGhlIGNoYW5nZSBtYXkKICBjcmVhdGUgbmV3IGJyZWFrYWdlIGlmIHRoZSBjYWxsZXIgcmVsaWVkIG9uIHRoZSB1bmRvY3VtZW50ZWQgYmVoYXZpb3IKICBhbmQgY2FsbGVkIHdpdGggY2FsbGJhY2sgc2V0IHRvIFtdIG9yIHNvbWUgb3RoZXIgRmFsc2UgdmFsdWUgbm90CiAgaWRlbnRpY2FsIHRvIE5vbmUuCgotIHJhbmRvbS5nYXVzcygpIHVzZXMgYSBwaWVjZSBvZiBoaWRkZW4gc3RhdGUgdXNlZCBieSBub3RoaW5nIGVsc2UsCiAgYW5kIHRoZSAuc2VlZCgpIGFuZCAud2hzZWVkKCkgbWV0aG9kcyBmYWlsZWQgdG8gcmVzZXQgaXQuICBJbiBvdGhlcgogIHdvcmRzLCBzZXR0aW5nIHRoZSBzZWVkIGRpZG4ndCBjb21wbGV0ZWx5IGRldGVybWluZSB0aGUgc2VxdWVuY2Ugb2YKICByZXN1bHRzIHByb2R1Y2VkIGJ5IHJhbmRvbS5nYXVzcygpLiAgSXQgZG9lcyBub3cuICBQcm9ncmFtcyByZXBlYXRlZGx5CiAgbWl4aW5nIGNhbGxzIHRvIGEgc2VlZCBtZXRob2Qgd2l0aCBjYWxscyB0byBnYXVzcygpIG1heSBzZWUgZGlmZmVyZW50CiAgcmVzdWx0cyBub3cuCgotIFRoZSBwaWNrbGUuUGlja2xlciBjbGFzcyBncmV3IGEgY2xlYXJfbWVtbygpIG1ldGhvZCB0byBtaW1pYyB0aGF0CiAgcHJvdmlkZWQgYnkgY1BpY2tsZS5QaWNrbGVyLgoKLSBkaWZmbGliJ3MgU2VxdWVuY2VNYXRjaGVyIGNsYXNzIG5vdyBkb2VzIGEgZHluYW1pYyBhbmFseXNpcyBvZgogIHdoaWNoIGVsZW1lbnRzIGFyZSBzbyBmcmVxdWVudCBhcyB0byBjb25zdGl0dXRlIG5vaXNlLiAgRm9yCiAgY29tcGFyaW5nIGZpbGVzIGFzIHNlcXVlbmNlcyBvZiBsaW5lcywgdGhpcyBnZW5lcmFsbHkgd29ya3MgYmV0dGVyCiAgdGhhbiB0aGUgSVNfTElORV9KVU5LIGZ1bmN0aW9uLCBhbmQgZnVuY3Rpb24gbmRpZmYncyBsaW5lanVuawogIGFyZ3VtZW50IGRlZmF1bHRzIHRvIE5vbmUgbm93IGFzIGEgcmVzdWx0LiAgQSBoYXBweSBiZW5lZml0IGlzCiAgdGhhdCBTZXF1ZW5jZU1hdGNoZXIgbWF5IHJ1biBtdWNoIGZhc3RlciBub3cgd2hlbiBhcHBsaWVkCiAgdG8gbGFyZ2UgZmlsZXMgd2l0aCBtYW55IGR1cGxpY2F0ZSBsaW5lcyAoZm9yIGV4YW1wbGUsIEMgcHJvZ3JhbQogIHRleHQgd2l0aCBsb3RzIG9mIHJlcGVhdGVkICJ9IiBhbmQgInJldHVybiBOVUxMOyIgbGluZXMpLgoKLSBOZXcgVGV4dC5kdW1wKCkgbWV0aG9kIGluIFRraW50ZXIgbW9kdWxlLgoKLSBOZXcgZGlzdHV0aWxzIGNvbW1hbmRzIGZvciBidWlsZGluZyBwYWNrYWdlcnMgd2VyZSBhZGRlZCB0bwogIHN1cHBvcnQgcGtndG9vbCBvbiBTb2xhcmlzIGFuZCBzd2luc3RhbGwgb24gSFAtVVguCgotIGRpc3R1dGlscyBub3cgaGFzIGEgbmV3IGFic3RyYWN0IGJpbmFyeSBwYWNrYWdlciBiYXNlIGNsYXNzCiAgY29tbWFuZC9iZGlzdF9wYWNrYWdlciwgd2hpY2ggc2ltcGxpZmllcyB3cml0aW5nIHBhY2thZ2Vycy4KICBUaGlzIHdpbGwgaG9wZWZ1bGx5IHByb3ZpZGUgdGhlIG1pc3NpbmcgYml0cyB0byBlbmNvdXJhZ2UKICBwZW9wbGUgdG8gc3VibWl0IG1vcmUgcGFja2FnZXJzLCBlLmcuIGZvciBEZWJpYW4sIEZyZWVCU0QKICBhbmQgb3RoZXIgc3lzdGVtcy4KCi0gVGhlIFVURi0xNiwgLUxFIGFuZCAtQkUgc3RyZWFtIHJlYWRlcnMgbm93IHJhaXNlIGEKICBOb3RJbXBsZW1lbnRlZEVycm9yIGZvciBhbGwgY2FsbHMgdG8gLnJlYWRsaW5lKCkuIFByZXZpb3VzbHksIHRoZXkKICB1c2VkIHRvIGp1c3QgcHJvZHVjZSBnYXJiYWdlIG9yIGZhaWwgd2l0aCBhbiBlbmNvZGluZyBlcnJvciAtLQogIFVURi0xNiBpcyBhIDItYnl0ZSBlbmNvZGluZyBhbmQgdGhlIEMgbGliJ3MgbGluZSByZWFkaW5nIEFQSXMgZG9uJ3QKICB3b3JrIHdlbGwgd2l0aCB0aGVzZS4KCi0gY29tcGlsZWFsbCBub3cgc3VwcG9ydHMgcXVpZXQgb3BlcmF0aW9uLgoKLSBUaGUgQmFzZUhUVFBTZXJ2ZXIgbm93IGltcGxlbWVudHMgb3B0aW9uYWwgSFRUUC8xLjEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zLgoKLSBzb2NrZXQgbW9kdWxlOiB0aGUgU1NMIHN1cHBvcnQgd2FzIGJyb2tlbiBvdXQgb2YgdGhlIG1haW4KICBfc29ja2V0IG1vZHVsZSBDIGhlbHBlciBhbmQgcGxhY2VkIGludG8gYSBuZXcgX3NzbCBoZWxwZXIKICB3aGljaCBub3cgZ2V0cyBpbXBvcnRlZCBieSBzb2NrZXQucHkgaWYgYXZhaWxhYmxlIGFuZCB3b3JraW5nLgoKLSBlbmNvZGluZ3MgcGFja2FnZTogYWRkZWQgYWxpYXNlcyBmb3IgYWxsIHN1cHBvcnRlZCBJQU5BIGNoYXJhY3RlcgogIHNldHMKCi0gZnRwbGliOiB0byBzYWZlZ3VhcmQgdGhlIHVzZXIncyBwcml2YWN5LCBhbm9ueW1vdXMgbG9naW4gd2lsbCB1c2UKICAiYW5vbnltb3VzQCIgYXMgZGVmYXVsdCBwYXNzd29yZCwgcmF0aGVyIHRoYW4gdGhlIHJlYWwgdXNlciBhbmQgaG9zdAogIG5hbWUuCgotIHdlYmJyb3dzZXI6IHRpZ2h0ZW5lZCB1cCB0aGUgY29tbWFuZCBwYXNzZWQgdG8gb3Muc3lzdGVtKCkgc28gdGhhdAogIGFyYml0cmFyeSBzaGVsbCBjb2RlIGNhbid0IGJlIGV4ZWN1dGVkIGJlY2F1c2UgYSBib2d1cyBVUkwgd2FzCiAgcGFzc2VkIGluLgoKLSBnZXR0ZXh0LnRyYW5zbGF0aW9uIGhhcyBhbiBvcHRpb25hbCBmYWxsYmFjayBhcmd1bWVudCwgYW5kCiAgZ2V0dGV4dC5maW5kIGFuIG9wdGlvbmFsIGFsbCBhcmd1bWVudC4gVHJhbnNsYXRpb25zIHdpbGwgbm93IGZhbGxiYWNrCiAgb24gYSBwZXItbWVzc2FnZSBiYXNpcy4gVGhlIG1vZHVsZSBzdXBwb3J0cyBwbHVyYWwgZm9ybXMsIGJ5IG1lYW5zCiAgb2YgZ2V0dGV4dC5bZF1uZ2V0dGV4dCBhbmQgVHJhbnNsYXRpb24uW3VdbmdldHRleHQuCgotIGRpc3R1dGlscyBiZGlzdCBjb21tYW5kcyBub3cgb2ZmZXIgYSAtLXNraXAtYnVpbGQgb3B0aW9uLgoKLSB3YXJuaW5ncy53YXJuIG5vdyBhY2NlcHRzIGEgV2FybmluZyBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudC4KCi0gVGhlIHhtbC5zYXguZXhwYXRyZWFkZXIuRXhwYXRQYXJzZXIgY2xhc3Mgd2lsbCBubyBsb25nZXIgY3JlYXRlCiAgY2lyY3VsYXIgcmVmZXJlbmNlcyBieSB1c2luZyBpdHNlbGYgYXMgdGhlIGxvY2F0b3IgdGhhdCBnZXRzIHBhc3NlZAogIHRvIHRoZSBjb250ZW50IGhhbmRsZXIgaW1wbGVtZW50YXRpb24uICBbU0YgYnVnICM1MzU0NzRdCgotIFRoZSBlbWFpbC5QYXJzZXIuUGFyc2VyIGNsYXNzIG5vdyBwcm9wZXJseSBwYXJzZXMgc3RyaW5ncyByZWdhcmRsZXNzCiAgb2YgdGhlaXIgbGluZSBlbmRpbmdzLCB3aGljaCBjYW4gYmUgYW55IG9mIFxyLCBcbiwgb3IgXHJcbiAoQ1IsIExGLAogIG9yIENSTEYpLiAgQWxzbywgdGhlIEhlYWRlciBjbGFzcydzIGNvbnN0cnVjdG9yIGRlZmF1bHQgYXJndW1lbnRzCiAgaGFzIGNoYW5nZWQgc2xpZ2h0bHkgc28gdGhhdCBhbiBleHBsaWNpdCBtYXhsaW5lbGVuIHZhbHVlIGlzIGFsd2F5cwogIGhvbm9yZWQuCgotIGRpc3R1dGlscycgYnVpbGRfZXh0IGNvbW1hbmQgbm93IGxpbmtzIGMrKyBleHRlbnNpb25zIHdpdGggdGhlIGMrKwogIGNvbXBpbGVyIGF2YWlsYWJsZSBpbiB0aGUgTWFrZWZpbGUgb3IgQ1hYIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZgogIHJ1bm5pbmcgdW5kZXIgKm5peC4KCi0gTmV3IG1vZHVsZSBiejI6IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBpbnRlcmZhY2UgZm9yIHRoZSBiejIgY29tcHJlc3Npb24KICBsaWJyYXJ5LiAgSXQgaW1wbGVtZW50cyBhIGNvbXBsZXRlIGZpbGUgaW50ZXJmYWNlLCBvbmUtc2hvdCAoZGUpY29tcHJlc3Npb24KICBmdW5jdGlvbnMsIGFuZCB0eXBlcyBmb3Igc2VxdWVudGlhbCAoZGUpY29tcHJlc3Npb24uCgotIE5ldyBwZGIgY29tbWFuZCBgcHAnIHdoaWNoIGlzIGxpa2UgYHAnIGV4Y2VwdCB0aGF0IGl0IHByZXR0eS1wcmludHMKICB0aGUgdmFsdWUgb2YgaXRzIGV4cHJlc3Npb24gYXJndW1lbnQuCgotIE5vdyBiZGlzdF9ycG0gZGlzdHV0aWxzIGNvbW1hbmQgdW5kZXJzdGFuZHMgYSB2ZXJpZnlfc2NyaXB0IG9wdGlvbiBpbgogIHRoZSBjb25maWcgZmlsZSwgaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgcmVmZXJyZWQgZmlsZW5hbWUgaW4KICB0aGUgIiV2ZXJpZnlzY3JpcHQiIHNlY3Rpb24gb2YgdGhlIHJwbSBzcGVjIGZpbGUuCgotIEZpeGVkIGJ1ZyAjNDk1Njk1OiB3ZWJicm93c2VyIG1vZHVsZSB3b3VsZCBydW4gZ3JhcGhpYyBicm93c2VycyBpbiBhCiAgdW5peCBlbnZpcm9ubWVudCBldmVuIGlmIERJU1BMQVkgd2FzIG5vdCBzZXQuIEFsc28sIHN1cHBvcnQgZm9yCiAgc2tpcHN0b25lIGJyb3dzZXIgd2FzIGluY2x1ZGVkLgoKVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0KCi0gcHlnZXR0ZXh0LnB5IG5vdyBzdXBwb3J0cyBnbG9iYmluZyBvbiBXaW5kb3dzLCBhbmQgYWNjZXB0cyBtb2R1bGUKICBuYW1lcyBpbiBhZGRpdGlvbiB0byBhY2NlcHRpbmcgZmlsZSBuYW1lcy4KCi0gVGhlIFNHSSBkZW1vcyAoRGVtby9zZ2kpIGhhdmUgYmVlbiByZW1vdmVkLiAgTm9ib2R5IHRob3VnaHQgdGhleQogIHdlcmUgaW50ZXJlc3RpbmcgYW55IG1vcmUuICAoVGhlIFNHSSBsaWJyYXJ5IG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMKICBhcmUgc3RpbGwgdGhlcmU7IGl0IGlzIGJlbGlldmVkIHRoYXQgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBhcmUKICBzdGlsbCB1c2VkIGFuZCB1c2VmdWwuKQoKLSBJRExFIHN1cHBvcnRzIHRoZSBuZXcgZW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzKTsgaXQgY2FuIGFsc28KICBkZWFsIHdpdGggbGVnYWN5IDgtYml0IGZpbGVzIGlmIHRoZXkgdXNlIHRoZSBsb2NhbGUncyBlbmNvZGluZy4gSXQKICBhbGxvd3Mgbm9uLUFTQ0lJIHN0cmluZ3MgaW4gdGhlIGludGVyYWN0aXZlIHNoZWxsIGFuZCBleGVjdXRlcyB0aGVtCiAgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nLgoKLSBmcmVlemUucHkgbm93IHByb2R1Y2VzIGJpbmFyaWVzIHdoaWNoIGNhbiBpbXBvcnQgc2hhcmVkIG1vZHVsZXMsCiAgdW5saWtlIGJlZm9yZSB3aGVuIHRoaXMgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHN5bWJvbCBleHBvcnRzIGluCiAgdGhlIGdlbmVyYXRlZCBiaW5hcnkuCgpCdWlsZAotLS0tLQoKLSBPbiBVbml4LCBJRExFIGlzIG5vdyBpbnN0YWxsZWQgYXV0b21hdGljYWxseS4KCi0gVGhlIGZwZWN0bCBtb2R1bGUgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQ7IGl0J3MgZGFuZ2Vyb3VzIG9yIHVzZWxlc3MKICBleGNlcHQgaW4gdGhlIGhhbmRzIG9mIGV4cGVydHMuCgotIFRoZSBwdWJsaWMgUHl0aG9uIEMgQVBJIHdpbGwgZ2VuZXJhbGx5IGJlIGRlY2xhcmVkIHVzaW5nIFB5QVBJX0ZVTkMKICBhbmQgUHlBUElfREFUQSBtYWNyb3MsIHdoaWxlIFB5dGhvbiBleHRlbnNpb24gbW9kdWxlIGluaXQgZnVuY3Rpb25zCiAgd2lsbCBiZSBkZWNsYXJlZCB3aXRoIFB5TU9ESU5JVF9GVU5DLiAgRExfRVhQT1JUL0RMX0lNUE9SVCBtYWNyb3MKICBhcmUgZGVwcmVjYXRlZC4KCi0gQSBidWcgd2FzIGZpeGVkIHRoYXQgY291bGQgY2F1c2UgQ09VTlRfQUxMT0NTIGJ1aWxkcyB0byBzZWdmYXVsdCwgb3IKICBnZXQgaW50byBpbmZpbml0ZSBsb29wcywgd2hlbiBhIG5ldy1zdHlsZSBjbGFzcyBnb3QgZ2FyYmFnZS1jb2xsZWN0ZWQuCiAgVW5mb3J0dW5hdGVseSwgdG8gYXZvaWQgdGhpcywgdGhlIHdheSBDT1VOVF9BTExPQ1Mgd29ya3MgcmVxdWlyZXMKICB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGJlIGltbW9ydGFsIGluIENPVU5UX0FMTE9DUyBidWlsZHMuICBOb3RlIHRoYXQKICBDT1VOVF9BTExPQ1MgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgaW4gZWl0aGVyIHJlbGVhc2Ugb3IgZGVidWcKICBidWlsZHMsIGFuZCB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGFyZSBpbW1vcnRhbCBvbmx5IGluIENPVU5UX0FMTE9DUwogIGJ1aWxkcy4KCi0gQ29tcGlsaW5nIG91dCB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIG5vIGxvbmdlciBhbiBvcHRpb24uCiAgVGhlIG9sZCBzeW1ib2wgV0lUSF9DWUNMRV9HQyBpcyBub3cgaWdub3JlZCwgYW5kIFB5dGhvbi5oIGFycmFuZ2VzCiAgdGhhdCBpdCdzIGFsd2F5cyBkZWZpbmVkIChmb3IgdGhlIGJlbmVmaXQgb2YgYW55IGV4dGVuc2lvbiBtb2R1bGVzCiAgdGhhdCBtYXkgYmUgY29uZGl0aW9uYWxpemluZyBvbiBpdCkuICBBIGJvbnVzIGlzIHRoYXQgYW55IGV4dGVuc2lvbgogIHR5cGUgcGFydGljaXBhdGluZyBpbiBjeWNsaWMgZ2MgY2FuIGNob29zZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUKICBQeV9UUkFTSENBTiBtZWNoYW5pc20gbm93IHRvbzsgaW4gdGhlIGFic2VuY2Ugb2YgY3ljbGljIGdjLCB0aGlzIHVzZWQKICB0byByZXF1aXJlIGVkaXRpbmcgdGhlIGNvcmUgdG8gdGVhY2ggdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBhYm91dCB0aGUKICBuZXcgdHlwZS4KCi0gQWNjb3JkaW5nIHRvIEFubmV4IEYgb2YgdGhlIGN1cnJlbnQgQyBzdGFuZGFyZCwKCiAgICBUaGUgU3RhbmRhcmQgQyBtYWNybyBIVUdFX1ZBTCBhbmQgaXRzIGZsb2F0IGFuZCBsb25nIGRvdWJsZSBhbmFsb2dzLAogICAgSFVHRV9WQUxGIGFuZCBIVUdFX1ZBTEwsIGV4cGFuZCB0byBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCiAgICBwb3NpdGl2ZSBpbmZpbml0aWVzLgoKICBQeXRob24gb25seSB1c2VzIHRoZSBkb3VibGUgSFVHRV9WQUwsIGFuZCBvbmx5IHRvICNkZWZpbmUgaXRzIG93biBzeW1ib2wKICBQeV9IVUdFX1ZBTC4gIFNvbWUgcGxhdGZvcm1zIGhhdmUgaW5jb3JyZWN0IGRlZmluaXRpb25zIGZvciBIVUdFX1ZBTC4KICBweXBvcnQuaCB1c2VkIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LCBidXQgdGhlIHdvcmthcm91bmRzIHRyaWdnZXJlZAogIG90aGVyIGJ1Z3Mgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyB3ZSBnYXZlIHVwLiAgSWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzCiAgSFVHRV9WQUwgaW5jb3JyZWN0bHksIHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgUHlfSFVHRV9WQUwgdG8gc29tZXRoaW5nCiAgdGhhdCB3b3JrcyBvbiB5b3VyIHBsYXRmb3JtLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBJJ20gc3VyZSBhYm91dAogIGlzIG9uIGFuIHVua25vd24gc3Vic2V0IG9mIENyYXkgc3lzdGVtcywgZGVzY3JpYmVkIGhlcmU6CgogIGh0dHA6Ly93d3cuY3JheS5jb20vc3dwdWJzL21hbnVhbHMvU04tMjE5NF8yLjAvaHRtbC1TTi0yMTk0XzIuMC94MzEzOC5odG0KCiAgUHJlc3VtYWJseSAyLjNhMSBicmVha3Mgc3VjaCBzeXN0ZW1zLiAgSWYgYW55b25lIHVzZXMgc3VjaCBhIHN5c3RlbSwgaGVscCEKCi0gVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRob3V0LWRvYy1zdHJpbmdzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUKICBkb2Mgc3RyaW5ncyBmcm9tIHRoZSBidWlsdGluIGZ1bmN0aW9ucyBhbmQgbW9kdWxlczsgdGhpcyByZWR1Y2VzIHRoZQogIHNpemUgb2YgdGhlIGV4ZWN1dGFibGUuCgotIFRoZSB1bml2ZXJzYWwgbmV3bGluZXMgb3B0aW9uIChQRVAgMjc4KSBpcyBvbiBieSBkZWZhdWx0LiAgT24gVW5peAogIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIC0td2l0aG91dC11bml2ZXJzYWwtbmV3bGluZXMgdG8gdGhlCiAgY29uZmlndXJlIHNjcmlwdC4gIE9uIG90aGVyIHBsYXRmb3JtcywgcmVtb3ZlCiAgV0lUSF9VTklWRVJTQUxfTkVXTElORVMgZnJvbSBweWNvbmZpZy5oLgoKLSBPbiBVbml4LCBhIHNoYXJlZCBsaWJweXRob24yLjMuc28gY2FuIGJlIGNyZWF0ZWQgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCgotIEFsbCB1c2VzIG9mIHRoZSBDQUNIRV9IQVNILCBJTlRFUk5fU1RSSU5HUywgYW5kIERPTlRfU0hBUkVfU0hPUlRfU1RSSU5HUwogIHByZXByb2Nlc3NvciBzeW1ib2xzIHdlcmUgZWxpbWluYXRlZC4gIFRoZSBpbnRlcm5hbCBkZWNpc2lvbnMgdGhleQogIGNvbnRyb2xsZWQgc3RvcHBlZCBiZWluZyBleHBlcmltZW50YWwgbG9uZyBhZ28uCgotIFRoZSB0b29scyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uIG5vdyB3b3JrIHVuZGVyIEN5Z3dpbiBhcwogIHdlbGwgYXMgVW5peC4KCi0gVGhlIGJzZGRiIGFuZCBkYm0gbW9kdWxlIGJ1aWxkcyBoYXZlIGJlZW4gY2hhbmdlZCB0byB0cnkgYW5kIGF2b2lkIHZlcnNpb24KICBza2V3IHByb2JsZW1zIGFuZCBkaXNhYmxlIGxpbmthZ2Ugd2l0aCBCZXJrZWxleSBEQiAxLjg1IHVubGVzcyB0aGUKICBpbnN0YWxsZXIga25vd3Mgd2hhdCBzL2hlJ3MgZG9pbmcuICBTZWUgdGhlIHNlY3Rpb24gb24gYnVpbGRpbmcgdGhlc2UKICBtb2R1bGVzIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4KCkMgQVBJCi0tLS0tCgotIFB5TnVtYmVyX0NoZWNrKCkgbm93IHJldHVybnMgdHJ1ZSBmb3Igc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMuCiAgVGhpcyBpcyBhIHJlc3VsdCBvZiB0aGVzZSB0eXBlcyBoYXZpbmcgYSBwYXJ0aWFsbHkgZGVmaW5lZAogIHRwX2FzX251bWJlciBzbG90LiAgKFRoaXMgaXMgbm90IGEgZmVhdHVyZSwgYnV0IGFuIGluZGljYXRpb24gdGhhdAogIFB5TnVtYmVyX0NoZWNrKCkgaXMgbm90IHZlcnkgdXNlZnVsIHRvIGRldGVybWluZSBudW1lcmljIGJlaGF2aW9yLgogIEl0IG1heSBiZSBkZXByZWNhdGVkLikKCi0gVGhlIHN0cmluZyBvYmplY3QncyBsYXlvdXQgaGFzIGNoYW5nZWQ6IHRoZSBwb2ludGVyIG1lbWJlcgogIG9iX3NpbnRlcm5lZCBoYXMgYmVlbiByZXBsYWNlZCBieSBhbiBpbnQgbWVtYmVyIG9iX3NzdGF0ZS4gIE9uIHNvbWUKICBwbGF0Zm9ybXMgKGUuZy4gbW9zdCA2NC1iaXQgc3lzdGVtcykgdGhpcyBtYXkgY2hhbmdlIHRoZSBvZmZzZXQgb2YKICB0aGUgb2Jfc3ZhbCBtZW1iZXIsIHNvIGFzIGEgcHJlY2F1dGlvbiB0aGUgQVBJX1ZFUlNJT04gaGFzIGJlZW4KICBpbmNyZW1lbnRlZC4gIFRoZSBhcHBhcmVudGx5IHVudXNlZCBmZWF0dXJlIG9mICJpbmRpcmVjdCBpbnRlcm5lZAogIHN0cmluZ3MiLCBzdXBwb3J0ZWQgYnkgdGhlIG9iX3NpbnRlcm5lZCBtZW1iZXIsIGlzIGdvbmUuICBJbnRlcm5lZAogIHN0cmluZ3MgYXJlIG5vdyB1c3VhbGx5IG1vcnRhbDsgdGhlcmVzIGEgbmV3IEFQSSwKICBQeVN0cmluZ19JbnRlcm5JbW1vcnRhbCgpIHRoYXQgY3JlYXRlcyBpbW1vcnRhbCBpbnRlcm5lZCBzdHJpbmdzLgogIChUaGUgb2Jfc3N0YXRlIG1lbWJlciBjYW4gb25seSB0YWtlIHRocmVlIHZhbHVlczsgaG93ZXZlciwgd2hpbGUKICBtYWtpbmcgaXQgYSBjaGFyIHNhdmVzIGEgZmV3IGJ5dGVzIHBlciBzdHJpbmcgb2JqZWN0IG9uIGF2ZXJhZ2UsIGluCiAgaXQgYWxzbyBzbG93ZWQgdGhpbmdzIGRvd24gYSBiaXQgYmVjYXVzZSBvYl9zdmFsIHdhcyBubyBsb25nZXIKICBhbGlnbmVkLikKCi0gVGhlIFB5X0luaXRNb2R1bGUqKCkgZnVuY3Rpb25zIG5vdyBhY2NlcHQgTlVMTCBmb3IgdGhlICdtZXRob2RzJwogIGFyZ3VtZW50LiAgTW9kdWxlcyB3aXRob3V0IGdsb2JhbCBmdW5jdGlvbnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uCiAgbm93IHRoYXQgZmFjdG9yaWVzIGNhbiBiZSB0eXBlcyByYXRoZXIgdGhhbiBmdW5jdGlvbnMuCgotIE5ldyBDIEFQSSBQeVVuaWNvZGVfRnJvbU9yZGluYWwoKSB3aGljaCBleHBvc2VzIHVuaWNocigpIGF0IEMKICBsZXZlbC4KCi0gTmV3IGZ1bmN0aW9ucyBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycigpIGFuZAogIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCkuIFNpbWlsYXIgdG8KICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgpIGFuZAogIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKCksIGJ1dCB0aGV5IGFsbG93IHRvIHNwZWNpZnkKICB0aGUgZXhjZXB0aW9uIHR5cGUgdG8gcmFpc2UuIEF2YWlsYWJsZSBvbiBXaW5kb3dzLgoKLSBQeV9GYXRhbEVycm9yKCkgaXMgbm93IGRlY2xhcmVkIGFzIHRha2luZyBhIGNvbnN0IGNoYXIqIGFyZ3VtZW50LiAgSXQKICB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgVGhpcyBzaG91bGQgbm90IGFmZmVjdCB3b3JraW5nCiAgY29kZS4KCi0gQWRkZWQgbmV3IG1hY3JvIFB5U2VxdWVuY2VfSVRFTShvLCBpKSB0aGF0IGRpcmVjdGx5IGNhbGxzCiAgc3FfaXRlbSB3aXRob3V0IHJlY2hlY2tpbmcgdGhhdCBvIGlzIGEgc2VxdWVuY2UgYW5kIHdpdGhvdXQKICBhZGp1c3RpbmcgZm9yIG5lZ2F0aXZlIGluZGljZXMuCgotIFB5UmFuZ2VfTmV3KCkgbm93IHJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSBmb3VydGggYXJndW1lbnQgaXMgbm90IDEuCiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSByZW1vdmFsIG9mIGRlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgdGhlIHhyYW5nZQogIG9iamVjdC4KCi0gUHlOdW1iZXJfQ29lcmNlKCkgYW5kIFB5TnVtYmVyX0NvZXJjZUV4KCkgbm93IGFsc28gaW52b2tlIHRoZSB0eXBlJ3MKICBjb2VyY2lvbiBpZiBib3RoIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIHR5cGUgYnV0IHRoaXMgdHlwZSBoYXMgdGhlCiAgQ0hFQ0tUWVBFUyBmbGFnIHNldC4gIFRoaXMgaXMgdG8gYmV0dGVyIHN1cHBvcnQgcHJveGllcy4KCi0gVGhlIHR5cGUgb2YgdHBfZnJlZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gImBgdm9pZCAoKikoUHlPYmplY3QgKilgYCIgdG8KICAiYGB2b2lkICgqKSh2b2lkICopYGAiLgoKLSBQeU9iamVjdF9EZWwsIFB5T2JqZWN0X0dDX0RlbCBhcmUgbm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KCi0gQSB0eXBlIGNhbiBub3cgaW5oZXJpdCBpdHMgbWV0YXR5cGUgZnJvbSBpdHMgYmFzZSB0eXBlLiAgUHJldmlvdXNseSwKICB3aGVuIFB5VHlwZV9SZWFkeSgpIHdhcyBjYWxsZWQsIGlmIG9iX3R5cGUgd2FzIGZvdW5kIHRvIGJlIE5VTEwsIGl0CiAgd2FzIGFsd2F5cyBzZXQgdG8gJlB5VHlwZV9UeXBlOyBub3cgaXQgaXMgc2V0IHRvIGJhc2UtPm9iX3R5cGUsCiAgd2hlcmUgYmFzZSBpcyB0cF9iYXNlLCBkZWZhdWx0aW5nIHRvICZQeU9iamVjdF9UeXBlLgoKLSBQeVR5cGVfUmVhZHkoKSBhY2NpZGVudGFsbHkgZGlkIG5vdCBpbmhlcml0IHRwX2lzX2djOyBub3cgaXQgZG9lcy4KCi0gVGhlIFB5Q29yZV8qIGZhbWlseSBvZiBBUElzIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBUaGUgInUjIiBwYXJzZXIgbWFya2VyIHdpbGwgbm93IHBhc3MgdGhyb3VnaCBVbmljb2RlIG9iamVjdHMgYXMtaXMKICB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIGJ1ZmZlciBBUEkuCgotIFRoZSBlbnVtZXJhdG9ycyBvZiBjbXBfb3AgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdXNlIHRoZSBwcmVmaXggYGBQeUNtcF9gYC4KCi0gQW4gb2xkICNkZWZpbmUgb2YgQU5ZIGFzIHZvaWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHB5cG9ydC5oLiAgVGhpcwogIGhhc24ndCBiZWVuIHVzZWQgc2luY2UgUHl0aG9uJ3MgcHJlLUFOU0kgZGF5cywgYW5kIHRoZSAjZGVmaW5lIGhhcwogIGJlZW4gbWFya2VkIGFzIG9ic29sZXRlIHNpbmNlIHRoZW4uICBTRiBidWcgNDk1NTQ4IHNheXMgaXQgY3JlYXRlZAogIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzLCBzbyBrZWVwaW5nIGl0IGFyb3VuZCB3YXNuJ3QgaGFybWxlc3MuCgotIEJlY2F1c2UgUHl0aG9uJ3MgbWFnaWMgbnVtYmVyIHNjaGVtZSBicm9rZSBvbiBKYW51YXJ5IDFzdCwgd2UgZGVjaWRlZAogIHRvIHN0b3AgUHl0aG9uIGRldmVsb3BtZW50LiAgVGhhbmtzIGZvciBhbGwgdGhlIGZpc2ghCgotIFNvbWUgb2YgdXMgZG9uJ3QgbGlrZSBmaXNoLCBzbyB3ZSBjaGFuZ2VkIFB5dGhvbidzIG1hZ2ljIG51bWJlcgogIHNjaGVtZSB0byBhIG5ldyBvbmUuIFNlZSBQeXRob24vaW1wb3J0LmMgZm9yIGRldGFpbHMuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gQXRoZU9TIGlzIG5vdyBzdXBwb3J0ZWQuCgotIHRoZSBFTVggcnVudGltZSBlbnZpcm9ubWVudCBvbiBPUy8yIGlzIG5vdyBzdXBwb3J0ZWQuCgotIEdOVS9IdXJkIGlzIG5vdyBzdXBwb3J0ZWQuCgpUZXN0cwotLS0tLQoKLSBUaGUgcmVncnRlc3QucHkgc2NyaXB0J3MgLXUgb3B0aW9uIG5vdyBwcm92aWRlcyBhIHdheSB0byBzYXkgImFsbG93CiAgYWxsIHJlc291cmNlcyBleGNlcHQgdGhpcyBvbmUuIiAgRm9yIGV4YW1wbGUsIHRvIGFsbG93IGV2ZXJ5dGhpbmcKICBleGNlcHQgYnNkZGIsIGdpdmUgdGhlIG9wdGlvbiAnLXVhbGwsLWJzZGRiJy4KCldpbmRvd3MKLS0tLS0tLQoKLSBUaGUgV2luZG93cyBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggdmVyc2lvbiA0LjAuMTQgb2YgdGhlCiAgU2xlZXB5Y2F0IEJlcmtlbGV5IGRhdGFiYXNlIGxpYnJhcnkuICBUaGlzIHNob3VsZCBiZSBhIGh1Z2UKICBpbXByb3ZlbWVudCBvdmVyIHRoZSBwcmV2aW91cyBCZXJrZWxleSBEQiAxLjg1LCB3aGljaCBoYWQgbWFueQogIGJ1Z3MuCiAgWFhYIFdoYXQgYXJlIHRoZSBsaWNlbnNpbmcgaXNzdWVzIGhlcmU/CiAgWFhYIElmIGEgdXNlciBoYXMgYSBkYXRhYmFzZSBjcmVhdGVkIHdpdGggYSBwcmV2aW91cyB2ZXJpb24gb2YKICBYWFggICAgIFB5dGhvbiwgd2hhdCBtdXN0IHRoZXkgZG8gdG8gY29udmVydCBpdD8KICBYWFggSSdtIHN0aWxsIG5vdCBzdXJlIGhvdyB0byBsaW5rIHRoaXMgdGhpbmcgKHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQpLgogIFhYWCBUaGUgdmVyc2lvbiAjIGlzIGxpa2VseSB0byBjaGFuZ2UgYmVmb3JlIDIuM2ExLgoKLSBUaGUgV2luZG93cyBkaXN0cmlidXRpb24gbm93IHNoaXBzIHdpdGggVGNsL1RrIHZlcnNpb24gOC40LjEgKGl0CiAgcHJldmlvdXNseSBzaGlwcGVkIHdpdGggVGNsL1RrIDguMy4yKS4KCi0gV2hlbiBQeXRob24gaXMgYnVpbHQgdW5kZXIgYSBNaWNyb3NvZnQgY29tcGlsZXIsIHN5cy52ZXJzaW9uIG5vdwogIGluY2x1ZGVzIHRoZSBjb21waWxlciB2ZXJzaW9uIG51bWJlciAoX01TQ19WRVIpLiAgRm9yIGV4YW1wbGUsIHVuZGVyCiAgTVNWQyA2LCBzeXMudmVyc2lvbiBjb25zdGFpbnMgdGhlIHN1YnN0cmluZyAiTVNDIHYuMTIwMCAiLiAgMTIwMCBpcwogIHRoZSB2YWx1ZSBvZiBfTVNDX1ZFUiB1bmRlciBNU1ZDIDYuCgotIFNvbWV0aW1lcyB0aGUgdW5pbnN0YWxsIGV4ZWN1dGFibGUgKFVOV0lTRS5FWEUpIHZhbmlzaGVzLiAgT25lIGNhdXNlCiAgb2YgdGhhdCBoYXMgYmVlbiBmaXhlZCBpbiB0aGUgaW5zdGFsbGVyIChkaXNhYmxlZCBXaXNlJ3MgImRlbGV0ZSBpbi0KICB1c2UgZmlsZXMiIHVuaW5zdGFsbCBvcHRpb24pLgoKLSBGaXhlZCBhIGJ1ZyBpbiB1cmxsaWIncyBwcm94eSBoYW5kbGluZyBpbiBXaW5kb3dzLiAgW1NGIGJ1ZyAjNTAzMDMxXQoKLSBUaGUgaW5zdGFsbGVyIG5vdyBpbnN0YWxscyBTdGFydCBtZW51IHNob3J0Y3V0cyB1bmRlciAodGhlIGxvY2FsCiAgZXF1aXZhbGVudCBvZikgIkFsbCBVc2VycyIgd2hlbiBkb2luZyBhbiBBZG1pbiBpbnN0YWxsLgoKLSBmaWxlLnRydW5jYXRlKFtuZXdzaXplXSkgbm93IHdvcmtzIG9uIFdpbmRvd3MgZm9yIGFsbCBuZXdzaXplIHZhbHVlcy4KICBJdCB1c2VkIHRvIGZhaWwgaWYgbmV3c2l6ZSBkaWRuJ3QgZml0IGluIDMyIGJpdHMsIHJlZmxlY3RpbmcgYQogIGxpbWl0YXRpb24gb2YgTVMgX2Noc2l6ZSAod2hpY2ggaXMgbm8gbG9uZ2VyIHVzZWQpLgoKLSBvcy53YWl0cGlkKCkgaXMgbm93IGltcGxlbWVudGVkIGZvciBXaW5kb3dzLCBhbmQgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICB1bnRpbCBhIHNwZWNpZmllZCBwcm9jZXNzIGV4aXRzLiAgVGhpcyBpcyBzaW1pbGFyIHRvLCBidXQgbm90IGV4YWN0bHkKICB0aGUgc2FtZSBhcywgb3Mud2FpdHBpZCgpIG9uIFBPU0lYIHN5c3RlbXMuICBJZiB5b3UncmUgd2FpdGluZyBmb3IKICBhIHNwZWNpZmljIHByb2Nlc3Mgd2hvc2UgcGlkIHdhcyBvYnRhaW5lZCBmcm9tIG9uZSBvZiB0aGUgc3Bhd24oKQogIGZ1bmN0aW9ucywgdGhlIHNhbWUgUHl0aG9uIG9zLndhaXRwaWQoKSBjb2RlIHdvcmtzIGFjcm9zcyBwbGF0Zm9ybXMuCiAgU2VlIHRoZSBkb2NzIGZvciBkZXRhaWxzLiAgVGhlIGRvY3Mgd2VyZSBjaGFuZ2VkIHRvIGNsYXJpZnkgdGhhdAogIHNwYXduIGZ1bmN0aW9ucyByZXR1cm4sIGFuZCB3YWl0cGlkIHJlcXVpcmVzLCBhIHByb2Nlc3MgaGFuZGxlIG9uCiAgV2luZG93cyAobm90IHRoZSBzYW1lIHRoaW5nIGFzIGEgV2luZG93cyBwcm9jZXNzIGlkKS4KCi0gTmV3IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUgaW1wbGVtZW50YXRpb24gZm9yIFdpbmRvd3M6ICB0aGlzIGRvZXNuJ3QKICBuZWVkIGEgVGVtcG9yYXJ5RmlsZVdyYXBwZXIgd3JhcHBlciBhbnltb3JlLCBhbmQgc2hvdWxkIGJlIGltbXVuZQogIHRvIGEgbmFzdHkgcHJvYmxlbTogIGJlZm9yZSAyLjMsIGlmIHlvdSBnb3QgYSB0ZW1wIGZpbGUgb24gV2luZG93cywgaXQKICBnb3Qgd3JhcHBlZCBpbiBhbiBvYmplY3Qgd2hvc2UgY2xvc2UoKSBtZXRob2QgZmlyc3QgY2xvc2VkIHRoZQogIHVuZGVybHlpbmcgZmlsZSwgdGhlbiBkZWxldGVkIHRoZSBmaWxlLiAgVGhpcyB1c3VhbGx5IHdvcmtlZCBmaW5lLgogIEhvd2V2ZXIsIHRoZSBzcGF3biBmYW1pbHkgb2YgZnVuY3Rpb25zIG9uIFdpbmRvd3MgY3JlYXRlIChhdCBhIGxvdyBDCiAgbGV2ZWwpIHRoZSBzYW1lIHNldCBvZiBvcGVuIGZpbGVzIGluIHRoZSBzcGF3bmVkIHByb2Nlc3MgUSBhcyB3ZXJlCiAgb3BlbiBpbiB0aGUgc3Bhd25pbmcgcHJvY2VzcyBQLiAgSWYgYSB0ZW1wIGZpbGUgZiB3YXMgYW1vbmcgdGhlbSwgdGhlbgogIGRvaW5nIGYuY2xvc2UoKSBpbiBQIGZpcnN0IGNsb3NlZCBQJ3MgQy1sZXZlbCBmaWxlIGhhbmRsZSBvbiBmLCBidXQgUSdzCiAgQy1sZXZlbCBmaWxlIGhhbmRsZSBvbiBmIHJlbWFpbmVkIG9wZW4sIHNvIHRoZSBhdHRlbXB0IGluIFAgdG8gZGVsZXRlIGYKICBibGV3IHVwIHdpdGggYSAiUGVybWlzc2lvbiBkZW5pZWQiIGVycm9yIChXaW5kb3dzIGRvZXNuJ3QgYWxsb3cKICBkZWxldGluZyBvcGVuIGZpbGVzKS4gIFRoaXMgd2FzIHN1cnByaXNpbmcsIHN1YnRsZSwgYW5kIGRpZmZpY3VsdCB0bwogIHdvcmsgYXJvdW5kLgoKLSBUaGUgb3MgbW9kdWxlIG5vdyBleHBvcnRzIGFsbCB0aGUgc3ltYm9saWMgY29uc3RhbnRzIHVzYWJsZSB3aXRoIHRoZQogIGxvdy1sZXZlbCBvcy5vcGVuKCkgb24gV2luZG93czogIHRoZSBuZXcgY29uc3RhbnRzIGluIDIuMyBhcmUKICBPX05PSU5IRVJJVCwgT19TSE9SVF9MSVZFRCwgT19URU1QT1JBUlksIE9fUkFORE9NIGFuZCBPX1NFUVVFTlRJQUwuCiAgVGhlIG90aGVycyB3ZXJlIGFsc28gYXZhaWxhYmxlIGluIDIuMjogIE9fQVBQRU5ELCBPX0JJTkFSWSwgT19DUkVBVCwKICBPX0VYQ0wsIE9fUkRPTkxZLCBPX1JEV1IsIE9fVEVYVCwgT19UUlVOQyBhbmQgT19XUk9OTFkuICBDb250cmFyeQogIHRvIE1pY3Jvc29mdCBkb2NzLCBPX1NIT1JUX0xJVkVEIGRvZXMgbm90IHNlZW0gdG8gaW1wbHkgT19URU1QT1JBUlkKICAoc28gc3BlY2lmeSBib3RoIGlmIHlvdSB3YW50IGJvdGg7IG5vdGUgdGhhdCBuZWl0aGVyIGlzIHVzZWZ1bCB1bmxlc3MKICBzcGVjaWZpZWQgd2l0aCBPX0NSRUFUIHRvbykuCgpNYWMKLS0tLQoKWWV0IHRvIGJlIHdyaXR0ZW4uCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yIGZpbmFsPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoqUmVsZWFzZSBkYXRlOiAyMS1EZWMtMjAwMSoKClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIHBpY2tsZS5weSwgY1BpY2tsZTogYWxsb3cgcGlja2xpbmcgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzCiAgd2l0aCBhIGN1c3RvbSBtZXRhY2xhc3MuCgpDb3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLQoKLSB3ZWFrcmVmIHByb3h5IG9iamVjdDogd2hlbiBjb21wYXJpbmcsIHVud3JhcCBib3RoIGFyZ3VtZW50cyBpZiBib3RoCiAgYXJlIHByb3hpZXMuCgpFeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLQoKLSBiaW5hc2NpaS5iMmFfYmFzZTY0KCk6IGZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcnJ1biB3aGVuIGVuY29kaW5nCiAgdmVyeSBzaG9ydCBzdHJpbmdzLgoKLSBjUGlja2xlOiB0aGUgb2JzY3VyZSAiZmFzdCIgbW9kZSB3YXMgc3VzcGVjdGVkIG9mIGNhdXNpbmcgc3RhY2sKICBvdmVyZmxvd3Mgb24gdGhlIE1hYy4gIEhvcGVmdWxseSBmaXhlZCB0aGlzIGJ5IHNldHRpbmcgdGhlIHJlY3Vyc2lvbgogIGxpbWl0IG11Y2ggc21hbGxlci4gIElmIHRoZSBsaW1pdCBpcyB0b28gbG93IChpdCBvbmx5IGFmZmVjdHMKICBwZXJmb3JtYW5jZSksIHlvdSBjYW4gY2hhbmdlIGl0IGJ5IGRlZmluaW5nIFBZX0NQSUNLTEVfRkFTVF9MSU1JVAogIHdoZW4gY29tcGlsaW5nIGNQaWNrbGUuYyAob3IgaW4gcHljb25maWcuaCkuCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gZHVtYmRibS5weTogZml4ZWQgYSBkdW1iIG9sZCBidWcgKHRoZSBmaWxlIGRpZG4ndCBnZXQgc3luY2hlZCBhdAogIGNsb3NlIG9yIGRlbGV0ZSB0aW1lKS4KCi0gcmZjODIyLnB5OiBmaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgYWRkcmVzcyAnPD4nIHdhcyBjb252ZXJ0ZWQgdG8gTm9uZQogIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nIChhbHNvIGZpeGVzIHRoZSBlbWFpbC5VdGlscyBtb2R1bGUpLgoKLSB4bWxycGNsaWIucHk6IHZlcnNpb24gMS4wLjA7IHVzZXMgcHJlY2lzaW9uIGZvciBkb3VibGVzLgoKLSB0ZXN0IHN1aXRlOiB0aGUgcGlja2xlIGFuZCBjUGlja2xlIHRlc3RzIHdlcmUgbm90IGV4ZWN1dGluZyBhbnkgY29kZQogIHdoZW4gcnVuIGZyb20gdGhlIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGVzdC4KClRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tCgpCdWlsZAotLS0tLQoKQyBBUEkKLS0tLS0KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKVGVzdHMKLS0tLS0KCldpbmRvd3MKLS0tLS0tLQoKLSBkaXN0dXRpbHMgcGFja2FnZTogZml4ZWQgYnJva2VuIFdpbmRvd3MgaW5zdGFsbGVycyAoYmRpc3Rfd2luaW5zdCkuCgotIHRlbXBmaWxlLnB5OiBwcmV2ZW50IG15c3RlcmlvdXMgd2FybmluZ3Mgd2hlbiBUZW1wb3JhcnlGaWxlV3JhcHBlcgogIGluc3RhbmNlcyBhcmUgZGVsZXRlZCBhdCBwcm9jZXNzIGV4aXQgdGltZS4KCi0gc29ja2V0LnB5OiBwcmV2ZW50IG15c3RlcmlvdXMgd2FybmluZ3Mgd2hlbiBzb2NrZXQgaW5zdGFuY2VzIGFyZQogIGRlbGV0ZWQgYXQgcHJvY2VzcyBleGl0IHRpbWUuCgotIHBvc2l4bW9kdWxlLmM6IGZpeCBhIFdpbmRvd3MgY3Jhc2ggd2l0aCBzdGF0KCkgb2YgYSBmaWxlbmFtZSBlbmRpbmcKICBpbiBiYWNrc2xhc2guCgpNYWMKLS0tLQoKLSBUaGUgQ2FyYm9uIHRvb2xib3ggbW9kdWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gVW5pdmVyc2FsIEhlYWRlcnMKICAzLjQsIGFuZCBleHBlcmltZW50YWwgQ29yZUdyYXBoaWNzIGFuZCBDYXJib25FdmVudHMgbW9kdWxlcyBoYXZlCiAgYmVlbiBhZGRlZC4gIEFsbCBvbmx5IGZvciBmcmFtZXdvcmstZW5hYmxlZCBNYWNPU1guCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYzE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMTQtRGVjLTIwMDEqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBHdWlkbydzIHR1dG9yaWFsIGludHJvZHVjdGlvbiB0byB0aGUgbmV3IHR5cGUvY2xhc3MgZmVhdHVyZXMgaGFzCiAgYmVlbiBleHRlbnNpdmVseSB1cGRhdGVkLiAgU2VlCgogICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yL2Rlc2NyaW50cm8uaHRtbAoKICBUaGF0IHJlbWFpbnMgdGhlIHByaW1hcnkgZG9jdW1lbnRhdGlvbiBpbiB0aGlzIGFyZWEuCgotIEZpeGVkIGEgbGVhazogaW5zdGFuY2UgdmFyaWFibGVzIGRlY2xhcmVkIHdpdGggX19zbG90c19fIHdlcmUgbmV2ZXIKICBkZWxldGVkIQoKLSBUaGUgImRlbGV0ZSBhdHRyaWJ1dGUiIG1ldGhvZCBvZiBkZXNjcmlwdG9yIG9iamVjdHMgaXMgY2FsbGVkCiAgX19kZWxldGVfXywgbm90IF9fZGVsX18uICBJbiBwcmV2aW91cyByZWxlYXNlcywgaXQgd2FzIG1pc3Rha2VubHkKICBjYWxsZWQgX19kZWxfXywgd2hpY2ggY3JlYXRlZCBhbiB1bmZvcnR1bmF0ZSBvdmVybG9hZGluZyBjb25kaXRpb24KICB3aXRoIGZpbmFsaXplcnMuICAoVGhlICJnZXQgYXR0cmlidXRlIiBhbmQgInNldCBhdHRyaWJ1dGUiIG1ldGhvZHMKICBhcmUgc3RpbGwgY2FsbGVkIF9fZ2V0X18gYW5kIF9fc2V0X18sIHJlc3BlY3RpdmVseS4pCgotIFNvbWUgc3VidGxlIGlzc3VlcyB3aXRoIHRoZSBzdXBlciBidWlsdC1pbiB3ZXJlIGZpeGVkOgoKICAoYSkgV2hlbiBzdXBlciBpdHNlbGYgaXMgc3ViY2xhc3NlZCwgaXRzIF9fZ2V0X18gbWV0aG9kIHdvdWxkIHN0aWxsCiAgICAgIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgYmFzZSBjbGFzcyAoaS5lLiwgb2Ygc3VwZXIpLgoKICAoYikgc3VwZXIoQywgQygpKS5fX2NsYXNzX18gd291bGQgcmV0dXJuIEMgcmF0aGVyIHRoYW4gc3VwZXIuICBUaGlzCiAgICAgIGlzIGNvbmZ1c2luZy4gIFRvIGZpeCB0aGlzLCBJIGRlY2lkZWQgdG8gY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YKICAgICAgc3VwZXIgc28gdGhhdCBpdCBvbmx5IGFwcGxpZXMgdG8gY29kZSBhdHRyaWJ1dGVzLCBub3QgdG8gZGF0YQogICAgICBhdHRyaWJ1dGVzLiAgQWZ0ZXIgYWxsLCBvdmVycmlkaW5nIGRhdGEgYXR0cmlidXRlcyBpcyBub3QKICAgICAgc3VwcG9ydGVkIGFueXdheS4KCiAgKGMpIFRoZSBfX2dldF9fIG1ldGhvZCBkaWRuJ3QgY2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgd2FzIGFuCiAgICAgIGluc3RhbmNlIG9mIHRoZSB0eXBlIHVzZWQgaW4gY3JlYXRpb24gb2YgdGhlIHN1cGVyIGluc3RhbmNlLgoKLSBQcmV2aW91c2x5LCBoYXNoKCkgb2YgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBhIG11dGFibGUgdHlwZQogIChsaXN0IG9yIGRpY3Rpb25hcnkpIHdvdWxkIHJldHVybiBzb21lIHZhbHVlLCByYXRoZXIgdGhhbiByYWlzaW5nCiAgVHlwZUVycm9yLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4gIEFsc28sIGRpcmVjdGx5IGNhbGxpbmcKICBkaWN0Ll9faGFzaF9fIGFuZCBsaXN0Ll9faGFzaF9fIG5vdyByYWlzZXMgdGhlIHNhbWUgVHlwZUVycm9yCiAgKHByZXZpb3VzbHksIHRoZXNlIHdlcmUgdGhlIHNhbWUgYXMgb2JqZWN0Ll9faGFzaF9fKS4KCi0gTmV3LXN0eWxlIG9iamVjdHMgbm93IHN1cHBvcnQgZGVsZXRpbmcgdGhlaXIgX19kaWN0X18uICBUaGlzIGlzIGZvcgogIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyBlcXVpdmFsZW50IHRvIGFzc2lnbmluZyBhIGJyYW5kIG5ldyBlbXB0eQogIGRpY3Rpb25hcnksIGJ1dCBzYXZlcyBzcGFjZSBpZiB0aGUgb2JqZWN0IGlzIG5vdCB1c2VkIGZ1cnRoZXIuCgpDb3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLQoKLSAtUW5ldyBub3cgd29ya3MgYXMgZG9jdW1lbnRlZCBpbiBQRVAgMjM4OiAgd2hlbiAtUW5ldyBpcyBwYXNzZWQgb24KICB0aGUgY29tbWFuZCBsaW5lLCBhbGwgb2NjdXJyZW5jZXMgb2YgIi8iIHVzZSB0cnVlIGRpdmlzaW9uIGluc3RlYWQKICBvZiBjbGFzc2ljIGRpdmlzaW9uLiAgU2VlIHRoZSBQRVAgZm9yIGRldGFpbHMuICBOb3RlIHRoYXQgImFsbCIKICBtZWFucyBhbGwgaW5zdGFuY2VzIGluIGxpYnJhcnkgYW5kIDNyZC1wYXJ0eSBtb2R1bGVzLCBhcyB3ZWxsIGFzIGluCiAgeW91ciBvd24gY29kZS4gIEFzIHRoZSBQRVAgc2F5cywgLVFuZXcgaXMgaW50ZW5kZWQgZm9yIHVzZSBvbmx5IGluCiAgZWR1Y2F0aW9uYWwgZW52aXJvbm1lbnRzIHdpdGggY29udHJvbCBvdmVyIHRoZSBsaWJyYXJpZXMgaW4gdXNlLgogIE5vdGUgdGhhdCB0ZXN0X2NvZXJjaW9uLnB5IGluIHRoZSBzdGFuZGFyZCBQeXRob24gdGVzdCBzdWl0ZSBmYWlscwogIHVuZGVyIC1RbmV3OyB0aGlzIGlzIGV4cGVjdGVkLCBhbmQgd29uJ3QgYmUgcmVwYWlyZWQgdW50aWwgdHJ1ZQogIGRpdmlzaW9uIGJlY29tZXMgdGhlIGRlZmF1bHQgKGluIHRoZSBtZWFudGltZSwgdGVzdF9jb2VyY2lvbiBpcwogIHRlc3RpbmcgdGhlIGN1cnJlbnQgcnVsZXMpLgoKLSBjb21wbGV4KCkgbm93IG9ubHkgYWxsb3dzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhIHN0cmluZwogIGFyZ3VtZW50LCBhbmQgcmFpc2VzIFR5cGVFcnJvciBpZiBlaXRoZXIgdGhlIHNlY29uZCBhcmcgaXMgYSBzdHJpbmcKICBvciBpZiB0aGUgc2Vjb25kIGFyZyBpcyBzcGVjaWZpZWQgd2hlbiB0aGUgZmlyc3QgaXMgYSBzdHJpbmcuCgpFeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLQoKLSBnYy5nZXRfcmVmZXJlbnRzIHdhcyByZW5hbWVkIHRvIGdjLmdldF9yZWZlcnJlcnMuCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gRnVuY3Rpb25zIGluIHRoZSBvcy5zcGF3bigpIGZhbWlseSBub3cgcmVsZWFzZSB0aGUgZ2xvYmFsIGludGVycHJldGVyCiAgbG9jayBhcm91bmQgY2FsbGluZyB0aGUgcGxhdGZvcm0gc3Bhd24uICBUaGV5IHNob3VsZCBhbHdheXMgaGF2ZSBkb25lCiAgdGhpcywgYnV0IGRpZCBub3QgYmVmb3JlIDIuMmMxLiAgTXVsdGl0aHJlYWRlZCBwcm9ncmFtcyBjYWxsaW5nCiAgYW4gb3Muc3Bhd24gZnVuY3Rpb24gd2l0aCBQX1dBSVQgd2lsbCBubyBsb25nZXIgYmxvY2sgYWxsIFB5dGhvbiB0aHJlYWRzCiAgdW50aWwgdGhlIHNwYXduZWQgcHJvZ3JhbSBjb21wbGV0ZXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwcm9ncmFtcwogIHJlbGllcyBvbiBibG9ja2luZywgYWx0aG91Z2ggbW9yZSBsaWtlbHkgYnkgYWNjaWRlbnQgdGhhbiBieSBkZXNpZ24uCgotIHdlYmJyb3dzZXIgZGVmYXVsdHMgdG8gbmV0c2NhcGUuZXhlIG9uIE9TLzIgbm93LgoKLSBUaXguUmVzaXplSGFuZGxlIGV4cG9zZXMgZGV0YWNoX3dpZGdldCwgaGlkZSwgYW5kIHNob3cuCgotIFRoZSBjaGFyc2V0IGFsaWFzIHdpbmRvd3NfMTI1MiBoYXMgYmVlbiBhZGRlZC4KCi0gdHlwZXMuU3RyaW5nVHlwZXMgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBkZWZpbmVkIHN0cmluZyB0eXBlczsKICB1c3VhbGx5IHRoaXMgd2lsbCBiZSAoc3RyLCB1bmljb2RlKSwgYnV0IGlmIFB5dGhvbiB3YXMgY29tcGlsZWQKICB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCBpdCB3aWxsIGJlIGp1c3QgKHN0ciwpLgoKLSBUaGUgcHVsbGRvbSBhbmQgbWluaWRvbSBtb2R1bGVzIHdlcmUgc3luY2hyb25pemVkIHRvIFB5WE1MLgoKVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0KCi0gQSBuZXcgc2NyaXB0IGNhbGxlZCBUb29scy9zY3JpcHRzL2dvb2dsZS5weSB3YXMgYWRkZWQsIHdoaWNoIGZpcmVzCiAgb2ZmIGEgc2VhcmNoIG9uIEdvb2dsZS4KCkJ1aWxkCi0tLS0tCgotIE5vdGUgdGhhdCByZWxlYXNlIGJ1aWxkcyBvZiBQeXRob24gc2hvdWxkIGFycmFuZ2UgdG8gZGVmaW5lIHRoZQogIHByZXByb2Nlc3NvciBzeW1ib2wgTkRFQlVHIG9uIHRoZSBjb21tYW5kIGxpbmUgKG9yIGVxdWl2YWxlbnQpLgogIEluIHRoZSAyLjIgcHJlLXJlbGVhc2Ugc2VyaWVzIHdlIHRyaWVkIHRvIGRlZmluZSB0aGlzIGJ5IG1hZ2ljIGluCiAgUHl0aG9uLmggaW5zdGVhZCwgYnV0IGl0IHByb3ZlZCB0byBjYXVzZSBwcm9ibGVtcyBmb3IgZXh0ZW5zaW9uCiAgYXV0aG9ycy4gIFRoZSBVbml4LCBXaW5kb3dzIGFuZCBNYWMgYnVpbGRzIG5vdyBhbGwgZGVmaW5lIE5ERUJVRyBpbgogIHJlbGVhc2UgYnVpbGRzIHZpYSBjbWRsaW5lIChvciBlcXVpdmFsZW50KSBpbnN0ZWFkLiAgUG9ydHMgdG8KICBvdGhlciBwbGF0Zm9ybXMgc2hvdWxkIGRvIGxpa2V3aXNlLgoKLSBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHVzZSAtLXdpdGgtc3VmZml4IHdoZW4gYnVpbGRpbmcgb24gYQogIGNhc2UtaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0gKHN1Y2ggYXMgTWFjIE9TIFggSEZTKykuIEluIHRoZSBidWlsZAogIGRpcmVjdG9yeSBhbiBleHRlbnNpb24gaXMgdXNlZCwgYnV0IG5vdCBpbiB0aGUgaW5zdGFsbGVkIHB5dGhvbi4KCkMgQVBJCi0tLS0tCgotIE5ldyBmdW5jdGlvbiBQeURpY3RfTWVyZ2VGcm9tU2VxMigpIGV4cG9zZXMgdGhlIGJ1aWx0aW4gZGljdAogIGNvbnN0cnVjdG9yJ3MgbG9naWMgZm9yIHVwZGF0aW5nIGEgZGljdGlvbmFyeSBmcm9tIGFuIGl0ZXJhYmxlIG9iamVjdAogIHByb2R1Y2luZyBrZXktdmFsdWUgcGFpcnMuCgotIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIHJlcXVpcmVzIHRoYXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCiAgdGhlIGtleXdvcmQgbGlzdCBlcXVhbCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHNwZWNpZmllcnMuICBUaGlzCiAgd2Fzbid0IGNoZWNrZWQgY29ycmVjdGx5LCBhbmQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGNvdWxkIGV2ZW4KICBkdW1wIGNvcmUgaW4gc29tZSBiYWQgY2FzZXMuICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLiAgQXMgYSByZXN1bHQsCiAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIG1heSByYWlzZSBSdW50aW1lRXJyb3IgaW4gYmFkIGNhc2VzIHRoYXQKICBwcmV2aW91c2x5IHdlbnQgdW5jaGFsbGVuZ2VkLgoKTmV3IHBsYXRmb3JtcwotLS0tLS0tLS0tLS0tCgpUZXN0cwotLS0tLQoKV2luZG93cwotLS0tLS0tCgpNYWMKLS0tLQoKLSBJbiB1bml4LVB5dGhvbiBvbiBNYWMgT1MgWCAoYW5kIGRhcndpbikgc3lzLnBsYXRmb3JtIGlzIG5vdyAiZGFyd2luIiwKICB3aXRob3V0IGFueSB0cmFpbGluZyBkaWdpdHMuCgotIENoYW5nZWQgbG9naWMgZm9yIGZpbmRpbmcgcHl0aG9uIGhvbWUgaW4gTWFjIE9TIFggZnJhbWV3b3JrIFB5dGhvbnMuCiAgTm93IHN5cy5leGVjdXRhYmxlIHBvaW50cyB0byB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgaW4gc3RlYWQgb2YgdG8KICB0aGUgc2hhcmVkIGxpYnJhcnkuIFRoZSBsYXR0ZXIgaXMgdXNlZCBvbmx5IGZvciBsb2NhdGluZyB0aGUgcHl0aG9uCiAgaG9tZS4KCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJiMj8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoqUmVsZWFzZSBkYXRlOiAxNi1Ob3YtMjAwMSoKClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIE11bHRpcGxlIGluaGVyaXRhbmNlIG1peGluZyBuZXctc3R5bGUgYW5kIGNsYXNzaWMgY2xhc3NlcyBpbiB0aGUKICBsaXN0IG9mIGJhc2UgY2xhc3NlcyBpcyBub3cgYWxsb3dlZCwgc28gdGhpcyB3b3JrcyBub3c6CgogICAgICBjbGFzcyBDbGFzc2ljOiBwYXNzCiAgICAgIGNsYXNzIE1peGVkKENsYXNzaWMsIG9iamVjdCk6IHBhc3MKCiAgVGhlIE1STyAobWV0aG9kIHJlc29sdXRpb24gb3JkZXIpIGZvciBlYWNoIGJhc2UgY2xhc3MgaXMgcmVzcGVjdGVkCiAgYWNjb3JkaW5nIHRvIGl0cyBraW5kLCBidXQgdGhlIE1STyBmb3IgdGhlIGRlcml2ZWQgY2xhc3MgaXMgY29tcHV0ZWQKICB1c2luZyBuZXctc3R5bGUgTVJPIHJ1bGVzIGlmIGFueSBiYXNlIGNsYXNzIGlzIGEgbmV3LXN0eWxlIGNsYXNzLgogIFRoaXMgbmVlZHMgdG8gYmUgZG9jdW1lbnRlZC4KCi0gVGhlIG5ldyBidWlsdGluIGRpY3Rpb25hcnkoKSBjb25zdHJ1Y3RvciwgYW5kIGRpY3Rpb25hcnkgdHlwZSwgaGF2ZQogIGJlZW4gcmVuYW1lZCB0byBkaWN0LiAgVGhpcyByZWZsZWN0cyBhIGRlY2FkZSBvZiBjb21tb24gdXNhZ2UuCgotIGRpY3QoKSBub3cgYWNjZXB0cyBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIDItc2VxdWVuY2VzLiAgRm9yCiAgZXhhbXBsZSwgZGljdChkLml0ZW1zKCkpID09IGQgZm9yIGFueSBkaWN0aW9uYXJ5IGQuICBUaGUgYXJndW1lbnQsCiAgYW5kIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJndW1lbnQsIGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0cy4KCi0gTmV3LXN0eWxlIGNsYXNzZXMgY2FuIG5vdyBoYXZlIGEgX19kZWxfXyBtZXRob2QsIHdoaWNoIGlzIGNhbGxlZAogIHdoZW4gdGhlIGluc3RhbmNlIGlzIGRlbGV0ZWQgKGp1c3QgbGlrZSBmb3IgY2xhc3NpYyBjbGFzc2VzKS4KCi0gQXNzaWdubWVudCB0byBvYmplY3QuX19kaWN0X18gaXMgbm93IHBvc3NpYmxlLCBmb3Igb2JqZWN0cyB0aGF0IGFyZQogIGluc3RhbmNlcyBvZiBuZXctc3R5bGUgY2xhc3NlcyB0aGF0IGhhdmUgYSBfX2RpY3RfXyAodW5sZXNzIHRoZSBiYXNlCiAgY2xhc3MgZm9yYmlkcyBpdCkuCgotIE1ldGhvZHMgb2YgYnVpbHQtaW4gdHlwZXMgbm93IHByb3Blcmx5IGNoZWNrIGZvciBrZXl3b3JkIGFyZ3VtZW50cwogIChmb3JtZXJseSB0aGVzZSB3ZXJlIHNpbGVudGx5IGlnbm9yZWQpLiAgVGhlIG9ubHkgYnVpbHQtaW4gbWV0aG9kcwogIHRoYXQgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgX19jYWxsX18sIF9faW5pdF9fIGFuZCBfX25ld19fLgoKLSBUaGUgc29ja2V0IGZ1bmN0aW9uIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBhIHR5cGU7IHNlZSBiZWxvdy4KCkNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tCgotIEFzc2lnbm1lbnQgdG8gX19kZWJ1Z19fIHJhaXNlcyBTeW50YXhFcnJvciBhdCBjb21waWxlLXRpbWUuICBUaGlzCiAgd2FzIHByb21pc2VkIHdoZW4gMi4xYzEgd2FzIHJlbGVhc2VkIGFzICJXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjFjMSIKICAoc2VlIGJlbG93KSBzYXlzLgoKLSBDbGFyaWZpZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBvcGVyYW5kcyB0byBhbiBvcGVyYXRvcgogIChsaWtlIDEgKyAnJykuCgpFeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLQoKLSBtbWFwIGhhcyBhIG5ldyBrZXl3b3JkIGFyZ3VtZW50LCAiYWNjZXNzIiwgYWxsb3dpbmcgYSB1bmlmb3JtIHdheSBmb3IKICBib3RoIFdpbmRvd3MgYW5kIFVuaXggdXNlcnMgdG8gY3JlYXRlIHJlYWQtb25seSwgd3JpdGUtdGhyb3VnaCBhbmQKICBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXBwaW5ncy4gIFRoaXMgd2FzIHByZXZpb3VzbHkgcG9zc2libGUgb25seSBvbgogIFVuaXguICBBIG5ldyBrZXl3b3JkIGFyZ3VtZW50IHdhcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMgaW4gYQogIHVuaWZvcm0gd2F5IGJlY2F1c2UgdGhlIG1tYXAoKSBzaWduYXR1cmVzIGhhZCBkaXZlcmdlZCBhY3Jvc3MKICBwbGF0Zm9ybXMuICBUaGFua3MgdG8gSmF5IFQgTWlsbGVyIGZvciByZXBhaXJpbmcgdGhpcyEKCi0gQnkgZGVmYXVsdCwgdGhlIGdjLmdhcmJhZ2UgbGlzdCBub3cgY29udGFpbnMgb25seSB0aG9zZSBpbnN0YW5jZXMgaW4KICB1bnJlYWNoYWJsZSBjeWNsZXMgdGhhdCBoYXZlIF9fZGVsX18gbWV0aG9kczsgaW4gMi4xIGl0IGNvbnRhaW5lZCBhbGwKICBpbnN0YW5jZXMgaW4gdW5yZWFjaGFibGUgY3ljbGVzLiAgIkluc3RhbmNlcyIgaGVyZSBoYXMgYmVlbiBnZW5lcmFsaXplZAogIHRvIGluY2x1ZGUgaW5zdGFuY2VzIG9mIGJvdGggbmV3LXN0eWxlIGFuZCBvbGQtc3R5bGUgY2xhc3Nlcy4KCi0gVGhlIHNvY2tldCBtb2R1bGUgZGVmaW5lcyBhIG5ldyBtZXRob2QgZm9yIHNvY2tldCBvYmplY3RzLAogIHNlbmRhbGwoKS4gIFRoaXMgaXMgbGlrZSBzZW5kKCkgYnV0IG1heSBtYWtlIG11bHRpcGxlIGNhbGxzIHRvCiAgc2VuZCgpIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQuICBBbHNvLCB0aGUgc29ja2V0IGZ1bmN0aW9uIGhhcwogIGJlZW4gY29udmVydGVkIHRvIGEgc3ViY2xhc3NhYmxlIHR5cGUsIGxpa2UgbGlzdCBhbmQgdHVwbGUgKGV0Yy4pCiAgYmVmb3JlIGl0OyBzb2NrZXQgYW5kIFNvY2tldFR5cGUgYXJlIG5vdyB0aGUgc2FtZSB0aGluZy4KCi0gVmFyaW91cyBidWdmaXhlcyB0byB0aGUgY3Vyc2VzIG1vZHVsZS4gIFRoZXJlIGlzIG5vdyBhIHRlc3Qgc3VpdGUKICBmb3IgdGhlIGN1cnNlcyBtb2R1bGUgKHlvdSBoYXZlIHRvIHJ1biBpdCBtYW51YWxseSkuCgotIGJpbmFzY2lpLmIyYV9iYXNlNjQgbm8gbG9uZ2VyIHBsYWNlcyBhbiBhcmJpdHJhcnkgcmVzdHJpY3Rpb24gb2YgNTcKICBieXRlcyBvbiBpdHMgaW5wdXQuCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gdGtGaWxlRGlhbG9nIGV4cG9zZXMgYSBEaXJlY3RvcnkgY2xhc3MgYW5kIGFza2RpcmVjdG9yeQogIGNvbnZlbmllbmNlIGZ1bmN0aW9uLgoKLSBTeW1ib2xpYyBncm91cCBuYW1lcyBpbiByZWd1bGFyIGV4cHJlc3Npb25zIG11c3QgYmUgdW5pcXVlLiAgRm9yCiAgZXhhbXBsZSwgdGhlIHJlZ2V4cCByJyg/UDxhYmM+KSg/UDxhYmM+KScgaXMgbm90IGFsbG93ZWQsIGJlY2F1c2UgYQogIHNpbmdsZSBuYW1lIGNhbid0IG1lYW4gYm90aCAiZ3JvdXAgMSIgYW5kICJncm91cCAyIiBzaW11bHRhbmVvdXNseS4KICBQeXRob24gMi4yIGRldGVjdHMgdGhpcyBlcnJvciBhdCByZWdleHAgY29tcGlsYXRpb24gdGltZTsKICBwcmV2aW91c2x5LCB0aGUgZXJyb3Igd2VudCB1bmRldGVjdGVkLCBhbmQgcmVzdWx0cyB3ZXJlCiAgdW5wcmVkaWN0YWJsZS4gIEFsc28gaW4gc3JlLCB0aGUgcGF0dGVybi5zcGxpdCgpLCBwYXR0ZXJuLnN1YigpLCBhbmQKICBwYXR0ZXJuLnN1Ym4oKSBtZXRob2RzIGhhdmUgYmVlbiByZXdyaXR0ZW4gaW4gQy4gIEFsc28sIGFuCiAgZXhwZXJpbWVudGFsIGZ1bmN0aW9uL21ldGhvZCBmaW5kaXRlcigpIGhhcyBiZWVuIGFkZGVkLCB3aGljaCB3b3JrcwogIGxpa2UgZmluZGFsbCgpIGJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLgoKLSBUaXggZXhwb3NlcyBtb3JlIGNvbW1hbmRzIHRocm91Z2ggdGhlIGNsYXNzZXMgRGlyU2VsZWN0Qm94LAogIERpclNlbGVjdERpYWxvZywgTGlzdE5vdGVCb29rLCBNZXRlciwgQ2hlY2tMaXN0LCBhbmQgdGhlCiAgbWV0aG9kcyB0aXhfYWRkYml0bWFwZGlyLCB0aXhfY2dldCwgdGl4X2NvbmZpZ3VyZSwgdGl4X2ZpbGVkaWFsb2csCiAgdGl4X2dldGJpdG1hcCwgdGl4X2dldGltYWdlLCB0aXhfb3B0aW9uX2dldCwgYW5kIHRpeF9yZXNldG9wdGlvbnMuCgotIFRyYWNlYmFjayBvYmplY3RzIGFyZSBub3cgc2Nhbm5lZCBieSBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0aW9uLCBzbwogIGN5Y2xlcyBjcmVhdGVkIGJ5IGNhc3VhbCB1c2Ugb2Ygc3lzLmV4Y19pbmZvKCkgbm8gbG9uZ2VyIGNhdXNlCiAgcGVybWFuZW50IG1lbW9yeSBsZWFrcyAocHJvdmlkZWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGVuYWJsZWQpLgoKLSBvcy5leHRzZXAgLS0gYSBuZXcgdmFyaWFibGUgbmVlZGVkIGJ5IHRoZSBSSVNDT1Mgc3VwcG9ydC4gIEl0IGlzIHRoZQogIHNlcGFyYXRvciB1c2VkIGJ5IGV4dGVuc2lvbnMsIGFuZCBpcyAnLicgb24gYWxsIHBsYXRmb3JtcyBleGNlcHQKICBSSVNDT1MsIHdoZXJlIGl0IGlzICcvJy4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoaXMgdmFyaWFibGUKICB1bmxlc3MgeW91IGhhdmUgYSBtYXNvY2hpc3RpYyBkZXNpcmUgdG8gcG9ydCB5b3VyIGNvZGUgdG8gUklTQ09TLgoKLSBtaW1ldHlwZXMucHkgaGFzIG9wdGlvbmFsIHN1cHBvcnQgZm9yIG5vbi1zdGFuZGFyZCwgYnV0IGNvbW1vbmx5CiAgZm91bmQgdHlwZXMuICBndWVzc190eXBlKCkgYW5kIGd1ZXNzX2V4dGVuc2lvbigpIG5vdyBhY2NlcHQgYW4KICBvcHRpb25hbCAnc3RyaWN0JyBmbGFnLCBkZWZhdWx0aW5nIHRvIHRydWUsIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIKICByZWNvZ25pemUgbm9uLXN0YW5kYXJkIHR5cGVzIG9yIG5vdC4gIEEgZmV3IG5vbi1zdGFuZGFyZCB0eXBlcyB3ZQogIGtub3cgYWJvdXQgaGF2ZSBiZWVuIGFkZGVkLiAgQWxzbywgd2hlbiBydW4gYXMgYSBzY3JpcHQsIHRoZXJlIGFyZQogIG5ldyAtbCBhbmQgLWUgb3B0aW9ucy4KCi0gc3RhdGNhY2hlIGlzIG5vdyBkZXByZWNhdGVkLgoKLSBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKCkgbm93IHByb2R1Y2VzIHRoZSBwcmVmZXJyZWQgUkZDIDI4MjIgc3R5bGUKICBkYXRlcyB3aXRoIG51bWVyaWMgdGltZXpvbmVzIChpdCB1c2VkIHRvIHByb2R1Y2Ugb2Jzb2xldGUgZGF0ZXMKICBoYXJkIGNvZGVkIHRvICJHTVQiIHRpbWV6b25lKS4gIEFuIG9wdGlvbmFsICdsb2NhbHRpbWUnIGZsYWcgaXMKICBhZGRlZCB0byBwcm9kdWNlIGRhdGVzIGluIHRoZSBsb2NhbCB0aW1lem9uZSwgd2l0aCBkYXlsaWdodCBzYXZpbmdzCiAgdGltZSBwcm9wZXJseSB0YWtlbiBpbnRvIGFjY291bnQuCgotIEluIHBpY2tsZSBhbmQgY1BpY2tsZSwgaW5zdGVhZCBvZiBtYXNraW5nIGVycm9ycyBpbiBsb2FkKCkgYnkKICB0cmFuc2Zvcm1pbmcgdGhlbSBpbnRvIFN5c3RlbUVycm9yLCB3ZSBsZXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbgogIHByb3BhZ2F0ZSBvdXQuICBBbHNvLCBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18KICBpbiBwaWNrbGUsIGFzIGl0IGFscmVhZHkgd2FzIHN1cHBvcnRlZCBpbiBjUGlja2xlLgoKVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0KCkJ1aWxkCi0tLS0tCgotIFRoZSBkYm0gbW9kdWxlIGlzIGJ1aWx0IHVzaW5nIGxpYmRiMSBpZiBhdmFpbGFibGUuICBUaGUgYnNkZGIgbW9kdWxlCiAgaXMgYnVpbHQgd2l0aCBsaWJkYjMgaWYgYXZhaWxhYmxlLgoKLSBNaXNjL01ha2VmaWxlLnByZS5pbiBoYXMgYmVlbiByZW1vdmVkIGJ5IEJERkwgcHJvbm91bmNlbWVudC4KCkMgQVBJCi0tLS0tCgotIE5ldyBmdW5jdGlvbiBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoKSByZXR1cm5zIHRoZSBzaXplIG9mIGEgbm9uLQogIE5VTEwgcmVzdWx0IGZyb20gUHlTZXF1ZW5jZV9GYXN0KCksIG1vcmUgcXVpY2tseSB0aGFuIGNhbGxpbmcKICBQeVNlcXVlbmNlX1NpemUoKS4KCi0gTmV3IGFyZ3VtZW50IHVucGFja2luZyBmdW5jdGlvbiBQeUFyZ19VbnBhY2tUdXBsZSgpIGFkZGVkLgoKLSBOZXcgZnVuY3Rpb25zIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKSBhbmQKICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncygpIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIGl0IG1vcmUKICBjb252ZW5pZW50IGFuZCBlZmZpY2llbnQgdG8gY2FsbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgZnJvbSBDLgoKLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSBubyBsb25nZXIgbWFza3MgZXJyb3JzLCBzbyBpdCdzCiAgcG9zc2libGUgdGhhdCB0aGlzIHdpbGwgcHJvcGFnYXRlIGVycm9ycyBpdCBkaWRuJ3QgYmVmb3JlLgoKLSBOZXcgZnVuY3Rpb24gUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKCksIHdoaWNoIHJldHVybnMgdHJ1ZSBpZiBpdHMKICBhcmd1bWVudCBzdXBwb3J0cyB0aGUgc2luZ2xlLXNlZ21lbnQgcmVhZGFibGUgYnVmZmVyIGludGVyZmFjZS4KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKLSBXZSd2ZSBmaW5hbGx5IGNvbmZpcm1lZCB0aGF0IHRoaXMgcmVsZWFzZSBidWlsZHMgb24gSFAtVVggMTEuMDAsCiAgKndpdGgqIHRocmVhZHMsIGFuZCBwYXNzZXMgdGhlIHRlc3Qgc3VpdGUuCgotIFRoYW5rcyB0byBhIHNlcmllcyBvZiBwYXRjaGVzIGZyb20gTWljaGFlbCBNdWxsZXIsIFB5dGhvbiBtYXkgYnVpbGQKICBhZ2FpbiB1bmRlciBPUy8yIFZpc3VhbCBBZ2UgQysrLgoKLSBVcGRhdGVkIFJJU0NPUyBwb3J0IGJ5IERpZXRtYXIgU2Nod2VydGJlcmdlci4KClRlc3RzCi0tLS0tCgotIEFkZGVkIGEgdGVzdCBzY3JpcHQgZm9yIHRoZSBjdXJzZXMgbW9kdWxlLiAgSXQgaXNuJ3QgcnVuIGF1dG9tYXRpY2FsbHk7CiAgcmVncnRlc3QucHkgbXVzdCBiZSBydW4gd2l0aCAnLXUgY3Vyc2VzJyB0byBlbmFibGUgaXQuCgpXaW5kb3dzCi0tLS0tLS0KCk1hYwotLS0tCgotIFB5dGhvblNjcmlwdCBoYXMgYmVlbiBtb3ZlZCB0byB1bnN1cHBvcnRlZCBhbmQgaXMgc2xhdGVkIHRvIGJlCiAgcmVtb3ZlZCBjb21wbGV0ZWx5IGluIHRoZSBuZXh0IHJlbGVhc2UuCgotIEl0IHNob3VsZCBub3cgYmUgcG9zc2libGUgdG8gYnVpbGQgYXBwbGV0cyB0aGF0IHdvcmsgb24gYm90aCBPUzkgYW5kCiAgT1NYLgoKLSBUaGUgY29yZSBpcyBub3cgbGlua2VkIHdpdGggQ29yZVNlcnZpY2VzIG5vdCBDYXJib247IGFzIGEgc2lkZQogIHJlc3VsdCwgZGVmYXVsdCA4Yml0IGVuY29kaW5nIG9uIE9TWCBpcyBub3cgQVNDSUkuCgotIFB5dGhvbiBzaG91bGQgbm93IGJ1aWxkIG9uIE9TWCAxMC4xLjEKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJiMT8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoqUmVsZWFzZSBkYXRlOiAxOS1PY3QtMjAwMSoKClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIE5ldy1zdHlsZSBjbGFzc2VzIGFyZSBub3cgYWx3YXlzIGR5bmFtaWMgKGV4Y2VwdCBmb3IgYnVpbHQtaW4gYW5kCiAgZXh0ZW5zaW9uIHR5cGVzKS4gIFRoZXJlIGlzIG5vIGxvbmdlciBhIHBlcmZvcm1hbmNlIHBlbmFsdHksIGFuZCBJCiAgbm8gbG9uZ2VyIHNlZSBhbm90aGVyIHJlYXNvbiB0byBrZWVwIHRoaXMgYmFnZ2FnZSBhcm91bmQuICBPbmUgcmVsaWMKICByZW1haW5zOiB0aGUgX19kaWN0X18gb2YgYSBuZXctc3R5bGUgY2xhc3MgaXMgYSByZWFkLW9ubHkgcHJveHk7IHlvdQogIG11c3Qgc2V0IHRoZSBjbGFzcydzIGF0dHJpYnV0ZSB0byBtb2RpZnkgaXQuICBBcyBhIGNvbnNlcXVlbmNlLCB0aGUKICBfX2RlZmluZWRfXyBhdHRyaWJ1dGUgb2YgbmV3LXN0eWxlIHR5cGVzIG5vIGxvbmdlciBleGlzdHMsIGZvciBsYWNrCiAgb2YgbmVlZDogdGhlcmUgaXMgb25jZSBhZ2FpbiBvbmx5IG9uZSBfX2RpY3RfXyAoYWx0aG91Z2ggaW4gdGhlCiAgZnV0dXJlIGEgX19jYWNoZV9fIG1heSBiZSByZXN1cnJlY3RlZCB3aXRoIGEgc2ltaWxhciBmdW5jdGlvbiwgaWYgSQogIGNhbiBwcm92ZSB0aGF0IGl0IGFjdHVhbGx5IHNwZWVkcyB0aGluZ3MgdXApLgoKLSBDLl9fZG9jX18gbm93IHdvcmtzIGFzIGV4cGVjdGVkIGZvciBuZXctc3R5bGUgY2xhc3NlcyAoaW4gMi4yYTQgaXQKICBhbHdheXMgcmV0dXJuZWQgTm9uZSwgZXZlbiB3aGVuIHRoZXJlIHdhcyBhIGNsYXNzIGRvY3N0cmluZykuCgotIGRvY3Rlc3Qgbm93IGZpbmRzIGFuZCBydW5zIGRvY3N0cmluZ3MgYXR0YWNoZWQgdG8gbmV3LXN0eWxlIGNsYXNzZXMsCiAgY2xhc3MgbWV0aG9kcywgc3RhdGljIG1ldGhvZHMsIGFuZCBwcm9wZXJ0aWVzLgoKQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gQSB2ZXJ5IHN1YnRsZSBzeW50YWN0aWNhbCBwaXRmYWxsIGluIGxpc3QgY29tcHJlaGVuc2lvbnMgd2FzIGZpeGVkLgogIEZvciBleGFtcGxlOiBbYStiIGZvciBhIGluICdhYmMnLCBmb3IgYiBpbiAnZGVmJ10uICBUaGUgY29tbWEgaW4KICB0aGlzIGV4YW1wbGUgaXMgYSBtaXN0YWtlLiAgUHJldmlvdXNseSwgdGhpcyB3b3VsZCBzaWxlbnRseSBsZXQgJ2EnCiAgaXRlcmF0ZSBvdmVyIHRoZSBzaW5nbGV0b24gdHVwbGUgKCdhYmMnLCksIHlpZWxkaW5nIFsnYWJjZCcsICdhYmNlJywKICAnYWJjZiddIHJhdGhlciB0aGFuIHRoZSBpbnRlbmRlZCBbJ2FkJywgJ2FlJywgJ2FmJywgJ2JkJywgJ2JlJywKICAnYmYnLCAnY2QnLCAnY2UnLCAnY2YnXS4gIE5vdywgdGhpcyBpcyBmbGFnZ2VkIGFzIGEgc3ludGF4IGVycm9yLgogIE5vdGUgdGhhdCBbYSBmb3IgYSBpbiA8c2luZ2xldG9uPl0gaXMgYSBjb252b2x1dGVkIHdheSB0byBzYXkKICBbPHNpbmdsZXRvbj5dIGFueXdheSwgc28gaXQncyBub3QgbGlrZSBhbnkgZXhwcmVzc2l2ZW5lc3MgaXMgbG9zdC4KCi0gZ2V0YXR0cihvYmosIG5hbWUsIGRlZmF1bHQpIG5vdyBvbmx5IGNhdGNoZXMgQXR0cmlidXRlRXJyb3IsIGFzCiAgZG9jdW1lbnRlZCwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwKICBleGNlcHRpb25zICh3aGljaCBjb3VsZCBtYXNrIGJ1Z3MgaW4gYSBfX2dldGF0dHJfXyBob29rLCBmb3IKICBleGFtcGxlKS4KCi0gV2VhayByZWZlcmVuY2Ugb2JqZWN0cyBhcmUgbm93IHBhcnQgb2YgdGhlIGNvcmUgYW5kIG9mZmVyIGEgQyBBUEkuCiAgQSBidWcgd2hpY2ggY291bGQgYWxsb3cgYSBjb3JlIGR1bXAgd2hlbiBiaW5hcnkgb3BlcmF0aW9ucyBpbnZvbHZlZAogIHByb3h5IHJlZmVyZW5jZSBoYXMgYmVlbiBmaXhlZC4gIHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IgaXMgbm93IGEKICBidWlsdC1pbiBleGNlcHRpb24uCgotIHVuaWNvZGUob2JqKSBub3cgYmVoYXZlcyBtb3JlIGxpa2Ugc3RyKG9iaiksIGFjY2VwdGluZyBhcmJpdHJhcnkKICBvYmplY3RzLCBhbmQgY2FsbGluZyBhIF9fdW5pY29kZV9fIG1ldGhvZCBpZiBpdCBleGlzdHMuCiAgdW5pY29kZShvYmosIGVuY29kaW5nKSBhbmQgdW5pY29kZShvYmosIGVuY29kaW5nLCBlcnJvcnMpIHN0aWxsCiAgcmVxdWlyZSBhbiA4LWJpdCBzdHJpbmcgb3IgY2hhcmFjdGVyIGJ1ZmZlciBhcmd1bWVudC4KCi0gaXNpbnN0YW5jZSgpIG5vdyBhbGxvd3MgYW55IG9iamVjdCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIGEKICBjbGFzcywgYSB0eXBlIG9yIHNvbWV0aGluZyB3aXRoIGEgX19iYXNlc19fIHR1cGxlIGF0dHJpYnV0ZSBmb3IgdGhlCiAgc2Vjb25kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBtYXkgYWxzbyBiZSBhIHR1cGxlIG9mIGEKICBjbGFzcywgdHlwZSwgb3Igc29tZXRoaW5nIHdpdGggX19iYXNlc19fLCBpbiB3aGljaCBjYXNlIGlzaW5zdGFuY2UoKQogIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIGFueSBvZiB0aGUKICB0aGluZ3MgY29udGFpbmVkIGluIHRoZSBzZWNvbmQgYXJndW1lbnQgdHVwbGUuICBFLmcuCgogIGlzaW5zdGFuY2UoeCwgKEEsIEIpKQoKICByZXR1cm5zIHRydWUgaWYgeCBpcyBhbiBpbnN0YW5jZSBvZiBBIG9yIEIuCgpFeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLQoKLSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIHRoZSB0aHJlYWQgSUQgKHByZXZpb3VzbHkgTm9uZSkuCgotIGJpbmFzY2lpIGhhcyBub3cgdHdvIHF1b3ByaSBzdXBwb3J0IGZ1bmN0aW9ucywgYTJiX3FwIGFuZCBiMmFfcXAuCgotIHJlYWRsaW5lIG5vdyBzdXBwb3J0cyBzZXR0aW5nIHRoZSBzdGFydHVwX2hvb2sgYW5kIHRoZQogIHByZV9ldmVudF9ob29rLCBhbmQgYWRkcyB0aGUgYWRkX2hpc3RvcnkoKSBmdW5jdGlvbi4KCi0gb3MgYW5kIHBvc2l4IHN1cHBvcnRzIGNocm9vdCgpLCBzZXRncm91cHMoKSBhbmQgdW5zZXRlbnYoKSB3aGVyZQogIGF2YWlsYWJsZS4gIFRoZSBzdGF0KCksIGZzdGF0KCksIHN0YXR2ZnMoKSBhbmQgZnN0YXR2ZnMoKSBmdW5jdGlvbnMKICBub3cgcmV0dXJuICJwc2V1ZG8tc2VxdWVuY2VzIiAtLSB0aGUgdmFyaW91cyBmaWVsZHMgY2FuIG5vdyBiZQogIGFjY2Vzc2VkIGFzIGF0dHJpYnV0ZXMgKGUuZy4gb3Muc3RhdCgiLyIpLnN0X210aW1lKSBidXQgZm9yCiAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdGhleSBhbHNvIGJlaGF2ZSBhcyBhIGZpeGVkLWxlbmd0aCBzZXF1ZW5jZS4KICBTb21lIHBsYXRmb3JtLXNwZWNpZmljIGZpZWxkcyAoZS5nLiBzdF9yZGV2KSBhcmUgb25seSBhY2Nlc3NpYmxlIGFzCiAgYXR0cmlidXRlcy4KCi0gdGltZTogbG9jYWx0aW1lKCksIGdtdGltZSgpIGFuZCBzdHJwdGltZSgpIG5vdyByZXR1cm4gYQogIHBzZXVkby1zZXF1ZW5jZSBzaW1pbGFyIHRvIHRoZSBvcy5zdGF0KCkgcmV0dXJuIHZhbHVlLCB3aXRoCiAgYXR0cmlidXRlcyBsaWtlIHRtX3llYXIgZXRjLgoKLSBEZWNvbXByZXNzaW9uIG9iamVjdHMgaW4gdGhlIHpsaWIgbW9kdWxlIG5vdyBhY2NlcHQgYW4gb3B0aW9uYWwKICBzZWNvbmQgcGFyYW1ldGVyIHRvIGRlY29tcHJlc3MoKSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQKICBvZiBtZW1vcnkgdG8gdXNlIGZvciB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCgotIG9wdGlvbmFsIFNTTCBzdXBwb3J0IGluIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBleHBvcnRzIE9wZW5TU0wKICBmdW5jdGlvbnMgUkFORF9hZGQoKSwgUkFORF9lZ2QoKSwgYW5kIFJBTkRfc3RhdHVzKCkuICBUaGVzZSBjYWxscwogIGFyZSB1c2VmdWwgb24gcGxhdGZvcm1zIGxpa2UgU29sYXJpcyB3aGVyZSBPcGVuU1NMIGRvZXMgbm90CiAgYXV0b21hdGljYWxseSBzZWVkIGl0cyBQUk5HLiAgQWxzbywgdGhlIGtleWZpbGUgYW5kIGNlcnRmaWxlCiAgYXJndW1lbnRzIHRvIHNvY2tldC5zc2woKSBhcmUgbm93IG9wdGlvbmFsLgoKLSBwb3NpeG1vZHVsZSAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlIG9zIG1vZHVsZSBvbiBQT1NJWCBwbGF0Zm9ybXMpIG5vdwogIGV4cG9ydHMgT19MQVJHRUZJTEUsIE9fRElSRUNULCBPX0RJUkVDVE9SWSwgYW5kIE9fTk9GT0xMT1cuCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gZG9jdGVzdCBub3cgZXhjbHVkZXMgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIG5vdCBkZWZpbmVkIGJ5IHRoZSBtb2R1bGUKICBiZWluZyB0ZXN0ZWQsIHRoYW5rcyB0byBUaW0gSG9jaGJlcmcuCgotIEhvdFNob3QsIGEgbmV3IHByb2ZpbGVyIGltcGxlbWVudGVkIHVzaW5nIGEgQy1iYXNlZCBjYWxsYmFjaywgaGFzCiAgYmVlbiBhZGRlZC4gIFRoaXMgc3Vic3RhbnRpYWxseSByZWR1Y2VzIHRoZSBvdmVyaGVhZCBvZiBwcm9maWxpbmcsCiAgYnV0IGl0IGlzIHN0aWxsIHF1aXRlIHByZWxpbWluYXJ5LiAgU3VwcG9ydCBtb2R1bGVzIGFuZAogIGRvY3VtZW50YXRpb24gd2lsbCBiZSBhZGRlZCBpbiB1cGNvbWluZyByZWxlYXNlcyAoYmVmb3JlIDIuMiBmaW5hbCkuCgotIHByb2ZpbGUgbm93IHByb2R1Y2VzIGNvcnJlY3Qgb3V0cHV0IGluIHNpdHVhdGlvbnMgd2hlcmUgYW4gZXhjZXB0aW9uCiAgcmFpc2VkIGluIFB5dGhvbiBpcyBjbGVhcmVkIGJ5IEMgY29kZSAoZS5nLiBoYXNhdHRyKCkpLiAgVGhpcyB1c2VkCiAgdG8gY2F1c2Ugd3Jvbmcgb3V0cHV0LCBpbmNsdWRpbmcgc3B1cmlvdXMgY2xhaW1zIG9mIHJlY3Vyc2l2ZQogIGZ1bmN0aW9ucyBhbmQgYXR0cmlidXRpb24gb2YgdGltZSBzcGVudCB0byB0aGUgd3JvbmcgZnVuY3Rpb24uCgogIFRoZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGVyaXZlZCBPbGRQcm9maWxlIGFuZCBIb3RQcm9maWxlCiAgcHJvZmlsaW5nIGNsYXNzZXMgd2FzIHJlbW92ZWQuICBUaGUgY29kZSBoYXNuJ3Qgd29ya2VkIGZvciB5ZWFycyAoaWYKICB5b3UgdHJpZWQgdG8gdXNlIHRoZW0sIHRoZXkgcmFpc2VkIGV4Y2VwdGlvbnMpLiAgT2xkUHJvZmlsZQogIGludGVuZGVkIHRvIHJlcHJvZHVjZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2ZpbGVyIFB5dGhvbiB1c2VkIG1vcmUKICB0aGFuIDcgeWVhcnMgYWdvLCBhbmQgaXNuJ3QgaW50ZXJlc3RpbmcgYW55bW9yZS4gIEhvdFByb2ZpbGUgaW50ZW5kZWQKICB0byBwcm92aWRlIGEgZmFzdGVyIHByb2ZpbGVyIChidXQgcHJvZHVjaW5nIGxlc3MgaW5mb3JtYXRpb24pLCBhbmQKICB0aGF0J3MgYSB3b3J0aHkgZ29hbCB3ZSBpbnRlbmQgdG8gbWVldCB2aWEgYSBkaWZmZXJlbnQgYXBwcm9hY2ggKGJ1dAogIHdpdGhvdXQgbG9zaW5nIGluZm9ybWF0aW9uKS4KCi0gUHJvZmlsZS5jYWxpYnJhdGUoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgZGVsaXZlcgogIGEgbXVjaCBiZXR0ZXIgc3lzdGVtLXNwZWNpZmljIGNhbGlicmF0aW9uIGNvbnN0YW50LiAgVGhlIGNvbnN0YW50IGNhbgogIG5vdyBiZSBzcGVjaWZpZWQgaW4gYW4gaW5zdGFuY2UgY29uc3RydWN0b3IsIG9yIGFzIGEgUHJvZmlsZSBjbGFzcyBvcgogIGluc3RhbmNlIHZhcmlhYmxlLCBpbnN0ZWFkIG9mIGJ5IGVkaXRpbmcgcHJvZmlsZS5weSdzIHNvdXJjZSBjb2RlLgogIENhbGlicmF0aW9uIG11c3Qgc3RpbGwgYmUgZG9uZSBtYW51YWxseSAoc2VlIHRoZSBkb2NzIGZvciB0aGUgcHJvZmlsZQogIG1vZHVsZSkuCgogIE5vdGUgdGhhdCBQcm9maWxlLmNhbGlicmF0ZSgpIG11c3QgYmUgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMuCiAgSW1wcm92aW5nIHRoZSBhY2N1cmFjeSByZXF1aXJlZCBleHBsb2l0aW5nIGRldGFpbGVkIGtub3dsZWRnZSBvZgogIHByb2ZpbGVyIGludGVybmFsczsgdGhlIGVhcmxpZXIgbWV0aG9kIGFic3RyYWN0ZWQgYXdheSB0aGUgZGV0YWlscwogIGFuZCBtZWFzdXJlZCBhIHNpbXBsaWZpZWQgbW9kZWwgaW5zdGVhZCwgYnV0IGNvbnNlcXVlbnRseSBjb21wdXRlZAogIGEgY29uc3RhbnQgdG9vIHNtYWxsIGJ5IGEgZmFjdG9yIG9mIDIgb24gc29tZSBtb2Rlcm4gbWFjaGluZXMuCgotIHF1b3ByaSdzIGVuY29kZSBhbmQgZGVjb2RlIG1ldGhvZHMgdGFrZSBhbiBvcHRpb25hbCBoZWFkZXIgcGFyYW1ldGVyLAogIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG91dHB1dCBpcyBpbnRlbmRlZCBmb3IgdGhlIGhlYWRlciAnUScKICBlbmNvZGluZy4KCi0gVGhlIFNvY2tldFNlcnZlci5UaHJlYWRpbmdNaXhJbiBjbGFzcyBub3cgY2xvc2VzIHRoZSByZXF1ZXN0IGFmdGVyCiAgZmluaXNoX3JlcXVlc3QoKSByZXR1cm5zLiAgKE5vdCB3aGVuIGl0IGVycm9ycyBvdXQgdGhvdWdoLikKCi0gVGhlIG5udHBsaWIgbW9kdWxlJ3MgTk5UUC5ib2R5KCkgbWV0aG9kIGhhcyBncm93biBhICdmaWxlJyBhcmd1bWVudAogIHRvIGFsbG93IHNhdmluZyB0aGUgbWVzc2FnZSBib2R5IHRvIGEgZmlsZS4KCi0gVGhlIGVtYWlsIHBhY2thZ2UgaGFzIGFkZGVkIGEgY2xhc3MgZW1haWwuUGFyc2VyLkhlYWRlclBhcnNlciB3aGljaAogIG9ubHkgcGFyc2VzIGhlYWRlcnMgYW5kIGRvZXMgbm90IHJlY3Vyc2UgaW50byB0aGUgbWVzc2FnZSdzIGJvZHkuCiAgQWxzbywgdGhlIG1vZHVsZS9jbGFzcyBNSU1FQXVkaW8gaGFzIGJlZW4gYWRkZWQgZm9yIHJlcHJlc2VudGluZwogIGF1ZGlvIGRhdGEgKGNvbnRyaWJ1dGVkIGJ5IEFudGhvbnkgQmF4dGVyKS4KCi0gZnRwbGliIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBmaWxlcyA+IDJHQi4KCi0gQ29uZmlnUGFyc2VyLmdldGJvb2xlYW4oKSBub3cgYWxzbyBpbnRlcnByZXRzIFRSVUUsIEZBTFNFLCBZRVMsIE5PLAogIE9OLCBhbmQgT0ZGLgoKLSB4bWwuZG9tLm1pbmlkb20gTm9kZUxpc3Qgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgbGVuZ3RoIGF0dHJpYnV0ZQogIGFuZCBpdGVtKCkgbWV0aG9kIGFzIHJlcXVpcmVkIGJ5IHRoZSBET00gc3BlY2lmaWNhdGlvbnMuCgpUb29scy9EZW1vcwotLS0tLS0tLS0tLQoKLSBEZW1vL2RucyB3YXMgcmVtb3ZlZC4gIEl0IG5vIGxvbmdlciBzZXJ2ZXMgYW55IHB1cnBvc2U7IGEgcGFja2FnZQogIGRlcml2ZWQgZnJvbSBpdCBpcyBub3cgbWFpbnRhaW5lZCBieSBBbnRob255IEJheHRlciwgc2VlCiAgaHR0cDovL1B5RE5TLlNvdXJjZUZvcmdlLm5ldC4KCi0gVGhlIGZyZWV6ZSB0b29sIGhhcyBiZWVuIG1hZGUgbW9yZSByb2J1c3QsIGFuZCB0d28gbmV3IG9wdGlvbnMgaGF2ZQogIGJlZW4gYWRkZWQ6IC1YIGFuZCAtRS4KCkJ1aWxkCi0tLS0tCgotIGNvbmZpZ3VyZSB3aWxsIHVzZSBDWFggaW4gTElOS0NDIGlmIENYWCBpcyB1c2VkIHRvIGJ1aWxkIG1haW4oKSBhbmQKICB0aGUgc3lzdGVtIHJlcXVpcmVzIHRvIGxpbmsgYSBDKysgbWFpbiB1c2luZyB0aGUgQysrIGNvbXBpbGVyLgoKQyBBUEkKLS0tLS0KCi0gVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSB0cF9jb21wYXJlIHNsb3QgaXMgdXBkYXRlZCB0byByZXF1aXJlIHRoYXQKICB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgLTEsIDAsIDE7IGFuIGFyYml0cmFyeSBudW1iZXIgPDAgb3IgPjAgaXMKICBub3QgY29ycmVjdC4gIFRoaXMgaXMgbm90IHlldCBlbmZvcmNlZCBidXQgd2lsbCBiZSBlbmZvcmNlZCBpbgogIFB5dGhvbiAyLjM7IGV2ZW4gbGF0ZXIsIHdlIG1heSB1c2UgLTIgdG8gaW5kaWNhdGUgZXJyb3JzIGFuZCArMiBmb3IKICAiTm90SW1wbGVtZW50ZWQiLiAgUmlnaHQgbm93LCAtMSBzaG91bGQgYmUgdXNlZCBmb3IgYW4gZXJyb3IgcmV0dXJuLgoKLSBQeUxvbmdfQXNMb25nTG9uZygpIG5vdyBhY2NlcHRzIGludCAoYXMgd2VsbCBhcyBsb25nKSBhcmd1bWVudHMuCiAgQ29uc2VxdWVudGx5LCBQeUFyZ19QYXJzZVR1cGxlJ3MgJ0wnIGNvZGUgYWxzbyBhY2NlcHRzIGludCAoYXMgd2VsbAogIGFzIGxvbmcpIGFyZ3VtZW50cy4KCi0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCgpIG5vdyByZXR1cm5zIGEgbG9uZyBpbnQgZ2l2aW5nIHRoZSB0aHJlYWQKICBJRCwgaWYgb25lIGNhbiBiZSBjYWxjdWxhdGVkOyBpdCByZXR1cm5zIC0xIGZvciBlcnJvciwgMCBpZiBubwogIHRocmVhZCBJRCBpcyBjYWxjdWxhdGVkICh0aGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBvbmx5CiAgdGhlIHRocmVhZCBtb2R1bGUgdXNlZCB0aGlzIEFQSSkuICBUaGlzIGNvZGUgaGFzIG9ubHkgcmVhbGx5IGJlZW4KICB0ZXN0ZWQgb24gTGludXggYW5kIFdpbmRvd3M7IG90aGVyIHBsYXRmb3JtcyBwbGVhc2UgYmV3YXJlIChhbmQKICByZXBvcnQgYW55IGJ1Z3Mgb3Igc3RyYW5nZSBiZWhhdmlvcikuCgotIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIG5vIGxvbmdlciBhY2NlcHRzIFVuaWNvZGUgb2JqZWN0cyBhcwogIGlucHV0LgoKTmV3IHBsYXRmb3JtcwotLS0tLS0tLS0tLS0tCgpUZXN0cwotLS0tLQoKV2luZG93cwotLS0tLS0tCgotIEluc3RhbGxlcjogIElmIHlvdSBpbnN0YWxsIElETEUsIGFuZCBkb24ndCBkaXNhYmxlIGZpbGUtZXh0ZW5zaW9uCiAgcmVnaXN0cmF0aW9uLCBhIG5ldyAiRWRpdCB3aXRoIElETEUiIGNvbnRleHQgKHJpZ2h0LWNsaWNrKSBtZW51IGVudHJ5CiAgaXMgY3JlYXRlZCBmb3IgLnB5IGFuZCAucHl3IGZpbGVzLgoKLSBUaGUgc2lnbmFsIG1vZHVsZSBub3cgc3VwcG9ydHMgU0lHQlJFQUsgb24gV2luZG93cywgdGhhbmtzIHRvIFN0ZXZlbgogIFNjb3R0LiAgTm90ZSB0aGF0IFNJR0JSRUFLIGlzIHVuaXF1ZSB0byBXaW5kb3dzLiAgVGhlIGRlZmF1bHQgU0lHQlJFQUsKICBhY3Rpb24gcmVtYWlucyB0byBjYWxsIFdpbjMyIEV4aXRQcm9jZXNzKCkuICBUaGlzIGNhbiBiZSBjaGFuZ2VkIHZpYQogIHNpZ25hbC5zaWduYWwoKS4gIEZvciBleGFtcGxlOjoKCiAgICAgICMgTWFrZSBDdHJsK0JyZWFrIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0LCBsaWtlIFB5dGhvbidzIGRlZmF1bHQgQ3RybCtDCiAgICAgICMgKFNJR0lOVCkgYmVoYXZpb3IuCiAgICAgIGltcG9ydCBzaWduYWwKICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQlJFQUssIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQoKICAgICAgdHJ5OgoJICB3aGlsZSAxOgoJICAgICAgcGFzcwogICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CgkgICMgV2UgZ2V0IGhlcmUgb24gQ3RybCtDIG9yIEN0cmwrQnJlYWsgbm93OyBpZiB3ZSBoYWQgbm90IGNoYW5nZWQKCSAgIyBTSUdCUkVBSywgb25seSBvbiBDdHJsK0MgKGFuZCBDdHJsK0JyZWFrIHdvdWxkIHRlcm1pbmF0ZSB0aGUKCSAgIyBwcm9ncmFtIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IGZvciBhbnkgUHl0aG9uLWxldmVsIGNsZWFudXApLgoJICBwcmludCAiQ2xlYW4gZXhpdCIKCgpXaGF0J3MgTmV3IGluIFB5dGhvbiAyLjJhND8KPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoqUmVsZWFzZSBkYXRlOiAyOC1TZXAtMjAwMSoKClR5cGUvY2xhc3MgdW5pZmljYXRpb24gYW5kIG5ldy1zdHlsZSBjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgotIHB5ZG9jIGFuZCBpbnNwZWN0IGFyZSBub3cgYXdhcmUgb2YgbmV3LXN0eWxlIGNsYXNzZXM7CiAgZS5nLiBoZWxwKGxpc3QpIGF0IHRoZSBpbnRlcmFjdGl2ZSBwcm9tcHQgbm93IHNob3dzIHByb3BlcgogIGRvY3VtZW50YXRpb24gZm9yIGFsbCBvcGVyYXRpb25zIG9uIGxpc3Qgb2JqZWN0cy4KCi0gQXBwbGljYXRpb25zIHVzaW5nIEppbSBGdWx0b24ncyBFeHRlbnNpb25DbGFzcyBtb2R1bGUgY2FuIG5vdyBzYWZlbHkKICBiZSB1c2VkIHdpdGggUHl0aG9uIDIuMi4gIEluIHBhcnRpY3VsYXIsIFpvcGUgMi40LjEgbm93IHdvcmtzIHdpdGgKICBQeXRob24gMi4yIChhcyB3ZWxsIGFzIHdpdGggUHl0aG9uIDIuMS4xKS4gIFRoZSBEZW1vL21ldGFjbGFzcwogIGV4YW1wbGVzIGFsc28gd29yayBhZ2Fpbi4gIEl0IGlzIGhvcGVkIHRoYXQgR3RrIGFuZCBCb29zdCBhbHNvIHdvcmsKICB3aXRoIDIuMmE0IGFuZCBiZXlvbmQuICAoSWYgeW91IGNhbiBjb25maXJtIHRoaXMsIHBsZWFzZSB3cml0ZQogIHdlYm1hc3RlckBweXRob24ub3JnOyBpZiB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMsIHBsZWFzZSBvcGVuIGEgYnVnCiAgcmVwb3J0IG9uIFNvdXJjZUZvcmdlLikKCi0gcHJvcGVydHkoKSBub3cgdGFrZXMgNCBrZXl3b3JkIGFyZ3VtZW50czogIGZnZXQsIGZzZXQsIGZkZWwgYW5kIGRvYy4KICBUaGVzZSBtYXAgdG8gcmVhZC1vbmx5IGF0dHJpYnV0ZXMgJ2ZnZXQnLCAnZnNldCcsICdmZGVsJywgYW5kICdfX2RvY19fJwogIGluIHRoZSBjb25zdHJ1Y3RlZCBwcm9wZXJ0eSBvYmplY3QuICBmZ2V0LCBmc2V0IGFuZCBmZGVsIHdlcmVuJ3QKICBkaXNjb3ZlcmFibGUgZnJvbSBQeXRob24gaW4gMi4yYTMuICBfX2RvY19fIGlzIG5ldywgYW5kIGFsbG93cyB0bwogIGFzc29jaWF0ZSBhIGRvY3N0cmluZyB3aXRoIGEgcHJvcGVydHkuCgotIENvbXBhcmlzb24gb3ZlcmxvYWRpbmcgaXMgbm93IG1vcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZC4gIEZvcgogIGV4YW1wbGUsIGEgc3RyIHN1YmNsYXNzIGluc3RhbmNlIGNhbiBwcm9wZXJseSBiZSBjb21wYXJlZCB0byBhIHN0cgogIGluc3RhbmNlLCBhbmQgaXQgY2FuIHByb3Blcmx5IG92ZXJsb2FkIGNvbXBhcmlzb24uICBEaXR0byBmb3IgbW9zdAogIG90aGVyIGJ1aWx0LWluIG9iamVjdCB0eXBlcy4KCi0gVGhlIHJlcHIoKSBvZiBuZXctc3R5bGUgY2xhc3NlcyBoYXMgY2hhbmdlZDsgaW5zdGVhZCBvZiA8dHlwZQogICdNLkZvbyc+IGEgbmV3LXN0eWxlIGNsYXNzIGlzIG5vdyByZW5kZXJlZCBhcyA8Y2xhc3MgJ00uRm9vJz4sCiAgKmV4Y2VwdCogZm9yIGJ1aWx0LWluIHR5cGVzLCB3aGljaCBhcmUgc3RpbGwgcmVuZGVyZWQgYXMgPHR5cGUKICAnRm9vJz4gKHRvIGF2b2lkIHVwc2V0dGluZyBleGlzdGluZyBjb2RlIHRoYXQgbWlnaHQgcGFyc2Ugb3IKICBvdGhlcndpc2UgcmVseSBvbiByZXByKCkgb2YgY2VydGFpbiB0eXBlIG9iamVjdHMpLgoKLSBUaGUgcmVwcigpIG9mIG5ldy1zdHlsZSBvYmplY3RzIGlzIG5vdyBhbHdheXMgPEZvbyBvYmplY3QgYXQgWFhYPjsKICBwcmV2aW91c2x5LCBpdCB3YXMgc29tZXRpbWVzIDxGb28gaW5zdGFuY2UgYXQgWFhYPi4KCi0gRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB3aGF0IHdhcyBwcmV2aW91c2x5IGNhbGxlZCBfX2dldGF0dHJfXyBpcyBub3cKICBjYWxsZWQgX19nZXRhdHRyaWJ1dGVfXy4gIFRoaXMgbWV0aG9kLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZm9yCiAgKmV2ZXJ5KiBhdHRyaWJ1dGUgYWNjZXNzLiAgQSBuZXcgX19nZXRhdHRyX18gaG9vayBtb3JlIHNpbWlsYXIgdG8gdGhlCiAgb25lIGluIGNsYXNzaWMgY2xhc3NlcyBpcyBkZWZpbmVkIHdoaWNoIGlzIGNhbGxlZCBvbmx5IGlmIHJlZ3VsYXIKICBhdHRyaWJ1dGUgYWNjZXNzIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcjsgdG8gY2F0Y2ggKmFsbCogYXR0cmlidXRlCiAgYWNjZXNzLCB5b3UgY2FuIHVzZSBfX2dldGF0dHJpYnV0ZV9fIChmb3IgbmV3LXN0eWxlIGNsYXNzZXMpLiAgSWYKICBib3RoIGFyZSBkZWZpbmVkLCBfX2dldGF0dHJpYnV0ZV9fIGlzIGNhbGxlZCBmaXJzdCwgYW5kIGlmIGl0IHJhaXNlcwogIEF0dHJpYnV0ZUVycm9yLCBfX2dldGF0dHJfXyBpcyBjYWxsZWQuCgotIFRoZSBfX2NsYXNzX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSBvYmplY3RzIGNhbiBiZSBhc3NpZ25lZCB0by4KICBUaGUgbmV3IGNsYXNzIG11c3QgaGF2ZSB0aGUgc2FtZSBDLWxldmVsIG9iamVjdCBsYXlvdXQgYXMgdGhlIG9sZAogIGNsYXNzLgoKLSBUaGUgYnVpbHRpbiBmaWxlIHR5cGUgY2FuIGJlIHN1YmNsYXNzZWQgbm93LiAgSW4gdGhlIHVzdWFsIHBhdHRlcm4sCiAgImZpbGUiIGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsdGluIHR5cGUsIGFuZCBmaWxlKCkgaXMgYSBuZXcgYnVpbHRpbgogIGNvbnN0cnVjdG9yLCB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgYnVpbHRpbiBvcGVuKCkgZnVuY3Rpb24uCiAgZmlsZSgpIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBvcGVuIGEgZmlsZS4KCi0gUHJldmlvdXNseSwgX19uZXdfXyB3b3VsZCBvbmx5IHNlZSBzZXF1ZW50aWFsIGFyZ3VtZW50cyBwYXNzZWQgdG8KICB0aGUgdHlwZSBpbiBhIGNvbnN0cnVjdG9yIGNhbGw7IF9faW5pdF9fIHdvdWxkIHNlZSBib3RoIHNlcXVlbnRpYWwKICBhbmQga2V5d29yZCBhcmd1bWVudHMuICBUaGlzIG1hZGUgbm8gc2Vuc2Ugd2hhdHNvZXZlciBhbnkgbW9yZSwgc28KICBub3cgYm90aCBfX25ld19fIGFuZCBfX2luaXRfXyBzZWUgYWxsIGFyZ3VtZW50cy4KCi0gUHJldmlvdXNseSwgaGFzaCgpIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiBzdHIgb3IKICB1bmljb2RlIGFsd2F5cyByZXR1cm5lZCAwLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4KCi0gUHJldmlvdXNseSwgYW4gb3BlcmF0aW9uIG9uIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYW4KICBpbW11dGFibGUgdHlwZSAoaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgdHVwbGUsIHN0ciwgdW5pY29kZSksCiAgd2hlcmUgdGhlIHN1YnR5cGUgZGlkbid0IG92ZXJyaWRlIHRoZSBvcGVyYXRpb24gKGFuZCBzbyB0aGUKICBvcGVyYXRpb24gd2FzIGhhbmRsZWQgYnkgdGhlIGJ1aWx0aW4gdHlwZSksIGNvdWxkIHJldHVybiB0aGF0CiAgaW5zdGFuY2UgaW5zdGVhZCBhIHZhbHVlIG9mIHRoZSBiYXNlIHR5cGUuICBGb3IgZXhhbXBsZSwgaWYgcyB3YXMgb2YKICBhIHN0ciBzdWJjbGFzcyB0eXBlLCBzWzpdIHJldHVybmVkIHMgYXMtaXMuICBOb3cgaXQgcmV0dXJucyBhIHN0cgogIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMgcy4KCi0gUHJvdmlzaW9uYWwgc3VwcG9ydCBmb3IgcGlja2xpbmcgbmV3LXN0eWxlIG9iamVjdHMgaGFzIGJlZW4gYWRkZWQuCgpDb3JlCi0tLS0KCi0gZmlsZS53cml0ZWxpbmVzKCkgbm93IGFjY2VwdHMgYW55IGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncy4KCi0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgbm93IHdvcmtzIHZlcnkgbXVjaCBsaWtlCiAgUHlPYmplY3RfU3RyKG9iaikgaW4gdGhhdCBpdCB0cmllcyB0byB1c2UgX19zdHJfXy90cF9zdHIKICBvbiB0aGUgb2JqZWN0IGlmIHRoZSBvYmplY3QgaXMgbm90IGEgc3RyaW5nIG9yIGJ1ZmZlci4gVGhpcwogIG1ha2VzIHVuaWNvZGUoKSBiZWhhdmUgbGlrZSBzdHIoKSB3aGVuIGFwcGxpZWQgdG8gbm9uLXN0cmluZy9idWZmZXIKICBvYmplY3RzLgoKLSBQeUZpbGVfV3JpdGVPYmplY3Qgbm93IHBhc3NlcyBVbmljb2RlIG9iamVjdHMgdG8gdGhlIGZpbGUncyB3cml0ZQogIG1ldGhvZC4gQXMgYSByZXN1bHQsIGFsbCBmaWxlLWxpa2Ugb2JqZWN0cyB3aGljaCBtYXkgYmUgdGhlIHRhcmdldAogIG9mIGEgcHJpbnQgc3RhdGVtZW50IG11c3Qgc3VwcG9ydCBVbmljb2RlIG9iamVjdHMsIGkuZS4gdGhleSBtdXN0CiAgYXQgbGVhc3QgY29udmVydCB0aGVtIGludG8gQVNDSUkgc3RyaW5ncy4KCi0gVGhyZWFkIHNjaGVkdWxpbmcgb24gU29sYXJpcyBzaG91bGQgYmUgaW1wcm92ZWQ7IGl0IGlzIG5vIGxvbmdlcgogIG5lY2Vzc2FyeSB0byBpbnNlcnQgYSBzbWFsbCBzbGVlcCBhdCB0aGUgc3RhcnQgb2YgYSB0aHJlYWQgaW4gb3JkZXIKICB0byBsZXQgb3RoZXIgcnVubmFibGUgdGhyZWFkcyBiZSBzY2hlZHVsZWQuCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIGFuZCBjU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIHN1cHBvcnQKICByZWFkIGNoYXJhY3RlciBidWZmZXIgY29tcGF0aWJsZSBvYmplY3RzIGZvciB0aGVpciAud3JpdGUoKSBtZXRob2RzLgogIFRoZXNlIG9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIGFuZCB0aGVuIGhhbmRsZWQgYXMgc3VjaAogIGJ5IHRoZSBpbnN0YW5jZXMuCgotIFRoZSAiZW1haWwiIHBhY2thZ2UgaGFzIGJlZW4gYWRkZWQuICBUaGlzIGlzIGJhc2ljYWxseSBhIHBvcnQgb2YgdGhlCiAgbWltZWxpYiBwYWNrYWdlIDxodHRwOi8vc2YubmV0L3Byb2plY3RzL21pbWVsaWI+IHdpdGggQVBJIGNoYW5nZXMKICBhbmQgc29tZSBpbXBsZW1lbnRhdGlvbnMgdXBkYXRlZCB0byB1c2UgaXRlcmF0b3JzIGFuZCBnZW5lcmF0b3JzLgoKLSBkaWZmbGliLm5kaWZmKCkgYW5kIGRpZmZsaWIuRGlmZmVyLmNvbXBhcmUoKSBhcmUgZ2VuZXJhdG9ycyBub3cuICBUaGlzCiAgcmVzdG9yZXMgdGhlIGFiaWxpdHkgb2YgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSB0byBzdGFydCBwcm9kdWNpbmcgb3V0cHV0CiAgYmVmb3JlIHRoZSBlbnRpcmUgY29tcGFyaXNvbiBpcyBjb21wbGV0ZS4KCi0gU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIGFuZCBjU3RyaW5nSU8uU3RyaW5nSU8gaW5zdGFuY2VzIHN1cHBvcnQKICBpdGVyYXRpb24ganVzdCBsaWtlIGZpbGUgb2JqZWN0cyAoaS5lLiB0aGVpciAucmVhZGxpbmUoKSBtZXRob2QgaXMKICBjYWxsZWQgZm9yIGVhY2ggaXRlcmF0aW9uIHVudGlsIGl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nKS4KCi0gVGhlIGNvZGVjcyBtb2R1bGUgaGFzIGdyb3duIGZvdXIgbmV3IGhlbHBlciBBUElzIHRvIGFjY2VzcwogIGJ1aWx0aW4gY29kZWNzOiBnZXRlbmNvZGVyKCksIGdldGRlY29kZXIoKSwgZ2V0cmVhZGVyKCksCiAgZ2V0d3JpdGVyKCkuCgotIFNpbXBsZVhNTFJQQ1NlcnZlcjogYSBuZXcgbW9kdWxlIChiYXNlZCB1cG9uIFNpbXBsZUhUTUxTZXJ2ZXIpCiAgc2ltcGxpZmllcyB3cml0aW5nIFhNTCBSUEMgc2VydmVycy4KCi0gb3MucGF0aC5yZWFscGF0aCgpOiBhIG5ldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGFic29sdXRlIHBhdGhuYW1lCiAgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2Ygc3ltYm9saWMgbGlua3MuICBPbiBub24tVW5peCBzeXN0ZW1zLCB0aGlzCiAgaXMgYW4gYWxpYXMgZm9yIG9zLnBhdGguYWJzcGF0aCgpLgoKLSBvcGVyYXRvci5pbmRleE9mKCkgKFB5U2VxdWVuY2VfSW5kZXgoKSBpbiB0aGUgQyBBUEkpIG5vdyB3b3JrcyB3aXRoIGFueQogIGl0ZXJhYmxlIG9iamVjdC4KCi0gc210cGxpYiBub3cgc3VwcG9ydHMgdmFyaW91cyBhdXRoZW50aWNhdGlvbiBhbmQgc2VjdXJpdHkgZmVhdHVyZXMgb2YKICB0aGUgU01UUCBwcm90b2NvbCB0aHJvdWdoIHRoZSBuZXcgbG9naW4oKSBhbmQgc3RhcnR0bHMoKSBtZXRob2RzLgoKLSBobWFjOiBhIG5ldyBtb2R1bGUgaW1wbGVtZW50aW5nIGtleWVkIGhhc2hpbmcgZm9yIG1lc3NhZ2UKICBhdXRoZW50aWNhdGlvbi4KCi0gbWltZXR5cGVzIG5vdyByZWNvZ25pemVzIG1vcmUgZXh0ZW5zaW9ucyBhbmQgZmlsZSB0eXBlcy4gIEF0IHRoZQogIHNhbWUgdGltZSwgc29tZSBtYXBwaW5ncyBub3Qgc2FuY3Rpb25lZCBieSBJQU5BIHdlcmUgcmVtb3ZlZC4KCi0gVGhlICJjb21waWxlciIgcGFja2FnZSBoYXMgYmVlbiBicm91Z2h0IHVwIHRvIGRhdGUgdG8gdGhlIHN0YXRlIG9mCiAgUHl0aG9uIDIuMiBieXRlY29kZSBnZW5lcmF0aW9uLiAgSXQgaGFzIGFsc28gYmVlbiBwcm9tb3RlZCBmcm9tIGEKICBUb29sIHRvIGEgc3RhbmRhcmQgbGlicmFyeSBwYWNrYWdlLiAgKFRvb2xzL2NvbXBpbGVyIHN0aWxsIGV4aXN0cyBhcwogIGEgc2FtcGxlIGRyaXZlci4pCgpUb29scwotLS0tLQoKQnVpbGQKLS0tLS0KCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IChMRlMpIGlzIG5vdyBhdXRvbWF0aWMgd2hlbiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKICBpdDsgbm8gbW9yZSBtYW51YWwgY29uZmlndXJhdGlvbiB0d2Vha3MgYXJlIG5lZWRlZC4gIE9uIExpbnV4LCBhdAogIGxlYXN0LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBzeXN0ZW0gd2hvc2UgQyBsaWJyYXJ5IHN1cHBvcnRzIGxhcmdlCiAgZmlsZXMgYnV0IHdob3NlIGtlcm5lbCBkb2Vzbid0OyBpbiB0aGlzIGNhc2UsIGxhcmdlIGZpbGUgc3VwcG9ydCBpcwogIHN0aWxsIGVuYWJsZWQgYnV0IGRvZXNuJ3QgZG8geW91IGFueSBnb29kIHVubGVzcyB5b3UgdXBncmFkZSB5b3VyCiAga2VybmVsIG9yIHNoYXJlIHlvdXIgUHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBhbm90aGVyIHN5c3RlbSB3aG9zZQogIGtlcm5lbCBoYXMgbGFyZ2UgZmlsZSBzdXBwb3J0LgoKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgc3VwcGxpZXMgcGxhdXNpYmxlIGRlZmF1bHRzIGluIGEKICBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudC4gIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHN1cHBsaWVkCiAgdmFsdWVzIGFyZSBhbHdheXMgY29ycmVjdCwgb3IgdGhhdCBjcm9zcy1jb21waWxhdGlvbiBub3cgd29ya3MKICBmbGF3bGVzc2x5IC0tIGJ1dCBpdCdzIGEgZmlyc3Qgc3RlcCAoYW5kIGl0IHNodXRzIHVwIG1vc3Qgb2YKICBhdXRvY29uZidzIHdhcm5pbmdzIGFib3V0IEFDX1RSWV9SVU4pLgoKLSBUaGUgVW5peCBidWlsZCBpcyBub3cgYSBiaXQgbGVzcyBjaGF0dHksIGNvdXJ0ZXN5IG9mIHRoZSBwYXJzZXIKICBnZW5lcmF0b3IuICBUaGUgYnVpbGQgaXMgY29tcGxldGVseSBzaWxlbnQgKGV4Y2VwdCBmb3IgZXJyb3JzKSB3aGVuCiAgdXNpbmcgIm1ha2UgLXMiLCB0aGFua3MgdG8gYSAtcSBvcHRpb24gdG8gc2V0dXAucHkuCgpDIEFQSQotLS0tLQoKLSBUaGUgInN0cnVjdG1lbWJlciIgQVBJIG5vdyBzdXBwb3J0cyBzb21lIG5ldyBmbGFnIGJpdHMgdG8gZGVueSByZWFkCiAgYW5kL29yIHdyaXRlIGFjY2VzcyB0byBhdHRyaWJ1dGVzIGluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gQ29tcGFxJ3MgaVBBUSBoYW5kaGVsZCwgcnVubmluZyB0aGUgImZhbWlsaWFyIiBMaW51eCBkaXN0cmlidXRpb24KICAoaHR0cDovL2ZhbWlsaWFyLmhhbmRoZWxkcy5vcmcpLgoKVGVzdHMKLS0tLS0KCi0gVGhlICJjbGFzc2ljIiBzdGFuZGFyZCB0ZXN0cywgd2hpY2ggd29yayBieSBjb21wYXJpbmcgc3Rkb3V0IHRvCiAgYW4gZXhwZWN0ZWQtb3V0cHV0IGZpbGUgdW5kZXIgTGliL3Rlc3Qvb3V0cHV0Lywgbm8gbG9uZ2VyIHN0b3AgYXQKICB0aGUgZmlyc3QgbWlzbWF0Y2guICBJbnN0ZWFkIHRoZSB0ZXN0IGlzIHJ1biB0byBjb21wbGV0aW9uLCBhbmQgYQogIHZhcmlhbnQgb2YgbmRpZmYtc3R5bGUgY29tcGFyaXNvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbGwgZGlmZmVyZW5jZXMuCiAgVGhpcyBpcyBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIHRoYW4gdGhlIHByZXZpb3VzIHN0eWxlIG9mIHJlcG9ydGluZy4KCi0gVGhlIHVuaXR0ZXN0LWJhc2VkIHN0YW5kYXJkIHRlc3RzIG5vdyB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4oKQogIGNvbnZlbnRpb24sIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIHNpZGUtZWZmZWN0IG9mIG1lcmVseSBiZWluZwogIGltcG9ydGVkLiAgVGhpcyBhbGxvd3MgdGhlc2UgdGVzdHMgdG8gYmUgcnVuIGluIG1vcmUgbmF0dXJhbCBhbmQKICBmbGV4aWJsZSB3YXlzIGFzIHVuaXR0ZXN0cywgb3V0c2lkZSB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLgoKLSByZWdydGVzdC5weSBpcyBtdWNoIGJldHRlciBpbnRlZ3JhdGVkIHdpdGggdW5pdHRlc3QgYW5kIGRvY3Rlc3Qgbm93LAogIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHJlcG9ydGluZyBlcnJvcnMuCgpXaW5kb3dzCi0tLS0tLS0KCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IG5vdyBhbHNvIHdvcmtzIGZvciBmaWxlcyA+IDRHQiwgb24gZmlsZXN5c3RlbXMKICB0aGF0IHN1cHBvcnQgaXQgKE5URlMgdW5kZXIgV2luZG93cyAyMDAwKS4gIFNlZSAiV2hhdCdzIE5ldyBpbgogIFB5dGhvbiAyLjJhMyIgZm9yIG1vcmUgZGV0YWlsLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEzPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIERhdGU6IDA3LVNlcC0yMDAxKgoKQ29yZQotLS0tCgotIENvbnZlcnNpb24gb2YgbG9uZyB0byBmbG9hdCBub3cgcmFpc2VzIE92ZXJmbG93RXJyb3IgaWYgdGhlIGxvbmcgaXMgdG9vCiAgYmlnIHRvIHJlcHJlc2VudCBhcyBhIEMgZG91YmxlLgoKLSBUaGUgMy1hcmd1bWVudCBidWlsdGluIHBvdygpIG5vIGxvbmdlciBhbGxvd3MgYSB0aGlyZCBub24tTm9uZSBhcmd1bWVudAogIGlmIGVpdGhlciBvZiB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBpcyBhIGZsb2F0LCBvciBpZiBib3RoIGFyZSBvZgogIGludGVnZXIgdHlwZXMgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmUgKGluIHdoaWNoIGxhdHRlciBjYXNlCiAgdGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0LCBzbyB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZQogIHJlc3RyaWN0aW9uKS4KCi0gVGhlIGJ1aWx0aW4gZGlyKCkgbm93IHJldHVybnMgbW9yZSBpbmZvcm1hdGlvbiwgYW5kIHNvbWV0aW1lcyBtdWNoCiAgbW9yZSwgZ2VuZXJhbGx5IG5hbWluZyBhbGwgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QsIGFuZCBhbGwgYXR0cmlidXRlcwogIHJlYWNoYWJsZSBmcm9tIHRoZSBvYmplY3QgdmlhIGl0cyBjbGFzcywgYW5kIGZyb20gaXRzIGNsYXNzJ3MgYmFzZQogIGNsYXNzZXMsIGFuZCBzbyBvbiBmcm9tIHRoZW0gdG9vLiAgRXhhbXBsZTogIGluIDIuMmEyLCBkaXIoW10pIHJldHVybmVkCiAgYW4gZW1wdHkgbGlzdC4gIEluIDIuMmEzLAoKICA+Pj4gZGlyKFtdKQogIFsnX19hZGRfXycsICdfX2NsYXNzX18nLCAnX19jb250YWluc19fJywgJ19fZGVsYXR0cl9fJywgJ19fZGVsaXRlbV9fJywKICAgJ19fZXFfXycsICdfX2dlX18nLCAnX19nZXRhdHRyX18nLCAnX19nZXRpdGVtX18nLCAnX19nZXRzbGljZV9fJywKICAgJ19fZ3RfXycsICdfX2hhc2hfXycsICdfX2lhZGRfXycsICdfX2ltdWxfXycsICdfX2luaXRfXycsICdfX2xlX18nLAogICAnX19sZW5fXycsICdfX2x0X18nLCAnX19tdWxfXycsICdfX25lX18nLCAnX19uZXdfXycsICdfX3JlcHJfXycsCiAgICdfX3JtdWxfXycsICdfX3NldGF0dHJfXycsICdfX3NldGl0ZW1fXycsICdfX3NldHNsaWNlX18nLCAnX19zdHJfXycsCiAgICdhcHBlbmQnLCAnY291bnQnLCAnZXh0ZW5kJywgJ2luZGV4JywgJ2luc2VydCcsICdwb3AnLCAncmVtb3ZlJywKICAgJ3JldmVyc2UnLCAnc29ydCddCgogIGRpcihtb2R1bGUpIGNvbnRpbnVlcyB0byByZXR1cm4gb25seSB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcywgdGhvdWdoLgoKLSBPdmVyZmxvd2luZyBvcGVyYXRpb25zIG9uIHBsYWluIGludHMgbm93IHJldHVybiBhIGxvbmcgaW50IHJhdGhlcgogIHRoYW4gcmFpc2luZyBPdmVyZmxvd0Vycm9yLiAgVGhpcyBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgUEVQCiAgMjM3LiAgWW91IGNhbiB1c2UgLVdkZWZhdWx0OjpPdmVyZmxvd1dhcm5pbmcgdG8gZW5hYmxlIGEgd2FybmluZyBmb3IKICB0aGlzIHNpdHVhdGlvbiwgYW5kIC1XZXJyb3I6Ok92ZXJmbG93V2FybmluZyB0byByZXZlcnQgdG8gdGhlIG9sZAogIE92ZXJmbG93RXJyb3IgZXhjZXB0aW9uLgoKLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtUTxhcmc+LCBpcyBhZGRlZCB0byBjb250cm9sIHJ1bi10aW1lCiAgd2FybmluZ3MgZm9yIHRoZSB1c2Ugb2YgY2xhc3NpYyBkaXZpc2lvbi4gIChTZWUgUEVQIDIzOC4pICBQb3NzaWJsZQogIHZhbHVlcyBhcmUgLVFvbGQsIC1Rd2FybiwgLVF3YXJuYWxsLCBhbmQgLVFuZXcuICBUaGUgZGVmYXVsdCBpcwogIC1Rb2xkLCBtZWFuaW5nIHRoZSAvIG9wZXJhdG9yIGhhcyBpdHMgY2xhc3NpYyBtZWFuaW5nIGFuZCBubwogIHdhcm5pbmdzIGFyZSBpc3N1ZWQuICBVc2luZyAtUXdhcm4gaXNzdWVzIGEgcnVuLXRpbWUgd2FybmluZyBhYm91dAogIGFsbCB1c2VzIG9mIGNsYXNzaWMgZGl2aXNpb24gZm9yIGludCBhbmQgbG9uZyBhcmd1bWVudHM7IC1Rd2FybmFsbAogIGFsc28gd2FybnMgYWJvdXQgY2xhc3NpYyBkaXZpc2lvbiBmb3IgZmxvYXQgYW5kIGNvbXBsZXggYXJndW1lbnRzCiAgKGZvciB1c2Ugd2l0aCBmaXhkaXYucHkpLgogIFtOb3RlOiAgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGl0ZW0gKHByZXNlcnZlZCBiZWxvdykgYmVjYW1lCiAgb2Jzb2xldGUgaW4gMi4yYzEgLS0gLVFuZXcgaGFzIGdsb2JhbCBlZmZlY3QgaW4gMi4yXSA6OgoKICAgIFVzaW5nIC1RbmV3IGlzIHF1ZXN0aW9uYWJsZTsgaXQgdHVybnMgb24gbmV3IGRpdmlzaW9uIGJ5IGRlZmF1bHQsIGJ1dAogICAgb25seSBpbiB0aGUgX19tYWluX18gbW9kdWxlLiAgWW91IGNhbiB1c2VmdWxseSBjb21iaW5lIC1Rd2FybiBvcgogICAgLVF3YXJuYWxsIGFuZCAtUW5ldzogdGhpcyBnaXZlcyB0aGUgX19tYWluX18gbW9kdWxlIG5ldyBkaXZpc2lvbiwgYW5kCiAgICB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGV2ZXJ5d2hlcmUgZWxzZS4KCi0gTWFueSBidWlsdC1pbiB0eXBlcyBjYW4gbm93IGJlIHN1YmNsYXNzZWQuICBUaGlzIGFwcGxpZXMgdG8gaW50LAogIGxvbmcsIGZsb2F0LCBzdHIsIHVuaWNvZGUsIGFuZCB0dXBsZS4gIChUaGUgdHlwZXMgY29tcGxleCwgbGlzdCBhbmQKICBkaWN0aW9uYXJ5IGNhbiBhbHNvIGJlIHN1YmNsYXNzZWQ7IHRoaXMgd2FzIGludHJvZHVjZWQgZWFybGllci4pCiAgTm90ZSB0aGF0IHJlc3RyaWN0aW9ucyBhcHBseSB3aGVuIHN1YmNsYXNzaW5nIGltbXV0YWJsZSBidWlsdC1pbgogIHR5cGVzOiB5b3UgY2FuIG9ubHkgYWZmZWN0IHRoZSB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UgYnkgb3ZlcmxvYWRpbmcKICBfX25ld19fLiAgWW91IGNhbiBhZGQgbXV0YWJsZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIHN1YmNsYXNzIGluc3RhbmNlcwogIHdpbGwgaGF2ZSBhIF9fZGljdF9fIGF0dHJpYnV0ZSwgYnV0IHlvdSBjYW5ub3QgY2hhbmdlIHRoZSAidmFsdWUiCiAgKGFzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzKSBvZiBhbiBpbW11dGFibGUgc3ViY2xhc3MgaW5zdGFuY2UKICBvbmNlIGl0IGlzIGNyZWF0ZWQuCgotIFRoZSBkaWN0aW9uYXJ5IGNvbnN0cnVjdG9yIG5vdyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwgYQogIG1hcHBpbmctbGlrZSBvYmplY3QsIGFuZCBpbml0aWFsaXplcyB0aGUgZGljdGlvbmFyeSBmcm9tIGl0cwogIChrZXksIHZhbHVlKSBwYWlycy4KCi0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgc3VwZXIsIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBmYWNpbGl0YXRlcyBtYWtpbmcKICAiY29vcGVyYXRpdmUgc3VwZXIgY2FsbHMiIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc2V0dGluZy4gIEZvciBhbgogIGV4cGxhbmF0aW9uLCBzZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwjY29vcGVyYXRpb24KCi0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgcHJvcGVydHksIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBlbmFibGVzIHRoZQogIGNyZWF0aW9uIG9mICJwcm9wZXJ0aWVzIi4gIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIGltcGxlbWVudGVkIGJ5CiAgZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zIChvciBvbmx5IG9uZSBvZiB0aGVzZSBmb3IgcmVhZC1vbmx5IG9yCiAgd3JpdGUtb25seSBhdHRyaWJ1dGVzKSwgd2l0aG91dCB0aGUgbmVlZCB0byBvdmVycmlkZSBfX2dldGF0dHJfXy4KICBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwjcHJvcGVydHkKCi0gVGhlIHN5bnRheCBvZiBmbG9hdGluZy1wb2ludCBhbmQgaW1hZ2luYXJ5IGxpdGVyYWxzIGhhcyBiZWVuCiAgbGliZXJhbGl6ZWQsIHRvIGFsbG93IGxlYWRpbmcgemVyb2VzLiAgRXhhbXBsZXMgb2YgbGl0ZXJhbHMgbm93CiAgbGVnYWwgdGhhdCB3ZXJlIFN5bnRheEVycm9ycyBiZWZvcmU6CgogICAgICAwMC4wICAgIDBlMyAgIDAxMDBqICAgMDcuNSAgIDAwMDAwMDAwMDAwMDAwMDAwMDA4LgoKLSBBbiBvbGQgdG9rZW5pemVyIGJ1ZyBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIHdpdGggYW4gaW5jb21wbGV0ZQogIGV4cG9uZW50LCBzdWNoIGFzIDFlIGFuZCAzLjFlLS4gIFN1Y2ggbGl0ZXJhbHMgbm93IHJhaXNlIFN5bnRheEVycm9yLgoKTGlicmFyeQotLS0tLS0tCgotIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgogIHNldHRpbmcgYW4gb3B0aW9uIG5lZ290aWF0aW9uIGNhbGxiYWNrLiBJdCBhbHNvIHN1cHBvcnRzIHByb2Nlc3NpbmcKICBvZiBzdWJvcHRpb25zLgoKLSBUaGUgbmV3IEMgc3RhbmRhcmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgbWF0aCBsaWJyYXJpZXMgc2V0IGVycm5vIHRvCiAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQogIGNoZWNraW5nIHNjaGVtZSBhdHRlbXB0cyB0byByZXBhaXIgdGhhdCwgYnV0IG1heSBub3QgYmUgcmVsaWFibGUgb24gYWxsCiAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQogIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KCi0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcwogIHRocmVhZGluZy5UaW1lci4KCi0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgoKLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCgotIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCiAgV2hlbiByZWFkIG9uIGEgYm94IHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA0IGJ5dGVzLCBzdWNoIHZhbHVlcyBhcmUKICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgoKLSBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh1c2luZyB0aGUgcmV4ZWMgbW9kdWxlKSwgdW5tYXJzaGFsbGluZwogIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgoKLSB1bml0dGVzdC5UZXN0UmVzdWx0IGluc3RhbmNlcyBubyBsb25nZXIgc3RvcmUgcmVmZXJlbmNlcyB0byB0cmFjZWJhY2tzCiAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCiAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgoKVG9vbHMKLS0tLS0KCi0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CiAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgoKQnVpbGQKLS0tLS0KCi0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwogIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhwZXJpbWVudGluZyB3aXRoIENhcmJvbiBvciBDb2NvYS4KICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgoKQyBBUEkKLS0tLS0KCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0RpcihvYmopLCBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKS4KCi0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwogIGNhbGxlcnMgY2hlY2tlZCBmb3IgaXQuICBJdCdzIG1vcmUgbGlrZWx5IHRvIGZhaWwgbm93LCBiZWNhdXNlIG92ZXJmbG93CiAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazo6CgogICAgICBkb3VibGUgeCA9IFB5TG9uZ19Bc0RvdWJsZShzb21lX2xvbmdfb2JqZWN0KTsKICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CgkgICAgICAvKiBUaGUgY29udmVyc2lvbiBmYWlsZWQuICovCiAgICAgIH0KCi0gVGhlIEdDIEFQSSBoYXMgYmVlbiBjaGFuZ2VkLiAgRXh0ZW5zaW9ucyB0aGF0IHVzZSB0aGUgb2xkIEFQSSB3aWxsIHN0aWxsCiAgY29tcGlsZSBidXQgd2lsbCBub3QgcGFydGljaXBhdGUgaW4gR0MuICBUbyB1cGdyYWRlIGFuIGV4dGVuc2lvbgogIG1vZHVsZToKCiAgICAtIHJlbmFtZSBQeV9UUEZMQUdTX0dDIHRvIFB5VFBGTEFHU19IQVZFX0dDCgogICAgLSB1c2UgUHlPYmplY3RfR0NfTmV3IG9yIFB5T2JqZWN0X0dDX05ld1ZhciB0byBhbGxvY2F0ZSBvYmplY3RzIGFuZAogICAgICBQeU9iamVjdF9HQ19EZWwgdG8gZGVhbGxvY2F0ZSB0aGVtCgogICAgLSByZW5hbWUgUHlPYmplY3RfR0NfSW5pdCB0byBQeU9iamVjdF9HQ19UcmFjayBhbmQgUHlPYmplY3RfR0NfRmluaQogICAgICB0byBQeU9iamVjdF9HQ19VblRyYWNrCgogICAgLSByZW1vdmUgUHlHQ19IRUFEX1NJWkUgZnJvbSBvYmplY3Qgc2l6ZSBjYWxjdWxhdGlvbnMKCiAgICAtIHJlbW92ZSBjYWxscyB0byBQeU9iamVjdF9BU19HQyBhbmQgUHlPYmplY3RfRlJPTV9HQwoKLSBUd28gbmV3IGZ1bmN0aW9uczogUHlTdHJpbmdfRnJvbUZvcm1hdCgpIGFuZCBQeVN0cmluZ19Gcm9tRm9ybWF0VigpLgogIFRoZXNlIGNhbiBiZSB1c2VkIHNhZmVseSB0byBjb25zdHJ1Y3Qgc3RyaW5nIG9iamVjdHMgZnJvbSBhCiAgc3ByaW50Zi1zdHlsZSBmb3JtYXQgc3RyaW5nIChzaW1pbGFyIHRvIHRoZSBmb3JtYXQgc3RyaW5nIHN1cHBvcnRlZAogIGJ5IFB5RXJyX0Zvcm1hdCgpKS4KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKLSBTdGVwaGVuIEhhbnNlbiBjb250cmlidXRlZCBwYXRjaGVzIHN1ZmZpY2llbnQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZQogIHVuZGVyIEJvcmxhbmQgQyAoV2luZG93cyksIGJ1dCBoZSByZXBvcnRzIHByb2JsZW1zIHJ1bm5pbmcgaXQgYW5kIHJhbgogIG91dCBvZiB0aW1lIHRvIGNvbXBsZXRlIHRoZSBwb3J0LiAgVm9sdW50ZWVycz8gIEV4cGVjdCBhIE1lbW9yeUVycm9yCiAgd2hlbiBpbXBvcnRpbmcgdGhlIHR5cGVzIG1vZHVsZTsgdGhpcyBpcyBwcm9iYWJseSBzaGFsbG93LCBhbmQKICBjYXVzaW5nIGxhdGVyIGZhaWx1cmVzIHRvby4KClRlc3RzCi0tLS0tCgpXaW5kb3dzCi0tLS0tLS0KCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IGlzIG5vdyBlbmFibGVkIG9uIFdpbjMyIHBsYXRmb3JtcyBhcyB3ZWxsIGFzIG9uCiAgV2luNjQuICBUaGlzIG1lYW5zIHRoYXQsIGZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBmLnRlbGwoKSBhbmQgZi5zZWVrKCkKICB0byBtYW5pcHVsYXRlIGZpbGVzIGxhcmdlciB0aGFuIDIgZ2lnYWJ5dGVzIChwcm92aWRlZCB5b3UgaGF2ZSBlbm91Z2gKICBkaXNrIHNwYWNlLCBhbmQgYXJlIHVzaW5nIGEgV2luZG93cyBmaWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgbGFyZ2UKICBwYXJ0aXRpb25zKS4gIFdpbmRvd3MgZmlsZXN5c3RlbSBsaW1pdHM6ICBGQVQgaGFzIGEgMkdCIChnaWdhYnl0ZSkKICBmaWxlc2l6ZSBsaW1pdCwgYW5kIGxhcmdlIGZpbGUgc3VwcG9ydCBtYWtlcyBubyBkaWZmZXJlbmNlIHRoZXJlLgogIEZBVDMyJ3MgbGltaXQgaXMgNEdCLCBhbmQgZmlsZXMgPj0gMkdCIGFyZSBlYXNpZXIgdG8gdXNlIGZyb20gUHl0aG9uIG5vdy4KICBOVEZTIGhhcyBubyBwcmFjdGljYWwgbGltaXQgb24gZmlsZSBzaXplLCBhbmQgZmlsZXMgb2YgYW55IHNpemUgY2FuIGJlCiAgdXNlZCBmcm9tIFB5dGhvbiBub3cuCgotIFRoZSB3OXhwb3BlbiBoYWNrIGlzIG5vdyB1c2VkIG9uIFdpbmRvd3MgTlQgYW5kIDIwMDAgdG9vIHdoZW4gQ09NUFNQRUMKICBwb2ludHMgdG8gY29tbWFuZC5jb20gKHBhdGNoIGZyb20gQnJpYW4gUXVpbmxhbikuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgRGF0ZTogMjItQXVnLTIwMDEqCgpCdWlsZAotLS0tLQoKLSBUaW0gUGV0ZXJzIGRldmVsb3BlZCBhIGJyYW5kIG5ldyBXaW5kb3dzIGluc3RhbGxlciB1c2luZyBXaXNlIDguMSwKICBnZW5lcm91c2x5IGRvbmF0ZWQgdG8gdXMgYnkgV2lzZSBTb2x1dGlvbnMuCgotIGNvbmZpZ3VyZSBzdXBwb3J0cyBhIG5ldyBvcHRpb24gLS1lbmFibGUtdW5pY29kZSwgd2l0aCB0aGUgdmFsdWVzCiAgdWNzMiBhbmQgdWNzNCAobmV3IGluIDIuMmExKS4gV2l0aCAtLWRpc2FibGUtdW5pY29kZSwgdGhlIFVuaWNvZGUKICB0eXBlIGFuZCBzdXBwb3J0aW5nIGNvZGUgaXMgY29tcGxldGVseSByZW1vdmVkIGZyb20gdGhlIGludGVycHJldGVyLgoKLSBBIG5ldyBjb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLWZyYW1ld29yayBidWlsZHMgYSBNYWMgT1MgWCBmcmFtZXdvcmssCiAgd2hpY2ggIm1ha2UgZnJhbWV3b3JraW5zdGFsbCIgd2lsbCBpbnN0YWxsLiBUaGlzIHByb3ZpZGVzIGEgc3RhcnRpbmcKICBwb2ludCBmb3IgbW9yZSBtYWMtbGlrZSBmdW5jdGlvbmFsaXR5LCBqb2luIHB5dGhvbm1hYy1zaWdAcHl0aG9uLm9yZwogIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nLgoKLSBUaGUgTmVYVCBwbGF0Zm9ybSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgoKLSBUaGUgJ25ldycgbW9kdWxlIGlzIG5vdyBzdGF0aWNhbGx5IGxpbmtlZC4KClRvb2xzCi0tLS0tCgotIFRoZSBuZXcgVG9vbHMvc2NyaXB0cy9jbGVhbmZ1dHVyZS5weSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5CiAgZWRpdCBvdXQgb2Jzb2xldGUgZnV0dXJlIHN0YXRlbWVudHMgZnJvbSBQeXRob24gc291cmNlIGNvZGUuICBTZWUKICB0aGUgbW9kdWxlIGRvY3N0cmluZyBmb3IgZGV0YWlscy4KClRlc3RzCi0tLS0tCgotIHJlZ3J0ZXN0LnB5IG5vdyBrbm93cyB3aGljaCB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgc2tpcHBlZCBvbiBzb21lCiAgcGxhdGZvcm1zLCBhbGxvd2luZyB0byBnaXZlIGNsZWFyZXIgdGVzdCByZXN1bHQgb3V0cHV0LiAgcmVncnRlc3QKICBhbHNvIGhhcyBvcHRpb25hbCAtLXVzZS8tdSBzd2l0Y2ggdG8gcnVuIG5vcm1hbGx5IGRpc2FibGVkIHRlc3RzCiAgd2hpY2ggcmVxdWlyZSBuZXR3b3JrIGFjY2VzcyBvciBjb25zdW1lIHNpZ25pZmljYW50IGRpc2sgcmVzb3VyY2VzLgoKLSBTZXZlcmFsIG5ldyB0ZXN0cyBpbiB0aGUgc3RhbmRhcmQgdGVzdCBzdWl0ZSwgd2l0aCBzcGVjaWFsIHRoYW5rcyB0bwogIE5pY2sgTWF0aGV3c29uLgoKQ29yZQotLS0tCgotIFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciAvLyBoYXMgYmVlbiBhZGRlZCBhcyBvdXRsaW5lZCBpbiBQRVAKICAyMzguICBUaGUgLyBvcGVyYXRvciBzdGlsbCBwcm92aWRlcyBjbGFzc2ljIGRpdmlzaW9uIChhbmQgd2lsbCB1bnRpbAogIFB5dGhvbiAzLjApIHVubGVzcyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIgaXMgaW5jbHVkZWQsIGluCiAgd2hpY2ggY2FzZSB0aGUgLyBvcGVyYXRvciB3aWxsIHByb3ZpZGUgdHJ1ZSBkaXZpc2lvbi4gIFRoZSBvcGVyYXRvcgogIG1vZHVsZSBwcm92aWRlcyB0cnVlZGl2KCkgYW5kIGZsb29yZGl2KCkgZnVuY3Rpb25zLiAgQXVnbWVudGVkCiAgYXNzaWdubWVudCB2YXJpYW50cyBhcmUgaW5jbHVkZWQsIGFzIGFyZSB0aGUgZXF1aXZhbGVudCBvdmVybG9hZGFibGUKICBtZXRob2RzIGFuZCBDIEFQSSBtZXRob2RzLiAgU2VlIHRoZSBQRVAgZm9yIGEgZnVsbCBkaXNjdXNzaW9uOgogIDxodHRwOi8vcHl0aG9uLnNmLm5ldC9wZXBzL3BlcC0wMjM4Lmh0bWw+CgotIEZ1dHVyZSBzdGF0ZW1lbnRzIGFyZSBub3cgZWZmZWN0aXZlIGluIHNpbXVsYXRlZCBpbnRlcmFjdGl2ZSBzaGVsbHMKICAobGlrZSBJRExFKS4gIFRoaXMgc2hvdWxkICJqdXN0IHdvcmsiIGJ5IG1hZ2ljLCBidXQgcmVhZCBNaWNoYWVsCiAgSHVkc29uJ3MgIkZ1dHVyZSBzdGF0ZW1lbnRzIGluIHNpbXVsYXRlZCBzaGVsbHMiIFBFUCAyNjQgZm9yIGZ1bGwKICBkZXRhaWxzOiAgPGh0dHA6Ly9weXRob24uc2YubmV0L3BlcHMvcGVwLTAyNjQuaHRtbD4uCgotIFRoZSB0eXBlL2NsYXNzIHVuaWZpY2F0aW9uIChQRVAgMjUyLTI1Mykgd2FzIGludGVncmF0ZWQgaW50byB0aGUKICB0cnVuayBhbmQgaXMgbm90IHNvIHRlbnRhdGl2ZSBhbnkgbW9yZSAodGhlIGV4YWN0IHNwZWNpZmljYXRpb24gb2YKICBzb21lIGZlYXR1cmVzIGlzIHN0aWxsIHRlbnRhdGl2ZSkuICBBIGxvdCBvZiB3b3JrIGhhcyBkb25lIG9uIGZpeGluZwogIGJ1Z3MgYW5kIGFkZGluZyByb2J1c3RuZXNzIGFuZCBmZWF0dXJlcyAocGVyZm9ybWFuY2Ugc3RpbGwgaGFzIHRvCiAgY29tZSBhIGxvbmcgd2F5KS4KCi0gV2FybmluZ3MgYWJvdXQgYSBtaXNtYXRjaCBpbiB0aGUgUHl0aG9uIEFQSSBkdXJpbmcgZXh0ZW5zaW9uIGltcG9ydAogIG5vdyB1c2UgdGhlIFB5dGhvbiB3YXJuaW5nIGZyYW1ld29yayAod2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8KICB3cml0ZSBmaWx0ZXJzIGZvciB0aGVzZSB3YXJuaW5ncykuCgotIEEgZnVuY3Rpb24ncyBfX2RpY3RfXyAoYWthIGZ1bmNfZGljdCkgd2lsbCBub3cgYWx3YXlzIGJlIGEKICBkaWN0aW9uYXJ5LiAgSXQgdXNlZCB0byBiZSBwb3NzaWJsZSB0byBkZWxldGUgaXQgb3Igc2V0IGl0IHRvIE5vbmUsCiAgYnV0IG5vdyBib3RoIGFjdGlvbnMgcmFpc2UgVHlwZUVycm9ycy4gIEl0IGlzIHN0aWxsIGxlZ2FsIHRvIHNldCBpdAogIHRvIGEgZGljdGlvbmFyeSBvYmplY3QuICBHZXR0aW5nIGZ1bmMuX19kaWN0X18gYmVmb3JlIGFueSBhdHRyaWJ1dGVzCiAgaGF2ZSBiZWVuIGFzc2lnbmVkIG5vdyByZXR1cm5zIGFuIGVtcHR5IGRpY3Rpb25hcnkgaW5zdGVhZCBvZiBOb25lLgoKLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtRSwgd2FzIGFkZGVkIHdoaWNoIGRpc2FibGVzIHRoZSB1c2Ugb2YKICBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzLCBvciBhdCBsZWFzdCB0aG9zZSB0aGF0IGFyZSBzcGVjaWZpY2FsbHkKICBzaWduaWZpY2FudCB0byBQeXRob24uICBVc3VhbGx5IHRob3NlIGhhdmUgYSBuYW1lIHN0YXJ0aW5nIHdpdGgKICAiUFlUSE9OIi4gIFRoaXMgd2FzIHVzZWQgdG8gZml4IGEgcHJvYmxlbSB3aGVyZSB0aGUgdGVzdHMgZmFpbCBpZgogIHRoZSB1c2VyIGhhcHBlbnMgdG8gaGF2ZSBQWVRIT05IT01FIG9yIFBZVEhPTlBBVEggcG9pbnRpbmcgdG8gYW4KICBvbGRlciBkaXN0cmlidXRpb24uCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gTmV3IGNsYXNzIERpZmZlciBhbmQgbmV3IGZ1bmN0aW9ucyBuZGlmZigpIGFuZCByZXN0b3JlKCkgaW4gZGlmZmxpYi5weS4KICBUaGVzZSBwYWNrYWdlIHRoZSBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIHBvcHVsYXIgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSwKICBmb3IgcHJvZ3JhbW1hdGljIHJldXNlLgoKLSBOZXcgZnVuY3Rpb24geG1sLnNheC5zYXh1dGlscy5xdW90ZWF0dHIoKTogIFF1b3RlIGFuIFhNTCBhdHRyaWJ1dGUKICB2YWx1ZSB1c2luZyB0aGUgbWluaW1hbCBxdW90aW5nIHJlcXVpcmVkIGZvciB0aGUgdmFsdWU7IG1vcmUKICByZWxpYWJsZSB0aGFuIHVzaW5nIHhtbC5zYXguc2F4dXRpbHMuZXNjYXBlKCkgZm9yIGF0dHJpYnV0ZSB2YWx1ZXMuCgotIFJlYWRsaW5lIGNvbXBsZXRpb24gc3VwcG9ydCBmb3IgY21kLkNtZCB3YXMgYWRkZWQuCgotIENhbGxpbmcgb3MudGVtcG5hbSgpIG9yIG9zLnRtcG5hbSgpIGdlbmVyYXRlIFJ1bnRpbWVXYXJuaW5ncy4KCi0gQWRkZWQgZnVuY3Rpb24gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUoKQoKLSBBZGRlZCBLYS1QaW5nIFllZSdzIGNnaXRiLnB5IG1vZHVsZS4KCi0gVGhlICduZXcnIG1vZHVsZSBub3cgZXhwb3NlcyB0aGUgQ09feHh4IGZsYWdzLgoKLSBUaGUgZ2MgbW9kdWxlIG9mZmVycyB0aGUgZ2V0X3JlZmVyZW50cyBmdW5jdGlvbi4KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKQyBBUEkKLS0tLS0KCi0gVHdvIG5ldyBBUElzIFB5T1Nfc25wcmludGYoKSBhbmQgUHlPU192c25wcmludGYoKSB3ZXJlIGFkZGVkCiAgd2hpY2ggcHJvdmlkZSBhIGNyb3NzLXBsYXRmb3JtIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlCiAgcmVsYXRpdmVseSBuZXcgc25wcmludGYoKS92c25wcmludGYoKSBDIGxpYiBBUElzLiBJbiBjb250cmFzdCB0bwogIHRoZSBzdGFuZGFyZCBzcHJpbnRmKCkgYW5kIHZzcHJpbnRmKCkgQyBsaWIgQVBJcywgdGhlc2UgdmVyc2lvbnMKICBhcHBseSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIHVzZWQgYnVmZmVyIHdoaWNoIGVuaGFuY2VzIHByb3RlY3Rpb24KICBhZ2FpbnN0IGJ1ZmZlciBvdmVycnVucy4KCi0gVW5pY29kZSBBUElzIG5vdyB1c2UgbmFtZSBtYW5nbGluZyB0byBhc3N1cmUgdGhhdCBtaXhpbmcgaW50ZXJwcmV0ZXJzCiAgYW5kIGV4dGVuc2lvbnMgdXNpbmcgZGlmZmVyZW50IFVuaWNvZGUgd2lkdGhzIGlzIHJlbmRlcmVkIG5leHQgdG8KICBpbXBvc3NpYmxlLiBUcnlpbmcgdG8gaW1wb3J0IGFuIGluY29tcGF0aWJsZSBVbmljb2RlLWF3YXJlIGV4dGVuc2lvbgogIHdpbGwgcmVzdWx0IGluIGFuIEltcG9ydEVycm9yLiAgVW5pY29kZSBleHRlbnNpb25zIHdyaXRlcnMgbXVzdCBtYWtlCiAgc3VyZSB0byBjaGVjayB0aGUgVW5pY29kZSB3aWR0aCBjb21wYXRpYmlsaXR5IGluIHRoZWlyIGV4dGVuc2lvbnMgYnkKICB1c2luZyBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hbmdsZWQgVW5pY29kZSBBUElzIGluIHRoZSBleHRlbnNpb24uCgotIFR3byBuZXcgZmxhZ3MgTUVUSF9OT0FSR1MgYW5kIE1FVEhfTyBhcmUgYXZhaWxhYmxlIGluIG1ldGhvZCBkZWZpbml0aW9uCiAgdGFibGVzIHRvIHNpbXBsaWZ5IGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgd2l0aCBubyBhcmd1bWVudHMgYW5kIGEKICBzaW5nbGUgdW50eXBlZCBhcmd1bWVudC4gQ2FsbGluZyBzdWNoIG1ldGhvZHMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbgogIGNhbGxpbmcgY29ycmVzcG9uZGluZyBNRVRIX1ZBUkFSR1MgbWV0aG9kcy4gTUVUSF9PTERBUkdTIGlzIG5vdwogIGRlcHJlY2F0ZWQuCgpXaW5kb3dzCi0tLS0tLS0KCi0gImltcG9ydCBtb2R1bGUiIG5vdyBjb21waWxlcyBtb2R1bGUucHl3IGlmIGl0IGV4aXN0cyBhbmQgbm90aGluZyBlbHNlCiAgcmVsZXZhbnQgaXMgZm91bmQuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMTgtSnVsLTIwMDEqCgpDb3JlCi0tLS0KCi0gVEVOVEFUSVZFTFksIGEgbGFyZ2UgYW1vdW50IG9mIGNvZGUgaW1wbGVtZW50aW5nIG11Y2ggb2Ygd2hhdCdzCiAgZGVzY3JpYmVkIGluIFBFUCAyNTIgKE1ha2luZyBUeXBlcyBMb29rIE1vcmUgTGlrZSBDbGFzc2VzKSBhbmQgUEVQCiAgMjUzIChTdWJ0eXBpbmcgQnVpbHQtaW4gVHlwZXMpIHdhcyBhZGRlZC4gIFRoaXMgd2lsbCBiZSByZWxlYXNlZAogIHdpdGggUHl0aG9uIDIuMmExLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkKICB0aHJvdWdoIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvLiAgVGhlIHB1cnBvc2Ugb2YgcmVsZWFzaW5nIHRoaXMKICB3aXRoIFB5dGhvbiAyLjJhMSBpcyB0byB0ZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXQgaXMKICBwb3NzaWJsZSwgdGhvdWdoIG5vdCBsaWtlbHksIHRoYXQgYSBkZWNpc2lvbiBpcyBtYWRlIG5vdCB0byByZWxlYXNlCiAgdGhpcyBjb2RlIGFzIHBhcnQgb2YgMi4yIGZpbmFsLCBpZiBhbnkgc2VyaW91cyBiYWNrd2FyZHMKICBpbmNvbXBhdGliaWxpdGllcyBhcmUgZm91bmQgZHVyaW5nIGFscGhhIHRlc3RpbmcgdGhhdCBjYW5ub3QgYmUKICByZXBhaXJlZC4KCi0gR2VuZXJhdG9ycyB3ZXJlIGFkZGVkOyB0aGlzIGlzIGEgbmV3IHdheSB0byBjcmVhdGUgYW4gaXRlcmF0b3IgKHNlZQogIGJlbG93KSB1c2luZyB3aGF0IGxvb2tzIGxpa2UgYSBzaW1wbGUgZnVuY3Rpb24gY29udGFpbmluZyBvbmUgb3IKICBtb3JlICd5aWVsZCcgc3RhdGVtZW50cy4gIFNlZSBQRVAgMjU1LiAgU2luY2UgdGhpcyBhZGRzIGEgbmV3CiAga2V5d29yZCB0byB0aGUgbGFuZ3VhZ2UsIHRoaXMgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgYnkgaW5jbHVkaW5nIGEKICBmdXR1cmUgc3RhdGVtZW50OiAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzIiAoc2VlIFBFUCAyMzYpLgogIEdlbmVyYXRvcnMgd2lsbCBiZWNvbWUgYSBzdGFuZGFyZCBmZWF0dXJlIGluIGEgZnV0dXJlIHJlbGVhc2UKICAocHJvYmFibHkgMi4zKS4gIFdpdGhvdXQgdGhpcyBmdXR1cmUgc3RhdGVtZW50LCAneWllbGQnIHJlbWFpbnMgYW4KICBvcmRpbmFyeSBpZGVudGlmaWVyLCBidXQgYSB3YXJuaW5nIGlzIGlzc3VlZCBlYWNoIHRpbWUgaXQgaXMgdXNlZC4KICAoVGhlc2Ugd2FybmluZ3MgY3VycmVudGx5IGRvbid0IGNvbmZvcm0gdG8gdGhlIHdhcm5pbmdzIGZyYW1ld29yayBvZgogIFBFUCAyMzA7IHdlIGludGVuZCB0byBmaXggdGhpcyBpbiAyLjJhMi4pCgotIFRoZSBVVEYtMTYgY29kZWMgd2FzIG1vZGlmaWVkIHRvIGJlIG1vcmUgUkZDIGNvbXBsaWFudC4gSXQgd2lsbCBub3cKICBvbmx5IHJlbW92ZSBCT00gY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyBhbmQgdGhlbgogIG9ubHkgaWYgcnVubmluZyBpbiBuYXRpdmUgbW9kZSAoVVRGLTE2LUxFIGFuZCAtQkUgd29uJ3QgcmVtb3ZlIGEKICBsZWFkaW5nIEJNTyBjaGFyYWN0ZXIpLgoKLSBTdHJpbmdzIG5vdyBoYXZlIGEgbmV3IG1ldGhvZCAuZGVjb2RlKCkgdG8gY29tcGxlbWVudCB0aGUgYWxyZWFkeQogIGV4aXN0aW5nIC5lbmNvZGUoKSBtZXRob2QuIFRoZXNlIHR3byBtZXRob2RzIHByb3ZpZGUgZGlyZWN0IGFjY2VzcwogIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRlY29kZXJzIGFuZCBlbmNvZGVycyBvZiB0aGUgcmVnaXN0ZXJlZCBjb2RlY3MuCgogIFRvIGVuaGFuY2UgdGhlIHVzYWJpbGl0eSBvZiB0aGUgLmVuY29kZSgpIG1ldGhvZCwgdGhlIHNwZWNpYWwKICBjYXNpbmcgb2YgVW5pY29kZSBvYmplY3QgcmV0dXJuIHZhbHVlcyB3YXMgZHJvcHBlZCAoVW5pY29kZSBvYmplY3RzCiAgd2VyZSBhdXRvLW1hZ2ljYWxseSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KCiAgQm90aCBtZXRob2RzIHdpbGwgbm93IHJldHVybiB3aGF0ZXZlciB0aGUgY29kZWMgaW4gY2hhcmdlIG9mIHRoZQogIHJlcXVlc3RlZCBlbmNvZGluZyByZXR1cm5zIGFzIG9iamVjdCwgZS5nLiBVbmljb2RlIGNvZGVjcyB3aWxsCiAgcmV0dXJuIFVuaWNvZGUgb2JqZWN0cyB3aGVuIGRlY29kaW5nIGlzIHJlcXVlc3RlZCAoIuT2/CIuZGVjb2RlKCJsYXRpbi0xIikKICB3aWxsIHJldHVybiB1IuT2/CIpLiBUaGlzIGVuYWJsZXMgY29kZWMgd3JpdGVyIHRvIGNyZWF0ZSBjb2RlY3MKICBmb3IgdmFyaW91cyBzaW1wbGUgdG8gdXNlIGNvbnZlcnNpb25zLgoKICBOZXcgY29kZWNzIHdlcmUgYWRkZWQgdG8gZGVtb25zdHJhdGUgdGhlc2UgbmV3IGZlYXR1cmVzICh0aGUgLmVuY29kZSgpCiAgYW5kIC5kZWNvZGUoKSBjb2x1bW5zIGluZGljYXRlIHRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBvYmplY3RzKToKCiAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8TmFtZSAgICAgfCAuZW5jb2RlKCkgfCAuZGVjb2RlKCkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgfAogICs9PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCiAgfHV1ICAgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgVVUgY29kZWMgKGUuZy4gZm9yIGVtYWlsKSAgIHwKICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogIHxiYXNlNjQgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IGJhc2U2NCBjb2RlYyAgICAgICAgICAgICAgICB8CiAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8cXVvcHJpICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBxdW90ZWQtcHJpbnRhYmxlIGNvZGVjICAgICAgfAogICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgfHpsaWIgICAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgemxpYiBjb21wcmVzc2lvbiAgICAgICAgICAgIHwKICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogIHxoZXggICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IDItYnl0ZSBoZXggY29kZWMgICAgICAgICAgICB8CiAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8cm90LTEzICAgfCBzdHJpbmcgICAgfCBVbmljb2RlICAgfCBST1QtMTMgVW5pY29kZSBjaGFybWFwIGNvZGVjfAogICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgotIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbm93IHN1cHBvcnQgdGhlIGNvbmNlcHQgb2YgYSBkZWZhdWx0IFVuaWNvZGUKICBlbmNvZGluZyBmb3IgZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4gIE5vdGFibHksIFdpbmRvd3Mgc3VwcG9ydHMgJ21iY3MnCiAgYXMgdGhlIGRlZmF1bHQuICBUaGUgTWFjaW50b3NoIHdpbGwgYWxzbyBhZG9wdCB0aGlzIGNvbmNlcHQgaW4gdGhlIG1lZGl1bQogIHRlcm0sIGFsdGhvdWdoIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGF0IHBsYXRmb3JtIHdpbGwgYmUgb3RoZXIgdGhhbgogICdtYmNzJy4KCiAgT24gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHN1cHBvcnQgbm9uLUFTQ0lJIGZpbGVuYW1lcywgaXQgaXMgY29tbW9uIGZvcgogIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmaWxlbmFtZXMgKHN1Y2ggYXMgb3MubGlzdGRpcigpKSB0byByZXR1cm4gUHl0aG9uCiAgc3RyaW5nIG9iamVjdHMgcHJlLWVuY29kZWQgdXNpbmcgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgZm9yCiAgdGhlIHBsYXRmb3JtLiAgQXMgdGhpcyBlbmNvZGluZyBpcyBsaWtlbHkgdG8gYmUgZGlmZmVyZW50IGZyb20gUHl0aG9uJ3MKICBkZWZhdWx0IGVuY29kaW5nLCBjb252ZXJ0aW5nIHRoaXMgbmFtZSB0byBhIFVuaWNvZGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nCiAgaXQgYmFjayB0byB0aGUgT3BlcmF0aW5nIFN5c3RlbSB3b3VsZCByZXN1bHQgaW4gYSBVbmljb2RlIGVycm9yLCBhcyBQeXRob24KICB3b3VsZCBhdHRlbXB0IHRvIHVzZSBpdHMgZGVmYXVsdCBlbmNvZGluZyAoZ2VuZXJhbGx5IEFTQ0lJKSByYXRoZXIgdGhhbgogIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0uCgogIEluIGdlbmVyYWwsIHRoaXMgY2hhbmdlIHNpbXBseSByZW1vdmVzIHN1cnByaXNlcyB3aGVuIHdvcmtpbmcgd2l0aAogIFVuaWNvZGUgYW5kIHRoZSBmaWxlIHN5c3RlbSwgbWFraW5nIHRoZXNlIG9wZXJhdGlvbnMgd29yayBhcyB5b3UgZXhwZWN0LAogIGluY3JlYXNpbmcgdGhlIHRyYW5zcGFyZW5jeSBvZiBVbmljb2RlIG9iamVjdHMgaW4gdGhpcyBjb250ZXh0LgogIFNlZSBbPz8/P10gZm9yIG1vcmUgZGV0YWlscywgaW5jbHVkaW5nIGV4YW1wbGVzLgoKLSBGbG9hdCAoYW5kIGNvbXBsZXgpIGxpdGVyYWxzIGluIHNvdXJjZSBjb2RlIHdlcmUgZXZhbHVhdGVkIHRvIGZ1bGwKICBwcmVjaXNpb24gb25seSB3aGVuIHJ1bm5pbmcgZnJvbSBhIC5weSBmaWxlOyB0aGUgc2FtZSBjb2RlIGxvYWRlZCBmcm9tIGEKICAucHljIChvciAucHlvKSBmaWxlIGNvdWxkIHN1ZmZlciBudW1lcmljIGRpZmZlcmVuY2VzIHN0YXJ0aW5nIGF0IGFib3V0IHRoZQogIDEydGggc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdC4gIEZvciBleGFtcGxlLCBvbiBhIG1hY2hpbmUgd2l0aCBJRUVFLTc1NAogIGZsb2F0aW5nIGFyaXRobWV0aWMsCgogICAgICB4ID0gOTAwNzE5OTI1NDc0MDk5Mi4wCiAgICAgIHByaW50IGxvbmcoeCkKCiAgcHJpbnRlZCA5MDA3MTk5MjU0NzQwOTkyIGlmIHJ1biBkaXJlY3RseSBmcm9tIC5weSwgYnV0IDkwMDcxOTkyNTQ3NDAwMDAKICBpZiBmcm9tIGEgY29tcGlsZWQgKC5weWMgb3IgLnB5bykgZmlsZS4gIFRoaXMgd2FzIGR1ZSB0byBtYXJzaGFsIHVzaW5nCiAgc3RyKGZsb2F0KSBpbnN0ZWFkIG9mIHJlcHIoZmxvYXQpIHdoZW4gYnVpbGRpbmcgY29kZSBvYmplY3RzLiAgbWFyc2hhbAogIG5vdyB1c2VzIHJlcHIoZmxvYXQpIGluc3RlYWQsIHdoaWNoIHNob3VsZCByZXByb2R1Y2UgZmxvYXRzIHRvIGZ1bGwKICBtYWNoaW5lIHByZWNpc2lvbiAoYXNzdW1pbmcgdGhlIHBsYXRmb3JtIEMgZmxvYXQ8LT5zdHJpbmcgSS9PIGNvbnZlcnNpb24KICBmdW5jdGlvbnMgYXJlIG9mIGdvb2QgcXVhbGl0eSkuCgogIFRoaXMgbWF5IGNhdXNlIGZsb2F0aW5nLXBvaW50IHJlc3VsdHMgdG8gY2hhbmdlIGluIHNvbWUgY2FzZXMsIGFuZAogIHVzdWFsbHkgZm9yIHRoZSBiZXR0ZXIsIGJ1dCBtYXkgYWxzbyBjYXVzZSBudW1lcmljYWxseSB1bnN0YWJsZQogIGFsZ29yaXRobXMgdG8gYnJlYWsuCgotIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkaWN0cyBzdWZmZXJzIGZld2VyIGNvbGxpc2lvbnMsIHdoaWNoIGhhcyBzcGVlZAogIGJlbmVmaXRzLiAgSG93ZXZlciwgdGhlIG9yZGVyIGluIHdoaWNoIGRpY3QgZW50cmllcyBhcHBlYXIgaW4gZGljdC5rZXlzKCksCiAgZGljdC52YWx1ZXMoKSBhbmQgZGljdC5pdGVtcygpIG1heSBkaWZmZXIgZnJvbSBwcmV2aW91cyByZWxlYXNlcyBmb3IgYQogIGdpdmVuIGRpY3QuICBOb3RoaW5nIGlzIGRlZmluZWQgYWJvdXQgdGhpcyBvcmRlciwgc28gbm8gcHJvZ3JhbSBzaG91bGQKICByZWx5IG9uIGl0LiAgTmV2ZXJ0aGVsZXNzLCBpdCdzIGVhc3kgdG8gd3JpdGUgdGVzdCBjYXNlcyB0aGF0IHJlbHkgb24gdGhlCiAgb3JkZXIgYnkgYWNjaWRlbnQsIHR5cGljYWxseSBiZWNhdXNlIG9mIHByaW50aW5nIHRoZSBzdHIoKSBvciByZXByKCkgb2YgYQogIGRpY3QgdG8gYW4gImV4cGVjdGVkIHJlc3VsdHMiIGZpbGUuICBTZWUgTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5J3MgbmV3CiAgc29ydGRpY3QoZGljdCkgZnVuY3Rpb24gZm9yIGEgc2ltcGxlIHdheSB0byBkaXNwbGF5IGEgZGljdCBpbiBzb3J0ZWQKICBvcmRlci4KCi0gTWFueSBvdGhlciBzbWFsbCBjaGFuZ2VzIHRvIGRpY3RzIHdlcmUgbWFkZSwgcmVzdWx0aW5nIGluIGZhc3RlcgogIG9wZXJhdGlvbiBhbG9uZyB0aGUgbW9zdCBjb21tb24gY29kZSBwYXRocy4KCi0gRGljdGlvbmFyeSBvYmplY3RzIG5vdyBzdXBwb3J0IHRoZSAiaW4iIG9wZXJhdG9yOiAieCBpbiBkaWN0IiBtZWFucwogIHRoZSBzYW1lIGFzIGRpY3QuaGFzX2tleSh4KS4KCi0gVGhlIHVwZGF0ZSgpIG1ldGhvZCBvZiBkaWN0aW9uYXJpZXMgbm93IGFjY2VwdHMgZ2VuZXJpYyBtYXBwaW5nCiAgb2JqZWN0cy4gIFNwZWNpZmljYWxseSB0aGUgYXJndW1lbnQgb2JqZWN0IG11c3Qgc3VwcG9ydCB0aGUgLmtleXMoKQogIGFuZCBfX2dldGl0ZW1fXygpIG1ldGhvZHMuICBUaGlzIGFsbG93cyB5b3UgdG8gc2F5LCBmb3IgZXhhbXBsZSwKICB7fS51cGRhdGUoVXNlckRpY3QoKSkKCi0gSXRlcmF0b3JzIHdlcmUgYWRkZWQ7IHRoaXMgaXMgYSBnZW5lcmFsaXplZCB3YXkgb2YgcHJvdmlkaW5nIHZhbHVlcwogIHRvIGEgZm9yIGxvb3AuICBTZWUgUEVQIDIzNC4gIFRoZXJlJ3MgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gaXRlcigpCiAgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgdGhlIG5leHQgdmFsdWUKICBmcm9tIGFuIGl0ZXJhdG9yIHVzaW5nIHRoZSBuZXh0KCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZQogIHRwX2l0ZXJuZXh0IHNsb3QgKGluIEMpLiAgVGhlcmUncyBhIG5ldyBwcm90b2NvbCB0byBnZXQgaXRlcmF0b3JzCiAgdXNpbmcgdGhlIF9faXRlcl9fKCkgbWV0aG9kIChpbiBQeXRob24pIG9yIHRoZSB0cF9pdGVyIHNsb3QgKGluIEMpLgogIEl0ZXJhdGluZyAoaS5lLiBhIGZvciBsb29wKSBvdmVyIGEgZGljdGlvbmFyeSBnZW5lcmF0ZXMgaXRzIGtleXMuCiAgSXRlcmF0aW5nIG92ZXIgYSBmaWxlIGdlbmVyYXRlcyBpdHMgbGluZXMuCgotIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgZ2VuZXJhbGl6ZWQgdG8gd29yayBuaWNlbHkgd2l0aCBpdGVyYXRvcgogIGFyZ3VtZW50czo6CgogICAgbWFwKCksIGZpbHRlcigpLCByZWR1Y2UoKSwgemlwKCkKICAgIGxpc3QoKSwgdHVwbGUoKSAoUHlTZXF1ZW5jZV9UdXBsZSgpIGFuZCBQeVNlcXVlbmNlX0Zhc3QoKSBpbiBDIEFQSSkKICAgIG1heCgpLCBtaW4oKQogICAgam9pbigpIG1ldGhvZCBvZiBzdHJpbmdzCiAgICBleHRlbmQoKSBtZXRob2Qgb2YgbGlzdHMKICAgICd4IGluIHknIGFuZCAneCBub3QgaW4geScgKFB5U2VxdWVuY2VfQ29udGFpbnMoKSBpbiBDIEFQSSkKICAgIG9wZXJhdG9yLmNvdW50T2YoKSAoUHlTZXF1ZW5jZV9Db3VudCgpIGluIEMgQVBJKQogICAgcmlnaHQtaGFuZCBzaWRlIG9mIGFzc2lnbm1lbnQgc3RhdGVtZW50cyB3aXRoIG11bHRpcGxlIHRhcmdldHMsIHN1Y2ggYXMgOjoKICAgICAgICB4LCB5LCB6ID0gc29tZV9pdGVyYWJsZV9vYmplY3RfcmV0dXJuaW5nX2V4YWN0bHlfM192YWx1ZXMKCi0gQWNjZXNzaW5nIG1vZHVsZSBhdHRyaWJ1dGVzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIChmb3IgZXhhbXBsZSwKICByYW5kb20ucmFuZG9tIG9yIG9zLnBhdGggb3IgeW91clB5dGhvbk1vZHVsZS55b3VyQXR0cmlidXRlKS4KCi0gQ29tcGFyaW5nIGRpY3Rpb25hcnkgb2JqZWN0cyB2aWEgPT0gYW5kICE9IGlzIGZhc3RlciwgYW5kIG5vdyB3b3JrcyBldmVuCiAgaWYgdGhlIGtleXMgYW5kIHZhbHVlcyBkb24ndCBzdXBwb3J0IGNvbXBhcmlzb25zIG90aGVyIHRoYW4gPT0uCgotIENvbXBhcmluZyBkaWN0aW9uYXJpZXMgaW4gd2F5cyBvdGhlciB0aGFuID09IGFuZCAhPSBpcyBzbG93ZXI6ICB0aGVyZSB3ZXJlCiAgaW5zZWN1cml0aWVzIGluIHRoZSBkaWN0IGNvbXBhcmlzb24gaW1wbGVtZW50YXRpb24gdGhhdCBjb3VsZCBjYXVzZSBQeXRob24KICB0byBjcmFzaCBpZiB0aGUgZWxlbWVudCBjb21wYXJpc29uIHJvdXRpbmVzIGZvciB0aGUgZGljdCBrZXlzIGFuZC9vcgogIHZhbHVlcyBtdXRhdGVkIHRoZSBkaWN0cy4gIE1ha2luZyB0aGUgY29kZSBidWxsZXRwcm9vZiBzbG93ZWQgaXQgZG93bi4KCi0gQ29sbGlzaW9ucyBpbiBkaWN0cyBhcmUgcmVzb2x2ZWQgdmlhIGEgbmV3IGFwcHJvYWNoLCB3aGljaCBjYW4gaGVscAogIGRyYW1hdGljYWxseSBpbiBiYWQgY2FzZXMuICBGb3IgZXhhbXBsZSwgbG9va2luZyB1cCBldmVyeSBrZXkgaW4gYSBkaWN0CiAgZCB3aXRoIGQua2V5cygpID09IFtpIDw8IDE2IGZvciBpIGluIHJhbmdlKDIwMDAwKV0gaXMgYXBwcm94aW1hdGVseSA1MDB4CiAgZmFzdGVyIG5vdy4gIFRoYW5rcyB0byBDaHJpc3RpYW4gVGlzbWVyIGZvciBwb2ludGluZyBvdXQgdGhlIGNhdXNlIGFuZAogIHRoZSBuYXR1cmUgb2YgYW4gZWZmZWN0aXZlIGN1cmUgKGxhc3QgRGVjZW1iZXIhIGJldHRlciBsYXRlIHRoYW4gbmV2ZXIpLgoKLSByZXByKCkgaXMgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKGRpY3QsIGxpc3QsIHR1cGxlKS4KCgpMaWJyYXJ5Ci0tLS0tLS0KCi0gVGhlIGNvbnN0YW50cyBhc2NpaV9sZXR0ZXJzLCBhc2NpaV9sb3dlcmNhc2UuIGFuZCBhc2NpaV91cHBlcmNhc2UKICB3ZXJlIGFkZGVkIHRvIHRoZSBzdHJpbmcgbW9kdWxlLiAgVGhlc2UgYSBsb2NhbGUtaW5kZXBlbmRlbnQKICBjb25zdGFudHMsIHVubGlrZSBsZXR0ZXJzLCBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2UuICBUaGVzZSBhcmUgbm93CiAgdXNlIGluIGFwcHJvcHJpYXRlIGxvY2F0aW9ucyBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KCi0gVGhlIGZsYWdzIHVzZWQgaW4gZGxvcGVuIGNhbGxzIGNhbiBub3cgYmUgY29uZmlndXJlZCB1c2luZwogIHN5cy5zZXRkbG9wZW5mbGFncyBhbmQgcXVlcmllZCB1c2luZyBzeXMuZ2V0ZGxvcGVuZmxhZ3MuCgotIEZyZWRyaWsgTHVuZGgncyB4bWxycGNsaWIgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuICBUaGlzCiAgcHJvdmlkZXMgZnVsbCBjbGllbnQtc2lkZSBYTUwtUlBDIHN1cHBvcnQuICBJbiBhZGRpdGlvbiwKICBEZW1vL3htbHJwYy8gY29udGFpbnMgdHdvIHNlcnZlciBmcmFtZXdvcmtzIChvbmUgU29ja2V0U2VydmVyLWJhc2VkLAogIG9uZSBhc3luY29yZS1iYXNlZCkuICBUaGFua3MgdG8gRXJpYyBSYXltb25kIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KCi0gVGhlIHhyYW5nZSgpIG9iamVjdCBpcyBzaW1wbGlmaWVkOiBpdCBubyBsb25nZXIgc3VwcG9ydHMgc2xpY2luZywKICByZXBldGl0aW9uLCBjb21wYXJpc29ucywgZWZmaWNpZW50ICdpbicgY2hlY2tpbmcsIHRoZSB0b2xpc3QoKQogIG1ldGhvZCwgb3IgdGhlIHN0YXJ0LCBzdG9wIGFuZCBzdGVwIGF0dHJpYnV0ZXMuICBTZWUgUEVQIDI2MC4KCi0gQSBuZXcgZnVuY3Rpb24gZm5tYXRjaC5maWx0ZXIgdG8gZmlsdGVyIGxpc3RzIG9mIGZpbGUgbmFtZXMgd2FzIGFkZGVkLgoKLSBjYWxlbmRhci5weSB1c2VzIG1vbnRoIGFuZCBkYXkgbmFtZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgoKLSBzdHJvcCBpcyBub3cgKnJlYWxseSogb2Jzb2xldGUgKHRoaXMgd2FzIGFubm91bmNlZCBiZWZvcmUgd2l0aCAxLjYpLAogIGFuZCBpc3N1ZXMgRGVwcmVjYXRpb25XYXJuaW5nIHdoZW4gdXNlZCAoZXhjZXB0IGZvciB0aGUgZm91ciBpdGVtcwogIHRoYXQgYXJlIHN0aWxsIGltcG9ydGVkIGludG8gc3RyaW5nLnB5KS4KCi0gQ29va2llLnB5IG5vdyBzb3J0cyBrZXkrdmFsdWUgcGFpcnMgYnkga2V5IGluIG91dHB1dCBzdHJpbmdzLgoKLSBwcHJpbnQuaXNyZWN1cnNpdmUob2JqZWN0KSBkaWRuJ3QgY29ycmVjdGx5IGlkZW50aWZ5IHJlY3Vyc2l2ZSBvYmplY3RzLgogIE5vdyBpdCBkb2VzLgoKLSBwcHJpbnQgZnVuY3Rpb25zIG5vdyBtdWNoIGZhc3RlciBmb3IgbGFyZ2UgY29udGFpbmVycyAodHVwbGUsIGxpc3QsIGRpY3QpLgoKLSBOZXcgJ3EnIGFuZCAnUScgZm9ybWF0IGNvZGVzIGluIHRoZSBzdHJ1Y3QgbW9kdWxlLCBjb3JyZXNwb25kaW5nIHRvIEMKICB0eXBlcyAibG9uZyBsb25nIiBhbmQgInVuc2lnbmVkIGxvbmcgbG9uZyIgKG9uIFdpbmRvd3MsIF9faW50NjQpLiAgSW4KICBuYXRpdmUgbW9kZSwgdGhlc2UgY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBwbGF0Zm9ybSBDIGNvbXBpbGVyIHN1cHBvcnRzCiAgdGhlc2UgdHlwZXMgKHdoZW4gSEFWRV9MT05HX0xPTkcgaXMgI2RlZmluZSdkIGJ5IHRoZSBQeXRob24gY29uZmlnCiAgcHJvY2VzcyksIGFuZCB0aGVuIHRoZXkgaW5oZXJpdCB0aGUgc2l6ZXMgYW5kIGFsaWdubWVudHMgb2YgdGhlIEMgdHlwZXMuCiAgSW4gc3RhbmRhcmQgbW9kZSwgJ3EnIGFuZCAnUScgYXJlIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgYXJlCiAgOC1ieXRlIGludGVncmFsIHR5cGVzLgoKLSBUaGUgc2l0ZSBtb2R1bGUgaW5zdGFsbHMgYSBuZXcgYnVpbHQtaW4gZnVuY3Rpb24gJ2hlbHAnIHRoYXQgaW52b2tlcwogIHB5ZG9jLmhlbHAuICBJdCBtdXN0IGJlIGludm9rZWQgYXMgJ2hlbHAoKSc7IHdoZW4gaW52b2tlZCBhcyAnaGVscCcsCiAgaXQgZGlzcGxheXMgYSBtZXNzYWdlIHJlbWluZGluZyB0aGUgdXNlciB0byB1c2UgJ2hlbHAoKScgb3IKICAnaGVscChvYmplY3QpJy4KClRlc3RzCi0tLS0tCgotIE5ldyB0ZXN0X211dGFudHMucHkgcnVucyBkaWN0IGNvbXBhcmlzb25zIHdoZXJlIHRoZSBrZXkgYW5kIHZhbHVlCiAgY29tcGFyaXNvbiBvcGVyYXRvcnMgbXV0YXRlIHRoZSBkaWN0cyByYW5kb21seSBkdXJpbmcgY29tcGFyaXNvbi4gIFRoaXMKICByYXBpZGx5IGNhdXNlcyBQeXRob24gdG8gY3Jhc2ggdW5kZXIgZWFybGllciByZWxlYXNlcyAobm90IGZvciB0aGUgZmFpbnQKICBvZiBoZWFydDogIGl0IGNhbiBhbHNvIGNhdXNlIFdpbjl4IHRvIGZyZWV6ZSBvciByZWJvb3QhKS4KCi0gTmV3IHRlc3RfcHByaW50LnB5IHZlcmlmaWVzIHRoYXQgcHByaW50LmlzcmVjdXJzaXZlKCkgYW5kCiAgcHByaW50LmlzcmVhZGFibGUoKSByZXR1cm4gc2Vuc2libGUgcmVzdWx0cy4gIEFsc28gdmVyaWZpZXMgdGhhdCBzaW1wbGUKICBjYXNlcyBwcm9kdWNlIGNvcnJlY3Qgb3V0cHV0LgoKQyBBUEkKLS0tLS0KCi0gUmVtb3ZlZCB0aGUgdW51c2VkIGxhc3RfaXNfc3RpY2t5IGFyZ3VtZW50IGZyb20gdGhlIGludGVybmFsCiAgX1B5VHVwbGVfUmVzaXplKCkuICBJZiB0aGlzIGFmZmVjdHMgeW91LCB5b3Ugd2VyZSBjaGVhdGluZy4KCi0tLS0KCioqKEZvciBpbmZvcm1hdGlvbiBhYm91dCBvbGRlciB2ZXJzaW9ucywgY29uc3VsdCB0aGUgSElTVE9SWSBmaWxlLikqKgo=