REDROOM
PHP 8.3.31
Path:
Logout
Edit File
Size: 523.15 KB
Close
/opt/alt/python313/lib64/python3.13/pydoc_data/__pycache__/topics.cpython-313.opt-2.pyc
Text
Base64
8w0NCgAAAAA5mfBpayoIAOMAAAAAAAAAAAAAAAAOAAAAAAAAAPPKAQAAlQAwAFMAUwFfAVMCUwNfAVMEUwVfAVMGUwdfAVMIUwlfAVMKUwtfAVMMUw1fAVMOUw9fAVMQUxFfAVMSUxNfAVMUUxVfAVMWUxdfAVMYUxlfAVMaUxtfAVMcUx1fAVMeUx9fAVMgUyFfATAAUyJTI18BUyRTJV8BUyZTJ18BUyhTKV8BUypTK18BUyxTLV8BUy5TL18BUzBTMV8BUzJTM18BUzRTNV8BUzZTN18BUzhTOV8BUzpTO18BUzxTPV8BUz5TP18BU0BTQV8BU0JTQ18BRQEwAFNEU0VfAVNGU0dfAVNIU0lfAVNKU0tfAVNMU01fAVNOU09fAVNQU1FfAVNSU1NfAVNUUz9fAVNVU1ZfAVNXU1hfAVNZU1pfAVNbU1xfAVNdU15fAVNfU2BfAVNhU2JfAVNjU2RfAUUBMABTZVNmXwFTZ1NoXwFTaVNqXwFTa1NsXwFTbVNuXwFTb1NwXwFTcVNyXwFTc1N0XwFTdVN2XwFTd1N4XwFTeVN6XwFTe1N8XwFTfVN+XwFTf1OAXwFTgVOCXwFTg1OEXwFThVOGXwFFAVOHU4hTiVOKU4tTjFONU45Tj1OQU5FTklOTLgxFAXIAZ5QpldoGYXNzZXJ0YXYEAABUaGUgImFzc2VydCIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioKCkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucwppbnRvIGEgcHJvZ3JhbToKCiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl0KClRoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0bwoKICAgaWYgX19kZWJ1Z19fOgogICAgICAgaWYgbm90IGV4cHJlc3Npb246IHJhaXNlIEFzc2VydGlvbkVycm9yCgpUaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyBlcXVpdmFsZW50IHRvCgogICBpZiBfX2RlYnVnX186CiAgICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKQoKVGhlc2UgZXF1aXZhbGVuY2VzIGFzc3VtZSB0aGF0ICJfX2RlYnVnX18iIGFuZCAiQXNzZXJ0aW9uRXJyb3IiIHJlZmVyCnRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50CmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyCm5vcm1hbCBjaXJjdW1zdGFuY2VzLCAiRmFsc2UiIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCAoY29tbWFuZApsaW5lIG9wdGlvbiAiLU8iKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuCiJhc3NlcnQiIHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZSB0aW1lLgpOb3RlIHRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZQpleHByZXNzaW9uIHRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcwpwYXJ0IG9mIHRoZSBzdGFjayB0cmFjZS4KCkFzc2lnbm1lbnRzIHRvICJfX2RlYnVnX18iIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgYnVpbHQtaW4KdmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuCtoKYXNzaWdubWVudHXDLAAAQXNzaWdubWVudCBzdGF0ZW1lbnRzCioqKioqKioqKioqKioqKioqKioqKgoKQXNzaWdubWVudCBzdGF0ZW1lbnRzIGFyZSB1c2VkIHRvIChyZSliaW5kIG5hbWVzIHRvIHZhbHVlcyBhbmQgdG8KbW9kaWZ5IGF0dHJpYnV0ZXMgb3IgaXRlbXMgb2YgbXV0YWJsZSBvYmplY3RzOgoKICAgYXNzaWdubWVudF9zdG10IDo6PSAodGFyZ2V0X2xpc3QgIj0iKSsgKHN0YXJyZWRfZXhwcmVzc2lvbiB8IHlpZWxkX2V4cHJlc3Npb24pCiAgIHRhcmdldF9saXN0ICAgICA6Oj0gdGFyZ2V0ICgiLCIgdGFyZ2V0KSogWyIsIl0KICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyCiAgICAgICAgICAgICAgICAgICAgICAgfCAiKCIgW3RhcmdldF9saXN0XSAiKSIKICAgICAgICAgICAgICAgICAgICAgICB8ICJbIiBbdGFyZ2V0X2xpc3RdICJdIgogICAgICAgICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlcmVmCiAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNpbmcKICAgICAgICAgICAgICAgICAgICAgICB8ICIqIiB0YXJnZXQKCihTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yICphdHRyaWJ1dGVyZWYqLAoqc3Vic2NyaXB0aW9uKiwgYW5kICpzbGljaW5nKi4pCgpBbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdAp0aGlzIGNhbiBiZSBhIHNpbmdsZSBleHByZXNzaW9uIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHRoZSBsYXR0ZXIKeWllbGRpbmcgYSB0dXBsZSkgYW5kIGFzc2lnbnMgdGhlIHNpbmdsZSByZXN1bHRpbmcgb2JqZWN0IHRvIGVhY2ggb2YKdGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LgoKQXNzaWdubWVudCBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGRlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUgdGFyZ2V0CihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZQpyZWZlcmVuY2UsIHN1YnNjcmlwdGlvbiBvciBzbGljaW5nKSwgdGhlIG11dGFibGUgb2JqZWN0IG11c3QKdWx0aW1hdGVseSBwZXJmb3JtIHRoZSBhc3NpZ25tZW50IGFuZCBkZWNpZGUgYWJvdXQgaXRzIHZhbGlkaXR5LCBhbmQKbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXMKb2JzZXJ2ZWQgYnkgdmFyaW91cyB0eXBlcyBhbmQgdGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBnaXZlbiB3aXRoIHRoZQpkZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgdHlwZXMgKHNlZSBzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlCmhpZXJhcmNoeSkuCgpBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0LCBvcHRpb25hbGx5IGVuY2xvc2VkIGluCnBhcmVudGhlc2VzIG9yIHNxdWFyZSBicmFja2V0cywgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhcyBmb2xsb3dzLgoKKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBzaW5nbGUgdGFyZ2V0IHdpdGggbm8gdHJhaWxpbmcgY29tbWEsCiAgb3B0aW9uYWxseSBpbiBwYXJlbnRoZXNlcywgdGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0byB0aGF0IHRhcmdldC4KCiogRWxzZToKCiAgKiBJZiB0aGUgdGFyZ2V0IGxpc3QgY29udGFpbnMgb25lIHRhcmdldCBwcmVmaXhlZCB3aXRoIGFuIGFzdGVyaXNrLAogICAgY2FsbGVkIGEg4oCcc3RhcnJlZOKAnSB0YXJnZXQ6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIGF0CiAgICBsZWFzdCBhcyBtYW55IGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgbWludXMKICAgIG9uZS4gIFRoZSBmaXJzdCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8KICAgIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgVGhlIGZpbmFsIGl0ZW1zCiAgICBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXRzIGFmdGVyIHRoZSBzdGFycmVkCiAgICB0YXJnZXQuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgaXRlcmFibGUgaXMgdGhlbgogICAgYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICh0aGUgbGlzdCBjYW4gYmUgZW1wdHkpLgoKICAqIEVsc2U6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcwogICAgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZQogICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy4KCkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgc2luZ2xlIHRhcmdldCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzCmZvbGxvd3MuCgoqIElmIHRoZSB0YXJnZXQgaXMgYW4gaWRlbnRpZmllciAobmFtZSk6CgogICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSAiZ2xvYmFsIiBvciAibm9ubG9jYWwiIHN0YXRlbWVudAogICAgaW4gdGhlIGN1cnJlbnQgY29kZSBibG9jazogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUKICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLgoKICAqIE90aGVyd2lzZTogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQogICAgb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICJub25sb2NhbCIsIHJlc3BlY3RpdmVseS4KCiAgVGhlIG5hbWUgaXMgcmVib3VuZCBpZiBpdCB3YXMgYWxyZWFkeSBib3VuZC4gIFRoaXMgbWF5IGNhdXNlIHRoZQogIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoCiAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgZGVzdHJ1Y3RvciAoaWYgaXQKICBoYXMgb25lKSB0byBiZSBjYWxsZWQuCgoqIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbgogIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoCiAgYXNzaWduYWJsZSBhdHRyaWJ1dGVzOyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgIlR5cGVFcnJvciIgaXMKICByYWlzZWQuICBUaGF0IG9iamVjdCBpcyB0aGVuIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvCiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlcwogIGFuIGV4Y2VwdGlvbiAodXN1YWxseSBidXQgbm90IG5lY2Vzc2FyaWx5ICJBdHRyaWJ1dGVFcnJvciIpLgoKICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlCiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSByaWdodC1oYW5kIHNpZGUKICBleHByZXNzaW9uLCAiYS54IiBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vCiAgaW5zdGFuY2UgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgbGVmdC1oYW5kIHNpZGUKICB0YXJnZXQgImEueCIgaXMgYWx3YXlzIHNldCBhcyBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGNyZWF0aW5nIGl0IGlmCiAgbmVjZXNzYXJ5LiAgVGh1cywgdGhlIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkKICByZWZlciB0byB0aGUgc2FtZSBhdHRyaWJ1dGU6IGlmIHRoZSByaWdodC1oYW5kIHNpZGUgZXhwcmVzc2lvbgogIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSwgdGhlIGxlZnQtaGFuZCBzaWRlIGNyZWF0ZXMgYSBuZXcKICBpbnN0YW5jZSBhdHRyaWJ1dGUgYXMgdGhlIHRhcmdldCBvZiB0aGUgYXNzaWdubWVudDoKCiAgICAgY2xhc3MgQ2xzOgogICAgICAgICB4ID0gMyAgICAgICAgICAgICAjIGNsYXNzIHZhcmlhYmxlCiAgICAgaW5zdCA9IENscygpCiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgMwoKICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3IKICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi4KCiogSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUKICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2UKICBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSBvciBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSkuCiAgTmV4dCwgdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC4KCiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpLCB0aGUKICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZeKAmXMKICBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZQogIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZeKAmXMgbGVuZ3RoLCBhbmQgdGhlIHNlcXVlbmNlIGlzIGFza2VkCiAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgSWYgdGhlCiAgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCAiSW5kZXhFcnJvciIgaXMgcmFpc2VkIChhc3NpZ25tZW50IHRvIGEKICBzdWJzY3JpcHRlZCBzZXF1ZW5jZSBjYW5ub3QgYWRkIG5ldyBpdGVtcyB0byBhIGxpc3QpLgoKICBJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksIHRoZQogIHN1YnNjcmlwdCBtdXN0IGhhdmUgYSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgbWFwcGluZ+KAmXMga2V5IHR5cGUsCiAgYW5kIHRoZSBtYXBwaW5nIGlzIHRoZW4gYXNrZWQgdG8gY3JlYXRlIGEga2V5L3ZhbHVlIHBhaXIgd2hpY2ggbWFwcwogIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuCiAgZXhpc3Rpbmcga2V5L3ZhbHVlIHBhaXIgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsIG9yIGluc2VydCBhIG5ldwogIGtleS92YWx1ZSBwYWlyIChpZiBubyBrZXkgd2l0aCB0aGUgc2FtZSB2YWx1ZSBleGlzdGVkKS4KCiAgRm9yIHVzZXItZGVmaW5lZCBvYmplY3RzLCB0aGUgIl9fc2V0aXRlbV9fKCkiIG1ldGhvZCBpcyBjYWxsZWQgd2l0aAogIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy4KCiogSWYgdGhlIHRhcmdldCBpcyBhIHNsaWNpbmc6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlIHJlZmVyZW5jZQogIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0IChzdWNoIGFzIGEKICBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0IG9mIHRoZSBzYW1lCiAgdHlwZS4gIE5leHQsIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCwKICBpbnNvZmFyIHRoZXkgYXJlIHByZXNlbnQ7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCB0aGUgc2VxdWVuY2XigJlzCiAgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gaW50ZWdlcnMuIElmIGVpdGhlciBib3VuZCBpcwogIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2XigJlzIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcKICBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNl4oCZcyBsZW5ndGgsCiAgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlIHRoZQogIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSBsZW5ndGggb2YgdGhlCiAgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLAogIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgdGFyZ2V0CiAgc2VxdWVuY2UgYWxsb3dzIGl0LgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlCnN5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsIGFuZAppbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgY2F1c2luZwpsZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLgoKQWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgYXNzaWdubWVudCBpbXBsaWVzIHRoYXQgb3ZlcmxhcHMgYmV0d2Vlbgp0aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlIOKAmHNpbXVsdGFuZW91c+KAmSAoZm9yCmV4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlCmNvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIG9jY3VyIGxlZnQtdG8tcmlnaHQsIHNvbWV0aW1lcwpyZXN1bHRpbmcgaW4gY29uZnVzaW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gcHJpbnRzCiJbMCwgMl0iOgoKICAgeCA9IFswLCAxXQogICBpID0gMAogICBpLCB4W2ldID0gMSwgMiAgICAgICAgICMgaSBpcyB1cGRhdGVkLCB0aGVuIHhbaV0gaXMgdXBkYXRlZAogICBwcmludCh4KQoKU2VlIGFsc286CgogICoqUEVQIDMxMzIqKiAtIEV4dGVuZGVkIEl0ZXJhYmxlIFVucGFja2luZwogICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIip0YXJnZXQiIGZlYXR1cmUuCgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYQpiaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDoKCiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbikKICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmcKICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSIKCihTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWUKc3ltYm9scy4pCgpBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWwKYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb24KbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudApvbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuClRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS4KCkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudCBsaWtlICJ4ICs9IDEiIGNhbiBiZSByZXdyaXR0ZW4gYXMgIngKPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluIHRoZQphdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsCnRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgcmF0aGVyIHRoYW4KY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkIG9iamVjdAppcyBtb2RpZmllZCBpbnN0ZWFkLgoKVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSBsZWZ0LQpoYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldCis9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCBwZXJmb3Jtcwp0aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLgoKV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYQpzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50CnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksCndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeQpvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWwKYmluYXJ5IG9wZXJhdGlvbnMuCgpGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCBhYm91dApjbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLgoKCkFubm90YXRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKKkFubm90YXRpb24qIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mCmEgdmFyaWFibGUgb3IgYXR0cmlidXRlIGFubm90YXRpb24gYW5kIGFuIG9wdGlvbmFsIGFzc2lnbm1lbnQKc3RhdGVtZW50OgoKICAgYW5ub3RhdGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0ICI6IiBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiPSIgKHN0YXJyZWRfZXhwcmVzc2lvbiB8IHlpZWxkX2V4cHJlc3Npb24pXQoKVGhlIGRpZmZlcmVuY2UgZnJvbSBub3JtYWwgQXNzaWdubWVudCBzdGF0ZW1lbnRzIGlzIHRoYXQgb25seSBhIHNpbmdsZQp0YXJnZXQgaXMgYWxsb3dlZC4KClRoZSBhc3NpZ25tZW50IHRhcmdldCBpcyBjb25zaWRlcmVkIOKAnHNpbXBsZeKAnSBpZiBpdCBjb25zaXN0cyBvZiBhCnNpbmdsZSBuYW1lIHRoYXQgaXMgbm90IGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLiBGb3Igc2ltcGxlIGFzc2lnbm1lbnQKdGFyZ2V0cywgaWYgaW4gY2xhc3Mgb3IgbW9kdWxlIHNjb3BlLCB0aGUgYW5ub3RhdGlvbnMgYXJlIGV2YWx1YXRlZAphbmQgc3RvcmVkIGluIGEgc3BlY2lhbCBjbGFzcyBvciBtb2R1bGUgYXR0cmlidXRlICJfX2Fubm90YXRpb25zX18iCnRoYXQgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZnJvbSB2YXJpYWJsZSBuYW1lcyAobWFuZ2xlZCBpZiBwcml2YXRlKQp0byBldmFsdWF0ZWQgYW5ub3RhdGlvbnMuIFRoaXMgYXR0cmlidXRlIGlzIHdyaXRhYmxlIGFuZCBpcwphdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXQgdGhlIHN0YXJ0IG9mIGNsYXNzIG9yIG1vZHVsZSBib2R5IGV4ZWN1dGlvbiwKaWYgYW5ub3RhdGlvbnMgYXJlIGZvdW5kIHN0YXRpY2FsbHkuCgpJZiB0aGUgYXNzaWdubWVudCB0YXJnZXQgaXMgbm90IHNpbXBsZSAoYW4gYXR0cmlidXRlLCBzdWJzY3JpcHQgbm9kZSwKb3IgcGFyZW50aGVzaXplZCBuYW1lKSwgdGhlIGFubm90YXRpb24gaXMgZXZhbHVhdGVkIGlmIGluIGNsYXNzIG9yCm1vZHVsZSBzY29wZSwgYnV0IG5vdCBzdG9yZWQuCgpJZiBhIG5hbWUgaXMgYW5ub3RhdGVkIGluIGEgZnVuY3Rpb24gc2NvcGUsIHRoZW4gdGhpcyBuYW1lIGlzIGxvY2FsCmZvciB0aGF0IHNjb3BlLiBBbm5vdGF0aW9ucyBhcmUgbmV2ZXIgZXZhbHVhdGVkIGFuZCBzdG9yZWQgaW4gZnVuY3Rpb24Kc2NvcGVzLgoKSWYgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyBwcmVzZW50LCBhbiBhbm5vdGF0ZWQgYXNzaWdubWVudCBwZXJmb3Jtcwp0aGUgYWN0dWFsIGFzc2lnbm1lbnQgYmVmb3JlIGV2YWx1YXRpbmcgYW5ub3RhdGlvbnMgKHdoZXJlCmFwcGxpY2FibGUpLiBJZiB0aGUgcmlnaHQgaGFuZCBzaWRlIGlzIG5vdCBwcmVzZW50IGZvciBhbiBleHByZXNzaW9uCnRhcmdldCwgdGhlbiB0aGUgaW50ZXJwcmV0ZXIgZXZhbHVhdGVzIHRoZSB0YXJnZXQgZXhjZXB0IGZvciB0aGUgbGFzdAoiX19zZXRpdGVtX18oKSIgb3IgIl9fc2V0YXR0cl9fKCkiIGNhbGwuCgpTZWUgYWxzbzoKCiAgKipQRVAgNTI2KiogLSBTeW50YXggZm9yIFZhcmlhYmxlIEFubm90YXRpb25zCiAgICAgVGhlIHByb3Bvc2FsIHRoYXQgYWRkZWQgc3ludGF4IGZvciBhbm5vdGF0aW5nIHRoZSB0eXBlcyBvZgogICAgIHZhcmlhYmxlcyAoaW5jbHVkaW5nIGNsYXNzIHZhcmlhYmxlcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzKSwKICAgICBpbnN0ZWFkIG9mIGV4cHJlc3NpbmcgdGhlbSB0aHJvdWdoIGNvbW1lbnRzLgoKICAqKlBFUCA0ODQqKiAtIFR5cGUgaGludHMKICAgICBUaGUgcHJvcG9zYWwgdGhhdCBhZGRlZCB0aGUgInR5cGluZyIgbW9kdWxlIHRvIHByb3ZpZGUgYSBzdGFuZGFyZAogICAgIHN5bnRheCBmb3IgdHlwZSBhbm5vdGF0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGluIHN0YXRpYyBhbmFseXNpcwogICAgIHRvb2xzIGFuZCBJREVzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuODogTm93IGFubm90YXRlZCBhc3NpZ25tZW50cyBhbGxvdyB0aGUgc2FtZQpleHByZXNzaW9ucyBpbiB0aGUgcmlnaHQgaGFuZCBzaWRlIGFzIHJlZ3VsYXIgYXNzaWdubWVudHMuIFByZXZpb3VzbHksCnNvbWUgZXhwcmVzc2lvbnMgKGxpa2UgdW4tcGFyZW50aGVzaXplZCB0dXBsZSBleHByZXNzaW9ucykgY2F1c2VkIGEKc3ludGF4IGVycm9yLgp6FmFzc2lnbm1lbnQtZXhwcmVzc2lvbnN16AMAAEFzc2lnbm1lbnQgZXhwcmVzc2lvbnMKKioqKioqKioqKioqKioqKioqKioqKgoKICAgYXNzaWdubWVudF9leHByZXNzaW9uIDo6PSBbaWRlbnRpZmllciAiOj0iXSBleHByZXNzaW9uCgpBbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gKHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBhIOKAnG5hbWVkIGV4cHJlc3Npb27igJ0Kb3Ig4oCcd2FscnVz4oCdKSBhc3NpZ25zIGFuICJleHByZXNzaW9uIiB0byBhbiAiaWRlbnRpZmllciIsIHdoaWxlIGFsc28KcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgImV4cHJlc3Npb24iLgoKT25lIGNvbW1vbiB1c2UgY2FzZSBpcyB3aGVuIGhhbmRsaW5nIG1hdGNoZWQgcmVndWxhciBleHByZXNzaW9uczoKCiAgIGlmIG1hdGNoaW5nIDo9IHBhdHRlcm4uc2VhcmNoKGRhdGEpOgogICAgICAgZG9fc29tZXRoaW5nKG1hdGNoaW5nKQoKT3IsIHdoZW4gcHJvY2Vzc2luZyBhIGZpbGUgc3RyZWFtIGluIGNodW5rczoKCiAgIHdoaWxlIGNodW5rIDo9IGZpbGUucmVhZCg5MDAwKToKICAgICAgIHByb2Nlc3MoY2h1bmspCgpBc3NpZ25tZW50IGV4cHJlc3Npb25zIG11c3QgYmUgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNlcyB3aGVuIHVzZWQgYXMKZXhwcmVzc2lvbiBzdGF0ZW1lbnRzIGFuZCB3aGVuIHVzZWQgYXMgc3ViLWV4cHJlc3Npb25zIGluIHNsaWNpbmcsCmNvbmRpdGlvbmFsLCBsYW1iZGEsIGtleXdvcmQtYXJndW1lbnQsIGFuZCBjb21wcmVoZW5zaW9uLWlmCmV4cHJlc3Npb25zIGFuZCBpbiAiYXNzZXJ0IiwgIndpdGgiLCBhbmQgImFzc2lnbm1lbnQiIHN0YXRlbWVudHMuIEluCmFsbCBvdGhlciBwbGFjZXMgd2hlcmUgdGhleSBjYW4gYmUgdXNlZCwgcGFyZW50aGVzZXMgYXJlIG5vdCByZXF1aXJlZCwKaW5jbHVkaW5nIGluICJpZiIgYW5kICJ3aGlsZSIgc3RhdGVtZW50cy4KCkFkZGVkIGluIHZlcnNpb24gMy44OiBTZWUgKipQRVAgNTcyKiogZm9yIG1vcmUgZGV0YWlscyBhYm91dAphc3NpZ25tZW50IGV4cHJlc3Npb25zLgraBWFzeW5jYTgLAABDb3JvdXRpbmVzCioqKioqKioqKioKCkFkZGVkIGluIHZlcnNpb24gMy41LgoKCkNvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICBhc3luY19mdW5jZGVmIDo6PSBbZGVjb3JhdG9yc10gImFzeW5jIiAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIKICAgICAgICAgICAgICAgICAgICAgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlCgpFeGVjdXRpb24gb2YgUHl0aG9uIGNvcm91dGluZXMgY2FuIGJlIHN1c3BlbmRlZCBhbmQgcmVzdW1lZCBhdCBtYW55CnBvaW50cyAoc2VlICpjb3JvdXRpbmUqKS4gImF3YWl0IiBleHByZXNzaW9ucywgImFzeW5jIGZvciIgYW5kICJhc3luYwp3aXRoIiBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uLgoKRnVuY3Rpb25zIGRlZmluZWQgd2l0aCAiYXN5bmMgZGVmIiBzeW50YXggYXJlIGFsd2F5cyBjb3JvdXRpbmUKZnVuY3Rpb25zLCBldmVuIGlmIHRoZXkgZG8gbm90IGNvbnRhaW4gImF3YWl0IiBvciAiYXN5bmMiIGtleXdvcmRzLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhICJ5aWVsZCBmcm9tIiBleHByZXNzaW9uIGluc2lkZSB0aGUgYm9keQpvZiBhIGNvcm91dGluZSBmdW5jdGlvbi4KCkFuIGV4YW1wbGUgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb246CgogICBhc3luYyBkZWYgZnVuYyhwYXJhbTEsIHBhcmFtMik6CiAgICAgICBkb19zdHVmZigpCiAgICAgICBhd2FpdCBzb21lX2Nvcm91dGluZSgpCgpDaGFuZ2VkIGluIHZlcnNpb24gMy43OiAiYXdhaXQiIGFuZCAiYXN5bmMiIGFyZSBub3cga2V5d29yZHM7CnByZXZpb3VzbHkgdGhleSB3ZXJlIG9ubHkgdHJlYXRlZCBhcyBzdWNoIGluc2lkZSB0aGUgYm9keSBvZiBhCmNvcm91dGluZSBmdW5jdGlvbi4KCgpUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50Cj09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIGFzeW5jX2Zvcl9zdG10IDo6PSAiYXN5bmMiIGZvcl9zdG10CgpBbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBwcm92aWRlcyBhbiAiX19haXRlcl9fIiBtZXRob2QgdGhhdApkaXJlY3RseSByZXR1cm5zIGFuICphc3luY2hyb25vdXMgaXRlcmF0b3IqLCB3aGljaCBjYW4gY2FsbAphc3luY2hyb25vdXMgY29kZSBpbiBpdHMgIl9fYW5leHRfXyIgbWV0aG9kLgoKVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudCBhbGxvd3MgY29udmVuaWVudCBpdGVyYXRpb24gb3Zlcgphc3luY2hyb25vdXMgaXRlcmFibGVzLgoKVGhlIGZvbGxvd2luZyBjb2RlOgoKICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOgogICAgICAgU1VJVEUKICAgZWxzZToKICAgICAgIFNVSVRFMgoKSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86CgogICBpdGVyID0gKElURVIpLl9fYWl0ZXJfXygpCiAgIHJ1bm5pbmcgPSBUcnVlCgogICB3aGlsZSBydW5uaW5nOgogICAgICAgdHJ5OgogICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IGl0ZXIuX19hbmV4dF9fKCkKICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb246CiAgICAgICAgICAgcnVubmluZyA9IEZhbHNlCiAgICAgICBlbHNlOgogICAgICAgICAgIFNVSVRFCiAgIGVsc2U6CiAgICAgICBTVUlURTIKCmV4Y2VwdCB0aGF0IGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBpcyB1c2VkIGZvciAiX19haXRlcl9fKCkiCmFuZCAiX19hbmV4dF9fKCkiLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgb3V0c2lkZSB0aGUgYm9keQpvZiBhIGNvcm91dGluZSBmdW5jdGlvbi4KCgpUaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdAoKQW4gKmFzeW5jaHJvbm91cyBjb250ZXh0IG1hbmFnZXIqIGlzIGEgKmNvbnRleHQgbWFuYWdlciogdGhhdCBpcyBhYmxlCnRvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy4KClRoZSBmb2xsb3dpbmcgY29kZToKCiAgIGFzeW5jIHdpdGggRVhQUkVTU0lPTiBhcyBUQVJHRVQ6CiAgICAgICBTVUlURQoKaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86CgogICBtYW5hZ2VyID0gKEVYUFJFU1NJT04pCiAgIGFlbnRlciA9IG1hbmFnZXIuX19hZW50ZXJfXwogICBhZXhpdCA9IG1hbmFnZXIuX19hZXhpdF9fCiAgIHZhbHVlID0gYXdhaXQgYWVudGVyKCkKICAgaGl0X2V4Y2VwdCA9IEZhbHNlCgogICB0cnk6CiAgICAgICBUQVJHRVQgPSB2YWx1ZQogICAgICAgU1VJVEUKICAgZXhjZXB0OgogICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKICAgICAgIGlmIG5vdCBhd2FpdCBhZXhpdCgqc3lzLmV4Y19pbmZvKCkpOgogICAgICAgICAgIHJhaXNlCiAgIGZpbmFsbHk6CiAgICAgICBpZiBub3QgaGl0X2V4Y2VwdDoKICAgICAgICAgICBhd2FpdCBhZXhpdChOb25lLCBOb25lLCBOb25lKQoKZXhjZXB0IHRoYXQgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGlzIHVzZWQgZm9yICJfX2FlbnRlcl9fKCkiCmFuZCAiX19hZXhpdF9fKCkiLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgdGhlCmJvZHkgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpTZWUgYWxzbzoKCiAgKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IG1hZGUgY29yb3V0aW5lcyBhIHByb3BlciBzdGFuZGFsb25lIGNvbmNlcHQgaW4KICAgICBQeXRob24sIGFuZCBhZGRlZCBzdXBwb3J0aW5nIHN5bnRheC4KehBhdG9tLWlkZW50aWZpZXJzYeAHAABJZGVudGlmaWVycyAoTmFtZXMpCioqKioqKioqKioqKioqKioqKioKCkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb24gSWRlbnRpZmllcnMKYW5kIGtleXdvcmRzIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gTmFtaW5nIGFuZCBiaW5kaW5nIGZvcgpkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy4KCldoZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW4gb2JqZWN0LCBldmFsdWF0aW9uIG9mIHRoZSBhdG9tIHlpZWxkcwp0aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0CnJhaXNlcyBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbi4KCgpQcml2YXRlIG5hbWUgbWFuZ2xpbmcKPT09PT09PT09PT09PT09PT09PT09CgpXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCB0ZXh0dWFsbHkgb2NjdXJzIGluIGEgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMKd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYW5kIGRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZQp1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlIG5hbWUqIG9mIHRoYXQgY2xhc3MuCgpTZWUgYWxzbzogVGhlIGNsYXNzIHNwZWNpZmljYXRpb25zLgoKTW9yZSBwcmVjaXNlbHksIHByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgbG9uZ2VyIGZvcm0gYmVmb3JlCmNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMgbG9uZ2VyIHRoYW4KMjU1IGNoYXJhY3RlcnMsIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdHJ1bmNhdGlvbiBtYXkgaGFwcGVuLgoKVGhlIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCBjb250ZXh0IGluIHdoaWNoCnRoZSBpZGVudGlmaWVyIGlzIHVzZWQgYnV0IG9ubHkgdGhlIGZvbGxvd2luZyBwcml2YXRlIGlkZW50aWZpZXJzIGFyZQptYW5nbGVkOgoKKiBBbnkgbmFtZSB1c2VkIGFzIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgdGhhdCBpcyBhc3NpZ25lZCBvciByZWFkIG9yCiAgYW55IG5hbWUgb2YgYW4gYXR0cmlidXRlIGJlaW5nIGFjY2Vzc2VkLgoKICBUaGUgIl9fbmFtZV9fIiBhdHRyaWJ1dGUgb2YgbmVzdGVkIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIHR5cGUKICBhbGlhc2VzIGlzIGhvd2V2ZXIgbm90IG1hbmdsZWQuCgoqIFRoZSBuYW1lIG9mIGltcG9ydGVkIG1vZHVsZXMsIGUuZy4sICJfX3NwYW0iIGluICJpbXBvcnQgX19zcGFtIi4gSWYKICB0aGUgbW9kdWxlIGlzIHBhcnQgb2YgYSBwYWNrYWdlIChpLmUuLCBpdHMgbmFtZSBjb250YWlucyBhIGRvdCksIHRoZQogIG5hbWUgaXMgKm5vdCogbWFuZ2xlZCwgZS5nLiwgdGhlICJfX2ZvbyIgaW4gImltcG9ydCBfX2Zvby5iYXIiIGlzCiAgbm90IG1hbmdsZWQuCgoqIFRoZSBuYW1lIG9mIGFuIGltcG9ydGVkIG1lbWJlciwgZS5nLiwgIl9fZiIgaW4gImZyb20gc3BhbSBpbXBvcnQKICBfX2YiLgoKVGhlIHRyYW5zZm9ybWF0aW9uIHJ1bGUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoKKiBUaGUgY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgc2luZ2xlCiAgbGVhZGluZyB1bmRlcnNjb3JlIGluc2VydGVkLCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZiB0aGUgaWRlbnRpZmllciwKICBlLmcuLCB0aGUgaWRlbnRpZmllciAiX19zcGFtIiBvY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCAiRm9vIiwKICAiX0ZvbyIgb3IgIl9fRm9vIiBpcyB0cmFuc2Zvcm1lZCB0byAiX0Zvb19fc3BhbSIuCgoqIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsIHRoZSB0cmFuc2Zvcm1hdGlvbgogIGlzIHRoZSBpZGVudGl0eSwgZS5nLiwgdGhlIGlkZW50aWZpZXIgIl9fc3BhbSIgb2NjdXJyaW5nIGluIGEgY2xhc3MKICBuYW1lZCAiXyIgb3IgIl9fIiBpcyBsZWZ0IGFzIGlzLgp6DWF0b20tbGl0ZXJhbHN1DQMAAExpdGVyYWxzCioqKioqKioqCgpQeXRob24gc3VwcG9ydHMgc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljCmxpdGVyYWxzOgoKICAgbGl0ZXJhbCA6Oj0gc3RyaW5nbGl0ZXJhbCB8IGJ5dGVzbGl0ZXJhbAogICAgICAgICAgICAgICB8IGludGVnZXIgfCBmbG9hdG51bWJlciB8IGltYWdudW1iZXIKCkV2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgKHN0cmluZywKYnl0ZXMsIGludGVnZXIsIGZsb2F0aW5nLXBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggdGhlIGdpdmVuCnZhbHVlLiAgVGhlIHZhbHVlIG1heSBiZSBhcHByb3hpbWF0ZWQgaW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmctcG9pbnQKYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiBMaXRlcmFscyBmb3IgZGV0YWlscy4KCkFsbCBsaXRlcmFscyBjb3JyZXNwb25kIHRvIGltbXV0YWJsZSBkYXRhIHR5cGVzLCBhbmQgaGVuY2UgdGhlCm9iamVjdOKAmXMgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZQpldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlIHNhbWUKb2NjdXJyZW5jZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IG9yIGEgZGlmZmVyZW50IG9jY3VycmVuY2UpIG1heSBvYnRhaW4KdGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLgp6EGF0dHJpYnV0ZS1hY2Nlc3N1uDYAAEN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3MKKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZgphdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICJ4Lm5hbWUiKSBmb3IKY2xhc3MgaW5zdGFuY2VzLgoKb2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpCgogICBDYWxsZWQgd2hlbiB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgYWNjZXNzIGZhaWxzIHdpdGggYW4KICAgIkF0dHJpYnV0ZUVycm9yIiAoZWl0aGVyICJfX2dldGF0dHJpYnV0ZV9fKCkiIHJhaXNlcyBhbgogICAiQXR0cmlidXRlRXJyb3IiIGJlY2F1c2UgKm5hbWUqIGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgYW4KICAgYXR0cmlidXRlIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiI7IG9yICJfX2dldF9fKCkiIG9mIGEgKm5hbWUqCiAgIHByb3BlcnR5IHJhaXNlcyAiQXR0cmlidXRlRXJyb3IiKS4gIFRoaXMgbWV0aG9kIHNob3VsZCBlaXRoZXIKICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAiQXR0cmlidXRlRXJyb3IiCiAgIGV4Y2VwdGlvbi4gVGhlICJvYmplY3QiIGNsYXNzIGl0c2VsZiBkb2VzIG5vdCBwcm92aWRlIHRoaXMgbWV0aG9kLgoKICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSwKICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnkKICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgZG9uZSBib3RoIGZvcgogICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlCiAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgYXQKICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiB0YWtlIHRvdGFsIGNvbnRyb2wgYnkgbm90CiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0CiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZQogICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbAogICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy4KCm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCgogICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yCiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgIl9fZ2V0YXR0cl9fKCkiLAogICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyCiAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgbWV0aG9kCiAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW4KICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MKICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvcgogICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLgoKICAgTm90ZToKCiAgICAgVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHMKICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvcgogICAgIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlIFNwZWNpYWwgbWV0aG9kIGxvb2t1cC4KCiAgIEZvciBjZXJ0YWluIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgYWNjZXNzZXMsIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudAogICAib2JqZWN0Ll9fZ2V0YXR0cl9fIiB3aXRoIGFyZ3VtZW50cyAib2JqIiBhbmQgIm5hbWUiLgoKb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQoKICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWQKICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlCiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZQogICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC4KCiAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdAogICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSwKICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLgoKICAgRm9yIGNlcnRhaW4gc2Vuc2l0aXZlIGF0dHJpYnV0ZSBhc3NpZ25tZW50cywgcmFpc2VzIGFuIGF1ZGl0aW5nCiAgIGV2ZW50ICJvYmplY3QuX19zZXRhdHRyX18iIHdpdGggYXJndW1lbnRzICJvYmoiLCAibmFtZSIsICJ2YWx1ZSIuCgpvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKCiAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2YKICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXMKICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC4KCiAgIEZvciBjZXJ0YWluIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgZGVsZXRpb25zLCByYWlzZXMgYW4gYXVkaXRpbmcgZXZlbnQKICAgIm9iamVjdC5fX2RlbGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIgYW5kICJuYW1lIi4KCm9iamVjdC5fX2Rpcl9fKHNlbGYpCgogICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBbiBpdGVyYWJsZSBtdXN0IGJlCiAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBpdGVyYWJsZSB0byBhIGxpc3QgYW5kCiAgIHNvcnRzIGl0LgoKCkN1c3RvbWl6aW5nIG1vZHVsZSBhdHRyaWJ1dGUgYWNjZXNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgptb2R1bGUuX19nZXRhdHRyX18oKQptb2R1bGUuX19kaXJfXygpCgpTcGVjaWFsIG5hbWVzICJfX2dldGF0dHJfXyIgYW5kICJfX2Rpcl9fIiBjYW4gYmUgYWxzbyB1c2VkIHRvCmN1c3RvbWl6ZSBhY2Nlc3MgdG8gbW9kdWxlIGF0dHJpYnV0ZXMuIFRoZSAiX19nZXRhdHRyX18iIGZ1bmN0aW9uIGF0CnRoZSBtb2R1bGUgbGV2ZWwgc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYW4KYXR0cmlidXRlIGFuZCByZXR1cm4gdGhlIGNvbXB1dGVkIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciIuCklmIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb24gYSBtb2R1bGUgb2JqZWN0IHRocm91Z2ggdGhlIG5vcm1hbApsb29rdXAsIGkuZS4gIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCkiLCB0aGVuICJfX2dldGF0dHJfXyIgaXMKc2VhcmNoZWQgaW4gdGhlIG1vZHVsZSAiX19kaWN0X18iIGJlZm9yZSByYWlzaW5nIGFuICJBdHRyaWJ1dGVFcnJvciIuCklmIGZvdW5kLCBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHRoZSByZXN1bHQgaXMKcmV0dXJuZWQuCgpUaGUgIl9fZGlyX18iIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgbm8gYXJndW1lbnRzLCBhbmQgcmV0dXJuIGFuCml0ZXJhYmxlIG9mIHN0cmluZ3MgdGhhdCByZXByZXNlbnRzIHRoZSBuYW1lcyBhY2Nlc3NpYmxlIG9uIG1vZHVsZS4gSWYKcHJlc2VudCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIHN0YW5kYXJkICJkaXIoKSIgc2VhcmNoIG9uIGEKbW9kdWxlLgoKbW9kdWxlLl9fY2xhc3NfXwoKRm9yIGEgbW9yZSBmaW5lIGdyYWluZWQgY3VzdG9taXphdGlvbiBvZiB0aGUgbW9kdWxlIGJlaGF2aW9yIChzZXR0aW5nCmF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV0Yy4pLCBvbmUgY2FuIHNldCB0aGUgIl9fY2xhc3NfXyIgYXR0cmlidXRlCm9mIGEgbW9kdWxlIG9iamVjdCB0byBhIHN1YmNsYXNzIG9mICJ0eXBlcy5Nb2R1bGVUeXBlIi4gRm9yIGV4YW1wbGU6CgogICBpbXBvcnQgc3lzCiAgIGZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUKCiAgIGNsYXNzIFZlcmJvc2VNb2R1bGUoTW9kdWxlVHlwZSk6CiAgICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICAgcmV0dXJuIGYnVmVyYm9zZSB7c2VsZi5fX25hbWVfX30nCgogICAgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGF0dHIsIHZhbHVlKToKICAgICAgICAgICBwcmludChmJ1NldHRpbmcge2F0dHJ9Li4uJykKICAgICAgICAgICBzdXBlcigpLl9fc2V0YXR0cl9fKGF0dHIsIHZhbHVlKQoKICAgc3lzLm1vZHVsZXNbX19uYW1lX19dLl9fY2xhc3NfXyA9IFZlcmJvc2VNb2R1bGUKCk5vdGU6CgogIERlZmluaW5nIG1vZHVsZSAiX19nZXRhdHRyX18iIGFuZCBzZXR0aW5nIG1vZHVsZSAiX19jbGFzc19fIiBvbmx5CiAgYWZmZWN0IGxvb2t1cHMgbWFkZSB1c2luZyB0aGUgYXR0cmlidXRlIGFjY2VzcyBzeW50YXgg4oCTIGRpcmVjdGx5CiAgYWNjZXNzaW5nIHRoZSBtb2R1bGUgZ2xvYmFscyAod2hldGhlciBieSBjb2RlIHdpdGhpbiB0aGUgbW9kdWxlLCBvcgogIHZpYSBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxl4oCZcyBnbG9iYWxzIGRpY3Rpb25hcnkpIGlzIHVuYWZmZWN0ZWQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy41OiAiX19jbGFzc19fIiBtb2R1bGUgYXR0cmlidXRlIGlzIG5vdyB3cml0YWJsZS4KCkFkZGVkIGluIHZlcnNpb24gMy43OiAiX19nZXRhdHRyX18iIGFuZCAiX19kaXJfXyIgbW9kdWxlIGF0dHJpYnV0ZXMuCgpTZWUgYWxzbzoKCiAgKipQRVAgNTYyKiogLSBNb2R1bGUgX19nZXRhdHRyX18gYW5kIF9fZGlyX18KICAgICBEZXNjcmliZXMgdGhlICJfX2dldGF0dHJfXyIgYW5kICJfX2Rpcl9fIiBmdW5jdGlvbnMgb24gbW9kdWxlcy4KCgpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcwpjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhbgoqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXLigJlzIGNsYXNzCmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGUKZXhhbXBsZXMgYmVsb3csIOKAnHRoZSBhdHRyaWJ1dGXigJ0gcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwp0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3PigJkgIl9fZGljdF9fIi4gIFRoZSAib2JqZWN0IgpjbGFzcyBpdHNlbGYgZG9lcyBub3QgaW1wbGVtZW50IGFueSBvZiB0aGVzZSBwcm90b2NvbHMuCgpvYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXI9Tm9uZSkKCiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZQogICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZQogICBhY2Nlc3MpLiBUaGUgb3B0aW9uYWwgKm93bmVyKiBhcmd1bWVudCBpcyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlCiAgICppbnN0YW5jZSogaXMgdGhlIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwKICAgb3IgIk5vbmUiIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLgoKICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgY29tcHV0ZWQgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLgoKICAgKipQRVAgMjUyKiogc3BlY2lmaWVzIHRoYXQgIl9fZ2V0X18oKSIgaXMgY2FsbGFibGUgd2l0aCBvbmUgb3IgdHdvCiAgIGFyZ3VtZW50cy4gIFB5dGhvbuKAmXMgb3duIGJ1aWx0LWluIGRlc2NyaXB0b3JzIHN1cHBvcnQgdGhpcwogICBzcGVjaWZpY2F0aW9uOyBob3dldmVyLCBpdCBpcyBsaWtlbHkgdGhhdCBzb21lIHRoaXJkLXBhcnR5IHRvb2xzCiAgIGhhdmUgZGVzY3JpcHRvcnMgdGhhdCByZXF1aXJlIGJvdGggYXJndW1lbnRzLiAgUHl0aG9u4oCZcyBvd24KICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgaW1wbGVtZW50YXRpb24gYWx3YXlzIHBhc3NlcyBpbiBib3RoIGFyZ3VtZW50cwogICB3aGV0aGVyIHRoZXkgYXJlIHJlcXVpcmVkIG9yIG5vdC4KCm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSkKCiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lcgogICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi4KCiAgIE5vdGUsIGFkZGluZyAiX19zZXRfXygpIiBvciAiX19kZWxldGVfXygpIiBjaGFuZ2VzIHRoZSBraW5kIG9mCiAgIGRlc2NyaXB0b3IgdG8gYSDigJxkYXRhIGRlc2NyaXB0b3LigJ0uICBTZWUgSW52b2tpbmcgRGVzY3JpcHRvcnMgZm9yCiAgIG1vcmUgZGV0YWlscy4KCm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKQoKICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlCiAgIG93bmVyIGNsYXNzLgoKSW5zdGFuY2VzIG9mIGRlc2NyaXB0b3JzIG1heSBhbHNvIGhhdmUgdGhlICJfX29iamNsYXNzX18iIGF0dHJpYnV0ZQpwcmVzZW50OgoKb2JqZWN0Ll9fb2JqY2xhc3NfXwoKICAgVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZQogICBhcyBzcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyB0aGlzCiAgIGFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzcwogICBhdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlCiAgIGdpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSBmaXJzdAogICBwb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgYXR0cmlidXRlIGZvcgogICB1bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuCgoKSW52b2tpbmcgRGVzY3JpcHRvcnMKPT09PT09PT09PT09PT09PT09PT0KCkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGgg4oCcYmluZGluZwpiZWhhdmlvcuKAnSwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzCmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmQKIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0CmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLgoKVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZQp0aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN04oCZcyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICJhLngiIGhhcyBhCmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fWyd4J10iLCB0aGVuCiJ0eXBlKGEpLl9fZGljdF9fWyd4J10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2YKInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy4KCkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGUKZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kCmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZQpwcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmQKaG93IHRoZXkgd2VyZSBjYWxsZWQuCgpUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICJhLngiLiBIb3cKdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOgoKRGlyZWN0IENhbGwKICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseQogICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLgoKSW5zdGFuY2UgQmluZGluZwogICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUKICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bJ3gnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi4KCkNsYXNzIEJpbmRpbmcKICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOgogICAiQS5fX2RpY3RfX1sneCddLl9fZ2V0X18oTm9uZSwgQSkiLgoKU3VwZXIgQmluZGluZwogICBBIGRvdHRlZCBsb29rdXAgc3VjaCBhcyAic3VwZXIoQSwgYSkueCIgc2VhcmNoZXMKICAgImEuX19jbGFzc19fLl9fbXJvX18iIGZvciBhIGJhc2UgY2xhc3MgIkIiIGZvbGxvd2luZyAiQSIgYW5kIHRoZW4KICAgcmV0dXJucyAiQi5fX2RpY3RfX1sneCddLl9fZ2V0X18oYSwgQSkiLiAgSWYgbm90IGEgZGVzY3JpcHRvciwgIngiCiAgIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KCkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHMKb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmUgYW55CmNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgIl9fZGVsZXRlX18oKSIuICBJZiBpdApkb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm4KdGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN04oCZcwppbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiBhbmQvb3IKIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzIG5laXRoZXIsIGl0IGlzCmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoCiJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZQoiX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiCihhbmQvb3IgIl9fZGVsZXRlX18oKSIpIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuCmluc3RhbmNlIGRpY3Rpb25hcnkuICBJbiBjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlCm92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLgoKUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyB0aG9zZSBkZWNvcmF0ZWQgd2l0aCAiQHN0YXRpY21ldGhvZCIgYW5kCiJAY2xhc3NtZXRob2QiKSBhcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwKaW5zdGFuY2VzIGNhbiByZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwKaW5zdGFuY2VzIHRvIGFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZQpzYW1lIGNsYXNzLgoKVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci4KQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuCgoKX19zbG90c19fCj09PT09PT09PQoKKl9fc2xvdHNfXyogYWxsb3cgdXMgdG8gZXhwbGljaXRseSBkZWNsYXJlIGRhdGEgbWVtYmVycyAobGlrZQpwcm9wZXJ0aWVzKSBhbmQgZGVueSB0aGUgY3JlYXRpb24gb2YgIl9fZGljdF9fIiBhbmQgKl9fd2Vha3JlZl9fKgoodW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gKl9fc2xvdHNfXyogb3IgYXZhaWxhYmxlIGluIGEgcGFyZW50LikKClRoZSBzcGFjZSBzYXZlZCBvdmVyIHVzaW5nICJfX2RpY3RfXyIgY2FuIGJlIHNpZ25pZmljYW50LiBBdHRyaWJ1dGUKbG9va3VwIHNwZWVkIGNhbiBiZSBzaWduaWZpY2FudGx5IGltcHJvdmVkIGFzIHdlbGwuCgpvYmplY3QuX19zbG90c19fCgogICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlCiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICpfX3Nsb3RzX18qCiAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGUKICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICJfX2RpY3RfXyIgYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2gKICAgaW5zdGFuY2UuCgpOb3RlcyBvbiB1c2luZyAqX19zbG90c19fKjoKCiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgIl9fZGljdF9fIiBhbmQKICAqX193ZWFrcmVmX18qIGF0dHJpYnV0ZSBvZiB0aGUgaW5zdGFuY2VzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUuCgoqIFdpdGhvdXQgYSAiX19kaWN0X18iIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ldwogIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG8KICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWYKICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZAogICInX19kaWN0X18nIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyoKICBkZWNsYXJhdGlvbi4KCiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmcKICAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCAid2VhayByZWZlcmVuY2VzIiB0byBpdHMgaW5zdGFuY2VzLiBJZgogIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCAiJ19fd2Vha3JlZl9fJyIgdG8gdGhlCiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uCgoqICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmcKICBkZXNjcmlwdG9ycyBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXMgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMKICBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkCiAgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlCiAgZGVzY3JpcHRvciBhc3NpZ25tZW50LgoKKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbm90IGxpbWl0ZWQgdG8gdGhlIGNsYXNzCiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gICpfX3Nsb3RzX18qIGRlY2xhcmVkIGluIHBhcmVudHMgYXJlIGF2YWlsYWJsZQogIGluIGNoaWxkIGNsYXNzZXMuIEhvd2V2ZXIsIGluc3RhbmNlcyBvZiBhIGNoaWxkIHN1YmNsYXNzIHdpbGwgZ2V0IGEKICAiX19kaWN0X18iIGFuZCAqX193ZWFrcmVmX18qIHVubGVzcyB0aGUgc3ViY2xhc3MgYWxzbyBkZWZpbmVzCiAgKl9fc2xvdHNfXyogKHdoaWNoIHNob3VsZCBvbmx5IGNvbnRhaW4gbmFtZXMgb2YgYW55ICphZGRpdGlvbmFsKgogIHNsb3RzKS4KCiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2UKICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnkKICByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLiBUaGlzCiAgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhCiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy4KCiogIlR5cGVFcnJvciIgd2lsbCBiZSByYWlzZWQgaWYgbm9uZW1wdHkgKl9fc2xvdHNfXyogYXJlIGRlZmluZWQgZm9yIGEKICBjbGFzcyBkZXJpdmVkIGZyb20gYSAiInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZSIgc3VjaCBhcwogICJpbnQiLCAiYnl0ZXMiLCBhbmQgInR1cGxlIi4KCiogQW55IG5vbi1zdHJpbmcgKml0ZXJhYmxlKiBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouCgoqIElmIGEgImRpY3Rpb25hcnkiIGlzIHVzZWQgdG8gYXNzaWduICpfX3Nsb3RzX18qLCB0aGUgZGljdGlvbmFyeSBrZXlzCiAgd2lsbCBiZSB1c2VkIGFzIHRoZSBzbG90IG5hbWVzLiBUaGUgdmFsdWVzIG9mIHRoZSBkaWN0aW9uYXJ5IGNhbiBiZQogIHVzZWQgdG8gcHJvdmlkZSBwZXItYXR0cmlidXRlIGRvY3N0cmluZ3MgdGhhdCB3aWxsIGJlIHJlY29nbmlzZWQgYnkKICAiaW5zcGVjdC5nZXRkb2MoKSIgYW5kIGRpc3BsYXllZCBpbiB0aGUgb3V0cHV0IG9mICJoZWxwKCkiLgoKKiAiX19jbGFzc19fIiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWUKICAqX19zbG90c19fKi4KCiogTXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2l0aCBtdWx0aXBsZSBzbG90dGVkIHBhcmVudCBjbGFzc2VzIGNhbiBiZQogIHVzZWQsIGJ1dCBvbmx5IG9uZSBwYXJlbnQgaXMgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZXMgY3JlYXRlZCBieQogIHNsb3RzICh0aGUgb3RoZXIgYmFzZXMgbXVzdCBoYXZlIGVtcHR5IHNsb3QgbGF5b3V0cykgLSB2aW9sYXRpb25zCiAgcmFpc2UgIlR5cGVFcnJvciIuCgoqIElmIGFuICppdGVyYXRvciogaXMgdXNlZCBmb3IgKl9fc2xvdHNfXyogdGhlbiBhICpkZXNjcmlwdG9yKiBpcwogIGNyZWF0ZWQgZm9yIGVhY2ggb2YgdGhlIGl0ZXJhdG9y4oCZcyB2YWx1ZXMuIEhvd2V2ZXIsIHRoZSAqX19zbG90c19fKgogIGF0dHJpYnV0ZSB3aWxsIGJlIGFuIGVtcHR5IGl0ZXJhdG9yLgp6FGF0dHJpYnV0ZS1yZWZlcmVuY2VzYVUDAABBdHRyaWJ1dGUgcmVmZXJlbmNlcwoqKioqKioqKioqKioqKioqKioqKgoKQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZToKCiAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllcgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHMKYXR0cmlidXRlIHJlZmVyZW5jZXMsIHdoaWNoIG1vc3Qgb2JqZWN0cyBkby4gIFRoaXMgb2JqZWN0IGlzIHRoZW4KYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlIGlkZW50aWZpZXIuIFRoZSB0eXBlCmFuZCB2YWx1ZSBwcm9kdWNlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucwpvZiB0aGUgc2FtZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIG1heSB5aWVsZCBkaWZmZXJlbnQgb2JqZWN0cy4KClRoaXMgcHJvZHVjdGlvbiBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZQoiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2Qgb3IgdGhlICJfX2dldGF0dHJfXygpIiBtZXRob2QuICBUaGUKIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGlzIGNhbGxlZCBmaXJzdCBhbmQgZWl0aGVyIHJldHVybnMgYSB2YWx1ZQpvciByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUuCgpJZiBhbiAiQXR0cmlidXRlRXJyb3IiIGlzIHJhaXNlZCBhbmQgdGhlIG9iamVjdCBoYXMgYSAiX19nZXRhdHRyX18oKSIKbWV0aG9kLCB0aGF0IG1ldGhvZCBpcyBjYWxsZWQgYXMgYSBmYWxsYmFjay4K2glhdWdhc3NpZ25h7gcAAEF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGEKYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6CgogICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pCiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nCiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iCgooU2VlIHNlY3Rpb24gUHJpbWFyaWVzIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0IHRocmVlCnN5bWJvbHMuKQoKQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsCmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uCmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnQKb24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LgpUaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuCgpBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnQgbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzICJ4Cj0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGUKYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLAp0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuCmNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCBvYmplY3QKaXMgbW9kaWZpZWQgaW5zdGVhZC4KClVubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgbGVmdC0KaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciBleGFtcGxlLCAiYVtpXQorPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXMKdGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi4KCldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGEKc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudApzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LAp3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnkKb3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsCmJpbmFyeSBvcGVyYXRpb25zLgoKRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSBjYXZlYXQgYWJvdXQKY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy4K2gVhd2FpdHrMQXdhaXQgZXhwcmVzc2lvbgoqKioqKioqKioqKioqKioqCgpTdXNwZW5kIHRoZSBleGVjdXRpb24gb2YgKmNvcm91dGluZSogb24gYW4gKmF3YWl0YWJsZSogb2JqZWN0LiBDYW4Kb25seSBiZSB1c2VkIGluc2lkZSBhICpjb3JvdXRpbmUgZnVuY3Rpb24qLgoKICAgYXdhaXRfZXhwciA6Oj0gImF3YWl0IiBwcmltYXJ5CgpBZGRlZCBpbiB2ZXJzaW9uIDMuNS4K2gZiaW5hcnl1Fw8AAEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5CmxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluIG5vbi0KbnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d28KbGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZQpvcGVyYXRvcnM6CgogICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICJAIiBtX2V4cHIgfAogICAgICAgICAgICAgIG1fZXhwciAiLy8iIHVfZXhwciB8IG1fZXhwciAiLyIgdV9leHByIHwKICAgICAgICAgICAgICBtX2V4cHIgIiUiIHVfZXhwcgogICBhX2V4cHIgOjo9IG1fZXhwciB8IGFfZXhwciAiKyIgbV9leHByIHwgYV9leHByICItIiBtX2V4cHIKClRoZSAiKiIgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzIGFyZ3VtZW50cy4KVGhlIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMsIG9yIG9uZSBhcmd1bWVudCBtdXN0IGJlIGFuCmludGVnZXIgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlCm51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZCB0aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuCkluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcyBwZXJmb3JtZWQ7IGEgbmVnYXRpdmUKcmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLgoKVGhpcyBvcGVyYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHNwZWNpYWwgIl9fbXVsX18oKSIgYW5kCiJfX3JtdWxfXygpIiBtZXRob2RzLgoKVGhlICJAIiAoYXQpIG9wZXJhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1hdHJpeAptdWx0aXBsaWNhdGlvbi4gIE5vIGJ1aWx0aW4gUHl0aG9uIHR5cGVzIGltcGxlbWVudCB0aGlzIG9wZXJhdG9yLgoKVGhpcyBvcGVyYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHNwZWNpYWwgIl9fbWF0bXVsX18oKSIgYW5kCiJfX3JtYXRtdWxfXygpIiBtZXRob2RzLgoKQWRkZWQgaW4gdmVyc2lvbiAzLjUuCgpUaGUgIi8iIChkaXZpc2lvbikgYW5kICIvLyIgKGZsb29yIGRpdmlzaW9uKSBvcGVyYXRvcnMgeWllbGQgdGhlCnF1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QKY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuIERpdmlzaW9uIG9mIGludGVnZXJzIHlpZWxkcyBhIGZsb2F0LCB3aGlsZQpmbG9vciBkaXZpc2lvbiBvZiBpbnRlZ2VycyByZXN1bHRzIGluIGFuIGludGVnZXI7IHRoZSByZXN1bHQgaXMgdGhhdApvZiBtYXRoZW1hdGljYWwgZGl2aXNpb24gd2l0aCB0aGUg4oCYZmxvb3LigJkgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUKcmVzdWx0LiAgRGl2aXNpb24gYnkgemVybyByYWlzZXMgdGhlICJaZXJvRGl2aXNpb25FcnJvciIgZXhjZXB0aW9uLgoKVGhlIGRpdmlzaW9uIG9wZXJhdGlvbiBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgc3BlY2lhbAoiX190cnVlZGl2X18oKSIgYW5kICJfX3J0cnVlZGl2X18oKSIgbWV0aG9kcy4gVGhlIGZsb29yIGRpdmlzaW9uCm9wZXJhdGlvbiBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgc3BlY2lhbCAiX19mbG9vcmRpdl9fKCkiIGFuZAoiX19yZmxvb3JkaXZfXygpIiBtZXRob2RzLgoKVGhlICIlIiAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZgp0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QKY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBBIHplcm8gcmlnaHQgYXJndW1lbnQgcmFpc2VzIHRoZQoiWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nLXBvaW50Cm51bWJlcnMsIGUuZy4sICIzLjE0JTAuNyIgZXF1YWxzICIwLjM0IiAoc2luY2UgIjMuMTQiIGVxdWFscyAiNCowLjcgKwowLjM0Ii4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aCB0aGUgc2FtZSBzaWduCmFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0IGlzCnN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kIFsxXS4KClRoZSBmbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcKaWRlbnRpdHk6ICJ4ID09ICh4Ly95KSp5ICsgKHgleSkiLiAgRmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBhcmUgYWxzbwpjb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImRpdm1vZCgpIjogImRpdm1vZCh4LCB5KSA9PQooeC8veSwgeCV5KSIuIFsyXS4KCkluIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlICIlIgpvcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIG9iamVjdHMgdG8gcGVyZm9ybSBvbGQtc3R5bGUKc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuICBUaGUgc3ludGF4IGZvcgpzdHJpbmcgZm9ybWF0dGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSwKc2VjdGlvbiBwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcuCgpUaGUgKm1vZHVsbyogb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX21vZF9fKCkiCmFuZCAiX19ybW9kX18oKSIgbWV0aG9kcy4KClRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsbyBvcGVyYXRvciwgYW5kIHRoZSAiZGl2bW9kKCkiCmZ1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byBhCmZsb2F0aW5nLXBvaW50IG51bWJlciB1c2luZyB0aGUgImFicygpIiBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KClRoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlCmFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMgb3IgYm90aCBiZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUKdHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlCmFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlCmNvbmNhdGVuYXRlZC4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX2FkZF9fKCkiIGFuZAoiX19yYWRkX18oKSIgbWV0aG9kcy4KClRoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzIGFyZ3VtZW50cy4KVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX3N1Yl9fKCkiIGFuZAoiX19yc3ViX18oKSIgbWV0aG9kcy4K2gdiaXR3aXNlYTwDAABCaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKioqKioqKioKCkVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6CgogICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByCiAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwcgogICBvcl9leHByICA6Oj0geG9yX2V4cHIgfCBvcl9leHByICJ8IiB4b3JfZXhwcgoKVGhlICImIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoIG11c3QKYmUgaW50ZWdlcnMgb3Igb25lIG9mIHRoZW0gbXVzdCBiZSBhIGN1c3RvbSBvYmplY3Qgb3ZlcnJpZGluZwoiX19hbmRfXygpIiBvciAiX19yYW5kX18oKSIgc3BlY2lhbCBtZXRob2RzLgoKVGhlICJeIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0cwphcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgaW50ZWdlcnMgb3Igb25lIG9mIHRoZW0gbXVzdCBiZSBhIGN1c3RvbQpvYmplY3Qgb3ZlcnJpZGluZyAiX194b3JfXygpIiBvciAiX19yeG9yX18oKSIgc3BlY2lhbCBtZXRob2RzLgoKVGhlICJ8IiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cywKd2hpY2ggbXVzdCBiZSBpbnRlZ2VycyBvciBvbmUgb2YgdGhlbSBtdXN0IGJlIGEgY3VzdG9tIG9iamVjdApvdmVycmlkaW5nICJfX29yX18oKSIgb3IgIl9fcm9yX18oKSIgc3BlY2lhbCBtZXRob2RzLgp6EmJsdGluLWNvZGUtb2JqZWN0c3XjAgAAQ29kZSBPYmplY3RzCioqKioqKioqKioqKgoKQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQg4oCccHNldWRvLQpjb21waWxlZOKAnSBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiBib2R5LiBUaGV5IGRpZmZlcgpmcm9tIGZ1bmN0aW9uIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvbuKAmXQgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpcgpnbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSByZXR1cm5lZCBieSB0aGUgYnVpbHQtCmluICJjb21waWxlKCkiIGZ1bmN0aW9uIGFuZCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gZnVuY3Rpb24gb2JqZWN0cwp0aHJvdWdoIHRoZWlyICJfX2NvZGVfXyIgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgImNvZGUiIG1vZHVsZS4KCkFjY2Vzc2luZyAiX19jb2RlX18iIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAib2JqZWN0Ll9fZ2V0YXR0cl9fIgp3aXRoIGFyZ3VtZW50cyAib2JqIiBhbmQgIiJfX2NvZGVfXyIiLgoKQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgaXQgKGluc3RlYWQgb2YgYQpzb3VyY2Ugc3RyaW5nKSB0byB0aGUgImV4ZWMoKSIgb3IgImV2YWwoKSIgIGJ1aWx0LWluIGZ1bmN0aW9ucy4KClNlZSBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCnoVYmx0aW4tZWxsaXBzaXMtb2JqZWN0dfcDAABUaGUgRWxsaXBzaXMgT2JqZWN0CioqKioqKioqKioqKioqKioqKioKClRoaXMgb2JqZWN0IGlzIGNvbW1vbmx5IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBzb21ldGhpbmcgaXMgb21pdHRlZC4gSXQKc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgZWxsaXBzaXMgb2JqZWN0LApuYW1lZCAiRWxsaXBzaXMiIChhIGJ1aWx0LWluIG5hbWUpLiAgInR5cGUoRWxsaXBzaXMpKCkiIHByb2R1Y2VzIHRoZQoiRWxsaXBzaXMiIHNpbmdsZXRvbi4KCkl0IGlzIHdyaXR0ZW4gYXMgIkVsbGlwc2lzIiBvciAiLi4uIi4KCkluIHR5cGljYWwgdXNlLCAiLi4uIiBhcyB0aGUgIkVsbGlwc2lzIiBvYmplY3QgYXBwZWFycyBpbiBhIGZldwpkaWZmZXJlbnQgcGxhY2VzLCBmb3IgaW5zdGFuY2U6CgoqIEluIHR5cGUgYW5ub3RhdGlvbnMsIHN1Y2ggYXMgY2FsbGFibGUgYXJndW1lbnRzIG9yIHR1cGxlIGVsZW1lbnRzLgoKKiBBcyB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBwYXNzIHN0YXRlbWVudC4KCiogSW4gdGhpcmQtcGFydHkgbGlicmFyaWVzLCBzdWNoIGFzIE51bXB54oCZcyBzbGljaW5nIGFuZCBzdHJpZGluZy4KClB5dGhvbiBhbHNvIHVzZXMgdGhyZWUgZG90cyBpbiB3YXlzIHRoYXQgYXJlIG5vdCAiRWxsaXBzaXMiIG9iamVjdHMsCmZvciBpbnN0YW5jZToKCiogRG9jdGVzdOKAmXMgIkVMTElQU0lTIiwgYXMgYSBwYXR0ZXJuIGZvciBtaXNzaW5nIGNvbnRlbnQuCgoqIFRoZSBkZWZhdWx0IFB5dGhvbiBwcm9tcHQgb2YgdGhlICppbnRlcmFjdGl2ZSogc2hlbGwgd2hlbiBwYXJ0aWFsCiAgaW5wdXQgaXMgaW5jb21wbGV0ZS4KCkxhc3RseSwgdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIG9mdGVuIHVzZXMgdGhyZWUgZG90cyBpbiBjb252ZW50aW9uYWwKRW5nbGlzaCB1c2FnZSB0byBtZWFuIG9taXR0ZWQgY29udGVudCwgZXZlbiBpbiBjb2RlIGV4YW1wbGVzIHRoYXQgYWxzbwp1c2UgdGhlbSBhcyB0aGUgIkVsbGlwc2lzIi4KehFibHRpbi1udWxsLW9iamVjdHUcAQAAVGhlIE51bGwgT2JqZWN0CioqKioqKioqKioqKioqKgoKVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9u4oCZdCBleHBsaWNpdGx5IHJldHVybiBhCnZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgbnVsbApvYmplY3QsIG5hbWVkICJOb25lIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKE5vbmUpKCkiIHByb2R1Y2VzIHRoZQpzYW1lIHNpbmdsZXRvbi4KCkl0IGlzIHdyaXR0ZW4gYXMgIk5vbmUiLgp6EmJsdGluLXR5cGUtb2JqZWN0c3U1AQAAVHlwZSBPYmplY3RzCioqKioqKioqKioqKgoKVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3TigJlzIHR5cGUgaXMKYWNjZXNzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJ0eXBlKCkiLiAgVGhlcmUgYXJlIG5vIHNwZWNpYWwKb3BlcmF0aW9ucyBvbiB0eXBlcy4gIFRoZSBzdGFuZGFyZCBtb2R1bGUgInR5cGVzIiBkZWZpbmVzIG5hbWVzIGZvcgphbGwgc3RhbmRhcmQgYnVpbHQtaW4gdHlwZXMuCgpUeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICI8Y2xhc3MgJ2ludCc+Ii4K2ghib29sZWFuc2HBBQAAQm9vbGVhbiBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKgoKICAgb3JfdGVzdCAgOjo9IGFuZF90ZXN0IHwgb3JfdGVzdCAib3IiIGFuZF90ZXN0CiAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0CiAgIG5vdF90ZXN0IDo6PSBjb21wYXJpc29uIHwgIm5vdCIgbm90X3Rlc3QKCkluIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyBhcmUKdXNlZCBieSBjb250cm9sIGZsb3cgc3RhdGVtZW50cywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGludGVycHJldGVkCmFzIGZhbHNlOiAiRmFsc2UiLCAiTm9uZSIsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eQpzdHJpbmdzIGFuZCBjb250YWluZXJzIChpbmNsdWRpbmcgc3RyaW5ncywgdHVwbGVzLCBsaXN0cywKZGljdGlvbmFyaWVzLCBzZXRzIGFuZCBmcm96ZW5zZXRzKS4gIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGludGVycHJldGVkCmFzIHRydWUuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gY3VzdG9taXplIHRoZWlyIHRydXRoIHZhbHVlIGJ5CnByb3ZpZGluZyBhICJfX2Jvb2xfXygpIiBtZXRob2QuCgpUaGUgb3BlcmF0b3IgIm5vdCIgeWllbGRzICJUcnVlIiBpZiBpdHMgYXJndW1lbnQgaXMgZmFsc2UsICJGYWxzZSIKb3RoZXJ3aXNlLgoKVGhlIGV4cHJlc3Npb24gInggYW5kIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzCnZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUKaXMgcmV0dXJuZWQuCgpUaGUgZXhwcmVzc2lvbiAieCBvciB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzIHZhbHVlCmlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUgaXMKcmV0dXJuZWQuCgpOb3RlIHRoYXQgbmVpdGhlciAiYW5kIiBub3IgIm9yIiByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleQpyZXR1cm4gdG8gIkZhbHNlIiBhbmQgIlRydWUiLCBidXQgcmF0aGVyIHJldHVybiB0aGUgbGFzdCBldmFsdWF0ZWQKYXJndW1lbnQuICBUaGlzIGlzIHNvbWV0aW1lcyB1c2VmdWwsIGUuZy4sIGlmICJzIiBpcyBhIHN0cmluZyB0aGF0CnNob3VsZCBiZSByZXBsYWNlZCBieSBhIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMgZW1wdHksIHRoZSBleHByZXNzaW9uCiJzIG9yICdmb28nIiB5aWVsZHMgdGhlIGRlc2lyZWQgdmFsdWUuICBCZWNhdXNlICJub3QiIGhhcyB0byBjcmVhdGUgYQpuZXcgdmFsdWUsIGl0IHJldHVybnMgYSBib29sZWFuIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgaXRzCmFyZ3VtZW50IChmb3IgZXhhbXBsZSwgIm5vdCAnZm9vJyIgcHJvZHVjZXMgIkZhbHNlIiByYXRoZXIgdGhhbiAiJyciLikK2gVicmVha2EkAgAAVGhlICJicmVhayIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKgoKICAgYnJlYWtfc3RtdCA6Oj0gImJyZWFrIgoKImJyZWFrIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSIKbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIHdpdGhpbiB0aGF0Cmxvb3AuCgpJdCB0ZXJtaW5hdGVzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLCBza2lwcGluZyB0aGUgb3B0aW9uYWwgImVsc2UiCmNsYXVzZSBpZiB0aGUgbG9vcCBoYXMgb25lLgoKSWYgYSAiZm9yIiBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgImJyZWFrIiwgdGhlIGxvb3AgY29udHJvbCB0YXJnZXQKa2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuCgpXaGVuICJicmVhayIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAiZmluYWxseSIKY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nIHRoZQpsb29wLgp6DmNhbGxhYmxlLXR5cGVzdT0BAABFbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0cwoqKioqKioqKioqKioqKioqKioqKioqKioqKgoKb2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSkKCiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyDigJxjYWxsZWTigJ0gYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2QKICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgcm91Z2hseSB0cmFuc2xhdGVzIHRvCiAgICJ0eXBlKHgpLl9fY2FsbF9fKHgsIGFyZzEsIC4uLikiLiBUaGUgIm9iamVjdCIgY2xhc3MgaXRzZWxmIGRvZXMKICAgbm90IHByb3ZpZGUgdGhpcyBtZXRob2QuCtoFY2FsbHN1NRwAAENhbGxzCioqKioqCgpBIGNhbGwgY2FsbHMgYSBjYWxsYWJsZSBvYmplY3QgKGUuZy4sIGEgKmZ1bmN0aW9uKikgd2l0aCBhIHBvc3NpYmx5CmVtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjoKCiAgIGNhbGwgICAgICAgICAgICAgICAgIDo6PSBwcmltYXJ5ICIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXSB8IGNvbXByZWhlbnNpb25dICIpIgogICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiBzdGFycmVkX2FuZF9rZXl3b3Jkc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdGFycmVkX2FuZF9rZXl3b3JkcyBbIiwiIGtleXdvcmRzX2FyZ3VtZW50c10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZHNfYXJndW1lbnRzCiAgIHBvc2l0aW9uYWxfYXJndW1lbnRzIDo6PSBwb3NpdGlvbmFsX2l0ZW0gKCIsIiBwb3NpdGlvbmFsX2l0ZW0pKgogICBwb3NpdGlvbmFsX2l0ZW0gICAgICA6Oj0gYXNzaWdubWVudF9leHByZXNzaW9uIHwgIioiIGV4cHJlc3Npb24KICAgc3RhcnJlZF9hbmRfa2V5d29yZHMgOjo9ICgiKiIgZXhwcmVzc2lvbiB8IGtleXdvcmRfaXRlbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgIioiIGV4cHJlc3Npb24gfCAiLCIga2V5d29yZF9pdGVtKSoKICAga2V5d29yZHNfYXJndW1lbnRzICAgOjo9IChrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGtleXdvcmRfaXRlbSB8ICIsIiAiKioiIGV4cHJlc3Npb24pKgogICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvbgoKQW4gb3B0aW9uYWwgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kCmtleXdvcmQgYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy4KClRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYSBjYWxsYWJsZSBvYmplY3QgKHVzZXItZGVmaW5lZApmdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzcwpvYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGFsbCBvYmplY3RzIGhhdmluZyBhCiJfX2NhbGxfXygpIiBtZXRob2QgYXJlIGNhbGxhYmxlKS4gIEFsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmUKZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbCBpcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvbgpGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhlIHN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuCgpJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgZmlyc3QgY29udmVydGVkIHRvCnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpcwpjcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsCmFyZ3VtZW50cywgdGhleSBhcmUgcGxhY2VkIGluIHRoZSBmaXJzdCBOIHNsb3RzLiAgTmV4dCwgZm9yIGVhY2gKa2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlCmNvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGZvcm1hbApwYXJhbWV0ZXIgbmFtZSwgdGhlIGZpcnN0IHNsb3QgaXMgdXNlZCwgYW5kIHNvIG9uKS4gIElmIHRoZSBzbG90IGlzCmFscmVhZHkgZmlsbGVkLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlCmFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiB0aGUgZXhwcmVzc2lvbiBpcwoiTm9uZSIsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLAp0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlIGZpbGxlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCmRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0IHZhbHVlcyBhcmUKY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYSBtdXRhYmxlIG9iamVjdApzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNoYXJlZCBieQphbGwgY2FsbHMgdGhhdCBkb27igJl0IHNwZWNpZnkgYW4gYXJndW1lbnQgdmFsdWUgZm9yIHRoZSBjb3JyZXNwb25kaW5nCnNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55IHVuZmlsbGVkCnNsb3RzIGZvciB3aGljaCBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24KaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQgc2xvdHMgaXMgdXNlZCBhcyB0aGUKYXJndW1lbnQgbGlzdCBmb3IgdGhlIGNhbGwuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlCmJ1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgbmFtZXMsIGV2ZW4KaWYgdGhleSBhcmUg4oCYbmFtZWTigJkgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaAp0aGVyZWZvcmUgY2Fubm90IGJlIHN1cHBsaWVkIGJ5IGtleXdvcmQuICBJbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSBjYXNlCmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSAiUHlBcmdfUGFyc2VUdXBsZSgpIiB0byBwYXJzZQp0aGVpciBhcmd1bWVudHMuCgpJZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRoZXJlIGFyZSBmb3JtYWwgcGFyYW1ldGVyCnNsb3RzLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXIKdXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWwKcGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzCihvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuCgpJZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlcgpuYW1lLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXIKdXNpbmcgdGhlIHN5bnRheCAiKippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsCnBhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmQKYXJndW1lbnRzICh1c2luZyB0aGUga2V5d29yZHMgYXMga2V5cyBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlcyBhcwpjb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vCmV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy4KCklmIHRoZSBzeW50YXggIipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLCAiZXhwcmVzc2lvbiIKbXVzdCBldmFsdWF0ZSB0byBhbiAqaXRlcmFibGUqLiAgRWxlbWVudHMgZnJvbSB0aGVzZSBpdGVyYWJsZXMgYXJlCnRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHMuICBGb3IgdGhlIGNhbGwKImYoeDEsIHgyLCAqeSwgeDMsIHg0KSIsIGlmICp5KiBldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCDigKYsICp5TSosCnRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGwgd2l0aCBNKzQgcG9zaXRpb25hbCBhcmd1bWVudHMgKngxKiwgKngyKiwKKnkxKiwg4oCmLCAqeU0qLCAqeDMqLCAqeDQqLgoKQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgYWx0aG91Z2ggdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4IG1heQphcHBlYXIgKmFmdGVyKiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICpiZWZvcmUqCnRoZSBrZXl3b3JkIGFyZ3VtZW50cyAoYW5kIGFueSAiKipleHByZXNzaW9uIiBhcmd1bWVudHMg4oCTIHNlZSBiZWxvdykuClNvOgoKICAgPj4+IGRlZiBmKGEsIGIpOgogICAuLi4gICAgIHByaW50KGEsIGIpCiAgIC4uLgogICA+Pj4gZihiPTEsICooMiwpKQogICAyIDEKICAgPj4+IGYoYT0xLCAqKDIsKSkKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ2EnCiAgID4+PiBmKDEsICooMiwpKQogICAxIDIKCkl0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheAp0byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXMgbm90Cm9mdGVuIGFyaXNlLgoKSWYgdGhlIHN5bnRheCAiKipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLAoiZXhwcmVzc2lvbiIgbXVzdCBldmFsdWF0ZSB0byBhICptYXBwaW5nKiwgdGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZQp0cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuIElmIGEgcGFyYW1ldGVyIG1hdGNoaW5nIGEga2V5CmhhcyBhbHJlYWR5IGJlZW4gZ2l2ZW4gYSB2YWx1ZSAoYnkgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwgb3IKZnJvbSBhbm90aGVyIHVucGFja2luZyksIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4KCldoZW4gIioqZXhwcmVzc2lvbiIgaXMgdXNlZCwgZWFjaCBrZXkgaW4gdGhpcyBtYXBwaW5nIG11c3QgYmUgYQpzdHJpbmcuIEVhY2ggdmFsdWUgZnJvbSB0aGUgbWFwcGluZyBpcyBhc3NpZ25lZCB0byB0aGUgZmlyc3QgZm9ybWFsCnBhcmFtZXRlciBlbGlnaWJsZSBmb3Iga2V5d29yZCBhc3NpZ25tZW50IHdob3NlIG5hbWUgaXMgZXF1YWwgdG8gdGhlCmtleS4gQSBrZXkgbmVlZCBub3QgYmUgYSBQeXRob24gaWRlbnRpZmllciAoZS5nLiAiIm1heC10ZW1wIMKwRiIiIGlzCmFjY2VwdGFibGUsIGFsdGhvdWdoIGl0IHdpbGwgbm90IG1hdGNoIGFueSBmb3JtYWwgcGFyYW1ldGVyIHRoYXQgY291bGQKYmUgZGVjbGFyZWQpLiBJZiB0aGVyZSBpcyBubyBtYXRjaCB0byBhIGZvcm1hbCBwYXJhbWV0ZXIgdGhlIGtleS12YWx1ZQpwYWlyIGlzIGNvbGxlY3RlZCBieSB0aGUgIioqIiBwYXJhbWV0ZXIsIGlmIHRoZXJlIGlzIG9uZSwgb3IgaWYgdGhlcmUKaXMgbm90LCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuCgpGb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIKY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvciBhcyBrZXl3b3JkIGFyZ3VtZW50Cm5hbWVzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNTogRnVuY3Rpb24gY2FsbHMgYWNjZXB0IGFueSBudW1iZXIgb2YgIioiIGFuZAoiKioiIHVucGFja2luZ3MsIHBvc2l0aW9uYWwgYXJndW1lbnRzIG1heSBmb2xsb3cgaXRlcmFibGUgdW5wYWNraW5ncwooIioiKSwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBmb2xsb3cgZGljdGlvbmFyeSB1bnBhY2tpbmdzICgiKioiKS4KT3JpZ2luYWxseSBwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi4KCkEgY2FsbCBhbHdheXMgcmV0dXJucyBzb21lIHZhbHVlLCBwb3NzaWJseSAiTm9uZSIsIHVubGVzcyBpdCByYWlzZXMgYW4KZXhjZXB0aW9uLiAgSG93IHRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUKY2FsbGFibGUgb2JqZWN0LgoKSWYgaXQgaXPigJQKCmEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOgogICBUaGUgY29kZSBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBwYXNzaW5nIGl0IHRoZQogICBhcmd1bWVudCBsaXN0LiAgVGhlIGZpcnN0IHRoaW5nIHRoZSBjb2RlIGJsb2NrIHdpbGwgZG8gaXMgYmluZCB0aGUKICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbgogICBGdW5jdGlvbiBkZWZpbml0aW9ucy4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSAicmV0dXJuIgogICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuCiAgIElmIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGNvZGUgYmxvY2sgd2l0aG91dCBleGVjdXRpbmcgYQogICAicmV0dXJuIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm4gdmFsdWUgaXMgIk5vbmUiLgoKYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6CiAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgQnVpbHQtaW4gRnVuY3Rpb25zIGZvciB0aGUKICAgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4KCmEgY2xhc3Mgb2JqZWN0OgogICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLgoKYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6CiAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gYXJndW1lbnQKICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlCiAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LgoKYSBjbGFzcyBpbnN0YW5jZToKICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgIl9fY2FsbF9fKCkiIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuIHRoZQogICBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuCtoFY2xhc3N1KQ0AAENsYXNzIGRlZmluaXRpb25zCioqKioqKioqKioqKioqKioqCgpBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkCnR5cGUgaGllcmFyY2h5KToKCiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW3R5cGVfcGFyYW1zXSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZQogICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSIKICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXIKCkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0CnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIE1ldGFjbGFzc2VzIGZvciBtb3JlCmFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3MKb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZSBsaXN0CmluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLAoKICAgY2xhc3MgRm9vOgogICAgICAgcGFzcwoKaXMgZXF1aXZhbGVudCB0bwoKICAgY2xhc3MgRm9vKG9iamVjdCk6CiAgICAgICBwYXNzCgpUaGUgY2xhc3PigJlzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWUKTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlCm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5CmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNz4oCZcyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0cwpleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNV0gQQpjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZQpjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuClRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbApuYW1lc3BhY2UuCgpUaGUgb3JkZXIgaW4gd2hpY2ggYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgY2xhc3MgYm9keSBpcwpwcmVzZXJ2ZWQgaW4gdGhlIG5ldyBjbGFzc+KAmXMgIl9fZGljdF9fIi4gIE5vdGUgdGhhdCB0aGlzIGlzIHJlbGlhYmxlCm9ubHkgcmlnaHQgYWZ0ZXIgdGhlIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIG9ubHkgZm9yIGNsYXNzZXMgdGhhdCB3ZXJlCmRlZmluZWQgdXNpbmcgdGhlIGRlZmluaXRpb24gc3ludGF4LgoKQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyBtZXRhY2xhc3Nlcy4KCkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucywKCiAgIEBmMShhcmcpCiAgIEBmMgogICBjbGFzcyBGb286IHBhc3MKCmlzIHJvdWdobHkgZXF1aXZhbGVudCB0bwoKICAgY2xhc3MgRm9vOiBwYXNzCiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSkKClRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IKZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjk6IENsYXNzZXMgbWF5IGJlIGRlY29yYXRlZCB3aXRoIGFueSB2YWxpZAoiYXNzaWdubWVudF9leHByZXNzaW9uIi4gUHJldmlvdXNseSwgdGhlIGdyYW1tYXIgd2FzIG11Y2ggbW9yZQpyZXN0cmljdGl2ZTsgc2VlICoqUEVQIDYxNCoqIGZvciBkZXRhaWxzLgoKQSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycyBtYXkgYmUgZ2l2ZW4gaW4gc3F1YXJlIGJyYWNrZXRzIGltbWVkaWF0ZWx5CmFmdGVyIHRoZSBjbGFzc+KAmXMgbmFtZS4gVGhpcyBpbmRpY2F0ZXMgdG8gc3RhdGljIHR5cGUgY2hlY2tlcnMgdGhhdAp0aGUgY2xhc3MgaXMgZ2VuZXJpYy4gQXQgcnVudGltZSwgdGhlIHR5cGUgcGFyYW1ldGVycyBjYW4gYmUgcmV0cmlldmVkCmZyb20gdGhlIGNsYXNz4oCZcyAiX190eXBlX3BhcmFtc19fIiBhdHRyaWJ1dGUuIFNlZSBHZW5lcmljIGNsYXNzZXMgZm9yCm1vcmUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMjogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgYXJlIG5ldyBpbiBQeXRob24gMy4xMi4KCioqUHJvZ3JhbW1lcuKAmXMgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmUKY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXMKY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZAppbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uIOKAnCJzZWxmLm5hbWUi4oCdLAphbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZQp3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0cwpmb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvCnVuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZQp2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGNoYW5nZWQgdGhlIGRlY2xhcmF0aW9uIG9mIG1ldGFjbGFzc2VzIHRvIHRoZQogICAgIGN1cnJlbnQgc3ludGF4LCBhbmQgdGhlIHNlbWFudGljcyBmb3IgaG93IGNsYXNzZXMgd2l0aAogICAgIG1ldGFjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZC4KCiAgKipQRVAgMzEyOSoqIC0gQ2xhc3MgRGVjb3JhdG9ycwogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGFkZGVkIGNsYXNzIGRlY29yYXRvcnMuICBGdW5jdGlvbiBhbmQgbWV0aG9kCiAgICAgZGVjb3JhdG9ycyB3ZXJlIGludHJvZHVjZWQgaW4gKipQRVAgMzE4KiouCtoLY29tcGFyaXNvbnN1DigAAENvbXBhcmlzb25zCioqKioqKioqKioqCgpVbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSwKd2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciBiaXR3aXNlCm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSB0aGUKaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6CgogICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByIChjb21wX29wZXJhdG9yIG9yX2V4cHIpKgogICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iCiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iCgpDb21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuIEN1c3RvbSAqcmljaApjb21wYXJpc29uIG1ldGhvZHMqIG1heSByZXR1cm4gbm9uLWJvb2xlYW4gdmFsdWVzLiBJbiB0aGlzIGNhc2UgUHl0aG9uCndpbGwgY2FsbCAiYm9vbCgpIiBvbiBzdWNoIHZhbHVlIGluIGJvb2xlYW4gY29udGV4dHMuCgpDb21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgInggPCB5IDw9IHoiIGlzCmVxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgZXZhbHVhdGVkIG9ubHkKb25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpcwpmb3VuZCB0byBiZSBmYWxzZSkuCgpGb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwg4oCmLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLAoqb3AyKiwg4oCmLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gImEgb3AxIGIgb3AyIGMgLi4uIHkKb3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6IiwgZXhjZXB0CnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuCgpOb3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNu4oCZdCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uIGJldHdlZW4KKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAodGhvdWdoCnBlcmhhcHMgbm90IHByZXR0eSkuCgoKVmFsdWUgY29tcGFyaXNvbnMKPT09PT09PT09PT09PT09PT0KClRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlcwpvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgdHlwZS4KCkNoYXB0ZXIgT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlcyBzdGF0ZXMgdGhhdCBvYmplY3RzIGhhdmUgYSB2YWx1ZSAoaW4KYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhIHJhdGhlcgphYnN0cmFjdCBub3Rpb24gaW4gUHl0aG9uOiBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgbm8gY2Fub25pY2FsIGFjY2VzcwptZXRob2QgZm9yIGFuIG9iamVjdOKAmXMgdmFsdWUuICBBbHNvLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCB0aGF0IHRoZQp2YWx1ZSBvZiBhbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIGluIGEgcGFydGljdWxhciB3YXksIGUuZy4KY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9ycyBpbXBsZW1lbnQgYQpwYXJ0aWN1bGFyIG5vdGlvbiBvZiB3aGF0IHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMuICBPbmUgY2FuIHRoaW5rIG9mCnRoZW0gYXMgZGVmaW5pbmcgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpbmRpcmVjdGx5LCBieSBtZWFucyBvZiB0aGVpcgpjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLgoKQmVjYXVzZSBhbGwgdHlwZXMgYXJlIChkaXJlY3Qgb3IgaW5kaXJlY3QpIHN1YnR5cGVzIG9mICJvYmplY3QiLCB0aGV5CmluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciBmcm9tICJvYmplY3QiLiAgVHlwZXMgY2FuCmN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIGJ5IGltcGxlbWVudGluZyAqcmljaCBjb21wYXJpc29uCm1ldGhvZHMqIGxpa2UgIl9fbHRfXygpIiwgZGVzY3JpYmVkIGluIEJhc2ljIGN1c3RvbWl6YXRpb24uCgpUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgaXMgYmFzZWQKb24gdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3RzLiAgSGVuY2UsIGVxdWFsaXR5IGNvbXBhcmlzb24gb2YKaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUgaWRlbnRpdHkgcmVzdWx0cyBpbiBlcXVhbGl0eSwgYW5kIGVxdWFsaXR5CmNvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpbgppbmVxdWFsaXR5LiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlIGRlc2lyZSB0aGF0CmFsbCBvYmplY3RzIHNob3VsZCBiZSByZWZsZXhpdmUgKGkuZS4gInggaXMgeSIgaW1wbGllcyAieCA9PSB5IikuCgpBIGRlZmF1bHQgb3JkZXIgY29tcGFyaXNvbiAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSBpcyBub3QgcHJvdmlkZWQ7CmFuIGF0dGVtcHQgcmFpc2VzICJUeXBlRXJyb3IiLiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3IKaXMgdGhlIGxhY2sgb2YgYSBzaW1pbGFyIGludmFyaWFudCBhcyBmb3IgZXF1YWxpdHkuCgpUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgZXF1YWxpdHkgY29tcGFyaXNvbiwgdGhhdCBpbnN0YW5jZXMgd2l0aApkaWZmZXJlbnQgaWRlbnRpdGllcyBhcmUgYWx3YXlzIHVuZXF1YWwsIG1heSBiZSBpbiBjb250cmFzdCB0byB3aGF0CnR5cGVzIHdpbGwgbmVlZCB0aGF0IGhhdmUgYSBzZW5zaWJsZSBkZWZpbml0aW9uIG9mIG9iamVjdCB2YWx1ZSBhbmQKdmFsdWUtYmFzZWQgZXF1YWxpdHkuICBTdWNoIHR5cGVzIHdpbGwgbmVlZCB0byBjdXN0b21pemUgdGhlaXIKY29tcGFyaXNvbiBiZWhhdmlvciwgYW5kIGluIGZhY3QsIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIGhhdmUgZG9uZQp0aGF0LgoKVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgbW9zdAppbXBvcnRhbnQgYnVpbHQtaW4gdHlwZXMuCgoqIE51bWJlcnMgb2YgYnVpbHQtaW4gbnVtZXJpYyB0eXBlcyAoTnVtZXJpYyBUeXBlcyDigJQgaW50LCBmbG9hdCwKICBjb21wbGV4KSBhbmQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kCiAgImRlY2ltYWwuRGVjaW1hbCIgY2FuIGJlIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLAogIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgY29tcGxleCBudW1iZXJzIGRvIG5vdCBzdXBwb3J0IG9yZGVyCiAgY29tcGFyaXNvbi4gIFdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSB0eXBlcyBpbnZvbHZlZCwgdGhleSBjb21wYXJlCiAgbWF0aGVtYXRpY2FsbHkgKGFsZ29yaXRobWljYWxseSkgY29ycmVjdCB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLgoKICBUaGUgbm90LWEtbnVtYmVyIHZhbHVlcyAiZmxvYXQoJ05hTicpIiBhbmQgImRlY2ltYWwuRGVjaW1hbCgnTmFOJykiCiAgYXJlIHNwZWNpYWwuICBBbnkgb3JkZXJlZCBjb21wYXJpc29uIG9mIGEgbnVtYmVyIHRvIGEgbm90LWEtbnVtYmVyCiAgdmFsdWUgaXMgZmFsc2UuIEEgY291bnRlci1pbnR1aXRpdmUgaW1wbGljYXRpb24gaXMgdGhhdCBub3QtYS1udW1iZXIKICB2YWx1ZXMgYXJlIG5vdCBlcXVhbCB0byB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUsIGlmICJ4ID0KICBmbG9hdCgnTmFOJykiLCAiMyA8IHgiLCAieCA8IDMiIGFuZCAieCA9PSB4IiBhcmUgYWxsIGZhbHNlLCB3aGlsZSAieAogICE9IHgiIGlzIHRydWUuICBUaGlzIGJlaGF2aW9yIGlzIGNvbXBsaWFudCB3aXRoIElFRUUgNzU0LgoKKiAiTm9uZSIgYW5kICJOb3RJbXBsZW1lbnRlZCIgYXJlIHNpbmdsZXRvbnMuICAqKlBFUCA4KiogYWR2aXNlcyB0aGF0CiAgY29tcGFyaXNvbnMgZm9yIHNpbmdsZXRvbnMgc2hvdWxkIGFsd2F5cyBiZSBkb25lIHdpdGggImlzIiBvciAiaXMKICBub3QiLCBuZXZlciB0aGUgZXF1YWxpdHkgb3BlcmF0b3JzLgoKKiBCaW5hcnkgc2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgImJ5dGVzIiBvciAiYnl0ZWFycmF5IikgY2FuIGJlCiAgY29tcGFyZWQgd2l0aGluIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMuICBUaGV5IGNvbXBhcmUKICBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlaXIgZWxlbWVudHMuCgoqIFN0cmluZ3MgKGluc3RhbmNlcyBvZiAic3RyIikgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUKICBudW1lcmljYWwgVW5pY29kZSBjb2RlIHBvaW50cyAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KICAib3JkKCkiKSBvZiB0aGVpciBjaGFyYWN0ZXJzLiBbM10KCiAgU3RyaW5ncyBhbmQgYmluYXJ5IHNlcXVlbmNlcyBjYW5ub3QgYmUgZGlyZWN0bHkgY29tcGFyZWQuCgoqIFNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJ0dXBsZSIsICJsaXN0Iiwgb3IgInJhbmdlIikgY2FuIGJlIGNvbXBhcmVkCiAgb25seSB3aXRoaW4gZWFjaCBvZiB0aGVpciB0eXBlcywgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCByYW5nZXMgZG8KICBub3Qgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uLiAgRXF1YWxpdHkgY29tcGFyaXNvbiBhY3Jvc3MgdGhlc2UKICB0eXBlcyByZXN1bHRzIGluIGluZXF1YWxpdHksIGFuZCBvcmRlcmluZyBjb21wYXJpc29uIGFjcm9zcyB0aGVzZQogIHR5cGVzIHJhaXNlcyAiVHlwZUVycm9yIi4KCiAgU2VxdWVuY2VzIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZgogIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuICBUaGUgYnVpbHQtaW4gY29udGFpbmVycyB0eXBpY2FsbHkgYXNzdW1lCiAgaWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsIHRvIHRoZW1zZWx2ZXMuICBUaGF0IGxldHMgdGhlbSBieXBhc3MKICBlcXVhbGl0eSB0ZXN0cyBmb3IgaWRlbnRpY2FsIG9iamVjdHMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBhbmQgdG8KICBtYWludGFpbiB0aGVpciBpbnRlcm5hbCBpbnZhcmlhbnRzLgoKICBMZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBiZXR3ZWVuIGJ1aWx0LWluIGNvbGxlY3Rpb25zIHdvcmtzIGFzCiAgZm9sbG93czoKCiAgKiBGb3IgdHdvIGNvbGxlY3Rpb25zIHRvIGNvbXBhcmUgZXF1YWwsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZQogICAgdHlwZSwgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIGFuZCBlYWNoIHBhaXIgb2YgY29ycmVzcG9uZGluZwogICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICgxLDIpIiBpcwogICAgZmFsc2UgYmVjYXVzZSB0aGUgdHlwZSBpcyBub3QgdGhlIHNhbWUpLgoKICAqIENvbGxlY3Rpb25zIHRoYXQgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzCiAgICB0aGVpciBmaXJzdCB1bmVxdWFsIGVsZW1lbnRzIChmb3IgZXhhbXBsZSwgIlsxLDIseF0gPD0gWzEsMix5XSIKICAgIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyAieCA8PSB5IikuICBJZiBhIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzCiAgICBub3QgZXhpc3QsIHRoZSBzaG9ydGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsCiAgICAiWzEsMl0gPCBbMSwyLDNdIiBpcyB0cnVlKS4KCiogTWFwcGluZ3MgKGluc3RhbmNlcyBvZiAiZGljdCIpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleQogIGhhdmUgZXF1YWwgIihrZXksIHZhbHVlKSIgcGFpcnMuIEVxdWFsaXR5IGNvbXBhcmlzb24gb2YgdGhlIGtleXMgYW5kCiAgdmFsdWVzIGVuZm9yY2VzIHJlZmxleGl2aXR5LgoKICBPcmRlciBjb21wYXJpc29ucyAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSByYWlzZSAiVHlwZUVycm9yIi4KCiogU2V0cyAoaW5zdGFuY2VzIG9mICJzZXQiIG9yICJmcm96ZW5zZXQiKSBjYW4gYmUgY29tcGFyZWQgd2l0aGluIGFuZAogIGFjcm9zcyB0aGVpciB0eXBlcy4KCiAgVGhleSBkZWZpbmUgb3JkZXIgY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gbWVhbiBzdWJzZXQgYW5kIHN1cGVyc2V0CiAgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKGZvciBleGFtcGxlLAogIHRoZSB0d28gc2V0cyAiezEsMn0iIGFuZCAiezIsM30iIGFyZSBub3QgZXF1YWwsIG5vciBzdWJzZXRzIG9mIG9uZQogIGFub3RoZXIsIG5vciBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXIpLiAgQWNjb3JkaW5nbHksIHNldHMgYXJlIG5vdAogIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZwogIChmb3IgZXhhbXBsZSwgIm1pbigpIiwgIm1heCgpIiwgYW5kICJzb3J0ZWQoKSIgcHJvZHVjZSB1bmRlZmluZWQKICByZXN1bHRzIGdpdmVuIGEgbGlzdCBvZiBzZXRzIGFzIGlucHV0cykuCgogIENvbXBhcmlzb24gb2Ygc2V0cyBlbmZvcmNlcyByZWZsZXhpdml0eSBvZiBpdHMgZWxlbWVudHMuCgoqIE1vc3Qgb3RoZXIgYnVpbHQtaW4gdHlwZXMgaGF2ZSBubyBjb21wYXJpc29uIG1ldGhvZHMgaW1wbGVtZW50ZWQsIHNvCiAgdGhleSBpbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IuCgpVc2VyLWRlZmluZWQgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIHNob3VsZApmb2xsb3cgc29tZSBjb25zaXN0ZW5jeSBydWxlcywgaWYgcG9zc2libGU6CgoqIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsIGlkZW50aWNhbAogIG9iamVjdHMgc2hvdWxkIGNvbXBhcmUgZXF1YWw6CgogICAgICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSIKCiogQ29tcGFyaXNvbiBzaG91bGQgYmUgc3ltbWV0cmljLiBJbiBvdGhlciB3b3JkcywgdGhlIGZvbGxvd2luZwogIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDoKCiAgICAgInggPT0geSIgYW5kICJ5ID09IHgiCgogICAgICJ4ICE9IHkiIGFuZCAieSAhPSB4IgoKICAgICAieCA8IHkiIGFuZCAieSA+IHgiCgogICAgICJ4IDw9IHkiIGFuZCAieSA+PSB4IgoKKiBDb21wYXJpc29uIHNob3VsZCBiZSB0cmFuc2l0aXZlLiBUaGUgZm9sbG93aW5nIChub24tZXhoYXVzdGl2ZSkKICBleGFtcGxlcyBpbGx1c3RyYXRlIHRoYXQ6CgogICAgICJ4ID4geSBhbmQgeSA+IHoiIGltcGxpZXMgInggPiB6IgoKICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiCgoqIEludmVyc2UgY29tcGFyaXNvbiBzaG91bGQgcmVzdWx0IGluIHRoZSBib29sZWFuIG5lZ2F0aW9uLiBJbiBvdGhlcgogIHdvcmRzLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDoKCiAgICAgInggPT0geSIgYW5kICJub3QgeCAhPSB5IgoKICAgICAieCA8IHkiIGFuZCAibm90IHggPj0geSIgKGZvciB0b3RhbCBvcmRlcmluZykKCiAgICAgInggPiB5IiBhbmQgIm5vdCB4IDw9IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpCgogIFRoZSBsYXN0IHR3byBleHByZXNzaW9ucyBhcHBseSB0byB0b3RhbGx5IG9yZGVyZWQgY29sbGVjdGlvbnMgKGUuZy4KICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZQogICJ0b3RhbF9vcmRlcmluZygpIiBkZWNvcmF0b3IuCgoqIFRoZSAiaGFzaCgpIiByZXN1bHQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhbGl0eS4gT2JqZWN0cyB0aGF0CiAgYXJlIGVxdWFsIHNob3VsZCBlaXRoZXIgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBvciBiZSBtYXJrZWQgYXMKICB1bmhhc2hhYmxlLgoKUHl0aG9uIGRvZXMgbm90IGVuZm9yY2UgdGhlc2UgY29uc2lzdGVuY3kgcnVsZXMuIEluIGZhY3QsIHRoZQpub3QtYS1udW1iZXIgdmFsdWVzIGFyZSBhbiBleGFtcGxlIGZvciBub3QgZm9sbG93aW5nIHRoZXNlIHJ1bGVzLgoKCk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIgpldmFsdWF0ZXMgdG8gIlRydWUiIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCAiRmFsc2UiIG90aGVyd2lzZS4KInggbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlcwphbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzCndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMKbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlCmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW4KeSkiLgoKRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgKngqCmlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4KRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyCnN0cmluZywgc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuCgpGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgIngKaW4geSIgcmV0dXJucyAiVHJ1ZSIgaWYgInkuX19jb250YWluc19fKHgpIiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSwgYW5kCiJGYWxzZSIgb3RoZXJ3aXNlLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG8KZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgIlRydWUiIGlmIHNvbWUgdmFsdWUgInoiLCBmb3Igd2hpY2gKdGhlIGV4cHJlc3Npb24gInggaXMgeiBvciB4ID09IHoiIGlzIHRydWUsIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZwpvdmVyICJ5Ii4gSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYKImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uCgpMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXMKIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tCm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCBpcyB5W2ldIG9yIHggPT0geVtpXSIsIGFuZCBubwpsb3dlciBpbnRlZ2VyIGluZGV4IHJhaXNlcyB0aGUgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXIKZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLgoKVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZSBvZgoiaW4iLgoKCklkZW50aXR5IGNvbXBhcmlzb25zCj09PT09PT09PT09PT09PT09PT09CgpUaGUgb3BlcmF0b3JzICJpcyIgYW5kICJpcyBub3QiIHRlc3QgZm9yIGFuIG9iamVjdOKAmXMgaWRlbnRpdHk6ICJ4IGlzCnkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gIEFuCk9iamVjdOKAmXMgaWRlbnRpdHkgaXMgZGV0ZXJtaW5lZCB1c2luZyB0aGUgImlkKCkiIGZ1bmN0aW9uLiAgInggaXMgbm90CnkiIHlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdCtoIY29tcG91bmR1LOsAAENvbXBvdW5kIHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKgoKQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgYWZmZWN0Cm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW4KZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiBzaW1wbGUKaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lIGxpbmUuCgpUaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgY29udHJvbApmbG93IGNvbnN0cnVjdHMuICAidHJ5IiBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwCmNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cywgd2hpbGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgYWxsb3dzIHRoZQpleGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrIG9mCmNvZGUuICBGdW5jdGlvbiBhbmQgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIGFsc28gc3ludGFjdGljYWxseSBjb21wb3VuZApzdGF0ZW1lbnRzLgoKQSBjb21wb3VuZCBzdGF0ZW1lbnQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUg4oCYY2xhdXNlcy7igJkgIEEgY2xhdXNlCmNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhIOKAmHN1aXRlLuKAmSAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGEKcGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC4KRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kcwp3aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGEKY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGUKc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVy4oCZcwpjb2xvbiwgb3IgaXQgY2FuIGJlIG9uZSBvciBtb3JlIGluZGVudGVkIHN0YXRlbWVudHMgb24gc3Vic2VxdWVudApsaW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIGEgc3VpdGUgY2FuIGNvbnRhaW4gbmVzdGVkIGNvbXBvdW5kCnN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRu4oCZdCBiZQpjbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkIGJlbG9uZzoKCiAgIGlmIHRlc3QxOiBpZiB0ZXN0MjogcHJpbnQoeCkKCkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzCmNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlCiJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6CgogICBpZiB4IDwgeSA8IHo6IHByaW50KHgpOyBwcmludCh5KTsgcHJpbnQoeikKClN1bW1hcml6aW5nOgoKICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgbWF0Y2hfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IGZ1bmNkZWYKICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2RlZgogICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX3dpdGhfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Zvcl9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZnVuY2RlZgogICBzdWl0ZSAgICAgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IE5FV0xJTkUgSU5ERU5UIHN0YXRlbWVudCsgREVERU5UCiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdAogICBzdG10X2xpc3QgICAgIDo6PSBzaW1wbGVfc3RtdCAoIjsiIHNpbXBsZV9zdG10KSogWyI7Il0KCk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSAiTkVXTElORSIgcG9zc2libHkgZm9sbG93ZWQgYnkgYQoiREVERU5UIi4gIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5cyBiZWdpbgp3aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhIHN0YXRlbWVudCwgdGh1cyB0aGVyZSBhcmUgbm8KYW1iaWd1aXRpZXMgKHRoZSDigJhkYW5nbGluZyAiZWxzZSLigJkgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uIGJ5CnJlcXVpcmluZyBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS4KClRoZSBmb3JtYXR0aW5nIG9mIHRoZSBncmFtbWFyIHJ1bGVzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgcGxhY2VzCmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS4KCgpUaGUgImlmIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09CgpUaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOgoKICAgaWZfc3RtdCA6Oj0gImlmIiBhc3NpZ25tZW50X2V4cHJlc3Npb24gIjoiIHN1aXRlCiAgICAgICAgICAgICAgICgiZWxpZiIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZSkqCiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZQpieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uIEJvb2xlYW4gb3BlcmF0aW9ucwpmb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWQKKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLgpJZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmCnByZXNlbnQsIGlzIGV4ZWN1dGVkLgoKClRoZSAid2hpbGUiIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT0KClRoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhbgpleHByZXNzaW9uIGlzIHRydWU6CgogICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGUKZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWUKaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkCmFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLgoKQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcAp3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZeKAmXMgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50CmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFjawp0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLgoKClRoZSAiZm9yIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PQoKVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZQooc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OgoKICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgYCFzdGFycmVkX2xpc3RgICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpUaGUgInN0YXJyZWRfbGlzdCIgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuCippdGVyYWJsZSogb2JqZWN0LiAgQW4gKml0ZXJhdG9yKiBpcyBjcmVhdGVkIGZvciB0aGF0IGl0ZXJhYmxlLiBUaGUKZmlyc3QgaXRlbSBwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IgaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0Cmxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBhc3NpZ25tZW50cyAoc2VlIEFzc2lnbm1lbnQKc3RhdGVtZW50cyksIGFuZCB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBUaGlzIHJlcGVhdHMgZm9yIGVhY2ggaXRlbQpwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IuICBXaGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQsIHRoZSBzdWl0ZQppbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcAp0ZXJtaW5hdGVzLgoKQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcAp3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZeKAmXMgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50CmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGNvbnRpbnVlcwp3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dAppdGVtLgoKVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHRhcmdldCBsaXN0LgpUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmcKdGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOgoKICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgcHJpbnQoaSkKICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlCgpOYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsCmJ1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0CmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiB0eXBlICJyYW5nZSgpIiByZXByZXNlbnRzCmltbXV0YWJsZSBhcml0aG1ldGljIHNlcXVlbmNlcyBvZiBpbnRlZ2Vycy4gRm9yIGluc3RhbmNlLCBpdGVyYXRpbmcKInJhbmdlKDMpIiBzdWNjZXNzaXZlbHkgeWllbGRzIDAsIDEsIGFuZCB0aGVuIDIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogU3RhcnJlZCBlbGVtZW50cyBhcmUgbm93IGFsbG93ZWQgaW4gdGhlCmV4cHJlc3Npb24gbGlzdC4KCgpUaGUgInRyeSIgc3RhdGVtZW50Cj09PT09PT09PT09PT09PT09PT0KClRoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlCmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6CgogICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdCB8IHRyeTNfc3RtdAogICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKSsKICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV0KICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgIioiIGV4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl0gIjoiIHN1aXRlKSsKICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV0KICAgdHJ5M19zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlCgpBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb24KRXhjZXB0aW9ucywgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0byBnZW5lcmF0ZQpleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uIFRoZSByYWlzZSBzdGF0ZW1lbnQuCgoKImV4Y2VwdCIgY2xhdXNlCi0tLS0tLS0tLS0tLS0tLQoKVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiBubwpleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzCmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCBmb3IgYW4KZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlICJleGNlcHQiCmNsYXVzZXMgaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uIEFuCmV4cHJlc3Npb24tbGVzcyAiZXhjZXB0IiBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcwphbnkgZXhjZXB0aW9uLgoKRm9yIGFuICJleGNlcHQiIGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoZSBleHByZXNzaW9uIG11c3QKZXZhbHVhdGUgdG8gYW4gZXhjZXB0aW9uIHR5cGUgb3IgYSB0dXBsZSBvZiBleGNlcHRpb24gdHlwZXMuIFRoZQpyYWlzZWQgZXhjZXB0aW9uIG1hdGNoZXMgYW4gImV4Y2VwdCIgY2xhdXNlIHdob3NlIGV4cHJlc3Npb24gZXZhbHVhdGVzCnRvIHRoZSBjbGFzcyBvciBhICpub24tdmlydHVhbCBiYXNlIGNsYXNzKiBvZiB0aGUgZXhjZXB0aW9uIG9iamVjdCwgb3IKdG8gYSB0dXBsZSB0aGF0IGNvbnRhaW5zIHN1Y2ggYSBjbGFzcy4KCklmIG5vICJleGNlcHQiIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuCmV4Y2VwdGlvbiBoYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlCmludm9jYXRpb24gc3RhY2suICBbMV0KCklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiAiZXhjZXB0IiBjbGF1c2UKcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZAphIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbgp0aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCByYWlzZWQKdGhlIGV4Y2VwdGlvbikuCgpXaGVuIGEgbWF0Y2hpbmcgImV4Y2VwdCIgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvCnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCAiZXhjZXB0IiBjbGF1c2UsCmlmIHByZXNlbnQsIGFuZCB0aGUgImV4Y2VwdCIgY2xhdXNl4oCZcyBzdWl0ZSBpcyBleGVjdXRlZC4gQWxsICJleGNlcHQiCmNsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzCnJlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSAidHJ5IgpzdGF0ZW1lbnQuIChUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUKZXhjZXB0aW9uLCBhbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSBvZiB0aGUgaW5uZXIKaGFuZGxlciwgdGhlIG91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKQoKV2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gYXNzaWduZWQgdXNpbmcgImFzIHRhcmdldCIsIGl0IGlzIGNsZWFyZWQKYXQgdGhlIGVuZCBvZiB0aGUgImV4Y2VwdCIgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZgoKICAgZXhjZXB0IEUgYXMgTjoKICAgICAgIGZvbwoKd2FzIHRyYW5zbGF0ZWQgdG8KCiAgIGV4Y2VwdCBFIGFzIE46CiAgICAgICB0cnk6CiAgICAgICAgICAgZm9vCiAgICAgICBmaW5hbGx5OgogICAgICAgICAgIGRlbCBOCgpUaGlzIG1lYW5zIHRoZSBleGNlcHRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIGJlCmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlICJleGNlcHQiIGNsYXVzZS4gRXhjZXB0aW9ucyBhcmUgY2xlYXJlZApiZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2UKY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlCnVudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuCgpCZWZvcmUgYW4gImV4Y2VwdCIgY2xhdXNl4oCZcyBzdWl0ZSBpcyBleGVjdXRlZCwgdGhlIGV4Y2VwdGlvbiBpcyBzdG9yZWQKaW4gdGhlICJzeXMiIG1vZHVsZSwgd2hlcmUgaXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBib2R5IG9mCnRoZSAiZXhjZXB0IiBjbGF1c2UgYnkgY2FsbGluZyAic3lzLmV4Y2VwdGlvbigpIi4gV2hlbiBsZWF2aW5nIGFuCmV4Y2VwdGlvbiBoYW5kbGVyLCB0aGUgZXhjZXB0aW9uIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGlzIHJlc2V0CnRvIGl0cyBwcmV2aW91cyB2YWx1ZToKCiAgID4+PiBwcmludChzeXMuZXhjZXB0aW9uKCkpCiAgIE5vbmUKICAgPj4+IHRyeToKICAgLi4uICAgICByYWlzZSBUeXBlRXJyb3IKICAgLi4uIGV4Y2VwdDoKICAgLi4uICAgICBwcmludChyZXByKHN5cy5leGNlcHRpb24oKSkpCiAgIC4uLiAgICAgdHJ5OgogICAuLi4gICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAuLi4gICAgIGV4Y2VwdDoKICAgLi4uICAgICAgICAgcHJpbnQocmVwcihzeXMuZXhjZXB0aW9uKCkpKQogICAuLi4gICAgIHByaW50KHJlcHIoc3lzLmV4Y2VwdGlvbigpKSkKICAgLi4uCiAgIFR5cGVFcnJvcigpCiAgIFZhbHVlRXJyb3IoKQogICBUeXBlRXJyb3IoKQogICA+Pj4gcHJpbnQoc3lzLmV4Y2VwdGlvbigpKQogICBOb25lCgoKImV4Y2VwdCoiIGNsYXVzZQotLS0tLS0tLS0tLS0tLS0tCgpUaGUgImV4Y2VwdCoiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGhhbmRsZXJzIGZvciBncm91cHMgb2YKZXhjZXB0aW9ucyAoIkJhc2VFeGNlcHRpb25Hcm91cCIgaW5zdGFuY2VzKS4gQSAidHJ5IiBzdGF0ZW1lbnQgY2FuCmhhdmUgZWl0aGVyICJleGNlcHQiIG9yICJleGNlcHQqIiBjbGF1c2VzLCBidXQgbm90IGJvdGguIFRoZSBleGNlcHRpb24KdHlwZSBmb3IgbWF0Y2hpbmcgaXMgbWFuZGF0b3J5IGluIHRoZSBjYXNlIG9mICJleGNlcHQqIiwgc28gImV4Y2VwdCo6IgppcyBhIHN5bnRheCBlcnJvci4gVGhlIHR5cGUgaXMgaW50ZXJwcmV0ZWQgYXMgaW4gdGhlIGNhc2Ugb2YgImV4Y2VwdCIsCmJ1dCBtYXRjaGluZyBpcyBwZXJmb3JtZWQgb24gdGhlIGV4Y2VwdGlvbnMgY29udGFpbmVkIGluIHRoZSBncm91cAp0aGF0IGlzIGJlaW5nIGhhbmRsZWQuIEFuICJUeXBlRXJyb3IiIGlzIHJhaXNlZCBpZiBhIG1hdGNoaW5nIHR5cGUgaXMKYSBzdWJjbGFzcyBvZiAiQmFzZUV4Y2VwdGlvbkdyb3VwIiwgYmVjYXVzZSB0aGF0IHdvdWxkIGhhdmUgYW1iaWd1b3VzCnNlbWFudGljcy4KCldoZW4gYW4gZXhjZXB0aW9uIGdyb3VwIGlzIHJhaXNlZCBpbiB0aGUgdHJ5IGJsb2NrLCBlYWNoICJleGNlcHQqIgpjbGF1c2Ugc3BsaXRzIChzZWUgInNwbGl0KCkiKSBpdCBpbnRvIHRoZSBzdWJncm91cHMgb2YgbWF0Y2hpbmcgYW5kCm5vbi1tYXRjaGluZyBleGNlcHRpb25zLiBJZiB0aGUgbWF0Y2hpbmcgc3ViZ3JvdXAgaXMgbm90IGVtcHR5LCBpdApiZWNvbWVzIHRoZSBoYW5kbGVkIGV4Y2VwdGlvbiAodGhlIHZhbHVlIHJldHVybmVkIGZyb20KInN5cy5leGNlcHRpb24oKSIpIGFuZCBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IG9mIHRoZSAiZXhjZXB0KiIgY2xhdXNlCihpZiB0aGVyZSBpcyBvbmUpLiBUaGVuLCB0aGUgYm9keSBvZiB0aGUgImV4Y2VwdCoiIGNsYXVzZSBleGVjdXRlcy4gSWYKdGhlIG5vbi1tYXRjaGluZyBzdWJncm91cCBpcyBub3QgZW1wdHksIGl0IGlzIHByb2Nlc3NlZCBieSB0aGUgbmV4dAoiZXhjZXB0KiIgaW4gdGhlIHNhbWUgbWFubmVyLiBUaGlzIGNvbnRpbnVlcyB1bnRpbCBhbGwgZXhjZXB0aW9ucyBpbgp0aGUgZ3JvdXAgaGF2ZSBiZWVuIG1hdGNoZWQsIG9yIHRoZSBsYXN0ICJleGNlcHQqIiBjbGF1c2UgaGFzIHJ1bi4KCkFmdGVyIGFsbCAiZXhjZXB0KiIgY2xhdXNlcyBleGVjdXRlLCB0aGUgZ3JvdXAgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMKaXMgbWVyZ2VkIHdpdGggYW55IGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHJhaXNlZCBvciByZS1yYWlzZWQgZnJvbQp3aXRoaW4gImV4Y2VwdCoiIGNsYXVzZXMuIFRoaXMgbWVyZ2VkIGV4Y2VwdGlvbiBncm91cCBwcm9wYWdhdGVzIG9uLjoKCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcmFpc2UgRXhjZXB0aW9uR3JvdXAoImVnIiwKICAgLi4uICAgICAgICAgW1ZhbHVlRXJyb3IoMSksIFR5cGVFcnJvcigyKSwgT1NFcnJvcigzKSwgT1NFcnJvcig0KV0pCiAgIC4uLiBleGNlcHQqIFR5cGVFcnJvciBhcyBlOgogICAuLi4gICAgIHByaW50KGYnY2F1Z2h0IHt0eXBlKGUpfSB3aXRoIG5lc3RlZCB7ZS5leGNlcHRpb25zfScpCiAgIC4uLiBleGNlcHQqIE9TRXJyb3IgYXMgZToKICAgLi4uICAgICBwcmludChmJ2NhdWdodCB7dHlwZShlKX0gd2l0aCBuZXN0ZWQge2UuZXhjZXB0aW9uc30nKQogICAuLi4KICAgY2F1Z2h0IDxjbGFzcyAnRXhjZXB0aW9uR3JvdXAnPiB3aXRoIG5lc3RlZCAoVHlwZUVycm9yKDIpLCkKICAgY2F1Z2h0IDxjbGFzcyAnRXhjZXB0aW9uR3JvdXAnPiB3aXRoIG5lc3RlZCAoT1NFcnJvcigzKSwgT1NFcnJvcig0KSkKICAgICArIEV4Y2VwdGlvbiBHcm91cCBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgfCAgIEZpbGUgIjxkb2N0ZXN0IGRlZmF1bHRbMF0+IiwgbGluZSAyLCBpbiA8bW9kdWxlPgogICAgIHwgICAgIHJhaXNlIEV4Y2VwdGlvbkdyb3VwKCJlZyIsCiAgICAgfCAgICAgICAgIFtWYWx1ZUVycm9yKDEpLCBUeXBlRXJyb3IoMiksIE9TRXJyb3IoMyksIE9TRXJyb3IoNCldKQogICAgIHwgRXhjZXB0aW9uR3JvdXA6IGVnICgxIHN1Yi1leGNlcHRpb24pCiAgICAgKy0rLS0tLS0tLS0tLS0tLS0tLSAxIC0tLS0tLS0tLS0tLS0tLS0KICAgICAgIHwgVmFsdWVFcnJvcjogMQogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSWYgdGhlIGV4Y2VwdGlvbiByYWlzZWQgZnJvbSB0aGUgInRyeSIgYmxvY2sgaXMgbm90IGFuIGV4Y2VwdGlvbiBncm91cAphbmQgaXRzIHR5cGUgbWF0Y2hlcyBvbmUgb2YgdGhlICJleGNlcHQqIiBjbGF1c2VzLCBpdCBpcyBjYXVnaHQgYW5kCndyYXBwZWQgYnkgYW4gZXhjZXB0aW9uIGdyb3VwIHdpdGggYW4gZW1wdHkgbWVzc2FnZSBzdHJpbmcuIFRoaXMKZW5zdXJlcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgImUiIGlzIGNvbnNpc3RlbnRseQoiQmFzZUV4Y2VwdGlvbkdyb3VwIjoKCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcmFpc2UgQmxvY2tpbmdJT0Vycm9yCiAgIC4uLiBleGNlcHQqIEJsb2NraW5nSU9FcnJvciBhcyBlOgogICAuLi4gICAgIHByaW50KHJlcHIoZSkpCiAgIC4uLgogICBFeGNlcHRpb25Hcm91cCgnJywgKEJsb2NraW5nSU9FcnJvcigpLCkpCgoiYnJlYWsiLCAiY29udGludWUiIGFuZCAicmV0dXJuIiBjYW5ub3QgYXBwZWFyIGluIGFuICJleGNlcHQqIiBjbGF1c2UuCgoKImVsc2UiIGNsYXVzZQotLS0tLS0tLS0tLS0tCgpUaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiB0aGUgY29udHJvbCBmbG93IGxlYXZlcyB0aGUKInRyeSIgc3VpdGUsIG5vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLCBhbmQgbm8gInJldHVybiIsICJjb250aW51ZSIsIG9yCiJicmVhayIgc3RhdGVtZW50IHdhcyBleGVjdXRlZC4gIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlCm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy4KCgoiZmluYWxseSIgY2xhdXNlCi0tLS0tLS0tLS0tLS0tLS0KCklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSDigJhjbGVhbnVw4oCZIGhhbmRsZXIuICBUaGUgInRyeSIKY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gSWYgYW4KZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGUKZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmCnRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAiZmluYWxseSIKY2xhdXNlLiBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZApleGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgImZpbmFsbHkiCmNsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50LCB0aGUgc2F2ZWQKZXhjZXB0aW9uIGlzIGRpc2NhcmRlZDoKCiAgID4+PiBkZWYgZigpOgogICAuLi4gICAgIHRyeToKICAgLi4uICAgICAgICAgMS8wCiAgIC4uLiAgICAgZmluYWxseToKICAgLi4uICAgICAgICAgcmV0dXJuIDQyCiAgIC4uLgogICA+Pj4gZigpCiAgIDQyCgpUaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nCmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS4KCldoZW4gYSAicmV0dXJuIiwgImJyZWFrIiBvciAiY29udGludWUiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbiB0aGUKInRyeSIgc3VpdGUgb2YgYSAidHJ5IuKApiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzCmFsc28gZXhlY3V0ZWQg4oCYb24gdGhlIHdheSBvdXQu4oCZCgpUaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAicmV0dXJuIgpzdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGEKInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlIHRoZQpsYXN0IG9uZSBleGVjdXRlZDoKCiAgID4+PiBkZWYgZm9vKCk6CiAgIC4uLiAgICAgdHJ5OgogICAuLi4gICAgICAgICByZXR1cm4gJ3RyeScKICAgLi4uICAgICBmaW5hbGx5OgogICAuLi4gICAgICAgICByZXR1cm4gJ2ZpbmFsbHknCiAgIC4uLgogICA+Pj4gZm9vKCkKICAgJ2ZpbmFsbHknCgpDaGFuZ2VkIGluIHZlcnNpb24gMy44OiBQcmlvciB0byBQeXRob24gMy44LCBhICJjb250aW51ZSIgc3RhdGVtZW50CndhcyBpbGxlZ2FsIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIGR1ZSB0byBhIHByb2JsZW0gd2l0aCB0aGUKaW1wbGVtZW50YXRpb24uCgoKVGhlICJ3aXRoIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT0KClRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aAptZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggU3RhdGVtZW50CkNvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSLigKYiZXhjZXB0IuKApiJmaW5hbGx5IiB1c2FnZQpwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuCgogICB3aXRoX3N0bXQgICAgICAgICAgOjo9ICJ3aXRoIiAoICIoIiB3aXRoX3N0bXRfY29udGVudHMgIiwiPyAiKSIgfCB3aXRoX3N0bXRfY29udGVudHMgKSAiOiIgc3VpdGUKICAgd2l0aF9zdG10X2NvbnRlbnRzIDo6PSB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKgogICB3aXRoX2l0ZW0gICAgICAgICAgOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XQoKVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSDigJxpdGVt4oCdIHByb2NlZWRzIGFzCmZvbGxvd3M6CgoxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpIGlzCiAgIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuCgoyLiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19lbnRlcl9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKMy4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKNC4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC4KCjUuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuCgogICBOb3RlOgoKICAgICBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSIgbWV0aG9kCiAgICAgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZQogICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGUKICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZwogICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDcgYmVsb3cuCgo2LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuCgo3LiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhbgogICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWUKICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC4KICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmQKICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCIKICAgc3RhdGVtZW50LgoKICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZQogICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkcwogICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLgoKVGhlIGZvbGxvd2luZyBjb2RlOgoKICAgd2l0aCBFWFBSRVNTSU9OIGFzIFRBUkdFVDoKICAgICAgIFNVSVRFCgppcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzoKCiAgIG1hbmFnZXIgPSAoRVhQUkVTU0lPTikKICAgZW50ZXIgPSBtYW5hZ2VyLl9fZW50ZXJfXwogICBleGl0ID0gbWFuYWdlci5fX2V4aXRfXwogICB2YWx1ZSA9IGVudGVyKCkKICAgaGl0X2V4Y2VwdCA9IEZhbHNlCgogICB0cnk6CiAgICAgICBUQVJHRVQgPSB2YWx1ZQogICAgICAgU1VJVEUKICAgZXhjZXB0OgogICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKICAgICAgIGlmIG5vdCBleGl0KCpzeXMuZXhjX2luZm8oKSk6CiAgICAgICAgICAgcmFpc2UKICAgZmluYWxseToKICAgICAgIGlmIG5vdCBoaXRfZXhjZXB0OgogICAgICAgICAgIGV4aXQoTm9uZSwgTm9uZSwgTm9uZSkKCmV4Y2VwdCB0aGF0IGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBpcyB1c2VkIGZvciAiX19lbnRlcl9fKCkiCmFuZCAiX19leGl0X18oKSIuCgpXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZgptdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDoKCiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOgogICAgICAgU1VJVEUKCmlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgd2l0aCBBKCkgYXMgYToKICAgICAgIHdpdGggQigpIGFzIGI6CiAgICAgICAgICAgU1VJVEUKCllvdSBjYW4gYWxzbyB3cml0ZSBtdWx0aS1pdGVtIGNvbnRleHQgbWFuYWdlcnMgaW4gbXVsdGlwbGUgbGluZXMgaWYKdGhlIGl0ZW1zIGFyZSBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzLiBGb3IgZXhhbXBsZToKCiAgIHdpdGggKAogICAgICAgQSgpIGFzIGEsCiAgICAgICBCKCkgYXMgYiwKICAgKToKICAgICAgIFNVSVRFCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTA6IFN1cHBvcnQgZm9yIHVzaW5nIGdyb3VwaW5nIHBhcmVudGhlc2VzIHRvCmJyZWFrIHRoZSBzdGF0ZW1lbnQgaW4gbXVsdGlwbGUgbGluZXMuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzQzKiogLSBUaGUg4oCcd2l0aOKAnSBzdGF0ZW1lbnQKICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIgogICAgIHN0YXRlbWVudC4KCgpUaGUgIm1hdGNoIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT09CgpBZGRlZCBpbiB2ZXJzaW9uIDMuMTAuCgpUaGUgbWF0Y2ggc3RhdGVtZW50IGlzIHVzZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcuICBTeW50YXg6CgogICBtYXRjaF9zdG10ICAgOjo9ICdtYXRjaCcgc3ViamVjdF9leHByICI6IiBORVdMSU5FIElOREVOVCBjYXNlX2Jsb2NrKyBERURFTlQKICAgc3ViamVjdF9leHByIDo6PSBgIXN0YXJfbmFtZWRfZXhwcmVzc2lvbmAgIiwiIGAhc3Rhcl9uYW1lZF9leHByZXNzaW9uc2A/CiAgICAgICAgICAgICAgICAgICAgfCBgIW5hbWVkX2V4cHJlc3Npb25gCiAgIGNhc2VfYmxvY2sgICA6Oj0gJ2Nhc2UnIHBhdHRlcm5zIFtndWFyZF0gIjoiIGAhYmxvY2tgCgpOb3RlOgoKICBUaGlzIHNlY3Rpb24gdXNlcyBzaW5nbGUgcXVvdGVzIHRvIGRlbm90ZSBzb2Z0IGtleXdvcmRzLgoKUGF0dGVybiBtYXRjaGluZyB0YWtlcyBhIHBhdHRlcm4gYXMgaW5wdXQgKGZvbGxvd2luZyAiY2FzZSIpIGFuZCBhCnN1YmplY3QgdmFsdWUgKGZvbGxvd2luZyAibWF0Y2giKS4gIFRoZSBwYXR0ZXJuICh3aGljaCBtYXkgY29udGFpbgpzdWJwYXR0ZXJucykgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWJqZWN0IHZhbHVlLiAgVGhlIG91dGNvbWVzIGFyZToKCiogQSBtYXRjaCBzdWNjZXNzIG9yIGZhaWx1cmUgKGFsc28gdGVybWVkIGEgcGF0dGVybiBzdWNjZXNzIG9yCiAgZmFpbHVyZSkuCgoqIFBvc3NpYmxlIGJpbmRpbmcgb2YgbWF0Y2hlZCB2YWx1ZXMgdG8gYSBuYW1lLiAgVGhlIHByZXJlcXVpc2l0ZXMgZm9yCiAgdGhpcyBhcmUgZnVydGhlciBkaXNjdXNzZWQgYmVsb3cuCgpUaGUgIm1hdGNoIiBhbmQgImNhc2UiIGtleXdvcmRzIGFyZSBzb2Z0IGtleXdvcmRzLgoKU2VlIGFsc286CgogICogKipQRVAgNjM0Kiog4oCTIFN0cnVjdHVyYWwgUGF0dGVybiBNYXRjaGluZzogU3BlY2lmaWNhdGlvbgoKICAqICoqUEVQIDYzNioqIOKAkyBTdHJ1Y3R1cmFsIFBhdHRlcm4gTWF0Y2hpbmc6IFR1dG9yaWFsCgoKT3ZlcnZpZXcKLS0tLS0tLS0KCkhlcmXigJlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsb2dpY2FsIGZsb3cgb2YgYSBtYXRjaCBzdGF0ZW1lbnQ6CgoxLiBUaGUgc3ViamVjdCBleHByZXNzaW9uICJzdWJqZWN0X2V4cHIiIGlzIGV2YWx1YXRlZCBhbmQgYSByZXN1bHRpbmcKICAgc3ViamVjdCB2YWx1ZSBvYnRhaW5lZC4gSWYgdGhlIHN1YmplY3QgZXhwcmVzc2lvbiBjb250YWlucyBhIGNvbW1hLAogICBhIHR1cGxlIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlcy4KCjIuIEVhY2ggcGF0dGVybiBpbiBhICJjYXNlX2Jsb2NrIiBpcyBhdHRlbXB0ZWQgdG8gbWF0Y2ggd2l0aCB0aGUKICAgc3ViamVjdCB2YWx1ZS4gVGhlIHNwZWNpZmljIHJ1bGVzIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUgYXJlCiAgIGRlc2NyaWJlZCBiZWxvdy4gVGhlIG1hdGNoIGF0dGVtcHQgY2FuIGFsc28gYmluZCBzb21lIG9yIGFsbCBvZiB0aGUKICAgc3RhbmRhbG9uZSBuYW1lcyB3aXRoaW4gdGhlIHBhdHRlcm4uIFRoZSBwcmVjaXNlIHBhdHRlcm4gYmluZGluZwogICBydWxlcyB2YXJ5IHBlciBwYXR0ZXJuIHR5cGUgYW5kIGFyZSBzcGVjaWZpZWQgYmVsb3cuICAqKk5hbWUKICAgYmluZGluZ3MgbWFkZSBkdXJpbmcgYSBzdWNjZXNzZnVsIHBhdHRlcm4gbWF0Y2ggb3V0bGl2ZSB0aGUKICAgZXhlY3V0ZWQgYmxvY2sgYW5kIGNhbiBiZSB1c2VkIGFmdGVyIHRoZSBtYXRjaCBzdGF0ZW1lbnQqKi4KCiAgIE5vdGU6CgogICAgIER1cmluZyBmYWlsZWQgcGF0dGVybiBtYXRjaGVzLCBzb21lIHN1YnBhdHRlcm5zIG1heSBzdWNjZWVkLiAgRG8KICAgICBub3QgcmVseSBvbiBiaW5kaW5ncyBiZWluZyBtYWRlIGZvciBhIGZhaWxlZCBtYXRjaC4gIENvbnZlcnNlbHksCiAgICAgZG8gbm90IHJlbHkgb24gdmFyaWFibGVzIHJlbWFpbmluZyB1bmNoYW5nZWQgYWZ0ZXIgYSBmYWlsZWQKICAgICBtYXRjaC4gIFRoZSBleGFjdCBiZWhhdmlvciBpcyBkZXBlbmRlbnQgb24gaW1wbGVtZW50YXRpb24gYW5kIG1heQogICAgIHZhcnkuICBUaGlzIGlzIGFuIGludGVudGlvbmFsIGRlY2lzaW9uIG1hZGUgdG8gYWxsb3cgZGlmZmVyZW50CiAgICAgaW1wbGVtZW50YXRpb25zIHRvIGFkZCBvcHRpbWl6YXRpb25zLgoKMy4gSWYgdGhlIHBhdHRlcm4gc3VjY2VlZHMsIHRoZSBjb3JyZXNwb25kaW5nIGd1YXJkIChpZiBwcmVzZW50KSBpcwogICBldmFsdWF0ZWQuIEluIHRoaXMgY2FzZSBhbGwgbmFtZSBiaW5kaW5ncyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCiAgIGhhcHBlbmVkLgoKICAgKiBJZiB0aGUgZ3VhcmQgZXZhbHVhdGVzIGFzIHRydWUgb3IgaXMgbWlzc2luZywgdGhlICJibG9jayIgaW5zaWRlCiAgICAgImNhc2VfYmxvY2siIGlzIGV4ZWN1dGVkLgoKICAgKiBPdGhlcndpc2UsIHRoZSBuZXh0ICJjYXNlX2Jsb2NrIiBpcyBhdHRlbXB0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgoKICAgKiBJZiB0aGVyZSBhcmUgbm8gZnVydGhlciBjYXNlIGJsb2NrcywgdGhlIG1hdGNoIHN0YXRlbWVudCBpcwogICAgIGNvbXBsZXRlZC4KCk5vdGU6CgogIFVzZXJzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgcmVseSBvbiBhIHBhdHRlcm4gYmVpbmcgZXZhbHVhdGVkLgogIERlcGVuZGluZyBvbiBpbXBsZW1lbnRhdGlvbiwgdGhlIGludGVycHJldGVyIG1heSBjYWNoZSB2YWx1ZXMgb3IgdXNlCiAgb3RoZXIgb3B0aW1pemF0aW9ucyB3aGljaCBza2lwIHJlcGVhdGVkIGV2YWx1YXRpb25zLgoKQSBzYW1wbGUgbWF0Y2ggc3RhdGVtZW50OgoKICAgPj4+IGZsYWcgPSBGYWxzZQogICA+Pj4gbWF0Y2ggKDEwMCwgMjAwKToKICAgLi4uICAgIGNhc2UgKDEwMCwgMzAwKTogICMgTWlzbWF0Y2g6IDIwMCAhPSAzMDAKICAgLi4uICAgICAgICBwcmludCgnQ2FzZSAxJykKICAgLi4uICAgIGNhc2UgKDEwMCwgMjAwKSBpZiBmbGFnOiAgIyBTdWNjZXNzZnVsIG1hdGNoLCBidXQgZ3VhcmQgZmFpbHMKICAgLi4uICAgICAgICBwcmludCgnQ2FzZSAyJykKICAgLi4uICAgIGNhc2UgKDEwMCwgeSk6ICAjIE1hdGNoZXMgYW5kIGJpbmRzIHkgdG8gMjAwCiAgIC4uLiAgICAgICAgcHJpbnQoZidDYXNlIDMsIHk6IHt5fScpCiAgIC4uLiAgICBjYXNlIF86ICAjIFBhdHRlcm4gbm90IGF0dGVtcHRlZAogICAuLi4gICAgICAgIHByaW50KCdDYXNlIDQsIEkgbWF0Y2ggYW55dGhpbmchJykKICAgLi4uCiAgIENhc2UgMywgeTogMjAwCgpJbiB0aGlzIGNhc2UsICJpZiBmbGFnIiBpcyBhIGd1YXJkLiAgUmVhZCBtb3JlIGFib3V0IHRoYXQgaW4gdGhlIG5leHQKc2VjdGlvbi4KCgpHdWFyZHMKLS0tLS0tCgogICBndWFyZCA6Oj0gImlmIiBgIW5hbWVkX2V4cHJlc3Npb25gCgpBICJndWFyZCIgKHdoaWNoIGlzIHBhcnQgb2YgdGhlICJjYXNlIikgbXVzdCBzdWNjZWVkIGZvciBjb2RlIGluc2lkZQp0aGUgImNhc2UiIGJsb2NrIHRvIGV4ZWN1dGUuICBJdCB0YWtlcyB0aGUgZm9ybTogImlmIiBmb2xsb3dlZCBieSBhbgpleHByZXNzaW9uLgoKVGhlIGxvZ2ljYWwgZmxvdyBvZiBhICJjYXNlIiBibG9jayB3aXRoIGEgImd1YXJkIiBmb2xsb3dzOgoKMS4gQ2hlY2sgdGhhdCB0aGUgcGF0dGVybiBpbiB0aGUgImNhc2UiIGJsb2NrIHN1Y2NlZWRlZC4gIElmIHRoZQogICBwYXR0ZXJuIGZhaWxlZCwgdGhlICJndWFyZCIgaXMgbm90IGV2YWx1YXRlZCBhbmQgdGhlIG5leHQgImNhc2UiCiAgIGJsb2NrIGlzIGNoZWNrZWQuCgoyLiBJZiB0aGUgcGF0dGVybiBzdWNjZWVkZWQsIGV2YWx1YXRlIHRoZSAiZ3VhcmQiLgoKICAgKiBJZiB0aGUgImd1YXJkIiBjb25kaXRpb24gZXZhbHVhdGVzIGFzIHRydWUsIHRoZSBjYXNlIGJsb2NrIGlzCiAgICAgc2VsZWN0ZWQuCgogICAqIElmIHRoZSAiZ3VhcmQiIGNvbmRpdGlvbiBldmFsdWF0ZXMgYXMgZmFsc2UsIHRoZSBjYXNlIGJsb2NrIGlzCiAgICAgbm90IHNlbGVjdGVkLgoKICAgKiBJZiB0aGUgImd1YXJkIiByYWlzZXMgYW4gZXhjZXB0aW9uIGR1cmluZyBldmFsdWF0aW9uLCB0aGUKICAgICBleGNlcHRpb24gYnViYmxlcyB1cC4KCkd1YXJkcyBhcmUgYWxsb3dlZCB0byBoYXZlIHNpZGUgZWZmZWN0cyBhcyB0aGV5IGFyZSBleHByZXNzaW9ucy4KR3VhcmQgZXZhbHVhdGlvbiBtdXN0IHByb2NlZWQgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIGxhc3QgY2FzZSBibG9jaywKb25lIGF0IGEgdGltZSwgc2tpcHBpbmcgY2FzZSBibG9ja3Mgd2hvc2UgcGF0dGVybihzKSBkb27igJl0IGFsbApzdWNjZWVkLiAoSS5lLiwgZ3VhcmQgZXZhbHVhdGlvbiBtdXN0IGhhcHBlbiBpbiBvcmRlci4pIEd1YXJkCmV2YWx1YXRpb24gbXVzdCBzdG9wIG9uY2UgYSBjYXNlIGJsb2NrIGlzIHNlbGVjdGVkLgoKCklycmVmdXRhYmxlIENhc2UgQmxvY2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBbiBpcnJlZnV0YWJsZSBjYXNlIGJsb2NrIGlzIGEgbWF0Y2gtYWxsIGNhc2UgYmxvY2suICBBIG1hdGNoCnN0YXRlbWVudCBtYXkgaGF2ZSBhdCBtb3N0IG9uZSBpcnJlZnV0YWJsZSBjYXNlIGJsb2NrLCBhbmQgaXQgbXVzdCBiZQpsYXN0LgoKQSBjYXNlIGJsb2NrIGlzIGNvbnNpZGVyZWQgaXJyZWZ1dGFibGUgaWYgaXQgaGFzIG5vIGd1YXJkIGFuZCBpdHMKcGF0dGVybiBpcyBpcnJlZnV0YWJsZS4gIEEgcGF0dGVybiBpcyBjb25zaWRlcmVkIGlycmVmdXRhYmxlIGlmIHdlIGNhbgpwcm92ZSBmcm9tIGl0cyBzeW50YXggYWxvbmUgdGhhdCBpdCB3aWxsIGFsd2F5cyBzdWNjZWVkLiAgT25seSB0aGUKZm9sbG93aW5nIHBhdHRlcm5zIGFyZSBpcnJlZnV0YWJsZToKCiogQVMgUGF0dGVybnMgd2hvc2UgbGVmdC1oYW5kIHNpZGUgaXMgaXJyZWZ1dGFibGUKCiogT1IgUGF0dGVybnMgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgaXJyZWZ1dGFibGUgcGF0dGVybgoKKiBDYXB0dXJlIFBhdHRlcm5zCgoqIFdpbGRjYXJkIFBhdHRlcm5zCgoqIHBhcmVudGhlc2l6ZWQgaXJyZWZ1dGFibGUgcGF0dGVybnMKCgpQYXR0ZXJucwotLS0tLS0tLQoKTm90ZToKCiAgVGhpcyBzZWN0aW9uIHVzZXMgZ3JhbW1hciBub3RhdGlvbnMgYmV5b25kIHN0YW5kYXJkIEVCTkY6CgogICogdGhlIG5vdGF0aW9uICJTRVAuUlVMRSsiIGlzIHNob3J0aGFuZCBmb3IgIlJVTEUgKFNFUCBSVUxFKSoiCgogICogdGhlIG5vdGF0aW9uICIhUlVMRSIgaXMgc2hvcnRoYW5kIGZvciBhIG5lZ2F0aXZlIGxvb2thaGVhZAogICAgYXNzZXJ0aW9uCgpUaGUgdG9wLWxldmVsIHN5bnRheCBmb3IgInBhdHRlcm5zIiBpczoKCiAgIHBhdHRlcm5zICAgICAgIDo6PSBvcGVuX3NlcXVlbmNlX3BhdHRlcm4gfCBwYXR0ZXJuCiAgIHBhdHRlcm4gICAgICAgIDo6PSBhc19wYXR0ZXJuIHwgb3JfcGF0dGVybgogICBjbG9zZWRfcGF0dGVybiA6Oj0gfCBsaXRlcmFsX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgY2FwdHVyZV9wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IHdpbGRjYXJkX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVfcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgfCBncm91cF9wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgbWFwcGluZ19wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzX3BhdHRlcm4KClRoZSBkZXNjcmlwdGlvbnMgYmVsb3cgd2lsbCBpbmNsdWRlIGEgZGVzY3JpcHRpb24g4oCcaW4gc2ltcGxlIHRlcm1z4oCdIG9mCndoYXQgYSBwYXR0ZXJuIGRvZXMgZm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcyAoY3JlZGl0cyB0byBSYXltb25kCkhldHRpbmdlciBmb3IgYSBkb2N1bWVudCB0aGF0IGluc3BpcmVkIG1vc3Qgb2YgdGhlIGRlc2NyaXB0aW9ucykuIE5vdGUKdGhhdCB0aGVzZSBkZXNjcmlwdGlvbnMgYXJlIHB1cmVseSBmb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzIGFuZCAqKm1heQpub3QqKiByZWZsZWN0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLiAgRnVydGhlcm1vcmUsIHRoZXkgZG8gbm90CmNvdmVyIGFsbCB2YWxpZCBmb3Jtcy4KCgpPUiBQYXR0ZXJucwp+fn5+fn5+fn5+fgoKQW4gT1IgcGF0dGVybiBpcyB0d28gb3IgbW9yZSBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgdmVydGljYWwgYmFycyAifCIuClN5bnRheDoKCiAgIG9yX3BhdHRlcm4gOjo9ICJ8Ii5jbG9zZWRfcGF0dGVybisKCk9ubHkgdGhlIGZpbmFsIHN1YnBhdHRlcm4gbWF5IGJlIGlycmVmdXRhYmxlLCBhbmQgZWFjaCBzdWJwYXR0ZXJuIG11c3QKYmluZCB0aGUgc2FtZSBzZXQgb2YgbmFtZXMgdG8gYXZvaWQgYW1iaWd1aXR5LgoKQW4gT1IgcGF0dGVybiBtYXRjaGVzIGVhY2ggb2YgaXRzIHN1YnBhdHRlcm5zIGluIHR1cm4gdG8gdGhlIHN1YmplY3QKdmFsdWUsIHVudGlsIG9uZSBzdWNjZWVkcy4gIFRoZSBPUiBwYXR0ZXJuIGlzIHRoZW4gY29uc2lkZXJlZApzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBpZiBub25lIG9mIHRoZSBzdWJwYXR0ZXJucyBzdWNjZWVkLCB0aGUgT1IKcGF0dGVybiBmYWlscy4KCkluIHNpbXBsZSB0ZXJtcywgIlAxIHwgUDIgfCAuLi4iIHdpbGwgdHJ5IHRvIG1hdGNoICJQMSIsIGlmIGl0IGZhaWxzCml0IHdpbGwgdHJ5IHRvIG1hdGNoICJQMiIsIHN1Y2NlZWRpbmcgaW1tZWRpYXRlbHkgaWYgYW55IHN1Y2NlZWRzLApmYWlsaW5nIG90aGVyd2lzZS4KCgpBUyBQYXR0ZXJucwp+fn5+fn5+fn5+fgoKQW4gQVMgcGF0dGVybiBtYXRjaGVzIGFuIE9SIHBhdHRlcm4gb24gdGhlIGxlZnQgb2YgdGhlICJhcyIga2V5d29yZAphZ2FpbnN0IGEgc3ViamVjdC4gIFN5bnRheDoKCiAgIGFzX3BhdHRlcm4gOjo9IG9yX3BhdHRlcm4gImFzIiBjYXB0dXJlX3BhdHRlcm4KCklmIHRoZSBPUiBwYXR0ZXJuIGZhaWxzLCB0aGUgQVMgcGF0dGVybiBmYWlscy4gIE90aGVyd2lzZSwgdGhlIEFTCnBhdHRlcm4gYmluZHMgdGhlIHN1YmplY3QgdG8gdGhlIG5hbWUgb24gdGhlIHJpZ2h0IG9mIHRoZSBhcyBrZXl3b3JkCmFuZCBzdWNjZWVkcy4gImNhcHR1cmVfcGF0dGVybiIgY2Fubm90IGJlIGEgIl8iLgoKSW4gc2ltcGxlIHRlcm1zICJQIGFzIE5BTUUiIHdpbGwgbWF0Y2ggd2l0aCAiUCIsIGFuZCBvbiBzdWNjZXNzIGl0CndpbGwgc2V0ICJOQU1FID0gPHN1YmplY3Q+Ii4KCgpMaXRlcmFsIFBhdHRlcm5zCn5+fn5+fn5+fn5+fn5+fn4KCkEgbGl0ZXJhbCBwYXR0ZXJuIGNvcnJlc3BvbmRzIHRvIG1vc3QgbGl0ZXJhbHMgaW4gUHl0aG9uLiAgU3ludGF4OgoKICAgbGl0ZXJhbF9wYXR0ZXJuIDo6PSBzaWduZWRfbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgfCBzaWduZWRfbnVtYmVyICIrIiBOVU1CRVIKICAgICAgICAgICAgICAgICAgICAgICB8IHNpZ25lZF9udW1iZXIgIi0iIE5VTUJFUgogICAgICAgICAgICAgICAgICAgICAgIHwgYCFzdHJpbmdzYAogICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgICAgfCAiVHJ1ZSIKICAgICAgICAgICAgICAgICAgICAgICB8ICJGYWxzZSIKICAgc2lnbmVkX251bWJlciAgIDo6PSBbIi0iXSBOVU1CRVIKClRoZSBydWxlICJzdHJpbmdzIiBhbmQgdGhlIHRva2VuICJOVU1CRVIiIGFyZSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZApQeXRob24gZ3JhbW1hci4gIFRyaXBsZS1xdW90ZWQgc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiAgUmF3IHN0cmluZ3MgYW5kCmJ5dGUgc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiAgZi1zdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkLgoKVGhlIGZvcm1zICJzaWduZWRfbnVtYmVyICcrJyBOVU1CRVIiIGFuZCAic2lnbmVkX251bWJlciAnLScgTlVNQkVSIgphcmUgZm9yIGV4cHJlc3NpbmcgY29tcGxleCBudW1iZXJzOyB0aGV5IHJlcXVpcmUgYSByZWFsIG51bWJlciBvbiB0aGUKbGVmdCBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlciBvbiB0aGUgcmlnaHQuIEUuZy4gIjMgKyA0aiIuCgpJbiBzaW1wbGUgdGVybXMsICJMSVRFUkFMIiB3aWxsIHN1Y2NlZWQgb25seSBpZiAiPHN1YmplY3Q+ID09CkxJVEVSQUwiLiBGb3IgdGhlIHNpbmdsZXRvbnMgIk5vbmUiLCAiVHJ1ZSIgYW5kICJGYWxzZSIsIHRoZSAiaXMiCm9wZXJhdG9yIGlzIHVzZWQuCgoKQ2FwdHVyZSBQYXR0ZXJucwp+fn5+fn5+fn5+fn5+fn5+CgpBIGNhcHR1cmUgcGF0dGVybiBiaW5kcyB0aGUgc3ViamVjdCB2YWx1ZSB0byBhIG5hbWUuIFN5bnRheDoKCiAgIGNhcHR1cmVfcGF0dGVybiA6Oj0gISdfJyBOQU1FCgpBIHNpbmdsZSB1bmRlcnNjb3JlICJfIiBpcyBub3QgYSBjYXB0dXJlIHBhdHRlcm4gKHRoaXMgaXMgd2hhdCAiISdfJyIKZXhwcmVzc2VzKS4gSXQgaXMgaW5zdGVhZCB0cmVhdGVkIGFzIGEgIndpbGRjYXJkX3BhdHRlcm4iLgoKSW4gYSBnaXZlbiBwYXR0ZXJuLCBhIGdpdmVuIG5hbWUgY2FuIG9ubHkgYmUgYm91bmQgb25jZS4gIEUuZy4gImNhc2UKeCwgeDogLi4uIiBpcyBpbnZhbGlkIHdoaWxlICJjYXNlIFt4XSB8IHg6IC4uLiIgaXMgYWxsb3dlZC4KCkNhcHR1cmUgcGF0dGVybnMgYWx3YXlzIHN1Y2NlZWQuICBUaGUgYmluZGluZyBmb2xsb3dzIHNjb3BpbmcgcnVsZXMKZXN0YWJsaXNoZWQgYnkgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBvcGVyYXRvciBpbiAqKlBFUCA1NzIqKjsgdGhlCm5hbWUgYmVjb21lcyBhIGxvY2FsIHZhcmlhYmxlIGluIHRoZSBjbG9zZXN0IGNvbnRhaW5pbmcgZnVuY3Rpb24gc2NvcGUKdW5sZXNzIHRoZXJl4oCZcyBhbiBhcHBsaWNhYmxlICJnbG9iYWwiIG9yICJub25sb2NhbCIgc3RhdGVtZW50LgoKSW4gc2ltcGxlIHRlcm1zICJOQU1FIiB3aWxsIGFsd2F5cyBzdWNjZWVkIGFuZCBpdCB3aWxsIHNldCAiTkFNRSA9CjxzdWJqZWN0PiIuCgoKV2lsZGNhcmQgUGF0dGVybnMKfn5+fn5+fn5+fn5+fn5+fn4KCkEgd2lsZGNhcmQgcGF0dGVybiBhbHdheXMgc3VjY2VlZHMgKG1hdGNoZXMgYW55dGhpbmcpIGFuZCBiaW5kcyBubwpuYW1lLiAgU3ludGF4OgoKICAgd2lsZGNhcmRfcGF0dGVybiA6Oj0gJ18nCgoiXyIgaXMgYSBzb2Z0IGtleXdvcmQgd2l0aGluIGFueSBwYXR0ZXJuLCBidXQgb25seSB3aXRoaW4gcGF0dGVybnMuCkl0IGlzIGFuIGlkZW50aWZpZXIsIGFzIHVzdWFsLCBldmVuIHdpdGhpbiAibWF0Y2giIHN1YmplY3QKZXhwcmVzc2lvbnMsICJndWFyZCJzLCBhbmQgImNhc2UiIGJsb2Nrcy4KCkluIHNpbXBsZSB0ZXJtcywgIl8iIHdpbGwgYWx3YXlzIHN1Y2NlZWQuCgoKVmFsdWUgUGF0dGVybnMKfn5+fn5+fn5+fn5+fn4KCkEgdmFsdWUgcGF0dGVybiByZXByZXNlbnRzIGEgbmFtZWQgdmFsdWUgaW4gUHl0aG9uLiBTeW50YXg6CgogICB2YWx1ZV9wYXR0ZXJuIDo6PSBhdHRyCiAgIGF0dHIgICAgICAgICAgOjo9IG5hbWVfb3JfYXR0ciAiLiIgTkFNRQogICBuYW1lX29yX2F0dHIgIDo6PSBhdHRyIHwgTkFNRQoKVGhlIGRvdHRlZCBuYW1lIGluIHRoZSBwYXR0ZXJuIGlzIGxvb2tlZCB1cCB1c2luZyBzdGFuZGFyZCBQeXRob24gbmFtZQpyZXNvbHV0aW9uIHJ1bGVzLiAgVGhlIHBhdHRlcm4gc3VjY2VlZHMgaWYgdGhlIHZhbHVlIGZvdW5kIGNvbXBhcmVzCmVxdWFsIHRvIHRoZSBzdWJqZWN0IHZhbHVlICh1c2luZyB0aGUgIj09IiBlcXVhbGl0eSBvcGVyYXRvcikuCgpJbiBzaW1wbGUgdGVybXMgIk5BTUUxLk5BTUUyIiB3aWxsIHN1Y2NlZWQgb25seSBpZiAiPHN1YmplY3Q+ID09Ck5BTUUxLk5BTUUyIgoKTm90ZToKCiAgSWYgdGhlIHNhbWUgdmFsdWUgb2NjdXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIG1hdGNoIHN0YXRlbWVudCwKICB0aGUgaW50ZXJwcmV0ZXIgbWF5IGNhY2hlIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCBhbmQgcmV1c2UgaXQgcmF0aGVyCiAgdGhhbiByZXBlYXQgdGhlIHNhbWUgbG9va3VwLiAgVGhpcyBjYWNoZSBpcyBzdHJpY3RseSB0aWVkIHRvIGEgZ2l2ZW4KICBleGVjdXRpb24gb2YgYSBnaXZlbiBtYXRjaCBzdGF0ZW1lbnQuCgoKR3JvdXAgUGF0dGVybnMKfn5+fn5+fn5+fn5+fn4KCkEgZ3JvdXAgcGF0dGVybiBhbGxvd3MgdXNlcnMgdG8gYWRkIHBhcmVudGhlc2VzIGFyb3VuZCBwYXR0ZXJucyB0bwplbXBoYXNpemUgdGhlIGludGVuZGVkIGdyb3VwaW5nLiAgT3RoZXJ3aXNlLCBpdCBoYXMgbm8gYWRkaXRpb25hbApzeW50YXguIFN5bnRheDoKCiAgIGdyb3VwX3BhdHRlcm4gOjo9ICIoIiBwYXR0ZXJuICIpIgoKSW4gc2ltcGxlIHRlcm1zICIoUCkiIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgIlAiLgoKClNlcXVlbmNlIFBhdHRlcm5zCn5+fn5+fn5+fn5+fn5+fn5+CgpBIHNlcXVlbmNlIHBhdHRlcm4gY29udGFpbnMgc2V2ZXJhbCBzdWJwYXR0ZXJucyB0byBiZSBtYXRjaGVkIGFnYWluc3QKc2VxdWVuY2UgZWxlbWVudHMuIFRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgdW5wYWNraW5nIG9mIGEgbGlzdCBvcgp0dXBsZS4KCiAgIHNlcXVlbmNlX3BhdHRlcm4gICAgICAgOjo9ICJbIiBbbWF5YmVfc2VxdWVuY2VfcGF0dGVybl0gIl0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIigiIFtvcGVuX3NlcXVlbmNlX3BhdHRlcm5dICIpIgogICBvcGVuX3NlcXVlbmNlX3BhdHRlcm4gIDo6PSBtYXliZV9zdGFyX3BhdHRlcm4gIiwiIFttYXliZV9zZXF1ZW5jZV9wYXR0ZXJuXQogICBtYXliZV9zZXF1ZW5jZV9wYXR0ZXJuIDo6PSAiLCIubWF5YmVfc3Rhcl9wYXR0ZXJuKyAiLCI/CiAgIG1heWJlX3N0YXJfcGF0dGVybiAgICAgOjo9IHN0YXJfcGF0dGVybiB8IHBhdHRlcm4KICAgc3Rhcl9wYXR0ZXJuICAgICAgICAgICA6Oj0gIioiIChjYXB0dXJlX3BhdHRlcm4gfCB3aWxkY2FyZF9wYXR0ZXJuKQoKVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpZiBwYXJlbnRoZXNlcyAgb3Igc3F1YXJlIGJyYWNrZXRzIGFyZSB1c2VkIGZvcgpzZXF1ZW5jZSBwYXR0ZXJucyAoaS5lLiAiKC4uLikiIHZzICJbLi4uXSIgKS4KCk5vdGU6CgogIEEgc2luZ2xlIHBhdHRlcm4gZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgd2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hCiAgKGUuZy4gIigzIHwgNCkiKSBpcyBhIGdyb3VwIHBhdHRlcm4uIFdoaWxlIGEgc2luZ2xlIHBhdHRlcm4gZW5jbG9zZWQKICBpbiBzcXVhcmUgYnJhY2tldHMgKGUuZy4gIlszIHwgNF0iKSBpcyBzdGlsbCBhIHNlcXVlbmNlIHBhdHRlcm4uCgpBdCBtb3N0IG9uZSBzdGFyIHN1YnBhdHRlcm4gbWF5IGJlIGluIGEgc2VxdWVuY2UgcGF0dGVybi4gIFRoZSBzdGFyCnN1YnBhdHRlcm4gbWF5IG9jY3VyIGluIGFueSBwb3NpdGlvbi4gSWYgbm8gc3RhciBzdWJwYXR0ZXJuIGlzCnByZXNlbnQsIHRoZSBzZXF1ZW5jZSBwYXR0ZXJuIGlzIGEgZml4ZWQtbGVuZ3RoIHNlcXVlbmNlIHBhdHRlcm47Cm90aGVyd2lzZSBpdCBpcyBhIHZhcmlhYmxlLWxlbmd0aCBzZXF1ZW5jZSBwYXR0ZXJuLgoKVGhlIGZvbGxvd2luZyBpcyB0aGUgbG9naWNhbCBmbG93IGZvciBtYXRjaGluZyBhIHNlcXVlbmNlIHBhdHRlcm4KYWdhaW5zdCBhIHN1YmplY3QgdmFsdWU6CgoxLiBJZiB0aGUgc3ViamVjdCB2YWx1ZSBpcyBub3QgYSBzZXF1ZW5jZSBbMl0sIHRoZSBzZXF1ZW5jZSBwYXR0ZXJuCiAgIGZhaWxzLgoKMi4gSWYgdGhlIHN1YmplY3QgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgInN0ciIsICJieXRlcyIgb3IKICAgImJ5dGVhcnJheSIgdGhlIHNlcXVlbmNlIHBhdHRlcm4gZmFpbHMuCgozLiBUaGUgc3Vic2VxdWVudCBzdGVwcyBkZXBlbmQgb24gd2hldGhlciB0aGUgc2VxdWVuY2UgcGF0dGVybiBpcwogICBmaXhlZCBvciB2YXJpYWJsZS1sZW5ndGguCgogICBJZiB0aGUgc2VxdWVuY2UgcGF0dGVybiBpcyBmaXhlZC1sZW5ndGg6CgogICAxLiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIG5vdCBlcXVhbCB0byB0aGUgbnVtYmVyCiAgICAgIG9mIHN1YnBhdHRlcm5zLCB0aGUgc2VxdWVuY2UgcGF0dGVybiBmYWlscwoKICAgMi4gU3VicGF0dGVybnMgaW4gdGhlIHNlcXVlbmNlIHBhdHRlcm4gYXJlIG1hdGNoZWQgdG8gdGhlaXIKICAgICAgY29ycmVzcG9uZGluZyBpdGVtcyBpbiB0aGUgc3ViamVjdCBzZXF1ZW5jZSBmcm9tIGxlZnQgdG8gcmlnaHQuCiAgICAgIE1hdGNoaW5nIHN0b3BzIGFzIHNvb24gYXMgYSBzdWJwYXR0ZXJuIGZhaWxzLiAgSWYgYWxsCiAgICAgIHN1YnBhdHRlcm5zIHN1Y2NlZWQgaW4gbWF0Y2hpbmcgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtLCB0aGUKICAgICAgc2VxdWVuY2UgcGF0dGVybiBzdWNjZWVkcy4KCiAgIE90aGVyd2lzZSwgaWYgdGhlIHNlcXVlbmNlIHBhdHRlcm4gaXMgdmFyaWFibGUtbGVuZ3RoOgoKICAgMS4gSWYgdGhlIGxlbmd0aCBvZiB0aGUgc3ViamVjdCBzZXF1ZW5jZSBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZgogICAgICBub24tc3RhciBzdWJwYXR0ZXJucywgdGhlIHNlcXVlbmNlIHBhdHRlcm4gZmFpbHMuCgogICAyLiBUaGUgbGVhZGluZyBub24tc3RhciBzdWJwYXR0ZXJucyBhcmUgbWF0Y2hlZCB0byB0aGVpcgogICAgICBjb3JyZXNwb25kaW5nIGl0ZW1zIGFzIGZvciBmaXhlZC1sZW5ndGggc2VxdWVuY2VzLgoKICAgMy4gSWYgdGhlIHByZXZpb3VzIHN0ZXAgc3VjY2VlZHMsIHRoZSBzdGFyIHN1YnBhdHRlcm4gbWF0Y2hlcyBhCiAgICAgIGxpc3QgZm9ybWVkIG9mIHRoZSByZW1haW5pbmcgc3ViamVjdCBpdGVtcywgZXhjbHVkaW5nIHRoZQogICAgICByZW1haW5pbmcgaXRlbXMgY29ycmVzcG9uZGluZyB0byBub24tc3RhciBzdWJwYXR0ZXJucyBmb2xsb3dpbmcKICAgICAgdGhlIHN0YXIgc3VicGF0dGVybi4KCiAgIDQuIFJlbWFpbmluZyBub24tc3RhciBzdWJwYXR0ZXJucyBhcmUgbWF0Y2hlZCB0byB0aGVpcgogICAgICBjb3JyZXNwb25kaW5nIHN1YmplY3QgaXRlbXMsIGFzIGZvciBhIGZpeGVkLWxlbmd0aCBzZXF1ZW5jZS4KCiAgIE5vdGU6CgogICAgIFRoZSBsZW5ndGggb2YgdGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgb2J0YWluZWQgdmlhICJsZW4oKSIgKGkuZS4KICAgICB2aWEgdGhlICJfX2xlbl9fKCkiIHByb3RvY29sKS4gVGhpcyBsZW5ndGggbWF5IGJlIGNhY2hlZCBieSB0aGUKICAgICBpbnRlcnByZXRlciBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIHZhbHVlIHBhdHRlcm5zLgoKSW4gc2ltcGxlIHRlcm1zICJbUDEsIFAyLCBQMywiIOKApiAiLCBQPE4+XSIgbWF0Y2hlcyBvbmx5IGlmIGFsbCB0aGUKZm9sbG93aW5nIGhhcHBlbnM6CgoqIGNoZWNrICI8c3ViamVjdD4iIGlzIGEgc2VxdWVuY2UKCiogImxlbihzdWJqZWN0KSA9PSA8Tj4iCgoqICJQMSIgbWF0Y2hlcyAiPHN1YmplY3Q+WzBdIiAobm90ZSB0aGF0IHRoaXMgbWF0Y2ggY2FuIGFsc28gYmluZAogIG5hbWVzKQoKKiAiUDIiIG1hdGNoZXMgIjxzdWJqZWN0PlsxXSIgKG5vdGUgdGhhdCB0aGlzIG1hdGNoIGNhbiBhbHNvIGJpbmQKICBuYW1lcykKCiog4oCmIGFuZCBzbyBvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGF0dGVybi9lbGVtZW50LgoKCk1hcHBpbmcgUGF0dGVybnMKfn5+fn5+fn5+fn5+fn5+fgoKQSBtYXBwaW5nIHBhdHRlcm4gY29udGFpbnMgb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhdHRlcm5zLiAgVGhlIHN5bnRheAppcyBzaW1pbGFyIHRvIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYSBkaWN0aW9uYXJ5LiBTeW50YXg6CgogICBtYXBwaW5nX3BhdHRlcm4gICAgIDo6PSAieyIgW2l0ZW1zX3BhdHRlcm5dICJ9IgogICBpdGVtc19wYXR0ZXJuICAgICAgIDo6PSAiLCIua2V5X3ZhbHVlX3BhdHRlcm4rICIsIj8KICAga2V5X3ZhbHVlX3BhdHRlcm4gICA6Oj0gKGxpdGVyYWxfcGF0dGVybiB8IHZhbHVlX3BhdHRlcm4pICI6IiBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG91YmxlX3N0YXJfcGF0dGVybgogICBkb3VibGVfc3Rhcl9wYXR0ZXJuIDo6PSAiKioiIGNhcHR1cmVfcGF0dGVybgoKQXQgbW9zdCBvbmUgZG91YmxlIHN0YXIgcGF0dGVybiBtYXkgYmUgaW4gYSBtYXBwaW5nIHBhdHRlcm4uICBUaGUKZG91YmxlIHN0YXIgcGF0dGVybiBtdXN0IGJlIHRoZSBsYXN0IHN1YnBhdHRlcm4gaW4gdGhlIG1hcHBpbmcKcGF0dGVybi4KCkR1cGxpY2F0ZSBrZXlzIGluIG1hcHBpbmcgcGF0dGVybnMgYXJlIGRpc2FsbG93ZWQuIER1cGxpY2F0ZSBsaXRlcmFsCmtleXMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuIFR3byBrZXlzIHRoYXQgb3RoZXJ3aXNlIGhhdmUgdGhlIHNhbWUKdmFsdWUgd2lsbCByYWlzZSBhICJWYWx1ZUVycm9yIiBhdCBydW50aW1lLgoKVGhlIGZvbGxvd2luZyBpcyB0aGUgbG9naWNhbCBmbG93IGZvciBtYXRjaGluZyBhIG1hcHBpbmcgcGF0dGVybgphZ2FpbnN0IGEgc3ViamVjdCB2YWx1ZToKCjEuIElmIHRoZSBzdWJqZWN0IHZhbHVlIGlzIG5vdCBhIG1hcHBpbmcgWzNdLHRoZSBtYXBwaW5nIHBhdHRlcm4KICAgZmFpbHMuCgoyLiBJZiBldmVyeSBrZXkgZ2l2ZW4gaW4gdGhlIG1hcHBpbmcgcGF0dGVybiBpcyBwcmVzZW50IGluIHRoZSBzdWJqZWN0CiAgIG1hcHBpbmcsIGFuZCB0aGUgcGF0dGVybiBmb3IgZWFjaCBrZXkgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZwogICBpdGVtIG9mIHRoZSBzdWJqZWN0IG1hcHBpbmcsIHRoZSBtYXBwaW5nIHBhdHRlcm4gc3VjY2VlZHMuCgozLiBJZiBkdXBsaWNhdGUga2V5cyBhcmUgZGV0ZWN0ZWQgaW4gdGhlIG1hcHBpbmcgcGF0dGVybiwgdGhlIHBhdHRlcm4KICAgaXMgY29uc2lkZXJlZCBpbnZhbGlkLiBBICJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGZvciBkdXBsaWNhdGUKICAgbGl0ZXJhbCB2YWx1ZXM7IG9yIGEgIlZhbHVlRXJyb3IiIGZvciBuYW1lZCBrZXlzIG9mIHRoZSBzYW1lIHZhbHVlLgoKTm90ZToKCiAgS2V5LXZhbHVlIHBhaXJzIGFyZSBtYXRjaGVkIHVzaW5nIHRoZSB0d28tYXJndW1lbnQgZm9ybSBvZiB0aGUKICBtYXBwaW5nIHN1YmplY3TigJlzICJnZXQoKSIgbWV0aG9kLiAgTWF0Y2hlZCBrZXktdmFsdWUgcGFpcnMgbXVzdAogIGFscmVhZHkgYmUgcHJlc2VudCBpbiB0aGUgbWFwcGluZywgYW5kIG5vdCBjcmVhdGVkIG9uLXRoZS1mbHkgdmlhCiAgIl9fbWlzc2luZ19fKCkiIG9yICJfX2dldGl0ZW1fXygpIi4KCkluIHNpbXBsZSB0ZXJtcyAie0tFWTE6IFAxLCBLRVkyOiBQMiwgLi4uIH0iIG1hdGNoZXMgb25seSBpZiBhbGwgdGhlCmZvbGxvd2luZyBoYXBwZW5zOgoKKiBjaGVjayAiPHN1YmplY3Q+IiBpcyBhIG1hcHBpbmcKCiogIktFWTEgaW4gPHN1YmplY3Q+IgoKKiAiUDEiIG1hdGNoZXMgIjxzdWJqZWN0PltLRVkxXSIKCiog4oCmIGFuZCBzbyBvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgS0VZL3BhdHRlcm4gcGFpci4KCgpDbGFzcyBQYXR0ZXJucwp+fn5+fn5+fn5+fn5+fgoKQSBjbGFzcyBwYXR0ZXJuIHJlcHJlc2VudHMgYSBjbGFzcyBhbmQgaXRzIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQKYXJndW1lbnRzIChpZiBhbnkpLiAgU3ludGF4OgoKICAgY2xhc3NfcGF0dGVybiAgICAgICA6Oj0gbmFtZV9vcl9hdHRyICIoIiBbcGF0dGVybl9hcmd1bWVudHMgIiwiP10gIikiCiAgIHBhdHRlcm5fYXJndW1lbnRzICAgOjo9IHBvc2l0aW9uYWxfcGF0dGVybnMgWyIsIiBrZXl3b3JkX3BhdHRlcm5zXQogICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRfcGF0dGVybnMKICAgcG9zaXRpb25hbF9wYXR0ZXJucyA6Oj0gIiwiLnBhdHRlcm4rCiAgIGtleXdvcmRfcGF0dGVybnMgICAgOjo9ICIsIi5rZXl3b3JkX3BhdHRlcm4rCiAgIGtleXdvcmRfcGF0dGVybiAgICAgOjo9IE5BTUUgIj0iIHBhdHRlcm4KClRoZSBzYW1lIGtleXdvcmQgc2hvdWxkIG5vdCBiZSByZXBlYXRlZCBpbiBjbGFzcyBwYXR0ZXJucy4KClRoZSBmb2xsb3dpbmcgaXMgdGhlIGxvZ2ljYWwgZmxvdyBmb3IgbWF0Y2hpbmcgYSBjbGFzcyBwYXR0ZXJuIGFnYWluc3QKYSBzdWJqZWN0IHZhbHVlOgoKMS4gSWYgIm5hbWVfb3JfYXR0ciIgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdGluICJ0eXBlIiAsIHJhaXNlCiAgICJUeXBlRXJyb3IiLgoKMi4gSWYgdGhlIHN1YmplY3QgdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mICJuYW1lX29yX2F0dHIiICh0ZXN0ZWQKICAgdmlhICJpc2luc3RhbmNlKCkiKSwgdGhlIGNsYXNzIHBhdHRlcm4gZmFpbHMuCgozLiBJZiBubyBwYXR0ZXJuIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhlIHBhdHRlcm4gc3VjY2VlZHMuCiAgIE90aGVyd2lzZSwgdGhlIHN1YnNlcXVlbnQgc3RlcHMgZGVwZW5kIG9uIHdoZXRoZXIga2V5d29yZCBvcgogICBwb3NpdGlvbmFsIGFyZ3VtZW50IHBhdHRlcm5zIGFyZSBwcmVzZW50LgoKICAgRm9yIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIChzcGVjaWZpZWQgYmVsb3cpLCBhIHNpbmdsZQogICBwb3NpdGlvbmFsIHN1YnBhdHRlcm4gaXMgYWNjZXB0ZWQgd2hpY2ggd2lsbCBtYXRjaCB0aGUgZW50aXJlCiAgIHN1YmplY3Q7IGZvciB0aGVzZSB0eXBlcyBrZXl3b3JkIHBhdHRlcm5zIGFsc28gd29yayBhcyBmb3Igb3RoZXIKICAgdHlwZXMuCgogICBJZiBvbmx5IGtleXdvcmQgcGF0dGVybnMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIHByb2Nlc3NlZCBhcwogICBmb2xsb3dzLCBvbmUgYnkgb25lOgoKICAgMS4gVGhlIGtleXdvcmQgaXMgbG9va2VkIHVwIGFzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgc3ViamVjdC4KCiAgICAgICogSWYgdGhpcyByYWlzZXMgYW4gZXhjZXB0aW9uIG90aGVyIHRoYW4gIkF0dHJpYnV0ZUVycm9yIiwgdGhlCiAgICAgICAgZXhjZXB0aW9uIGJ1YmJsZXMgdXAuCgogICAgICAqIElmIHRoaXMgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIsIHRoZSBjbGFzcyBwYXR0ZXJuIGhhcyBmYWlsZWQuCgogICAgICAqIEVsc2UsIHRoZSBzdWJwYXR0ZXJuIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5d29yZCBwYXR0ZXJuIGlzCiAgICAgICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWJqZWN04oCZcyBhdHRyaWJ1dGUgdmFsdWUuICBJZiB0aGlzIGZhaWxzLAogICAgICAgIHRoZSBjbGFzcyBwYXR0ZXJuIGZhaWxzOyBpZiB0aGlzIHN1Y2NlZWRzLCB0aGUgbWF0Y2ggcHJvY2VlZHMKICAgICAgICB0byB0aGUgbmV4dCBrZXl3b3JkLgoKICAgMi4gSWYgYWxsIGtleXdvcmQgcGF0dGVybnMgc3VjY2VlZCwgdGhlIGNsYXNzIHBhdHRlcm4gc3VjY2VlZHMuCgogICBJZiBhbnkgcG9zaXRpb25hbCBwYXR0ZXJucyBhcmUgcHJlc2VudCwgdGhleSBhcmUgY29udmVydGVkIHRvCiAgIGtleXdvcmQgcGF0dGVybnMgdXNpbmcgdGhlICJfX21hdGNoX2FyZ3NfXyIgYXR0cmlidXRlIG9uIHRoZSBjbGFzcwogICAibmFtZV9vcl9hdHRyIiBiZWZvcmUgbWF0Y2hpbmc6CgogICAxLiBUaGUgZXF1aXZhbGVudCBvZiAiZ2V0YXR0cihjbHMsICJfX21hdGNoX2FyZ3NfXyIsICgpKSIgaXMKICAgICAgY2FsbGVkLgoKICAgICAgKiBJZiB0aGlzIHJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBleGNlcHRpb24gYnViYmxlcyB1cC4KCiAgICAgICogSWYgdGhlIHJldHVybmVkIHZhbHVlIGlzIG5vdCBhIHR1cGxlLCB0aGUgY29udmVyc2lvbiBmYWlscyBhbmQKICAgICAgICAiVHlwZUVycm9yIiBpcyByYWlzZWQuCgogICAgICAqIElmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgcGF0dGVybnMgdGhhbgogICAgICAgICJsZW4oY2xzLl9fbWF0Y2hfYXJnc19fKSIsICJUeXBlRXJyb3IiIGlzIHJhaXNlZC4KCiAgICAgICogT3RoZXJ3aXNlLCBwb3NpdGlvbmFsIHBhdHRlcm4gImkiIGlzIGNvbnZlcnRlZCB0byBhIGtleXdvcmQKICAgICAgICBwYXR0ZXJuIHVzaW5nICJfX21hdGNoX2FyZ3NfX1tpXSIgYXMgdGhlIGtleXdvcmQuCiAgICAgICAgIl9fbWF0Y2hfYXJnc19fW2ldIiBtdXN0IGJlIGEgc3RyaW5nOyBpZiBub3QgIlR5cGVFcnJvciIgaXMKICAgICAgICByYWlzZWQuCgogICAgICAqIElmIHRoZXJlIGFyZSBkdXBsaWNhdGUga2V5d29yZHMsICJUeXBlRXJyb3IiIGlzIHJhaXNlZC4KCiAgICAgIFNlZSBhbHNvOgoKICAgICAgICBDdXN0b21pemluZyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBpbiBjbGFzcyBwYXR0ZXJuIG1hdGNoaW5nCgogICAyLiBPbmNlIGFsbCBwb3NpdGlvbmFsIHBhdHRlcm5zIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8ga2V5d29yZAogICAgICBwYXR0ZXJucywgdGhlIG1hdGNoIHByb2NlZWRzIGFzIGlmIHRoZXJlIHdlcmUgb25seSBrZXl3b3JkCiAgICAgIHBhdHRlcm5zLgoKICAgRm9yIHRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gdHlwZXMgdGhlIGhhbmRsaW5nIG9mIHBvc2l0aW9uYWwKICAgc3VicGF0dGVybnMgaXMgZGlmZmVyZW50OgoKICAgKiAiYm9vbCIKCiAgICogImJ5dGVhcnJheSIKCiAgICogImJ5dGVzIgoKICAgKiAiZGljdCIKCiAgICogImZsb2F0IgoKICAgKiAiZnJvemVuc2V0IgoKICAgKiAiaW50IgoKICAgKiAibGlzdCIKCiAgICogInNldCIKCiAgICogInN0ciIKCiAgICogInR1cGxlIgoKICAgVGhlc2UgY2xhc3NlcyBhY2NlcHQgYSBzaW5nbGUgcG9zaXRpb25hbCBhcmd1bWVudCwgYW5kIHRoZSBwYXR0ZXJuCiAgIHRoZXJlIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgd2hvbGUgb2JqZWN0IHJhdGhlciB0aGFuIGFuIGF0dHJpYnV0ZS4KICAgRm9yIGV4YW1wbGUgImludCgwfDEpIiBtYXRjaGVzIHRoZSB2YWx1ZSAiMCIsIGJ1dCBub3QgdGhlIHZhbHVlCiAgICIwLjAiLgoKSW4gc2ltcGxlIHRlcm1zICJDTFMoUDEsIGF0dHI9UDIpIiBtYXRjaGVzIG9ubHkgaWYgdGhlIGZvbGxvd2luZwpoYXBwZW5zOgoKKiAiaXNpbnN0YW5jZSg8c3ViamVjdD4sIENMUykiCgoqIGNvbnZlcnQgIlAxIiB0byBhIGtleXdvcmQgcGF0dGVybiB1c2luZyAiQ0xTLl9fbWF0Y2hfYXJnc19fIgoKKiBGb3IgZWFjaCBrZXl3b3JkIGFyZ3VtZW50ICJhdHRyPVAyIjoKCiAgKiAiaGFzYXR0cig8c3ViamVjdD4sICJhdHRyIikiCgogICogIlAyIiBtYXRjaGVzICI8c3ViamVjdD4uYXR0ciIKCiog4oCmIGFuZCBzbyBvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcga2V5d29yZCBhcmd1bWVudC9wYXR0ZXJuIHBhaXIuCgpTZWUgYWxzbzoKCiAgKiAqKlBFUCA2MzQqKiDigJMgU3RydWN0dXJhbCBQYXR0ZXJuIE1hdGNoaW5nOiBTcGVjaWZpY2F0aW9uCgogICogKipQRVAgNjM2Kiog4oCTIFN0cnVjdHVyYWwgUGF0dGVybiBNYXRjaGluZzogVHV0b3JpYWwKCgpGdW5jdGlvbiBkZWZpbml0aW9ucwo9PT09PT09PT09PT09PT09PT09PQoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWUKc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpOgoKICAgZnVuY2RlZiAgICAgICAgICAgICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lIFt0eXBlX3BhcmFtc10gIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZQogICBkZWNvcmF0b3JzICAgICAgICAgICAgICAgIDo6PSBkZWNvcmF0b3IrCiAgIGRlY29yYXRvciAgICAgICAgICAgICAgICAgOjo9ICJAIiBhc3NpZ25tZW50X2V4cHJlc3Npb24gTkVXTElORQogICBwYXJhbWV0ZXJfbGlzdCAgICAgICAgICAgIDo6PSBkZWZwYXJhbWV0ZXIgKCIsIiBkZWZwYXJhbWV0ZXIpKiAiLCIgIi8iIFsiLCIgW3BhcmFtZXRlcl9saXN0X25vX3Bvc29ubHldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X25vX3Bvc29ubHkKICAgcGFyYW1ldGVyX2xpc3Rfbm9fcG9zb25seSA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiBbcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NdXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzCiAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzICAgOjo9ICIqIiBbc3Rhcl9wYXJhbWV0ZXJdICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiBbcGFyYW1ldGVyX3N0YXJfa3dhcmdzXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiKiIgKCIsIiBkZWZwYXJhbWV0ZXIpKyBbIiwiIFtwYXJhbWV0ZXJfc3Rhcl9rd2FyZ3NdXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9zdGFyX2t3YXJncwogICBwYXJhbWV0ZXJfc3Rhcl9rd2FyZ3MgICAgIDo6PSAiKioiIHBhcmFtZXRlciBbIiwiXQogICBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl0KICAgc3Rhcl9wYXJhbWV0ZXIgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIFsiKiJdIGV4cHJlc3Npb25dCiAgIGRlZnBhcmFtZXRlciAgICAgICAgICAgICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dCiAgIGZ1bmNuYW1lICAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIKCkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHMKdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzCmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlCmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgoKVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzCmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbNF0KCkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKgpleHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMKZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGUKcmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3QKYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZQppbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluCm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCgogICBAZjEoYXJnKQogICBAZjIKICAgZGVmIGZ1bmMoKTogcGFzcwoKaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCgogICBkZWYgZnVuYygpOiBwYXNzCiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKQoKZXhjZXB0IHRoYXQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGlzIG5vdCB0ZW1wb3JhcmlseSBib3VuZCB0byB0aGUgbmFtZQoiZnVuYyIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy45OiBGdW5jdGlvbnMgbWF5IGJlIGRlY29yYXRlZCB3aXRoIGFueSB2YWxpZAoiYXNzaWdubWVudF9leHByZXNzaW9uIi4gUHJldmlvdXNseSwgdGhlIGdyYW1tYXIgd2FzIG11Y2ggbW9yZQpyZXN0cmljdGl2ZTsgc2VlICoqUEVQIDYxNCoqIGZvciBkZXRhaWxzLgoKQSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycyBtYXkgYmUgZ2l2ZW4gaW4gc3F1YXJlIGJyYWNrZXRzIGJldHdlZW4gdGhlCmZ1bmN0aW9u4oCZcyBuYW1lIGFuZCB0aGUgb3BlbmluZyBwYXJlbnRoZXNpcyBmb3IgaXRzIHBhcmFtZXRlciBsaXN0LgpUaGlzIGluZGljYXRlcyB0byBzdGF0aWMgdHlwZSBjaGVja2VycyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBnZW5lcmljLgpBdCBydW50aW1lLCB0aGUgdHlwZSBwYXJhbWV0ZXJzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgZnVuY3Rpb27igJlzCiJfX3R5cGVfcGFyYW1zX18iIGF0dHJpYnV0ZS4gU2VlIEdlbmVyaWMgZnVuY3Rpb25zIGZvciBtb3JlLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTI6IFR5cGUgcGFyYW1ldGVyIGxpc3RzIGFyZSBuZXcgaW4gUHl0aG9uIDMuMTIuCgpXaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IgoqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUg4oCcZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLuKAnQpGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICphcmd1bWVudCogbWF5CmJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcuKAmXMgZGVmYXVsdCB2YWx1ZSBpcwpzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmcKcGFyYW1ldGVycyB1cCB1bnRpbCB0aGUg4oCcIioi4oCdIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSDigJQgdGhpcyBpcwphIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuCgoqKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuIHRoZQpmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcwpldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUg4oCccHJlLQpjb21wdXRlZOKAnSB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50CnRvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2gKYXMgYSBsaXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4KYnkgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIGlzIGluCmVmZmVjdCBtb2RpZmllZC4gIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5CmFyb3VuZCB0aGlzIGlzIHRvIHVzZSAiTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yCml0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjoKCiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKToKICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZToKICAgICAgICAgICBwZW5ndWluID0gW10KICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIikKICAgICAgIHJldHVybiBwZW5ndWluCgpGdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb24gQ2FsbHMuCkEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnMgbWVudGlvbmVkIGluCnRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb25hbCBhcmd1bWVudHMsIGZyb20ga2V5d29yZAphcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybSDigJwiKmlkZW50aWZpZXIi4oCdIGlzCnByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueSBleGNlc3MgcG9zaXRpb25hbApwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gSWYgdGhlIGZvcm0K4oCcIioqaWRlbnRpZmllciLigJ0gaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcgb3JkZXJlZAptYXBwaW5nIHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3CmVtcHR5IG1hcHBpbmcgb2YgdGhlIHNhbWUgdHlwZS4gIFBhcmFtZXRlcnMgYWZ0ZXIg4oCcIioi4oCdIG9yCuKAnCIqaWRlbnRpZmllciLigJ0gYXJlIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgYnkKa2V5d29yZCBhcmd1bWVudHMuICBQYXJhbWV0ZXJzIGJlZm9yZSDigJwiLyLigJ0gYXJlIHBvc2l0aW9uYWwtb25seQpwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgYnkgcG9zaXRpb25hbCBhcmd1bWVudHMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy44OiBUaGUgIi8iIGZ1bmN0aW9uIHBhcmFtZXRlciBzeW50YXggbWF5IGJlIHVzZWQKdG8gaW5kaWNhdGUgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMuIFNlZSAqKlBFUCA1NzAqKiBmb3IgZGV0YWlscy4KClBhcmFtZXRlcnMgbWF5IGhhdmUgYW4gKmFubm90YXRpb24qIG9mIHRoZSBmb3JtIOKAnCI6IGV4cHJlc3Npb24i4oCdCmZvbGxvd2luZyB0aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24sCmV2ZW4gdGhvc2Ugb2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gKEFzIGEgc3BlY2lhbApjYXNlLCBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiDigJwiOgoqZXhwcmVzc2lvbiLigJ0uKSBGdW5jdGlvbnMgbWF5IGhhdmUg4oCccmV0dXJu4oCdIGFubm90YXRpb24gb2YgdGhlIGZvcm0K4oCcIi0+IGV4cHJlc3Npb24i4oCdIGFmdGVyIHRoZSBwYXJhbWV0ZXIgbGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZQphbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24uICBUaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QKY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYSBmdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUKYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnPigJkgbmFtZXMgaW4KdGhlICJfX2Fubm90YXRpb25zX18iIGF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgSWYgdGhlCiJhbm5vdGF0aW9ucyIgaW1wb3J0IGZyb20gIl9fZnV0dXJlX18iIGlzIHVzZWQsIGFubm90YXRpb25zIGFyZQpwcmVzZXJ2ZWQgYXMgc3RyaW5ncyBhdCBydW50aW1lIHdoaWNoIGVuYWJsZXMgcG9zdHBvbmVkIGV2YWx1YXRpb24uCk90aGVyd2lzZSwgdGhleSBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMKZXhlY3V0ZWQuICBJbiB0aGlzIGNhc2UgYW5ub3RhdGlvbnMgbWF5IGJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudApvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjExOiBQYXJhbWV0ZXJzIG9mIHRoZSBmb3JtIOKAnCIqaWRlbnRpZmllciLigJ0gbWF5CmhhdmUgYW4gYW5ub3RhdGlvbiDigJwiOiAqZXhwcmVzc2lvbiLigJ0uIFNlZSAqKlBFUCA2NDYqKi4KCkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmQKdG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhCmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiBMYW1iZGFzLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEKZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uOwphIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSDigJwiZGVmIuKAnSBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IKYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGEKZXhwcmVzc2lvbi4gIFRoZSDigJwiZGVmIuKAnSBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQKYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuCgoqKlByb2dyYW1tZXLigJlzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSDigJwiZGVmIuKAnQpzdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWwKZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQKaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uCmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IgZGV0YWlscy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9ucwogICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy4KCiAgKipQRVAgNDg0KiogLSBUeXBlIEhpbnRzCiAgICAgRGVmaW5pdGlvbiBvZiBhIHN0YW5kYXJkIG1lYW5pbmcgZm9yIGFubm90YXRpb25zOiB0eXBlIGhpbnRzLgoKICAqKlBFUCA1MjYqKiAtIFN5bnRheCBmb3IgVmFyaWFibGUgQW5ub3RhdGlvbnMKICAgICBBYmlsaXR5IHRvIHR5cGUgaGludCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMsIGluY2x1ZGluZyBjbGFzcwogICAgIHZhcmlhYmxlcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzLgoKICAqKlBFUCA1NjMqKiAtIFBvc3Rwb25lZCBFdmFsdWF0aW9uIG9mIEFubm90YXRpb25zCiAgICAgU3VwcG9ydCBmb3IgZm9yd2FyZCByZWZlcmVuY2VzIHdpdGhpbiBhbm5vdGF0aW9ucyBieSBwcmVzZXJ2aW5nCiAgICAgYW5ub3RhdGlvbnMgaW4gYSBzdHJpbmcgZm9ybSBhdCBydW50aW1lIGluc3RlYWQgb2YgZWFnZXIKICAgICBldmFsdWF0aW9uLgoKICAqKlBFUCAzMTgqKiAtIERlY29yYXRvcnMgZm9yIEZ1bmN0aW9ucyBhbmQgTWV0aG9kcwogICAgIEZ1bmN0aW9uIGFuZCBtZXRob2QgZGVjb3JhdG9ycyB3ZXJlIGludHJvZHVjZWQuIENsYXNzIGRlY29yYXRvcnMKICAgICB3ZXJlIGludHJvZHVjZWQgaW4gKipQRVAgMzEyOSoqLgoKCkNsYXNzIGRlZmluaXRpb25zCj09PT09PT09PT09PT09PT09CgpBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkCnR5cGUgaGllcmFyY2h5KToKCiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW3R5cGVfcGFyYW1zXSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZQogICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSIKICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXIKCkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0CnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIE1ldGFjbGFzc2VzIGZvciBtb3JlCmFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3MKb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZSBsaXN0CmluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLAoKICAgY2xhc3MgRm9vOgogICAgICAgcGFzcwoKaXMgZXF1aXZhbGVudCB0bwoKICAgY2xhc3MgRm9vKG9iamVjdCk6CiAgICAgICBwYXNzCgpUaGUgY2xhc3PigJlzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWUKTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlCm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5CmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNz4oCZcyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0cwpleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNV0gQQpjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZQpjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuClRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbApuYW1lc3BhY2UuCgpUaGUgb3JkZXIgaW4gd2hpY2ggYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiB0aGUgY2xhc3MgYm9keSBpcwpwcmVzZXJ2ZWQgaW4gdGhlIG5ldyBjbGFzc+KAmXMgIl9fZGljdF9fIi4gIE5vdGUgdGhhdCB0aGlzIGlzIHJlbGlhYmxlCm9ubHkgcmlnaHQgYWZ0ZXIgdGhlIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIG9ubHkgZm9yIGNsYXNzZXMgdGhhdCB3ZXJlCmRlZmluZWQgdXNpbmcgdGhlIGRlZmluaXRpb24gc3ludGF4LgoKQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyBtZXRhY2xhc3Nlcy4KCkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucywKCiAgIEBmMShhcmcpCiAgIEBmMgogICBjbGFzcyBGb286IHBhc3MKCmlzIHJvdWdobHkgZXF1aXZhbGVudCB0bwoKICAgY2xhc3MgRm9vOiBwYXNzCiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSkKClRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IKZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjk6IENsYXNzZXMgbWF5IGJlIGRlY29yYXRlZCB3aXRoIGFueSB2YWxpZAoiYXNzaWdubWVudF9leHByZXNzaW9uIi4gUHJldmlvdXNseSwgdGhlIGdyYW1tYXIgd2FzIG11Y2ggbW9yZQpyZXN0cmljdGl2ZTsgc2VlICoqUEVQIDYxNCoqIGZvciBkZXRhaWxzLgoKQSBsaXN0IG9mIHR5cGUgcGFyYW1ldGVycyBtYXkgYmUgZ2l2ZW4gaW4gc3F1YXJlIGJyYWNrZXRzIGltbWVkaWF0ZWx5CmFmdGVyIHRoZSBjbGFzc+KAmXMgbmFtZS4gVGhpcyBpbmRpY2F0ZXMgdG8gc3RhdGljIHR5cGUgY2hlY2tlcnMgdGhhdAp0aGUgY2xhc3MgaXMgZ2VuZXJpYy4gQXQgcnVudGltZSwgdGhlIHR5cGUgcGFyYW1ldGVycyBjYW4gYmUgcmV0cmlldmVkCmZyb20gdGhlIGNsYXNz4oCZcyAiX190eXBlX3BhcmFtc19fIiBhdHRyaWJ1dGUuIFNlZSBHZW5lcmljIGNsYXNzZXMgZm9yCm1vcmUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMjogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgYXJlIG5ldyBpbiBQeXRob24gMy4xMi4KCioqUHJvZ3JhbW1lcuKAmXMgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmUKY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXMKY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZAppbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uIOKAnCJzZWxmLm5hbWUi4oCdLAphbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZQp3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0cwpmb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvCnVuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZQp2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGNoYW5nZWQgdGhlIGRlY2xhcmF0aW9uIG9mIG1ldGFjbGFzc2VzIHRvIHRoZQogICAgIGN1cnJlbnQgc3ludGF4LCBhbmQgdGhlIHNlbWFudGljcyBmb3IgaG93IGNsYXNzZXMgd2l0aAogICAgIG1ldGFjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZC4KCiAgKipQRVAgMzEyOSoqIC0gQ2xhc3MgRGVjb3JhdG9ycwogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGFkZGVkIGNsYXNzIGRlY29yYXRvcnMuICBGdW5jdGlvbiBhbmQgbWV0aG9kCiAgICAgZGVjb3JhdG9ycyB3ZXJlIGludHJvZHVjZWQgaW4gKipQRVAgMzE4KiouCgoKQ29yb3V0aW5lcwo9PT09PT09PT09CgpBZGRlZCBpbiB2ZXJzaW9uIDMuNS4KCgpDb3JvdXRpbmUgZnVuY3Rpb24gZGVmaW5pdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgYXN5bmNfZnVuY2RlZiA6Oj0gW2RlY29yYXRvcnNdICJhc3luYyIgImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiCiAgICAgICAgICAgICAgICAgICAgIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZQoKRXhlY3V0aW9uIG9mIFB5dGhvbiBjb3JvdXRpbmVzIGNhbiBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQgYXQgbWFueQpwb2ludHMgKHNlZSAqY29yb3V0aW5lKikuICJhd2FpdCIgZXhwcmVzc2lvbnMsICJhc3luYyBmb3IiIGFuZCAiYXN5bmMKd2l0aCIgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgYm9keSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbi4KCkZ1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lCmZ1bmN0aW9ucywgZXZlbiBpZiB0aGV5IGRvIG5vdCBjb250YWluICJhd2FpdCIgb3IgImFzeW5jIiBrZXl3b3Jkcy4KCkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgYSAieWllbGQgZnJvbSIgZXhwcmVzc2lvbiBpbnNpZGUgdGhlIGJvZHkKb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpBbiBleGFtcGxlIG9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uOgoKICAgYXN5bmMgZGVmIGZ1bmMocGFyYW0xLCBwYXJhbTIpOgogICAgICAgZG9fc3R1ZmYoKQogICAgICAgYXdhaXQgc29tZV9jb3JvdXRpbmUoKQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogImF3YWl0IiBhbmQgImFzeW5jIiBhcmUgbm93IGtleXdvcmRzOwpwcmV2aW91c2x5IHRoZXkgd2VyZSBvbmx5IHRyZWF0ZWQgYXMgc3VjaCBpbnNpZGUgdGhlIGJvZHkgb2YgYQpjb3JvdXRpbmUgZnVuY3Rpb24uCgoKVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdAoKQW4gKmFzeW5jaHJvbm91cyBpdGVyYWJsZSogcHJvdmlkZXMgYW4gIl9fYWl0ZXJfXyIgbWV0aG9kIHRoYXQKZGlyZWN0bHkgcmV0dXJucyBhbiAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiwgd2hpY2ggY2FuIGNhbGwKYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICJfX2FuZXh0X18iIG1ldGhvZC4KClRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXIKYXN5bmNocm9ub3VzIGl0ZXJhYmxlcy4KClRoZSBmb2xsb3dpbmcgY29kZToKCiAgIGFzeW5jIGZvciBUQVJHRVQgaW4gSVRFUjoKICAgICAgIFNVSVRFCiAgIGVsc2U6CiAgICAgICBTVUlURTIKCklzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgaXRlciA9IChJVEVSKS5fX2FpdGVyX18oKQogICBydW5uaW5nID0gVHJ1ZQoKICAgd2hpbGUgcnVubmluZzoKICAgICAgIHRyeToKICAgICAgICAgICBUQVJHRVQgPSBhd2FpdCBpdGVyLl9fYW5leHRfXygpCiAgICAgICBleGNlcHQgU3RvcEFzeW5jSXRlcmF0aW9uOgogICAgICAgICAgIHJ1bm5pbmcgPSBGYWxzZQogICAgICAgZWxzZToKICAgICAgICAgICBTVUlURQogICBlbHNlOgogICAgICAgU1VJVEUyCgpleGNlcHQgdGhhdCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgaXMgdXNlZCBmb3IgIl9fYWl0ZXJfXygpIgphbmQgIl9fYW5leHRfXygpIi4KCkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgYW4gImFzeW5jIGZvciIgc3RhdGVtZW50IG91dHNpZGUgdGhlIGJvZHkKb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgoKVGhlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIGFzeW5jX3dpdGhfc3RtdCA6Oj0gImFzeW5jIiB3aXRoX3N0bXQKCkFuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgYWJsZQp0byBzdXNwZW5kIGV4ZWN1dGlvbiBpbiBpdHMgKmVudGVyKiBhbmQgKmV4aXQqIG1ldGhvZHMuCgpUaGUgZm9sbG93aW5nIGNvZGU6CgogICBhc3luYyB3aXRoIEVYUFJFU1NJT04gYXMgVEFSR0VUOgogICAgICAgU1VJVEUKCmlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgbWFuYWdlciA9IChFWFBSRVNTSU9OKQogICBhZW50ZXIgPSBtYW5hZ2VyLl9fYWVudGVyX18KICAgYWV4aXQgPSBtYW5hZ2VyLl9fYWV4aXRfXwogICB2YWx1ZSA9IGF3YWl0IGFlbnRlcigpCiAgIGhpdF9leGNlcHQgPSBGYWxzZQoKICAgdHJ5OgogICAgICAgVEFSR0VUID0gdmFsdWUKICAgICAgIFNVSVRFCiAgIGV4Y2VwdDoKICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCiAgICAgICBpZiBub3QgYXdhaXQgYWV4aXQoKnN5cy5leGNfaW5mbygpKToKICAgICAgICAgICByYWlzZQogICBmaW5hbGx5OgogICAgICAgaWYgbm90IGhpdF9leGNlcHQ6CiAgICAgICAgICAgYXdhaXQgYWV4aXQoTm9uZSwgTm9uZSwgTm9uZSkKCmV4Y2VwdCB0aGF0IGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBpcyB1c2VkIGZvciAiX19hZW50ZXJfXygpIgphbmQgIl9fYWV4aXRfXygpIi4KCkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgYW4gImFzeW5jIHdpdGgiIHN0YXRlbWVudCBvdXRzaWRlIHRoZQpib2R5IG9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uLgoKU2VlIGFsc286CgogICoqUEVQIDQ5MioqIC0gQ29yb3V0aW5lcyB3aXRoIGFzeW5jIGFuZCBhd2FpdCBzeW50YXgKICAgICBUaGUgcHJvcG9zYWwgdGhhdCBtYWRlIGNvcm91dGluZXMgYSBwcm9wZXIgc3RhbmRhbG9uZSBjb25jZXB0IGluCiAgICAgUHl0aG9uLCBhbmQgYWRkZWQgc3VwcG9ydGluZyBzeW50YXguCgoKVHlwZSBwYXJhbWV0ZXIgbGlzdHMKPT09PT09PT09PT09PT09PT09PT0KCkFkZGVkIGluIHZlcnNpb24gMy4xMi4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjEzOiBTdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcyB3YXMgYWRkZWQgKHNlZQoqKlBFUCA2OTYqKikuCgogICB0eXBlX3BhcmFtcyAgOjo9ICJbIiB0eXBlX3BhcmFtICgiLCIgdHlwZV9wYXJhbSkqICJdIgogICB0eXBlX3BhcmFtICAgOjo9IHR5cGV2YXIgfCB0eXBldmFydHVwbGUgfCBwYXJhbXNwZWMKICAgdHlwZXZhciAgICAgIDo6PSBpZGVudGlmaWVyICgiOiIgZXhwcmVzc2lvbik/ICgiPSIgZXhwcmVzc2lvbik/CiAgIHR5cGV2YXJ0dXBsZSA6Oj0gIioiIGlkZW50aWZpZXIgKCI9IiBleHByZXNzaW9uKT8KICAgcGFyYW1zcGVjICAgIDo6PSAiKioiIGlkZW50aWZpZXIgKCI9IiBleHByZXNzaW9uKT8KCkZ1bmN0aW9ucyAoaW5jbHVkaW5nIGNvcm91dGluZXMpLCBjbGFzc2VzIGFuZCB0eXBlIGFsaWFzZXMgbWF5IGNvbnRhaW4KYSB0eXBlIHBhcmFtZXRlciBsaXN0OgoKICAgZGVmIG1heFtUXShhcmdzOiBsaXN0W1RdKSAtPiBUOgogICAgICAgLi4uCgogICBhc3luYyBkZWYgYW1heFtUXShhcmdzOiBsaXN0W1RdKSAtPiBUOgogICAgICAgLi4uCgogICBjbGFzcyBCYWdbVF06CiAgICAgICBkZWYgX19pdGVyX18oc2VsZikgLT4gSXRlcmF0b3JbVF06CiAgICAgICAgICAgLi4uCgogICAgICAgZGVmIGFkZChzZWxmLCBhcmc6IFQpIC0+IE5vbmU6CiAgICAgICAgICAgLi4uCgogICB0eXBlIExpc3RPclNldFtUXSA9IGxpc3RbVF0gfCBzZXRbVF0KClNlbWFudGljYWxseSwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgZnVuY3Rpb24sIGNsYXNzLCBvciB0eXBlIGFsaWFzCmlzIGdlbmVyaWMgb3ZlciBhIHR5cGUgdmFyaWFibGUuIFRoaXMgaW5mb3JtYXRpb24gaXMgcHJpbWFyaWx5IHVzZWQgYnkKc3RhdGljIHR5cGUgY2hlY2tlcnMsIGFuZCBhdCBydW50aW1lLCBnZW5lcmljIG9iamVjdHMgYmVoYXZlIG11Y2ggbGlrZQp0aGVpciBub24tZ2VuZXJpYyBjb3VudGVycGFydHMuCgpUeXBlIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkIGluIHNxdWFyZSBicmFja2V0cyAoIltdIikgaW1tZWRpYXRlbHkKYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCBjbGFzcywgb3IgdHlwZSBhbGlhcy4gVGhlIHR5cGUKcGFyYW1ldGVycyBhcmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBnZW5lcmljIG9iamVjdCwgYnV0Cm5vdCBlbHNld2hlcmUuIFRodXMsIGFmdGVyIGEgZGVjbGFyYXRpb24gImRlZiBmdW5jW1RdKCk6IHBhc3MiLCB0aGUKbmFtZSAiVCIgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbW9kdWxlIHNjb3BlLiBCZWxvdywgdGhlIHNlbWFudGljcyBvZgpnZW5lcmljIG9iamVjdHMgYXJlIGRlc2NyaWJlZCB3aXRoIG1vcmUgcHJlY2lzaW9uLiBUaGUgc2NvcGUgb2YgdHlwZQpwYXJhbWV0ZXJzIGlzIG1vZGVsZWQgd2l0aCBhIHNwZWNpYWwgZnVuY3Rpb24gKHRlY2huaWNhbGx5LCBhbgphbm5vdGF0aW9uIHNjb3BlKSB0aGF0IHdyYXBzIHRoZSBjcmVhdGlvbiBvZiB0aGUgZ2VuZXJpYyBvYmplY3QuCgpHZW5lcmljIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIHR5cGUgYWxpYXNlcyBoYXZlIGEgIl9fdHlwZV9wYXJhbXNfXyIKYXR0cmlidXRlIGxpc3RpbmcgdGhlaXIgdHlwZSBwYXJhbWV0ZXJzLgoKVHlwZSBwYXJhbWV0ZXJzIGNvbWUgaW4gdGhyZWUga2luZHM6CgoqICJ0eXBpbmcuVHlwZVZhciIsIGludHJvZHVjZWQgYnkgYSBwbGFpbiBuYW1lIChlLmcuLCAiVCIpLgogIFNlbWFudGljYWxseSwgdGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIHR5cGUgdG8gYSB0eXBlIGNoZWNrZXIuCgoqICJ0eXBpbmcuVHlwZVZhclR1cGxlIiwgaW50cm9kdWNlZCBieSBhIG5hbWUgcHJlZml4ZWQgd2l0aCBhIHNpbmdsZQogIGFzdGVyaXNrIChlLmcuLCAiKlRzIikuIFNlbWFudGljYWxseSwgdGhpcyBzdGFuZHMgZm9yIGEgdHVwbGUgb2YgYW55CiAgbnVtYmVyIG9mIHR5cGVzLgoKKiAidHlwaW5nLlBhcmFtU3BlYyIsIGludHJvZHVjZWQgYnkgYSBuYW1lIHByZWZpeGVkIHdpdGggdHdvIGFzdGVyaXNrcwogIChlLmcuLCAiKipQIikuIFNlbWFudGljYWxseSwgdGhpcyBzdGFuZHMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIGEKICBjYWxsYWJsZS4KCiJ0eXBpbmcuVHlwZVZhciIgZGVjbGFyYXRpb25zIGNhbiBkZWZpbmUgKmJvdW5kcyogYW5kICpjb25zdHJhaW50cyoKd2l0aCBhIGNvbG9uICgiOiIpIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24uIEEgc2luZ2xlIGV4cHJlc3Npb24KYWZ0ZXIgdGhlIGNvbG9uIGluZGljYXRlcyBhIGJvdW5kIChlLmcuICJUOiBpbnQiKS4gU2VtYW50aWNhbGx5LCB0aGlzCm1lYW5zIHRoYXQgdGhlICJ0eXBpbmcuVHlwZVZhciIgY2FuIG9ubHkgcmVwcmVzZW50IHR5cGVzIHRoYXQgYXJlIGEKc3VidHlwZSBvZiB0aGlzIGJvdW5kLiBBIHBhcmVudGhlc2l6ZWQgdHVwbGUgb2YgZXhwcmVzc2lvbnMgYWZ0ZXIgdGhlCmNvbG9uIGluZGljYXRlcyBhIHNldCBvZiBjb25zdHJhaW50cyAoZS5nLiAiVDogKHN0ciwgYnl0ZXMpIikuIEVhY2gKbWVtYmVyIG9mIHRoZSB0dXBsZSBzaG91bGQgYmUgYSB0eXBlIChhZ2FpbiwgdGhpcyBpcyBub3QgZW5mb3JjZWQgYXQKcnVudGltZSkuIENvbnN0cmFpbmVkIHR5cGUgdmFyaWFibGVzIGNhbiBvbmx5IHRha2Ugb24gb25lIG9mIHRoZSB0eXBlcwppbiB0aGUgbGlzdCBvZiBjb25zdHJhaW50cy4KCkZvciAidHlwaW5nLlR5cGVWYXIicyBkZWNsYXJlZCB1c2luZyB0aGUgdHlwZSBwYXJhbWV0ZXIgbGlzdCBzeW50YXgsCnRoZSBib3VuZCBhbmQgY29uc3RyYWludHMgYXJlIG5vdCBldmFsdWF0ZWQgd2hlbiB0aGUgZ2VuZXJpYyBvYmplY3QgaXMKY3JlYXRlZCwgYnV0IG9ubHkgd2hlbiB0aGUgdmFsdWUgaXMgZXhwbGljaXRseSBhY2Nlc3NlZCB0aHJvdWdoIHRoZQphdHRyaWJ1dGVzICJfX2JvdW5kX18iIGFuZCAiX19jb25zdHJhaW50c19fIi4gVG8gYWNjb21wbGlzaCB0aGlzLCB0aGUKYm91bmRzIG9yIGNvbnN0cmFpbnRzIGFyZSBldmFsdWF0ZWQgaW4gYSBzZXBhcmF0ZSBhbm5vdGF0aW9uIHNjb3BlLgoKInR5cGluZy5UeXBlVmFyVHVwbGUicyBhbmQgInR5cGluZy5QYXJhbVNwZWMicyBjYW5ub3QgaGF2ZSBib3VuZHMgb3IKY29uc3RyYWludHMuCgpBbGwgdGhyZWUgZmxhdm9ycyBvZiB0eXBlIHBhcmFtZXRlcnMgY2FuIGFsc28gaGF2ZSBhICpkZWZhdWx0IHZhbHVlKiwKd2hpY2ggaXMgdXNlZCB3aGVuIHRoZSB0eXBlIHBhcmFtZXRlciBpcyBub3QgZXhwbGljaXRseSBwcm92aWRlZC4gVGhpcwppcyBhZGRlZCBieSBhcHBlbmRpbmcgYSBzaW5nbGUgZXF1YWxzIHNpZ24gKCI9IikgZm9sbG93ZWQgYnkgYW4KZXhwcmVzc2lvbi4gTGlrZSB0aGUgYm91bmRzIGFuZCBjb25zdHJhaW50cyBvZiB0eXBlIHZhcmlhYmxlcywgdGhlCmRlZmF1bHQgdmFsdWUgaXMgbm90IGV2YWx1YXRlZCB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZCwgYnV0IG9ubHkKd2hlbiB0aGUgdHlwZSBwYXJhbWV0ZXLigJlzICJfX2RlZmF1bHRfXyIgYXR0cmlidXRlIGlzIGFjY2Vzc2VkLiBUbyB0aGlzCmVuZCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZXZhbHVhdGVkIGluIGEgc2VwYXJhdGUgYW5ub3RhdGlvbiBzY29wZS4gSWYKbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGEgdHlwZSBwYXJhbWV0ZXIsIHRoZSAiX19kZWZhdWx0X18iCmF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlIHNwZWNpYWwgc2VudGluZWwgb2JqZWN0ICJ0eXBpbmcuTm9EZWZhdWx0Ii4KClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbmRpY2F0ZXMgdGhlIGZ1bGwgc2V0IG9mIGFsbG93ZWQgdHlwZSBwYXJhbWV0ZXIKZGVjbGFyYXRpb25zOgoKICAgZGVmIG92ZXJseV9nZW5lcmljWwogICAgICBTaW1wbGVUeXBlVmFyLAogICAgICBUeXBlVmFyV2l0aERlZmF1bHQgPSBpbnQsCiAgICAgIFR5cGVWYXJXaXRoQm91bmQ6IGludCwKICAgICAgVHlwZVZhcldpdGhDb25zdHJhaW50czogKHN0ciwgYnl0ZXMpLAogICAgICAqU2ltcGxlVHlwZVZhclR1cGxlID0gKGludCwgZmxvYXQpLAogICAgICAqKlNpbXBsZVBhcmFtU3BlYyA9IChzdHIsIGJ5dGVhcnJheSksCiAgIF0oCiAgICAgIGE6IFNpbXBsZVR5cGVWYXIsCiAgICAgIGI6IFR5cGVWYXJXaXRoRGVmYXVsdCwKICAgICAgYzogVHlwZVZhcldpdGhCb3VuZCwKICAgICAgZDogQ2FsbGFibGVbU2ltcGxlUGFyYW1TcGVjLCBUeXBlVmFyV2l0aENvbnN0cmFpbnRzXSwKICAgICAgKmU6IFNpbXBsZVR5cGVWYXJUdXBsZSwKICAgKTogLi4uCgoKR2VuZXJpYyBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0KCkdlbmVyaWMgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBhcyBmb2xsb3dzOgoKICAgZGVmIGZ1bmNbVF0oYXJnOiBUKTogLi4uCgpUaGlzIHN5bnRheCBpcyBlcXVpdmFsZW50IHRvOgoKICAgYW5ub3RhdGlvbi1kZWYgVFlQRV9QQVJBTVNfT0ZfZnVuYygpOgogICAgICAgVCA9IHR5cGluZy5UeXBlVmFyKCJUIikKICAgICAgIGRlZiBmdW5jKGFyZzogVCk6IC4uLgogICAgICAgZnVuYy5fX3R5cGVfcGFyYW1zX18gPSAoVCwpCiAgICAgICByZXR1cm4gZnVuYwogICBmdW5jID0gVFlQRV9QQVJBTVNfT0ZfZnVuYygpCgpIZXJlICJhbm5vdGF0aW9uLWRlZiIgaW5kaWNhdGVzIGFuIGFubm90YXRpb24gc2NvcGUsIHdoaWNoIGlzIG5vdAphY3R1YWxseSBib3VuZCB0byBhbnkgbmFtZSBhdCBydW50aW1lLiAoT25lIG90aGVyIGxpYmVydHkgaXMgdGFrZW4gaW4KdGhlIHRyYW5zbGF0aW9uOiB0aGUgc3ludGF4IGRvZXMgbm90IGdvIHRocm91Z2ggYXR0cmlidXRlIGFjY2VzcyBvbgp0aGUgInR5cGluZyIgbW9kdWxlLCBidXQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiAidHlwaW5nLlR5cGVWYXIiCmRpcmVjdGx5LikKClRoZSBhbm5vdGF0aW9ucyBvZiBnZW5lcmljIGZ1bmN0aW9ucyBhcmUgZXZhbHVhdGVkIHdpdGhpbiB0aGUKYW5ub3RhdGlvbiBzY29wZSB1c2VkIGZvciBkZWNsYXJpbmcgdGhlIHR5cGUgcGFyYW1ldGVycywgYnV0IHRoZQpmdW5jdGlvbuKAmXMgZGVmYXVsdHMgYW5kIGRlY29yYXRvcnMgYXJlIG5vdC4KClRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgc2NvcGluZyBydWxlcyBmb3IgdGhlc2UgY2FzZXMsCmFzIHdlbGwgYXMgZm9yIGFkZGl0aW9uYWwgZmxhdm9ycyBvZiB0eXBlIHBhcmFtZXRlcnM6CgogICBAZGVjb3JhdG9yCiAgIGRlZiBmdW5jW1Q6IGludCwgKlRzLCAqKlBdKCphcmdzOiAqVHMsIGFyZzogQ2FsbGFibGVbUCwgVF0gPSBzb21lX2RlZmF1bHQpOgogICAgICAgLi4uCgpFeGNlcHQgZm9yIHRoZSBsYXp5IGV2YWx1YXRpb24gb2YgdGhlICJUeXBlVmFyIiBib3VuZCwgdGhpcyBpcwplcXVpdmFsZW50IHRvOgoKICAgREVGQVVMVF9PRl9hcmcgPSBzb21lX2RlZmF1bHQKCiAgIGFubm90YXRpb24tZGVmIFRZUEVfUEFSQU1TX09GX2Z1bmMoKToKCiAgICAgICBhbm5vdGF0aW9uLWRlZiBCT1VORF9PRl9UKCk6CiAgICAgICAgICAgcmV0dXJuIGludAogICAgICAgIyBJbiByZWFsaXR5LCBCT1VORF9PRl9UKCkgaXMgZXZhbHVhdGVkIG9ubHkgb24gZGVtYW5kLgogICAgICAgVCA9IHR5cGluZy5UeXBlVmFyKCJUIiwgYm91bmQ9Qk9VTkRfT0ZfVCgpKQoKICAgICAgIFRzID0gdHlwaW5nLlR5cGVWYXJUdXBsZSgiVHMiKQogICAgICAgUCA9IHR5cGluZy5QYXJhbVNwZWMoIlAiKQoKICAgICAgIGRlZiBmdW5jKCphcmdzOiAqVHMsIGFyZzogQ2FsbGFibGVbUCwgVF0gPSBERUZBVUxUX09GX2FyZyk6CiAgICAgICAgICAgLi4uCgogICAgICAgZnVuYy5fX3R5cGVfcGFyYW1zX18gPSAoVCwgVHMsIFApCiAgICAgICByZXR1cm4gZnVuYwogICBmdW5jID0gZGVjb3JhdG9yKFRZUEVfUEFSQU1TX09GX2Z1bmMoKSkKClRoZSBjYXBpdGFsaXplZCBuYW1lcyBsaWtlICJERUZBVUxUX09GX2FyZyIgYXJlIG5vdCBhY3R1YWxseSBib3VuZCBhdApydW50aW1lLgoKCkdlbmVyaWMgY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0KCkdlbmVyaWMgY2xhc3NlcyBhcmUgZGVjbGFyZWQgYXMgZm9sbG93czoKCiAgIGNsYXNzIEJhZ1tUXTogLi4uCgpUaGlzIHN5bnRheCBpcyBlcXVpdmFsZW50IHRvOgoKICAgYW5ub3RhdGlvbi1kZWYgVFlQRV9QQVJBTVNfT0ZfQmFnKCk6CiAgICAgICBUID0gdHlwaW5nLlR5cGVWYXIoIlQiKQogICAgICAgY2xhc3MgQmFnKHR5cGluZy5HZW5lcmljW1RdKToKICAgICAgICAgICBfX3R5cGVfcGFyYW1zX18gPSAoVCwpCiAgICAgICAgICAgLi4uCiAgICAgICByZXR1cm4gQmFnCiAgIEJhZyA9IFRZUEVfUEFSQU1TX09GX0JhZygpCgpIZXJlIGFnYWluICJhbm5vdGF0aW9uLWRlZiIgKG5vdCBhIHJlYWwga2V5d29yZCkgaW5kaWNhdGVzIGFuCmFubm90YXRpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSAiVFlQRV9QQVJBTVNfT0ZfQmFnIiBpcyBub3QgYWN0dWFsbHkKYm91bmQgYXQgcnVudGltZS4KCkdlbmVyaWMgY2xhc3NlcyBpbXBsaWNpdGx5IGluaGVyaXQgZnJvbSAidHlwaW5nLkdlbmVyaWMiLiBUaGUgYmFzZQpjbGFzc2VzIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBvZiBnZW5lcmljIGNsYXNzZXMgYXJlIGV2YWx1YXRlZCB3aXRoaW4KdGhlIHR5cGUgc2NvcGUgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMsIGFuZCBkZWNvcmF0b3JzIGFyZSBldmFsdWF0ZWQKb3V0c2lkZSB0aGF0IHNjb3BlLiBUaGlzIGlzIGlsbHVzdHJhdGVkIGJ5IHRoaXMgZXhhbXBsZToKCiAgIEBkZWNvcmF0b3IKICAgY2xhc3MgQmFnKEJhc2VbVF0sIGFyZz1UKTogLi4uCgpUaGlzIGlzIGVxdWl2YWxlbnQgdG86CgogICBhbm5vdGF0aW9uLWRlZiBUWVBFX1BBUkFNU19PRl9CYWcoKToKICAgICAgIFQgPSB0eXBpbmcuVHlwZVZhcigiVCIpCiAgICAgICBjbGFzcyBCYWcoQmFzZVtUXSwgdHlwaW5nLkdlbmVyaWNbVF0sIGFyZz1UKToKICAgICAgICAgICBfX3R5cGVfcGFyYW1zX18gPSAoVCwpCiAgICAgICAgICAgLi4uCiAgICAgICByZXR1cm4gQmFnCiAgIEJhZyA9IGRlY29yYXRvcihUWVBFX1BBUkFNU19PRl9CYWcoKSkKCgpHZW5lcmljIHR5cGUgYWxpYXNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlICJ0eXBlIiBzdGF0ZW1lbnQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBnZW5lcmljIHR5cGUgYWxpYXM6CgogICB0eXBlIExpc3RPclNldFtUXSA9IGxpc3RbVF0gfCBzZXRbVF0KCkV4Y2VwdCBmb3IgdGhlIGxhenkgZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWUsIHRoaXMgaXMgZXF1aXZhbGVudCB0bzoKCiAgIGFubm90YXRpb24tZGVmIFRZUEVfUEFSQU1TX09GX0xpc3RPclNldCgpOgogICAgICAgVCA9IHR5cGluZy5UeXBlVmFyKCJUIikKCiAgICAgICBhbm5vdGF0aW9uLWRlZiBWQUxVRV9PRl9MaXN0T3JTZXQoKToKICAgICAgICAgICByZXR1cm4gbGlzdFtUXSB8IHNldFtUXQogICAgICAgIyBJbiByZWFsaXR5LCB0aGUgdmFsdWUgaXMgbGF6aWx5IGV2YWx1YXRlZAogICAgICAgcmV0dXJuIHR5cGluZy5UeXBlQWxpYXNUeXBlKCJMaXN0T3JTZXQiLCBWQUxVRV9PRl9MaXN0T3JTZXQoKSwgdHlwZV9wYXJhbXM9KFQsKSkKICAgTGlzdE9yU2V0ID0gVFlQRV9QQVJBTVNfT0ZfTGlzdE9yU2V0KCkKCkhlcmUsICJhbm5vdGF0aW9uLWRlZiIgKG5vdCBhIHJlYWwga2V5d29yZCkgaW5kaWNhdGVzIGFuIGFubm90YXRpb24Kc2NvcGUuIFRoZSBjYXBpdGFsaXplZCBuYW1lcyBsaWtlICJUWVBFX1BBUkFNU19PRl9MaXN0T3JTZXQiIGFyZSBub3QKYWN0dWFsbHkgYm91bmQgYXQgcnVudGltZS4KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3MgdGhlcmUKICAgIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLgogICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LgoKWzJdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgc2VxdWVuY2UgaXMgZGVmaW5lZCBhcyBvbmUgb2YgdGhlCiAgICBmb2xsb3dpbmc6CgogICAgKiBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiCgogICAgKiBhIGJ1aWx0aW4gY2xhc3MgdGhhdCBoYXMgaXRzIChDUHl0aG9uKSAiUHlfVFBGTEFHU19TRVFVRU5DRSIgYml0CiAgICAgIHNldAoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gYW55IG9mIHRoZSBhYm92ZQoKICAgIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzIGFyZSBzZXF1ZW5jZXM6CgogICAgKiAiYXJyYXkuYXJyYXkiCgogICAgKiAiY29sbGVjdGlvbnMuZGVxdWUiCgogICAgKiAibGlzdCIKCiAgICAqICJtZW1vcnl2aWV3IgoKICAgICogInJhbmdlIgoKICAgICogInR1cGxlIgoKICAgIE5vdGU6CgogICAgICBTdWJqZWN0IHZhbHVlcyBvZiB0eXBlICJzdHIiLCAiYnl0ZXMiLCBhbmQgImJ5dGVhcnJheSIgZG8gbm90CiAgICAgIG1hdGNoIHNlcXVlbmNlIHBhdHRlcm5zLgoKWzNdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgbWFwcGluZyBpcyBkZWZpbmVkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gImNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuTWFwcGluZyIKCiAgICAqIGEgYnVpbHRpbiBjbGFzcyB0aGF0IGhhcyBpdHMgKENQeXRob24pICJQeV9UUEZMQUdTX01BUFBJTkciIGJpdAogICAgICBzZXQKCiAgICAqIGEgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIGFueSBvZiB0aGUgYWJvdmUKCiAgICBUaGUgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzICJkaWN0IiBhbmQgInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiCiAgICBhcmUgbWFwcGluZ3MuCgpbNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24KICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb27igJlzICJfX2RvY19fIiBhdHRyaWJ1dGUgYW5kCiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9u4oCZcyAqZG9jc3RyaW5nKi4KCls1XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzcwogICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2XigJlzICJfX2RvY19fIiBpdGVtIGFuZAogICAgdGhlcmVmb3JlIHRoZSBjbGFzc+KAmXMgKmRvY3N0cmluZyouCnoQY29udGV4dC1tYW5hZ2Vyc3XuBgAAV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2VycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpBICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0bwpiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXIKaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dApmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5Cmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uIFRoZSB3aXRoCnN0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuCgpUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXMKa2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZApmaWxlcywgZXRjLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgTWFuYWdlciBUeXBlcy4KVGhlICJvYmplY3QiIGNsYXNzIGl0c2VsZiBkb2VzIG5vdCBwcm92aWRlIHRoZSBjb250ZXh0IG1hbmFnZXIKbWV0aG9kcy4KCm9iamVjdC5fX2VudGVyX18oc2VsZikKCiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIgogICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9k4oCZcyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKQogICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KCm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spCgogICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMKICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZQogICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbAogICBiZSAiTm9uZSIuCgogICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGUKICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZAogICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWQKICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuCgogICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW4KICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXLigJlzIHJlc3BvbnNpYmlsaXR5LgoKU2VlIGFsc286CgogICoqUEVQIDM0MyoqIC0gVGhlIOKAnHdpdGjigJ0gc3RhdGVtZW50CiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCIKICAgICBzdGF0ZW1lbnQuCtoIY29udGludWVhwwEAAFRoZSAiY29udGludWUiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIGNvbnRpbnVlX3N0bXQgOjo9ICJjb250aW51ZSIKCiJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiCmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdApsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUgb2YgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AuCgpXaGVuICJjb250aW51ZSIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYQoiZmluYWxseSIgY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseQpzdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLgraC2NvbnZlcnNpb25zdaMCAABBcml0aG1ldGljIGNvbnZlcnNpb25zCioqKioqKioqKioqKioqKioqKioqKioKCldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZQrigJx0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBl4oCdLCB0aGlzIG1lYW5zCnRoYXQgdGhlIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBidWlsdC1pbiB0eXBlcyB3b3JrcyBhcyBmb2xsb3dzOgoKKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0bwogIGNvbXBsZXg7CgoqIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCB0aGUgb3RoZXIKICBpcyBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQ7CgoqIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4KClNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGFzIGEKbGVmdCBhcmd1bWVudCB0byB0aGUg4oCYJeKAmSBvcGVyYXRvcikuICBFeHRlbnNpb25zIG11c3QgZGVmaW5lIHRoZWlyIG93bgpjb252ZXJzaW9uIGJlaGF2aW9yLgraDWN1c3RvbWl6YXRpb251JzkAAEJhc2ljIGN1c3RvbWl6YXRpb24KKioqKioqKioqKioqKioqKioqKgoKb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSkKCiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhCiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaCkKICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHMKICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZQogICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm4KICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5IGFuCiAgIGluc3RhbmNlIG9mICpjbHMqKS4KCiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnkKICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3PigJlzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZwogICAic3VwZXIoKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBhbmQgdGhlbgogICBtb2RpZnlpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UgYXMgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcKICAgaXQuCgogICBJZiAiX19uZXdfXygpIiBpcyBpbnZva2VkIGR1cmluZyBvYmplY3QgY29uc3RydWN0aW9uIGFuZCBpdCByZXR1cm5zCiAgIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXcgaW5zdGFuY2XigJlzICJfX2luaXRfXygpIiBtZXRob2QKICAgd2lsbCBiZSBpbnZva2VkIGxpa2UgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUKICAgbmV3IGluc3RhbmNlIGFuZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZQogICBwYXNzZWQgdG8gdGhlIG9iamVjdCBjb25zdHJ1Y3Rvci4KCiAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3CiAgIGluc3RhbmNl4oCZcyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuCgogICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGUKICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdAogICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvCiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi4KCm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSkKCiAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgIl9fbmV3X18oKSIpLCBidXQKICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZQogICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuCiAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNz4oCZcyAiX19pbml0X18oKSIgbWV0aG9kLCBpZgogICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOgogICAic3VwZXIoKS5fX2luaXRfXyhbYXJncy4uLl0pIi4KCiAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluIGNvbnN0cnVjdGluZwogICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXplCiAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyBkb2luZyBzbwogICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuCgpvYmplY3QuX19kZWxfXyhzZWxmKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzbwogICBjYWxsZWQgYSBmaW5hbGl6ZXIgb3IgKGltcHJvcGVybHkpIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcwogICBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNz4oCZcyAiX19kZWxfXygpIiBtZXRob2QsCiAgIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUKICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZS4KCiAgIEl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yIHRoZSAiX19kZWxfXygpIiBtZXRob2QKICAgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5IGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZQogICB0byBpdC4gIFRoaXMgaXMgY2FsbGVkIG9iamVjdCAqcmVzdXJyZWN0aW9uKi4gIEl0IGlzCiAgIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCB3aGV0aGVyICJfX2RlbF9fKCkiIGlzIGNhbGxlZCBhIHNlY29uZAogICB0aW1lIHdoZW4gYSByZXN1cnJlY3RlZCBvYmplY3QgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkOyB0aGUKICAgY3VycmVudCAqQ1B5dGhvbiogaW1wbGVtZW50YXRpb24gb25seSBjYWxscyBpdCBvbmNlLgoKICAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yCiAgIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuIHRoZSBpbnRlcnByZXRlciBleGl0cy4KICAgIndlYWtyZWYuZmluYWxpemUiIHByb3ZpZGVzIGEgc3RyYWlnaHRmb3J3YXJkIHdheSB0byByZWdpc3RlciBhCiAgIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGdhcmJhZ2UgY29sbGVjdGVkLgoKICAgTm90ZToKCiAgICAgImRlbCB4IiBkb2VzbuKAmXQgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIOKAlCB0aGUgZm9ybWVyCiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlIGxhdHRlciBpcwogICAgIG9ubHkgY2FsbGVkIHdoZW4gIngi4oCZcyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLgoKICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJdCBpcyBwb3NzaWJsZSBmb3IgYSByZWZlcmVuY2UKICAgY3ljbGUgdG8gcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCBmcm9tIGdvaW5nIHRvCiAgIHplcm8uICBJbiB0aGlzIGNhc2UsIHRoZSBjeWNsZSB3aWxsIGJlIGxhdGVyIGRldGVjdGVkIGFuZCBkZWxldGVkCiAgIGJ5IHRoZSAqY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yKi4gIEEgY29tbW9uIGNhdXNlIG9mIHJlZmVyZW5jZQogICBjeWNsZXMgaXMgd2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gY2F1Z2h0IGluIGEgbG9jYWwgdmFyaWFibGUuCiAgIFRoZSBmcmFtZeKAmXMgbG9jYWxzIHRoZW4gcmVmZXJlbmNlIHRoZSBleGNlcHRpb24sIHdoaWNoIHJlZmVyZW5jZXMKICAgaXRzIG93biB0cmFjZWJhY2ssIHdoaWNoIHJlZmVyZW5jZXMgdGhlIGxvY2FscyBvZiBhbGwgZnJhbWVzIGNhdWdodAogICBpbiB0aGUgdHJhY2ViYWNrLgoKICAgU2VlIGFsc286IERvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZS4KCiAgIFdhcm5pbmc6CgogICAgIER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoICJfX2RlbF9fKCkiCiAgICAgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZyB0aGVpciBleGVjdXRpb24KICAgICBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkIHRvICJzeXMuc3RkZXJyIiBpbnN0ZWFkLgogICAgIEluIHBhcnRpY3VsYXI6CgogICAgICogIl9fZGVsX18oKSIgY2FuIGJlIGludm9rZWQgd2hlbiBhcmJpdHJhcnkgY29kZSBpcyBiZWluZwogICAgICAgZXhlY3V0ZWQsIGluY2x1ZGluZyBmcm9tIGFueSBhcmJpdHJhcnkgdGhyZWFkLiAgSWYgIl9fZGVsX18oKSIKICAgICAgIG5lZWRzIHRvIHRha2UgYSBsb2NrIG9yIGludm9rZSBhbnkgb3RoZXIgYmxvY2tpbmcgcmVzb3VyY2UsIGl0CiAgICAgICBtYXkgZGVhZGxvY2sgYXMgdGhlIHJlc291cmNlIG1heSBhbHJlYWR5IGJlIHRha2VuIGJ5IHRoZSBjb2RlCiAgICAgICB0aGF0IGdldHMgaW50ZXJydXB0ZWQgdG8gZXhlY3V0ZSAiX19kZWxfXygpIi4KCiAgICAgKiAiX19kZWxfXygpIiBjYW4gYmUgZXhlY3V0ZWQgZHVyaW5nIGludGVycHJldGVyIHNodXRkb3duLiAgQXMgYQogICAgICAgY29uc2VxdWVuY2UsIHRoZSBnbG9iYWwgdmFyaWFibGVzIGl0IG5lZWRzIHRvIGFjY2VzcyAoaW5jbHVkaW5nCiAgICAgICBvdGhlciBtb2R1bGVzKSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBzZXQgdG8gIk5vbmUiLgogICAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGUKICAgICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyIGdsb2JhbHMKICAgICAgIGFyZSBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcwogICAgICAgbWF5IGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUKICAgICAgIGF0IHRoZSB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuCgpvYmplY3QuX19yZXByX18oc2VsZikKCiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUg4oCcb2ZmaWNpYWzigJ0KICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcwogICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvCiAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZQogICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0KICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gVGhlIHJldHVybgogICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICJfX3JlcHJfXygpIiBidXQKICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiDigJxpbmZvcm1hbOKAnQogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuCgogICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZQogICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy4gQSBkZWZhdWx0CiAgIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZSAib2JqZWN0IiBjbGFzcyBpdHNlbGYuCgpvYmplY3QuX19zdHJfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIsIHRoZSBkZWZhdWx0ICJfX2Zvcm1hdF9fKCkiIGltcGxlbWVudGF0aW9uLAogICBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJwcmludCgpIiwgdG8gY29tcHV0ZSB0aGUg4oCcaW5mb3JtYWzigJ0gb3IKICAgbmljZWx5IHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybgogICB2YWx1ZSBtdXN0IGJlIGEgc3RyIG9iamVjdC4KCiAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgdGhlcmUgaXMgbm8KICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYQogICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC4KCiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgIm9iamVjdCIKICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi4KCm9iamVjdC5fX2J5dGVzX18oc2VsZikKCiAgIENhbGxlZCBieSBieXRlcyB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4KICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC4gVGhlICJvYmplY3QiIGNsYXNzCiAgIGl0c2VsZiBkb2VzIG5vdCBwcm92aWRlIHRoaXMgbWV0aG9kLgoKb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpCgogICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBieSBleHRlbnNpb24sCiAgIGV2YWx1YXRpb24gb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlICJzdHIuZm9ybWF0KCkiCiAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhIOKAnGZvcm1hdHRlZOKAnSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4KICAgb2JqZWN0LiBUaGUgKmZvcm1hdF9zcGVjKiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEKICAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24KICAgb2YgdGhlICpmb3JtYXRfc3BlYyogYXJndW1lbnQgaXMgdXAgdG8gdGhlIHR5cGUgaW1wbGVtZW50aW5nCiAgICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsIGVpdGhlciBkZWxlZ2F0ZQogICBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhIHNpbWlsYXIKICAgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LgoKICAgU2VlIEZvcm1hdCBzcGVjaWZpY2F0aW9uIG1pbmktbGFuZ3VhZ2UgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCiAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LgoKICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4KCiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGJ5IHRoZSAib2JqZWN0IiBjbGFzcyBzaG91bGQgYmUgZ2l2ZW4gYW4KICAgZW1wdHkgKmZvcm1hdF9zcGVjKiBzdHJpbmcuIEl0IGRlbGVnYXRlcyB0byAiX19zdHJfXygpIi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGYKICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogIm9iamVjdC5fX2Zvcm1hdF9fKHgsICcnKSIgaXMgbm93CiAgIGVxdWl2YWxlbnQgdG8gInN0cih4KSIgcmF0aGVyIHRoYW4gImZvcm1hdChzdHIoeCksICcnKSIuCgpvYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQg4oCccmljaCBjb21wYXJpc29u4oCdIG1ldGhvZHMuIFRoZQogICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhcwogICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIiwKICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAieD55IiBjYWxscwogICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuCgogICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICJOb3RJbXBsZW1lbnRlZCIKICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciBvZgogICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGEKICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYW55IHZhbHVlLAogICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLAogICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIgogICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciBmYWxzZS4KCiAgIEJ5IGRlZmF1bHQsICJvYmplY3QiIGltcGxlbWVudHMgIl9fZXFfXygpIiBieSB1c2luZyAiaXMiLCByZXR1cm5pbmcKICAgIk5vdEltcGxlbWVudGVkIiBpbiB0aGUgY2FzZSBvZiBhIGZhbHNlIGNvbXBhcmlzb246ICJUcnVlIGlmIHggaXMgeQogICBlbHNlIE5vdEltcGxlbWVudGVkIi4gRm9yICJfX25lX18oKSIsIGJ5IGRlZmF1bHQgaXQgZGVsZWdhdGVzIHRvCiAgICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4KICAgVGhlcmUgYXJlIG5vIG90aGVyIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbgogICBvcGVyYXRvcnMgb3IgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnM7IGZvciBleGFtcGxlLCB0aGUgdHJ1dGggb2YKICAgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZQogICBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCBvcGVyYXRpb24sIHNlZQogICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLgoKICAgQnkgZGVmYXVsdCwgdGhlICJvYmplY3QiIGNsYXNzIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBjb25zaXN0ZW50CiAgIHdpdGggVmFsdWUgY29tcGFyaXNvbnM6IGVxdWFsaXR5IGNvbXBhcmVzIGFjY29yZGluZyB0byBvYmplY3QKICAgaWRlbnRpdHksIGFuZCBvcmRlciBjb21wYXJpc29ucyByYWlzZSAiVHlwZUVycm9yIi4gRWFjaCBkZWZhdWx0CiAgIG1ldGhvZCBtYXkgZ2VuZXJhdGUgdGhlc2UgcmVzdWx0cyBkaXJlY3RseSwgYnV0IG1heSBhbHNvIHJldHVybgogICAiTm90SW1wbGVtZW50ZWQiLgoKICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvbgogICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvbgogICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KCiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWQKICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodAogICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSBlYWNoIG90aGVy4oCZcwogICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVy4oCZcyByZWZsZWN0aW9uLAogICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uIElmIHRoZQogICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmTigJlzIHR5cGUgaXMgYQogICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZOKAmXMgdHlwZSwgdGhlCiAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCBvdGhlcndpc2UgdGhlCiAgIGxlZnQgb3BlcmFuZOKAmXMgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgaXMgbm90CiAgIGNvbnNpZGVyZWQuCgogICBXaGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCByZXR1cm5zIGFueSB2YWx1ZSBvdGhlciB0aGFuCiAgICJOb3RJbXBsZW1lbnRlZCIsIHRoZSAiPT0iIGFuZCAiIT0iIG9wZXJhdG9ycyB3aWxsIGZhbGwgYmFjayB0bwogICAiaXMiIGFuZCAiaXMgbm90IiwgcmVzcGVjdGl2ZWx5LgoKb2JqZWN0Ll9faGFzaF9fKHNlbGYpCgogICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnMKICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAiZGljdCIuCiAgIFRoZSAiX19oYXNoX18oKSIgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gVGhlIG9ubHkgcmVxdWlyZWQKICAgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoCiAgIHZhbHVlOyBpdCBpcyBhZHZpc2VkIHRvIG1peCB0b2dldGhlciB0aGUgaGFzaCB2YWx1ZXMgb2YgdGhlCiAgIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZgogICBvYmplY3RzIGJ5IHBhY2tpbmcgdGhlbSBpbnRvIGEgdHVwbGUgYW5kIGhhc2hpbmcgdGhlIHR1cGxlLgogICBFeGFtcGxlOgoKICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYubmFtZSwgc2VsZi5uaWNrLCBzZWxmLmNvbG9yKSkKCiAgIE5vdGU6CgogICAgICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBvYmplY3TigJlzIGN1c3RvbQogICAgICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAiUHlfc3NpemVfdCIuICBUaGlzIGlzCiAgICAgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXQgYnVpbGRzLgogICAgIElmIGFuIG9iamVjdOKAmXMgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzIG9mCiAgICAgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gYWxsIHN1cHBvcnRlZAogICAgIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAicHl0aG9uIC1jICJpbXBvcnQgc3lzOwogICAgIHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuCgogICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgbm90CiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSIKICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluCiAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQKICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQKICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgKmhhc2hhYmxlKiBjb2xsZWN0aW9ucwogICByZXF1aXJlcyB0aGF0IGEga2V54oCZcyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdOKAmXMgaGFzaAogICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuCgogICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5CiAgIGRlZmF1bHQgKGluaGVyaXRlZCBmcm9tIHRoZSAib2JqZWN0IiBjbGFzcyk7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMKICAgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aCB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucwogICBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIKICAgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLgoKICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiCiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlCiAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MKICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0bwogICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzCiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosCiAgIGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSkiLgoKICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGUKICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlcgogICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID0KICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuCgogICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gc3VwcHJlc3MKICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3MKICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXQKICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGFzCiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKSIgY2FsbC4KCiAgIE5vdGU6CgogICAgIEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciBhbmQgYnl0ZXMgb2JqZWN0cyBhcmUKICAgICDigJxzYWx0ZWTigJ0gd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS4gIEFsdGhvdWdoIHRoZXkKICAgICByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uIHByb2Nlc3MsIHRoZXkgYXJlIG5vdAogICAgIHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2YgUHl0aG9uLlRoaXMgaXMKICAgICBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1vZi1zZXJ2aWNlIGNhdXNlZAogICAgIGJ5IGNhcmVmdWxseSBjaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGUgd29yc3QgY2FzZQogICAgIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sICpPKigqbipeMikgY29tcGxleGl0eS4gIFNlZQogICAgIGh0dHBzOi8vb2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3IKICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZiBzZXRzLgogICAgIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSBndWFyYW50ZWVzIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdAogICAgIHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvCiAgICAgIlBZVEhPTkhBU0hTRUVEIi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCgpvYmplY3QuX19ib29sX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvbgogICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90CiAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXMKICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lcwogICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIgKHdoaWNoIGlzIHRydWUgb2YgdGhlICJvYmplY3QiCiAgIGNsYXNzIGl0c2VsZiksIGFsbCBpdHMgaW5zdGFuY2VzIGFyZSBjb25zaWRlcmVkIHRydWUuCtoIZGVidWdnZXJ10F0AACJwZGIiIOKAlCBUaGUgUHl0aG9uIERlYnVnZ2VyCioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKKipTb3VyY2UgY29kZToqKiBMaWIvcGRiLnB5Cgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgbW9kdWxlICJwZGIiIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yClB5dGhvbiBwcm9ncmFtcy4gIEl0IHN1cHBvcnRzIHNldHRpbmcgKGNvbmRpdGlvbmFsKSBicmVha3BvaW50cyBhbmQKc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayBmcmFtZXMsCnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGUKY29udGV4dCBvZiBhbnkgc3RhY2sgZnJhbWUuICBJdCBhbHNvIHN1cHBvcnRzIHBvc3QtbW9ydGVtIGRlYnVnZ2luZwphbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuCgpUaGUgZGVidWdnZXIgaXMgZXh0ZW5zaWJsZSDigJMgaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgY2xhc3MKIlBkYiIuIFRoaXMgaXMgY3VycmVudGx5IHVuZG9jdW1lbnRlZCBidXQgZWFzaWx5IHVuZGVyc3Rvb2QgYnkgcmVhZGluZwp0aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyAiYmRiIiBhbmQgImNtZCIuCgpTZWUgYWxzbzoKCiAgTW9kdWxlICJmYXVsdGhhbmRsZXIiCiAgICAgVXNlZCB0byBkdW1wIFB5dGhvbiB0cmFjZWJhY2tzIGV4cGxpY2l0bHksIG9uIGEgZmF1bHQsIGFmdGVyIGEKICAgICB0aW1lb3V0LCBvciBvbiBhIHVzZXIgc2lnbmFsLgoKICBNb2R1bGUgInRyYWNlYmFjayIKICAgICBTdGFuZGFyZCBpbnRlcmZhY2UgdG8gZXh0cmFjdCwgZm9ybWF0IGFuZCBwcmludCBzdGFjayB0cmFjZXMgb2YKICAgICBQeXRob24gcHJvZ3JhbXMuCgpUaGUgdHlwaWNhbCB1c2FnZSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciBpcyB0byBpbnNlcnQ6CgogICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKCk9yOgoKICAgYnJlYWtwb2ludCgpCgphdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIsIGFuZCB0aGVuIHJ1biB0aGUKcHJvZ3JhbS4gWW91IGNhbiB0aGVuIHN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsCmFuZCBjb250aW51ZSBydW5uaW5nIHdpdGhvdXQgdGhlIGRlYnVnZ2VyIHVzaW5nIHRoZSAiY29udGludWUiCmNvbW1hbmQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBUaGUgYnVpbHQtaW4gImJyZWFrcG9pbnQoKSIsIHdoZW4gY2FsbGVkIHdpdGgKZGVmYXVsdHMsIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgImltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKSIuCgogICBkZWYgZG91YmxlKHgpOgogICAgICBicmVha3BvaW50KCkKICAgICAgcmV0dXJuIHggKiAyCiAgIHZhbCA9IDMKICAgcHJpbnQoZiJ7dmFsfSAqIDIgaXMge2RvdWJsZSh2YWwpfSIpCgpUaGUgZGVidWdnZXLigJlzIHByb21wdCBpcyAiKFBkYikiLCB3aGljaCBpcyB0aGUgaW5kaWNhdG9yIHRoYXQgeW91IGFyZQppbiBkZWJ1ZyBtb2RlOgoKICAgPiAuLi4oMilkb3VibGUoKQogICAtPiBicmVha3BvaW50KCkKICAgKFBkYikgcCB4CiAgIDMKICAgKFBkYikgY29udGludWUKICAgMyAqIDIgaXMgNgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSBpcwphdmFpbGFibGUgZm9yIGNvbW1hbmRzIGFuZCBjb21tYW5kIGFyZ3VtZW50cywgZS5nLiB0aGUgY3VycmVudCBnbG9iYWwKYW5kIGxvY2FsIG5hbWVzIGFyZSBvZmZlcmVkIGFzIGFyZ3VtZW50cyBvZiB0aGUgInAiIGNvbW1hbmQuCgoKQ29tbWFuZC1saW5lIGludGVyZmFjZQo9PT09PT09PT09PT09PT09PT09PT09CgpZb3UgY2FuIGFsc28gaW52b2tlICJwZGIiIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0byBkZWJ1ZyBvdGhlcgpzY3JpcHRzLiAgRm9yIGV4YW1wbGU6CgogICBweXRob24gLW0gcGRiIFstYyBjb21tYW5kXSAoLW0gbW9kdWxlIHwgcHlmaWxlKSBbYXJncyAuLi5dCgpXaGVuIGludm9rZWQgYXMgYSBtb2R1bGUsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgcG9zdC1tb3J0ZW0KZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuICBBZnRlciBwb3N0LQptb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiB3aWxsCnJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRi4oCZcyBzdGF0ZSAoc3VjaAphcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGUKZGVidWdnZXIgdXBvbiBwcm9ncmFt4oCZcyBleGl0LgoKLWMsIC0tY29tbWFuZCA8Y29tbWFuZD4KCiAgIFRvIGV4ZWN1dGUgY29tbWFuZHMgYXMgaWYgZ2l2ZW4gaW4gYSAiLnBkYnJjIiBmaWxlOyBzZWUgRGVidWdnZXIKICAgY29tbWFuZHMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBZGRlZCB0aGUgIi1jIiBvcHRpb24uCgotbSA8bW9kdWxlPgoKICAgVG8gZXhlY3V0ZSBtb2R1bGVzIHNpbWlsYXIgdG8gdGhlIHdheSAicHl0aG9uIC1tIiBkb2VzLiBBcyB3aXRoIGEKICAgc2NyaXB0LCB0aGUgZGVidWdnZXIgd2lsbCBwYXVzZSBleGVjdXRpb24ganVzdCBiZWZvcmUgdGhlIGZpcnN0CiAgIGxpbmUgb2YgdGhlIG1vZHVsZS4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IEFkZGVkIHRoZSAiLW0iIG9wdGlvbi4KClR5cGljYWwgdXNhZ2UgdG8gZXhlY3V0ZSBhIHN0YXRlbWVudCB1bmRlciBjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczoKCiAgID4+PiBpbXBvcnQgcGRiCiAgID4+PiBkZWYgZih4KToKICAgLi4uICAgICBwcmludCgxIC8geCkKICAgPj4+IHBkYi5ydW4oImYoMikiKQogICA+IDxzdHJpbmc+KDEpPG1vZHVsZT4oKQogICAoUGRiKSBjb250aW51ZQogICAwLjUKICAgPj4+CgpUaGUgdHlwaWNhbCB1c2FnZSB0byBpbnNwZWN0IGEgY3Jhc2hlZCBwcm9ncmFtIGlzOgoKICAgPj4+IGltcG9ydCBwZGIKICAgPj4+IGRlZiBmKHgpOgogICAuLi4gICAgIHByaW50KDEgLyB4KQogICAuLi4KICAgPj4+IGYoMCkKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gZgogICBaZXJvRGl2aXNpb25FcnJvcjogZGl2aXNpb24gYnkgemVybwogICA+Pj4gcGRiLnBtKCkKICAgPiA8c3RkaW4+KDIpZigpCiAgIChQZGIpIHAgeAogICAwCiAgIChQZGIpCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogVGhlIGltcGxlbWVudGF0aW9uIG9mICoqUEVQIDY2NyoqIG1lYW5zIHRoYXQKbmFtZSBhc3NpZ25tZW50cyBtYWRlIHZpYSAicGRiIiB3aWxsIGltbWVkaWF0ZWx5IGFmZmVjdCB0aGUgYWN0aXZlCnNjb3BlLCBldmVuIHdoZW4gcnVubmluZyBpbnNpZGUgYW4gKm9wdGltaXplZCBzY29wZSouCgpUaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSBkZWJ1Z2dlcgppbiBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXk6CgpwZGIucnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSkKCiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KSB1bmRlcgogICBkZWJ1Z2dlciBjb250cm9sLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGJlZm9yZSBhbnkgY29kZSBpcwogICBleGVjdXRlZDsgeW91IGNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgImNvbnRpbnVlIiwgb3IgeW91IGNhbgogICBzdGVwIHRocm91Z2ggdGhlIHN0YXRlbWVudCB1c2luZyAic3RlcCIgb3IgIm5leHQiIChhbGwgdGhlc2UKICAgY29tbWFuZHMgYXJlIGV4cGxhaW5lZCBiZWxvdykuICBUaGUgb3B0aW9uYWwgKmdsb2JhbHMqIGFuZCAqbG9jYWxzKgogICBhcmd1bWVudHMgc3BlY2lmeSB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGNvZGUgaXMgZXhlY3V0ZWQ7IGJ5CiAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAoU2VlIHRoZQogICBleHBsYW5hdGlvbiBvZiB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgb3IgImV2YWwoKSIgZnVuY3Rpb25zLikKCnBkYi5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpCgogICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KQogICB1bmRlciBkZWJ1Z2dlciBjb250cm9sLiAgV2hlbiAicnVuZXZhbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zIHRoZQogICB2YWx1ZSBvZiB0aGUgKmV4cHJlc3Npb24qLiAgT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0bwogICAicnVuKCkiLgoKcGRiLnJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpCgogICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhIHN0cmluZykKICAgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgV2hlbiAicnVuY2FsbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zCiAgIHdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzCiAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuCgpwZGIuc2V0X3RyYWNlKCosIGhlYWRlcj1Ob25lKQoKICAgRW50ZXIgdGhlIGRlYnVnZ2VyIGF0IHRoZSBjYWxsaW5nIHN0YWNrIGZyYW1lLiAgVGhpcyBpcyB1c2VmdWwgdG8KICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiB0aGUKICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uCiAgIGZhaWxzKS4gIElmIGdpdmVuLCAqaGVhZGVyKiBpcyBwcmludGVkIHRvIHRoZSBjb25zb2xlIGp1c3QgYmVmb3JlCiAgIGRlYnVnZ2luZyBiZWdpbnMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBUaGUga2V5d29yZC1vbmx5IGFyZ3VtZW50ICpoZWFkZXIqLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTM6ICJzZXRfdHJhY2UoKSIgd2lsbCBlbnRlciB0aGUgZGVidWdnZXIKICAgaW1tZWRpYXRlbHksIHJhdGhlciB0aGFuIG9uIHRoZSBuZXh0IGxpbmUgb2YgY29kZSB0byBiZSBleGVjdXRlZC4KCnBkYi5wb3N0X21vcnRlbSh0PU5vbmUpCgogICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIGdpdmVuIGV4Y2VwdGlvbiBvciB0cmFjZWJhY2sKICAgb2JqZWN0LiBJZiBubyB2YWx1ZSBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgZXhjZXB0aW9uIHRoYXQgaXMKICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQsIG9yIHJhaXNlcyAiVmFsdWVFcnJvciIgaWYgdGhlcmUgaXNu4oCZdCBvbmUuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogU3VwcG9ydCBmb3IgZXhjZXB0aW9uIG9iamVjdHMgd2FzIGFkZGVkLgoKcGRiLnBtKCkKCiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZXhjZXB0aW9uIGZvdW5kIGluCiAgICJzeXMubGFzdF9leGMiLgoKVGhlICJydW4qIiBmdW5jdGlvbnMgYW5kICJzZXRfdHJhY2UoKSIgYXJlIGFsaWFzZXMgZm9yIGluc3RhbnRpYXRpbmcKdGhlICJQZGIiIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS4gIElmIHlvdSB3YW50CnRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzIHlvdXJzZWxmOgoKY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT0ndGFiJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHNraXA9Tm9uZSwgbm9zaWdpbnQ9RmFsc2UsIHJlYWRyYz1UcnVlKQoKICAgIlBkYiIgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLgoKICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZQogICB1bmRlcmx5aW5nICJjbWQuQ21kIiBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS4KCiAgIFRoZSAqc2tpcCogYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGdsb2Itc3R5bGUKICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyB0aGF0CiAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiBbMV0KCiAgIEJ5IGRlZmF1bHQsIFBkYiBzZXRzIGEgaGFuZGxlciBmb3IgdGhlIFNJR0lOVCBzaWduYWwgKHdoaWNoIGlzIHNlbnQKICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzICJDdHJsIi0iQyIgb24gdGhlIGNvbnNvbGUpIHdoZW4geW91IGdpdmUgYQogICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlcgogICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybCItIkMiLiAgSWYgeW91IHdhbnQgUGRiIG5vdCB0byB0b3VjaCB0aGUKICAgU0lHSU5UIGhhbmRsZXIsIHNldCAqbm9zaWdpbnQqIHRvIHRydWUuCgogICBUaGUgKnJlYWRyYyogYXJndW1lbnQgZGVmYXVsdHMgdG8gdHJ1ZSBhbmQgY29udHJvbHMgd2hldGhlciBQZGIKICAgd2lsbCBsb2FkIC5wZGJyYyBmaWxlcyBmcm9tIHRoZSBmaWxlc3lzdGVtLgoKICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOgoKICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnZGphbmdvLionXSkuc2V0X3RyYWNlKCkKCiAgIFJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAicGRiLlBkYiIgd2l0aCBubyBhcmd1bWVudHMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCB0aGUgKnNraXAqIHBhcmFtZXRlci4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFkZGVkIHRoZSAqbm9zaWdpbnQqIHBhcmFtZXRlci4gUHJldmlvdXNseSwKICAgYSBTSUdJTlQgaGFuZGxlciB3YXMgbmV2ZXIgc2V0IGJ5IFBkYi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjY6IFRoZSAqcmVhZHJjKiBhcmd1bWVudC4KCiAgIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpCiAgIHJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSkKICAgcnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcykKICAgc2V0X3RyYWNlKCkKCiAgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9ucyBleHBsYWluZWQgYWJvdmUuCgoKRGVidWdnZXIgY29tbWFuZHMKPT09PT09PT09PT09PT09PT0KClRoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBkZWJ1Z2dlciBhcmUgbGlzdGVkIGJlbG93LiAgTW9zdApjb21tYW5kcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gb25lIG9yIHR3byBsZXR0ZXJzIGFzIGluZGljYXRlZDsgZS5nLgoiaChlbHApIiBtZWFucyB0aGF0IGVpdGhlciAiaCIgb3IgImhlbHAiIGNhbiBiZSB1c2VkIHRvIGVudGVyIHRoZSBoZWxwCmNvbW1hbmQgKGJ1dCBub3QgImhlIiBvciAiaGVsIiwgbm9yICJIIiBvciAiSGVscCIgb3IgIkhFTFAiKS4KQXJndW1lbnRzIHRvIGNvbW1hbmRzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgKHNwYWNlcyBvcgp0YWJzKS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzICgiW10iKSBpbgp0aGUgY29tbWFuZCBzeW50YXg7IHRoZSBzcXVhcmUgYnJhY2tldHMgbXVzdCBub3QgYmUgdHlwZWQuCkFsdGVybmF0aXZlcyBpbiB0aGUgY29tbWFuZCBzeW50YXggYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIGJhcgooInwiKS4KCkVudGVyaW5nIGEgYmxhbmsgbGluZSByZXBlYXRzIHRoZSBsYXN0IGNvbW1hbmQgZW50ZXJlZC4gIEV4Y2VwdGlvbjogaWYKdGhlIGxhc3QgY29tbWFuZCB3YXMgYSAibGlzdCIgY29tbWFuZCwgdGhlIG5leHQgMTEgbGluZXMgYXJlIGxpc3RlZC4KCkNvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNu4oCZdCByZWNvZ25pemUgYXJlIGFzc3VtZWQgdG8gYmUgUHl0aG9uCnN0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZwpkZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gZXhjbGFtYXRpb24KcG9pbnQgKCIhIikuICBUaGlzIGlzIGEgcG93ZXJmdWwgd2F5IHRvIGluc3BlY3QgdGhlIHByb2dyYW0gYmVpbmcKZGVidWdnZWQ7IGl0IGlzIGV2ZW4gcG9zc2libGUgdG8gY2hhbmdlIGEgdmFyaWFibGUgb3IgY2FsbCBhIGZ1bmN0aW9uLgpXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gc3VjaCBhIHN0YXRlbWVudCwgdGhlIGV4Y2VwdGlvbiBuYW1lIGlzCnByaW50ZWQgYnV0IHRoZSBkZWJ1Z2dlcuKAmXMgc3RhdGUgaXMgbm90IGNoYW5nZWQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogRXhwcmVzc2lvbnMvU3RhdGVtZW50cyB3aG9zZSBwcmVmaXggaXMgYSBwZGIKY29tbWFuZCBhcmUgbm93IGNvcnJlY3RseSBpZGVudGlmaWVkIGFuZCBleGVjdXRlZC4KClRoZSBkZWJ1Z2dlciBzdXBwb3J0cyBhbGlhc2VzLiAgQWxpYXNlcyBjYW4gaGF2ZSBwYXJhbWV0ZXJzIHdoaWNoCmFsbG93cyBvbmUgYSBjZXJ0YWluIGxldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlcgpleGFtaW5hdGlvbi4KCk11bHRpcGxlIGNvbW1hbmRzIG1heSBiZSBlbnRlcmVkIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieSAiOzsiLgooQSBzaW5nbGUgIjsiIGlzIG5vdCB1c2VkIGFzIGl0IGlzIHRoZSBzZXBhcmF0b3IgZm9yIG11bHRpcGxlIGNvbW1hbmRzCmluIGEgbGluZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgUHl0aG9uIHBhcnNlci4pICBObyBpbnRlbGxpZ2VuY2UgaXMKYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlIGlucHV0IGlzIHNwbGl0IGF0IHRoZSBmaXJzdAoiOzsiIHBhaXIsIGV2ZW4gaWYgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHF1b3RlZCBzdHJpbmcuIEEKd29ya2Fyb3VuZCBmb3Igc3RyaW5ncyB3aXRoIGRvdWJsZSBzZW1pY29sb25zIGlzIHRvIHVzZSBpbXBsaWNpdApzdHJpbmcgY29uY2F0ZW5hdGlvbiAiJzsnJzsnIiBvciAiIjsiIjsiIi4KClRvIHNldCBhIHRlbXBvcmFyeSBnbG9iYWwgdmFyaWFibGUsIHVzZSBhICpjb252ZW5pZW5jZSB2YXJpYWJsZSouIEEKKmNvbnZlbmllbmNlIHZhcmlhYmxlKiBpcyBhIHZhcmlhYmxlIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggIiQiLiAgRm9yCmV4YW1wbGUsICIkZm9vID0gMSIgc2V0cyBhIGdsb2JhbCB2YXJpYWJsZSAiJGZvbyIgd2hpY2ggeW91IGNhbiB1c2UgaW4KdGhlIGRlYnVnZ2VyIHNlc3Npb24uICBUaGUgKmNvbnZlbmllbmNlIHZhcmlhYmxlcyogYXJlIGNsZWFyZWQgd2hlbgp0aGUgcHJvZ3JhbSByZXN1bWVzIGV4ZWN1dGlvbiBzbyBpdOKAmXMgbGVzcyBsaWtlbHkgdG8gaW50ZXJmZXJlIHdpdGgKeW91ciBwcm9ncmFtIGNvbXBhcmVkIHRvIHVzaW5nIG5vcm1hbCB2YXJpYWJsZXMgbGlrZSAiZm9vID0gMSIuCgpUaGVyZSBhcmUgdGhyZWUgcHJlc2V0ICpjb252ZW5pZW5jZSB2YXJpYWJsZXMqOgoKKiAiJF9mcmFtZSI6IHRoZSBjdXJyZW50IGZyYW1lIHlvdSBhcmUgZGVidWdnaW5nCgoqICIkX3JldHZhbCI6IHRoZSByZXR1cm4gdmFsdWUgaWYgdGhlIGZyYW1lIGlzIHJldHVybmluZwoKKiAiJF9leGNlcHRpb24iOiB0aGUgZXhjZXB0aW9uIGlmIHRoZSBmcmFtZSBpcyByYWlzaW5nIGFuIGV4Y2VwdGlvbgoKQWRkZWQgaW4gdmVyc2lvbiAzLjEyOiBBZGRlZCB0aGUgKmNvbnZlbmllbmNlIHZhcmlhYmxlKiBmZWF0dXJlLgoKSWYgYSBmaWxlICIucGRicmMiIGV4aXN0cyBpbiB0aGUgdXNlcuKAmXMgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gdGhlCmN1cnJlbnQgZGlyZWN0b3J5LCBpdCBpcyByZWFkIHdpdGggIid1dGYtOCciIGVuY29kaW5nIGFuZCBleGVjdXRlZCBhcwppZiBpdCBoYWQgYmVlbiB0eXBlZCBhdCB0aGUgZGVidWdnZXIgcHJvbXB0LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAplbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAiIyIgYXJlIGlnbm9yZWQuICBUaGlzIGlzCnBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGFsaWFzZXMuICBJZiBib3RoIGZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZQpob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0IGFuZCBhbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlCm92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdApjb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCB0aGVzZQpjb21tYW5kcyBoYWQgbm8gZWZmZWN0LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6ICIucGRicmMiIGlzIG5vdyByZWFkIHdpdGggIid1dGYtOCciIGVuY29kaW5nLgpQcmV2aW91c2x5LCBpdCB3YXMgcmVhZCB3aXRoIHRoZSBzeXN0ZW0gbG9jYWxlIGVuY29kaW5nLgoKaChlbHApIFtjb21tYW5kXQoKICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCBhCiAgICpjb21tYW5kKiBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQuICAiaGVscCBwZGIiCiAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiCiAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgImhlbHAKICAgZXhlYyIgbXVzdCBiZSBlbnRlcmVkIHRvIGdldCBoZWxwIG9uIHRoZSAiISIgY29tbWFuZC4KCncoaGVyZSkKCiAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uICBBbgogICBhcnJvdyAoIj4iKSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGRldGVybWluZXMgdGhlCiAgIGNvbnRleHQgb2YgbW9zdCBjb21tYW5kcy4KCmQob3duKSBbY291bnRdCgogICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiB0aGUKICAgc3RhY2sgdHJhY2UgKHRvIGEgbmV3ZXIgZnJhbWUpLgoKdShwKSBbY291bnRdCgogICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgdXAgaW4gdGhlIHN0YWNrCiAgIHRyYWNlICh0byBhbiBvbGRlciBmcmFtZSkuCgpiKHJlYWspIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV0KCiAgIFdpdGggYSAqbGluZW5vKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgYXQgbGluZSAqbGluZW5vKiBpbiB0aGUKICAgY3VycmVudCBmaWxlLiBUaGUgbGluZSBudW1iZXIgbWF5IGJlIHByZWZpeGVkIHdpdGggYSAqZmlsZW5hbWUqIGFuZAogICBhIGNvbG9uLCB0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiBhbm90aGVyIGZpbGUgKHBvc3NpYmx5IG9uZSB0aGF0CiAgIGhhc27igJl0IGJlZW4gbG9hZGVkIHlldCkuICBUaGUgZmlsZSBpcyBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLgogICBBY2NlcGF0YWJsZSBmb3JtcyBvZiAqZmlsZW5hbWUqIGFyZSAiL2Fic3BhdGgvdG8vZmlsZS5weSIsCiAgICJyZWxwYXRoL2ZpbGUucHkiLCAibW9kdWxlIiBhbmQgInBhY2thZ2UubW9kdWxlIi4KCiAgIFdpdGggYSAqZnVuY3Rpb24qIGFyZ3VtZW50LCBzZXQgYSBicmVhayBhdCB0aGUgZmlyc3QgZXhlY3V0YWJsZQogICBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgZnVuY3Rpb24uICpmdW5jdGlvbiogY2FuIGJlIGFueSBleHByZXNzaW9uCiAgIHRoYXQgZXZhbHVhdGVzIHRvIGEgZnVuY3Rpb24gaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLgoKICAgSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudCwgaXQgaXMgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0CiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuCgogICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MsIGluY2x1ZGluZyBmb3IgZWFjaCBicmVha3BvaW50LAogICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQsIHRoZSBjdXJyZW50CiAgIGlnbm9yZSBjb3VudCwgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpZiBhbnkuCgogICBFYWNoIGJyZWFrcG9pbnQgaXMgYXNzaWduZWQgYSBudW1iZXIgdG8gd2hpY2ggYWxsIHRoZSBvdGhlcgogICBicmVha3BvaW50IGNvbW1hbmRzIHJlZmVyLgoKdGJyZWFrIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV0KCiAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpcwogICBmaXJzdCBoaXQuIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciAiYnJlYWsiLgoKY2woZWFyKSBbZmlsZW5hbWU6bGluZW5vIHwgYnBudW1iZXIgLi4uXQoKICAgV2l0aCBhICpmaWxlbmFtZTpsaW5lbm8qIGFyZ3VtZW50LCBjbGVhciBhbGwgdGhlIGJyZWFrcG9pbnRzIGF0CiAgIHRoaXMgbGluZS4gV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXIKICAgdGhvc2UgYnJlYWtwb2ludHMuIFdpdGhvdXQgYXJndW1lbnQsIGNsZWFyIGFsbCBicmVha3MgKGJ1dCBmaXJzdAogICBhc2sgY29uZmlybWF0aW9uKS4KCmRpc2FibGUgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0KCiAgIERpc2FibGUgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YKICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgY2F1c2UKICAgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24sIGJ1dCB1bmxpa2UgY2xlYXJpbmcgYSBicmVha3BvaW50LCBpdAogICByZW1haW5zIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzIGFuZCBjYW4gYmUgKHJlLSllbmFibGVkLgoKZW5hYmxlIGJwbnVtYmVyIFticG51bWJlciAuLi5dCgogICBFbmFibGUgdGhlIGJyZWFrcG9pbnRzIHNwZWNpZmllZC4KCmlnbm9yZSBicG51bWJlciBbY291bnRdCgogICBTZXQgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgSWYgKmNvdW50KgogICBpcyBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50IGJlY29tZXMKICAgYWN0aXZlIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywgdGhlICpjb3VudCoKICAgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZQogICBicmVha3BvaW50IGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQgY29uZGl0aW9uIGV2YWx1YXRlcwogICB0byB0cnVlLgoKY29uZGl0aW9uIGJwbnVtYmVyIFtjb25kaXRpb25dCgogICBTZXQgYSBuZXcgKmNvbmRpdGlvbiogZm9yIHRoZSBicmVha3BvaW50LCBhbiBleHByZXNzaW9uIHdoaWNoIG11c3QKICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmICpjb25kaXRpb24qCiAgIGlzIGFic2VudCwgYW55IGV4aXN0aW5nIGNvbmRpdGlvbiBpcyByZW1vdmVkOyBpLmUuLCB0aGUgYnJlYWtwb2ludAogICBpcyBtYWRlIHVuY29uZGl0aW9uYWwuCgpjb21tYW5kcyBbYnBudW1iZXJdCgogICBTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgKmJwbnVtYmVyKi4gIFRoZQogICBjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmUKICAgY29udGFpbmluZyBqdXN0ICJlbmQiIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuIEFuIGV4YW1wbGU6CgogICAgICAoUGRiKSBjb21tYW5kcyAxCiAgICAgIChjb20pIHAgc29tZV92YXJpYWJsZQogICAgICAoY29tKSBlbmQKICAgICAgKFBkYikKCiAgIFRvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgImNvbW1hbmRzIiBhbmQKICAgZm9sbG93IGl0IGltbWVkaWF0ZWx5IHdpdGggImVuZCI7IHRoYXQgaXMsIGdpdmUgbm8gY29tbWFuZHMuCgogICBXaXRoIG5vICpicG51bWJlciogYXJndW1lbnQsICJjb21tYW5kcyIgcmVmZXJzIHRvIHRoZSBsYXN0CiAgIGJyZWFrcG9pbnQgc2V0LgoKICAgWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uCiAgIFNpbXBseSB1c2UgdGhlICJjb250aW51ZSIgY29tbWFuZCwgb3IgInN0ZXAiLCBvciBhbnkgb3RoZXIgY29tbWFuZAogICB0aGF0IHJlc3VtZXMgZXhlY3V0aW9uLgoKICAgU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSAiY29udGludWUiLAogICAic3RlcCIsICJuZXh0IiwgInJldHVybiIsICJqdW1wIiwgInF1aXQiIGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKQogICB0ZXJtaW5hdGVzIHRoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkKICAgZm9sbG93ZWQgYnkgZW5kKS4gVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uCiAgIChldmVuIHdpdGggYSBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIgYW5vdGhlcgogICBicmVha3BvaW504oCUd2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bwogICBhbWJpZ3VpdGllcyBhYm91dCB3aGljaCBsaXN0IHRvIGV4ZWN1dGUuCgogICBJZiB5b3UgdXNlIHRoZSAic2lsZW50IiBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZSB1c3VhbAogICBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgbWF5IGJlCiAgIGRlc2lyYWJsZSBmb3IgYnJlYWtwb2ludHMgdGhhdCBhcmUgdG8gcHJpbnQgYSBzcGVjaWZpYyBtZXNzYWdlIGFuZAogICB0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQogICBzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLgoKcyh0ZXApCgogICBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIG9jY2FzaW9uCiAgIChlaXRoZXIgaW4gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvciBvbiB0aGUgbmV4dCBsaW5lIGluIHRoZQogICBjdXJyZW50IGZ1bmN0aW9uKS4KCm4oZXh0KQoKICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMKICAgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5leHQiIGFuZCAic3RlcCIKICAgaXMgdGhhdCAic3RlcCIgc3RvcHMgaW5zaWRlIGEgY2FsbGVkIGZ1bmN0aW9uLCB3aGlsZSAibmV4dCIKICAgZXhlY3V0ZXMgY2FsbGVkIGZ1bmN0aW9ucyBhdCAobmVhcmx5KSBmdWxsIHNwZWVkLCBvbmx5IHN0b3BwaW5nIGF0CiAgIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uKQoKdW50KGlsKSBbbGluZW5vXQoKICAgV2l0aG91dCBhcmd1bWVudCwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBsaW5lIHdpdGggYSBudW1iZXIKICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcyByZWFjaGVkLgoKICAgV2l0aCAqbGluZW5vKiwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIGEgbGluZSB3aXRoIGEgbnVtYmVyCiAgIGdyZWF0ZXIgb3IgZXF1YWwgdG8gKmxpbmVubyogaXMgcmVhY2hlZC4gIEluIGJvdGggY2FzZXMsIGFsc28gc3RvcAogICB3aGVuIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBbGxvdyBnaXZpbmcgYW4gZXhwbGljaXQgbGluZSBudW1iZXIuCgpyKGV0dXJuKQoKICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuCgpjKG9udChpbnVlKSkKCiAgIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLgoKaih1bXApIGxpbmVubwoKICAgU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gdGhlCiAgIGJvdHRvbS1tb3N0IGZyYW1lLiAgVGhpcyBsZXRzIHlvdSBqdW1wIGJhY2sgYW5kIGV4ZWN1dGUgY29kZSBhZ2FpbiwKICAgb3IganVtcCBmb3J3YXJkIHRvIHNraXAgY29kZSB0aGF0IHlvdSBkb27igJl0IHdhbnQgdG8gcnVuLgoKICAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbm90IGFsbCBqdW1wcyBhcmUgYWxsb3dlZCDigJMgZm9yIGluc3RhbmNlIGl0CiAgIGlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhICJmb3IiIGxvb3Agb3Igb3V0IG9mIGEKICAgImZpbmFsbHkiIGNsYXVzZS4KCmwoaXN0KSBbZmlyc3RbLCBsYXN0XV0KCiAgIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuICBXaXRob3V0IGFyZ3VtZW50cywgbGlzdCAxMQogICBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZSBvciBjb250aW51ZSB0aGUgcHJldmlvdXMgbGlzdGluZy4KICAgV2l0aCAiLiIgYXMgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUuICBXaXRoCiAgIG9uZSBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgYXQgdGhhdCBsaW5lLiAgV2l0aCB0d28KICAgYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBsZXNzCiAgIHRoYW4gdGhlIGZpcnN0LCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNvdW50LgoKICAgVGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgY3VycmVudCBmcmFtZSBpcyBpbmRpY2F0ZWQgYnkgIi0+Ii4gIElmIGFuCiAgIGV4Y2VwdGlvbiBpcyBiZWluZyBkZWJ1Z2dlZCwgdGhlIGxpbmUgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXMKICAgb3JpZ2luYWxseSByYWlzZWQgb3IgcHJvcGFnYXRlZCBpcyBpbmRpY2F0ZWQgYnkgIj4+IiwgaWYgaXQgZGlmZmVycwogICBmcm9tIHRoZSBjdXJyZW50IGxpbmUuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBZGRlZCB0aGUgIj4+IiBtYXJrZXIuCgpsbCB8IGxvbmdsaXN0CgogICBMaXN0IGFsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb3IgZnJhbWUuCiAgIEludGVyZXN0aW5nIGxpbmVzIGFyZSBtYXJrZWQgYXMgZm9yICJsaXN0Ii4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy4yLgoKYShyZ3MpCgogICBQcmludCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGFuZCB0aGVpciBjdXJyZW50CiAgIHZhbHVlcy4KCnAgZXhwcmVzc2lvbgoKICAgRXZhbHVhdGUgKmV4cHJlc3Npb24qIGluIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHByaW50IGl0cyB2YWx1ZS4KCiAgIE5vdGU6CgogICAgICJwcmludCgpIiBjYW4gYWxzbyBiZSB1c2VkLCBidXQgaXMgbm90IGEgZGVidWdnZXIgY29tbWFuZCDigJQgdGhpcwogICAgIGV4ZWN1dGVzIHRoZSBQeXRob24gInByaW50KCkiIGZ1bmN0aW9uLgoKcHAgZXhwcmVzc2lvbgoKICAgTGlrZSB0aGUgInAiIGNvbW1hbmQsIGV4Y2VwdCB0aGUgdmFsdWUgb2YgKmV4cHJlc3Npb24qIGlzIHByZXR0eS0KICAgcHJpbnRlZCB1c2luZyB0aGUgInBwcmludCIgbW9kdWxlLgoKd2hhdGlzIGV4cHJlc3Npb24KCiAgIFByaW50IHRoZSB0eXBlIG9mICpleHByZXNzaW9uKi4KCnNvdXJjZSBleHByZXNzaW9uCgogICBUcnkgdG8gZ2V0IHNvdXJjZSBjb2RlIG9mICpleHByZXNzaW9uKiBhbmQgZGlzcGxheSBpdC4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy4yLgoKZGlzcGxheSBbZXhwcmVzc2lvbl0KCiAgIERpc3BsYXkgdGhlIHZhbHVlIG9mICpleHByZXNzaW9uKiBpZiBpdCBjaGFuZ2VkLCBlYWNoIHRpbWUKICAgZXhlY3V0aW9uIHN0b3BzIGluIHRoZSBjdXJyZW50IGZyYW1lLgoKICAgV2l0aG91dCAqZXhwcmVzc2lvbiosIGxpc3QgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50CiAgIGZyYW1lLgoKICAgTm90ZToKCiAgICAgRGlzcGxheSBldmFsdWF0ZXMgKmV4cHJlc3Npb24qIGFuZCBjb21wYXJlcyB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgIHByZXZpb3VzIGV2YWx1YXRpb24gb2YgKmV4cHJlc3Npb24qLCBzbyB3aGVuIHRoZSByZXN1bHQgaXMKICAgICBtdXRhYmxlLCBkaXNwbGF5IG1heSBub3QgYmUgYWJsZSB0byBwaWNrIHVwIHRoZSBjaGFuZ2VzLgoKICAgRXhhbXBsZToKCiAgICAgIGxzdCA9IFtdCiAgICAgIGJyZWFrcG9pbnQoKQogICAgICBwYXNzCiAgICAgIGxzdC5hcHBlbmQoMSkKICAgICAgcHJpbnQobHN0KQoKICAgRGlzcGxheSB3b27igJl0IHJlYWxpemUgImxzdCIgaGFzIGJlZW4gY2hhbmdlZCBiZWNhdXNlIHRoZSByZXN1bHQgb2YKICAgZXZhbHVhdGlvbiBpcyBtb2RpZmllZCBpbiBwbGFjZSBieSAibHN0LmFwcGVuZCgxKSIgYmVmb3JlIGJlaW5nCiAgIGNvbXBhcmVkOgoKICAgICAgPiBleGFtcGxlLnB5KDMpPG1vZHVsZT4oKQogICAgICAtPiBwYXNzCiAgICAgIChQZGIpIGRpc3BsYXkgbHN0CiAgICAgIGRpc3BsYXkgbHN0OiBbXQogICAgICAoUGRiKSBuCiAgICAgID4gZXhhbXBsZS5weSg0KTxtb2R1bGU+KCkKICAgICAgLT4gbHN0LmFwcGVuZCgxKQogICAgICAoUGRiKSBuCiAgICAgID4gZXhhbXBsZS5weSg1KTxtb2R1bGU+KCkKICAgICAgLT4gcHJpbnQobHN0KQogICAgICAoUGRiKQoKICAgWW91IGNhbiBkbyBzb21lIHRyaWNrcyB3aXRoIGNvcHkgbWVjaGFuaXNtIHRvIG1ha2UgaXQgd29yazoKCiAgICAgID4gZXhhbXBsZS5weSgzKTxtb2R1bGU+KCkKICAgICAgLT4gcGFzcwogICAgICAoUGRiKSBkaXNwbGF5IGxzdFs6XQogICAgICBkaXNwbGF5IGxzdFs6XTogW10KICAgICAgKFBkYikgbgogICAgICA+IGV4YW1wbGUucHkoNCk8bW9kdWxlPigpCiAgICAgIC0+IGxzdC5hcHBlbmQoMSkKICAgICAgKFBkYikgbgogICAgICA+IGV4YW1wbGUucHkoNSk8bW9kdWxlPigpCiAgICAgIC0+IHByaW50KGxzdCkKICAgICAgZGlzcGxheSBsc3RbOl06IFsxXSAgW29sZDogW11dCiAgICAgIChQZGIpCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuMi4KCnVuZGlzcGxheSBbZXhwcmVzc2lvbl0KCiAgIERvIG5vdCBkaXNwbGF5ICpleHByZXNzaW9uKiBhbnltb3JlIGluIHRoZSBjdXJyZW50IGZyYW1lLiAgV2l0aG91dAogICAqZXhwcmVzc2lvbiosIGNsZWFyIGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgY3VycmVudCBmcmFtZS4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy4yLgoKaW50ZXJhY3QKCiAgIFN0YXJ0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyICh1c2luZyB0aGUgImNvZGUiIG1vZHVsZSkgaW4gYSBuZXcKICAgZ2xvYmFsIG5hbWVzcGFjZSBpbml0aWFsaXNlZCBmcm9tIHRoZSBsb2NhbCBhbmQgZ2xvYmFsIG5hbWVzcGFjZXMKICAgZm9yIHRoZSBjdXJyZW50IHNjb3BlLiBVc2UgImV4aXQoKSIgb3IgInF1aXQoKSIgdG8gZXhpdCB0aGUKICAgaW50ZXJwcmV0ZXIgYW5kIHJldHVybiB0byB0aGUgZGVidWdnZXIuCgogICBOb3RlOgoKICAgICBBcyAiaW50ZXJhY3QiIGNyZWF0ZXMgYSBuZXcgZGVkaWNhdGVkIG5hbWVzcGFjZSBmb3IgY29kZQogICAgIGV4ZWN1dGlvbiwgYXNzaWdubWVudHMgdG8gdmFyaWFibGVzIHdpbGwgbm90IGFmZmVjdCB0aGUgb3JpZ2luYWwKICAgICBuYW1lc3BhY2VzLiBIb3dldmVyLCBtb2RpZmljYXRpb25zIHRvIGFueSByZWZlcmVuY2VkIG11dGFibGUKICAgICBvYmplY3RzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBvcmlnaW5hbCBuYW1lc3BhY2VzIGFzIHVzdWFsLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogImV4aXQoKSIgYW5kICJxdWl0KCkiIGNhbiBiZSB1c2VkIHRvIGV4aXQKICAgdGhlICJpbnRlcmFjdCIgY29tbWFuZC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjEzOiAiaW50ZXJhY3QiIGRpcmVjdHMgaXRzIG91dHB1dCB0byB0aGUKICAgZGVidWdnZXLigJlzIG91dHB1dCBjaGFubmVsIHJhdGhlciB0aGFuICJzeXMuc3RkZXJyIi4KCmFsaWFzIFtuYW1lIFtjb21tYW5kXV0KCiAgIENyZWF0ZSBhbiBhbGlhcyBjYWxsZWQgKm5hbWUqIHRoYXQgZXhlY3V0ZXMgKmNvbW1hbmQqLiAgVGhlCiAgICpjb21tYW5kKiBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMKICAgY2FuIGJlIGluZGljYXRlZCBieSAiJTEiLCAiJTIiLCDigKYgYW5kICIlOSIsIHdoaWxlICIlKiIgaXMgcmVwbGFjZWQKICAgYnkgYWxsIHRoZSBwYXJhbWV0ZXJzLiBJZiAqY29tbWFuZCogaXMgb21pdHRlZCwgdGhlIGN1cnJlbnQgYWxpYXMKICAgZm9yICpuYW1lKiBpcyBzaG93bi4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlCiAgIGxpc3RlZC4KCiAgIEFsaWFzZXMgbWF5IGJlIG5lc3RlZCBhbmQgY2FuIGNvbnRhaW4gYW55dGhpbmcgdGhhdCBjYW4gYmUgbGVnYWxseQogICB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUgdGhhdCBpbnRlcm5hbCBwZGIgY29tbWFuZHMgKmNhbiogYmUKICAgb3ZlcnJpZGRlbiBieSBhbGlhc2VzLiAgU3VjaCBhIGNvbW1hbmQgaXMgdGhlbiBoaWRkZW4gdW50aWwgdGhlCiAgIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcyByZWN1cnNpdmVseSBhcHBsaWVkIHRvIHRoZSBmaXJzdAogICB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgbGVmdAogICBhbG9uZS4KCiAgIEFzIGFuIGV4YW1wbGUsIGhlcmUgYXJlIHR3byB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuIHBsYWNlZAogICBpbiB0aGUgIi5wZGJyYyIgZmlsZSk6CgogICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyAodXNhZ2UgInBpIGNsYXNzSW5zdCIpCiAgICAgIGFsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQoZiIlMS57a30gPSB7JTEuX19kaWN0X19ba119IikKICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gc2VsZgogICAgICBhbGlhcyBwcyBwaSBzZWxmCgp1bmFsaWFzIG5hbWUKCiAgIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGFsaWFzICpuYW1lKi4KCiEgc3RhdGVtZW50CgogICBFeGVjdXRlIHRoZSAob25lLWxpbmUpICpzdGF0ZW1lbnQqIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50CiAgIHN0YWNrIGZyYW1lLiBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBmaXJzdAogICB3b3JkIG9mIHRoZSBzdGF0ZW1lbnQgcmVzZW1ibGVzIGEgZGVidWdnZXIgY29tbWFuZCwgZS5nLjoKCiAgICAgIChQZGIpICEgbj00MgogICAgICAoUGRiKQoKICAgVG8gc2V0IGEgZ2xvYmFsIHZhcmlhYmxlLCB5b3UgY2FuIHByZWZpeCB0aGUgYXNzaWdubWVudCBjb21tYW5kCiAgIHdpdGggYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjoKCiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFsnLWwnXQogICAgICAoUGRiKQoKcnVuIFthcmdzIC4uLl0KcmVzdGFydCBbYXJncyAuLi5dCgogICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmICphcmdzKiBpcyBzdXBwbGllZCwgaXQgaXMKICAgc3BsaXQgd2l0aCAic2hsZXgiIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ldyAic3lzLmFyZ3YiLgogICBIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmUgcHJlc2VydmVkLgogICAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLgoKcSh1aXQpCgogICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC4KCmRlYnVnIGNvZGUKCiAgIEVudGVyIGEgcmVjdXJzaXZlIGRlYnVnZ2VyIHRoYXQgc3RlcHMgdGhyb3VnaCAqY29kZSogKHdoaWNoIGlzIGFuCiAgIGFyYml0cmFyeSBleHByZXNzaW9uIG9yIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZCBpbiB0aGUgY3VycmVudAogICBlbnZpcm9ubWVudCkuCgpyZXR2YWwKCiAgIFByaW50IHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBsYXN0IHJldHVybiBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4KCmV4Y2VwdGlvbnMgW2V4Y251bWJlcl0KCiAgIExpc3Qgb3IganVtcCBiZXR3ZWVuIGNoYWluZWQgZXhjZXB0aW9ucy4KCiAgIFdoZW4gdXNpbmcgInBkYi5wbSgpIiAgb3IgIlBkYi5wb3N0X21vcnRlbSguLi4pIiB3aXRoIGEgY2hhaW5lZAogICBleGNlcHRpb24gaW5zdGVhZCBvZiBhIHRyYWNlYmFjaywgaXQgYWxsb3dzIHRoZSB1c2VyIHRvIG1vdmUKICAgYmV0d2VlbiB0aGUgY2hhaW5lZCBleGNlcHRpb25zIHVzaW5nICJleGNlcHRpb25zIiBjb21tYW5kIHRvIGxpc3QKICAgZXhjZXB0aW9ucywgYW5kICJleGNlcHRpb25zIDxudW1iZXI+IiB0byBzd2l0Y2ggdG8gdGhhdCBleGNlcHRpb24uCgogICBFeGFtcGxlOgoKICAgICAgZGVmIG91dCgpOgogICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIG1pZGRsZSgpCiAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVyYWlzZSBtaWRkbGUoKSBlcnJvciIpIGZyb20gZQoKICAgICAgZGVmIG1pZGRsZSgpOgogICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIHJldHVybiBpbm5lcigwKQogICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1pZGRsZSBmYWlsIikKCiAgICAgIGRlZiBpbm5lcih4KToKICAgICAgICAgIDEgLyB4CgogICAgICAgb3V0KCkKCiAgIGNhbGxpbmcgInBkYi5wbSgpIiB3aWxsIGFsbG93IHRvIG1vdmUgYmV0d2VlbiBleGNlcHRpb25zOgoKICAgICAgPiBleGFtcGxlLnB5KDUpb3V0KCkKICAgICAgLT4gcmFpc2UgVmFsdWVFcnJvcigicmVyYWlzZSBtaWRkbGUoKSBlcnJvciIpIGZyb20gZQoKICAgICAgKFBkYikgZXhjZXB0aW9ucwogICAgICAgIDAgWmVyb0RpdmlzaW9uRXJyb3IoJ2RpdmlzaW9uIGJ5IHplcm8nKQogICAgICAgIDEgVmFsdWVFcnJvcignTWlkZGxlIGZhaWwnKQogICAgICA+IDIgVmFsdWVFcnJvcigncmVyYWlzZSBtaWRkbGUoKSBlcnJvcicpCgogICAgICAoUGRiKSBleGNlcHRpb25zIDAKICAgICAgPiBleGFtcGxlLnB5KDE2KWlubmVyKCkKICAgICAgLT4gMSAvIHgKCiAgICAgIChQZGIpIHVwCiAgICAgID4gZXhhbXBsZS5weSgxMCltaWRkbGUoKQogICAgICAtPiByZXR1cm4gaW5uZXIoMCkKCiAgIEFkZGVkIGluIHZlcnNpb24gMy4xMy4KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gbW9kdWxlIGlzCiAgICBkZXRlcm1pbmVkIGJ5IHRoZSAiX19uYW1lX18iIGluIHRoZSBmcmFtZSBnbG9iYWxzLgraA2RlbGGqAwAAVGhlICJkZWwiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqCgogICBkZWxfc3RtdCA6Oj0gImRlbCIgdGFyZ2V0X2xpc3QKCkRlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCBpcwpkZWZpbmVkLiBSYXRoZXIgdGhhbiBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lCmhpbnRzLgoKRGVsZXRpb24gb2YgYSB0YXJnZXQgbGlzdCByZWN1cnNpdmVseSBkZWxldGVzIGVhY2ggdGFyZ2V0LCBmcm9tIGxlZnQKdG8gcmlnaHQuCgpEZWxldGlvbiBvZiBhIG5hbWUgcmVtb3ZlcyB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgZnJvbSB0aGUgbG9jYWwgb3IKZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCIKc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBUcnlpbmcgdG8gZGVsZXRlIGFuIHVuYm91bmQgbmFtZQpyYWlzZXMgYSAiTmFtZUVycm9yIiBleGNlcHRpb24uCgpEZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgcGFzc2VkCnRvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWwKZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlbgp0aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogUHJldmlvdXNseSBpdCB3YXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lCmZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMgYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkCmJsb2NrLgraBGRpY3R1HwgAAERpY3Rpb25hcnkgZGlzcGxheXMKKioqKioqKioqKioqKioqKioqKgoKQSBkaWN0aW9uYXJ5IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZGljdCBpdGVtcwooa2V5L3ZhbHVlIHBhaXJzKSBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6CgogICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBbZGljdF9pdGVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICJ9IgogICBkaWN0X2l0ZW1fbGlzdCAgICAgOjo9IGRpY3RfaXRlbSAoIiwiIGRpY3RfaXRlbSkqIFsiLCJdCiAgIGRpY3RfaXRlbSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiB8ICIqKiIgb3JfZXhwcgogICBkaWN0X2NvbXByZWhlbnNpb24gOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gY29tcF9mb3IKCkEgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC4KCklmIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGRpY3QgaXRlbXMgaXMgZ2l2ZW4sIHRoZXkgYXJlCmV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgdG8gZGVmaW5lIHRoZSBlbnRyaWVzIG9mIHRoZSBkaWN0aW9uYXJ5OgplYWNoIGtleSBvYmplY3QgaXMgdXNlZCBhcyBhIGtleSBpbnRvIHRoZSBkaWN0aW9uYXJ5IHRvIHN0b3JlIHRoZQpjb3JyZXNwb25kaW5nIHZhbHVlLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXkKbXVsdGlwbGUgdGltZXMgaW4gdGhlIGRpY3QgaXRlbSBsaXN0LCBhbmQgdGhlIGZpbmFsIGRpY3Rpb25hcnnigJlzIHZhbHVlCmZvciB0aGF0IGtleSB3aWxsIGJlIHRoZSBsYXN0IG9uZSBnaXZlbi4KCkEgZG91YmxlIGFzdGVyaXNrICIqKiIgZGVub3RlcyAqZGljdGlvbmFyeSB1bnBhY2tpbmcqLiBJdHMgb3BlcmFuZAptdXN0IGJlIGEgKm1hcHBpbmcqLiAgRWFjaCBtYXBwaW5nIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIG5ldwpkaWN0aW9uYXJ5LiAgTGF0ZXIgdmFsdWVzIHJlcGxhY2UgdmFsdWVzIGFscmVhZHkgc2V0IGJ5IGVhcmxpZXIgZGljdAppdGVtcyBhbmQgZWFybGllciBkaWN0aW9uYXJ5IHVucGFja2luZ3MuCgpBZGRlZCBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseQpwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi4KCkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsCm5lZWRzIHR3byBleHByZXNzaW9ucyBzZXBhcmF0ZWQgd2l0aCBhIGNvbG9uIGZvbGxvd2VkIGJ5IHRoZSB1c3VhbArigJxmb3LigJ0gYW5kIOKAnGlm4oCdIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nCmtleSBhbmQgdmFsdWUgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZSBuZXcgZGljdGlvbmFyeSBpbiB0aGUgb3JkZXIKdGhleSBhcmUgcHJvZHVjZWQuCgpSZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpbgpzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeS4gIChUbyBzdW1tYXJpemUsIHRoZSBrZXkgdHlwZQpzaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzCmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgdmFsdWUgKHRleHR1YWxseQpyaWdodG1vc3QgaW4gdGhlIGRpc3BsYXkpIHN0b3JlZCBmb3IgYSBnaXZlbiBrZXkgdmFsdWUgcHJldmFpbHMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy44OiBQcmlvciB0byBQeXRob24gMy44LCBpbiBkaWN0IGNvbXByZWhlbnNpb25zLAp0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBrZXkgYW5kIHZhbHVlIHdhcyBub3Qgd2VsbC1kZWZpbmVkLiAgSW4KQ1B5dGhvbiwgdGhlIHZhbHVlIHdhcyBldmFsdWF0ZWQgYmVmb3JlIHRoZSBrZXkuICBTdGFydGluZyB3aXRoIDMuOCwKdGhlIGtleSBpcyBldmFsdWF0ZWQgYmVmb3JlIHRoZSB2YWx1ZSwgYXMgcHJvcG9zZWQgYnkgKipQRVAgNTcyKiouCnoQZHluYW1pYy1mZWF0dXJlc2GwAgAASW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgY29tcGlsZQp0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6CgogICBpID0gMTAKICAgZGVmIGYoKToKICAgICAgIHByaW50KGkpCiAgIGkgPSA0MgogICBmKCkKClRoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbAplbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbAphbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQKaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgWzFdClRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvCm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpcwpzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguCtoEZWxzZWFYAgAAVGhlICJpZiIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKgoKVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjoKCiAgIGlmX3N0bXQgOjo9ICJpZiIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAoImVsaWYiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAiOiIgc3VpdGUpKgogICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KCkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmUKYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuIG9wZXJhdGlvbnMKZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkCihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS4KSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZgpwcmVzZW50LCBpcyBleGVjdXRlZC4K2gpleGNlcHRpb25zdZoIAABFeGNlcHRpb25zCioqKioqKioqKioKCkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sCm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsCmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpcwpkZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnkKY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZQp0aGUgZXJyb3Igb2NjdXJyZWQuCgpUaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWUKZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvCmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb24KaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiDigKYgImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlCiJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXAKY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW4KZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuCgpQeXRob24gdXNlcyB0aGUg4oCcdGVybWluYXRpb27igJ0gbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvbgpoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXIKbGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZQpmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZQpmcm9tIHRoZSB0b3ApLgoKV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcwpleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluCmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayB0cmFjZWJhY2ssIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXMKIlN5c3RlbUV4aXQiLgoKRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzCnNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZSB0aGUKY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgKm5vbi12aXJ0dWFsIGJhc2UgY2xhc3MqIHRoZXJlb2YuIFRoZQppbnN0YW5jZSBjYW4gYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsCmluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uCgpOb3RlOgoKICBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXIgY29udGVudHMKICBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXQgd2FybmluZwogIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyIG11bHRpcGxlCiAgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgdHJ5CnN0YXRlbWVudCBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LgoKLVsgRm9vdG5vdGVzIF0tCgpbMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2UKICAgIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkLgraCWV4ZWNtb2RlbHUmNgAARXhlY3V0aW9uIG1vZGVsCioqKioqKioqKioqKioqKgoKClN0cnVjdHVyZSBvZiBhIHByb2dyYW0KPT09PT09PT09PT09PT09PT09PT09PQoKQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgYSBwaWVjZQpvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYSB1bml0LiBUaGUgZm9sbG93aW5nIGFyZQpibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uIEVhY2gKY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgZ2l2ZW4KYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZCBhcyBhIGNvbW1hbmQgbGluZQphcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgKGEKY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAiLWMiCm9wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiBBIG1vZHVsZSBydW4gYXMgYSB0b3AgbGV2ZWwgc2NyaXB0IChhcyBtb2R1bGUKIl9fbWFpbl9fIikgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIGEgIi1tIiBhcmd1bWVudCBpcyBhbHNvIGEgY29kZQpibG9jay4gVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXZhbCgpIgphbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLgoKQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWlucwpzb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzCndoZXJlIGFuZCBob3cgZXhlY3V0aW9uIGNvbnRpbnVlcyBhZnRlciB0aGUgY29kZSBibG9ja+KAmXMgZXhlY3V0aW9uIGhhcwpjb21wbGV0ZWQuCgoKTmFtaW5nIGFuZCBiaW5kaW5nCj09PT09PT09PT09PT09PT09PQoKCkJpbmRpbmcgb2YgbmFtZXMKLS0tLS0tLS0tLS0tLS0tLQoKKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuCgpUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczoKCiogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLAoKKiBjbGFzcyBkZWZpbml0aW9ucywKCiogZnVuY3Rpb24gZGVmaW5pdGlvbnMsCgoqIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsCgoqIHRhcmdldHMgdGhhdCBhcmUgaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQ6CgogICogImZvciIgbG9vcCBoZWFkZXIsCgogICogYWZ0ZXIgImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQsICJleGNlcHQiIGNsYXVzZSwgImV4Y2VwdCoiCiAgICBjbGF1c2UsIG9yIGluIHRoZSBhcy1wYXR0ZXJuIGluIHN0cnVjdHVyYWwgcGF0dGVybiBtYXRjaGluZywKCiAgKiBpbiBhIGNhcHR1cmUgcGF0dGVybiBpbiBzdHJ1Y3R1cmFsIHBhdHRlcm4gbWF0Y2hpbmcKCiogImltcG9ydCIgc3RhdGVtZW50cy4KCiogInR5cGUiIHN0YXRlbWVudHMuCgoqIHR5cGUgcGFyYW1ldGVyIGxpc3RzLgoKVGhlICJpbXBvcnQiIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcwpkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbgp1bmRlcnNjb3JlLiBUaGlzIGZvcm0gbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLgoKQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3IKdGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuCgpFYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhCmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbApjb2RlIGJsb2NrKS4KCklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2ssCnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZQptb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZQpjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGUKYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi4KCkVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICpiaW5kaW5nKgpvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuCgoKUmVzb2x1dGlvbiBvZiBuYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tCgpBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsCnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGUKZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrcwpjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzCmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLgoKV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0CmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrCmlzIGNhbGxlZCB0aGUgYmxvY2vigJlzICplbnZpcm9ubWVudCouCgpXaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmCnRoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbAp2YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlCm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLgoiVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuCgpJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbAp1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGUKY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGEKYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrcwpkZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZQp3aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlCmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuIFNlZSB0aGUgRkFRIGVudHJ5IG9uIFVuYm91bmRMb2NhbEVycm9yIGZvciBleGFtcGxlcy4KCklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZXMKc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmdzIG9mIHRob3NlIG5hbWVzIGluIHRoZQp0b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5CnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUKY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2UKb2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgZmlyc3QuICBJZgp0aGUgbmFtZXMgYXJlIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZApuZXh0LiBJZiB0aGUgbmFtZXMgYXJlIGFsc28gbm90IGZvdW5kIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIG5ldwp2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZSBnbG9iYWwgc3RhdGVtZW50Cm11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbGlzdGVkIG5hbWVzLgoKVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uCmluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgdmFyaWFibGUKY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLgoKVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyIHRvCnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4KIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CmV4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuIFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYmUKcmVib3VuZCB3aXRoIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC4KClRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhCm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZAoiX19tYWluX18iLgoKQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlCnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4KZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMKZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0CnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZQpuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2YKdGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8KdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMuClRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucywgYnV0IGl0IGRvZXMKbm90IGluY2x1ZGUgYW5ub3RhdGlvbiBzY29wZXMsIHdoaWNoIGhhdmUgYWNjZXNzIHRvIHRoZWlyIGVuY2xvc2luZwpjbGFzcyBzY29wZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbDoKCiAgIGNsYXNzIEE6CiAgICAgICBhID0gNDIKICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSkKCkhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgd2lsbCBzdWNjZWVkOgoKICAgY2xhc3MgQToKICAgICAgIHR5cGUgQWxpYXMgPSBOZXN0ZWQKICAgICAgIGNsYXNzIE5lc3RlZDogcGFzcwoKICAgcHJpbnQoQS5BbGlhcy5fX3ZhbHVlX18pICAjIDx0eXBlICdBLk5lc3RlZCc+CgoKQW5ub3RhdGlvbiBzY29wZXMKLS0tLS0tLS0tLS0tLS0tLS0KClR5cGUgcGFyYW1ldGVyIGxpc3RzIGFuZCAidHlwZSIgc3RhdGVtZW50cyBpbnRyb2R1Y2UgKmFubm90YXRpb24Kc2NvcGVzKiwgd2hpY2ggYmVoYXZlIG1vc3RseSBsaWtlIGZ1bmN0aW9uIHNjb3BlcywgYnV0IHdpdGggc29tZQpleGNlcHRpb25zIGRpc2N1c3NlZCBiZWxvdy4gKkFubm90YXRpb25zKiBjdXJyZW50bHkgZG8gbm90IHVzZQphbm5vdGF0aW9uIHNjb3BlcywgYnV0IHRoZXkgYXJlIGV4cGVjdGVkIHRvIHVzZSBhbm5vdGF0aW9uIHNjb3BlcyBpbgpQeXRob24gMy4xMyB3aGVuICoqUEVQIDY0OSoqIGlzIGltcGxlbWVudGVkLgoKQW5ub3RhdGlvbiBzY29wZXMgYXJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBjb250ZXh0czoKCiogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgZm9yIGdlbmVyaWMgdHlwZSBhbGlhc2VzLgoKKiBUeXBlIHBhcmFtZXRlciBsaXN0cyBmb3IgZ2VuZXJpYyBmdW5jdGlvbnMuIEEgZ2VuZXJpYyBmdW5jdGlvbuKAmXMKICBhbm5vdGF0aW9ucyBhcmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBhbm5vdGF0aW9uIHNjb3BlLCBidXQgaXRzCiAgZGVmYXVsdHMgYW5kIGRlY29yYXRvcnMgYXJlIG5vdC4KCiogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgZm9yIGdlbmVyaWMgY2xhc3Nlcy4gQSBnZW5lcmljIGNsYXNz4oCZcyBiYXNlCiAgY2xhc3NlcyBhbmQga2V5d29yZCBhcmd1bWVudHMgYXJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgYW5ub3RhdGlvbgogIHNjb3BlLCBidXQgaXRzIGRlY29yYXRvcnMgYXJlIG5vdC4KCiogVGhlIGJvdW5kcywgY29uc3RyYWludHMsIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAgKGxhemlseSBldmFsdWF0ZWQpLgoKKiBUaGUgdmFsdWUgb2YgdHlwZSBhbGlhc2VzIChsYXppbHkgZXZhbHVhdGVkKS4KCkFubm90YXRpb24gc2NvcGVzIGRpZmZlciBmcm9tIGZ1bmN0aW9uIHNjb3BlcyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CgoqIEFubm90YXRpb24gc2NvcGVzIGhhdmUgYWNjZXNzIHRvIHRoZWlyIGVuY2xvc2luZyBjbGFzcyBuYW1lc3BhY2UuIElmCiAgYW4gYW5ub3RhdGlvbiBzY29wZSBpcyBpbW1lZGlhdGVseSB3aXRoaW4gYSBjbGFzcyBzY29wZSwgb3Igd2l0aGluCiAgYW5vdGhlciBhbm5vdGF0aW9uIHNjb3BlIHRoYXQgaXMgaW1tZWRpYXRlbHkgd2l0aGluIGEgY2xhc3Mgc2NvcGUsCiAgdGhlIGNvZGUgaW4gdGhlIGFubm90YXRpb24gc2NvcGUgY2FuIHVzZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBjbGFzcwogIHNjb3BlIGFzIGlmIGl0IHdlcmUgZXhlY3V0ZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjbGFzcyBib2R5LiBUaGlzCiAgY29udHJhc3RzIHdpdGggcmVndWxhciBmdW5jdGlvbnMgZGVmaW5lZCB3aXRoaW4gY2xhc3Nlcywgd2hpY2gKICBjYW5ub3QgYWNjZXNzIG5hbWVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIHNjb3BlLgoKKiBFeHByZXNzaW9ucyBpbiBhbm5vdGF0aW9uIHNjb3BlcyBjYW5ub3QgY29udGFpbiAieWllbGQiLCAieWllbGQKICBmcm9tIiwgImF3YWl0Iiwgb3IgIjo9IiBleHByZXNzaW9ucy4gKFRoZXNlIGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkCiAgaW4gb3RoZXIgc2NvcGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGFubm90YXRpb24gc2NvcGUuKQoKKiBOYW1lcyBkZWZpbmVkIGluIGFubm90YXRpb24gc2NvcGVzIGNhbm5vdCBiZSByZWJvdW5kIHdpdGggIm5vbmxvY2FsIgogIHN0YXRlbWVudHMgaW4gaW5uZXIgc2NvcGVzLiBUaGlzIGluY2x1ZGVzIG9ubHkgdHlwZSBwYXJhbWV0ZXJzLCBhcwogIG5vIG90aGVyIHN5bnRhY3RpYyBlbGVtZW50cyB0aGF0IGNhbiBhcHBlYXIgd2l0aGluIGFubm90YXRpb24gc2NvcGVzCiAgY2FuIGludHJvZHVjZSBuZXcgbmFtZXMuCgoqIFdoaWxlIGFubm90YXRpb24gc2NvcGVzIGhhdmUgYW4gaW50ZXJuYWwgbmFtZSwgdGhhdCBuYW1lIGlzIG5vdAogIHJlZmxlY3RlZCBpbiB0aGUgKnF1YWxpZmllZCBuYW1lKiBvZiBvYmplY3RzIGRlZmluZWQgd2l0aGluIHRoZQogIHNjb3BlLiBJbnN0ZWFkLCB0aGUgIl9fcXVhbG5hbWVfXyIgb2Ygc3VjaCBvYmplY3RzIGlzIGFzIGlmIHRoZQogIG9iamVjdCB3ZXJlIGRlZmluZWQgaW4gdGhlIGVuY2xvc2luZyBzY29wZS4KCkFkZGVkIGluIHZlcnNpb24gMy4xMjogQW5ub3RhdGlvbiBzY29wZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFB5dGhvbgozLjEyIGFzIHBhcnQgb2YgKipQRVAgNjk1KiouCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogQW5ub3RhdGlvbiBzY29wZXMgYXJlIGFsc28gdXNlZCBmb3IgdHlwZQpwYXJhbWV0ZXIgZGVmYXVsdHMsIGFzIGludHJvZHVjZWQgYnkgKipQRVAgNjk2KiouCgoKTGF6eSBldmFsdWF0aW9uCi0tLS0tLS0tLS0tLS0tLQoKVGhlIHZhbHVlcyBvZiB0eXBlIGFsaWFzZXMgY3JlYXRlZCB0aHJvdWdoIHRoZSAidHlwZSIgc3RhdGVtZW50IGFyZQoqbGF6aWx5IGV2YWx1YXRlZCouIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGJvdW5kcywgY29uc3RyYWludHMsIGFuZApkZWZhdWx0IHZhbHVlcyBvZiB0eXBlIHZhcmlhYmxlcyBjcmVhdGVkIHRocm91Z2ggdGhlIHR5cGUgcGFyYW1ldGVyCnN5bnRheC4gVGhpcyBtZWFucyB0aGF0IHRoZXkgYXJlIG5vdCBldmFsdWF0ZWQgd2hlbiB0aGUgdHlwZSBhbGlhcyBvcgp0eXBlIHZhcmlhYmxlIGlzIGNyZWF0ZWQuIEluc3RlYWQsIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkIHdoZW4gZG9pbmcKc28gaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmUgYW4gYXR0cmlidXRlIGFjY2Vzcy4KCkV4YW1wbGU6CgogICA+Pj4gdHlwZSBBbGlhcyA9IDEvMAogICA+Pj4gQWxpYXMuX192YWx1ZV9fCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAuLi4KICAgWmVyb0RpdmlzaW9uRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8KICAgPj4+IGRlZiBmdW5jW1Q6IDEvMF0oKTogcGFzcwogICA+Pj4gVCA9IGZ1bmMuX190eXBlX3BhcmFtc19fWzBdCiAgID4+PiBULl9fYm91bmRfXwogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgLi4uCiAgIFplcm9EaXZpc2lvbkVycm9yOiBkaXZpc2lvbiBieSB6ZXJvCgpIZXJlIHRoZSBleGNlcHRpb24gaXMgcmFpc2VkIG9ubHkgd2hlbiB0aGUgIl9fdmFsdWVfXyIgYXR0cmlidXRlIG9mCnRoZSB0eXBlIGFsaWFzIG9yIHRoZSAiX19ib3VuZF9fIiBhdHRyaWJ1dGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgaXMKYWNjZXNzZWQuCgpUaGlzIGJlaGF2aW9yIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHJlZmVyZW5jZXMgdG8gdHlwZXMgdGhhdCBoYXZlCm5vdCB5ZXQgYmVlbiBkZWZpbmVkIHdoZW4gdGhlIHR5cGUgYWxpYXMgb3IgdHlwZSB2YXJpYWJsZSBpcyBjcmVhdGVkLgpGb3IgZXhhbXBsZSwgbGF6eSBldmFsdWF0aW9uIGVuYWJsZXMgY3JlYXRpb24gb2YgbXV0dWFsbHkgcmVjdXJzaXZlCnR5cGUgYWxpYXNlczoKCiAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXRlcmFsCgogICB0eXBlIFNpbXBsZUV4cHIgPSBpbnQgfCBQYXJlbnRoZXNpemVkCiAgIHR5cGUgUGFyZW50aGVzaXplZCA9IHR1cGxlW0xpdGVyYWxbIigiXSwgRXhwciwgTGl0ZXJhbFsiKSJdXQogICB0eXBlIEV4cHIgPSBTaW1wbGVFeHByIHwgdHVwbGVbU2ltcGxlRXhwciwgTGl0ZXJhbFsiKyIsICItIl0sIEV4cHJdCgpMYXppbHkgZXZhbHVhdGVkIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGluIGFubm90YXRpb24gc2NvcGUsIHdoaWNoIG1lYW5zCnRoYXQgbmFtZXMgdGhhdCBhcHBlYXIgaW5zaWRlIHRoZSBsYXppbHkgZXZhbHVhdGVkIHZhbHVlIGFyZSBsb29rZWQgdXAKYXMgaWYgdGhleSB3ZXJlIHVzZWQgaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBzY29wZS4KCkFkZGVkIGluIHZlcnNpb24gMy4xMi4KCgpCdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2gKIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzCndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICJpbXBvcnQiCnRoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuCgpUaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9jawppcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyBnbG9iYWwKbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgY2FzZQp0aGUgbW9kdWxl4oCZcyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIl9fbWFpbl9fIgptb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnkKb3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlCiJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4KCgpJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlCnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjoKCiAgIGkgPSAxMAogICBkZWYgZigpOgogICAgICAgcHJpbnQoaSkKICAgaSA9IDQyCiAgIGYoKQoKVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsCmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsCmFuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZAppbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV0KVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8Kb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzCnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC4KCgpFeGNlcHRpb25zCj09PT09PT09PT0KCkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sCm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsCmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpcwpkZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnkKY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZQp0aGUgZXJyb3Igb2NjdXJyZWQuCgpUaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWUKZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvCmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb24KaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiDigKYgImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlCiJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXAKY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW4KZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuCgpQeXRob24gdXNlcyB0aGUg4oCcdGVybWluYXRpb27igJ0gbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvbgpoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXIKbGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZQpmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZQpmcm9tIHRoZSB0b3ApLgoKV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcwpleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluCmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayB0cmFjZWJhY2ssIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXMKIlN5c3RlbUV4aXQiLgoKRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzCnNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZSB0aGUKY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgKm5vbi12aXJ0dWFsIGJhc2UgY2xhc3MqIHRoZXJlb2YuIFRoZQppbnN0YW5jZSBjYW4gYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsCmluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uCgpOb3RlOgoKICBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXIgY29udGVudHMKICBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXQgd2FybmluZwogIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyIG11bHRpcGxlCiAgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgdHJ5CnN0YXRlbWVudCBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LgoKLVsgRm9vdG5vdGVzIF0tCgpbMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2UKICAgIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkLgraCWV4cHJsaXN0c3WLBQAARXhwcmVzc2lvbiBsaXN0cwoqKioqKioqKioqKioqKioqCgogICBzdGFycmVkX2V4cHJlc3Npb24gICAgICAgOjo9IFsiKiJdIG9yX2V4cHIKICAgZmxleGlibGVfZXhwcmVzc2lvbiAgICAgIDo6PSBhc3NpZ25tZW50X2V4cHJlc3Npb24gfCBzdGFycmVkX2V4cHJlc3Npb24KICAgZmxleGlibGVfZXhwcmVzc2lvbl9saXN0IDo6PSBmbGV4aWJsZV9leHByZXNzaW9uICgiLCIgZmxleGlibGVfZXhwcmVzc2lvbikqIFsiLCJdCiAgIHN0YXJyZWRfZXhwcmVzc2lvbl9saXN0ICA6Oj0gc3RhcnJlZF9leHByZXNzaW9uICgiLCIgc3RhcnJlZF9leHByZXNzaW9uKSogWyIsIl0KICAgZXhwcmVzc2lvbl9saXN0ICAgICAgICAgIDo6PSBleHByZXNzaW9uICgiLCIgZXhwcmVzc2lvbikqIFsiLCJdCiAgIHlpZWxkX2xpc3QgICAgICAgICAgICAgICA6Oj0gZXhwcmVzc2lvbl9saXN0IHwgc3RhcnJlZF9leHByZXNzaW9uICIsIiBbc3RhcnJlZF9leHByZXNzaW9uX2xpc3RdCgpFeGNlcHQgd2hlbiBwYXJ0IG9mIGEgbGlzdCBvciBzZXQgZGlzcGxheSwgYW4gZXhwcmVzc2lvbiBsaXN0CmNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNvbW1hIHlpZWxkcyBhIHR1cGxlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGUKaXMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyBpbiB0aGUgbGlzdC4gIFRoZSBleHByZXNzaW9ucyBhcmUKZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC4KCkFuIGFzdGVyaXNrICIqIiBkZW5vdGVzICppdGVyYWJsZSB1bnBhY2tpbmcqLiAgSXRzIG9wZXJhbmQgbXVzdCBiZSBhbgoqaXRlcmFibGUqLiAgVGhlIGl0ZXJhYmxlIGlzIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSBvZiBpdGVtcywgd2hpY2gKYXJlIGluY2x1ZGVkIGluIHRoZSBuZXcgdHVwbGUsIGxpc3QsIG9yIHNldCwgYXQgdGhlIHNpdGUgb2YgdGhlCnVucGFja2luZy4KCkFkZGVkIGluIHZlcnNpb24gMy41OiBJdGVyYWJsZSB1bnBhY2tpbmcgaW4gZXhwcmVzc2lvbiBsaXN0cywKb3JpZ2luYWxseSBwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi4KCkFkZGVkIGluIHZlcnNpb24gMy4xMTogQW55IGl0ZW0gaW4gYW4gZXhwcmVzc2lvbiBsaXN0IG1heSBiZSBzdGFycmVkLgpTZWUgKipQRVAgNjQ2KiouCgpBIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgb25lLWl0ZW0gdHVwbGUsIHN1Y2ggYXMKIjEsIjsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiBBIHNpbmdsZSBleHByZXNzaW9uIHdpdGhvdXQgYQp0cmFpbGluZyBjb21tYSBkb2VzbuKAmXQgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgeWllbGRzIHRoZSB2YWx1ZSBvZgp0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiBlbXB0eSBwYWlyIG9mCnBhcmVudGhlc2VzOiAiKCkiLikK2ghmbG9hdGluZ2GTAwAARmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKioqKioqKioKCkZsb2F0aW5nLXBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsCmRlZmluaXRpb25zOgoKICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXQKICAgcG9pbnRmbG9hdCAgICA6Oj0gW2RpZ2l0cGFydF0gZnJhY3Rpb24gfCBkaWdpdHBhcnQgIi4iCiAgIGV4cG9uZW50ZmxvYXQgOjo9IChkaWdpdHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudAogICBkaWdpdHBhcnQgICAgIDo6PSBkaWdpdCAoWyJfIl0gZGlnaXQpKgogICBmcmFjdGlvbiAgICAgIDo6PSAiLiIgZGlnaXRwYXJ0CiAgIGV4cG9uZW50ICAgICAgOjo9ICgiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIGRpZ2l0cGFydAoKTm90ZSB0aGF0IHRoZSBpbnRlZ2VyIGFuZCBleHBvbmVudCBwYXJ0cyBhcmUgYWx3YXlzIGludGVycHJldGVkIHVzaW5nCnJhZGl4IDEwLiBGb3IgZXhhbXBsZSwgIjA3N2UwMTAiIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXIKYXMgIjc3ZTEwIi4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMgaXMKaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiAgQXMgaW4gaW50ZWdlciBsaXRlcmFscywgdW5kZXJzY29yZXMgYXJlCnN1cHBvcnRlZCBmb3IgZGlnaXQgZ3JvdXBpbmcuCgpTb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nLXBvaW50IGxpdGVyYWxzOgoKICAgMy4xNCAgICAxMC4gICAgLjAwMSAgICAxZTEwMCAgICAzLjE0ZS0xMCAgICAwZTAgICAgMy4xNF8xNV85MwoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogVW5kZXJzY29yZXMgYXJlIG5vdyBhbGxvd2VkIGZvciBncm91cGluZwpwdXJwb3NlcyBpbiBsaXRlcmFscy4K2gNmb3J1JQcAAFRoZSAiZm9yIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKgoKVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZQooc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OgoKICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgYCFzdGFycmVkX2xpc3RgICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCgpUaGUgInN0YXJyZWRfbGlzdCIgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuCippdGVyYWJsZSogb2JqZWN0LiAgQW4gKml0ZXJhdG9yKiBpcyBjcmVhdGVkIGZvciB0aGF0IGl0ZXJhYmxlLiBUaGUKZmlyc3QgaXRlbSBwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IgaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0Cmxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBhc3NpZ25tZW50cyAoc2VlIEFzc2lnbm1lbnQKc3RhdGVtZW50cyksIGFuZCB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBUaGlzIHJlcGVhdHMgZm9yIGVhY2ggaXRlbQpwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IuICBXaGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQsIHRoZSBzdWl0ZQppbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcAp0ZXJtaW5hdGVzLgoKQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcAp3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZeKAmXMgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50CmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGNvbnRpbnVlcwp3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dAppdGVtLgoKVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHRhcmdldCBsaXN0LgpUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmcKdGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOgoKICAgZm9yIGkgaW4gcmFuZ2UoMTApOgogICAgICAgcHJpbnQoaSkKICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlCgpOYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsCmJ1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0CmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiB0eXBlICJyYW5nZSgpIiByZXByZXNlbnRzCmltbXV0YWJsZSBhcml0aG1ldGljIHNlcXVlbmNlcyBvZiBpbnRlZ2Vycy4gRm9yIGluc3RhbmNlLCBpdGVyYXRpbmcKInJhbmdlKDMpIiBzdWNjZXNzaXZlbHkgeWllbGRzIDAsIDEsIGFuZCB0aGVuIDIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogU3RhcnJlZCBlbGVtZW50cyBhcmUgbm93IGFsbG93ZWQgaW4gdGhlCmV4cHJlc3Npb24gbGlzdC4K2g1mb3JtYXRzdHJpbmdzdR5rAABGb3JtYXQgc3RyaW5nIHN5bnRheAoqKioqKioqKioqKioqKioqKioqKgoKVGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBhbmQgdGhlICJGb3JtYXR0ZXIiIGNsYXNzIHNoYXJlIHRoZSBzYW1lCnN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mICJGb3JtYXR0ZXIiLApzdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4gIFRoZSBzeW50YXggaXMKcmVsYXRlZCB0byB0aGF0IG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMsIGJ1dCBpdCBpcyBsZXNzCnNvcGhpc3RpY2F0ZWQgYW5kLCBpbiBwYXJ0aWN1bGFyLCBkb2VzIG5vdCBzdXBwb3J0IGFyYml0cmFyeQpleHByZXNzaW9ucy4KCkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4g4oCccmVwbGFjZW1lbnQgZmllbGRz4oCdIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzCiJ7fSIuIEFueXRoaW5nIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBicmFjZXMgaXMgY29uc2lkZXJlZCBsaXRlcmFsCnRleHQsIHdoaWNoIGlzIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4gIElmIHlvdSBuZWVkIHRvIGluY2x1ZGUKYSBicmFjZSBjaGFyYWN0ZXIgaW4gdGhlIGxpdGVyYWwgdGV4dCwgaXQgY2FuIGJlIGVzY2FwZWQgYnkgZG91Ymxpbmc6CiJ7eyIgYW5kICJ9fSIuCgpUaGUgZ3JhbW1hciBmb3IgYSByZXBsYWNlbWVudCBmaWVsZCBpcyBhcyBmb2xsb3dzOgoKICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiBjb252ZXJzaW9uXSBbIjoiIGZvcm1hdF9zcGVjXSAifSIKICAgZmllbGRfbmFtZSAgICAgICAgOjo9IGFyZ19uYW1lICgiLiIgYXR0cmlidXRlX25hbWUgfCAiWyIgZWxlbWVudF9pbmRleCAiXSIpKgogICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBkaWdpdCtdCiAgIGF0dHJpYnV0ZV9uYW1lICAgIDo6PSBpZGVudGlmaWVyCiAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBkaWdpdCsgfCBpbmRleF9zdHJpbmcKICAgaW5kZXhfc3RyaW5nICAgICAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIl0iPiArCiAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyIgfCAiYSIKICAgZm9ybWF0X3NwZWMgICAgICAgOjo9IGZvcm1hdC1zcGVjOmZvcm1hdF9zcGVjCgpJbiBsZXNzIGZvcm1hbCB0ZXJtcywgdGhlIHJlcGxhY2VtZW50IGZpZWxkIGNhbiBzdGFydCB3aXRoIGEKKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkCmFuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgZmllbGQuIFRoZQoqZmllbGRfbmFtZSogaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICAqY29udmVyc2lvbiogZmllbGQsIHdoaWNoIGlzCnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50ICInISciLCBhbmQgYSAqZm9ybWF0X3NwZWMqLCB3aGljaCBpcwpwcmVjZWRlZCBieSBhIGNvbG9uICInOiciLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IGZvcm1hdCBmb3IgdGhlCnJlcGxhY2VtZW50IHZhbHVlLgoKU2VlIGFsc28gdGhlIEZvcm1hdCBzcGVjaWZpY2F0aW9uIG1pbmktbGFuZ3VhZ2Ugc2VjdGlvbi4KClRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYQpudW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXTigJlzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSBwb3NpdGlvbmFsCmFyZ3VtZW50LCBhbmQgaWYgaXTigJlzIGEga2V5d29yZCwgaXQgcmVmZXJzIHRvIGEgbmFtZWQga2V5d29yZAphcmd1bWVudC4gQW4gKmFyZ19uYW1lKiBpcyB0cmVhdGVkIGFzIGEgbnVtYmVyIGlmIGEgY2FsbCB0bwoic3RyLmlzZGVjaW1hbCgpIiBvbiB0aGUgc3RyaW5nIHdvdWxkIHJldHVybiB0cnVlLiBJZiB0aGUgbnVtZXJpY2FsCmFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgYXJlIDAsIDEsIDIsIOKApiBpbiBzZXF1ZW5jZSwgdGhleSBjYW4gYWxsCmJlIG9taXR0ZWQgKG5vdCBqdXN0IHNvbWUpIGFuZCB0aGUgbnVtYmVycyAwLCAxLCAyLCDigKYgd2lsbCBiZQphdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoYXQgb3JkZXIuIEJlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtCmRlbGltaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cwooZS5nLiwgdGhlIHN0cmluZ3MgIicxMCciIG9yICInOi1dJyIpIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZQoqYXJnX25hbWUqIGNhbiBiZSBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIGluZGV4IG9yIGF0dHJpYnV0ZQpleHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAiJy5uYW1lJyIgc2VsZWN0cyB0aGUgbmFtZWQKYXR0cmlidXRlIHVzaW5nICJnZXRhdHRyKCkiLCB3aGlsZSBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtCiInW2luZGV4XSciIGRvZXMgYW4gaW5kZXggbG9va3VwIHVzaW5nICJfX2dldGl0ZW1fXygpIi4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlCm9taXR0ZWQgZm9yICJzdHIuZm9ybWF0KCkiLCBzbyAiJ3t9IHt9Jy5mb3JtYXQoYSwgYikiIGlzIGVxdWl2YWxlbnQgdG8KIid7MH0gezF9Jy5mb3JtYXQoYSwgYikiLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVycyBjYW4gYmUKb21pdHRlZCBmb3IgIkZvcm1hdHRlciIuCgpTb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOgoKICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgICMgUmVmZXJlbmNlcyBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50CiAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0bHkgcmVmZXJlbmNlcyB0aGUgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudAogICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzICJGcm9tIHswfSB0byB7MX0iCiAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICAjIFJlZmVyZW5jZXMga2V5d29yZCBhcmd1bWVudCAnbmFtZScKICAgIldlaWdodCBpbiB0b25zIHswLndlaWdodH0iICAgICAgICMgJ3dlaWdodCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnCiAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICAjIEZpcnN0IGVsZW1lbnQgb2Yga2V5d29yZCBhcmd1bWVudCAncGxheWVycycuCgpUaGUgKmNvbnZlcnNpb24qIGZpZWxkIGNhdXNlcyBhIHR5cGUgY29lcmNpb24gYmVmb3JlIGZvcm1hdHRpbmcuCk5vcm1hbGx5LCB0aGUgam9iIG9mIGZvcm1hdHRpbmcgYSB2YWx1ZSBpcyBkb25lIGJ5IHRoZSAiX19mb3JtYXRfXygpIgptZXRob2Qgb2YgdGhlIHZhbHVlIGl0c2VsZi4gIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgaXQgaXMgZGVzaXJhYmxlIHRvCmZvcmNlIGEgdHlwZSB0byBiZSBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcsIG92ZXJyaWRpbmcgaXRzIG93bgpkZWZpbml0aW9uIG9mIGZvcm1hdHRpbmcuICBCeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmUKY2FsbGluZyAiX19mb3JtYXRfXygpIiwgdGhlIG5vcm1hbCBmb3JtYXR0aW5nIGxvZ2ljIGlzIGJ5cGFzc2VkLgoKVGhyZWUgY29udmVyc2lvbiBmbGFncyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogIichcyciIHdoaWNoIGNhbGxzCiJzdHIoKSIgb24gdGhlIHZhbHVlLCAiJyFyJyIgd2hpY2ggY2FsbHMgInJlcHIoKSIgYW5kICInIWEnIiB3aGljaApjYWxscyAiYXNjaWkoKSIuCgpTb21lIGV4YW1wbGVzOgoKICAgIkhhcm9sZCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3QKICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0CiAgICJNb3JlIHshYX0iICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbHMgYXNjaWkoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3QKClRoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlIHZhbHVlCnNob3VsZCBiZSBwcmVzZW50ZWQsIGluY2x1ZGluZyBzdWNoIGRldGFpbHMgYXMgZmllbGQgd2lkdGgsIGFsaWdubWVudCwKcGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiBkZWZpbmUgaXRzCm93biDigJxmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2XigJ0gb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlICpmb3JtYXRfc3BlYyouCgpNb3N0IGJ1aWx0LWluIHR5cGVzIHN1cHBvcnQgYSBjb21tb24gZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlLCB3aGljaAppcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KCkEgKmZvcm1hdF9zcGVjKiBmaWVsZCBjYW4gYWxzbyBpbmNsdWRlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMKd2l0aGluIGl0LiBUaGVzZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzIG1heSBjb250YWluIGEgZmllbGQgbmFtZSwKY29udmVyc2lvbiBmbGFnIGFuZCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGRlZXBlciBuZXN0aW5nIGlzIG5vdAphbGxvd2VkLiAgVGhlIHJlcGxhY2VtZW50IGZpZWxkcyB3aXRoaW4gdGhlIGZvcm1hdF9zcGVjIGFyZQpzdWJzdGl0dXRlZCBiZWZvcmUgdGhlICpmb3JtYXRfc3BlYyogc3RyaW5nIGlzIGludGVycHJldGVkLiBUaGlzCmFsbG93cyB0aGUgZm9ybWF0dGluZyBvZiBhIHZhbHVlIHRvIGJlIGR5bmFtaWNhbGx5IHNwZWNpZmllZC4KClNlZSB0aGUgRm9ybWF0IGV4YW1wbGVzIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuCgoKRm9ybWF0IHNwZWNpZmljYXRpb24gbWluaS1sYW5ndWFnZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgrigJxGb3JtYXQgc3BlY2lmaWNhdGlvbnPigJ0gYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWQKd2l0aGluIGEgZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSBwcmVzZW50ZWQKKHNlZSBGb3JtYXQgc3RyaW5nIHN5bnRheCBhbmQgZi1zdHJpbmdzKS4gVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQKZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluICJmb3JtYXQoKSIgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUKbWF5IGRlZmluZSBob3cgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIHRvIGJlIGludGVycHJldGVkLgoKTW9zdCBidWlsdC1pbiB0eXBlcyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZvciBmb3JtYXQKc3BlY2lmaWNhdGlvbnMsIGFsdGhvdWdoIHNvbWUgb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBhcmUgb25seQpzdXBwb3J0ZWQgYnkgdGhlIG51bWVyaWMgdHlwZXMuCgpBIGdlbmVyYWwgY29udmVudGlvbiBpcyB0aGF0IGFuIGVtcHR5IGZvcm1hdCBzcGVjaWZpY2F0aW9uIHByb2R1Y2VzCnRoZSBzYW1lIHJlc3VsdCBhcyBpZiB5b3UgaGFkIGNhbGxlZCAic3RyKCkiIG9uIHRoZSB2YWx1ZS4gQSBub24tZW1wdHkKZm9ybWF0IHNwZWNpZmljYXRpb24gdHlwaWNhbGx5IG1vZGlmaWVzIHRoZSByZXN1bHQuCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOgoKICAgZm9ybWF0X3NwZWMgOjo9IFtvcHRpb25zXVt3aWR0aF1bZ3JvdXBpbmddWyIuIiBwcmVjaXNpb25dW3R5cGVdCiAgIG9wdGlvbnMgICAgIDo6PSBbW2ZpbGxdYWxpZ25dW3NpZ25dWyJ6Il1bIiMiXVsiMCJdCiAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj4KICAgYWxpZ24gICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIgogICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiCiAgIHdpZHRoICAgICAgIDo6PSBkaWdpdCsKICAgZ3JvdXBpbmcgICAgOjo9ICIsIiB8ICJfIgogICBwcmVjaXNpb24gICA6Oj0gZGlnaXQrCiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIKICAgICAgICAgICAgICAgICAgIHwgIkciIHwgIm4iIHwgIm8iIHwgInMiIHwgIngiIHwgIlgiIHwgIiUiCgpJZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSAqZmlsbCoKY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgaWYKb21pdHRlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgKOKAnSJ7IuKAnSBvcgrigJwifSLigJ0pIGFzIHRoZSAqZmlsbCogY2hhcmFjdGVyIGluIGEgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsIG9yIHdoZW4KdXNpbmcgdGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGluc2VydCBhCmN1cmx5IGJyYWNlIHdpdGggYSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGQuICBUaGlzIGxpbWl0YXRpb24gZG9lc27igJl0CmFmZmVjdCB0aGUgImZvcm1hdCgpIiBmdW5jdGlvbi4KClRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzIGZvbGxvd3M6CgorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8ICInPCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgbGVmdC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgfAp8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBtb3N0IG9iamVjdHMpLiAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICInPiciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgfAp8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBudW1iZXJzKS4gICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICInPSciICAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgdGhlIHNpZ24gKGlmIGFueSkgICAgfAp8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgZmllbGRzICAgfAp8ICAgICAgICAgICB8IGluIHRoZSBmb3JtIOKAmCswMDAwMDAxMjDigJkuIFRoaXMgYWxpZ25tZW50IG9wdGlvbiBpcyBvbmx5ICAgIHwKfCAgICAgICAgICAgfCB2YWxpZCBmb3IgbnVtZXJpYyB0eXBlcywgZXhjbHVkaW5nICJjb21wbGV4Ii4gSXQgYmVjb21lcyAgIHwKfCAgICAgICAgICAgfCB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycyB3aGVuIOKAmDDigJkgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlICB8CnwgICAgICAgICAgIHwgZmllbGQgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIideJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgICAgICB8CnwgICAgICAgICAgIHwgc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpOb3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgZmllbGQgd2lkdGgKd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZGF0YSB0byBmaWxsIGl0LCBzbyB0aGF0IHRoZQphbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS4KClRoZSAqc2lnbiogb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIG51bWJlciB0eXBlcywgYW5kIGNhbiBiZSBvbmUgb2YKdGhlIGZvbGxvd2luZzoKCistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw9PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CnwgIicrJyIgICAgIHwgSW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIGZvciBib3RoIHBvc2l0aXZlIGFzICB8CnwgICAgICAgICAgIHwgd2VsbCBhcyBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIictJyIgICAgIHwgSW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG5lZ2F0aXZlICAgICB8CnwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgc3BhY2UgICAgIHwgSW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSB1c2VkIG9uIHBvc2l0aXZlICB8CnwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICB8CistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpUaGUgIid6JyIgb3B0aW9uIGNvZXJjZXMgbmVnYXRpdmUgemVybyBmbG9hdGluZy1wb2ludCB2YWx1ZXMgdG8KcG9zaXRpdmUgemVybyBhZnRlciByb3VuZGluZyB0byB0aGUgZm9ybWF0IHByZWNpc2lvbi4gIFRoaXMgb3B0aW9uIGlzCm9ubHkgdmFsaWQgZm9yIGZsb2F0aW5nLXBvaW50IHByZXNlbnRhdGlvbiB0eXBlcy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjExOiBBZGRlZCB0aGUgIid6JyIgb3B0aW9uIChzZWUgYWxzbyAqKlBFUAo2ODIqKikuCgpUaGUgIicjJyIgb3B0aW9uIGNhdXNlcyB0aGUg4oCcYWx0ZXJuYXRlIGZvcm3igJ0gdG8gYmUgdXNlZCBmb3IgdGhlCmNvbnZlcnNpb24uICBUaGUgYWx0ZXJuYXRlIGZvcm0gaXMgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgZGlmZmVyZW50CnR5cGVzLiAgVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlciwgZmxvYXQgYW5kIGNvbXBsZXgKdHlwZXMuIEZvciBpbnRlZ2Vycywgd2hlbiBiaW5hcnksIG9jdGFsLCBvciBoZXhhZGVjaW1hbCBvdXRwdXQgaXMKdXNlZCwgdGhpcyBvcHRpb24gYWRkcyB0aGUgcmVzcGVjdGl2ZSBwcmVmaXggIicwYiciLCAiJzBvJyIsICInMHgnIiwKb3IgIicwWCciIHRvIHRoZSBvdXRwdXQgdmFsdWUuIEZvciBmbG9hdCBhbmQgY29tcGxleCB0aGUgYWx0ZXJuYXRlCmZvcm0gY2F1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gdG8gYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsLQpwb2ludCBjaGFyYWN0ZXIsIGV2ZW4gaWYgbm8gZGlnaXRzIGZvbGxvdyBpdC4gTm9ybWFsbHksIGEgZGVjaW1hbC0KcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHJlc3VsdCBvZiB0aGVzZSBjb252ZXJzaW9ucyBvbmx5IGlmIGEKZGlnaXQgZm9sbG93cyBpdC4gSW4gYWRkaXRpb24sIGZvciAiJ2cnIiBhbmQgIidHJyIgY29udmVyc2lvbnMsCnRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHQuCgpUaGUgKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSB0b3RhbCBmaWVsZAp3aWR0aCwgaW5jbHVkaW5nIGFueSBwcmVmaXhlcywgc2VwYXJhdG9ycywgYW5kIG90aGVyIGZvcm1hdHRpbmcKY2hhcmFjdGVycy4gSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkCmJ5IHRoZSBjb250ZW50LgoKV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSBhCnplcm8gKCInMCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyBmb3IgbnVtZXJpYwp0eXBlcywgZXhjbHVkaW5nICJjb21wbGV4Ii4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhICpmaWxsKiBjaGFyYWN0ZXIKb2YgIicwJyIgd2l0aCBhbiAqYWxpZ25tZW50KiB0eXBlIG9mICInPSciLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTA6IFByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSAiJzAnIiBubwpsb25nZXIgYWZmZWN0cyB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHN0cmluZ3MuCgpUaGUgKmdyb3VwaW5nKiBvcHRpb24gYWZ0ZXIgdGhlICp3aWR0aCogZmllbGQgc3BlY2lmaWVzIGEgZGlnaXQgZ3JvdXAKc2VwYXJhdG9yIGZvciB0aGUgaW50ZWdyYWwgcGFydCBvZiBhIG51bWJlci4gSXQgY2FuIGJlIG9uZSBvZiB0aGUKZm9sbG93aW5nOgoKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfD09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKfCAiJywnIiAgICAgfCBJbnNlcnRzIGEgY29tbWEgZXZlcnkgMyBkaWdpdHMgZm9yIGludGVnZXIgcHJlc2VudGF0aW9uICAgIHwKfCAgICAgICAgICAgfCB0eXBlICInZCciIGFuZCBmbG9hdGluZy1wb2ludCBwcmVzZW50YXRpb24gdHlwZXMsICAgICAgICAgIHwKfCAgICAgICAgICAgfCBleGNsdWRpbmcgIiduJyIuIEZvciBvdGhlciBwcmVzZW50YXRpb24gdHlwZXMsIHRoaXMgb3B0aW9uIHwKfCAgICAgICAgICAgfCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiJ18nIiAgICAgfCBJbnNlcnRzIGFuIHVuZGVyc2NvcmUgZXZlcnkgMyBkaWdpdHMgZm9yIGludGVnZXIgICAgICAgICAgIHwKfCAgICAgICAgICAgfCBwcmVzZW50YXRpb24gdHlwZSAiJ2QnIiBhbmQgZmxvYXRpbmctcG9pbnQgcHJlc2VudGF0aW9uICAgIHwKfCAgICAgICAgICAgfCB0eXBlcywgZXhjbHVkaW5nICInbiciLiBGb3IgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgICAgIHwKfCAgICAgICAgICAgfCAiJ2InIiwgIidvJyIsICIneCciLCBhbmQgIidYJyIsIHVuZGVyc2NvcmVzIGFyZSBpbnNlcnRlZCAgIHwKfCAgICAgICAgICAgfCBldmVyeSA0IGRpZ2l0cy4gRm9yIG90aGVyIHByZXNlbnRhdGlvbiB0eXBlcywgdGhpcyBvcHRpb24gIHwKfCAgICAgICAgICAgfCBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCkZvciBhIGxvY2FsZSBhd2FyZSBzZXBhcmF0b3IsIHVzZSB0aGUgIiduJyIgcHJlc2VudGF0aW9uIHR5cGUgaW5zdGVhZC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IEFkZGVkIHRoZSAiJywnIiBvcHRpb24gKHNlZSBhbHNvICoqUEVQIDM3OCoqKS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjY6IEFkZGVkIHRoZSAiJ18nIiBvcHRpb24gKHNlZSBhbHNvICoqUEVQIDUxNSoqKS4KClRoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBpbmRpY2F0aW5nIGhvdyBtYW55IGRpZ2l0cyBzaG91bGQKYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBwcmVzZW50YXRpb24gdHlwZXMgIidmJyIgYW5kCiInRiciLCBvciBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBwcmVzZW50YXRpb24gdHlwZXMKIidnJyIgb3IgIidHJyIuICBGb3Igc3RyaW5nIHByZXNlbnRhdGlvbiB0eXBlcyB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZQptYXhpbXVtIGZpZWxkIHNpemUgLSBpbiBvdGhlciB3b3JkcywgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQKZnJvbSB0aGUgZmllbGQgY29udGVudC4gIFRoZSAqcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlcgpwcmVzZW50YXRpb24gdHlwZXMuCgpGaW5hbGx5LCB0aGUgKnR5cGUqIGRldGVybWluZXMgaG93IHRoZSBkYXRhIHNob3VsZCBiZSBwcmVzZW50ZWQuCgpUaGUgYXZhaWxhYmxlIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgYXJlOgoKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgfD09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgfCAiJ3MnIiAgICAgfCBTdHJpbmcgZm9ybWF0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHN0cmluZ3MgYW5kICAgIHwKICAgfCAgICAgICAgICAgfCBtYXkgYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiJ3MnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKClRoZSBhdmFpbGFibGUgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgYXJlOgoKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgfD09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgfCAiJ2InIiAgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAyLiAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ2MnIiAgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSBjb3JyZXNwb25kaW5nICAgICAgIHwKICAgfCAgICAgICAgICAgfCB1bmljb2RlIGNoYXJhY3RlciBiZWZvcmUgcHJpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ2QnIiAgICAgfCBEZWNpbWFsIEludGVnZXIuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDEwLiAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ28nIiAgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDguICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ3gnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgbG93ZXItICAgIHwKICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ1gnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgdXBwZXItICAgIHwKICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gSW4gY2FzZSAiJyMnIiBpcyAgICAgIHwKICAgfCAgICAgICAgICAgfCBzcGVjaWZpZWQsIHRoZSBwcmVmaXggIicweCciIHdpbGwgYmUgdXBwZXItY2FzZWQgdG8gIicwWCciIHwKICAgfCAgICAgICAgICAgfCBhcyB3ZWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ24nIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIidkJyIsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHwKICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgZGlnaXQgICAgIHwKICAgfCAgICAgICAgICAgfCBncm91cCBzZXBhcmF0b3JzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiJ2QnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCkluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBwcmVzZW50YXRpb24gdHlwZXMsIGludGVnZXJzIGNhbiBiZSBmb3JtYXR0ZWQKd2l0aCB0aGUgZmxvYXRpbmctcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAoZXhjZXB0ICInbiciCmFuZCAiTm9uZSIpLiBXaGVuIGRvaW5nIHNvLCAiZmxvYXQoKSIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBpbnRlZ2VyCnRvIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJlZm9yZSBmb3JtYXR0aW5nLgoKVGhlIGF2YWlsYWJsZSBwcmVzZW50YXRpb24gdHlwZXMgZm9yICJmbG9hdCIgYW5kICJEZWNpbWFsIiB2YWx1ZXMgYXJlOgoKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgfD09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKICAgfCAiJ2UnIiAgICAgfCBTY2llbnRpZmljIG5vdGF0aW9uLiBGb3IgYSBnaXZlbiBwcmVjaXNpb24gInAiLCBmb3JtYXRzICAgIHwKICAgfCAgICAgICAgICAgfCB0aGUgbnVtYmVyIGluIHNjaWVudGlmaWMgbm90YXRpb24gd2l0aCB0aGUgbGV0dGVyIOKAmGXigJkgICAgICB8CiAgIHwgICAgICAgICAgIHwgc2VwYXJhdGluZyB0aGUgY29lZmZpY2llbnQgZnJvbSB0aGUgZXhwb25lbnQuIFRoZSAgICAgICAgICB8CiAgIHwgICAgICAgICAgIHwgY29lZmZpY2llbnQgaGFzIG9uZSBkaWdpdCBiZWZvcmUgYW5kICJwIiBkaWdpdHMgYWZ0ZXIgdGhlICB8CiAgIHwgICAgICAgICAgIHwgZGVjaW1hbCBwb2ludCwgZm9yIGEgdG90YWwgb2YgInAgKyAxIiBzaWduaWZpY2FudCBkaWdpdHMuICB8CiAgIHwgICAgICAgICAgIHwgV2l0aCBubyBwcmVjaXNpb24gZ2l2ZW4sIHVzZXMgYSBwcmVjaXNpb24gb2YgIjYiIGRpZ2l0cyAgICB8CiAgIHwgICAgICAgICAgIHwgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yICJmbG9hdCIsIGFuZCBzaG93cyBhbGwgICAgICAgICB8CiAgIHwgICAgICAgICAgIHwgY29lZmZpY2llbnQgZGlnaXRzIGZvciAiRGVjaW1hbCIuICBJZiAicD0wIiwgdGhlIGRlY2ltYWwgICB8CiAgIHwgICAgICAgICAgIHwgcG9pbnQgaXMgb21pdHRlZCB1bmxlc3MgdGhlICIjIiBvcHRpb24gaXMgdXNlZC4gIEZvciAgICAgICB8CiAgIHwgICAgICAgICAgIHwgImZsb2F0IiwgdGhlIGV4cG9uZW50IGFsd2F5cyBjb250YWlucyBhdCBsZWFzdCB0d28gZGlnaXRzLCB8CiAgIHwgICAgICAgICAgIHwgYW5kIGlzIHplcm8gaWYgdGhlIHZhbHVlIGlzIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIidFJyIgICAgIHwgU2NpZW50aWZpYyBub3RhdGlvbi4gU2FtZSBhcyAiJ2UnIiBleGNlcHQgaXQgdXNlcyBhbiB1cHBlciB8CiAgIHwgICAgICAgICAgIHwgY2FzZSDigJhF4oCZIGFzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInZiciICAgICB8IEZpeGVkLXBvaW50IG5vdGF0aW9uLiBGb3IgYSBnaXZlbiBwcmVjaXNpb24gInAiLCBmb3JtYXRzICAgfAogICB8ICAgICAgICAgICB8IHRoZSBudW1iZXIgYXMgYSBkZWNpbWFsIG51bWJlciB3aXRoIGV4YWN0bHkgInAiIGRpZ2l0cyAgICAgfAogICB8ICAgICAgICAgICB8IGZvbGxvd2luZyB0aGUgZGVjaW1hbCBwb2ludC4gV2l0aCBubyBwcmVjaXNpb24gZ2l2ZW4sIHVzZXMgfAogICB8ICAgICAgICAgICB8IGEgcHJlY2lzaW9uIG9mICI2IiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yICAgICAgfAogICB8ICAgICAgICAgICB8ICJmbG9hdCIsIGFuZCB1c2VzIGEgcHJlY2lzaW9uIGxhcmdlIGVub3VnaCB0byBzaG93IGFsbCAgICAgfAogICB8ICAgICAgICAgICB8IGNvZWZmaWNpZW50IGRpZ2l0cyBmb3IgIkRlY2ltYWwiLiAgSWYgInA9MCIsIHRoZSBkZWNpbWFsICAgfAogICB8ICAgICAgICAgICB8IHBvaW50IGlzIG9taXR0ZWQgdW5sZXNzIHRoZSAiIyIgb3B0aW9uIGlzIHVzZWQuICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInRiciICAgICB8IEZpeGVkLXBvaW50IG5vdGF0aW9uLiBTYW1lIGFzICInZiciLCBidXQgY29udmVydHMgIm5hbiIgdG8gfAogICB8ICAgICAgICAgICB8ICJOQU4iIGFuZCAiaW5mIiB0byAiSU5GIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInZyciICAgICB8IEdlbmVyYWwgZm9ybWF0LiAgRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICJwID49IDEiLCB0aGlzICAgICAgfAogICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvICJwIiBzaWduaWZpY2FudCBkaWdpdHMgYW5kIHRoZW4gICAgICAgfAogICB8ICAgICAgICAgICB8IGZvcm1hdHMgdGhlIHJlc3VsdCBpbiBlaXRoZXIgZml4ZWQtcG9pbnQgZm9ybWF0IG9yIGluICAgICAgfAogICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24sIGRlcGVuZGluZyBvbiBpdHMgbWFnbml0dWRlLiBBICAgICAgICAgfAogICB8ICAgICAgICAgICB8IHByZWNpc2lvbiBvZiAiMCIgaXMgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGEgcHJlY2lzaW9uICAgfAogICB8ICAgICAgICAgICB8IG9mICIxIi4gIFRoZSBwcmVjaXNlIHJ1bGVzIGFyZSBhcyBmb2xsb3dzOiBzdXBwb3NlIHRoYXQgICAgfAogICB8ICAgICAgICAgICB8IHRoZSByZXN1bHQgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIidlJyIgYW5kICAgICAgfAogICB8ICAgICAgICAgICB8IHByZWNpc2lvbiAicC0xIiB3b3VsZCBoYXZlIGV4cG9uZW50ICJleHAiLiAgVGhlbiwgaWYgIm0gPD0gfAogICB8ICAgICAgICAgICB8IGV4cCA8IHAiLCB3aGVyZSAibSIgaXMgLTQgZm9yIGZsb2F0cyBhbmQgLTYgZm9yICAgICAgICAgICAgfAogICB8ICAgICAgICAgICB8ICJEZWNpbWFscyIsIHRoZSBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgfAogICB8ICAgICAgICAgICB8ICInZiciIGFuZCBwcmVjaXNpb24gInAtMS1leHAiLiAgT3RoZXJ3aXNlLCB0aGUgbnVtYmVyIGlzICAgfAogICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICInZSciIGFuZCBwcmVjaXNpb24gICAgICAgfAogICB8ICAgICAgICAgICB8ICJwLTEiLiBJbiBib3RoIGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlICAgICAgfAogICB8ICAgICAgICAgICB8IHJlbW92ZWQgZnJvbSB0aGUgc2lnbmlmaWNhbmQsIGFuZCB0aGUgZGVjaW1hbCBwb2ludCBpcyAgICAgfAogICB8ICAgICAgICAgICB8IGFsc28gcmVtb3ZlZCBpZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGRpZ2l0cyBmb2xsb3dpbmcgICAgfAogICB8ICAgICAgICAgICB8IGl0LCB1bmxlc3MgdGhlICInIyciIG9wdGlvbiBpcyB1c2VkLiAgV2l0aCBubyBwcmVjaXNpb24gICAgfAogICB8ICAgICAgICAgICB8IGdpdmVuLCB1c2VzIGEgcHJlY2lzaW9uIG9mICI2IiBzaWduaWZpY2FudCBkaWdpdHMgZm9yICAgICAgfAogICB8ICAgICAgICAgICB8ICJmbG9hdCIuIEZvciAiRGVjaW1hbCIsIHRoZSBjb2VmZmljaWVudCBvZiB0aGUgcmVzdWx0IGlzICAgfAogICB8ICAgICAgICAgICB8IGZvcm1lZCBmcm9tIHRoZSBjb2VmZmljaWVudCBkaWdpdHMgb2YgdGhlIHZhbHVlOyAgICAgICAgICAgfAogICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24gaXMgdXNlZCBmb3IgdmFsdWVzIHNtYWxsZXIgdGhhbiAiMWUtNiIgfAogICB8ICAgICAgICAgICB8IGluIGFic29sdXRlIHZhbHVlIGFuZCB2YWx1ZXMgd2hlcmUgdGhlIHBsYWNlIHZhbHVlIG9mIHRoZSAgfAogICB8ICAgICAgICAgICB8IGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0IGlzIGxhcmdlciB0aGFuIDEsIGFuZCBmaXhlZC1wb2ludCAgfAogICB8ICAgICAgICAgICB8IG5vdGF0aW9uIGlzIHVzZWQgb3RoZXJ3aXNlLiAgUG9zaXRpdmUgYW5kIG5lZ2F0aXZlICAgICAgICAgfAogICB8ICAgICAgICAgICB8IGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVybywgYW5kIG5hbnMsIGFyZSAgICAgICAgfAogICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCBhcyAiaW5mIiwgIi1pbmYiLCAiMCIsICItMCIgYW5kICJuYW4iICAgICAgICAgICAgfAogICB8ICAgICAgICAgICB8IHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgcHJlY2lzaW9uLiAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInRyciICAgICB8IEdlbmVyYWwgZm9ybWF0LiBTYW1lIGFzICInZyciIGV4Y2VwdCBzd2l0Y2hlcyB0byAiJ0UnIiBpZiAgfAogICB8ICAgICAgICAgICB8IHRoZSBudW1iZXIgZ2V0cyB0b28gbGFyZ2UuIFRoZSByZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHkgfAogICB8ICAgICAgICAgICB8IGFuZCBOYU4gYXJlIHVwcGVyY2FzZWQsIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInbiciICAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyAiJ2cnIiwgZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgfAogICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBkaWdpdCAgICAgfAogICB8ICAgICAgICAgICB8IGdyb3VwIHNlcGFyYXRvcnMgZm9yIHRoZSBpbnRlZ3JhbCBwYXJ0IG9mIGEgbnVtYmVyLiAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInJSciICAgICB8IFBlcmNlbnRhZ2UuIE11bHRpcGxpZXMgdGhlIG51bWJlciBieSAxMDAgYW5kIGRpc3BsYXlzIGluICAgfAogICB8ICAgICAgICAgICB8IGZpeGVkICgiJ2YnIikgZm9ybWF0LCBmb2xsb3dlZCBieSBhIHBlcmNlbnQgc2lnbi4gICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8IE5vbmUgICAgICB8IEZvciAiZmxvYXQiIHRoaXMgaXMgbGlrZSB0aGUgIidnJyIgdHlwZSwgZXhjZXB0IHRoYXQgd2hlbiAgfAogICB8ICAgICAgICAgICB8IGZpeGVkLSBwb2ludCBub3RhdGlvbiBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgcmVzdWx0LCBpdCAgICAgfAogICB8ICAgICAgICAgICB8IGFsd2F5cyBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgZGlnaXQgcGFzdCB0aGUgZGVjaW1hbCBwb2ludCwgfAogICB8ICAgICAgICAgICB8IGFuZCBzd2l0Y2hlcyB0byB0aGUgc2NpZW50aWZpYyBub3RhdGlvbiB3aGVuICJleHAgPj0gcCAtICAgfAogICB8ICAgICAgICAgICB8IDEiLiAgV2hlbiB0aGUgcHJlY2lzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBsYXR0ZXIgd2lsbCAgfAogICB8ICAgICAgICAgICB8IGJlIGFzIGxhcmdlIGFzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlIGdpdmVuIHZhbHVlICAgICAgICAgfAogICB8ICAgICAgICAgICB8IGZhaXRoZnVsbHkuICBGb3IgIkRlY2ltYWwiLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGVpdGhlciAgICAgfAogICB8ICAgICAgICAgICB8ICInZyciIG9yICInRyciIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgICAgICAgICAgICAgICAgICAgfAogICB8ICAgICAgICAgICB8ICJjb250ZXh0LmNhcGl0YWxzIiBmb3IgdGhlIGN1cnJlbnQgZGVjaW1hbCBjb250ZXh0LiAgVGhlICAgfAogICB8ICAgICAgICAgICB8IG92ZXJhbGwgZWZmZWN0IGlzIHRvIG1hdGNoIHRoZSBvdXRwdXQgb2YgInN0cigpIiBhcyAgICAgICAgfAogICB8ICAgICAgICAgICB8IGFsdGVyZWQgYnkgdGhlIG90aGVyIGZvcm1hdCBtb2RpZmllcnMuICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKVGhlIHJlc3VsdCBzaG91bGQgYmUgY29ycmVjdGx5IHJvdW5kZWQgdG8gYSBnaXZlbiBwcmVjaXNpb24gInAiIG9mCmRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludC4gIFRoZSByb3VuZGluZyBtb2RlIGZvciAiZmxvYXQiIG1hdGNoZXMKdGhhdCBvZiB0aGUgInJvdW5kKCkiIGJ1aWx0aW4uICBGb3IgIkRlY2ltYWwiLCB0aGUgcm91bmRpbmcgbW9kZSBvZgp0aGUgY3VycmVudCBjb250ZXh0IHdpbGwgYmUgdXNlZC4KClRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciAiY29tcGxleCIgYXJlIHRoZSBzYW1lIGFzIHRob3NlCmZvciAiZmxvYXQiICgiJyUnIiBpcyBub3QgYWxsb3dlZCkuICBCb3RoIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkKY29tcG9uZW50cyBvZiBhIGNvbXBsZXggbnVtYmVyIGFyZSBmb3JtYXR0ZWQgYXMgZmxvYXRpbmctcG9pbnQKbnVtYmVycywgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJlc2VudGF0aW9uIHR5cGUuICBUaGV5IGFyZQpzZXBhcmF0ZWQgYnkgdGhlIG1hbmRhdG9yeSBzaWduIG9mIHRoZSBpbWFnaW5hcnkgcGFydCwgdGhlIGxhdHRlcgpiZWluZyB0ZXJtaW5hdGVkIGJ5IGEgImoiIHN1ZmZpeC4gIElmIHRoZSBwcmVzZW50YXRpb24gdHlwZSBpcwptaXNzaW5nLCB0aGUgcmVzdWx0IHdpbGwgbWF0Y2ggdGhlIG91dHB1dCBvZiAic3RyKCkiIChjb21wbGV4IG51bWJlcnMKd2l0aCBhIG5vbi16ZXJvIHJlYWwgcGFydCBhcmUgYWxzbyBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzKSwKcG9zc2libHkgYWx0ZXJlZCBieSBvdGhlciBmb3JtYXQgbW9kaWZpZXJzLgoKCkZvcm1hdCBleGFtcGxlcwo9PT09PT09PT09PT09PT0KClRoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgInN0ci5mb3JtYXQoKSIgc3ludGF4IGFuZApjb21wYXJpc29uIHdpdGggdGhlIG9sZCAiJSItZm9ybWF0dGluZy4KCkluIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLAp3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgInt9IiBhbmQgd2l0aCAiOiIgdXNlZCBpbnN0ZWFkIG9mICIlIi4gRm9yCmV4YW1wbGUsICInJTAzLjJmJyIgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gIid7OjAzLjJmfSciLgoKVGhlIG5ldyBmb3JtYXQgc3ludGF4IGFsc28gc3VwcG9ydHMgbmV3IGFuZCBkaWZmZXJlbnQgb3B0aW9ucywgc2hvd24KaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcy4KCkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgcG9zaXRpb246CgogICA+Pj4gJ3swfSwgezF9LCB7Mn0nLmZvcm1hdCgnYScsICdiJywgJ2MnKQogICAnYSwgYiwgYycKICAgPj4+ICd7fSwge30sIHt9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJykgICMgMy4xKyBvbmx5CiAgICdhLCBiLCBjJwogICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgnYScsICdiJywgJ2MnKQogICAnYywgYiwgYScKICAgPj4+ICd7Mn0sIHsxfSwgezB9Jy5mb3JtYXQoKidhYmMnKSAgICAgICMgdW5wYWNraW5nIGFyZ3VtZW50IHNlcXVlbmNlCiAgICdjLCBiLCBhJwogICA+Pj4gJ3swfXsxfXswfScuZm9ybWF0KCdhYnJhJywgJ2NhZCcpICAgIyBhcmd1bWVudHMnIGluZGljZXMgY2FuIGJlIHJlcGVhdGVkCiAgICdhYnJhY2FkYWJyYScKCkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgbmFtZToKCiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9Jy5mb3JtYXQobGF0aXR1ZGU9JzM3LjI0TicsIGxvbmdpdHVkZT0nLTExNS44MVcnKQogICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnCiAgID4+PiBjb29yZCA9IHsnbGF0aXR1ZGUnOiAnMzcuMjROJywgJ2xvbmdpdHVkZSc6ICctMTE1LjgxVyd9CiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9Jy5mb3JtYXQoKipjb29yZCkKICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJwoKQWNjZXNzaW5nIGFyZ3VtZW50c+KAmSBhdHRyaWJ1dGVzOgoKICAgPj4+IGMgPSAzLTVqCiAgID4+PiAoJ1RoZSBjb21wbGV4IG51bWJlciB7MH0gaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCB7MC5yZWFsfSAnCiAgIC4uLiAgJ2FuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgezAuaW1hZ30uJykuZm9ybWF0KGMpCiAgICdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgMy4wIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgLTUuMC4nCiAgID4+PiBjbGFzcyBQb2ludDoKICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6CiAgIC4uLiAgICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeQogICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAuLi4gICAgICAgICByZXR1cm4gJ1BvaW50KHtzZWxmLnh9LCB7c2VsZi55fSknLmZvcm1hdChzZWxmPXNlbGYpCiAgIC4uLgogICA+Pj4gc3RyKFBvaW50KDQsIDIpKQogICAnUG9pbnQoNCwgMiknCgpBY2Nlc3NpbmcgYXJndW1lbnRz4oCZIGl0ZW1zOgoKICAgPj4+IGNvb3JkID0gKDMsIDUpCiAgID4+PiAnWDogezBbMF19OyAgWTogezBbMV19Jy5mb3JtYXQoY29vcmQpCiAgICdYOiAzOyAgWTogNScKClJlcGxhY2luZyAiJXMiIGFuZCAiJXIiOgoKICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2Vzbid0OiB7IXN9Ii5mb3JtYXQoJ3Rlc3QxJywgJ3Rlc3QyJykKICAgInJlcHIoKSBzaG93cyBxdW90ZXM6ICd0ZXN0MSc7IHN0cigpIGRvZXNuJ3Q6IHRlc3QyIgoKQWxpZ25pbmcgdGhlIHRleHQgYW5kIHNwZWNpZnlpbmcgYSB3aWR0aDoKCiAgID4+PiAnezo8MzB9Jy5mb3JtYXQoJ2xlZnQgYWxpZ25lZCcpCiAgICdsZWZ0IGFsaWduZWQgICAgICAgICAgICAgICAgICAnCiAgID4+PiAnezo+MzB9Jy5mb3JtYXQoJ3JpZ2h0IGFsaWduZWQnKQogICAnICAgICAgICAgICAgICAgICByaWdodCBhbGlnbmVkJwogICA+Pj4gJ3s6XjMwfScuZm9ybWF0KCdjZW50ZXJlZCcpCiAgICcgICAgICAgICAgIGNlbnRlcmVkICAgICAgICAgICAnCiAgID4+PiAnezoqXjMwfScuZm9ybWF0KCdjZW50ZXJlZCcpICAjIHVzZSAnKicgYXMgYSBmaWxsIGNoYXIKICAgJyoqKioqKioqKioqY2VudGVyZWQqKioqKioqKioqKicKClJlcGxhY2luZyAiJStmIiwgIiUtZiIsIGFuZCAiJSBmIiBhbmQgc3BlY2lmeWluZyBhIHNpZ246CgogICA+Pj4gJ3s6K2Z9OyB7OitmfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGl0IGFsd2F5cwogICAnKzMuMTQwMDAwOyAtMy4xNDAwMDAnCiAgID4+PiAnezogZn07IHs6IGZ9Jy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgYSBzcGFjZSBmb3IgcG9zaXRpdmUgbnVtYmVycwogICAnIDMuMTQwMDAwOyAtMy4xNDAwMDAnCiAgID4+PiAnezotZn07IHs6LWZ9Jy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgb25seSB0aGUgbWludXMgLS0gc2FtZSBhcyAnezpmfTsgezpmfScKICAgJzMuMTQwMDAwOyAtMy4xNDAwMDAnCgpSZXBsYWNpbmcgIiV4IiBhbmQgIiVvIiBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gZGlmZmVyZW50IGJhc2VzOgoKICAgPj4+ICMgZm9ybWF0IGFsc28gc3VwcG9ydHMgYmluYXJ5IG51bWJlcnMKICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDp4fTsgIG9jdDogezA6b307ICBiaW46IHswOmJ9Ii5mb3JtYXQoNDIpCiAgICdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMCcKICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDoKICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDojeH07ICBvY3Q6IHswOiNvfTsgIGJpbjogezA6I2J9Ii5mb3JtYXQoNDIpCiAgICdpbnQ6IDQyOyAgaGV4OiAweDJhOyAgb2N0OiAwbzUyOyAgYmluOiAwYjEwMTAxMCcKClVzaW5nIHRoZSBjb21tYSBvciB0aGUgdW5kZXJzY29yZSBhcyBhIGRpZ2l0IGdyb3VwIHNlcGFyYXRvcjoKCiAgID4+PiAnezosfScuZm9ybWF0KDEyMzQ1Njc4OTApCiAgICcxLDIzNCw1NjcsODkwJwogICA+Pj4gJ3s6X30nLmZvcm1hdCgxMjM0NTY3ODkwKQogICAnMV8yMzRfNTY3Xzg5MCcKICAgPj4+ICd7Ol9ifScuZm9ybWF0KDEyMzQ1Njc4OTApCiAgICcxMDBfMTAwMV8xMDAxXzAxMTBfMDAwMF8wMDEwXzExMDFfMDAxMCcKICAgPj4+ICd7Ol94fScuZm9ybWF0KDEyMzQ1Njc4OTApCiAgICc0OTk2XzAyZDInCgpFeHByZXNzaW5nIGEgcGVyY2VudGFnZToKCiAgID4+PiBwb2ludHMgPSAxOQogICA+Pj4gdG90YWwgPSAyMgogICA+Pj4gJ0NvcnJlY3QgYW5zd2VyczogezouMiV9Jy5mb3JtYXQocG9pbnRzL3RvdGFsKQogICAnQ29ycmVjdCBhbnN3ZXJzOiA4Ni4zNiUnCgpVc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6CgogICA+Pj4gaW1wb3J0IGRhdGV0aW1lIGFzIGR0CiAgID4+PiBkID0gZHQuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OCkKICAgPj4+ICd7OiVZLSVtLSVkICVIOiVNOiVTfScuZm9ybWF0KGQpCiAgICcyMDEwLTA3LTA0IDEyOjE1OjU4JwoKTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczoKCiAgID4+PiBmb3IgYWxpZ24sIHRleHQgaW4gemlwKCc8Xj4nLCBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J10pOgogICAuLi4gICAgICd7MDp7ZmlsbH17YWxpZ259MTZ9Jy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pCiAgIC4uLgogICAnbGVmdDw8PDw8PDw8PDw8PCcKICAgJ15eXl5eY2VudGVyXl5eXl4nCiAgICc+Pj4+Pj4+Pj4+PnJpZ2h0JwogICA+Pj4KICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV0KICAgPj4+ICd7OjAyWH17OjAyWH17OjAyWH17OjAyWH0nLmZvcm1hdCgqb2N0ZXRzKQogICAnQzBBODAwMDEnCiAgID4+PiBpbnQoXywgMTYpCiAgIDMyMzIyMzU1MjEKICAgPj4+CiAgID4+PiB3aWR0aCA9IDUKICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6CiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gJ2RYb2InOgogICAuLi4gICAgICAgICBwcmludCgnezA6e3dpZHRofXtiYXNlfX0nLmZvcm1hdChudW0sIGJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLCBlbmQ9JyAnKQogICAuLi4gICAgIHByaW50KCkKICAgLi4uCiAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxCiAgICAgICA2ICAgICA2ICAgICA2ICAgMTEwCiAgICAgICA3ICAgICA3ICAgICA3ICAgMTExCiAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwCiAgICAgICA5ICAgICA5ICAgIDExICAxMDAxCiAgICAgIDEwICAgICBBICAgIDEyICAxMDEwCiAgICAgIDExICAgICBCICAgIDEzICAxMDExCtoIZnVuY3Rpb251FB8AAEZ1bmN0aW9uIGRlZmluaXRpb25zCioqKioqKioqKioqKioqKioqKioqCgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZQpzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSk6CgogICBmdW5jZGVmICAgICAgICAgICAgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgW3R5cGVfcGFyYW1zXSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlCiAgIGRlY29yYXRvcnMgICAgICAgICAgICAgICAgOjo9IGRlY29yYXRvcisKICAgZGVjb3JhdG9yICAgICAgICAgICAgICAgICA6Oj0gIkAiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiBORVdMSU5FCiAgIHBhcmFtZXRlcl9saXN0ICAgICAgICAgICAgOjo9IGRlZnBhcmFtZXRlciAoIiwiIGRlZnBhcmFtZXRlcikqICIsIiAiLyIgWyIsIiBbcGFyYW1ldGVyX2xpc3Rfbm9fcG9zb25seV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyX2xpc3Rfbm9fcG9zb25seQogICBwYXJhbWV0ZXJfbGlzdF9ub19wb3Nvbmx5IDo6PSBkZWZwYXJhbWV0ZXIgKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiIFtwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc11dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3MKICAgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3MgICA6Oj0gIioiIFtzdGFyX3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiIFtwYXJhbWV0ZXJfc3Rhcl9rd2FyZ3NdXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICIqIiAoIiwiIGRlZnBhcmFtZXRlcikrIFsiLCIgW3BhcmFtZXRlcl9zdGFyX2t3YXJnc11dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyX3N0YXJfa3dhcmdzCiAgIHBhcmFtZXRlcl9zdGFyX2t3YXJncyAgICAgOjo9ICIqKiIgcGFyYW1ldGVyIFsiLCJdCiAgIHBhcmFtZXRlciAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXQogICBzdGFyX3BhcmFtZXRlciAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgWyIqIl0gZXhwcmVzc2lvbl0KICAgZGVmcGFyYW1ldGVyICAgICAgICAgICAgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl0KICAgZnVuY25hbWUgICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllcgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kcwp0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3QKKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXMKZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2UKYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCgpUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHMKZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFs0XQoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqCmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcwpkZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZQpyZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdAphcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lCmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4KbmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUKCiAgIEBmMShhcmcpCiAgIEBmMgogICBkZWYgZnVuYygpOiBwYXNzCgppcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8KCiAgIGRlZiBmdW5jKCk6IHBhc3MKICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpCgpleGNlcHQgdGhhdCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gaXMgbm90IHRlbXBvcmFyaWx5IGJvdW5kIHRvIHRoZSBuYW1lCiJmdW5jIi4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjk6IEZ1bmN0aW9ucyBtYXkgYmUgZGVjb3JhdGVkIHdpdGggYW55IHZhbGlkCiJhc3NpZ25tZW50X2V4cHJlc3Npb24iLiBQcmV2aW91c2x5LCB0aGUgZ3JhbW1hciB3YXMgbXVjaCBtb3JlCnJlc3RyaWN0aXZlOyBzZWUgKipQRVAgNjE0KiogZm9yIGRldGFpbHMuCgpBIGxpc3Qgb2YgdHlwZSBwYXJhbWV0ZXJzIG1heSBiZSBnaXZlbiBpbiBzcXVhcmUgYnJhY2tldHMgYmV0d2VlbiB0aGUKZnVuY3Rpb27igJlzIG5hbWUgYW5kIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzIGZvciBpdHMgcGFyYW1ldGVyIGxpc3QuClRoaXMgaW5kaWNhdGVzIHRvIHN0YXRpYyB0eXBlIGNoZWNrZXJzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGdlbmVyaWMuCkF0IHJ1bnRpbWUsIHRoZSB0eXBlIHBhcmFtZXRlcnMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBmdW5jdGlvbuKAmXMKIl9fdHlwZV9wYXJhbXNfXyIgYXR0cmlidXRlLiBTZWUgR2VuZXJpYyBmdW5jdGlvbnMgZm9yIG1vcmUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMjogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgYXJlIG5ldyBpbiBQeXRob24gMy4xMi4KCldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iCipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSDigJxkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMu4oCdCkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXkKYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVy4oCZcyBkZWZhdWx0IHZhbHVlIGlzCnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZwpwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSDigJwiKiLigJ0gbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIOKAlCB0aGlzIGlzCmEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci4KCioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gdGhlCmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzCmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSDigJxwcmUtCmNvbXB1dGVk4oCdIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQKdG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaAphcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLgpieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgaW4KZWZmZWN0IG1vZGlmaWVkLiAgVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkKYXJvdW5kIHRoaXMgaXMgdG8gdXNlICJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IKaXQgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCBlLmcuOgoKICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOgogICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOgogICAgICAgICAgIHBlbmd1aW4gPSBbXQogICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKQogICAgICAgcmV0dXJuIHBlbmd1aW4KCkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvbiBDYWxscy4KQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyBtZW50aW9uZWQgaW4KdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50cywgZnJvbSBrZXl3b3JkCmFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtIOKAnCIqaWRlbnRpZmllciLigJ0gaXMKcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55IGV4Y2VzcyBwb3NpdGlvbmFsCnBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiBJZiB0aGUgZm9ybQrigJwiKippZGVudGlmaWVyIuKAnSBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ldyBvcmRlcmVkCm1hcHBpbmcgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXcKZW1wdHkgbWFwcGluZyBvZiB0aGUgc2FtZSB0eXBlLiAgUGFyYW1ldGVycyBhZnRlciDigJwiKiLigJ0gb3IK4oCcIippZGVudGlmaWVyIuKAnSBhcmUga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCBieQprZXl3b3JkIGFyZ3VtZW50cy4gIFBhcmFtZXRlcnMgYmVmb3JlIOKAnCIvIuKAnSBhcmUgcG9zaXRpb25hbC1vbmx5CnBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCBieSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFRoZSAiLyIgZnVuY3Rpb24gcGFyYW1ldGVyIHN5bnRheCBtYXkgYmUgdXNlZAp0byBpbmRpY2F0ZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycy4gU2VlICoqUEVQIDU3MCoqIGZvciBkZXRhaWxzLgoKUGFyYW1ldGVycyBtYXkgaGF2ZSBhbiAqYW5ub3RhdGlvbiogb2YgdGhlIGZvcm0g4oCcIjogZXhwcmVzc2lvbiLigJ0KZm9sbG93aW5nIHRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiwKZXZlbiB0aG9zZSBvZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAoQXMgYSBzcGVjaWFsCmNhc2UsIHBhcmFtZXRlcnMgb2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIOKAnCI6CipleHByZXNzaW9uIuKAnS4pIEZ1bmN0aW9ucyBtYXkgaGF2ZSDigJxyZXR1cm7igJ0gYW5ub3RhdGlvbiBvZiB0aGUgZm9ybQrigJwiLT4gZXhwcmVzc2lvbiLigJ0gYWZ0ZXIgdGhlIHBhcmFtZXRlciBsaXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlCmFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbi4gIFRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdApjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZQphdmFpbGFibGUgYXMgdmFsdWVzIG9mIGEgZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc+KAmSBuYW1lcyBpbgp0aGUgIl9fYW5ub3RhdGlvbnNfXyIgYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBJZiB0aGUKImFubm90YXRpb25zIiBpbXBvcnQgZnJvbSAiX19mdXR1cmVfXyIgaXMgdXNlZCwgYW5ub3RhdGlvbnMgYXJlCnByZXNlcnZlZCBhcyBzdHJpbmdzIGF0IHJ1bnRpbWUgd2hpY2ggZW5hYmxlcyBwb3N0cG9uZWQgZXZhbHVhdGlvbi4KT3RoZXJ3aXNlLCB0aGV5IGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcwpleGVjdXRlZC4gIEluIHRoaXMgY2FzZSBhbm5vdGF0aW9ucyBtYXkgYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50Cm9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IFBhcmFtZXRlcnMgb2YgdGhlIGZvcm0g4oCcIippZGVudGlmaWVyIuKAnSBtYXkKaGF2ZSBhbiBhbm5vdGF0aW9uIOKAnCI6ICpleHByZXNzaW9uIuKAnS4gU2VlICoqUEVQIDY0NioqLgoKSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZAp0byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGEKZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uIExhbWJkYXMuICBOb3RlIHRoYXQgdGhlIGxhbWJkYQpleHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247CmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhIOKAnCJkZWYi4oCdIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvcgphc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYQpleHByZXNzaW9uLiAgVGhlIOKAnCJkZWYi4oCdIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdAphbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy4KCioqUHJvZ3JhbW1lcuKAmXMgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBIOKAnCJkZWYi4oCdCnN0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbApmdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZAppbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb24KY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gTmFtaW5nIGFuZCBiaW5kaW5nIGZvciBkZXRhaWxzLgoKU2VlIGFsc286CgogICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zCiAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLgoKICAqKlBFUCA0ODQqKiAtIFR5cGUgSGludHMKICAgICBEZWZpbml0aW9uIG9mIGEgc3RhbmRhcmQgbWVhbmluZyBmb3IgYW5ub3RhdGlvbnM6IHR5cGUgaGludHMuCgogICoqUEVQIDUyNioqIC0gU3ludGF4IGZvciBWYXJpYWJsZSBBbm5vdGF0aW9ucwogICAgIEFiaWxpdHkgdG8gdHlwZSBoaW50IHZhcmlhYmxlIGRlY2xhcmF0aW9ucywgaW5jbHVkaW5nIGNsYXNzCiAgICAgdmFyaWFibGVzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMuCgogICoqUEVQIDU2MyoqIC0gUG9zdHBvbmVkIEV2YWx1YXRpb24gb2YgQW5ub3RhdGlvbnMKICAgICBTdXBwb3J0IGZvciBmb3J3YXJkIHJlZmVyZW5jZXMgd2l0aGluIGFubm90YXRpb25zIGJ5IHByZXNlcnZpbmcKICAgICBhbm5vdGF0aW9ucyBpbiBhIHN0cmluZyBmb3JtIGF0IHJ1bnRpbWUgaW5zdGVhZCBvZiBlYWdlcgogICAgIGV2YWx1YXRpb24uCgogICoqUEVQIDMxOCoqIC0gRGVjb3JhdG9ycyBmb3IgRnVuY3Rpb25zIGFuZCBNZXRob2RzCiAgICAgRnVuY3Rpb24gYW5kIG1ldGhvZCBkZWNvcmF0b3JzIHdlcmUgaW50cm9kdWNlZC4gQ2xhc3MgZGVjb3JhdG9ycwogICAgIHdlcmUgaW50cm9kdWNlZCBpbiAqKlBFUCAzMTI5KiouCtoGZ2xvYmFsdQsFAABUaGUgImdsb2JhbCIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioKCiAgIGdsb2JhbF9zdG10IDo6PSAiZ2xvYmFsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqCgpUaGUgImdsb2JhbCIgc3RhdGVtZW50IGNhdXNlcyB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIHRvIGJlIGludGVycHJldGVkCmFzIGdsb2JhbHMuIEl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gYXNzaWduIHRvIGEgZ2xvYmFsIHZhcmlhYmxlCndpdGhvdXQgImdsb2JhbCIsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0byBnbG9iYWxzIHdpdGhvdXQKYmVpbmcgZGVjbGFyZWQgZ2xvYmFsLgoKVGhlICJnbG9iYWwiIHN0YXRlbWVudCBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY3VycmVudCBzY29wZSAobW9kdWxlLApmdW5jdGlvbiBib2R5IG9yIGNsYXNzIGRlZmluaXRpb24pLiBBICJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGlmIGEKdmFyaWFibGUgaXMgdXNlZCBvciBhc3NpZ25lZCB0byBwcmlvciB0byBpdHMgZ2xvYmFsIGRlY2xhcmF0aW9uIGluIHRoZQpzY29wZS4KCkF0IHRoZSBtb2R1bGUgbGV2ZWwsIGFsbCB2YXJpYWJsZXMgYXJlIGdsb2JhbCwgc28gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQKaGFzIG5vIGVmZmVjdC4gSG93ZXZlciwgdmFyaWFibGVzIG11c3Qgc3RpbGwgbm90IGJlIHVzZWQgb3IgYXNzaWduZWQKdG8gcHJpb3IgdG8gdGhlaXIgImdsb2JhbCIgZGVjbGFyYXRpb24uIFRoaXMgcmVxdWlyZW1lbnQgaXMgcmVsYXhlZCBpbgp0aGUgaW50ZXJhY3RpdmUgcHJvbXB0ICgqUkVQTCopLgoKKipQcm9ncmFtbWVy4oCZcyBub3RlOioqICJnbG9iYWwiIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBwYXJzZXIuICBJdAphcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgImdsb2JhbCIKc3RhdGVtZW50LiBJbiBwYXJ0aWN1bGFyLCBhICJnbG9iYWwiIHN0YXRlbWVudCBjb250YWluZWQgaW4gYSBzdHJpbmcKb3IgY29kZSBvYmplY3Qgc3VwcGxpZWQgdG8gdGhlIGJ1aWx0LWluICJleGVjKCkiIGZ1bmN0aW9uIGRvZXMgbm90CmFmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlIGZ1bmN0aW9uIGNhbGwsIGFuZCBjb2RlCmNvbnRhaW5lZCBpbiBzdWNoIGEgc3RyaW5nIGlzIHVuYWZmZWN0ZWQgYnkgImdsb2JhbCIgc3RhdGVtZW50cyBpbiB0aGUKY29kZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgImV2YWwoKSIKYW5kICJjb21waWxlKCkiIGZ1bmN0aW9ucy4KegppZC1jbGFzc2VzdawGAABSZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsCm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmQKdHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOgoKIl8qIgogICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4KCiJfIgogICBJbiBhICJjYXNlIiBwYXR0ZXJuIHdpdGhpbiBhICJtYXRjaCIgc3RhdGVtZW50LCAiXyIgaXMgYSBzb2Z0CiAgIGtleXdvcmQgdGhhdCBkZW5vdGVzIGEgd2lsZGNhcmQuCgogICBTZXBhcmF0ZWx5LCB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgbWFrZXMgdGhlIHJlc3VsdCBvZiB0aGUKICAgbGFzdCBldmFsdWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUgIl8iLiAoSXQgaXMgc3RvcmVkIGluIHRoZQogICAiYnVpbHRpbnMiIG1vZHVsZSwgYWxvbmdzaWRlIGJ1aWx0LWluIGZ1bmN0aW9ucyBsaWtlICJwcmludCIuKQoKICAgRWxzZXdoZXJlLCAiXyIgaXMgYSByZWd1bGFyIGlkZW50aWZpZXIuIEl0IGlzIG9mdGVuIHVzZWQgdG8gbmFtZQogICDigJxzcGVjaWFs4oCdIGl0ZW1zLCBidXQgaXQgaXMgbm90IHNwZWNpYWwgdG8gUHl0aG9uIGl0c2VsZi4KCiAgIE5vdGU6CgogICAgIFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQogICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLkl0IGlzCiAgICAgYWxzbyBjb21tb25seSB1c2VkIGZvciB1bnVzZWQgdmFyaWFibGVzLgoKIl9fKl9fIgogICBTeXN0ZW0tZGVmaW5lZCBuYW1lcywgaW5mb3JtYWxseSBrbm93biBhcyDigJxkdW5kZXLigJ0gbmFtZXMuIFRoZXNlCiAgIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlciBhbmQgaXRzIGltcGxlbWVudGF0aW9uCiAgIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiBDdXJyZW50IHN5c3RlbSBuYW1lcyBhcmUKICAgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyBzZWN0aW9uIGFuZCBlbHNld2hlcmUuIE1vcmUKICAgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uLiAgKkFueSogdXNlIG9mCiAgICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMgbm90IGZvbGxvdyBleHBsaWNpdGx5CiAgIGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlIHdpdGhvdXQgd2FybmluZy4KCiJfXyoiCiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZQogICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtCiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4g4oCccHJpdmF0ZeKAnSBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kCiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gSWRlbnRpZmllcnMgKE5hbWVzKS4K2gtpZGVudGlmaWVyc3WzEwAASWRlbnRpZmllcnMgYW5kIGtleXdvcmRzCioqKioqKioqKioqKioqKioqKioqKioqKgoKSWRlbnRpZmllcnMgKGFsc28gcmVmZXJyZWQgdG8gYXMgKm5hbWVzKikgYXJlIGRlc2NyaWJlZCBieSB0aGUKZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnMuCgpUaGUgc3ludGF4IG9mIGlkZW50aWZpZXJzIGluIFB5dGhvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSBzdGFuZGFyZAphbm5leCBVQVgtMzEsIHdpdGggZWxhYm9yYXRpb24gYW5kIGNoYW5nZXMgYXMgZGVmaW5lZCBiZWxvdzsgc2VlIGFsc28KKipQRVAgMzEzMSoqIGZvciBmdXJ0aGVyIGRldGFpbHMuCgpXaXRoaW4gdGhlIEFTQ0lJIHJhbmdlIChVKzAwMDEuLlUrMDA3RiksIHRoZSB2YWxpZCBjaGFyYWN0ZXJzIGZvcgppZGVudGlmaWVycyBpbmNsdWRlIHRoZSB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSBsZXR0ZXJzICJBIiB0aHJvdWdoCiJaIiwgdGhlIHVuZGVyc2NvcmUgIl8iIGFuZCwgZXhjZXB0IGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGUKZGlnaXRzICIwIiB0aHJvdWdoICI5Ii4gUHl0aG9uIDMuMCBpbnRyb2R1Y2VkIGFkZGl0aW9uYWwgY2hhcmFjdGVycwpmcm9tIG91dHNpZGUgdGhlIEFTQ0lJIHJhbmdlIChzZWUgKipQRVAgMzEzMSoqKS4gIEZvciB0aGVzZQpjaGFyYWN0ZXJzLCB0aGUgY2xhc3NpZmljYXRpb24gdXNlcyB0aGUgdmVyc2lvbiBvZiB0aGUgVW5pY29kZQpDaGFyYWN0ZXIgRGF0YWJhc2UgYXMgaW5jbHVkZWQgaW4gdGhlICJ1bmljb2RlZGF0YSIgbW9kdWxlLgoKSWRlbnRpZmllcnMgYXJlIHVubGltaXRlZCBpbiBsZW5ndGguICBDYXNlIGlzIHNpZ25pZmljYW50LgoKICAgaWRlbnRpZmllciAgIDo6PSB4aWRfc3RhcnQgeGlkX2NvbnRpbnVlKgogICBpZF9zdGFydCAgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBnZW5lcmFsIGNhdGVnb3JpZXMgTHUsIExsLCBMdCwgTG0sIExvLCBObCwgdGhlIHVuZGVyc2NvcmUsIGFuZCBjaGFyYWN0ZXJzIHdpdGggdGhlIE90aGVyX0lEX1N0YXJ0IHByb3BlcnR5PgogICBpZF9jb250aW51ZSAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCwgcGx1cyBjaGFyYWN0ZXJzIGluIHRoZSBjYXRlZ29yaWVzIE1uLCBNYywgTmQsIFBjIGFuZCBvdGhlcnMgd2l0aCB0aGUgT3RoZXJfSURfQ29udGludWUgcHJvcGVydHk+CiAgIHhpZF9zdGFydCAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0IHdob3NlIE5GS0Mgbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfc3RhcnQgeGlkX2NvbnRpbnVlKiI+CiAgIHhpZF9jb250aW51ZSA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX2NvbnRpbnVlIHdob3NlIE5GS0Mgbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfY29udGludWUqIj4KClRoZSBVbmljb2RlIGNhdGVnb3J5IGNvZGVzIG1lbnRpb25lZCBhYm92ZSBzdGFuZCBmb3I6CgoqICpMdSogLSB1cHBlcmNhc2UgbGV0dGVycwoKKiAqTGwqIC0gbG93ZXJjYXNlIGxldHRlcnMKCiogKkx0KiAtIHRpdGxlY2FzZSBsZXR0ZXJzCgoqICpMbSogLSBtb2RpZmllciBsZXR0ZXJzCgoqICpMbyogLSBvdGhlciBsZXR0ZXJzCgoqICpObCogLSBsZXR0ZXIgbnVtYmVycwoKKiAqTW4qIC0gbm9uc3BhY2luZyBtYXJrcwoKKiAqTWMqIC0gc3BhY2luZyBjb21iaW5pbmcgbWFya3MKCiogKk5kKiAtIGRlY2ltYWwgbnVtYmVycwoKKiAqUGMqIC0gY29ubmVjdG9yIHB1bmN0dWF0aW9ucwoKKiAqT3RoZXJfSURfU3RhcnQqIC0gZXhwbGljaXQgbGlzdCBvZiBjaGFyYWN0ZXJzIGluIFByb3BMaXN0LnR4dCB0bwogIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCiogKk90aGVyX0lEX0NvbnRpbnVlKiAtIGxpa2V3aXNlCgpBbGwgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBub3JtYWwgZm9ybSBORktDIHdoaWxlIHBhcnNpbmc7CmNvbXBhcmlzb24gb2YgaWRlbnRpZmllcnMgaXMgYmFzZWQgb24gTkZLQy4KCkEgbm9uLW5vcm1hdGl2ZSBIVE1MIGZpbGUgbGlzdGluZyBhbGwgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGZvcgpVbmljb2RlIDE1LjEuMCBjYW4gYmUgZm91bmQgYXQKaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzE1LjEuMC91Y2QvRGVyaXZlZENvcmVQcm9wZXJ0aWVzLnR4dAoKCktleXdvcmRzCj09PT09PT09CgpUaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIGFyZSB1c2VkIGFzIHJlc2VydmVkIHdvcmRzLCBvciAqa2V5d29yZHMqIG9mCnRoZSBsYW5ndWFnZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG9yZGluYXJ5IGlkZW50aWZpZXJzLiAgVGhleSBtdXN0CmJlIHNwZWxsZWQgZXhhY3RseSBhcyB3cml0dGVuIGhlcmU6CgogICBGYWxzZSAgICAgIGF3YWl0ICAgICAgZWxzZSAgICAgICBpbXBvcnQgICAgIHBhc3MKICAgTm9uZSAgICAgICBicmVhayAgICAgIGV4Y2VwdCAgICAgaW4gICAgICAgICByYWlzZQogICBUcnVlICAgICAgIGNsYXNzICAgICAgZmluYWxseSAgICBpcyAgICAgICAgIHJldHVybgogICBhbmQgICAgICAgIGNvbnRpbnVlICAgZm9yICAgICAgICBsYW1iZGEgICAgIHRyeQogICBhcyAgICAgICAgIGRlZiAgICAgICAgZnJvbSAgICAgICBub25sb2NhbCAgIHdoaWxlCiAgIGFzc2VydCAgICAgZGVsICAgICAgICBnbG9iYWwgICAgIG5vdCAgICAgICAgd2l0aAogICBhc3luYyAgICAgIGVsaWYgICAgICAgaWYgICAgICAgICBvciAgICAgICAgIHlpZWxkCgoKU29mdCBLZXl3b3Jkcwo9PT09PT09PT09PT09CgpBZGRlZCBpbiB2ZXJzaW9uIDMuMTAuCgpTb21lIGlkZW50aWZpZXJzIGFyZSBvbmx5IHJlc2VydmVkIHVuZGVyIHNwZWNpZmljIGNvbnRleHRzLiBUaGVzZSBhcmUKa25vd24gYXMgKnNvZnQga2V5d29yZHMqLiAgVGhlIGlkZW50aWZpZXJzICJtYXRjaCIsICJjYXNlIiwgInR5cGUiIGFuZAoiXyIgY2FuIHN5bnRhY3RpY2FsbHkgYWN0IGFzIGtleXdvcmRzIGluIGNlcnRhaW4gY29udGV4dHMsIGJ1dCB0aGlzCmRpc3RpbmN0aW9uIGlzIGRvbmUgYXQgdGhlIHBhcnNlciBsZXZlbCwgbm90IHdoZW4gdG9rZW5pemluZy4KCkFzIHNvZnQga2V5d29yZHMsIHRoZWlyIHVzZSBpbiB0aGUgZ3JhbW1hciBpcyBwb3NzaWJsZSB3aGlsZSBzdGlsbApwcmVzZXJ2aW5nIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlIHRoYXQgdXNlcyB0aGVzZSBuYW1lcyBhcwppZGVudGlmaWVyIG5hbWVzLgoKIm1hdGNoIiwgImNhc2UiLCBhbmQgIl8iIGFyZSB1c2VkIGluIHRoZSAibWF0Y2giIHN0YXRlbWVudC4gInR5cGUiIGlzCnVzZWQgaW4gdGhlICJ0eXBlIiBzdGF0ZW1lbnQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMjogInR5cGUiIGlzIG5vdyBhIHNvZnQga2V5d29yZC4KCgpSZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsCm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmQKdHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOgoKIl8qIgogICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4KCiJfIgogICBJbiBhICJjYXNlIiBwYXR0ZXJuIHdpdGhpbiBhICJtYXRjaCIgc3RhdGVtZW50LCAiXyIgaXMgYSBzb2Z0CiAgIGtleXdvcmQgdGhhdCBkZW5vdGVzIGEgd2lsZGNhcmQuCgogICBTZXBhcmF0ZWx5LCB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgbWFrZXMgdGhlIHJlc3VsdCBvZiB0aGUKICAgbGFzdCBldmFsdWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUgIl8iLiAoSXQgaXMgc3RvcmVkIGluIHRoZQogICAiYnVpbHRpbnMiIG1vZHVsZSwgYWxvbmdzaWRlIGJ1aWx0LWluIGZ1bmN0aW9ucyBsaWtlICJwcmludCIuKQoKICAgRWxzZXdoZXJlLCAiXyIgaXMgYSByZWd1bGFyIGlkZW50aWZpZXIuIEl0IGlzIG9mdGVuIHVzZWQgdG8gbmFtZQogICDigJxzcGVjaWFs4oCdIGl0ZW1zLCBidXQgaXQgaXMgbm90IHNwZWNpYWwgdG8gUHl0aG9uIGl0c2VsZi4KCiAgIE5vdGU6CgogICAgIFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZQogICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLkl0IGlzCiAgICAgYWxzbyBjb21tb25seSB1c2VkIGZvciB1bnVzZWQgdmFyaWFibGVzLgoKIl9fKl9fIgogICBTeXN0ZW0tZGVmaW5lZCBuYW1lcywgaW5mb3JtYWxseSBrbm93biBhcyDigJxkdW5kZXLigJ0gbmFtZXMuIFRoZXNlCiAgIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlciBhbmQgaXRzIGltcGxlbWVudGF0aW9uCiAgIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiBDdXJyZW50IHN5c3RlbSBuYW1lcyBhcmUKICAgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyBzZWN0aW9uIGFuZCBlbHNld2hlcmUuIE1vcmUKICAgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uLiAgKkFueSogdXNlIG9mCiAgICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMgbm90IGZvbGxvdyBleHBsaWNpdGx5CiAgIGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlIHdpdGhvdXQgd2FybmluZy4KCiJfXyoiCiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZQogICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtCiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4g4oCccHJpdmF0ZeKAnSBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kCiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gSWRlbnRpZmllcnMgKE5hbWVzKS4K2gJpZtoJaW1hZ2luYXJ5YTUCAABJbWFnaW5hcnkgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKioqCgpJbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBpbWFnbnVtYmVyIDo6PSAoZmxvYXRudW1iZXIgfCBkaWdpdHBhcnQpICgiaiIgfCAiSiIpCgpBbiBpbWFnaW5hcnkgbGl0ZXJhbCB5aWVsZHMgYSBjb21wbGV4IG51bWJlciB3aXRoIGEgcmVhbCBwYXJ0IG9mIDAuMC4KQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycwphbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSBjb21wbGV4Cm51bWJlciB3aXRoIGEgbm9uemVybyByZWFsIHBhcnQsIGFkZCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciB0byBpdCwKZS5nLiwgIigzKzRqKSIuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczoKCiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAgMy4xNGUtMTBqICAgMy4xNF8xNV85M2oK2gZpbXBvcnR17CIAAFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKgoKICAgaW1wb3J0X3N0bXQgICAgIDo6PSAiaW1wb3J0IiBtb2R1bGUgWyJhcyIgaWRlbnRpZmllcl0gKCIsIiBtb2R1bGUgWyJhcyIgaWRlbnRpZmllcl0pKgogICAgICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyIFsiYXMiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBpZGVudGlmaWVyIFsiYXMiIGlkZW50aWZpZXJdKSoKICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgaWRlbnRpZmllcl0KICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGlkZW50aWZpZXIgWyJhcyIgaWRlbnRpZmllcl0pKiBbIiwiXSAiKSIKICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIioiCiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllcgogICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iKwoKVGhlIGJhc2ljIGltcG9ydCBzdGF0ZW1lbnQgKG5vICJmcm9tIiBjbGF1c2UpIGlzIGV4ZWN1dGVkIGluIHR3bwpzdGVwczoKCjEuIGZpbmQgYSBtb2R1bGUsIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3NhcnkKCjIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlIHdoZXJlCiAgIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLgoKV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpIHRoZQp0d28gc3RlcHMgYXJlIGNhcnJpZWQgb3V0IHNlcGFyYXRlbHkgZm9yIGVhY2ggY2xhdXNlLCBqdXN0IGFzIHRob3VnaAp0aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZHVhbCBpbXBvcnQgc3RhdGVtZW50cy4KClRoZSBkZXRhaWxzIG9mIHRoZSBmaXJzdCBzdGVwLCBmaW5kaW5nIGFuZCBsb2FkaW5nIG1vZHVsZXMsIGFyZQpkZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdGhlIGltcG9ydCBzeXN0ZW0sIHdoaWNoCmFsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXQgY2FuIGJlCmltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlCmltcG9ydCBzeXN0ZW0uIE5vdGUgdGhhdCBmYWlsdXJlcyBpbiB0aGlzIHN0ZXAgbWF5IGluZGljYXRlIGVpdGhlcgp0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhbiBlcnJvciBvY2N1cnJlZAp3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uIG9mIHRoZQptb2R1bGXigJlzIGNvZGUuCgpJZiB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBpdCB3aWxsIGJlIG1hZGUKYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6CgoqIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSAiYXMiLCB0aGVuIHRoZSBuYW1lIGZvbGxvd2luZyAiYXMiCiAgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS4KCiogSWYgbm8gb3RoZXIgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIGEKICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxl4oCZcyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UKICBhcyBhIHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlCgoqIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuIHRoZQogIG5hbWUgb2YgdGhlIHRvcCBsZXZlbCBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZSBpcyBib3VuZCBpbgogIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYWNrYWdlLiBUaGUKICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZQogIHJhdGhlciB0aGFuIGRpcmVjdGx5CgpUaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOgoKMS4gZmluZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIGNsYXVzZSwgbG9hZGluZyBhbmQKICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTsKCjIuIGZvciBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyBzcGVjaWZpZWQgaW4gdGhlICJpbXBvcnQiIGNsYXVzZXM6CgogICAxLiBjaGVjayBpZiB0aGUgaW1wb3J0ZWQgbW9kdWxlIGhhcyBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lCgogICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCB0aGVuCiAgICAgIGNoZWNrIHRoZSBpbXBvcnRlZCBtb2R1bGUgYWdhaW4gZm9yIHRoYXQgYXR0cmlidXRlCgogICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuCgogICA0LiBvdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsb2NhbAogICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyBwcmVzZW50LAogICAgICBvdGhlcndpc2UgdXNpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lCgpFeGFtcGxlczoKCiAgIGltcG9ydCBmb28gICAgICAgICAgICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBib3VuZCBsb2NhbGx5CiAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLCBmb28uYmFyLCBhbmQgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCBsb2NhbGx5CiAgIGltcG9ydCBmb28uYmFyLmJheiBhcyBmYmIgICMgZm9vLCBmb28uYmFyLCBhbmQgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvby5iYXIuYmF6IGJvdW5kIGFzIGZiYgogICBmcm9tIGZvby5iYXIgaW1wb3J0IGJheiAgICAjIGZvbywgZm9vLmJhciwgYW5kIGZvby5iYXIuYmF6IGltcG9ydGVkLCBmb28uYmFyLmJheiBib3VuZCBhcyBiYXoKICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzIGF0dHIKCklmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkIGJ5IGEgc3RhciAoIicqJyIpLCBhbGwgcHVibGljCm5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlCnNjb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLgoKVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlCm1vZHVsZeKAmXMgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkICJfX2FsbF9fIjsgaWYgZGVmaW5lZCwgaXQgbXVzdApiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgdGhhdAptb2R1bGUuIE5hbWVzIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgbXVzdCBiZSBpbiB0aGUKbm9ybWFsaXphdGlvbiBmb3JtIE5GS0MuICBUaGUgbmFtZXMgZ2l2ZW4gaW4gIl9fYWxsX18iIGFyZSBhbGwKY29uc2lkZXJlZCBwdWJsaWMgYW5kIGFyZSByZXF1aXJlZCB0byBleGlzdC4gIElmICJfX2FsbF9fIiBpcyBub3QKZGVmaW5lZCwgdGhlIHNldCBvZiBwdWJsaWMgbmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZQptb2R1bGXigJlzIG5hbWVzcGFjZSB3aGljaCBkbyBub3QgYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlcgooIidfJyIpLiAgIl9fYWxsX18iIHNob3VsZCBjb250YWluIHRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMKaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGV4cG9ydGluZyBpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZgp0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCB3ZXJlIGltcG9ydGVkIGFuZCB1c2VkIHdpdGhpbgp0aGUgbW9kdWxlKS4KClRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQg4oCUICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIg4oCUIGlzIG9ubHkKYWxsb3dlZCBhdCB0aGUgbW9kdWxlIGxldmVsLiAgQXR0ZW1wdGluZyB0byB1c2UgaXQgaW4gY2xhc3Mgb3IKZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuCgpXaGVuIHNwZWNpZnlpbmcgd2hhdCBtb2R1bGUgdG8gaW1wb3J0IHlvdSBkbyBub3QgaGF2ZSB0byBzcGVjaWZ5IHRoZQphYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWQKd2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0IHdpdGhpbgp0aGUgc2FtZSB0b3AgcGFja2FnZSB3aXRob3V0IGhhdmluZyB0byBtZW50aW9uIHRoZSBwYWNrYWdlIG5hbWUuIEJ5CnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiB5b3UKY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHkKd2l0aG91dCBzcGVjaWZ5aW5nIGV4YWN0IG5hbWVzLiBPbmUgbGVhZGluZyBkb3QgbWVhbnMgdGhlIGN1cnJlbnQKcGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXAKb25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgZXhlY3V0ZQoiZnJvbSAuIGltcG9ydCBtb2QiIGZyb20gYSBtb2R1bGUgaW4gdGhlICJwa2ciIHBhY2thZ2UgdGhlbiB5b3Ugd2lsbAplbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCBtb2QiCmZyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGUKc3BlY2lmaWNhdGlvbiBmb3IgcmVsYXRpdmUgaW1wb3J0cyBpcyBjb250YWluZWQgaW4gdGhlIFBhY2thZ2UKUmVsYXRpdmUgSW1wb3J0cyBzZWN0aW9uLgoKImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXQKZGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHRoZSBtb2R1bGVzIHRvIGJlIGxvYWRlZC4KClJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAiaW1wb3J0IiB3aXRoIGFyZ3VtZW50cyAibW9kdWxlIiwgImZpbGVuYW1lIiwKInN5cy5wYXRoIiwgInN5cy5tZXRhX3BhdGgiLCAic3lzLnBhdGhfaG9va3MiLgoKCkZ1dHVyZSBzdGF0ZW1lbnRzCj09PT09PT09PT09PT09PT09CgpBICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXIKbW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZQphdmFpbGFibGUgaW4gYSBzcGVjaWZpZWQgZnV0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uIHdoZXJlIHRoZSBmZWF0dXJlCmJlY29tZXMgc3RhbmRhcmQuCgpUaGUgZnV0dXJlIHN0YXRlbWVudCBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBmdXR1cmUgdmVyc2lvbnMKb2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0CmFsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZQpyZWxlYXNlIGluIHdoaWNoIHRoZSBmZWF0dXJlIGJlY29tZXMgc3RhbmRhcmQuCgogICBmdXR1cmVfc3RtdCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgaWRlbnRpZmllcl0pKgogICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgaWRlbnRpZmllcl0pKiBbIiwiXSAiKSIKICAgZmVhdHVyZSAgICAgOjo9IGlkZW50aWZpZXIKCkEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5CmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZToKCiogdGhlIG1vZHVsZSBkb2NzdHJpbmcgKGlmIGFueSksCgoqIGNvbW1lbnRzLAoKKiBibGFuayBsaW5lcywgYW5kCgoqIG90aGVyIGZ1dHVyZSBzdGF0ZW1lbnRzLgoKVGhlIG9ubHkgZmVhdHVyZSB0aGF0IHJlcXVpcmVzIHVzaW5nIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzCiJhbm5vdGF0aW9ucyIgKHNlZSAqKlBFUCA1NjMqKikuCgpBbGwgaGlzdG9yaWNhbCBmZWF0dXJlcyBlbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50IGFyZSBzdGlsbApyZWNvZ25pemVkIGJ5IFB5dGhvbiAzLiAgVGhlIGxpc3QgaW5jbHVkZXMgImFic29sdXRlX2ltcG9ydCIsCiJkaXZpc2lvbiIsICJnZW5lcmF0b3JzIiwgImdlbmVyYXRvcl9zdG9wIiwgInVuaWNvZGVfbGl0ZXJhbHMiLAoicHJpbnRfZnVuY3Rpb24iLCAibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwKcmVkdW5kYW50IGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5LgoKQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGUKdGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW4KaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlCnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3CnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGUKbW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWwKcnVudGltZS4KCkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZQpiZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50CmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuCgpUaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6CnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgd2lsbApiZSBpbXBvcnRlZCBpbiB0aGUgdXN1YWwgd2F5IGF0IHRoZSB0aW1lIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzCmV4ZWN1dGVkLgoKVGhlIGludGVyZXN0aW5nIHJ1bnRpbWUgc2VtYW50aWNzIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZQplbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LgoKTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgc3RhdGVtZW50OgoKICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdCgpUaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl04oCZcyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGgKbm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy4KCkNvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXhlYygpIiBhbmQKImNvbXBpbGUoKSIgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZSAiTSIgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnQKd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggdGhlCmZ1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyB0bwoiY29tcGlsZSgpIiDigJQgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgpBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGwKdGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW4KaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAiLWkiIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWUKdG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluCmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXMKZXhlY3V0ZWQuCgpTZWUgYWxzbzoKCiAgKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fCiAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uCtoCaW5hfwYAAE1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIgpldmFsdWF0ZXMgdG8gIlRydWUiIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCAiRmFsc2UiIG90aGVyd2lzZS4KInggbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlcwphbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzCndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMKbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlCmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW4KeSkiLgoKRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgKngqCmlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4KRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyCnN0cmluZywgc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuCgpGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgIngKaW4geSIgcmV0dXJucyAiVHJ1ZSIgaWYgInkuX19jb250YWluc19fKHgpIiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSwgYW5kCiJGYWxzZSIgb3RoZXJ3aXNlLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG8KZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgIlRydWUiIGlmIHNvbWUgdmFsdWUgInoiLCBmb3Igd2hpY2gKdGhlIGV4cHJlc3Npb24gInggaXMgeiBvciB4ID09IHoiIGlzIHRydWUsIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZwpvdmVyICJ5Ii4gSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYKImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uCgpMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXMKIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tCm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCBpcyB5W2ldIG9yIHggPT0geVtpXSIsIGFuZCBubwpsb3dlciBpbnRlZ2VyIGluZGV4IHJhaXNlcyB0aGUgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXIKZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLgoKVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZSBvZgoiaW4iLgraCGludGVnZXJzYVYFAABJbnRlZ2VyIGxpdGVyYWxzCioqKioqKioqKioqKioqKioKCkludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBpbnRlZ2VyICAgICAgOjo9IGRlY2ludGVnZXIgfCBiaW5pbnRlZ2VyIHwgb2N0aW50ZWdlciB8IGhleGludGVnZXIKICAgZGVjaW50ZWdlciAgIDo6PSBub256ZXJvZGlnaXQgKFsiXyJdIGRpZ2l0KSogfCAiMCIrIChbIl8iXSAiMCIpKgogICBiaW5pbnRlZ2VyICAgOjo9ICIwIiAoImIiIHwgIkIiKSAoWyJfIl0gYmluZGlnaXQpKwogICBvY3RpbnRlZ2VyICAgOjo9ICIwIiAoIm8iIHwgIk8iKSAoWyJfIl0gb2N0ZGlnaXQpKwogICBoZXhpbnRlZ2VyICAgOjo9ICIwIiAoIngiIHwgIlgiKSAoWyJfIl0gaGV4ZGlnaXQpKwogICBub256ZXJvZGlnaXQgOjo9ICIxIi4uLiI5IgogICBkaWdpdCAgICAgICAgOjo9ICIwIi4uLiI5IgogICBiaW5kaWdpdCAgICAgOjo9ICIwIiB8ICIxIgogICBvY3RkaWdpdCAgICAgOjo9ICIwIi4uLiI3IgogICBoZXhkaWdpdCAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiCgpUaGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIGxlbmd0aCBvZiBpbnRlZ2VyIGxpdGVyYWxzIGFwYXJ0IGZyb20gd2hhdApjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuCgpVbmRlcnNjb3JlcyBhcmUgaWdub3JlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlCmxpdGVyYWwuICBUaGV5IGNhbiBiZSB1c2VkIHRvIGdyb3VwIGRpZ2l0cyBmb3IgZW5oYW5jZWQgcmVhZGFiaWxpdHkuCk9uZSB1bmRlcnNjb3JlIGNhbiBvY2N1ciBiZXR3ZWVuIGRpZ2l0cywgYW5kIGFmdGVyIGJhc2Ugc3BlY2lmaWVycwpsaWtlICIweCIuCgpOb3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgYWxsb3dlZC4KVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob24KdXNlZCBiZWZvcmUgdmVyc2lvbiAzLjAuCgpTb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6CgogICA3ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMG8xNzcgICAgMGIxMDAxMTAxMTEKICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4ZGVhZGJlZWYKICAgICAgICAgMTAwXzAwMF8wMDBfMDAwICAgICAgICAgICAgICAgICAgIDBiXzExMTBfMDEwMQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogVW5kZXJzY29yZXMgYXJlIG5vdyBhbGxvd2VkIGZvciBncm91cGluZwpwdXJwb3NlcyBpbiBsaXRlcmFscy4K2gZsYW1iZGFhDQIAAExhbWJkYXMKKioqKioqKgoKICAgbGFtYmRhX2V4cHIgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF0gIjoiIGV4cHJlc3Npb24KCkxhbWJkYSBleHByZXNzaW9ucyAoc29tZXRpbWVzIGNhbGxlZCBsYW1iZGEgZm9ybXMpIGFyZSB1c2VkIHRvIGNyZWF0ZQphbm9ueW1vdXMgZnVuY3Rpb25zLiBUaGUgZXhwcmVzc2lvbiAibGFtYmRhIHBhcmFtZXRlcnM6IGV4cHJlc3Npb24iCnlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSBmdW5jdGlvbgpvYmplY3QgZGVmaW5lZCB3aXRoOgoKICAgZGVmIDxsYW1iZGE+KHBhcmFtZXRlcnMpOgogICAgICAgcmV0dXJuIGV4cHJlc3Npb24KClNlZSBzZWN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy4KTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluCnN0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuCtoFbGlzdHNhOwIAAExpc3QgZGlzcGxheXMKKioqKioqKioqKioqKgoKQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgaW4Kc3F1YXJlIGJyYWNrZXRzOgoKICAgbGlzdF9kaXNwbGF5IDo6PSAiWyIgW2ZsZXhpYmxlX2V4cHJlc3Npb25fbGlzdCB8IGNvbXByZWhlbnNpb25dICJdIgoKQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LCB0aGUgY29udGVudHMgYmVpbmcgc3BlY2lmaWVkCmJ5IGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBjb21wcmVoZW5zaW9uLiAgV2hlbiBhIGNvbW1hLQpzZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWQKZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW4gdGhhdCBvcmRlci4KV2hlbiBhIGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIHRoZSBsaXN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlCmVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLgraBm5hbWluZ3WRKQAATmFtaW5nIGFuZCBiaW5kaW5nCioqKioqKioqKioqKioqKioqKgoKCkJpbmRpbmcgb2YgbmFtZXMKPT09PT09PT09PT09PT09PQoKKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuCgpUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczoKCiogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLAoKKiBjbGFzcyBkZWZpbml0aW9ucywKCiogZnVuY3Rpb24gZGVmaW5pdGlvbnMsCgoqIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsCgoqIHRhcmdldHMgdGhhdCBhcmUgaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQ6CgogICogImZvciIgbG9vcCBoZWFkZXIsCgogICogYWZ0ZXIgImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQsICJleGNlcHQiIGNsYXVzZSwgImV4Y2VwdCoiCiAgICBjbGF1c2UsIG9yIGluIHRoZSBhcy1wYXR0ZXJuIGluIHN0cnVjdHVyYWwgcGF0dGVybiBtYXRjaGluZywKCiAgKiBpbiBhIGNhcHR1cmUgcGF0dGVybiBpbiBzdHJ1Y3R1cmFsIHBhdHRlcm4gbWF0Y2hpbmcKCiogImltcG9ydCIgc3RhdGVtZW50cy4KCiogInR5cGUiIHN0YXRlbWVudHMuCgoqIHR5cGUgcGFyYW1ldGVyIGxpc3RzLgoKVGhlICJpbXBvcnQiIHN0YXRlbWVudCBvZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcwpkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbgp1bmRlcnNjb3JlLiBUaGlzIGZvcm0gbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLgoKQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3IKdGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuCgpFYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhCmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbApjb2RlIGJsb2NrKS4KCklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2ssCnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZQptb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZQpjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGUKYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi4KCkVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICpiaW5kaW5nKgpvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuCgoKUmVzb2x1dGlvbiBvZiBuYW1lcwo9PT09PT09PT09PT09PT09PT09CgpBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsCnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGUKZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrcwpjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzCmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLgoKV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0CmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrCmlzIGNhbGxlZCB0aGUgYmxvY2vigJlzICplbnZpcm9ubWVudCouCgpXaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmCnRoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbAp2YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlCm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLgoiVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuCgpJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbAp1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGUKY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGEKYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrcwpkZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZQp3aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlCmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuIFNlZSB0aGUgRkFRIGVudHJ5IG9uIFVuYm91bmRMb2NhbEVycm9yIGZvciBleGFtcGxlcy4KCklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZXMKc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmdzIG9mIHRob3NlIG5hbWVzIGluIHRoZQp0b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5CnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUKY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2UKb2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgZmlyc3QuICBJZgp0aGUgbmFtZXMgYXJlIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZApuZXh0LiBJZiB0aGUgbmFtZXMgYXJlIGFsc28gbm90IGZvdW5kIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIG5ldwp2YXJpYWJsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZSBnbG9iYWwgc3RhdGVtZW50Cm11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbGlzdGVkIG5hbWVzLgoKVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uCmluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgdmFyaWFibGUKY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLgoKVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyIHRvCnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4KIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90CmV4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuIFR5cGUgcGFyYW1ldGVycyBjYW5ub3QgYmUKcmVib3VuZCB3aXRoIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC4KClRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhCm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZAoiX19tYWluX18iLgoKQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlCnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4KZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMKZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0CnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZQpuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2YKdGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8KdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMuClRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucywgYnV0IGl0IGRvZXMKbm90IGluY2x1ZGUgYW5ub3RhdGlvbiBzY29wZXMsIHdoaWNoIGhhdmUgYWNjZXNzIHRvIHRoZWlyIGVuY2xvc2luZwpjbGFzcyBzY29wZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbDoKCiAgIGNsYXNzIEE6CiAgICAgICBhID0gNDIKICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSkKCkhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgd2lsbCBzdWNjZWVkOgoKICAgY2xhc3MgQToKICAgICAgIHR5cGUgQWxpYXMgPSBOZXN0ZWQKICAgICAgIGNsYXNzIE5lc3RlZDogcGFzcwoKICAgcHJpbnQoQS5BbGlhcy5fX3ZhbHVlX18pICAjIDx0eXBlICdBLk5lc3RlZCc+CgoKQW5ub3RhdGlvbiBzY29wZXMKPT09PT09PT09PT09PT09PT0KClR5cGUgcGFyYW1ldGVyIGxpc3RzIGFuZCAidHlwZSIgc3RhdGVtZW50cyBpbnRyb2R1Y2UgKmFubm90YXRpb24Kc2NvcGVzKiwgd2hpY2ggYmVoYXZlIG1vc3RseSBsaWtlIGZ1bmN0aW9uIHNjb3BlcywgYnV0IHdpdGggc29tZQpleGNlcHRpb25zIGRpc2N1c3NlZCBiZWxvdy4gKkFubm90YXRpb25zKiBjdXJyZW50bHkgZG8gbm90IHVzZQphbm5vdGF0aW9uIHNjb3BlcywgYnV0IHRoZXkgYXJlIGV4cGVjdGVkIHRvIHVzZSBhbm5vdGF0aW9uIHNjb3BlcyBpbgpQeXRob24gMy4xMyB3aGVuICoqUEVQIDY0OSoqIGlzIGltcGxlbWVudGVkLgoKQW5ub3RhdGlvbiBzY29wZXMgYXJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZyBjb250ZXh0czoKCiogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgZm9yIGdlbmVyaWMgdHlwZSBhbGlhc2VzLgoKKiBUeXBlIHBhcmFtZXRlciBsaXN0cyBmb3IgZ2VuZXJpYyBmdW5jdGlvbnMuIEEgZ2VuZXJpYyBmdW5jdGlvbuKAmXMKICBhbm5vdGF0aW9ucyBhcmUgZXhlY3V0ZWQgd2l0aGluIHRoZSBhbm5vdGF0aW9uIHNjb3BlLCBidXQgaXRzCiAgZGVmYXVsdHMgYW5kIGRlY29yYXRvcnMgYXJlIG5vdC4KCiogVHlwZSBwYXJhbWV0ZXIgbGlzdHMgZm9yIGdlbmVyaWMgY2xhc3Nlcy4gQSBnZW5lcmljIGNsYXNz4oCZcyBiYXNlCiAgY2xhc3NlcyBhbmQga2V5d29yZCBhcmd1bWVudHMgYXJlIGV4ZWN1dGVkIHdpdGhpbiB0aGUgYW5ub3RhdGlvbgogIHNjb3BlLCBidXQgaXRzIGRlY29yYXRvcnMgYXJlIG5vdC4KCiogVGhlIGJvdW5kcywgY29uc3RyYWludHMsIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAgKGxhemlseSBldmFsdWF0ZWQpLgoKKiBUaGUgdmFsdWUgb2YgdHlwZSBhbGlhc2VzIChsYXppbHkgZXZhbHVhdGVkKS4KCkFubm90YXRpb24gc2NvcGVzIGRpZmZlciBmcm9tIGZ1bmN0aW9uIHNjb3BlcyBpbiB0aGUgZm9sbG93aW5nIHdheXM6CgoqIEFubm90YXRpb24gc2NvcGVzIGhhdmUgYWNjZXNzIHRvIHRoZWlyIGVuY2xvc2luZyBjbGFzcyBuYW1lc3BhY2UuIElmCiAgYW4gYW5ub3RhdGlvbiBzY29wZSBpcyBpbW1lZGlhdGVseSB3aXRoaW4gYSBjbGFzcyBzY29wZSwgb3Igd2l0aGluCiAgYW5vdGhlciBhbm5vdGF0aW9uIHNjb3BlIHRoYXQgaXMgaW1tZWRpYXRlbHkgd2l0aGluIGEgY2xhc3Mgc2NvcGUsCiAgdGhlIGNvZGUgaW4gdGhlIGFubm90YXRpb24gc2NvcGUgY2FuIHVzZSBuYW1lcyBkZWZpbmVkIGluIHRoZSBjbGFzcwogIHNjb3BlIGFzIGlmIGl0IHdlcmUgZXhlY3V0ZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjbGFzcyBib2R5LiBUaGlzCiAgY29udHJhc3RzIHdpdGggcmVndWxhciBmdW5jdGlvbnMgZGVmaW5lZCB3aXRoaW4gY2xhc3Nlcywgd2hpY2gKICBjYW5ub3QgYWNjZXNzIG5hbWVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIHNjb3BlLgoKKiBFeHByZXNzaW9ucyBpbiBhbm5vdGF0aW9uIHNjb3BlcyBjYW5ub3QgY29udGFpbiAieWllbGQiLCAieWllbGQKICBmcm9tIiwgImF3YWl0Iiwgb3IgIjo9IiBleHByZXNzaW9ucy4gKFRoZXNlIGV4cHJlc3Npb25zIGFyZSBhbGxvd2VkCiAgaW4gb3RoZXIgc2NvcGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGFubm90YXRpb24gc2NvcGUuKQoKKiBOYW1lcyBkZWZpbmVkIGluIGFubm90YXRpb24gc2NvcGVzIGNhbm5vdCBiZSByZWJvdW5kIHdpdGggIm5vbmxvY2FsIgogIHN0YXRlbWVudHMgaW4gaW5uZXIgc2NvcGVzLiBUaGlzIGluY2x1ZGVzIG9ubHkgdHlwZSBwYXJhbWV0ZXJzLCBhcwogIG5vIG90aGVyIHN5bnRhY3RpYyBlbGVtZW50cyB0aGF0IGNhbiBhcHBlYXIgd2l0aGluIGFubm90YXRpb24gc2NvcGVzCiAgY2FuIGludHJvZHVjZSBuZXcgbmFtZXMuCgoqIFdoaWxlIGFubm90YXRpb24gc2NvcGVzIGhhdmUgYW4gaW50ZXJuYWwgbmFtZSwgdGhhdCBuYW1lIGlzIG5vdAogIHJlZmxlY3RlZCBpbiB0aGUgKnF1YWxpZmllZCBuYW1lKiBvZiBvYmplY3RzIGRlZmluZWQgd2l0aGluIHRoZQogIHNjb3BlLiBJbnN0ZWFkLCB0aGUgIl9fcXVhbG5hbWVfXyIgb2Ygc3VjaCBvYmplY3RzIGlzIGFzIGlmIHRoZQogIG9iamVjdCB3ZXJlIGRlZmluZWQgaW4gdGhlIGVuY2xvc2luZyBzY29wZS4KCkFkZGVkIGluIHZlcnNpb24gMy4xMjogQW5ub3RhdGlvbiBzY29wZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFB5dGhvbgozLjEyIGFzIHBhcnQgb2YgKipQRVAgNjk1KiouCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMzogQW5ub3RhdGlvbiBzY29wZXMgYXJlIGFsc28gdXNlZCBmb3IgdHlwZQpwYXJhbWV0ZXIgZGVmYXVsdHMsIGFzIGludHJvZHVjZWQgYnkgKipQRVAgNjk2KiouCgoKTGF6eSBldmFsdWF0aW9uCj09PT09PT09PT09PT09PQoKVGhlIHZhbHVlcyBvZiB0eXBlIGFsaWFzZXMgY3JlYXRlZCB0aHJvdWdoIHRoZSAidHlwZSIgc3RhdGVtZW50IGFyZQoqbGF6aWx5IGV2YWx1YXRlZCouIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGJvdW5kcywgY29uc3RyYWludHMsIGFuZApkZWZhdWx0IHZhbHVlcyBvZiB0eXBlIHZhcmlhYmxlcyBjcmVhdGVkIHRocm91Z2ggdGhlIHR5cGUgcGFyYW1ldGVyCnN5bnRheC4gVGhpcyBtZWFucyB0aGF0IHRoZXkgYXJlIG5vdCBldmFsdWF0ZWQgd2hlbiB0aGUgdHlwZSBhbGlhcyBvcgp0eXBlIHZhcmlhYmxlIGlzIGNyZWF0ZWQuIEluc3RlYWQsIHRoZXkgYXJlIG9ubHkgZXZhbHVhdGVkIHdoZW4gZG9pbmcKc28gaXMgbmVjZXNzYXJ5IHRvIHJlc29sdmUgYW4gYXR0cmlidXRlIGFjY2Vzcy4KCkV4YW1wbGU6CgogICA+Pj4gdHlwZSBBbGlhcyA9IDEvMAogICA+Pj4gQWxpYXMuX192YWx1ZV9fCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAuLi4KICAgWmVyb0RpdmlzaW9uRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8KICAgPj4+IGRlZiBmdW5jW1Q6IDEvMF0oKTogcGFzcwogICA+Pj4gVCA9IGZ1bmMuX190eXBlX3BhcmFtc19fWzBdCiAgID4+PiBULl9fYm91bmRfXwogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgLi4uCiAgIFplcm9EaXZpc2lvbkVycm9yOiBkaXZpc2lvbiBieSB6ZXJvCgpIZXJlIHRoZSBleGNlcHRpb24gaXMgcmFpc2VkIG9ubHkgd2hlbiB0aGUgIl9fdmFsdWVfXyIgYXR0cmlidXRlIG9mCnRoZSB0eXBlIGFsaWFzIG9yIHRoZSAiX19ib3VuZF9fIiBhdHRyaWJ1dGUgb2YgdGhlIHR5cGUgdmFyaWFibGUgaXMKYWNjZXNzZWQuCgpUaGlzIGJlaGF2aW9yIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHJlZmVyZW5jZXMgdG8gdHlwZXMgdGhhdCBoYXZlCm5vdCB5ZXQgYmVlbiBkZWZpbmVkIHdoZW4gdGhlIHR5cGUgYWxpYXMgb3IgdHlwZSB2YXJpYWJsZSBpcyBjcmVhdGVkLgpGb3IgZXhhbXBsZSwgbGF6eSBldmFsdWF0aW9uIGVuYWJsZXMgY3JlYXRpb24gb2YgbXV0dWFsbHkgcmVjdXJzaXZlCnR5cGUgYWxpYXNlczoKCiAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXRlcmFsCgogICB0eXBlIFNpbXBsZUV4cHIgPSBpbnQgfCBQYXJlbnRoZXNpemVkCiAgIHR5cGUgUGFyZW50aGVzaXplZCA9IHR1cGxlW0xpdGVyYWxbIigiXSwgRXhwciwgTGl0ZXJhbFsiKSJdXQogICB0eXBlIEV4cHIgPSBTaW1wbGVFeHByIHwgdHVwbGVbU2ltcGxlRXhwciwgTGl0ZXJhbFsiKyIsICItIl0sIEV4cHJdCgpMYXppbHkgZXZhbHVhdGVkIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGluIGFubm90YXRpb24gc2NvcGUsIHdoaWNoIG1lYW5zCnRoYXQgbmFtZXMgdGhhdCBhcHBlYXIgaW5zaWRlIHRoZSBsYXppbHkgZXZhbHVhdGVkIHZhbHVlIGFyZSBsb29rZWQgdXAKYXMgaWYgdGhleSB3ZXJlIHVzZWQgaW4gdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBzY29wZS4KCkFkZGVkIGluIHZlcnNpb24gMy4xMi4KCgpCdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb24KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2gKIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzCndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICJpbXBvcnQiCnRoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuCgpUaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9jawppcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyBnbG9iYWwKbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgY2FzZQp0aGUgbW9kdWxl4oCZcyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIl9fbWFpbl9fIgptb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnkKb3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlCiJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4KCgpJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlCnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjoKCiAgIGkgPSAxMAogICBkZWYgZigpOgogICAgICAgcHJpbnQoaSkKICAgaSA9IDQyCiAgIGYoKQoKVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsCmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsCmFuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZAppbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV0KVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8Kb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzCnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC4K2ghub25sb2NhbHVcBAAAVGhlICJub25sb2NhbCIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgbm9ubG9jYWxfc3RtdCA6Oj0gIm5vbmxvY2FsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqCgpXaGVuIHRoZSBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gb3IgY2xhc3MgaXMgbmVzdGVkIChlbmNsb3NlZCkgd2l0aGluCnRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBmdW5jdGlvbnMsIGl0cyBub25sb2NhbCBzY29wZXMgYXJlIHRoZSBsb2NhbApzY29wZXMgb2YgdGhlIGVuY2xvc2luZyBmdW5jdGlvbnMuIFRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgdGhlCmxpc3RlZCBpZGVudGlmaWVycyB0byByZWZlciB0byBuYW1lcyBwcmV2aW91c2x5IGJvdW5kIGluIG5vbmxvY2FsCnNjb3Blcy4gSXQgYWxsb3dzIGVuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCBzdWNoIG5vbmxvY2FsCmlkZW50aWZpZXJzLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGluIG1vcmUgdGhhbiBvbmUgbm9ubG9jYWwgc2NvcGUsIHRoZQpuZWFyZXN0IGJpbmRpbmcgaXMgdXNlZC4gSWYgYSBuYW1lIGlzIG5vdCBib3VuZCBpbiBhbnkgbm9ubG9jYWwgc2NvcGUsCm9yIGlmIHRoZXJlIGlzIG5vIG5vbmxvY2FsIHNjb3BlLCBhICJTeW50YXhFcnJvciIgaXMgcmFpc2VkLgoKVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGFwcGxpZXMgdG8gdGhlIGVudGlyZSBzY29wZSBvZiBhIGZ1bmN0aW9uIG9yCmNsYXNzIGJvZHkuIEEgIlN5bnRheEVycm9yIiBpcyByYWlzZWQgaWYgYSB2YXJpYWJsZSBpcyB1c2VkIG9yCmFzc2lnbmVkIHRvIHByaW9yIHRvIGl0cyBub25sb2NhbCBkZWNsYXJhdGlvbiBpbiB0aGUgc2NvcGUuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzEwNCoqIC0gQWNjZXNzIHRvIE5hbWVzIGluIE91dGVyIFNjb3BlcwogICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQuCgoqKlByb2dyYW1tZXLigJlzIG5vdGU6KiogIm5vbmxvY2FsIiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgcGFyc2VyIGFuZAphcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYWxvbmcgd2l0aCBpdC4gIFNlZSB0aGUgbm90ZSBmb3IgdGhlCiJnbG9iYWwiIHN0YXRlbWVudC4K2gdudW1iZXJzdZUBAABOdW1lcmljIGxpdGVyYWxzCioqKioqKioqKioqKioqKioKClRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBudW1lcmljIGxpdGVyYWxzOiBpbnRlZ2VycywgZmxvYXRpbmctcG9pbnQKbnVtYmVycywgYW5kIGltYWdpbmFyeSBudW1iZXJzLiAgVGhlcmUgYXJlIG5vIGNvbXBsZXggbGl0ZXJhbHMKKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhbgppbWFnaW5hcnkgbnVtYmVyKS4KCk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiCmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yIOKAmCItIuKAmSBhbmQgdGhlCmxpdGVyYWwgIjEiLgp6DW51bWVyaWMtdHlwZXN1+RYAAEVtdWxhdGluZyBudW1lcmljIHR5cGVzCioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuCk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IKbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC4KCm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKQpvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljCiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsCiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yIGluc3RhbmNlLCB0bwogICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYQogICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ0eXBlKHgpLl9fYWRkX18oeCwgeSkiIGlzCiAgIGNhbGxlZC4gIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvCiAgIHVzaW5nICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8KICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdAogICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbgogICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC4KCiAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZQogICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi4KCm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKQpvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMKICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIiwKICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgKHN3YXBwZWQpCiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXMKICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIFszXSBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZgogICBkaWZmZXJlbnQgdHlwZXMuIFs0XSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4IC0KICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICJfX3JzdWJfXygpIgogICBtZXRob2QsICJ0eXBlKHkpLl9fcnN1Yl9fKHksIHgpIiBpcyBjYWxsZWQgaWYgInR5cGUoeCkuX19zdWJfXyh4LAogICB5KSIgcmV0dXJucyAiTm90SW1wbGVtZW50ZWQiLgoKICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZQogICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS4KCiAgIE5vdGU6CgogICAgIElmIHRoZSByaWdodCBvcGVyYW5k4oCZcyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZOKAmXMKICAgICB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCiAgICAgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmTigJlzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiBUaGlzIGJlaGF2aW9yCiAgICAgYWxsb3dzIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3Jz4oCZIG9wZXJhdGlvbnMuCgpvYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpYwogICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLAogICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYXR0ZW1wdCB0bwogICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuIHRoZSByZXN1bHQKICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMKICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBvciBpZiB0aGF0IG1ldGhvZCByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIsCiAgIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgbWV0aG9kcy4gIEZvcgogICBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCBhbiAiX19pYWRkX18oKSIKICAgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ID0geC5fX2lhZGRfXyh5KSIgLiBJZgogICAiX19pYWRkX18oKSIgZG9lcyBub3QgZXhpc3QsIG9yIGlmICJ4Ll9faWFkZF9fKHkpIiByZXR1cm5zCiAgICJOb3RJbXBsZW1lbnRlZCIsICJ4Ll9fYWRkX18oeSkiIGFuZCAieS5fX3JhZGRfXyh4KSIgYXJlCiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpbgogICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgZXJyb3JzCiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBb4oCYaXRlbeKAmV0gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCiAgIGFkZGl0aW9uIHdvcmtzPyksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YQogICBtb2RlbC4KCm9iamVjdC5fX25lZ19fKHNlbGYpCm9iamVjdC5fX3Bvc19fKHNlbGYpCm9iamVjdC5fX2Fic19fKHNlbGYpCm9iamVjdC5fX2ludmVydF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgIisiLAogICAiYWJzKCkiIGFuZCAifiIpLgoKb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpCm9iamVjdC5fX2ludF9fKHNlbGYpCm9iamVjdC5fX2Zsb2F0X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgImludCgpIiBhbmQKICAgImZsb2F0KCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgoKb2JqZWN0Ll9faW5kZXhfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IuaW5kZXgoKSIsIGFuZCB3aGVuZXZlciBQeXRob24gbmVlZHMKICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaAogICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIgogICBmdW5jdGlvbnMpLiBQcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtZXJpYwogICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci4KCiAgIElmICJfX2ludF9fKCkiLCAiX19mbG9hdF9fKCkiIGFuZCAiX19jb21wbGV4X18oKSIgYXJlIG5vdCBkZWZpbmVkCiAgIHRoZW4gY29ycmVzcG9uZGluZyBidWlsdC1pbiBmdW5jdGlvbnMgImludCgpIiwgImZsb2F0KCkiIGFuZAogICAiY29tcGxleCgpIiBmYWxsIGJhY2sgdG8gIl9faW5kZXhfXygpIi4KCm9iamVjdC5fX3JvdW5kX18oc2VsZlssIG5kaWdpdHNdKQpvYmplY3QuX190cnVuY19fKHNlbGYpCm9iamVjdC5fX2Zsb29yX18oc2VsZikKb2JqZWN0Ll9fY2VpbF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicm91bmQoKSIgYW5kICJtYXRoIgogICBmdW5jdGlvbnMgInRydW5jKCkiLCAiZmxvb3IoKSIgYW5kICJjZWlsKCkiLiBVbmxlc3MgKm5kaWdpdHMqIGlzCiAgIHBhc3NlZCB0byAiX19yb3VuZF9fKCkiIGFsbCB0aGVzZSBtZXRob2RzIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlCiAgIG9mIHRoZSBvYmplY3QgdHJ1bmNhdGVkIHRvIGFuICJJbnRlZ3JhbCIgKHR5cGljYWxseSBhbiAiaW50IikuCgogICBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImludCgpIiBmYWxscyBiYWNrIHRvICJfX3RydW5jX18oKSIgaWYKICAgbmVpdGhlciAiX19pbnRfXygpIiBub3IgIl9faW5kZXhfXygpIiBpcyBkZWZpbmVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IFRoZSBkZWxlZ2F0aW9uIG9mICJpbnQoKSIgdG8gIl9fdHJ1bmNfXygpIgogICBpcyBkZXByZWNhdGVkLgraB29iamVjdHN1kBIAAE9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMKKioqKioqKioqKioqKioqKioqKioqKioqKgoKKk9iamVjdHMqIGFyZSBQeXRob27igJlzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSBQeXRob24KcHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuCkV2ZW4gY29kZSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzLgoKRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN04oCZcwoqaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rIG9mIGl0CmFzIHRoZSBvYmplY3TigJlzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlICJpcyIgb3BlcmF0b3IgY29tcGFyZXMgdGhlCmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlcgpyZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5LgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgbWVtb3J5CmFkZHJlc3Mgd2hlcmUgIngiIGlzIHN0b3JlZC4KCkFuIG9iamVjdOKAmXMgdHlwZSBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCBzdXBwb3J0cwooZS5nLiwg4oCcZG9lcyBpdCBoYXZlIGEgbGVuZ3RoP+KAnSkgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzCmZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdOKAmXMKdHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gb2JqZWN04oCZcwoqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXQoKVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzIHdob3NlIHZhbHVlIGNhbgpjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzIHVuY2hhbmdlYWJsZQpvbmNlIHRoZXkgYXJlIGNyZWF0ZWQgYXJlIGNhbGxlZCAqaW1tdXRhYmxlKi4gKFRoZSB2YWx1ZSBvZiBhbgppbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZQpvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXLigJlzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXIgdGhlCmNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZgpvYmplY3RzIGl0IGNvbnRhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkLiAgU28sIGltbXV0YWJpbGl0eSBpcyBub3QKc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSBzdWJ0bGUuKQpBbiBvYmplY3TigJlzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLApudW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZApsaXN0cyBhcmUgbXV0YWJsZS4KCk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lCnVucmVhY2hhYmxlIHRoZXkgbWF5IGJlIGdhcmJhZ2UtY29sbGVjdGVkLiAgQW4gaW1wbGVtZW50YXRpb24gaXMKYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIOKAlCBpdCBpcyBhCm1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMKaW1wbGVtZW50ZWQsIGFzIGxvbmcgYXMgbm8gb2JqZWN0cyBhcmUgY29sbGVjdGVkIHRoYXQgYXJlIHN0aWxsCnJlYWNoYWJsZS4KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQ1B5dGhvbiBjdXJyZW50bHkgdXNlcyBhIHJlZmVyZW5jZS0KY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5IGxpbmtlZApnYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZQp1bnJlYWNoYWJsZSwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbGxlY3QgZ2FyYmFnZSBjb250YWluaW5nCmNpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICJnYyIgbW9kdWxlIGZvcgppbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXIKaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgZGVwZW5kCm9uIGltbWVkaWF0ZSBmaW5hbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIHRoZXkgYmVjb21lIHVucmVhY2hhYmxlIChzbwp5b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS4KCk5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbuKAmXMgdHJhY2luZyBvciBkZWJ1Z2dpbmcKZmFjaWxpdGllcyBtYXkga2VlcCBvYmplY3RzIGFsaXZlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgY29sbGVjdGFibGUuCkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgInRyeSLigKYiZXhjZXB0IiBzdGF0ZW1lbnQKbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS4KClNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8g4oCcZXh0ZXJuYWzigJ0gcmVzb3VyY2VzIHN1Y2ggYXMgb3BlbgpmaWxlcyBvciB3aW5kb3dzLiAgSXQgaXMgdW5kZXJzdG9vZCB0aGF0IHRoZXNlIHJlc291cmNlcyBhcmUgZnJlZWQKd2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzCm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG8KcmVsZWFzZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UsIHVzdWFsbHkgYSAiY2xvc2UoKSIgbWV0aG9kLiBQcm9ncmFtcwphcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZXhwbGljaXRseSBjbG9zZSBzdWNoIG9iamVjdHMuICBUaGUKInRyeSLigKYiZmluYWxseSIgc3RhdGVtZW50IGFuZCB0aGUgIndpdGgiIHN0YXRlbWVudCBwcm92aWRlIGNvbnZlbmllbnQKd2F5cyB0byBkbyB0aGlzLgoKU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkCipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmQKZGljdGlvbmFyaWVzLiAgVGhlIHJlZmVyZW5jZXMgYXJlIHBhcnQgb2YgYSBjb250YWluZXLigJlzIHZhbHVlLiAgSW4KbW9zdCBjYXNlcywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciwgd2UgaW1wbHkgdGhlCnZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgd2hlbiB3ZQp0YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZQppbW1lZGlhdGVseSBjb250YWluZWQgb2JqZWN0cyBhcmUgaW1wbGllZC4gIFNvLCBpZiBhbiBpbW11dGFibGUKY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0cwp2YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC4KClR5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGUKaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZQp0eXBlcywgb3BlcmF0aW9ucyB0aGF0IGNvbXB1dGUgbmV3IHZhbHVlcyBtYXkgYWN0dWFsbHkgcmV0dXJuIGEKcmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgd2hpbGUKZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiBGb3IgZXhhbXBsZSwgYWZ0ZXIgImEgPSAxOyBiCj0gMSIsICphKiBhbmQgKmIqIG1heSBvciBtYXkgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB3aXRoIHRoZQp2YWx1ZSBvbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24uIFRoaXMgaXMgYmVjYXVzZSAiaW50IiBpcwphbiBpbW11dGFibGUgdHlwZSwgc28gdGhlIHJlZmVyZW5jZSB0byAiMSIgY2FuIGJlIHJldXNlZC4gVGhpcwpiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCwgc28gc2hvdWxkIG5vdCBiZSByZWxpZWQKdXBvbiwgYnV0IGlzIHNvbWV0aGluZyB0byBiZSBhd2FyZSBvZiB3aGVuIG1ha2luZyB1c2Ugb2Ygb2JqZWN0CmlkZW50aXR5IHRlc3RzLiBIb3dldmVyLCBhZnRlciAiYyA9IFtdOyBkID0gW10iLCAqYyogYW5kICpkKiBhcmUKZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5IGNyZWF0ZWQgZW1wdHkKbGlzdHMuIChOb3RlIHRoYXQgImUgPSBmID0gW10iIGFzc2lnbnMgdGhlICpzYW1lKiBvYmplY3QgdG8gYm90aCAqZSoKYW5kICpmKi4pCnoQb3BlcmF0b3Itc3VtbWFyeXWzHAAAT3BlcmF0b3IgcHJlY2VkZW5jZQoqKioqKioqKioqKioqKioqKioqCgpUaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgaW4gUHl0aG9uLCBmcm9tCmhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdCBiaW5kaW5nKSB0byBsb3dlc3QgcHJlY2VkZW5jZSAobGVhc3QKYmluZGluZykuICBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzcwp0aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgT3BlcmF0b3JzIGluCnRoZSBzYW1lIGJveCBncm91cCBsZWZ0IHRvIHJpZ2h0IChleGNlcHQgZm9yIGV4cG9uZW50aWF0aW9uIGFuZApjb25kaXRpb25hbCBleHByZXNzaW9ucywgd2hpY2ggZ3JvdXAgZnJvbSByaWdodCB0byBsZWZ0KS4KCk5vdGUgdGhhdCBjb21wYXJpc29ucywgbWVtYmVyc2hpcCB0ZXN0cywgYW5kIGlkZW50aXR5IHRlc3RzLCBhbGwgaGF2ZQp0aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyBmZWF0dXJlIGFzCmRlc2NyaWJlZCBpbiB0aGUgQ29tcGFyaXNvbnMgc2VjdGlvbi4KCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CnwgIihleHByZXNzaW9ucy4uLikiLCAgIltleHByZXNzaW9ucy4uLl0iLCAie2tleTogfCBCaW5kaW5nIG9yIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiwgIHwKfCB2YWx1ZS4uLn0iLCAie2V4cHJlc3Npb25zLi4ufSIgICAgICAgICAgICAgICAgICB8IGxpc3QgZGlzcGxheSwgZGljdGlvbmFyeSBkaXNwbGF5LCBzZXQgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAieFtpbmRleF0iLCAieFtpbmRleDppbmRleF0iLCAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfAp8ICJ4KGFyZ3VtZW50cy4uLikiLCAieC5hdHRyaWJ1dGUiICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlIHJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiYXdhaXQgeCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEF3YWl0IGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIioqIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBvbmVudGlhdGlvbiBbNV0gICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICIreCIsICIteCIsICJ+eCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIgICAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBtYXRyaXggICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbXVsdGlwbGljYXRpb24sIGRpdmlzaW9uLCBmbG9vciAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaXZpc2lvbiwgcmVtYWluZGVyIFs2XSAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICIrIiwgIi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiPDwiLCAiPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIiYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImluIiwgIm5vdCBpbiIsICJpcyIsICJpcyBub3QiLCAiPCIsICI8PSIsICI+IiwgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHwKfCAiPj0iLCAiIT0iLCAiPT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIm5vdCB4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImlmIiDigJMgImVsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImxhbWJkYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICI6PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXNzaWdubWVudCBleHByZXNzaW9uICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFdoaWxlICJhYnMoeCV5KSA8IGFicyh5KSIgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0cyBpdAogICAgbWF5IG5vdCBiZSB0cnVlIG51bWVyaWNhbGx5IGR1ZSB0byByb3VuZG9mZi4gIEZvciBleGFtcGxlLCBhbmQKICAgIGFzc3VtaW5nIGEgcGxhdGZvcm0gb24gd2hpY2ggYSBQeXRob24gZmxvYXQgaXMgYW4gSUVFRSA3NTQgZG91YmxlLQogICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCAiLTFlLTEwMCAlIDFlMTAwIiBoYXZlIHRoZSBzYW1lCiAgICBzaWduIGFzICIxZTEwMCIsIHRoZSBjb21wdXRlZCByZXN1bHQgaXMgIi0xZS0xMDAgKyAxZTEwMCIsIHdoaWNoCiAgICBpcyBudW1lcmljYWxseSBleGFjdGx5IGVxdWFsIHRvICIxZTEwMCIuICBUaGUgZnVuY3Rpb24KICAgICJtYXRoLmZtb2QoKSIgcmV0dXJucyBhIHJlc3VsdCB3aG9zZSBzaWduIG1hdGNoZXMgdGhlIHNpZ24gb2YgdGhlCiAgICBmaXJzdCBhcmd1bWVudCBpbnN0ZWFkLCBhbmQgc28gcmV0dXJucyAiLTFlLTEwMCIgaW4gdGhpcyBjYXNlLgogICAgV2hpY2ggYXBwcm9hY2ggaXMgbW9yZSBhcHByb3ByaWF0ZSBkZXBlbmRzIG9uIHRoZSBhcHBsaWNhdGlvbi4KClsyXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdOKAmXMKICAgIHBvc3NpYmxlIGZvciAieC8veSIgdG8gYmUgb25lIGxhcmdlciB0aGFuICIoeC14JXkpLy95IiBkdWUgdG8KICAgIHJvdW5kaW5nLiAgSW4gc3VjaCBjYXNlcywgUHl0aG9uIHJldHVybnMgdGhlIGxhdHRlciByZXN1bHQsIGluCiAgICBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0ICJkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeSIgYmUgdmVyeSBjbG9zZQogICAgdG8gIngiLgoKWzNdIFRoZSBVbmljb2RlIHN0YW5kYXJkIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAqY29kZSBwb2ludHMqIChlLmcuCiAgICBVKzAwNDEpIGFuZCAqYWJzdHJhY3QgY2hhcmFjdGVycyogKGUuZy4g4oCcTEFUSU4gQ0FQSVRBTCBMRVRURVIgQeKAnSkuCiAgICBXaGlsZSBtb3N0IGFic3RyYWN0IGNoYXJhY3RlcnMgaW4gVW5pY29kZSBhcmUgb25seSByZXByZXNlbnRlZAogICAgdXNpbmcgb25lIGNvZGUgcG9pbnQsIHRoZXJlIGlzIGEgbnVtYmVyIG9mIGFic3RyYWN0IGNoYXJhY3RlcnMKICAgIHRoYXQgY2FuIGluIGFkZGl0aW9uIGJlIHJlcHJlc2VudGVkIHVzaW5nIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuCiAgICBvbmUgY29kZSBwb2ludC4gIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3QgY2hhcmFjdGVyIOKAnExBVElOCiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQeKAnSBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUKICAgICpwcmVjb21wb3NlZCBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMEM3LCBvciBhcyBhIHNlcXVlbmNlCiAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOIENBUElUQUwKICAgIExFVFRFUiBDKSwgZm9sbG93ZWQgYnkgYSAqY29tYmluaW5nIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbgogICAgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuCgogICAgVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIG9uIHN0cmluZ3MgY29tcGFyZSBhdCB0aGUgbGV2ZWwgb2YKICAgIFVuaWNvZGUgY29kZSBwb2ludHMuIFRoaXMgbWF5IGJlIGNvdW50ZXItaW50dWl0aXZlIHRvIGh1bWFucy4gIEZvcgogICAgZXhhbXBsZSwgIiJcdTAwQzciID09ICJcdTAwNDNcdTAzMjciIiBpcyAiRmFsc2UiLCBldmVuIHRob3VnaCBib3RoCiAgICBzdHJpbmdzIHJlcHJlc2VudCB0aGUgc2FtZSBhYnN0cmFjdCBjaGFyYWN0ZXIg4oCcTEFUSU4gQ0FQSVRBTAogICAgTEVUVEVSIEMgV0lUSCBDRURJTExB4oCdLgoKICAgIFRvIGNvbXBhcmUgc3RyaW5ncyBhdCB0aGUgbGV2ZWwgb2YgYWJzdHJhY3QgY2hhcmFjdGVycyAodGhhdCBpcywKICAgIGluIGEgd2F5IGludHVpdGl2ZSB0byBodW1hbnMpLCB1c2UgInVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgpIi4KCls0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZSBkeW5hbWljCiAgICBuYXR1cmUgb2YgZGVzY3JpcHRvcnMsIHlvdSBtYXkgbm90aWNlIHNlZW1pbmdseSB1bnVzdWFsIGJlaGF2aW91cgogICAgaW4gY2VydGFpbiB1c2VzIG9mIHRoZSAiaXMiIG9wZXJhdG9yLCBsaWtlIHRob3NlIGludm9sdmluZwogICAgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciBjb25zdGFudHMuICBDaGVjayB0aGVpcgogICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLgoKWzVdIFRoZSBwb3dlciBvcGVyYXRvciAiKioiIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuIGFyaXRobWV0aWMgb3IKICAgIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCAiMioqLTEiIGlzICIwLjUiLgoKWzZdIFRoZSAiJSIgb3BlcmF0b3IgaXMgYWxzbyB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZzsgdGhlIHNhbWUKICAgIHByZWNlZGVuY2UgYXBwbGllcy4K2gRwYXNzdXcBAABUaGUgInBhc3MiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKgoKICAgcGFzc19zdG10IDo6PSAicGFzcyIKCiJwYXNzIiBpcyBhIG51bGwgb3BlcmF0aW9uIOKAlCB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nIGhhcHBlbnMuIEl0CmlzIHVzZWZ1bCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseSwKYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOgoKICAgZGVmIGYoYXJnKTogcGFzcyAgICAjIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgKHlldCkKCiAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KQraBXBvd2VyYeQEAABUaGUgcG93ZXIgb3BlcmF0b3IKKioqKioqKioqKioqKioqKioqCgpUaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cwpsZWZ0OyBpdCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzIHJpZ2h0LiAgVGhlCnN5bnRheCBpczoKCiAgIHBvd2VyIDo6PSAoYXdhaXRfZXhwciB8IHByaW1hcnkpIFsiKioiIHVfZXhwcl0KClRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGUKb3BlcmF0b3JzIGFyZSBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0ICh0aGlzIGRvZXMgbm90IGNvbnN0cmFpbgp0aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogIi0xKioyIiByZXN1bHRzIGluICItMSIuCgpUaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gInBvdygpIgpmdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgYXJndW1lbnQKcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlCmZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCBhbmQgdGhlIHJlc3VsdCBpcyBvZiB0aGF0IHR5cGUuCgpGb3IgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyB1bmxlc3MKdGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZQpjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsCiIxMCoqMiIgcmV0dXJucyAiMTAwIiwgYnV0ICIxMCoqLTIiIHJldHVybnMgIjAuMDEiLgoKUmFpc2luZyAiMC4wIiB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYSAiWmVyb0RpdmlzaW9uRXJyb3IiLgpSYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZnJhY3Rpb25hbCBwb3dlciByZXN1bHRzIGluIGEgImNvbXBsZXgiCm51bWJlci4gKEluIGVhcmxpZXIgdmVyc2lvbnMgaXQgcmFpc2VkIGEgIlZhbHVlRXJyb3IiLikKClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX3Bvd19fKCkiIGFuZAoiX19ycG93X18oKSIgbWV0aG9kcy4K2gVyYWlzZXV6DwAAVGhlICJyYWlzZSIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKgoKICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbImZyb20iIGV4cHJlc3Npb25dXQoKSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsICJyYWlzZSIgcmUtcmFpc2VzIHRoZSBleGNlcHRpb24gdGhhdCBpcwpjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCwgd2hpY2ggaXMgYWxzbyBrbm93biBhcyB0aGUgKmFjdGl2ZQpleGNlcHRpb24qLiBJZiB0aGVyZSBpc27igJl0IGN1cnJlbnRseSBhbiBhY3RpdmUgZXhjZXB0aW9uLCBhCiJSdW50aW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgYW4gZXJyb3IuCgpPdGhlcndpc2UsICJyYWlzZSIgZXZhbHVhdGVzIHRoZSBmaXJzdCBleHByZXNzaW9uIGFzIHRoZSBleGNlcHRpb24Kb2JqZWN0LiAgSXQgbXVzdCBiZSBlaXRoZXIgYSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZgoiQmFzZUV4Y2VwdGlvbiIuIElmIGl0IGlzIGEgY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2Ugd2lsbCBiZQpvYnRhaW5lZCB3aGVuIG5lZWRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyB3aXRoIG5vIGFyZ3VtZW50cy4KClRoZSAqdHlwZSogb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGluc3RhbmNl4oCZcyBjbGFzcywgdGhlCip2YWx1ZSogaXMgdGhlIGluc3RhbmNlIGl0c2VsZi4KCkEgdHJhY2ViYWNrIG9iamVjdCBpcyBub3JtYWxseSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBleGNlcHRpb24KaXMgcmFpc2VkIGFuZCBhdHRhY2hlZCB0byBpdCBhcyB0aGUgIl9fdHJhY2ViYWNrX18iIGF0dHJpYnV0ZS4gWW91IGNhbgpjcmVhdGUgYW4gZXhjZXB0aW9uIGFuZCBzZXQgeW91ciBvd24gdHJhY2ViYWNrIGluIG9uZSBzdGVwIHVzaW5nIHRoZQoid2l0aF90cmFjZWJhY2soKSIgZXhjZXB0aW9uIG1ldGhvZCAod2hpY2ggcmV0dXJucyB0aGUgc2FtZSBleGNlcHRpb24KaW5zdGFuY2UsIHdpdGggaXRzIHRyYWNlYmFjayBzZXQgdG8gaXRzIGFyZ3VtZW50KSwgbGlrZSBzbzoKCiAgIHJhaXNlIEV4Y2VwdGlvbigiZm9vIG9jY3VycmVkIikud2l0aF90cmFjZWJhY2sodHJhY2ViYWNrb2JqKQoKVGhlICJmcm9tIiBjbGF1c2UgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGNoYWluaW5nOiBpZiBnaXZlbiwgdGhlIHNlY29uZAoqZXhwcmVzc2lvbiogbXVzdCBiZSBhbm90aGVyIGV4Y2VwdGlvbiBjbGFzcyBvciBpbnN0YW5jZS4gSWYgdGhlCnNlY29uZCBleHByZXNzaW9uIGlzIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSwgaXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUKcmFpc2VkIGV4Y2VwdGlvbiBhcyB0aGUgIl9fY2F1c2VfXyIgYXR0cmlidXRlICh3aGljaCBpcyB3cml0YWJsZSkuIElmCnRoZSBleHByZXNzaW9uIGlzIGFuIGV4Y2VwdGlvbiBjbGFzcywgdGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkCmFuZCB0aGUgcmVzdWx0aW5nIGV4Y2VwdGlvbiBpbnN0YW5jZSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSByYWlzZWQKZXhjZXB0aW9uIGFzIHRoZSAiX19jYXVzZV9fIiBhdHRyaWJ1dGUuIElmIHRoZSByYWlzZWQgZXhjZXB0aW9uIGlzIG5vdApoYW5kbGVkLCBib3RoIGV4Y2VwdGlvbnMgd2lsbCBiZSBwcmludGVkOgoKICAgPj4+IHRyeToKICAgLi4uICAgICBwcmludCgxIC8gMCkKICAgLi4uIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gZXhjCiAgIC4uLgogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT4KICAgICAgIHByaW50KDEgLyAwKQogICAgICAgICAgICAgfn5efn4KICAgWmVyb0RpdmlzaW9uRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8KCiAgIFRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246CgogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT4KICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gZXhjCiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZAoKQSBzaW1pbGFyIG1lY2hhbmlzbSB3b3JrcyBpbXBsaWNpdGx5IGlmIGEgbmV3IGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbgphbiBleGNlcHRpb24gaXMgYWxyZWFkeSBiZWluZyBoYW5kbGVkLiAgQW4gZXhjZXB0aW9uIG1heSBiZSBoYW5kbGVkCndoZW4gYW4gImV4Y2VwdCIgb3IgImZpbmFsbHkiIGNsYXVzZSwgb3IgYSAid2l0aCIgc3RhdGVtZW50LCBpcyB1c2VkLgpUaGUgcHJldmlvdXMgZXhjZXB0aW9uIGlzIHRoZW4gYXR0YWNoZWQgYXMgdGhlIG5ldyBleGNlcHRpb27igJlzCiJfX2NvbnRleHRfXyIgYXR0cmlidXRlOgoKICAgPj4+IHRyeToKICAgLi4uICAgICBwcmludCgxIC8gMCkKICAgLi4uIGV4Y2VwdDoKICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKQogICAuLi4KICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+CiAgICAgICBwcmludCgxIC8gMCkKICAgICAgICAgICAgIH5+Xn5+CiAgIFplcm9EaXZpc2lvbkVycm9yOiBkaXZpc2lvbiBieSB6ZXJvCgogICBEdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6CgogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT4KICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpCiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZAoKRXhjZXB0aW9uIGNoYWluaW5nIGNhbiBiZSBleHBsaWNpdGx5IHN1cHByZXNzZWQgYnkgc3BlY2lmeWluZyAiTm9uZSIKaW4gdGhlICJmcm9tIiBjbGF1c2U6CgogICA+Pj4gdHJ5OgogICAuLi4gICAgIHByaW50KDEgLyAwKQogICAuLi4gZXhjZXB0OgogICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gTm9uZQogICAuLi4KICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+CiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZAoKQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uCkV4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb24KVGhlIHRyeSBzdGF0ZW1lbnQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiAiTm9uZSIgaXMgbm93IHBlcm1pdHRlZCBhcyAiWSIgaW4gInJhaXNlIFgKZnJvbSBZIi5BZGRlZCB0aGUgIl9fc3VwcHJlc3NfY29udGV4dF9fIiBhdHRyaWJ1dGUgdG8gc3VwcHJlc3MKYXV0b21hdGljIGRpc3BsYXkgb2YgdGhlIGV4Y2VwdGlvbiBjb250ZXh0LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IElmIHRoZSB0cmFjZWJhY2sgb2YgdGhlIGFjdGl2ZSBleGNlcHRpb24gaXMKbW9kaWZpZWQgaW4gYW4gImV4Y2VwdCIgY2xhdXNlLCBhIHN1YnNlcXVlbnQgInJhaXNlIiBzdGF0ZW1lbnQgcmUtCnJhaXNlcyB0aGUgZXhjZXB0aW9uIHdpdGggdGhlIG1vZGlmaWVkIHRyYWNlYmFjay4gUHJldmlvdXNseSwgdGhlCmV4Y2VwdGlvbiB3YXMgcmUtcmFpc2VkIHdpdGggdGhlIHRyYWNlYmFjayBpdCBoYWQgd2hlbiBpdCB3YXMgY2F1Z2h0LgraBnJldHVybmEXBAAAVGhlICJyZXR1cm4iIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqCgogICByZXR1cm5fc3RtdCA6Oj0gInJldHVybiIgW2V4cHJlc3Npb25fbGlzdF0KCiJyZXR1cm4iIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwKbm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLgoKSWYgYW4gZXhwcmVzc2lvbiBsaXN0IGlzIHByZXNlbnQsIGl0IGlzIGV2YWx1YXRlZCwgZWxzZSAiTm9uZSIgaXMKc3Vic3RpdHV0ZWQuCgoicmV0dXJuIiBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uIGxpc3QgKG9yCiJOb25lIikgYXMgcmV0dXJuIHZhbHVlLgoKV2hlbiAicmV0dXJuIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhICJmaW5hbGx5IgpjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlCmZ1bmN0aW9uLgoKSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSAicmV0dXJuIiBzdGF0ZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhlCmdlbmVyYXRvciBpcyBkb25lIGFuZCB3aWxsIGNhdXNlICJTdG9wSXRlcmF0aW9uIiB0byBiZSByYWlzZWQuIFRoZQpyZXR1cm5lZCB2YWx1ZSAoaWYgYW55KSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvbnN0cnVjdAoiU3RvcEl0ZXJhdGlvbiIgYW5kIGJlY29tZXMgdGhlICJTdG9wSXRlcmF0aW9uLnZhbHVlIiBhdHRyaWJ1dGUuCgpJbiBhbiBhc3luY2hyb25vdXMgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhbiBlbXB0eSAicmV0dXJuIiBzdGF0ZW1lbnQKaW5kaWNhdGVzIHRoYXQgdGhlIGFzeW5jaHJvbm91cyBnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZQoiU3RvcEFzeW5jSXRlcmF0aW9uIiB0byBiZSByYWlzZWQuICBBIG5vbi1lbXB0eSAicmV0dXJuIiBzdGF0ZW1lbnQgaXMKYSBzeW50YXggZXJyb3IgaW4gYW4gYXN5bmNocm9ub3VzIGdlbmVyYXRvciBmdW5jdGlvbi4Keg5zZXF1ZW5jZS10eXBlc3W+GgAARW11bGF0aW5nIGNvbnRhaW5lciB0eXBlcwoqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLgpOb25lIG9mIHRoZW0gYXJlIHByb3ZpZGVkIGJ5IHRoZSAib2JqZWN0IiBjbGFzcyBpdHNlbGYuIENvbnRhaW5lcnMKdXN1YWxseSBhcmUgKnNlcXVlbmNlcyogKHN1Y2ggYXMgImxpc3RzIiBvciAidHVwbGVzIikgb3IgKm1hcHBpbmdzKgoobGlrZSAqZGljdGlvbmFyaWVzKiksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4KVGhlIGZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0bwplbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlCmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSBrIDwgTiIgd2hlcmUKKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciAic2xpY2UiIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhCnJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGUgdGhlCm1ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgImNsZWFyKCkiLAoic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgInVwZGF0ZSgpIgpiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob27igJlzIHN0YW5kYXJkICJkaWN0aW9uYXJ5IiBvYmplY3RzLgpUaGUgImNvbGxlY3Rpb25zLmFiYyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiAqYWJzdHJhY3QKYmFzZSBjbGFzcyogdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YKIl9fZ2V0aXRlbV9fKCkiLCAiX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLgoKTXV0YWJsZSBzZXF1ZW5jZXMgc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY2xlYXIoKSIsCiJjb3VudCgpIiwgImV4dGVuZCgpIiwgImluZGV4KCkiLCAiaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCBhbmQKInJldmVyc2UoKSIsIGxpa2UgUHl0aG9uIHN0YW5kYXJkICJsaXN0IiBvYmplY3RzLiBGaW5hbGx5LCBzZXF1ZW5jZQp0eXBlcyBzaG91bGQgaW1wbGVtZW50IGFkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZAptdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUgbWV0aG9kcwoiX19hZGRfXygpIiwgIl9fcmFkZF9fKCkiLCAiX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kCiJfX2ltdWxfXygpIiBkZXNjcmliZWQgYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsCm9wZXJhdG9ycy4KCkl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUKIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiBvcGVyYXRvcjsKZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmfigJlzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0CnNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGgKbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlICJfX2l0ZXJfXygpIiBtZXRob2QgdG8gYWxsb3cKZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiCnNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlIG9iamVjdOKAmXMga2V5czsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkCml0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLgoKb2JqZWN0Ll9fbGVuX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuCiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdAogICBkb2VzbuKAmXQgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kCiAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiBjb250ZXh0LgoKICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiBDUHl0aG9uLCB0aGUgbGVuZ3RoIGlzCiAgIHJlcXVpcmVkIHRvIGJlIGF0IG1vc3QgInN5cy5tYXhzaXplIi4gSWYgdGhlIGxlbmd0aCBpcyBsYXJnZXIgdGhhbgogICAic3lzLm1heHNpemUiIHNvbWUgZmVhdHVyZXMgKHN1Y2ggYXMgImxlbigpIikgbWF5IHJhaXNlCiAgICJPdmVyZmxvd0Vycm9yIi4gIFRvIHByZXZlbnQgcmFpc2luZyAiT3ZlcmZsb3dFcnJvciIgYnkgdHJ1dGggdmFsdWUKICAgdGVzdGluZywgYW4gb2JqZWN0IG11c3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmxlbmd0aF9oaW50KCkiLiBTaG91bGQgcmV0dXJuIGFuCiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhbgogICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhlCiAgIHJldHVybiB2YWx1ZSBtYXkgYWxzbyBiZSAiTm90SW1wbGVtZW50ZWQiLCB3aGljaCBpcyB0cmVhdGVkIHRoZQogICBzYW1lIGFzIGlmIHRoZSAiX19sZW5ndGhfaGludF9fIiBtZXRob2QgZGlkbuKAmXQgZXhpc3QgYXQgYWxsLiBUaGlzCiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3IKICAgY29ycmVjdG5lc3MuCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuNC4KCk5vdGU6CgogIFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcy4gIEEKICBjYWxsIGxpa2UKCiAgICAgYVsxOjJdID0gYgoKICBpcyB0cmFuc2xhdGVkIHRvCgogICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYgoKICBhbmQgc28gZm9ydGguICBNaXNzaW5nIHNsaWNlIGl0ZW1zIGFyZSBhbHdheXMgZmlsbGVkIGluIHdpdGggIk5vbmUiLgoKb2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yICpzZXF1ZW5jZSoKICAgdHlwZXMsIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2Vycy4gT3B0aW9uYWxseSwgdGhleSBtYXkKICAgc3VwcG9ydCAic2xpY2UiIG9iamVjdHMgYXMgd2VsbC4gIE5lZ2F0aXZlIGluZGV4IHN1cHBvcnQgaXMgYWxzbwogICBvcHRpb25hbC4gSWYgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLCAiVHlwZUVycm9yIiBtYXkgYmUKICAgcmFpc2VkOyBpZiAqa2V5KiBpcyBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUKICAgc2VxdWVuY2UgKGFmdGVyIGFueSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksCiAgICJJbmRleEVycm9yIiBzaG91bGQgYmUgcmFpc2VkLiBGb3IgKm1hcHBpbmcqIHR5cGVzLCBpZiAqa2V5KiBpcwogICBtaXNzaW5nIChub3QgaW4gdGhlIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC4KCiAgIE5vdGU6CgogICAgICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlIHJhaXNlZCBmb3IKICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZQogICAgIHNlcXVlbmNlLgoKICAgTm90ZToKCiAgICAgV2hlbiBzdWJzY3JpcHRpbmcgYSAqY2xhc3MqLCB0aGUgc3BlY2lhbCBjbGFzcyBtZXRob2QKICAgICAiX19jbGFzc19nZXRpdGVtX18oKSIgbWF5IGJlIGNhbGxlZCBpbnN0ZWFkIG9mICJfX2dldGl0ZW1fXygpIi4KICAgICBTZWUgX19jbGFzc19nZXRpdGVtX18gdmVyc3VzIF9fZ2V0aXRlbV9fIGZvciBtb3JlIGRldGFpbHMuCgpvYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3IKICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzCiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGUKICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IKICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuCgpvYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3IKICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWYKICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMKICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZQogICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuCgpvYmplY3QuX19taXNzaW5nX18oc2VsZiwga2V5KQoKICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iIGZvciBkaWN0CiAgIHN1YmNsYXNzZXMgd2hlbiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LgoKb2JqZWN0Ll9faXRlcl9fKHNlbGYpCgogICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiAqaXRlcmF0b3IqIGlzIHJlcXVpcmVkIGZvciBhCiAgIGNvbnRhaW5lci4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4KICAgaXRlcmF0ZSBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdAogICBzaG91bGQgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuCgpvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpCgogICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gaW1wbGVtZW50CiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdAogICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuCgogICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgInJldmVyc2VkKCkiCiAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAoIl9fbGVuX18oKSIKICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2wKICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4KICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkKICAgInJldmVyc2VkKCkiLgoKVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgbm9ybWFsbHkKaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBjb250YWluZXIuIEhvd2V2ZXIsIGNvbnRhaW5lcgpvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnQKaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGl0ZXJhYmxlLgoKb2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlCiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXMKICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3IKICAgdGhlIGtleS1pdGVtIHBhaXJzLgoKICAgRm9yIG9iamVjdHMgdGhhdCBkb27igJl0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgbWVtYmVyc2hpcCB0ZXN0CiAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgc2VxdWVuY2UKICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSB0aGlzIHNlY3Rpb24gaW4gdGhlCiAgIGxhbmd1YWdlIHJlZmVyZW5jZS4K2ghzaGlmdGluZ2GqAgAAU2hpZnRpbmcgb3BlcmF0aW9ucwoqKioqKioqKioqKioqKioqKioqCgpUaGUgc2hpZnRpbmcgb3BlcmF0aW9ucyBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGFyaXRobWV0aWMKb3BlcmF0aW9uczoKCiAgIHNoaWZ0X2V4cHIgOjo9IGFfZXhwciB8IHNoaWZ0X2V4cHIgKCI8PCIgfCAiPj4iKSBhX2V4cHIKClRoZXNlIG9wZXJhdG9ycyBhY2NlcHQgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhleSBzaGlmdCB0aGUgZmlyc3QKYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZQpzZWNvbmQgYXJndW1lbnQuCgpUaGUgbGVmdCBzaGlmdCBvcGVyYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHNwZWNpYWwKIl9fbHNoaWZ0X18oKSIgYW5kICJfX3Jsc2hpZnRfXygpIiBtZXRob2RzLiBUaGUgcmlnaHQgc2hpZnQgb3BlcmF0aW9uCmNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX3JzaGlmdF9fKCkiIGFuZCAiX19ycnNoaWZ0X18oKSIKbWV0aG9kcy4KCkEgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBmbG9vciBkaXZpc2lvbiBieSAicG93KDIsbikiLgpBIGxlZnQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBtdWx0aXBsaWNhdGlvbiB3aXRoICJwb3coMixuKSIuCtoIc2xpY2luZ3NhjQYAAFNsaWNpbmdzCioqKioqKioqCgpBIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhCnN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciBhcwp0YXJnZXRzIGluIGFzc2lnbm1lbnQgb3IgImRlbCIgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEgc2xpY2luZzoKCiAgIHNsaWNpbmcgICAgICA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSIKICAgc2xpY2VfbGlzdCAgIDo6PSBzbGljZV9pdGVtICgiLCIgc2xpY2VfaXRlbSkqIFsiLCJdCiAgIHNsaWNlX2l0ZW0gICA6Oj0gZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZQogICBwcm9wZXJfc2xpY2UgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0gWyAiOiIgW3N0cmlkZV0gXQogICBsb3dlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb24KICAgdXBwZXJfYm91bmQgIDo6PSBleHByZXNzaW9uCiAgIHN0cmlkZSAgICAgICA6Oj0gZXhwcmVzc2lvbgoKVGhlcmUgaXMgYW1iaWd1aXR5IGluIHRoZSBmb3JtYWwgc3ludGF4IGhlcmU6IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZQphbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55IHN1YnNjcmlwdGlvbgpjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzbGljaW5nLiAgUmF0aGVyIHRoYW4gZnVydGhlciBjb21wbGljYXRpbmcgdGhlCnN5bnRheCwgdGhpcyBpcyBkaXNhbWJpZ3VhdGVkIGJ5IGRlZmluaW5nIHRoYXQgaW4gdGhpcyBjYXNlIHRoZQppbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZQppbnRlcnByZXRhdGlvbiBhcyBhIHNsaWNpbmcgKHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHNsaWNlIGxpc3QKY29udGFpbnMgbm8gcHJvcGVyIHNsaWNlKS4KClRoZSBzZW1hbnRpY3MgZm9yIGEgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5IGlzIGluZGV4ZWQKKHVzaW5nIHRoZSBzYW1lICJfX2dldGl0ZW1fXygpIiBtZXRob2QgYXMgbm9ybWFsIHN1YnNjcmlwdGlvbikgd2l0aCBhCmtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNsaWNlIGxpc3QsIGFzIGZvbGxvd3MuICBJZiB0aGUgc2xpY2UKbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIHRoZSBrZXkgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZQpjb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgbG9uZQpzbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0gdGhhdCBpcyBhbgpleHByZXNzaW9uIGlzIHRoYXQgZXhwcmVzc2lvbi4gIFRoZSBjb252ZXJzaW9uIG9mIGEgcHJvcGVyIHNsaWNlIGlzIGEKc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIHdob3NlICJzdGFydCIsCiJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGV4cHJlc3Npb25zIGdpdmVuCmFzIGxvd2VyIGJvdW5kLCB1cHBlciBib3VuZCBhbmQgc3RyaWRlLCByZXNwZWN0aXZlbHksIHN1YnN0aXR1dGluZwoiTm9uZSIgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuCtoMc3BlY2lhbGF0dHJzYWMDAABTcGVjaWFsIEF0dHJpYnV0ZXMKKioqKioqKioqKioqKioqKioqCgpUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWwKb2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZApieSB0aGUgImRpcigpIiBidWlsdC1pbiBmdW5jdGlvbi4KCmRlZmluaXRpb24uX19uYW1lX18KCiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IgZ2VuZXJhdG9yCiAgIGluc3RhbmNlLgoKZGVmaW5pdGlvbi5fX3F1YWxuYW1lX18KCiAgIFRoZSAqcXVhbGlmaWVkIG5hbWUqIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IKICAgZ2VuZXJhdG9yIGluc3RhbmNlLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjMuCgpkZWZpbml0aW9uLl9fbW9kdWxlX18KCiAgIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggYSBjbGFzcyBvciBmdW5jdGlvbiB3YXMgZGVmaW5lZC4KCmRlZmluaXRpb24uX19kb2NfXwoKICAgVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIGEgY2xhc3Mgb3IgZnVuY3Rpb24sIG9yICJOb25lIiBpZgogICB1bmRlZmluZWQuCgpkZWZpbml0aW9uLl9fdHlwZV9wYXJhbXNfXwoKICAgVGhlIHR5cGUgcGFyYW1ldGVycyBvZiBnZW5lcmljIGNsYXNzZXMsIGZ1bmN0aW9ucywgYW5kIHR5cGUKICAgYWxpYXNlcy4gRm9yIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgZ2VuZXJpYywgdGhpcyB3aWxsCiAgIGJlIGFuIGVtcHR5IHR1cGxlLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjEyLgraDHNwZWNpYWxuYW1lc3UQAQEAU3BlY2lhbCBtZXRob2QgbmFtZXMKKioqKioqKioqKioqKioqKioqKioKCkEgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSBzcGVjaWFsCnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieQpkZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob27igJlzIGFwcHJvYWNoIHRvCipvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biBiZWhhdmlvcgp3aXRoIHJlc3BlY3QgdG8gbGFuZ3VhZ2Ugb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhIGNsYXNzIGRlZmluZXMKYSBtZXRob2QgbmFtZWQgIl9fZ2V0aXRlbV9fKCkiLCBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsCnRoZW4gInhbaV0iIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAidHlwZSh4KS5fX2dldGl0ZW1fXyh4LCBpKSIuCkV4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIHJhaXNlIGFuCmV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHkKIkF0dHJpYnV0ZUVycm9yIiBvciAiVHlwZUVycm9yIikuCgpTZXR0aW5nIGEgc3BlY2lhbCBtZXRob2QgdG8gIk5vbmUiIGluZGljYXRlcyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nCm9wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIGlmIGEgY2xhc3Mgc2V0cyAiX19pdGVyX18oKSIKdG8gIk5vbmUiLCB0aGUgY2xhc3MgaXMgbm90IGl0ZXJhYmxlLCBzbyBjYWxsaW5nICJpdGVyKCkiIG9uIGl0cwppbnN0YW5jZXMgd2lsbCByYWlzZSBhICJUeXBlRXJyb3IiICh3aXRob3V0IGZhbGxpbmcgYmFjayB0bwoiX19nZXRpdGVtX18oKSIpLiBbMl0KCldoZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgaXQgaXMKaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdAptYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lCnNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgZWxlbWVudHMsIGJ1dApleHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUKTm9kZUxpc3QgaW50ZXJmYWNlIGluIHRoZSBXM0PigJlzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pCgoKQmFzaWMgY3VzdG9taXphdGlvbgo9PT09PT09PT09PT09PT09PT09CgpvYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKQoKICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICJfX25ld19fKCkiIGlzIGEKICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKQogICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0cwogICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlCiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVybgogICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW4KICAgaW5zdGFuY2Ugb2YgKmNscyopLgoKICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieQogICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc+KAmXMgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nCiAgICJzdXBlcigpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGUgYXJndW1lbnRzIGFuZCB0aGVuCiAgIG1vZGlmeWluZyB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZSBhcyBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZwogICBpdC4KCiAgIElmICJfX25ld19fKCkiIGlzIGludm9rZWQgZHVyaW5nIG9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGl0IHJldHVybnMKICAgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ldyBpbnN0YW5jZeKAmXMgIl9faW5pdF9fKCkiIG1ldGhvZAogICB3aWxsIGJlIGludm9rZWQgbGlrZSAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZQogICBuZXcgaW5zdGFuY2UgYW5kIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlCiAgIHBhc3NlZCB0byB0aGUgb2JqZWN0IGNvbnN0cnVjdG9yLgoKICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXcKICAgaW5zdGFuY2XigJlzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC4KCiAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZQogICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0CiAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gb3JkZXIgdG8KICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLgoKb2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKQoKICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dAogICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlCiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW4KICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3PigJlzICJfX2luaXRfXygpIiBtZXRob2QsIGlmCiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUKICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6CiAgICJzdXBlcigpLl9faW5pdF9fKFthcmdzLi4uXSkiLgoKICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nCiAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byBjdXN0b21pemUKICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAiX19pbml0X18oKSI7IGRvaW5nIHNvCiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS4KCm9iamVjdC5fX2RlbF9fKHNlbGYpCgogICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvCiAgIGNhbGxlZCBhIGZpbmFsaXplciBvciAoaW1wcm9wZXJseSkgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzCiAgIGhhcyBhICJfX2RlbF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3PigJlzICJfX2RlbF9fKCkiIG1ldGhvZCwKICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZQogICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlLgoKICAgSXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlICJfX2RlbF9fKCkiIG1ldGhvZAogICB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnkgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlCiAgIHRvIGl0LiAgVGhpcyBpcyBjYWxsZWQgb2JqZWN0ICpyZXN1cnJlY3Rpb24qLiAgSXQgaXMKICAgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHdoZXRoZXIgIl9fZGVsX18oKSIgaXMgY2FsbGVkIGEgc2Vjb25kCiAgIHRpbWUgd2hlbiBhIHJlc3VycmVjdGVkIG9iamVjdCBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQ7IHRoZQogICBjdXJyZW50ICpDUHl0aG9uKiBpbXBsZW1lbnRhdGlvbiBvbmx5IGNhbGxzIGl0IG9uY2UuCgogICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0ICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3IKICAgb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW4gdGhlIGludGVycHJldGVyIGV4aXRzLgogICAid2Vha3JlZi5maW5hbGl6ZSIgcHJvdmlkZXMgYSBzdHJhaWdodGZvcndhcmQgd2F5IHRvIHJlZ2lzdGVyIGEKICAgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhbiBvYmplY3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCgogICBOb3RlOgoKICAgICAiZGVsIHgiIGRvZXNu4oCZdCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIg4oCUIHRoZSBmb3JtZXIKICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzCiAgICAgb25seSBjYWxsZWQgd2hlbiAieCLigJlzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCgogICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEl0IGlzIHBvc3NpYmxlIGZvciBhIHJlZmVyZW5jZQogICBjeWNsZSB0byBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGZyb20gZ29pbmcgdG8KICAgemVyby4gIEluIHRoaXMgY2FzZSwgdGhlIGN5Y2xlIHdpbGwgYmUgbGF0ZXIgZGV0ZWN0ZWQgYW5kIGRlbGV0ZWQKICAgYnkgdGhlICpjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IqLiAgQSBjb21tb24gY2F1c2Ugb2YgcmVmZXJlbmNlCiAgIGN5Y2xlcyBpcyB3aGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBjYXVnaHQgaW4gYSBsb2NhbCB2YXJpYWJsZS4KICAgVGhlIGZyYW1l4oCZcyBsb2NhbHMgdGhlbiByZWZlcmVuY2UgdGhlIGV4Y2VwdGlvbiwgd2hpY2ggcmVmZXJlbmNlcwogICBpdHMgb3duIHRyYWNlYmFjaywgd2hpY2ggcmVmZXJlbmNlcyB0aGUgbG9jYWxzIG9mIGFsbCBmcmFtZXMgY2F1Z2h0CiAgIGluIHRoZSB0cmFjZWJhY2suCgogICBTZWUgYWxzbzogRG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlLgoKICAgV2FybmluZzoKCiAgICAgRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggIl9fZGVsX18oKSIKICAgICBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIHRoZWlyIGV4ZWN1dGlvbgogICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gInN5cy5zdGRlcnIiIGluc3RlYWQuCiAgICAgSW4gcGFydGljdWxhcjoKCiAgICAgKiAiX19kZWxfXygpIiBjYW4gYmUgaW52b2tlZCB3aGVuIGFyYml0cmFyeSBjb2RlIGlzIGJlaW5nCiAgICAgICBleGVjdXRlZCwgaW5jbHVkaW5nIGZyb20gYW55IGFyYml0cmFyeSB0aHJlYWQuICBJZiAiX19kZWxfXygpIgogICAgICAgbmVlZHMgdG8gdGFrZSBhIGxvY2sgb3IgaW52b2tlIGFueSBvdGhlciBibG9ja2luZyByZXNvdXJjZSwgaXQKICAgICAgIG1heSBkZWFkbG9jayBhcyB0aGUgcmVzb3VyY2UgbWF5IGFscmVhZHkgYmUgdGFrZW4gYnkgdGhlIGNvZGUKICAgICAgIHRoYXQgZ2V0cyBpbnRlcnJ1cHRlZCB0byBleGVjdXRlICJfX2RlbF9fKCkiLgoKICAgICAqICJfX2RlbF9fKCkiIGNhbiBiZSBleGVjdXRlZCBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24uICBBcyBhCiAgICAgICBjb25zZXF1ZW5jZSwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaXQgbmVlZHMgdG8gYWNjZXNzIChpbmNsdWRpbmcKICAgICAgIG90aGVyIG1vZHVsZXMpIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIHNldCB0byAiTm9uZSIuCiAgICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZQogICAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscwogICAgICAgYXJlIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzCiAgICAgICBtYXkgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZQogICAgICAgYXQgdGhlIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC4KCm9iamVjdC5fX3JlcHJfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSDigJxvZmZpY2lhbOKAnQogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzCiAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG8KICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlCiAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybQogICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgcmV0dXJuCiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dAogICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuIOKAnGluZm9ybWFs4oCdCiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC4KCiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlCiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLiBBIGRlZmF1bHQKICAgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlICJvYmplY3QiIGNsYXNzIGl0c2VsZi4KCm9iamVjdC5fX3N0cl9fKHNlbGYpCgogICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiwgdGhlIGRlZmF1bHQgIl9fZm9ybWF0X18oKSIgaW1wbGVtZW50YXRpb24sCiAgIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInByaW50KCkiLCB0byBjb21wdXRlIHRoZSDigJxpbmZvcm1hbOKAnSBvcgogICBuaWNlbHkgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuCiAgIHZhbHVlIG11c3QgYmUgYSBzdHIgb2JqZWN0LgoKICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCB0aGVyZSBpcyBubwogICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhCiAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLgoKICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IgogICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLgoKb2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5IGJ5dGVzIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbgogICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LiBUaGUgIm9iamVjdCIgY2xhc3MKICAgaXRzZWxmIGRvZXMgbm90IHByb3ZpZGUgdGhpcyBtZXRob2QuCgpvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKCiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGJ5IGV4dGVuc2lvbiwKICAgZXZhbHVhdGlvbiBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFuZCB0aGUgInN0ci5mb3JtYXQoKSIKICAgbWV0aG9kLCB0byBwcm9kdWNlIGEg4oCcZm9ybWF0dGVk4oCdIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbgogICBvYmplY3QuIFRoZSAqZm9ybWF0X3NwZWMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYQogICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuIFRoZSBpbnRlcnByZXRhdGlvbgogICBvZiB0aGUgKmZvcm1hdF9zcGVjKiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSBpbXBsZW1lbnRpbmcKICAgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGwgZWl0aGVyIGRlbGVnYXRlCiAgIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGEgc2ltaWxhcgogICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguCgogICBTZWUgRm9ybWF0IHNwZWNpZmljYXRpb24gbWluaS1sYW5ndWFnZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguCgogICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LgoKICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYnkgdGhlICJvYmplY3QiIGNsYXNzIHNob3VsZCBiZSBnaXZlbiBhbgogICBlbXB0eSAqZm9ybWF0X3NwZWMqIHN0cmluZy4gSXQgZGVsZWdhdGVzIHRvICJfX3N0cl9fKCkiLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiIGl0c2VsZgogICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiAib2JqZWN0Ll9fZm9ybWF0X18oeCwgJycpIiBpcyBub3cKICAgZXF1aXZhbGVudCB0byAic3RyKHgpIiByYXRoZXIgdGhhbiAiZm9ybWF0KHN0cih4KSwgJycpIi4KCm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCDigJxyaWNoIGNvbXBhcmlzb27igJ0gbWV0aG9kcy4gVGhlCiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzCiAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAieC5fX2xlX18oeSkiLAogICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICJ4PnkiIGNhbGxzCiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi4KCiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gIk5vdEltcGxlbWVudGVkIgogICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mCiAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCBmb3IgYQogICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsCiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sCiAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICJib29sKCkiCiAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yIGZhbHNlLgoKICAgQnkgZGVmYXVsdCwgIm9iamVjdCIgaW1wbGVtZW50cyAiX19lcV9fKCkiIGJ5IHVzaW5nICJpcyIsIHJldHVybmluZwogICAiTm90SW1wbGVtZW50ZWQiIGluIHRoZSBjYXNlIG9mIGEgZmFsc2UgY29tcGFyaXNvbjogIlRydWUgaWYgeCBpcyB5CiAgIGVsc2UgTm90SW1wbGVtZW50ZWQiLiBGb3IgIl9fbmVfXygpIiwgYnkgZGVmYXVsdCBpdCBkZWxlZ2F0ZXMgdG8KICAgIl9fZXFfXygpIiBhbmQgaW52ZXJ0cyB0aGUgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLgogICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZCByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uCiAgIG9wZXJhdG9ycyBvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uczsgZm9yIGV4YW1wbGUsIHRoZSB0cnV0aCBvZgogICAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlCiAgIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlCiAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuCgogICBCeSBkZWZhdWx0LCB0aGUgIm9iamVjdCIgY2xhc3MgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGNvbnNpc3RlbnQKICAgd2l0aCBWYWx1ZSBjb21wYXJpc29uczogZXF1YWxpdHkgY29tcGFyZXMgYWNjb3JkaW5nIHRvIG9iamVjdAogICBpZGVudGl0eSwgYW5kIG9yZGVyIGNvbXBhcmlzb25zIHJhaXNlICJUeXBlRXJyb3IiLiBFYWNoIGRlZmF1bHQKICAgbWV0aG9kIG1heSBnZW5lcmF0ZSB0aGVzZSByZXN1bHRzIGRpcmVjdGx5LCBidXQgbWF5IGFsc28gcmV0dXJuCiAgICJOb3RJbXBsZW1lbnRlZCIuCgogICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uCiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uCiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgoKICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZAogICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0CiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXLigJlzCiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXLigJlzIHJlZmxlY3Rpb24sCiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlCiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCB0aGUgcmlnaHQgb3BlcmFuZOKAmXMgdHlwZSBpcyBhCiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5k4oCZcyB0eXBlLCB0aGUKICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGUKICAgbGVmdCBvcGVyYW5k4oCZcyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3QKICAgY29uc2lkZXJlZC4KCiAgIFdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIHJldHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4KICAgIk5vdEltcGxlbWVudGVkIiwgdGhlICI9PSIgYW5kICIhPSIgb3BlcmF0b3JzIHdpbGwgZmFsbCBiYWNrIHRvCiAgICJpcyIgYW5kICJpcyBub3QiLCByZXNwZWN0aXZlbHkuCgpvYmplY3QuX19oYXNoX18oc2VsZikKCiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgb24gbWVtYmVycwogICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICJkaWN0Ii4KICAgVGhlICJfX2hhc2hfXygpIiBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiBUaGUgb25seSByZXF1aXJlZAogICBwcm9wZXJ0eSBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2gKICAgdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gbWl4IHRvZ2V0aGVyIHRoZSBoYXNoIHZhbHVlcyBvZiB0aGUKICAgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mCiAgIG9iamVjdHMgYnkgcGFja2luZyB0aGVtIGludG8gYSB0dXBsZSBhbmQgaGFzaGluZyB0aGUgdHVwbGUuCiAgIEV4YW1wbGU6CgogICAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5uYW1lLCBzZWxmLm5pY2ssIHNlbGYuY29sb3IpKQoKICAgTm90ZToKCiAgICAgImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdOKAmXMgY3VzdG9tCiAgICAgIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXMgaXMKICAgICB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uIDMyLWJpdCBidWlsZHMuCiAgICAgSWYgYW4gb2JqZWN04oCZcyAgICJfX2hhc2hfXygpIiBtdXN0IGludGVyb3BlcmF0ZSBvbiBidWlsZHMgb2YKICAgICBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiBhbGwgc3VwcG9ydGVkCiAgICAgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWMgImltcG9ydCBzeXM7CiAgICAgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi4KCiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3QKICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIgogICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgaXRlbXMgaW4KICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZAogICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudAogICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAqaGFzaGFibGUqIGNvbGxlY3Rpb25zCiAgIHJlcXVpcmVzIHRoYXQgYSBrZXnigJlzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN04oCZcyBoYXNoCiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS4KCiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiIG1ldGhvZHMgYnkKICAgZGVmYXVsdCAoaW5oZXJpdGVkIGZyb20gdGhlICJvYmplY3QiIGNsYXNzKTsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cwogICBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zCiAgIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2ggdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IgogICBhbmQgImhhc2goeCkgPT0gaGFzaCh5KSIuCgogICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSIKICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgV2hlbiB0aGUKICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcwogICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvCiAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXMKICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwKICAgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKSIuCgogICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZQogICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlIGludGVycHJldGVyCiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPQogICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi4KCiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzcwogICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzcwogICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgdGhhdAogICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXMKICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUpIiBjYWxsLgoKICAgTm90ZToKCiAgICAgQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyIGFuZCBieXRlcyBvYmplY3RzIGFyZQogICAgIOKAnHNhbHRlZOKAnSB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLiAgQWx0aG91Z2ggdGhleQogICAgIHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob24gcHJvY2VzcywgdGhleSBhcmUgbm90CiAgICAgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZiBQeXRob24uVGhpcyBpcwogICAgIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLW9mLXNlcnZpY2UgY2F1c2VkCiAgICAgYnkgY2FyZWZ1bGx5IGNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZSB3b3JzdCBjYXNlCiAgICAgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgKk8qKCpuKl4yKSBjb21wbGV4aXR5LiAgU2VlCiAgICAgaHR0cHM6Ly9vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvcgogICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mIHNldHMuCiAgICAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXMgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0CiAgICAgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmQgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28KICAgICAiUFlUSE9OSEFTSFNFRUQiLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KCm9iamVjdC5fX2Jvb2xfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uCiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QKICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpcwogICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzCiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiAod2hpY2ggaXMgdHJ1ZSBvZiB0aGUgIm9iamVjdCIKICAgY2xhc3MgaXRzZWxmKSwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZS4KCgpDdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2YKYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAieC5uYW1lIikgZm9yCmNsYXNzIGluc3RhbmNlcy4KCm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGFjY2VzcyBmYWlscyB3aXRoIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgKGVpdGhlciAiX19nZXRhdHRyaWJ1dGVfXygpIiByYWlzZXMgYW4KICAgIkF0dHJpYnV0ZUVycm9yIiBiZWNhdXNlICpuYW1lKiBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG9yIGFuCiAgIGF0dHJpYnV0ZSBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiOyBvciAiX19nZXRfXygpIiBvZiBhICpuYW1lKgogICBwcm9wZXJ0eSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIikuICBUaGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyCiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIgogICBleGNlcHRpb24uIFRoZSAib2JqZWN0IiBjbGFzcyBpdHNlbGYgZG9lcyBub3QgcHJvdmlkZSB0aGlzIG1ldGhvZC4KCiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sCiAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5CiAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzIGRvbmUgYm90aCBmb3IKICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAiX19nZXRhdHRyX18oKSIgd291bGQgaGF2ZQogICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSB0aGF0IGF0CiAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gdGFrZSB0b3RhbCBjb250cm9sIGJ5IG5vdAogICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dAogICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGUKICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWwKICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuCgpvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQoKICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvcgogICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICJfX2dldGF0dHJfXygpIiwKICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICJfX2dldGF0dHJpYnV0ZV9fKCkiIGVpdGhlcgogICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzIG1ldGhvZAogICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbgogICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluCiAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzCiAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3IKICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi4KCiAgIE5vdGU6CgogICAgIFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzCiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3IKICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSBTcGVjaWFsIG1ldGhvZCBsb29rdXAuCgogICBGb3IgY2VydGFpbiBzZW5zaXRpdmUgYXR0cmlidXRlIGFjY2Vzc2VzLCByYWlzZXMgYW4gYXVkaXRpbmcgZXZlbnQKICAgIm9iamVjdC5fX2dldGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIgYW5kICJuYW1lIi4KCm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKCiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkCiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZQogICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGUKICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuCgogICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXQKICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsCiAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi4KCiAgIEZvciBjZXJ0YWluIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgYXNzaWdubWVudHMsIHJhaXNlcyBhbiBhdWRpdGluZwogICBldmVudCAib2JqZWN0Ll9fc2V0YXR0cl9fIiB3aXRoIGFyZ3VtZW50cyAib2JqIiwgIm5hbWUiLCAidmFsdWUiLgoKb2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpCgogICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mCiAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgb2JqLm5hbWUiIGlzCiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuCgogICBGb3IgY2VydGFpbiBzZW5zaXRpdmUgYXR0cmlidXRlIGRlbGV0aW9ucywgcmFpc2VzIGFuIGF1ZGl0aW5nIGV2ZW50CiAgICJvYmplY3QuX19kZWxhdHRyX18iIHdpdGggYXJndW1lbnRzICJvYmoiIGFuZCAibmFtZSIuCgpvYmplY3QuX19kaXJfXyhzZWxmKQoKICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQW4gaXRlcmFibGUgbXVzdCBiZQogICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgaXRlcmFibGUgdG8gYSBsaXN0IGFuZAogICBzb3J0cyBpdC4KCgpDdXN0b21pemluZyBtb2R1bGUgYXR0cmlidXRlIGFjY2VzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbW9kdWxlLl9fZ2V0YXR0cl9fKCkKbW9kdWxlLl9fZGlyX18oKQoKU3BlY2lhbCBuYW1lcyAiX19nZXRhdHRyX18iIGFuZCAiX19kaXJfXyIgY2FuIGJlIGFsc28gdXNlZCB0bwpjdXN0b21pemUgYWNjZXNzIHRvIG1vZHVsZSBhdHRyaWJ1dGVzLiBUaGUgIl9fZ2V0YXR0cl9fIiBmdW5jdGlvbiBhdAp0aGUgbW9kdWxlIGxldmVsIHNob3VsZCBhY2NlcHQgb25lIGFyZ3VtZW50IHdoaWNoIGlzIHRoZSBuYW1lIG9mIGFuCmF0dHJpYnV0ZSBhbmQgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZSBvciByYWlzZSBhbiAiQXR0cmlidXRlRXJyb3IiLgpJZiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIG9uIGEgbW9kdWxlIG9iamVjdCB0aHJvdWdoIHRoZSBub3JtYWwKbG9va3VwLCBpLmUuICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygpIiwgdGhlbiAiX19nZXRhdHRyX18iIGlzCnNlYXJjaGVkIGluIHRoZSBtb2R1bGUgIl9fZGljdF9fIiBiZWZvcmUgcmFpc2luZyBhbiAiQXR0cmlidXRlRXJyb3IiLgpJZiBmb3VuZCwgaXQgaXMgY2FsbGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB0aGUgcmVzdWx0IGlzCnJldHVybmVkLgoKVGhlICJfX2Rpcl9fIiBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IG5vIGFyZ3VtZW50cywgYW5kIHJldHVybiBhbgppdGVyYWJsZSBvZiBzdHJpbmdzIHRoYXQgcmVwcmVzZW50cyB0aGUgbmFtZXMgYWNjZXNzaWJsZSBvbiBtb2R1bGUuIElmCnByZXNlbnQsIHRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIHRoZSBzdGFuZGFyZCAiZGlyKCkiIHNlYXJjaCBvbiBhCm1vZHVsZS4KCm1vZHVsZS5fX2NsYXNzX18KCkZvciBhIG1vcmUgZmluZSBncmFpbmVkIGN1c3RvbWl6YXRpb24gb2YgdGhlIG1vZHVsZSBiZWhhdmlvciAoc2V0dGluZwphdHRyaWJ1dGVzLCBwcm9wZXJ0aWVzLCBldGMuKSwgb25lIGNhbiBzZXQgdGhlICJfX2NsYXNzX18iIGF0dHJpYnV0ZQpvZiBhIG1vZHVsZSBvYmplY3QgdG8gYSBzdWJjbGFzcyBvZiAidHlwZXMuTW9kdWxlVHlwZSIuIEZvciBleGFtcGxlOgoKICAgaW1wb3J0IHN5cwogICBmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlCgogICBjbGFzcyBWZXJib3NlTW9kdWxlKE1vZHVsZVR5cGUpOgogICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAgIHJldHVybiBmJ1ZlcmJvc2Uge3NlbGYuX19uYW1lX199JwoKICAgICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6CiAgICAgICAgICAgcHJpbnQoZidTZXR0aW5nIHthdHRyfS4uLicpCiAgICAgICAgICAgc3VwZXIoKS5fX3NldGF0dHJfXyhhdHRyLCB2YWx1ZSkKCiAgIHN5cy5tb2R1bGVzW19fbmFtZV9fXS5fX2NsYXNzX18gPSBWZXJib3NlTW9kdWxlCgpOb3RlOgoKICBEZWZpbmluZyBtb2R1bGUgIl9fZ2V0YXR0cl9fIiBhbmQgc2V0dGluZyBtb2R1bGUgIl9fY2xhc3NfXyIgb25seQogIGFmZmVjdCBsb29rdXBzIG1hZGUgdXNpbmcgdGhlIGF0dHJpYnV0ZSBhY2Nlc3Mgc3ludGF4IOKAkyBkaXJlY3RseQogIGFjY2Vzc2luZyB0aGUgbW9kdWxlIGdsb2JhbHMgKHdoZXRoZXIgYnkgY29kZSB3aXRoaW4gdGhlIG1vZHVsZSwgb3IKICB2aWEgYSByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZeKAmXMgZ2xvYmFscyBkaWN0aW9uYXJ5KSBpcyB1bmFmZmVjdGVkLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNTogIl9fY2xhc3NfXyIgbW9kdWxlIGF0dHJpYnV0ZSBpcyBub3cgd3JpdGFibGUuCgpBZGRlZCBpbiB2ZXJzaW9uIDMuNzogIl9fZ2V0YXR0cl9fIiBhbmQgIl9fZGlyX18iIG1vZHVsZSBhdHRyaWJ1dGVzLgoKU2VlIGFsc286CgogICoqUEVQIDU2MioqIC0gTW9kdWxlIF9fZ2V0YXR0cl9fIGFuZCBfX2Rpcl9fCiAgICAgRGVzY3JpYmVzIHRoZSAiX19nZXRhdHRyX18iIGFuZCAiX19kaXJfXyIgZnVuY3Rpb25zIG9uIG1vZHVsZXMuCgoKSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW4KKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVy4oCZcyBjbGFzcwpkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlCmV4YW1wbGVzIGJlbG93LCDigJx0aGUgYXR0cmlidXRl4oCdIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMKdGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNz4oCZICJfX2RpY3RfXyIuICBUaGUgIm9iamVjdCIKY2xhc3MgaXRzZWxmIGRvZXMgbm90IGltcGxlbWVudCBhbnkgb2YgdGhlc2UgcHJvdG9jb2xzLgoKb2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyPU5vbmUpCgogICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGUKICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGUKICAgYWNjZXNzKS4gVGhlIG9wdGlvbmFsICpvd25lciogYXJndW1lbnQgaXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZQogICAqaW5zdGFuY2UqIGlzIHRoZSBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsCiAgIG9yICJOb25lIiB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4KCiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGNvbXB1dGVkIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbgogICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4KCiAgICoqUEVQIDI1MioqIHNwZWNpZmllcyB0aGF0ICJfX2dldF9fKCkiIGlzIGNhbGxhYmxlIHdpdGggb25lIG9yIHR3bwogICBhcmd1bWVudHMuICBQeXRob27igJlzIG93biBidWlsdC1pbiBkZXNjcmlwdG9ycyBzdXBwb3J0IHRoaXMKICAgc3BlY2lmaWNhdGlvbjsgaG93ZXZlciwgaXQgaXMgbGlrZWx5IHRoYXQgc29tZSB0aGlyZC1wYXJ0eSB0b29scwogICBoYXZlIGRlc2NyaXB0b3JzIHRoYXQgcmVxdWlyZSBib3RoIGFyZ3VtZW50cy4gIFB5dGhvbuKAmXMgb3duCiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIGltcGxlbWVudGF0aW9uIGFsd2F5cyBwYXNzZXMgaW4gYm90aCBhcmd1bWVudHMKICAgd2hldGhlciB0aGV5IGFyZSByZXF1aXJlZCBvciBub3QuCgpvYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpCgogICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXIKICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouCgogICBOb3RlLCBhZGRpbmcgIl9fc2V0X18oKSIgb3IgIl9fZGVsZXRlX18oKSIgY2hhbmdlcyB0aGUga2luZCBvZgogICBkZXNjcmlwdG9yIHRvIGEg4oCcZGF0YSBkZXNjcmlwdG9y4oCdLiAgU2VlIEludm9raW5nIERlc2NyaXB0b3JzIGZvcgogICBtb3JlIGRldGFpbHMuCgpvYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSkKCiAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZQogICBvd25lciBjbGFzcy4KCkluc3RhbmNlcyBvZiBkZXNjcmlwdG9ycyBtYXkgYWxzbyBoYXZlIHRoZSAiX19vYmpjbGFzc19fIiBhdHRyaWJ1dGUKcHJlc2VudDoKCm9iamVjdC5fX29iamNsYXNzX18KCiAgIFRoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICJpbnNwZWN0IiBtb2R1bGUKICAgYXMgc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgdGhpcwogICBhcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgY2xhc3MKICAgYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuIGluc3RhbmNlIG9mIHRoZQogICBnaXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgZmlyc3QKICAgcG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzIGF0dHJpYnV0ZSBmb3IKICAgdW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLgoKCkludm9raW5nIERlc2NyaXB0b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoIOKAnGJpbmRpbmcKYmVoYXZpb3LigJ0sIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kcwppbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kCiJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LCBpdAppcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci4KClRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGUKdGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdOKAmXMgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiYS54IiBoYXMgYQpsb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1sneCddIiwgdGhlbgoidHlwZShhKS5fX2RpY3RfX1sneCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mCiJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuCgpIb3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgdGhlCmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZAppbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGUKcHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlIGRlZmluZWQgYW5kCmhvdyB0aGV5IHdlcmUgY2FsbGVkLgoKVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCAiYS54Ii4gSG93CnRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjoKCkRpcmVjdCBDYWxsCiAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgZGlyZWN0bHkKICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi4KCkluc3RhbmNlIEJpbmRpbmcKICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlCiAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fWyd4J10uX19nZXRfXyhhLCB0eXBlKGEpKSIuCgpDbGFzcyBCaW5kaW5nCiAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDoKICAgIkEuX19kaWN0X19bJ3gnXS5fX2dldF9fKE5vbmUsIEEpIi4KClN1cGVyIEJpbmRpbmcKICAgQSBkb3R0ZWQgbG9va3VwIHN1Y2ggYXMgInN1cGVyKEEsIGEpLngiIHNlYXJjaGVzCiAgICJhLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgYSBiYXNlIGNsYXNzICJCIiBmb2xsb3dpbmcgIkEiIGFuZCB0aGVuCiAgIHJldHVybnMgIkIuX19kaWN0X19bJ3gnXS5fX2dldF9fKGEsIEEpIi4gIElmIG5vdCBhIGRlc2NyaXB0b3IsICJ4IgogICBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCgpGb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzCm9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lIGFueQpjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICJfX2RlbGV0ZV9fKCkiLiAgSWYgaXQKZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGwgcmV0dXJuCnRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlIG9iamVjdOKAmXMKaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgYW5kL29yCiJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyBuZWl0aGVyLCBpdCBpcwphIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUgYm90aAoiX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGUKIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIgooYW5kL29yICJfX2RlbGV0ZV9fKCkiKSBkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbgppbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW4gY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZQpvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy4KClB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgdGhvc2UgZGVjb3JhdGVkIHdpdGggIkBzdGF0aWNtZXRob2QiIGFuZAoiQGNsYXNzbWV0aG9kIikgYXJlIGltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksCmluc3RhbmNlcyBjYW4gcmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsCmluc3RhbmNlcyB0byBhY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUKc2FtZSBjbGFzcy4KClRoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuCkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LgoKCl9fc2xvdHNfXwotLS0tLS0tLS0KCipfX3Nsb3RzX18qIGFsbG93IHVzIHRvIGV4cGxpY2l0bHkgZGVjbGFyZSBkYXRhIG1lbWJlcnMgKGxpa2UKcHJvcGVydGllcykgYW5kIGRlbnkgdGhlIGNyZWF0aW9uIG9mICJfX2RpY3RfXyIgYW5kICpfX3dlYWtyZWZfXyoKKHVubGVzcyBleHBsaWNpdGx5IGRlY2xhcmVkIGluICpfX3Nsb3RzX18qIG9yIGF2YWlsYWJsZSBpbiBhIHBhcmVudC4pCgpUaGUgc3BhY2Ugc2F2ZWQgb3ZlciB1c2luZyAiX19kaWN0X18iIGNhbiBiZSBzaWduaWZpY2FudC4gQXR0cmlidXRlCmxvb2t1cCBzcGVlZCBjYW4gYmUgc2lnbmlmaWNhbnRseSBpbXByb3ZlZCBhcyB3ZWxsLgoKb2JqZWN0Ll9fc2xvdHNfXwoKICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZQogICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAqX19zbG90c19fKgogICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlCiAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAiX19kaWN0X18iIGFuZCAqX193ZWFrcmVmX18qIGZvciBlYWNoCiAgIGluc3RhbmNlLgoKTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXyo6CgoqIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICJfX2RpY3RfXyIgYW5kCiAgKl9fd2Vha3JlZl9fKiBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLgoKKiBXaXRob3V0IGEgIl9fZGljdF9fIiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXcKICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvCiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIuIElmCiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGQKICAiJ19fZGljdF9fJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qCiAgZGVjbGFyYXRpb24uCgoqIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzIGRlZmluaW5nCiAgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgIndlYWsgcmVmZXJlbmNlcyIgdG8gaXRzIGluc3RhbmNlcy4gSWYKICB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgIidfX3dlYWtyZWZfXyciIHRvIHRoZQogIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uLgoKKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nCiAgZGVzY3JpcHRvcnMgZm9yIGVhY2ggdmFyaWFibGUgbmFtZS4gIEFzIGEgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzCiAgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZAogIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzcyBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZQogIGRlc2NyaXB0b3IgYXNzaWdubWVudC4KCiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIG5vdCBsaW1pdGVkIHRvIHRoZSBjbGFzcwogIHdoZXJlIGl0IGlzIGRlZmluZWQuICAqX19zbG90c19fKiBkZWNsYXJlZCBpbiBwYXJlbnRzIGFyZSBhdmFpbGFibGUKICBpbiBjaGlsZCBjbGFzc2VzLiBIb3dldmVyLCBpbnN0YW5jZXMgb2YgYSBjaGlsZCBzdWJjbGFzcyB3aWxsIGdldCBhCiAgIl9fZGljdF9fIiBhbmQgKl9fd2Vha3JlZl9fKiB1bmxlc3MgdGhlIHN1YmNsYXNzIGFsc28gZGVmaW5lcwogICpfX3Nsb3RzX18qICh3aGljaCBzaG91bGQgb25seSBjb250YWluIG5hbWVzIG9mIGFueSAqYWRkaXRpb25hbCoKICBzbG90cykuCgoqIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgdGhlIGluc3RhbmNlCiAgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZSAoZXhjZXB0IGJ5CiAgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpcwogIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlIGZ1dHVyZSwgYQogIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuCgoqICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmIG5vbmVtcHR5ICpfX3Nsb3RzX18qIGFyZSBkZWZpbmVkIGZvciBhCiAgY2xhc3MgZGVyaXZlZCBmcm9tIGEgIiJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGUiIHN1Y2ggYXMKICAiaW50IiwgImJ5dGVzIiwgYW5kICJ0dXBsZSIuCgoqIEFueSBub24tc3RyaW5nICppdGVyYWJsZSogbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLgoKKiBJZiBhICJkaWN0aW9uYXJ5IiBpcyB1c2VkIHRvIGFzc2lnbiAqX19zbG90c19fKiwgdGhlIGRpY3Rpb25hcnkga2V5cwogIHdpbGwgYmUgdXNlZCBhcyB0aGUgc2xvdCBuYW1lcy4gVGhlIHZhbHVlcyBvZiB0aGUgZGljdGlvbmFyeSBjYW4gYmUKICB1c2VkIHRvIHByb3ZpZGUgcGVyLWF0dHJpYnV0ZSBkb2NzdHJpbmdzIHRoYXQgd2lsbCBiZSByZWNvZ25pc2VkIGJ5CiAgImluc3BlY3QuZ2V0ZG9jKCkiIGFuZCBkaXNwbGF5ZWQgaW4gdGhlIG91dHB1dCBvZiAiaGVscCgpIi4KCiogIl9fY2xhc3NfXyIgYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lCiAgKl9fc2xvdHNfXyouCgoqIE11bHRpcGxlIGluaGVyaXRhbmNlIHdpdGggbXVsdGlwbGUgc2xvdHRlZCBwYXJlbnQgY2xhc3NlcyBjYW4gYmUKICB1c2VkLCBidXQgb25seSBvbmUgcGFyZW50IGlzIGFsbG93ZWQgdG8gaGF2ZSBhdHRyaWJ1dGVzIGNyZWF0ZWQgYnkKICBzbG90cyAodGhlIG90aGVyIGJhc2VzIG11c3QgaGF2ZSBlbXB0eSBzbG90IGxheW91dHMpIC0gdmlvbGF0aW9ucwogIHJhaXNlICJUeXBlRXJyb3IiLgoKKiBJZiBhbiAqaXRlcmF0b3IqIGlzIHVzZWQgZm9yICpfX3Nsb3RzX18qIHRoZW4gYSAqZGVzY3JpcHRvciogaXMKICBjcmVhdGVkIGZvciBlYWNoIG9mIHRoZSBpdGVyYXRvcuKAmXMgdmFsdWVzLiBIb3dldmVyLCB0aGUgKl9fc2xvdHNfXyoKICBhdHRyaWJ1dGUgd2lsbCBiZSBhbiBlbXB0eSBpdGVyYXRvci4KCgpDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbgo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hlbmV2ZXIgYSBjbGFzcyBpbmhlcml0cyBmcm9tIGFub3RoZXIgY2xhc3MsICJfX2luaXRfc3ViY2xhc3NfXygpIiBpcwpjYWxsZWQgb24gdGhlIHBhcmVudCBjbGFzcy4gVGhpcyB3YXksIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIGNsYXNzZXMKd2hpY2ggY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBzdWJjbGFzc2VzLiBUaGlzIGlzIGNsb3NlbHkgcmVsYXRlZCB0bwpjbGFzcyBkZWNvcmF0b3JzLCBidXQgd2hlcmUgY2xhc3MgZGVjb3JhdG9ycyBvbmx5IGFmZmVjdCB0aGUgc3BlY2lmaWMKY2xhc3MgdGhleeKAmXJlIGFwcGxpZWQgdG8sICJfX2luaXRfc3ViY2xhc3NfXyIgc29sZWx5IGFwcGxpZXMgdG8gZnV0dXJlCnN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBtZXRob2QuCgpjbGFzc21ldGhvZCBvYmplY3QuX19pbml0X3N1YmNsYXNzX18oY2xzKQoKICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb250YWluaW5nIGNsYXNzIGlzIHN1YmNsYXNzZWQuCiAgICpjbHMqIGlzIHRoZW4gdGhlIG5ldyBzdWJjbGFzcy4gSWYgZGVmaW5lZCBhcyBhIG5vcm1hbCBpbnN0YW5jZQogICBtZXRob2QsIHRoaXMgbWV0aG9kIGlzIGltcGxpY2l0bHkgY29udmVydGVkIHRvIGEgY2xhc3MgbWV0aG9kLgoKICAgS2V5d29yZCBhcmd1bWVudHMgd2hpY2ggYXJlIGdpdmVuIHRvIGEgbmV3IGNsYXNzIGFyZSBwYXNzZWQgdG8gdGhlCiAgIHBhcmVudCBjbGFzc+KAmXMgIl9faW5pdF9zdWJjbGFzc19fIi4gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgogICBjbGFzc2VzIHVzaW5nICJfX2luaXRfc3ViY2xhc3NfXyIsIG9uZSBzaG91bGQgdGFrZSBvdXQgdGhlIG5lZWRlZAogICBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgcGFzcyB0aGUgb3RoZXJzIG92ZXIgdG8gdGhlIGJhc2UgY2xhc3MsIGFzCiAgIGluOgoKICAgICAgY2xhc3MgUGhpbG9zb3BoZXI6CiAgICAgICAgICBkZWYgX19pbml0X3N1YmNsYXNzX18oY2xzLCAvLCBkZWZhdWx0X25hbWUsICoqa3dhcmdzKToKICAgICAgICAgICAgICBzdXBlcigpLl9faW5pdF9zdWJjbGFzc19fKCoqa3dhcmdzKQogICAgICAgICAgICAgIGNscy5kZWZhdWx0X25hbWUgPSBkZWZhdWx0X25hbWUKCiAgICAgIGNsYXNzIEF1c3RyYWxpYW5QaGlsb3NvcGhlcihQaGlsb3NvcGhlciwgZGVmYXVsdF9uYW1lPSJCcnVjZSIpOgogICAgICAgICAgcGFzcwoKICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gIm9iamVjdC5fX2luaXRfc3ViY2xhc3NfXyIgZG9lcyBub3RoaW5nLAogICBidXQgcmFpc2VzIGFuIGVycm9yIGlmIGl0IGlzIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMuCgogICBOb3RlOgoKICAgICBUaGUgbWV0YWNsYXNzIGhpbnQgIm1ldGFjbGFzcyIgaXMgY29uc3VtZWQgYnkgdGhlIHJlc3Qgb2YgdGhlCiAgICAgdHlwZSBtYWNoaW5lcnksIGFuZCBpcyBuZXZlciBwYXNzZWQgdG8gIl9faW5pdF9zdWJjbGFzc19fIgogICAgIGltcGxlbWVudGF0aW9ucy4gVGhlIGFjdHVhbCBtZXRhY2xhc3MgKHJhdGhlciB0aGFuIHRoZSBleHBsaWNpdAogICAgIGhpbnQpIGNhbiBiZSBhY2Nlc3NlZCBhcyAidHlwZShjbHMpIi4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy42LgoKV2hlbiBhIGNsYXNzIGlzIGNyZWF0ZWQsICJ0eXBlLl9fbmV3X18oKSIgc2NhbnMgdGhlIGNsYXNzIHZhcmlhYmxlcwphbmQgbWFrZXMgY2FsbGJhY2tzIHRvIHRob3NlIHdpdGggYSAiX19zZXRfbmFtZV9fKCkiIGhvb2suCgpvYmplY3QuX19zZXRfbmFtZV9fKHNlbGYsIG93bmVyLCBuYW1lKQoKICAgQXV0b21hdGljYWxseSBjYWxsZWQgYXQgdGhlIHRpbWUgdGhlIG93bmluZyBjbGFzcyAqb3duZXIqIGlzCiAgIGNyZWF0ZWQuIFRoZSBvYmplY3QgaGFzIGJlZW4gYXNzaWduZWQgdG8gKm5hbWUqIGluIHRoYXQgY2xhc3M6CgogICAgICBjbGFzcyBBOgogICAgICAgICAgeCA9IEMoKSAgIyBBdXRvbWF0aWNhbGx5IGNhbGxzOiB4Ll9fc2V0X25hbWVfXyhBLCAneCcpCgogICBJZiB0aGUgY2xhc3MgdmFyaWFibGUgaXMgYXNzaWduZWQgYWZ0ZXIgdGhlIGNsYXNzIGlzIGNyZWF0ZWQsCiAgICJfX3NldF9uYW1lX18oKSIgd2lsbCBub3QgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkuIElmIG5lZWRlZCwKICAgIl9fc2V0X25hbWVfXygpIiBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5OgoKICAgICAgY2xhc3MgQToKICAgICAgICAgcGFzcwoKICAgICAgYyA9IEMoKQogICAgICBBLnggPSBjICAgICAgICAgICAgICAgICAgIyBUaGUgaG9vayBpcyBub3QgY2FsbGVkCiAgICAgIGMuX19zZXRfbmFtZV9fKEEsICd4JykgICAjIE1hbnVhbGx5IGludm9rZSB0aGUgaG9vawoKICAgU2VlIENyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3QgZm9yIG1vcmUgZGV0YWlscy4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy42LgoKCk1ldGFjbGFzc2VzCi0tLS0tLS0tLS0tCgpCeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlIGNsYXNzIGJvZHkgaXMKZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZQpyZXN1bHQgb2YgInR5cGUobmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkiLgoKVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgcGFzc2luZyB0aGUKIm1ldGFjbGFzcyIga2V5d29yZCBhcmd1bWVudCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBsaW5lLCBvciBieQppbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuIGFyZ3VtZW50LiBJbgp0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlIGluc3RhbmNlcwpvZiAiTWV0YSI6CgogICBjbGFzcyBNZXRhKHR5cGUpOgogICAgICAgcGFzcwoKICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6CiAgICAgICBwYXNzCgogICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOgogICAgICAgcGFzcwoKQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbgphcmUgcGFzc2VkIHRocm91Z2ggdG8gYWxsIG1ldGFjbGFzcyBvcGVyYXRpb25zIGRlc2NyaWJlZCBiZWxvdy4KCldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzIG9jY3VyOgoKKiBNUk8gZW50cmllcyBhcmUgcmVzb2x2ZWQ7CgoqIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZDsKCiogdGhlIGNsYXNzIG5hbWVzcGFjZSBpcyBwcmVwYXJlZDsKCiogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQ7CgoqIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZC4KCgpSZXNvbHZpbmcgTVJPIGVudHJpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvYmplY3QuX19tcm9fZW50cmllc19fKHNlbGYsIGJhc2VzKQoKICAgSWYgYSBiYXNlIHRoYXQgYXBwZWFycyBpbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mCiAgICJ0eXBlIiwgdGhlbiBhbiAiX19tcm9fZW50cmllc19fKCkiIG1ldGhvZCBpcyBzZWFyY2hlZCBvbiB0aGUgYmFzZS4KICAgSWYgYW4gIl9fbXJvX2VudHJpZXNfXygpIiBtZXRob2QgaXMgZm91bmQsIHRoZSBiYXNlIGlzIHN1YnN0aXR1dGVkCiAgIHdpdGggdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gIl9fbXJvX2VudHJpZXNfXygpIiB3aGVuIGNyZWF0aW5nIHRoZQogICBjbGFzcy4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgb3JpZ2luYWwgYmFzZXMgdHVwbGUgcGFzc2VkIHRvCiAgIHRoZSAqYmFzZXMqIHBhcmFtZXRlciwgYW5kIG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IHdpbGwKICAgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBiYXNlLiBUaGUgcmV0dXJuZWQgdHVwbGUgbWF5IGJlIGVtcHR5OiBpbgogICB0aGVzZSBjYXNlcywgdGhlIG9yaWdpbmFsIGJhc2UgaXMgaWdub3JlZC4KClNlZSBhbHNvOgoKICAidHlwZXMucmVzb2x2ZV9iYXNlcygpIgogICAgIER5bmFtaWNhbGx5IHJlc29sdmUgYmFzZXMgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiAidHlwZSIuCgogICJ0eXBlcy5nZXRfb3JpZ2luYWxfYmFzZXMoKSIKICAgICBSZXRyaWV2ZSBhIGNsYXNz4oCZcyDigJxvcmlnaW5hbCBiYXNlc+KAnSBwcmlvciB0byBtb2RpZmljYXRpb25zIGJ5CiAgICAgIl9fbXJvX2VudHJpZXNfXygpIi4KCiAgKipQRVAgNTYwKioKICAgICBDb3JlIHN1cHBvcnQgZm9yIHR5cGluZyBtb2R1bGUgYW5kIGdlbmVyaWMgdHlwZXMuCgoKRGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGZvciBhIGNsYXNzIGRlZmluaXRpb24gaXMgZGV0ZXJtaW5lZCBhcwpmb2xsb3dzOgoKKiBpZiBubyBiYXNlcyBhbmQgbm8gZXhwbGljaXQgbWV0YWNsYXNzIGFyZSBnaXZlbiwgdGhlbiAidHlwZSgpIiBpcwogIHVzZWQ7CgoqIGlmIGFuIGV4cGxpY2l0IG1ldGFjbGFzcyBpcyBnaXZlbiBhbmQgaXQgaXMgKm5vdCogYW4gaW5zdGFuY2Ugb2YKICAidHlwZSgpIiwgdGhlbiBpdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBtZXRhY2xhc3M7CgoqIGlmIGFuIGluc3RhbmNlIG9mICJ0eXBlKCkiIGlzIGdpdmVuIGFzIHRoZSBleHBsaWNpdCBtZXRhY2xhc3MsIG9yCiAgYmFzZXMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgdXNlZC4KClRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHNlbGVjdGVkIGZyb20gdGhlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCm1ldGFjbGFzcyAoaWYgYW55KSBhbmQgdGhlIG1ldGFjbGFzc2VzIChpLmUuICJ0eXBlKGNscykiKSBvZiBhbGwKc3BlY2lmaWVkIGJhc2UgY2xhc3Nlcy4gVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgb25lIHdoaWNoIGlzIGEKc3VidHlwZSBvZiAqYWxsKiBvZiB0aGVzZSBjYW5kaWRhdGUgbWV0YWNsYXNzZXMuIElmIG5vbmUgb2YgdGhlCmNhbmRpZGF0ZSBtZXRhY2xhc3NlcyBtZWV0cyB0aGF0IGNyaXRlcmlvbiwgdGhlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbgp3aWxsIGZhaWwgd2l0aCAiVHlwZUVycm9yIi4KCgpQcmVwYXJpbmcgdGhlIGNsYXNzIG5hbWVzcGFjZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKT25jZSB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGhhcyBiZWVuIGlkZW50aWZpZWQsIHRoZW4gdGhlIGNsYXNzCm5hbWVzcGFjZSBpcyBwcmVwYXJlZC4gSWYgdGhlIG1ldGFjbGFzcyBoYXMgYSAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSwKaXQgaXMgY2FsbGVkIGFzICJuYW1lc3BhY2UgPSBtZXRhY2xhc3MuX19wcmVwYXJlX18obmFtZSwgYmFzZXMsCioqa3dkcykiICh3aGVyZSB0aGUgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgaWYgYW55LCBjb21lIGZyb20KdGhlIGNsYXNzIGRlZmluaXRpb24pLiBUaGUgIl9fcHJlcGFyZV9fIiBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkCmFzIGEgImNsYXNzbWV0aG9kIi4gVGhlIG5hbWVzcGFjZSByZXR1cm5lZCBieSAiX19wcmVwYXJlX18iIGlzIHBhc3NlZAppbiB0byAiX19uZXdfXyIsIGJ1dCB3aGVuIHRoZSBmaW5hbCBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCB0aGUKbmFtZXNwYWNlIGlzIGNvcGllZCBpbnRvIGEgbmV3ICJkaWN0Ii4KCklmIHRoZSBtZXRhY2xhc3MgaGFzIG5vICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLCB0aGVuIHRoZSBjbGFzcwpuYW1lc3BhY2UgaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgb3JkZXJlZCBtYXBwaW5nLgoKU2VlIGFsc286CgogICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzMDAwCiAgICAgSW50cm9kdWNlZCB0aGUgIl9fcHJlcGFyZV9fIiBuYW1lc3BhY2UgaG9vawoKCkV4ZWN1dGluZyB0aGUgY2xhc3MgYm9keQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBjbGFzcyBib2R5IGlzIGV4ZWN1dGVkIChhcHByb3hpbWF0ZWx5KSBhcyAiZXhlYyhib2R5LCBnbG9iYWxzKCksCm5hbWVzcGFjZSkiLiBUaGUga2V5IGRpZmZlcmVuY2UgZnJvbSBhIG5vcm1hbCBjYWxsIHRvICJleGVjKCkiIGlzIHRoYXQKbGV4aWNhbCBzY29waW5nIGFsbG93cyB0aGUgY2xhc3MgYm9keSAoaW5jbHVkaW5nIGFueSBtZXRob2RzKSB0bwpyZWZlcmVuY2UgbmFtZXMgZnJvbSB0aGUgY3VycmVudCBhbmQgb3V0ZXIgc2NvcGVzIHdoZW4gdGhlIGNsYXNzCmRlZmluaXRpb24gb2NjdXJzIGluc2lkZSBhIGZ1bmN0aW9uLgoKSG93ZXZlciwgZXZlbiB3aGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgdGhlIGZ1bmN0aW9uLAptZXRob2RzIGRlZmluZWQgaW5zaWRlIHRoZSBjbGFzcyBzdGlsbCBjYW5ub3Qgc2VlIG5hbWVzIGRlZmluZWQgYXQgdGhlCmNsYXNzIHNjb3BlLiBDbGFzcyB2YXJpYWJsZXMgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBmaXJzdApwYXJhbWV0ZXIgb2YgaW5zdGFuY2Ugb3IgY2xhc3MgbWV0aG9kcywgb3IgdGhyb3VnaCB0aGUgaW1wbGljaXQKbGV4aWNhbGx5IHNjb3BlZCAiX19jbGFzc19fIiByZWZlcmVuY2UgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCgoKQ3JlYXRpbmcgdGhlIGNsYXNzIG9iamVjdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpPbmNlIHRoZSBjbGFzcyBuYW1lc3BhY2UgaGFzIGJlZW4gcG9wdWxhdGVkIGJ5IGV4ZWN1dGluZyB0aGUgY2xhc3MKYm9keSwgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgIm1ldGFjbGFzcyhuYW1lLCBiYXNlcywKbmFtZXNwYWNlLCAqKmt3ZHMpIiAodGhlIGFkZGl0aW9uYWwga2V5d29yZHMgcGFzc2VkIGhlcmUgYXJlIHRoZSBzYW1lCmFzIHRob3NlIHBhc3NlZCB0byAiX19wcmVwYXJlX18iKS4KClRoaXMgY2xhc3Mgb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHplcm8tCmFyZ3VtZW50IGZvcm0gb2YgInN1cGVyKCkiLiAiX19jbGFzc19fIiBpcyBhbiBpbXBsaWNpdCBjbG9zdXJlCnJlZmVyZW5jZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBpZiBhbnkgbWV0aG9kcyBpbiBhIGNsYXNzIGJvZHkgcmVmZXIKdG8gZWl0aGVyICJfX2NsYXNzX18iIG9yICJzdXBlciIuIFRoaXMgYWxsb3dzIHRoZSB6ZXJvIGFyZ3VtZW50IGZvcm0Kb2YgInN1cGVyKCkiIHRvIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZCBiYXNlZCBvbgpsZXhpY2FsIHNjb3BpbmcsIHdoaWxlIHRoZSBjbGFzcyBvciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIHRvIG1ha2UgdGhlCmN1cnJlbnQgY2FsbCBpcyBpZGVudGlmaWVkIGJhc2VkIG9uIHRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gdGhlCm1ldGhvZC4KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gQ1B5dGhvbiAzLjYgYW5kIGxhdGVyLCB0aGUKIl9fY2xhc3NfXyIgY2VsbCBpcyBwYXNzZWQgdG8gdGhlIG1ldGFjbGFzcyBhcyBhICJfX2NsYXNzY2VsbF9fIiBlbnRyeQppbiB0aGUgY2xhc3MgbmFtZXNwYWNlLiBJZiBwcmVzZW50LCB0aGlzIG11c3QgYmUgcHJvcGFnYXRlZCB1cCB0byB0aGUKInR5cGUuX19uZXdfXyIgY2FsbCBpbiBvcmRlciBmb3IgdGhlIGNsYXNzIHRvIGJlIGluaXRpYWxpc2VkCmNvcnJlY3RseS4gRmFpbGluZyB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBhICJSdW50aW1lRXJyb3IiIGluIFB5dGhvbgozLjguCgpXaGVuIHVzaW5nIHRoZSBkZWZhdWx0IG1ldGFjbGFzcyAidHlwZSIsIG9yIGFueSBtZXRhY2xhc3MgdGhhdAp1bHRpbWF0ZWx5IGNhbGxzICJ0eXBlLl9fbmV3X18iLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwKY3VzdG9taXphdGlvbiBzdGVwcyBhcmUgaW52b2tlZCBhZnRlciBjcmVhdGluZyB0aGUgY2xhc3Mgb2JqZWN0OgoKMS4gVGhlICJ0eXBlLl9fbmV3X18iIG1ldGhvZCBjb2xsZWN0cyBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlCiAgIGNsYXNzIG5hbWVzcGFjZSB0aGF0IGRlZmluZSBhICJfX3NldF9uYW1lX18oKSIgbWV0aG9kOwoKMi4gVGhvc2UgIl9fc2V0X25hbWVfXyIgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGggdGhlIGNsYXNzIGJlaW5nCiAgIGRlZmluZWQgYW5kIHRoZSBhc3NpZ25lZCBuYW1lIG9mIHRoYXQgcGFydGljdWxhciBhdHRyaWJ1dGU7CgozLiBUaGUgIl9faW5pdF9zdWJjbGFzc19fKCkiIGhvb2sgaXMgY2FsbGVkIG9uIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mCiAgIHRoZSBuZXcgY2xhc3MgaW4gaXRzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyLgoKQWZ0ZXIgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlIGNsYXNzCmRlY29yYXRvcnMgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHRoZSByZXN1bHRpbmcKb2JqZWN0IGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgdGhlIGRlZmluZWQgY2xhc3MuCgpXaGVuIGEgbmV3IGNsYXNzIGlzIGNyZWF0ZWQgYnkgInR5cGUuX19uZXdfXyIsIHRoZSBvYmplY3QgcHJvdmlkZWQgYXMKdGhlIG5hbWVzcGFjZSBwYXJhbWV0ZXIgaXMgY29waWVkIHRvIGEgbmV3IG9yZGVyZWQgbWFwcGluZyBhbmQgdGhlCm9yaWdpbmFsIG9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBpcyB3cmFwcGVkIGluIGEgcmVhZC1vbmx5CnByb3h5LCB3aGljaCBiZWNvbWVzIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0LgoKU2VlIGFsc286CgogICoqUEVQIDMxMzUqKiAtIE5ldyBzdXBlcgogICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2UKCgpVc2VzIGZvciBtZXRhY2xhc3NlcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZQpiZWVuIGV4cGxvcmVkIGluY2x1ZGUgZW51bSwgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCBhdXRvbWF0aWMKZGVsZWdhdGlvbiwgYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmQKYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLgoKCkN1c3RvbWl6aW5nIGluc3RhbmNlIGFuZCBzdWJjbGFzcyBjaGVja3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZQoiaXNpbnN0YW5jZSgpIiBhbmQgImlzc3ViY2xhc3MoKSIgYnVpbHQtaW4gZnVuY3Rpb25zLgoKSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyAiYWJjLkFCQ01ldGEiIGltcGxlbWVudHMgdGhlc2UgbWV0aG9kcyBpbgpvcmRlciB0byBhbGxvdyB0aGUgYWRkaXRpb24gb2YgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBhcwrigJx2aXJ0dWFsIGJhc2UgY2xhc3Nlc+KAnSB0byBhbnkgY2xhc3Mgb3IgdHlwZSAoaW5jbHVkaW5nIGJ1aWx0LWluCnR5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuCgp0eXBlLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKQoKICAgUmV0dXJuIHRydWUgaWYgKmluc3RhbmNlKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3IKICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnQKICAgImlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKSIuCgp0eXBlLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKQoKICAgUmV0dXJuIHRydWUgaWYgKnN1YmNsYXNzKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3IKICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50CiAgICJpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcykiLgoKTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAobWV0YWNsYXNzKSBvZiBhCmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuClRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZApvbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSBjbGFzcy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE5KiogLSBJbnRyb2R1Y2luZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMKICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgImlzaW5zdGFuY2UoKSIgYW5kCiAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgYW5kCiAgICAgIl9fc3ViY2xhc3NjaGVja19fKCkiLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpbgogICAgIHRoZSBjb250ZXh0IG9mIGFkZGluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKHNlZSB0aGUgImFiYyIKICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS4KCgpFbXVsYXRpbmcgZ2VuZXJpYyB0eXBlcwo9PT09PT09PT09PT09PT09PT09PT09PQoKV2hlbiB1c2luZyAqdHlwZSBhbm5vdGF0aW9ucyosIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byAqcGFyYW1ldGVyaXplKiBhCipnZW5lcmljIHR5cGUqIHVzaW5nIFB5dGhvbuKAmXMgc3F1YXJlLWJyYWNrZXRzIG5vdGF0aW9uLiBGb3IgZXhhbXBsZSwKdGhlIGFubm90YXRpb24gImxpc3RbaW50XSIgbWlnaHQgYmUgdXNlZCB0byBzaWduaWZ5IGEgImxpc3QiIGluIHdoaWNoCmFsbCB0aGUgZWxlbWVudHMgYXJlIG9mIHR5cGUgImludCIuCgpTZWUgYWxzbzoKCiAgKipQRVAgNDg0KiogLSBUeXBlIEhpbnRzCiAgICAgSW50cm9kdWNpbmcgUHl0aG9u4oCZcyBmcmFtZXdvcmsgZm9yIHR5cGUgYW5ub3RhdGlvbnMKCiAgR2VuZXJpYyBBbGlhcyBUeXBlcwogICAgIERvY3VtZW50YXRpb24gZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIHBhcmFtZXRlcml6ZWQgZ2VuZXJpYwogICAgIGNsYXNzZXMKCiAgR2VuZXJpY3MsIHVzZXItZGVmaW5lZCBnZW5lcmljcyBhbmQgInR5cGluZy5HZW5lcmljIgogICAgIERvY3VtZW50YXRpb24gb24gaG93IHRvIGltcGxlbWVudCBnZW5lcmljIGNsYXNzZXMgdGhhdCBjYW4gYmUKICAgICBwYXJhbWV0ZXJpemVkIGF0IHJ1bnRpbWUgYW5kIHVuZGVyc3Rvb2QgYnkgc3RhdGljIHR5cGUtY2hlY2tlcnMuCgpBIGNsYXNzIGNhbiAqZ2VuZXJhbGx5KiBvbmx5IGJlIHBhcmFtZXRlcml6ZWQgaWYgaXQgZGVmaW5lcyB0aGUKc3BlY2lhbCBjbGFzcyBtZXRob2QgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiLgoKY2xhc3NtZXRob2Qgb2JqZWN0Ll9fY2xhc3NfZ2V0aXRlbV9fKGNscywga2V5KQoKICAgUmV0dXJuIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpYWxpemF0aW9uIG9mIGEgZ2VuZXJpYyBjbGFzcwogICBieSB0eXBlIGFyZ3VtZW50cyBmb3VuZCBpbiAqa2V5Ki4KCiAgIFdoZW4gZGVmaW5lZCBvbiBhIGNsYXNzLCAiX19jbGFzc19nZXRpdGVtX18oKSIgaXMgYXV0b21hdGljYWxseSBhCiAgIGNsYXNzIG1ldGhvZC4gQXMgc3VjaCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgaXQgdG8gYmUgZGVjb3JhdGVkIHdpdGgKICAgIkBjbGFzc21ldGhvZCIgd2hlbiBpdCBpcyBkZWZpbmVkLgoKClRoZSBwdXJwb3NlIG9mICpfX2NsYXNzX2dldGl0ZW1fXyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIHB1cnBvc2Ugb2YgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIGlzIHRvIGFsbG93IHJ1bnRpbWUKcGFyYW1ldGVyaXphdGlvbiBvZiBzdGFuZGFyZC1saWJyYXJ5IGdlbmVyaWMgY2xhc3NlcyBpbiBvcmRlciB0byBtb3JlCmVhc2lseSBhcHBseSAqdHlwZSBoaW50cyogdG8gdGhlc2UgY2xhc3Nlcy4KClRvIGltcGxlbWVudCBjdXN0b20gZ2VuZXJpYyBjbGFzc2VzIHRoYXQgY2FuIGJlIHBhcmFtZXRlcml6ZWQgYXQKcnVudGltZSBhbmQgdW5kZXJzdG9vZCBieSBzdGF0aWMgdHlwZS1jaGVja2VycywgdXNlcnMgc2hvdWxkIGVpdGhlcgppbmhlcml0IGZyb20gYSBzdGFuZGFyZCBsaWJyYXJ5IGNsYXNzIHRoYXQgYWxyZWFkeSBpbXBsZW1lbnRzCiJfX2NsYXNzX2dldGl0ZW1fXygpIiwgb3IgaW5oZXJpdCBmcm9tICJ0eXBpbmcuR2VuZXJpYyIsIHdoaWNoIGhhcyBpdHMKb3duIGltcGxlbWVudGF0aW9uIG9mICJfX2NsYXNzX2dldGl0ZW1fXygpIi4KCkN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIG9uIGNsYXNzZXMgZGVmaW5lZApvdXRzaWRlIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1heSBub3QgYmUgdW5kZXJzdG9vZCBieSB0aGlyZC1wYXJ0eQp0eXBlLWNoZWNrZXJzIHN1Y2ggYXMgbXlweS4gVXNpbmcgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIG9uIGFueSBjbGFzcwpmb3IgcHVycG9zZXMgb3RoZXIgdGhhbiB0eXBlIGhpbnRpbmcgaXMgZGlzY291cmFnZWQuCgoKKl9fY2xhc3NfZ2V0aXRlbV9fKiB2ZXJzdXMgKl9fZ2V0aXRlbV9fKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpVc3VhbGx5LCB0aGUgc3Vic2NyaXB0aW9uIG9mIGFuIG9iamVjdCB1c2luZyBzcXVhcmUgYnJhY2tldHMgd2lsbCBjYWxsCnRoZSAiX19nZXRpdGVtX18oKSIgaW5zdGFuY2UgbWV0aG9kIGRlZmluZWQgb24gdGhlIG9iamVjdOKAmXMgY2xhc3MuCkhvd2V2ZXIsIGlmIHRoZSBvYmplY3QgYmVpbmcgc3Vic2NyaWJlZCBpcyBpdHNlbGYgYSBjbGFzcywgdGhlIGNsYXNzCm1ldGhvZCAiX19jbGFzc19nZXRpdGVtX18oKSIgbWF5IGJlIGNhbGxlZCBpbnN0ZWFkLgoiX19jbGFzc19nZXRpdGVtX18oKSIgc2hvdWxkIHJldHVybiBhIEdlbmVyaWNBbGlhcyBvYmplY3QgaWYgaXQgaXMKcHJvcGVybHkgZGVmaW5lZC4KClByZXNlbnRlZCB3aXRoIHRoZSAqZXhwcmVzc2lvbiogIm9ialt4XSIsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKZm9sbG93cyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHByb2Nlc3MgdG8gZGVjaWRlIHdoZXRoZXIKIl9fZ2V0aXRlbV9fKCkiIG9yICJfX2NsYXNzX2dldGl0ZW1fXygpIiBzaG91bGQgYmUgY2FsbGVkOgoKICAgZnJvbSBpbnNwZWN0IGltcG9ydCBpc2NsYXNzCgogICBkZWYgc3Vic2NyaWJlKG9iaiwgeCk6CiAgICAgICAiIiJSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiAnb2JqW3hdJyIiIgoKICAgICAgIGNsYXNzX29mX29iaiA9IHR5cGUob2JqKQoKICAgICAgICMgSWYgdGhlIGNsYXNzIG9mIG9iaiBkZWZpbmVzIF9fZ2V0aXRlbV9fLAogICAgICAgIyBjYWxsIGNsYXNzX29mX29iai5fX2dldGl0ZW1fXyhvYmosIHgpCiAgICAgICBpZiBoYXNhdHRyKGNsYXNzX29mX29iaiwgJ19fZ2V0aXRlbV9fJyk6CiAgICAgICAgICAgcmV0dXJuIGNsYXNzX29mX29iai5fX2dldGl0ZW1fXyhvYmosIHgpCgogICAgICAgIyBFbHNlLCBpZiBvYmogaXMgYSBjbGFzcyBhbmQgZGVmaW5lcyBfX2NsYXNzX2dldGl0ZW1fXywKICAgICAgICMgY2FsbCBvYmouX19jbGFzc19nZXRpdGVtX18oeCkKICAgICAgIGVsaWYgaXNjbGFzcyhvYmopIGFuZCBoYXNhdHRyKG9iaiwgJ19fY2xhc3NfZ2V0aXRlbV9fJyk6CiAgICAgICAgICAgcmV0dXJuIG9iai5fX2NsYXNzX2dldGl0ZW1fXyh4KQoKICAgICAgICMgRWxzZSwgcmFpc2UgYW4gZXhjZXB0aW9uCiAgICAgICBlbHNlOgogICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgZiIne2NsYXNzX29mX29iai5fX25hbWVfX30nIG9iamVjdCBpcyBub3Qgc3Vic2NyaXB0YWJsZSIKICAgICAgICAgICApCgpJbiBQeXRob24sIGFsbCBjbGFzc2VzIGFyZSB0aGVtc2VsdmVzIGluc3RhbmNlcyBvZiBvdGhlciBjbGFzc2VzLiBUaGUKY2xhc3Mgb2YgYSBjbGFzcyBpcyBrbm93biBhcyB0aGF0IGNsYXNz4oCZcyAqbWV0YWNsYXNzKiwgYW5kIG1vc3QKY2xhc3NlcyBoYXZlIHRoZSAidHlwZSIgY2xhc3MgYXMgdGhlaXIgbWV0YWNsYXNzLiAidHlwZSIgZG9lcyBub3QKZGVmaW5lICJfX2dldGl0ZW1fXygpIiwgbWVhbmluZyB0aGF0IGV4cHJlc3Npb25zIHN1Y2ggYXMgImxpc3RbaW50XSIsCiJkaWN0W3N0ciwgZmxvYXRdIiBhbmQgInR1cGxlW3N0ciwgYnl0ZXNdIiBhbGwgcmVzdWx0IGluCiJfX2NsYXNzX2dldGl0ZW1fXygpIiBiZWluZyBjYWxsZWQ6CgogICA+Pj4gIyBsaXN0IGhhcyBjbGFzcyAidHlwZSIgYXMgaXRzIG1ldGFjbGFzcywgbGlrZSBtb3N0IGNsYXNzZXM6CiAgID4+PiB0eXBlKGxpc3QpCiAgIDxjbGFzcyAndHlwZSc+CiAgID4+PiB0eXBlKGRpY3QpID09IHR5cGUobGlzdCkgPT0gdHlwZSh0dXBsZSkgPT0gdHlwZShzdHIpID09IHR5cGUoYnl0ZXMpCiAgIFRydWUKICAgPj4+ICMgImxpc3RbaW50XSIgY2FsbHMgImxpc3QuX19jbGFzc19nZXRpdGVtX18oaW50KSIKICAgPj4+IGxpc3RbaW50XQogICBsaXN0W2ludF0KICAgPj4+ICMgbGlzdC5fX2NsYXNzX2dldGl0ZW1fXyByZXR1cm5zIGEgR2VuZXJpY0FsaWFzIG9iamVjdDoKICAgPj4+IHR5cGUobGlzdFtpbnRdKQogICA8Y2xhc3MgJ3R5cGVzLkdlbmVyaWNBbGlhcyc+CgpIb3dldmVyLCBpZiBhIGNsYXNzIGhhcyBhIGN1c3RvbSBtZXRhY2xhc3MgdGhhdCBkZWZpbmVzCiJfX2dldGl0ZW1fXygpIiwgc3Vic2NyaWJpbmcgdGhlIGNsYXNzIG1heSByZXN1bHQgaW4gZGlmZmVyZW50CmJlaGF2aW91ci4gQW4gZXhhbXBsZSBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUgImVudW0iIG1vZHVsZToKCiAgID4+PiBmcm9tIGVudW0gaW1wb3J0IEVudW0KICAgPj4+IGNsYXNzIE1lbnUoRW51bSk6CiAgIC4uLiAgICAgIiIiQSBicmVha2Zhc3QgbWVudSIiIgogICAuLi4gICAgIFNQQU0gPSAnc3BhbScKICAgLi4uICAgICBCQUNPTiA9ICdiYWNvbicKICAgLi4uCiAgID4+PiAjIEVudW0gY2xhc3NlcyBoYXZlIGEgY3VzdG9tIG1ldGFjbGFzczoKICAgPj4+IHR5cGUoTWVudSkKICAgPGNsYXNzICdlbnVtLkVudW1NZXRhJz4KICAgPj4+ICMgRW51bU1ldGEgZGVmaW5lcyBfX2dldGl0ZW1fXywKICAgPj4+ICMgc28gX19jbGFzc19nZXRpdGVtX18gaXMgbm90IGNhbGxlZCwKICAgPj4+ICMgYW5kIHRoZSByZXN1bHQgaXMgbm90IGEgR2VuZXJpY0FsaWFzIG9iamVjdDoKICAgPj4+IE1lbnVbJ1NQQU0nXQogICA8TWVudS5TUEFNOiAnc3BhbSc+CiAgID4+PiB0eXBlKE1lbnVbJ1NQQU0nXSkKICAgPGVudW0gJ01lbnUnPgoKU2VlIGFsc286CgogICoqUEVQIDU2MCoqIC0gQ29yZSBTdXBwb3J0IGZvciB0eXBpbmcgbW9kdWxlIGFuZCBnZW5lcmljIHR5cGVzCiAgICAgSW50cm9kdWNpbmcgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiLCBhbmQgb3V0bGluaW5nIHdoZW4gYQogICAgIHN1YnNjcmlwdGlvbiByZXN1bHRzIGluICJfX2NsYXNzX2dldGl0ZW1fXygpIiBiZWluZyBjYWxsZWQKICAgICBpbnN0ZWFkIG9mICJfX2dldGl0ZW1fXygpIgoKCkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpvYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIOKAnGNhbGxlZOKAnSBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZAogICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiByb3VnaGx5IHRyYW5zbGF0ZXMgdG8KICAgInR5cGUoeCkuX19jYWxsX18oeCwgYXJnMSwgLi4uKSIuIFRoZSAib2JqZWN0IiBjbGFzcyBpdHNlbGYgZG9lcwogICBub3QgcHJvdmlkZSB0aGlzIG1ldGhvZC4KCgpFbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzCj09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuCk5vbmUgb2YgdGhlbSBhcmUgcHJvdmlkZWQgYnkgdGhlICJvYmplY3QiIGNsYXNzIGl0c2VsZi4gQ29udGFpbmVycwp1c3VhbGx5IGFyZSAqc2VxdWVuY2VzKiAoc3VjaCBhcyAibGlzdHMiIG9yICJ0dXBsZXMiKSBvciAqbWFwcGluZ3MqCihsaWtlICpkaWN0aW9uYXJpZXMqKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLgpUaGUgZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvCmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGUKYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9IGsgPCBOIiB3aGVyZQoqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yICJzbGljZSIgb2JqZWN0cywgd2hpY2ggZGVmaW5lIGEKcmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZSB0aGUKbWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAiY2xlYXIoKSIsCiJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAidXBkYXRlKCkiCmJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbuKAmXMgc3RhbmRhcmQgImRpY3Rpb25hcnkiIG9iamVjdHMuClRoZSAiY29sbGVjdGlvbnMuYWJjIiBtb2R1bGUgcHJvdmlkZXMgYSAiTXV0YWJsZU1hcHBpbmciICphYnN0cmFjdApiYXNlIGNsYXNzKiB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZgoiX19nZXRpdGVtX18oKSIsICJfX3NldGl0ZW1fXygpIiwgIl9fZGVsaXRlbV9fKCkiLCBhbmQgImtleXMoKSIuCgpNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzICJhcHBlbmQoKSIsICJjbGVhcigpIiwKImNvdW50KCkiLCAiZXh0ZW5kKCkiLCAiaW5kZXgoKSIsICJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsIGFuZAoicmV2ZXJzZSgpIiwgbGlrZSBQeXRob24gc3RhbmRhcmQgImxpc3QiIG9iamVjdHMuIEZpbmFsbHksIHNlcXVlbmNlCnR5cGVzIHNob3VsZCBpbXBsZW1lbnQgYWRkaXRpb24gKG1lYW5pbmcgY29uY2F0ZW5hdGlvbikgYW5kCm11bHRpcGxpY2F0aW9uIChtZWFuaW5nIHJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzCiJfX2FkZF9fKCkiLCAiX19yYWRkX18oKSIsICJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQKIl9faW11bF9fKCkiIGRlc2NyaWJlZCBiZWxvdzsgdGhleSBzaG91bGQgbm90IGRlZmluZSBvdGhlciBudW1lcmljYWwKb3BlcmF0b3JzLgoKSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZQoiX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iIG9wZXJhdG9yOwpmb3IgbWFwcGluZ3MsICJpbiIgc2hvdWxkIHNlYXJjaCB0aGUgbWFwcGluZ+KAmXMga2V5czsgZm9yIHNlcXVlbmNlcywgaXQKc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyIHJlY29tbWVuZGVkIHRoYXQgYm90aAptYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byBhbGxvdwplZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAiX19pdGVyX18oKSIKc2hvdWxkIGl0ZXJhdGUgdGhyb3VnaCB0aGUgb2JqZWN04oCZcyBrZXlzOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQKaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMuCgpvYmplY3QuX19sZW5fXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gIFNob3VsZCByZXR1cm4KICAgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LCBhbiBpbnRlZ2VyICI+PSIgMC4gIEFsc28sIGFuIG9iamVjdCB0aGF0CiAgIGRvZXNu4oCZdCBkZWZpbmUgYSAiX19ib29sX18oKSIgbWV0aG9kIGFuZCB3aG9zZSAiX19sZW5fXygpIiBtZXRob2QKICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuIGNvbnRleHQuCgogICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIENQeXRob24sIHRoZSBsZW5ndGggaXMKICAgcmVxdWlyZWQgdG8gYmUgYXQgbW9zdCAic3lzLm1heHNpemUiLiBJZiB0aGUgbGVuZ3RoIGlzIGxhcmdlciB0aGFuCiAgICJzeXMubWF4c2l6ZSIgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyAibGVuKCkiKSBtYXkgcmFpc2UKICAgIk92ZXJmbG93RXJyb3IiLiAgVG8gcHJldmVudCByYWlzaW5nICJPdmVyZmxvd0Vycm9yIiBieSB0cnV0aCB2YWx1ZQogICB0ZXN0aW5nLCBhbiBvYmplY3QgbXVzdCBkZWZpbmUgYSAiX19ib29sX18oKSIgbWV0aG9kLgoKb2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCByZXR1cm4gYW4KICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuCiAgIHRoZSBhY3R1YWwgbGVuZ3RoKS4gVGhlIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgIj49IiAwLiBUaGUKICAgcmV0dXJuIHZhbHVlIG1heSBhbHNvIGJlICJOb3RJbXBsZW1lbnRlZCIsIHdoaWNoIGlzIHRyZWF0ZWQgdGhlCiAgIHNhbWUgYXMgaWYgdGhlICJfX2xlbmd0aF9oaW50X18iIG1ldGhvZCBkaWRu4oCZdCBleGlzdCBhdCBhbGwuIFRoaXMKICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkIGZvcgogICBjb3JyZWN0bmVzcy4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy40LgoKTm90ZToKCiAgU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLiAgQQogIGNhbGwgbGlrZQoKICAgICBhWzE6Ml0gPSBiCgogIGlzIHRyYW5zbGF0ZWQgdG8KCiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiCgogIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuCgpvYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgKnNlcXVlbmNlKgogICB0eXBlcywgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzLiBPcHRpb25hbGx5LCB0aGV5IG1heQogICBzdXBwb3J0ICJzbGljZSIgb2JqZWN0cyBhcyB3ZWxsLiAgTmVnYXRpdmUgaW5kZXggc3VwcG9ydCBpcyBhbHNvCiAgIG9wdGlvbmFsLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZQogICByYWlzZWQ7IGlmICprZXkqIGlzIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZQogICBzZXF1ZW5jZSAoYWZ0ZXIgYW55IHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgdmFsdWVzKSwKICAgIkluZGV4RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuIEZvciAqbWFwcGluZyogdHlwZXMsIGlmICprZXkqIGlzCiAgIG1pc3NpbmcgKG5vdCBpbiB0aGUgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLgoKICAgTm90ZToKCiAgICAgImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvcgogICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlCiAgICAgc2VxdWVuY2UuCgogICBOb3RlOgoKICAgICBXaGVuIHN1YnNjcmlwdGluZyBhICpjbGFzcyosIHRoZSBzcGVjaWFsIGNsYXNzIG1ldGhvZAogICAgICJfX2NsYXNzX2dldGl0ZW1fXygpIiBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgIl9fZ2V0aXRlbV9fKCkiLgogICAgIFNlZSBfX2NsYXNzX2dldGl0ZW1fXyB2ZXJzdXMgX19nZXRpdGVtX18gZm9yIG1vcmUgZGV0YWlscy4KCm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvcgogICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZgogICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXMKICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZQogICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvcgogICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvcgogICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZgogICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cwogICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlCiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgYnkgImRpY3QiLiJfX2dldGl0ZW1fXygpIiB0byBpbXBsZW1lbnQgInNlbGZba2V5XSIgZm9yIGRpY3QKICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuCgpvYmplY3QuX19pdGVyX18oc2VsZikKCiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuICppdGVyYXRvciogaXMgcmVxdWlyZWQgZm9yIGEKICAgY29udGFpbmVyLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbgogICBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0CiAgIHNob3VsZCBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci4KCm9iamVjdC5fX3JldmVyc2VkX18oc2VsZikKCiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnQKICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0CiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci4KCiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSIKICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICgiX19sZW5fXygpIgogICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbAogICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhbgogICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieQogICAicmV2ZXJzZWQoKSIuCgpUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSBub3JtYWxseQppbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIGNvbnRhaW5lci4gSG93ZXZlciwgY29udGFpbmVyCm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudAppbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgaXRlcmFibGUuCgpvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWUKICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpcwogICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvcgogICB0aGUga2V5LWl0ZW0gcGFpcnMuCgogICBGb3Igb2JqZWN0cyB0aGF0IGRvbuKAmXQgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3QKICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZQogICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlIHRoaXMgc2VjdGlvbiBpbiB0aGUKICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLgoKCkVtdWxhdGluZyBudW1lcmljIHR5cGVzCj09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuCk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3IKbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC4KCm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKQpvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljCiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsCiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yIGluc3RhbmNlLCB0bwogICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYQogICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ0eXBlKHgpLl9fYWRkX18oeCwgeSkiIGlzCiAgIGNhbGxlZC4gIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvCiAgIHVzaW5nICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8KICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdAogICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbgogICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC4KCiAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZQogICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi4KCm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKQpvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMKICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIiwKICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgKHN3YXBwZWQpCiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXMKICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIFszXSBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZgogICBkaWZmZXJlbnQgdHlwZXMuIFs0XSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4IC0KICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICJfX3JzdWJfXygpIgogICBtZXRob2QsICJ0eXBlKHkpLl9fcnN1Yl9fKHksIHgpIiBpcyBjYWxsZWQgaWYgInR5cGUoeCkuX19zdWJfXyh4LAogICB5KSIgcmV0dXJucyAiTm90SW1wbGVtZW50ZWQiLgoKICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZQogICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS4KCiAgIE5vdGU6CgogICAgIElmIHRoZSByaWdodCBvcGVyYW5k4oCZcyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZOKAmXMKICAgICB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCiAgICAgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmTigJlzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiBUaGlzIGJlaGF2aW9yCiAgICAgYWxsb3dzIHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3Jz4oCZIG9wZXJhdGlvbnMuCgpvYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpYwogICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLAogICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYXR0ZW1wdCB0bwogICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuIHRoZSByZXN1bHQKICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMKICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBvciBpZiB0aGF0IG1ldGhvZCByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIsCiAgIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgbWV0aG9kcy4gIEZvcgogICBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCBhbiAiX19pYWRkX18oKSIKICAgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ID0geC5fX2lhZGRfXyh5KSIgLiBJZgogICAiX19pYWRkX18oKSIgZG9lcyBub3QgZXhpc3QsIG9yIGlmICJ4Ll9faWFkZF9fKHkpIiByZXR1cm5zCiAgICJOb3RJbXBsZW1lbnRlZCIsICJ4Ll9fYWRkX18oeSkiIGFuZCAieS5fX3JhZGRfXyh4KSIgYXJlCiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpbgogICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgZXJyb3JzCiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBb4oCYaXRlbeKAmV0gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCiAgIGFkZGl0aW9uIHdvcmtzPyksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YQogICBtb2RlbC4KCm9iamVjdC5fX25lZ19fKHNlbGYpCm9iamVjdC5fX3Bvc19fKHNlbGYpCm9iamVjdC5fX2Fic19fKHNlbGYpCm9iamVjdC5fX2ludmVydF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgIisiLAogICAiYWJzKCkiIGFuZCAifiIpLgoKb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpCm9iamVjdC5fX2ludF9fKHNlbGYpCm9iamVjdC5fX2Zsb2F0X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgImludCgpIiBhbmQKICAgImZsb2F0KCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgoKb2JqZWN0Ll9faW5kZXhfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IuaW5kZXgoKSIsIGFuZCB3aGVuZXZlciBQeXRob24gbmVlZHMKICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaAogICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIgogICBmdW5jdGlvbnMpLiBQcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtZXJpYwogICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci4KCiAgIElmICJfX2ludF9fKCkiLCAiX19mbG9hdF9fKCkiIGFuZCAiX19jb21wbGV4X18oKSIgYXJlIG5vdCBkZWZpbmVkCiAgIHRoZW4gY29ycmVzcG9uZGluZyBidWlsdC1pbiBmdW5jdGlvbnMgImludCgpIiwgImZsb2F0KCkiIGFuZAogICAiY29tcGxleCgpIiBmYWxsIGJhY2sgdG8gIl9faW5kZXhfXygpIi4KCm9iamVjdC5fX3JvdW5kX18oc2VsZlssIG5kaWdpdHNdKQpvYmplY3QuX190cnVuY19fKHNlbGYpCm9iamVjdC5fX2Zsb29yX18oc2VsZikKb2JqZWN0Ll9fY2VpbF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicm91bmQoKSIgYW5kICJtYXRoIgogICBmdW5jdGlvbnMgInRydW5jKCkiLCAiZmxvb3IoKSIgYW5kICJjZWlsKCkiLiBVbmxlc3MgKm5kaWdpdHMqIGlzCiAgIHBhc3NlZCB0byAiX19yb3VuZF9fKCkiIGFsbCB0aGVzZSBtZXRob2RzIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlCiAgIG9mIHRoZSBvYmplY3QgdHJ1bmNhdGVkIHRvIGFuICJJbnRlZ3JhbCIgKHR5cGljYWxseSBhbiAiaW50IikuCgogICBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImludCgpIiBmYWxscyBiYWNrIHRvICJfX3RydW5jX18oKSIgaWYKICAgbmVpdGhlciAiX19pbnRfXygpIiBub3IgIl9faW5kZXhfXygpIiBpcyBkZWZpbmVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IFRoZSBkZWxlZ2F0aW9uIG9mICJpbnQoKSIgdG8gIl9fdHJ1bmNfXygpIgogICBpcyBkZXByZWNhdGVkLgoKCldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG8KYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSAid2l0aCIgc3RhdGVtZW50LiBUaGUgY29udGV4dCBtYW5hZ2VyCmhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lIGNvbnRleHQKZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseQppbnZva2VkIHVzaW5nIHRoZSAid2l0aCIgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbiBUaGUgd2l0aApzdGF0ZW1lbnQpLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciBtZXRob2RzLgoKVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzCmtpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgY2xvc2luZyBvcGVuZWQKZmlsZXMsIGV0Yy4KCkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSBDb250ZXh0IE1hbmFnZXIgVHlwZXMuClRoZSAib2JqZWN0IiBjbGFzcyBpdHNlbGYgZG9lcyBub3QgcHJvdmlkZSB0aGUgY29udGV4dCBtYW5hZ2VyCm1ldGhvZHMuCgpvYmplY3QuX19lbnRlcl9fKHNlbGYpCgogICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAid2l0aCIKICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZOKAmXMgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocykKICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuCgpvYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKQoKICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzCiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGUKICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGwKICAgYmUgIk5vbmUiLgoKICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlCiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGQKICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkCiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLgoKICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluCiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVy4oCZcyByZXNwb25zaWJpbGl0eS4KClNlZSBhbHNvOgoKICAqKlBFUCAzNDMqKiAtIFRoZSDigJx3aXRo4oCdIHN0YXRlbWVudAogICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiCiAgICAgc3RhdGVtZW50LgoKCkN1c3RvbWl6aW5nIHBvc2l0aW9uYWwgYXJndW1lbnRzIGluIGNsYXNzIHBhdHRlcm4gbWF0Y2hpbmcKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKV2hlbiB1c2luZyBhIGNsYXNzIG5hbWUgaW4gYSBwYXR0ZXJuLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBpbiB0aGUKcGF0dGVybiBhcmUgbm90IGFsbG93ZWQgYnkgZGVmYXVsdCwgaS5lLiAiY2FzZSBNeUNsYXNzKHgsIHkpIiBpcwp0eXBpY2FsbHkgaW52YWxpZCB3aXRob3V0IHNwZWNpYWwgc3VwcG9ydCBpbiAiTXlDbGFzcyIuIFRvIGJlIGFibGUgdG8KdXNlIHRoYXQga2luZCBvZiBwYXR0ZXJuLCB0aGUgY2xhc3MgbmVlZHMgdG8gZGVmaW5lIGEgKl9fbWF0Y2hfYXJnc19fKgphdHRyaWJ1dGUuCgpvYmplY3QuX19tYXRjaF9hcmdzX18KCiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgdHVwbGUgb2Ygc3RyaW5ncy4gV2hlbiB0aGlzCiAgIGNsYXNzIGlzIHVzZWQgaW4gYSBjbGFzcyBwYXR0ZXJuIHdpdGggcG9zaXRpb25hbCBhcmd1bWVudHMsIGVhY2gKICAgcG9zaXRpb25hbCBhcmd1bWVudCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEga2V5d29yZCBhcmd1bWVudCwKICAgdXNpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gKl9fbWF0Y2hfYXJnc19fKiBhcyB0aGUga2V5d29yZC4KICAgVGhlIGFic2VuY2Ugb2YgdGhpcyBhdHRyaWJ1dGUgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvICIoKSIuCgpGb3IgZXhhbXBsZSwgaWYgIk15Q2xhc3MuX19tYXRjaF9hcmdzX18iIGlzICIoImxlZnQiLCAiY2VudGVyIiwKInJpZ2h0IikiIHRoYXQgbWVhbnMgdGhhdCAiY2FzZSBNeUNsYXNzKHgsIHkpIiBpcyBlcXVpdmFsZW50IHRvICJjYXNlCk15Q2xhc3MobGVmdD14LCBjZW50ZXI9eSkiLiBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlCnBhdHRlcm4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbgoqX19tYXRjaF9hcmdzX18qOyBpZiBpdCBpcyBsYXJnZXIsIHRoZSBwYXR0ZXJuIG1hdGNoIGF0dGVtcHQgd2lsbApyYWlzZSBhICJUeXBlRXJyb3IiLgoKQWRkZWQgaW4gdmVyc2lvbiAzLjEwLgoKU2VlIGFsc286CgogICoqUEVQIDYzNCoqIC0gU3RydWN0dXJhbCBQYXR0ZXJuIE1hdGNoaW5nCiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBQeXRob24gIm1hdGNoIiBzdGF0ZW1lbnQuCgoKRW11bGF0aW5nIGJ1ZmZlciB0eXBlcwo9PT09PT09PT09PT09PT09PT09PT09CgpUaGUgYnVmZmVyIHByb3RvY29sIHByb3ZpZGVzIGEgd2F5IGZvciBQeXRob24gb2JqZWN0cyB0byBleHBvc2UKZWZmaWNpZW50IGFjY2VzcyB0byBhIGxvdy1sZXZlbCBtZW1vcnkgYXJyYXkuIFRoaXMgcHJvdG9jb2wgaXMKaW1wbGVtZW50ZWQgYnkgYnVpbHRpbiB0eXBlcyBzdWNoIGFzICJieXRlcyIgYW5kICJtZW1vcnl2aWV3IiwgYW5kCnRoaXJkLXBhcnR5IGxpYnJhcmllcyBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgYnVmZmVyIHR5cGVzLgoKV2hpbGUgYnVmZmVyIHR5cGVzIGFyZSB1c3VhbGx5IGltcGxlbWVudGVkIGluIEMsIGl0IGlzIGFsc28gcG9zc2libGUKdG8gaW1wbGVtZW50IHRoZSBwcm90b2NvbCBpbiBQeXRob24uCgpvYmplY3QuX19idWZmZXJfXyhzZWxmLCBmbGFncykKCiAgIENhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIHJlcXVlc3RlZCBmcm9tICpzZWxmKiAoZm9yIGV4YW1wbGUsIGJ5IHRoZQogICAibWVtb3J5dmlldyIgY29uc3RydWN0b3IpLiBUaGUgKmZsYWdzKiBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyCiAgIHJlcHJlc2VudGluZyB0aGUga2luZCBvZiBidWZmZXIgcmVxdWVzdGVkLCBhZmZlY3RpbmcgZm9yIGV4YW1wbGUKICAgd2hldGhlciB0aGUgcmV0dXJuZWQgYnVmZmVyIGlzIHJlYWQtb25seSBvciB3cml0YWJsZS4KICAgImluc3BlY3QuQnVmZmVyRmxhZ3MiIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gaW50ZXJwcmV0IHRoZQogICBmbGFncy4gVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhICJtZW1vcnl2aWV3IiBvYmplY3QuCgpvYmplY3QuX19yZWxlYXNlX2J1ZmZlcl9fKHNlbGYsIGJ1ZmZlcikKCiAgIENhbGxlZCB3aGVuIGEgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWVkZWQuIFRoZSAqYnVmZmVyKiBhcmd1bWVudCBpcwogICBhICJtZW1vcnl2aWV3IiBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSByZXR1cm5lZCBieQogICAiX19idWZmZXJfXygpIi4gVGhlIG1ldGhvZCBtdXN0IHJlbGVhc2UgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCiAgIHdpdGggdGhlIGJ1ZmZlci4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiAiTm9uZSIuIEJ1ZmZlciBvYmplY3RzCiAgIHRoYXQgZG8gbm90IG5lZWQgdG8gcGVyZm9ybSBhbnkgY2xlYW51cCBhcmUgbm90IHJlcXVpcmVkIHRvCiAgIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KCkFkZGVkIGluIHZlcnNpb24gMy4xMi4KClNlZSBhbHNvOgoKICAqKlBFUCA2ODgqKiAtIE1ha2luZyB0aGUgYnVmZmVyIHByb3RvY29sIGFjY2Vzc2libGUgaW4gUHl0aG9uCiAgICAgSW50cm9kdWNlcyB0aGUgUHl0aG9uICJfX2J1ZmZlcl9fIiBhbmQgIl9fcmVsZWFzZV9idWZmZXJfXyIKICAgICBtZXRob2RzLgoKICAiY29sbGVjdGlvbnMuYWJjLkJ1ZmZlciIKICAgICBBQkMgZm9yIGJ1ZmZlciB0eXBlcy4KCgpTcGVjaWFsIG1ldGhvZCBsb29rdXAKPT09PT09PT09PT09PT09PT09PT09CgpGb3IgY3VzdG9tIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmUgb25seQpndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN04oCZcyB0eXBlLCBub3QgaW4KdGhlIG9iamVjdOKAmXMgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSByZWFzb24gd2h5CnRoZSBmb2xsb3dpbmcgY29kZSByYWlzZXMgYW4gZXhjZXB0aW9uOgoKICAgPj4+IGNsYXNzIEM6CiAgIC4uLiAgICAgcGFzcwogICAuLi4KICAgPj4+IGMgPSBDKCkKICAgPj4+IGMuX19sZW5fXyA9IGxhbWJkYTogNQogICA+Pj4gbGVuKGMpCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlICdDJyBoYXMgbm8gbGVuKCkKClRoZSByYXRpb25hbGUgYmVoaW5kIHRoaXMgYmVoYXZpb3VyIGxpZXMgd2l0aCBhIG51bWJlciBvZiBzcGVjaWFsCm1ldGhvZHMgc3VjaCBhcyAiX19oYXNoX18oKSIgYW5kICJfX3JlcHJfXygpIiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBieQphbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCBvZiB0aGVzZQptZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsIHdoZW4KaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOgoKICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKQogICBUcnVlCiAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludCkKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciAnX19oYXNoX18nIG9mICdpbnQnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudAoKSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSBjbGFzcyBpbiB0aGlzCndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMg4oCYbWV0YWNsYXNzIGNvbmZ1c2lvbuKAmSwgYW5kIGlzIGF2b2lkZWQKYnkgYnlwYXNzaW5nIHRoZSBpbnN0YW5jZSB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzOgoKICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKQogICBUcnVlCiAgID4+PiB0eXBlKGludCkuX19oYXNoX18oaW50KSA9PSBoYXNoKGludCkKICAgVHJ1ZQoKSW4gYWRkaXRpb24gdG8gYnlwYXNzaW5nIGFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGluIHRoZSBpbnRlcmVzdCBvZgpjb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvIGJ5cGFzc2VzCnRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN04oCZcyBtZXRhY2xhc3M6CgogICA+Pj4gY2xhc3MgTWV0YSh0eXBlKToKICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6CiAgIC4uLiAgICAgICAgIHByaW50KCJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKQogICAuLi4gICAgICAgICByZXR1cm4gdHlwZS5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKQogICAuLi4KICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6CiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgIC4uLiAgICAgICAgIHJldHVybiAxMAogICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKToKICAgLi4uICAgICAgICAgcHJpbnQoIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIikKICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKQogICAuLi4KICAgPj4+IGMgPSBDKCkKICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgaW5zdGFuY2UKICAgQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQKICAgMTAKICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgdHlwZQogICBNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQKICAgMTAKICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cAogICAxMAoKQnlwYXNzaW5nIHRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uIHByb3ZpZGVzCnNpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGUgaW50ZXJwcmV0ZXIsIGF0CnRoZSBjb3N0IG9mIHNvbWUgZmxleGliaWxpdHkgaW4gdGhlIGhhbmRsaW5nIG9mIHNwZWNpYWwgbWV0aG9kcyAodGhlCnNwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYgaW4gb3JkZXIgdG8gYmUKY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS4Keg5zdHJpbmctbWV0aG9kc3V+fAAAU3RyaW5nIE1ldGhvZHMKKioqKioqKioqKioqKioKClN0cmluZ3MgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMsIGFsb25nIHdpdGgKdGhlIGFkZGl0aW9uYWwgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cuCgpTdHJpbmdzIGFsc28gc3VwcG9ydCB0d28gc3R5bGVzIG9mIHN0cmluZyBmb3JtYXR0aW5nLCBvbmUgcHJvdmlkaW5nIGEKbGFyZ2UgZGVncmVlIG9mIGZsZXhpYmlsaXR5IGFuZCBjdXN0b21pemF0aW9uIChzZWUgInN0ci5mb3JtYXQoKSIsCkZvcm1hdCBzdHJpbmcgc3ludGF4IGFuZCBDdXN0b20gc3RyaW5nIGZvcm1hdHRpbmcpIGFuZCB0aGUgb3RoZXIgYmFzZWQKb24gQyAicHJpbnRmIiBzdHlsZSBmb3JtYXR0aW5nIHRoYXQgaGFuZGxlcyBhIG5hcnJvd2VyIHJhbmdlIG9mIHR5cGVzCmFuZCBpcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuIGZhc3RlciBmb3IgdGhlCmNhc2VzIGl0IGNhbiBoYW5kbGUgKHByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZykuCgpUaGUgVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzIHNlY3Rpb24gb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgY292ZXJzIGEKbnVtYmVyIG9mIG90aGVyIG1vZHVsZXMgdGhhdCBwcm92aWRlIHZhcmlvdXMgdGV4dCByZWxhdGVkIHV0aWxpdGllcwooaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiIG1vZHVsZSkuCgpzdHIuY2FwaXRhbGl6ZSgpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkCiAgIGFuZCB0aGUgcmVzdCBsb3dlcmNhc2VkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuODogVGhlIGZpcnN0IGNoYXJhY3RlciBpcyBub3cgcHV0IGludG8KICAgdGl0bGVjYXNlIHJhdGhlciB0aGFuIHVwcGVyY2FzZS4gVGhpcyBtZWFucyB0aGF0IGNoYXJhY3RlcnMgbGlrZQogICBkaWdyYXBocyB3aWxsIG9ubHkgaGF2ZSB0aGVpciBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQsIGluc3RlYWQgb2YKICAgdGhlIGZ1bGwgY2hhcmFjdGVyLgoKc3RyLmNhc2Vmb2xkKCkKCiAgIFJldHVybiBhIGNhc2Vmb2xkZWQgY29weSBvZiB0aGUgc3RyaW5nLiBDYXNlZm9sZGVkIHN0cmluZ3MgbWF5IGJlCiAgIHVzZWQgZm9yIGNhc2VsZXNzIG1hdGNoaW5nLgoKICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSBhZ2dyZXNzaXZlIGJlY2F1c2UKICAgaXQgaXMgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCBjYXNlIGRpc3RpbmN0aW9ucyBpbiBhIHN0cmluZy4gRm9yCiAgIGV4YW1wbGUsIHRoZSBHZXJtYW4gbG93ZXJjYXNlIGxldHRlciAiJ8OfJyIgaXMgZXF1aXZhbGVudCB0byAiInNzIiIuCiAgIFNpbmNlIGl0IGlzIGFscmVhZHkgbG93ZXJjYXNlLCAibG93ZXIoKSIgd291bGQgZG8gbm90aGluZyB0byAiJ8OfJyI7CiAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdzdHJhw59lJy5sb3dlcigpCiAgICAgICdzdHJhw59lJwogICAgICA+Pj4gJ3N0cmHDn2UnLmNhc2Vmb2xkKCkKICAgICAgJ3N0cmFzc2UnCgogICBUaGUgY2FzZWZvbGRpbmcgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMg4oCYRGVmYXVsdAogICBDYXNlIEZvbGRpbmfigJkgb2YgdGhlIFVuaWNvZGUgU3RhbmRhcmQuCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuMy4KCnN0ci5jZW50ZXIod2lkdGgsIGZpbGxjaGFyPScgJywgLykKCiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lCiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSBzcGFjZSkuIFRoZQogICBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAgImxlbihzKSIuICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnUHl0aG9uJy5jZW50ZXIoMTApCiAgICAgICcgIFB5dGhvbiAgJwogICAgICA+Pj4gJ1B5dGhvbicuY2VudGVyKDEwLCAnLScpCiAgICAgICctLVB5dGhvbi0tJwogICAgICA+Pj4gJ1B5dGhvbicuY2VudGVyKDQpCiAgICAgICdQeXRob24nCgpzdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YioKICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQKICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgoKICAgSWYgKnN1YiogaXMgZW1wdHksIHJldHVybnMgdGhlIG51bWJlciBvZiBlbXB0eSBzdHJpbmdzIGJldHdlZW4KICAgY2hhcmFjdGVycyB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGx1cyBvbmUuIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5jb3VudCgnc3BhbScpCiAgICAgIDMKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5jb3VudCgnc3BhbScsIDUpCiAgICAgIDIKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5jb3VudCgnc3BhbScsIDUsIDEwKQogICAgICAxCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScuY291bnQoJ2VnZ3MnKQogICAgICAwCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScuY291bnQoJycpCiAgICAgIDE3CgpzdHIuZW5jb2RlKGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JykKCiAgIFJldHVybiB0aGUgc3RyaW5nIGVuY29kZWQgdG8gImJ5dGVzIi4KCiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gIid1dGYtOCciOyBzZWUgU3RhbmRhcmQgRW5jb2RpbmdzIGZvcgogICBwb3NzaWJsZSB2YWx1ZXMuCgogICAqZXJyb3JzKiBjb250cm9scyBob3cgZW5jb2RpbmcgZXJyb3JzIGFyZSBoYW5kbGVkLiBJZiAiJ3N0cmljdCciCiAgICh0aGUgZGVmYXVsdCksIGEgIlVuaWNvZGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXIgcG9zc2libGUKICAgdmFsdWVzIGFyZSAiJ2lnbm9yZSciLCAiJ3JlcGxhY2UnIiwgIid4bWxjaGFycmVmcmVwbGFjZSciLAogICAiJ2JhY2tzbGFzaHJlcGxhY2UnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEKICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIi4gU2VlIEVycm9yIEhhbmRsZXJzIGZvciBkZXRhaWxzLgoKICAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSB2YWx1ZSBvZiAqZXJyb3JzKiBpcyBub3QgY2hlY2tlZCBmb3IKICAgdmFsaWRpdHkgdW5sZXNzIGFuIGVuY29kaW5nIGVycm9yIGFjdHVhbGx5IG9jY3VycywgUHl0aG9uCiAgIERldmVsb3BtZW50IE1vZGUgaXMgZW5hYmxlZCBvciBhIGRlYnVnIGJ1aWxkIGlzIHVzZWQuIEZvciBleGFtcGxlOgoKICAgICAgPj4+IGVuY29kZWRfc3RyX3RvX2J5dGVzID0gJ1B5dGhvbicuZW5jb2RlKCkKICAgICAgPj4+IHR5cGUoZW5jb2RlZF9zdHJfdG9fYnl0ZXMpCiAgICAgIDxjbGFzcyAnYnl0ZXMnPgogICAgICA+Pj4gZW5jb2RlZF9zdHJfdG9fYnl0ZXMKICAgICAgYidQeXRob24nCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCBzdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cy4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjk6IFRoZSB2YWx1ZSBvZiB0aGUgKmVycm9ycyogYXJndW1lbnQgaXMgbm93CiAgIGNoZWNrZWQgaW4gUHl0aG9uIERldmVsb3BtZW50IE1vZGUgYW5kIGluIGRlYnVnIG1vZGUuCgpzdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KiwKICAgb3RoZXJ3aXNlIHJldHVybiAiRmFsc2UiLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdWZmaXhlcwogICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgdGhhdAogICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgcG9zaXRpb24uCiAgIFVzaW5nICpzdGFydCogYW5kICplbmQqIGlzIGVxdWl2YWxlbnQgdG8KICAgInN0cltzdGFydDplbmRdLmVuZHN3aXRoKHN1ZmZpeCkiLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnUHl0aG9uJy5lbmRzd2l0aCgnb24nKQogICAgICBUcnVlCiAgICAgID4+PiAnYSB0dXBsZSBvZiBzdWZmaXhlcycuZW5kc3dpdGgoKCdhdCcsICdpbicpKQogICAgICBGYWxzZQogICAgICA+Pj4gJ2EgdHVwbGUgb2Ygc3VmZml4ZXMnLmVuZHN3aXRoKCgnYXQnLCAnZXMnKSkKICAgICAgVHJ1ZQogICAgICA+Pj4gJ1B5dGhvbiBpcyBhbWF6aW5nJy5lbmRzd2l0aCgnaXMnLCAwLCA5KQogICAgICBUcnVlCgogICBTZWUgYWxzbyAic3RhcnRzd2l0aCgpIiBhbmQgInJlbW92ZXN1ZmZpeCgpIi4KCnN0ci5leHBhbmR0YWJzKHRhYnNpemU9OCkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkCiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlCiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVycwogICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2IGFuZCBzbyBvbikuCiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZQogICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYQogICB0YWIgKCJcdCIpLCBvbmUgb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCBpbiB0aGUgcmVzdWx0CiAgIHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uIChUaGUKICAgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgbmV3bGluZQogICAoIlxuIikgb3IgcmV0dXJuICgiXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXMKICAgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZCBhbmQgdGhlCiAgIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGUKICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJzAxXHQwMTJcdDAxMjNcdDAxMjM0Jy5leHBhbmR0YWJzKCkKICAgICAgJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0JwogICAgICA+Pj4gJzAxXHQwMTJcdDAxMjNcdDAxMjM0Jy5leHBhbmR0YWJzKDQpCiAgICAgICcwMSAgMDEyIDAxMjMgICAgMDEyMzQnCiAgICAgID4+PiBwcmludCgnMDFcdDAxMlxuMDEyM1x0MDEyMzQnLmV4cGFuZHRhYnMoNCkpCiAgICAgIDAxICAwMTIKICAgICAgMDEyMyAgICAwMTIzNAoKc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzCiAgIGZvdW5kIHdpdGhpbiB0aGUgc2xpY2UgInNbc3RhcnQ6ZW5kXSIuICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KgogICBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgaWYKICAgKnN1YiogaXMgbm90IGZvdW5kLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScuZmluZCgnc3AnKQogICAgICAwCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScuZmluZCgnc3AnLCA1KQogICAgICA2CgogICBTZWUgYWxzbyAicmZpbmQoKSIgYW5kICJpbmRleCgpIi4KCiAgIE5vdGU6CgogICAgIFRoZSAiZmluZCgpIiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93IHRoZQogICAgIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LCB1c2UKICAgICB0aGUgImluIiBvcGVyYXRvcjoKCiAgICAgICAgPj4+ICdQeScgaW4gJ1B5dGhvbicKICAgICAgICBUcnVlCgpzdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncykKCiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXMKICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzCiAgIGRlbGltaXRlZCBieSBicmFjZXMgInt9Ii4gIEVhY2ggcmVwbGFjZW1lbnQgZmllbGQgY29udGFpbnMgZWl0aGVyCiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYQogICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoCiAgIHJlcGxhY2VtZW50IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUKICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKQogICAgICAnVGhlIHN1bSBvZiAxICsgMiBpcyAzJwogICAgICA+Pj4gIlRoZSBzdW0gb2Yge2F9ICsge2J9IGlzIHthbnN3ZXJ9Ii5mb3JtYXQoYW5zd2VyPTErMiwgYT0xLCBiPTIpCiAgICAgICdUaGUgc3VtIG9mIDEgKyAyIGlzIDMnCiAgICAgID4+PiAiezF9IGV4cGVjdHMgdGhlIHswfSBJbnF1aXNpdGlvbiEiLmZvcm1hdCgiU3BhbmlzaCIsICJOb2JvZHkiKQogICAgICAnTm9ib2R5IGV4cGVjdHMgdGhlIFNwYW5pc2ggSW5xdWlzaXRpb24hJwoKICAgU2VlIEZvcm1hdCBzdHJpbmcgc3ludGF4IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzCiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuCgogICBOb3RlOgoKICAgICBXaGVuIGZvcm1hdHRpbmcgYSBudW1iZXIgKCJpbnQiLCAiZmxvYXQiLCAiY29tcGxleCIsCiAgICAgImRlY2ltYWwuRGVjaW1hbCIgYW5kIHN1YmNsYXNzZXMpIHdpdGggdGhlICJuIiB0eXBlIChleDoKICAgICAiJ3s6bn0nLmZvcm1hdCgxMjM0KSIpLCB0aGUgZnVuY3Rpb24gdGVtcG9yYXJpbHkgc2V0cyB0aGUKICAgICAiTENfQ1RZUEUiIGxvY2FsZSB0byB0aGUgIkxDX05VTUVSSUMiIGxvY2FsZSB0byBkZWNvZGUKICAgICAiZGVjaW1hbF9wb2ludCIgYW5kICJ0aG91c2FuZHNfc2VwIiBmaWVsZHMgb2YgImxvY2FsZWNvbnYoKSIgaWYKICAgICB0aGV5IGFyZSBub24tQVNDSUkgb3IgbG9uZ2VyIHRoYW4gMSBieXRlLCBhbmQgdGhlICJMQ19OVU1FUklDIgogICAgIGxvY2FsZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgIkxDX0NUWVBFIiBsb2NhbGUuICBUaGlzIHRlbXBvcmFyeQogICAgIGNoYW5nZSBhZmZlY3RzIG90aGVyIHRocmVhZHMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBXaGVuIGZvcm1hdHRpbmcgYSBudW1iZXIgd2l0aCB0aGUgIm4iIHR5cGUsCiAgIHRoZSBmdW5jdGlvbiBzZXRzIHRlbXBvcmFyaWx5IHRoZSAiTENfQ1RZUEUiIGxvY2FsZSB0byB0aGUKICAgIkxDX05VTUVSSUMiIGxvY2FsZSBpbiBzb21lIGNhc2VzLgoKc3RyLmZvcm1hdF9tYXAobWFwcGluZywgLykKCiAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICJtYXBwaW5nIiBpcyB1c2VkCiAgIGRpcmVjdGx5IGFuZCBub3QgY29waWVkIHRvIGEgImRpY3QiLiAgVGhpcyBpcyB1c2VmdWwgaWYgZm9yIGV4YW1wbGUKICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczoKCiAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOgogICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgogICAuLi4gICAgICAgICByZXR1cm4ga2V5CiAgIC4uLgogICA+Pj4gJ3tuYW1lfSB3YXMgYm9ybiBpbiB7Y291bnRyeX0nLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPSdHdWlkbycpKQogICAnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeScKCiAgIEFkZGVkIGluIHZlcnNpb24gMy4yLgoKc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBMaWtlICJmaW5kKCkiLCBidXQgcmFpc2UgIlZhbHVlRXJyb3IiIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QKICAgZm91bmQuIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5pbmRleCgnc3BhbScpCiAgICAgIDAKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5pbmRleCgnZWdncycpCiAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICBGaWxlICI8cHl0aG9uLWlucHV0LTA+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgICAgJ3NwYW0sIHNwYW0sIHNwYW0nLmluZGV4KCdlZ2dzJykKICAgICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fl5eXl5eXl5eCiAgICAgIFZhbHVlRXJyb3I6IHN1YnN0cmluZyBub3QgZm91bmQKCiAgIFNlZSBhbHNvICJyaW5kZXgoKSIuCgpzdHIuaXNhbG51bSgpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhbnVtZXJpYyBhbmQKICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgIkZhbHNlIiBvdGhlcndpc2UuICBBIGNoYXJhY3RlcgogICAiYyIgaXMgYWxwaGFudW1lcmljIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJldHVybnMgIlRydWUiOgogICAiYy5pc2FscGhhKCkiLCAiYy5pc2RlY2ltYWwoKSIsICJjLmlzZGlnaXQoKSIsIG9yICJjLmlzbnVtZXJpYygpIi4KICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ2FiYzEyMycuaXNhbG51bSgpCiAgICAgIFRydWUKICAgICAgPj4+ICdhYmMxMjMhQCMnLmlzYWxudW0oKQogICAgICBGYWxzZQogICAgICA+Pj4gJycuaXNhbG51bSgpCiAgICAgIEZhbHNlCiAgICAgID4+PiAnICcuaXNhbG51bSgpCiAgICAgIEZhbHNlCgpzdHIuaXNhbHBoYSgpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kCiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLiAgQWxwaGFiZXRpYwogICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyCiAgIGRhdGFiYXNlIGFzIOKAnExldHRlcuKAnSwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5CiAgIGJlaW5nIG9uZSBvZiDigJxMbeKAnSwg4oCcTHTigJ0sIOKAnEx14oCdLCDigJxMbOKAnSwgb3Ig4oCcTG/igJ0uICBOb3RlIHRoYXQgdGhpcyBpcwogICBkaWZmZXJlbnQgZnJvbSB0aGUgQWxwaGFiZXRpYyBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBzZWN0aW9uIDQuMTAKICAg4oCYTGV0dGVycywgQWxwaGFiZXRpYywgYW5kIElkZW9ncmFwaGlj4oCZIG9mIHRoZSBVbmljb2RlIFN0YW5kYXJkLiBGb3IKICAgZXhhbXBsZToKCiAgICAgID4+PiAnTGV0dGVycyBhbmQgc3BhY2VzJy5pc2FscGhhKCkKICAgICAgRmFsc2UKICAgICAgPj4+ICdMZXR0ZXJzT25seScuaXNhbHBoYSgpCiAgICAgIFRydWUKICAgICAgPj4+ICfCtScuaXNhbHBoYSgpICAjIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGNhbiBiZSBjb25zaWRlcmVkIGFscGhhYmV0aWNhbCB0b28KICAgICAgVHJ1ZQoKICAgU2VlIFVuaWNvZGUgUHJvcGVydGllcy4KCnN0ci5pc2FzY2lpKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBpcyBlbXB0eSBvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUKICAgc3RyaW5nIGFyZSBBU0NJSSwgIkZhbHNlIiBvdGhlcndpc2UuIEFTQ0lJIGNoYXJhY3RlcnMgaGF2ZSBjb2RlCiAgIHBvaW50cyBpbiB0aGUgcmFuZ2UgVSswMDAwLVUrMDA3Ri4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ0FTQ0lJIGNoYXJhY3RlcnMnLmlzYXNjaWkoKQogICAgICBUcnVlCiAgICAgID4+PiAnwrUnLmlzYXNjaWkoKQogICAgICBGYWxzZQoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjcuCgpzdHIuaXNkZWNpbWFsKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGVjaW1hbAogICBjaGFyYWN0ZXJzIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCAiRmFsc2UiIG90aGVyd2lzZS4KICAgRGVjaW1hbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm0gbnVtYmVycyBpbgogICBiYXNlIDEwLCBzdWNoIGFzIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uICBGb3JtYWxseSBhCiAgIGRlY2ltYWwgY2hhcmFjdGVyIGlzIGEgY2hhcmFjdGVyIGluIHRoZSBVbmljb2RlIEdlbmVyYWwgQ2F0ZWdvcnkKICAg4oCcTmTigJ0uIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICcwMTIzNDU2Nzg5Jy5pc2RlY2ltYWwoKQogICAgICBUcnVlCiAgICAgID4+PiAn2aDZodmi2aPZpNml2abZp9mo2aknLmlzZGVjaW1hbCgpICAjIEFyYWJpYy1JbmRpYyBkaWdpdHMgemVybyB0byBuaW5lCiAgICAgIFRydWUKICAgICAgPj4+ICdhbHBoYWJldGljJy5pc2RlY2ltYWwoKQogICAgICBGYWxzZQoKc3RyLmlzZGlnaXQoKQoKICAgUmV0dXJuICJUcnVlIiBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlCiAgIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLiAgRGlnaXRzIGluY2x1ZGUKICAgZGVjaW1hbCBjaGFyYWN0ZXJzIGFuZCBkaWdpdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcsIHN1Y2ggYXMKICAgdGhlIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiBUaGlzIGNvdmVycyBkaWdpdHMgd2hpY2gKICAgY2Fubm90IGJlIHVzZWQgdG8gZm9ybSBudW1iZXJzIGluIGJhc2UgMTAsIGxpa2UgdGhlIEtoYXJvc3RoaQogICBudW1iZXJzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgYSBjaGFyYWN0ZXIgdGhhdCBoYXMgdGhlIHByb3BlcnR5CiAgIHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvciBOdW1lcmljX1R5cGU9RGVjaW1hbC4KCnN0ci5pc2lkZW50aWZpZXIoKQoKICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gdGhlCiAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLgoKICAgImtleXdvcmQuaXNrZXl3b3JkKCkiIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBzdHJpbmcgInMiIGlzIGEKICAgcmVzZXJ2ZWQgaWRlbnRpZmllciwgc3VjaCBhcyAiZGVmIiBhbmQgImNsYXNzIi4KCiAgIEV4YW1wbGU6CgogICAgICA+Pj4gZnJvbSBrZXl3b3JkIGltcG9ydCBpc2tleXdvcmQKCiAgICAgID4+PiAnaGVsbG8nLmlzaWRlbnRpZmllcigpLCBpc2tleXdvcmQoJ2hlbGxvJykKICAgICAgKFRydWUsIEZhbHNlKQogICAgICA+Pj4gJ2RlZicuaXNpZGVudGlmaWVyKCksIGlza2V5d29yZCgnZGVmJykKICAgICAgKFRydWUsIFRydWUpCgpzdHIuaXNsb3dlcigpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZQogICBsb3dlcmNhc2UgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsICJGYWxzZSIKICAgb3RoZXJ3aXNlLgoKc3RyLmlzbnVtZXJpYygpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMKICAgY2hhcmFjdGVycywgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLgogICBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMKICAgdGhhdCBoYXZlIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksIGUuZy4gVSsyMTU1LCBWVUxHQVIKICAgRlJBQ1RJT04gT05FIEZJRlRILiAgRm9ybWFsbHksIG51bWVyaWMgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aAogICB0aGUgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0LCBOdW1lcmljX1R5cGU9RGVjaW1hbCBvcgogICBOdW1lcmljX1R5cGU9TnVtZXJpYy4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJzAxMjM0NTY3ODknLmlzbnVtZXJpYygpCiAgICAgIFRydWUKICAgICAgPj4+ICfZoNmh2aLZo9mk2aXZptmn2ajZqScuaXNudW1lcmljKCkgICMgQXJhYmljLWluZGljIGRpZ2l0IHplcm8gdG8gbmluZQogICAgICBUcnVlCiAgICAgID4+PiAn4oWVJy5pc251bWVyaWMoKSAgIyBWdWxnYXIgZnJhY3Rpb24gb25lIGZpZnRoCiAgICAgIFRydWUKICAgICAgPj4+ICfCsicuaXNkZWNpbWFsKCksICfCsicuaXNkaWdpdCgpLCAgJ8KyJy5pc251bWVyaWMoKQogICAgICAoRmFsc2UsIFRydWUsIFRydWUpCgogICBTZWUgYWxzbyAiaXNkZWNpbWFsKCkiIGFuZCAiaXNkaWdpdCgpIi4gTnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBhCiAgIHN1cGVyc2V0IG9mIGRlY2ltYWwgbnVtYmVycy4KCnN0ci5pc3ByaW50YWJsZSgpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHByaW50YWJsZSwKICAgIkZhbHNlIiBpZiBpdCBjb250YWlucyBhdCBsZWFzdCBvbmUgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXIuCgogICBIZXJlIOKAnHByaW50YWJsZeKAnSBtZWFucyB0aGUgY2hhcmFjdGVyIGlzIHN1aXRhYmxlIGZvciAicmVwcigpIiB0bwogICB1c2UgaW4gaXRzIG91dHB1dDsg4oCcbm9uLXByaW50YWJsZeKAnSBtZWFucyB0aGF0ICJyZXByKCkiIG9uIGJ1aWx0LWluCiAgIHR5cGVzIHdpbGwgaGV4LWVzY2FwZSB0aGUgY2hhcmFjdGVyLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlCiAgIGhhbmRsaW5nIG9mIHN0cmluZ3Mgd3JpdHRlbiB0byAic3lzLnN0ZG91dCIgb3IgInN5cy5zdGRlcnIiLgoKICAgVGhlIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aGljaCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKICAgZGF0YWJhc2UgKHNlZSAidW5pY29kZWRhdGEiKSBoYXZlIGEgZ2VuZXJhbCBjYXRlZ29yeSBpbiBncm91cAogICBMZXR0ZXIsIE1hcmssIE51bWJlciwgUHVuY3R1YXRpb24sIG9yIFN5bWJvbCAoTCwgTSwgTiwgUCwgb3IgUyk7CiAgIHBsdXMgdGhlIEFTQ0lJIHNwYWNlIDB4MjAuIE5vbnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBpbgogICBncm91cCBTZXBhcmF0b3Igb3IgT3RoZXIgKFogb3IgQyksIGV4Y2VwdCB0aGUgQVNDSUkgc3BhY2UuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnJy5pc3ByaW50YWJsZSgpLCAnICcuaXNwcmludGFibGUoKQogICAgICAoVHJ1ZSwgVHJ1ZSkKICAgICAgPj4+ICdcdCcuaXNwcmludGFibGUoKSwgJ1xuJy5pc3ByaW50YWJsZSgpCiAgICAgIChGYWxzZSwgRmFsc2UpCgogICBTZWUgYWxzbyAiaXNzcGFjZSgpIi4KCnN0ci5pc3NwYWNlKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcKICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJycuaXNzcGFjZSgpCiAgICAgIEZhbHNlCiAgICAgID4+PiAnICcuaXNzcGFjZSgpCiAgICAgIFRydWUKICAgICAgPj4+ICdcdFxuJy5pc3NwYWNlKCkgIyBUQUIgYW5kIEJSRUFLIExJTkUKICAgICAgVHJ1ZQogICAgICA+Pj4gJ1x1MzAwMCcuaXNzcGFjZSgpICMgSURFT0dSQVBISUMgU1BBQ0UKICAgICAgVHJ1ZQoKICAgQSBjaGFyYWN0ZXIgaXMgKndoaXRlc3BhY2UqIGlmIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZQogICAoc2VlICJ1bmljb2RlZGF0YSIpLCBlaXRoZXIgaXRzIGdlbmVyYWwgY2F0ZWdvcnkgaXMgIlpzIgogICAo4oCcU2VwYXJhdG9yLCBzcGFjZeKAnSksIG9yIGl0cyBiaWRpcmVjdGlvbmFsIGNsYXNzIGlzIG9uZSBvZiAiV1MiLAogICAiQiIsIG9yICJTIi4KCiAgIFNlZSBhbHNvICJpc3ByaW50YWJsZSgpIi4KCnN0ci5pc3RpdGxlKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdAogICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seQogICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuCiAgIFJldHVybiAiRmFsc2UiIG90aGVyd2lzZS4KCiAgIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdTcGFtLCBTcGFtLCBTcGFtJy5pc3RpdGxlKCkKICAgICAgVHJ1ZQogICAgICA+Pj4gJ3NwYW0sIHNwYW0sIHNwYW0nLmlzdGl0bGUoKQogICAgICBGYWxzZQogICAgICA+Pj4gJ1NQQU0sIFNQQU0sIFNQQU0nLmlzdGl0bGUoKQogICAgICBGYWxzZQoKICAgU2VlIGFsc28gInRpdGxlKCkiLgoKc3RyLmlzdXBwZXIoKQoKICAgUmV0dXJuICJUcnVlIiBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUKICAgdXBwZXJjYXNlIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCAiRmFsc2UiCiAgIG90aGVyd2lzZS4KCiAgID4+PiAnQkFOQU5BJy5pc3VwcGVyKCkKICAgVHJ1ZQogICA+Pj4gJ2JhbmFuYScuaXN1cHBlcigpCiAgIEZhbHNlCiAgID4+PiAnYmFOYW5hJy5pc3VwcGVyKCkKICAgRmFsc2UKICAgPj4+ICcgJy5pc3VwcGVyKCkKICAgRmFsc2UKCnN0ci5qb2luKGl0ZXJhYmxlLCAvKQoKICAgUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIGluCiAgICppdGVyYWJsZSouIEEgIlR5cGVFcnJvciIgd2lsbCBiZSByYWlzZWQgaWYgdGhlcmUgYXJlIGFueSBub24tCiAgIHN0cmluZyB2YWx1ZXMgaW4gKml0ZXJhYmxlKiwgaW5jbHVkaW5nICJieXRlcyIgb2JqZWN0cy4gIFRoZQogICBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC4gRm9yCiAgIGV4YW1wbGU6CgogICAgICA+Pj4gJywgJy5qb2luKFsnc3BhbScsICdzcGFtJywgJ3NwYW0nXSkKICAgICAgJ3NwYW0sIHNwYW0sIHNwYW0nCiAgICAgID4+PiAnLScuam9pbignUHl0aG9uJykKICAgICAgJ1AteS10LWgtby1uJwoKICAgU2VlIGFsc28gInNwbGl0KCkiLgoKc3RyLmxqdXN0KHdpZHRoLCBmaWxsY2hhcj0nICcsIC8pCgogICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4KICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSQogICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IKICAgZXF1YWwgdG8gImxlbihzKSIuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnUHl0aG9uJy5sanVzdCgxMCkKICAgICAgJ1B5dGhvbiAgICAnCiAgICAgID4+PiAnUHl0aG9uJy5sanVzdCgxMCwgJy4nKQogICAgICAnUHl0aG9uLi4uLicKICAgICAgPj4+ICdNb250eSBQeXRob24nLmxqdXN0KDEwLCAnLicpCiAgICAgICdNb250eSBQeXRob24nCgogICBTZWUgYWxzbyAicmp1c3QoKSIuCgpzdHIubG93ZXIoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XQogICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnTG93ZXIgTWV0aG9kIEV4YW1wbGUnLmxvd2VyKCkKICAgICAgJ2xvd2VyIG1ldGhvZCBleGFtcGxlJwoKICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMKICAg4oCYRGVmYXVsdCBDYXNlIEZvbGRpbmfigJkgb2YgdGhlIFVuaWNvZGUgU3RhbmRhcmQuCgpzdHIubHN0cmlwKGNoYXJzPU5vbmUsIC8pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlCiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8KICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLAogICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOgoKICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcubHN0cmlwKCkKICAgICAgJ3NwYWNpb3VzICAgJwogICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScubHN0cmlwKCdjbW93ei4nKQogICAgICAnZXhhbXBsZS5jb20nCgogICBTZWUgInN0ci5yZW1vdmVwcmVmaXgoKSIgZm9yIGEgbWV0aG9kIHRoYXQgd2lsbCByZW1vdmUgYSBzaW5nbGUKICAgcHJlZml4IHN0cmluZyByYXRoZXIgdGhhbiBhbGwgb2YgYSBzZXQgb2YgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdBcnRodXI6IHRocmVlIScubHN0cmlwKCdBcnRodXI6ICcpCiAgICAgICdlZSEnCiAgICAgID4+PiAnQXJ0aHVyOiB0aHJlZSEnLnJlbW92ZXByZWZpeCgnQXJ0aHVyOiAnKQogICAgICAndGhyZWUhJwoKc3RhdGljIHN0ci5tYWtldHJhbnMoZGljdCwgLykKc3RhdGljIHN0ci5tYWtldHJhbnMoZnJvbSwgdG8sIHJlbW92ZT0nJywgLykKCiAgIFRoaXMgc3RhdGljIG1ldGhvZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gdGFibGUgdXNhYmxlIGZvcgogICAic3RyLnRyYW5zbGF0ZSgpIi4KCiAgIElmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nCiAgIFVuaWNvZGUgb3JkaW5hbHMgKGludGVnZXJzKSBvciBjaGFyYWN0ZXJzIChzdHJpbmdzIG9mIGxlbmd0aCAxKSB0bwogICBVbmljb2RlIG9yZGluYWxzLCBzdHJpbmdzIChvZiBhcmJpdHJhcnkgbGVuZ3Rocykgb3IgIk5vbmUiLgogICBDaGFyYWN0ZXIga2V5cyB3aWxsIHRoZW4gYmUgY29udmVydGVkIHRvIG9yZGluYWxzLgoKICAgSWYgdGhlcmUgYXJlIHR3byBhcmd1bWVudHMsIHRoZXkgbXVzdCBiZSBzdHJpbmdzIG9mIGVxdWFsIGxlbmd0aCwKICAgYW5kIGluIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeSwgZWFjaCBjaGFyYWN0ZXIgaW4gKmZyb20qIHdpbGwgYmUKICAgbWFwcGVkIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gKnRvKi4gIElmIHRoZXJlIGlzCiAgIGEgdGhpcmQgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBzdHJpbmcsIHdob3NlIGNoYXJhY3RlcnMgd2lsbCBiZQogICBtYXBwZWQgdG8gIk5vbmUiIGluIHRoZSByZXN1bHQuCgpzdHIucGFydGl0aW9uKHNlcCwgLykKCiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYQogICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IKICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90CiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsIGZvbGxvd2VkIGJ5CiAgIHR3byBlbXB0eSBzdHJpbmdzLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ01vbnR5IFB5dGhvbicucGFydGl0aW9uKCcgJykKICAgICAgKCdNb250eScsICcgJywgJ1B5dGhvbicpCiAgICAgID4+PiAiTW9udHkgUHl0aG9uJ3MgRmx5aW5nIENpcmN1cyIucGFydGl0aW9uKCcgJykKICAgICAgKCdNb250eScsICcgJywgIlB5dGhvbidzIEZseWluZyBDaXJjdXMiKQogICAgICA+Pj4gJ01vbnR5IFB5dGhvbicucGFydGl0aW9uKCctJykKICAgICAgKCdNb250eSBQeXRob24nLCAnJywgJycpCgogICBTZWUgYWxzbyAicnBhcnRpdGlvbigpIi4KCnN0ci5yZW1vdmVwcmVmaXgocHJlZml4LCAvKQoKICAgSWYgdGhlIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCogc3RyaW5nLCByZXR1cm4KICAgInN0cmluZ1tsZW4ocHJlZml4KTpdIi4gT3RoZXJ3aXNlLCByZXR1cm4gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbAogICBzdHJpbmc6CgogICAgICA+Pj4gJ1Rlc3RIb29rJy5yZW1vdmVwcmVmaXgoJ1Rlc3QnKQogICAgICAnSG9vaycKICAgICAgPj4+ICdCYXNlVGVzdENhc2UnLnJlbW92ZXByZWZpeCgnVGVzdCcpCiAgICAgICdCYXNlVGVzdENhc2UnCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuOS4KCiAgIFNlZSBhbHNvICJyZW1vdmVzdWZmaXgoKSIgYW5kICJzdGFydHN3aXRoKCkiLgoKc3RyLnJlbW92ZXN1ZmZpeChzdWZmaXgsIC8pCgogICBJZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgKnN1ZmZpeCogc3RyaW5nIGFuZCB0aGF0ICpzdWZmaXgqIGlzCiAgIG5vdCBlbXB0eSwgcmV0dXJuICJzdHJpbmdbOi1sZW4oc3VmZml4KV0iLiBPdGhlcndpc2UsIHJldHVybiBhIGNvcHkKICAgb2YgdGhlIG9yaWdpbmFsIHN0cmluZzoKCiAgICAgID4+PiAnTWlzY1Rlc3RzJy5yZW1vdmVzdWZmaXgoJ1Rlc3RzJykKICAgICAgJ01pc2MnCiAgICAgID4+PiAnVG1wRGlyTWl4aW4nLnJlbW92ZXN1ZmZpeCgnVGVzdHMnKQogICAgICAnVG1wRGlyTWl4aW4nCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuOS4KCiAgIFNlZSBhbHNvICJyZW1vdmVwcmVmaXgoKSIgYW5kICJlbmRzd2l0aCgpIi4KCnN0ci5yZXBsYWNlKG9sZCwgbmV3LCAvLCBjb3VudD0tMSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCoKICAgcmVwbGFjZWQgYnkgKm5ldyouICBJZiAqY291bnQqIGlzIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCAqY291bnQqCiAgIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC4gSWYgKmNvdW50KiBpcyBub3Qgc3BlY2lmaWVkIG9yICItMSIsIHRoZW4KICAgYWxsIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ3NwYW0sIHNwYW0sIHNwYW0nLnJlcGxhY2UoJ3NwYW0nLCAnZWdncycpCiAgICAgICdlZ2dzLCBlZ2dzLCBlZ2dzJwogICAgICA+Pj4gJ3NwYW0sIHNwYW0sIHNwYW0nLnJlcGxhY2UoJ3NwYW0nLCAnZWdncycsIDEpCiAgICAgICdlZ2dzLCBzcGFtLCBzcGFtJwoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTM6ICpjb3VudCogaXMgbm93IHN1cHBvcnRlZCBhcyBhIGtleXdvcmQKICAgYXJndW1lbnQuCgpzdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpcwogICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gInNbc3RhcnQ6ZW5kXSIuCiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2UKICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScucmZpbmQoJ3NwJykKICAgICAgMTIKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5yZmluZCgnc3AnLCAwLCAxMCkKICAgICAgNgoKICAgU2VlIGFsc28gImZpbmQoKSIgYW5kICJyaW5kZXgoKSIuCgpzdHIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pCgogICBMaWtlICJyZmluZCgpIiBidXQgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgKnN1YiogaXMKICAgbm90IGZvdW5kLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnc3BhbSwgc3BhbSwgc3BhbScucmluZGV4KCdzcGFtJykKICAgICAgMTIKICAgICAgPj4+ICdzcGFtLCBzcGFtLCBzcGFtJy5yaW5kZXgoJ2VnZ3MnKQogICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgRmlsZSAiPHN0ZGluLTA+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgICAgJ3NwYW0sIHNwYW0sIHNwYW0nLnJpbmRleCgnZWdncycpCiAgICAgICAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Xl5eXl5eXl4KICAgICAgVmFsdWVFcnJvcjogc3Vic3RyaW5nIG5vdCBmb3VuZAoKICAgU2VlIGFsc28gImluZGV4KCkiIGFuZCAiZmluZCgpIi4KCnN0ci5yanVzdCh3aWR0aCwgZmlsbGNoYXI9JyAnLCAvKQoKICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLgogICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJCiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvcgogICBlcXVhbCB0byAibGVuKHMpIi4KCiAgIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdQeXRob24nLnJqdXN0KDEwKQogICAgICAnICAgIFB5dGhvbicKICAgICAgPj4+ICdQeXRob24nLnJqdXN0KDEwLCAnLicpCiAgICAgICcuLi4uUHl0aG9uJwogICAgICA+Pj4gJ01vbnR5IFB5dGhvbicucmp1c3QoMTAsICcuJykKICAgICAgJ01vbnR5IFB5dGhvbicKCiAgIFNlZSBhbHNvICJsanVzdCgpIiBhbmQgInpmaWxsKCkiLgoKc3RyLnJwYXJ0aXRpb24oc2VwLCAvKQoKICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGEKICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yCiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdAogICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBzdHJpbmdzLCBmb2xsb3dlZCBieQogICB0aGUgc3RyaW5nIGl0c2VsZi4KCiAgIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdNb250eSBQeXRob24nLnJwYXJ0aXRpb24oJyAnKQogICAgICAoJ01vbnR5JywgJyAnLCAnUHl0aG9uJykKICAgICAgPj4+ICJNb250eSBQeXRob24ncyBGbHlpbmcgQ2lyY3VzIi5ycGFydGl0aW9uKCcgJykKICAgICAgKCJNb250eSBQeXRob24ncyBGbHlpbmciLCAnICcsICdDaXJjdXMnKQogICAgICA+Pj4gJ01vbnR5IFB5dGhvbicucnBhcnRpdGlvbignLScpCiAgICAgICgnJywgJycsICdNb250eSBQeXRob24nKQoKICAgU2VlIGFsc28gInBhcnRpdGlvbigpIi4KCnN0ci5yc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlCiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHMKICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvcgogICAiTm9uZSIsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3Igc3BsaXR0aW5nCiAgIGZyb20gdGhlIHJpZ2h0LCAicnNwbGl0KCkiIGJlaGF2ZXMgbGlrZSAic3BsaXQoKSIgd2hpY2ggaXMKICAgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy4KCnN0ci5yc3RyaXAoY2hhcnM9Tm9uZSwgLykKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlCiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8KICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLAogICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkLiBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnJzdHJpcCgpCiAgICAgICcgICBzcGFjaW91cycKICAgICAgPj4+ICdtaXNzaXNzaXBwaScucnN0cmlwKCdpcHonKQogICAgICAnbWlzc2lzcycKCiAgIFNlZSAicmVtb3Zlc3VmZml4KCkiIGZvciBhIG1ldGhvZCB0aGF0IHdpbGwgcmVtb3ZlIGEgc2luZ2xlIHN1ZmZpeAogICBzdHJpbmcgcmF0aGVyIHRoYW4gYWxsIG9mIGEgc2V0IG9mIGNoYXJhY3RlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnTW9udHkgUHl0aG9uJy5yc3RyaXAoJyBQeXRob24nKQogICAgICAnTScKICAgICAgPj4+ICdNb250eSBQeXRob24nLnJlbW92ZXN1ZmZpeCgnIFB5dGhvbicpCiAgICAgICdNb250eScKCiAgIFNlZSBhbHNvICJzdHJpcCgpIi4KCnN0ci5zcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpCgogICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGUKICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KgogICBzcGxpdHMgYXJlIGRvbmUgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0ICJtYXhzcGxpdCsxIgogICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgIi0xIiwgdGhlbiB0aGVyZSBpcwogICBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuCgogICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXIKICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSwKICAgIicxLCwyJy5zcGxpdCgnLCcpIiByZXR1cm5zICJbJzEnLCAnJywgJzInXSIpLiAgVGhlICpzZXAqIGFyZ3VtZW50CiAgIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgYXMgYSBzaW5nbGUgZGVsaW1pdGVyICh0byBzcGxpdAogICB3aXRoIG11bHRpcGxlIGRlbGltaXRlcnMsIHVzZSAicmUuc3BsaXQoKSIpLiBTcGxpdHRpbmcgYW4gZW1wdHkKICAgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgIlsnJ10iLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJzEsMiwzJy5zcGxpdCgnLCcpCiAgICAgIFsnMScsICcyJywgJzMnXQogICAgICA+Pj4gJzEsMiwzJy5zcGxpdCgnLCcsIG1heHNwbGl0PTEpCiAgICAgIFsnMScsICcyLDMnXQogICAgICA+Pj4gJzEsMiwsMywnLnNwbGl0KCcsJykKICAgICAgWycxJywgJzInLCAnJywgJzMnLCAnJ10KICAgICAgPj4+ICcxPD4yPD4zPDQnLnNwbGl0KCc8PicpCiAgICAgIFsnMScsICcyJywgJzM8NCddCgogICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiwgYSBkaWZmZXJlbnQgc3BsaXR0aW5nCiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkCiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3MKICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yIHRyYWlsaW5nCiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmcKICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhICJOb25lIiBzZXBhcmF0b3IgcmV0dXJucyAiW10iLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJzEgMiAzJy5zcGxpdCgpCiAgICAgIFsnMScsICcyJywgJzMnXQogICAgICA+Pj4gJzEgMiAzJy5zcGxpdChtYXhzcGxpdD0xKQogICAgICBbJzEnLCAnMiAzJ10KICAgICAgPj4+ICcgICAxICAgMiAgIDMgICAnLnNwbGl0KCkKICAgICAgWycxJywgJzInLCAnMyddCgogICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiBhbmQgICptYXhzcGxpdCogaXMgIjAiLCBvbmx5CiAgIGxlYWRpbmcgcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSBjb25zaWRlcmVkLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gIiIuc3BsaXQoTm9uZSwgMCkKICAgICAgW10KICAgICAgPj4+ICIgICAiLnNwbGl0KE5vbmUsIDApCiAgICAgIFtdCiAgICAgID4+PiAiICAgZm9vICAgIi5zcGxpdChtYXhzcGxpdD0wKQogICAgICBbJ2ZvbyAgICddCgogICBTZWUgYWxzbyAiam9pbigpIi4KCnN0ci5zcGxpdGxpbmVzKGtlZXBlbmRzPUZhbHNlKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZQogICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QKICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuCgogICBUaGlzIG1ldGhvZCBzcGxpdHMgb24gdGhlIGZvbGxvd2luZyBsaW5lIGJvdW5kYXJpZXMuICBJbgogICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsIG5ld2xpbmVzKi4KCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgUmVwcmVzZW50YXRpb24gICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8CiAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CiAgIHwgIlxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lIEZlZWQgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxyXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx2IiBvciAiXHgwYiIgICAgICAgICAgfCBMaW5lIFRhYnVsYXRpb24gICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxmIiBvciAiXHgwYyIgICAgICAgICAgfCBGb3JtIEZlZWQgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWMiICAgICAgICAgICAgICAgICAgfCBGaWxlIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCBTZXBhcmF0b3IgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgU2VwYXJhdG9yICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4ODUiICAgICAgICAgICAgICAgICAgfCBOZXh0IExpbmUgKEMxIENvbnRyb2wgQ29kZSkgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggU2VwYXJhdG9yICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXHYiIGFuZCAiXGYiIGFkZGVkIHRvIGxpc3Qgb2YgbGluZQogICBib3VuZGFyaWVzLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcygpCiAgICAgIFsnYWIgYycsICcnLCAnZGUgZmcnLCAna2wnXQogICAgICA+Pj4gJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcyhrZWVwZW5kcz1UcnVlKQogICAgICBbJ2FiIGNcbicsICdcbicsICdkZSBmZ1xyJywgJ2tsXHJcbiddCgogICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzCiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsCiAgIGxpbmUgYnJlYWsgZG9lcyBub3QgcmVzdWx0IGluIGFuIGV4dHJhIGxpbmU6CgogICAgICA+Pj4gIiIuc3BsaXRsaW5lcygpCiAgICAgIFtdCiAgICAgID4+PiAiT25lIGxpbmVcbiIuc3BsaXRsaW5lcygpCiAgICAgIFsnT25lIGxpbmUnXQoKICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdCgnXG4nKSIgZ2l2ZXM6CgogICAgICA+Pj4gJycuc3BsaXQoJ1xuJykKICAgICAgWycnXQogICAgICA+Pj4gJ1R3byBsaW5lc1xuJy5zcGxpdCgnXG4nKQogICAgICBbJ1R3byBsaW5lcycsICcnXQoKc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlIHJldHVybgogICAiRmFsc2UiLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2sgZm9yLgogICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLgogICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCBwb3NpdGlvbi4KCiAgIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdQeXRob24nLnN0YXJ0c3dpdGgoJ1B5JykKICAgICAgVHJ1ZQogICAgICA+Pj4gJ2EgdHVwbGUgb2YgcHJlZml4ZXMnLnN0YXJ0c3dpdGgoKCdhdCcsICdhJykpCiAgICAgIFRydWUKICAgICAgPj4+ICdQeXRob24gaXMgYW1hemluZycuc3RhcnRzd2l0aCgnaXMnLCA3KQogICAgICBUcnVlCgogICBTZWUgYWxzbyAiZW5kc3dpdGgoKSIgYW5kICJyZW1vdmVwcmVmaXgoKSIuCgpzdHIuc3RyaXAoY2hhcnM9Tm9uZSwgLykKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZwogICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlCiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKgogICBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcwogICBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUKICAgc3RyaXBwZWQuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnN0cmlwKCkKICAgICAgJ3NwYWNpb3VzJwogICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpCiAgICAgICdleGFtcGxlJwoKICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50IHZhbHVlcyBhcmUKICAgc3RyaXBwZWQgZnJvbSB0aGUgc3RyaW5nLiBDaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGxlYWRpbmcKICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlCiAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgcGxhY2Ugb24gdGhlCiAgIHRyYWlsaW5nIGVuZC4KCiAgIEZvciBleGFtcGxlOgoKICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nID0gJyMuLi4uLi4uIFNlY3Rpb24gMy4yLjEgSXNzdWUgIzMyIC4uLi4uLi4nCiAgICAgID4+PiBjb21tZW50X3N0cmluZy5zdHJpcCgnLiMhICcpCiAgICAgICdTZWN0aW9uIDMuMi4xIElzc3VlICMzMicKCiAgIFNlZSBhbHNvICJyc3RyaXAoKSIuCgpzdHIuc3dhcGNhc2UoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvCiAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4gTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXQKICAgInMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpID09IHMiLgoKc3RyLnRpdGxlKCkKCiAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzIHN0YXJ0IHdpdGggYW4KICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnSGVsbG8gd29ybGQnLnRpdGxlKCkKICAgICAgJ0hlbGxvIFdvcmxkJwoKICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYQogICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW4KICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kCiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkCiAgIHJlc3VsdDoKCiAgICAgID4+PiAidGhleSdyZSBiaWxsJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKQogICAgICAiVGhleSdSZSBCaWxsJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayIKCiAgIFRoZSAic3RyaW5nLmNhcHdvcmRzKCkiIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9ibGVtLCBhcyBpdAogICBzcGxpdHMgd29yZHMgb24gc3BhY2VzIG9ubHkuCgogICBBbHRlcm5hdGl2ZWx5LCBhIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZAogICB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zOgoKICAgICAgPj4+IGltcG9ydCByZQogICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKToKICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKCdbQS1aYS16XSspPyIsCiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApLmNhcGl0YWxpemUoKSwKICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpCiAgICAgIC4uLgogICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5J3JlIGJpbGwncyBmcmllbmRzLiIpCiAgICAgICJUaGV5J3JlIEJpbGwncyBGcmllbmRzLiIKCiAgIFNlZSBhbHNvICJpc3RpdGxlKCkiLgoKc3RyLnRyYW5zbGF0ZSh0YWJsZSwgLykKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgYmVlbiBtYXBwZWQKICAgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUuICBUaGUgdGFibGUgbXVzdCBiZSBhbiBvYmplY3QKICAgdGhhdCBpbXBsZW1lbnRzIGluZGV4aW5nIHZpYSAiX19nZXRpdGVtX18oKSIsIHR5cGljYWxseSBhICptYXBwaW5nKgogICBvciAqc2VxdWVuY2UqLiAgV2hlbiBpbmRleGVkIGJ5IGEgVW5pY29kZSBvcmRpbmFsIChhbiBpbnRlZ2VyKSwgdGhlCiAgIHRhYmxlIG9iamVjdCBjYW4gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6IHJldHVybiBhIFVuaWNvZGUgb3JkaW5hbAogICBvciBhIHN0cmluZywgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgY2hhcmFjdGVyczsKICAgcmV0dXJuICJOb25lIiwgdG8gZGVsZXRlIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmV0dXJuIHN0cmluZzsgb3IKICAgcmFpc2UgYSAiTG9va3VwRXJyb3IiIGV4Y2VwdGlvbiwgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gaXRzZWxmLgoKICAgWW91IGNhbiB1c2UgInN0ci5tYWtldHJhbnMoKSIgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gbWFwIGZyb20KICAgY2hhcmFjdGVyLXRvLWNoYXJhY3RlciBtYXBwaW5ncyBpbiBkaWZmZXJlbnQgZm9ybWF0cy4KCiAgIFNlZSBhbHNvIHRoZSAiY29kZWNzIiBtb2R1bGUgZm9yIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCB0byBjdXN0b20KICAgY2hhcmFjdGVyIG1hcHBpbmdzLgoKc3RyLnVwcGVyKCkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF0KICAgY29udmVydGVkIHRvIHVwcGVyY2FzZS4gIE5vdGUgdGhhdCAicy51cHBlcigpLmlzdXBwZXIoKSIgbWlnaHQgYmUKICAgIkZhbHNlIiBpZiAicyIgY29udGFpbnMgdW5jYXNlZCBjaGFyYWN0ZXJzIG9yIGlmIHRoZSBVbmljb2RlCiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCDigJxMdeKAnSAoTGV0dGVyLAogICB1cHBlcmNhc2UpLCBidXQgZS5nLiDigJxMdOKAnSAoTGV0dGVyLCB0aXRsZWNhc2UpLgoKICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMKICAg4oCYRGVmYXVsdCBDYXNlIEZvbGRpbmfigJkgb2YgdGhlIFVuaWNvZGUgU3RhbmRhcmQuCgpzdHIuemZpbGwod2lkdGgsIC8pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCBBU0NJSSAiJzAnIiBkaWdpdHMgdG8KICAgbWFrZSBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gQSBsZWFkaW5nIHNpZ24gcHJlZml4CiAgICgiJysnIi8iJy0nIikgaXMgaGFuZGxlZCBieSBpbnNlcnRpbmcgdGhlIHBhZGRpbmcgKmFmdGVyKiB0aGUgc2lnbgogICBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYmVmb3JlLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmCiAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gIjQyIi56ZmlsbCg1KQogICAgICAnMDAwNDInCiAgICAgID4+PiAiLTQyIi56ZmlsbCg1KQogICAgICAnLTAwNDInCgogICBTZWUgYWxzbyAicmp1c3QoKSIuCtoHc3RyaW5nc3XsJAAAU3RyaW5nIGFuZCBCeXRlcyBsaXRlcmFscwoqKioqKioqKioqKioqKioqKioqKioqKioqCgpTdHJpbmcgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZykKICAgc3RyaW5ncHJlZml4ICAgIDo6PSAiciIgfCAidSIgfCAiUiIgfCAiVSIgfCAiZiIgfCAiRiIKICAgICAgICAgICAgICAgICAgICAgICB8ICJmciIgfCAiRnIiIHwgImZSIiB8ICJGUiIgfCAicmYiIHwgInJGIiB8ICJSZiIgfCAiUkYiCiAgIHNob3J0c3RyaW5nICAgICA6Oj0gIiciIHNob3J0c3RyaW5naXRlbSogIiciIHwgJyInIHNob3J0c3RyaW5naXRlbSogJyInCiAgIGxvbmdzdHJpbmcgICAgICA6Oj0gIicnJyIgbG9uZ3N0cmluZ2l0ZW0qICInJyciIHwgJyIiIicgbG9uZ3N0cmluZ2l0ZW0qICciIiInCiAgIHNob3J0c3RyaW5naXRlbSA6Oj0gc2hvcnRzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxCiAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXEKICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcIiBvciBuZXdsaW5lIG9yIHRoZSBxdW90ZT4KICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcIj4KICAgc3RyaW5nZXNjYXBlc2VxIDo6PSAiXCIgPGFueSBzb3VyY2UgY2hhcmFjdGVyPgoKICAgYnl0ZXNsaXRlcmFsICAgOjo9IGJ5dGVzcHJlZml4KHNob3J0Ynl0ZXMgfCBsb25nYnl0ZXMpCiAgIGJ5dGVzcHJlZml4ICAgIDo6PSAiYiIgfCAiQiIgfCAiYnIiIHwgIkJyIiB8ICJiUiIgfCAiQlIiIHwgInJiIiB8ICJyQiIgfCAiUmIiIHwgIlJCIgogICBzaG9ydGJ5dGVzICAgICA6Oj0gIiciIHNob3J0Ynl0ZXNpdGVtKiAiJyIgfCAnIicgc2hvcnRieXRlc2l0ZW0qICciJwogICBsb25nYnl0ZXMgICAgICA6Oj0gIicnJyIgbG9uZ2J5dGVzaXRlbSogIicnJyIgfCAnIiIiJyBsb25nYnl0ZXNpdGVtKiAnIiIiJwogICBzaG9ydGJ5dGVzaXRlbSA6Oj0gc2hvcnRieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcQogICBsb25nYnl0ZXNpdGVtICA6Oj0gbG9uZ2J5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxCiAgIHNob3J0Ynl0ZXNjaGFyIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPgogICBsb25nYnl0ZXNjaGFyICA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcIj4KICAgYnl0ZXNlc2NhcGVzZXEgOjo9ICJcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj4KCk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0CndoaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgInN0cmluZ3ByZWZpeCIgb3IgImJ5dGVzcHJlZml4IgphbmQgdGhlIHJlc3Qgb2YgdGhlIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5CnRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgVVRGLTggaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXMKZ2l2ZW4gaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiBFbmNvZGluZyBkZWNsYXJhdGlvbnMuCgpJbiBwbGFpbiBFbmdsaXNoOiBCb3RoIHR5cGVzIG9mIGxpdGVyYWxzIGNhbiBiZSBlbmNsb3NlZCBpbiBtYXRjaGluZwpzaW5nbGUgcXVvdGVzICgiJyIpIG9yIGRvdWJsZSBxdW90ZXMgKCIiIikuICBUaGV5IGNhbiBhbHNvIGJlIGVuY2xvc2VkCmluIG1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlCmdlbmVyYWxseSByZWZlcnJlZCB0byBhcyAqdHJpcGxlLXF1b3RlZCBzdHJpbmdzKikuIFRoZSBiYWNrc2xhc2ggKCJcIikKY2hhcmFjdGVyIGlzIHVzZWQgdG8gZ2l2ZSBzcGVjaWFsIG1lYW5pbmcgdG8gb3RoZXJ3aXNlIG9yZGluYXJ5CmNoYXJhY3RlcnMgbGlrZSAibiIsIHdoaWNoIG1lYW5zIOKAmG5ld2xpbmXigJkgd2hlbiBlc2NhcGVkICgiXG4iKS4gSXQgY2FuCmFsc28gYmUgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG90aGVyd2lzZSBoYXZlIGEgc3BlY2lhbAptZWFuaW5nLCBzdWNoIGFzIG5ld2xpbmUsIGJhY2tzbGFzaCBpdHNlbGYsIG9yIHRoZSBxdW90ZSBjaGFyYWN0ZXIuClNlZSBlc2NhcGUgc2VxdWVuY2VzIGJlbG93IGZvciBleGFtcGxlcy4KCkJ5dGVzIGxpdGVyYWxzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCAiJ2InIiBvciAiJ0InIjsgdGhleSBwcm9kdWNlCmFuIGluc3RhbmNlIG9mIHRoZSAiYnl0ZXMiIHR5cGUgaW5zdGVhZCBvZiB0aGUgInN0ciIgdHlwZS4gIFRoZXkgbWF5Cm9ubHkgY29udGFpbiBBU0NJSSBjaGFyYWN0ZXJzOyBieXRlcyB3aXRoIGEgbnVtZXJpYyB2YWx1ZSBvZiAxMjggb3IKZ3JlYXRlciBtdXN0IGJlIGV4cHJlc3NlZCB3aXRoIGVzY2FwZXMuCgpCb3RoIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCBhCmxldHRlciAiJ3InIiBvciAiJ1InIjsgc3VjaCBjb25zdHJ1Y3RzIGFyZSBjYWxsZWQgKnJhdyBzdHJpbmcKbGl0ZXJhbHMqIGFuZCAqcmF3IGJ5dGVzIGxpdGVyYWxzKiByZXNwZWN0aXZlbHkgYW5kIHRyZWF0IGJhY2tzbGFzaGVzCmFzIGxpdGVyYWwgY2hhcmFjdGVycy4gIEFzIGEgcmVzdWx0LCBpbiByYXcgc3RyaW5nIGxpdGVyYWxzLCAiJ1xVJyIKYW5kICInXHUnIiBlc2NhcGVzIGFyZSBub3QgdHJlYXRlZCBzcGVjaWFsbHkuCgpBZGRlZCBpbiB2ZXJzaW9uIDMuMzogVGhlICIncmInIiBwcmVmaXggb2YgcmF3IGJ5dGVzIGxpdGVyYWxzIGhhcyBiZWVuCmFkZGVkIGFzIGEgc3lub255bSBvZiAiJ2JyJyIuU3VwcG9ydCBmb3IgdGhlIHVuaWNvZGUgbGVnYWN5IGxpdGVyYWwKKCJ1J3ZhbHVlJyIpIHdhcyByZWludHJvZHVjZWQgdG8gc2ltcGxpZnkgdGhlIG1haW50ZW5hbmNlIG9mIGR1YWwKUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKQSBzdHJpbmcgbGl0ZXJhbCB3aXRoICInZiciIG9yICInRiciIGluIGl0cyBwcmVmaXggaXMgYSAqZm9ybWF0dGVkCnN0cmluZyBsaXRlcmFsKjsgc2VlIGYtc3RyaW5ncy4gIFRoZSAiJ2YnIiBtYXkgYmUgY29tYmluZWQgd2l0aCAiJ3InIiwKYnV0IG5vdCB3aXRoICInYiciIG9yICIndSciLCB0aGVyZWZvcmUgcmF3IGZvcm1hdHRlZCBzdHJpbmdzIGFyZQpwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgbm90LgoKSW4gdHJpcGxlLXF1b3RlZCBsaXRlcmFscywgdW5lc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZXMgYXJlIGFsbG93ZWQKKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93CnRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBIOKAnHF1b3Rl4oCdIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZQpsaXRlcmFsLCBpLmUuIGVpdGhlciAiJyIgb3IgIiIiLikKCgpFc2NhcGUgc2VxdWVuY2VzCj09PT09PT09PT09PT09PT0KClVubGVzcyBhbiAiJ3InIiBvciAiJ1InIiBwcmVmaXggaXMgcHJlc2VudCwgZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcKYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZQp1c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZToKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IEVzY2FwZSBTZXF1ZW5jZSAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHwKfD09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT18CnwgIlwiPG5ld2xpbmU+ICAgICAgICAgICAgICB8IEJhY2tzbGFzaCBhbmQgbmV3bGluZSBpZ25vcmVkICAgICB8ICgxKSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXFwiICAgICAgICAgICAgICAgICAgICAgIHwgQmFja3NsYXNoICgiXCIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcJyIgICAgICAgICAgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKCInIikgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlwiIiAgICAgICAgICAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoIiIiKSAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXGEiICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgQmVsbCAoQkVMKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcYiIgICAgICAgICAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlxmIiAgICAgICAgICAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXG4iICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgTGluZWZlZWQgKExGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcciIgICAgICAgICAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlx0IiAgICAgICAgICAgICAgICAgICAgICB8IEFTQ0lJIEhvcml6b250YWwgVGFiIChUQUIpICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXHYiICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgVmVydGljYWwgVGFiIChWVCkgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcKm9vbyoiICAgICAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMiw0KSAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlx4KmhoKiIgICAgICAgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICgzLDQpICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKCkVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBFc2NhcGUgU2VxdWVuY2UgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09fAp8ICJcTnsqbmFtZSp9IiAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgbmFtZWQgKm5hbWUqIGluIHRoZSAgICAgfCAoNSkgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcdSp4eHh4KiIgICAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlICAgfCAoNikgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcVSp4eHh4eHh4eCoiICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAzMi1iaXQgaGV4IHZhbHVlICAgfCAoNykgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiBBIGJhY2tzbGFzaCBjYW4gYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGxpbmUgdG8gaWdub3JlIHRoZQogICBuZXdsaW5lOgoKICAgICAgPj4+ICdUaGlzIHN0cmluZyB3aWxsIG5vdCBpbmNsdWRlIFwKICAgICAgLi4uIGJhY2tzbGFzaGVzIG9yIG5ld2xpbmUgY2hhcmFjdGVycy4nCiAgICAgICdUaGlzIHN0cmluZyB3aWxsIG5vdCBpbmNsdWRlIGJhY2tzbGFzaGVzIG9yIG5ld2xpbmUgY2hhcmFjdGVycy4nCgogICBUaGUgc2FtZSByZXN1bHQgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRyaXBsZS1xdW90ZWQgc3RyaW5ncywgb3IKICAgcGFyZW50aGVzZXMgYW5kIHN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24uCgoyLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IE9jdGFsIGVzY2FwZXMgd2l0aCB2YWx1ZSBsYXJnZXIgdGhhbgogICAiMG8zNzciIHByb2R1Y2UgYSAiRGVwcmVjYXRpb25XYXJuaW5nIi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjEyOiBPY3RhbCBlc2NhcGVzIHdpdGggdmFsdWUgbGFyZ2VyIHRoYW4KICAgIjBvMzc3IiBwcm9kdWNlIGEgIlN5bnRheFdhcm5pbmciLiBJbiBhIGZ1dHVyZSBQeXRob24gdmVyc2lvbiB0aGV5CiAgIHdpbGwgYmUgZXZlbnR1YWxseSBhICJTeW50YXhFcnJvciIuCgozLiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuCgo0LiBJbiBhIGJ5dGVzIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGUgYnl0ZQogICB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gSW4gYSBzdHJpbmcgbGl0ZXJhbCwgdGhlc2UgZXNjYXBlcyBkZW5vdGUgYQogICBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KCjUuIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIG5hbWUgYWxpYXNlcyBbMV0gaGFzIGJlZW4KICAgYWRkZWQuCgo2LiBFeGFjdGx5IGZvdXIgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuCgo3LiBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdGhpcyB3YXkuICBFeGFjdGx5IGVpZ2h0IGhleAogICBkaWdpdHMgYXJlIHJlcXVpcmVkLgoKVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiB0aGUKc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgcmVzdWx0Ki4gIChUaGlzCmJlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzIG1pc3R5cGVkLAp0aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyBhbHNvCmltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZwpsaXRlcmFscyBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciBieXRlcwpsaXRlcmFscy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjY6IFVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIHByb2R1Y2UgYQoiRGVwcmVjYXRpb25XYXJuaW5nIi4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjEyOiBVbnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBwcm9kdWNlIGEKIlN5bnRheFdhcm5pbmciLiBJbiBhIGZ1dHVyZSBQeXRob24gdmVyc2lvbiB0aGV5IHdpbGwgYmUgZXZlbnR1YWxseSBhCiJTeW50YXhFcnJvciIuCgpFdmVuIGluIGEgcmF3IGxpdGVyYWwsIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBidXQgdGhlCmJhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCAiciJcIiIiIGlzIGEgdmFsaWQKc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlCnF1b3RlOyAiciJcIiIgaXMgbm90IGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwgKGV2ZW4gYSByYXcgc3RyaW5nIGNhbm5vdAplbmQgaW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcykuICBTcGVjaWZpY2FsbHksICphIHJhdyBsaXRlcmFsCmNhbm5vdCBlbmQgaW4gYSBzaW5nbGUgYmFja3NsYXNoKiAoc2luY2UgdGhlIGJhY2tzbGFzaCB3b3VsZCBlc2NhcGUKdGhlIGZvbGxvd2luZyBxdW90ZSBjaGFyYWN0ZXIpLiAgTm90ZSBhbHNvIHRoYXQgYSBzaW5nbGUgYmFja3NsYXNoCmZvbGxvd2VkIGJ5IGEgbmV3bGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aG9zZSB0d28gY2hhcmFjdGVycyBhcyBwYXJ0Cm9mIHRoZSBsaXRlcmFsLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLgraDXN1YnNjcmlwdGlvbnN1KAoAAFN1YnNjcmlwdGlvbnMKKioqKioqKioqKioqKgoKVGhlIHN1YnNjcmlwdGlvbiBvZiBhbiBpbnN0YW5jZSBvZiBhIGNvbnRhaW5lciBjbGFzcyB3aWxsIGdlbmVyYWxseQpzZWxlY3QgYW4gZWxlbWVudCBmcm9tIHRoZSBjb250YWluZXIuIFRoZSBzdWJzY3JpcHRpb24gb2YgYSAqZ2VuZXJpYwpjbGFzcyogd2lsbCBnZW5lcmFsbHkgcmV0dXJuIGEgR2VuZXJpY0FsaWFzIG9iamVjdC4KCiAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZmxleGlibGVfZXhwcmVzc2lvbl9saXN0ICJdIgoKV2hlbiBhbiBvYmplY3QgaXMgc3Vic2NyaXB0ZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIGV2YWx1YXRlIHRoZQpwcmltYXJ5IGFuZCB0aGUgZXhwcmVzc2lvbiBsaXN0LgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBzdWJzY3JpcHRpb24uIEFuCm9iamVjdCBtYXkgc3VwcG9ydCBzdWJzY3JpcHRpb24gdGhyb3VnaCBkZWZpbmluZyBvbmUgb3IgYm90aCBvZgoiX19nZXRpdGVtX18oKSIgYW5kICJfX2NsYXNzX2dldGl0ZW1fXygpIi4gV2hlbiB0aGUgcHJpbWFyeSBpcwpzdWJzY3JpcHRlZCwgdGhlIGV2YWx1YXRlZCByZXN1bHQgb2YgdGhlIGV4cHJlc3Npb24gbGlzdCB3aWxsIGJlCnBhc3NlZCB0byBvbmUgb2YgdGhlc2UgbWV0aG9kcy4gRm9yIG1vcmUgZGV0YWlscyBvbiB3aGVuCiJfX2NsYXNzX2dldGl0ZW1fXyIgaXMgY2FsbGVkIGluc3RlYWQgb2YgIl9fZ2V0aXRlbV9fIiwgc2VlCl9fY2xhc3NfZ2V0aXRlbV9fIHZlcnN1cyBfX2dldGl0ZW1fXy4KCklmIHRoZSBleHByZXNzaW9uIGxpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCBvciBpZiBhbnkgb2YgdGhlCmV4cHJlc3Npb25zIGFyZSBzdGFycmVkLCB0aGUgZXhwcmVzc2lvbiBsaXN0IHdpbGwgZXZhbHVhdGUgdG8gYQoidHVwbGUiIGNvbnRhaW5pbmcgdGhlIGl0ZW1zIG9mIHRoZSBleHByZXNzaW9uIGxpc3QuIE90aGVyd2lzZSwgdGhlCmV4cHJlc3Npb24gbGlzdCB3aWxsIGV2YWx1YXRlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbGlzdOKAmXMgc29sZSBtZW1iZXIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogRXhwcmVzc2lvbnMgaW4gYW4gZXhwcmVzc2lvbiBsaXN0IG1heSBiZQpzdGFycmVkLiBTZWUgKipQRVAgNjQ2KiouCgpGb3IgYnVpbHQtaW4gb2JqZWN0cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvYmplY3RzIHRoYXQgc3VwcG9ydApzdWJzY3JpcHRpb24gdmlhICJfX2dldGl0ZW1fXygpIjoKCjEuIE1hcHBpbmdzLiBJZiB0aGUgcHJpbWFyeSBpcyBhICptYXBwaW5nKiwgdGhlIGV4cHJlc3Npb24gbGlzdCBtdXN0CiAgIGV2YWx1YXRlIHRvIGFuIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlCiAgIG1hcHBpbmcsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIHZhbHVlIGluIHRoZSBtYXBwaW5nIHRoYXQKICAgY29ycmVzcG9uZHMgdG8gdGhhdCBrZXkuIEFuIGV4YW1wbGUgb2YgYSBidWlsdGluIG1hcHBpbmcgY2xhc3MgaXMKICAgdGhlICJkaWN0IiBjbGFzcy4KCjIuIFNlcXVlbmNlcy4gSWYgdGhlIHByaW1hcnkgaXMgYSAqc2VxdWVuY2UqLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QKICAgZXZhbHVhdGUgdG8gYW4gImludCIgb3IgYSAic2xpY2UiIChhcyBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZwogICBzZWN0aW9uKS4gRXhhbXBsZXMgb2YgYnVpbHRpbiBzZXF1ZW5jZSBjbGFzc2VzIGluY2x1ZGUgdGhlICJzdHIiLAogICAibGlzdCIgYW5kICJ0dXBsZSIgY2xhc3Nlcy4KClRoZSBmb3JtYWwgc3ludGF4IG1ha2VzIG5vIHNwZWNpYWwgcHJvdmlzaW9uIGZvciBuZWdhdGl2ZSBpbmRpY2VzIGluCipzZXF1ZW5jZXMqLiBIb3dldmVyLCBidWlsdC1pbiBzZXF1ZW5jZXMgYWxsIHByb3ZpZGUgYSAiX19nZXRpdGVtX18oKSIKbWV0aG9kIHRoYXQgaW50ZXJwcmV0cyBuZWdhdGl2ZSBpbmRpY2VzIGJ5IGFkZGluZyB0aGUgbGVuZ3RoIG9mIHRoZQpzZXF1ZW5jZSB0byB0aGUgaW5kZXggc28gdGhhdCwgZm9yIGV4YW1wbGUsICJ4Wy0xXSIgc2VsZWN0cyB0aGUgbGFzdAppdGVtIG9mICJ4Ii4gVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzCnRoYW4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2VxdWVuY2UsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMKdGhlIGl0ZW0gd2hvc2UgaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4gU2luY2UgdGhlCnN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgYW5kIHNsaWNpbmcgb2NjdXJzIGluIHRoZSBvYmplY3TigJlzCiJfX2dldGl0ZW1fXygpIiBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8KZXhwbGljaXRseSBhZGQgdGhhdCBzdXBwb3J0LgoKQSAic3RyaW5nIiBpcyBhIHNwZWNpYWwga2luZCBvZiBzZXF1ZW5jZSB3aG9zZSBpdGVtcyBhcmUgKmNoYXJhY3RlcnMqLgpBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhIHR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lCmNoYXJhY3Rlci4K2gV0cnV0aGF3AwAAVHJ1dGggVmFsdWUgVGVzdGluZwoqKioqKioqKioqKioqKioqKioqCgpBbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuICJpZiIgb3IKIndoaWxlIiBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LgoKQnkgZGVmYXVsdCwgYW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgdHJ1ZSB1bmxlc3MgaXRzIGNsYXNzIGRlZmluZXMKZWl0aGVyIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCB0aGF0IHJldHVybnMgIkZhbHNlIiBvciBhICJfX2xlbl9fKCkiCm1ldGhvZCB0aGF0IHJldHVybnMgemVybywgd2hlbiBjYWxsZWQgd2l0aCB0aGUgb2JqZWN0LiBbMV0gIEhlcmUgYXJlCm1vc3Qgb2YgdGhlIGJ1aWx0LWluIG9iamVjdHMgY29uc2lkZXJlZCBmYWxzZToKCiogY29uc3RhbnRzIGRlZmluZWQgdG8gYmUgZmFsc2U6ICJOb25lIiBhbmQgIkZhbHNlIgoKKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGU6ICIwIiwgIjAuMCIsICIwaiIsICJEZWNpbWFsKDApIiwKICAiRnJhY3Rpb24oMCwgMSkiCgoqIGVtcHR5IHNlcXVlbmNlcyBhbmQgY29sbGVjdGlvbnM6ICInJyIsICIoKSIsICJbXSIsICJ7fSIsICJzZXQoKSIsCiAgInJhbmdlKDApIgoKT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0IGFsd2F5cwpyZXR1cm4gIjAiIG9yICJGYWxzZSIgZm9yIGZhbHNlIGFuZCAiMSIgb3IgIlRydWUiIGZvciB0cnVlLCB1bmxlc3MKb3RoZXJ3aXNlIHN0YXRlZC4gKEltcG9ydGFudCBleGNlcHRpb246IHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgIm9yIgphbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKQp1vSAAAFRoZSAidHJ5IiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKgoKVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGUKZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czoKCiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10IHwgdHJ5M19zdG10CiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgc3VpdGUpKwogICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQogICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXQogICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICgiZXhjZXB0IiAiKiIgZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXSAiOiIgc3VpdGUpKwogICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQogICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXQogICB0cnkzX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGUKCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbgpFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvIGdlbmVyYXRlCmV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gVGhlIHJhaXNlIHN0YXRlbWVudC4KCgoiZXhjZXB0IiBjbGF1c2UKPT09PT09PT09PT09PT09CgpUaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vCmV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXMKZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciBhbgpleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgImV4Y2VwdCIKY2xhdXNlcyBpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gQW4KZXhwcmVzc2lvbi1sZXNzICJleGNlcHQiIGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzCmFueSBleGNlcHRpb24uCgpGb3IgYW4gImV4Y2VwdCIgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhlIGV4cHJlc3Npb24gbXVzdApldmFsdWF0ZSB0byBhbiBleGNlcHRpb24gdHlwZSBvciBhIHR1cGxlIG9mIGV4Y2VwdGlvbiB0eXBlcy4gVGhlCnJhaXNlZCBleGNlcHRpb24gbWF0Y2hlcyBhbiAiZXhjZXB0IiBjbGF1c2Ugd2hvc2UgZXhwcmVzc2lvbiBldmFsdWF0ZXMKdG8gdGhlIGNsYXNzIG9yIGEgKm5vbi12aXJ0dWFsIGJhc2UgY2xhc3MqIG9mIHRoZSBleGNlcHRpb24gb2JqZWN0LCBvcgp0byBhIHR1cGxlIHRoYXQgY29udGFpbnMgc3VjaCBhIGNsYXNzLgoKSWYgbm8gImV4Y2VwdCIgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4KZXhjZXB0aW9uIGhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUKaW52b2NhdGlvbiBzdGFjay4gIFsxXQoKSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuICJleGNlcHQiIGNsYXVzZQpyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kCmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uCnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZAp0aGUgZXhjZXB0aW9uKS4KCldoZW4gYSBtYXRjaGluZyAiZXhjZXB0IiBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG8KdGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0ICJleGNlcHQiIGNsYXVzZSwKaWYgcHJlc2VudCwgYW5kIHRoZSAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLiBBbGwgImV4Y2VwdCIKY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMKcmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlICJ0cnkiCnN0YXRlbWVudC4gKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZQpleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlIG9mIHRoZSBpbm5lcgpoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pCgpXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZAphdCB0aGUgZW5kIG9mIHRoZSAiZXhjZXB0IiBjbGF1c2UuICBUaGlzIGlzIGFzIGlmCgogICBleGNlcHQgRSBhcyBOOgogICAgICAgZm9vCgp3YXMgdHJhbnNsYXRlZCB0bwoKICAgZXhjZXB0IEUgYXMgTjoKICAgICAgIHRyeToKICAgICAgICAgICBmb28KICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgZGVsIE4KClRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmUKYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgImV4Y2VwdCIgY2xhdXNlLiBFeGNlcHRpb25zIGFyZSBjbGVhcmVkCmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZQpjeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmUKdW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy4KCkJlZm9yZSBhbiAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLCB0aGUgZXhjZXB0aW9uIGlzIHN0b3JlZAppbiB0aGUgInN5cyIgbW9kdWxlLCB3aGVyZSBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIGJvZHkgb2YKdGhlICJleGNlcHQiIGNsYXVzZSBieSBjYWxsaW5nICJzeXMuZXhjZXB0aW9uKCkiLiBXaGVuIGxlYXZpbmcgYW4KZXhjZXB0aW9uIGhhbmRsZXIsIHRoZSBleGNlcHRpb24gc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgaXMgcmVzZXQKdG8gaXRzIHByZXZpb3VzIHZhbHVlOgoKICAgPj4+IHByaW50KHN5cy5leGNlcHRpb24oKSkKICAgTm9uZQogICA+Pj4gdHJ5OgogICAuLi4gICAgIHJhaXNlIFR5cGVFcnJvcgogICAuLi4gZXhjZXB0OgogICAuLi4gICAgIHByaW50KHJlcHIoc3lzLmV4Y2VwdGlvbigpKSkKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgIC4uLiAgICAgZXhjZXB0OgogICAuLi4gICAgICAgICBwcmludChyZXByKHN5cy5leGNlcHRpb24oKSkpCiAgIC4uLiAgICAgcHJpbnQocmVwcihzeXMuZXhjZXB0aW9uKCkpKQogICAuLi4KICAgVHlwZUVycm9yKCkKICAgVmFsdWVFcnJvcigpCiAgIFR5cGVFcnJvcigpCiAgID4+PiBwcmludChzeXMuZXhjZXB0aW9uKCkpCiAgIE5vbmUKCgoiZXhjZXB0KiIgY2xhdXNlCj09PT09PT09PT09PT09PT0KClRoZSAiZXhjZXB0KiIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgaGFuZGxlcnMgZm9yIGdyb3VwcyBvZgpleGNlcHRpb25zICgiQmFzZUV4Y2VwdGlvbkdyb3VwIiBpbnN0YW5jZXMpLiBBICJ0cnkiIHN0YXRlbWVudCBjYW4KaGF2ZSBlaXRoZXIgImV4Y2VwdCIgb3IgImV4Y2VwdCoiIGNsYXVzZXMsIGJ1dCBub3QgYm90aC4gVGhlIGV4Y2VwdGlvbgp0eXBlIGZvciBtYXRjaGluZyBpcyBtYW5kYXRvcnkgaW4gdGhlIGNhc2Ugb2YgImV4Y2VwdCoiLCBzbyAiZXhjZXB0KjoiCmlzIGEgc3ludGF4IGVycm9yLiBUaGUgdHlwZSBpcyBpbnRlcnByZXRlZCBhcyBpbiB0aGUgY2FzZSBvZiAiZXhjZXB0IiwKYnV0IG1hdGNoaW5nIGlzIHBlcmZvcm1lZCBvbiB0aGUgZXhjZXB0aW9ucyBjb250YWluZWQgaW4gdGhlIGdyb3VwCnRoYXQgaXMgYmVpbmcgaGFuZGxlZC4gQW4gIlR5cGVFcnJvciIgaXMgcmFpc2VkIGlmIGEgbWF0Y2hpbmcgdHlwZSBpcwphIHN1YmNsYXNzIG9mICJCYXNlRXhjZXB0aW9uR3JvdXAiLCBiZWNhdXNlIHRoYXQgd291bGQgaGF2ZSBhbWJpZ3VvdXMKc2VtYW50aWNzLgoKV2hlbiBhbiBleGNlcHRpb24gZ3JvdXAgaXMgcmFpc2VkIGluIHRoZSB0cnkgYmxvY2ssIGVhY2ggImV4Y2VwdCoiCmNsYXVzZSBzcGxpdHMgKHNlZSAic3BsaXQoKSIpIGl0IGludG8gdGhlIHN1Ymdyb3VwcyBvZiBtYXRjaGluZyBhbmQKbm9uLW1hdGNoaW5nIGV4Y2VwdGlvbnMuIElmIHRoZSBtYXRjaGluZyBzdWJncm91cCBpcyBub3QgZW1wdHksIGl0CmJlY29tZXMgdGhlIGhhbmRsZWQgZXhjZXB0aW9uICh0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbQoic3lzLmV4Y2VwdGlvbigpIikgYW5kIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgb2YgdGhlICJleGNlcHQqIiBjbGF1c2UKKGlmIHRoZXJlIGlzIG9uZSkuIFRoZW4sIHRoZSBib2R5IG9mIHRoZSAiZXhjZXB0KiIgY2xhdXNlIGV4ZWN1dGVzLiBJZgp0aGUgbm9uLW1hdGNoaW5nIHN1Ymdyb3VwIGlzIG5vdCBlbXB0eSwgaXQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBuZXh0CiJleGNlcHQqIiBpbiB0aGUgc2FtZSBtYW5uZXIuIFRoaXMgY29udGludWVzIHVudGlsIGFsbCBleGNlcHRpb25zIGluCnRoZSBncm91cCBoYXZlIGJlZW4gbWF0Y2hlZCwgb3IgdGhlIGxhc3QgImV4Y2VwdCoiIGNsYXVzZSBoYXMgcnVuLgoKQWZ0ZXIgYWxsICJleGNlcHQqIiBjbGF1c2VzIGV4ZWN1dGUsIHRoZSBncm91cCBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucwppcyBtZXJnZWQgd2l0aCBhbnkgZXhjZXB0aW9ucyB0aGF0IHdlcmUgcmFpc2VkIG9yIHJlLXJhaXNlZCBmcm9tCndpdGhpbiAiZXhjZXB0KiIgY2xhdXNlcy4gVGhpcyBtZXJnZWQgZXhjZXB0aW9uIGdyb3VwIHByb3BhZ2F0ZXMgb24uOgoKICAgPj4+IHRyeToKICAgLi4uICAgICByYWlzZSBFeGNlcHRpb25Hcm91cCgiZWciLAogICAuLi4gICAgICAgICBbVmFsdWVFcnJvcigxKSwgVHlwZUVycm9yKDIpLCBPU0Vycm9yKDMpLCBPU0Vycm9yKDQpXSkKICAgLi4uIGV4Y2VwdCogVHlwZUVycm9yIGFzIGU6CiAgIC4uLiAgICAgcHJpbnQoZidjYXVnaHQge3R5cGUoZSl9IHdpdGggbmVzdGVkIHtlLmV4Y2VwdGlvbnN9JykKICAgLi4uIGV4Y2VwdCogT1NFcnJvciBhcyBlOgogICAuLi4gICAgIHByaW50KGYnY2F1Z2h0IHt0eXBlKGUpfSB3aXRoIG5lc3RlZCB7ZS5leGNlcHRpb25zfScpCiAgIC4uLgogICBjYXVnaHQgPGNsYXNzICdFeGNlcHRpb25Hcm91cCc+IHdpdGggbmVzdGVkIChUeXBlRXJyb3IoMiksKQogICBjYXVnaHQgPGNsYXNzICdFeGNlcHRpb25Hcm91cCc+IHdpdGggbmVzdGVkIChPU0Vycm9yKDMpLCBPU0Vycm9yKDQpKQogICAgICsgRXhjZXB0aW9uIEdyb3VwIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICB8ICAgRmlsZSAiPGRvY3Rlc3QgZGVmYXVsdFswXT4iLCBsaW5lIDIsIGluIDxtb2R1bGU+CiAgICAgfCAgICAgcmFpc2UgRXhjZXB0aW9uR3JvdXAoImVnIiwKICAgICB8ICAgICAgICAgW1ZhbHVlRXJyb3IoMSksIFR5cGVFcnJvcigyKSwgT1NFcnJvcigzKSwgT1NFcnJvcig0KV0pCiAgICAgfCBFeGNlcHRpb25Hcm91cDogZWcgKDEgc3ViLWV4Y2VwdGlvbikKICAgICArLSstLS0tLS0tLS0tLS0tLS0tIDEgLS0tLS0tLS0tLS0tLS0tLQogICAgICAgfCBWYWx1ZUVycm9yOiAxCiAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJZiB0aGUgZXhjZXB0aW9uIHJhaXNlZCBmcm9tIHRoZSAidHJ5IiBibG9jayBpcyBub3QgYW4gZXhjZXB0aW9uIGdyb3VwCmFuZCBpdHMgdHlwZSBtYXRjaGVzIG9uZSBvZiB0aGUgImV4Y2VwdCoiIGNsYXVzZXMsIGl0IGlzIGNhdWdodCBhbmQKd3JhcHBlZCBieSBhbiBleGNlcHRpb24gZ3JvdXAgd2l0aCBhbiBlbXB0eSBtZXNzYWdlIHN0cmluZy4gVGhpcwplbnN1cmVzIHRoYXQgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCAiZSIgaXMgY29uc2lzdGVudGx5CiJCYXNlRXhjZXB0aW9uR3JvdXAiOgoKICAgPj4+IHRyeToKICAgLi4uICAgICByYWlzZSBCbG9ja2luZ0lPRXJyb3IKICAgLi4uIGV4Y2VwdCogQmxvY2tpbmdJT0Vycm9yIGFzIGU6CiAgIC4uLiAgICAgcHJpbnQocmVwcihlKSkKICAgLi4uCiAgIEV4Y2VwdGlvbkdyb3VwKCcnLCAoQmxvY2tpbmdJT0Vycm9yKCksKSkKCiJicmVhayIsICJjb250aW51ZSIgYW5kICJyZXR1cm4iIGNhbm5vdCBhcHBlYXIgaW4gYW4gImV4Y2VwdCoiIGNsYXVzZS4KCgoiZWxzZSIgY2xhdXNlCj09PT09PT09PT09PT0KClRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIHRoZSBjb250cm9sIGZsb3cgbGVhdmVzIHRoZQoidHJ5IiBzdWl0ZSwgbm8gZXhjZXB0aW9uIHdhcyByYWlzZWQsIGFuZCBubyAicmV0dXJuIiwgImNvbnRpbnVlIiwgb3IKImJyZWFrIiBzdGF0ZW1lbnQgd2FzIGV4ZWN1dGVkLiAgRXhjZXB0aW9ucyBpbiB0aGUgImVsc2UiIGNsYXVzZSBhcmUKbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLgoKCiJmaW5hbGx5IiBjbGF1c2UKPT09PT09PT09PT09PT09PQoKSWYgImZpbmFsbHkiIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIOKAmGNsZWFudXDigJkgaGFuZGxlci4gIFRoZSAidHJ5IgpjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiBJZiBhbgpleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZQpleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWYKdGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICJmaW5hbGx5IgpjbGF1c2UuIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkCmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSIKY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZApleGNlcHRpb24gaXMgZGlzY2FyZGVkOgoKICAgPj4+IGRlZiBmKCk6CiAgIC4uLiAgICAgdHJ5OgogICAuLi4gICAgICAgICAxLzAKICAgLi4uICAgICBmaW5hbGx5OgogICAuLi4gICAgICAgICByZXR1cm4gNDIKICAgLi4uCiAgID4+PiBmKCkKICAgNDIKClRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmcKZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLgoKV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZQoidHJ5IiBzdWl0ZSBvZiBhICJ0cnki4oCmImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXMKYWxzbyBleGVjdXRlZCDigJhvbiB0aGUgd2F5IG91dC7igJkKClRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iCnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYQoicmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlCmxhc3Qgb25lIGV4ZWN1dGVkOgoKICAgPj4+IGRlZiBmb28oKToKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5JwogICAuLi4gICAgIGZpbmFsbHk6CiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseScKICAgLi4uCiAgID4+PiBmb28oKQogICAnZmluYWxseScKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFByaW9yIHRvIFB5dGhvbiAzLjgsIGEgImNvbnRpbnVlIiBzdGF0ZW1lbnQKd2FzIGlsbGVnYWwgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2UgZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHRoZQppbXBsZW1lbnRhdGlvbi4KdbEGAQBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkKKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uCm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlCmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2YKUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCBudW1iZXJzLAplZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKSwgYWx0aG91Z2ggc3VjaCBhZGRpdGlvbnMKd2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC4KClNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZwrigJhzcGVjaWFsIGF0dHJpYnV0ZXMu4oCZICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZQppbXBsZW1lbnRhdGlvbiBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBUaGVpciBkZWZpbml0aW9uCm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCgpOb25lCj09PT0KClRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzCnZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lICJOb25lIi4gSXQgaXMKdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLCBlLmcuLCBpdCBpcwpyZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbuKAmXQgZXhwbGljaXRseSByZXR1cm4gYW55dGhpbmcuIEl0cwp0cnV0aCB2YWx1ZSBpcyBmYWxzZS4KCgpOb3RJbXBsZW1lbnRlZAo9PT09PT09PT09PT09PQoKVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXMKdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUKIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBzaG91bGQKcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIHRoZQpvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGUgcmVmbGVjdGVkCm9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4pICBJdApzaG91bGQgbm90IGJlIGV2YWx1YXRlZCBpbiBhIGJvb2xlYW4gY29udGV4dC4KClNlZSBJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuOTogRXZhbHVhdGluZyAiTm90SW1wbGVtZW50ZWQiIGluIGEgYm9vbGVhbgpjb250ZXh0IGlzIGRlcHJlY2F0ZWQuIFdoaWxlIGl0IGN1cnJlbnRseSBldmFsdWF0ZXMgYXMgdHJ1ZSwgaXQgd2lsbAplbWl0IGEgIkRlcHJlY2F0aW9uV2FybmluZyIuIEl0IHdpbGwgcmFpc2UgYSAiVHlwZUVycm9yIiBpbiBhIGZ1dHVyZQp2ZXJzaW9uIG9mIFB5dGhvbi4KCgpFbGxpcHNpcwo9PT09PT09PQoKVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXMKdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGxpdGVyYWwgIi4uLiIgb3IgdGhlIGJ1aWx0LQppbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS4KCgoibnVtYmVycy5OdW1iZXIiCj09PT09PT09PT09PT09PT0KClRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgYnkKYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpYwpvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLiAgUHl0aG9uCm51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbCBudW1iZXJzLCBidXQKc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIGluIGNvbXB1dGVycy4KClRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBudW1lcmljIGNsYXNzZXMsIGNvbXB1dGVkIGJ5CiJfX3JlcHJfXygpIiBhbmQgIl9fc3RyX18oKSIsIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgoKKiBUaGV5IGFyZSB2YWxpZCBudW1lcmljIGxpdGVyYWxzIHdoaWNoLCB3aGVuIHBhc3NlZCB0byB0aGVpciBjbGFzcwogIGNvbnN0cnVjdG9yLCBwcm9kdWNlIGFuIG9iamVjdCBoYXZpbmcgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbAogIG51bWVyaWMuCgoqIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiBiYXNlIDEwLCB3aGVuIHBvc3NpYmxlLgoKKiBMZWFkaW5nIHplcm9zLCBwb3NzaWJseSBleGNlcHRpbmcgYSBzaW5nbGUgemVybyBiZWZvcmUgYSBkZWNpbWFsCiAgcG9pbnQsIGFyZSBub3Qgc2hvd24uCgoqIFRyYWlsaW5nIHplcm9zLCBwb3NzaWJseSBleGNlcHRpbmcgYSBzaW5nbGUgemVybyBhZnRlciBhIGRlY2ltYWwKICBwb2ludCwgYXJlIG5vdCBzaG93bi4KCiogQSBzaWduIGlzIHNob3duIG9ubHkgd2hlbiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLgoKUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmctcG9pbnQgbnVtYmVycywgYW5kCmNvbXBsZXggbnVtYmVyczoKCgoibnVtYmVycy5JbnRlZ3JhbCIKLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2VycwoocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS4KCk5vdGU6CgogIFRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgbW9zdAogIG1lYW5pbmdmdWwgaW50ZXJwcmV0YXRpb24gb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucyBpbnZvbHZpbmcKICBuZWdhdGl2ZSBpbnRlZ2Vycy4KClRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6CgpJbnRlZ2VycyAoImludCIpCiAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIGFuIHVubGltaXRlZCByYW5nZSwgc3ViamVjdCB0byBhdmFpbGFibGUKICAgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0IGFuZCBtYXNrCiAgIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsIGFuZCBuZWdhdGl2ZQogICBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMuKAmXMgY29tcGxlbWVudCB3aGljaCBnaXZlcwogICB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlCiAgIGxlZnQuCgpCb29sZWFucyAoImJvb2wiKQogICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d28gb2JqZWN0cwogICByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHRoZSBvbmx5IEJvb2xlYW4KICAgb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIGludGVnZXIgdHlwZSwgYW5kCiAgIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LCBpbgogICBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uIGJlaW5nIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYQogICBzdHJpbmcsIHRoZSBzdHJpbmdzICIiRmFsc2UiIiBvciAiIlRydWUiIiBhcmUgcmV0dXJuZWQsCiAgIHJlc3BlY3RpdmVseS4KCgoibnVtYmVycy5SZWFsIiAoImZsb2F0IikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCllvdSBhcmUgYXQgdGhlIG1lcmN5IG9mIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIChhbmQgQyBvcgpKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4KUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzOyB0aGUKc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yCnVzaW5nIHRoZXNlIGFyZSBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28KdGhlcmUgaXMgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mCmZsb2F0aW5nLXBvaW50IG51bWJlcnMuCgoKIm51bWJlcnMuQ29tcGxleCIgKCJjb21wbGV4IikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWwgZG91YmxlCnByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseSBhcyBmb3IKZmxvYXRpbmctcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhIGNvbXBsZXgKbnVtYmVyICJ6IiBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seSBhdHRyaWJ1dGVzICJ6LnJlYWwiCmFuZCAiei5pbWFnIi4KCgpTZXF1ZW5jZXMKPT09PT09PT09CgpUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZSBudW1iZXJzLgpUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgYQpzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGUgaW5kZXggc2V0IGNvbnRhaW5zCnRoZSBudW1iZXJzIDAsIDEsIOKApiwgKm4qLTEuICBJdGVtICppKiBvZiBzZXF1ZW5jZSAqYSogaXMgc2VsZWN0ZWQgYnkKImFbaV0iLiBTb21lIHNlcXVlbmNlcywgaW5jbHVkaW5nIGJ1aWx0LWluIHNlcXVlbmNlcywgaW50ZXJwcmV0Cm5lZ2F0aXZlIHN1YnNjcmlwdHMgYnkgYWRkaW5nIHRoZSBzZXF1ZW5jZSBsZW5ndGguIEZvciBleGFtcGxlLAoiYVstMl0iIGVxdWFscyAiYVtuLTJdIiwgdGhlIHNlY29uZCB0byBsYXN0IGl0ZW0gb2Ygc2VxdWVuY2UgYSB3aXRoCmxlbmd0aCAibiIuCgpTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6ICJhW2k6al0iIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGggaW5kZXgKKmsqIHN1Y2ggdGhhdCAqaSogIjw9IiAqayogIjwiICpqKi4gIFdoZW4gdXNlZCBhcyBhbiBleHByZXNzaW9uLCBhCnNsaWNlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgbmVnYXRpdmUKaW5kZXhlcyBhbHNvIGFwcGxpZXMgdG8gbmVnYXRpdmUgc2xpY2UgcG9zaXRpb25zLgoKU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IOKAnGV4dGVuZGVkIHNsaWNpbmfigJ0gd2l0aCBhIHRoaXJkIOKAnHN0ZXDigJ0KcGFyYW1ldGVyOiAiYVtpOmo6a10iIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KiB3aGVyZSAieAo9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLgoKU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OgoKCkltbXV0YWJsZSBzZXF1ZW5jZXMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpcwpjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLCB0aGVzZQpvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlciwgdGhlCmNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZSBvYmplY3QKY2Fubm90IGNoYW5nZS4pCgpUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOgoKU3RyaW5ncwogICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlIGNvZGUKICAgcG9pbnRzLiBBbGwgdGhlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSAiVSswMDAwIC0gVSsxMEZGRkYiIGNhbiBiZQogICByZXByZXNlbnRlZCBpbiBhIHN0cmluZy4gIFB5dGhvbiBkb2VzbuKAmXQgaGF2ZSBhIGNoYXIgdHlwZTsgaW5zdGVhZCwKICAgZXZlcnkgY29kZSBwb2ludCBpbiB0aGUgc3RyaW5nIGlzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9iamVjdAogICB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gIm9yZCgpIiBjb252ZXJ0cyBhIGNvZGUKICAgcG9pbnQgZnJvbSBpdHMgc3RyaW5nIGZvcm0gdG8gYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiOwogICAiY2hyKCkiIGNvbnZlcnRzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIiB0byB0aGUKICAgY29ycmVzcG9uZGluZyBsZW5ndGggIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkCiAgIHRvIGNvbnZlcnQgYSAic3RyIiB0byAiYnl0ZXMiIHVzaW5nIHRoZSBnaXZlbiB0ZXh0IGVuY29kaW5nLCBhbmQKICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS4KClR1cGxlcwogICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgb2YgdHdvIG9yCiAgIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2YgZXhwcmVzc2lvbnMuICBBCiAgIHR1cGxlIG9mIG9uZSBpdGVtIChhIOKAmHNpbmdsZXRvbuKAmSkgY2FuIGJlIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hCiAgIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnkgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLAogICBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4KICAgZW1wdHkgdHVwbGUgY2FuIGJlIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLgoKQnl0ZXMKICAgQSBieXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIGFycmF5LiAgVGhlIGl0ZW1zIGFyZSA4LWJpdCBieXRlcywKICAgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgPD0geCA8IDI1Ni4gIEJ5dGVzIGxpdGVyYWxzCiAgIChsaWtlICJiJ2FiYyciKSBhbmQgdGhlIGJ1aWx0LWluICJieXRlcygpIiBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZAogICB0byBjcmVhdGUgYnl0ZXMgb2JqZWN0cy4gIEFsc28sIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8KICAgc3RyaW5ncyB2aWEgdGhlICJkZWNvZGUoKSIgbWV0aG9kLgoKCk11dGFibGUgc2VxdWVuY2VzCi0tLS0tLS0tLS0tLS0tLS0tCgpNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlCnN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZgphc3NpZ25tZW50IGFuZCAiZGVsIiAoZGVsZXRlKSBzdGF0ZW1lbnRzLgoKTm90ZToKCiAgVGhlICJjb2xsZWN0aW9ucyIgYW5kICJhcnJheSIgbW9kdWxlIHByb3ZpZGUgYWRkaXRpb25hbCBleGFtcGxlcyBvZgogIG11dGFibGUgc2VxdWVuY2UgdHlwZXMuCgpUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczoKCkxpc3RzCiAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZSBmb3JtZWQKICAgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluIHNxdWFyZQogICBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyBuZWVkZWQgdG8gZm9ybQogICBsaXN0cyBvZiBsZW5ndGggMCBvciAxLikKCkJ5dGUgQXJyYXlzCiAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlCiAgIGJ1aWx0LWluICJieXRlYXJyYXkoKSIgY29uc3RydWN0b3IuICBBc2lkZSBmcm9tIGJlaW5nIG11dGFibGUgKGFuZAogICBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIHNhbWUgaW50ZXJmYWNlCiAgIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSAiYnl0ZXMiIG9iamVjdHMuCgoKU2V0IHR5cGVzCj09PT09PT09PQoKVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGUgb2JqZWN0cy4KQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLCB0aGV5IGNhbiBiZQppdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mCml0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdCBtZW1iZXJzaGlwIHRlc3RpbmcsCnJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmQgY29tcHV0aW5nIG1hdGhlbWF0aWNhbApvcGVyYXRpb25zIHN1Y2ggYXMgaW50ZXJzZWN0aW9uLCB1bmlvbiwgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYwpkaWZmZXJlbmNlLgoKRm9yIHNldCBlbGVtZW50cywgdGhlIHNhbWUgaW1tdXRhYmlsaXR5IHJ1bGVzIGFwcGx5IGFzIGZvciBkaWN0aW9uYXJ5CmtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYwpjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICIxLjAiKSwgb25seQpvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LgoKVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczoKClNldHMKICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCiAgICJzZXQoKSIgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5IHNldmVyYWwKICAgbWV0aG9kcywgc3VjaCBhcyAiYWRkKCkiLgoKRnJvemVuIHNldHMKICAgVGhlc2UgcmVwcmVzZW50IGFuIGltbXV0YWJsZSBzZXQuICBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pbgogICAiZnJvemVuc2V0KCkiIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMgaW1tdXRhYmxlIGFuZAogICAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXIgc2V0LCBvcgogICBhcyBhIGRpY3Rpb25hcnkga2V5LgoKCk1hcHBpbmdzCj09PT09PT09CgpUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleApzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uICJhW2tdIiBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkgImsiCmZyb20gdGhlIG1hcHBpbmcgImEiOyB0aGlzIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zIGFuZCBhcyB0aGUKdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbgoibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuCgpUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZToKCgpEaWN0aW9uYXJpZXMKLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseSBhcmJpdHJhcnkKdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlIGFzIGtleXMgYXJlIHZhbHVlcwpjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlciBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlCmNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdCBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZwp0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V54oCZcwpoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC4gTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlCm5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsCihlLmcuLCAiMSIgYW5kICIxLjAiKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGluZGV4CnRoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuCgpEaWN0aW9uYXJpZXMgcHJlc2VydmUgaW5zZXJ0aW9uIG9yZGVyLCBtZWFuaW5nIHRoYXQga2V5cyB3aWxsIGJlCnByb2R1Y2VkIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCBzZXF1ZW50aWFsbHkgb3ZlciB0aGUKZGljdGlvbmFyeS4gUmVwbGFjaW5nIGFuIGV4aXN0aW5nIGtleSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9yZGVyLApob3dldmVyIHJlbW92aW5nIGEga2V5IGFuZCByZS1pbnNlcnRpbmcgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZAppbnN0ZWFkIG9mIGtlZXBpbmcgaXRzIG9sZCBwbGFjZS4KCkRpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInt9IiBub3RhdGlvbgooc2VlIHNlY3Rpb24gRGljdGlvbmFyeSBkaXNwbGF5cykuCgpUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgImRibS5uZGJtIiBhbmQgImRibS5nbnUiIHByb3ZpZGUgYWRkaXRpb25hbApleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IERpY3Rpb25hcmllcyBkaWQgbm90IHByZXNlcnZlIGluc2VydGlvbiBvcmRlcgppbiB2ZXJzaW9ucyBvZiBQeXRob24gYmVmb3JlIDMuNi4gSW4gQ1B5dGhvbiAzLjYsIGluc2VydGlvbiBvcmRlciB3YXMKcHJlc2VydmVkLCBidXQgaXQgd2FzIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGF0IHRoYXQgdGltZQpyYXRoZXIgdGhhbiBhIGxhbmd1YWdlIGd1YXJhbnRlZS4KCgpDYWxsYWJsZSB0eXBlcwo9PT09PT09PT09PT09PQoKVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZSBzZWN0aW9uCkNhbGxzKSBjYW4gYmUgYXBwbGllZDoKCgpVc2VyLWRlZmluZWQgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb24gZGVmaW5pdGlvbgooc2VlIHNlY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbnMpLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGFuCmFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIGZ1bmN0aW9u4oCZcwpmb3JtYWwgcGFyYW1ldGVyIGxpc3QuCgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8IGZ1bmN0aW9uLl9fYnVpbHRpbnNfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlICJkaWN0aW9uYXJ5IiB0aGF0IGhvbGRzIHRoZSAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb27igJlzIGJ1aWx0aW5zIG5hbWVzcGFjZS4gIEFkZGVkIGluIHZlcnNpb24gICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLjEwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19nbG9iYWxzX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgImRpY3Rpb25hcnkiIHRoYXQgaG9sZHMgdGhlICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbuKAmXMgZ2xvYmFsIHZhcmlhYmxlcyDigJMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2YgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fY2xvc3VyZV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiIG9yIGEgInR1cGxlIiBvZiBjZWxscyB0aGF0IGNvbnRhaW4gYmluZGluZ3MgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIHRoZSBuYW1lcyBzcGVjaWZpZWQgaW4gdGhlICJjb19mcmVldmFycyIgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbuKAmXMgImNvZGUgb2JqZWN0Ii4gIEEgY2VsbCB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvYmplY3QgaGFzIHRoZSBhdHRyaWJ1dGUgImNlbGxfY29udGVudHMiLiBUaGlzIGNhbiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiZSB1c2VkIHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGNlbGwsIGFzIHdlbGwgYXMgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXQgdGhlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKTW9zdCBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBhc3NpZ25lZCB2YWx1ZToKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgQXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CnwgZnVuY3Rpb24uX19kb2NfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb27igJlzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciAiTm9uZSIgaWYgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBmdW5jdGlvbi5fX25hbWVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvbuKAmXMgbmFtZS4gU2VlIGFsc286ICJfX25hbWVfXyAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlcyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fcXVhbG5hbWVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9u4oCZcyAqcXVhbGlmaWVkIG5hbWUqLiBTZWUgYWxzbzogICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiX19xdWFsbmFtZV9fIGF0dHJpYnV0ZXMiLiAgQWRkZWQgaW4gdmVyc2lvbiAzLjMuICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19tb2R1bGVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZCAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbiwgb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19kZWZhdWx0c19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBICJ0dXBsZSIgY29udGFpbmluZyBkZWZhdWx0ICpwYXJhbWV0ZXIqIHZhbHVlcyAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3IgdGhvc2UgcGFyYW1ldGVycyB0aGF0IGhhdmUgZGVmYXVsdHMsIG9yICJOb25lIiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZiBubyBwYXJhbWV0ZXJzIGhhdmUgYSBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19jb2RlX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21waWxlZCBmdW5jdGlvbiB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBib2R5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19kaWN0X18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IGZ1bmN0aW9uICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVzLiBTZWUgYWxzbzogIl9fZGljdF9fIGF0dHJpYnV0ZXMiLiAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19hbm5vdGF0aW9uc19fICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBICJkaWN0aW9uYXJ5IiBjb250YWluaW5nIGFubm90YXRpb25zIG9mICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqcGFyYW1ldGVycyouIFRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5IGFyZSB0aGUgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXIgbmFtZXMsIGFuZCAiJ3JldHVybiciIGZvciB0aGUgcmV0dXJuICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbm5vdGF0aW9uLCBpZiBwcm92aWRlZC4gU2VlIGFsc286IEFubm90YXRpb25zICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCZXN0IFByYWN0aWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19rd2RlZmF1bHRzX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBICJkaWN0aW9uYXJ5IiBjb250YWluaW5nIGRlZmF1bHRzIGZvciBrZXl3b3JkLSAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvbmx5ICpwYXJhbWV0ZXJzKi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX190eXBlX3BhcmFtc19fICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBICJ0dXBsZSIgY29udGFpbmluZyB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmljIGZ1bmN0aW9uLiAgQWRkZWQgaW4gdmVyc2lvbiAzLjEyLiAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeQphdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGF0dGFjaCBtZXRhZGF0YSB0bwpmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kIHNldCBzdWNoCmF0dHJpYnV0ZXMuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob27igJlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24Kb25seSBzdXBwb3J0cyBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuIEZ1bmN0aW9uCmF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4KCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvbuKAmXMgZGVmaW5pdGlvbiBjYW4gYmUgcmV0cmlldmVkCmZyb20gaXRzIGNvZGUgb2JqZWN0IChhY2Nlc3NpYmxlIHZpYSB0aGUgIl9fY29kZV9fIiBhdHRyaWJ1dGUpLgoKCkluc3RhbmNlIG1ldGhvZHMKLS0tLS0tLS0tLS0tLS0tLQoKQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlIGFuZCBhbnkKY2FsbGFibGUgb2JqZWN0IChub3JtYWxseSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbikuCgpTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBtZXRob2QuX19zZWxmX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlZmVycyB0byB0aGUgY2xhc3MgaW5zdGFuY2Ugb2JqZWN0IHRvIHdoaWNoIHRoZSAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1ldGhvZCBpcyBib3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBtZXRob2QuX19mdW5jX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlZmVycyB0byB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0ICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBtZXRob2QuX19kb2NfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBtZXRob2TigJlzIGRvY3VtZW50YXRpb24gKHNhbWUgYXMgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIm1ldGhvZC5fX2Z1bmNfXy5fX2RvY19fIikuIEEgInN0cmluZyIgaWYgdGhlICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3JpZ2luYWwgZnVuY3Rpb24gaGFkIGEgZG9jc3RyaW5nLCBlbHNlICJOb25lIi4gICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IG1ldGhvZC5fX25hbWVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCAoc2FtZSBhcyAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIm1ldGhvZC5fX2Z1bmNfXy5fX25hbWVfXyIpICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IG1ldGhvZC5fX21vZHVsZV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTWV0aG9kcyBhbHNvIHN1cHBvcnQgYWNjZXNzaW5nIChidXQgbm90IHNldHRpbmcpIHRoZSBhcmJpdHJhcnkKZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuCgpVc2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQgd2hlbiBnZXR0aW5nIGFuIGF0dHJpYnV0ZQpvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgaWYgdGhhdCBhdHRyaWJ1dGUKaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgImNsYXNzbWV0aG9kIiBvYmplY3QuCgpXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1kZWZpbmVkCmZ1bmN0aW9uIG9iamVjdCBmcm9tIGEgY2xhc3MgdmlhIG9uZSBvZiBpdHMgaW5zdGFuY2VzLCBpdHMgIl9fc2VsZl9fIgphdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMgc2FpZCB0byBiZQoqYm91bmQqLiAgVGhlIG5ldyBtZXRob2TigJlzICJfX2Z1bmNfXyIgYXR0cmlidXRlIGlzIHRoZSBvcmlnaW5hbApmdW5jdGlvbiBvYmplY3QuCgpXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEKImNsYXNzbWV0aG9kIiBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCBpdHMgIl9fc2VsZl9fIgphdHRyaWJ1dGUgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGUKZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC4KCldoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uCigiX19mdW5jX18iKSBpcyBjYWxsZWQsIGluc2VydGluZyB0aGUgY2xhc3MgaW5zdGFuY2UgKCJfX3NlbGZfXyIpIGluCmZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCB3aGVuICJDIiBpcyBhIGNsYXNzIHdoaWNoCmNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiAiZigpIiwgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZgoiQyIsIGNhbGxpbmcgInguZigxKSIgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nICJDLmYoeCwgMSkiLgoKV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhICJjbGFzc21ldGhvZCIgb2JqZWN0LAp0aGUg4oCcY2xhc3MgaW5zdGFuY2XigJ0gc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCBhY3R1YWxseSBiZSB0aGUgY2xhc3MKaXRzZWxmLCBzbyB0aGF0IGNhbGxpbmcgZWl0aGVyICJ4LmYoMSkiIG9yICJDLmYoMSkiIGlzIGVxdWl2YWxlbnQgdG8KY2FsbGluZyAiZihDLDEpIiB3aGVyZSAiZiIgaXMgdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24uCgpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgd2hpY2ggYXJlCmF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZCBtZXRob2RzOwp0aGlzICpvbmx5KiBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3MuCgoKR2VuZXJhdG9yIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aGljaCB1c2VzIHRoZSAieWllbGQiIHN0YXRlbWVudCAoc2VlIHNlY3Rpb24gVGhlCnlpZWxkIHN0YXRlbWVudCkgaXMgY2FsbGVkIGEgKmdlbmVyYXRvciBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sCndoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiAqaXRlcmF0b3IqIG9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCB0bwpleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmcgdGhlIGl0ZXJhdG9y4oCZcwoiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdW50aWwKaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbgpleGVjdXRlcyBhICJyZXR1cm4iIHN0YXRlbWVudCBvciBmYWxscyBvZmYgdGhlIGVuZCwgYSAiU3RvcEl0ZXJhdGlvbiIKZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlCnNldCBvZiB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQuCgoKQ29yb3V0aW5lIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGZ1bmN0aW9uIG9yIG1ldGhvZCB3aGljaCBpcyBkZWZpbmVkIHVzaW5nICJhc3luYyBkZWYiIGlzIGNhbGxlZCBhCipjb3JvdXRpbmUgZnVuY3Rpb24qLiAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgcmV0dXJucyBhCipjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCIgZXhwcmVzc2lvbnMsIGFzIHdlbGwgYXMKImFzeW5jIHdpdGgiIGFuZCAiYXN5bmMgZm9yIiBzdGF0ZW1lbnRzLiBTZWUgYWxzbyB0aGUgQ29yb3V0aW5lCk9iamVjdHMgc2VjdGlvbi4KCgpBc3luY2hyb25vdXMgZ2VuZXJhdG9yIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBhbmQgd2hpY2ggdXNlcwp0aGUgInlpZWxkIiBzdGF0ZW1lbnQgaXMgY2FsbGVkIGEgKmFzeW5jaHJvbm91cyBnZW5lcmF0b3IgZnVuY3Rpb24qLgpTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCByZXR1cm5zIGFuICphc3luY2hyb25vdXMgaXRlcmF0b3IqCm9iamVjdCB3aGljaCBjYW4gYmUgdXNlZCBpbiBhbiAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgdG8gZXhlY3V0ZSB0aGUKYm9keSBvZiB0aGUgZnVuY3Rpb24uCgpDYWxsaW5nIHRoZSBhc3luY2hyb25vdXMgaXRlcmF0b3LigJlzICJhaXRlcmF0b3IuX19hbmV4dF9fIiBtZXRob2Qgd2lsbApyZXR1cm4gYW4gKmF3YWl0YWJsZSogd2hpY2ggd2hlbiBhd2FpdGVkIHdpbGwgZXhlY3V0ZSB1bnRpbCBpdApwcm92aWRlcyBhIHZhbHVlIHVzaW5nIHRoZSAieWllbGQiIGV4cHJlc3Npb24uICBXaGVuIHRoZSBmdW5jdGlvbgpleGVjdXRlcyBhbiBlbXB0eSAicmV0dXJuIiBzdGF0ZW1lbnQgb3IgZmFsbHMgb2ZmIHRoZSBlbmQsIGEKIlN0b3BBc3luY0l0ZXJhdGlvbiIgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIGFzeW5jaHJvbm91cyBpdGVyYXRvcgp3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvIGJlIHlpZWxkZWQuCgoKQnVpbHQtaW4gZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLQoKQSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEMgZnVuY3Rpb24uICBFeGFtcGxlcwpvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlICJsZW4oKSIgYW5kICJtYXRoLnNpbigpIiAoIm1hdGgiIGlzIGEKc3RhbmRhcmQgYnVpbHQtaW4gbW9kdWxlKS4gVGhlIG51bWJlciBhbmQgdHlwZSBvZiB0aGUgYXJndW1lbnRzIGFyZQpkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOgoKKiAiX19kb2NfXyIgaXMgdGhlIGZ1bmN0aW9u4oCZcyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmCiAgdW5hdmFpbGFibGUuIFNlZSAiZnVuY3Rpb24uX19kb2NfXyIuCgoqICJfX25hbWVfXyIgaXMgdGhlIGZ1bmN0aW9u4oCZcyBuYW1lLiBTZWUgImZ1bmN0aW9uLl9fbmFtZV9fIi4KCiogIl9fc2VsZl9fIiBpcyBzZXQgdG8gIk5vbmUiIChidXQgc2VlIHRoZSBuZXh0IGl0ZW0pLgoKKiAiX19tb2R1bGVfXyIgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4KICBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGUuIFNlZSAiZnVuY3Rpb24uX19tb2R1bGVfXyIuCgoKQnVpbHQtaW4gbWV0aG9kcwotLS0tLS0tLS0tLS0tLS0tCgpUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzIHRpbWUKY29udGFpbmluZyBhbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBDIGZ1bmN0aW9uIGFzIGFuIGltcGxpY2l0IGV4dHJhCmFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpcyAiYWxpc3QuYXBwZW5kKCkiLAphc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXMgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5CmF0dHJpYnV0ZSAiX19zZWxmX18iIGlzIHNldCB0byB0aGUgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki4gKFRoZQphdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyBpdCBkb2VzIHdpdGggIm90aGVyIGluc3RhbmNlCm1ldGhvZHMiLikKCgpDbGFzc2VzCi0tLS0tLS0KCkNsYXNzZXMgYXJlIGNhbGxhYmxlLiAgVGhlc2Ugb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgZmFjdG9yaWVzIGZvciBuZXcKaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3IgY2xhc3MgdHlwZXMKdGhhdCBvdmVycmlkZSAiX19uZXdfXygpIi4gIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNhbGwgYXJlIHBhc3NlZCB0bwoiX19uZXdfXygpIiBhbmQsIGluIHRoZSB0eXBpY2FsIGNhc2UsIHRvICJfX2luaXRfXygpIiB0byBpbml0aWFsaXplCnRoZSBuZXcgaW5zdGFuY2UuCgoKQ2xhc3MgSW5zdGFuY2VzCi0tLS0tLS0tLS0tLS0tLQoKSW5zdGFuY2VzIG9mIGFyYml0cmFyeSBjbGFzc2VzIGNhbiBiZSBtYWRlIGNhbGxhYmxlIGJ5IGRlZmluaW5nIGEKIl9fY2FsbF9fKCkiIG1ldGhvZCBpbiB0aGVpciBjbGFzcy4KCgpNb2R1bGVzCj09PT09PT0KCk1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZQpjcmVhdGVkIGJ5IHRoZSBpbXBvcnQgc3lzdGVtIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IgpzdGF0ZW1lbnQsIG9yIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiCmFuZCBidWlsdC1pbiAiX19pbXBvcnRfXygpIi4gIEEgbW9kdWxlIG9iamVjdCBoYXMgYSBuYW1lc3BhY2UKaW1wbGVtZW50ZWQgYnkgYSAiZGljdGlvbmFyeSIgb2JqZWN0ICh0aGlzIGlzIHRoZSBkaWN0aW9uYXJ5CnJlZmVyZW5jZWQgYnkgdGhlICJfX2dsb2JhbHNfXyIgYXR0cmlidXRlIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZQptb2R1bGUpLiAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzCmRpY3Rpb25hcnksIGUuZy4sICJtLngiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSIuIEEgbW9kdWxlCm9iamVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZQooc2luY2UgaXQgaXNu4oCZdCBuZWVkZWQgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuCgpBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGXigJlzIG5hbWVzcGFjZSBkaWN0aW9uYXJ5LCBlLmcuLAoibS54ID0gMSIgaXMgZXF1aXZhbGVudCB0byAibS5fX2RpY3RfX1sieCJdID0gMSIuCgoKSW1wb3J0LXJlbGF0ZWQgYXR0cmlidXRlcyBvbiBtb2R1bGUgb2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNb2R1bGUgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyB0aGF0IHJlbGF0ZSB0byB0aGUgaW1wb3J0CnN5c3RlbS4gV2hlbiBhIG1vZHVsZSBpcyBjcmVhdGVkIHVzaW5nIHRoZSBtYWNoaW5lcnkgYXNzb2NpYXRlZCB3aXRoCnRoZSBpbXBvcnQgc3lzdGVtLCB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBmaWxsZWQgaW4gYmFzZWQgb24gdGhlCm1vZHVsZeKAmXMgKnNwZWMqLCBiZWZvcmUgdGhlICpsb2FkZXIqIGV4ZWN1dGVzIGFuZCBsb2FkcyB0aGUgbW9kdWxlLgoKVG8gY3JlYXRlIGEgbW9kdWxlIGR5bmFtaWNhbGx5IHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpbXBvcnQgc3lzdGVtLAppdOKAmXMgcmVjb21tZW5kZWQgdG8gdXNlICJpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKCkiLCB3aGljaAp3aWxsIHNldCB0aGUgdmFyaW91cyBpbXBvcnQtY29udHJvbGxlZCBhdHRyaWJ1dGVzIHRvIGFwcHJvcHJpYXRlCnZhbHVlcy4gSXTigJlzIGFsc28gcG9zc2libGUgdG8gdXNlIHRoZSAidHlwZXMuTW9kdWxlVHlwZSIgY29uc3RydWN0b3IKdG8gY3JlYXRlIG1vZHVsZXMgZGlyZWN0bHksIGJ1dCB0aGlzIHRlY2huaXF1ZSBpcyBtb3JlIGVycm9yLXByb25lLCBhcwptb3N0IGF0dHJpYnV0ZXMgbXVzdCBiZSBtYW51YWxseSBzZXQgb24gdGhlIG1vZHVsZSBvYmplY3QgYWZ0ZXIgaXQgaGFzCmJlZW4gY3JlYXRlZCB3aGVuIHVzaW5nIHRoaXMgYXBwcm9hY2guCgpDYXV0aW9uOgoKICBXaXRoIHRoZSBleGNlcHRpb24gb2YgIl9fbmFtZV9fIiwgaXQgaXMgKipzdHJvbmdseSoqIHJlY29tbWVuZGVkCiAgdGhhdCB5b3UgcmVseSBvbiAiX19zcGVjX18iIGFuZCBpdHMgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIGFueSBvZiB0aGUKICBvdGhlciBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMgbGlzdGVkIGluIHRoaXMgc3Vic2VjdGlvbi4gTm90ZSB0aGF0CiAgdXBkYXRpbmcgYW4gYXR0cmlidXRlIG9uICJfX3NwZWNfXyIgd2lsbCBub3QgdXBkYXRlIHRoZQogIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG9uIHRoZSBtb2R1bGUgaXRzZWxmOgoKICAgICA+Pj4gaW1wb3J0IHR5cGluZwogICAgID4+PiB0eXBpbmcuX19uYW1lX18sIHR5cGluZy5fX3NwZWNfXy5uYW1lCiAgICAgKCd0eXBpbmcnLCAndHlwaW5nJykKICAgICA+Pj4gdHlwaW5nLl9fc3BlY19fLm5hbWUgPSAnc3BlbGxpbmcnCiAgICAgPj4+IHR5cGluZy5fX25hbWVfXywgdHlwaW5nLl9fc3BlY19fLm5hbWUKICAgICAoJ3R5cGluZycsICdzcGVsbGluZycpCiAgICAgPj4+IHR5cGluZy5fX25hbWVfXyA9ICdrZXlib2FyZF9zbWFzaGluZycKICAgICA+Pj4gdHlwaW5nLl9fbmFtZV9fLCB0eXBpbmcuX19zcGVjX18ubmFtZQogICAgICgna2V5Ym9hcmRfc21hc2hpbmcnLCAnc3BlbGxpbmcnKQoKbW9kdWxlLl9fbmFtZV9fCgogICBUaGUgbmFtZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBtb2R1bGUgaW4gdGhlIGltcG9ydCBzeXN0ZW0uCiAgIEZvciBhIGRpcmVjdGx5IGV4ZWN1dGVkIG1vZHVsZSwgdGhpcyB3aWxsIGJlIHNldCB0byAiIl9fbWFpbl9fIiIuCgogICBUaGlzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCiAgIG1vZHVsZS4gSXQgaXMgZXhwZWN0ZWQgdG8gbWF0Y2ggdGhlIHZhbHVlIG9mCiAgICJtb2R1bGUuX19zcGVjX18ubmFtZSIuCgptb2R1bGUuX19zcGVjX18KCiAgIEEgcmVjb3JkIG9mIHRoZSBtb2R1bGXigJlzIGltcG9ydC1zeXN0ZW0tcmVsYXRlZCBzdGF0ZS4KCiAgIFNldCB0byB0aGUgIm1vZHVsZSBzcGVjIiB0aGF0IHdhcyB1c2VkIHdoZW4gaW1wb3J0aW5nIHRoZSBtb2R1bGUuCiAgIFNlZSBNb2R1bGUgc3BlY3MgZm9yIG1vcmUgZGV0YWlscy4KCiAgIEFkZGVkIGluIHZlcnNpb24gMy40LgoKbW9kdWxlLl9fcGFja2FnZV9fCgogICBUaGUgKnBhY2thZ2UqIGEgbW9kdWxlIGJlbG9uZ3MgdG8uCgogICBJZiB0aGUgbW9kdWxlIGlzIHRvcC1sZXZlbCAodGhhdCBpcywgbm90IGEgcGFydCBvZiBhbnkgc3BlY2lmaWMKICAgcGFja2FnZSkgdGhlbiB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gIicnIiAodGhlIGVtcHR5CiAgIHN0cmluZykuIE90aGVyd2lzZSwgaXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgbW9kdWxl4oCZcwogICBwYWNrYWdlICh3aGljaCBjYW4gYmUgZXF1YWwgdG8gIm1vZHVsZS5fX25hbWVfXyIgaWYgdGhlIG1vZHVsZQogICBpdHNlbGYgaXMgYSBwYWNrYWdlKS4gU2VlICoqUEVQIDM2NioqIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQgb2YgIl9fbmFtZV9fIiB0byBjYWxjdWxhdGUgZXhwbGljaXQKICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLiBJdCBkZWZhdWx0cyB0byAiTm9uZSIgZm9yCiAgIG1vZHVsZXMgY3JlYXRlZCBkeW5hbWljYWxseSB1c2luZyB0aGUgInR5cGVzLk1vZHVsZVR5cGUiCiAgIGNvbnN0cnVjdG9yOyB1c2UgImltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoKSIgaW5zdGVhZCB0bwogICBlbnN1cmUgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdG8gYSAic3RyIi4KCiAgIEl0IGlzICoqc3Ryb25nbHkqKiByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgIm1vZHVsZS5fX3NwZWNfXy5wYXJlbnQiIGluc3RlYWQgb2YgIm1vZHVsZS5fX3BhY2thZ2VfXyIuCiAgICJfX3BhY2thZ2VfXyIgaXMgbm93IG9ubHkgdXNlZCBhcyBhIGZhbGxiYWNrIGlmICJfX3NwZWNfXy5wYXJlbnQiCiAgIGlzIG5vdCBzZXQsIGFuZCB0aGlzIGZhbGxiYWNrIHBhdGggaXMgZGVwcmVjYXRlZC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoaXMgYXR0cmlidXRlIG5vdyBkZWZhdWx0cyB0byAiTm9uZSIgZm9yCiAgIG1vZHVsZXMgY3JlYXRlZCBkeW5hbWljYWxseSB1c2luZyB0aGUgInR5cGVzLk1vZHVsZVR5cGUiCiAgIGNvbnN0cnVjdG9yLiBQcmV2aW91c2x5IHRoZSBhdHRyaWJ1dGUgd2FzIG9wdGlvbmFsLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogVGhlIHZhbHVlIG9mICJfX3BhY2thZ2VfXyIgaXMgZXhwZWN0ZWQgdG8KICAgYmUgdGhlIHNhbWUgYXMgIl9fc3BlY19fLnBhcmVudCIuICJfX3BhY2thZ2VfXyIgaXMgbm93IG9ubHkgdXNlZCBhcwogICBhIGZhbGxiYWNrIGR1cmluZyBpbXBvcnQgcmVzb2x1dGlvbiBpZiAiX19zcGVjX18ucGFyZW50IiBpcyBub3QKICAgZGVmaW5lZC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjEwOiAiSW1wb3J0V2FybmluZyIgaXMgcmFpc2VkIGlmIGFuIGltcG9ydAogICByZXNvbHV0aW9uIGZhbGxzIGJhY2sgdG8gIl9fcGFja2FnZV9fIiBpbnN0ZWFkIG9mCiAgICJfX3NwZWNfXy5wYXJlbnQiLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTI6IFJhaXNlICJEZXByZWNhdGlvbldhcm5pbmciIGluc3RlYWQgb2YKICAgIkltcG9ydFdhcm5pbmciIHdoZW4gZmFsbGluZyBiYWNrIHRvICJfX3BhY2thZ2VfXyIgZHVyaW5nIGltcG9ydAogICByZXNvbHV0aW9uLgoKICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMTMsIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuMTU6CiAgICJfX3BhY2thZ2VfXyIgd2lsbCBjZWFzZSB0byBiZSBzZXQgb3IgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGJ5CiAgIHRoZSBpbXBvcnQgc3lzdGVtIG9yIHN0YW5kYXJkIGxpYnJhcnkuCgptb2R1bGUuX19sb2FkZXJfXwoKICAgVGhlICpsb2FkZXIqIG9iamVjdCB0aGF0IHRoZSBpbXBvcnQgbWFjaGluZXJ5IHVzZWQgdG8gbG9hZCB0aGUKICAgbW9kdWxlLgoKICAgVGhpcyBhdHRyaWJ1dGUgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW50cm9zcGVjdGlvbiwgYnV0IGNhbiBiZSB1c2VkCiAgIGZvciBhZGRpdGlvbmFsIGxvYWRlci1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5LCBmb3IgZXhhbXBsZSBnZXR0aW5nCiAgIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbG9hZGVyLgoKICAgIl9fbG9hZGVyX18iIGRlZmF1bHRzIHRvICJOb25lIiBmb3IgbW9kdWxlcyBjcmVhdGVkIGR5bmFtaWNhbGx5CiAgIHVzaW5nIHRoZSAidHlwZXMuTW9kdWxlVHlwZSIgY29uc3RydWN0b3I7IHVzZQogICAiaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYygpIiBpbnN0ZWFkIHRvIGVuc3VyZSB0aGUgYXR0cmlidXRlCiAgIGlzIHNldCB0byBhICpsb2FkZXIqIG9iamVjdC4KCiAgIEl0IGlzICoqc3Ryb25nbHkqKiByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgIm1vZHVsZS5fX3NwZWNfXy5sb2FkZXIiIGluc3RlYWQgb2YgIm1vZHVsZS5fX2xvYWRlcl9fIi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoaXMgYXR0cmlidXRlIG5vdyBkZWZhdWx0cyB0byAiTm9uZSIgZm9yCiAgIG1vZHVsZXMgY3JlYXRlZCBkeW5hbWljYWxseSB1c2luZyB0aGUgInR5cGVzLk1vZHVsZVR5cGUiCiAgIGNvbnN0cnVjdG9yLiBQcmV2aW91c2x5IHRoZSBhdHRyaWJ1dGUgd2FzIG9wdGlvbmFsLgoKICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMTIsIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuMTY6CiAgIFNldHRpbmcgIl9fbG9hZGVyX18iIG9uIGEgbW9kdWxlIHdoaWxlIGZhaWxpbmcgdG8gc2V0CiAgICJfX3NwZWNfXy5sb2FkZXIiIGlzIGRlcHJlY2F0ZWQuIEluIFB5dGhvbiAzLjE2LCAiX19sb2FkZXJfXyIgd2lsbAogICBjZWFzZSB0byBiZSBzZXQgb3IgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGJ5IHRoZSBpbXBvcnQgc3lzdGVtIG9yCiAgIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LgoKbW9kdWxlLl9fcGF0aF9fCgogICBBIChwb3NzaWJseSBlbXB0eSkgKnNlcXVlbmNlKiBvZiBzdHJpbmdzIGVudW1lcmF0aW5nIHRoZSBsb2NhdGlvbnMKICAgd2hlcmUgdGhlIHBhY2thZ2XigJlzIHN1Ym1vZHVsZXMgd2lsbCBiZSBmb3VuZC4gTm9uLXBhY2thZ2UgbW9kdWxlcwogICBzaG91bGQgbm90IGhhdmUgYSAiX19wYXRoX18iIGF0dHJpYnV0ZS4gU2VlIF9fcGF0aF9fIGF0dHJpYnV0ZXMgb24KICAgbW9kdWxlcyBmb3IgbW9yZSBkZXRhaWxzLgoKICAgSXQgaXMgKipzdHJvbmdseSoqIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAibW9kdWxlLl9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zIiBpbnN0ZWFkIG9mCiAgICJtb2R1bGUuX19wYXRoX18iLgoKbW9kdWxlLl9fZmlsZV9fCgptb2R1bGUuX19jYWNoZWRfXwoKICAgIl9fZmlsZV9fIiBhbmQgIl9fY2FjaGVkX18iIGFyZSBib3RoIG9wdGlvbmFsIGF0dHJpYnV0ZXMgdGhhdCBtYXkKICAgb3IgbWF5IG5vdCBiZSBzZXQuIEJvdGggYXR0cmlidXRlcyBzaG91bGQgYmUgYSAic3RyIiB3aGVuIHRoZXkgYXJlCiAgIGF2YWlsYWJsZS4KCiAgICJfX2ZpbGVfXyIgaW5kaWNhdGVzIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBtb2R1bGUKICAgd2FzIGxvYWRlZCAoaWYgbG9hZGVkIGZyb20gYSBmaWxlKSwgb3IgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQKICAgbGlicmFyeSBmaWxlIGZvciBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZAogICBsaWJyYXJ5LiBJdCBtaWdodCBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMKICAgQyBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyLCBhbmQgdGhlCiAgIGltcG9ydCBzeXN0ZW0gbWF5IG9wdCB0byBsZWF2ZSBpdCB1bnNldCBpZiBpdCBoYXMgbm8gc2VtYW50aWMKICAgbWVhbmluZyAoZm9yIGV4YW1wbGUsIGEgbW9kdWxlIGxvYWRlZCBmcm9tIGEgZGF0YWJhc2UpLgoKICAgSWYgIl9fZmlsZV9fIiBpcyBzZXQgdGhlbiB0aGUgIl9fY2FjaGVkX18iIGF0dHJpYnV0ZSBtaWdodCBhbHNvIGJlCiAgIHNldCwgIHdoaWNoIGlzIHRoZSBwYXRoIHRvIGFueSBjb21waWxlZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIChmb3IKICAgZXhhbXBsZSwgYSBieXRlLWNvbXBpbGVkIGZpbGUpLiBUaGUgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGV4aXN0IHRvCiAgIHNldCB0aGlzIGF0dHJpYnV0ZTsgdGhlIHBhdGggY2FuIHNpbXBseSBwb2ludCB0byB3aGVyZSB0aGUgY29tcGlsZWQKICAgZmlsZSAqd291bGQqIGV4aXN0IChzZWUgKipQRVAgMzE0NyoqKS4KCiAgIE5vdGUgdGhhdCAiX19jYWNoZWRfXyIgbWF5IGJlIHNldCBldmVuIGlmICJfX2ZpbGVfXyIgaXMgbm90IHNldC4KICAgSG93ZXZlciwgdGhhdCBzY2VuYXJpbyBpcyBxdWl0ZSBhdHlwaWNhbC4gIFVsdGltYXRlbHksIHRoZSAqbG9hZGVyKgogICBpcyB3aGF0IG1ha2VzIHVzZSBvZiB0aGUgbW9kdWxlIHNwZWMgcHJvdmlkZWQgYnkgdGhlICpmaW5kZXIqIChmcm9tCiAgIHdoaWNoICJfX2ZpbGVfXyIgYW5kICJfX2NhY2hlZF9fIiBhcmUgZGVyaXZlZCkuICBTbyBpZiBhIGxvYWRlciBjYW4KICAgbG9hZCBmcm9tIGEgY2FjaGVkIG1vZHVsZSBidXQgb3RoZXJ3aXNlIGRvZXMgbm90IGxvYWQgZnJvbSBhIGZpbGUsCiAgIHRoYXQgYXR5cGljYWwgc2NlbmFyaW8gbWF5IGJlIGFwcHJvcHJpYXRlLgoKICAgSXQgaXMgKipzdHJvbmdseSoqIHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAibW9kdWxlLl9fc3BlY19fLmNhY2hlZCIgaW5zdGVhZCBvZiAibW9kdWxlLl9fY2FjaGVkX18iLgoKICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDMuMTMsIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuMTU6CiAgIFNldHRpbmcgIl9fY2FjaGVkX18iIG9uIGEgbW9kdWxlIHdoaWxlIGZhaWxpbmcgdG8gc2V0CiAgICJfX3NwZWNfXy5jYWNoZWQiIGlzIGRlcHJlY2F0ZWQuIEluIFB5dGhvbiAzLjE1LCAiX19jYWNoZWRfXyIgd2lsbAogICBjZWFzZSB0byBiZSBzZXQgb3IgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGJ5IHRoZSBpbXBvcnQgc3lzdGVtIG9yCiAgIHN0YW5kYXJkIGxpYnJhcnkuCgoKT3RoZXIgd3JpdGFibGUgYXR0cmlidXRlcyBvbiBtb2R1bGUgb2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBcyB3ZWxsIGFzIHRoZSBpbXBvcnQtcmVsYXRlZCBhdHRyaWJ1dGVzIGxpc3RlZCBhYm92ZSwgbW9kdWxlIG9iamVjdHMKYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgd3JpdGFibGUgYXR0cmlidXRlczoKCm1vZHVsZS5fX2RvY19fCgogICBUaGUgbW9kdWxl4oCZcyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiBTZWUKICAgYWxzbzogIl9fZG9jX18gYXR0cmlidXRlcyIuCgptb2R1bGUuX19hbm5vdGF0aW9uc19fCgogICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyAqdmFyaWFibGUgYW5ub3RhdGlvbnMqIGNvbGxlY3RlZCBkdXJpbmcKICAgbW9kdWxlIGJvZHkgZXhlY3V0aW9uLiAgRm9yIGJlc3QgcHJhY3RpY2VzIG9uIHdvcmtpbmcgd2l0aAogICAiX19hbm5vdGF0aW9uc19fIiwgcGxlYXNlIHNlZSBBbm5vdGF0aW9ucyBCZXN0IFByYWN0aWNlcy4KCgpNb2R1bGUgZGljdGlvbmFyaWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0KCk1vZHVsZSBvYmplY3RzIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZToKCm1vZHVsZS5fX2RpY3RfXwoKICAgVGhlIG1vZHVsZeKAmXMgbmFtZXNwYWNlIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuIFVuaXF1ZWx5IGFtb25nIHRoZQogICBhdHRyaWJ1dGVzIGxpc3RlZCBoZXJlLCAiX19kaWN0X18iIGNhbm5vdCBiZSBhY2Nlc3NlZCBhcyBhIGdsb2JhbAogICB2YXJpYWJsZSBmcm9tIHdpdGhpbiBhIG1vZHVsZTsgaXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYXMgYW4KICAgYXR0cmlidXRlIG9uIG1vZHVsZSBvYmplY3RzLgoKICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBCZWNhdXNlIG9mIHRoZSB3YXkgQ1B5dGhvbgogICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZAogICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzCiAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCB0aGUKICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS4KCgpDdXN0b20gY2xhc3Nlcwo9PT09PT09PT09PT09PQoKQ3VzdG9tIGNsYXNzIHR5cGVzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucyAoc2VlCnNlY3Rpb24gQ2xhc3MgZGVmaW5pdGlvbnMpLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnkgYQpkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8KbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJDLngiIGlzIHRyYW5zbGF0ZWQgdG8KIkMuX19kaWN0X19bIngiXSIgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvdwpmb3Igb3RoZXIgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzCm5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlIGNsYXNzZXMuClRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIKd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2Yg4oCYZGlhbW9uZOKAmSBpbmhlcml0YW5jZQpzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8KYSBjb21tb24gYW5jZXN0b3IuIEFkZGl0aW9uYWwgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbgpiZSBmb3VuZCBhdCBUaGUgUHl0aG9uIDIuMyBNZXRob2QgUmVzb2x1dGlvbiBPcmRlci4KCldoZW4gYSBjbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlIChmb3IgY2xhc3MgIkMiLCBzYXkpIHdvdWxkIHlpZWxkIGEKY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0Cndob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzICJDIi4gV2hlbiBpdCB3b3VsZCB5aWVsZCBhCiJzdGF0aWNtZXRob2QiIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgYnkKdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgZm9yCmFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcyBtYXkgZGlmZmVyIGZyb20KdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyAiX19kaWN0X18iLgoKQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3PigJlzIGRpY3Rpb25hcnksIG5ldmVyIHRoZQpkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy4KCkEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZQooc2VlIGJlbG93KS4KCgpTcGVjaWFsIGF0dHJpYnV0ZXMKLS0tLS0tLS0tLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8IHR5cGUuX19uYW1lX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGNsYXNz4oCZcyBuYW1lLiBTZWUgYWxzbzogIl9fbmFtZV9fIGF0dHJpYnV0ZXMiLiB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgdHlwZS5fX3F1YWxuYW1lX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgY2xhc3PigJlzICpxdWFsaWZpZWQgbmFtZSouIFNlZSBhbHNvOiAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJfX3F1YWxuYW1lX18gYXR0cmlidXRlcyIuICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fbW9kdWxlX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fZGljdF9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgIm1hcHBpbmcgcHJveHkiIHByb3ZpZGluZyBhIHJlYWQtb25seSB2aWV3IG9mICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjbGFzc+KAmXMgbmFtZXNwYWNlLiBTZWUgYWxzbzogIl9fZGljdF9fICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlcyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHR5cGUuX19iYXNlc19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSAidHVwbGUiIGNvbnRhaW5pbmcgdGhlIGNsYXNz4oCZcyBiYXNlcy4gSW4gbW9zdCAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYXNlcywgZm9yIGEgY2xhc3MgZGVmaW5lZCBhcyAiY2xhc3MgWChBLCBCLCBDKSIsICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiWC5fX2Jhc2VzX18iIHdpbGwgYmUgZXhhY3RseSBlcXVhbCB0byAiKEEsIEIsICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDKSIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgdHlwZS5fX2Jhc2VfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBzaW5nbGUgYmFzZSB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjbGFzcyBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gdGhhdCBpcyByZXNwb25zaWJsZSB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3IgdGhlIG1lbW9yeSBsYXlvdXQgb2YgaW5zdGFuY2VzLiBUaGlzIGF0dHJpYnV0ZSB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb3JyZXNwb25kcyB0byAidHBfYmFzZSIgYXQgdGhlIEMgbGV2ZWwuICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgdHlwZS5fX2RvY19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgY2xhc3PigJlzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZC4gTm90IGluaGVyaXRlZCBieSBzdWJjbGFzc2VzLiAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fYW5ub3RhdGlvbnNfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgZGljdGlvbmFyeSBjb250YWluaW5nICp2YXJpYWJsZSBhbm5vdGF0aW9ucyogICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbGxlY3RlZCBkdXJpbmcgY2xhc3MgYm9keSBleGVjdXRpb24uIEZvciBiZXN0ICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHByYWN0aWNlcyBvbiB3b3JraW5nIHdpdGggIl9fYW5ub3RhdGlvbnNfXyIsICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsZWFzZSBzZWUgQW5ub3RhdGlvbnMgQmVzdCBQcmFjdGljZXMuICBDYXV0aW9uOiAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFjY2Vzc2luZyB0aGUgIl9fYW5ub3RhdGlvbnNfXyIgYXR0cmlidXRlIG9mIGEgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzIG9iamVjdCBkaXJlY3RseSBtYXkgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluIHRoZSBwcmVzZW5jZSBvZiBtZXRhY2xhc3Nlcy4gSW4gYWRkaXRpb24sIHRoZSAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZSBtYXkgbm90IGV4aXN0IGZvciBzb21lIGNsYXNzZXMuIFVzZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJpbnNwZWN0LmdldF9hbm5vdGF0aW9ucygpIiB0byByZXRyaWV2ZSBjbGFzcyAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFubm90YXRpb25zIHNhZmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fdHlwZV9wYXJhbXNfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyaWMgY2xhc3MuICBBZGRlZCBpbiB2ZXJzaW9uIDMuMTIuICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fc3RhdGljX2F0dHJpYnV0ZXNfXyAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIG5hbWVzIG9mIGF0dHJpYnV0ZXMgb2YgdGhpcyAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzIHdoaWNoIGFyZSBhc3NpZ25lZCB0aHJvdWdoICJzZWxmLlgiIGZyb20gYW55IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIGluIGl0cyBib2R5LiAgQWRkZWQgaW4gdmVyc2lvbiAzLjEzLiAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0eXBlLl9fZmlyc3RsaW5lbm9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgY2xhc3MgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRlZmluaXRpb24sIGluY2x1ZGluZyBkZWNvcmF0b3JzLiBTZXR0aW5nIHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJfX21vZHVsZV9fIiBhdHRyaWJ1dGUgcmVtb3ZlcyB0aGUgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJfX2ZpcnN0bGluZW5vX18iIGl0ZW0gZnJvbSB0aGUgdHlwZeKAmXMgZGljdGlvbmFyeS4gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkZWQgaW4gdmVyc2lvbiAzLjEzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHR5cGUuX19tcm9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlICJ0dXBsZSIgb2YgY2xhc3NlcyB0aGF0IGFyZSBjb25zaWRlcmVkIHdoZW4gICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi4gfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKClNwZWNpYWwgbWV0aG9kcwotLS0tLS0tLS0tLS0tLS0KCkluIGFkZGl0aW9uIHRvIHRoZSBzcGVjaWFsIGF0dHJpYnV0ZXMgZGVzY3JpYmVkIGFib3ZlLCBhbGwgUHl0aG9uCmNsYXNzZXMgYWxzbyBoYXZlIHRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXZhaWxhYmxlOgoKdHlwZS5tcm8oKQoKICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplIHRoZQogICBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBmb3IgaXRzIGluc3RhbmNlcy4gIEl0IGlzIGNhbGxlZCBhdCBjbGFzcwogICBpbnN0YW50aWF0aW9uLCBhbmQgaXRzIHJlc3VsdCBpcyBzdG9yZWQgaW4gIl9fbXJvX18iLgoKdHlwZS5fX3N1YmNsYXNzZXNfXygpCgogICBFYWNoIGNsYXNzIGtlZXBzIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzIGltbWVkaWF0ZQogICBzdWJjbGFzc2VzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgcmVmZXJlbmNlcwogICBzdGlsbCBhbGl2ZS4gVGhlIGxpc3QgaXMgaW4gZGVmaW5pdGlvbiBvcmRlci4gRXhhbXBsZToKCiAgICAgID4+PiBjbGFzcyBBOiBwYXNzCiAgICAgID4+PiBjbGFzcyBCKEEpOiBwYXNzCiAgICAgID4+PiBBLl9fc3ViY2xhc3Nlc19fKCkKICAgICAgWzxjbGFzcyAnQic+XQoKCkNsYXNzIGluc3RhbmNlcwo9PT09PT09PT09PT09PT0KCkEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgYWJvdmUpLiAgQQpjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoIGlzCnRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuICBXaGVuIGFuCmF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2XigJlzIGNsYXNzIGhhcyBhbgphdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzcwphdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhIHVzZXItZGVmaW5lZApmdW5jdGlvbiBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdAp3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UuICBTdGF0aWMgbWV0aG9kIGFuZCBjbGFzcwptZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyB0cmFuc2Zvcm1lZDsgc2VlIGFib3ZlIHVuZGVyIOKAnENsYXNzZXPigJ0uICBTZWUKc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgZm9yIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMKb2YgYSBjbGFzcyByZXRyaWV2ZWQgdmlhIGl0cyBpbnN0YW5jZXMgbWF5IGRpZmZlciBmcm9tIHRoZSBvYmplY3RzCmFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3PigJlzICJfX2RpY3RfXyIuICBJZiBubyBjbGFzcyBhdHRyaWJ1dGUgaXMKZm91bmQsIGFuZCB0aGUgb2JqZWN04oCZcyBjbGFzcyBoYXMgYSAiX19nZXRhdHRyX18oKSIgbWV0aG9kLCB0aGF0IGlzCmNhbGxlZCB0byBzYXRpc2Z5IHRoZSBsb29rdXAuCgpBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNl4oCZcyBkaWN0aW9uYXJ5LApuZXZlciBhIGNsYXNz4oCZcyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhICJfX3NldGF0dHJfXygpIiBvcgoiX19kZWxhdHRyX18oKSIgbWV0aG9kLCB0aGlzIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHVwZGF0aW5nIHRoZQppbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LgoKQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgbWFwcGluZ3MgaWYKdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvbiBTcGVjaWFsCm1ldGhvZCBuYW1lcy4KCgpTcGVjaWFsIGF0dHJpYnV0ZXMKLS0tLS0tLS0tLS0tLS0tLS0tCgpvYmplY3QuX19jbGFzc19fCgogICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLgoKb2JqZWN0Ll9fZGljdF9fCgogICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3TigJlzCiAgICh3cml0YWJsZSkgYXR0cmlidXRlcy4gTm90IGFsbCBpbnN0YW5jZXMgaGF2ZSBhICJfX2RpY3RfXyIKICAgYXR0cmlidXRlOyBzZWUgdGhlIHNlY3Rpb24gb24gX19zbG90c19fIGZvciBtb3JlIGRldGFpbHMuCgoKSS9PIG9iamVjdHMgKGFsc28ga25vd24gYXMgZmlsZSBvYmplY3RzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmUKYXZhaWxhYmxlIHRvIGNyZWF0ZSBmaWxlIG9iamVjdHM6IHRoZSAib3BlbigpIiBidWlsdC1pbiBmdW5jdGlvbiwgYW5kCmFsc28gIm9zLnBvcGVuKCkiLCAib3MuZmRvcGVuKCkiLCBhbmQgdGhlICJtYWtlZmlsZSgpIiBtZXRob2Qgb2YKc29ja2V0IG9iamVjdHMgKGFuZCBwZXJoYXBzIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBtZXRob2RzIHByb3ZpZGVkIGJ5CmV4dGVuc2lvbiBtb2R1bGVzKS4KCkZpbGUgb2JqZWN0cyBpbXBsZW1lbnQgY29tbW9uIG1ldGhvZHMsIGxpc3RlZCBiZWxvdywgdG8gc2ltcGxpZnkgdXNhZ2UKaW4gZ2VuZXJpYyBjb2RlLiBUaGV5IGFyZSBleHBlY3RlZCB0byBiZSBXaXRoIFN0YXRlbWVudCBDb250ZXh0Ck1hbmFnZXJzLgoKVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZSBpbml0aWFsaXplZAp0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJwcmV0ZXLigJlzIHN0YW5kYXJkIGlucHV0LApvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXM7IHRoZXkgYXJlIGFsbCBvcGVuIGluIHRleHQgbW9kZSBhbmQgdGhlcmVmb3JlCmZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy4KCmZpbGUucmVhZChzaXplPS0xLCAvKQoKICAgUmV0cmlldmUgdXAgdG8gKnNpemUqIGRhdGEgZnJvbSB0aGUgZmlsZS4gQXMgYSBjb252ZW5pZW5jZSBpZgogICAqc2l6ZSogaXMgdW5zcGVjaWZpZWQgb3IgLTEgcmV0cmlldmUgYWxsIGRhdGEgYXZhaWxhYmxlLgoKZmlsZS53cml0ZShkYXRhLCAvKQoKICAgU3RvcmUgKmRhdGEqIHRvIHRoZSBmaWxlLgoKZmlsZS5jbG9zZSgpCgogICBGbHVzaCBhbnkgYnVmZmVycyBhbmQgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmlsZS4KCgpJbnRlcm5hbCB0eXBlcwo9PT09PT09PT09PT09PQoKQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byB0aGUKdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUKaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLgoKCkNvZGUgb2JqZWN0cwotLS0tLS0tLS0tLS0KCkNvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsIG9yCipieXRlY29kZSouIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb2RlIG9iamVjdCBhbmQgYSBmdW5jdGlvbiBvYmplY3QKaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0IHJlZmVyZW5jZSB0byB0aGUKZnVuY3Rpb27igJlzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUKb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZQpzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgbm90IGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5CnJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdCBydW4tdGltZSkuICBVbmxpa2UgZnVuY3Rpb24gb2JqZWN0cywKY29kZSBvYmplY3RzIGFyZSBpbW11dGFibGUgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IKaW5kaXJlY3RseSkgdG8gbXV0YWJsZSBvYmplY3RzLgoKClNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMKfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvbiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3F1YWxuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSAgQWRkZWQgaW4gICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZlcnNpb24gMy4xMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2FyZ2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSB0b3RhbCBudW1iZXIgb2YgcG9zaXRpb25hbCAqcGFyYW1ldGVycyogICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgYW5kICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcykgdGhhdCB0aGUgZnVuY3Rpb24gIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3Bvc29ubHlhcmdjb3VudCAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5ICpwYXJhbWV0ZXJzKiAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpIHRoYXQgdGhlIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2t3b25seWFyZ2NvdW50ICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2Yga2V5d29yZC1vbmx5ICpwYXJhbWV0ZXJzKiAoaW5jbHVkaW5nIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzKSB0aGF0IHRoZSBmdW5jdGlvbiAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25sb2NhbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgcGFyYW1ldGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3Zhcm5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWwgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhcmlhYmxlcyBpbiB0aGUgZnVuY3Rpb24gKHN0YXJ0aW5nIHdpdGggdGhlICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlciBuYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NlbGx2YXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBsb2NhbCB2YXJpYWJsZXMgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBhdCBsZWFzdCBvbmUgKm5lc3RlZCAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNjb3BlKiBpbnNpZGUgdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZyZWV2YXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiAqZnJlZSAoY2xvc3VyZSkgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhcmlhYmxlcyogdGhhdCBhICpuZXN0ZWQgc2NvcGUqIHJlZmVyZW5jZXMgaW4gYW4gIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG91dGVyIHNjb3BlLiBTZWUgYWxzbyAiZnVuY3Rpb24uX19jbG9zdXJlX18iLiAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGU6IHJlZmVyZW5jZXMgdG8gZ2xvYmFsIGFuZCBidWlsdGluIG5hbWVzIGFyZSAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICpub3QqIGluY2x1ZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2YgKmJ5dGVjb2RlKiAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluc3RydWN0aW9ucyBpbiB0aGUgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NvbnN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICpieXRlY29kZSogaW4gdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICpieXRlY29kZSogaW4gdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbXBpbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZpcnN0bGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZnVuY3Rpb24gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2xub3RhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20gKmJ5dGVjb2RlKiAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldHMgdG8gbGluZSBudW1iZXJzLiBGb3IgZGV0YWlscywgc2VlIHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvdXJjZSBjb2RlIG9mIHRoZSBpbnRlcnByZXRlci4gIERlcHJlY2F0ZWQgc2luY2UgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZlcnNpb24gMy4xMjogVGhpcyBhdHRyaWJ1dGUgb2YgY29kZSBvYmplY3RzIGlzICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRlcHJlY2F0ZWQsIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy4xNS4gICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSByZXF1aXJlZCBzdGFjayBzaXplIG9mIHRoZSBjb2RlIG9iamVjdCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFuICJpbnRlZ2VyIiBlbmNvZGluZyBhIG51bWJlciBvZiBmbGFncyBmb3IgdGhlICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludGVycHJldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKClRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciAiY29fZmxhZ3MiOiBiaXQgIjB4MDQiIGlzIHNldAppZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIiphcmd1bWVudHMiIHN5bnRheCB0byBhY2NlcHQgYW4gYXJiaXRyYXJ5Cm51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMKdGhlICIqKmtleXdvcmRzIiBzeW50YXggdG8gYWNjZXB0IGFyYml0cmFyeSBrZXl3b3JkIGFyZ3VtZW50czsgYml0CiIweDIwIiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLiBTZWUgQ29kZSBPYmplY3RzIEJpdApGbGFncyBmb3IgZGV0YWlscyBvbiB0aGUgc2VtYW50aWNzIG9mIGVhY2ggZmxhZ3MgdGhhdCBtaWdodCBiZQpwcmVzZW50LgoKRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zIChmb3IgZXhhbXBsZSwgImZyb20gX19mdXR1cmVfXyBpbXBvcnQKZGl2aXNpb24iKSBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUKb2JqZWN0IHdhcyBjb21waWxlZCB3aXRoIGEgcGFydGljdWxhciBmZWF0dXJlIGVuYWJsZWQuIFNlZQoiY29tcGlsZXJfZmxhZyIuCgpPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCgpJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW4gImNvX2NvbnN0cyIKaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3IgIk5vbmUiIGlmIHVuZGVmaW5lZC4KCgpNZXRob2RzIG9uIGNvZGUgb2JqZWN0cwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKY29kZW9iamVjdC5jb19wb3NpdGlvbnMoKQoKICAgUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBzb3VyY2UgY29kZSBwb3NpdGlvbnMgb2YgZWFjaAogICAqYnl0ZWNvZGUqIGluc3RydWN0aW9uIGluIHRoZSBjb2RlIG9iamVjdC4KCiAgIFRoZSBpdGVyYXRvciByZXR1cm5zICJ0dXBsZSJzIGNvbnRhaW5pbmcgdGhlICIoc3RhcnRfbGluZSwKICAgZW5kX2xpbmUsIHN0YXJ0X2NvbHVtbiwgZW5kX2NvbHVtbikiLiBUaGUgKmktdGgqIHR1cGxlIGNvcnJlc3BvbmRzCiAgIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCBjb21waWxlZCB0byB0aGUgKmktdGgqIGNvZGUKICAgdW5pdC4gQ29sdW1uIGluZm9ybWF0aW9uIGlzIDAtaW5kZXhlZCB1dGYtOCBieXRlIG9mZnNldHMgb24gdGhlCiAgIGdpdmVuIHNvdXJjZSBsaW5lLgoKICAgVGhpcyBwb3NpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBiZSBtaXNzaW5nLiBBIG5vbi1leGhhdXN0aXZlIGxpc3RzCiAgIG9mIGNhc2VzIHdoZXJlIHRoaXMgbWF5IGhhcHBlbjoKCiAgICogUnVubmluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCAiLVgiICJub19kZWJ1Z19yYW5nZXMiLgoKICAgKiBMb2FkaW5nIGEgcHljIGZpbGUgY29tcGlsZWQgd2hpbGUgdXNpbmcgIi1YIiAibm9fZGVidWdfcmFuZ2VzIi4KCiAgICogUG9zaXRpb24gdHVwbGVzIGNvcnJlc3BvbmRpbmcgdG8gYXJ0aWZpY2lhbCBpbnN0cnVjdGlvbnMuCgogICAqIExpbmUgYW5kIGNvbHVtbiBudW1iZXJzIHRoYXQgY2Fu4oCZdCBiZSByZXByZXNlbnRlZCBkdWUgdG8KICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBsaW1pdGF0aW9ucy4KCiAgIFdoZW4gdGhpcyBvY2N1cnMsIHNvbWUgb3IgYWxsIG9mIHRoZSB0dXBsZSBlbGVtZW50cyBjYW4gYmUgIk5vbmUiLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjExLgoKICAgTm90ZToKCiAgICAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHN0b3JpbmcgY29sdW1uIHBvc2l0aW9ucyBpbiBjb2RlIG9iamVjdHMKICAgICB3aGljaCBtYXkgcmVzdWx0IGluIGEgc21hbGwgaW5jcmVhc2Ugb2YgZGlzayB1c2FnZSBvZiBjb21waWxlZAogICAgIFB5dGhvbiBmaWxlcyBvciBpbnRlcnByZXRlciBtZW1vcnkgdXNhZ2UuIFRvIGF2b2lkIHN0b3JpbmcgdGhlCiAgICAgZXh0cmEgaW5mb3JtYXRpb24gYW5kL29yIGRlYWN0aXZhdGUgcHJpbnRpbmcgdGhlIGV4dHJhIHRyYWNlYmFjawogICAgIGluZm9ybWF0aW9uLCB0aGUgIi1YIiAibm9fZGVidWdfcmFuZ2VzIiBjb21tYW5kIGxpbmUgZmxhZyBvciB0aGUKICAgICAiUFlUSE9OTk9ERUJVR1JBTkdFUyIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQuCgpjb2Rlb2JqZWN0LmNvX2xpbmVzKCkKCiAgIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCB5aWVsZHMgaW5mb3JtYXRpb24gYWJvdXQgc3VjY2Vzc2l2ZSByYW5nZXMKICAgb2YgKmJ5dGVjb2RlKnMuIEVhY2ggaXRlbSB5aWVsZGVkIGlzIGEgIihzdGFydCwgZW5kLCBsaW5lbm8pIgogICAidHVwbGUiOgoKICAgKiAic3RhcnQiIChhbiAiaW50IikgcmVwcmVzZW50cyB0aGUgb2Zmc2V0IChpbmNsdXNpdmUpIG9mIHRoZSBzdGFydAogICAgIG9mIHRoZSAqYnl0ZWNvZGUqIHJhbmdlCgogICAqICJlbmQiIChhbiAiaW50IikgcmVwcmVzZW50cyB0aGUgb2Zmc2V0IChleGNsdXNpdmUpIG9mIHRoZSBlbmQgb2YKICAgICB0aGUgKmJ5dGVjb2RlKiByYW5nZQoKICAgKiAibGluZW5vIiBpcyBhbiAiaW50IiByZXByZXNlbnRpbmcgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQogICAgICpieXRlY29kZSogcmFuZ2UsIG9yICJOb25lIiBpZiB0aGUgYnl0ZWNvZGVzIGluIHRoZSBnaXZlbiByYW5nZQogICAgIGhhdmUgbm8gbGluZSBudW1iZXIKCiAgIFRoZSBpdGVtcyB5aWVsZGVkIHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CgogICAqIFRoZSBmaXJzdCByYW5nZSB5aWVsZGVkIHdpbGwgaGF2ZSBhICJzdGFydCIgb2YgMC4KCiAgICogVGhlICIoc3RhcnQsIGVuZCkiIHJhbmdlcyB3aWxsIGJlIG5vbi1kZWNyZWFzaW5nIGFuZCBjb25zZWN1dGl2ZS4KICAgICBUaGF0IGlzLCBmb3IgYW55IHBhaXIgb2YgInR1cGxlInMsIHRoZSAic3RhcnQiIG9mIHRoZSBzZWNvbmQgd2lsbAogICAgIGJlIGVxdWFsIHRvIHRoZSAiZW5kIiBvZiB0aGUgZmlyc3QuCgogICAqIE5vIHJhbmdlIHdpbGwgYmUgYmFja3dhcmRzOiAiZW5kID49IHN0YXJ0IiBmb3IgYWxsIHRyaXBsZXMuCgogICAqIFRoZSBsYXN0ICJ0dXBsZSIgeWllbGRlZCB3aWxsIGhhdmUgImVuZCIgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlCiAgICAgKmJ5dGVjb2RlKi4KCiAgIFplcm8td2lkdGggcmFuZ2VzLCB3aGVyZSAic3RhcnQgPT0gZW5kIiwgYXJlIGFsbG93ZWQuIFplcm8td2lkdGgKICAgcmFuZ2VzIGFyZSB1c2VkIGZvciBsaW5lcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgY29kZSwgYnV0CiAgIGhhdmUgYmVlbiBlbGltaW5hdGVkIGJ5IHRoZSAqYnl0ZWNvZGUqIGNvbXBpbGVyLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjEwLgoKICAgU2VlIGFsc286CgogICAgICoqUEVQIDYyNioqIC0gUHJlY2lzZSBsaW5lIG51bWJlcnMgZm9yIGRlYnVnZ2luZyBhbmQgb3RoZXIgdG9vbHMuCiAgICAgICAgVGhlIFBFUCB0aGF0IGludHJvZHVjZWQgdGhlICJjb19saW5lcygpIiBtZXRob2QuCgpjb2Rlb2JqZWN0LnJlcGxhY2UoKiprd2FyZ3MpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBjb2RlIG9iamVjdCB3aXRoIG5ldyB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQKICAgZmllbGRzLgoKICAgQ29kZSBvYmplY3RzIGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGUgZ2VuZXJpYyBmdW5jdGlvbgogICAiY29weS5yZXBsYWNlKCkiLgoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjguCgoKRnJhbWUgb2JqZWN0cwotLS0tLS0tLS0tLS0tCgpGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW4gdHJhY2ViYWNrCm9iamVjdHMsIGFuZCBhcmUgYWxzbyBwYXNzZWQgdG8gcmVnaXN0ZXJlZCB0cmFjZSBmdW5jdGlvbnMuCgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9pbnRzIHRvIHRoZSBwcmV2aW91cyBzdGFjayBmcmFtZSAodG93YXJkcyB0aGUgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2FsbGVyKSwgb3IgIk5vbmUiIGlmIHRoaXMgaXMgdGhlIGJvdHRvbSBzdGFjayAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXMgZnJhbWUuICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWNjZXNzaW5nIHRoaXMgYXR0cmlidXRlIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIm9iamVjdC5fX2dldGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIgYW5kICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIiJmX2NvZGUiIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbG9jYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIG1hcHBpbmcgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBsb2NhbCAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaWFibGVzLiBJZiB0aGUgZnJhbWUgcmVmZXJzIHRvIGFuICpvcHRpbWl6ZWQgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2NvcGUqLCB0aGlzIG1heSByZXR1cm4gYSB3cml0ZS10aHJvdWdoIHByb3h5ICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2JqZWN0LiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTM6IFJldHVybiBhIHByb3h5ICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIG9wdGltaXplZCBzY29wZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfZ2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBnbG9iYWwgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfYnVpbHRpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBidWlsdC0gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW4gKGludHJpbnNpYykgbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbGFzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIOKAnHByZWNpc2UgaW5zdHJ1Y3Rpb27igJ0gb2YgdGhlIGZyYW1lIG9iamVjdCAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlICpieXRlY29kZSogc3RyaW5nIG9mICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb2RlIG9iamVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXMKfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSWYgbm90ICJOb25lIiwgdGhpcyBpcyBhIGZ1bmN0aW9uIGNhbGxlZCBmb3IgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaW91cyBldmVudHMgZHVyaW5nIGNvZGUgZXhlY3V0aW9uICh0aGlzIGlzIHVzZWQgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYnkgZGVidWdnZXJzKS4gTm9ybWFsbHkgYW4gZXZlbnQgaXMgdHJpZ2dlcmVkIGZvciAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWFjaCBuZXcgc291cmNlIGxpbmUgKHNlZSAiZl90cmFjZV9saW5lcyIpLiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2VfbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IHRoaXMgYXR0cmlidXRlIHRvICJGYWxzZSIgdG8gZGlzYWJsZSAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJpZ2dlcmluZyBhIHRyYWNpbmcgZXZlbnQgZm9yIGVhY2ggc291cmNlIGxpbmUuICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2Vfb3Bjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IHRoaXMgYXR0cmlidXRlIHRvICJUcnVlIiB0byBhbGxvdyBwZXItb3Bjb2RlICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXZlbnRzIHRvIGJlIHJlcXVlc3RlZC4gTm90ZSB0aGF0IHRoaXMgbWF5IGxlYWQgdG8gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkIGludGVycHJldGVyIGJlaGF2aW91ciBpZiBleGNlcHRpb25zICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmFpc2VkIGJ5IHRoZSB0cmFjZSBmdW5jdGlvbiBlc2NhcGUgdG8gdGhlICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gYmVpbmcgdHJhY2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2YgdGhlIGZyYW1lIOKAkyB3cml0aW5nIHRvICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHMgdG8gdGhlICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZWJ1Z2dlciBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0ICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZyB0byB0aGlzIGF0dHJpYnV0ZS4gICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRnJhbWUgb2JqZWN0IG1ldGhvZHMKfn5+fn5+fn5+fn5+fn5+fn5+fn4KCkZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOgoKZnJhbWUuY2xlYXIoKQoKICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkIGJ5IHRoZQogICBmcmFtZS4gIEFsc28sIGlmIHRoZSBmcmFtZSBiZWxvbmdlZCB0byBhICpnZW5lcmF0b3IqLCB0aGUgZ2VuZXJhdG9yCiAgIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcyBpbnZvbHZpbmcgZnJhbWUKICAgb2JqZWN0cyAoZm9yIGV4YW1wbGUgd2hlbiBjYXRjaGluZyBhbiBleGNlcHRpb24gYW5kIHN0b3JpbmcgaXRzCiAgIHRyYWNlYmFjayBmb3IgbGF0ZXIgdXNlKS4KCiAgICJSdW50aW1lRXJyb3IiIGlzIHJhaXNlZCBpZiB0aGUgZnJhbWUgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBvcgogICBzdXNwZW5kZWQuCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuNC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjEzOiBBdHRlbXB0aW5nIHRvIGNsZWFyIGEgc3VzcGVuZGVkIGZyYW1lCiAgIHJhaXNlcyAiUnVudGltZUVycm9yIiAoYXMgaGFzIGFsd2F5cyBiZWVuIHRoZSBjYXNlIGZvciBleGVjdXRpbmcKICAgZnJhbWVzKS4KCgpUcmFjZWJhY2sgb2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLQoKVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IHRoZSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uIEEKdHJhY2ViYWNrIG9iamVjdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBhbmQKbWF5IGFsc28gYmUgZXhwbGljaXRseSBjcmVhdGVkIGJ5IGNhbGxpbmcgInR5cGVzLlRyYWNlYmFja1R5cGUiLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogVHJhY2ViYWNrIG9iamVjdHMgY2FuIG5vdyBiZSBleHBsaWNpdGx5Cmluc3RhbnRpYXRlZCBmcm9tIFB5dGhvbiBjb2RlLgoKRm9yIGltcGxpY2l0bHkgY3JlYXRlZCB0cmFjZWJhY2tzLCB3aGVuIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbgpoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXQgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrCm9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZiB0aGUgY3VycmVudCB0cmFjZWJhY2suICBXaGVuIGFuCmV4Y2VwdGlvbiBoYW5kbGVyIGlzIGVudGVyZWQsIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUKcHJvZ3JhbS4gKFNlZSBzZWN0aW9uIFRoZSB0cnkgc3RhdGVtZW50LikgSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUKdGhpcmQgaXRlbSBvZiB0aGUgdHVwbGUgcmV0dXJuZWQgYnkgInN5cy5leGNfaW5mbygpIiwgYW5kIGFzIHRoZQoiX190cmFjZWJhY2tfXyIgYXR0cmlidXRlIG9mIHRoZSBjYXVnaHQgZXhjZXB0aW9uLgoKV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBubyBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMKd3JpdHRlbiAobmljZWx5IGZvcm1hdHRlZCkgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsgaWYgdGhlCmludGVycHJldGVyIGlzIGludGVyYWN0aXZlLCBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzCiJzeXMubGFzdF90cmFjZWJhY2siLgoKRm9yIGV4cGxpY2l0bHkgY3JlYXRlZCB0cmFjZWJhY2tzLCBpdCBpcyB1cCB0byB0aGUgY3JlYXRvciBvZiB0aGUKdHJhY2ViYWNrIHRvIGRldGVybWluZSBob3cgdGhlICJ0Yl9uZXh0IiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsaW5rZWQKdG8gZm9ybSBhIGZ1bGwgc3RhY2sgdHJhY2UuCgpTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvaW50cyB0byB0aGUgZXhlY3V0aW9uIGZyYW1lIG9mIHRoZSBjdXJyZW50ICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxldmVsLiAgQWNjZXNzaW5nIHRoaXMgYXR0cmlidXRlIHJhaXNlcyBhbiAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF1ZGl0aW5nIGV2ZW50ICJvYmplY3QuX19nZXRhdHRyX18iIHdpdGggYXJndW1lbnRzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJvYmoiIGFuZCAiInRiX2ZyYW1lIiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfbGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdpdmVzIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfbGFzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEluZGljYXRlcyB0aGUg4oCccHJlY2lzZSBpbnN0cnVjdGlvbuKAnS4gICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIHRyYWNlYmFjayBtYXkgZGlmZmVyIGZyb20KdGhlIGxpbmUgbnVtYmVyIG9mIGl0cyBmcmFtZSBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhCiJ0cnkiIHN0YXRlbWVudCB3aXRoIG5vIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhICJmaW5hbGx5IgpjbGF1c2UuCgp0cmFjZWJhY2sudGJfbmV4dAoKICAgVGhlIHNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiB0aGUKICAgc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQpLCBvcgogICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IFRoaXMgYXR0cmlidXRlIGlzIG5vdyB3cml0YWJsZQoKClNsaWNlIG9iamVjdHMKLS0tLS0tLS0tLS0tLQoKU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAiX19nZXRpdGVtX18oKSIKbWV0aG9kcy4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4gInNsaWNlKCkiIGZ1bmN0aW9uLgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInN0YXJ0IiBpcyB0aGUgbG93ZXIgYm91bmQ7ICJzdG9wIiBpcwp0aGUgdXBwZXIgYm91bmQ7ICJzdGVwIiBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpcyAiTm9uZSIgaWYgb21pdHRlZC4KVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS4KClNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOgoKc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpCgogICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZCBjb21wdXRlcwogICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xpY2UgdGhhdCB0aGUgc2xpY2Ugb2JqZWN0IHdvdWxkIGRlc2NyaWJlIGlmCiAgIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiBpdGVtcy4gIEl0IHJldHVybnMgYSB0dXBsZSBvZgogICB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZSB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqCiAgIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3IKICAgb3V0LW9mLWJvdW5kcyBpbmRpY2VzIGFyZSBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aAogICByZWd1bGFyIHNsaWNlcy4KCgpTdGF0aWMgbWV0aG9kIG9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIG9mCmZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgZGVzY3JpYmVkIGFib3ZlLiBBIHN0YXRpYyBtZXRob2QKb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYW55IG90aGVyIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZAptZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcwpvciBhIGNsYXNzIGluc3RhbmNlLCB0aGUgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkCm9iamVjdCwgd2hpY2ggaXMgbm90IHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYwptZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyBjYWxsYWJsZS4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5CnRoZSBidWlsdC1pbiAic3RhdGljbWV0aG9kKCkiIGNvbnN0cnVjdG9yLgoKCkNsYXNzIG1ldGhvZCBvYmplY3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyCmFyb3VuZCBhbm90aGVyIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgd2F5IGluIHdoaWNoIHRoYXQgb2JqZWN0IGlzCnJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZiBjbGFzcwptZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSwgdW5kZXIg4oCcaW5zdGFuY2UKbWV0aG9kc+KAnS4gQ2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCiJjbGFzc21ldGhvZCgpIiBjb25zdHJ1Y3Rvci4KYawBAABGdW5jdGlvbnMKKioqKioqKioqCgpGdW5jdGlvbiBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlIG9ubHkKb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICJmdW5jKGFyZ3VtZW50LWxpc3QpIi4KClRoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gZnVuY3Rpb25zCmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbAp0aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgdGhlCmRpZmZlcmVudCBvYmplY3QgdHlwZXMuCgpTZWUgRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCnV8MgAATWFwcGluZyBUeXBlcyDigJQgImRpY3QiCioqKioqKioqKioqKioqKioqKioqKioKCkEgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSBvYmplY3RzLgpNYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkCm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0LQppbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLikKCkEgZGljdGlvbmFyeeKAmXMga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyB0aGF0IGFyZQpub3QgKmhhc2hhYmxlKiwgdGhhdCBpcywgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMsIGRpY3Rpb25hcmllcyBvcgpvdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3QKaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiBWYWx1ZXMgdGhhdCBjb21wYXJlIGVxdWFsIChzdWNoIGFzCiIxIiwgIjEuMCIsIGFuZCAiVHJ1ZSIpIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZQpkaWN0aW9uYXJ5IGVudHJ5LgoKY2xhc3MgZGljdCgqKmt3YXJncykKY2xhc3MgZGljdChtYXBwaW5nLCAvLCAqKmt3YXJncykKY2xhc3MgZGljdChpdGVyYWJsZSwgLywgKiprd2FyZ3MpCgogICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWwKICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLgoKICAgRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHNldmVyYWwgbWVhbnM6CgogICAqIFVzZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mICJrZXk6IHZhbHVlIiBwYWlycyB3aXRoaW4gYnJhY2VzOgogICAgICJ7J2phY2snOiA0MDk4LCAnc2pvZXJkJzogNDEyN30iIG9yICJ7NDA5ODogJ2phY2snLCA0MTI3OgogICAgICdzam9lcmQnfSIKCiAgICogVXNlIGEgZGljdCBjb21wcmVoZW5zaW9uOiAie30iLCAie3g6IHggKiogMiBmb3IgeCBpbiByYW5nZSgxMCl9IgoKICAgKiBVc2UgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJkaWN0KCkiLCAiZGljdChbKCdmb28nLCAxMDApLCAoJ2JhcicsCiAgICAgMjAwKV0pIiwgImRpY3QoZm9vPTEwMCwgYmFyPTIwMCkiCgogICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuCiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgZGVmaW5lcyBhICJrZXlzKCkiIG1ldGhvZCwKICAgYSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyAiX19nZXRpdGVtX18oKSIgb24gdGhlIGFyZ3VtZW50CiAgIHdpdGggZWFjaCByZXR1cm5lZCBrZXkgZnJvbSB0aGUgbWV0aG9kLiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbAogICBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYWJsZSogb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZQogICBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoIGV4YWN0bHkgdHdvIGVsZW1lbnRzLiAgVGhlIGZpcnN0CiAgIGVsZW1lbnQgb2YgZWFjaCBpdGVtIGJlY29tZXMgYSBrZXkgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LCBhbmQgdGhlCiAgIHNlY29uZCBlbGVtZW50IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbgogICBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXkgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZQogICBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuCgogICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXIKICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlIHBvc2l0aW9uYWwKICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tCiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsCiAgIGFyZ3VtZW50LgoKICAgRGljdGlvbmFyaWVzIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lICIoa2V5LAogICB2YWx1ZSkiIHBhaXJzIChyZWdhcmRsZXNzIG9mIG9yZGVyaW5nKS4gT3JkZXIgY29tcGFyaXNvbnMgKOKAmDzigJksCiAgIOKAmDw94oCZLCDigJg+PeKAmSwg4oCYPuKAmSkgcmFpc2UgIlR5cGVFcnJvciIuICBUbyBpbGx1c3RyYXRlIGRpY3Rpb25hcnkKICAgY3JlYXRpb24gYW5kIGVxdWFsaXR5LCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFsbCByZXR1cm4gYQogICBkaWN0aW9uYXJ5IGVxdWFsIHRvICJ7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfSI6CgogICAgICA+Pj4gYSA9IGRpY3Qob25lPTEsIHR3bz0yLCB0aHJlZT0zKQogICAgICA+Pj4gYiA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDN9CiAgICAgID4+PiBjID0gZGljdCh6aXAoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sIFsxLCAyLCAzXSkpCiAgICAgID4+PiBkID0gZGljdChbKCd0d28nLCAyKSwgKCdvbmUnLCAxKSwgKCd0aHJlZScsIDMpXSkKICAgICAgPj4+IGUgPSBkaWN0KHsndGhyZWUnOiAzLCAnb25lJzogMSwgJ3R3byc6IDJ9KQogICAgICA+Pj4gZiA9IGRpY3QoeydvbmUnOiAxLCAndGhyZWUnOiAzfSwgdHdvPTIpCiAgICAgID4+PiBhID09IGIgPT0gYyA9PSBkID09IGUgPT0gZgogICAgICBUcnVlCgogICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3IKICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzCiAgIGNhbiBiZSB1c2VkLgoKICAgRGljdGlvbmFyaWVzIHByZXNlcnZlIGluc2VydGlvbiBvcmRlci4gIE5vdGUgdGhhdCB1cGRhdGluZyBhIGtleQogICBkb2VzIG5vdCBhZmZlY3QgdGhlIG9yZGVyLiAgS2V5cyBhZGRlZCBhZnRlciBkZWxldGlvbiBhcmUgaW5zZXJ0ZWQKICAgYXQgdGhlIGVuZC4KCiAgICAgID4+PiBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogMywgImZvdXIiOiA0fQogICAgICA+Pj4gZAogICAgICB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDR9CiAgICAgID4+PiBsaXN0KGQpCiAgICAgIFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ10KICAgICAgPj4+IGxpc3QoZC52YWx1ZXMoKSkKICAgICAgWzEsIDIsIDMsIDRdCiAgICAgID4+PiBkWyJvbmUiXSA9IDQyCiAgICAgID4+PiBkCiAgICAgIHsnb25lJzogNDIsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDR9CiAgICAgID4+PiBkZWwgZFsidHdvIl0KICAgICAgPj4+IGRbInR3byJdID0gTm9uZQogICAgICA+Pj4gZAogICAgICB7J29uZSc6IDQyLCAndGhyZWUnOiAzLCAnZm91cic6IDQsICd0d28nOiBOb25lfQoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogRGljdGlvbmFyeSBvcmRlciBpcyBndWFyYW50ZWVkIHRvIGJlCiAgIGluc2VydGlvbiBvcmRlci4gIFRoaXMgYmVoYXZpb3Igd2FzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZgogICBDUHl0aG9uIGZyb20gMy42LgoKICAgVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25zIHRoYXQgZGljdGlvbmFyaWVzIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUsCiAgIGN1c3RvbSBtYXBwaW5nIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRvbyk6CgogICBsaXN0KGQpCgogICAgICBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUga2V5cyB1c2VkIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi4KCiAgIGxlbihkKQoKICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRpY3Rpb25hcnkgKmQqLgoKICAgZFtrZXldCgogICAgICBSZXR1cm4gdGhlIGl0ZW0gb2YgKmQqIHdpdGgga2V5ICprZXkqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZgogICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC4KCiAgICAgIElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kICJfX21pc3NpbmdfXygpIiBhbmQgKmtleSoKICAgICAgaXMgbm90IHByZXNlbnQsIHRoZSAiZFtrZXldIiBvcGVyYXRpb24gY2FsbHMgdGhhdCBtZXRob2Qgd2l0aAogICAgICB0aGUga2V5ICprZXkqIGFzIGFyZ3VtZW50LiAgVGhlICJkW2tleV0iIG9wZXJhdGlvbiB0aGVuIHJldHVybnMKICAgICAgb3IgcmFpc2VzIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGUKICAgICAgIl9fbWlzc2luZ19fKGtleSkiIGNhbGwuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgbWV0aG9kcyBpbnZva2UKICAgICAgIl9fbWlzc2luZ19fKCkiLiBJZiAiX19taXNzaW5nX18oKSIgaXMgbm90IGRlZmluZWQsICJLZXlFcnJvciIKICAgICAgaXMgcmFpc2VkLiAiX19taXNzaW5nX18oKSIgbXVzdCBiZSBhIG1ldGhvZDsgaXQgY2Fubm90IGJlIGFuCiAgICAgIGluc3RhbmNlIHZhcmlhYmxlOgoKICAgICAgICAgPj4+IGNsYXNzIENvdW50ZXIoZGljdCk6CiAgICAgICAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgIC4uLiAgICAgICAgIHJldHVybiAwCiAgICAgICAgIC4uLgogICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKQogICAgICAgICA+Pj4gY1sncmVkJ10KICAgICAgICAgMAogICAgICAgICA+Pj4gY1sncmVkJ10gKz0gMQogICAgICAgICA+Pj4gY1sncmVkJ10KICAgICAgICAgMQoKICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YKICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiBBIGRpZmZlcmVudCAiX19taXNzaW5nX18oKSIgbWV0aG9kIGlzCiAgICAgIHVzZWQgYnkgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0Ii4KCiAgIGRba2V5XSA9IHZhbHVlCgogICAgICBTZXQgImRba2V5XSIgdG8gKnZhbHVlKi4KCiAgIGRlbCBkW2tleV0KCiAgICAgIFJlbW92ZSAiZFtrZXldIiBmcm9tICpkKi4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWYgKmtleSogaXMgbm90CiAgICAgIGluIHRoZSBtYXAuCgogICBrZXkgaW4gZAoKICAgICAgUmV0dXJuICJUcnVlIiBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlICJGYWxzZSIuCgogICBrZXkgbm90IGluIGQKCiAgICAgIEVxdWl2YWxlbnQgdG8gIm5vdCBrZXkgaW4gZCIuCgogICBpdGVyKGQpCgogICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gIFRoaXMgaXMgYQogICAgICBzaG9ydGN1dCBmb3IgIml0ZXIoZC5rZXlzKCkpIi4KCiAgIGNsZWFyKCkKCiAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgZGljdGlvbmFyeS4KCiAgIGNvcHkoKQoKICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LgoKICAgY2xhc3NtZXRob2QgZnJvbWtleXMoaXRlcmFibGUsIHZhbHVlPU5vbmUsIC8pCgogICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSAqaXRlcmFibGUqIGFuZCB2YWx1ZXMgc2V0CiAgICAgIHRvICp2YWx1ZSouCgogICAgICAiZnJvbWtleXMoKSIgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnkuCiAgICAgICp2YWx1ZSogZGVmYXVsdHMgdG8gIk5vbmUiLiAgQWxsIG9mIHRoZSB2YWx1ZXMgcmVmZXIgdG8ganVzdCBhCiAgICAgIHNpbmdsZSBpbnN0YW5jZSwgc28gaXQgZ2VuZXJhbGx5IGRvZXNu4oCZdCBtYWtlIHNlbnNlIGZvciAqdmFsdWUqCiAgICAgIHRvIGJlIGEgbXV0YWJsZSBvYmplY3Qgc3VjaCBhcyBhbiBlbXB0eSBsaXN0LiAgVG8gZ2V0IGRpc3RpbmN0CiAgICAgIHZhbHVlcywgdXNlIGEgZGljdCBjb21wcmVoZW5zaW9uIGluc3RlYWQuCgogICBnZXQoa2V5LCBkZWZhdWx0PU5vbmUsIC8pCgogICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZQogICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvICJOb25lIiwgc28KICAgICAgdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSAiS2V5RXJyb3IiLgoKICAgaXRlbXMoKQoKICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnnigJlzIGl0ZW1zICgiKGtleSwgdmFsdWUpIgogICAgICBwYWlycykuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuCgogICBrZXlzKCkKCiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ54oCZcyBrZXlzLiAgU2VlIHRoZQogICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy4KCiAgIHBvcChrZXksIC8pCiAgIHBvcChrZXksIGRlZmF1bHQsIC8pCgogICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLAogICAgICBlbHNlIHJldHVybiAqZGVmYXVsdCouICBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuIGFuZCAqa2V5KiBpcwogICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuCgogICBwb3BpdGVtKCkKCiAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGEgIihrZXksIHZhbHVlKSIgcGFpciBmcm9tIHRoZSBkaWN0aW9uYXJ5LgogICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyAobGFzdC1pbiwgZmlyc3Qtb3V0KSBvcmRlci4KCiAgICAgICJwb3BpdGVtKCkiIGlzIHVzZWZ1bCB0byBkZXN0cnVjdGl2ZWx5IGl0ZXJhdGUgb3ZlciBhCiAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgZGljdGlvbmFyeQogICAgICBpcyBlbXB0eSwgY2FsbGluZyAicG9waXRlbSgpIiByYWlzZXMgYSAiS2V5RXJyb3IiLgoKICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogTElGTyBvcmRlciBpcyBub3cgZ3VhcmFudGVlZC4gSW4gcHJpb3IKICAgICAgdmVyc2lvbnMsICJwb3BpdGVtKCkiIHdvdWxkIHJldHVybiBhbiBhcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXIuCgogICByZXZlcnNlZChkKQoKICAgICAgUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiBUaGlzCiAgICAgIGlzIGEgc2hvcnRjdXQgZm9yICJyZXZlcnNlZChkLmtleXMoKSkiLgoKICAgICAgQWRkZWQgaW4gdmVyc2lvbiAzLjguCgogICBzZXRkZWZhdWx0KGtleSwgZGVmYXVsdD1Ob25lLCAvKQoKICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydAogICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgKmRlZmF1bHQqCiAgICAgIGRlZmF1bHRzIHRvICJOb25lIi4KCiAgIHVwZGF0ZSgqKmt3YXJncykKICAgdXBkYXRlKG1hcHBpbmcsIC8sICoqa3dhcmdzKQogICB1cGRhdGUoaXRlcmFibGUsIC8sICoqa3dhcmdzKQoKICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICptYXBwaW5nKiBvcgogICAgICAqaXRlcmFibGUqIGFuZCAqa3dhcmdzKiwgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybgogICAgICAiTm9uZSIuCgogICAgICAidXBkYXRlKCkiIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgb2JqZWN0IHdpdGggYSAia2V5cygpIiBtZXRob2QKICAgICAgKGluIHdoaWNoIGNhc2UgIl9fZ2V0aXRlbV9fKCkiIGlzIGNhbGxlZCB3aXRoIGV2ZXJ5IGtleSByZXR1cm5lZAogICAgICBmcm9tIHRoZSBtZXRob2QpIG9yIGFuIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yCiAgICAgIG90aGVyIGl0ZXJhYmxlcyBvZiBsZW5ndGggdHdvKS4gSWYga2V5d29yZCBhcmd1bWVudHMgYXJlCiAgICAgIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnkgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlCiAgICAgIHBhaXJzOiAiZC51cGRhdGUocmVkPTEsIGJsdWU9MikiLgoKICAgdmFsdWVzKCkKCiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ54oCZcyB2YWx1ZXMuICBTZWUgdGhlCiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLgoKICAgICAgQW4gZXF1YWxpdHkgY29tcGFyaXNvbiBiZXR3ZWVuIG9uZSAiZGljdC52YWx1ZXMoKSIgdmlldyBhbmQKICAgICAgYW5vdGhlciB3aWxsIGFsd2F5cyByZXR1cm4gIkZhbHNlIi4gVGhpcyBhbHNvIGFwcGxpZXMgd2hlbgogICAgICBjb21wYXJpbmcgImRpY3QudmFsdWVzKCkiIHRvIGl0c2VsZjoKCiAgICAgICAgID4+PiBkID0geydhJzogMX0KICAgICAgICAgPj4+IGQudmFsdWVzKCkgPT0gZC52YWx1ZXMoKQogICAgICAgICBGYWxzZQoKICAgZCB8IG90aGVyCgogICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIHRoZSBtZXJnZWQga2V5cyBhbmQgdmFsdWVzIG9mICpkKgogICAgICBhbmQgKm90aGVyKiwgd2hpY2ggbXVzdCBib3RoIGJlIGRpY3Rpb25hcmllcy4gVGhlIHZhbHVlcyBvZgogICAgICAqb3RoZXIqIHRha2UgcHJpb3JpdHkgd2hlbiAqZCogYW5kICpvdGhlciogc2hhcmUga2V5cy4KCiAgICAgIEFkZGVkIGluIHZlcnNpb24gMy45LgoKICAgZCB8PSBvdGhlcgoKICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5ICpkKiB3aXRoIGtleXMgYW5kIHZhbHVlcyBmcm9tICpvdGhlciosCiAgICAgIHdoaWNoIG1heSBiZSBlaXRoZXIgYSAqbWFwcGluZyogb3IgYW4gKml0ZXJhYmxlKiBvZiBrZXkvdmFsdWUKICAgICAgcGFpcnMuIFRoZSB2YWx1ZXMgb2YgKm90aGVyKiB0YWtlIHByaW9yaXR5IHdoZW4gKmQqIGFuZCAqb3RoZXIqCiAgICAgIHNoYXJlIGtleXMuCgogICAgICBBZGRlZCBpbiB2ZXJzaW9uIDMuOS4KCiAgIERpY3Rpb25hcmllcyBhbmQgZGljdGlvbmFyeSB2aWV3cyBhcmUgcmV2ZXJzaWJsZS4KCiAgICAgID4+PiBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogMywgImZvdXIiOiA0fQogICAgICA+Pj4gZAogICAgICB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDR9CiAgICAgID4+PiBsaXN0KHJldmVyc2VkKGQpKQogICAgICBbJ2ZvdXInLCAndGhyZWUnLCAndHdvJywgJ29uZSddCiAgICAgID4+PiBsaXN0KHJldmVyc2VkKGQudmFsdWVzKCkpKQogICAgICBbNCwgMywgMiwgMV0KICAgICAgPj4+IGxpc3QocmV2ZXJzZWQoZC5pdGVtcygpKSkKICAgICAgWygnZm91cicsIDQpLCAoJ3RocmVlJywgMyksICgndHdvJywgMiksICgnb25lJywgMSldCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy44OiBEaWN0aW9uYXJpZXMgYXJlIG5vdyByZXZlcnNpYmxlLgoKU2VlIGFsc286CgogICJ0eXBlcy5NYXBwaW5nUHJveHlUeXBlIiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSByZWFkLW9ubHkgdmlldyBvZiBhCiAgImRpY3QiLgoKCkRpY3Rpb25hcnkgdmlldyBvYmplY3RzCj09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgb2JqZWN0cyByZXR1cm5lZCBieSAiZGljdC5rZXlzKCkiLCAiZGljdC52YWx1ZXMoKSIgYW5kCiJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgdmlldyBvbiB0aGUKZGljdGlvbmFyeeKAmXMgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5IGNoYW5nZXMsCnRoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuCgpEaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSwKYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czoKCmxlbihkaWN0dmlldykKCiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuCgppdGVyKGRpY3R2aWV3KQoKICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXMKICAgdHVwbGVzIG9mICIoa2V5LCB2YWx1ZSkiKSBpbiB0aGUgZGljdGlvbmFyeS4KCiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBpbnNlcnRpb24gb3JkZXIuIFRoaXMgYWxsb3dzCiAgIHRoZSBjcmVhdGlvbiBvZiAiKHZhbHVlLCBrZXkpIiBwYWlycyB1c2luZyAiemlwKCkiOiAicGFpcnMgPQogICB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpIi4gIEFub3RoZXIgd2F5IHRvIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzCiAgICJwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbiBkLml0ZW1zKCldIi4KCiAgIEl0ZXJhdGluZyB2aWV3cyB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeQogICBtYXkgcmFpc2UgYSAiUnVudGltZUVycm9yIiBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcy4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IERpY3Rpb25hcnkgb3JkZXIgaXMgZ3VhcmFudGVlZCB0byBiZQogICBpbnNlcnRpb24gb3JkZXIuCgp4IGluIGRpY3R2aWV3CgogICBSZXR1cm4gIlRydWUiIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ54oCZcyBrZXlzLCB2YWx1ZXMKICAgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhICIoa2V5LCB2YWx1ZSkiCiAgIHR1cGxlKS4KCnJldmVyc2VkKGRpY3R2aWV3KQoKICAgUmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgb2YgdGhlCiAgIGRpY3Rpb25hcnkuIFRoZSB2aWV3IHdpbGwgYmUgaXRlcmF0ZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUKICAgaW5zZXJ0aW9uLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuODogRGljdGlvbmFyeSB2aWV3cyBhcmUgbm93IHJldmVyc2libGUuCgpkaWN0dmlldy5tYXBwaW5nCgogICBSZXR1cm4gYSAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwKICAgZGljdGlvbmFyeSB0byB3aGljaCB0aGUgdmlldyByZWZlcnMuCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuMTAuCgpLZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kICpoYXNoYWJsZSouCkl0ZW1zIHZpZXdzIGFsc28gaGF2ZSBzZXQtbGlrZSBvcGVyYXRpb25zIHNpbmNlIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMKYXJlIHVuaXF1ZSBhbmQgdGhlIGtleXMgYXJlIGhhc2hhYmxlLiBJZiBhbGwgdmFsdWVzIGluIGFuIGl0ZW1zIHZpZXcKYXJlIGhhc2hhYmxlIGFzIHdlbGwsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgY2FuIGludGVyb3BlcmF0ZSB3aXRoIG90aGVyCnNldHMuIChWYWx1ZXMgdmlld3MgYXJlIG5vdCB0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZQpnZW5lcmFsbHkgbm90IHVuaXF1ZS4pICBGb3Igc2V0LWxpa2Ugdmlld3MsIGFsbCBvZiB0aGUgb3BlcmF0aW9ucwpkZWZpbmVkIGZvciB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyAiY29sbGVjdGlvbnMuYWJjLlNldCIgYXJlCmF2YWlsYWJsZSAoZm9yIGV4YW1wbGUsICI9PSIsICI8Iiwgb3IgIl4iKS4gIFdoaWxlIHVzaW5nIHNldApvcGVyYXRvcnMsIHNldC1saWtlIHZpZXdzIGFjY2VwdCBhbnkgaXRlcmFibGUgYXMgdGhlIG90aGVyIG9wZXJhbmQsCnVubGlrZSBzZXRzIHdoaWNoIG9ubHkgYWNjZXB0IHNldHMgYXMgdGhlIGlucHV0LgoKQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6CgogICA+Pj4gZGlzaGVzID0geydlZ2dzJzogMiwgJ3NhdXNhZ2UnOiAxLCAnYmFjb24nOiAxLCAnc3BhbSc6IDUwMH0KICAgPj4+IGtleXMgPSBkaXNoZXMua2V5cygpCiAgID4+PiB2YWx1ZXMgPSBkaXNoZXMudmFsdWVzKCkKCiAgID4+PiAjIGl0ZXJhdGlvbgogICA+Pj4gbiA9IDAKICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOgogICAuLi4gICAgIG4gKz0gdmFsCiAgIC4uLgogICA+Pj4gcHJpbnQobikKICAgNTA0CgogICA+Pj4gIyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIHNhbWUgb3JkZXIgKGluc2VydGlvbiBvcmRlcikKICAgPj4+IGxpc3Qoa2V5cykKICAgWydlZ2dzJywgJ3NhdXNhZ2UnLCAnYmFjb24nLCAnc3BhbSddCiAgID4+PiBsaXN0KHZhbHVlcykKICAgWzIsIDEsIDEsIDUwMF0KCiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXMKICAgPj4+IGRlbCBkaXNoZXNbJ2VnZ3MnXQogICA+Pj4gZGVsIGRpc2hlc1snc2F1c2FnZSddCiAgID4+PiBsaXN0KGtleXMpCiAgIFsnYmFjb24nLCAnc3BhbSddCgogICA+Pj4gIyBzZXQgb3BlcmF0aW9ucwogICA+Pj4ga2V5cyAmIHsnZWdncycsICdiYWNvbicsICdzYWxhZCd9CiAgIHsnYmFjb24nfQogICA+Pj4ga2V5cyBeIHsnc2F1c2FnZScsICdqdWljZSd9ID09IHsnanVpY2UnLCAnc2F1c2FnZScsICdiYWNvbicsICdzcGFtJ30KICAgVHJ1ZQogICA+Pj4ga2V5cyB8IFsnanVpY2UnLCAnanVpY2UnLCAnanVpY2UnXSA9PSB7J2JhY29uJywgJ3NwYW0nLCAnanVpY2UnfQogICBUcnVlCgogICA+Pj4gIyBnZXQgYmFjayBhIHJlYWQtb25seSBwcm94eSBmb3IgdGhlIG9yaWdpbmFsIGRpY3Rpb25hcnkKICAgPj4+IHZhbHVlcy5tYXBwaW5nCiAgIG1hcHBpbmdwcm94eSh7J2JhY29uJzogMSwgJ3NwYW0nOiA1MDB9KQogICA+Pj4gdmFsdWVzLm1hcHBpbmdbJ3NwYW0nXQogICA1MDAKYX8GAABNZXRob2RzCioqKioqKioKCk1ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbi4KVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBidWlsdC1pbiBtZXRob2RzIChzdWNoIGFzICJhcHBlbmQoKSIgb24gbGlzdHMpCmFuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2QuIEJ1aWx0LWluIG1ldGhvZHMgYXJlIGRlc2NyaWJlZCB3aXRoIHRoZQp0eXBlcyB0aGF0IHN1cHBvcnQgdGhlbS4KCklmIHlvdSBhY2Nlc3MgYSBtZXRob2QgKGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhIGNsYXNzIG5hbWVzcGFjZSkKdGhyb3VnaCBhbiBpbnN0YW5jZSwgeW91IGdldCBhIHNwZWNpYWwgb2JqZWN0OiBhICpib3VuZCBtZXRob2QqIChhbHNvCmNhbGxlZCBpbnN0YW5jZSBtZXRob2QpIG9iamVjdC4gV2hlbiBjYWxsZWQsIGl0IHdpbGwgYWRkIHRoZSAic2VsZiIKYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBCb3VuZCBtZXRob2RzIGhhdmUgdHdvIHNwZWNpYWwgcmVhZC0Kb25seSBhdHRyaWJ1dGVzOiAibS5fX3NlbGZfXyIgaXMgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kCm9wZXJhdGVzLCBhbmQgIm0uX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC4KQ2FsbGluZyAibShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIiBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8KY2FsbGluZyAibS5fX2Z1bmNfXyhtLl9fc2VsZl9fLCBhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIi4KCkxpa2UgZnVuY3Rpb24gb2JqZWN0cywgYm91bmQgbWV0aG9kIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeQphdHRyaWJ1dGVzLiAgSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5IHN0b3JlZCBvbgp0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKCJtZXRob2QuX19mdW5jX18iKSwgc2V0dGluZyBtZXRob2QKYXR0cmlidXRlcyBvbiBib3VuZCBtZXRob2RzIGlzIGRpc2FsbG93ZWQuICBBdHRlbXB0aW5nIHRvIHNldCBhbgphdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhbiAiQXR0cmlidXRlRXJyb3IiIGJlaW5nIHJhaXNlZC4gIEluCm9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IG9uIHRoZQp1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdDoKCiAgID4+PiBjbGFzcyBDOgogICAuLi4gICAgIGRlZiBtZXRob2Qoc2VsZik6CiAgIC4uLiAgICAgICAgIHBhc3MKICAgLi4uCiAgID4+PiBjID0gQygpCiAgID4+PiBjLm1ldGhvZC53aG9hbWkgPSAnbXkgbmFtZSBpcyBtZXRob2QnICAjIGNhbid0IHNldCBvbiB0aGUgbWV0aG9kCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICBBdHRyaWJ1dGVFcnJvcjogJ21ldGhvZCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3dob2FtaScKICAgPj4+IGMubWV0aG9kLl9fZnVuY19fLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcKICAgPj4+IGMubWV0aG9kLndob2FtaQogICAnbXkgbmFtZSBpcyBtZXRob2QnCgpTZWUgSW5zdGFuY2UgbWV0aG9kcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KdSQEAABNb2R1bGVzCioqKioqKioKClRoZSBvbmx5IHNwZWNpYWwgb3BlcmF0aW9uIG9uIGEgbW9kdWxlIGlzIGF0dHJpYnV0ZSBhY2Nlc3M6ICJtLm5hbWUiLAp3aGVyZSAqbSogaXMgYSBtb2R1bGUgYW5kICpuYW1lKiBhY2Nlc3NlcyBhIG5hbWUgZGVmaW5lZCBpbiAqbSrigJlzCnN5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGUgdGhhdCB0aGUKImltcG9ydCIgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiBvbiBhIG1vZHVsZQpvYmplY3Q7ICJpbXBvcnQgZm9vIiBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdCBuYW1lZCAqZm9vKiB0bwpleGlzdCwgcmF0aGVyIGl0IHJlcXVpcmVzIGFuIChleHRlcm5hbCkgKmRlZmluaXRpb24qIGZvciBhIG1vZHVsZQpuYW1lZCAqZm9vKiBzb21ld2hlcmUuKQoKQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgIl9fZGljdF9fIi4gVGhpcyBpcyB0aGUKZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGXigJlzIHN5bWJvbCB0YWJsZS4gTW9kaWZ5aW5nIHRoaXMKZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxl4oCZcyBzeW1ib2wgdGFibGUsIGJ1dCBkaXJlY3QKYXNzaWdubWVudCB0byB0aGUgIl9fZGljdF9fIiBhdHRyaWJ1dGUgaXMgbm90IHBvc3NpYmxlICh5b3UgY2FuIHdyaXRlCiJtLl9fZGljdF9fWydhJ10gPSAxIiwgd2hpY2ggZGVmaW5lcyAibS5hIiB0byBiZSAiMSIsIGJ1dCB5b3UgY2Fu4oCZdAp3cml0ZSAibS5fX2RpY3RfXyA9IHt9IikuICBNb2RpZnlpbmcgIl9fZGljdF9fIiBkaXJlY3RseSBpcyBub3QKcmVjb21tZW5kZWQuCgpNb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxtb2R1bGUKJ3N5cycgKGJ1aWx0LWluKT4iLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzCiI8bW9kdWxlICdvcycgZnJvbSAnL3Vzci9sb2NhbC9saWIvcHl0aG9uWC5ZL29zLnB5Yyc+Ii4KdVlXAABTZXF1ZW5jZSBUeXBlcyDigJQgImxpc3QiLCAidHVwbGUiLCAicmFuZ2UiCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGVyZSBhcmUgdGhyZWUgYmFzaWMgc2VxdWVuY2UgdHlwZXM6IGxpc3RzLCB0dXBsZXMsIGFuZCByYW5nZQpvYmplY3RzLiBBZGRpdGlvbmFsIHNlcXVlbmNlIHR5cGVzIHRhaWxvcmVkIGZvciBwcm9jZXNzaW5nIG9mIGJpbmFyeQpkYXRhIGFuZCB0ZXh0IHN0cmluZ3MgYXJlIGRlc2NyaWJlZCBpbiBkZWRpY2F0ZWQgc2VjdGlvbnMuCgoKQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnMKPT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIHN1cHBvcnRlZCBieSBtb3N0IHNlcXVlbmNlCnR5cGVzLCBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZS4gVGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQwppcyBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMKb24gY3VzdG9tIHNlcXVlbmNlIHR5cGVzLgoKVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5LgpJbiB0aGUgdGFibGUsICpzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwgKm4qLCAqaSosCipqKiBhbmQgKmsqIGFyZSBpbnRlZ2VycyBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkKdHlwZSBhbmQgdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqLgoKVGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzIHRoZQpjb21wYXJpc29uIG9wZXJhdGlvbnMuIFRoZSAiKyIgKGNvbmNhdGVuYXRpb24pIGFuZCAiKiIgKHJlcGV0aXRpb24pCm9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUgY29ycmVzcG9uZGluZyBudW1lcmljCm9wZXJhdGlvbnMuIFszXQoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PXwKfCAieCBpbiBzIiAgICAgICAgICAgICAgICAgICB8ICJUcnVlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgIHwgKDEpICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIkZhbHNlIiAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAieCBub3QgaW4gcyIgICAgICAgICAgICAgICB8ICJGYWxzZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgIHwgKDEpICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIlRydWUiICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAicyArIHQiICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb25jYXRlbmF0aW9uIG9mICpzKiBhbmQgKnQqIHwgKDYpKDcpICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJzICogbiIgb3IgIm4gKiBzIiAgICAgICAgIHwgZXF1aXZhbGVudCB0byBhZGRpbmcgKnMqIHRvICAgICAgfCAoMikoNykgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0c2VsZiAqbiogdGltZXMgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJzW2ldIiAgICAgICAgICAgICAgICAgICAgIHwgKmkqdGggaXRlbSBvZiAqcyosIG9yaWdpbiAwICAgICAgfCAoMykoOCkgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgInNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg0KSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAic1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aXRoIHN0ZXAgKmsqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAibGVuKHMpIiAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJtaW4ocykiICAgICAgICAgICAgICAgICAgIHwgc21hbGxlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgIm1heChzKSIgICAgICAgICAgICAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKClNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluIHBhcnRpY3VsYXIsCnR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZwpjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZXZlcnkKZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWUKdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgQ29tcGFyaXNvbnMgaW4KdGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pCgpGb3J3YXJkIGFuZCByZXZlcnNlZCBpdGVyYXRvcnMgb3ZlciBtdXRhYmxlIHNlcXVlbmNlcyBhY2Nlc3MgdmFsdWVzCnVzaW5nIGFuIGluZGV4LiAgVGhhdCBpbmRleCB3aWxsIGNvbnRpbnVlIHRvIG1hcmNoIGZvcndhcmQgKG9yCmJhY2t3YXJkKSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIGlzIG11dGF0ZWQuICBUaGUgaXRlcmF0b3IKdGVybWluYXRlcyBvbmx5IHdoZW4gYW4gIkluZGV4RXJyb3IiIG9yIGEgIlN0b3BJdGVyYXRpb24iIGlzCmVuY291bnRlcmVkIChvciB3aGVuIHRoZSBpbmRleCBkcm9wcyBiZWxvdyB6ZXJvKS4KCk5vdGVzOgoKMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3Igc2ltcGxlCiAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCBzZXF1ZW5jZXMKICAgKHN1Y2ggYXMgInN0ciIsICJieXRlcyIgYW5kICJieXRlYXJyYXkiKSBhbHNvIHVzZSB0aGVtIGZvcgogICBzdWJzZXF1ZW5jZSB0ZXN0aW5nOgoKICAgICAgPj4+ICJnZyIgaW4gImVnZ3MiCiAgICAgIFRydWUKCjIuIFZhbHVlcyBvZiAqbiogbGVzcyB0aGFuICIwIiBhcmUgdHJlYXRlZCBhcyAiMCIgKHdoaWNoIHlpZWxkcyBhbgogICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIHRoYXQgaXRlbXMgaW4gdGhlCiAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSB0aW1lcy4KICAgVGhpcyBvZnRlbiBoYXVudHMgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6CgogICAgICA+Pj4gbGlzdHMgPSBbW11dICogMwogICAgICA+Pj4gbGlzdHMKICAgICAgW1tdLCBbXSwgW11dCiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMykKICAgICAgPj4+IGxpc3RzCiAgICAgIFtbM10sIFszXSwgWzNdXQoKICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCAiW1tdXSIgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmcKICAgYW4gZW1wdHkgbGlzdCwgc28gYWxsIHRocmVlIGVsZW1lbnRzIG9mICJbW11dICogMyIgYXJlIHJlZmVyZW5jZXMKICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mCiAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mCiAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheToKCiAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV0KICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKQogICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpCiAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNykKICAgICAgPj4+IGxpc3RzCiAgICAgIFtbM10sIFs1XSwgWzddXQoKICAgRnVydGhlciBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEZBUSBlbnRyeSBIb3cgZG8gSSBjcmVhdGUgYQogICBtdWx0aWRpbWVuc2lvbmFsIGxpc3Q/LgoKMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YKICAgc2VxdWVuY2UgKnMqOiAibGVuKHMpICsgaSIgb3IgImxlbihzKSArIGoiIGlzIHN1YnN0aXR1dGVkLiAgQnV0CiAgIG5vdGUgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi4KCjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mCiAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuCgogICAqIElmICppKiBpcyBvbWl0dGVkIG9yICJOb25lIiwgdXNlICIwIi4KCiAgICogSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuCgogICAqIElmICppKiBvciAqaiogaXMgbGVzcyB0aGFuICItbGVuKHMpIiwgdXNlICIwIi4KCiAgICogSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZSAibGVuKHMpIi4KCiAgICogSWYgKmkqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAqaiosIHRoZSBzbGljZSBpcyBlbXB0eS4KCjUuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIHdpdGggc3RlcCAqayogaXMgZGVmaW5lZCBhcyB0aGUKICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiA8CiAgIChqLWkpL2siLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSAiaSIsICJpK2siLCAiaSsyKmsiLAogICAiaSszKmsiIGFuZCBzbyBvbiwgc3RvcHBpbmcgd2hlbiAqaiogaXMgcmVhY2hlZCAoYnV0IG5ldmVyCiAgIGluY2x1ZGluZyAqaiopLiAgV2hlbiAqayogaXMgcG9zaXRpdmUsICppKiBhbmQgKmoqIGFyZSByZWR1Y2VkIHRvCiAgICJsZW4ocykiIGlmIHRoZXkgYXJlIGdyZWF0ZXIuIFdoZW4gKmsqIGlzIG5lZ2F0aXZlLCAqaSogYW5kICpqKiBhcmUKICAgcmVkdWNlZCB0byAibGVuKHMpIC0gMSIgaWYgdGhleSBhcmUgZ3JlYXRlci4gIElmICppKiBvciAqaiogYXJlCiAgIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGV5IGJlY29tZSDigJxlbmTigJ0gdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbgogICB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqIGNhbm5vdCBiZSB6ZXJvLiBJZiAqayogaXMgIk5vbmUiLCBpdAogICBpcyB0cmVhdGVkIGxpa2UgIjEiLgoKNi4gQ29uY2F0ZW5hdGluZyBpbW11dGFibGUgc2VxdWVuY2VzIGFsd2F5cyByZXN1bHRzIGluIGEgbmV3IG9iamVjdC4KICAgVGhpcyBtZWFucyB0aGF0IGJ1aWxkaW5nIHVwIGEgc2VxdWVuY2UgYnkgcmVwZWF0ZWQgY29uY2F0ZW5hdGlvbgogICB3aWxsIGhhdmUgYSBxdWFkcmF0aWMgcnVudGltZSBjb3N0IGluIHRoZSB0b3RhbCBzZXF1ZW5jZSBsZW5ndGguCiAgIFRvIGdldCBhIGxpbmVhciBydW50aW1lIGNvc3QsIHlvdSBtdXN0IHN3aXRjaCB0byBvbmUgb2YgdGhlCiAgIGFsdGVybmF0aXZlcyBiZWxvdzoKCiAgICogaWYgY29uY2F0ZW5hdGluZyAic3RyIiBvYmplY3RzLCB5b3UgY2FuIGJ1aWxkIGEgbGlzdCBhbmQgdXNlCiAgICAgInN0ci5qb2luKCkiIGF0IHRoZSBlbmQgb3IgZWxzZSB3cml0ZSB0byBhbiAiaW8uU3RyaW5nSU8iCiAgICAgaW5zdGFuY2UgYW5kIHJldHJpZXZlIGl0cyB2YWx1ZSB3aGVuIGNvbXBsZXRlCgogICAqIGlmIGNvbmNhdGVuYXRpbmcgImJ5dGVzIiBvYmplY3RzLCB5b3UgY2FuIHNpbWlsYXJseSB1c2UKICAgICAiYnl0ZXMuam9pbigpIiBvciAiaW8uQnl0ZXNJTyIsIG9yIHlvdSBjYW4gZG8gaW4tcGxhY2UKICAgICBjb25jYXRlbmF0aW9uIHdpdGggYSAiYnl0ZWFycmF5IiBvYmplY3QuICAiYnl0ZWFycmF5IiBvYmplY3RzIGFyZQogICAgIG11dGFibGUgYW5kIGhhdmUgYW4gZWZmaWNpZW50IG92ZXJhbGxvY2F0aW9uIG1lY2hhbmlzbQoKICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWQKCiAgICogZm9yIG90aGVyIHR5cGVzLCBpbnZlc3RpZ2F0ZSB0aGUgcmVsZXZhbnQgY2xhc3MgZG9jdW1lbnRhdGlvbgoKNy4gU29tZSBzZXF1ZW5jZSB0eXBlcyAoc3VjaCBhcyAicmFuZ2UiKSBvbmx5IHN1cHBvcnQgaXRlbSBzZXF1ZW5jZXMKICAgdGhhdCBmb2xsb3cgc3BlY2lmaWMgcGF0dGVybnMsIGFuZCBoZW5jZSBkb27igJl0IHN1cHBvcnQgc2VxdWVuY2UKICAgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLgoKOC4gQW4gIkluZGV4RXJyb3IiIGlzIHJhaXNlZCBpZiAqaSogaXMgb3V0c2lkZSB0aGUgc2VxdWVuY2UgcmFuZ2UuCgotWyBTZXF1ZW5jZSBNZXRob2RzIF0tCgpTZXF1ZW5jZSB0eXBlcyBhbHNvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKc2VxdWVuY2UuY291bnQodmFsdWUsIC8pCgogICBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAqdmFsdWUqIGluICpzZXF1ZW5jZSouCgpzZXF1ZW5jZS5pbmRleCh2YWx1ZVssIHN0YXJ0Wywgc3RvcF1dKQoKICAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqdmFsdWUqIGluICpzZXF1ZW5jZSouCgogICBSYWlzZXMgIlZhbHVlRXJyb3IiIGlmICp2YWx1ZSogaXMgbm90IGZvdW5kIGluICpzZXF1ZW5jZSouCgogICBUaGUgKnN0YXJ0KiBvciAqc3RvcCogYXJndW1lbnRzIGFsbG93IGZvciBlZmZpY2llbnQgc2VhcmNoaW5nIG9mCiAgIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZSwgYmVnaW5uaW5nIGF0ICpzdGFydCogYW5kIGVuZGluZyBhdAogICAqc3RvcCouIFRoaXMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvICJzdGFydCArCiAgIHNlcXVlbmNlW3N0YXJ0OnN0b3BdLmluZGV4KHZhbHVlKSIsIG9ubHkgd2l0aG91dCBjb3B5aW5nIGFueSBkYXRhLgoKICAgQ2F1dGlvbjoKCiAgICAgTm90IGFsbCBzZXF1ZW5jZSB0eXBlcyBzdXBwb3J0IHBhc3NpbmcgdGhlICpzdGFydCogYW5kICpzdG9wKgogICAgIGFyZ3VtZW50cy4KCgpJbW11dGFibGUgU2VxdWVuY2UgVHlwZXMKPT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgb25seSBvcGVyYXRpb24gdGhhdCBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXMgZ2VuZXJhbGx5IGltcGxlbWVudAp0aGF0IGlzIG5vdCBhbHNvIGltcGxlbWVudGVkIGJ5IG11dGFibGUgc2VxdWVuY2UgdHlwZXMgaXMgc3VwcG9ydCBmb3IKdGhlICJoYXNoKCkiIGJ1aWx0LWluLgoKVGhpcyBzdXBwb3J0IGFsbG93cyBpbW11dGFibGUgc2VxdWVuY2VzLCBzdWNoIGFzICJ0dXBsZSIgaW5zdGFuY2VzLCB0bwpiZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiIGluc3RhbmNlcy4KCkF0dGVtcHRpbmcgdG8gaGFzaCBhbiBpbW11dGFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB1bmhhc2hhYmxlCnZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi4KCgpNdXRhYmxlIFNlcXVlbmNlIFR5cGVzCj09PT09PT09PT09PT09PT09PT09PT0KClRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZQp0eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gbWFrZQppdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZQp0eXBlcy4KCkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnkKaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSB0eXBlIGFuZAp2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAiYnl0ZWFycmF5IiBvbmx5CmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PXwKfCAic1tpXSA9IHgiICAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiZGVsIHNbaV0iICAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGl0ZW0gKmkqIG9mICpzKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAic1tpOmpdIiB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJvbSB0aGUgbGlzdCAoc2FtZSBhcyAic1tpOmpdID0gfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtdIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInMgKz0gdCIgICAgICAgICAgICAgICAgICAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0IHBhcnQgdGhlIHNhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9IHQiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzIGNvbnRlbnRzICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogdGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiBJZiAqayogaXMgbm90IGVxdWFsIHRvICIxIiwgKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlCiAgIHNsaWNlIGl0IGlzIHJlcGxhY2luZy4KCjIuIFRoZSB2YWx1ZSAqbiogaXMgYW4gaW50ZWdlciwgb3IgYW4gb2JqZWN0IGltcGxlbWVudGluZwogICAiX19pbmRleF9fKCkiLiAgWmVybyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9mICpuKiBjbGVhciB0aGUgc2VxdWVuY2UuCiAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZQogICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyIENvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zLgoKLVsgTXV0YWJsZSBTZXF1ZW5jZSBNZXRob2RzIF0tCgpNdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGFsc28gc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CgpzZXF1ZW5jZS5hcHBlbmQodmFsdWUsIC8pCgogICBBcHBlbmQgKnZhbHVlKiB0byB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgIHdyaXRpbmcgInNlcVtsZW4oc2VxKTpsZW4oc2VxKV0gPSBbdmFsdWVdIi4KCnNlcXVlbmNlLmNsZWFyKCkKCiAgIEFkZGVkIGluIHZlcnNpb24gMy4zLgoKICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tICpzZXF1ZW5jZSouIFRoaXMgaXMgZXF1aXZhbGVudCB0byB3cml0aW5nCiAgICJkZWwgc2VxdWVuY2VbOl0iLgoKc2VxdWVuY2UuY29weSgpCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuMy4KCiAgIENyZWF0ZSBhIHNoYWxsb3cgY29weSBvZiAqc2VxdWVuY2UqLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gd3JpdGluZwogICAic2VxdWVuY2VbOl0iLgoKICAgSGludDoKCiAgICAgVGhlICJjb3B5KCkiIG1ldGhvZCBpcyBub3QgcGFydCBvZiB0aGUgIk11dGFibGVTZXF1ZW5jZSIgIkFCQyIsCiAgICAgYnV0IG1vc3QgY29uY3JldGUgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBwcm92aWRlIGl0LgoKc2VxdWVuY2UuZXh0ZW5kKGl0ZXJhYmxlLCAvKQoKICAgRXh0ZW5kICpzZXF1ZW5jZSogd2l0aCB0aGUgY29udGVudHMgb2YgKml0ZXJhYmxlKi4gRm9yIHRoZSBtb3N0CiAgIHBhcnQsIHRoaXMgaXMgdGhlIHNhbWUgYXMgd3JpdGluZyAic2VxW2xlbihzZXEpOmxlbihzZXEpXSA9CiAgIGl0ZXJhYmxlIi4KCnNlcXVlbmNlLmluc2VydChpbmRleCwgdmFsdWUsIC8pCgogICBJbnNlcnQgKnZhbHVlKiBpbnRvICpzZXF1ZW5jZSogYXQgdGhlIGdpdmVuICppbmRleCouIFRoaXMgaXMKICAgZXF1aXZhbGVudCB0byB3cml0aW5nICJzZXF1ZW5jZVtpbmRleDppbmRleF0gPSBbdmFsdWVdIi4KCnNlcXVlbmNlLnBvcChpbmRleD0tMSwgLykKCiAgIFJldHJpZXZlIHRoZSBpdGVtIGF0ICppbmRleCogYW5kIGFsc28gcmVtb3ZlcyBpdCBmcm9tICpzZXF1ZW5jZSouCiAgIEJ5IGRlZmF1bHQsIHRoZSBsYXN0IGl0ZW0gaW4gKnNlcXVlbmNlKiBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC4KCnNlcXVlbmNlLnJlbW92ZSh2YWx1ZSwgLykKCiAgIFJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzZXF1ZW5jZSogd2hlcmUgInNlcXVlbmNlW2ldID09IHZhbHVlIi4KCiAgIFJhaXNlcyAiVmFsdWVFcnJvciIgaWYgKnZhbHVlKiBpcyBub3QgZm91bmQgaW4gKnNlcXVlbmNlKi4KCnNlcXVlbmNlLnJldmVyc2UoKQoKICAgUmV2ZXJzZSB0aGUgaXRlbXMgb2YgKnNlcXVlbmNlKiBpbiBwbGFjZS4gVGhpcyBtZXRob2QgbWFpbnRhaW5zCiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gVG8gcmVtaW5kIHVzZXJzCiAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZS1lZmZlY3QsIGl0IHJldHVybnMgIk5vbmUiLgoKCkxpc3RzCj09PT09CgpMaXN0cyBhcmUgbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mCmhvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsIHZhcnkgYnkKYXBwbGljYXRpb24pLgoKY2xhc3MgbGlzdChpdGVyYWJsZT0oKSwgLykKCiAgIExpc3RzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBzZXZlcmFsIHdheXM6CgogICAqIFVzaW5nIGEgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMgdG8gZGVub3RlIHRoZSBlbXB0eSBsaXN0OiAiW10iCgogICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogIlthXSIsICJbYSwKICAgICBiLCBjXSIKCiAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iCgogICAqIFVzaW5nIHRoZSB0eXBlIGNvbnN0cnVjdG9yOiAibGlzdCgpIiBvciAibGlzdChpdGVyYWJsZSkiCgogICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZQogICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSrigJlzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGEKICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvcgogICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmQKICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICJsaXN0KCdhYmMnKSIKICAgcmV0dXJucyAiWydhJywgJ2InLCAnYyddIiBhbmQgImxpc3QoICgxLCAyLCAzKSApIiByZXR1cm5zICJbMSwgMiwKICAgM10iLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkKICAgbGlzdCwgIltdIi4KCiAgIE1hbnkgb3RoZXIgb3BlcmF0aW9ucyBhbHNvIHByb2R1Y2UgbGlzdHMsIGluY2x1ZGluZyB0aGUgInNvcnRlZCgpIgogICBidWlsdC1pbi4KCiAgIExpc3RzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBhbmQgbXV0YWJsZSBzZXF1ZW5jZSBvcGVyYXRpb25zLgogICBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDoKCiAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpCgogICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgY29tcGFyaXNvbnMKICAgICAgYmV0d2VlbiBpdGVtcy4gRXhjZXB0aW9ucyBhcmUgbm90IHN1cHByZXNzZWQgLSBpZiBhbnkgY29tcGFyaXNvbgogICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgdGhlCiAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuCgogICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnkKICAgICAga2V5d29yZCAoa2V5d29yZC1vbmx5IGFyZ3VtZW50cyk6CgogICAgICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvCiAgICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50IChmb3IgZXhhbXBsZSwKICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAogICAgICBpcyBjYWxjdWxhdGVkIG9uY2UgYW5kIHRoZW4gdXNlZCBmb3IgdGhlIGVudGlyZSBzb3J0aW5nIHByb2Nlc3MuCiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJOb25lIiBtZWFucyB0aGF0IGxpc3QgaXRlbXMgYXJlIHNvcnRlZAogICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLgoKICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGEKICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uCgogICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgbGlzdAogICAgICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLgoKICAgICAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvciBlY29ub215IG9mIHNwYWNlCiAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgb3BlcmF0ZXMKICAgICAgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc29ydGVkIHNlcXVlbmNlICh1c2UKICAgICAgInNvcnRlZCgpIiB0byBleHBsaWNpdGx5IHJlcXVlc3QgYSBuZXcgc29ydGVkIGxpc3QgaW5zdGFuY2UpLgoKICAgICAgVGhlICJzb3J0KCkiIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCBpcwogICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciBvZgogICAgICBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwg4oCUIHRoaXMgaXMgaGVscGZ1bCBmb3Igc29ydGluZyBpbgogICAgICBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsIHRoZW4gYnkgc2FsYXJ5CiAgICAgIGdyYWRlKS4KCiAgICAgIEZvciBzb3J0aW5nIGV4YW1wbGVzIGFuZCBhIGJyaWVmIHNvcnRpbmcgdHV0b3JpYWwsIHNlZSBTb3J0aW5nCiAgICAgIFRlY2huaXF1ZXMuCgogICAgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsCiAgICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXMKICAgICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIG1ha2VzIHRoZSBsaXN0IGFwcGVhcgogICAgICBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzICJWYWx1ZUVycm9yIiBpZiBpdCBjYW4gZGV0ZWN0CiAgICAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LgoKClR1cGxlcwo9PT09PT0KClR1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2YKaGV0ZXJvZ2VuZW91cyBkYXRhIChzdWNoIGFzIHRoZSAyLXR1cGxlcyBwcm9kdWNlZCBieSB0aGUgImVudW1lcmF0ZSgpIgpidWlsdC1pbikuIFR1cGxlcyBhcmUgYWxzbyB1c2VkIGZvciBjYXNlcyB3aGVyZSBhbiBpbW11dGFibGUgc2VxdWVuY2UKb2YgaG9tb2dlbmVvdXMgZGF0YSBpcyBuZWVkZWQgKHN1Y2ggYXMgYWxsb3dpbmcgc3RvcmFnZSBpbiBhICJzZXQiIG9yCiJkaWN0IiBpbnN0YW5jZSkuCgpjbGFzcyB0dXBsZShpdGVyYWJsZT0oKSwgLykKCiAgIFR1cGxlcyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gYSBudW1iZXIgb2Ygd2F5czoKCiAgICogVXNpbmcgYSBwYWlyIG9mIHBhcmVudGhlc2VzIHRvIGRlbm90ZSB0aGUgZW1wdHkgdHVwbGU6ICIoKSIKCiAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgIihhLCkiCgogICAqIFNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJhLCBiLCBjIiBvciAiKGEsIGIsIGMpIgoKICAgKiBVc2luZyB0aGUgInR1cGxlKCkiIGJ1aWx0LWluOiAidHVwbGUoKSIgb3IgInR1cGxlKGl0ZXJhYmxlKSIKCiAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSB0dXBsZSB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZQogICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSrigJlzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGEKICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvcgogICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSB0dXBsZSwgaXQgaXMgcmV0dXJuZWQKICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKCdhYmMnKSIgcmV0dXJucyAiKCdhJywgJ2InLCAnYycpIgogICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgaXMKICAgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IHR1cGxlLCAiKCkiLgoKICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgdGhlCiAgIHBhcmVudGhlc2VzLiBUaGUgcGFyZW50aGVzZXMgYXJlIG9wdGlvbmFsLCBleGNlcHQgaW4gdGhlIGVtcHR5CiAgIHR1cGxlIGNhc2UsIG9yIHdoZW4gdGhleSBhcmUgbmVlZGVkIHRvIGF2b2lkIHN5bnRhY3RpYyBhbWJpZ3VpdHkuCiAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgYXJndW1lbnRzLAogICB3aGlsZSAiZigoYSwgYiwgYykpIiBpcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIDMtdHVwbGUgYXMgdGhlIHNvbGUKICAgYXJndW1lbnQuCgogICBUdXBsZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMuCgpGb3IgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9ucyBvZiBkYXRhIHdoZXJlIGFjY2VzcyBieSBuYW1lIGlzIGNsZWFyZXIKdGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmUKYXBwcm9wcmlhdGUgY2hvaWNlIHRoYW4gYSBzaW1wbGUgdHVwbGUgb2JqZWN0LgoKClJhbmdlcwo9PT09PT0KClRoZSAicmFuZ2UiIHR5cGUgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugb2YgbnVtYmVycyBhbmQgaXMKY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZyBhIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcyBpbiAiZm9yIiBsb29wcy4KCmNsYXNzIHJhbmdlKHN0b3AsIC8pCmNsYXNzIHJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwPTEsIC8pCgogICBUaGUgYXJndW1lbnRzIHRvIHRoZSByYW5nZSBjb25zdHJ1Y3RvciBtdXN0IGJlIGludGVnZXJzIChlaXRoZXIKICAgYnVpbHQtaW4gImludCIgb3IgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlICJfX2luZGV4X18oKSIKICAgc3BlY2lhbCBtZXRob2QpLiAgSWYgdGhlICpzdGVwKiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwogICAiMSIuIElmIHRoZSAqc3RhcnQqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICIwIi4gSWYKICAgKnN0ZXAqIGlzIHplcm8sICJWYWx1ZUVycm9yIiBpcyByYWlzZWQuCgogICBGb3IgYSBwb3NpdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiBhIHJhbmdlICJyIiBhcmUgZGV0ZXJtaW5lZAogICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgInJbaV0gPAogICBzdG9wIi4KCiAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGwKICAgZGV0ZXJtaW5lZCBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiwgYnV0IHRoZQogICBjb25zdHJhaW50cyBhcmUgImkgPj0gMCIgYW5kICJyW2ldID4gc3RvcCIuCgogICBBIHJhbmdlIG9iamVjdCB3aWxsIGJlIGVtcHR5IGlmICJyWzBdIiBkb2VzIG5vdCBtZWV0IHRoZSB2YWx1ZQogICBjb25zdHJhaW50LiBSYW5nZXMgZG8gc3VwcG9ydCBuZWdhdGl2ZSBpbmRpY2VzLCBidXQgdGhlc2UgYXJlCiAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgZGV0ZXJtaW5lZCBieQogICB0aGUgcG9zaXRpdmUgaW5kaWNlcy4KCiAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFyZQogICBwZXJtaXR0ZWQgYnV0IHNvbWUgZmVhdHVyZXMgKHN1Y2ggYXMgImxlbigpIikgbWF5IHJhaXNlCiAgICJPdmVyZmxvd0Vycm9yIi4KCiAgIFJhbmdlIGV4YW1wbGVzOgoKICAgICAgPj4+IGxpc3QocmFuZ2UoMTApKQogICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMTEpKQogICAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdCiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIDMwLCA1KSkKICAgICAgWzAsIDUsIDEwLCAxNSwgMjAsIDI1XQogICAgICA+Pj4gbGlzdChyYW5nZSgwLCAxMCwgMykpCiAgICAgIFswLCAzLCA2LCA5XQogICAgICA+Pj4gbGlzdChyYW5nZSgwLCAtMTAsIC0xKSkKICAgICAgWzAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCwgLTldCiAgICAgID4+PiBsaXN0KHJhbmdlKDApKQogICAgICBbXQogICAgICA+Pj4gbGlzdChyYW5nZSgxLCAwKSkKICAgICAgW10KCiAgIFJhbmdlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tb24gc2VxdWVuY2Ugb3BlcmF0aW9ucyBleGNlcHQKICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2Ugb2JqZWN0cwogICBjYW4gb25seSByZXByZXNlbnQgc2VxdWVuY2VzIHRoYXQgZm9sbG93IGEgc3RyaWN0IHBhdHRlcm4gYW5kCiAgIHJlcGV0aXRpb24gYW5kIGNvbmNhdGVuYXRpb24gd2lsbCB1c3VhbGx5IHZpb2xhdGUgdGhhdCBwYXR0ZXJuKS4KCiAgIHN0YXJ0CgogICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGFydCogcGFyYW1ldGVyIChvciAiMCIgaWYgdGhlIHBhcmFtZXRlciB3YXMKICAgICAgbm90IHN1cHBsaWVkKQoKICAgc3RvcAoKICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RvcCogcGFyYW1ldGVyCgogICBzdGVwCgogICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGVwKiBwYXJhbWV0ZXIgKG9yICIxIiBpZiB0aGUgcGFyYW1ldGVyIHdhcwogICAgICBub3Qgc3VwcGxpZWQpCgpUaGUgYWR2YW50YWdlIG9mIHRoZSAicmFuZ2UiIHR5cGUgb3ZlciBhIHJlZ3VsYXIgImxpc3QiIG9yICJ0dXBsZSIgaXMKdGhhdCBhICJyYW5nZSIgb2JqZWN0IHdpbGwgYWx3YXlzIHRha2UgdGhlIHNhbWUgKHNtYWxsKSBhbW91bnQgb2YKbWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMgKGFzIGl0IG9ubHkKc3RvcmVzIHRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiB2YWx1ZXMsIGNhbGN1bGF0aW5nIGluZGl2aWR1YWwKaXRlbXMgYW5kIHN1YnJhbmdlcyBhcyBuZWVkZWQpLgoKUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kCnByb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBjb250YWlubWVudCB0ZXN0cywgZWxlbWVudCBpbmRleCBsb29rdXAsCnNsaWNpbmcgYW5kIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgKHNlZSBTZXF1ZW5jZSBUeXBlcyDigJQgbGlzdCwKdHVwbGUsIHJhbmdlKToKCj4+PiByID0gcmFuZ2UoMCwgMjAsIDIpCj4+PiByCnJhbmdlKDAsIDIwLCAyKQo+Pj4gMTEgaW4gcgpGYWxzZQo+Pj4gMTAgaW4gcgpUcnVlCj4+PiByLmluZGV4KDEwKQo1Cj4+PiByWzVdCjEwCj4+PiByWzo1XQpyYW5nZSgwLCAxMCwgMikKPj4+IHJbLTFdCjE4CgpUZXN0aW5nIHJhbmdlIG9iamVjdHMgZm9yIGVxdWFsaXR5IHdpdGggIj09IiBhbmQgIiE9IiBjb21wYXJlcyB0aGVtIGFzCnNlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkKcmVwcmVzZW50IHRoZSBzYW1lIHNlcXVlbmNlIG9mIHZhbHVlcy4gIChOb3RlIHRoYXQgdHdvIHJhbmdlIG9iamVjdHMKdGhhdCBjb21wYXJlIGVxdWFsIG1pZ2h0IGhhdmUgZGlmZmVyZW50ICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiCmF0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgInJhbmdlKDAsIDMsCjIpID09IHJhbmdlKDAsIDQsIDIpIi4pCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCBzbGljaW5nCmFuZCBuZWdhdGl2ZSBpbmRpY2VzLiBUZXN0ICJpbnQiIG9iamVjdHMgZm9yIG1lbWJlcnNoaXAgaW4gY29uc3RhbnQKdGltZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpdGVtcy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IERlZmluZSDigJg9PeKAmSBhbmQg4oCYIT3igJkgdG8gY29tcGFyZSByYW5nZSBvYmplY3RzCmJhc2VkIG9uIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhleSBkZWZpbmUgKGluc3RlYWQgb2YgY29tcGFyaW5nCmJhc2VkIG9uIG9iamVjdCBpZGVudGl0eSkuQWRkZWQgdGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiCmF0dHJpYnV0ZXMuCgpTZWUgYWxzbzoKCiAgKiBUaGUgbGluc3BhY2UgcmVjaXBlIHNob3dzIGhvdyB0byBpbXBsZW1lbnQgYSBsYXp5IHZlcnNpb24gb2YgcmFuZ2UKICAgIHN1aXRhYmxlIGZvciBmbG9hdGluZy1wb2ludCBhcHBsaWNhdGlvbnMuCmEcFAAATXV0YWJsZSBTZXF1ZW5jZSBUeXBlcwoqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UKdHlwZXMuIFRoZSAiY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSIgQUJDIGlzIHByb3ZpZGVkIHRvIG1ha2UKaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gc2VxdWVuY2UKdHlwZXMuCgpJbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogaXMgYW55Cml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmQKdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgb25seQphY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAyNTUiKS4KCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHwKfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT18CnwgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImRlbCBzW2ldIiAgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBpdGVtICppKiBvZiAqcyogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgInNbaTpqXSIgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZyb20gdGhlIGxpc3QgKHNhbWUgYXMgInNbaTpqXSA9IHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbXSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzICs9IHQiICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicyAqPSBuIiAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGVzICpzKiB3aXRoIGl0cyBjb250ZW50cyAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qIHRpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCk5vdGVzOgoKMS4gSWYgKmsqIGlzIG5vdCBlcXVhbCB0byAiMSIsICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZQogICBzbGljZSBpdCBpcyByZXBsYWNpbmcuCgoyLiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcKICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLgogICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGUKICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciBDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucy4KCi1bIE11dGFibGUgU2VxdWVuY2UgTWV0aG9kcyBdLQoKTXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBhbHNvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgoKc2VxdWVuY2UuYXBwZW5kKHZhbHVlLCAvKQoKICAgQXBwZW5kICp2YWx1ZSogdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuIFRoaXMgaXMgZXF1aXZhbGVudCB0bwogICB3cml0aW5nICJzZXFbbGVuKHNlcSk6bGVuKHNlcSldID0gW3ZhbHVlXSIuCgpzZXF1ZW5jZS5jbGVhcigpCgogICBBZGRlZCBpbiB2ZXJzaW9uIDMuMy4KCiAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSAqc2VxdWVuY2UqLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gd3JpdGluZwogICAiZGVsIHNlcXVlbmNlWzpdIi4KCnNlcXVlbmNlLmNvcHkoKQoKICAgQWRkZWQgaW4gdmVyc2lvbiAzLjMuCgogICBDcmVhdGUgYSBzaGFsbG93IGNvcHkgb2YgKnNlcXVlbmNlKi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHdyaXRpbmcKICAgInNlcXVlbmNlWzpdIi4KCiAgIEhpbnQ6CgogICAgIFRoZSAiY29weSgpIiBtZXRob2QgaXMgbm90IHBhcnQgb2YgdGhlICJNdXRhYmxlU2VxdWVuY2UiICJBQkMiLAogICAgIGJ1dCBtb3N0IGNvbmNyZXRlIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgcHJvdmlkZSBpdC4KCnNlcXVlbmNlLmV4dGVuZChpdGVyYWJsZSwgLykKCiAgIEV4dGVuZCAqc2VxdWVuY2UqIHdpdGggdGhlIGNvbnRlbnRzIG9mICppdGVyYWJsZSouIEZvciB0aGUgbW9zdAogICBwYXJ0LCB0aGlzIGlzIHRoZSBzYW1lIGFzIHdyaXRpbmcgInNlcVtsZW4oc2VxKTpsZW4oc2VxKV0gPQogICBpdGVyYWJsZSIuCgpzZXF1ZW5jZS5pbnNlcnQoaW5kZXgsIHZhbHVlLCAvKQoKICAgSW5zZXJ0ICp2YWx1ZSogaW50byAqc2VxdWVuY2UqIGF0IHRoZSBnaXZlbiAqaW5kZXgqLiBUaGlzIGlzCiAgIGVxdWl2YWxlbnQgdG8gd3JpdGluZyAic2VxdWVuY2VbaW5kZXg6aW5kZXhdID0gW3ZhbHVlXSIuCgpzZXF1ZW5jZS5wb3AoaW5kZXg9LTEsIC8pCgogICBSZXRyaWV2ZSB0aGUgaXRlbSBhdCAqaW5kZXgqIGFuZCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqc2VxdWVuY2UqLgogICBCeSBkZWZhdWx0LCB0aGUgbGFzdCBpdGVtIGluICpzZXF1ZW5jZSogaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuCgpzZXF1ZW5jZS5yZW1vdmUodmFsdWUsIC8pCgogICBSZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSAqc2VxdWVuY2UqIHdoZXJlICJzZXF1ZW5jZVtpXSA9PSB2YWx1ZSIuCgogICBSYWlzZXMgIlZhbHVlRXJyb3IiIGlmICp2YWx1ZSogaXMgbm90IGZvdW5kIGluICpzZXF1ZW5jZSouCgpzZXF1ZW5jZS5yZXZlcnNlKCkKCiAgIFJldmVyc2UgdGhlIGl0ZW1zIG9mICpzZXF1ZW5jZSogaW4gcGxhY2UuIFRoaXMgbWV0aG9kIG1haW50YWlucwogICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuIFRvIHJlbWluZCB1c2VycwogICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUtZWZmZWN0LCBpdCByZXR1cm5zICJOb25lIi4KYU0DAABVbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpBbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6CgogICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByCgpUaGUgdW5hcnkgIi0iIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpYwphcmd1bWVudDsgdGhlIG9wZXJhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSAiX19uZWdfXygpIiBzcGVjaWFsCm1ldGhvZC4KClRoZSB1bmFyeSAiKyIgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCB1bmNoYW5nZWQ7CnRoZSBvcGVyYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgIl9fcG9zX18oKSIgc3BlY2lhbCBtZXRob2QuCgpUaGUgdW5hcnkgIn4iIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzCmludGVnZXIgYXJndW1lbnQuICBUaGUgYml0d2lzZSBpbnZlcnNpb24gb2YgIngiIGlzIGRlZmluZWQgYXMKIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycyBvciB0byBjdXN0b20gb2JqZWN0cwp0aGF0IG92ZXJyaWRlIHRoZSAiX19pbnZlcnRfXygpIiBzcGVjaWFsIG1ldGhvZC4KCkluIGFsbCB0aHJlZSBjYXNlcywgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciB0eXBlLCBhCiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuCnW8AgAAVGhlICJ3aGlsZSIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKgoKVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuCmV4cHJlc3Npb24gaXMgdHJ1ZToKCiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KClRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZQpmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZQppdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQKYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuCgpBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wCndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNl4oCZcyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQKZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrCnRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uCnULDQAAVGhlICJ3aXRoIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioKClRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aAptZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggU3RhdGVtZW50CkNvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSLigKYiZXhjZXB0IuKApiJmaW5hbGx5IiB1c2FnZQpwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuCgogICB3aXRoX3N0bXQgICAgICAgICAgOjo9ICJ3aXRoIiAoICIoIiB3aXRoX3N0bXRfY29udGVudHMgIiwiPyAiKSIgfCB3aXRoX3N0bXRfY29udGVudHMgKSAiOiIgc3VpdGUKICAgd2l0aF9zdG10X2NvbnRlbnRzIDo6PSB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKgogICB3aXRoX2l0ZW0gICAgICAgICAgOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XQoKVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSDigJxpdGVt4oCdIHByb2NlZWRzIGFzCmZvbGxvd3M6CgoxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpIGlzCiAgIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuCgoyLiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19lbnRlcl9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKMy4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKNC4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC4KCjUuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuCgogICBOb3RlOgoKICAgICBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSIgbWV0aG9kCiAgICAgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZQogICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGUKICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZwogICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDcgYmVsb3cuCgo2LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuCgo3LiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhbgogICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWUKICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC4KICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmQKICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCIKICAgc3RhdGVtZW50LgoKICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZQogICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkcwogICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLgoKVGhlIGZvbGxvd2luZyBjb2RlOgoKICAgd2l0aCBFWFBSRVNTSU9OIGFzIFRBUkdFVDoKICAgICAgIFNVSVRFCgppcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzoKCiAgIG1hbmFnZXIgPSAoRVhQUkVTU0lPTikKICAgZW50ZXIgPSBtYW5hZ2VyLl9fZW50ZXJfXwogICBleGl0ID0gbWFuYWdlci5fX2V4aXRfXwogICB2YWx1ZSA9IGVudGVyKCkKICAgaGl0X2V4Y2VwdCA9IEZhbHNlCgogICB0cnk6CiAgICAgICBUQVJHRVQgPSB2YWx1ZQogICAgICAgU1VJVEUKICAgZXhjZXB0OgogICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKICAgICAgIGlmIG5vdCBleGl0KCpzeXMuZXhjX2luZm8oKSk6CiAgICAgICAgICAgcmFpc2UKICAgZmluYWxseToKICAgICAgIGlmIG5vdCBoaXRfZXhjZXB0OgogICAgICAgICAgIGV4aXQoTm9uZSwgTm9uZSwgTm9uZSkKCmV4Y2VwdCB0aGF0IGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBpcyB1c2VkIGZvciAiX19lbnRlcl9fKCkiCmFuZCAiX19leGl0X18oKSIuCgpXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZgptdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDoKCiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOgogICAgICAgU1VJVEUKCmlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgd2l0aCBBKCkgYXMgYToKICAgICAgIHdpdGggQigpIGFzIGI6CiAgICAgICAgICAgU1VJVEUKCllvdSBjYW4gYWxzbyB3cml0ZSBtdWx0aS1pdGVtIGNvbnRleHQgbWFuYWdlcnMgaW4gbXVsdGlwbGUgbGluZXMgaWYKdGhlIGl0ZW1zIGFyZSBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzLiBGb3IgZXhhbXBsZToKCiAgIHdpdGggKAogICAgICAgQSgpIGFzIGEsCiAgICAgICBCKCkgYXMgYiwKICAgKToKICAgICAgIFNVSVRFCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTA6IFN1cHBvcnQgZm9yIHVzaW5nIGdyb3VwaW5nIHBhcmVudGhlc2VzIHRvCmJyZWFrIHRoZSBzdGF0ZW1lbnQgaW4gbXVsdGlwbGUgbGluZXMuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzQzKiogLSBUaGUg4oCcd2l0aOKAnSBzdGF0ZW1lbnQKICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIgogICAgIHN0YXRlbWVudC4KYTADAABUaGUgInlpZWxkIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqCgogICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uCgpBICJ5aWVsZCIgc3RhdGVtZW50IGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgeWllbGQgZXhwcmVzc2lvbi4KVGhlICJ5aWVsZCIgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIG9taXQgdGhlIHBhcmVudGhlc2VzIHRoYXQgd291bGQKb3RoZXJ3aXNlIGJlIHJlcXVpcmVkIGluIHRoZSBlcXVpdmFsZW50IHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50LgpGb3IgZXhhbXBsZSwgdGhlIHlpZWxkIHN0YXRlbWVudHMKCiAgIHlpZWxkIDxleHByPgogICB5aWVsZCBmcm9tIDxleHByPgoKYXJlIGVxdWl2YWxlbnQgdG8gdGhlIHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50cwoKICAgKHlpZWxkIDxleHByPikKICAgKHlpZWxkIGZyb20gPGV4cHI+KQoKWWllbGQgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGRlZmluaW5nIGEKKmdlbmVyYXRvciogZnVuY3Rpb24sIGFuZCBhcmUgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3IKZnVuY3Rpb24uICBVc2luZyAieWllbGQiIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBzdWZmaWNpZW50IHRvCmNhdXNlIHRoYXQgZGVmaW5pdGlvbiB0byBjcmVhdGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBhCm5vcm1hbCBmdW5jdGlvbi4KCkZvciBmdWxsIGRldGFpbHMgb2YgInlpZWxkIiBzZW1hbnRpY3MsIHJlZmVyIHRvIHRoZSBZaWVsZCBleHByZXNzaW9ucwpzZWN0aW9uLgopDNoDdHJ52gV0eXBlc9oOdHlwZXNmdW5jdGlvbnPaDHR5cGVzbWFwcGluZ9oMdHlwZXNtZXRob2Rz2gx0eXBlc21vZHVsZXPaCHR5cGVzc2VxehB0eXBlc3NlcS1tdXRhYmxl2gV1bmFyedoFd2hpbGXaBHdpdGjaBXlpZWxkTikB2gZ0b3BpY3OpAPMAAAAA2jgvb3B0L2FsdC9weXRob24zMTMvbGliNjQvcHl0aG9uMy4xMy9weWRvY19kYXRhL3RvcGljcy5wedoIPG1vZHVsZT5yRAAAAAEAAABz3AUAAPADAQEB8AhjTAMKAtgEDPAAHg8E8ANjTAMKAvBAAQAFEfAAewMTBPBBAWNMAwoC8HgIAAUd8AAcHwTweQhjTAMKAvByCQAFDPAAdQEOBPBzCWNMAwoC8F4NAAUX8AA1GQTwXw1jTAMKAvBKDwAFFPAAExYE8EsPY0wDCgLwcg8ABRfwAE8FGQTwcw9jTAMKAvBSGgAFG/AAFB0E8FMaY0wDCgLwfBoABRDwACkSBPB9GmNMAwoC8FAcAAUM8AAJDgTwURxjTAMKAvBkHAAFDfAAVQEPBPBlHGNMAwoC8FAfAAUO8AAUEATwUR9jTAMKAvB6HwAFGfAAERsE8HsfY0wDCgLwXiAABRzwAB4eBPBfIGNMAwoC8FwhAAUY8AAJGgTwXSFjTAMKAvBwIQAFGfAACRsE8HEhY0wDCgLwRCIABQ/wACERBPFFImNMAwoC8EgjAAUM8AASDgTwSSNjTAMKAvBuIwAFFfAACRcE8G8jY0wDCgLwQiQABQzwAFgCDgTwQyRjTAMKAvB0KAAFDPAAVwEOBPB1KGNMAwoC8GQrAAUS8ABwAxQE8GUrY0wDCgLwRjMABQ/wAEgbEQTwRzNjTAMKAvBYaQEABRfwACwZBPBZaQFjTAMKAvByagEABQ/wAAwRBPBzagFjTAMKAvBMawEABRLwABIUBPBNawFjTAMKAvByawEABRTwAHQEFgTwc2sBY0wDCgLwXHUBAAUP8ABKCxEE8F11AWNMAwoC8HJLAgAFCvAAGQwE8HNLAmNMAwoC8GZMAgAFC/AALA0E8GdMAmNMAwoC8EBOAgAFF/AAExkE8EFOAmNMAwoC8GhOAgAFC/AADw0E8GlOAmNMAwoC8EhPAgAFEfAAMRME8ElPAmNMAwoC8GxQAgAFEPAAXQUSBPJtUAJjTAMKAvBoWwIABRDwAB8SBPBpWwJjTAMKAvBoXAIABQ/wABkRBPBpXAJjTAMKAvBcXQIABQrwACoMBPBdXQJjTAMKAvByXgIABRTwAFgIFgTwc14CY0wDCgLwZG8CAAUP8ABfAhEE8GVvAmNMAwoC8GR0AgAFDfAAHA8E8GV0AmNMAwoC8F51AgAFEfAAKhME8F91AmNMAwoC8HR2AgAFEvAASwIUBPB1dgJjTAMKAvBMewIABQnwAA8LBPBNewJjTAMKAvBsewIABRDwAA4SBPBtewJjTAMKAvBKfAIABQ3wAEoDDwTwS3wCY0wDCgLwYEIDAAUJ8AAjCwTwYUIDY0wDCgLwaEMDAAUP8AAkEQTwaUMDY0wDCgLwckQDAAUN8AAQDwTwc0QDY0wDCgLwVEUDAAUM8AAODgTwVUUDY0wDCgLwckUDAAUN8ABRBA8E8HNFA2NMAwoC8FZOAwAFD/AAGhEE8ldOA2NMAwoC8ExPAwAFDvAACxAE8E1PA2NMAwoC8GRPAwAFFPAAUgIWBPBlTwNjTAMKAvBKVAMABQ7wAFkBEATwS1QDY0wDCgLwflYDAAUX8ABuARkE8H9WA2NMAwoC8FxaAwAFC/AADA0E8F1aA2NMAwoC8HZaAwAFDPAAHQ4E8HdaA2NMAwoC8HJbAwAFDPAAZQEOBPBzWwNjTAMKAvB+XgMABQ3wABsPBPB/XgNjTAMKAvB2XwMABRXwAFwCFwTwd18DY0wDCgLwcGQDAAUP8AATEQTwcWQDY0wDCgLwWGUDAAUP8AAiEQTwWWUDY0wDCgLwXmYDAAUT8AAjFQTwX2YDY0wDCgLwZmcDAAUT8ABNGRUE8GdnA2NMAwoC8EJaBAAFFfAAbQ4XBPBDWgRjTAMKAvBedwQABQ7wAHQCEATwX3cEY0wDCgLwSH0EAAUU8AA4FgTwSX0EY0wDCgLwen4EAAUM8AAXDgTxe34EY0wDCgLwan8EXQMMBPB8Bn0UDgTwfCkMFwTwGkQGFQTwSgwnFQTwUAEWFQTwLmAIEQTwQhFsARkE8FoDFQ4E8CwSDgTwJm4BDQTwXgMaDgTyUVgGY0wDCgKBBnJCAAAA
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 9
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
module_docs.cpython-313.opt-1.pyc
19.37 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
module_docs.cpython-313.opt-2.pyc
19.37 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
module_docs.cpython-313.pyc
19.37 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
topics.cpython-313.opt-1.pyc
523.15 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
topics.cpython-313.opt-2.pyc
523.15 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
topics.cpython-313.pyc
523.15 KB
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-313.opt-1.pyc
155 B
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-313.opt-2.pyc
155 B
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-313.pyc
155 B
lrw-r--r--
2026-04-28 11:32:07
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).