KysrKysrKysrKysKUHl0aG9uIE5ld3MKKysrKysrKysrKysKCihlZGl0b3JzOiBjaGVjayBORVdTLmhlbHAgZm9yIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgTkVXUyB1c2luZyBSZVNULikKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMyBhbHBoYSAyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIGRhdGU6IFhYLVhYWC0yMDAzKgoKQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gaW50IHN1YmNsYXNzZXMgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggbG9uZ3MgaWYgdGhlIHZhbHVlIGZpdHMgaW4gYW4gaW50LgogIFNlZSBTRiBidWcgIzY4MzQ2Ny4KCi0gbG9uZyhzdHJpbmcsIGJhc2UpIHRha2VzIHRpbWUgbGluZWFyIGluIGxlbihzdHJpbmcpIHdoZW4gYmFzZSBpcyBhIHBvd2VyCiAgb2YgMiBub3cuICBJdCB1c2VkIHRvIHRha2UgdGltZSBxdWFkcmF0aWMgaW4gbGVuKHN0cmluZykuCgotIGZpbHRlciByZXR1cm5zIG5vdyBVbmljb2RlIHJlc3VsdHMgZm9yIFVuaWNvZGUgYXJndW1lbnRzLgoKLSByYXdfaW5wdXQgY2FuIG5vdyByZXR1cm4gVW5pY29kZSBvYmplY3RzLgoKLSBMaXN0IG9iamVjdHMnIHNvcnQoKSBtZXRob2Qgbm93IGFjY2VwdHMgTm9uZSBhcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbi4KICBQYXNzaW5nIE5vbmUgaXMgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB0byBjYWxsaW5nIHNvcnQoKSB3aXRoIG5vCiAgYXJndW1lbnRzLgoKLSBGaXhlZCBjcmFzaCB3aGVuIHByaW50aW5nIGEgc3ViY2xhc3Mgb2Ygc3RyIGFuZCBfX3N0cl9fIHJldHVybmVkIHNlbGYuCiAgU2VlIFNGIGJ1ZyAjNjY3MTQ3LgoKLSBGaXhlZCBhbiBpbnZhbGlkIFJ1bnRpbWVXYXJuaW5nIGFuZCBhbiB1bmRldGVjdGVkIGVycm9yIHdoZW4gdHJ5aW5nCiAgdG8gY29udmVydCBhIGxvbmcgaW50ZWdlciBpbnRvIGEgZmxvYXQgd2hpY2ggY291bGRuJ3QgZml0LgogIFNlZSBTRiBidWcgIzY3NjE1NS4KCi0gRnVuY3Rpb24gb2JqZWN0cyBub3cgaGF2ZSBhIF9fbW9kdWxlX18gYXR0cmlidXRlIHRoYXQgaXMgYm91bmQgdG8KICB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gIFRoaXMKICBhcHBsaWVzIGZvciBDIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBhcyB3ZWxsIGFzIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcwogIGRlZmluZWQgaW4gUHl0aG9uLiAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBieSBwaWNrbGUud2hpY2htb2R1bGUoKSwKICB3aGljaCBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB3aGljaG1vZHVsZSBzbGlnaHRseS4gIEluIFB5dGhvbiAyLjIKICB3aGljaG1vZHVsZSgpIHJldHVybnMgIl9fbWFpbl9fIiBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBkZWZpbmVkCiAgYXQgdGhlIHRvcC1sZXZlbCBvZiBhIG1vZHVsZSAoZXhhbXBsZXM6IG1ldGhvZHMsIG5lc3RlZCBmdW5jdGlvbnMpLgogIE5vdyB3aGljaG1vZHVsZSgpIHdpbGwgcmV0dXJuIHRoZSBwcm9wZXIgbW9kdWxlIG5hbWUuCgpFeHRlbnNpb24gbW9kdWxlcwotLS0tLS0tLS0tLS0tLS0tLQoKLSBGaXggc29tZSBidWdzIGluIHRoZSBwYXJzZXIgbW9kdWxlLiAgU0YgYnVnICM2Nzg1MTguCgotIFRoYW5rcyB0byBTY290dCBEYXZpZCBEYW5pZWxzLCBhIHN1YnRsZSBidWcgaW4gaG93IHRoZSB6bGliCiAgZXh0ZW5zaW9uIGltcGxlbWVudGVkIGZsdXNoKCkgd2FzIGZpeGVkLiAgU2NvdHQgYWxzbyByZXdyb3RlIHRoZQogIHpsaWIgdGVzdCBzdWl0ZSB1c2luZyB0aGUgdW5pdHRlc3QgbW9kdWxlLiAgKFNGIGJ1ZyAjNjQwMjMwIGFuZAogIHBhdGNoICM2Nzg1MzEuKQoKLSBBZGRlZCBhbiBpdGVydG9vbHMgbW9kdWxlIGNvbnRhaW5pbmcgaGlnaCBzcGVlZCwgbWVtb3J5IGVmZmljaWVudAogIGxvb3BpbmcgY29uc3RydWN0cyBpbnNwaXJlZCBieSB0b29scyBmcm9tIEhhc2tlbGwgYW5kIFNNTC4KCi0gVGhlIFNTTCBtb2R1bGUgbm93IGhhbmRsZXMgc29ja2V0cyB3aXRoIGEgdGltZW91dCBzZXQgY29ycmVjdGx5IChTRgogIHBhdGNoICM2NzU3NTAsIGZpeGluZyBTRiBidWcgIzY3NTU1MikuCgotIEEgbmV3IG1vZHVsZSBfaWNvbnZfY29kZWMgaGFzIGJlZW4gYWRkZWQsIHRvIGV4cG9zZSB0aGUgaWNvbnYoMykKICBsaWJyYXJ5LgoKLSBvcy9wb3NpeG1vZHVsZSBoYXMgZ3Jvd24gdGhlIHN5c2V4aXRzLmggY29uc3RhbnRzIChFWF9PSyBhbmQgZnJpZW5kcykuCgotIEZpeGVkIGJyb2tlbiB0aHJlYWRzdGF0ZSBzd2FwIGluIHJlYWRsaW5lIHRoYXQgY291bGQgY2F1c2UgZmF0YWwKICBlcnJvcnMgd2hlbiBhIHJlYWRsaW5lIGhvb2sgd2FzIGJlaW5nIGludm9rZWQgd2hpbGUgYSBiYWNrZ3JvdW5kCiAgdGhyZWFkIHdhcyBhY3RpdmUuICAoU0YgYnVncyAjNjYwNDc2IGFuZCAjNTEzMDMzLikKCi0gZmNudGwgbm93IGV4cG9zZXMgdGhlIHN0cm9wcy5oIElfKiBjb25zdGFudHMuCgotIEZpeCBhIGNyYXNoIG9uIFNvbGFyaXMgdGhhdCBvY2N1cnJlZCB3aGVuIGNhbGxpbmcgY2xvc2UoKSBvbgogIGFuIG1tYXAnZWQgZmlsZSB3aGljaCB3YXMgYWxyZWFkeSBjbG9zZWQuICAoU0YgcGF0Y2ggIzY2NTkxMykKCi0gZGF0ZXRpbWUgY2hhbmdlczoKCiAgVGhlIGRhdGV0aW1lIGFuZCBkYXRldGltZXR6IGNsYXNzZXMgaGF2ZSBiZWVuIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlCiAgZGF0ZXRpbWUgY2xhc3MsIGFuZCBsaWtld2lzZSB0aGUgdGltZSBhbmQgdGltZXR6IGNsYXNzZXMgaW50byBhIHNpbmdsZQogIHRpbWUgY2xhc3MuICBQcmV2aW91c2x5LCBhIGRhdGV0aW1ldHogb2JqZWN0IHdpdGggdHppbmZvPU5vbmUgYWN0ZWQKICBleGFjdGx5IGxpa2UgYSBkYXRldGltZSBvYmplY3QsIGFuZCBzaW1pbGFybHkgZm9yIHRpbWV0ei4gIFRoaXMgd2Fzbid0CiAgZW5vdWdoIG9mIGEgZGlmZmVyZW5jZSB0byBqdXN0aWZ5IGRpc3RpbmN0IGNsYXNzZXMsIGFuZCBsaWZlIGlzIHNpbXBsZXIKICBub3cuCgogIHRvZGF5KCkgYW5kIG5vdygpIG5vdyByb3VuZCBzeXN0ZW0gdGltZXN0YW1wcyB0byB0aGUgY2xvc2VzdAogIG1pY3Jvc2Vjb25kIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjYxMDg2Pi4gIFRoaXMgcmVwYWlycyBhbgogIGlycml0YXRpb24gbW9zdCBsaWtlbHkgc2VlbiBvbiBXaW5kb3dzIHN5c3RlbXMuCgogIEluIGR0LmFzdGltZXpvbmUodHopLCBpZiB0ei51dGNvZmZzZXQoZHQpIHJldHVybnMgYSBkdXJhdGlvbiwKICBWYWx1ZUVycm9yIGlzIHJhaXNlZCBpZiB0ei5kc3QoZHQpIHJldHVybnMgTm9uZSAoMi4zYTEgdHJlYXRlZCBpdAogIGFzIDAgaW5zdGVhZCwgYnV0IGEgdHppbmZvIHN1YmNsYXNzIHdpc2hpbmcgdG8gcGFydGljaXBhdGUgaW4KICB0aW1lIHpvbmUgY29udmVyc2lvbiBoYXMgdG8gdGFrZSBhIHN0YW5kIG9uIHdoZXRoZXIgaXQgc3VwcG9ydHMKICBEU1Q7IGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IERTVCwgdGhlbiBjb2RlIGRzdCgpIHRvIHJldHVybiAwIG1pbnV0ZXMsCiAgbWVhbmluZyB0aGF0IERTVCBpcyBuZXZlciBpbiBlZmZlY3QpLgoKICBUaGUgdHppbmZvIG1ldGhvZHMgdXRjb2Zmc2V0KCkgYW5kIGRzdCgpIG11c3QgcmV0dXJuIGEgdGltZWRlbHRhIG9iamVjdAogIChvciBOb25lKSBub3cuICBJbiAyLjNhMSB0aGV5IGNvdWxkIGFsc28gcmV0dXJuIGFuIGludCBvciBsb25nLCBidXQgdGhhdAogIHdhcyBhbiB1bmhlbHBmdWxseSByZWR1bmRhbnQgbGVmdG92ZXIgZnJvbSBhbiBlYXJsaWVyIHZlcnNpb24gd2hlcmVpbgogIHRoZXkgY291bGRuJ3QgcmV0dXJuIGEgdGltZWRlbHRhLiAgVE9PV1RESS4KCiAgVGhlIGV4YW1wbGUgdHppbmZvIGNsYXNzIGZvciBsb2NhbCB0aW1lIGhhZCBhIGJ1Zy4gIEl0IHdhcyByZXBsYWNlZAogIGJ5IGEgbGF0ZXIgZXhhbXBsZSBjb2RlZCBieSBHdWlkby4KCiAgZGF0ZXRpbWUuYXN0aW1lem9uZSh0eikgbm8gbG9uZ2VyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiB0aGUKICBpbnB1dCBkYXRldGltZSBoYXMgbm8gVVRDIGVxdWl2YWxlbnQgaW4gdHouICBGb3IgdHlwaWNhbCAiaHlicmlkIiB0aW1lCiAgem9uZXMgKGEgc2luZ2xlIHR6aW5mbyBzdWJjbGFzcyBtb2RlbGluZyBib3RoIHN0YW5kYXJkIGFuZCBkYXlsaWdodAogIHRpbWUpLCB0aGlzIGNhc2UgY2FuIGFyaXNlIG9uZSBob3VyIHBlciB5ZWFyLCBhdCB0aGUgaG91ciBkYXlsaWdodCB0aW1lCiAgZW5kcy4gIFNlZSBuZXcgZG9jcyBmb3IgZGV0YWlscy4gIEluIHNob3J0LCB0aGUgbmV3IGJlaGF2aW9yIG1pbWljcwogIHRoZSBsb2NhbCB3YWxsIGNsb2NrJ3MgYmVoYXZpb3Igb2YgcmVwZWF0aW5nIGFuIGhvdXIgaW4gbG9jYWwgdGltZS4KCiAgZHQuYXN0aW1lem9uZSgpIGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gbmFpdmUgYW5kIGF3YXJlCiAgZGF0ZXRpbWUgb2JqZWN0cy4gIElmIHlvdSBtZXJlbHkgd2FudCB0byBhdHRhY2gsIG9yIHJlbW92ZSwgYSB0emluZm8KICBvYmplY3QsIHdpdGhvdXQgYW55IGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZSBtZW1iZXJzLCB1c2UKICBkdC5yZXBsYWNlKHR6aW5mbz13aGF0ZXZlcikgaW5zdGVhZCwgd2hlcmUgIndoYXRldmVyIiBpcyBOb25lIG9yIGEKICB0emluZm8gc3ViY2xhc3MgaW5zdGFuY2UuCgogIEEgbmV3IG1ldGhvZCB0emluZm8uZnJvbXV0YyhkdCkgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdHppbmZvIHN1YmNsYXNzZXMKICB0byBnaXZlIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBob3cgYSBVVEMgdGltZSBpcyB0byBiZSBjb252ZXJ0ZWQgdG8KICBhIGxvY2FsIHRpbWUuICBUaGUgZGVmYXVsdCBhc3RpbWV6b25lKCkgaW1wbGVtZW50YXRpb24gY2FsbHMgZnJvbXV0YygpCiAgYXMgaXRzIGxhc3Qgc3RlcCwgc28gYSB0emluZm8gc3ViY2xhc3MgY2FuIGFmZmVjdCB0aGF0IHRvbyBieSBvdmVycmlkaW5nCiAgZnJvbXV0YygpLiAgSXQncyBleHBlY3RlZCB0aGF0IHRoZSBkZWZhdWx0IGZyb211dGMoKSBpbXBsZW1lbnRhdGlvbiB3aWxsCiAgYmUgc3VpdGFibGUgYXMtaXMgZm9yICJhbG1vc3QgYWxsIiB0aW1lIHpvbmUgc3ViY2xhc3NlcywgYnV0IHRoZQogIGNyZWF0aXZpdHkgb2YgcG9saXRpY2FsIHRpbWUgem9uZSBmaWRkbGluZyBhcHBlYXJzIHVuYm91bmRlZCAtLSBmcm9tdXRjKCkKICBhbGxvd3MgdGhlIGhpZ2hseSBtb3RpdmF0ZWQgdG8gZW11bGF0ZSBhbnkgc2NoZW1lIGV4cHJlc3NpYmxlIGluIFB5dGhvbi4KCiAgZGF0ZXRpbWUubm93KCk6ICBUaGUgb3B0aW9uYWwgdHppbmZvIGFyZ3VtZW50IHdhcyB1bmRvY3VtZW50ZWQgKHRoYXQncwogIHJlcGFpcmVkKSwgYW5kIGl0cyBuYW1lIHdhcyBjaGFuZ2VkIHRvIHR6ICgidHppbmZvIiBpcyBvdmVybG9hZGVkIGVub3VnaAogIGFscmVhZHkpLiAgV2l0aCBhIHR6IGFyZ3VtZW50LCBub3codHopIHVzZWQgdG8gcmV0dXJuIHRoZSBsb2NhbCBkYXRlCiAgYW5kIHRpbWUsIGFuZCBhdHRhY2ggdHogdG8gaXQsIHdpdGhvdXQgYW55IGNvbnZlcnNpb24gb2YgZGF0ZSBhbmQgdGltZQogIG1lbWJlcnMuICBUaGlzIHdhcyBsZXNzIHRoYW4gdXNlZnVsLiAgTm93IG5vdyh0eikgcmV0dXJucyB0aGUgY3VycmVudAogIGRhdGUgYW5kIHRpbWUgYXMgbG9jYWwgdGltZSBpbiB0eidzIHRpbWUgem9uZSwgYWtpbiB0bwogICAgICB0ei5mcm9tdXRjKGRhdGV0aW1lLnV0Y25vdygpLnJlcGxhY2UodHppbmZvPXV0YykpCiAgd2hlcmUgInV0YyIgaXMgYW4gaW5zdGFuY2Ugb2YgYSB0emluZm8gc3ViY2xhc3MgbW9kZWxpbmcgVVRDLiAgV2l0aG91dAogIGEgdHogYXJndW1lbnQsIG5vdygpIGNvbnRpbnVlcyB0byByZXR1cm4gdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBhbmQgdGltZSwKICBhcyBhIG5haXZlIGRhdGV0aW1lIG9iamVjdC4KCiAgZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCgpOiAgTGlrZSBkYXRldGltZS5ub3coKSBhYm92ZSwgdGhpcyBoYWQgbGVzcyB0aGFuCiAgdXNlZnVsIGJlaGF2aW9yIHdoZW4gdGhlIG9wdGlvbmFsIHRpbnpvIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuICBTZWUKICBhbHNvIFNGIGJ1ZyByZXBvcnQgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi82NjA4NzI+LgoKICBkYXRlIGFuZCBkYXRldGltZSBjb21wYXJpc29uOiAgSW4gb3JkZXIgdG8gcHJldmVudCBjb21wYXJpc29uIGZyb20KICBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQgY29tcGFyZS1vYmplY3QtYWRkcmVzc2VzIHN0cmF0ZWd5LCB0aGVzZQogIHJhaXNlZCBUeXBlRXJyb3Igd2hlbmV2ZXIgdGhleSBkaWRuJ3QgdW5kZXJzdGFuZCB0aGUgb3RoZXIgb2JqZWN0IHR5cGUuCiAgVGhleSBzdGlsbCBkbywgZXhjZXB0IHdoZW4gdGhlIG90aGVyIG9iamVjdCBoYXMgYSAidGltZXR1cGxlIiBhdHRyaWJ1dGUsCiAgaW4gd2hpY2ggY2FzZSB0aGV5IHJldHVybiBOb3RJbXBsZW1lbnRlZCBub3cuICBUaGlzIGdpdmVzIG90aGVyCiAgZGF0ZXRpbWUgb2JqZWN0cyAoZS5nLiwgbXhEYXRlVGltZSkgYSBjaGFuY2UgdG8gaW50ZXJjZXB0IHRoZQogIGNvbXBhcmlzb24uCgogIGRhdGUsIHRpbWUsIGRhdGV0aW1lIGFuZCB0aW1lZGVsdGEgY29tcGFyaXNvbjogIFdoZW4gdGhlIGV4Y2VwdGlvbgogIGZvciBtaXhlZC10eXBlIGNvbXBhcmlzb25zIGluIHRoZSBsYXN0IHBhcmFncmFwaCBkb2Vzbid0IGFwcGx5LCBpZgogIHRoZSBjb21wYXJpc29uIGlzID09IHRoZW4gRmFsc2UgaXMgcmV0dXJuZWQsIGFuZCBpZiB0aGUgY29tcGFyaXNvbiBpcwogICE9IHRoZW4gVHJ1ZSBpcyByZXR1cm5lZC4gIEJlY2F1c2UgZGljdCBsb29rdXAgYW5kIHRoZSAiaW4iIG9wZXJhdG9yCiAgb25seSBpbnZva2UgX19lcV9fLCB0aGlzIGFsbG93cywgZm9yIGV4YW1wbGUsCgogICAgICBpZiBzb21lX2RhdGV0aW1lIGluIHNvbWVfc2VxdWVuY2U6CiAgYW5kCiAgICAgIHNvbWVfZGljdFtzb21lX3RpbWVkZWx0YV0gPSB3aGF0ZXZlcgoKICB0byB3b3JrIGFzIGV4cGVjdGVkLCB3aXRob3V0IHJhaXNpbmcgVHlwZUVycm9yIGp1c3QgYmVjYXVzZSB0aGUKICBzZXF1ZW5jZSBpcyBoZXRlcm9nZW5lb3VzLCBvciB0aGUgZGljdCBoYXMgbWl4ZWQtdHlwZSBrZXlzLiAgW1RoaXMKICBzZWVtcyBsaWtlIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCBmb3IgYWxsIG1peGVkLXR5cGUgY29tcGFyaXNvbnMKICB0aGF0IGRvbid0IHdhbnQgdG8gYWxsb3cgZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi5dCgogIFRoZSBjb25zdHJ1Y3RvcnMgYnVpbGRpbmcgYSBkYXRldGltZSBmcm9tIGEgdGltZXN0YW1wIGNvdWxkIHJhaXNlCiAgVmFsdWVFcnJvciBpZiB0aGUgcGxhdGZvcm0gQyBsb2NhbHRpbWUoKS9nbXRpbWUoKSBpbnNlcnRlZCAibGVhcAogIHNlY29uZHMiLiAgTGVhcCBzZWNvbmRzIGFyZSBpZ25vcmVkIG5vdy4gIE9uIHN1Y2ggcGxhdGZvcm1zLCBpdCdzCiAgcG9zc2libGUgdG8gaGF2ZSB0aW1lc3RhbXBzIHRoYXQgZGlmZmVyIGJ5IGEgc2Vjb25kLCB5ZXQgd2hlcmUKICBkYXRldGltZXMgY29uc3RydWN0ZWQgZnJvbSB0aGVtIGFyZSBlcXVhbC4KCiAgVGhlIHBpY2tsZSBmb3JtYXQgb2YgZGF0ZSwgdGltZSBhbmQgZGF0ZXRpbWUgb2JqZWN0cyBoYXMgY2hhbmdlZAogIGNvbXBsZXRlbHkuICBUaGUgdW5kb2N1bWVudGVkIHBpY2tsZXIgYW5kIHVucGlja2xlciBmdW5jdGlvbnMgbm8KICBsb25nZXIgZXhpc3QuICBUaGUgdW5kb2N1bWVudGVkIF9fc2V0c3RhdGVfXygpIGFuZCBfX2dldHN0YXRlX18oKQogIG1ldGhvZHMgbm8gbG9uZ2VyIGV4aXN0IGVpdGhlci4KCkxpYnJhcnkKLS0tLS0tLQoKLSBhcnJheS5hcnJheSB3YXMgYWRkZWQgdG8gdGhlIHR5cGVzIHJlcHIucHkga25vd3MgYWJvdXQgKHNlZQogIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNjgwNzg5PikuCgotIFRoZSBuZXcgcGlja2xldG9vbHMucHkgY29udGFpbnMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFib3V0IHBpY2tsZQogIGludGVybmFscywgYW5kIHN1cHBsaWVzIHNvbWUgaGVscGVycyBmb3Igd29ya2luZyB3aXRoIHBpY2tsZXMsIHN1Y2ggYXMKICBhIHN5bWJvbGljIHBpY2tsZSBkaXNhc3NlbWJsZXIuCgotIFhtbHJwY2xpYi5weSBub3cgc3VwcG9ydHMgdGhlIGJ1aWx0aW4gYm9vbGVhbiB0eXBlLgoKLSBweV9jb21waWxlIGhhcyBhIG5ldyAnZG9yYWlzZScgZmxhZyBhbmQgYSBuZXcgUHlDb21waWxlRXJyb3IKICBleGNlcHRpb24uCgotIFNpbXBsZVhNTFJQQ1NlcnZlciBub3cgc3VwcG9ydHMgQ0dJIHRocm91Z2ggdGhlIENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyCiAgY2xhc3MuCgotIFRoZSBzZXRzIG1vZHVsZSBub3cgcmFpc2VzIFR5cGVFcnJvciBpbiBfX2NtcF9fLCB0byBjbGFyaWZ5IHRoYXQKICBzZXRzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdGhyZWUtd2F5LWNvbXBhcmVkOyB0aGUgY29tcGFyaXNvbgogIG9wZXJhdG9ycyBhcmUgb3ZlcmxvYWRlZCBhcyBzdWJzZXQvc3VwZXJzZXQgdGVzdHMuCgotIEJhc3Rpb24ucHkgYW5kIHJleGVjLnB5IGFyZSBkaXNhYmxlZC4gIFRoZXNlIG1vZHVsZXMgYXJlIG5vdCBzYWZlIGluCiAgUHl0aG9uIDIuMi4gb3IgMi4zLgoKLSByZWFscGF0aCBpcyBub3cgZXhwb3J0ZWQgd2hlbiBkb2luZyBmcm9tIHBveGl4cGF0aCBpbXBvcnQgKi4KICBJdCBpcyBhbHNvIGV4cG9ydGVkIGZvciBudHBhdGgsIG1hY3BhdGgsIGFuZCBvczJlbXhwYXRoLgogIFNlZSBTRiBidWcgIzY1OTIyOC4KCi0gTmV3IG1vZHVsZSB0YXJmaWxlIGZyb20gTGFycyBHdXN05GJlbCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlCiAgdG8gdGFyIGFyY2hpdmUgZmlsZXMgd2l0aCB0cmFuc3BhcmVudCBnemlwIGFuZCBiemlwMiBjb21wcmVzc2lvbi4KICBTZWUgU0YgcGF0Y2ggIzY1MTA4Mi4KCi0gdXJscGFyc2UgY2FuIG5vdyBwYXJzZSBpbWFwOi8vIFVSTHMuICBTZWUgU0YgZmVhdHVyZSByZXF1ZXN0ICM2MTgwMjQuCgotIFRraW50ZXIuQ2FudmFzLnNjYW5fZHJhZ3RvKCkgcHJvdmlkZXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHN1cHBvcnQKICB0aGUgZ2FpbiB2YWx1ZSB3aGljaCBpcyBwYXNzZWQgdG8gVGsuICBTRiBidWcjIDYwMjI1OS4KCi0gRml4IGxvZ2dpbmcuaGFuZGxlcnMuU3lzTG9nSGFuZGxlciBwcm90b2NvbCB3aGVuIHVzaW5nIFVOSVggZG9tYWluIHNvY2tldHMuCiAgU2VlIFNGIHBhdGNoICM2NDI5NzQuCgpUb29scy9EZW1vcwotLS0tLS0tLS0tLQoKLSBUd28gbmV3IHNjcmlwdHMgKGRiMnBpY2tsZS5weSBhbmQgcGlja2xlMmRiLnB5KSB3ZXJlIGFkZGVkIHRvIHRoZQogIFRvb2xzL3NjcmlwdHMgZGlyZWN0b3J5IHRvIGZhY2lsaXRhdGUgY29udmVyc2lvbiBmcm9tIHRoZSBvbGQgYnNkZGIgbW9kdWxlCiAgdG8gdGhlIG5ldyBvbmUuICBXaGlsZSB0aGUgdXNlci12aXNpYmxlIEFQSSBvZiB0aGUgbmV3IG1vZHVsZSBpcwogIGNvbXBhdGlibGUgd2l0aCB0aGUgb2xkIG9uZSwgaXQncyBsaWtlbHkgdGhhdCB0aGUgdmVyc2lvbiBvZiB0aGUKICB1bmRlcmx5aW5nIGRhdGFiYXNlIGxpYnJhcnkgaGFzIGNoYW5nZWQuICBUbyBjb252ZXJ0IGZyb20gdGhlIG9sZCBsaWJyYXJ5LAogIHJ1biB0aGUgZGIycGlja2xlLnB5IHNjcmlwdCB1c2luZyB0aGUgb2xkIHZlcnNpb24gb2YgUHl0aG9uIHRvIGNvbnZlcnQgaXQKICB0byBhIHBpY2tsZSBmaWxlLiAgQWZ0ZXIgdXBncmFkaW5nIFB5dGhvbiwgcnVuIHRoZSBwaWNrbGUyZGIucHkgc2NyaXB0CiAgdXNpbmcgdGhlIG5ldyB2ZXJzaW9uIG9mIFB5dGhvbiB0byByZWNvbnN0aXR1dGUgeW91ciBkYXRhYmFzZS4gIEZvcgogIGV4YW1wbGU6CgogICAgJSBweXRob24yLjIgZGIycGlja2xlLnB5IC1oIHNvbWUuZGIgPiBzb21lLnBpY2tsZQogICAgJSBweXRob24yLjMgcGlja2xlMmRiLnB5IC1oIHNvbWUuZGIubmV3IDwgc29tZS5waWNrbGUKCiAgUnVuIHRoZSBzY3JpcHRzIHdpdGhvdXQgYW55IGFyZ3MgdG8gZ2V0IGEgdXNhZ2UgbWVzc2FnZS4KCgpCdWlsZAotLS0tLQoKLSBPbiBzeXN0ZW1zIHdoaWNoIGJ1aWxkIHVzaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LCBjb21waWxlciBmbGFncyB3aGljaAogIHVzZWQgdG8gYmUgbHVtcGVkIHRvZ2V0aGVyIHVzaW5nIHRoZSBPUFQgZmxhZyBoYXZlIGJlZW4gc3BsaXQgaW50byB0d28KICBncm91cHMsIE9QVCBhbmQgQkFTRUNGTEFHUy4gIE9QVCBpcyBtZWFudCB0byBjYXJyeSBqdXN0IG9wdGltaXphdGlvbi0gYW5kCiAgZGVidWctcmVsYXRlZCBmbGFncyBsaWtlICItZyIgYW5kICItTzMiLiAgQkFTRUNGTEFHUyBpcyBtZWFudCB0byBjYXJyeQogIGNvbXBpbGVyIGZsYWdzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGdldCBhIGNsZWFuIGNvbXBpbGUuICBPbiBzb21lCiAgcGxhdGZvcm1zIChtYW55IExpbnV4IGZsYXZvcnMgaW4gcGFydGljdWxhcikgQkFTRUNGTEFHUyB3aWxsIGJlIGVtcHR5IGJ5CiAgZGVmYXVsdC4gIE9uIG90aGVycywgc3VjaCBhcyBNYWMgT1MgWCBhbmQgU0NPLCBpdCB3aWxsIGNvbnRhaW4gcmVxdWlyZWQKICBmbGFncy4gIFRoaXMgY2hhbmdlIGFsbG93cyBwZW9wbGUgYnVpbGRpbmcgUHl0aG9uIHRvIG92ZXJyaWRlIE9QVCB3aXRob3V0CiAgZmVhciBvZiBjbG9iYmVyaW5nIGNvbXBpbGVyIGZsYWdzIHdoaWNoIGFyZSByZXF1aXJlZCB0byBnZXQgYSBjbGVhbiBidWlsZC4KCi0gT24gRGFyd2luL01hYyBPUyBYIHBsYXRmb3JtcywgL3N3L2xpYiBhbmQgL3N3L2luY2x1ZGUgYXJlIGFkZGVkIHRvIHRoZQogIHJlbGV2YW50IHNlYXJjaCBsaXN0cyBpbiBzZXR1cC5weS4gIFRoaXMgYWxsb3dzIHVzZXJzIGJ1aWxkaW5nIFB5dGhvbiB0bwogIHRha2UgYWR2YW50YWdlIG9mIHRoZSBtYW55IHBhY2thZ2VzIGF2YWlsYWJsZSBmcm9tIHRoZSBmaW5rIHByb2plY3QKICA8aHR0cDovL2Zpbmsuc2YubmV0Lz4uCgotIEEgbmV3IE1ha2VmaWxlIHRhcmdldCwgc2NyaXB0c2luc3RhbGwsIGluc3RhbGxzIGEgbnVtYmVyIG9mIHVzZWZ1bCBzY3JpcHRzCiAgZnJvbSB0aGUgVG9vbHMvc2NyaXB0cyBkaXJlY3RvcnkuCgpDIEFQSQotLS0tLQoKLSBUaGUgUHlBcmdfUGFyc2UgZnVuY3Rpb25zIG5vdyBpc3N1ZSBhIERlcHJlY2F0aW9uV2FybmluZyBpZiBhIGZsb2F0CiAgYXJndW1lbnQgaXMgcHJvdmlkZWQgd2hlbiBhbiBpbnRlZ2VyIGlzIHNwZWNpZmllZCAodGhpcyBhZmZlY3RzIHRoZSAnYicsCiAgJ0InLCAnaCcsICdIJywgJ2knLCBhbmQgJ2wnIGNvZGVzKS4gIEZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gd2lsbAogIHJhaXNlIGEgVHlwZUVycm9yLgoKCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKVEJECgpUZXN0cwotLS0tLQoKVEJECgpXaW5kb3dzCi0tLS0tLS0KCi0gZGlzdHV0aWxzJyBtc3ZjY29tcGlsZXIgY2xhc3Mgbm93IHBhc3NlcyB0aGUgcHJlcHJvY2Vzc29yIG9wdGlvbnMgdG8KICB0aGUgcmVzb3VyY2UgY29tcGlsZXIuICBTZWUgU0YgcGF0Y2ggIzY2OTE5OC4KCi0gVGhlIGJzZGRiIG1vZHVsZSBub3cgc2hpcHMgd2l0aCBTbGVlcHljYXQncyA0LjEuMjUuTkMsIHRoZSBsYXRlc3QKICByZWxlYXNlIHdpdGhvdXQgc3Ryb25nIGNyeXB0b2dyYXBoeS4KCi0gc3lzLnBhdGhbMF0sIGlmIGl0IGNvbnRhaW5zIGEgZGlyZWN0b3J5IG5hbWUsIGlzIG5vdyBhbHdheXMgYW4KICBhYnNvbHV0ZSBwYXRobmFtZS4KCi0gVGhlIG5ldyBsb2dnaW5nIHBhY2thZ2UgaXMgbm93IGluc3RhbGxlZCBieSB0aGUgV2luZG93cyBpbnN0YWxsZXIuICBJdAogIHdhc24ndCBpbiAyLjNhMSBkdWUgdG8gb3ZlcnNpZ2h0LgoKTWFjCi0tLQoKLSBUaGVyZSBhcmUgbmV3IGRpYWxvZ3MgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4sIEFza0ZpbGVGb3JTYXZlCiAgYW5kIEFza0ZvbGRlci4gVGhlIG9sZCBtYWNmcy5TdGFuZGFyZEdldEZpbGUgYW5kIGZyaWVuZHMgYXJlIGRlcHJlY2F0ZWQuCgotIE1vc3Qgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgbm93IHVzZXMgcGF0aG5hbWVzIG9yIEZTUmVmcyBpbiBwcmVmZXJlbmNlCiAgb2YgRlNTcGVjcywgYW5kIHVzZSB0aGUgdW5kZXJseWluZyBDYXJib24uRmlsZSBhbmQgQ2FyYm9uLkZvbGRlciBtb2R1bGVzCiAgaW4gc3RlYWQgb2YgbWFjZnMuIG1hY2ZzIHdpbGwgcHJvYmFibHkgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLgoKLSBUeXBlIENhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8gYW5kIHN1cHBvcnRpbmcgbWV0aG9kcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCiAgVGhpcyBhbHNvIG1ha2VzIG1hY2ZzLkZTU3BlYy5TZXREYXRlcygpIHdvcmsgYWdhaW4uCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4zIGFscGhhIDE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMzEtRGVjLTIwMDIqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBPbmUgY2FuIG5vdyBhc3NpZ24gdG8gX19iYXNlc19fIGFuZCBfX25hbWVfXyBvZiBuZXctc3R5bGUgY2xhc3Nlcy4KCi0gZGljdCgpIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzIHNvIHRoYXQgZGljdChvbmU9MSwgdHdvPTIpCiAgaXMgdGhlIGVxdWl2YWxlbnQgb2YgeyJvbmUiOiAxLCAidHdvIjogMn0uICBBY2NvcmRpbmdseSwKICB0aGUgZXhpc3RpbmcgKGJ1dCB1bmRvY3VtZW50ZWQpICdpdGVtcycga2V5d29yZCBhcmd1bWVudCBoYXMKICBiZWVuIGVsaW1pbmF0ZWQuICBUaGlzIG1lYW5zIHRoYXQgZGljdChpdGVtcz1zb21lTWFwcGluZykgbm93IGhhcwogIGEgZGlmZmVyZW50IG1lYW5pbmcgdGhhbiBiZWZvcmUuCgotIGludCgpIG5vdyByZXR1cm5zIGEgbG9uZyBvYmplY3QgaWYgdGhlIGFyZ3VtZW50IGlzIG91dHNpZGUgdGhlCiAgaW50ZWdlciByYW5nZSwgc28gaW50KCI0IiAqIDEwMDApLCBpbnQoMWUyMDApIGFuZCBpbnQoMUw8PDEwMDApIHdpbGwKICBhbGwgcmV0dXJuIGxvbmcgb2JqZWN0cyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gT3ZlcmZsb3dFcnJvci4KCi0gQXNzaWdubWVudCB0byBfX2NsYXNzX18gaXMgZGlzYWxsb3dlZCBpZiBlaXRoZXIgdGhlIG9sZCBvciB0aGUgbmV3CiAgY2xhc3MgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0eXBlIG9iamVjdCAoc3VjaCBhcyBkZWZpbmVkIGJ5IGFuCiAgZXh0ZW5zaW9uIG1vZHVsZSkuICBUaGlzIHByZXZlbnRzIGFub21hbGllcyBsaWtlIDIuX19jbGFzc19fID0gYm9vbC4KCi0gTmV3LXN0eWxlIG9iamVjdCBjcmVhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGhhdmUgYmVlbiBzcGVkIHVwCiAgc2lnbmlmaWNhbnRseTsgdGhleSBhcmUgbm93IGZhc3RlciB0aGFuIGNsYXNzaWMgaW5zdGFuY2UgY3JlYXRpb24KICBhbmQgZGVhbGxvY2F0aW9uLgoKLSBUaGUgX19zbG90c19fIHZhcmlhYmxlIGNhbiBub3cgbWVudGlvbiAicHJpdmF0ZSIgbmFtZXMsIGFuZCB0aGUKICByaWdodCB0aGluZyB3aWxsIGhhcHBlbiAoZS5nLiBfX3Nsb3RzX18gPSBbIl9fZm9vIl0pLgoKLSBUaGUgYnVpbHQtaW5zIHNsaWNlKCkgYW5kIGJ1ZmZlcigpIGFyZSBub3cgY2FsbGFibGUgdHlwZXMuICBUaGUKICB0eXBlcyBjbGFzc29iaiAoZm9ybWVybHkgY2xhc3MpLCBjb2RlLCBmdW5jdGlvbiwgaW5zdGFuY2UsIGFuZAogIGluc3RhbmNlbWV0aG9kIChmb3JtZXJseSBpbnN0YW5jZS1tZXRob2QpLCB3aGljaCBoYXZlIG5vIGJ1aWx0LWluCiAgbmFtZXMgYnV0IGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHR5cGVzIG1vZHVsZSwgYXJlIG5vdyBhbHNvCiAgY2FsbGFibGUuICBUaGUgdHlwZSBkaWN0LXByb3h5IGlzIHJlbmFtZWQgdG8gZGljdHByb3h5LgoKLSBDeWNsZXMgZ29pbmcgdGhyb3VnaCB0aGUgX19jbGFzc19fIGxpbmsgb2YgYSBuZXctc3R5bGUgaW5zdGFuY2UgYXJlCiAgbm93IGRldGVjdGVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KCi0gQ2xhc3NlcyB1c2luZyBfX3Nsb3RzX18gYXJlIG5vdyBwcm9wZXJseSBnYXJiYWdlIGNvbGxlY3RlZC4KICBbU0YgYnVnIDUxOTYyMV0KCi0gVGlnaHRlbmVkIHRoZSBfX3Nsb3RzX18gcnVsZXM6IGEgc2xvdCBuYW1lIG11c3QgYmUgYSB2YWxpZCBQeXRob24KICBpZGVudGlmaWVyLgoKLSBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBtb2R1bGUgdHlwZSBub3cgcmVxdWlyZXMgYSBuYW1lIGFyZ3VtZW50IGFuZAogIHRha2VzIGFuIG9wdGlvbmFsIGRvY3N0cmluZyBhcmd1bWVudC4gIFByZXZpb3VzbHksIHRoaXMgY29uc3RydWN0b3IKICBpZ25vcmVkIGl0cyBhcmd1bWVudHMuICBBcyBhIGNvbnNlcXVlbmNlLCBkZXJpdmluZyBhIGNsYXNzIGZyb20gYQogIG1vZHVsZSAobm90IGZyb20gdGhlIG1vZHVsZSB0eXBlKSBpcyBub3cgaWxsZWdhbDsgcHJldmlvdXNseSB0aGlzCiAgY3JlYXRlZCBhbiB1bm5hbWVkIG1vZHVsZSwganVzdCBsaWtlIGludm9raW5nIHRoZSBtb2R1bGUgdHlwZSBkaWQuCiAgW1NGIGJ1ZyA1NjMwNjBdCgotIEEgbmV3IHR5cGUgb2JqZWN0LCAnYmFzZXN0cmluZycsIGlzIGFkZGVkLiAgVGhpcyBpcyBhIGNvbW1vbiBiYXNlIHR5cGUKICBmb3IgJ3N0cicgYW5kICd1bmljb2RlJywgYW5kIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKICB0eXBlcy5TdHJpbmdUeXBlcywgZS5nLiB0byB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzICJhIHN0cmluZyI6CiAgaXNpbnN0YW5jZSh4LCBiYXNlc3RyaW5nKSBpcyBUcnVlIGZvciBVbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzLiAgVGhpcwogIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgYW5kIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuCgotIENoYW5nZWQgbmV3LXN0eWxlIGNsYXNzIGluc3RhbnRpYXRpb24gc28gdGhhdCB3aGVuIEMncyBfX25ld19fCiAgbWV0aG9kIHJldHVybnMgc29tZXRoaW5nIHRoYXQncyBub3QgYSBDIGluc3RhbmNlLCBpdHMgX19pbml0X18gaXMKICBub3QgY2FsbGVkLiAgW1NGIGJ1ZyAjNTM3NDUwXQoKLSBGaXhlZCBzdXBlcigpIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggY2xhc3MgbWV0aG9kcy4gIFtTRiBidWcgIzUzNTQ0NF0KCi0gSWYgeW91IHRyeSB0byBwaWNrbGUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBfX3Nsb3RzX18gYnV0CiAgZG9lc24ndCBkZWZpbmUgb3Igb3ZlcnJpZGUgX19nZXRzdGF0ZV9fLCBhIFR5cGVFcnJvciBpcyBub3cgcmFpc2VkLgogIFRoaXMgaXMgZG9uZSBieSBhZGRpbmcgYSBib3pvIF9fZ2V0c3RhdGVfXyB0byB0aGUgY2xhc3MgdGhhdCBhbHdheXMKICByYWlzZXMgVHlwZUVycm9yLiAgKEJlZm9yZSwgdGhpcyB3b3VsZCBhcHBlYXIgdG8gYmUgcGlja2xlZCwgYnV0IHRoZQogIHN0YXRlIG9mIHRoZSBzbG90cyB3b3VsZCBiZSBsb3N0LikKCkNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tCgotIEltcG9ydCBmcm9tIHppcGZpbGVzIGlzIG5vdyBzdXBwb3J0ZWQuICBUaGUgbmFtZSBvZiBhIHppcGZpbGUgcGxhY2VkCiAgb24gc3lzLnBhdGggY2F1c2VzIHRoZSBpbXBvcnQgc3RhdGVtZW50IHRvIGxvb2sgZm9yIGltcG9ydGFibGUgUHl0aG9uCiAgbW9kdWxlcyAod2l0aCAucHksIHB5YyBhbmQgLnB5byBleHRlbnNpb25zKSBhbmQgcGFja2FnZXMgaW5zaWRlIHRoZQogIHppcGZpbGUuICBUaGUgemlwZmlsZSBpbXBvcnQgZm9sbG93cyB0aGUgc3BlY2lmaWNhdGlvbiAodGhvdWdoIG5vdAogIHRoZSBzYW1wbGUgaW1wbGVtZW50YXRpb24pIG9mIFBFUCAyNzMuICBUaGUgc2VtYW50aWNzIG9mIF9fcGF0aF9fIGFyZQogIGNvbXBhdGlibGUgd2l0aCB0aG9zZSB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiBKeXRob24gc2luY2UKICBKeXRob24gMi4xLgoKLSBQRVAgMzAyIGhhcyBiZWVuIGFjY2VwdGVkLiAgQWx0aG91Z2ggaXQgd2FzIGluaXRpdGFsbHkgZGV2ZWxvcGVkIHRvCiAgc3VwcG9ydCB6aXBpbXBvcnQsIGl0IG9mZmVycyBhIG5ldywgZ2VuZXJhbCBpbXBvcnQgaG9vayBtZWNoYW5pc20uCiAgU2V2ZXJhbCBuZXcgdmFyaWFibGVzIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgc3lzIG1vZHVsZToKICBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlOyB0aGVzZQogIG1ha2UgZXh0ZW5kaW5nIHRoZSBpbXBvcnQgc3RhdGVtZW50IG11Y2ggbW9yZSBjb252ZW5pZW50IHRoYW4KICBvdmVycmlkaW5nIHRoZSBfX2ltcG9ydF9fIGJ1aWx0LWluIGZ1bmN0aW9uLiAgRm9yIGEgZGVzY3JpcHRpb24gb2YKICB0aGVzZSwgc2VlIFBFUCAzMDIuCgotIEEgZnJhbWUgb2JqZWN0J3MgZl9saW5lbm8gYXR0cmlidXRlIGNhbiBub3cgYmUgd3JpdHRlbiB0byBmcm9tIGEKICB0cmFjZSBmdW5jdGlvbiB0byBjaGFuZ2Ugd2hpY2ggbGluZSB3aWxsIGV4ZWN1dGUgbmV4dC4gIEEgY29tbWFuZCB0bwogIGV4cGxvaXQgdGhpcyBmcm9tIHBkYiBoYXMgYmVlbiBhZGRlZC4gIFtTRiBwYXRjaCAjNjQzODM1XQoKLSBUaGUgX2NvZGVjcyBzdXBwb3J0IG1vZHVsZSBmb3IgY29kZWNzLnB5IHdhcyB0dXJuZWQgaW50byBhIGJ1aWx0aW4KICBtb2R1bGUgdG8gYXNzdXJlIHRoYXQgYXQgbGVhc3QgdGhlIGJ1aWx0aW4gY29kZWNzIGFyZSBhdmFpbGFibGUKICB0byB0aGUgUHl0aG9uIHBhcnNlciBmb3Igc291cmNlIGNvZGUgZGVjb2RpbmcgYWNjb3JkaW5nIHRvIFBFUCAyNjMuCgotIGlzc3ViY2xhc3Mgbm93IHN1cHBvcnRzIGEgdHVwbGUgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwganVzdCBsaWtlCiAgaXNpbnN0YW5jZSBkb2VzLiBgYGlzc3ViY2xhc3MoWCwgKEEsIEIpKWBgIGlzIGVxdWl2YWxlbnQgdG8KICBgYGlzc3ViY2xhc3MoWCwgQSkgb3IgaXNzdWJjbGFzcyhYLCBCKWBgLgoKLSBUaGFua3MgdG8gQXJtaW4gUmlnbywgdGhlIGxhc3Qga25vd24gd2F5IHRvIHByb3Zva2UgYSBzeXN0ZW0gY3Jhc2gKICBieSBjbGV2ZXJseSBhcnJhbmdpbmcgZm9yIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0byBtdXRhdGUgYSBsaXN0CiAgZHVyaW5nIGEgbGlzdC5zb3J0KCkgb3BlcmF0aW9uIGhhcyBiZWVuIGZpeGVkLiAgVGhlIGVmZmVjdCBvZgogIGF0dGVtcHRpbmcgdG8gbXV0YXRlIGEgbGlzdCwgb3IgZXZlbiB0byBpbnNwZWN0IGl0cyBjb250ZW50cyBvcgogIGxlbmd0aCwgd2hpbGUgYSBzb3J0IGlzIGluIHByb2dyZXNzLCBpcyBub3QgZGVmaW5lZCBieSB0aGUgbGFuZ3VhZ2UuCiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhdHRlbXB0cyB0byBkZXRlY3QgbXV0YXRpb25zLAogIGFuZCByYWlzZSBWYWx1ZUVycm9yIGlmIG9uZSBvY2N1cnMsIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0CiAgYWxsIG11dGF0aW9ucyB3aWxsIGJlIGNhdWdodCwgb3IgdGhhdCBhbnkgd2lsbCBiZSBjYXVnaHQgYWNyb3NzCiAgcmVsZWFzZXMgb3IgaW1wbGVtZW50YXRpb25zLgoKLSBVbmljb2RlIGZpbGUgbmFtZSBwcm9jZXNzaW5nIGZvciBXaW5kb3dzIChQRVAgMjc3KSBpcyBpbXBsZW1lbnRlZC4KICBBbGwgcGxhdGZvcm1zIG5vdyBoYXZlIGFuIG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgYXR0cmlidXRlLAogIHdoaWNoIGlzIHNldCB0byBUcnVlIG9uIFdpbmRvd3MgTlQvMjAwMC9YUCwgYW5kIEZhbHNlIGVsc2V3aGVyZS4KCi0gQ29kZWMgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2tzIChQRVAgMjkzKSBhcmUgaW1wbGVtZW50ZWQuCiAgRXJyb3IgaGFuZGxpbmcgaW4gdW5pY29kZS5lbmNvZGUgb3Igc3RyLmRlY29kZSBjYW4gbm93IGJlIGN1c3RvbWl6ZWQuCgotIEEgc3VidGxlIGNoYW5nZSB0byB0aGUgc2VtYW50aWNzIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBpbnRlcm4oKToKICBpbnRlcm5lZCBzdHJpbmdzIGFyZSBubyBsb25nZXIgaW1tb3J0YWwuICBZb3UgbXVzdCBrZWVwIGEgcmVmZXJlbmNlCiAgdG8gdGhlIHJldHVybiB2YWx1ZSBpbnRlcm4oKSBhcm91bmQgdG8gZ2V0IHRoZSBiZW5lZml0LgoKLSBVc2Ugb2YgJ05vbmUnIGFzIGEgdmFyaWFibGUsIGFyZ3VtZW50IG9yIGF0dHJpYnV0ZSBuYW1lIG5vdwogIGlzc3VlcyBhIFN5bnRheFdhcm5pbmcuICBJbiB0aGUgZnV0dXJlLCBOb25lIG1heSBiZWNvbWUgYSBrZXl3b3JkLgoKLSBTRVRfTElORU5PIGlzIGdvbmUuICBjb19sbm90YWIgaXMgbm93IGNvbnN1bHRlZCB0byBkZXRlcm1pbmUgd2hlbiB0bwogIGNhbGwgdGhlIHRyYWNlIGZ1bmN0aW9uLiAgQyBjb2RlIHRoYXQgYWNjZXNzZWQgZl9saW5lbm8gc2hvdWxkIGNhbGwKICBQeUNvZGVfQWRkcjJMaW5lIGluc3RlYWQgKGZfbGluZW5vIGlzIHN0aWxsIHRoZXJlLCBidXQgb25seSBrZXB0IHVwCiAgdG8gZGF0ZSB3aGVuIHRoZXJlIGlzIGEgdHJhY2UgZnVuY3Rpb24gc2V0KS4KCi0gVGhlcmUncyBhIG5ldyB3YXJuaW5nIGNhdGVnb3J5LCBGdXR1cmVXYXJuaW5nLiAgVGhpcyBpcyB1c2VkIHRvIHdhcm4KICBhYm91dCBhIG51bWJlciBvZiBzaXR1YXRpb25zIHdoZXJlIHRoZSB2YWx1ZSBvciBzaWduIG9mIGFuIGludGVnZXIKICByZXN1bHQgd2lsbCBjaGFuZ2UgaW4gUHl0aG9uIDIuNCBhcyBhIHJlc3VsdCBvZiBQRVAgMjM3IChpbnRlZ2VyCiAgdW5pZmljYXRpb24pLiAgVGhlIHdhcm5pbmdzIGltcGxlbWVudCBzdGFnZSBCMCBtZW50aW9uZWQgaW4gdGhhdAogIFBFUC4gIFRoZSB3YXJuaW5ncyBhcmUgYWJvdXQgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgoKICAgIC0gT2N0YWwgYW5kIGhleCBsaXRlcmFscyB3aXRob3V0ICdMJyBwcmVmaXggaW4gdGhlIGluY2x1c2l2ZSByYW5nZQogICAgICBbMHg4MDAwMDAwMC4uMHhmZmZmZmZmZl07IHRoZXNlIGFyZSBjdXJyZW50bHkgbmVnYXRpdmUgaW50cywgYnV0CiAgICAgIGluIFB5dGhvbiAyLjQgdGhleSB3aWxsIGJlIHBvc2l0aXZlIGxvbmdzIHdpdGggdGhlIHNhbWUgYml0CiAgICAgIHBhdHRlcm4uCgogICAgLSBMZWZ0IHNoaWZ0cyBvbiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGNhdXNlIHRoZSBvdXRjb21lIHRvIGxvc2UKICAgICAgYml0cyBvciBoYXZlIGEgZGlmZmVyZW50IHNpZ24gdGhhbiB0aGUgbGVmdCBvcGVyYW5kLiAgVG8gYmUKICAgICAgcHJlY2lzZTogeDw8biB3aGVyZSB0aGlzIGN1cnJlbnRseSBkb2Vzbid0IHlpZWxkIHRoZSBzYW1lIHZhbHVlCiAgICAgIGFzIGxvbmcoeCk8PG47IGluIFB5dGhvbiAyLjQsIHRoZSBvdXRjb21lIHdpbGwgYmUgbG9uZyh4KTw8bi4KCiAgICAtIENvbnZlcnNpb25zIGZyb20gaW50cyB0byBzdHJpbmcgdGhhdCBzaG93IG5lZ2F0aXZlIHZhbHVlcyBhcwogICAgICB1bnNpZ25lZCBpbnRzIGluIHRoZSBpbmNsdXNpdmUgcmFuZ2UgWzB4ODAwMDAwMDAuLjB4ZmZmZmZmZmZdOwogICAgICB0aGlzIGFmZmVjdHMgdGhlIGZ1bmN0aW9ucyBoZXgoKSBhbmQgb2N0KCksIGFuZCB0aGUgc3RyaW5nCiAgICAgIGZvcm1hdHRpbmcgY29kZXMgJXUsICVvLCAleCwgYW5kICVYLiAgSW4gUHl0aG9uIDIuNCwgdGhlc2Ugd2lsbAogICAgICBzaG93IHNpZ25lZCB2YWx1ZXMgKGUuZy4gaGV4KC0xKSBjdXJyZW50bHkgcmV0dXJucyAiMHhmZmZmZmZmZiI7CiAgICAgIGluIFB5dGhvbiAyLjQgaXQgd2lsbCByZXR1cm4gIi0weDEiKS4KCi0gVGhlIGJpdHMgbWFuaXB1bGF0ZWQgdW5kZXIgdGhlIGNvdmVyIGJ5IHN5cy5zZXRjaGVja2ludGVydmFsKCkgaGF2ZQogIGJlZW4gY2hhbmdlZC4gIEJvdGggdGhlIGNoZWNrIGludGVydmFsIGFuZCB0aGUgdGlja2VyIHVzZWQgdG8gYmUKICBwZXItdGhyZWFkIHZhbHVlcy4gIFRoZXkgYXJlIG5vdyBqdXN0IGEgcGFpciBvZiBnbG9iYWwgdmFyaWFibGVzLgogIEluIGFkZGl0aW9uLCB0aGUgZGVmYXVsdCBjaGVjayBpbnRlcnZhbCB3YXMgYm9vc3RlZCBmcm9tIDEwIHRvIDEwMAogIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4gIFRoaXMgbWF5IGhhdmUgc29tZSBlZmZlY3Qgb24gc3lzdGVtcyB0aGF0CiAgcmVsaWVkIG9uIHRoZSBvbGQgZGVmYXVsdCB2YWx1ZS4gIEluIHBhcnRpY3VsYXIsIGluIG11bHRpLXRocmVhZGVkCiAgYXBwbGljYXRpb25zIHdoaWNoIHRyeSB0byBiZSBoaWdobHkgcmVzcG9uc2l2ZSwgcmVzcG9uc2UgdGltZSB3aWxsCiAgaW5jcmVhc2UgYnkgc29tZSAocGVyaGFwcyBpbXBlcmNlcHRpYmxlKSBhbW91bnQuCgotIFdoZW4gbXVsdGlwbHlpbmcgdmVyeSBsYXJnZSBpbnRlZ2VycywgYSB2ZXJzaW9uIG9mIHRoZSBzby1jYWxsZWQKICBLYXJhdHN1YmEgYWxnb3JpdGhtIGlzIG5vdyB1c2VkLiAgVGhpcyBpcyBtb3N0IGVmZmVjdGl2ZSBpZiB0aGUKICBpbnB1dHMgaGF2ZSByb3VnaGx5IHRoZSBzYW1lIHNpemUuICBJZiB0aGV5IGJvdGggaGF2ZSBhYm91dCBOIGRpZ2l0cywKICBLYXJhdHN1YmEgbXVsdGlwbGljYXRpb24gaGFzIE8oTioqMS41OCkgcnVudGltZSAodGhlIGV4cG9uZW50IGlzCiAgbG9nX2Jhc2VfMigzKSkgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgTyhOKioyKS4gIE1lYXN1cmVkIHJlc3VsdHMgbWF5CiAgYmUgYmV0dGVyIG9yIHdvcnNlIHRoYW4gdGhhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtIHF1aXJrcy4gIEJlc2lkZXMKICB0aGUgTygpIGltcHJvdmVtZW50IGluIHJhdyBpbnN0cnVjdGlvbiBjb3VudCwgdGhlIEthcmF0c3ViYSBhbGdvcml0aG0KICBhcHBlYXJzIHRvIGhhdmUgbXVjaCBiZXR0ZXIgY2FjaGUgYmVoYXZpb3Igb24gZXh0cmVtZWx5IGxhcmdlIGludGVnZXJzCiAgKHN0YXJ0aW5nIGluIHRoZSBiYWxscGFyayBvZiBhIG1pbGxpb24gYml0cykuICBOb3RlIHRoYXQgdGhpcyBpcyBhCiAgc2ltcGxlIGltcGxlbWVudGF0aW9uLCBhbmQgdGhlcmUncyBubyBpbnRlbnQgaGVyZSB0byBjb21wZXRlIHdpdGgsCiAgZS5nLiwgR01QLiAgSXQgZ2l2ZXMgYSB2ZXJ5IG5pY2Ugc3BlZWR1cCB3aGVuIGl0IGFwcGxpZXMsIGJ1dCBhIHBhY2thZ2UKICBkZXZvdGVkIHRvIGZhc3QgbGFyZ2UtaW50ZWdlciBhcml0aG1ldGljIHNob3VsZCBydW4gY2lyY2xlcyBhcm91bmQgaXQuCgotIHUnJWMnIHdpbGwgbm93IHJhaXNlIGEgVmFsdWVFcnJvciBpbiBjYXNlIHRoZSBhcmd1bWVudCBpcyBhbgogIGludGVnZXIgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2Ugb2YgVW5pY29kZSBjb2RlIHBvaW50IG9yZGluYWxzLgoKLSBUaGUgdGVtcGZpbGUgbW9kdWxlIGhhcyBiZWVuIG92ZXJoYXVsZWQgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LiAgVGhlCiAgbWt0ZW1wKCkgZnVuY3Rpb24gaXMgbm93IGRlcHJlY2F0ZWQ7IG5ldywgc2FmZSByZXBsYWNlbWVudHMgYXJlCiAgbWtzdGVtcCgpIChmb3IgZmlsZXMpIGFuZCBta2R0ZW1wKCkgKGZvciBkaXJlY3RvcmllcyksIGFuZCB0aGUKICBoaWdoZXItbGV2ZWwgZnVuY3Rpb25zIE5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFuZCBUZW1wb3JhcnlGaWxlKCkuCiAgVXNlIG9mIHNvbWUgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGlzIG1vZHVsZSBpcyBhbHNvIGRlcHJlY2F0ZWQ7IHRoZQogIG5ldyBmdW5jdGlvbnMgaGF2ZSBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcm92aWRlIHRoZSBzYW1lCiAgZnVuY3Rpb25hbGl0eS4gIEFsbCBMaWIsIFRvb2xzIGFuZCBEZW1vIG1vZHVsZXMgdGhhdCB1c2VkIHRoZSB1bnNhZmUKICBpbnRlcmZhY2VzIGhhdmUgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgc2FmZSByZXBsYWNlbWVudHMuICBUaGFua3MKICB0byBaYWNrIFdlaW5iZXJnIQoKLSBXaGVuIHggaXMgYW4gb2JqZWN0IHdob3NlIGNsYXNzIGltcGxlbWVudHMgX19tdWxfXyBhbmQgX19ybXVsX18sCiAgMS4wKnggd291bGQgY29ycmVjdGx5IGludm9rZSBfX3JtdWxfXywgYnV0IDEqeCB3b3VsZCBlcnJvbmVvdXNseQogIGludm9rZSBfX211bF9fLiAgVGhpcyB3YXMgZHVlIHRvIHRoZSBzZXF1ZW5jZS1yZXBlYXQgY29kZSBpbiB0aGUgaW50CiAgdHlwZS4gIFRoaXMgaGFzIGJlZW4gZml4ZWQgbm93LgoKLSBQcmV2aW91c2x5LCAic3RyMSBpbiBzdHIyIiByZXF1aXJlZCBzdHIxIHRvIGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAxLgogIFRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcmVsYXhlZCB0byBhbGxvdyBzdHIxIHRvIGJlIGEgc3RyaW5nIG9mCiAgYW55IGxlbmd0aC4gIFRodXMgIidlbCcgaW4gJ2hlbGxvIHdvcmxkJyIgcmV0dXJucyBUcnVlIG5vdy4KCi0gRmlsZSBvYmplY3RzIGFyZSBub3cgdGhlaXIgb3duIGl0ZXJhdG9ycy4gIEZvciBhIGZpbGUgZiwgaXRlcihmKSBub3cKICByZXR1cm5zIGYgKHVubGVzcyBmIGlzIGNsb3NlZCksIGFuZCBmLm5leHQoKSBpcyBzaW1pbGFyIHRvCiAgZi5yZWFkbGluZSgpIHdoZW4gRU9GIGlzIG5vdCByZWFjaGVkOyBob3dldmVyLCBmLm5leHQoKSB1c2VzIGEKICByZWFkYWhlYWQgYnVmZmVyIHRoYXQgbWVzc2VzIHVwIHRoZSBmaWxlIHBvc2l0aW9uLCBzbyBtaXhpbmcKICBmLm5leHQoKSBhbmQgZi5yZWFkbGluZSgpIChvciBvdGhlciBtZXRob2RzKSBkb2Vzbid0IHdvcmsgcmlnaHQuCiAgQ2FsbGluZyBmLnNlZWsoKSBkcm9wcyB0aGUgcmVhZGFoZWFkIGJ1ZmZlciwgYnV0IG90aGVyIG9wZXJhdGlvbnMKICBkb24ndC4gIEl0IHNvIGhhcHBlbnMgdGhhdCB0aGlzIGdpdmVzIGEgbmljZSBhZGRpdGlvbmFsIHNwZWVkIGJvb3N0CiAgdG8gImZvciBsaW5lIGluIGZpbGU6IjsgdGhlIHhyZWFkbGluZXMgbWV0aG9kIGFuZCBjb3JyZXNwb25kaW5nCiAgbW9kdWxlIGFyZSBub3cgb2Jzb2xldGUuICBUaGFua3MgdG8gT3JlbiBUaXJvc2ghCgotIEVuY29kaW5nIGRlY2xhcmF0aW9ucyAoUEVQIDI2MywgcGhhc2UgMSkgaGF2ZSBiZWVuIGltcGxlbWVudGVkLiAgQQogIGNvbW1lbnQgb2YgdGhlIGZvcm0gIiMgLSotIGNvZGluZzogPGVuY29kaW5nbmFtZT4gLSotIiBpbiB0aGUgZmlyc3QKICBvciBzZWNvbmQgbGluZSBvZiBhIFB5dGhvbiBzb3VyY2UgZmlsZSBpbmRpY2F0ZXMgdGhlIGVuY29kaW5nLgoKLSBsaXN0LnNvcnQoKSBoYXMgYSBuZXcgaW1wbGVtZW50YXRpb24uICBXaGlsZSBjcm9zcy1wbGF0Zm9ybSByZXN1bHRzCiAgbWF5IHZhcnksIGFuZCBpbiBkYXRhLWRlcGVuZGVudCB3YXlzLCB0aGlzIGlzIG11Y2ggZmFzdGVyIG9uIG1hbnkKICBraW5kcyBvZiBwYXJ0aWFsbHkgb3JkZXJlZCBsaXN0cyB0aGFuIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiwKICBhbmQgcmVwb3J0ZWQgdG8gYmUganVzdCBhcyBmYXN0IG9uIHJhbmRvbWx5IG9yZGVyZWQgbGlzdHMgb24KICBzZXZlcmFsIG1ham9yIHBsYXRmb3Jtcy4gIFRoaXMgc29ydCBpcyBhbHNvIHN0YWJsZSAoaWYgQT09QiBhbmQgQQogIHByZWNlZGVzIEIgaW4gdGhlIGxpc3QgYXQgdGhlIHN0YXJ0LCBBIHByZWNlZGVzIEIgYWZ0ZXIgdGhlIHNvcnQgdG9vKSwKICBhbHRob3VnaCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgc3RhYmlsaXR5LiAgQQogIHBvdGVudGlhbCBkcmF3YmFjayBpcyB0aGF0IGxpc3Quc29ydCgpIG1heSByZXF1aXJlIHRlbXAgc3BhY2Ugb2YKICBsZW4obGlzdCkqMiBieXRlcyAoYGAqNGBgIG9uIGEgNjQtYml0IG1hY2hpbmUpLiAgSXQncyB0aGVyZWZvcmUgcG9zc2libGUKICBmb3IgbGlzdC5zb3J0KCkgdG8gcmFpc2UgTWVtb3J5RXJyb3Igbm93LCBldmVuIGlmIGEgY29tcGFyaXNvbiBmdW5jdGlvbgogIGRvZXMgbm90LiAgU2VlIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvNTg3MDc2PiBmb3IgZnVsbCBkZXRhaWxzLgoKLSBBbGwgc3RhbmRhcmQgaXRlcmF0b3JzIG5vdyBlbnN1cmUgdGhhdCwgb25jZSBTdG9wSXRlcmF0aW9uIGhhcyBiZWVuCiAgcmFpc2VkLCBhbGwgZnV0dXJlIGNhbGxzIHRvIG5leHQoKSBvbiB0aGUgc2FtZSBpdGVyYXRvciB3aWxsIGFsc28KICByYWlzZSBTdG9wSXRlcmF0aW9uLiAgVGhlcmUgdXNlZCB0byBiZSB2YXJpb3VzIGNvdW50ZXJleGFtcGxlcyB0bwogIHRoaXMgYmVoYXZpb3IsIHdoaWNoIGNvdWxkIGNhdXNlZCBjb25mdXNpb24gb3Igc3VidGxlIHByb2dyYW0KICBicmVha2FnZSwgd2l0aG91dCBhbnkgYmVuZWZpdHMuICAoTm90ZSB0aGF0IHRoaXMgaXMgc3RpbGwgYW4KICBpdGVyYXRvcidzIHJlc3BvbnNpYmlsaXR5OyB0aGUgaXRlcmF0b3IgZnJhbWV3b3JrIGRvZXMgbm90IGVuZm9yY2UKICB0aGlzLikKCi0gQ3RybCtDIGhhbmRsaW5nIG9uIFdpbmRvd3MgaGFzIGJlZW4gbWFkZSBtb3JlIGNvbnNpc3RlbnQgd2l0aAogIG90aGVyIHBsYXRmb3Jtcy4gIEtleWJvYXJkSW50ZXJydXB0IGNhbiBub3cgcmVsaWFibHkgYmUgY2F1Z2h0LAogIGFuZCBDdHJsK0MgYXQgYW4gaW50ZXJhY3RpdmUgcHJvbXB0IG5vIGxvbmdlciB0ZXJtaW5hdGVzIHRoZQogIHByb2Nlc3MgdW5kZXIgTlQvMmsvWFAgKGl0IG5ldmVyIGRpZCB1bmRlciBXaW45eCkuICBDdHJsK0Mgd2lsbAogIGludGVycnVwdCB0aW1lLnNsZWVwKCkgaW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgYW55IGNoaWxkIHByb2Nlc3NlcwogIGNyZWF0ZWQgdmlhIHRoZSBwb3BlbiBmYW1pbHkgKG9uIHdpbjJrOyB3ZSBjYW4ndCBtYWtlIHdpbjl4IHdvcmsKICByZWxpYWJseSkgYXJlIGFsc28gaW50ZXJydXB0ZWQgKGFzIGdlbmVyYWxseSBoYXBwZW5zIG9uIGZvciBMaW51eC9Vbml4LikKICBbU0YgYnVncyAyMzEyNzMsIDQzOTk5MiBhbmQgNTgxMjMyXQoKLSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSBoYXMgYmVlbiBhZGRlZCBvbiBXaW5kb3dzLiAgVGhpcwogIHJldHVybnMgYSB0dXBsZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSB2ZXJzaW9uIG9mIFdpbmRvd3MKICBjdXJyZW50bHkgcnVubmluZy4KCi0gU2xpY2VzIGFuZCByZXBldGl0aW9ucyBvZiBidWZmZXIgb2JqZWN0cyBub3cgY29uc2lzdGVudGx5IHJldHVybgogIGEgc3RyaW5nLiAgRm9ybWVybHksIHN0cmluZ3Mgd291bGQgYmUgcmV0dXJuZWQgbW9zdCBvZiB0aGUgdGltZSwKICBidXQgYSBidWZmZXIgb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHJlcGV0aXRpb24gY291bnQKICB3YXMgb25lIG9yIHdoZW4gdGhlIHNsaWNlIHJhbmdlIHdhcyBhbGwgaW5jbHVzaXZlLgoKLSBVbmljb2RlIG9iamVjdHMgaW4gc3lzLnBhdGggYXJlIG5vIGxvbmdlciBpZ25vcmVkIGJ1dCB0cmVhdGVkCiAgYXMgZGlyZWN0b3J5IG5hbWVzLgoKLSBGaXhlZCBzdHJpbmcuc3RhcnRzd2l0aCBhbmQgc3RyaW5nLmVuZHN3aXRoIGJ1aWx0aW4gbWV0aG9kcwogIHNvIHRoZXkgYWNjZXB0IG5lZ2F0aXZlIGluZGljZXMuICBbU0YgYnVnIDQ5Mzk1MV0KCi0gRml4ZWQgYSBidWcgd2l0aCBhIGNvbnRpbnVlIGluc2lkZSBhIHRyeSBibG9jayBhbmQgYSB5aWVsZCBpbiB0aGUKICBmaW5hbGx5IGNsYXVzZS4gIFtTRiBidWcgNTY3NTM4XQoKLSBNb3N0IGJ1aWx0aW4gc2VxdWVuY2VzIG5vdyBzdXBwb3J0ICJleHRlbmRlZCBzbGljZXMiLCBpLmUuIHNsaWNlcwogIHdpdGggYSB0aGlyZCAic3RyaWRlIiBwYXJhbWV0ZXIuICBGb3IgZXhhbXBsZSwgImhlbGxvIHdvcmxkIls6Oi0xXQogIGdpdmVzICJkbHJvdyBvbGxlaCIuCgotIEEgbmV3IHdhcm5pbmcgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyB3YXMgYWRkZWQgdG8gcHJvdmlkZQogIGRpcmVjdGlvbiBvbiBmZWF0dXJlcyB3aGljaCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVwcmVjYXRlZC4KICBUaGUgd2FybmluZyB3aWxsIG5vdCBiZSBwcmludGVkIGJ5IGRlZmF1bHQuICBUbyBzZWUgdGhlIHBlbmRpbmcKICBkZXByZWNhdGlvbnMsIHVzZSAtV2Fsd2F5czo6UGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzo6CiAgYXMgYSBjb21tYW5kIGxpbmUgb3B0aW9uIG9yIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCkgaW4gY29kZS4KCi0gRGVwcmVjYXRlZCBmZWF0dXJlcyBvZiB4cmFuZ2Ugb2JqZWN0cyBoYXZlIGJlZW4gcmVtb3ZlZCBhcwogIHByb21pc2VkLiAgVGhlIHN0YXJ0LCBzdG9wLCBhbmQgc3RlcCBhdHRyaWJ1dGVzIGFuZCB0aGUgdG9saXN0KCkKICBtZXRob2Qgbm8gbG9uZ2VyIGV4aXN0LiAgeHJhbmdlIHJlcGV0aXRpb24gYW5kIHNsaWNpbmcgaGF2ZSBiZWVuCiAgcmVtb3ZlZC4KCi0gTmV3IGJ1aWx0aW4gZnVuY3Rpb24gZW51bWVyYXRlKHgpLCBmcm9tIFBFUCAyNzkuICBFeGFtcGxlOgogIGVudW1lcmF0ZSgiYWJjIikgaXMgYW4gaXRlcmF0b3IgcmV0dXJuaW5nICgwLCJhIiksICgxLCJiIiksICgyLCJjIikuCiAgVGhlIGFyZ3VtZW50IGNhbiBiZSBhbiBhcmJpdHJhcnkgaXRlcmFibGUgb2JqZWN0LgoKLSBUaGUgYXNzZXJ0IHN0YXRlbWVudCBubyBsb25nZXIgdGVzdHMgX19kZWJ1Z19fIGF0IHJ1bnRpbWUuICBUaGlzIG1lYW5zCiAgdGhhdCBhc3NlcnQgc3RhdGVtZW50cyBjYW5ub3QgYmUgZGlzYWJsZWQgYnkgYXNzaWduaW5nIGEgZmFsc2UgdmFsdWUKICB0byBfX2RlYnVnX18uCgotIEEgbWV0aG9kIHpmaWxsKCkgd2FzIGFkZGVkIHRvIHN0ciBhbmQgdW5pY29kZSwgdGhhdCBmaWxscyBhIG51bWVyaWMKICBzdHJpbmcgdG8gdGhlIGxlZnQgd2l0aCB6ZXJvcy4gIEZvciBleGFtcGxlLAogICIrMTIzIi56ZmlsbCg2KSAtPiAiKzAwMTIzIi4KCi0gQ29tcGxleCBudW1iZXJzIHN1cHBvcnRlZCBkaXZtb2QoKSBhbmQgdGhlIC8vIGFuZCAlIG9wZXJhdG9ycywgYnV0CiAgdGhlc2UgbWFrZSBubyBzZW5zZS4gIFNpbmNlIHRoaXMgd2FzIGRvY3VtZW50ZWQsIHRoZXkncmUgYmVpbmcKICBkZXByZWNhdGVkIG5vdy4KCi0gU3RyaW5nIGFuZCB1bmljb2RlIG1ldGhvZHMgbHN0cmlwKCksIHJzdHJpcCgpIGFuZCBzdHJpcCgpIG5vdyB0YWtlCiAgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIGNoYXJhY3RlcnMgdG8gc3RyaXAuICBGb3IKICBleGFtcGxlLCAiRm9vISEhPyE/IT8iLnJzdHJpcCgiPyEiKSAtPiAiRm9vIi4KCi0gVGhlcmUncyBhIG5ldyBkaWN0aW9uYXJ5IGNvbnN0cnVjdG9yIChhIGNsYXNzIG1ldGhvZCBvZiB0aGUgZGljdAogIGNsYXNzKSwgZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgdmFsdWU9Tm9uZSkuICBJdCBjb25zdHJ1Y3RzIGEKICBkaWN0aW9uYXJ5IHdpdGgga2V5cyB0YWtlbiBmcm9tIHRoZSBpdGVyYWJsZSBhbmQgYWxsIHZhbHVlcyBzZXQgdG8gYQogIHNpbmdsZSB2YWx1ZS4gIEl0IGNhbiBiZSB1c2VkIGZvciBidWlsZGluZyBzZXRzIGFuZCBmb3IgcmVtb3ZpbmcKICBkdXBsaWNhdGVzIGZyb20gc2VxdWVuY2VzLgoKLSBBZGRlZCBhIG5ldyBkaWN0IG1ldGhvZCBwb3Aoa2V5KS4gIFRoaXMgcmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUKICB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGtleS4gIFtTRiBwYXRjaCAjNTM5OTQ5XQoKLSBBIG5ldyBidWlsdC1pbiB0eXBlLCBib29sLCBoYXMgYmVlbiBhZGRlZCwgYXMgd2VsbCBhcyBidWlsdC1pbgogIG5hbWVzIGZvciBpdHMgdHdvIHZhbHVlcywgVHJ1ZSBhbmQgRmFsc2UuICBDb21wYXJpc29ucyBhbmQgc3VuZHJ5CiAgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IHJldHVybiBhIHRydXRoIHZhbHVlIGhhdmUgYmVlbiBjaGFuZ2VkIHRvCiAgcmV0dXJuIGEgYm9vbCBpbnN0ZWFkLiAgUmVhZCBQRVAgMjg1IGZvciBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcwogIGlzIGJhY2t3YXJkIGNvbXBhdGlibGUuCgotIEZpeGVkIHR3byBidWdzIHJlcG9ydGVkIGFzIFNGICM1MzU5MDU6IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywKICBkZWFsbG9jYXRpbmcgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0IGluIHRoZQogIGdhcmJhZ2UgY29sbGVjdG9yLCBkdWUgdG8gaW50ZXJhY3Rpb24gd2l0aCB0aGUgInRyYXNoY2FuIiBjb2RlOwogIGFjY2VzcyB0byB0aGUgY3VycmVudCBmcmFtZSBkdXJpbmcgZGVzdHJ1Y3Rpb24gb2YgYSBsb2NhbCB2YXJpYWJsZQogIGNvdWxkIGFjY2VzcyBhIHBvaW50ZXIgdG8gZnJlZWQgbWVtb3J5LgoKLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGFsbG9jYXRvciAoInB5bWFsbG9jIikgaGFzIGJlZW4gZW5hYmxlZCBieQogIGRlZmF1bHQuICBUaGUgcmVjb21tZW5kZWQgcHJhY3RpY2UgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZAogIGRlYWxsb2NhdGlvbiBoYXMgYmVlbiBzdHJlYW1saW5lZC4gIEEgaGVhZGVyIGZpbGUgaXMgaW5jbHVkZWQsCiAgTWlzYy9weW1lbWNvbXBhdC5oLCB3aGljaCBjYW4gYmUgYnVuZGxlZCB3aXRoIDNyZCBwYXJ0eSBleHRlbnNpb25zCiAgYW5kIGxldHMgdGhlbSB1c2UgdGhlIHNhbWUgQVBJIHdpdGggUHl0aG9uIHZlcnNpb25zIGZyb20gMS41LjIKICBvbndhcmRzLgoKLSBQeUVycl9EaXNwbGF5IHdpbGwgcHJvdmlkZSBmaWxlIGFuZCBsaW5lIGluZm9ybWF0aW9uIGZvciBhbGwgZXhjZXB0aW9ucwogIHRoYXQgaGF2ZSBhbiBhdHRyaWJ1dGUgcHJpbnRfZmlsZV9hbmRfbGluZSwgbm90IGp1c3QgU3ludGF4RXJyb3JzLgoKLSBUaGUgVVRGLTggY29kZWMgd2lsbCBub3cgZW5jb2RlIGFuZCBkZWNvZGUgVW5pY29kZSBzdXJyb2dhdGVzCiAgY29ycmVjdGx5IGFuZCB3aXRob3V0IHJhaXNpbmcgZXhjZXB0aW9ucyBmb3IgdW5wYWlyZWQgb25lcy4KCi0gVW5pdmVyc2FsIG5ld2xpbmVzIChQRVAgMjc4KSBpcyBpbXBsZW1lbnRlZC4gIEJyaWVmbHksIHVzaW5nICdVJwogIGluc3RlYWQgb2YgJ3InIHdoZW4gb3BlbmluZyBhIHRleHQgZmlsZSBmb3IgcmVhZGluZyBjaGFuZ2VzIHRoZSBsaW5lCiAgZW5kaW5nIGNvbnZlbnRpb24gc28gdGhhdCBhbnkgb2YgJ1xyJywgJ1xyXG4nLCBhbmQgJ1xuJyBpcwogIHJlY29nbml6ZWQgKGV2ZW4gbWl4ZWQgaW4gb25lIGZpbGUpOyBhbGwgdGhyZWUgYXJlIGNvbnZlcnRlZCB0bwogICdcbicsIHRoZSBzdGFuZGFyZCBQeXRob24gbGluZSBlbmQgY2hhcmFjdGVyLgoKLSBmaWxlLnhyZWFkbGluZXMoKSBub3cgcmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgZmlsZSBpcyBjbG9zZWQ6CiAgUHJldmlvdXNseSwgYW4geHJlYWRsaW5lcyBvYmplY3Qgd2FzIHJldHVybmVkIHdoaWNoIHdvdWxkIHJhaXNlCiAgYSBWYWx1ZUVycm9yIHdoZW4gdGhlIHhyZWFkbGluZXMubmV4dCgpIG1ldGhvZCB3YXMgY2FsbGVkLgoKLSBzeXMuZXhpdCgpIGluYWR2ZXJ0ZW50bHkgYWxsb3dlZCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LgogIEFuIGV4Y2VwdGlvbiB3aWxsIG5vdyBiZSByYWlzZWQgaWYgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCBpcyB1c2VkLgoKLSBDaGFuZ2VkIGV2YWx1YXRpb24gb3JkZXIgb2YgZGljdGlvbmFyeSBsaXRlcmFscyB0byBjb25mb3JtIHRvIHRoZQogIGdlbmVyYWwgbGVmdCB0byByaWdodCBldmFsdWF0aW9uIG9yZGVyIHJ1bGUuIE5vdyB7ZjEoKTogZjIoKX0gd2lsbAogIGV2YWx1YXRlIGYxIGZpcnN0LgoKLSBGaXhlZCBidWcgIzUyMTc4Mjogd2hlbiBhIGZpbGUgd2FzIGluIG5vbi1ibG9ja2luZyBtb2RlLCBmaWxlLnJlYWQoKQogIGNvdWxkIHNpbGVudGx5IGxvc2UgZGF0YSBvciB3cm9uZ2x5IHRocm93IGFuIHVua25vd24gZXJyb3IuCgotIFRoZSBzcV9yZXBlYXQsIHNxX2lucGxhY2VfcmVwZWF0LCBzcV9jb25jYXQgYW5kIHNxX2lucGxhY2VfY29uY2F0CiAgc2xvdHMgYXJlIG5vdyBhbHdheXMgdHJpZWQgYWZ0ZXIgdHJ5aW5nIHRoZSBjb3JyZXNwb25kaW5nIG5iXyogc2xvdHMuCiAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBtaW5vciBidWdzIChzZWUgYnVnICM2MjQ4MDcpLgoKLSBGaXggcHJvYmxlbSB3aXRoIGR5bmFtaWMgbG9hZGluZyBvbiA2NC1iaXQgQUlYIChzZWUgYnVnICM2Mzk5NDUpLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gQWRkZWQgdGhyZWUgb3BlcmF0b3JzIHRvIHRoZSBvcGVyYXRvciBtb2R1bGU6CiAgICBvcGVyYXRvci5wb3coYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSoqYi4KICAgIG9wZXJhdG9yLmlzXyhhLGIpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG86ICBhIGlzIGIuCiAgICBvcGVyYXRvci5pc19ub3QoYSxiKSB3aGljaCBpcyBlcXVpdmFsZW50IHRvOiAgYSBpcyBub3QgYi4KCi0gcG9zaXgub3BlbnB0eSBub3cgd29ya3Mgb24gYWxsIHN5c3RlbXMgdGhhdCBoYXZlIC9kZXYvcHRteC4KCi0gQSBtb2R1bGUgemlwaW1wb3J0IGV4aXN0cyB0byBzdXBwb3J0IGltcG9ydGluZyBjb2RlIGZyb20gemlwCiAgYXJjaGl2ZXMuCgotIFRoZSBuZXcgZGF0ZXRpbWUgbW9kdWxlIHN1cHBsaWVzIGNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBkYXRlcyBhbmQKICB0aW1lcy4gIFRoZSBiYXNpYyBkZXNpZ24gY2FtZSBmcm9tIHRoZSBab3BlICJmaXNoYm93bCBwcm9jZXNzIiwgYW5kCiAgZmF2b3JzIHByYWN0aWNhbCBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucyBvdmVyIGNhbGVuZGFyIGVzb3RlcmljYS4gIFNlZQoKICAgICAgaHR0cDovL3d3dy56b3BlLm9yZy9NZW1iZXJzL2ZkcmFrZS9EYXRlVGltZVdpa2kvRnJvbnRQYWdlCgotIF90a2ludGVyIG5vdyByZXR1cm5zIFRjbCBvYmplY3RzLCBpbnN0ZWFkIG9mIHN0cmluZ3MuIE9iamVjdHMgd2hpY2gKICBoYXZlIFB5dGhvbiBlcXVpdmFsZW50cyBhcmUgY29udmVydGVkIHRvIFB5dGhvbiBvYmplY3RzLCBvdGhlciBvYmplY3RzCiAgYXJlIHdyYXBwZWQuIFRoaXMgY2FuIGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgd2FudG9iamVjdHMgbWV0aG9kLAogIG9yIFRraW50ZXIud2FudG9iamVjdHMuCgotIFRoZSBQeUJTRERCIHdyYXBwZXIgYXJvdW5kIHRoZSBTbGVlcHljYXQgQmVya2VsZXkgREIgbGlicmFyeSBoYXMKICBiZWVuIGFkZGVkIGFzIHRoZSBwYWNrYWdlIGJzZGRiLiAgVGhlIHRyYWRpdGlvbmFsIGJzZGRiIG1vZHVsZSBpcwogIHN0aWxsIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSwgYnV0IG5vdCBidWlsdCBhdXRvbWF0aWNhbGx5IGFueW1vcmUsCiAgYW5kIGlzIG5vdyBuYW1lZCBic2RkYjE4NS4gIFRoaXMgc3VwcG9ydHMgQmVya2VsZXkgREIgdmVyc2lvbnMgZnJvbQogIDMuMCB0byA0LjEuICBGb3IgaGVscCBjb252ZXJ0aW5nIHlvdXIgZGF0YWJhc2VzIGZyb20gdGhlIG9sZCBtb2R1bGUgKHdoaWNoCiAgcHJvYmFibHkgdXNlZCBhbiBvYnNvbGV0ZSB2ZXJzaW9uIG9mIEJlcmtlbGV5IERCKSB0byB0aGUgbmV3IG1vZHVsZSwgc2VlCiAgdGhlIGRiMnBpY2tsZS5weSBhbmQgcGlja2xlMmRiLnB5IHNjcmlwdHMgZGVzY3JpYmVkIGluIHRoZSBUb29scy9EZW1vcwogIHNlY3Rpb24gYWJvdmUuCgotIHVuaWNvZGVkYXRhIHdhcyB1cGRhdGVkIHRvIFVuaWNvZGUgMy4yLiBJdCBzdXBwb3J0cyBub3JtYWxpemF0aW9uCiAgYW5kIG5hbWVzIGZvciBIYW5ndWwgc3lsbGFibGVzIGFuZCBDSksgdW5pZmllZCBpZGVvZ3JhcGhzLgoKLSByZXNvdXJjZS5nZXRybGltaXQoKSBub3cgcmV0dXJucyBsb25ncyBpbnN0ZWFkIG9mIGludHMuCgotIHJlYWRsaW5lIG5vdyBkeW5hbWljYWxseSBhZGp1c3RzIGl0cyBpbnB1dC9vdXRwdXQgc3RyZWFtIGlmCiAgc3lzLnN0ZGluL3N0ZG91dCBjaGFuZ2VzLgoKLSBUaGUgX3RraW50ZXIgbW9kdWxlIChhbmQgaGVuY2UgVGtpbnRlcikgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IKICBUY2wvVGsgOC4wIGFuZCA4LjEuICBPbmx5IFRjbC9UayB2ZXJzaW9ucyA4LjIsIDguMyBhbmQgOC40IGFyZQogIHN1cHBvcnRlZC4KCi0gY1BpY2tsZS5CYWRQaWNrbGVHZXQgaXMgbm93IGEgY2xhc3MuCgotIFRoZSB0aW1lIHN0YW1wcyBpbiBvcy5zdGF0X3Jlc3VsdCBhcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwogIGFmdGVyIHN0YXRfZmxvYXRfdGltZXMgaGFzIGJlZW4gY2FsbGVkLgoKLSBJZiB0aGUgc2l6ZSBwYXNzZWQgdG8gbW1hcC5tbWFwKCkgaXMgbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKICBmaWxlIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gW1NGIGJ1ZyA1ODU3OTJdCgotIFRoZSB4cmVhZGxpbmVzIG1vZHVsZSBpcyBzbGF0ZWQgZm9yIG9ic29sZXNjZW5jZS4KCi0gVGhlIHN0cnB0aW1lIGZ1bmN0aW9uIGluIHRoZSB0aW1lIG1vZHVsZSBpcyBub3cgYWx3YXlzIGF2YWlsYWJsZSAoYQogIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHdoZW4gdGhlIEMgbGlicmFyeSBkb2Vzbid0IGRlZmluZSBpdCkuCgotIFRoZSAnbmV3JyBtb2R1bGUgaXMgbm8gbG9uZ2VyIGFuIGV4dGVuc2lvbiwgYnV0IGEgUHl0aG9uIG1vZHVsZSB0aGF0CiAgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXRzIGNvbnRlbnRzIGFyZSBubyBsb25nZXIKICBmdW5jdGlvbnMgYnV0IGNhbGxhYmxlIHR5cGUgb2JqZWN0cy4KCi0gVGhlIGJzZGRiLipvcGVuIGZ1bmN0aW9ucyBjYW4gbm93IHRha2UgJ05vbmUnIGFzIGEgZmlsZW5hbWUuCiAgVGhpcyB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBpbi1tZW1vcnkgYnNkZGIgdGhhdCB3b24ndCBiZQogIHdyaXR0ZW4gdG8gZGlzay4KCi0gcG9zaXguZ2V0bG9hZGF2ZywgcG9zaXgubGNob3duLCBwb3NpeC5raWxscGcsIHBvc2l4Lm1rbm9kLCBhbmQKICBwb3NpeC5nZXRwZ2lkIGhhdmUgYmVlbiBhZGRlZCB3aGVyZSBhdmFpbGFibGUuCgotIFRoZSBsb2NhbGUgbW9kdWxlIG5vdyBleHBvc2VzIHRoZSBDIGxpYnJhcnkncyBnZXR0ZXh0IGludGVyZmFjZS4gSXQKICBhbHNvIGhhcyBhIG5ldyBmdW5jdGlvbiBnZXRwcmVmZXJyZWRlbmNvZGluZy4KCi0gQSBzZWN1cml0eSBob2xlICgiZG91YmxlIGZyZWUiKSB3YXMgZm91bmQgaW4gemxpYi0xLjEuMywgYSBwb3B1bGFyCiAgdGhpcmQgcGFydHkgY29tcHJlc3Npb24gbGlicmFyeSB1c2VkIGJ5IHNvbWUgUHl0aG9uIG1vZHVsZXMuICBUaGUKICBob2xlIHdhcyBxdWlja2x5IHBsdWdnZWQgaW4gemxpYi0xLjEuNCwgYW5kIHRoZSBXaW5kb3dzIGJ1aWxkIG9mCiAgUHl0aG9uIG5vdyBzaGlwcyB3aXRoIHpsaWItMS4xLjQuCgotIHB3ZCwgZ3JwLCBhbmQgcmVzb3VyY2UgcmV0dXJuIGVuaGFuY2VkIHR1cGxlcyBub3csIHdpdGggc3ltYm9saWMKICBmaWVsZCBuYW1lcy4KCi0gYXJyYXkuYXJyYXkgaXMgbm93IGEgdHlwZSBvYmplY3QuIEEgbmV3IGZvcm1hdCBjaGFyYWN0ZXIKICAndScgaW5kaWNhdGVzIFB5X1VOSUNPREUgYXJyYXlzLiBGb3IgdGhvc2UsIC50b3VuaWNvZGUgYW5kCiAgLmZyb211bmljb2RlIG1ldGhvZHMgYXJlIGF2YWlsYWJsZS4gQXJyYXlzIG5vdyBzdXBwb3J0IF9faWFkZF9fCiAgYW5kIF9faW11bF9fLgoKLSBkbCBub3cgYnVpbGRzIG9uIGV2ZXJ5IHN5c3RlbSB0aGF0IGhhcyBkbGZjbi5oLiAgRmFpbHVyZSBpbiBjYXNlCiAgb2Ygc2l6ZW9mKGludCkhPXNpemVvZihsb25nKSE9c2l6ZW9mKHZvaWQqKSBpcyBkZWxheWVkIHVudGlsIGRsLm9wZW4KICBpcyBjYWxsZWQuCgotIHNpZ25hbC5zaWdwZW5kaW5nLCBzaWduYWwuc2lncHJvY21hc2sgYW5kIHNpZ25hbC5zaWdzdXNwZW5kIGhhdmUKICBiZWVuIGFkZGVkIHdoZXJlIGF2YWlsYWJsZS4KCi0gVGhlIHN5cyBtb2R1bGUgYWNxdWlyZWQgYSBuZXcgYXR0cmlidXRlLCBhcGlfdmVyc2lvbiwgd2hpY2ggZXZhbHVhdGVzCiAgdG8gdGhlIHZhbHVlIG9mIHRoZSBQWVRIT05fQVBJX1ZFUlNJT04gbWFjcm8gd2l0aCB3aGljaCB0aGUKICBpbnRlcnByZXRlciB3YXMgY29tcGlsZWQuCgotIEZpeGVkIGJ1ZyAjNDcwNTgyOiBzcmUgbW9kdWxlIHdvdWxkIHJldHVybiBhIHR1cGxlIChOb25lLCAnYScsICdhYicpCiAgd2hlbiBhcHBseWluZyB0aGUgcmVndWxhciBleHByZXNzaW9uICdeKChhKWMpPyhhYikkJyBvbiAnYWInLiBJdCBub3cKICByZXR1cm5zIChOb25lLCBOb25lLCAnYWInKSwgYXMgZXhwZWN0ZWQuIEFsc28gZml4ZWQgaGFuZGxpbmcgb2YKICBsYXN0aW5kZXgvbGFzdGdyb3VwIG1hdGNoIGF0dHJpYnV0ZXMgaW4gc2ltaWxhciBjYXNlcy4gRm9yIGV4YW1wbGUsCiAgd2hlbiBydW5uaW5nIHRoZSBleHByZXNzaW9uIHInKGEpKGIpP2InIG92ZXIgJ2FiJywgbGFzdGluZGV4IG11c3QgYmUKICAxLCBub3QgMi4KCi0gRml4ZWQgYnVnICM1ODEwODA6IHNyZSBzY2FubmVyIHdhcyBub3QgY2hlY2tpbmcgdGhlIGJ1ZmZlciBsaW1pdAogIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBjdXJyZW50IHBvaW50ZXIuIFRoaXMgd2FzIGNyZWF0aW5nIGFuIGluZmluaXRlCiAgbG9vcCBpbiB0aGUgc2VhcmNoIGZ1bmN0aW9uLCBvbmNlIHRoZSBwb2ludGVyIGV4Y2VlZGVkIHRoZSBidWZmZXIKICBsaW1pdC4KCi0gVGhlIG9zLmZkb3BlbiBmdW5jdGlvbiBub3cgZW5mb3JjZXMgYSBmaWxlIG1vZGUgc3RhcnRpbmcgd2l0aCB0aGUKICBsZXR0ZXIgJ3InLCAndycgb3IgJ2EnLCBvdGhlcndpc2UgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gVGhpcyBmaXhlcwogIGJ1ZyAjNjIzNDY0LgoKLSBUaGUgbGludXhhdWRpb2RldiBtb2R1bGUgaXMgbm93IGRlcHJlY2F0ZWQ7IGl0IGlzIGJlaW5nIHJlcGxhY2VkIGJ5CiAgb3NzYXVkaW9kZXYuICBUaGUgaW50ZXJmYWNlIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGNvdmVyIGEgbG90IG1vcmUgb2YKICBPU1MgKHNlZSB3d3cub3BlbnNvdW5kLmNvbSksIGluY2x1ZGluZyBtb3N0IERTUCBpb2N0bHMgYW5kIHRoZQogIE9TUyBtaXhlciBBUEkuICBEb2N1bWVudGF0aW9uIGZvcnRoY29taW5nIGluIDIuM2EyLgoKTGlicmFyeQotLS0tLS0tCgotIGltYXBsaWIucHkgbm93IHN1cHBvcnRzIFNTTCAoVGlubyBMYW5nZSBhbmQgUGllcnMgTGF1ZGVyKS4KCi0gRnJlZXplJ3MgbW9kdWxlZmluZGVyLnB5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5OwogIHNsaWdodGx5IGltcHJvdmVkIHNvIGl0IHdpbGwgaXNzdWUgbGVzcyBmYWxzZSBtaXNzaW5nIHN1Ym1vZHVsZQogIHJlcG9ydHMgKHNlZSBzZiBwYXRoICM2NDM3MTEgZm9yIGRldGFpbHMpLiAgRG9jdW1lbnRhdGlvbiB3aWxsIGZvbGxvdwogIHdpdGggUHl0aG9uIDIuM2EyLgoKLSBvcy5wYXRoIGV4cG9zZXMgZ2V0Y3RpbWUuCgotIHVuaXR0ZXN0LnB5IG5vdyBoYXMgdHdvIGFkZGl0aW9uYWwgbWV0aG9kcyBjYWxsZWQgYXNzZXJ0QWxtb3N0RXF1YWwoKQogIGFuZCBmYWlsSWZBbG1vc3RFcXVhbCgpLiAgVGhleSBpbXBsZW1lbnQgYW4gYXBwcm94aW1hdGUgY29tcGFyaXNpb24KICBieSByb3VuZGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gYXJndW1lbnRzIGFuZCBjb21wYXJpbmcKICB0aGUgcmVzdWx0IHRvIHplcm8uICBBcHByb3hpbWF0ZSBjb21wYXJpc2lvbiBpcyBlc3NlbnRpYWwgZm9yCiAgdW5pdCB0ZXN0cyBvZiBmbG9hdGluZyBwb2ludCByZXN1bHRzLgoKLSBjYWxlbmRhci5weSBub3cgZGVwZW5kcyBvbiB0aGUgbmV3IGRhdGV0aW1lIG1vZHVsZSByYXRoZXIgdGhhbgogIHRoZSB0aW1lIG1vZHVsZS4gIEFzIGEgcmVzdWx0LCB0aGUgcmFuZ2Ugb2YgYWxsb3dhYmxlIGRhdGVzCiAgaGFzIGJlZW4gaW5jcmVhc2VkLgoKLSBwZGIgaGFzIGEgbmV3ICdqKHVtcCknIGNvbW1hbmQgdG8gc2VsZWN0IHRoZSBuZXh0IGxpbmUgdG8gYmUKICBleGVjdXRlZC4KCi0gVGhlIGRpc3R1dGlscyBjcmVhdGVkIHdpbmRvd3MgaW5zdGFsbGVycyBub3cgY2FuIHJ1biBhCiAgcG9zdGluc3RhbGxhdGlvbiBzY3JpcHQuCgotIGRvY3Rlc3QudGVzdG1vZCBjYW4gbm93IGJlIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50LCB3aGljaCBtZWFucyB0bwogIHRlc3QgdGhlIGN1cnJlbnQgbW9kdWxlLgoKLSBXaGVuIGNhbmNlbGxpbmcgYSBzZXJ2ZXIgdGhhdCBpbXBsZW1lbnRlZCB0aHJlYWRpbmcgd2l0aCBhIGtleWJvYXJkCiAgaW50ZXJydXB0LCB0aGUgc2VydmVyIHdvdWxkIHNodXQgZG93biBidXQgbm90IHRlcm1pbmF0ZSAod2FpdGluZyBvbgogIGNsaWVudCB0aHJlYWRzKS4gQSBuZXcgbWVtYmVyIHZhcmlhYmxlLCBkYWVtb25fdGhyZWFkcywgd2FzIGFkZGVkIHRvCiAgdGhlIFRocmVhZGluZ01peEluIGNsYXNzIGluIFNvY2tldFNlcnZlci5weSB0byBtYWtlIGl0IGV4cGxpY2l0IHRoYXQKICB0aGlzIGJlaGF2aW9yIG5lZWRzIHRvIGJlIGNvbnRyb2xsZWQuCgotIEEgbmV3IG1vZHVsZSwgb3B0cGFyc2UsIHByb3ZpZGVzIGEgZmFuY3kgYWx0ZXJuYXRpdmUgdG8gZ2V0b3B0IGZvcgogIGNvbW1hbmQgbGluZSBwYXJzaW5nLiAgSXQgaXMgYSBzbGlnaHRseSBtb2RpZmllZCB2ZXJzaW9uIG9mIEdyZWcKICBXYXJkJ3MgT3B0aWsgcGFja2FnZS4KCi0gVXNlckRpY3QucHkgbm93IGRlZmluZXMgYSBEaWN0TWl4aW4gY2xhc3Mgd2hpY2ggZGVmaW5lcyBhbGwgZGljdGlvbmFyeQogIG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUgYSBtaW5pbXVtIG1hcHBpbmcgaW50ZXJmYWNlLgogIFRoaXMgZ3JlYXRseSBzaW1wbGlmaWVzIHdyaXRpbmcgY2xhc3NlcyB0aGF0IG5lZWQgdG8gYmUgc3Vic3RpdHV0YWJsZQogIGZvciBkaWN0aW9uYXJpZXMgKHN1Y2ggYXMgdGhlIHNoZWx2ZSBtb2R1bGUpLgoKLSBzaGVsdmUucHkgbm93IHN1YmNsYXNzZXMgZnJvbSBVc2VyRGljdC5EaWN0TWl4aW4uICBOb3cgc2hlbHZlIHN1cHBvcnRzCiAgYWxsIGRpY3Rpb25hcnkgbWV0aG9kcy4gIFRoaXMgZWFzZXMgdGhlIHRyYW5zaXRpb24gdG8gcGVyc2lzdGVudAogIHN0b3JhZ2UgZm9yIHNjcmlwdHMgb3JpZ2luYWxseSB3cml0dGVuIHdpdGggZGljdGlvbmFyaWVzIGluIG1pbmQuCgotIHNoZWx2ZS5vcGVuIGFuZCB0aGUgdmFyaW91cyBjbGFzc2VzIGluIHNoZWx2ZS5weSBub3cgYWNjZXB0IGFuIG9wdGlvbmFsCiAgYmluYXJ5IGZsYWcsIHdoaWNoIGRlZmF1bHRzIHRvIEZhbHNlLiAgSWYgVHJ1ZSwgdGhlIHZhbHVlcyBzdG9yZWQgaW4gdGhlCiAgc2hlbGYgYXJlIGJpbmFyeSBwaWNrbGVzLgoKLSBBIG5ldyBwYWNrYWdlLCBsb2dnaW5nLCBpbXBsZW1lbnRzIHRoZSBsb2dnaW5nIEFQSSBkZWZpbmVkIGJ5IFBFUAogIDI4Mi4gIFRoZSBjb2RlIGlzIHdyaXR0ZW4gYnkgVmluYXkgU2FqaXAuCgotIFN0cmVhbVJlYWRlciwgU3RyZWFtUmVhZGVyV3JpdGVyIGFuZCBTdHJlYW1SZWNvZGVyIGluIHRoZSBjb2RlY3MKICBtb2R1bGVzIGFyZSBpdGVyYXRvcnMgbm93LgoKLSBnemlwLnB5IG5vdyBoYW5kbGVzIGZpbGVzIGV4Y2VlZGluZyAyR0IuICBGaWxlcyBvdmVyIDRHQiBhbHNvIHdvcmsKICBub3cgKHByb3ZpZGVkIHRoZSBPUyBzdXBwb3J0cyBpdCwgYW5kIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGggbGFyZ2UKICBmaWxlIHN1cHBvcnQpLCBidXQgaW4gdGhhdCBjYXNlIHRoZSB1bmRlcmx5aW5nIGd6aXAgZmlsZSBmb3JtYXQgY2FuCiAgcmVjb3JkIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIGZpbGUgc2l6ZSwgc28gdGhhdAogIHNvbWUgdG9vbHMgd29ya2luZyB3aXRoIGd6aXBwZWQgZmlsZXMgbWF5IHJlcG9ydCBhbiBpbmNvcnJlY3QgZmlsZQogIHNpemUuCgotIHhtbC5zYXguc2F4dXRpbHMudW5lc2NhcGUgaGFzIGJlZW4gYWRkZWQsIHRvIHJlcGxhY2UgZW50aXR5IHJlZmVyZW5jZXMKICB3aXRoIHRoZWlyIGVudGl0eSB2YWx1ZS4KCi0gUXVldWUuUXVldWUue3B1dCxnZXR9IG5vdyBzdXBwb3J0IGFuIG9wdGlvbmFsIHRpbWVvdXQgYXJndW1lbnQuCgotIFZhcmlvdXMgZmVhdHVyZXMgb2YgVGsgOC40IGFyZSBleHBvc2VkIGluIFRraW50ZXIucHkuIFRoZSBtdWx0aXBsZQogIG9wdGlvbiBvZiB0a0ZpbGVEaWFsb2cgaXMgZXhwb3NlZCBhcyBmdW5jdGlvbiBhc2tvcGVuZmlsZXssbmFtZX1zLgoKLSBWYXJpb3VzIGNvbmZpZ3VyZSBtZXRob2RzIG9mIFRraW50ZXIgaGF2ZSBiZWVuIHN0cmVhbS1saW5lZCwgc28gdGhhdAogIHRhZ19jb25maWd1cmUsIGltYWdlX2NvbmZpZ3VyZSwgd2luZG93X2NvbmZpZ3VyZSBub3cgcmV0dXJuIGEKICBkaWN0aW9uYXJ5IHdoZW4gaW52b2tlZCB3aXRoIG5vIGFyZ3VtZW50LgoKLSBJbXBvcnRpbmcgdGhlIHJlYWRsaW5lIG1vZHVsZSBub3cgbm8gbG9uZ2VyIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YKICBjYWxsaW5nIHNldGxvY2FsZShMQ19DVFlQRSwgIiIpLiAgVGhlIGluaXRpYWwgIkMiIGxvY2FsZSwgb3IKICB3aGF0ZXZlciBsb2NhbGUgaXMgZXhwbGljaXRseSBzZXQgYnkgdGhlIHVzZXIsIGlzIHByZXNlcnZlZC4gIElmIHlvdQogIHdhbnQgcmVwcigpIG9mIDgtYml0IHN0cmluZ3MgaW4geW91ciBwcmVmZXJyZWQgZW5jb2RpbmcgdG8gcHJlc2VydmUKICBhbGwgcHJpbnRhYmxlIGNoYXJhY3RlcnMgb2YgdGhhdCBlbmNvZGluZywgeW91IGhhdmUgdG8gYWRkIHRoZQogIGZvbGxvd2luZyBjb2RlIHRvIHlvdXIgJFBZVEhPTlNUQVJUVVAgZmlsZSBvciB0byB5b3VyIGFwcGxpY2F0aW9uJ3MKICBtYWluKCk6CgogICAgaW1wb3J0IGxvY2FsZQogICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICIiKQoKLSBzaHV0aWwubW92ZSB3YXMgYWRkZWQuIHNodXRpbC5jb3B5dHJlZSBub3cgcmVwb3J0cyBlcnJvcnMgYXMgYW4KICBleGNlcHRpb24gYXQgdGhlIGVuZCwgaW5zdGVhZCBvZiBwcmludGluZyBlcnJvciBtZXNzYWdlcy4KCi0gRW5jb2RpbmcgbmFtZSBub3JtYWxpemF0aW9uIHdhcyBnZW5lcmFsaXplZCB0byBub3Qgb25seQogIHJlcGxhY2UgaHlwaGVucyB3aXRoIHVuZGVyc2NvcmVzLCBidXQgYWxzbyBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYwogIGNoYXJhY3RlcnMgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZG90IHdoaWNoIGlzIHVzZWQgZm9yIFB5dGhvbgogIHBhY2thZ2UgbmFtZXMgZHVyaW5nIGxvb2t1cCkuIFRoZSBhbGlhc2VzLnB5IG1hcHBpbmcgd2FzIHVwZGF0ZWQKICB0byB0aGUgbmV3IHN0YW5kYXJkLgoKLSBtaW1ldHlwZXMgaGFzIHR3byBuZXcgZnVuY3Rpb25zOiBndWVzc19hbGxfZXh0ZW5zaW9ucygpIHdoaWNoCiAgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIGV4dGVuc2lvbnMgZm9yIGEgbWltZSB0eXBlLCBhbmQKICBhZGRfdHlwZSgpIHdoaWNoIGFkZHMgb25lIG1hcHBpbmcgYmV0d2VlbiBhIG1pbWUgdHlwZSBhbmQKICBhbiBleHRlbnNpb24gdG8gdGhlIGRhdGFiYXNlLgoKLSBOZXcgbW9kdWxlOiBzZXRzLCBkZWZpbmVzIHRoZSBjbGFzcyBTZXQgdGhhdCBpbXBsZW1lbnRzIGEgbXV0YWJsZQogIHNldCB0eXBlIHVzaW5nIHRoZSBrZXlzIG9mIGEgZGljdCB0byByZXByZXNlbnQgdGhlIHNldC4gIFRoZXJlJ3MKICBhbHNvIGEgY2xhc3MgSW1tdXRhYmxlU2V0IHdoaWNoIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHNldHMgb2Ygc2V0cwogIG9yIHdoZW4geW91IG5lZWQgdG8gdXNlIHNldHMgYXMgZGljdCBrZXlzLCBhbmQgYSBjbGFzcyBCYXNlU2V0IHdoaWNoCiAgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIHR3by4KCi0gQWRkZWQgcmFuZG9tLnNhbXBsZShwb3B1bGF0aW9uLGspIGZvciByYW5kb20gc2FtcGxpbmcgd2l0aG91dCByZXBsYWNlbWVudC4KICBSZXR1cm5zIGEgayBsZW5ndGggbGlzdCBvZiB1bmlxdWUgZWxlbWVudHMgY2hvc2VuIGZyb20gdGhlIHBvcHVsYXRpb24uCgotIHJhbmRvbS5yYW5kcmFuZ2UoLXN5cy5tYXhpbnQtMSwgc3lzLm1heGludCkgbm8gbG9uZ2VyIHJhaXNlcwogIE92ZXJmbG93RXJyb3IuICBUaGF0IGlzLCBpdCBub3cgYWNjZXB0cyBhbnkgY29tYmluYXRpb24gb2YgJ3N0YXJ0JwogIGFuZCAnc3RvcCcgYXJndW1lbnRzIHNvIGxvbmcgYXMgZWFjaCBpcyBpbiB0aGUgcmFuZ2Ugb2YgUHl0aG9uJ3MKICBib3VuZGVkIGludGVnZXJzLgoKLSBUaGFua3MgdG8gUmF5bW9uZCBIZXR0aW5nZXIsIHJhbmRvbS5yYW5kb20oKSBub3cgdXNlcyBhIG5ldyBjb3JlCiAgZ2VuZXJhdG9yLiAgVGhlIE1lcnNlbm5lIFR3aXN0ZXIgYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkIGluIEMsCiAgdGhyZWFkc2FmZSwgZmFzdGVyIHRoYW4gdGhlIHByZXZpb3VzIGdlbmVyYXRvciwgaGFzIGFuIGFzdHJvbm9taWNhbGx5CiAgbGFyZ2UgcGVyaW9kICgyKioxOTkzNy0xKSwgY3JlYXRlcyByYW5kb20gZmxvYXRzIHRvIGZ1bGwgNTMtYml0CiAgcHJlY2lzaW9uLCBhbmQgbWF5IGJlIHRoZSBtb3N0IHdpZGVseSB0ZXN0ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKICBpbiBleGlzdGVuY2UuCgogIFRoZSByYW5kb20uanVtcGFoZWFkKG4pIG1ldGhvZCBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgdGhlIG5ldwogIGdlbmVyYXRvci4gIEluc3RlYWQgb2YganVtcGluZyBuIHN0ZXBzIGFoZWFkLCBpdCB1c2VzIG4gYW5kIHRoZQogIGV4aXN0aW5nIHN0YXRlIHRvIGNyZWF0ZSBhIG5ldyBzdGF0ZS4gIFRoaXMgbWVhbnMgdGhhdCBqdW1wYWhlYWQoKQogIGNvbnRpbnVlcyB0byBzdXBwb3J0IG11bHRpLXRocmVhZGVkIGNvZGUgbmVlZGluZyBnZW5lcmF0b3JzIG9mCiAgbm9uLW92ZXJsYXBwaW5nIHNlcXVlbmNlcy4gIEhvd2V2ZXIsIGl0IHdpbGwgYnJlYWsgY29kZSB3aGljaCByZWxpZXMKICBvbiBqdW1wYWhlYWQgbW92aW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHN0ZXBzIGZvcndhcmQuCgogIFRoZSBhdHRyaWJ1dGVzIHJhbmRvbS53aHNlZWQgYW5kIHJhbmRvbS5fX3doc2VlZCBoYXZlIG5vIG1lYW5pbmcgZm9yCiAgdGhlIG5ldyBnZW5lcmF0b3IuICBDb2RlIHVzaW5nIHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIHN3aXRjaCB0byBhCiAgbmV3IGNsYXNzLCByYW5kb20uV2ljaG1hbm5IaWxsIHdoaWNoIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZAogIGNvbXBhdGliaWxpdHkgYW5kIHRvIG1ha2UgYW4gYWx0ZXJuYXRlIGdlbmVyYXRvciBhdmFpbGFibGUuCgotIE5ldyAiYWxnb3JpdGhtcyIgbW9kdWxlOiBoZWFwcSwgaW1wbGVtZW50cyBhIGhlYXAgcXVldWUuICBUaGFua3MgdG8KICBLZXZpbiBPJ0Nvbm5vciBmb3IgdGhlIGNvZGUgYW5kIEZyYW7nb2lzIFBpbmFyZCBmb3IgYW4gZW50ZXJ0YWluaW5nCiAgd3JpdGUtdXAgZXhwbGFpbmluZyB0aGUgdGhlb3J5IGFuZCBwcmFjdGljYWwgdXNlcyBvZiBoZWFwcy4KCi0gTmV3IGVuY29kaW5nIGZvciB0aGUgUGFsbSBPUyBjaGFyYWN0ZXIgc2V0OiBwYWxtb3MuCgotIGJpbmFzY2lpLmNyYzMyKCkgYW5kIHRoZSB6aXBmaWxlIG1vZHVsZSBoYWQgcHJvYmxlbXMgb24gc29tZSA2NC1iaXQKICBwbGF0Zm9ybXMuICBUaGVzZSBoYXZlIGJlZW4gZml4ZWQuICBPbiBhIHBsYXRmb3JtIHdpdGggOC1ieXRlIEMgbG9uZ3MsCiAgY3JjMzIoKSBub3cgcmV0dXJucyBhIHNpZ25lZC1leHRlbmRlZCA0LWJ5dGUgcmVzdWx0LCBzbyB0aGF0IGl0cyB2YWx1ZQogIGFzIGEgUHl0aG9uIGludCBpcyBlcXVhbCB0byB0aGUgdmFsdWUgY29tcHV0ZWQgYSAzMi1iaXQgcGxhdGZvcm0uCgotIHhtbC5kb20ubWluaWRvbS50b3htbCBhbmQgdG9wcmV0dHl4bWwgbm93IHRha2UgYW4gb3B0aW9uYWwgZW5jb2RpbmcKICBhcmd1bWVudC4KCi0gU29tZSBmaXhlcyBpbiB0aGUgY29weSBtb2R1bGU6IHdoZW4gYW4gb2JqZWN0IGlzIGNvcGllZCB0aHJvdWdoIGl0cwogIF9fcmVkdWNlX18gbWV0aG9kLCB0aGVyZSB3YXMgbm8gY2hlY2sgZm9yIGEgX19zZXRzdGF0ZV9fIG1ldGhvZCBvbgogIHRoZSByZXN1bHQgW1NGIHBhdGNoIDU2NTA4NV07IGRlZXBjb3B5IHNob3VsZCB0cmVhdCBpbnN0YW5jZXMgb2YKICBjdXN0b20gbWV0YWNsYXNzZXMgdGhlIHNhbWUgd2F5IGl0IHRyZWF0cyBpbnN0YW5jZXMgb2YgdHlwZSAndHlwZScKICBbU0YgcGF0Y2ggNTYwNzk0XS4KCi0gU29ja2V0cyBub3cgc3VwcG9ydCB0aW1lb3V0IG1vZGUuICBBZnRlciBzLnNldHRpbWVvdXQoVCksIHdoZXJlIFQgaXMKICBhIGZsb2F0IGV4cHJlc3Npbmcgc2Vjb25kcywgc3Vic2VxdWVudCBvcGVyYXRpb25zIHJhaXNlIGFuIGV4Y2VwdGlvbgogIGlmIHRoZXkgY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gVCBzZWNvbmRzLiAgVG8gZGlzYWJsZSB0aW1lb3V0CiAgbW9kZSwgdXNlIHMuc2V0dGltZW91dChOb25lKS4gIFRoZXJlJ3MgYWxzbyBhIG1vZHVsZSBmdW5jdGlvbiwKICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoVCksIHdoaWNoIHNldHMgdGhlIGRlZmF1bHQgZm9yIGFsbCBzb2NrZXRzCiAgY3JlYXRlZCBoZW5jZWZvcnRoLgoKLSBnZXRvcHQuZ251X2dldG9wdCB3YXMgYWRkZWQuICBUaGlzIHN1cHBvcnRzIEdOVS1zdHlsZSBvcHRpb24KICBwcm9jZXNzaW5nLCB3aGVyZSBvcHRpb25zIGNhbiBiZSBtaXhlZCB3aXRoIG5vbi1vcHRpb24gYXJndW1lbnRzLgoKLSBTdG9wIHVzaW5nIHN0cmluZ3MgZm9yIGV4Y2VwdGlvbnMuICBTdHJpbmcgb2JqZWN0cyB1c2VkIGZvcgogIGV4Y2VwdGlvbnMgYXJlIG5vdyBjbGFzc2VzIGRlcml2aW5nIGZyb20gRXhjZXB0aW9uLiAgVGhlIG9iamVjdHMKICBjaGFuZ2VkIHdlcmU6IFRraW50ZXIuVGNsRXJyb3IsIGJkYi5CZGJRdWl0LCBtYWNwYXRoLm5vcm1fZXJyb3IsCiAgdGFibmFubnkuTmFubnlOYWcsIGFuZCB4ZHJsaWIuRXJyb3IuCgotIENvbnN0YW50cyBCT01fVVRGOCwgQk9NX1VURjE2LCBCT01fVVRGMTZfTEUsIEJPTV9VVEYxNl9CRSwKICBCT01fVVRGMzIsIEJPTV9VVEYzMl9MRSBhbmQgQk9NX1VURjMyX0JFIHRoYXQgcmVwcmVzZW50IHRoZSBCeXRlCiAgT3JkZXIgTWFyayBpbiBVVEYtOCwgVVRGLTE2IGFuZCBVVEYtMzIgZW5jb2RpbmdzIGZvciBsaXR0bGUgYW5kCiAgYmlnIGVuZGlhbiBzeXN0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIGNvZGVjcyBtb2R1bGUuIFRoZSBvbGQgbmFtZXMKICBCT00zMl8qIGFuZCBCT002NF8qIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDIuCgotIEFkZGVkIGNvbnZlcnNpb24gZnVuY3Rpb25zIG1hdGguZGVncmVlcygpIGFuZCBtYXRoLnJhZGlhbnMoKS4KCi0gbWF0aC5sb2coKSBub3cgdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQ6ICBtYXRoLmxvZyh4WywgYmFzZV0pLgoKLSBmdHBsaWIucmV0cmxpbmVzKCkgbm93IHRlc3RzIGZvciBjYWxsYmFjayBpcyBOb25lIHJhdGhlciB0aGFuIHRlc3RpbmcKICBmb3IgRmFsc2UuICBXYXMgY2F1c2luZyBhbiBlcnJvciB3aGVuIGdpdmVuIGEgY2FsbGJhY2sgb2JqZWN0IHdoaWNoCiAgd2FzIGNhbGxhYmxlIGJ1dCBhbHNvIHJldHVybmVkIGxlbigpIGFzIHplcm8uICBUaGUgY2hhbmdlIG1heQogIGNyZWF0ZSBuZXcgYnJlYWthZ2UgaWYgdGhlIGNhbGxlciByZWxpZWQgb24gdGhlIHVuZG9jdW1lbnRlZCBiZWhhdmlvcgogIGFuZCBjYWxsZWQgd2l0aCBjYWxsYmFjayBzZXQgdG8gW10gb3Igc29tZSBvdGhlciBGYWxzZSB2YWx1ZSBub3QKICBpZGVudGljYWwgdG8gTm9uZS4KCi0gcmFuZG9tLmdhdXNzKCkgdXNlcyBhIHBpZWNlIG9mIGhpZGRlbiBzdGF0ZSB1c2VkIGJ5IG5vdGhpbmcgZWxzZSwKICBhbmQgdGhlIC5zZWVkKCkgYW5kIC53aHNlZWQoKSBtZXRob2RzIGZhaWxlZCB0byByZXNldCBpdC4gIEluIG90aGVyCiAgd29yZHMsIHNldHRpbmcgdGhlIHNlZWQgZGlkbid0IGNvbXBsZXRlbHkgZGV0ZXJtaW5lIHRoZSBzZXF1ZW5jZSBvZgogIHJlc3VsdHMgcHJvZHVjZWQgYnkgcmFuZG9tLmdhdXNzKCkuICBJdCBkb2VzIG5vdy4gIFByb2dyYW1zIHJlcGVhdGVkbHkKICBtaXhpbmcgY2FsbHMgdG8gYSBzZWVkIG1ldGhvZCB3aXRoIGNhbGxzIHRvIGdhdXNzKCkgbWF5IHNlZSBkaWZmZXJlbnQKICByZXN1bHRzIG5vdy4KCi0gVGhlIHBpY2tsZS5QaWNrbGVyIGNsYXNzIGdyZXcgYSBjbGVhcl9tZW1vKCkgbWV0aG9kIHRvIG1pbWljIHRoYXQKICBwcm92aWRlZCBieSBjUGlja2xlLlBpY2tsZXIuCgotIGRpZmZsaWIncyBTZXF1ZW5jZU1hdGNoZXIgY2xhc3Mgbm93IGRvZXMgYSBkeW5hbWljIGFuYWx5c2lzIG9mCiAgd2hpY2ggZWxlbWVudHMgYXJlIHNvIGZyZXF1ZW50IGFzIHRvIGNvbnN0aXR1dGUgbm9pc2UuICBGb3IKICBjb21wYXJpbmcgZmlsZXMgYXMgc2VxdWVuY2VzIG9mIGxpbmVzLCB0aGlzIGdlbmVyYWxseSB3b3JrcyBiZXR0ZXIKICB0aGFuIHRoZSBJU19MSU5FX0pVTksgZnVuY3Rpb24sIGFuZCBmdW5jdGlvbiBuZGlmZidzIGxpbmVqdW5rCiAgYXJndW1lbnQgZGVmYXVsdHMgdG8gTm9uZSBub3cgYXMgYSByZXN1bHQuICBBIGhhcHB5IGJlbmVmaXQgaXMKICB0aGF0IFNlcXVlbmNlTWF0Y2hlciBtYXkgcnVuIG11Y2ggZmFzdGVyIG5vdyB3aGVuIGFwcGxpZWQKICB0byBsYXJnZSBmaWxlcyB3aXRoIG1hbnkgZHVwbGljYXRlIGxpbmVzIChmb3IgZXhhbXBsZSwgQyBwcm9ncmFtCiAgdGV4dCB3aXRoIGxvdHMgb2YgcmVwZWF0ZWQgIn0iIGFuZCAicmV0dXJuIE5VTEw7IiBsaW5lcykuCgotIE5ldyBUZXh0LmR1bXAoKSBtZXRob2QgaW4gVGtpbnRlciBtb2R1bGUuCgotIE5ldyBkaXN0dXRpbHMgY29tbWFuZHMgZm9yIGJ1aWxkaW5nIHBhY2thZ2VycyB3ZXJlIGFkZGVkIHRvCiAgc3VwcG9ydCBwa2d0b29sIG9uIFNvbGFyaXMgYW5kIHN3aW5zdGFsbCBvbiBIUC1VWC4KCi0gZGlzdHV0aWxzIG5vdyBoYXMgYSBuZXcgYWJzdHJhY3QgYmluYXJ5IHBhY2thZ2VyIGJhc2UgY2xhc3MKICBjb21tYW5kL2JkaXN0X3BhY2thZ2VyLCB3aGljaCBzaW1wbGlmaWVzIHdyaXRpbmcgcGFja2FnZXJzLgogIFRoaXMgd2lsbCBob3BlZnVsbHkgcHJvdmlkZSB0aGUgbWlzc2luZyBiaXRzIHRvIGVuY291cmFnZQogIHBlb3BsZSB0byBzdWJtaXQgbW9yZSBwYWNrYWdlcnMsIGUuZy4gZm9yIERlYmlhbiwgRnJlZUJTRAogIGFuZCBvdGhlciBzeXN0ZW1zLgoKLSBUaGUgVVRGLTE2LCAtTEUgYW5kIC1CRSBzdHJlYW0gcmVhZGVycyBub3cgcmFpc2UgYQogIE5vdEltcGxlbWVudGVkRXJyb3IgZm9yIGFsbCBjYWxscyB0byAucmVhZGxpbmUoKS4gUHJldmlvdXNseSwgdGhleQogIHVzZWQgdG8ganVzdCBwcm9kdWNlIGdhcmJhZ2Ugb3IgZmFpbCB3aXRoIGFuIGVuY29kaW5nIGVycm9yIC0tCiAgVVRGLTE2IGlzIGEgMi1ieXRlIGVuY29kaW5nIGFuZCB0aGUgQyBsaWIncyBsaW5lIHJlYWRpbmcgQVBJcyBkb24ndAogIHdvcmsgd2VsbCB3aXRoIHRoZXNlLgoKLSBjb21waWxlYWxsIG5vdyBzdXBwb3J0cyBxdWlldCBvcGVyYXRpb24uCgotIFRoZSBCYXNlSFRUUFNlcnZlciBub3cgaW1wbGVtZW50cyBvcHRpb25hbCBIVFRQLzEuMSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMuCgotIHNvY2tldCBtb2R1bGU6IHRoZSBTU0wgc3VwcG9ydCB3YXMgYnJva2VuIG91dCBvZiB0aGUgbWFpbgogIF9zb2NrZXQgbW9kdWxlIEMgaGVscGVyIGFuZCBwbGFjZWQgaW50byBhIG5ldyBfc3NsIGhlbHBlcgogIHdoaWNoIG5vdyBnZXRzIGltcG9ydGVkIGJ5IHNvY2tldC5weSBpZiBhdmFpbGFibGUgYW5kIHdvcmtpbmcuCgotIGVuY29kaW5ncyBwYWNrYWdlOiBhZGRlZCBhbGlhc2VzIGZvciBhbGwgc3VwcG9ydGVkIElBTkEgY2hhcmFjdGVyCiAgc2V0cwoKLSBmdHBsaWI6IHRvIHNhZmVndWFyZCB0aGUgdXNlcidzIHByaXZhY3ksIGFub255bW91cyBsb2dpbiB3aWxsIHVzZQogICJhbm9ueW1vdXNAIiBhcyBkZWZhdWx0IHBhc3N3b3JkLCByYXRoZXIgdGhhbiB0aGUgcmVhbCB1c2VyIGFuZCBob3N0CiAgbmFtZS4KCi0gd2ViYnJvd3NlcjogdGlnaHRlbmVkIHVwIHRoZSBjb21tYW5kIHBhc3NlZCB0byBvcy5zeXN0ZW0oKSBzbyB0aGF0CiAgYXJiaXRyYXJ5IHNoZWxsIGNvZGUgY2FuJ3QgYmUgZXhlY3V0ZWQgYmVjYXVzZSBhIGJvZ3VzIFVSTCB3YXMKICBwYXNzZWQgaW4uCgotIGdldHRleHQudHJhbnNsYXRpb24gaGFzIGFuIG9wdGlvbmFsIGZhbGxiYWNrIGFyZ3VtZW50LCBhbmQKICBnZXR0ZXh0LmZpbmQgYW4gb3B0aW9uYWwgYWxsIGFyZ3VtZW50LiBUcmFuc2xhdGlvbnMgd2lsbCBub3cgZmFsbGJhY2sKICBvbiBhIHBlci1tZXNzYWdlIGJhc2lzLiBUaGUgbW9kdWxlIHN1cHBvcnRzIHBsdXJhbCBmb3JtcywgYnkgbWVhbnMKICBvZiBnZXR0ZXh0LltkXW5nZXR0ZXh0IGFuZCBUcmFuc2xhdGlvbi5bdV1uZ2V0dGV4dC4KCi0gZGlzdHV0aWxzIGJkaXN0IGNvbW1hbmRzIG5vdyBvZmZlciBhIC0tc2tpcC1idWlsZCBvcHRpb24uCgotIHdhcm5pbmdzLndhcm4gbm93IGFjY2VwdHMgYSBXYXJuaW5nIGluc3RhbmNlIGFzIGZpcnN0IGFyZ3VtZW50LgoKLSBUaGUgeG1sLnNheC5leHBhdHJlYWRlci5FeHBhdFBhcnNlciBjbGFzcyB3aWxsIG5vIGxvbmdlciBjcmVhdGUKICBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IHVzaW5nIGl0c2VsZiBhcyB0aGUgbG9jYXRvciB0aGF0IGdldHMgcGFzc2VkCiAgdG8gdGhlIGNvbnRlbnQgaGFuZGxlciBpbXBsZW1lbnRhdGlvbi4gIFtTRiBidWcgIzUzNTQ3NF0KCi0gVGhlIGVtYWlsLlBhcnNlci5QYXJzZXIgY2xhc3Mgbm93IHByb3Blcmx5IHBhcnNlcyBzdHJpbmdzIHJlZ2FyZGxlc3MKICBvZiB0aGVpciBsaW5lIGVuZGluZ3MsIHdoaWNoIGNhbiBiZSBhbnkgb2YgXHIsIFxuLCBvciBcclxuIChDUiwgTEYsCiAgb3IgQ1JMRikuICBBbHNvLCB0aGUgSGVhZGVyIGNsYXNzJ3MgY29uc3RydWN0b3IgZGVmYXVsdCBhcmd1bWVudHMKICBoYXMgY2hhbmdlZCBzbGlnaHRseSBzbyB0aGF0IGFuIGV4cGxpY2l0IG1heGxpbmVsZW4gdmFsdWUgaXMgYWx3YXlzCiAgaG9ub3JlZCwgYW5kIHNvIHVuaWNvZGUgY29udmVyc2lvbiBlcnJvciBoYW5kbGluZyBjYW4gYmUgc3BlY2lmaWVkLgoKLSBkaXN0dXRpbHMnIGJ1aWxkX2V4dCBjb21tYW5kIG5vdyBsaW5rcyBDKysgZXh0ZW5zaW9ucyB3aXRoIHRoZSBDKysKICBjb21waWxlciBhdmFpbGFibGUgaW4gdGhlIE1ha2VmaWxlIG9yIENYWCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYKICBydW5uaW5nIHVuZGVyIFwqbml4LgoKLSBOZXcgbW9kdWxlIGJ6MjogcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGludGVyZmFjZSBmb3IgdGhlIGJ6MiBjb21wcmVzc2lvbgogIGxpYnJhcnkuICBJdCBpbXBsZW1lbnRzIGEgY29tcGxldGUgZmlsZSBpbnRlcmZhY2UsIG9uZS1zaG90IChkZSljb21wcmVzc2lvbgogIGZ1bmN0aW9ucywgYW5kIHR5cGVzIGZvciBzZXF1ZW50aWFsIChkZSljb21wcmVzc2lvbi4KCi0gTmV3IHBkYiBjb21tYW5kICdwcCcgd2hpY2ggaXMgbGlrZSAncCcgZXhjZXB0IHRoYXQgaXQgcHJldHR5LXByaW50cwogIHRoZSB2YWx1ZSBvZiBpdHMgZXhwcmVzc2lvbiBhcmd1bWVudC4KCi0gTm93IGJkaXN0X3JwbSBkaXN0dXRpbHMgY29tbWFuZCB1bmRlcnN0YW5kcyBhIHZlcmlmeV9zY3JpcHQgb3B0aW9uIGluCiAgdGhlIGNvbmZpZyBmaWxlLCBpbmNsdWRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWZlcnJlZCBmaWxlbmFtZSBpbgogIHRoZSAiJXZlcmlmeXNjcmlwdCIgc2VjdGlvbiBvZiB0aGUgcnBtIHNwZWMgZmlsZS4KCi0gRml4ZWQgYnVnICM0OTU2OTU6IHdlYmJyb3dzZXIgbW9kdWxlIHdvdWxkIHJ1biBncmFwaGljIGJyb3dzZXJzIGluIGEKICB1bml4IGVudmlyb25tZW50IGV2ZW4gaWYgRElTUExBWSB3YXMgbm90IHNldC4gQWxzbywgc3VwcG9ydCBmb3IKICBza2lwc3RvbmUgYnJvd3NlciB3YXMgaW5jbHVkZWQuCgotIEZpeGVkIGJ1ZyAjNjM2NzY5OiByZXhlYyB3b3VsZCBydW4gdW5hbGxvd2VkIGNvZGUgaWYgc3ViY2xhc3NlcyBvZgogIHN0cmluZ3Mgd2VyZSB1c2VkIGFzIHBhcmFtZXRlcnMgZm9yIGNlcnRhaW4gZnVuY3Rpb25zLgoKVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0KCi0gcHlnZXR0ZXh0LnB5IG5vdyBzdXBwb3J0cyBnbG9iYmluZyBvbiBXaW5kb3dzLCBhbmQgYWNjZXB0cyBtb2R1bGUKICBuYW1lcyBpbiBhZGRpdGlvbiB0byBhY2NlcHRpbmcgZmlsZSBuYW1lcy4KCi0gVGhlIFNHSSBkZW1vcyAoRGVtby9zZ2kpIGhhdmUgYmVlbiByZW1vdmVkLiAgTm9ib2R5IHRob3VnaHQgdGhleQogIHdlcmUgaW50ZXJlc3RpbmcgYW55IG1vcmUuICAoVGhlIFNHSSBsaWJyYXJ5IG1vZHVsZXMgYW5kIGV4dGVuc2lvbnMKICBhcmUgc3RpbGwgdGhlcmU7IGl0IGlzIGJlbGlldmVkIHRoYXQgYXQgbGVhc3Qgc29tZSBvZiB0aGVzZSBhcmUKICBzdGlsbCB1c2VkIGFuZCB1c2VmdWwuKQoKLSBJRExFIHN1cHBvcnRzIHRoZSBuZXcgZW5jb2RpbmcgZGVjbGFyYXRpb25zIChQRVAgMjYzKTsgaXQgY2FuIGFsc28KICBkZWFsIHdpdGggbGVnYWN5IDgtYml0IGZpbGVzIGlmIHRoZXkgdXNlIHRoZSBsb2NhbGUncyBlbmNvZGluZy4gSXQKICBhbGxvd3Mgbm9uLUFTQ0lJIHN0cmluZ3MgaW4gdGhlIGludGVyYWN0aXZlIHNoZWxsIGFuZCBleGVjdXRlcyB0aGVtCiAgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nLgoKLSBmcmVlemUucHkgbm93IHByb2R1Y2VzIGJpbmFyaWVzIHdoaWNoIGNhbiBpbXBvcnQgc2hhcmVkIG1vZHVsZXMsCiAgdW5saWtlIGJlZm9yZSB3aGVuIHRoaXMgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHN5bWJvbCBleHBvcnRzIGluCiAgdGhlIGdlbmVyYXRlZCBiaW5hcnkuCgpCdWlsZAotLS0tLQoKLSBPbiBVbml4LCBJRExFIGlzIG5vdyBpbnN0YWxsZWQgYXV0b21hdGljYWxseS4KCi0gVGhlIGZwZWN0bCBtb2R1bGUgaXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQ7IGl0J3MgZGFuZ2Vyb3VzIG9yIHVzZWxlc3MKICBleGNlcHQgaW4gdGhlIGhhbmRzIG9mIGV4cGVydHMuCgotIFRoZSBwdWJsaWMgUHl0aG9uIEMgQVBJIHdpbGwgZ2VuZXJhbGx5IGJlIGRlY2xhcmVkIHVzaW5nIFB5QVBJX0ZVTkMKICBhbmQgUHlBUElfREFUQSBtYWNyb3MsIHdoaWxlIFB5dGhvbiBleHRlbnNpb24gbW9kdWxlIGluaXQgZnVuY3Rpb25zCiAgd2lsbCBiZSBkZWNsYXJlZCB3aXRoIFB5TU9ESU5JVF9GVU5DLiAgRExfRVhQT1JUL0RMX0lNUE9SVCBtYWNyb3MKICBhcmUgZGVwcmVjYXRlZC4KCi0gQSBidWcgd2FzIGZpeGVkIHRoYXQgY291bGQgY2F1c2UgQ09VTlRfQUxMT0NTIGJ1aWxkcyB0byBzZWdmYXVsdCwgb3IKICBnZXQgaW50byBpbmZpbml0ZSBsb29wcywgd2hlbiBhIG5ldy1zdHlsZSBjbGFzcyBnb3QgZ2FyYmFnZS1jb2xsZWN0ZWQuCiAgVW5mb3J0dW5hdGVseSwgdG8gYXZvaWQgdGhpcywgdGhlIHdheSBDT1VOVF9BTExPQ1Mgd29ya3MgcmVxdWlyZXMKICB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGJlIGltbW9ydGFsIGluIENPVU5UX0FMTE9DUyBidWlsZHMuICBOb3RlIHRoYXQKICBDT1VOVF9BTExPQ1MgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCwgaW4gZWl0aGVyIHJlbGVhc2Ugb3IgZGVidWcKICBidWlsZHMsIGFuZCB0aGF0IG5ldy1zdHlsZSBjbGFzc2VzIGFyZSBpbW1vcnRhbCBvbmx5IGluIENPVU5UX0FMTE9DUwogIGJ1aWxkcy4KCi0gQ29tcGlsaW5nIG91dCB0aGUgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIG5vIGxvbmdlciBhbiBvcHRpb24uCiAgVGhlIG9sZCBzeW1ib2wgV0lUSF9DWUNMRV9HQyBpcyBub3cgaWdub3JlZCwgYW5kIFB5dGhvbi5oIGFycmFuZ2VzCiAgdGhhdCBpdCdzIGFsd2F5cyBkZWZpbmVkIChmb3IgdGhlIGJlbmVmaXQgb2YgYW55IGV4dGVuc2lvbiBtb2R1bGVzCiAgdGhhdCBtYXkgYmUgY29uZGl0aW9uYWxpemluZyBvbiBpdCkuICBBIGJvbnVzIGlzIHRoYXQgYW55IGV4dGVuc2lvbgogIHR5cGUgcGFydGljaXBhdGluZyBpbiBjeWNsaWMgZ2MgY2FuIGNob29zZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUKICBQeV9UUkFTSENBTiBtZWNoYW5pc20gbm93IHRvbzsgaW4gdGhlIGFic2VuY2Ugb2YgY3ljbGljIGdjLCB0aGlzIHVzZWQKICB0byByZXF1aXJlIGVkaXRpbmcgdGhlIGNvcmUgdG8gdGVhY2ggdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBhYm91dCB0aGUKICBuZXcgdHlwZS4KCi0gQWNjb3JkaW5nIHRvIEFubmV4IEYgb2YgdGhlIGN1cnJlbnQgQyBzdGFuZGFyZCwKCiAgICBUaGUgU3RhbmRhcmQgQyBtYWNybyBIVUdFX1ZBTCBhbmQgaXRzIGZsb2F0IGFuZCBsb25nIGRvdWJsZSBhbmFsb2dzLAogICAgSFVHRV9WQUxGIGFuZCBIVUdFX1ZBTEwsIGV4cGFuZCB0byBleHByZXNzaW9ucyB3aG9zZSB2YWx1ZXMgYXJlCiAgICBwb3NpdGl2ZSBpbmZpbml0aWVzLgoKICBQeXRob24gb25seSB1c2VzIHRoZSBkb3VibGUgSFVHRV9WQUwsIGFuZCBvbmx5IHRvICNkZWZpbmUgaXRzIG93biBzeW1ib2wKICBQeV9IVUdFX1ZBTC4gIFNvbWUgcGxhdGZvcm1zIGhhdmUgaW5jb3JyZWN0IGRlZmluaXRpb25zIGZvciBIVUdFX1ZBTC4KICBweXBvcnQuaCB1c2VkIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LCBidXQgdGhlIHdvcmthcm91bmRzIHRyaWdnZXJlZAogIG90aGVyIGJ1Z3Mgb24gb3RoZXIgcGxhdGZvcm1zLCBzbyB3ZSBnYXZlIHVwLiAgSWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzCiAgSFVHRV9WQUwgaW5jb3JyZWN0bHksIHlvdSdsbCBuZWVkIHRvICNkZWZpbmUgUHlfSFVHRV9WQUwgdG8gc29tZXRoaW5nCiAgdGhhdCB3b3JrcyBvbiB5b3VyIHBsYXRmb3JtLiAgVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBJJ20gc3VyZSBhYm91dAogIGlzIG9uIGFuIHVua25vd24gc3Vic2V0IG9mIENyYXkgc3lzdGVtcywgZGVzY3JpYmVkIGhlcmU6CgogIGh0dHA6Ly93d3cuY3JheS5jb20vc3dwdWJzL21hbnVhbHMvU04tMjE5NF8yLjAvaHRtbC1TTi0yMTk0XzIuMC94MzEzOC5odG0KCiAgUHJlc3VtYWJseSAyLjNhMSBicmVha3Mgc3VjaCBzeXN0ZW1zLiAgSWYgYW55b25lIHVzZXMgc3VjaCBhIHN5c3RlbSwgaGVscCEKCi0gVGhlIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRob3V0LWRvYy1zdHJpbmdzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUKICBkb2Mgc3RyaW5ncyBmcm9tIHRoZSBidWlsdGluIGZ1bmN0aW9ucyBhbmQgbW9kdWxlczsgdGhpcyByZWR1Y2VzIHRoZQogIHNpemUgb2YgdGhlIGV4ZWN1dGFibGUuCgotIFRoZSB1bml2ZXJzYWwgbmV3bGluZXMgb3B0aW9uIChQRVAgMjc4KSBpcyBvbiBieSBkZWZhdWx0LiAgT24gVW5peAogIGl0IGNhbiBiZSBkaXNhYmxlZCBieSBwYXNzaW5nIC0td2l0aG91dC11bml2ZXJzYWwtbmV3bGluZXMgdG8gdGhlCiAgY29uZmlndXJlIHNjcmlwdC4gIE9uIG90aGVyIHBsYXRmb3JtcywgcmVtb3ZlCiAgV0lUSF9VTklWRVJTQUxfTkVXTElORVMgZnJvbSBweWNvbmZpZy5oLgoKLSBPbiBVbml4LCBhIHNoYXJlZCBsaWJweXRob24yLjMuc28gY2FuIGJlIGNyZWF0ZWQgd2l0aCAtLWVuYWJsZS1zaGFyZWQuCgotIEFsbCB1c2VzIG9mIHRoZSBDQUNIRV9IQVNILCBJTlRFUk5fU1RSSU5HUywgYW5kIERPTlRfU0hBUkVfU0hPUlRfU1RSSU5HUwogIHByZXByb2Nlc3NvciBzeW1ib2xzIHdlcmUgZWxpbWluYXRlZC4gIFRoZSBpbnRlcm5hbCBkZWNpc2lvbnMgdGhleQogIGNvbnRyb2xsZWQgc3RvcHBlZCBiZWluZyBleHBlcmltZW50YWwgbG9uZyBhZ28uCgotIFRoZSB0b29scyB1c2VkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uIG5vdyB3b3JrIHVuZGVyIEN5Z3dpbiBhcwogIHdlbGwgYXMgVW5peC4KCi0gVGhlIGJzZGRiIGFuZCBkYm0gbW9kdWxlIGJ1aWxkcyBoYXZlIGJlZW4gY2hhbmdlZCB0byB0cnkgYW5kIGF2b2lkIHZlcnNpb24KICBza2V3IHByb2JsZW1zIGFuZCBkaXNhYmxlIGxpbmthZ2Ugd2l0aCBCZXJrZWxleSBEQiAxLjg1IHVubGVzcyB0aGUKICBpbnN0YWxsZXIga25vd3Mgd2hhdCBzL2hlJ3MgZG9pbmcuICBTZWUgdGhlIHNlY3Rpb24gb24gYnVpbGRpbmcgdGhlc2UKICBtb2R1bGVzIGluIHRoZSBSRUFETUUgZmlsZSBmb3IgZGV0YWlscy4KCkMgQVBJCi0tLS0tCgotIFB5TnVtYmVyX0NoZWNrKCkgbm93IHJldHVybnMgdHJ1ZSBmb3Igc3RyaW5nIGFuZCB1bmljb2RlIG9iamVjdHMuCiAgVGhpcyBpcyBhIHJlc3VsdCBvZiB0aGVzZSB0eXBlcyBoYXZpbmcgYSBwYXJ0aWFsbHkgZGVmaW5lZAogIHRwX2FzX251bWJlciBzbG90LiAgKFRoaXMgaXMgbm90IGEgZmVhdHVyZSwgYnV0IGFuIGluZGljYXRpb24gdGhhdAogIFB5TnVtYmVyX0NoZWNrKCkgaXMgbm90IHZlcnkgdXNlZnVsIHRvIGRldGVybWluZSBudW1lcmljIGJlaGF2aW9yLgogIEl0IG1heSBiZSBkZXByZWNhdGVkLikKCi0gVGhlIHN0cmluZyBvYmplY3QncyBsYXlvdXQgaGFzIGNoYW5nZWQ6IHRoZSBwb2ludGVyIG1lbWJlcgogIG9iX3NpbnRlcm5lZCBoYXMgYmVlbiByZXBsYWNlZCBieSBhbiBpbnQgbWVtYmVyIG9iX3NzdGF0ZS4gIE9uIHNvbWUKICBwbGF0Zm9ybXMgKGUuZy4gbW9zdCA2NC1iaXQgc3lzdGVtcykgdGhpcyBtYXkgY2hhbmdlIHRoZSBvZmZzZXQgb2YKICB0aGUgb2Jfc3ZhbCBtZW1iZXIsIHNvIGFzIGEgcHJlY2F1dGlvbiB0aGUgQVBJX1ZFUlNJT04gaGFzIGJlZW4KICBpbmNyZW1lbnRlZC4gIFRoZSBhcHBhcmVudGx5IHVudXNlZCBmZWF0dXJlIG9mICJpbmRpcmVjdCBpbnRlcm5lZAogIHN0cmluZ3MiLCBzdXBwb3J0ZWQgYnkgdGhlIG9iX3NpbnRlcm5lZCBtZW1iZXIsIGlzIGdvbmUuICBJbnRlcm5lZAogIHN0cmluZ3MgYXJlIG5vdyB1c3VhbGx5IG1vcnRhbDsgdGhlcmVzIGEgbmV3IEFQSSwKICBQeVN0cmluZ19JbnRlcm5JbW1vcnRhbCgpIHRoYXQgY3JlYXRlcyBpbW1vcnRhbCBpbnRlcm5lZCBzdHJpbmdzLgogIChUaGUgb2Jfc3N0YXRlIG1lbWJlciBjYW4gb25seSB0YWtlIHRocmVlIHZhbHVlczsgaG93ZXZlciwgd2hpbGUKICBtYWtpbmcgaXQgYSBjaGFyIHNhdmVzIGEgZmV3IGJ5dGVzIHBlciBzdHJpbmcgb2JqZWN0IG9uIGF2ZXJhZ2UsIGluCiAgaXQgYWxzbyBzbG93ZWQgdGhpbmdzIGRvd24gYSBiaXQgYmVjYXVzZSBvYl9zdmFsIHdhcyBubyBsb25nZXIKICBhbGlnbmVkLikKCi0gVGhlIFB5X0luaXRNb2R1bGUqKCkgZnVuY3Rpb25zIG5vdyBhY2NlcHQgTlVMTCBmb3IgdGhlICdtZXRob2RzJwogIGFyZ3VtZW50LiAgTW9kdWxlcyB3aXRob3V0IGdsb2JhbCBmdW5jdGlvbnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uCiAgbm93IHRoYXQgZmFjdG9yaWVzIGNhbiBiZSB0eXBlcyByYXRoZXIgdGhhbiBmdW5jdGlvbnMuCgotIE5ldyBDIEFQSSBQeVVuaWNvZGVfRnJvbU9yZGluYWwoKSB3aGljaCBleHBvc2VzIHVuaWNocigpIGF0IEMKICBsZXZlbC4KCi0gTmV3IGZ1bmN0aW9ucyBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycigpIGFuZAogIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKCkuIFNpbWlsYXIgdG8KICBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgpIGFuZAogIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKCksIGJ1dCB0aGV5IGFsbG93IHRvIHNwZWNpZnkKICB0aGUgZXhjZXB0aW9uIHR5cGUgdG8gcmFpc2UuIEF2YWlsYWJsZSBvbiBXaW5kb3dzLgoKLSBQeV9GYXRhbEVycm9yKCkgaXMgbm93IGRlY2xhcmVkIGFzIHRha2luZyBhIGNvbnN0IGNoYXIqIGFyZ3VtZW50LiAgSXQKICB3YXMgcHJldmlvdXNseSBkZWNsYXJlZCB3aXRob3V0IGNvbnN0LiAgVGhpcyBzaG91bGQgbm90IGFmZmVjdCB3b3JraW5nCiAgY29kZS4KCi0gQWRkZWQgbmV3IG1hY3JvIFB5U2VxdWVuY2VfSVRFTShvLCBpKSB0aGF0IGRpcmVjdGx5IGNhbGxzCiAgc3FfaXRlbSB3aXRob3V0IHJlY2hlY2tpbmcgdGhhdCBvIGlzIGEgc2VxdWVuY2UgYW5kIHdpdGhvdXQKICBhZGp1c3RpbmcgZm9yIG5lZ2F0aXZlIGluZGljZXMuCgotIFB5UmFuZ2VfTmV3KCkgbm93IHJhaXNlcyBWYWx1ZUVycm9yIGlmIHRoZSBmb3VydGggYXJndW1lbnQgaXMgbm90IDEuCiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSByZW1vdmFsIG9mIGRlcHJlY2F0ZWQgZmVhdHVyZXMgb2YgdGhlIHhyYW5nZQogIG9iamVjdC4KCi0gUHlOdW1iZXJfQ29lcmNlKCkgYW5kIFB5TnVtYmVyX0NvZXJjZUV4KCkgbm93IGFsc28gaW52b2tlIHRoZSB0eXBlJ3MKICBjb2VyY2lvbiBpZiBib3RoIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIHR5cGUgYnV0IHRoaXMgdHlwZSBoYXMgdGhlCiAgQ0hFQ0tUWVBFUyBmbGFnIHNldC4gIFRoaXMgaXMgdG8gYmV0dGVyIHN1cHBvcnQgcHJveGllcy4KCi0gVGhlIHR5cGUgb2YgdHBfZnJlZSBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gImBgdm9pZCAoKikoUHlPYmplY3QgKilgYCIgdG8KICAiYGB2b2lkICgqKSh2b2lkICopYGAiLgoKLSBQeU9iamVjdF9EZWwsIFB5T2JqZWN0X0dDX0RlbCBhcmUgbm93IGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIG1hY3Jvcy4KCi0gQSB0eXBlIGNhbiBub3cgaW5oZXJpdCBpdHMgbWV0YXR5cGUgZnJvbSBpdHMgYmFzZSB0eXBlLiAgUHJldmlvdXNseSwKICB3aGVuIFB5VHlwZV9SZWFkeSgpIHdhcyBjYWxsZWQsIGlmIG9iX3R5cGUgd2FzIGZvdW5kIHRvIGJlIE5VTEwsIGl0CiAgd2FzIGFsd2F5cyBzZXQgdG8gJlB5VHlwZV9UeXBlOyBub3cgaXQgaXMgc2V0IHRvIGJhc2UtPm9iX3R5cGUsCiAgd2hlcmUgYmFzZSBpcyB0cF9iYXNlLCBkZWZhdWx0aW5nIHRvICZQeU9iamVjdF9UeXBlLgoKLSBQeVR5cGVfUmVhZHkoKSBhY2NpZGVudGFsbHkgZGlkIG5vdCBpbmhlcml0IHRwX2lzX2djOyBub3cgaXQgZG9lcy4KCi0gVGhlIFB5Q29yZV8qIGZhbWlseSBvZiBBUElzIGhhdmUgYmVlbiByZW1vdmVkLgoKLSBUaGUgInUjIiBwYXJzZXIgbWFya2VyIHdpbGwgbm93IHBhc3MgdGhyb3VnaCBVbmljb2RlIG9iamVjdHMgYXMtaXMKICB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIGJ1ZmZlciBBUEkuCgotIFRoZSBlbnVtZXJhdG9ycyBvZiBjbXBfb3AgaGF2ZSBiZWVuIHJlbmFtZWQgdG8gdXNlIHRoZSBwcmVmaXggYGBQeUNtcF9gYC4KCi0gQW4gb2xkICNkZWZpbmUgb2YgQU5ZIGFzIHZvaWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHB5cG9ydC5oLiAgVGhpcwogIGhhc24ndCBiZWVuIHVzZWQgc2luY2UgUHl0aG9uJ3MgcHJlLUFOU0kgZGF5cywgYW5kIHRoZSAjZGVmaW5lIGhhcwogIGJlZW4gbWFya2VkIGFzIG9ic29sZXRlIHNpbmNlIHRoZW4uICBTRiBidWcgNDk1NTQ4IHNheXMgaXQgY3JlYXRlZAogIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzLCBzbyBrZWVwaW5nIGl0IGFyb3VuZCB3YXNuJ3QgaGFybWxlc3MuCgotIEJlY2F1c2UgUHl0aG9uJ3MgbWFnaWMgbnVtYmVyIHNjaGVtZSBicm9rZSBvbiBKYW51YXJ5IDFzdCwgd2UgZGVjaWRlZAogIHRvIHN0b3AgUHl0aG9uIGRldmVsb3BtZW50LiAgVGhhbmtzIGZvciBhbGwgdGhlIGZpc2ghCgotIFNvbWUgb2YgdXMgZG9uJ3QgbGlrZSBmaXNoLCBzbyB3ZSBjaGFuZ2VkIFB5dGhvbidzIG1hZ2ljIG51bWJlcgogIHNjaGVtZSB0byBhIG5ldyBvbmUuIFNlZSBQeXRob24vaW1wb3J0LmMgZm9yIGRldGFpbHMuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gT3BlblZNUyBpcyBub3cgc3VwcG9ydGVkLgoKLSBBdGhlT1MgaXMgbm93IHN1cHBvcnRlZC4KCi0gdGhlIEVNWCBydW50aW1lIGVudmlyb25tZW50IG9uIE9TLzIgaXMgbm93IHN1cHBvcnRlZC4KCi0gR05VL0h1cmQgaXMgbm93IHN1cHBvcnRlZC4KClRlc3RzCi0tLS0tCgotIFRoZSByZWdydGVzdC5weSBzY3JpcHQncyAtdSBvcHRpb24gbm93IHByb3ZpZGVzIGEgd2F5IHRvIHNheSAiYWxsb3cKICBhbGwgcmVzb3VyY2VzIGV4Y2VwdCB0aGlzIG9uZS4iICBGb3IgZXhhbXBsZSwgdG8gYWxsb3cgZXZlcnl0aGluZwogIGV4Y2VwdCBic2RkYiwgZ2l2ZSB0aGUgb3B0aW9uICctdWFsbCwtYnNkZGInLgoKV2luZG93cwotLS0tLS0tCgotIFRoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBub3cgc2hpcHMgd2l0aCB2ZXJzaW9uIDQuMC4xNCBvZiB0aGUKICBTbGVlcHljYXQgQmVya2VsZXkgZGF0YWJhc2UgbGlicmFyeS4gIFRoaXMgc2hvdWxkIGJlIGEgaHVnZQogIGltcHJvdmVtZW50IG92ZXIgdGhlIHByZXZpb3VzIEJlcmtlbGV5IERCIDEuODUsIHdoaWNoIGhhZCBtYW55CiAgYnVncy4KICBYWFggV2hhdCBhcmUgdGhlIGxpY2Vuc2luZyBpc3N1ZXMgaGVyZT8KICBYWFggSWYgYSB1c2VyIGhhcyBhIGRhdGFiYXNlIGNyZWF0ZWQgd2l0aCBhIHByZXZpb3VzIHZlcmlvbiBvZgogIFhYWCAgICAgUHl0aG9uLCB3aGF0IG11c3QgdGhleSBkbyB0byBjb252ZXJ0IGl0PwogIFhYWCBJJ20gc3RpbGwgbm90IHN1cmUgaG93IHRvIGxpbmsgdGhpcyB0aGluZyAoc2VlIFBDYnVpbGQvcmVhZG1lLnR4dCkuCiAgWFhYIFRoZSB2ZXJzaW9uICMgaXMgbGlrZWx5IHRvIGNoYW5nZSBiZWZvcmUgMi4zYTEuCgotIFRoZSBXaW5kb3dzIGRpc3RyaWJ1dGlvbiBub3cgc2hpcHMgd2l0aCBhIFNlY3VyZSBTb2NrZXRzIExpYnJhcnkgKFNMTCkKICAgbW9kdWxlIChfc3NsLnB5ZCkKCi0gVGhlIFdpbmRvd3MgZGlzdHJpYnV0aW9uIG5vdyBzaGlwcyB3aXRoIFRjbC9UayB2ZXJzaW9uIDguNC4xIChpdAogIHByZXZpb3VzbHkgc2hpcHBlZCB3aXRoIFRjbC9UayA4LjMuMikuCgotIFdoZW4gUHl0aG9uIGlzIGJ1aWx0IHVuZGVyIGEgTWljcm9zb2Z0IGNvbXBpbGVyLCBzeXMudmVyc2lvbiBub3cKICBpbmNsdWRlcyB0aGUgY29tcGlsZXIgdmVyc2lvbiBudW1iZXIgKF9NU0NfVkVSKS4gIEZvciBleGFtcGxlLCB1bmRlcgogIE1TVkMgNiwgc3lzLnZlcnNpb24gY29uc3RhaW5zIHRoZSBzdWJzdHJpbmcgIk1TQyB2LjEyMDAgIi4gIDEyMDAgaXMKICB0aGUgdmFsdWUgb2YgX01TQ19WRVIgdW5kZXIgTVNWQyA2LgoKLSBTb21ldGltZXMgdGhlIHVuaW5zdGFsbCBleGVjdXRhYmxlIChVTldJU0UuRVhFKSB2YW5pc2hlcy4gIE9uZSBjYXVzZQogIG9mIHRoYXQgaGFzIGJlZW4gZml4ZWQgaW4gdGhlIGluc3RhbGxlciAoZGlzYWJsZWQgV2lzZSdzICJkZWxldGUgaW4tCiAgdXNlIGZpbGVzIiB1bmluc3RhbGwgb3B0aW9uKS4KCi0gRml4ZWQgYSBidWcgaW4gdXJsbGliJ3MgcHJveHkgaGFuZGxpbmcgaW4gV2luZG93cy4gIFtTRiBidWcgIzUwMzAzMV0KCi0gVGhlIGluc3RhbGxlciBub3cgaW5zdGFsbHMgU3RhcnQgbWVudSBzaG9ydGN1dHMgdW5kZXIgKHRoZSBsb2NhbAogIGVxdWl2YWxlbnQgb2YpICJBbGwgVXNlcnMiIHdoZW4gZG9pbmcgYW4gQWRtaW4gaW5zdGFsbC4KCi0gZmlsZS50cnVuY2F0ZShbbmV3c2l6ZV0pIG5vdyB3b3JrcyBvbiBXaW5kb3dzIGZvciBhbGwgbmV3c2l6ZSB2YWx1ZXMuCiAgSXQgdXNlZCB0byBmYWlsIGlmIG5ld3NpemUgZGlkbid0IGZpdCBpbiAzMiBiaXRzLCByZWZsZWN0aW5nIGEKICBsaW1pdGF0aW9uIG9mIE1TIF9jaHNpemUgKHdoaWNoIGlzIG5vIGxvbmdlciB1c2VkKS4KCi0gb3Mud2FpdHBpZCgpIGlzIG5vdyBpbXBsZW1lbnRlZCBmb3IgV2luZG93cywgYW5kIGNhbiBiZSB1c2VkIHRvIGJsb2NrCiAgdW50aWwgYSBzcGVjaWZpZWQgcHJvY2VzcyBleGl0cy4gIFRoaXMgaXMgc2ltaWxhciB0bywgYnV0IG5vdCBleGFjdGx5CiAgdGhlIHNhbWUgYXMsIG9zLndhaXRwaWQoKSBvbiBQT1NJWCBzeXN0ZW1zLiAgSWYgeW91J3JlIHdhaXRpbmcgZm9yCiAgYSBzcGVjaWZpYyBwcm9jZXNzIHdob3NlIHBpZCB3YXMgb2J0YWluZWQgZnJvbSBvbmUgb2YgdGhlIHNwYXduKCkKICBmdW5jdGlvbnMsIHRoZSBzYW1lIFB5dGhvbiBvcy53YWl0cGlkKCkgY29kZSB3b3JrcyBhY3Jvc3MgcGxhdGZvcm1zLgogIFNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscy4gIFRoZSBkb2NzIHdlcmUgY2hhbmdlZCB0byBjbGFyaWZ5IHRoYXQKICBzcGF3biBmdW5jdGlvbnMgcmV0dXJuLCBhbmQgd2FpdHBpZCByZXF1aXJlcywgYSBwcm9jZXNzIGhhbmRsZSBvbgogIFdpbmRvd3MgKG5vdCB0aGUgc2FtZSB0aGluZyBhcyBhIFdpbmRvd3MgcHJvY2VzcyBpZCkuCgotIE5ldyB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlIGltcGxlbWVudGF0aW9uIGZvciBXaW5kb3dzOiAgdGhpcyBkb2Vzbid0CiAgbmVlZCBhIFRlbXBvcmFyeUZpbGVXcmFwcGVyIHdyYXBwZXIgYW55bW9yZSwgYW5kIHNob3VsZCBiZSBpbW11bmUKICB0byBhIG5hc3R5IHByb2JsZW06ICBiZWZvcmUgMi4zLCBpZiB5b3UgZ290IGEgdGVtcCBmaWxlIG9uIFdpbmRvd3MsIGl0CiAgZ290IHdyYXBwZWQgaW4gYW4gb2JqZWN0IHdob3NlIGNsb3NlKCkgbWV0aG9kIGZpcnN0IGNsb3NlZCB0aGUKICB1bmRlcmx5aW5nIGZpbGUsIHRoZW4gZGVsZXRlZCB0aGUgZmlsZS4gIFRoaXMgdXN1YWxseSB3b3JrZWQgZmluZS4KICBIb3dldmVyLCB0aGUgc3Bhd24gZmFtaWx5IG9mIGZ1bmN0aW9ucyBvbiBXaW5kb3dzIGNyZWF0ZSAoYXQgYSBsb3cgQwogIGxldmVsKSB0aGUgc2FtZSBzZXQgb2Ygb3BlbiBmaWxlcyBpbiB0aGUgc3Bhd25lZCBwcm9jZXNzIFEgYXMgd2VyZQogIG9wZW4gaW4gdGhlIHNwYXduaW5nIHByb2Nlc3MgUC4gIElmIGEgdGVtcCBmaWxlIGYgd2FzIGFtb25nIHRoZW0sIHRoZW4KICBkb2luZyBmLmNsb3NlKCkgaW4gUCBmaXJzdCBjbG9zZWQgUCdzIEMtbGV2ZWwgZmlsZSBoYW5kbGUgb24gZiwgYnV0IFEncwogIEMtbGV2ZWwgZmlsZSBoYW5kbGUgb24gZiByZW1haW5lZCBvcGVuLCBzbyB0aGUgYXR0ZW1wdCBpbiBQIHRvIGRlbGV0ZSBmCiAgYmxldyB1cCB3aXRoIGEgIlBlcm1pc3Npb24gZGVuaWVkIiBlcnJvciAoV2luZG93cyBkb2Vzbid0IGFsbG93CiAgZGVsZXRpbmcgb3BlbiBmaWxlcykuICBUaGlzIHdhcyBzdXJwcmlzaW5nLCBzdWJ0bGUsIGFuZCBkaWZmaWN1bHQgdG8KICB3b3JrIGFyb3VuZC4KCi0gVGhlIG9zIG1vZHVsZSBub3cgZXhwb3J0cyBhbGwgdGhlIHN5bWJvbGljIGNvbnN0YW50cyB1c2FibGUgd2l0aCB0aGUKICBsb3ctbGV2ZWwgb3Mub3BlbigpIG9uIFdpbmRvd3M6ICB0aGUgbmV3IGNvbnN0YW50cyBpbiAyLjMgYXJlCiAgT19OT0lOSEVSSVQsIE9fU0hPUlRfTElWRUQsIE9fVEVNUE9SQVJZLCBPX1JBTkRPTSBhbmQgT19TRVFVRU5USUFMLgogIFRoZSBvdGhlcnMgd2VyZSBhbHNvIGF2YWlsYWJsZSBpbiAyLjI6ICBPX0FQUEVORCwgT19CSU5BUlksIE9fQ1JFQVQsCiAgT19FWENMLCBPX1JET05MWSwgT19SRFdSLCBPX1RFWFQsIE9fVFJVTkMgYW5kIE9fV1JPTkxZLiAgQ29udHJhcnkKICB0byBNaWNyb3NvZnQgZG9jcywgT19TSE9SVF9MSVZFRCBkb2VzIG5vdCBzZWVtIHRvIGltcGx5IE9fVEVNUE9SQVJZCiAgKHNvIHNwZWNpZnkgYm90aCBpZiB5b3Ugd2FudCBib3RoOyBub3RlIHRoYXQgbmVpdGhlciBpcyB1c2VmdWwgdW5sZXNzCiAgc3BlY2lmaWVkIHdpdGggT19DUkVBVCB0b28pLgoKTWFjCi0tLS0KCi0gTWFjL1JlbG5vdGVzIGlzIGdvbmUsIHRoZSByZWxlYXNlIG5vdGVzIGFyZSBub3cgaGVyZS4KCi0gVGhlIGN1cnJlbnQgbmFtaW5nIGNvbnZlbnRpb24gZm9yIFB5dGhvbiBvbiB0aGUgTWFjaW50b3NoIGlzIHRoYXQgTWFjUHl0aG9uCiAgcmVmZXJzIHRvIHRoZSB1bml4LWJhc2VkIE9TWC1vbmx5IHZlcnNpb24sIGFuZCBNYWNQeXRob24tT1M5IHJlZmVycyB0byB0aGUKICBDRk0tYmFzZWQgdmVyc2lvbiB0aGF0IHJ1bnMgb24gYm90aCBPUzkgYW5kIE9TWC4KCi0gQWxsIE1hY1B5dGhvbi1PUzkgZnVuY3Rpb25hbGl0eSBpcyBub3cgYXZhaWxhYmxlIGluIGFuIE9TWCB1bml4IGJ1aWxkLAogIGluY2x1ZGluZyB0aGUgQ2FyYm9uIG1vZHVsZXMsIHRoZSBJREUsIE9TQSBzdXBwb3J0LCBldGMuIEEgbG90IG9mIHRoaXMKICB3aWxsIG9ubHkgd29yayBjb3JyZWN0bHkgaW4gYSBmcmFtZXdvcmsgYnVpbGQsIHRob3VnaCwgYmVjYXVzZSB5b3UgY2Fubm90CiAgdGFsayB0byB0aGUgd2luZG93IG1hbmFnZXIgdW5sZXNzIHlvdXIgYXBwbGljYXRpb24gaXMgcnVuIGZyb20gYSAuYXBwCiAgYnVuZGxlLiBUaGVyZSBpcyBhIGNvbW1hbmQgbGluZSB0b29sICJweXRob253IiB0aGF0IHJ1bnMgeW91ciBzY3JpcHQKICB3aXRoIGFuIGludGVycHJldGVyIGxpdmluZyBpbiBzdWNoIGEgLmFwcCBidW5kbGUsIHRoaXMgaW50ZXJwcmV0ZXIgc2hvdWxkCiAgYmUgdXNlZCB0byBydW4gYW55IFB5dGhvbiBzY3JpcHQgdXNpbmcgdGhlIHdpbmRvdyBtYW5hZ2VyIChpbmNsdWRpbmcKICBUa2ludGVyIG9yIHd4UHl0aG9uIHNjcmlwdHMpLgoKLSBNb3N0IG9mIE1hYy9MaWIgaGFzIG1vdmVkIHRvIExpYi9wbGF0LW1hYywgd2hpY2ggaXMgYWdhaW4gdXNlZCBib3RoIGluCiAgTWFjUHl0aG9uLU9TWCBhbmQgTWFjUHl0aG9uLU9TOS4gVGhlIG9ubHkgbW9kdWxlcyByZW1haW5pbmcgaW4gTWFjL0xpYgogIGFyZSBzcGVjaWZpY2FsbHkgZm9yIE1hY1B5dGhvbi1PUzkgKENGTSBzdXBwb3J0LCBwcmVmZXJlbmNlIHJlc291cmNlcywgZXRjKS4KCi0gQSBuZXcgdXRpbGl0eSBQeXRob25MYXVuY2hlciB3aWxsIHN0YXJ0IGEgUHl0aG9uIGludGVycHJldGVyIHdoZW4gYSAucHkgb3IKICAucHl3IHNjcmlwdCBpcyBkb3VibGUtY2xpY2tlZCBpbiB0aGUgRmluZGVyLiBCeSBkZWZhdWx0IC5weSBzY3JpcHRzIGFyZQogIHJ1biB3aXRoIGEgbm9ybWFsIFB5dGhvbiBpbnRlcnByZXRlciBpbiBhIFRlcm1pbmFsIHdpbmRvdyBhbmQgLnB5dwogIGZpbGVzIGFyZSBydW4gd2l0aCBhIHdpbmRvdy1hd2FyZSBweXRob253IGludGVycHJldGVyIHdpdGhvdXQgYSBUZXJtaW5hbAogIHdpbmRvdywgYnV0IGFsbCB0aGlzIGNhbiBiZSBjdXN0b21pemVkLgoKLSBNYWNQeXRob24tT1M5IGlzIG5vdyBDYXJib24tb25seSwgc28gaXQgcnVucyBvbiBNYWMgT1MgOSBvciBNYWMgT1MgWCBhbmQKICBwb3NzaWJseSBvbiBNYWMgT1MgOC42IHdpdGggdGhlIHJpZ2h0IENhcmJvbkxpYiBpbnN0YWxsZWQsIGJ1dCBub3Qgb24gZWFybGllcgogIHJlbGVhc2VzLgoKLSBNYW55IHRvb2xzIHN1Y2ggYXMgQnVpbGRBcHBsZXQucHkgYW5kIGdlbnN1aXRlbW9kdWxlLnB5IG5vdyBzdXBwb3J0IGEgY29tbWFuZAogIGxpbmUgaW50ZXJmYWNlIHRvby4KCi0gQWxsIHRoZSBDYXJib24gY2xhc3NlcyBhcmUgbm93IFBFUDI1MyBjb21wbGlhbnQsIG1lYW5pbmcgdGhhdCB5b3UgY2FuCiAgc3ViY2xhc3MgdGhlbSBmcm9tIFB5dGhvbi4gTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBoYXZlIGdvbmUsIHlvdSBzaG91bGQKICBub3cgdXNlIHRoZSBhY2Nlc3NvciBmdW5jdGlvbiBjYWxsIEFQSSwgd2hpY2ggaXMgYWxzbyB3aGF0IEFwcGxlJ3MKICBkb2N1bWVudGF0aW9uIHVzZXMuIFNvbWUgYXR0cmlidXRlcyBzdWNoIGFzIGdyYWZwb3J0LnZpc1JnbiBhcmUgc3RpbGwKICBhdmFpbGFibGUgZm9yIGNvbnZlbmllbmNlLgoKLSBOZXcgQ2FyYm9uIG1vZHVsZXMgRmlsZSAoaW1wbGVtZW50aW5nIHRoZSBBUElzIGluIEZpbGVzLmggYW5kIEFsaWFzZXMuaCkKICBhbmQgRm9sZGVyIChBUElzIGZyb20gRm9sZGVycy5oKS4gVGhlIG9sZCBtYWNmcyBidWlsdGluIG1vZHVsZSBpcwogIGdvbmUsIGFuZCByZXBsYWNlZCBieSBhIFB5dGhvbiB3cmFwcGVyIGFyb3VuZCB0aGUgbmV3IG1vZHVsZXMuCgotIFBhdGhuYW1lIGhhbmRsaW5nIHNob3VsZCBub3cgYmUgZnVsbHkgY29uc2lzdGVudDogTWFjUHl0aG9uLU9TWCBhbHdheXMgdXNlcwogIHVuaXggcGF0aG5hbWVzIGFuZCBNYWNQeXRob24tT1M5IGFsd2F5cyB1c2VzIGNvbG9uLXNlcGFyYXRlZCBNYWMgcGF0aG5hbWVzCiAgKGFsc28gd2hlbiBydW5uaW5nIG9uIE1hYyBPUyBYKS4KCi0gTmV3IENhcmJvbiBtb2R1bGVzIEhlbHAgYW5kIEFIIGdpdmUgYWNjZXNzIHRvIHRoZSBDYXJib24gSGVscCBNYW5hZ2VyLgogIFRoZXJlIGFyZSBob29rcyBpbiB0aGUgSURFIHRvIGFsbG93IGFjY2Vzc2luZyB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24KICAoYW5kIEFwcGxlJ3MgQ2FyYm9uIGFuZCBDb2NvYSBkb2N1bWVudGF0aW9uKSB0aHJvdWdoIHRoZSBIZWxwIFZpZXdlci4KICBTZWUgTWFjL09TWC9SRUFETUUgZm9yIGNvbnZlcnRpbmcgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIHRvIGEKICBIZWxwIFZpZXdlciBjb21hcHRpYmxlIGZvcm0gYW5kIGluc3RhbGxpbmcgaXQuCgotIE9TQSBzdXBwb3J0IGhhcyBiZWVuIHJlZGVzaWduZWQgYW5kIHRoZSBnZW5lcmF0ZWQgUHl0aG9uIGNsYXNzZXMgbm93CiAgbWlycm9yIHRoZSBpbmhlcml0YW5jZSBkZWZpbmVkIGJ5IHRoZSB1bmRlcmx5aW5nIE9TQSBjbGFzc2VzLgoKLSBNYWNQeXRob24gbm8gbG9uZ2VyIG1hcHMgYm90aCBcciBhbmQgXG4gdG8gXG4gb24gaW5wdXQgZm9yIGFueSB0ZXh0IGZpbGUuCiAgVGhpcyBmZWF0dXJlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgKFBFUDI3OCkuCgotIFRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciBQeXRob24gc291cmNlZmlsZXMgaW4gTWFjUHl0aG9uLU9TOSBpcyBubyBsb25nZXIKICBtYWMtcm9tYW4gKG9yIHdoYXRldmVyIHlvdXIgbG9jYWwgTWFjIGVuY29kaW5nIHdhcyBidXQgImFzY2lpIiwgbGlrZSBvbgogIG90aGVyIHBsYXRmb3Jtcy4gSWYgeW91IHJlYWxseSBuZWVkIHNvdXJjZWZpbGVzIHdpdGggTWFjIGNoYXJhY3RlcnMgaW4gdGhlbQogIHlvdSBjYW4gY2hhbmdlIHRoaXMgaW4gc2l0ZS5weS4KCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMiBmaW5hbD8KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMjEtRGVjLTIwMDEqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBwaWNrbGUucHksIGNQaWNrbGU6IGFsbG93IHBpY2tsaW5nIGluc3RhbmNlcyBvZiBuZXctc3R5bGUgY2xhc3NlcwogIHdpdGggYSBjdXN0b20gbWV0YWNsYXNzLgoKQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gd2Vha3JlZiBwcm94eSBvYmplY3Q6IHdoZW4gY29tcGFyaW5nLCB1bndyYXAgYm90aCBhcmd1bWVudHMgaWYgYm90aAogIGFyZSBwcm94aWVzLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gYmluYXNjaWkuYjJhX2Jhc2U2NCgpOiBmaXggYSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gd2hlbiBlbmNvZGluZwogIHZlcnkgc2hvcnQgc3RyaW5ncy4KCi0gY1BpY2tsZTogdGhlIG9ic2N1cmUgImZhc3QiIG1vZGUgd2FzIHN1c3BlY3RlZCBvZiBjYXVzaW5nIHN0YWNrCiAgb3ZlcmZsb3dzIG9uIHRoZSBNYWMuICBIb3BlZnVsbHkgZml4ZWQgdGhpcyBieSBzZXR0aW5nIHRoZSByZWN1cnNpb24KICBsaW1pdCBtdWNoIHNtYWxsZXIuICBJZiB0aGUgbGltaXQgaXMgdG9vIGxvdyAoaXQgb25seSBhZmZlY3RzCiAgcGVyZm9ybWFuY2UpLCB5b3UgY2FuIGNoYW5nZSBpdCBieSBkZWZpbmluZyBQWV9DUElDS0xFX0ZBU1RfTElNSVQKICB3aGVuIGNvbXBpbGluZyBjUGlja2xlLmMgKG9yIGluIHB5Y29uZmlnLmgpLgoKTGlicmFyeQotLS0tLS0tCgotIGR1bWJkYm0ucHk6IGZpeGVkIGEgZHVtYiBvbGQgYnVnICh0aGUgZmlsZSBkaWRuJ3QgZ2V0IHN5bmNoZWQgYXQKICBjbG9zZSBvciBkZWxldGUgdGltZSkuCgotIHJmYzgyMi5weTogZml4ZWQgYSBidWcgd2hlcmUgdGhlIGFkZHJlc3MgJzw+JyB3YXMgY29udmVydGVkIHRvIE5vbmUKICBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZyAoYWxzbyBmaXhlcyB0aGUgZW1haWwuVXRpbHMgbW9kdWxlKS4KCi0geG1scnBjbGliLnB5OiB2ZXJzaW9uIDEuMC4wOyB1c2VzIHByZWNpc2lvbiBmb3IgZG91Ymxlcy4KCi0gdGVzdCBzdWl0ZTogdGhlIHBpY2tsZSBhbmQgY1BpY2tsZSB0ZXN0cyB3ZXJlIG5vdCBleGVjdXRpbmcgYW55IGNvZGUKICB3aGVuIHJ1biBmcm9tIHRoZSBzdGFuZGFyZCByZWdyZXNzaW9uIHRlc3QuCgpUb29scy9EZW1vcwotLS0tLS0tLS0tLQoKQnVpbGQKLS0tLS0KCkMgQVBJCi0tLS0tCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KClRlc3RzCi0tLS0tCgpXaW5kb3dzCi0tLS0tLS0KCi0gZGlzdHV0aWxzIHBhY2thZ2U6IGZpeGVkIGJyb2tlbiBXaW5kb3dzIGluc3RhbGxlcnMgKGJkaXN0X3dpbmluc3QpLgoKLSB0ZW1wZmlsZS5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gVGVtcG9yYXJ5RmlsZVdyYXBwZXIKICBpbnN0YW5jZXMgYXJlIGRlbGV0ZWQgYXQgcHJvY2VzcyBleGl0IHRpbWUuCgotIHNvY2tldC5weTogcHJldmVudCBteXN0ZXJpb3VzIHdhcm5pbmdzIHdoZW4gc29ja2V0IGluc3RhbmNlcyBhcmUKICBkZWxldGVkIGF0IHByb2Nlc3MgZXhpdCB0aW1lLgoKLSBwb3NpeG1vZHVsZS5jOiBmaXggYSBXaW5kb3dzIGNyYXNoIHdpdGggc3RhdCgpIG9mIGEgZmlsZW5hbWUgZW5kaW5nCiAgaW4gYmFja3NsYXNoLgoKTWFjCi0tLS0KCi0gVGhlIENhcmJvbiB0b29sYm94IG1vZHVsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIFVuaXZlcnNhbCBIZWFkZXJzCiAgMy40LCBhbmQgZXhwZXJpbWVudGFsIENvcmVHcmFwaGljcyBhbmQgQ2FyYm9uRXZlbnRzIG1vZHVsZXMgaGF2ZQogIGJlZW4gYWRkZWQuICBBbGwgb25seSBmb3IgZnJhbWV3b3JrLWVuYWJsZWQgTWFjT1NYLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmMxPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIGRhdGU6IDE0LURlYy0yMDAxKgoKVHlwZS9jbGFzcyB1bmlmaWNhdGlvbiBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gR3VpZG8ncyB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gdGhlIG5ldyB0eXBlL2NsYXNzIGZlYXR1cmVzIGhhcwogIGJlZW4gZXh0ZW5zaXZlbHkgdXBkYXRlZC4gIFNlZQoKICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwKCiAgVGhhdCByZW1haW5zIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gaW4gdGhpcyBhcmVhLgoKLSBGaXhlZCBhIGxlYWs6IGluc3RhbmNlIHZhcmlhYmxlcyBkZWNsYXJlZCB3aXRoIF9fc2xvdHNfXyB3ZXJlIG5ldmVyCiAgZGVsZXRlZCEKCi0gVGhlICJkZWxldGUgYXR0cmlidXRlIiBtZXRob2Qgb2YgZGVzY3JpcHRvciBvYmplY3RzIGlzIGNhbGxlZAogIF9fZGVsZXRlX18sIG5vdCBfX2RlbF9fLiAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0IHdhcyBtaXN0YWtlbmx5CiAgY2FsbGVkIF9fZGVsX18sIHdoaWNoIGNyZWF0ZWQgYW4gdW5mb3J0dW5hdGUgb3ZlcmxvYWRpbmcgY29uZGl0aW9uCiAgd2l0aCBmaW5hbGl6ZXJzLiAgKFRoZSAiZ2V0IGF0dHJpYnV0ZSIgYW5kICJzZXQgYXR0cmlidXRlIiBtZXRob2RzCiAgYXJlIHN0aWxsIGNhbGxlZCBfX2dldF9fIGFuZCBfX3NldF9fLCByZXNwZWN0aXZlbHkuKQoKLSBTb21lIHN1YnRsZSBpc3N1ZXMgd2l0aCB0aGUgc3VwZXIgYnVpbHQtaW4gd2VyZSBmaXhlZDoKCiAgKGEpIFdoZW4gc3VwZXIgaXRzZWxmIGlzIHN1YmNsYXNzZWQsIGl0cyBfX2dldF9fIG1ldGhvZCB3b3VsZCBzdGlsbAogICAgICByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIGJhc2UgY2xhc3MgKGkuZS4sIG9mIHN1cGVyKS4KCiAgKGIpIHN1cGVyKEMsIEMoKSkuX19jbGFzc19fIHdvdWxkIHJldHVybiBDIHJhdGhlciB0aGFuIHN1cGVyLiAgVGhpcwogICAgICBpcyBjb25mdXNpbmcuICBUbyBmaXggdGhpcywgSSBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mCiAgICAgIHN1cGVyIHNvIHRoYXQgaXQgb25seSBhcHBsaWVzIHRvIGNvZGUgYXR0cmlidXRlcywgbm90IHRvIGRhdGEKICAgICAgYXR0cmlidXRlcy4gIEFmdGVyIGFsbCwgb3ZlcnJpZGluZyBkYXRhIGF0dHJpYnV0ZXMgaXMgbm90CiAgICAgIHN1cHBvcnRlZCBhbnl3YXkuCgogIChjKSBUaGUgX19nZXRfXyBtZXRob2QgZGlkbid0IGNoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IHdhcyBhbgogICAgICBpbnN0YW5jZSBvZiB0aGUgdHlwZSB1c2VkIGluIGNyZWF0aW9uIG9mIHRoZSBzdXBlciBpbnN0YW5jZS4KCi0gUHJldmlvdXNseSwgaGFzaCgpIG9mIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgYSBtdXRhYmxlIHR5cGUKICAobGlzdCBvciBkaWN0aW9uYXJ5KSB3b3VsZCByZXR1cm4gc29tZSB2YWx1ZSwgcmF0aGVyIHRoYW4gcmFpc2luZwogIFR5cGVFcnJvci4gIFRoaXMgaGFzIGJlZW4gZml4ZWQuICBBbHNvLCBkaXJlY3RseSBjYWxsaW5nCiAgZGljdC5fX2hhc2hfXyBhbmQgbGlzdC5fX2hhc2hfXyBub3cgcmFpc2VzIHRoZSBzYW1lIFR5cGVFcnJvcgogIChwcmV2aW91c2x5LCB0aGVzZSB3ZXJlIHRoZSBzYW1lIGFzIG9iamVjdC5fX2hhc2hfXykuCgotIE5ldy1zdHlsZSBvYmplY3RzIG5vdyBzdXBwb3J0IGRlbGV0aW5nIHRoZWlyIF9fZGljdF9fLiAgVGhpcyBpcyBmb3IKICBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgZXF1aXZhbGVudCB0byBhc3NpZ25pbmcgYSBicmFuZCBuZXcgZW1wdHkKICBkaWN0aW9uYXJ5LCBidXQgc2F2ZXMgc3BhY2UgaWYgdGhlIG9iamVjdCBpcyBub3QgdXNlZCBmdXJ0aGVyLgoKQ29yZSBhbmQgYnVpbHRpbnMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gLVFuZXcgbm93IHdvcmtzIGFzIGRvY3VtZW50ZWQgaW4gUEVQIDIzODogIHdoZW4gLVFuZXcgaXMgcGFzc2VkIG9uCiAgdGhlIGNvbW1hbmQgbGluZSwgYWxsIG9jY3VycmVuY2VzIG9mICIvIiB1c2UgdHJ1ZSBkaXZpc2lvbiBpbnN0ZWFkCiAgb2YgY2xhc3NpYyBkaXZpc2lvbi4gIFNlZSB0aGUgUEVQIGZvciBkZXRhaWxzLiAgTm90ZSB0aGF0ICJhbGwiCiAgbWVhbnMgYWxsIGluc3RhbmNlcyBpbiBsaWJyYXJ5IGFuZCAzcmQtcGFydHkgbW9kdWxlcywgYXMgd2VsbCBhcyBpbgogIHlvdXIgb3duIGNvZGUuICBBcyB0aGUgUEVQIHNheXMsIC1RbmV3IGlzIGludGVuZGVkIGZvciB1c2Ugb25seSBpbgogIGVkdWNhdGlvbmFsIGVudmlyb25tZW50cyB3aXRoIGNvbnRyb2wgb3ZlciB0aGUgbGlicmFyaWVzIGluIHVzZS4KICBOb3RlIHRoYXQgdGVzdF9jb2VyY2lvbi5weSBpbiB0aGUgc3RhbmRhcmQgUHl0aG9uIHRlc3Qgc3VpdGUgZmFpbHMKICB1bmRlciAtUW5ldzsgdGhpcyBpcyBleHBlY3RlZCwgYW5kIHdvbid0IGJlIHJlcGFpcmVkIHVudGlsIHRydWUKICBkaXZpc2lvbiBiZWNvbWVzIHRoZSBkZWZhdWx0IChpbiB0aGUgbWVhbnRpbWUsIHRlc3RfY29lcmNpb24gaXMKICB0ZXN0aW5nIHRoZSBjdXJyZW50IHJ1bGVzKS4KCi0gY29tcGxleCgpIG5vdyBvbmx5IGFsbG93cyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYSBzdHJpbmcKICBhcmd1bWVudCwgYW5kIHJhaXNlcyBUeXBlRXJyb3IgaWYgZWl0aGVyIHRoZSBzZWNvbmQgYXJnIGlzIGEgc3RyaW5nCiAgb3IgaWYgdGhlIHNlY29uZCBhcmcgaXMgc3BlY2lmaWVkIHdoZW4gdGhlIGZpcnN0IGlzIGEgc3RyaW5nLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gZ2MuZ2V0X3JlZmVyZW50cyB3YXMgcmVuYW1lZCB0byBnYy5nZXRfcmVmZXJyZXJzLgoKTGlicmFyeQotLS0tLS0tCgotIEZ1bmN0aW9ucyBpbiB0aGUgb3Muc3Bhd24oKSBmYW1pbHkgbm93IHJlbGVhc2UgdGhlIGdsb2JhbCBpbnRlcnByZXRlcgogIGxvY2sgYXJvdW5kIGNhbGxpbmcgdGhlIHBsYXRmb3JtIHNwYXduLiAgVGhleSBzaG91bGQgYWx3YXlzIGhhdmUgZG9uZQogIHRoaXMsIGJ1dCBkaWQgbm90IGJlZm9yZSAyLjJjMS4gIE11bHRpdGhyZWFkZWQgcHJvZ3JhbXMgY2FsbGluZwogIGFuIG9zLnNwYXduIGZ1bmN0aW9uIHdpdGggUF9XQUlUIHdpbGwgbm8gbG9uZ2VyIGJsb2NrIGFsbCBQeXRob24gdGhyZWFkcwogIHVudGlsIHRoZSBzcGF3bmVkIHByb2dyYW0gY29tcGxldGVzLiAgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcHJvZ3JhbXMKICByZWxpZXMgb24gYmxvY2tpbmcsIGFsdGhvdWdoIG1vcmUgbGlrZWx5IGJ5IGFjY2lkZW50IHRoYW4gYnkgZGVzaWduLgoKLSB3ZWJicm93c2VyIGRlZmF1bHRzIHRvIG5ldHNjYXBlLmV4ZSBvbiBPUy8yIG5vdy4KCi0gVGl4LlJlc2l6ZUhhbmRsZSBleHBvc2VzIGRldGFjaF93aWRnZXQsIGhpZGUsIGFuZCBzaG93LgoKLSBUaGUgY2hhcnNldCBhbGlhcyB3aW5kb3dzXzEyNTIgaGFzIGJlZW4gYWRkZWQuCgotIHR5cGVzLlN0cmluZ1R5cGVzIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZGVmaW5lZCBzdHJpbmcgdHlwZXM7CiAgdXN1YWxseSB0aGlzIHdpbGwgYmUgKHN0ciwgdW5pY29kZSksIGJ1dCBpZiBQeXRob24gd2FzIGNvbXBpbGVkCiAgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQgaXQgd2lsbCBiZSBqdXN0IChzdHIsKS4KCi0gVGhlIHB1bGxkb20gYW5kIG1pbmlkb20gbW9kdWxlcyB3ZXJlIHN5bmNocm9uaXplZCB0byBQeVhNTC4KClRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tCgotIEEgbmV3IHNjcmlwdCBjYWxsZWQgVG9vbHMvc2NyaXB0cy9nb29nbGUucHkgd2FzIGFkZGVkLCB3aGljaCBmaXJlcwogIG9mZiBhIHNlYXJjaCBvbiBHb29nbGUuCgpCdWlsZAotLS0tLQoKLSBOb3RlIHRoYXQgcmVsZWFzZSBidWlsZHMgb2YgUHl0aG9uIHNob3VsZCBhcnJhbmdlIHRvIGRlZmluZSB0aGUKICBwcmVwcm9jZXNzb3Igc3ltYm9sIE5ERUJVRyBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBlcXVpdmFsZW50KS4KICBJbiB0aGUgMi4yIHByZS1yZWxlYXNlIHNlcmllcyB3ZSB0cmllZCB0byBkZWZpbmUgdGhpcyBieSBtYWdpYyBpbgogIFB5dGhvbi5oIGluc3RlYWQsIGJ1dCBpdCBwcm92ZWQgdG8gY2F1c2UgcHJvYmxlbXMgZm9yIGV4dGVuc2lvbgogIGF1dGhvcnMuICBUaGUgVW5peCwgV2luZG93cyBhbmQgTWFjIGJ1aWxkcyBub3cgYWxsIGRlZmluZSBOREVCVUcgaW4KICByZWxlYXNlIGJ1aWxkcyB2aWEgY21kbGluZSAob3IgZXF1aXZhbGVudCkgaW5zdGVhZC4gIFBvcnRzIHRvCiAgb3RoZXIgcGxhdGZvcm1zIHNob3VsZCBkbyBsaWtld2lzZS4KCi0gSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byB1c2UgLS13aXRoLXN1ZmZpeCB3aGVuIGJ1aWxkaW5nIG9uIGEKICBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtIChzdWNoIGFzIE1hYyBPUyBYIEhGUyspLiBJbiB0aGUgYnVpbGQKICBkaXJlY3RvcnkgYW4gZXh0ZW5zaW9uIGlzIHVzZWQsIGJ1dCBub3QgaW4gdGhlIGluc3RhbGxlZCBweXRob24uCgpDIEFQSQotLS0tLQoKLSBOZXcgZnVuY3Rpb24gUHlEaWN0X01lcmdlRnJvbVNlcTIoKSBleHBvc2VzIHRoZSBidWlsdGluIGRpY3QKICBjb25zdHJ1Y3RvcidzIGxvZ2ljIGZvciB1cGRhdGluZyBhIGRpY3Rpb25hcnkgZnJvbSBhbiBpdGVyYWJsZSBvYmplY3QKICBwcm9kdWNpbmcga2V5LXZhbHVlIHBhaXJzLgoKLSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKSByZXF1aXJlcyB0aGF0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgogIHRoZSBrZXl3b3JkIGxpc3QgZXF1YWwgdGhlIG51bWJlciBvZiBhcmd1bWVudCBzcGVjaWZpZXJzLiAgVGhpcwogIHdhc24ndCBjaGVja2VkIGNvcnJlY3RseSwgYW5kIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBjb3VsZCBldmVuCiAgZHVtcCBjb3JlIGluIHNvbWUgYmFkIGNhc2VzLiAgVGhpcyBoYXMgYmVlbiByZXBhaXJlZC4gIEFzIGEgcmVzdWx0LAogIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBtYXkgcmFpc2UgUnVudGltZUVycm9yIGluIGJhZCBjYXNlcyB0aGF0CiAgcHJldmlvdXNseSB3ZW50IHVuY2hhbGxlbmdlZC4KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKVGVzdHMKLS0tLS0KCldpbmRvd3MKLS0tLS0tLQoKTWFjCi0tLS0KCi0gSW4gdW5peC1QeXRob24gb24gTWFjIE9TIFggKGFuZCBkYXJ3aW4pIHN5cy5wbGF0Zm9ybSBpcyBub3cgImRhcndpbiIsCiAgd2l0aG91dCBhbnkgdHJhaWxpbmcgZGlnaXRzLgoKLSBDaGFuZ2VkIGxvZ2ljIGZvciBmaW5kaW5nIHB5dGhvbiBob21lIGluIE1hYyBPUyBYIGZyYW1ld29yayBQeXRob25zLgogIE5vdyBzeXMuZXhlY3V0YWJsZSBwb2ludHMgdG8gdGhlIGV4ZWN1dGFibGUgYWdhaW4sIGluIHN0ZWFkIG9mIHRvCiAgdGhlIHNoYXJlZCBsaWJyYXJ5LiBUaGUgbGF0dGVyIGlzIHVzZWQgb25seSBmb3IgbG9jYXRpbmcgdGhlIHB5dGhvbgogIGhvbWUuCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYjI/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMTYtTm92LTIwMDEqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBNdWx0aXBsZSBpbmhlcml0YW5jZSBtaXhpbmcgbmV3LXN0eWxlIGFuZCBjbGFzc2ljIGNsYXNzZXMgaW4gdGhlCiAgbGlzdCBvZiBiYXNlIGNsYXNzZXMgaXMgbm93IGFsbG93ZWQsIHNvIHRoaXMgd29ya3Mgbm93OgoKICAgICAgY2xhc3MgQ2xhc3NpYzogcGFzcwogICAgICBjbGFzcyBNaXhlZChDbGFzc2ljLCBvYmplY3QpOiBwYXNzCgogIFRoZSBNUk8gKG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyKSBmb3IgZWFjaCBiYXNlIGNsYXNzIGlzIHJlc3BlY3RlZAogIGFjY29yZGluZyB0byBpdHMga2luZCwgYnV0IHRoZSBNUk8gZm9yIHRoZSBkZXJpdmVkIGNsYXNzIGlzIGNvbXB1dGVkCiAgdXNpbmcgbmV3LXN0eWxlIE1STyBydWxlcyBpZiBhbnkgYmFzZSBjbGFzcyBpcyBhIG5ldy1zdHlsZSBjbGFzcy4KICBUaGlzIG5lZWRzIHRvIGJlIGRvY3VtZW50ZWQuCgotIFRoZSBuZXcgYnVpbHRpbiBkaWN0aW9uYXJ5KCkgY29uc3RydWN0b3IsIGFuZCBkaWN0aW9uYXJ5IHR5cGUsIGhhdmUKICBiZWVuIHJlbmFtZWQgdG8gZGljdC4gIFRoaXMgcmVmbGVjdHMgYSBkZWNhZGUgb2YgY29tbW9uIHVzYWdlLgoKLSBkaWN0KCkgbm93IGFjY2VwdHMgYW4gaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZyAyLXNlcXVlbmNlcy4gIEZvcgogIGV4YW1wbGUsIGRpY3QoZC5pdGVtcygpKSA9PSBkIGZvciBhbnkgZGljdGlvbmFyeSBkLiAgVGhlIGFyZ3VtZW50LAogIGFuZCB0aGUgZWxlbWVudHMgb2YgdGhlIGFyZ3VtZW50LCBjYW4gYmUgYW55IGl0ZXJhYmxlIG9iamVjdHMuCgotIE5ldy1zdHlsZSBjbGFzc2VzIGNhbiBub3cgaGF2ZSBhIF9fZGVsX18gbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQKICB3aGVuIHRoZSBpbnN0YW5jZSBpcyBkZWxldGVkIChqdXN0IGxpa2UgZm9yIGNsYXNzaWMgY2xhc3NlcykuCgotIEFzc2lnbm1lbnQgdG8gb2JqZWN0Ll9fZGljdF9fIGlzIG5vdyBwb3NzaWJsZSwgZm9yIG9iamVjdHMgdGhhdCBhcmUKICBpbnN0YW5jZXMgb2YgbmV3LXN0eWxlIGNsYXNzZXMgdGhhdCBoYXZlIGEgX19kaWN0X18gKHVubGVzcyB0aGUgYmFzZQogIGNsYXNzIGZvcmJpZHMgaXQpLgoKLSBNZXRob2RzIG9mIGJ1aWx0LWluIHR5cGVzIG5vdyBwcm9wZXJseSBjaGVjayBmb3Iga2V5d29yZCBhcmd1bWVudHMKICAoZm9ybWVybHkgdGhlc2Ugd2VyZSBzaWxlbnRseSBpZ25vcmVkKS4gIFRoZSBvbmx5IGJ1aWx0LWluIG1ldGhvZHMKICB0aGF0IHRha2Uga2V5d29yZCBhcmd1bWVudHMgYXJlIF9fY2FsbF9fLCBfX2luaXRfXyBhbmQgX19uZXdfXy4KCi0gVGhlIHNvY2tldCBmdW5jdGlvbiBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSB0eXBlOyBzZWUgYmVsb3cuCgpDb3JlIGFuZCBidWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLQoKLSBBc3NpZ25tZW50IHRvIF9fZGVidWdfXyByYWlzZXMgU3ludGF4RXJyb3IgYXQgY29tcGlsZS10aW1lLiAgVGhpcwogIHdhcyBwcm9taXNlZCB3aGVuIDIuMWMxIHdhcyByZWxlYXNlZCBhcyAiV2hhdCdzIE5ldyBpbiBQeXRob24gMi4xYzEiCiAgKHNlZSBiZWxvdykgc2F5cy4KCi0gQ2xhcmlmaWVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgdW5zdXBwb3J0ZWQgb3BlcmFuZHMgdG8gYW4gb3BlcmF0b3IKICAobGlrZSAxICsgJycpLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gbW1hcCBoYXMgYSBuZXcga2V5d29yZCBhcmd1bWVudCwgImFjY2VzcyIsIGFsbG93aW5nIGEgdW5pZm9ybSB3YXkgZm9yCiAgYm90aCBXaW5kb3dzIGFuZCBVbml4IHVzZXJzIHRvIGNyZWF0ZSByZWFkLW9ubHksIHdyaXRlLXRocm91Z2ggYW5kCiAgY29weS1vbi13cml0ZSBtZW1vcnkgbWFwcGluZ3MuICBUaGlzIHdhcyBwcmV2aW91c2x5IHBvc3NpYmxlIG9ubHkgb24KICBVbml4LiAgQSBuZXcga2V5d29yZCBhcmd1bWVudCB3YXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGlzIGluIGEKICB1bmlmb3JtIHdheSBiZWNhdXNlIHRoZSBtbWFwKCkgc2lnbmF0dXJlcyBoYWQgZGl2ZXJnZWQgYWNyb3NzCiAgcGxhdGZvcm1zLiAgVGhhbmtzIHRvIEpheSBUIE1pbGxlciBmb3IgcmVwYWlyaW5nIHRoaXMhCgotIEJ5IGRlZmF1bHQsIHRoZSBnYy5nYXJiYWdlIGxpc3Qgbm93IGNvbnRhaW5zIG9ubHkgdGhvc2UgaW5zdGFuY2VzIGluCiAgdW5yZWFjaGFibGUgY3ljbGVzIHRoYXQgaGF2ZSBfX2RlbF9fIG1ldGhvZHM7IGluIDIuMSBpdCBjb250YWluZWQgYWxsCiAgaW5zdGFuY2VzIGluIHVucmVhY2hhYmxlIGN5Y2xlcy4gICJJbnN0YW5jZXMiIGhlcmUgaGFzIGJlZW4gZ2VuZXJhbGl6ZWQKICB0byBpbmNsdWRlIGluc3RhbmNlcyBvZiBib3RoIG5ldy1zdHlsZSBhbmQgb2xkLXN0eWxlIGNsYXNzZXMuCgotIFRoZSBzb2NrZXQgbW9kdWxlIGRlZmluZXMgYSBuZXcgbWV0aG9kIGZvciBzb2NrZXQgb2JqZWN0cywKICBzZW5kYWxsKCkuICBUaGlzIGlzIGxpa2Ugc2VuZCgpIGJ1dCBtYXkgbWFrZSBtdWx0aXBsZSBjYWxscyB0bwogIHNlbmQoKSB1bnRpbCBhbGwgZGF0YSBoYXMgYmVlbiBzZW50LiAgQWxzbywgdGhlIHNvY2tldCBmdW5jdGlvbiBoYXMKICBiZWVuIGNvbnZlcnRlZCB0byBhIHN1YmNsYXNzYWJsZSB0eXBlLCBsaWtlIGxpc3QgYW5kIHR1cGxlIChldGMuKQogIGJlZm9yZSBpdDsgc29ja2V0IGFuZCBTb2NrZXRUeXBlIGFyZSBub3cgdGhlIHNhbWUgdGhpbmcuCgotIFZhcmlvdXMgYnVnZml4ZXMgdG8gdGhlIGN1cnNlcyBtb2R1bGUuICBUaGVyZSBpcyBub3cgYSB0ZXN0IHN1aXRlCiAgZm9yIHRoZSBjdXJzZXMgbW9kdWxlICh5b3UgaGF2ZSB0byBydW4gaXQgbWFudWFsbHkpLgoKLSBiaW5hc2NpaS5iMmFfYmFzZTY0IG5vIGxvbmdlciBwbGFjZXMgYW4gYXJiaXRyYXJ5IHJlc3RyaWN0aW9uIG9mIDU3CiAgYnl0ZXMgb24gaXRzIGlucHV0LgoKTGlicmFyeQotLS0tLS0tCgotIHRrRmlsZURpYWxvZyBleHBvc2VzIGEgRGlyZWN0b3J5IGNsYXNzIGFuZCBhc2tkaXJlY3RvcnkKICBjb252ZW5pZW5jZSBmdW5jdGlvbi4KCi0gU3ltYm9saWMgZ3JvdXAgbmFtZXMgaW4gcmVndWxhciBleHByZXNzaW9ucyBtdXN0IGJlIHVuaXF1ZS4gIEZvcgogIGV4YW1wbGUsIHRoZSByZWdleHAgcicoP1A8YWJjPikoP1A8YWJjPiknIGlzIG5vdCBhbGxvd2VkLCBiZWNhdXNlIGEKICBzaW5nbGUgbmFtZSBjYW4ndCBtZWFuIGJvdGggImdyb3VwIDEiIGFuZCAiZ3JvdXAgMiIgc2ltdWx0YW5lb3VzbHkuCiAgUHl0aG9uIDIuMiBkZXRlY3RzIHRoaXMgZXJyb3IgYXQgcmVnZXhwIGNvbXBpbGF0aW9uIHRpbWU7CiAgcHJldmlvdXNseSwgdGhlIGVycm9yIHdlbnQgdW5kZXRlY3RlZCwgYW5kIHJlc3VsdHMgd2VyZQogIHVucHJlZGljdGFibGUuICBBbHNvIGluIHNyZSwgdGhlIHBhdHRlcm4uc3BsaXQoKSwgcGF0dGVybi5zdWIoKSwgYW5kCiAgcGF0dGVybi5zdWJuKCkgbWV0aG9kcyBoYXZlIGJlZW4gcmV3cml0dGVuIGluIEMuICBBbHNvLCBhbgogIGV4cGVyaW1lbnRhbCBmdW5jdGlvbi9tZXRob2QgZmluZGl0ZXIoKSBoYXMgYmVlbiBhZGRlZCwgd2hpY2ggd29ya3MKICBsaWtlIGZpbmRhbGwoKSBidXQgcmV0dXJucyBhbiBpdGVyYXRvci4KCi0gVGl4IGV4cG9zZXMgbW9yZSBjb21tYW5kcyB0aHJvdWdoIHRoZSBjbGFzc2VzIERpclNlbGVjdEJveCwKICBEaXJTZWxlY3REaWFsb2csIExpc3ROb3RlQm9vaywgTWV0ZXIsIENoZWNrTGlzdCwgYW5kIHRoZQogIG1ldGhvZHMgdGl4X2FkZGJpdG1hcGRpciwgdGl4X2NnZXQsIHRpeF9jb25maWd1cmUsIHRpeF9maWxlZGlhbG9nLAogIHRpeF9nZXRiaXRtYXAsIHRpeF9nZXRpbWFnZSwgdGl4X29wdGlvbl9nZXQsIGFuZCB0aXhfcmVzZXRvcHRpb25zLgoKLSBUcmFjZWJhY2sgb2JqZWN0cyBhcmUgbm93IHNjYW5uZWQgYnkgY3ljbGljIGdhcmJhZ2UgY29sbGVjdGlvbiwgc28KICBjeWNsZXMgY3JlYXRlZCBieSBjYXN1YWwgdXNlIG9mIHN5cy5leGNfaW5mbygpIG5vIGxvbmdlciBjYXVzZQogIHBlcm1hbmVudCBtZW1vcnkgbGVha3MgKHByb3ZpZGVkIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBlbmFibGVkKS4KCi0gb3MuZXh0c2VwIC0tIGEgbmV3IHZhcmlhYmxlIG5lZWRlZCBieSB0aGUgUklTQ09TIHN1cHBvcnQuICBJdCBpcyB0aGUKICBzZXBhcmF0b3IgdXNlZCBieSBleHRlbnNpb25zLCBhbmQgaXMgJy4nIG9uIGFsbCBwbGF0Zm9ybXMgZXhjZXB0CiAgUklTQ09TLCB3aGVyZSBpdCBpcyAnLycuICBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGlzIHZhcmlhYmxlCiAgdW5sZXNzIHlvdSBoYXZlIGEgbWFzb2NoaXN0aWMgZGVzaXJlIHRvIHBvcnQgeW91ciBjb2RlIHRvIFJJU0NPUy4KCi0gbWltZXR5cGVzLnB5IGhhcyBvcHRpb25hbCBzdXBwb3J0IGZvciBub24tc3RhbmRhcmQsIGJ1dCBjb21tb25seQogIGZvdW5kIHR5cGVzLiAgZ3Vlc3NfdHlwZSgpIGFuZCBndWVzc19leHRlbnNpb24oKSBub3cgYWNjZXB0IGFuCiAgb3B0aW9uYWwgJ3N0cmljdCcgZmxhZywgZGVmYXVsdGluZyB0byB0cnVlLCB3aGljaCBjb250cm9scyB3aGV0aGVyCiAgcmVjb2duaXplIG5vbi1zdGFuZGFyZCB0eXBlcyBvciBub3QuICBBIGZldyBub24tc3RhbmRhcmQgdHlwZXMgd2UKICBrbm93IGFib3V0IGhhdmUgYmVlbiBhZGRlZC4gIEFsc28sIHdoZW4gcnVuIGFzIGEgc2NyaXB0LCB0aGVyZSBhcmUKICBuZXcgLWwgYW5kIC1lIG9wdGlvbnMuCgotIHN0YXRjYWNoZSBpcyBub3cgZGVwcmVjYXRlZC4KCi0gZW1haWwuVXRpbHMuZm9ybWF0ZGF0ZSgpIG5vdyBwcm9kdWNlcyB0aGUgcHJlZmVycmVkIFJGQyAyODIyIHN0eWxlCiAgZGF0ZXMgd2l0aCBudW1lcmljIHRpbWV6b25lcyAoaXQgdXNlZCB0byBwcm9kdWNlIG9ic29sZXRlIGRhdGVzCiAgaGFyZCBjb2RlZCB0byAiR01UIiB0aW1lem9uZSkuICBBbiBvcHRpb25hbCAnbG9jYWx0aW1lJyBmbGFnIGlzCiAgYWRkZWQgdG8gcHJvZHVjZSBkYXRlcyBpbiB0aGUgbG9jYWwgdGltZXpvbmUsIHdpdGggZGF5bGlnaHQgc2F2aW5ncwogIHRpbWUgcHJvcGVybHkgdGFrZW4gaW50byBhY2NvdW50LgoKLSBJbiBwaWNrbGUgYW5kIGNQaWNrbGUsIGluc3RlYWQgb2YgbWFza2luZyBlcnJvcnMgaW4gbG9hZCgpIGJ5CiAgdHJhbnNmb3JtaW5nIHRoZW0gaW50byBTeXN0ZW1FcnJvciwgd2UgbGV0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24KICBwcm9wYWdhdGUgb3V0LiAgQWxzbywgaW1wbGVtZW50IHN1cHBvcnQgZm9yIF9fc2FmZV9mb3JfdW5waWNrbGluZ19fCiAgaW4gcGlja2xlLCBhcyBpdCBhbHJlYWR5IHdhcyBzdXBwb3J0ZWQgaW4gY1BpY2tsZS4KClRvb2xzL0RlbW9zCi0tLS0tLS0tLS0tCgpCdWlsZAotLS0tLQoKLSBUaGUgZGJtIG1vZHVsZSBpcyBidWlsdCB1c2luZyBsaWJkYjEgaWYgYXZhaWxhYmxlLiAgVGhlIGJzZGRiIG1vZHVsZQogIGlzIGJ1aWx0IHdpdGggbGliZGIzIGlmIGF2YWlsYWJsZS4KCi0gTWlzYy9NYWtlZmlsZS5wcmUuaW4gaGFzIGJlZW4gcmVtb3ZlZCBieSBCREZMIHByb25vdW5jZW1lbnQuCgpDIEFQSQotLS0tLQoKLSBOZXcgZnVuY3Rpb24gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKCkgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG5vbi0KICBOVUxMIHJlc3VsdCBmcm9tIFB5U2VxdWVuY2VfRmFzdCgpLCBtb3JlIHF1aWNrbHkgdGhhbiBjYWxsaW5nCiAgUHlTZXF1ZW5jZV9TaXplKCkuCgotIE5ldyBhcmd1bWVudCB1bnBhY2tpbmcgZnVuY3Rpb24gUHlBcmdfVW5wYWNrVHVwbGUoKSBhZGRlZC4KCi0gTmV3IGZ1bmN0aW9ucyBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKCkgYW5kCiAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoKSBoYXZlIGJlZW4gYWRkZWQgdG8gbWFrZSBpdCBtb3JlCiAgY29udmVuaWVudCBhbmQgZWZmaWNpZW50IHRvIGNhbGwgZnVuY3Rpb25zIGFuZCBtZXRob2RzIGZyb20gQy4KCi0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKCkgbm8gbG9uZ2VyIG1hc2tzIGVycm9ycywgc28gaXQncwogIHBvc3NpYmxlIHRoYXQgdGhpcyB3aWxsIHByb3BhZ2F0ZSBlcnJvcnMgaXQgZGlkbid0IGJlZm9yZS4KCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcigpLCB3aGljaCByZXR1cm5zIHRydWUgaWYgaXRzCiAgYXJndW1lbnQgc3VwcG9ydHMgdGhlIHNpbmdsZS1zZWdtZW50IHJlYWRhYmxlIGJ1ZmZlciBpbnRlcmZhY2UuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gV2UndmUgZmluYWxseSBjb25maXJtZWQgdGhhdCB0aGlzIHJlbGVhc2UgYnVpbGRzIG9uIEhQLVVYIDExLjAwLAogICp3aXRoKiB0aHJlYWRzLCBhbmQgcGFzc2VzIHRoZSB0ZXN0IHN1aXRlLgoKLSBUaGFua3MgdG8gYSBzZXJpZXMgb2YgcGF0Y2hlcyBmcm9tIE1pY2hhZWwgTXVsbGVyLCBQeXRob24gbWF5IGJ1aWxkCiAgYWdhaW4gdW5kZXIgT1MvMiBWaXN1YWwgQWdlIEMrKy4KCi0gVXBkYXRlZCBSSVNDT1MgcG9ydCBieSBEaWV0bWFyIFNjaHdlcnRiZXJnZXIuCgpUZXN0cwotLS0tLQoKLSBBZGRlZCBhIHRlc3Qgc2NyaXB0IGZvciB0aGUgY3Vyc2VzIG1vZHVsZS4gIEl0IGlzbid0IHJ1biBhdXRvbWF0aWNhbGx5OwogIHJlZ3J0ZXN0LnB5IG11c3QgYmUgcnVuIHdpdGggJy11IGN1cnNlcycgdG8gZW5hYmxlIGl0LgoKV2luZG93cwotLS0tLS0tCgpNYWMKLS0tLQoKLSBQeXRob25TY3JpcHQgaGFzIGJlZW4gbW92ZWQgdG8gdW5zdXBwb3J0ZWQgYW5kIGlzIHNsYXRlZCB0byBiZQogIHJlbW92ZWQgY29tcGxldGVseSBpbiB0aGUgbmV4dCByZWxlYXNlLgoKLSBJdCBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGFwcGxldHMgdGhhdCB3b3JrIG9uIGJvdGggT1M5IGFuZAogIE9TWC4KCi0gVGhlIGNvcmUgaXMgbm93IGxpbmtlZCB3aXRoIENvcmVTZXJ2aWNlcyBub3QgQ2FyYm9uOyBhcyBhIHNpZGUKICByZXN1bHQsIGRlZmF1bHQgOGJpdCBlbmNvZGluZyBvbiBPU1ggaXMgbm93IEFTQ0lJLgoKLSBQeXRob24gc2hvdWxkIG5vdyBidWlsZCBvbiBPU1ggMTAuMS4xCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYjE/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMTktT2N0LTIwMDEqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBOZXctc3R5bGUgY2xhc3NlcyBhcmUgbm93IGFsd2F5cyBkeW5hbWljIChleGNlcHQgZm9yIGJ1aWx0LWluIGFuZAogIGV4dGVuc2lvbiB0eXBlcykuICBUaGVyZSBpcyBubyBsb25nZXIgYSBwZXJmb3JtYW5jZSBwZW5hbHR5LCBhbmQgSQogIG5vIGxvbmdlciBzZWUgYW5vdGhlciByZWFzb24gdG8ga2VlcCB0aGlzIGJhZ2dhZ2UgYXJvdW5kLiAgT25lIHJlbGljCiAgcmVtYWluczogdGhlIF9fZGljdF9fIG9mIGEgbmV3LXN0eWxlIGNsYXNzIGlzIGEgcmVhZC1vbmx5IHByb3h5OyB5b3UKICBtdXN0IHNldCB0aGUgY2xhc3MncyBhdHRyaWJ1dGUgdG8gbW9kaWZ5IGl0LiAgQXMgYSBjb25zZXF1ZW5jZSwgdGhlCiAgX19kZWZpbmVkX18gYXR0cmlidXRlIG9mIG5ldy1zdHlsZSB0eXBlcyBubyBsb25nZXIgZXhpc3RzLCBmb3IgbGFjawogIG9mIG5lZWQ6IHRoZXJlIGlzIG9uY2UgYWdhaW4gb25seSBvbmUgX19kaWN0X18gKGFsdGhvdWdoIGluIHRoZQogIGZ1dHVyZSBhIF9fY2FjaGVfXyBtYXkgYmUgcmVzdXJyZWN0ZWQgd2l0aCBhIHNpbWlsYXIgZnVuY3Rpb24sIGlmIEkKICBjYW4gcHJvdmUgdGhhdCBpdCBhY3R1YWxseSBzcGVlZHMgdGhpbmdzIHVwKS4KCi0gQy5fX2RvY19fIG5vdyB3b3JrcyBhcyBleHBlY3RlZCBmb3IgbmV3LXN0eWxlIGNsYXNzZXMgKGluIDIuMmE0IGl0CiAgYWx3YXlzIHJldHVybmVkIE5vbmUsIGV2ZW4gd2hlbiB0aGVyZSB3YXMgYSBjbGFzcyBkb2NzdHJpbmcpLgoKLSBkb2N0ZXN0IG5vdyBmaW5kcyBhbmQgcnVucyBkb2NzdHJpbmdzIGF0dGFjaGVkIHRvIG5ldy1zdHlsZSBjbGFzc2VzLAogIGNsYXNzIG1ldGhvZHMsIHN0YXRpYyBtZXRob2RzLCBhbmQgcHJvcGVydGllcy4KCkNvcmUgYW5kIGJ1aWx0aW5zCi0tLS0tLS0tLS0tLS0tLS0tCgotIEEgdmVyeSBzdWJ0bGUgc3ludGFjdGljYWwgcGl0ZmFsbCBpbiBsaXN0IGNvbXByZWhlbnNpb25zIHdhcyBmaXhlZC4KICBGb3IgZXhhbXBsZTogW2ErYiBmb3IgYSBpbiAnYWJjJywgZm9yIGIgaW4gJ2RlZiddLiAgVGhlIGNvbW1hIGluCiAgdGhpcyBleGFtcGxlIGlzIGEgbWlzdGFrZS4gIFByZXZpb3VzbHksIHRoaXMgd291bGQgc2lsZW50bHkgbGV0ICdhJwogIGl0ZXJhdGUgb3ZlciB0aGUgc2luZ2xldG9uIHR1cGxlICgnYWJjJywpLCB5aWVsZGluZyBbJ2FiY2QnLCAnYWJjZScsCiAgJ2FiY2YnXSByYXRoZXIgdGhhbiB0aGUgaW50ZW5kZWQgWydhZCcsICdhZScsICdhZicsICdiZCcsICdiZScsCiAgJ2JmJywgJ2NkJywgJ2NlJywgJ2NmJ10uICBOb3csIHRoaXMgaXMgZmxhZ2dlZCBhcyBhIHN5bnRheCBlcnJvci4KICBOb3RlIHRoYXQgW2EgZm9yIGEgaW4gPHNpbmdsZXRvbj5dIGlzIGEgY29udm9sdXRlZCB3YXkgdG8gc2F5CiAgWzxzaW5nbGV0b24+XSBhbnl3YXksIHNvIGl0J3Mgbm90IGxpa2UgYW55IGV4cHJlc3NpdmVuZXNzIGlzIGxvc3QuCgotIGdldGF0dHIob2JqLCBuYW1lLCBkZWZhdWx0KSBub3cgb25seSBjYXRjaGVzIEF0dHJpYnV0ZUVycm9yLCBhcwogIGRvY3VtZW50ZWQsIHJhdGhlciB0aGFuIHJldHVybmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsCiAgZXhjZXB0aW9ucyAod2hpY2ggY291bGQgbWFzayBidWdzIGluIGEgX19nZXRhdHRyX18gaG9vaywgZm9yCiAgZXhhbXBsZSkuCgotIFdlYWsgcmVmZXJlbmNlIG9iamVjdHMgYXJlIG5vdyBwYXJ0IG9mIHRoZSBjb3JlIGFuZCBvZmZlciBhIEMgQVBJLgogIEEgYnVnIHdoaWNoIGNvdWxkIGFsbG93IGEgY29yZSBkdW1wIHdoZW4gYmluYXJ5IG9wZXJhdGlvbnMgaW52b2x2ZWQKICBwcm94eSByZWZlcmVuY2UgaGFzIGJlZW4gZml4ZWQuICB3ZWFrcmVmLlJlZmVyZW5jZUVycm9yIGlzIG5vdyBhCiAgYnVpbHQtaW4gZXhjZXB0aW9uLgoKLSB1bmljb2RlKG9iaikgbm93IGJlaGF2ZXMgbW9yZSBsaWtlIHN0cihvYmopLCBhY2NlcHRpbmcgYXJiaXRyYXJ5CiAgb2JqZWN0cywgYW5kIGNhbGxpbmcgYSBfX3VuaWNvZGVfXyBtZXRob2QgaWYgaXQgZXhpc3RzLgogIHVuaWNvZGUob2JqLCBlbmNvZGluZykgYW5kIHVuaWNvZGUob2JqLCBlbmNvZGluZywgZXJyb3JzKSBzdGlsbAogIHJlcXVpcmUgYW4gOC1iaXQgc3RyaW5nIG9yIGNoYXJhY3RlciBidWZmZXIgYXJndW1lbnQuCgotIGlzaW5zdGFuY2UoKSBub3cgYWxsb3dzIGFueSBvYmplY3QgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCBhCiAgY2xhc3MsIGEgdHlwZSBvciBzb21ldGhpbmcgd2l0aCBhIF9fYmFzZXNfXyB0dXBsZSBhdHRyaWJ1dGUgZm9yIHRoZQogIHNlY29uZCBhcmd1bWVudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGFsc28gYmUgYSB0dXBsZSBvZiBhCiAgY2xhc3MsIHR5cGUsIG9yIHNvbWV0aGluZyB3aXRoIF9fYmFzZXNfXywgaW4gd2hpY2ggY2FzZSBpc2luc3RhbmNlKCkKICB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBpbnN0YW5jZSBvZiBhbnkgb2YgdGhlCiAgdGhpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHR1cGxlLiAgRS5nLgoKICBpc2luc3RhbmNlKHgsIChBLCBCKSkKCiAgcmV0dXJucyB0cnVlIGlmIHggaXMgYW4gaW5zdGFuY2Ugb2YgQSBvciBCLgoKRXh0ZW5zaW9uIG1vZHVsZXMKLS0tLS0tLS0tLS0tLS0tLS0KCi0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyB0aGUgdGhyZWFkIElEIChwcmV2aW91c2x5IE5vbmUpLgoKLSBiaW5hc2NpaSBoYXMgbm93IHR3byBxdW9wcmkgc3VwcG9ydCBmdW5jdGlvbnMsIGEyYl9xcCBhbmQgYjJhX3FwLgoKLSByZWFkbGluZSBub3cgc3VwcG9ydHMgc2V0dGluZyB0aGUgc3RhcnR1cF9ob29rIGFuZCB0aGUKICBwcmVfZXZlbnRfaG9vaywgYW5kIGFkZHMgdGhlIGFkZF9oaXN0b3J5KCkgZnVuY3Rpb24uCgotIG9zIGFuZCBwb3NpeCBzdXBwb3J0cyBjaHJvb3QoKSwgc2V0Z3JvdXBzKCkgYW5kIHVuc2V0ZW52KCkgd2hlcmUKICBhdmFpbGFibGUuICBUaGUgc3RhdCgpLCBmc3RhdCgpLCBzdGF0dmZzKCkgYW5kIGZzdGF0dmZzKCkgZnVuY3Rpb25zCiAgbm93IHJldHVybiAicHNldWRvLXNlcXVlbmNlcyIgLS0gdGhlIHZhcmlvdXMgZmllbGRzIGNhbiBub3cgYmUKICBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIChlLmcuIG9zLnN0YXQoIi8iKS5zdF9tdGltZSkgYnV0IGZvcgogIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHRoZXkgYWxzbyBiZWhhdmUgYXMgYSBmaXhlZC1sZW5ndGggc2VxdWVuY2UuCiAgU29tZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWVsZHMgKGUuZy4gc3RfcmRldikgYXJlIG9ubHkgYWNjZXNzaWJsZSBhcwogIGF0dHJpYnV0ZXMuCgotIHRpbWU6IGxvY2FsdGltZSgpLCBnbXRpbWUoKSBhbmQgc3RycHRpbWUoKSBub3cgcmV0dXJuIGEKICBwc2V1ZG8tc2VxdWVuY2Ugc2ltaWxhciB0byB0aGUgb3Muc3RhdCgpIHJldHVybiB2YWx1ZSwgd2l0aAogIGF0dHJpYnV0ZXMgbGlrZSB0bV95ZWFyIGV0Yy4KCi0gRGVjb21wcmVzc2lvbiBvYmplY3RzIGluIHRoZSB6bGliIG1vZHVsZSBub3cgYWNjZXB0IGFuIG9wdGlvbmFsCiAgc2Vjb25kIHBhcmFtZXRlciB0byBkZWNvbXByZXNzKCkgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gYW1vdW50CiAgb2YgbWVtb3J5IHRvIHVzZSBmb3IgdGhlIHVuY29tcHJlc3NlZCBkYXRhLgoKLSBvcHRpb25hbCBTU0wgc3VwcG9ydCBpbiB0aGUgc29ja2V0IG1vZHVsZSBub3cgZXhwb3J0cyBPcGVuU1NMCiAgZnVuY3Rpb25zIFJBTkRfYWRkKCksIFJBTkRfZWdkKCksIGFuZCBSQU5EX3N0YXR1cygpLiAgVGhlc2UgY2FsbHMKICBhcmUgdXNlZnVsIG9uIHBsYXRmb3JtcyBsaWtlIFNvbGFyaXMgd2hlcmUgT3BlblNTTCBkb2VzIG5vdAogIGF1dG9tYXRpY2FsbHkgc2VlZCBpdHMgUFJORy4gIEFsc28sIHRoZSBrZXlmaWxlIGFuZCBjZXJ0ZmlsZQogIGFyZ3VtZW50cyB0byBzb2NrZXQuc3NsKCkgYXJlIG5vdyBvcHRpb25hbC4KCi0gcG9zaXhtb2R1bGUgKGFuZCBieSBleHRlbnNpb24sIHRoZSBvcyBtb2R1bGUgb24gUE9TSVggcGxhdGZvcm1zKSBub3cKICBleHBvcnRzIE9fTEFSR0VGSUxFLCBPX0RJUkVDVCwgT19ESVJFQ1RPUlksIGFuZCBPX05PRk9MTE9XLgoKTGlicmFyeQotLS0tLS0tCgotIGRvY3Rlc3Qgbm93IGV4Y2x1ZGVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBub3QgZGVmaW5lZCBieSB0aGUgbW9kdWxlCiAgYmVpbmcgdGVzdGVkLCB0aGFua3MgdG8gVGltIEhvY2hiZXJnLgoKLSBIb3RTaG90LCBhIG5ldyBwcm9maWxlciBpbXBsZW1lbnRlZCB1c2luZyBhIEMtYmFzZWQgY2FsbGJhY2ssIGhhcwogIGJlZW4gYWRkZWQuICBUaGlzIHN1YnN0YW50aWFsbHkgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgb2YgcHJvZmlsaW5nLAogIGJ1dCBpdCBpcyBzdGlsbCBxdWl0ZSBwcmVsaW1pbmFyeS4gIFN1cHBvcnQgbW9kdWxlcyBhbmQKICBkb2N1bWVudGF0aW9uIHdpbGwgYmUgYWRkZWQgaW4gdXBjb21pbmcgcmVsZWFzZXMgKGJlZm9yZSAyLjIgZmluYWwpLgoKLSBwcm9maWxlIG5vdyBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dCBpbiBzaXR1YXRpb25zIHdoZXJlIGFuIGV4Y2VwdGlvbgogIHJhaXNlZCBpbiBQeXRob24gaXMgY2xlYXJlZCBieSBDIGNvZGUgKGUuZy4gaGFzYXR0cigpKS4gIFRoaXMgdXNlZAogIHRvIGNhdXNlIHdyb25nIG91dHB1dCwgaW5jbHVkaW5nIHNwdXJpb3VzIGNsYWltcyBvZiByZWN1cnNpdmUKICBmdW5jdGlvbnMgYW5kIGF0dHJpYnV0aW9uIG9mIHRpbWUgc3BlbnQgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLgoKICBUaGUgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRlcml2ZWQgT2xkUHJvZmlsZSBhbmQgSG90UHJvZmlsZQogIHByb2ZpbGluZyBjbGFzc2VzIHdhcyByZW1vdmVkLiAgVGhlIGNvZGUgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMgKGlmCiAgeW91IHRyaWVkIHRvIHVzZSB0aGVtLCB0aGV5IHJhaXNlZCBleGNlcHRpb25zKS4gIE9sZFByb2ZpbGUKICBpbnRlbmRlZCB0byByZXByb2R1Y2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9maWxlciBQeXRob24gdXNlZCBtb3JlCiAgdGhhbiA3IHllYXJzIGFnbywgYW5kIGlzbid0IGludGVyZXN0aW5nIGFueW1vcmUuICBIb3RQcm9maWxlIGludGVuZGVkCiAgdG8gcHJvdmlkZSBhIGZhc3RlciBwcm9maWxlciAoYnV0IHByb2R1Y2luZyBsZXNzIGluZm9ybWF0aW9uKSwgYW5kCiAgdGhhdCdzIGEgd29ydGh5IGdvYWwgd2UgaW50ZW5kIHRvIG1lZXQgdmlhIGEgZGlmZmVyZW50IGFwcHJvYWNoIChidXQKICB3aXRob3V0IGxvc2luZyBpbmZvcm1hdGlvbikuCgotIFByb2ZpbGUuY2FsaWJyYXRlKCkgaGFzIGEgbmV3IGltcGxlbWVudGF0aW9uIHRoYXQgc2hvdWxkIGRlbGl2ZXIKICBhIG11Y2ggYmV0dGVyIHN5c3RlbS1zcGVjaWZpYyBjYWxpYnJhdGlvbiBjb25zdGFudC4gIFRoZSBjb25zdGFudCBjYW4KICBub3cgYmUgc3BlY2lmaWVkIGluIGFuIGluc3RhbmNlIGNvbnN0cnVjdG9yLCBvciBhcyBhIFByb2ZpbGUgY2xhc3Mgb3IKICBpbnN0YW5jZSB2YXJpYWJsZSwgaW5zdGVhZCBvZiBieSBlZGl0aW5nIHByb2ZpbGUucHkncyBzb3VyY2UgY29kZS4KICBDYWxpYnJhdGlvbiBtdXN0IHN0aWxsIGJlIGRvbmUgbWFudWFsbHkgKHNlZSB0aGUgZG9jcyBmb3IgdGhlIHByb2ZpbGUKICBtb2R1bGUpLgoKICBOb3RlIHRoYXQgUHJvZmlsZS5jYWxpYnJhdGUoKSBtdXN0IGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzLgogIEltcHJvdmluZyB0aGUgYWNjdXJhY3kgcmVxdWlyZWQgZXhwbG9pdGluZyBkZXRhaWxlZCBrbm93bGVkZ2Ugb2YKICBwcm9maWxlciBpbnRlcm5hbHM7IHRoZSBlYXJsaWVyIG1ldGhvZCBhYnN0cmFjdGVkIGF3YXkgdGhlIGRldGFpbHMKICBhbmQgbWVhc3VyZWQgYSBzaW1wbGlmaWVkIG1vZGVsIGluc3RlYWQsIGJ1dCBjb25zZXF1ZW50bHkgY29tcHV0ZWQKICBhIGNvbnN0YW50IHRvbyBzbWFsbCBieSBhIGZhY3RvciBvZiAyIG9uIHNvbWUgbW9kZXJuIG1hY2hpbmVzLgoKLSBxdW9wcmkncyBlbmNvZGUgYW5kIGRlY29kZSBtZXRob2RzIHRha2UgYW4gb3B0aW9uYWwgaGVhZGVyIHBhcmFtZXRlciwKICB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBvdXRwdXQgaXMgaW50ZW5kZWQgZm9yIHRoZSBoZWFkZXIgJ1EnCiAgZW5jb2RpbmcuCgotIFRoZSBTb2NrZXRTZXJ2ZXIuVGhyZWFkaW5nTWl4SW4gY2xhc3Mgbm93IGNsb3NlcyB0aGUgcmVxdWVzdCBhZnRlcgogIGZpbmlzaF9yZXF1ZXN0KCkgcmV0dXJucy4gIChOb3Qgd2hlbiBpdCBlcnJvcnMgb3V0IHRob3VnaC4pCgotIFRoZSBubnRwbGliIG1vZHVsZSdzIE5OVFAuYm9keSgpIG1ldGhvZCBoYXMgZ3Jvd24gYSAnZmlsZScgYXJndW1lbnQKICB0byBhbGxvdyBzYXZpbmcgdGhlIG1lc3NhZ2UgYm9keSB0byBhIGZpbGUuCgotIFRoZSBlbWFpbCBwYWNrYWdlIGhhcyBhZGRlZCBhIGNsYXNzIGVtYWlsLlBhcnNlci5IZWFkZXJQYXJzZXIgd2hpY2gKICBvbmx5IHBhcnNlcyBoZWFkZXJzIGFuZCBkb2VzIG5vdCByZWN1cnNlIGludG8gdGhlIG1lc3NhZ2UncyBib2R5LgogIEFsc28sIHRoZSBtb2R1bGUvY2xhc3MgTUlNRUF1ZGlvIGhhcyBiZWVuIGFkZGVkIGZvciByZXByZXNlbnRpbmcKICBhdWRpbyBkYXRhIChjb250cmlidXRlZCBieSBBbnRob255IEJheHRlcikuCgotIGZ0cGxpYiBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgZmlsZXMgPiAyR0IuCgotIENvbmZpZ1BhcnNlci5nZXRib29sZWFuKCkgbm93IGFsc28gaW50ZXJwcmV0cyBUUlVFLCBGQUxTRSwgWUVTLCBOTywKICBPTiwgYW5kIE9GRi4KCi0geG1sLmRvbS5taW5pZG9tIE5vZGVMaXN0IG9iamVjdHMgbm93IHN1cHBvcnQgdGhlIGxlbmd0aCBhdHRyaWJ1dGUKICBhbmQgaXRlbSgpIG1ldGhvZCBhcyByZXF1aXJlZCBieSB0aGUgRE9NIHNwZWNpZmljYXRpb25zLgoKVG9vbHMvRGVtb3MKLS0tLS0tLS0tLS0KCi0gRGVtby9kbnMgd2FzIHJlbW92ZWQuICBJdCBubyBsb25nZXIgc2VydmVzIGFueSBwdXJwb3NlOyBhIHBhY2thZ2UKICBkZXJpdmVkIGZyb20gaXQgaXMgbm93IG1haW50YWluZWQgYnkgQW50aG9ueSBCYXh0ZXIsIHNlZQogIGh0dHA6Ly9QeUROUy5Tb3VyY2VGb3JnZS5uZXQuCgotIFRoZSBmcmVlemUgdG9vbCBoYXMgYmVlbiBtYWRlIG1vcmUgcm9idXN0LCBhbmQgdHdvIG5ldyBvcHRpb25zIGhhdmUKICBiZWVuIGFkZGVkOiAtWCBhbmQgLUUuCgpCdWlsZAotLS0tLQoKLSBjb25maWd1cmUgd2lsbCB1c2UgQ1hYIGluIExJTktDQyBpZiBDWFggaXMgdXNlZCB0byBidWlsZCBtYWluKCkgYW5kCiAgdGhlIHN5c3RlbSByZXF1aXJlcyB0byBsaW5rIGEgQysrIG1haW4gdXNpbmcgdGhlIEMrKyBjb21waWxlci4KCkMgQVBJCi0tLS0tCgotIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgdHBfY29tcGFyZSBzbG90IGlzIHVwZGF0ZWQgdG8gcmVxdWlyZSB0aGF0CiAgdGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIC0xLCAwLCAxOyBhbiBhcmJpdHJhcnkgbnVtYmVyIDwwIG9yID4wIGlzCiAgbm90IGNvcnJlY3QuICBUaGlzIGlzIG5vdCB5ZXQgZW5mb3JjZWQgYnV0IHdpbGwgYmUgZW5mb3JjZWQgaW4KICBQeXRob24gMi4zOyBldmVuIGxhdGVyLCB3ZSBtYXkgdXNlIC0yIHRvIGluZGljYXRlIGVycm9ycyBhbmQgKzIgZm9yCiAgIk5vdEltcGxlbWVudGVkIi4gIFJpZ2h0IG5vdywgLTEgc2hvdWxkIGJlIHVzZWQgZm9yIGFuIGVycm9yIHJldHVybi4KCi0gUHlMb25nX0FzTG9uZ0xvbmcoKSBub3cgYWNjZXB0cyBpbnQgKGFzIHdlbGwgYXMgbG9uZykgYXJndW1lbnRzLgogIENvbnNlcXVlbnRseSwgUHlBcmdfUGFyc2VUdXBsZSdzICdMJyBjb2RlIGFsc28gYWNjZXB0cyBpbnQgKGFzIHdlbGwKICBhcyBsb25nKSBhcmd1bWVudHMuCgotIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoKSBub3cgcmV0dXJucyBhIGxvbmcgaW50IGdpdmluZyB0aGUgdGhyZWFkCiAgSUQsIGlmIG9uZSBjYW4gYmUgY2FsY3VsYXRlZDsgaXQgcmV0dXJucyAtMSBmb3IgZXJyb3IsIDAgaWYgbm8KICB0aHJlYWQgSUQgaXMgY2FsY3VsYXRlZCAodGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgb25seQogIHRoZSB0aHJlYWQgbW9kdWxlIHVzZWQgdGhpcyBBUEkpLiAgVGhpcyBjb2RlIGhhcyBvbmx5IHJlYWxseSBiZWVuCiAgdGVzdGVkIG9uIExpbnV4IGFuZCBXaW5kb3dzOyBvdGhlciBwbGF0Zm9ybXMgcGxlYXNlIGJld2FyZSAoYW5kCiAgcmVwb3J0IGFueSBidWdzIG9yIHN0cmFuZ2UgYmVoYXZpb3IpLgoKLSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKSBubyBsb25nZXIgYWNjZXB0cyBVbmljb2RlIG9iamVjdHMgYXMKICBpbnB1dC4KCk5ldyBwbGF0Zm9ybXMKLS0tLS0tLS0tLS0tLQoKVGVzdHMKLS0tLS0KCldpbmRvd3MKLS0tLS0tLQoKLSBJbnN0YWxsZXI6ICBJZiB5b3UgaW5zdGFsbCBJRExFLCBhbmQgZG9uJ3QgZGlzYWJsZSBmaWxlLWV4dGVuc2lvbgogIHJlZ2lzdHJhdGlvbiwgYSBuZXcgIkVkaXQgd2l0aCBJRExFIiBjb250ZXh0IChyaWdodC1jbGljaykgbWVudSBlbnRyeQogIGlzIGNyZWF0ZWQgZm9yIC5weSBhbmQgLnB5dyBmaWxlcy4KCi0gVGhlIHNpZ25hbCBtb2R1bGUgbm93IHN1cHBvcnRzIFNJR0JSRUFLIG9uIFdpbmRvd3MsIHRoYW5rcyB0byBTdGV2ZW4KICBTY290dC4gIE5vdGUgdGhhdCBTSUdCUkVBSyBpcyB1bmlxdWUgdG8gV2luZG93cy4gIFRoZSBkZWZhdWx0IFNJR0JSRUFLCiAgYWN0aW9uIHJlbWFpbnMgdG8gY2FsbCBXaW4zMiBFeGl0UHJvY2VzcygpLiAgVGhpcyBjYW4gYmUgY2hhbmdlZCB2aWEKICBzaWduYWwuc2lnbmFsKCkuICBGb3IgZXhhbXBsZTo6CgogICAgICAjIE1ha2UgQ3RybCtCcmVhayByYWlzZSBLZXlib2FyZEludGVycnVwdCwgbGlrZSBQeXRob24ncyBkZWZhdWx0IEN0cmwrQwogICAgICAjIChTSUdJTlQpIGJlaGF2aW9yLgogICAgICBpbXBvcnQgc2lnbmFsCiAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0JSRUFLLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKCiAgICAgIHRyeToKICAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICAgcGFzcwogICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CiAgICAgICAgICAjIFdlIGdldCBoZXJlIG9uIEN0cmwrQyBvciBDdHJsK0JyZWFrIG5vdzsgaWYgd2UgaGFkIG5vdCBjaGFuZ2VkCiAgICAgICAgICAjIFNJR0JSRUFLLCBvbmx5IG9uIEN0cmwrQyAoYW5kIEN0cmwrQnJlYWsgd291bGQgdGVybWluYXRlIHRoZQogICAgICAgICAgIyBwcm9ncmFtIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IGZvciBhbnkgUHl0aG9uLWxldmVsIGNsZWFudXApLgogICAgICAgICAgcHJpbnQgIkNsZWFuIGV4aXQiCgoKV2hhdCdzIE5ldyBpbiBQeXRob24gMi4yYTQ/Cj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKlJlbGVhc2UgZGF0ZTogMjgtU2VwLTIwMDEqCgpUeXBlL2NsYXNzIHVuaWZpY2F0aW9uIGFuZCBuZXctc3R5bGUgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLSBweWRvYyBhbmQgaW5zcGVjdCBhcmUgbm93IGF3YXJlIG9mIG5ldy1zdHlsZSBjbGFzc2VzOwogIGUuZy4gaGVscChsaXN0KSBhdCB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0IG5vdyBzaG93cyBwcm9wZXIKICBkb2N1bWVudGF0aW9uIGZvciBhbGwgb3BlcmF0aW9ucyBvbiBsaXN0IG9iamVjdHMuCgotIEFwcGxpY2F0aW9ucyB1c2luZyBKaW0gRnVsdG9uJ3MgRXh0ZW5zaW9uQ2xhc3MgbW9kdWxlIGNhbiBub3cgc2FmZWx5CiAgYmUgdXNlZCB3aXRoIFB5dGhvbiAyLjIuICBJbiBwYXJ0aWN1bGFyLCBab3BlIDIuNC4xIG5vdyB3b3JrcyB3aXRoCiAgUHl0aG9uIDIuMiAoYXMgd2VsbCBhcyB3aXRoIFB5dGhvbiAyLjEuMSkuICBUaGUgRGVtby9tZXRhY2xhc3MKICBleGFtcGxlcyBhbHNvIHdvcmsgYWdhaW4uICBJdCBpcyBob3BlZCB0aGF0IEd0ayBhbmQgQm9vc3QgYWxzbyB3b3JrCiAgd2l0aCAyLjJhNCBhbmQgYmV5b25kLiAgKElmIHlvdSBjYW4gY29uZmlybSB0aGlzLCBwbGVhc2Ugd3JpdGUKICB3ZWJtYXN0ZXJAcHl0aG9uLm9yZzsgaWYgdGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zLCBwbGVhc2Ugb3BlbiBhIGJ1ZwogIHJlcG9ydCBvbiBTb3VyY2VGb3JnZS4pCgotIHByb3BlcnR5KCkgbm93IHRha2VzIDQga2V5d29yZCBhcmd1bWVudHM6ICBmZ2V0LCBmc2V0LCBmZGVsIGFuZCBkb2MuCiAgVGhlc2UgbWFwIHRvIHJlYWQtb25seSBhdHRyaWJ1dGVzICdmZ2V0JywgJ2ZzZXQnLCAnZmRlbCcsIGFuZCAnX19kb2NfXycKICBpbiB0aGUgY29uc3RydWN0ZWQgcHJvcGVydHkgb2JqZWN0LiAgZmdldCwgZnNldCBhbmQgZmRlbCB3ZXJlbid0CiAgZGlzY292ZXJhYmxlIGZyb20gUHl0aG9uIGluIDIuMmEzLiAgX19kb2NfXyBpcyBuZXcsIGFuZCBhbGxvd3MgdG8KICBhc3NvY2lhdGUgYSBkb2NzdHJpbmcgd2l0aCBhIHByb3BlcnR5LgoKLSBDb21wYXJpc29uIG92ZXJsb2FkaW5nIGlzIG5vdyBtb3JlIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQuICBGb3IKICBleGFtcGxlLCBhIHN0ciBzdWJjbGFzcyBpbnN0YW5jZSBjYW4gcHJvcGVybHkgYmUgY29tcGFyZWQgdG8gYSBzdHIKICBpbnN0YW5jZSwgYW5kIGl0IGNhbiBwcm9wZXJseSBvdmVybG9hZCBjb21wYXJpc29uLiAgRGl0dG8gZm9yIG1vc3QKICBvdGhlciBidWlsdC1pbiBvYmplY3QgdHlwZXMuCgotIFRoZSByZXByKCkgb2YgbmV3LXN0eWxlIGNsYXNzZXMgaGFzIGNoYW5nZWQ7IGluc3RlYWQgb2YgPHR5cGUKICAnTS5Gb28nPiBhIG5ldy1zdHlsZSBjbGFzcyBpcyBub3cgcmVuZGVyZWQgYXMgPGNsYXNzICdNLkZvbyc+LAogICpleGNlcHQqIGZvciBidWlsdC1pbiB0eXBlcywgd2hpY2ggYXJlIHN0aWxsIHJlbmRlcmVkIGFzIDx0eXBlCiAgJ0Zvbyc+ICh0byBhdm9pZCB1cHNldHRpbmcgZXhpc3RpbmcgY29kZSB0aGF0IG1pZ2h0IHBhcnNlIG9yCiAgb3RoZXJ3aXNlIHJlbHkgb24gcmVwcigpIG9mIGNlcnRhaW4gdHlwZSBvYmplY3RzKS4KCi0gVGhlIHJlcHIoKSBvZiBuZXctc3R5bGUgb2JqZWN0cyBpcyBub3cgYWx3YXlzIDxGb28gb2JqZWN0IGF0IFhYWD47CiAgcHJldmlvdXNseSwgaXQgd2FzIHNvbWV0aW1lcyA8Rm9vIGluc3RhbmNlIGF0IFhYWD4uCgotIEZvciBuZXctc3R5bGUgY2xhc3Nlcywgd2hhdCB3YXMgcHJldmlvdXNseSBjYWxsZWQgX19nZXRhdHRyX18gaXMgbm93CiAgY2FsbGVkIF9fZ2V0YXR0cmlidXRlX18uICBUaGlzIG1ldGhvZCwgaWYgZGVmaW5lZCwgaXMgY2FsbGVkIGZvcgogICpldmVyeSogYXR0cmlidXRlIGFjY2Vzcy4gIEEgbmV3IF9fZ2V0YXR0cl9fIGhvb2sgbW9yZSBzaW1pbGFyIHRvIHRoZQogIG9uZSBpbiBjbGFzc2ljIGNsYXNzZXMgaXMgZGVmaW5lZCB3aGljaCBpcyBjYWxsZWQgb25seSBpZiByZWd1bGFyCiAgYXR0cmlidXRlIGFjY2VzcyByYWlzZXMgQXR0cmlidXRlRXJyb3I7IHRvIGNhdGNoICphbGwqIGF0dHJpYnV0ZQogIGFjY2VzcywgeW91IGNhbiB1c2UgX19nZXRhdHRyaWJ1dGVfXyAoZm9yIG5ldy1zdHlsZSBjbGFzc2VzKS4gIElmCiAgYm90aCBhcmUgZGVmaW5lZCwgX19nZXRhdHRyaWJ1dGVfXyBpcyBjYWxsZWQgZmlyc3QsIGFuZCBpZiBpdCByYWlzZXMKICBBdHRyaWJ1dGVFcnJvciwgX19nZXRhdHRyX18gaXMgY2FsbGVkLgoKLSBUaGUgX19jbGFzc19fIGF0dHJpYnV0ZSBvZiBuZXctc3R5bGUgb2JqZWN0cyBjYW4gYmUgYXNzaWduZWQgdG8uCiAgVGhlIG5ldyBjbGFzcyBtdXN0IGhhdmUgdGhlIHNhbWUgQy1sZXZlbCBvYmplY3QgbGF5b3V0IGFzIHRoZSBvbGQKICBjbGFzcy4KCi0gVGhlIGJ1aWx0aW4gZmlsZSB0eXBlIGNhbiBiZSBzdWJjbGFzc2VkIG5vdy4gIEluIHRoZSB1c3VhbCBwYXR0ZXJuLAogICJmaWxlIiBpcyB0aGUgbmFtZSBvZiB0aGUgYnVpbHRpbiB0eXBlLCBhbmQgZmlsZSgpIGlzIGEgbmV3IGJ1aWx0aW4KICBjb25zdHJ1Y3Rvciwgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIGJ1aWx0aW4gb3BlbigpIGZ1bmN0aW9uLgogIGZpbGUoKSBpcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgdG8gb3BlbiBhIGZpbGUuCgotIFByZXZpb3VzbHksIF9fbmV3X18gd291bGQgb25seSBzZWUgc2VxdWVudGlhbCBhcmd1bWVudHMgcGFzc2VkIHRvCiAgdGhlIHR5cGUgaW4gYSBjb25zdHJ1Y3RvciBjYWxsOyBfX2luaXRfXyB3b3VsZCBzZWUgYm90aCBzZXF1ZW50aWFsCiAgYW5kIGtleXdvcmQgYXJndW1lbnRzLiAgVGhpcyBtYWRlIG5vIHNlbnNlIHdoYXRzb2V2ZXIgYW55IG1vcmUsIHNvCiAgbm93IGJvdGggX19uZXdfXyBhbmQgX19pbml0X18gc2VlIGFsbCBhcmd1bWVudHMuCgotIFByZXZpb3VzbHksIGhhc2goKSBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2Ygc3RyIG9yCiAgdW5pY29kZSBhbHdheXMgcmV0dXJuZWQgMC4gIFRoaXMgaGFzIGJlZW4gcmVwYWlyZWQuCgotIFByZXZpb3VzbHksIGFuIG9wZXJhdGlvbiBvbiBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mIGFuCiAgaW1tdXRhYmxlIHR5cGUgKGludCwgbG9uZywgZmxvYXQsIGNvbXBsZXgsIHR1cGxlLCBzdHIsIHVuaWNvZGUpLAogIHdoZXJlIHRoZSBzdWJ0eXBlIGRpZG4ndCBvdmVycmlkZSB0aGUgb3BlcmF0aW9uIChhbmQgc28gdGhlCiAgb3BlcmF0aW9uIHdhcyBoYW5kbGVkIGJ5IHRoZSBidWlsdGluIHR5cGUpLCBjb3VsZCByZXR1cm4gdGhhdAogIGluc3RhbmNlIGluc3RlYWQgYSB2YWx1ZSBvZiB0aGUgYmFzZSB0eXBlLiAgRm9yIGV4YW1wbGUsIGlmIHMgd2FzIG9mCiAgYSBzdHIgc3ViY2xhc3MgdHlwZSwgc1s6XSByZXR1cm5lZCBzIGFzLWlzLiAgTm93IGl0IHJldHVybnMgYSBzdHIKICB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHMuCgotIFByb3Zpc2lvbmFsIHN1cHBvcnQgZm9yIHBpY2tsaW5nIG5ldy1zdHlsZSBvYmplY3RzIGhhcyBiZWVuIGFkZGVkLgoKQ29yZQotLS0tCgotIGZpbGUud3JpdGVsaW5lcygpIG5vdyBhY2NlcHRzIGFueSBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIHN0cmluZ3MuCgotIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIG5vdyB3b3JrcyB2ZXJ5IG11Y2ggbGlrZQogIFB5T2JqZWN0X1N0cihvYmopIGluIHRoYXQgaXQgdHJpZXMgdG8gdXNlIF9fc3RyX18vdHBfc3RyCiAgb24gdGhlIG9iamVjdCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBhIHN0cmluZyBvciBidWZmZXIuIFRoaXMKICBtYWtlcyB1bmljb2RlKCkgYmVoYXZlIGxpa2Ugc3RyKCkgd2hlbiBhcHBsaWVkIHRvIG5vbi1zdHJpbmcvYnVmZmVyCiAgb2JqZWN0cy4KCi0gUHlGaWxlX1dyaXRlT2JqZWN0IG5vdyBwYXNzZXMgVW5pY29kZSBvYmplY3RzIHRvIHRoZSBmaWxlJ3Mgd3JpdGUKICBtZXRob2QuIEFzIGEgcmVzdWx0LCBhbGwgZmlsZS1saWtlIG9iamVjdHMgd2hpY2ggbWF5IGJlIHRoZSB0YXJnZXQKICBvZiBhIHByaW50IHN0YXRlbWVudCBtdXN0IHN1cHBvcnQgVW5pY29kZSBvYmplY3RzLCBpLmUuIHRoZXkgbXVzdAogIGF0IGxlYXN0IGNvbnZlcnQgdGhlbSBpbnRvIEFTQ0lJIHN0cmluZ3MuCgotIFRocmVhZCBzY2hlZHVsaW5nIG9uIFNvbGFyaXMgc2hvdWxkIGJlIGltcHJvdmVkOyBpdCBpcyBubyBsb25nZXIKICBuZWNlc3NhcnkgdG8gaW5zZXJ0IGEgc21hbGwgc2xlZXAgYXQgdGhlIHN0YXJ0IG9mIGEgdGhyZWFkIGluIG9yZGVyCiAgdG8gbGV0IG90aGVyIHJ1bm5hYmxlIHRocmVhZHMgYmUgc2NoZWR1bGVkLgoKTGlicmFyeQotLS0tLS0tCgotIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0CiAgcmVhZCBjaGFyYWN0ZXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBmb3IgdGhlaXIgLndyaXRlKCkgbWV0aG9kcy4KICBUaGVzZSBvYmplY3RzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgdGhlbiBoYW5kbGVkIGFzIHN1Y2gKICBieSB0aGUgaW5zdGFuY2VzLgoKLSBUaGUgImVtYWlsIiBwYWNrYWdlIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0IG9mIHRoZQogIG1pbWVsaWIgcGFja2FnZSA8aHR0cDovL3NmLm5ldC9wcm9qZWN0cy9taW1lbGliPiB3aXRoIEFQSSBjaGFuZ2VzCiAgYW5kIHNvbWUgaW1wbGVtZW50YXRpb25zIHVwZGF0ZWQgdG8gdXNlIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycy4KCi0gZGlmZmxpYi5uZGlmZigpIGFuZCBkaWZmbGliLkRpZmZlci5jb21wYXJlKCkgYXJlIGdlbmVyYXRvcnMgbm93LiAgVGhpcwogIHJlc3RvcmVzIHRoZSBhYmlsaXR5IG9mIFRvb2xzL3NjcmlwdHMvbmRpZmYucHkgdG8gc3RhcnQgcHJvZHVjaW5nIG91dHB1dAogIGJlZm9yZSB0aGUgZW50aXJlIGNvbXBhcmlzb24gaXMgY29tcGxldGUuCgotIFN0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBhbmQgY1N0cmluZ0lPLlN0cmluZ0lPIGluc3RhbmNlcyBzdXBwb3J0CiAgaXRlcmF0aW9uIGp1c3QgbGlrZSBmaWxlIG9iamVjdHMgKGkuZS4gdGhlaXIgLnJlYWRsaW5lKCkgbWV0aG9kIGlzCiAgY2FsbGVkIGZvciBlYWNoIGl0ZXJhdGlvbiB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZykuCgotIFRoZSBjb2RlY3MgbW9kdWxlIGhhcyBncm93biBmb3VyIG5ldyBoZWxwZXIgQVBJcyB0byBhY2Nlc3MKICBidWlsdGluIGNvZGVjczogZ2V0ZW5jb2RlcigpLCBnZXRkZWNvZGVyKCksIGdldHJlYWRlcigpLAogIGdldHdyaXRlcigpLgoKLSBTaW1wbGVYTUxSUENTZXJ2ZXI6IGEgbmV3IG1vZHVsZSAoYmFzZWQgdXBvbiBTaW1wbGVIVE1MU2VydmVyKQogIHNpbXBsaWZpZXMgd3JpdGluZyBYTUwgUlBDIHNlcnZlcnMuCgotIG9zLnBhdGgucmVhbHBhdGgoKTogYSBuZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRobmFtZQogIGFmdGVyIGludGVycHJldGF0aW9uIG9mIHN5bWJvbGljIGxpbmtzLiAgT24gbm9uLVVuaXggc3lzdGVtcywgdGhpcwogIGlzIGFuIGFsaWFzIGZvciBvcy5wYXRoLmFic3BhdGgoKS4KCi0gb3BlcmF0b3IuaW5kZXhPZigpIChQeVNlcXVlbmNlX0luZGV4KCkgaW4gdGhlIEMgQVBJKSBub3cgd29ya3Mgd2l0aCBhbnkKICBpdGVyYWJsZSBvYmplY3QuCgotIHNtdHBsaWIgbm93IHN1cHBvcnRzIHZhcmlvdXMgYXV0aGVudGljYXRpb24gYW5kIHNlY3VyaXR5IGZlYXR1cmVzIG9mCiAgdGhlIFNNVFAgcHJvdG9jb2wgdGhyb3VnaCB0aGUgbmV3IGxvZ2luKCkgYW5kIHN0YXJ0dGxzKCkgbWV0aG9kcy4KCi0gaG1hYzogYSBuZXcgbW9kdWxlIGltcGxlbWVudGluZyBrZXllZCBoYXNoaW5nIGZvciBtZXNzYWdlCiAgYXV0aGVudGljYXRpb24uCgotIG1pbWV0eXBlcyBub3cgcmVjb2duaXplcyBtb3JlIGV4dGVuc2lvbnMgYW5kIGZpbGUgdHlwZXMuICBBdCB0aGUKICBzYW1lIHRpbWUsIHNvbWUgbWFwcGluZ3Mgbm90IHNhbmN0aW9uZWQgYnkgSUFOQSB3ZXJlIHJlbW92ZWQuCgotIFRoZSAiY29tcGlsZXIiIHBhY2thZ2UgaGFzIGJlZW4gYnJvdWdodCB1cCB0byBkYXRlIHRvIHRoZSBzdGF0ZSBvZgogIFB5dGhvbiAyLjIgYnl0ZWNvZGUgZ2VuZXJhdGlvbi4gIEl0IGhhcyBhbHNvIGJlZW4gcHJvbW90ZWQgZnJvbSBhCiAgVG9vbCB0byBhIHN0YW5kYXJkIGxpYnJhcnkgcGFja2FnZS4gIChUb29scy9jb21waWxlciBzdGlsbCBleGlzdHMgYXMKICBhIHNhbXBsZSBkcml2ZXIuKQoKQnVpbGQKLS0tLS0KCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IChMRlMpIGlzIG5vdyBhdXRvbWF0aWMgd2hlbiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKICBpdDsgbm8gbW9yZSBtYW51YWwgY29uZmlndXJhdGlvbiB0d2Vha3MgYXJlIG5lZWRlZC4gIE9uIExpbnV4LCBhdAogIGxlYXN0LCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBzeXN0ZW0gd2hvc2UgQyBsaWJyYXJ5IHN1cHBvcnRzIGxhcmdlCiAgZmlsZXMgYnV0IHdob3NlIGtlcm5lbCBkb2Vzbid0OyBpbiB0aGlzIGNhc2UsIGxhcmdlIGZpbGUgc3VwcG9ydCBpcwogIHN0aWxsIGVuYWJsZWQgYnV0IGRvZXNuJ3QgZG8geW91IGFueSBnb29kIHVubGVzcyB5b3UgdXBncmFkZSB5b3VyCiAga2VybmVsIG9yIHNoYXJlIHlvdXIgUHl0aG9uIGV4ZWN1dGFibGUgd2l0aCBhbm90aGVyIHN5c3RlbSB3aG9zZQogIGtlcm5lbCBoYXMgbGFyZ2UgZmlsZSBzdXBwb3J0LgoKLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgc3VwcGxpZXMgcGxhdXNpYmxlIGRlZmF1bHRzIGluIGEKICBjcm9zcy1jb21waWxhdGlvbiBlbnZpcm9ubWVudC4gIFRoaXMgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHN1cHBsaWVkCiAgdmFsdWVzIGFyZSBhbHdheXMgY29ycmVjdCwgb3IgdGhhdCBjcm9zcy1jb21waWxhdGlvbiBub3cgd29ya3MKICBmbGF3bGVzc2x5IC0tIGJ1dCBpdCdzIGEgZmlyc3Qgc3RlcCAoYW5kIGl0IHNodXRzIHVwIG1vc3Qgb2YKICBhdXRvY29uZidzIHdhcm5pbmdzIGFib3V0IEFDX1RSWV9SVU4pLgoKLSBUaGUgVW5peCBidWlsZCBpcyBub3cgYSBiaXQgbGVzcyBjaGF0dHksIGNvdXJ0ZXN5IG9mIHRoZSBwYXJzZXIKICBnZW5lcmF0b3IuICBUaGUgYnVpbGQgaXMgY29tcGxldGVseSBzaWxlbnQgKGV4Y2VwdCBmb3IgZXJyb3JzKSB3aGVuCiAgdXNpbmcgIm1ha2UgLXMiLCB0aGFua3MgdG8gYSAtcSBvcHRpb24gdG8gc2V0dXAucHkuCgpDIEFQSQotLS0tLQoKLSBUaGUgInN0cnVjdG1lbWJlciIgQVBJIG5vdyBzdXBwb3J0cyBzb21lIG5ldyBmbGFnIGJpdHMgdG8gZGVueSByZWFkCiAgYW5kL29yIHdyaXRlIGFjY2VzcyB0byBhdHRyaWJ1dGVzIGluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gQ29tcGFxJ3MgaVBBUSBoYW5kaGVsZCwgcnVubmluZyB0aGUgImZhbWlsaWFyIiBMaW51eCBkaXN0cmlidXRpb24KICAoaHR0cDovL2ZhbWlsaWFyLmhhbmRoZWxkcy5vcmcpLgoKVGVzdHMKLS0tLS0KCi0gVGhlICJjbGFzc2ljIiBzdGFuZGFyZCB0ZXN0cywgd2hpY2ggd29yayBieSBjb21wYXJpbmcgc3Rkb3V0IHRvCiAgYW4gZXhwZWN0ZWQtb3V0cHV0IGZpbGUgdW5kZXIgTGliL3Rlc3Qvb3V0cHV0Lywgbm8gbG9uZ2VyIHN0b3AgYXQKICB0aGUgZmlyc3QgbWlzbWF0Y2guICBJbnN0ZWFkIHRoZSB0ZXN0IGlzIHJ1biB0byBjb21wbGV0aW9uLCBhbmQgYQogIHZhcmlhbnQgb2YgbmRpZmYtc3R5bGUgY29tcGFyaXNvbiBpcyB1c2VkIHRvIHJlcG9ydCBhbGwgZGlmZmVyZW5jZXMuCiAgVGhpcyBpcyBtdWNoIGVhc2llciB0byB1bmRlcnN0YW5kIHRoYW4gdGhlIHByZXZpb3VzIHN0eWxlIG9mIHJlcG9ydGluZy4KCi0gVGhlIHVuaXR0ZXN0LWJhc2VkIHN0YW5kYXJkIHRlc3RzIG5vdyB1c2UgcmVncnRlc3QncyB0ZXN0X21haW4oKQogIGNvbnZlbnRpb24sIGluc3RlYWQgb2YgcnVubmluZyBhcyBhIHNpZGUtZWZmZWN0IG9mIG1lcmVseSBiZWluZwogIGltcG9ydGVkLiAgVGhpcyBhbGxvd3MgdGhlc2UgdGVzdHMgdG8gYmUgcnVuIGluIG1vcmUgbmF0dXJhbCBhbmQKICBmbGV4aWJsZSB3YXlzIGFzIHVuaXR0ZXN0cywgb3V0c2lkZSB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLgoKLSByZWdydGVzdC5weSBpcyBtdWNoIGJldHRlciBpbnRlZ3JhdGVkIHdpdGggdW5pdHRlc3QgYW5kIGRvY3Rlc3Qgbm93LAogIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHJlcG9ydGluZyBlcnJvcnMuCgpXaW5kb3dzCi0tLS0tLS0KCi0gTGFyZ2UgZmlsZSBzdXBwb3J0IG5vdyBhbHNvIHdvcmtzIGZvciBmaWxlcyA+IDRHQiwgb24gZmlsZXN5c3RlbXMKICB0aGF0IHN1cHBvcnQgaXQgKE5URlMgdW5kZXIgV2luZG93cyAyMDAwKS4gIFNlZSAiV2hhdCdzIE5ldyBpbgogIFB5dGhvbiAyLjJhMyIgZm9yIG1vcmUgZGV0YWlsLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEzPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIERhdGU6IDA3LVNlcC0yMDAxKgoKQ29yZQotLS0tCgotIENvbnZlcnNpb24gb2YgbG9uZyB0byBmbG9hdCBub3cgcmFpc2VzIE92ZXJmbG93RXJyb3IgaWYgdGhlIGxvbmcgaXMgdG9vCiAgYmlnIHRvIHJlcHJlc2VudCBhcyBhIEMgZG91YmxlLgoKLSBUaGUgMy1hcmd1bWVudCBidWlsdGluIHBvdygpIG5vIGxvbmdlciBhbGxvd3MgYSB0aGlyZCBub24tTm9uZSBhcmd1bWVudAogIGlmIGVpdGhlciBvZiB0aGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBpcyBhIGZsb2F0LCBvciBpZiBib3RoIGFyZSBvZgogIGludGVnZXIgdHlwZXMgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmUgKGluIHdoaWNoIGxhdHRlciBjYXNlCiAgdGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0LCBzbyB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZQogIHJlc3RyaWN0aW9uKS4KCi0gVGhlIGJ1aWx0aW4gZGlyKCkgbm93IHJldHVybnMgbW9yZSBpbmZvcm1hdGlvbiwgYW5kIHNvbWV0aW1lcyBtdWNoCiAgbW9yZSwgZ2VuZXJhbGx5IG5hbWluZyBhbGwgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QsIGFuZCBhbGwgYXR0cmlidXRlcwogIHJlYWNoYWJsZSBmcm9tIHRoZSBvYmplY3QgdmlhIGl0cyBjbGFzcywgYW5kIGZyb20gaXRzIGNsYXNzJ3MgYmFzZQogIGNsYXNzZXMsIGFuZCBzbyBvbiBmcm9tIHRoZW0gdG9vLiAgRXhhbXBsZTogIGluIDIuMmEyLCBkaXIoW10pIHJldHVybmVkCiAgYW4gZW1wdHkgbGlzdC4gIEluIDIuMmEzLAoKICA+Pj4gZGlyKFtdKQogIFsnX19hZGRfXycsICdfX2NsYXNzX18nLCAnX19jb250YWluc19fJywgJ19fZGVsYXR0cl9fJywgJ19fZGVsaXRlbV9fJywKICAgJ19fZXFfXycsICdfX2dlX18nLCAnX19nZXRhdHRyX18nLCAnX19nZXRpdGVtX18nLCAnX19nZXRzbGljZV9fJywKICAgJ19fZ3RfXycsICdfX2hhc2hfXycsICdfX2lhZGRfXycsICdfX2ltdWxfXycsICdfX2luaXRfXycsICdfX2xlX18nLAogICAnX19sZW5fXycsICdfX2x0X18nLCAnX19tdWxfXycsICdfX25lX18nLCAnX19uZXdfXycsICdfX3JlcHJfXycsCiAgICdfX3JtdWxfXycsICdfX3NldGF0dHJfXycsICdfX3NldGl0ZW1fXycsICdfX3NldHNsaWNlX18nLCAnX19zdHJfXycsCiAgICdhcHBlbmQnLCAnY291bnQnLCAnZXh0ZW5kJywgJ2luZGV4JywgJ2luc2VydCcsICdwb3AnLCAncmVtb3ZlJywKICAgJ3JldmVyc2UnLCAnc29ydCddCgogIGRpcihtb2R1bGUpIGNvbnRpbnVlcyB0byByZXR1cm4gb25seSB0aGUgbW9kdWxlJ3MgYXR0cmlidXRlcywgdGhvdWdoLgoKLSBPdmVyZmxvd2luZyBvcGVyYXRpb25zIG9uIHBsYWluIGludHMgbm93IHJldHVybiBhIGxvbmcgaW50IHJhdGhlcgogIHRoYW4gcmFpc2luZyBPdmVyZmxvd0Vycm9yLiAgVGhpcyBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgUEVQCiAgMjM3LiAgWW91IGNhbiB1c2UgLVdkZWZhdWx0OjpPdmVyZmxvd1dhcm5pbmcgdG8gZW5hYmxlIGEgd2FybmluZyBmb3IKICB0aGlzIHNpdHVhdGlvbiwgYW5kIC1XZXJyb3I6Ok92ZXJmbG93V2FybmluZyB0byByZXZlcnQgdG8gdGhlIG9sZAogIE92ZXJmbG93RXJyb3IgZXhjZXB0aW9uLgoKLSBBIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLCAtUTxhcmc+LCBpcyBhZGRlZCB0byBjb250cm9sIHJ1bi10aW1lCiAgd2FybmluZ3MgZm9yIHRoZSB1c2Ugb2YgY2xhc3NpYyBkaXZpc2lvbi4gIChTZWUgUEVQIDIzOC4pICBQb3NzaWJsZQogIHZhbHVlcyBhcmUgLVFvbGQsIC1Rd2FybiwgLVF3YXJuYWxsLCBhbmQgLVFuZXcuICBUaGUgZGVmYXVsdCBpcwogIC1Rb2xkLCBtZWFuaW5nIHRoZSAvIG9wZXJhdG9yIGhhcyBpdHMgY2xhc3NpYyBtZWFuaW5nIGFuZCBubwogIHdhcm5pbmdzIGFyZSBpc3N1ZWQuICBVc2luZyAtUXdhcm4gaXNzdWVzIGEgcnVuLXRpbWUgd2FybmluZyBhYm91dAogIGFsbCB1c2VzIG9mIGNsYXNzaWMgZGl2aXNpb24gZm9yIGludCBhbmQgbG9uZyBhcmd1bWVudHM7IC1Rd2FybmFsbAogIGFsc28gd2FybnMgYWJvdXQgY2xhc3NpYyBkaXZpc2lvbiBmb3IgZmxvYXQgYW5kIGNvbXBsZXggYXJndW1lbnRzCiAgKGZvciB1c2Ugd2l0aCBmaXhkaXYucHkpLgogIFtOb3RlOiAgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGl0ZW0gKHByZXNlcnZlZCBiZWxvdykgYmVjYW1lCiAgb2Jzb2xldGUgaW4gMi4yYzEgLS0gLVFuZXcgaGFzIGdsb2JhbCBlZmZlY3QgaW4gMi4yXSA6OgoKICAgIFVzaW5nIC1RbmV3IGlzIHF1ZXN0aW9uYWJsZTsgaXQgdHVybnMgb24gbmV3IGRpdmlzaW9uIGJ5IGRlZmF1bHQsIGJ1dAogICAgb25seSBpbiB0aGUgX19tYWluX18gbW9kdWxlLiAgWW91IGNhbiB1c2VmdWxseSBjb21iaW5lIC1Rd2FybiBvcgogICAgLVF3YXJuYWxsIGFuZCAtUW5ldzogdGhpcyBnaXZlcyB0aGUgX19tYWluX18gbW9kdWxlIG5ldyBkaXZpc2lvbiwgYW5kCiAgICB3YXJucyBhYm91dCBjbGFzc2ljIGRpdmlzaW9uIGV2ZXJ5d2hlcmUgZWxzZS4KCi0gTWFueSBidWlsdC1pbiB0eXBlcyBjYW4gbm93IGJlIHN1YmNsYXNzZWQuICBUaGlzIGFwcGxpZXMgdG8gaW50LAogIGxvbmcsIGZsb2F0LCBzdHIsIHVuaWNvZGUsIGFuZCB0dXBsZS4gIChUaGUgdHlwZXMgY29tcGxleCwgbGlzdCBhbmQKICBkaWN0aW9uYXJ5IGNhbiBhbHNvIGJlIHN1YmNsYXNzZWQ7IHRoaXMgd2FzIGludHJvZHVjZWQgZWFybGllci4pCiAgTm90ZSB0aGF0IHJlc3RyaWN0aW9ucyBhcHBseSB3aGVuIHN1YmNsYXNzaW5nIGltbXV0YWJsZSBidWlsdC1pbgogIHR5cGVzOiB5b3UgY2FuIG9ubHkgYWZmZWN0IHRoZSB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UgYnkgb3ZlcmxvYWRpbmcKICBfX25ld19fLiAgWW91IGNhbiBhZGQgbXV0YWJsZSBhdHRyaWJ1dGVzLCBhbmQgdGhlIHN1YmNsYXNzIGluc3RhbmNlcwogIHdpbGwgaGF2ZSBhIF9fZGljdF9fIGF0dHJpYnV0ZSwgYnV0IHlvdSBjYW5ub3QgY2hhbmdlIHRoZSAidmFsdWUiCiAgKGFzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzKSBvZiBhbiBpbW11dGFibGUgc3ViY2xhc3MgaW5zdGFuY2UKICBvbmNlIGl0IGlzIGNyZWF0ZWQuCgotIFRoZSBkaWN0aW9uYXJ5IGNvbnN0cnVjdG9yIG5vdyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwgYQogIG1hcHBpbmctbGlrZSBvYmplY3QsIGFuZCBpbml0aWFsaXplcyB0aGUgZGljdGlvbmFyeSBmcm9tIGl0cwogIChrZXksIHZhbHVlKSBwYWlycy4KCi0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgc3VwZXIsIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBmYWNpbGl0YXRlcyBtYWtpbmcKICAiY29vcGVyYXRpdmUgc3VwZXIgY2FsbHMiIGluIGEgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc2V0dGluZy4gIEZvciBhbgogIGV4cGxhbmF0aW9uLCBzZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwjY29vcGVyYXRpb24KCi0gQSBuZXcgYnVpbHQtaW4gdHlwZSwgcHJvcGVydHksIGhhcyBiZWVuIGFkZGVkLiAgVGhpcyBlbmFibGVzIHRoZQogIGNyZWF0aW9uIG9mICJwcm9wZXJ0aWVzIi4gIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIGltcGxlbWVudGVkIGJ5CiAgZ2V0dGVyIGFuZCBzZXR0ZXIgZnVuY3Rpb25zIChvciBvbmx5IG9uZSBvZiB0aGVzZSBmb3IgcmVhZC1vbmx5IG9yCiAgd3JpdGUtb25seSBhdHRyaWJ1dGVzKSwgd2l0aG91dCB0aGUgbmVlZCB0byBvdmVycmlkZSBfX2dldGF0dHJfXy4KICBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwjcHJvcGVydHkKCi0gVGhlIHN5bnRheCBvZiBmbG9hdGluZy1wb2ludCBhbmQgaW1hZ2luYXJ5IGxpdGVyYWxzIGhhcyBiZWVuCiAgbGliZXJhbGl6ZWQsIHRvIGFsbG93IGxlYWRpbmcgemVyb2VzLiAgRXhhbXBsZXMgb2YgbGl0ZXJhbHMgbm93CiAgbGVnYWwgdGhhdCB3ZXJlIFN5bnRheEVycm9ycyBiZWZvcmU6CgogICAgICAwMC4wICAgIDBlMyAgIDAxMDBqICAgMDcuNSAgIDAwMDAwMDAwMDAwMDAwMDAwMDA4LgoKLSBBbiBvbGQgdG9rZW5pemVyIGJ1ZyBhbGxvd2VkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIHdpdGggYW4gaW5jb21wbGV0ZQogIGV4cG9uZW50LCBzdWNoIGFzIDFlIGFuZCAzLjFlLS4gIFN1Y2ggbGl0ZXJhbHMgbm93IHJhaXNlIFN5bnRheEVycm9yLgoKTGlicmFyeQotLS0tLS0tCgotIHRlbG5ldGxpYiBpbmNsdWRlcyBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIG9wdGlvbnMsIGFuZCBzdXBwb3J0IGZvcgogIHNldHRpbmcgYW4gb3B0aW9uIG5lZ290aWF0aW9uIGNhbGxiYWNrLiBJdCBhbHNvIHN1cHBvcnRzIHByb2Nlc3NpbmcKICBvZiBzdWJvcHRpb25zLgoKLSBUaGUgbmV3IEMgc3RhbmRhcmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgbWF0aCBsaWJyYXJpZXMgc2V0IGVycm5vIHRvCiAgRVJBTkdFIG9uIG92ZXJmbG93LiAgRm9yIHBsYXRmb3JtIGxpYnJhcmllcyB0aGF0IGV4cGxvaXQgdGhpcyBuZXcKICBmcmVlZG9tLCBQeXRob24ncyBvdmVyZmxvdy1jaGVja2luZyB3YXMgd2hvbGx5IGJyb2tlbi4gIEEgbmV3IG92ZXJmbG93LQogIGNoZWNraW5nIHNjaGVtZSBhdHRlbXB0cyB0byByZXBhaXIgdGhhdCwgYnV0IG1heSBub3QgYmUgcmVsaWFibGUgb24gYWxsCiAgcGxhdGZvcm1zIChDIGRvZXNuJ3Qgc2VlbSB0byBwcm92aWRlIGFueXRoaW5nIGJvdGggdXNlZnVsIGFuZCBwb3J0YWJsZQogIGluIHRoaXMgYXJlYSBhbnltb3JlKS4KCi0gQXN5bmNocm9ub3VzIHRpbWVvdXQgYWN0aW9ucyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIG5ldyBjbGFzcwogIHRocmVhZGluZy5UaW1lci4KCi0gbWF0aC5sb2cgYW5kIG1hdGgubG9nMTAgbm93IHJldHVybiBzZW5zaWJsZSByZXN1bHRzIGZvciBldmVuIGh1Z2UKICBsb25nIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlLCBtYXRoLmxvZzEwKDEwICoqIDEwMDAwKSB+PSAxMDAwMC4wLgoKLSBBIG5ldyBmdW5jdGlvbiwgaW1wLmxvY2tfaGVsZCgpLCByZXR1cm5zIDEgd2hlbiB0aGUgaW1wb3J0IGxvY2sgaXMKICBjdXJyZW50bHkgaGVsZC4gIFNlZSB0aGUgZG9jcyBmb3IgdGhlIGltcCBtb2R1bGUuCgotIHBpY2tsZSwgY1BpY2tsZSBhbmQgbWFyc2hhbCBvbiAzMi1iaXQgcGxhdGZvcm1zIGNhbiBub3cgY29ycmVjdGx5IHJlYWQKICBkdW1wcyBjb250YWluaW5nIGludHMgd3JpdHRlbiBvbiBwbGF0Zm9ybXMgd2hlcmUgUHl0aG9uIGludHMgYXJlIDggYnl0ZXMuCiAgV2hlbiByZWFkIG9uIGEgYm94IHdoZXJlIFB5dGhvbiBpbnRzIGFyZSA0IGJ5dGVzLCBzdWNoIHZhbHVlcyBhcmUKICBjb252ZXJ0ZWQgdG8gUHl0aG9uIGxvbmdzLgoKLSBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh1c2luZyB0aGUgcmV4ZWMgbW9kdWxlKSwgdW5tYXJzaGFsbGluZwogIGNvZGUgb2JqZWN0cyBpcyBubyBsb25nZXIgYWxsb3dlZC4gIFRoaXMgcGx1Z3MgYSBzZWN1cml0eSBob2xlLgoKLSB1bml0dGVzdC5UZXN0UmVzdWx0IGluc3RhbmNlcyBubyBsb25nZXIgc3RvcmUgcmVmZXJlbmNlcyB0byB0cmFjZWJhY2tzCiAgZ2VuZXJhdGVkIGJ5IHRlc3QgZmFpbHVyZXMuIFRoaXMgcHJldmVudHMgdW5leHBlY3RlZCBkYW5nbGluZyByZWZlcmVuY2VzCiAgdG8gb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBnYXJiYWdlIGNvbGxlY3RlZCBiZXR3ZWVuIHRlc3RzLgoKVG9vbHMKLS0tLS0KCi0gVG9vbHMvc2NyaXB0cy9maXhkaXYucHkgaGFzIGJlZW4gYWRkZWQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZml4CiAgZGl2aXNpb24gb3BlcmF0b3JzIGFzIHBlciBQRVAgMjM4LgoKQnVpbGQKLS0tLS0KCi0gSWYgeW91IGFyZSBhbiBhZHZlbnR1cm91cyBwZXJzb24gdXNpbmcgTWFjIE9TIFggeW91IG1heSB3YW50IHRvIGxvb2sgYXQKICBNYWMvT1NYLiBUaGVyZSBpcyBhIE1ha2VmaWxlIHRoZXJlIHRoYXQgd2lsbCBidWlsZCBQeXRob24gYXMgYSByZWFsIE1hYwogIGFwcGxpY2F0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZXhwZXJpbWVudGluZyB3aXRoIENhcmJvbiBvciBDb2NvYS4KICBEaXNjdXNzaW9uIG9mIHRoaXMgb24gcHl0aG9ubWFjLXNpZywgcGxlYXNlLgoKQyBBUEkKLS0tLS0KCi0gTmV3IGZ1bmN0aW9uIFB5T2JqZWN0X0RpcihvYmopLCBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKS4KCi0gTm90ZSB0aGF0IFB5TG9uZ19Bc0RvdWJsZSBjYW4gZmFpbCEgIFRoaXMgaGFzIGFsd2F5cyBiZWVuIHRydWUsIGJ1dCBubwogIGNhbGxlcnMgY2hlY2tlZCBmb3IgaXQuICBJdCdzIG1vcmUgbGlrZWx5IHRvIGZhaWwgbm93LCBiZWNhdXNlIG92ZXJmbG93CiAgZXJyb3JzIGFyZSBwcm9wZXJseSBkZXRlY3RlZCBub3cuICBUaGUgcHJvcGVyIHdheSB0byBjaGVjazo6CgogICAgICBkb3VibGUgeCA9IFB5TG9uZ19Bc0RvdWJsZShzb21lX2xvbmdfb2JqZWN0KTsKICAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICAgLyogVGhlIGNvbnZlcnNpb24gZmFpbGVkLiAqLwogICAgICB9CgotIFRoZSBHQyBBUEkgaGFzIGJlZW4gY2hhbmdlZC4gIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG9sZCBBUEkgd2lsbCBzdGlsbAogIGNvbXBpbGUgYnV0IHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIEdDLiAgVG8gdXBncmFkZSBhbiBleHRlbnNpb24KICBtb2R1bGU6CgogICAgLSByZW5hbWUgUHlfVFBGTEFHU19HQyB0byBQeVRQRkxBR1NfSEFWRV9HQwoKICAgIC0gdXNlIFB5T2JqZWN0X0dDX05ldyBvciBQeU9iamVjdF9HQ19OZXdWYXIgdG8gYWxsb2NhdGUgb2JqZWN0cyBhbmQKICAgICAgUHlPYmplY3RfR0NfRGVsIHRvIGRlYWxsb2NhdGUgdGhlbQoKICAgIC0gcmVuYW1lIFB5T2JqZWN0X0dDX0luaXQgdG8gUHlPYmplY3RfR0NfVHJhY2sgYW5kIFB5T2JqZWN0X0dDX0ZpbmkKICAgICAgdG8gUHlPYmplY3RfR0NfVW5UcmFjawoKICAgIC0gcmVtb3ZlIFB5R0NfSEVBRF9TSVpFIGZyb20gb2JqZWN0IHNpemUgY2FsY3VsYXRpb25zCgogICAgLSByZW1vdmUgY2FsbHMgdG8gUHlPYmplY3RfQVNfR0MgYW5kIFB5T2JqZWN0X0ZST01fR0MKCi0gVHdvIG5ldyBmdW5jdGlvbnM6IFB5U3RyaW5nX0Zyb21Gb3JtYXQoKSBhbmQgUHlTdHJpbmdfRnJvbUZvcm1hdFYoKS4KICBUaGVzZSBjYW4gYmUgdXNlZCBzYWZlbHkgdG8gY29uc3RydWN0IHN0cmluZyBvYmplY3RzIGZyb20gYQogIHNwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZyAoc2ltaWxhciB0byB0aGUgZm9ybWF0IHN0cmluZyBzdXBwb3J0ZWQKICBieSBQeUVycl9Gb3JtYXQoKSkuCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCi0gU3RlcGhlbiBIYW5zZW4gY29udHJpYnV0ZWQgcGF0Y2hlcyBzdWZmaWNpZW50IHRvIGdldCBhIGNsZWFuIGNvbXBpbGUKICB1bmRlciBCb3JsYW5kIEMgKFdpbmRvd3MpLCBidXQgaGUgcmVwb3J0cyBwcm9ibGVtcyBydW5uaW5nIGl0IGFuZCByYW4KICBvdXQgb2YgdGltZSB0byBjb21wbGV0ZSB0aGUgcG9ydC4gIFZvbHVudGVlcnM/ICBFeHBlY3QgYSBNZW1vcnlFcnJvcgogIHdoZW4gaW1wb3J0aW5nIHRoZSB0eXBlcyBtb2R1bGU7IHRoaXMgaXMgcHJvYmFibHkgc2hhbGxvdywgYW5kCiAgY2F1c2luZyBsYXRlciBmYWlsdXJlcyB0b28uCgpUZXN0cwotLS0tLQoKV2luZG93cwotLS0tLS0tCgotIExhcmdlIGZpbGUgc3VwcG9ydCBpcyBub3cgZW5hYmxlZCBvbiBXaW4zMiBwbGF0Zm9ybXMgYXMgd2VsbCBhcyBvbgogIFdpbjY0LiAgVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgZi50ZWxsKCkgYW5kIGYuc2VlaygpCiAgdG8gbWFuaXB1bGF0ZSBmaWxlcyBsYXJnZXIgdGhhbiAyIGdpZ2FieXRlcyAocHJvdmlkZWQgeW91IGhhdmUgZW5vdWdoCiAgZGlzayBzcGFjZSwgYW5kIGFyZSB1c2luZyBhIFdpbmRvd3MgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIGxhcmdlCiAgcGFydGl0aW9ucykuICBXaW5kb3dzIGZpbGVzeXN0ZW0gbGltaXRzOiAgRkFUIGhhcyBhIDJHQiAoZ2lnYWJ5dGUpCiAgZmlsZXNpemUgbGltaXQsIGFuZCBsYXJnZSBmaWxlIHN1cHBvcnQgbWFrZXMgbm8gZGlmZmVyZW5jZSB0aGVyZS4KICBGQVQzMidzIGxpbWl0IGlzIDRHQiwgYW5kIGZpbGVzID49IDJHQiBhcmUgZWFzaWVyIHRvIHVzZSBmcm9tIFB5dGhvbiBub3cuCiAgTlRGUyBoYXMgbm8gcHJhY3RpY2FsIGxpbWl0IG9uIGZpbGUgc2l6ZSwgYW5kIGZpbGVzIG9mIGFueSBzaXplIGNhbiBiZQogIHVzZWQgZnJvbSBQeXRob24gbm93LgoKLSBUaGUgdzl4cG9wZW4gaGFjayBpcyBub3cgdXNlZCBvbiBXaW5kb3dzIE5UIGFuZCAyMDAwIHRvbyB3aGVuIENPTVBTUEVDCiAgcG9pbnRzIHRvIGNvbW1hbmQuY29tIChwYXRjaCBmcm9tIEJyaWFuIFF1aW5sYW4pLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmEyPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIERhdGU6IDIyLUF1Zy0yMDAxKgoKQnVpbGQKLS0tLS0KCi0gVGltIFBldGVycyBkZXZlbG9wZWQgYSBicmFuZCBuZXcgV2luZG93cyBpbnN0YWxsZXIgdXNpbmcgV2lzZSA4LjEsCiAgZ2VuZXJvdXNseSBkb25hdGVkIHRvIHVzIGJ5IFdpc2UgU29sdXRpb25zLgoKLSBjb25maWd1cmUgc3VwcG9ydHMgYSBuZXcgb3B0aW9uIC0tZW5hYmxlLXVuaWNvZGUsIHdpdGggdGhlIHZhbHVlcwogIHVjczIgYW5kIHVjczQgKG5ldyBpbiAyLjJhMSkuIFdpdGggLS1kaXNhYmxlLXVuaWNvZGUsIHRoZSBVbmljb2RlCiAgdHlwZSBhbmQgc3VwcG9ydGluZyBjb2RlIGlzIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcnByZXRlci4KCi0gQSBuZXcgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1mcmFtZXdvcmsgYnVpbGRzIGEgTWFjIE9TIFggZnJhbWV3b3JrLAogIHdoaWNoICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHdpbGwgaW5zdGFsbC4gVGhpcyBwcm92aWRlcyBhIHN0YXJ0aW5nCiAgcG9pbnQgZm9yIG1vcmUgbWFjLWxpa2UgZnVuY3Rpb25hbGl0eSwgam9pbiBweXRob25tYWMtc2lnQHB5dGhvbi5vcmcKICBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGVscGluZy4KCi0gVGhlIE5lWFQgcGxhdGZvcm0gaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KCi0gVGhlICduZXcnIG1vZHVsZSBpcyBub3cgc3RhdGljYWxseSBsaW5rZWQuCgpUb29scwotLS0tLQoKLSBUaGUgbmV3IFRvb2xzL3NjcmlwdHMvY2xlYW5mdXR1cmUucHkgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseQogIGVkaXQgb3V0IG9ic29sZXRlIGZ1dHVyZSBzdGF0ZW1lbnRzIGZyb20gUHl0aG9uIHNvdXJjZSBjb2RlLiAgU2VlCiAgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGRldGFpbHMuCgpUZXN0cwotLS0tLQoKLSByZWdydGVzdC5weSBub3cga25vd3Mgd2hpY2ggdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gc29tZQogIHBsYXRmb3JtcywgYWxsb3dpbmcgdG8gZ2l2ZSBjbGVhcmVyIHRlc3QgcmVzdWx0IG91dHB1dC4gIHJlZ3J0ZXN0CiAgYWxzbyBoYXMgb3B0aW9uYWwgLS11c2UvLXUgc3dpdGNoIHRvIHJ1biBub3JtYWxseSBkaXNhYmxlZCB0ZXN0cwogIHdoaWNoIHJlcXVpcmUgbmV0d29yayBhY2Nlc3Mgb3IgY29uc3VtZSBzaWduaWZpY2FudCBkaXNrIHJlc291cmNlcy4KCi0gU2V2ZXJhbCBuZXcgdGVzdHMgaW4gdGhlIHN0YW5kYXJkIHRlc3Qgc3VpdGUsIHdpdGggc3BlY2lhbCB0aGFua3MgdG8KICBOaWNrIE1hdGhld3Nvbi4KCkNvcmUKLS0tLQoKLSBUaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IgLy8gaGFzIGJlZW4gYWRkZWQgYXMgb3V0bGluZWQgaW4gUEVQCiAgMjM4LiAgVGhlIC8gb3BlcmF0b3Igc3RpbGwgcHJvdmlkZXMgY2xhc3NpYyBkaXZpc2lvbiAoYW5kIHdpbGwgdW50aWwKICBQeXRob24gMy4wKSB1bmxlc3MgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24iIGlzIGluY2x1ZGVkLCBpbgogIHdoaWNoIGNhc2UgdGhlIC8gb3BlcmF0b3Igd2lsbCBwcm92aWRlIHRydWUgZGl2aXNpb24uICBUaGUgb3BlcmF0b3IKICBtb2R1bGUgcHJvdmlkZXMgdHJ1ZWRpdigpIGFuZCBmbG9vcmRpdigpIGZ1bmN0aW9ucy4gIEF1Z21lbnRlZAogIGFzc2lnbm1lbnQgdmFyaWFudHMgYXJlIGluY2x1ZGVkLCBhcyBhcmUgdGhlIGVxdWl2YWxlbnQgb3ZlcmxvYWRhYmxlCiAgbWV0aG9kcyBhbmQgQyBBUEkgbWV0aG9kcy4gIFNlZSB0aGUgUEVQIGZvciBhIGZ1bGwgZGlzY3Vzc2lvbjoKICA8aHR0cDovL3B5dGhvbi5zZi5uZXQvcGVwcy9wZXAtMDIzOC5odG1sPgoKLSBGdXR1cmUgc3RhdGVtZW50cyBhcmUgbm93IGVmZmVjdGl2ZSBpbiBzaW11bGF0ZWQgaW50ZXJhY3RpdmUgc2hlbGxzCiAgKGxpa2UgSURMRSkuICBUaGlzIHNob3VsZCAianVzdCB3b3JrIiBieSBtYWdpYywgYnV0IHJlYWQgTWljaGFlbAogIEh1ZHNvbidzICJGdXR1cmUgc3RhdGVtZW50cyBpbiBzaW11bGF0ZWQgc2hlbGxzIiBQRVAgMjY0IGZvciBmdWxsCiAgZGV0YWlsczogIDxodHRwOi8vcHl0aG9uLnNmLm5ldC9wZXBzL3BlcC0wMjY0Lmh0bWw+LgoKLSBUaGUgdHlwZS9jbGFzcyB1bmlmaWNhdGlvbiAoUEVQIDI1Mi0yNTMpIHdhcyBpbnRlZ3JhdGVkIGludG8gdGhlCiAgdHJ1bmsgYW5kIGlzIG5vdCBzbyB0ZW50YXRpdmUgYW55IG1vcmUgKHRoZSBleGFjdCBzcGVjaWZpY2F0aW9uIG9mCiAgc29tZSBmZWF0dXJlcyBpcyBzdGlsbCB0ZW50YXRpdmUpLiAgQSBsb3Qgb2Ygd29yayBoYXMgZG9uZSBvbiBmaXhpbmcKICBidWdzIGFuZCBhZGRpbmcgcm9idXN0bmVzcyBhbmQgZmVhdHVyZXMgKHBlcmZvcm1hbmNlIHN0aWxsIGhhcyB0bwogIGNvbWUgYSBsb25nIHdheSkuCgotIFdhcm5pbmdzIGFib3V0IGEgbWlzbWF0Y2ggaW4gdGhlIFB5dGhvbiBBUEkgZHVyaW5nIGV4dGVuc2lvbiBpbXBvcnQKICBub3cgdXNlIHRoZSBQeXRob24gd2FybmluZyBmcmFtZXdvcmsgKHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvCiAgd3JpdGUgZmlsdGVycyBmb3IgdGhlc2Ugd2FybmluZ3MpLgoKLSBBIGZ1bmN0aW9uJ3MgX19kaWN0X18gKGFrYSBmdW5jX2RpY3QpIHdpbGwgbm93IGFsd2F5cyBiZSBhCiAgZGljdGlvbmFyeS4gIEl0IHVzZWQgdG8gYmUgcG9zc2libGUgdG8gZGVsZXRlIGl0IG9yIHNldCBpdCB0byBOb25lLAogIGJ1dCBub3cgYm90aCBhY3Rpb25zIHJhaXNlIFR5cGVFcnJvcnMuICBJdCBpcyBzdGlsbCBsZWdhbCB0byBzZXQgaXQKICB0byBhIGRpY3Rpb25hcnkgb2JqZWN0LiAgR2V0dGluZyBmdW5jLl9fZGljdF9fIGJlZm9yZSBhbnkgYXR0cmlidXRlcwogIGhhdmUgYmVlbiBhc3NpZ25lZCBub3cgcmV0dXJucyBhbiBlbXB0eSBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgTm9uZS4KCi0gQSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiwgLUUsIHdhcyBhZGRlZCB3aGljaCBkaXNhYmxlcyB0aGUgdXNlIG9mCiAgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcywgb3IgYXQgbGVhc3QgdGhvc2UgdGhhdCBhcmUgc3BlY2lmaWNhbGx5CiAgc2lnbmlmaWNhbnQgdG8gUHl0aG9uLiAgVXN1YWxseSB0aG9zZSBoYXZlIGEgbmFtZSBzdGFydGluZyB3aXRoCiAgIlBZVEhPTiIuICBUaGlzIHdhcyB1c2VkIHRvIGZpeCBhIHByb2JsZW0gd2hlcmUgdGhlIHRlc3RzIGZhaWwgaWYKICB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgUFlUSE9OSE9NRSBvciBQWVRIT05QQVRIIHBvaW50aW5nIHRvIGFuCiAgb2xkZXIgZGlzdHJpYnV0aW9uLgoKTGlicmFyeQotLS0tLS0tCgotIE5ldyBjbGFzcyBEaWZmZXIgYW5kIG5ldyBmdW5jdGlvbnMgbmRpZmYoKSBhbmQgcmVzdG9yZSgpIGluIGRpZmZsaWIucHkuCiAgVGhlc2UgcGFja2FnZSB0aGUgYWxnb3JpdGhtcyB1c2VkIGJ5IHRoZSBwb3B1bGFyIFRvb2xzL3NjcmlwdHMvbmRpZmYucHksCiAgZm9yIHByb2dyYW1tYXRpYyByZXVzZS4KCi0gTmV3IGZ1bmN0aW9uIHhtbC5zYXguc2F4dXRpbHMucXVvdGVhdHRyKCk6ICBRdW90ZSBhbiBYTUwgYXR0cmlidXRlCiAgdmFsdWUgdXNpbmcgdGhlIG1pbmltYWwgcXVvdGluZyByZXF1aXJlZCBmb3IgdGhlIHZhbHVlOyBtb3JlCiAgcmVsaWFibGUgdGhhbiB1c2luZyB4bWwuc2F4LnNheHV0aWxzLmVzY2FwZSgpIGZvciBhdHRyaWJ1dGUgdmFsdWVzLgoKLSBSZWFkbGluZSBjb21wbGV0aW9uIHN1cHBvcnQgZm9yIGNtZC5DbWQgd2FzIGFkZGVkLgoKLSBDYWxsaW5nIG9zLnRlbXBuYW0oKSBvciBvcy50bXBuYW0oKSBnZW5lcmF0ZSBSdW50aW1lV2FybmluZ3MuCgotIEFkZGVkIGZ1bmN0aW9uIHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKCkKCi0gQWRkZWQgS2EtUGluZyBZZWUncyBjZ2l0Yi5weSBtb2R1bGUuCgotIFRoZSAnbmV3JyBtb2R1bGUgbm93IGV4cG9zZXMgdGhlIENPX3h4eCBmbGFncy4KCi0gVGhlIGdjIG1vZHVsZSBvZmZlcnMgdGhlIGdldF9yZWZlcmVudHMgZnVuY3Rpb24uCgpOZXcgcGxhdGZvcm1zCi0tLS0tLS0tLS0tLS0KCkMgQVBJCi0tLS0tCgotIFR3byBuZXcgQVBJcyBQeU9TX3NucHJpbnRmKCkgYW5kIFB5T1NfdnNucHJpbnRmKCkgd2VyZSBhZGRlZAogIHdoaWNoIHByb3ZpZGUgYSBjcm9zcy1wbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZQogIHJlbGF0aXZlbHkgbmV3IHNucHJpbnRmKCkvdnNucHJpbnRmKCkgQyBsaWIgQVBJcy4gSW4gY29udHJhc3QgdG8KICB0aGUgc3RhbmRhcmQgc3ByaW50ZigpIGFuZCB2c3ByaW50ZigpIEMgbGliIEFQSXMsIHRoZXNlIHZlcnNpb25zCiAgYXBwbHkgYm91bmRzIGNoZWNraW5nIG9uIHRoZSB1c2VkIGJ1ZmZlciB3aGljaCBlbmhhbmNlcyBwcm90ZWN0aW9uCiAgYWdhaW5zdCBidWZmZXIgb3ZlcnJ1bnMuCgotIFVuaWNvZGUgQVBJcyBub3cgdXNlIG5hbWUgbWFuZ2xpbmcgdG8gYXNzdXJlIHRoYXQgbWl4aW5nIGludGVycHJldGVycwogIGFuZCBleHRlbnNpb25zIHVzaW5nIGRpZmZlcmVudCBVbmljb2RlIHdpZHRocyBpcyByZW5kZXJlZCBuZXh0IHRvCiAgaW1wb3NzaWJsZS4gVHJ5aW5nIHRvIGltcG9ydCBhbiBpbmNvbXBhdGlibGUgVW5pY29kZS1hd2FyZSBleHRlbnNpb24KICB3aWxsIHJlc3VsdCBpbiBhbiBJbXBvcnRFcnJvci4gIFVuaWNvZGUgZXh0ZW5zaW9ucyB3cml0ZXJzIG11c3QgbWFrZQogIHN1cmUgdG8gY2hlY2sgdGhlIFVuaWNvZGUgd2lkdGggY29tcGF0aWJpbGl0eSBpbiB0aGVpciBleHRlbnNpb25zIGJ5CiAgdXNpbmcgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYW5nbGVkIFVuaWNvZGUgQVBJcyBpbiB0aGUgZXh0ZW5zaW9uLgoKLSBUd28gbmV3IGZsYWdzIE1FVEhfTk9BUkdTIGFuZCBNRVRIX08gYXJlIGF2YWlsYWJsZSBpbiBtZXRob2QgZGVmaW5pdGlvbgogIHRhYmxlcyB0byBzaW1wbGlmeSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIHdpdGggbm8gYXJndW1lbnRzIGFuZCBhCiAgc2luZ2xlIHVudHlwZWQgYXJndW1lbnQuIENhbGxpbmcgc3VjaCBtZXRob2RzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KICBjYWxsaW5nIGNvcnJlc3BvbmRpbmcgTUVUSF9WQVJBUkdTIG1ldGhvZHMuIE1FVEhfT0xEQVJHUyBpcyBub3cKICBkZXByZWNhdGVkLgoKV2luZG93cwotLS0tLS0tCgotICJpbXBvcnQgbW9kdWxlIiBub3cgY29tcGlsZXMgbW9kdWxlLnB5dyBpZiBpdCBleGlzdHMgYW5kIG5vdGhpbmcgZWxzZQogIHJlbGV2YW50IGlzIGZvdW5kLgoKCldoYXQncyBOZXcgaW4gUHl0aG9uIDIuMmExPwo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipSZWxlYXNlIGRhdGU6IDE4LUp1bC0yMDAxKgoKQ29yZQotLS0tCgotIFRFTlRBVElWRUxZLCBhIGxhcmdlIGFtb3VudCBvZiBjb2RlIGltcGxlbWVudGluZyBtdWNoIG9mIHdoYXQncwogIGRlc2NyaWJlZCBpbiBQRVAgMjUyIChNYWtpbmcgVHlwZXMgTG9vayBNb3JlIExpa2UgQ2xhc3NlcykgYW5kIFBFUAogIDI1MyAoU3VidHlwaW5nIEJ1aWx0LWluIFR5cGVzKSB3YXMgYWRkZWQuICBUaGlzIHdpbGwgYmUgcmVsZWFzZWQKICB3aXRoIFB5dGhvbiAyLjJhMS4gIERvY3VtZW50YXRpb24gd2lsbCBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5CiAgdGhyb3VnaCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi4yLy4gIFRoZSBwdXJwb3NlIG9mIHJlbGVhc2luZyB0aGlzCiAgd2l0aCBQeXRob24gMi4yYTEgaXMgdG8gdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0IGlzCiAgcG9zc2libGUsIHRob3VnaCBub3QgbGlrZWx5LCB0aGF0IGEgZGVjaXNpb24gaXMgbWFkZSBub3QgdG8gcmVsZWFzZQogIHRoaXMgY29kZSBhcyBwYXJ0IG9mIDIuMiBmaW5hbCwgaWYgYW55IHNlcmlvdXMgYmFja3dhcmRzCiAgaW5jb21wYXRpYmlsaXRpZXMgYXJlIGZvdW5kIGR1cmluZyBhbHBoYSB0ZXN0aW5nIHRoYXQgY2Fubm90IGJlCiAgcmVwYWlyZWQuCgotIEdlbmVyYXRvcnMgd2VyZSBhZGRlZDsgdGhpcyBpcyBhIG5ldyB3YXkgdG8gY3JlYXRlIGFuIGl0ZXJhdG9yIChzZWUKICBiZWxvdykgdXNpbmcgd2hhdCBsb29rcyBsaWtlIGEgc2ltcGxlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgb25lIG9yCiAgbW9yZSAneWllbGQnIHN0YXRlbWVudHMuICBTZWUgUEVQIDI1NS4gIFNpbmNlIHRoaXMgYWRkcyBhIG5ldwogIGtleXdvcmQgdG8gdGhlIGxhbmd1YWdlLCB0aGlzIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGJ5IGluY2x1ZGluZyBhCiAgZnV0dXJlIHN0YXRlbWVudDogImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycyIgKHNlZSBQRVAgMjM2KS4KICBHZW5lcmF0b3JzIHdpbGwgYmVjb21lIGEgc3RhbmRhcmQgZmVhdHVyZSBpbiBhIGZ1dHVyZSByZWxlYXNlCiAgKHByb2JhYmx5IDIuMykuICBXaXRob3V0IHRoaXMgZnV0dXJlIHN0YXRlbWVudCwgJ3lpZWxkJyByZW1haW5zIGFuCiAgb3JkaW5hcnkgaWRlbnRpZmllciwgYnV0IGEgd2FybmluZyBpcyBpc3N1ZWQgZWFjaCB0aW1lIGl0IGlzIHVzZWQuCiAgKFRoZXNlIHdhcm5pbmdzIGN1cnJlbnRseSBkb24ndCBjb25mb3JtIHRvIHRoZSB3YXJuaW5ncyBmcmFtZXdvcmsgb2YKICBQRVAgMjMwOyB3ZSBpbnRlbmQgdG8gZml4IHRoaXMgaW4gMi4yYTIuKQoKLSBUaGUgVVRGLTE2IGNvZGVjIHdhcyBtb2RpZmllZCB0byBiZSBtb3JlIFJGQyBjb21wbGlhbnQuIEl0IHdpbGwgbm93CiAgb25seSByZW1vdmUgQk9NIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgYW5kIHRoZW4KICBvbmx5IGlmIHJ1bm5pbmcgaW4gbmF0aXZlIG1vZGUgKFVURi0xNi1MRSBhbmQgLUJFIHdvbid0IHJlbW92ZSBhCiAgbGVhZGluZyBCTU8gY2hhcmFjdGVyKS4KCi0gU3RyaW5ncyBub3cgaGF2ZSBhIG5ldyBtZXRob2QgLmRlY29kZSgpIHRvIGNvbXBsZW1lbnQgdGhlIGFscmVhZHkKICBleGlzdGluZyAuZW5jb2RlKCkgbWV0aG9kLiBUaGVzZSB0d28gbWV0aG9kcyBwcm92aWRlIGRpcmVjdCBhY2Nlc3MKICB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgb2YgdGhlIHJlZ2lzdGVyZWQgY29kZWNzLgoKICBUbyBlbmhhbmNlIHRoZSB1c2FiaWxpdHkgb2YgdGhlIC5lbmNvZGUoKSBtZXRob2QsIHRoZSBzcGVjaWFsCiAgY2FzaW5nIG9mIFVuaWNvZGUgb2JqZWN0IHJldHVybiB2YWx1ZXMgd2FzIGRyb3BwZWQgKFVuaWNvZGUgb2JqZWN0cwogIHdlcmUgYXV0by1tYWdpY2FsbHkgY29udmVydGVkIHRvIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCgogIEJvdGggbWV0aG9kcyB3aWxsIG5vdyByZXR1cm4gd2hhdGV2ZXIgdGhlIGNvZGVjIGluIGNoYXJnZSBvZiB0aGUKICByZXF1ZXN0ZWQgZW5jb2RpbmcgcmV0dXJucyBhcyBvYmplY3QsIGUuZy4gVW5pY29kZSBjb2RlY3Mgd2lsbAogIHJldHVybiBVbmljb2RlIG9iamVjdHMgd2hlbiBkZWNvZGluZyBpcyByZXF1ZXN0ZWQgKCLk9vwiLmRlY29kZSgibGF0aW4tMSIpCiAgd2lsbCByZXR1cm4gdSLk9vwiKS4gVGhpcyBlbmFibGVzIGNvZGVjIHdyaXRlciB0byBjcmVhdGUgY29kZWNzCiAgZm9yIHZhcmlvdXMgc2ltcGxlIHRvIHVzZSBjb252ZXJzaW9ucy4KCiAgTmV3IGNvZGVjcyB3ZXJlIGFkZGVkIHRvIGRlbW9uc3RyYXRlIHRoZXNlIG5ldyBmZWF0dXJlcyAodGhlIC5lbmNvZGUoKQogIGFuZCAuZGVjb2RlKCkgY29sdW1ucyBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0cyk6CgogICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgfE5hbWUgICAgIHwgLmVuY29kZSgpIHwgLmRlY29kZSgpIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgIHwKICArPT09PT09PT09Kz09PT09PT09PT09Kz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09KwogIHx1dSAgICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IFVVIGNvZGVjIChlLmcuIGZvciBlbWFpbCkgICB8CiAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8YmFzZTY0ICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCBiYXNlNjQgY29kZWMgICAgICAgICAgICAgICAgfAogICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgfHF1b3ByaSAgIHwgc3RyaW5nICAgIHwgc3RyaW5nICAgIHwgcXVvdGVkLXByaW50YWJsZSBjb2RlYyAgICAgIHwKICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogIHx6bGliICAgICB8IHN0cmluZyAgICB8IHN0cmluZyAgICB8IHpsaWIgY29tcHJlc3Npb24gICAgICAgICAgICB8CiAgKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICB8aGV4ICAgICAgfCBzdHJpbmcgICAgfCBzdHJpbmcgICAgfCAyLWJ5dGUgaGV4IGNvZGVjICAgICAgICAgICAgfAogICstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgfHJvdC0xMyAgIHwgc3RyaW5nICAgIHwgVW5pY29kZSAgIHwgUk9ULTEzIFVuaWNvZGUgY2hhcm1hcCBjb2RlY3wKICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKLSBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIG5vdyBzdXBwb3J0IHRoZSBjb25jZXB0IG9mIGEgZGVmYXVsdCBVbmljb2RlCiAgZW5jb2RpbmcgZm9yIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuICBOb3RhYmx5LCBXaW5kb3dzIHN1cHBvcnRzICdtYmNzJwogIGFzIHRoZSBkZWZhdWx0LiAgVGhlIE1hY2ludG9zaCB3aWxsIGFsc28gYWRvcHQgdGhpcyBjb25jZXB0IGluIHRoZSBtZWRpdW0KICB0ZXJtLCBhbHRob3VnaCB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhhdCBwbGF0Zm9ybSB3aWxsIGJlIG90aGVyIHRoYW4KICAnbWJjcycuCgogIE9uIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBzdXBwb3J0IG5vbi1BU0NJSSBmaWxlbmFtZXMsIGl0IGlzIGNvbW1vbiBmb3IKICBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZmlsZW5hbWVzIChzdWNoIGFzIG9zLmxpc3RkaXIoKSkgdG8gcmV0dXJuIFB5dGhvbgogIHN0cmluZyBvYmplY3RzIHByZS1lbmNvZGVkIHVzaW5nIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIGVuY29kaW5nIGZvcgogIHRoZSBwbGF0Zm9ybS4gIEFzIHRoaXMgZW5jb2RpbmcgaXMgbGlrZWx5IHRvIGJlIGRpZmZlcmVudCBmcm9tIFB5dGhvbidzCiAgZGVmYXVsdCBlbmNvZGluZywgY29udmVydGluZyB0aGlzIG5hbWUgdG8gYSBVbmljb2RlIG9iamVjdCBiZWZvcmUgcGFzc2luZwogIGl0IGJhY2sgdG8gdGhlIE9wZXJhdGluZyBTeXN0ZW0gd291bGQgcmVzdWx0IGluIGEgVW5pY29kZSBlcnJvciwgYXMgUHl0aG9uCiAgd291bGQgYXR0ZW1wdCB0byB1c2UgaXRzIGRlZmF1bHQgZW5jb2RpbmcgKGdlbmVyYWxseSBBU0NJSSkgcmF0aGVyIHRoYW4KICB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIGZpbGUgc3lzdGVtLgoKICBJbiBnZW5lcmFsLCB0aGlzIGNoYW5nZSBzaW1wbHkgcmVtb3ZlcyBzdXJwcmlzZXMgd2hlbiB3b3JraW5nIHdpdGgKICBVbmljb2RlIGFuZCB0aGUgZmlsZSBzeXN0ZW0sIG1ha2luZyB0aGVzZSBvcGVyYXRpb25zIHdvcmsgYXMgeW91IGV4cGVjdCwKICBpbmNyZWFzaW5nIHRoZSB0cmFuc3BhcmVuY3kgb2YgVW5pY29kZSBvYmplY3RzIGluIHRoaXMgY29udGV4dC4KICBTZWUgWz8/Pz9dIGZvciBtb3JlIGRldGFpbHMsIGluY2x1ZGluZyBleGFtcGxlcy4KCi0gRmxvYXQgKGFuZCBjb21wbGV4KSBsaXRlcmFscyBpbiBzb3VyY2UgY29kZSB3ZXJlIGV2YWx1YXRlZCB0byBmdWxsCiAgcHJlY2lzaW9uIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gYSAucHkgZmlsZTsgdGhlIHNhbWUgY29kZSBsb2FkZWQgZnJvbSBhCiAgLnB5YyAob3IgLnB5bykgZmlsZSBjb3VsZCBzdWZmZXIgbnVtZXJpYyBkaWZmZXJlbmNlcyBzdGFydGluZyBhdCBhYm91dCB0aGUKICAxMnRoIHNpZ25pZmljYW50IGRlY2ltYWwgZGlnaXQuICBGb3IgZXhhbXBsZSwgb24gYSBtYWNoaW5lIHdpdGggSUVFRS03NTQKICBmbG9hdGluZyBhcml0aG1ldGljLAoKICAgICAgeCA9IDkwMDcxOTkyNTQ3NDA5OTIuMAogICAgICBwcmludCBsb25nKHgpCgogIHByaW50ZWQgOTAwNzE5OTI1NDc0MDk5MiBpZiBydW4gZGlyZWN0bHkgZnJvbSAucHksIGJ1dCA5MDA3MTk5MjU0NzQwMDAwCiAgaWYgZnJvbSBhIGNvbXBpbGVkICgucHljIG9yIC5weW8pIGZpbGUuICBUaGlzIHdhcyBkdWUgdG8gbWFyc2hhbCB1c2luZwogIHN0cihmbG9hdCkgaW5zdGVhZCBvZiByZXByKGZsb2F0KSB3aGVuIGJ1aWxkaW5nIGNvZGUgb2JqZWN0cy4gIG1hcnNoYWwKICBub3cgdXNlcyByZXByKGZsb2F0KSBpbnN0ZWFkLCB3aGljaCBzaG91bGQgcmVwcm9kdWNlIGZsb2F0cyB0byBmdWxsCiAgbWFjaGluZSBwcmVjaXNpb24gKGFzc3VtaW5nIHRoZSBwbGF0Zm9ybSBDIGZsb2F0PC0+c3RyaW5nIEkvTyBjb252ZXJzaW9uCiAgZnVuY3Rpb25zIGFyZSBvZiBnb29kIHF1YWxpdHkpLgoKICBUaGlzIG1heSBjYXVzZSBmbG9hdGluZy1wb2ludCByZXN1bHRzIHRvIGNoYW5nZSBpbiBzb21lIGNhc2VzLCBhbmQKICB1c3VhbGx5IGZvciB0aGUgYmV0dGVyLCBidXQgbWF5IGFsc28gY2F1c2UgbnVtZXJpY2FsbHkgdW5zdGFibGUKICBhbGdvcml0aG1zIHRvIGJyZWFrLgoKLSBUaGUgaW1wbGVtZW50YXRpb24gb2YgZGljdHMgc3VmZmVycyBmZXdlciBjb2xsaXNpb25zLCB3aGljaCBoYXMgc3BlZWQKICBiZW5lZml0cy4gIEhvd2V2ZXIsIHRoZSBvcmRlciBpbiB3aGljaCBkaWN0IGVudHJpZXMgYXBwZWFyIGluIGRpY3Qua2V5cygpLAogIGRpY3QudmFsdWVzKCkgYW5kIGRpY3QuaXRlbXMoKSBtYXkgZGlmZmVyIGZyb20gcHJldmlvdXMgcmVsZWFzZXMgZm9yIGEKICBnaXZlbiBkaWN0LiAgTm90aGluZyBpcyBkZWZpbmVkIGFib3V0IHRoaXMgb3JkZXIsIHNvIG5vIHByb2dyYW0gc2hvdWxkCiAgcmVseSBvbiBpdC4gIE5ldmVydGhlbGVzcywgaXQncyBlYXN5IHRvIHdyaXRlIHRlc3QgY2FzZXMgdGhhdCByZWx5IG9uIHRoZQogIG9yZGVyIGJ5IGFjY2lkZW50LCB0eXBpY2FsbHkgYmVjYXVzZSBvZiBwcmludGluZyB0aGUgc3RyKCkgb3IgcmVwcigpIG9mIGEKICBkaWN0IHRvIGFuICJleHBlY3RlZCByZXN1bHRzIiBmaWxlLiAgU2VlIExpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weSdzIG5ldwogIHNvcnRkaWN0KGRpY3QpIGZ1bmN0aW9uIGZvciBhIHNpbXBsZSB3YXkgdG8gZGlzcGxheSBhIGRpY3QgaW4gc29ydGVkCiAgb3JkZXIuCgotIE1hbnkgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBkaWN0cyB3ZXJlIG1hZGUsIHJlc3VsdGluZyBpbiBmYXN0ZXIKICBvcGVyYXRpb24gYWxvbmcgdGhlIG1vc3QgY29tbW9uIGNvZGUgcGF0aHMuCgotIERpY3Rpb25hcnkgb2JqZWN0cyBub3cgc3VwcG9ydCB0aGUgImluIiBvcGVyYXRvcjogInggaW4gZGljdCIgbWVhbnMKICB0aGUgc2FtZSBhcyBkaWN0Lmhhc19rZXkoeCkuCgotIFRoZSB1cGRhdGUoKSBtZXRob2Qgb2YgZGljdGlvbmFyaWVzIG5vdyBhY2NlcHRzIGdlbmVyaWMgbWFwcGluZwogIG9iamVjdHMuICBTcGVjaWZpY2FsbHkgdGhlIGFyZ3VtZW50IG9iamVjdCBtdXN0IHN1cHBvcnQgdGhlIC5rZXlzKCkKICBhbmQgX19nZXRpdGVtX18oKSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgeW91IHRvIHNheSwgZm9yIGV4YW1wbGUsCiAge30udXBkYXRlKFVzZXJEaWN0KCkpCgotIEl0ZXJhdG9ycyB3ZXJlIGFkZGVkOyB0aGlzIGlzIGEgZ2VuZXJhbGl6ZWQgd2F5IG9mIHByb3ZpZGluZyB2YWx1ZXMKICB0byBhIGZvciBsb29wLiAgU2VlIFBFUCAyMzQuICBUaGVyZSdzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uIGl0ZXIoKQogIHRvIHJldHVybiBhbiBpdGVyYXRvci4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IHRoZSBuZXh0IHZhbHVlCiAgZnJvbSBhbiBpdGVyYXRvciB1c2luZyB0aGUgbmV4dCgpIG1ldGhvZCAoaW4gUHl0aG9uKSBvciB0aGUKICB0cF9pdGVybmV4dCBzbG90IChpbiBDKS4gIFRoZXJlJ3MgYSBuZXcgcHJvdG9jb2wgdG8gZ2V0IGl0ZXJhdG9ycwogIHVzaW5nIHRoZSBfX2l0ZXJfXygpIG1ldGhvZCAoaW4gUHl0aG9uKSBvciB0aGUgdHBfaXRlciBzbG90IChpbiBDKS4KICBJdGVyYXRpbmcgKGkuZS4gYSBmb3IgbG9vcCkgb3ZlciBhIGRpY3Rpb25hcnkgZ2VuZXJhdGVzIGl0cyBrZXlzLgogIEl0ZXJhdGluZyBvdmVyIGEgZmlsZSBnZW5lcmF0ZXMgaXRzIGxpbmVzLgoKLSBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3ZXJlIGdlbmVyYWxpemVkIHRvIHdvcmsgbmljZWx5IHdpdGggaXRlcmF0b3IKICBhcmd1bWVudHM6OgoKICAgIG1hcCgpLCBmaWx0ZXIoKSwgcmVkdWNlKCksIHppcCgpCiAgICBsaXN0KCksIHR1cGxlKCkgKFB5U2VxdWVuY2VfVHVwbGUoKSBhbmQgUHlTZXF1ZW5jZV9GYXN0KCkgaW4gQyBBUEkpCiAgICBtYXgoKSwgbWluKCkKICAgIGpvaW4oKSBtZXRob2Qgb2Ygc3RyaW5ncwogICAgZXh0ZW5kKCkgbWV0aG9kIG9mIGxpc3RzCiAgICAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknIChQeVNlcXVlbmNlX0NvbnRhaW5zKCkgaW4gQyBBUEkpCiAgICBvcGVyYXRvci5jb3VudE9mKCkgKFB5U2VxdWVuY2VfQ291bnQoKSBpbiBDIEFQSSkKICAgIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50IHN0YXRlbWVudHMgd2l0aCBtdWx0aXBsZSB0YXJnZXRzLCBzdWNoIGFzIDo6CiAgICAgICAgeCwgeSwgeiA9IHNvbWVfaXRlcmFibGVfb2JqZWN0X3JldHVybmluZ19leGFjdGx5XzNfdmFsdWVzCgotIEFjY2Vzc2luZyBtb2R1bGUgYXR0cmlidXRlcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZm9yIGV4YW1wbGUsCiAgcmFuZG9tLnJhbmRvbSBvciBvcy5wYXRoIG9yIHlvdXJQeXRob25Nb2R1bGUueW91ckF0dHJpYnV0ZSkuCgotIENvbXBhcmluZyBkaWN0aW9uYXJ5IG9iamVjdHMgdmlhID09IGFuZCAhPSBpcyBmYXN0ZXIsIGFuZCBub3cgd29ya3MgZXZlbgogIGlmIHRoZSBrZXlzIGFuZCB2YWx1ZXMgZG9uJ3Qgc3VwcG9ydCBjb21wYXJpc29ucyBvdGhlciB0aGFuID09LgoKLSBDb21wYXJpbmcgZGljdGlvbmFyaWVzIGluIHdheXMgb3RoZXIgdGhhbiA9PSBhbmQgIT0gaXMgc2xvd2VyOiAgdGhlcmUgd2VyZQogIGluc2VjdXJpdGllcyBpbiB0aGUgZGljdCBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uIHRoYXQgY291bGQgY2F1c2UgUHl0aG9uCiAgdG8gY3Jhc2ggaWYgdGhlIGVsZW1lbnQgY29tcGFyaXNvbiByb3V0aW5lcyBmb3IgdGhlIGRpY3Qga2V5cyBhbmQvb3IKICB2YWx1ZXMgbXV0YXRlZCB0aGUgZGljdHMuICBNYWtpbmcgdGhlIGNvZGUgYnVsbGV0cHJvb2Ygc2xvd2VkIGl0IGRvd24uCgotIENvbGxpc2lvbnMgaW4gZGljdHMgYXJlIHJlc29sdmVkIHZpYSBhIG5ldyBhcHByb2FjaCwgd2hpY2ggY2FuIGhlbHAKICBkcmFtYXRpY2FsbHkgaW4gYmFkIGNhc2VzLiAgRm9yIGV4YW1wbGUsIGxvb2tpbmcgdXAgZXZlcnkga2V5IGluIGEgZGljdAogIGQgd2l0aCBkLmtleXMoKSA9PSBbaSA8PCAxNiBmb3IgaSBpbiByYW5nZSgyMDAwMCldIGlzIGFwcHJveGltYXRlbHkgNTAweAogIGZhc3RlciBub3cuICBUaGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lciBmb3IgcG9pbnRpbmcgb3V0IHRoZSBjYXVzZSBhbmQKICB0aGUgbmF0dXJlIG9mIGFuIGVmZmVjdGl2ZSBjdXJlIChsYXN0IERlY2VtYmVyISBiZXR0ZXIgbGF0ZSB0aGFuIG5ldmVyKS4KCi0gcmVwcigpIGlzIG11Y2ggZmFzdGVyIGZvciBsYXJnZSBjb250YWluZXJzIChkaWN0LCBsaXN0LCB0dXBsZSkuCgoKTGlicmFyeQotLS0tLS0tCgotIFRoZSBjb25zdGFudHMgYXNjaWlfbGV0dGVycywgYXNjaWlfbG93ZXJjYXNlLiBhbmQgYXNjaWlfdXBwZXJjYXNlCiAgd2VyZSBhZGRlZCB0byB0aGUgc3RyaW5nIG1vZHVsZS4gIFRoZXNlIGEgbG9jYWxlLWluZGVwZW5kZW50CiAgY29uc3RhbnRzLCB1bmxpa2UgbGV0dGVycywgbG93ZXJjYXNlLCBhbmQgdXBwZXJjYXNlLiAgVGhlc2UgYXJlIG5vdwogIHVzZSBpbiBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCgotIFRoZSBmbGFncyB1c2VkIGluIGRsb3BlbiBjYWxscyBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgdXNpbmcKICBzeXMuc2V0ZGxvcGVuZmxhZ3MgYW5kIHF1ZXJpZWQgdXNpbmcgc3lzLmdldGRsb3BlbmZsYWdzLgoKLSBGcmVkcmlrIEx1bmRoJ3MgeG1scnBjbGliIGlzIG5vdyBhIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlLiAgVGhpcwogIHByb3ZpZGVzIGZ1bGwgY2xpZW50LXNpZGUgWE1MLVJQQyBzdXBwb3J0LiAgSW4gYWRkaXRpb24sCiAgRGVtby94bWxycGMvIGNvbnRhaW5zIHR3byBzZXJ2ZXIgZnJhbWV3b3JrcyAob25lIFNvY2tldFNlcnZlci1iYXNlZCwKICBvbmUgYXN5bmNvcmUtYmFzZWQpLiAgVGhhbmtzIHRvIEVyaWMgUmF5bW9uZCBmb3IgdGhlIGRvY3VtZW50YXRpb24uCgotIFRoZSB4cmFuZ2UoKSBvYmplY3QgaXMgc2ltcGxpZmllZDogaXQgbm8gbG9uZ2VyIHN1cHBvcnRzIHNsaWNpbmcsCiAgcmVwZXRpdGlvbiwgY29tcGFyaXNvbnMsIGVmZmljaWVudCAnaW4nIGNoZWNraW5nLCB0aGUgdG9saXN0KCkKICBtZXRob2QsIG9yIHRoZSBzdGFydCwgc3RvcCBhbmQgc3RlcCBhdHRyaWJ1dGVzLiAgU2VlIFBFUCAyNjAuCgotIEEgbmV3IGZ1bmN0aW9uIGZubWF0Y2guZmlsdGVyIHRvIGZpbHRlciBsaXN0cyBvZiBmaWxlIG5hbWVzIHdhcyBhZGRlZC4KCi0gY2FsZW5kYXIucHkgdXNlcyBtb250aCBhbmQgZGF5IG5hbWVzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvY2FsZS4KCi0gc3Ryb3AgaXMgbm93ICpyZWFsbHkqIG9ic29sZXRlICh0aGlzIHdhcyBhbm5vdW5jZWQgYmVmb3JlIHdpdGggMS42KSwKICBhbmQgaXNzdWVzIERlcHJlY2F0aW9uV2FybmluZyB3aGVuIHVzZWQgKGV4Y2VwdCBmb3IgdGhlIGZvdXIgaXRlbXMKICB0aGF0IGFyZSBzdGlsbCBpbXBvcnRlZCBpbnRvIHN0cmluZy5weSkuCgotIENvb2tpZS5weSBub3cgc29ydHMga2V5K3ZhbHVlIHBhaXJzIGJ5IGtleSBpbiBvdXRwdXQgc3RyaW5ncy4KCi0gcHByaW50LmlzcmVjdXJzaXZlKG9iamVjdCkgZGlkbid0IGNvcnJlY3RseSBpZGVudGlmeSByZWN1cnNpdmUgb2JqZWN0cy4KICBOb3cgaXQgZG9lcy4KCi0gcHByaW50IGZ1bmN0aW9ucyBub3cgbXVjaCBmYXN0ZXIgZm9yIGxhcmdlIGNvbnRhaW5lcnMgKHR1cGxlLCBsaXN0LCBkaWN0KS4KCi0gTmV3ICdxJyBhbmQgJ1EnIGZvcm1hdCBjb2RlcyBpbiB0aGUgc3RydWN0IG1vZHVsZSwgY29ycmVzcG9uZGluZyB0byBDCiAgdHlwZXMgImxvbmcgbG9uZyIgYW5kICJ1bnNpZ25lZCBsb25nIGxvbmciIChvbiBXaW5kb3dzLCBfX2ludDY0KS4gIEluCiAgbmF0aXZlIG1vZGUsIHRoZXNlIGNhbiBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gQyBjb21waWxlciBzdXBwb3J0cwogIHRoZXNlIHR5cGVzICh3aGVuIEhBVkVfTE9OR19MT05HIGlzICNkZWZpbmUnZCBieSB0aGUgUHl0aG9uIGNvbmZpZwogIHByb2Nlc3MpLCBhbmQgdGhlbiB0aGV5IGluaGVyaXQgdGhlIHNpemVzIGFuZCBhbGlnbm1lbnRzIG9mIHRoZSBDIHR5cGVzLgogIEluIHN0YW5kYXJkIG1vZGUsICdxJyBhbmQgJ1EnIGFyZSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgYW5kIGFyZQogIDgtYnl0ZSBpbnRlZ3JhbCB0eXBlcy4KCi0gVGhlIHNpdGUgbW9kdWxlIGluc3RhbGxzIGEgbmV3IGJ1aWx0LWluIGZ1bmN0aW9uICdoZWxwJyB0aGF0IGludm9rZXMKICBweWRvYy5oZWxwLiAgSXQgbXVzdCBiZSBpbnZva2VkIGFzICdoZWxwKCknOyB3aGVuIGludm9rZWQgYXMgJ2hlbHAnLAogIGl0IGRpc3BsYXlzIGEgbWVzc2FnZSByZW1pbmRpbmcgdGhlIHVzZXIgdG8gdXNlICdoZWxwKCknIG9yCiAgJ2hlbHAob2JqZWN0KScuCgpUZXN0cwotLS0tLQoKLSBOZXcgdGVzdF9tdXRhbnRzLnB5IHJ1bnMgZGljdCBjb21wYXJpc29ucyB3aGVyZSB0aGUga2V5IGFuZCB2YWx1ZQogIGNvbXBhcmlzb24gb3BlcmF0b3JzIG11dGF0ZSB0aGUgZGljdHMgcmFuZG9tbHkgZHVyaW5nIGNvbXBhcmlzb24uICBUaGlzCiAgcmFwaWRseSBjYXVzZXMgUHl0aG9uIHRvIGNyYXNoIHVuZGVyIGVhcmxpZXIgcmVsZWFzZXMgKG5vdCBmb3IgdGhlIGZhaW50CiAgb2YgaGVhcnQ6ICBpdCBjYW4gYWxzbyBjYXVzZSBXaW45eCB0byBmcmVlemUgb3IgcmVib290ISkuCgotIE5ldyB0ZXN0X3BwcmludC5weSB2ZXJpZmllcyB0aGF0IHBwcmludC5pc3JlY3Vyc2l2ZSgpIGFuZAogIHBwcmludC5pc3JlYWRhYmxlKCkgcmV0dXJuIHNlbnNpYmxlIHJlc3VsdHMuICBBbHNvIHZlcmlmaWVzIHRoYXQgc2ltcGxlCiAgY2FzZXMgcHJvZHVjZSBjb3JyZWN0IG91dHB1dC4KCkMgQVBJCi0tLS0tCgotIFJlbW92ZWQgdGhlIHVudXNlZCBsYXN0X2lzX3N0aWNreSBhcmd1bWVudCBmcm9tIHRoZSBpbnRlcm5hbAogIF9QeVR1cGxlX1Jlc2l6ZSgpLiAgSWYgdGhpcyBhZmZlY3RzIHlvdSwgeW91IHdlcmUgY2hlYXRpbmcuCgotLS0tCgoqKihGb3IgaW5mb3JtYXRpb24gYWJvdXQgb2xkZXIgdmVyc2lvbnMsIGNvbnN1bHQgdGhlIEhJU1RPUlkgZmlsZS4pKioK