CkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjUgYW5kIDIuMS40CgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBQYXJzaW5nIHRoZSAvQ0lERm9udE5hbWUgZmllbGQgbm93IHJlbW92ZXMgdGhlIGxlYWRpbmcgc2xhc2ggdG8KICAgICAgYmUgaW4gc3luYyB3aXRoIG90aGVyIGZvbnQgZHJpdmVycy4KCiAgICAtIGd6aXAgc3VwcG9ydCB3YXMgYnVnZ3kuIFNvbWUgZm9udHMgY291bGQgbm90IGJlIHJlYWQuCgogICAgLSBGb250cyB3aGljaCBoYXZlIG5lc3RlZCBzdWJnbHlwaHMgbW9yZSB0aGFuIG9uZSBsZXZlbCBkZWVwIG5vCiAgICAgIGxvbmdlciBjYXVzZSBhIHNlZ2ZhdWx0LgoKICAgIC0gQ3JlYXRpb24gb2Ygc3ludGhldGljIGNtYXBzIGZvciBmb250cyBpbiBDRkYgZm9ybWF0IHdhcyBicm9rZW4KICAgICAgcGFydGlhbGx5LgoKICAgIC0gTnVtZXJpYyBmb250IGRpY3Rpb25hcnkgZW50cmllcyBmb3Igc3ludGhldGljIGZvbnRzIGFyZSBubyBsb25nZXIKICAgICAgb3ZlcndyaXR0ZW4uCgogICAgLSBUaGUgZm9udCBtYXRyaXggd2Fzbid0IGFwcGxpZWQgdG8gdGhlIGFkdmFuY2Ugd2lkdGggZm9yIFR5cGUxLCBDSUQsCiAgICAgIGFuZCBDRkYgZm9udHMuIFRoaXMgY2F1c2VkIHByb2JsZW0gd2hlbiBsb2FkaW5nIGNlcnRhaW4gc3ludGhldGljCiAgICAgIFR5cGUgMSBmb250cyBsaWtlICJIZWx2ZXRpY2EgTmFycm93IgoKICAgIC0gVGhlIHRlc3QgZm9yIHRoZSBjaGFyc2V0IHJlZ2lzdHJ5IGluIEJERiBhbmQgUENGIGZvbnRzIGlzIG5vdwogICAgICBjYXNlLWluc2Vuc2l0aXZlLgoKICAgIC0gRlRfVmVjdG9yX1JvdGF0ZSByb3RhdGluZyBzb21ldGltZXMgcmV0dXJuZWQgc3RyYW5nZSB2YWx1ZXMgZHVlIHRvCiAgICAgIHJvdW5kaW5nIGVycm9ycy4KCiAgICAtIFRoZSBQQ0YgZHJpdmVyIG5vdyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiBnbHlwaHMgKGluY2x1ZGluZwogICAgICBhbiBhcnRpZmljaWFsIGBub3RkZWYnIGdseXBoIGF0IGluZGV4IDApLgoKICAgIC0gRnJlZVR5cGUgbm93IHN1cHBvcnRzIGJ1Z2d5IENNYXBzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gbWFueSBDSksKICAgICAgZm9udHMgZnJvbSBEeW5hbGFiLgoKICAgIC0gT3BlbmluZyBhbiBpbnZhbGlkIGZvbnQgb24gYSBNYWMgY2F1c2VkIGEgc2VnZmF1bHQgZHVlIHRvCiAgICAgIGRvdWJsZS1mcmVlaW5nIG1lbW9yeS4KCiAgICAtIEJERiBmb250cyB3aXRoIG1vcmUgdGhhbiAzMjc2OCBnbHlwaHMgd2VyZW4ndCBzdXBwb3J0ZWQgcHJvcGVybHkuCgoKICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKCiAgICAtIEFjY2Vzc2luZyBiaXRtYXAgZm9udCBmb3JtYXRzIGhhcyBiZWVuIHN5bmNocm9uaXplZC4gIFRvIGRvIHRoYXQKICAgICAgdGhlIEZUX0JpdG1hcF9TaXplIHN0cnVjdHVyZSBoYXMgYmVlbiBleHRlbmRlZCB0byBjb250YWluIG5ldwogICAgICBmaWVsZHMgYHNpemUnLCBgeF9wcGVtJywgYW5kIGB5X3BwZW0nLgoKICAgIC0gVGhlIEZOVCBkcml2ZXIgbm93IHJldHVybnMgbXVsdGlwbGUgZmFjZXMsIG5vdCBtdWx0aXBsZSBzdHJpa2VzLgoKICAgIC0gVGhlIGBwc25hbWVzJyBtb2R1bGUgaGFzIGJlZW4gdXBkYXRlZCB0byB0aGUgQWRvYmUgR2x5cGggTGlzdAogICAgICB2ZXJzaW9uIDIuMC4KCiAgICAtIFRoZSBgcHNuYW1lcycgbW9kdWxlIG5vdyB1bmRlcnN0YW5kcyBgdVhYWFhbWFtYXV0nIGdseXBoIG5hbWVzLgoKICAgIC0gVGhlIGFsZ29yaXRobSBmb3IgZ3Vlc3NpbmcgdGhlIGZvbnQgc3R5bGUgaGFzIGJlZW4gaW1wcm92ZWQuCgogICAgLSBGb3IgZm9udHMgaW4gc2ZudCBmb3JtYXQsIHJvb3QtPmhlaWdodCBpcyBubyBsb25nZXIgaW5jcmVhc2VkIGlmCiAgICAgIHRoZSBsaW5lIGdhcCBpcyB6ZXJvLiAgVGhlcmUgZXhpc3QgZm9udHMgKGNvbnRhaW5pbmcgZS5nLiBmb3JtCiAgICAgIGRyYXdpbmcgY2hhcmFjdGVycykgd2hpY2ggaW50ZW50aW9uYWxseSBoYXZlIGEgemVybyBsaW5lIGdhcCB2YWx1ZS4KCiAgICAtIGZ0X2dseXBoX2Jib3hfeHh4IGZsYWdzIGFyZSBub3cgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YKICAgICAgRlRfR0xZUEhfQkJPWF9YWFguCgogICAgLSBmdF9tb2R1bGVfeHh4IGZsYWdzIGFyZSBub3cgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgRlRfTU9EVUxFX1hYWC4KCiAgICAtIEZUX0VOQ09ESU5HX01TX3tTSklTLEdCMjMxMixCSUc1LFdBTlNVTkcsSk9IQUJ9IGFyZSBub3cgZGVwcmVjYXRlZAogICAgICBpbiBmYXZvdXIgb2YgRlRfRU5DT0RJTkdfe1NKSVMsR0IyMzEyLEdJQjUsV0FOU09ORyxKT0hBQn0gLS0gdGhvc2UKICAgICAgZW5jb2RpbmdzIGFyZSBub3Qgc3BlY2lmaWMgdG8gTWljcm9zb2Z0LgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgYXV0b2hpbnRlciBoYXMgYmVlbiBmdXJ0aGVyIGltcHJvdmVkOyBmb3IgZXhhbXBsZSwgYG0nIGdseXBocwogICAgICBub3cgcmV0YWluIGl0cyB2ZXJ0aWNhbCBzeW1tZXRyeS4KCiAgICAtIFBhcnRpYWwgc3VwcG9ydCBvZiBNYWMgZm9udHMgb24gbm9uLU1hYyBwbGF0Zm9ybXMuCgogICAgLSBgbWFrZSByZWZkb2MnIChhZnRlciBmaXJzdCBgbWFrZScpIGJ1aWxkcyB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLgogICAgICBZb3UgbmVlZCBQeXRob24gZm9yIHRoaXMuCgogICAgLSBUaGUgbWFrZSBidWlsZCBzeXN0ZW0gc2hvdWxkIG5vdyB3b3JrIG1vcmUgcmVsaWFibHkgb24gRE9TLWxpa2UKICAgICAgcGxhdGZvcm1zLgoKICAgIC0gU3VwcG9ydCBmb3IgRU1YIGdjYyBhbmQgV2F0c29uIEMvQysrIGNvbXBpbGVycyBvbiBNUy1ET1MgaGFzIGJlZW4KICAgICAgYWRkZWQuCgogICAgLSBCZXR0ZXIgVk1TIGJ1aWxkIHN1cHBvcnQuCgogICAgLSBTdXBwb3J0IGZvciB0aGUgcGtnLWNvbmZpZyBwYWNrYWdlIGJ5IHByb3ZpZGluZyBhIGBmcmVldHlwZS5wYycKICAgICAgZmlsZS4KCiAgICAtIE5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1vbGQtbWFjLWZvbnRzIGZvciBEYXJ3aW4uCgogICAgLSBTb21lIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gcmVuYW1lZCAobWFpbmx5IHRvIGZpdCBpbnRvIHRoZSA4LjMKICAgICAgbmFtaW5nIHNjaGVtZSkuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS40IGFuZCAyLjEuMwoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBVcGRhdGVkIHRvIG5ld2VzdCBsaWJ0b29sIHZlcnNpb24sIGZpeGluZyBidWlsZCBwcm9ibGVtcyBvbiB2YXJpb3VzCiAgICAgIHBsYXRmb3Jtcy4KCiAgICAtIEEgZml4IGluIHRoZSBHemlwIHN0cmVhbSByZWFkZXI6IEl0IGNvdWxkbid0IHJlYWQgY2VydGFpbiAuZ3ogZmlsZXMKICAgICAgcHJvcGVybHkgZHVlIHRvIGEgc21hbGwgdHlwby4gIEluIGNlcnRhaW4gY2FzZXMsIEZyZWVUeXBlIGNvdWxkIGFsc28KICAgICAgbG9vcCBlbmRsZXNzbHkgd2hlbiB0cnlpbmcgdG8gbG9hZCB0aW55IGd6aXBwZWQgZmlsZXMuCgogICAgLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdHJpZXMgdG8gdXNlIHRoZSBzeXN0ZW0td2lkZSB6bGliIHdoZW4KICAgICAgaXQgZmluZHMgb25lIChpbnN0ZWFkIG9mIHRoZSBjb3B5IGZvdW5kIGluIHNyYy9nemlwKS4gIEFuZAogICAgICAiZnJlZXR5cGUtY29uZmlnIiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJldHVybiByZWxldmFudCBmbGFncyBpbiB0aGlzCiAgICAgIGNhc2Ugd2hlbiBpbnZva2VkIHdpdGggIi0tbGlicyIgKGUuZy4gIi1semxpYiIpLgoKICAgIC0gQ2VydGFpbiBmb250cyBjb3VsZG4ndCBiZSBsb2FkZWQgYnkgMi4xLjMgYmVjYXVzZSB0aGV5IGxhY2tlZCBhCiAgICAgIFVuaWNvZGUgY2hhcm1hcCAoZS5nLiBTWU1CT0wuVFRGKS4gIEZyZWVUeXBlIGVycm9uZW91c2x5IHJlamVjdGVkCiAgICAgIHRoZW0uCgogICAgLSBUaGUgQ0ZGIGxvYWRlciB3YXMgbW9kaWZpZWQgdG8gYWNjZXB0IGZvbnRzIHdoaWNoIG9ubHkgY29udGFpbiBhCiAgICAgIHN1YnNldCBvZiB0aGVpciByZWZlcmVuY2UgY2hhcnNldC4gIFRoaXMgcHJldmVudGVkIHRoZSBjb3JyZWN0IHVzZQogICAgICBvZiBQREYtZW1iZWRkZWQgZm9udHMuCgogICAgLSBUaGUgbG9naWMgdG8gZGV0ZWN0IFVuaWNvZGUgY2hhcm1hcHMgaGFzIGJlZW4gbW9kaWZpZWQuICBUaGlzIGlzCiAgICAgIHJlcXVpcmVkIHRvIHN1cHBvcnQgZm9udHMgd2hpY2ggaW5jbHVkZSBib3RoIDE2LWJpdCBhbmQgMzItYml0CiAgICAgIGNoYXJtYXBzIChsaWtlIHZlcnkgcmVjZW50IGFzaWFuIG9uZXMpIHVzaW5nIHRoZSBuZXcgMTAgYW5kIDEyIFNGTlQKICAgICAgZm9ybWF0cy4KCiAgICAtIFRoZSBUcnVlVHlwZSBsb2FkZXIgbm93IGxpbWl0cyB0aGUgZGVwdGggb2YgY29tcG9zaXRlIGdseXBocy4gIFRoaXMgaXMKICAgICAgbmVjZXNzYXJ5IHRvIHByZXZlbnQgYnJva2VuIGZvbnRzIHRvIGJyZWFrIHRoZSBlbmdpbmUgYnkgYmxvd2luZyB0aGUKICAgICAgc3RhY2sgd2l0aCByZWN1cnNpdmUgZ2x5cGggZGVmaW5pdGlvbnMuCgogICAgLSBUaGUgQ01hcCBjYWNoZSBpcyBub3cgY2FwYWJsZSBvZiBtYW5hZ2luZyBVQ1MtNCBjaGFyYWN0ZXIgY29kZXMgdGhhdAogICAgICBhcmUgbWFwcGVkIHRocm91Z2ggZXh0ZW5kZWQgY2hhcm1hcHMgaW4gcmVjZW50IFRydWVUeXBlL09wZW5UeXBlCiAgICAgIGZvbnRzLgoKICAgIC0gVGhlIGNhY2hlIHN1Yi1zeXN0ZW0gbm93IHByb3Blcmx5IG1hbmFnZXMgb3V0LW9mLW1lbW9yeSBjb25kaXRpb25zCiAgICAgIGluc3RlYWQgb2YgYmxpbmRseSByZXBvcnRpbmcgdGhlbSB0byB0aGUgY2FsbGVyLiAgVGhpcyBtZWFucyB0aGF0IGl0CiAgICAgIHdpbGwgdHJ5IHRvIGVtcHR5IHRoZSBjYWNoZSBiZWZvcmUgcmVzdGFydGluZyBpdHMgYWxsb2NhdGlvbnMgdG8gc2VlCiAgICAgIGlmIHRoYXQgY2FuIGhlbHAuCgogICAgLSBUaGUgUEZSIGRyaXZlciBkaWRuJ3QgcmV0dXJuIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBlbWJlZGRlZCBiaXRtYXBzCiAgICAgIHByb3Blcmx5LgoKICAgIC0gVGhlcmUgd2FzIGEgbmFzdHkgbWVtb3J5IGxlYWsgd2hlbiB1c2luZyBlbWJlZGRlZCBiaXRtYXBzIGluIGNlcnRhaW4KICAgICAgZm9udCBmb3JtYXRzLgoKCiAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCgogICAgLSBEYXZpZCBDaGVzdGVyIGNvbnRyaWJ1dGVkIHNvbWUgZW5oYW5jZW1lbnRzIHRvIHRoZSBhdXRvLWhpbnRlciB0aGF0CiAgICAgIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHF1YWxpdHkgb2YgaXRzIG91dHB1dC4gIFRoZSBQb3N0c2NyaXB0CiAgICAgIGhpbnRlciB3YXMgYWxzbyBpbXByb3ZlZCBpbiBzZXZlcmFsIHdheXMuCgogICAgLSBUaGUgRlRfUkVOREVSX01PREVfTElHSFQgcmVuZGVyIG1vZGUgd2FzIGltcGxlbWVudGVkLgoKICAgIC0gQSBuZXcgQVBJIGZ1bmN0aW9uIGNhbGxlZCBgRlRfR2V0X0JERl9Qcm9wZXJ0eScgaGFzIGJlZW4gYWRkZWQgdG8KICAgICAgRlRfQkRGX0ggdG8gcmV0cmlldmUgQkRGIHByb3BlcnRpZXMgZnJvbSBCREYgX2FuZF8gUENGIGZvbnQgZmlsZXMuCiAgICAgIFRISVMgSVMgU1RJTEwgRVhQRVJJTUVOVEFMLCBzaW5jZSBpdCBoYXNuJ3QgYmVlbiBwcm9wZXJseSB0ZXN0ZWQgeWV0LgoKICAgIC0gQSBXaW5kb3dzIEZOVCBzcGVjaWZpYyBBUEkgaGFzIGJlZW4gYWRkZWQsIG1vc3RseSB0byBhY2Nlc3MgZm9udAogICAgICBoZWFkZXJzLiAgVGhpcyBpcyB1c2VkIGJ5IFdpbmUuCgogICAgLSBUcnVlVHlwZSB0YWJsZXMgd2l0aG91dCBhbiAiaG10eCIgdGFibGUgYXJlIG5vdyB0b2xlcmF0ZWQgd2hlbiBhbgogICAgICBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgaXMgdXNlZC4gIFRoaXMgaGFwcGVucyBmb3IgY2VydGFpbiBUeXBlNDIgZm9udHMKICAgICAgcGFzc2VkIGZyb20gR2hvc3RzY3JpcHQgdG8gRnJlZVR5cGUuCgogICAgLSBUaGUgUEZSIGZvbnQgZHJpdmVyIGlzIG5vdyBjYXBhYmxlIG9mIHJldHVybmluZyB0aGUgZm9udCBmYW1pbHkgYW5kCiAgICAgIHN0eWxlIG5hbWVzIHdoZW4gdGhleSBhcmUgYXZhaWxhYmxlIChpbnN0ZWFkIG9mIHRoZSBzb2xlICJGb250SUQiKS4KICAgICAgVGhpcyBpcyBwZXJmb3JtZWQgYnkgcGFyc2luZyBhbiAqdW5kb2N1bWVudGVkKiBwb3J0aW9uIG9mIHRoZSBmb250CiAgICAgIGZpbGUhCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBwYXRoIHN0cm9rZXIgaW4gRlRfU1RST0tFUl9IIGhhcyBlbnRlcmVkIGJldGEgc3RhZ2UuICBJdCBub3cgd29ya3MKICAgICAgdmVyeSB3ZWxsLCBidXQgaXRzIGludGVyZmFjZSBtaWdodCBjaGFuZ2UgYSBiaXQgaW4gdGhlIGZ1dHVyZS4gIE1vcmUKICAgICAgb24gdGhpcyBpbiBsYXRlciByZWxlYXNlcy4KCiAgICAtIFRoZSBkb2N1bWVudGF0aW9uIGZvciBGVF9TaXplX01ldHJpY3MgZGlkbid0IGFwcGVhciBwcm9wZXJseSBpbiB0aGUKICAgICAgQVBJIHJlZmVyZW5jZS4KCiAgICAtIFRoZSBmaWxlIGRvY3MvVkVSU0lPTi5ETEwgaGFzIGJlZW4gdXBkYXRlZCB0byBleHBsYWluIHZlcnNpb25pbmcKICAgICAgd2l0aCBGcmVlVHlwZSAoaS5lLiwgY29tcGFyaW5nIHJlbGVhc2UvbGlidG9vbC9zbyBudW1iZXJzLCBhbmQgaG93IHRvCiAgICAgIHVzZSB0aGVtIGluIGF1dG9jb25mIHNjcmlwdHMpLgoKICAgIC0gVGhlIGluc3RhbGxhdGlvbiBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNlcmlvdXNseSByZXZhbXBlZC4KICAgICAgRXZlcnl0aGluZyBpcyBub3cgaW4gdGhlICJkb2NzIiBkaXJlY3RvcnkuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS4zIGFuZCAyLjEuMgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBGVF9WZWN0b3JfVHJhbnNmb3JtIGhhZCBiZWVuIGluY29ycmVjdGx5IG1vZGlmaWVkIGluIDIuMS4yLCByZXN1bHRpbmcKICAgICAgaW4gaW5jb3JyZWN0IHRyYW5zZm9ybWF0aW9ucyBiZWluZyBhcHBsaWVkIChmb3IgZXhhbXBsZSwgcm90YXRpb25zCiAgICAgIHdlcmUgcHJvY2Vzc2VkIGluIG9wcG9zaXRlIGFuZ2xlcykuCgogICAgLSBUaGUgZm9ybWF0IDggYW5kIDEyIFRydWVUeXBlIGNoYXJtYXAgZW51bWVyYXRpb24gcm91dGluZXMgaGF2ZSBiZWVuCiAgICAgIGZpeGVkIChGVF9HZXRfTmV4dF9DaGFyIHJldHVybmVkIGludmFsaWQgdmFsdWVzKS4KCiAgICAtIFRoZSBQRlIgZm9udCBkcml2ZXIgcmV0dXJuZWQgaW5jb3JyZWN0IGFkdmFuY2Ugd2lkdGhzIGlmIHRoZSBvdXRsaW5lCiAgICAgIGFuZCBtZXRyaWNzIHJlc29sdXRpb24gZGVmaW5lZCBpbiB0aGUgZm9udCBmaWxlIHdlcmUgZGlmZmVyZW50LgoKICAgIC0gRlRfR2x5cGhfVG9fQml0bWFwIG5vdyByZXR1cm5zIHN1Y2Nlc3NmdWxseSB3aGVuIGNhbGxlZCB3aXRoIGFuCiAgICAgIEZUX0JpdG1hcEdseXBoIGFyZ3VtZW50IChpdCBwcmV2aW91c2x5IHJldHVybmVkIGFuIGVycm9yKS4KCiAgICAtIEEgYnVnIGluIHRoZSBUeXBlIDEgbG9hZGVyIHRoYXQgcHJldmVudGVkIHZhbGlkIGZvbnQgYm91bmRpbmcgYm94ZXMgdG8KICAgICAgYmUgbG9hZGVkIGZyb20gbXVsdGlwbGUgbWFzdGVyIGZvbnRzLgoKICAgIC0gVGhlIFNGTlQgdmFsaWRhdGlvbiBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbi4gIEZyZWVUeXBlIGNhbiBub3cgbG9hZAogICAgICAiYnJva2VuIiBmb250cyB0aGF0IHdlcmUgdXNhYmxlIG9uIFdpbmRvd3MsIGJ1dCBub3Qgd2l0aCBwcmV2aW91cwogICAgICB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4KCiAgICAtIFRoZSBjb21wdXRhdGlvbiBvZiBiZWFyaW5ncyBpbiB0aGUgQkRGIGRyaXZlciBoYXMgYmVlbiBmaXhlZC4KCiAgICAtIFRoZSBQb3N0c2NyaXB0IGhpbnRlciBjcmFzaGVkIHdoZW4gdHJ5aW5nIHRvIGhpbnQgY2VydGFpbiBnbHlwaHMgKG1vcmUKICAgICAgcHJlY2lzZWx5LCB3aGVuIHRyeWluZyB0byBhcHBseSBoaW50cyB0byBhbiBlbXB0eSBnbHlwaCBvdXRsaW5lKS4KCiAgICAtIFRoZSBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgbm93IHN1cHBvcnRzIGNvbXBvc2l0ZXMgaW4gIkFwcGxlIGZvcm1hdCIKICAgICAgKHRoZXkgZGlmZmVyIHNsaWdodGx5IGZyb20gTWljcm9zb2Z0L09wZW5UeXBlIG9uZXMgaW4gdGhlIHdheQogICAgICB0cmFuc2Zvcm1hdGlvbiBvZmZzZXRzIGFyZSBjb21wdXRlZCkuCgogICAgLSBGcmVlVHlwZSB3YXMgdmVyeSBzbG93IGF0IG9wZW5pbmcgY2VydGFpbiBhc2lhbiBDSUQvQ0ZGIGZvbnRzLCBkdWUKICAgICAgdG8gZml4ZWQgaW5jcmVtZW50IGluIGR5bmFtaWMgYXJyYXkgcmUtYWxsb2NhdGlvbnMuICBUaGlzIGhhcyBiZWVuCiAgICAgIGNoYW5nZWQgdG8gZXhwb25lbnRpYWwgYmVoYXZpb3VyIHRvIGdldCBhY2NlcHRhYmxlIHBlcmZvcm1hbmNlLgoKCgogIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwoKICAgIC0gVGhlIFBDRiBkcml2ZXIgbm93IHN1cHBvcnRzIGd6aXAtY29tcHJlc3NlZCBmb250IGZpbGVzIG5hdGl2ZWx5LiAgVGhpcwogICAgICBtZWFucyB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCB0aGVzZSBiaXRtYXAgZm9udHMgdGhhdCBjb21lCiAgICAgIHdpdGggWEZyZWU4NiB3aXRoIEZyZWVUeXBlIChhbmQgbGliWGZ0L2xpYlhmdDIsIGJ5IGV4dGVuc2lvbikuCgogICAgLSBUaGUgYXV0b21hdGljIGFuZCBwb3N0c2NyaXB0IGhpbnRlcnMgaGF2ZSBib3RoIGJlZW4gdXBkYXRlZC4gIFRoaXMKICAgICAgcmVzdWx0cyBpbiBhIHJlbGF0aXZlbHkgaW1wb3J0YW50IGluY3JlYXNlIG9mIHJlbmRlcmluZyBxdWFsaXR5IHNpbmNlCiAgICAgIG1hbnkgbmFzdHkgZGVmYXVsdHMgaGF2ZSBiZWVuIHN1cHJlc3NlZC4gIFBsZWFzZSB2aXNpdCB0aGUgd2ViIHBhZ2U6CgogICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2hpbnRpbmcvc21vb3RoLWhpbnRpbmcuaHRtbAoKICAgICAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKICAgIC0gVGhlICJsb2FkX2ZsYWdzIiBwYXJhbWV0ZXIgb2YgRlRfTG9hZF9HbHlwaCBpcyBub3cgYW4gRlRfSW50MzIKICAgICAgKGluc3RlYWQgb2YganVzdCBiZWluZyBhbiBGVF9JbnQpLiAgVGhpcyBicmVha3Mgc291cmNlIGFuZCBiaW5hcnkKICAgICAgY29tcGF0aWJpbGl0eSBmb3IgMTZiaXQgc3lzdGVtcyBvbmx5LCB3aGlsZSByZXRhaW5pbmcgYm90aCBvZiB0aGVtIGZvcgogICAgICAzMiBhbmQgNjQgYml0IG9uZXMuCgogICAgICBTb21lIG5ldyBmbGFncyBoYXZlIGJlZW4gYWRkZWQgY29uc2VxdWVudGx5OgoKICAgICAgICBGVF9MT0FEX05PX0FVVE9ISU5UICAgOjogRGlzYWJsZSB0aGUgdXNlIG9mIHRoZSBhdXRvLWhpbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnV0IG5vdCBuYXRpdmUgZm9ybWF0IGhpbnRlcnMpLgoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgOjogSGludCBhbmQgcmVuZGVyIGZvciBub3JtYWwgYW50aS1hbGlhc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlzLgoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9NT05PICAgOjogSGludCBhbmQgcmVuZGVyIGZvciAxLWJpdCBkaXNwbGF5cy4KCiAgICAgICAgRlRfTE9BRF9UQVJHRVRfTENEICAgIDo6IEhpbnQgYW5kIHJlbmRlciBmb3IgaG9yaXpvbnRhbCBSR0Igb3IgQkdSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yi1waXhlbCBkaXNwbGF5cyAobGlrZSBMQ0Qgc2NyZWVucykuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRISVMgSVMgU1RJTEwgRVhQRVJJTUVOVEFMIQoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgOjogU2FtZSBhcyBGVF9MT0FEX1RBUkdFVF9MQ0QsIGZvciB2ZXJ0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItcGl4ZWwgZGlzcGxheXMgKGxpa2Ugcm90YXRlZCBMQ0QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucykuICBUSElTIElTIFNUSUxMIEVYUEVSSU1FTlRBTCEKCiAgICAgIEZUX0xPQURfTU9OT0NIUk9NRSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBvbmx5IGFmZmVjdHMgcmVuZGVyaW5nLCBub3QKICAgICAgdGhlIGhpbnRpbmcuCgogICAgICBOb3RlIHRoYXQgdGhlICdmdHZpZXcnIGRlbW8gcHJvZ3JhbSBhdmFpbGFibGUgaW4gdGhlICdmdDJkZW1vcycgcGFja2FnZQogICAgICBoYXMgYmVlbiB1cGRhdGVkIHRvIHN1cHBvcnQgTENELW9wdGltaXplZCBkaXNwbGF5IG9uIG5vbi1wYWxldHRlZAogICAgICBkaXNwbGF5cyAodW5kZXIgV2luMzIgYW5kIFgxMSkuCgogICAgLSBUaGUgUEZSIGRyaXZlciBub3cgc3VwcG9ydHMgZW1iZWRkZWQgYml0bWFwcyAoYWxsIGZvcm1hdHMgc3VwcG9ydGVkKSwKICAgICAgYW5kIHJldHVybnMgY29ycmVjdCBrZXJuaW5nIG1ldHJpY3MgZm9yIGFsbCBnbHlwaHMuCgogICAgLSBUaGUgVHJ1ZVR5cGUgY2hhcm1hcCBsb2FkZXIgbm93IHN1cHBvcnRzIGNlcnRhaW4gImJyb2tlbiIgZm9udHMgdGhhdAogICAgICBsb2FkIHVuZGVyIFdpbmRvd3Mgd2l0aG91dCBwcm9ibGVtcy4KCiAgICAtIFRoZSBjYWNoZSBBUEkgaGFzIGJlZW4gc2xpZ2h0bHkgbW9kaWZpZWQgKGl0J3Mgc3RpbGwgYSBiZXRhISk6CgogICAgICAgLSBUaGUgdHlwZSBGVENfSW1hZ2VEZXNjIGhhcyBiZWVuIHJlbW92ZWQ7IGl0IGlzIG5vdyByZXBsYWNlZCBieQogICAgICAgICBGVENfSW1hZ2VUeXBlUmVjLiAgTm90ZSB0aGF0IG9uZSBvZiBpdHMgZmllbGRzIGlzIGEgYGxvYWRfZmxhZycKICAgICAgICAgcGFyYW1ldGVyIGZvciBGVF9Mb2FkX0dseXBoLgoKICAgICAgIC0gVGhlIGZpZWxkICJudW1fZ3JheXMiIG9mIEZUX1NCaXRSZWMgaGFzIGJlZW4gY2hhbmdlZCB0byAibWF4X2dyYXlzIgogICAgICAgICBpbiBvcmRlciB0byBmaXQgd2l0aGluIGEgc2luZ2xlIGJ5dGUuICBJdHMgbWF4aW11bSB2YWx1ZSBpcyB0aHVzIDI1NQogICAgICAgICAoaW5zdGVhZCBvZiAyNTYgYXMgcHJldmlvdXNseSkuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBERVNURElSIHZhcmlhYmxlIGR1cmluZyAibWFrZSBpbnN0YWxsIi4gIFRoaXMKICAgICAgc2ltcGxpZmllcyBwYWNrYWdpbmcgb2YgRnJlZVR5cGUuCgogICAgLSBJbmNsdWRlZCBtb2RpZmllZCBjb3BpZXMgb2YgdGhlIFpMaWIgc291cmNlcyBpbiAnc3JjL2d6aXAnIGluIG9yZGVyIHRvCiAgICAgIHN1cHBvcnQgZ3ppcC1jb21wcmVzc2VkIFBDRiBmb250cy4gIFdlIGRvIG5vdCB1c2UgdGhlIHN5c3RlbS1wcm92aWRlZAogICAgICB6bGliIGZvciBub3csIHRob3VnaCB0aGlzIGlzIGEgcHJvYmFibGUgZW5oYW5jZW1lbnQgZm9yIGZ1dHVyZQogICAgICByZWxlYXNlcy4KCiAgICAtIFRoZSBEb2NNYWtlciB0b29sIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG9uLWxpbmUgQVBJIHJlZmVyZW5jZSBoYXMgYmVlbgogICAgICBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIEl0IGlzIG5vdyBsb2NhdGVkIGluCiAgICAgICJzcmMvdG9vbHMvZG9jbWFrZXIvZG9jbWFrZXIucHkiLiAgRmVhdHVyZXM6CgogICAgICAgIC0gYmV0dGVyIGNyb3NzLXJlZmVyZW5jZWQgb3V0cHV0CiAgICAgICAgLSBtb3JlIHBvbGlzaGVkIG91dHB1dAogICAgICAgIC0gdXNlcyBQeXRob24gcmVndWxhciBleHByZXNzaW9ucyAodGhvdWdoIGl0IGRpZG4ndCBzcGVlZCB0aGUKICAgICAgICAgIHByb2dyYW0pCiAgICAgICAgLSBtdWNoIG1vcmUgbW9kdWxhciBzdHJ1Y3R1cmUsIHdoaWNoIGFsbG93cyBmb3IgZGlmZmVyZW50ICJiYWNrZW5kcyIKICAgICAgICAgIGluIG9yZGVyIHRvIGdlbmVyYXRlIEhUTUwsIFhNTCwgb3Igd2hhdGV2ZXIgZm9ybWF0LgoKICAgICAgT25lIGNhbiByZWdlbmVyYXRlIHRoZSBBUEkgcmVmZXJlbmNlIGJ5IGNhbGxpbmc6CgogICAgICAgICBweXRob24gc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IFwKICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiBcCiAgICAgICAgICAgICAgICAtLXRpdGxlPUZyZWVUeXBlLTIuMS4zIFwKICAgICAgICAgICAgICAgIC0tb3V0cHV0PTxvdXRwdXRkaXJlY3Rvcnk+CiAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlLyouaCBcCiAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy8qLmggXAogICAgICAgICAgICAgICAgaW5jbHVkZS9mcmVldHlwZS9jYWNoZS8qLmgKCiAgICAtIEEgbmV3LCBleHBlcmltZW50YWwsIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGZvbnQgbG9hZGluZyAoaS5lLiwKICAgICAgbG9hZGluZyBvZiBmb250cyB3aGVyZSB0aGUgZ2x5cGhzIGFyZSBub3QgaW4gdGhlIGZvbnQgZmlsZSBpdHNlbGYsIGJ1dAogICAgICBwcm92aWRlZCBieSBhbiBleHRlcm5hbCBjb21wb25lbnQsIGxpa2UgYSBQb3N0c2NyaXB0IGludGVycHJldGVyKSBoYXMKICAgICAgYmVlbiBhZGRlZCBieSBHcmFoYW0gQXNoZXIuICBUaGlzIGlzIHN0aWxsIHdvcmsgaW4gcHJvZ3Jlc3MsIGhvd2V2ZXIuCgogICAgLSBBIG5ldywgRVhQRVJJTUVOVEFMLCBwYXRoIHN0cm9rZXIgaGFzIGJlZW4gYWRkZWQuICBJdCBkb2Vzbid0IHN1ZmZlcgogICAgICBmcm9tIHNldmVyZSByb3VuZGluZyBlcnJvcnMgYW5kIHRyZWF0IGJlemllciBhcmNzIGRpcmVjdGx5LiAgU3RpbGwKICAgICAgd29yayBpbiBwcm9ncmVzcyAoaS5lLiBub3QgcGFydCBvZiB0aGUgb2ZmaWNpYWwgQVBJKS4gIFNlZSB0aGUgZmlsZQogICAgICA8ZnJlZXR5cGUvZnRzdHJva2VyLmg+IGZvciBzb21lIG9mIHRoZSBkZXRhaWxzLgoKICAgIC0gVGhlIG1hc3NpdmUgcmUtZm9ybWF0dGluZyBvZiBzb3VyY2VzIGFuZCBpbnRlcm5hbCByZS1kZXNpZ24gaXMgc3RpbGwKICAgICAgdW5kZXItd2F5LiAgTWFueSBpbnRlcm5hbCBmdW5jdGlvbnMsIGNvbnN0YW50cywgYW5kIHR5cGVzIGhhdmUgYmVlbgogICAgICByZW5hbWVkLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMiBhbmQgMi4xLjEKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gTWFueSBmb250IGRyaXZlcnMgZGlkbid0IHNlbGVjdCBhIFVuaWNvZGUgY2hhcm1hcCBieSBkZWZhdWx0IHdoZW4KICAgICAgYSBuZXcgZmFjZSB3YXMgb3BlbmVkICh3aXRoIHRoZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9DTUFQUyBvcHRpb25zCiAgICAgIGVuYWJsZWQpLCBjYXVzaW5nIG1hbnkgYXBwbGljYXRpb25zIHRvIG5vdCBiZSBhYmxlIHRvIGRpc3BsYXkgdGV4dAogICAgICBjb3JyZWN0bHkgd2l0aCB0aGUgMi4xLnggcmVsZWFzZXMuCgogICAgLSBUaGUgUEZSIGRyaXZlciBoYWQgYSBidWcgaW4gaXRzIGNvbXBvc2l0ZSBsb2FkaW5nIGNvZGUgdGhhdCBwcm9kdWNlcwogICAgICBpbmNvcnJlY3RseSBwbGFjZWQgYWNjZW50cyB3aXRoIG1hbnkgZm9udHMuCgogICAgLSBUaGUgVHlwZTQyIGRyaXZlciBjcmFzaGVkIHNvbWV0aW1lcyBkdWUgdG8gYSBuYXN0eSBidWcuCgogICAgLSBUaGUgVHlwZSAxIGN1c3RvbSBlbmNvZGluZyBjaGFybWFwIGRpZG4ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlCiAgICAgIGZpcnN0IGdseXBoIGluZGV4IHdhc24ndCAwLgoKICAgIC0gQSBzZXJpb3VzIHR5cG8gaW4gdGhlIFRydWVUeXBlIGNvbXBvc2l0ZSBsb2FkZXIgcHJvZHVjZWQgaW5jb3JyZWN0bHkKICAgICAgcGxhY2VkIGdseXBocyBpbiBmb250cyBsaWtlICJXaW5nZGluZ3MiIGFuZCBhIGZldyBvdGhlcnMuCgoKICBJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gVGhlIFdpbjMyIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGUKICAgICAgUEZSIGRyaXZlciBhcyB3ZWxsLgoKICAgIC0gImZyZWV0eXBlLm00IiBpcyBub3cgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgYnkgIm1ha2UgaW5zdGFsbCIgb24gVW5peAogICAgICBzeXN0ZW1zLgoKICAgIC0gVGhlIGZ1bmN0aW9uIEZUX0dldF9QU19Gb250X0luZm8gbm93IHdvcmtzIHdpdGggQ0lEIGFuZCBUeXBlNDIgZm9udHMKICAgICAgYXMgd2VsbC4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjEgYW5kIDIuMS4wCgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSBgdmVyc2lvbl9pbmZvJyByZXR1cm5lZCBieSBgZnJlZXR5cGUtY29uZmlnJyBpbiAyLjEuMCByZXR1cm5lZCBhbgogICAgICBpbnZhbGlkIHZhbHVlLiBJdCBub3cgcmV0dXJucyA5OjE6MyAoMi4wLjkgcmV0dXJuZWQgOTowOjMpLgoKICAgIC0gVmVyc2lvbiAyLjEuMCBjb3VsZG4ndCBiZSBsaW5rZWQgYWdhaW5zdCBhcHBsaWNhdGlvbnMgb24gV2luMzIgYW5kCiAgICAgIEFtaWdhIHN5c3RlbXMgZHVlIHRvIGEgbmV3IGRlYnVnIGZ1bmN0aW9uIHRoYXQgd2Fzbid0IHByb3Blcmx5CiAgICAgIHByb3BhZ2F0ZWQgdG8gdGhlIHN5c3RlbS1zcGVjaWZpYyBkaXJlY3RvcnkgaW4gYGJ1aWxkcycuCgogICAgLSBWYXJpb3VzIE1hY09TIGFuZCBNYWMgT1MgWCBzcGVjaWZpYyBmaXhlcy4KCiAgICAtIEZpeGVkIGEgYnVnIGluIHRoZSBUcnVlVHlwZSBjaGFybWFwIHZhbGlkYXRpb24gcm91dGluZXMgdGhhdCBtYWRlCiAgICAgIHZlcnNpb24gMi4xLjAgdG9vIHJlc3RyaWN0aXZlIC0tIG1hbnkgcG9wdWxhciBmb250cyBoYXZlIGJlZW4KICAgICAgcmVqZWN0ZWQuCgogICAgLSBUaGVyZSB3YXMgc3RpbGwgYSB2ZXJ5IHNtYWxsIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbW9ub2Nocm9tZSBnbHlwaAogICAgICBiaXRtYXBzIHByb2R1Y2VkIGJ5IEZyZWVUeXBlIDEueCBhbmQgRnJlZVR5cGUgMi54IHdpdGggdGhlIGJ5dGVjb2RlCiAgICAgIGludGVycHJldGVyIGVuYWJsZWQuICBUaGlzIHdhcyBjYXVzZWQgYnkgYW4gaW52YWxpZCBmbGFnIHNldHRpbmcgaW4KICAgICAgdGhlIFRydWVUeXBlIGdseXBoIGxvYWRlciwgbWFraW5nIHRoZSByYXN0ZXJpemVyIGNoYW5nZSBpdHMgZHJvcC1vdXQKICAgICAgY29udHJvbCBtb2RlLiAgTm93IHRoZXJlc3VsdHMgc2hvdWxkIF9yZWFsbHlfIGJlIGNvbXBsZXRlbHkgaWRlbnRpY2FsLgoKICAgIC0gVGhlIFRydWVUeXBlIG5hbWUgdGFibGUgbG9hZGVyIGhhcyBiZWVuIGltcHJvdmVkIHRvIHN1cHBvcnQgbWFueQogICAgICBwb3B1bGFyIHRob3VnaCBidWdneSBBc2lhbiBmb250cy4gIEl0IG5vdyBpZ25vcmVzIGVtcHR5IG5hbWUgZW50cmllcywKICAgICAgaW52YWxpZCBwb2ludGVyIG9mZnNldHMgYW5kIGEgZmV3IG90aGVyIGluY29ycmVjdCBzdWJ0bGV0aWVzLgogICAgICBNb3Jlb3ZlciwgbmFtZSBzdHJpbmdzIGFyZSBub3cgbG9hZGVkIG9uIGRlbWFuZCwgd2hpY2ggcmVkdWNlcyB0aGUKICAgICAgbWVtb3J5IGxvYWQgb2YgbWFueSBmYWNlcyAoZS5nLiB0aGUgQVJJQUwuVFRGIGZvbnQgZmlsZSBjb250YWlucyBhCiAgICAgIDEwa0J5dGUgbmFtZSB0YWJsZSB3aXRoIDcwIG5hbWVzKS4KCiAgICAtIEZpeGVkIGEgYnVnIGluIHRoZSBQb3N0c2NyaXB0IGhpbnRlciB0aGF0IHByZXZlbnRlZCBmYW1pbHkgYmx1ZXMKICAgICAgc3Vic3RpdHV0aW9uIHRvIGhhcHBlbiBjb3JyZWN0bHkuCgoKICBJSS4gTkVXIEZFQVRVUkVTCgogICAgLSBUaHJlZSBuZXcgZm9udCBkcml2ZXJzIGluIHRoaXMgcmVsZWFzZToKCiAgICAgICogQSBCREYgZm9udCBkcml2ZXIsIGNvbnRyaWJ1dGVkIGJ5IEZyYW5jbyBaYXBwYSBOYXJkZWxsaSwgaGVhdmlseQogICAgICAgIG1vZGlmaWVkIGJ5IFdlcm5lciBMZW1iZXJnLiAgSXQgYWxzbyBzdXBwb3J0cyBhbnRpLWFsaWFzZWQgYml0bWFwcwogICAgICAgICh1c2luZyBhIHNsaWdodGx5IGV4dGVuZGVkIEJERiBmb3JtYXQpLgoKICAgICAgKiBBIFR5cGU0MiBmb250IGRyaXZlciwgY29udHJpYnV0ZWQgYnkgUm9iZXJ0byBBbGFtZWRhLiAgSXQgaXMKICAgICAgICBzdGlsbCBleHBlcmltZW50YWwgYnV0IHNlZW1zIHRvIHdvcmsgcmVsYXRpdmVseSB3ZWxsLgoKICAgICAgKiBBIFBGUiBmb250IGRyaXZlciwgY29udHJpYnV0ZWQgYnkgRGF2aWQgVHVybmVyIGhpbXNlbGYuICBJdCBkb2Vzbid0CiAgICAgICAgc3VwcG9ydCBQRlIgaGludGluZyAtLSBub3RlIHRoYXQgQml0U3RyZWFtIGhhcyBhdCBsZWFzdCB0d28gcGF0ZW50cwogICAgICAgIG9uIHRoaXMgZm9ybWF0IQoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgY2FjaGUgc3ViLXN5c3RlbSBoYXMgYmVlbiBvcHRpbWl6ZWQgaW4gaW1wb3J0YW50IHdheXMuICBDYWNoZSBoaXRzCiAgICAgIGFyZSBub3cgc2lnbmlmaWNhbnRseSBmYXN0ZXIuICBGb3IgZXhhbXBsZSwgdXNpbmcgdGhlIENNYXAgY2FjaGUgaXMKICAgICAgYWJvdXQgdHdpY2UgZmFzdGVyIHRoYW4gY2FsbGluZyBGVF9HZXRfQ2hhcl9JbmRleCBvbiBtb3N0IHBsYXRmb3Jtcy4KICAgICAgU2ltaWxhcmx5LCB1c2luZyBhbiBTQml0IGNhY2hlIGlzIGFib3V0IGZpdmUgdGltZXMgZmFzdGVyIHRoYW4gbG9hZGluZwogICAgICB0aGUgYml0bWFwcyBmcm9tIGEgYml0bWFwIGZpbGUsIGFuZCAzMDAgdG8gNTAwIHRpbWVzIGZhc3RlciB0aGFuCiAgICAgIGdlbmVyYXRpbmcgdGhlbSBmcm9tIGEgc2NhbGFibGUgZm9ybWF0LgoKICAgICAgTm90ZSB0aGF0IHlvdSBzaG91bGQgcmVjb21waWxlIHlvdXIgc291cmNlcyBpZiB5b3UgZGVzaWduZWQgYSBjdXN0b20KICAgICAgY2FjaGUgY2xhc3MgZm9yIHRoZSBGVDIgQ2FjaGUgc3Vic3lzdGVtLCBzaW5jZSB0aGUgY2hhbmdlcyBwZXJmb3JtZWQKICAgICAgYXJlIHNvdXJjZSwgYnV0IG5vdCBiaW5hcnksIGNvbXBhdGlibGUuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS4wIGFuZCAyLjAuOQoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBUaGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gZml4ZWQgdG8gcHJvZHVjZQogICAgICBfZXhhY3RseV8gdGhlIHNhbWUgb3V0cHV0IGFzIEZyZWVUeXBlIDEueC4gIFByZXZpb3VzIGRpZmZlcmVuY2VzCiAgICAgIHdlcmUgZHVlIHRvIHNsaWdodGx5IGRpc3RpbmN0IGZpeGVkLXBvaW50IGNvbXB1dGF0aW9uIHJvdXRpbmVzCiAgICAgIHVzZWQgdG8gcGVyZm9ybSBkb3QgcHJvZHVjdHMgYW5kIHZlY3RvciBsZW5ndGggbWVhc3VyZW1lbnRzLgoKICAgICAgSXQgc2VlbXMgdGhhdCBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBpcyBfZXh0cmVtZWx5XyBzZW5zaXRpdmUKICAgICAgdG8gcm91bmRpbmcgZXJyb3JzLiAgVGhlIHJlcXVpcmVkIHZlY3RvciBjb21wdXRhdGlvbiByb3V0aW5lcyBoYXZlCiAgICAgIGJlZW4gb3B0aW1pemVkIGFuZCBwbGFjZWQgd2l0aGluIHRoZSAidHRpbnRlcnAuYyIgZmlsZS4KCiAgICAtIEZpeGVkIHRoZSBwYXJzaW5nIG9mIGFjY2VsZXJhdG9yIHRhYmxlcyBpbiB0aGUgUENGIGZvbnQgZHJpdmVyLgoKICAgIC0gRml4ZWQgdGhlIFR5cGUxIGdseXBoIGxvYWRlciByb3V0aW5lIHVzZWQgdG8gY29tcHV0ZSB0aGUgZm9udCdzCiAgICAgIG1heGltdW0gYWR2YW5jZSB3aWR0aC4KCiAgSUkuIE5FVyBGRUFUVVJFUwoKICAgIC0gVGhlIGBjb25maWd1cmUnIHNjcmlwdCB1c2VkIG9uIFVuaXggc3lzdGVtcyBoYXMgYmVlbiBtb2RpZmllZCB0bwogICAgICBjaGVjayB0aGF0IEdOVSBNYWtlIGlzIGJlaW5nIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuICBPdGhlcndpc2UsCiAgICAgIGl0IHdpbGwgZGlzcGxheSBhIG1lc3NhZ2UgcHJvcG9zaW5nIHRvIHVzZSB0aGUgR05VTUFLRSBlbnZpcm9ubWVudAogICAgICB2YXJpYWJsZSB0byBuYW1lIGl0LgoKICAgICAgVGhlIFVuaXgtc3BlY2lmaWMgZmlsZSBSRUFETUUuVU5YIGhhcyBiZWVuIG1vZGlmaWVkIGFjY29yZGluZ2x5LgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgRnJlZVR5cGUgTGljZW5zZSBpbiBgZG9jcy9GVEwudHh0JyBoYXMgYmVlbiB1cGRhdGVkIHRvIGluY2x1ZGUKICAgICAgYSBwcm9wb3NlZCBwcmVmZXJyZWQgZGlzY2xhaW1lci4gIElmIHlvdSBhcmUgdXNpbmcgRnJlZVR5cGUgaW4geW91cgogICAgICBwcm9kdWN0cywgeW91IGFyZSBlbmNvdXJhZ2VkIChidXQgbm90IG1hbmRhdGVkKSB0byB1c2UgdGhlIGZvbGxvd2luZwogICAgICB0ZXh0IGluIHlvdXIgZG9jdW1lbnRhdGlvbjoKCiAgICAgICIiIgogICAgICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCCpIDE5OTYtMjAwMiBUaGUgRnJlZVR5cGUKICAgICAgICBQcm9qZWN0ICh3d3cuZnJlZXR5cGUub3JnKS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgICIiIgoKICAgIC0gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgcmVuZGVyIHBvb2wgaGFzIGJlZW4gcmVkdWNlZCB0byAxNmtCeXRlLgogICAgICBUaGlzIHNob3VsZG4ndCByZXN1bHQgaW4gYW55IG5vdGljZWFibGUgcGVyZm9ybWFuY2UgcGVuYWx0eSwgdW5sZXNzCiAgICAgIHlvdSBhcmUgdXNpbmcgdGhlIGVuZ2luZSBhcy1pcyB0byByZW5kZXIgdmVyeSBsYXJnZSBhbmQgY29tcGxleAogICAgICBnbHlwaHMuCgogICAgLSBUaGUgRnJlZVR5cGUgMiByZWRlc2lnbiBoYXMgYmVndW4uICBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZAogICAgICBhdCB0aGlzIFVSTDoKCiAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL3JlZGVzaWduLmh0bWwKCiAgICAgIFRoZSBmb2xsb3dpbmcgaW50ZXJuYWwgY2hhbmdlcyBoYXZlIGJlZW4gcGVyZm9ybWVkIHdpdGhpbiB0aGUgc291cmNlcwogICAgICBvZiB0aGlzIHJlbGVhc2U6CgogICAgICAgIC0gTWFueSBpbnRlcm5hbCB0eXBlcyBoYXZlIGJlZW4gcmVuYW1lZCB0byBpbmNyZWFzZSBjb25zaXN0ZW5jeS4KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHRydWUsIGV4Y2VwdCBmb3IgcHVibGljIHR5cGVzOgoKICAgICAgICAgICAgKiBBbGwgc3RydWN0dXJlIHR5cGVzIGhhdmUgYSBuYW1lIGVuZGluZyBpbiAiUmVjIiAoc2hvcnQgZm9yCiAgICAgICAgICAgICAgYHJlY29yZCcpLgoKICAgICAgICAgICAgKiBBIHBvaW50ZXItdG8tc3RydWN0dXJlIHR5cGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlCiAgICAgICAgICAgICAgc3RydWN0dXJlLCBfd2l0aG91dF8gdGhlICJSZWMiIHN1ZmZpeC4KCiAgICAgICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vUmVjXwogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICAgICAgICB9IEZvb1JlYywgKkZvbzsKCiAgICAgICAgLSBNYW55IGludGVybmFsIG1hY3JvcyBoYXZlIGJlZW4gcmVuYW1lZCB0byBpbmNyZWFzZSBjb25zaXN0ZW5jeS4KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHRydWU6CgogICAgICAgICAgICAqIEFsbCBtYWNyb3MgaGF2ZSBhIG5hbWUgYmVnaW5uaW5nIHdpdGggIkZUXyIuICBUaGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgYSBmZXcgY2hhbmdlcyBsaWtlCgogICAgICAgICAgICAgICAgQUxMT0MgICA9PiBGVF9BTExPQwogICAgICAgICAgICAgICAgRlJFRSAgICA9PiBGVF9GUkVFCiAgICAgICAgICAgICAgICBSRUFMTE9DID0+IEZUX1JFQUxMT0MKCiAgICAgICAgICAgICogQWxsIG1hY3JvcyBhcmUgY29tcGxldGVseSBVUFBFUkNBU0UuICBUaGlzIHJlcXVpcmVkIGEgZmV3CiAgICAgICAgICAgICAgY2hhbmdlcyBsaWtlOgoKICAgICAgICAgICAgICAgIFJFQURfU2hvcnQgID0+IEZUX1JFQURfU0hPUlQKICAgICAgICAgICAgICAgIE5FWFRfU2hvcnQgID0+IEZUX05FWFRfU0hPUlQKICAgICAgICAgICAgICAgIEdFVF9VTG9uZ0xFID0+IEZUX0dFVF9VTE9OR19MRQogICAgICAgICAgICAgICAgTUVNX1NldCAgICAgPT4gRlRfTUVNX1NFVAogICAgICAgICAgICAgICAgTUVNX0NvcHkgICAgPT4gRlRfTUVNX0NPUFkKICAgICAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICogV2hlbmV2ZXIgcG9zc2libGUsIGFsbCBtYWNybyBuYW1lcyBmb2xsb3cgdGhlCiAgICAgICAgICAgICAgRlRfPE9CSkVDVD5fPE1FVEhPRD4gcGF0dGVybi4gIEZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lICAgPT4gRlRfRlJBTUVfRU5URVIKICAgICAgICAgICAgICAgIEZPUkdFVF9GcmFtZSAgID0+IEZUX0ZSQU1FX0VYSVQKICAgICAgICAgICAgICAgIEVYVFJBQ1RfRnJhbWUgID0+IEZUX0ZSQU1FX0VYVFJBQ1QKICAgICAgICAgICAgICAgIFJFTEVBU0VfRnJhbWUgID0+IEZUX0ZSQU1FX1JFTEVBU0UKCiAgICAgICAgICAgICAgICBGSUxFX1BvcyAgICAgICA9PiBGVF9TVFJFQU1fUE9TCiAgICAgICAgICAgICAgICBGSUxFX1NlZWsgICAgICA9PiBGVF9TVFJFQU1fU0VFSwogICAgICAgICAgICAgICAgRklMRV9SZWFkICAgICAgPT4gRlRfU1RSRUFNX1JFQUQKICAgICAgICAgICAgICAgIEZJTEVfUmVhZEF0ICAgID0+IEZUX1NUUkVBTV9SRUFEX0FUCiAgICAgICAgICAgICAgICBSRUFEX0ZpZWxkcyAgICA9PiBGVF9TVFJFQU1fUkVBRF9GSUVMRFMKCiAgICAgICAgLSBNYW55IGludGVybmFsIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmVuYW1lZCB0byBmb2xsb3cgdGhlCiAgICAgICAgICBGVF88T2JqZWN0Pl88TWV0aG9kPiBwYXR0ZXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBGVF9TZWVrX1N0cmVhbSAgICAgICA9PiBGVF9TdHJlYW1fU2VlawogICAgICAgICAgICBGVF9SZWFkX1N0cmVhbV9BdCAgICA9PiBGVF9TdHJlYW1fUmVhZEF0CiAgICAgICAgICAgIEZUX0RvbmVfU3RyZWFtICAgICAgID0+IEZUX1N0cmVhbV9DbG9zZQogICAgICAgICAgICBGVF9OZXdfU3RyZWFtICAgICAgICA9PiBGVF9TdHJlYW1fT3BlbgogICAgICAgICAgICBGVF9OZXdfTWVtb3J5X1N0cmVhbSA9PiBGVF9TdHJlYW1fT3Blbk1lbW9yeQogICAgICAgICAgICBGVF9FeHRyYWN0X0ZyYW1lICAgICA9PiBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lCgogICAgICAgICAgTm90ZSB0aGF0IG1ldGhvZCBuYW1lcyBkbyBub3QgY29udGFpbiAiXyIuCgogICAgICAgIC0gVGhlIEZUX0FMTE9DX0FSUkFZIGFuZCBGVF9SRUFMTE9DX0FSUkFZIGhhdmUgYmVlbiByZXBsYWNlZAogICAgICAgICAgd2l0aCBGVF9ORVdfQVJSQVkgYW5kIEZUX1JFTkVXX0FSUkFZIHdoaWNoIGRvIG5vdCB0YWtlIGEgdHlwZQogICAgICAgICAgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudC4gIEluc3RlYWQsIHRoZSBhcnJheSBlbGVtZW50IHR5cGUgc2l6ZQogICAgICAgICAgaXMgY29tcHV0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgcG9pbnRlcgogICAgICAgICAgdXNlZC4KCiAgICAgICAgLSBBIG5ldyBvYmplY3QgY2xhc3MsIEZUX0NNYXAsIGhhcyBiZWVuIGludHJvZHVjZWQuICBUaGVzZQogICAgICAgICAgaW50ZXJuYWwgb2JqZWN0cyBhcmUgdXNlZCB0byBtb2RlbCBjaGFyYWN0ZXIgbWFwcy4gIFRoaXMgZWFzZXMKICAgICAgICAgIHRoZSBzdXBwb3J0IG9mIGFkZGl0aW9uYWwgY2hhcm1hcCB0eXBlcyB3aXRoaW4gdGhlIGVuZ2luZS4KCiAgICAgICAgLSBBIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgbmFtZWQgImZ0c3RkbGliLmgiIGhhcyBiZWVuIGFkZGVkCiAgICAgICAgICB0byBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcnLiAgSXQgaXMgdXNlZCB0byBkZWZpbmUgYWxpYXNlcwogICAgICAgICAgZm9yIF9ldmVyeV8gcm91dGluZSBvZiB0aGUgSVNPIEMgbGlicmFyeSB0aGF0IHRoZSBmb250IGVuZ2luZQogICAgICAgICAgdXNlcy4gIEVhY2ggYWxpYXNlcyBoYXMgYSAiZnRfIiBwcmVmaXggKGUuZy4gImZ0X3N0cmxlbiIgaXMgYW4KICAgICAgICAgIGFsaWFzIGZvciAic3RybGVuIikuCgogICAgICAgICAgVGhpcyBpcyB1c2VkIHRvIGVhc2UgdGhlIHBvcnRpbmcgb2YgRnJlZVR5cGUgMiB0byBleG90aWMgcnVudGltZQogICAgICAgICAgZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBJU08gQyBMaWJyYXJ5IGlzbid0IGF2YWlsYWJsZSAoZS5nLgogICAgICAgICAgWEZyZWU4NiBleHRlbnNpb24gbW9kdWxlcykuCgogICAgICBNb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgIkNoYW5nZUxvZyIgZmlsZS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC45IGFuZCAyLjAuOAoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBDZXJ0YWluIGZvbnRzIGxpa2UgImZveGp1bXAudHRmIiBjb250YWluIGJyb2tlbiBuYW1lIHRhYmxlcyB3aXRoCiAgICAgIGludmFsaWQgZW50cmllcyBhbmQgd2lsZCBvZmZzZXRzLiAgVGhpcyBjYXVzZWQgRnJlZVR5cGUgdG8gY3Jhc2ggd2hlbgogICAgICB0cnlpbmcgdG8gbG9hZCB0aGVtLgoKICAgICAgVGhlIFNGTlQgYG5hbWUnIHRhYmxlIGxvYWRlciBoYXMgYmVlbiBmaXhlZCB0byBiZSBhYmxlIHRvIHN1cHBvcnQKICAgICAgdGhlc2Ugc3RyYW5nZSBmb250cy4KCiAgICAgIE1vcmVvdmVyLCB0aGUgY29kZSBpbiBjaGFyZ2Ugb2YgcHJvY2Vzc2luZyB0aGlzIHRhYmxlIGhhcyBiZWVuIGNoYW5nZWQKICAgICAgdG8gYWx3YXlzIGZhdm91ciBXaW5kb3dzLWZvcm1hdHRlZCBlbnRyaWVzIG92ZXIgb3RoZXIgb25lcy4gIEhlbmNlLCBhCiAgICAgIGZvbnQgdGhhdCB3b3JrcyBvbiBXaW5kb3dzIGJ1dCBub3Qgb24gdGhlIE1hYyB3aWxsIGxvYWQgY2xlYW5seSBpbgogICAgICBGcmVlVHlwZSBhbmQgcmVwb3J0IGFjY3VyYXRlIHZhbHVlcyBmb3IgRmFtaWx5ICYgUG9zdFNjcmlwdCBuYW1lcy4KCiAgICAtIFRoZSBDSUQgZm9udCBkcml2ZXIgaGFzIGJlZW4gZml4ZWQuICBJdCB1bmZvcnR1bmF0ZWx5IHJldHVybmVkIGEKICAgICAgUG9zdHNjcmlwdCBGb250IG5hbWUgd2l0aCBhIGxlYWRpbmcgc2xhc2gsIGFzIGluCiAgICAgICIvTXVuaHdhR290aGljLVJlZ3VsYXIiLgoKICAgIC0gRnJlZVR5cGUgMiBzaG91bGQgbm93IGNvbXBpbGUgZmluZSBvbiBBSVggNC4zLjMgYXMgYSBzaGFyZWQgbGlicmFyeS4KCiAgICAtIEEgYnVnIGluIHRoZSBQb3N0c2NyaXB0IGhpbnRlciBoYXMgYmVlbiBmb3VuZCBhbmQgZml4ZWQsIHJlbW92aW5nCiAgICAgIHVuLWV2ZW4gc3RlbSB3aWR0aHMgYXQgc21hbGwgcGl4ZWwgc2l6ZXMgKGxpa2UgMTQtMTcpLgoKICAgICAgVGhpcyBpbXByb3ZlcyB0aGUgcXVhbGl0eSBvZiBhIGNlcnRhaW4gbnVtYmVyIG9mIFBvc3RzY3JpcHQgZm9udHMuCgoKICBJSS4gTkVXIEZFQVRVUkVTCgogICAgLSBBIG5ldyBmdW5jdGlvbiBuYW1lZCBgRlRfTGlicmFyeV9WZXJzaW9uJyBoYXMgYmVlbiBhZGRlZCB0byByZXR1cm4KICAgICAgdGhlIGN1cnJlbnQgbGlicmFyeSdzIG1ham9yLCBtaW5vciwgYW5kIHBhdGNoIHZlcnNpb24gbnVtYmVycy4gIFRoaXMKICAgICAgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBtYWNyb3MgRlJFRVRZUEVfTUFKT1IsIEZSRUVUWVBFX01JTk9SLCBhbmQKICAgICAgRlJFRVRZUEVfUEFUQ0ggY2Fubm90IGJlIHVzZWQgd2hlbiB0aGUgbGlicmFyeSBpcyBkeW5hbWljYWxseSBsaW5rZWQKICAgICAgYnkgYSBwcm9ncmFtLgoKICAgIC0gVHdvIG5ldyBBUElzIGhhdmUgYmVlbiBhZGRlZDogYEZUX0dldF9GaXJzdF9DaGFyJyBhbmQKICAgICAgYEZUX0dldF9OZXh0X0NoYXInLgoKICAgICAgVG9nZXRoZXIsIHRoZXNlIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgZWZmaWNpZW50bHkgb3ZlciB0aGUgY3VycmVudGx5CiAgICAgIHNlbGVjdGVkIGNoYXJtYXAgb2YgYSBnaXZlbiBmYWNlLiAgUmVhZCB0aGUgQVBJIHJlZmVyZW5jZSBmb3IgbW9yZQogICAgICBkZXRhaWxzLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgRnJlZVR5cGUgc291cmNlcyBhcmUgdW5kZXIgaGVhdnkgaW50ZXJuYWwgcmUtZmFjdG9yaW5nLiAgQXMgYQogICAgICBjb25zZXF1ZW5jZSwgd2UgaGF2ZSBjcmVhdGVkIGEgYnJhbmNoIG5hbWVkICJTVEFCTEUiIG9uIHRoZSBDVlMgdG8KICAgICAgaG9sZCBhbGwgZnV0dXJlIHJlbGVhc2VzL2ZpeGVzIGluIHRoZSAyLjAueCBmYW1pbHkuCgogICAgICBUaGUgSEVBRCBicmFuY2ggbm93IGNvbnRhaW5zIHRoZSByZS1mYWN0b3JlZCBzb3VyY2VzIGFuZCBzaG91bGRuJ3QgYmUKICAgICAgdXNlZCBmb3IgdGVzdGluZyBvciBwYWNrYWdpbmcgbmV3IHJlbGVhc2VzLiAgSW4gY2FzZSB5b3Ugd291bGQgbGlrZQogICAgICB0byBhY2Nlc3MgdGhlIDIuMC45IHNvdXJjZXMgZnJvbSBvdXIgQ1ZTIHJlcG9zaXRvcnksIHVzZSB0aGUgdGFnCiAgICAgIGBWRVItMi0wLTknLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjggYW5kIDIuMC43CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZXJlIHdhcyBhIHNtYWxsIGJ1dCBuYXN0eSBidWcgaW4gImZyZWV0eXBlLWNvbmZpZy5pbiIgd2hpY2gKICAgICAgY2F1c2VkIHRoZSAiZnJlZXR5cGUtY29uZmlnIiBzY3JpcHQgdG8gZmFpbCBvbiBVbml4LgoKICAgICAgVGhpcyBkaWRuJ3QgcHJldmVudCB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5IG9yIGV2ZW4KICAgICAgaXRzIGV4ZWN1dGlvbiwgYnV0IGNhdXNlZCBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBjb21waWxlIG1hbnkKICAgICAgVW5peCBwYWNrYWdlcyB0aGF0IGRlcGVuZCBvbiBpdC4KCiAgICAtIFNvbWUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udHMgZW1iZWRkZWQgaW4gUERGIGRvY3VtZW50cyBkbwogICAgICBub3QgaGF2ZSBhICdjbWFwJywgJ3Bvc3QnIGFuZCAnbmFtZScgYXMgaXMgcmVxdWlyZWQgYnkgdGhlCiAgICAgIHNwZWNpZmljYXRpb24uICBGcmVlVHlwZSBubyBsb25nZXIgcmVmdXNlcyB0byBsb2FkIHN1Y2ggZm9udHMuCgogICAgLSB2YXJpb3VzIGZpeGVzIHRvIHRoZSBQQ0YgZm9udCBkcml2ZXIKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC43IGFuZCAyLjAuNgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBGaXhlZCB0d28gYnVncyBpbiB0aGUgVHlwZSAxIGZvbnQgZHJpdmVyLiAgVGhlIGZpcnN0IG9uZSByZXN1bHRlZCBpbiBhCiAgICAgIG1lbW9yeSBsZWFrIGluIHN1YnRsZSBjYXNlcy4gIFRoZSBvdGhlciBvbmUgY2F1c2VkIEZyZWVUeXBlIHRvIGNyYXNoCiAgICAgIHdoZW4gdHJ5aW5nIHRvIGxvYWQgIi5nc2YiIGZpbGVzIChHaG9zdHNjcmlwdCBzby1jYWxsZWQgUG9zdHNjcmlwdAogICAgICBmb250cykuCgogICAgICAoVGhpcyBtYWRlIF9tYW55XyBLREUgYXBwbGljYXRpb25zIGNyYXNoIG9uIGNlcnRhaW4gc3lzdGVtcy4gIEZyZWVUeXBlCiAgICAgICBfaXNfIGJlY29taW5nIGEgY3JpdGljYWwgc3lzdGVtIGNvbXBvbmVudCBvbiBMaW51eCA6LSkKCiAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIENGRiBmb250IGRyaXZlci4KCiAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFBDRiBmb250IGRyaXZlci4KCiAgICAtIEZpeGVkIHRoZSBWaXN1YWwgQysrIHByb2plY3QgZmlsZSAiYnVpbGRzL3dpbjMyL3Zpc3VhbGMvZnJlZXR5cGUuZHNwIgogICAgICBzaW5jZSBpdCBkaWRuJ3QgaW5jbHVkZSB0aGUgUG9zdHNjcmlwdCBoaW50ZXIgY29tcG9uZW50LCBjYXVzaW5nCiAgICAgIGVycm9ycyBhdCBidWlsZCB0aW1lLgoKICAgIC0gRml4ZWQgYSBzbWFsbCByZW5kZXJpbmcgYnVnIGluIHRoZSBhbnRpLWFsaWFzZWQgcmVuZGVyZXIgdGhhdCBvbmx5CiAgICAgIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGRyYXcgdGhpbiAobGVzcyB0aGFuIDEgcGl4ZWwpIHN0cm9rZXMuCgogICAgLSBGaXhlZCAiYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmE0IiB3aGljaCBpcyB1c2VkIHRvIGdlbmVyYXRlIGEgdmFsaWQKICAgICAgImZyZWV0eXBlMi5tNCIgZm9yIHVzZSB3aXRoIGF1dG9jb25mLgoKICAgIC0gRml4ZWQgdGhlIE9wZW5WTVMgTWFrZWZpbGVzLgoKCiAgSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIEFkZGVkICJjb25maWd1cmUiIGFuZCAiaW5zdGFsbCIgc2NyaXB0cyB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KICAgICAgQSBHTlUtc3R5bGUgaW5zdGFsbGF0aW9uIGlzIHRodXMgbm93IGVhc2lseSBwb3NzaWJsZSB3aXRoCgogICAgICAgICAgLi9jb25maWd1cmUgIDxvcHRpb25zPgogICAgICAgICAgbWFrZQogICAgICAgICAgbWFrZSBpbnN0YWxsCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuNiBhbmQgMi4wLjUKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gSXQgd2Fzbid0IHBvc3NpYmxlIHRvIGxvYWQgZW1iZWRkZWQgYml0bWFwcyB3aGVuIHRoZSBhdXRvLWhpbnRlciB3YXMKICAgICAgdXNlZC4gIFRoaXMgaXMgbm93IGZpeGVkLgoKICAgIC0gVGhlIFRydWVUeXBlIGZvbnQgZHJpdmVyIGRpZG4ndCBsb2FkIHNvbWUgY29tcG9zaXRlcyBwcm9wZXJseSAodGhlCiAgICAgIHN1Yi1nbHlwaHMgd2VyZSBzbGlnaHRseSBzaGlmdGVkLCBhbmQgdGhpcyB3YXMgb25seSBub3RpY2VhYmxlIHdoZW4KICAgICAgdXNpbmcgbW9ub2Nocm9tZSByZW5kZXJpbmcpLgoKICAgIC0gVmFyaW91cyBmaXhlcyB0byB0aGUgYXV0by1oaW50ZXIuICBUaGV5IG1lcmVseSBpbXByb3ZlIHRoZSBvdXRwdXQgb2YKICAgICAgc2Fucy1zZXJpZiBmb250cy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMgd2l0aCBzZXJpZmVkCiAgICAgIGZvbnRzIGFuZCBjb21wb3NpdGVzIChhY2NlbnRlZCBjaGFyYWN0ZXJzKS4KCiAgICAtIEFsbCBzY2FsYWJsZSBmb250IGRyaXZlcnMgZXJyb25lb3VzbHkgcmV0dXJuZWQgdW4tZml0dGVkIGdseXBoCiAgICAgIGFkdmFuY2VzIHdoZW4gaGludGluZyB3YXMgcmVxdWVzdGVkLiAgVGhpcyBjcmVhdGVkIHByb2JsZW1zIGZvciBhCiAgICAgIG51bWJlciBvZiBsYXlvdXQgYXBwbGljYXRpb25zLiAgVGhpcyBpcyBhIHZlcnkgb2xkIGJ1ZyB0aGF0IGdvdAogICAgICB1bmRldGVjdGVkIG1haW5seSBiZWNhdXNlIG1vc3QgdGVzdC9kZW1vIHByb2dyYW0gcGVyZm9ybSByb3VuZGluZwogICAgICBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkgKHRocm91Z2ggdGhlIGNhY2hlKS4KCiAgICAtIEZUX0dseXBoX1RvX0JpdG1hcCgpIGRpZCBlcnJvbmVvdXNseSBtb2RpZnkgdGhlIHNvdXJjZSBnbHlwaCBpbgogICAgICBjZXJ0YWluIGNhc2VzLgoKICAgIC0gImdsbmFtZXMucHkiIHN0aWxsIGNvbnRhaW5lZCBhIGJ1ZyB0aGF0IG1hZGUgRnJlZVR5cGUgcmV0dXJuIGludmFsaWQKICAgICAgbmFtZXMgZm9yIGNlcnRhaW4gZ2x5cGhzLgoKICAgIC0gVGhlIGxpYnJhcnkgY3Jhc2hlZCB3aGVuIGxvYWRpbmcgY2VydGFpbiBUeXBlIDEgZm9udHMgbGlrZSAic2Fkbi5wZmIiCiAgICAgICgiU3RhbGluZ3JhZCBOb3JtYWwiKSwgd2hpY2ggYXBwZWFyIHRvIGNvbnRhaW4gcGF0aGV0aWMgZm9udCBpbmZvCiAgICAgIGRpY3Rpb25hcmllcy4KCiAgICAtIFRoZSBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgaXMgbm93IG11Y2ggbW9yZSBwYXJhbm9pZCBhbmQgY2hlY2tzIGV2ZXJ5dGhpbmcKICAgICAgd2hlbiBsb2FkaW5nIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UuICBUaGlzIHdhcyBuZWNlc3NhcnkgdG8gYXZvaWQKICAgICAgcHJvYmxlbXMgKGNyYXNoZXMgYW5kL29yIG1lbW9yeSBvdmVyd3JpdGVzKSB3aXRoIGJyb2tlbiBmb250cyB0aGF0CiAgICAgIGNhbWUgZnJvbSBhIHJlYWxseSBidWdneSBhdXRvbWF0aWMgZm9udCBjb252ZXJ0ZXIuCgoKICBJSS4gSU1QT1JUQU5UIFVQREFURVMgQU5EIE5FVyBGRUFUVVJFUwoKICAgIC0gSW1wb3J0YW50IHVwZGF0ZXMgdG8gdGhlIE1hYy1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeS4KCiAgICAtIFRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gaGFzIGJlZW4gY29tcGxldGVseSByZS1kZXNpZ25lZCwgYW5kIGl0cyBBUEkKICAgICAgaGFzIGV2b2x2ZWQgKHRoZSBvbGQgb25lIGlzIHN0aWxsIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzCiAgICAgIGNvbXBhdGliaWxpdHkpLgoKICAgICAgVGhlIGRvY3VtZW50YXRpb24gZm9yIGl0IGlzIG5vdCB5ZXQgY29tcGxldGVkLCBzb3JyeS4gIEZvciBub3csIHlvdQogICAgICBhcmUgZW5jb3VyYWdlZCB0byBjb250aW51ZSB1c2luZyB0aGUgb2xkIEFQSS4gIEhvd2V2ZXIsIHRoZSBmdHZpZXcKICAgICAgZGVtbyBwcm9ncmFtIGluIHRoZSBmdDJkZW1vcyBwYWNrYWdlIGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZCB0byB1c2UKICAgICAgdGhlIG5ldyBjYWNoaW5nIGZ1bmN0aW9ucy4KCiAgICAtIEEgbmV3IGNoYXJtYXAgY2FjaGUgaXMgcHJvdmlkZWQgdG9vLiAgU2VlIEZUQ19DTWFwQ2FjaGUoKS4gIFRoaXMgaXMKICAgICAgdXNlZnVsIHRvIHBlcmZvcm0gY2hhcmFjdGVyIGNvZGUgLT4gZ2x5cGggaW5kZXggdHJhbnNsYXRpb25zIHF1aWNrbHksCiAgICAgIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGFuIG9wZW5lZCBGVF9GYWNlLgoKICAgIC0gQSBORVcgUE9TVFNDUklQVCBISU5URVIgbW9kdWxlIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgbmF0aXZlIGhpbnRzCiAgICAgIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogUG9zdFNjcmlwdCBUeXBlIDEsIFBvc3RTY3JpcHQgQ0lELCBhbmQKICAgICAgQ0ZGL0NFRi4KCiAgICAgIFBsZWFzZSB0ZXN0ISAgTm90ZSB0aGF0IHRoZSBhdXRvLWhpbnRlciBwcm9kdWNlcyBiZXR0ZXIgcmVzdWx0cyBmb3IgYQogICAgICBudW1iZXIgb2YgYmFkbHktaGludGVkIGZvbnRzIChtb3N0bHkgYXV0by1nZW5lcmF0ZWQgb25lcykgdGhvdWdoLgoKICAgIC0gQSBtZW1vcnkgZGVidWdnZXIgaXMgbm93IHBhcnQgb2YgdGhlIHN0YW5kYXJkIEZyZWVUeXBlIHNvdXJjZXMuICBUbwogICAgICBlbmFibGUgaXQsIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaW4gPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPiwgYW5kCiAgICAgIHJlY29tcGlsZSB0aGUgbGlicmFyeS4KCiAgICAgIEFkZGl0aW9uYWxseSwgZGVmaW5lIHRoZSBfZW52aXJvbm1lbnRfIHZhcmlhYmxlIEZUX0RFQlVHX01FTU9SWSBhbmQKICAgICAgcnVuIGFueSBwcm9ncmFtIHVzaW5nIEZyZWVUeXBlLiAgV2hlbiB0aGUgbGlicmFyeSBpcyBleGl0ZWQsIGEgc3VtbWFyeQogICAgICBvZiBtZW1vcnkgZm9vdHByaW50cyBhbmQgcG9zc2libGUgbGVha3Mgd2lsbCBiZSBkaXNwbGF5ZWQuCgogICAgICBUaGlzIHdvcmtzIHRyYW5zcGFyZW50bHkgd2l0aCBfYW55XyBwcm9ncmFtIHRoYXQgdXNlcyBGcmVlVHlwZS4KICAgICAgSG93ZXZlciwgeW91IHdpbGwgbmVlZCBhIGxvdCBvZiBtZW1vcnkgdG8gdXNlIHRoaXMgKGFsbG9jYXRlZCBibG9ja3MKICAgICAgYXJlIG5ldmVyIHJlbGVhc2VkIHRvIHRoZSBoZWFwIHRvIGRldGVjdCBkb3VibGUgZGVsZXRlcyBlYXNpbHkpLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBXZSBhcmUgYXdhcmUgb2Ygc3VidGxlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG91dHB1dCBvZiBGcmVlVHlwZQogICAgICB2ZXJzaW9ucyAxIGFuZCAyIHdoZW4gaXQgY29tZXMgdG8gbW9ub2Nocm9tZSBUcnVlVHlwZS1oaW50ZWQgZ2x5cGhzLgogICAgICBUaGVzZSBhcmUgbW9zdCBwcm9iYWJseSBkdWUgdG8gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGhlIG1vbm9jaHJvbWUKICAgICAgcmFzdGVyaXplcnMgYW5kIHdpbGwgYmUgd29ya2VkIG91dCBpbiBhbiB1cGNvbWluZyByZWxlYXNlLgoKICAgIC0gV2UgaGF2ZSBkZWNpZGVkIHRvIGZvcmsgdGhlIHNvdXJjZXMgaW4gYSAic3RhYmxlIiBicmFuY2gsIGFuZCBhbgogICAgICAidW5zdGFibGUiIG9uZSwgc2luY2UgRnJlZVR5cGUgaXMgYmVjb21pbmcgYSBjcml0aWNhbCBjb21wb25lbnQgb2YKICAgICAgbWFueSBVbml4IHN5c3RlbXMuCgogICAgICBUaGUgbmV4dCBidWctZml4IHJlbGVhc2VzIG9mIHRoZSBsaWJyYXJ5IHdpbGwgYmUgbmFtZWQgMi4wLjcsIDIuMC44LAogICAgICBldGMuLCB3aGlsZSB0aGUgIjIuMSIgYnJhbmNoIHdpbGwgY29udGFpbiBhIHZlcnNpb24gb2YgdGhlIHNvdXJjZXMKICAgICAgd2hlcmUgd2Ugd2lsbCBzdGFydCBtYWpvciByZXdvcmtpbmcgb2YgdGhlIGxpYnJhcnkncyBpbnRlcm5hbHMsIGluCiAgICAgIG9yZGVyIHRvIHByb2R1Y2UgRnJlZVR5cGUgMi4yLjAgKG9yIGV2ZW4gMy4wKSBpbiBhIG1vcmUgZGlzdGFudAogICAgICBmdXR1cmUuCgogICAgICBXZSBhbHNvIGhvcGUgdGhhdCB0aGlzIHNjaGVtZSB3aWxsIGFsbG93IG11Y2ggbW9yZSBmcmVxdWVudCByZWxlYXNlcwogICAgICB0aGFuIGluIHRoZSBwYXN0LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjUgYW5kIDIuMC40CgogIE5PVEUgVEhBVCAyLjAuNSBET0VTIE5PVCBDT05UQUlOIFRIRSBQT1NUU0NSSVBUIEhJTlRFUi4gIFRISVMgTU9EVUxFIFdJTEwKICBCRSBQQVJUIE9GIFRIRSBORVhUIFJFTEVBU0UgKEVJVEhFUiAyLjAuNiBvciAyLjEpCgogIC0gRml4ZWQgYSBidWcgdGhhdCBtYWRlIGNlcnRhaW4gZ2x5cGhzLCBsaWtlICJDYWN1dGUiLCAiY2FjdXRlIiBhbmQKICAgICJsc2xhc2giIHVuYXZhaWxhYmxlIGZyb20gVW5pY29kZSBjaGFybWFwcyBvZiBQb3N0c2NyaXB0IGZvbnRzLiAgVGhpcwogICAgcHJldmVudGVkIHRoZSBjb3JyZWN0IGRpc3BsYXkgb2YgUG9saXNoIHRleHQsIGZvciBleGFtcGxlLgoKICAtIFRoZSBrZXJuaW5nIHRhYmxlIG9mIFR5cGUgMSBmb250cyB3YXMgbG9hZGVkIGJ5IEZyZWVUeXBlLCB3aGVuIGl0cyBBRk0KICAgIGZpbGUgd2FzIGF0dGFjaGVkIHRvIGl0cyBmYWNlLCBidXQgdGhlIEZUX0ZBQ0VfRkxBR19IQVNfS0VSTklORyBiaXQKICAgIGZsYWdzIHdhcyBub3Qgc2V0IGNvcnJlY3RseSwgcHJldmVudGluZyBGVF9HZXRfS2VybmluZyB0byByZXR1cm4KICAgIG1lYW5pbmdmdWwgdmFsdWVzLgoKICAtIEltcHJvdmVkIFNGTlQgKFRydWVUeXBlICYgT3BlblR5cGUpIGNoYXJtYXAgc3VwcG9ydC4gIFNsaWdodGx5IGJldHRlcgogICAgcGVyZm9ybWFuY2UsIGFzIHdlbGwgYXMgc3VwcG9ydCBmb3IgdGhlIG5ldyBmb3JtYXRzIGRlZmluZWQgYnkgdGhlCiAgICBPcGVuVHlwZSAxLjMgc3BlY2lmaWNhdGlvbiAoOCwgMTAsIGFuZCAxMikKCiAgLSBGaXhlZCBhIHNlcmlvdXMgdHlwbyBpbiAic3JjL2Jhc2UvZnRjYWxjLmMiIHdoaWNoIGNhdXNlZCBpbnZhbGlkCiAgICBjb21wdXRhdGlvbnMgaW4gY2VydGFpbiByYXJlIGNhc2VzLCBwcm9kdWNpbmcgdWdseSBhcnRlZmFjdHMuCgogIC0gVGhlIHNpemUgb2YgdGhlIEVNIHNxdWFyZSBpcyBjb21wdXRlZCB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBhbGdvcml0aG0KICAgIGZvciBQb3N0c2NyaXB0IGZvbnRzLiAgVGhlIG9sZCBvbmUgY2F1c2VkIHNsaWdodCBlcnJvcnMgd2l0aCBlbWJlZGRlZAogICAgZm9udHMgZm91bmQgaW4gUERGIGRvY3VtZW50cy4KCiAgLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgY2FjaGUgbWFuYWdlciB0aGF0IHByZXZlbnRlZCBub3JtYWwgTFJVIGJlaGF2aW91cgogICAgd2l0aGluIHRoZSBjYWNoZSBtYW5hZ2VyLCBjYXVzaW5nIHVubmVjZXNzYXJ5IHJlbG9hZHMgKGZvciBGVF9GYWNlIGFuZAogICAgRlRfU2l6ZSBvYmplY3RzIG9ubHkpLgoKICAtIEFkZGVkIGEgbmV3IGZ1bmN0aW9uIG5hbWVkICJGVF9HZXRfTmFtZV9JbmRleCIgdG8gcmV0cmlldmUgdGhlIGdseXBoCiAgICBpbmRleCBvZiBhIGdpdmVuIGdseXBoIG5hbWUsIHdoZW4gZm91bmQgaW4gYSBmYWNlLgoKICAtIEFkZGVkIGEgbmV3IGZ1bmN0aW9uIG5hbWVkICJGVF9HZXRfUG9zdHNjcmlwdF9OYW1lIiB0byByZXRyaWV2ZSB0aGUKICAgICJ1bmlxdWUiIFBvc3RzY3JpcHQgZm9udCBuYW1lIG9mIGEgZ2l2ZW4gZmFjZS4KCiAgLSBBZGRlZCBhIG5ldyBwdWJsaWMgaGVhZGVyIHNpemUgbmFtZWQgRlRfU0laRVNfSCAob3IKICAgIDxmcmVldHlwZS9mdHNpemVzLmg+KSBwcm92aWRpbmcgbmV3IEZUX1NpemUtbWFuYWdlbWVudCBmdW5jdGlvbnM6CiAgICBGVF9OZXdfU2l6ZSwgRlRfQWN0aXZhdGVfU2l6ZSwgRlRfRG9uZV9TaXplLgoKICAtIEZpeGVkIGEgcmVhbGxvY2F0aW9uIGJ1ZyB0aGF0IGdlbmVyYXRlZCBhIGRhbmdsaW5nIHBvaW50ZXIgKGFuZCBwb3NzaWJseQogICAgbWVtb3J5IGxlYWtzKSB3aXRoIFBvc3RzY3JpcHQgZm9udHMgKGluIHNyYy9wc2F1eC9wc29ianMuYykuCgogIC0gTWFueSBmaXhlcyBmb3IgMTYtYml0IGNvcnJlY3RuZXNzLgoKICAtIFJlbW92ZWQgbWFueSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBmcm9tIHRoZSBzb3VyY2VzLgoKICAtIEFkZGVkIGFuIEFtaWdhIGJ1aWxkIGRpcmVjdG9yeSBpbiAiYnVpbGRzL2FtaWdhIi4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjQgYW5kIDIuMC4zCgogIC0gRml4ZWQgYSByYXRoZXIgYW5ub3lpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gMi4wLjMuICBOYW1lbHksIHRoZQogICAgZm9udCB0cmFuc2Zvcm1hdGlvbiBzZXQgdGhyb3VnaCBGVF9TZXRfVHJhbnNmb3JtIHdhcyBhcHBsaWVkIHR3aWNlIHRvCiAgICBhdXRvLWhpbnRlZCBnbHlwaHMsIHJlc3VsdGluZyBpbiBpbmNvcnJlY3RseSByb3RhdGVkIHRleHQgb3V0cHV0LgoKICAtIEZpeGVkIF9tYW55XyBjb21waWxlciB3YXJuaW5ncy4gIEZUMiBzaG91bGQgbm93IGNvbXBpbGUgY2xlYW5seSB3aXRoCiAgICBWaXN1YWwgQysrJ3MgbW9zdCBwZWRhbnRpYyB3YXJuaW5nIGxldmVsICgvVzQpLiAgSXQgYWxyZWFkeSBjb21waWxlZAogICAgZmluZSB3aXRoIEdDQyBhbmQgYSBmZXcgb3RoZXIgY29tcGlsZXJzLgoKICAtIEZpeGVkIGEgYnVnIHRoYXQgcHJldmVudGVkIHRoZSBsaW5lYXIgYWR2YW5jZSB3aWR0aCBvZiBjb21wb3NpdGUKICAgIFRydWVUeXBlIGdseXBocyB0byBiZSBjb3JyZWN0bHkgcmV0dXJuZWQuCgogIC0gRml4ZWQgdGhlIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBsb2NhdGVkIGluICJidWlsZHMvd2luMzIvdmlzdWFsYyIKICAgIChwcmV2aW91cyB2ZXJzaW9ucyB1c2VkIG9sZGVyIG5hbWVzIG9mIHRoZSBsaWJyYXJ5KS4KCiAgLSBNYW55IDMyLWJpdCBjb25zdGFudHMgaGF2ZSBhbiAiTCIgYXBwZW5kZWQgdG8gdGhlaXIgdmFsdWUsIGluIG9yZGVyCiAgICB0byBpbXByb3ZlIHRoZSAxNi1iaXRuZXNzIG9mIHRoZSBjb2RlLiAgU29tZW9uZSBpcyBhY3R1YWxseSB0cnlpbmcgdG8KICAgIHVzZSBGVDIgb24gYW4gQXRhcmkgU1QgbWFjaGluZSEKCiAgLSBVcGRhdGVkIHRoZSAiYnVpbGRzL2RldGVjdC5tayIgZmlsZSBpbiBvcmRlciB0byBhdXRvbWF0aWNhbGx5IGJ1aWxkCiAgICBGVDIgb24gQUlYIHN5c3RlbXMuICBBSVggdXNlcyAiL3Vzci9zYmluL2luaXQiIGluc3RlYWQgb2YgIi9zYmluL2luaXQiCiAgICBhbmQgd2Fzbid0IHByZXZpb3VzbHkgZGV0ZWN0ZWQgYXMgYSBVbml4IHBsYXRmb3JtIGJ5IHRoZSBGcmVlVHlwZSBidWlsZAogICAgc3lzdGVtLgoKICAtIFVwZGF0ZWQgdGhlIFVuaXgtc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGJ1aWxkIHN5c3RlbSAobmV3IGxpYnRvb2wKICAgIHZlcnNpb24sIGV0Yy4pLgoKICAtIFRoZSBTRk5UIGtlcm5pbmcgbG9kYWVyIG5vdyBlbnN1cmVzIHRoYXQgdGhlIHRhYmxlIGlzIHNvcnRlZCAoc2luY2Ugc29tZQogICAgcHJvYmxlbSBmb250cyBkbyBub3QgbWVldCB0aGlzIHJlcXVpcmVtZW50KS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjMgYW5kIDIuMC4yCgogIEkuIENIQU5HRVMgVE8gVEhFIE1PRFVMRVMgLyBGT05UIERSSVZFUlMKCiAgICAtIFRIRSBBVVRPLUhJTlRFUiBIQVMgQkVFTiBTTElHSFRMWSBJTVBST1ZFRCwgaW4gb3JkZXIgdG8gZml4IHNldmVyYWwKICAgICAgYW5ub3lpbmcgYXJ0ZWZhY3RzLCBtYWlubHk6CgogICAgICAgIC0gQmx1ZSB6b25lIGFsaWduZW1lbnQgb2YgaG9yaXpvbnRhbCBzdGVtcyB3YXNuJ3QgcGVyZm9ybWVkCiAgICAgICAgICBjb3JyZWN0bHksIHJlc3VsdGluZyBpbiBhcnRlZmFjdHMgbGlrZSB0aGUgImQiIGJlaW5nIHBsYWNlZCBvbmUKICAgICAgICAgIHBpeGVsIGJlbG93IHRoZSAiYiIgaW4gc29tZSBmb250cyBsaWtlIFRpbWUgTmV3IFJvbWFuLgoKICAgICAgICAtIE92ZXJzaG9vdCB0aHJlc2hvbGRpbmcgd2Fzbid0IHBlcmZvcm1lZCBjb3JyZWN0bHksIGNyZWF0aW5nCiAgICAgICAgICB1bnBsZWFzYW50IGFydGVmYWN0cyBhdCBsYXJnZSBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZXMuCgogICAgICAgIC0gQ29tcG9zaXRlIGdseXBoIGxvYWRpbmcgaGFzIGJlZW4gc2ltcGxpZmllZC4gIFRoaXMgZ2V0cyByaWQKICAgICAgICAgIG9mIHZhcmlvdXMgYXJ0ZWZhY3RzIHdoZXJlIHRoZSBjb21wb25lbnRzIG9mIGEgY29tcG9zaXRlIGdseXBocwogICAgICAgICAgd2VyZSBub3QgY29ycmVjdGx5IHNwYWNlZC4KCiAgICAgIFRoZXNlIGFyZSB0aGUgbGFzdCBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGF1dG8taGludGluZyBtb2R1bGUuICBBIG5ldwogICAgICBoaW50aW5nIHN1Yi1zeXN0ZW0gaXMgY3VycmVudGx5IGluIHRoZSB3b3JrIGluIG9yZGVyIHRvIHN1cHBvcnQgbmF0aXZlCiAgICAgIGhpbnRzIGluIFR5cGUgMSAvIENGRiAvIE9wZW5UeXBlIGZvbnRzLCBhcyB3ZWxsIGFzIGdsb2JhbGx5IGltcHJvdmUKICAgICAgcmVuZGVyaW5nLgoKICAgIC0gVGhlIFBDRiBkcml2ZXIgaGFzIGJlZW4gZml4ZWQuICBJdCByZXBvcnRlZCBpbnZhbGlkIGdseXBoIGRpbWVuc2lvbnMKICAgICAgZm9yIHRoZSBmb250cyBhdmFpbGFibGUgb24gU29sYXJpcy4KCiAgICAtIFRoZSBUeXBlIDEsIENJRCBhbmQgQ0ZGIGRyaXZlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGZpeCB0aGUKICAgICAgY29tcHV0YXRpb24gb2YgdGhlIEVNIHNpemUuCgogICAgLSBUaGUgVHlwZSAxIGRyaXZlciBoYXMgYmVlbiBmaXhlZCB0byBhdm9pZCBhIGRhbmdlcm91cyBidWcgdGhhdAogICAgICBjcmFzaGVkIHRoZSBsaWJyYXJ5IHdpdGggbm9uLWNvbmZvcm1pbmcgZm9udHMgKGkuZS4gb25lcyB0aGF0IGRvIG5vdAogICAgICBwbGFjZSB0aGUgLm5vdGRlZiBnbHlwaCBhdCBwb3NpdGlvbiAwKS4KCiAgICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgaGFkIGEgcmF0aGVyIHN1YnRsZSBidWcgKGRhbmdsaW5nIHBvaW50ZXIgd2hlbgogICAgICBsb2FkaW5nIGNvbXBvc2l0ZSBnbHlwaHMpIHRoYXQgY291bGQgY3Jhc2ggdGhlIGxpYnJhcnkgaW4gcmFyZQogICAgICBvY2Nhc2lvbnMhCgoKICBJSS4gSElHSC1MRVZFTCBBUEkgQ0hBTkdFUwoKICAgIC0gVGhlIGVycm9yIGNvZGUgZW51bWVyYXRpb24gdmFsdWVzIGhhdmUgYmVlbiBjaGFuZ2VkLiAgQW4gZXJyb3IgdmFsdWUKICAgICAgaXMgZGVjb21wb3NlZCBpbiBhIGdlbmVyaWMgZXJyb3IgY29kZSwgYW5kIGEgbW9kdWxlIG51bWJlci4gIHNlZQogICAgICA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4gZm9yIGRldGFpbHMuCgogICAgLSBBIG5ldyBwdWJsaWMgaGVhZGVyIGZpbGUgaGFzIGJlZW4gaW50cm9kdWNlZCwgbmFtZWQgRlRfVFJJR09OT01FVFJZX0gKICAgICAgKGluY2x1ZGUvZnJlZXR5cGUvZnR0cmlnLmgpLCBwcm92aWRpbmcgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgdG8KICAgICAgY29tcHV0ZSBzaW5lcywgY29zaW5lcywgYXJjdGFuZ2VudHMsIGV0Yy4gd2l0aCAxNi4xNiBmaXhlZCBwcmVjaXNpb24uCiAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgQ09SRElDIGFsZ29yaXRobSBhbmQgaXMgdmVyeSBmYXN0CiAgICAgIHdoaWxlIGJlaW5nIHN1ZmZpY2llbnRseSBhY2N1cmF0ZS4KCgogIElJSS4gSU5URVJOQUxTCgogICAgLSBBZGRlZCBCZU9TLXNwZWNpZmljIGZpbGVzIGluIHRoZSBvbGQgYnVpbGQgc3ViLXN5c3RlbS4gIE5vdGUgdGhhdAogICAgICBubyBjaGFuZ2VzIHdlcmUgcmVxdWlyZWQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIEphbS4KCiAgICAtIFRoZSBjb25maWd1cmF0aW9uIGlzIG5vdyBjYXBhYmxlIG9mIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIDY0LWJpdAogICAgICBpbnRlZ2VycyBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNvbXBpbGVycyAoR0NDLCBWaXN1YWwgQysrLCBCb3JsYW5kCiAgICAgIEMrKykgYW5kIHdpbGwgdXNlIHRoZW0gYnkgZGVmYXVsdC4gIFRoaXMgcHJvdmlkZXMgYSBzbWFsbCBwZXJmb3JtYW5jZQogICAgICBib29zdC4KCiAgICAtIEEgc21hbGwgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIG9wZW5pbmcgMC1zaXplZCBmaWxlcyAoZHVoISkKICAgICAgaGF2ZSBiZWVuIGZpeGVkLgoKICAgIC0gRml4ZWQgYmV6aWVyIHN0YWNrIGRlcHRoIGJ1ZyBpbiB0aGUgcm91dGluZXMgcHJvdmlkZWQgYnkgdGhlCiAgICAgIEZUX0JCT1hfSCBoZWFkZXIgZmlsZS4gIEFsc28gZml4ZWQgc2ltaWxhciBidWdzIGluIHRoZSByYXN0ZXJpemVycy4KCiAgICAtIFRoZSBvdXRsaW5lIGJvdW5kaW5nIGJveCBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiB0byB1c2UgZGlyZWN0CiAgICAgIGNvbXB1dGF0aW9ucywgaW5zdGVhZCBvZiBiZXppZXIgc3ViLWRpdmlzaW9uLCB0byBjb21wdXRlIHRoZSBleGFjdAogICAgICBib3VuZGluZyBib3ggb2YgZ2x5cGhzLiAgVGhpcyBpcyBzbGlnaHRseSBzbG93ZXIgYnV0IG1vcmUgYWNjdXJhdGUuCgogICAgLSBUaGUgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIGltcHJvdmVkIGFuZCBmaXhlZCwgbWFpbmx5IHRvIHN1cHBvcnQgIm1ha2UiCiAgICAgIG9uIFdpbmRvd3MgMjAwMCBjb3JyZWN0bHksIGF2b2lkIHByb2JsZW1zIHdpdGggIm1ha2UgZGlzdGNsZWFuIiBvbiBub24KICAgICAgVW5peCBzeXN0ZW1zLCBldGMuCgogICAgLSBIZXhhZGVjaW1hbCBjb25zdGFudHMgaGF2ZSBiZWVuIHN1ZmZpeGVkIHdpdGggIlUiIHRvIGF2b2lkIHByb2JsZW1zCiAgICAgIHdpdGggY2VydGFpbiBjb21waWxlcnMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCiAgICAtIEEgbmV3IGRpcmVjdG9yeSBuYW1lZCAic3JjL3Rvb2xzIiBoYXMgYmVlbiBjcmVhdGVkLiAgSXQgY29udGFpbnMKICAgICAgUHl0aG9uIHNjcmlwdHMgYW5kIHNpbXBsZSB1bml0IHRlc3QgcHJvZ3JhbXMgdXNlZCB0byBkZXZlbG9wIHRoZQogICAgICBsaWJyYXJ5LgoKICAgIC0gVGhlIERvY01ha2VyIHRvb2wgaGFzIGJlZW4gbW92ZWQgZnJvbSAiZG9jcyIgdG8gInNyYy90b29scyIgYW5kCiAgICAgIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgLSBOb3cgYWNjZXB0cyB0aGUgIi0tdGl0bGU9WFhYWCIgb3IgIi10IFhYWFgiIG9wdGlvbiBmcm9tIHRoZQogICAgICAgICAgIGNvbW1hbmQgbGluZSB0byBzZXQgdGhlIHByb2plY3QncyBuYW1lIGluIHRoZSBnZW5lcmF0ZWQgQVBJCiAgICAgICAgICAgcmVmZXJlbmNlLgoKICAgICAgICAgLSBOb3cgYWNjZXB0cyB0aGUgIi0tb3V0cHV0PURJUiIgb3IgIi1vIERJUiIgb3B0aW9uIGZyb20gdGhlCiAgICAgICAgICAgY29tbWFuZCBsaW5lIHRvIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYWxsIGdlbmVyYXRlZCBIVE1MCiAgICAgICAgICAgZmlsZXMuCgogICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSAiLS1wcmVmaXg9WFhYWCIgb3IgIi1wIFhYWCIgb3B0aW9uIGZyb20gdGhlCiAgICAgICAgICAgY29tbWFuZCBsaW5lIHRvIHNldCB0aGUgZmlsZSBwcmVmaXggdG8gdXNlIGZvciBhbGwgZ2VuZXJhdGVkIEhUTUwKICAgICAgICAgICBmaWxlcy4KCiAgICAgICAgIC0gTm93IGdlbmVyYXRlcyB0aGUgY3VycmVudCB0aW1lL2RhdGEgb24gZWFjaCBnZW5lcmF0ZWQgcGFnZQogICAgICAgICAgIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmVyc2lvbnMuCgogICAgICBEb2NNYWtlciBjYW4gYmUgdXNlZCB3aXRoIG90aGVyIHByb2plY3RzIG5vdywgbm90IG9ubHkgRlQyIChlLmcuIE1MaWIsCiAgICAgIEZUTGF5b3V0LCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuMiBhbmQgMi4wLjEKCgogIEkuIENIQU5HRVMgVE8gVEhFIE1PRFVMRVMgLyBGT05UIERSSVZFUlMKCiAgICAtIFRIRSBUUlVFVFlQRSBCWVRFQ09ERSBJTlRFUlBSRVRFUiBJUyBOT1cgVFVSTkVEIE9GRiwgaW4gb3JkZXIgdG8KICAgICAgYXZvaWQgbGVnYWwgcHJvYmxlbXMgIHdpdGggdGhlIEFwcGxlIHBhdGVudHMuICBJdCAgc2VlbXMgdGhhdCB3ZQogICAgICBtaXN0YWtlbmx5ICB0dXJuZWQgdGhpcyBvcHRpb24gIG9uIGluICBwcmV2aW91cyByZWxlYXNlcyAgb2YgdGhlCiAgICAgIGJ1aWxkLgoKICAgICAgTm90ZSB0aGF0IGlmICB5b3Ugd2FudCB0byB1c2UgdGhlICBieXRlY29kZSBpbnRlcnByZXRlciBpbiBvcmRlcgogICAgICB0byBnZXQgaGlnaC1xdWFsaXR5IFRydWVUeXBlICByZW5kZXJpbmcsIHlvdSB3aWxsIG5lZWQgdG8gdG9nZ2xlCiAgICAgIGJ5ICAgICAgICBoYW5kICAgICAgICB0aGUgICAgICAgIGRlZmluaXRpb24gICAgICAgIG9mICAgICAgICB0aGUKICAgICAgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiAgIG1hY3JvICAgIGluICAgdGhlICAgZmlsZQogICAgICAiaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCIuCgogICAgLSBUaGUgQ0ZGIGRyaXZlciBoYXMgYmVlbiBpbXByb3ZlZCBieSBUb20gS2Fjdmluc2t5IGFuZCBTYW5kZXIgdmFuCiAgICAgIGRlciBXYWw6CgogICAgICAqIFN1cHBvcnQgZm9yICJzZWFjIiBlbXVsYXRpb24uCiAgICAgICogU3VwcG9ydCBmb3IgImRvdHNlY3Rpb24iLgogICAgICAqIFN1cHBvcnQgZm9yIHJldHJpZXZpbmcgZ2x5cGggbmFtZXMgdGhyb3VnaAogICAgICAgICJGVF9HZXRfR2x5cGhfTmFtZSIuCgogICAgICBUaGUgZmlyc3QgdHdvIGl0ZW1zIGFyZSBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IGEgbGFyZ2UgbnVtYmVyIG9mCiAgICAgIFR5cGUgMSBmb250cyBjb252ZXJ0ZWQgdG8gdGhlIENGRiBmb3JtYXRzIGJ5IEFkb2JlIEFjcm9iYXQuCgogICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3YXMgYWxzbyBpbXByb3ZlZCBieSBUb20gJiBvdGhlcnM6CgogICAgICAqIEJldHRlciBFTSBzaXplIGNvbXB1dGF0aW9uLgogICAgICAqIEJldHRlciBzdXBwb3J0IGZvciBzeW50aGV0aWMgKHRyYW5zZm9ybWVkKSBmb250cy4KICAgICAgKiBUaGUgIFR5cGUgMSAgZHJpdmVyIHJldHVybnMgIHRoZSBjaGFyc3RyaW5ncyAgY29ycmVzcG9uZGluZyB0bwogICAgICAgIGVhY2ggZ2x5cGggaW4gdGhlICAiZ2x5cGgtPmNvbnRyb2xfZGF0YSIgZmllbGQgYWZ0ZXIgYSBjYWxsIHRvCiAgICAgICAgIkZUX0xvYWRfR2x5cGgiICh0aGFua3MgSGEgU2hhbykuCgogICAgLSBWYXJpb3VzIG90aGVyIGJ1Z2ZpeGVzLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKCiAgICAgICogRml4ZWQgYSBuYXN0eSBtZW1vcnkgbGVhayBpbiB0aGUgVHlwZSAxIGRyaXZlci4KICAgICAgKiBUaGUgYXV0b2hpbnRlciAgYW5kIHRoZSBwY2YgIGRyaXZlciB1c2VkIHN0YXRpYyAgd3JpdGFibGUgZGF0YQogICAgICAgIHdoZW4gdGhleSBzaG91bGRuJ3QuCiAgICAgICogTWFueSBjYXN0cyB3ZXJlIGFkZGVkIHRvICBtYWtlIHRoZSBjb2RlIG1vcmUgNjQtYml0cyBzYWZlLiAgSXQKICAgICAgICBhbHNvIG5vdyBjb21waWxlcyBvbiBXaW5kb3dzIFhQIDY0LWJpdHMgd2l0aG91dCB3YXJuaW5ncy4KICAgICAgKiBTb21lIGluY29ycmVjdCB3cml0YWJsZSBzdGF0aWNzIHdlcmUgcmVtb3ZlZCBpbiB0aGUgImF1dG9oaW50IgogICAgICAgIGFuZCAicGNmIiBkcml2ZXJzLiAgRnJlZVR5cGUgMiBub3cgY29tcGlsZXMgb24gRXBvYyBhZ2Fpbi4KCgogIElJLiBDSEFOR0VTIFRPIFRIRSBISUdILUxFVkVMIEFQSQoKICAgIC0gVGhlIGxpYnJhcnkgaGVhZGVyIGZpbGVzIGluY2x1c2lvbiBzY2hlbWUgaGFzIGJlZW4gY2hhbmdlZC4gIFRoZQogICAgICBvbGQgc2NoZW1lIGxvb2tlZCBsaWtlOgoKICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NhY2hlL2Z0aW1hZ2UuaD4KCiAgICAgIE5vdyB5b3Ugc2hvdWxkIHVzZToKCiAgICAgICAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAgICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAogICAgICAgICNpbmNsdWRlIEZUX0dMWVBIX0gKICAgICAgICAjaW5jbHVkZSBGVF9DQUNIRV9ICiAgICAgICAgI2luY2x1ZGUgRlRfQ0FDSEVfSU1BR0VfSAoKICAgICAgTk9URSBUSEFUICBUSEUgT0xEICBJTkNMVVNJT04gU0NIRU1FIFdJTEwgIFNUSUxMIFdPUksgIFdJVEggVEhJUwogICAgICBSRUxFQVNFLiAgSE9XRVZFUiwgV0UgIERPIE5PVCBHVUFSQU5URUUgVEhBVCBUSElTICBXSUxMIFNUSUxMIEJFCiAgICAgIFRSVUUgSU4gVEhFIE5FWFQgT05FIChBLksuQS4gRlJFRVRZUEUgMi4xKS4KCiAgICAgIFRoZSAgZmlsZSA8ZnQyYnVpbGQuaD4gIGlzIHVzZWQgIHRvIGRlZmluZSAgdGhlICBoZWFkZXIgZmlsZW5hbWUKICAgICAgbWFjcm9zLiAgVGhlIGNvbXBsZXRlIGFuZCAgY29tbWVudGVkIGxpc3Qgb2YgbWFjcm9zIGlzIGF2YWlsYWJsZQogICAgICBpbiB0aGUgQVBJIHJlZmVyZW5jZSB1bmRlciB0aGUgc2VjdGlvbiBuYW1lICJIZWFkZXIgRmlsZSBNYWNyb3MiCiAgICAgIGluIENoYXB0ZXIgSS4KCiAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgc2VjdGlvbiBJIG9mIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQ6CgogICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnLwogICAgICAgICAgZnJlZXR5cGUyL2RvY3MvdHV0b3JpYWwvc3RlcDEuaHRtbAoKICAgICAgb3IKCiAgICAgICAgaHR0cDovL2ZyZWV0eXBlLnNvdXJjZWZvcmdlLm5ldC8KICAgICAgICAgIGZyZWV0eXBlMi9kb2NzL3R1dG9yaWFsL3N0ZXAxLmh0bWwKCiAgICAtIE1hbnksIG1hbnkgY29tbWVudHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBwdWJsaWMgc291cmNlIGZpbGUgaW4KICAgICAgb3JkZXIgdG8gIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgIHRoZSBBUEkgUmVmZXJlbmNlICB0aHJvdWdoIHRoZQogICAgICAiZG9jbWFrZXIucHkiIFB5dGhvbiBzY3JpcHQuCgogICAgICBUaGUgbGF0dGVyIGhhcyBiZWVuIHVwZGF0ZWQgIHRvIHN1cHBvcnQgdGhlIGdyb3VwaW5nIG9mIHNlY3Rpb25zCiAgICAgIGluIGNoYXB0ZXJzIGFuZCBiZXR0ZXIgaW5kZXggc29ydC4gIFNlZToKCiAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL2RvY3MvcmVmZXJlbmNlL2Z0Mi10b2MuaHRtbAoKCiAgSUlJLiBDSEFOR0VTIFRPIFRIRSBCVUlMRCBQUk9DRVNTCgogICAgLSBJZiB5b3UgIGFyZSBub3QgIGJ1aWxkaW5nIEZyZWVUeXBlIDIgIHdpdGggaXRzIG93biAgYnVpbGQgc3lzdGVtCiAgICAgIChidXQgd2l0aCB5b3VyIG93biBNYWtlZmlsZXMgb3IgcHJvamVjdCBmaWxlcyksIHlvdSB3aWxsIG5lZWQgdG8KICAgICAgYmUgIGF3YXJlIHRoYXQgIHRoZSAgYnVpbGQgIHByb2Nlc3MgaGFzICBjaGFuZ2VkICBhIGxpdHRsZSAgYml0LgoKICAgICAgWW91IGRvbid0ICBuZWVkIHRvIHB1dCB0aGUgICJzcmMiIGRpcmVjdG9yeSBpbiAgdGhlIGluY2x1ZGUgcGF0aAogICAgICB3aGVuICBjb21waWxpbmcgIGFueSBGVDIgIGNvbXBvbmVudC4gICBJbnN0ZWFkLCAgc2ltcGx5IHB1dCAgdGhlCiAgICAgIGNvbXBvbmVudCdzIGRpcmVjdG9yeSBpbiB0aGUgY3VycmVudCBpbmNsdWRlIHBhdGguCgogICAgICBTbywgaWYgeW91IHdlcmUgZG9pbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgIGNjIC1jIC1JaW5jbHVkZSAtSXNyYyBzcmMvYmFzZS9mdGJhc2UuYwoKICAgICAgY2hhbmdlIHRoZSBsaW5lIHRvOgoKICAgICAgICBjYyAtYyAtSWluY2x1ZGUgLUlzcmMvYmFzZSBzcmMvYmFzZS9mdGJhc2UuYwoKICAgICAgSWYgeW91IHdlcmUgZG9pbmcgc29tZXRoaW5nIGxpa2U6CgogICAgICAgIGNkIHNyYy9iYXNlCiAgICAgICAgY2MgLWMgLUkuLi8uLi9pbmNsdWRlIC1JLi4gZnRiYXNlLmMKCiAgICAgIGNoYW5nZSBpdCB0bzoKCiAgICAgICAgY2Qgc3JjL2Jhc2UKICAgICAgICBjYyAtYyAtSS4uLy4uL2luY2x1ZGUgZnRiYXNlLmMKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC4xIGFuZCAyLjAKCiAgMi4wLjEgaW50cm9kdWNlcyBhIGZldyBjaGFuZ2VzOgoKICAgIC0gRml4ZWQgbWFueSBidWdzIHJlbGF0ZWQgdG8gIHRoZSBzdXBwb3J0IG9mIENGRiAvIE9wZW5UeXBlIGZvbnRzLgogICAgICBUaGVzZSAgZm9ybWF0cyBhcmUgIG5vdyBtdWNoICBiZXR0ZXIgc3VwcG9ydGVkICB0aG91Z2ggIHRoZXJlIGlzCiAgICAgIHN0aWxsIHdvcmsgcGxhbm5lZCB0byAgZGVhbCB3aXRoIGNoYXJzZXQgdGFibGVzIGFuZCBQREYtZW1iZWRkZWQKICAgICAgQ0ZGIGZpbGVzIHRoYXQgdXNlIHRoZSBvbGQgInNlYWMiIGNvbW1hbmQuCgogICAgLSBUaGUgIGxpYnJhcnkgY291bGQgbm90ICBiZSBjb21waWxlZCAgaW4gZGVidWcgIG1vZGUgd2l0aCAgYSB2ZXJ5CiAgICAgIHNtYWxsICBudW1iZXIgICBvZiAgQyAgY29tcGlsZXJzICAgd2hvc2UgIHByZS1wcm9jZXNzb3JzICBkaWRuJ3QKICAgICAgaW1wbGVtZW50IHRoZSAiIyMiICBkaXJlY3RpdmUgY29ycmVjdGx5IChpLmUuIHBlciBzZSAgdGhlIEFOU0kgQwogICAgICBzcGVjaWZpY2F0aW9uISkgIEFuIGVsZWdhbnQgZml4IHdhcyBmb3VuZC4KCiAgICAtIEFkZGVkICBzdXBwb3J0IGZvciAgdGhlICBmcmVlIEJvcmxhbmQgIGNvbW1hbmQtbGluZSBDKysgIEJ1aWxkZXIKICAgICAgY29tcGlsZXIuICAgVXNlICJtYWtlICBzZXR1cCBiY2MzMiIuICAgQWxzbyBmaXhlZCAgYSAgZmV3IHNvdXJjZQogICAgICBsaW5lcyB0aGF0IGdlbmVyYXRlZCBuZXcgd2FybmluZ3Mgd2l0aCBCQ0MzMi4KCiAgICAtIEZpeGVkIGEgYnVnIGluIEZUX091dGxpbmVfR2V0X0JCb3ggd2hlbiBjb21wdXRpbmcgdGhlIGV4dHJlbWEgb2YKICAgICAgYSBjb25pYyBCZXppZXIgYXJjLgoKICAgIC0gVXBkYXRlZCB0aGUgSU5TVEFMTCBmaWxlIHRvIGFkZCBJREUgY29tcGlsYXRpb24uCgogICAgLSBPdGhlciAgbWlub3IgYnVnICBmaXhlcywgIGZyb20gIGludmFsaWQgVHlwZSAgMSAgc3R5bGUgZmxhZ3MgIHRvCiAgICAgIGNvcnJlY3QgICBzdXBwb3J0ICAgb2YgIHN5bnRoZXRpYyAgIChvYmxpcXVlZCkgICBmb250cyAgaW4gICB0aGUKICAgICAgYXV0by1oaW50ZXIsIGJldHRlciBzdXBwb3J0IGZvciBlbWJlZGRlZCBiaXRtYXBzIGluIGEgU0ZOVCBmb250LgoKICAgIC0gRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoICJmcmVldHlwZS1jb25maWciLgoKICBGaW5hbGx5LCB0aGUgInN0YW5kYXJkIiBzY2hlbWUgZm9yIGluY2x1ZGluZyBGcmVlVHlwZSBoZWFkZXJzIGlzIG5vdwogIGdyYWR1YWxseSBjaGFuZ2luZywgIGJ1dCB0aGlzIHdpbGwgIGJlIGV4cGxhaW5lZCBpbiBhICBsYXRlciByZWxlYXNlCiAgKHByb2JhYmx5IDIuMC4yKS4KCiAgQW5kIHZlcnkgIHNwZWNpYWwgdGhhbmtzIHRvIFRvbSBLYWN2aW5za3kgIGFuZCBZQU1BTk8tVUNISSBIaWRldG9zaGkKICBmb3IgdGhlaXIgY29udHJpYnV0aW9ucyEKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpDSEFOR0VTIEJFVFdFRU4gYmV0YTggYW5kIDIuMAoKICAtIENoYW5nZWQgIHRoZSBkZWZhdWx0ICBpbnN0YWxsYXRpb24gIHBhdGggZm9yICBwdWJsaWMgaGVhZGVycyAgZnJvbQogICAgImluY2x1ZGUvZnJlZXR5cGUiIHRvICJpbmNsdWRlL2ZyZWV0eXBlMiIuCgogICAgQWxzbyBhZGRlZCBhIG5ldyAiZnJlZXR5cGUtY29uZmlnIiB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICBhbmQgaW5zdGFsbGVkICBvbiBVbml4IGFuZCAgQ3lnd2luIHN5c3RlbXMuICBUaGUgc2NyaXB0ICBpdHNlbGYgaXMKICAgIHVzZWQgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgIGluc3RhbGwgcGF0aCwgQyBjb21waWxhdGlvbiBmbGFncyBhcwogICAgd2VsbCBhcyBsaW5rZXIgZmxhZ3MuCgogIC0gRml4ZWQgc2V2ZXJhbCBzbWFsbCBidWdzOgoKICAgICogSW5jb3JyZWN0IG1heCBhZHZhbmNlIHdpZHRoIGZvciBmaXhlZC1waXRjaCBUeXBlIDEgZm9udHMuCiAgICAqIEluY29ycmVjdCBnbHlwaCBuYW1lcyBmb3IgY2VydGFpbiBUcnVlVHlwZSBmb250cy4KICAgICogVGhlICBnbHlwaCBhZHZhbmNlICB3YXMgbm90ICBjb3BpZWQgd2hlbiAgRlRfR2x5cGhfVG9fQml0bWFwIHdhcwogICAgICBjYWxsZWQuCiAgICAqIFRoZSAgbGluZWFySG9yaUFkdmFuY2UgIGFuZCAgbGluZXJWZXJ0QWR2YW5jZSAgZmllbGRzICB3ZXJlICBub3QKICAgICAgY29ycmVjdGx5IHJldHVybmVkIGZvciBnbHlwaHMgcHJvY2Vzc2VkIGJ5IHRoZSBhdXRvLWhpbnRlci4KICAgICogInR5cGUxeiIgIHJlbmFtZWQgYmFjayB0byAgInR5cGUxIjsgdGhlICBvbGQgInR5cGUxIiAgbW9kdWxlIGhhcwogICAgICBiZWVuIHJlbW92ZWQuCgogIC0gUmV2YW1wZWQgdGhlICBidWlsZCBzeXN0ZW0gIHRvIG1ha2UgaXQgIGEgbG90IG1vcmUgIGdlbmVyaWMuICBUaGlzCiAgICB3aWxsICBhbGxvdyB1cyAgdG8gIHJlLXVzZSAgbmVhcmx5IHVuLW1vZGlmaWVkICBpbiAgbG90cyBvZiAgb3RoZXIKICAgIHByb2plY3RzIChpbmNsdWRpbmcgRnJlZVR5cGUgTGF5b3V0KS4KCiAgLSBDaGFuZ2VkICJjaWQiIHRvIHVzZSAicHNhdXgiIHRvby4KCiAgLSBBZGRlZCB0aGUgIGNhY2hlIHN1Yi1zeXN0ZW0uICBTZWUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4gIGFzIHdlbGwgYXMKICAgIHRoZSBzb3VyY2VzICBpbiAic3JjL2NhY2hlIi4gIE5vdGUgIHRoYXQgaXQgY29tcGlsZXMgYnV0ICBpcyBzdGlsbAogICAgdW50ZXN0ZWQgZm9yIG5vdy4KCiAgLSBVcGRhdGVkICJkb2NzL2RvY21ha2VyLnB5IiwgYSBkcmFmdCAgQVBJIHJlZmVyZW5jZSBpcyBhdmFpbGFibGUgYXQKICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2Z0MmFwaS5odG1sLgoKICAtIENoYW5nZWQgInR5cGUxIiB0byB1c2UgInBzYXV4Ii4KCiAgLSBDcmVhdGVkIGEgIG5ldyBtb2R1bGUgbmFtZWQgICJwc2F1eCIgdG8gaG9sZCAgdGhlIFR5cGUgMSAmICBUeXBlIDIKICAgIHBhcnNpbmcgcm91dGluZXMuICBJdCBzaG91bGQgYmUgIHVzZWQgYnkgInR5cGUxIiwgImNpZCIsIGFuZCAiY2ZmIgogICAgaW4gdGhlIGZ1dHVyZS4KCiAgLSBGaXhlZCBhbiBpbXBvcnRhbnQgYnVnIGluICJGVF9HbHlwaF9HZXRfQ0JveCIuCgogIC0gRml4ZWQgIHNvbWUgY29tcGlsZXIgIHdhcm5pbmdzICB0aGF0IGhhcHBlbmVkICBzaW5jZSB0aGUgIFRydWVUeXBlCiAgICBieXRlY29kZSBkZWNvZGVyIHdhcyBkZWFjdGl2YXRlZCBieSBkZWZhdWx0LgoKICAtIEZpeGVkIHR3byBtZW1vcnkgbGVha3M6CgogICAgKiBUaGUgICAgbWVtb3J5ICAgbWFuYWdlciAgICgxNiAgICBieXRlcykgICBpc24ndCAgICByZWxlYXNlZCAgIGluCiAgICAgIEZUX0RvbmVfRnJlZVR5cGUhCiAgICAqIFVzaW5nIGN1c3RvbSBpbnB1dCBzdHJlYW1zLCB0aGUgIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHN0cmVhbSB3YXMKICAgICAgbmV2ZXIgcmVsZWFzZWQuCgogIC0gRml4ZWQgdGhlICBhdXRvLWhpbnRlciBieSBwZXJmb3JtaW5nIGF1dG9tYXRpYyAgY29tcHV0YXRpb24gb2YgdGhlCiAgICAiZmlsbGluZyBkaXJlY3Rpb24iIG9mIGVhY2ggZ2x5cGguICAgVGhpcyBpcyBkb25lIHRocm91Z2ggYSBzaW1wbGUKICAgIGFuZCAgZmFzdCBhcHByb3hpbWF0aW9uLCBhbmQgIHNlZW1zIHRvICB3b3JrIChwcm9ibGVtcyAgc3BvdHRlZCBieQogICAgV2VybmVyIHRob3VnaCkuICBUaGUgQXJwaGljIGZvbnRzIGFyZSBhIGxvdCBuaWNlciB0aG91Z2ggdGhlcmUgYXJlCiAgICBzdGlsbCBhIGxvdCBvZiB0aGluZ3MgdG8gZG8gdG8gaGFuZGxlIEFzaWFuIGZvbnRzIGNvcnJlY3RseS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpCRVRBLTggKFJFTEVBU0UgQ0FORElEQVRFKSBDSEFOR0VTCgogIC0gRGVhY3RpdmF0ZWQgdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIGJ5IGRlZmF1bHQuCgogIC0gRGVhY3RpdmF0ZWQgdGhlICJzcmMvdHlwZTEiIGZvbnQgZHJpdmVyLiAgTm93ICJzcmMvdHlwZTF6IiBpcyB1c2VkCiAgICBieSBkZWZhdWx0LgoKICAtIFVwZGF0ZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gIFdlIG5vdyBjb21waWxlIHRoZSBsaWJyYXJ5IGNvcnJlY3RseQogICAgdW5kZXIgIFVuaXggIHN5c3RlbSAgdGhyb3VnaCAgImNvbmZpZ3VyZSIgd2hpY2ggIGlzICBhdXRvbWF0aWNhbGx5CiAgICBjYWxsZWQgb24gdGhlIGZpcnN0ICJtYWtlIiBpbnZvY2F0aW9uLgoKICAtIEFkZGVkIHRoZSBhdXRvLWhpbnRpbmcgbW9kdWxlISAgRml4aW5nIHNvbWUgYnVncyBoZXJlIGFuZCB0aGVyZS4KCiAgLSBGb3VuZCBzb21lIGJ1Z3MgaW4gdGhlICBjb21wb3NpdGUgbG9hZGVyIChzZWFjKSBvZiB0aGUgVHlwZTEtYmFzZWQKICAgIGZvbnQgZHJpdmVycy4KCiAgLSBSZW5hbWVkIHRoZSBkaXJlY3RvcnkgImZyZWV0eXBlMi9jb25maWciIHRvICJmcmVldHlwZTIvYnVpbGRzIiBhbmQKICAgIHVwZGF0ZWQgYWxsIHJlbGV2YW50IGZpbGVzLgoKICAtIEZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlICJ0eXBlMSIgZHJpdmVyLgoKICAtIEluY29ycG9yYXRlZCBUb20ncyBwYXRjaGVzIHRvICBzdXBwb3J0IGZsZXggb3BlcmF0b3JzIGNvcnJlY3RseSBpbgogICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgTm93IGFsbCBJIG5lZWQgaXMgdG8gc3VwcG9ydCBwdXJlIENGRiBhbmQgQ0VGCiAgICBmb250cyB0byBiZSBkb25lIHdpdGggdGhpcyBkcml2ZXIgOi0pCgogIC0gQWRkZWQgdGhlICBXaW5kb3dzIEZOVC9GT04gZHJpdmVyIGluICJzcmMvd2luZm9udHMiLiAgIEZvciBub3csIGl0CiAgICBhbHdheXMgICJzaW11bGF0ZXMiICAgYSAgVW5pY29kZSAgY2hhcm1hcCwgIHNvICAgaXQgIHNob3VsZG4ndCAgYmUKICAgIGNvbnNpZGVyZWQgY29tcGxldGVkIHJpZ2h0IG5vdy4KCiAgICBJdCAgaXMgdGhlcmUgIHRvIGJlICBtb3JlIGEgIHByb29mIG9mICBjb25jZXB0IHRoYW4gIGFueXRoaW5nIGVsc2UKICAgIGFueXdheS4gIFRoZSBkcml2ZXIgaXMgYSBzaW5nbGUgIEMgc291cmNlIGZpbGUsIHRoYXQgY29tcGlsZXMgdG8gMwogICAgS2Igb2YgY29kZS4KCiAgICBJJ20gIHN0aWxsIHdvcmtpbmcgb24gIHRoZSBQQ0YvQkRGICBkcml2ZXJzLCBidXQgIEknbSB0b28gIGxhenkgdG8KICAgIGZpbmlzaCB0aGVtIG5vdy4KCiAgLSBDSEFOR0VTIFRPIFRIRSBISUdILUxFVkVMIEFQSQoKICAgICogRlRfR2V0X0tlcm5pbmcgaGFzIGEgbmV3IHBhcmFtZXRlciB0aGF0IGFsbG93cyB5b3UgdG8gc2VsZWN0IHRoZQogICAgICBjb29yZGluYXRlcyBvZiB0aGUga2VybmluZyAgdmVjdG9yIChmb250IHVuaXRzLCBzY2FsZWQsIHNjYWxlZCArCiAgICAgIGdyaWQtZml0dGVkKS4KICAgICogVGhlICBvdXRsaW5lIGZ1bmN0aW9ucyBhcmUgIG5vdyBpbiA8ZnJlZXR5cGUvZnRvdXRsbi5oPiAgYW5kIG5vdAogICAgICBwYXJ0IG9mIDxmcmVldHlwZS9mcmVldHlwZS5oPiBhbnltb3JlLgogICAgKiA8ZnJlZXR5cGUvZnRtb2R1bGUuaD4gICAgbm93ICAgICBjb250YWlucyAgICBkZWNsYXJhdGlvbnMgICAgZm9yCiAgICAgICBGVF9OZXdfTGlicmFyeSwgRlRfRG9uZV9MaWJyYXJ5LCBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzLgogICAgKiBUaGUgc28tY2FsbGVkIGNvbnZlbmllbmNlICBmdW5jdGlvbnMgaGF2ZSBtb3ZlZCBmcm9tICJmdG91dGxuLmMiCiAgICAgIHRvICAiZnRnbHlwaC5jIiwgIGFuZCAgYXJlICB0aHVzIGF2YWlsYWJsZSAgd2l0aCAgdGhpcyAgb3B0aW9uYWwKICAgICAgY29tcG9uZW50ICAgIG9mICAgdGhlICAgbGlicmFyeS4gICAgIFRoZXkgICBhcmUgICAgZGVjbGFyZWQgICBpbgogICAgICA8ZnJlZXR5cGUvZnRnbHlwaC5oPiBub3cuCiAgICAqIEFudGktYWxpYXNlZCAgcmVuZGVyaW5nIGlzIG5vdyAgdGhlIGRlZmF1bHQgIGZvciBGVF9SZW5kZXJfR2x5cGgKICAgICAgKGkuZS4gY29ycmVzcG9uZHMgdG8gcmVuZGVyX21vZGUgPT0gMCA9PSBmdF9yZW5kZXJfbW9kZV9ub3JtYWwpLgogICAgICBUbyBnZW5lcmF0ZSBhIG1vbm9jaHJvbWUgYml0bWFwLCB1c2UgZnRfcmVuZGVyX21vZGVfbW9ubywgb3IgdGhlCiAgICAgIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgZmxhZyAgICBpbiAgICBGVF9Mb2FkX0dseXBoL0ZUX0xvYWRfQ2hhci4KICAgICAgRlRfTE9BRF9BTlRJX0FMSUFTIGlzIHN0aWxsIGRlZmluZWQsIGJ1dCB2YWx1ZXMgdG8gMC4KICAgICogPGZyZWV0eXBlL2ZyZWV0eXBlLmg+ICBub3cgaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+LAogICAgICBzb2x2aW5nIGEgZmV3IGhlYWRhY2hlcyA6LSkKICAgICogVGhlIHR5cGUgRlRfR2x5cGhTbG90UmVjIGhhcyBub3cgYSAibGlicmFyeSIgZmllbGQuCgogIC0gQ0hBTkdFUyBUTyBUSEUgImZ0Z2x5cGguaCIgQVBJCgogICAgVGhpcyBBUEkgaGFzICBiZWVuIHNldmVyZWx5IG1vZGlmaWVkIGluIG9yZGVyICB0byBtYWtlIGl0IHNpbXBsZXIsCiAgICBjbGVhcmVyLCBhbmQgbW9yZSAgZWZmaWNpZW50LiAgSXQgY2VydGFpbmx5IG5vdyBsb29rcyAgbGlrZSBhIHJlYWwKICAgICJnbHlwaCBmYWN0b3J5IiAgb2JqZWN0LCBhbmQgYWxsb3dzIGNsaWVudCAgYXBwbGljYXRpb25zIHRvIG1hbmFnZQogICAgKGkuZS4gIHRyYW5zZm9ybSwgIGJib3ggIGFuZCAgcmVuZGVyKSBnbHlwaCAgaW1hZ2VzICB3aXRob3V0ICBldmVyCiAgICBrbm93aW5nIHRoZWlyIG9yaWdpbmFsIGZvcm1hdC4KCiAgLSBBZGRlZCAgc3VwcG9ydCAgZm9yIENJRC1rZXllZCAgZm9udHMgIHRvICB0aGUgIENGRiBkcml2ZXIuICAgTWF5YmUKICAgIHN1cHBvcnQgZm9yIHB1cmUgQ0ZGICsgQ0VGIGZvbnRzIHNob3VsZCBjb21lIGluPwoKICAtIENsZWFuZWQgdXAgIHNvdXJjZSBjb2RlIGluIG9yZGVyICB0byBhdm9pZCB0d28gIGZ1bmN0aW9ucyB3aXRoIHRoZQogICAgc2FtZSBuYW1lLiAgQWxzbyAgY2hhbmdlZCB0aGUgbmFtZXMgb2YgdGhlICBmaWxlcyBpbiAidHlwZTF6IiBmcm9tCiAgICAidDFYWFhYIiB0byAiejFYWFhYIiBpbiBvcmRlciB0byBhdm9pZCBhbnkgY29uZmxpY3RzLgoKICAgICJtYWtlIG11bHRpIiBub3cgd29ya3Mgd2VsbCA6LSkKCiAgICBBbHNvIHJlbW92ZWQgdGhlIHVzZSBvZiAiY2lkYWZtIiBmb3Igbm93LCBldmVuIGlmIHRoZSBzb3VyY2UgZmlsZXMKICAgIGFyZSAgc3RpbGwgdGhlcmUuICBUaGlzICBmdW5jdGlvbmFsaXR5IHdpbGwgIGNlcnRhaW5seSAgZ28gaW50byAgYQogICAgc3BlY2lmaWMgbW9kdWxlLgoKICAtIEFEREVEIFNVUFBPUlQgRk9SIFRIRSBBVVRPLUhJTlRFUgoKICAgIEl0ICB3b3JrcyA6LSkgSSAgaGF2ZSBhICBkZW1vIHByb2dyYW0gIHdoaWNoIHNpbXBseSAgaXMgYSAgY29weSBvZgogICAgImZ0dmlldyIgICAgICAgdGhhdCAgICAgIGRvZXMgICAgICAgYSAgICAgIGBGVF9BZGRfTW9kdWxlKGxpYnJhcnksCiAgICAmYXV0b2hpbnRlcl9tb2R1bGVfY2xhc3MpJyBhZnRlciAgbGlicmFyeSBpbml0aWFsaXphdGlvbiwgYW5kIFR5cGUKICAgIDEgJiBPcGVuVHlwZS9DRkYgZm9udHMgYXJlIG5vdyBoaW50ZWQuCgogICAgQ0lEICBmb250cyBhcmUgIG5vdCBoaW50ZWQsICBhcyB0aGV5ICBpbmNsdWRlIG5vICBjaGFybWFwICBhbmQgdGhlCiAgICBhdXRvLWhpbnRlciBkb2Vzbid0IGluY2x1ZGUgICJnZW5lcmljIiBnbG9iYWwgbWV0cmljcyBjb21wdXRhdGlvbnMKICAgIHlldC4KCiAgICBOb3csIEkgbmVlZCB0byByZWxlYXNlIHRoaXMgdGhpbmcgdG8gdGhlIEZyZWVUeXBlIDIgc291cmNlLgoKICAtIENIQU5HRVMgVE8gVEhFIFJFTkRFUkVSIE1PRFVMRVMKCiAgICBUaGUgIG1vbm9jaHJvbWUgIGFuZCBzbW9vdGggIHJlbmRlcmVycyAgYXJlICBub3cgIGluIHR3byAgZGlzdGluY3QKICAgIGRpcmVjdG9yaWVzLCBuYW1lbHkgInNyYy9yYXN0ZXIxIiBhbmQgInNyYy9zbW9vdGgiLiAgTm90ZSB0aGF0IHRoZQogICAgb2xkICJzcmMvcmVuZGVyZXIiIGlzIG5vdyBnb25lLgoKICAgIEkgZGl0Y2hlZCAgdGhlIDUtZ3JheS1sZXZlbHMgcmVuZGVyZXJzLiAgQmFzaWNhbGx5LCAgaXQgaW52b2x2ZWQgYQogICAgc2ltcGxlICNkZWZpbmUgdG9nZ2xlIGluICdzcmMvcmFzdGVyMS9mdHJhc3Rlci5jJy4KCiAgICBGVF9SZW5kZXJfR2x5cGgsICBGVF9PdXRsaW5lX1JlbmRlciAgJiAgRlRfT3V0bGluZV9HZXRfQml0bWFwICBub3cKICAgIHNlbGVjdCB0aGUgYmVzdCByZW5kZXJlciAgYXZhaWxhYmxlLCBkZXBlbmRpbmcgb24gcmVuZGVyIG1vZGUuICBJZgogICAgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIGEgIGdpdmVuIGdseXBoIGltYWdlIGZvcm1hdCBpc24ndCBjYXBhYmxlCiAgICBvZiBzdXBwb3J0aW5nICB0aGUgcmVuZGVyIG1vZGUsIGFub3RoZXIgIG9uZSB3aWxsIGJlICBmb3VuZCBpbiB0aGUKICAgIGxpYnJhcnkncyBsaXN0LiAgIFRoaXMgbWVhbnMgdGhhdCBjbGllbnQgYXBwbGljYXRpb25zICBkbyBub3QgbmVlZAogICAgdG8gIHN3aXRjaCBvciAgc2V0ICB0aGUgIHJlbmRlcmVycyB0aGVtc2VsdmVzICAoYXMgIGluIHRoZSAgbGF0ZXN0CiAgICBjaGFuZ2UpLCB0aGV5J2xsIGdldCB3aGF0IHRoZXkgd2FudCBhdXRvbWF0aWNhbGx5LiAgQXQgbGFzdC4KCiAgICBDaGFuZ2VkIHRoZSBkZW1vIHByb2dyYW1zIGFjY29yZGluZ2x5LgoKICAtIE1BSk9SIElOVEVSTkFMIFJFREVTSUdOOgoKICAgIEEgbG90IG9mIGludGVybmFsIG1vZGlmaWNhdGlvbnMgIGhhdmUgYmVlbiBwZXJmb3JtZWQgbGF0ZWx5IG9uIHRoZQogICAgc291cmNlIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBlbmhhbmNlbWVudHM6CgogICAgKiBNb3JlIGdlbmVyaWMgbW9kdWxlIHN1cHBvcnQ6CgogICAgICBUaGUgRlRfTW9kdWxlICB0eXBlIGlzICBub3cgZGVmaW5lZCB0byAgcmVwcmVzZW50IGEgaGFuZGxlICB0byBhCiAgICAgIGdpdmVuICBtb2R1bGUuICAgVGhlICBmaWxlICA8ZnJlZXR5cGUvZnRtb2R1bGUuaD4gIGNvbnRhaW5zICB0aGUKICAgICAgRlRfTW9kdWxlX0NsYXNzIGRlZmluaXRpb24sIGFzIHdlbGwgYXMgdGhlIG1vZHVsZS1sb2FkaW5nIHB1YmxpYwogICAgICBBUEkuCgogICAgICBUaGUgIEZUX0RyaXZlciB0eXBlICBpcyBzdGlsbCAgZGVmaW5lZCwgYW5kICBzdGlsbCAgcmVwcmVzZW50cyBhCiAgICAgIHBvaW50ZXIgdG8gIGEgZm9udCBkcml2ZXIuICBOb3RlIHRoYXQgIEZUX0FkZF9Ecml2ZXIgaXMgcmVwbGFjZWQKICAgICAgYnkgRlRfQWRkX01vZHVsZSwgRlRfR2V0X0RyaXZlciBieSBGVF9HZXRfTW9kdWxlLCBldGMuCgogICAgKiBTdXBwb3J0IGZvciBnZW5lcmljIGdseXBoIGltYWdlIHR5cGVzOgoKICAgICAgVGhlIEZUX1JlbmRlcmVyICB0eXBlIGlzIGEgcG9pbnRlciAgdG8gYSBtb2R1bGUgIHVzZWQgdG8gcGVyZm9ybQogICAgICB2YXJpb3VzIG9wZXJhdGlvbnMgb24gZ2x5cGggaW1hZ2UuCgogICAgICBFYWNoIHJlbmRlcmVyIGlzICBjYXBhYmxlIG9mIGhhbmRsaW5nIGltYWdlcyBpbiAgYSBzaW5nbGUgZm9ybWF0CiAgICAgIChlLmcuIGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lKS4gIEl0cyBmdW5jdGlvbnMgYXJlIHVzZWQgdG86CgogICAgICAtIHRyYW5zZm9ybSBhbiBnbHlwaCBpbWFnZQogICAgICAtIHJlbmRlciBhIGdseXBoIGltYWdlIGludG8gYSBiaXRtYXAKICAgICAgLSByZXR1cm4gdGhlIGNvbnRyb2wgYm94IChkaW1lbnNpb25zKSBvZiBhIGdpdmVuIGdseXBoIGltYWdlCgogICAgICBUaGUgc2NhbiBjb252ZXJ0ZXJzICJmdHJhc3Rlci5jIiBhbmQgImZ0Z3JheXMuYyIgaGF2ZSBiZWVuIG1vdmVkCiAgICAgIHRvIHRoZSBuZXcgZGlyZWN0b3J5ICJzcmMvcmVuZGVyZXIiLCBhbmQgYXJlIHVzZWQgdG8gcHJvdmlkZSB0d28KICAgICAgZGVmYXVsdCByZW5kZXJlciBtb2R1bGVzLgoKICAgICAgT25lIGNvcnJlc3BvbmRzICB0byB0aGUgInN0YW5kYXJkIiBzY2FuLWNvbnZlcnRlciwgIHRoZSBvdGhlciB0bwogICAgICB0aGUgInNtb290aCIgb25lLgoKICAgICAgaGUgIGN1cnJlbnQgIHJlbmRlcmVyICBjYW4gIGJlICBzZXQgIHRocm91Z2ggIHRoZSAgbmV3ICBmdW5jdGlvbgogICAgICBGVF9TZXRfUmVuZGVyZXIuCgogICAgICBUaGUgb2xkIHJhc3Rlci1yZWxhdGVkIGZ1bmN0aW9uIEZUX1NldF9SYXN0ZXIsIEZUX0dldF9SYXN0ZXIgYW5kCiAgICAgIEZUX1NldF9SYXN0ZXJfTW9kZSBoYXZlIG5vdyBkaXNhcHBlYXJlZCwgaW4gZmF2b3Igb2YgdGhlIG5ldzoKCiAgICAgICAgRlRfR2V0X1JlbmRlcmVyCiAgICAgICAgRlRfU2V0X1JlbmRlcmVyCgogICAgICBTZWUgdGhlIGZpbGUgPGZyZWV0eXBlL2Z0cmVuZGVyLmg+IGZvciBtb3JlIGRldGFpbHMuCgogICAgICBUaGVzZSAgY2hhbmdlcyAgd2VyZSAgbmVjZXNzYXJ5ICB0byBwcm9wZXJseSAgc3VwcG9ydCAgZGlmZmVyZW50CiAgICAgIHNjYWxhYmxlIGZvcm1hdHMgaW4gdGhlIGZ1dHVyZSwgbGlrZSBiaS1jb2xvciBnbHlwaHMsIGV0Yy4KCiAgICAqIEdseXBoIGxvYWRlciBvYmplY3Q6CgogICAgICBBICBuZXcgIGludGVybmFsICBvYmplY3QsICBjYWxsZWQgIGEgICdnbHlwaCAgbG9hZGVyJyAgaGFzICBiZWVuCiAgICAgIGludHJvZHVjZWQgaW4gdGhlIGJhc2UgbGF5ZXIuICBJdCBpcyB1c2VkIGJ5IGFsbCBzY2FsYWJsZSBmb3JtYXQKICAgICAgZm9udCBkcml2ZXJzIHRvIGxvYWQgZ2x5cGhzIGFuZCBjb21wb3NpdGVzLgoKICAgICAgVGhpcyBvYmplY3QgIGhhcyBiZWVuICBjcmVhdGVkIHRvIHJlZHVjZSAgdGhlIGNvZGUgc2l6ZSAgb2YgZWFjaAogICAgICBkcml2ZXIsICBhcyAgZWFjaCAgb25lICBvZiAgdGhlbSAgYmFzaWNhbGx5ICByZS1pbXBsZW1lbnRlZCAgaXRzCiAgICAgIGZ1bmN0aW9uYWxpdHkuCgogICAgICBTZWUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPiBhbmQgdGhlIEZUX0dseXBoTG9hZGVyIHR5cGUgZm9yCiAgICAgIG1vcmUgaW5mb3JtYXRpb24uCgogICAgKiBGVF9HbHlwaFNsb3QgaGFzIG5ldyBmaWVsZHM6CgogICAgICBJbiAgb3JkZXIgICB0byAgc3VwcG9ydCAgZXh0ZW5kZWQgIGZlYXR1cmVzICAgKHNlZSAgYmVsb3cpLCAgdGhlCiAgICAgIEZUX0dseXBoU2xvdCBzdHJ1Y3R1cmUgaGFzIGEgZmV3IG5ldyBmaWVsZHM6CgogICAgICBsaW5lYXJIb3JpQWR2YW5jZToKCiAgICAgICAgVGhpcyAgZmllbGQgIGdpdmVzICB0aGUgICBsaW5lYXJseSAgc2NhbGVkICAoaS5lLiAgc2NhbGVkICBidXQKICAgICAgICB1bmhpbnRlZCkgYWR2YW5jZSAgd2lkdGggZm9yIHRoZSAgZ2x5cGgsIGV4cHJlc3NlZCBhcyAgYSAxNi4xNgogICAgICAgIGZpeGVkIHBpeGVsIHZhbHVlLiAgVGhpcyBpcyB1c2VmdWwgdG8gcGVyZm9ybSBXWVNJV1lHIHRleHQuCgogICAgICBsaW5lYXJWZXJ0QWR2YW5jZToKICAgICAgICBUaGlzIGZpZWxkICBnaXZlcyB0aGUgbGluZWFybHkgIHNjYWxlZCBhZHZhbmNlIGhlaWdodCAgZm9yIHRoZQogICAgICAgIGdseXBoICAocmVsZXZhbnQgaW4gIHZlcnRpY2FsICBnbHlwaCBsYXlvdXRzICBvbmx5KS4gIFRoaXMgIGlzCiAgICAgICAgdXNlZnVsIHRvIHBlcmZvcm0gV1lTSVdZRyB0ZXh0LgoKICAgICAgICBOb3RlIHRoYXQgIHRoZSB0d28gYWJvdmUgZmllbGQgcmVwbGFjZSAgdGhlIHJlbW92ZWQgIm1ldHJpY3MyIgogICAgICAgIGZpZWxkIGluIHRoZSBnbHlwaCBzbG90LgoKICAgICAgYWR2YW5jZToKICAgICAgICBUaGlzIGZpZWxkIGlzIGEgdmVjdG9yICB0aGF0IGdpdmVzIHRoZSB0cmFuc2Zvcm1lZCBhZHZhbmNlIGZvcgogICAgICAgIHRoZSBnbHlwaC4gICBCeSBkZWZhdWx0LCBpdCBjb3JyZXNwb25kcyB0byAgdGhlIGFkdmFuY2Ugd2lkdGgsCiAgICAgICAgdW5sZXNzICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCAgd2FzICBzcGVjaWZpZWQgIHdoZW4gIGNhbGxpbmcKICAgICAgICBGVF9Mb2FkX0dseXBoIG9yIEZUX0xvYWRfQ2hhci4KCiAgICAgIGJpdG1hcF9sZWZ0OgogICAgICAgIFRoaXMgIGZpZWxkIGdpdmVzICB0aGUgIGRpc3RhbmNlIGluICBpbnRlZ2VyICBwaXhlbHMgZnJvbSAgdGhlCiAgICAgICAgY3VycmVudCBwZW4gcG9zaXRpb24gIHRvIHRoZSBsZWZ0LW1vc3QgcGl4ZWwgb2YgIGEgZ2x5cGggaW1hZ2UKICAgICAgICBJRiBJVCBJUyAgQSBCSVRNQVAuICBJdCBpcyBvbmx5IHZhbGlkICB3aGVuIHRoZSAiZm9ybWF0IiBmaWVsZAogICAgICAgIGlzIHNldCB0byAiZnRfZ2x5cGhfZm9ybWF0X2JpdG1hcCIsIGZvciBleGFtcGxlLCBhZnRlciBjYWxsaW5nCiAgICAgICAgdGhlIG5ldyBmdW5jdGlvbiBGVF9SZW5kZXJfR2x5cGguCgogICAgICBiaXRtYXBfdG9wOgogICAgICAgIFRoaXMgIGZpZWxkIGdpdmVzICB0aGUgIGRpc3RhbmNlIGluICBpbnRlZ2VyICBwaXhlbHMgZnJvbSAgdGhlCiAgICAgICAgY3VycmVudCBwZW4gcG9zaXRpb24gKGxvY2F0ZWQgb24gdGhlIGJhc2VsaW5lKSB0byB0aGUgdG9wLW1vc3QKICAgICAgICBwaXhlbCBvZiB0aGUgIGdseXBoIGltYWdlIElGIElUIElTICBBIEJJVE1BUC4gIFBvc2l0aXZlIHZhbHVlcwogICAgICAgIGNvcnJlc3BvbmQgdG8gdXB3YXJkcyBZLgoKICAgICAgbG9hZGVyOgogICAgICAgIFRoaXMgIGlzIGEgIG5ldyAgcHJpdmF0ZSAgZmllbGQgZm9yICB0aGUgIGdseXBoIHNsb3QuICAgQ2xpZW50CiAgICAgICAgYXBwbGljYXRpb25zIHNob3VsZCBub3QgdG91Y2ggaXQuCgoKICAgICogU3VwcG9ydCBmb3IgdHJhbnNmb3JtcyBhbmQgZGlyZWN0IHJlbmRlcmluZyBpbiBGVF9Mb2FkX0dseXBoOgoKICAgICAgTW9zdCBvZiB0aGUgZnVuY3Rpb25hbGl0eSBmb3VuZCBpbiA8ZnJlZXR5cGUvZnRnbHlwaC5oPiBoYXMgYmVlbgogICAgICBtb3ZlZCB0byB0aGUgY29yZSBsaWJyYXJ5LiBIZW5jZSwgdGhlIGZvbGxvd2luZzoKCiAgICAgIC0gQSAgIHRyYW5zZm9ybSAgIGNhbiAgIGJlICAgc3BlY2lmaWVkICBmb3IgICBhICAgZmFjZSAgIHRocm91Z2gKICAgICAgICBGVF9TZXRfVHJhbnNmb3JtLiAgdGhpcyB0cmFuc2Zvcm0gIGlzIGFwcGxpZWQgYnkgRlRfTG9hZF9HbHlwaAogICAgICAgIHRvICBzY2FsYWJsZSBnbHlwaCAgaW1hZ2VzIChpLmUuICBOT1QgVE8gIEJJVE1BUFMpICBiZWZvcmUgdGhlCiAgICAgICAgZnVuY3Rpb24gcmV0dXJucywgdW5sZXNzIHRoZSBiaXQgZmxhZyBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0KICAgICAgICB3YXMgc2V0IGluIHRoZSBsb2FkIGZsYWdzLgoKICAgICAgLSBPbmNlICBhICBnbHlwaCBpbWFnZSAgaGFzICBiZWVuICBsb2FkZWQsICBpdCBjYW4gIGJlICBkaXJlY3RseQogICAgICAgIGNvbnZlcnRlZCAgdG8gIGEgIGJpdG1hcCAgYnkgIHVzaW5nICB0aGUgIG5ldyAgRlRfUmVuZGVyX0dseXBoCiAgICAgICAgZnVuY3Rpb24uICBOb3RlIHRoYXQgdGhpcyAgZnVuY3Rpb24gdGFrZXMgdGhlIGdseXBoIGltYWdlIGZyb20KICAgICAgICB0aGUgZ2x5cGggc2xvdCwgIGFuZCBjb252ZXJ0cyBpdCB0byBhICBiaXRtYXAgd2hvc2UgcHJvcGVydGllcwogICAgICAgIGFyZSByZXR1cm5lZCAgaW4gImZhY2UuZ2x5cGguYml0bWFwIiwgImZhY2UuZ2x5cGguYml0bWFwX2xlZnQiCiAgICAgICAgYW5kICJmYWNlLmdseXBoLmJpdG1hcF90b3AiLiAgVGhlICBvcmlnaW5hbCBuYXRpdmUgaW1hZ2UgbWlnaHQKICAgICAgICBiZSBsb3N0IGFmdGVyIHRoZSBjb252ZXJzaW9uLgoKICAgICAgLSBXaGVuIHVzaW5nIHRoZSBuZXcgIGJpdCBmbGFnIEZUX0xPQURfUkVOREVSLCB0aGUgRlRfTG9hZF9HbHlwaAogICAgICAgIGFuZCAgIEZUX0xvYWRfQ2hhciAgIGZ1bmN0aW9ucyAgIHdpbGwgICBjYWxsICAgRlRfUmVuZGVyX0dseXBoCiAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIG5lZWRlZC4KCiAgLSBSZWZvcm1hdHRlZCBhbGwgIG1vZHVsZXMgc291cmNlICBjb2RlIGluIG9yZGVyICB0byBnZXQgcmlkICBvZiB0aGUKICAgIGJhc2ljIGRhdGEgdHlwZXMgcmVkaWZpbml0aW9ucyAoaS5lLiAiVFRfSW50IiBpbnN0ZWFkIG9mICJGVF9JbnQiLAogICAgIlQxX0ZpeGVkIiAgaW5zdGVhZCAgb2YgICJGVF9GaXhlZCIpLiAgSGVuY2UgIHRoZSAgZm9ybWF0LXNwZWNpZmljCiAgICBwcmVmaXhlcyBsaWtlICAiVFRfIiwgIlQxXyIsICAiVDJfIiBhbmQgIkNJRF8iICBhcmUgb25seSAgdXNlZCBmb3IKICAgIHJlbGV2YW50IHN0cnVjdHVyZXMuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgRk9SIEJFVEEgNwoKICAtIGJ1Zy1maXhlZCB0aGUgIE9wZW5UeXBlL0NGRiBwYXJzZXIuIEl0ICBub3cgbG9hZHMgYW5kICBkaXNwbGF5cyBteQogICAgdHdvICBmb250cyBuaWNlbHksICBidXQgSSdtICBwcmV0dHkgY2VydGFpbiAgdGhhdCBtb3JlICB0ZXN0aW5nIGlzCiAgICBuZWVkZWQgOi0pCgogIC0gZml4ZWQgdGhlIGNydW1teSBUeXBlIDEgaGludGVyLCBpdCBub3cgaGFuZGxlcyBhY2NlbnRlZCBjaGFyYWN0ZXJzCiAgICBjb3JyZWN0bHkgKHdlbGwsIHRoZSBhY2NlbnQgaXMgIG5vdCBhbHdheXMgd2VsbCBwbGFjZWQsIGJ1dCB0aGF0J3MKICAgIGFub3RoZXIgcHJvYmxlbS4uKQoKICAtIGFkZGVkIHRoZSBDSUQta2V5ZWQgVHlwZSAxICBkcml2ZXIgaW4gInNyYy9jaWQiLiBXb3JrcyBwcmV0dHkgd2VsbAogICAgZm9yIG9ubHkgMTMgS2Igb2YgY29kZSAgOy0pIERvZXNuJ3QgcmVhZCBBRk0gZmlsZXMgdGhvdWdoLCBub3IgdGhlCiAgICByZWFsbHkgdXNlZnVsIENNQVAgZmlsZXMuLgoKICAtIGZpeGVkIHR3byBidWdzIGluIHRoZSBzbW9vdGggcmVuZGVyZXIgKHNyYy9iYXNlL2Z0Z3JheXMuYykuIFRoYW5rcwogICAgdG8gQm9yaXMgTGV0b2NoYSBmb3Igc3BvdHRpbmcgdGhlbSBhbmQgcHJvdmlkaW5nIGEgZml4Li4KCiAgLSBmaXhlZCBwb3RlbnRpYWwgImRpdmlkZSBieSB6ZXJvIiBidWdzIGluIGZ0Y2FsYy5jLi4gbXkgZ29kLi4KCiAgLSBhZGRlZCBzb3VyY2UgIGNvZGUgZm9yICB0aGUgT3BlblR5cGUvQ0ZGIGRyaXZlciAgKHN0aWxsIGluY29tcGxldGUKICAgIHRob3VnaC4uKQoKICAtIG1vZGlmaWVkIHRoZSAgU0ZOVCBkcml2ZXIgc2xpZ2h0bHkgIHRvIHBlcmZvcm0gbW9yZSAgcm9idXN0IGhlYWRlcgogICAgY2hlY2tzICBpbiBUVF9Mb2FkX1NGTlRfSGVhZGVyLiBUaGlzICBwcmV2ZW50cyBjZXJ0YWluICBmb250IGZpbGVzCiAgICAoZS5nLiAgc29tZSAgVHlwZSAgMSAgTXVsdGlwbGUgIE1hc3RlcnMpICBmcm9tICBiZWluZyAgaW5jb3JyZWN0bHkKICAgICJyZWNvZ25pemVkIiBhcyBUcnVlVHlwZSBmb250IGZpbGVzLi4KCiAgLSBtb3ZlZCBhIGxvdCBvZiBzdHVmZiBmcm9tICB0aGUgVHJ1ZVR5cGUgZHJpdmVyIHRvIHRoZSBTRk5UIG1vZHVsZSwKICAgIHRoaXMgICBhbGxvd3MgICBncmVhdGVyICAgY29kZSAgIHJlLXVzZSAgIGJldHdlZW4gICBmb250ICAgZHJpdmVycwogICAgKGUuZy4gVHJ1ZVR5cGUsIE9wZW5UeXBlLCBDb21wYWN0LVRydWVUeXBlLCBldGMuLikKCiAgLSBhZGRlZCBhIHRpbnkgc2VnbWVudCBjYWNoZSB0byB0aGUgU0ZOVCBDaGFybWFwIDQgZGVjb2RlciwgaW4gb3JkZXIKICAgIHRvIG1pbmltYWxseSBzcGVlZCBpdCB1cC4uCgogIC0gYWRkZWQgc3VwcG9ydCBmb3IgTXVsdGlwbGUgTWFzdGVyIGZvbnRzIGluICJ0eXBlMXoiLiBUaGVyZSBpcyBhbHNvCiAgICBhICBuZXcgZmlsZSAgbmFtZWQgIDxmcmVldHlwZS9mdG1tLmg+IHdoaWNoICBkZWZpbmVzIGZ1bmN0aW9ucyAgdG8KICAgIG1hbmFnZSB0aGVtIGZyb20gY2xpZW50IGFwcGxpY2F0aW9ucy4KCiAgICBUaGUgbmV3IGZpbGUgInNyYy9iYXNlL2Z0bW0uYyIgaXMgYWxzbyBvcHRpb25hbCB0byB0aGUgZW5naW5lLi4KCiAgLSB2YXJpb3VzICBmb3JtYXR0aW5nIGNoYW5nZXMgKGUuZy4gIEVYUE9SVF9ERUYgLT4gIEZUX0VYUE9SVF9ERUYpICsKICAgIHNtYWxsIGJ1ZyBmaXhlcyBpbiBGVF9Mb2FkX0dseXBoLCB0aGUgInR5cGUxIiBkcml2ZXIsIGV0Yy4uCgogIC0gYSBtaW5vciBmaXggdG8gdGhlIFR5cGUgMSBkcml2ZXIgdG8gbGV0IHRoZW0gYXBwbHkgdGhlIGZvbnQgbWF0cml4CiAgICBjb3JyZWN0bHkgKHVzZWQgZm9yIG1hbnkgb2JsaXF1ZSBmb250cy4uKQoKICAtIHNvbWUgZml4ZXMgZm9yIDY0LWJpdCBzeXN0ZW1zIChtYWlubHkgY2hhbmdpbmcgc29tZSBGVF9UUkFDRSBjYWxscwogICAgdG8gdXNlICVwIGluc3RlYWQgb2YgJWx4KS4uIFRoYW5rcyB0byBLYXJsIFJvYmlsbGFyZAoKICAtIGZpeGVkICBzb21lIGJ1Z3MgIGluICB0aGUgc2JpdCAgbG9hZGVyIChzcmMvYmFzZS9zZm50L3R0c2JpdC5jKSAgKwogICAgYWRkZWQgIGEgbmV3IGZsYWcsICBGVF9MT0FEX0NST1BfQklUTUFQIHRvICBxdWVyeSB0aGF0ICBiaXRtYXBzIGJlCiAgICBjcm9wcGVkIHdoZW4gIGxvYWRlZCBmcm9tIGEgZmlsZSAgKG1heWJlIEkgc2hvdWxkICBtb3ZlIHRoZSBiaXRtYXAKICAgIGNyb3BwZXIgdG8gdGhlIGJhc2UgbGF5ZXIgPz8pLgoKICAtIGNoYW5nZWQgdGhlIGRlZmF1bHQgIG51bWJlciBvZiBncmF5IGxldmVscyBvZiAgdGhlIHNtb290aCByZW5kZXJlcgogICAgdG8gMjU2ICAoaW5zdGVhZCBvZiAgdGhlIHByZXZpb3VzIDEyOCkuICBPZiBjb3Vyc2UsIHRoZSAgaHVtYW4gZXllCiAgICBjYW4ndCBzZWUgYW55IGRpZmZlcmVuY2UgOy0pCgogIC0gcmVtb3ZlZCBUVF9NQVhfU1VCR0xZUEhTLCAgdGhlcmUgaXMgbm8gc3RhdGljIGxpbWl0ICBvbiB0aGUgbnVtYmVyCiAgICBvZiBzdWJnbHlwaHMgaW4gYSBUcnVlVHlwZSBmb250IG5vdy4uCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgMTYgTWF5IDIwMDAKCiAgLSB0YWdnZWQgIkJFVEEtNiIgIGluIHRoZSAgQ1ZTIHRyZWUuIFRoaXMgIG9uZSBpcyBhICBzZXJpb3VzIHJlbGVhc2UKICAgIGNhbmRpZGF0ZSBldmVuIHRob3VnaCBpdCBkb2Vzbid0IGluY29ycG9yYXRlIHRoZSBhdXRvLWhpbnRlciB5ZXQuLgoKICAtIHZhcmlvdXMgb2Jzb2xldGUgZmlsZXMgd2VyZSByZW1vdmVkLCBhbmQgY29weXJpZ2h0IGhlYWRlciB1cGRhdGVkCgogIC0gZmluYWxseSAgdXBkYXRlZCAgdGhlICBzdGFuZGFyZCAgIHJhc3RlciAgdG8gIGZpeCAgdGhlICBtb25vY2hyb21lCiAgICByZW5kZXJpbmcgYnVnICsgcmUtZW5hYmxlICBzdXBwb3J0IGZvciA1LWdyYXkgbGV2ZWxzIGFudGktYWxpYXNpbmcKICAgIChzdWNrLCBzdWNrLi4pCgogIC0gY3JlYXRlZCBuZXcgaGVhZGVyIGZpbGVzLCBhbmQgbW9kaWZpZWQgc291cmNlcyBhY2NvcmRpbmdseToKCiAgICAgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KICAgICAgIC0gc2ltcGxlIEZyZWVUeXBlIHR5cGVzLCB3aXRob3V0IHRoZSBBUEkKICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KICAgICAgIC0gZGVmaW5pdGlvbiBvZiBtZW1vcnktbWFuYWdlbWVudCBtYWNyb3MKCiAgLSBhZGRlZCAgIHRoZSAgICJEU0lHIiAgIChPcGVuVHlwZSAgIERpZ2l0YWwgICBTaWduYXR1cmUpICAgdGFnICAgdG8KICAgIDxmcmVldHlwZS90dHRhZ3MuaD4KCiAgLSBsaWdodCB1cGRhdGUvY2xlYW5pbmcgb2YgdGhlIGJ1aWxkIHN5c3RlbSArIGNoYW5nZXMgdG8gdGhlIHNvdXJjZXMKICAgIGluICBvcmRlciAgdG8gIGdldCAgcmlkICBvZiBfYWxsXyAgY29tcGlsZXIgIHdhcm5pbmdzICB3aXRoICB0aHJlZQogICAgY29tcGlsZXJzLCBpLmU6CgogICAgZ2NjIHdpdGggIi1hbnNpIC1wZWRhbnRpYyAtV2FsbCAtVyIsIFZpc3VhbCBDKysgd2l0aCAiL1czIC9XWCIgYW5kCiAgICBMQ0MKCiAgICBJTVBPUlRBTlQgTk9URSBGT1IgV0lOMzItTENDIFVTRVJTOgogICAgfAogICAgfCAgSXQgc2VlbXMgdGhlIEMgcHJlLXByb2Nlc3NvciAgdGhhdCBjb21lcyB3aXRoIExDQyBpcyBicm9rZW4sIGl0CiAgICB8ICBkb2Vzbid0ICByZWNvZ25pemUgIHRoZSAgQU5TSSAgc3RhbmRhcmQgIGRpcmVjdGl2ZXMgICMgIGFuZCAgIyMKICAgIHwgIGNvcnJlY3RseSB3aGVuIG9uZSBvZiB0aGUgIGFyZ3VtZW50IGlzIGEgbWFjcm8uIEFsc28sIHNvbWV0aGluZwogICAgfCAgbGlrZToKICAgIHwKICAgIHwgICAgICNkZWZpbmUgRih4KSAgcHJpbnQjI3gKICAgIHwKICAgIHwgICAgIEYoKCJoZWxsbyIpKQogICAgfAogICAgfCAgd2lsbCBnZXQgaW5jb3JyZWN0bHkgdHJhbnNsYXRlZCB0bzoKICAgIHwKICAgIHwgICAgIHByaW50ICJoZWxsbyIpCiAgICB8CiAgICB8ICBieSBpdHMgcHJlLXByb2Nlc3Nvci4gRm9yICB0aGlzIHJlYXNvbiwgeW91IHNpbXBseSBjYW5ub3QgYnVpbGQKICAgIHwgIEZyZWVUeXBlIDIgaW4gZGVidWcgbW9kZSB3aXRoIHRoaXMgY29tcGlsZXIuLgoKICAtIHlldCBhbm90aGVyIG1hc3NpdmUgZ3J1bnQgd29yay4gSSd2ZSBjaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZQogICAgRVhQT1JUX0RFRiwgIEVYUE9SVF9GVU5DLCBCQVNFX0RFRiAmICBCQVNFX0ZVTkMgbWFjcm9zLiAgVGhlc2Ugbm93CiAgICB0YWtlIGFuIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgdHlwZS4KCiAgICBUaGlzICBpcyBuZWNlc3NhcnkgdG8gIGNvbXBpbGUgRnJlZVR5cGUgIGFzIGEgIERMTCBvbiAgV2luZG93cyBhbmQKICAgIE9TLzIuICBEZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIHVzZWQsIGEgY29tcGlsZXItc3BlY2lmaWMga2V5d29yZAogICAgbGlrZSAgX19leHBvcnQgb3IgX19zeXN0ZW0gIG11c3QgYmUgIHBsYWNlZCBiZWZvcmUgIChWaXN1YWxDKyspIG9yCiAgICBhZnRlciAoQm9ybGFuZEMrKykgdGhlIHR5cGUuLgoKICAgIE9mIGNvdXJzZSwgdGhpcyBuZWVkZWQgYSBsb3Qgb2YgY2hhbmdlcyB0aHJvdWdob3V0IHRoZSBzb3VyY2UgY29kZQogICAgdG8gbWFrZSBpdCBjb21waWxlIGFnYWluLi4uIEFsbCBjbGVhbmVkIHVwIG5vdywgYXBwYXJlbnRseS4uCgogICAgTm90ZSBhbHNvICB0aGF0IHRoZXJlIGlzIGEgIG5ldyBFWFBPUlRfVkFSIG1hY3JvICBkZWZpbmVkIHRvIGFsbG93CiAgICB0aGUgICBfZGVjbGFyYXRpb25fICAgIG9mICAgYW4gICBleHBvcnRhYmxlICAgIHB1YmxpYyAgIChjb25zdGFudCkKICAgIHZhcmlhYmxlLiAgVGhpcyAgaXMgIHRoZSAgIGNhc2UgIG9mICB0aGUgIHJhc3RlciAgaW50ZXJmYWNlcyAgKHNlZQogICAgZnRyYXN0ZXIuaCBhbmQgZnRncmF5cy5oKSwgYXMgd2VsbCBhcyBlYWNoIG1vZHVsZSdzIGludGVyZmFjZSAoc2VlCiAgICBzZmRyaXZlci5oLCBwc2RyaXZlci5oLCBldGMuLikKCiAgLSBuZXcgZmVhdHVyZTogaXQgIGlzIG5vdyBwb3NzaWJsZSB0byBwYXNzICBleHRyYSBwYXJhbWV0ZXJzIHRvIGZvbnQKICAgICAgICAgICAgICAgICBkcml2ZXJzICB3aGVuIGNyZWF0aW5nICBhIG5ldyAgZmFjZSBvYmplY3QuICBGb3Igbm93LAogICAgICAgICAgICAgICAgIHRoaXMgY2FwYWJpbGl0eSBpcyB1bnVzZWQuICBJdCBjb3VsZCBob3dldmVyIHByb3ZlIHRvCiAgICAgICAgICAgICAgICAgYmUgdXNlZnVsIGluIGEgbmVhciBmdXR1cmUuLgoKICAgICAgdGhlIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgd2FzICBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBpbnRlcm5hbAogICAgICBkcml2ZXIgaW50ZXJmYWNlICAodGhlIHNwZWNpZmljICJpbml0X2ZhY2UiICBtb2R1bGUgZnVuY3Rpb24gaGFzCiAgICAgIG5vdyBhIGRpZmZlcmVudCBzaWduYXR1cmUpLgoKICAtIHVwZGF0ZWQgdGhlIHR1dG9yaWFsIChub3QgZmluaXNoZWQgdGhvdWdoKS4KCiAgLSB1cGRhdGVkIHRoZSB0b3AtbGV2ZWwgQlVJTEQgIGRvY3VtZW50CgogIC0gZml4ZWQgIGEgIHBvdGVudGlhbCBtZW1vcnkgIGxlYWsgIHRoYXQgIGNvdWxkICBvY2N1ciB3aGVuICBsb2FkaW5nCiAgICBlbWJlZGRlZCBiaXRtYXBzLgoKICAtIGFkZGVkICAgICB0aGUgICAgIGRlY2xhcmF0aW9uICAgICBvZiAgICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICBpbgogICAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+LCBhcyAgaXQgd2FzICBtaXNzaW5nIGZyb20gdGhlICBwdWJsaWMgaGVhZGVyCiAgICAodGhlIGltcGxlbWVudGF0aW9uIHdhcyBhbHJlYWR5IGluICJmdG9ianMuYyIpLgoKICAtIHRoZSBmaWxlIDxmcmVldHlwZS9mdGVycm9ycy5oPiBoYXMgYmVlbiBzZXJpb3VzbHkgdXBkYXRlZCBpbiBvcmRlcgogICAgdG8gYWxsb3cgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGVycm9yIG1lc3NhZ2UgdGFibGVzLiBTZWUgdGhlCiAgICBjb21tZW50cyB3aXRoaW4gaXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgogIC0gbWFqb3IgZGlyZWN0b3J5ICBoaWVyYXJjaHkgcmUtb3JnYW5pc2F0aW9uLiBUaGlzIHdhcyAgZG9uZSBmb3IgdHdvCiAgICB0aGluZ3M6CgogICAgICAqIGZpcnN0LCAgdG8gZWFzZSAgdGhlICJtYW51YWwiICBjb21waWxhdGlvbiBvZiAgdGhlICBsaWJyYXJ5IGJ5CiAgICAgICAgcmVxdWlyaW5nIGF0IGxvdCBsZXNzIGluY2x1ZGUgcGF0aHMgOi0pCgogICAgICAqIHNlY29uZCwgIHRvICBhbGxvdyAgZXh0ZXJuYWwgIHByb2dyYW1zIHRvICBlZmZlY3RpdmVseSAgYWNjZXNzCiAgICAgICAgaW50ZXJuYWwgIGRhdGEgIGZpZWxkcy4gRm9yICBleGFtcGxlLCAgdGhpcyAgY2FuIGJlICBleHRyZW1lbHkKICAgICAgICB1c2VmdWwgaWYgIHNvbWVvbmUgd2FudHMgIHRvIHdyaXRlIGEgIGZvbnQgcHJvZHVjZXIgb3IgIGEgZm9udAogICAgICAgIG1hbmFnZXIgb24gdG9wIG9mIEZyZWVUeXBlLgoKICAgIEJhc2ljYWxseSwgeW91ICBzaG91bGQgbm93IHVzZSAgdGhlICdmcmVldHlwZS8nIHByZWZpeCAgZm9yIGhlYWRlcgogICAgaW5jbHVzaW9uLCBhcyBpbjoKCiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Z2x5cGguaD4KCiAgICBTb21lIG5ldyBpbmNsdWRlIHN1Yi1kaXJlY3RvcmllcyBhcmUgYXZhaWxhYmxlOgoKICAgICBhLiB0aGUgICJmcmVldHlwZS9jb25maWciIGRpcmVjdG9yeSwgIGNvbnRhaW5zIHR3byBmaWxlcyAgdXNlZCB0bwogICAgICAgIGNvbmZpZ3VyZSB0aGUgYnVpbGQgb2YgdGhlIGxpYnJhcnkuIENsaWVudCBhcHBsaWNhdGlvbnMgc2hvdWxkCiAgICAgICAgbm90IG5lZWQgdG8gbG9vayBhdCB0aGVzZSBub3JtYWxseSwgYnV0IHRoZXkgY2FuIGlmIHRoZXkgd2FudC4KCiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRjb25maWcuaD4KCiAgICAgYi4gdGhlICJmcmVldHlwZS9pbnRlcm5hbCIgIGRpcmVjdG9yeSwgY29udGFpbnMgaGVhZGVyIGZpbGVzIHRoYXQKICAgICAgICBkZXNjcmliZXMgbGlicmFyeSAgaW50ZXJuYWxzLiBUaGVzZSBhcmUgdGhlICBoZWFkZXIgZmlsZXMgdGhhdAogICAgICAgIHdlcmUgIHByZXZpb3VzbHkgIGZvdW5kICBpbiAgdGhlICJzcmMvYmFzZSIgIGFuZCAgInNyYy9zaGFyZWQiCiAgICAgICAgZGlyZWN0b3JpZXMuCgoKICAgIEFzICB1c3VhbCwgdGhlIGJ1aWxkICBzeXN0ZW0gYW5kICB0aGUgZGVtb3MgIGhhdmUgYmVlbiAgdXBkYXRlZCB0bwogICAgcmVmbGVjdCB0aGUgY2hhbmdlLi4KCiAgICBIZXJlJ3MgYSBsYXlvdXQgb2YgdGhlIG5ldyBkaXJlY3RvcnkgaGllcmFyY2h5OgoKICAgIFRPUF9ESVIKICAgICAgaW5jbHVkZS8KICAgICAgICAgZnJlZXR5cGUvCiAgICAgICAgICAgIGZyZWV0eXBlLmgKICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIGNvbmZpZy8KICAgICAgICAgICAgICBmdG9wdGlvbi5oCiAgICAgICAgICAgICAgZnRjb25maWcuaAogICAgICAgICAgICAgIGZ0bW9kdWxlLmgKCiAgICAgICAgICAgIGludGVybmFsLwogICAgICAgICAgICAgIGZ0b2Jqcy5oCiAgICAgICAgICAgICAgZnRzdHJlYW0uaAogICAgICAgICAgICAgIGZ0Y2FsYy5oCiAgICAgICAgICAgICAgLi4uCgogICAgICBzcmMvCiAgICAgICAgIGJhc2UvCiAgICAgICAgICAgIC4uLgoKICAgICAgICAgc2ZudC8KICAgICAgICAgcHNuYW1lcy8KICAgICAgICAgdHJ1ZXR5cGUvCiAgICAgICAgIHR5cGUxLwogICAgICAgICB0eXBlMXovCgoKICAgIENvbXBpbGluZyBhIG1vZHVsZSBpcyBub3cgIG11Y2ggZWFzaWVyLCBmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgc2hvdWxkIHdvcmsgd2hlbiBpbiB0aGUgVE9QX0RJUiBkaXJlY3Rvcnkgb24gYW4gQU5TSSBidWlsZDoKCiAgICAgICBnY2MgLWMgLUkuL2luY2x1ZGUgLUkuL3NyYy9iYXNlIHNyYy9iYXNlL2Z0YmFzZS5jCiAgICAgICBnY2MgLWMgLUkuL2luY2x1ZGUgLUkuL3NyYy9zZm50IHNyYy9zZm50L3NmbnQuYwogICAgICAgZXRjLi4KCiAgICAob2YgY291cnNlLCB1c2luZyAtSWNvbmZpZy88c3lzdGVtPiBpZiB5b3UgcHJvdmlkZSBzeXN0ZW0tc3BlY2lmaWMKICAgICBjb25maWd1cmF0aW9uIGZpbGVzKS4KCiAgLSB1cGRhdGVkIHRoZSBzdHJ1Y3R1cmUgb2YgRlRfT3V0bGluZV9GdW5jcyBpbiBvcmRlciB0byBhbGxvdyBkaXJlY3QKICAgIGNvb3JkaW5hdGUgc2NhbGluZyB3aXRoaW4gIHRoZSBvdXRsaW5lIGRlY29tcG9zaXRpb24gcm91dGluZSAodGhpcwogICAgaXMgIGltcG9ydGFudCBmb3IgdmlydHVhbCAgIm9uIiBwb2ludHMgIHdpdGggVHJ1ZVR5cGUgIG91dGxpbmVzKSArCiAgICB1cGRhdGVzIHRvIHRoZSByYXN0ZXJzIHRvIHN1cHBvcnQgdGhpcy4uCgogIC0gdXBkYXRlZCAgdGhlIE9TLzIgIHRhYmxlICBsb2FkaW5nIGNvZGUgIGluICJzcmMvc2ZudC90dGxvYWQuYyIgIGluCiAgICBvcmRlciB0byBzdXBwb3J0IHZlcnNpb24gMiBvZiB0aGUgdGFibGUgKHNlZSBPcGVuVHlwZSAxLjIgc3BlYykKCiAgLSBjcmVhdGVkICAiaW5jbHVkZS90dHRhYmxlcy5oIiAgYW5kICAiaW5jbHVkZS90MXRhYmxlcy5oIiB0byAgYWxsb3cKICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gYWNjZXNzIHNvbWUgb2YgIHRoZSBTRk5UIGFuZCBUMSB0YWJsZXMgb2YgYQogICAgZmFjZSAgd2l0aCAgYSAgcHJvY2VkdXJhbCAgaW50ZXJmYWNlIChzZWUgIEZUX0dldF9TZm50X1RhYmxlKCkpICArCiAgICB1cGRhdGVzIHRvIGludGVybmFsIHNvdXJjZSBmaWxlcyB0byByZWZsZWN0IHRoZSBjaGFuZ2UuLgoKICAtIHNvbWUgIGNsZWFudXBzIGluICB0aGUgc291cmNlICBjb2RlIHRvICBnZXQgcmlkICBvZiAgd2FybmluZ3Mgd2hlbgogICAgY29tcGlsaW5nIHdpdGggdGhlICItV2FsbCAtVyAtYW5zaSAtcGVkYW50aWMiIG9wdGlvbnMgaW4gZ2NjLgoKICAtIGRlYnVnZ2VkIGFuZCBtb3ZlZCB0aGUgc21vb3RoIHJlbmRlcmVyIHRvICJzcmMvYmFzZS9mdGdyYXlzLmMiIGFuZAogICAgaXRzIGhlYWRlciB0byAiaW5jbHVkZS9mdGdyYXlzLmgiCgogIC0gdXBkYXRlZCBUVF9NQVhfU1VCR0xZUEhTICB0byA5NiBhcyBzb21lIENKSyAgZm9udHMgaGF2ZSBjb21wb3NpdGVzCiAgICB3aXRoIHVwIHRvIDgwIHN1Yi1nbHlwaHMgISEgVGhhbmtzIHRvIFdlcm5lcgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIC0gMTQtYXByLTIwMDAKCiAgLSBmaXhlZCAgYSBidWcgIGluICB0aGUgIFRydWVUeXBlIGdseXBoICBsb2FkZXIgIHRoYXQgcHJldmVudGVkICB0aGUKICAgIGNvcnJlY3QgbG9hZGluZyBvZiBzb21lIENKSyBnbHlwaHMgaW4gbWluZ2xpLnR0ZgoKICAtIGltcHJvdmVkIHRoZSBzdGFuZGFyZCBUeXBlIDEgaGludGVyIGluICJzcmMvdHlwZTEiCgogIC0gZml4ZWQgdHdvIGJ1Z3MgIGluIHRoZSBleHBlcmltZW50YWwgVHlwZSAxICBkcml2ZXIgaW4gInNyYy90eXBlMXoiCiAgICB0byBoYW5kbGUgdGhlIG5ldyBYRnJlZTg2IDQuMCBmb250cyAoYW5kIGEgZmV3IG90aGVyIG9uZXMuLikKCiAgLSB0aGUgc21vb3RoICByZW5kZXJlciBpcyBub3cgIGNvbXBsZXRlIGFuZCBzdXBwb3J0cyAgc3ViLWJhbmRpbmcgdG8KICAgIHJlbmRlciBsYXJnZSBnbHlwaHMgYXQgaGlnaCBzcGVlZC4gSG93ZXZlciwgaXQgaXMgc3RpbGwgbG9jYXRlZCBpbgogICAgImRlbW9zL3NyYy9mdGdyYXlzLmMiIGFuZCBzaG91bGQgbW92ZSB0byB0aGUgbGlicmFyeSBpdHNlbGYgaW4gdGhlCiAgICBuZXh0ICBiZXRhLi4gICBOT1RFOiAgVGhlICBzbW9vdGggIHJlbmRlcmVyICAgZG9lc24ndCAgY29tcGlsZSAgaW4KICAgIHN0YW5kLWFsb25lIG1vZGUgYW55bW9yZSwgYnV0IHRoaXMgc2hvdWxkIGJlIGZpeGVkIFJTTi4uCgogIC0gaW50cm9kdWNlZCBjb252ZW5pZW5jZSAgZnVuY3Rpb25zIHRvICBtb3JlIGVhc2lseSBkZWFsICB3aXRoIGdseXBoCiAgICBpbWFnZXMsIHNlZSAgImluY2x1ZGUvZnRnbHlwaC5oIiBmb3IgbW9yZSBkZXRhaWxzLCBhcyAgd2VsbCBhcyB0aGUKICAgIG5ldyAgZGVtbyBwcm9ncmFtICBuYW1lZCAiZGVtb3Mvc3JjL2Z0c3RyaW5nLmMiICB0aGF0IGRlbW9uc3RyYXRlcwogICAgaXRzIHVzZQoKICAtIGltcGxlbWVudGVkICBGVF9MT0FEX05PX1JFQ1VSU0UgaW4gIGJvdGggdGhlICBUcnVlVHlwZSBhbmQgIFR5cGUgMQogICAgZHJpdmVycyAgKHRoaXMgIGlzIHJlcXVpcmVkICBieSAgdGhlICBhdXRvLWhpbnRlciAgdG8gaW1wcm92ZSAgaXRzCiAgICByZXN1bHRzKS4KCiAgLSBjaGFuZ2VkICAgdGhlICByYXN0ZXIgICBpbnRlcmZhY2UsICBpbiAgIG9yZGVyICB0byAgIGFsbG93ICBjbGllbnQKICAgIGFwcGxpY2F0aW9ucyB0byBwcm92aWRlIHRoZWlyIG93biBzcGFuLWRyYXdpbmcgY2FsbGJhY2tzLiBIb3dldmVyLAogICAgb25seSB0aGUgc21vb3RoIHJlbmRlcmVyICBzdXBwb3J0cyB0aGlzLiBTZWUgIkZUX1Jhc3Rlcl9QYXJhbXMiIGluCiAgICB0aGUgZmlsZSAiaW5jbHVkZS9mdGltYWdlLmgiCgogIC0gZml4ZWQgIGEgc21hbGwgYnVnICBpbiBGVF9NdWxGaXggIHRoYXQgY2F1c2VkICBpbmNvcnJlY3QgdHJhbnNmb3JtCiAgICBjb21wdXRhdGlvbiEKCiAgLSBOb3RlOiBUaGUgdHV0b3JpYWwgaXMgb3V0LW9mLWRhdGUsIGdydW1wZi4uIDotKAoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIC0gMTItbWFyLTIwMDAKCiAgLSBjaGFuZ2VkICB0aGUgIGxheW91dCAgb2YgIGNvbmZpZ3VyYXRpb24gIGZpbGVzICA6ICBub3csICBhbGwgIEFOU0kKICAgIGNvbmZpZ3VyYXRpb24gICAgICAgICBmaWxlcyAgICAgICAgIGFyZSAgICAgICAgIGxvY2F0ZWQgICAgICAgICBpbgogICAgImZyZWV0eXBlMi9jb25maWciLiAgU3lzdGVtLXNwZWNpZmljIG92ZXItcmlkZXMgIGNhbiBiZSAgcGxhY2VkIGluCiAgICAiZnJlZXR5cGUyL2NvbmZpZy88c3lzdGVtPiIuCgogIC0gbW92ZWQgYWxsIGNvbmZpZ3VyYXRpb24gbWFjcm9zIHRvICJjb25maWcvZnRvcHRpb24uaCIKCiAgLSBpbXByb3ZlbWVudHMgaW4gdGhlIFR5cGUgMSBkcml2ZXIgd2l0aCBBRk0gc3VwcG9ydAoKICAtIGNoYW5nZWQgdGhlIGZpZWxkcyAgaW4gdGhlIEZUX091dGxpbmUgc3RydWN0dXJlIDogIHRoZSBvbGQgImZsYWdzIgogICAgYXJyYXkgaXMgcmUtbmFtZWQgInRhZ3MiLCB3aGlsZSBhbGwgYW5jaWVudCBmbGFncyBhcmUgZW5jb2RlZCBpbnRvCiAgICBhIHNpbmdsZSB1bnNpZ25lZCBpbnQgbmFtZWQgImZsYWdzIi4KCiAgLSBpbnRyb2R1Y2VkICAgICBuZXcgICAgICBmbGFncyAgICAgaW4gICAgIEZUX091dGxpbmUuZmxhZ3MgICAgIChzZWUKICAgIGZ0X291dGxpbmVfLi4uLiBlbnVtcyBpbiAiZnRpbWFnZS5oIikuCgogIC0gY2hhbmdlZCBvdXRsaW5lIGZ1bmN0aW9ucyB0byAiRlRfT3V0bGluZV88YWN0aW9uPiIgc3ludGF4CgogIC0gYWRkZWQgYSBzbW9vdGggYW50aS1hbGlhcyByZW5kZXJlciB0byB0aGUgZGVtb25zdHJhdGlvbiBwcm9ncmFtcwoKICAtIGFkZGVkIE1hYyBncmFwaGljcyBkcml2ZXIgKHRoYW5rcyBKdXN0KQoKICAtIEZUX09wZW5fRmFjZSAgY2hhbmdlZCAgaW4gIG9yZGVyICAgdG8gIHJlY2VpdmVkICBhICBwb2ludGVyICB0byAgYQogICAgRlRfT3Blbl9BcmdzIGRlc2NyaXB0b3IuLgoKICAtIHZhcmlvdXMgIGNsZWFudXBzLCAgYSAgZmV3ICBtb3JlIEFQSSAgZnVuY3Rpb25zICBpbXBsZW1lbnRlZCAgKHNlZQogICAgRlRfQXR0YWNoX0ZpbGUpCgogIC0gdXBkYXRlZCBzb21lIGRvY3MKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTEQgQ0hBTkdFUyAtIDIyLWZlYi0yMDAwCgogIC0gaW50cm9kdWNlZCB0aGUgInBzbmFtZXMiIG1vZHVsZS4gSXQgaXMgdXNlZCB0bzoKCiAgICAgIG8gY29udmVydCAgYSBQb3N0c2NyaXB0IGdseXBoICBuYW1lIGludG8gdGhlICBlcXVpdmFsZW50IFVuaWNvZGUKICAgICAgICBjaGFyYWN0ZXIgY29kZSAodXNlZCBieSB0aGUgIFR5cGUgMSBkcml2ZXIocykgdG8gc3ludGhldGl6ZSBvbgogICAgICAgIHRoZSBmbHkgYSBVbmljb2RlIGNoYXJtYXApLgoKICAgICAgbyBwcm92aWRlIGFuICBpbnRlcmZhY2UgdG8gcmV0cmlldmUgdGhlIFBvc3RzY3JpcHQgIG5hbWVzIG9mIHRoZQogICAgICAgIE1hY2ludG9zaCwgIEFkb2JlICBTdGFuZGFyZCAmICBBZG9iZSAgRXhwZXJ0IGNoYXJhY3RlciAgY29kZXMuCiAgICAgICAgKHRoZSBNYWNpbnRvc2ggIG5hbWVzIGFyZSAgdXNlZCBieSB0aGUgIFNGTlQtbW9kdWxlIHBvc3RzY3JpcHQKICAgICAgICBuYW1lcyBzdXBwb3J0IHJvdXRpbmVzLCB3aGlsZSB0aGUgb3RoZXIgdHdvIHRhYmxlcyBhcmUgdXNlZCBieQogICAgICAgIHRoZSBUeXBlIDEgZHJpdmVyKHMpKS4KCiAgLSBpbnRyb2R1Y2VkIHRoZSAidHlwZTF6IiBhbHRlcm5hdGUgVHlwZSAgMSBkcml2ZXIuIFRoaXMgaXMgYSAoc3RpbGwKICAgIGV4cGVyaW1lbnRhbCkgZHJpdmVyICBmb3IgdGhlIFR5cGUgIDEgZm9ybWF0IHRoYXQgIHdpbGwgdWx0aW1hdGVseQogICAgcmVwbGFjZSB0aGUgb25lICBpbiAic3JjL3R5cGUxIi4gSXQgdXNlcyBwYXR0ZXJuICBtYXRjaGluZyB0byBsb2FkCiAgICBkYXRhIGZyb20gdGhlICBmb250LCBpbnN0ZWFkIG9mIGEgZmluaXRlICBzdGF0ZSBhbmFseXplci4gSXQgd29ya3MKICAgIG11Y2ggYmV0dGVyIHRoYW4gdGhlICJvbGQiICBkcml2ZXIgd2l0aCAiYnJva2VuIiBmb250cy4gSXQgaXMgYWxzbwogICAgbXVjaCBzbWFsbGVyICh1bmRlciAxNSBLYikuCgogIC0gdGhlICBUeXBlIDEgIGRyaXZlcnMgKGJvdGggIGluICJzcmMvdHlwZTEiICBhbmQgICJzcmMvdHlwZTF6IikgYXJlCiAgICBuZWFybHkgIGNvbXBsZXRlLiAgVGhleSAgYm90aCAgcHJvdmlkZSBhdXRvbWF0aWMgIFVuaWNvZGUgIGNoYXJtYXAKICAgIHN5bnRoZXNpcyB0aHJvdWdoICB0aGUgInBzbmFtZXMiIG1vZHVsZS4gTm8gIHJlLWVuY29kaW5nIHZlY3RvciBpcwogICAgbmVlZGVkLiAgKG5vdGUgIHRoYXQgdGhleSAgc3RpbGwgIGxlYWsgIG1lbW9yeSAgZHVlIHRvICBzb21lICBjb2RlCiAgICBtaXNzaW5nLCBhbmQgSSdtIGdldHRpbmcgbGF6eSkuCgogICAgVHJpdmlhbCBBRk0gc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCB0byByZWFkIGtlcm5pbmcgaW5mb3JtYXRpb24gYnV0CiAgICB3YXNuJ3QgZXhhY3RseSB0ZXN0ZWQgYXMgaXQgc2hvdWxkIDstKQoKICAtIFRoZSBUcnVlVHlwZSAgZ2x5cGggbG9hZGVyIGhhcyAgYmVlbiBzZXJpb3VzbHkgcmV3cml0dGVuICAoc2VlIHRoZQogICAgZmlsZSAgInNyYy90cnVldHlwZS90dGdsb2FkLmMiLiBJdCAgaXMgbm93ICBtdWNoLCBtdWNoICBzaW1wbGVyIGFzCiAgICB3ZWxsIGFzICBlYXNpZXIgdG8gcmVhZCwgIG1haW50YWluIGFuZCB1bmRlcnN0YW5kICA6LSkgUHJlbGltaW5hcnkKICAgIHZlcnNpb25zIGludHJvZHVjZWQgYSAgbWVtb3J5IGxlYWsgdGhhdCBoYXMgYmVlbiAgcmVwb3J0ZWQgYnkgSmFjawogICAgRGF2aXMsIGFuZCBpcyBub3cgZml4ZWQuLgoKICAtIGludHJvZHVjZWQgIHRoZSBuZXcgICJmdF9nbHlwaF9mb3JtYXRfcGxvdHRlciIsIHVzZWQgIHRvIHJlcHJlc2VudAogICAgc3Ryb2tlZCBvdXRsaW5lcyAgbGlrZSBXaW5kb3dzICJWZWN0b3IiIGZvbnRzLCBhbmQgIGNlcnRhaW4gVHlwZSAxCiAgICBmb250cyAgbGlrZSAiSGVyc2hleSIuICBUaGUgY29ycmVzcG9uZGluZyAgcmFzdGVyIHdpbGwgIGJlIHdyaXR0ZW4KICAgIHNvb24uCgogIC0gRlRfTmV3X01lbW9yeV9GYWNlICBpcyAgZ29uZS4gIExpa2V3aXNlLCAgRlRfT3Blbl9GYWNlIGhhcyAgYSAgbmV3CiAgICBpbnRlcmZhY2UgdGhhdCB1c2VzIGEgc3RydWN0dXJlICB0byBkZXNjcmliZSB0aGUgaW5wdXQgc3RyZWFtLCB0aGUKICAgIGRyaXZlciAoaWYgcmVxdWlyZWQpLCBldGMuLgoKClRPRE8KCiAgLSBXcml0ZSBGVF9HZXRfR2x5cGhfQml0bWFwIGFuZCBGVF9Mb2FkX0dseXBoX0JpdG1hcAoKICAtIEFkZCBhIGZ1bmN0aW9uIGxpa2UgRlRfTG9hZF9DaGFyYWN0ZXIoIGZhY2UsIGNoYXJfY29kZSwgbG9hZF9mbGFncwogICAgKSAgdGhhdCAgd291bGQgcmVhbGx5ICBlbWJiZWQgIGEgIGNhbGwgIHRvIEZUX0dldF9DaGFyX0luZGV4ICB0aGVuCiAgICBGVF9Mb2FkX0dseXBoIHRvIGVhc2UgZGV2ZWxvcGVyJ3Mgd29yay4KCiAgLSBVcGRhdGUgdGhlIHR1dG9yaWFsIQoKICAtIGNvbnNpZGVyIGFkZGluZyAgc3VwcG9ydCBmb3IgTXVsdGlwbGUgIE1hc3RlciBmb250cyBpbiB0aGUgIFR5cGUgMQogICAgZHJpdmVycy4KCiAgLSBUZXN0IHRoZSBBRk0gcm91dGluZXMgb2YgdGhlICBUeXBlIDEgZHJpdmVycyB0byBjaGVjayB0aGF0IGtlcm5pbmcKICAgIGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGNvcnJlY3RseS4KCiAgLSB3cml0ZSBhIGRlY2VudCBhdXRvLWdyaWRkaW5nIGNvbXBvbmVudCAgISEgV2UgbmVlZCB0aGlzIHRvIHJlbGVhc2UKICAgIEZyZWVUeXBlIDIuMCBnb2xkICEKCgpsZXNzIHVyZ2VudCBuZWVkczoKCiAgLSBhZGQgYSBDRkYvVHlwZTIgZHJpdmVyCiAgLSBhZGQgYSBCREYgZHJpdmVyCiAgLSBhZGQgYSBGTlQvUENGL0hCRiBkcml2ZXIKICAtIGFkZCBhIFNwZWVkbyBkcml2ZXIgZnJvbSB0aGUgWDExIHNvdXJjZXMKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTERFUiBDSEFOR0VTIC0gMjctamFuLTIwMDAKCiAgLSB1cGRhdGVkIHRoZSAgInNmbnQiIG1vZHVsZSAgaW50ZXJmYWNlIHRvIGFsbG93ICBzZXZlcmFsIFNGTlQtYmFzZWQKICAgIGRyaXZlcnMgdG8gY28tZXhpc3QgcGVhY2VmdWxseQoKICAtIHVwZGF0ZWQgIHRoZSAiVDFfRmFjZSIgIHR5cGUgIHRvIGJldHRlciAgc2VwYXJhdGUgUG9zdHNjcmlwdCAgZm9udAogICAgY29udGVudCAgZnJvbSB0aGUgIHJlc3Qgb2YgIHRoZSBGVF9GYWNlICBzdHJ1Y3R1cmUuIE1pZ2h0ICBiZSB1c2VkCiAgICBsYXRlciBieSB0aGUgQ0ZGL1R5cGUyIGRyaXZlci4uCgogIC0gYWRkZWQgYW4gZXhwZXJpbWVudGFsIHJlcGxhY2VtZW50IFR5cGUgMSBkcml2ZXIgZmVhdHVyaW5nIGFkdmFuY2VkCiAgICAoYW5kIHNwZWVkeSkgcGF0dGVybiBtYXRjaGluZyB0byByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIHBvc3RzY3JpcHQKICAgIGZvbnRzLgoKICAtIHZlcnkgbWlub3IgIGNoYW5nZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uICBvZiBGVF9TZXRfQ2hhcl9TaXplIGFuZAogICAgRlRfU2V0X1BpeGVsX1NpemVzICh0aGV5IG5vdyBpbXBsZW1lbnQgZGVmYXVsdCB0byBsaWd0aGVuIHRoZSBmb250CiAgICBkcml2ZXIncyBjb2RlKS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTEQgTUVTU0FHRQoKVGhpcyBmaWxlIHN1bW1hcml6ZXMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1cmVkIHNpbmNlIHRoZSBsYXN0ICJiZXRhIiBvZgpGcmVlVHlwZSAyLiAgQmVjYXVzZSAgdGhlIGxpc3QgaXMgaW1wb3J0YW50LCBpdCAgaGFzIGJlZW4gZGl2aWRlZCBpbnRvCnNlcGFyYXRlIHNlY3Rpb25zOgoKVGFibGUgT2YgQ29udGVudHM6CgogICAgSSAgIEhpZ2gtTGV2ZWwgSW50ZXJmYWNlIChlYXNpZXIgISkKICAgSUkgICBEaXJlY3RvcnkgU3RydWN0dXJlCiAgSUlJICAgR2x5cGggSW1hZ2UgRm9ybWF0cwogICBJViAgIEJ1aWxkIFN5c3RlbQogICAgViAgIFBvcnRhYmlsaXR5CiAgIFZJICAgRm9udCBEcml2ZXJzCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSGlnaC1MZXZlbCBJbnRlcmZhY2U6CgogIFRoZSBoaWdoLWxldmVsIEFQSSBoYXMgYmVlbiBjb25zaWRlcmFibHkgc2ltcGxpZmllZC4gIEhlcmUgaXMgaG93OgoKICAgIC0gcmVzb3VyY2Ugb2JqZWN0cyBoYXZlIGRpc2FwcGVhcmVkLiAgdGhpcyBtZWFucyB0aGF0IGZhY2Ugb2JqZWN0cwogICAgICBjYW4gbm93IGJlIGNyZWF0ZWQgd2l0aCAgYSBzaW5nbGUgZnVuY3Rpb24gY2FsbCAoc2VlIEZUX05ld19GYWNlCiAgICAgIGFuZCBGVF9PcGVuX0ZhY2UpCgogICAgLSB3aGVuIGNhbGxpbmcgIGVpdGhlciBGVF9OZXdfRmFjZSAgJiBGVF9PcGVuX0ZhY2UsIGEgIHNpemUgb2JqZWN0CiAgICAgIGFuZCBhIGdseXBoIHNsb3Qgb2JqZWN0ICBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB0aGUgZmFjZSwKICAgICAgYW5kIGNhbiAgYmUgYWNjZXNzZWQgIHRocm91Z2ggImZhY2UtPmdseXBoIiBhbmQgICJmYWNlLT5zaXplIiBpZgogICAgICBvbmUgcmVhbGx5ICBuZWVkcyB0by4gICBJbiBtb3N0IGNhc2VzLCAgdGhlcmUncyBubyBuZWVkICB0byBjYWxsCiAgICAgIEZUX05ld19TaXplIG9yIEZUX05ld19HbHlwaC4KCiAgICAtIHNpbWlsYXJseSwgIEZUX0xvYWRfR2x5cGggIG5vdyAgb25seSAgdGFrZXMgIGEgICJmYWNlIiAgYXJndW1lbnQKICAgICAgKGluc3RlYWQgIG9mIGEgIGdseXBoICBzbG90ICBhbmQgYSAgc2l6ZSkuICBBbHNvLCBpdCdzICAicmVzdWx0IgogICAgICBwYXJhbWV0ZXIgaXMgIGdvbmUsIGFzIHRoZSBnbHlwaCAgaW1hZ2UgdHlwZSBpcyAgcmV0dXJuZWQgaW4gdGhlCiAgICAgIGZpZWxkICJmYWNlLT5nbHlwaC5mb3JtYXQiCgogICAgLSB0aGUgbGlzdCAgb2YgYXZhaWxhYmxlICBjaGFybWFwcyBpcyBkaXJlY3RseSAgYWNjZXNzaWJsZSB0aHJvdWdoCiAgICAgICJmYWNlLT5jaGFybWFwcyIsICBjb3VudGluZyAiZmFjZS0+bnVtX2NoYXJtYXBzIiAgZWxlbWVudHMuIEVhY2gKICAgICAgY2hhcm1hcCAgaGFzIGFuICAnZW5jb2RpbmcnICBmaWVsZCB3aGljaCAgc3BlY2lmaWVzIHdoaWNoICBrbm93bgogICAgICBlbmNvZGluZyBpdCBkZWFscyB3aXRoLiBWYWxpZCB2YWx1ZXMgYXJlLCBmb3IgZXhhbXBsZSA6CgogICAgICAgICAgZnRfZW5jb2RpbmdfdW5pY29kZSAgICAgIChmb3IgQVNDSUksIExhdGluLTEgYW5kIFVuaWNvZGUpCiAgICAgICAgICBmdF9lbmNvZGluZ19hcHBsZV9yb21hbgogICAgICAgICAgZnRfZW5jb2Rpbmdfc2ppcwogICAgICAgICAgZnRfZW5jb2RpbmdfYWRvYmVfc3RhbmRhcmQKICAgICAgICAgIGZ0X2VuY29kaW5nX2Fkb2JlX2V4cGVydAoKICAgICAgb3RoZXIgIHZhbHVlcyBtYXkgIGJlIGFkZGVkICBpbiB0aGUgIGZ1dHVyZS4gRWFjaCAgY2hhcm1hcCBzdGlsbAogICAgICBob2xkcyAgaXRzICJwbGF0Zm9ybV9pZCIgIGFuZCAiZW5jb2RpbmdfaWQiICB2YWx1ZXMgaW4gIGNhc2UgdGhlCiAgICAgIGVuY29kaW5nIGlzIHRvbyBleG90aWMgZm9yIHRoZSBjdXJyZW50IGxpYnJhcnkKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpEaXJlY3RvcnkgU3RydWN0dXJlOgoKICBTaG91bGQgc2VlbSBvYnZpb3VzIHRvIG1vc3Qgb2YgeW91OgoKICAgICBmcmVldHlwZS8KICAgICAgICAgY29uZmlnLyAgICAgICAgLS0gY29uZmlndXJhdGlvbiBzdWItbWFrZWZpbGVzCiAgICAgICAgICAgIGFuc2kvCiAgICAgICAgICAgIHVuaXgvICAgICAgIC0tIHBsYXRmb3JtLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZXMKICAgICAgICAgICAgd2luMzIvCiAgICAgICAgICAgIG9zMi8KICAgICAgICAgICAgbXNkb3MvCgogICAgICAgICBpbmNsdWRlLyAgICAgICAtLSBwdWJsaWMgaGVhZGVyICBmaWxlcywgdGhvc2UgdG8gIGJlIGluY2x1ZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IGJ5IGNsaWVudCBhcHBzCgogICAgICAgICBzcmMvICAgICAgICAgICAtLSBzb3VyY2VzIG9mIHRoZSBsaWJyYXJ5CiAgICAgICAgICAgYmFzZS8gICAgICAgIC0tIHRoZSBiYXNlIGxheWVyCiAgICAgICAgICAgc2ZudC8gICAgICAgIC0tIHRoZSBzZm50ICJkcml2ZXIiICAoc2VlIHRoZSBkcml2ZXJzIHNlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cpCiAgICAgICAgICAgdHJ1ZXR5cGUvICAgIC0tIHRoZSB0cnVldHlwZSBkcml2ZXIKICAgICAgICAgICB0eXBlMS8gICAgICAgLS0gdGhlIHR5cGUxIGRyaXZlcgogICAgICAgICAgIHNoYXJlZC8gICAgICAtLSBzb21lIGhlYWRlciBmaWxlcyBzaGFyZWQgYmV0d2VlbiBkcml2ZXJzCgogICAgICAgICBkZW1vcy8gICAgICAgICAtLSBkZW1vcy90b29scwoKICAgICAgICAgZG9jcy8gICAgICAgICAgLS0gZG9jdW1lbnRhdGlvbiAoYSBiaXQgZW1wdHkgZm9yIG5vdykKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpHbHlwaCBJbWFnZSBGb3JtYXRzOgoKICBEcml2ZXJzIGFyZSBub3cgYWJsZSB0byAgcmVnaXN0ZXIgbmV3IGdseXBoIGltYWdlIGZvcm1hdHMgd2l0aGluIHRoZQogIGxpYnJhcnkuICBGb3IgIG5vdywgdGhlICBiYXNlIGxheWVyIHN1cHBvcnRzICBvZiBjb3Vyc2UgIGJpdG1hcHMgYW5kCiAgdmVjdG9yICBvdXRsaW5lcywgYnV0ICBvbmUgIGNvdWxkIGltYWdpbmUgIHNvbWV0aGluZyBkaWZmZXJlbnQgIGxpa2UKICBjb2xvcmVkIGJpdG1hcHMsIGJpLWNvbG9yIHZlY3RvcnMgb3Igd2F0aGV2ZXIgZWxzZSAoTWV0YWZvbnRzIGFueW9uZQogID8/KS4KCiAgU2VlICB0aGUgICBmaWxlICBgaW5jbHVkZS9mdGltYWdlLmgnLiAgIE5vdGUgIGFsc28gIHRoYXQgICB0aGUgIHR5cGUKICBGVF9SYXN0ZXJfTWFwICBpcyBnb25lLCAgYW5kICBpcyBub3cgIHJlcGxhY2VkICBieSBGVF9CaXRtYXAsICB3aGljaAogIHNob3VsZCBlbmNvbXBhc3MgYWxsIGtub3duIGJpdG1hcCB0eXBlcy4KCiAgRWFjaCBuZXcgIGltYWdlIGZvcm1hdCAgbXVzdCBwcm92aWRlIGF0ICBsZWFzdCBvbmUgInJhc3RlciIsICBpLmUuIGEKICBtb2R1bGUgY2FwYWJsZSBvZiAgdHJhbnNmb3JtaW5nIHRoZSBnbHlwaCBpbWFnZSBpbnRvICBhIGJpdG1hcC4gSXQncwogIGFsc28gcG9zc2libGUgIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCAgcmFzdGVyIHVzZWQgZm9yICBhIGdpdmVuIGdseXBoCiAgaW1hZ2UgZm9ybWF0LgoKICBUaGUgZGVmYXVsdCBvdXRsaW5lICBzY2FuLWNvbnZlcnRlciBub3cgdXNlcyAxMjggbGV2ZWxzICBvZiBncmF5cyBieQogIGRlZmF1bHQsICB3aGljaCB0ZW5kcyAgdG8gc21vb3RoICBtYW55ICB0aGluZ3MuIE5vdGUgIHRoYXQgdGhlICBkZW1vCiAgcHJvZ3JhbXMgaGF2ZSBiZWVuIHVwZGF0ZWQgc2lnbmlmaWNhbnRseSBpbiBvcmRlciB0byBkaXNwbGF5IHRoZXNlLi4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpCdWlsZCBzeXN0ZW06CgogIFlvdSBzdGlsbCBuZWVkICBHTlUgTWFrZSB0byBidWlsZCB0aGUgbGlicmFyeS4gIFRoZSBidWlsZCBzeXN0ZW0gaGFzCiAgYmVlbiB2ZXJ5IHNlcmlvdXNseSByZS12YW1wZWQgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGluZ3MgbGlrZSA6CgogICAtIGF1dG9tYXRpYyBob3N0IHBsYXRmb3JtICBkZXRlY3Rpb24gKHJldmVydGluZyB0byAnY29uZmlnL2Fuc2knIGlmCiAgICAgaXQgaXMgbm90IGRldGVjdGVkLCB3aXRoIHBzZXVkby1zdGFuZGFyZCBjb21waWxhdGlvbiBmbGFncykKCiAgIC0gdGhlIGFiaWxpdHkgdG8gY29tcGlsZSBmcm9tIHRoZSBNYWtlZmlsZXMgd2l0aCB2ZXJ5IGRpZmZlcmVudCBhbmQKICAgICBleG90aWMgY29tcGlsZXJzLiBOb3RlIHRoYXQgIGxpbmtpbmcgdGhlIGxpYnJhcnkgY2FuIGJlIGRpZmZpY3VsdAogICAgIGZvciBzb21lIHBsYXRmb3Jtcy4KCiAgICAgRm9yIGV4YW1wbGUsIHRoZSBmaWxlIGBjb25maWcvd2luMzIvbGNjbGliLmJhdCcgaXMgaW52b2tlZCBieSB0aGUKICAgICBidWlsZCBzeXN0ZW0gdG8gY3JlYXRlIHRoZSAiLmxpYiIgZmlsZSB3aXRoIExDQy1XaW4zMiBiZWNhdXNlIGl0cwogICAgIGxpYnJhcmlhbiAgaGFzIHRvbyAgbWFueSBmbGF3cyAgdG8gYmUgIGludm9rZWQgZGlyZWN0bHkgIGZyb20gdGhlCiAgICAgTWFrZWZpbGUuCgogIEhlcmUncyBob3cgaXQgd29ya3M6CgogIC0gdGhlIGZpcnN0IHRpbWUgeW91IHR5cGUgYG1ha2UnLCAgdGhlIGJ1aWxkIHN5c3RlbSBydW5zIGEgc2VyaWVzIG9mCiAgICBzdWItbWFrZWZpbGVzIGluIG9yZGVyIHRvIGRldGVjdCB5b3VyIGhvc3QgcGxhdGZvcm0uIEl0IHRoZW4gZHVtcHMKICAgIHdoYXQgIGl0IGZvdW5kLCAgYW5kICBjcmVhdGVzICBhIGZpbGUgIGNhbGxlZCAgYGNvbmZpZy5taycgaW4gIHRoZQogICAgY3VycmVudCAgZGlyZWN0b3J5LiBUaGlzICBpcyBhICBzdWItTWFrZWZpbGUgdXNlZCAgdG8gIGRlZmluZSBtYW55CiAgICBpbXBvcnRhbnQgTWFrZSB2YXJpYWJsZXMgdXNlZCB0byBidWlsZCB0aGUgbGlicmFyeS4KCiAgLSB0aGUgc2Vjb25kIHRpbWUsIHRoZSBidWlsZCBzeXN0ZW0gZGV0ZWN0cyB0aGUgYGNvbmZpZy5taycgdGhlbiB1c2UKICAgIGl0ICB0byAgYnVpbGQgdGhlICBsaWJyYXJ5LiAgQWxsIG9iamVjdCAgZmlsZXMgIGdvICBpbnRvICdvYmonICBieQogICAgZGVmYXVsdCwgIGFzIHdlbGwgIGFzIHRoZSAgbGlicmFyeSBmaWxlLCAgYnV0IHRoaXMgIGNhbiAgZWFzaWx5IGJlCiAgICBjaGFuZ2VkLgoKICBOb3RlIHRoYXQgIHlvdSBjYW4gcnVuICJtYWtlICBzZXR1cCIgdG8gZm9yY2UgIGFub3RoZXIgaG9zdCBwbGF0Zm9ybQogIGRldGVjdGlvbiAgZXZlbiAgIGlmICBhICBgY29uZmlnLm1rJyAgaXMgIHByZXNlbnQgICBpbiAgdGhlICBjdXJyZW50CiAgZGlyZWN0b3J5LiAgQW5vdGhlciBzb2x1dGlvbiAgaXMgIHNpbXBseSB0byAgZGVsZXRlICB0aGUgZmlsZSwgIHRoZW4KICByZS1ydW4gbWFrZS4KCiAgRmluYWxseSwgdGhlICBkZWZhdWx0IGNvbXBpbGVyICBmb3IgYWxsIHBsYXRmb3JtcyAgaXMgZ2NjICAoZm9yIG5vdywKICB0aGlzIHdpbGwgaG9wZWZ1bGx5IGNoYW5nZWQgaW4gIHRoZSBmdXR1cmUpLiBZb3UgY2FuIGhvd2V2ZXIgc3BlY2lmeQogIGEgZGlmZmVyZW50ICBjb21waWxlciBieSBzcGVjaWZ5aW5nICBpdCBhZnRlciB0aGUgJ3NldHVwJyAgdGFyZ2V0IGFzCiAgaW46CgogICAgICBnbnVtYWtlIHNldHVwIGxjYyAgICAgICAgIG9uIFdpbjMyIHRvIHVzZSB0aGUgTENDIGNvbXBpbGVyCiAgICAgIGdudW1ha2Ugc2V0dXAgdmlzdWFsYyAgICAgb24gV2luMzIgdG8gdXNlIFZpc3VhbCBDKysKCiAgU2VlICB0aGUgZmlsZSAgYGNvbmZpZy88c3lzdGVtPi9kZXRlY3QubWsnIGZvciAgYSBsaXN0ICBvZiBzdXBwb3J0ZWQKICBjb21waWxlcnMgZm9yIHlvdXIgcGxhdGZvcm1zLgoKICBJdCBzaG91bGQgYmUgcmVsYXRpdmVseSBlYXN5ICB0byB3cml0ZSBuZXcgZGV0ZWN0aW9uIHJ1bGVzIGZpbGVzIGFuZAogIGNvbmZpZy5tay4uCgogIEZpbmFsbHksIHRvICBidWlsZCB0aGUgZGVtbyBwcm9ncmFtcywgIGdvIHRvIGBkZW1vcycgIGFuZCBsYXVuY2ggR05VCiAgTWFrZSwgaXQgd2lsbCB1c2UgdGhlIGBjb25maWcubWsnICBpbiB0aGUgdG9wIGRpcmVjdG9yeSB0byBidWlsZCB0aGUKICB0ZXN0IHByb2dyYW1zLi4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpQb3J0YWJpbGl0eToKCiAgSW4gIHRoZSAgcHJldmlvdXMgIGJldGEsICBhICBzaW5nbGUgRlRfU3lzdGVtICBvYmplY3QgIHdhcyAgdXNlZCAgdG8KICBlbmNvbXBhc3MgIGFsbCAgbG93LWxldmVsICBvcGVyYXRpb25zIGxpa2UgIHRocmVhZCAgc3luY2hyb25pc2F0aW9uLAogIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBpL28gYWNjZXNzLiBUaGlzIGhhcyBiZWVuIGdyZWF0bHkgc2ltcGxpZmllZDoKCiAgICAtIHRocmVhZCBzeW5jaHJvbmlzYXRpb24gIGhhcyBiZWVuIGRyb3BwZWQsIGZvciAgdGhlIHNpbXBsZSByZWFzb24KICAgICAgdGhhdCB0aGUgbGlicmFyeSAgaXMgYWxyZWFkeSByZS1lbnRyYW50LCBhbmQgdGhhdCAgaWYgeW91IHJlYWxseQogICAgICBuZWVkICB0d28gIHRocmVhZHMgYWNjZXNzaW5nICB0aGUgIHNhbWUgIEZUX0xpYnJhcnksIHlvdSAgc2hvdWxkCiAgICAgIHJlYWxseSBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gaXQgeW91cnNlbGYgd2l0aCBhIHNpbXBsZSBtdXRleC4KCiAgICAtIG1lbW9yeSAgbWFuYWdlbWVudCBpcyAgcGVyZm9ybWVkICB0aHJvdWdoIGEgIHZlcnkgc2ltcGxlICBvYmplY3QKICAgICAgY2FsbGVkICJGVF9NZW1vcnkiLCAgd2hpY2ggcmVhbGx5IGlzIGEgdGFibGUgIGNvbnRhaW5pbmcgYSB0YWJsZQogICAgICBvZiBwb2ludGVycyB0byAgZnVuY3Rpb25zIGxpa2UgbWFsbG9jLCByZWFsbG9jIGFuZCAgZnJlZSBhcyB3ZWxsCiAgICAgIGFzIHNvbWUgdXNlciBkYXRhIChjbG9zdXJlKS4KCiAgICAtIHJlc291cmNlcyBoYXZlIGRpc2FwcGVhcmVkICh0aGV5IGNyZWF0ZWQgbW9yZSBwcm9ibGVtcyB0aGFuIHRoZXkKICAgICAgc29sdmVkKSwgYW5kICBpL28gbWFuYWdlbWVudCBoYXZlICBiZWVuIHNpbXBsaWZpZWQgZ3JlYXRseSAgYXMgYQogICAgICByZXN1bHQuIFN0cmVhbXMgYXJlIGRlZmluZWQgdGhyb3VnaCBGVF9TdHJlYW0gb2JqZWN0cywgd2hpY2ggY2FuCiAgICAgIGJlIGVpdGhlciBtZW1vcnktYmFzZWQgb3IgZGlzay1iYXNlZC4KCiAgICAgIE5vdGUgdGhhdCAgZWFjaCBmYWNlICBoYXMgaXRzIG93biAgc3RyZWFtLCB3aGljaCBpcyAgY2xvc2VkIG9ubHkKICAgICAgd2hlbiAgdGhlICBmYWNlIG9iamVjdCAgaXMgIGRlc3Ryb3llZC4gIEhlbmNlLCAgYSBmdW5jdGlvbiAgbGlrZQogICAgICBUVF9GbHVzaF9GYWNlIGluICAxLnggY2Fubm90IGJlIGRpcmVjdGx5ICBzdXBwb3J0ZWQuIEhvd2V2ZXIsIGlmCiAgICAgIHlvdSByZWFsbHkgbmVlZCBzb21ldGhpbmcgbGlrZSAgdGhpcywgeW91IGNhbiBlYXNpbHkgdGFpbG9yIHlvdXIKICAgICAgb3duIHN0cmVhbXMgIHRvIGFjaGlldmUgdGhlIHNhbWUgIGZlYXR1cmUgYXQgYSAgbG93ZXIgbGV2ZWwgKGFuZAogICAgICB1c2UgRlRfT3Blbl9GYWNlIGluc3RlYWQgb2YgRlRfTmV3X0ZhY2UgdG8gY3JlYXRlIHRoZSBmYWNlKS4KCiAgU2VlIHRoZSBmaWxlICAiaW5jbHVkZS9mdHN5c3RlbS5oIiBmb3IgbW9yZSBkZXRhaWxzLCBhcyAgd2VsbCBhcyB0aGUKICBpbXBsZW1lbnRhdGlvbnMgZm91bmQgaW4gImNvbmZpZy91bml4IiBhbmQgImNvbmZpZy9hbnNpIi4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb250IERyaXZlcnM6CgogIFRoZSAgRm9udCBEcml2ZXIgIGludGVyZmFjZSBoYXMgIGJlZW4gbW9kaWZpZWQgIGluIG9yZGVyICB0byBzdXBwb3J0CiAgZXh0ZW5zaW9ucyAmIHZlcnNpb25pbmcuCgoKICBUaGUgIGxpc3Qgb2YgIHRoZSBmb250ICBkcml2ZXJzIHRoYXQgIGFyZSBzdGF0aWNhbGx5ICBsaW5rZWQgIHRvIHRoZQogIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lIGlzICBtYW5hZ2VkIHRocm91Z2ggYSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCiAgY2FsbGVkIGBjb25maWcvPHBsYXRmb3JtPi9mdG1vZHVsZS5oJy4KCiAgVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgd2hlbiBpbnZva2luZyBgbWFrZSBtb2R1bGVzJy4gVGhpcyB0YXJnZXQKICB3aWxsIHBhcnNlICBhbGwgc3ViLWRpcmVjdG9yaWVzIG9mICdzcmMnLCBsb29raW5nICBmb3IgYSAibW9kdWxlLm1rIgogIHJ1bGVzIGZpbGUsIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGRyaXZlciB0byB0aGUgYnVpbGQgc3lzdGVtLgoKICBIZW5jZSwgb25lICBzaG91bGQgY2FsbCAgYG1ha2UgbW9kdWxlcycgZWFjaCAgdGltZSBhIGZvbnQgIGRyaXZlciBpcwogIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgYHNyYycgZGlyZWN0b3J5LgoKICBGaW5hbGx5LCB0aGlzIHZlcnNpb24gcHJvdmlkZXMgYSAicHNldWRvLWRyaXZlciIgaW4gYHNyYy9zZm50Jy4gVGhpcwogIGRyaXZlciBkb2Vzbid0ICBzdXBwb3J0IGZvbnQgIGZpbGVzIGRpcmVjdGx5LCBidXQgIHByb3ZpZGVzIHNlcnZpY2VzCiAgdXNlZCBieSAgYWxsIFRydWVUeXBlLWxpa2UgZm9udCAgZHJpdmVycy4gSGVuY2UsIGl0cyBjb2RlICBpcyBzaGFyZWQKICBiZXR3ZWVuICB0aGUgVHJ1ZVR5cGUgICYgT3BlblR5cGUgIGZvbnQgZm9ybWF0cywgIGFuZCAgcG9zc2libHkgbW9yZQogIGZvcm1hdHMgdG8gY29tZSBpZiB3ZSdyZSBsdWNreS4uCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXh0ZW5zaW9ucyBzdXBwb3J0OgoKICBUaGUgZXh0ZW5zaW9ucyBzdXBwb3J0IGlzIGluc3BpcmVkIGJ5IHRoZSBvbmUgZm91bmQgaW4gMS54LgoKICBOb3csIGVhY2ggZm9udCBkcml2ZXIgaGFzICBpdHMgb3duICJleHRlbnNpb24gcmVnaXN0cnkiLCB3aGljaCBsaXN0cwogIHdoaWNoIGV4dGVuc2lvbnMgIGFyZSBhdmFpbGFibGUgIGZvciB0aGUgZm9udCAgZmFjZXMgbWFuYWdlZCAgYnkgdGhlCiAgZHJpdmVyLgoKICBFeHRlbnNpb24gaWRzIGFyZSAgbm93IHN0cmluZ3MsIHJhdGhlciB0aGFuIDQtYnl0ZSAgdGFncywgYXMgdGhpcyBpcwogIHVzdWFsbHkgbW9yZSByZWFkYWJsZS4uCgogIEVhY2ggZXh0ZW5zaW9uIGhhczoKICAgIC0gc29tZSBkYXRhLCBhc3NvY2lhdGVkIHRvIGVhY2ggZmFjZSBvYmplY3QKICAgIC0gYW4gaW50ZXJmYWNlICh0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycykKCiAgQW4gZXh0ZW5zaW9uICB0aGF0IGlzIGZvcm1hdC1zcGVjaWZpYyBzaG91bGQgIHNpbXBseSByZWdpc3RlciBpdHNlbGYKICB0byB0aGUgY29ycmVjdCBmb250IGRyaXZlci4gSGVyZSBpcyBzb21lIGV4YW1wbGUgY29kZToKCiAgIC8vIFJlZ2lzdGVyaW5nIGFuIGV4dGVuc2lvbnMKICAgLy8KICAgRlRfRXJyb3IgIEZUX0luaXRfWFhYWF9FeHRlbnNpb24oIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQogICB7CiAgICAgRlRfRHJpdmVySW50ZXJmYWNlKiAgdHRfZHJpdmVyOwoKICAgICBkcml2ZXIgPSBGVF9HZXRfRHJpdmVyKCBsaWJyYXJ5LCAidHJ1ZXR5cGUiICk7CiAgICAgaWYgKCFkcml2ZXIpIHJldHVybiBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlOwoKICAgICByZXR1cm4gRlRfUmVnaXN0ZXJfRXh0ZW5zaW9uKCBkcml2ZXIsICZleHRlbnNpb25fY2xhc3MgKTsKICAgfQoKCiAgIC8vIEltcGxlbWVudGluZyB0aGUgZXh0ZW5zaW9ucwogICAvLwogICBGVF9FcnJvciAgRlRfUHJvY2VlZF9FeHRlbnNpb25fWFhYKCBGVF9GYWNlICBmYWNlICkKICAgewogICAgIEZUX1hYWF9FeHRlbnNpb24gICAgICAgICAgICBleHQ7CiAgICAgRlRfWFhYX0V4dGVuc2lvbl9JbnRlcmZhY2UgIGV4dF9pbnRlcmZhY2U7CgogICAgIGV4dCA9IEZUX0dldF9FeHRlbnNpb24oIGZhY2UsICJleHRlbnNpb25pZCIsICZleHRfaW50ZXJmYWNlICk7CiAgICAgaWYgKCFleHQpIHJldHVybiBlcnJvcjsKCiAgICAgcmV0dXJuIGV4dF9pbnRlcmZhY2UtPmRvX2l0KGV4dCk7CiAgIH0KCi0tLSBlbmQgb2YgQ0hBTkdFUyAtLS0K