LlwiCi5cIiAkWEZyZWU4NjogeGMvbGliL2ZvbnRjb25maWcvc3JjL2ZvbnRjb25maWcubWFuLHYgMS4yIDIwMDIvMDgvMDYgMTk6NTQ6MTAga2VpdGhwIEV4cCAkCi5cIgouXCIgQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgouXCIKLlwiIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwouXCIgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLlwiIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAouXCIgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwouXCIgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgouXCIgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0Ci5cIiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwouXCIgcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0Ci5cIiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgouXCIKLlwiIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCi5cIiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCi5cIiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCi5cIiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKLlwiIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLlwiIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLlwiIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi5cIgouZGUgVFEKLmJyCi5ucwouVFAgXFwkMQouLgouVEggRk9OVENPTkZJRyAzICJWZXJzaW9uIDEuMCIgIlhGcmVlODYiCgouU0ggTkFNRQpmb250Y29uZmlnIFwtIEZvbnQgY29uZmlndXJhdGlvbiBhbmQgY3VzdG9taXphdGlvbiBsaWJyYXJ5CgouU0ggU1lOT1BTSVMKLm5mCi5CICNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KLkIgI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgouZmkKLlNIIERFU0NSSVBUSU9OCi5CIEZvbnRjb25maWcKaXMgYSBsaWJyYXJ5IGRlc2lnbmVkIHRvIHByb3ZpZGUgc3lzdGVtLXdpZGUgZm9udCBjb25maWd1cmF0aW9uLApjdXN0b21pemF0aW9uIGFuZCBhcHBsaWNhdGlvbiBhY2Nlc3MuCgouU0ggRlVOQ1RJT05BTCBPVkVSVklFVwpGb250Y29uZmlnIGNvbnRhaW5zIHR3byBlc3NlbnRpYWwgbW9kdWxlcywgdGhlIGNvbmZpZ3VyYXRpb24gbW9kdWxlIHdoaWNoCmJ1aWxkcyBhbiBpbnRlcm5hbCBjb25maWd1cmF0aW9uIGZyb20gWE1MIGZpbGVzIGFuZCB0aGUgbWF0Y2hpbmcgbW9kdWxlCndoaWNoIGFjY2VwdHMgZm9udCBwYXR0ZXJucyBhbmQgcmV0dXJucyB0aGUgbmVhcmVzdCBtYXRjaGluZyBmb250LgoKLlNTIEZPTlQgQ09ORklHVVJBVElPTgpUaGUgY29uZmlndXJhdGlvbiBtb2R1bGUgY29uc2lzdHMgb2YgdGhlIEZjQ29uZmlnIGRhdGF0eXBlLCBsaWJleHBhdCBhbmQKRmNDb25maWdQYXJzZSB3aGljaCB3YWxrcyBvdmVyIGFuIFhNTCB0cmVlIGFuZCBhbW1lbmRzIGEgY29uZmlndXJhdGlvbiB3aXRoCmRhdGEgZm91bmQgd2l0aGluLiAgRnJvbSBhbiBleHRlcm5hbCBwZXJzcGVjdGl2ZSwgY29uZmlndXJhdGlvbiBvZiB0aGUKbGlicmFyeSBjb25zaXN0cyBvZiBnZW5lcmF0aW5nIGEgdmFsaWQgWE1MIHRyZWUgYW5kIGZlZWRpbmcgdGhhdCB0bwpGY0NvbmZpZ1BhcnNlLiAgVGhlIG9ubHkgb3RoZXIgbWVjaGFuaXNtIHByb3ZpZGVkIHRvIGFwcGxpY2F0aW9ucyBmb3IKY2hhbmdpbmcgdGhlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiBpcyB0byBhZGQgZm9udHMgYW5kIGRpcmVjdG9yaWVzIHRvIHRoZQpsaXN0IG9mIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGZvbnQgZmlsZXMuICAKLlAKVGhlIGludGVudCBpcyB0byBtYWtlIGZvbnQgY29uZmlndXJhdGlvbnMgcmVsYXRpdmVseSBzdGF0aWMsIGFuZCBzaGFyZWQgYnkKYXMgbWFueSBhcHBsaWNhdGlvbnMgYXMgcG9zc2libGUuICBJdCBpcyBob3BlZCB0aGF0IHRoaXMgd2lsbCBsZWFkIHRvIG1vcmUKc3RhYmxlIGZvbnQgc2VsZWN0aW9uIHdoZW4gcGFzc2luZyBuYW1lcyBmcm9tIG9uZSBhcHBsaWNhdGlvbiB0byBhbm90aGVyLgpYTUwgd2FzIGNob3NlbiBhcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3JtYXQgYmVjYXVzZSBpdCBwcm92aWRlcyBhIGZvcm1hdAp3aGljaCBpcyBlYXN5IGZvciBleHRlcm5hbCBhZ2VudHMgdG8gZWRpdCB3aGlsZSByZXRhaW5pbmcgdGhlIGNvcnJlY3QKc3RydWN0dXJlIGFuZCBzeW50YXguCi5QCkZvbnQgY29uZmlndXJhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGZvbnQgbWF0Y2hpbmc7IGFwcGxpY2F0aW9ucyBuZWVkaW5nIHRvCmRvIHRoZWlyIG93biBtYXRjaGluZyBjYW4gYWNjZXNzIHRoZSBhdmFpbGFibGUgZm9udHMgZnJvbSB0aGUgbGlicmFyeSBhbmQKcGVyZm9ybSBwcml2YXRlIG1hdGNoaW5nLiAgVGhlIGludGVudCBpcyB0byBwZXJtaXQgYXBwbGljYXRpb25zIHRvIHBpY2sgYW5kCmNob29zZSBhcHByb3ByaWF0ZSBmdW5jdGlvbmFsaXR5IGZyb20gdGhlIGxpYnJhcnkgaW5zdGVhZCBvZiBmb3JjaW5nIHRoZW0gdG8KY2hvb3NlIGJldHdlZW4gdGhpcyBsaWJyYXJ5IGFuZCBhIHByaXZhdGUgY29uZmlndXJhdGlvbiBtZWNoYW5pc20uICBUaGUgaG9wZQppcyB0aGF0IHRoaXMgd2lsbCBlbnN1cmUgdGhhdCBjb25maWd1cmF0aW9uIG9mIGZvbnRzIGZvciBhbGwgYXBwbGljYXRpb25zCmNhbiBiZSBjZW50cmFsaXplZCBpbiBvbmUgcGxhY2UuICBDZW50cmFsaXppbmcgZm9udCBjb25maWd1cmF0aW9uIHdpbGwgbWFrZQpzaW1wbGlmeSBhbmQgcmVndWxhcml6ZSBmb250IGluc3RhbGxhdGlvbiBhbmQgY3VzdG9taXphdGlvbi4KCi5TUyBGT05UIFBST1BFUlRJRVMKV2hpbGUgZm9udCBwYXR0ZXJucyBtYXkgY29udGFpbiBlc3NlbnRpYWxseSBhbnkgcHJvcGVydGllcywgdGhlcmUgYXJlIHNvbWUKd2VsbCBrbm93biBwcm9wZXJ0aWVzIHdpdGggYXNzb2NpYXRlZCB0eXBlcy4gIEZvbnRjb25maWcgdXNlcyBzb21lIG9mIHRoZXNlCnByb3BlcnRpZXMgZm9yIGZvbnQgbWF0Y2hpbmcgYW5kIGZvbnQgY29tcGxldGlvbi4gIE90aGVycyBhcmUgcHJvdmlkZWQgYXMgYQpjb252ZW5pZW5jZSBmb3IgdGhlIGFwcGxpY2F0aW9ucyByZW5kZXJpbmcgbWVjaGFuaXNtLgouc3AKLm5mCi50YSAxaSAyLjc1aSAzLjVpIDUuNWkKLmxjIFwoZW0KUHJvcGVydHkJQ1BQIHN5bWJvbAlUeXBlCURlc2NyaXB0aW9uCgEBAQEKZmFtaWx5CUZDX0ZBTUlMWQlTdHJpbmcJRm9udCBmYW1pbHkgbmFtZQpzdHlsZQlGQ19TVFlMRQlTdHJpbmcJRm9udCBzdHlsZS4gT3ZlcnJpZGVzIHdlaWdodCBhbmQgc2xhbnQKc2xhbnQJRkNfU0xBTlQJSW50CUl0YWxpYywgb2JsaXF1ZSBvciByb21hbgp3ZWlnaHQJRkNfV0VJR0hUCUludAlMaWdodCwgbWVkaXVtLCBkZW1pYm9sZCwgYm9sZCBvciBibGFjawpzaXplCUZDX1NJWkUJRG91YmxlCVBvaW50IHNpemUKYXNwZWN0CUZDX0FTUEVDVAlEb3VibGUJU3RyZXRjaGVzIGdseXBocyBob3Jpem9udGFsbHkgYmVmb3JlIGhpbnRpbmcKcGl4ZWxzaXplCUZDX1BJWEVMX1NJWkUJRG91YmxlCVBpeGVsIHNpemUKc3BhY2luZwlGQ19TUEFDSU5HCUludAlQcm9wb3J0aW9uYWwsIG1vbm9zcGFjZSBvciBjaGFyY2VsbApmb3VuZHJ5CUZDX0ZPVU5EUlkJU3RyaW5nCUZvbnQgZm91bmRyeSBuYW1lCmFudGlhbGlhcwlGQ19BTlRJQUxJQVMJQm9vbAlXaGV0aGVyIGdseXBocyBjYW4gYmUgYW50aWFsaWFzZWQKaGludGluZwlGQ19ISU5USU5HCUJvb2wJV2hldGhlciB0aGUgcmFzdGVyaXplciBzaG91bGQgdXNlIGhpbnRpbmcKdmVydGljYWxsYXlvdXQJRkNfVkVSVElDQUxfTEFZT1VUCUJvb2wJVXNlIHZlcnRpY2FsIGxheW91dAphdXRvaGludAlGQ19BVVRPSElOVAlCb29sCVVzZSBhdXRvaGludGVyIGluc3RlYWQgb2Ygbm9ybWFsIGhpbnRlcgpnbG9iYWxhZHZhbmNlCUZDX0dMT0JBTF9BRFZBTkNFCUJvb2wJVXNlIGZvbnQgZ2xvYmFsIGFkdmFuY2UgZGF0YQpmaWxlCUZDX0ZJTEUJU3RyaW5nCVRoZSBmaWxlbmFtZSBob2xkaW5nIHRoZSBmb250CmluZGV4CUZDX0lOREVYCUludAlUaGUgaW5kZXggb2YgdGhlIGZvbnQgd2l0aGluIHRoZSBmaWxlCmZ0ZmFjZQlGQ19GVF9GQUNFCUZUX0ZhY2UJVXNlIHRoZSBzcGVjaWZpZWQgRnJlZVR5cGUgZmFjZSBvYmplY3QKcmFzdGVyaXplcglGQ19SQVNURVJJWkVSCVN0cmluZwlXaGljaCByYXN0ZXJpemVyIGlzIGluIHVzZQpvdXRsaW5lCUZDX09VVExJTkUJQm9vbAlXaGV0aGVyIHRoZSBnbHlwaHMgYXJlIG91dGxpbmVzCnNjYWxhYmxlCUZDX1NDQUxBQkxFCUJvb2wJV2hldGhlciBnbHlwaHMgY2FuIGJlIHNjYWxlZApzY2FsZQlGQ19TQ0FMRQlEb3VibGUJU2NhbGUgZmFjdG9yIGZvciBwb2ludC0+cGl4ZWwgY29udmVyc2lvbnMKZHBpCUZDX0RQSQlEb3VibGUJVGFyZ2V0IGRvdHMgcGVyIGluY2gKcmdiYQlGQ19SR0JBCUludAlyZ2IsIGJnciwgdnJnYiwgdmJnciAtIHN1YnBpeGVsIGdlb21ldHJ5Cm1pbnNwYWNlCUZDX01JTlNQQUNFCUJvb2wJRWxpbWluYXRlIGxlYWRpbmcgZnJvbSBsaW5lIHNwYWNpbmcKY2hhcnNldAlGQ19DSEFSU0VUCUNoYXJTZXQJVW5pY29kZSBjaGFycyBlbmNvZGVkIGJ5IHRoZSBmb250CmxhbmcJRkNfTEFORwlTdHJpbmcJTGlzdCBvZiBSRkMtMzA2Ni1zdHlsZSBsYW5ndWFnZXMgdGhpcyBmb250IHN1cHBvcnRzCi5EVAouZmkKCi5TUyBGT05UIE1BVENISU5HCkZvbnRjb25maWcgcGVyZm9ybXMgbWF0Y2hpbmcgYnkgbWVhc3VyaW5nIHRoZSBkaXN0YW5jZSBmcm9tIGEgcHJvdmlkZWQKcGF0dGVybiB0byBhbGwgb2YgdGhlIGF2YWlsYWJsZSBmb250cyBpbiB0aGUgc3lzdGVtLiAgVGhlIGNsb3Nlc3QgbWF0Y2hpbmcKZm9udCBpcyBzZWxlY3RlZC4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgZm9udCB3aWxsIGFsd2F5cyBiZSByZXR1cm5lZCwgYnV0CmRvZXNuJ3QgZW5zdXJlIHRoYXQgaXQgaXMgYW55dGhpbmcgbGlrZSB0aGUgcmVxdWVzdGVkIHBhdHRlcm4uCi5QCkZvbnQgbWF0Y2hpbmcgc3RhcnRzIHdpdGggYW4gYXBwbGljYXRpb24gY29uc3RydWN0ZWQgcGF0dGVybi4gIFRoZSBkZXNpcmVkCmF0dHJpYnV0ZXMgb2YgdGhlIHJlc3VsdGluZyBmb250IGFyZSBjb2xsZWN0ZWQgdG9nZXRoZXIgaW4gYW4gRmNQYXR0ZXJuCm9iamVjdC4gIEVhY2ggcHJvcGVydHkgb2YgdGhlIHBhdHRlcm4gY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUgdmFsdWVzOyB0aGVzZQphcmUgbGlzdGVkIGluIHByaW9yaXR5IG9yZGVyOyBtYXRjaGVzIGVhcmxpZXIgaW4gdGhlIGxpc3QgYXJlIGNvbnNpZGVyZWQKImNsb3NlciIgdGhhbiBtYXRjaGVzIGxhdGVyIGluIHRoZSBsaXN0LgouUApUaGUgaW5pdGlhbCBwYXR0ZXJuIGlzIG1vZGlmaWVkIGJ5IGFwcGx5aW5nIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zCnNwZWNpZmljIHRvIHBhdHRlcm5zIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uOyBlYWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2gKcHJlZGljYXRlIGFuZCBhIHNldCBvZiBlZGl0aW5nIG9wZXJhdGlvbnMuICBUaGV5IGFyZSBleGVjdXRlZCBpbiB0aGUgb3JkZXIKdGhleSBhcHBlYXJlZCBpbiB0aGUgY29uZmlndXJhdGlvbi4gIEVhY2ggbWF0Y2ggY2F1c2VzIHRoZSBhc3NvY2lhdGVkCnNlcXVlbmNlIG9mIGVkaXRpbmcgb3BlcmF0aW9ucyB0byBiZSBhcHBsaWVkLgouUApBZnRlciB0aGUgcGF0dGVybiBoYXMgYmVlbiBlZGl0ZWQsIGEgc2VxdWVuY2Ugb2YgZGVmYXVsdCBzdWJzdGl0dXRpb25zIGFyZQpwZXJmb3JtZWQgdG8gY2Fub25pY2FsaXplIHRoZSBzZXQgb2YgYXZhaWxhYmxlIHByb3BlcnRpZXM7IHRoaXMgYXZvaWRzIHRoZQpuZWVkIGZvciB0aGUgbG93ZXIgbGF5ZXJzIHRvIGNvbnN0YW50bHkgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdmFyaW91cwpmb250IHByb3BlcnRpZXMgZHVyaW5nIHJlbmRlcmluZy4KLlAKVGhlIGNhbm9uaWNhbCBmb250IHBhdHRlcm4gaXMgZmluYWxseSBtYXRjaGVkIGFnYWluc3QgYWxsIGF2YWlsYWJsZSBmb250cy4KVGhlIGRpc3RhbmNlIGZyb20gdGhlIHBhdHRlcm4gdG8gdGhlIGZvbnQgaXMgbWVhc3VyZWQgZm9yIGVhY2ggb2Ygc2V2ZXJhbApwcm9wZXJ0aWVzOiBmb3VuZHJ5LCBjaGFyc2V0LCBmYW1pbHksIGxhbmcsIHNwYWNpbmcsIHBpeGVsc2l6ZSwgc3R5bGUsCnNsYW50LCB3ZWlnaHQsIGFudGlhbGlhcywgcmFzdGVyaXplciBhbmQgb3V0bGluZS4gIFRoaXMgbGlzdCBpcyBpbiBwcmlvcml0eQpvcmRlciAtLSByZXN1bHRzIG9mIGNvbXBhcmluZyBlYXJsaWVyIGVsZW1lbnRzIG9mIHRoaXMgbGlzdCB3ZWlnaCBtb3JlCmhlYXZpbHkgdGhhbiBsYXRlciBlbGVtZW50cy4KLlAKVGhlcmUgaXMgb25lIHNwZWNpYWwgY2FzZSB0byB0aGlzIHJ1bGU7IGZhbWlseSBuYW1lcyBhcmUgc3BsaXQgaW50byB0d28KYmluZGluZ3M7IHN0cm9uZyBhbmQgd2Vhay4gIFN0cm9uZyBmYW1pbHkgbmFtZXMgYXJlIGdpdmVuIGdyZWF0ZXIgcHJlY2VkZW5jZQppbiB0aGUgbWF0Y2ggdGhhbiBsYW5nIGVsZW1lbnRzIHdoaWxlIHdlYWsgZmFtaWx5IG5hbWVzIGFyZSBnaXZlbiBsb3dlcgpwcmVjZWRlbmNlIHRoYW4gbGFuZyBlbGVtZW50cy4gIFRoaXMgcGVybWl0cyB0aGUgZG9jdW1lbnQgbGFuZ3VhZ2UgdG8gZHJpdmUKZm9udCBzZWxlY3Rpb24gd2hlbiBhbnkgZG9jdW1lbnQgc3BlY2lmaWVkIGZvbnQgaXMgdW5hdmFpbGFibGUuCi5QClRoZSBwYXR0ZXJuIHJlcHJlc2VudGluZyB0aGF0IGZvbnQgaXMgYXVnbWVudGVkIHRvIGluY2x1ZGUgYW55IHByb3BlcnRpZXMKZm91bmQgaW4gdGhlIHBhdHRlcm4gYnV0IG5vdCBmb3VuZCBpbiB0aGUgZm9udCBpdHNlbGY7IHRoaXMgcGVybWl0cyB0aGUKYXBwbGljYXRpb24gdG8gcGFzcyByZW5kZXJpbmcgaW5zdHJ1Y3Rpb25zIG9yIGFueSBvdGhlciBkYXRhIHRocm91Z2ggdGhlCm1hdGNoaW5nIHN5c3RlbS4gIEZpbmFsbHksIHRoZSBsaXN0IG9mIGVkaXRpbmcgaW5zdHJ1Y3Rpb25zIHNwZWNpZmljIHRvCmZvbnRzIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZSBhcHBsaWVkIHRvIHRoZSBwYXR0ZXJuLiAgVGhpcyBtb2RpZmllZApwYXR0ZXJuIGlzIHJldHVybmVkIHRvIHRoZSBhcHBsaWNhdGlvbi4KLlAKVGhlIHJldHVybiB2YWx1ZSBjb250YWlucyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBhbmQgcmFzdGVyaXplIHRoZQpmb250LCBpbmNsdWRpbmcgdGhlIGZpbGUgbmFtZSwgcGl4ZWwgc2l6ZSBhbmQgb3RoZXIgcmVuZGVyaW5nIGRhdGEuICBBcwpub25lIG9mIHRoZSBpbmZvcm1hdGlvbiBpbnZvbHZlZCBwZXJ0YWlucyB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSwKYXBwbGljYXRpb25zIGFyZSBmcmVlIHRvIHVzZSBhbnkgcmFzdGVyaXphdGlvbiBlbmdpbmUgb3IgZXZlbiB0byB0YWtlCnRoZSBpZGVudGlmaWVkIGZvbnQgZmlsZSBhbmQgYWNjZXNzIGl0IGRpcmVjdGx5LgouUApUaGUgbWF0Y2gvZWRpdCBzZXF1ZW5jZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHBlcmZvcm1lZCBpbiB0d28gcGFzc2VzCmJlY2F1c2UgdGhlcmUgYXJlIGVzc2VudGlhbGx5IHR3byBkaWZmZXJlbnQgb3BlcmF0aW9ucyBuZWNlc3NhcnkgLS0gdGhlCmZpcnN0IGlzIHRvIG1vZGlmeSBob3cgZm9udHMgYXJlIHNlbGVjdGVkOyBhbGlhc2luZyBmYW1pbGllcyBhbmQgYWRkaW5nCnN1aXRhYmxlIGRlZmF1bHRzLiAgVGhlIHNlY29uZCBpcyB0byBtb2RpZnkgaG93IHRoZSBzZWxlY3RlZCBmb250cyBhcmUKcmFzdGVyaXplZC4gIFRob3NlIG11c3QgYXBwbHkgdG8gdGhlIHNlbGVjdGVkIGZvbnQsIG5vdCB0aGUgb3JpZ2luYWwgcGF0dGVybgphcyBmYWxzZSBtYXRjaGVzIHdpbGwgb2Z0ZW4gb2NjdXIuCi5TUyBGT05UIExJU1QgTUFUQ0hJTkcKLlAKV2hpbGUgbWFueSBhcHBsaWNhdGlvbnMgd2FudCB0byBsb2NhdGUgYSBzaW5nbGUgZm9udCBiZXN0IG1hdGNoaW5nIHRoZWlyCnNlYXJjaCBjcml0ZXJpYSwgb3RoZXIgYXBwbGljYXRpb25zIG5lZWQgdG8gYnVpbGQgYSBzZXQgb2YgZm9udHMgd2hpY2ggY2FuCmJlIHVzZWQgdG8gcHJlc2VudCBhbnkgVW5pY29kZSBkYXRhLiAgRm9udGNvbmZpZyBwcm92aWRlcyBhbiBBUEkgdG8gZ2VuZXJhdGUKYSBsaXN0IHNvcnRlZCBieSB0aGUgbmVhcm5lc3Mgb2YgZWFjaCBmb250IHRvIHRoZSBwYXR0ZXJuLiAgRXZlcnkgZm9udCBpbgp0aGUgc3lzdGVtIGlzIGNvbnNpZGVyZWQsIHRoZSBiZXN0IG1hdGNoaW5nIGZvbnRzIGFyZSBwbGFjZWQgZmlyc3QuICBUaGUKYXBwbGljYXRpb24gdGhlbiBjYW4gc2VsZWN0IHdoZXRoZXIgdGhlIHJlbWFpbmluZyBmb250cyBhcmUgdW5jb25kaXRpb25hbGx5IAppbmNsdWRlZCBpbiB0aGUgbGlzdCwgb3Igd2hldGhlciB0aGV5IGFyZSBpbmNsdWRlZCBvbmx5IGlmIHRoZXkgY292ZXIKcG9ydGlvbnMgb2YgVW5pY29kZSBub3QgY292ZXJlZCBieSBhbnkgb2YgdGhlIHByZWNlZWRpbmcgZm9udHMuCi5QClRoZSBsaXN0IHJlc3VsdGluZyBmcm9tIHRoaXMgbWF0Y2ggaXMgcmVwcmVzZW50ZWQgYnkgcmVmZXJlbmNlcyB0byB0aGUKb3JpZ2luYWwgZm9udCBwYXR0ZXJucyBhbmQgc28gY29uc3VtZXMgdmVyeSBsaXR0bGUgbWVtb3J5LiAgVXNpbmcgYSBsaXN0CmVudHJ5IGludm9sdmVzIGNyZWF0aW5nIGEgcGF0dGVybiB3aGljaCBjb21iaW5lcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKZm9udCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIGFuZCBleGVjdXRpbmcgdGhlIGZvbnQKc3Vic3RpdHV0aW9ucy4KLlNTIEZPTlQgTkFNRVMKRm9udGNvbmZpZyBwcm92aWRlcyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gZm9yIHBhdHRlcm5zIHRoYXQgdGhlIGxpYnJhcnkKY2FuIGJvdGggYWNjZXB0IGFuZCBnZW5lcmF0ZS4gIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiB0aHJlZSBwYXJ0cywgZmlyc3QgYQpsaXN0IG9mIGZhbWlseSBuYW1lcywgc2Vjb25kIGEgbGlzdCBvZiBwb2ludCBzaXplcyBhbmQgZmluYWxseSBhIGxpc3Qgb2YKYWRkaXRpb25hbCBwcm9wZXJ0aWVzOgoubmYKCTxmYW1pbGllcz4tPHBvaW50IHNpemVzPjo8bmFtZTE+PTx2YWx1ZXMxPjo8bmFtZTI+PTx2YWx1ZXMyPi4uLgouZmkKVmFsdWVzIGluIGEgbGlzdCBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLiAgVGhlIG5hbWUgbmVlZG4ndCBpbmNsdWRlIGVpdGhlcgpmYW1pbGllcyBvciBwb2ludCBzaXplczsgdGhleSBjYW4gYmUgZWxpZGVkLiAgSW4gYWRkaXRpb24sIHRoZXJlIGFyZQpzeW1ib2xpYyBjb25zdGFudHMgdGhhdCBzaW11bHRhbmVvdXNseSBpbmRpY2F0ZSBib3RoIGEgbmFtZSBhbmQgYSB2YWx1ZS4KSGVyZSBhcmUgc29tZSBleGFtcGxlczoKLnNwCi5uZgoudGEgMWkgM2kKCVRpbWVzLTEyCTEyIHBvaW50IFRpbWVzIFJvbWFuCglUaW1lcy0xMjpib2xkCTEyIHBvaW50IFRpbWVzIEJvbGQKCUNvdXJpZXI6aXRhbGljCUNvdXJpZXIgSXRhbGljIGluIHRoZSBkZWZhdWx0IHNpemUKCU1vbm9zcGFjZTptYXRyaXg9MSAuMSAwIDEJVGhlIHVzZXJzIHByZWZlcnJlZCBtb25vc3BhY2UgZm9udAoJCXdpdGggYXJ0aWZpY2lhbCBvYmxpcXVpbmcKLmZpCi5EVAoKLlNIIExBTkcgVEFHUwouUApFYWNoIGZvbnQgaW4gdGhlIGRhdGFiYXNlIGNvbnRhaW5zIGEgbGlzdCBvZiBsYW5ndWFnZXMgaXQgc3VwcG9ydHMuICBUaGlzIGlzCmNvbXB1dGVkIGJ5IGNvbXBhcmluZyB0aGUgVW5pY29kZSBjb3ZlcmFnZSBvZiB0aGUgZm9udCB3aXRoIHRoZSBvcnRob2dyYXBoeQpvZiBlYWNoIGxhbmd1YWdlLiAgTGFuZ3VhZ2VzIGFyZSB0YWdnZWQgdXNpbmcgYW4gUkZDLTMwNjYgY29tcGF0aWJsZSBuYW1pbmcKYW5kIG9jY3VyIGluIHR3byBwYXJ0cyAtLSB0aGUgSVNPNjM5IGxhbmd1YWdlIHRhZyBmb2xsb3dlZCBhIGh5cGhlbiBhbmQgdGhlbgpieSB0aGUgSVNPIDMxNjYgY291bnRyeSBjb2RlLiAgVGhlIGh5cGhlbiBhbmQgY291bnRyeSBjb2RlIG1heSBiZSBlbGlkZWQuCgouUApGb250Y29uZmlnIGhhcyBvcnRob2dyYXBoaWVzIGZvciBzZXZlcmFsIGxhbmd1YWdlcyBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgpObyBwcm92aXNpb24gaGFzIGJlZW4gbWFkZSBmb3IgYWRkaW5nIG5ldyBvbmVzIGFzaWRlIGZyb20gcmVidWlsZGluZyB0aGUKbGlicmFyeS4gIEl0IGN1cnJlbnRseSBzdXBwb3J0cyAxMjIgb2YgdGhlIDEzOSBsYW5ndWFnZXMgbmFtZWQgaW4gSVNPIDYzOS0xLAoxNDEgb2YgdGhlIGxhbmd1YWdlcyB3aXRoIHR3by1sZXR0ZXIgY29kZXMgZnJvbSBJU08gNjM5LTIgYW5kIGFub3RoZXIgMzAKbGFuZ3VhZ2VzIHdpdGggb25seSB0aHJlZS1sZXR0ZXIgY29kZXMuCgouU0ggREFUQVRZUEVTCgouVFAKLkIgRmNDaGFyOAouVFEKLkIgRmNDaGFyMTYKLlRRCi5CIEZjQ2hhcjMyCi5UUQouQiBGY0Jvb2wKVGhlc2UgYXJlIHByaW1pdGl2ZSBkYXRhdHlwZXM7IHRoZSBGY0NoYXIqIHR5cGVzIGhvbGQgcHJlY2lzZWx5IHRoZSBudW1iZXIKb2YgYml0cyBzdGF0ZWQgKGlmIHN1cHBvcnRlZCBieSB0aGUgQyBpbXBsZW1lbnRhdGlvbikuICBGY0Jvb2wgaG9sZHMKb25lIG9mIHR3byBDUFAgc3ltYm9sczogRmNGYWxzZSBvciBGY1RydWUuCgouVFAKLkIgRmNNYXRyaXgKQW4gRmNNYXRyaXggaG9sZHMgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLCB1c3VhbGx5IHVzZWQgdG8gcmVzaGFwZSBnbHlwaHMuCkEgc21hbGwgc2V0IG9mIG1hdHJpeCBvcGVyYXRpb25zIGFyZSBwcm92aWRlZCB0byBtYW5pcHVsYXRlIHRoZXNlLgouc3AKLm5mCgl0eXBlZGVmIHN0cnVjdCBfRmNNYXRyaXggewoJCWRvdWJsZSB4eCwgeHksIHl4LCB5eTsKCX0gRmNNYXRyaXg7Ci5maQoKLlRQCi5CIEZjQ2hhclNldApBbiBGY0NoYXJTZXQgaXMgYW4gYWJzdHJhY3QgdHlwZSB0aGF0IGhvbGRzIHRoZSBzZXQgb2YgZW5jb2RlZCB1bmljb2RlIGNoYXJzCmluIGEgZm9udC4gIE9wZXJhdGlvbnMgdG8gYnVpbGQgYW5kIGNvbXBhcmUgdGhlc2Ugc2V0cyBhcmUgcHJvdmlkZWQuCgouVFAKLkIgRmNUeXBlClRhZ3MgdGhlIGtpbmQgb2YgZGF0YSBzdG9yZWQgaW4gYW4gRmNWYWx1ZS4KCi5UUAouQiBGY1ZhbHVlCkFuIEZjVmFsdWUgb2JqZWN0IGhvbGRzIGEgc2luZ2xlIHZhbHVlIHdpdGggb25lIG9mIGEgbnVtYmVyIG9mIGRpZmZlcmVudAp0eXBlcy4gIFRoZSAndHlwZScgdGFnIGluZGljYXRlcyB3aGljaCBtZW1iZXIgaXMgdmFsaWQuCi5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlIHsKCQlGY1R5cGUgdHlwZTsKCQl1bmlvbiB7CgkJCWNvbnN0IEZjQ2hhcjggKnM7CgkJCWludCBpOwoJCQlGY0Jvb2wgYjsKCQkJZG91YmxlIGQ7CgkJCWNvbnN0IEZjTWF0cml4ICptOwoJCQljb25zdCBGY0NoYXJTZXQgKmM7CgkJfSB1OwoJfSBGY1ZhbHVlOwouZmkKLlAKLnRhIDFpIDJpIDNpIDRpCi5uZgoubGMgXChlbQoJdHlwZQlVbmlvbiBtZW1iZXIJRGF0YXR5cGUKCQEBAQoJRmNUeXBlVm9pZAkobm9uZSkJKG5vbmUpCglGY1R5cGVJbnRlZ2VyCWkJaW50CglGY1R5cGVEb3VibGUJZAlkb3VibGUKCUZjVHlwZVN0cmluZwlzCWNoYXIgKgoJRmNUeXBlQm9vbAliCWIKCUZjVHlwZU1hdHJpeAltCUZjTWF0cml4ICoKCUZjVHlwZUNoYXJTZXQJYwlGY0NoYXJTZXQgKgouZmkKLkRUCi5UUAouQiBGY1BhdHRlcm4KaG9sZHMgYSBzZXQgb2YgbmFtZXMgd2l0aCBhc3NvY2lhdGVkIHZhbHVlIGxpc3RzOyBlYWNoIG5hbWUgcmVmZXJzIHRvIGEKcHJvcGVydHkgb2YgYSBmb250LiAgRmNQYXR0ZXJucyBhcmUgdXNlZCBhcyBpbnB1dHMgdG8gdGhlIG1hdGNoaW5nIGNvZGUgYXMKd2VsbCBhcyBob2xkaW5nIGluZm9ybWF0aW9uIGFib3V0IHNwZWNpZmljIGZvbnRzLiAgRWFjaCBwcm9wZXJ0eSBjYW4gaG9sZApvbmUgb3IgbW9yZSB2YWx1ZXM7IGNvbnZlbnRpb25hbGx5IGFsbCBvZiB0aGUgc2FtZSB0eXBlLCBhbHRob3VnaCB0aGUKaW50ZXJmYWNlIGRvZXNuJ3QgZGVtYW5kIHRoYXQuCgouVFAKLkIgRmNGb250U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY0ZvbnRTZXQgewoJCWludCBuZm9udDsKCQlpbnQgc2ZvbnQ7CgkJRmNQYXR0ZXJuICoqZm9udHM7Cgl9IEZjRm9udFNldDsKLmZpCQpBbiBGY0ZvbnRTZXQgY29udGFpbnMgYSBsaXN0IG9mIEZjUGF0dGVybnMuICBJbnRlcm5hbGx5IGZvbnRjb25maWcgdXNlcyB0aGlzCmRhdGEgc3RydWN0dXJlIHRvIGhvbGQgc2V0cyBvZiBmb250cy4gIEV4dGVybmFsbHksIGZvbnRjb25maWcgcmV0dXJucyB0aGUKcmVzdWx0cyBvZiBsaXN0aW5nIGZvbnRzIGluIHRoaXMgZm9ybWF0LiAgJ25mb250JyBob2xkcyB0aGUgbnVtYmVyIG9mCnBhdHRlcm5zIGluIHRoZSAnZm9udHMnIGFycmF5OyAnc2ZvbnQnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhhdAphcnJheS4KCi5UUAouQiBGY1N0clNldAouQiBGY1N0ckxpc3QKRmNTdHJTZXQgaG9sZHMgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gYW5kIGVudW1lcmF0ZWQuCkl0cyB1bmlxdWUgY2hhcmFjdGVyaXN0aWMgaXMgdGhhdCB0aGUgZW51bWVyYXRpb24gd29ya3MgZXZlbiB3aGlsZSBzdHJpbmdzCmFyZSBhcHBlbmRlZCBkdXJpbmcgZW51bWVyYXRpb24uICBGY1N0ckxpc3QgaXMgdXNlZCBkdXJpbmcgZW51bWVyYXRpb24gdG8Kc2FmZWx5IGFuZCBjb3JyZWN0bHkgd2FsayB0aGUgbGlzdCBvZiBzdHJpbmdzIGV2ZW4gd2hpbGUgdGhhdCBsaXN0IGlzIGVkaXRlZAppbiB0aGUgbWlkZGxlIG9mIGVudW1lcmF0aW9uLgoKLlRQCi5CIEZjT2JqZWN0U2V0Ci5zcAoubmYKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFNldCB7CgkJaW50IG5vYmplY3Q7CgkJaW50IHNvYmplY3Q7CgkJY29uc3QgY2hhciAqKm9iamVjdHM7Cgl9IEZjT2JqZWN0U2V0OwouZmkKLnNwCmhvbGRzIGEgc2V0IG9mIG5hbWVzIGFuZCBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggZmllbGRzIGZyb20gZm9udHMgYXJlCnBsYWNlZCBpbiB0aGUgdGhlIGxpc3Qgb2YgcmV0dXJuZWQgcGF0dGVybnMgd2hlbiBsaXN0aW5nIGZvbnRzLgoKLlRQCi5CIEZjT2JqZWN0VHlwZQouc3AKCXR5cGVkZWYgc3RydWN0IF9GY09iamVjdFR5cGUgewoJCWNvbnN0IGNoYXIgKm9iamVjdDsKCQlGY1R5cGUgdHlwZTsKCX0gRmNPYmplY3RUeXBlOwouZmkKbWFya3MgdGhlIHR5cGUgb2YgYSBwYXR0ZXJuIGVsZW1lbnQgZ2VuZXJhdGVkIHdoZW4gcGFyc2luZyBmb250IG5hbWVzLgpBcHBsaWNhdGlvbnMgY2FuIGFkZCBuZXcgb2JqZWN0IHR5cGVzIHNvIHRoYXQgZm9udCBuYW1lcyBtYXkgY29udGFpbiB0aGUgbmV3CmVsZW1lbnRzLgoKLlRQCi5CIEZjQ29uc3RhbnQKLnNwCgl0eXBlZGVmIHN0cnVjdCBfRmNDb25zdGFudCB7CgkgICAgY29uc3QgRmNDaGFyOCAqbmFtZTsKCSAgICBjb25zdCBjaGFyICpvYmplY3Q7CgkgICAgaW50IHZhbHVlOwoJfSBGY0NvbnN0YW50OwouZmkKUHJvdmlkZXMgZm9yIHN5bWJvbGljIGNvbnN0YW50cyBmb3IgbmV3IHBhdHRlcm4gZWxlbWVudHMuICBXaGVuICduYW1lJyBpcwpzZWVuIGluIGEgZm9udCBuYW1lLCBhbiAnb2JqZWN0JyBlbGVtZW50IGlzIGNyZWF0ZWQgd2l0aCB2YWx1ZSAndmFsdWUnLgoKLlRQCi5CIEZjQmxhbmtzCmhvbGRzIGEgbGlzdCBvZiBVbmljb2RlIGNoYXJzIHdoaWNoIGFyZSBleHBlY3RlZCB0byBiZSBibGFuazsgdW5leHBlY3RlZGx5CmJsYW5rIGNoYXJzIGFyZSBhc3N1bWVkIHRvIGJlIGludmFsaWQgYW5kIGFyZSBlbGlkZWQgZnJvbSB0aGUgY2hhcnNldAphc3NvY2lhdGVkIHdpdGggdGhlIGZvbnQuCgouVFAKLkIgRmNGaWxlQ2FjaGUKaG9sZHMgdGhlIHBlci11c2VyIGNhY2hlIGluZm9ybWF0aW9uIGZvciB1c2Ugd2hpbGUgbG9hZGluZyB0aGUgZm9udApkYXRhYmFzZS4gVGhpcyBpcyBidWlsdCBhdXRvbWF0aWNhbGx5IGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHdoZW4KdGhhdCBpcyBsb2FkZWQuICBBcHBsaWNhdGlvbnMgbXVzdCBhbHdheXMgcGFzcyAnMCcgd2hlbiBvbmUgaXMgcmVxdWVzdGVkLgoKLlRQCi5CIEZjQ29uZmlnCmhvbGRzIGEgY29tcGxldGUgY29uZmlndXJhdGlvbiBvZiB0aGUgbGlicmFyeTsgdGhlcmUgaXMgb25lIGRlZmF1bHQKY29uZmlndXJhdGlvbiwgb3RoZXIgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gWE1MIGRhdGEgc3RydWN0dXJlcy4gIEFsbApwdWJsaWMgZW50cnkgcG9pbnRzIHRoYXQgbmVlZCBnbG9iYWwgZGF0YSBjYW4gdGFrZSBhbiBvcHRpb25hbCBGY0NvbmZpZyoKYXJndW1lbnQ7IHBhc3NpbmcgMCB1c2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBGY0NvbmZpZyBvYmplY3RzIGhvbGQgdHdvCnNldHMgb2YgZm9udHMsIHRoZSBmaXJzdCBjb250YWlucyB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIHRoZQpzZWNvbmQgc2V0IGhvbGRzIHRob3NlIGFkZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhdCBydW4tdGltZS4gIEludGVyZmFjZXMKdGhhdCBuZWVkIHRvIHJlZmVyZW5jZSBhIHBhcnRpY3VsYXQgc2V0IHVzZSBvbmUgb2YgdGhlIEZjU2V0TmFtZSBlbnVtZXJhdGVkCnZhbHVlcy4KCi5UUAouQiBGY1NldE5hbWUKU3BlY2lmaWVzIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgYXZhaWxhYmxlIGluIGEgY29uZmlndXJhdGlvbjsKRmNTZXRTeXN0ZW0gZm9yIHRob3NlIGZvbnRzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQKRmNTZXRBcHBsaWNhdGlvbiB3aGljaCBob2xkcyBmb250cyBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24uCgouVFAKLkIgRmNSZXN1bHQKVXNlZCBhcyBhIHJldHVybiB0eXBlIGZvciBmdW5jdGlvbnMgbWFuaXB1bGF0aW5nIEZjUGF0dGVybiBvYmplY3RzLgouUAoudGEgMWkgM2kgNGkKLmxjIFwoZW0KCVJlc3VsdCBjb2RlCU1lYW5pbmcKLmJyCgkBAQouYnIKCUZjUmVzdWx0TWF0Y2gJT2JqZWN0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQKLmJyCglGY1Jlc3VsdE5vTWF0Y2gJT2JqZWN0IGRvZXNuJ3QgZXhpc3QgYXQgYWxsCi5icgoJRmNSZXN1bHRUeXBlTWlzbWF0Y2gJT2JqZWN0IGV4aXN0cywgYnV0IHRoZSB0eXBlIGRvZXNuJ3QgbWF0Y2gKLmJyCglGY1Jlc3VsdE5vSWQJT2JqZWN0IGV4aXN0cywgYnV0IGhhcyBmZXdlciB2YWx1ZXMgdGhhbiBzcGVjaWZpZWQKLmJyCi5EVAoKLlRQCi5CIEZjQXRvbWljClVzZWQgZm9yIGxvY2tpbmcgYWNjZXNzIHRvIGNvbmZpZyBmaWxlcy4gIFByb3ZpZGVzIGEgc2FmZSB3YXkgdG8gdXBkYXRlCmNvbmZpZ3VyYXRpb24gZmlsZXMuCgouU0ggRlVOQ1RJT05TCgouU1MgRmNNYXRyaXgKRmNNYXRyaXggc3RydWN0dXJlcyBob2xkIGFuIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBpbiBtYXRyaXggZm9ybS4KLlRQCiNkZWZpbmUgRmNNYXRyaXhJbml0KG0pCSgobSktPnh4ID0gKG0pLT55eSA9IDEsIChtKS0+eHkgPSAobSktPnl4ID0gMCkKSW5pdGlhbGl6ZXMgYSBtYXRyaXggdG8gdGhlIGlkZW50aWZ5IHRyYW5zZm9ybWF0aW9uLgoKLlRQCkZjTWF0cml4ICpGY01hdHJpeENvcHkgKGNvbnN0IEZjTWF0cml4ICptYXQpCkFsbG9jYXRlcyBhIG5ldyBGY01hdHJpeCBhbmQgY29waWVzICdtYXQnIGludG8gaXQuCgouVFAKRmNCb29sIEZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKUmV0dXJucyBGY1RydWUgaWYgJ21hdDEnIGFuZCAnbWF0MicgYXJlIGVxdWFsLCBlbHNlIEZjRmFsc2UuCgouVFAKdm9pZCBGY01hdHJpeE11bHRpcGx5IChGY01hdHJpeCAqcmVzdWx0LCBjb25zdCBGY01hdHJpeCAqYSwgY29uc3QgRmNNYXRyaXggKmIpCk11bHRpcGxpZXMgJ2EnIGFuZCAnYicgdG9nZXRoZXIsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbgoncmVzdWx0Jy4gICdyZXN1bHQnIG1heSByZWZlciB0byB0aGUgc2FtIG1hdHJpeCBhcyBlaXRoZXIgJ2EnIG9yICdiJy4KCi5UUAp2b2lkIEZjTWF0cml4Um90YXRlIChGY01hdHJpeCAqbSwgZG91YmxlIGMsIGRvdWJsZSBzKQpJZiAnYycgaXMgY29zKGFuZ2xlKSBhbmQgJ3MnIGlzIHNpbihhbmdsZSksIEZjTWF0cml4Um90YXRlIHJvdGF0ZXMgdGhlCm1hdHJpeCBieSAnYW5nbGUnLgoKLlRQCnZvaWQgRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KQpTY2FsZXMgJ20nIGJ5ICdzeCcgaW4gdGhlIGhvcml6b250YWwgZGltZW5zaW9uIGFuZCAnc3knIGluIHRoZQp2ZXJ0aWNhbCBkaW1lbnNpb24uCgouVFAKdm9pZCBGY01hdHJpeFNoZWFyIChGY01hdHJpeCAqbSwgZG91YmxlIHNoLCBkb3VibGUgc3YpClNoZWFycyAnbScgYnkgJ3NoJyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb24gYW5kICdzdicgaW4gdGhlCnZlcnRpY2FsIGRpcmVjdGlvbi4KCi5TUyBGY0NoYXJTZXQKQW4gRmNDaGFyU2V0IGlzIGEgYm9vbGVhbiBhcnJheSBpbmRpY2F0aW5nIGEgc2V0IG9mIHVuaWNvZGUgY2hhcnMuICBUaG9zZQphc3NvY2lhdGVkIHdpdGggYSBmb250IGFyZSBtYXJrZWQgY29uc3RhbnQgYW5kIGNhbm5vdCBiZSBlZGl0ZWQuCkZjQ2hhclNldHMgbWF5IGJlIHJlZmVyZW5jZSBjb3VudGVkIGludGVybmFsbHkgdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbjsKdGhpcyBtYXkgYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgYXMgdGhlIHJlc3VsdCBvZiBGY0NoYXJTZXRDb3B5IG1heQpyZXR1cm4gaXQncyBhcmd1bWVudCwgYW5kIHRoYXQgQ2hhclNldCBtYXkgcmVtYWluIHVubW9kaWZpYWJsZS4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBGY0NoYXJTZXQgb2JqZWN0LgoKLlRQCnZvaWQgRmNDaGFyU2V0RGVzdHJveSAoRmNDaGFyU2V0ICpmY3MpCkZyZWVzIGFuIEZjQ2hhclNldCBvYmplY3QuCgouVFAKRmNCb29sIEZjQ2hhclNldEFkZENoYXIgKEZjQ2hhclNldCAqZmNzLCBGY0NoYXIzMiB1Y3M0KQpBZGRzIGEgc2luZ2xlIHVuaWNvZGUgY2hhciB0byB0aGUgc2V0LCByZXR1cm5pbmcgRmNGYWxzZSBvbgpmYWlsdXJlLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgYSBjb25zdGFudCBzZXQgb3IgZnJvbSBydW5uaW5nIG91dCBvZiBtZW1vcnkuCgouVFAKRmNDaGFyU2V0ICpGY0NoYXJTZXRDb3B5IChGY0NoYXJTZXQgKnNyYykKTWFrZXMgYSBjb3B5IG9mICdzcmMnOyBub3RlIHRoYXQgdGhpcyBtYXkgbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIG1vcmUgdGhhbgppbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiAnc3JjJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0RXF1YWwgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIHdoZXRoZXIgJ2EnIGFuZCAnYicgY29udGFpbiB0aGUgc2FtZSBzZXQgb2YgdW5pY29kZSBjaGFycy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldEludGVyc2VjdCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gYm90aCAnYScgYW5kICdiJy4KCi5UUApGY0NoYXJTZXQgKkZjQ2hhclNldFVuaW9uIChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYik7ClJldHVybnMgYSBzZXQgaW5jbHVkaW5nIG9ubHkgdGhvc2UgY2hhcnMgZm91bmQgaW4gZWl0aGVyICdhJyBvciAnYicuCgouVFAgCkZjQ2hhclNldCAqRmNDaGFyU2V0U3VidHJhY3QgKGNvbnN0IEZjQ2hhclNldCAqYSwgY29uc3QgRmNDaGFyU2V0ICpiKQpSZXR1cm5zIGEgc2V0IGluY2x1ZGluZyBvbmx5IHRob3NlIGNoYXJzIGZvdW5kIGluICdhJyBidXQgbm90ICdiJy4KCi5UUApGY0Jvb2wgRmNDaGFyU2V0SGFzQ2hhciAoY29uc3QgRmNDaGFyU2V0ICpmY3MsIEZjQ2hhcjMyIHVjczQpClJldHVybnMgd2hldGhlciAnZmNzJyBjb250YWlucyB0aGUgY2hhciAndWNzNCcuCgouVFAKRmNDaGFyMzIgRmNDaGFyU2V0Q291bnQgKGNvbnN0IEZjQ2hhclNldCAqYSkKUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuaWNvZGUgY2hhcnMgaW4gJ2EnLgoKLlRQCkZjQ2hhcjMyIEZjQ2hhclNldEludGVyc2VjdENvdW50IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJzIHRoYXQgYXJlIGluIGJvdGggJ2EnIGFuZCAnYicuCgouVFAKRmNDaGFyMzIgRmNDaGFyU2V0U3VidHJhY3RDb3VudCAoY29uc3QgRmNDaGFyU2V0ICphLCBjb25zdCBGY0NoYXJTZXQgKmIpClJldHVybnMgdGhlIG51bWJlciBvZiBjaGFycyB0aGF0IGFyZSBpbiAnYScgYnV0IG5vdCBpbiAnYicuCgouVFAKRmNCb29sIEZjQ2hhclNldElzU3Vic2V0IChjb25zdCBGY0NoYXJTZXQgKmEsIGNvbnN0IEZjQ2hhclNldCAqYikKUmV0dXJucyB3aGV0aGVyICdhJyBpcyBhIHN1YnNldCBvZiAnYicuCgouVFAgRmNDaGFyMzIgRmNDaGFyU2V0Rmlyc3RQYWdlIChjb25zdCBGY0NoYXJTZXQgKmEsIEZjQ2hhcjMyIFtGQ19DSEFSU0VUX01BUF9TSVpFXSwgRmNDaGFyMzIgKm5leHQpCkJ1aWxkcyBhbiBhcnJheSBvZiBiaXRzIG1hcmtpbmcgdGhlIGZpcnN0IHBhZ2Ugb2YgVW5pY29kZSBjb3ZlcmFnZSBvZiAnYScuClJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIGFycmF5LiAgJ25leHQnIGNvbnRhaW5zIHRoZSBuZXh0IHBhZ2UgaW4gdGhlIGZvbnQuCgouVFAgRmNDaGFyMzIgRmNDaGFyU2V0TmV4dFBhZ2UgKGNvbnN0IEZjQ2hhclNldCAqYSwgRmNDaGFyMzIgW0ZDX0NIQVJTRVRfTUFQX1NJWkVdLCBGY0NoYXIzMiAqbmV4dCkKQnVpbGRzIGFuIGFycmF5IG9mIGJpdHMgbWFya2luZyB0aGUgVW5pY29kZSBjb3ZlcmFnZSBvZiAnYScgZm9yIHBhZ2UgJypuZXh0Jy4KUmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgYXJyYXkuICAnbmV4dCcgY29udGFpbnMgdGhlIG5leHQgcGFnZSBpbiB0aGUgZm9udC4KCi5TUyBGY1ZhbHVlCkZjVmFsdWUgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHR5cGUgdGFnIGFuZCBhIHVuaW9uIG9mIGFsbCBwb3NzaWJsZQpkYXRhdHlwZXMuICBUaGUgdGFnIGlzIGFuIGVudW0gb2YgdHlwZSAKLkIgRmNUeXBlCmFuZCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgbWVhc3VyZSBvZiBydW4tdGltZQp0eXBlY2hlY2tpbmcsIGFsdGhvdWdoIHRoYXQgZGVwZW5kcyBvbiBjYXJlZnVsIHByb2dyYW1taW5nLgoKLlRQCnZvaWQgRmNWYWx1ZURlc3Ryb3kgKEZjVmFsdWUgdikKRnJlZXMgYW55IG1lbW9yeSByZWZlcmVuY2VkIGJ5IGB2Jy4gIFZhbHVlcyBvZiB0eXBlIEZjVHlwZVN0cmluZywKRmNUeXBlTWF0cml4IGFuZCBGY1R5cGVDaGFyU2V0IHJlZmVyZW5jZSBtZW1vcnksIHRoZSBvdGhlciB0eXBlcyBkbyBub3QuCgouVFAKRmNWYWx1ZSBGY1ZhbHVlU2F2ZSAoRmNWYWx1ZSB2KQpSZXR1cm5zIGEgY29weSBvZiBgdicgZHVwbGljYXRpbmcgYW55IG9iamVjdCByZWZlcmVuY2VkIGJ5IGl0IHNvIHRoYXQgYHYnCm1heSBiZSBzYWZlbHkgZGVzdHJveWVkIHdpdGhvdXQgaGFybWluZyB0aGUgbmV3IHZhbHVlLgoKLlNTIEZjUGF0dGVybgpBbiBGY1BhdHRlcm4gaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBob2xkcyBib3RoIHBhdHRlcm5zIHRvIG1hdGNoIGFnYWluc3QgdGhlCmF2YWlsYWJsZSBmb250cywgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBmb250LgoKLlRQCkZjUGF0dGVybiAqRmNQYXR0ZXJuQ3JlYXRlICh2b2lkKQpDcmVhdGVzIGEgcGF0dGVybiB3aXRoIG5vIHByb3BlcnRpZXM7IHVzZWQgdG8gYnVpbGQgcGF0dGVybnMgZnJvbSBzY3JhdGNoLgoKLlRQCnZvaWQgRmNQYXR0ZXJuRGVzdHJveSAoRmNQYXR0ZXJuICpwKQpEZXN0cm95cyBhIHBhdHRlcm4sIGluIHRoZSBwcm9jZXNzIGRlc3Ryb3lpbmcgYWxsIHJlbGF0ZWQgdmFsdWVzLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5FcXVhbCAoY29uc3QgRmNQYXR0ZXJuICpwYSwgY29uc3QgRmNQYXR0ZXJuICpwYik7ClJldHVybnMgd2hldGhlciAncGEnIGFuZCAncGInIGFyZSBleGFjdGx5IGFsaWtlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5FcXVhbFN1YnNldCAoY29uc3QgRmNQYXR0ZXJuICpwYSwgY29uc3QgRmNQYXR0ZXJuICpwYiwgY29uc3QgRmNPYmplY3RTZXQgKm9zKQpSZXR1cm5zIHdoZXRoZXIgJ3BhJyBhbmQgJ3BiJyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdmFsdWVzIGZvciBhbGwgb2YgdGhlCm9iamVjdHMgaW4gJ29zJy4KCi5UUApGY0NoYXIzMiBGY1BhdHRlcm5IYXNoIChjb25zdCBGY1BhdHRlcm4gKnApClJldHVybnMgYSAzMi1iaXQgbnVtYmVyIHdoaWNoIGlzIHRoZSBzYW1lIGZvciBhbnkgdHdvIHBhdHRlcm5zIHdoaWNoIGFyZQpleGFjdGx5IGFsaWtlLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5BZGQgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY1ZhbHVlIHZhbHVlLCBGY0Jvb2wgYXBwZW5kKQpBZGRzIGEgc2luZ2xlIHZhbHVlIHRvIHRoZSBsaXN0IG9mIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG5hbWVkCmBvYmplY3QnLiAgSWYgYGFwcGVuZCcgaXMgRmNUcnVlLCB0aGUgdmFsdWUgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhbnkKZXhpc3RpbmcgbGlzdCwgb3RoZXJ3aXNlIGl0IGlzIGluc2VydGVkIGF0IHRoZSBiZWdpbmluZy4gIGB2YWx1ZScgaXMgc2F2ZWQKKHdpdGggRmNWYWx1ZVNhdmUpIHdoZW4gaW5zZXJ0ZWQgaW50byB0aGUgcGF0dGVybiBzbyB0aGF0IHRoZSBsaWJyYXJ5CnJldGFpbnMgbm8gcmVmZXJlbmNlIHRvIGFueSBhcHBsaWNhdGlvbi1zdXBwbGllZCBkYXRhIHN0cnVjdHVyZS4KCi5UUApGY0Jvb2wgRmNQYXR0ZXJuQWRkV2VhayAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIEZjVmFsdWUgdmFsdWUsIEZjQm9vbCBhcHBlbmQpCkZjUGF0dGVybkFkZFdlYWsgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgRmNQYXR0ZXJuQWRkIGV4Y2VwdCB0aGF0IGFueQp2YWx1ZXMgYWRkZWQgdG8gdGhlIGxpc3QgaGF2ZSBiaW5kaW5nICd3ZWFrJyBpbnN0ZWFkIG9mICdzdHJvbmcnLgoKLlRQCkZjQm9vbCBGY1BhdHRlcm5BZGRJbnRlZ2VyIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IGkpCi5UUQpGY0Jvb2wgRmNQYXR0ZXJuQWRkRG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgZG91YmxlIGQpCi5UUQpGY0Jvb2wgRmNQYXR0ZXJuQWRkU3RyaW5nIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgY2hhciAqcykKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGRNYXRyaXggKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBjb25zdCBGY01hdHJpeCAqcykKLlRRCkZjQm9vbCBGY1BhdHRlcm5BZGRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgY29uc3QgRmNDaGFyU2V0ICpjKQouVFEKRmNCb29sIEZjUGF0dGVybkFkZEJvb2wgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBGY0Jvb2wgYikKVGhlc2UgYXJlIGFsbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdGhhdCBpbnNlcnQgb2JqZWN0cyBvZiB0aGUgc3BlY2lmaWVkCnR5cGUgaW50byB0aGUgcGF0dGVybi4gIFVzZSB0aGVzZSBpbiBwcmVmZXJlbmNlIHRvIEZjUGF0dGVybkFkZCBhcyB0aGV5CndpbGwgcHJvdmlkZSBjb21waWxlLXRpbWUgdHlwZWNoZWNraW5nLiAgVGhlc2UgYWxsIGFwcGVuZCB2YWx1ZXMgdG8KYW55IGV4aXN0aW5nIGxpc3Qgb2YgdmFsdWVzLgoKLlRQCkZjUmVzdWx0IEZjUGF0dGVybkdldCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBpZCwgRmNWYWx1ZSAqdikKUmV0dXJucyBpbiBgdicgdGhlIGBpZCd0aCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IGBvYmplY3QnLgpUaGUgdmFsdWUgcmV0dXJuZWQgaXMgbm90IGEgY29weSwgYnV0IHJhdGhlciByZWZlcnMgdG8gdGhlIGRhdGEgc3RvcmVkCndpdGhpbiB0aGUgcGF0dGVybiBkaXJlY3RseS4gIEFwcGxpY2F0aW9ucyBtdXN0IG5vdCBmcmVlIHRoaXMgdmFsdWUuCgouVFAKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0SW50ZWdlciAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBpbnQgKmkpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0RG91YmxlIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIGRvdWJsZSAqZCk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRTdHJpbmcgKEZjUGF0dGVybiAqcCwgY29uc3QgY2hhciAqb2JqZWN0LCBpbnQgbiwgY2hhciAqKmNvbnN0IHMpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0TWF0cml4IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjTWF0cml4ICoqcyk7Ci5UUQpGY1Jlc3VsdCBGY1BhdHRlcm5HZXRDaGFyU2V0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCwgaW50IG4sIEZjQ2hhclNldCAqKmMpOwouVFEKRmNSZXN1bHQgRmNQYXR0ZXJuR2V0Qm9vbCAoRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QsIGludCBuLCBGY0Jvb2wgKmIpOwpUaGVzZSBhcmUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRoYXQgY2FsbCBGY1BhdHRlcm5HZXQgYW5kIHZlcmlmeSB0aGF0IHRoZQpyZXR1cm5lZCBkYXRhIGlzIG9mIHRoZSBleHBlY3RlZCB0eXBlLiBUaGV5IHJldHVybiBGY1Jlc3VsdFR5cGVNaXNtYXRjaCBpZgp0aGlzIGlzIG5vdCB0aGUgY2FzZS4gIE5vdGUgdGhhdCB0aGVzZSAobGlrZSBGY1BhdHRlcm5HZXQpIGRvIG5vdCBtYWtlIGEKY29weSBvZiBhbnkgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieSB0aGUgcmV0dXJuIHZhbHVlLiAgVXNlIHRoZXNlCmluIHByZWZlcmVuY2UgdG8gRmNQYXR0ZXJuR2V0IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHR5cGVjaGVja2luZy4KCi5UUApGY1BhdHRlcm4gKkZjUGF0dGVybkJ1aWxkIChGY1BhdHRlcm4gKm9yaWcsIC4uLik7Ci5UUQpGY1BhdHRlcm4gKkZjUGF0dGVyblZhQnVpbGQgKEZjUGF0dGVybiAqb3JpZywgdmFfbGlzdCB2YSkKQnVpbGRzIGEgcGF0dGVybiB1c2luZyBhIGxpc3Qgb2Ygb2JqZWN0cywgdHlwZXMgYW5kIHZhbHVlcy4gIEVhY2gKdmFsdWUgdG8gYmUgZW50ZXJlZCBpbiB0aGUgcGF0dGVybiBpcyBzcGVjaWZpZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6Ci5JUAoxLiBPYmplY3QgbmFtZSwgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvcGVydHkgdG8gYmUgYWRkZWQuCi5JUAoyLiBPYmplY3QgdHlwZSwgb25lIG9mIHRoZSBGY1R5cGUgZW51bWVyYXRlZCB2YWx1ZXMKLklQCjMuIFZhbHVlLCBub3QgYW4gRmNWYWx1ZSwgYnV0IHRoZSByYXcgdHlwZSBhcyBwYXNzZWQgdG8gYW55IG9mIHRoZQpGY1BhdHRlcm5BZGQ8dHlwZT4gZnVuY3Rpb25zLiAgTXVzdCBtYXRjaCB0aGUgdHlwZSBvZiB0aGUgc2Vjb25kIGFyZ3VtZW50LgouSVAKVGhlIGFyZ3VtZW50IGxpc3QgaXMgdGVybWluYXRlZCBieSBhIG51bGwgb2JqZWN0IG5hbWUsIG5vIG9iamVjdCB0eXBlIG5vcgp2YWx1ZSBuZWVkIGJlIHBhc3NlZCBmb3IgdGhpcy4gIFRoZSB2YWx1ZXMgYXJlIGFkZGVkIHRvIGBwYXR0ZXJuJywgaWYKYHBhdHRlcm4nIGlzIG51bGwsIGEgbmV3IHBhdHRlcm4gaXMgY3JlYXRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGUgcGF0dGVybiBpcwpyZXR1cm5lZC4gRXhhbXBsZToKLlJTCi5JUApwYXR0ZXJuID0gRmNQYXR0ZXJuQnVpbGQgKDAsIEZDX0ZBTUlMWSwgRnRUeXBlU3RyaW5nLCAiVGltZXMiLCAoY2hhciAqKSAwKTsKLlJFCi5JUApGY1BhdHRlcm5WYUJ1aWxkIGlzIHVzZWQgd2hlbiB0aGUgYXJndW1lbnRzIGFyZSBhbHJlYWR5IGluIHRoZSBmb3JtIG9mIGEKdmFyYXJncyB2YWx1ZS4KCi5UUApGY0Jvb2wgRmNQYXR0ZXJuRGVsIChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCkKRGVsZXRlcyBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgYG9iamVjdCcsIHJldHVybmluZyAKd2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RlZCBvciBub3QuCgouVFAKdm9pZCBGY1BhdHRlcm5QcmludCAoY29uc3QgRmNQYXR0ZXJuICpwKQpQcmludHMgYW4gZWFzaWx5IHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIHBhdHRlcm4gdG8gc3Rkb3V0LiAgVGhlcmUgaXMKbm8gcHJvdmlzaW9uIGZvciByZXBhcnNpbmcgZGF0YSBpbiB0aGlzIGZvcm1hdCwgaXQncyBqdXN0IGZvciBkaWFnbm9zdGljcwphbmQgZGVidWdnaW5nLgoKLlRQCnZvaWQgRmNEZWZhdWx0U3Vic3RpdHV0ZSAoRmNQYXR0ZXJuICpwYXR0ZXJuKQpTdXBwbGllcyBkZWZhdWx0IHZhbHVlcyBmb3IgdW5kZXJzcGVjaWZpZWQgZm9udCBwYXR0ZXJuczoKLlJTCi5JUCBcKGJ1IApQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHN0eWxlIG9yIHdlaWdodCBhcmUgc2V0IHRvIE1lZGl1bQouSVAgXChidQpQYXR0ZXJucyB3aXRob3V0IGEgc3BlY2lmaWVkIHN0eWxlIG9yIHNsYW50IGFyZSBzZXQgdG8gUm9tYW4KLklQIFwoYnUKUGF0dGVybnMgd2l0aG91dCBhIHNwZWNpZmllZCBwaXhlbCBzaXplIGFyZSBnaXZlbiBvbmUgY29tcHV0ZWQgZnJvbQphbnkgc3BlY2lmaWVkIHBvaW50IHNpemUgKGRlZmF1bHQgMTIpLCBkcGkgKGRlZmF1bHQgNzUpIGFuZCBzY2FsZSAoZGVmYXVsdAoxKS4KLlJFCgouVFAKRmNQYXR0ZXJuICpGY05hbWVQYXJzZSAoY29uc3QgY2hhciAqbmFtZSkKQ29udmVydHMgJ25hbWUnIGZyb20gdGhlIHN0YW5kYXJkIHRleHQgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZSBpbnRvIGEgcGF0dGVybi4KCi5UUApGY0NoYXI4ICpGY05hbWVVbnBhcnNlIChGY1BhdHRlcm4gKnBhdCkKQ29udmVydHMgdGhlIGdpdmVuIHBhdHRlcm4gaW50byB0aGUgc3RhbmRhcmQgdGV4dCBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlLgpUaGUgcmV0dXJuIHZhbHVlIGlzIG5vdCBzdGF0aWMsIGJ1dCBpbnN0ZWFkIHJlZmVycyB0byBuZXdseSBhbGxvY2F0ZWQgbWVtb3J5CndoaWNoIHNob3VsZCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgoKLlNTIEZjRm9udFNldApBbiBGY0ZvbnRTZXQgc2ltcGx5IGhvbGRzIGEgbGlzdCBvZiBwYXR0ZXJuczsgdGhlc2UgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZQpyZXN1bHRzIG9mIGxpc3RpbmcgYXZhaWxhYmxlIGZvbnRzLgouVFAKRmNGb250U2V0ICpGY0ZvbnRTZXRDcmVhdGUgKHZvaWQpCkNyZWF0ZXMgYW4gZW1wdHkgZm9udCBzZXQuCgouVFAKdm9pZCBGY0ZvbnRTZXREZXN0cm95IChGY0ZvbnRTZXQgKnMpOwpEZXN0cm95cyBhIGZvbnQgc2V0LiAgTm90ZSB0aGF0IHRoaXMgZGVzdHJveXMgYW55IHJlZmVyZW5jZWQgcGF0dGVybnMgYXMKd2VsbC4KCi5UUCAKRmNCb29sIEZjRm9udFNldEFkZCAoRmNGb250U2V0ICpzLCBGY1BhdHRlcm4gKmZvbnQpCkFkZHMgYSBwYXR0ZXJuIHRvIGEgZm9udCBzZXQuICBOb3RlIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IGNvcGllZCBiZWZvcmUKYmVpbmcgaW5zZXJ0ZWQgaW50byB0aGUgc2V0LgoKLlNTIEZjT2JqZWN0U2V0CkFuIEZjT2JqZWN0U2V0IGhvbGRzIGEgbGlzdCBvZiBwYXR0ZXJuIHByb3BlcnR5IG5hbWVzOyBpdCBpcyB1c2VkIHRvCmluZGljaWF0ZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgcGF0dGVybnMgZnJvbQpGY0ZvbnRMaXN0LgoKLlRQCkZjT2JqZWN0U2V0ICpGY09iamVjdFNldENyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBzZXQuCgouVFAKRmNCb29sIEZjT2JqZWN0U2V0QWRkIChGY09iamVjdFNldCAqb3MsIGNvbnN0IGNoYXIgKm9iamVjdCkKQWRkcyBhIHByb3ByZXR5IG5hbWUgdG8gdGhlIHNldC4KCi5UUAp2b2lkIEZjT2JqZWN0U2V0RGVzdHJveSAoRmNPYmplY3RTZXQgKm9zKQpEZXN0cm95cyBhbiBvYmplY3Qgc2V0LgoKCi5UUApGY09iamVjdFNldCAqRmNPYmplY3RTZXRCdWlsZCAoY29uc3QgY2hhciAqZmlyc3QsIC4uLikKLlRRCkZjT2JqZWN0U2V0ICpGY09iamVjdFNldFZhQnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCB2YV9saXN0IHZhKQpUaGVzZSBidWlsZCBhbiBvYmplY3Qgc2V0IGZyb20gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcy4KCi5TUyBGY09iamVjdFR5cGUKUHJvdmlkZXMgZm9yIGFwcGxjYXRpb24tc3BlY2lmaWVkIGZvbnQgbmFtZSBvYmplY3QgdHlwZXMgc28gdGhhdCBuZXcKcGF0dGVybiBlbGVtZW50cyBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gZm9udCBuYW1lcy4KCi5UUCBGY0Jvb2wgRmNOYW1lUmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKQpSZWdpc3RlciAnbnR5cGUnIG5ldyBvYmplY3QgdHlwZXMuCgouVFAKRmNCb29sIEZjTmFtZVVucmVnaXN0ZXJPYmplY3RUeXBlcyAoY29uc3QgRmNPYmplY3RUeXBlICp0eXBlcywgaW50IG50eXBlKQpVbnJlZ2lzdGVyICdudHlwZScgb2JqZWN0IHR5cGVzLgogICAgCi5UUApjb25zdCBGY09iamVjdFR5cGUgKkZjTmFtZUdldE9iamVjdFR5cGUgKGNvbnN0IGNoYXIgKm9iamVjdCkKUmV0dXJuIHRoZSBvYmplY3QgdHlwZSBmb3IgdGhlIHBhdHRlcm4gZWxlbWVudCBuYW1lZCAnb2JqZWN0Jy4KCi5TUyBGY0NvbnN0YW50ClByb3ZpZGVzIGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpZWQgc3ltYm9saWMgY29uc3RhbnRzIGZvciBmb250IG5hbWVzLgoKLlRQCkZjQm9vbCBGY05hbWVSZWdpc3RlckNvbnN0YW50cyAoY29uc3QgRmNDb25zdGFudCAqY29uc3RzLCBpbnQgbmNvbnN0cykKUmVnaXN0ZXIgJ25jb25zdHMnIG5ldyBzeW1ib2xpYyBjb25zdGFudHMuCgouVFAKRmNCb29sIEZjTmFtZVVucmVnaXN0ZXJDb25zdGFudHMgKGNvbnN0IEZjQ29uc3RhbnQgKmNvbnN0cywgaW50IG5jb25zdHMpClVucmVnaXN0ZXIgJ25jb25zdHMnIHN5bWJvbGljIGNvbnN0YW50cy4KICAgIAouVFAKY29uc3QgRmNDb25zdGFudCAqRmNOYW1lR2V0Q29uc3RhbnQgKEZjQ2hhcjggKnN0cmluZykKUmV0dXJuIHRoZSBGY0NvbnN0YW50IHN0cnVjdHVyZSByZWxhdGVkIHRvIHN5bWJvbGljIGNvbnN0YW50ICdzdHJpbmcnLgoKLlRQCkZjQm9vbCBGY05hbWVDb25zdGFudCAoRmNDaGFyOCAqc3RyaW5nLCBpbnQgKnJlc3VsdCk7ClJldHVybnMgd2hldGhlciBhIHN5bWJvbGljIGNvbnN0YW50IHdpdGggbmFtZSAnc3RyaW5nJyBpcyByZWdpc3RlcmVkLApwbGFjaW5nIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgaW4gJ3Jlc3VsdCcgaWYgcHJlc2VudC4KCi5TUyBGY0JsYW5rcwpBbiBGY0JsYW5rcyBvYmplY3QgaG9sZHMgYSBsaXN0IG9mIFVuaWNvZGUgY2hhcnMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvCmJlIGJsYW5rIHdoZW4gZHJhd24uICBXaGVuIHNjYW5uaW5nIG5ldyBmb250cywgYW55IGdseXBocyB3aGljaCBhcmUKZW1wdHkgYW5kIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIGJyb2tlbiBhbmQgbm90IHBsYWNlZCBpbgp0aGUgRmNDaGFyU2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm9udC4gIFRoaXMgcHJvdmlkZXMgYSBzaWduaWZpY2FudGx5IG1vcmUKYWNjdXJhdGUgQ2hhclNldCBmb3IgYXBwbGljYXRpb25zLgoKLlRQCkZjQmxhbmtzICpGY0JsYW5rc0NyZWF0ZSAodm9pZCkKQ3JlYXRlcyBhbiBlbXB0eSBGY0JsYW5rcyBvYmplY3QuCgouVFAKdm9pZCBGY0JsYW5rc0Rlc3Ryb3kgKEZjQmxhbmtzICpiKQpEZXN0cm95cyBhbiBGY0JsYW5rcyBvYmplY3QsIGZyZWVpbmcgYW55IGFzc29jaWF0ZWQgbWVtb3J5LgoKLlRQCkZjQm9vbCBGY0JsYW5rc0FkZCAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCkFkZHMgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIGFuIEZjQmxhbmtzIG9iamVjdCwgcmV0dXJuaW5nIEZjRmFsc2UKaWYgdGhpcyBwcm9jZXNzIHJhbiBvdXQgb2YgbWVtb3J5LgoKLlRQCkZjQm9vbCBGY0JsYW5rc0lzTWVtYmVyIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCkKUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRmNCbGFua3Mgb2JqZWN0IGNvbnRhaW5zIHRoZSBpbmRpY2F0ZWQgVW5pY29kZQp2YWx1ZS4KCi5TUyBGY0NvbmZpZwpBbiBGY0NvbmZpZyBvYmplY3QgaG9sZHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEgY29uZmlndXJhdGlvbi4KVGhlcmUgaXMgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hpY2ggYXBwbGljYXRpb25zIG1heSB1c2UgYnkgcGFzc2luZyAwIHRvCmFueSBmdW5jdGlvbiB1c2luZyB0aGUgZGF0YSB3aXRoaW4gYW4gRmNDb25maWcuCgouVFAKRmNDb25maWcgKkZjQ29uZmlnQ3JlYXRlICh2b2lkKQpDcmVhdGVzIGFuIGVtcHR5IGNvbmZpZ3VyYXRpb24uCgouVFAgCnZvaWQgRmNDb25maWdEZXN0cm95IChGY0NvbmZpZyAqY29uZmlnKQpEZXN0cm95cyBhIGNvbmZpZ3VyYXRpb24gYW5kIGFueSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4gIE5vdGUgdGhhdCBjYWxsaW5nCnRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcmV0dXJuIGZyb20gRmNDb25maWdHZXRDdXJyZW50IHdpbGwgcGxhY2UgdGhlIGxpYnJhcnkKaW4gYW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZS4KCi5UUApGY0Jvb2wgRmNDb25maWdTZXRDdXJyZW50IChGY0NvbmZpZyAqY29uZmlnKQpTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byAnY29uZmlnJy4gIEltcGxpY2l0bHkgY2FsbHMKRmNDb25maWdCdWlsZEZvbnRzIGlmIG5lY2Vzc2FyeSwgcmV0dXJuaW5nIEZjRmFsc2UgaWYgdGhhdCBjYWxsIGZhaWxzLgoKLlRQCkZjQ29uZmlnICpGY0NvbmZpZ0dldEN1cnJlbnQgKHZvaWQpClJldHVybnMgdGhlIGN1cnJlbnQgZGVmYXVsdCBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1VwdG9EYXRlIChGY0NvbmZpZyAqY29uZmlnKQpDaGVja3MgYWxsIG9mIHRoZSBmaWxlcyByZWxhdGVkIHRvICdjb25maWcnIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlCmluLW1lbW9yeSB2ZXJzaW9uIGlzIGluIHN5bmMgd2l0aCB0aGUgZGlzayB2ZXJzaW9uLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ0J1aWxkRm9udHMgKEZjQ29uZmlnICpjb25maWcpCkJ1aWxkcyB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmb250cyBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uICBOb3RlIHRoYXQKYW55IGNoYW5nZXMgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhpcyBjYWxsIGhhdmUgaW5kZXRlcm1pbmF0ZSBlZmZlY3RzLgpSZXR1cm5zIEZjRmFsc2UgaWYgdGhpcyBvcGVyYXRpb24gcnVucyBvdXQgb2YgbWVtb3J5LgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRDb25maWdEaXJzIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBsaXN0IG9mIGZvbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCmZvciAnY29uZmlnJy4gIERvZXMgbm90IGluY2x1ZGUgYW55IHN1YmRpcmVjdG9yaWVzLgoKLlRQCkZjU3RyTGlzdCAqRmNDb25maWdHZXRGb250RGlycyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbGlzdCBvZiBmb250IGRpcmVjdG9yaWVzIGluICdjb25maWcnLiBUaGlzIGluY2x1ZGVzIHRoZQpjb25maWd1cmVkIGZvbnQgZGlyZWN0b3JpZXMgYWxvbmcgd2l0aCBhbnkgZGlyZWN0b3JpZXMgYmVsb3cgdGhvc2UgaW4gdGhlCmZpbGVzeXN0ZW0uCgouVFAgCkZjU3RyTGlzdCAqRmNDb25maWdHZXRDb25maWdGaWxlcyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbGlzdCBvZiBrbm93biBjb25maWd1cmF0aW9uIGZpbGVzIHVzZWQgdG8gZ2VuZXJhdGUgJ2NvbmZpZycuCk5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IGluY2x1ZGUgYW55IGNvbmZpZ3VyYXRpb24gZG9uZSB3aXRoIEZjQ29uZmlnUGFyc2UuCgouVFAKY2hhciAqRmNDb25maWdHZXRDYWNoZSAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB1c2VkIHRvIHN0b3JlIHBlci11c2VyIGZvbnQgaW5mb3JtYXRpb24uCgouVFAKRmNGb250U2V0ICpGY0NvbmZpZ0dldEZvbnRzIChGY0NvbmZpZyAqY29uZmlnLCBGY1NldE5hbWUgc2V0KQpSZXR1cm5zIG9uZSBvZiB0aGUgdHdvIHNldHMgb2YgZm9udHMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBhcyBzcGVjaWZpZWQgCmJ5ICdzZXQnLgoKLlRQCkZjQmxhbmtzICpGY0NvbmZpZ0dldEJsYW5rcyAoRmNDb25maWcgKmNvbmZpZykKUmV0dXJucyB0aGUgRmNCbGFua3Mgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiwgaWYgbm8KYmxhbmtzIHdlcmUgcHJlc2VudCBpbiB0aGUgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAwLgoKLlRQCmludCBGY0NvbmZpZ0dldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnKQpSZXR1cm5zIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIGF1dG9tYXRpYyBjaGVja3Mgb2YgdGhlIGNvbmZpZ3VyYXRpb24gKGluCnNlY29uZHMpIHNwZWNpZmllZCBpbiAnY29uZmlnJy4gIFRoZSBjb25maWd1cmF0aW9uIGlzIGNoZWNrZWQgZHVyaW5nCmEgY2FsbCB0byBGY0ZvbnRMaXN0IHdoZW4gdGhpcyBpbnRlcnZhbCBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNoZWNrLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1NldFJlc2NhbkludmVydmFsIChGY0NvbmZpZyAqY29uZmlnLCBpbnQgcmVzY2FuSW50ZXJ2YWwpClNldHMgdGhlIHJlc2NhbiBpbnRlcnZhbDsgcmV0dXJucyBGY0ZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ0FwcEZvbnRBZGRGaWxlIChGY0NvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICpmaWxlKQpBZGRzIGFuIGFwcGxpY2F0aW9uLXNwZWNpZmljIGZvbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uCgouVFAgCkZjQm9vbCBGY0NvbmZpZ0FwcEZvbnRBZGREaXIgKEZjQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmRpcikKU2NhbnMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgZm9yIGZvbnRzLCBhZGRpbmcgZWFjaCBvbmUgZm91bmQgdG8gdGhlCmFwcGxpY2F0aW9uLXNwZWNpZmljIHNldCBvZiBmb250cy4KCi5UUCAKdm9pZCBGY0NvbmZpZ0FwcEZvbnRDbGVhciAoRmNDb25maWcgKmNvbmZpZykKQ2xlYXJzIHRoZSBzZXQgb2YgYXBwbGljYXRpb24tc3BlY2lmaWMgZm9udHMuCgouVFAKRmNCb29sIEZjQ29uZmlnU3Vic3RpdHV0ZSAoRmNDb25maWcgKmNvbmZpZywgRmNQYXR0ZXJuICpwLCBGY01hdGNoS2luZCBraW5kKQpQZXJmb3JtcyB0aGUgc2VxdWVuY2Ugb2YgcGF0dGVybiBtb2RpZmljYXRpb24gb3BlcmF0aW9ucywgaWYgJ2tpbmQnIGlzCkZjTWF0Y2hQYXR0ZXJuLCB0aGVuIHRob3NlIHRhZ2dlZCBhcyBwYXR0ZXJuIG9wZXJhdGlvbnMgYXJlIGFwcGxpZWQsIGVsc2UgCmlmICdraW5kJyBpcyBGY01hdGNoRm9udCwgdGhvc2UgdGFnZ2VkIGFzIGZvbnQgb3BlcmF0aW9ucyBhcmUgYXBwbGllZC4KCi5UUApGY1BhdHRlcm4gKkZjRm9udE1hdGNoIChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjUmVzdWx0ICpyZXN1bHQpClJldHVybnMgdGhlIGZvbnQgaW4gJ2NvbmZpZycgbW9zdCBjbG9zZSBtYXRjaGluZyAncCcuICBUaGlzIGZ1bmN0aW9uCnNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZQpiZWVuIGNhbGxlZCBmb3IgJ3AnOyBvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KCi5UUApGY0ZvbnRTZXQgKkZjRm9udFNvcnQgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcCwgRmNCb29sIHRyaW0sIEZjQ2hhclNldCAqKmNzcCwgRmNSZXN1bHQgKnJlc3VsdCkgUmV0dXJucyB0aGUgbGlzdCBvZiBmb250cyBzb3J0ZWQgYnkKY2xvc2VuZXNzIHRvICdwJy4gIElmICd0cmltJyBpcyBGY1RydWUsIGVsZW1lbnRzIGluIHRoZSBsaXN0IHdoaWNoIGRvbid0CmluY2x1ZGUgVW5pY29kZSBjb3ZlcmFnZSBub3QgcHJvdmlkZWQgYnkgZWFybGllciBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUKZWxpZGVkLiAgVGhlIHVuaW9uIG9mIFVuaWNvZGUgY292ZXJhZ2Ugb2YgYWxsIG9mIHRoZSBmb250cyBpcyByZXR1cm5lZCBpbgonY3NwJywgaWYgJ2NzcCcgaXMgbm90IE5VTEwuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlcgpGY0NvbmZpZ1N1YnN0aXR1dGUgYW5kIEZjRGVmYXVsdFN1YnN0aXR1dGUgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgJ3AnOwpvdGhlcndpc2UgdGhlIHJlc3VsdHMgd2lsbCBub3QgYmUgY29ycmVjdC4KLlAKVGhlIHJldHVybmVkIEZjRm9udFNldCByZWZlcmVuY2VzIEZjUGF0dGVybiBzdHJ1Y3R1cmVzIHdoaWNoIG1heSBiZSBzaGFyZWQKYnkgdGhlIHJldHVybiB2YWx1ZSBmcm9tIG11bHRpcGxlIEZjRm9udFNvcnQgY2FsbHMsIGFwcGxpY2F0aW9ucyBtdXN0IG5vdAptb2RpZnkgdGhlc2UgcGF0dGVybnMuICBJbnN0ZWFkLCB0aGV5IHNob3VsZCBiZSBwYXNzZWQsIGFsb25nIHdpdGggJ3AnIHRvCkZjRm9udFJlbmRlclByZXBhcmUgd2hpY2ggY29tYmluZXMgdGhlbSBpbnRvIGEgY29tcGxldGUgcGF0dGVybi4KLlAKVGhlIEZjRm9udFNldCByZXR1cm5lZCBieSBGY0ZvbnRTb3J0IGlzIGRlc3Ryb3llZCBieSBjYWxpbmcgRmNGb250U2V0RGVzdHJveS4KCi5UUApGY1BhdHRlcm4gKkZjRm9udFJlbmRlclByZXBhcmUgKEZjQ29uZmlnICpjb25maWcsIEZjUGF0dGVybiAqcGF0LCBGY1BhdHRlcm4gKmZvbnQpCkNyZWF0ZXMgYSBuZXcgcGF0dGVybiBjb25zaXN0aW5nIG9mIGVsZW1lbnRzIG9mICdmb250JyBub3QgYXBwZWFyaW5nIGluCidwYXQnLCBlbGVtZW50cyBvZiAncGF0JyBub3QgYXBwZWFyaW5nIGluICdmb250JyBhbmQgdGhlIGJlc3QgbWF0Y2hpbmcgdmFsdWUKZnJvbSAncGF0JyBmb3IgZWxlbWVudHMgYXBwZWFyaW5nIGluIGJvdGguICBUaGUgcmVzdWx0IGlzIHBhc3NlZCB0bwpGY0NvbmZpZ1N1YnN0aXR1dGUgd2l0aCAna2luZCcgRmNNYXRjaEZvbnQgYW5kIHRoZW4gcmV0dXJuZWQuCgouVFAKRmNGb250U2V0ICpGY0ZvbnRMaXN0IChGY0NvbmZpZyAqY29uZmlnLCBGY1BhdHRlcm4gKnAsIEZjT2JqZWN0U2V0ICpvcykKU2VsZWN0cyBmb250cyBtYXRjaGluZyAncCcsIGNyZWF0ZXMgcGF0dGVybnMgZnJvbSB0aG9zZSBmb250cyBjb250YWluaW5nCm9ubHkgdGhlIG9iamVjdHMgaW4gJ29zJyBhbmQgcmV0dXJucyB0aGUgc2V0IG9mIHVuaXF1ZSBzdWNoIHBhdHRlcm5zLgoKLlRQCmNoYXIgKkZjQ29uZmlnRmlsZW5hbWUgKGNvbnN0IGNoYXIgKm5hbWUpCkdpdmVuIHRoZSBzcGVjaWZpZWQgZXh0ZXJuYWwgZW50aXR5IG5hbWUsIHJldHVybiB0aGUgYXNzb2NpYXRlZCBmaWxlbmFtZS4KVGhpcyBwcm92aWRlcyBhcHBsaWNhdGlvbnMgYSB3YXkgdG8gY29udmVydCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gZmlsZQpyZWZlcmVuY2VzIGludG8gZmlsZW5hbWUgZm9ybS4gCi5QCkEgbnVsbCBvciBlbXB0eSAnbmFtZScgaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHNob3VsZApiZSB1c2VkOyB3aGljaCBmaWxlIHRoaXMgcmVmZXJlbmNlcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQpGQ19DT05GSUdfRklMRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIE5leHQsIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoICd+JywgaXQKcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCB1c2VycyBob21lIGRpcmVjdG9yeS4gIE90aGVyd2lzZSBpZiB0aGUgbmFtZQpkb2Vzbid0IHN0YXJ0IHdpdGggJy8nLCBpdCByZWZlcnMgdG8gYSBmaWxlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KZGlyZWN0b3J5OyB0aGUgYnVpbHQtaW4gZGVmYXVsdCBkaXJlY3RvcnkgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKRkNfQ09ORklHX0RJUiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KCi5TUyBJbml0aWFsaXphdGlvbgpUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIGxpYnJhcnkgaXMgaW5pdGlhbGl6ZWQuCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWcgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24uCkRvZXMgbm90IGxvYWQgYW55IGZvbnQgaW5mb3JtYXRpb24uCgouVFAKRmNDb25maWcgKkZjSW5pdExvYWRDb25maWdBbmRGb250cyAodm9pZCkKTG9hZHMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBidWlsZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCmF2YWlsYWJsZSBmb250cy4gIFJldHVybnMgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uLgoKLlRQCkZjQm9vbCBGY0luaXQgKHZvaWQpCkxvYWRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgdGhlIGZvbnRzIHJlZmVyZW5jZWQgdGhlcmVpbiBhbmQKc2V0cyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHRoYXQgcmVzdWx0LiAgUmV0dXJucyB3aGV0aGVyIHRoaXMKcHJvY2VzcyBzdWNjZWVkZWQgb3Igbm90LiAgSWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBoYXMgYWxyZWFkeQpiZWVuIGxvYWRlZCwgdGhpcyByb3V0aW5lIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBGY1RydWUuCgouVFAKaW50IEZjR2V0VmVyc2lvbiAodm9pZCkKUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuCgouVFAKRmNCb29sIEZjSW5pdFJlaW5pdGlhbGl6ZSAodm9pZCkKRm9yY2VzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZSB0byBiZSByZWxvYWRlZCBhbmQgcmVzZXRzIHRoZSBkZWZhdWx0CmNvbmZpZ3VyYXRpb24uCgouVFAKRmNCb29sIEZjSW5pdEJyaW5nVXB0b0RhdGUgKHZvaWQpCkNoZWNrcyB0aGUgcmVzY2FuIGludGVydmFsIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNoZWNraW5nIHRoZQpjb25maWd1cmF0aW9uIGlmIHRoZSBpbnRlcnZhbCBoYXMgcGFzc2VkIGFuZCByZWxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaWYKd2hlbiBhbnkgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCgouU1MgRmNBdG9taWMKVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgYSBzYWZlIHdheSB0byB1cGRhdGUgY29uZmlnIGZpbGVzLCBhbGxvd2luZyBvbmdvaW5nCnJlYWRpbmcgb2YgdGhlIG9sZCBjb25maWcgZmlsZSB3aGlsZSBsb2NrZWQgZm9yIHdyaXRpbmcgYW5kIGVuc3VyaW5nIHRoYXQgYQpjb25zaXN0ZW50IGFuZCBjb21wbGV0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgZmlsZSBpcyBhbHdheXMgYXZhaWxhYmxlLgoKLlRQCkZjQXRvbWljICogRmNBdG9taWNDcmVhdGUgKGNvbnN0IEZjQ2hhcjggICAqZmlsZSkKQ3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBhY2Nlc3MgdG8gJ2ZpbGUnLgpXcml0aW5nIGlzIGRvbmUgdG8gYSBzZXBhcmF0ZSBmaWxlLiAgT25jZSB0aGF0IGZpbGUgaXMgY29tcGxldGUsIHRoZSBvcmlnaW5hbApjb25maWd1cmF0aW9uIGZpbGUgaXMgYXRvbWljYWxseSByZXBsYWNlZCBzbyB0aGF0IHJlYWRpbmcgcHJvY2VzcyBhbHdheXMgc2VlCmEgY29uc2lzdGVudCBhbmQgY29tcGxldGUgZmlsZSB3aXRob3V0IHRoZSBuZWVkIHRvIGxvY2sgZm9yIHJlYWRpbmcuCgouVFAKRmNCb29sIEZjQXRvbWljTG9jayAoRmNBdG9taWMgKmF0b21pYykKQXR0ZW1wdHMgdG8gbG9jayB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5ICdhdG9taWMnLiAgUmV0dXJucyBGY0ZhbHNlIGlmIHRoZQpmaWxlIGlzIGxvY2tlZCBieSBhbm90aGVyIHByb2Nlc3MsIGVsc2UgcmV0dXJucyBGY1RydWUgYW5kIGxlYXZlcyB0aGUgZmlsZQpsb2NrZWQuCgouVFAKRmNDaGFyOCAqRmNBdG9taWNOZXdGaWxlIChGY0F0b21pYyAqYXRvbWljKQpSZXR1cm5zIHRoZSBmaWxlbmFtZSBmb3Igd3JpdGluZyBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJlZmVybmNlZCBieQonYXRvbWljJy4KCi5UUApGY0NoYXI4ICpGY0F0b21pY09yaWdGaWxlIChGY0F0b21pYyAqYXRvbWljKQpSZXR1cm5zIHRoZSBmaWxlIHJlZmVybmNlZCBieSAnYXRvbWljJy4KCi5UUApGY0Jvb2wgRmNBdG9taWNSZXBsYWNlT3JpZyAoRmNBdG9taWMgKmF0b21pYykKUmVwbGFjZXMgdGhlIG9yaWdpbmFsIGZpbGUgcmVmZXJlbmNlZCBieSAnYXRvbWljJyB3aXRoIHRoZSBuZXcgZmlsZS4KCi5UUAp2b2lkIEZjQXRvbWljRGVsZXRlTmV3IChGY0F0b21pYyAqYXRvbWljKQpEZWxldGVzIHRoZSBuZXcgZmlsZS4KCi5UUAp2b2lkIEZjQXRvbWljVW5sb2NrIChGY0F0b21pYyAqYXRvbWljKQpVbmxvY2tzIHRoZSBmaWxlLgoKLlRQCnZvaWQgRmNBdG9taWNEZXN0cm95IChGY0F0b21pYyAqYXRvbWljKQpEZXN0cm95cyAnYXRvbWljJy4KCi5TUyBGcmVlVHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMKLm5mCi5CICNpbmNsdWRlIDxmb250Y29uZmlnL2ZjZnJlZXR5cGUuaD4KLmZpCldoaWxlIHRoZSBmb250Y29uZmlnIGxpYnJhcnkgZG9lc24ndCBpbnNpc3QgdGhhdCBGcmVlVHlwZSBiZSB1c2VkIGFzIHRoZQpyYXN0ZXJpemF0aW9uIG1lY2hhbmlzbSBmb3IgZm9udHMsIGl0IGRvZXMgcHJvdmlkZSBzb21lIGNvbnZlbmllbmNlCmZ1bmN0aW9ucy4KCi5UUApGVF9VSW50IEZjRnJlZVR5cGVDaGFySW5kZXggKEZUX0ZhY2UgZmFjZSwgRmNDaGFyMzIgdWNzNCkKTWFwcyBhIFVuaWNvZGUgY2hhciB0byBhIGdseXBoIGluZGV4LiAgVGhpcyBmdW5jdGlvbiB1c2VzIGluZm9ybWF0aW9uIGZyb20Kc2V2ZXJhbCBwb3NzaWJsZSB1bmRlcmx5aW5nIGVuY29kaW5nIHRhYmxlcyB0byB3b3JrIGFyb3VuZCBicm9rZW4gZm9udHMuCkFzIGEgcmVzdWx0LCB0aGlzIGZ1bmN0aW9uIGlzbid0IGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gcGVyZm9ybWFuY2UKc2Vuc2l0aXZlIGFyZWFzOyByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiBhcmUgaW50ZW5kZWQgdG8gYmUgY2FjaGVkIGJ5CmhpZ2hlciBsZXZlbCBmdW5jdGlvbnMuCgouVFAKRmNDaGFyU2V0ICpGY0ZyZWVUeXBlQ2hhclNldCAoRlRfRmFjZSBmYWNlLCBGY0JsYW5rcyAqYmxhbmtzKSBTY2FucyBhCkZyZWVUeXBlIGZhY2UgYW5kIHJldHVybnMgdGhlIHNldCBvZiBlbmNvZGVkIFVuaWNvZGUgY2hhcnMuICBUaGlzIHNjYW5zCnNldmVyYWwgZW5jb2RpbmcgdGFibGVzIHRvIGJ1aWxkIGFzIGNvbXBsZXRlIGEgbGlzdCBhcyBwb3NzaWJsZS4gIElmCidibGFua3MnIGlzIG5vdCAwLCB0aGUgZ2x5cGhzIGluIHRoZSBmb250IGFyZSBleGFtaW5lZCBhbmQgYW55IGJsYW5rIGdseXBocwpub3QgaW4gJ2JsYW5rcycgYXJlIG5vdCBwbGFjZWQgaW4gdGhlIHJldHVybmVkIEZjQ2hhclNldC4KCi5UUApGY1BhdHRlcm4gKkZjRnJlZVR5cGVRdWVyeSAoY29uc3QgY2hhciAqZmlsZSwgaW50IGlkLCBGY0JsYW5rcyAqYmxhbmtzLCBpbnQgKmNvdW50KQpDb25zdHJ1Y3RzIGEgcGF0dGVybiByZXByZXNlbnRpbmcgdGhlICdpZCd0aCBmb250IGluICdmaWxlJy4gIFRoZSBudW1iZXIKb2YgZm9udHMgaW4gJ2ZpbGUnIGlzIHJldHVybmVkIGluICdjb3VudCcuCgouU1MgWE1MIHNwZWNpZmljIGZ1bmN0aW9ucwoubmYKLkIgI2luY2x1ZGUgPGZvbnRjb25maWcvZmN4bWwuaD4KLmZpClRoZXNlIGZ1bmN0aW9ucyBleHBvc2UgdGhlIGxpYnhtbDIgZGF0YXR5cGVzIHVzZWQgZm9yIGZvbnQgY29uZmlndXJhdGlvbi4KCi5UUAp4bWxEb2NQdHIgRmNDb25maWdMb2FkIChjb25zdCBjaGFyICpmaWxlKQpMb2FkcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSBtYXBwaW5nICdmaWxlJyBpbnRvIGEgZmlsZW5hbWUgd2l0aApGY0NvbmZpZ0ZpbGVuYW1lLiAgVGhpcyBkb2Vzbid0IGxvYWQgYSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIGFzIGFueQppbmNsdWRlIGZpbGVzIHJlZmVyZW5jZWQgZnJvbSAnZmlsZScgd2lsbCBub3QgYmUgbG9hZGVkLgoKLlRQCkZjQm9vbCBGY0NvbmZpZ1BhcnNlQW5kTG9hZCAoRmNDb25maWcgKmNvbmZpZywgY29uc3QgRmNDaGFyOCAqZmlsZSwgRmNCb29sIGNvbXBsYWluKQpXYWxrcyB0aGUgY29uZmlndXJhdGlvbiBpbiAnZmlsZScgYW5kIGNvbnN0cnVjdHMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGluCidjb25maWcnLiAgQW55IGluY2x1ZGUgZmlsZXMgcmVmZXJlbmNlZCBmcm9tIHdpdGhpbiAnZmlsZScgd2lsbCBiZSBsb2FkZWQKd2l0aCBGY0NvbmZpZ0xvYWQgYW5kIGFsc28gcGFyc2VkLiAgSWYgJ2NvbXBsYWluJyBpcyBGY0ZhbHNlLCBubyB3YXJuaW5nCndpbGwgYmUgZGlzcGxheWVkIGlmICdmaWxlJyBkb2VzIG5vdCBleGlzdC4KCi5TUyBGaWxlIGFuZCBEaXJlY3Rvcnkgcm91dGluZXMKCi5UUApGY0Jvb2wgRmNGaWxlU2NhbiAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBGY0ZpbGVDYWNoZSAqY2FjaGUsIEZjQmxhbmtzICpibGFua3MsIGNvbnN0IGNoYXIgKmZpbGUsIEZjQm9vbCBmb3JjZSkKU2NhbnMgYSBzaW5nbGUgZmlsZSBhbmQgYWRkcyBhbGwgZm9udHMgZm91bmQgdG8gJ3NldCcuICBJZiAnZm9yY2UnIGlzIEZjVHJ1ZSwKdGhlbiB0aGUgZmlsZSBpcyBzY2FubmVkIGV2ZW4gaWYgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBpcyBmb3VuZCBpbiAnY2FjaGUnLgpJZiAnZmlsZScgaXMgYSBkaXJlY3RvcnksIGl0IGlzIGFkZGVkIHRvICdkaXJzJy4KCi5UUApGY0Jvb2wgRmNEaXJTY2FuIChGY0ZvbnRTZXQgKnNldCwgRmNTdHJTZXQgKmRpcnMsIEZjRmlsZUNhY2hlICpjYWNoZSwgRmNCbGFua3MgKmJsYW5rcywgY29uc3QgY2hhciAqZGlyLCBGY0Jvb2wgZm9yY2UpClNjYW5zIGFuIGVudGlyZSBkaXJlY3RvcnkgYW5kIGFkZHMgYWxsIGZvbnRzIGZvdW5kIHRvICdzZXQnLiAgSWYgJ2ZvcmNlJyBpcwpGY1RydWUsIHRoZW4gdGhlIGRpcmVjdG9yeSBhbmQgYWxsIGZpbGVzIHdpdGhpbiBpdCBhcmUgc2Nhbm5lZCBldmVuIGlmCmluZm9ybWF0aW9uIGlzIHByZXNlbnQgaW4gdGhlIHBlci1kaXJlY3RvcnkgY2FjaGUgZmlsZSBvciAnY2FjaGUnLiAgQW55CnN1YmRpcmVjdG9yaWVzIGZvdW5kIGFyZSBhZGRlZCB0byAnZGlycycuCgouVFAKRmNCb29sIEZjRGlyU2F2ZSAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBjaGFyICpkaXIpCkNyZWF0ZXMgdGhlIHBlci1kaXJlY3RvcnkgY2FjaGUgZmlsZSBmb3IgJ2RpcicgYW5kIHBvcHVsYXRlcyBpdCB3aXRoIHRoZQpmb250cyBpbiAnc2V0JyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gJ2RpcnMnLgoKLlRQCkZjQm9vbCBGY0RpckNhY2hlVmFsaWQgKGNvbnN0IEZjQ2hhcjggKmNhY2hlX2ZpbGUpClJldHVybnMgRmNUcnVlIGlmICdjYWNoZV9maWxlJyBpcyBubyBvbGRlciB0aGFuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBpdCwKZWxzZSBGY0ZhbHNlLgoKLlNTIEZjU3RyU2V0IGFuZCBGY1N0ckxpc3QKQSBkYXRhIHN0cnVjdHVyZSBmb3IgZW51bWVyYXRpbmcgc3RyaW5ncywgdXNlZCB0byBsaXN0IGRpcmVjdG9yaWVzIHdoaWxlCnNjYW5uaW5nIHRoZSBjb25maWd1cmF0aW9uIGFzIGRpcmVjdG9yaWVzIGFyZSBhZGRlZCB3aGlsZSBzY2FubmluZy4KCi5UUApGY1N0clNldCAqRmNTdHJTZXRDcmVhdGUgKHZvaWQpCkNyZWF0ZSBhbiBlbXB0eSBzZXQuCgouVFAKRmNCb29sIEZjU3RyU2V0TWVtYmVyIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQpSZXR1cm5zIHdoZXRoZXIgJ3MnIGlzIGEgbWVtYmVyIG9mICdzZXQnLgoKLlRQCkZjQm9vbCBGY1N0clNldEFkZCAoRmNTdHJTZXQgKnNldCwgY29uc3QgRmNDaGFyOCAqcykKQWRkcyBhIGNvcHkgb2YgJ3MnIHRvICdzZXQnLgoKLlRQCkZjQm9vbCBGY1N0clNldEFkZEZpbGVuYW1lIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQpBZGRzIGEgY29weSAncycgdG8gJ3NldCcsIFRoZSBjb3B5IGlzIGNyZWF0ZWQgd2l0aCBGY1N0ckNvcHlGaWxlbmFtZQpzbyB0aGF0IGxlYWRpbmcgJ34nIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIEhPTUUKZW52aXJvbm1lbnQgdmFyaWFibGUuCgouVFAKRmNCb29sIEZjU3RyU2V0RGVsIChGY1N0clNldCAqc2V0LCBjb25zdCBGY0NoYXI4ICpzKQpSZW1vdmVzICdzJyBmcm9tICdzZXQnLCByZXR1cm5pbmcgRmNUcnVlIGlmICdzJyB3YXMgYSBtZW1iZXIgZWxzZSBGY0ZhbHNlLgoKLlRQCnZvaWQgRmNTdHJTZXREZXN0cm95IChGY1N0clNldCAqc2V0KQpEZXN0cm95cyAnc2V0Jy4KCi5UUApGY1N0ckxpc3QgKkZjU3RyTGlzdENyZWF0ZSAoRmNTdHJTZXQgKnNldCkKQ3JlYXRlcyBhbiBlbnVtZXJhdG9yIHRvIGxpc3QgdGhlIHN0cmluZ3MgaW4gJ3NldCcuCgouVFAKRmNDaGFyOCAqRmNTdHJMaXN0TmV4dCAoRmNTdHJMaXN0ICpsaXN0KQpSZXR1cm5zIHRoZSBuZXh0IHN0cmluZyBpbiAnc2V0Jy4KCi5UUAp2b2lkIEZjU3RyTGlzdERvbmUgKEZjU3RyTGlzdCAqbGlzdCkKRGVzdHJveXMgdGhlIGVudW1lcmF0b3IgJ2xpc3QnLgoKLlNTIFN0cmluZyB1dGlsaXRpZXMKCi5UUAppbnQgRmNVdGY4VG9VY3M0IChGY0NoYXI4ICpzcmMsIEZjQ2hhcjMyICpkc3QsIGludCBsZW4pCkNvbnZlcnRzIHRoZSBuZXh0IFVuaWNvZGUgY2hhciBmcm9tICdzcmMnIGludG8gJ2RzdCcgYW5kIHJldHVybnMgdGhlIG51bWJlcgpvZiBieXRlcyBjb250YWluaW5nIHRoZSBjaGFyLiAgJ3NyYycgbnVzdCBiZSBhdCBsZWFzdCAnbGVuJyBieXRlcyBsb25nLgoKLlRQCmludCBGY1VjczRUb1V0ZjggKEZjQ2hhcjMyIHNyYywgRmNDaGFyOCBkc3RbRkNfVVRGOF9NQVhfTEVOXSkKQ29udmVydHMgdGhlIFVuaWNvZGUgY2hhciBmcm9tICdzcmMnIGludG8gJ2RzdCcgYW5kIHJldHVybnMgdGhlCm51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBjaGFyLgoKLlRQCkZjQm9vbCBGY1V0ZjhMZW4gKEZjQ2hhcjggKnNyYywgaW50IGxlbiwgaW50ICpuY2hhciwgaW50ICp3Y2hhcikKQ291bnRzIHRoZSBudW1iZXIgb2YgVW5pY29kZSBjaGFycyBpbiAnbGVuJyBieXRlcyBvZiAnc3JjJy4gIFBsYWNlcyB0aGF0CmNvdW50IGluICduY2hhcicuICAnd2NoYXInIGNvbnRhaW5zIDEsIDIgb3IgNCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZgpieXRlcyBuZWVkZWQgdG8gaG9sZCB0aGUgbGFyZ2VzdCB1bmljb2RlIGNoYXIgY291bnRlZC4gIFRoZSByZXR1cm4gdmFsdWUKaW5kaWNhdGVzIHdoZXRoZXIgJ3NyYycgaXMgYSB3ZWxsLWZvcm1lZCBVVEY4IHN0cmluZy4KCi5UUAppbnQgRmNVdGYxNlRvVWNzNCAoRmNDaGFyOCAqc3JjLCBGY0VuZGlhbiBlbmRpYW4sIEZjQ2hhcjMyICpkc3QsIGludCBsZW4pCkNvbnZlcnRzIHRoZSBuZXh0IFVuaWNvZGUgY2hhciBmcm9tICdzcmMnIGludG8gJ2RzdCcgYW5kIHJldHVybnMgdGhlCm51bWJlciBvZiBieXRlcyBjb250YWluaW5nIHRoZSBjaGFyLiAnc3JjJyBtdXN0IGJlIGF0IGxlYXN0ICdsZW4nIGJ5dGVzCmxvbmcuICBCeXRlcyBvZiAnc3JjJyBhcmUgY29tYmluZWQgaW50byAxNi1iaXQgdW5pdHMgYWNjb3JkaW5nIHRvICdlbmRpYW4nLgoKLlRQCkZjQm9vbCBGY1V0ZjE2TGVuIChGY0NoYXI4ICpzcmMsIEZjRW5kaWFuIGVuZGlhbiwgaW50IGxlbiwgaW50ICpuY2hhciwgaW50ICp3Y2hhcikKQ291bnRzIHRoZSBudW1iZXIgb2YgVW5pY29kZSBjaGFycyBpbiAnbGVuJyBieXRlcyBvZiAnc3JjJy4gIEJ5dGVzIG9mCidzcmMnIGFyZSBjb21iaW5lZCBpbnRvIDE2LWJpdCB1bml0cyBhY2NvcmRpbmcgdG8gJ2VuZGlhbicuICBQbGFjZXMgdGhhdApjb3VudCBpbiAnbmNoYXInLiAgJ3djaGFyJyBjb250YWlucyAxLCAyIG9yIDQgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YKYnl0ZXMgbmVlZGVkIHRvIGhvbGQgdGhlIGxhcmdlc3QgdW5pY29kZSBjaGFyIGNvdW50ZWQuICBUaGUgcmV0dXJuIHZhbHVlCmluZGljYXRlcyB3aGV0aGVyICdzdHJpbmcnIGlzIGEgd2VsbC1mb3JtZWQgVVRGMTYgc3RyaW5nLgoKLlRQCkZjQ2hhcjggKkZjU3RyQ29weSAoY29uc3QgRmNDaGFyOCAqcykKQWxsb2NhdGVzIG1lbW9yeSwgY29waWVzICdzJyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIGJ1ZmZlci4gIFllcywgdGhpcyBpcwonc3RyZHVwJywgYnV0IHRoYXQgZnVuY3Rpb24gaXNuJ3QgYXZhaWxhYmxlIG9uIGV2ZXJ5IHBsYXRmb3JtLgoKLlRQCkZjQ2hhcjggKkZjU3RyQ29weUZpbGVuYW1lIChjb25zdCBGY0NoYXI4ICpzKQpKdXN0IGxpa2UgRmNTdHJDb3B5IGV4Y2VwdCB0aGF0IGl0IGNvbnZlcnRzIGFueSBsZWFkaW5nICd+JyBjaGFyYWN0ZXJzIGluCidzJyB0byB0aGUgdmFsdWUgb2YgdGhlIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUuCiAgICAKLlRQCmludCBGY1N0ckNtcElnbm9yZUNhc2UgKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKUmV0dXJucyB0aGUgdXN1YWwgPDAsIDAsID4wIHJlc3VsdCBvZiBjb21wYXJpbmcgJ3MxJyBhbmQgJ3MyJy4gIFRoaXMgdGVzdAppcyBjYXNlLWluc2Vuc2l0aXZlIGluIHRoZSBBU0NJSSByYW5nZSBhbmQgd2lsbCBvcGVyYXRlIHByb3Blcmx5IHdpdGggVVRGOAplbmNvZGVkIHN0cmluZ3MsIGFsdGhvdWdoIGl0IGRvZXMgbm90IGNoZWNrIGZvciB3ZWxsIGZvcm1lZCBzdHJpbmdzLgoKLlRQCkZjQ2hhcjggKkZjU3RyRGlybmFtZSAoY29uc3QgRmNDaGFyOCAqZmlsZSkKUmV0dXJucyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgJ2ZpbGUnLgoKLlRQCkZjQ2hhcjggKkZjU3RyQmFzZW5hbWUgKGNvbnN0IEZjQ2hhcjggKmZpbGUpClJldHVybnMgdGhlIGZpbGVuYW1lIG9mICdmaWxlJyBzdHJpcHBlZCBvZiBhbnkgbGVhZGluZyBkaXJlY3RvcnkgbmFtZXMuCgouU0ggQ09ORklHVVJBVElPTiBGSUxFIEZPUk1BVApDb25maWd1cmF0aW9uIGZpbGVzIGZvciBmb250Y29uZmlnIGFyZSBzdG9yZWQgaW4gWE1MIGZvcm1hdDsgdGhpcwpmb3JtYXQgbWFrZXMgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiB0b29scyBlYXNpZXIgdG8gd3JpdGUgYW5kIGVuc3VyZXMgdGhhdAp0aGV5IHdpbGwgZ2VuZXJhdGUgc3ludGFjdGljYWxseSBjb3JyZWN0IGNvbmZpZ3VyYXRpb24gZmlsZXMuICBBcyBYTUwKZmlsZXMgYXJlIHBsYWluIHRleHQsIHRoZXkgY2FuIGFsc28gYmUgbWFuaXB1bGF0ZWQgYnkgdGhlIGV4cGVydCB1c2VyIHVzaW5nCmEgdGV4dCBlZGl0b3IuCi5QClRoZSBmb250Y29uZmlnIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiByZXNpZGVzIGluIHRoZSBleHRlcm5hbCBlbnRpdHkKImZvbnRzLmR0ZCI7IHRoaXMgaXMgbm9ybWFsbHkgc3RvcmVkIGluIHRoZSBkZWZhdWx0IGZvbnQgY29uZmlndXJhdGlvbgpkaXJlY3RvcnkgKC9ldGMvZm9udHMpLiAgRWFjaCBjb25maWd1cmF0aW9uIGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlCmZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci5zcAoubmYKCTw/eG1sIHZlcnNpb249IjEuMCI/PgoJPCFET0NUWVBFIGZvbnRjb25maWcgU1lTVEVNICJmb250cy5kdGQiPgoJPGZvbnRjb25maWc+CgkuLi4KCTwvZm9udGNvbmZpZz4KLmZpCi5QCi5TUyA8Zm9udGNvbmZpZz4KVGhpcyBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgZm9yIGEgZm9udCBjb25maWd1cmF0aW9uIGFuZCBjYW4gY29udGFpbgo8ZGlyPiwgPGNhY2hlPiwgPGluY2x1ZGU+LCA8bWF0Y2g+IGFuZCA8YWxpYXM+IGVsZW1lbnRzIGluIGFueSBvcmRlci4KCi5TUyA8ZGlyPgpUaGlzIGVsZW1lbnQgY29udGFpbnMgYSBkaXJlY3RvcnkgbmFtZSB3aGljaCB3aWxsIGJlIHNjYW5uZWQgZm9yIGZvbnQgZmlsZXMKdG8gaW5jbHVkZSBpbiB0aGUgc2V0IG9mIGF2YWlsYWJsZSBmb250cy4KCi5TUyA8Y2FjaGU+ClRoaXMgZWxlbWVudCBjb250YWlucyBhIGZpbGUgbmFtZSBmb3IgdGhlIHBlci11c2VyIGNhY2hlIG9mIGZvbnQKaW5mb3JtYXRpb24uICBJZiBpdCBzdGFydHMgd2l0aCAnficsIGl0IHJlZmVycyB0byBhIGZpbGUgaW4gdGhlIHVzZXJzCmhvbWUgZGlyZWN0b3J5LiAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBmb250cyB0aGF0Cmlzbid0IHByZXNlbnQgaW4gdGhlIHBlci1kaXJlY3RvcnkgY2FjaGUgZmlsZXMuICBJdCBpcyBhdXRvbWF0aWNhbGx5Cm1haW50YWluZWQgYnkgdGhlIGZvbnRjb25maWcgbGlicmFyeS4gIFRoZSBkZWZhdWx0IGZvciB0aGlzIGZpbGUgCmlzIGBgfi8uZm9udHMuY2FjaGUnJy4KCi5TUyA8aW5jbHVkZSBpZ25vcmVfbWlzc2luZz0ibm8iPgpUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYW4gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZpbGUuICBXaGVuCnRoZSBYTUwgZGF0YXR5cGUgaXMgdHJhdmVyc2VkIGJ5IEZjQ29uZmlnUGFyc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZQp3aWxsIGFsc28gYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGNvbmZpZ3VyYXRpb24gYnkgcGFzc2luZyB0aGUgZmlsZW5hbWUgdG8KRmNDb25maWdMb2FkQW5kUGFyc2UuICBJZiAnaWdub3JlX21pc3NpbmcnIGlzIHNldCB0byAieWVzIiBpbnN0ZWFkIG9mIHRoZQpkZWZhdWx0ICJubyIsIGEgbWlzc2luZyBmaWxlIHdpbGwgZWxpY2l0IG5vIHdhcm5pbmcgbWVzc2FnZSBmcm9tIHRoZSBsaWJyYXJ5LgoKLlNTIDxjb25maWc+ClRoaXMgZWxlbWVudCBwcm92aWRlcyBhIHBsYWNlIHRvIGNvbnNvbG9kYXRlIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbgppbmZvcm1hdGlvbi4gIDxjb25maWc+IGNhbiBjb250YWluIDxibGFuaz4gYW5kIDxyZXNjYW4+IGVsZW1lbnRzIGluIGFueQpvcmRlci4KCi5TUyA8Ymxhbms+CkZvbnRzIG9mdGVuIGluY2x1ZGUgImJyb2tlbiIgZ2x5cGhzIHdoaWNoIGFwcGVhciBpbiB0aGUgZW5jb2RpbmcgYnV0IGFyZQpkcmF3biBhcyBibGFua3Mgb24gdGhlIHNjcmVlbi4gIFdpdGhpbiB0aGUgPGJsYW5rPiBlbGVtZW50LCBwbGFjZSBlYWNoClVuaWNvZGUgY2hhcmFjdGVycyB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBibGFuayBpbiBhbiA8aW50PiBlbGVtZW50LgpDaGFyYWN0ZXJzIG91dHNpZGUgb2YgdGhpcyBzZXQgd2hpY2ggYXJlIGRyYXduIGFzIGJsYW5rIHdpbGwgYmUgZWxpZGVkIGZyb20KdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHN1cHBvcnRlZCBieSB0aGUgZm9udC4gIDxiCgouU1MgPHJlc2Nhbj4KVGhlIDxyZXNjYW4+IGVsZW1lbnQgaG9sZHMgYW4gPGludD4gZWxlbWVudCB3aGljaCBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQKaW50ZXJ2YWwgYmV0d2VlbiBhdXRvbWF0aWMgY2hlY2tzIGZvciBmb250IGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KRm9udGNvbmZpZyB3aWxsIHZhbGlkYXRlIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYW5kCmF1dG9tYXRpY2FsbHkgcmVidWlsZCB0aGUgaW50ZXJuYWwgZGF0YXN0cnVjdHVyZXMgd2hlbiB0aGlzIGludGVydmFsIHBhc3Nlcy4KCi5TUyA8bWF0Y2ggdGFyZ2V0PSJwYXR0ZXJuIj4KVGhpcyBlbGVtZW50IGhvbGRzIGZpcnN0IGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIDx0ZXN0PiBlbGVtZW50cyBhbmQgdGhlbgphIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZiA8ZWRpdD4gZWxlbWVudHMuICBQYXR0ZXJucyB3aGljaCBtYXRjaCBhbGwgb2YgdGhlCnRlc3RzIGFyZSBzdWJqZWN0ZWQgdG8gYWxsIHRoZSBlZGl0cy4gIElmICd0YXJnZXQnIGlzIHNldCB0byAiZm9udCIgaW5zdGVhZApvZiB0aGUgZGVmYXVsdCAicGF0dGVybiIsIHRoZW4gdGhpcyBlbGVtZW50IGFwcGxpZXMgdG8gdGhlIGZvbnQgbmFtZQpyZXN1bHRpbmcgZnJvbSBhIG1hdGNoIHJhdGhlciB0aGFuIGEgZm9udCBwYXR0ZXJuIHRvIGJlIG1hdGNoZWQuCgouU1MgPHRlc3QgcXVhbD0iYW55IiBuYW1lPSJwcm9wZXJ0eSIgY29tcGFyZT0iZXEiPgpUaGlzIGVsZW1lbnQgY29udGFpbnMgYSBzaW5nbGUgdmFsdWUgd2hpY2ggaXMgY29tcGFyZWQgd2l0aCB0aGUgcGF0dGVybgpwcm9wZXJ0eSAicHJvcGVydHkiIChzdWJzdGl0dXRlIGFueSBvZiB0aGUgcHJvcGVydHkgbmFtZXMgc2VlbiBhYm92ZSkuCidjb21wYXJlJyBjYW4gYmUgb25lIG9mICJlcSIsICJub3RfZXEiLCAibGVzcyIsICJsZXNzX2VxIiwgIm1vcmUiLCBvcgoibW9yZV9lcSIuICAncXVhbCcgbWF5IGVpdGhlciBiZSB0aGUgZGVmYXVsdCwgImFueSIsIGluIHdoaWNoIGNhc2UgdGhlIG1hdGNoCnN1Y2NlZWRzIGlmIGFueSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3BlcnR5IG1hdGNoZXMgdGhlIHRlc3QgdmFsdWUsIG9yCiJhbGwiLCBpbiB3aGljaCBjYXNlIGFsbCBvZiB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgbXVzdAptYXRjaCB0aGUgdGVzdCB2YWx1ZS4KCi5TUyA8ZWRpdCBuYW1lPSJwcm9wZXJ0eSIgbW9kZT0iYXNzaWduIiBiaW5kaW5nPSJ3ZWFrIj4KVGhpcyBlbGVtZW50IGNvbnRhaW5zIGEgbGlzdCBvZiBleHByZXNzaW9uIGVsZW1lbnRzIChhbnkgb2YgdGhlIHZhbHVlIG9yCm9wZXJhdG9yIGVsZW1lbnRzKS4gIFRoZSBleHByZXNzaW9uIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWQgYXQgcnVuLXRpbWUgYW5kCm1vZGlmeSB0aGUgcHJvcGVydHkgInByb3BlcnR5Ii4gIFRoZSBtb2RpZmljYXRpb24gZGVwZW5kcyBvbiB3aGV0aGVyCiJwcm9wZXJ0eSIgd2FzIG1hdGNoZWQgYnkgb25lIG9mIHRoZSBhc3NvY2lhdGVkIDx0ZXN0PiBlbGVtZW50cywgaWYgc28sIHRoZQptb2RpZmljYXRpb24gbWF5IGFmZmVjdCB0aGUgZmlyc3QgbWF0Y2hlZCB2YWx1ZS4gIEFueSB2YWx1ZXMgaW5zZXJ0ZWQgaW50bwp0aGUgcHJvcGVydHkgYXJlIGdpdmVuIHRoZSBpbmRpY2F0ZWQgYmluZGluZy4gJ21vZGUnIGlzIG9uZSBvZjoKLm5mCi5SUwoudGEgMWkgM2kgNWkKTW9kZQlPcGVyYXRpb24gd2l0aCBtYXRjaAlPcGVyYXRpb24gd2l0aG91dCBtYXRjaAoBAQEKImFzc2lnbiIJUmVwbGFjZSBtYXRjaGluZyB2YWx1ZQlSZXBsYWNlIGFsbCB2YWx1ZXMKImFzc2lnbl9yZXBsYWNlIglSZXBsYWNlIGFsbCB2YWx1ZXMJUmVwbGFjZSBhbGwgdmFsdWVzCiJwcmVwZW5kIglJbnNlcnQgYmVmb3JlIG1hdGNoaW5nIHZhbHVlCUluc2VydCBhdCBoZWFkIG9mIGxpc3QKInByZXBlbmRfZmlyc3QiCUluc2VydCBhdCBoZWFkIG9mIGxpc3QJSW5zZXJ0IGF0IGhlYWQgb2YgbGlzdAoiYXBwZW5kIglBcHBlbmQgYWZ0ZXIgbWF0Y2hpbmcgdmFsdWUJQXBwZW5kIGF0IGVuZCBvZiBsaXN0CiJhcHBlbmRfbGFzdCIJQXBwZW5kIGF0IGVuZCBvZiBsaXN0CUFwcGVuZCBhdCBlbmQgb2YgbGlzdAouUkUKLkRUCi5maQouU1MgPGludD4KLlNTIDxkb3VibGU+Ci5TUyA8c3RyaW5nPgouU1MgPGJvb2w+ClRoZXNlIGVsZW1lbnRzIGhvbGQgYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGluZGljYXRlZCB0eXBlLiAgPGJvb2w+IGVsZW1lbnRzCmhvbGQgZWl0aGVyIHRydWUgb3IgZmFsc2UuCi5TUyA8bWF0cml4PgpUaGlzIGVsZW1lbnQgaG9sZHMgdGhlIGZvdXIgPGRvdWJsZT4gZWxlbWVudHMgb2YgYW4gYWZmaW5lIHRyYW5zZm9ybWF0aW9uLgouU1MgPG5hbWU+CkhvbGRzIGEgcHJvcGVydHkgbmFtZS4gIEV2YWx1YXRlcyB0byB0aGUgZmlyc3QgdmFsdWUgZnJvbSB0aGUgcHJvcGVydHkgb2YKdGhlIGZvbnQsIG5vdCB0aGUgcGF0dGVybi4KLlNTIDxjb25zdD4KSG9sZHMgdGhlIG5hbWUgb2YgYSBjb25zdGFudDsgdGhlc2UgYXJlIGFsd2F5cyBpbnRlZ2VycyBhbmQgc2VydmUgYXMKc3ltYm9saWMgbmFtZXMgZm9yIGNvbW1vbiBmb250IHZhbHVlczoKLlJTCi5zcAoubmYKLnRhIDFpIDJpIDNpCi5sYyBcKGVtCkNvbnN0YW50CVByb3BlcnR5CUNQUCBzeW1ib2wKAQEBCmxpZ2h0CXdlaWdodAlGQ19XRUlHSFRfTElHSFQKbWVkaXVtCXdlaWdodAlGQ19XRUlHSFRfTUVESVVNCmRlbWlib2xkCXdlaWdodAlGQ19XRUlHSFRfREVNSUJPTEQKYm9sZAl3ZWlnaHQJRkNfV0VJR0hUX0JPTEQKYmxhY2sJd2VpZ2h0CUZDX1dFSUdIVF9CTEFDSwpyb21hbglzbGFudAlGQ19TTEFOVF9ST01BTgppdGFsaWMJc2xhbnQJRkNfU0xBTlRfSVRBTElDCm9ibGlxdWUJc2xhbnQJRkNfU0xBTlRfT0JMSVFVRQpwcm9wb3J0aW9uYWwJc3BhY2luZwlGQ19QUk9QT1JUSU9OQUwKbW9ubwlzcGFjaW5nCUZDX01PTk8KY2hhcmNlbGwJc3BhY2luZwlGQ19DSEFSQ0VMTApyZ2IJcmdiYQlGQ19SR0JBX1JHQgpiZ3IJcmdiYQlGQ19SR0JBX0JHUgp2cmdiCXJnYmEJRkNfUkdCQV9WUkdCCnZiZ3IJcmdiYQlGQ19SR0JBX1ZCR1IKLkRUCi5maQouUkUKLlNTIDxvcj4KLlNTIDxhbmQ+Ci5TUyA8cGx1cz4KLlNTIDxtaW51cz4KLlNTIDx0aW1lcz4KLlNTIDxkaXZpZGU+ClRoZXNlIGVsZW1lbnRzIHBlcmZvcm0gdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gb24gYSBsaXN0IG9mIGV4cHJlc3Npb24KZWxlbWVudHMuICA8b3I+IGFuZCA8YW5kPiBhcmUgYm9vbGVhbiwgbm90IGJpdHdpc2UuCi5TUyA8ZXE+Ci5TUyA8bm90X2VxPgouU1MgPGxlc3M+Ci5TUyA8bGVzc19lcT4KLlNTIDxtb3JlPgouU1MgPG1vcmVfZXE+ClRoZXNlIGVsZW1lbnRzIGNvbXBhcmUgdHdvIHZhbHVlcywgcHJvZHVjaW5nIGEgYm9vbGVhbiByZXN1bHQuCi5TUyA8bm90PgpJbnZlcnRzIHRoZSBib29sZWFuIHNlbnNlIG9mIGl0cyBvbmUgZXhwcmVzc2lvbiBlbGVtZW50Ci5TUyA8aWY+ClRoaXMgZWxlbWVudCB0YWtlcyB0aHJlZSBleHByZXNzaW9uIGVsZW1lbnRzOyBpZiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGlzCnRydWUsIGl0IHByb2R1Y2VzIHRoZSB2YWx1ZSBvZiB0aGUgc2Vjb25kLCBvdGhlcndpc2UgaXQgcHJvZHVjZXMgdGhlIHZhbHVlCm9mIHRoZSB0aGlyZC4KLlNTIDxhbGlhcz4KQWxpYXMgZWxlbWVudHMgcHJvdmlkZSBhIHNob3J0aGFuZCBub3RhdGlvbiBmb3IgdGhlIHNldCBvZiBjb21tb24gbWF0Y2gKb3BlcmF0aW9ucyBuZWVkZWQgdG8gc3Vic3RpdHV0ZSBvbmUgZm9udCBmYW1pbHkgZm9yIGFub3RoZXIuICBUaGV5IGNvbnRhaW4gYQo8ZmFtaWx5PiBlbGVtZW50IGZvbGxvd2VkIGJ5IG9wdGlvbmFsIDxwcmVmZXI+LCA8YWNjZXB0PiBhbmQgPGRlZmF1bHQ+CmVsZW1lbnRzLiAgRm9udHMgbWF0Y2hpbmcgdGhlIDxmYW1pbHk+IGVsZW1lbnQgYXJlIGVkaXRlZCB0byBwcmVwZW5kIHRoZQpsaXN0IG9mIDxwcmVmZXI+ZWQgZmFtaWxpZXMgYmVmb3JlIHRoZSBtYXRjaGluZyA8ZmFtaWx5PiwgYXBwZW5kIHRoZQo8YWNjZXB0PmFibGUgZmFtaWx5cyBhZnRlciB0aGUgbWF0Y2hpbmcgPGZhbWlseT4gYW5kIGFwcGVuZCB0aGUgPGRlZmF1bHQ+CmZhbWlsaWVzIHRvIHRoZSBlbmQgb2YgdGhlIGZhbWlseSBsaXN0LgouU1MgPGZhbWlseT4KSG9sZHMgYSBzaW5nbGUgZm9udCBmYW1pbHkgbmFtZQouU1MgPHByZWZlcj4KLlNTIDxhY2NlcHQ+Ci5TUyA8ZGVmYXVsdD4KVGhlc2UgaG9sZCBhIGxpc3Qgb2YgPGZhbWlseT4gZWxlbWVudHMgdG8gYmUgdXNlZCBieSB0aGUgPGFsaWFzPiBlbGVtZW50LgouU0ggRVhBTVBMRSBDT05GSUdVUkFUSU9OIEZJTEUKLlNTIFN5c3RlbSBjb25maWd1cmF0aW9uIGZpbGUKVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiBmaWxlCi5zcAoubmYKPD94bWwgdmVyc2lvbj0iMS4wIj8+CjwhRE9DVFlQRSBmb250Y29uZmlnIFNZU1RFTSAiZm9udHMuZHRkIj4KPCEtLSAvZXRjL2ZvbnRzL2ZvbnRzLmNvbmYgZmlsZSB0byBjb25maWd1cmUgc3lzdGVtIGZvbnQgYWNjZXNzIC0tPgo8Zm9udGNvbmZpZz4KPCEtLSAKCUZpbmQgZm9udHMgaW4gdGhlc2UgZGlyZWN0b3JpZXMKLS0+CjxkaXI+L3Vzci9YMTFSNi9saWIvWDExL2ZvbnRzL3RydWV0eXBlPC9kaXI+CjxkaXI+L3Vzci9YMTFSNi9saWIvWDExL2ZvbnRzL1R5cGUxPC9kaXI+Cgo8IS0tCglBY2NlcHQgZGVwcmVjYXRlZCAnbW9ubycgYWxpYXMsIHJlcGxhY2luZyBpdCB3aXRoICdtb25vc3BhY2UnCi0tPgo8bWF0Y2ggdGFyZ2V0PSJwYXR0ZXJuIj4KCTx0ZXN0IHF1YWw9ImFueSIgbmFtZT0iZmFtaWx5Ij48c3RyaW5nPm1vbm88L3N0cmluZz48L3Rlc3Q+Cgk8ZWRpdCBuYW1lPSJmYW1pbHkiIG1vZGU9ImFzc2lnbiI+PHN0cmluZz5tb25vc3BhY2U8L3N0cmluZz48L2VkaXQ+CjwvbWF0Y2g+Cgo8IS0tCglOYW1lcyBub3QgaW5jbHVkaW5nIGFueSB3ZWxsIGtub3duIGFsaWFzIGFyZSBnaXZlbiAnc2FucycKLS0+CjxtYXRjaCB0YXJnZXQ9InBhdHRlcm4iPgoJPHRlc3QgcXVhbD0iYWxsIiBuYW1lPSJmYW1pbHkiIG1vZGU9Im5vdF9lcSI+c2FuczwvdGVzdD4KCTx0ZXN0IHF1YWw9ImFsbCIgbmFtZT0iZmFtaWx5IiBtb2RlPSJub3RfZXEiPnNlcmlmPC90ZXN0PgoJPHRlc3QgcXVhbD0iYWxsIiBuYW1lPSJmYW1pbHkiIG1vZGU9Im5vdF9lcSI+bW9ub3NwYWNlPC90ZXN0PgoJPGVkaXQgbmFtZT0iZmFtaWx5IiBtb2RlPSJhcHBlbmRfbGFzdCI+PHN0cmluZz5zYW5zPC9zdHJpbmc+PC9lZGl0Pgo8L21hdGNoPgoKPCEtLQoJTG9hZCBwZXItdXNlciBjdXN0b21pemF0aW9uIGZpbGUsIGJ1dCBkb24ndCBjb21wbGFpbgoJaWYgaXQgZG9lc24ndCBleGlzdAotLT4KPGluY2x1ZGUgaWdub3JlX21pc3Npbmc9InllcyI+fi8uZm9udHMuY29uZjwvaW5jbHVkZT4KCjwhLS0KCUFsaWFzIHdlbGwga25vd24gZm9udCBuYW1lcyB0byBhdmFpbGFibGUgVHJ1ZVR5cGUgZm9udHMuCglUaGVzZSBzdWJzdGl0dXRlIFRydWVUeXBlIGZhY2VzIGZvciBzaW1pbGFyIFR5cGUxCglmYWNlcyB0byBpbXByb3ZlIHNjcmVlbiBhcHBlYXJhbmNlLgotLT4KPGFsaWFzPgoJPGZhbWlseT5UaW1lczwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PlRpbWVzIE5ldyBSb21hbjwvZmFtaWx5PjwvcHJlZmVyPgoJPGRlZmF1bHQ+PGZhbWlseT5zZXJpZjwvZmFtaWx5PjwvZGVmYXVsdD4KPC9hbGlhcz4KPGFsaWFzPgoJPGZhbWlseT5IZWx2ZXRpY2E8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5WZXJkYW5hPC9mYW1pbHk+PC9wcmVmZXI+Cgk8ZGVmYXVsdD48ZmFtaWx5PnNhbnM8L2ZhbWlseT48L2RlZmF1bHQ+CjwvYWxpYXM+CjxhbGlhcz4KCTxmYW1pbHk+Q291cmllcjwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PkNvdXJpZXIgTmV3PC9mYW1pbHk+PC9wcmVmZXI+Cgk8ZGVmYXVsdD48ZmFtaWx5Pm1vbm9zcGFjZTwvZmFtaWx5PjwvZGVmYXVsdD4KPC9hbGlhcz4KCjwhLS0KCVByb3ZpZGUgcmVxdWlyZWQgYWxpYXNlcyBmb3Igc3RhbmRhcmQgbmFtZXMKCURvIHRoZXNlIGFmdGVyIHRoZSB1c2VycyBjb25maWd1cmF0aW9uIGZpbGUgc28gdGhhdAoJYW55IGFsaWFzZXMgdGhlcmUgYXJlIHVzZWQgcHJlZmVyZW50aWFsbHkKLS0+CjxhbGlhcz4KCTxmYW1pbHk+c2VyaWY8L2ZhbWlseT4KCTxwcmVmZXI+PGZhbWlseT5UaW1lcyBOZXcgUm9tYW48L2ZhbWlseT48L3ByZWZlcj4KPC9hbGlhcz4KPGFsaWFzPgoJPGZhbWlseT5zYW5zPC9mYW1pbHk+Cgk8cHJlZmVyPjxmYW1pbHk+VmVyZGFuYTwvZmFtaWx5PjwvcHJlZmVyPgo8L2FsaWFzPgo8YWxpYXM+Cgk8ZmFtaWx5Pm1vbm9zcGFjZTwvZmFtaWx5PgoJPHByZWZlcj48ZmFtaWx5PkFuZGFsZSBNb25vPC9mYW1pbHk+PC9wcmVmZXI+CjwvYWxpYXM+CjwvZm9udGNvbmZpZz4KLmZpCi5TUyBVc2VyIGNvbmZpZ3VyYXRpb24gZmlsZQpUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBwZXItdXNlciBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBsaXZlcyBpbgp+Ly5mb250cy5jb25mCi5zcAoubmYKPD94bWwgdmVyc2lvbj0iMS4wIj8+CjwhRE9DVFlQRSBmb250Y29uZmlnIFNZU1RFTSAiZm9udHMuZHRkIj4KPCEtLSB+Ly5mb250cy5jb25mIGZvciBwZXItdXNlciBmb250IGNvbmZpZ3VyYXRpb24gLS0+Cjxmb250Y29uZmlnPgoKPCEtLQoJUHJpdmF0ZSBmb250IGRpcmVjdG9yeQotLT4KPGRpcj5+L21pc2MvZm9udHM8L2Rpcj4KCjwhLS0KCXVzZSByZ2Igc3ViLXBpeGVsIG9yZGVyaW5nIHRvIGltcHJvdmUgZ2x5cGggYXBwZWFyYW5jZSBvbgoJTENEIHNjcmVlbnMuICBDaGFuZ2VzIGFmZmVjdGluZyByZW5kZXJpbmcsIGJ1dCBub3QgbWF0Y2hpbmcKCXNob3VsZCBhbHdheXMgdXNlIHRhcmdldD0iZm9udCIuCi0tPgo8bWF0Y2ggdGFyZ2V0PSJmb250Ij4KCTxlZGl0IG5hbWU9InJnYmEiIG1vZGU9ImFzc2lnbiI+PGNvbnN0PnJnYjwvY29uc3Q+PC9lZGl0Pgo8L21hdGNoPgo8L2ZvbnRjb25maWc+Ci5maQouU0ggRklMRVMKLkIgZm9udHMuY29uZgpjb250YWlucyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5CmNvbnNpc3Rpbmcgb2YgZGlyZWN0b3JpZXMgdG8gbG9vayBhdCBmb3IgZm9udCBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzCmluc3RydWN0aW9ucyBvbiBlZGl0aW5nIHByb2dyYW0gc3BlY2lmaWVkIGZvbnQgcGF0dGVybnMgYmVmb3JlIGF0dGVtcHRpbmcgdG8KbWF0Y2ggdGhlIGF2YWlsYWJsZSBmb250cy4gIEl0IGlzIGluIHhtbCBmb3JtYXQuCgouQiBmb250cy5kdGQgCmlzIGEgRFREIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgouQiB+Ly5mb250cy5jb25mCmlzIHRoZSBjb252ZW50aW9uYWwgbG9jYXRpb24gZm9yIHBlci11c2VyIGZvbnQgY29uZmlndXJhdGlvbiwgYWx0aG91Z2ggdGhlCmFjdHVhbCBsb2NhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGdsb2JhbCBmb250cy5jb25mIGZpbGUuCgouQiB+Ly5mb250cy5jYWNoZQppcyB0aGUgY29udmVudGlvbmFsIHJlcG9zaXRvcnkgb2YgZm9udCBpbmZvcm1hdGlvbiB0aGF0IGlzbid0IGZvdW5kIGluIHRoZQpwZXItZGlyZWN0b3J5IGNhY2hlcy4gIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IG1haW50YWluZWQgYnkgZm9udGNvbmZpZy4KCi5TSCBBVVRIT1IKS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIHRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4K