R05VIG1ha2UgTkVXUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotaW5kZW50ZWQtdGV4dC0qLQogIEhpc3Rvcnkgb2YgdXNlci12aXNpYmxlIGNoYW5nZXMuCiAgMyBKYW51YXJ5IDIwMjAKClNlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgY29weXJpZ2h0cyBhbmQgY29uZGl0aW9ucy4KCkFsbCB1c2VyLXZpc2libGUgY2hhbmdlcyBhcmUgbW9yZSBmdWxseSBkZXNjcmliZWQgaW4gdGhlIEdOVSBtYWtlIG1hbnVhbCwKd2hpY2ggaXMgY29udGFpbmVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGFzIHRoZSBmaWxlIGRvYy9tYWtlLnRleGkuClNlZSB0aGUgUkVBRE1FIGZpbGUgYW5kIHRoZSBHTlUgbWFrZSBtYW51YWwgZm9yIGluc3RydWN0aW9ucyBmb3IKcmVwb3J0aW5nIGJ1Z3MuCgwKVmVyc2lvbiA0LjIuOTMgKDAzIEphbiAyMDIwKQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwOCZzZXQ9Y3VzdG9tCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBOdW1iZXIgc2lnbnMgKCMpIGFwcGVhcmluZyBpbnNpZGUgYSBtYWNybyByZWZlcmVuY2Ugb3IgZnVuY3Rpb24gaW52b2NhdGlvbgogIG5vIGxvbmdlciBpbnRyb2R1Y2UgY29tbWVudHMgYW5kIHNob3VsZCBub3QgYmUgZXNjYXBlZCB3aXRoIGJhY2tzbGFzaGVzOgogIHRodXMgYSBjYWxsIHN1Y2ggYXM6CiAgICBmb28gOj0gJChzaGVsbCBlY2hvICcjJykKICBpcyBsZWdhbC4gIFByZXZpb3VzbHkgdGhlIG51bWJlciBzaWduIG5lZWRlZCB0byBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZToKICAgIGZvbyA6PSAkKHNoZWxsIGVjaG8gJ1wjJykKICBOb3cgdGhpcyBsYXR0ZXIgd2lsbCByZXNvbHZlIHRvICJcIyIuICBJZiB5b3Ugd2FudCB0byB3cml0ZSBtYWtlZmlsZXMKICBwb3J0YWJsZSB0byBib3RoIHZlcnNpb25zLCBhc3NpZ24gdGhlIG51bWJlciBzaWduIHRvIGEgdmFyaWFibGU6CiAgICBIIDo9IFwjCiAgICBmb28gOj0gJChzaGVsbCBlY2hvICckSCcpCiAgVGhpcyB3YXMgY2xhaW1lZCB0byBiZSBmaXhlZCBpbiAzLjgxLCBidXQgd2Fzbid0LCBmb3Igc29tZSByZWFzb24uCiAgVG8gZGV0ZWN0IHRoaXMgY2hhbmdlIHNlYXJjaCBmb3IgJ25vY29tbWVudCcgaW4gdGhlIC5GRUFUVVJFUyB2YXJpYWJsZS4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFByZXZpb3VzbHkgYXBwZW5kaW5nIHVzaW5nICcrPScgdG8gYW4gZW1wdHkgdmFyaWFibGUgd291bGQgcmVzdWx0IGluIGEgdmFsdWUKICBzdGFydGluZyB3aXRoIGEgc3BhY2UuICBOb3cgdGhlIGluaXRpYWwgc3BhY2UgaXMgb25seSBhZGRlZCBpZiB0aGUgdmFyaWFibGUKICBhbHJlYWR5IGNvbnRhaW5zIHNvbWUgdmFsdWUuICBTaW1pbGFybHksIGFwcGVuZGluZyBhbiBlbXB0eSBzdHJpbmcgZG9lcyBub3QKICBhZGQgYSB0cmFpbGluZyBzcGFjZS4KCiogTk9URTogRGVwcmVjYXRlZCBiZWhhdmlvci4KICBDb250cmFyeSB0byB0aGUgZG9jdW1lbnRhdGlvbiwgc3VmZml4IHJ1bGVzIHdpdGggcHJlcmVxdWlzaXRlcyBhcmUgYmVpbmcKICB0cmVhdGVkIEJPVEggYXMgc2ltcGxlIHRhcmdldHMgQU5EIGFzIHBhdHRlcm4gcnVsZXMuICBGdXJ0aGVyLCB0aGUKICBwcmVyZXF1aXNpdGVzIGFyZSBpZ25vcmVkIGJ5IHRoZSBwYXR0ZXJuIHJ1bGVzLiAgUE9TSVggc3BlY2lmaWVzIHRoYXQgaW4KICBvcmRlciB0byBiZSBhIHN1ZmZpeCBydWxlIHRoZXJlIGNhbiBiZSBubyBwcmVyZXF1aXNpdGVzIGRlZmluZWQuICBJbiB0aGlzCiAgcmVsZWFzZSBpZiBQT1NJWCBtb2RlIGlzIGVuYWJsZWQgdGhlbiBydWxlcyB3aXRoIHByZXJlcXVpc2l0ZXMgY2Fubm90IGJlCiAgc3VmZml4IHJ1bGVzLiAgSWYgUE9TSVggbW9kZSBpcyBub3QgZW5hYmxlZCB0aGVuIHRoZSBwcmV2aW91cyBiZWhhdmlvciBpcwogIHByZXNlcnZlZCAoYSBwYXR0ZXJuIHJ1bGUgd2l0aCBubyBleHRyYSBwcmVyZXF1aXNpdGVzIGlzIGNyZWF0ZWQpIEFORCBhCiAgd2FybmluZyBhYm91dCB0aGlzIGJlaGF2aW9yIGlzIGdlbmVyYXRlZDoKICAgIHdhcm5pbmc6IGlnbm9yaW5nIHByZXJlcXVpc2l0ZXMgb24gc3VmZml4IHJ1bGUgZGVmaW5pdGlvbgogIFRoZSBQT1NJWCBiZWhhdmlvciB3aWxsIGJlIGFkb3B0ZWQgYXMgdGhlIG9ubHkgYmVoYXZpb3IgaW4gYSBmdXR1cmUgcmVsZWFzZQogIG9mIEdOVSBtYWtlIHNvIHBsZWFzZSByZXNvbHZlIGFueSB3YXJuaW5ncy4KCiogTmV3IGZlYXR1cmU6IEdyb3VwZWQgZXhwbGljaXQgdGFyZ2V0cwogIFBhdHRlcm4gcnVsZXMgaGF2ZSBhbHdheXMgaGFkIHRoZSBhYmlsaXR5IHRvIGdlbmVyYXRlIG11bHRpcGxlIHRhcmdldHMgd2l0aAogIGEgc2luZ2xlIGludm9jYXRpb24gb2YgdGhlIHJlY2lwZS4gIEl0J3Mgbm93IHBvc3NpYmxlIHRvIGRlY2xhcmUgdGhhdCBhbgogIGV4cGxpY2l0IHJ1bGUgZ2VuZXJhdGVzIG11bHRpcGxlIHRhcmdldHMgd2l0aCBhIHNpbmdsZSBpbnZvY2F0aW9uLiAgVG8gdXNlCiAgdGhpcywgcmVwbGFjZSB0aGUgIjoiIHRva2VuIHdpdGggIiY6IiBpbiB0aGUgcnVsZS4gIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUKICBzZWFyY2ggZm9yICdncm91cGVkLXRhcmdldCcgaW4gdGhlIC5GRUFUVVJFUyBzcGVjaWFsIHZhcmlhYmxlLgogIEltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IEtheiBLeWxoZWt1IDxrYXpAa3lsaGVrdS5jb20+CgoqIE5ldyBmZWF0dXJlOiAuRVhUUkFfUFJFUkVRUyB2YXJpYWJsZQogIFdvcmRzIGluIHRoaXMgdmFyaWFibGUgYXJlIGNvbnNpZGVyZWQgcHJlcmVxdWlzaXRlcyBvZiB0YXJnZXRzIGJ1dCB0aGV5IGFyZQogIG5vdCBhZGRlZCB0byBhbnkgb2YgdGhlIGF1dG9tYXRpYyB2YXJpYWJsZSB2YWx1ZXMgd2hlbiBleHBhbmRpbmcgdGhlCiAgcmVjaXBlLiAgVGhpcyB2YXJpYWJsZSBjYW4gZWl0aGVyIGJlIGdsb2JhbCAoYXBwbGllcyB0byBhbGwgdGFyZ2V0cykgb3IKICBhIHRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZS4gIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUgc2VhcmNoIGZvciAnZXh0cmEtcHJlcmVxcycKICBpbiB0aGUgLkZFQVRVUkVTIHNwZWNpYWwgdmFyaWFibGUuCiAgSW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgQ2hyaXN0b2YgV2FybGljaCA8Y3dhcmxpY2hAZ214LmRlPgoKKiBNYWtlZmlsZXMgY2FuIG5vdyBzcGVjaWZ5IHRoZSAnLWonIG9wdGlvbiBpbiB0aGVpciBNQUtFRkxBR1MgdmFyaWFibGUgYW5kCiAgdGhpcyB3aWxsIGNhdXNlIG1ha2UgdG8gZW5hYmxlIHRoYXQgcGFyYWxsZWxpc20gbW9kZS4KCiogR05VIG1ha2Ugd2lsbCBub3cgdXNlIHBvc2l4X3NwYXduKCkgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBhdmFpbGFibGUuCiAgSWYgeW91IHByZWZlciB0byB1c2UgZm9yay9leGVjIGV2ZW4gb24gc3lzdGVtcyB3aGVyZSBwb3NpeF9zcGF3bigpIGlzCiAgcHJlc2VudCwgeW91IGNhbiB1c2UgdGhlIC0tZGlzYWJsZS1wb3NpeC1zcGF3biBvcHRpb24gdG8gY29uZmlndXJlLgogIEltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IEFyb24gQmFyYXRoIDxiYXJhdGhhcm9uQGNhZXNhci5lbHRlLmh1PgoKKiBFcnJvciBtZXNzYWdlcyBwcmludGVkIHdoZW4gaW52b2tpbmcgbm9uLWV4aXN0ZW50IGNvbW1hbmRzIGhhdmUgYmVlbiBjbGVhbmVkCiAgdXAgYW5kIG1hZGUgY29uc2lzdGVudC4KCiogVGhlIHByZXZpb3VzIGxpbWl0IG9mIDYzIGpvYnMgdW5kZXIgLWpOIG9uIE1TLVdpbmRvd3MgaXMgbm93CiAgaW5jcmVhc2VkIHRvIDQwOTUuICBUaGF0IGxpbWl0IGluY2x1ZGVzIHRoZSBzdWJwcm9jZXNzIHN0YXJ0ZWQgYnkKICB0aGUgJChzaGVsbCkgZnVuY3Rpb24uCgoqIEEgbmV3IG9wdGlvbiAtLW5vLXNpbGVudCBoYXMgYmVlbiBhZGRlZCwgdGhhdCBjYW5jZWxzIHRoZSBlZmZlY3Qgb2YgdGhlCiAgLXMvLS1zaWxlbnQvLS1xdWlldCBmbGFnLgoKKiBBIG5ldyBvcHRpb24gLUUgaGFzIGJlZW4gYWRkZWQgYXMgYSBzaG9ydCBhbGlhcyBmb3IgLS1ldmFsLgoKKiBBbGwgd2lsZGNhcmQgZXhwYW5zaW9uIHdpdGhpbiBHTlUgbWFrZSwgaW5jbHVkaW5nICQod2lsZGNhcmQgLi4uKSwgd2lsbCBzb3J0CiAgdGhlIHJlc3VsdHMuICBTZWUgaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwPzUyMDc2CgoqIEludGVyb3BlcmF0ZSB3aXRoIG5ld2VyIEdOVSBsaWJjIGFuZCBtdXNsIEMgcnVudGltZSBsaWJyYXJpZXMuCgoqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBwcm92aWRlZCBieSBQYW9sbyBCb256aW5pIDxwYm9uemluaUByZWRoYXQuY29tPgoKR05VIG1ha2UgRGV2ZWxvcGVyIE5ld3MKCiogSW1wb3J0IHRoZSBHTlUgc3RhbmRhcmQgYm9vdHN0cmFwIHNjcmlwdCB0byByZXBsYWNlIHRoZSBoYW5kLXJvbGxlZAogICJtYWtlIHVwZGF0ZSIgbWV0aG9kIGZvciBidWlsZGluZyBjb2RlIGZyb20gYSBHTlUgbWFrZSBHaXQgcmVwb3NpdG9yeS4KCiogUmV3b3JrIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIHRvIG1vdmUgc291cmNlIGZpbGVzIGludG8gdGhlIHNyYy8qCiAgc3ViZGlyZWN0b3J5LiAgVGhpcyBhbGlnbnMgd2l0aCBtb2Rlcm4gYmVzdCBwcmFjdGljZXMgaW4gR05VLgoKKiBSZXBsYWNlIGxvY2FsIHBvcnRhYmlsaXR5IGNvZGUgd2l0aCBHbnVsaWIgY29udGVudC4gIFVuZm9ydHVuYXRlbHkgZHVlIHRvIGEKICBwcm9ibGVtIHdpdGggR251bGliIHN1cHBvcnQgZm9yIGdldGxvYWRhdmcsIHRoaXMgZm9yY2VzIGEgcmVxdWlyZW1lbnQgb24KICBBdXRvbWFrZSAxLjE2IG9yIGFib3ZlIGluIG9yZGVyIHRvIGJ1aWxkIGZyb20gR2l0LiAgU2VlIFJFQURNRS5naXQuCgoMClZlcnNpb24gNC4yLjEgKDEwIEp1biAyMDE2KQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwNyZzZXQ9Y3VzdG9tCgpUaGlzIHJlbGVhc2UgaXMgYSBidWctZml4IHJlbGVhc2UuCgoMClZlcnNpb24gNC4yICgyMiBNYXkgMjAxNikKCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCmh0dHA6Ly9zdi5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDYmc2V0PWN1c3RvbQoKKiBOZXcgdmFyaWFibGU6ICQoLlNIRUxMU1RBVFVTKSBpcyBzZXQgdG8gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBsYXN0ICE9IG9yCiAgJChzaGVsbCAuLi4pIGZ1bmN0aW9uIGludm9rZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiBtYWtlLiAgVGhpcyB3aWxsIGJlICIwIiBpZgogIHN1Y2Nlc3NmdWwgb3Igbm90ICIwIiBpZiBub3Qgc3VjY2Vzc2Z1bC4gIFRoZSB2YXJpYWJsZSB2YWx1ZSBpcyB1bnNldCBpZiBubwogICE9IG9yICQoc2hlbGwgLi4uKSBmdW5jdGlvbiBoYXMgYmVlbiBpbnZva2VkLgoKKiBUaGUgJChmaWxlIC4uLikgZnVuY3Rpb24gY2FuIG5vdyByZWFkIGZyb20gYSBmaWxlIHdpdGggJChmaWxlIDxGSUxFKS4KICBUaGUgZnVuY3Rpb24gaXMgZXhwYW5kZWQgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlLiAgVGhlIGNvbnRlbnRzIGFyZQogIGV4cGFuZGVkIHZlcmJhdGltIGV4Y2VwdCB0aGF0IHRoZSBmaW5hbCBuZXdsaW5lLCBpZiBhbnksIGlzIHN0cmlwcGVkLgoKKiBUaGUgbWFrZWZpbGUgbGluZSBudW1iZXJzIHNob3duIGJ5IEdOVSBtYWtlIG5vdyBwb2ludCBkaXJlY3RseSB0byB0aGUKICBzcGVjaWZpYyBsaW5lIGluIHRoZSByZWNpcGUgd2hlcmUgdGhlIGZhaWx1cmUgb3Igd2FybmluZyBvY2N1cnJlZC4KICBTYW1wbGUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgQnJpYW4gVmFuZGVuYmVyZyA8cGhhbnRhbGxAZ21haWwuY29tPgoKKiBUaGUgaW50ZXJmYWNlIHRvIEdOVSBtYWtlJ3MgImpvYnNlcnZlciIgaXMgc3RhYmxlIGFzIGRvY3VtZW50ZWQgaW4gdGhlCiAgbWFudWFsLCBmb3IgdG9vbHMgd2hpY2ggbWF5IHdhbnQgdG8gYWNjZXNzIGl0LgoKICBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhIFRoZSBpbnRlcm5hbC1vbmx5IGNvbW1hbmQgbGluZSBvcHRpb24KICAtLWpvYnNlcnZlci1mZHMgaGFzIGJlZW4gcmVuYW1lZCBmb3IgcHVibGlzaGluZywgdG8gLS1qb2JzZXJ2ZXItYXV0aC4KCiogVGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBjYW4gYmUgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyBNQUtFRkxBR1MsIGV2ZW4gd2hlbgogIHRoZSBqb2Igc2VydmVyIGlzIGVuYWJsZWQgKHByZXZpb3VzbHkgTUFLRUZMQUdTIHdvdWxkIGFsd2F5cyBjb250YWluIG9ubHkKICAiLWoiLCB3aXRoIG5vIG51bWJlciwgd2hlbiBqb2Igc2VydmVyIHdhcyBlbmFibGVkKS4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogUGVybCB0ZXN0IGhhcm5lc3Mgbm93IHdvcmtzLgoKICAqIEZ1bGwgc3VwcG9ydCBmb3IgY29udmVydGluZyBVbml4IGV4aXQgc3RhdHVzIGNvZGVzIHRvIFZNUyBleGl0IHN0YXR1cwogICAgY29kZXMuICBCQUNLV0FSRCBJTkNPTVBBVElCSUxJVFkgTm90aWNlOiBPbiBhIGNoaWxkIGZhaWx1cmUgdGhlIFZNUyBleGl0CiAgICBjb2RlIGlzIG5vdyB0aGUgZW5jb2RlZCBVbml4IGV4aXQgc3RhdHVzIHRoYXQgTWFrZSB1c3VhbGx5IGdlbmVyYXRlcywgbm90CiAgICB0aGUgVk1TIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZC4KCgwKVmVyc2lvbiA0LjEgKDA1IE9jdCAyMDE0KQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwNSZzZXQ9Y3VzdG9tCgoqIE5ldyB2YXJpYWJsZXM6ICQoTUFLRV9URVJNT1VUKSBhbmQgJChNQUtFX1RFUk1FUlIpIGFyZSBzZXQgdG8gbm9uLWVtcHR5CiAgdmFsdWVzIGlmIHN0ZG91dCBvciBzdGRlcnIsIHJlc3BlY3RpdmVseSwgYXJlIGJlbGlldmVkIHRvIGJlIHdyaXRpbmcgdG8gYQogIHRlcm1pbmFsLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LgoKKiBBbGxvdyBhIG5vLXRleHQtYXJndW1lbnQgZm9ybSBvZiB0aGUgJChmaWxlIC4uLikgZnVuY3Rpb24uICBXaXRob3V0IGEgdGV4dAogIGFyZ3VtZW50IG5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgZmlsZTogaXQgaXMgc2ltcGx5IG9wZW5lZCBpbiB0aGUKICByZXF1ZXN0ZWQgbW9kZSwgdGhlbiBjbG9zZWQgYWdhaW4uCgoqIENoYW5nZSB0aGUgZmF0YWwgZXJyb3IgZm9yIG1peGVkIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBydWxlcywgdGhhdCB3YXMKICBpbnRyb2R1Y2VkIGluIEdOVSBtYWtlIDMuODIsIHRvIGEgbm9uLWZhdGFsIGVycm9yLiAgSG93ZXZlciwgdGhpcyBzeW50YXggaXMKICBzdGlsbCBkZXByZWNhdGVkIGFuZCBtYXkgcmV0dXJuIHRvIGJlaW5nIGlsbGVnYWwgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBHTlUKICBtYWtlLiAgTWFrZWZpbGVzIHRoYXQgcmVseSBvbiB0aGlzIHN5bnRheCBzaG91bGQgYmUgZml4ZWQuCiAgU2VlIGh0dHBzOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzLz8zMzAzNAoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBTdXBwb3J0IGZvciBsaWJyYXJ5IGZpbGVzIGFkZGVkLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIEdOViBhcgogICAgdXRpbGl0eS4KCiAgKiBQYXJ0aWFsIHN1cHBvcnQgZm9yIHByb3Blcmx5IGVuY29kaW5nIFVuaXggZXhpdCBzdGF0dXMgY29kZXMgaW50byBWTVMgZXhpdAogICAgc3RhdHVzIGNvZGVzLgoKICAgIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEgVGhlc2UgYXJlIGRpZmZlcmVudCBleGl0IHN0YXR1cyBjb2RlcwogICAgdGhhbiBNYWtlIGV4aXRlZCB3aXRoIGluIHRoZSBwYXN0LgoKICAqIE1hY3JvcyB0byBob2xkIHRoZSBjdXJyZW50IG1ha2UgY29tbWFuZCBhcmUgc2V0IHVwIHRvIHRyYW5zbGF0ZSB0aGUKICAgIGFyZ3ZbMF0gc3RyaW5nIHRvIGEgVk1TIGZvcm1hdCBwYXRoIG5hbWUgYW5kIHByZWZpeCBpdCB3aXRoICJNQ1IgIiBzbyB0aGF0CiAgICB0aGUgbWFjcm8gaGFzIGEgc3BhY2UgaW4gaXQuCgogICAgV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5ISAgVGhpcyBtYXkgYnJlYWsgY29tcGxleCBtYWtlZmlsZXMgdGhhdAogICAgZG8gcHJvY2Vzc2luZyBvbiB0aG9zZSBtYWNyb3MuICBUaGlzIGlzIHVubGlrZWx5IGJlY2F1c2Ugc28gbXVjaCBpbiB0aGF0CiAgICBhcmVhIHdhcyBub3QgYW5kIGlzIHN0aWxsIG5vdCBjdXJyZW50bHkgd29ya2luZyBvbiBWTVMsIGl0IGlzIHVubGlrZWx5IHRvCiAgICBmaW5kIHN1Y2ggYSBjb21wbGV4IG1ha2VmaWxlLCBzbyB0aGlzIGlzIG1vcmUgbGlrZWx5IHRvIGltcGFjdAogICAgY29uc3RydWN0aW9uIG9mIGEgZnV0dXJlIG1ha2VmaWxlLgoKICAqIEEgY29tbWFuZCBmaWxlIGlzIGFsd2F5cyB1c2VkIHRvIHJ1biB0aGUgY29tbWFuZHMgZm9yIGEgcmVjaXBlLgoKICAgIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEgIFJ1bm5pbmcgdGhlIG1ha2Ugc2VsZiB0ZXN0cyBoYXMKICAgIGV4cG9zZWQgdGhhdCB0aGVyZSBhcmUgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3Igd2hlbiBydW5uaW5nCiAgICB3aXRoIHRoZSBjb21tYW5kIGZpbGUgbW9kZS4gIEl0IGlzIHVua25vd24gaWYgdGhpcyB3aWxsIGJlIG5vdGljZWQgYnkgbW9zdAogICAgZXhpc3RpbmcgVk1TIG1ha2VmaWxlcy4KDApWZXJzaW9uIDQuMCAoMDkgT2N0IDIwMTMpCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgpodHRwOi8vc3YuZ251Lm9yZy9idWdzL2luZGV4LnBocD9ncm91cD1tYWtlJnJlcG9ydF9pZD0xMTEmZml4X3JlbGVhc2VfaWQ9MTAxJnNldD1jdXN0b20KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIElmIC5QT1NJWCBpcyBzcGVjaWZpZWQsIHRoZW4gbWFrZSBhZGhlcmVzIHRvIHRoZSBQT1NJWCBiYWNrc2xhc2gvbmV3bGluZQogIGhhbmRsaW5nIHJlcXVpcmVtZW50cywgd2hpY2ggaW50cm9kdWNlcyB0aGUgZm9sbG93aW5nIGNoYW5nZXMgdG8gdGhlCiAgc3RhbmRhcmQgYmFja3NsYXNoL25ld2xpbmUgaGFuZGxpbmcgaW4gbm9uLXJlY2lwZSBsaW5lczoKICAqIEFueSB0cmFpbGluZyBzcGFjZSBiZWZvcmUgdGhlIGJhY2tzbGFzaCBpcyBwcmVzZXJ2ZWQKICAqIEVhY2ggYmFja3NsYXNoL25ld2xpbmUgKHBsdXMgc3Vic2VxdWVudCB3aGl0ZXNwYWNlKSBpcyBjb252ZXJ0ZWQgdG8gYQogICAgc2luZ2xlIHNwYWNlCgoqIE5ldyBmZWF0dXJlOiBHTlUgR3VpbGUgaW50ZWdyYXRpb24KICBUaGlzIHZlcnNpb24gb2YgR05VIG1ha2UgY2FuIGJlIGNvbXBpbGVkIHdpdGggR05VIEd1aWxlIGludGVncmF0aW9uLgogIEdOVSBHdWlsZSBzZXJ2ZXMgYXMgYW4gZW1iZWRkZWQgZXh0ZW5zaW9uIGxhbmd1YWdlIGZvciBtYWtlLgogIFNlZSB0aGUgIkd1aWxlIEZ1bmN0aW9uIiBzZWN0aW9uIGluIHRoZSBHTlUgTWFrZSBtYW51YWwgZm9yIGRldGFpbHMuCiAgQ3VycmVudGx5IEdOVSBHdWlsZSAxLjggYW5kIDIuMCsgYXJlIHN1cHBvcnRlZC4gIEluIEd1aWxlIDEuOCB0aGVyZSBpcyBubwogIHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWxpemVkIGNoYXJhY3RlciBzZXRzLiAgSW4gR3VpbGUgMi4wKywgc2NyaXB0cyBjYW4gYmUKICBlbmNvZGVkIGluIFVURi04LgoKKiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLS1vdXRwdXQtc3luYyAoLU8pIGVuYWJsZXMgZ3JvdXBpbmcgb2Ygb3V0cHV0IGJ5CiAgdGFyZ2V0IG9yIGJ5IHJlY3Vyc2l2ZSBtYWtlLiAgVGhpcyBpcyB1c2VmdWwgZHVyaW5nIHBhcmFsbGVsIGJ1aWxkcyB0byBhdm9pZAogIG1peGluZyBvdXRwdXQgZnJvbSBkaWZmZXJlbnQgam9icyB0b2dldGhlciBnaXZpbmcgaGFyZC10by11bmRlcnN0YW5kCiAgcmVzdWx0cy4gIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGJ5IERhdmlkIEJveWNlIDxkc2JAYm95c2tpLmNvbT4uCiAgUmV3b3JrZWQgYW5kIGVuaGFuY2VkIGJ5IEZyYW5rIEhlY2tlbmJhY2ggPGYuaGVja2VuYmFjaEBmaC1zb2Z0LmRlPi4KICBXaW5kb3dzIHN1cHBvcnQgYnkgRWxpIFphcmV0c2tpaSA8ZWxpekBnbnUub3JnPi4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC0tdHJhY2UgZW5hYmxlcyB0cmFjaW5nIG9mIHRhcmdldHMuICBXaGVuIGVuYWJsZWQKICB0aGUgcmVjaXBlIHRvIGJlIGludm9rZWQgaXMgcHJpbnRlZCBldmVuIGlmIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBzdXBwcmVzc2VkCiAgYnkgLlNJTEVOVCBvciBhICJAIiBwcmVmaXggY2hhcmFjdGVyLiAgQWxzbyBiZWZvcmUgZWFjaCByZWNpcGUgaXMgcnVuIHRoZQogIG1ha2VmaWxlIG5hbWUgYW5kIGxpbmVudW1iZXIgd2hlcmUgaXQgd2FzIGRlZmluZWQgYXJlIHNob3duIGFzIHdlbGwgYXMgdGhlCiAgcHJlcmVxdWlzaXRlcyB0aGF0IGNhdXNlZCB0aGUgdGFyZ2V0IHRvIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUuCgoqIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIGFyZ3VtZW50OiAtLWRlYnVnIG5vdyBhY2NlcHRzIGEgIm4iIChub25lKSBmbGFnCiAgd2hpY2ggZGlzYWJsZXMgYWxsIGRlYnVnZ2luZyBzZXR0aW5ncyB0aGF0IGFyZSBjdXJyZW50bHkgZW5hYmxlZC4KCiogTmV3IGZlYXR1cmU6IFRoZSAiam9iIHNlcnZlciIgY2FwYWJpbGl0eSBpcyBub3cgc3VwcG9ydGVkIG9uIFdpbmRvd3MuCiAgSW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgVHJveSBSdW5rZWwgPFRyb3kuUnVua2VsQG1hdGh3b3Jrcy5jb20+CgoqIE5ldyBmZWF0dXJlOiBUaGUgLk9ORVNIRUxMIGNhcGFiaWxpdHkgaXMgbm93IHN1cHBvcnRlZCBvbiBXaW5kb3dzLiAgU3VwcG9ydAogIGFkZGVkIGJ5IEVsaSBaYXJldHNraWkgPGVsaXpAZ251Lm9yZz4uCgoqIE5ldyBmZWF0dXJlOiAiIT0iIHNoZWxsIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlCiAgJChzaGVsbCAuLi4pIGZ1bmN0aW9uLiAgSW1wbGVtZW50ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBCU0QgbWFrZWZpbGVzLgogIE5vdGUgdGhlcmUgYXJlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuICIhPSIgYW5kICQoc2hlbGwgLi4uKS4gIFNlZSB0aGUKICBkZXNjcmlwdGlvbiBpbiB0aGUgR05VIG1ha2UgbWFudWFsLgogIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBWYXJpYWJsZXMgZW5kaW5nIGluICIhIiBwcmV2aW91c2x5IGRlZmluZWQgYXMgInZhcmlhYmxlIT0gdmFsdWUiIHdpbGwgbm93IGJlCiAgaW50ZXJwcmV0ZWQgYXMgc2hlbGwgYXNzaWdubWVudC4gIENoYW5nZSB5b3VyIGFzc2lnbm1lbnQgdG8gYWRkIHdoaXRlc3BhY2UKICBiZXR3ZWVuIHRoZSAiISIgYW5kICI9IjogInZhcmlhYmxlISA9IHZhbHVlIgoKKiBOZXcgZmVhdHVyZTogIjo6PSIgc2ltcGxlIGFzc2lnbm1lbnQgb3BlcmF0b3IgYXMgZGVmaW5lZCBieSBQT1NJWCBpbiAyMDEyLgogIFRoaXMgb3BlcmF0b3IgaGFzIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IHRvICI6PSIgaW4gR05VIG1ha2UsIGJ1dCB3aWxsIGJlCiAgcG9ydGFibGUgdG8gYW55IGltcGxlbWVudGF0aW9uIG9mIG1ha2UgY29uZm9ybWluZyB0byBhIHN1ZmZpY2llbnRseSBuZXcKICB2ZXJzaW9uIG9mIFBPU0lYIChzZWUgaHR0cDovL2F1c3Rpbmdyb3VwYnVncy5uZXQvdmlldy5waHA/aWQ9MzMwKS4gIEl0IGlzCiAgbm90IG5lY2Vzc2FyeSB0byBkZWZpbmUgdGhlIC5QT1NJWCB0YXJnZXQgdG8gYWNjZXNzIHRoaXMgb3BlcmF0b3IuCgoqIE5ldyBmZWF0dXJlOiBMb2FkYWJsZSBvYmplY3RzCiAgVGhpcyB2ZXJzaW9uIG9mIEdOVSBtYWtlIGNvbnRhaW5zIGEgInRlY2hub2xvZ3kgcHJldmlldyI6IHRoZSBhYmlsaXR5IHRvCiAgbG9hZCBkeW5hbWljIG9iamVjdHMgaW50byB0aGUgbWFrZSBydW50aW1lLiAgVGhlc2Ugb2JqZWN0cyBjYW4gYmUgY3JlYXRlZCBieQogIHRoZSB1c2VyIGFuZCBjYW4gYWRkIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHksIHVzYWJsZSBieSBtYWtlZmlsZXMuCgoqIE5ldyBmdW5jdGlvbjogJChmaWxlIC4uLikgd3JpdGVzIHRvIGEgZmlsZS4KCiogTmV3IHZhcmlhYmxlOiAkKEdOVU1BS0VGTEFHUykgd2lsbCBiZSBwYXJzZWQgZm9yIG1ha2UgZmxhZ3MsIGp1c3QgbGlrZQogIE1BS0VGTEFHUyBpcy4gIEl0IGNhbiBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50IG9yIHRoZSBtYWtlZmlsZSwgY29udGFpbmluZwogIEdOVSBtYWtlLXNwZWNpZmljIGZsYWdzIHRvIGFsbG93IHlvdXIgbWFrZWZpbGUgdG8gYmUgcG9ydGFibGUgdG8gb3RoZXIKICB2ZXJzaW9ucyBvZiBtYWtlLiAgT25jZSB0aGlzIHZhcmlhYmxlIGlzIHBhcnNlZCwgR05VIG1ha2Ugd2lsbCBzZXQgaXQgdG8gdGhlCiAgZW1wdHkgc3RyaW5nIHNvIHRoYXQgZmxhZ3Mgd2lsbCBub3QgYmUgZHVwbGljYXRlZCBvbiByZWN1cnNpb24uCgoqIE5ldyB2YXJpYWJsZTogYE1BS0VfSE9TVCcgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIGhvc3QgYXJjaGl0ZWN0dXJlCiAgbWFrZSB3YXMgY29tcGlsZWQgZm9yLiAgVGhpcyBpcyB0aGUgc2FtZSB2YWx1ZSB5b3Ugc2VlIGFmdGVyICdCdWlsdCBmb3InCiAgd2hlbiBydW5uaW5nICdtYWtlIC0tdmVyc2lvbicuCgoqIEJlaGF2aW9yIG9mIE1BS0VGTEFHUyBhbmQgTUZMQUdTIGlzIG1vcmUgcmlnb3JvdXNseSBkZWZpbmVkLiAgQWxsIHNpbXBsZQogIGZsYWdzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluIHRoZSBmaXJzdCB3b3JkIG9mIE1BS0VGTEFHUy4gIE5vIG9wdGlvbnMgdGhhdAogIGFjY2VwdCBhcmd1bWVudHMgYXBwZWFyIGluIHRoZSBmaXJzdCB3b3JkLiAgSWYgbm8gc2ltcGxlIGZsYWdzIGFyZSBwcmVzZW50CiAgTUFLRUZMQUdTIGJlZ2lucyB3aXRoIGEgc3BhY2UuICBGbGFncyB3aXRoIGJvdGggc2hvcnQgYW5kIGxvbmcgdmVyc2lvbnMKICBhbHdheXMgdXNlIHRoZSBzaG9ydCB2ZXJzaW9ucyBpbiBNQUtFRkxBR1MuICBGbGFncyBhcmUgbGlzdGVkIGluCiAgYWxwaGFiZXRpY2FsIG9yZGVyIHVzaW5nIEFTQ0lJIG9yZGVyaW5nLiAgTUZMQUdTIG5ldmVyIGJlZ2lucyB3aXRoICItICIuCgoqIFNldHRpbmcgdGhlIC1yIGFuZCAtUiBvcHRpb25zIGluIE1BS0VGTEFHUyBpbnNpZGUgYSBtYWtlZmlsZSBub3cgd29ya3MgYXMKICBleHBlY3RlZCwgcmVtb3ZpbmcgYWxsIGJ1aWx0LWluIHJ1bGVzIGFuZCB2YXJpYWJsZXMsIHJlc3BlY3RpdmVseS4KCiogSWYgYSByZWNpcGUgZmFpbHMsIHRoZSBtYWtlZmlsZSBuYW1lIGFuZCBsaW5lbnVtYmVyIG9mIHRoZSByZWNpcGUgYXJlIHNob3duLgoKKiBBIC5SRUNJUEVQUkVGSVggc2V0dGluZyBpcyByZW1lbWJlcmVkIHBlci1yZWNpcGUgYW5kIHZhcmlhYmxlcyBleHBhbmRlZAogIGluIHRoYXQgcmVjaXBlIGFsc28gdXNlIHRoYXQgcmVjaXBlIHByZWZpeCBzZXR0aW5nLgoKKiBJbiAtcCBvdXRwdXQsIC5SRUNJUEVQUkVGSVggc2V0dGluZ3MgYXJlIHNob3duIGFuZCBhbGwgdGFyZ2V0LXNwZWNpZmljCiAgdmFyaWFibGVzIGFyZSBvdXRwdXQgYXMgaWYgaW4gYSBtYWtlZmlsZSwgaW5zdGVhZCBvZiBhcyBjb21tZW50cy4KCiogT24gTVMtV2luZG93cywgcmVjaXBlcyB0aGF0IHVzZSAiLi4iIHF1b3Rpbmcgd2lsbCBubyBsb25nZXIgZm9yY2UKICBpbnZvY2F0aW9uIG9mIGNvbW1hbmRzIHZpYSB0ZW1wb3JhcnkgYmF0Y2ggZmlsZXMgYW5kIHN0b2NrIFdpbmRvd3MKICBzaGVsbHMsIHRoZXkgd2lsbCBiZSBzaG9ydC1jaXJjdWl0ZWQgYW5kIGludm9rZWQgZGlyZWN0bHkuICAoSW4KICBvdGhlciB3b3JkcywgIiBpcyBubyBsb25nZXIgYSBzcGVjaWFsIGNoYXJhY3RlciBmb3Igc3RvY2sgV2luZG93cwogIHNoZWxscy4pICBUaGlzIGF2b2lkcyBoaXR0aW5nIHNoZWxsIGxpbWl0cyBmb3IgY29tbWFuZCBsZW5ndGggd2hlbgogIHF1b3RlcyBhcmUgdXNlZCwgYnV0IG5vdGhpbmcgZWxzZSBpbiB0aGUgY29tbWFuZCByZXF1aXJlcyB0aGUgc2hlbGwuCiAgVGhpcyBjaGFuZ2UgY291bGQgcG90ZW50aWFsbHkgbWVhbiBzb21lIG1pbm9yIGluY29tcGF0aWJpbGl0aWVzIGluCiAgYmVoYXZpb3Igd2hlbiB0aGUgcmVjaXBlIHVzZXMgcXVvdGVkIHN0cmluZyBvbiBzaGVsbCBjb21tYW5kIGxpbmVzLgoKDApWZXJzaW9uIDMuODIgKDI4IEp1bCAyMDEwKQoKQSBjb21wbGV0ZSBsaXN0IG9mIGJ1Z3MgZml4ZWQgaW4gdGhpcyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBoZXJlOgoKaHR0cDovL3N2LmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwNCZzZXQ9Y3VzdG9tCgoqIENvbXBpbGluZyBHTlUgbWFrZSBub3cgcmVxdWlyZXMgYSBjb25mb3JtaW5nIElTTyBDIDE5ODkgY29tcGlsZXIgYW5kCiAgc3RhbmRhcmQgcnVudGltZSBsaWJyYXJ5LgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlIFBPU0lYIHN0YW5kYXJkIGZvciBtYWtlIHdhcyBjaGFuZ2VkIGluIHRoZSAyMDA4IHZlcnNpb24gaW4gYQogIGZ1bmRhbWVudGFsbHkgaW5jb21wYXRpYmxlIHdheTogbWFrZSBpcyByZXF1aXJlZCB0byBpbnZva2UgdGhlIHNoZWxsIGFzIGlmCiAgdGhlICctZScgZmxhZyB3ZXJlIHByb3ZpZGVkLiAgQmVjYXVzZSB0aGlzIHdvdWxkIGJyZWFrIG1hbnkgbWFrZWZpbGVzIHRoYXQKICBoYXZlIGJlZW4gd3JpdHRlbiB0byBjb25mb3JtIHRvIHRoZSBvcmlnaW5hbCB0ZXh0IG9mIHRoZSBzdGFuZGFyZCwgdGhlCiAgZGVmYXVsdCBiZWhhdmlvciBvZiBHTlUgbWFrZSByZW1haW5zIHRvIGludm9rZSB0aGUgc2hlbGwgd2l0aCBzaW1wbHkgJy1jJy4KICBIb3dldmVyLCBhbnkgbWFrZWZpbGUgc3BlY2lmeWluZyB0aGUgLlBPU0lYIHNwZWNpYWwgdGFyZ2V0IHdpbGwgZm9sbG93IHRoZQogIG5ldyBQT1NJWCBzdGFuZGFyZCBhbmQgcGFzcyAnLWUnIHRvIHRoZSBzaGVsbC4gIFNlZSBhbHNvIC5TSEVMTEZMQUdTCiAgYmVsb3cuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBUaGUgJyQ/JyB2YXJpYWJsZSBub3cgY29udGFpbnMgYWxsIHByZXJlcXVpc2l0ZXMgdGhhdCBjYXVzZWQgdGhlIHRhcmdldCB0bwogIGJlIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUsIGV2ZW4gaWYgdGhleSBkbyBub3QgZXhpc3QgKHByZXZpb3VzbHkgb25seQogIGV4aXN0aW5nIHRhcmdldHMgd2VyZSBwcm92aWRlZCBpbiAkPykuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBXaWxkY2FyZHMgd2VyZSBub3QgZG9jdW1lbnRlZCBhcyByZXR1cm5pbmcgc29ydGVkIHZhbHVlcywgYnV0IHRoZSByZXN1bHRzCiAgaGF2ZSBiZWVuIHNvcnRlZCB1cCB1bnRpbCB0aGlzIHJlbGVhc2UuLiAgSWYgeW91ciBtYWtlZmlsZXMgcmVxdWlyZSBzb3J0ZWQKICByZXN1bHRzIGZyb20gd2lsZGNhcmQgZXhwYW5zaW9ucywgdXNlIHRoZSAkKHNvcnQgLi4uKSAgZnVuY3Rpb24gdG8gcmVxdWVzdAogIGl0IGV4cGxpY2l0bHkuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBBcyBhIHJlc3VsdCBvZiBwYXJzZXIgZW5oYW5jZW1lbnRzLCB0aHJlZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IGlzc3VlcwogIGV4aXN0OiBmaXJzdCwgYSBwcmVyZXF1aXNpdGUgY29udGFpbmluZyBhbiAiPSIgY2Fubm90IGJlIGVzY2FwZWQgd2l0aCBhCiAgYmFja3NsYXNoIGFueSBsb25nZXIuICBZb3UgbXVzdCBjcmVhdGUgYSB2YXJpYWJsZSBjb250YWluaW5nIGFuICI9IiBhbmQKICB1c2UgdGhhdCB2YXJpYWJsZSBpbiB0aGUgcHJlcmVxdWlzaXRlLiAgU2Vjb25kLCB2YXJpYWJsZSBuYW1lcyBjYW4gbm8KICBsb25nZXIgY29udGFpbiB3aGl0ZXNwYWNlLCB1bmxlc3MgeW91IHB1dCB0aGUgd2hpdGVzcGFjZSBpbiBhIHZhcmlhYmxlIGFuZAogIHVzZSB0aGUgdmFyaWFibGUuICBUaGlyZCwgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgbWFrZSBpdCB3YXMgc29tZXRpbWVzCiAgbm90IGZsYWdnZWQgYXMgYW4gZXJyb3IgZm9yIGV4cGxpY2l0IGFuZCBwYXR0ZXJuIHRhcmdldHMgdG8gYXBwZWFyIGluIHRoZQogIHNhbWUgcnVsZS4gIE5vdyB0aGlzIGlzIGFsd2F5cyByZXBvcnRlZCBhcyBhbiBlcnJvci4KCiogV0FSTklORzogQmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFRoZSBwYXR0ZXJuLXNwZWNpZmljIHZhcmlhYmxlcyBhbmQgcGF0dGVybiBydWxlcyBhcmUgbm93IGFwcGxpZWQgaW4gdGhlCiAgc2hvcnRlc3Qgc3RlbSBmaXJzdCBvcmRlciBpbnN0ZWFkIG9mIHRoZSBkZWZpbml0aW9uIG9yZGVyICh2YXJpYWJsZXMKICBhbmQgcnVsZXMgd2l0aCB0aGUgc2FtZSBzdGVtIGxlbmd0aCBhcmUgc3RpbGwgYXBwbGllZCBpbiB0aGUgZGVmaW5pdGlvbgogIG9yZGVyKS4gVGhpcyBwcm9kdWNlcyB0aGUgdXN1YWxseS1kZXNpcmVkIGJlaGF2aW9yIHdoZXJlIG1vcmUgc3BlY2lmaWMKICBwYXR0ZXJucyBhcmUgcHJlZmVycmVkLiBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIHNlYXJjaCBmb3IgJ3Nob3J0ZXN0LXN0ZW0nCiAgaW4gdGhlIC5GRUFUVVJFUyBzcGVjaWFsIHZhcmlhYmxlLgoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgVGhlIGxpYnJhcnkgc2VhcmNoIGJlaGF2aW9yIGhhcyBjaGFuZ2VkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKICBsaW5rZXIgYmVoYXZpb3IuIFByaW9yIHRvIHRoaXMgdmVyc2lvbiBmb3IgcHJlcmVxdWlzaXRlcyBzcGVjaWZpZWQgdXNpbmcKICB0aGUgLWxmb28gc3ludGF4IG1ha2UgZmlyc3Qgc2VhcmNoZWQgZm9yIGxpYmZvby5zbyBpbiB0aGUgY3VycmVudAogIGRpcmVjdG9yeSwgdnBhdGggZGlyZWN0b3JpZXMsIGFuZCBzeXN0ZW0gZGlyZWN0b3JpZXMuIElmIHRoYXQgZGlkbid0IHlpZWxkCiAgYSBtYXRjaCwgbWFrZSB0aGVuIHNlYXJjaGVkIGZvciBsaWJmb28uYSBpbiB0aGVzZSBkaXJlY3Rvcmllcy4gU3RhcnRpbmcKICB3aXRoIHRoaXMgdmVyc2lvbiBtYWtlIHNlYXJjaGVzIGZpcnN0IGZvciBsaWJmb28uc28gYW5kIHRoZW4gZm9yIGxpYmZvby5hCiAgaW4gZWFjaCBvZiB0aGVzZSBkaXJlY3RvcmllcyBpbiBvcmRlci4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC0tZXZhbD1TVFJJTkcgY2F1c2VzIFNUUklORyB0byBiZSBldmFsdWF0ZWQgYXMKICBtYWtlZmlsZSBzeW50YXggKGFraW4gdG8gdXNpbmcgdGhlICQoZXZhbCAuLi4pIGZ1bmN0aW9uKS4gIFRoZSBldmFsdWF0aW9uCiAgaXMgcGVyZm9ybWVkIGFmdGVyIGFsbCBkZWZhdWx0IHJ1bGVzIGFuZCB2YXJpYWJsZXMgYXJlIGRlZmluZWQsIGJ1dCBiZWZvcmUKICBhbnkgbWFrZWZpbGVzIGFyZSByZWFkLgoKKiBOZXcgc3BlY2lhbCB2YXJpYWJsZTogLlJFQ0lQRVBSRUZJWCBhbGxvd3MgeW91IHRvIHJlc2V0IHRoZSByZWNpcGUKICBpbnRyb2R1Y3Rpb24gY2hhcmFjdGVyIGZyb20gdGhlIGRlZmF1bHQgKFRBQikgdG8gc29tZXRoaW5nIGVsc2UuICBUaGUKICBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhpcyB2YXJpYWJsZSB2YWx1ZSBpcyB0aGUgbmV3IHJlY2lwZSBpbnRyb2R1Y3Rpb24KICBjaGFyYWN0ZXIuICBJZiB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcsIFRBQiBpcyB1c2VkIGFnYWluLgogIEl0IGNhbiBiZSBzZXQgYW5kIHJlc2V0IGF0IHdpbGw7IHJlY2lwZXMgd2lsbCB1c2UgdGhlIHZhbHVlIGFjdGl2ZSB3aGVuCiAgdGhleSB3ZXJlIGZpcnN0IHBhcnNlZC4gIFRvIGRldGVjdCB0aGlzIGZlYXR1cmUgY2hlY2sgdGhlIHZhbHVlIG9mCiAgJCguUkVDSVBFUFJFRklYKS4KCiogTmV3IHNwZWNpYWwgdmFyaWFibGU6IC5TSEVMTEZMQUdTIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBvcHRpb25zIHBhc3NlZAogIHRvIHRoZSBzaGVsbCB3aGVuIGl0IGludm9rZXMgcmVjaXBlcy4gIEJ5IGRlZmF1bHQgdGhlIHZhbHVlIHdpbGwgYmUgIi1jIgogIChvciAiLWVjIiBpZiAuUE9TSVggaXMgc2V0KS4KCiogTmV3IHNwZWNpYWwgdGFyZ2V0OiAuT05FU0hFTEwgaW5zdHJ1Y3RzIG1ha2UgdG8gaW52b2tlIGEgc2luZ2xlIGluc3RhbmNlCiAgb2YgdGhlIHNoZWxsIGFuZCBwcm92aWRlIGl0IHdpdGggdGhlIGVudGlyZSByZWNpcGUsIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkKICBsaW5lcyBpdCBjb250YWlucy4gIEFzIGEgc3BlY2lhbCBmZWF0dXJlIHRvIGFsbG93IG1vcmUgc3RyYWlnaHRmb3J3YXJkCiAgY29udmVyc2lvbiBvZiBtYWtlZmlsZXMgdG8gdXNlIC5PTkVTSEVMTCwgYW55IHJlY2lwZSBsaW5lIGNvbnRyb2wKICBjaGFyYWN0ZXJzICgnQCcsICcrJywgb3IgJy0nKSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2Vjb25kIGFuZAogIHN1YnNlcXVlbnQgcmVjaXBlIGxpbmVzLiAgVGhpcyBoYXBwZW5zIF9vbmx5XyBpZiB0aGUgU0hFTEwgdmFsdWUgaXMgZGVlbWVkCiAgdG8gYmUgYSBzdGFuZGFyZCBQT1NJWC1zdHlsZSBzaGVsbC4gIElmIG5vdCwgdGhlbiBubyBpbnRlcmlvciBsaW5lIGNvbnRyb2wKICBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkIChhcyB0aGV5IG1heSBiZSBwYXJ0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlZAogIHdpdGggdGhlIGFsdGVybmF0ZSBTSEVMTCkuCgoqIE5ldyB2YXJpYWJsZSBtb2RpZmllciAncHJpdmF0ZSc6IHByZWZpeGluZyBhIHZhcmlhYmxlIGFzc2lnbm1lbnQgd2l0aCB0aGUKICBtb2RpZmllciAncHJpdmF0ZScgc3VwcHJlc3NlcyBpbmhlcml0YW5jZSBvZiB0aGF0IHZhcmlhYmxlIGJ5CiAgcHJlcmVxdWlzaXRlcy4gIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIHRhcmdldC0gYW5kIHBhdHRlcm4tc3BlY2lmaWMKICB2YXJpYWJsZXMuCgoqIE5ldyBtYWtlIGRpcmVjdGl2ZTogJ3VuZGVmaW5lJyBhbGxvd3MgeW91IHRvIHVuZGVmaW5lIGEgdmFyaWFibGUgc28gdGhhdAogIGl0IGFwcGVhcnMgYXMgaWYgaXQgd2FzIG5ldmVyIHNldC4gQm90aCAkKGZsYXZvcikgYW5kICQob3JpZ2luKSBmdW5jdGlvbnMKICB3aWxsIHJldHVybiAndW5kZWZpbmVkJyBmb3Igc3VjaCBhIHZhcmlhYmxlLiBUbyBkZXRlY3QgdGhpcyBmZWF0dXJlIHNlYXJjaAogIGZvciAndW5kZWZpbmUnIGluIHRoZSAuRkVBVFVSRVMgc3BlY2lhbCB2YXJpYWJsZS4KCiogVGhlIHBhcnNlciBmb3IgdmFyaWFibGUgYXNzaWdubWVudHMgaGFzIGJlZW4gZW5oYW5jZWQgdG8gYWxsb3cgbXVsdGlwbGUKICBtb2RpZmllcnMgKCdleHBvcnQnLCAnb3ZlcnJpZGUnLCAncHJpdmF0ZScpIG9uIHRoZSBzYW1lIGxpbmUgYXMgdmFyaWFibGVzLAogIGluY2x1ZGluZyBkZWZpbmUvZW5kZWYgdmFyaWFibGVzLCBhbmQgaW4gYW55IG9yZGVyLiAgQWxzbywgaXQgaXMgcG9zc2libGUKICB0byBjcmVhdGUgdmFyaWFibGVzIGFuZCB0YXJnZXRzIG5hbWVkIGFzIHRoZXNlIG1vZGlmaWVycy4KCiogVGhlICdkZWZpbmUnIG1ha2UgZGlyZWN0aXZlIG5vdyBhbGxvd3MgYSB2YXJpYWJsZSBhc3NpZ25tZW50IG9wZXJhdG9yCiAgYWZ0ZXIgdGhlIHZhcmlhYmxlIG5hbWUsIHRvIGFsbG93IGZvciBzaW1wbGUsIGNvbmRpdGlvbmFsLCBvciBhcHBlbmRpbmcKICBtdWx0aS1saW5lIHZhcmlhYmxlIGFzc2lnbm1lbnQuCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIE1pY2hhZWwgR2VocmUgKGF0IFZJU1RFQy1TRU1JIGRvdCBDT00pIHN1cHBsaWVkIGEgZml4IGZvciBhIHByb2JsZW0gd2l0aAogICAgdGltZXN0YW1wcyBvZiBvYmplY3QgbW9kdWxlcyBpbiBPTEJzLiBUaGUgdGltZXN0YW1wcyB3ZXJlIG5vdCBjb3JyZWN0bHkKICAgIGFkanVzdGVkIHRvIEdNVCBiYXNlZCB0aW1lLCBpZiB0aGUgbG9jYWwgVk1TIHRpbWUgd2FzIHVzaW5nIGEgZGF5bGlnaHQKICAgIHNhdmluZyBhbGdvcml0aG0gYW5kIGlmIGRheWxpZ2h0IHNhdmluZyB3YXMgc3dpdGNoZWQgb2ZmLgoKICAqIEpvaG4gRWlzZW5icmF1biAoYXQgSFAgZG90IENPTSkgc3VwcGxpZWQgZml4ZXMgYW5kIGFuZCBhbiBlbmhhbmNlbWVudCB0bwogICAgYXBwZW5kIG91dHB1dCByZWRpcmVjdGlvbiBpbiBhY3Rpb24gbGluZXMuCgogICogUmV3b3JrIG9mIGN0cmwrYyBhbmQgY3RybCt5IGhhbmRsaW5nLgoKICAqIEZpeCBhIHByb2JsZW0gd2l0aCBjYWNoZWQgc3RyaW5ncywgd2hpY2ggc2hvd2VkIG9uIGNhc2UtaW5zZW5zaXRpdmUgZmlsZQogICAgc3lzdGVtcy4KCiAgKiBCdWlsZCBmaXhlcyBmb3IgY29uc3QtaWZpZWQgY29kZSBpbiBWTVMgc3BlY2lmaWMgc291cmNlcy4KCiAgKiBBIG5vdGUgb24gYXBwZW5kaW5nIHRoZSByZWRpcmVjdGVkIG91dHB1dC4gV2l0aCB0aGlzIGNoYW5nZSwgYSBzaW1wbGUKICAgIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCB0byBtYWtlICI+PiIgd29yayBpbiBhY3Rpb24gbGluZXMuIEluIFZNUwogICAgdGhlcmUgaXMgbm8gc2ltcGxlIGZlYXR1cmUgbGlrZSAiPj4iIHRvIGhhdmUgRENMIGNvbW1hbmQgb3IgcHJvZ3JhbQogICAgb3V0cHV0IHJlZGlyZWN0ZWQgYW5kIGFwcGVuZGVkIHRvIGEgZmlsZS4gR05VIG1ha2UgZm9yIFZNUyBhbHJlYWR5CiAgICBpbXBsZW1lbnRzIHRoZSByZWRpcmVjdGlvbiBvZiBvdXRwdXQuIElmIHN1Y2ggYSByZWRpcmVjdGlvbiBpcyBkZXRlY3RlZCwKICAgIGFuICI+IiBvbiB0aGUgYWN0aW9uIGxpbmUsIEdOVSBtYWtlIGNyZWF0ZXMgYSBEQ0wgY29tbWFuZCBwcm9jZWR1cmUgdG8KICAgIGV4ZWN1dGUgdGhlIGFjdGlvbiBhbmQgdG8gcmVkaXJlY3QgaXRzIG91dHB1dC4gQmFzZWQgb24gdGhhdCwgbm93ICI+PiIKICAgIGlzIGFsc28gcmVjb2duaXplZCBhbmQgYSBzaW1pbGFyIGJ1dCBkaWZmZXJlbnQgY29tbWFuZCBwcm9jZWR1cmUgaXMKICAgIGNyZWF0ZWQgdG8gaW1wbGVtZW50IHRoZSBhcHBlbmQuIFRoZSBtYWluIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgYQogICAgdGVtcG9yYXJ5IGZpbGUgd2hpY2ggY29sbGVjdHMgdGhlIG91dHB1dCBhbmQgd2hpY2ggaXMgYXBwZW5kZWQgdG8gdGhlCiAgICB3YW50ZWQgb3V0cHV0IGZpbGUuIFRoZW4gdGhlIHRlbXBvcmFyeSBmaWxlIGlzIGRlbGV0ZWQuIFRoaXMgaXMgYWxsIGRvbmUKICAgIGluIHRoZSBjb21tYW5kIHByb2NlZHVyZSB0byBrZWVwIGNoYW5nZXMgaW4gbWFrZSBzbWFsbCBhbmQgc2ltcGxlLiBUaGlzCiAgICBvYnZpb3VzbHkgaGFzIHNvbWUgbGltaXRhdGlvbnMgYnV0IGl0IHNlZW1zIGdvb2QgZW5vdWdoIGNvbXBhcmVkIHdpdGgKICAgIHRoZSBjdXJyZW50ICI+IiBpbXBsZW1lbnRhdGlvbi4gKEFuZCBpbiBteSBvcGluaW9uLCByZWRpcmVjdGlvbiBpcyBub3QKICAgIHJlYWxseSB3aGF0IEdOVSBtYWtlIGhhcyB0byBkby4pIFdpdGggdGhpcyBhcHByb2FjaCwgaXQgbWF5IGhhcHBlbiB0aGF0CiAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgaXMgbm90IHlldCBhcHBlbmRlZCBhbmQgaXMgbGVmdCBpbiBTWVMkU0NSQVRDSC4KICAgIFRoZSB0ZW1wb3JhcnkgZmlsZSBuYW1lcyBsb29rIGxpa2UgIkNNRHh4eHh4LiIuIEFueSB0aW1lIHRoZSBjcmVhdGVkCiAgICBjb21tYW5kIHByb2NlZHVyZSBjYW4gbm90IGNvbXBsZXRlLCB0aGlzIGhhcHBlbnMuIFByZXNzaW5nIEN0cmwrWSB0bwogICAgYWJvcnQgbWFrZSBpcyBvbmUgY2FzZS4gSW4gY2FzZSBvZiBDdHJsK1kgdGhlIGFzc29jaWF0ZWQgY29tbWFuZAogICAgcHJvY2VkdXJlIGlzIGxlZnQgaW4gU1lTJFNDUkFUQ0ggYXMgd2VsbC4gSXRzIG5hbWUgaXMgQ01EeHh4eHguQ09NLgoKICAqIENoYW5nZSBpbiB0aGUgQ3RybCtZIGhhbmRsaW5nLiBUaGUgQ3RybFkgaGFuZGxlciBub3cgdXNlcyAkZGVscHJjIHRvCiAgICBkZWxldGUgYWxsIGNoaWxkcmVuLiBUaGlzIHdheSBhbHNvIGFjdGlvbnMgd2l0aCBEQ0wgY29tbWFuZHMgd2lsbCBiZQogICAgc3RvcHBlZC4gQXMgYmVmb3JlIHRoZSBDdHJsWSBoYW5kbGVyIHRoZW4gc2VuZHMgU0lHUVVJVCB0byBpdHNlbGYsCiAgICB3aGljaCBpcyBoYW5kbGVkIGluIGNvbW1vbiBjb2RlLgoKICAqIENoYW5nZSBpbiBkZWxldGVpbmcgdGVtcG9yYXJ5IGNvbW1hbmQgZmlsZXMuIFRlbXBvcmFyeSBjb21tYW5kIGZpbGVzCiAgICBhcmUgbm93IGRlbGV0ZWQgaW4gdGhlIHZtcyBjaGlsZCB0ZXJtaW5hdGlvbiBoYW5kbGVyLiBUaGF0IGRlbGV0ZXMKICAgIHRoZW0gZXZlbiBpZiBhIEN0cmwrQyB3YXMgcHJlc3NlZC4KCiAgKiBUaGUgYmVoYXZpb3Igb2YgcHJlc3NpbmcgQ3RybCtDIGlzIG5vdCBjaGFuZ2VkLiBJdCBzdGlsbCBoYXMgb25seSBhbgogICAgZWZmZWN0LCBhZnRlciB0aGUgY3VycmVudCBhY3Rpb24gaXMgdGVybWluYXRlZC4gSWYgdGhhdCBkb2Vzbid0IGhhcHBlbgogICAgb3IgdGFrZXMgdG9vIGxvbmcsIEN0cmwrWSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKDApWZXJzaW9uIDMuODEgKDAxIEFwciAyMDA2KQoKKiBHTlUgbWFrZSBpcyBwb3J0ZWQgdG8gT1MvMi4KCiogR05VIG1ha2UgaXMgcG9ydGVkIHRvIE1pbkdXLiAgVGhlIE1pbkdXIGJ1aWxkIGlzIG9ubHkgc3VwcG9ydGVkIGJ5CiAgdGhlIGJ1aWxkX3czMi5iYXQgYmF0Y2ggZmlsZTsgc2VlIHRoZSBmaWxlIFJFQURNRS5XMzIgZm9yIG1vcmUKICBkZXRhaWxzLgoKKiBXQVJOSU5HOiBGdXR1cmUgYmFja3dhcmQtaW5jb21wYXRpYmlsaXR5IQogIFVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyByZWxlYXNlLCB0aGUgJyQ/JyB2YXJpYWJsZSBkb2VzIG5vdCBjb250YWluCiAgYW55IHByZXJlcXVpc2l0ZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBldmVuIHRob3VnaCB0aGF0IHByZXJlcXVpc2l0ZQogIG1pZ2h0IGhhdmUgY2F1c2VkIHRoZSB0YXJnZXQgdG8gcmVidWlsZC4gIFN0YXJ0aW5nIHdpdGggdGhlIF9uZXh0XwogIHJlbGVhc2Ugb2YgR05VIG1ha2UsICckPycgd2lsbCBjb250YWluIGFsbCBwcmVyZXF1aXNpdGVzIHRoYXQgY2F1c2VkCiAgdGhlIHRhcmdldCB0byBiZSBjb25zaWRlcmVkIG91dCBvZiBkYXRlLgogIFNlZSBodHRwOi8vc2F2YW5uYWguZ251Lm9yZy9idWdzLz8xNjA1MQoKKiBXQVJOSU5HOiBCYWNrd2FyZC1pbmNvbXBhdGliaWxpdHkhCiAgR05VIG1ha2Ugbm93IGltcGxlbWVudHMgYSBnZW5lcmljICJzZWNvbmQgZXhwYW5zaW9uIiBmZWF0dXJlIG9uIHRoZQogIHByZXJlcXVpc2l0ZXMgb2YgYm90aCBleHBsaWNpdCBhbmQgaW1wbGljaXQgKHBhdHRlcm4pIHJ1bGVzLiAgSW4gb3JkZXIKICB0byBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgc3BlY2lhbCB0YXJnZXQgJy5TRUNPTkRFWFBBTlNJT04nIG11c3QgYmUKICBkZWZpbmVkIGJlZm9yZSB0aGUgZmlyc3QgdGFyZ2V0IHdoaWNoIHRha2VzIGFkdmFudGFnZSBvZiBpdC4gIElmIHRoaXMKICBmZWF0dXJlIGlzIGVuYWJsZWQgdGhlbiBhZnRlciBhbGwgcnVsZXMgaGF2ZSBiZWVuIHBhcnNlZCB0aGUKICBwcmVyZXF1aXNpdGVzIGFyZSBleHBhbmRlZCBhZ2FpbiwgdGhpcyB0aW1lIHdpdGggYWxsIHRoZSBhdXRvbWF0aWMKICB2YXJpYWJsZXMgaW4gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgaW4gYWRkaXRpb24gdG8gdXNpbmcgc3RhbmRhcmQKICBTeXNWICQkQCBpbiBwcmVyZXF1aXNpdGVzIGxpc3RzLCB5b3UgY2FuIGFsc28gdXNlIGNvbXBsZXggZnVuY3Rpb25zCiAgc3VjaCBhcyAkJChub3RkaXIgJCRAKSBldGMuICBUaGlzIGJlaGF2aW9yIGFwcGxpZXMgdG8gaW1wbGljaXQgcnVsZXMsCiAgYXMgd2VsbCwgd2hlcmUgdGhlIHNlY29uZCBleHBhbnNpb24gb2NjdXJzIHdoZW4gdGhlIHJ1bGUgaXMgbWF0Y2hlZC4KICBIb3dldmVyLCB0aGlzIG1lYW5zIHRoYXQgd2hlbiAnLlNFQ09OREVYUEFOU0lPTicgaXMgZW5hYmxlZCB5b3UgbXVzdAogIGRvdWJsZS1xdW90ZSBhbnkgIiQiIGluIHlvdXIgZmlsZW5hbWVzOyBpbnN0ZWFkIG9mICJmb286IGJvbyQkYmFyIiB5b3UKICBub3cgbXVzdCB3cml0ZSAiZm9vOiBmb28kJCQkYmFyIi4gIE5vdGUgdGhhdCB0aGUgU3lzViAkJEAgZXRjLiBmZWF0dXJlLAogIHdoaWNoIHVzZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IGRlZmF1bHQsIGlzIG5vdyBPTkxZIGF2YWlsYWJsZSB3aGVuIHRoZQogIC5TRUNPTkRFWFBBTlNJT04gdGFyZ2V0IGlzIGRlZmluZWQuICBJZiB5b3VyIG1ha2VmaWxlcyB0YWtlIGFkdmFudGFnZQogIG9mIHRoaXMgU3lzViBmZWF0dXJlIHlvdSB3aWxsIG5lZWQgdG8gdXBkYXRlIHRoZW0uCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBJbiBvcmRlciB0byBjb21wbHkgd2l0aCBQT1NJWCwgdGhlIHdheSBpbiB3aGljaCBHTlUgbWFrZSBwcm9jZXNzZXMKICBiYWNrc2xhc2gtbmV3bGluZSBzZXF1ZW5jZXMgaW4gcmVjaXBlcyBoYXMgY2hhbmdlZC4gIElmIHlvdXIgbWFrZWZpbGVzCiAgdXNlIGJhY2tzbGFzaC1uZXdsaW5lIHNlcXVlbmNlcyBpbnNpZGUgb2Ygc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGluCiAgcmVjaXBlcyB5b3Ugd2lsbCBiZSBpbXBhY3RlZCBieSB0aGlzIGNoYW5nZS4gIFNlZSB0aGUgR05VIG1ha2UgbWFudWFsCiAgc3Vic2VjdGlvbiAiU3BsaXR0aW5nIFJlY2lwZSBMaW5lcyIgKG5vZGUgIlNwbGl0dGluZyBMaW5lcyIpLCBpbgogIHNlY3Rpb24gIlJlY2lwZSBTeW50YXgiLCBjaGFwdGVyICJXcml0aW5nIFJlY2lwZSBpbiBSdWxlcyIsIGZvcgogIGRldGFpbHMuCgoqIFdBUk5JTkc6IEJhY2t3YXJkLWluY29tcGF0aWJpbGl0eSEKICBTb21lIHByZXZpb3VzIHZlcnNpb25zIG9mIEdOVSBtYWtlIGhhZCBhIGJ1ZyB3aGVyZSAiIyIgaW4gYSBmdW5jdGlvbgogIGludm9jYXRpb24gc3VjaCBhcyAkKHNoZWxsIC4uLikgd2FzIHRyZWF0ZWQgYXMgYSBtYWtlIGNvbW1lbnQuICBBCiAgd29ya2Fyb3VuZCB3YXMgdG8gZXNjYXBlIHRoZXNlIHdpdGggYmFja3NsYXNoZXMuICBUaGlzIGJ1ZyBoYXMgYmVlbgogIGZpeGVkOiBpZiB5b3VyIG1ha2VmaWxlIHVzZXMgIlwjIiBpbiBhIGZ1bmN0aW9uIGludm9jYXRpb24gdGhlCiAgYmFja3NsYXNoIGlzIG5vdyBwcmVzZXJ2ZWQsIHNvIHlvdSdsbCBuZWVkIHRvIHJlbW92ZSBpdC4KCiogTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1MICgtLWNoZWNrLXN5bWxpbmstdGltZXMpLiAgT24gc3lzdGVtcyB0aGF0CiAgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcywgaWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4gdGhlbiBHTlUgbWFrZSB3aWxsCiAgdXNlIHRoZSBtb3N0IHJlY2VudCBtb2RpZmljYXRpb24gdGltZSBvZiBhbnkgc3ltYm9saWMgbGlua3MgdGhhdCBhcmUKICB1c2VkIHRvIHJlc29sdmUgdGFyZ2V0IGZpbGVzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgcmVtYWlucyBhcyBpdAogIGFsd2F5cyBoYXM6IHVzZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGFjdHVhbCB0YXJnZXQgZmlsZSBvbmx5LgoKKiBUaGUgImVsc2UiIGNvbmRpdGlvbmFsIGxpbmUgY2FuIG5vdyBiZSBmb2xsb3dlZCBieSBhbnkgb3RoZXIgdmFsaWQKICBjb25kaXRpb25hbCBvbiB0aGUgc2FtZSBsaW5lOiB0aGlzIGRvZXMgbm90IGluY3JlYXNlIHRoZSBkZXB0aCBvZiB0aGUKICBjb25kaXRpb25hbCBuZXN0aW5nLCBzbyBvbmx5IG9uZSAiZW5kaWYiIGlzIHJlcXVpcmVkIHRvIGNsb3NlIHRoZQogIGNvbmRpdGlvbmFsLgoKKiBBbGwgcGF0dGVybi1zcGVjaWZpYyB2YXJpYWJsZXMgdGhhdCBtYXRjaCBhIGdpdmVuIHRhcmdldCBhcmUgbm93IHVzZWQKICAocHJldmlvdXNseSBvbmx5IHRoZSBmaXJzdCBtYXRjaCB3YXMgdXNlZCkuCgoqIFRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZXMgY2FuIGJlIG1hcmtlZCBhcyBleHBvcnRhYmxlIHVzaW5nIHRoZQogICJleHBvcnQiIGtleXdvcmQuCgoqIEluIGEgcmVjdXJzaXZlICQoY2FsbCAuLi4pIGNvbnRleHQsIGFueSBleHRyYSBhcmd1bWVudHMgZnJvbSB0aGUgb3V0ZXIKICBjYWxsIGFyZSBub3cgbWFza2VkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBpbm5lciBjYWxsLgoKKiBJbXBsZW1lbnRlZCBhIHNvbHV0aW9uIGZvciB0aGUgInRodW5kZXJpbmcgaGVyZCIgcHJvYmxlbSB3aXRoICItaiAtbCIuCiAgVGhpcyB2ZXJzaW9uIG9mIEdOVSBtYWtlIHVzZXMgYW4gYWxnb3JpdGhtIHN1Z2dlc3RlZCBieSBUaG9tYXMgUmllZGwKICA8dGhvbWFzLnJpZWRsQHNpZW1lbnMuY29tPiB0byB0cmFjayB0aGUgbnVtYmVyIG9mIGpvYnMgc3RhcnRlZCBpbiB0aGUKICBsYXN0IHNlY29uZCBhbmQgYXJ0aWZpY2lhbGx5IGFkanVzdCBHTlUgbWFrZSdzIHZpZXcgb2YgdGhlIHN5c3RlbSdzCiAgbG9hZCBhdmVyYWdlIGFjY29yZGluZ2x5LgoKKiBOZXcgc3BlY2lhbCB2YXJpYWJsZXMgYXZhaWxhYmxlIGluIHRoaXMgcmVsZWFzZToKICAgLSAuSU5DTFVERV9ESVJTOiBFeHBhbmRzIHRvIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IG1ha2Ugc2VhcmNoZXMKICAgICBmb3IgaW5jbHVkZWQgbWFrZWZpbGVzLgogICAtIC5GRUFUVVJFUzogQ29udGFpbnMgYSBsaXN0IG9mIHNwZWNpYWwgZmVhdHVyZXMgYXZhaWxhYmxlIGluIHRoaXMKICAgICB2ZXJzaW9uIG9mIEdOVSBtYWtlLgogICAtIC5ERUZBVUxUX0dPQUw6IFNldCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBnb2FsIG1ha2Ugd2lsbAogICAgIHVzZSBpZiBubyBnb2FscyBhcmUgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgLSBNQUtFX1JFU1RBUlRTOiBJZiBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMKICAgICBpbnN0YW5jZSBvZiBtYWtlIGhhcyBiZWVuIHJlc3RhcnRlZCAoc2VlICJIb3cgTWFrZWZpbGVzIEFyZSBSZW1hZGUiCiAgICAgaW4gdGhlIG1hbnVhbCkuCiAgIC0gTmV3IGF1dG9tYXRpYyB2YXJpYWJsZTogJHwgKGFkZGVkIGluIDMuODAsIGFjdHVhbGx5KTogY29udGFpbnMgYWxsCiAgICAgdGhlIG9yZGVyLW9ubHkgcHJlcmVxdWlzaXRlcyBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0LgoKKiBOZXcgZnVuY3Rpb25zIGF2YWlsYWJsZSBpbiB0aGlzIHJlbGVhc2U6CiAgIC0gJChsYXN0d29yZCAuLi4pIHJldHVybnMgdGhlIGxhc3Qgd29yZCBpbiB0aGUgbGlzdC4gIFRoaXMgZ2l2ZXMKICAgICBpZGVudGljYWwgcmVzdWx0cyBhcyAkKHdvcmQgJCh3b3JkcyAuLi4pIC4uLiksIGJ1dCBpcyBtdWNoIGZhc3Rlci4KICAgLSAkKGFic3BhdGggLi4uKSByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIChhbGwgIi4iIGFuZCAiLi4iCiAgICAgZGlyZWN0b3JpZXMgcmVzb2x2ZWQsIGFuZCBhbnkgZHVwbGljYXRlICIvIiBjaGFyYWN0ZXJzIHJlbW92ZWQpIGZvcgogICAgIGVhY2ggcGF0aCBwcm92aWRlZC4KICAgLSAkKHJlYWxwYXRoIC4uLikgcmV0dXJucyB0aGUgY2Fub25pY2FsIHBhdGhuYW1lIGZvciBlYWNoIHBhdGgKICAgICBwcm92aWRlZC4gIFRoZSBjYW5vbmljYWwgcGF0aG5hbWUgaXMgdGhlIGFic29sdXRlIHBhdGhuYW1lLCB3aXRoCiAgICAgYWxsIHN5bWJvbGljIGxpbmtzIHJlc29sdmVkIGFzIHdlbGwuCiAgIC0gJChpbmZvIC4uLikgcHJpbnRzIGl0cyBhcmd1bWVudHMgdG8gc3Rkb3V0LiAgTm8gbWFrZWZpbGUgbmFtZSBvcgogICAgIGxpbmUgbnVtYmVyIGluZm8sIGV0Yy4gaXMgcHJpbnRlZC4KICAgLSAkKGZsYXZvciAuLi4pIHJldHVybnMgdGhlIGZsYXZvciBvZiBhIHZhcmlhYmxlLgogICAtICQob3IgLi4uKSBwcm92aWRlcyBhIHNob3J0LWNpcmN1aXRpbmcgT1IgY29uZGl0aW9uYWw6IGVhY2ggYXJndW1lbnQKICAgICBpcyBleHBhbmRlZC4gIFRoZSBmaXJzdCB0cnVlIChub24tZW1wdHkpIGFyZ3VtZW50IGlzIHJldHVybmVkOyBubwogICAgIGZ1cnRoZXIgYXJndW1lbnRzIGFyZSBleHBhbmRlZC4gIEV4cGFuZHMgdG8gZW1wdHkgaWYgdGhlcmUgYXJlIG5vCiAgICAgdHJ1ZSBhcmd1bWVudHMuCiAgIC0gJChhbmQgLi4uKSBwcm92aWRlcyBhIHNob3J0LWNpcmN1aXRpbmcgQU5EIGNvbmRpdGlvbmFsOiBlYWNoCiAgICAgYXJndW1lbnQgaXMgZXhwYW5kZWQuICBUaGUgZmlyc3QgZmFsc2UgKGVtcHR5KSBhcmd1bWVudCBpcwogICAgIHJldHVybmVkOyBubyBmdXJ0aGVyIGFyZ3VtZW50cyBhcmUgZXhwYW5kZWQuICBFeHBhbmRzIHRvIHRoZSBsYXN0CiAgICAgYXJndW1lbnQgaWYgYWxsIGFyZ3VtZW50cyBhcmUgdHJ1ZS4KCiogQ2hhbmdlcyBtYWRlIGZvciBQT1NJWCBjb21wYXRpYmlsaXR5OgogICAtIE9ubHkgdG91Y2ggdGFyZ2V0cyAodW5kZXIgLXQpIGlmIHRoZXkgaGF2ZSBhIHJlY2lwZS4KICAgLSBTZXR0aW5nIHRoZSBTSEVMTCBtYWtlIHZhcmlhYmxlIGRvZXMgTk9UIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlCiAgICAgU0hFTEwgZW52aXJvbm1lbnQgdmFyaWFibGUgZ2l2ZW4gdG8gcHJvZ3JhbXMgaW52b2tlZCBieSBtYWtlLiAgQXMKICAgICBhbiBlbmhhbmNlbWVudCB0byBQT1NJWCwgaWYgeW91IGV4cG9ydCB0aGUgbWFrZSB2YXJpYWJsZSBTSEVMTCB0aGVuCiAgICAgaXQgd2lsbCBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50LCBqdXN0IGFzIGJlZm9yZS4KCiogT24gTVMgV2luZG93cyBzeXN0ZW1zLCBleHBsaWNpdGx5IHNldHRpbmcgU0hFTEwgdG8gYSBwYXRobmFtZSBlbmRpbmcKICBpbiAiY21kIiBvciAiY21kLmV4ZSIgKGNhc2UtaW5zZW5zaXRpdmUpIHdpbGwgZm9yY2UgR05VIG1ha2UgdG8gdXNlCiAgdGhlIERPUyBjb21tYW5kIGludGVycHJldGVyIGluIGJhdGNoIG1vZGUgZXZlbiBpZiBhIFVOSVgtbGlrZSBzaGVsbAogIGNvdWxkIGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0uCgoqIE9uIFZNUyB0aGVyZSBpcyBub3cgc3VwcG9ydCBmb3IgY2FzZS1zZW5zaXRpdmUgZmlsZXN5c3RlbXMgc3VjaCBhcyBPRFM1LgogIFNlZSB0aGUgUkVBRE1FLlZNUyBmaWxlIGZvciBpbmZvcm1hdGlvbi4KCiogUGFyYWxsZWwgYnVpbGRzICgtak4pIG5vIGxvbmdlciByZXF1aXJlIGEgd29ya2luZyBCb3VybmUgc2hlbGwgb24KICBXaW5kb3dzIHBsYXRmb3Jtcy4gIFRoZXkgd29yayBldmVuIHdpdGggdGhlIHN0b2NrIFdpbmRvd3Mgc2hlbGxzLCBzdWNoCiAgYXMgY21kLmV4ZSBhbmQgY29tbWFuZC5jb20uCgoqIFVwZGF0ZWQgdG8gYXV0b2NvbmYgMi41OSwgYXV0b21ha2UgMS45LjUsIGFuZCBnZXR0ZXh0IDAuMTQuMS4gIFVzZXJzCiAgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KCiogTmV3IHRyYW5zbGF0aW9ucyBmb3IgU3dlZGlzaCwgQ2hpbmVzZSAoc2ltcGxpZmllZCksIFVrcmFpbmlhbiwKICBCZWxhcnVzaWFuLCBGaW5uaXNoLCBLaW55YXJ3YW5kYW4sIGFuZCBJcmlzaC4gIE1hbnkgdXBkYXRlZAogIHRyYW5zbGF0aW9ucy4KCkEgY29tcGxldGUgbGlzdCBvZiBidWdzIGZpeGVkIGluIHRoaXMgdmVyc2lvbiBpcyBhdmFpbGFibGUgaGVyZToKCiAgaHR0cDovL3NhdmFubmFoLmdudS5vcmcvYnVncy9pbmRleC5waHA/Z3JvdXA9bWFrZSZyZXBvcnRfaWQ9MTExJmZpeF9yZWxlYXNlX2lkPTEwMwoKDApWZXJzaW9uIDMuODAgKDAzIE9jdCAyMDAyKQoKKiBBIG5ldyBmZWF0dXJlIGV4aXN0czogb3JkZXItb25seSBwcmVyZXF1aXNpdGVzLiAgVGhlc2UgcHJlcmVxdWlzaXRlcwogIGFmZmVjdCB0aGUgb3JkZXIgaW4gd2hpY2ggdGFyZ2V0cyBhcmUgYnVpbHQsIGJ1dCB0aGV5IGRvIG5vdCBpbXBhY3QKICB0aGUgcmVidWlsZC9uby1yZWJ1aWxkIGRlY2lzaW9uIG9mIHRoZWlyIGRlcGVuZGVudHMuICBUaGF0IGlzIHRvIHNheSwKICB0aGV5IGFsbG93IHlvdSB0byByZXF1aXJlIHRhcmdldCBCIGJlIGJ1aWx0IGJlZm9yZSB0YXJnZXQgQSwgd2l0aG91dAogIHJlcXVpcmluZyB0aGF0IHRhcmdldCBBIHdpbGwgYWx3YXlzIGJlIHJlYnVpbHQgaWYgdGFyZ2V0IEIgaXMgdXBkYXRlZC4KICBQYXRjaCBmb3IgdGhpcyBmZWF0dXJlIHByb3ZpZGVkIGJ5IEdyZWcgTWNHYXJ5IDxncmVnQG1jZ2FyeS5vcmc+LgoKKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFN5c1YgbWFrZSwgR05VIG1ha2Ugbm93IHN1cHBvcnRzIHRoZSBwZWN1bGlhcgogIHN5bnRheCAkJEAsICQkKEBEKSwgYW5kICQkKEBGKSBpbiB0aGUgcHJlcmVxdWlzaXRlcyBsaXN0IG9mIGEgcnVsZS4KICBUaGlzIHN5bnRheCBpcyBvbmx5IHZhbGlkIHdpdGhpbiBleHBsaWNpdCBhbmQgc3RhdGljIHBhdHRlcm4gcnVsZXM6IGl0CiAgY2Fubm90IGJlIHVzZWQgaW4gaW1wbGljaXQgKHN1ZmZpeCBvciBwYXR0ZXJuKSBydWxlcy4gIEVkb3VhcmQgRy4gUGFybWVsYW4KICA8ZWdwQGZyZWUuZnI+IHByb3ZpZGVkIGEgcGF0Y2ggaW1wbGVtZW50aW5nIHRoaXMgZmVhdHVyZTsgaG93ZXZlciwgSQogIGRlY2lkZWQgdG8gaW1wbGVtZW50IGl0IGluIGEgZGlmZmVyZW50IHdheS4KCiogVGhlIGFyZ3VtZW50IHRvIHRoZSAiaWZkZWYiIGNvbmRpdGlvbmFsIGlzIG5vdyBleHBhbmRlZCBiZWZvcmUgaXQncwogIHRlc3RlZCwgc28gaXQgY2FuIGJlIGEgY29uc3RydWN0ZWQgdmFyaWFibGUgbmFtZS4KCiAgU2ltaWxhcmx5LCB0aGUgYXJndW1lbnRzIHRvICJleHBvcnQiICh3aGVuIG5vdCB1c2VkIGluIGEgdmFyaWFibGUKICBkZWZpbml0aW9uIGNvbnRleHQpIGFuZCAidW5leHBvcnQiIGFyZSBhbHNvIG5vdyBleHBhbmRlZC4KCiogQSBuZXcgZnVuY3Rpb24gaXMgZGVmaW5lZDogJCh2YWx1ZSAuLi4pLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMKICBmdW5jdGlvbiBpcyB0aGUgX25hbWVfIG9mIGEgdmFyaWFibGUuICBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcwogIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUsIHdpdGhvdXQgaGF2aW5nIGJlZW4gZXhwYW5kZWQuCgoqIEEgbmV3IGZ1bmN0aW9uIGlzIGRlZmluZWQ6ICQoZXZhbCAuLi4pLiAgVGhlIGFyZ3VtZW50cyB0byB0aGlzCiAgZnVuY3Rpb24gc2hvdWxkIGV4cGFuZCB0byBtYWtlZmlsZSBjb21tYW5kcywgd2hpY2ggd2lsbCB0aGVuIGJlCiAgZXZhbHVhdGVkIGFzIGlmIHRoZXkgaGFkIGFwcGVhcmVkIGluIHRoZSBtYWtlZmlsZS4gIEluIGNvbWJpbmF0aW9uCiAgd2l0aCBkZWZpbmUvZW5kZWYgbXVsdGlsaW5lIHZhcmlhYmxlIGRlZmluaXRpb25zIHRoaXMgaXMgYW4gZXh0cmVtZWx5CiAgcG93ZXJmdWwgY2FwYWJpbGl0eS4gIFRoZSAkKHZhbHVlIC4uLikgZnVuY3Rpb24gaXMgYWxzbyBzb21ldGltZXMKICB1c2VmdWwgaGVyZS4KCiogQSBuZXcgYnVpbHQtaW4gdmFyaWFibGUgaXMgZGVmaW5lZCwgJChNQUtFRklMRV9MSVNUKS4gIEl0IGNvbnRhaW5zIGEKICBsaXN0IG9mIGVhY2ggbWFrZWZpbGUgR05VIG1ha2UgaGFzIHJlYWQsIG9yIHN0YXJ0ZWQgdG8gcmVhZCwgaW4gdGhlCiAgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGVuY291bnRlcmVkLiAgU28sIHRoZSBsYXN0IGZpbGVuYW1lIGluIHRoZQogIGxpc3Qgd2hlbiBhIG1ha2VmaWxlIGlzIGp1c3QgYmVpbmcgcmVhZCAoYmVmb3JlIGFueSBpbmNsdWRlcykgaXMgdGhlCiAgbmFtZSBvZiB0aGUgY3VycmVudCBtYWtlZmlsZS4KCiogQSBuZXcgYnVpbHQtaW4gdmFyaWFibGUgaXMgZGVmaW5lZDogJCguVkFSSUFCTEVTKS4gIFdoZW4gaXQgaXMKICBleHBhbmRlZCBpdCByZXR1cm5zIGEgY29tcGxldGUgbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyBkZWZpbmVkIGJ5IGFsbAogIG1ha2VmaWxlcyBhdCB0aGF0IG1vbWVudC4KCiogQSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBkZWZpbmVkLCAtQiBvciAtLWFsd2F5cy1tYWtlLiAgSWYKICBzcGVjaWZpZWQgR05VIG1ha2Ugd2lsbCBjb25zaWRlciBhbGwgdGFyZ2V0cyBvdXQtb2YtZGF0ZSBldmVuIGlmIHRoZXkKICB3b3VsZCBvdGhlcndpc2Ugbm90IGJlLgoKKiBUaGUgYXJndW1lbnRzIHRvICQoY2FsbCAuLi4pIGZ1bmN0aW9ucyB3ZXJlIGJlaW5nIHN0b3JlZCBpbiAkMSwgJDIsCiAgZXRjLiBhcyByZWN1cnNpdmUgdmFyaWFibGVzLCBldmVuIHRob3VnaCB0aGV5IGFyZSBmdWxseSBleHBhbmRlZAogIGJlZm9yZSBhc3NpZ25tZW50LiAgVGhpcyBtZWFucyB0aGF0IGVzY2FwZWQgZG9sbGFyIHNpZ25zICgkJCBldGMuKQogIHdlcmUgbm90IGJlaGF2aW5nIHByb3Blcmx5LiAgTm93IHRoZSBhcmd1bWVudHMgYXJlIHN0b3JlZCBhcyBzaW1wbGUKICB2YXJpYWJsZXMuICBUaGlzIG1heSBtZWFuIHRoYXQgaWYgeW91IGFkZGVkIGV4dHJhIGVzY2FwaW5nIHRvIHlvdXIKICAkKGNhbGwgLi4uKSBmdW5jdGlvbiBhcmd1bWVudHMgeW91IHdpbGwgbmVlZCB0byB1bmRvIGl0IG5vdy4KCiogVGhlIHZhcmlhYmxlIGludm9rZWQgYnkgJChjYWxsIC4uLikgY2FuIG5vdyBiZSByZWN1cnNpdmU6IHVubGlrZSBvdGhlcgogIHZhcmlhYmxlcyBpdCBjYW4gcmVmZXJlbmNlIGl0c2VsZiBhbmQgdGhpcyB3aWxsIG5vdCBwcm9kdWNlIGFuIGVycm9yCiAgd2hlbiBpdCBpcyB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byAkKGNhbGwgLi4uKSAoYnV0IG9ubHkgdGhlbikuCgoqIE5ldyBwc2V1ZG8tdGFyZ2V0IC5MT1dfUkVTT0xVVElPTl9USU1FLCBzdXBlcnNlZGluZyB0aGUgY29uZmlndXJlCiAgb3B0aW9uIC0tZGlzYWJsZS1uc2VjLXRpbWVzdGFtcHMuICBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYnVpbGQKICBwcm9jZXNzIGRlcGVuZHMgb24gdG9vbHMgbGlrZSAiY3AgLXAiIHByZXNlcnZpbmcgdGltZSBzdGFtcHMsIHNpbmNlCiAgImNwIC1wIiAocmlnaHQgbm93KSBkb2Vzbid0IHByZXNlcnZlIHRoZSBzdWJzZWNvbmQgcG9ydGlvbiBvZiBhIHRpbWUKICBzdGFtcC4KCiogVXBkYXRlZCB0cmFuc2xhdGlvbnMgZm9yIEZyZW5jaCwgR2FsaWNpYW4sIEdlcm1hbiwgSmFwYW5lc2UsIEtvcmVhbiwKICBhbmQgUnVzc2lhbi4gIE5ldyB0cmFuc2xhdGlvbnMgZm9yIENyb2F0aWFuLCBEYW5pc2gsIEhlYnJldywgYW5kCiAgVHVya2lzaC4KCiogVXBkYXRlZCBpbnRlcm5hdGlvbmFsaXphdGlvbiBzdXBwb3J0IHRvIEdldHRleHQgMC4xMS41LgogIEdOVSBtYWtlIG5vdyB1c2VzIEdldHRleHQncyAiZXh0ZXJuYWwiIGZlYXR1cmUsIGFuZCBkb2VzIG5vdCBpbmNsdWRlCiAgYW55IGludGVybmF0aW9uYWxpemF0aW9uIGNvZGUgaXRzZWxmLiAgQ29uZmlndXJlIHdpbGwgc2VhcmNoIHlvdXIKICBzeXN0ZW0gZm9yIGFuIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uIG9mIEdOVSBHZXR0ZXh0IChvbmx5IEdOVSBHZXR0ZXh0CiAgaXMgYWNjZXB0YWJsZSkgYW5kIHVzZSBpdCBpZiBpdCBleGlzdHMuICBJZiBub3QsIE5MUyB3aWxsIGJlIGRpc2FibGVkLgogIFNlZSBBQk9VVC1OTFMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgoqIFVwZGF0ZWQgdG8gYXV0b2NvbmYgMi41NCBhbmQgYXV0b21ha2UgMS43LiAgVXNlcnMgc2hvdWxkIG5vdCBiZSBpbXBhY3RlZC4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogSW4gZGVmYXVsdC5jIGRlZmluZSB2YXJpYWJsZSBBUkNIIGFzIElBNjQgZm9yIFZNUyBvbiBJdGFuaXVtIHN5c3RlbXMuCgogICogSW4gbWFrZWZpbGUudm1zIGF2b2lkIG5hbWUgY29sbGlzaW9uIGZvciBnbG9iIGFuZCBnbG9iZnJlZS4KCiAgKiBUaGlzIGlzIHRoZSBWTVMgcG9ydCBvZiBHTlUgTWFrZSBkb25lIGJ5IEhhcnRtdXQuQmVja2VyQGNvbXBhcS5jb20uCgogICAgSXQgaXMgYmFzZWQgb24gdGhlIHNwZWNpZmljIHZlcnNpb24gMy43N2sgYW5kIG9uIDMuNzguMS4gMy43N2sgd2FzIGRvbmUKICAgIGJ5IEtsYXVzIEvkbXBmIDxra2FlbXBmQHJtaS5kZT4sIHRoZSBjb2RlIHdhcyBiYXNlZCBvbiB0aGUgVk1TIHBvcnQgb2YKICAgIEdOVSBNYWtlIDMuNjAgYnkgTWlrZSBNb3JldHRpLgoKICAgIEl0IHdhcyBwb3J0ZWQgb24gT3BlblZNUy9BbHBoYSBWNy4xLCBERUNDIFY1LjctMDA2LiBJdCB3YXMgcmUtYnVpbGQgYW5kCiAgICB0ZXN0ZWQgb24gT3BlblZNUy9BbHBoYSBWNy4yLCBPcGVuVk1TL1ZBWCA3LjEgYW5kIDUuNS0yLiBEaWZmZXJlbnQKICAgIHZlcnNpb25zIG9mIERFQ0Mgd2VyZSB1c2VkLiBWQVhDIHdhcyB0cmllZDogaXQgZmFpbHM7IGJ1dCBpdCBkb2Vzbid0CiAgICBzZWVtIHdvcnRoIHRvIGdldCBpdCB3b3JraW5nLiBUaGVyZSBhcmUgc3RpbGwgc29tZSBQVFJNSVNNQVRDSCB3YXJuaW5ncwogICAgZHVyaW5nIHRoZSBjb21waWxlLiBBbHRob3VnaCBwZXJsIGlzIHdvcmtpbmcgb24gVk1TIHRoZSB0ZXN0IHNjcmlwdHMKICAgIGRvbid0IHdvcmsuIFRoZSBmdW5jdGlvbiAkc2hlbGwgaXMgc3RpbGwgbWlzc2luZy4KCiAgICBUaGVyZSBpcyBhIGtub3duIGJ1ZyBpbiBzb21lIG9mIHRoZSBWTVMgQ1JUTHMuIEl0IGlzIGluIHRoZSBzaGlwcGVkCiAgICB2ZXJzaW9ucyBvZiBWTVMgVjcuMiBhbmQgVjcuMi0xIGFuZCBpbiB0aGUgY3VycmVudGx5IChPY3RvYmVyIDE5OTkpCiAgICBhdmFpbGFibGUgRUNPcyBmb3IgVk1TIFY3LjEgYW5kIG5ld2VyIHZlcnNpb25zLiBJdCBpcyBmaXhlZCBpbiB2ZXJzaW9ucwogICAgc2hpcHBlZCB3aXRoIG5ld2VyIFZNUyB2ZXJzaW9ucyBhbmQgYWxsIEVDTyBraXRzIGFmdGVyIE9jdG9iZXIgMTk5OS4gSXQKICAgIG9ubHkgc2hvd3MgdXAgZHVyaW5nIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBwZXJpb2QgKERTVCk6IHN0YXQoKQogICAgcmV0dXJucyBhIG1vZGlmaWNhdGlvbiB0aW1lIDEgaG91ciBhaGVhZC4gVGhpcyByZXN1bHRzIGluIEdOVSBtYWtlCiAgICB3YXJuaW5nIG1lc3NhZ2VzLiBGb3IgYSBqdXN0IGNyZWF0ZWQgc291cmNlIHlvdSB3aWxsIHNlZToKCiAgICAgJCBnbWFrZSB4LmV4ZQogICAgIGdtYWtlLmV4ZTsxOiAqKiogV2FybmluZzogRmlsZSAneC5jJyBoYXMgbW9kaWZpY2F0aW9uIHRpbWUgaW4gdGhlIGZ1dHVyZQogICAgICg5NDA1ODI4NjMgPiA5NDA1NzkyNjkpCiAgICAgY2MgICAgL29iaj14Lm9iaiB4LmMKICAgICBsaW5rICB4Lm9iaiAgICAvZXhlPXguZXhlCiAgICAgZ21ha2UuZXhlOzE6ICoqKiBXYXJuaW5nOiAgQ2xvY2sgc2tldyBkZXRlY3RlZC4gIFlvdXIgYnVpbGQgbWF5IGJlCiAgICAgaW5jb21wbGV0ZS4KCgpBIGNvbXBsZXRlIGxpc3Qgb2YgYnVncyBmaXhlZCBpbiB0aGlzIHZlcnNpb24gaXMgYXZhaWxhYmxlIGhlcmU6CgogIGh0dHA6Ly9zYXZhbm5haC5nbnUub3JnL2J1Z3MvaW5kZXgucGhwP2dyb3VwPW1ha2UmcmVwb3J0X2lkPTExMSZmaXhfcmVsZWFzZV9pZD0xMDIKCgwKVmVyc2lvbiAzLjc5LjEgKDIzIEp1biAyMDAwKQoKKiAuU0VDT05EQVJZIHdpdGggbm8gcHJlcmVxdWlzaXRlcyBub3cgcHJldmVudHMgYW55IHRhcmdldCBmcm9tIGJlaW5nCiAgcmVtb3ZlZCBiZWNhdXNlIG1ha2UgdGhpbmtzIGl0J3MgYW4gaW50ZXJtZWRpYXRlIGZpbGUsIG5vdCBqdXN0IHRob3NlCiAgbGlzdGVkIGluIHRoZSBtYWtlZmlsZS4KCiogTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS1kaXNhYmxlLW5zZWMtdGltZXN0YW1wcywgYnV0IHRoaXMgd2FzCiAgc3VwZXJzZWRlZCBpbiBsYXRlciB2ZXJzaW9ucyBieSB0aGUgLkxPV19SRVNPTFVUSU9OX1RJTUUgcHNldWRvLXRhcmdldC4KDApWZXJzaW9uIDMuNzkgKDA0IEFwciAyMDAwKQoKKiBHTlUgbWFrZSBvcHRpb25hbGx5IHN1cHBvcnRzIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGVzIHZpYSB0aGUKICBHTlUgZ2V0dGV4dCAob3IgbG9jYWwgZ2V0dGV4dCBpZiBzdWl0YWJsZSkgcGFja2FnZS4gIFNlZSB0aGUgQUJPVVQtTkxTCiAgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyBHTlUgbWFrZSBmb3IgTkxTLgoKKiBQcmV2aW91c2x5LCBHTlUgbWFrZSBxdW90ZWQgdmFyaWFibGVzIHN1Y2ggYXMgTUFLRUZMQUdTIGFuZAogIE1BS0VPVkVSUklERVMgZm9yIHByb3BlciBwYXJzaW5nIGJ5IHRoZSBzaGVsbC4gIFRoaXMgYWxsb3dlZCB0aGVtIHRvCiAgYmUgdXNlZCB3aXRoaW4gbWFrZSBidWlsZCBzY3JpcHRzLiAgSG93ZXZlciwgdXNpbmcgdGhlbSB0aGVyZSBpcyBub3QKICBwcm9wZXIgYmVoYXZpb3I6IHRoZXkgYXJlIG1lYW50IHRvIGJlIHBhc3NlZCB0byBzdWJzaGVsbHMgdmlhIHRoZQogIGVudmlyb25tZW50LiAgVW5mb3J0dW5hdGVseSB0aGUgdmFsdWVzIHdlcmUgbm90IHF1b3RlZCBwcm9wZXJseSB0byBiZQogIHBhc3NlZCB0aHJvdWdoIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgbWVhbnQgdGhhdCBtYWtlIGRpZG4ndCBwcm9wZXJseQogIHBhc3Mgc29tZSB0eXBlcyBvZiBjb21tYW5kIGxpbmUgdmFsdWVzIHRvIHN1Ym1ha2VzLgoKICBXaXRoIHRoaXMgdmVyc2lvbiB3ZSBjaGFuZ2UgdGhhdCBiZWhhdmlvcjogbm93IHRoZXNlIHZhcmlhYmxlcyBhcmUKICBxdW90ZWQgcHJvcGVybHkgZm9yIHBhc3NpbmcgdGhyb3VnaCB0aGUgZW52aXJvbm1lbnQsIHdoaWNoIGlzIHRoZQogIGNvcnJlY3Qgd2F5IHRvIGRvIGl0LiAgSWYgeW91IHByZXZpb3VzbHkgdXNlZCB0aGVzZSB2YXJpYWJsZXMKICBleHBsaWNpdGx5IHdpdGhpbiBhIG1ha2UgcnVsZSB5b3UgbWF5IG5lZWQgdG8gcmUtZXhhbWluZSB5b3VyIHVzZSBmb3IKICBjb3JyZWN0bmVzcyBnaXZlbiB0aGlzIGNoYW5nZS4KCiogQSBuZXcgcHNldWRvLXRhcmdldCAuTk9UUEFSQUxMRUwgaXMgYXZhaWxhYmxlLiAgSWYgZGVmaW5lZCwgdGhlCiAgY3VycmVudCBtYWtlZmlsZSBpcyBydW4gc2VyaWFsbHkgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgLWouCiAgSG93ZXZlciwgc3VibWFrZXMgYXJlIHN0aWxsIGVsaWdpYmxlIGZvciBwYXJhbGxlbCBleGVjdXRpb24uCgoqIFRoZSAtLWRlYnVnIG9wdGlvbiBoYXMgY2hhbmdlZDogaXQgbm93IGFsbG93cyBvcHRpb25hbCBmbGFncwogIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgYW5kIHR5cGUgb2YgZGVidWdnaW5nIG91dHB1dC4gIEJ5IGRlZmF1bHQgb25seQogIGEgbWluaW1hbCBhbW91bnQgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLCBkaXNwbGF5aW5nIHRoZSBuYW1lcyBvZgogICJub3JtYWwiIHRhcmdldHMgKG5vdCBtYWtlZmlsZXMpIHRoYXQgd2VyZSBkZWVtZWQgb3V0IG9mIGRhdGUgYW5kIGluCiAgbmVlZCBvZiBiZWluZyByZWJ1aWx0LgoKICBOb3RlIHRoYXQgdGhlIC1kIG9wdGlvbiBiZWhhdmVzIGFzIGJlZm9yZTogaXQgdGFrZXMgbm8gYXJndW1lbnRzIGFuZAogIGFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgoKKiBUaGUgYC1wJyAocHJpbnQgZGF0YWJhc2UpIG91dHB1dCBub3cgaW5jbHVkZXMgZmlsZW5hbWUgYW5kIGxpbmVudW1iZXIKICBpbmZvcm1hdGlvbiBmb3IgdmFyaWFibGUgZGVmaW5pdGlvbnMsIHRvIGFpZCBkZWJ1Z2dpbmcuCgoqIFRoZSB3b3JkbGlzdCBmdW5jdGlvbiBubyBsb25nZXIgcmV2ZXJzZXMgaXRzIGFyZ3VtZW50cyBpZiB0aGUgInN0YXJ0IgogIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgImVuZCIgdmFsdWUuICBJZiB0aGF0J3MgdHJ1ZSwgbm90aGluZyBpcwogIHJldHVybmVkLgoKKiBIYXJ0bXV0IEJlY2tlciBwcm92aWRlZCBtYW55IHVwZGF0ZXMgZm9yIHRoZSBWTVMgcG9ydCBvZiBHTlUgbWFrZS4KICBTZWUgdGhlIFJFQURNRS5WTVMgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKKiBWTVMtc3BlY2lmaWMgY2hhbmdlczoKCiAgKiBGaXggYSBwcm9ibGVtIHdpdGggYXV0b21hdGljYWxseSByZW1ha2luZyBtYWtlZmlsZXMuIEdOVSBtYWtlIHVzZXMgYW4KICAgIGV4ZWN2ZSB0byByZXN0YXJ0IGl0c2VsZiBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVtYWtlIG9mIHRoZSBtYWtlZmlsZS4gT24KICAgIFVOSVggc3lzdGVtcyBleGVjdmUgcmVwbGFjZXMgdGhlIHJ1bm5pbmcgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZSBhbmQKICAgIHJlc2V0cyBhbGwgc2lnbmFsIGhhbmRsaW5nIHRvIHRoZSBkZWZhdWx0LiBPbiBWTVMgZXhlY3ZlIGNyZWF0ZXMgYSBjaGlsZAogICAgcHJvY2Vzcywgc2lnbmFsIGFuZCBleGl0IGhhbmRsZXJzIG9mIHRoZSBwYXJlbnQgYXJlIHN0aWxsIGFjdGl2ZSwgYW5kLAogICAgdW5mb3J0dW5hdGVseSwgY29ycnVwdCB0aGUgZXhpdCBjb2RlIGZyb20gdGhlIGNoaWxkLiBGaXggaW4gam9iLmM6CiAgICBpZ25vcmUgU0lHQ0hMRC4KCiAgKiBBZGRlZCBzb21lIHN3aXRjaGVzIHRvIHJlZmxlY3QgbGF0ZXN0IGZlYXR1cmVzIG9mIERFQ0MuIE1vZGlmaWNhdGlvbnMgaW4KICAgIG1ha2VmaWxlLnZtcy4KCiAgKiBTZXQgc29tZSBkZWZpbml0aW9ucyB0byByZWZsZWN0IGxhdGVzdCBmZWF0dXJlcyBvZiBERUNDLiBNb2RpZmljYXRpb25zIGluCiAgICBjb25maWcuaC12bXMgKHdoaWNoIGlzIGNvcGllZCB0byBjb25maWcuaCkuCgogICogQWRkZWQgZXh0ZXJuIHN0cmNtcGkgZGVjbGFyYXRpb24gdG8gYXZvaWQgJ2ltcGxpY2l0bHkgZGVjbGFyZWQnIG1lc3NhZ2VzLgogICAgTW9kaWZpY2F0aW9uIGluIG1ha2UuaC4KCiAgKiBEZWZhdWx0IHJ1bGUgZm9yIEMrKywgY29uZGl0aW9uYWxzIGZvciBnY2MgKEdDQ19JU19OQVRJVkUpIG9yIERFQy9EaWdpdGFsLwogICAgQ29tcGFxIGMvYysrIGNvbXBpbGVycy4gTW9kaWZpY2F0aW9ucyBpbiBkZWZhdWx0LmMuCgogICogVXNhZ2Ugb2Ygb3BlbmRpcigpIGFuZCBmcmllbmRzLCBzdXBwcmVzcyBmaWxlIHZlcnNpb24uIE1vZGlmaWNhdGlvbnMgaW4KICAgIGRpci5jLgoKICAqIEFkZGVkIFZNUyBzcGVjaWZpYyBjb2RlIHRvIGhhbmRsZSBjdHJsK2MgYW5kIGN0cmwreSB0byBhYm9ydCBtYWtlLgogICAgTW9kaWZpY2F0aW9ucyBpbiBqb2IuYy4KCiAgKiBBZGRlZCBzdXBwb3J0IHRvIGhhdmUgY2FzZSBzZW5zaXRpdmUgdGFyZ2V0cyBhbmQgZGVwZW5kZW5jaWVzIGJ1dCB0bwogICAgc3RpbGwgdXNlIGNhc2UgYmxpbmQgZmlsZSBuYW1lcy4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgSmF2YQogICAgbWFrZWZpbGVzIG9uIFZNUzoKCiAgICAgICAgLlNVRkZJWEVTIDoKICAgICAgICAuU1VGRklYRVMgOiAuY2xhc3MgLmphdmEKICAgICAgICAuamF2YS5jbGFzcyA6CiAgICAgICAgICAgICAgICBqYXZhYyAiJDwKICAgICAgICBIZWxsb1dvcmxkLmNsYXNzIDogICAgICBIZWxsb1dvcmxkLmphdmEKCiAgKiBBIG5ldyBtYWNybyBXQU5UX0NBU0VfU0VOU0lUSVZFX1RBUkdFVFMgaW4gY29uZmlnLmgtdm1zIHdhcyBpbnRyb2R1Y2VkLgogICAgSXQgbmVlZHMgdG8gYmUgZW5hYmxlZCB0byBnZXQgdGhpcyBmZWF0dXJlOyBkZWZhdWx0IGlzIGRpc2FibGVkLiAgVGhlCiAgICBtYWNybyBIQVZFX0NBU0VfSU5TRU5TSVRJVkVfRlMgbXVzdCBub3QgYmUgdG91Y2hlZDogaXQgaXMgc3RpbGwgZW5hYmxlZC4KICAgIE1vZGlmaWNhdGlvbnMgaW4gZmlsZS5jIGFuZCBjb25maWcuaC12bXMuCgogICogQm9vdHN0cmFwIG1ha2UgdG8gc3RhcnQgYnVpbGRpbmcgbWFrZSBpcyBzdGlsbCBtYWtlZmlsZS5jb20sIGJ1dCBtYWtlCiAgICBuZWVkcyB0byBiZSByZS1tYWRlIHdpdGggYSBtYWtlIHRvIG1ha2UgYSBjb3JyZWN0IHZlcnNpb246IGlnbm9yZSBhbGwKICAgIHBvc3NpYmxlIHdhcm5pbmdzLCBkZWxldGUgYWxsIG9iamVjdHMsIHJlbmFtZSBtYWtlLmV4ZSB0byBhIGRpZmZlcmVudAogICAgbmFtZSBhbmQgcnVuIGl0LgoKICAqIE1hZGUgc29tZSBtaW5vciBtb2RpZmljYXRpb25zIHRvIHRoZSBib290c3RyYXAgYnVpbGQgbWFrZWZpbGUuY29tLgoMClZlcnNpb24gMy43OCAoMjIgU2VwIDE5OTkpCgoqIFR3byBuZXcgZnVuY3Rpb25zLCAkKGVycm9yIC4uLikgYW5kICQod2FybmluZyAuLi4pIGFyZSBhdmFpbGFibGUuICBUaGUKICBmb3JtZXIgd2lsbCBjYXVzZSBtYWtlIHRvIGZhaWwgYW5kIGV4aXQgaW1tZWRpYXRlbHkgdXBvbiBleHBhbnNpb24gb2YKICB0aGUgZnVuY3Rpb24sIHdpdGggdGhlIHRleHQgcHJvdmlkZWQgYXMgdGhlIGVycm9yIG1lc3NhZ2UuICBUaGUgbGF0dGVyCiAgY2F1c2VzIHRoZSB0ZXh0IHByb3ZpZGVkIHRvIGJlIHByaW50ZWQgYXMgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBtYWtlCiAgcHJvY2VlZHMgbm9ybWFsbHkuCgoqIEEgbmV3IGZ1bmN0aW9uICQoY2FsbCAuLi4pIGlzIGF2YWlsYWJsZS4gIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGNyZWF0ZQogIHRoZWlyIG93biBwYXJhbWV0ZXJpemVkIG1hY3JvcyBhbmQgaW52b2tlIHRoZW0gbGF0ZXIuICBPcmlnaW5hbAogIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGJ5IEhhbi1XZW4gTmllbmh1eXMKICA8aGFud2VuQGNzLnV1Lm5sPi4KCiogQSBuZXcgZnVuY3Rpb24gJChpZiAuLi4pIGlzIGF2YWlsYWJsZS4gIEl0IHByb3ZpZGVzIGlmLXRoZW4tZWxzZQogIGNhcGFiaWxpdGllcyBpbiBhIGJ1aWx0aW4gZnVuY3Rpb24uICBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCiAgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGJ5IEhhbi1XZW4gTmllbmh1eXMgPGhhbndlbkBjcy51dS5ubD4uCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyB2YXJpYWJsZSwgLkxJQlBBVFRFUk5TLiAgVGhpcyB2YXJpYWJsZSBjb250cm9scyBob3cKICBsaWJyYXJ5IGRlcGVuZGVuY3kgZXhwYW5zaW9uIChkZXBlbmRlbmNpZXMgbGlrZSBgYC1sZm9vJycpIGlzIHBlcmZvcm1lZC4KCiogTWFrZSBhY2NlcHRzIENSTEYgc2VxdWVuY2VzIGFzIHdlbGwgYXMgdHJhZGl0aW9uYWwgTEYsIGZvcgogIGNvbXBhdGliaWxpdHkgd2l0aCBtYWtlZmlsZXMgY3JlYXRlZCBvbiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KCiogTWFrZSBhY2NlcHRzIGEgbmV3IG9wdGlvbjogLVIsIG9yIC0tbm8tYnVpbHRpbi12YXJpYWJsZXMuICBUaGlzIG9wdGlvbgogIGRpc2FibGVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBydWxlLXNwZWNpZmljIGJ1aWx0aW4gdmFyaWFibGVzIChDQywKICBMRCwgQVIsIGV0Yy4pLiAgU3BlY2lmeWluZyB0aGlzIG9wdGlvbiBmb3JjZXMgLXIgKC0tbm8tYnVpbHRpbi1ydWxlcykKICBhcyB3ZWxsLgoKKiBBICJqb2Igc2VydmVyIiBmZWF0dXJlLCBzdWdnZXN0ZWQgYnkgSG93YXJkIENodSA8aHljQGhpZ2hsYW5kc3VuLmNvbT4uCgogIE9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IFBPU0lYIHBpcGUoMikgc2VtYW50aWNzLCBHTlUgbWFrZSBjYW4gbm93IHBhc3MKICAtak4gb3B0aW9ucyB0byBzdWJtYWtlcyByYXRoZXIgdGhhbiBmb3JjaW5nIHRoZW0gYWxsIHRvIHVzZSAtajEuICBUaGUKICB0b3AgbWFrZSBhbmQgYWxsIGl0cyBzdWItbWFrZSBwcm9jZXNzZXMgdXNlIGEgcGlwZSB0byBjb21tdW5pY2F0ZSB3aXRoCiAgZWFjaCBvdGhlciB0byBlbnN1cmUgdGhhdCBubyBtb3JlIHRoYW4gTiBqb2JzIGFyZSBzdGFydGVkIGFjcm9zcyBhbGwKICBtYWtlcy4gIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yIG9mIC1qIGJhY2ssIHlvdSBjYW4gY29uZmlndXJlIG1ha2UKICB3aXRoIHRoZSAtLWRpc2FibGUtam9iLXNlcnZlciBvcHRpb24uCgoqIFRoZSBjb25mdXNpbmcgdGVybSAiZGVwZW5kZW5jeSIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG1vcmUgYWNjdXJhdGUKICBhbmQgc3RhbmRhcmQgdGVybSAicHJlcmVxdWlzaXRlIiwgYm90aCBpbiB0aGUgbWFudWFsIGFuZCBpbiBhbGwgR05VIG1ha2UKICBvdXRwdXQuCgoqIEdOVSBtYWtlIHN1cHBvcnRzIHRoZSAiYmlnIGFyY2hpdmUiIGxpYnJhcnkgZm9ybWF0IGludHJvZHVjZWQgaW4gQUlYIDQuMy4KCiogR05VIG1ha2Ugc3VwcG9ydHMgbGFyZ2UgZmlsZXMgb24gQUlYLCBIUC1VWCwgYW5kIElSSVguICBUaGVzZSBjaGFuZ2VzCiAgd2VyZSBwcm92aWRlZCBieSBQYXVsIEVnZ2VydCA8ZWdnZXJ0QHR3aW5zdW4uY29tPi4gIChMYXJnZSBmaWxlCiAgc3VwcG9ydCBmb3IgU29sYXJpcyBhbmQgTGludXggd2FzIGludHJvZHVjZWQgaW4gMy43NywgYnV0IHRoZQogIGNvbmZpZ3VyYXRpb24gaGFkIGlzc3VlczogdGhlc2UgaGF2ZSBhbHNvIGJlZW4gcmVzb2x2ZWQpLgoKKiBUaGUgV2luZG93cyA5NS85OC9OVCAoVzMyKSB2ZXJzaW9uIG9mIEdOVSBtYWtlIG5vdyBoYXMgbmF0aXZlIHN1cHBvcnQKICBmb3IgdGhlIEN5Z251cyBDeWd3aW4gcmVsZWFzZSBCMjAuMSBzaGVsbCAoYmFzaCkuCgoqIFRoZSBHTlUgbWFrZSByZWdyZXNzaW9uIHRlc3Qgc3VpdGUsIGxvbmcgYXZhaWxhYmxlIHNlcGFyYXRlbHkgInVuZGVyCiAgdGhlIHRhYmxlIiwgaGFzIGJlZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSByZWxlYXNlLiAgWW91IGNhbiBpbnZva2UgaXQKICBieSBydW5uaW5nICJtYWtlIGNoZWNrIiBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgTm90ZSB0aGF0IGl0IHJlcXVpcmVzCiAgUGVybCAoZWl0aGVyIFBlcmwgNCBvciBQZXJsIDUpIHRvIHJ1bi4KDApWZXJzaW9uIDMuNzcgKDI4IEp1bCAxOTk4KQoKKiBJbXBsZW1lbnQgQlNEIG1ha2UncyAiPz0iIHZhcmlhYmxlIGFzc2lnbm1lbnQgb3BlcmF0b3IuICBUaGUgdmFyaWFibGUKICBpcyBhc3NpZ25lZCB0aGUgc3BlY2lmaWVkIHZhbHVlIG9ubHkgaWYgdGhhdCB2YXJpYWJsZSBpcyBub3QgYWxyZWFkeQogIGRlZmluZWQuCgoqIE1ha2UgZGVmaW5lcyBhIG5ldyB2YXJpYWJsZSwgIkNVUkRJUiIsIHRvIGNvbnRhaW4gdGhlIGN1cnJlbnQgd29ya2luZwogIGRpcmVjdG9yeSAoYWZ0ZXIgdGhlIC1DIG9wdGlvbiwgaWYgYW55LCBoYXMgYmVlbiBwcm9jZXNzZWQpLgogIE1vZGlmeWluZyB0aGlzIHZhcmlhYmxlIGhhcyBubyBlZmZlY3Qgb24gdGhlIG9wZXJhdGlvbiBvZiBtYWtlLgoKKiBNYWtlIGRlZmluZXMgYSBuZXcgZGVmYXVsdCBSQ1MgcnVsZSwgZm9yIG5ldy1zdHlsZSBtYXN0ZXIgZmlsZQogIHN0b3JhZ2U6IGBgJSA6OiBSQ1MvJScnIChub3RlIG5vIGBgLHYnJyBzdWZmaXgpLgoKICBNYWtlIGRlZmluZXMgbmV3IGRlZmF1bHQgcnVsZXMgZm9yIERPUy1zdHlsZSBDKysgZmlsZSBuYW1pbmcKICBjb252ZW50aW9ucywgd2l0aCBgYC5jcHAnJyBzdWZmaXhlcy4gIEFsbCB0aGUgc2FtZSBydWxlcyBhcyBmb3IKICBgYC5jYycnIGFuZCBgYC5DJycgc3VmZml4ZXMgYXJlIHByb3ZpZGVkLCBhbG9uZyB3aXRoIExJTksuY3BwIGFuZAogIENPTVBJTEUuY3BwIG1hY3JvcyAod2hpY2ggZGVmYXVsdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBMSU5LLmNjIGFuZAogIENPTVBJTEUuY2MpLiAgTm90ZSBDUFBGTEFHUyBpcyBzdGlsbCBDIHByZXByb2Nlc3NvciBmbGFncyEgIFlvdSBzaG91bGQKICB1c2UgQ1hYRkxBR1MgdG8gY2hhbmdlIEMrKyBjb21waWxlciBmbGFncy4KCiogQSBuZXcgZmVhdHVyZSwgInRhcmdldC1zcGVjaWZpYyB2YXJpYWJsZSB2YWx1ZXMiLCBoYXMgYmVlbiBhZGRlZC4KICBUaGlzIGlzIGEgbGFyZ2UgY2hhbmdlIHNvIHBsZWFzZSBzZWUgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zIG9mIHRoZQogIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLiAgQnJpZWZseSwgc3ludGF4IGxpa2UgdGhpczoKCiAgICBUQVJHRVQ6IFZBUklBQkxFID0gVkFMVUUKCiAgZGVmaW5lcyBWQVJJQUJMRSBhcyBWQUxVRSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgVEFSR0VULiAgVGhpcyBpcwogIHNpbWlsYXIgdG8gU3VuT1MgbWFrZSdzICJUQVJHRVQgOj0gVkFSSUFCTEUgPSBWQUxVRSIgZmVhdHVyZS4gIE5vdGUKICB0aGF0IHRoZSBhc3NpZ25tZW50IG1heSBiZSBvZiBhbnkgdHlwZSwgbm90IGp1c3QgcmVjdXJzaXZlLCBhbmQgdGhhdAogIHRoZSBvdmVycmlkZSBrZXl3b3JkIGlzIGF2YWlsYWJsZS4KCiAgQ09NUEFUSUJJTElUWTogVGhpcyBuZXcgc3ludGF4IG1lYW5zIHRoYXQgaWYgeW91IGhhdmUgYW55IHJ1bGVzIHdoZXJlCiAgdGhlIGZpcnN0IG9yIHNlY29uZCBkZXBlbmRlbmN5IGhhcyBhbiBlcXVhbCBzaWduICg9KSBpbiBpdHMgbmFtZSwKICB5b3UnbGwgaGF2ZSB0byBlc2NhcGUgdGhlbSB3aXRoIGEgYmFja3NsYXNoOiAiZm9vIDogYmFyXD1iYXoiLgogIEZ1cnRoZXIsIGlmIHlvdSBoYXZlIGFueSBkZXBlbmRlbmNpZXMgd2hpY2ggYWxyZWFkeSBjb250YWluICJcPSIsCiAgeW91J2xsIGhhdmUgdG8gZXNjYXBlIGJvdGggb2YgdGhlbTogImZvbyA6IGJhclxcXD1iYXoiLgoKKiBBIG5ldyBhcHBlbmRpeCBsaXN0aW5nIHRoZSBtb3N0IGNvbW1vbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcwogIGdlbmVyYXRlZCBieSBHTlUgbWFrZSwgd2l0aCBzb21lIGV4cGxhbmF0aW9uLCBoYXMgYmVlbiBhZGRlZCB0byB0aGUKICBHTlUgbWFrZSBVc2VyJ3MgTWFudWFsLgoKKiBVcGRhdGVzIHRvIHRoZSBHTlUgbWFrZSBDdXN0b21zIGxpYnJhcnkgc3VwcG9ydCAoc2VlIFJFQURNRS5jdXN0b21zKS4KCiogVXBkYXRlcyB0byB0aGUgV2luZG93cyA5NS9OVCBwb3J0IGZyb20gUm9iIFR1bGxvaCAoc2VlIFJFQURNRS5XMzIpLAogIGFuZCB0byB0aGUgRE9TIHBvcnQgZnJvbSBFbGkgWmFyZXRza2kgKHNlZSBSRUFETUUuRE9TKS4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogVGhpcyBpcyB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UuCiAgICBJdCBpcyBiYXNlZCBvbiB0aGUgVk1TIHBvcnQgb2YgR05VIE1ha2UgMy42MCBieSBNaWtlIE1vcmV0dGkuCiAgICBUaGlzIHBvcnQgd2FzIGRvbmUgYnkgS2xhdXMgS+RtcGYgPGtrYWVtcGZAcm1pLmRlPgoKICAqIFRoZXJlIGlzIGZpcnN0LWxldmVsIHN1cHBvcnQgYXZhaWxhYmxlIGZyb20gcHJvR0lTIFNvZnR3YXJlLCBHZXJtYW55LgogICAgVmlzaXQgdGhlaXIgd2ViLXNpdGUgYXQgaHR0cDovL3d3dy5wcm9naXMuZGUgdG8gZ2V0IGluZm9ybWF0aW9uCiAgICBhYm91dCBvdGhlciB2bXMgc29mdHdhcmUgYW5kIGZvcnRoY29taW5nIHVwZGF0ZXMgdG8gZ251IG1ha2UuCgogICogL2Jpbi9zaCBzdHlsZSBJL08gcmVkaXJlY3Rpb24gaXMgc3VwcG9ydGVkLiBZb3UgY2FuIG5vdyB3cml0ZSBsaW5lcyBsaWtlCiAgICAgICAgbWNyIHN5cyRkaXNrOltdcHJvZ3JhbS5leGUgPCBpbnB1dC50eHQgPiBvdXRwdXQudHh0ICY+IGVycm9yLnR4dAoKICAqIE1ha2VmaWxlIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LiBZb3UgY2FuIHNldAogICAgc3ltYm9scyBvciBsb2dpY2FscyBpbiBEQ0wgYW5kIGV2YWx1YXRlIHRoZW0gaW4gdGhlIE1ha2VmaWxlIHZpYQogICAgJCg8bmFtZS1vZi1zeW1ib2wtb3ItbG9naWNhbD4pLiAgVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIE1ha2VmaWxlCiAgICBvdmVycmlkZSBWTVMgc3ltYm9scy9sb2dpY2FscyAhCgogICogRnVuY3Rpb25zIGZvciBmaWxlIG5hbWVzIGFyZSB3b3JraW5nIG5vdy4gU2VlIHRoZSBHTlUgTWFrZSBtYW51YWwgZm9yCiAgICAkKGRpciAuLi4pICBhbmQgJCh3aWxkY2FyZCAuLi4pLiAgVW5peC1zdHlsZSBhbmQgVk1TLXN0eWxlIG5hbWVzIGFyZQogICAgc3VwcG9ydGVkIGFzIGFyZ3VtZW50cy4KCiAgKiBUaGUgZGVmYXVsdCBydWxlcyBhcmUgc2V0IHVwIGZvciBHTlUgQy4gQnVpbGRpbmcgYW4gZXhlY3V0YWJsZSBmcm9tIGEKICAgIHNpbmdsZSBzb3VyY2UgZmlsZSBpcyBhcyBlYXN5IGFzICdtYWtlIGZpbGUuZXhlJy4KCiAgKiBUaGUgdmFyaWFibGUgJChBUkNIKSBpcyBwcmVkZWZpbmVkIGFzIEFMUEhBIG9yIFZBWCByZXNwLiBNYWtlZmlsZXMgZm9yCiAgICBkaWZmZXJlbnQgVk1TIHN5c3RlbXMgY2FuIG5vdyBiZSB3cml0dGVuIGJ5IGNoZWNraW5nICQoQVJDSCkgYXMgaW4KICAgICAgaWZlcSAoJChBUkNIKSxBTFBIQSkKICAgICAgICAkKEVDSE8pICJPbiB0aGUgQWxwaGEiCiAgICAgIGVsc2UKICAgICAgICAkKEVDSE8pICJPbiB0aGUgVkFYIgogICAgICBlbmRpZgoKICAqIENvbW1hbmQgbGluZXMgb2YgZXhjZXNzaXZlIGxlbmd0aCBhcmUgY29ycmVjdGx5IGJyb2tlbiBhbmQgd3JpdHRlbiB0byBhCiAgICBiYXRjaCBmaWxlIGluIHN5cyRzY3JhdGNoIGZvciBsYXRlciBleGVjdXRpb24uIFRoZXJlJ3Mgbm8gbGltaXQgdG8gdGhlCiAgICBsZW5ndGhzIG9mIGNvbW1hbmRzIChhbmQgbm8gbmVlZCBmb3IgLm9wdCBmaWxlcyA6LSkgYW55IG1vcmUuCgogICogRW1wdHkgY29tbWFuZHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5IGFuZCBkb24ndCBlbmQgaW4gYSBuZXcgRENMIHByb2Nlc3MuCgwKVmVyc2lvbiAzLjc2LjEgKDE5IFNlcCAxOTk3KQoKKiBTbWFsbCAoYnV0IHNlcmlvdXMpIGJ1ZyBmaXguICBRdWljayByb2xsb3V0IHRvIGdldCBpbnRvIHRoZSBHTlUgc291cmNlIENELgoMClZlcnNpb24gMy43NiAoMTYgU2VwIDE5OTcpCgoqIEdOVSBtYWtlIG5vdyB1c2VzIGF1dG9tYWtlIHRvIGNvbnRyb2wgTWFrZWZpbGUuaW4gZ2VuZXJhdGlvbi4gIFRoaXMKICBzaG91bGQgbWFrZSBpdCBtb3JlIGNvbnNpc3RlbnQgd2l0aCB0aGUgR05VIHN0YW5kYXJkcy4KCiogVlBBVEggZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGluY29ycG9yYXRlIHRoZSBWUEFUSCsgcGF0Y2gsCiAgcHJldmlvdXNseSBtYWludGFpbmVkIGJ5IFBhdWwgU21pdGggPHBzbWl0aEBiYXluZXR3b3Jrcy5jb20+LiAgU2VlIHRoZQogIG1hbnVhbC4KCiogTWFrZSBkZWZpbmVzIGEgbmV3IHZhcmlhYmxlLCBgTUFLRUNNREdPQUxTJywgdG8gY29udGFpbiB0aGUgZ29hbHMgdGhhdAogIHdlcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4gIE1vZGlmeWluZyB0aGlzIHZhcmlhYmxlCiAgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3BlcmF0aW9uIG9mIG1ha2UuCgoqIEEgbmV3IGZ1bmN0aW9uLCBgJCh3b3JkbGlzdCBTLEUsVEVYVCknLCBpcyBhdmFpbGFibGU6IGl0IHJldHVybnMgYQogIGxpc3Qgb2Ygd29yZHMgZnJvbSBudW1iZXIgUyB0byBudW1iZXIgRSAoaW5jbHVzaXZlKSBvZiBURVhULgoKKiBJbnN0ZWFkIG9mIGFuIGVycm9yLCBkZXRlY3Rpb24gb2YgZnV0dXJlIG1vZGlmaWNhdGlvbiB0aW1lcyBnaXZlcyBhCiAgd2FybmluZyBhbmQgY29udGludWVzLiAgVGhlIHdhcm5pbmcgaXMgcmVwZWF0ZWQganVzdCBiZWZvcmUgR05VIG1ha2UKICBleGl0cywgc28gaXQgaXMgbGVzcyBsaWtlbHkgdG8gYmUgbG9zdC4KCiogRml4IHRoZSAkKGJhc2VuYW1lKSBhbmQgJChzdWZmaXgpIGZ1bmN0aW9ucyBzbyB0aGV5IG9ubHkgb3BlcmF0ZSBvbgogIHRoZSBsYXN0IGZpbGVuYW1lLCBub3QgdGhlIGVudGlyZSBzdHJpbmc6CgogICAgICBDb21tYW5kICAgICAgICAgICAgICBPbGQgUmVzdWx0ICAgICAgICAgICAgIE5ldyBSZXN1bHQKICAgICAgLS0tLS0tLSAgICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgICAtLS0tLS0tLS0tCiAgICAkKGJhc2VuYW1lIGEuYikgICAgICAgIGEgICAgICAgICAgICAgICAgICAgICAgYQogICAgJChiYXNlbmFtZSBhLmIvYykgICAgICBhICAgICAgICAgICAgICAgICAgICAgIGEuYi9jCiAgICAkKHN1ZmZpeCBhLmIpICAgICAgICAgIGIgICAgICAgICAgICAgICAgICAgICAgYgogICAgJChzdWZmaXggYS5iL2MpICAgICAgICBiL2MgICAgICAgICAgICAgICAgICAgIDxlbXB0eT4KCiogVGhlICQoc3RyaXApIGZ1bmN0aW9uIG5vdyByZW1vdmVzIG5ld2xpbmVzIGFzIHdlbGwgYXMgVEFCcyBhbmQgc3BhY2VzLgoKKiBUaGUgJChzaGVsbCkgZnVuY3Rpb24gbm93IGNoYW5nZXMgQ1JMRiAoXHJcbikgcGFpcnMgdG8gYSBzcGFjZSBhcyB3ZWxsCiAgYXMgbmV3bGluZXMgKFxuKS4KCiogVXBkYXRlcyB0byB0aGUgV2luZG93cyA5NS9OVCBwb3J0IGZyb20gUm9iIFR1bGxvaCAoc2VlIFJFQURNRS5XMzIpLgoKKiBFbGkgWmFyZXRza2lpIGhhcyB1cGRhdGVkIHRoZSBwb3J0IHRvIDMyLWJpdCBwcm90ZWN0ZWQgbW9kZSBvbiBNU0RPUwogIGFuZCBNUy1XaW5kb3dzLCBidWlsZGluZyB3aXRoIHRoZSBESkdQUCB2MiBwb3J0IG9mIEdOVSBDL0MrKyBjb21waWxlcgogIGFuZCB1dGlsaXRpZXMuICBTZWUgUkVBRE1FLkRPUyBmb3IgZGV0YWlscywgYW5kIGRpcmVjdCBhbGwgcXVlc3Rpb25zCiAgY29uY2VybmluZyB0aGlzIHBvcnQgdG8gRWxpIFphcmV0c2tpaSA8ZWxpekBpcy5lbHRhLmNvLmlsPiBvciBESgogIERlbG9yaWUgPGRqQGRlbG9yaWUuY29tPi4KCiogVk1TLXNwZWNpZmljIGNoYW5nZXM6CgogICogSm9obiBXLiBFYXRvbiBoYXMgdXBkYXRlZCB0aGUgVk1TIHBvcnQgdG8gc3VwcG9ydCBsaWJyYXJpZXMgYW5kIFZQQVRILgoKICAqIFRoZSBjZCBjb21tYW5kIGlzIHN1cHBvcnRlZCBpZiBpdCdzIGNhbGxlZCBhcyAkKENEKS4gVGhpcyBpbnZva2VzCiAgICB0aGUgJ2J1aWx0aW5fY2QnIGNvbW1hbmQgd2hpY2ggY2hhbmdlcyB0aGUgZGlyZWN0b3J5LgogICAgQ2FsbGluZyAnc2V0IGRlZicgZG9lc24ndCBkbyB0aGUgdHJpY2ssIHNpbmNlIGEgc3ViLXNoZWxsIGlzCiAgICBzcGF3bmVkIGZvciB0aGlzIGNvbW1hbmQsIHRoZSBkaXJlY3RvcnkgaXMgY2hhbmdlZCAqaW4gdGhpcyBzdWItc2hlbGwqCiAgICBhbmQgdGhlIHN1Yi1zaGVsbCBlbmRzLgoKICAqIExpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gVGhleSB3ZXJlIGluIEdOVSBNYWtlIDMuNjAgYnV0IHNvbWVob3cgSQogICAgZGlkbid0IGNhcmUgcG9ydGluZyB0aGUgY29kZS4gSWYgdGhlcmUgaXMgZW5vdWdoIGludGVyZXN0LCBJJ2xsIGRvIGl0IGF0CiAgICBzb21lIGxhdGVyIHRpbWUuCgogICogVGhlIHZhcmlhYmxlICReIHNlcGFyYXRlcyBmaWxlcyB3aXRoIGNvbW1hcyBpbnN0ZWFkIG9mIHNwYWNlcyAoSXQncyB0aGUKICAgIG5hdHVyYWwgdGhpbmcgdG8gZG8gZm9yIFZNUykuCgogICogU2VlIGRlZmF1bHRzLmMgZm9yIFZNUyBkZWZhdWx0IHN1ZmZpeGVzIGFuZCBteSBkZWZpbml0aW9ucyBmb3IgZGVmYXVsdAogICAgcnVsZXMgYW5kIHZhcmlhYmxlcy4KCiAgKiBUaGUgc2hlbGwgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4KCiAgKiBMb2FkIGF2ZXJhZ2Ugcm91dGluZXMgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkIGZvciBWTVMgeWV0LgoKICAqIFRoZSBkZWZhdWx0IGluY2x1ZGUgZGlyZWN0b3J5IGZvciBpbmNsdWRpbmcgb3RoZXIgbWFrZWZpbGVzIGlzCiAgICBTWVMkU1lTUk9PVDpbU1lTTElCXSAoSSBkb24ndCByZW1lbWJlciB3aHkgSSBkaWRuJ3QganVzdCB1c2UKICAgIFNZUyRMSUJSQVJZOiBpbnN0ZWFkOyBtYXliZSBpdCB3b3VsZG4ndCB3b3JrIHRoYXQgd2F5KS4KCiAgKiBUaGUgZGVmYXVsdCBtYWtlZmlsZXMgbWFrZSBsb29rcyBmb3IgYXJlOiBtYWtlZmlsZS52bXMsIGdudW1ha2VmaWxlLAogICAgbWFrZWZpbGUuLCBhbmQgZ251bWFrZWZpbGUuIC4KCiAgKiBUaGUgc3RhdCgpIGZ1bmN0aW9uIGFuZCBoYW5kbGluZyBvZiB0aW1lIHN0YW1wcyBpbiBWTVMgaXMgYnJva2VuLCBzbyBJCiAgICByZXBsYWNlZCBpdCB3aXRoIGEgaGFjayBpbiB2bXNmdW5jdGlvbnMuYy4gSSB3aWxsIHByb3ZpZGUgYSBmdWxsIHJld3JpdGUKICAgIHNvbWV3aGVyZSBpbiB0aGUgZnV0dXJlLiBCZSB3YXJuZWQsIHRoZSB0aW1lIHJlc29sdXRpb24gaW5zaWRlIG1ha2UgaXMKICAgIGxlc3MgdGhhbiB3aGF0IHZtcyBwcm92aWRlcy4gVGhpcyBtaWdodCBiZSBhIHByb2JsZW0gb24gdGhlIGZhc3RlciBBbHBoYXMuCgogICogWW91IGNhbiB1c2UgYSA6IGluIGEgZmlsZW5hbWUgb25seSBpZiB5b3UgcHJlY2VkZSBpdCB3aXRoIGEgYmFja3NsYXNoICgnXCcpLgogICAgRS5nLi0gaG9iYmVzXDpbYm9nYXMuZmlsZXNdCgogICogTWFrZSBpZ25vcmVzIHN1Y2Nlc3MsIGluZm9ybWF0aW9uYWwsIG9yIHdhcm5pbmcgZXJyb3JzICgtUy0sIC1JLSwgb3IgLVctKS4KICAgIEJ1dCBpdCB3aWxsIHN0b3Agb24gLUUtIGFuZCAtRi0gZXJyb3JzLiAodW5sZXNzIHlvdSBkbyBzb21ldGhpbmcKICAgIHRvIG92ZXJyaWRlIHRoaXMgaW4geW91ciBtYWtlZmlsZSwgb3Igd2hhdGV2ZXIpLgoKICAqIFJlbW90ZSBzdHVmZiBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgogICogTXVsdGlwbGUgbGluZSBEQ0wgY29tbWFuZHMsIHN1Y2ggYXMgImlmIiBzdGF0ZW1lbnRzLCBtdXN0IGJlIHB1dCBpbnNpZGUKICAgIGNvbW1hbmQgZmlsZXMuICBZb3UgY2FuIHJ1biBhIGNvbW1hbmQgZmlsZSBieSB1c2luZyBcQC4KClZlcnNpb24gMy43NSAoMjcgQXVnIDE5OTYpCgoqIFRoZSBkaXJlY3RvcnkgbWVzc2FnZXMgcHJpbnRlZCBieSBgLXcnIGFuZCBpbXBsaWNpdGx5IGluIHN1Yi1tYWtlcywKICBhcmUgbm93IG9taXR0ZWQgaWYgTWFrZSBydW5zIG5vIGNvbW1hbmRzIGFuZCBoYXMgbm8gb3RoZXIgbWVzc2FnZXMgdG8gcHJpbnQuCgoqIE1ha2Ugbm93IGRldGVjdHMgZmlsZXMgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uIGhhdmUgbW9kaWZpY2F0aW9uIHRpbWVzCiAgaW4gdGhlIGZ1dHVyZSBhbmQgZ2l2ZXMgYW4gZXJyb3IuICBGaWxlcyB3aXRoIHN1Y2ggaW1wb3NzaWJsZSB0aW1lc3RhbXBzCiAgY2FuIHJlc3VsdCBmcm9tIHVuc3luY2hyb25pemVkIGNsb2Nrcywgb3IgYXJjaGl2ZWQgZGlzdHJpYnV0aW9ucwogIGNvbnRhaW5pbmcgYm9ndXMgdGltZXN0YW1wczsgdGhleSBjb25mdXNlIE1ha2UncyBkZXBlbmRlbmN5IGVuZ2luZQogIHRob3JvdWdobHkuCgoqIFRoZSBuZXcgZGlyZWN0aXZlIGBzaW5jbHVkZScgaXMgbm93IHJlY29nbml6ZWQgYXMgYW5vdGhlciBuYW1lIGZvcgogIGAtaW5jbHVkZScsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggc29tZSBvdGhlciBNYWtlcy4KCiogQWFyb24gRGlndWxsYSBoYXMgY29udHJpYnV0ZWQgYSBwb3J0IHRvIEFtaWdhRE9TLiAgU2VlIFJFQURNRS5BbWlnYSBmb3IKICBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBBbWlnYS1yZWxhdGVkIHF1ZXN0aW9ucyB0byA8ZGlndWxsYUBmaC1rb25zdGFuei5kZT4uCgoqIFJvYiBUdWxsb2ggb2YgVGl2b2xpIFN5c3RlbXMgaGFzIGNvbnRyaWJ1dGVkIGEgcG9ydCB0byBXaW5kb3dzIE5UIG9yIDk1LgogIFNlZSBSRUFETUUuVzMyIGZvciBkZXRhaWxzLCBhbmQgZGlyZWN0IGFsbCBXaW5kb3dzLXJlbGF0ZWQgcXVlc3Rpb25zIHRvCiAgPHJvYl90dWxsb2hAdGl2b2xpLmNvbT4uCgoqIFZNUy1zcGVjaWZpYyBjaGFuZ2VzOgoKICAqIExvdHMgb2YgZGVmYXVsdCBzZXR0aW5ncyBhcmUgYWRhcHRlZCBmb3IgVk1TLiBTZWUgZGVmYXVsdC5jLgoKICAqIExvbmcgY29tbWFuZCBsaW5lcyBhcmUgbm93IGNvbnZlcnRlZCB0byBjb21tYW5kIGZpbGVzLgoKICAqIENvbW1hICgnLCcpIGFzIGEgc2VwYXJhdG9yIGlzIG5vdyBhbGxvd2VkLiBTZWUgbWFrZWZpbGUudm1zIGZvciBhbiBleGFtcGxlLgoMClZlcnNpb24gMy43MyAoMDUgQXByIDE5OTUpCgoqIENvbnZlcnRlZCB0byB1c2UgQXV0b2NvbmYgdmVyc2lvbiAyLCBzbyBgY29uZmlndXJlJyBoYXMgc29tZSBuZXcgb3B0aW9ucy4KICBTZWUgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiogWW91IGNhbiBub3cgc2VuZCBhIFNJR1VTUjEgc2lnbmFsIHRvIE1ha2UgdG8gdG9nZ2xlIHByaW50aW5nIG9mIGRlYnVnZ2luZwogIG91dHB1dCBlbmFibGVkIGJ5IC1kLCBhdCBhbnkgdGltZSBkdXJpbmcgdGhlIHJ1bi4KDApWZXJzaW9uIDMuNzIgKDA0IE5vdiAxOTk0KQoKKiBESiBEZWxvcmllIGhhcyBwb3J0ZWQgTWFrZSB0byBNUy1ET1MgdXNpbmcgdGhlIEdPMzIgZXh0ZW5kZXIuCiAgSGUgaXMgbWFpbnRhaW5pbmcgdGhlIERPUyBwb3J0LCBub3QgdGhlIEdOVSBNYWtlIG1haW50YWluZXI7CiAgcGxlYXNlIGRpcmVjdCBidWdzIGFuZCBxdWVzdGlvbnMgZm9yIERPUyB0byA8ZGpncHBAc3VuLnNvZS5jbGFya3Nvbi5lZHU+LgogIE1TLURPUyBiaW5hcmllcyBhcmUgYXZhaWxhYmxlIGZvciBGVFAgZnJvbSBmdHAuc2ltdGVsLm5ldCBpbgogIC9wdWIvc2ltdGVsbmV0L2dudS9kamdwcC8uCgoqIFRoZSBgTUFLRUZMQUdTJyB2YXJpYWJsZSAoaW4gdGhlIGVudmlyb25tZW50IG9yIGluIGEgbWFrZWZpbGUpIGNhbiBub3cKICBjb250YWluIHZhcmlhYmxlIGRlZmluaXRpb25zIGl0c2VsZjsgdGhlc2UgYXJlIHRyZWF0ZWQganVzdCBsaWtlCiAgY29tbWFuZCBsaW5lIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgTWFrZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IGFueQogIHZhcmlhYmxlIGRlZmluaXRpb25zIGZyb20gdGhlIGVudmlyb25tZW50IHZhbHVlIG9mIGBNQUtFRkxBR1MnIG9yIGZyb20KICB0aGUgY29tbWFuZCBsaW5lLCBpbnRvIHRoZSBgTUFLRUZMQUdTJyB2YWx1ZSBleHBvcnRlZCB0byBjaGlsZHJlbi4gIFRoZQogIGBNQUtFT1ZFUlJJREVTJyB2YXJpYWJsZSBwcmV2aW91c2x5IGluY2x1ZGVkIGluIHRoZSB2YWx1ZSBvZiBgJChNQUtFKScKICBmb3Igc3ViLW1ha2VzIGlzIG5vdyBpbmNsdWRlZCBpbiBgTUFLRUZMQUdTJyBpbnN0ZWFkLiAgQXMgYmVmb3JlLCB5b3UgY2FuCiAgcmVzZXQgYE1BS0VPVkVSUklERVMnIGluIHlvdXIgbWFrZWZpbGUgdG8gYXZvaWQgcHV0dGluZyBhbGwgdGhlIHZhcmlhYmxlcwogIGluIHRoZSBlbnZpcm9ubWVudCB3aGVuIGl0cyBzaXplIGlzIGxpbWl0ZWQuCgoqIElmIGAuREVMRVRFX09OX0VSUk9SJyBhcHBlYXJzIGFzIGEgdGFyZ2V0LCBNYWtlIHdpbGwgZGVsZXRlIHRoZSB0YXJnZXQgb2YKICBhIHJ1bGUgaWYgaXQgaGFzIGNoYW5nZWQgd2hlbiBpdHMgcmVjaXBlIGV4aXRzIHdpdGggYSBub256ZXJvIHN0YXR1cywKICBqdXN0IGFzIHdoZW4gdGhlIHJlY2lwZSBnZXRzIGEgc2lnbmFsLgoKKiBUaGUgYXV0b21hdGljIHZhcmlhYmxlIGAkKycgaXMgbmV3LiAgSXQgbGlzdHMgYWxsIHRoZSBkZXBlbmRlbmNpZXMgbGlrZQogIGAkXicsIGJ1dCBwcmVzZXJ2ZXMgZHVwbGljYXRlcyBsaXN0ZWQgaW4gdGhlIG1ha2VmaWxlLiAgVGhpcyBpcyB1c2VmdWwKICBmb3IgbGlua2luZyBydWxlcywgd2hlcmUgbGlicmFyeSBmaWxlcyBzb21ldGltZXMgbmVlZCB0byBiZSBsaXN0ZWQgdHdpY2UKICBpbiB0aGUgbGluayBvcmRlci4KCiogWW91IGNhbiBub3cgc3BlY2lmeSB0aGUgYC5JR05PUkUnIGFuZCBgLlNJTEVOVCcgc3BlY2lhbCB0YXJnZXRzIHdpdGgKICBkZXBlbmRlbmNpZXMgdG8gbGltaXQgdGhlaXIgZWZmZWN0cyB0byB0aG9zZSBmaWxlcy4gIElmIGEgZmlsZSBhcHBlYXJzIGFzCiAgYSBkZXBlbmRlbmN5IG9mIGAuSUdOT1JFJywgdGhlbiBlcnJvcnMgd2lsbCBiZSBpZ25vcmVkIHdoaWxlIHJ1bm5pbmcgdGhlCiAgcmVjaXBlIHRvIHVwZGF0ZSB0aGF0IGZpbGUuICBMaWtld2lzZSBpZiBhIGZpbGUgYXBwZWFycyBhcyBhIGRlcGVuZGVuY3kKICBvZiBgLlNJTEVOVCcsIHRoZW4gdGhlIHJlY2lwZSB0byB1cGRhdGUgdGhhdCBmaWxlIHdpbGwgbm90IGJlIHByaW50ZWQKICBiZWZvcmUgaXQgaXMgcnVuLiAgKFRoaXMgY2hhbmdlIHdhcyBtYWRlIHRvIGNvbmZvcm0gdG8gUE9TSVguMi4pCgwKVmVyc2lvbiAzLjcxICgyMSBNYXkgMTk5NCkKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoQEQpJywgYCQoJUQpJywgYCQoKkQpJywgYCQoPEQpJywgYCQoP0QpJywgYW5kCiAgYCQoXkQpJyBub3cgb21pdCB0aGUgdHJhaWxpbmcgc2xhc2ggZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWUuICAoVGhpcyBjaGFuZ2UKICB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKCiogVGhlIHNvdXJjZSBkaXN0cmlidXRpb24gbm93IGluY2x1ZGVzIHRoZSBJbmZvIGZpbGVzIGZvciB0aGUgTWFrZSBtYW51YWwuCiAgVGhlcmUgaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIGNvbnRhaW5pbmcgSW5mbyBhbmQgRFZJIGZpbGVzLgoKKiBZb3UgY2FuIG5vdyBzZXQgdGhlIHZhcmlhYmxlcyBgYmlucHJlZml4JyBhbmQvb3IgYG1hbnByZWZpeCcgaW4KICBNYWtlZmlsZS5pbiAob3Igb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGluc3RhbGxpbmcpIHRvIGluc3RhbGwgR05VIG1ha2UKICB1bmRlciBhIG5hbWUgb3RoZXIgdGhhbiBgbWFrZScgKGkuZS4sIGBgbWFrZSBiaW5wcmVmaXg9ZyBpbnN0YWxsJycKICBpbnN0YWxscyBHTlUgbWFrZSBhcyBgZ21ha2UnKS4KCiogVGhlIGJ1aWx0LWluIFRleGluZm8gcnVsZXMgdXNlIHRoZSBuZXcgdmFyaWFibGVzIGBURVhJMkRWSV9GTEFHUycgZm9yCiAgZmxhZ3MgdG8gdGhlIGB0ZXhpMmR2aScgc2NyaXB0LCBhbmQgYE1BS0VJTkZPX0ZMQUdTJyBmb3IgZmxhZ3MgdG8gdGhlCiAgTWFrZWluZm8gcHJvZ3JhbS4KCiogVGhlIGV4aXQgc3RhdHVzIG9mIE1ha2Ugd2hlbiBpdCBydW5zIGludG8gZXJyb3JzIGlzIG5vdyAyIGluc3RlYWQgb2YgMS4KICBUaGUgZXhpdCBzdGF0dXMgaXMgMSBvbmx5IHdoZW4gdXNpbmcgLXEgYW5kIHNvbWUgdGFyZ2V0IGlzIG5vdCB1cCB0byBkYXRlLgogIChUaGlzIGNoYW5nZSB3YXMgbWFkZSB0byBjb21wbHkgd2l0aCBQT1NJWC4yLikKDApWZXJzaW9uIDMuNzAgKDAzIEphbiAxOTk0KQoKKiBJdCBpcyBubyBsb25nZXIgYSBmYXRhbCBlcnJvciB0byBoYXZlIGEgTlVMIGNoYXJhY3RlciBpbiBhIG1ha2VmaWxlLgogIFlvdSBzaG91bGQgbmV2ZXIgcHV0IGEgTlVMIGluIGEgbWFrZWZpbGUgYmVjYXVzZSBpdCBjYW4gaGF2ZSBzdHJhbmdlCiAgcmVzdWx0cywgYnV0IG90aGVyd2lzZSBlbXB0eSBsaW5lcyBmdWxsIG9mIE5VTHMgKHN1Y2ggYXMgcHJvZHVjZWQgYnkKICB0aGUgYHhta21mJyBwcm9ncmFtKSB3aWxsIGFsd2F5cyB3b3JrIGZpbmUuCgoqIFRoZSBlcnJvciBtZXNzYWdlcyBmb3Igbm9uZXhpc3RlbnQgaW5jbHVkZWQgbWFrZWZpbGVzIG5vdyByZWZlciB0byB0aGUKICBtYWtlZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB3aGVyZSB0aGUgYGluY2x1ZGUnIGFwcGVhcmVkLCBzbyBFbWFjcydzCiAgQy14IGAgY29tbWFuZCB0YWtlcyB5b3UgdGhlcmUgKGluIGNhc2UgaXQncyBhIHR5cG8geW91IG5lZWQgdG8gZml4KS4KDApWZXJzaW9uIDMuNjkgKDA3IE5vdiAxOTkzKQoKKiBJbXBsaWNpdCBydWxlIHNlYXJjaCBmb3IgYXJjaGl2ZSBtZW1iZXIgcmVmZXJlbmNlcyBpcyBub3cgZG9uZSBpbiB0aGUKICBvcHBvc2l0ZSBvcmRlciBmcm9tIHByZXZpb3VzIHZlcnNpb25zOiB0aGUgd2hvbGUgdGFyZ2V0IG5hbWUgYExJQihNRU0pJwogIGZpcnN0LCBhbmQganVzdCB0aGUgbWVtYmVyIG5hbWUgYW5kIHBhcmVudGhlc2VzIGAoTUVNKScgc2Vjb25kLgoKKiBNYWtlIG5vdyBnaXZlcyBhbiBlcnJvciBmb3IgYW4gdW50ZXJtaW5hdGVkIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIHJlZmVyZW5jZS4KICBGb3IgZXhhbXBsZSwgYCQoZm9vJyB3aXRoIG5vIG1hdGNoaW5nIGApJyBvciBgJHtiYXInIHdpdGggbm8gbWF0Y2hpbmcgYH0nLgoKKiBUaGUgbmV3IGRlZmF1bHQgdmFyaWFibGUgYE1BS0VfVkVSU0lPTicgZ2l2ZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mCiAgTWFrZSwgYW5kIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJlbW90ZSBqb2Igc3VwcG9ydCBjb21waWxlZCBpbiAoaWYgYW55KS4KICBUaHVzIHRoZSB2YWx1ZSAoaW4gdGhpcyByZWxlYXNlKSBpcyBzb21ldGhpbmcgbGlrZSBgMy42OScgb3IgYDMuNjktQ3VzdG9tcycuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vIGxvbmdlciBydW4KICB3aXRoIGEgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZS4gIEFzIGluIHZlcnNpb25zIGJlZm9yZQogIDMuNjgsIHRoZXkgbm93IHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudCB0aGF0IGBtYWtlJyBzdGFydGVkIHdpdGguICBXZQogIGhhdmUgcmV2ZXJzZWQgdGhlIGNoYW5nZSBtYWRlIGluIHZlcnNpb24gMy42OCBiZWNhdXNlIGl0IHR1cm5lZCBvdXQgdG8KICBjYXVzZSBhIHBhcmFkb3hpY2FsIHNpdHVhdGlvbiBpbiBjYXNlcyBsaWtlOgoKICAgICAgICBleHBvcnQgdmFyaWFibGUgPSAkKHNoZWxsIGVjaG8gdmFsdWUpCgogIFdoZW4gTWFrZSBhdHRlbXB0ZWQgdG8gcHV0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGVudmlyb25tZW50IGZvciBhCiAgcmVjaXBlLCBpdCB3b3VsZCB0cnkgZXhwYW5kIHRoZSB2YWx1ZSBieSBydW5uaW5nIHRoZSBzaGVsbCBjb21tYW5kCiAgYGVjaG8gdmFsdWUnLiAgSW4gdmVyc2lvbiAzLjY4LCBiZWNhdXNlIGl0IGNvbnN0cnVjdGVkIGFuIGVudmlyb25tZW50CiAgZm9yIHRoYXQgc2hlbGwgY29tbWFuZCBpbiB0aGUgc2FtZSB3YXksIE1ha2Ugd291bGQgYmVnaW4gdG8gZ28gaW50byBhbgogIGluZmluaXRlIGxvb3AgYW5kIHRoZW4gZ2V0IGEgZmF0YWwgZXJyb3Igd2hlbiBpdCBkZXRlY3RlZCB0aGUgbG9vcC4KCiogVGhlIHJlY2lwZSBnaXZlbiBmb3IgYC5ERUZBVUxUJyBpcyBub3cgdXNlZCBmb3IgcGhvbnkgdGFyZ2V0cyB3aXRoIG5vCiAgcmVjaXBlLgoMClZlcnNpb24gMy42OCAoMjggSnVsIDE5OTMpCgoqIFlvdSBjYW4gbGlzdCBzZXZlcmFsIGFyY2hpdmUgbWVtYmVyIG5hbWVzIGluc2lkZSBwYXJlbnRoZXNpczoKICBgbGliKG1lbTEgbWVtMiBtZW0zKScgaXMgZXF1aXZhbGVudCB0byBgbGliKG1lbTEpIGxpYihtZW0yKSBsaWIobWVtMyknLgoKKiBZb3UgY2FuIHVzZSB3aWxkY2FyZHMgaW5zaWRlIGFyY2hpdmUgbWVtYmVyIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZSwKICBgbGliKCoubyknIGV4cGFuZHMgdG8gYWxsIGV4aXN0aW5nIG1lbWJlcnMgb2YgYGxpYicgd2hvc2UgbmFtZXMgZW5kIGluCiAgYC5vJyAoZS5nLiBgbGliKGEubykgbGliKGIubyknKTsgYCouYSgqLm8pJyBleHBhbmRzIHRvIGFsbCBzdWNoIG1lbWJlcnMKICBvZiBhbGwgZXhpc3RpbmcgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIGluIGAuYScgKGUuZy4gYGZvby5hKGEubykKICBmb28uYShiLm8pIGJhci5hKGMubykgYmFyLmEoZC5vKScuCgoqIEEgc3VmZml4IHJ1bGUgYC5YLmEnIG5vdyBwcm9kdWNlcyB0d28gcGF0dGVybiBydWxlczoKICAgICAgICAoJS5vKTogJS5YCSMgUHJldmlvdXMgdmVyc2lvbnMgcHJvZHVjZWQgb25seSB0aGlzLgogICAgICAgICUuYTogJS5YCSMgTm93IHByb2R1Y2VzIHRoaXMgYXMgd2VsbCwganVzdCBsaWtlIG90aGVyIHN1ZmZpeGVzLgoKKiBUaGUgbmV3IGZsYWcgYC0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzJyBzYXlzIHRvIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlCiAgd2hlbmV2ZXIgTWFrZSBleHBhbmRzIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZCB2YXJpYWJsZS4KCiogVGhlIG5ldyBgLWluY2x1ZGUnIGRpcmVjdGl2ZSBpcyBqdXN0IGxpa2UgYGluY2x1ZGUnIGV4Y2VwdCB0aGF0IHRoZXJlIGlzCiAgbm8gZXJyb3IgKG5vdCBldmVuIGEgd2FybmluZykgZm9yIGEgbm9uZXhpc3RlbnQgbWFrZWZpbGUuCgoqIENvbW1hbmRzIGluIGFuIGludm9jYXRpb24gb2YgdGhlIGBzaGVsbCcgZnVuY3Rpb24gYXJlIG5vdyBydW4gd2l0aCBhCiAgbW9kaWZpZWQgZW52aXJvbm1lbnQgbGlrZSByZWNpcGVzIGFyZSwgc28geW91IGNhbiB1c2UgYGV4cG9ydCcgZXQgYWwKICB0byBzZXQgdXAgdmFyaWFibGVzIGZvciB0aGVtLiAgVGhleSB1c2VkIHRvIHJ1biB3aXRoIHRoZSBlbnZpcm9ubWVudAogIHRoYXQgYG1ha2UnIHN0YXJ0ZWQgd2l0aC4KDApWZXJzaW9uIDMuNjYgKDIxIE1heSAxOTkzKQoKKiBgbWFrZSAtLXZlcnNpb24nIChvciBgbWFrZSAtdicpIG5vdyBleGl0cyBpbW1lZGlhdGVseSBhZnRlciBwcmludGluZwogIHRoZSB2ZXJzaW9uIG51bWJlci4KDApWZXJzaW9uIDMuNjUgKDA5IE1heSAxOTkzKQoKKiBNYWtlIG5vdyBzdXBwb3J0cyBsb25nLW5hbWVkIG1lbWJlcnMgaW4gYGFyJyBhcmNoaXZlIGZpbGVzLgoMClZlcnNpb24gMy42NCAoMjEgQXByIDE5OTMpCgoqIE1ha2Ugbm93IHN1cHBvcnRzIHRoZSBgKz0nIHN5bnRheCBmb3IgYSB2YXJpYWJsZSBkZWZpbml0aW9uIHdoaWNoIGFwcGVuZHMKICB0byB0aGUgdmFyaWFibGUncyBwcmV2aW91cyB2YWx1ZS4gIFNlZSB0aGUgc2VjdGlvbiBgQXBwZW5kaW5nIE1vcmUgVGV4dAogIHRvIFZhcmlhYmxlcycgaW4gdGhlIG1hbnVhbCBmb3IgZnVsbCBkZXRhaWxzLgoKKiBUaGUgbmV3IG9wdGlvbiBgLS1uby1wcmludC1kaXJlY3RvcnknIGluaGliaXRzIHRoZSBgLXcnIG9yCiAgYC0tcHJpbnQtZGlyZWN0b3J5JyBmZWF0dXJlLiAgTWFrZSB0dXJucyBvbiBgLS1wcmludC1kaXJlY3RvcnknCiAgYXV0b21hdGljYWxseSBpZiB5b3UgdXNlIGAtQycgb3IgYC0tZGlyZWN0b3J5JywgYW5kIGluIHN1Yi1tYWtlczsgc29tZQogIHVzZXJzIGhhdmUgZm91bmQgdGhpcyBiZWhhdmlvciB1bmRlc2lyYWJsZS4KCiogVGhlIGJ1aWx0LWluIGltcGxpY2l0IHJ1bGVzIG5vdyBzdXBwb3J0IHRoZSBhbHRlcm5hdGl2ZSBleHRlbnNpb24KICBgLnR4aW5mbycgZm9yIFRleGluZm8gZmlsZXMsIGp1c3QgbGlrZSBgLnRleGluZm8nIGFuZCBgLnRleGknLgoMClZlcnNpb24gMy42MyAoMjIgSmFuIDE5OTMpCgoqIE1ha2Ugbm93IHVzZXMgYSBzdGFuZGFyZCBHTlUgYGNvbmZpZ3VyZScgc2NyaXB0LiAgU2VlIHRoZSBuZXcgZmlsZQogIElOU1RBTEwgZm9yIHRoZSBuZXcgKGFuZCBtdWNoIHNpbXBsZXIpIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUuCgoqIFRoZXJlIGlzIG5vdyBhIHNoZWxsIHNjcmlwdCB0byBidWlsZCBNYWtlIHRoZSBmaXJzdCB0aW1lLCBpZiB5b3UgaGF2ZSBubwogIG90aGVyIGBtYWtlJyBwcm9ncmFtLiAgYGJ1aWxkLnNoJyBpcyBjcmVhdGVkIGJ5IGBjb25maWd1cmUnOyBzZWUgUkVBRE1FLgoKKiBHTlUgTWFrZSBub3cgY29tcGxldGVseSBjb25mb3JtcyB0byB0aGUgUE9TSVguMiBzcGVjaWZpY2F0aW9uIGZvciBgbWFrZScuCgoqIEVsZW1lbnRzIG9mIHRoZSBgJF4nIGFuZCBgJD8nIGF1dG9tYXRpYyB2YXJpYWJsZXMgdGhhdCBhcmUgYXJjaGl2ZQogIG1lbWJlciByZWZlcmVuY2VzIG5vdyBsaXN0IG9ubHkgdGhlIG1lbWJlciBuYW1lLCBhcyBpbiBVbml4IGFuZCBQT1NJWC4yLgoKKiBZb3Ugc2hvdWxkIG5vIGxvbmdlciBldmVyIG5lZWQgdG8gc3BlY2lmeSB0aGUgYC13JyBzd2l0Y2gsIHdoaWNoIHByaW50cwogIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBiZWZvcmUgYW5kIGFmdGVyIE1ha2UgcnVucy4gIFRoZSBgLUMnIHN3aXRjaCB0bwogIGNoYW5nZSBkaXJlY3RvcnksIGFuZCByZWN1cnNpdmUgdXNlIG9mIE1ha2UsIG5vdyBzZXQgYC13JyBhdXRvbWF0aWNhbGx5LgoKKiBNdWx0aXBsZSBkb3VibGUtY29sb24gcnVsZXMgZm9yIHRoZSBzYW1lIHRhcmdldCB3aWxsIG5vIGxvbmdlciBoYXZlIHRoZWlyCiAgcmVjaXBlcyBydW4gc2ltdWx0YW5lb3VzbHkgdW5kZXIgLWosIGFzIHRoaXMgY291bGQgcmVzdWx0IGluIHRoZSB0d28KICByZWNpcGVzIHRyeWluZyB0byBjaGFuZ2UgdGhlIGZpbGUgYXQgdGhlIHNhbWUgdGltZSBhbmQgaW50ZXJmZXJpbmcgd2l0aAogIG9uZSBhbm90aGVyLgoKKiBUaGUgYFNIRUxMJyB2YXJpYWJsZSBpcyBub3cgbmV2ZXIgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgRWFjaCBtYWtlZmlsZSB0aGF0IHdhbnRzIGEgc2hlbGwgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoL2Jpbi9zaCkgbXVzdAogIHNldCBTSEVMTCBpdHNlbGYuICBTSEVMTCBpcyBhbHdheXMgZXhwb3J0ZWQgdG8gY2hpbGQgcHJvY2Vzc2VzLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUE9TSVguMi4KCiogTWFrZSBub3cgYWNjZXB0cyBsb25nIG9wdGlvbnMuICBUaGVyZSBpcyBub3cgYW4gaW5mb3JtYXRpdmUgdXNhZ2UgbWVzc2FnZQogIHRoYXQgdGVsbHMgeW91IHdoYXQgYWxsIHRoZSBvcHRpb25zIGFyZSBhbmQgd2hhdCB0aGV5IGRvLiAgVHJ5IGBtYWtlIC0taGVscCcuCgoqIFRoZXJlIGFyZSB0d28gbmV3IGRpcmVjdGl2ZXM6IGBleHBvcnQnIGFuZCBgdW5leHBvcnQnLiAgQWxsIHZhcmlhYmxlcyBhcmUKICBubyBsb25nZXIgYXV0b21hdGljYWxseSBwdXQgaW50byB0aGUgZW52aXJvbm1lbnRzIG9mIHRoZSByZWNpcGUgbGluZXMgdGhhdAogIE1ha2UgcnVucy4gIEluc3RlYWQsIG9ubHkgdmFyaWFibGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluCiAgdGhlIGVudmlyb25tZW50IGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LiAgVG8gZXhwb3J0IG90aGVycywgdXNlOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRQogIG9yIHlvdSBjYW4gZGVmaW5lIHZhcmlhYmxlcyB3aXRoOgogICAgICAgIGV4cG9ydCBWQVJJQUJMRSA9IFZBTFVFCiAgb3I6CiAgICAgICAgZXhwb3J0IFZBUklBQkxFIDo9IFZBTFVFCiAgWW91IGNhbiB1c2UganVzdDoKICAgICAgICBleHBvcnQKICBvcjoKICAgICAgICAuRVhQT1JUX0FMTF9WQVJJQUJMRVM6CiAgdG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IuICBTZWUgdGhlIG5vZGUgYFZhcmlhYmxlcy9SZWN1cnNpb24nIGluIHRoZSBtYW51YWwKICBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uLgoKKiBUaGUgcmVjaXBlIGZyb20gdGhlIGAuREVGQVVMVCcgc3BlY2lhbCB0YXJnZXQgaXMgb25seSBhcHBsaWVkIHRvCiAgdGFyZ2V0cyB3aGljaCBoYXZlIG5vIHJ1bGVzIGF0IGFsbCwgbm90IGFsbCB0YXJnZXRzIHdpdGggbm8gcmVjaXBlLgogIFRoaXMgY2hhbmdlIHdhcyBtYWRlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCBtYWtlLgoKKiBBbGwgZmF0YWwgZXJyb3IgbWVzc2FnZXMgbm93IGNvbnRhaW4gYCoqKicsIHNvIHRoZXkgYXJlIGVhc3kgdG8gZmluZCBpbgogIGNvbXBpbGF0aW9uIGxvZ3MuCgoqIERlcGVuZGVuY3kgZmlsZSBuYW1lcyBsaWtlIGAtbE5BTUUnIGFyZSBub3cgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIGZpbGUKICBuYW1lIGZvdW5kLCBhcyB3aXRoIGZpbGVzIGZvdW5kIGJ5IG5vcm1hbCBkaXJlY3Rvcnkgc2VhcmNoIChWUEFUSCkuCiAgVGhlIGxpYnJhcnkgZmlsZSBgbGliTkFNRS5hJyBtYXkgbm93IGJlIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwKICB3aGljaCBpcyBjaGVja2VkIGJlZm9yZSBWUEFUSDsgdGhlIHN0YW5kYXJkIHNldCBvZiBkaXJlY3RvcmllcyAoL2xpYiwKICAvdXNyL2xpYiwgL3Vzci9sb2NhbC9saWIpIGlzIG5vdyBjaGVja2VkIGxhc3QuCiAgU2VlIHRoZSBub2RlIGBMaWJyYXJpZXMvU2VhcmNoJyBpbiB0aGUgbWFudWFsIGZvciBmdWxsIGRldGFpbHMuCgoqIEEgc2luZ2xlIGBpbmNsdWRlJyBkaXJlY3RpdmUgY2FuIG5vdyBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgbWFrZWZpbGUgdG8KICBpbmNsdWRlLCBsaWtlIHRoaXM6CiAgICAgICAgaW5jbHVkZSBmaWxlMSBmaWxlMgogIFlvdSBjYW4gYWxzbyB1c2Ugc2hlbGwgZmlsZSBuYW1lIHBhdHRlcm5zIGluIGFuIGBpbmNsdWRlJyBkaXJlY3RpdmU6CiAgICAgICAgaW5jbHVkZSAqLm1rCgoqIFRoZSBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgaW5jbHVkZWQgbWFrZWZpbGVzLCBhbmQgZm9yCiAgbGlicmFyaWVzIHNwZWNpZmllZCB3aXRoIGAtbE5BTUUnLCBhcmUgbm93IHNldCBieSBjb25maWd1cmF0aW9uLgoKKiBZb3UgY2FuIG5vdyB1c2UgYmxhbmtzIGFzIHdlbGwgYXMgY29sb25zIHRvIHNlcGFyYXRlIHRoZSBkaXJlY3RvcmllcyBpbiBhCiAgc2VhcmNoIHBhdGggZm9yIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSBvciB0aGUgYFZQQVRIJyB2YXJpYWJsZS4KCiogWW91IGNhbiBub3cgdXNlIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBsZWZ0IGhhbmQgc2lkZSBvZiBhCiAgdmFyaWFibGUgYXNzaWdubWVudCwgYXMgaW4gIiQoZm9vKWJhciA9IHZhbHVlIi4KCiogVGhlIGBNQUtFJyB2YXJpYWJsZSBpcyBhbHdheXMgZGVmaW5lZCBhcyBgJChNQUtFX0NPTU1BTkQpICQoTUFLRU9WRVJSSURFUyknLgogIFRoZSBgTUFLRV9DT01NQU5EJyB2YXJpYWJsZSBpcyBub3cgZGVmaW5lZCB0byB0aGUgbmFtZSB3aXRoIHdoaWNoIG1ha2UKICB3YXMgaW52b2tlZC4KCiogVGhlIGJ1aWx0LWluIHJ1bGVzIGZvciBDKysgY29tcGlsYXRpb24gbm93IHVzZSB0aGUgdmFyaWFibGVzIGAkKENYWCknIGFuZAogIGAkKENYWEZMQUdTKScgaW5zdGVhZCBvZiBgJChDKyspJyBhbmQgYCQoQysrRkxBR1MpJy4gIFRoZSBvbGQgbmFtZXMgaGFkCiAgcHJvYmxlbXMgd2l0aCBzaGVsbHMgdGhhdCBjYW5ub3QgaGF2ZSBgKycgaW4gZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuCgoqIFRoZSB2YWx1ZSBvZiBhIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCB3aGVuIHB1dHRpbmcKICBpdCBpbnRvIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yCiAgY29tcGF0aWJpbGl0eSB3aXRoIFVuaXggbWFrZS4KCiogQSBydWxlIHdpdGggbm8gdGFyZ2V0cyBiZWZvcmUgdGhlIGA6JyBpcyBub3cgYWNjZXB0ZWQgYW5kIGlnbm9yZWQuCiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW5PUyA0IG1ha2UuCiAgV2UgZG8gbm90IHJlY29tbWVuZCB0aGF0IHlvdSB3cml0ZSB5b3VyIG1ha2VmaWxlcyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgoKKiBUaGUgYC1JJyBzd2l0Y2ggY2FuIG5vdyBiZSB1c2VkIGluIE1BS0VGTEFHUywgYW5kIGFyZSBwdXQgdGhlcmUKICBhdXRvbWF0aWNhbGx5IGp1c3QgbGlrZSBvdGhlciBzd2l0Y2hlcy4KDApWZXJzaW9uIDMuNjEKCiogQnVpbHQtaW4gcnVsZXMgZm9yIEMrKyBzb3VyY2UgZmlsZXMgd2l0aCB0aGUgYC5DJyBzdWZmaXguCiAgV2Ugc3RpbGwgcmVjb21tZW5kIHRoYXQgeW91IHVzZSBgLmNjJyBpbnN0ZWFkLgoKKiBJZiBhIHJlY2lwZSBpcyBnaXZlbiB0b28gbWFueSB0aW1lcyBmb3IgYSBzaW5nbGUgdGFyZ2V0LCB0aGUgbGFzdCBvbmUKICBnaXZlbiBpcyB1c2VkLCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgcHJpbnRlZC4KCiogRXJyb3IgbWVzc2FnZXMgYWJvdXQgbWFrZWZpbGVzIGFyZSBpbiBzdGFuZGFyZCBHTlUgZXJyb3IgZm9ybWF0LAogIHNvIEMteCBgIGluIEVtYWNzIHdvcmtzIG9uIHRoZW0uCgoqIERlcGVuZGVuY2llcyBvZiBwYXR0ZXJuIHJ1bGVzIHdoaWNoIGNvbnRhaW4gbm8gJSBuZWVkIG5vdCBhY3R1YWxseSBleGlzdAogIGlmIHRoZXkgY2FuIGJlIGNyZWF0ZWQgKGp1c3QgbGlrZSBkZXBlbmRlbmNpZXMgd2hpY2ggZG8gaGF2ZSBhICUpLgoMClZlcnNpb24gMy42MAoKKiBBIG1lc3NhZ2UgaXMgYWx3YXlzIHByaW50ZWQgd2hlbiBNYWtlIGRlY2lkZXMgdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lLgogIEl0IHVzZWQgdG8gYmUgdGhhdCBubyBtZXNzYWdlIHdhcyBwcmludGVkIGZvciB0b3AtbGV2ZWwgcGhvbnkgdGFyZ2V0cwogIChiZWNhdXNlICJgcGhvbnknIGlzIHVwIHRvIGRhdGUiIGlzbid0IHF1aXRlIHJpZ2h0KS4gIE5vdyBhIGRpZmZlcmVudAogIG1lc3NhZ2UgIk5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYHBob255JyIgaXMgcHJpbnRlZCBpbiB0aGF0IGNhc2UuCgoqIEFyY2hpdmVzIG9uIEFJWCBub3cgc3VwcG9zZWRseSB3b3JrLgoKKiBXaGVuIHRoZSByZWNpcGVzIHNwZWNpZmllZCBmb3IgLkRFRkFVTFQgYXJlIHVzZWQgdG8gdXBkYXRlIGEgdGFyZ2V0LAogIHRoZSAkPCBhdXRvbWF0aWMgdmFyaWFibGUgaXMgZ2l2ZW4gdGhlIHNhbWUgdmFsdWUgYXMgJEAgZm9yIHRoYXQgdGFyZ2V0LgogIFRoaXMgaXMgaG93IFVuaXggbWFrZSBiZWhhdmVzLCBhbmQgdGhpcyBiZWhhdmlvciBpcyBtYW5kYXRlZCBieSBQT1NJWC4yLgoMClZlcnNpb24gMy41OQoKKiBUaGUgLW4sIC1xLCBhbmQgLXQgb3B0aW9ucyBhcmUgbm90IHB1dCBpbiB0aGUgYE1BS0VGTEFHUycgYW5kIGBNRkxBRycKICB2YXJpYWJsZXMgd2hpbGUgcmVtYWtpbmcgbWFrZWZpbGVzLCBzbyByZWN1cnNpdmUgbWFrZXMgZG9uZSB3aGlsZSByZW1ha2luZwogIG1ha2VmaWxlcyB3aWxsIGJlaGF2ZSBwcm9wZXJseS4KCiogSWYgdGhlIHNwZWNpYWwgdGFyZ2V0IGAuTk9FWFBPUlQnIGlzIHNwZWNpZmllZCBpbiBhIG1ha2VmaWxlLAogIG9ubHkgdmFyaWFibGVzIHRoYXQgY2FtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBhbmQgdmFyaWFibGVzCiAgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBleHBvcnRlZC4KDApWZXJzaW9uIDMuNTgKCiogU3VmZml4IHJ1bGVzIG1heSBoYXZlIGRlcGVuZGVuY2llcyAod2hpY2ggYXJlIGlnbm9yZWQpLgoMClZlcnNpb24gMy41NwoKKiBEZXBlbmRlbmNpZXMgb2YgdGhlIGZvcm0gYC1sTElCJyBhcmUgc2VhcmNoZWQgZm9yIGFzIC91c3IvbG9jYWwvbGliL2xpYkxJQi5hCiAgYXMgd2VsbCBhcyBsaWJMSUIuYSBpbiAvdXNyL2xpYiwgL2xpYiwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgVlBBVEguCgwKVmVyc2lvbiAzLjU1CgoqIFRoZXJlIGlzIG5vdyBhIFVuaXggbWFuIHBhZ2UgZm9yIEdOVSBNYWtlLiAgSXQgaXMgY2VydGFpbmx5IG5vdCBhCiAgcmVwbGFjZW1lbnQgZm9yIHRoZSBUZXhpbmZvIG1hbnVhbCwgYnV0IGl0IGRvY3VtZW50cyB0aGUgYmFzaWMKICBmdW5jdGlvbmFsaXR5IGFuZCB0aGUgc3dpdGNoZXMuICBGb3IgZnVsbCBkb2N1bWVudGF0aW9uLCB5b3Ugc2hvdWxkCiAgc3RpbGwgcmVhZCB0aGUgVGV4aW5mbyBtYW51YWwuICBUaGFua3MgdG8gRGVubmlzIE1vcnNlIG9mIFN0YW5mb3JkCiAgVW5pdmVyc2l0eSBmb3IgY29udHJpYnV0aW5nIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcy4KCiogVmFyaWFibGVzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgKGUuZy4sIGBDQycpIHdpbGwgbm8gbG9uZ2VyIGJlCiAgcHV0IGludG8gdGhlIGVudmlyb25tZW50IGZvciBjaGlsZCBwcm9jZXNzZXMuICAoSWYgdGhlc2UgdmFyaWFibGVzIGFyZQogIHJlc2V0IGJ5IHRoZSBlbnZpcm9ubWVudCwgbWFrZWZpbGVzLCBvciB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHdpbGwKICBzdGlsbCBnbyBpbnRvIHRoZSBlbnZpcm9ubWVudC4pCgoqIE1ha2VmaWxlcyB3aGljaCBoYXZlIHJlY2lwZXMgYnV0IG5vIGRlcGVuZGVuY2llcyAoYW5kIHRodXMgYXJlIGFsd2F5cwogIGNvbnNpZGVyZWQgb3V0IG9mIGRhdGUgYW5kIGluIG5lZWQgb2YgcmVtYWtpbmcpLCB3aWxsIG5vdCBiZSByZW1hZGUgKGlmIHRoZXkKICB3ZXJlIGJlaW5nIHJlbWFkZSBvbmx5IGJlY2F1c2UgdGhleSB3ZXJlIG1ha2VmaWxlcykuICBUaGlzIG1lYW5zIHRoYXQgR05VCiAgTWFrZSB3aWxsIG5vIGxvbmdlciBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlbiBmZWQgdGhlIG1ha2VmaWxlcyB0aGF0CiAgYGltYWtlJyAobmVjZXNzYXJ5IHRvIGJ1aWxkIFggV2luZG93cykgcHJvZHVjZXMuCgoqIFRoZXJlIGlzIG5vIGxvbmdlciBhIHdhcm5pbmcgZm9yIHVzaW5nIHRoZSBgdnBhdGgnIGRpcmVjdGl2ZSB3aXRoIGFuIGV4cGxpY2l0CnBhdGhuYW1lIChpbnN0ZWFkIG9mIGEgYCUnIHBhdHRlcm4pLgoMClZlcnNpb24gMy41MQoKKiBXaGVuIHJlbW92aW5nIGludGVybWVkaWF0ZSBmaWxlcywgb25seSBvbmUgYHJtJyBjb21tYW5kIGxpbmUgaXMgcHJpbnRlZCwKICBsaXN0aW5nIGFsbCBmaWxlIG5hbWVzLgoKKiBUaGVyZSBhcmUgbm93IGF1dG9tYXRpYyB2YXJpYWJsZXMgYCQoXkQpJywgYCQoXkYpJywgYCQoP0QpJywgYW5kIGAkKD9GKScuCiAgVGhlc2UgYXJlIHRoZSBkaXJlY3Rvcnktb25seSBhbmQgZmlsZS1vbmx5IHZlcnNpb25zIG9mIGAkXicgYW5kIGAkPycuCgoqIExpYnJhcnkgZGVwZW5kZW5jaWVzIGdpdmVuIGFzIGAtbE5BTUUnIHdpbGwgdXNlICJsaWJOQU1FLmEiIGluIHRoZSBjdXJyZW50CiAgZGlyZWN0b3J5IGlmIGl0IGV4aXN0cy4KCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJCgkLyknIGlzIG5vIGxvbmdlciBkZWZpbmVkLgoKKiBMZWFkaW5nIGArJyBjaGFyYWN0ZXJzIG9uIGEgcmVjaXBlIGxpbmUgbWFrZSB0aGF0IGxpbmUgYmUgZXhlY3V0ZWQgZXZlbgogIHVuZGVyIC1uLCAtdCwgb3IgLXEgKGFzIGlmIHRoZSBsaW5lIGNvbnRhaW5lZCBgJChNQUtFKScpLgoKKiBGb3IgcmVjaXBlIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknLCBgJHtNQUtFfScsIG9yIGxlYWRpbmcgYCsnIGNoYXJhY3RlcnMsCiAgb25seSB0aG9zZSBsaW5lcyBhcmUgZXhlY3V0ZWQsIG5vdCB0aGUgZW50aXJlIHJlY2lwZS4KICAoVGhpcyBpcyBob3cgVW5peCBtYWtlIGJlaGF2ZXMgZm9yIGxpbmVzIGNvbnRhaW5pbmcgYCQoTUFLRSknIG9yIGAke01BS0V9Jy4pCgwKVmVyc2lvbiAzLjUwCgoqIEZpbGVuYW1lcyBpbiBydWxlcyB3aWxsIG5vdyBoYXZlIH4gYW5kIH5VU0VSIGV4cGFuZGVkLgoKKiBUaGUgYC1wJyBvdXRwdXQgaGFzIGJlZW4gY2hhbmdlZCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIG1ha2VmaWxlLgogIChBbGwgaW5mb3JtYXRpb24gdGhhdCBpc24ndCBzcGVjaWZpZWQgYnkgbWFrZWZpbGVzIGlzIHByZWZhY2VkIHdpdGggY29tbWVudAogIGNoYXJhY3RlcnMuKQoMClZlcnNpb24gMy40OQoKKiBUaGUgJSBjaGFyYWN0ZXIgY2FuIGJlIHF1b3RlZCB3aXRoIGJhY2tzbGFzaCBpbiBpbXBsaWNpdCBwYXR0ZXJuIHJ1bGVzLAogIHN0YXRpYyBwYXR0ZXJuIHJ1bGVzLCBgdnBhdGgnIGRpcmVjdGl2ZXMsIGFuZCBgcGF0c3Vic3QnLCBgZmlsdGVyJywgYW5kCiAgYGZpbHRlci1vdXQnIGZ1bmN0aW9ucy4gIEEgd2FybmluZyBpcyBpc3N1ZWQgaWYgYSBgdnBhdGgnIGRpcmVjdGl2ZSdzCiAgcGF0dGVybiBjb250YWlucyBubyAlLgoKKiBUaGUgYHdpbGRjYXJkJyB2YXJpYWJsZSBleHBhbnNpb24gZnVuY3Rpb24gbm93IGV4cGFuZHMgfiBhbmQgflVTRVIuCgoqIE1lc3NhZ2VzIGluZGljYXRpbmcgZmFpbGVkIHJlY2lwZSBsaW5lcyBub3cgY29udGFpbiB0aGUgdGFyZ2V0IG5hbWU6CiAgICAgICAgbWFrZTogKioqIFt0YXJnZXRdIEVycm9yIDEKCiogVGhlIGAtcCcgb3V0cHV0IGZvcm1hdCBoYXMgYmVlbiBjaGFuZ2VkIHNvbWV3aGF0IHRvIGxvb2sgbW9yZSBsaWtlCiAgbWFrZWZpbGUgcnVsZXMgYW5kIHRvIGdpdmUgYWxsIGluZm9ybWF0aW9uIHRoYXQgTWFrZSBoYXMgYWJvdXQgZmlsZXMuCgwKVmVyc2lvbiAzLjQ4CgwKVmVyc2lvbiAzLjQ3CgoqIFRoZSBgLWwnIHN3aXRjaCB3aXRoIG5vIGFyZ3VtZW50IHJlbW92ZXMgYW55IHByZXZpb3VzIGxvYWQtYXZlcmFnZSBsaW1pdC4KCiogV2hlbiB0aGUgYC13JyBzd2l0Y2ggaXMgaW4gZWZmZWN0LCBhbmQgTWFrZSBoYXMgdXBkYXRlZCBtYWtlZmlsZXMsCiAgaXQgd2lsbCB3cml0ZSBhIGBMZWF2aW5nIGRpcmVjdG9yeScgbWVzc2FnZSBiZWZvcmUgcmUtZXhlY3V0aW5nIGl0c2VsZi4KICBUaGlzIG1ha2VzIHRoZSBgZGlyZWN0b3J5IGNoYW5nZSB0cmFja2luZycgY2hhbmdlcyB0byBFbWFjcydzIGNvbXBpbGF0aW9uCiAgY29tbWFuZHMgd29yayBwcm9wZXJseS4KDApWZXJzaW9uIDMuNDYKCiogVGhlIGF1dG9tYXRpYyB2YXJpYWJsZSBgJConIGlzIG5vdyBkZWZpbmVkIGZvciBleHBsaWNpdCBydWxlcywKICBhcyBpdCBpcyBpbiBVbml4IG1ha2UuCgwKVmVyc2lvbiAzLjQ1CgoqIFRoZSBgLWonIHN3aXRjaCBpcyBub3cgcHV0IGluIHRoZSBNQUtFRkxBR1MgYW5kIE1GTEFHUyB2YXJpYWJsZXMgd2hlbgogIHNwZWNpZmllZCB3aXRob3V0IGFuIGFyZ3VtZW50IChpbmRpY2F0aW5nIGluZmluaXRlIGpvYnMpLgogIFRoZSBgLWwnIHN3aXRjaCBpcyBub3QgYWx3YXlzIHB1dCBpbiB0aGUgTUFLRUZMQUdTIGFuZCBNRkxBR1MgdmFyaWFibGVzLgoKKiBNYWtlIG5vIGxvbmdlciBjaGVja3MgaGFzaGVkIGRpcmVjdG9yaWVzIGFmdGVyIHJ1bm5pbmcgcmVjaXBlcy4KICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQgaW4gMy40MSBjYXVzZWQgdG9vIG11Y2ggc2xvd2Rvd24uCgwKVmVyc2lvbiAzLjQ0CgoqIEEgZGVwZW5kZW5jeSBpcyBOT1QgY29uc2lkZXJlZCBuZXdlciB0aGFuIGl0cyBkZXBlbmRlbnQgaWYKICB0aGV5IGhhdmUgdGhlIHNhbWUgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGUgYmVoYXZpb3IgaW1wbGVtZW50ZWQKICBpbiAzLjQzIGNvbmZsaWN0cyB3aXRoIFJDUy4KDApWZXJzaW9uIDMuNDMKCiogRGVwZW5kZW5jeSBsb29wcyBhcmUgbm8gbG9uZ2VyIGZhdGFsIGVycm9ycy4KCiogQSBkZXBlbmRlbmN5IGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiBpdHMgZGVwZW5kZW50IGlmCiAgdGhleSBoYXZlIHRoZSBzYW1lIG1vZGlmaWNhdGlvbiB0aW1lLgoMClZlcnNpb24gMy40MgoKKiBUaGUgdmFyaWFibGVzIEY3NyBhbmQgRjc3RkxBR1MgYXJlIG5vdyBzZXQgYnkgZGVmYXVsdCB0byAkKEZDKSBhbmQKICAkKEZGTEFHUykuICBNYWtlZmlsZXMgZGVzaWduZWQgZm9yIFN5c3RlbSBWIG1ha2UgbWF5IHVzZSB0aGVzZSB2YXJpYWJsZXMgaW4KICBleHBsaWNpdCBydWxlcyBhbmQgZXhwZWN0IHRoZW0gdG8gYmUgc2V0LiAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gd2F5IHRvCiAgbWFrZSBzZXR0aW5nIHRoZXNlIGFmZmVjdCB0aGUgRm9ydHJhbiBpbXBsaWNpdCBydWxlcyB1bmxlc3MgRkMgYW5kIEZGTEFHUwogIGFyZSBub3QgdXNlZCAoYW5kIHRoZXNlIGFyZSB1c2VkIGJ5IEJTRCBtYWtlKS4KDApWZXJzaW9uIDMuNDEKCiogTWFrZSBub3cgY2hlY2tzIHRvIHNlZSBpZiBpdHMgaGFzaGVkIGRpcmVjdG9yaWVzIGFyZSBjaGFuZ2VkIGJ5IHJlY2lwZXMuCiAgT3RoZXIgbWFrZXMgdGhhdCBoYXNoIGRpcmVjdG9yaWVzIChTdW4sIDQuMyBCU0QpIGRvbid0IGRvIHRoaXMuCgwKVmVyc2lvbiAzLjM5CgoqIFRoZSBgc2hlbGwnIGZ1bmN0aW9uIG5vIGxvbmdlciBjYXB0dXJlcyBzdGFuZGFyZCBlcnJvciBvdXRwdXQuCgwKVmVyc2lvbiAzLjMyCgoqIEEgZmlsZSBiZWdpbm5pbmcgd2l0aCBhIGRvdCBjYW4gYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IGlmIGl0IGFsc28gY29udGFpbnMKICBhIHNsYXNoIChlLmcuLCBgLi4vYmluL2ZvbycpLiAgKFVuaXggbWFrZSBhbGxvd3MgdGhpcyBhcyB3ZWxsLikKDApWZXJzaW9uIDMuMzEKCiogQXJjaGl2ZSBtZW1iZXIgbmFtZXMgYXJlIHRydW5jYXRlZCB0byAxNSBjaGFyYWN0ZXJzLgoKKiBZZXQgbW9yZSBVU0cgc3R1ZmYuCgoqIE1pbmltYWwgc3VwcG9ydCBmb3IgTWljcm9wb3J0IFN5c3RlbSBWIChhIDE2LWJpdCBtYWNoaW5lIGFuZCBhCiAgYnJhaW4tZGFtYWdlZCBjb21waWxlcikuICBUaGlzIGhhcyBldmVuIGxvd2VyIHByaW9yaXR5IHRoYW4gb3RoZXIgVVNHCiAgc3VwcG9ydCwgc28gaWYgaXQgZ2V0cyBiZXlvbmQgdHJpdmlhbCwgSSB3aWxsIHRha2UgaXQgb3V0IGNvbXBsZXRlbHkuCgoqIFJldmFtcGVkIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgKG5vdCBtdWNoIHZpc2libGUgY2hhbmdlKS4KCiogVGhlIC1kIGFuZCAtcCBvcHRpb25zIGNhbiBjb21lIGZyb20gdGhlIGVudmlyb25tZW50LgoMClZlcnNpb24gMy4zMAoKKiBJbXByb3ZlZCBzdXBwb3J0IGZvciBVU0cgYW5kIEhQVVggKGhvcGVmdWxseSkuCgoqIEEgdmFyaWFibGUgcmVmZXJlbmNlIGxpa2UgYCQoZm9vOmE9YiknLCBpZiBgYScgY29udGFpbnMgYSBgJScsIGlzCiAgZXF1aXZhbGVudCB0byBgJChwYXRzdWJzdCBhLGIsJChmb28pKScuCgoqIERlZmluaW5nIC5ERUZBVUxUIHdpdGggbm8gZGVwcyBvciByZWNpcGUgY2xlYXJzIGl0cyByZWNpcGUuCgoqIE5ldyBkZWZhdWx0IGltcGxpY2l0IHJ1bGVzIGZvciAuUyAoY3BwLCB0aGVuIGFzKSwgYW5kIC5zaCAoY29weSBhbmQKICBtYWtlIGV4ZWN1dGFibGUpLiAgQWxsIGRlZmF1bHQgaW1wbGljaXQgcnVsZXMgdGhhdCB1c2UgY3BwIChldmVuCiAgaW5kaXJlY3RseSksIHVzZSAkKENQUEZMQUdTKS4KDApWZXJzaW9uIDMuMjkKCiogR2l2aW5nIHRoZSAtaiBvcHRpb24gd2l0aCBubyBhcmd1bWVudHMgZ2l2ZXMgeW91IGluZmluaXRlIGpvYnMuCgwKVmVyc2lvbiAzLjI4CgoqIE5ldyBvcHRpb246ICItbCBMT0FEIiBzYXlzIG5vdCB0byBzdGFydCBhbnkgbmV3IGpvYnMgd2hpbGUgb3RoZXJzIGFyZQogIHJ1bm5pbmcgaWYgdGhlIGxvYWQgYXZlcmFnZSBpcyBub3QgYmVsb3cgTE9BRCAoYSBmbG9hdGluZy1wb2ludCBudW1iZXIpLgoKKiBUaGVyZSBpcyBzdXBwb3J0IGluIHBsYWNlIGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgcmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uCiAgaW4gTWFrZS4gIFNlZSB0aGUgZmlsZSByZW1vdGUuYy4KDApWZXJzaW9uIDMuMjYKCiogTm8gbW9yZSB0aGFuIDEwIGRpcmVjdG9yaWVzIHdpbGwgYmUga2VwdCBvcGVuIGF0IG9uY2UuCiAgKFRoaXMgbnVtYmVyIGNhbiBiZSBjaGFuZ2VkIGJ5IHJlZGVmaW5pbmcgTUFYX09QRU5fRElSRUNUT1JJRVMgaW4gZGlyLmMuKQoMClZlcnNpb24gMy4yNQoKKiBBcmNoaXZlIGZpbGVzIHdpbGwgaGF2ZSB0aGVpciBtb2RpZmljYXRpb24gdGltZXMgcmVjb3JkZWQgYmVmb3JlIGRvaW5nCiAgYW55dGhpbmcgdGhhdCBtaWdodCBjaGFuZ2UgdGhlaXIgbW9kaWZpY2F0aW9uIHRpbWVzIGJ5IHVwZGF0aW5nIGFuIGFyY2hpdmUKICBtZW1iZXIuCgwKVmVyc2lvbiAzLjIwCgoqIFRoZSBgTUFLRUxFVkVMJyB2YXJpYWJsZSBpcyBkZWZpbmVkIGZvciB1c2UgYnkgbWFrZWZpbGVzLgoMClZlcnNpb24gMy4xOQoKKiBUaGUgcmVjdXJzaW9uIGxldmVsIGluZGljYXRpb25zIGluIGVycm9yIG1lc3NhZ2VzIGFyZSBtdWNoIHNob3J0ZXIgdGhhbgogIHRoZXkgd2VyZSBpbiB2ZXJzaW9uIDMuMTQuCgwKVmVyc2lvbiAzLjE4CgoqIExlYWRpbmcgc3BhY2VzIGJlZm9yZSBkaXJlY3RpdmVzIGFyZSBpZ25vcmVkIChhcyBkb2N1bWVudGVkKS4KCiogSW5jbHVkZWQgbWFrZWZpbGVzIGNhbiBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZ29hbCB0YXJnZXQuCiAgKFN5c3RlbSBWIE1ha2UgZG9lcyBpdCB0aGlzIHdheSwgc28gd2UgYXJlIGJlaW5nIGNvbXBhdGlibGUpLgoMClZlcnNpb24gMy4xNC4KCiogVmFyaWFibGVzIHRoYXQgYXJlIGRlZmF1bHRzIGJ1aWx0IGludG8gTWFrZSB3aWxsIG5vdCBiZSBwdXQgaW4gdGhlCiAgZW52aXJvbm1lbnQgZm9yIGNoaWxkcmVuLiAgVGhpcyBqdXN0IHNhdmVzIHNvbWUgZW52aXJvbm1lbnQgc3BhY2UgYW5kLAogIGV4Y2VwdCB1bmRlciAtZSwgd2lsbCBiZSB0cmFuc3BhcmVudCB0byBzdWItbWFrZXMuCgoqIEVycm9yIG1lc3NhZ2VzIGZyb20gc3ViLW1ha2VzIHdpbGwgaW5kaWNhdGUgdGhlIGxldmVsIG9mIHJlY3Vyc2lvbi4KCiogSG9wZWZ1bGx5IHNvbWUgc3BlZWQtdXAgZm9yIGxhcmdlIGRpcmVjdG9yaWVzIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUKICBkaXJlY3RvcnkgaGFzaGluZyBzY2hlbWUuCgoqIE9uZSBjaGlsZCB3aWxsIGFsd2F5cyBnZXQgYSBzdGFuZGFyZCBpbnB1dCB0aGF0IGlzIHVzYWJsZS4KCiogRGVmYXVsdCBtYWtlZmlsZXMgdGhhdCBkb24ndCBleGlzdCB3aWxsIGJlIHJlbWFkZSBhbmQgcmVhZCBpbi4KDApWZXJzaW9uIDMuMTMuCgoqIENvdW50IHBhcmVudGhlc2VzIGluc2lkZSBleHBhbnNpb24gZnVuY3Rpb24gY2FsbHMgc28geW91IGNhbgogIGhhdmUgbmVzdGVkIGNhbGxzOiBgJChzb3J0ICQoZm9yZWFjaCB4LGEgYiwkKHgpKSknLgoMClZlcnNpb24gMy4xMi4KCiogU2V2ZXJhbCBidWcgZml4ZXMsIGluY2x1ZGluZyBVU0cgYW5kIFN1bjM4Nmkgc3VwcG9ydC4KCiogYHNoZWxsJyBmdW5jdGlvbiB0byBleHBhbmQgc2hlbGwgY29tbWFuZHMgYSBsYSBgCgoqIElmIHRoZSBgLWQnIGZsYWcgaXMgZ2l2ZW4sIHZlcnNpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBwcmludGVkLgoKKiBUaGUgYC1jJyBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBgLUMnIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGFyLgoKKiBUaGUgYC1wJyBvcHRpb24gbm8gbG9uZ2VyIGluaGliaXRzIG90aGVyIG5vcm1hbCBvcGVyYXRpb24uCgoqIE1ha2VmaWxlcyB3aWxsIGJlIHVwZGF0ZWQgYW5kIHJlLXJlYWQgaWYgbmVjZXNzYXJ5LgoKKiBDYW4gbm93IHJ1biBzZXZlcmFsIHJlY2lwZXMgYXQgb25jZSAocGFyYWxsZWxpc20pLCAtaiBvcHRpb24uCgoqIEVycm9yIG1lc3NhZ2VzIHdpbGwgY29udGFpbiB0aGUgbGV2ZWwgb2YgTWFrZSByZWN1cnNpb24sIGlmIGFueS4KCiogVGhlIGBNQUtFRkxBR1MnIGFuZCBgTUZMQUdTJyB2YXJpYWJsZXMgd2lsbCBiZSBzY2FubmVkIGZvciBvcHRpb25zIGFmdGVyCiAgbWFrZWZpbGVzIGFyZSByZWFkLgoKKiBBIGRvdWJsZS1jb2xvbiBydWxlIHdpdGggbm8gZGVwZW5kZW5jaWVzIHdpbGwgYWx3YXlzIGhhdmUgaXRzIHJlY2lwZSBydW4uCiAgKFRoaXMgaXMgaG93IGJvdGggdGhlIEJTRCBhbmQgU3lzdGVtIFYgdmVyc2lvbnMgb2YgTWFrZSBkbyBpdC4pCgwKVmVyc2lvbiAzLjA1CgooQ2hhbmdlcyBmcm9tIHZlcnNpb25zIDEgdGhyb3VnaCAzLjA1IHdlcmUgbmV2ZXIgcmVjb3JkZWQuICBTb3JyeS4pCgwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDb3B5cmlnaHQgKEMpIDE5ODgtMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIE1ha2UuCgpHTlUgTWFrZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQp0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCnZlcnNpb24uCgpHTlUgTWFrZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IKQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCnRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4K