TEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjIuMCBhbmQgMi4xLjEwCgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFZlcnRpY2FsIG1ldHJpY3MgZm9yIFNGTlQgZm9udHMgd2VyZSBpbmNvcnJlY3Qgc29tZXRpbWVzLgoKICAgIC0gVGhlIEZUX0hBU19LRVJOSU5HIG1hY3JvIGFsd2F5cyByZXR1cm5lZCAwLgoKICAgIC0gQ0ZGIE9wZW5UeXBlICBmb250cyBkaWRuJ3QgIHJldHVybiBjb3JyZWN0IHZlcnRpY2FsICBtZXRyaWNzIGZvcgogICAgICBnbHlwaHMgd2l0aCBvdXRsaW5lcy4KCiAgICAtIElmIEZyZWVUeXBlIHdhcyBjb21waWxlZCB3aXRob3V0IGhpbnRlcnMsIGFsbCBmb250IGZvcm1hdHMgYmFzZWQKICAgICAgb24gUFMgb3V0bGluZXMgd2VyZW4ndCBzY2FsZWQgY29ycmVjdGx5LgoKCiAgSUkuIElNUE9SVEFOVCBDSEFOR0VTCgogICAgLSBGcmVlVHlwZSdzIGJ1aWxkICBtZWNoYW5pc20gaGFzIGJlZW4gcmVkZXNpZ25lZC4gICBXaXRoIEdOVSBtYWtlCiAgICAgIGl0ICBpcyAgbm93ICBzdWZmaWNpZW50ICBpbiAgIG1vc3QgIGNhc2VzICB0byAgZWRpdCAgdHdvICBmaWxlczoKICAgICAgYG1vZHVsZXMuY2ZnJywgIHRvICBzZWxlY3QgICB0aGUgIGxpYnJhcnkgIGNvbXBvbmVudHMsICBhbmQgIHRoZQogICAgICBjb25maWd1cmF0aW9uICBmaWxlICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcgKHdoaWNoCiAgICAgIGNhbiBiZSBjb3BpZWQgdG8gdGhlIG9iamVjdHMgZGlyZWN0b3J5KS4gIFJlbW92aW5nIHVudXNlZCBtb2R1bGUKICAgICAgZGlyZWN0b3JpZXMgICB0byAgICBwcmV2ZW50ICAgaXRzICAgY29tcGlsYXRpb24gICAgYW5kICAgZWRpdGluZwogICAgICBgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KCiAgICAtIFRoZSAgTElHSFQgIGhpbnRpbmcgYWxnb3JpdGhtICBwcm9kdWNlcyAgbW9yZSBwbGVhc2FudCAgcmVzdWx0cy4KICAgICAgQWxzbywgdXNpbmcgdGhlICBGVF9MT0FEX1RBUkdFVF9MSUdIVCBmbGFncyB3aXRoaW4gRlRfTG9hZF9HbHlwaAogICAgICBhbHdheXMgZm9yY2VzIGF1dG8taGludGluZywgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbi4KCiAgICAtIEZhY2UgIG1ldHJpY3MgKGZhY2UtPnNpemUtPm1ldHJpY3MpICBhbmQgIGdseXBoICBtZXRyaWNzIGFyZSAgbm8KICAgICAgbG9uZ2VyIHJvdW5kZWQuICBJZiB5b3UgZG8gbm90IHJvdW5kIG9yIHJvdW5kIGltcHJvcGVybHkgaW4geW91cgogICAgICBhcHBsaWNhdGlvbnMsIHlvdSBtYXkgZmluZCBnbHlwaHMgY2xpcHBlZCAgb3IgYmx1cnJlZC4gIFVzdWFsbHksCiAgICAgIHlvdSB3b3VsZCAgbGlrZSB0byBgY2VpbCcgIHRoZSBhc2NlbmRlciwgYGZsb29yJyAgdGhlIGRlc2NlbmRlciwKICAgICAgYW5kIGByb3VuZCcgdGhlIGFkdmFuY2UuCgogICAgLSBBICBuZXcgQVBJICBgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZScgIChpbiBGVF9HWF9WQUxJREFURV9IKSAgaGFzCiAgICAgIGJlZW4gYWRkZWQgdG8gdmFsaWRhdGUgVHJ1ZVR5cGUgR1gvQVRUIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwKICAgICAgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgdHJhaywgIHByb3ApLiAgQWZ0ZXIgdmFsaWRhdGlvbiBpdCBpcyBubwogICAgICBsb25nZXIgIG5lY2Vzc2FyeSB0byAgY2hlY2sgIGZvciBlcnJvcnMgIGluICB0aG9zZSB0YWJsZXMgIHdoaWxlCiAgICAgIGFjY2Vzc2luZyAgdGhlbS4gIFRoaXMgIGNvZGUgIGhhcyBiZWVuICBjb250cmlidXRlZCBieSAgTWFzYXRha2UKICAgICAgWWFtYXRvIGFuZCBUb3NoaXlhIFN1enVraS4KCiAgICAtIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2sgZnVuY3Rpb24gIHR5cGVzIGhhdmUgY2hhbmdlZCBzbGlnaHRseSAoYnkKICAgICAgYWRkaW5nIHRoZSBgY29uc3QnIGtleXdvcmQgd2hlcmUgYXBwcm9wcmlhdGUpOgoKICAgICAgICBGVF9PdXRsaW5lX01vdmVUb0Z1bmMKICAgICAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMKICAgICAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jCiAgICAgICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYwogICAgICAgIEZUX1NwYW5GdW5jCiAgICAgICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMKCiAgICAgICAgRlRfR2x5cGhfVHJhbnNmb3JtRnVuYwogICAgICAgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMKICAgICAgICBGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jCgogICAgICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFmZmVjdCBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgLSBPbiBNYWNPUywgIG5ldyBBUElzIGhhdmUgIGJlZW4gYWRkZWQgYXMgcmVwbGFjZW1lbnRzICBmb3IgbGVnYWN5CiAgICAgIEFQSXM6ICBgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZicgIGZvciAgYEZUX05ld19GYWNlX0Zyb21fRlNTcGVjJywKICAgICAgYW5kICAgICAgICAgICAgICBgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZScgICAgICAgICAgICAgIGZvcgogICAgICBgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lJy4gIExlZ2FjeSBBUElzIGFyZSBzdGlsbCBhdmFpbGFibGUsIGlmCiAgICAgIEZyZWVUeXBlIGlzIGJ1aWx0IHdpdGhvdXQgZGlzYWJsaW5nIHRoZW0uCgogICAgLSBBIG5ldyBBUEkgYEZUX1NlbGVjdF9TaXplJyBpcyBhZGRlZCB0byBzZWxlY3QgYSBiaXRtYXAgc3RyaWtlIGJ5CiAgICAgIGl0cyBpbmRleC4gIENvZGUgIHVzaW5nIG90aGVyIGZ1bmN0aW9ucyB0byBzZWxlY3QgYml0bWFwIHN0cmlrZXMKICAgICAgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uCgogICAgLSBJbiAyLjEuMTAsICB0aGUgYmVoYXZpb3Igb2YgYEZUX1NldF9QaXhlbF9TaXplcycgIGlzIGNoYW5nZWQgZm9yCiAgICAgIEJERi9QQ0YgIGZvbnRzLCAgYW5kIG9ubHkgZm9yICB0aGVtLiAgVGhpcyBjYXVzZXMgaW5jb25zaXN0ZW5jeS4KICAgICAgSW4gdGhpcyByZWxlYXNlLCAgd2UgdW5kbyB0aGUgY2hhbmdlLiAgVGhlIGludGVudCAgb2YgdGhlIGNoYW5nZQogICAgICBpbiAyLjEuMTAgIGlzIHRvIGFsbG93ICBzaXplIHNlbGVjdGlvbiB0aHJvdWdoICByZWFsIGRpbWVuc2lvbnMsCiAgICAgIHdoaWNoIGNhbiBub3cgYmUgZG9uZSB0aHJvdWdoIGBGVF9SZXF1ZXN0X1NpemUnLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgZG9jdW1lbnRhdGlvbiAgZm9yIEZUX0xPQURfVEFSR0VUX1hYWCBhbmQgRlRfUkVOREVSX01PREVfWFhYCiAgICAgIHZhbHVlcyBub3cgYmV0dGVyIHJlZmxlY3RzIGl0cyB1c2FnZSBhbmQgZGlmZmVyZW5jZXM6IE9uZSBzZXQgaXMKICAgICAgdXNlZCB0byBzcGVjaWZ5IHRoZSBoaW50aW5nIGFsZ29yaXRobSwgdGhlIG90aGVyIHRvIHNwZWNpZnkgcHRoZQogICAgICBpeGVsIHJlbmRlcmluZyBtb2RlLgogICAgCiAgICAtIEZUX05ld19GYWNlKCkgIGFuZCAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCkgIGluICBmdG1hYy5jICBhcmUKICAgICAgY2hhbmdlZCB0byBjb3VudCBzdXBwb3J0ZWQgc2NhbGFibGUgZmFjZXMgKHNmbnQsIExXRk4pIG9ubHksIGFuZAogICAgICByZXR1cm5zICB0aGUgIG51bWJlciAgb2YgIGF2YWlsYWJsZSBmYWNlcyAgdmlhICBmYWNlLT5udW1fZmFjZXMuCiAgICAgIFVuc3VwcG9ydGVkIGJpdG1hcCBmYWNlcyAoZmJpdCwgTkZOVCkgYXJlIGlnbm9yZWQuCgogICAgLSBidWlsZHMvdW5peC9jb25maWd1cmUgIGhhcyBiZWVuICBpbXByb3ZlZCBmb3IgIE1hY09TIFguICAgSXQgbm93CiAgICAgIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGF2YWlsYWJsZSAgZnVuY3Rpb25zIGluIENhcmJvbiBsaWJyYXJ5LCBhbmQKICAgICAgcHJlcGFyZSB0byB1c2UgbmV3ZXN0ICBmdW5jdGlvbnMgYnkgZGVmYXVsdC4gIE9wdGlvbnMgdG8gc3BlY2lmeQogICAgICB0aGUgIGRlcGVuZGVuY2llcyBvZiAgZWFjaCBDYXJib24gIEFQSXMgKEZTU3BlYywgIEZTUmVmLCBvbGQvbmV3CiAgICAgIFF1aWNrRHJhdywgQVRTKSAgYXJlIGF2YWlsYWJsZSB0b28uICBCeSBtYW51YWwgIGRpc2FibGluZyBvZiBhbGwKICAgICAgUXVpY2tEcmF3ICAgZnVuY3Rpb25hbGl0eSwgIEZyZWVUeXBlICAgY2FuICAgYmUgIGJ1aWx0ICAgd2l0aG91dAogICAgICBgZGVwcmVjYXRlZCAgIGZ1bmN0aW9uJyAgIHdhcm5pbmdzICAgIG9uICAgTWFjT1MgICAxMC40LngsICAgYnV0CiAgICAgIEZUX0dldEZpbGVfTWFjX05hbWUgIGluICBmdG1hYy5jICB0aGVuICBpcyBjaGFuZ2VkICB0byAgYSAgZHVtbXkKICAgICAgZnVuY3Rpb24sIGFuZCByZXR1cm5zIGFuIGB1bmltcGxlbWVudGVkJyBlcnJvci4gIEZvciBkZXRhaWxzIHNlZQogICAgICBidWlsZHMvbWFjL1JFQURNRS4KCiAgICAtIFNGTlQgY21hcCBoYW5kbGluZyBoYXMgYmVlbiBpbXByb3ZlZCwgbWFpbmx5IHRvIHJ1biBmYXN0ZXIuCgogICAgLSBBIG5ldyAgZmFjZSBmbGFnIGBGVF9GQUNFX0ZMQUdfSElOVEVSJyAgaGFzIGJlZW4gYWRkZWQgIHdoaWNoIGlzCiAgICAgIHNldCBpZiB0aGUgZm9udCdzIGRyaXZlciBoYXMgIGEgaGludGluZyBlbmdpbmUgb2YgaXRzIG93bi4gIFRoaXMKICAgICAgbWFrZXMgIGl0IHBvc3NpYmxlICB0byBjaGVjayAgYXQgcnVuLXRpbWUgIHdoZXRoZXIgIHRoZSBUcnVlVHlwZQogICAgICBieXRlY29kZSBpbnRlcnByZXRlciAgaGFzIGJlZW4gYWN0aXZhdGVkLiAgQW4gZXhhbXBsZSAgdXNlIGlzIHRvCiAgICAgIGVuYWJsZSAgdGhlIGludGVycHJldGF0aW9uIG9mICB0aGUgYGdhc3AnICB0YWJsZSBvbmx5ICBpZiBuYXRpdmUKICAgICAgVHJ1ZVR5cGUgaGludGluZyBpcyBhdmFpbGFibGUuCgogICAgLSBBIG5ldyBmdW5jdGlvbiBgRlRfTW9kdWxlX0dldF9GbGFncycgKGRlY2xhcmVkIGluIGBGVF9NT0RVTEVfSCcpCiAgICAgIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgbW9kdWxlIGZsYWdzIGZvciBhIGdpdmVuIG1vZHVsZS4KCiAgICAtIFZlcnRpY2FsIG1ldHJpY3Mgb2YgZ2x5cGhzIGFyZSAgc3ludGhlc2l6ZWQgaWYgdGhlIGZvbnQgZG9lcyBub3QKICAgICAgcHJvdmlkZSBzdWNoIGluZm9ybWF0aW9uLiAgWW91IGNhbiB0ZWxsIHdoZXRoZXIgIHRoZSBtZXRyaWNzIGFyZQogICAgICBzeW50aGVzaXplZCBvciBub3QgYnkgY2hlY2tpbmcgdGhlIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCBmbGFnIG9mCiAgICAgIHRoZSBmYWNlLgoKICAgIC0gVGhlIGRlbW8gcHJvZ3JhbXMgIGBmdHZpZXcnIGFuZCAgYGZ0c3RyaW5nJyBoYXZlIGJlZW4gIHJld3JpdHRlbgogICAgICBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5LgoKICAgIC0gRnJlZVR5cGUgbm93IGhvbm91cnMgYml0IDEgaW4gdGhlIGBoZWFkJyB0YWJsZSBvZiBUcnVlVHlwZSBmb250cwogICAgICAobWVhbmluZyBgbGVmdCBzaWRlYmVhcmluZyBwb2ludCBhdCB4PTAnKS4gIFRoaXMgaGVscHMgd2l0aCBzb21lCiAgICAgIGJ1Z2d5IGZvbnRzLgoKICAgIC0gUnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgQWRvYmUncyBuZXcgYFNJTkcgR2x5cGhsZXQnIGZvcm1hdC4gIFNlZQoKICAgICAgICBodHRwOi8vd3d3LmFkb2JlLmNvbS9wcm9kdWN0cy9pbmRlc2lnbi9zaW5nX2dhaWppLmh0bWwKCiAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAgIC0gVGhlIGBmdGR1bXAnICBwcm9ncmFtIGZyb20gdGhlIGBmdDJkZW1vcycgYnVuZGxlICBub3cgc2hvd3Mgc29tZQogICAgICBpbmZvcm1hdGlvbiBhYm91dCBjaGFybWFwcy4gIEl0ICBhbHNvIHN1cHBvcnRzIGEgbmV3IHN3aXRjaCBgLXYnCiAgICAgIHRvIGluY3JlYXNlIHZlcmJvc2l0eS4KCiAgICAtIEJldHRlciBBRk0gc3VwcG9ydC4gIFRoaXMgaW5jbHVkZXMgdHJhY2sga2VybmluZyBzdXBwb3J0LgoKICAgIC0gVGhlICBhdXRvIGhpbnRlciAgbm93IGVtcGxveXMgIGEgbmV3ICBhbGdvcml0aG0sICBiYXNlZCBvbiBBa2l0bwogICAgICBIaXJhaSdzIHBhdGNoLCBmb3IgdGhlIENKSyBzY3JpcHQuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMTAgYW5kIDIuMS45CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSBzaXplIGNvbXBhcmlzb24gZm9yIEJERiBhbmQgUENGIGZpbGVzIGNvdWxkIGZhaWwgc29tZXRpbWVzLgoKICAgIC0gU29tZSAgQ0ZGIGZpbGVzICB3ZXJlIHN0aWxsIG5vdCAgbG9hZGVkICBjb3JyZWN0bHkuICAgUGF0Y2ggZnJvbQogICAgICBEZXJlayBOb29uYnVyZy4KCiAgICAtIFRoZSBzdHJva2VyIHN0aWxsIGhhZCBzb21lIHNlcmlvdXMgYnVncy4KCiAgICAtIEJvcmlzICBMZXRvY2hhICBmaXhlZCBhICBidWcgaW4gIHRoZSAgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXI6ICBUaGUKICAgICAgTlBVU0hXIGluc3RydWN0aW9uIHdhc24ndCBza2lwcGVkIGNvcnJlY3RseSBpbiBJRiBjbGF1c2VzLiAgU29tZQogICAgICBmb250cyBsaWtlIGBIZWx2ZXRpY2EgNzUgQm9sZCcgZmFpbGVkLgoKICAgIC0gQW5vdGhlciAgc2VyaW91cyAgYnVnICBpbiAgaGFuZGxpbmcgIFRydWVUeXBlIGhpbnRzICBjYXVzZWQgbWFueQogICAgICBkaXN0b3J0aW9ucy4gIEl0IGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdmVyc2lvbiAyLjEuOCwgYW5kIGl0IGlzCiAgICAgIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1cGdyYWRlLgoKICAgIC0gRnJlZVR5cGUgZGlkbid0IHByb3Blcmx5IHBhcnNlIGVtcHR5IFR5cGUgMSBnbHlwaHMuCgogICAgLSBBbiB1bmJvdW5kIGR5bmFtaWMgYnVmZmVyIGdyb3d0aCB3YXMgZml4ZWQgaW4gdGhlIFBGUiBsb2FkZXIuCgogICAgLSBTZXZlcmFsIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkIGluIHRoZSBjYWNoZSBzdWItc3lzdGVtLgoKICAgIC0gRnJlZVR5cGUgYmVoYXZlZCBpbmNvcnJlY3RseSB3aGVuIHJlc2l6aW5nIHR3byBkaXN0aW5jdCBidXQgdmVyeQogICAgICBjbG9zZSBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZXMgdGhyb3VnaCBgRlRfU2V0X0NoYXJfU2l6ZScgKFNhdmFubmFoCiAgICAgIGJ1ZyAjMTIyNjMpLgoKICAgIC0gVGhlIGF1dG8taGludGVyIGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvciBmb250cyB3aXRob3V0IGEgVW5pY29kZQogICAgICBjaGFybWFwIC0tIGl0IGV2ZW4gcmVmdXNlZCB0byBsb2FkIHRoZSBnbHlwaHMuCgoKICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKCiAgICAtIE1hbnkgZml4ZXMgaGF2ZSBiZWVuIGFwcGxpZWQgdG8gZHJhc3RpY2FsbHkgcmVkdWNlIHRoZSBhbW91bnQgb2YKICAgICAgaGVhcCAgIG1lbW9yeSAgIHVzZWQgICBieSAgIEZyZWVUeXBlLCAgIGVzcGVjaWFsbHkgICB3aGVuICB1c2luZwogICAgICBtZW1vcnktbWFwcGVkIGZvbnQgZmlsZXMgICh3aGljaCBpcyB0aGUgZGVmYXVsdCBvbiBVbml4ICBzeXN0ZW1zCiAgICAgIHdoaWNoIHN1cHBvcnQgdGhlbSkuCgogICAgLSBUaGUgYXV0by1oaW50ZXIgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBuZXcgbW9kdWxlLCBjYWxsZWQgdGhlCiAgICAgIGBhdXRvLWZpdHRlcicuICBJdCBjb25zdW1lcyAgbGVzcyBtZW1vcnkgIHRoYW4gaXRzICBwcmVkZWNlc3NvciwKICAgICAgYW5kIGl0IGlzICBwcmVwYXJlZCB0byBzdXBwb3J0IG5vbi1sYXRpbiBzY3JpcHRzICBiZXR0ZXIgaW4gbmV4dAogICAgICByZWxlYXNlcy4KCiAgICAtIEdlb3JnZSBXaWxsaWFtcyAgY29udHJpYnV0ZWQgY29kZSB0byByZWFkICBrZXJuaW5nIGRhdGEgZnJvbSBQRk0KICAgICAgZmlsZXMuCgogICAgLSBGcmVlVHlwZSAgIG5vdyAgIHVzZXMgICAgdGhlICAgVFRfTkFNRV9JRF9QUkVGRVJSRURfRkFNSUxZICAgYW5kCiAgICAgIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgIHN0cmluZ3MgICAoaWYgICBhdmFpbGFibGUpICBmb3IKICAgICAgc2V0dGluZyAgZmFtaWx5ICBhbmQgIHN0eWxlIGluIFNGTlQgIGZvbnRzICAocGF0Y2ggZnJvbSBLb3JuZmVsZAogICAgICBFbGl5YWh1IFBldGVyKS4KCiAgICAtIEEgIG5ldyAgQVBJIGBGVF9TZm50X1RhYmxlX0luZm8nICAoaW4gRlRfVFJVRVRZUEVfVEFCTEVTX0gpICBoYXMKICAgICAgYmVlbiBhZGRlZCB0byByZXRyaWV2ZSBuYW1lIGFuZCBzaXplIGluZm9ybWF0aW9uIG9mIFNGTlQgdGFibGVzLgoKICAgIC0gQSBuZXcgQVBJIGBGVF9PcGVuVHlwZV9WYWxpZGF0ZScgKGluIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gpIGhhcwogICAgICBiZWVuIGFkZGVkIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcyAgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsCiAgICAgIEpTVEYpLiAgIEFmdGVyIHZhbGlkYXRpb24gIGl0IGlzICBubyBsb25nZXIgIG5lY2Vzc2FyeSB0byAgY2hlY2sKICAgICAgZm9yIGVycm9ycyBpbiB0aG9zZSB0YWJsZXMgd2hpbGUgYWNjZXNzaW5nIHRoZW0uCgogICAgICBOb3RlIHRoYXQgIHRoaXMgbW9kdWxlIG1pZ2h0ICBiZSBtb3ZlZCB0byBhbm90aGVyIGxpYnJhcnkgaW4gdGhlCiAgICAgIGZ1dHVyZSAgdG8gYXZvaWQgIGEgdGlnaHQgIGRlcGVuZGVuY3kgYmV0d2VlbiAgRnJlZVR5cGUgYW5kICB0aGUKICAgICAgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4KCiAgICAtIEEgbmV3IEFQSSBpbiBGVF9CSVRNQVBfSCAgKGBGVF9CaXRtYXBfTmV3JywgYEZUX0JpdG1hcF9Db252ZXJ0JywKICAgICAgYEZUX0JpdG1hcF9Db3B5JywgIGBGVF9CaXRtYXBfRW1ib2xkZW4nLCAgYEZUX0JpdG1hcF9Eb25lJykgIGhhcwogICAgICBiZWVuIGFkZGVkLiAgIEl0cyAgdXNlIGlzICB0byBjb252ZXJ0IGFuICBGVF9CaXRtYXAgc3RydWN0dXJlIGluCiAgICAgIDFicHAsIDJicHAsICA0YnBwLCBvciA4YnBwICBmb3JtYXQgaW50byAgYW5vdGhlciA4YnBwIEZUX0JpdG1hcCwKICAgICAgcHJvYmFibHkgdXNpbmcgYSBkaWZmZXJlbnQgcGl0Y2gsIGFuZCB0byBmdXJ0aGVyIG1hbmlwdWxhdGUgaXQuCgogICAgLSBBIG5ldyAgQVBJIGBGVF9PdXRsaW5lX0VtYm9sZGVuJyAgKGluIEZUX09VVExJTkVfSCkgZ2l2ZXMgIGZpbmVyCiAgICAgIGNvbnRyb2wgaG93ICBvdXRsaW5lcyBhcmUgZW1ib2xkZWQuCgogICAgLSBgRlRfR2x5cGhTbG90X0VtYm9sZGVuJyAoaW4gRlRfU1lOVEhFU0lTX0gpICBub3cgaGFuZGxlcyBiaXRtYXBzCiAgICAgIGFsc28gKGNvZGUgY29udHJpYnV0ZWQgIGJ5IENoaWEgSSBXdSkuICBOb3RlIHRoYXQgdGhpcyAgZnVuY3Rpb24KICAgICAgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVwbGFjZWQgd2l0aCBhIGJldHRlciBBUEkuCgogICAgLSBUaGUgbWV0aG9kICBob3cgQkRGIGFuZCBQQ0YgIGJpdG1hcCBmb250cyAgYXJlIGFjY2Vzc2VkIGhhcyBiZWVuCiAgICAgIHJlZmluZWQuICAgRm9ybWVybHksICAgRlRfU2V0X1BpeGVsX1NpemVzICBhbmQgIEZUX1NldF9DaGFyX1NpemUKICAgICAgd2VyZSAgc3lub255bXMgaW4gIEZyZWVUeXBlJ3MgIEJERiBhbmQgUENGIGludGVyZmFjZS4gIFRoaXMgIGhhcwogICAgICBjaGFuZ2VkIG5vdy4gIEZUX1NldF9QaXhlbF9TaXplcyAgc2hvdWxkIGJlICB1c2VkIHRvICBzZWxlY3QgdGhlCiAgICAgIGFjdHVhbCAgZm9udCBkaW1lbnNpb25zICAodGhlIGBzdHJpa2UnLCAgd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGUKICAgICAgYEZPTlRfQVNDRU5UJyAgICBhbmQgICAgYEZPTlRfREVTQ0VOVCcgICAgcHJvcGVydGllcyksICAgICB3aGlsZQogICAgICBGVF9TZXRfQ2hhcl9TaXplICBzZWxlY3RzICB0aGUgIGBub21pbmFsJyBzaXplICAodGhlIGBQSVhFTFNJWkUnCiAgICAgIHByb3BlcnR5KS4gIEluIGJvdGggZnVuY3Rpb25zLCB0aGUgd2lkdGggcGFyYW1ldGVyIGlzIGlnbm9yZWQuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBCREYgZHJpdmVyICBubyBsb25nZXIgY29udmVydHMgIGFsbCByZXR1cm5lZCBiaXRtYXBzICB3aXRoIGEKICAgICAgZGVwdGggb2YgMmJwcCBvciA0YnBwIHRvIGEgZGVwdGggb2YgOGJwcC4gIFRoZSBkb2N1bWVudGF0aW9uIGhhcwogICAgICBub3QgIG1lbnRpb25lZCAgdGhpcyAgZXhwbGljaXRseSwgIGJ1dCAgaW1wbGVtZW50b3JzICBtaWdodCBoYXZlCiAgICAgIHJlbGllZCBvbiB0aGlzIGFmdGVyIGxvb2tpbmcgaW50byB0aGUgc291cmNlIGZpbGVzLgoKICAgIC0gQSBuZXcgb3B0aW9uIGAtLWZ0dmVyc2lvbicgaGFzIGJlZW4gIGFkZGVkIHRvIGZyZWV0eXBlLWNvbmZpZyB0bwogICAgICByZXR1cm4gdGhlIEZyZWVUeXBlIHZlcnNpb24uCgogICAgLSBUaGUgIG1lbW9yeSAgZGVidWdnZXIgIGhhcyAgYmVlbiAgdXBkYXRlZCAgIHRvICBkdW1wICBhbGxvY2F0aW9uCiAgICAgIHN0YXRpc3RpY3Mgb24gIGFsbCBhbGxvY2F0aW9uICBzb3VyY2VzIGluIHRoZSBsaWJyYXJ5LiAgIFRoaXMgaXMKICAgICAgdXNlZnVsIHRvICBzcG90IGdyZWVkeSAgYWxsb2NhdGlvbnMgd2hlbiAgbG9hZGluZyBhbmQgcHJvY2Vzc2luZwogICAgICBmb250cy4KCiAgICAtIFdlIHJlbW92ZWQgYSBodWdlIGFycmF5IG9mIGNvbnN0YW50IHBvaW50ZXJzIHRvIGNvbnN0YW50IHN0cmluZ3MKICAgICAgaW4gdGhlIGBwc25hbWVzJyBtb2R1bGUuICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgIGNvbXBpbGF0aW9ucyBpbgogICAgICBQSUMgbW9kZSAoaS5lLiwgIHdoZW4gZ2VuZXJhdGluZyBhICBVbml4IHNoYXJlZCBvYmplY3QvZGxsKSAgcHV0CiAgICAgIHRoZSBhcnJheSAgaW50byB0aGUgbm9uLXNoYXJlZCAgd3JpdGFibGUgc2VjdGlvbiBvZiAgdGhlIGxpYnJhcnkKICAgICAgc2luY2UgYWJzb2x1dGUgcG9pbnRlcnMgYXJlIG5vdCByZWxvY2F0YWJsZSBieSBuYXR1cmUuCgogICAgICBUaGlzIHJlZHVjZXMgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhcHByb3hpbWF0ZWx5IDE2S0J5dGUgcGVyCiAgICAgIHByb2Nlc3MgbGlua2VkICB0byBGcmVlVHlwZS4gICBXZSBub3cgYWxzbyBzdG9yZSAgdGhlIGFycmF5IGluIGEKICAgICAgY29tcHJlc3NlZCBmb3JtIChhcyBhIHRyaWUpIHdoaWNoIHNhdmVzIGFib3V0IDIwS0J5dGUgb2YgY29kZSBhcwogICAgICB3ZWxsLgoKICAgIC0gS2lyaWxsICBTbWVsa292IHByb3ZpZGVkICBwYXRjaGVzIHRvIG1ha2UgIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYwogICAgICBjb21waWxlIHN0YW5kLWFsb25lIGFnYWluLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjkgYW5kIDIuMS44CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSBmdW5jdGlvbiAgYEZUX0dldF9DaGFyTWFwX0luZGV4JyB3YXMgb25seSBkZWNsYXJlZCwgIHdpdGhvdXQKICAgICAgYW55ICByZWFsICBjb2RlLiAgIEZvciAgY29uc2lzdGVuY3ksICBpdCAgaGFzICBiZWVuICByZW5hbWVkICB0bwogICAgICBgRlRfR2V0X0NoYXJtYXBfSW5kZXgnLiAgIChUaGlzIGZ1bmN0aW9uIGlzIG5lZWRlZCAgdG8gaW1wbGVtZW50CiAgICAgIGNtYXAgY2FjaGVzLikKCiAgICAtIGBGVF9PdXRsaW5lX0dldF9CQm94JyAgc29tZXRpbWVzIHJldHVybmVkICBpbmNvcnJlY3QgdmFsdWVzICBmb3IKICAgICAgY29uaWMgb3V0bGluZXMgKGUuZy4sIGZvciBUcnVlVHlwZSBmb250cykuCgogICAgLSBIYW5kbGluZyBvZiBgYmhlZCcgdGFibGUgaGFzIGJlZW4gZml4ZWQuCgogICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpdGggZW5hYmxlZCBieXRlIGNvZGUgaW50ZXJwcmV0ZXIgc29tZXRpbWVzCiAgICAgIHJldHVybmVkIGFydGlmYWN0cyBkdWUgdG8gaW5jb3JyZWN0IHJvdW5kaW5nLiAgVGhpcyBidWcgaGFzIGJlZW4KICAgICAgaW50cm9kdWNlZCBhZnRlciB2ZXJzaW9uIDIuMS40LgoKICAgIC0gVGhlIEJERiBkcml2ZXIgZHJvcHBlZCB0aGUgbGFzdCBnbHlwaCBpbiB0aGUgZm9udC4KCiAgICAtIFRoZSBCREYgZHJpdmVyIG5vdyB1c2VzIHRoZSBERUZBVUxUX0NIQVIgcHJvcGVydHkgKGlmIGF2YWlsYWJsZSkKICAgICAgdG8gc2VsZWN0IGEgZ2x5cGggc2hhcGUgZm9yIHRoZSB1bmRlZmluZWQgZ2x5cGguCgogICAgLSBUaGUgc3Ryb2tlciBmYWlsZWQgZm9yIGNsb3NlZCBvdXRsaW5lcyBhbmQgc2luZ2xlIHBvaW50cy4KCgogIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwoKICAgIC0gR2VvcmdlICBXaWxsaWFtcyAgIGNvbnRyaWJ1dGVkICBjb2RlICB0byAgIGhhbmRsZSAgQXBwbGUncyAgZm9udAogICAgICBkaXN0b3J0aW9uIHRlY2hub2xvZ3kgZm91bmQgaW4gR1ggZm9udHMgKGBhdmFyJywgYGN2YXInLCBgZnZhcicsCiAgICAgIGFuZCBgZ3ZhcicgdGFibGVzOyAgdGhlIE11bHRpcGxlIE1hc3RlcnMgIEFQSSBoYXMgYmVlbiAgc2xpZ2h0bHkKICAgICAgZXh0ZW5kZWQgdG8gY29wZSB3aXRoIHRoZSBuZXcgZnVuY3Rpb25hbGl0eSkuCgogICAgLSBUaGUgYEZUX0dseXBoU2xvdFJlYycgc3RydWN0dXJlIGhhcyBiZWVuIGV4dGVuZGVkOiAgVGhlIGVsZW1lbnRzCiAgICAgIGBsc2JfZGVsdGEnIGFuZCAgYHJzYl9kZWx0YScgZ2l2ZSB0aGUgZGlmZmVyZW5jZSAgYmV0d2VlbiBoaW50ZWQKICAgICAgYW5kICB1bmhpbnRlZCAgbGVmdCBhbmQgcmlnaHQgIHNpZGUgYmVhcmluZ3MgIGlmIGF1dG9oaW50aW5nICBpcwogICAgICBhY3RpdmUuICBVc2luZyB0aG9zZSB2YWx1ZXMgY2FuIGltcHJvdmUgdGhlIGludGVyLWxldHRlciBzcGFjaW5nCiAgICAgIGNvbnNpZGVyYWJseS4gICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgIGBGVF9HbHlwaFNsb3RSZWMnICBhbmQKICAgICAgdGhlIGBmdHN0cmluZycgZGVtbyBwcm9ncmFtIGhvdyB0byB1c2UgaXQuCgogICAgLSBMb2FkaW5nIFRydWVUeXBlIGFuZCBUeXBlIDEgZm9udHMgaGFzIGJlZW4gbWFkZSBtdWNoIGZhc3Rlci4KCiAgICAtIFRoZSBzdHJva2VyIGlzICBubyBsb25nZXIgZXhwZXJpbWVudGFsIChidXQgdGhlICBjYWNoZSBzdWJzeXN0ZW0KICAgICAgc3RpbGwgaXMpLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBBIG5ldyAgZG9jdW1lbnRhdGlvbiBmaWxlICBgZm9ybWF0cy50eHQnIGRlc2NyaWJlcyB2YXJpb3VzICBmb250CiAgICAgIGZvcm1hdHMgc3VwcG9ydGVkIChhbmQgbm90IHN1cHBvcnRlZCkgYnkgRnJlZVR5cGUuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuOCBhbmQgMi4xLjcKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlIG5hdGl2ZSAgVHJ1ZVR5cGUgaGludGVyIGNvbnRhaW5lZCBzb21lICBidWdzIHdoaWNoIHByZXZlbnRlZAogICAgICBzb21lIGZvbnRzIHRvIGJlIHJlbmRlcmVkIGNvcnJlY3RseSwgbW9zdCBub3RhYmx5IExlZ2VuZHVtLm90Zi4KCiAgICAtIFRoZSBQb3N0U2NyaXB0IGhpbnRlciBub3cgcHJvZHVjZXMgaW1wcm92ZWQgcmVzdWx0cy4KCiAgICAtIFRoZSAgbGluZWFyIGFkdmFuY2UgIHdpZHRoICBhbmQgaGVpZ2h0ICB2YWx1ZXMgd2VyZSAgaW5jb3JyZWN0bHkKICAgICAgcm91bmRlZCwgIG1ha2luZyAgdGhlbSB2aXJ0dWFsbHkgIHVudXNhYmxlICBpZiAgbm90IGxvYWRlZCAgd2l0aAogICAgICBGVF9MT0FEX0xJTkVBUl9ERVNJR04uCgogICAgLSBJbmRleGluZyBDSUQta2V5ZWQgQ0ZGIGZvbnRzIGlzICBub3cgd29ya2luZzogVGhlIGdseXBoIGluZGV4IGlzCiAgICAgIGNvcnJlY3RseSAgdHJlYXRlZCBhcyBhICBDSUQsIHNpbWlsYXIgIHRvIEZyZWVUeXBlJ3MgIENJRCBkcml2ZXIKICAgICAgbW9kdWxlLiAgTm90ZSB0aGF0IENJRCBDTWFwIHN1cHBvcnQgaXMgc3RpbGwgbWlzc2luZy4KCiAgICAtIFRoZSBGVF9GQUNFX0ZMQUdTX0dMWVBIX05BTUVTIGZsYWcgaXMgbm93ICBzZXQgY29ycmVjdGx5IGZvciBhbGwKICAgICAgZm9udCBmb3JtYXRzLgoKICAgIC0gU29tZSBzdWJzZXR0ZWQgVHlwZSAxICBmb250cyB3ZXJlbid0IHBhcnNlZCBjb3JyZWN0bHkuICBUaGlzIGJ1ZwogICAgICBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIDIuMS43LiAgSW4gc3VtbWFyeSwgdGhlIFR5cGUgMSBwYXJzZXIgaGFzCiAgICAgIGJlY29tZSBtb3JlIHJvYnVzdC4KCiAgICAtIE5vbi1kZWNpbWFsIG51bWJlcnMgd2VyZW4ndCBwYXJzZWQgY29ycmVjdGx5IGluIFBTIGZvbnRzLgoKICAgIC0gVGhlIFdpbkZOVCBkcml2ZXIgbm93IGNvcnJlY3RseSByZXBvcnRzIEZUX0VOQ09ESU5HX05PTkUgZm9yIGFsbAogICAgICBidXQgb25lIGVuY29kaW5nLiAgVXNlICB0aGUgbmV3IEZUX1dpbkZOVF9JRF9YWFggdmFsdWVzIHRvZ2V0aGVyCiAgICAgIHdpdGggRlRfR2V0X1dpbkZOVF9IZWFkZXIoKSB0byBnZXQgdGhlIFdpbkZOVCBjaGFyc2V0IElELgoKICAgIC0gVGhlIGRlc2NlbmRlciBtZXRyaWNzIChmYWNlLT5zaXplLT5tZXRyaWNzLmRlc2NlbmRlcikgZm9yIFdpbkZOVAogICAgICBiaXRtYXAgZm9udHMgaGFkIHRoZSB3cm9uZyBzaWduLgoKICAgIC0gVGhlIChlbXVsYXRlZCkgYHNlYWMnIHN1cHBvcnQgZm9yIENGRiBmb250cyB3YXMgYnJva2VuLgoKICAgIC0gVGhlIGBmbGV4JyBvcGVyYXRvciBkaWRuJ3Qgd29yayBmb3IgQ0ZGIGZvbnRzLgoKICAgIC0gUFMgZ2x5cGhzICB3aGljaCAgdXNlICB0aGUgICBgaGludG1hc2snICBvcGVyYXRvciAgaGF2ZW4ndCAgYmVlbgogICAgICByZW5kZXJlZCBjb3JyZWN0bHkgaW4gc29tZSBjYXNlcy4KCiAgICAtIE1ldHJpY3MgZm9yIEJERiBhbmQgUENGIGJpdG1hcCBmb250IGZvcm1hdHMgaGF2ZSBiZWVuIGZpeGVkLgoKICAgIC0gQXV0b2hpbnRpbmcgIGlzIG5vdyAgZGlzYWJsZWQgZm9yICBnbHlwaHMgIHdoaWNoICBhcmUgdmVydGljYWxseQogICAgICBkaXN0b3J0ZWQgIG9yIG1pcnJvcmVkICAodXNpbmcgYSAgdHJhbnNmb3JtYXRpb24gbWF0cml4KS4gICBUaGlzCiAgICAgIGZpeGVzIGEgYnVnIHdoaWNoIHByb2R1Y2VkIHplcm8taGVpZ2h0IGdseXBocy4KCiAgICAtIFRoZSAgIGBmcmVldHlwZS1jb25maWcnICAgc2NyaXB0ICAgbm93ICBoYW5kbGVzICAgLS1wcmVmaXggICBhbmQKICAgICAgLS1leGVjLXByZWZpeCBjb3JyZWN0bHk7IGl0IGFsc28gIHJldHVybnMgdGhlIHByb3BlciAtLXJwYXRoIChvcgogICAgICAtUikgdmFsdWUgaWYgRnJlZVR5cGUgaGFzIGJlZW4gYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeS4KCgogIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwoKICAgIC0gQm90aCAgUENGICBhbmQgQkRGICBkcml2ZXJzICBub3cgIGhhbmRsZSAgdGhlIFNFVFdJRFRIX05BTUUgIGFuZAogICAgICBBRERfU1RZTEVfTkFNRSAgICBwcm9wZXJ0aWVzLiAgICAgVmFsdWVzICAgIGFyZSAgIGFwcGVuZGVkICAgIHRvCiAgICAgIGZhY2UtPnN0eWxlX25hbWU7IGV4YW1wbGU6IGBCb2xkIFNlbWlDb25kZW5zZWQnLgoKICAgIC0gVGhlIFBDRiBkcml2ZXIgbm93IGhhbmRsZXMgYml0bWFwICBmb250cyBjb21wcmVzc2VkIHdpdGggdGhlIExaVwogICAgICBhbGdvcml0aG0gKGV4dGVuc2lvbiAucGNmLlosIGNvbXByZXNzZWQgd2l0aCBgY29tcHJlc3MnKS4KCiAgICAtIEEgIG5ldyAgQVBJICAgZnVuY3Rpb24gIGBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCcgIChkZWNsYXJlZCAgaW4KICAgICAgYHR0dGFibGVzLmgnKSAgaXMgIGF2YWlsYWJsZSAgdG8gICBnZXQgIHRoZSAgbGFuZ3VhZ2UgIElEICBvZiAgYQogICAgICBUcnVlVHlwZS9TRk5UIGNtYXAuCgogICAgLSBUaGUgaGV4YWRlY2ltYWwgZm9ybWF0IG9mICBkYXRhIGFmdGVyIHRoZSBgU3RhcnREYXRhJyBjb21tYW5kIGluCiAgICAgIENJRC1rZXllZCBUeXBlIDEgZm9udHMgaXMgbm93IHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgY2FuJ3Qgb2NjdXIKICAgICAgaW4gIGZpbGUtYmFzZWQgICBmb250cywgIGl0ICBjYW4gICBoYXBwZW4gIGluICBkb2N1bWVudC1lbWJlZGRlZAogICAgICByZXNvdXJjZXMgb2YgUG9zdFNjcmlwdCBkb2N1bWVudHMuCgogICAgLSBFbWJlZGRlZCBiaXRtYXBzIGluIFNGTlQtYmFzZWQgQ0ZGIGZvbnRzIGFyZSBub3cgc3VwcG9ydGVkLgoKICAgIC0gQSBzaW1wbGUgIEFQSSBpcyAgbm93IGF2YWlsYWJsZSAgdG8gY29udHJvbCAgRnJlZVR5cGUncyAgdHJhY2luZwogICAgICBtZWNoYW5pc20gaWYgY29tcGlsZWQgIHdpdGggRlRfREVCVUdfTEVWRUxfVFJBQ0UuICAgU2VlIHRoZSBmaWxlCiAgICAgIGBmdGRlYnVnLmgnIGZvciBtb3JlIGRldGFpbHMuCgogICAgLSBZQU1BVE8gTWFzYXRha2UgY29udHJpYnV0ZWQgaW1wcm92ZWQgIGhhbmRsaW5nIG9mIE1hY09TIHJlc291cmNlCiAgICAgIGZvcmtzIG9uIG5vbi1NYWNPUyBwbGF0Zm9ybXMgKGZvciBleGFtcGxlLCBMaW51eCBjYW4gbW91bnQgTWFjT1MKICAgICAgZmlsZSBzeXN0ZW1zKS4KCiAgICAtIFN1cHBvcnQgZm9yIE1hY09TIGhhcyBiZWVuIGltcHJvdmVkOyB0aGVyZSBpcyBub3cgYSBuZXcgZnVuY3Rpb24KICAgICAgYEZUX05ld19GYWNlX0Zyb21fRlNTcGVjJyAgc2ltaWxhciB0byBgRlRfTmV3X0ZhY2UnICBleGNlcHQgdGhhdAogICAgICBpdCBhY2NlcHRzIGFuIEZTU3BlYyBpbnN0ZWFkIG9mIGEgcGF0aC4KCiAgICAtIFRoZSBjYWNoZSBzdWItc3lzdGVtIGhhcyBiZWVuIHJld3JpdHRlbi4KCiAgICAgIC0gVGhlcmUgaXMgbm93IHN1cHBvcnQgZm9yIGRlaW5zdGFsbGF0aW9uIG9mIGZhY2VzLgoKICAgICAgLSBBIG5ldyAgQVBJIGZ1bmN0aW9uIGBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQnICBoYXMgYmVlbiBhZGRlZAogICAgICAgIHRvICBkZWxldGUgIGFsbCAgYGlkbGUnICBub2RlcyAgdGhhdCAgY29ycmVzcG9uZCAgdG8gIGEgIGdpdmVuCiAgICAgICAgRlRDX0ZhY2VJRC4gIEFsbCBgbG9ja2VkJyBub2RlcyAgKGkuZS4sIHRob3NlIHdpdGggYSByZWZlcmVuY2UKICAgICAgICBjb3VudCA+IDApLCB3aWxsIGJlIG1vZGlmaWVkIHRvIHByZXZlbnQgdGhlbSBmcm9tIGFwcGVhcmluZyBpbgogICAgICAgIGZ1cnRoZXIgIGxvb2t1cHMgKHRoZXkgIHdpbGwgIGJlIGNsZWFuZWQgIG5vcm1hbGx5IHdoZW4gIHRoZWlyCiAgICAgICAgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgMCkuCgogICAgICAtIFRoZXJlICBpcyAgbm93ICBzdXBwb3J0ICBmb3IgcG9pbnQgIHNjYWxpbmcgIChpLmUuLCAgcHJvdmlkaW5nCiAgICAgICAgY2hhcmFjdGVyIHNpemVzIGluIHBvaW50cyArIGRwaXMsIGluc3RlYWQgb2YgcGl4ZWxzKS4KCiAgICAgIC0gVGhyZWUgYWJzdHJhY3QgY2FjaGUgY2xhc3NlcyBhcmUgbm93IGF2YWlsYWJsZToKCiAgICAgICAgICBGVENfR0NhY2hlOiAgVXNlZCB0byBzdG9yZSAgb25lIGdseXBoICBpdGVtIHBlciAgY2FjaGUgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGFiaWxpdHkgdG8gZ3JvdXAgY29tbW9uIGF0dHJpYnV0ZXMgaW50bwogICAgICAgICAgICAgICAgICAgICAgYGZhbWlsaWVzJy4gICAgICBUaGlzICAgIHJlcGxhY2VzICAgICB0aGUgICAgb2xkCiAgICAgICAgICAgICAgICAgICAgICBGVENfR2x5cGhDYWNoZSBjbGFzcy4KCiAgICAgICAgICBGVENfSUNhY2hlOiBVc2VkIHRvIHN0b3JlIG9uZSBGVF9HbHlwaCBwZXIgY2FjaGUgbm9kZS4gIFRoaXMKICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHMgIEZUQ19HQ2FjaGUuICBGYW1pbHkgIGRlZmluaXRpb24sIGZhbWlseQogICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbiwgYW5kICBnbHlwaCBsb2FkaW5nIGFyZSAgaG93ZXZlciBsZWZ0CiAgICAgICAgICAgICAgICAgICAgICB0byBzdWItY2xhc3Nlcy4KCiAgICAgICAgICBGVENfU0NhY2hlOiBVc2VkIHRvICBzdG9yZSB1cCB0byAxNiBzbWFsbCAgYml0bWFwcyBwZXIgY2FjaGUKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuICAgIFRoaXMgICAgZXh0ZW5kcyAgIEZUQ19HQ2FjaGUuICAgIEZhbWlseQogICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgZmFtaWx5ICBjb21wYXJpc29uIGFuZCBnbHlwaCBsb2FkaW5nCiAgICAgICAgICAgICAgICAgICAgICBhcmUgaG93ZXZlciBsZWZ0IHRvIHN1Yi1jbGFzc2VzLgoKICAgICAgLSBUaGUgZmlsZSBgc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMnIGltcGxlbWVudHM6CgogICAgICAgICAgRlRDX0ltYWdlQ2FjaGU6IEV4dGVuZHMgICAgRlRDX0lDYWNoZTsgICBpbXBsZW1lbnRzICAgZmFtaWx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgYW5kIGdseXBoIGxvYWRpbmcgc2ltaWxhciB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgQVBJLgoKICAgICAgICAgIEZUQ19TQml0Q2FjaGU6IEV4dGVuZHMgICAgRlRDX1NDYWNoZSwgICAgaW1wbGVtZW50cyAgIGZhbWlseQogICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgYW5kIGdseXBoICBsb2FkaW5nIHNpbWlsYXIgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBvbGQgQVBJCgogICAgICAgIENsaWVudCAgYXBwbGljYXRpb25zICBzaG91bGQgIGJlICBhYmxlIHRvICBleHRlbmQgIEZUQ19HQ2FjaGUsCiAgICAgICAgRlRDX0lDYWNoZSwgb3IgRlRDX1NDYWNoZSBtdWNoIG1vcmUgZWFzaWx5IChpLmUuLCBsZXNzIGNvZGUgdG8KICAgICAgICB3cml0ZSwgYW5kICBsZXNzIGNhbGxiYWNrcykuICBGb3IgZXhhbXBsZSwgIG9uZSBjb3VsZCBlbnZpc2lvbgogICAgICAgIGNhY2hlcyAgdGhhdCBhcmUgIGNhcGFibGUgb2YgIHN0b3JpbmcgIHRyYW5zZm9ybWVkIChvYmxpcXVlZCksCiAgICAgICAgc3Ryb2tlZCwgICBlbWJvbGRlbmVkLCAgIG9yICAgY29sb3JlZCAgIGdseXBoICAgaW1hZ2VzLiAgICBVc2UKICAgICAgICBgZnRjYmFzaWMuYycgYXMgYW4gZXhhbXBsZS4KCiAgICAgIC0gQWxsIHB1YmxpYyAgQVBJcyBhcmUgbm93ICBpbiBgaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmgnLCAodG8KICAgICAgICBiZSAgICBhY2Nlc3NlZCAgIGFzICAgIGBGVF9DQUNIRV9IJykuICAgICBUaGUgICBjb250ZW50cyAgICBvZgogICAgICAgIGBpbmNsdWRlL2ZyZWV0eXBlL2NhY2hlLycgaXMgb25seSAgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyB0aGF0CiAgICAgICAgd2lzaCB0byBpbXBsZW1lbnQgdGhlaXIgb3duIGNhY2hlcy4KCiAgICAgIC0gVGhlcmUgd2VyZSBzb21lIG1ham9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0aHJvdWdoIHRoZSB1c2UKICAgICAgICBvZiAgdmFyaW91cyBwcm9ncmFtbWluZyAgdHJpY2tzLiAgIENhY2hlIGhpdHMgIGFyZSAgdXAgdG8gIDcwJQogICAgICAgIGZhc3RlciB0aGFuIGluIHRoZSBvbGQgY29kZS4KCiAgICAgIC0gVGhlICBGVENfQ01hcENhY2hlIGhhcyAgYmVlbiBzaW1wbGllZC4gICBDaGFybWFwcyBjYW4gIG9ubHkgYmUKICAgICAgICBhY2Nlc3NlZCBieSAgaW5kZXggcmlnaHQgbm93LiAgVGhlcmUgIGlzIGFsc28gYSAgbmV3IEFQSSBuYW1lZAogICAgICAgIGBGVF9DaGFybWFwX0dldEluZGV4JyBmb3IgdGhpcyBwdXJwb3NlLgoKICAgICAgLSBUaGUgIGRlbW8gcHJvZ3JhbXMgIGhhdmUgYmVlbiAgdXBkYXRlZCB0byAgdGhlIG5ldyAgY29kZS4gIFRoZQogICAgICAgIHByZXZpb3VzIHZlcnNpb25zIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgY3VycmVudCBvbmUuCgogICAgICAtIFVzaW5nICBhbiBpbnZhbGlkIGZhY2UgIGluZGV4IGluIEZUX09wZW5fRmFjZSBhbmQgZnJpZW5kcyAgbm93CiAgICAgICAgY2F1c2VzIGFuIGVycm9yIGV2ZW4gaWYgdGhlIGZvbnQgY29udGFpbnMgYSBzaW5nbGUgZmFjZSBvbmx5LgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBXb2xmZ2FuZyBEb21y9nNlIGNvbnRyaWJ1dGVkIHN1cHBvcnQgZmlsZXMgZm9yIGJ1aWxkaW5nIEZyZWVUeXBlCiAgICAgIG9uIHRoZSBBdGFyaSB1c2luZyB0aGUgUHVyZUMgY29tcGlsZXIuICBOb3RlIHRoYXQgdGhlIEF0YXJpIGlzIGEKICAgICAgMTZiaXQgcGxhdGZvcm0uCgogICAgLSBWaXRhbGl5IFBhc3Rlcm5hayBjb250cmlidXRlZCBwcm9qZWN0IGZpbGVzIGZvciBWUy5ORVQgMjAwMy4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS43IGFuZCAyLjEuNgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBVcGRhdGVkICB0byBuZXdlc3QgIGxpYnRvb2wgIHZlcnNpb24sIGZpeGluZyAgYnVpbGQgcHJvYmxlbXMgIG9uCiAgICAgIHZhcmlvdXMgcGxhdGZvcm1zLgoKICAgIC0gT24gIFVuaXggIHBsYXRmb3JtcywgIGBtYWtlICBpbnN0YWxsJyBkaWRuJ3QgIGNvcHkgIHRoZSAgY29ycmVjdAogICAgICBgZnRjb25maWcuaCcgZmlsZS4KCiAgTm90ZSB0aGF0IHZlcnNpb24gMi4xLjcgIGNvbnRhaW5zIHRoZSBzYW1lIGxpYnJhcnkgIEMgc291cmNlIGNvZGUgYXMKICB2ZXJzaW9uIDIuMS42LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjYgYW5kIDIuMS41CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSBQRlIgIGZvbnQgZHJpdmVyIGRpZG4ndCAgbG9hZCBrZXJuaW5nIHRhYmxlcyAgY29ycmVjdGx5LCBhbmQKICAgICAgdGhlIGZ1bmN0aW9ucyBpbiBGVF9QRlJfSCBkaWRuJ3Qgd29yayBhdCBhbGwuCgogICAgLSBUeXBlIDEgZm9udCAgZmlsZXMgaW4gIGJpbmFyeSBmb3JtYXQgIChQRkIpIHdpdGggIGFuIGVuZC1vZi1maWxlCiAgICAgIGluZGljYXRvciB3ZXJlbid0IGFjY2VwdGVkIGJ5IHRoZSBGcmVlVHlwZSBlbmdpbmUuCgogICAgLSBGb250cyB3aGljaCBjb250YWluIC9QYWludFR5cGUgIGFuZCAvU3Ryb2tlV2lkdGggbm8gbG9uZ2VyIGNhdXNlCiAgICAgIGEgc2VnZmF1bHQuICBUaGlzIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xLjUuCgogICAgLSBGb250cyAgbG9hZGVkICB3aXRoICAgRlRfTE9BRF9SRU5ERVIgIG5vICBsb25nZXIgIGNhdXNlICBzdHJhbmdlCiAgICAgIHJlc3VsdHMuICBUaGlzIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xLjUuCgogICAgLSBTb21lICBXaW5kb3dzICAgKGJpdG1hcCkgIEZOVC9GT04gIGZpbGVzICAgY291bGRuJ3QgIGJlICBoYW5kbGVkCiAgICAgIGNvcnJlY3RseS4KCgogIElJLiBJTVBPUlRBTlQgQ0hBTkdFUwoKICAgIC0gVGhlIGludGVybmFsICBtb2R1bGUgQVBJICBoYXMgYmVlbiBoZWF2aWx5ICBjaGFuZ2VkIGluICBmYXZvciBvZgogICAgICBtYXNzaXZlIHNpbXBsaWZpY2F0aW9ucyB3aXRoaW4gdGhlIGZvbnQgZW5naW5lLiAgVGhpcyBhbHNvIG1lYW5zCiAgICAgIHRoYXQgYXV0aG9ycyBvZiB0aGlyZC1wYXJ0eSBtb2R1bGVzIG11c3QgYWRhcHQgdGhlaXIgY29kZSB0byB0aGUKICAgICAgbmV3IHNjaGVtZS4KCiAgICAgIE5PVEU6ICBUSEUgTkVXIFNDSEVNRSBJUyBOT1QgQ09NUExFVEVEIFlFVC4gIFBMRUFTRSBXQUlUIFVOVElMIEEKICAgICAgRklOQUwgQU5OT1VOQ0VNRU5UIQoKICAgIC0gVGhlIFBvc3RTY3JpcHQgIHBhcnNlciBoYXMgYmVlbiBlbmhhbmNlZCB0byAgaGFuZGxlIGNvbW1lbnRzIGFuZAogICAgICBzdHJpbmdzICAgY29ycmVjdGx5LiAgIEFkZGl0aW9uYWxseSwgICBtb3JlICBzeW50YXggICBmb3JtcyAgYXJlCiAgICAgIHJlY29nbml6ZWQuCgogICAgLSBBZGRlZCB0aGUgIG9wdGlvbmFsIHVucGF0ZW50ZWQgaGludGluZyBzeXN0ZW0gIGZvciBUcnVlVHlwZS4gIEl0CiAgICAgIGFsbG93cyAgdHlwZWZhY2VzIHdoaWNoICBuZWVkIGhpbnRpbmcgIHRvIHByb2R1Y2UgIGNvcnJlY3QgZ2x5cGgKICAgICAgZm9ybXMgKGUuZy4sIENoaW5lc2UgdHlwZWZhY2VzICBmcm9tIER5bmFsYWIpIHRvIHdvcmsgYWNjZXB0YWJseQogICAgICB3aXRob3V0IGluZnJpbmdpbmcgQXBwbGUgcGF0ZW50cy4gICBUaGlzIHN5c3RlbSBpcyBjb21waWxlZCBvbmx5CiAgICAgIGlmICBUVF9DT05GSUdfT1BUSU9OX0NPTVBJTEVfVU5QQVRFTlRFRF9ISU5USU5HICBpcyAgZGVmaW5lZCAgaW4KICAgICAgZnRvcHRpb24uaCAoYWN0aXZhdGVkIGJ5IGRlZmF1bHQpLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGVyZSAgaXMgbm93ICBhIGd1YXJkICBpbiB0aGUgIHB1YmxpYyBoZWFkZXIgIGZpbGVzICB0byBwcm90ZWN0CiAgICAgIGFnYWluc3QgaW5jbHVzaW9uIG9mIGZyZWV0eXBlLmggZnJvbSBGcmVlVHlwZSAxLgoKICAgIC0gRGlyZWN0IGluY2x1c2lvbiBvZiBmcmVldHlwZS5oICBhbmQgb3RoZXIgcHVibGljIGhlYWRlciBmaWxlcyBubwogICAgICBsb25nZXIgd29ya3MuICBZb3UgaGF2ZSB0byB1c2UgdGhlIGRvY3VtZW50ZWQgc2NoZW1lCgogICAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPgogICAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKCiAgICAgIHRvIGxvYWQgZnJlZXR5cGUuaCB3aXRoICBhIHN5bWJvbGljIG5hbWUuICBUaGlzIHByb3RlY3RzIGFnYWluc3QKICAgICAgcmVuYW1pbmcgIG9mIHB1YmxpYyAgaGVhZGVyICBmaWxlcyAod2hpY2ggIHNob3VsZG4ndCBoYXBwZW4gIGJ1dAogICAgICBhY3R1YWxseSAgaGFzLCBhdm9pZGluZyB0d28gIHB1YmxpYyBoZWFkZXIgIGZpbGVzIHdpdGggIHRoZSBzYW1lCiAgICAgIG5hbWUpLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjUgYW5kIDIuMS40CgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFBhcnNpbmcgdGhlIC9DSURGb250TmFtZSBmaWVsZCAgbm93IHJlbW92ZXMgdGhlIGxlYWRpbmcgc2xhc2ggdG8KICAgICAgYmUgaW4gc3luYyB3aXRoIG90aGVyIGZvbnQgZHJpdmVycy4KCiAgICAtIGd6aXAgc3VwcG9ydCB3YXMgYnVnZ3kuICBTb21lIGZvbnRzIGNvdWxkIG5vdCBiZSByZWFkLgoKICAgIC0gRm9udHMgd2hpY2ggIGhhdmUgbmVzdGVkIHN1YmdseXBocyAgbW9yZSB0aGFuIG9uZSBsZXZlbCAgZGVlcCBubwogICAgICBsb25nZXIgY2F1c2UgYSBzZWdmYXVsdC4KCiAgICAtIENyZWF0aW9uIG9mIHN5bnRoZXRpYyAgY21hcHMgZm9yIGZvbnRzIGluIENGRiAgZm9ybWF0IHdhcyBicm9rZW4KICAgICAgcGFydGlhbGx5LgoKICAgIC0gTnVtZXJpYyAgZm9udCAgZGljdGlvbmFyeSBlbnRyaWVzICBmb3IgIHN5bnRoZXRpYyAgZm9udHMgYXJlICBubwogICAgICBsb25nZXIgb3ZlcndyaXR0ZW4uCgogICAgLSBUaGUgZm9udCBtYXRyaXggIHdhc24ndCBhcHBsaWVkIHRvIHRoZSBhZHZhbmNlICB3aWR0aCBmb3IgVHlwZTEsCiAgICAgIENJRCwgYW5kICBDRkYgZm9udHMuICBUaGlzIGNhdXNlZCBwcm9ibGVtcyAgd2hlbiBsb2FkaW5nIGNlcnRhaW4KICAgICAgc3ludGhldGljIFR5cGUgMSBmb250cyBsaWtlIGBIZWx2ZXRpY2EgTmFycm93Jy4KCiAgICAtIFRoZSB0ZXN0ICBmb3IgdGhlIGNoYXJzZXQgcmVnaXN0cnkgIGluIEJERiBhbmQgUENGICBmb250cyBpcyBub3cKICAgICAgY2FzZS1pbnNlbnNpdGl2ZS4KCiAgICAtIEZUX1ZlY3Rvcl9Sb3RhdGUgIHNvbWV0aW1lcyAgcmV0dXJuZWQgICBzdHJhbmdlICB2YWx1ZXMgIGR1ZSAgdG8KICAgICAgcm91bmRpbmcgZXJyb3JzLgoKICAgIC0gVGhlICBQQ0YgIGRyaXZlciAgbm93ICByZXR1cm5zICB0aGUgIGNvcnJlY3QgIG51bWJlciAgb2YgIGdseXBocwogICAgICAoaW5jbHVkaW5nIGFuIGFydGlmaWNpYWwgYG5vdGRlZicgZ2x5cGggYXQgaW5kZXggMCkuCgogICAgLSBGcmVlVHlwZSBub3cgIHN1cHBvcnRzIGJ1Z2d5IENNYXBzICB3aGljaCBhcmUgY29udGFpbmVkICBpbiBtYW55CiAgICAgIENKSyBmb250cyBmcm9tIER5bmFsYWIuCgogICAgLSBPcGVuaW5nICBhbiBpbnZhbGlkICBmb250ICBvbiBhICBNYWMgIGNhdXNlZCBhICBzZWdmYXVsdCBkdWUgIHRvCiAgICAgIGRvdWJsZS1mcmVlaW5nIG1lbW9yeS4KCiAgICAtIEJERiAgZm9udHMgIHdpdGggIG1vcmUgICB0aGFuICAzMjc2OCAgZ2x5cGhzICB3ZXJlbid0ICBzdXBwb3J0ZWQKICAgICAgcHJvcGVybHkuCgoKICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKCiAgICAtIEFjY2Vzc2luZyBiaXRtYXAgZm9udCBmb3JtYXRzIGhhcyBiZWVuIHN5bmNocm9uaXplZC4gIFRvIGRvIHRoYXQKICAgICAgdGhlIEZUX0JpdG1hcF9TaXplICBzdHJ1Y3R1cmUgaGFzICBiZWVuIGV4dGVuZGVkIHRvICBjb250YWluIG5ldwogICAgICBmaWVsZHMgYHNpemUnLCBgeF9wcGVtJywgYW5kIGB5X3BwZW0nLgoKICAgIC0gVGhlIEZOVCBkcml2ZXIgbm93IHJldHVybnMgbXVsdGlwbGUgZmFjZXMsIG5vdCBtdWx0aXBsZSBzdHJpa2VzLgoKICAgIC0gVGhlIGBwc25hbWVzJyAgbW9kdWxlIGhhcyBiZWVuICB1cGRhdGVkIHRvIHRoZSBBZG9iZSAgR2x5cGggTGlzdAogICAgICB2ZXJzaW9uIDIuMC4KCiAgICAtIFRoZSBgcHNuYW1lcycgbW9kdWxlIG5vdyB1bmRlcnN0YW5kcyBgdVhYWFhbWFtYXV0nIGdseXBoIG5hbWVzLgoKICAgIC0gVGhlIGFsZ29yaXRobSBmb3IgZ3Vlc3NpbmcgdGhlIGZvbnQgc3R5bGUgaGFzIGJlZW4gaW1wcm92ZWQuCgogICAgLSBGb3IgZm9udHMgaW4gU0ZOVCBmb3JtYXQsIHJvb3QtPmhlaWdodCBpcyBubyBsb25nZXIgaW5jcmVhc2VkIGlmCiAgICAgIHRoZSBsaW5lIGdhcCAgaXMgemVyby4gIFRoZXJlIGV4aXN0IGZvbnRzICAoY29udGFpbmluZyBlLmcuIGZvcm0KICAgICAgZHJhd2luZyAgY2hhcmFjdGVycykgd2hpY2ggIGludGVudGlvbmFsbHkgaGF2ZSAgYSB6ZXJvICBsaW5lIGdhcAogICAgICB2YWx1ZS4KCiAgICAtIGZ0X2dseXBoX2Jib3hfeHh4ICBmbGFncyAgIGFyZSAgbm93ICBkZXByZWNhdGVkICAgaW4gIGZhdm91ciAgb2YKICAgICAgRlRfR0xZUEhfQkJPWF9YWFguCgogICAgLSBmdF9tb2R1bGVfeHh4ICAgZmxhZ3MgICBhcmUgICBub3cgICBkZXByZWNhdGVkICBpbiAgIGZhdm91ciAgIG9mCiAgICAgIEZUX01PRFVMRV9YWFguCgogICAgLSBGVF9FTkNPRElOR19NU197U0pJUyxHQjIzMTIsQklHNSxXQU5TVU5HLEpPSEFCfSAgICAgIGFyZSAgICAgbm93CiAgICAgIGRlcHJlY2F0ZWQgICAgICAgICAgICAgICBpbiAgICAgICAgICAgICAgIGZhdm91ciAgICAgICAgICAgICAgb2YKICAgICAgRlRfRU5DT0RJTkdfe1NKSVMsR0IyMzEyLEdJQjUsV0FOU09ORyxKT0hBQn0gIC0tIHRob3NlIGVuY29kaW5ncwogICAgICBhcmUgbm90IHNwZWNpZmljIHRvIE1pY3Jvc29mdC4KCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gVGhlICBhdXRvaGludGVyICBoYXMgYmVlbiAgZnVydGhlciAgaW1wcm92ZWQ7ICBmb3IgZXhhbXBsZSwgIGBtJwogICAgICBnbHlwaHMgbm93IHJldGFpbiBpdHMgdmVydGljYWwgc3ltbWV0cnkuCgogICAgLSBQYXJ0aWFsIHN1cHBvcnQgb2YgTWFjIGZvbnRzIG9uIG5vbi1NYWMgcGxhdGZvcm1zLgoKICAgIC0gYG1ha2UgICByZWZkb2MnICAgKGFmdGVyICAgZmlyc3QgICBgbWFrZScpICAgYnVpbGRzICAgdGhlICAgSFRNTAogICAgICBkb2N1bWVudGF0aW9uLiAgWW91IG5lZWQgUHl0aG9uIGZvciB0aGlzLgoKICAgIC0gVGhlIG1ha2UgYnVpbGQgc3lzdGVtIHNob3VsZCAgbm93IHdvcmsgbW9yZSByZWxpYWJseSBvbiBET1MtbGlrZQogICAgICBwbGF0Zm9ybXMuCgogICAgLSBTdXBwb3J0IGZvciAgRU1YIGdjYyAgYW5kIFdhdHNvbiBDL0MrKyAgY29tcGlsZXJzIG9uICBNUy1ET1MgaGFzCiAgICAgIGJlZW4gYWRkZWQuCgogICAgLSBCZXR0ZXIgVk1TIGJ1aWxkIHN1cHBvcnQuCgogICAgLSBTdXBwb3J0IGZvciB0aGUgcGtnLWNvbmZpZyAgcGFja2FnZSBieSBwcm92aWRpbmcgYSBgZnJlZXR5cGUucGMnCiAgICAgIGZpbGUuCgogICAgLSBOZXcgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtb2xkLW1hYy1mb250cyBmb3IgRGFyd2luLgoKICAgIC0gU29tZSBzb3VyY2UgZmlsZXMgaGF2ZSBiZWVuICByZW5hbWVkIChtYWlubHkgdG8gZml0IGludG8gdGhlIDguMwogICAgICBuYW1pbmcgc2NoZW1lKS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS40IGFuZCAyLjEuMwoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBVcGRhdGVkICB0byBuZXdlc3QgIGxpYnRvb2wgIHZlcnNpb24sIGZpeGluZyAgYnVpbGQgcHJvYmxlbXMgIG9uCiAgICAgIHZhcmlvdXMgcGxhdGZvcm1zLgoKICAgIC0gQSBmaXggIGluIHRoZSBHemlwIHN0cmVhbSAgcmVhZGVyOiBJdCBjb3VsZG4ndCAgcmVhZCBjZXJ0YWluIC5negogICAgICBmaWxlcyBwcm9wZXJseSBkdWUgdG8gYSAgc21hbGwgdHlwby4gIEluIGNlcnRhaW4gY2FzZXMsIEZyZWVUeXBlCiAgICAgIGNvdWxkICBhbHNvIGxvb3AgIGVuZGxlc3NseSAgd2hlbiB0cnlpbmcgIHRvICBsb2FkIHRpbnkgIGd6aXBwZWQKICAgICAgZmlsZXMuCgogICAgLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdHJpZXMgIHRvIHVzZSB0aGUgc3lzdGVtLXdpZGUgemxpYiB3aGVuCiAgICAgIGl0ICBmaW5kcyBvbmUgIChpbnN0ZWFkIG9mICB0aGUgIGNvcHkgZm91bmQgIGluIHNyYy9nemlwKS4gICBBbmQKICAgICAgImZyZWV0eXBlLWNvbmZpZyIgaGFzICBiZWVuIHVwZGF0ZWQgdG8gcmV0dXJuICByZWxldmFudCBmbGFncyBpbgogICAgICB0aGlzIGNhc2Ugd2hlbiBpbnZva2VkIHdpdGggIi0tbGlicyIgKGUuZy4gIi1semxpYiIpLgoKICAgIC0gQ2VydGFpbiBmb250cyBjb3VsZG4ndCBiZSBsb2FkZWQgIGJ5IDIuMS4zIGJlY2F1c2UgdGhleSBsYWNrZWQgYQogICAgICBVbmljb2RlICAgY2hhcm1hcCAgKGUuZy4gICBTWU1CT0wuVFRGKS4gICAgRnJlZVR5cGUgIGVycm9uZW91c2x5CiAgICAgIHJlamVjdGVkIHRoZW0uCgogICAgLSBUaGUgQ0ZGIGxvYWRlciB3YXMgbW9kaWZpZWQgdG8gYWNjZXB0IGZvbnRzIHdoaWNoIG9ubHkgY29udGFpbiBhCiAgICAgIHN1YnNldCBvZiAgdGhlaXIgcmVmZXJlbmNlIGNoYXJzZXQuICBUaGlzICBwcmV2ZW50ZWQgdGhlIGNvcnJlY3QKICAgICAgdXNlIG9mIFBERi1lbWJlZGRlZCBmb250cy4KCiAgICAtIFRoZSBsb2dpYyB0byBkZXRlY3QgVW5pY29kZSBjaGFybWFwcyBoYXMgYmVlbiBtb2RpZmllZC4gIFRoaXMgaXMKICAgICAgcmVxdWlyZWQgdG8gIHN1cHBvcnQgZm9udHMgd2hpY2ggaW5jbHVkZSBib3RoICAxNi1iaXQgYW5kIDMyLWJpdAogICAgICBjaGFybWFwcyAobGlrZSB2ZXJ5ICByZWNlbnQgYXNpYW4gb25lcykgdXNpbmcgdGhlICBuZXcgMTAgYW5kIDEyCiAgICAgIFNGTlQgZm9ybWF0cy4KCiAgICAtIFRoZSBUcnVlVHlwZSAgbG9hZGVyIG5vdyBsaW1pdHMgIHRoZSBkZXB0aCBvZiAgY29tcG9zaXRlIGdseXBocy4KICAgICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBicm9rZW4gZm9udHMgdG8gYnJlYWsgdGhlIGVuZ2luZSBieQogICAgICBibG93aW5nIHRoZSBzdGFjayB3aXRoIHJlY3Vyc2l2ZSBnbHlwaCBkZWZpbml0aW9ucy4KCiAgICAtIFRoZSBDTWFwIGNhY2hlIGlzIG5vdyAgY2FwYWJsZSBvZiBtYW5hZ2luZyBVQ1MtNCBjaGFyYWN0ZXIgY29kZXMKICAgICAgdGhhdCAgIGFyZSAgIG1hcHBlZCAgIHRocm91Z2ggICBleHRlbmRlZCAgY2hhcm1hcHMgICBpbiAgIHJlY2VudAogICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250cy4KCiAgICAtIFRoZSAgIGNhY2hlICBzdWItc3lzdGVtICAgbm93ICBwcm9wZXJseSAgIG1hbmFnZXMgIG91dC1vZi1tZW1vcnkKICAgICAgY29uZGl0aW9ucyAgaW5zdGVhZCBvZiAgYmxpbmRseSAgcmVwb3J0aW5nIHRoZW0gIHRvIHRoZSAgY2FsbGVyLgogICAgICBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB0cnkgdG8gZW1wdHkgdGhlIGNhY2hlIGJlZm9yZSByZXN0YXJ0aW5nCiAgICAgIGl0cyBhbGxvY2F0aW9ucyB0byBzZWUgaWYgdGhhdCBjYW4gaGVscC4KCiAgICAtIFRoZSAgUEZSIGRyaXZlciAgZGlkbid0IHJldHVybiAgdGhlIGxpc3QgIG9mICBhdmFpbGFibGUgZW1iZWRkZWQKICAgICAgYml0bWFwcyBwcm9wZXJseS4KCiAgICAtIFRoZXJlIHdhcyAgYSBuYXN0eSAgbWVtb3J5IGxlYWsgd2hlbiAgdXNpbmcgZW1iZWRkZWQgIGJpdG1hcHMgaW4KICAgICAgY2VydGFpbiBmb250IGZvcm1hdHMuCgoKICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKCiAgICAtIERhdmlkIENoZXN0ZXIgIGNvbnRyaWJ1dGVkIHNvbWUgZW5oYW5jZW1lbnRzICB0byB0aGUgYXV0by1oaW50ZXIKICAgICAgdGhhdCAgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSAgdGhlICBxdWFsaXR5IG9mICBpdHMgb3V0cHV0LiAgIFRoZQogICAgICBQb3N0c2NyaXB0IGhpbnRlciB3YXMgYWxzbyBpbXByb3ZlZCBpbiBzZXZlcmFsIHdheXMuCgogICAgLSBUaGUgRlRfUkVOREVSX01PREVfTElHSFQgcmVuZGVyIG1vZGUgd2FzIGltcGxlbWVudGVkLgoKICAgIC0gQSBuZXcgIEFQSSBmdW5jdGlvbiBjYWxsZWQgYEZUX0dldF9CREZfUHJvcGVydHknICBoYXMgYmVlbiBhZGRlZAogICAgICB0byBGVF9CREZfSCB0byAgcmV0cmlldmUgQkRGIHByb3BlcnRpZXMgZnJvbSBCREYgIF9hbmRfIFBDRiBmb250CiAgICAgIGZpbGVzLiAgIFRISVMgIElTICBTVElMTCAgRVhQRVJJTUVOVEFMLCAgc2luY2UgIGl0ICBoYXNuJ3QgIGJlZW4KICAgICAgcHJvcGVybHkgdGVzdGVkIHlldC4KCiAgICAtIEEgV2luZG93cyBGTlQgc3BlY2lmaWMgQVBJIGhhcyBiZWVuIGFkZGVkLCBtb3N0bHkgdG8gYWNjZXNzIGZvbnQKICAgICAgaGVhZGVycy4gIFRoaXMgaXMgdXNlZCBieSBXaW5lLgoKICAgIC0gVHJ1ZVR5cGUgdGFibGVzICB3aXRob3V0IGFuICJobXR4IiB0YWJsZSBhcmUgIG5vdyB0b2xlcmF0ZWQgd2hlbgogICAgICBhbiAgaW5jcmVtZW50YWwgaW50ZXJmYWNlICBpcyAgdXNlZC4gIFRoaXMgIGhhcHBlbnMgZm9yICBjZXJ0YWluCiAgICAgIFR5cGU0MiBmb250cyBwYXNzZWQgZnJvbSBHaG9zdHNjcmlwdCB0byBGcmVlVHlwZS4KCiAgICAtIFRoZSBQRlIgZm9udCBkcml2ZXIgaXMgIG5vdyBjYXBhYmxlIG9mIHJldHVybmluZyB0aGUgZm9udCBmYW1pbHkKICAgICAgYW5kIHN0eWxlICBuYW1lcyB3aGVuICB0aGV5IGFyZSBhdmFpbGFibGUgIChpbnN0ZWFkIG9mICB0aGUgc29sZQogICAgICAiRm9udElEIikuICAgVGhpcyAgaXMgIHBlcmZvcm1lZCAgYnkgcGFyc2luZyAgYW4gICp1bmRvY3VtZW50ZWQqCiAgICAgIHBvcnRpb24gb2YgdGhlIGZvbnQgZmlsZSEKCgogIElJSS4gTUlTQ0VMTEFORU9VUwoKICAgIC0gVGhlIHBhdGggc3Ryb2tlciBpbiBGVF9TVFJPS0VSX0ggaGFzIGVudGVyZWQgYmV0YSBzdGFnZS4gIEl0IG5vdwogICAgICB3b3JrcyB2ZXJ5ICB3ZWxsLCBidXQgIGl0cyBpbnRlcmZhY2UgbWlnaHQgIGNoYW5nZSBhIGJpdCAgaW4gdGhlCiAgICAgIGZ1dHVyZS4gIE1vcmUgb24gdGhpcyBpbiBsYXRlciByZWxlYXNlcy4KCiAgICAtIFRoZSBkb2N1bWVudGF0aW9uIGZvciAgRlRfU2l6ZV9NZXRyaWNzIGRpZG4ndCBhcHBlYXIgcHJvcGVybHkgaW4KICAgICAgdGhlIEFQSSByZWZlcmVuY2UuCgogICAgLSBUaGUgZmlsZSBkb2NzL1ZFUlNJT04uRExMIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZXhwbGFpbiB2ZXJzaW9uaW5nCiAgICAgIHdpdGggRnJlZVR5cGUgIChpLmUuLCBjb21wYXJpbmcgcmVsZWFzZS9saWJ0b29sL3NvICBudW1iZXJzLCBhbmQKICAgICAgaG93IHRvIHVzZSB0aGVtIGluIGF1dG9jb25mIHNjcmlwdHMpLgoKICAgIC0gVGhlICBpbnN0YWxsYXRpb24gIGRvY3VtZW50YXRpb24gIGhhcyBiZWVuICBzZXJpb3VzbHkgIHJldmFtcGVkLgogICAgICBFdmVyeXRoaW5nIGlzIG5vdyBpbiB0aGUgImRvY3MiIGRpcmVjdG9yeS4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMS4zIGFuZCAyLjEuMgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBGVF9WZWN0b3JfVHJhbnNmb3JtICBoYWQgIGJlZW4gIGluY29ycmVjdGx5IG1vZGlmaWVkICBpbiAgMi4xLjIsCiAgICAgIHJlc3VsdGluZyAgaW4gIGluY29ycmVjdCAgIHRyYW5zZm9ybWF0aW9ucyAgYmVpbmcgIGFwcGxpZWQgIChmb3IKICAgICAgZXhhbXBsZSwgcm90YXRpb25zIHdlcmUgcHJvY2Vzc2VkIGluIG9wcG9zaXRlIGFuZ2xlcykuCgogICAgLSBUaGUgZm9ybWF0ICA4IGFuZCAxMiBUcnVlVHlwZSBjaGFybWFwICBlbnVtZXJhdGlvbiByb3V0aW5lcyBoYXZlCiAgICAgIGJlZW4gZml4ZWQgKEZUX0dldF9OZXh0X0NoYXIgcmV0dXJuZWQgaW52YWxpZCB2YWx1ZXMpLgoKICAgIC0gVGhlICBQRlIgZm9udCBkcml2ZXIgIHJldHVybmVkIGluY29ycmVjdCAgYWR2YW5jZSB3aWR0aHMgIGlmIHRoZQogICAgICBvdXRsaW5lICBhbmQgbWV0cmljcyByZXNvbHV0aW9uICBkZWZpbmVkIGluICB0aGUgZm9udCAgZmlsZSB3ZXJlCiAgICAgIGRpZmZlcmVudC4KCiAgICAtIEZUX0dseXBoX1RvX0JpdG1hcCBub3cgcmV0dXJucyAgc3VjY2Vzc2Z1bGx5IHdoZW4gY2FsbGVkIHdpdGggYW4KICAgICAgRlRfQml0bWFwR2x5cGggYXJndW1lbnQgKGl0IHByZXZpb3VzbHkgcmV0dXJuZWQgYW4gZXJyb3IpLgoKICAgIC0gQSBidWcgIGluIHRoZSBUeXBlIDEgIGxvYWRlciB0aGF0IHByZXZlbnRlZCAgdmFsaWQgZm9udCBib3VuZGluZwogICAgICBib3hlcyB0byBiZSBsb2FkZWQgZnJvbSBtdWx0aXBsZSBtYXN0ZXIgZm9udHMuCgogICAgLSBUaGUgU0ZOVCAgdmFsaWRhdGlvbiBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbi4gICBGcmVlVHlwZSBjYW4gbm93CiAgICAgIGxvYWQgImJyb2tlbiIgIGZvbnRzIHRoYXQgd2VyZSAgdXNhYmxlIG9uIFdpbmRvd3MsIGJ1dCAgbm90IHdpdGgKICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkuCgogICAgLSBUaGUgY29tcHV0YXRpb24gb2YgYmVhcmluZ3MgaW4gdGhlIEJERiBkcml2ZXIgaGFzIGJlZW4gZml4ZWQuCgogICAgLSBUaGUgUG9zdHNjcmlwdCBoaW50ZXIgY3Jhc2hlZCB3aGVuIHRyeWluZyB0byBoaW50IGNlcnRhaW4gZ2x5cGhzCiAgICAgIChtb3JlIHByZWNpc2VseSwgIHdoZW4gdHJ5aW5nIHRvICBhcHBseSBoaW50cyB0byBhbiAgZW1wdHkgZ2x5cGgKICAgICAgb3V0bGluZSkuCgogICAgLSBUaGUgIFRydWVUeXBlIGdseXBoICBsb2FkZXIgIG5vdyBzdXBwb3J0cyAgY29tcG9zaXRlcyBpbiAgIkFwcGxlCiAgICAgIGZvcm1hdCIgICh0aGV5IGRpZmZlciBzbGlnaHRseSAgZnJvbSBNaWNyb3NvZnQvT3BlblR5cGUgIG9uZXMgaW4KICAgICAgdGhlIHdheSB0cmFuc2Zvcm1hdGlvbiBvZmZzZXRzIGFyZSBjb21wdXRlZCkuCgogICAgLSBGcmVlVHlwZSB3YXMgIHZlcnkgc2xvdyBhdCBvcGVuaW5nIGNlcnRhaW4gIGFzaWFuIENJRC9DRkYgZm9udHMsCiAgICAgIGR1ZSB0byAgZml4ZWQgaW5jcmVtZW50ICBpbiBkeW5hbWljIGFycmF5ICByZS1hbGxvY2F0aW9ucy4gIFRoaXMKICAgICAgaGFzICBiZWVuIGNoYW5nZWQgIHRvICBleHBvbmVudGlhbCBiZWhhdmlvdXIgIHRvIGdldCAgYWNjZXB0YWJsZQogICAgICBwZXJmb3JtYW5jZS4KCgoKICBJSS4gSU1QT1JUQU5UIENIQU5HRVMKCiAgICAtIFRoZSBQQ0YgZHJpdmVyIG5vdyBzdXBwb3J0cyBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcyBuYXRpdmVseS4KICAgICAgVGhpcyBtZWFucyB0aGF0ICB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSAgYWxsIHRoZXNlIGJpdG1hcCBmb250cwogICAgICB0aGF0ICBjb21lIHdpdGggIFhGcmVlODYgd2l0aCAgRnJlZVR5cGUgKGFuZCAgbGliWGZ0L2xpYlhmdDIsIGJ5CiAgICAgIGV4dGVuc2lvbikuCgogICAgLSBUaGUgIGF1dG9tYXRpYyBhbmQgIHBvc3RzY3JpcHQgaGludGVycyAgaGF2ZSBib3RoICBiZWVuIHVwZGF0ZWQuCiAgICAgIFRoaXMgIHJlc3VsdHMgaW4gIGEgcmVsYXRpdmVseSAgaW1wb3J0YW50IGluY3JlYXNlICBvZiByZW5kZXJpbmcKICAgICAgcXVhbGl0eSBzaW5jZSAgbWFueSBuYXN0eSBkZWZhdWx0cyBoYXZlICBiZWVuIHN1cHJlc3NlZC4gIFBsZWFzZQogICAgICB2aXNpdCB0aGUgd2ViIHBhZ2U6CgogICAgICAgIGh0dHA6Ly93d3cuZnJlZXR5cGUub3JnL2hpbnRpbmcvc21vb3RoLWhpbnRpbmcuaHRtbAoKICAgICAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKICAgIC0gVGhlICJsb2FkX2ZsYWdzIiAgcGFyYW1ldGVyIG9mIEZUX0xvYWRfR2x5cGggaXMgIG5vdyBhbiBGVF9JbnQzMgogICAgICAoaW5zdGVhZCAgb2YganVzdCAgYmVpbmcgIGFuIEZUX0ludCkuICAgVGhpcyAgYnJlYWtzIHNvdXJjZSAgYW5kCiAgICAgIGJpbmFyeSAgY29tcGF0aWJpbGl0eSBmb3IgIDE2Yml0IHN5c3RlbXMgIG9ubHksICB3aGlsZSByZXRhaW5pbmcKICAgICAgYm90aCBvZiB0aGVtIGZvciAzMiBhbmQgNjQgYml0IG9uZXMuCgogICAgICBTb21lIG5ldyBmbGFncyBoYXZlIGJlZW4gYWRkZWQgY29uc2VxdWVudGx5OgoKICAgICAgICBGVF9MT0FEX05PX0FVVE9ISU5UICAgOjogRGlzYWJsZSB0aGUgdXNlIG9mIHRoZSBhdXRvLWhpbnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnV0IG5vdCBuYXRpdmUgZm9ybWF0IGhpbnRlcnMpLgoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgOjogSGludCBhbmQgcmVuZGVyIGZvciBub3JtYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50aS1hbGlhc2VkIGRpc3BsYXlzLgoKICAgICAgICBGVF9MT0FEX1RBUkdFVF9NT05PICAgOjogSGludCBhbmQgcmVuZGVyIGZvciAxLWJpdCBkaXNwbGF5cy4KCiAgICAgICAgRlRfTE9BRF9UQVJHRVRfTENEICAgIDo6IEhpbnQgYW5kIHJlbmRlciBmb3IgaG9yaXpvbnRhbCBSR0Igb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkdSIHN1Yi1waXhlbCBkaXNwbGF5cyAobGlrZSBMQ0QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucykuICBUSElTIElTIFNUSUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVSSU1FTlRBTCEKCiAgICAgICAgRlRfTE9BRF9UQVJHRVRfTENEX1YgIDo6IFNhbWUgYXMgRlRfTE9BRF9UQVJHRVRfTENELCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgc3ViLXBpeGVsIGRpc3BsYXlzIChsaWtlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZWQgTENEIHNjcmVlbnMpLiAgVEhJUyBJUyBTVElMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFUklNRU5UQUwhCgogICAgICBGVF9MT0FEX01PTk9DSFJPTUUgICBpcyAgc3RpbGwgICBzdXBwb3J0ZWQsICBidXQgICBvbmx5ICBhZmZlY3RzCiAgICAgIHJlbmRlcmluZywgbm90IHRoZSBoaW50aW5nLgoKICAgICAgTm90ZSB0aGF0IHRoZSBgZnR2aWV3JyAgZGVtbyBwcm9ncmFtIGF2YWlsYWJsZSBpbiB0aGUgYGZ0MmRlbW9zJwogICAgICBwYWNrYWdlICBoYXMgYmVlbiAgdXBkYXRlZCB0byAgc3VwcG9ydCBMQ0Qtb3B0aW1pemVkICBkaXNwbGF5IG9uCiAgICAgIG5vbi1wYWxldHRlZCBkaXNwbGF5cyAodW5kZXIgV2luMzIgYW5kIFgxMSkuCgogICAgLSBUaGUgIFBGUiAgZHJpdmVyICBub3cgIHN1cHBvcnRzIGVtYmVkZGVkICBiaXRtYXBzICAoYWxsICBmb3JtYXRzCiAgICAgIHN1cHBvcnRlZCksIGFuZCByZXR1cm5zIGNvcnJlY3Qga2VybmluZyBtZXRyaWNzIGZvciBhbGwgZ2x5cGhzLgoKICAgIC0gVGhlIFRydWVUeXBlIGNoYXJtYXAgbG9hZGVyICBub3cgc3VwcG9ydHMgY2VydGFpbiBgYnJva2VuJyBmb250cwogICAgICB0aGF0IGxvYWQgdW5kZXIgV2luZG93cyB3aXRob3V0IHByb2JsZW1zLgoKICAgIC0gVGhlIGNhY2hlIEFQSSBoYXMgYmVlbiBzbGlnaHRseSBtb2RpZmllZCAoaXQncyBzdGlsbCBhIGJldGEhKToKCiAgICAgICAtIFRoZSB0eXBlICBGVENfSW1hZ2VEZXNjIGhhcyBiZWVuIHJlbW92ZWQ7IGl0ICBpcyBub3cgcmVwbGFjZWQKICAgICAgICAgYnkgIEZUQ19JbWFnZVR5cGVSZWMuICAgTm90ZSB0aGF0ICBvbmUgIG9mICBpdHMgIGZpZWxkcyBpcyAgYQogICAgICAgICBgbG9hZF9mbGFnJyBwYXJhbWV0ZXIgZm9yIEZUX0xvYWRfR2x5cGguCgogICAgICAgLSBUaGUgIGZpZWxkICAibnVtX2dyYXlzIiBvZiAgRlRfU0JpdFJlYyAgaGFzICBiZWVuIGNoYW5nZWQgIHRvCiAgICAgICAgICJtYXhfZ3JheXMiICBpbiAgb3JkZXIgdG8gIGZpdCAgd2l0aGluICBhICBzaW5nbGUgYnl0ZS4gICBJdHMKICAgICAgICAgbWF4aW11bSB2YWx1ZSBpcyB0aHVzIDI1NSAoaW5zdGVhZCBvZiAyNTYgYXMgcHJldmlvdXNseSkuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIEFkZGVkIHN1cHBvcnQgIGZvciB0aGUgIERFU1RESVIgdmFyaWFibGUgZHVyaW5nICAibWFrZSBpbnN0YWxsIi4KICAgICAgVGhpcyBzaW1wbGlmaWVzIHBhY2thZ2luZyBvZiBGcmVlVHlwZS4KCiAgICAtIEluY2x1ZGVkIG1vZGlmaWVkICBjb3BpZXMgb2YgdGhlICBaTGliIHNvdXJjZXMgaW4gIGBzcmMvZ3ppcCcgaW4KICAgICAgb3JkZXIgdG8gc3VwcG9ydCAgZ3ppcC1jb21wcmVzc2VkIFBDRiBmb250cy4gIFdlIGRvICBub3QgdXNlIHRoZQogICAgICBzeXN0ZW0tcHJvdmlkZWQgIHpsaWIgIGZvciAgbm93LCAgIHRob3VnaCAgdGhpcyAgaXMgIGEgIHByb2JhYmxlCiAgICAgIGVuaGFuY2VtZW50IGZvciBmdXR1cmUgcmVsZWFzZXMuCgogICAgLSBUaGUgRG9jTWFrZXIgdG9vbCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBvbi1saW5lIEFQSSByZWZlcmVuY2UgaGFzCiAgICAgIGJlZW4gICBjb21wbGV0ZWx5ICAgIHJld3JpdHRlbi4gICAgSXQgICBpcyAgICBub3cgICBsb2NhdGVkICAgaW4KICAgICAgInNyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weSIuICBGZWF0dXJlczoKCiAgICAgICAgLSBiZXR0ZXIgY3Jvc3MtcmVmZXJlbmNlZCBvdXRwdXQKICAgICAgICAtIG1vcmUgcG9saXNoZWQgb3V0cHV0CiAgICAgICAgLSB1c2VzIFB5dGhvbiByZWd1bGFyIGV4cHJlc3Npb25zICAodGhvdWdoIGl0IGRpZG4ndCBzcGVlZCB0aGUKICAgICAgICAgIHByb2dyYW0pCiAgICAgICAgLSBtdWNoICBtb3JlICBtb2R1bGFyIHN0cnVjdHVyZSwgIHdoaWNoICBhbGxvd3MgZm9yICBkaWZmZXJlbnQKICAgICAgICAgICJiYWNrZW5kcyIgIGluICBvcmRlciB0byAgZ2VuZXJhdGUgIEhUTUwsICBYTUwsIG9yICB3aGF0ZXZlcgogICAgICAgICAgZm9ybWF0LgoKICAgICAgT25lIGNhbiByZWdlbmVyYXRlIHRoZSBBUEkgcmVmZXJlbmNlIGJ5IGNhbGxpbmc6CgogICAgICAgICBweXRob24gc3JjL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IFwKICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiBcCiAgICAgICAgICAgICAgICAtLXRpdGxlPUZyZWVUeXBlLTIuMS4zIFwKICAgICAgICAgICAgICAgIC0tb3V0cHV0PTxvdXRwdXRkaXJlY3Rvcnk+CiAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlLyouaCBcCiAgICAgICAgICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy8qLmggXAogICAgICAgICAgICAgICAgaW5jbHVkZS9mcmVldHlwZS9jYWNoZS8qLmgKCiAgICAtIEEgbmV3LCBleHBlcmltZW50YWwsIHN1cHBvcnQgZm9yIGluY3JlbWVudGFsIGZvbnQgbG9hZGluZyAoaS5lLiwKICAgICAgbG9hZGluZyAgb2YgZm9udHMgIHdoZXJlIHRoZSAgZ2x5cGhzIGFyZSAgbm90IGluICB0aGUgIGZvbnQgZmlsZQogICAgICBpdHNlbGYsIGJ1dCBwcm92aWRlZCBieSBhbiBleHRlcm5hbCBjb21wb25lbnQsIGxpa2UgYSBQb3N0c2NyaXB0CiAgICAgIGludGVycHJldGVyKSBoYXMgYmVlbiBhZGRlZCBieSBHcmFoYW0gQXNoZXIuICBUaGlzIGlzIHN0aWxsIHdvcmsKICAgICAgaW4gcHJvZ3Jlc3MsIGhvd2V2ZXIuCgogICAgLSBBIG5ldywgIEVYUEVSSU1FTlRBTCwgcGF0aCBzdHJva2VyICBoYXMgYmVlbiBhZGRlZC4gICBJdCBkb2Vzbid0CiAgICAgIHN1ZmZlciAgZnJvbSAgc2V2ZXJlICByb3VuZGluZyAgZXJyb3JzICBhbmQgIHRyZWF0ICBiZXppZXIgIGFyY3MKICAgICAgZGlyZWN0bHkuICBTdGlsbCB3b3JrIGluIHByb2dyZXNzIChpLmUuIG5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbAogICAgICBBUEkpLiAgIFNlZSAgdGhlIGZpbGUgIDxmcmVldHlwZS9mdHN0cm9rZXIuaD4gIGZvciAgc29tZSBvZiAgdGhlCiAgICAgIGRldGFpbHMuCgogICAgLSBUaGUgbWFzc2l2ZSAgcmUtZm9ybWF0dGluZyBvZiBzb3VyY2VzIGFuZCAgaW50ZXJuYWwgcmUtZGVzaWduIGlzCiAgICAgIHN0aWxsIHVuZGVyLXdheS4gIE1hbnkgIGludGVybmFsIGZ1bmN0aW9ucywgY29uc3RhbnRzLCBhbmQgdHlwZXMKICAgICAgaGF2ZSBiZWVuIHJlbmFtZWQuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMiBhbmQgMi4xLjEKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gTWFueSAgZm9udCBkcml2ZXJzIGRpZG4ndCAgc2VsZWN0IGEgIFVuaWNvZGUgY2hhcm1hcCAgYnkgZGVmYXVsdAogICAgICB3aGVuIGEgbmV3IGZhY2UgIHdhcyBvcGVuZWQgKHdpdGggdGhlIEZUX0NPTkZJR19PUFRJT05fVVNFX0NNQVBTCiAgICAgIG9wdGlvbnMgZW5hYmxlZCksICBjYXVzaW5nIG1hbnkgYXBwbGljYXRpb25zICB0byBub3QgYmUgIGFibGUgdG8KICAgICAgZGlzcGxheSB0ZXh0IGNvcnJlY3RseSB3aXRoIHRoZSAyLjEueCByZWxlYXNlcy4KCiAgICAtIFRoZSAgUEZSIGRyaXZlciBoYWQgIGEgYnVnICBpbiBpdHMgIGNvbXBvc2l0ZSBsb2FkaW5nICBjb2RlIHRoYXQKICAgICAgcHJvZHVjZXMgaW5jb3JyZWN0bHkgcGxhY2VkIGFjY2VudHMgd2l0aCBtYW55IGZvbnRzLgoKICAgIC0gVGhlIFR5cGU0MiBkcml2ZXIgY3Jhc2hlZCBzb21ldGltZXMgZHVlIHRvIGEgbmFzdHkgYnVnLgoKICAgIC0gVGhlIFR5cGUgMSBjdXN0b20gZW5jb2RpbmcgIGNoYXJtYXAgZGlkbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZQogICAgICB0aGUgZmlyc3QgZ2x5cGggaW5kZXggd2Fzbid0IDAuCgogICAgLSBBICBzZXJpb3VzICB0eXBvICBpbiAgdGhlICBUcnVlVHlwZSAgY29tcG9zaXRlICBsb2FkZXIgIHByb2R1Y2VkCiAgICAgIGluY29ycmVjdGx5IHBsYWNlZCAgZ2x5cGhzIGluIGZvbnRzICBsaWtlICJXaW5nZGluZ3MiIGFuZCAgYSBmZXcKICAgICAgb3RoZXJzLgoKCiAgSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFRoZSBXaW4zMiAgVmlzdWFsIEMrKyBwcm9qZWN0ICBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQgIHRvIGluY2x1ZGUKICAgICAgdGhlIFBGUiBkcml2ZXIgYXMgd2VsbC4KCiAgICAtICJmcmVldHlwZS5tNCIgaXMgIG5vdyBpbnN0YWxsZWQgYnkgZGVmYXVsdCBieSAgIm1ha2UgaW5zdGFsbCIgb24KICAgICAgVW5peCBzeXN0ZW1zLgoKICAgIC0gVGhlIGZ1bmN0aW9uICBGVF9HZXRfUFNfRm9udF9JbmZvIG5vdyB3b3JrcyB3aXRoICBDSUQgYW5kIFR5cGU0MgogICAgICBmb250cyBhcyB3ZWxsLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4xLjEgYW5kIDIuMS4wCgogIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKCiAgICAtIFRoZSAgYHZlcnNpb25faW5mbycgIHJldHVybmVkICAgYnkgIGBmcmVldHlwZS1jb25maWcnICBpbiAgMi4xLjAKICAgICAgcmV0dXJuZWQgYW4gaW52YWxpZCB2YWx1ZS4gIEl0IG5vdyByZXR1cm5zIDk6MTozICgyLjAuOSByZXR1cm5lZAogICAgICA5OjA6MykuCgogICAgLSBWZXJzaW9uIDIuMS4wICBjb3VsZG4ndCBiZSBsaW5rZWQgYWdhaW5zdCAgYXBwbGljYXRpb25zIG9uIFdpbjMyCiAgICAgIGFuZCAgQW1pZ2Egc3lzdGVtcyAgZHVlICB0byAgYSBuZXcgIGRlYnVnICBmdW5jdGlvbiB0aGF0ICB3YXNuJ3QKICAgICAgcHJvcGVybHkgICBwcm9wYWdhdGVkICB0byAgIHRoZSAgc3lzdGVtLXNwZWNpZmljICAgZGlyZWN0b3J5ICBpbgogICAgICBgYnVpbGRzJy4KCiAgICAtIFZhcmlvdXMgTWFjT1MgYW5kIE1hYyBPUyBYIHNwZWNpZmljIGZpeGVzLgoKICAgIC0gRml4ZWQgIGEgYnVnIGluICB0aGUgVHJ1ZVR5cGUgIGNoYXJtYXAgdmFsaWRhdGlvbiAgcm91dGluZXMgdGhhdAogICAgICBtYWRlIHZlcnNpb24gIDIuMS4wIHRvbyByZXN0cmljdGl2ZSAgLS0gbWFueSBwb3B1bGFyICBmb250cyBoYXZlCiAgICAgIGJlZW4gcmVqZWN0ZWQuCgogICAgLSBUaGVyZSB3YXMgIHN0aWxsIGEgdmVyeSBzbWFsbCBkaWZmZXJlbmNlICBiZXR3ZWVuIHRoZSBtb25vY2hyb21lCiAgICAgIGdseXBoIGJpdG1hcHMgcHJvZHVjZWQgYnkgRnJlZVR5cGUgMS54IGFuZCBGcmVlVHlwZSAyLnggd2l0aCB0aGUKICAgICAgYnl0ZWNvZGUgIGludGVycHJldGVyIGVuYWJsZWQuICAgVGhpcyB3YXMgIGNhdXNlZCBieSAgYW4gaW52YWxpZAogICAgICBmbGFnIHNldHRpbmcgaW4gdGhlIFRydWVUeXBlIGdseXBoIGxvYWRlciwgbWFraW5nIHRoZSByYXN0ZXJpemVyCiAgICAgIGNoYW5nZSAgaXRzICBkcm9wLW91dCAgIGNvbnRyb2wgIG1vZGUuICAgTm93ICB0aGVyZXN1bHRzICBzaG91bGQKICAgICAgX3JlYWxseV8gYmUgY29tcGxldGVseSBpZGVudGljYWwuCgogICAgLSBUaGUgVHJ1ZVR5cGUgbmFtZSB0YWJsZSBsb2FkZXIgaGFzIGJlZW4gaW1wcm92ZWQgdG8gc3VwcG9ydCBtYW55CiAgICAgIHBvcHVsYXIgIHRob3VnaCBidWdneSBBc2lhbiAgZm9udHMuICBJdCAgbm93IGlnbm9yZXMgIGVtcHR5IG5hbWUKICAgICAgZW50cmllcywgIGludmFsaWQgIHBvaW50ZXIgb2Zmc2V0cyAgYW5kICBhICBmZXcgb3RoZXIgIGluY29ycmVjdAogICAgICBzdWJ0bGV0aWVzLiAgTW9yZW92ZXIsICBuYW1lIHN0cmluZ3MgIGFyZSBub3cgbG9hZGVkICBvbiBkZW1hbmQsCiAgICAgIHdoaWNoIHJlZHVjZXMgdGhlIG1lbW9yeSBsb2FkICBvZiBtYW55IGZhY2VzIChlLmcuIHRoZSBBUklBTC5UVEYKICAgICAgZm9udCBmaWxlIGNvbnRhaW5zIGEgMTBrQnl0ZSBuYW1lIHRhYmxlIHdpdGggNzAgbmFtZXMpLgoKICAgIC0gRml4ZWQgYSBidWcgaW4gdGhlIFBvc3RzY3JpcHQgaGludGVyIHRoYXQgcHJldmVudGVkIGZhbWlseSBibHVlcwogICAgICBzdWJzdGl0dXRpb24gdG8gaGFwcGVuIGNvcnJlY3RseS4KCgogIElJLiBORVcgRkVBVFVSRVMKCiAgICAtIFRocmVlIG5ldyBmb250IGRyaXZlcnMgaW4gdGhpcyByZWxlYXNlOgoKICAgICAgKiBBICBCREYgIGZvbnQgZHJpdmVyLCAgY29udHJpYnV0ZWQgIGJ5ICBGcmFuY28gWmFwcGEgIE5hcmRlbGxpLAogICAgICAgIGhlYXZpbHkgIG1vZGlmaWVkICAgYnkgIFdlcm5lciAgTGVtYmVyZy4gICAgSXQgIGFsc28gIHN1cHBvcnRzCiAgICAgICAgYW50aS1hbGlhc2VkIGJpdG1hcHMgKHVzaW5nIGEgc2xpZ2h0bHkgZXh0ZW5kZWQgQkRGIGZvcm1hdCkuCgogICAgICAqIEEgVHlwZTQyICBmb250IGRyaXZlciwgY29udHJpYnV0ZWQgYnkgUm9iZXJ0byAgQWxhbWVkYS4gIEl0IGlzCiAgICAgICAgc3RpbGwgZXhwZXJpbWVudGFsIGJ1dCBzZWVtcyB0byB3b3JrIHJlbGF0aXZlbHkgd2VsbC4KCiAgICAgICogQSBQRlIgIGZvbnQgZHJpdmVyLCBjb250cmlidXRlZCAgYnkgRGF2aWQgVHVybmVyICBoaW1zZWxmLiAgSXQKICAgICAgICBkb2Vzbid0ICBzdXBwb3J0IFBGUiAgaGludGluZyAtLSAgbm90ZSB0aGF0ICBCaXRTdHJlYW0gIGhhcyBhdAogICAgICAgIGxlYXN0IHR3byBwYXRlbnRzIG9uIHRoaXMgZm9ybWF0IQoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgIGNhY2hlICBzdWItc3lzdGVtIGhhcyAgYmVlbiAgb3B0aW1pemVkICBpbiBpbXBvcnRhbnQgIHdheXMuCiAgICAgIENhY2hlIGhpdHMgYXJlIG5vdyBzaWduaWZpY2FudGx5IGZhc3Rlci4gIEZvciBleGFtcGxlLCB1c2luZyB0aGUKICAgICAgQ01hcCBjYWNoZSBpcyBhYm91dCAgdHdpY2UgZmFzdGVyIHRoYW4gY2FsbGluZyBGVF9HZXRfQ2hhcl9JbmRleAogICAgICBvbiBtb3N0IHBsYXRmb3Jtcy4gIFNpbWlsYXJseSwgdXNpbmcgYW4gU0JpdCBjYWNoZSBpcyBhYm91dCBmaXZlCiAgICAgIHRpbWVzIGZhc3RlciAgdGhhbiBsb2FkaW5nIHRoZSAgYml0bWFwcyBmcm9tIGEgYml0bWFwICBmaWxlLCBhbmQKICAgICAgMzAwIHRvICA1MDAgdGltZXMgIGZhc3RlciB0aGFuIGdlbmVyYXRpbmcgIHRoZW0gZnJvbSAgYSBzY2FsYWJsZQogICAgICBmb3JtYXQuCgogICAgICBOb3RlIHRoYXQgIHlvdSBzaG91bGQgcmVjb21waWxlICB5b3VyIHNvdXJjZXMgaWYgeW91ICBkZXNpZ25lZCBhCiAgICAgIGN1c3RvbSAgY2FjaGUgIGNsYXNzIGZvciAgdGhlICBGVDIgIENhY2hlICBzdWJzeXN0ZW0sIHNpbmNlICB0aGUKICAgICAgY2hhbmdlcyBwZXJmb3JtZWQgYXJlIHNvdXJjZSwgYnV0IG5vdCBiaW5hcnksIGNvbXBhdGlibGUuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjEuMCBhbmQgMi4wLjkKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlICBUcnVlVHlwZSBieXRlY29kZSAgaW50ZXJwcmV0ZXIgIGhhcyBiZWVuICBmaXhlZCB0byAgcHJvZHVjZQogICAgICBfZXhhY3RseV8gdGhlIHNhbWUgb3V0cHV0IGFzIEZyZWVUeXBlIDEueC4gIFByZXZpb3VzIGRpZmZlcmVuY2VzCiAgICAgIHdlcmUgZHVlICB0byBzbGlnaHRseSBkaXN0aW5jdCAgZml4ZWQtcG9pbnQgY29tcHV0YXRpb24gcm91dGluZXMKICAgICAgdXNlZCB0byBwZXJmb3JtIGRvdCBwcm9kdWN0cyBhbmQgdmVjdG9yIGxlbmd0aCBtZWFzdXJlbWVudHMuCgogICAgICBJdCBzZWVtcyAgdGhhdCBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyAgaXMgX2V4dHJlbWVseV8gc2Vuc2l0aXZlCiAgICAgIHRvICByb3VuZGluZyBlcnJvcnMuICBUaGUgIHJlcXVpcmVkIHZlY3RvciAgY29tcHV0YXRpb24gcm91dGluZXMKICAgICAgaGF2ZSBiZWVuIG9wdGltaXplZCBhbmQgcGxhY2VkIHdpdGhpbiB0aGUgInR0aW50ZXJwLmMiIGZpbGUuCgogICAgLSBGaXhlZCB0aGUgcGFyc2luZyBvZiBhY2NlbGVyYXRvciB0YWJsZXMgaW4gdGhlIFBDRiBmb250IGRyaXZlci4KCiAgICAtIEZpeGVkIHRoZSBUeXBlMSBnbHlwaCBsb2FkZXIgIHJvdXRpbmUgdXNlZCB0byBjb21wdXRlIHRoZSBmb250J3MKICAgICAgbWF4aW11bSBhZHZhbmNlIHdpZHRoLgoKCiAgSUkuIE5FVyBGRUFUVVJFUwoKICAgIC0gVGhlIGBjb25maWd1cmUnIHNjcmlwdCB1c2VkIG9uIFVuaXggc3lzdGVtcyBoYXMgYmVlbiBtb2RpZmllZCB0bwogICAgICBjaGVjayAgdGhhdCAgR05VICBNYWtlICBpcyAgYmVpbmcgdXNlZCAgdG8gIGJ1aWxkICB0aGUgIGxpYnJhcnkuCiAgICAgIE90aGVyd2lzZSwgIGl0ICB3aWxsIGRpc3BsYXkgIGEgIG1lc3NhZ2UgIHByb3Bvc2luZyAgdG8gdXNlICB0aGUKICAgICAgR05VTUFLRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBuYW1lIGl0LgoKICAgICAgVGhlIFVuaXgtc3BlY2lmaWMgZmlsZSBSRUFETUUuVU5YIGhhcyBiZWVuIG1vZGlmaWVkIGFjY29yZGluZ2x5LgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgIEZyZWVUeXBlICBMaWNlbnNlIGluICBgZG9jcy9GVEwuVFhUJyAgaGFzICBiZWVuIHVwZGF0ZWQgIHRvCiAgICAgIGluY2x1ZGUgIGEgIHByb3Bvc2VkIHByZWZlcnJlZCAgZGlzY2xhaW1lci4gICBJZiAgeW91IGFyZSAgdXNpbmcKICAgICAgRnJlZVR5cGUgaW4geW91ciBwcm9kdWN0cywgeW91IGFyZSBlbmNvdXJhZ2VkIChidXQgbm90IG1hbmRhdGVkKQogICAgICB0byB1c2UgdGhlIGZvbGxvd2luZyB0ZXh0IGluIHlvdXIgZG9jdW1lbnRhdGlvbjoKCiAgICAgICIiIgogICAgICAgIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgYXJlIGNvcHlyaWdodCCpIDE5OTYtMjAwMiBUaGUKICAgICAgICBGcmVlVHlwZSBQcm9qZWN0ICh3d3cuZnJlZXR5cGUub3JnKS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgICIiIgoKICAgIC0gVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgcmVuZGVyIHBvb2wgaGFzIGJlZW4gcmVkdWNlZCB0byAxNmtCeXRlLgogICAgICBUaGlzICBzaG91bGRuJ3QgcmVzdWx0ICBpbiBhbnkgIG5vdGljZWFibGUgIHBlcmZvcm1hbmNlIHBlbmFsdHksCiAgICAgIHVubGVzcyB5b3UgYXJlICB1c2luZyB0aGUgZW5naW5lIGFzLWlzIHRvICByZW5kZXIgdmVyeSBsYXJnZSBhbmQKICAgICAgY29tcGxleCBnbHlwaHMuCgogICAgLSBUaGUgIEZyZWVUeXBlIDIgIHJlZGVzaWduIGhhcyAgYmVndW4uICBNb3JlICBpbmZvcm1hdGlvbiAgY2FuIGJlCiAgICAgIGZvdW5kIGF0IHRoaXMgVVJMOgoKICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvcmVkZXNpZ24uaHRtbAoKICAgICAgVGhlIGZvbGxvd2luZyAgaW50ZXJuYWwgY2hhbmdlcyAgaGF2ZSBiZWVuIHBlcmZvcm1lZCAgd2l0aGluIHRoZQogICAgICBzb3VyY2VzIG9mIHRoaXMgcmVsZWFzZToKCiAgICAgICAgLSBNYW55ICAgaW50ZXJuYWwgIHR5cGVzICAgaGF2ZSAgYmVlbiAgIHJlbmFtZWQgICB0byAgaW5jcmVhc2UKICAgICAgICAgIGNvbnNpc3RlbmN5LiAgIFRoZSAgZm9sbG93aW5nICBzaG91bGQgIGJlIHRydWUsICBleGNlcHQgIGZvcgogICAgICAgICAgcHVibGljIHR5cGVzOgoKICAgICAgICAgICAgKiBBbGwgc3RydWN0dXJlICB0eXBlcyBoYXZlIGEgbmFtZSBlbmRpbmcgIGluICJSZWMiIChzaG9ydAogICAgICAgICAgICAgIGZvciBgcmVjb3JkJykuCgogICAgICAgICAgICAqIEEgIHBvaW50ZXItdG8tc3RydWN0dXJlIHR5cGUgIGhhcyB0aGUgIHNhbWUgbmFtZSAgYXMgdGhlCiAgICAgICAgICAgICAgc3RydWN0dXJlLCBfd2l0aG91dF8gdGhlICJSZWMiIHN1ZmZpeC4KCiAgICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb29SZWNfCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgICAgIH0gRm9vUmVjLCAqRm9vOwoKICAgICAgICAtIE1hbnkgICBpbnRlcm5hbCAgbWFjcm9zICBoYXZlICAgYmVlbiAgcmVuYW1lZCAgIHRvICBpbmNyZWFzZQogICAgICAgICAgY29uc2lzdGVuY3kuICBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSB0cnVlOgoKICAgICAgICAgICAgKiBBbGwgIG1hY3JvcyAgaGF2ZSBhICBuYW1lICBiZWdpbm5pbmcgIHdpdGggIkZUXyIuICAgVGhpcwogICAgICAgICAgICAgIHJlcXVpcmVkIGEgZmV3IGNoYW5nZXMgbGlrZQoKICAgICAgICAgICAgICAgIEFMTE9DICAgPT4gRlRfQUxMT0MKICAgICAgICAgICAgICAgIEZSRUUgICAgPT4gRlRfRlJFRQogICAgICAgICAgICAgICAgUkVBTExPQyA9PiBGVF9SRUFMTE9DCgogICAgICAgICAgICAqIEFsbCAgbWFjcm9zIGFyZSBjb21wbGV0ZWx5ICBVUFBFUkNBU0UuICBUaGlzICByZXF1aXJlZCBhCiAgICAgICAgICAgICAgZmV3IGNoYW5nZXMgbGlrZToKCiAgICAgICAgICAgICAgICBSRUFEX1Nob3J0ICA9PiBGVF9SRUFEX1NIT1JUCiAgICAgICAgICAgICAgICBORVhUX1Nob3J0ICA9PiBGVF9ORVhUX1NIT1JUCiAgICAgICAgICAgICAgICBHRVRfVUxvbmdMRSA9PiBGVF9HRVRfVUxPTkdfTEUKICAgICAgICAgICAgICAgIE1FTV9TZXQgICAgID0+IEZUX01FTV9TRVQKICAgICAgICAgICAgICAgIE1FTV9Db3B5ICAgID0+IEZUX01FTV9DT1BZCiAgICAgICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqIFdoZW5ldmVyICAgcG9zc2libGUsICAgYWxsICAgbWFjcm8gIG5hbWVzICAgZm9sbG93ICAgdGhlCiAgICAgICAgICAgICAgRlRfPE9CSkVDVD5fPE1FVEhPRD4gcGF0dGVybi4gIEZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgQUNDRVNTX0ZyYW1lICAgPT4gRlRfRlJBTUVfRU5URVIKICAgICAgICAgICAgICAgIEZPUkdFVF9GcmFtZSAgID0+IEZUX0ZSQU1FX0VYSVQKICAgICAgICAgICAgICAgIEVYVFJBQ1RfRnJhbWUgID0+IEZUX0ZSQU1FX0VYVFJBQ1QKICAgICAgICAgICAgICAgIFJFTEVBU0VfRnJhbWUgID0+IEZUX0ZSQU1FX1JFTEVBU0UKCiAgICAgICAgICAgICAgICBGSUxFX1BvcyAgICAgICA9PiBGVF9TVFJFQU1fUE9TCiAgICAgICAgICAgICAgICBGSUxFX1NlZWsgICAgICA9PiBGVF9TVFJFQU1fU0VFSwogICAgICAgICAgICAgICAgRklMRV9SZWFkICAgICAgPT4gRlRfU1RSRUFNX1JFQUQKICAgICAgICAgICAgICAgIEZJTEVfUmVhZEF0ICAgID0+IEZUX1NUUkVBTV9SRUFEX0FUCiAgICAgICAgICAgICAgICBSRUFEX0ZpZWxkcyAgICA9PiBGVF9TVFJFQU1fUkVBRF9GSUVMRFMKCiAgICAgICAgLSBNYW55ICBpbnRlcm5hbCBmdW5jdGlvbnMgIGhhdmUgIGJlZW4gcmVuYW1lZCAgdG8gZm9sbG93ICB0aGUKICAgICAgICAgIEZUXzxPYmplY3Q+XzxNZXRob2Q+IHBhdHRlcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEZUX1NlZWtfU3RyZWFtICAgICAgID0+IEZUX1N0cmVhbV9TZWVrCiAgICAgICAgICAgIEZUX1JlYWRfU3RyZWFtX0F0ICAgID0+IEZUX1N0cmVhbV9SZWFkQXQKICAgICAgICAgICAgRlRfRG9uZV9TdHJlYW0gICAgICAgPT4gRlRfU3RyZWFtX0Nsb3NlCiAgICAgICAgICAgIEZUX05ld19TdHJlYW0gICAgICAgID0+IEZUX1N0cmVhbV9PcGVuCiAgICAgICAgICAgIEZUX05ld19NZW1vcnlfU3RyZWFtID0+IEZUX1N0cmVhbV9PcGVuTWVtb3J5CiAgICAgICAgICAgIEZUX0V4dHJhY3RfRnJhbWUgICAgID0+IEZUX1N0cmVhbV9FeHRyYWN0RnJhbWUKCiAgICAgICAgICBOb3RlIHRoYXQgbWV0aG9kIG5hbWVzIGRvIG5vdCBjb250YWluICJfIi4KCiAgICAgICAgLSBUaGUgRlRfQUxMT0NfQVJSQVkgIGFuZCBGVF9SRUFMTE9DX0FSUkFZIGhhdmUgIGJlZW4gcmVwbGFjZWQKICAgICAgICAgIHdpdGggIEZUX05FV19BUlJBWSBhbmQgIEZUX1JFTkVXX0FSUkFZIHdoaWNoICBkbyBub3QgIHRha2UgYQogICAgICAgICAgdHlwZSAgYXMgdGhlICBmb3VydGggYXJndW1lbnQuICAgSW5zdGVhZCwgdGhlICBhcnJheSBlbGVtZW50CiAgICAgICAgICB0eXBlICBzaXplIGlzIGNvbXB1dGVkICBhdXRvbWF0aWNhbGx5IGZyb20gIHRoZSB0eXBlICBvZiB0aGUKICAgICAgICAgIHRhcmdldCBwb2ludGVyIHVzZWQuCgogICAgICAgIC0gQSAgbmV3IG9iamVjdCAgY2xhc3MsIEZUX0NNYXAsICBoYXMgYmVlbiAgaW50cm9kdWNlZC4gIFRoZXNlCiAgICAgICAgICBpbnRlcm5hbCAgb2JqZWN0cyBhcmUgIHVzZWQgdG8gIG1vZGVsIGNoYXJhY3RlciAgbWFwcy4gIFRoaXMKICAgICAgICAgIGVhc2VzICB0aGUgc3VwcG9ydCAgb2YgYWRkaXRpb25hbCAgY2hhcm1hcCB0eXBlcyAgd2l0aGluIHRoZQogICAgICAgICAgZW5naW5lLgoKICAgICAgICAtIEEgbmV3ICBjb25maWd1cmF0aW9uIGZpbGUgbmFtZWQgImZ0c3RkbGliLmgiICBoYXMgYmVlbiBhZGRlZAogICAgICAgICAgdG8gYGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnJy4gIEl0ICBpcyB1c2VkIHRvIGRlZmluZSBhbGlhc2VzCiAgICAgICAgICBmb3IgIF9ldmVyeV8gcm91dGluZSAgb2YgdGhlICBJU08gIEMgbGlicmFyeSAgdGhhdCB0aGUgIGZvbnQKICAgICAgICAgIGVuZ2luZSAgIHVzZXMuICAgIEVhY2ggICAgYWxpYXNlcyAgIGhhcyAgIGEgICAiZnRfIiAgIHByZWZpeAogICAgICAgICAgKGUuZy4gImZ0X3N0cmxlbiIgaXMgYW4gYWxpYXMgZm9yICJzdHJsZW4iKS4KCiAgICAgICAgICBUaGlzIGlzICB1c2VkIHRvICBlYXNlIHRoZSBwb3J0aW5nICBvZiBGcmVlVHlwZSAyICB0byBleG90aWMKICAgICAgICAgIHJ1bnRpbWUgZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBJU08gQyBMaWJyYXJ5IGlzbid0IGF2YWlsYWJsZQogICAgICAgICAgKGUuZy4gIFhGcmVlODYgZXh0ZW5zaW9uIG1vZHVsZXMpLgoKICAgICAgTW9yZSBkZXRhaWxzIGFyZSBhdmFpbGFibGUgaW4gdGhlICJDaGFuZ2VMb2ciIGZpbGUuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuOSBhbmQgMi4wLjgKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gQ2VydGFpbiBmb250cyBsaWtlICJmb3hqdW1wLnR0ZiIgY29udGFpbiBicm9rZW4gbmFtZSB0YWJsZXMgd2l0aAogICAgICBpbnZhbGlkIGVudHJpZXMgYW5kIHdpbGQgb2Zmc2V0cy4gIFRoaXMgY2F1c2VkIEZyZWVUeXBlIHRvIGNyYXNoCiAgICAgIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlbS4KCiAgICAgIFRoZSAgU0ZOVCBgbmFtZScgIHRhYmxlICBsb2FkZXIgaGFzICBiZWVuICBmaXhlZCB0byAgYmUgYWJsZSAgdG8KICAgICAgc3VwcG9ydCB0aGVzZSBzdHJhbmdlIGZvbnRzLgoKICAgICAgTW9yZW92ZXIsIHRoZSBjb2RlICBpbiBjaGFyZ2Ugb2YgcHJvY2Vzc2luZyB0aGlzICB0YWJsZSBoYXMgYmVlbgogICAgICBjaGFuZ2VkICB0byBhbHdheXMgZmF2b3VyICBXaW5kb3dzLWZvcm1hdHRlZCBlbnRyaWVzICBvdmVyIG90aGVyCiAgICAgIG9uZXMuICBIZW5jZSwgIGEgZm9udCB0aGF0IHdvcmtzICBvbiBXaW5kb3dzIGJ1dCBub3QgIG9uIHRoZSBNYWMKICAgICAgd2lsbCAgbG9hZCBjbGVhbmx5IGluICBGcmVlVHlwZSBhbmQgIHJlcG9ydCBhY2N1cmF0ZSAgdmFsdWVzIGZvcgogICAgICBGYW1pbHkgJiBQb3N0U2NyaXB0IG5hbWVzLgoKICAgIC0gVGhlIENJRCBmb250IGRyaXZlciBoYXMgYmVlbiBmaXhlZC4gIEl0IHVuZm9ydHVuYXRlbHkgcmV0dXJuZWQgYQogICAgICBQb3N0c2NyaXB0ICAgRm9udCAgIG5hbWUgICB3aXRoICAgYSAgIGxlYWRpbmcgICBzbGFzaCwgICBhcyAgIGluCiAgICAgICIvTXVuaHdhR290aGljLVJlZ3VsYXIiLgoKICAgIC0gRnJlZVR5cGUgIDIgc2hvdWxkIG5vdyAgY29tcGlsZSBmaW5lICBvbiBBSVggIDQuMy4zIGFzICBhIHNoYXJlZAogICAgICBsaWJyYXJ5LgoKICAgIC0gQSAgYnVnICBpbiB0aGUgIFBvc3RzY3JpcHQgIGhpbnRlciAgaGFzICBiZWVuIGZvdW5kICBhbmQgIGZpeGVkLAogICAgICByZW1vdmluZyB1bi1ldmVuIHN0ZW0gd2lkdGhzIGF0IHNtYWxsIHBpeGVsIHNpemVzIChsaWtlIDE0LTE3KS4KCiAgICAgIFRoaXMgIGltcHJvdmVzIHRoZSAgcXVhbGl0eSBvZiAgYSBjZXJ0YWluICBudW1iZXIgIG9mIFBvc3RzY3JpcHQKICAgICAgZm9udHMuCgoKICBJSS4gTkVXIEZFQVRVUkVTCgogICAgLSBBICBuZXcgZnVuY3Rpb24gIG5hbWVkICBgRlRfTGlicmFyeV9WZXJzaW9uJyBoYXMgIGJlZW4gYWRkZWQgIHRvCiAgICAgIHJldHVybiAgdGhlIGN1cnJlbnQgIGxpYnJhcnkncyBtYWpvciwgIG1pbm9yLCBhbmQgIHBhdGNoIHZlcnNpb24KICAgICAgbnVtYmVycy4gICBUaGlzIGlzICBpbXBvcnRhbnQgc2luY2UgIHRoZSAgbWFjcm9zIEZSRUVUWVBFX01BSk9SLAogICAgICBGUkVFVFlQRV9NSU5PUiwgIGFuZCAgRlJFRVRZUEVfUEFUQ0ggIGNhbm5vdCAgYmUgdXNlZCAgd2hlbiAgdGhlCiAgICAgIGxpYnJhcnkgaXMgZHluYW1pY2FsbHkgbGlua2VkIGJ5IGEgcHJvZ3JhbS4KCiAgICAtIFR3byAgIG5ldyAgQVBJcyAgIGhhdmUgIGJlZW4gICBhZGRlZDogICBgRlRfR2V0X0ZpcnN0X0NoYXInICBhbmQKICAgICAgYEZUX0dldF9OZXh0X0NoYXInLgoKICAgICAgVG9nZXRoZXIsICB0aGVzZSBjYW4gIGJlIHVzZWQgIHRvIGl0ZXJhdGUgIGVmZmljaWVudGx5ICBvdmVyIHRoZQogICAgICBjdXJyZW50bHkgIHNlbGVjdGVkICBjaGFybWFwIG9mICBhICBnaXZlbiAgZmFjZS4gICBSZWFkIHRoZSAgQVBJCiAgICAgIHJlZmVyZW5jZSBmb3IgbW9yZSBkZXRhaWxzLgoKCiAgSUlJLiBNSVNDRUxMQU5FT1VTCgogICAgLSBUaGUgRnJlZVR5cGUgc291cmNlcyBhcmUgIHVuZGVyIGhlYXZ5IGludGVybmFsIHJlLWZhY3RvcmluZy4gIEFzCiAgICAgIGEgY29uc2VxdWVuY2UsICB3ZSBoYXZlIGNyZWF0ZWQgIGEgYnJhbmNoIG5hbWVkICJTVEFCTEUiICBvbiB0aGUKICAgICAgQ1ZTIHRvIGhvbGQgYWxsIGZ1dHVyZSByZWxlYXNlcy9maXhlcyBpbiB0aGUgMi4wLnggZmFtaWx5LgoKICAgICAgVGhlICBIRUFEICBicmFuY2ggIG5vdyAgY29udGFpbnMgIHRoZSAgcmUtZmFjdG9yZWQgIHNvdXJjZXMgIGFuZAogICAgICBzaG91bGRuJ3QgIGJlIHVzZWQgZm9yICB0ZXN0aW5nIG9yICBwYWNrYWdpbmcgbmV3ICByZWxlYXNlcy4gIEluCiAgICAgIGNhc2UgeW91ICB3b3VsZCBsaWtlICB0byBhY2Nlc3MgdGhlICAyLjAuOSBzb3VyY2VzIGZyb20gIG91ciBDVlMKICAgICAgcmVwb3NpdG9yeSwgdXNlIHRoZSB0YWcgYFZFUi0yLTAtOScuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuOCBhbmQgMi4wLjcKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gVGhlcmUgd2FzICBhIHNtYWxsIGJ1dCAgbmFzdHkgYnVnIGluICAiZnJlZXR5cGUtY29uZmlnLmluIiB3aGljaAogICAgICBjYXVzZWQgdGhlICJmcmVldHlwZS1jb25maWciIHNjcmlwdCB0byBmYWlsIG9uIFVuaXguCgogICAgICBUaGlzIGRpZG4ndCBwcmV2ZW50IHRoZSBpbnN0YWxsYXRpb24gIG9mIHRoZSBsaWJyYXJ5IG9yIGV2ZW4gaXRzCiAgICAgIGV4ZWN1dGlvbiwgYnV0IGNhdXNlZCBwcm9ibGVtcyAgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSBtYW55IFVuaXgKICAgICAgcGFja2FnZXMgdGhhdCBkZXBlbmQgb24gaXQuCgogICAgLSBTb21lIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnRzIGVtYmVkZGVkIGluIFBERiBkb2N1bWVudHMgZG8gbm90CiAgICAgIGhhdmUgIGEgICdjbWFwJywgICdwb3N0JyAgYW5kICAnbmFtZScgIGFzICBpcyAgcmVxdWlyZWQgIGJ5ICB0aGUKICAgICAgc3BlY2lmaWNhdGlvbi4gIEZyZWVUeXBlIG5vIGxvbmdlciByZWZ1c2VzIHRvIGxvYWQgc3VjaCBmb250cy4KCiAgICAtIFZhcmlvdXMgZml4ZXMgdG8gdGhlIFBDRiBmb250IGRyaXZlci4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC43IGFuZCAyLjAuNgoKICBJLiBJTVBPUlRBTlQgQlVHIEZJWEVTCgogICAgLSBGaXhlZCAgdHdvICBidWdzIGluICB0aGUgIFR5cGUgMSAgZm9udCAgZHJpdmVyLiAgIFRoZSBmaXJzdCAgb25lCiAgICAgIHJlc3VsdGVkIGluIGEgbWVtb3J5IGxlYWsgaW4gc3VidGxlIGNhc2VzLiAgVGhlIG90aGVyIG9uZSBjYXVzZWQKICAgICAgRnJlZVR5cGUgdG8gY3Jhc2ggd2hlbiAgdHJ5aW5nIHRvIGxvYWQgIi5nc2YiIGZpbGVzIChHaG9zdHNjcmlwdAogICAgICBzby1jYWxsZWQgUG9zdHNjcmlwdCBmb250cykuCgogICAgICAoVGhpcyAgbWFkZSBfbWFueV8gIEtERSBhcHBsaWNhdGlvbnMgIGNyYXNoIG9uICBjZXJ0YWluIHN5c3RlbXMuCiAgICAgICBGcmVlVHlwZSBfaXNfIGJlY29taW5nIGEgY3JpdGljYWwgc3lzdGVtIGNvbXBvbmVudCBvbiBMaW51eCA6LSkKCiAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIENGRiBmb250IGRyaXZlci4KCiAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIFBDRiBmb250IGRyaXZlci4KCiAgICAtIEZpeGVkICAgICAgIHRoZSAgICAgICAgVmlzdWFsICAgICAgIEMrKyAgICAgICBwcm9qZWN0ICAgICAgIGZpbGUKICAgICAgImJ1aWxkcy93aW4zMi92aXN1YWxjL2ZyZWV0eXBlLmRzcCIgc2luY2UgIGl0IGRpZG4ndCBpbmNsdWRlIHRoZQogICAgICBQb3N0c2NyaXB0IGhpbnRlciBjb21wb25lbnQsIGNhdXNpbmcgZXJyb3JzIGF0IGJ1aWxkIHRpbWUuCgogICAgLSBGaXhlZCBhICBzbWFsbCByZW5kZXJpbmcgYnVnICBpbiB0aGUgYW50aS1hbGlhc2VkICByZW5kZXJlciB0aGF0CiAgICAgIG9ubHkgIG9jY3VycmVkIHdoZW4gIHRyeWluZyB0byAgZHJhdyAgdGhpbiAobGVzcyAgdGhhbiAxICBwaXhlbCkKICAgICAgc3Ryb2tlcy4KCiAgICAtIEZpeGVkICAiYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmE0IiB3aGljaCAgaXMgdXNlZCAgdG8gIGdlbmVyYXRlIGEKICAgICAgdmFsaWQgImZyZWV0eXBlMi5tNCIgZm9yIHVzZSB3aXRoIGF1dG9jb25mLgoKICAgIC0gRml4ZWQgdGhlIE9wZW5WTVMgTWFrZWZpbGVzLgoKCiAgSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIEFkZGVkICAiY29uZmlndXJlIiAgYW5kICAgImluc3RhbGwiICBzY3JpcHRzICB0byAgdGhlICB0b3AtbGV2ZWwKICAgICAgZGlyZWN0b3J5LiAgQSBHTlUtc3R5bGUgaW5zdGFsbGF0aW9uIGlzIHRodXMgbm93IGVhc2lseSBwb3NzaWJsZQogICAgICB3aXRoCgogICAgICAgIC4vY29uZmlndXJlICA8b3B0aW9ucz4KICAgICAgICBtYWtlCiAgICAgICAgbWFrZSBpbnN0YWxsCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuNiBhbmQgMi4wLjUKCiAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUwoKICAgIC0gSXQgd2Fzbid0IHBvc3NpYmxlIHRvIGxvYWQgZW1iZWRkZWQgYml0bWFwcyB3aGVuIHRoZSBhdXRvLWhpbnRlcgogICAgICB3YXMgdXNlZC4gIFRoaXMgaXMgbm93IGZpeGVkLgoKICAgIC0gVGhlIFRydWVUeXBlICBmb250IGRyaXZlciAgZGlkbid0IGxvYWQgc29tZSAgY29tcG9zaXRlcyBwcm9wZXJseQogICAgICAodGhlICBzdWItZ2x5cGhzICB3ZXJlICBzbGlnaHRseSAgc2hpZnRlZCwgIGFuZCAgdGhpcyAgd2FzICBvbmx5CiAgICAgIG5vdGljZWFibGUgd2hlbiB1c2luZyBtb25vY2hyb21lIHJlbmRlcmluZykuCgogICAgLSBWYXJpb3VzICBmaXhlcyAgdG8gdGhlICBhdXRvLWhpbnRlci4gICBUaGV5ICBtZXJlbHkgaW1wcm92ZSAgdGhlCiAgICAgIG91dHB1dCBvZiBzYW5zLXNlcmlmIGZvbnRzLiAgIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcHJvYmxlbXMKICAgICAgd2l0aCBzZXJpZmVkIGZvbnRzIGFuZCBjb21wb3NpdGVzIChhY2NlbnRlZCBjaGFyYWN0ZXJzKS4KCiAgICAtIEFsbCBzY2FsYWJsZSAgZm9udCBkcml2ZXJzIGVycm9uZW91c2x5ICByZXR1cm5lZCB1bi1maXR0ZWQgZ2x5cGgKICAgICAgYWR2YW5jZXMgd2hlbiBoaW50aW5nIHdhcyAgcmVxdWVzdGVkLiAgVGhpcyBjcmVhdGVkIHByb2JsZW1zIGZvcgogICAgICBhIG51bWJlciAgb2YgbGF5b3V0IGFwcGxpY2F0aW9ucy4gIFRoaXMgIGlzIGEgdmVyeSAgb2xkIGJ1ZyB0aGF0CiAgICAgIGdvdCAgdW5kZXRlY3RlZCBtYWlubHkgIGJlY2F1c2UgbW9zdCAgdGVzdC9kZW1vICBwcm9ncmFtIHBlcmZvcm0KICAgICAgcm91bmRpbmcgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5ICh0aHJvdWdoIHRoZSBjYWNoZSkuCgogICAgLSBGVF9HbHlwaF9Ub19CaXRtYXAoKSBkaWQgZXJyb25lb3VzbHkgIG1vZGlmeSB0aGUgc291cmNlIGdseXBoIGluCiAgICAgIGNlcnRhaW4gY2FzZXMuCgogICAgLSAiZ2xuYW1lcy5weSIgIHN0aWxsIGNvbnRhaW5lZCAgYSBidWcgIHRoYXQgbWFkZSAgRnJlZVR5cGUgcmV0dXJuCiAgICAgIGludmFsaWQgbmFtZXMgZm9yIGNlcnRhaW4gZ2x5cGhzLgoKICAgIC0gVGhlICBsaWJyYXJ5IGNyYXNoZWQgIHdoZW4gIGxvYWRpbmcgY2VydGFpbiAgVHlwZSAgMSBmb250cyAgbGlrZQogICAgICAic2Fkbi5wZmIiICAoIlN0YWxpbmdyYWQgIE5vcm1hbCIpLCAgIHdoaWNoICBhcHBlYXIgIHRvICBjb250YWluCiAgICAgIHBhdGhldGljIGZvbnQgaW5mbyBkaWN0aW9uYXJpZXMuCgogICAgLSBUaGUgVHJ1ZVR5cGUgZ2x5cGggIGxvYWRlciBpcyBub3cgbXVjaCBtb3JlICBwYXJhbm9pZCBhbmQgY2hlY2tzCiAgICAgIGV2ZXJ5dGhpbmcgd2hlbiBsb2FkaW5nIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UuICBUaGlzIHdhcyBuZWNlc3NhcnkKICAgICAgdG8gYXZvaWQgcHJvYmxlbXMgKGNyYXNoZXMgYW5kL29yIG1lbW9yeSBvdmVyd3JpdGVzKSB3aXRoIGJyb2tlbgogICAgICBmb250cyB0aGF0IGNhbWUgZnJvbSBhIHJlYWxseSBidWdneSBhdXRvbWF0aWMgZm9udCBjb252ZXJ0ZXIuCgoKICBJSS4gSU1QT1JUQU5UIFVQREFURVMgQU5EIE5FVyBGRUFUVVJFUwoKICAgIC0gSW1wb3J0YW50IHVwZGF0ZXMgdG8gdGhlIE1hYy1zcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeS4KCiAgICAtIFRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gaGFzICBiZWVuIGNvbXBsZXRlbHkgcmUtZGVzaWduZWQsIGFuZCBpdHMKICAgICAgQVBJIGhhcyAgZXZvbHZlZCAodGhlIG9sZCAgb25lIGlzIHN0aWxsIHN1cHBvcnRlZCAgZm9yIGJhY2t3YXJkcwogICAgICBjb21wYXRpYmlsaXR5KS4KCiAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGZvciBpdCBpcyAgbm90IHlldCBjb21wbGV0ZWQsIHNvcnJ5LiAgRm9yIG5vdywKICAgICAgeW91IGFyZSBlbmNvdXJhZ2VkIHRvIGNvbnRpbnVlICB1c2luZyB0aGUgb2xkIEFQSS4gIEhvd2V2ZXIsIHRoZQogICAgICBmdHZpZXcgIGRlbW8gcHJvZ3JhbSBpbiAgdGhlIGZ0MmRlbW9zICBwYWNrYWdlIGhhcyAgYWxyZWFkeSBiZWVuCiAgICAgIHVwZGF0ZWQgdG8gdXNlIHRoZSBuZXcgY2FjaGluZyBmdW5jdGlvbnMuCgogICAgLSBBIG5ldyBjaGFybWFwIGNhY2hlIGlzIHByb3ZpZGVkIHRvby4gIFNlZSBGVENfQ01hcENhY2hlKCkuICBUaGlzCiAgICAgIGlzIHVzZWZ1bCB0byBwZXJmb3JtICBjaGFyYWN0ZXIgY29kZSAtPiBnbHlwaCBpbmRleCB0cmFuc2xhdGlvbnMKICAgICAgcXVpY2tseSwgd2l0aG91dCB0aGUgbmVlZCBmb3IgYW4gb3BlbmVkIEZUX0ZhY2UuCgogICAgLSBBIE5FVyBQT1NUU0NSSVBUIEhJTlRFUiBtb2R1bGUgIGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgbmF0aXZlCiAgICAgIGhpbnRzIGluICB0aGUgZm9sbG93aW5nICBmb3JtYXRzOiBQb3N0U2NyaXB0IFR5cGUgIDEsIFBvc3RTY3JpcHQKICAgICAgQ0lELCBhbmQgQ0ZGL0NFRi4KCiAgICAgIFBsZWFzZSB0ZXN0ISAgTm90ZSB0aGF0ICB0aGUgYXV0by1oaW50ZXIgcHJvZHVjZXMgYmV0dGVyIHJlc3VsdHMKICAgICAgZm9yIGEgbnVtYmVyIG9mICBiYWRseS1oaW50ZWQgZm9udHMgKG1vc3RseSBhdXRvLWdlbmVyYXRlZCBvbmVzKQogICAgICB0aG91Z2guCgogICAgLSBBIG1lbW9yeSBkZWJ1Z2dlciBpcyBub3cgIHBhcnQgb2YgdGhlIHN0YW5kYXJkIEZyZWVUeXBlIHNvdXJjZXMuCiAgICAgIFRvICAgICAgZW5hYmxlICAgICAgaXQsICAgICAgZGVmaW5lICAgICAgRlRfREVCVUdfTUVNT1JZICAgICAgaW4KICAgICAgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPiwgYW5kIHJlY29tcGlsZSB0aGUgbGlicmFyeS4KCiAgICAgIEFkZGl0aW9uYWxseSwgZGVmaW5lICB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBGVF9ERUJVR19NRU1PUlkKICAgICAgYW5kIHJ1biBhbnkgcHJvZ3JhbSB1c2luZyBGcmVlVHlwZS4gIFdoZW4gdGhlIGxpYnJhcnkgaXMgZXhpdGVkLAogICAgICBhICBzdW1tYXJ5ICBvZiBtZW1vcnkgIGZvb3RwcmludHMgIGFuZCAgcG9zc2libGUgIGxlYWtzIHdpbGwgIGJlCiAgICAgIGRpc3BsYXllZC4KCiAgICAgIFRoaXMgd29ya3MgdHJhbnNwYXJlbnRseSB3aXRoICBfYW55XyBwcm9ncmFtIHRoYXQgdXNlcyBGcmVlVHlwZS4KICAgICAgSG93ZXZlciwgeW91ICB3aWxsIG5lZWQgYSBsb3QgIG9mIG1lbW9yeSB0byAgdXNlIHRoaXMgKGFsbG9jYXRlZAogICAgICBibG9ja3MgYXJlIG5ldmVyICByZWxlYXNlZCB0byB0aGUgaGVhcCB0byAgZGV0ZWN0IGRvdWJsZSBkZWxldGVzCiAgICAgIGVhc2lseSkuCgoKICBJSUkuIE1JU0NFTExBTkVPVVMKCiAgICAtIFdlICBhcmUgIGF3YXJlICBvZiAgc3VidGxlICBkaWZmZXJlbmNlcyBiZXR3ZWVuICB0aGUgIG91dHB1dCAgb2YKICAgICAgRnJlZVR5cGUgIHZlcnNpb25zICAgMSAgYW5kICAyICB3aGVuICBpdCAgIGNvbWVzICB0byAgbW9ub2Nocm9tZQogICAgICBUcnVlVHlwZS1oaW50ZWQgZ2x5cGhzLiAgIFRoZXNlIGFyZSAgbW9zdCBwcm9iYWJseSBkdWUgIHRvIHNtYWxsCiAgICAgIGRpZmZlcmVuY2VzIGluIHRoZSBtb25vY2hyb21lIHJhc3Rlcml6ZXJzIGFuZCB3aWxsIGJlIHdvcmtlZCBvdXQKICAgICAgaW4gYW4gdXBjb21pbmcgcmVsZWFzZS4KCiAgICAtIFdlIGhhdmUgZGVjaWRlZCB0byBmb3JrIHRoZSBzb3VyY2VzIGluIGEgInN0YWJsZSIgYnJhbmNoLCBhbmQgYW4KICAgICAgInVuc3RhYmxlIiBvbmUsIHNpbmNlIEZyZWVUeXBlICBpcyBiZWNvbWluZyBhIGNyaXRpY2FsIGNvbXBvbmVudAogICAgICBvZiBtYW55IFVuaXggc3lzdGVtcy4KCiAgICAgIFRoZSBuZXh0ICBidWctZml4IHJlbGVhc2VzIG9mICB0aGUgbGlicmFyeSB3aWxsIGJlICBuYW1lZCAyLjAuNywKICAgICAgMi4wLjgsIGV0Yy4sICB3aGlsZSB0aGUgIjIuMSIgIGJyYW5jaCB3aWxsIGNvbnRhaW4gYSAgdmVyc2lvbiBvZgogICAgICB0aGUgc291cmNlcyB3aGVyZSB3ZSB3aWxsIHN0YXJ0IG1ham9yIHJld29ya2luZyBvZiB0aGUgbGlicmFyeSdzCiAgICAgIGludGVybmFscywgaW4gb3JkZXIgdG8gcHJvZHVjZSBGcmVlVHlwZSAyLjIuMCAob3IgZXZlbiAzLjApIGluIGEKICAgICAgbW9yZSBkaXN0YW50IGZ1dHVyZS4KCiAgICAgIFdlICBhbHNvIGhvcGUgIHRoYXQgdGhpcyAgc2NoZW1lIHdpbGwgIGFsbG93IG11Y2ggIG1vcmUgZnJlcXVlbnQKICAgICAgcmVsZWFzZXMgdGhhbiBpbiB0aGUgcGFzdC4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC41IGFuZCAyLjAuNAoKICBOT1RFIFRIQVQgMi4wLjUgRE9FUyBOT1QgQ09OVEFJTiBUSEUgUE9TVFNDUklQVCBISU5URVIuICBUSElTIE1PRFVMRQogIFdJTEwgQkUgUEFSVCBPRiBUSEUgTkVYVCBSRUxFQVNFIChFSVRIRVIgMi4wLjYgb3IgMi4xKQoKICAtIEZpeGVkIGEgYnVnIHRoYXQgbWFkZSAgY2VydGFpbiBnbHlwaHMsIGxpa2UgIkNhY3V0ZSIsICJjYWN1dGUiIGFuZAogICAgImxzbGFzaCIgIHVuYXZhaWxhYmxlIGZyb20gVW5pY29kZSAgY2hhcm1hcHMgb2YgIFBvc3RzY3JpcHQgZm9udHMuCiAgICBUaGlzIHByZXZlbnRlZCB0aGUgY29ycmVjdCBkaXNwbGF5IG9mIFBvbGlzaCB0ZXh0LCBmb3IgZXhhbXBsZS4KCiAgLSBUaGUga2VybmluZyB0YWJsZSBvZiBUeXBlIDEgZm9udHMgd2FzIGxvYWRlZCBieSBGcmVlVHlwZSwgd2hlbiBpdHMKICAgIEFGTSAgICBmaWxlICAgIHdhcyAgICBhdHRhY2hlZCAgICB0byAgICBpdHMgICAgZmFjZSwgICAgYnV0ICAgIHRoZQogICAgRlRfRkFDRV9GTEFHX0hBU19LRVJOSU5HICAgYml0ICBmbGFncyAgIHdhcyAgbm90ICAgc2V0ICBjb3JyZWN0bHksCiAgICBwcmV2ZW50aW5nIEZUX0dldF9LZXJuaW5nIHRvIHJldHVybiBtZWFuaW5nZnVsIHZhbHVlcy4KCiAgLSBJbXByb3ZlZCAgU0ZOVCAoVHJ1ZVR5cGUgICYgT3BlblR5cGUpICBjaGFybWFwICBzdXBwb3J0LiAgU2xpZ2h0bHkKICAgIGJldHRlciBwZXJmb3JtYW5jZSwgYXMgd2VsbCBhcyBzdXBwb3J0IGZvciB0aGUgbmV3IGZvcm1hdHMgZGVmaW5lZAogICAgYnkgdGhlIE9wZW5UeXBlIDEuMyBzcGVjaWZpY2F0aW9uICg4LCAxMCwgYW5kIDEyKQoKICAtIEZpeGVkIGEgIHNlcmlvdXMgdHlwbyBpbiAic3JjL2Jhc2UvZnRjYWxjLmMiICB3aGljaCBjYXVzZWQgaW52YWxpZAogICAgY29tcHV0YXRpb25zIGluIGNlcnRhaW4gcmFyZSBjYXNlcywgcHJvZHVjaW5nIHVnbHkgYXJ0ZWZhY3RzLgoKICAtIFRoZSAgc2l6ZSAgb2YgdGhlICBFTSAgc3F1YXJlIGlzICBjb21wdXRlZCAgd2l0aCAgYSBtb3JlICBhY2N1cmF0ZQogICAgYWxnb3JpdGhtIGZvciBQb3N0c2NyaXB0IGZvbnRzLiAgIFRoZSBvbGQgb25lIGNhdXNlZCBzbGlnaHQgZXJyb3JzCiAgICB3aXRoIGVtYmVkZGVkIGZvbnRzIGZvdW5kIGluIFBERiBkb2N1bWVudHMuCgogIC0gRml4ZWQgIGEgIGJ1ZyBpbiAgdGhlICBjYWNoZSAgbWFuYWdlciAgdGhhdCBwcmV2ZW50ZWQgIG5vcm1hbCAgTFJVCiAgICBiZWhhdmlvdXIgIHdpdGhpbiB0aGUgY2FjaGUgIG1hbmFnZXIsIGNhdXNpbmcgIHVubmVjZXNzYXJ5IHJlbG9hZHMKICAgIChmb3IgRlRfRmFjZSBhbmQgRlRfU2l6ZSBvYmplY3RzIG9ubHkpLgoKICAtIEFkZGVkICBhIG5ldyAgZnVuY3Rpb24gbmFtZWQgICJGVF9HZXRfTmFtZV9JbmRleCIgdG8gIHJldHJpZXZlIHRoZQogICAgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBnbHlwaCBuYW1lLCB3aGVuIGZvdW5kIGluIGEgZmFjZS4KCiAgLSBBZGRlZCAgYSBuZXcgZnVuY3Rpb24gIG5hbWVkICJGVF9HZXRfUG9zdHNjcmlwdF9OYW1lIiAgdG8gcmV0cmlldmUKICAgIHRoZSAidW5pcXVlIiBQb3N0c2NyaXB0IGZvbnQgbmFtZSBvZiBhIGdpdmVuIGZhY2UuCgogIC0gQWRkZWQgICBhICAgbmV3ICAgcHVibGljICAgaGVhZGVyICBzaXplICAgbmFtZWQgICBGVF9TSVpFU19IICAgKG9yCiAgICA8ZnJlZXR5cGUvZnRzaXplcy5oPikgcHJvdmlkaW5nICBuZXcgRlRfU2l6ZS1tYW5hZ2VtZW50IGZ1bmN0aW9uczoKICAgIEZUX05ld19TaXplLCBGVF9BY3RpdmF0ZV9TaXplLCBGVF9Eb25lX1NpemUuCgogIC0gRml4ZWQgYSAgcmVhbGxvY2F0aW9uIGJ1ZyB0aGF0ICBnZW5lcmF0ZWQgYSBkYW5nbGluZyAgcG9pbnRlciAoYW5kCiAgICBwb3NzaWJseSAgICBtZW1vcnkgICAgbGVha3MpICAgIHdpdGggICAgUG9zdHNjcmlwdCAgICBmb250cyAgICAoaW4KICAgIHNyYy9wc2F1eC9wc29ianMuYykuCgogIC0gTWFueSBmaXhlcyBmb3IgMTYtYml0IGNvcnJlY3RuZXNzLgoKICAtIFJlbW92ZWQgbWFueSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBmcm9tIHRoZSBzb3VyY2VzLgoKICAtIEFkZGVkIGFuIEFtaWdhIGJ1aWxkIGRpcmVjdG9yeSBpbiAiYnVpbGRzL2FtaWdhIi4KCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC40IGFuZCAyLjAuMwoKICAtIEZpeGVkIGEgcmF0aGVyIGFubm95aW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluIDIuMC4zLiAgTmFtZWx5LAogICAgdGhlIGZvbnQgIHRyYW5zZm9ybWF0aW9uIHNldCB0aHJvdWdoICBGVF9TZXRfVHJhbnNmb3JtIHdhcyBhcHBsaWVkCiAgICB0d2ljZSB0byBhdXRvLWhpbnRlZCBnbHlwaHMsIHJlc3VsdGluZyBpbiBpbmNvcnJlY3RseSByb3RhdGVkIHRleHQKICAgIG91dHB1dC4KCiAgLSBGaXhlZCBfbWFueV8gIGNvbXBpbGVyIHdhcm5pbmdzLiAgIEZUMiBzaG91bGQgbm93ICBjb21waWxlIGNsZWFubHkKICAgIHdpdGggVmlzdWFsICBDKysncyBtb3N0IHBlZGFudGljIHdhcm5pbmcgbGV2ZWwgICgvVzQpLiAgSXQgYWxyZWFkeQogICAgY29tcGlsZWQgZmluZSB3aXRoIEdDQyBhbmQgYSBmZXcgb3RoZXIgY29tcGlsZXJzLgoKICAtIEZpeGVkIGEgYnVnICB0aGF0IHByZXZlbnRlZCB0aGUgbGluZWFyIGFkdmFuY2UgIHdpZHRoIG9mIGNvbXBvc2l0ZQogICAgVHJ1ZVR5cGUgZ2x5cGhzIHRvIGJlIGNvcnJlY3RseSByZXR1cm5lZC4KCiAgLSBGaXhlZCAgICB0aGUgICAgVmlzdWFsICAgIEMrKyAgICBwcm9qZWN0ICAgIGZpbGVzICAgIGxvY2F0ZWQgICAgaW4KICAgICJidWlsZHMvd2luMzIvdmlzdWFsYyIgKHByZXZpb3VzIHZlcnNpb25zICB1c2VkIG9sZGVyIG5hbWVzIG9mIHRoZQogICAgbGlicmFyeSkuCgogIC0gTWFueSAgMzItYml0IGNvbnN0YW50cyAgaGF2ZSBhbiAgIkwiIGFwcGVuZGVkICB0byB0aGVpciAgdmFsdWUsIGluCiAgICBvcmRlciB0byBpbXByb3ZlIHRoZSAxNi1iaXRuZXNzICBvZiB0aGUgY29kZS4gIFNvbWVvbmUgaXMgYWN0dWFsbHkKICAgIHRyeWluZyB0byB1c2UgRlQyIG9uIGFuIEF0YXJpIFNUIG1hY2hpbmUhCgogIC0gVXBkYXRlZCAgdGhlICAiYnVpbGRzL2RldGVjdC5tayIgZmlsZSAgaW4gIG9yZGVyIHRvICBhdXRvbWF0aWNhbGx5CiAgICBidWlsZCBGVDIgIG9uIEFJWCBzeXN0ZW1zLiAgIEFJWCB1c2VzICIvdXNyL3NiaW4vaW5pdCIgIGluc3RlYWQgb2YKICAgICIvc2Jpbi9pbml0IiBhbmQgd2Fzbid0IHByZXZpb3VzbHkgIGRldGVjdGVkIGFzIGEgVW5peCBwbGF0Zm9ybSBieQogICAgdGhlIEZyZWVUeXBlIGJ1aWxkIHN5c3RlbS4KCiAgLSBVcGRhdGVkICB0aGUgIFVuaXgtc3BlY2lmaWMgIHBvcnRpb25zICBvZiB0aGUgIGJ1aWxkICBzeXN0ZW0gIChuZXcKICAgIGxpYnRvb2wgdmVyc2lvbiwgZXRjLikuCgogIC0gVGhlICBTRk5UIGtlcm5pbmcgIGxvZGFlciBub3cgIGVuc3VyZXMgIHRoYXQgdGhlICB0YWJsZSBpcyAgc29ydGVkCiAgICAoc2luY2Ugc29tZSBwcm9ibGVtIGZvbnRzIGRvIG5vdCBtZWV0IHRoaXMgcmVxdWlyZW1lbnQpLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMQVRFU1QgQ0hBTkdFUyBCRVRXRUVOIDIuMC4zIGFuZCAyLjAuMgoKICBJLiBDSEFOR0VTIFRPIFRIRSBNT0RVTEVTIC8gRk9OVCBEUklWRVJTCgogICAgLSBUSEUgIEFVVE8tSElOVEVSIEhBUyAgQkVFTiBTTElHSFRMWSAgSU1QUk9WRUQsIGluICBvcmRlciAgdG8gZml4CiAgICAgIHNldmVyYWwgYW5ub3lpbmcgYXJ0ZWZhY3RzLCBtYWlubHk6CgogICAgICAgIC0gQmx1ZSAgem9uZSBhbGlnbmVtZW50IG9mICBob3Jpem9udGFsIHN0ZW1zICB3YXNuJ3QgcGVyZm9ybWVkCiAgICAgICAgICBjb3JyZWN0bHksIHJlc3VsdGluZyBpbiBhcnRlZmFjdHMgIGxpa2UgdGhlICJkIiBiZWluZyBwbGFjZWQKICAgICAgICAgIG9uZSBwaXhlbCBiZWxvdyB0aGUgImIiIGluIHNvbWUgZm9udHMgbGlrZSBUaW1lIE5ldyBSb21hbi4KCiAgICAgICAgLSBPdmVyc2hvb3QgdGhyZXNob2xkaW5nICB3YXNuJ3QgcGVyZm9ybWVkIGNvcnJlY3RseSwgY3JlYXRpbmcKICAgICAgICAgIHVucGxlYXNhbnQgYXJ0ZWZhY3RzIGF0IGxhcmdlIGNoYXJhY3RlciBwaXhlbCBzaXplcy4KCiAgICAgICAgLSBDb21wb3NpdGUgZ2x5cGggbG9hZGluZyBoYXMgIGJlZW4gc2ltcGxpZmllZC4gIFRoaXMgZ2V0cyByaWQKICAgICAgICAgIG9mICB2YXJpb3VzIGFydGVmYWN0cyAgd2hlcmUgdGhlICBjb21wb25lbnRzIG9mICBhIGNvbXBvc2l0ZQogICAgICAgICAgZ2x5cGhzIHdlcmUgbm90IGNvcnJlY3RseSBzcGFjZWQuCgogICAgICBUaGVzZSBhcmUgIHRoZSBsYXN0IGNoYW5nZXMgdG8gdGhlICBjdXJyZW50IGF1dG8taGludGluZyBtb2R1bGUuCiAgICAgIEEgbmV3ICBoaW50aW5nIHN1Yi1zeXN0ZW0gaXMgY3VycmVudGx5ICBpbiB0aGUgd29yayAgaW4gb3JkZXIgdG8KICAgICAgc3VwcG9ydCBuYXRpdmUgaGludHMgIGluIFR5cGUgMSAvIENGRiAvICBPcGVuVHlwZSBmb250cywgYXMgd2VsbAogICAgICBhcyBnbG9iYWxseSBpbXByb3ZlIHJlbmRlcmluZy4KCiAgICAtIFRoZSAgUENGICBkcml2ZXIgaGFzICBiZWVuICBmaXhlZC4gICBJdCAgcmVwb3J0ZWQgaW52YWxpZCAgZ2x5cGgKICAgICAgZGltZW5zaW9ucyBmb3IgdGhlIGZvbnRzIGF2YWlsYWJsZSBvbiBTb2xhcmlzLgoKICAgIC0gVGhlIFR5cGUgIDEsIENJRCBhbmQgQ0ZGICBkcml2ZXJzIGhhdmUgYmVlbiBtb2RpZmllZCAgdG8gZml4IHRoZQogICAgICBjb21wdXRhdGlvbiBvZiB0aGUgRU0gc2l6ZS4KCiAgICAtIFRoZSBUeXBlIDEgIGRyaXZlciBoYXMgYmVlbiBmaXhlZCB0byBhdm9pZCAgYSBkYW5nZXJvdXMgYnVnIHRoYXQKICAgICAgY3Jhc2hlZCB0aGUgbGlicmFyeSB3aXRoIG5vbi1jb25mb3JtaW5nIGZvbnRzIChpLmUuIG9uZXMgdGhhdCBkbwogICAgICBub3QgcGxhY2UgdGhlIC5ub3RkZWYgZ2x5cGggYXQgcG9zaXRpb24gMCkuCgogICAgLSBUaGUgVHJ1ZVR5cGUgIGRyaXZlciBoYWQgYSAgcmF0aGVyIHN1YnRsZSBidWcgIChkYW5nbGluZyBwb2ludGVyCiAgICAgIHdoZW4gbG9hZGluZyAgY29tcG9zaXRlIGdseXBocykgdGhhdCBjb3VsZCBjcmFzaCAgdGhlIGxpYnJhcnkgaW4KICAgICAgcmFyZSBvY2Nhc2lvbnMhCgoKICBJSS4gSElHSC1MRVZFTCBBUEkgQ0hBTkdFUwoKICAgIC0gVGhlIGVycm9yICBjb2RlIGVudW1lcmF0aW9uIHZhbHVlcyBoYXZlIGJlZW4gIGNoYW5nZWQuICBBbiBlcnJvcgogICAgICB2YWx1ZSAgaXMgZGVjb21wb3NlZCAgaW4gIGEgIGdlbmVyaWMgZXJyb3IgIGNvZGUsICBhbmQgYSAgbW9kdWxlCiAgICAgIG51bWJlci4gIHNlZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4gZm9yIGRldGFpbHMuCgogICAgLSBBICAgbmV3ICBwdWJsaWMgICBoZWFkZXIgICBmaWxlICBoYXMgICBiZWVuICBpbnRyb2R1Y2VkLCAgIG5hbWVkCiAgICAgIEZUX1RSSUdPTk9NRVRSWV9IICAgICAoaW5jbHVkZS9mcmVldHlwZS9mdHRyaWcuaCksICAgICBwcm92aWRpbmcKICAgICAgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgdG8gIGNvbXB1dGUgc2luZXMsIGNvc2luZXMsIGFyY3RhbmdlbnRzLAogICAgICBldGMuIHdpdGggMTYuMTYgZml4ZWQgcHJlY2lzaW9uLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uCiAgICAgIHRoZSBDT1JESUMgIGFsZ29yaXRobSBhbmQgaXMgdmVyeSBmYXN0ICB3aGlsZSBiZWluZyBzdWZmaWNpZW50bHkKICAgICAgYWNjdXJhdGUuCgoKICBJSUkuIElOVEVSTkFMUwoKICAgIC0gQWRkZWQgIEJlT1Mtc3BlY2lmaWMgZmlsZXMgIGluIHRoZSAgb2xkIGJ1aWxkICBzdWItc3lzdGVtLiAgTm90ZQogICAgICB0aGF0IG5vIGNoYW5nZXMgd2VyZSByZXF1aXJlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggSmFtLgoKICAgIC0gVGhlICBjb25maWd1cmF0aW9uICBpcyBub3cgIGNhcGFibGUgIG9mIGF1dG9tYXRpY2FsbHkgIGRldGVjdGluZwogICAgICA2NC1iaXQgaW50ZWdlcnMgIG9uIGEgc2V0ICBvZiBwcmVkZWZpbmVkIGNvbXBpbGVycyAgKEdDQywgVmlzdWFsCiAgICAgIEMrKywgQm9ybGFuZCBDKyspIGFuZCB3aWxsIHVzZSB0aGVtIGJ5IGRlZmF1bHQuICBUaGlzIHByb3ZpZGVzIGEKICAgICAgc21hbGwgcGVyZm9ybWFuY2UgYm9vc3QuCgogICAgLSBBICBzbWFsbCBtZW1vcnkgbGVhayAgdGhhdCBoYXBwZW5lZCAgd2hlbiBvcGVuaW5nICAwLXNpemVkIGZpbGVzCiAgICAgIChkdWghKSAgaGF2ZSBiZWVuIGZpeGVkLgoKICAgIC0gRml4ZWQgYmV6aWVyICBzdGFjayBkZXB0aCAgYnVnIGluIHRoZSAgcm91dGluZXMgcHJvdmlkZWQgIGJ5IHRoZQogICAgICBGVF9CQk9YX0ggIGhlYWRlciAgIGZpbGUuICAgQWxzbyAgZml4ZWQgIHNpbWlsYXIgICBidWdzICBpbiAgdGhlCiAgICAgIHJhc3Rlcml6ZXJzLgoKICAgIC0gVGhlIG91dGxpbmUgYm91bmRpbmcgIGJveCBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiAgdG8gdXNlIGRpcmVjdAogICAgICBjb21wdXRhdGlvbnMsICBpbnN0ZWFkIG9mICBiZXppZXIgc3ViLWRpdmlzaW9uLCAgdG8gIGNvbXB1dGUgdGhlCiAgICAgIGV4YWN0IGJvdW5kaW5nIGJveCBvZiBnbHlwaHMuICAgVGhpcyBpcyBzbGlnaHRseSBzbG93ZXIgYnV0IG1vcmUKICAgICAgYWNjdXJhdGUuCgogICAgLSBUaGUgYnVpbGQgc3lzdGVtIGhhcyBiZWVuICBpbXByb3ZlZCBhbmQgZml4ZWQsIG1haW5seSB0byBzdXBwb3J0CiAgICAgICJtYWtlIiAgb24gV2luZG93cyAgMjAwMCAgY29ycmVjdGx5LCBhdm9pZCAgcHJvYmxlbXMgd2l0aCAgIm1ha2UKICAgICAgZGlzdGNsZWFuIiBvbiBub24gVW5peCBzeXN0ZW1zLCBldGMuCgogICAgLSBIZXhhZGVjaW1hbCAgY29uc3RhbnRzICBoYXZlIGJlZW4gIHN1ZmZpeGVkICB3aXRoICAiVSIgdG8gIGF2b2lkCiAgICAgIHByb2JsZW1zIHdpdGggY2VydGFpbiBjb21waWxlcnMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCiAgICAtIEEgbmV3IGRpcmVjdG9yeSBuYW1lZCAic3JjL3Rvb2xzIiBoYXMgYmVlbiBjcmVhdGVkLiAgSXQgY29udGFpbnMKICAgICAgUHl0aG9uIHNjcmlwdHMgYW5kIHNpbXBsZSB1bml0IHRlc3QgcHJvZ3JhbXMgdXNlZCB0byBkZXZlbG9wIHRoZQogICAgICBsaWJyYXJ5LgoKICAgIC0gVGhlIERvY01ha2VyIHRvb2wgaGFzIGJlZW4gIG1vdmVkIGZyb20gImRvY3MiIHRvICJzcmMvdG9vbHMiIGFuZAogICAgICBoYXMgYmVlbiB1cGRhdGVkIHdpdGggdGhlIGZvbGxvd2luZzoKCiAgICAgICAgIC0gTm93IGFjY2VwdHMgdGhlICItLXRpdGxlPVhYWFgiIG9yICItdCBYWFhYIiBvcHRpb24gZnJvbSB0aGUKICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0IHRoZSBwcm9qZWN0J3MgbmFtZSBpbiB0aGUgZ2VuZXJhdGVkIEFQSQogICAgICAgICAgIHJlZmVyZW5jZS4KCiAgICAgICAgIC0gTm93IGFjY2VwdHMgdGhlICItLW91dHB1dD1ESVIiICBvciAiLW8gRElSIiBvcHRpb24gZnJvbSB0aGUKICAgICAgICAgICBjb21tYW5kIGxpbmUgdG8gc2V0ICB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYWxsIGdlbmVyYXRlZAogICAgICAgICAgIEhUTUwgZmlsZXMuCgogICAgICAgICAtIE5vdyBhY2NlcHRzIHRoZSAiLS1wcmVmaXg9WFhYWCIgb3IgIi1wIFhYWCIgb3B0aW9uIGZyb20gdGhlCiAgICAgICAgICAgY29tbWFuZCAgbGluZSAgdG8gIHNldCAgdGhlICBmaWxlIHByZWZpeCAgdG8gIHVzZSAgZm9yICBhbGwKICAgICAgICAgICBnZW5lcmF0ZWQgSFRNTCBmaWxlcy4KCiAgICAgICAgIC0gTm93IGdlbmVyYXRlcyB0aGUgY3VycmVudCAgdGltZS9kYXRhIG9uIGVhY2ggZ2VuZXJhdGVkIHBhZ2UKICAgICAgICAgICBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHZlcnNpb25zLgoKICAgICAgRG9jTWFrZXIgIGNhbiBiZSAgdXNlZCB3aXRoICBvdGhlciAgcHJvamVjdHMgbm93LCAgbm90IG9ubHkgIEZUMgogICAgICAoZS5nLiBNTGliLCBGVExheW91dCwgZXRjLikuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTEFURVNUIENIQU5HRVMgQkVUV0VFTiAyLjAuMiBhbmQgMi4wLjEKCiAgSS4gQ0hBTkdFUyBUTyBUSEUgTU9EVUxFUyAvIEZPTlQgRFJJVkVSUwoKICAgIC0gVEhFIFRSVUVUWVBFIEJZVEVDT0RFIElOVEVSUFJFVEVSIElTIE5PVyBUVVJORUQgT0ZGLCBpbiBvcmRlciB0bwogICAgICBhdm9pZCBsZWdhbCBwcm9ibGVtcyAgd2l0aCB0aGUgQXBwbGUgcGF0ZW50cy4gIEl0ICBzZWVtcyB0aGF0IHdlCiAgICAgIG1pc3Rha2VubHkgIHR1cm5lZCB0aGlzIG9wdGlvbiAgb24gaW4gIHByZXZpb3VzIHJlbGVhc2VzICBvZiB0aGUKICAgICAgYnVpbGQuCgogICAgICBOb3RlIHRoYXQgaWYgIHlvdSB3YW50IHRvIHVzZSB0aGUgIGJ5dGVjb2RlIGludGVycHJldGVyIGluIG9yZGVyCiAgICAgIHRvIGdldCBoaWdoLXF1YWxpdHkgVHJ1ZVR5cGUgIHJlbmRlcmluZywgeW91IHdpbGwgbmVlZCB0byB0b2dnbGUKICAgICAgYnkgICAgICAgIGhhbmQgICAgICAgIHRoZSAgICAgICAgZGVmaW5pdGlvbiAgICAgICAgb2YgICAgICAgIHRoZQogICAgICBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICAgbWFjcm8gICAgaW4gICB0aGUgICBmaWxlCiAgICAgICJpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIi4KCiAgICAtIFRoZSBDRkYgZHJpdmVyIGhhcyBiZWVuIGltcHJvdmVkIGJ5IFRvbSBLYWN2aW5za3kgYW5kIFNhbmRlciB2YW4KICAgICAgZGVyIFdhbDoKCiAgICAgICogU3VwcG9ydCBmb3IgInNlYWMiIGVtdWxhdGlvbi4KICAgICAgKiBTdXBwb3J0IGZvciAiZG90c2VjdGlvbiIuCiAgICAgICogU3VwcG9ydCBmb3IgcmV0cmlldmluZyBnbHlwaCBuYW1lcyB0aHJvdWdoCiAgICAgICAgIkZUX0dldF9HbHlwaF9OYW1lIi4KCiAgICAgIFRoZSBmaXJzdCB0d28gaXRlbXMgYXJlIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgYSBsYXJnZSBudW1iZXIgb2YKICAgICAgVHlwZSAxIGZvbnRzIGNvbnZlcnRlZCB0byB0aGUgQ0ZGIGZvcm1hdHMgYnkgQWRvYmUgQWNyb2JhdC4KCiAgICAtIFRoZSBUeXBlIDEgZHJpdmVyIHdhcyBhbHNvIGltcHJvdmVkIGJ5IFRvbSAmIG90aGVyczoKCiAgICAgICogQmV0dGVyIEVNIHNpemUgY29tcHV0YXRpb24uCiAgICAgICogQmV0dGVyIHN1cHBvcnQgZm9yIHN5bnRoZXRpYyAodHJhbnNmb3JtZWQpIGZvbnRzLgogICAgICAqIFRoZSAgVHlwZSAxICBkcml2ZXIgcmV0dXJucyAgdGhlIGNoYXJzdHJpbmdzICBjb3JyZXNwb25kaW5nIHRvCiAgICAgICAgZWFjaCBnbHlwaCBpbiB0aGUgICJnbHlwaC0+Y29udHJvbF9kYXRhIiBmaWVsZCBhZnRlciBhIGNhbGwgdG8KICAgICAgICAiRlRfTG9hZF9HbHlwaCIgKHRoYW5rcyBIYSBTaGFvKS4KCiAgICAtIFZhcmlvdXMgb3RoZXIgYnVnZml4ZXMsIGluY2x1ZGluZyB0aGUgZm9sbG93aW5nOgoKICAgICAgKiBGaXhlZCBhIG5hc3R5IG1lbW9yeSBsZWFrIGluIHRoZSBUeXBlIDEgZHJpdmVyLgogICAgICAqIFRoZSBhdXRvaGludGVyICBhbmQgdGhlIHBjZiAgZHJpdmVyIHVzZWQgc3RhdGljICB3cml0YWJsZSBkYXRhCiAgICAgICAgd2hlbiB0aGV5IHNob3VsZG4ndC4KICAgICAgKiBNYW55IGNhc3RzIHdlcmUgYWRkZWQgdG8gIG1ha2UgdGhlIGNvZGUgbW9yZSA2NC1iaXRzIHNhZmUuICBJdAogICAgICAgIGFsc28gbm93IGNvbXBpbGVzIG9uIFdpbmRvd3MgWFAgNjQtYml0cyB3aXRob3V0IHdhcm5pbmdzLgogICAgICAqIFNvbWUgaW5jb3JyZWN0IHdyaXRhYmxlIHN0YXRpY3Mgd2VyZSByZW1vdmVkIGluIHRoZSAiYXV0b2hpbnQiCiAgICAgICAgYW5kICJwY2YiIGRyaXZlcnMuICBGcmVlVHlwZSAyIG5vdyBjb21waWxlcyBvbiBFcG9jIGFnYWluLgoKCiAgSUkuIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCgogICAgLSBUaGUgbGlicmFyeSBoZWFkZXIgZmlsZXMgaW5jbHVzaW9uIHNjaGVtZSBoYXMgYmVlbiBjaGFuZ2VkLiAgVGhlCiAgICAgIG9sZCBzY2hlbWUgbG9va2VkIGxpa2U6CgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY2FjaGUvZnRpbWFnZS5oPgoKICAgICAgTm93IHlvdSBzaG91bGQgdXNlOgoKICAgICAgICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICAgICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICiAgICAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSAogICAgICAgICNpbmNsdWRlIEZUX0NBQ0hFX0gKICAgICAgICAjaW5jbHVkZSBGVF9DQUNIRV9JTUFHRV9ICgogICAgICBOT1RFIFRIQVQgIFRIRSBPTEQgIElOQ0xVU0lPTiBTQ0hFTUUgV0lMTCAgU1RJTEwgV09SSyAgV0lUSCBUSElTCiAgICAgIFJFTEVBU0UuICBIT1dFVkVSLCBXRSAgRE8gTk9UIEdVQVJBTlRFRSBUSEFUIFRISVMgIFdJTEwgU1RJTEwgQkUKICAgICAgVFJVRSBJTiBUSEUgTkVYVCBPTkUgKEEuSy5BLiBGUkVFVFlQRSAyLjEpLgoKICAgICAgVGhlICBmaWxlIDxmdDJidWlsZC5oPiAgaXMgdXNlZCAgdG8gZGVmaW5lICB0aGUgIGhlYWRlciBmaWxlbmFtZQogICAgICBtYWNyb3MuICBUaGUgY29tcGxldGUgYW5kICBjb21tZW50ZWQgbGlzdCBvZiBtYWNyb3MgaXMgYXZhaWxhYmxlCiAgICAgIGluIHRoZSBBUEkgcmVmZXJlbmNlIHVuZGVyIHRoZSBzZWN0aW9uIG5hbWUgIkhlYWRlciBGaWxlIE1hY3JvcyIKICAgICAgaW4gQ2hhcHRlciBJLgoKICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBzZWN0aW9uIEkgb2YgdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKCiAgICAgICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvCiAgICAgICAgICBmcmVldHlwZTIvZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCgogICAgICBvcgoKICAgICAgICBodHRwOi8vZnJlZXR5cGUuc291cmNlZm9yZ2UubmV0LwogICAgICAgICAgZnJlZXR5cGUyL2RvY3MvdHV0b3JpYWwvc3RlcDEuaHRtbAoKICAgIC0gTWFueSwgbWFueSBjb21tZW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHB1YmxpYyBzb3VyY2UgZmlsZSBpbgogICAgICBvcmRlciB0byAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSAgdGhlIEFQSSBSZWZlcmVuY2UgIHRocm91Z2ggdGhlCiAgICAgICJkb2NtYWtlci5weSIgUHl0aG9uIHNjcmlwdC4KCiAgICAgIFRoZSBsYXR0ZXIgaGFzIGJlZW4gdXBkYXRlZCAgdG8gc3VwcG9ydCB0aGUgZ3JvdXBpbmcgb2Ygc2VjdGlvbnMKICAgICAgaW4gY2hhcHRlcnMgYW5kIGJldHRlciBpbmRleCBzb3J0LiAgU2VlOgoKICAgICAgICBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9yZWZlcmVuY2UvZnQyLXRvYy5odG1sCgoKICBJSUkuIENIQU5HRVMgVE8gVEhFIEJVSUxEIFBST0NFU1MKCiAgICAtIElmIHlvdSAgYXJlIG5vdCAgYnVpbGRpbmcgRnJlZVR5cGUgMiAgd2l0aCBpdHMgb3duICBidWlsZCBzeXN0ZW0KICAgICAgKGJ1dCB3aXRoIHlvdXIgb3duIE1ha2VmaWxlcyBvciBwcm9qZWN0IGZpbGVzKSwgeW91IHdpbGwgbmVlZCB0bwogICAgICBiZSAgYXdhcmUgdGhhdCAgdGhlICBidWlsZCAgcHJvY2VzcyBoYXMgIGNoYW5nZWQgIGEgbGl0dGxlICBiaXQuCgogICAgICBZb3UgZG9uJ3QgIG5lZWQgdG8gcHV0IHRoZSAgInNyYyIgZGlyZWN0b3J5IGluICB0aGUgaW5jbHVkZSBwYXRoCiAgICAgIHdoZW4gIGNvbXBpbGluZyAgYW55IEZUMiAgY29tcG9uZW50LiAgIEluc3RlYWQsICBzaW1wbHkgcHV0ICB0aGUKICAgICAgY29tcG9uZW50J3MgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IGluY2x1ZGUgcGF0aC4KCiAgICAgIFNvLCBpZiB5b3Ugd2VyZSBkb2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgY2MgLWMgLUlpbmNsdWRlIC1Jc3JjIHNyYy9iYXNlL2Z0YmFzZS5jCgogICAgICBjaGFuZ2UgdGhlIGxpbmUgdG86CgogICAgICAgIGNjIC1jIC1JaW5jbHVkZSAtSXNyYy9iYXNlIHNyYy9iYXNlL2Z0YmFzZS5jCgogICAgICBJZiB5b3Ugd2VyZSBkb2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgY2Qgc3JjL2Jhc2UKICAgICAgICBjYyAtYyAtSS4uLy4uL2luY2x1ZGUgLUkuLiBmdGJhc2UuYwoKICAgICAgY2hhbmdlIGl0IHRvOgoKICAgICAgICBjZCBzcmMvYmFzZQogICAgICAgIGNjIC1jIC1JLi4vLi4vaW5jbHVkZSBmdGJhc2UuYwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkxBVEVTVCBDSEFOR0VTIEJFVFdFRU4gMi4wLjEgYW5kIDIuMAoKICAyLjAuMSBpbnRyb2R1Y2VzIGEgZmV3IGNoYW5nZXM6CgogICAgLSBGaXhlZCBtYW55IGJ1Z3MgcmVsYXRlZCB0byAgdGhlIHN1cHBvcnQgb2YgQ0ZGIC8gT3BlblR5cGUgZm9udHMuCiAgICAgIFRoZXNlICBmb3JtYXRzIGFyZSAgbm93IG11Y2ggIGJldHRlciBzdXBwb3J0ZWQgIHRob3VnaCAgdGhlcmUgaXMKICAgICAgc3RpbGwgd29yayBwbGFubmVkIHRvICBkZWFsIHdpdGggY2hhcnNldCB0YWJsZXMgYW5kIFBERi1lbWJlZGRlZAogICAgICBDRkYgZmlsZXMgdGhhdCB1c2UgdGhlIG9sZCAic2VhYyIgY29tbWFuZC4KCiAgICAtIFRoZSAgbGlicmFyeSBjb3VsZCBub3QgIGJlIGNvbXBpbGVkICBpbiBkZWJ1ZyAgbW9kZSB3aXRoICBhIHZlcnkKICAgICAgc21hbGwgIG51bWJlciAgIG9mICBDICBjb21waWxlcnMgICB3aG9zZSAgcHJlLXByb2Nlc3NvcnMgIGRpZG4ndAogICAgICBpbXBsZW1lbnQgdGhlICIjIyIgIGRpcmVjdGl2ZSBjb3JyZWN0bHkgKGkuZS4gcGVyIHNlICB0aGUgQU5TSSBDCiAgICAgIHNwZWNpZmljYXRpb24hKSAgQW4gZWxlZ2FudCBmaXggd2FzIGZvdW5kLgoKICAgIC0gQWRkZWQgIHN1cHBvcnQgZm9yICB0aGUgIGZyZWUgQm9ybGFuZCAgY29tbWFuZC1saW5lIEMrKyAgQnVpbGRlcgogICAgICBjb21waWxlci4gICBVc2UgIm1ha2UgIHNldHVwIGJjYzMyIi4gICBBbHNvIGZpeGVkICBhICBmZXcgc291cmNlCiAgICAgIGxpbmVzIHRoYXQgZ2VuZXJhdGVkIG5ldyB3YXJuaW5ncyB3aXRoIEJDQzMyLgoKICAgIC0gRml4ZWQgYSBidWcgaW4gRlRfT3V0bGluZV9HZXRfQkJveCB3aGVuIGNvbXB1dGluZyB0aGUgZXh0cmVtYSBvZgogICAgICBhIGNvbmljIEJlemllciBhcmMuCgogICAgLSBVcGRhdGVkIHRoZSBJTlNUQUxMIGZpbGUgdG8gYWRkIElERSBjb21waWxhdGlvbi4KCiAgICAtIE90aGVyICBtaW5vciBidWcgIGZpeGVzLCAgZnJvbSAgaW52YWxpZCBUeXBlICAxICBzdHlsZSBmbGFncyAgdG8KICAgICAgY29ycmVjdCAgIHN1cHBvcnQgICBvZiAgc3ludGhldGljICAgKG9ibGlxdWVkKSAgIGZvbnRzICBpbiAgIHRoZQogICAgICBhdXRvLWhpbnRlciwgYmV0dGVyIHN1cHBvcnQgZm9yIGVtYmVkZGVkIGJpdG1hcHMgaW4gYSBTRk5UIGZvbnQuCgogICAgLSBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggImZyZWV0eXBlLWNvbmZpZyIuCgogIEZpbmFsbHksIHRoZSAic3RhbmRhcmQiIHNjaGVtZSBmb3IgaW5jbHVkaW5nIEZyZWVUeXBlIGhlYWRlcnMgaXMgbm93CiAgZ3JhZHVhbGx5IGNoYW5naW5nLCAgYnV0IHRoaXMgd2lsbCAgYmUgZXhwbGFpbmVkIGluIGEgIGxhdGVyIHJlbGVhc2UKICAocHJvYmFibHkgMi4wLjIpLgoKICBBbmQgdmVyeSAgc3BlY2lhbCB0aGFua3MgdG8gVG9tIEthY3ZpbnNreSAgYW5kIFlBTUFOTy1VQ0hJIEhpZGV0b3NoaQogIGZvciB0aGVpciBjb250cmlidXRpb25zIQoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNIQU5HRVMgQkVUV0VFTiBiZXRhOCBhbmQgMi4wCgogIC0gQ2hhbmdlZCAgdGhlIGRlZmF1bHQgIGluc3RhbGxhdGlvbiAgcGF0aCBmb3IgIHB1YmxpYyBoZWFkZXJzICBmcm9tCiAgICAiaW5jbHVkZS9mcmVldHlwZSIgdG8gImluY2x1ZGUvZnJlZXR5cGUyIi4KCiAgICBBbHNvIGFkZGVkIGEgbmV3ICJmcmVldHlwZS1jb25maWciIHRoYXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgIGFuZCBpbnN0YWxsZWQgIG9uIFVuaXggYW5kICBDeWd3aW4gc3lzdGVtcy4gIFRoZSBzY3JpcHQgIGl0c2VsZiBpcwogICAgdXNlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCAgaW5zdGFsbCBwYXRoLCBDIGNvbXBpbGF0aW9uIGZsYWdzIGFzCiAgICB3ZWxsIGFzIGxpbmtlciBmbGFncy4KCiAgLSBGaXhlZCBzZXZlcmFsIHNtYWxsIGJ1Z3M6CgogICAgKiBJbmNvcnJlY3QgbWF4IGFkdmFuY2Ugd2lkdGggZm9yIGZpeGVkLXBpdGNoIFR5cGUgMSBmb250cy4KICAgICogSW5jb3JyZWN0IGdseXBoIG5hbWVzIGZvciBjZXJ0YWluIFRydWVUeXBlIGZvbnRzLgogICAgKiBUaGUgIGdseXBoIGFkdmFuY2UgIHdhcyBub3QgIGNvcGllZCB3aGVuICBGVF9HbHlwaF9Ub19CaXRtYXAgd2FzCiAgICAgIGNhbGxlZC4KICAgICogVGhlICBsaW5lYXJIb3JpQWR2YW5jZSAgYW5kICBsaW5lclZlcnRBZHZhbmNlICBmaWVsZHMgIHdlcmUgIG5vdAogICAgICBjb3JyZWN0bHkgcmV0dXJuZWQgZm9yIGdseXBocyBwcm9jZXNzZWQgYnkgdGhlIGF1dG8taGludGVyLgogICAgKiAidHlwZTF6IiAgcmVuYW1lZCBiYWNrIHRvICAidHlwZTEiOyB0aGUgIG9sZCAidHlwZTEiICBtb2R1bGUgaGFzCiAgICAgIGJlZW4gcmVtb3ZlZC4KCiAgLSBSZXZhbXBlZCB0aGUgIGJ1aWxkIHN5c3RlbSAgdG8gbWFrZSBpdCAgYSBsb3QgbW9yZSAgZ2VuZXJpYy4gIFRoaXMKICAgIHdpbGwgIGFsbG93IHVzICB0byAgcmUtdXNlICBuZWFybHkgdW4tbW9kaWZpZWQgIGluICBsb3RzIG9mICBvdGhlcgogICAgcHJvamVjdHMgKGluY2x1ZGluZyBGcmVlVHlwZSBMYXlvdXQpLgoKICAtIENoYW5nZWQgImNpZCIgdG8gdXNlICJwc2F1eCIgdG9vLgoKICAtIEFkZGVkIHRoZSAgY2FjaGUgc3ViLXN5c3RlbS4gIFNlZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPiAgYXMgd2VsbCBhcwogICAgdGhlIHNvdXJjZXMgIGluICJzcmMvY2FjaGUiLiAgTm90ZSAgdGhhdCBpdCBjb21waWxlcyBidXQgIGlzIHN0aWxsCiAgICB1bnRlc3RlZCBmb3Igbm93LgoKICAtIFVwZGF0ZWQgImRvY3MvZG9jbWFrZXIucHkiLCBhIGRyYWZ0ICBBUEkgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZSBhdAogICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnQyYXBpLmh0bWwuCgogIC0gQ2hhbmdlZCAidHlwZTEiIHRvIHVzZSAicHNhdXgiLgoKICAtIENyZWF0ZWQgYSAgbmV3IG1vZHVsZSBuYW1lZCAgInBzYXV4IiB0byBob2xkICB0aGUgVHlwZSAxICYgIFR5cGUgMgogICAgcGFyc2luZyByb3V0aW5lcy4gIEl0IHNob3VsZCBiZSAgdXNlZCBieSAidHlwZTEiLCAiY2lkIiwgYW5kICJjZmYiCiAgICBpbiB0aGUgZnV0dXJlLgoKICAtIEZpeGVkIGFuIGltcG9ydGFudCBidWcgaW4gIkZUX0dseXBoX0dldF9DQm94Ii4KCiAgLSBGaXhlZCAgc29tZSBjb21waWxlciAgd2FybmluZ3MgIHRoYXQgaGFwcGVuZWQgIHNpbmNlIHRoZSAgVHJ1ZVR5cGUKICAgIGJ5dGVjb2RlIGRlY29kZXIgd2FzIGRlYWN0aXZhdGVkIGJ5IGRlZmF1bHQuCgogIC0gRml4ZWQgdHdvIG1lbW9yeSBsZWFrczoKCiAgICAqIFRoZSAgICBtZW1vcnkgICBtYW5hZ2VyICAgKDE2ICAgIGJ5dGVzKSAgIGlzbid0ICAgIHJlbGVhc2VkICAgaW4KICAgICAgRlRfRG9uZV9GcmVlVHlwZSEKICAgICogVXNpbmcgY3VzdG9tIGlucHV0IHN0cmVhbXMsIHRoZSAgY29weSBvZiB0aGUgb3JpZ2luYWwgc3RyZWFtIHdhcwogICAgICBuZXZlciByZWxlYXNlZC4KCiAgLSBGaXhlZCB0aGUgIGF1dG8taGludGVyIGJ5IHBlcmZvcm1pbmcgYXV0b21hdGljICBjb21wdXRhdGlvbiBvZiB0aGUKICAgICJmaWxsaW5nIGRpcmVjdGlvbiIgb2YgZWFjaCBnbHlwaC4gICBUaGlzIGlzIGRvbmUgdGhyb3VnaCBhIHNpbXBsZQogICAgYW5kICBmYXN0IGFwcHJveGltYXRpb24sIGFuZCAgc2VlbXMgdG8gIHdvcmsgKHByb2JsZW1zICBzcG90dGVkIGJ5CiAgICBXZXJuZXIgdGhvdWdoKS4gIFRoZSBBcnBoaWMgZm9udHMgYXJlIGEgbG90IG5pY2VyIHRob3VnaCB0aGVyZSBhcmUKICAgIHN0aWxsIGEgbG90IG9mIHRoaW5ncyB0byBkbyB0byBoYW5kbGUgQXNpYW4gZm9udHMgY29ycmVjdGx5LgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkJFVEEtOCAoUkVMRUFTRSBDQU5ESURBVEUpIENIQU5HRVMKCiAgLSBEZWFjdGl2YXRlZCB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgYnkgZGVmYXVsdC4KCiAgLSBEZWFjdGl2YXRlZCB0aGUgInNyYy90eXBlMSIgZm9udCBkcml2ZXIuICBOb3cgInNyYy90eXBlMXoiIGlzIHVzZWQKICAgIGJ5IGRlZmF1bHQuCgogIC0gVXBkYXRlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgV2Ugbm93IGNvbXBpbGUgdGhlIGxpYnJhcnkgY29ycmVjdGx5CiAgICB1bmRlciAgVW5peCAgc3lzdGVtICB0aHJvdWdoICAiY29uZmlndXJlIiB3aGljaCAgaXMgIGF1dG9tYXRpY2FsbHkKICAgIGNhbGxlZCBvbiB0aGUgZmlyc3QgIm1ha2UiIGludm9jYXRpb24uCgogIC0gQWRkZWQgdGhlIGF1dG8taGludGluZyBtb2R1bGUhICBGaXhpbmcgc29tZSBidWdzIGhlcmUgYW5kIHRoZXJlLgoKICAtIEZvdW5kIHNvbWUgYnVncyBpbiB0aGUgIGNvbXBvc2l0ZSBsb2FkZXIgKHNlYWMpIG9mIHRoZSBUeXBlMS1iYXNlZAogICAgZm9udCBkcml2ZXJzLgoKICAtIFJlbmFtZWQgdGhlIGRpcmVjdG9yeSAiZnJlZXR5cGUyL2NvbmZpZyIgdG8gImZyZWV0eXBlMi9idWlsZHMiIGFuZAogICAgdXBkYXRlZCBhbGwgcmVsZXZhbnQgZmlsZXMuCgogIC0gRm91bmQgYSBtZW1vcnkgbGVhayBpbiB0aGUgInR5cGUxIiBkcml2ZXIuCgogIC0gSW5jb3Jwb3JhdGVkIFRvbSdzIHBhdGNoZXMgdG8gIHN1cHBvcnQgZmxleCBvcGVyYXRvcnMgY29ycmVjdGx5IGluCiAgICBPcGVuVHlwZS9DRkYgZm9udHMuICBOb3cgYWxsIEkgbmVlZCBpcyB0byBzdXBwb3J0IHB1cmUgQ0ZGIGFuZCBDRUYKICAgIGZvbnRzIHRvIGJlIGRvbmUgd2l0aCB0aGlzIGRyaXZlciA6LSkKCiAgLSBBZGRlZCB0aGUgIFdpbmRvd3MgRk5UL0ZPTiBkcml2ZXIgaW4gInNyYy93aW5mb250cyIuICAgRm9yIG5vdywgaXQKICAgIGFsd2F5cyAgInNpbXVsYXRlcyIgICBhICBVbmljb2RlICBjaGFybWFwLCAgc28gICBpdCAgc2hvdWxkbid0ICBiZQogICAgY29uc2lkZXJlZCBjb21wbGV0ZWQgcmlnaHQgbm93LgoKICAgIEl0ICBpcyB0aGVyZSAgdG8gYmUgIG1vcmUgYSAgcHJvb2Ygb2YgIGNvbmNlcHQgdGhhbiAgYW55dGhpbmcgZWxzZQogICAgYW55d2F5LiAgVGhlIGRyaXZlciBpcyBhIHNpbmdsZSAgQyBzb3VyY2UgZmlsZSwgdGhhdCBjb21waWxlcyB0byAzCiAgICBLYiBvZiBjb2RlLgoKICAgIEknbSAgc3RpbGwgd29ya2luZyBvbiAgdGhlIFBDRi9CREYgIGRyaXZlcnMsIGJ1dCAgSSdtIHRvbyAgbGF6eSB0bwogICAgZmluaXNoIHRoZW0gbm93LgoKICAtIENIQU5HRVMgVE8gVEhFIEhJR0gtTEVWRUwgQVBJCgogICAgKiBGVF9HZXRfS2VybmluZyBoYXMgYSBuZXcgcGFyYW1ldGVyIHRoYXQgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlCiAgICAgIGNvb3JkaW5hdGVzIG9mIHRoZSBrZXJuaW5nICB2ZWN0b3IgKGZvbnQgdW5pdHMsIHNjYWxlZCwgc2NhbGVkICsKICAgICAgZ3JpZC1maXR0ZWQpLgogICAgKiBUaGUgIG91dGxpbmUgZnVuY3Rpb25zIGFyZSAgbm93IGluIDxmcmVldHlwZS9mdG91dGxuLmg+ICBhbmQgbm90CiAgICAgIHBhcnQgb2YgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+IGFueW1vcmUuCiAgICAqIDxmcmVldHlwZS9mdG1vZHVsZS5oPiAgICBub3cgICAgIGNvbnRhaW5zICAgIGRlY2xhcmF0aW9ucyAgICBmb3IKICAgICAgIEZUX05ld19MaWJyYXJ5LCBGVF9Eb25lX0xpYnJhcnksIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMuCiAgICAqIFRoZSBzby1jYWxsZWQgY29udmVuaWVuY2UgIGZ1bmN0aW9ucyBoYXZlIG1vdmVkIGZyb20gImZ0b3V0bG4uYyIKICAgICAgdG8gICJmdGdseXBoLmMiLCAgYW5kICBhcmUgIHRodXMgYXZhaWxhYmxlICB3aXRoICB0aGlzICBvcHRpb25hbAogICAgICBjb21wb25lbnQgICAgb2YgICB0aGUgICBsaWJyYXJ5LiAgICAgVGhleSAgIGFyZSAgICBkZWNsYXJlZCAgIGluCiAgICAgIDxmcmVldHlwZS9mdGdseXBoLmg+IG5vdy4KICAgICogQW50aS1hbGlhc2VkICByZW5kZXJpbmcgaXMgbm93ICB0aGUgZGVmYXVsdCAgZm9yIEZUX1JlbmRlcl9HbHlwaAogICAgICAoaS5lLiBjb3JyZXNwb25kcyB0byByZW5kZXJfbW9kZSA9PSAwID09IGZ0X3JlbmRlcl9tb2RlX25vcm1hbCkuCiAgICAgIFRvIGdlbmVyYXRlIGEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzZSBmdF9yZW5kZXJfbW9kZV9tb25vLCBvciB0aGUKICAgICAgRlRfTE9BRF9NT05PQ0hST01FICAgICBmbGFnICAgIGluICAgIEZUX0xvYWRfR2x5cGgvRlRfTG9hZF9DaGFyLgogICAgICBGVF9MT0FEX0FOVElfQUxJQVMgaXMgc3RpbGwgZGVmaW5lZCwgYnV0IHZhbHVlcyB0byAwLgogICAgKiA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4gIG5vdyBpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRjb25maWcuaD4sCiAgICAgIHNvbHZpbmcgYSBmZXcgaGVhZGFjaGVzIDotKQogICAgKiBUaGUgdHlwZSBGVF9HbHlwaFNsb3RSZWMgaGFzIG5vdyBhICJsaWJyYXJ5IiBmaWVsZC4KCiAgLSBDSEFOR0VTIFRPIFRIRSAiZnRnbHlwaC5oIiBBUEkKCiAgICBUaGlzIEFQSSBoYXMgIGJlZW4gc2V2ZXJlbHkgbW9kaWZpZWQgaW4gb3JkZXIgIHRvIG1ha2UgaXQgc2ltcGxlciwKICAgIGNsZWFyZXIsIGFuZCBtb3JlICBlZmZpY2llbnQuICBJdCBjZXJ0YWlubHkgbm93IGxvb2tzICBsaWtlIGEgcmVhbAogICAgImdseXBoIGZhY3RvcnkiICBvYmplY3QsIGFuZCBhbGxvd3MgY2xpZW50ICBhcHBsaWNhdGlvbnMgdG8gbWFuYWdlCiAgICAoaS5lLiAgdHJhbnNmb3JtLCAgYmJveCAgYW5kICByZW5kZXIpIGdseXBoICBpbWFnZXMgIHdpdGhvdXQgIGV2ZXIKICAgIGtub3dpbmcgdGhlaXIgb3JpZ2luYWwgZm9ybWF0LgoKICAtIEFkZGVkICBzdXBwb3J0ICBmb3IgQ0lELWtleWVkICBmb250cyAgdG8gIHRoZSAgQ0ZGIGRyaXZlci4gICBNYXliZQogICAgc3VwcG9ydCBmb3IgcHVyZSBDRkYgKyBDRUYgZm9udHMgc2hvdWxkIGNvbWUgaW4/CgogIC0gQ2xlYW5lZCB1cCAgc291cmNlIGNvZGUgaW4gb3JkZXIgIHRvIGF2b2lkIHR3byAgZnVuY3Rpb25zIHdpdGggdGhlCiAgICBzYW1lIG5hbWUuICBBbHNvICBjaGFuZ2VkIHRoZSBuYW1lcyBvZiB0aGUgIGZpbGVzIGluICJ0eXBlMXoiIGZyb20KICAgICJ0MVhYWFgiIHRvICJ6MVhYWFgiIGluIG9yZGVyIHRvIGF2b2lkIGFueSBjb25mbGljdHMuCgogICAgIm1ha2UgbXVsdGkiIG5vdyB3b3JrcyB3ZWxsIDotKQoKICAgIEFsc28gcmVtb3ZlZCB0aGUgdXNlIG9mICJjaWRhZm0iIGZvciBub3csIGV2ZW4gaWYgdGhlIHNvdXJjZSBmaWxlcwogICAgYXJlICBzdGlsbCB0aGVyZS4gIFRoaXMgIGZ1bmN0aW9uYWxpdHkgd2lsbCAgY2VydGFpbmx5ICBnbyBpbnRvICBhCiAgICBzcGVjaWZpYyBtb2R1bGUuCgogIC0gQURERUQgU1VQUE9SVCBGT1IgVEhFIEFVVE8tSElOVEVSCgogICAgSXQgIHdvcmtzIDotKSBJICBoYXZlIGEgIGRlbW8gcHJvZ3JhbSAgd2hpY2ggc2ltcGx5ICBpcyBhICBjb3B5IG9mCiAgICAiZnR2aWV3IiAgICAgICB0aGF0ICAgICAgZG9lcyAgICAgICBhICAgICAgYEZUX0FkZF9Nb2R1bGUobGlicmFyeSwKICAgICZhdXRvaGludGVyX21vZHVsZV9jbGFzcyknIGFmdGVyICBsaWJyYXJ5IGluaXRpYWxpemF0aW9uLCBhbmQgVHlwZQogICAgMSAmIE9wZW5UeXBlL0NGRiBmb250cyBhcmUgbm93IGhpbnRlZC4KCiAgICBDSUQgIGZvbnRzIGFyZSAgbm90IGhpbnRlZCwgIGFzIHRoZXkgIGluY2x1ZGUgbm8gIGNoYXJtYXAgIGFuZCB0aGUKICAgIGF1dG8taGludGVyIGRvZXNuJ3QgaW5jbHVkZSAgImdlbmVyaWMiIGdsb2JhbCBtZXRyaWNzIGNvbXB1dGF0aW9ucwogICAgeWV0LgoKICAgIE5vdywgSSBuZWVkIHRvIHJlbGVhc2UgdGhpcyB0aGluZyB0byB0aGUgRnJlZVR5cGUgMiBzb3VyY2UuCgogIC0gQ0hBTkdFUyBUTyBUSEUgUkVOREVSRVIgTU9EVUxFUwoKICAgIFRoZSAgbW9ub2Nocm9tZSAgYW5kIHNtb290aCAgcmVuZGVyZXJzICBhcmUgIG5vdyAgaW4gdHdvICBkaXN0aW5jdAogICAgZGlyZWN0b3JpZXMsIG5hbWVseSAic3JjL3Jhc3RlcjEiIGFuZCAic3JjL3Ntb290aCIuICBOb3RlIHRoYXQgdGhlCiAgICBvbGQgInNyYy9yZW5kZXJlciIgaXMgbm93IGdvbmUuCgogICAgSSBkaXRjaGVkICB0aGUgNS1ncmF5LWxldmVscyByZW5kZXJlcnMuICBCYXNpY2FsbHksICBpdCBpbnZvbHZlZCBhCiAgICBzaW1wbGUgI2RlZmluZSB0b2dnbGUgaW4gJ3NyYy9yYXN0ZXIxL2Z0cmFzdGVyLmMnLgoKICAgIEZUX1JlbmRlcl9HbHlwaCwgIEZUX091dGxpbmVfUmVuZGVyICAmICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgIG5vdwogICAgc2VsZWN0IHRoZSBiZXN0IHJlbmRlcmVyICBhdmFpbGFibGUsIGRlcGVuZGluZyBvbiByZW5kZXIgbW9kZS4gIElmCiAgICB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSAgZ2l2ZW4gZ2x5cGggaW1hZ2UgZm9ybWF0IGlzbid0IGNhcGFibGUKICAgIG9mIHN1cHBvcnRpbmcgIHRoZSByZW5kZXIgbW9kZSwgYW5vdGhlciAgb25lIHdpbGwgYmUgIGZvdW5kIGluIHRoZQogICAgbGlicmFyeSdzIGxpc3QuICAgVGhpcyBtZWFucyB0aGF0IGNsaWVudCBhcHBsaWNhdGlvbnMgIGRvIG5vdCBuZWVkCiAgICB0byAgc3dpdGNoIG9yICBzZXQgIHRoZSAgcmVuZGVyZXJzIHRoZW1zZWx2ZXMgIChhcyAgaW4gdGhlICBsYXRlc3QKICAgIGNoYW5nZSksIHRoZXknbGwgZ2V0IHdoYXQgdGhleSB3YW50IGF1dG9tYXRpY2FsbHkuICBBdCBsYXN0LgoKICAgIENoYW5nZWQgdGhlIGRlbW8gcHJvZ3JhbXMgYWNjb3JkaW5nbHkuCgogIC0gTUFKT1IgSU5URVJOQUwgUkVERVNJR046CgogICAgQSBsb3Qgb2YgaW50ZXJuYWwgbW9kaWZpY2F0aW9ucyAgaGF2ZSBiZWVuIHBlcmZvcm1lZCBsYXRlbHkgb24gdGhlCiAgICBzb3VyY2UgaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGVuaGFuY2VtZW50czoKCiAgICAqIE1vcmUgZ2VuZXJpYyBtb2R1bGUgc3VwcG9ydDoKCiAgICAgIFRoZSBGVF9Nb2R1bGUgIHR5cGUgaXMgIG5vdyBkZWZpbmVkIHRvICByZXByZXNlbnQgYSBoYW5kbGUgIHRvIGEKICAgICAgZ2l2ZW4gIG1vZHVsZS4gICBUaGUgIGZpbGUgIDxmcmVldHlwZS9mdG1vZHVsZS5oPiAgY29udGFpbnMgIHRoZQogICAgICBGVF9Nb2R1bGVfQ2xhc3MgZGVmaW5pdGlvbiwgYXMgd2VsbCBhcyB0aGUgbW9kdWxlLWxvYWRpbmcgcHVibGljCiAgICAgIEFQSS4KCiAgICAgIFRoZSAgRlRfRHJpdmVyIHR5cGUgIGlzIHN0aWxsICBkZWZpbmVkLCBhbmQgIHN0aWxsICByZXByZXNlbnRzIGEKICAgICAgcG9pbnRlciB0byAgYSBmb250IGRyaXZlci4gIE5vdGUgdGhhdCAgRlRfQWRkX0RyaXZlciBpcyByZXBsYWNlZAogICAgICBieSBGVF9BZGRfTW9kdWxlLCBGVF9HZXRfRHJpdmVyIGJ5IEZUX0dldF9Nb2R1bGUsIGV0Yy4KCiAgICAqIFN1cHBvcnQgZm9yIGdlbmVyaWMgZ2x5cGggaW1hZ2UgdHlwZXM6CgogICAgICBUaGUgRlRfUmVuZGVyZXIgIHR5cGUgaXMgYSBwb2ludGVyICB0byBhIG1vZHVsZSAgdXNlZCB0byBwZXJmb3JtCiAgICAgIHZhcmlvdXMgb3BlcmF0aW9ucyBvbiBnbHlwaCBpbWFnZS4KCiAgICAgIEVhY2ggcmVuZGVyZXIgaXMgIGNhcGFibGUgb2YgaGFuZGxpbmcgaW1hZ2VzIGluICBhIHNpbmdsZSBmb3JtYXQKICAgICAgKGUuZy4gZnRfZ2x5cGhfZm9ybWF0X291dGxpbmUpLiAgSXRzIGZ1bmN0aW9ucyBhcmUgdXNlZCB0bzoKCiAgICAgIC0gdHJhbnNmb3JtIGFuIGdseXBoIGltYWdlCiAgICAgIC0gcmVuZGVyIGEgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcAogICAgICAtIHJldHVybiB0aGUgY29udHJvbCBib3ggKGRpbWVuc2lvbnMpIG9mIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UKCiAgICAgIFRoZSBzY2FuIGNvbnZlcnRlcnMgImZ0cmFzdGVyLmMiIGFuZCAiZnRncmF5cy5jIiBoYXZlIGJlZW4gbW92ZWQKICAgICAgdG8gdGhlIG5ldyBkaXJlY3RvcnkgInNyYy9yZW5kZXJlciIsIGFuZCBhcmUgdXNlZCB0byBwcm92aWRlIHR3bwogICAgICBkZWZhdWx0IHJlbmRlcmVyIG1vZHVsZXMuCgogICAgICBPbmUgY29ycmVzcG9uZHMgIHRvIHRoZSAic3RhbmRhcmQiIHNjYW4tY29udmVydGVyLCAgdGhlIG90aGVyIHRvCiAgICAgIHRoZSAic21vb3RoIiBvbmUuCgogICAgICBoZSAgY3VycmVudCAgcmVuZGVyZXIgIGNhbiAgYmUgIHNldCAgdGhyb3VnaCAgdGhlICBuZXcgIGZ1bmN0aW9uCiAgICAgIEZUX1NldF9SZW5kZXJlci4KCiAgICAgIFRoZSBvbGQgcmFzdGVyLXJlbGF0ZWQgZnVuY3Rpb24gRlRfU2V0X1Jhc3RlciwgRlRfR2V0X1Jhc3RlciBhbmQKICAgICAgRlRfU2V0X1Jhc3Rlcl9Nb2RlIGhhdmUgbm93IGRpc2FwcGVhcmVkLCBpbiBmYXZvciBvZiB0aGUgbmV3OgoKICAgICAgICBGVF9HZXRfUmVuZGVyZXIKICAgICAgICBGVF9TZXRfUmVuZGVyZXIKCiAgICAgIFNlZSB0aGUgZmlsZSA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4gZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgIFRoZXNlICBjaGFuZ2VzICB3ZXJlICBuZWNlc3NhcnkgIHRvIHByb3Blcmx5ICBzdXBwb3J0ICBkaWZmZXJlbnQKICAgICAgc2NhbGFibGUgZm9ybWF0cyBpbiB0aGUgZnV0dXJlLCBsaWtlIGJpLWNvbG9yIGdseXBocywgZXRjLgoKICAgICogR2x5cGggbG9hZGVyIG9iamVjdDoKCiAgICAgIEEgIG5ldyAgaW50ZXJuYWwgIG9iamVjdCwgIGNhbGxlZCAgYSAgJ2dseXBoICBsb2FkZXInICBoYXMgIGJlZW4KICAgICAgaW50cm9kdWNlZCBpbiB0aGUgYmFzZSBsYXllci4gIEl0IGlzIHVzZWQgYnkgYWxsIHNjYWxhYmxlIGZvcm1hdAogICAgICBmb250IGRyaXZlcnMgdG8gbG9hZCBnbHlwaHMgYW5kIGNvbXBvc2l0ZXMuCgogICAgICBUaGlzIG9iamVjdCAgaGFzIGJlZW4gIGNyZWF0ZWQgdG8gcmVkdWNlICB0aGUgY29kZSBzaXplICBvZiBlYWNoCiAgICAgIGRyaXZlciwgIGFzICBlYWNoICBvbmUgIG9mICB0aGVtICBiYXNpY2FsbHkgIHJlLWltcGxlbWVudGVkICBpdHMKICAgICAgZnVuY3Rpb25hbGl0eS4KCiAgICAgIFNlZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+IGFuZCB0aGUgRlRfR2x5cGhMb2FkZXIgdHlwZSBmb3IKICAgICAgbW9yZSBpbmZvcm1hdGlvbi4KCiAgICAqIEZUX0dseXBoU2xvdCBoYXMgbmV3IGZpZWxkczoKCiAgICAgIEluICBvcmRlciAgIHRvICBzdXBwb3J0ICBleHRlbmRlZCAgZmVhdHVyZXMgICAoc2VlICBiZWxvdyksICB0aGUKICAgICAgRlRfR2x5cGhTbG90IHN0cnVjdHVyZSBoYXMgYSBmZXcgbmV3IGZpZWxkczoKCiAgICAgIGxpbmVhckhvcmlBZHZhbmNlOgoKICAgICAgICBUaGlzICBmaWVsZCAgZ2l2ZXMgIHRoZSAgIGxpbmVhcmx5ICBzY2FsZWQgIChpLmUuICBzY2FsZWQgIGJ1dAogICAgICAgIHVuaGludGVkKSBhZHZhbmNlICB3aWR0aCBmb3IgdGhlICBnbHlwaCwgZXhwcmVzc2VkIGFzICBhIDE2LjE2CiAgICAgICAgZml4ZWQgcGl4ZWwgdmFsdWUuICBUaGlzIGlzIHVzZWZ1bCB0byBwZXJmb3JtIFdZU0lXWUcgdGV4dC4KCiAgICAgIGxpbmVhclZlcnRBZHZhbmNlOgogICAgICAgIFRoaXMgZmllbGQgIGdpdmVzIHRoZSBsaW5lYXJseSAgc2NhbGVkIGFkdmFuY2UgaGVpZ2h0ICBmb3IgdGhlCiAgICAgICAgZ2x5cGggIChyZWxldmFudCBpbiAgdmVydGljYWwgIGdseXBoIGxheW91dHMgIG9ubHkpLiAgVGhpcyAgaXMKICAgICAgICB1c2VmdWwgdG8gcGVyZm9ybSBXWVNJV1lHIHRleHQuCgogICAgICAgIE5vdGUgdGhhdCAgdGhlIHR3byBhYm92ZSBmaWVsZCByZXBsYWNlICB0aGUgcmVtb3ZlZCAibWV0cmljczIiCiAgICAgICAgZmllbGQgaW4gdGhlIGdseXBoIHNsb3QuCgogICAgICBhZHZhbmNlOgogICAgICAgIFRoaXMgZmllbGQgaXMgYSB2ZWN0b3IgIHRoYXQgZ2l2ZXMgdGhlIHRyYW5zZm9ybWVkIGFkdmFuY2UgZm9yCiAgICAgICAgdGhlIGdseXBoLiAgIEJ5IGRlZmF1bHQsIGl0IGNvcnJlc3BvbmRzIHRvICB0aGUgYWR2YW5jZSB3aWR0aCwKICAgICAgICB1bmxlc3MgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICB3YXMgIHNwZWNpZmllZCAgd2hlbiAgY2FsbGluZwogICAgICAgIEZUX0xvYWRfR2x5cGggb3IgRlRfTG9hZF9DaGFyLgoKICAgICAgYml0bWFwX2xlZnQ6CiAgICAgICAgVGhpcyAgZmllbGQgZ2l2ZXMgIHRoZSAgZGlzdGFuY2UgaW4gIGludGVnZXIgIHBpeGVscyBmcm9tICB0aGUKICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbiAgdG8gdGhlIGxlZnQtbW9zdCBwaXhlbCBvZiAgYSBnbHlwaCBpbWFnZQogICAgICAgIElGIElUIElTICBBIEJJVE1BUC4gIEl0IGlzIG9ubHkgdmFsaWQgIHdoZW4gdGhlICJmb3JtYXQiIGZpZWxkCiAgICAgICAgaXMgc2V0IHRvICJmdF9nbHlwaF9mb3JtYXRfYml0bWFwIiwgZm9yIGV4YW1wbGUsIGFmdGVyIGNhbGxpbmcKICAgICAgICB0aGUgbmV3IGZ1bmN0aW9uIEZUX1JlbmRlcl9HbHlwaC4KCiAgICAgIGJpdG1hcF90b3A6CiAgICAgICAgVGhpcyAgZmllbGQgZ2l2ZXMgIHRoZSAgZGlzdGFuY2UgaW4gIGludGVnZXIgIHBpeGVscyBmcm9tICB0aGUKICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbiAobG9jYXRlZCBvbiB0aGUgYmFzZWxpbmUpIHRvIHRoZSB0b3AtbW9zdAogICAgICAgIHBpeGVsIG9mIHRoZSAgZ2x5cGggaW1hZ2UgSUYgSVQgSVMgIEEgQklUTUFQLiAgUG9zaXRpdmUgdmFsdWVzCiAgICAgICAgY29ycmVzcG9uZCB0byB1cHdhcmRzIFkuCgogICAgICBsb2FkZXI6CiAgICAgICAgVGhpcyAgaXMgYSAgbmV3ICBwcml2YXRlICBmaWVsZCBmb3IgIHRoZSAgZ2x5cGggc2xvdC4gICBDbGllbnQKICAgICAgICBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCB0b3VjaCBpdC4KCgogICAgKiBTdXBwb3J0IGZvciB0cmFuc2Zvcm1zIGFuZCBkaXJlY3QgcmVuZGVyaW5nIGluIEZUX0xvYWRfR2x5cGg6CgogICAgICBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGZvdW5kIGluIDxmcmVldHlwZS9mdGdseXBoLmg+IGhhcyBiZWVuCiAgICAgIG1vdmVkIHRvIHRoZSBjb3JlIGxpYnJhcnkuICBIZW5jZSwgdGhlIGZvbGxvd2luZzoKCiAgICAgIC0gQSAgIHRyYW5zZm9ybSAgIGNhbiAgIGJlICAgc3BlY2lmaWVkICBmb3IgICBhICAgZmFjZSAgIHRocm91Z2gKICAgICAgICBGVF9TZXRfVHJhbnNmb3JtLiAgdGhpcyB0cmFuc2Zvcm0gIGlzIGFwcGxpZWQgYnkgRlRfTG9hZF9HbHlwaAogICAgICAgIHRvICBzY2FsYWJsZSBnbHlwaCAgaW1hZ2VzIChpLmUuICBOT1QgVE8gIEJJVE1BUFMpICBiZWZvcmUgdGhlCiAgICAgICAgZnVuY3Rpb24gcmV0dXJucywgdW5sZXNzIHRoZSBiaXQgZmxhZyBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0KICAgICAgICB3YXMgc2V0IGluIHRoZSBsb2FkIGZsYWdzLgoKICAgICAgLSBPbmNlICBhICBnbHlwaCBpbWFnZSAgaGFzICBiZWVuICBsb2FkZWQsICBpdCBjYW4gIGJlICBkaXJlY3RseQogICAgICAgIGNvbnZlcnRlZCAgdG8gIGEgIGJpdG1hcCAgYnkgIHVzaW5nICB0aGUgIG5ldyAgRlRfUmVuZGVyX0dseXBoCiAgICAgICAgZnVuY3Rpb24uICBOb3RlIHRoYXQgdGhpcyAgZnVuY3Rpb24gdGFrZXMgdGhlIGdseXBoIGltYWdlIGZyb20KICAgICAgICB0aGUgZ2x5cGggc2xvdCwgIGFuZCBjb252ZXJ0cyBpdCB0byBhICBiaXRtYXAgd2hvc2UgcHJvcGVydGllcwogICAgICAgIGFyZSByZXR1cm5lZCAgaW4gImZhY2UuZ2x5cGguYml0bWFwIiwgImZhY2UuZ2x5cGguYml0bWFwX2xlZnQiCiAgICAgICAgYW5kICJmYWNlLmdseXBoLmJpdG1hcF90b3AiLiAgVGhlICBvcmlnaW5hbCBuYXRpdmUgaW1hZ2UgbWlnaHQKICAgICAgICBiZSBsb3N0IGFmdGVyIHRoZSBjb252ZXJzaW9uLgoKICAgICAgLSBXaGVuIHVzaW5nIHRoZSBuZXcgIGJpdCBmbGFnIEZUX0xPQURfUkVOREVSLCB0aGUgRlRfTG9hZF9HbHlwaAogICAgICAgIGFuZCAgIEZUX0xvYWRfQ2hhciAgIGZ1bmN0aW9ucyAgIHdpbGwgICBjYWxsICAgRlRfUmVuZGVyX0dseXBoCiAgICAgICAgYXV0b21hdGljYWxseSB3aGVuIG5lZWRlZC4KCiAgLSBSZWZvcm1hdHRlZCBhbGwgIG1vZHVsZXMgc291cmNlICBjb2RlIGluIG9yZGVyICB0byBnZXQgcmlkICBvZiB0aGUKICAgIGJhc2ljIGRhdGEgdHlwZXMgcmVkaWZpbml0aW9ucyAoaS5lLiAiVFRfSW50IiBpbnN0ZWFkIG9mICJGVF9JbnQiLAogICAgIlQxX0ZpeGVkIiAgaW5zdGVhZCAgb2YgICJGVF9GaXhlZCIpLiAgSGVuY2UgIHRoZSAgZm9ybWF0LXNwZWNpZmljCiAgICBwcmVmaXhlcyBsaWtlICAiVFRfIiwgIlQxXyIsICAiVDJfIiBhbmQgIkNJRF8iICBhcmUgb25seSAgdXNlZCBmb3IKICAgIHJlbGV2YW50IHN0cnVjdHVyZXMuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgRk9SIEJFVEEgNwoKICAtIGJ1Zy1maXhlZCB0aGUgIE9wZW5UeXBlL0NGRiBwYXJzZXIuICBJdCAgbm93IGxvYWRzIGFuZCBkaXNwbGF5cyBteQogICAgdHdvICBmb250cyBuaWNlbHksICBidXQgSSdtICBwcmV0dHkgY2VydGFpbiAgdGhhdCBtb3JlICB0ZXN0aW5nIGlzCiAgICBuZWVkZWQgOi0pCgogIC0gZml4ZWQgdGhlIGNydW1teSBUeXBlIDEgaGludGVyLCBpdCBub3cgaGFuZGxlcyBhY2NlbnRlZCBjaGFyYWN0ZXJzCiAgICBjb3JyZWN0bHkgKHdlbGwsIHRoZSBhY2NlbnQgaXMgIG5vdCBhbHdheXMgd2VsbCBwbGFjZWQsIGJ1dCB0aGF0J3MKICAgIGFub3RoZXIgcHJvYmxlbS4uKQoKICAtIGFkZGVkIHRoZSBDSUQta2V5ZWQgVHlwZSAxIGRyaXZlciBpbiAic3JjL2NpZCIuICBXb3JrcyBwcmV0dHkgd2VsbAogICAgZm9yIG9ubHkgMTMgS2Igb2YgY29kZSAgOy0pIERvZXNuJ3QgcmVhZCBBRk0gZmlsZXMgdGhvdWdoLCBub3IgdGhlCiAgICByZWFsbHkgdXNlZnVsIENNQVAgZmlsZXMuLgoKICAtIGZpeGVkICB0d28gIGJ1Z3MgIGluICB0aGUgIHNtb290aCAgcmVuZGVyZXIgIChzcmMvYmFzZS9mdGdyYXlzLmMpLgogICAgVGhhbmtzIHRvIEJvcmlzIExldG9jaGEgZm9yIHNwb3R0aW5nIHRoZW0gYW5kIHByb3ZpZGluZyBhIGZpeC4KCiAgLSBmaXhlZCBwb3RlbnRpYWwgImRpdmlkZSBieSB6ZXJvIiBidWdzIGluIGZ0Y2FsYy5jLgoKICAtIGFkZGVkIHNvdXJjZSAgY29kZSBmb3IgIHRoZSBPcGVuVHlwZS9DRkYgZHJpdmVyICAoc3RpbGwgaW5jb21wbGV0ZQogICAgdGhvdWdoLi4pCgogIC0gbW9kaWZpZWQgdGhlICBTRk5UIGRyaXZlciBzbGlnaHRseSAgdG8gcGVyZm9ybSBtb3JlICByb2J1c3QgaGVhZGVyCiAgICBjaGVja3MgIGluIFRUX0xvYWRfU0ZOVF9IZWFkZXIuICBUaGlzIHByZXZlbnRzIGNlcnRhaW4gIGZvbnQgZmlsZXMKICAgIChlLmcuICBzb21lICBUeXBlICAxICBNdWx0aXBsZSAgTWFzdGVycykgIGZyb20gIGJlaW5nICBpbmNvcnJlY3RseQogICAgInJlY29nbml6ZWQiIGFzIFRydWVUeXBlIGZvbnQgZmlsZXMuLgoKICAtIG1vdmVkIGEgbG90IG9mIHN0dWZmIGZyb20gIHRoZSBUcnVlVHlwZSBkcml2ZXIgdG8gdGhlIFNGTlQgbW9kdWxlLAogICAgdGhpcyAgIGFsbG93cyAgIGdyZWF0ZXIgICBjb2RlICAgcmUtdXNlICAgYmV0d2VlbiAgIGZvbnQgICBkcml2ZXJzCiAgICAoZS5nLiBUcnVlVHlwZSwgT3BlblR5cGUsIENvbXBhY3QtVHJ1ZVR5cGUsIGV0Yy4uKQoKICAtIGFkZGVkIGEgdGlueSBzZWdtZW50IGNhY2hlIHRvIHRoZSBTRk5UIENoYXJtYXAgNCBkZWNvZGVyLCBpbiBvcmRlcgogICAgdG8gbWluaW1hbGx5IHNwZWVkIGl0IHVwLi4KCiAgLSBhZGRlZCAgc3VwcG9ydCBmb3IgIE11bHRpcGxlIE1hc3RlciAgZm9udHMgaW4gICJ0eXBlMXoiLiAgVGhlcmUgaXMKICAgIGFsc28gYSBuZXcgZmlsZSBuYW1lZCA8ZnJlZXR5cGUvZnRtbS5oPiB3aGljaCBkZWZpbmVzIGZ1bmN0aW9ucyB0bwogICAgbWFuYWdlIHRoZW0gZnJvbSBjbGllbnQgYXBwbGljYXRpb25zLgoKICAgIFRoZSBuZXcgZmlsZSAic3JjL2Jhc2UvZnRtbS5jIiBpcyBhbHNvIG9wdGlvbmFsIHRvIHRoZSBlbmdpbmUuLgoKICAtIHZhcmlvdXMgIGZvcm1hdHRpbmcgY2hhbmdlcyAoZS5nLiAgRVhQT1JUX0RFRiAtPiAgRlRfRVhQT1JUX0RFRikgKwogICAgc21hbGwgYnVnIGZpeGVzIGluIEZUX0xvYWRfR2x5cGgsIHRoZSAidHlwZTEiIGRyaXZlciwgZXRjLi4KCiAgLSBhIG1pbm9yIGZpeCB0byB0aGUgVHlwZSAxIGRyaXZlciB0byBsZXQgdGhlbSBhcHBseSB0aGUgZm9udCBtYXRyaXgKICAgIGNvcnJlY3RseSAodXNlZCBmb3IgbWFueSBvYmxpcXVlIGZvbnRzLi4pCgogIC0gc29tZSBmaXhlcyBmb3IgNjQtYml0IHN5c3RlbXMgKG1haW5seSBjaGFuZ2luZyBzb21lIEZUX1RSQUNFIGNhbGxzCiAgICB0byB1c2UgJXAgaW5zdGVhZCBvZiAlbHgpLiAgVGhhbmtzIHRvIEthcmwgUm9iaWxsYXJkLgoKICAtIGZpeGVkICBzb21lIGJ1Z3MgIGluICB0aGUgc2JpdCAgbG9hZGVyIChzcmMvYmFzZS9zZm50L3R0c2JpdC5jKSAgKwogICAgYWRkZWQgIGEgbmV3IGZsYWcsICBGVF9MT0FEX0NST1BfQklUTUFQIHRvICBxdWVyeSB0aGF0ICBiaXRtYXBzIGJlCiAgICBjcm9wcGVkIHdoZW4gIGxvYWRlZCBmcm9tIGEgZmlsZSAgKG1heWJlIEkgc2hvdWxkICBtb3ZlIHRoZSBiaXRtYXAKICAgIGNyb3BwZXIgdG8gdGhlIGJhc2UgbGF5ZXIgPz8pLgoKICAtIGNoYW5nZWQgdGhlIGRlZmF1bHQgIG51bWJlciBvZiBncmF5IGxldmVscyBvZiAgdGhlIHNtb290aCByZW5kZXJlcgogICAgdG8gMjU2ICAoaW5zdGVhZCBvZiAgdGhlIHByZXZpb3VzIDEyOCkuICBPZiBjb3Vyc2UsIHRoZSAgaHVtYW4gZXllCiAgICBjYW4ndCBzZWUgYW55IGRpZmZlcmVuY2UgOy0pCgogIC0gcmVtb3ZlZCBUVF9NQVhfU1VCR0xZUEhTLCAgdGhlcmUgaXMgbm8gc3RhdGljIGxpbWl0ICBvbiB0aGUgbnVtYmVyCiAgICBvZiBzdWJnbHlwaHMgaW4gYSBUcnVlVHlwZSBmb250IG5vdy4uCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgMTYgTWF5IDIwMDAKCiAgLSB0YWdnZWQgIkJFVEEtNiIgIGluIHRoZSAgQ1ZTIHRyZWUuICBUaGlzIG9uZSBpcyBhICBzZXJpb3VzIHJlbGVhc2UKICAgIGNhbmRpZGF0ZSBldmVuIHRob3VnaCBpdCBkb2Vzbid0IGluY29ycG9yYXRlIHRoZSBhdXRvLWhpbnRlciB5ZXQuLgoKICAtIHZhcmlvdXMgb2Jzb2xldGUgZmlsZXMgd2VyZSByZW1vdmVkLCBhbmQgY29weXJpZ2h0IGhlYWRlciB1cGRhdGVkCgogIC0gZmluYWxseSAgdXBkYXRlZCAgdGhlICBzdGFuZGFyZCAgIHJhc3RlciAgdG8gIGZpeCAgdGhlICBtb25vY2hyb21lCiAgICByZW5kZXJpbmcgYnVnICsgcmUtZW5hYmxlICBzdXBwb3J0IGZvciA1LWdyYXkgbGV2ZWxzIGFudGktYWxpYXNpbmcKICAgIChzdWNrLCBzdWNrLi4pCgogIC0gY3JlYXRlZCBuZXcgaGVhZGVyIGZpbGVzLCBhbmQgbW9kaWZpZWQgc291cmNlcyBhY2NvcmRpbmdseToKCiAgICAgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KICAgICAgIC0gc2ltcGxlIEZyZWVUeXBlIHR5cGVzLCB3aXRob3V0IHRoZSBBUEkKICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KICAgICAgIC0gZGVmaW5pdGlvbiBvZiBtZW1vcnktbWFuYWdlbWVudCBtYWNyb3MKCiAgLSBhZGRlZCAgIHRoZSAgICJEU0lHIiAgIChPcGVuVHlwZSAgIERpZ2l0YWwgICBTaWduYXR1cmUpICAgdGFnICAgdG8KICAgIDxmcmVldHlwZS90dHRhZ3MuaD4KCiAgLSBsaWdodCB1cGRhdGUvY2xlYW5pbmcgb2YgdGhlIGJ1aWxkIHN5c3RlbSArIGNoYW5nZXMgdG8gdGhlIHNvdXJjZXMKICAgIGluICBvcmRlciAgdG8gIGdldCAgcmlkICBvZiBfYWxsXyAgY29tcGlsZXIgIHdhcm5pbmdzICB3aXRoICB0aHJlZQogICAgY29tcGlsZXJzLCBpLmU6CgogICAgZ2NjIHdpdGggIi1hbnNpIC1wZWRhbnRpYyAtV2FsbCAtVyIsIFZpc3VhbCBDKysgd2l0aCAiL1czIC9XWCIgYW5kCiAgICBMQ0MKCiAgICBJTVBPUlRBTlQgTk9URSBGT1IgV0lOMzItTENDIFVTRVJTOgogICAgfAogICAgfCAgSXQgc2VlbXMgdGhlIEMgcHJlLXByb2Nlc3NvciAgdGhhdCBjb21lcyB3aXRoIExDQyBpcyBicm9rZW4sIGl0CiAgICB8ICBkb2Vzbid0ICByZWNvZ25pemUgIHRoZSAgQU5TSSAgc3RhbmRhcmQgIGRpcmVjdGl2ZXMgICMgIGFuZCAgIyMKICAgIHwgIGNvcnJlY3RseSAgIHdoZW4gIG9uZSAgb2YgICB0aGUgIGFyZ3VtZW50ICBpcyAgYSAgbWFjcm8uICBBbHNvLAogICAgfCAgc29tZXRoaW5nIGxpa2U6CiAgICB8CiAgICB8ICAgICAjZGVmaW5lIEYoeCkgIHByaW50IyN4CiAgICB8CiAgICB8ICAgICBGKCgiaGVsbG8iKSkKICAgIHwKICAgIHwgIHdpbGwgZ2V0IGluY29ycmVjdGx5IHRyYW5zbGF0ZWQgdG86CiAgICB8CiAgICB8ICAgICBwcmludCAiaGVsbG8iKQogICAgfAogICAgfCAgYnkgaXRzIHByZS1wcm9jZXNzb3IuICBGb3IgdGhpcyByZWFzb24sIHlvdSBzaW1wbHkgY2Fubm90IGJ1aWxkCiAgICB8ICBGcmVlVHlwZSAyIGluIGRlYnVnIG1vZGUgd2l0aCB0aGlzIGNvbXBpbGVyLi4KCiAgLSB5ZXQgIGFub3RoZXIgbWFzc2l2ZSBncnVudCB3b3JrLiAgSSd2ZSAgY2hhbmdlZCB0aGUgIGRlZmluaXRpb24gb2YKICAgIHRoZSBFWFBPUlRfREVGLCAgRVhQT1JUX0ZVTkMsIEJBU0VfREVGICYgIEJBU0VfRlVOQyBtYWNyb3MuICBUaGVzZQogICAgbm93IHRha2UgYW4gYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSB0eXBlLgoKICAgIFRoaXMgIGlzIG5lY2Vzc2FyeSB0byAgY29tcGlsZSBGcmVlVHlwZSAgYXMgYSAgRExMIG9uICBXaW5kb3dzIGFuZAogICAgT1MvMi4gIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIgdXNlZCwgYSBjb21waWxlci1zcGVjaWZpYyBrZXl3b3JkCiAgICBsaWtlICBfX2V4cG9ydCBvciBfX3N5c3RlbSAgbXVzdCBiZSAgcGxhY2VkIGJlZm9yZSAgKFZpc3VhbEMrKykgb3IKICAgIGFmdGVyIChCb3JsYW5kQysrKSB0aGUgdHlwZS4uCgogICAgT2YgY291cnNlLCB0aGlzIG5lZWRlZCBhIGxvdCBvZiBjaGFuZ2VzIHRocm91Z2hvdXQgdGhlIHNvdXJjZSBjb2RlCiAgICB0byBtYWtlIGl0IGNvbXBpbGUgYWdhaW4uLi4gIEFsbCBjbGVhbmVkIHVwIG5vdywgYXBwYXJlbnRseS4uCgogICAgTm90ZSBhbHNvICB0aGF0IHRoZXJlIGlzIGEgIG5ldyBFWFBPUlRfVkFSIG1hY3JvICBkZWZpbmVkIHRvIGFsbG93CiAgICB0aGUgICBfZGVjbGFyYXRpb25fICAgIG9mICAgYW4gICBleHBvcnRhYmxlICAgIHB1YmxpYyAgIChjb25zdGFudCkKICAgIHZhcmlhYmxlLiAgVGhpcyAgaXMgIHRoZSAgIGNhc2UgIG9mICB0aGUgIHJhc3RlciAgaW50ZXJmYWNlcyAgKHNlZQogICAgZnRyYXN0ZXIuaCBhbmQgZnRncmF5cy5oKSwgYXMgd2VsbCBhcyBlYWNoIG1vZHVsZSdzIGludGVyZmFjZSAoc2VlCiAgICBzZmRyaXZlci5oLCBwc2RyaXZlci5oLCBldGMuLikKCiAgLSBuZXcgZmVhdHVyZTogaXQgIGlzIG5vdyBwb3NzaWJsZSB0byBwYXNzICBleHRyYSBwYXJhbWV0ZXJzIHRvIGZvbnQKICAgICAgICAgICAgICAgICBkcml2ZXJzICB3aGVuIGNyZWF0aW5nICBhIG5ldyAgZmFjZSBvYmplY3QuICBGb3Igbm93LAogICAgICAgICAgICAgICAgIHRoaXMgY2FwYWJpbGl0eSBpcyB1bnVzZWQuICBJdCBjb3VsZCBob3dldmVyIHByb3ZlIHRvCiAgICAgICAgICAgICAgICAgYmUgdXNlZnVsIGluIGEgbmVhciBmdXR1cmUuLgoKICAgICAgdGhlIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUgd2FzICBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBpbnRlcm5hbAogICAgICBkcml2ZXIgaW50ZXJmYWNlICAodGhlIHNwZWNpZmljICJpbml0X2ZhY2UiICBtb2R1bGUgZnVuY3Rpb24gaGFzCiAgICAgIG5vdyBhIGRpZmZlcmVudCBzaWduYXR1cmUpLgoKICAtIHVwZGF0ZWQgdGhlIHR1dG9yaWFsIChub3QgZmluaXNoZWQgdGhvdWdoKS4KCiAgLSB1cGRhdGVkIHRoZSB0b3AtbGV2ZWwgQlVJTEQgIGRvY3VtZW50CgogIC0gZml4ZWQgIGEgIHBvdGVudGlhbCBtZW1vcnkgIGxlYWsgIHRoYXQgIGNvdWxkICBvY2N1ciB3aGVuICBsb2FkaW5nCiAgICBlbWJlZGRlZCBiaXRtYXBzLgoKICAtIGFkZGVkICAgICB0aGUgICAgIGRlY2xhcmF0aW9uICAgICBvZiAgICAgRlRfTmV3X01lbW9yeV9GYWNlICAgICBpbgogICAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+LCBhcyAgaXQgd2FzICBtaXNzaW5nIGZyb20gdGhlICBwdWJsaWMgaGVhZGVyCiAgICAodGhlIGltcGxlbWVudGF0aW9uIHdhcyBhbHJlYWR5IGluICJmdG9ianMuYyIpLgoKICAtIHRoZSBmaWxlIDxmcmVldHlwZS9mdGVycm9ycy5oPiBoYXMgYmVlbiBzZXJpb3VzbHkgdXBkYXRlZCBpbiBvcmRlcgogICAgdG8gYWxsb3cgIHRoZSBhdXRvbWF0aWMgZ2VuZXJhdGlvbiAgb2YgZXJyb3IgbWVzc2FnZSB0YWJsZXMuICAgU2VlCiAgICB0aGUgY29tbWVudHMgd2l0aGluIGl0IGZvciBtb3JlIGluZm9ybWF0aW9uLgoKICAtIG1ham9yIGRpcmVjdG9yeSAgaGllcmFyY2h5IHJlLW9yZ2FuaXNhdGlvbi4gIFRoaXMgd2FzIGRvbmUgZm9yIHR3bwogICAgdGhpbmdzOgoKICAgICAgKiBmaXJzdCwgIHRvIGVhc2UgIHRoZSAibWFudWFsIiAgY29tcGlsYXRpb24gb2YgIHRoZSAgbGlicmFyeSBieQogICAgICAgIHJlcXVpcmluZyBhdCBsb3QgbGVzcyBpbmNsdWRlIHBhdGhzIDotKQoKICAgICAgKiBzZWNvbmQsICB0byAgYWxsb3cgIGV4dGVybmFsICBwcm9ncmFtcyB0byAgZWZmZWN0aXZlbHkgIGFjY2VzcwogICAgICAgIGludGVybmFsICBkYXRhICBmaWVsZHMuICBGb3IgZXhhbXBsZSwgIHRoaXMgIGNhbiBiZSAgZXh0cmVtZWx5CiAgICAgICAgdXNlZnVsIGlmICBzb21lb25lIHdhbnRzICB0byB3cml0ZSBhICBmb250IHByb2R1Y2VyIG9yICBhIGZvbnQKICAgICAgICBtYW5hZ2VyIG9uIHRvcCBvZiBGcmVlVHlwZS4KCiAgICBCYXNpY2FsbHksIHlvdSAgc2hvdWxkIG5vdyB1c2UgIHRoZSAnZnJlZXR5cGUvJyBwcmVmaXggIGZvciBoZWFkZXIKICAgIGluY2x1c2lvbiwgYXMgaW46CgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogICAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CgogICAgU29tZSBuZXcgaW5jbHVkZSBzdWItZGlyZWN0b3JpZXMgYXJlIGF2YWlsYWJsZToKCiAgICAgYS4gdGhlICAiZnJlZXR5cGUvY29uZmlnIiBkaXJlY3RvcnksICBjb250YWlucyB0d28gZmlsZXMgIHVzZWQgdG8KICAgICAgICBjb25maWd1cmUgIHRoZSAgYnVpbGQgIG9mICB0aGUgIGxpYnJhcnkuICBDbGllbnQgIGFwcGxpY2F0aW9ucwogICAgICAgIHNob3VsZCAgbm90IG5lZWQgIHRvIGxvb2sgIGF0IHRoZXNlICBub3JtYWxseSwgYnV0IHRoZXkgY2FuIGlmCiAgICAgICAgdGhleSB3YW50LgoKICAgICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg+CiAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oPgoKICAgICBiLiB0aGUgImZyZWV0eXBlL2ludGVybmFsIiAgZGlyZWN0b3J5LCBjb250YWlucyBoZWFkZXIgZmlsZXMgdGhhdAogICAgICAgIGRlc2NyaWJlcyBsaWJyYXJ5ICBpbnRlcm5hbHMuICBUaGVzZSBhcmUgdGhlIGhlYWRlciBmaWxlcyB0aGF0CiAgICAgICAgd2VyZSAgcHJldmlvdXNseSAgZm91bmQgIGluICB0aGUgInNyYy9iYXNlIiAgYW5kICAic3JjL3NoYXJlZCIKICAgICAgICBkaXJlY3Rvcmllcy4KCgogICAgQXMgIHVzdWFsLCB0aGUgYnVpbGQgIHN5c3RlbSBhbmQgIHRoZSBkZW1vcyAgaGF2ZSBiZWVuICB1cGRhdGVkIHRvCiAgICByZWZsZWN0IHRoZSBjaGFuZ2UuLgoKICAgIEhlcmUncyBhIGxheW91dCBvZiB0aGUgbmV3IGRpcmVjdG9yeSBoaWVyYXJjaHk6CgogICAgVE9QX0RJUgogICAgICBpbmNsdWRlLwogICAgICAgICBmcmVldHlwZS8KICAgICAgICAgICAgZnJlZXR5cGUuaAogICAgICAgICAgICAuLi4KICAgICAgICAgICAgY29uZmlnLwogICAgICAgICAgICAgIGZ0b3B0aW9uLmgKICAgICAgICAgICAgICBmdGNvbmZpZy5oCiAgICAgICAgICAgICAgZnRtb2R1bGUuaAoKICAgICAgICAgICAgaW50ZXJuYWwvCiAgICAgICAgICAgICAgZnRvYmpzLmgKICAgICAgICAgICAgICBmdHN0cmVhbS5oCiAgICAgICAgICAgICAgZnRjYWxjLmgKICAgICAgICAgICAgICAuLi4KCiAgICAgIHNyYy8KICAgICAgICAgYmFzZS8KICAgICAgICAgICAgLi4uCgogICAgICAgICBzZm50LwogICAgICAgICBwc25hbWVzLwogICAgICAgICB0cnVldHlwZS8KICAgICAgICAgdHlwZTEvCiAgICAgICAgIHR5cGUxei8KCgogICAgQ29tcGlsaW5nIGEgbW9kdWxlIGlzIG5vdyAgbXVjaCBlYXNpZXIsIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICBzaG91bGQgd29yayB3aGVuIGluIHRoZSBUT1BfRElSIGRpcmVjdG9yeSBvbiBhbiBBTlNJIGJ1aWxkOgoKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL2Jhc2Ugc3JjL2Jhc2UvZnRiYXNlLmMKICAgICAgIGdjYyAtYyAtSS4vaW5jbHVkZSAtSS4vc3JjL3NmbnQgc3JjL3NmbnQvc2ZudC5jCiAgICAgICBldGMuLgoKICAgIChvZiBjb3Vyc2UsIHVzaW5nIC1JY29uZmlnLzxzeXN0ZW0+IGlmIHlvdSBwcm92aWRlIHN5c3RlbS1zcGVjaWZpYwogICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMpLgoKICAtIHVwZGF0ZWQgdGhlIHN0cnVjdHVyZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIGluIG9yZGVyIHRvIGFsbG93IGRpcmVjdAogICAgY29vcmRpbmF0ZSBzY2FsaW5nIHdpdGhpbiAgdGhlIG91dGxpbmUgZGVjb21wb3NpdGlvbiByb3V0aW5lICh0aGlzCiAgICBpcyAgaW1wb3J0YW50IGZvciB2aXJ0dWFsICAib24iIHBvaW50cyAgd2l0aCBUcnVlVHlwZSAgb3V0bGluZXMpICsKICAgIHVwZGF0ZXMgdG8gdGhlIHJhc3RlcnMgdG8gc3VwcG9ydCB0aGlzLi4KCiAgLSB1cGRhdGVkICB0aGUgT1MvMiAgdGFibGUgIGxvYWRpbmcgY29kZSAgaW4gInNyYy9zZm50L3R0bG9hZC5jIiAgaW4KICAgIG9yZGVyIHRvIHN1cHBvcnQgdmVyc2lvbiAyIG9mIHRoZSB0YWJsZSAoc2VlIE9wZW5UeXBlIDEuMiBzcGVjKQoKICAtIGNyZWF0ZWQgICJpbmNsdWRlL3R0dGFibGVzLmgiICBhbmQgICJpbmNsdWRlL3QxdGFibGVzLmgiIHRvICBhbGxvdwogICAgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBhY2Nlc3Mgc29tZSBvZiAgdGhlIFNGTlQgYW5kIFQxIHRhYmxlcyBvZiBhCiAgICBmYWNlICB3aXRoICBhICBwcm9jZWR1cmFsICBpbnRlcmZhY2UgKHNlZSAgRlRfR2V0X1NmbnRfVGFibGUoKSkgICsKICAgIHVwZGF0ZXMgdG8gaW50ZXJuYWwgc291cmNlIGZpbGVzIHRvIHJlZmxlY3QgdGhlIGNoYW5nZS4uCgogIC0gc29tZSAgY2xlYW51cHMgaW4gIHRoZSBzb3VyY2UgIGNvZGUgdG8gIGdldCByaWQgIG9mICB3YXJuaW5ncyB3aGVuCiAgICBjb21waWxpbmcgd2l0aCB0aGUgIi1XYWxsIC1XIC1hbnNpIC1wZWRhbnRpYyIgb3B0aW9ucyBpbiBnY2MuCgogIC0gZGVidWdnZWQgYW5kIG1vdmVkIHRoZSBzbW9vdGggcmVuZGVyZXIgdG8gInNyYy9iYXNlL2Z0Z3JheXMuYyIgYW5kCiAgICBpdHMgaGVhZGVyIHRvICJpbmNsdWRlL2Z0Z3JheXMuaCIKCiAgLSB1cGRhdGVkIFRUX01BWF9TVUJHTFlQSFMgIHRvIDk2IGFzIHNvbWUgQ0pLICBmb250cyBoYXZlIGNvbXBvc2l0ZXMKICAgIHdpdGggdXAgdG8gODAgc3ViLWdseXBocyAhISBUaGFua3MgdG8gV2VybmVyCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIENIQU5HRVMgLSAxNC1hcHItMjAwMAoKICAtIGZpeGVkICBhIGJ1ZyAgaW4gIHRoZSAgVHJ1ZVR5cGUgZ2x5cGggIGxvYWRlciAgdGhhdCBwcmV2ZW50ZWQgIHRoZQogICAgY29ycmVjdCBsb2FkaW5nIG9mIHNvbWUgQ0pLIGdseXBocyBpbiBtaW5nbGkudHRmCgogIC0gaW1wcm92ZWQgdGhlIHN0YW5kYXJkIFR5cGUgMSBoaW50ZXIgaW4gInNyYy90eXBlMSIKCiAgLSBmaXhlZCB0d28gYnVncyAgaW4gdGhlIGV4cGVyaW1lbnRhbCBUeXBlIDEgIGRyaXZlciBpbiAic3JjL3R5cGUxeiIKICAgIHRvIGhhbmRsZSB0aGUgbmV3IFhGcmVlODYgNC4wIGZvbnRzIChhbmQgYSBmZXcgb3RoZXIgb25lcy4uKQoKICAtIHRoZSBzbW9vdGggIHJlbmRlcmVyIGlzIG5vdyAgY29tcGxldGUgYW5kIHN1cHBvcnRzICBzdWItYmFuZGluZyB0bwogICAgcmVuZGVyIGxhcmdlIGdseXBocyAgYXQgaGlnaCBzcGVlZC4gIEhvd2V2ZXIsIGl0IGlzIHN0aWxsICBsb2NhdGVkCiAgICBpbiAiZGVtb3Mvc3JjL2Z0Z3JheXMuYyIgYW5kIHNob3VsZCBtb3ZlIHRvIHRoZSAgbGlicmFyeSBpdHNlbGYgaW4KICAgIHRoZSBuZXh0ICBiZXRhLiAgTk9URTogVGhlICBzbW9vdGggIHJlbmRlcmVyICBkb2Vzbid0ICBjb21waWxlICBpbgogICAgc3RhbmQtYWxvbmUgbW9kZSBhbnltb3JlLCBidXQgdGhpcyBzaG91bGQgYmUgZml4ZWQgUlNOLi4KCiAgLSBpbnRyb2R1Y2VkIGNvbnZlbmllbmNlICBmdW5jdGlvbnMgdG8gIG1vcmUgZWFzaWx5IGRlYWwgIHdpdGggZ2x5cGgKICAgIGltYWdlcywgc2VlICAiaW5jbHVkZS9mdGdseXBoLmgiIGZvciBtb3JlIGRldGFpbHMsIGFzICB3ZWxsIGFzIHRoZQogICAgbmV3ICBkZW1vIHByb2dyYW0gIG5hbWVkICJkZW1vcy9zcmMvZnRzdHJpbmcuYyIgIHRoYXQgZGVtb25zdHJhdGVzCiAgICBpdHMgdXNlCgogIC0gaW1wbGVtZW50ZWQgIEZUX0xPQURfTk9fUkVDVVJTRSBpbiAgYm90aCB0aGUgIFRydWVUeXBlIGFuZCAgVHlwZSAxCiAgICBkcml2ZXJzICAodGhpcyAgaXMgcmVxdWlyZWQgIGJ5ICB0aGUgIGF1dG8taGludGVyICB0byBpbXByb3ZlICBpdHMKICAgIHJlc3VsdHMpLgoKICAtIGNoYW5nZWQgICB0aGUgIHJhc3RlciAgIGludGVyZmFjZSwgIGluICAgb3JkZXIgIHRvICAgYWxsb3cgIGNsaWVudAogICAgYXBwbGljYXRpb25zICB0byAgIHByb3ZpZGUgIHRoZWlyICAgb3duICBzcGFuLWRyYXdpbmcgICBjYWxsYmFja3MuCiAgICBIb3dldmVyLCAgIG9ubHkgICB0aGUgICBzbW9vdGggICByZW5kZXJlciAgIHN1cHBvcnRzICAgdGhpcy4gICBTZWUKICAgICJGVF9SYXN0ZXJfUGFyYW1zIiBpbiB0aGUgZmlsZSAiaW5jbHVkZS9mdGltYWdlLmgiLgoKICAtIGZpeGVkICBhIHNtYWxsIGJ1ZyAgaW4gRlRfTXVsRml4ICB0aGF0IGNhdXNlZCAgaW5jb3JyZWN0IHRyYW5zZm9ybQogICAgY29tcHV0YXRpb24hCgogIC0gTm90ZTogVGhlIHR1dG9yaWFsIGlzIG91dC1vZi1kYXRlLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk9MRCBDSEFOR0VTIC0gMTItbWFyLTIwMDAKCiAgLSBjaGFuZ2VkICB0aGUgIGxheW91dCAgb2YgIGNvbmZpZ3VyYXRpb24gIGZpbGVzICA6ICBub3csICBhbGwgIEFOU0kKICAgIGNvbmZpZ3VyYXRpb24gICAgICAgICBmaWxlcyAgICAgICAgIGFyZSAgICAgICAgIGxvY2F0ZWQgICAgICAgICBpbgogICAgImZyZWV0eXBlMi9jb25maWciLiAgU3lzdGVtLXNwZWNpZmljIG92ZXItcmlkZXMgIGNhbiBiZSAgcGxhY2VkIGluCiAgICAiZnJlZXR5cGUyL2NvbmZpZy88c3lzdGVtPiIuCgogIC0gbW92ZWQgYWxsIGNvbmZpZ3VyYXRpb24gbWFjcm9zIHRvICJjb25maWcvZnRvcHRpb24uaCIKCiAgLSBpbXByb3ZlbWVudHMgaW4gdGhlIFR5cGUgMSBkcml2ZXIgd2l0aCBBRk0gc3VwcG9ydAoKICAtIGNoYW5nZWQgdGhlIGZpZWxkcyAgaW4gdGhlIEZUX091dGxpbmUgc3RydWN0dXJlIDogIHRoZSBvbGQgImZsYWdzIgogICAgYXJyYXkgaXMgcmUtbmFtZWQgInRhZ3MiLCB3aGlsZSBhbGwgYW5jaWVudCBmbGFncyBhcmUgZW5jb2RlZCBpbnRvCiAgICBhIHNpbmdsZSB1bnNpZ25lZCBpbnQgbmFtZWQgImZsYWdzIi4KCiAgLSBpbnRyb2R1Y2VkICAgICBuZXcgICAgICBmbGFncyAgICAgaW4gICAgIEZUX091dGxpbmUuZmxhZ3MgICAgIChzZWUKICAgIGZ0X291dGxpbmVfLi4uLiBlbnVtcyBpbiAiZnRpbWFnZS5oIikuCgogIC0gY2hhbmdlZCBvdXRsaW5lIGZ1bmN0aW9ucyB0byAiRlRfT3V0bGluZV88YWN0aW9uPiIgc3ludGF4CgogIC0gYWRkZWQgYSBzbW9vdGggYW50aS1hbGlhcyByZW5kZXJlciB0byB0aGUgZGVtb25zdHJhdGlvbiBwcm9ncmFtcwoKICAtIGFkZGVkIE1hYyBncmFwaGljcyBkcml2ZXIgKHRoYW5rcyBKdXN0KQoKICAtIEZUX09wZW5fRmFjZSAgY2hhbmdlZCAgaW4gIG9yZGVyICAgdG8gIHJlY2VpdmVkICBhICBwb2ludGVyICB0byAgYQogICAgRlRfT3Blbl9BcmdzIGRlc2NyaXB0b3IuLgoKICAtIHZhcmlvdXMgIGNsZWFudXBzLCAgYSAgZmV3ICBtb3JlIEFQSSAgZnVuY3Rpb25zICBpbXBsZW1lbnRlZCAgKHNlZQogICAgRlRfQXR0YWNoX0ZpbGUpCgogIC0gdXBkYXRlZCBzb21lIGRvY3MKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpPTEQgQ0hBTkdFUyAtIDIyLWZlYi0yMDAwCgogIC0gaW50cm9kdWNlZCB0aGUgInBzbmFtZXMiIG1vZHVsZS4gIEl0IGlzIHVzZWQgdG86CgogICAgICBvIGNvbnZlcnQgIGEgUG9zdHNjcmlwdCBnbHlwaCAgbmFtZSBpbnRvIHRoZSAgZXF1aXZhbGVudCBVbmljb2RlCiAgICAgICAgY2hhcmFjdGVyIGNvZGUgKHVzZWQgYnkgdGhlICBUeXBlIDEgZHJpdmVyKHMpIHRvIHN5bnRoZXRpemUgb24KICAgICAgICB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwKS4KCiAgICAgIG8gcHJvdmlkZSBhbiAgaW50ZXJmYWNlIHRvIHJldHJpZXZlIHRoZSBQb3N0c2NyaXB0ICBuYW1lcyBvZiB0aGUKICAgICAgICBNYWNpbnRvc2gsICBBZG9iZSAgU3RhbmRhcmQgJiAgQWRvYmUgIEV4cGVydCBjaGFyYWN0ZXIgIGNvZGVzLgogICAgICAgICh0aGUgTWFjaW50b3NoICBuYW1lcyBhcmUgIHVzZWQgYnkgdGhlICBTRk5ULW1vZHVsZSBwb3N0c2NyaXB0CiAgICAgICAgbmFtZXMgc3VwcG9ydCByb3V0aW5lcywgd2hpbGUgdGhlIG90aGVyIHR3byB0YWJsZXMgYXJlIHVzZWQgYnkKICAgICAgICB0aGUgVHlwZSAxIGRyaXZlcihzKSkuCgogIC0gaW50cm9kdWNlZCB0aGUgInR5cGUxeiIgYWx0ZXJuYXRlIFR5cGUgMSBkcml2ZXIuICBUaGlzIGlzIGEgKHN0aWxsCiAgICBleHBlcmltZW50YWwpIGRyaXZlciAgZm9yIHRoZSBUeXBlICAxIGZvcm1hdCB0aGF0ICB3aWxsIHVsdGltYXRlbHkKICAgIHJlcGxhY2UgdGhlIG9uZSAgaW4gInNyYy90eXBlMSIuICBJdCB1c2VzIHBhdHRlcm4gbWF0Y2hpbmcgdG8gbG9hZAogICAgZGF0YSBmcm9tIHRoZSBmb250LCBpbnN0ZWFkIG9mIGEgZmluaXRlICBzdGF0ZSBhbmFseXplci4gIEl0IHdvcmtzCiAgICBtdWNoIGJldHRlciB0aGFuIHRoZSAib2xkIiBkcml2ZXIgd2l0aCAiYnJva2VuIiBmb250cy4gIEl0IGlzIGFsc28KICAgIG11Y2ggc21hbGxlciAodW5kZXIgMTUgS2IpLgoKICAtIHRoZSAgVHlwZSAxICBkcml2ZXJzIChib3RoICBpbiAic3JjL3R5cGUxIiAgYW5kICAic3JjL3R5cGUxeiIpIGFyZQogICAgbmVhcmx5ICBjb21wbGV0ZS4gIFRoZXkgIGJvdGggIHByb3ZpZGUgYXV0b21hdGljICBVbmljb2RlICBjaGFybWFwCiAgICBzeW50aGVzaXMgdGhyb3VnaCAgdGhlICJwc25hbWVzIiBtb2R1bGUuICBObyByZS1lbmNvZGluZyB2ZWN0b3IgaXMKICAgIG5lZWRlZC4gIChub3RlICB0aGF0IHRoZXkgIHN0aWxsICBsZWFrICBtZW1vcnkgIGR1ZSB0byAgc29tZSAgY29kZQogICAgbWlzc2luZywgYW5kIEknbSBnZXR0aW5nIGxhenkpLgoKICAgIFRyaXZpYWwgQUZNIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgdG8gcmVhZCBrZXJuaW5nIGluZm9ybWF0aW9uIGJ1dAogICAgd2Fzbid0IGV4YWN0bHkgdGVzdGVkIGFzIGl0IHNob3VsZCA7LSkKCiAgLSBUaGUgVHJ1ZVR5cGUgIGdseXBoIGxvYWRlciBoYXMgIGJlZW4gc2VyaW91c2x5IHJld3JpdHRlbiAgKHNlZSB0aGUKICAgIGZpbGUgICJzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIi4gIEl0IGlzIG5vdyAgbXVjaCwgbXVjaCAgc2ltcGxlciBhcwogICAgd2VsbCBhcyAgZWFzaWVyIHRvIHJlYWQsICBtYWludGFpbiBhbmQgdW5kZXJzdGFuZCAgOi0pIFByZWxpbWluYXJ5CiAgICB2ZXJzaW9ucyBpbnRyb2R1Y2VkIGEgIG1lbW9yeSBsZWFrIHRoYXQgaGFzIGJlZW4gIHJlcG9ydGVkIGJ5IEphY2sKICAgIERhdmlzLCBhbmQgaXMgbm93IGZpeGVkLi4KCiAgLSBpbnRyb2R1Y2VkICB0aGUgbmV3ICAiZnRfZ2x5cGhfZm9ybWF0X3Bsb3R0ZXIiLCB1c2VkICB0byByZXByZXNlbnQKICAgIHN0cm9rZWQgb3V0bGluZXMgIGxpa2UgV2luZG93cyAiVmVjdG9yIiBmb250cywgYW5kICBjZXJ0YWluIFR5cGUgMQogICAgZm9udHMgIGxpa2UgIkhlcnNoZXkiLiAgVGhlIGNvcnJlc3BvbmRpbmcgIHJhc3RlciB3aWxsICBiZSB3cml0dGVuCiAgICBzb29uLgoKICAtIEZUX05ld19NZW1vcnlfRmFjZSAgaXMgIGdvbmUuICBMaWtld2lzZSwgIEZUX09wZW5fRmFjZSBoYXMgIGEgIG5ldwogICAgaW50ZXJmYWNlIHRoYXQgdXNlcyBhIHN0cnVjdHVyZSAgdG8gZGVzY3JpYmUgdGhlIGlucHV0IHN0cmVhbSwgdGhlCiAgICBkcml2ZXIgKGlmIHJlcXVpcmVkKSwgZXRjLi4KCgpUT0RPCgogIC0gV3JpdGUgRlRfR2V0X0dseXBoX0JpdG1hcCBhbmQgRlRfTG9hZF9HbHlwaF9CaXRtYXAKCiAgLSBBZGQgYSBmdW5jdGlvbiBsaWtlIEZUX0xvYWRfQ2hhcmFjdGVyKCBmYWNlLCBjaGFyX2NvZGUsIGxvYWRfZmxhZ3MKICAgICkgIHRoYXQgIHdvdWxkIHJlYWxseSAgZW1iYmVkICBhICBjYWxsICB0byBGVF9HZXRfQ2hhcl9JbmRleCAgdGhlbgogICAgRlRfTG9hZF9HbHlwaCB0byBlYXNlIGRldmVsb3BlcidzIHdvcmsuCgogIC0gVXBkYXRlIHRoZSB0dXRvcmlhbCEKCiAgLSBjb25zaWRlciBhZGRpbmcgIHN1cHBvcnQgZm9yIE11bHRpcGxlICBNYXN0ZXIgZm9udHMgaW4gdGhlICBUeXBlIDEKICAgIGRyaXZlcnMuCgogIC0gVGVzdCB0aGUgQUZNIHJvdXRpbmVzIG9mIHRoZSAgVHlwZSAxIGRyaXZlcnMgdG8gY2hlY2sgdGhhdCBrZXJuaW5nCiAgICBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBjb3JyZWN0bHkuCgogIC0gd3JpdGUgYSBkZWNlbnQgYXV0by1ncmlkZGluZyBjb21wb25lbnQgICEhIFdlIG5lZWQgdGhpcyB0byByZWxlYXNlCiAgICBGcmVlVHlwZSAyLjAgZ29sZCAhCgoKbGVzcyB1cmdlbnQgbmVlZHM6CgogIC0gYWRkIGEgQ0ZGL1R5cGUyIGRyaXZlcgogIC0gYWRkIGEgQkRGIGRyaXZlcgogIC0gYWRkIGEgRk5UL1BDRi9IQkYgZHJpdmVyCiAgLSBhZGQgYSBTcGVlZG8gZHJpdmVyIGZyb20gdGhlIFgxMSBzb3VyY2VzCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xERVIgQ0hBTkdFUyAtIDI3LWphbi0yMDAwCgogIC0gdXBkYXRlZCB0aGUgICJzZm50IiBtb2R1bGUgIGludGVyZmFjZSB0byBhbGxvdyAgc2V2ZXJhbCBTRk5ULWJhc2VkCiAgICBkcml2ZXJzIHRvIGNvLWV4aXN0IHBlYWNlZnVsbHkKCiAgLSB1cGRhdGVkICB0aGUgIlQxX0ZhY2UiICB0eXBlICB0byBiZXR0ZXIgIHNlcGFyYXRlIFBvc3RzY3JpcHQgIGZvbnQKICAgIGNvbnRlbnQgIGZyb20gdGhlICByZXN0IG9mICB0aGUgRlRfRmFjZSAgc3RydWN0dXJlLiAgTWlnaHQgYmUgdXNlZAogICAgbGF0ZXIgYnkgdGhlIENGRi9UeXBlMiBkcml2ZXIuLgoKICAtIGFkZGVkIGFuIGV4cGVyaW1lbnRhbCByZXBsYWNlbWVudCBUeXBlIDEgZHJpdmVyIGZlYXR1cmluZyBhZHZhbmNlZAogICAgKGFuZCBzcGVlZHkpIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcmV0cmlldmUgdGhlIGRhdGEgZnJvbSBwb3N0c2NyaXB0CiAgICBmb250cy4KCiAgLSB2ZXJ5IG1pbm9yICBjaGFuZ2VzIGluIHRoZSBpbXBsZW1lbnRhdGlvbiAgb2YgRlRfU2V0X0NoYXJfU2l6ZSBhbmQKICAgIEZUX1NldF9QaXhlbF9TaXplcyAodGhleSBub3cgaW1wbGVtZW50IGRlZmF1bHQgdG8gbGlndGhlbiB0aGUgZm9udAogICAgZHJpdmVyJ3MgY29kZSkuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKT0xEIE1FU1NBR0UKClRoaXMgZmlsZSBzdW1tYXJpemVzIHRoZSBjaGFuZ2VzIHRoYXQgb2NjdXJlZCBzaW5jZSB0aGUgbGFzdCAiYmV0YSIgb2YKRnJlZVR5cGUgMi4gIEJlY2F1c2UgIHRoZSBsaXN0IGlzIGltcG9ydGFudCwgaXQgIGhhcyBiZWVuIGRpdmlkZWQgaW50bwpzZXBhcmF0ZSBzZWN0aW9uczoKClRhYmxlIE9mIENvbnRlbnRzOgoKICAgIEkgICBIaWdoLUxldmVsIEludGVyZmFjZSAoZWFzaWVyICEpCiAgIElJICAgRGlyZWN0b3J5IFN0cnVjdHVyZQogIElJSSAgIEdseXBoIEltYWdlIEZvcm1hdHMKICAgSVYgICBCdWlsZCBTeXN0ZW0KICAgIFYgICBQb3J0YWJpbGl0eQogICBWSSAgIEZvbnQgRHJpdmVycwoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkhpZ2gtTGV2ZWwgSW50ZXJmYWNlOgoKICBUaGUgaGlnaC1sZXZlbCBBUEkgaGFzIGJlZW4gY29uc2lkZXJhYmx5IHNpbXBsaWZpZWQuICBIZXJlIGlzIGhvdzoKCiAgICAtIHJlc291cmNlIG9iamVjdHMgaGF2ZSBkaXNhcHBlYXJlZC4gIHRoaXMgbWVhbnMgdGhhdCBmYWNlIG9iamVjdHMKICAgICAgY2FuIG5vdyBiZSBjcmVhdGVkIHdpdGggIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgKHNlZSBGVF9OZXdfRmFjZQogICAgICBhbmQgRlRfT3Blbl9GYWNlKQoKICAgIC0gd2hlbiBjYWxsaW5nICBlaXRoZXIgRlRfTmV3X0ZhY2UgICYgRlRfT3Blbl9GYWNlLCBhICBzaXplIG9iamVjdAogICAgICBhbmQgYSBnbHlwaCBzbG90IG9iamVjdCAgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3IgdGhlIGZhY2UsCiAgICAgIGFuZCBjYW4gIGJlIGFjY2Vzc2VkICB0aHJvdWdoICJmYWNlLT5nbHlwaCIgYW5kICAiZmFjZS0+c2l6ZSIgaWYKICAgICAgb25lIHJlYWxseSAgbmVlZHMgdG8uICAgSW4gbW9zdCBjYXNlcywgIHRoZXJlJ3Mgbm8gbmVlZCAgdG8gY2FsbAogICAgICBGVF9OZXdfU2l6ZSBvciBGVF9OZXdfR2x5cGguCgogICAgLSBzaW1pbGFybHksICBGVF9Mb2FkX0dseXBoICBub3cgIG9ubHkgIHRha2VzICBhICAiZmFjZSIgIGFyZ3VtZW50CiAgICAgIChpbnN0ZWFkICBvZiBhICBnbHlwaCAgc2xvdCAgYW5kIGEgIHNpemUpLiAgQWxzbywgaXQncyAgInJlc3VsdCIKICAgICAgcGFyYW1ldGVyIGlzICBnb25lLCBhcyB0aGUgZ2x5cGggIGltYWdlIHR5cGUgaXMgIHJldHVybmVkIGluIHRoZQogICAgICBmaWVsZCAiZmFjZS0+Z2x5cGguZm9ybWF0IgoKICAgIC0gdGhlIGxpc3QgIG9mIGF2YWlsYWJsZSAgY2hhcm1hcHMgaXMgZGlyZWN0bHkgIGFjY2Vzc2libGUgdGhyb3VnaAogICAgICAiZmFjZS0+Y2hhcm1hcHMiLCBjb3VudGluZyAiZmFjZS0+bnVtX2NoYXJtYXBzIiAgZWxlbWVudHMuICBFYWNoCiAgICAgIGNoYXJtYXAgIGhhcyBhbiAgJ2VuY29kaW5nJyAgZmllbGQgd2hpY2ggIHNwZWNpZmllcyB3aGljaCAga25vd24KICAgICAgZW5jb2RpbmcgaXQgZGVhbHMgd2l0aC4gIFZhbGlkIHZhbHVlcyBhcmUsIGZvciBleGFtcGxlOgoKICAgICAgICAgIGZ0X2VuY29kaW5nX3VuaWNvZGUgICAgICAoZm9yIEFTQ0lJLCBMYXRpbi0xIGFuZCBVbmljb2RlKQogICAgICAgICAgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4KICAgICAgICAgIGZ0X2VuY29kaW5nX3NqaXMKICAgICAgICAgIGZ0X2VuY29kaW5nX2Fkb2JlX3N0YW5kYXJkCiAgICAgICAgICBmdF9lbmNvZGluZ19hZG9iZV9leHBlcnQKCiAgICAgIG90aGVyICB2YWx1ZXMgbWF5ICBiZSBhZGRlZCAgaW4gdGhlICBmdXR1cmUuICBFYWNoIGNoYXJtYXAgc3RpbGwKICAgICAgaG9sZHMgIGl0cyAicGxhdGZvcm1faWQiICBhbmQgImVuY29kaW5nX2lkIiAgdmFsdWVzIGluICBjYXNlIHRoZQogICAgICBlbmNvZGluZyBpcyB0b28gZXhvdGljIGZvciB0aGUgY3VycmVudCBsaWJyYXJ5CgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRGlyZWN0b3J5IFN0cnVjdHVyZToKCiAgU2hvdWxkIHNlZW0gb2J2aW91cyB0byBtb3N0IG9mIHlvdToKCiAgICAgZnJlZXR5cGUvCiAgICAgICAgIGNvbmZpZy8gICAgICAgIC0tIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlcwogICAgICAgICAgICBhbnNpLwogICAgICAgICAgICB1bml4LyAgICAgICAtLSBwbGF0Zm9ybS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgICAgIHdpbjMyLwogICAgICAgICAgICBvczIvCiAgICAgICAgICAgIG1zZG9zLwoKICAgICAgICAgaW5jbHVkZS8gICAgICAgLS0gcHVibGljIGhlYWRlciAgZmlsZXMsIHRob3NlIHRvICBiZSBpbmNsdWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSBieSBjbGllbnQgYXBwcwoKICAgICAgICAgc3JjLyAgICAgICAgICAgLS0gc291cmNlcyBvZiB0aGUgbGlicmFyeQogICAgICAgICAgIGJhc2UvICAgICAgICAtLSB0aGUgYmFzZSBsYXllcgogICAgICAgICAgIHNmbnQvICAgICAgICAtLSB0aGUgc2ZudCAiZHJpdmVyIiAgKHNlZSB0aGUgZHJpdmVycyBzZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93KQogICAgICAgICAgIHRydWV0eXBlLyAgICAtLSB0aGUgdHJ1ZXR5cGUgZHJpdmVyCiAgICAgICAgICAgdHlwZTEvICAgICAgIC0tIHRoZSB0eXBlMSBkcml2ZXIKICAgICAgICAgICBzaGFyZWQvICAgICAgLS0gc29tZSBoZWFkZXIgZmlsZXMgc2hhcmVkIGJldHdlZW4gZHJpdmVycwoKICAgICAgICAgZGVtb3MvICAgICAgICAgLS0gZGVtb3MvdG9vbHMKCiAgICAgICAgIGRvY3MvICAgICAgICAgIC0tIGRvY3VtZW50YXRpb24gKGEgYml0IGVtcHR5IGZvciBub3cpCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKR2x5cGggSW1hZ2UgRm9ybWF0czoKCiAgRHJpdmVycyBhcmUgbm93IGFibGUgdG8gIHJlZ2lzdGVyIG5ldyBnbHlwaCBpbWFnZSBmb3JtYXRzIHdpdGhpbiB0aGUKICBsaWJyYXJ5LiAgRm9yICBub3csIHRoZSAgYmFzZSBsYXllciBzdXBwb3J0cyAgb2YgY291cnNlICBiaXRtYXBzIGFuZAogIHZlY3RvciAgb3V0bGluZXMsIGJ1dCAgb25lICBjb3VsZCBpbWFnaW5lICBzb21ldGhpbmcgZGlmZmVyZW50ICBsaWtlCiAgY29sb3JlZCBiaXRtYXBzLCBiaS1jb2xvciB2ZWN0b3JzIG9yIHdhdGhldmVyIGVsc2UgKE1ldGFmb250cyBhbnlvbmUKICA/PykuCgogIFNlZSAgdGhlICAgZmlsZSAgYGluY2x1ZGUvZnRpbWFnZS5oJy4gICBOb3RlICBhbHNvICB0aGF0ICAgdGhlICB0eXBlCiAgRlRfUmFzdGVyX01hcCAgaXMgZ29uZSwgIGFuZCAgaXMgbm93ICByZXBsYWNlZCAgYnkgRlRfQml0bWFwLCAgd2hpY2gKICBzaG91bGQgZW5jb21wYXNzIGFsbCBrbm93biBiaXRtYXAgdHlwZXMuCgogIEVhY2ggbmV3ICBpbWFnZSBmb3JtYXQgIG11c3QgcHJvdmlkZSBhdCAgbGVhc3Qgb25lICJyYXN0ZXIiLCAgaS5lLiBhCiAgbW9kdWxlIGNhcGFibGUgb2YgIHRyYW5zZm9ybWluZyB0aGUgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcC4gIEl0J3MKICBhbHNvIHBvc3NpYmxlICB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgIHJhc3RlciB1c2VkIGZvciAgYSBnaXZlbiBnbHlwaAogIGltYWdlIGZvcm1hdC4KCiAgVGhlIGRlZmF1bHQgb3V0bGluZSAgc2Nhbi1jb252ZXJ0ZXIgbm93IHVzZXMgMTI4IGxldmVscyAgb2YgZ3JheXMgYnkKICBkZWZhdWx0LCAgd2hpY2ggdGVuZHMgIHRvIHNtb290aCAgbWFueSAgdGhpbmdzLiAgTm90ZSB0aGF0IHRoZSAgZGVtbwogIHByb2dyYW1zIGhhdmUgYmVlbiB1cGRhdGVkIHNpZ25pZmljYW50bHkgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGVzZS4uCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQnVpbGQgc3lzdGVtOgoKICBZb3Ugc3RpbGwgbmVlZCAgR05VIE1ha2UgdG8gYnVpbGQgdGhlIGxpYnJhcnkuICBUaGUgYnVpbGQgc3lzdGVtIGhhcwogIGJlZW4gdmVyeSBzZXJpb3VzbHkgcmUtdmFtcGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgdGhpbmdzIGxpa2UgOgoKICAgLSBhdXRvbWF0aWMgaG9zdCBwbGF0Zm9ybSAgZGV0ZWN0aW9uIChyZXZlcnRpbmcgdG8gJ2NvbmZpZy9hbnNpJyBpZgogICAgIGl0IGlzIG5vdCBkZXRlY3RlZCwgd2l0aCBwc2V1ZG8tc3RhbmRhcmQgY29tcGlsYXRpb24gZmxhZ3MpCgogICAtIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgZnJvbSB0aGUgTWFrZWZpbGVzIHdpdGggdmVyeSBkaWZmZXJlbnQgYW5kCiAgICAgZXhvdGljIGNvbXBpbGVycy4gIE5vdGUgdGhhdCBsaW5raW5nIHRoZSBsaWJyYXJ5IGNhbiBiZSBkaWZmaWN1bHQKICAgICBmb3Igc29tZSBwbGF0Zm9ybXMuCgogICAgIEZvciBleGFtcGxlLCB0aGUgZmlsZSBgY29uZmlnL3dpbjMyL2xjY2xpYi5iYXQnIGlzIGludm9rZWQgYnkgdGhlCiAgICAgYnVpbGQgc3lzdGVtIHRvIGNyZWF0ZSB0aGUgIi5saWIiIGZpbGUgd2l0aCBMQ0MtV2luMzIgYmVjYXVzZSBpdHMKICAgICBsaWJyYXJpYW4gIGhhcyB0b28gIG1hbnkgZmxhd3MgIHRvIGJlICBpbnZva2VkIGRpcmVjdGx5ICBmcm9tIHRoZQogICAgIE1ha2VmaWxlLgoKICBIZXJlJ3MgaG93IGl0IHdvcmtzOgoKICAtIHRoZSBmaXJzdCB0aW1lIHlvdSB0eXBlIGBtYWtlJywgIHRoZSBidWlsZCBzeXN0ZW0gcnVucyBhIHNlcmllcyBvZgogICAgc3ViLW1ha2VmaWxlcyAgaW4gb3JkZXIgIHRvIGRldGVjdCAgeW91ciBob3N0ICBwbGF0Zm9ybS4gIEl0ICB0aGVuCiAgICBkdW1wcyB3aGF0IGl0IGZvdW5kLCBhbmQgY3JlYXRlcyBhIGZpbGUgY2FsbGVkIGBjb25maWcubWsnIGluICB0aGUKICAgIGN1cnJlbnQgIGRpcmVjdG9yeS4gIFRoaXMgaXMgYSAgc3ViLU1ha2VmaWxlIHVzZWQgIHRvICBkZWZpbmUgbWFueQogICAgaW1wb3J0YW50IE1ha2UgdmFyaWFibGVzIHVzZWQgdG8gYnVpbGQgdGhlIGxpYnJhcnkuCgogIC0gdGhlIHNlY29uZCB0aW1lLCB0aGUgYnVpbGQgc3lzdGVtIGRldGVjdHMgdGhlIGBjb25maWcubWsnIHRoZW4gdXNlCiAgICBpdCAgdG8gIGJ1aWxkIHRoZSAgbGlicmFyeS4gIEFsbCBvYmplY3QgIGZpbGVzICBnbyAgaW50byAnb2JqJyAgYnkKICAgIGRlZmF1bHQsICBhcyB3ZWxsICBhcyB0aGUgIGxpYnJhcnkgZmlsZSwgIGJ1dCB0aGlzICBjYW4gIGVhc2lseSBiZQogICAgY2hhbmdlZC4KCiAgTm90ZSB0aGF0ICB5b3UgY2FuIHJ1biAibWFrZSAgc2V0dXAiIHRvIGZvcmNlICBhbm90aGVyIGhvc3QgcGxhdGZvcm0KICBkZXRlY3Rpb24gIGV2ZW4gICBpZiAgYSAgYGNvbmZpZy5taycgIGlzICBwcmVzZW50ICAgaW4gIHRoZSAgY3VycmVudAogIGRpcmVjdG9yeS4gIEFub3RoZXIgc29sdXRpb24gIGlzICBzaW1wbHkgdG8gIGRlbGV0ZSAgdGhlIGZpbGUsICB0aGVuCiAgcmUtcnVuIG1ha2UuCgogIEZpbmFsbHksIHRoZSAgZGVmYXVsdCBjb21waWxlciAgZm9yIGFsbCBwbGF0Zm9ybXMgIGlzIGdjYyAgKGZvciBub3csCiAgdGhpcyB3aWxsIGhvcGVmdWxseSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUpLiAgWW91IGNhbiBob3dldmVyIHNwZWNpZnkKICBhIGRpZmZlcmVudCAgY29tcGlsZXIgYnkgc3BlY2lmeWluZyAgaXQgYWZ0ZXIgdGhlICdzZXR1cCcgIHRhcmdldCBhcwogIGluOgoKICAgICAgZ251bWFrZSBzZXR1cCBsY2MgICAgICAgICBvbiBXaW4zMiB0byB1c2UgdGhlIExDQyBjb21waWxlcgogICAgICBnbnVtYWtlIHNldHVwIHZpc3VhbGMgICAgIG9uIFdpbjMyIHRvIHVzZSBWaXN1YWwgQysrCgogIFNlZSAgdGhlIGZpbGUgIGBjb25maWcvPHN5c3RlbT4vZGV0ZWN0Lm1rJyBmb3IgIGEgbGlzdCAgb2Ygc3VwcG9ydGVkCiAgY29tcGlsZXJzIGZvciB5b3VyIHBsYXRmb3Jtcy4KCiAgSXQgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZWFzeSAgdG8gd3JpdGUgbmV3IGRldGVjdGlvbiBydWxlcyBmaWxlcyBhbmQKICBjb25maWcubWsuLgoKICBGaW5hbGx5LCB0byAgYnVpbGQgdGhlIGRlbW8gcHJvZ3JhbXMsICBnbyB0byBgZGVtb3MnICBhbmQgbGF1bmNoIEdOVQogIE1ha2UsIGl0IHdpbGwgdXNlIHRoZSBgY29uZmlnLm1rJyAgaW4gdGhlIHRvcCBkaXJlY3RvcnkgdG8gYnVpbGQgdGhlCiAgdGVzdCBwcm9ncmFtcy4uCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUG9ydGFiaWxpdHk6CgogIEluICB0aGUgIHByZXZpb3VzICBiZXRhLCAgYSAgc2luZ2xlIEZUX1N5c3RlbSAgb2JqZWN0ICB3YXMgIHVzZWQgIHRvCiAgZW5jb21wYXNzICBhbGwgIGxvdy1sZXZlbCAgb3BlcmF0aW9ucyBsaWtlICB0aHJlYWQgIHN5bmNocm9uaXNhdGlvbiwKICBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaS9vIGFjY2Vzcy4gIFRoaXMgaGFzIGJlZW4gZ3JlYXRseSBzaW1wbGlmaWVkOgoKICAgIC0gdGhyZWFkIHN5bmNocm9uaXNhdGlvbiAgaGFzIGJlZW4gZHJvcHBlZCwgZm9yICB0aGUgc2ltcGxlIHJlYXNvbgogICAgICB0aGF0IHRoZSBsaWJyYXJ5ICBpcyBhbHJlYWR5IHJlLWVudHJhbnQsIGFuZCB0aGF0ICBpZiB5b3UgcmVhbGx5CiAgICAgIG5lZWQgIHR3byAgdGhyZWFkcyBhY2Nlc3NpbmcgIHRoZSAgc2FtZSAgRlRfTGlicmFyeSwgeW91ICBzaG91bGQKICAgICAgcmVhbGx5IHN5bmNocm9uaXplIGFjY2VzcyB0byBpdCB5b3Vyc2VsZiB3aXRoIGEgc2ltcGxlIG11dGV4LgoKICAgIC0gbWVtb3J5ICBtYW5hZ2VtZW50IGlzICBwZXJmb3JtZWQgIHRocm91Z2ggYSAgdmVyeSBzaW1wbGUgIG9iamVjdAogICAgICBjYWxsZWQgIkZUX01lbW9yeSIsICB3aGljaCByZWFsbHkgaXMgYSB0YWJsZSAgY29udGFpbmluZyBhIHRhYmxlCiAgICAgIG9mIHBvaW50ZXJzIHRvICBmdW5jdGlvbnMgbGlrZSBtYWxsb2MsIHJlYWxsb2MgYW5kICBmcmVlIGFzIHdlbGwKICAgICAgYXMgc29tZSB1c2VyIGRhdGEgKGNsb3N1cmUpLgoKICAgIC0gcmVzb3VyY2VzIGhhdmUgZGlzYXBwZWFyZWQgKHRoZXkgY3JlYXRlZCBtb3JlIHByb2JsZW1zIHRoYW4gdGhleQogICAgICBzb2x2ZWQpLCBhbmQgIGkvbyBtYW5hZ2VtZW50IGhhdmUgIGJlZW4gc2ltcGxpZmllZCBncmVhdGx5ICBhcyBhCiAgICAgIHJlc3VsdC4gIFN0cmVhbXMgYXJlICBkZWZpbmVkIHRocm91Z2ggIEZUX1N0cmVhbSBvYmplY3RzLCAgd2hpY2gKICAgICAgY2FuIGJlIGVpdGhlciBtZW1vcnktYmFzZWQgb3IgZGlzay1iYXNlZC4KCiAgICAgIE5vdGUgdGhhdCAgZWFjaCBmYWNlICBoYXMgaXRzIG93biAgc3RyZWFtLCB3aGljaCBpcyAgY2xvc2VkIG9ubHkKICAgICAgd2hlbiAgdGhlICBmYWNlIG9iamVjdCAgaXMgIGRlc3Ryb3llZC4gIEhlbmNlLCAgYSBmdW5jdGlvbiAgbGlrZQogICAgICBUVF9GbHVzaF9GYWNlIGluIDEueCBjYW5ub3QgYmUgZGlyZWN0bHkgIHN1cHBvcnRlZC4gIEhvd2V2ZXIsIGlmCiAgICAgIHlvdSByZWFsbHkgbmVlZCBzb21ldGhpbmcgbGlrZSAgdGhpcywgeW91IGNhbiBlYXNpbHkgdGFpbG9yIHlvdXIKICAgICAgb3duIHN0cmVhbXMgIHRvIGFjaGlldmUgdGhlIHNhbWUgIGZlYXR1cmUgYXQgYSAgbG93ZXIgbGV2ZWwgKGFuZAogICAgICB1c2UgRlRfT3Blbl9GYWNlIGluc3RlYWQgb2YgRlRfTmV3X0ZhY2UgdG8gY3JlYXRlIHRoZSBmYWNlKS4KCiAgU2VlIHRoZSBmaWxlICAiaW5jbHVkZS9mdHN5c3RlbS5oIiBmb3IgbW9yZSBkZXRhaWxzLCBhcyAgd2VsbCBhcyB0aGUKICBpbXBsZW1lbnRhdGlvbnMgZm91bmQgaW4gImNvbmZpZy91bml4IiBhbmQgImNvbmZpZy9hbnNpIi4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb250IERyaXZlcnM6CgogIFRoZSAgRm9udCBEcml2ZXIgIGludGVyZmFjZSBoYXMgIGJlZW4gbW9kaWZpZWQgIGluIG9yZGVyICB0byBzdXBwb3J0CiAgZXh0ZW5zaW9ucyAmIHZlcnNpb25pbmcuCgoKICBUaGUgIGxpc3Qgb2YgIHRoZSBmb250ICBkcml2ZXJzIHRoYXQgIGFyZSBzdGF0aWNhbGx5ICBsaW5rZWQgIHRvIHRoZQogIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lIGlzICBtYW5hZ2VkIHRocm91Z2ggYSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCiAgY2FsbGVkIGBjb25maWcvPHBsYXRmb3JtPi9mdG1vZHVsZS5oJy4KCiAgVGhpcyAgZmlsZSBpcyAgYXV0b2dlbmVyYXRlZCAgd2hlbiAgaW52b2tpbmcgIGBtYWtlIG1vZHVsZXMnLiAgIFRoaXMKICB0YXJnZXQgIHdpbGwgIHBhcnNlICBhbGwgIHN1Yi1kaXJlY3RvcmllcyAgb2YgICdzcmMnLCBsb29raW5nICBmb3IgYQogICJtb2R1bGUubWsiIHJ1bGVzICBmaWxlLCB1c2VkICB0byBkZXNjcmliZSAgdGhlIGRyaXZlciB0byAgdGhlIGJ1aWxkCiAgc3lzdGVtLgoKICBIZW5jZSwgb25lICBzaG91bGQgY2FsbCAgYG1ha2UgbW9kdWxlcycgZWFjaCAgdGltZSBhIGZvbnQgIGRyaXZlciBpcwogIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgYHNyYycgZGlyZWN0b3J5LgoKICBGaW5hbGx5LCB0aGlzICB2ZXJzaW9uICBwcm92aWRlcyAgYSAicHNldWRvLWRyaXZlciIgIGluICBgc3JjL3NmbnQnLgogIFRoaXMgIGRyaXZlciAgZG9lc24ndCAgc3VwcG9ydCAgZm9udCAgZmlsZXMgIGRpcmVjdGx5LCBidXQgIHByb3ZpZGVzCiAgc2VydmljZXMgdXNlZCBieSBhbGwgVHJ1ZVR5cGUtbGlrZSBmb250IGRyaXZlcnMuICBIZW5jZSwgaXRzIGNvZGUgaXMKICBzaGFyZWQgYmV0d2VlbiAgdGhlIFRydWVUeXBlICYgT3BlblR5cGUgIGZvbnQgZm9ybWF0cywgIGFuZCBwb3NzaWJseQogIG1vcmUgZm9ybWF0cyB0byBjb21lIGlmIHdlJ3JlIGx1Y2t5Li4KCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpFeHRlbnNpb25zIHN1cHBvcnQ6CgogIFRoZSBleHRlbnNpb25zIHN1cHBvcnQgaXMgaW5zcGlyZWQgYnkgdGhlIG9uZSBmb3VuZCBpbiAxLnguCgogIE5vdywgZWFjaCBmb250IGRyaXZlciBoYXMgIGl0cyBvd24gImV4dGVuc2lvbiByZWdpc3RyeSIsIHdoaWNoIGxpc3RzCiAgd2hpY2ggZXh0ZW5zaW9ucyAgYXJlIGF2YWlsYWJsZSAgZm9yIHRoZSBmb250ICBmYWNlcyBtYW5hZ2VkICBieSB0aGUKICBkcml2ZXIuCgogIEV4dGVuc2lvbiBpZHMgYXJlICBub3cgc3RyaW5ncywgcmF0aGVyIHRoYW4gNC1ieXRlICB0YWdzLCBhcyB0aGlzIGlzCiAgdXN1YWxseSBtb3JlIHJlYWRhYmxlLgoKICBFYWNoIGV4dGVuc2lvbiBoYXM6CiAgICAtIHNvbWUgZGF0YSwgYXNzb2NpYXRlZCB0byBlYWNoIGZhY2Ugb2JqZWN0CiAgICAtIGFuIGludGVyZmFjZSAodGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMpCgogIEFuIGV4dGVuc2lvbiAgdGhhdCBpcyBmb3JtYXQtc3BlY2lmaWMgc2hvdWxkICBzaW1wbHkgcmVnaXN0ZXIgaXRzZWxmCiAgdG8gdGhlIGNvcnJlY3QgZm9udCBkcml2ZXIuICBIZXJlIGlzIHNvbWUgZXhhbXBsZSBjb2RlOgoKICAgLy8gUmVnaXN0ZXJpbmcgYW4gZXh0ZW5zaW9ucwogICAvLwogICBGVF9FcnJvciAgRlRfSW5pdF9YWFhYX0V4dGVuc2lvbiggRlRfTGlicmFyeSAgbGlicmFyeSApCiAgIHsKICAgICBGVF9Ecml2ZXJJbnRlcmZhY2UqICB0dF9kcml2ZXI7CgogICAgIGRyaXZlciA9IEZUX0dldF9Ecml2ZXIoIGxpYnJhcnksICJ0cnVldHlwZSIgKTsKICAgICBpZiAoIWRyaXZlcikgcmV0dXJuIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7CgogICAgIHJldHVybiBGVF9SZWdpc3Rlcl9FeHRlbnNpb24oIGRyaXZlciwgJmV4dGVuc2lvbl9jbGFzcyApOwogICB9CgoKICAgLy8gSW1wbGVtZW50aW5nIHRoZSBleHRlbnNpb25zCiAgIC8vCiAgIEZUX0Vycm9yICBGVF9Qcm9jZWVkX0V4dGVuc2lvbl9YWFgoIEZUX0ZhY2UgIGZhY2UgKQogICB7CiAgICAgRlRfWFhYX0V4dGVuc2lvbiAgICAgICAgICAgIGV4dDsKICAgICBGVF9YWFhfRXh0ZW5zaW9uX0ludGVyZmFjZSAgZXh0X2ludGVyZmFjZTsKCiAgICAgZXh0ID0gRlRfR2V0X0V4dGVuc2lvbiggZmFjZSwgImV4dGVuc2lvbmlkIiwgJmV4dF9pbnRlcmZhY2UgKTsKICAgICBpZiAoIWV4dCkgcmV0dXJuIGVycm9yOwoKICAgICByZXR1cm4gZXh0X2ludGVyZmFjZS0+ZG9faXQoZXh0KTsKICAgfQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBieQpEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCgpUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgdGhlICBGcmVlVHlwZSAgcHJvamVjdCwgYW5kIG1heSAgb25seSBiZSAgdXNlZCwKbW9kaWZpZWQsICBhbmQgIGRpc3RyaWJ1dGVkICB1bmRlciAgdGhlICB0ZXJtcyBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0CmxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcwpmaWxlIHlvdSAgaW5kaWNhdGUgdGhhdCAgeW91IGhhdmUgIHJlYWQgdGhlICBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kICBhbmQKYWNjZXB0IGl0IGZ1bGx5LgoKCi0tLSBlbmQgb2YgQ0hBTkdFUyAtLS0K