VGhpcyBmaWxlIGRlc2NyaWJlcyB3aGVyZSB0byBzdGFydCBkZWJ1Z2dpbmcgV2luZSBhbmQgaG93IHRvIHdyaXRlCnVzZWZ1bCBidWcgcmVwb3J0cy4KClRvIGF2b2lkIGRlYnVnZ2luZwo9PT09PT09PT09PT09PT09PT0KClNvbWV0aW1lcyB5b3UgY2FuIGJyaW5nIGFwcGxpY2F0aW9ucyB0byBydW4gYnkgdXNpbmcgc29tZSBvZiB0aGUKbmF0aXZlIFdpbmRvd3MgRExMJ3MsIHRvZ2V0aGVyIHdpdGggV2luZS4gSGVyZSBhcmUgc29tZSBUaXBzIGJ5Ckp1ZXJnZW4gU2NobWllZCBvbiBob3cgdG8gcHJvY2VlZC4gVGhpcyBhc3N1bWVzIHRoYXQgeW91ciBDOlx3aW5kb3dzCmRpcmVjdG9yeSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGRvZXMgbm90IHBvaW50IHRvIGEgbmF0aXZlIFdpbmRvd3MKaW5zdGFsbGF0aW9uIGJ1dCBpcyBpbiBhIHNlcGFyYXRlIFVuaXggZmlsZSBzeXN0ZW0uIChGb3IgaW5zdGFuY2UsCkM6XHdpbmRvd3MgaXMgcmVhbGx5IC9ob21lL2Vnby93aW5lL2RyaXZlcy9jKS4KCi0gQ3JlYXRlIGVtcHR5IEM6XHdpbmRvd3MgYW5kIEM6XHdpbmRvd3Ncc3lzdGVtIGRpcmVjdG9yaWVzLgogIERvIG5vdCBwb2ludCBXaW5lIHRvIGEgV2luZG93cyBkaXJlY3RvcnkgZnVsbCBvZiBvbGQgaW5zdGFsbGF0aW9ucwogIGFuZCBhIG1lc3N5IHJlZ2lzdHJ5LiAoV2luZSBjcmVhdGVzIGEgc3BlY2lhbCByZWdpc3RyeSBpbiB5b3VyIGhvbWUKICBkaXJlY3RvcnksIGluICRIT01FLy53aW5lLyoucmVnLiBQZXJoYXBzIHlvdSBoYXZlIHRvIHJlbW92ZSB0aGVzZQogIGZpbGVzKS4KLSBSdW4gdGhlIGFwcGxpY2F0aW9uIHdpdGggICAtZGVidWdtc2cgK21vZHVsZSwrZmlsZSAgIHRvIGZpbmQgb3V0CiAgd2hpY2ggZmlsZXMgYXJlIG5lZWRlZC4gQ29weSB0aGUgcmVxdWlyZWQgRExMJ3Mgb25lIGJ5IG9uZSB0byB0aGUKICBDOlx3aW5kb3dzXHN5c3RlbSBkaXJlY3RvcnkuCi0gTm90ZSB0aGF0IHNvbWUgbmV0d29yayBETEwncyBhcmUgbm90IG5lZWRlZCBldmVuIHRob3VnaCBXaW5lIGlzCiAgbG9va2luZyBmb3IgdGhlbS4gRG8gbm90IGNvcHkgdGhlIE1QUi5ETEwgaW50byB0aGUgZGlyZWN0b3J5LAogIHVzZSB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCi0gQ29weSBTSEVMTC9TSEVMTDMyIGFuZCBDT01ETEcvQ09NRExHMzIgQ09NTUNUUkwvQ09NQ1RMMzIKICBvbmx5IGFzIHBhaXJzIHRvIHlvdXIgV2luZSBkaXJlY3RvcnkgKHRoZXNlIERMTCdzIGFyZQogICJjbGVhbiIgdG8gdXNlKQotIEJlIGNvbnNpc3RlbnQ6IFVzZSBvbmx5IERMTFMgZnJvbSB0aGUgc2FtZSBXaW5kb3dzIHZlcnNpb24KICB0b2dldGhlci4KLSBQdXQgcmVnZWRpdC5leGUgaW4gdGhlIEM6XHdpbmRvd3MgZGlyZWN0b3J5IChvZmZpY2U5NSBpbXBvcnRzCiAgYSAqLnJlZyBmaWxlIHdoZW4gaXQgcnVucyB3aXRoIGEgZW1wdHkgcmVnaXN0cnksIGRvbid0IGtub3cKICBhYm91dCBvZmZpY2U5NykuCgoKQ3Jhc2hlcwo9PT09PT09CgogIFRoZXNlIHVzdWFsbHkgc2hvdyB1cCBsaWtlIHRoaXM6Cgp8VW5leHBlY3RlZCBXaW5kb3dzIHByb2dyYW0gc2VnZmF1bHQgLSBvcGNvZGUgPSA4Ygp8U2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmRvd3MgcHJvZ3JhbSAxYjc6YzQxLgp8TG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Jvb3Qvd2luZS93aW5lLi4uCnwuLi4ubW9yZSBMb2FkaW5nIHN5bWJvbHMgZnJvbSAuLi4KfEluIDE2IGJpdCBtb2RlLgp8UmVnaXN0ZXIgZHVtcDoKfCBDUzowMWI3IFNTOjAxNmYgRFM6MDI4NyBFUzowMDAwCnwgSVA6MGM0MSBTUDo4NzhhIEJQOjg3OTYgRkxBR1M6MDI0Ngp8IEFYOjgxMWUgQlg6MDAwMCBDWDowMDAwIERYOjAwMDAgU0k6MDAwMSBESTpmZmZmCnxTdGFjayBkdW1wOgp8MHgwMTZmOjB4ODc4YTogIDAwMDEgMDE2ZiBmZmVkIDAwMDAgMDAwMCAwMjg3IDg5MGIgMWU1Ygp8MHgwMTZmOjB4ODc5YTogIDAxYjcgMDAwMSAwMDBkIDEwNTAgMDhiNyAwMTZmIDAwMDEgMDAwZAp8MHgwMTZmOjB4ODdhYTogIDAwMGEgMDAwMyAwMDA0IDAwMDAgMDAwNyAwMDA3IDAxOTAgMDAwMAp8MHgwMTZmOjB4ODdiYToKfAp8MDA1MDogc2VsPTAyODcgYmFzZT00MDIxMWQzMCBsaW1pdD0wYjkzZiAoYnl0ZXMpIDE2LWJpdCBydy0KfEJhY2t0cmFjZToKfDAgMHgwMWI3OjB4MGM0MSAoUFhTUlZfRk9OR0VURkFDRU5BTUUrMHg3YykKfDEgMHgwMWI3OjB4MWU1YiAoUFhTUlZfRk9OUFVUQ0FURk9OVCsweDJjZCkKfDIgMHgwMWE3OjB4MDVhYQp8MyAweDAxYjc6MHgwNzY4IChQWFNSVl9GT05JTklURk9OVFMrMHg4MSkKfDQgMHgwMTRmOjB4MDNlZCAoUERPWFdJTl9AU1FMQ1VSQ0IkUTZDQlRZUEVVTE44Q0JTQ1RZUEUrMHgxYjEpCnw1IDB4MDEzZjoweDAwYWMKfAp8MHgwMWI3OjB4MGM0MSAoUFhTUlZfRk9OR0VURkFDRU5BTUUrMHg3Yyk6ICBtb3Z3ICAgICAgICAlZXM6MHgzOCglYngpLCVkeAoKU3RlcHMgdG8gZGVidWcgYSBjcmFzaC4gWW91IG1heSBzdG9wIGF0IGFueSBzdGVwLCBidXQgcGxlYXNlIHJlcG9ydCB0aGUgYnVnCmFuZCBwcm92aWRlIGFzIG11Y2ggb2YgdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIHRvIHRoZSBuZXdzZ3JvdXAgb3IgdGhlCnJlbGV2YW50IGRldmVsb3BlciBhcyBmZWFzb25hYmxlLgogIAogMS4gR2V0IHRoZSByZWFzb24gZm9yIHRoZSBjcmFzaC4gVGhpcyBpcyB1c3VhbGx5IGFuIGFjY2VzcyB0byBhbiBpbnZhbGlkCiAgICBzZWxlY3RvciwgYW4gYWNjZXNzIHRvIGFuIG91dCBvZiByYW5nZSBhZGRyZXNzIGluIGEgdmFsaWQgc2VsZWN0b3IsCiAgICBwb3BwaW5nIGEgc2VnbWVudHJlZ2lzdGVyIGZyb20gdGhlIHN0YWNrIG9yIHRoZSBsaWtlLiBXaGVuIHJlcG9ydGluZyBhCiAgICBjcmFzaCwgcmVwb3J0IHRoaXMgV0hPTEUgY3Jhc2hkdW1wIGV2ZW4gaWYgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHlvdS4KCiAgICAoSW4gdGhpcyBjYXNlIGl0IGlzIGFjY2VzcyB0byBhbiBpbnZhbGlkIHNlbGVjdG9yLCBmb3IgJWVzIGlzIDAwMDAsIGFzCiAgICBzZWVuIGluIHRoZSByZWdpc3RlciBkdW1wKS4KICAgIAogMi4gRGV0ZXJtaW5lIHdoZXJlIHRoZSByZWFzb24gY2FtZSBmcm9tLgogICAgU2luY2UgdGhpcyBpcyB1c3VhbGx5IGEgcHJpbWFyeS9zZWNvbmRhcnkgcmVhY3Rpb24gdG8gYSBmYWlsZWQgb3IKICAgIG1pc2JlaGF2aW5nIFdpbmUgZnVuY3Rpb24sIHJlcnVuIFdpbmUgd2l0aCAiLWRlYnVnbXNnICtyZWxheSIgKHdpdGhvdXQgIikKICAgIGFkZGVkIHRvIHRoZSBjb21tYW5kbGluZS4gVGhpcyB3aWxsIGdldCByYXRoZXIgbXVjaCBvdXRwdXQsIGJ1dCB1c3VhbGx5CiAgICB0aGUgcmVhc29uIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgY2FsbChzKS4gIFRob3NlIGxpbmVzIHVzdWFsbHkgbG9vayBsaWtlCiAgICB0aGlzOgoKfENhbGwgS0VSTkVMLjkwOiBMU1RSTEVOKDAyMjc6MDY5MiAidGV4dCIpIHJldD0wMWU3OjJjZTcgZHM9MDIyNwogICAgICBeXl5eXl5eXl4gIF4gICAgICAgXl5eXl5eXl5eIF5eXl5eXiAgICAgIF5eXl5eXl5eXiAgICBeXl5eCiAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgIHxEYXRhc2VnbWVudAogICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgIHxSZXR1cm4gYWRkcmVzcwogICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgIHx0ZXh0dWFsIHBhcmFtZXRlcgogICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICAgICB8ICAgICAgICAgIHwgICAgICAgfEFyZ3VtZW50KHMpLiBUaGlzIG9uZSBpcyBhIHdpbjE2IHNlZ21lbnRlZCBwb2ludGVyLgogICAgICB8ICAgICAgICAgIHxGdW5jdGlvbiBjYWxsZWQuCiAgICAgIHxUaGUgbW9kdWxlLCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGluLiBJbiB0aGlzIGNhc2UgaXQgaXMgS0VSTkVMLgoJCSAgICAgICAgCnxSZXQgIEtFUk5FTC45MDogTFNUUkxFTigpIHJldHZhbD0weDAwMDQgcmV0PTAxZTc6MmNlNyBkcz0wMjI3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCQkJCSAgfFJldHVybnZhbHVlIGlzIDE2IGJpdCBhbmQgaGFzIHRoZSB2YWx1ZSA0LgoKCiAzLiBJZiB5b3UgaGF2ZSBmb3VuZCBhIG1pc2JlaGF2aW5nIGZ1bmN0aW9uLCB0cnkgdG8gZmluZCBvdXQgd2h5IGl0CiAgICBtaXNiZWhhdmVzLiBGaW5kIHRoZSBmdW5jdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuIFRyeSB0byBtYWtlIHNlbnNlIG9mCiAgICB0aGUgYXJndW1lbnRzIHBhc3NlZC4gVXN1YWxseSB0aGVyZSBpcyBhICdUUkFDRSg8Y2hhbm5lbD4sIiguLi4pXG4iKTsnIAogICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24uIFJlcnVuIHdpbmUgd2l0aCAKICAgICItZGVidWdtc2cgK3h5eiwrcmVsYXkiIGFkZGVkIHRvIHRoZSBjb21tYW5kbGluZS4KCiA0LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkZWJ1ZyB1c2luZyB0aGUgaW50ZXJuYWwgZGVidWdnZXIgY2FuIGJlIAogICAgZm91bmQgaW4gZGVidWdnZXIvUkVBRE1FLgoKIDUuIElmIHRob3NlIGluZm9ybWF0aW9uIGlzbid0IGNsZWFyIGVub3VnaCBvciBpZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQKICAgIHdoYXQncyBoYXBwZW5pbmcgaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgdHJ5IHJ1bm5pbmcgd2luZSB3aXRoICItZGVidWdtc2cKICAgICthbGwiLCB3aGljaCBkdW1wcyBBTEwgaW5jbHVkZWQgZGVidWcgaW5mb3JtYXRpb24gaW4gd2luZS4KCiA2LiBJZiB0aGF0IGlzbid0IGVub3VnaCBhZGQgbW9yZSBkZWJ1ZyBvdXRwdXQgZm9yIHlvdXJzZWxmIGludG8gdGhlCiAgICBmdW5jdGlvbnMgeW91IGZpbmQgcmVsZXZhbnQuICBTZWUgZG9jdW1lbnRhdGlvbi9kZWJ1Zy1tc2dzLgogICAgWW91IG1pZ2h0IGFsc28gdHJ5IHRvIHJ1biB0aGUgcHJvZ3JhbSBpbiBnZGIgaW5zdGVhZCBvZiB1c2luZyB0aGUKICAgIFdJTkUtZGVidWdnZXIuIElmIHlvdSBkb24ndCB1c2UgdGhlICItZGVza3RvcCIgb3IgIi1tYW5hZ2VkIiBvcHRpb24sCiAgICBzdGFydCB0aGUgV0lORSBwcm9jZXNzIHdpdGggIi1zeW5jIiwgb3IgY2hhbmNlcyBhcmUgZ29vZCB0byBnZXQgWCBpbnRvCiAgICBhbiB1bnVzYWJsZSBzdGF0ZS4KICAKIDcuIFlvdSBjYW4gYWxzbyBzZXQgYSBicmVha3BvaW50IGZvciB0aGF0IGZ1bmN0aW9uLiBTdGFydCB3aW5lIHdpdGggdGhlCiAgICAiLWRlYnVnIiBvcHRpb24gYWRkZWQgdG8gdGhlIGNvbW1hbmRsaW5lLiBBZnRlciBsb2FkaW5nIHRoZSBleGVjdXRhYmxlCiAgICB3aW5lIHdpbGwgZW50ZXIgdGhlIGludGVybmFsIGRlYnVnZ2VyLiBVc2UgImJyZWFrIEtFUk5FTF9MU1RSTEVOIgogICAgKHJlcGxhY2UgYnkgZnVuY3Rpb24geW91IHdhbnQgdG8gZGVidWcsIENBU0UgSVMgUkVMRVZBTlQuKSB0byBzZXQgYQogICAgYnJlYWtwb2ludC4gIFRoZW4gdXNlICJjb250aW51ZSIgdG8gc3RhcnQgbm9ybWFsIHByb2dyYW0tZXhlY3V0aW9uLiBXaW5lCiAgICB3aWxsIHN0b3AgaWYgaXQgcmVhY2hlcyB0aGUgYnJlYWtwb2ludC4gSWYgdGhlIHByb2dyYW0gaXNuJ3QgeWV0IGF0IHRoZQogICAgY3Jhc2hpbmcgY2FsbCBvZiB0aGF0IGZ1bmN0aW9uLCB1c2UgImNvbnRpbnVlIiBhZ2FpbiB1bnRpbCB5b3UgYXJlIGFib3V0CiAgICB0byBlbnRlciB0aGF0IGZ1bmN0aW9uLiBZb3UgbWF5IG5vdyBwcm9jZWVkIHdpdGggc2luZ2xlLXN0ZXBwaW5nIHRoZQogICAgZnVuY3Rpb24gdW50aWwgeW91IHJlYWNoIHRoZSBwb2ludCBvZiBjcmFzaC4gVXNlIHRoZSBvdGhlciBkZWJ1Z2dlcgogICAgY29tbWFuZHMgdG8gcHJpbnQgcmVnaXN0ZXJzIGFuZCB0aGUgbGlrZS4KCgpQcm9ncmFtIGhhbmdzLCBub3RoaW5nIGhhcHBlbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIFN3aXRjaCB0byBVTklYIHNoZWxsLCBnZXQgdGhlIHByb2Nlc3MtSUQgdXNpbmcgInBzIC1hfGdyZXAgd2luZSIsIGFuZCBkbyBhCiAgImtpbGwgLUhVUCA8cGlkPiIgKHdpdGhvdXQgIiBhbmQgPD4pLiBXaW5lIHdpbGwgdGhlbiBlbnRlciBpdHMgaW50ZXJuYWwKICBkZWJ1Z2dlciBhbmQgeW91IGNhbiBwcm9jZWVkIGFzIGV4cGxhaW5lZCBhYm92ZS4gQWxzbywgeW91IGNhbiB1c2UgLWRlYnVnCiAgc3dpdGNoIGFuZCB0aGVuIHlvdSBjYW4gZ2V0IGludG8gaW50ZXJuYWwgZGVidWdnZXIgYnkgcHJlc3NpbmcgQ3RybC1DIGluIAogIHRoZSB0ZXJtaW5hbCB3aGVyZSB5b3UgcnVuIFdpbmUuCgpQcm9ncmFtIHJlcG9ydHMgYW4gZXJyb3Igd2l0aCBhIE1lc3NhZ2Vib3gKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIFNvbWV0aW1lcyBwcm9ncmFtcyBhcmUgcmVwb3J0aW5nIGZhaWx1cmUgdXNpbmcgYSBtb3JlIG9yIGxlc3Mgbm9uZGVzY3JpcHQKICBtZXNzYWdlYm94ZXMuIFdlIGNhbiBkZWJ1ZyB0aGlzIHVzaW5nIHRoZSBzYW1lIG1ldGhvZCBhcyBDcmFzaGVzLCBidXQgdGhlcmUKICBpcyBvbmUgcHJvYmxlbS4uLiBGb3Igc2V0dGluZyB1cCBhIG1lc3NhZ2UgYm94IHRoZSBwcm9ncmFtIGFsc28gY2FsbHMgV2luZQogIHByb2R1Y2luZyBodWdlIGNodW5rcyBvZiBkZWJ1ZyBjb2RlLgoKICBTaW5jZSB0aGUgZmFpbHVyZSBoYXBwZW5zIHVzdWFsbHkgZGlyZWN0bHkgYmVmb3JlIHNldHRpbmcgdXAgdGhlIE1lc3NhZ2Vib3gKICB5b3UgY2FuIHN0YXJ0IHdpbmUgd2l0aCAiLWRlYnVnIiBhZGRlZCB0byB0aGUgY29tbWFuZGxpbmUsIHNldCBhIGJyZWFrcG9pbnQKICBhdCAiTWVzc2FnZUJveDMyQSIgKGNhbGxlZCBieSB3aW4xNiBhbmQgd2luMzIgcHJvZ3JhbXMpIGFuZCBwcm9jZWVkIHdpdGgKICAiY29udGludWUiLiBXaXRoICItZGVidWdtc2cgK2FsbCIgV2luZSB3aWxsIG5vdyBzdG9wIGRpcmVjdGx5IGJlZm9yZSAKICBzZXR0aW5nIHVwIHRoZSBNZXNzYWdlYm94LiAgUHJvY2VlZCBhcyBleHBsYWluZWQgYWJvdmUuCgogIFlvdSBjYW4gYWxzbyBydW4gd2luZSB1c2luZyAid2luZSAtZGVidWdtc2cgK3JlbGF5IHByb2dyYW0uZXhlIDI+JjF8bGVzcyAtaSIKICBhbmQgaW4gbGVzcyBzZWFyY2ggZm9yIG1lc3NhZ2Vib3guCgpEaXNhc3NlbWJsaW5nIHByb2dyYW1zOgo9PT09PT09PT09PT09PT09PT09PT09PQogIFlvdSBtYXkgYWxzbyB0cnkgdG8gZGlzYXNzZW1ibGUgdGhlIG9mZmVuZGluZyBwcm9ncmFtIHRvIGNoZWNrIGZvciAKICB1bmRvY3VtZW50ZWQgZmVhdHVyZXMgYW5kL29yIHVzZSBvZiB0aGVtLgoKICBUaGUgYmVzdCwgZnJlZWx5IGF2YWlsYWJsZSwgZGlzYXNzZW1ibGVyIGZvciBXaW4xNiBwcm9ncmFtcyBpcwogIFdpbmRvd3MgQ29kZWJhY2ssIGFyY2hpdmVuYW1lIHdjYnh4eC56aXAsIHdoaWNoIHVzdWFsbHkgY2FuIGJlIGZvdW5kCiAgaW4gdGhlIENpY2EtTWlycm9yIHN1YmRpcmVjdG9yeSBvbiB0aGUgV0lORSBmdHBzaXRlcy4gKFNlZSBBTk5PVU5DRSkuCiAgRGlzYXNzZW1ibGluZyB3aW4zMiBwcm9ncmFtcyBpcyBwb3NzaWJsZSB1c2luZyB0aGUgV2luZG93cyBEaXNhc3NlbWJsZXIgMzIsCiAgYXJjaGl2ZW5hbWUgc29tZXRoaW5nIGxpa2UgdzMyZGFzbS56aXAgb24gZnRwLndpbnNpdGUuY29tIGFuZCBtaXJyb3JzLgogIFRoZSBzaGFyZXdhcmUgdmVyc2lvbiBkb2VzIG5vdCBhbGxvdyBzYXZpbmcgb2YgZGlzYXNzZW1ibHkgbGlzdGluZ3MuCgogIFtJdCBhbHNvIGhhcyBhIGJ1ZywgaXQgZGlzYXNzZW1ibGVzIHRoZSBkbGwgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIHRoYXQKICAgY3Jhc2hlcywgbGVhdmluZyBhIHZlcnkgbGFyZ2UgZmlsZSBjYWxlZCAnd2luc3lzJyBpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZQogICBkaXNhc3NlbWJsZWQgZmlsZS4gVGhpcyBmaWxlIGNvbnRhaW5zIG5vdGhpbmcgb2YgdmFsdWUgKGp1c3QgdGhlIGRpc2Fzc2VtYmx5KQogICBhbmQgY2FuIGJlIHNhZmVseSBkZWxldGVkLl0KCiAgVW5kZXJzdGFuZGluZyBkaXNhc3NlbWJsZWQgY29kZSBpcyBqdXN0IGEgcXVlc3Rpb24gb2YgZXhlcmNpc2UuCgogIE1vc3QgY29kZSBvdXQgdGhlcmUgdXNlcyBzdGFuZGFyZCBDIGZ1bmN0aW9uIGVudHJpZXMgKGZvciBpdCBpcyB1c3VhbGx5IAogIHdyaXR0ZW4gaW4gQykuIFdpbjE2IGZ1bmN0aW9uIGVudHJpZXMgdXN1YWxseSBsb29rIGxpa2UgdGhhdDoKfCAgCXB1c2ggYnAKfAltb3YgYnAsIHNwCnwJLi4uIGZ1bmN0aW9uIGNvZGUgLi4KfAlyZXRmIFhYWFggCTwtLS0tLS0tLS0gWFhYWCBpcyBudW1iZXIgb2YgYnl0ZXMgb2YgYXJndW1lbnRzCgogIFRoaXMgaXMgYSBGQVIgZnVuY3Rpb24gd2l0aCBubyBsb2NhbCBzdG9yYWdlLiBUaGUgYXJndW1lbnRzIHVzdWFsbHkgc3RhcnQKICBhdCBbYnArNl0gd2l0aCBpbmNyZWFzaW5nIG9mZnNldHMuIE5vdGUsIHRoYXQgW2JwKzZdIGJlbG9uZ3MgdG8gdGhlIFJJR0hUTU9TVCAKICBhcmd1bWVudCwgZm9yIGV4cG9ydGVkIHdpbjE2IGZ1bmN0aW9ucyB1c2UgdGhlIFBBU0NBTCBjYWxsaW5nIGNvbnZlbnRpb24uCiAgU28sIGlmIHdlIHVzZSBzdHJjbXAoYSxiKSB3aXRoIGEgYW5kIGIgYm90aCAzMiBiaXQgdmFyaWFibGVzIGIgd291bGQgYmUgYXQKICBbYnArNl0gYW5kIGEgYXQgW2JwKzEwXS4KICBNb3N0IGZ1bmN0aW9ucyBtYWtlIGFsc28gdXNlIG9mIGxvY2FsIHN0b3JhZ2UgaW4gdGhlIHN0YWNrZnJhbWU6CnwJZW50ZXIgMDA4NiwgMDAKfAkuLi4gZnVuY3Rpb24gY29kZSAuLi4KfAlsZWF2ZQp8CXJldGYgWFhYWAogIFRoaXMgZG9lcyBtb3N0bHkgdGhlIHNhbWUgYXMgYWJvdmUsIGJ1dCBhbHNvIGFkZHMgMHg4NiBieXRlcyBvZgogIHN0YWNrc3RvcmFnZSwgd2hpY2ggaXMgYWNjZXNzZWQgdXNpbmcgW2JwLXh4XS4KICBCZWZvcmUgY2FsbGluZyBhIGZ1bmN0aW9uLCBhcmd1bWVudHMgYXJlIHB1c2hlZCBvbiB0aGUgc3RhY2sgdXNpbmcgc29tZXRoaW5nCiAgbGlrZSB0aGlzOgp8CXB1c2ggd29yZCBwdHIgW2JwLTAyXQk8LSB3aWxsIGJlIGF0IFticCs4XQp8CXB1c2ggZGkJCQk8LSB3aWxsIGJlIGF0IFticCs2XQp8CWNhbGwgS0VSTkVMLkxTVFJMRU4KICBIZXJlIGZpcnN0IHRoZSBzZWxlY3RvciBhbmQgdGhlbiB0aGUgb2Zmc2V0IHRvIHRoZSBwYXNzZWQgc3RyaW5nIGFyZSBwdXNoZWQuCgpTYW1wbGUgZGVidWdnaW5nIHNlc3Npb246Cj09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgTGV0J3MgZGVidWcgdGhlIGluZmFtb3VzIFdvcmQgU0hBUkUuRVhFIG1lc3NhZ2Vib3g6IAoKfG1hcmN1c0BqZXQgJCB3aW5lIHdpbndvcmQuZXhlCnwgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICAgICAgICAgICAgfCAhICBZb3UgbXVzdCBsZWF2ZSBXaW5kb3dzIGFuZCBsb2FkIFNIQVJFLkVYRXwKfCAgICAgICAgICAgIHwgICAgYmVmb3JlIHN0YXJ0aW5nIFdvcmQuICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCnxtYXJjdXNAamV0ICQgd2luZSB3aW53b3JkLmV4ZSAtZGVidWdtc2cgK3JlbGF5IC1kZWJ1Zwp8Q2FsbFRvMzIod25kcHJvYz0weDQwMDY1YmMwLGh3bmQ9MDAwMDAxYWMsbXNnPTAwMDAwMDgxLHdwPTAwMDAwMDAwLGxwPTAwMDAwMDAwKQp8V2luMTYgdGFzayAnd2lud29yZCc6IEJyZWFrcG9pbnQgMSBhdCAweDAxZDc6MHgwMDFhCnxDYWxsVG8xNihmdW5jPTAxMjc6MDA3MCxkcz0wOTI3KQp8Q2FsbCBXUFJPQ1MuMjQ6IFRBU0tfUkVTQ0hFRFVMRSgpIHJldD0wMGI3OjE0NTYgZHM9MDkyNwp8UmV0ICBXUFJPQ1MuMjQ6IFRBU0tfUkVTQ0hFRFVMRSgpIHJldHZhbD0weDg2NzIgcmV0PTAwYjc6MTQ1NiBkcz0wOTI3CnxDYWxsVG8xNihmdW5jPTAxZDc6MDAxYSxkcz0wOTI3KQp8ICAgICBBWD0wMDAwIEJYPTNjYjQgQ1g9MWY0MCBEWD0wMDAwIFNJPTAwMDAgREk9MDkyNyBCUD0wMDAwIEVTPTExZjcKfExvYWRpbmcgc3ltYm9sczogL2hvbWUvbWFyY3VzL3dpbmUvd2luZS4uLgp8U3RvcHBlZCBvbiBicmVha3BvaW50IDEgYXQgMHgwMWQ3OjB4MDAxYQp8SW4gMTYgYml0IG1vZGUuCnxXaW5lLWRiZz5icmVhayBNZXNzYWdlQm94MzJBICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSBTZXQgQnJlYWtwb2ludAp8QnJlYWtwb2ludCAyIGF0IDB4NDAxODkxMDAgKE1lc3NhZ2VCb3gzMkEgW21zZ2JveC5jOjE5MF0pCnxXaW5lLWRiZz5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSBDb250aW51ZQp8Q2FsbCBLRVJORUwuOTE6IElOSVRUQVNLKCkgcmV0PTAxNTc6MDAyMiBkcz0wOGE3CnwgICAgIEFYPTAwMDAgQlg9M2NiNCBDWD0xZjQwIERYPTAwMDAgU0k9MDAwMCBEST0wOGE3IEVTPTExZDcgRUZMPTAwMDAwMjg2CnxDYWxsVG8xNihmdW5jPTA5MGY6MDg1Yyxkcz0wZGNmLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDA4MDAsMHgwMDAwLDB4MDAwMCwweDBkY2YpCnwuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLS0gTXVjaCBkZWJ1Z291dHB1dAp8Q2FsbCBLRVJORUwuMTM2OiBHRVREUklWRVRZUEUoMHgwMDAwKSByZXQ9MDYwZjowOTdiIGRzPTA5MjcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiBEcml2ZSAwIChBOikKfFJldCAgS0VSTkVMLjEzNjogR0VURFJJVkVUWVBFKCkgcmV0dmFsPTB4MDAwMiByZXQ9MDYwZjowOTdiIGRzPTA5MjcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiAgRFJJVkVfUkVNT1ZFQUJMRQoJCQkJCQkoSXQgaXMgYSBmbG9wcHkgZGlza2RyaXZlLikKCnxDYWxsIEtFUk5FTC4xMzY6IEdFVERSSVZFVFlQRSgweDAwMDEpIHJldD0wNjBmOjA5N2IgZHM9MDkyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eIERyaXZlIDEgKEI6KQp8UmV0ICBLRVJORUwuMTM2OiBHRVREUklWRVRZUEUoKSByZXR2YWw9MHgwMDAwIHJldD0wNjBmOjA5N2IgZHM9MDkyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eICBEUklWRV9DQU5OT1RERVRFUk1JTkUKCQkJCQkJKEkgZG9uJ3QgaGF2ZSBkcml2ZSBCOiBhc3NpZ25lZCkKCnxDYWxsIEtFUk5FTC4xMzY6IEdFVERSSVZFVFlQRSgweDAwMDIpIHJldD0wNjBmOjA5N2IgZHM9MDkyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXiBEcml2ZSAyIChDOikKfFJldCAgS0VSTkVMLjEzNjogR0VURFJJVkVUWVBFKCkgcmV0dmFsPTB4MDAwMyByZXQ9MDYwZjowOTdiIGRzPTA5MjcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiBEUklWRV9GSVhFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjaWZpZWQgYXMgYSBoYXJkZGlzaykKCnxDYWxsIEtFUk5FTC45NzogR0VUVEVNUEZJTEVOQU1FKDB4MDBjMywweDA5Mjc4MzY0ImRvYyIsMHgwMDAwLDA5Mjc6ODI0OCkgcmV0PTA2MGY6MDliMSBkcz0wOTI3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiAgICAgICAgICAgXl5eXl4gICAgICAgIF5eXl5eXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8YnVmZmVyIGZvciBmbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHx0ZW1wb3JhcnkgbmFtZSB+ZG9jWFhYWC50bXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEZvcmNlIHVzZSBvZiBEcml2ZSBDOi4KCnxXYXJuaW5nOiBHZXRUZW1wRmlsZU5hbWUgcmV0dXJucyAnQzp+ZG9jOTI4MS50bXAnLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgd3JpdGVhYmxlLgp8UGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlIGlmIHRoaXMgZ2VuZXJhdGVzIGEgZmFpbHVyZS4KCldob29wcywgaXQgZXZlbiBkZXRlY3RzIHRoYXQgc29tZXRoaW5nIGlzIHdyb25nIQoKfFJldCAgS0VSTkVMLjk3OiBHRVRURU1QRklMRU5BTUUoKSByZXR2YWw9MHg5MjgxIHJldD0wNjBmOjA5YjEgZHM9MDkyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4gVGVtcG9yYXJ5IHN0b3JhZ2UgSUQKCnxDYWxsIEtFUk5FTC43NDogT1BFTkZJTEUoMHgwOTI3ODI0OCJDOn5kb2M5MjgxLnRtcCIsMDkyNzo4MmRhLDB4MTAxMikgcmV0PTA2MGY6MDlkOCBkcz0wOTI3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl4gXl5eXl5eXl5eIF5eXl5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfGZpbGVuYW1lICAgICAgICB8T0ZTVFJVQ1QgfG9wZW4gbW9kZToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GX0NSRUFURXxPRl9TSEFSRV9FWENMVVNJVkV8T0ZfUkVBRFdSSVRFCgpUaGlzIGZhaWxzLCBzaW5jZSBteSBDOiBkcml2ZSBpcyBpbiB0aGlzIGNhc2UgbW91bnRlZCByZWFkb25seS4KCnxSZXQgIEtFUk5FTC43NDogT1BFTkZJTEUoKSByZXR2YWw9MHhmZmZmIHJldD0wNjBmOjA5ZDggZHM9MDkyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXiBIRklMRV9FUlJPUjE2LCB5ZXMsIGl0IGZhaWxlZC4KCnxDYWxsIFVTRVIuMTogTUVTU0FHRUJPWCgweDAwMDAsMHgwOTI3ODM3NiJTaWUgbfxzc2VuIFdpbmRvd3MgdmVybGFzc2VuIHVuZCBTSEFSRS5FWEUgbGFkZW4gYmV2b3IgU2llIFdvcmQgc3RhcnRlbi4iLDB4MDAwMDAwMDAsMHgxMDMwKSByZXQ9MDYwZjowODRmIGRzPTA5MjcKICAgICAgICAgICAKQW5kIE1lc3NhZ2VCb3gnZWQuCgp8U3RvcHBlZCBvbiBicmVha3BvaW50IDIgYXQgMHg0MDE4OTEwMCAoTWVzc2FnZUJveDMyQSBbbXNnYm94LmM6MTkwXSkKfDE5MCAgICAgewkJPC0gdGhlIHNvdXJjZWxpbmUKSW4gMzIgYml0IG1vZGUuCldpbmUtZGJnPgoKCVRoZSBjb2RlIHNlZW1zIHRvIGZpbmQgYSB3cml0ZWFibGUgaGFyZGRpc2sgYW5kIHRyaWVzIHRvIGNyZWF0ZSBhIGZpbGUKCXRoZXJlLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGJ1ZywgeW91IGNhbiBkZWZpbmUgQzogYXMgYSBuZXR3b3JrZHJpdmUsCgl3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZSBjb2RlIGFib3ZlLgoKV3JpdHRlbiBieSBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4sCmFkZGl0aW9ucyB3ZWxjb21lLgotLS0tLS0tCgpIZXJlIGFyZSBzb21lIHVzZWZ1bCBkZWJ1Z2dpbmcgdGlwcywgYWRkZWQgYnkgQW5kcmVhcyBNb2hyOgoKCmEpIElmIHlvdSBoYXZlIGEgcHJvZ3JhbSBjcmFzaGluZyBhdCBzdWNoIGFuIGVhcmx5IGxvYWRlciBwaGFzZSB0aGF0IHlvdSBjYW4ndAp1c2UgdGhlIFdpbmUgZGVidWdnZXIgbm9ybWFsbHksIGJ1dCBXaW5lIGFscmVhZHkgZXhlY3V0ZXMgdGhlIHByb2dyYW0ncwpzdGFydCBjb2RlLCB0aGVuIHlvdSBtYXkgdXNlIGEgc3BlY2lhbCB0cmljazoKWW91IHNob3VsZCBkbyBhCndpbmUgLWRlYnVnbXNnICtyZWxheSBwcm9ncmFtCnRvIGdldCBhIGxpc3Rpbmcgb2YgdGhlIGZ1bmN0aW9ucyB0aGUgcHJvZ3JhbSBjYWxscyBpbiBpdHMgc3RhcnQgZnVuY3Rpb24uCk5vdyB5b3UgZG8gYQp3aW5lIC1kZWJ1ZyB3aW5maWxlLmV4ZQpUaGlzIHdheSwgeW91IGdldCBpbnRvIFdpbmUtZGJnLiBOb3cgeW91IGNhbiBzZXQgYSBicmVha3BvaW50IG9uIGFueQpmdW5jdGlvbiB0aGUgcHJvZ3JhbSBjYWxscyBpbiB0aGUgc3RhcnQgZnVuY3Rpb24gYW5kIGp1c3QgdHlwZSAiYyIgdG8gYnlwYXNzCnRoZSBldmVudHVhbCBjYWxscyBvZiBXaW5maWxlIHRvIHRoaXMgZnVuY3Rpb24gdW50aWwgeW91IGFyZSBmaW5hbGx5IGF0IHRoZQpwbGFjZSB3aGVyZSB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBjcmFzaGluZyBzdGFydCBmdW5jdGlvbi4KTm93IHlvdSBjYW4gcHJvY2VlZCB3aXRoIHlvdXIgZGVidWdnaW5nIGFzIHVzdWFsLgoKCmIpIElmIHlvdSB0cnkgdG8gcnVuIGEgcHJvZ3JhbSBhbmQgaXQgcXVpdHMgYWZ0ZXIgc2hvd2luZyBhbiBlcnJvciBtZXNzYWdlYm94LAp0aGUgcHJvYmxlbSBjYW4gdXN1YWxseSBiZSBpZGVudGlmaWVkIGluIHRoZSByZXR1cm4gdmFsdWUgb2Ygb25lIG9mIHRoZQpmdW5jdGlvbnMgZXhlY3V0ZWQgYmVmb3JlIE1lc3NhZ2VCb3goKS4KVGhhdCdzIHdoeSB5b3Ugc2hvdWxkIHJlLXJ1biB0aGUgcHJvZ3JhbSB3aXRoIGUuZy4Kd2luZSAtZGVidWdtc2cgK3JlbGF5IDxwcm9ncmFtIG5hbWU+ICY+cmVsbXNnClRoZW4gZG8gYSAibW9yZSByZWxtc2ciIGFuZCBzZWFyY2ggZm9yIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBjYWxsIHRvIHRoZSBzdHJpbmcgIk1FU1NBR0VCT1giLgpUaGlzIGlzIGEgbGluZSBsaWtlCkNhbGwgVVNFUi4xOiBNRVNTQUdFQk9YKDB4MDAwMCwweDAxZmYxMjQ2ICJSdW50aW1lIGVycm9yIDIxOSBhdCAwMDA0OjEwNTYuIiwweDAwMDAwMDAwLDB4MTAxMCkgcmV0PTAxZjc6MjE2MCBkcz0wMWZmCgpJbiBteSBleGFtcGxlIHRoZSBsaW5lcyBiZWZvcmUgdGhlIGNhbGwgdG8gTWVzc2FnZUJveCgpIGxvb2sgbGlrZSB0aGF0OgoKQ2FsbCBLRVJORUwuOTY6IEZSRUVMSUJSQVJZKDB4MDM0NykgcmV0PTAxY2Y6MTAzMyBkcz0wMWZmCkNhbGxUbzE2KGZ1bmM9MDMzZjowMDcyLGRzPTAxZmYsMHgwMDAwKQpSZXQgIEtFUk5FTC45NjogRlJFRUxJQlJBUlkoKSByZXR2YWw9MHgwMDAxIHJldD0wMWNmOjEwMzMgZHM9MDFmZgpDYWxsIEtFUk5FTC45NjogRlJFRUxJQlJBUlkoMHgwMzZmKSByZXQ9MDFjZjoxMDQzIGRzPTAxZmYKQ2FsbFRvMTYoZnVuYz0wMzY3OjAwNzIsZHM9MDFmZiwweDAwMDApClJldCAgS0VSTkVMLjk2OiBGUkVFTElCUkFSWSgpIHJldHZhbD0weDAwMDEgcmV0PTAxY2Y6MTA0MyBkcz0wMWZmCkNhbGwgS0VSTkVMLjk2OiBGUkVFTElCUkFSWSgweDAzMWYpIHJldD0wMWNmOjEwNWMgZHM9MDFmZgpDYWxsVG8xNihmdW5jPTAzMTc6MDA3Mixkcz0wMWZmLDB4MDAwMCkKUmV0ICBLRVJORUwuOTY6IEZSRUVMSUJSQVJZKCkgcmV0dmFsPTB4MDAwMSByZXQ9MDFjZjoxMDVjIGRzPTAxZmYKQ2FsbCBVU0VSLjE3MTogV0lOSEVMUCgweDAyYWMsMHgwMWZmMDViNCAiQ09NRVQuSExQIiwweDAwMDIsMHgwMDAwMDAwMCkgcmV0PTAxY2Y6MTA3MCBkcz0wMWZmCkNhbGxUbzE2KGZ1bmM9MDExNzowMDgwLGRzPTAxZmYpCkNhbGwgV1BST0NTLjI0OiBUQVNLX1JFU0NIRURVTEUoKSByZXQ9MDBhNzowYTJkIGRzPTAwMmIKUmV0ICBXUFJPQ1MuMjQ6IFRBU0tfUkVTQ0hFRFVMRSgpIHJldHZhbD0weDAwMDAgcmV0PTAwYTc6MGEyZCBkcz0wMDJiClJldCAgVVNFUi4xNzE6IFdJTkhFTFAoKSByZXR2YWw9MHgwMDAxIHJldD0wMWNmOjEwNzAgZHM9MDFmZgpDYWxsIEtFUk5FTC45NjogRlJFRUxJQlJBUlkoMHgwMWJlKSByZXQ9MDFkZjozZTI5IGRzPTAxZmYKUmV0ICBLRVJORUwuOTY6IEZSRUVMSUJSQVJZKCkgcmV0dmFsPTB4MDAwMCByZXQ9MDFkZjozZTI5IGRzPTAxZmYKQ2FsbCBLRVJORUwuNTI6IEZSRUVQUk9DSU5TVEFOQ0UoMHgwMmNmMDBiYSkgcmV0PTAxZjc6MTQ2MCBkcz0wMWZmClJldCAgS0VSTkVMLjUyOiBGUkVFUFJPQ0lOU1RBTkNFKCkgcmV0dmFsPTB4MDAwMSByZXQ9MDFmNzoxNDYwIGRzPTAxZmYKQ2FsbCBVU0VSLjE6IE1FU1NBR0VCT1goMHgwMDAwLDB4MDFmZjEyNDYgIlJ1bnRpbWUgZXJyb3IgMjE5IGF0IDAwMDQ6MTA1Ni4iLDB4MDAwMDAwMDAsMHgxMDEwKSByZXQ9MDFmNzoyMTYwIGRzPTAxZmYKCkkgdGhpbmsgdGhhdCB0aGUgY2FsbCB0byBNZXNzYWdlQm94KCkgaW4gdGhpcyBleGFtcGxlIGlzIF9ub3RfIGNhdXNlZCBieSBhIHdyb25nIHJlc3VsdCB2YWx1ZSBvZiBzb21lIHByZXZpb3VzbHkgZXhlY3V0ZWQgZnVuY3Rpb24gKGl0J3MgaGFwcGVuaW5nIHF1aXRlIG9mdGVuIGxpa2UgdGhhdCksIGJ1dCBpbnN0ZWFkIHRoZSBtZXNzYWdlYm94IGNvbXBsYWlucyBhYm91dCBhIHJ1bnRpbWUgZXJyb3IgYXQgMHgwMDA0OjB4MTA1Ni4KQXMgdGhlIHNlZ21lbnQgdmFsdWUgb2YgdGhlIGFkZHJlc3MgaXMgb25seSAiNCIsIEkgdGhpbmsgdGhhdCB0aGF0IGlzIG9ubHkgYW4gaW50ZXJuYWwgcHJvZ3JhbSB2YWx1ZS4gQnV0IHRoZSBvZmZzZXQgYWRkcmVzcyByZXZlYWxzIHNvbWV0aGluZyBxdWl0ZSBpbnRlcmVzdGluZzoKT2Zmc2V0IDEwNTYgaXMgX3ZlcnlfIGNsb3NlIHRvIHRoZSByZXR1cm4gYWRkcmVzcyBvZiBGUkVFTElCUkFSWSgpOgoKQ2FsbCBLRVJORUwuOTY6IEZSRUVMSUJSQVJZKDB4MDMxZikgcmV0PTAxY2Y6MTA1YyBkcz0wMWZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4KUHJvdmlkZWQgdGhhdCBzZWdtZW50IDB4MDAwNCBpcyBpbmRlZWQgc2VnbWVudCAweDFjZiwgd2Ugbm93IHdlIGNhbiB1c2UgSURBIChhdmFpbGFibGUgYXQgZnRwOi8vZnRwLnVuaS1rb2Vsbi5kZS9wYy9tc2Rvcy9wcm9ncmFtbWluZy9hc3NlbWJsZXIvaWRhMzVieC56aXApIHRvCmRpc2Fzc2VtYmxlIHRoZSBwYXJ0IHRoYXQgY2F1c2VkIHRoZSBlcnJvci4gV2UganVzdCBoYXZlIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YKdGhlIGNhbGwgdG8gRnJlZUxpYnJhcnkoKS4gU29tZSBsaW5lcyBiZWZvcmUgdGhhdCB0aGUgcnVudGltZSBlcnJvciBvY2N1cnJlZC4KQnV0IGJlIGNhcmVmdWwgISBJbiBzb21lIGNhc2VzIHlvdSBkb24ndCBoYXZlIHRvIGRpc2Fzc2VtYmxlIHRoZSBtYWluIHByb2dyYW0sIGJ1dCBpbnN0ZWFkIHNvbWUgRExMIGNhbGxlZCBieSBpdCBpbiBvcmRlciB0byBmaW5kIHRoZSBjb3JyZWN0IHBsYWNlIHdoZXJlIHRoZSBydW50aW1lIGVycm9yIG9jY3VycmVkLiBUaGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgdGhlIG9yaWdpbiBvZiB0aGUgc2VnbWVudCB2YWx1ZSAoaW4gdGhpcyBjYXNlIDB4MWNmKS4KCmMpIElmIHlvdSBoYXZlIGNyZWF0ZWQgYSByZWxheSBmaWxlIG9mIHNvbWUgY3Jhc2hpbmcgcHJvZ3JhbSBhbmQgd2FudCB0byBzZXQgYQpicmVha3BvaW50IGF0IGEgY2VydGFpbiBsb2NhdGlvbiB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSBhcyB0aGUKcHJvZ3JhbSBsb2FkcyB0aGUgYnJlYWtwb2ludCdzIHNlZ21lbnQgZHVyaW5nIGV4ZWN1dGlvbiwKeW91IG1heSBzZXQgYSBicmVha3BvaW50IHRvIEdldFZlcnNpb24xNi8zMiBhcyB0aG9zZSBmdW5jdGlvbnMgYXJlIGNhbGxlZAp2ZXJ5IG9mdGVuLgpUaGVuIGRvIGEgImMiIHVudGlsIHlvdSBhcmUgYWJsZSB0byBzZXQgdGhpcyBicmVha3BvaW50IHdpdGhvdXQgZXJyb3IgbWVzc2FnZS4KCmQpIFNvbWUgdXNlZnVsIHByb2dyYW1zOgpJREE6IGZ0cDovL2Z0cC51bmkta29lbG4uZGUvcGMvbXNkb3MvcHJvZ3JhbW1pbmcvYXNzZW1ibGVyL2lkYTM1YnguemlwCipWZXJ5KiBnb29kIERPUyBkaXNhc3NlbWJsZXIgISBJdCdzIGJhZGx5IG5lZWRlZCBmb3IgZGVidWdnaW5nIFdpbmUgc29tZXRpbWVzLgoKWFJBWTogZnRwOi8vZnRwLnRoLWRhcm1zdGFkdC5kZS9wdWIvbWFjaGluZXMvbXMtZG9zL1NpbVRlbC9tc2Rvcy9hc211dGlsL3hyYXkxNS56aXAKVHJhY2VzIERPUyBjYWxscyAoSW50IDIxaCwgRFBNSSwgLi4uKS4gVXNlIGl0IHdpdGggV2luZG93cyB0byBjb3JyZWN0CmZpbGUgbWFuYWdlbWVudCBwcm9ibGVtcyBldGMuCgpwZWR1bXA6IGh0dHA6Ly9vYWsub2FrbGFuZC5lZHUvcHViL3NpbXRlbG5ldC93aW45NS9wcm9nL3BlZHVtcC56aXAKRHVtcHMgdGhlIGltcG9ydHMgYW5kIGV4cG9ydHMgb2YgYSBQRSAoUG9ydGFibGUgRXhlY3V0YWJsZSkgRExMLgoKClNvbWUgYmFzaWMgZGVidWdnZXIgdXNhZ2VzOgo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkFmdGVyIHN0YXJ0aW5nIHlvdSBwcm9ncmFtIHdpdGgKICB3aW5lIC1kZWJ1ZyBteXByb2cuZXhlCnRoZSBwcm9ncmFtIGxvYWRzIGFuZCB5b3UgZ2V0IGEgcHJvbXB0IGF0IHRoZSBwcm9ncmFtIHN0YXJ0aW5nIHBvaW50LgpUaGVuIHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzOgogIGIgUm91dGluZU5hbWUgICAgICAoYnkgb3V0aW5lIG5hbWUpIE9SCiAgYiAqMHg4MTI1NzUgICAgICAgIChieSBhZGRyZXNzKQpUaGVuIHlvdSBoaXQgJ2MnIChjb250aW51ZSkgdG8gcnVuIHRoZSBwcm9ncmFtLiBJdCBzdG9wcyBhdAp0aGUgYnJlYWtwb2ludC4gWW91IGNhbiB0eXBlCiAgc3RlcCAgICAgICAgICAgICAgICh0byBzdGVwIG9uZSBsaW5lKSBPUgogIHN0ZXBpICAgICAgICAgICAgICAodG8gc3RlcCBvbmUgbWFjaGluZSBpbnN0cnVjdGlvbiBhdCBhIHRpbWU7CiAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBpdCBoZWxwcyB0byBrbm93IHRoZSBiYXNpYyAzODYKICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIHNldCkKICBpbmZvIHJlZyAgICAgICAgICAgKHRvIHNlZSByZWdpc3RlcnMpCiAgaW5mbyBzdGFjayAgICAgICAgICh0byBzZWUgaGV4IHZhbHVlcyBpbiB0aGUgc3RhY2spCiAgaW5mbyBsb2NhbCAgICAgICAgICh0byBzZWUgbG9jYWwgdmFyaWFibGVzKQogIGxpc3QgPGxpbmUgbnVtYmVyPiAodG8gbGlzdCBzb3VyY2UgY29kZSkKICB4IDx2YXJpYWJsZSBuYW1lPiAgKHRvIGV4YW1pbmUgYSB2YXJpYWJsZTsgb25seSB3b3JrcyBpZiBjb2RlCiAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb24pCiAgeCAweDQyNjk5NzggICAgICAgICh0byBleGFtaW5lIGEgbWVtb3J5IGxvY2F0aW9uKQogID8gICAgICAgICAgICAgICAgICAoaGVscCkKICBxICAgICAgICAgICAgICAgICAgKHF1aXQpCkJ5IGhpdHRpbmcgRW50ZXIsIHlvdSByZXBlYXQgdGhlIGxhc3QgY29tbWFuZC4K