VGhpcyBpcyBhIGNvbmNhdGVuYXRpb24gb2YgTElDRU5DRS50eHQgYW5kIE5PVElDRS50eHQgZnJvbSB0aGUKb3Blbi1hdGg5ay1odGMtZmlybXdhcmUgcmVwb3NpdG9yeSBkZXNjcmliaW5nIGxpY2Vuc2luZyB0ZXJtcyBmb3IgdGhlCmZpcm13YXJlIGltYWdlIGFuZCBpdHMgc291cmNlcy4KClRoZSBzb3VyY2UgY29kZSByZXBvc2l0b3J5IGlzIHB1YmxpY2x5IGF2YWlsYWJsZSBhdApodHRwczovL2dpdGh1Yi5jb20vcWNhL29wZW4tYXRoOWstaHRjLWZpcm13YXJlIC4KCgpMSUNFTkNFLnR4dAotLS0tLS0tLS0tLQoKRmlsZXMgd2l0aCBhIFF1YWxjb21tIEF0aGVyb3MgLyBBdGhlcm9zIGxpY2VuY2UgZmFsbCB1bmRlciB0aGUgZm9sbG93aW5nCmxpY2VuY2UuICBQbGVhc2Ugc2VlIE5PVElDRVMuVFhUIGZvciBpbmZvcm1hdGlvbiBhYm91dCBvdGhlciBmaWxlcyBpbiB0aGlzCnJlcG9zaXRvcnkuCgotLS0tCgpDb3B5cmlnaHQgKGMpIDIwMTMgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgoKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAptb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgKHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIGluIHRoZQpkaXNjbGFpbWVyIGJlbG93KSBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICAgZGlzdHJpYnV0aW9uLgoKICogTmVpdGhlciB0aGUgbmFtZSBvZiBRdWFsY29tbSBBdGhlcm9zIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpOTyBFWFBSRVNTIE9SIElNUExJRUQgTElDRU5TRVMgVE8gQU5ZIFBBUlRZJ1MgUEFURU5UIFJJR0hUUyBBUkUKR1JBTlRFRCBCWSBUSElTIExJQ0VOU0UuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQKSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgpDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgpTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCldIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCk9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgotLS0tCgoKTk9USUNFLlRYVAotLS0tLS0tLS0tCgpUaGlzIE5PVElDRS5UWFQgZmlsZSBjb250YWlucyBjZXJ0YWluIG5vdGljZXMgb2Ygc29mdHdhcmUgY29tcG9uZW50cyBpbmNsdWRlZAp3aXRoIHRoZSBzb2Z0d2FyZSB0aGF0IFFVQUxDT01NIEFUSEVST1MgSW5jb3Jwb3JhdGVkICgnUXVhbGNvbW0gQXRoZXJvcycpIGlzCnJlcXVpcmVkIHRvIHByb3ZpZGUgeW91LiBOb3R3aXRoc3RhbmRpbmcgYW55dGhpbmcgaW4gdGhlIG5vdGljZXMgaW4gdGhpcyBmaWxlLAp5b3VyIHVzZSBvZiB0aGVzZSBzb2Z0d2FyZSBjb21wb25lbnRzIHRvZ2V0aGVyIHdpdGggdGhlIFF1YWxjb21tIEF0aGVyb3MKc29mdHdhcmUgKFF1YWxjb21tIEF0aGVyb3Mgc29mdHdhcmUgaGVyZWluYWZ0ZXIgcmVmZXJyZWQgdG8gYXMgJ1NvZnR3YXJlJykgaXMKc3ViamVjdCB0byB0aGUgdGVybXMgb2YgeW91ciBsaWNlbnNlIGZyb20gUXVhbGNvbW0gQXRoZXJvcy4gIENvbXBsaWFuY2Ugd2l0aAphbGwgY29weXJpZ2h0IGxhd3MgYW5kIHNvZnR3YXJlIGxpY2Vuc2UgYWdyZWVtZW50cyBpbmNsdWRlZCBpbiB0aGUgbm90aWNlCnNlY3Rpb24gb2YgdGhpcyBmaWxlIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIuICBFeGNlcHQgYXMgbWF5IGJlCmdyYW50ZWQgYnkgc2VwYXJhdGUgZXhwcmVzcyB3cml0dGVuIGFncmVlbWVudCwgdGhpcyBmaWxlIHByb3ZpZGVzIG5vIGxpY2Vuc2UKdG8gYW55IFF1YWxjb21tIEF0aGVyb3MgcGF0ZW50cywgdHJhZGVtYXJrcywgY29weXJpZ2h0cywgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCnByb3BlcnR5LgoKQ29weXJpZ2h0IChjKSAyMDEzIFFVQUxDT01NIEFUSEVST1MgSW5jb3Jwb3JhdGVkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KClFVQUxDT01NIEFUSEVST1OuIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgYW5kIHJlZ2lzdGVyZWQgc2VydmljZSBtYXJrIG9mClFVQUxDT01NIEFUSEVST1MgSW5jb3Jwb3JhdGVkLiAgQWxsIG90aGVyIHRyYWRlbWFya3MgYW5kIHNlcnZpY2UgbWFya3MgYXJlCnRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KCk5PVElDRVM6CgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMiBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCiAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwogKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBTYW0gTGVmZmxlciwgRXJybm8gQ29uc3VsdGluZwogKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJbmMuCiAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqIDEuIFRoZSBtYXRlcmlhbHMgY29udGFpbmVkIGhlcmVpbiBhcmUgdW5tb2RpZmllZCBhbmQgYXJlIHVzZWQKICogICAgdW5tb2RpZmllZC4KICogMi4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBOTwogKiAgICAnJ1dBUlJBTlRZJycgZGlzY2xhaW1lciBiZWxvdyAoJydEaXNjbGFpbWVyJycpLCB3aXRob3V0CiAqICAgIG1vZGlmaWNhdGlvbi4KICogMy4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYQogKiAgICBkaXNjbGFpbWVyIHNpbWlsYXIgdG8gdGhlIERpc2NsYWltZXIgYmVsb3cgYW5kIGFueSByZWRpc3RyaWJ1dGlvbgogKiAgICBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEgc3Vic3RhbnRpYWxseSBzaW1pbGFyCiAqICAgIERpc2NsYWltZXIgcmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgogKiA0LiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKICogICAgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKICogICAgcHJvZHVjdCBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbi4KICoKICogTk8gV0FSUkFOVFkKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogKiAnJ0FTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OSU5GUklOR0VNRU5ULAogKiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCiAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0VTLgogKi8KCi0tLS0KClRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGZyb20gRUNvUyB3aXRoIGEgR1BMdjIgbGljZW5jZSB3aXRoIG1vZGlmaWNhdGlvbgphbmQgbGlua2luZyBjYXZlYXRzLiBQbGVhc2Ugc2VlIHRoZSBsaWNlbmNlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uOgoKdGFyZ2V0X2Zpcm13YXJlL21hZ3BpZV9md19kZXYvYnVpbGQvbWFncGllXzFfMS9zYm9vdC9jbW5vcy9wcmludGYvc3JjL2Ntbm9zX3ByaW50Zi5jCnRhcmdldF9maXJtd2FyZS9tYWdwaWVfZndfZGV2L3RhcmdldC9jbW5vcy9jbW5vc19wcmludGYuYwp0YXJnZXRfZmlybXdhcmUvbWFncGllX2Z3X2Rldi90YXJnZXQvY21ub3MvazJfZndfY21ub3NfcHJpbnRmLmMKCi8vIyMjI0VDT1NHUExDT1BZUklHSFRCRUdJTiMjIyMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBlQ29zLCB0aGUgRW1iZWRkZWQgQ29uZmlndXJhYmxlIE9wZXJhdGluZyBTeXN0ZW0uCi8vIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCi8vIENvcHlyaWdodCAoQykgMjAwMiBHYXJ5IFRob21hcwovLwovLyBlQ29zIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLy8gdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLy8gU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLwovLyBlQ29zIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQovLyBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgovLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gZm9yIG1vcmUgZGV0YWlscy4KLy8KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLy8gd2l0aCBlQ29zOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi8vIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgovLwovLyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlIG1hY3JvcwovLyBvciBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhpcyBmaWxlLCBvciB5b3UgY29tcGlsZSB0aGlzIGZpbGUgYW5kIGxpbmsgaXQKLy8gd2l0aCBvdGhlciB3b3JrcyB0byBwcm9kdWNlIGEgd29yayBiYXNlZCBvbiB0aGlzIGZpbGUsIHRoaXMgZmlsZSBkb2VzIG5vdAovLyBieSBpdHNlbGYgY2F1c2UgdGhlIHJlc3VsdGluZyB3b3JrIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwovLyBMaWNlbnNlLiBIb3dldmVyIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBmaWxlIG11c3Qgc3RpbGwgYmUgbWFkZSBhdmFpbGFibGUKLy8gaW4gYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gKDMpIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLy8KLy8gVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkgYSB3b3JrIGJhc2VkIG9uCi8vIHRoaXMgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLy8KLy8gQWx0ZXJuYXRpdmUgbGljZW5zZXMgZm9yIGVDb3MgbWF5IGJlIGFycmFuZ2VkIGJ5IGNvbnRhY3RpbmcgUmVkIEhhdCwgSW5jLgovLyBhdCBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2Vjb3MvZWNvcy1saWNlbnNlLwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIyMjI0VDT1NHUExDT1BZUklHSFRFTkQjIyMjCgotLS0tCgpTb21lIG9mIHRoZSBzb3VyY2UgY29kZSBpcyBzb3VyY2VkIGZyb20gVGVuc2lsaWNhLCBJbmMuCgpBbHRob3VnaCBtb3N0IG9mIHRoZSBmaWxlcyBmYWxsIHVuZGVyIHRoZSBNSVQgbGljZW5jZSwgc29tZSBvZiB0aGUgc291cmNlCmZpbGVzIGdlbmVyYXRlZCBhcyBwYXJ0IG9mIHRoZSBzeXN0ZW0gZGV2ZWxvcG1lbnQgaGF2ZSBhIHByb3ByaWV0YXJ5ClRlbnNpbGljYSBsaWNlbmNlLgoKV2l0aCBwZXJtaXNzaW9uIGZyb20gVGVuc2lsaWNhLCBJbmMsIHRoZXNlIGZpbGVzIGhhdmUgYmVlbiByZWxpY2VuY2VkCnVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5jZToKCi8qCiAqIENvcHlyaWdodCAoYykgMjAxMyBUZW5zaWxpY2EgSW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICovCg==