REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 472.25 KB
Close
//opt/alt/python-internal/lib64/python3.11/pydoc_data/__pycache__/topics.cpython-311.pyc
Text
Base64
pw0NCgAAAAAhQT9oA9QLAOMAAAAAAAAAAAAAAAANAAAAAAAAAPPKAQAAlwBpAGQAZAGTAWQCZAOTAWQEZAWTAWQGZAeTAWQIZAmTAWQKZAuTAWQMZA2TAWQOZA+TAWQQZBGTAWQSZBOTAWQUZBWTAWQWZBeTAWQYZBmTAWQaZBuTAWQcZB2TAWQeZB+TAWQgZCGTAWkAZCJkI5MBZCRkJZMBZCZkJ5MBZChkKZMBZCpkK5MBZCxkLZMBZC5kL5MBZDBkMZMBZDJkM5MBZDRkNZMBZDZkN5MBZDhkOZMBZDpkO5MBZDxkPZMBZD5kP5MBZEBkQZMBZEJkQ5MBpQFpAGREZEWTAWRGZEeTAWRIZEmTAWRKZEuTAWRMZE2TAWROZE+TAWRQZFGTAWRSZD2TAWRTZFSTAWRVZFaTAWRXZFiTAWRZZFqTAWRbZFyTAWRdZF6TAWRfZGCTAWRhZGKTAWRjZGSTAaUBaQBkZWRmkwFkZ2RokwFkaWRqkwFka2RskwFkbWRukwFkb2RwkwFkcWRykwFkc2R0kwFkdWR2kwFkd2R4kwFkeWR6kwFke2R8kwFkfWR+kwFkf2SAkwFkgWSCkwFkg2SEkwFkhWSGkwGlAWSHZIhkiWSKZItkjGSNZI5kj2SQZJFkkpwLpQFaAGSTUwAplNoGYXNzZXJ0YXUEAABUaGUgImFzc2VydCIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKioKCkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucwppbnRvIGEgcHJvZ3JhbToKCiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl0KClRoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0bwoKICAgaWYgX19kZWJ1Z19fOgogICAgICAgaWYgbm90IGV4cHJlc3Npb246IHJhaXNlIEFzc2VydGlvbkVycm9yCgpUaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyBlcXVpdmFsZW50IHRvCgogICBpZiBfX2RlYnVnX186CiAgICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKQoKVGhlc2UgZXF1aXZhbGVuY2VzIGFzc3VtZSB0aGF0ICJfX2RlYnVnX18iIGFuZCAiQXNzZXJ0aW9uRXJyb3IiIHJlZmVyCnRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50CmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyCm5vcm1hbCBjaXJjdW1zdGFuY2VzLCAiRmFsc2UiIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCAoY29tbWFuZApsaW5lIG9wdGlvbiAiLU8iKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuCmFzc2VydCBzdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGUgdGltZS4gIE5vdGUKdGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGV4cHJlc3Npb24KdGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlCnN0YWNrIHRyYWNlLgoKQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pbgp2YXJpYWJsZSBpcyBkZXRlcm1pbmVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cy4K2gphc3NpZ25tZW50ddgrAABBc3NpZ25tZW50IHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKioqCgpBc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCB0bwptb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6CgogICBhc3NpZ25tZW50X3N0bXQgOjo9ICh0YXJnZXRfbGlzdCAiPSIpKyAoc3RhcnJlZF9leHByZXNzaW9uIHwgeWllbGRfZXhwcmVzc2lvbikKICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXQogICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXIKICAgICAgICAgICAgICB8ICIoIiBbdGFyZ2V0X2xpc3RdICIpIgogICAgICAgICAgICAgIHwgIlsiIFt0YXJnZXRfbGlzdF0gIl0iCiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWYKICAgICAgICAgICAgICB8IHN1YnNjcmlwdGlvbgogICAgICAgICAgICAgIHwgc2xpY2luZwogICAgICAgICAgICAgIHwgIioiIHRhcmdldAoKKFNlZSBzZWN0aW9uIFByaW1hcmllcyBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgKmF0dHJpYnV0ZXJlZiosCipzdWJzY3JpcHRpb24qLCBhbmQgKnNsaWNpbmcqLikKCkFuIGFzc2lnbm1lbnQgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0IChyZW1lbWJlciB0aGF0CnRoaXMgY2FuIGJlIGEgc2luZ2xlIGV4cHJlc3Npb24gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgdGhlIGxhdHRlcgp5aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZgp0aGUgdGFyZ2V0IGxpc3RzLCBmcm9tIGxlZnQgdG8gcmlnaHQuCgpBc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXQKKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gYXR0cmlidXRlCnJlZmVyZW5jZSwgc3Vic2NyaXB0aW9uIG9yIHNsaWNpbmcpLCB0aGUgbXV0YWJsZSBvYmplY3QgbXVzdAp1bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZAptYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NpZ25tZW50IGlzIHVuYWNjZXB0YWJsZS4gIFRoZSBydWxlcwpvYnNlcnZlZCBieSB2YXJpb3VzIHR5cGVzIGFuZCB0aGUgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGdpdmVuIHdpdGggdGhlCmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUKaGllcmFyY2h5KS4KCkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgdGFyZ2V0IGxpc3QsIG9wdGlvbmFsbHkgZW5jbG9zZWQgaW4KcGFyZW50aGVzZXMgb3Igc3F1YXJlIGJyYWNrZXRzLCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzIGZvbGxvd3MuCgoqIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQgd2l0aCBubyB0cmFpbGluZyBjb21tYSwKICBvcHRpb25hbGx5IGluIHBhcmVudGhlc2VzLCB0aGUgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIHRoYXQgdGFyZ2V0LgoKKiBFbHNlOgoKICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW4gYXN0ZXJpc2ssCiAgICBjYWxsZWQgYSDigJxzdGFycmVk4oCdIHRhcmdldDogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggYXQKICAgIGxlYXN0IGFzIG1hbnkgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBtaW51cwogICAgb25lLiAgVGhlIGZpcnN0IGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0bwogICAgcmlnaHQsIHRvIHRoZSB0YXJnZXRzIGJlZm9yZSB0aGUgc3RhcnJlZCB0YXJnZXQuICBUaGUgZmluYWwgaXRlbXMKICAgIG9mIHRoZSBpdGVyYWJsZSBhcmUgYXNzaWduZWQgdG8gdGhlIHRhcmdldHMgYWZ0ZXIgdGhlIHN0YXJyZWQKICAgIHRhcmdldC4gIEEgbGlzdCBvZiB0aGUgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSBpdGVyYWJsZSBpcyB0aGVuCiAgICBhc3NpZ25lZCB0byB0aGUgc3RhcnJlZCB0YXJnZXQgKHRoZSBsaXN0IGNhbiBiZSBlbXB0eSkuCgogICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zCiAgICBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlCiAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLgoKQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMKZm9sbG93cy4KCiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKToKCiAgKiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBvY2N1ciBpbiBhICJnbG9iYWwiIG9yICJub25sb2NhbCIgc3RhdGVtZW50CiAgICBpbiB0aGUgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZQogICAgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UuCgogICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlCiAgICBvciB0aGUgb3V0ZXIgbmFtZXNwYWNlIGRldGVybWluZWQgYnkgIm5vbmxvY2FsIiwgcmVzcGVjdGl2ZWx5LgoKICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlCiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2gKICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyBkZXN0cnVjdG9yIChpZiBpdAogIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC4KCiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluCiAgdGhlIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYW4gb2JqZWN0IHdpdGgKICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAiVHlwZUVycm9yIiBpcwogIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8KICB0aGUgZ2l2ZW4gYXR0cmlidXRlOyBpZiBpdCBjYW5ub3QgcGVyZm9ybSB0aGUgYXNzaWdubWVudCwgaXQgcmFpc2VzCiAgYW4gZXhjZXB0aW9uICh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgIkF0dHJpYnV0ZUVycm9yIikuCgogIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2UKICBvY2N1cnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgdGhlIHJpZ2h0LWhhbmQgc2lkZQogIGV4cHJlc3Npb24sICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8KICBpbnN0YW5jZSBhdHRyaWJ1dGUgZXhpc3RzKSBhIGNsYXNzIGF0dHJpYnV0ZS4gIFRoZSBsZWZ0LWhhbmQgc2lkZQogIHRhcmdldCAiYS54IiBpcyBhbHdheXMgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYKICBuZWNlc3NhcnkuICBUaHVzLCB0aGUgdHdvIG9jY3VycmVuY2VzIG9mICJhLngiIGRvIG5vdCBuZWNlc3NhcmlseQogIHJlZmVyIHRvIHRoZSBzYW1lIGF0dHJpYnV0ZTogaWYgdGhlIHJpZ2h0LWhhbmQgc2lkZSBleHByZXNzaW9uCiAgcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLCB0aGUgbGVmdC1oYW5kIHNpZGUgY3JlYXRlcyBhIG5ldwogIGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZSBhc3NpZ25tZW50OgoKICAgICBjbGFzcyBDbHM6CiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGUKICAgICBpbnN0ID0gQ2xzKCkKICAgICBpbnN0LnggPSBpbnN0LnggKyAxICAgIyB3cml0ZXMgaW5zdC54IGFzIDQgbGVhdmluZyBDbHMueCBhcyAzCgogIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvcgogIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgcHJvcGVydGllcyBjcmVhdGVkIHdpdGggInByb3BlcnR5KCkiLgoKKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZQogIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSBzZXF1ZW5jZQogIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpIG9yIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KS4KICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLgoKICBJZiB0aGUgcHJpbWFyeSBpcyBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0IChzdWNoIGFzIGEgbGlzdCksIHRoZQogIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNl4oCZcwogIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlCiAgaW50ZWdlciBsZXNzIHRoYW4gdGhlIHNlcXVlbmNl4oCZcyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWQKICB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0byBpdHMgaXRlbSB3aXRoIHRoYXQgaW5kZXguICBJZiB0aGUKICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICJJbmRleEVycm9yIiBpcyByYWlzZWQgKGFzc2lnbm1lbnQgdG8gYQogIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuCgogIElmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KSwgdGhlCiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5n4oCZcyBrZXkgdHlwZSwKICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvdmFsdWUgcGFpciB3aGljaCBtYXBzCiAgdGhlIHN1YnNjcmlwdCB0byB0aGUgYXNzaWduZWQgb2JqZWN0LiAgVGhpcyBjYW4gZWl0aGVyIHJlcGxhY2UgYW4KICBleGlzdGluZyBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSwgb3IgaW5zZXJ0IGEgbmV3CiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLgoKICBGb3IgdXNlci1kZWZpbmVkIG9iamVjdHMsIHRoZSAiX19zZXRpdGVtX18oKSIgbWV0aG9kIGlzIGNhbGxlZCB3aXRoCiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLgoKKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGUgcmVmZXJlbmNlCiAgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYQogIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvYmplY3Qgb2YgdGhlIHNhbWUKICB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkLAogIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZSBzZXF1ZW5jZeKAmXMKICBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gSWYgZWl0aGVyIGJvdW5kIGlzCiAgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZeKAmXMgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlIHJlc3VsdGluZwogIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgc2VxdWVuY2XigJlzIGxlbmd0aCwKICBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvIHJlcGxhY2UgdGhlCiAgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlIGxlbmd0aCBvZiB0aGUKICBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UsCiAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSB0YXJnZXQKICBzZXF1ZW5jZSBhbGxvd3MgaXQuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUKc3ludGF4IGZvciB0YXJnZXRzIGlzIHRha2VuIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgYW5kCmludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCBjYXVzaW5nCmxlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuCgpBbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyBiZXR3ZWVuCnRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUg4oCYc2ltdWx0YW5lb3Vz4oCZIChmb3IKZXhhbXBsZSAiYSwgYiA9IGIsIGEiIHN3YXBzIHR3byB2YXJpYWJsZXMpLCBvdmVybGFwcyAqd2l0aGluKiB0aGUKY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgb2NjdXIgbGVmdC10by1yaWdodCwgc29tZXRpbWVzCnJlc3VsdGluZyBpbiBjb25mdXNpb24uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcmludHMKIlswLCAyXSI6CgogICB4ID0gWzAsIDFdCiAgIGkgPSAwCiAgIGksIHhbaV0gPSAxLCAyICAgICAgICAgIyBpIGlzIHVwZGF0ZWQsIHRoZW4geFtpXSBpcyB1cGRhdGVkCiAgIHByaW50KHgpCgpTZWUgYWxzbzoKCiAgKipQRVAgMzEzMioqIC0gRXh0ZW5kZWQgSXRlcmFibGUgVW5wYWNraW5nCiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAiKnRhcmdldCIgZmVhdHVyZS4KCgpBdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhCmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OgoKICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKQogICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZwogICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iCiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSIKCihTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWUKc3ltYm9scy4pCgpBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWwKYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb24KbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudApvbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuClRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS4KCkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzCiJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGUKYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLAp0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuCmNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCBvYmplY3QKaXMgbW9kaWZpZWQgaW5zdGVhZC4KClVubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgbGVmdC0KaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciBleGFtcGxlLCAiYVtpXQorPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXMKdGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi4KCldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGEKc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudApzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LAp3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnkKb3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsCmJpbmFyeSBvcGVyYXRpb25zLgoKRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSBjYXZlYXQgYWJvdXQKY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy4KCgpBbm5vdGF0ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCipBbm5vdGF0aW9uKiBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZgphIHZhcmlhYmxlIG9yIGF0dHJpYnV0ZSBhbm5vdGF0aW9uIGFuZCBhbiBvcHRpb25hbCBhc3NpZ25tZW50CnN0YXRlbWVudDoKCiAgIGFubm90YXRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCAiOiIgZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIj0iIChzdGFycmVkX2V4cHJlc3Npb24gfCB5aWVsZF9leHByZXNzaW9uKV0KClRoZSBkaWZmZXJlbmNlIGZyb20gbm9ybWFsIEFzc2lnbm1lbnQgc3RhdGVtZW50cyBpcyB0aGF0IG9ubHkgYSBzaW5nbGUKdGFyZ2V0IGlzIGFsbG93ZWQuCgpGb3Igc2ltcGxlIG5hbWVzIGFzIGFzc2lnbm1lbnQgdGFyZ2V0cywgaWYgaW4gY2xhc3Mgb3IgbW9kdWxlIHNjb3BlLAp0aGUgYW5ub3RhdGlvbnMgYXJlIGV2YWx1YXRlZCBhbmQgc3RvcmVkIGluIGEgc3BlY2lhbCBjbGFzcyBvciBtb2R1bGUKYXR0cmlidXRlICJfX2Fubm90YXRpb25zX18iIHRoYXQgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZnJvbSB2YXJpYWJsZQpuYW1lcyAobWFuZ2xlZCBpZiBwcml2YXRlKSB0byBldmFsdWF0ZWQgYW5ub3RhdGlvbnMuIFRoaXMgYXR0cmlidXRlIGlzCndyaXRhYmxlIGFuZCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXQgdGhlIHN0YXJ0IG9mIGNsYXNzIG9yIG1vZHVsZQpib2R5IGV4ZWN1dGlvbiwgaWYgYW5ub3RhdGlvbnMgYXJlIGZvdW5kIHN0YXRpY2FsbHkuCgpGb3IgZXhwcmVzc2lvbnMgYXMgYXNzaWdubWVudCB0YXJnZXRzLCB0aGUgYW5ub3RhdGlvbnMgYXJlIGV2YWx1YXRlZAppZiBpbiBjbGFzcyBvciBtb2R1bGUgc2NvcGUsIGJ1dCBub3Qgc3RvcmVkLgoKSWYgYSBuYW1lIGlzIGFubm90YXRlZCBpbiBhIGZ1bmN0aW9uIHNjb3BlLCB0aGVuIHRoaXMgbmFtZSBpcyBsb2NhbApmb3IgdGhhdCBzY29wZS4gQW5ub3RhdGlvbnMgYXJlIG5ldmVyIGV2YWx1YXRlZCBhbmQgc3RvcmVkIGluIGZ1bmN0aW9uCnNjb3Blcy4KCklmIHRoZSByaWdodCBoYW5kIHNpZGUgaXMgcHJlc2VudCwgYW4gYW5ub3RhdGVkIGFzc2lnbm1lbnQgcGVyZm9ybXMKdGhlIGFjdHVhbCBhc3NpZ25tZW50IGJlZm9yZSBldmFsdWF0aW5nIGFubm90YXRpb25zICh3aGVyZQphcHBsaWNhYmxlKS4gSWYgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyBub3QgcHJlc2VudCBmb3IgYW4gZXhwcmVzc2lvbgp0YXJnZXQsIHRoZW4gdGhlIGludGVycHJldGVyIGV2YWx1YXRlcyB0aGUgdGFyZ2V0IGV4Y2VwdCBmb3IgdGhlIGxhc3QKIl9fc2V0aXRlbV9fKCkiIG9yICJfX3NldGF0dHJfXygpIiBjYWxsLgoKU2VlIGFsc286CgogICoqUEVQIDUyNioqIC0gU3ludGF4IGZvciBWYXJpYWJsZSBBbm5vdGF0aW9ucwogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGFkZGVkIHN5bnRheCBmb3IgYW5ub3RhdGluZyB0aGUgdHlwZXMgb2YKICAgICB2YXJpYWJsZXMgKGluY2x1ZGluZyBjbGFzcyB2YXJpYWJsZXMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyksCiAgICAgaW5zdGVhZCBvZiBleHByZXNzaW5nIHRoZW0gdGhyb3VnaCBjb21tZW50cy4KCiAgKipQRVAgNDg0KiogLSBUeXBlIGhpbnRzCiAgICAgVGhlIHByb3Bvc2FsIHRoYXQgYWRkZWQgdGhlICJ0eXBpbmciIG1vZHVsZSB0byBwcm92aWRlIGEgc3RhbmRhcmQKICAgICBzeW50YXggZm9yIHR5cGUgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBzdGF0aWMgYW5hbHlzaXMKICAgICB0b29scyBhbmQgSURFcy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IE5vdyBhbm5vdGF0ZWQgYXNzaWdubWVudHMgYWxsb3cgdGhlIHNhbWUKZXhwcmVzc2lvbnMgaW4gdGhlIHJpZ2h0IGhhbmQgc2lkZSBhcyByZWd1bGFyIGFzc2lnbm1lbnRzLiBQcmV2aW91c2x5LApzb21lIGV4cHJlc3Npb25zIChsaWtlIHVuLXBhcmVudGhlc2l6ZWQgdHVwbGUgZXhwcmVzc2lvbnMpIGNhdXNlZCBhCnN5bnRheCBlcnJvci4K2gVhc3luY3WhEQAAQ29yb3V0aW5lcwoqKioqKioqKioqCgpOZXcgaW4gdmVyc2lvbiAzLjUuCgoKQ29yb3V0aW5lIGZ1bmN0aW9uIGRlZmluaXRpb24KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIGFzeW5jX2Z1bmNkZWYgOjo9IFtkZWNvcmF0b3JzXSAiYXN5bmMiICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIgogICAgICAgICAgICAgICAgICAgICBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGUKCkV4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0IG1hbnkKcG9pbnRzIChzZWUgKmNvcm91dGluZSopLiAiYXdhaXQiIGV4cHJlc3Npb25zLCAiYXN5bmMgZm9yIiBhbmQgImFzeW5jCndpdGgiIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpGdW5jdGlvbnMgZGVmaW5lZCB3aXRoICJhc3luYyBkZWYiIHN5bnRheCBhcmUgYWx3YXlzIGNvcm91dGluZQpmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuCgpJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlIGEgInlpZWxkIGZyb20iIGV4cHJlc3Npb24gaW5zaWRlIHRoZSBib2R5Cm9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uLgoKQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjoKCiAgIGFzeW5jIGRlZiBmdW5jKHBhcmFtMSwgcGFyYW0yKToKICAgICAgIGRvX3N0dWZmKCkKICAgICAgIGF3YWl0IHNvbWVfY29yb3V0aW5lKCkKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjc6ICJhd2FpdCIgYW5kICJhc3luYyIgYXJlIG5vdyBrZXl3b3JkczsKcHJldmlvdXNseSB0aGV5IHdlcmUgb25seSB0cmVhdGVkIGFzIHN1Y2ggaW5zaWRlIHRoZSBib2R5IG9mIGEKY29yb3V0aW5lIGZ1bmN0aW9uLgoKClRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgYXN5bmNfZm9yX3N0bXQgOjo9ICJhc3luYyIgZm9yX3N0bXQKCkFuICphc3luY2hyb25vdXMgaXRlcmFibGUqIHByb3ZpZGVzIGFuICJfX2FpdGVyX18iIG1ldGhvZCB0aGF0CmRpcmVjdGx5IHJldHVybnMgYW4gKmFzeW5jaHJvbm91cyBpdGVyYXRvciosIHdoaWNoIGNhbiBjYWxsCmFzeW5jaHJvbm91cyBjb2RlIGluIGl0cyAiX19hbmV4dF9fIiBtZXRob2QuCgpUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50IGFsbG93cyBjb252ZW5pZW50IGl0ZXJhdGlvbiBvdmVyCmFzeW5jaHJvbm91cyBpdGVyYWJsZXMuCgpUaGUgZm9sbG93aW5nIGNvZGU6CgogICBhc3luYyBmb3IgVEFSR0VUIGluIElURVI6CiAgICAgICBTVUlURQogICBlbHNlOgogICAgICAgU1VJVEUyCgpJcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzoKCiAgIGl0ZXIgPSAoSVRFUikKICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpCiAgIHJ1bm5pbmcgPSBUcnVlCgogICB3aGlsZSBydW5uaW5nOgogICAgICAgdHJ5OgogICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpCiAgICAgICBleGNlcHQgU3RvcEFzeW5jSXRlcmF0aW9uOgogICAgICAgICAgIHJ1bm5pbmcgPSBGYWxzZQogICAgICAgZWxzZToKICAgICAgICAgICBTVUlURQogICBlbHNlOgogICAgICAgU1VJVEUyCgpTZWUgYWxzbyAiX19haXRlcl9fKCkiIGFuZCAiX19hbmV4dF9fKCkiIGZvciBkZXRhaWxzLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgb3V0c2lkZSB0aGUgYm9keQpvZiBhIGNvcm91dGluZSBmdW5jdGlvbi4KCgpUaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdAoKQW4gKmFzeW5jaHJvbm91cyBjb250ZXh0IG1hbmFnZXIqIGlzIGEgKmNvbnRleHQgbWFuYWdlciogdGhhdCBpcyBhYmxlCnRvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy4KClRoZSBmb2xsb3dpbmcgY29kZToKCiAgIGFzeW5jIHdpdGggRVhQUkVTU0lPTiBhcyBUQVJHRVQ6CiAgICAgICBTVUlURQoKaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86CgogICBtYW5hZ2VyID0gKEVYUFJFU1NJT04pCiAgIGFlbnRlciA9IHR5cGUobWFuYWdlcikuX19hZW50ZXJfXwogICBhZXhpdCA9IHR5cGUobWFuYWdlcikuX19hZXhpdF9fCiAgIHZhbHVlID0gYXdhaXQgYWVudGVyKG1hbmFnZXIpCiAgIGhpdF9leGNlcHQgPSBGYWxzZQoKICAgdHJ5OgogICAgICAgVEFSR0VUID0gdmFsdWUKICAgICAgIFNVSVRFCiAgIGV4Y2VwdDoKICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCiAgICAgICBpZiBub3QgYXdhaXQgYWV4aXQobWFuYWdlciwgKnN5cy5leGNfaW5mbygpKToKICAgICAgICAgICByYWlzZQogICBmaW5hbGx5OgogICAgICAgaWYgbm90IGhpdF9leGNlcHQ6CiAgICAgICAgICAgYXdhaXQgYWV4aXQobWFuYWdlciwgTm9uZSwgTm9uZSwgTm9uZSkKClNlZSBhbHNvICJfX2FlbnRlcl9fKCkiIGFuZCAiX19hZXhpdF9fKCkiIGZvciBkZXRhaWxzLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgdGhlCmJvZHkgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpTZWUgYWxzbzoKCiAgKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IG1hZGUgY29yb3V0aW5lcyBhIHByb3BlciBzdGFuZGFsb25lIGNvbmNlcHQgaW4KICAgICBQeXRob24sIGFuZCBhZGRlZCBzdXBwb3J0aW5nIHN5bnRheC4KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3MgdGhlcmUKICAgIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLgogICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LgoKWzJdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgc2VxdWVuY2UgaXMgZGVmaW5lZCBhcyBvbmUgb2YgdGhlCiAgICBmb2xsb3dpbmc6CgogICAgKiBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiCgogICAgKiBhIGJ1aWx0aW4gY2xhc3MgdGhhdCBoYXMgaXRzIChDUHl0aG9uKSAiUHlfVFBGTEFHU19TRVFVRU5DRSIgYml0CiAgICAgIHNldAoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gYW55IG9mIHRoZSBhYm92ZQoKICAgIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzIGFyZSBzZXF1ZW5jZXM6CgogICAgKiAiYXJyYXkuYXJyYXkiCgogICAgKiAiY29sbGVjdGlvbnMuZGVxdWUiCgogICAgKiAibGlzdCIKCiAgICAqICJtZW1vcnl2aWV3IgoKICAgICogInJhbmdlIgoKICAgICogInR1cGxlIgoKICAgIE5vdGU6CgogICAgICBTdWJqZWN0IHZhbHVlcyBvZiB0eXBlICJzdHIiLCAiYnl0ZXMiLCBhbmQgImJ5dGVhcnJheSIgZG8gbm90CiAgICAgIG1hdGNoIHNlcXVlbmNlIHBhdHRlcm5zLgoKWzNdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgbWFwcGluZyBpcyBkZWZpbmVkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gImNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuTWFwcGluZyIKCiAgICAqIGEgYnVpbHRpbiBjbGFzcyB0aGF0IGhhcyBpdHMgKENQeXRob24pICJQeV9UUEZMQUdTX01BUFBJTkciIGJpdAogICAgICBzZXQKCiAgICAqIGEgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIGFueSBvZiB0aGUgYWJvdmUKCiAgICBUaGUgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzICJkaWN0IiBhbmQgInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiCiAgICBhcmUgbWFwcGluZ3MuCgpbNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24KICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb27igJlzICJfX2RvY19fIiBhdHRyaWJ1dGUgYW5kCiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9u4oCZcyAqZG9jc3RyaW5nKi4KCls1XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzcwogICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2XigJlzICJfX2RvY19fIiBpdGVtIGFuZAogICAgdGhlcmVmb3JlIHRoZSBjbGFzc+KAmXMgKmRvY3N0cmluZyouCnoQYXRvbS1pZGVudGlmaWVyc2HMBAAASWRlbnRpZmllcnMgKE5hbWVzKQoqKioqKioqKioqKioqKioqKioqCgpBbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSBzZWN0aW9uIElkZW50aWZpZXJzCmFuZCBrZXl3b3JkcyBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IKZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuCgpXaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgYXRvbSB5aWVsZHMKdGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdApyYWlzZXMgYSAiTmFtZUVycm9yIiBleGNlcHRpb24uCgoqKlByaXZhdGUgbmFtZSBtYW5nbGluZzoqKiBXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCB0ZXh0dWFsbHkgb2NjdXJzIGluCmEgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMgd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYW5kCmRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlCm5hbWUqIG9mIHRoYXQgY2xhc3MuIFByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgbG9uZ2VyIGZvcm0KYmVmb3JlIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlCmNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhIHNpbmdsZSB1bmRlcnNjb3JlCmluc2VydGVkLCBpbiBmcm9udCBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpZmllciAiX19zcGFtIgpvY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCAiSGFtIiB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvICJfSGFtX19zcGFtIi4KVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWwgY29udGV4dCBpbiB3aGljaAp0aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMgZXh0cmVtZWx5IGxvbmcKKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0cnVuY2F0aW9uIG1heQpoYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsIG5vCnRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCnoNYXRvbS1saXRlcmFsc3UNAwAATGl0ZXJhbHMKKioqKioqKioKClB5dGhvbiBzdXBwb3J0cyBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIGFuZCB2YXJpb3VzIG51bWVyaWMKbGl0ZXJhbHM6CgogICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgYnl0ZXNsaXRlcmFsCiAgICAgICAgICAgICAgIHwgaW50ZWdlciB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlcgoKRXZhbHVhdGlvbiBvZiBhIGxpdGVyYWwgeWllbGRzIGFuIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSAoc3RyaW5nLApieXRlcywgaW50ZWdlciwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjb21wbGV4IG51bWJlcikgd2l0aCB0aGUgZ2l2ZW4KdmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiBmbG9hdGluZyBwb2ludAphbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uIExpdGVyYWxzIGZvciBkZXRhaWxzLgoKQWxsIGxpdGVyYWxzIGNvcnJlc3BvbmQgdG8gaW1tdXRhYmxlIGRhdGEgdHlwZXMsIGFuZCBoZW5jZSB0aGUKb2JqZWN04oCZcyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gIE11bHRpcGxlCmV2YWx1YXRpb25zIG9mIGxpdGVyYWxzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGVpdGhlciB0aGUgc2FtZQpvY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpbgp0aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUuCnoQYXR0cmlidXRlLWFjY2Vzc3XnNQAAQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2VzcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSBtZWFuaW5nIG9mCmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgIngubmFtZSIpIGZvcgpjbGFzcyBpbnN0YW5jZXMuCgpvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSkKCiAgIENhbGxlZCB3aGVuIHRoZSBkZWZhdWx0IGF0dHJpYnV0ZSBhY2Nlc3MgZmFpbHMgd2l0aCBhbgogICAiQXR0cmlidXRlRXJyb3IiIChlaXRoZXIgIl9fZ2V0YXR0cmlidXRlX18oKSIgcmFpc2VzIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgYmVjYXVzZSAqbmFtZSogaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciBhbgogICBhdHRyaWJ1dGUgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIjsgb3IgIl9fZ2V0X18oKSIgb2YgYSAqbmFtZSoKICAgcHJvcGVydHkgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIpLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGVpdGhlcgogICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciIKICAgZXhjZXB0aW9uLgoKICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSwKICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnkKICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgZG9uZSBib3RoIGZvcgogICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlCiAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgYXQKICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkgbm90CiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0CiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZQogICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbAogICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy4KCm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCgogICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yCiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgIl9fZ2V0YXR0cl9fKCkiLAogICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyCiAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgbWV0aG9kCiAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW4KICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MKICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvcgogICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLgoKICAgTm90ZToKCiAgICAgVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHMKICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvcgogICAgIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlIFNwZWNpYWwgbWV0aG9kIGxvb2t1cC4KCiAgIEZvciBjZXJ0YWluIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgYWNjZXNzZXMsIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudAogICAib2JqZWN0Ll9fZ2V0YXR0cl9fIiB3aXRoIGFyZ3VtZW50cyAib2JqIiBhbmQgIm5hbWUiLgoKb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQoKICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWQKICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlCiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZQogICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC4KCiAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdAogICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSwKICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLgoKICAgRm9yIGNlcnRhaW4gc2Vuc2l0aXZlIGF0dHJpYnV0ZSBhc3NpZ25tZW50cywgcmFpc2VzIGFuIGF1ZGl0aW5nCiAgIGV2ZW50ICJvYmplY3QuX19zZXRhdHRyX18iIHdpdGggYXJndW1lbnRzICJvYmoiLCAibmFtZSIsICJ2YWx1ZSIuCgpvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKCiAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2YKICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXMKICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC4KCiAgIEZvciBjZXJ0YWluIHNlbnNpdGl2ZSBhdHRyaWJ1dGUgZGVsZXRpb25zLCByYWlzZXMgYW4gYXVkaXRpbmcgZXZlbnQKICAgIm9iamVjdC5fX2RlbGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIgYW5kICJuYW1lIi4KCm9iamVjdC5fX2Rpcl9fKHNlbGYpCgogICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBbiBpdGVyYWJsZSBtdXN0IGJlCiAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBpdGVyYWJsZSB0byBhIGxpc3QgYW5kCiAgIHNvcnRzIGl0LgoKCkN1c3RvbWl6aW5nIG1vZHVsZSBhdHRyaWJ1dGUgYWNjZXNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTcGVjaWFsIG5hbWVzICJfX2dldGF0dHJfXyIgYW5kICJfX2Rpcl9fIiBjYW4gYmUgYWxzbyB1c2VkIHRvCmN1c3RvbWl6ZSBhY2Nlc3MgdG8gbW9kdWxlIGF0dHJpYnV0ZXMuIFRoZSAiX19nZXRhdHRyX18iIGZ1bmN0aW9uIGF0CnRoZSBtb2R1bGUgbGV2ZWwgc2hvdWxkIGFjY2VwdCBvbmUgYXJndW1lbnQgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYW4KYXR0cmlidXRlIGFuZCByZXR1cm4gdGhlIGNvbXB1dGVkIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciIuCklmIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgb24gYSBtb2R1bGUgb2JqZWN0IHRocm91Z2ggdGhlIG5vcm1hbApsb29rdXAsIGkuZS4gIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCkiLCB0aGVuICJfX2dldGF0dHJfXyIgaXMKc2VhcmNoZWQgaW4gdGhlIG1vZHVsZSAiX19kaWN0X18iIGJlZm9yZSByYWlzaW5nIGFuICJBdHRyaWJ1dGVFcnJvciIuCklmIGZvdW5kLCBpdCBpcyBjYWxsZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHRoZSByZXN1bHQgaXMKcmV0dXJuZWQuCgpUaGUgIl9fZGlyX18iIGZ1bmN0aW9uIHNob3VsZCBhY2NlcHQgbm8gYXJndW1lbnRzLCBhbmQgcmV0dXJuIGFuCml0ZXJhYmxlIG9mIHN0cmluZ3MgdGhhdCByZXByZXNlbnRzIHRoZSBuYW1lcyBhY2Nlc3NpYmxlIG9uIG1vZHVsZS4gSWYKcHJlc2VudCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIHN0YW5kYXJkICJkaXIoKSIgc2VhcmNoIG9uIGEKbW9kdWxlLgoKRm9yIGEgbW9yZSBmaW5lIGdyYWluZWQgY3VzdG9taXphdGlvbiBvZiB0aGUgbW9kdWxlIGJlaGF2aW9yIChzZXR0aW5nCmF0dHJpYnV0ZXMsIHByb3BlcnRpZXMsIGV0Yy4pLCBvbmUgY2FuIHNldCB0aGUgIl9fY2xhc3NfXyIgYXR0cmlidXRlCm9mIGEgbW9kdWxlIG9iamVjdCB0byBhIHN1YmNsYXNzIG9mICJ0eXBlcy5Nb2R1bGVUeXBlIi4gRm9yIGV4YW1wbGU6CgogICBpbXBvcnQgc3lzCiAgIGZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUKCiAgIGNsYXNzIFZlcmJvc2VNb2R1bGUoTW9kdWxlVHlwZSk6CiAgICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICAgcmV0dXJuIGYnVmVyYm9zZSB7c2VsZi5fX25hbWVfX30nCgogICAgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGF0dHIsIHZhbHVlKToKICAgICAgICAgICBwcmludChmJ1NldHRpbmcge2F0dHJ9Li4uJykKICAgICAgICAgICBzdXBlcigpLl9fc2V0YXR0cl9fKGF0dHIsIHZhbHVlKQoKICAgc3lzLm1vZHVsZXNbX19uYW1lX19dLl9fY2xhc3NfXyA9IFZlcmJvc2VNb2R1bGUKCk5vdGU6CgogIERlZmluaW5nIG1vZHVsZSAiX19nZXRhdHRyX18iIGFuZCBzZXR0aW5nIG1vZHVsZSAiX19jbGFzc19fIiBvbmx5CiAgYWZmZWN0IGxvb2t1cHMgbWFkZSB1c2luZyB0aGUgYXR0cmlidXRlIGFjY2VzcyBzeW50YXgg4oCTIGRpcmVjdGx5CiAgYWNjZXNzaW5nIHRoZSBtb2R1bGUgZ2xvYmFscyAod2hldGhlciBieSBjb2RlIHdpdGhpbiB0aGUgbW9kdWxlLCBvcgogIHZpYSBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxl4oCZcyBnbG9iYWxzIGRpY3Rpb25hcnkpIGlzIHVuYWZmZWN0ZWQuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy41OiAiX19jbGFzc19fIiBtb2R1bGUgYXR0cmlidXRlIGlzIG5vdyB3cml0YWJsZS4KCk5ldyBpbiB2ZXJzaW9uIDMuNzogIl9fZ2V0YXR0cl9fIiBhbmQgIl9fZGlyX18iIG1vZHVsZSBhdHRyaWJ1dGVzLgoKU2VlIGFsc286CgogICoqUEVQIDU2MioqIC0gTW9kdWxlIF9fZ2V0YXR0cl9fIGFuZCBfX2Rpcl9fCiAgICAgRGVzY3JpYmVzIHRoZSAiX19nZXRhdHRyX18iIGFuZCAiX19kaXJfXyIgZnVuY3Rpb25zIG9uIG1vZHVsZXMuCgoKSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzCj09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW4KKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVy4oCZcyBjbGFzcwpkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlCmV4YW1wbGVzIGJlbG93LCDigJx0aGUgYXR0cmlidXRl4oCdIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMKdGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNz4oCZICJfX2RpY3RfXyIuCgpvYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXI9Tm9uZSkKCiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZQogICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZQogICBhY2Nlc3MpLiBUaGUgb3B0aW9uYWwgKm93bmVyKiBhcmd1bWVudCBpcyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlCiAgICppbnN0YW5jZSogaXMgdGhlIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwKICAgb3IgIk5vbmUiIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLgoKICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgY29tcHV0ZWQgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLgoKICAgKipQRVAgMjUyKiogc3BlY2lmaWVzIHRoYXQgIl9fZ2V0X18oKSIgaXMgY2FsbGFibGUgd2l0aCBvbmUgb3IgdHdvCiAgIGFyZ3VtZW50cy4gIFB5dGhvbuKAmXMgb3duIGJ1aWx0LWluIGRlc2NyaXB0b3JzIHN1cHBvcnQgdGhpcwogICBzcGVjaWZpY2F0aW9uOyBob3dldmVyLCBpdCBpcyBsaWtlbHkgdGhhdCBzb21lIHRoaXJkLXBhcnR5IHRvb2xzCiAgIGhhdmUgZGVzY3JpcHRvcnMgdGhhdCByZXF1aXJlIGJvdGggYXJndW1lbnRzLiAgUHl0aG9u4oCZcyBvd24KICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgaW1wbGVtZW50YXRpb24gYWx3YXlzIHBhc3NlcyBpbiBib3RoIGFyZ3VtZW50cwogICB3aGV0aGVyIHRoZXkgYXJlIHJlcXVpcmVkIG9yIG5vdC4KCm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSkKCiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lcgogICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi4KCiAgIE5vdGUsIGFkZGluZyAiX19zZXRfXygpIiBvciAiX19kZWxldGVfXygpIiBjaGFuZ2VzIHRoZSBraW5kIG9mCiAgIGRlc2NyaXB0b3IgdG8gYSDigJxkYXRhIGRlc2NyaXB0b3LigJ0uICBTZWUgSW52b2tpbmcgRGVzY3JpcHRvcnMgZm9yCiAgIG1vcmUgZGV0YWlscy4KCm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKQoKICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlCiAgIG93bmVyIGNsYXNzLgoKSW5zdGFuY2VzIG9mIGRlc2NyaXB0b3JzIG1heSBhbHNvIGhhdmUgdGhlICJfX29iamNsYXNzX18iIGF0dHJpYnV0ZQpwcmVzZW50OgoKb2JqZWN0Ll9fb2JqY2xhc3NfXwoKICAgVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZQogICBhcyBzcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyB0aGlzCiAgIGFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzcwogICBhdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlCiAgIGdpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSBmaXJzdAogICBwb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgYXR0cmlidXRlIGZvcgogICB1bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuCgoKSW52b2tpbmcgRGVzY3JpcHRvcnMKPT09PT09PT09PT09PT09PT09PT0KCkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGgg4oCcYmluZGluZwpiZWhhdmlvcuKAnSwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzCmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmQKIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0CmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLgoKVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZQp0aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN04oCZcyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICJhLngiIGhhcyBhCmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fWyd4J10iLCB0aGVuCiJ0eXBlKGEpLl9fZGljdF9fWyd4J10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2YKInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy4KCkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGUKZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kCmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZQpwcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmQKaG93IHRoZXkgd2VyZSBjYWxsZWQuCgpUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICJhLngiLiBIb3cKdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOgoKRGlyZWN0IENhbGwKICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseQogICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLgoKSW5zdGFuY2UgQmluZGluZwogICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUKICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bJ3gnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi4KCkNsYXNzIEJpbmRpbmcKICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOgogICAiQS5fX2RpY3RfX1sneCddLl9fZ2V0X18oTm9uZSwgQSkiLgoKU3VwZXIgQmluZGluZwogICBBIGRvdHRlZCBsb29rdXAgc3VjaCBhcyAic3VwZXIoQSwgYSkueCIgc2VhcmNoZXMKICAgImEuX19jbGFzc19fLl9fbXJvX18iIGZvciBhIGJhc2UgY2xhc3MgIkIiIGZvbGxvd2luZyAiQSIgYW5kIHRoZW4KICAgcmV0dXJucyAiQi5fX2RpY3RfX1sneCddLl9fZ2V0X18oYSwgQSkiLiAgSWYgbm90IGEgZGVzY3JpcHRvciwgIngiCiAgIGlzIHJldHVybmVkIHVuY2hhbmdlZC4KCkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHMKb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmUgYW55CmNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgIl9fZGVsZXRlX18oKSIuICBJZiBpdApkb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm4KdGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN04oCZcwppbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiBhbmQvb3IKIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzIG5laXRoZXIsIGl0IGlzCmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoCiJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZQoiX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiCihhbmQvb3IgIl9fZGVsZXRlX18oKSIpIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuCmluc3RhbmNlIGRpY3Rpb25hcnkuICBJbiBjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlCm92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLgoKUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyB0aG9zZSBkZWNvcmF0ZWQgd2l0aCAiQHN0YXRpY21ldGhvZCIgYW5kCiJAY2xhc3NtZXRob2QiKSBhcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwKaW5zdGFuY2VzIGNhbiByZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwKaW5zdGFuY2VzIHRvIGFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZQpzYW1lIGNsYXNzLgoKVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci4KQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuCgoKX19zbG90c19fCj09PT09PT09PQoKKl9fc2xvdHNfXyogYWxsb3cgdXMgdG8gZXhwbGljaXRseSBkZWNsYXJlIGRhdGEgbWVtYmVycyAobGlrZQpwcm9wZXJ0aWVzKSBhbmQgZGVueSB0aGUgY3JlYXRpb24gb2YgIl9fZGljdF9fIiBhbmQgKl9fd2Vha3JlZl9fKgoodW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gKl9fc2xvdHNfXyogb3IgYXZhaWxhYmxlIGluIGEgcGFyZW50LikKClRoZSBzcGFjZSBzYXZlZCBvdmVyIHVzaW5nICJfX2RpY3RfXyIgY2FuIGJlIHNpZ25pZmljYW50LiBBdHRyaWJ1dGUKbG9va3VwIHNwZWVkIGNhbiBiZSBzaWduaWZpY2FudGx5IGltcHJvdmVkIGFzIHdlbGwuCgpvYmplY3QuX19zbG90c19fCgogICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlCiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICpfX3Nsb3RzX18qCiAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGUKICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICJfX2RpY3RfXyIgYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2gKICAgaW5zdGFuY2UuCgpOb3RlcyBvbiB1c2luZyAqX19zbG90c19fKjoKCiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgIl9fZGljdF9fIiBhbmQKICAqX193ZWFrcmVmX18qIGF0dHJpYnV0ZSBvZiB0aGUgaW5zdGFuY2VzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUuCgoqIFdpdGhvdXQgYSAiX19kaWN0X18iIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ldwogIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG8KICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWYKICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZAogICInX19kaWN0X18nIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyoKICBkZWNsYXJhdGlvbi4KCiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmcKICAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCAid2VhayByZWZlcmVuY2VzIiB0byBpdHMgaW5zdGFuY2VzLiBJZgogIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCAiJ19fd2Vha3JlZl9fJyIgdG8gdGhlCiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uCgoqICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmcKICBkZXNjcmlwdG9ycyBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXMgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMKICBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkCiAgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlCiAgZGVzY3JpcHRvciBhc3NpZ25tZW50LgoKKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbm90IGxpbWl0ZWQgdG8gdGhlIGNsYXNzCiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gICpfX3Nsb3RzX18qIGRlY2xhcmVkIGluIHBhcmVudHMgYXJlIGF2YWlsYWJsZQogIGluIGNoaWxkIGNsYXNzZXMuIEhvd2V2ZXIsIGNoaWxkIHN1YmNsYXNzZXMgd2lsbCBnZXQgYSAiX19kaWN0X18iCiAgYW5kICpfX3dlYWtyZWZfXyogdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIHNob3VsZAogIG9ubHkgY29udGFpbiBuYW1lcyBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS4KCiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2UKICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnkKICByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLiBUaGlzCiAgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhCiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy4KCiogIlR5cGVFcnJvciIgd2lsbCBiZSByYWlzZWQgaWYgbm9uZW1wdHkgKl9fc2xvdHNfXyogYXJlIGRlZmluZWQgZm9yIGEKICBjbGFzcyBkZXJpdmVkIGZyb20gYSAiInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZSIgc3VjaCBhcwogICJpbnQiLCAiYnl0ZXMiLCBhbmQgInR1cGxlIi4KCiogQW55IG5vbi1zdHJpbmcgKml0ZXJhYmxlKiBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouCgoqIElmIGEgImRpY3Rpb25hcnkiIGlzIHVzZWQgdG8gYXNzaWduICpfX3Nsb3RzX18qLCB0aGUgZGljdGlvbmFyeSBrZXlzCiAgd2lsbCBiZSB1c2VkIGFzIHRoZSBzbG90IG5hbWVzLiBUaGUgdmFsdWVzIG9mIHRoZSBkaWN0aW9uYXJ5IGNhbiBiZQogIHVzZWQgdG8gcHJvdmlkZSBwZXItYXR0cmlidXRlIGRvY3N0cmluZ3MgdGhhdCB3aWxsIGJlIHJlY29nbmlzZWQgYnkKICAiaW5zcGVjdC5nZXRkb2MoKSIgYW5kIGRpc3BsYXllZCBpbiB0aGUgb3V0cHV0IG9mICJoZWxwKCkiLgoKKiAiX19jbGFzc19fIiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWUKICAqX19zbG90c19fKi4KCiogTXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2l0aCBtdWx0aXBsZSBzbG90dGVkIHBhcmVudCBjbGFzc2VzIGNhbiBiZQogIHVzZWQsIGJ1dCBvbmx5IG9uZSBwYXJlbnQgaXMgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZXMgY3JlYXRlZCBieQogIHNsb3RzICh0aGUgb3RoZXIgYmFzZXMgbXVzdCBoYXZlIGVtcHR5IHNsb3QgbGF5b3V0cykgLSB2aW9sYXRpb25zCiAgcmFpc2UgIlR5cGVFcnJvciIuCgoqIElmIGFuICppdGVyYXRvciogaXMgdXNlZCBmb3IgKl9fc2xvdHNfXyogdGhlbiBhICpkZXNjcmlwdG9yKiBpcwogIGNyZWF0ZWQgZm9yIGVhY2ggb2YgdGhlIGl0ZXJhdG9y4oCZcyB2YWx1ZXMuIEhvd2V2ZXIsIHRoZSAqX19zbG90c19fKgogIGF0dHJpYnV0ZSB3aWxsIGJlIGFuIGVtcHR5IGl0ZXJhdG9yLgp6FGF0dHJpYnV0ZS1yZWZlcmVuY2VzYVUDAABBdHRyaWJ1dGUgcmVmZXJlbmNlcwoqKioqKioqKioqKioqKioqKioqKgoKQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZToKCiAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllcgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHMKYXR0cmlidXRlIHJlZmVyZW5jZXMsIHdoaWNoIG1vc3Qgb2JqZWN0cyBkby4gIFRoaXMgb2JqZWN0IGlzIHRoZW4KYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlIGlkZW50aWZpZXIuIFRoZSB0eXBlCmFuZCB2YWx1ZSBwcm9kdWNlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucwpvZiB0aGUgc2FtZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIG1heSB5aWVsZCBkaWZmZXJlbnQgb2JqZWN0cy4KClRoaXMgcHJvZHVjdGlvbiBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZQoiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2Qgb3IgdGhlICJfX2dldGF0dHJfXygpIiBtZXRob2QuICBUaGUKIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGlzIGNhbGxlZCBmaXJzdCBhbmQgZWl0aGVyIHJldHVybnMgYSB2YWx1ZQpvciByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUuCgpJZiBhbiAiQXR0cmlidXRlRXJyb3IiIGlzIHJhaXNlZCBhbmQgdGhlIG9iamVjdCBoYXMgYSAiX19nZXRhdHRyX18oKSIKbWV0aG9kLCB0aGF0IG1ldGhvZCBpcyBjYWxsZWQgYXMgYSBmYWxsYmFjay4K2glhdWdhc3NpZ25h2wcAAEF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGEKYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6CgogICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pCiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nCiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSIKICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IgoKKFNlZSBzZWN0aW9uIFByaW1hcmllcyBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCB0aHJlZQpzeW1ib2xzLikKCkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbAphc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvbgpsaXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50Cm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC4KVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLgoKQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSByZXdyaXR0ZW4gYXMKInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluIHRoZQphdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsCnRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgcmF0aGVyIHRoYW4KY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkIG9iamVjdAppcyBtb2RpZmllZCBpbnN0ZWFkLgoKVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSBsZWZ0LQpoYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldCis9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCBwZXJmb3Jtcwp0aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLgoKV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYQpzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50CnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksCndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeQpvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWwKYmluYXJ5IG9wZXJhdGlvbnMuCgpGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCBhYm91dApjbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLgraBWF3YWl0espBd2FpdCBleHByZXNzaW9uCioqKioqKioqKioqKioqKioKClN1c3BlbmQgdGhlIGV4ZWN1dGlvbiBvZiAqY29yb3V0aW5lKiBvbiBhbiAqYXdhaXRhYmxlKiBvYmplY3QuIENhbgpvbmx5IGJlIHVzZWQgaW5zaWRlIGEgKmNvcm91dGluZSBmdW5jdGlvbiouCgogICBhd2FpdF9leHByIDo6PSAiYXdhaXQiIHByaW1hcnkKCk5ldyBpbiB2ZXJzaW9uIDMuNS4K2gZiaW5hcnl1GA4AAEJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5CmxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluIG5vbi0KbnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d28KbGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZQpvcGVyYXRvcnM6CgogICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICJAIiBtX2V4cHIgfAogICAgICAgICAgICAgIG1fZXhwciAiLy8iIHVfZXhwciB8IG1fZXhwciAiLyIgdV9leHByIHwKICAgICAgICAgICAgICBtX2V4cHIgIiUiIHVfZXhwcgogICBhX2V4cHIgOjo9IG1fZXhwciB8IGFfZXhwciAiKyIgbV9leHByIHwgYV9leHByICItIiBtX2V4cHIKClRoZSAiKiIgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzIGFyZ3VtZW50cy4KVGhlIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMsIG9yIG9uZSBhcmd1bWVudCBtdXN0IGJlIGFuCmludGVnZXIgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlCm51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZCB0aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuCkluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcyBwZXJmb3JtZWQ7IGEgbmVnYXRpdmUKcmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLgoKVGhpcyBvcGVyYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgdXNpbmcgdGhlIHNwZWNpYWwgIl9fbXVsX18oKSIgYW5kCiJfX3JtdWxfXygpIiBtZXRob2RzLgoKVGhlICJAIiAoYXQpIG9wZXJhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1hdHJpeAptdWx0aXBsaWNhdGlvbi4gIE5vIGJ1aWx0aW4gUHl0aG9uIHR5cGVzIGltcGxlbWVudCB0aGlzIG9wZXJhdG9yLgoKTmV3IGluIHZlcnNpb24gMy41LgoKVGhlICIvIiAoZGl2aXNpb24pIGFuZCAiLy8iIChmbG9vciBkaXZpc2lvbikgb3BlcmF0b3JzIHlpZWxkIHRoZQpxdW90aWVudCBvZiB0aGVpciBhcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0CmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiBEaXZpc2lvbiBvZiBpbnRlZ2VycyB5aWVsZHMgYSBmbG9hdCwgd2hpbGUKZmxvb3IgZGl2aXNpb24gb2YgaW50ZWdlcnMgcmVzdWx0cyBpbiBhbiBpbnRlZ2VyOyB0aGUgcmVzdWx0IGlzIHRoYXQKb2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uIHdpdGggdGhlIOKAmGZsb29y4oCZIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlCnJlc3VsdC4gIERpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHRoZSAiWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX3RydWVkaXZfXygpIiBhbmQKIl9fZmxvb3JkaXZfXygpIiBtZXRob2RzLgoKVGhlICIlIiAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZgp0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QKY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBBIHplcm8gcmlnaHQgYXJndW1lbnQgcmFpc2VzIHRoZQoiWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nIHBvaW50Cm51bWJlcnMsIGUuZy4sICIzLjE0JTAuNyIgZXF1YWxzICIwLjM0IiAoc2luY2UgIjMuMTQiIGVxdWFscyAiNCowLjcgKwowLjM0Ii4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aCB0aGUgc2FtZSBzaWduCmFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0IGlzCnN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kIFsxXS4KClRoZSBmbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmcKaWRlbnRpdHk6ICJ4ID09ICh4Ly95KSp5ICsgKHgleSkiLiAgRmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBhcmUgYWxzbwpjb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImRpdm1vZCgpIjogImRpdm1vZCh4LCB5KSA9PQooeC8veSwgeCV5KSIuIFsyXS4KCkluIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlICIlIgpvcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIG9iamVjdHMgdG8gcGVyZm9ybSBvbGQtc3R5bGUKc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuICBUaGUgc3ludGF4IGZvcgpzdHJpbmcgZm9ybWF0dGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSwKc2VjdGlvbiBwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcuCgpUaGUgKm1vZHVsbyogb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX21vZF9fKCkiCm1ldGhvZC4KClRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsbyBvcGVyYXRvciwgYW5kIHRoZSAiZGl2bW9kKCkiCmZ1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byBhCmZsb2F0aW5nIHBvaW50IG51bWJlciB1c2luZyB0aGUgImFicygpIiBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS4KClRoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlCmFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMgb3IgYm90aCBiZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUKdHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlCmFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlCmNvbmNhdGVuYXRlZC4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX2FkZF9fKCkiIGFuZAoiX19yYWRkX18oKSIgbWV0aG9kcy4KClRoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzIGFyZ3VtZW50cy4KVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX3N1Yl9fKCkiIG1ldGhvZC4K2gdiaXR3aXNlYTwDAABCaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKioqKioqKioKCkVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6CgogICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByCiAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwcgogICBvcl9leHByICA6Oj0geG9yX2V4cHIgfCBvcl9leHByICJ8IiB4b3JfZXhwcgoKVGhlICImIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoIG11c3QKYmUgaW50ZWdlcnMgb3Igb25lIG9mIHRoZW0gbXVzdCBiZSBhIGN1c3RvbSBvYmplY3Qgb3ZlcnJpZGluZwoiX19hbmRfXygpIiBvciAiX19yYW5kX18oKSIgc3BlY2lhbCBtZXRob2RzLgoKVGhlICJeIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0cwphcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgaW50ZWdlcnMgb3Igb25lIG9mIHRoZW0gbXVzdCBiZSBhIGN1c3RvbQpvYmplY3Qgb3ZlcnJpZGluZyAiX194b3JfXygpIiBvciAiX19yeG9yX18oKSIgc3BlY2lhbCBtZXRob2RzLgoKVGhlICJ8IiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cywKd2hpY2ggbXVzdCBiZSBpbnRlZ2VycyBvciBvbmUgb2YgdGhlbSBtdXN0IGJlIGEgY3VzdG9tIG9iamVjdApvdmVycmlkaW5nICJfX29yX18oKSIgb3IgIl9fcm9yX18oKSIgc3BlY2lhbCBtZXRob2RzLgp6EmJsdGluLWNvZGUtb2JqZWN0c3XjAgAAQ29kZSBPYmplY3RzCioqKioqKioqKioqKgoKQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQg4oCccHNldWRvLQpjb21waWxlZOKAnSBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiBib2R5LiBUaGV5IGRpZmZlcgpmcm9tIGZ1bmN0aW9uIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvbuKAmXQgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpcgpnbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSByZXR1cm5lZCBieSB0aGUgYnVpbHQtCmluICJjb21waWxlKCkiIGZ1bmN0aW9uIGFuZCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gZnVuY3Rpb24gb2JqZWN0cwp0aHJvdWdoIHRoZWlyICJfX2NvZGVfXyIgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgImNvZGUiIG1vZHVsZS4KCkFjY2Vzc2luZyAiX19jb2RlX18iIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAib2JqZWN0Ll9fZ2V0YXR0cl9fIgp3aXRoIGFyZ3VtZW50cyAib2JqIiBhbmQgIiJfX2NvZGVfXyIiLgoKQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgaXQgKGluc3RlYWQgb2YgYQpzb3VyY2Ugc3RyaW5nKSB0byB0aGUgImV4ZWMoKSIgb3IgImV2YWwoKSIgIGJ1aWx0LWluIGZ1bmN0aW9ucy4KClNlZSBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCnoVYmx0aW4tZWxsaXBzaXMtb2JqZWN0YS4BAABUaGUgRWxsaXBzaXMgT2JqZWN0CioqKioqKioqKioqKioqKioqKioKClRoaXMgb2JqZWN0IGlzIGNvbW1vbmx5IHVzZWQgYnkgc2xpY2luZyAoc2VlIFNsaWNpbmdzKS4gIEl0IHN1cHBvcnRzCm5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIGVsbGlwc2lzIG9iamVjdCwgbmFtZWQKIkVsbGlwc2lzIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKEVsbGlwc2lzKSgpIiBwcm9kdWNlcyB0aGUKIkVsbGlwc2lzIiBzaW5nbGV0b24uCgpJdCBpcyB3cml0dGVuIGFzICJFbGxpcHNpcyIgb3IgIi4uLiIuCnoRYmx0aW4tbnVsbC1vYmplY3R1HAEAAFRoZSBOdWxsIE9iamVjdAoqKioqKioqKioqKioqKioKClRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvbuKAmXQgZXhwbGljaXRseSByZXR1cm4gYQp2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGwKb2JqZWN0LCBuYW1lZCAiTm9uZSIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShOb25lKSgpIiBwcm9kdWNlcyB0aGUKc2FtZSBzaW5nbGV0b24uCgpJdCBpcyB3cml0dGVuIGFzICJOb25lIi4KehJibHRpbi10eXBlLW9iamVjdHN1NQEAAFR5cGUgT2JqZWN0cwoqKioqKioqKioqKioKClR5cGUgb2JqZWN0cyByZXByZXNlbnQgdGhlIHZhcmlvdXMgb2JqZWN0IHR5cGVzLiAgQW4gb2JqZWN04oCZcyB0eXBlIGlzCmFjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAidHlwZSgpIi4gIFRoZXJlIGFyZSBubyBzcGVjaWFsCm9wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlICJ0eXBlcyIgZGVmaW5lcyBuYW1lcyBmb3IKYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLgoKVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPGNsYXNzICdpbnQnPiIuCtoIYm9vbGVhbnNhwQUAAEJvb2xlYW4gb3BlcmF0aW9ucwoqKioqKioqKioqKioqKioqKioKCiAgIG9yX3Rlc3QgIDo6PSBhbmRfdGVzdCB8IG9yX3Rlc3QgIm9yIiBhbmRfdGVzdAogICBhbmRfdGVzdCA6Oj0gbm90X3Rlc3QgfCBhbmRfdGVzdCAiYW5kIiBub3RfdGVzdAogICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0CgpJbiB0aGUgY29udGV4dCBvZiBCb29sZWFuIG9wZXJhdGlvbnMsIGFuZCBhbHNvIHdoZW4gZXhwcmVzc2lvbnMgYXJlCnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZAphcyBmYWxzZTogIkZhbHNlIiwgIk5vbmUiLCBudW1lcmljIHplcm8gb2YgYWxsIHR5cGVzLCBhbmQgZW1wdHkKc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsCmRpY3Rpb25hcmllcywgc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZAphcyB0cnVlLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgY2FuIGN1c3RvbWl6ZSB0aGVpciB0cnV0aCB2YWx1ZSBieQpwcm92aWRpbmcgYSAiX19ib29sX18oKSIgbWV0aG9kLgoKVGhlIG9wZXJhdG9yICJub3QiIHlpZWxkcyAiVHJ1ZSIgaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLCAiRmFsc2UiCm90aGVyd2lzZS4KClRoZSBleHByZXNzaW9uICJ4IGFuZCB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgZmFsc2UsIGl0cwp2YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlCmlzIHJldHVybmVkLgoKVGhlIGV4cHJlc3Npb24gInggb3IgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIHRydWUsIGl0cyB2YWx1ZQppcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzCnJldHVybmVkLgoKTm90ZSB0aGF0IG5laXRoZXIgImFuZCIgbm9yICJvciIgcmVzdHJpY3QgdGhlIHZhbHVlIGFuZCB0eXBlIHRoZXkKcmV0dXJuIHRvICJGYWxzZSIgYW5kICJUcnVlIiwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgZXZhbHVhdGVkCmFyZ3VtZW50LiAgVGhpcyBpcyBzb21ldGltZXMgdXNlZnVsLCBlLmcuLCBpZiAicyIgaXMgYSBzdHJpbmcgdGhhdApzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIGVtcHR5LCB0aGUgZXhwcmVzc2lvbgoicyBvciAnZm9vJyIgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSAibm90IiBoYXMgdG8gY3JlYXRlIGEKbmV3IHZhbHVlLCBpdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGl0cwphcmd1bWVudCAoZm9yIGV4YW1wbGUsICJub3QgJ2ZvbyciIHByb2R1Y2VzICJGYWxzZSIgcmF0aGVyIHRoYW4gIicnIi4pCtoFYnJlYWthJAIAAFRoZSAiYnJlYWsiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioKCiAgIGJyZWFrX3N0bXQgOjo9ICJicmVhayIKCiJicmVhayIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiCmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdApsb29wLgoKSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsICJlbHNlIgpjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS4KCklmIGEgImZvciIgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0CmtlZXBzIGl0cyBjdXJyZW50IHZhbHVlLgoKV2hlbiAiYnJlYWsiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgImZpbmFsbHkiCmNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyB0aGUKbG9vcC4Keg5jYWxsYWJsZS10eXBlc3UCAQAARW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHMKKioqKioqKioqKioqKioqKioqKioqKioqKioKCm9iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pCgogICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMg4oCcY2FsbGVk4oCdIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kCiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIHJvdWdobHkgdHJhbnNsYXRlcyB0bwogICAidHlwZSh4KS5fX2NhbGxfXyh4LCBhcmcxLCAuLi4pIi4K2gVjYWxsc3WnGwAAQ2FsbHMKKioqKioKCkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgcG9zc2libHkKZW1wdHkgc2VyaWVzIG9mICphcmd1bWVudHMqOgoKICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdIHwgY29tcHJlaGVuc2lvbl0gIikiCiAgIGFyZ3VtZW50X2xpc3QgICAgICAgIDo6PSBwb3NpdGlvbmFsX2FyZ3VtZW50cyBbIiwiIHN0YXJyZWRfYW5kX2tleXdvcmRzXQogICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXQogICAgICAgICAgICAgICAgICAgICB8IHN0YXJyZWRfYW5kX2tleXdvcmRzIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXQogICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRzX2FyZ3VtZW50cwogICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gcG9zaXRpb25hbF9pdGVtICgiLCIgcG9zaXRpb25hbF9pdGVtKSoKICAgcG9zaXRpb25hbF9pdGVtICAgICAgOjo9IGFzc2lnbm1lbnRfZXhwcmVzc2lvbiB8ICIqIiBleHByZXNzaW9uCiAgIHN0YXJyZWRfYW5kX2tleXdvcmRzIDo6PSAoIioiIGV4cHJlc3Npb24gfCBrZXl3b3JkX2l0ZW0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiICIqIiBleHByZXNzaW9uIHwgIiwiIGtleXdvcmRfaXRlbSkqCiAgIGtleXdvcmRzX2FyZ3VtZW50cyAgIDo6PSAoa2V5d29yZF9pdGVtIHwgIioqIiBleHByZXNzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIga2V5d29yZF9pdGVtIHwgIiwiICIqKiIgZXhwcmVzc2lvbikqCiAgIGtleXdvcmRfaXRlbSAgICAgICAgIDo6PSBpZGVudGlmaWVyICI9IiBleHByZXNzaW9uCgpBbiBvcHRpb25hbCB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmQKa2V5d29yZCBhcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLgoKVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkCmZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzCm9iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MgaW5zdGFuY2VzLCBhbmQgYWxsIG9iamVjdHMgaGF2aW5nIGEKIl9fY2FsbF9fKCkiIG1ldGhvZCBhcmUgY2FsbGFibGUpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZQpldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsIGlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uCkZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy4KCklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8KcG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzIGlzCmNyZWF0ZWQgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycy4gIElmIHRoZXJlIGFyZSBOIHBvc2l0aW9uYWwKYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaAprZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUKY29ycmVzcG9uZGluZyBzbG90IChpZiB0aGUgaWRlbnRpZmllciBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgZm9ybWFsCnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXMKYWxyZWFkeSBmaWxsZWQsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGUKYXJndW1lbnQgaXMgcGxhY2VkIGluIHRoZSBzbG90LCBmaWxsaW5nIGl0IChldmVuIGlmIHRoZSBleHByZXNzaW9uIGlzCiJOb25lIiwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQsCnRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcKZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKERlZmF1bHQgdmFsdWVzIGFyZQpjYWxjdWxhdGVkLCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkOyB0aHVzLCBhIG11dGFibGUgb2JqZWN0CnN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2hhcmVkIGJ5CmFsbCBjYWxscyB0aGF0IGRvbuKAmXQgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSBhbnkgdW5maWxsZWQKc2xvdHMgZm9yIHdoaWNoIG5vIGRlZmF1bHQgdmFsdWUgaXMgc3BlY2lmaWVkLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbgppcyByYWlzZWQuICBPdGhlcndpc2UsIHRoZSBsaXN0IG9mIGZpbGxlZCBzbG90cyBpcyB1c2VkIGFzIHRoZQphcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC4KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUKYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlbgppZiB0aGV5IGFyZSDigJhuYW1lZOKAmSBmb3IgdGhlIHB1cnBvc2Ugb2YgZG9jdW1lbnRhdGlvbiwgYW5kIHdoaWNoCnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2UKZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlICJQeUFyZ19QYXJzZVR1cGxlKCkiIHRvIHBhcnNlCnRoZWlyIGFyZ3VtZW50cy4KCklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXIKc2xvdHMsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlcgp1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbApwYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMKKG9yIGFuIGVtcHR5IHR1cGxlIGlmIHRoZXJlIHdlcmUgbm8gZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzKS4KCklmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyCm5hbWUsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlcgp1c2luZyB0aGUgc3ludGF4ICIqKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWwKcGFyYW1ldGVyIHJlY2VpdmVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBleGNlc3Mga2V5d29yZAphcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzCmNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgbm8KZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLgoKSWYgdGhlIHN5bnRheCAiKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsICJleHByZXNzaW9uIgptdXN0IGV2YWx1YXRlIHRvIGFuICppdGVyYWJsZSouICBFbGVtZW50cyBmcm9tIHRoZXNlIGl0ZXJhYmxlcyBhcmUKdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZvciB0aGUgY2FsbAoiZih4MSwgeDIsICp5LCB4MywgeDQpIiwgaWYgKnkqIGV2YWx1YXRlcyB0byBhIHNlcXVlbmNlICp5MSosIOKApiwgKnlNKiwKdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB3aXRoIE0rNCBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAqeDIqLAoqeTEqLCDigKYsICp5TSosICp4MyosICp4NCouCgpBIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgIipleHByZXNzaW9uIiBzeW50YXggbWF5CmFwcGVhciAqYWZ0ZXIqIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSoKdGhlIGtleXdvcmQgYXJndW1lbnRzIChhbmQgYW55ICIqKmV4cHJlc3Npb24iIGFyZ3VtZW50cyDigJMgc2VlIGJlbG93KS4KU286CgogICA+Pj4gZGVmIGYoYSwgYik6CiAgIC4uLiAgICAgcHJpbnQoYSwgYikKICAgLi4uCiAgID4+PiBmKGI9MSwgKigyLCkpCiAgIDIgMQogICA+Pj4gZihhPTEsICooMiwpKQogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYScKICAgPj4+IGYoMSwgKigyLCkpCiAgIDEgMgoKSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4CnRvIGJlIHVzZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gaW4gcHJhY3RpY2UgdGhpcyBjb25mdXNpb24gZG9lcyBub3QKb2Z0ZW4gYXJpc2UuCgpJZiB0aGUgc3ludGF4ICIqKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsCiJleHByZXNzaW9uIiBtdXN0IGV2YWx1YXRlIHRvIGEgKm1hcHBpbmcqLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlCnRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gSWYgYSBwYXJhbWV0ZXIgbWF0Y2hpbmcgYSBrZXkKaGFzIGFscmVhZHkgYmVlbiBnaXZlbiBhIHZhbHVlIChieSBhbiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LCBvcgpmcm9tIGFub3RoZXIgdW5wYWNraW5nKSwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLgoKV2hlbiAiKipleHByZXNzaW9uIiBpcyB1c2VkLCBlYWNoIGtleSBpbiB0aGlzIG1hcHBpbmcgbXVzdCBiZSBhCnN0cmluZy4gRWFjaCB2YWx1ZSBmcm9tIHRoZSBtYXBwaW5nIGlzIGFzc2lnbmVkIHRvIHRoZSBmaXJzdCBmb3JtYWwKcGFyYW1ldGVyIGVsaWdpYmxlIGZvciBrZXl3b3JkIGFzc2lnbm1lbnQgd2hvc2UgbmFtZSBpcyBlcXVhbCB0byB0aGUKa2V5LiBBIGtleSBuZWVkIG5vdCBiZSBhIFB5dGhvbiBpZGVudGlmaWVyIChlLmcuICIibWF4LXRlbXAgwrBGIiIgaXMKYWNjZXB0YWJsZSwgYWx0aG91Z2ggaXQgd2lsbCBub3QgbWF0Y2ggYW55IGZvcm1hbCBwYXJhbWV0ZXIgdGhhdCBjb3VsZApiZSBkZWNsYXJlZCkuIElmIHRoZXJlIGlzIG5vIG1hdGNoIHRvIGEgZm9ybWFsIHBhcmFtZXRlciB0aGUga2V5LXZhbHVlCnBhaXIgaXMgY29sbGVjdGVkIGJ5IHRoZSAiKioiIHBhcmFtZXRlciwgaWYgdGhlcmUgaXMgb25lLCBvciBpZiB0aGVyZQppcyBub3QsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4KCkZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIgpjYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnQKbmFtZXMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy41OiBGdW5jdGlvbiBjYWxscyBhY2NlcHQgYW55IG51bWJlciBvZiAiKiIgYW5kCiIqKiIgdW5wYWNraW5ncywgcG9zaXRpb25hbCBhcmd1bWVudHMgbWF5IGZvbGxvdyBpdGVyYWJsZSB1bnBhY2tpbmdzCigiKiIpLCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyBkaWN0aW9uYXJ5IHVucGFja2luZ3MgKCIqKiIpLgpPcmlnaW5hbGx5IHByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLgoKQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5ICJOb25lIiwgdW5sZXNzIGl0IHJhaXNlcyBhbgpleGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZQpjYWxsYWJsZSBvYmplY3QuCgpJZiBpdCBpc+KAlAoKYSB1c2VyLWRlZmluZWQgZnVuY3Rpb246CiAgIFRoZSBjb2RlIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlCiAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kIHRoZQogICBmb3JtYWwgcGFyYW1ldGVycyB0byB0aGUgYXJndW1lbnRzOyB0aGlzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uCiAgIEZ1bmN0aW9uIGRlZmluaXRpb25zLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhICJyZXR1cm4iCiAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KCmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOgogICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlIEJ1aWx0LWluIEZ1bmN0aW9ucyBmb3IgdGhlCiAgIGRlc2NyaXB0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuCgphIGNsYXNzIG9iamVjdDoKICAgQSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBpcyByZXR1cm5lZC4KCmEgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOgogICBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aXRoIGFuIGFyZ3VtZW50CiAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZQogICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC4KCmEgY2xhc3MgaW5zdGFuY2U6CiAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhICJfX2NhbGxfXygpIiBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlbiB0aGUKICAgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLgraBWNsYXNzdbILAABDbGFzcyBkZWZpbml0aW9ucwoqKioqKioqKioqKioqKioqKgoKQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uIFRoZSBzdGFuZGFyZAp0eXBlIGhpZXJhcmNoeSk6CgogICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlCiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2FyZ3VtZW50X2xpc3RdICIpIgogICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllcgoKQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlIGxpc3QKdXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgTWV0YWNsYXNzZXMgZm9yIG1vcmUKYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYSBjbGFzcwpvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlIGxpc3QKaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsCgogICBjbGFzcyBGb286CiAgICAgICBwYXNzCgppcyBlcXVpdmFsZW50IHRvCgogICBjbGFzcyBGb28ob2JqZWN0KToKICAgICAgIHBhc3MKClRoZSBjbGFzc+KAmXMgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZQpOYW1pbmcgYW5kIGJpbmRpbmcpLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGUKb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHkKZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3PigJlzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzCmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs1XSBBCmNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSBiYXNlCmNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS4KVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsCm5hbWVzcGFjZS4KClRoZSBvcmRlciBpbiB3aGljaCBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGluIHRoZSBjbGFzcyBib2R5IGlzCnByZXNlcnZlZCBpbiB0aGUgbmV3IGNsYXNz4oCZcyAiX19kaWN0X18iLiAgTm90ZSB0aGF0IHRoaXMgaXMgcmVsaWFibGUKb25seSByaWdodCBhZnRlciB0aGUgY2xhc3MgaXMgY3JlYXRlZCBhbmQgb25seSBmb3IgY2xhc3NlcyB0aGF0IHdlcmUKZGVmaW5lZCB1c2luZyB0aGUgZGVmaW5pdGlvbiBzeW50YXguCgpDbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nIG1ldGFjbGFzc2VzLgoKQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLAoKICAgQGYxKGFyZykKICAgQGYyCiAgIGNsYXNzIEZvbzogcGFzcwoKaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCgogICBjbGFzcyBGb286IHBhc3MKICAgRm9vID0gZjEoYXJnKShmMihGb28pKQoKVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvcgpmdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBpcyB0aGVuIGJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuOTogQ2xhc3NlcyBtYXkgYmUgZGVjb3JhdGVkIHdpdGggYW55IHZhbGlkCiJhc3NpZ25tZW50X2V4cHJlc3Npb24iLiBQcmV2aW91c2x5LCB0aGUgZ3JhbW1hciB3YXMgbXVjaCBtb3JlCnJlc3RyaWN0aXZlOyBzZWUgKipQRVAgNjE0KiogZm9yIGRldGFpbHMuCgoqKlByb2dyYW1tZXLigJlzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlCmNsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSBhdHRyaWJ1dGVzCmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmQKaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiDigJwic2VsZi5uYW1lIuKAnSwKYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdHMKZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0bwp1bmV4cGVjdGVkIHJlc3VsdHMuICBEZXNjcmlwdG9ycyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2UKdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMwMDAKICAgICBUaGUgcHJvcG9zYWwgdGhhdCBjaGFuZ2VkIHRoZSBkZWNsYXJhdGlvbiBvZiBtZXRhY2xhc3NlcyB0byB0aGUKICAgICBjdXJyZW50IHN5bnRheCwgYW5kIHRoZSBzZW1hbnRpY3MgZm9yIGhvdyBjbGFzc2VzIHdpdGgKICAgICBtZXRhY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQuCgogICoqUEVQIDMxMjkqKiAtIENsYXNzIERlY29yYXRvcnMKICAgICBUaGUgcHJvcG9zYWwgdGhhdCBhZGRlZCBjbGFzcyBkZWNvcmF0b3JzLiAgRnVuY3Rpb24gYW5kIG1ldGhvZAogICAgIGRlY29yYXRvcnMgd2VyZSBpbnRyb2R1Y2VkIGluICoqUEVQIDMxOCoqLgraC2NvbXBhcmlzb25zdQ4oAABDb21wYXJpc29ucwoqKioqKioqKioqKgoKVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksCndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZQpvcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlICJhIDwgYiA8IGMiIGhhdmUgdGhlCmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOgoKICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoY29tcF9vcGVyYXRvciBvcl9leHByKSoKICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIiE9IgogICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIgoKQ29tcGFyaXNvbnMgeWllbGQgYm9vbGVhbiB2YWx1ZXM6ICJUcnVlIiBvciAiRmFsc2UiLiBDdXN0b20gKnJpY2gKY29tcGFyaXNvbiBtZXRob2RzKiBtYXkgcmV0dXJuIG5vbi1ib29sZWFuIHZhbHVlcy4gSW4gdGhpcyBjYXNlIFB5dGhvbgp3aWxsIGNhbGwgImJvb2woKSIgb24gc3VjaCB2YWx1ZSBpbiBib29sZWFuIGNvbnRleHRzLgoKQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpcwplcXVpdmFsZW50IHRvICJ4IDwgeSBhbmQgeSA8PSB6IiwgZXhjZXB0IHRoYXQgInkiIGlzIGV2YWx1YXRlZCBvbmx5Cm9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgeSIgaXMKZm91bmQgdG8gYmUgZmFsc2UpLgoKRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIOKApiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKiwKKm9wMiosIOKApiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5Cm9wTiB6IiBpcyBlcXVpdmFsZW50IHRvICJhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4geiIsIGV4Y2VwdAp0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLgoKTm90ZSB0aGF0ICJhIG9wMSBiIG9wMiBjIiBkb2VzbuKAmXQgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuCiphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCAieCA8IHkgPiB6IiBpcyBwZXJmZWN0bHkgbGVnYWwgKHRob3VnaApwZXJoYXBzIG5vdCBwcmV0dHkpLgoKClZhbHVlIGNvbXBhcmlzb25zCj09PT09PT09PT09PT09PT09CgpUaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlIHRoZSB2YWx1ZXMKb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lIHR5cGUuCgpDaGFwdGVyIE9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMgc3RhdGVzIHRoYXQgb2JqZWN0cyBoYXZlIGEgdmFsdWUgKGluCmFkZGl0aW9uIHRvIHR5cGUgYW5kIGlkZW50aXR5KS4gIFRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMgYSByYXRoZXIKYWJzdHJhY3Qgbm90aW9uIGluIFB5dGhvbjogRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbCBhY2Nlc3MKbWV0aG9kIGZvciBhbiBvYmplY3TigJlzIHZhbHVlLiAgQWxzbywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdGhhdCB0aGUKdmFsdWUgb2YgYW4gb2JqZWN0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBpbiBhIHBhcnRpY3VsYXIgd2F5LCBlLmcuCmNvbXByaXNlZCBvZiBhbGwgaXRzIGRhdGEgYXR0cmlidXRlcy4gQ29tcGFyaXNvbiBvcGVyYXRvcnMgaW1wbGVtZW50IGEKcGFydGljdWxhciBub3Rpb24gb2Ygd2hhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzLiAgT25lIGNhbiB0aGluayBvZgp0aGVtIGFzIGRlZmluaW5nIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaW5kaXJlY3RseSwgYnkgbWVhbnMgb2YgdGhlaXIKY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbi4KCkJlY2F1c2UgYWxsIHR5cGVzIGFyZSAoZGlyZWN0IG9yIGluZGlyZWN0KSBzdWJ0eXBlcyBvZiAib2JqZWN0IiwgdGhleQppbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IgZnJvbSAib2JqZWN0Ii4gIFR5cGVzIGNhbgpjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggY29tcGFyaXNvbgptZXRob2RzKiBsaWtlICJfX2x0X18oKSIsIGRlc2NyaWJlZCBpbiBCYXNpYyBjdXN0b21pemF0aW9uLgoKVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb24gKCI9PSIgYW5kICIhPSIpIGlzIGJhc2VkCm9uIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4gIEhlbmNlLCBlcXVhbGl0eSBjb21wYXJpc29uIG9mCmluc3RhbmNlcyB3aXRoIHRoZSBzYW1lIGlkZW50aXR5IHJlc3VsdHMgaW4gZXF1YWxpdHksIGFuZCBlcXVhbGl0eQpjb21wYXJpc29uIG9mIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBpZGVudGl0aWVzIHJlc3VsdHMgaW4KaW5lcXVhbGl0eS4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBkZXNpcmUgdGhhdAphbGwgb2JqZWN0cyBzaG91bGQgYmUgcmVmbGV4aXZlIChpLmUuICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSIpLgoKQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90IHByb3ZpZGVkOwphbiBhdHRlbXB0IHJhaXNlcyAiVHlwZUVycm9yIi4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yCmlzIHRoZSBsYWNrIG9mIGEgc2ltaWxhciBpbnZhcmlhbnQgYXMgZm9yIGVxdWFsaXR5LgoKVGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IGVxdWFsaXR5IGNvbXBhcmlzb24sIHRoYXQgaW5zdGFuY2VzIHdpdGgKZGlmZmVyZW50IGlkZW50aXRpZXMgYXJlIGFsd2F5cyB1bmVxdWFsLCBtYXkgYmUgaW4gY29udHJhc3QgdG8gd2hhdAp0eXBlcyB3aWxsIG5lZWQgdGhhdCBoYXZlIGEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiBvYmplY3QgdmFsdWUgYW5kCnZhbHVlLWJhc2VkIGVxdWFsaXR5LiAgU3VjaCB0eXBlcyB3aWxsIG5lZWQgdG8gY3VzdG9taXplIHRoZWlyCmNvbXBhcmlzb24gYmVoYXZpb3IsIGFuZCBpbiBmYWN0LCBhIG51bWJlciBvZiBidWlsdC1pbiB0eXBlcyBoYXZlIGRvbmUKdGhhdC4KClRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIGNvbXBhcmlzb24gYmVoYXZpb3Igb2YgdGhlIG1vc3QKaW1wb3J0YW50IGJ1aWx0LWluIHR5cGVzLgoKKiBOdW1iZXJzIG9mIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgKE51bWVyaWMgVHlwZXMg4oCUIGludCwgZmxvYXQsCiAgY29tcGxleCkgYW5kIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHR5cGVzICJmcmFjdGlvbnMuRnJhY3Rpb24iIGFuZAogICJkZWNpbWFsLkRlY2ltYWwiIGNhbiBiZSBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcywKICB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0IGNvbXBsZXggbnVtYmVycyBkbyBub3Qgc3VwcG9ydCBvcmRlcgogIGNvbXBhcmlzb24uICBXaXRoaW4gdGhlIGxpbWl0cyBvZiB0aGUgdHlwZXMgaW52b2x2ZWQsIHRoZXkgY29tcGFyZQogIG1hdGhlbWF0aWNhbGx5IChhbGdvcml0aG1pY2FsbHkpIGNvcnJlY3Qgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4KCiAgVGhlIG5vdC1hLW51bWJlciB2YWx1ZXMgImZsb2F0KCdOYU4nKSIgYW5kICJkZWNpbWFsLkRlY2ltYWwoJ05hTicpIgogIGFyZSBzcGVjaWFsLiAgQW55IG9yZGVyZWQgY29tcGFyaXNvbiBvZiBhIG51bWJlciB0byBhIG5vdC1hLW51bWJlcgogIHZhbHVlIGlzIGZhbHNlLiBBIGNvdW50ZXItaW50dWl0aXZlIGltcGxpY2F0aW9uIGlzIHRoYXQgbm90LWEtbnVtYmVyCiAgdmFsdWVzIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcy4gIEZvciBleGFtcGxlLCBpZiAieCA9CiAgZmxvYXQoJ05hTicpIiwgIjMgPCB4IiwgInggPCAzIiBhbmQgInggPT0geCIgYXJlIGFsbCBmYWxzZSwgd2hpbGUgIngKICAhPSB4IiBpcyB0cnVlLiAgVGhpcyBiZWhhdmlvciBpcyBjb21wbGlhbnQgd2l0aCBJRUVFIDc1NC4KCiogIk5vbmUiIGFuZCAiTm90SW1wbGVtZW50ZWQiIGFyZSBzaW5nbGV0b25zLiAgKipQRVAgOCoqIGFkdmlzZXMgdGhhdAogIGNvbXBhcmlzb25zIGZvciBzaW5nbGV0b25zIHNob3VsZCBhbHdheXMgYmUgZG9uZSB3aXRoICJpcyIgb3IgImlzCiAgbm90IiwgbmV2ZXIgdGhlIGVxdWFsaXR5IG9wZXJhdG9ycy4KCiogQmluYXJ5IHNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJieXRlcyIgb3IgImJ5dGVhcnJheSIpIGNhbiBiZQogIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlCiAgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZWlyIGVsZW1lbnRzLgoKKiBTdHJpbmdzIChpbnN0YW5jZXMgb2YgInN0ciIpIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlCiAgbnVtZXJpY2FsIFVuaWNvZGUgY29kZSBwb2ludHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCiAgIm9yZCgpIikgb2YgdGhlaXIgY2hhcmFjdGVycy4gWzNdCgogIFN0cmluZ3MgYW5kIGJpbmFyeSBzZXF1ZW5jZXMgY2Fubm90IGJlIGRpcmVjdGx5IGNvbXBhcmVkLgoKKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiBiZSBjb21wYXJlZAogIG9ubHkgd2l0aGluIGVhY2ggb2YgdGhlaXIgdHlwZXMsIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgcmFuZ2VzIGRvCiAgbm90IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbi4gIEVxdWFsaXR5IGNvbXBhcmlzb24gYWNyb3NzIHRoZXNlCiAgdHlwZXMgcmVzdWx0cyBpbiBpbmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiBhY3Jvc3MgdGhlc2UKICB0eXBlcyByYWlzZXMgIlR5cGVFcnJvciIuCgogIFNlcXVlbmNlcyBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2YKICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhlIGJ1aWx0LWluIGNvbnRhaW5lcnMgdHlwaWNhbGx5IGFzc3VtZQogIGlkZW50aWNhbCBvYmplY3RzIGFyZSBlcXVhbCB0byB0aGVtc2VsdmVzLiAgVGhhdCBsZXRzIHRoZW0gYnlwYXNzCiAgZXF1YWxpdHkgdGVzdHMgZm9yIGlkZW50aWNhbCBvYmplY3RzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHRvCiAgbWFpbnRhaW4gdGhlaXIgaW50ZXJuYWwgaW52YXJpYW50cy4KCiAgTGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBidWlsdC1pbiBjb2xsZWN0aW9ucyB3b3JrcyBhcwogIGZvbGxvd3M6CgogICogRm9yIHR3byBjb2xsZWN0aW9ucyB0byBjb21wYXJlIGVxdWFsLCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUKICAgIHR5cGUsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgZWFjaCBwYWlyIG9mIGNvcnJlc3BvbmRpbmcKICAgIGVsZW1lbnRzIG11c3QgY29tcGFyZSBlcXVhbCAoZm9yIGV4YW1wbGUsICJbMSwyXSA9PSAoMSwyKSIgaXMKICAgIGZhbHNlIGJlY2F1c2UgdGhlIHR5cGUgaXMgbm90IHRoZSBzYW1lKS4KCiAgKiBDb2xsZWN0aW9ucyB0aGF0IHN1cHBvcnQgb3JkZXIgY29tcGFyaXNvbiBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcwogICAgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9IFsxLDIseV0iCiAgICBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgInggPD0geSIpLiAgSWYgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcwogICAgbm90IGV4aXN0LCB0aGUgc2hvcnRlciBjb2xsZWN0aW9uIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLAogICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuCgoqIE1hcHBpbmdzIChpbnN0YW5jZXMgb2YgImRpY3QiKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkKICBoYXZlIGVxdWFsICIoa2V5LCB2YWx1ZSkiIHBhaXJzLiBFcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSBrZXlzIGFuZAogIHZhbHVlcyBlbmZvcmNlcyByZWZsZXhpdml0eS4KCiAgT3JkZXIgY29tcGFyaXNvbnMgKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgcmFpc2UgIlR5cGVFcnJvciIuCgoqIFNldHMgKGluc3RhbmNlcyBvZiAic2V0IiBvciAiZnJvemVuc2V0IikgY2FuIGJlIGNvbXBhcmVkIHdpdGhpbiBhbmQKICBhY3Jvc3MgdGhlaXIgdHlwZXMuCgogIFRoZXkgZGVmaW5lIG9yZGVyIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIG1lYW4gc3Vic2V0IGFuZCBzdXBlcnNldAogIHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzIChmb3IgZXhhbXBsZSwKICB0aGUgdHdvIHNldHMgInsxLDJ9IiBhbmQgInsyLDN9IiBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmUKICBhbm90aGVyLCBub3Igc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyKS4gIEFjY29yZGluZ2x5LCBzZXRzIGFyZSBub3QKICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgb3JkZXJpbmcKICAoZm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkCiAgcmVzdWx0cyBnaXZlbiBhIGxpc3Qgb2Ygc2V0cyBhcyBpbnB1dHMpLgoKICBDb21wYXJpc29uIG9mIHNldHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkgb2YgaXRzIGVsZW1lbnRzLgoKKiBNb3N0IG90aGVyIGJ1aWx0LWluIHR5cGVzIGhhdmUgbm8gY29tcGFyaXNvbiBtZXRob2RzIGltcGxlbWVudGVkLCBzbwogIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLgoKVXNlci1kZWZpbmVkIGNsYXNzZXMgdGhhdCBjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBzaG91bGQKZm9sbG93IHNvbWUgY29uc2lzdGVuY3kgcnVsZXMsIGlmIHBvc3NpYmxlOgoKKiBFcXVhbGl0eSBjb21wYXJpc29uIHNob3VsZCBiZSByZWZsZXhpdmUuIEluIG90aGVyIHdvcmRzLCBpZGVudGljYWwKICBvYmplY3RzIHNob3VsZCBjb21wYXJlIGVxdWFsOgoKICAgICAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiCgoqIENvbXBhcmlzb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4gSW4gb3RoZXIgd29yZHMsIHRoZSBmb2xsb3dpbmcKICBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6CgogICAgICJ4ID09IHkiIGFuZCAieSA9PSB4IgoKICAgICAieCAhPSB5IiBhbmQgInkgIT0geCIKCiAgICAgInggPCB5IiBhbmQgInkgPiB4IgoKICAgICAieCA8PSB5IiBhbmQgInkgPj0geCIKCiogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAobm9uLWV4aGF1c3RpdmUpCiAgZXhhbXBsZXMgaWxsdXN0cmF0ZSB0aGF0OgoKICAgICAieCA+IHkgYW5kIHkgPiB6IiBpbXBsaWVzICJ4ID4geiIKCiAgICAgInggPCB5IGFuZCB5IDw9IHoiIGltcGxpZXMgInggPCB6IgoKKiBJbnZlcnNlIGNvbXBhcmlzb24gc2hvdWxkIHJlc3VsdCBpbiB0aGUgYm9vbGVhbiBuZWdhdGlvbi4gSW4gb3RoZXIKICB3b3JkcywgdGhlIGZvbGxvd2luZyBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6CgogICAgICJ4ID09IHkiIGFuZCAibm90IHggIT0geSIKCiAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpCgogICAgICJ4ID4geSIgYW5kICJub3QgeCA8PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKQoKICBUaGUgbGFzdCB0d28gZXhwcmVzc2lvbnMgYXBwbHkgdG8gdG90YWxseSBvcmRlcmVkIGNvbGxlY3Rpb25zIChlLmcuCiAgdG8gc2VxdWVuY2VzLCBidXQgbm90IHRvIHNldHMgb3IgbWFwcGluZ3MpLiBTZWUgYWxzbyB0aGUKICAidG90YWxfb3JkZXJpbmcoKSIgZGVjb3JhdG9yLgoKKiBUaGUgImhhc2goKSIgcmVzdWx0IHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZXF1YWxpdHkuIE9iamVjdHMgdGhhdAogIGFyZSBlcXVhbCBzaG91bGQgZWl0aGVyIGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZSwgb3IgYmUgbWFya2VkIGFzCiAgdW5oYXNoYWJsZS4KClB5dGhvbiBkb2VzIG5vdCBlbmZvcmNlIHRoZXNlIGNvbnNpc3RlbmN5IHJ1bGVzLiBJbiBmYWN0LCB0aGUKbm90LWEtbnVtYmVyIHZhbHVlcyBhcmUgYW4gZXhhbXBsZSBmb3Igbm90IGZvbGxvd2luZyB0aGVzZSBydWxlcy4KCgpNZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyIKZXZhbHVhdGVzIHRvICJUcnVlIiBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgIkZhbHNlIiBvdGhlcndpc2UuCiJ4IG5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXMKYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiB0ZXN0cwp3aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzCmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZQpleHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlIGZvciBlIGluCnkpIi4KCkZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgIlRydWUiIGlmIGFuZCBvbmx5IGlmICp4KgppcyBhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuCkVtcHR5IHN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlcgpzdHJpbmcsIHNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4CmluIHkiIHJldHVybnMgIlRydWUiIGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgcmV0dXJucyBhIHRydWUgdmFsdWUsIGFuZAoiRmFsc2UiIG90aGVyd2lzZS4KCkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgYnV0IGRvCmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzICJUcnVlIiBpZiBzb21lIHZhbHVlICJ6IiwgZm9yIHdoaWNoCnRoZSBleHByZXNzaW9uICJ4IGlzIHogb3IgeCA9PSB6IiBpcyB0cnVlLCBpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcKb3ZlciAieSIuIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmCiJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLgoKTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzCiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgIlRydWUiIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLQpuZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggaXMgeVtpXSBvciB4ID09IHlbaV0iLCBhbmQgbm8KbG93ZXIgaW50ZWdlciBpbmRleCByYWlzZXMgdGhlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyCmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS4KClRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUgb2YKImluIi4KCgpJZGVudGl0eSBjb21wYXJpc29ucwo9PT09PT09PT09PT09PT09PT09PQoKVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBhbiBvYmplY3TigJlzIGlkZW50aXR5OiAieCBpcwp5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICBBbgpPYmplY3TigJlzIGlkZW50aXR5IGlzIGRldGVybWluZWQgdXNpbmcgdGhlICJpZCgpIiBmdW5jdGlvbi4gICJ4IGlzIG5vdAp5IiB5aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XQraCGNvbXBvdW5kdf/FAABDb21wb3VuZCBzdGF0ZW1lbnRzCioqKioqKioqKioqKioqKioqKioKCkNvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5IGFmZmVjdApvciBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhvc2Ugb3RoZXIgc3RhdGVtZW50cyBpbiBzb21lIHdheS4gIEluCmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlCmluY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSBsaW5lLgoKVGhlICJpZiIsICJ3aGlsZSIgYW5kICJmb3IiIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsIGNvbnRyb2wKZmxvdyBjb25zdHJ1Y3RzLiAgInRyeSIgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cApjb2RlIGZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHMsIHdoaWxlIHRoZSAid2l0aCIgc3RhdGVtZW50IGFsbG93cyB0aGUKZXhlY3V0aW9uIG9mIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gY29kZSBhcm91bmQgYSBibG9jayBvZgpjb2RlLiAgRnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgY29tcG91bmQKc3RhdGVtZW50cy4KCkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIOKAmGNsYXVzZXMu4oCZICBBIGNsYXVzZQpjb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSDigJhzdWl0ZS7igJkgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhCnBhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwuCkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHMKd2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhCmNsYXVzZS4gIEEgc3VpdGUgY2FuIGJlIG9uZSBvciBtb3JlIHNlbWljb2xvbi1zZXBhcmF0ZWQgc2ltcGxlCnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlcuKAmXMKY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnQKbGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZApzdGF0ZW1lbnRzOyB0aGUgZm9sbG93aW5nIGlzIGlsbGVnYWwsIG1vc3RseSBiZWNhdXNlIGl0IHdvdWxkbuKAmXQgYmUKY2xlYXIgdG8gd2hpY2ggImlmIiBjbGF1c2UgYSBmb2xsb3dpbmcgImVsc2UiIGNsYXVzZSB3b3VsZCBiZWxvbmc6CgogICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50KHgpCgpBbHNvIG5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIGJpbmRzIHRpZ2h0ZXIgdGhhbiB0aGUgY29sb24gaW4gdGhpcwpjb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZQoicHJpbnQoKSIgY2FsbHMgYXJlIGV4ZWN1dGVkOgoKICAgaWYgeCA8IHkgPCB6OiBwcmludCh4KTsgcHJpbnQoeSk7IHByaW50KHopCgpTdW1tYXJpemluZzoKCiAgIGNvbXBvdW5kX3N0bXQgOjo9IGlmX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10CiAgICAgICAgICAgICAgICAgICAgIHwgZm9yX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCB0cnlfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IG1hdGNoX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmCiAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWYKICAgICAgICAgICAgICAgICAgICAgfCBhc3luY193aXRoX3N0bXQKICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mb3Jfc3RtdAogICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Z1bmNkZWYKICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCBzdGF0ZW1lbnQrIERFREVOVAogICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXQKICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdCgpOb3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEKIkRFREVOVCIuICBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMgYmVnaW4Kd2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vCmFtYmlndWl0aWVzICh0aGUg4oCYZGFuZ2xpbmcgImVsc2Ui4oCZIHByb2JsZW0gaXMgc29sdmVkIGluIFB5dGhvbiBieQpyZXF1aXJpbmcgbmVzdGVkICJpZiIgc3RhdGVtZW50cyB0byBiZSBpbmRlbnRlZCkuCgpUaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlcwplYWNoIGNsYXVzZSBvbiBhIHNlcGFyYXRlIGxpbmUgZm9yIGNsYXJpdHkuCgoKVGhlICJpZiIgc3RhdGVtZW50Cj09PT09PT09PT09PT09PT09PQoKVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjoKCiAgIGlmX3N0bXQgOjo9ICJpZiIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAoImVsaWYiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAiOiIgc3VpdGUpKgogICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KCkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmUKYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuIG9wZXJhdGlvbnMKZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkCihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS4KSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZgpwcmVzZW50LCBpcyBleGVjdXRlZC4KCgpUaGUgIndoaWxlIiBzdGF0ZW1lbnQKPT09PT09PT09PT09PT09PT09PT09CgpUaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW4KZXhwcmVzc2lvbiBpcyB0cnVlOgoKICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBhc3NpZ25tZW50X2V4cHJlc3Npb24gIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlCmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lCml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZAphbmQgdGhlIGxvb3AgdGVybWluYXRlcy4KCkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3AKd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2XigJlzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudApleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzIGJhY2sKdG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi4KCgpUaGUgImZvciIgc3RhdGVtZW50Cj09PT09PT09PT09PT09PT09PT0KClRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UKKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDoKCiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIHN0YXJyZWRfbGlzdCAiOiIgc3VpdGUKICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKVGhlICJzdGFycmVkX2xpc3QiIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbgoqaXRlcmFibGUqIG9iamVjdC4gIEFuICppdGVyYXRvciogaXMgY3JlYXRlZCBmb3IgdGhhdCBpdGVyYWJsZS4gVGhlCmZpcnN0IGl0ZW0gcHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yIGlzIHRoZW4gYXNzaWduZWQgdG8gdGhlIHRhcmdldApsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYXNzaWdubWVudHMgKHNlZSBBc3NpZ25tZW50CnN0YXRlbWVudHMpLCBhbmQgdGhlIHN1aXRlIGlzIGV4ZWN1dGVkLiAgVGhpcyByZXBlYXRzIGZvciBlYWNoIGl0ZW0KcHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLiAgV2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLCB0aGUgc3VpdGUKaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3AKdGVybWluYXRlcy4KCkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3AKd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2XigJlzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudApleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXMKd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHQKaXRlbS4KClRoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzIGluIHRoZSB0YXJnZXQgbGlzdC4KVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nCnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDoKCiAgIGZvciBpIGluIHJhbmdlKDEwKToKICAgICAgIHByaW50KGkpCiAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcAogICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZQoKTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLApidXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdAphbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gdHlwZSAicmFuZ2UoKSIgcmVwcmVzZW50cwppbW11dGFibGUgYXJpdGhtZXRpYyBzZXF1ZW5jZXMgb2YgaW50ZWdlcnMuIEZvciBpbnN0YW5jZSwgaXRlcmF0aW5nCiJyYW5nZSgzKSIgc3VjY2Vzc2l2ZWx5IHlpZWxkcyAwLCAxLCBhbmQgdGhlbiAyLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IFN0YXJyZWQgZWxlbWVudHMgYXJlIG5vdyBhbGxvd2VkIGluIHRoZQpleHByZXNzaW9uIGxpc3QuCgoKVGhlICJ0cnkiIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09CgpUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZQpmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOgoKICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXQgfCB0cnkzX3N0bXQKICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiBzdWl0ZSkrCiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdCiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgKCJleGNlcHQiICIqIiBleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdICI6IiBzdWl0ZSkrCiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdCiAgIHRyeTNfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZQoKQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uCkV4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG8gZ2VuZXJhdGUKZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LgoKCiJleGNlcHQiIGNsYXVzZQotLS0tLS0tLS0tLS0tLS0KClRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm8KZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpcwpleGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuCmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSAiZXhjZXB0IgpjbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiBBbgpleHByZXNzaW9uLWxlc3MgImV4Y2VwdCIgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMKYW55IGV4Y2VwdGlvbi4gRm9yIGFuICJleGNlcHQiIGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQKZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUKcmVzdWx0aW5nIG9iamVjdCBpcyDigJxjb21wYXRpYmxl4oCdIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcwpjb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgdGhlIGNsYXNzIG9yIGEgKm5vbi0KdmlydHVhbCBiYXNlIGNsYXNzKiBvZiB0aGUgZXhjZXB0aW9uIG9iamVjdCwgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuCml0ZW0gdGhhdCBpcyB0aGUgY2xhc3Mgb3IgYSBub24tdmlydHVhbCBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24Kb2JqZWN0LgoKSWYgbm8gImV4Y2VwdCIgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4KZXhjZXB0aW9uIGhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUKaW52b2NhdGlvbiBzdGFjay4gIFsxXQoKSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuICJleGNlcHQiIGNsYXVzZQpyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kCmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uCnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZAp0aGUgZXhjZXB0aW9uKS4KCldoZW4gYSBtYXRjaGluZyAiZXhjZXB0IiBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG8KdGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0ICJleGNlcHQiIGNsYXVzZSwKaWYgcHJlc2VudCwgYW5kIHRoZSAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLiBBbGwgImV4Y2VwdCIKY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMKcmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlICJ0cnkiCnN0YXRlbWVudC4gKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZQpleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlIG9mIHRoZSBpbm5lcgpoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pCgpXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZAphdCB0aGUgZW5kIG9mIHRoZSAiZXhjZXB0IiBjbGF1c2UuICBUaGlzIGlzIGFzIGlmCgogICBleGNlcHQgRSBhcyBOOgogICAgICAgZm9vCgp3YXMgdHJhbnNsYXRlZCB0bwoKICAgZXhjZXB0IEUgYXMgTjoKICAgICAgIHRyeToKICAgICAgICAgICBmb28KICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgZGVsIE4KClRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmUKYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgImV4Y2VwdCIgY2xhdXNlLiBFeGNlcHRpb25zIGFyZSBjbGVhcmVkCmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZQpjeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmUKdW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy4KCkJlZm9yZSBhbiAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLCB0aGUgZXhjZXB0aW9uIGlzIHN0b3JlZAppbiB0aGUgInN5cyIgbW9kdWxlLCB3aGVyZSBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIGJvZHkgb2YKdGhlICJleGNlcHQiIGNsYXVzZSBieSBjYWxsaW5nICJzeXMuZXhjZXB0aW9uKCkiLiBXaGVuIGxlYXZpbmcgYW4KZXhjZXB0aW9uIGhhbmRsZXIsIHRoZSBleGNlcHRpb24gc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgaXMgcmVzZXQKdG8gaXRzIHByZXZpb3VzIHZhbHVlOgoKICAgPj4+IHByaW50KHN5cy5leGNlcHRpb24oKSkKICAgTm9uZQogICA+Pj4gdHJ5OgogICAuLi4gICAgIHJhaXNlIFR5cGVFcnJvcgogICAuLi4gZXhjZXB0OgogICAuLi4gICAgIHByaW50KHJlcHIoc3lzLmV4Y2VwdGlvbigpKSkKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgIC4uLiAgICAgZXhjZXB0OgogICAuLi4gICAgICAgICBwcmludChyZXByKHN5cy5leGNlcHRpb24oKSkpCiAgIC4uLiAgICAgcHJpbnQocmVwcihzeXMuZXhjZXB0aW9uKCkpKQogICAuLi4KICAgVHlwZUVycm9yKCkKICAgVmFsdWVFcnJvcigpCiAgIFR5cGVFcnJvcigpCiAgID4+PiBwcmludChzeXMuZXhjZXB0aW9uKCkpCiAgIE5vbmUKCgoiZXhjZXB0KiIgY2xhdXNlCi0tLS0tLS0tLS0tLS0tLS0KClRoZSAiZXhjZXB0KiIgY2xhdXNlKHMpIGFyZSB1c2VkIGZvciBoYW5kbGluZyAiRXhjZXB0aW9uR3JvdXAicy4gVGhlCmV4Y2VwdGlvbiB0eXBlIGZvciBtYXRjaGluZyBpcyBpbnRlcnByZXRlZCBhcyBpbiB0aGUgY2FzZSBvZiAiZXhjZXB0IiwKYnV0IGluIHRoZSBjYXNlIG9mIGV4Y2VwdGlvbiBncm91cHMgd2UgY2FuIGhhdmUgcGFydGlhbCBtYXRjaGVzIHdoZW4KdGhlIHR5cGUgbWF0Y2hlcyBzb21lIG9mIHRoZSBleGNlcHRpb25zIGluIHRoZSBncm91cC4gVGhpcyBtZWFucyB0aGF0Cm11bHRpcGxlICJleGNlcHQqIiBjbGF1c2VzIGNhbiBleGVjdXRlLCBlYWNoIGhhbmRsaW5nIHBhcnQgb2YgdGhlCmV4Y2VwdGlvbiBncm91cC4gRWFjaCBjbGF1c2UgZXhlY3V0ZXMgYXQgbW9zdCBvbmNlIGFuZCBoYW5kbGVzIGFuCmV4Y2VwdGlvbiBncm91cCBvZiBhbGwgbWF0Y2hpbmcgZXhjZXB0aW9ucy4gIEVhY2ggZXhjZXB0aW9uIGluIHRoZQpncm91cCBpcyBoYW5kbGVkIGJ5IGF0IG1vc3Qgb25lICJleGNlcHQqIiBjbGF1c2UsIHRoZSBmaXJzdCB0aGF0Cm1hdGNoZXMgaXQuCgogICA+Pj4gdHJ5OgogICAuLi4gICAgIHJhaXNlIEV4Y2VwdGlvbkdyb3VwKCJlZyIsCiAgIC4uLiAgICAgICAgIFtWYWx1ZUVycm9yKDEpLCBUeXBlRXJyb3IoMiksIE9TRXJyb3IoMyksIE9TRXJyb3IoNCldKQogICAuLi4gZXhjZXB0KiBUeXBlRXJyb3IgYXMgZToKICAgLi4uICAgICBwcmludChmJ2NhdWdodCB7dHlwZShlKX0gd2l0aCBuZXN0ZWQge2UuZXhjZXB0aW9uc30nKQogICAuLi4gZXhjZXB0KiBPU0Vycm9yIGFzIGU6CiAgIC4uLiAgICAgcHJpbnQoZidjYXVnaHQge3R5cGUoZSl9IHdpdGggbmVzdGVkIHtlLmV4Y2VwdGlvbnN9JykKICAgLi4uCiAgIGNhdWdodCA8Y2xhc3MgJ0V4Y2VwdGlvbkdyb3VwJz4gd2l0aCBuZXN0ZWQgKFR5cGVFcnJvcigyKSwpCiAgIGNhdWdodCA8Y2xhc3MgJ0V4Y2VwdGlvbkdyb3VwJz4gd2l0aCBuZXN0ZWQgKE9TRXJyb3IoMyksIE9TRXJyb3IoNCkpCiAgICAgKyBFeGNlcHRpb24gR3JvdXAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIHwgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPgogICAgIHwgRXhjZXB0aW9uR3JvdXA6IGVnCiAgICAgKy0rLS0tLS0tLS0tLS0tLS0tLSAxIC0tLS0tLS0tLS0tLS0tLS0KICAgICAgIHwgVmFsdWVFcnJvcjogMQogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQW55IHJlbWFpbmluZyBleGNlcHRpb25zIHRoYXQgd2VyZSBub3QgaGFuZGxlZCBieSBhbnkgImV4Y2VwdCoiIGNsYXVzZQphcmUgcmUtcmFpc2VkIGF0IHRoZSBlbmQsIGNvbWJpbmVkIGludG8gYW4gZXhjZXB0aW9uIGdyb3VwIGFsb25nIHdpdGgKYWxsIGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHJhaXNlZCBmcm9tIHdpdGhpbiAiZXhjZXB0KiIgY2xhdXNlcy4KCkZyb20gdmVyc2lvbiAzLjExLjQsIHdoZW4gdGhlIGVudGlyZSAiRXhjZXB0aW9uR3JvdXAiIGlzIGhhbmRsZWQgYW5kCm9ubHkgb25lIGV4Y2VwdGlvbiBpcyByYWlzZWQgZnJvbSBhbiAiZXhjZXB0KiIgY2xhdXNlLCB0aGlzIGV4Y2VwdGlvbgppcyBubyBsb25nZXIgd3JhcHBlZCB0byBmb3JtIGEgbmV3ICJFeGNlcHRpb25Hcm91cCIuCgpJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QgYW4gZXhjZXB0aW9uIGdyb3VwIGFuZCBpdHMgdHlwZSBtYXRjaGVzCm9uZSBvZiB0aGUgImV4Y2VwdCoiIGNsYXVzZXMsIGl0IGlzIGNhdWdodCBhbmQgd3JhcHBlZCBieSBhbiBleGNlcHRpb24KZ3JvdXAgd2l0aCBhbiBlbXB0eSBtZXNzYWdlIHN0cmluZy4KCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcmFpc2UgQmxvY2tpbmdJT0Vycm9yCiAgIC4uLiBleGNlcHQqIEJsb2NraW5nSU9FcnJvciBhcyBlOgogICAuLi4gICAgIHByaW50KHJlcHIoZSkpCiAgIC4uLgogICBFeGNlcHRpb25Hcm91cCgnJywgKEJsb2NraW5nSU9FcnJvcigpKSkKCkFuICJleGNlcHQqIiBjbGF1c2UgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgdHlwZSwgYW5kIHRoaXMgdHlwZSBjYW5ub3QgYmUKYSBzdWJjbGFzcyBvZiAiQmFzZUV4Y2VwdGlvbkdyb3VwIi4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIG1peCAiZXhjZXB0IgphbmQgImV4Y2VwdCoiIGluIHRoZSBzYW1lICJ0cnkiLiAiYnJlYWsiLCAiY29udGludWUiIGFuZCAicmV0dXJuIgpjYW5ub3QgYXBwZWFyIGluIGFuICJleGNlcHQqIiBjbGF1c2UuCgoKImVsc2UiIGNsYXVzZQotLS0tLS0tLS0tLS0tCgpUaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiB0aGUgY29udHJvbCBmbG93IGxlYXZlcyB0aGUKInRyeSIgc3VpdGUsIG5vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLCBhbmQgbm8gInJldHVybiIsICJjb250aW51ZSIsIG9yCiJicmVhayIgc3RhdGVtZW50IHdhcyBleGVjdXRlZC4gIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlCm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy4KCgoiZmluYWxseSIgY2xhdXNlCi0tLS0tLS0tLS0tLS0tLS0KCklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSDigJhjbGVhbnVw4oCZIGhhbmRsZXIuICBUaGUgInRyeSIKY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuCmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlCmV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQuICBJZgp0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiCmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkCmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSIKY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZApleGNlcHRpb24gaXMgZGlzY2FyZGVkOgoKICAgPj4+IGRlZiBmKCk6CiAgIC4uLiAgICAgdHJ5OgogICAuLi4gICAgICAgICAxLzAKICAgLi4uICAgICBmaW5hbGx5OgogICAuLi4gICAgICAgICByZXR1cm4gNDIKICAgLi4uCiAgID4+PiBmKCkKICAgNDIKClRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmcKZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLgoKV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZQoidHJ5IiBzdWl0ZSBvZiBhICJ0cnki4oCmImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXMKYWxzbyBleGVjdXRlZCDigJhvbiB0aGUgd2F5IG91dC7igJkKClRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iCnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYQoicmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlCmxhc3Qgb25lIGV4ZWN1dGVkOgoKICAgPj4+IGRlZiBmb28oKToKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5JwogICAuLi4gICAgIGZpbmFsbHk6CiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseScKICAgLi4uCiAgID4+PiBmb28oKQogICAnZmluYWxseScKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFByaW9yIHRvIFB5dGhvbiAzLjgsIGEgImNvbnRpbnVlIiBzdGF0ZW1lbnQKd2FzIGlsbGVnYWwgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2UgZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHRoZQppbXBsZW1lbnRhdGlvbi4KCgpUaGUgIndpdGgiIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PQoKVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoCm1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gV2l0aCBTdGF0ZW1lbnQKQ29udGV4dCBNYW5hZ2VycykuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5IuKApiJleGNlcHQi4oCmImZpbmFsbHkiIHVzYWdlCnBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS4KCiAgIHdpdGhfc3RtdCAgICAgICAgICA6Oj0gIndpdGgiICggIigiIHdpdGhfc3RtdF9jb250ZW50cyAiLCI/ICIpIiB8IHdpdGhfc3RtdF9jb250ZW50cyApICI6IiBzdWl0ZQogICB3aXRoX3N0bXRfY29udGVudHMgOjo9IHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqCiAgIHdpdGhfaXRlbSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdCgpUaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lIOKAnGl0ZW3igJ0gcHJvY2VlZHMgYXMKZm9sbG93czoKCjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIikgaXMKICAgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci4KCjIuIFRoZSBjb250ZXh0IG1hbmFnZXLigJlzICJfX2VudGVyX18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuCgozLiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuCgo0LiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLgoKNS4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuIHZhbHVlCiAgIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC4KCiAgIE5vdGU6CgogICAgIFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIiBtZXRob2QKICAgICByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlCiAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZQogICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nCiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNyBiZWxvdy4KCjYuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC4KCjcuIFRoZSBjb250ZXh0IG1hbmFnZXLigJlzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuCiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmQKICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCB0aHJlZQogICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC4KCiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlCiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLgogICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZAogICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIgogICBzdGF0ZW1lbnQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlCiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzCiAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uCgpUaGUgZm9sbG93aW5nIGNvZGU6CgogICB3aXRoIEVYUFJFU1NJT04gYXMgVEFSR0VUOgogICAgICAgU1VJVEUKCmlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgbWFuYWdlciA9IChFWFBSRVNTSU9OKQogICBlbnRlciA9IHR5cGUobWFuYWdlcikuX19lbnRlcl9fCiAgIGV4aXQgPSB0eXBlKG1hbmFnZXIpLl9fZXhpdF9fCiAgIHZhbHVlID0gZW50ZXIobWFuYWdlcikKICAgaGl0X2V4Y2VwdCA9IEZhbHNlCgogICB0cnk6CiAgICAgICBUQVJHRVQgPSB2YWx1ZQogICAgICAgU1VJVEUKICAgZXhjZXB0OgogICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKICAgICAgIGlmIG5vdCBleGl0KG1hbmFnZXIsICpzeXMuZXhjX2luZm8oKSk6CiAgICAgICAgICAgcmFpc2UKICAgZmluYWxseToKICAgICAgIGlmIG5vdCBoaXRfZXhjZXB0OgogICAgICAgICAgIGV4aXQobWFuYWdlciwgTm9uZSwgTm9uZSwgTm9uZSkKCldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmCm11bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOgoKICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6CiAgICAgICBTVUlURQoKaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86CgogICB3aXRoIEEoKSBhcyBhOgogICAgICAgd2l0aCBCKCkgYXMgYjoKICAgICAgICAgICBTVUlURQoKWW91IGNhbiBhbHNvIHdyaXRlIG11bHRpLWl0ZW0gY29udGV4dCBtYW5hZ2VycyBpbiBtdWx0aXBsZSBsaW5lcyBpZgp0aGUgaXRlbXMgYXJlIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMuIEZvciBleGFtcGxlOgoKICAgd2l0aCAoCiAgICAgICBBKCkgYXMgYSwKICAgICAgIEIoKSBhcyBiLAogICApOgogICAgICAgU1VJVEUKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMDogU3VwcG9ydCBmb3IgdXNpbmcgZ3JvdXBpbmcgcGFyZW50aGVzZXMgdG8KYnJlYWsgdGhlIHN0YXRlbWVudCBpbiBtdWx0aXBsZSBsaW5lcy4KClNlZSBhbHNvOgoKICAqKlBFUCAzNDMqKiAtIFRoZSDigJx3aXRo4oCdIHN0YXRlbWVudAogICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiCiAgICAgc3RhdGVtZW50LgoKClRoZSAibWF0Y2giIHN0YXRlbWVudAo9PT09PT09PT09PT09PT09PT09PT0KCk5ldyBpbiB2ZXJzaW9uIDMuMTAuCgpUaGUgbWF0Y2ggc3RhdGVtZW50IGlzIHVzZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcuICBTeW50YXg6CgogICBtYXRjaF9zdG10ICAgOjo9ICdtYXRjaCcgc3ViamVjdF9leHByICI6IiBORVdMSU5FIElOREVOVCBjYXNlX2Jsb2NrKyBERURFTlQKICAgc3ViamVjdF9leHByIDo6PSBzdGFyX25hbWVkX2V4cHJlc3Npb24gIiwiIHN0YXJfbmFtZWRfZXhwcmVzc2lvbnM/CiAgICAgICAgICAgICAgICAgICAgfCBuYW1lZF9leHByZXNzaW9uCiAgIGNhc2VfYmxvY2sgICA6Oj0gJ2Nhc2UnIHBhdHRlcm5zIFtndWFyZF0gIjoiIGJsb2NrCgpOb3RlOgoKICBUaGlzIHNlY3Rpb24gdXNlcyBzaW5nbGUgcXVvdGVzIHRvIGRlbm90ZSBzb2Z0IGtleXdvcmRzLgoKUGF0dGVybiBtYXRjaGluZyB0YWtlcyBhIHBhdHRlcm4gYXMgaW5wdXQgKGZvbGxvd2luZyAiY2FzZSIpIGFuZCBhCnN1YmplY3QgdmFsdWUgKGZvbGxvd2luZyAibWF0Y2giKS4gIFRoZSBwYXR0ZXJuICh3aGljaCBtYXkgY29udGFpbgpzdWJwYXR0ZXJucykgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWJqZWN0IHZhbHVlLiAgVGhlIG91dGNvbWVzIGFyZToKCiogQSBtYXRjaCBzdWNjZXNzIG9yIGZhaWx1cmUgKGFsc28gdGVybWVkIGEgcGF0dGVybiBzdWNjZXNzIG9yCiAgZmFpbHVyZSkuCgoqIFBvc3NpYmxlIGJpbmRpbmcgb2YgbWF0Y2hlZCB2YWx1ZXMgdG8gYSBuYW1lLiAgVGhlIHByZXJlcXVpc2l0ZXMgZm9yCiAgdGhpcyBhcmUgZnVydGhlciBkaXNjdXNzZWQgYmVsb3cuCgpUaGUgIm1hdGNoIiBhbmQgImNhc2UiIGtleXdvcmRzIGFyZSBzb2Z0IGtleXdvcmRzLgoKU2VlIGFsc286CgogICogKipQRVAgNjM0Kiog4oCTIFN0cnVjdHVyYWwgUGF0dGVybiBNYXRjaGluZzogU3BlY2lmaWNhdGlvbgoKICAqICoqUEVQIDYzNioqIOKAkyBTdHJ1Y3R1cmFsIFBhdHRlcm4gTWF0Y2hpbmc6IFR1dG9yaWFsCgoKT3ZlcnZpZXcKLS0tLS0tLS0KCkhlcmXigJlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsb2dpY2FsIGZsb3cgb2YgYSBtYXRjaCBzdGF0ZW1lbnQ6CgoxLiBUaGUgc3ViamVjdCBleHByZXNzaW9uICJzdWJqZWN0X2V4cHIiIGlzIGV2YWx1YXRlZCBhbmQgYSByZXN1bHRpbmcKICAgc3ViamVjdCB2YWx1ZSBvYnRhaW5lZC4gSWYgdGhlIHN1YmplY3QgZXhwcmVzc2lvbiBjb250YWlucyBhIGNvbW1hLAogICBhIHR1cGxlIGlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlcy4KCjIuIEVhY2ggcGF0dGVybiBpbiBhICJjYXNlX2Jsb2NrIiBpcyBhdHRlbXB0ZWQgdG8gbWF0Y2ggd2l0aCB0aGUKICAgc3ViamVjdCB2YWx1ZS4gVGhlIHNwZWNpZmljIHJ1bGVzIGZvciBzdWNjZXNzIG9yIGZhaWx1cmUgYXJlCiAgIGRlc2NyaWJlZCBiZWxvdy4gVGhlIG1hdGNoIGF0dGVtcHQgY2FuIGFsc28gYmluZCBzb21lIG9yIGFsbCBvZiB0aGUKICAgc3RhbmRhbG9uZSBuYW1lcyB3aXRoaW4gdGhlIHBhdHRlcm4uIFRoZSBwcmVjaXNlIHBhdHRlcm4gYmluZGluZwogICBydWxlcyB2YXJ5IHBlciBwYXR0ZXJuIHR5cGUgYW5kIGFyZSBzcGVjaWZpZWQgYmVsb3cuICAqKk5hbWUKICAgYmluZGluZ3MgbWFkZSBkdXJpbmcgYSBzdWNjZXNzZnVsIHBhdHRlcm4gbWF0Y2ggb3V0bGl2ZSB0aGUKICAgZXhlY3V0ZWQgYmxvY2sgYW5kIGNhbiBiZSB1c2VkIGFmdGVyIHRoZSBtYXRjaCBzdGF0ZW1lbnQqKi4KCiAgIE5vdGU6CgogICAgIER1cmluZyBmYWlsZWQgcGF0dGVybiBtYXRjaGVzLCBzb21lIHN1YnBhdHRlcm5zIG1heSBzdWNjZWVkLiAgRG8KICAgICBub3QgcmVseSBvbiBiaW5kaW5ncyBiZWluZyBtYWRlIGZvciBhIGZhaWxlZCBtYXRjaC4gIENvbnZlcnNlbHksCiAgICAgZG8gbm90IHJlbHkgb24gdmFyaWFibGVzIHJlbWFpbmluZyB1bmNoYW5nZWQgYWZ0ZXIgYSBmYWlsZWQKICAgICBtYXRjaC4gIFRoZSBleGFjdCBiZWhhdmlvciBpcyBkZXBlbmRlbnQgb24gaW1wbGVtZW50YXRpb24gYW5kIG1heQogICAgIHZhcnkuICBUaGlzIGlzIGFuIGludGVudGlvbmFsIGRlY2lzaW9uIG1hZGUgdG8gYWxsb3cgZGlmZmVyZW50CiAgICAgaW1wbGVtZW50YXRpb25zIHRvIGFkZCBvcHRpbWl6YXRpb25zLgoKMy4gSWYgdGhlIHBhdHRlcm4gc3VjY2VlZHMsIHRoZSBjb3JyZXNwb25kaW5nIGd1YXJkIChpZiBwcmVzZW50KSBpcwogICBldmFsdWF0ZWQuIEluIHRoaXMgY2FzZSBhbGwgbmFtZSBiaW5kaW5ncyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCiAgIGhhcHBlbmVkLgoKICAgKiBJZiB0aGUgZ3VhcmQgZXZhbHVhdGVzIGFzIHRydWUgb3IgaXMgbWlzc2luZywgdGhlICJibG9jayIgaW5zaWRlCiAgICAgImNhc2VfYmxvY2siIGlzIGV4ZWN1dGVkLgoKICAgKiBPdGhlcndpc2UsIHRoZSBuZXh0ICJjYXNlX2Jsb2NrIiBpcyBhdHRlbXB0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgoKICAgKiBJZiB0aGVyZSBhcmUgbm8gZnVydGhlciBjYXNlIGJsb2NrcywgdGhlIG1hdGNoIHN0YXRlbWVudCBpcwogICAgIGNvbXBsZXRlZC4KCk5vdGU6CgogIFVzZXJzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgcmVseSBvbiBhIHBhdHRlcm4gYmVpbmcgZXZhbHVhdGVkLgogIERlcGVuZGluZyBvbiBpbXBsZW1lbnRhdGlvbiwgdGhlIGludGVycHJldGVyIG1heSBjYWNoZSB2YWx1ZXMgb3IgdXNlCiAgb3RoZXIgb3B0aW1pemF0aW9ucyB3aGljaCBza2lwIHJlcGVhdGVkIGV2YWx1YXRpb25zLgoKQSBzYW1wbGUgbWF0Y2ggc3RhdGVtZW50OgoKICAgPj4+IGZsYWcgPSBGYWxzZQogICA+Pj4gbWF0Y2ggKDEwMCwgMjAwKToKICAgLi4uICAgIGNhc2UgKDEwMCwgMzAwKTogICMgTWlzbWF0Y2g6IDIwMCAhPSAzMDAKICAgLi4uICAgICAgICBwcmludCgnQ2FzZSAxJykKICAgLi4uICAgIGNhc2UgKDEwMCwgMjAwKSBpZiBmbGFnOiAgIyBTdWNjZXNzZnVsIG1hdGNoLCBidXQgZ3VhcmQgZmFpbHMKICAgLi4uICAgICAgICBwcmludCgnQ2FzZSAyJykKICAgLi4uICAgIGNhc2UgKDEwMCwgeSk6ICAjIE1hdGNoZXMgYW5kIGJpbmRzIHkgdG8gMjAwCiAgIC4uLiAgICAgICAgcHJpbnQoZidDYXNlIDMsIHk6IHt5fScpCiAgIC4uLiAgICBjYXNlIF86ICAjIFBhdHRlcm4gbm90IGF0dGVtcHRlZAogICAuLi4gICAgICAgIHByaW50KCdDYXNlIDQsIEkgbWF0Y2ggYW55dGhpbmchJykKICAgLi4uCiAgIENhc2UgMywgeTogMjAwCgpJbiB0aGlzIGNhc2UsICJpZiBmbGFnIiBpcyBhIGd1YXJkLiAgUmVhZCBtb3JlIGFib3V0IHRoYXQgaW4gdGhlIG5leHQKc2VjdGlvbi4KCgpHdWFyZHMKLS0tLS0tCgogICBndWFyZCA6Oj0gImlmIiBuYW1lZF9leHByZXNzaW9uCgpBICJndWFyZCIgKHdoaWNoIGlzIHBhcnQgb2YgdGhlICJjYXNlIikgbXVzdCBzdWNjZWVkIGZvciBjb2RlIGluc2lkZQp0aGUgImNhc2UiIGJsb2NrIHRvIGV4ZWN1dGUuICBJdCB0YWtlcyB0aGUgZm9ybTogImlmIiBmb2xsb3dlZCBieSBhbgpleHByZXNzaW9uLgoKVGhlIGxvZ2ljYWwgZmxvdyBvZiBhICJjYXNlIiBibG9jayB3aXRoIGEgImd1YXJkIiBmb2xsb3dzOgoKMS4gQ2hlY2sgdGhhdCB0aGUgcGF0dGVybiBpbiB0aGUgImNhc2UiIGJsb2NrIHN1Y2NlZWRlZC4gIElmIHRoZQogICBwYXR0ZXJuIGZhaWxlZCwgdGhlICJndWFyZCIgaXMgbm90IGV2YWx1YXRlZCBhbmQgdGhlIG5leHQgImNhc2UiCiAgIGJsb2NrIGlzIGNoZWNrZWQuCgoyLiBJZiB0aGUgcGF0dGVybiBzdWNjZWVkZWQsIGV2YWx1YXRlIHRoZSAiZ3VhcmQiLgoKICAgKiBJZiB0aGUgImd1YXJkIiBjb25kaXRpb24gZXZhbHVhdGVzIGFzIHRydWUsIHRoZSBjYXNlIGJsb2NrIGlzCiAgICAgc2VsZWN0ZWQuCgogICAqIElmIHRoZSAiZ3VhcmQiIGNvbmRpdGlvbiBldmFsdWF0ZXMgYXMgZmFsc2UsIHRoZSBjYXNlIGJsb2NrIGlzCiAgICAgbm90IHNlbGVjdGVkLgoKICAgKiBJZiB0aGUgImd1YXJkIiByYWlzZXMgYW4gZXhjZXB0aW9uIGR1cmluZyBldmFsdWF0aW9uLCB0aGUKICAgICBleGNlcHRpb24gYnViYmxlcyB1cC4KCkd1YXJkcyBhcmUgYWxsb3dlZCB0byBoYXZlIHNpZGUgZWZmZWN0cyBhcyB0aGV5IGFyZSBleHByZXNzaW9ucy4KR3VhcmQgZXZhbHVhdGlvbiBtdXN0IHByb2NlZWQgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIGxhc3QgY2FzZSBibG9jaywKb25lIGF0IGEgdGltZSwgc2tpcHBpbmcgY2FzZSBibG9ja3Mgd2hvc2UgcGF0dGVybihzKSBkb27igJl0IGFsbApzdWNjZWVkLiAoSS5lLiwgZ3VhcmQgZXZhbHVhdGlvbiBtdXN0IGhhcHBlbiBpbiBvcmRlci4pIEd1YXJkCmV2YWx1YXRpb24gbXVzdCBzdG9wIG9uY2UgYSBjYXNlIGJsb2NrIGlzIHNlbGVjdGVkLgoKCklycmVmdXRhYmxlIENhc2UgQmxvY2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBbiBpcnJlZnV0YWJsZSBjYXNlIGJsb2NrIGlzIGEgbWF0Y2gtYWxsIGNhc2UgYmxvY2suICBBIG1hdGNoCnN0YXRlbWVudCBtYXkgaGF2ZSBhdCBtb3N0IG9uZSBpcnJlZnV0YWJsZSBjYXNlIGJsb2NrLCBhbmQgaXQgbXVzdCBiZQpsYXN0LgoKQSBjYXNlIGJsb2NrIGlzIGNvbnNpZGVyZWQgaXJyZWZ1dGFibGUgaWYgaXQgaGFzIG5vIGd1YXJkIGFuZCBpdHMKcGF0dGVybiBpcyBpcnJlZnV0YWJsZS4gIEEgcGF0dGVybiBpcyBjb25zaWRlcmVkIGlycmVmdXRhYmxlIGlmIHdlIGNhbgpwcm92ZSBmcm9tIGl0cyBzeW50YXggYWxvbmUgdGhhdCBpdCB3aWxsIGFsd2F5cyBzdWNjZWVkLiAgT25seSB0aGUKZm9sbG93aW5nIHBhdHRlcm5zIGFyZSBpcnJlZnV0YWJsZToKCiogQVMgUGF0dGVybnMgd2hvc2UgbGVmdC1oYW5kIHNpZGUgaXMgaXJyZWZ1dGFibGUKCiogT1IgUGF0dGVybnMgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgaXJyZWZ1dGFibGUgcGF0dGVybgoKKiBDYXB0dXJlIFBhdHRlcm5zCgoqIFdpbGRjYXJkIFBhdHRlcm5zCgoqIHBhcmVudGhlc2l6ZWQgaXJyZWZ1dGFibGUgcGF0dGVybnMKCgpQYXR0ZXJucwotLS0tLS0tLQoKTm90ZToKCiAgVGhpcyBzZWN0aW9uIHVzZXMgZ3JhbW1hciBub3RhdGlvbnMgYmV5b25kIHN0YW5kYXJkIEVCTkY6CgogICogdGhlIG5vdGF0aW9uICJTRVAuUlVMRSsiIGlzIHNob3J0aGFuZCBmb3IgIlJVTEUgKFNFUCBSVUxFKSoiCgogICogdGhlIG5vdGF0aW9uICIhUlVMRSIgaXMgc2hvcnRoYW5kIGZvciBhIG5lZ2F0aXZlIGxvb2thaGVhZAogICAgYXNzZXJ0aW9uCgpUaGUgdG9wLWxldmVsIHN5bnRheCBmb3IgInBhdHRlcm5zIiBpczoKCiAgIHBhdHRlcm5zICAgICAgIDo6PSBvcGVuX3NlcXVlbmNlX3BhdHRlcm4gfCBwYXR0ZXJuCiAgIHBhdHRlcm4gICAgICAgIDo6PSBhc19wYXR0ZXJuIHwgb3JfcGF0dGVybgogICBjbG9zZWRfcGF0dGVybiA6Oj0gfCBsaXRlcmFsX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgY2FwdHVyZV9wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IHdpbGRjYXJkX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWVfcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgfCBncm91cF9wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlX3BhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgIHwgbWFwcGluZ19wYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzX3BhdHRlcm4KClRoZSBkZXNjcmlwdGlvbnMgYmVsb3cgd2lsbCBpbmNsdWRlIGEgZGVzY3JpcHRpb24g4oCcaW4gc2ltcGxlIHRlcm1z4oCdIG9mCndoYXQgYSBwYXR0ZXJuIGRvZXMgZm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcyAoY3JlZGl0cyB0byBSYXltb25kCkhldHRpbmdlciBmb3IgYSBkb2N1bWVudCB0aGF0IGluc3BpcmVkIG1vc3Qgb2YgdGhlIGRlc2NyaXB0aW9ucykuIE5vdGUKdGhhdCB0aGVzZSBkZXNjcmlwdGlvbnMgYXJlIHB1cmVseSBmb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzIGFuZCAqKm1heQpub3QqKiByZWZsZWN0IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLiAgRnVydGhlcm1vcmUsIHRoZXkgZG8gbm90CmNvdmVyIGFsbCB2YWxpZCBmb3Jtcy4KCgpPUiBQYXR0ZXJucwp+fn5+fn5+fn5+fgoKQW4gT1IgcGF0dGVybiBpcyB0d28gb3IgbW9yZSBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgdmVydGljYWwgYmFycyAifCIuClN5bnRheDoKCiAgIG9yX3BhdHRlcm4gOjo9ICJ8Ii5jbG9zZWRfcGF0dGVybisKCk9ubHkgdGhlIGZpbmFsIHN1YnBhdHRlcm4gbWF5IGJlIGlycmVmdXRhYmxlLCBhbmQgZWFjaCBzdWJwYXR0ZXJuIG11c3QKYmluZCB0aGUgc2FtZSBzZXQgb2YgbmFtZXMgdG8gYXZvaWQgYW1iaWd1aXR5LgoKQW4gT1IgcGF0dGVybiBtYXRjaGVzIGVhY2ggb2YgaXRzIHN1YnBhdHRlcm5zIGluIHR1cm4gdG8gdGhlIHN1YmplY3QKdmFsdWUsIHVudGlsIG9uZSBzdWNjZWVkcy4gIFRoZSBPUiBwYXR0ZXJuIGlzIHRoZW4gY29uc2lkZXJlZApzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBpZiBub25lIG9mIHRoZSBzdWJwYXR0ZXJucyBzdWNjZWVkLCB0aGUgT1IKcGF0dGVybiBmYWlscy4KCkluIHNpbXBsZSB0ZXJtcywgIlAxIHwgUDIgfCAuLi4iIHdpbGwgdHJ5IHRvIG1hdGNoICJQMSIsIGlmIGl0IGZhaWxzCml0IHdpbGwgdHJ5IHRvIG1hdGNoICJQMiIsIHN1Y2NlZWRpbmcgaW1tZWRpYXRlbHkgaWYgYW55IHN1Y2NlZWRzLApmYWlsaW5nIG90aGVyd2lzZS4KCgpBUyBQYXR0ZXJucwp+fn5+fn5+fn5+fgoKQW4gQVMgcGF0dGVybiBtYXRjaGVzIGFuIE9SIHBhdHRlcm4gb24gdGhlIGxlZnQgb2YgdGhlICJhcyIga2V5d29yZAphZ2FpbnN0IGEgc3ViamVjdC4gIFN5bnRheDoKCiAgIGFzX3BhdHRlcm4gOjo9IG9yX3BhdHRlcm4gImFzIiBjYXB0dXJlX3BhdHRlcm4KCklmIHRoZSBPUiBwYXR0ZXJuIGZhaWxzLCB0aGUgQVMgcGF0dGVybiBmYWlscy4gIE90aGVyd2lzZSwgdGhlIEFTCnBhdHRlcm4gYmluZHMgdGhlIHN1YmplY3QgdG8gdGhlIG5hbWUgb24gdGhlIHJpZ2h0IG9mIHRoZSBhcyBrZXl3b3JkCmFuZCBzdWNjZWVkcy4gImNhcHR1cmVfcGF0dGVybiIgY2Fubm90IGJlIGEgIl8iLgoKSW4gc2ltcGxlIHRlcm1zICJQIGFzIE5BTUUiIHdpbGwgbWF0Y2ggd2l0aCAiUCIsIGFuZCBvbiBzdWNjZXNzIGl0CndpbGwgc2V0ICJOQU1FID0gPHN1YmplY3Q+Ii4KCgpMaXRlcmFsIFBhdHRlcm5zCn5+fn5+fn5+fn5+fn5+fn4KCkEgbGl0ZXJhbCBwYXR0ZXJuIGNvcnJlc3BvbmRzIHRvIG1vc3QgbGl0ZXJhbHMgaW4gUHl0aG9uLiAgU3ludGF4OgoKICAgbGl0ZXJhbF9wYXR0ZXJuIDo6PSBzaWduZWRfbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgfCBzaWduZWRfbnVtYmVyICIrIiBOVU1CRVIKICAgICAgICAgICAgICAgICAgICAgICB8IHNpZ25lZF9udW1iZXIgIi0iIE5VTUJFUgogICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5ncwogICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiCiAgICAgICAgICAgICAgICAgICAgICAgfCAiVHJ1ZSIKICAgICAgICAgICAgICAgICAgICAgICB8ICJGYWxzZSIKICAgICAgICAgICAgICAgICAgICAgICB8IHNpZ25lZF9udW1iZXI6IE5VTUJFUiB8ICItIiBOVU1CRVIKClRoZSBydWxlICJzdHJpbmdzIiBhbmQgdGhlIHRva2VuICJOVU1CRVIiIGFyZSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZApQeXRob24gZ3JhbW1hci4gIFRyaXBsZS1xdW90ZWQgc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiAgUmF3IHN0cmluZ3MgYW5kCmJ5dGUgc3RyaW5ncyBhcmUgc3VwcG9ydGVkLiAgZi1zdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkLgoKVGhlIGZvcm1zICJzaWduZWRfbnVtYmVyICcrJyBOVU1CRVIiIGFuZCAic2lnbmVkX251bWJlciAnLScgTlVNQkVSIgphcmUgZm9yIGV4cHJlc3NpbmcgY29tcGxleCBudW1iZXJzOyB0aGV5IHJlcXVpcmUgYSByZWFsIG51bWJlciBvbiB0aGUKbGVmdCBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlciBvbiB0aGUgcmlnaHQuIEUuZy4gIjMgKyA0aiIuCgpJbiBzaW1wbGUgdGVybXMsICJMSVRFUkFMIiB3aWxsIHN1Y2NlZWQgb25seSBpZiAiPHN1YmplY3Q+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+CgpBIHNlcXVlbmNlIHBhdHRlcm4gY29udGFpbnMgc2V2ZXJhbCBzdWJwYXR0ZXJucyB0byBiZSBtYXRjaGVkIGFnYWluc3QKc2VxdWVuY2UgZWxlbWVudHMuIFRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgdW5wYWNraW5nIG9mIGEgbGlzdCBvcgp0dXBsZS4KCiAgIHNlcXVlbmNlX3BhdHRlcm4gICAgICAgOjo9ICJbIiBbbWF5YmVfc2VxdWVuY2VfcGF0dGVybl0gIl0iCiAgICAgICAgICAgICAgICAgICAgICAgIHwgIigiIFtvcGVuX3NlcXVlbmNlX3BhdHRlcm5dICIpIgogICBvcGVuX3NlcXVlbmNlX3BhdHRlcm4gIDo6PSBtYXliZV9zdGFyX3BhdHRlcm4gIiwiIFttYXliZV9zZXF1ZW5jZV9wYXR0ZXJuXQogICBtYXliZV9zZXF1ZW5jZV9wYXR0ZXJuIDo6PSAiLCIubWF5YmVfc3Rhcl9wYXR0ZXJuKyAiLCI/CiAgIG1heWJlX3N0YXJfcGF0dGVybiAgICAgOjo9IHN0YXJfcGF0dGVybiB8IHBhdHRlcm4KICAgc3Rhcl9wYXR0ZXJuICAgICAgICAgICA6Oj0gIioiIChjYXB0dXJlX3BhdHRlcm4gfCB3aWxkY2FyZF9wYXR0ZXJuKQoKVGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpZiBwYXJlbnRoZXNlcyAgb3Igc3F1YXJlIGJyYWNrZXRzIGFyZSB1c2VkIGZvcgpzZXF1ZW5jZSBwYXR0ZXJucyAoaS5lLiAiKC4uLikiIHZzICJbLi4uXSIgKS4KCk5vdGU6CgogIEEgc2luZ2xlIHBhdHRlcm4gZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgd2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hCiAgKGUuZy4gIigzIHwgNCkiKSBpcyBhIGdyb3VwIHBhdHRlcm4uIFdoaWxlIGEgc2luZ2xlIHBhdHRlcm4gZW5jbG9zZWQKICBpbiBzcXVhcmUgYnJhY2tldHMgKGUuZy4gIlszIHwgNF0iKSBpcyBzdGlsbCBhIHNlcXVlbmNlIHBhdHRlcm4uCgpBdCBtb3N0IG9uZSBzdGFyIHN1YnBhdHRlcm4gbWF5IGJlIGluIGEgc2VxdWVuY2UgcGF0dGVybi4gIFRoZSBzdGFyCnN1YnBhdHRlcm4gbWF5IG9jY3VyIGluIGFueSBwb3NpdGlvbi4gSWYgbm8gc3RhciBzdWJwYXR0ZXJuIGlzCnByZXNlbnQsIHRoZSBzZXF1ZW5jZSBwYXR0ZXJuIGlzIGEgZml4ZWQtbGVuZ3RoIHNlcXVlbmNlIHBhdHRlcm47Cm90aGVyd2lzZSBpdCBpcyBhIHZhcmlhYmxlLWxlbmd0aCBzZXF1ZW5jZSBwYXR0ZXJuLgoKVGhlIGZvbGxvd2luZyBpcyB0aGUgbG9naWNhbCBmbG93IGZvciBtYXRjaGluZyBhIHNlcXVlbmNlIHBhdHRlcm4KYWdhaW5zdCBhIHN1YmplY3QgdmFsdWU6CgoxLiBJZiB0aGUgc3ViamVjdCB2YWx1ZSBpcyBub3QgYSBzZXF1ZW5jZSBbMl0sIHRoZSBzZXF1ZW5jZSBwYXR0ZXJuCiAgIGZhaWxzLgoKMi4gSWYgdGhlIHN1YmplY3QgdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgInN0ciIsICJieXRlcyIgb3IKICAgImJ5dGVhcnJheSIgdGhlIHNlcXVlbmNlIHBhdHRlcm4gZmFpbHMuCgozLiBUaGUgc3Vic2VxdWVudCBzdGVwcyBkZXBlbmQgb24gd2hldGhlciB0aGUgc2VxdWVuY2UgcGF0dGVybiBpcwogICBmaXhlZCBvciB2YXJpYWJsZS1sZW5ndGguCgogICBJZiB0aGUgc2VxdWVuY2UgcGF0dGVybiBpcyBmaXhlZC1sZW5ndGg6CgogICAxLiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIG5vdCBlcXVhbCB0byB0aGUgbnVtYmVyCiAgICAgIG9mIHN1YnBhdHRlcm5zLCB0aGUgc2VxdWVuY2UgcGF0dGVybiBmYWlscwoKICAgMi4gU3VicGF0dGVybnMgaW4gdGhlIHNlcXVlbmNlIHBhdHRlcm4gYXJlIG1hdGNoZWQgdG8gdGhlaXIKICAgICAgY29ycmVzcG9uZGluZyBpdGVtcyBpbiB0aGUgc3ViamVjdCBzZXF1ZW5jZSBmcm9tIGxlZnQgdG8gcmlnaHQuCiAgICAgIE1hdGNoaW5nIHN0b3BzIGFzIHNvb24gYXMgYSBzdWJwYXR0ZXJuIGZhaWxzLiAgSWYgYWxsCiAgICAgIHN1YnBhdHRlcm5zIHN1Y2NlZWQgaW4gbWF0Y2hpbmcgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtLCB0aGUKICAgICAgc2VxdWVuY2UgcGF0dGVybiBzdWNjZWVkcy4KCiAgIE90aGVyd2lzZSwgaWYgdGhlIHNlcXVlbmNlIHBhdHRlcm4gaXMgdmFyaWFibGUtbGVuZ3RoOgoKICAgMS4gSWYgdGhlIGxlbmd0aCBvZiB0aGUgc3ViamVjdCBzZXF1ZW5jZSBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZgogICAgICBub24tc3RhciBzdWJwYXR0ZXJucywgdGhlIHNlcXVlbmNlIHBhdHRlcm4gZmFpbHMuCgogICAyLiBUaGUgbGVhZGluZyBub24tc3RhciBzdWJwYXR0ZXJucyBhcmUgbWF0Y2hlZCB0byB0aGVpcgogICAgICBjb3JyZXNwb25kaW5nIGl0ZW1zIGFzIGZvciBmaXhlZC1sZW5ndGggc2VxdWVuY2VzLgoKICAgMy4gSWYgdGhlIHByZXZpb3VzIHN0ZXAgc3VjY2VlZHMsIHRoZSBzdGFyIHN1YnBhdHRlcm4gbWF0Y2hlcyBhCiAgICAgIGxpc3QgZm9ybWVkIG9mIHRoZSByZW1haW5pbmcgc3ViamVjdCBpdGVtcywgZXhjbHVkaW5nIHRoZQogICAgICByZW1haW5pbmcgaXRlbXMgY29ycmVzcG9uZGluZyB0byBub24tc3RhciBzdWJwYXR0ZXJucyBmb2xsb3dpbmcKICAgICAgdGhlIHN0YXIgc3VicGF0dGVybi4KCiAgIDQuIFJlbWFpbmluZyBub24tc3RhciBzdWJwYXR0ZXJucyBhcmUgbWF0Y2hlZCB0byB0aGVpcgogICAgICBjb3JyZXNwb25kaW5nIHN1YmplY3QgaXRlbXMsIGFzIGZvciBhIGZpeGVkLWxlbmd0aCBzZXF1ZW5jZS4KCiAgIE5vdGU6CgogICAgIFRoZSBsZW5ndGggb2YgdGhlIHN1YmplY3Qgc2VxdWVuY2UgaXMgb2J0YWluZWQgdmlhICJsZW4oKSIgKGkuZS4KICAgICB2aWEgdGhlICJfX2xlbl9fKCkiIHByb3RvY29sKS4gIFRoaXMgbGVuZ3RoIG1heSBiZSBjYWNoZWQgYnkgdGhlCiAgICAgaW50ZXJwcmV0ZXIgaW4gYSBzaW1pbGFyIG1hbm5lciBhcyB2YWx1ZSBwYXR0ZXJucy4KCkluIHNpbXBsZSB0ZXJtcyAiW1AxLCBQMiwgUDMsIiDigKYgIiwgUDxOPl0iIG1hdGNoZXMgb25seSBpZiBhbGwgdGhlCmZvbGxvd2luZyBoYXBwZW5zOgoKKiBjaGVjayAiPHN1YmplY3Q+IiBpcyBhIHNlcXVlbmNlCgoqICJsZW4oc3ViamVjdCkgPT0gPE4+IgoKKiAiUDEiIG1hdGNoZXMgIjxzdWJqZWN0PlswXSIgKG5vdGUgdGhhdCB0aGlzIG1hdGNoIGNhbiBhbHNvIGJpbmQKICBuYW1lcykKCiogIlAyIiBtYXRjaGVzICI8c3ViamVjdD5bMV0iIChub3RlIHRoYXQgdGhpcyBtYXRjaCBjYW4gYWxzbyBiaW5kCiAgbmFtZXMpCgoqIOKApiBhbmQgc28gb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBhdHRlcm4vZWxlbWVudC4KCgpNYXBwaW5nIFBhdHRlcm5zCn5+fn5+fn5+fn5+fn5+fn4KCkEgbWFwcGluZyBwYXR0ZXJuIGNvbnRhaW5zIG9uZSBvciBtb3JlIGtleS12YWx1ZSBwYXR0ZXJucy4gIFRoZSBzeW50YXgKaXMgc2ltaWxhciB0byB0aGUgY29uc3RydWN0aW9uIG9mIGEgZGljdGlvbmFyeS4gU3ludGF4OgoKICAgbWFwcGluZ19wYXR0ZXJuICAgICA6Oj0gInsiIFtpdGVtc19wYXR0ZXJuXSAifSIKICAgaXRlbXNfcGF0dGVybiAgICAgICA6Oj0gIiwiLmtleV92YWx1ZV9wYXR0ZXJuKyAiLCI/CiAgIGtleV92YWx1ZV9wYXR0ZXJuICAgOjo9IChsaXRlcmFsX3BhdHRlcm4gfCB2YWx1ZV9wYXR0ZXJuKSAiOiIgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgfCBkb3VibGVfc3Rhcl9wYXR0ZXJuCiAgIGRvdWJsZV9zdGFyX3BhdHRlcm4gOjo9ICIqKiIgY2FwdHVyZV9wYXR0ZXJuCgpBdCBtb3N0IG9uZSBkb3VibGUgc3RhciBwYXR0ZXJuIG1heSBiZSBpbiBhIG1hcHBpbmcgcGF0dGVybi4gIFRoZQpkb3VibGUgc3RhciBwYXR0ZXJuIG11c3QgYmUgdGhlIGxhc3Qgc3VicGF0dGVybiBpbiB0aGUgbWFwcGluZwpwYXR0ZXJuLgoKRHVwbGljYXRlIGtleXMgaW4gbWFwcGluZyBwYXR0ZXJucyBhcmUgZGlzYWxsb3dlZC4gRHVwbGljYXRlIGxpdGVyYWwKa2V5cyB3aWxsIHJhaXNlIGEgIlN5bnRheEVycm9yIi4gVHdvIGtleXMgdGhhdCBvdGhlcndpc2UgaGF2ZSB0aGUgc2FtZQp2YWx1ZSB3aWxsIHJhaXNlIGEgIlZhbHVlRXJyb3IiIGF0IHJ1bnRpbWUuCgpUaGUgZm9sbG93aW5nIGlzIHRoZSBsb2dpY2FsIGZsb3cgZm9yIG1hdGNoaW5nIGEgbWFwcGluZyBwYXR0ZXJuCmFnYWluc3QgYSBzdWJqZWN0IHZhbHVlOgoKMS4gSWYgdGhlIHN1YmplY3QgdmFsdWUgaXMgbm90IGEgbWFwcGluZyBbM10sdGhlIG1hcHBpbmcgcGF0dGVybgogICBmYWlscy4KCjIuIElmIGV2ZXJ5IGtleSBnaXZlbiBpbiB0aGUgbWFwcGluZyBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHN1YmplY3QKICAgbWFwcGluZywgYW5kIHRoZSBwYXR0ZXJuIGZvciBlYWNoIGtleSBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nCiAgIGl0ZW0gb2YgdGhlIHN1YmplY3QgbWFwcGluZywgdGhlIG1hcHBpbmcgcGF0dGVybiBzdWNjZWVkcy4KCjMuIElmIGR1cGxpY2F0ZSBrZXlzIGFyZSBkZXRlY3RlZCBpbiB0aGUgbWFwcGluZyBwYXR0ZXJuLCB0aGUgcGF0dGVybgogICBpcyBjb25zaWRlcmVkIGludmFsaWQuIEEgIlN5bnRheEVycm9yIiBpcyByYWlzZWQgZm9yIGR1cGxpY2F0ZQogICBsaXRlcmFsIHZhbHVlczsgb3IgYSAiVmFsdWVFcnJvciIgZm9yIG5hbWVkIGtleXMgb2YgdGhlIHNhbWUgdmFsdWUuCgpOb3RlOgoKICBLZXktdmFsdWUgcGFpcnMgYXJlIG1hdGNoZWQgdXNpbmcgdGhlIHR3by1hcmd1bWVudCBmb3JtIG9mIHRoZQogIG1hcHBpbmcgc3ViamVjdOKAmXMgImdldCgpIiBtZXRob2QuICBNYXRjaGVkIGtleS12YWx1ZSBwYWlycyBtdXN0CiAgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSBtYXBwaW5nLCBhbmQgbm90IGNyZWF0ZWQgb24tdGhlLWZseSB2aWEKICAiX19taXNzaW5nX18oKSIgb3IgIl9fZ2V0aXRlbV9fKCkiLgoKSW4gc2ltcGxlIHRlcm1zICJ7S0VZMTogUDEsIEtFWTI6IFAyLCAuLi4gfSIgbWF0Y2hlcyBvbmx5IGlmIGFsbCB0aGUKZm9sbG93aW5nIGhhcHBlbnM6CgoqIGNoZWNrICI8c3ViamVjdD4iIGlzIGEgbWFwcGluZwoKKiAiS0VZMSBpbiA8c3ViamVjdD4iCgoqICJQMSIgbWF0Y2hlcyAiPHN1YmplY3Q+W0tFWTFdIgoKKiDigKYgYW5kIHNvIG9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBLRVkvcGF0dGVybiBwYWlyLgoKCkNsYXNzIFBhdHRlcm5zCn5+fn5+fn5+fn5+fn5+CgpBIGNsYXNzIHBhdHRlcm4gcmVwcmVzZW50cyBhIGNsYXNzIGFuZCBpdHMgcG9zaXRpb25hbCBhbmQga2V5d29yZAphcmd1bWVudHMgKGlmIGFueSkuICBTeW50YXg6CgogICBjbGFzc19wYXR0ZXJuICAgICAgIDo6PSBuYW1lX29yX2F0dHIgIigiIFtwYXR0ZXJuX2FyZ3VtZW50cyAiLCI/XSAiKSIKICAgcGF0dGVybl9hcmd1bWVudHMgICA6Oj0gcG9zaXRpb25hbF9wYXR0ZXJucyBbIiwiIGtleXdvcmRfcGF0dGVybnNdCiAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRfcGF0dGVybnMKICAgcG9zaXRpb25hbF9wYXR0ZXJucyA6Oj0gIiwiLnBhdHRlcm4rCiAgIGtleXdvcmRfcGF0dGVybnMgICAgOjo9ICIsIi5rZXl3b3JkX3BhdHRlcm4rCiAgIGtleXdvcmRfcGF0dGVybiAgICAgOjo9IE5BTUUgIj0iIHBhdHRlcm4KClRoZSBzYW1lIGtleXdvcmQgc2hvdWxkIG5vdCBiZSByZXBlYXRlZCBpbiBjbGFzcyBwYXR0ZXJucy4KClRoZSBmb2xsb3dpbmcgaXMgdGhlIGxvZ2ljYWwgZmxvdyBmb3IgbWF0Y2hpbmcgYSBjbGFzcyBwYXR0ZXJuIGFnYWluc3QKYSBzdWJqZWN0IHZhbHVlOgoKMS4gSWYgIm5hbWVfb3JfYXR0ciIgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBidWlsdGluICJ0eXBlIiAsIHJhaXNlCiAgICJUeXBlRXJyb3IiLgoKMi4gSWYgdGhlIHN1YmplY3QgdmFsdWUgaXMgbm90IGFuIGluc3RhbmNlIG9mICJuYW1lX29yX2F0dHIiICh0ZXN0ZWQKICAgdmlhICJpc2luc3RhbmNlKCkiKSwgdGhlIGNsYXNzIHBhdHRlcm4gZmFpbHMuCgozLiBJZiBubyBwYXR0ZXJuIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhlIHBhdHRlcm4gc3VjY2VlZHMuCiAgIE90aGVyd2lzZSwgdGhlIHN1YnNlcXVlbnQgc3RlcHMgZGVwZW5kIG9uIHdoZXRoZXIga2V5d29yZCBvcgogICBwb3NpdGlvbmFsIGFyZ3VtZW50IHBhdHRlcm5zIGFyZSBwcmVzZW50LgoKICAgRm9yIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIChzcGVjaWZpZWQgYmVsb3cpLCBhIHNpbmdsZQogICBwb3NpdGlvbmFsIHN1YnBhdHRlcm4gaXMgYWNjZXB0ZWQgd2hpY2ggd2lsbCBtYXRjaCB0aGUgZW50aXJlCiAgIHN1YmplY3Q7IGZvciB0aGVzZSB0eXBlcyBrZXl3b3JkIHBhdHRlcm5zIGFsc28gd29yayBhcyBmb3Igb3RoZXIKICAgdHlwZXMuCgogICBJZiBvbmx5IGtleXdvcmQgcGF0dGVybnMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIHByb2Nlc3NlZCBhcwogICBmb2xsb3dzLCBvbmUgYnkgb25lOgoKICAgSS4gVGhlIGtleXdvcmQgaXMgbG9va2VkIHVwIGFzIGFuIGF0dHJpYnV0ZSBvbiB0aGUgc3ViamVjdC4KCiAgICAgICogSWYgdGhpcyByYWlzZXMgYW4gZXhjZXB0aW9uIG90aGVyIHRoYW4gIkF0dHJpYnV0ZUVycm9yIiwgdGhlCiAgICAgICAgZXhjZXB0aW9uIGJ1YmJsZXMgdXAuCgogICAgICAqIElmIHRoaXMgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIsIHRoZSBjbGFzcyBwYXR0ZXJuIGhhcyBmYWlsZWQuCgogICAgICAqIEVsc2UsIHRoZSBzdWJwYXR0ZXJuIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5d29yZCBwYXR0ZXJuIGlzCiAgICAgICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBzdWJqZWN04oCZcyBhdHRyaWJ1dGUgdmFsdWUuICBJZiB0aGlzIGZhaWxzLAogICAgICAgIHRoZSBjbGFzcyBwYXR0ZXJuIGZhaWxzOyBpZiB0aGlzIHN1Y2NlZWRzLCB0aGUgbWF0Y2ggcHJvY2VlZHMKICAgICAgICB0byB0aGUgbmV4dCBrZXl3b3JkLgoKICAgSUkuIElmIGFsbCBrZXl3b3JkIHBhdHRlcm5zIHN1Y2NlZWQsIHRoZSBjbGFzcyBwYXR0ZXJuIHN1Y2NlZWRzLgoKICAgSWYgYW55IHBvc2l0aW9uYWwgcGF0dGVybnMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGNvbnZlcnRlZCB0bwogICBrZXl3b3JkIHBhdHRlcm5zIHVzaW5nIHRoZSAiX19tYXRjaF9hcmdzX18iIGF0dHJpYnV0ZSBvbiB0aGUgY2xhc3MKICAgIm5hbWVfb3JfYXR0ciIgYmVmb3JlIG1hdGNoaW5nOgoKICAgSS4gVGhlIGVxdWl2YWxlbnQgb2YgImdldGF0dHIoY2xzLCAiX19tYXRjaF9hcmdzX18iLCAoKSkiIGlzCiAgIGNhbGxlZC4KCiAgICAgICogSWYgdGhpcyByYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgZXhjZXB0aW9uIGJ1YmJsZXMgdXAuCgogICAgICAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBub3QgYSB0dXBsZSwgdGhlIGNvbnZlcnNpb24gZmFpbHMgYW5kCiAgICAgICAgIlR5cGVFcnJvciIgaXMgcmFpc2VkLgoKICAgICAgKiBJZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIHBhdHRlcm5zIHRoYW4KICAgICAgICAibGVuKGNscy5fX21hdGNoX2FyZ3NfXykiLCAiVHlwZUVycm9yIiBpcyByYWlzZWQuCgogICAgICAqIE90aGVyd2lzZSwgcG9zaXRpb25hbCBwYXR0ZXJuICJpIiBpcyBjb252ZXJ0ZWQgdG8gYSBrZXl3b3JkCiAgICAgICAgcGF0dGVybiB1c2luZyAiX19tYXRjaF9hcmdzX19baV0iIGFzIHRoZSBrZXl3b3JkLgogICAgICAgICJfX21hdGNoX2FyZ3NfX1tpXSIgbXVzdCBiZSBhIHN0cmluZzsgaWYgbm90ICJUeXBlRXJyb3IiIGlzCiAgICAgICAgcmFpc2VkLgoKICAgICAgKiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlIGtleXdvcmRzLCAiVHlwZUVycm9yIiBpcyByYWlzZWQuCgogICAgICBTZWUgYWxzbzoKCiAgICAgICAgQ3VzdG9taXppbmcgcG9zaXRpb25hbCBhcmd1bWVudHMgaW4gY2xhc3MgcGF0dGVybiBtYXRjaGluZwoKICAgSUkuIE9uY2UgYWxsIHBvc2l0aW9uYWwgcGF0dGVybnMgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byBrZXl3b3JkCiAgIHBhdHRlcm5zLAogICAgICB0aGUgbWF0Y2ggcHJvY2VlZHMgYXMgaWYgdGhlcmUgd2VyZSBvbmx5IGtleXdvcmQgcGF0dGVybnMuCgogICBGb3IgdGhlIGZvbGxvd2luZyBidWlsdC1pbiB0eXBlcyB0aGUgaGFuZGxpbmcgb2YgcG9zaXRpb25hbAogICBzdWJwYXR0ZXJucyBpcyBkaWZmZXJlbnQ6CgogICAqICJib29sIgoKICAgKiAiYnl0ZWFycmF5IgoKICAgKiAiYnl0ZXMiCgogICAqICJkaWN0IgoKICAgKiAiZmxvYXQiCgogICAqICJmcm96ZW5zZXQiCgogICAqICJpbnQiCgogICAqICJsaXN0IgoKICAgKiAic2V0IgoKICAgKiAic3RyIgoKICAgKiAidHVwbGUiCgogICBUaGVzZSBjbGFzc2VzIGFjY2VwdCBhIHNpbmdsZSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBhbmQgdGhlIHBhdHRlcm4KICAgdGhlcmUgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB3aG9sZSBvYmplY3QgcmF0aGVyIHRoYW4gYW4gYXR0cmlidXRlLgogICBGb3IgZXhhbXBsZSAiaW50KDB8MSkiIG1hdGNoZXMgdGhlIHZhbHVlICIwIiwgYnV0IG5vdCB0aGUgdmFsdWUKICAgIjAuMCIuCgpJbiBzaW1wbGUgdGVybXMgIkNMUyhQMSwgYXR0cj1QMikiIG1hdGNoZXMgb25seSBpZiB0aGUgZm9sbG93aW5nCmhhcHBlbnM6CgoqICJpc2luc3RhbmNlKDxzdWJqZWN0PiwgQ0xTKSIKCiogY29udmVydCAiUDEiIHRvIGEga2V5d29yZCBwYXR0ZXJuIHVzaW5nICJDTFMuX19tYXRjaF9hcmdzX18iCgoqIEZvciBlYWNoIGtleXdvcmQgYXJndW1lbnQgImF0dHI9UDIiOgoKICAqICJoYXNhdHRyKDxzdWJqZWN0PiwgImF0dHIiKSIKCiAgKiAiUDIiIG1hdGNoZXMgIjxzdWJqZWN0Pi5hdHRyIgoKKiDigKYgYW5kIHNvIG9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBrZXl3b3JkIGFyZ3VtZW50L3BhdHRlcm4gcGFpci4KClNlZSBhbHNvOgoKICAqICoqUEVQIDYzNCoqIOKAkyBTdHJ1Y3R1cmFsIFBhdHRlcm4gTWF0Y2hpbmc6IFNwZWNpZmljYXRpb24KCiAgKiAqKlBFUCA2MzYqKiDigJMgU3RydWN0dXJhbCBQYXR0ZXJuIE1hdGNoaW5nOiBUdXRvcmlhbAoKCkZ1bmN0aW9uIGRlZmluaXRpb25zCj09PT09PT09PT09PT09PT09PT09CgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZQpzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSk6CgogICBmdW5jZGVmICAgICAgICAgICAgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiCiAgICAgICAgICAgICAgIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZQogICBkZWNvcmF0b3JzICAgICAgICAgICAgICAgIDo6PSBkZWNvcmF0b3IrCiAgIGRlY29yYXRvciAgICAgICAgICAgICAgICAgOjo9ICJAIiBhc3NpZ25tZW50X2V4cHJlc3Npb24gTkVXTElORQogICBwYXJhbWV0ZXJfbGlzdCAgICAgICAgICAgIDo6PSBkZWZwYXJhbWV0ZXIgKCIsIiBkZWZwYXJhbWV0ZXIpKiAiLCIgIi8iIFsiLCIgW3BhcmFtZXRlcl9saXN0X25vX3Bvc29ubHldXQogICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X25vX3Bvc29ubHkKICAgcGFyYW1ldGVyX2xpc3Rfbm9fcG9zb25seSA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiBbcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NdXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzCiAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzICAgOjo9ICIqIiBbcGFyYW1ldGVyXSAoIiwiIGRlZnBhcmFtZXRlcikqIFsiLCIgWyIqKiIgcGFyYW1ldGVyIFsiLCJdXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXIgWyIsIl0KICAgcGFyYW1ldGVyICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dCiAgIGRlZnBhcmFtZXRlciAgICAgICAgICAgICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dCiAgIGZ1bmNuYW1lICAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIKCkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHMKdGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0CihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzCmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlCmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgoKVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzCmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbNF0KCkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKgpleHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMKZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGUKcmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3QKYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZQppbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluCm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlCgogICBAZjEoYXJnKQogICBAZjIKICAgZGVmIGZ1bmMoKTogcGFzcwoKaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCgogICBkZWYgZnVuYygpOiBwYXNzCiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKQoKZXhjZXB0IHRoYXQgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIGlzIG5vdCB0ZW1wb3JhcmlseSBib3VuZCB0byB0aGUgbmFtZQoiZnVuYyIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy45OiBGdW5jdGlvbnMgbWF5IGJlIGRlY29yYXRlZCB3aXRoIGFueSB2YWxpZAoiYXNzaWdubWVudF9leHByZXNzaW9uIi4gUHJldmlvdXNseSwgdGhlIGdyYW1tYXIgd2FzIG11Y2ggbW9yZQpyZXN0cmljdGl2ZTsgc2VlICoqUEVQIDYxNCoqIGZvciBkZXRhaWxzLgoKV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSIKKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlIOKAnGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy7igJ0KRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAqYXJndW1lbnQqIG1heQpiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXLigJlzIGRlZmF1bHQgdmFsdWUgaXMKc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nCnBhcmFtZXRlcnMgdXAgdW50aWwgdGhlIOKAnCIqIuKAnSBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUg4oCUIHRoaXMgaXMKYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLgoKKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiB0aGUKZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMKZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lIOKAnHByZS0KY29tcHV0ZWTigJ0gdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudAp0byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoCmFzIGEgbGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuCmJ5IGFwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSBpcyBpbgplZmZlY3QgbW9kaWZpZWQuICBUaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheQphcm91bmQgdGhpcyBpcyB0byB1c2UgIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvcgppdCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGUuZy46CgogICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6CiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6CiAgICAgICAgICAgcGVuZ3VpbiA9IFtdCiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpCiAgICAgICByZXR1cm4gcGVuZ3VpbgoKRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uIENhbGxzLgpBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzIG1lbnRpb25lZCBpbgp0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uYWwgYXJndW1lbnRzLCBmcm9tIGtleXdvcmQKYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm0g4oCcIippZGVudGlmaWVyIuKAnSBpcwpwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnkgZXhjZXNzIHBvc2l0aW9uYWwKcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuIElmIHRoZSBmb3JtCuKAnCIqKmlkZW50aWZpZXIi4oCdIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3IG9yZGVyZWQKbWFwcGluZyByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ldwplbXB0eSBtYXBwaW5nIG9mIHRoZSBzYW1lIHR5cGUuICBQYXJhbWV0ZXJzIGFmdGVyIOKAnCIqIuKAnSBvcgrigJwiKmlkZW50aWZpZXIi4oCdIGFyZSBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIGJ5CmtleXdvcmQgYXJndW1lbnRzLiAgUGFyYW1ldGVycyBiZWZvcmUg4oCcIi8i4oCdIGFyZSBwb3NpdGlvbmFsLW9ubHkKcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIGJ5IHBvc2l0aW9uYWwgYXJndW1lbnRzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuODogVGhlICIvIiBmdW5jdGlvbiBwYXJhbWV0ZXIgc3ludGF4IG1heSBiZSB1c2VkCnRvIGluZGljYXRlIHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzLiBTZWUgKipQRVAgNTcwKiogZm9yIGRldGFpbHMuCgpQYXJhbWV0ZXJzIG1heSBoYXZlIGFuICphbm5vdGF0aW9uKiBvZiB0aGUgZm9ybSDigJwiOiBleHByZXNzaW9uIuKAnQpmb2xsb3dpbmcgdGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uLApldmVuIHRob3NlIG9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5CmhhdmUg4oCccmV0dXJu4oCdIGFubm90YXRpb24gb2YgdGhlIGZvcm0g4oCcIi0+IGV4cHJlc3Npb24i4oCdIGFmdGVyIHRoZQpwYXJhbWV0ZXIgbGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24uClRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhCmZ1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGEKZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc+KAmSBuYW1lcyBpbiB0aGUgIl9fYW5ub3RhdGlvbnNfXyIKYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBJZiB0aGUgImFubm90YXRpb25zIiBpbXBvcnQgZnJvbQoiX19mdXR1cmVfXyIgaXMgdXNlZCwgYW5ub3RhdGlvbnMgYXJlIHByZXNlcnZlZCBhcyBzdHJpbmdzIGF0IHJ1bnRpbWUKd2hpY2ggZW5hYmxlcyBwb3N0cG9uZWQgZXZhbHVhdGlvbi4gIE90aGVyd2lzZSwgdGhleSBhcmUgZXZhbHVhdGVkCndoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBJbiB0aGlzIGNhc2UgYW5ub3RhdGlvbnMKbWF5IGJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UKY29kZS4KCkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmQKdG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhCmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiBMYW1iZGFzLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEKZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uOwphIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSDigJwiZGVmIuKAnSBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IKYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGEKZXhwcmVzc2lvbi4gIFRoZSDigJwiZGVmIuKAnSBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQKYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuCgoqKlByb2dyYW1tZXLigJlzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSDigJwiZGVmIuKAnQpzdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWwKZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQKaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uCmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IgZGV0YWlscy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9ucwogICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy4KCiAgKipQRVAgNDg0KiogLSBUeXBlIEhpbnRzCiAgICAgRGVmaW5pdGlvbiBvZiBhIHN0YW5kYXJkIG1lYW5pbmcgZm9yIGFubm90YXRpb25zOiB0eXBlIGhpbnRzLgoKICAqKlBFUCA1MjYqKiAtIFN5bnRheCBmb3IgVmFyaWFibGUgQW5ub3RhdGlvbnMKICAgICBBYmlsaXR5IHRvIHR5cGUgaGludCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMsIGluY2x1ZGluZyBjbGFzcwogICAgIHZhcmlhYmxlcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzLgoKICAqKlBFUCA1NjMqKiAtIFBvc3Rwb25lZCBFdmFsdWF0aW9uIG9mIEFubm90YXRpb25zCiAgICAgU3VwcG9ydCBmb3IgZm9yd2FyZCByZWZlcmVuY2VzIHdpdGhpbiBhbm5vdGF0aW9ucyBieSBwcmVzZXJ2aW5nCiAgICAgYW5ub3RhdGlvbnMgaW4gYSBzdHJpbmcgZm9ybSBhdCBydW50aW1lIGluc3RlYWQgb2YgZWFnZXIKICAgICBldmFsdWF0aW9uLgoKICAqKlBFUCAzMTgqKiAtIERlY29yYXRvcnMgZm9yIEZ1bmN0aW9ucyBhbmQgTWV0aG9kcwogICAgIEZ1bmN0aW9uIGFuZCBtZXRob2QgZGVjb3JhdG9ycyB3ZXJlIGludHJvZHVjZWQuIENsYXNzIGRlY29yYXRvcnMKICAgICB3ZXJlIGludHJvZHVjZWQgaW4gKipQRVAgMzEyOSoqLgoKCkNsYXNzIGRlZmluaXRpb25zCj09PT09PT09PT09PT09PT09CgpBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlIHN0YW5kYXJkCnR5cGUgaGllcmFyY2h5KToKCiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGUKICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiCiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyCgpBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgbGlzdAp1c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSBNZXRhY2xhc3NlcyBmb3IgbW9yZQphZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhIGNsYXNzCm9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2UgbGlzdAppbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSwKCiAgIGNsYXNzIEZvbzoKICAgICAgIHBhc3MKCmlzIGVxdWl2YWxlbnQgdG8KCiAgIGNsYXNzIEZvbyhvYmplY3QpOgogICAgICAgcGFzcwoKVGhlIGNsYXNz4oCZcyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlCk5hbWluZyBhbmQgYmluZGluZyksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZQpvcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseQpmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc+KAmXMgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHMKZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzVdIEEKY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2UKY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LgpUaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWwKbmFtZXNwYWNlLgoKVGhlIG9yZGVyIGluIHdoaWNoIGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgaW4gdGhlIGNsYXNzIGJvZHkgaXMKcHJlc2VydmVkIGluIHRoZSBuZXcgY2xhc3PigJlzICJfX2RpY3RfXyIuICBOb3RlIHRoYXQgdGhpcyBpcyByZWxpYWJsZQpvbmx5IHJpZ2h0IGFmdGVyIHRoZSBjbGFzcyBpcyBjcmVhdGVkIGFuZCBvbmx5IGZvciBjbGFzc2VzIHRoYXQgd2VyZQpkZWZpbmVkIHVzaW5nIHRoZSBkZWZpbml0aW9uIHN5bnRheC4KCkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgbWV0YWNsYXNzZXMuCgpDbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsCgogICBAZjEoYXJnKQogICBAZjIKICAgY2xhc3MgRm9vOiBwYXNzCgppcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8KCiAgIGNsYXNzIEZvbzogcGFzcwogICBGb28gPSBmMShhcmcpKGYyKEZvbykpCgpUaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yCmZ1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy45OiBDbGFzc2VzIG1heSBiZSBkZWNvcmF0ZWQgd2l0aCBhbnkgdmFsaWQKImFzc2lnbm1lbnRfZXhwcmVzc2lvbiIuIFByZXZpb3VzbHksIHRoZSBncmFtbWFyIHdhcyBtdWNoIG1vcmUKcmVzdHJpY3RpdmU7IHNlZSAqKlBFUCA2MTQqKiBmb3IgZGV0YWlscy4KCioqUHJvZ3JhbW1lcuKAmXMgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmUKY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXMKY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZAppbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uIOKAnCJzZWxmLm5hbWUi4oCdLAphbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZQp3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0cwpmb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvCnVuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZQp2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGNoYW5nZWQgdGhlIGRlY2xhcmF0aW9uIG9mIG1ldGFjbGFzc2VzIHRvIHRoZQogICAgIGN1cnJlbnQgc3ludGF4LCBhbmQgdGhlIHNlbWFudGljcyBmb3IgaG93IGNsYXNzZXMgd2l0aAogICAgIG1ldGFjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZC4KCiAgKipQRVAgMzEyOSoqIC0gQ2xhc3MgRGVjb3JhdG9ycwogICAgIFRoZSBwcm9wb3NhbCB0aGF0IGFkZGVkIGNsYXNzIGRlY29yYXRvcnMuICBGdW5jdGlvbiBhbmQgbWV0aG9kCiAgICAgZGVjb3JhdG9ycyB3ZXJlIGludHJvZHVjZWQgaW4gKipQRVAgMzE4KiouCgoKQ29yb3V0aW5lcwo9PT09PT09PT09CgpOZXcgaW4gdmVyc2lvbiAzLjUuCgoKQ29yb3V0aW5lIGZ1bmN0aW9uIGRlZmluaXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIGFzeW5jX2Z1bmNkZWYgOjo9IFtkZWNvcmF0b3JzXSAiYXN5bmMiICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIgogICAgICAgICAgICAgICAgICAgICBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGUKCkV4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0IG1hbnkKcG9pbnRzIChzZWUgKmNvcm91dGluZSopLiAiYXdhaXQiIGV4cHJlc3Npb25zLCAiYXN5bmMgZm9yIiBhbmQgImFzeW5jCndpdGgiIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpGdW5jdGlvbnMgZGVmaW5lZCB3aXRoICJhc3luYyBkZWYiIHN5bnRheCBhcmUgYWx3YXlzIGNvcm91dGluZQpmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuCgpJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlIGEgInlpZWxkIGZyb20iIGV4cHJlc3Npb24gaW5zaWRlIHRoZSBib2R5Cm9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uLgoKQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjoKCiAgIGFzeW5jIGRlZiBmdW5jKHBhcmFtMSwgcGFyYW0yKToKICAgICAgIGRvX3N0dWZmKCkKICAgICAgIGF3YWl0IHNvbWVfY29yb3V0aW5lKCkKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjc6ICJhd2FpdCIgYW5kICJhc3luYyIgYXJlIG5vdyBrZXl3b3JkczsKcHJldmlvdXNseSB0aGV5IHdlcmUgb25seSB0cmVhdGVkIGFzIHN1Y2ggaW5zaWRlIHRoZSBib2R5IG9mIGEKY29yb3V0aW5lIGZ1bmN0aW9uLgoKClRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgYXN5bmNfZm9yX3N0bXQgOjo9ICJhc3luYyIgZm9yX3N0bXQKCkFuICphc3luY2hyb25vdXMgaXRlcmFibGUqIHByb3ZpZGVzIGFuICJfX2FpdGVyX18iIG1ldGhvZCB0aGF0CmRpcmVjdGx5IHJldHVybnMgYW4gKmFzeW5jaHJvbm91cyBpdGVyYXRvciosIHdoaWNoIGNhbiBjYWxsCmFzeW5jaHJvbm91cyBjb2RlIGluIGl0cyAiX19hbmV4dF9fIiBtZXRob2QuCgpUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50IGFsbG93cyBjb252ZW5pZW50IGl0ZXJhdGlvbiBvdmVyCmFzeW5jaHJvbm91cyBpdGVyYWJsZXMuCgpUaGUgZm9sbG93aW5nIGNvZGU6CgogICBhc3luYyBmb3IgVEFSR0VUIGluIElURVI6CiAgICAgICBTVUlURQogICBlbHNlOgogICAgICAgU1VJVEUyCgpJcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzoKCiAgIGl0ZXIgPSAoSVRFUikKICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpCiAgIHJ1bm5pbmcgPSBUcnVlCgogICB3aGlsZSBydW5uaW5nOgogICAgICAgdHJ5OgogICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpCiAgICAgICBleGNlcHQgU3RvcEFzeW5jSXRlcmF0aW9uOgogICAgICAgICAgIHJ1bm5pbmcgPSBGYWxzZQogICAgICAgZWxzZToKICAgICAgICAgICBTVUlURQogICBlbHNlOgogICAgICAgU1VJVEUyCgpTZWUgYWxzbyAiX19haXRlcl9fKCkiIGFuZCAiX19hbmV4dF9fKCkiIGZvciBkZXRhaWxzLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgb3V0c2lkZSB0aGUgYm9keQpvZiBhIGNvcm91dGluZSBmdW5jdGlvbi4KCgpUaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdAoKQW4gKmFzeW5jaHJvbm91cyBjb250ZXh0IG1hbmFnZXIqIGlzIGEgKmNvbnRleHQgbWFuYWdlciogdGhhdCBpcyBhYmxlCnRvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy4KClRoZSBmb2xsb3dpbmcgY29kZToKCiAgIGFzeW5jIHdpdGggRVhQUkVTU0lPTiBhcyBUQVJHRVQ6CiAgICAgICBTVUlURQoKaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86CgogICBtYW5hZ2VyID0gKEVYUFJFU1NJT04pCiAgIGFlbnRlciA9IHR5cGUobWFuYWdlcikuX19hZW50ZXJfXwogICBhZXhpdCA9IHR5cGUobWFuYWdlcikuX19hZXhpdF9fCiAgIHZhbHVlID0gYXdhaXQgYWVudGVyKG1hbmFnZXIpCiAgIGhpdF9leGNlcHQgPSBGYWxzZQoKICAgdHJ5OgogICAgICAgVEFSR0VUID0gdmFsdWUKICAgICAgIFNVSVRFCiAgIGV4Y2VwdDoKICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCiAgICAgICBpZiBub3QgYXdhaXQgYWV4aXQobWFuYWdlciwgKnN5cy5leGNfaW5mbygpKToKICAgICAgICAgICByYWlzZQogICBmaW5hbGx5OgogICAgICAgaWYgbm90IGhpdF9leGNlcHQ6CiAgICAgICAgICAgYXdhaXQgYWV4aXQobWFuYWdlciwgTm9uZSwgTm9uZSwgTm9uZSkKClNlZSBhbHNvICJfX2FlbnRlcl9fKCkiIGFuZCAiX19hZXhpdF9fKCkiIGZvciBkZXRhaWxzLgoKSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSBhbiAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgdGhlCmJvZHkgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb24uCgpTZWUgYWxzbzoKCiAgKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheAogICAgIFRoZSBwcm9wb3NhbCB0aGF0IG1hZGUgY29yb3V0aW5lcyBhIHByb3BlciBzdGFuZGFsb25lIGNvbmNlcHQgaW4KICAgICBQeXRob24sIGFuZCBhZGRlZCBzdXBwb3J0aW5nIHN5bnRheC4KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3MgdGhlcmUKICAgIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLgogICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LgoKWzJdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgc2VxdWVuY2UgaXMgZGVmaW5lZCBhcyBvbmUgb2YgdGhlCiAgICBmb2xsb3dpbmc6CgogICAgKiBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiCgogICAgKiBhIGJ1aWx0aW4gY2xhc3MgdGhhdCBoYXMgaXRzIChDUHl0aG9uKSAiUHlfVFBGTEFHU19TRVFVRU5DRSIgYml0CiAgICAgIHNldAoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gYW55IG9mIHRoZSBhYm92ZQoKICAgIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzIGFyZSBzZXF1ZW5jZXM6CgogICAgKiAiYXJyYXkuYXJyYXkiCgogICAgKiAiY29sbGVjdGlvbnMuZGVxdWUiCgogICAgKiAibGlzdCIKCiAgICAqICJtZW1vcnl2aWV3IgoKICAgICogInJhbmdlIgoKICAgICogInR1cGxlIgoKICAgIE5vdGU6CgogICAgICBTdWJqZWN0IHZhbHVlcyBvZiB0eXBlICJzdHIiLCAiYnl0ZXMiLCBhbmQgImJ5dGVhcnJheSIgZG8gbm90CiAgICAgIG1hdGNoIHNlcXVlbmNlIHBhdHRlcm5zLgoKWzNdIEluIHBhdHRlcm4gbWF0Y2hpbmcsIGEgbWFwcGluZyBpcyBkZWZpbmVkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgoKICAgICogYSBjbGFzcyB0aGF0IGluaGVyaXRzIGZyb20gImNvbGxlY3Rpb25zLmFiYy5NYXBwaW5nIgoKICAgICogYSBQeXRob24gY2xhc3MgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGFzCiAgICAgICJjb2xsZWN0aW9ucy5hYmMuTWFwcGluZyIKCiAgICAqIGEgYnVpbHRpbiBjbGFzcyB0aGF0IGhhcyBpdHMgKENQeXRob24pICJQeV9UUEZMQUdTX01BUFBJTkciIGJpdAogICAgICBzZXQKCiAgICAqIGEgY2xhc3MgdGhhdCBpbmhlcml0cyBmcm9tIGFueSBvZiB0aGUgYWJvdmUKCiAgICBUaGUgc3RhbmRhcmQgbGlicmFyeSBjbGFzc2VzICJkaWN0IiBhbmQgInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiCiAgICBhcmUgbWFwcGluZ3MuCgpbNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24KICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb27igJlzICJfX2RvY19fIiBhdHRyaWJ1dGUgYW5kCiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9u4oCZcyAqZG9jc3RyaW5nKi4KCls1XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzcwogICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2XigJlzICJfX2RvY19fIiBpdGVtIGFuZAogICAgdGhlcmVmb3JlIHRoZSBjbGFzc+KAmXMgKmRvY3N0cmluZyouCnoQY29udGV4dC1tYW5hZ2Vyc3WmBgAAV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2VycwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpBICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0bwpiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXIKaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dApmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5Cmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uIFRoZSB3aXRoCnN0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuCgpUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXMKa2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZApmaWxlcywgZXRjLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgTWFuYWdlciBUeXBlcy4KCm9iamVjdC5fX2VudGVyX18oc2VsZikKCiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIgogICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9k4oCZcyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKQogICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KCm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spCgogICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMKICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZQogICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbAogICBiZSAiTm9uZSIuCgogICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGUKICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZAogICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWQKICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuCgogICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW4KICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXLigJlzIHJlc3BvbnNpYmlsaXR5LgoKU2VlIGFsc286CgogICoqUEVQIDM0MyoqIC0gVGhlIOKAnHdpdGjigJ0gc3RhdGVtZW50CiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCIKICAgICBzdGF0ZW1lbnQuCtoIY29udGludWVhwwEAAFRoZSAiY29udGludWUiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIGNvbnRpbnVlX3N0bXQgOjo9ICJjb250aW51ZSIKCiJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiCmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdApsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUgb2YgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AuCgpXaGVuICJjb250aW51ZSIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYQoiZmluYWxseSIgY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseQpzdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLgraC2NvbnZlcnNpb25zdaMCAABBcml0aG1ldGljIGNvbnZlcnNpb25zCioqKioqKioqKioqKioqKioqKioqKioKCldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZQrigJx0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBl4oCdLCB0aGlzIG1lYW5zCnRoYXQgdGhlIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBidWlsdC1pbiB0eXBlcyB3b3JrcyBhcyBmb2xsb3dzOgoKKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0bwogIGNvbXBsZXg7CgoqIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCB0aGUgb3RoZXIKICBpcyBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQ7CgoqIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4KClNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGFzIGEKbGVmdCBhcmd1bWVudCB0byB0aGUg4oCYJeKAmSBvcGVyYXRvcikuICBFeHRlbnNpb25zIG11c3QgZGVmaW5lIHRoZWlyIG93bgpjb252ZXJzaW9uIGJlaGF2aW9yLgraDWN1c3RvbWl6YXRpb251BzYAAEJhc2ljIGN1c3RvbWl6YXRpb24KKioqKioqKioqKioqKioqKioqKgoKb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSkKCiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhCiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaCkKICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHMKICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZQogICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm4KICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5IGFuCiAgIGluc3RhbmNlIG9mICpjbHMqKS4KCiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnkKICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3PigJlzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZwogICAic3VwZXIoKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBhbmQgdGhlbgogICBtb2RpZnlpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UgYXMgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcKICAgaXQuCgogICBJZiAiX19uZXdfXygpIiBpcyBpbnZva2VkIGR1cmluZyBvYmplY3QgY29uc3RydWN0aW9uIGFuZCBpdCByZXR1cm5zCiAgIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXcgaW5zdGFuY2XigJlzICJfX2luaXRfXygpIiBtZXRob2QKICAgd2lsbCBiZSBpbnZva2VkIGxpa2UgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUKICAgbmV3IGluc3RhbmNlIGFuZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZQogICBwYXNzZWQgdG8gdGhlIG9iamVjdCBjb25zdHJ1Y3Rvci4KCiAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3CiAgIGluc3RhbmNl4oCZcyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuCgogICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGUKICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdAogICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvCiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi4KCm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSkKCiAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgIl9fbmV3X18oKSIpLCBidXQKICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZQogICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuCiAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNz4oCZcyAiX19pbml0X18oKSIgbWV0aG9kLCBpZgogICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlCiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOgogICAic3VwZXIoKS5fX2luaXRfXyhbYXJncy4uLl0pIi4KCiAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluIGNvbnN0cnVjdGluZwogICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXplCiAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyBkb2luZyBzbwogICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuCgpvYmplY3QuX19kZWxfXyhzZWxmKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzbwogICBjYWxsZWQgYSBmaW5hbGl6ZXIgb3IgKGltcHJvcGVybHkpIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcwogICBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNz4oCZcyAiX19kZWxfXygpIiBtZXRob2QsCiAgIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUKICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZS4KCiAgIEl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yIHRoZSAiX19kZWxfXygpIiBtZXRob2QKICAgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5IGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZQogICB0byBpdC4gIFRoaXMgaXMgY2FsbGVkIG9iamVjdCAqcmVzdXJyZWN0aW9uKi4gIEl0IGlzCiAgIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCB3aGV0aGVyICJfX2RlbF9fKCkiIGlzIGNhbGxlZCBhIHNlY29uZAogICB0aW1lIHdoZW4gYSByZXN1cnJlY3RlZCBvYmplY3QgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkOyB0aGUKICAgY3VycmVudCAqQ1B5dGhvbiogaW1wbGVtZW50YXRpb24gb25seSBjYWxscyBpdCBvbmNlLgoKICAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yCiAgIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuIHRoZSBpbnRlcnByZXRlciBleGl0cy4KCiAgIE5vdGU6CgogICAgICJkZWwgeCIgZG9lc27igJl0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiDigJQgdGhlIGZvcm1lcgogICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIgaXMKICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IuKAmXMgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4KCiAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSXQgaXMgcG9zc2libGUgZm9yIGEgcmVmZXJlbmNlCiAgIGN5Y2xlIHRvIHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbSBnb2luZyB0bwogICB6ZXJvLiAgSW4gdGhpcyBjYXNlLCB0aGUgY3ljbGUgd2lsbCBiZSBsYXRlciBkZXRlY3RlZCBhbmQgZGVsZXRlZAogICBieSB0aGUgKmN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciouICBBIGNvbW1vbiBjYXVzZSBvZiByZWZlcmVuY2UKICAgY3ljbGVzIGlzIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGNhdWdodCBpbiBhIGxvY2FsIHZhcmlhYmxlLgogICBUaGUgZnJhbWXigJlzIGxvY2FscyB0aGVuIHJlZmVyZW5jZSB0aGUgZXhjZXB0aW9uLCB3aGljaCByZWZlcmVuY2VzCiAgIGl0cyBvd24gdHJhY2ViYWNrLCB3aGljaCByZWZlcmVuY2VzIHRoZSBsb2NhbHMgb2YgYWxsIGZyYW1lcyBjYXVnaHQKICAgaW4gdGhlIHRyYWNlYmFjay4KCiAgIFNlZSBhbHNvOiBEb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUuCgogICBXYXJuaW5nOgoKICAgICBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCAiX19kZWxfXygpIgogICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uCiAgICAgYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byAic3lzLnN0ZGVyciIgaW5zdGVhZC4KICAgICBJbiBwYXJ0aWN1bGFyOgoKICAgICAqICJfX2RlbF9fKCkiIGNhbiBiZSBpbnZva2VkIHdoZW4gYXJiaXRyYXJ5IGNvZGUgaXMgYmVpbmcKICAgICAgIGV4ZWN1dGVkLCBpbmNsdWRpbmcgZnJvbSBhbnkgYXJiaXRyYXJ5IHRocmVhZC4gIElmICJfX2RlbF9fKCkiCiAgICAgICBuZWVkcyB0byB0YWtlIGEgbG9jayBvciBpbnZva2UgYW55IG90aGVyIGJsb2NraW5nIHJlc291cmNlLCBpdAogICAgICAgbWF5IGRlYWRsb2NrIGFzIHRoZSByZXNvdXJjZSBtYXkgYWxyZWFkeSBiZSB0YWtlbiBieSB0aGUgY29kZQogICAgICAgdGhhdCBnZXRzIGludGVycnVwdGVkIHRvIGV4ZWN1dGUgIl9fZGVsX18oKSIuCgogICAgICogIl9fZGVsX18oKSIgY2FuIGJlIGV4ZWN1dGVkIGR1cmluZyBpbnRlcnByZXRlciBzaHV0ZG93bi4gIEFzIGEKICAgICAgIGNvbnNlcXVlbmNlLCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyBpdCBuZWVkcyB0byBhY2Nlc3MgKGluY2x1ZGluZwogICAgICAgb3RoZXIgbW9kdWxlcykgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3Igc2V0IHRvICJOb25lIi4KICAgICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlCiAgICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzCiAgICAgICBhcmUgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMKICAgICAgIG1heSBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlCiAgICAgICBhdCB0aGUgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLgoKb2JqZWN0Ll9fcmVwcl9fKHNlbGYpCgogICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIOKAnG9mZmljaWFs4oCdCiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXMKICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0bwogICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUKICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtCiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm4KICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAiX19yZXByX18oKSIgYnV0CiAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4g4oCcaW5mb3JtYWzigJ0KICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzIHJlcXVpcmVkLgoKICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUKICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuCgpvYmplY3QuX19zdHJfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmQKICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlIOKAnGluZm9ybWFs4oCdIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nCiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZwogICBvYmplY3QuCgogICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vCiAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGEKICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuCgogICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICJvYmplY3QiCiAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuCgpvYmplY3QuX19ieXRlc19fKHNlbGYpCgogICBDYWxsZWQgYnkgYnl0ZXMgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuCiAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuCgpvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKCiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGJ5IGV4dGVuc2lvbiwKICAgZXZhbHVhdGlvbiBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFuZCB0aGUgInN0ci5mb3JtYXQoKSIKICAgbWV0aG9kLCB0byBwcm9kdWNlIGEg4oCcZm9ybWF0dGVk4oCdIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbgogICBvYmplY3QuIFRoZSAqZm9ybWF0X3NwZWMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYQogICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuIFRoZSBpbnRlcnByZXRhdGlvbgogICBvZiB0aGUgKmZvcm1hdF9zcGVjKiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSBpbXBsZW1lbnRpbmcKICAgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGwgZWl0aGVyIGRlbGVnYXRlCiAgIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGEgc2ltaWxhcgogICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguCgogICBTZWUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguCgogICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiIGl0c2VsZgogICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiAib2JqZWN0Ll9fZm9ybWF0X18oeCwgJycpIiBpcyBub3cKICAgZXF1aXZhbGVudCB0byAic3RyKHgpIiByYXRoZXIgdGhhbiAiZm9ybWF0KHN0cih4KSwgJycpIi4KCm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCDigJxyaWNoIGNvbXBhcmlzb27igJ0gbWV0aG9kcy4gVGhlCiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzCiAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAieC5fX2xlX18oeSkiLAogICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICJ4PnkiIGNhbGxzCiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi4KCiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gIk5vdEltcGxlbWVudGVkIgogICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mCiAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCBmb3IgYQogICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsCiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sCiAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICJib29sKCkiCiAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yIGZhbHNlLgoKICAgQnkgZGVmYXVsdCwgIm9iamVjdCIgaW1wbGVtZW50cyAiX19lcV9fKCkiIGJ5IHVzaW5nICJpcyIsIHJldHVybmluZwogICAiTm90SW1wbGVtZW50ZWQiIGluIHRoZSBjYXNlIG9mIGEgZmFsc2UgY29tcGFyaXNvbjogIlRydWUgaWYgeCBpcyB5CiAgIGVsc2UgTm90SW1wbGVtZW50ZWQiLiBGb3IgIl9fbmVfXygpIiwgYnkgZGVmYXVsdCBpdCBkZWxlZ2F0ZXMgdG8KICAgIl9fZXFfXygpIiBhbmQgaW52ZXJ0cyB0aGUgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLgogICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZCByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uCiAgIG9wZXJhdG9ycyBvciBkZWZhdWx0IGltcGxlbWVudGF0aW9uczsgZm9yIGV4YW1wbGUsIHRoZSB0cnV0aCBvZgogICAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlCiAgIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlCiAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuCgogICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uCiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uCiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgoKICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZAogICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0CiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXLigJlzCiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXLigJlzIHJlZmxlY3Rpb24sCiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlCiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCB0aGUgcmlnaHQgb3BlcmFuZOKAmXMgdHlwZSBpcyBhCiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5k4oCZcyB0eXBlLCB0aGUKICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGUKICAgbGVmdCBvcGVyYW5k4oCZcyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3QKICAgY29uc2lkZXJlZC4KCiAgIFdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIHJldHVybnMgYW55IHZhbHVlIG90aGVyIHRoYW4KICAgIk5vdEltcGxlbWVudGVkIiwgdGhlICI9PSIgYW5kICIhPSIgb3BlcmF0b3JzIHdpbGwgZmFsbCBiYWNrIHRvCiAgICJpcyIgYW5kICJpcyBub3QiLCByZXNwZWN0aXZlbHkuCgpvYmplY3QuX19oYXNoX18oc2VsZikKCiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgb24gbWVtYmVycwogICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICJkaWN0Ii4KICAgVGhlICJfX2hhc2hfXygpIiBtZXRob2Qgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiBUaGUgb25seSByZXF1aXJlZAogICBwcm9wZXJ0eSBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2gKICAgdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gbWl4IHRvZ2V0aGVyIHRoZSBoYXNoIHZhbHVlcyBvZiB0aGUKICAgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mCiAgIG9iamVjdHMgYnkgcGFja2luZyB0aGVtIGludG8gYSB0dXBsZSBhbmQgaGFzaGluZyB0aGUgdHVwbGUuCiAgIEV4YW1wbGU6CgogICAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5uYW1lLCBzZWxmLm5pY2ssIHNlbGYuY29sb3IpKQoKICAgTm90ZToKCiAgICAgImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdOKAmXMgY3VzdG9tCiAgICAgIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXMgaXMKICAgICB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uIDMyLWJpdCBidWlsZHMuCiAgICAgSWYgYW4gb2JqZWN04oCZcyAgICJfX2hhc2hfXygpIiBtdXN0IGludGVyb3BlcmF0ZSBvbiBidWlsZHMgb2YKICAgICBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiBhbGwgc3VwcG9ydGVkCiAgICAgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWMgImltcG9ydCBzeXM7CiAgICAgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi4KCiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3QKICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIgogICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgaXRlbXMgaW4KICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZAogICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudAogICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAqaGFzaGFibGUqIGNvbGxlY3Rpb25zCiAgIHJlcXVpcmVzIHRoYXQgYSBrZXnigJlzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN04oCZcyBoYXNoCiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS4KCiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiIG1ldGhvZHMgYnkKICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoCiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2gKICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gaGFzaCh5KSIuCgogICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSIKICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgV2hlbiB0aGUKICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcwogICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvCiAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXMKICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwKICAgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKSIuCgogICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZQogICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlIGludGVycHJldGVyCiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPQogICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi4KCiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzcwogICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzcwogICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgdGhhdAogICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXMKICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5hYmMuSGFzaGFibGUpIiBjYWxsLgoKICAgTm90ZToKCiAgICAgQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyIGFuZCBieXRlcyBvYmplY3RzIGFyZQogICAgIOKAnHNhbHRlZOKAnSB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLiAgQWx0aG91Z2ggdGhleQogICAgIHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob24gcHJvY2VzcywgdGhleSBhcmUgbm90CiAgICAgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZiBQeXRob24uVGhpcyBpcwogICAgIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLW9mLXNlcnZpY2UgY2F1c2VkCiAgICAgYnkgY2FyZWZ1bGx5IGNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZSB3b3JzdCBjYXNlCiAgICAgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgKk8qKCpuKl4yKSBjb21wbGV4aXR5LiAgU2VlCiAgICAgaHR0cDovL29jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yCiAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gb3JkZXIgb2Ygc2V0cy4KICAgICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlcyBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQKICAgICB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gMzItYml0IGFuZCA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbwogICAgICJQWVRIT05IQVNIU0VFRCIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgoKb2JqZWN0Ll9fYm9vbF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb24KICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdAogICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzCiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzIGRlZmluZXMKICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmUKICAgY29uc2lkZXJlZCB0cnVlLgraCGRlYnVnZ2VydalQAAAicGRiIiDigJQgVGhlIFB5dGhvbiBEZWJ1Z2dlcgoqKioqKioqKioqKioqKioqKioqKioqKioqKioKCioqU291cmNlIGNvZGU6KiogTGliL3BkYi5weQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIG1vZHVsZSAicGRiIiBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyIGZvcgpQeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kCnNpbmdsZSBzdGVwcGluZyBhdCB0aGUgc291cmNlIGxpbmUgbGV2ZWwsIGluc3BlY3Rpb24gb2Ygc3RhY2sgZnJhbWVzLApzb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gdGhlCmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcKYW5kIGNhbiBiZSBjYWxsZWQgdW5kZXIgcHJvZ3JhbSBjb250cm9sLgoKVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUg4oCTIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlIGNsYXNzCiJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5IHJlYWRpbmcKdGhlIHNvdXJjZS4gIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIHVzZXMgdGhlIG1vZHVsZXMgImJkYiIgYW5kICJjbWQiLgoKU2VlIGFsc286CgogIE1vZHVsZSAiZmF1bHRoYW5kbGVyIgogICAgIFVzZWQgdG8gZHVtcCBQeXRob24gdHJhY2ViYWNrcyBleHBsaWNpdGx5LCBvbiBhIGZhdWx0LCBhZnRlciBhCiAgICAgdGltZW91dCwgb3Igb24gYSB1c2VyIHNpZ25hbC4KCiAgTW9kdWxlICJ0cmFjZWJhY2siCiAgICAgU3RhbmRhcmQgaW50ZXJmYWNlIHRvIGV4dHJhY3QsIGZvcm1hdCBhbmQgcHJpbnQgc3RhY2sgdHJhY2VzIG9mCiAgICAgUHl0aG9uIHByb2dyYW1zLgoKVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgaXMgdG8gaW5zZXJ0OgoKICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCgpPcjoKCiAgIGJyZWFrcG9pbnQoKQoKYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLCBhbmQgdGhlbiBydW4gdGhlCnByb2dyYW0uIFlvdSBjYW4gdGhlbiBzdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LAphbmQgY29udGludWUgcnVubmluZyB3aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIgpjb21tYW5kLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogVGhlIGJ1aWx0LWluICJicmVha3BvaW50KCkiLCB3aGVuIGNhbGxlZCB3aXRoCmRlZmF1bHRzLCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mICJpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkiLgoKICAgZGVmIGRvdWJsZSh4KToKICAgICAgYnJlYWtwb2ludCgpCiAgICAgIHJldHVybiB4ICogMgogICB2YWwgPSAzCiAgIHByaW50KGYie3ZhbH0gKiAyIGlzIHtkb3VibGUodmFsKX0iKQoKVGhlIGRlYnVnZ2Vy4oCZcyBwcm9tcHQgaXMgIihQZGIpIiwgd2hpY2ggaXMgdGhlIGluZGljYXRvciB0aGF0IHlvdSBhcmUKaW4gZGVidWcgbW9kZToKCiAgID4gLi4uKDMpZG91YmxlKCkKICAgLT4gcmV0dXJuIHggKiAyCiAgIChQZGIpIHAgeAogICAzCiAgIChQZGIpIGNvbnRpbnVlCiAgIDMgKiAyIGlzIDYKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFRhYi1jb21wbGV0aW9uIHZpYSB0aGUgInJlYWRsaW5lIiBtb2R1bGUgaXMKYXZhaWxhYmxlIGZvciBjb21tYW5kcyBhbmQgY29tbWFuZCBhcmd1bWVudHMsIGUuZy4gdGhlIGN1cnJlbnQgZ2xvYmFsCmFuZCBsb2NhbCBuYW1lcyBhcmUgb2ZmZXJlZCBhcyBhcmd1bWVudHMgb2YgdGhlICJwIiBjb21tYW5kLgoKWW91IGNhbiBhbHNvIGludm9rZSAicGRiIiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG8gZGVidWcgb3RoZXIKc2NyaXB0cy4gIEZvciBleGFtcGxlOgoKICAgcHl0aG9uIC1tIHBkYiBteXNjcmlwdC5weQoKV2hlbiBpbnZva2VkIGFzIGEgbW9kdWxlLCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtCmRlYnVnZ2luZyBpZiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBleGl0cyBhYm5vcm1hbGx5LiAgQWZ0ZXIgcG9zdC0KbW9ydGVtIGRlYnVnZ2luZyAob3IgYWZ0ZXIgbm9ybWFsIGV4aXQgb2YgdGhlIHByb2dyYW0pLCBwZGIgd2lsbApyZXN0YXJ0IHRoZSBwcm9ncmFtLiAgQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYuKAmXMgc3RhdGUgKHN1Y2gKYXMgYnJlYWtwb2ludHMpIGFuZCBpbiBtb3N0IGNhc2VzIGlzIG1vcmUgdXNlZnVsIHRoYW4gcXVpdHRpbmcgdGhlCmRlYnVnZ2VyIHVwb24gcHJvZ3JhbeKAmXMgZXhpdC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFkZGVkIHRoZSAiLWMiIG9wdGlvbiB0byBleGVjdXRlIGNvbW1hbmRzIGFzCmlmIGdpdmVuIGluIGEgIi5wZGJyYyIgZmlsZTsgc2VlIERlYnVnZ2VyIENvbW1hbmRzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogQWRkZWQgdGhlICItbSIgb3B0aW9uIHRvIGV4ZWN1dGUgbW9kdWxlcwpzaW1pbGFyIHRvIHRoZSB3YXkgInB5dGhvbiAtbSIgZG9lcy4gQXMgd2l0aCBhIHNjcmlwdCwgdGhlIGRlYnVnZ2VyCndpbGwgcGF1c2UgZXhlY3V0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBtb2R1bGUuCgpUeXBpY2FsIHVzYWdlIHRvIGV4ZWN1dGUgYSBzdGF0ZW1lbnQgdW5kZXIgY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6CgogICA+Pj4gaW1wb3J0IHBkYgogICA+Pj4gZGVmIGYoeCk6CiAgIC4uLiAgICAgcHJpbnQoMSAvIHgpCiAgID4+PiBwZGIucnVuKCJmKDIpIikKICAgPiA8c3RyaW5nPigxKTxtb2R1bGU+KCkKICAgKFBkYikgY29udGludWUKICAgMC41CiAgID4+PgoKVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczoKCiAgID4+PiBpbXBvcnQgcGRiCiAgID4+PiBkZWYgZih4KToKICAgLi4uICAgICBwcmludCgxIC8geCkKICAgLi4uCiAgID4+PiBmKDApCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIGYKICAgWmVyb0RpdmlzaW9uRXJyb3I6IGRpdmlzaW9uIGJ5IHplcm8KICAgPj4+IHBkYi5wbSgpCiAgID4gPHN0ZGluPigyKWYoKQogICAoUGRiKSBwIHgKICAgMAogICAoUGRiKQoKVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXIKaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OgoKcGRiLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpCgogICBFeGVjdXRlIHRoZSAqc3RhdGVtZW50KiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdCkgdW5kZXIKICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXMKICAgZXhlY3V0ZWQ7IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlICJjb250aW51ZSIsIG9yIHlvdSBjYW4KICAgc3RlcCB0aHJvdWdoIHRoZSBzdGF0ZW1lbnQgdXNpbmcgInN0ZXAiIG9yICJuZXh0IiAoYWxsIHRoZXNlCiAgIGNvbW1hbmRzIGFyZSBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscyoKICAgYXJndW1lbnRzIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzIGV4ZWN1dGVkOyBieQogICBkZWZhdWx0IHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBtb2R1bGUgIl9fbWFpbl9fIiBpcyB1c2VkLiAgKFNlZSB0aGUKICAgZXhwbGFuYXRpb24gb2YgdGhlIGJ1aWx0LWluICJleGVjKCkiIG9yICJldmFsKCkiIGZ1bmN0aW9ucy4pCgpwZGIucnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKQoKICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdCkKICAgdW5kZXIgZGVidWdnZXIgY29udHJvbC4gIFdoZW4gInJ1bmV2YWwoKSIgcmV0dXJucywgaXQgcmV0dXJucyB0aGUKICAgdmFsdWUgb2YgdGhlICpleHByZXNzaW9uKi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8KICAgInJ1bigpIi4KCnBkYi5ydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKQoKICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpCiAgIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFdoZW4gInJ1bmNhbGwoKSIgcmV0dXJucywgaXQgcmV0dXJucwogICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycwogICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLgoKcGRiLnNldF90cmFjZSgqLCBoZWFkZXI9Tm9uZSkKCiAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvCiAgIGhhcmQtY29kZSBhIGJyZWFrcG9pbnQgYXQgYSBnaXZlbiBwb2ludCBpbiBhIHByb2dyYW0sIGV2ZW4gaWYgdGhlCiAgIGNvZGUgaXMgbm90IG90aGVyd2lzZSBiZWluZyBkZWJ1Z2dlZCAoZS5nLiB3aGVuIGFuIGFzc2VydGlvbgogICBmYWlscykuICBJZiBnaXZlbiwgKmhlYWRlciogaXMgcHJpbnRlZCB0byB0aGUgY29uc29sZSBqdXN0IGJlZm9yZQogICBkZWJ1Z2dpbmcgYmVnaW5zLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogVGhlIGtleXdvcmQtb25seSBhcmd1bWVudCAqaGVhZGVyKi4KCnBkYi5wb3N0X21vcnRlbSh0cmFjZWJhY2s9Tm9uZSkKCiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gKnRyYWNlYmFjayogb2JqZWN0LiAgSWYgbm8KICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaXMKICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgaWYgdGhlCiAgIGRlZmF1bHQgaXMgdG8gYmUgdXNlZCkuCgpwZGIucG0oKQoKICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW4KICAgInN5cy5sYXN0X3RyYWNlYmFjayIuCgpUaGUgInJ1bioiIGZ1bmN0aW9ucyBhbmQgInNldF90cmFjZSgpIiBhcmUgYWxpYXNlcyBmb3IgaW5zdGFudGlhdGluZwp0aGUgIlBkYiIgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiAgSWYgeW91IHdhbnQKdG8gYWNjZXNzIGZ1cnRoZXIgZmVhdHVyZXMsIHlvdSBoYXZlIHRvIGRvIHRoaXMgeW91cnNlbGY6CgpjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PSd0YWInLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lLCBub3NpZ2ludD1GYWxzZSwgcmVhZHJjPVRydWUpCgogICAiUGRiIiBpcyB0aGUgZGVidWdnZXIgY2xhc3MuCgogICBUaGUgKmNvbXBsZXRla2V5KiwgKnN0ZGluKiBhbmQgKnN0ZG91dCogYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlCiAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLgoKICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZQogICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzIHRoYXQKICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuIFsxXQoKICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggaXMgc2VudAogICB3aGVuIHRoZSB1c2VyIHByZXNzZXMgIkN0cmwtQyIgb24gdGhlIGNvbnNvbGUpIHdoZW4geW91IGdpdmUgYQogICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlcgogICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybC1DIi4gIElmIHlvdSB3YW50IFBkYiBub3QgdG8gdG91Y2ggdGhlCiAgIFNJR0lOVCBoYW5kbGVyLCBzZXQgKm5vc2lnaW50KiB0byB0cnVlLgoKICAgVGhlICpyZWFkcmMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHRydWUgYW5kIGNvbnRyb2xzIHdoZXRoZXIgUGRiCiAgIHdpbGwgbG9hZCAucGRicmMgZmlsZXMgZnJvbSB0aGUgZmlsZXN5c3RlbS4KCiAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjoKCiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bJ2RqYW5nby4qJ10pLnNldF90cmFjZSgpCgogICBSYWlzZXMgYW4gYXVkaXRpbmcgZXZlbnQgInBkYi5QZGIiIHdpdGggbm8gYXJndW1lbnRzLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogQWRkZWQgdGhlICpza2lwKiBwYXJhbWV0ZXIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBZGRlZCB0aGUgKm5vc2lnaW50KiBwYXJhbWV0ZXIuIFByZXZpb3VzbHksCiAgIGEgU0lHSU5UIGhhbmRsZXIgd2FzIG5ldmVyIHNldCBieSBQZGIuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy42OiBUaGUgKnJlYWRyYyogYXJndW1lbnQuCgogICBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKQogICBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpCiAgIHJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpCiAgIHNldF90cmFjZSgpCgogICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLgoKCkRlYnVnZ2VyIENvbW1hbmRzCj09PT09PT09PT09PT09PT09CgpUaGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGVidWdnZXIgYXJlIGxpc3RlZCBiZWxvdy4gIE1vc3QKY29tbWFuZHMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVycyBhcyBpbmRpY2F0ZWQ7IGUuZy4KImgoZWxwKSIgbWVhbnMgdGhhdCBlaXRoZXIgImgiIG9yICJoZWxwIiBjYW4gYmUgdXNlZCB0byBlbnRlciB0aGUgaGVscApjb21tYW5kIChidXQgbm90ICJoZSIgb3IgImhlbCIsIG5vciAiSCIgb3IgIkhlbHAiIG9yICJIRUxQIikuCkFyZ3VtZW50cyB0byBjb21tYW5kcyBtdXN0IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIChzcGFjZXMgb3IKdGFicykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAoIltdIikgaW4KdGhlIGNvbW1hbmQgc3ludGF4OyB0aGUgc3F1YXJlIGJyYWNrZXRzIG11c3Qgbm90IGJlIHR5cGVkLgpBbHRlcm5hdGl2ZXMgaW4gdGhlIGNvbW1hbmQgc3ludGF4IGFyZSBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCBiYXIKKCJ8IikuCgpFbnRlcmluZyBhIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kIGVudGVyZWQuICBFeGNlcHRpb246IGlmCnRoZSBsYXN0IGNvbW1hbmQgd2FzIGEgImxpc3QiIGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZSBsaXN0ZWQuCgpDb21tYW5kcyB0aGF0IHRoZSBkZWJ1Z2dlciBkb2VzbuKAmXQgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlIFB5dGhvbgpzdGF0ZW1lbnRzIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2dyYW0gYmVpbmcKZGVidWdnZWQuICBQeXRob24gc3RhdGVtZW50cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uCnBvaW50ICgiISIpLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtIGJlaW5nCmRlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9yIGNhbGwgYSBmdW5jdGlvbi4KV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHN1Y2ggYSBzdGF0ZW1lbnQsIHRoZSBleGNlcHRpb24gbmFtZSBpcwpwcmludGVkIGJ1dCB0aGUgZGVidWdnZXLigJlzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLgoKVGhlIGRlYnVnZ2VyIHN1cHBvcnRzIGFsaWFzZXMuICBBbGlhc2VzIGNhbiBoYXZlIHBhcmFtZXRlcnMgd2hpY2gKYWxsb3dzIG9uZSBhIGNlcnRhaW4gbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyCmV4YW1pbmF0aW9uLgoKTXVsdGlwbGUgY29tbWFuZHMgbWF5IGJlIGVudGVyZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5ICI7OyIuCihBIHNpbmdsZSAiOyIgaXMgbm90IHVzZWQgYXMgaXQgaXMgdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgY29tbWFuZHMKaW4gYSBsaW5lIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBQeXRob24gcGFyc2VyLikgIE5vIGludGVsbGlnZW5jZSBpcwphcHBsaWVkIHRvIHNlcGFyYXRpbmcgdGhlIGNvbW1hbmRzOyB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgdGhlIGZpcnN0CiI7OyIgcGFpciwgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcXVvdGVkIHN0cmluZy4gQQp3b3JrYXJvdW5kIGZvciBzdHJpbmdzIHdpdGggZG91YmxlIHNlbWljb2xvbnMgaXMgdG8gdXNlIGltcGxpY2l0CnN0cmluZyBjb25jYXRlbmF0aW9uICInOycnOyciIG9yICIiOyIiOyIiLgoKSWYgYSBmaWxlICIucGRicmMiIGV4aXN0cyBpbiB0aGUgdXNlcuKAmXMgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gdGhlCmN1cnJlbnQgZGlyZWN0b3J5LCBpdCBpcyByZWFkIHdpdGggIid1dGYtOCciIGVuY29kaW5nIGFuZCBleGVjdXRlZCBhcwppZiBpdCBoYWQgYmVlbiB0eXBlZCBhdCB0aGUgZGVidWdnZXIgcHJvbXB0LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAplbXB0eSBsaW5lcyBhbmQgbGluZXMgc3RhcnRpbmcgd2l0aCAiIyIgYXJlIGlnbm9yZWQuICBUaGlzIGlzCnBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGFsaWFzZXMuICBJZiBib3RoIGZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZQpob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0IGFuZCBhbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlCm92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdApjb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCB0aGVzZQpjb21tYW5kcyBoYWQgbm8gZWZmZWN0LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6ICIucGRicmMiIGlzIG5vdyByZWFkIHdpdGggIid1dGYtOCciIGVuY29kaW5nLgpQcmV2aW91c2x5LCBpdCB3YXMgcmVhZCB3aXRoIHRoZSBzeXN0ZW0gbG9jYWxlIGVuY29kaW5nLgoKaChlbHApIFtjb21tYW5kXQoKICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCBhCiAgICpjb21tYW5kKiBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQuICAiaGVscCBwZGIiCiAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiCiAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgImhlbHAKICAgZXhlYyIgbXVzdCBiZSBlbnRlcmVkIHRvIGdldCBoZWxwIG9uIHRoZSAiISIgY29tbWFuZC4KCncoaGVyZSkKCiAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uICBBbgogICBhcnJvdyAoIj4iKSBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGRldGVybWluZXMgdGhlCiAgIGNvbnRleHQgb2YgbW9zdCBjb21tYW5kcy4KCmQob3duKSBbY291bnRdCgogICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiB0aGUKICAgc3RhY2sgdHJhY2UgKHRvIGEgbmV3ZXIgZnJhbWUpLgoKdShwKSBbY291bnRdCgogICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgdXAgaW4gdGhlIHN0YWNrCiAgIHRyYWNlICh0byBhbiBvbGRlciBmcmFtZSkuCgpiKHJlYWspIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV0KCiAgIFdpdGggYSAqbGluZW5vKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQgZmlsZS4KICAgV2l0aCBhICpmdW5jdGlvbiogYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCBleGVjdXRhYmxlCiAgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIFRoZSBsaW5lIG51bWJlciBtYXkgYmUgcHJlZml4ZWQKICAgd2l0aCBhIGZpbGVuYW1lIGFuZCBhIGNvbG9uLCB0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiBhbm90aGVyCiAgIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0IGhhc27igJl0IGJlZW4gbG9hZGVkIHlldCkuICBUaGUgZmlsZSBpcwogICBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLiAgTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyBhc3NpZ25lZCBhCiAgIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyIGJyZWFrcG9pbnQgY29tbWFuZHMgcmVmZXIuCgogICBJZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhbiBleHByZXNzaW9uIHdoaWNoIG11c3QKICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4KCiAgIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcywgaW5jbHVkaW5nIGZvciBlYWNoIGJyZWFrcG9pbnQsCiAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmVha3BvaW50IGhhcyBiZWVuIGhpdCwgdGhlIGN1cnJlbnQKICAgaWdub3JlIGNvdW50LCBhbmQgdGhlIGFzc29jaWF0ZWQgY29uZGl0aW9uIGlmIGFueS4KCnRicmVhayBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dCgogICBUZW1wb3JhcnkgYnJlYWtwb2ludCwgd2hpY2ggaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXMKICAgZmlyc3QgaGl0LiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgImJyZWFrIi4KCmNsKGVhcikgW2ZpbGVuYW1lOmxpbmVubyB8IGJwbnVtYmVyIC4uLl0KCiAgIFdpdGggYSAqZmlsZW5hbWU6bGluZW5vKiBhcmd1bWVudCwgY2xlYXIgYWxsIHRoZSBicmVha3BvaW50cyBhdAogICB0aGlzIGxpbmUuIFdpdGggYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBicmVha3BvaW50IG51bWJlcnMsIGNsZWFyCiAgIHRob3NlIGJyZWFrcG9pbnRzLiBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQgZmlyc3QKICAgYXNrIGNvbmZpcm1hdGlvbikuCgpkaXNhYmxlIFticG51bWJlciAuLi5dCgogICBEaXNhYmxlIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mCiAgIGJyZWFrcG9pbnQgbnVtYmVycy4gIERpc2FibGluZyBhIGJyZWFrcG9pbnQgbWVhbnMgaXQgY2Fubm90IGNhdXNlCiAgIHRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLCBidXQgdW5saWtlIGNsZWFyaW5nIGEgYnJlYWtwb2ludCwgaXQKICAgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBicmVha3BvaW50cyBhbmQgY2FuIGJlIChyZS0pZW5hYmxlZC4KCmVuYWJsZSBbYnBudW1iZXIgLi4uXQoKICAgRW5hYmxlIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuCgppZ25vcmUgYnBudW1iZXIgW2NvdW50XQoKICAgU2V0IHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmICpjb3VudCoKICAgaXMgb21pdHRlZCwgdGhlIGlnbm9yZSBjb3VudCBpcyBzZXQgdG8gMC4gIEEgYnJlYWtwb2ludCBiZWNvbWVzCiAgIGFjdGl2ZSB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZSAqY291bnQqCiAgIGlzIGRlY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkIGFuZCB0aGUKICAgYnJlYWtwb2ludCBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMKICAgdG8gdHJ1ZS4KCmNvbmRpdGlvbiBicG51bWJlciBbY29uZGl0aW9uXQoKICAgU2V0IGEgbmV3ICpjb25kaXRpb24qIGZvciB0aGUgYnJlYWtwb2ludCwgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0CiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuICBJZiAqY29uZGl0aW9uKgogICBpcyBhYnNlbnQsIGFueSBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlIGJyZWFrcG9pbnQKICAgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLgoKY29tbWFuZHMgW2JwbnVtYmVyXQoKICAgU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyICpicG51bWJlciouICBUaGUKICAgY29tbWFuZHMgdGhlbXNlbHZlcyBhcHBlYXIgb24gdGhlIGZvbGxvd2luZyBsaW5lcy4gIFR5cGUgYSBsaW5lCiAgIGNvbnRhaW5pbmcganVzdCAiZW5kIiB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOgoKICAgICAgKFBkYikgY29tbWFuZHMgMQogICAgICAoY29tKSBwIHNvbWVfdmFyaWFibGUKICAgICAgKGNvbSkgZW5kCiAgICAgIChQZGIpCgogICBUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlICJjb21tYW5kcyIgYW5kCiAgIGZvbGxvdyBpdCBpbW1lZGlhdGVseSB3aXRoICJlbmQiOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLgoKICAgV2l0aCBubyAqYnBudW1iZXIqIGFyZ3VtZW50LCAiY29tbWFuZHMiIHJlZmVycyB0byB0aGUgbGFzdAogICBicmVha3BvaW50IHNldC4KCiAgIFlvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwIGFnYWluLgogICBTaW1wbHkgdXNlIHRoZSAiY29udGludWUiIGNvbW1hbmQsIG9yICJzdGVwIiwgb3IgYW55IG90aGVyIGNvbW1hbmQKICAgdGhhdCByZXN1bWVzIGV4ZWN1dGlvbi4KCiAgIFNwZWNpZnlpbmcgYW55IGNvbW1hbmQgcmVzdW1pbmcgZXhlY3V0aW9uIChjdXJyZW50bHkgImNvbnRpbnVlIiwKICAgInN0ZXAiLCAibmV4dCIsICJyZXR1cm4iLCAianVtcCIsICJxdWl0IiBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykKICAgdGVybWluYXRlcyB0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5CiAgIGZvbGxvd2VkIGJ5IGVuZCkuIFRoaXMgaXMgYmVjYXVzZSBhbnkgdGltZSB5b3UgcmVzdW1lIGV4ZWN1dGlvbgogICAoZXZlbiB3aXRoIGEgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyIGFub3RoZXIKICAgYnJlYWtwb2ludOKAlHdoaWNoIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8KICAgYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgoKICAgSWYgeW91IHVzZSB0aGUgInNpbGVudCIgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUgdXN1YWwKICAgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heSBiZQogICBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQKICAgdGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCB5b3UKICAgc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KCnModGVwKQoKICAgRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgogICAoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3Igb24gdGhlIG5leHQgbGluZSBpbiB0aGUKICAgY3VycmVudCBmdW5jdGlvbikuCgpuKGV4dCkKCiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzCiAgIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4gIChUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJuZXh0IiBhbmQgInN0ZXAiCiAgIGlzIHRoYXQgInN0ZXAiIHN0b3BzIGluc2lkZSBhIGNhbGxlZCBmdW5jdGlvbiwgd2hpbGUgIm5leHQiCiAgIGV4ZWN1dGVzIGNhbGxlZCBmdW5jdGlvbnMgYXQgKG5lYXJseSkgZnVsbCBzcGVlZCwgb25seSBzdG9wcGluZyBhdAogICB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLikKCnVudChpbCkgW2xpbmVub10KCiAgIFdpdGhvdXQgYXJndW1lbnQsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgbnVtYmVyCiAgIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMgcmVhY2hlZC4KCiAgIFdpdGggKmxpbmVubyosIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCBhIGxpbmUgd2l0aCBhIG51bWJlcgogICBncmVhdGVyIG9yIGVxdWFsIHRvICpsaW5lbm8qIGlzIHJlYWNoZWQuICBJbiBib3RoIGNhc2VzLCBhbHNvIHN0b3AKICAgd2hlbiB0aGUgY3VycmVudCBmcmFtZSByZXR1cm5zLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogQWxsb3cgZ2l2aW5nIGFuIGV4cGxpY2l0IGxpbmUgbnVtYmVyLgoKcihldHVybikKCiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLgoKYyhvbnQoaW51ZSkpCgogICBDb250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyBlbmNvdW50ZXJlZC4KCmoodW1wKSBsaW5lbm8KCiAgIFNldCB0aGUgbmV4dCBsaW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4gIE9ubHkgYXZhaWxhYmxlIGluIHRoZQogICBib3R0b20tbW9zdCBmcmFtZS4gIFRoaXMgbGV0cyB5b3UganVtcCBiYWNrIGFuZCBleGVjdXRlIGNvZGUgYWdhaW4sCiAgIG9yIGp1bXAgZm9yd2FyZCB0byBza2lwIGNvZGUgdGhhdCB5b3UgZG9u4oCZdCB3YW50IHRvIHJ1bi4KCiAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IG5vdCBhbGwganVtcHMgYXJlIGFsbG93ZWQg4oCTIGZvciBpbnN0YW5jZSBpdAogICBpcyBub3QgcG9zc2libGUgdG8ganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSAiZm9yIiBsb29wIG9yIG91dCBvZiBhCiAgICJmaW5hbGx5IiBjbGF1c2UuCgpsKGlzdCkgW2ZpcnN0WywgbGFzdF1dCgogICBMaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLiAgV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTEKICAgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGludWUgdGhlIHByZXZpb3VzIGxpc3RpbmcuCiAgIFdpdGggIi4iIGFzIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lLiAgV2l0aAogICBvbmUgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIGF0IHRoYXQgbGluZS4gIFdpdGggdHdvCiAgIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7IGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbGVzcwogICB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC4KCiAgIFRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW5kaWNhdGVkIGJ5ICItPiIuICBJZiBhbgogICBleGNlcHRpb24gaXMgYmVpbmcgZGVidWdnZWQsIHRoZSBsaW5lIHdoZXJlIHRoZSBleGNlcHRpb24gd2FzCiAgIG9yaWdpbmFsbHkgcmFpc2VkIG9yIHByb3BhZ2F0ZWQgaXMgaW5kaWNhdGVkIGJ5ICI+PiIsIGlmIGl0IGRpZmZlcnMKICAgZnJvbSB0aGUgY3VycmVudCBsaW5lLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogQWRkZWQgdGhlICI+PiIgbWFya2VyLgoKbGwgfCBsb25nbGlzdAoKICAgTGlzdCBhbGwgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9yIGZyYW1lLgogICBJbnRlcmVzdGluZyBsaW5lcyBhcmUgbWFya2VkIGFzIGZvciAibGlzdCIuCgogICBOZXcgaW4gdmVyc2lvbiAzLjIuCgphKHJncykKCiAgIFByaW50IHRoZSBhcmd1bWVudHMgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gYW5kIHRoZWlyIGN1cnJlbnQKICAgdmFsdWVzLgoKcCBleHByZXNzaW9uCgogICBFdmFsdWF0ZSAqZXhwcmVzc2lvbiogaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHJpbnQgaXRzIHZhbHVlLgoKICAgTm90ZToKCiAgICAgInByaW50KCkiIGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCBpcyBub3QgYSBkZWJ1Z2dlciBjb21tYW5kIOKAlCB0aGlzCiAgICAgZXhlY3V0ZXMgdGhlIFB5dGhvbiAicHJpbnQoKSIgZnVuY3Rpb24uCgpwcCBleHByZXNzaW9uCgogICBMaWtlIHRoZSAicCIgY29tbWFuZCwgZXhjZXB0IHRoZSB2YWx1ZSBvZiAqZXhwcmVzc2lvbiogaXMgcHJldHR5LQogICBwcmludGVkIHVzaW5nIHRoZSAicHByaW50IiBtb2R1bGUuCgp3aGF0aXMgZXhwcmVzc2lvbgoKICAgUHJpbnQgdGhlIHR5cGUgb2YgKmV4cHJlc3Npb24qLgoKc291cmNlIGV4cHJlc3Npb24KCiAgIFRyeSB0byBnZXQgc291cmNlIGNvZGUgb2YgKmV4cHJlc3Npb24qIGFuZCBkaXNwbGF5IGl0LgoKICAgTmV3IGluIHZlcnNpb24gMy4yLgoKZGlzcGxheSBbZXhwcmVzc2lvbl0KCiAgIERpc3BsYXkgdGhlIHZhbHVlIG9mICpleHByZXNzaW9uKiBpZiBpdCBjaGFuZ2VkLCBlYWNoIHRpbWUKICAgZXhlY3V0aW9uIHN0b3BzIGluIHRoZSBjdXJyZW50IGZyYW1lLgoKICAgV2l0aG91dCAqZXhwcmVzc2lvbiosIGxpc3QgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50CiAgIGZyYW1lLgoKICAgTm90ZToKCiAgICAgRGlzcGxheSBldmFsdWF0ZXMgKmV4cHJlc3Npb24qIGFuZCBjb21wYXJlcyB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgIHByZXZpb3VzIGV2YWx1YXRpb24gb2YgKmV4cHJlc3Npb24qLCBzbyB3aGVuIHRoZSByZXN1bHQgaXMKICAgICBtdXRhYmxlLCBkaXNwbGF5IG1heSBub3QgYmUgYWJsZSB0byBwaWNrIHVwIHRoZSBjaGFuZ2VzLgoKICAgRXhhbXBsZToKCiAgICAgIGxzdCA9IFtdCiAgICAgIGJyZWFrcG9pbnQoKQogICAgICBwYXNzCiAgICAgIGxzdC5hcHBlbmQoMSkKICAgICAgcHJpbnQobHN0KQoKICAgRGlzcGxheSB3b27igJl0IHJlYWxpemUgImxzdCIgaGFzIGJlZW4gY2hhbmdlZCBiZWNhdXNlIHRoZSByZXN1bHQgb2YKICAgZXZhbHVhdGlvbiBpcyBtb2RpZmllZCBpbiBwbGFjZSBieSAibHN0LmFwcGVuZCgxKSIgYmVmb3JlIGJlaW5nCiAgIGNvbXBhcmVkOgoKICAgICAgPiBleGFtcGxlLnB5KDMpPG1vZHVsZT4oKQogICAgICAtPiBwYXNzCiAgICAgIChQZGIpIGRpc3BsYXkgbHN0CiAgICAgIGRpc3BsYXkgbHN0OiBbXQogICAgICAoUGRiKSBuCiAgICAgID4gZXhhbXBsZS5weSg0KTxtb2R1bGU+KCkKICAgICAgLT4gbHN0LmFwcGVuZCgxKQogICAgICAoUGRiKSBuCiAgICAgID4gZXhhbXBsZS5weSg1KTxtb2R1bGU+KCkKICAgICAgLT4gcHJpbnQobHN0KQogICAgICAoUGRiKQoKICAgWW91IGNhbiBkbyBzb21lIHRyaWNrcyB3aXRoIGNvcHkgbWVjaGFuaXNtIHRvIG1ha2UgaXQgd29yazoKCiAgICAgID4gZXhhbXBsZS5weSgzKTxtb2R1bGU+KCkKICAgICAgLT4gcGFzcwogICAgICAoUGRiKSBkaXNwbGF5IGxzdFs6XQogICAgICBkaXNwbGF5IGxzdFs6XTogW10KICAgICAgKFBkYikgbgogICAgICA+IGV4YW1wbGUucHkoNCk8bW9kdWxlPigpCiAgICAgIC0+IGxzdC5hcHBlbmQoMSkKICAgICAgKFBkYikgbgogICAgICA+IGV4YW1wbGUucHkoNSk8bW9kdWxlPigpCiAgICAgIC0+IHByaW50KGxzdCkKICAgICAgZGlzcGxheSBsc3RbOl06IFsxXSAgW29sZDogW11dCiAgICAgIChQZGIpCgogICBOZXcgaW4gdmVyc2lvbiAzLjIuCgp1bmRpc3BsYXkgW2V4cHJlc3Npb25dCgogICBEbyBub3QgZGlzcGxheSAqZXhwcmVzc2lvbiogYW55bW9yZSBpbiB0aGUgY3VycmVudCBmcmFtZS4gIFdpdGhvdXQKICAgKmV4cHJlc3Npb24qLCBjbGVhciBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCgogICBOZXcgaW4gdmVyc2lvbiAzLjIuCgppbnRlcmFjdAoKICAgU3RhcnQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgKHVzaW5nIHRoZSAiY29kZSIgbW9kdWxlKSB3aG9zZQogICBnbG9iYWwgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0aGUgKGdsb2JhbCBhbmQgbG9jYWwpIG5hbWVzIGZvdW5kIGluCiAgIHRoZSBjdXJyZW50IHNjb3BlLgoKICAgTmV3IGluIHZlcnNpb24gMy4yLgoKYWxpYXMgW25hbWUgW2NvbW1hbmRdXQoKICAgQ3JlYXRlIGFuIGFsaWFzIGNhbGxlZCAqbmFtZSogdGhhdCBleGVjdXRlcyAqY29tbWFuZCouICBUaGUKICAgKmNvbW1hbmQqIG11c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUgcGFyYW1ldGVycwogICBjYW4gYmUgaW5kaWNhdGVkIGJ5ICIlMSIsICIlMiIsIGFuZCBzbyBvbiwgd2hpbGUgIiUqIiBpcyByZXBsYWNlZAogICBieSBhbGwgdGhlIHBhcmFtZXRlcnMuIElmICpjb21tYW5kKiBpcyBvbWl0dGVkLCB0aGUgY3VycmVudCBhbGlhcwogICBmb3IgKm5hbWUqIGlzIHNob3duLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUKICAgbGlzdGVkLgoKICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZSBsZWdhbGx5CiAgIHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSB0aGF0IGludGVybmFsIHBkYiBjb21tYW5kcyAqY2FuKiBiZQogICBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcyB0aGVuIGhpZGRlbiB1bnRpbCB0aGUKICAgYWxpYXMgaXMgcmVtb3ZlZC4gIEFsaWFzaW5nIGlzIHJlY3Vyc2l2ZWx5IGFwcGxpZWQgdG8gdGhlIGZpcnN0CiAgIHdvcmQgb2YgdGhlIGNvbW1hbmQgbGluZTsgYWxsIG90aGVyIHdvcmRzIGluIHRoZSBsaW5lIGFyZSBsZWZ0CiAgIGFsb25lLgoKICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gcGxhY2VkCiAgIGluIHRoZSAiLnBkYnJjIiBmaWxlKToKCiAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IikKICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiBwcmludChmIiUxLntrfSA9IHslMS5fX2RpY3RfX1trXX0iKQogICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmCiAgICAgIGFsaWFzIHBzIHBpIHNlbGYKCnVuYWxpYXMgbmFtZQoKICAgRGVsZXRlIHRoZSBzcGVjaWZpZWQgYWxpYXMgKm5hbWUqLgoKISBzdGF0ZW1lbnQKCiAgIEV4ZWN1dGUgdGhlIChvbmUtbGluZSkgKnN0YXRlbWVudCogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQKICAgc3RhY2sgZnJhbWUuIFRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlIGZpcnN0CiAgIHdvcmQgb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLiAgVG8gc2V0IGEKICAgZ2xvYmFsIHZhcmlhYmxlLCB5b3UgY2FuIHByZWZpeCB0aGUgYXNzaWdubWVudCBjb21tYW5kIHdpdGggYQogICAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjoKCiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFsnLWwnXQogICAgICAoUGRiKQoKcnVuIFthcmdzIC4uLl0KcmVzdGFydCBbYXJncyAuLi5dCgogICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmICphcmdzKiBpcyBzdXBwbGllZCwgaXQgaXMKICAgc3BsaXQgd2l0aCAic2hsZXgiIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ldyAic3lzLmFyZ3YiLgogICBIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmUgcHJlc2VydmVkLgogICAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLgoKcSh1aXQpCgogICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC4KCmRlYnVnIGNvZGUKCiAgIEVudGVyIGEgcmVjdXJzaXZlIGRlYnVnZ2VyIHRoYXQgc3RlcHMgdGhyb3VnaCAqY29kZSogKHdoaWNoIGlzIGFuCiAgIGFyYml0cmFyeSBleHByZXNzaW9uIG9yIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZCBpbiB0aGUgY3VycmVudAogICBlbnZpcm9ubWVudCkuCgpyZXR2YWwKCiAgIFByaW50IHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBsYXN0IHJldHVybiBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4KCi1bIEZvb3Rub3RlcyBdLQoKWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gbW9kdWxlIGlzCiAgICBkZXRlcm1pbmVkIGJ5IHRoZSAiX19uYW1lX18iIGluIHRoZSBmcmFtZSBnbG9iYWxzLgraA2RlbGGpAwAAVGhlICJkZWwiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqCgogICBkZWxfc3RtdCA6Oj0gImRlbCIgdGFyZ2V0X2xpc3QKCkRlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCBpcwpkZWZpbmVkLiBSYXRoZXIgdGhhbiBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lCmhpbnRzLgoKRGVsZXRpb24gb2YgYSB0YXJnZXQgbGlzdCByZWN1cnNpdmVseSBkZWxldGVzIGVhY2ggdGFyZ2V0LCBmcm9tIGxlZnQKdG8gcmlnaHQuCgpEZWxldGlvbiBvZiBhIG5hbWUgcmVtb3ZlcyB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgZnJvbSB0aGUgbG9jYWwgb3IKZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCIKc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhCiJOYW1lRXJyb3IiIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC4KCkRlbGV0aW9uIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBzdWJzY3JpcHRpb25zIGFuZCBzbGljaW5ncyBpcyBwYXNzZWQKdG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcgaXMgaW4gZ2VuZXJhbAplcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCBldmVuCnRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2xpY2VkIG9iamVjdCkuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBQcmV2aW91c2x5IGl0IHdhcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWUKZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3VycyBhcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWQKYmxvY2suCtoEZGljdHUdCAAARGljdGlvbmFyeSBkaXNwbGF5cwoqKioqKioqKioqKioqKioqKioqCgpBIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBkaWN0IGl0ZW1zCihrZXkvdmFsdWUgcGFpcnMpIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlczoKCiAgIGRpY3RfZGlzcGxheSAgICAgICA6Oj0gInsiIFtkaWN0X2l0ZW1fbGlzdCB8IGRpY3RfY29tcHJlaGVuc2lvbl0gIn0iCiAgIGRpY3RfaXRlbV9saXN0ICAgICA6Oj0gZGljdF9pdGVtICgiLCIgZGljdF9pdGVtKSogWyIsIl0KICAgZGljdF9pdGVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIHwgIioqIiBvcl9leHByCiAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvcgoKQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LgoKSWYgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2YgZGljdCBpdGVtcyBpcyBnaXZlbiwgdGhleSBhcmUKZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlIGRpY3Rpb25hcnk6CmVhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlCmNvcnJlc3BvbmRpbmcgdmFsdWUuICBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRoZSBzYW1lIGtleQptdWx0aXBsZSB0aW1lcyBpbiB0aGUgZGljdCBpdGVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeeKAmXMgdmFsdWUKZm9yIHRoYXQga2V5IHdpbGwgYmUgdGhlIGxhc3Qgb25lIGdpdmVuLgoKQSBkb3VibGUgYXN0ZXJpc2sgIioqIiBkZW5vdGVzICpkaWN0aW9uYXJ5IHVucGFja2luZyouIEl0cyBvcGVyYW5kCm11c3QgYmUgYSAqbWFwcGluZyouICBFYWNoIG1hcHBpbmcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbmV3CmRpY3Rpb25hcnkuICBMYXRlciB2YWx1ZXMgcmVwbGFjZSB2YWx1ZXMgYWxyZWFkeSBzZXQgYnkgZWFybGllciBkaWN0Cml0ZW1zIGFuZCBlYXJsaWVyIGRpY3Rpb25hcnkgdW5wYWNraW5ncy4KCk5ldyBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseQpwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi4KCkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsCm5lZWRzIHR3byBleHByZXNzaW9ucyBzZXBhcmF0ZWQgd2l0aCBhIGNvbG9uIGZvbGxvd2VkIGJ5IHRoZSB1c3VhbArigJxmb3LigJ0gYW5kIOKAnGlm4oCdIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nCmtleSBhbmQgdmFsdWUgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZSBuZXcgZGljdGlvbmFyeSBpbiB0aGUgb3JkZXIKdGhleSBhcmUgcHJvZHVjZWQuCgpSZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpbgpzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeS4gIChUbyBzdW1tYXJpemUsIHRoZSBrZXkgdHlwZQpzaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzCmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgdmFsdWUgKHRleHR1YWxseQpyaWdodG1vc3QgaW4gdGhlIGRpc3BsYXkpIHN0b3JlZCBmb3IgYSBnaXZlbiBrZXkgdmFsdWUgcHJldmFpbHMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy44OiBQcmlvciB0byBQeXRob24gMy44LCBpbiBkaWN0IGNvbXByZWhlbnNpb25zLAp0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBrZXkgYW5kIHZhbHVlIHdhcyBub3Qgd2VsbC1kZWZpbmVkLiAgSW4KQ1B5dGhvbiwgdGhlIHZhbHVlIHdhcyBldmFsdWF0ZWQgYmVmb3JlIHRoZSBrZXkuICBTdGFydGluZyB3aXRoIDMuOCwKdGhlIGtleSBpcyBldmFsdWF0ZWQgYmVmb3JlIHRoZSB2YWx1ZSwgYXMgcHJvcG9zZWQgYnkgKipQRVAgNTcyKiouCnoQZHluYW1pYy1mZWF0dXJlc2GwAgAASW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgY29tcGlsZQp0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6CgogICBpID0gMTAKICAgZGVmIGYoKToKICAgICAgIHByaW50KGkpCiAgIGkgPSA0MgogICBmKCkKClRoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbAplbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbAphbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQKaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgWzFdClRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvCm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpcwpzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguCtoEZWxzZWFYAgAAVGhlICJpZiIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKgoKVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjoKCiAgIGlmX3N0bXQgOjo9ICJpZiIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAoImVsaWYiIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAiOiIgc3VpdGUpKgogICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KCkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmUKYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuIG9wZXJhdGlvbnMKZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkCihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS4KSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZgpwcmVzZW50LCBpcyBleGVjdXRlZC4K2gpleGNlcHRpb25zdZoIAABFeGNlcHRpb25zCioqKioqKioqKioKCkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sCm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsCmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpcwpkZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnkKY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZQp0aGUgZXJyb3Igb2NjdXJyZWQuCgpUaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWUKZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvCmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb24KaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiDigKYgImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlCiJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXAKY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW4KZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuCgpQeXRob24gdXNlcyB0aGUg4oCcdGVybWluYXRpb27igJ0gbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvbgpoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXIKbGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZQpmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZQpmcm9tIHRoZSB0b3ApLgoKV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlcwpleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluCmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayB0cmFjZWJhY2ssIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXMKIlN5c3RlbUV4aXQiLgoKRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzCnNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZSB0aGUKY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgKm5vbi12aXJ0dWFsIGJhc2UgY2xhc3MqIHRoZXJlb2YuIFRoZQppbnN0YW5jZSBjYW4gYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsCmluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uCgpOb3RlOgoKICBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXIgY29udGVudHMKICBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXQgd2FybmluZwogIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyIG11bHRpcGxlCiAgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLgoKU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgdHJ5CnN0YXRlbWVudCBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LgoKLVsgRm9vdG5vdGVzIF0tCgpbMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2UKICAgIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkLgraCWV4ZWNtb2RlbHVFJQAARXhlY3V0aW9uIG1vZGVsCioqKioqKioqKioqKioqKgoKClN0cnVjdHVyZSBvZiBhIHByb2dyYW0KPT09PT09PT09PT09PT09PT09PT09PQoKQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgYSBwaWVjZQpvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYSB1bml0LiBUaGUgZm9sbG93aW5nIGFyZQpibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uIEVhY2gKY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgZ2l2ZW4KYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZCBhcyBhIGNvbW1hbmQgbGluZQphcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgKGEKY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAiLWMiCm9wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiBBIG1vZHVsZSBydW4gYXMgYSB0b3AgbGV2ZWwgc2NyaXB0IChhcyBtb2R1bGUKIl9fbWFpbl9fIikgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHVzaW5nIGEgIi1tIiBhcmd1bWVudCBpcyBhbHNvIGEgY29kZQpibG9jay4gVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXZhbCgpIgphbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLgoKQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWlucwpzb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzCndoZXJlIGFuZCBob3cgZXhlY3V0aW9uIGNvbnRpbnVlcyBhZnRlciB0aGUgY29kZSBibG9ja+KAmXMgZXhlY3V0aW9uIGhhcwpjb21wbGV0ZWQuCgoKTmFtaW5nIGFuZCBiaW5kaW5nCj09PT09PT09PT09PT09PT09PQoKCkJpbmRpbmcgb2YgbmFtZXMKLS0tLS0tLS0tLS0tLS0tLQoKKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuCgpUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczoKCiogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLAoKKiBjbGFzcyBkZWZpbml0aW9ucywKCiogZnVuY3Rpb24gZGVmaW5pdGlvbnMsCgoqIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsCgoqIHRhcmdldHMgdGhhdCBhcmUgaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQ6CgogICogImZvciIgbG9vcCBoZWFkZXIsCgogICogYWZ0ZXIgImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQsICJleGNlcHQiIGNsYXVzZSwgImV4Y2VwdCoiCiAgICBjbGF1c2UsIG9yIGluIHRoZSBhcy1wYXR0ZXJuIGluIHN0cnVjdHVyYWwgcGF0dGVybiBtYXRjaGluZywKCiAgKiBpbiBhIGNhcHR1cmUgcGF0dGVybiBpbiBzdHJ1Y3R1cmFsIHBhdHRlcm4gbWF0Y2hpbmcKCiogImltcG9ydCIgc3RhdGVtZW50cy4KClRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMKZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4KdW5kZXJzY29yZS4gVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4KCkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yCnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLgoKRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYQpjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWwKY29kZSBibG9jaykuCgpJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLAp1bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGUKbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGUKY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlCmJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouCgpFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAqYmluZGluZyoKb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLgoKClJlc29sdXRpb24gb2YgbmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbAp2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlCmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3MKY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlcwphIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4KCldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdAplbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9jawppcyBjYWxsZWQgdGhlIGJsb2Nr4oCZcyAqZW52aXJvbm1lbnQqLgoKV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBJZgp0aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwKdmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlIHRoZQpuYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4KIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLgoKSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGwKdXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlCmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhCmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3MKZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmUKd2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZQpkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZwpvcGVyYXRpb25zLiBTZWUgdGhlIEZBUSBlbnRyeSBvbiBVbmJvdW5kTG9jYWxFcnJvciBmb3IgZXhhbXBsZXMuCgpJZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVzCnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5ncyBvZiB0aG9zZSBuYW1lcyBpbiB0aGUKdG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieQpzZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlCmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlCm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWYKdGhlIG5hbWVzIGFyZSBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuClRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBsaXN0ZWQgbmFtZXMuCgpUaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24KaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZQpjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuCgpUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG8KcHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLgoiU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QKZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4KClRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhCm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZAoiX19tYWluX18iLgoKQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlCnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4KZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMKZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0CnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZQpuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2YKdGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8KdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMg4oCTCnRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZQppbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcKd2lsbCBmYWlsOgoKICAgY2xhc3MgQToKICAgICAgIGEgPSA0MgogICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKQoKCkJ1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaAoiX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnMKd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgImltcG9ydCIKdGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS4KClRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrCmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzIGdsb2JhbApuYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlCnRoZSBtb2R1bGXigJlzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iCm1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluIGFueQpvdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUKImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLgoKCkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGUKdGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOgoKICAgaSA9IDEwCiAgIGRlZiBmKCk6CiAgICAgICBwcmludChpKQogICBpID0gNDIKICAgZigpCgpUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwKZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwKYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkCmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXQpUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0bwpvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMKc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLgoKCkV4Y2VwdGlvbnMKPT09PT09PT09PQoKRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2wKb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWwKY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzCmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueQpjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlCnRoZSBlcnJvciBvY2N1cnJlZC4KClRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZQplcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc28KZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvbgpoYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIOKApiAiZXhjZXB0IiBzdGF0ZW1lbnQuICBUaGUKImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cApjb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhbgpleGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS4KClB5dGhvbiB1c2VzIHRoZSDigJx0ZXJtaW5hdGlvbuKAnSBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uCmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlcgpsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgdGhlCmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlCmZyb20gdGhlIHRvcCkuCgpXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzCmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW4KZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIHRyYWNlYmFjaywgZXhjZXB0IHdoZW4gdGhlIGV4Y2VwdGlvbiBpcwoiU3lzdGVtRXhpdCIuCgpFeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSAiZXhjZXB0IiBjbGF1c2UgaXMKc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlIHRoZQpjbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSAqbm9uLXZpcnR1YWwgYmFzZSBjbGFzcyogdGhlcmVvZi4gVGhlCmluc3RhbmNlIGNhbiBiZSByZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwKaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi4KCk5vdGU6CgogIEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpciBjb250ZW50cwogIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dCB3YXJuaW5nCiAgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXIgbXVsdGlwbGUKICB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuCgpTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSB0cnkKc3RhdGVtZW50IGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSByYWlzZSBzdGF0ZW1lbnQuCgotWyBGb290bm90ZXMgXS0KClsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieSB0aGVzZQogICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuCtoJZXhwcmxpc3RzdXAEAABFeHByZXNzaW9uIGxpc3RzCioqKioqKioqKioqKioqKioKCiAgIGV4cHJlc3Npb25fbGlzdCAgICA6Oj0gZXhwcmVzc2lvbiAoIiwiIGV4cHJlc3Npb24pKiBbIiwiXQogICBzdGFycmVkX2xpc3QgICAgICAgOjo9IHN0YXJyZWRfaXRlbSAoIiwiIHN0YXJyZWRfaXRlbSkqIFsiLCJdCiAgIHN0YXJyZWRfZXhwcmVzc2lvbiA6Oj0gZXhwcmVzc2lvbiB8IChzdGFycmVkX2l0ZW0gIiwiKSogW3N0YXJyZWRfaXRlbV0KICAgc3RhcnJlZF9pdGVtICAgICAgIDo6PSBhc3NpZ25tZW50X2V4cHJlc3Npb24gfCAiKiIgb3JfZXhwcgoKRXhjZXB0IHdoZW4gcGFydCBvZiBhIGxpc3Qgb3Igc2V0IGRpc3BsYXksIGFuIGV4cHJlc3Npb24gbGlzdApjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZSBsZW5ndGggb2YgdGhlIHR1cGxlCmlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGUgZXhwcmVzc2lvbnMgYXJlCmV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuCgpBbiBhc3RlcmlzayAiKiIgZGVub3RlcyAqaXRlcmFibGUgdW5wYWNraW5nKi4gIEl0cyBvcGVyYW5kIG11c3QgYmUgYW4KKml0ZXJhYmxlKi4gIFRoZSBpdGVyYWJsZSBpcyBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgaXRlbXMsIHdoaWNoCmFyZSBpbmNsdWRlZCBpbiB0aGUgbmV3IHR1cGxlLCBsaXN0LCBvciBzZXQsIGF0IHRoZSBzaXRlIG9mIHRoZQp1bnBhY2tpbmcuCgpOZXcgaW4gdmVyc2lvbiAzLjU6IEl0ZXJhYmxlIHVucGFja2luZyBpbiBleHByZXNzaW9uIGxpc3RzLCBvcmlnaW5hbGx5CnByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLgoKQSB0cmFpbGluZyBjb21tYSBpcyByZXF1aXJlZCBvbmx5IHRvIGNyZWF0ZSBhIG9uZS1pdGVtIHR1cGxlLCBzdWNoIGFzCiIxLCI7IGl0IGlzIG9wdGlvbmFsIGluIGFsbCBvdGhlciBjYXNlcy4gQSBzaW5nbGUgZXhwcmVzc2lvbiB3aXRob3V0IGEKdHJhaWxpbmcgY29tbWEgZG9lc27igJl0IGNyZWF0ZSBhIHR1cGxlLCBidXQgcmF0aGVyIHlpZWxkcyB0aGUgdmFsdWUgb2YKdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gZW1wdHkgcGFpciBvZgpwYXJlbnRoZXNlczogIigpIi4pCtoIZmxvYXRpbmdhkwMAAEZsb2F0aW5nIHBvaW50IGxpdGVyYWxzCioqKioqKioqKioqKioqKioqKioqKioqCgpGbG9hdGluZyBwb2ludCBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbApkZWZpbml0aW9uczoKCiAgIGZsb2F0bnVtYmVyICAgOjo9IHBvaW50ZmxvYXQgfCBleHBvbmVudGZsb2F0CiAgIHBvaW50ZmxvYXQgICAgOjo9IFtkaWdpdHBhcnRdIGZyYWN0aW9uIHwgZGlnaXRwYXJ0ICIuIgogICBleHBvbmVudGZsb2F0IDo6PSAoZGlnaXRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnQKICAgZGlnaXRwYXJ0ICAgICA6Oj0gZGlnaXQgKFsiXyJdIGRpZ2l0KSoKICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0cGFydAogICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdHBhcnQKCk5vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgYXJlIGFsd2F5cyBpbnRlcnByZXRlZCB1c2luZwpyYWRpeCAxMC4gRm9yIGV4YW1wbGUsICIwNzdlMDEwIiBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUgbnVtYmVyCmFzICI3N2UxMCIuIFRoZSBhbGxvd2VkIHJhbmdlIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGlzCmltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gIEFzIGluIGludGVnZXIgbGl0ZXJhbHMsIHVuZGVyc2NvcmVzIGFyZQpzdXBwb3J0ZWQgZm9yIGRpZ2l0IGdyb3VwaW5nLgoKU29tZSBleGFtcGxlcyBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFsczoKCiAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwICAgIDMuMTRfMTVfOTMKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjY6IFVuZGVyc2NvcmVzIGFyZSBub3cgYWxsb3dlZCBmb3IgZ3JvdXBpbmcKcHVycG9zZXMgaW4gbGl0ZXJhbHMuCtoDZm9ydSIHAABUaGUgImZvciIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioKClRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2UKKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDoKCiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIHN0YXJyZWRfbGlzdCAiOiIgc3VpdGUKICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXQoKVGhlICJzdGFycmVkX2xpc3QiIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbgoqaXRlcmFibGUqIG9iamVjdC4gIEFuICppdGVyYXRvciogaXMgY3JlYXRlZCBmb3IgdGhhdCBpdGVyYWJsZS4gVGhlCmZpcnN0IGl0ZW0gcHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yIGlzIHRoZW4gYXNzaWduZWQgdG8gdGhlIHRhcmdldApsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYXNzaWdubWVudHMgKHNlZSBBc3NpZ25tZW50CnN0YXRlbWVudHMpLCBhbmQgdGhlIHN1aXRlIGlzIGV4ZWN1dGVkLiAgVGhpcyByZXBlYXRzIGZvciBlYWNoIGl0ZW0KcHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLiAgV2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLCB0aGUgc3VpdGUKaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3AKdGVybWluYXRlcy4KCkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3AKd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2XigJlzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudApleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXMKd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHQKaXRlbS4KClRoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzIGluIHRoZSB0YXJnZXQgbGlzdC4KVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nCnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDoKCiAgIGZvciBpIGluIHJhbmdlKDEwKToKICAgICAgIHByaW50KGkpCiAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcAogICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZQoKTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLApidXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdAphbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gdHlwZSAicmFuZ2UoKSIgcmVwcmVzZW50cwppbW11dGFibGUgYXJpdGhtZXRpYyBzZXF1ZW5jZXMgb2YgaW50ZWdlcnMuIEZvciBpbnN0YW5jZSwgaXRlcmF0aW5nCiJyYW5nZSgzKSIgc3VjY2Vzc2l2ZWx5IHlpZWxkcyAwLCAxLCBhbmQgdGhlbiAyLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IFN0YXJyZWQgZWxlbWVudHMgYXJlIG5vdyBhbGxvd2VkIGluIHRoZQpleHByZXNzaW9uIGxpc3QuCtoNZm9ybWF0c3RyaW5nc3XGYgAARm9ybWF0IFN0cmluZyBTeW50YXgKKioqKioqKioqKioqKioqKioqKioKClRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QgYW5kIHRoZSAiRm9ybWF0dGVyIiBjbGFzcyBzaGFyZSB0aGUgc2FtZQpzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiAiRm9ybWF0dGVyIiwKc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuICBUaGUgc3ludGF4IGlzCnJlbGF0ZWQgdG8gdGhhdCBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzLCBidXQgaXQgaXMgbGVzcwpzb3BoaXN0aWNhdGVkIGFuZCwgaW4gcGFydGljdWxhciwgZG9lcyBub3Qgc3VwcG9ydCBhcmJpdHJhcnkKZXhwcmVzc2lvbnMuCgpGb3JtYXQgc3RyaW5ncyBjb250YWluIOKAnHJlcGxhY2VtZW50IGZpZWxkc+KAnSBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcwoie30iLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbAp0ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCB0byBpbmNsdWRlCmEgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5IGRvdWJsaW5nOgoie3siIGFuZCAifX0iLgoKVGhlIGdyYW1tYXIgZm9yIGEgcmVwbGFjZW1lbnQgZmllbGQgaXMgYXMgZm9sbG93czoKCiAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iCiAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgIlsiIGVsZW1lbnRfaW5kZXggIl0iKSoKICAgYXJnX25hbWUgICAgICAgICAgOjo9IFtpZGVudGlmaWVyIHwgZGlnaXQrXQogICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllcgogICBlbGVtZW50X2luZGV4ICAgICA6Oj0gZGlnaXQrIHwgaW5kZXhfc3RyaW5nCiAgIGluZGV4X3N0cmluZyAgICAgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJdIj4gKwogICBjb252ZXJzaW9uICAgICAgICA6Oj0gInIiIHwgInMiIHwgImEiCiAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSBmb3JtYXQtc3BlYzpmb3JtYXRfc3BlYwoKSW4gbGVzcyBmb3JtYWwgdGVybXMsIHRoZSByZXBsYWNlbWVudCBmaWVsZCBjYW4gc3RhcnQgd2l0aCBhCipmaWVsZF9uYW1lKiB0aGF0IHNwZWNpZmllcyB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHRvIGJlIGZvcm1hdHRlZAphbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgdGhlIHJlcGxhY2VtZW50IGZpZWxkLiBUaGUKKmZpZWxkX25hbWUqIGlzIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAgKmNvbnZlcnNpb24qIGZpZWxkLCB3aGljaCBpcwpwcmVjZWRlZCBieSBhbiBleGNsYW1hdGlvbiBwb2ludCAiJyEnIiwgYW5kIGEgKmZvcm1hdF9zcGVjKiwgd2hpY2ggaXMKcHJlY2VkZWQgYnkgYSBjb2xvbiAiJzonIi4gIFRoZXNlIHNwZWNpZnkgYSBub24tZGVmYXVsdCBmb3JtYXQgZm9yIHRoZQpyZXBsYWNlbWVudCB2YWx1ZS4KClNlZSBhbHNvIHRoZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIHNlY3Rpb24uCgpUaGUgKmZpZWxkX25hbWUqIGl0c2VsZiBiZWdpbnMgd2l0aCBhbiAqYXJnX25hbWUqIHRoYXQgaXMgZWl0aGVyIGEKbnVtYmVyIG9yIGEga2V5d29yZC4gIElmIGl04oCZcyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgcG9zaXRpb25hbAphcmd1bWVudCwgYW5kIGlmIGl04oCZcyBhIGtleXdvcmQsIGl0IHJlZmVycyB0byBhIG5hbWVkIGtleXdvcmQKYXJndW1lbnQuIEFuICphcmdfbmFtZSogaXMgdHJlYXRlZCBhcyBhIG51bWJlciBpZiBhIGNhbGwgdG8KInN0ci5pc2RlY2ltYWwoKSIgb24gdGhlIHN0cmluZyB3b3VsZCByZXR1cm4gdHJ1ZS4gSWYgdGhlIG51bWVyaWNhbAphcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nIGFyZSAwLCAxLCAyLCDigKYgaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbApiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlIG51bWJlcnMgMCwgMSwgMiwg4oCmIHdpbGwgYmUKYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0IG9yZGVyLiBCZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLQpkZWxpbWl0ZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGFyYml0cmFyeSBkaWN0aW9uYXJ5IGtleXMKKGUuZy4sIHRoZSBzdHJpbmdzICInMTAnIiBvciAiJzotXSciKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUKKmFyZ19uYW1lKiBjYW4gYmUgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUKZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gIicubmFtZSciIHNlbGVjdHMgdGhlIG5hbWVkCmF0dHJpYnV0ZSB1c2luZyAiZ2V0YXR0cigpIiwgd2hpbGUgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybQoiJ1tpbmRleF0nIiBkb2VzIGFuIGluZGV4IGxvb2t1cCB1c2luZyAiX19nZXRpdGVtX18oKSIuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXJzIGNhbiBiZQpvbWl0dGVkIGZvciAic3RyLmZvcm1hdCgpIiwgc28gIid7fSB7fScuZm9ybWF0KGEsIGIpIiBpcyBlcXVpdmFsZW50IHRvCiInezB9IHsxfScuZm9ybWF0KGEsIGIpIi4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlCm9taXR0ZWQgZm9yICJGb3JtYXR0ZXIiLgoKU29tZSBzaW1wbGUgZm9ybWF0IHN0cmluZyBleGFtcGxlczoKCiAgICJGaXJzdCwgdGhvdSBzaGFsdCBjb3VudCB0byB7MH0iICAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudAogICAiQnJpbmcgbWUgYSB7fSIgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5IHJlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnQKICAgIkZyb20ge30gdG8ge30iICAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gezF9IgogICAiTXkgcXVlc3QgaXMge25hbWV9IiAgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgJ25hbWUnCiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICAjICd3ZWlnaHQnIGF0dHJpYnV0ZSBvZiBmaXJzdCBwb3NpdGlvbmFsIGFyZwogICAiVW5pdHMgZGVzdHJveWVkOiB7cGxheWVyc1swXX0iICAgIyBGaXJzdCBlbGVtZW50IG9mIGtleXdvcmQgYXJndW1lbnQgJ3BsYXllcnMnLgoKVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSBmb3JtYXR0aW5nLgpOb3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGUgIl9fZm9ybWF0X18oKSIKbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzIGl0IGlzIGRlc2lyYWJsZSB0bwpmb3JjZSBhIHR5cGUgdG8gYmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLCBvdmVycmlkaW5nIGl0cyBvd24KZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlCmNhbGxpbmcgIl9fZm9ybWF0X18oKSIsIHRoZSBub3JtYWwgZm9ybWF0dGluZyBsb2dpYyBpcyBieXBhc3NlZC4KClRocmVlIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6ICInIXMnIiB3aGljaCBjYWxscwoic3RyKCkiIG9uIHRoZSB2YWx1ZSwgIichciciIHdoaWNoIGNhbGxzICJyZXByKCkiIGFuZCAiJyFhJyIgd2hpY2gKY2FsbHMgImFzY2lpKCkiLgoKU29tZSBleGFtcGxlczoKCiAgICJIYXJvbGQncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0CiAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdAogICAiTW9yZSB7IWF9IiAgICAgICAgICAgICAgICAgICAgICAjIENhbGxzIGFzY2lpKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0CgpUaGUgKmZvcm1hdF9zcGVjKiBmaWVsZCBjb250YWlucyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZSB2YWx1ZQpzaG91bGQgYmUgcHJlc2VudGVkLCBpbmNsdWRpbmcgc3VjaCBkZXRhaWxzIGFzIGZpZWxkIHdpZHRoLCBhbGlnbm1lbnQsCnBhZGRpbmcsIGRlY2ltYWwgcHJlY2lzaW9uIGFuZCBzbyBvbi4gIEVhY2ggdmFsdWUgdHlwZSBjYW4gZGVmaW5lIGl0cwpvd24g4oCcZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdl4oCdIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAqZm9ybWF0X3NwZWMqLgoKTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSwgd2hpY2gKaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uCgpBICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzCndpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgY29udGFpbiBhIGZpZWxkIG5hbWUsCmNvbnZlcnNpb24gZmxhZyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGJ1dCBkZWVwZXIgbmVzdGluZyBpcyBub3QKYWxsb3dlZC4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyBhcmUKc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZSAqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gVGhpcwphbGxvd3MgdGhlIGZvcm1hdHRpbmcgb2YgYSB2YWx1ZSB0byBiZSBkeW5hbWljYWxseSBzcGVjaWZpZWQuCgpTZWUgdGhlIEZvcm1hdCBleGFtcGxlcyBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLgoKCkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoK4oCcRm9ybWF0IHNwZWNpZmljYXRpb25z4oCdIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkCndpdGhpbiBhIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkCihzZWUgRm9ybWF0IFN0cmluZyBTeW50YXggYW5kIGYtc3RyaW5ncykuIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkCmRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbiAiZm9ybWF0KCkiIGZ1bmN0aW9uLiAgRWFjaCBmb3JtYXR0YWJsZSB0eXBlCm1heSBkZWZpbmUgaG93IHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC4KCk1vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgZm9ybWF0CnNwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIG9ubHkKc3VwcG9ydGVkIGJ5IHRoZSBudW1lcmljIHR5cGVzLgoKQSBnZW5lcmFsIGNvbnZlbnRpb24gaXMgdGhhdCBhbiBlbXB0eSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBwcm9kdWNlcwp0aGUgc2FtZSByZXN1bHQgYXMgaWYgeW91IGhhZCBjYWxsZWQgInN0cigpIiBvbiB0aGUgdmFsdWUuIEEgbm9uLWVtcHR5CmZvcm1hdCBzcGVjaWZpY2F0aW9uIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LgoKVGhlIGdlbmVyYWwgZm9ybSBvZiBhICpzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyKiBpczoKCiAgIGZvcm1hdF9zcGVjICAgICA6Oj0gW1tmaWxsXWFsaWduXVtzaWduXVsieiJdWyIjIl1bIjAiXVt3aWR0aF1bZ3JvdXBpbmdfb3B0aW9uXVsiLiIgcHJlY2lzaW9uXVt0eXBlXQogICBmaWxsICAgICAgICAgICAgOjo9IDxhbnkgY2hhcmFjdGVyPgogICBhbGlnbiAgICAgICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIgogICBzaWduICAgICAgICAgICAgOjo9ICIrIiB8ICItIiB8ICIgIgogICB3aWR0aCAgICAgICAgICAgOjo9IGRpZ2l0KwogICBncm91cGluZ19vcHRpb24gOjo9ICJfIiB8ICIsIgogICBwcmVjaXNpb24gICAgICAgOjo9IGRpZ2l0KwogICB0eXBlICAgICAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiB8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIgoKSWYgYSB2YWxpZCAqYWxpZ24qIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEgKmZpbGwqCmNoYXJhY3RlciB0aGF0IGNhbiBiZSBhbnkgY2hhcmFjdGVyIGFuZCBkZWZhdWx0cyB0byBhIHNwYWNlIGlmCm9taXR0ZWQuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYSBsaXRlcmFsIGN1cmx5IGJyYWNlICjigJ0ieyLigJ0gb3IK4oCcIn0i4oCdKSBhcyB0aGUgKmZpbGwqIGNoYXJhY3RlciBpbiBhIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbCBvciB3aGVuCnVzaW5nIHRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgYQpjdXJseSBicmFjZSB3aXRoIGEgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkLiAgVGhpcyBsaW1pdGF0aW9uIGRvZXNu4oCZdAphZmZlY3QgdGhlICJmb3JtYXQoKSIgZnVuY3Rpb24uCgpUaGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBhbGlnbm1lbnQgb3B0aW9ucyBpcyBhcyBmb2xsb3dzOgoKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfD09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXwKfCAiJzwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgIHwKfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCBvYmplY3RzKS4gICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiJz4nIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIHJpZ2h0LWFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgIHwKfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiJz0nIiAgICAgfCBGb3JjZXMgdGhlIHBhZGRpbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBzaWduIChpZiBhbnkpICAgIHwKfCAgICAgICAgICAgfCBidXQgYmVmb3JlIHRoZSBkaWdpdHMuICBUaGlzIGlzIHVzZWQgZm9yIHByaW50aW5nIGZpZWxkcyAgIHwKfCAgICAgICAgICAgfCBpbiB0aGUgZm9ybSDigJgrMDAwMDAwMTIw4oCZLiBUaGlzIGFsaWdubWVudCBvcHRpb24gaXMgb25seSAgICB8CnwgICAgICAgICAgIHwgdmFsaWQgZm9yIG51bWVyaWMgdHlwZXMuICBJdCBiZWNvbWVzIHRoZSBkZWZhdWx0IGZvciAgICAgICB8CnwgICAgICAgICAgIHwgbnVtYmVycyB3aGVuIOKAmDDigJkgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGZpZWxkIHdpZHRoLiAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICInXiciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICAgICAgfAp8ICAgICAgICAgICB8IHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZSB0aGF0IHVubGVzcyBhIG1pbmltdW0gZmllbGQgd2lkdGggaXMgZGVmaW5lZCwgdGhlIGZpZWxkIHdpZHRoCndpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGRhdGEgdG8gZmlsbCBpdCwgc28gdGhhdCB0aGUKYWxpZ25tZW50IG9wdGlvbiBoYXMgbm8gbWVhbmluZyBpbiB0aGlzIGNhc2UuCgpUaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gYmUgb25lIG9mCnRoZSBmb2xsb3dpbmc6CgorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8ICInKyciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgYm90aCBwb3NpdGl2ZSBhcyAgfAp8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICInLSciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBuZWdhdGl2ZSAgICAgfAp8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgdXNlZCBvbiBwb3NpdGl2ZSAgfAp8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKVGhlICIneiciIG9wdGlvbiBjb2VyY2VzIG5lZ2F0aXZlIHplcm8gZmxvYXRpbmctcG9pbnQgdmFsdWVzIHRvCnBvc2l0aXZlIHplcm8gYWZ0ZXIgcm91bmRpbmcgdG8gdGhlIGZvcm1hdCBwcmVjaXNpb24uICBUaGlzIG9wdGlvbiBpcwpvbmx5IHZhbGlkIGZvciBmbG9hdGluZy1wb2ludCBwcmVzZW50YXRpb24gdHlwZXMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogQWRkZWQgdGhlICIneiciIG9wdGlvbiAoc2VlIGFsc28gKipQRVAKNjgyKiopLgoKVGhlICInIyciIG9wdGlvbiBjYXVzZXMgdGhlIOKAnGFsdGVybmF0ZSBmb3Jt4oCdIHRvIGJlIHVzZWQgZm9yIHRoZQpjb252ZXJzaW9uLiAgVGhlIGFsdGVybmF0ZSBmb3JtIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudAp0eXBlcy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXIsIGZsb2F0IGFuZCBjb21wbGV4CnR5cGVzLiBGb3IgaW50ZWdlcnMsIHdoZW4gYmluYXJ5LCBvY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0IGlzCnVzZWQsIHRoaXMgb3B0aW9uIGFkZHMgdGhlIHJlc3BlY3RpdmUgcHJlZml4ICInMGInIiwgIicwbyciLCAiJzB4JyIsCm9yICInMFgnIiB0byB0aGUgb3V0cHV0IHZhbHVlLiBGb3IgZmxvYXQgYW5kIGNvbXBsZXggdGhlIGFsdGVybmF0ZQpmb3JtIGNhdXNlcyB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIHRvIGFsd2F5cyBjb250YWluIGEgZGVjaW1hbC0KcG9pbnQgY2hhcmFjdGVyLCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuIE5vcm1hbGx5LCBhIGRlY2ltYWwtCnBvaW50IGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSByZXN1bHQgb2YgdGhlc2UgY29udmVyc2lvbnMgb25seSBpZiBhCmRpZ2l0IGZvbGxvd3MgaXQuIEluIGFkZGl0aW9uLCBmb3IgIidnJyIgYW5kICInRyciIGNvbnZlcnNpb25zLAp0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgcmVzdWx0LgoKVGhlICInLCciIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHMgc2VwYXJhdG9yLgpGb3IgYSBsb2NhbGUgYXdhcmUgc2VwYXJhdG9yLCB1c2UgdGhlICInbiciIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGUKaW5zdGVhZC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IEFkZGVkIHRoZSAiJywnIiBvcHRpb24gKHNlZSBhbHNvICoqUEVQIDM3OCoqKS4KClRoZSAiJ18nIiBvcHRpb24gc2lnbmFscyB0aGUgdXNlIG9mIGFuIHVuZGVyc2NvcmUgZm9yIGEgdGhvdXNhbmRzCnNlcGFyYXRvciBmb3IgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGFuZCBmb3IgaW50ZWdlcgpwcmVzZW50YXRpb24gdHlwZSAiJ2QnIi4gIEZvciBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyAiJ2InIiwgIidvJyIsCiIneCciLCBhbmQgIidYJyIsIHVuZGVyc2NvcmVzIHdpbGwgYmUgaW5zZXJ0ZWQgZXZlcnkgNCBkaWdpdHMuICBGb3IKb3RoZXIgcHJlc2VudGF0aW9uIHR5cGVzLCBzcGVjaWZ5aW5nIHRoaXMgb3B0aW9uIGlzIGFuIGVycm9yLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogQWRkZWQgdGhlICInXyciIG9wdGlvbiAoc2VlIGFsc28gKipQRVAgNTE1KiopLgoKKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSB0b3RhbCBmaWVsZCB3aWR0aCwKaW5jbHVkaW5nIGFueSBwcmVmaXhlcywgc2VwYXJhdG9ycywgYW5kIG90aGVyIGZvcm1hdHRpbmcgY2hhcmFjdGVycy4KSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQpjb250ZW50LgoKV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSBhCnplcm8gKCInMCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyBmb3IgbnVtZXJpYwp0eXBlcy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhICpmaWxsKiBjaGFyYWN0ZXIgb2YgIicwJyIgd2l0aCBhbgoqYWxpZ25tZW50KiB0eXBlIG9mICInPSciLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTA6IFByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSAiJzAnIiBubwpsb25nZXIgYWZmZWN0cyB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHN0cmluZ3MuCgpUaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIGludGVnZXIgaW5kaWNhdGluZyBob3cgbWFueSBkaWdpdHMgc2hvdWxkCmJlIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgcHJlc2VudGF0aW9uIHR5cGVzICInZiciIGFuZAoiJ0YnIiwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgcHJlc2VudGF0aW9uIHR5cGVzCiInZyciIG9yICInRyciLiAgRm9yIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgdGhlIGZpZWxkIGluZGljYXRlcyB0aGUKbWF4aW11bSBmaWVsZCBzaXplIC0gaW4gb3RoZXIgd29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkCmZyb20gdGhlIGZpZWxkIGNvbnRlbnQuICBUaGUgKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIKcHJlc2VudGF0aW9uIHR5cGVzLgoKRmluYWxseSwgdGhlICp0eXBlKiBkZXRlcm1pbmVzIGhvdyB0aGUgZGF0YSBzaG91bGQgYmUgcHJlc2VudGVkLgoKVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZToKCiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgIHw9PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CiAgIHwgIidzJyIgICAgIHwgU3RyaW5nIGZvcm1hdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0eXBlIGZvciBzdHJpbmdzIGFuZCAgICB8CiAgIHwgICAgICAgICAgIHwgbWF5IGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgIidzJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpUaGUgYXZhaWxhYmxlIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVzIGFyZToKCiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgIHw9PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CiAgIHwgIidiJyIgICAgIHwgQmluYXJ5IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMi4gICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIidjJyIgICAgIHwgQ2hhcmFjdGVyLiBDb252ZXJ0cyB0aGUgaW50ZWdlciB0byB0aGUgY29ycmVzcG9uZGluZyAgICAgICB8CiAgIHwgICAgICAgICAgIHwgdW5pY29kZSBjaGFyYWN0ZXIgYmVmb3JlIHByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIidkJyIgICAgIHwgRGVjaW1hbCBJbnRlZ2VyLiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxMC4gICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIidvJyIgICAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSA4LiAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIid4JyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIGxvd2VyLSAgICB8CiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIidYJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIHVwcGVyLSAgICB8CiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuIEluIGNhc2UgIicjJyIgaXMgICAgICB8CiAgIHwgICAgICAgICAgIHwgc3BlY2lmaWVkLCB0aGUgcHJlZml4ICInMHgnIiB3aWxsIGJlIHVwcGVyLWNhc2VkIHRvICInMFgnIiB8CiAgIHwgICAgICAgICAgIHwgYXMgd2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIiduJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICInZCciLCBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8CiAgIHwgICAgICAgICAgIHwgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciAgICB8CiAgIHwgICAgICAgICAgIHwgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgIidkJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gYmUgZm9ybWF0dGVkCndpdGggdGhlIGZsb2F0aW5nIHBvaW50IHByZXNlbnRhdGlvbiB0eXBlcyBsaXN0ZWQgYmVsb3cgKGV4Y2VwdCAiJ24nIgphbmQgIk5vbmUiKS4gV2hlbiBkb2luZyBzbywgImZsb2F0KCkiIGlzIHVzZWQgdG8gY29udmVydCB0aGUgaW50ZWdlcgp0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy4KClRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciAiZmxvYXQiIGFuZCAiRGVjaW1hbCIgdmFsdWVzIGFyZToKCiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgIHw9PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CiAgIHwgIidlJyIgICAgIHwgU2NpZW50aWZpYyBub3RhdGlvbi4gRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICJwIiwgZm9ybWF0cyAgICB8CiAgIHwgICAgICAgICAgIHwgdGhlIG51bWJlciBpbiBzY2llbnRpZmljIG5vdGF0aW9uIHdpdGggdGhlIGxldHRlciDigJhl4oCZICAgICAgfAogICB8ICAgICAgICAgICB8IHNlcGFyYXRpbmcgdGhlIGNvZWZmaWNpZW50IGZyb20gdGhlIGV4cG9uZW50LiBUaGUgICAgICAgICAgfAogICB8ICAgICAgICAgICB8IGNvZWZmaWNpZW50IGhhcyBvbmUgZGlnaXQgYmVmb3JlIGFuZCAicCIgZGlnaXRzIGFmdGVyIHRoZSAgfAogICB8ICAgICAgICAgICB8IGRlY2ltYWwgcG9pbnQsIGZvciBhIHRvdGFsIG9mICJwICsgMSIgc2lnbmlmaWNhbnQgZGlnaXRzLiAgfAogICB8ICAgICAgICAgICB8IFdpdGggbm8gcHJlY2lzaW9uIGdpdmVuLCB1c2VzIGEgcHJlY2lzaW9uIG9mICI2IiBkaWdpdHMgICAgfAogICB8ICAgICAgICAgICB8IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciAiZmxvYXQiLCBhbmQgc2hvd3MgYWxsICAgICAgICAgfAogICB8ICAgICAgICAgICB8IGNvZWZmaWNpZW50IGRpZ2l0cyBmb3IgIkRlY2ltYWwiLiBJZiBubyBkaWdpdHMgZm9sbG93IHRoZSAgfAogICB8ICAgICAgICAgICB8IGRlY2ltYWwgcG9pbnQsIHRoZSBkZWNpbWFsIHBvaW50IGlzIGFsc28gcmVtb3ZlZCB1bmxlc3MgICAgfAogICB8ICAgICAgICAgICB8IHRoZSAiIyIgb3B0aW9uIGlzIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICB8ICInRSciICAgICB8IFNjaWVudGlmaWMgbm90YXRpb24uIFNhbWUgYXMgIidlJyIgZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgfAogICB8ICAgICAgICAgICB8IGNhc2Ug4oCYReKAmSBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ2YnIiAgICAgfCBGaXhlZC1wb2ludCBub3RhdGlvbi4gRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICJwIiwgZm9ybWF0cyAgIHwKICAgfCAgICAgICAgICAgfCB0aGUgbnVtYmVyIGFzIGEgZGVjaW1hbCBudW1iZXIgd2l0aCBleGFjdGx5ICJwIiBkaWdpdHMgICAgIHwKICAgfCAgICAgICAgICAgfCBmb2xsb3dpbmcgdGhlIGRlY2ltYWwgcG9pbnQuIFdpdGggbm8gcHJlY2lzaW9uIGdpdmVuLCB1c2VzIHwKICAgfCAgICAgICAgICAgfCBhIHByZWNpc2lvbiBvZiAiNiIgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciAgICAgIHwKICAgfCAgICAgICAgICAgfCAiZmxvYXQiLCBhbmQgdXNlcyBhIHByZWNpc2lvbiBsYXJnZSBlbm91Z2ggdG8gc2hvdyBhbGwgICAgIHwKICAgfCAgICAgICAgICAgfCBjb2VmZmljaWVudCBkaWdpdHMgZm9yICJEZWNpbWFsIi4gSWYgbm8gZGlnaXRzIGZvbGxvdyB0aGUgIHwKICAgfCAgICAgICAgICAgfCBkZWNpbWFsIHBvaW50LCB0aGUgZGVjaW1hbCBwb2ludCBpcyBhbHNvIHJlbW92ZWQgdW5sZXNzICAgIHwKICAgfCAgICAgICAgICAgfCB0aGUgIiMiIG9wdGlvbiBpcyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ0YnIiAgICAgfCBGaXhlZC1wb2ludCBub3RhdGlvbi4gU2FtZSBhcyAiJ2YnIiwgYnV0IGNvbnZlcnRzICJuYW4iIHRvIHwKICAgfCAgICAgICAgICAgfCAiTkFOIiBhbmQgImluZiIgdG8gIklORiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ2cnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gIEZvciBhIGdpdmVuIHByZWNpc2lvbiAicCA+PSAxIiwgdGhpcyAgICAgIHwKICAgfCAgICAgICAgICAgfCByb3VuZHMgdGhlIG51bWJlciB0byAicCIgc2lnbmlmaWNhbnQgZGlnaXRzIGFuZCB0aGVuICAgICAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHwKICAgfCAgICAgICAgICAgfCBzY2llbnRpZmljIG5vdGF0aW9uLCBkZXBlbmRpbmcgb24gaXRzIG1hZ25pdHVkZS4gQSAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24gb2YgIjAiIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBhIHByZWNpc2lvbiAgIHwKICAgfCAgICAgICAgICAgfCBvZiAiMSIuICBUaGUgcHJlY2lzZSBydWxlcyBhcmUgYXMgZm9sbG93czogc3VwcG9zZSB0aGF0ICAgIHwKICAgfCAgICAgICAgICAgfCB0aGUgcmVzdWx0IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICInZSciIGFuZCAgICAgIHwKICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24gInAtMSIgd291bGQgaGF2ZSBleHBvbmVudCAiZXhwIi4gIFRoZW4sIGlmICJtIDw9IHwKICAgfCAgICAgICAgICAgfCBleHAgPCBwIiwgd2hlcmUgIm0iIGlzIC00IGZvciBmbG9hdHMgYW5kIC02IGZvciAgICAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCAiRGVjaW1hbHMiLCB0aGUgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlIHwKICAgfCAgICAgICAgICAgfCAiJ2YnIiBhbmQgcHJlY2lzaW9uICJwLTEtZXhwIi4gIE90aGVyd2lzZSwgdGhlIG51bWJlciBpcyAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAiJ2UnIiBhbmQgcHJlY2lzaW9uICAgICAgIHwKICAgfCAgICAgICAgICAgfCAicC0xIi4gSW4gYm90aCBjYXNlcyBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9zIGFyZSAgICAgIHwKICAgfCAgICAgICAgICAgfCByZW1vdmVkIGZyb20gdGhlIHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgICAgIHwKICAgfCAgICAgICAgICAgfCBhbHNvIHJlbW92ZWQgaWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nICAgIHwKICAgfCAgICAgICAgICAgfCBpdCwgdW5sZXNzIHRoZSAiJyMnIiBvcHRpb24gaXMgdXNlZC4gIFdpdGggbm8gcHJlY2lzaW9uICAgIHwKICAgfCAgICAgICAgICAgfCBnaXZlbiwgdXNlcyBhIHByZWNpc2lvbiBvZiAiNiIgc2lnbmlmaWNhbnQgZGlnaXRzIGZvciAgICAgIHwKICAgfCAgICAgICAgICAgfCAiZmxvYXQiLiBGb3IgIkRlY2ltYWwiLCB0aGUgY29lZmZpY2llbnQgb2YgdGhlIHJlc3VsdCBpcyAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtZWQgZnJvbSB0aGUgY29lZmZpY2llbnQgZGlnaXRzIG9mIHRoZSB2YWx1ZTsgICAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBzY2llbnRpZmljIG5vdGF0aW9uIGlzIHVzZWQgZm9yIHZhbHVlcyBzbWFsbGVyIHRoYW4gIjFlLTYiIHwKICAgfCAgICAgICAgICAgfCBpbiBhYnNvbHV0ZSB2YWx1ZSBhbmQgdmFsdWVzIHdoZXJlIHRoZSBwbGFjZSB2YWx1ZSBvZiB0aGUgIHwKICAgfCAgICAgICAgICAgfCBsZWFzdCBzaWduaWZpY2FudCBkaWdpdCBpcyBsYXJnZXIgdGhhbiAxLCBhbmQgZml4ZWQtcG9pbnQgIHwKICAgfCAgICAgICAgICAgfCBub3RhdGlvbiBpcyB1c2VkIG90aGVyd2lzZS4gIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBpbmZpbml0eSwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHplcm8sIGFuZCBuYW5zLCBhcmUgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgYXMgImluZiIsICItaW5mIiwgIjAiLCAiLTAiIGFuZCAibmFuIiAgICAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCByZXNwZWN0aXZlbHksIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZWNpc2lvbi4gICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ0cnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyAiJ2cnIiBleGNlcHQgc3dpdGNoZXMgdG8gIidFJyIgaWYgIHwKICAgfCAgICAgICAgICAgfCB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IHwKICAgfCAgICAgICAgICAgfCBhbmQgTmFOIGFyZSB1cHBlcmNhc2VkLCB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJ24nIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIidnJyIsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHwKICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyICAgIHwKICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAiJyUnIiAgICAgfCBQZXJjZW50YWdlLiBNdWx0aXBsaWVzIHRoZSBudW1iZXIgYnkgMTAwIGFuZCBkaXNwbGF5cyBpbiAgIHwKICAgfCAgICAgICAgICAgfCBmaXhlZCAoIidmJyIpIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSBwZXJjZW50IHNpZ24uICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgfCBOb25lICAgICAgfCBGb3IgImZsb2F0IiB0aGlzIGlzIHRoZSBzYW1lIGFzICInZyciLCBleGNlcHQgdGhhdCB3aGVuICAgIHwKICAgfCAgICAgICAgICAgfCBmaXhlZC1wb2ludCBub3RhdGlvbiBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgcmVzdWx0LCBpdCAgICAgIHwKICAgfCAgICAgICAgICAgfCBhbHdheXMgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIGRpZ2l0IHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQuIHwKICAgfCAgICAgICAgICAgfCBUaGUgcHJlY2lzaW9uIHVzZWQgaXMgYXMgbGFyZ2UgYXMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgIHwKICAgfCAgICAgICAgICAgfCBnaXZlbiB2YWx1ZSBmYWl0aGZ1bGx5LiAgRm9yICJEZWNpbWFsIiwgdGhpcyBpcyB0aGUgc2FtZSAgIHwKICAgfCAgICAgICAgICAgfCBhcyBlaXRoZXIgIidnJyIgb3IgIidHJyIgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAgICAgICAgIHwKICAgfCAgICAgICAgICAgfCAiY29udGV4dC5jYXBpdGFscyIgZm9yIHRoZSBjdXJyZW50IGRlY2ltYWwgY29udGV4dC4gIFRoZSAgIHwKICAgfCAgICAgICAgICAgfCBvdmVyYWxsIGVmZmVjdCBpcyB0byBtYXRjaCB0aGUgb3V0cHV0IG9mICJzdHIoKSIgYXMgICAgICAgIHwKICAgfCAgICAgICAgICAgfCBhbHRlcmVkIGJ5IHRoZSBvdGhlciBmb3JtYXQgbW9kaWZpZXJzLiAgICAgICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpGb3JtYXQgZXhhbXBsZXMKPT09PT09PT09PT09PT09CgpUaGlzIHNlY3Rpb24gY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlICJzdHIuZm9ybWF0KCkiIHN5bnRheCBhbmQKY29tcGFyaXNvbiB3aXRoIHRoZSBvbGQgIiUiLWZvcm1hdHRpbmcuCgpJbiBtb3N0IG9mIHRoZSBjYXNlcyB0aGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCAiJSItZm9ybWF0dGluZywKd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlICJ7fSIgYW5kIHdpdGggIjoiIHVzZWQgaW5zdGVhZCBvZiAiJSIuIEZvcgpleGFtcGxlLCAiJyUwMy4yZiciIGNhbiBiZSB0cmFuc2xhdGVkIHRvICInezowMy4yZn0nIi4KClRoZSBuZXcgZm9ybWF0IHN5bnRheCBhbHNvIHN1cHBvcnRzIG5ldyBhbmQgZGlmZmVyZW50IG9wdGlvbnMsIHNob3duCmluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuCgpBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IHBvc2l0aW9uOgoKICAgPj4+ICd7MH0sIHsxfSwgezJ9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJykKICAgJ2EsIGIsIGMnCiAgID4+PiAne30sIHt9LCB7fScuZm9ybWF0KCdhJywgJ2InLCAnYycpICAjIDMuMSsgb25seQogICAnYSwgYiwgYycKICAgPj4+ICd7Mn0sIHsxfSwgezB9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJykKICAgJ2MsIGIsIGEnCiAgID4+PiAnezJ9LCB7MX0sIHswfScuZm9ybWF0KConYWJjJykgICAgICAjIHVucGFja2luZyBhcmd1bWVudCBzZXF1ZW5jZQogICAnYywgYiwgYScKICAgPj4+ICd7MH17MX17MH0nLmZvcm1hdCgnYWJyYScsICdjYWQnKSAgICMgYXJndW1lbnRzJyBpbmRpY2VzIGNhbiBiZSByZXBlYXRlZAogICAnYWJyYWNhZGFicmEnCgpBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IG5hbWU6CgogICA+Pj4gJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfScuZm9ybWF0KGxhdGl0dWRlPSczNy4yNE4nLCBsb25naXR1ZGU9Jy0xMTUuODFXJykKICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJwogICA+Pj4gY29vcmQgPSB7J2xhdGl0dWRlJzogJzM3LjI0TicsICdsb25naXR1ZGUnOiAnLTExNS44MVcnfQogICA+Pj4gJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfScuZm9ybWF0KCoqY29vcmQpCiAgICdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxVycKCkFjY2Vzc2luZyBhcmd1bWVudHPigJkgYXR0cmlidXRlczoKCiAgID4+PiBjID0gMy01agogICA+Pj4gKCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgezAucmVhbH0gJwogICAuLi4gICdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LicpLmZvcm1hdChjKQogICAnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IDMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuJwogICA+Pj4gY2xhc3MgUG9pbnQ6CiAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgogICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHkKICAgLi4uICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgLi4uICAgICAgICAgcmV0dXJuICdQb2ludCh7c2VsZi54fSwge3NlbGYueX0pJy5mb3JtYXQoc2VsZj1zZWxmKQogICAuLi4KICAgPj4+IHN0cihQb2ludCg0LCAyKSkKICAgJ1BvaW50KDQsIDIpJwoKQWNjZXNzaW5nIGFyZ3VtZW50c+KAmSBpdGVtczoKCiAgID4+PiBjb29yZCA9ICgzLCA1KQogICA+Pj4gJ1g6IHswWzBdfTsgIFk6IHswWzFdfScuZm9ybWF0KGNvb3JkKQogICAnWDogMzsgIFk6IDUnCgpSZXBsYWNpbmcgIiVzIiBhbmQgIiVyIjoKCiAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc24ndDogeyFzfSIuZm9ybWF0KCd0ZXN0MScsICd0ZXN0MicpCiAgICJyZXByKCkgc2hvd3MgcXVvdGVzOiAndGVzdDEnOyBzdHIoKSBkb2Vzbid0OiB0ZXN0MiIKCkFsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6CgogICA+Pj4gJ3s6PDMwfScuZm9ybWF0KCdsZWZ0IGFsaWduZWQnKQogICAnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgJwogICA+Pj4gJ3s6PjMwfScuZm9ybWF0KCdyaWdodCBhbGlnbmVkJykKICAgJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZCcKICAgPj4+ICd7Ol4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKQogICAnICAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAgJwogICA+Pj4gJ3s6Kl4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKSAgIyB1c2UgJyonIGFzIGEgZmlsbCBjaGFyCiAgICcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKionCgpSZXBsYWNpbmcgIiUrZiIsICIlLWYiLCBhbmQgIiUgZiIgYW5kIHNwZWNpZnlpbmcgYSBzaWduOgoKICAgPj4+ICd7OitmfTsgezorZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXMKICAgJyszLjE0MDAwMDsgLTMuMTQwMDAwJwogICA+Pj4gJ3s6IGZ9OyB7OiBmfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnMKICAgJyAzLjE0MDAwMDsgLTMuMTQwMDAwJwogICA+Pj4gJ3s6LWZ9OyB7Oi1mfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgJ3s6Zn07IHs6Zn0nCiAgICczLjE0MDAwMDsgLTMuMTQwMDAwJwoKUmVwbGFjaW5nICIleCIgYW5kICIlbyIgYW5kIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGRpZmZlcmVudCBiYXNlczoKCiAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzCiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiB7MDpifSIuZm9ybWF0KDQyKQogICAnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTAnCiAgID4+PiAjIHdpdGggMHgsIDBvLCBvciAwYiBhcyBwcmVmaXg6CiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46IHswOiNifSIuZm9ybWF0KDQyKQogICAnaW50OiA0MjsgIGhleDogMHgyYTsgIG9jdDogMG81MjsgIGJpbjogMGIxMDEwMTAnCgpVc2luZyB0aGUgY29tbWEgYXMgYSB0aG91c2FuZHMgc2VwYXJhdG9yOgoKICAgPj4+ICd7Oix9Jy5mb3JtYXQoMTIzNDU2Nzg5MCkKICAgJzEsMjM0LDU2Nyw4OTAnCgpFeHByZXNzaW5nIGEgcGVyY2VudGFnZToKCiAgID4+PiBwb2ludHMgPSAxOQogICA+Pj4gdG90YWwgPSAyMgogICA+Pj4gJ0NvcnJlY3QgYW5zd2VyczogezouMiV9Jy5mb3JtYXQocG9pbnRzL3RvdGFsKQogICAnQ29ycmVjdCBhbnN3ZXJzOiA4Ni4zNiUnCgpVc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6CgogICA+Pj4gaW1wb3J0IGRhdGV0aW1lCiAgID4+PiBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OCkKICAgPj4+ICd7OiVZLSVtLSVkICVIOiVNOiVTfScuZm9ybWF0KGQpCiAgICcyMDEwLTA3LTA0IDEyOjE1OjU4JwoKTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczoKCiAgID4+PiBmb3IgYWxpZ24sIHRleHQgaW4gemlwKCc8Xj4nLCBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J10pOgogICAuLi4gICAgICd7MDp7ZmlsbH17YWxpZ259MTZ9Jy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pCiAgIC4uLgogICAnbGVmdDw8PDw8PDw8PDw8PCcKICAgJ15eXl5eY2VudGVyXl5eXl4nCiAgICc+Pj4+Pj4+Pj4+PnJpZ2h0JwogICA+Pj4KICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV0KICAgPj4+ICd7OjAyWH17OjAyWH17OjAyWH17OjAyWH0nLmZvcm1hdCgqb2N0ZXRzKQogICAnQzBBODAwMDEnCiAgID4+PiBpbnQoXywgMTYpCiAgIDMyMzIyMzU1MjEKICAgPj4+CiAgID4+PiB3aWR0aCA9IDUKICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6IAogICAuLi4gICAgIGZvciBiYXNlIGluICdkWG9iJzoKICAgLi4uICAgICAgICAgcHJpbnQoJ3swOnt3aWR0aH17YmFzZX19Jy5mb3JtYXQobnVtLCBiYXNlPWJhc2UsIHdpZHRoPXdpZHRoKSwgZW5kPScgJykKICAgLi4uICAgICBwcmludCgpCiAgIC4uLgogICAgICAgNSAgICAgNSAgICAgNSAgIDEwMQogICAgICAgNiAgICAgNiAgICAgNiAgIDExMAogICAgICAgNyAgICAgNyAgICAgNyAgIDExMQogICAgICAgOCAgICAgOCAgICAxMCAgMTAwMAogICAgICAgOSAgICAgOSAgICAxMSAgMTAwMQogICAgICAxMCAgICAgQSAgICAxMiAgMTAxMAogICAgICAxMSAgICAgQiAgICAxMyAgMTAxMQraCGZ1bmN0aW9udYgbAABGdW5jdGlvbiBkZWZpbml0aW9ucwoqKioqKioqKioqKioqKioqKioqKgoKQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWUKc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpOgoKICAgZnVuY2RlZiAgICAgICAgICAgICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIgogICAgICAgICAgICAgICBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGUKICAgZGVjb3JhdG9ycyAgICAgICAgICAgICAgICA6Oj0gZGVjb3JhdG9yKwogICBkZWNvcmF0b3IgICAgICAgICAgICAgICAgIDo6PSAiQCIgYXNzaWdubWVudF9leHByZXNzaW9uIE5FV0xJTkUKICAgcGFyYW1ldGVyX2xpc3QgICAgICAgICAgICA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogIiwiICIvIiBbIiwiIFtwYXJhbWV0ZXJfbGlzdF9ub19wb3Nvbmx5XV0KICAgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJfbGlzdF9ub19wb3Nvbmx5CiAgIHBhcmFtZXRlcl9saXN0X25vX3Bvc29ubHkgOjo9IGRlZnBhcmFtZXRlciAoIiwiIGRlZnBhcmFtZXRlcikqIFsiLCIgW3BhcmFtZXRlcl9saXN0X3N0YXJhcmdzXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJncwogICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJncyAgIDo6PSAiKiIgW3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiIFsiKioiIHBhcmFtZXRlciBbIiwiXV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyIFsiLCJdCiAgIHBhcmFtZXRlciAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXQogICBkZWZwYXJhbWV0ZXIgICAgICAgICAgICAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXQogICBmdW5jbmFtZSAgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyCgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzCnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdAooYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpcwpmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZQphcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KClRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0cwpleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzRdCgpBIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcioKZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzCmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlCnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0CmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWUKaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbgpuZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZQoKICAgQGYxKGFyZykKICAgQGYyCiAgIGRlZiBmdW5jKCk6IHBhc3MKCmlzIHJvdWdobHkgZXF1aXZhbGVudCB0bwoKICAgZGVmIGZ1bmMoKTogcGFzcwogICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSkKCmV4Y2VwdCB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBpcyBub3QgdGVtcG9yYXJpbHkgYm91bmQgdG8gdGhlIG5hbWUKImZ1bmMiLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuOTogRnVuY3Rpb25zIG1heSBiZSBkZWNvcmF0ZWQgd2l0aCBhbnkgdmFsaWQKImFzc2lnbm1lbnRfZXhwcmVzc2lvbiIuIFByZXZpb3VzbHksIHRoZSBncmFtbWFyIHdhcyBtdWNoIG1vcmUKcmVzdHJpY3RpdmU7IHNlZSAqKlBFUCA2MTQqKiBmb3IgZGV0YWlscy4KCldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iCipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSDigJxkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMu4oCdCkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXkKYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVy4oCZcyBkZWZhdWx0IHZhbHVlIGlzCnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZwpwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSDigJwiKiLigJ0gbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIOKAlCB0aGlzIGlzCmEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci4KCioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gdGhlCmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzCmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSDigJxwcmUtCmNvbXB1dGVk4oCdIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQKdG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaAphcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLgpieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgaXMgaW4KZWZmZWN0IG1vZGlmaWVkLiAgVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkKYXJvdW5kIHRoaXMgaXMgdG8gdXNlICJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IKaXQgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLCBlLmcuOgoKICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOgogICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOgogICAgICAgICAgIHBlbmd1aW4gPSBbXQogICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKQogICAgICAgcmV0dXJuIHBlbmd1aW4KCkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvbiBDYWxscy4KQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyBtZW50aW9uZWQgaW4KdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbmFsIGFyZ3VtZW50cywgZnJvbSBrZXl3b3JkCmFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtIOKAnCIqaWRlbnRpZmllciLigJ0gaXMKcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55IGV4Y2VzcyBwb3NpdGlvbmFsCnBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiBJZiB0aGUgZm9ybQrigJwiKippZGVudGlmaWVyIuKAnSBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ldyBvcmRlcmVkCm1hcHBpbmcgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXcKZW1wdHkgbWFwcGluZyBvZiB0aGUgc2FtZSB0eXBlLiAgUGFyYW1ldGVycyBhZnRlciDigJwiKiLigJ0gb3IK4oCcIippZGVudGlmaWVyIuKAnSBhcmUga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCBieQprZXl3b3JkIGFyZ3VtZW50cy4gIFBhcmFtZXRlcnMgYmVmb3JlIOKAnCIvIuKAnSBhcmUgcG9zaXRpb25hbC1vbmx5CnBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCBieSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFRoZSAiLyIgZnVuY3Rpb24gcGFyYW1ldGVyIHN5bnRheCBtYXkgYmUgdXNlZAp0byBpbmRpY2F0ZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycy4gU2VlICoqUEVQIDU3MCoqIGZvciBkZXRhaWxzLgoKUGFyYW1ldGVycyBtYXkgaGF2ZSBhbiAqYW5ub3RhdGlvbiogb2YgdGhlIGZvcm0g4oCcIjogZXhwcmVzc2lvbiLigJ0KZm9sbG93aW5nIHRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiwKZXZlbiB0aG9zZSBvZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heQpoYXZlIOKAnHJldHVybuKAnSBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtIOKAnCItPiBleHByZXNzaW9uIuKAnSBhZnRlciB0aGUKcGFyYW1ldGVyIGxpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uLgpUaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYQpmdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhCmRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnPigJkgbmFtZXMgaW4gdGhlICJfX2Fubm90YXRpb25zX18iCmF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgSWYgdGhlICJhbm5vdGF0aW9ucyIgaW1wb3J0IGZyb20KIl9fZnV0dXJlX18iIGlzIHVzZWQsIGFubm90YXRpb25zIGFyZSBwcmVzZXJ2ZWQgYXMgc3RyaW5ncyBhdCBydW50aW1lCndoaWNoIGVuYWJsZXMgcG9zdHBvbmVkIGV2YWx1YXRpb24uICBPdGhlcndpc2UsIHRoZXkgYXJlIGV2YWx1YXRlZAp3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgSW4gdGhpcyBjYXNlIGFubm90YXRpb25zCm1heSBiZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlCmNvZGUuCgpJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kCnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYQpleHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gTGFtYmRhcy4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhCmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsKYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEg4oCcImRlZiLigJ0gc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yCmFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhCmV4cHJlc3Npb24uICBUaGUg4oCcImRlZiLigJ0gZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0CmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLgoKKipQcm9ncmFtbWVy4oCZcyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEg4oCcImRlZiLigJ0Kc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsCmZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyB1c2VkCmluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvbgpjb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiBOYW1pbmcgYW5kIGJpbmRpbmcgZm9yIGRldGFpbHMuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnMKICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuCgogICoqUEVQIDQ4NCoqIC0gVHlwZSBIaW50cwogICAgIERlZmluaXRpb24gb2YgYSBzdGFuZGFyZCBtZWFuaW5nIGZvciBhbm5vdGF0aW9uczogdHlwZSBoaW50cy4KCiAgKipQRVAgNTI2KiogLSBTeW50YXggZm9yIFZhcmlhYmxlIEFubm90YXRpb25zCiAgICAgQWJpbGl0eSB0byB0eXBlIGhpbnQgdmFyaWFibGUgZGVjbGFyYXRpb25zLCBpbmNsdWRpbmcgY2xhc3MKICAgICB2YXJpYWJsZXMgYW5kIGluc3RhbmNlIHZhcmlhYmxlcy4KCiAgKipQRVAgNTYzKiogLSBQb3N0cG9uZWQgRXZhbHVhdGlvbiBvZiBBbm5vdGF0aW9ucwogICAgIFN1cHBvcnQgZm9yIGZvcndhcmQgcmVmZXJlbmNlcyB3aXRoaW4gYW5ub3RhdGlvbnMgYnkgcHJlc2VydmluZwogICAgIGFubm90YXRpb25zIGluIGEgc3RyaW5nIGZvcm0gYXQgcnVudGltZSBpbnN0ZWFkIG9mIGVhZ2VyCiAgICAgZXZhbHVhdGlvbi4KCiAgKipQRVAgMzE4KiogLSBEZWNvcmF0b3JzIGZvciBGdW5jdGlvbnMgYW5kIE1ldGhvZHMKICAgICBGdW5jdGlvbiBhbmQgbWV0aG9kIGRlY29yYXRvcnMgd2VyZSBpbnRyb2R1Y2VkLiBDbGFzcyBkZWNvcmF0b3JzCiAgICAgd2VyZSBpbnRyb2R1Y2VkIGluICoqUEVQIDMxMjkqKi4K2gZnbG9iYWx18gUAAFRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKgoKICAgZ2xvYmFsX3N0bXQgOjo9ICJnbG9iYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSoKClRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaXMgYSBkZWNsYXJhdGlvbiB3aGljaCBob2xkcyBmb3IgdGhlIGVudGlyZQpjdXJyZW50IGNvZGUgYmxvY2suICBJdCBtZWFucyB0aGF0IHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgYXJlIHRvIGJlCmludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhIGdsb2JhbAp2YXJpYWJsZSB3aXRob3V0ICJnbG9iYWwiLCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIgdG8KZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC4KCk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvZGUKYmxvY2sgdGV4dHVhbGx5IHByZWNlZGluZyB0aGF0ICJnbG9iYWwiIHN0YXRlbWVudC4KCk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbApwYXJhbWV0ZXJzLCBvciBhcyB0YXJnZXRzIGluICJ3aXRoIiBzdGF0ZW1lbnRzIG9yICJleGNlcHQiIGNsYXVzZXMsIG9yCmluIGEgImZvciIgdGFyZ2V0IGxpc3QsICJjbGFzcyIgZGVmaW5pdGlvbiwgZnVuY3Rpb24gZGVmaW5pdGlvbiwKImltcG9ydCIgc3RhdGVtZW50LCBvciB2YXJpYWJsZSBhbm5vdGF0aW9uLgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAplbmZvcmNlIHNvbWUgb2YgdGhlc2UgcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZSB0aGlzCmZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseSBjaGFuZ2UKdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uCgoqKlByb2dyYW1tZXLigJlzIG5vdGU6KiogImdsb2JhbCIgaXMgYSBkaXJlY3RpdmUgdG8gdGhlIHBhcnNlci4gIEl0CmFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSAiZ2xvYmFsIgpzdGF0ZW1lbnQuIEluIHBhcnRpY3VsYXIsIGEgImdsb2JhbCIgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhIHN0cmluZwpvciBjb2RlIG9iamVjdCBzdXBwbGllZCB0byB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgZnVuY3Rpb24gZG9lcyBub3QKYWZmZWN0IHRoZSBjb2RlIGJsb2NrICpjb250YWluaW5nKiB0aGUgZnVuY3Rpb24gY2FsbCwgYW5kIGNvZGUKY29udGFpbmVkIGluIHN1Y2ggYSBzdHJpbmcgaXMgdW5hZmZlY3RlZCBieSAiZ2xvYmFsIiBzdGF0ZW1lbnRzIGluIHRoZQpjb2RlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGNhbGwuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSAiZXZhbCgpIgphbmQgImNvbXBpbGUoKSIgZnVuY3Rpb25zLgp6CmlkLWNsYXNzZXN1rAYAAFJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWwKbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZAp0cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6CgoiXyoiCiAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLgoKIl8iCiAgIEluIGEgImNhc2UiIHBhdHRlcm4gd2l0aGluIGEgIm1hdGNoIiBzdGF0ZW1lbnQsICJfIiBpcyBhIHNvZnQKICAga2V5d29yZCB0aGF0IGRlbm90ZXMgYSB3aWxkY2FyZC4KCiAgIFNlcGFyYXRlbHksIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBtYWtlcyB0aGUgcmVzdWx0IG9mIHRoZQogICBsYXN0IGV2YWx1YXRpb24gYXZhaWxhYmxlIGluIHRoZSB2YXJpYWJsZSAiXyIuIChJdCBpcyBzdG9yZWQgaW4gdGhlCiAgICJidWlsdGlucyIgbW9kdWxlLCBhbG9uZ3NpZGUgYnVpbHQtaW4gZnVuY3Rpb25zIGxpa2UgInByaW50Ii4pCgogICBFbHNld2hlcmUsICJfIiBpcyBhIHJlZ3VsYXIgaWRlbnRpZmllci4gSXQgaXMgb2Z0ZW4gdXNlZCB0byBuYW1lCiAgIOKAnHNwZWNpYWzigJ0gaXRlbXMsIGJ1dCBpdCBpcyBub3Qgc3BlY2lhbCB0byBQeXRob24gaXRzZWxmLgoKICAgTm90ZToKCiAgICAgVGhlIG5hbWUgIl8iIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAogICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCiAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uSXQgaXMKICAgICBhbHNvIGNvbW1vbmx5IHVzZWQgZm9yIHVudXNlZCB2YXJpYWJsZXMuCgoiX18qX18iCiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLCBpbmZvcm1hbGx5IGtub3duIGFzIOKAnGR1bmRlcuKAnSBuYW1lcy4gVGhlc2UKICAgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyIGFuZCBpdHMgaW1wbGVtZW50YXRpb24KICAgKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuIEN1cnJlbnQgc3lzdGVtIG5hbWVzIGFyZQogICBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzIHNlY3Rpb24gYW5kIGVsc2V3aGVyZS4gTW9yZQogICB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24uICAqQW55KiB1c2Ugb2YKICAgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lcyBub3QgZm9sbG93IGV4cGxpY2l0bHkKICAgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2Ugd2l0aG91dCB3YXJuaW5nLgoKIl9fKiIKICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlCiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm0KICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiDigJxwcml2YXRl4oCdIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmQKICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLgraC2lkZW50aWZpZXJzdVkTAABJZGVudGlmaWVycyBhbmQga2V5d29yZHMKKioqKioqKioqKioqKioqKioqKioqKioqCgpJZGVudGlmaWVycyAoYWxzbyByZWZlcnJlZCB0byBhcyAqbmFtZXMqKSBhcmUgZGVzY3JpYmVkIGJ5IHRoZQpmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9ucy4KClRoZSBzeW50YXggb2YgaWRlbnRpZmllcnMgaW4gUHl0aG9uIGlzIGJhc2VkIG9uIHRoZSBVbmljb2RlIHN0YW5kYXJkCmFubmV4IFVBWC0zMSwgd2l0aCBlbGFib3JhdGlvbiBhbmQgY2hhbmdlcyBhcyBkZWZpbmVkIGJlbG93OyBzZWUgYWxzbwoqKlBFUCAzMTMxKiogZm9yIGZ1cnRoZXIgZGV0YWlscy4KCldpdGhpbiB0aGUgQVNDSUkgcmFuZ2UgKFUrMDAwMS4uVSswMDdGKSwgdGhlIHZhbGlkIGNoYXJhY3RlcnMgZm9yCmlkZW50aWZpZXJzIGFyZSB0aGUgc2FtZSBhcyBpbiBQeXRob24gMi54OiB0aGUgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UKbGV0dGVycyAiQSIgdGhyb3VnaCAiWiIsIHRoZSB1bmRlcnNjb3JlICJfIiBhbmQsIGV4Y2VwdCBmb3IgdGhlIGZpcnN0CmNoYXJhY3RlciwgdGhlIGRpZ2l0cyAiMCIgdGhyb3VnaCAiOSIuCgpQeXRob24gMy4wIGludHJvZHVjZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGZyb20gb3V0c2lkZSB0aGUgQVNDSUkKcmFuZ2UgKHNlZSAqKlBFUCAzMTMxKiopLiAgRm9yIHRoZXNlIGNoYXJhY3RlcnMsIHRoZSBjbGFzc2lmaWNhdGlvbgp1c2VzIHRoZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBhcyBpbmNsdWRlZCBpbiB0aGUKInVuaWNvZGVkYXRhIiBtb2R1bGUuCgpJZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuCgogICBpZGVudGlmaWVyICAgOjo9IHhpZF9zdGFydCB4aWRfY29udGludWUqCiAgIGlkX3N0YXJ0ICAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGdlbmVyYWwgY2F0ZWdvcmllcyBMdSwgTGwsIEx0LCBMbSwgTG8sIE5sLCB0aGUgdW5kZXJzY29yZSwgYW5kIGNoYXJhY3RlcnMgd2l0aCB0aGUgT3RoZXJfSURfU3RhcnQgcHJvcGVydHk+CiAgIGlkX2NvbnRpbnVlICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0LCBwbHVzIGNoYXJhY3RlcnMgaW4gdGhlIGNhdGVnb3JpZXMgTW4sIE1jLCBOZCwgUGMgYW5kIG90aGVycyB3aXRoIHRoZSBPdGhlcl9JRF9Db250aW51ZSBwcm9wZXJ0eT4KICAgeGlkX3N0YXJ0ICAgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfc3RhcnQgd2hvc2UgTkZLQyBub3JtYWxpemF0aW9uIGlzIGluICJpZF9zdGFydCB4aWRfY29udGludWUqIj4KICAgeGlkX2NvbnRpbnVlIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfY29udGludWUgd2hvc2UgTkZLQyBub3JtYWxpemF0aW9uIGlzIGluICJpZF9jb250aW51ZSoiPgoKVGhlIFVuaWNvZGUgY2F0ZWdvcnkgY29kZXMgbWVudGlvbmVkIGFib3ZlIHN0YW5kIGZvcjoKCiogKkx1KiAtIHVwcGVyY2FzZSBsZXR0ZXJzCgoqICpMbCogLSBsb3dlcmNhc2UgbGV0dGVycwoKKiAqTHQqIC0gdGl0bGVjYXNlIGxldHRlcnMKCiogKkxtKiAtIG1vZGlmaWVyIGxldHRlcnMKCiogKkxvKiAtIG90aGVyIGxldHRlcnMKCiogKk5sKiAtIGxldHRlciBudW1iZXJzCgoqICpNbiogLSBub25zcGFjaW5nIG1hcmtzCgoqICpNYyogLSBzcGFjaW5nIGNvbWJpbmluZyBtYXJrcwoKKiAqTmQqIC0gZGVjaW1hbCBudW1iZXJzCgoqICpQYyogLSBjb25uZWN0b3IgcHVuY3R1YXRpb25zCgoqICpPdGhlcl9JRF9TdGFydCogLSBleHBsaWNpdCBsaXN0IG9mIGNoYXJhY3RlcnMgaW4gUHJvcExpc3QudHh0IHRvCiAgc3VwcG9ydCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKKiAqT3RoZXJfSURfQ29udGludWUqIC0gbGlrZXdpc2UKCkFsbCBpZGVudGlmaWVycyBhcmUgY29udmVydGVkIGludG8gdGhlIG5vcm1hbCBmb3JtIE5GS0Mgd2hpbGUgcGFyc2luZzsKY29tcGFyaXNvbiBvZiBpZGVudGlmaWVycyBpcyBiYXNlZCBvbiBORktDLgoKQSBub24tbm9ybWF0aXZlIEhUTUwgZmlsZSBsaXN0aW5nIGFsbCB2YWxpZCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgZm9yClVuaWNvZGUgMTQuMC4wIGNhbiBiZSBmb3VuZCBhdApodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvMTQuMC4wL3VjZC9EZXJpdmVkQ29yZVByb3BlcnRpZXMudHh0CgoKS2V5d29yZHMKPT09PT09PT0KClRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICprZXl3b3Jkcyogb2YKdGhlIGxhbmd1YWdlLCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgb3JkaW5hcnkgaWRlbnRpZmllcnMuICBUaGV5IG11c3QKYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZToKCiAgIEZhbHNlICAgICAgYXdhaXQgICAgICBlbHNlICAgICAgIGltcG9ydCAgICAgcGFzcwogICBOb25lICAgICAgIGJyZWFrICAgICAgZXhjZXB0ICAgICBpbiAgICAgICAgIHJhaXNlCiAgIFRydWUgICAgICAgY2xhc3MgICAgICBmaW5hbGx5ICAgIGlzICAgICAgICAgcmV0dXJuCiAgIGFuZCAgICAgICAgY29udGludWUgICBmb3IgICAgICAgIGxhbWJkYSAgICAgdHJ5CiAgIGFzICAgICAgICAgZGVmICAgICAgICBmcm9tICAgICAgIG5vbmxvY2FsICAgd2hpbGUKICAgYXNzZXJ0ICAgICBkZWwgICAgICAgIGdsb2JhbCAgICAgbm90ICAgICAgICB3aXRoCiAgIGFzeW5jICAgICAgZWxpZiAgICAgICBpZiAgICAgICAgIG9yICAgICAgICAgeWllbGQKCgpTb2Z0IEtleXdvcmRzCj09PT09PT09PT09PT0KCk5ldyBpbiB2ZXJzaW9uIDMuMTAuCgpTb21lIGlkZW50aWZpZXJzIGFyZSBvbmx5IHJlc2VydmVkIHVuZGVyIHNwZWNpZmljIGNvbnRleHRzLiBUaGVzZSBhcmUKa25vd24gYXMgKnNvZnQga2V5d29yZHMqLiAgVGhlIGlkZW50aWZpZXJzICJtYXRjaCIsICJjYXNlIiBhbmQgIl8iIGNhbgpzeW50YWN0aWNhbGx5IGFjdCBhcyBrZXl3b3JkcyBpbiBjb250ZXh0cyByZWxhdGVkIHRvIHRoZSBwYXR0ZXJuCm1hdGNoaW5nIHN0YXRlbWVudCwgYnV0IHRoaXMgZGlzdGluY3Rpb24gaXMgZG9uZSBhdCB0aGUgcGFyc2VyIGxldmVsLApub3Qgd2hlbiB0b2tlbml6aW5nLgoKQXMgc29mdCBrZXl3b3JkcywgdGhlaXIgdXNlIHdpdGggcGF0dGVybiBtYXRjaGluZyBpcyBwb3NzaWJsZSB3aGlsZQpzdGlsbCBwcmVzZXJ2aW5nIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlIHRoYXQgdXNlcyAibWF0Y2giLAoiY2FzZSIgYW5kICJfIiBhcyBpZGVudGlmaWVyIG5hbWVzLgoKClJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWwKbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZAp0cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6CgoiXyoiCiAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLgoKIl8iCiAgIEluIGEgImNhc2UiIHBhdHRlcm4gd2l0aGluIGEgIm1hdGNoIiBzdGF0ZW1lbnQsICJfIiBpcyBhIHNvZnQKICAga2V5d29yZCB0aGF0IGRlbm90ZXMgYSB3aWxkY2FyZC4KCiAgIFNlcGFyYXRlbHksIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBtYWtlcyB0aGUgcmVzdWx0IG9mIHRoZQogICBsYXN0IGV2YWx1YXRpb24gYXZhaWxhYmxlIGluIHRoZSB2YXJpYWJsZSAiXyIuIChJdCBpcyBzdG9yZWQgaW4gdGhlCiAgICJidWlsdGlucyIgbW9kdWxlLCBhbG9uZ3NpZGUgYnVpbHQtaW4gZnVuY3Rpb25zIGxpa2UgInByaW50Ii4pCgogICBFbHNld2hlcmUsICJfIiBpcyBhIHJlZ3VsYXIgaWRlbnRpZmllci4gSXQgaXMgb2Z0ZW4gdXNlZCB0byBuYW1lCiAgIOKAnHNwZWNpYWzigJ0gaXRlbXMsIGJ1dCBpdCBpcyBub3Qgc3BlY2lhbCB0byBQeXRob24gaXRzZWxmLgoKICAgTm90ZToKCiAgICAgVGhlIG5hbWUgIl8iIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAogICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCiAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uSXQgaXMKICAgICBhbHNvIGNvbW1vbmx5IHVzZWQgZm9yIHVudXNlZCB2YXJpYWJsZXMuCgoiX18qX18iCiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLCBpbmZvcm1hbGx5IGtub3duIGFzIOKAnGR1bmRlcuKAnSBuYW1lcy4gVGhlc2UKICAgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyIGFuZCBpdHMgaW1wbGVtZW50YXRpb24KICAgKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuIEN1cnJlbnQgc3lzdGVtIG5hbWVzIGFyZQogICBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzIHNlY3Rpb24gYW5kIGVsc2V3aGVyZS4gTW9yZQogICB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24uICAqQW55KiB1c2Ugb2YKICAgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lcyBub3QgZm9sbG93IGV4cGxpY2l0bHkKICAgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2Ugd2l0aG91dCB3YXJuaW5nLgoKIl9fKiIKICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlCiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm0KICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiDigJxwcml2YXRl4oCdIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmQKICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLgraAmlm2glpbWFnaW5hcnlhNQIAAEltYWdpbmFyeSBsaXRlcmFscwoqKioqKioqKioqKioqKioqKioKCkltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczoKCiAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGRpZ2l0cGFydCkgKCJqIiB8ICJKIikKCkFuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgb2YgMC4wLgpDb21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzCmFuZCBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBvbiB0aGVpciByYW5nZS4gIFRvIGNyZWF0ZSBhIGNvbXBsZXgKbnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGl0LAplLmcuLCAiKDMrNGopIi4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOgoKICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogICAzLjE0ZS0xMGogICAzLjE0XzE1XzkzagraBmltcG9ydHWKIgAAVGhlICJpbXBvcnQiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioqCgogICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBpZGVudGlmaWVyXSAoIiwiIG1vZHVsZSBbImFzIiBpZGVudGlmaWVyXSkqCiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciBbImFzIiBpZGVudGlmaWVyXQogICAgICAgICAgICAgICAgICAgKCIsIiBpZGVudGlmaWVyIFsiYXMiIGlkZW50aWZpZXJdKSoKICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgaWRlbnRpZmllciBbImFzIiBpZGVudGlmaWVyXQogICAgICAgICAgICAgICAgICAgKCIsIiBpZGVudGlmaWVyIFsiYXMiIGlkZW50aWZpZXJdKSogWyIsIl0gIikiCiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIioiCiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllcgogICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iKwoKVGhlIGJhc2ljIGltcG9ydCBzdGF0ZW1lbnQgKG5vICJmcm9tIiBjbGF1c2UpIGlzIGV4ZWN1dGVkIGluIHR3bwpzdGVwczoKCjEuIGZpbmQgYSBtb2R1bGUsIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3NhcnkKCjIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlIHdoZXJlCiAgIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLgoKV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpIHRoZQp0d28gc3RlcHMgYXJlIGNhcnJpZWQgb3V0IHNlcGFyYXRlbHkgZm9yIGVhY2ggY2xhdXNlLCBqdXN0IGFzIHRob3VnaAp0aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZHVhbCBpbXBvcnQgc3RhdGVtZW50cy4KClRoZSBkZXRhaWxzIG9mIHRoZSBmaXJzdCBzdGVwLCBmaW5kaW5nIGFuZCBsb2FkaW5nIG1vZHVsZXMsIGFyZQpkZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdGhlIGltcG9ydCBzeXN0ZW0sIHdoaWNoCmFsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXQgY2FuIGJlCmltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlCmltcG9ydCBzeXN0ZW0uIE5vdGUgdGhhdCBmYWlsdXJlcyBpbiB0aGlzIHN0ZXAgbWF5IGluZGljYXRlIGVpdGhlcgp0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhbiBlcnJvciBvY2N1cnJlZAp3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uIG9mIHRoZQptb2R1bGXigJlzIGNvZGUuCgpJZiB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBpdCB3aWxsIGJlIG1hZGUKYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6CgoqIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSAiYXMiLCB0aGVuIHRoZSBuYW1lIGZvbGxvd2luZyAiYXMiCiAgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS4KCiogSWYgbm8gb3RoZXIgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIGEKICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxl4oCZcyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UKICBhcyBhIHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlCgoqIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuIHRoZQogIG5hbWUgb2YgdGhlIHRvcCBsZXZlbCBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZSBpcyBib3VuZCBpbgogIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYWNrYWdlLiBUaGUKICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZQogIHJhdGhlciB0aGFuIGRpcmVjdGx5CgpUaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOgoKMS4gZmluZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIGNsYXVzZSwgbG9hZGluZyBhbmQKICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTsKCjIuIGZvciBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyBzcGVjaWZpZWQgaW4gdGhlICJpbXBvcnQiIGNsYXVzZXM6CgogICAxLiBjaGVjayBpZiB0aGUgaW1wb3J0ZWQgbW9kdWxlIGhhcyBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lCgogICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCB0aGVuCiAgICAgIGNoZWNrIHRoZSBpbXBvcnRlZCBtb2R1bGUgYWdhaW4gZm9yIHRoYXQgYXR0cmlidXRlCgogICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuCgogICA0LiBvdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsb2NhbAogICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyBwcmVzZW50LAogICAgICBvdGhlcndpc2UgdXNpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lCgpFeGFtcGxlczoKCiAgIGltcG9ydCBmb28gICAgICAgICAgICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBib3VuZCBsb2NhbGx5CiAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLCBmb28uYmFyLCBhbmQgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCBsb2NhbGx5CiAgIGltcG9ydCBmb28uYmFyLmJheiBhcyBmYmIgICMgZm9vLCBmb28uYmFyLCBhbmQgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvby5iYXIuYmF6IGJvdW5kIGFzIGZiYgogICBmcm9tIGZvby5iYXIgaW1wb3J0IGJheiAgICAjIGZvbywgZm9vLmJhciwgYW5kIGZvby5iYXIuYmF6IGltcG9ydGVkLCBmb28uYmFyLmJheiBib3VuZCBhcyBiYXoKICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzIGF0dHIKCklmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkIGJ5IGEgc3RhciAoIicqJyIpLCBhbGwgcHVibGljCm5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlCnNjb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLgoKVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlCm1vZHVsZeKAmXMgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkICJfX2FsbF9fIjsgaWYgZGVmaW5lZCwgaXQgbXVzdApiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgdGhhdAptb2R1bGUuICBUaGUgbmFtZXMgZ2l2ZW4gaW4gIl9fYWxsX18iIGFyZSBhbGwgY29uc2lkZXJlZCBwdWJsaWMgYW5kCmFyZSByZXF1aXJlZCB0byBleGlzdC4gIElmICJfX2FsbF9fIiBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZiBwdWJsaWMKbmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGXigJlzIG5hbWVzcGFjZSB3aGljaCBkbyBub3QKYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIidfJyIpLiAgIl9fYWxsX18iIHNob3VsZCBjb250YWluCnRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGV4cG9ydGluZwppdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCB3ZXJlCmltcG9ydGVkIGFuZCB1c2VkIHdpdGhpbiB0aGUgbW9kdWxlKS4KClRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQg4oCUICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIg4oCUIGlzIG9ubHkKYWxsb3dlZCBhdCB0aGUgbW9kdWxlIGxldmVsLiAgQXR0ZW1wdGluZyB0byB1c2UgaXQgaW4gY2xhc3Mgb3IKZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuCgpXaGVuIHNwZWNpZnlpbmcgd2hhdCBtb2R1bGUgdG8gaW1wb3J0IHlvdSBkbyBub3QgaGF2ZSB0byBzcGVjaWZ5IHRoZQphYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWQKd2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0IHdpdGhpbgp0aGUgc2FtZSB0b3AgcGFja2FnZSB3aXRob3V0IGhhdmluZyB0byBtZW50aW9uIHRoZSBwYWNrYWdlIG5hbWUuIEJ5CnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiB5b3UKY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHkKd2l0aG91dCBzcGVjaWZ5aW5nIGV4YWN0IG5hbWVzLiBPbmUgbGVhZGluZyBkb3QgbWVhbnMgdGhlIGN1cnJlbnQKcGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXAKb25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgZXhlY3V0ZQoiZnJvbSAuIGltcG9ydCBtb2QiIGZyb20gYSBtb2R1bGUgaW4gdGhlICJwa2ciIHBhY2thZ2UgdGhlbiB5b3Ugd2lsbAplbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCBtb2QiCmZyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGUKc3BlY2lmaWNhdGlvbiBmb3IgcmVsYXRpdmUgaW1wb3J0cyBpcyBjb250YWluZWQgaW4gdGhlIFBhY2thZ2UKUmVsYXRpdmUgSW1wb3J0cyBzZWN0aW9uLgoKImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXQKZGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHRoZSBtb2R1bGVzIHRvIGJlIGxvYWRlZC4KClJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAiaW1wb3J0IiB3aXRoIGFyZ3VtZW50cyAibW9kdWxlIiwgImZpbGVuYW1lIiwKInN5cy5wYXRoIiwgInN5cy5tZXRhX3BhdGgiLCAic3lzLnBhdGhfaG9va3MiLgoKCkZ1dHVyZSBzdGF0ZW1lbnRzCj09PT09PT09PT09PT09PT09CgpBICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXIKbW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZQphdmFpbGFibGUgaW4gYSBzcGVjaWZpZWQgZnV0dXJlIHJlbGVhc2Ugb2YgUHl0aG9uIHdoZXJlIHRoZSBmZWF0dXJlCmJlY29tZXMgc3RhbmRhcmQuCgpUaGUgZnV0dXJlIHN0YXRlbWVudCBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBmdXR1cmUgdmVyc2lvbnMKb2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0CmFsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZQpyZWxlYXNlIGluIHdoaWNoIHRoZSBmZWF0dXJlIGJlY29tZXMgc3RhbmRhcmQuCgogICBmdXR1cmVfc3RtdCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgaWRlbnRpZmllcl0pKgogICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIGlkZW50aWZpZXJdCiAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgaWRlbnRpZmllcl0pKiBbIiwiXSAiKSIKICAgZmVhdHVyZSAgICAgOjo9IGlkZW50aWZpZXIKCkEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5CmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZToKCiogdGhlIG1vZHVsZSBkb2NzdHJpbmcgKGlmIGFueSksCgoqIGNvbW1lbnRzLAoKKiBibGFuayBsaW5lcywgYW5kCgoqIG90aGVyIGZ1dHVyZSBzdGF0ZW1lbnRzLgoKVGhlIG9ubHkgZmVhdHVyZSB0aGF0IHJlcXVpcmVzIHVzaW5nIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzCiJhbm5vdGF0aW9ucyIgKHNlZSAqKlBFUCA1NjMqKikuCgpBbGwgaGlzdG9yaWNhbCBmZWF0dXJlcyBlbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50IGFyZSBzdGlsbApyZWNvZ25pemVkIGJ5IFB5dGhvbiAzLiAgVGhlIGxpc3QgaW5jbHVkZXMgImFic29sdXRlX2ltcG9ydCIsCiJkaXZpc2lvbiIsICJnZW5lcmF0b3JzIiwgImdlbmVyYXRvcl9zdG9wIiwgInVuaWNvZGVfbGl0ZXJhbHMiLAoicHJpbnRfZnVuY3Rpb24iLCAibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwKcmVkdW5kYW50IGJlY2F1c2UgdGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcwpjb21wYXRpYmlsaXR5LgoKQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGUKdGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW4KaW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBkaWZmZXJlbnQgY29kZS4gIEl0IG1heSBldmVuIGJlIHRoZSBjYXNlCnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3CnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGUKbW9kdWxlIGRpZmZlcmVudGx5LiAgU3VjaCBkZWNpc2lvbnMgY2Fubm90IGJlIHB1c2hlZCBvZmYgdW50aWwKcnVudGltZS4KCkZvciBhbnkgZ2l2ZW4gcmVsZWFzZSwgdGhlIGNvbXBpbGVyIGtub3dzIHdoaWNoIGZlYXR1cmUgbmFtZXMgaGF2ZQpiZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50CmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuCgpUaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6CnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgd2lsbApiZSBpbXBvcnRlZCBpbiB0aGUgdXN1YWwgd2F5IGF0IHRoZSB0aW1lIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzCmV4ZWN1dGVkLgoKVGhlIGludGVyZXN0aW5nIHJ1bnRpbWUgc2VtYW50aWNzIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZQplbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LgoKTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgc3RhdGVtZW50OgoKICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdCgpUaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl04oCZcyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGgKbm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy4KCkNvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXhlYygpIiBhbmQKImNvbXBpbGUoKSIgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZSAiTSIgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnQKd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggdGhlCmZ1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyB0bwoiY29tcGlsZSgpIiDigJQgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuCgpBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0IHdpbGwKdGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW4KaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAiLWkiIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWUKdG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlIGluCmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXMKZXhlY3V0ZWQuCgpTZWUgYWxzbzoKCiAgKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fCiAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uCtoCaW5hfwYAAE1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKioqKioqKioqCgpUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIgpldmFsdWF0ZXMgdG8gIlRydWUiIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCAiRmFsc2UiIG90aGVyd2lzZS4KInggbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlcwphbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzCndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXMKbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlCmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW4KeSkiLgoKRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgKngqCmlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4KRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyCnN0cmluZywgc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuCgpGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgIngKaW4geSIgcmV0dXJucyAiVHJ1ZSIgaWYgInkuX19jb250YWluc19fKHgpIiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSwgYW5kCiJGYWxzZSIgb3RoZXJ3aXNlLgoKRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG8KZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgIlRydWUiIGlmIHNvbWUgdmFsdWUgInoiLCBmb3Igd2hpY2gKdGhlIGV4cHJlc3Npb24gInggaXMgeiBvciB4ID09IHoiIGlzIHRydWUsIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZwpvdmVyICJ5Ii4gSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYKImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uCgpMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXMKIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyAiVHJ1ZSIgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tCm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCBpcyB5W2ldIG9yIHggPT0geVtpXSIsIGFuZCBubwpsb3dlciBpbnRlZ2VyIGluZGV4IHJhaXNlcyB0aGUgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXIKZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLgoKVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZSBvZgoiaW4iLgraCGludGVnZXJzYVYFAABJbnRlZ2VyIGxpdGVyYWxzCioqKioqKioqKioqKioqKioKCkludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6CgogICBpbnRlZ2VyICAgICAgOjo9IGRlY2ludGVnZXIgfCBiaW5pbnRlZ2VyIHwgb2N0aW50ZWdlciB8IGhleGludGVnZXIKICAgZGVjaW50ZWdlciAgIDo6PSBub256ZXJvZGlnaXQgKFsiXyJdIGRpZ2l0KSogfCAiMCIrIChbIl8iXSAiMCIpKgogICBiaW5pbnRlZ2VyICAgOjo9ICIwIiAoImIiIHwgIkIiKSAoWyJfIl0gYmluZGlnaXQpKwogICBvY3RpbnRlZ2VyICAgOjo9ICIwIiAoIm8iIHwgIk8iKSAoWyJfIl0gb2N0ZGlnaXQpKwogICBoZXhpbnRlZ2VyICAgOjo9ICIwIiAoIngiIHwgIlgiKSAoWyJfIl0gaGV4ZGlnaXQpKwogICBub256ZXJvZGlnaXQgOjo9ICIxIi4uLiI5IgogICBkaWdpdCAgICAgICAgOjo9ICIwIi4uLiI5IgogICBiaW5kaWdpdCAgICAgOjo9ICIwIiB8ICIxIgogICBvY3RkaWdpdCAgICAgOjo9ICIwIi4uLiI3IgogICBoZXhkaWdpdCAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiCgpUaGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIGxlbmd0aCBvZiBpbnRlZ2VyIGxpdGVyYWxzIGFwYXJ0IGZyb20gd2hhdApjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuCgpVbmRlcnNjb3JlcyBhcmUgaWdub3JlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlCmxpdGVyYWwuICBUaGV5IGNhbiBiZSB1c2VkIHRvIGdyb3VwIGRpZ2l0cyBmb3IgZW5oYW5jZWQgcmVhZGFiaWxpdHkuCk9uZSB1bmRlcnNjb3JlIGNhbiBvY2N1ciBiZXR3ZWVuIGRpZ2l0cywgYW5kIGFmdGVyIGJhc2Ugc3BlY2lmaWVycwpsaWtlICIweCIuCgpOb3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgYWxsb3dlZC4KVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob24KdXNlZCBiZWZvcmUgdmVyc2lvbiAzLjAuCgpTb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6CgogICA3ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMG8xNzcgICAgMGIxMDAxMTAxMTEKICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4ZGVhZGJlZWYKICAgICAgICAgMTAwXzAwMF8wMDBfMDAwICAgICAgICAgICAgICAgICAgIDBiXzExMTBfMDEwMQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogVW5kZXJzY29yZXMgYXJlIG5vdyBhbGxvd2VkIGZvciBncm91cGluZwpwdXJwb3NlcyBpbiBsaXRlcmFscy4K2gZsYW1iZGFhDQIAAExhbWJkYXMKKioqKioqKgoKICAgbGFtYmRhX2V4cHIgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF0gIjoiIGV4cHJlc3Npb24KCkxhbWJkYSBleHByZXNzaW9ucyAoc29tZXRpbWVzIGNhbGxlZCBsYW1iZGEgZm9ybXMpIGFyZSB1c2VkIHRvIGNyZWF0ZQphbm9ueW1vdXMgZnVuY3Rpb25zLiBUaGUgZXhwcmVzc2lvbiAibGFtYmRhIHBhcmFtZXRlcnM6IGV4cHJlc3Npb24iCnlpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSBmdW5jdGlvbgpvYmplY3QgZGVmaW5lZCB3aXRoOgoKICAgZGVmIDxsYW1iZGE+KHBhcmFtZXRlcnMpOgogICAgICAgcmV0dXJuIGV4cHJlc3Npb24KClNlZSBzZWN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy4KTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluCnN0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuCtoFbGlzdHNhLwIAAExpc3QgZGlzcGxheXMKKioqKioqKioqKioqKgoKQSBsaXN0IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2YgZXhwcmVzc2lvbnMgZW5jbG9zZWQgaW4Kc3F1YXJlIGJyYWNrZXRzOgoKICAgbGlzdF9kaXNwbGF5IDo6PSAiWyIgW3N0YXJyZWRfbGlzdCB8IGNvbXByZWhlbnNpb25dICJdIgoKQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LCB0aGUgY29udGVudHMgYmVpbmcgc3BlY2lmaWVkCmJ5IGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBjb21wcmVoZW5zaW9uLiAgV2hlbiBhIGNvbW1hLQpzZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWQKZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW4gdGhhdCBvcmRlci4KV2hlbiBhIGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIHRoZSBsaXN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlCmVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLgraBm5hbWluZ3WwGAAATmFtaW5nIGFuZCBiaW5kaW5nCioqKioqKioqKioqKioqKioqKgoKCkJpbmRpbmcgb2YgbmFtZXMKPT09PT09PT09PT09PT09PQoKKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nCm9wZXJhdGlvbnMuCgpUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczoKCiogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLAoKKiBjbGFzcyBkZWZpbml0aW9ucywKCiogZnVuY3Rpb24gZGVmaW5pdGlvbnMsCgoqIGFzc2lnbm1lbnQgZXhwcmVzc2lvbnMsCgoqIHRhcmdldHMgdGhhdCBhcmUgaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQ6CgogICogImZvciIgbG9vcCBoZWFkZXIsCgogICogYWZ0ZXIgImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQsICJleGNlcHQiIGNsYXVzZSwgImV4Y2VwdCoiCiAgICBjbGF1c2UsIG9yIGluIHRoZSBhcy1wYXR0ZXJuIGluIHN0cnVjdHVyYWwgcGF0dGVybiBtYXRjaGluZywKCiAgKiBpbiBhIGNhcHR1cmUgcGF0dGVybiBpbiBzdHJ1Y3R1cmFsIHBhdHRlcm4gbWF0Y2hpbmcKCiogImltcG9ydCIgc3RhdGVtZW50cy4KClRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMKZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4KdW5kZXJzY29yZS4gVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4KCkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yCnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLgoKRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYQpjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWwKY29kZSBibG9jaykuCgpJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLAp1bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGUKbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGUKY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlCmJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouCgpFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAqYmluZGluZyoKb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLgoKClJlc29sdXRpb24gb2YgbmFtZXMKPT09PT09PT09PT09PT09PT09PQoKQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbAp2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlCmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3MKY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlcwphIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4KCldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdAplbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9jawppcyBjYWxsZWQgdGhlIGJsb2Nr4oCZcyAqZW52aXJvbm1lbnQqLgoKV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBJZgp0aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwKdmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlIHRoZQpuYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4KIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLgoKSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGwKdXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlCmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhCmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3MKZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmUKd2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZQpkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZwpvcGVyYXRpb25zLiBTZWUgdGhlIEZBUSBlbnRyeSBvbiBVbmJvdW5kTG9jYWxFcnJvciBmb3IgZXhhbXBsZXMuCgpJZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVzCnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5ncyBvZiB0aG9zZSBuYW1lcyBpbiB0aGUKdG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieQpzZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlCmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlCm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWYKdGhlIG5hbWVzIGFyZSBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuClRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBsaXN0ZWQgbmFtZXMuCgpUaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24KaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZQpjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuCgpUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG8KcHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLgoiU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyBub3QKZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4KClRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhCm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZAoiX19tYWluX18iLgoKQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlCnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4KZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMKZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0CnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZQpuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkgb2YKdGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8KdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMg4oCTCnRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZQppbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcKd2lsbCBmYWlsOgoKICAgY2xhc3MgQToKICAgICAgIGEgPSA0MgogICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKQoKCkJ1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaAoiX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnMKd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgImltcG9ydCIKdGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS4KClRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrCmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzIGdsb2JhbApuYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlCnRoZSBtb2R1bGXigJlzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iCm1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluIGFueQpvdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUKImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLgoKCkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGUKdGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOgoKICAgaSA9IDEwCiAgIGRlZiBmKCk6CiAgICAgICBwcmludChpKQogICBpID0gNDIKICAgZigpCgpUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwKZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwKYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkCmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXQpUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0bwpvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMKc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLgraCG5vbmxvY2FsYaIDAABUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKioqCgogICBub25sb2NhbF9zdG10IDo6PSAibm9ubG9jYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSoKClRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgdGhlIGxpc3RlZCBpZGVudGlmaWVycyB0byByZWZlciB0bwpwcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZXhjbHVkaW5nCmdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGJpbmRpbmcgaXMKdG8gc2VhcmNoIHRoZSBsb2NhbCBuYW1lc3BhY2UgZmlyc3QuICBUaGUgc3RhdGVtZW50IGFsbG93cwplbmNhcHN1bGF0ZWQgY29kZSB0byByZWJpbmQgdmFyaWFibGVzIG91dHNpZGUgb2YgdGhlIGxvY2FsIHNjb3BlCmJlc2lkZXMgdGhlIGdsb2JhbCAobW9kdWxlKSBzY29wZS4KCk5hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50LCB1bmxpa2UgdGhvc2UgbGlzdGVkIGluIGEKImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhbgplbmNsb3Npbmcgc2NvcGUgKHRoZSBzY29wZSBpbiB3aGljaCBhIG5ldyBiaW5kaW5nIHNob3VsZCBiZSBjcmVhdGVkCmNhbm5vdCBiZSBkZXRlcm1pbmVkIHVuYW1iaWd1b3VzbHkpLgoKTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgbXVzdCBub3QgY29sbGlkZSB3aXRoIHByZS0KZXhpc3RpbmcgYmluZGluZ3MgaW4gdGhlIGxvY2FsIHNjb3BlLgoKU2VlIGFsc286CgogICoqUEVQIDMxMDQqKiAtIEFjY2VzcyB0byBOYW1lcyBpbiBPdXRlciBTY29wZXMKICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICJub25sb2NhbCIgc3RhdGVtZW50LgraB251bWJlcnN1lQEAAE51bWVyaWMgbGl0ZXJhbHMKKioqKioqKioqKioqKioqKgoKVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG51bWVyaWMgbGl0ZXJhbHM6IGludGVnZXJzLCBmbG9hdGluZyBwb2ludApudW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8gY29tcGxleCBsaXRlcmFscwooY29tcGxleCBudW1iZXJzIGNhbiBiZSBmb3JtZWQgYnkgYWRkaW5nIGEgcmVhbCBudW1iZXIgYW5kIGFuCmltYWdpbmFyeSBudW1iZXIpLgoKTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICItMSIKaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3Ig4oCYIi0i4oCZIGFuZCB0aGUKbGl0ZXJhbCAiMSIuCnoNbnVtZXJpYy10eXBlc3X5FgAARW11bGF0aW5nIG51bWVyaWMgdHlwZXMKKioqKioqKioqKioqKioqKioqKioqKioKClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy4KTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUKcGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvcgpub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLgoKb2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMKICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIiwKICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvCiAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhCiAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInR5cGUoeCkuX19hZGRfXyh4LCB5KSIgaXMKICAgY2FsbGVkLiAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8KICAgdXNpbmcgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0bwogICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0CiAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluCiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLgoKICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlCiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLgoKb2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpYwogICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLAogICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZCkKICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcwogICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gWzNdIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mCiAgIGRpZmZlcmVudCB0eXBlcy4gWzRdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggLQogICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiCiAgIG1ldGhvZCwgInR5cGUoeSkuX19yc3ViX18oeSwgeCkiIGlzIGNhbGxlZCBpZiAidHlwZSh4KS5fX3N1Yl9fKHgsCiAgIHkpIiByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIuCgogICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICJfX3Jwb3dfXygpIiAodGhlCiAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLgoKICAgTm90ZToKCiAgICAgSWYgdGhlIHJpZ2h0IG9wZXJhbmTigJlzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5k4oCZcwogICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCiAgICAgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKICAgICBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZOKAmXMgbm9uLXJlZmxlY3RlZCBtZXRob2QuIFRoaXMgYmVoYXZpb3IKICAgICBhbGxvd3Mgc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnPigJkgb3BlcmF0aW9ucy4KCm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSkKb2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljCiAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgIioqPSIsCiAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvCiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSBzcGVjaWZpYwogICBtZXRob2QgaXMgbm90IGRlZmluZWQsIG9yIGlmIHRoYXQgbWV0aG9kIHJldHVybnMgIk5vdEltcGxlbWVudGVkIiwKICAgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yCiAgIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIGFuICJfX2lhZGRfXygpIgogICBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggPSB4Ll9faWFkZF9fKHkpIiAuIElmCiAgICJfX2lhZGRfXygpIiBkb2VzIG5vdCBleGlzdCwgb3IgaWYgInguX19pYWRkX18oeSkiIHJldHVybnMKICAgIk5vdEltcGxlbWVudGVkIiwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmUKICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiBjZXJ0YWluCiAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBlcnJvcnMKICAgKHNlZSBXaHkgZG9lcyBhX3R1cGxlW2ldICs9IFvigJhpdGVt4oCZXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGUKICAgYWRkaXRpb24gd29ya3M/KSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mIHRoZSBkYXRhCiAgIG1vZGVsLgoKb2JqZWN0Ll9fbmVnX18oc2VsZikKb2JqZWN0Ll9fcG9zX18oc2VsZikKb2JqZWN0Ll9fYWJzX18oc2VsZikKb2JqZWN0Ll9faW52ZXJ0X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsCiAgICJhYnMoKSIgYW5kICJ+IikuCgpvYmplY3QuX19jb21wbGV4X18oc2VsZikKb2JqZWN0Ll9faW50X18oc2VsZikKb2JqZWN0Ll9fZmxvYXRfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiIGFuZAogICAiZmxvYXQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCgpvYmplY3QuX19pbmRleF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyIFB5dGhvbiBuZWVkcwogICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoCiAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAib2N0KCkiCiAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBudW1lcmljCiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLgoKICAgSWYgIl9faW50X18oKSIsICJfX2Zsb2F0X18oKSIgYW5kICJfX2NvbXBsZXhfXygpIiBhcmUgbm90IGRlZmluZWQKICAgdGhlbiBjb3JyZXNwb25kaW5nIGJ1aWx0LWluIGZ1bmN0aW9ucyAiaW50KCkiLCAiZmxvYXQoKSIgYW5kCiAgICJjb21wbGV4KCkiIGZhbGwgYmFjayB0byAiX19pbmRleF9fKCkiLgoKb2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbmRpZ2l0c10pCm9iamVjdC5fX3RydW5jX18oc2VsZikKb2JqZWN0Ll9fZmxvb3JfXyhzZWxmKQpvYmplY3QuX19jZWlsX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyb3VuZCgpIiBhbmQgIm1hdGgiCiAgIGZ1bmN0aW9ucyAidHJ1bmMoKSIsICJmbG9vcigpIiBhbmQgImNlaWwoKSIuIFVubGVzcyAqbmRpZ2l0cyogaXMKICAgcGFzc2VkIHRvICJfX3JvdW5kX18oKSIgYWxsIHRoZXNlIG1ldGhvZHMgc2hvdWxkIHJldHVybiB0aGUgdmFsdWUKICAgb2YgdGhlIG9iamVjdCB0cnVuY2F0ZWQgdG8gYW4gIkludGVncmFsIiAodHlwaWNhbGx5IGFuICJpbnQiKS4KCiAgIFRoZSBidWlsdC1pbiBmdW5jdGlvbiAiaW50KCkiIGZhbGxzIGJhY2sgdG8gIl9fdHJ1bmNfXygpIiBpZgogICBuZWl0aGVyICJfX2ludF9fKCkiIG5vciAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogVGhlIGRlbGVnYXRpb24gb2YgImludCgpIiB0byAiX190cnVuY19fKCkiCiAgIGlzIGRlcHJlY2F0ZWQuCtoHb2JqZWN0c3XzEQAAT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlcwoqKioqKioqKioqKioqKioqKioqKioqKioqCgoqT2JqZWN0cyogYXJlIFB5dGhvbuKAmXMgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhIFB5dGhvbgpwcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gb2JqZWN0cy4gKEluCmEgc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFubuKAmXMgbW9kZWwgb2YgYSDigJxzdG9yZWQKcHJvZ3JhbSBjb21wdXRlcuKAnSwgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKQoKRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN04oCZcwoqaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rIG9mIGl0CmFzIHRoZSBvYmplY3TigJlzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlICJpcyIgb3BlcmF0b3IgY29tcGFyZXMgdGhlCmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlcgpyZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5LgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgbWVtb3J5CmFkZHJlc3Mgd2hlcmUgIngiIGlzIHN0b3JlZC4KCkFuIG9iamVjdOKAmXMgdHlwZSBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCBzdXBwb3J0cwooZS5nLiwg4oCcZG9lcyBpdCBoYXZlIGEgbGVuZ3RoP+KAnSkgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzCmZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdOKAmXMKdHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gb2JqZWN04oCZcwoqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXQoKVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzIHdob3NlIHZhbHVlIGNhbgpjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzIHVuY2hhbmdlYWJsZQpvbmNlIHRoZXkgYXJlIGNyZWF0ZWQgYXJlIGNhbGxlZCAqaW1tdXRhYmxlKi4gKFRoZSB2YWx1ZSBvZiBhbgppbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZQpvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXLigJlzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXIgdGhlCmNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZgpvYmplY3RzIGl0IGNvbnRhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkLiAgU28sIGltbXV0YWJpbGl0eSBpcyBub3QKc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSBzdWJ0bGUuKQpBbiBvYmplY3TigJlzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLApudW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZApsaXN0cyBhcmUgbXV0YWJsZS4KCk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lCnVucmVhY2hhYmxlIHRoZXkgbWF5IGJlIGdhcmJhZ2UtY29sbGVjdGVkLiAgQW4gaW1wbGVtZW50YXRpb24gaXMKYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIOKAlCBpdCBpcyBhCm1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMKaW1wbGVtZW50ZWQsIGFzIGxvbmcgYXMgbm8gb2JqZWN0cyBhcmUgY29sbGVjdGVkIHRoYXQgYXJlIHN0aWxsCnJlYWNoYWJsZS4KCioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQ1B5dGhvbiBjdXJyZW50bHkgdXNlcyBhIHJlZmVyZW5jZS0KY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5IGxpbmtlZApnYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZQp1bnJlYWNoYWJsZSwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbGxlY3QgZ2FyYmFnZSBjb250YWluaW5nCmNpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICJnYyIgbW9kdWxlIGZvcgppbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXIKaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgZGVwZW5kCm9uIGltbWVkaWF0ZSBmaW5hbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIHRoZXkgYmVjb21lIHVucmVhY2hhYmxlIChzbwp5b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS4KCk5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbuKAmXMgdHJhY2luZyBvciBkZWJ1Z2dpbmcKZmFjaWxpdGllcyBtYXkga2VlcCBvYmplY3RzIGFsaXZlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgY29sbGVjdGFibGUuCkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgInRyeSLigKYiZXhjZXB0IiBzdGF0ZW1lbnQKbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS4KClNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8g4oCcZXh0ZXJuYWzigJ0gcmVzb3VyY2VzIHN1Y2ggYXMgb3BlbgpmaWxlcyBvciB3aW5kb3dzLiAgSXQgaXMgdW5kZXJzdG9vZCB0aGF0IHRoZXNlIHJlc291cmNlcyBhcmUgZnJlZWQKd2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzCm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG8KcmVsZWFzZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UsIHVzdWFsbHkgYSAiY2xvc2UoKSIgbWV0aG9kLiBQcm9ncmFtcwphcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZXhwbGljaXRseSBjbG9zZSBzdWNoIG9iamVjdHMuICBUaGUKInRyeSLigKYiZmluYWxseSIgc3RhdGVtZW50IGFuZCB0aGUgIndpdGgiIHN0YXRlbWVudCBwcm92aWRlIGNvbnZlbmllbnQKd2F5cyB0byBkbyB0aGlzLgoKU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkCipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmQKZGljdGlvbmFyaWVzLiAgVGhlIHJlZmVyZW5jZXMgYXJlIHBhcnQgb2YgYSBjb250YWluZXLigJlzIHZhbHVlLiAgSW4KbW9zdCBjYXNlcywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciwgd2UgaW1wbHkgdGhlCnZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgd2hlbiB3ZQp0YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZQppbW1lZGlhdGVseSBjb250YWluZWQgb2JqZWN0cyBhcmUgaW1wbGllZC4gIFNvLCBpZiBhbiBpbW11dGFibGUKY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0cwp2YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC4KClR5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGUKaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZQp0eXBlcywgb3BlcmF0aW9ucyB0aGF0IGNvbXB1dGUgbmV3IHZhbHVlcyBtYXkgYWN0dWFsbHkgcmV0dXJuIGEKcmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgd2hpbGUKZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgImEgPSAxOyBiID0gMSIsCiJhIiBhbmQgImIiIG1heSBvciBtYXkgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB3aXRoIHRoZSB2YWx1ZQpvbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCBhZnRlciAiYyA9IFtdOyBkID0gW10iLCAiYyIKYW5kICJkIiBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5CmNyZWF0ZWQgZW1wdHkgbGlzdHMuIChOb3RlIHRoYXQgImMgPSBkID0gW10iIGFzc2lnbnMgdGhlIHNhbWUgb2JqZWN0CnRvIGJvdGggImMiIGFuZCAiZCIuKQp6EG9wZXJhdG9yLXN1bW1hcnl1sxwAAE9wZXJhdG9yIHByZWNlZGVuY2UKKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIGluIFB5dGhvbiwgZnJvbQpoaWdoZXN0IHByZWNlZGVuY2UgKG1vc3QgYmluZGluZykgdG8gbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0CmJpbmRpbmcpLiAgT3BlcmF0b3JzIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuICBVbmxlc3MKdGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpbgp0aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiBhbmQKY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsIHdoaWNoIGdyb3VwIGZyb20gcmlnaHQgdG8gbGVmdCkuCgpOb3RlIHRoYXQgY29tcGFyaXNvbnMsIG1lbWJlcnNoaXAgdGVzdHMsIGFuZCBpZGVudGl0eSB0ZXN0cywgYWxsIGhhdmUKdGhlIHNhbWUgcHJlY2VkZW5jZSBhbmQgaGF2ZSBhIGxlZnQtdG8tcmlnaHQgY2hhaW5pbmcgZmVhdHVyZSBhcwpkZXNjcmliZWQgaW4gdGhlIENvbXBhcmlzb25zIHNlY3Rpb24uCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8ICIoZXhwcmVzc2lvbnMuLi4pIiwgICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6IHwgQmluZGluZyBvciBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24sICB8CnwgdmFsdWUuLi59IiwgIntleHByZXNzaW9ucy4uLn0iICAgICAgICAgICAgICAgICAgfCBsaXN0IGRpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0IHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInhbaW5kZXhdIiwgInhbaW5kZXg6aW5kZXhdIiwgICAgICAgICAgICAgICAgICAgfCBTdWJzY3JpcHRpb24sIHNsaWNpbmcsIGNhbGwsICAgICAgICAgIHwKfCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgImF3YWl0IHgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBd2FpdCBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICIqKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhwb25lbnRpYXRpb24gWzVdICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiK3giLCAiLXgiLCAifngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiICAgICAgICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGlvbiwgbWF0cml4ICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG11bHRpcGxpY2F0aW9uLCBkaXZpc2lvbiwgZmxvb3IgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGl2aXNpb24sIHJlbWFpbmRlciBbNl0gICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiKyIsICItIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIjw8IiwgIj4+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICImIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiXiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJpbiIsICJub3QgaW4iLCAiaXMiLCAiaXMgbm90IiwgIjwiLCAiPD0iLCAiPiIsIHwgQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgICB8CnwgIj49IiwgIiE9IiwgIj09IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJub3QgeCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgIm9yIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJpZiIg4oCTICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJsYW1iZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiOj0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFzc2lnbm1lbnQgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgotWyBGb290bm90ZXMgXS0KClsxXSBXaGlsZSAiYWJzKHgleSkgPCBhYnMoeSkiIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksIGZvciBmbG9hdHMgaXQKICAgIG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kCiAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuIElFRUUgNzU0IGRvdWJsZS0KICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgIi0xZS0xMDAgJSAxZTEwMCIgaGF2ZSB0aGUgc2FtZQogICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgMWUxMDAiLCB3aGljaAogICAgaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byAiMWUxMDAiLiAgVGhlIGZ1bmN0aW9uCiAgICAibWF0aC5mbW9kKCkiIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mIHRoZQogICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluIHRoaXMgY2FzZS4KICAgIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgYXBwbGljYXRpb24uCgpbMl0gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgeSwgaXTigJlzCiAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAiKHgteCV5KS8veSIgZHVlIHRvCiAgICByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LCBpbgogICAgb3JkZXIgdG8gcHJlc2VydmUgdGhhdCAiZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHkiIGJlIHZlcnkgY2xvc2UKICAgIHRvICJ4Ii4KClszXSBUaGUgVW5pY29kZSBzdGFuZGFyZCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gKmNvZGUgcG9pbnRzKiAoZS5nLgogICAgVSswMDQxKSBhbmQgKmFic3RyYWN0IGNoYXJhY3RlcnMqIChlLmcuIOKAnExBVElOIENBUElUQUwgTEVUVEVSIEHigJ0pLgogICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgcmVwcmVzZW50ZWQKICAgIHVzaW5nIG9uZSBjb2RlIHBvaW50LCB0aGVyZSBpcyBhIG51bWJlciBvZiBhYnN0cmFjdCBjaGFyYWN0ZXJzCiAgICB0aGF0IGNhbiBpbiBhZGRpdGlvbiBiZSByZXByZXNlbnRlZCB1c2luZyBhIHNlcXVlbmNlIG9mIG1vcmUgdGhhbgogICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciDigJxMQVRJTgogICAgQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEHigJ0gY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlCiAgICAqcHJlY29tcG9zZWQgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uIFUrMDBDNywgb3IgYXMgYSBzZXF1ZW5jZQogICAgb2YgYSAqYmFzZSBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMDQzIChMQVRJTiBDQVBJVEFMCiAgICBMRVRURVIgQyksIGZvbGxvd2VkIGJ5IGEgKmNvbWJpbmluZyBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24KICAgIFUrMDMyNyAoQ09NQklOSU5HIENFRElMTEEpLgoKICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlIGxldmVsIG9mCiAgICBVbmljb2RlIGNvZGUgcG9pbnRzLiBUaGlzIG1heSBiZSBjb3VudGVyLWludHVpdGl2ZSB0byBodW1hbnMuICBGb3IKICAgIGV4YW1wbGUsICIiXHUwMEM3IiA9PSAiXHUwMDQzXHUwMzI3IiIgaXMgIkZhbHNlIiwgZXZlbiB0aG91Z2ggYm90aAogICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyIOKAnExBVElOIENBUElUQUwKICAgIExFVFRFUiBDIFdJVEggQ0VESUxMQeKAnS4KCiAgICBUbyBjb21wYXJlIHN0cmluZ3MgYXQgdGhlIGxldmVsIG9mIGFic3RyYWN0IGNoYXJhY3RlcnMgKHRoYXQgaXMsCiAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICJ1bmljb2RlZGF0YS5ub3JtYWxpemUoKSIuCgpbNF0gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlLWNvbGxlY3Rpb24sIGZyZWUgbGlzdHMsIGFuZCB0aGUgZHluYW1pYwogICAgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbCBiZWhhdmlvdXIKICAgIGluIGNlcnRhaW4gdXNlcyBvZiB0aGUgImlzIiBvcGVyYXRvciwgbGlrZSB0aG9zZSBpbnZvbHZpbmcKICAgIGNvbXBhcmlzb25zIGJldHdlZW4gaW5zdGFuY2UgbWV0aG9kcywgb3IgY29uc3RhbnRzLiAgQ2hlY2sgdGhlaXIKICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby4KCls1XSBUaGUgcG93ZXIgb3BlcmF0b3IgIioqIiBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiBhcml0aG1ldGljIG9yCiAgICBiaXR3aXNlIHVuYXJ5IG9wZXJhdG9yIG9uIGl0cyByaWdodCwgdGhhdCBpcywgIjIqKi0xIiBpcyAiMC41Ii4KCls2XSBUaGUgIiUiIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lCiAgICBwcmVjZWRlbmNlIGFwcGxpZXMuCtoEcGFzc3V3AQAAVGhlICJwYXNzIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioKCiAgIHBhc3Nfc3RtdCA6Oj0gInBhc3MiCgoicGFzcyIgaXMgYSBudWxsIG9wZXJhdGlvbiDigJQgd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyBoYXBwZW5zLiBJdAppcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkIHN5bnRhY3RpY2FsbHksCmJ1dCBubyBjb2RlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBmb3IgZXhhbXBsZToKCiAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpCgogICBjbGFzcyBDOiBwYXNzICAgICAgICMgYSBjbGFzcyB3aXRoIG5vIG1ldGhvZHMgKHlldCkK2gVwb3dlcmHSBAAAVGhlIHBvd2VyIG9wZXJhdG9yCioqKioqKioqKioqKioqKioqKgoKVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMKbGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gIFRoZQpzeW50YXggaXM6CgogICBwb3dlciA6Oj0gKGF3YWl0X2V4cHIgfCBwcmltYXJ5KSBbIioqIiB1X2V4cHJdCgpUaHVzLCBpbiBhbiB1bnBhcmVudGhlc2l6ZWQgc2VxdWVuY2Ugb2YgcG93ZXIgYW5kIHVuYXJ5IG9wZXJhdG9ycywgdGhlCm9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW4KdGhlIGV2YWx1YXRpb24gb3JkZXIgZm9yIHRoZSBvcGVyYW5kcyk6ICItMSoqMiIgcmVzdWx0cyBpbiAiLTEiLgoKVGhlIHBvd2VyIG9wZXJhdG9yIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGJ1aWx0LWluICJwb3coKSIKZnVuY3Rpb24sIHdoZW4gY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogaXQgeWllbGRzIGl0cyBsZWZ0IGFyZ3VtZW50CnJhaXNlZCB0byB0aGUgcG93ZXIgb2YgaXRzIHJpZ2h0IGFyZ3VtZW50LiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZQpmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwgYW5kIHRoZSByZXN1bHQgaXMgb2YgdGhhdCB0eXBlLgoKRm9yIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgdW5sZXNzCnRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmUKY29udmVydGVkIHRvIGZsb2F0IGFuZCBhIGZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLAoiMTAqKjIiIHJldHVybnMgIjEwMCIsIGJ1dCAiMTAqKi0yIiByZXR1cm5zICIwLjAxIi4KClJhaXNpbmcgIjAuMCIgdG8gYSBuZWdhdGl2ZSBwb3dlciByZXN1bHRzIGluIGEgIlplcm9EaXZpc2lvbkVycm9yIi4KUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXIgcmVzdWx0cyBpbiBhICJjb21wbGV4IgpudW1iZXIuIChJbiBlYXJsaWVyIHZlcnNpb25zIGl0IHJhaXNlZCBhICJWYWx1ZUVycm9yIi4pCgpUaGlzIG9wZXJhdGlvbiBjYW4gYmUgY3VzdG9taXplZCB1c2luZyB0aGUgc3BlY2lhbCAiX19wb3dfXygpIiBtZXRob2QuCtoFcmFpc2V1eg8AAFRoZSAicmFpc2UiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqKioKCiAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyJmcm9tIiBleHByZXNzaW9uXV0KCklmIG5vIGV4cHJlc3Npb25zIGFyZSBwcmVzZW50LCAicmFpc2UiIHJlLXJhaXNlcyB0aGUgZXhjZXB0aW9uIHRoYXQgaXMKY3VycmVudGx5IGJlaW5nIGhhbmRsZWQsIHdoaWNoIGlzIGFsc28ga25vd24gYXMgdGhlICphY3RpdmUKZXhjZXB0aW9uKi4gSWYgdGhlcmUgaXNu4oCZdCBjdXJyZW50bHkgYW4gYWN0aXZlIGV4Y2VwdGlvbiwgYQoiUnVudGltZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGFuIGVycm9yLgoKT3RoZXJ3aXNlLCAicmFpc2UiIGV2YWx1YXRlcyB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhcyB0aGUgZXhjZXB0aW9uCm9iamVjdC4gIEl0IG11c3QgYmUgZWl0aGVyIGEgc3ViY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2YKIkJhc2VFeGNlcHRpb24iLiBJZiBpdCBpcyBhIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHdpbGwgYmUKb2J0YWluZWQgd2hlbiBuZWVkZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3Mgd2l0aCBubyBhcmd1bWVudHMuCgpUaGUgKnR5cGUqIG9mIHRoZSBleGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZeKAmXMgY2xhc3MsIHRoZQoqdmFsdWUqIGlzIHRoZSBpbnN0YW5jZSBpdHNlbGYuCgpBIHRyYWNlYmFjayBvYmplY3QgaXMgbm9ybWFsbHkgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZXhjZXB0aW9uCmlzIHJhaXNlZCBhbmQgYXR0YWNoZWQgdG8gaXQgYXMgdGhlICJfX3RyYWNlYmFja19fIiBhdHRyaWJ1dGUuIFlvdSBjYW4KY3JlYXRlIGFuIGV4Y2VwdGlvbiBhbmQgc2V0IHlvdXIgb3duIHRyYWNlYmFjayBpbiBvbmUgc3RlcCB1c2luZyB0aGUKIndpdGhfdHJhY2ViYWNrKCkiIGV4Y2VwdGlvbiBtZXRob2QgKHdoaWNoIHJldHVybnMgdGhlIHNhbWUgZXhjZXB0aW9uCmluc3RhbmNlLCB3aXRoIGl0cyB0cmFjZWJhY2sgc2V0IHRvIGl0cyBhcmd1bWVudCksIGxpa2Ugc286CgogICByYWlzZSBFeGNlcHRpb24oImZvbyBvY2N1cnJlZCIpLndpdGhfdHJhY2ViYWNrKHRyYWNlYmFja29iaikKClRoZSAiZnJvbSIgY2xhdXNlIGlzIHVzZWQgZm9yIGV4Y2VwdGlvbiBjaGFpbmluZzogaWYgZ2l2ZW4sIHRoZSBzZWNvbmQKKmV4cHJlc3Npb24qIG11c3QgYmUgYW5vdGhlciBleGNlcHRpb24gY2xhc3Mgb3IgaW5zdGFuY2UuIElmIHRoZQpzZWNvbmQgZXhwcmVzc2lvbiBpcyBhbiBleGNlcHRpb24gaW5zdGFuY2UsIGl0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlCnJhaXNlZCBleGNlcHRpb24gYXMgdGhlICJfX2NhdXNlX18iIGF0dHJpYnV0ZSAod2hpY2ggaXMgd3JpdGFibGUpLiBJZgp0aGUgZXhwcmVzc2lvbiBpcyBhbiBleGNlcHRpb24gY2xhc3MsIHRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZAphbmQgdGhlIHJlc3VsdGluZyBleGNlcHRpb24gaW5zdGFuY2Ugd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgcmFpc2VkCmV4Y2VwdGlvbiBhcyB0aGUgIl9fY2F1c2VfXyIgYXR0cmlidXRlLiBJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QKaGFuZGxlZCwgYm90aCBleGNlcHRpb25zIHdpbGwgYmUgcHJpbnRlZDoKCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcHJpbnQoMSAvIDApCiAgIC4uLiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIGV4YwogICAuLi4KICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+CiAgICAgICBwcmludCgxIC8gMCkKICAgICAgICAgICAgIH5+Xn5+CiAgIFplcm9EaXZpc2lvbkVycm9yOiBkaXZpc2lvbiBieSB6ZXJvCgogICBUaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOgoKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+CiAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIGV4YwogICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWQKCkEgc2ltaWxhciBtZWNoYW5pc20gd29ya3MgaW1wbGljaXRseSBpZiBhIG5ldyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4KYW4gZXhjZXB0aW9uIGlzIGFscmVhZHkgYmVpbmcgaGFuZGxlZC4gIEFuIGV4Y2VwdGlvbiBtYXkgYmUgaGFuZGxlZAp3aGVuIGFuICJleGNlcHQiIG9yICJmaW5hbGx5IiBjbGF1c2UsIG9yIGEgIndpdGgiIHN0YXRlbWVudCwgaXMgdXNlZC4KVGhlIHByZXZpb3VzIGV4Y2VwdGlvbiBpcyB0aGVuIGF0dGFjaGVkIGFzIHRoZSBuZXcgZXhjZXB0aW9u4oCZcwoiX19jb250ZXh0X18iIGF0dHJpYnV0ZToKCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcHJpbnQoMSAvIDApCiAgIC4uLiBleGNlcHQ6CiAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIikKICAgLi4uCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPgogICAgICAgcHJpbnQoMSAvIDApCiAgICAgICAgICAgICB+fl5+fgogICBaZXJvRGl2aXNpb25FcnJvcjogZGl2aXNpb24gYnkgemVybwoKICAgRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkOgoKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+CiAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKQogICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWQKCkV4Y2VwdGlvbiBjaGFpbmluZyBjYW4gYmUgZXhwbGljaXRseSBzdXBwcmVzc2VkIGJ5IHNwZWNpZnlpbmcgIk5vbmUiCmluIHRoZSAiZnJvbSIgY2xhdXNlOgoKICAgPj4+IHRyeToKICAgLi4uICAgICBwcmludCgxIC8gMCkKICAgLi4uIGV4Y2VwdDoKICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIE5vbmUKICAgLi4uCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPgogICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWQKCkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvbgpFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaGFuZGxpbmcgZXhjZXB0aW9ucyBpcyBpbiBzZWN0aW9uClRoZSB0cnkgc3RhdGVtZW50LgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogIk5vbmUiIGlzIG5vdyBwZXJtaXR0ZWQgYXMgIlkiIGluICJyYWlzZSBYCmZyb20gWSIuQWRkZWQgdGhlICJfX3N1cHByZXNzX2NvbnRleHRfXyIgYXR0cmlidXRlIHRvIHN1cHByZXNzCmF1dG9tYXRpYyBkaXNwbGF5IG9mIHRoZSBleGNlcHRpb24gY29udGV4dC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjExOiBJZiB0aGUgdHJhY2ViYWNrIG9mIHRoZSBhY3RpdmUgZXhjZXB0aW9uIGlzCm1vZGlmaWVkIGluIGFuICJleGNlcHQiIGNsYXVzZSwgYSBzdWJzZXF1ZW50ICJyYWlzZSIgc3RhdGVtZW50IHJlLQpyYWlzZXMgdGhlIGV4Y2VwdGlvbiB3aXRoIHRoZSBtb2RpZmllZCB0cmFjZWJhY2suIFByZXZpb3VzbHksIHRoZQpleGNlcHRpb24gd2FzIHJlLXJhaXNlZCB3aXRoIHRoZSB0cmFjZWJhY2sgaXQgaGFkIHdoZW4gaXQgd2FzIGNhdWdodC4K2gZyZXR1cm5hFwQAAFRoZSAicmV0dXJuIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqKgoKICAgcmV0dXJuX3N0bXQgOjo9ICJyZXR1cm4iIFtleHByZXNzaW9uX2xpc3RdCgoicmV0dXJuIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sCm5vdCB3aXRoaW4gYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbi4KCklmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgIk5vbmUiIGlzCnN1YnN0aXR1dGVkLgoKInJldHVybiIgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgZXhwcmVzc2lvbiBsaXN0IChvcgoiTm9uZSIpIGFzIHJldHVybiB2YWx1ZS4KCldoZW4gInJldHVybiIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAiZmluYWxseSIKY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nIHRoZQpmdW5jdGlvbi4KCkluIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgInJldHVybiIgc3RhdGVtZW50IGluZGljYXRlcyB0aGF0IHRoZQpnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSAiU3RvcEl0ZXJhdGlvbiIgdG8gYmUgcmFpc2VkLiBUaGUKcmV0dXJuZWQgdmFsdWUgKGlmIGFueSkgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCB0byBjb25zdHJ1Y3QKIlN0b3BJdGVyYXRpb24iIGFuZCBiZWNvbWVzIHRoZSAiU3RvcEl0ZXJhdGlvbi52YWx1ZSIgYXR0cmlidXRlLgoKSW4gYW4gYXN5bmNocm9ub3VzIGdlbmVyYXRvciBmdW5jdGlvbiwgYW4gZW1wdHkgInJldHVybiIgc3RhdGVtZW50CmluZGljYXRlcyB0aGF0IHRoZSBhc3luY2hyb25vdXMgZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UKIlN0b3BBc3luY0l0ZXJhdGlvbiIgdG8gYmUgcmFpc2VkLiAgQSBub24tZW1wdHkgInJldHVybiIgc3RhdGVtZW50IGlzCmEgc3ludGF4IGVycm9yIGluIGFuIGFzeW5jaHJvbm91cyBnZW5lcmF0b3IgZnVuY3Rpb24uCnoOc2VxdWVuY2UtdHlwZXN1gxoAAEVtdWxhdGluZyBjb250YWluZXIgdHlwZXMKKioqKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy4KQ29udGFpbmVycyB1c3VhbGx5IGFyZSAqc2VxdWVuY2VzKiAoc3VjaCBhcyAibGlzdHMiIG9yICJ0dXBsZXMiKSBvcgoqbWFwcGluZ3MqIChsaWtlICJkaWN0aW9uYXJpZXMiKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycwphcyB3ZWxsLiAgVGhlIGZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYQpzZXF1ZW5jZSBvciB0byBlbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYQpzZXF1ZW5jZSwgdGhlIGFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMAo8PSBrIDwgTiIgd2hlcmUgKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciAic2xpY2UiIG9iamVjdHMsCndoaWNoIGRlZmluZSBhIHJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzCnByb3ZpZGUgdGhlIG1ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwKImNsZWFyKCkiLCAic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQKInVwZGF0ZSgpIiBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob27igJlzIHN0YW5kYXJkCiJkaWN0aW9uYXJ5IiBvYmplY3RzLiAgVGhlICJjb2xsZWN0aW9ucy5hYmMiIG1vZHVsZSBwcm92aWRlcyBhCiJNdXRhYmxlTWFwcGluZyIgKmFic3RyYWN0IGJhc2UgY2xhc3MqIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMKZnJvbSBhIGJhc2Ugc2V0IG9mICJfX2dldGl0ZW1fXygpIiwgIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsCmFuZCAia2V5cygpIi4gTXV0YWJsZSBzZXF1ZW5jZXMgc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLAoiY291bnQoKSIsICJpbmRleCgpIiwgImV4dGVuZCgpIiwgImluc2VydCgpIiwgInBvcCgpIiwgInJlbW92ZSgpIiwKInJldmVyc2UoKSIgYW5kICJzb3J0KCkiLCBsaWtlIFB5dGhvbiBzdGFuZGFyZCAibGlzdCIgb2JqZWN0cy4KRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudCBhZGRpdGlvbiAobWVhbmluZwpjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlCm1ldGhvZHMgIl9fYWRkX18oKSIsICJfX3JhZGRfXygpIiwgIl9faWFkZF9fKCkiLCAiX19tdWxfXygpIiwKIl9fcm11bF9fKCkiIGFuZCAiX19pbXVsX18oKSIgZGVzY3JpYmVkIGJlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lCm90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kCnNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlICJfX2NvbnRhaW5zX18oKSIgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2UKb2YgdGhlICJpbiIgb3BlcmF0b3I7IGZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5n4oCZcwprZXlzOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzCmZ1cnRoZXIgcmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZQoiX19pdGVyX18oKSIgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGUKY29udGFpbmVyOyBmb3IgbWFwcGluZ3MsICJfX2l0ZXJfXygpIiBzaG91bGQgaXRlcmF0ZSB0aHJvdWdoIHRoZQpvYmplY3TigJlzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlIHZhbHVlcy4KCm9iamVjdC5fX2xlbl9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiLiAgU2hvdWxkIHJldHVybgogICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gb2JqZWN0IHRoYXQKICAgZG9lc27igJl0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICJfX2xlbl9fKCkiIG1ldGhvZAogICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC4KCiAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gQ1B5dGhvbiwgdGhlIGxlbmd0aCBpcwogICByZXF1aXJlZCB0byBiZSBhdCBtb3N0ICJzeXMubWF4c2l6ZSIuIElmIHRoZSBsZW5ndGggaXMgbGFyZ2VyIHRoYW4KICAgInN5cy5tYXhzaXplIiBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZQogICAiT3ZlcmZsb3dFcnJvciIuICBUbyBwcmV2ZW50IHJhaXNpbmcgIk92ZXJmbG93RXJyb3IiIGJ5IHRydXRoIHZhbHVlCiAgIHRlc3RpbmcsIGFuIG9iamVjdCBtdXN0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QuCgpvYmplY3QuX19sZW5ndGhfaGludF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkIHJldHVybiBhbgogICBlc3RpbWF0ZWQgbGVuZ3RoIGZvciB0aGUgb2JqZWN0ICh3aGljaCBtYXkgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4KICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuIFRoZQogICByZXR1cm4gdmFsdWUgbWF5IGFsc28gYmUgIk5vdEltcGxlbWVudGVkIiwgd2hpY2ggaXMgdHJlYXRlZCB0aGUKICAgc2FtZSBhcyBpZiB0aGUgIl9fbGVuZ3RoX2hpbnRfXyIgbWV0aG9kIGRpZG7igJl0IGV4aXN0IGF0IGFsbC4gVGhpcwogICBtZXRob2QgaXMgcHVyZWx5IGFuIG9wdGltaXphdGlvbiBhbmQgaXMgbmV2ZXIgcmVxdWlyZWQgZm9yCiAgIGNvcnJlY3RuZXNzLgoKICAgTmV3IGluIHZlcnNpb24gMy40LgoKTm90ZToKCiAgU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLiAgQQogIGNhbGwgbGlrZQoKICAgICBhWzE6Ml0gPSBiCgogIGlzIHRyYW5zbGF0ZWQgdG8KCiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiCgogIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuCgpvYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgKnNlcXVlbmNlKgogICB0eXBlcywgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzLiBPcHRpb25hbGx5LCB0aGV5IG1heQogICBzdXBwb3J0ICJzbGljZSIgb2JqZWN0cyBhcyB3ZWxsLiAgTmVnYXRpdmUgaW5kZXggc3VwcG9ydCBpcyBhbHNvCiAgIG9wdGlvbmFsLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZQogICByYWlzZWQ7IGlmICprZXkqIGlzIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZQogICBzZXF1ZW5jZSAoYWZ0ZXIgYW55IHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgdmFsdWVzKSwKICAgIkluZGV4RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuIEZvciAqbWFwcGluZyogdHlwZXMsIGlmICprZXkqIGlzCiAgIG1pc3NpbmcgKG5vdCBpbiB0aGUgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLgoKICAgTm90ZToKCiAgICAgImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvcgogICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlCiAgICAgc2VxdWVuY2UuCgogICBOb3RlOgoKICAgICBXaGVuIHN1YnNjcmlwdGluZyBhICpjbGFzcyosIHRoZSBzcGVjaWFsIGNsYXNzIG1ldGhvZAogICAgICJfX2NsYXNzX2dldGl0ZW1fXygpIiBtYXkgYmUgY2FsbGVkIGluc3RlYWQgb2YgIl9fZ2V0aXRlbV9fKCkiLgogICAgIFNlZSBfX2NsYXNzX2dldGl0ZW1fXyB2ZXJzdXMgX19nZXRpdGVtX18gZm9yIG1vcmUgZGV0YWlscy4KCm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvcgogICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZgogICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXMKICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZQogICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvcgogICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvcgogICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZgogICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cwogICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlCiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgYnkgImRpY3QiLiJfX2dldGl0ZW1fXygpIiB0byBpbXBsZW1lbnQgInNlbGZba2V5XSIgZm9yIGRpY3QKICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuCgpvYmplY3QuX19pdGVyX18oc2VsZikKCiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuICppdGVyYXRvciogaXMgcmVxdWlyZWQgZm9yIGEKICAgY29udGFpbmVyLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbgogICBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0CiAgIHNob3VsZCBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci4KCm9iamVjdC5fX3JldmVyc2VkX18oc2VsZikKCiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnQKICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0CiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci4KCiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSIKICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICgiX19sZW5fXygpIgogICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbAogICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhbgogICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieQogICAicmV2ZXJzZWQoKSIuCgpUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSBub3JtYWxseQppbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIGNvbnRhaW5lci4gSG93ZXZlciwgY29udGFpbmVyCm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudAppbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgaXRlcmFibGUuCgpvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWUKICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpcwogICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvcgogICB0aGUga2V5LWl0ZW0gcGFpcnMuCgogICBGb3Igb2JqZWN0cyB0aGF0IGRvbuKAmXQgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3QKICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZQogICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlIHRoaXMgc2VjdGlvbiBpbiB0aGUKICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLgraCHNoaWZ0aW5nYTUCAABTaGlmdGluZyBvcGVyYXRpb25zCioqKioqKioqKioqKioqKioqKioKClRoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpYwpvcGVyYXRpb25zOgoKICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoIjw8IiB8ICI+PiIpIGFfZXhwcgoKVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBpbnRlZ2VycyBhcyBhcmd1bWVudHMuICBUaGV5IHNoaWZ0IHRoZSBmaXJzdAphcmd1bWVudCB0byB0aGUgbGVmdCBvciByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gYnkgdGhlCnNlY29uZCBhcmd1bWVudC4KClRoaXMgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBzcGVjaWFsICJfX2xzaGlmdF9fKCkiIGFuZAoiX19yc2hpZnRfXygpIiBtZXRob2RzLgoKQSByaWdodCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIGZsb29yIGRpdmlzaW9uIGJ5ICJwb3coMixuKSIuCkEgbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggInBvdygyLG4pIi4K2ghzbGljaW5nc2GNBgAAU2xpY2luZ3MKKioqKioqKioKCkEgc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sIGEKc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFNsaWNpbmdzIG1heSBiZSB1c2VkIGFzIGV4cHJlc3Npb25zIG9yIGFzCnRhcmdldHMgaW4gYXNzaWdubWVudCBvciAiZGVsIiBzdGF0ZW1lbnRzLiAgVGhlIHN5bnRheCBmb3IgYSBzbGljaW5nOgoKICAgc2xpY2luZyAgICAgIDo6PSBwcmltYXJ5ICJbIiBzbGljZV9saXN0ICJdIgogICBzbGljZV9saXN0ICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl0KICAgc2xpY2VfaXRlbSAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlCiAgIHByb3Blcl9zbGljZSA6Oj0gW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXSBbICI6IiBbc3RyaWRlXSBdCiAgIGxvd2VyX2JvdW5kICA6Oj0gZXhwcmVzc2lvbgogICB1cHBlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb24KICAgc3RyaWRlICAgICAgIDo6PSBleHByZXNzaW9uCgpUaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlCmFuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgc3Vic2NyaXB0aW9uCmNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGUKc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlCmludGVycHJldGF0aW9uIGFzIGEgc3Vic2NyaXB0aW9uIHRha2VzIHByaW9yaXR5IG92ZXIgdGhlCmludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdApjb250YWlucyBubyBwcm9wZXIgc2xpY2UpLgoKVGhlIHNlbWFudGljcyBmb3IgYSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgaXMgaW5kZXhlZAoodXNpbmcgdGhlIHNhbWUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZCBhcyBub3JtYWwgc3Vic2NyaXB0aW9uKSB3aXRoIGEKa2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSBzbGljZQpsaXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCmNvbnZlcnNpb24gb2YgdGhlIHNsaWNlIGl0ZW1zOyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBsb25lCnNsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzIGFuCmV4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXIgc2xpY2UgaXMgYQpzbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSkgd2hvc2UgInN0YXJ0IiwKInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgZ2l2ZW4KYXMgbG93ZXIgYm91bmQsIHVwcGVyIGJvdW5kIGFuZCBzdHJpZGUsIHJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nCiJOb25lIiBmb3IgbWlzc2luZyBleHByZXNzaW9ucy4K2gxzcGVjaWFsYXR0cnN1dgUAAFNwZWNpYWwgQXR0cmlidXRlcwoqKioqKioqKioqKioqKioqKioKClRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gc2V2ZXJhbApvYmplY3QgdHlwZXMsIHdoZXJlIHRoZXkgYXJlIHJlbGV2YW50LiAgU29tZSBvZiB0aGVzZSBhcmUgbm90IHJlcG9ydGVkCmJ5IHRoZSAiZGlyKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLgoKb2JqZWN0Ll9fZGljdF9fCgogICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3TigJlzCiAgICh3cml0YWJsZSkgYXR0cmlidXRlcy4KCmluc3RhbmNlLl9fY2xhc3NfXwoKICAgVGhlIGNsYXNzIHRvIHdoaWNoIGEgY2xhc3MgaW5zdGFuY2UgYmVsb25ncy4KCmNsYXNzLl9fYmFzZXNfXwoKICAgVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC4KCmRlZmluaXRpb24uX19uYW1lX18KCiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IgZ2VuZXJhdG9yCiAgIGluc3RhbmNlLgoKZGVmaW5pdGlvbi5fX3F1YWxuYW1lX18KCiAgIFRoZSAqcXVhbGlmaWVkIG5hbWUqIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IKICAgZ2VuZXJhdG9yIGluc3RhbmNlLgoKICAgTmV3IGluIHZlcnNpb24gMy4zLgoKY2xhc3MuX19tcm9fXwoKICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlbgogICBsb29raW5nIGZvciBiYXNlIGNsYXNzZXMgZHVyaW5nIG1ldGhvZCByZXNvbHV0aW9uLgoKY2xhc3MubXJvKCkKCiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSB0aGUKICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3MKICAgaW5zdGFudGlhdGlvbiwgYW5kIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluICJfX21yb19fIi4KCmNsYXNzLl9fc3ViY2xhc3Nlc19fKCkKCiAgIEVhY2ggY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW1tZWRpYXRlCiAgIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgcmVmZXJlbmNlcwogICBzdGlsbCBhbGl2ZS4gIFRoZSBsaXN0IGlzIGluIGRlZmluaXRpb24gb3JkZXIuICBFeGFtcGxlOgoKICAgICAgPj4+IGludC5fX3N1YmNsYXNzZXNfXygpCiAgICAgIFs8Y2xhc3MgJ2Jvb2wnPiwgPGVudW0gJ0ludEVudW0nPiwgPGZsYWcgJ0ludEZsYWcnPiwgPGNsYXNzICdyZS5fY29uc3RhbnRzLl9OYW1lZEludENvbnN0YW50Jz5dCtoMc3BlY2lhbG5hbWVzdS/2AABTcGVjaWFsIG1ldGhvZCBuYW1lcwoqKioqKioqKioqKioqKioqKioqKgoKQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IHNwZWNpYWwKc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kIHNsaWNpbmcpIGJ5CmRlZmluaW5nIG1ldGhvZHMgd2l0aCBzcGVjaWFsIG5hbWVzLiBUaGlzIGlzIFB5dGhvbuKAmXMgYXBwcm9hY2ggdG8KKm9wZXJhdG9yIG92ZXJsb2FkaW5nKiwgYWxsb3dpbmcgY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9yCndpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgY2xhc3MgZGVmaW5lcwphIG1ldGhvZCBuYW1lZCAiX19nZXRpdGVtX18oKSIsIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywKdGhlbiAieFtpXSIgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvICJ0eXBlKHgpLl9fZ2V0aXRlbV9fKHgsIGkpIi4KRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb24gcmFpc2UgYW4KZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseQoiQXR0cmlidXRlRXJyb3IiIG9yICJUeXBlRXJyb3IiKS4KClNldHRpbmcgYSBzcGVjaWFsIG1ldGhvZCB0byAiTm9uZSIgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcKb3BlcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwgaWYgYSBjbGFzcyBzZXRzICJfX2l0ZXJfXygpIgp0byAiTm9uZSIsIHRoZSBjbGFzcyBpcyBub3QgaXRlcmFibGUsIHNvIGNhbGxpbmcgIml0ZXIoKSIgb24gaXRzCmluc3RhbmNlcyB3aWxsIHJhaXNlIGEgIlR5cGVFcnJvciIgKHdpdGhvdXQgZmFsbGluZyBiYWNrIHRvCiJfX2dldGl0ZW1fXygpIikuIFsyXQoKV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpcwppbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0Cm1ha2VzIHNlbnNlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1vZGVsbGVkLiAgRm9yIGV4YW1wbGUsIHNvbWUKc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0CmV4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUKIk5vZGVMaXN0IiBpbnRlcmZhY2UgaW4gdGhlIFczQ+KAmXMgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLikKCgpCYXNpYyBjdXN0b21pemF0aW9uCj09PT09PT09PT09PT09PT09PT0KCm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pCgogICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgIl9fbmV3X18oKSIgaXMgYQogICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpCiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzCiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGUKICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuCiAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseSBhbgogICBpbnN0YW5jZSBvZiAqY2xzKikuCgogICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5CiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNz4oCZcyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmcKICAgInN1cGVyKCkuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCBhcHByb3ByaWF0ZSBhcmd1bWVudHMgYW5kIHRoZW4KICAgbW9kaWZ5aW5nIHRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIGFzIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nCiAgIGl0LgoKICAgSWYgIl9fbmV3X18oKSIgaXMgaW52b2tlZCBkdXJpbmcgb2JqZWN0IGNvbnN0cnVjdGlvbiBhbmQgaXQgcmV0dXJucwogICBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3IGluc3RhbmNl4oCZcyAiX19pbml0X18oKSIgbWV0aG9kCiAgIHdpbGwgYmUgaW52b2tlZCBsaWtlICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlCiAgIG5ldyBpbnN0YW5jZSBhbmQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUKICAgcGFzc2VkIHRvIHRoZSBvYmplY3QgY29uc3RydWN0b3IuCgogICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ldwogICBpbnN0YW5jZeKAmXMgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLgoKICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlCiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXQKICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0bwogICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uCgpvYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pCgogICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICJfX25ld19fKCkiKSwgYnV0CiAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2UKICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhbgogICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc+KAmXMgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWYKICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZQogICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZToKICAgInN1cGVyKCkuX19pbml0X18oW2FyZ3MuLi5dKSIuCgogICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiBjb25zdHJ1Y3RpbmcKICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvIGN1c3RvbWl6ZQogICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc28KICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLgoKb2JqZWN0Ll9fZGVsX18oc2VsZikKCiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc28KICAgY2FsbGVkIGEgZmluYWxpemVyIG9yIChpbXByb3Blcmx5KSBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MKICAgaGFzIGEgIl9fZGVsX18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc+KAmXMgIl9fZGVsX18oKSIgbWV0aG9kLAogICBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlCiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuCgogICBJdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciB0aGUgIl9fZGVsX18oKSIgbWV0aG9kCiAgIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieSBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UKICAgdG8gaXQuICBUaGlzIGlzIGNhbGxlZCBvYmplY3QgKnJlc3VycmVjdGlvbiouICBJdCBpcwogICBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgd2hldGhlciAiX19kZWxfXygpIiBpcyBjYWxsZWQgYSBzZWNvbmQKICAgdGltZSB3aGVuIGEgcmVzdXJyZWN0ZWQgb2JqZWN0IGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZDsgdGhlCiAgIGN1cnJlbnQgKkNQeXRob24qIGltcGxlbWVudGF0aW9uIG9ubHkgY2FsbHMgaXQgb25jZS4KCiAgIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvcgogICBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuCgogICBOb3RlOgoKICAgICAiZGVsIHgiIGRvZXNu4oCZdCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIg4oCUIHRoZSBmb3JtZXIKICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzCiAgICAgb25seSBjYWxsZWQgd2hlbiAieCLigJlzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uCgogICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEl0IGlzIHBvc3NpYmxlIGZvciBhIHJlZmVyZW5jZQogICBjeWNsZSB0byBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGZyb20gZ29pbmcgdG8KICAgemVyby4gIEluIHRoaXMgY2FzZSwgdGhlIGN5Y2xlIHdpbGwgYmUgbGF0ZXIgZGV0ZWN0ZWQgYW5kIGRlbGV0ZWQKICAgYnkgdGhlICpjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IqLiAgQSBjb21tb24gY2F1c2Ugb2YgcmVmZXJlbmNlCiAgIGN5Y2xlcyBpcyB3aGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBjYXVnaHQgaW4gYSBsb2NhbCB2YXJpYWJsZS4KICAgVGhlIGZyYW1l4oCZcyBsb2NhbHMgdGhlbiByZWZlcmVuY2UgdGhlIGV4Y2VwdGlvbiwgd2hpY2ggcmVmZXJlbmNlcwogICBpdHMgb3duIHRyYWNlYmFjaywgd2hpY2ggcmVmZXJlbmNlcyB0aGUgbG9jYWxzIG9mIGFsbCBmcmFtZXMgY2F1Z2h0CiAgIGluIHRoZSB0cmFjZWJhY2suCgogICBTZWUgYWxzbzogRG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlLgoKICAgV2FybmluZzoKCiAgICAgRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggIl9fZGVsX18oKSIKICAgICBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIHRoZWlyIGV4ZWN1dGlvbgogICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gInN5cy5zdGRlcnIiIGluc3RlYWQuCiAgICAgSW4gcGFydGljdWxhcjoKCiAgICAgKiAiX19kZWxfXygpIiBjYW4gYmUgaW52b2tlZCB3aGVuIGFyYml0cmFyeSBjb2RlIGlzIGJlaW5nCiAgICAgICBleGVjdXRlZCwgaW5jbHVkaW5nIGZyb20gYW55IGFyYml0cmFyeSB0aHJlYWQuICBJZiAiX19kZWxfXygpIgogICAgICAgbmVlZHMgdG8gdGFrZSBhIGxvY2sgb3IgaW52b2tlIGFueSBvdGhlciBibG9ja2luZyByZXNvdXJjZSwgaXQKICAgICAgIG1heSBkZWFkbG9jayBhcyB0aGUgcmVzb3VyY2UgbWF5IGFscmVhZHkgYmUgdGFrZW4gYnkgdGhlIGNvZGUKICAgICAgIHRoYXQgZ2V0cyBpbnRlcnJ1cHRlZCB0byBleGVjdXRlICJfX2RlbF9fKCkiLgoKICAgICAqICJfX2RlbF9fKCkiIGNhbiBiZSBleGVjdXRlZCBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24uICBBcyBhCiAgICAgICBjb25zZXF1ZW5jZSwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaXQgbmVlZHMgdG8gYWNjZXNzIChpbmNsdWRpbmcKICAgICAgIG90aGVyIG1vZHVsZXMpIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIHNldCB0byAiTm9uZSIuCiAgICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZQogICAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscwogICAgICAgYXJlIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzCiAgICAgICBtYXkgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZQogICAgICAgYXQgdGhlIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC4KCm9iamVjdC5fX3JlcHJfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSDigJxvZmZpY2lhbOKAnQogICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzCiAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG8KICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlCiAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybQogICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgcmV0dXJuCiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dAogICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuIOKAnGluZm9ybWFs4oCdCiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC4KCiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlCiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLgoKb2JqZWN0Ll9fc3RyX18oc2VsZikKCiAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJmb3JtYXQoKSIgYW5kCiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSDigJxpbmZvcm1hbOKAnSBvciBuaWNlbHkgcHJpbnRhYmxlIHN0cmluZwogICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcKICAgb2JqZWN0LgoKICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCB0aGVyZSBpcyBubwogICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhCiAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLgoKICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IgogICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLgoKb2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKQoKICAgQ2FsbGVkIGJ5IGJ5dGVzIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbgogICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LgoKb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpCgogICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBieSBleHRlbnNpb24sCiAgIGV2YWx1YXRpb24gb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlICJzdHIuZm9ybWF0KCkiCiAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhIOKAnGZvcm1hdHRlZOKAnSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4KICAgb2JqZWN0LiBUaGUgKmZvcm1hdF9zcGVjKiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEKICAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24KICAgb2YgdGhlICpmb3JtYXRfc3BlYyogYXJndW1lbnQgaXMgdXAgdG8gdGhlIHR5cGUgaW1wbGVtZW50aW5nCiAgICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsIGVpdGhlciBkZWxlZ2F0ZQogICBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhIHNpbWlsYXIKICAgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LgoKICAgU2VlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCiAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LgoKICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGYKICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogIm9iamVjdC5fX2Zvcm1hdF9fKHgsICcnKSIgaXMgbm93CiAgIGVxdWl2YWxlbnQgdG8gInN0cih4KSIgcmF0aGVyIHRoYW4gImZvcm1hdChzdHIoeCksICcnKSIuCgpvYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQg4oCccmljaCBjb21wYXJpc29u4oCdIG1ldGhvZHMuIFRoZQogICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhcwogICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIiwKICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAieD55IiBjYWxscwogICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuCgogICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICJOb3RJbXBsZW1lbnRlZCIKICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciBvZgogICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGEKICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYW55IHZhbHVlLAogICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLAogICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIgogICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciBmYWxzZS4KCiAgIEJ5IGRlZmF1bHQsICJvYmplY3QiIGltcGxlbWVudHMgIl9fZXFfXygpIiBieSB1c2luZyAiaXMiLCByZXR1cm5pbmcKICAgIk5vdEltcGxlbWVudGVkIiBpbiB0aGUgY2FzZSBvZiBhIGZhbHNlIGNvbXBhcmlzb246ICJUcnVlIGlmIHggaXMgeQogICBlbHNlIE5vdEltcGxlbWVudGVkIi4gRm9yICJfX25lX18oKSIsIGJ5IGRlZmF1bHQgaXQgZGVsZWdhdGVzIHRvCiAgICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4KICAgVGhlcmUgYXJlIG5vIG90aGVyIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbgogICBvcGVyYXRvcnMgb3IgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnM7IGZvciBleGFtcGxlLCB0aGUgdHJ1dGggb2YKICAgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZQogICBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCBvcGVyYXRpb24sIHNlZQogICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLgoKICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvbgogICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvbgogICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KCiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWQKICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodAogICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSBlYWNoIG90aGVy4oCZcwogICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVy4oCZcyByZWZsZWN0aW9uLAogICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uIElmIHRoZQogICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmTigJlzIHR5cGUgaXMgYQogICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZOKAmXMgdHlwZSwgdGhlCiAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCBvdGhlcndpc2UgdGhlCiAgIGxlZnQgb3BlcmFuZOKAmXMgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgaXMgbm90CiAgIGNvbnNpZGVyZWQuCgogICBXaGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCByZXR1cm5zIGFueSB2YWx1ZSBvdGhlciB0aGFuCiAgICJOb3RJbXBsZW1lbnRlZCIsIHRoZSAiPT0iIGFuZCAiIT0iIG9wZXJhdG9ycyB3aWxsIGZhbGwgYmFjayB0bwogICAiaXMiIGFuZCAiaXMgbm90IiwgcmVzcGVjdGl2ZWx5LgoKb2JqZWN0Ll9faGFzaF9fKHNlbGYpCgogICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnMKICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAiZGljdCIuCiAgIFRoZSAiX19oYXNoX18oKSIgbWV0aG9kIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gVGhlIG9ubHkgcmVxdWlyZWQKICAgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoCiAgIHZhbHVlOyBpdCBpcyBhZHZpc2VkIHRvIG1peCB0b2dldGhlciB0aGUgaGFzaCB2YWx1ZXMgb2YgdGhlCiAgIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZgogICBvYmplY3RzIGJ5IHBhY2tpbmcgdGhlbSBpbnRvIGEgdHVwbGUgYW5kIGhhc2hpbmcgdGhlIHR1cGxlLgogICBFeGFtcGxlOgoKICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYubmFtZSwgc2VsZi5uaWNrLCBzZWxmLmNvbG9yKSkKCiAgIE5vdGU6CgogICAgICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBvYmplY3TigJlzIGN1c3RvbQogICAgICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAiUHlfc3NpemVfdCIuICBUaGlzIGlzCiAgICAgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXQgYnVpbGRzLgogICAgIElmIGFuIG9iamVjdOKAmXMgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzIG9mCiAgICAgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gYWxsIHN1cHBvcnRlZAogICAgIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAicHl0aG9uIC1jICJpbXBvcnQgc3lzOwogICAgIHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuCgogICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgbm90CiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSIKICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluCiAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQKICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQKICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgKmhhc2hhYmxlKiBjb2xsZWN0aW9ucwogICByZXF1aXJlcyB0aGF0IGEga2V54oCZcyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdOKAmXMgaGFzaAogICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuCgogICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5CiAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aAogICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoCiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLgoKICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiCiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlCiAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MKICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0bwogICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzCiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosCiAgIGNvbGxlY3Rpb25zLmFiYy5IYXNoYWJsZSkiLgoKICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGUKICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlcgogICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID0KICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuCgogICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gc3VwcHJlc3MKICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3MKICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXQKICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGFzCiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuYWJjLkhhc2hhYmxlKSIgY2FsbC4KCiAgIE5vdGU6CgogICAgIEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciBhbmQgYnl0ZXMgb2JqZWN0cyBhcmUKICAgICDigJxzYWx0ZWTigJ0gd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS4gIEFsdGhvdWdoIHRoZXkKICAgICByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uIHByb2Nlc3MsIHRoZXkgYXJlIG5vdAogICAgIHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2YgUHl0aG9uLlRoaXMgaXMKICAgICBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1vZi1zZXJ2aWNlIGNhdXNlZAogICAgIGJ5IGNhcmVmdWxseSBjaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGUgd29yc3QgY2FzZQogICAgIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sICpPKigqbipeMikgY29tcGxleGl0eS4gIFNlZQogICAgIGh0dHA6Ly9vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvcgogICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mIHNldHMuCiAgICAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXMgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0CiAgICAgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmQgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28KICAgICAiUFlUSE9OSEFTSFNFRUQiLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KCm9iamVjdC5fX2Jvb2xfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uCiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QKICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpcwogICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzCiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlCiAgIGNvbnNpZGVyZWQgdHJ1ZS4KCgpDdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2YKYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAieC5uYW1lIikgZm9yCmNsYXNzIGluc3RhbmNlcy4KCm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGRlZmF1bHQgYXR0cmlidXRlIGFjY2VzcyBmYWlscyB3aXRoIGFuCiAgICJBdHRyaWJ1dGVFcnJvciIgKGVpdGhlciAiX19nZXRhdHRyaWJ1dGVfXygpIiByYWlzZXMgYW4KICAgIkF0dHJpYnV0ZUVycm9yIiBiZWNhdXNlICpuYW1lKiBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG9yIGFuCiAgIGF0dHJpYnV0ZSBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiOyBvciAiX19nZXRfXygpIiBvZiBhICpuYW1lKgogICBwcm9wZXJ0eSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIikuICBUaGlzIG1ldGhvZCBzaG91bGQgZWl0aGVyCiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIgogICBleGNlcHRpb24uCgogICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLAogICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeQogICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyBkb25lIGJvdGggZm9yCiAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmUKICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGUgdGhhdCBhdAogICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieSBub3QKICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IChidXQKICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlCiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsCiAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLgoKb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKCiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3IKICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAiX19nZXRhdHRyX18oKSIsCiAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAiX19nZXRhdHRyaWJ1dGVfXygpIiBlaXRoZXIKICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gVGhpcyBtZXRob2QKICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4KICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbgogICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcwogICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yCiAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuCgogICBOb3RlOgoKICAgICBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kcwogICAgIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgbGFuZ3VhZ2Ugc3ludGF4IG9yCiAgICAgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgU3BlY2lhbCBtZXRob2QgbG9va3VwLgoKICAgRm9yIGNlcnRhaW4gc2Vuc2l0aXZlIGF0dHJpYnV0ZSBhY2Nlc3NlcywgcmFpc2VzIGFuIGF1ZGl0aW5nIGV2ZW50CiAgICJvYmplY3QuX19nZXRhdHRyX18iIHdpdGggYXJndW1lbnRzICJvYmoiIGFuZCAibmFtZSIuCgpvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpCgogICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZAogICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUKICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICp2YWx1ZSogaXMgdGhlCiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LgoKICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0CiAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLAogICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuCgogICBGb3IgY2VydGFpbiBzZW5zaXRpdmUgYXR0cmlidXRlIGFzc2lnbm1lbnRzLCByYWlzZXMgYW4gYXVkaXRpbmcKICAgZXZlbnQgIm9iamVjdC5fX3NldGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIsICJuYW1lIiwgInZhbHVlIi4KCm9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKQoKICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZgogICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsIG9iai5uYW1lIiBpcwogICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LgoKICAgRm9yIGNlcnRhaW4gc2Vuc2l0aXZlIGF0dHJpYnV0ZSBkZWxldGlvbnMsIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudAogICAib2JqZWN0Ll9fZGVsYXR0cl9fIiB3aXRoIGFyZ3VtZW50cyAib2JqIiBhbmQgIm5hbWUiLgoKb2JqZWN0Ll9fZGlyX18oc2VsZikKCiAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEFuIGl0ZXJhYmxlIG11c3QgYmUKICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIGl0ZXJhYmxlIHRvIGEgbGlzdCBhbmQKICAgc29ydHMgaXQuCgoKQ3VzdG9taXppbmcgbW9kdWxlIGF0dHJpYnV0ZSBhY2Nlc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClNwZWNpYWwgbmFtZXMgIl9fZ2V0YXR0cl9fIiBhbmQgIl9fZGlyX18iIGNhbiBiZSBhbHNvIHVzZWQgdG8KY3VzdG9taXplIGFjY2VzcyB0byBtb2R1bGUgYXR0cmlidXRlcy4gVGhlICJfX2dldGF0dHJfXyIgZnVuY3Rpb24gYXQKdGhlIG1vZHVsZSBsZXZlbCBzaG91bGQgYWNjZXB0IG9uZSBhcmd1bWVudCB3aGljaCBpcyB0aGUgbmFtZSBvZiBhbgphdHRyaWJ1dGUgYW5kIHJldHVybiB0aGUgY29tcHV0ZWQgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIi4KSWYgYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCBvbiBhIG1vZHVsZSBvYmplY3QgdGhyb3VnaCB0aGUgbm9ybWFsCmxvb2t1cCwgaS5lLiAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKSIsIHRoZW4gIl9fZ2V0YXR0cl9fIiBpcwpzZWFyY2hlZCBpbiB0aGUgbW9kdWxlICJfX2RpY3RfXyIgYmVmb3JlIHJhaXNpbmcgYW4gIkF0dHJpYnV0ZUVycm9yIi4KSWYgZm91bmQsIGl0IGlzIGNhbGxlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdGhlIHJlc3VsdCBpcwpyZXR1cm5lZC4KClRoZSAiX19kaXJfXyIgZnVuY3Rpb24gc2hvdWxkIGFjY2VwdCBubyBhcmd1bWVudHMsIGFuZCByZXR1cm4gYW4KaXRlcmFibGUgb2Ygc3RyaW5ncyB0aGF0IHJlcHJlc2VudHMgdGhlIG5hbWVzIGFjY2Vzc2libGUgb24gbW9kdWxlLiBJZgpwcmVzZW50LCB0aGlzIGZ1bmN0aW9uIG92ZXJyaWRlcyB0aGUgc3RhbmRhcmQgImRpcigpIiBzZWFyY2ggb24gYQptb2R1bGUuCgpGb3IgYSBtb3JlIGZpbmUgZ3JhaW5lZCBjdXN0b21pemF0aW9uIG9mIHRoZSBtb2R1bGUgYmVoYXZpb3IgKHNldHRpbmcKYXR0cmlidXRlcywgcHJvcGVydGllcywgZXRjLiksIG9uZSBjYW4gc2V0IHRoZSAiX19jbGFzc19fIiBhdHRyaWJ1dGUKb2YgYSBtb2R1bGUgb2JqZWN0IHRvIGEgc3ViY2xhc3Mgb2YgInR5cGVzLk1vZHVsZVR5cGUiLiBGb3IgZXhhbXBsZToKCiAgIGltcG9ydCBzeXMKICAgZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQoKICAgY2xhc3MgVmVyYm9zZU1vZHVsZShNb2R1bGVUeXBlKToKICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgICByZXR1cm4gZidWZXJib3NlIHtzZWxmLl9fbmFtZV9ffScKCiAgICAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsdWUpOgogICAgICAgICAgIHByaW50KGYnU2V0dGluZyB7YXR0cn0uLi4nKQogICAgICAgICAgIHN1cGVyKCkuX19zZXRhdHRyX18oYXR0ciwgdmFsdWUpCgogICBzeXMubW9kdWxlc1tfX25hbWVfX10uX19jbGFzc19fID0gVmVyYm9zZU1vZHVsZQoKTm90ZToKCiAgRGVmaW5pbmcgbW9kdWxlICJfX2dldGF0dHJfXyIgYW5kIHNldHRpbmcgbW9kdWxlICJfX2NsYXNzX18iIG9ubHkKICBhZmZlY3QgbG9va3VwcyBtYWRlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgYWNjZXNzIHN5bnRheCDigJMgZGlyZWN0bHkKICBhY2Nlc3NpbmcgdGhlIG1vZHVsZSBnbG9iYWxzICh3aGV0aGVyIGJ5IGNvZGUgd2l0aGluIHRoZSBtb2R1bGUsIG9yCiAgdmlhIGEgcmVmZXJlbmNlIHRvIHRoZSBtb2R1bGXigJlzIGdsb2JhbHMgZGljdGlvbmFyeSkgaXMgdW5hZmZlY3RlZC4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjU6ICJfX2NsYXNzX18iIG1vZHVsZSBhdHRyaWJ1dGUgaXMgbm93IHdyaXRhYmxlLgoKTmV3IGluIHZlcnNpb24gMy43OiAiX19nZXRhdHRyX18iIGFuZCAiX19kaXJfXyIgbW9kdWxlIGF0dHJpYnV0ZXMuCgpTZWUgYWxzbzoKCiAgKipQRVAgNTYyKiogLSBNb2R1bGUgX19nZXRhdHRyX18gYW5kIF9fZGlyX18KICAgICBEZXNjcmliZXMgdGhlICJfX2dldGF0dHJfXyIgYW5kICJfX2Rpcl9fIiBmdW5jdGlvbnMgb24gbW9kdWxlcy4KCgpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcwpjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhbgoqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXLigJlzIGNsYXNzCmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGUKZXhhbXBsZXMgYmVsb3csIOKAnHRoZSBhdHRyaWJ1dGXigJ0gcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcwp0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3PigJkgIl9fZGljdF9fIi4KCm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcj1Ob25lKQoKICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlCiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlCiAgIGFjY2VzcykuIFRoZSBvcHRpb25hbCAqb3duZXIqIGFyZ3VtZW50IGlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUKICAgKmluc3RhbmNlKiBpcyB0aGUgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLAogICBvciAiTm9uZSIgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouCgogICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBjb21wdXRlZCBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4KICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uCgogICAqKlBFUCAyNTIqKiBzcGVjaWZpZXMgdGhhdCAiX19nZXRfXygpIiBpcyBjYWxsYWJsZSB3aXRoIG9uZSBvciB0d28KICAgYXJndW1lbnRzLiAgUHl0aG9u4oCZcyBvd24gYnVpbHQtaW4gZGVzY3JpcHRvcnMgc3VwcG9ydCB0aGlzCiAgIHNwZWNpZmljYXRpb247IGhvd2V2ZXIsIGl0IGlzIGxpa2VseSB0aGF0IHNvbWUgdGhpcmQtcGFydHkgdG9vbHMKICAgaGF2ZSBkZXNjcmlwdG9ycyB0aGF0IHJlcXVpcmUgYm90aCBhcmd1bWVudHMuICBQeXRob27igJlzIG93bgogICAiX19nZXRhdHRyaWJ1dGVfXygpIiBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcGFzc2VzIGluIGJvdGggYXJndW1lbnRzCiAgIHdoZXRoZXIgdGhleSBhcmUgcmVxdWlyZWQgb3Igbm90LgoKb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKQoKICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyCiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLgoKICAgTm90ZSwgYWRkaW5nICJfX3NldF9fKCkiIG9yICJfX2RlbGV0ZV9fKCkiIGNoYW5nZXMgdGhlIGtpbmQgb2YKICAgZGVzY3JpcHRvciB0byBhIOKAnGRhdGEgZGVzY3JpcHRvcuKAnS4gIFNlZSBJbnZva2luZyBEZXNjcmlwdG9ycyBmb3IKICAgbW9yZSBkZXRhaWxzLgoKb2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpCgogICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUKICAgb3duZXIgY2xhc3MuCgpJbnN0YW5jZXMgb2YgZGVzY3JpcHRvcnMgbWF5IGFsc28gaGF2ZSB0aGUgIl9fb2JqY2xhc3NfXyIgYXR0cmlidXRlCnByZXNlbnQ6CgpvYmplY3QuX19vYmpjbGFzc19fCgogICBUaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgbW9kdWxlCiAgIGFzIHNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXMKICAgYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljIGNsYXNzCiAgIGF0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSBvZiB0aGUKICAgZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgdGhlIGZpcnN0CiAgIHBvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyBhdHRyaWJ1dGUgZm9yCiAgIHVuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS4KCgpJbnZva2luZyBEZXNjcmlwdG9ycwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCDigJxiaW5kaW5nCmJlaGF2aW9y4oCdLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHMKaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsIGFuZAoiX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwgaXQKaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuCgpUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlCnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3TigJlzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgImEueCIgaGFzIGEKbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bJ3gnXSIsIHRoZW4KInR5cGUoYSkuX19kaWN0X19bJ3gnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZgoidHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLgoKSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZQpkZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQKaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlCnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZApob3cgdGhleSB3ZXJlIGNhbGxlZC4KClRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgImEueCIuIEhvdwp0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6CgpEaXJlY3QgQ2FsbAogICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5CiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuCgpJbnN0YW5jZSBCaW5kaW5nCiAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZQogICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1sneCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLgoKQ2xhc3MgQmluZGluZwogICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGNhbGw6CiAgICJBLl9fZGljdF9fWyd4J10uX19nZXRfXyhOb25lLCBBKSIuCgpTdXBlciBCaW5kaW5nCiAgIEEgZG90dGVkIGxvb2t1cCBzdWNoIGFzICJzdXBlcihBLCBhKS54IiBzZWFyY2hlcwogICAiYS5fX2NsYXNzX18uX19tcm9fXyIgZm9yIGEgYmFzZSBjbGFzcyAiQiIgZm9sbG93aW5nICJBIiBhbmQgdGhlbgogICByZXR1cm5zICJCLl9fZGljdF9fWyd4J10uX19nZXRfXyhhLCBBKSIuICBJZiBub3QgYSBkZXNjcmlwdG9yLCAieCIKICAgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgoKRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kcwpvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZSBhbnkKY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAiX19kZWxldGVfXygpIi4gIElmIGl0CmRvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsIHJldHVybgp0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSBvYmplY3TigJlzCmluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICJfX3NldF9fKCkiIGFuZC9vcgoiX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgbmVpdGhlciwgaXQgaXMKYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lIGJvdGgKIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlCiJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIKKGFuZC9vciAiX19kZWxldGVfXygpIikgZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4KaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUKb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuCgpQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIHRob3NlIGRlY29yYXRlZCB3aXRoICJAc3RhdGljbWV0aG9kIiBhbmQKIkBjbGFzc21ldGhvZCIpIGFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LAppbnN0YW5jZXMgY2FuIHJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbAppbnN0YW5jZXMgdG8gYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlCnNhbWUgY2xhc3MuCgpUaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLgpBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS4KCgpfX3Nsb3RzX18KLS0tLS0tLS0tCgoqX19zbG90c19fKiBhbGxvdyB1cyB0byBleHBsaWNpdGx5IGRlY2xhcmUgZGF0YSBtZW1iZXJzIChsaWtlCnByb3BlcnRpZXMpIGFuZCBkZW55IHRoZSBjcmVhdGlvbiBvZiAiX19kaWN0X18iIGFuZCAqX193ZWFrcmVmX18qCih1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZCBpbiAqX19zbG90c19fKiBvciBhdmFpbGFibGUgaW4gYSBwYXJlbnQuKQoKVGhlIHNwYWNlIHNhdmVkIG92ZXIgdXNpbmcgIl9fZGljdF9fIiBjYW4gYmUgc2lnbmlmaWNhbnQuIEF0dHJpYnV0ZQpsb29rdXAgc3BlZWQgY2FuIGJlIHNpZ25pZmljYW50bHkgaW1wcm92ZWQgYXMgd2VsbC4KCm9iamVjdC5fX3Nsb3RzX18KCiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2UKICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgKl9fc2xvdHNfXyoKICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZQogICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgIl9fZGljdF9fIiBhbmQgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaAogICBpbnN0YW5jZS4KCk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qOgoKKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAiX19kaWN0X18iIGFuZAogICpfX3dlYWtyZWZfXyogYXR0cmlidXRlIG9mIHRoZSBpbnN0YW5jZXMgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZS4KCiogV2l0aG91dCBhICJfX2RpY3RfXyIgdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3CiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0bwogIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAiQXR0cmlidXRlRXJyb3IiLiBJZgogIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkCiAgIidfX2RpY3RfXyciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKgogIGRlY2xhcmF0aW9uLgoKKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3NlcyBkZWZpbmluZwogICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0ICJ3ZWFrIHJlZmVyZW5jZXMiIHRvIGl0cyBpbnN0YW5jZXMuIElmCiAgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkICInX193ZWFrcmVmX18nIiB0byB0aGUKICBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbi4KCiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZwogIGRlc2NyaXB0b3JzIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBcyBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcwogIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQKICBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUKICBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuCgoqIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBub3QgbGltaXRlZCB0byB0aGUgY2xhc3MKICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgKl9fc2xvdHNfXyogZGVjbGFyZWQgaW4gcGFyZW50cyBhcmUgYXZhaWxhYmxlCiAgaW4gY2hpbGQgY2xhc3Nlcy4gSG93ZXZlciwgY2hpbGQgc3ViY2xhc3NlcyB3aWxsIGdldCBhICJfX2RpY3RfXyIKICBhbmQgKl9fd2Vha3JlZl9fKiB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggc2hvdWxkCiAgb25seSBjb250YWluIG5hbWVzIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLgoKKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZQogIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGUgKGV4Y2VwdCBieQogIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXMKICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGEKICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLgoKKiAiVHlwZUVycm9yIiB3aWxsIGJlIHJhaXNlZCBpZiBub25lbXB0eSAqX19zbG90c19fKiBhcmUgZGVmaW5lZCBmb3IgYQogIGNsYXNzIGRlcml2ZWQgZnJvbSBhICIidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlIiBzdWNoIGFzCiAgImludCIsICJieXRlcyIsIGFuZCAidHVwbGUiLgoKKiBBbnkgbm9uLXN0cmluZyAqaXRlcmFibGUqIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4KCiogSWYgYSAiZGljdGlvbmFyeSIgaXMgdXNlZCB0byBhc3NpZ24gKl9fc2xvdHNfXyosIHRoZSBkaWN0aW9uYXJ5IGtleXMKICB3aWxsIGJlIHVzZWQgYXMgdGhlIHNsb3QgbmFtZXMuIFRoZSB2YWx1ZXMgb2YgdGhlIGRpY3Rpb25hcnkgY2FuIGJlCiAgdXNlZCB0byBwcm92aWRlIHBlci1hdHRyaWJ1dGUgZG9jc3RyaW5ncyB0aGF0IHdpbGwgYmUgcmVjb2duaXNlZCBieQogICJpbnNwZWN0LmdldGRvYygpIiBhbmQgZGlzcGxheWVkIGluIHRoZSBvdXRwdXQgb2YgImhlbHAoKSIuCgoqICJfX2NsYXNzX18iIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZQogICpfX3Nsb3RzX18qLgoKKiBNdWx0aXBsZSBpbmhlcml0YW5jZSB3aXRoIG11bHRpcGxlIHNsb3R0ZWQgcGFyZW50IGNsYXNzZXMgY2FuIGJlCiAgdXNlZCwgYnV0IG9ubHkgb25lIHBhcmVudCBpcyBhbGxvd2VkIHRvIGhhdmUgYXR0cmlidXRlcyBjcmVhdGVkIGJ5CiAgc2xvdHMgKHRoZSBvdGhlciBiYXNlcyBtdXN0IGhhdmUgZW1wdHkgc2xvdCBsYXlvdXRzKSAtIHZpb2xhdGlvbnMKICByYWlzZSAiVHlwZUVycm9yIi4KCiogSWYgYW4gKml0ZXJhdG9yKiBpcyB1c2VkIGZvciAqX19zbG90c19fKiB0aGVuIGEgKmRlc2NyaXB0b3IqIGlzCiAgY3JlYXRlZCBmb3IgZWFjaCBvZiB0aGUgaXRlcmF0b3LigJlzIHZhbHVlcy4gSG93ZXZlciwgdGhlICpfX3Nsb3RzX18qCiAgYXR0cmlidXRlIHdpbGwgYmUgYW4gZW1wdHkgaXRlcmF0b3IuCgoKQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24KPT09PT09PT09PT09PT09PT09PT09PT09PT0KCldoZW5ldmVyIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzLCAiX19pbml0X3N1YmNsYXNzX18oKSIgaXMKY2FsbGVkIG9uIHRoZSBwYXJlbnQgY2xhc3MuIFRoaXMgd2F5LCBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBjbGFzc2VzCndoaWNoIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2Ygc3ViY2xhc3Nlcy4gVGhpcyBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8KY2xhc3MgZGVjb3JhdG9ycywgYnV0IHdoZXJlIGNsYXNzIGRlY29yYXRvcnMgb25seSBhZmZlY3QgdGhlIHNwZWNpZmljCmNsYXNzIHRoZXnigJlyZSBhcHBsaWVkIHRvLCAiX19pbml0X3N1YmNsYXNzX18iIHNvbGVseSBhcHBsaWVzIHRvIGZ1dHVyZQpzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgbWV0aG9kLgoKY2xhc3NtZXRob2Qgb2JqZWN0Ll9faW5pdF9zdWJjbGFzc19fKGNscykKCiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGFpbmluZyBjbGFzcyBpcyBzdWJjbGFzc2VkLgogICAqY2xzKiBpcyB0aGVuIHRoZSBuZXcgc3ViY2xhc3MuIElmIGRlZmluZWQgYXMgYSBub3JtYWwgaW5zdGFuY2UKICAgbWV0aG9kLCB0aGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNvbnZlcnRlZCB0byBhIGNsYXNzIG1ldGhvZC4KCiAgIEtleXdvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBnaXZlbiB0byBhIG5ldyBjbGFzcyBhcmUgcGFzc2VkIHRvIHRoZQogICBwYXJlbnQgY2xhc3PigJlzICJfX2luaXRfc3ViY2xhc3NfXyIuIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKICAgY2xhc3NlcyB1c2luZyAiX19pbml0X3N1YmNsYXNzX18iLCBvbmUgc2hvdWxkIHRha2Ugb3V0IHRoZSBuZWVkZWQKICAga2V5d29yZCBhcmd1bWVudHMgYW5kIHBhc3MgdGhlIG90aGVycyBvdmVyIHRvIHRoZSBiYXNlIGNsYXNzLCBhcwogICBpbjoKCiAgICAgIGNsYXNzIFBoaWxvc29waGVyOgogICAgICAgICAgZGVmIF9faW5pdF9zdWJjbGFzc19fKGNscywgLywgZGVmYXVsdF9uYW1lLCAqKmt3YXJncyk6CiAgICAgICAgICAgICAgc3VwZXIoKS5fX2luaXRfc3ViY2xhc3NfXygqKmt3YXJncykKICAgICAgICAgICAgICBjbHMuZGVmYXVsdF9uYW1lID0gZGVmYXVsdF9uYW1lCgogICAgICBjbGFzcyBBdXN0cmFsaWFuUGhpbG9zb3BoZXIoUGhpbG9zb3BoZXIsIGRlZmF1bHRfbmFtZT0iQnJ1Y2UiKToKICAgICAgICAgIHBhc3MKCiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICJvYmplY3QuX19pbml0X3N1YmNsYXNzX18iIGRvZXMgbm90aGluZywKICAgYnV0IHJhaXNlcyBhbiBlcnJvciBpZiBpdCBpcyBjYWxsZWQgd2l0aCBhbnkgYXJndW1lbnRzLgoKICAgTm90ZToKCiAgICAgVGhlIG1ldGFjbGFzcyBoaW50ICJtZXRhY2xhc3MiIGlzIGNvbnN1bWVkIGJ5IHRoZSByZXN0IG9mIHRoZQogICAgIHR5cGUgbWFjaGluZXJ5LCBhbmQgaXMgbmV2ZXIgcGFzc2VkIHRvICJfX2luaXRfc3ViY2xhc3NfXyIKICAgICBpbXBsZW1lbnRhdGlvbnMuIFRoZSBhY3R1YWwgbWV0YWNsYXNzIChyYXRoZXIgdGhhbiB0aGUgZXhwbGljaXQKICAgICBoaW50KSBjYW4gYmUgYWNjZXNzZWQgYXMgInR5cGUoY2xzKSIuCgogICBOZXcgaW4gdmVyc2lvbiAzLjYuCgpXaGVuIGEgY2xhc3MgaXMgY3JlYXRlZCwgInR5cGUuX19uZXdfXygpIiBzY2FucyB0aGUgY2xhc3MgdmFyaWFibGVzCmFuZCBtYWtlcyBjYWxsYmFja3MgdG8gdGhvc2Ugd2l0aCBhICJfX3NldF9uYW1lX18oKSIgaG9vay4KCm9iamVjdC5fX3NldF9uYW1lX18oc2VsZiwgb3duZXIsIG5hbWUpCgogICBBdXRvbWF0aWNhbGx5IGNhbGxlZCBhdCB0aGUgdGltZSB0aGUgb3duaW5nIGNsYXNzICpvd25lciogaXMKICAgY3JlYXRlZC4gVGhlIG9iamVjdCBoYXMgYmVlbiBhc3NpZ25lZCB0byAqbmFtZSogaW4gdGhhdCBjbGFzczoKCiAgICAgIGNsYXNzIEE6CiAgICAgICAgICB4ID0gQygpICAjIEF1dG9tYXRpY2FsbHkgY2FsbHM6IHguX19zZXRfbmFtZV9fKEEsICd4JykKCiAgIElmIHRoZSBjbGFzcyB2YXJpYWJsZSBpcyBhc3NpZ25lZCBhZnRlciB0aGUgY2xhc3MgaXMgY3JlYXRlZCwKICAgIl9fc2V0X25hbWVfXygpIiB3aWxsIG5vdCBiZSBjYWxsZWQgYXV0b21hdGljYWxseS4gSWYgbmVlZGVkLAogICAiX19zZXRfbmFtZV9fKCkiIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHk6CgogICAgICBjbGFzcyBBOgogICAgICAgICBwYXNzCgogICAgICBjID0gQygpCiAgICAgIEEueCA9IGMgICAgICAgICAgICAgICAgICAjIFRoZSBob29rIGlzIG5vdCBjYWxsZWQKICAgICAgYy5fX3NldF9uYW1lX18oQSwgJ3gnKSAgICMgTWFudWFsbHkgaW52b2tlIHRoZSBob29rCgogICBTZWUgQ3JlYXRpbmcgdGhlIGNsYXNzIG9iamVjdCBmb3IgbW9yZSBkZXRhaWxzLgoKICAgTmV3IGluIHZlcnNpb24gMy42LgoKCk1ldGFjbGFzc2VzCi0tLS0tLS0tLS0tCgpCeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlIGNsYXNzIGJvZHkgaXMKZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZQpyZXN1bHQgb2YgInR5cGUobmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkiLgoKVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWl6ZWQgYnkgcGFzc2luZyB0aGUKIm1ldGFjbGFzcyIga2V5d29yZCBhcmd1bWVudCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBsaW5lLCBvciBieQppbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuIGFyZ3VtZW50LiBJbgp0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlIGluc3RhbmNlcwpvZiAiTWV0YSI6CgogICBjbGFzcyBNZXRhKHR5cGUpOgogICAgICAgcGFzcwoKICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6CiAgICAgICBwYXNzCgogICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOgogICAgICAgcGFzcwoKQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbgphcmUgcGFzc2VkIHRocm91Z2ggdG8gYWxsIG1ldGFjbGFzcyBvcGVyYXRpb25zIGRlc2NyaWJlZCBiZWxvdy4KCldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzIG9jY3VyOgoKKiBNUk8gZW50cmllcyBhcmUgcmVzb2x2ZWQ7CgoqIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZDsKCiogdGhlIGNsYXNzIG5hbWVzcGFjZSBpcyBwcmVwYXJlZDsKCiogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQ7CgoqIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZC4KCgpSZXNvbHZpbmcgTVJPIGVudHJpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvYmplY3QuX19tcm9fZW50cmllc19fKHNlbGYsIGJhc2VzKQoKICAgSWYgYSBiYXNlIHRoYXQgYXBwZWFycyBpbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mCiAgICJ0eXBlIiwgdGhlbiBhbiAiX19tcm9fZW50cmllc19fKCkiIG1ldGhvZCBpcyBzZWFyY2hlZCBvbiB0aGUgYmFzZS4KICAgSWYgYW4gIl9fbXJvX2VudHJpZXNfXygpIiBtZXRob2QgaXMgZm91bmQsIHRoZSBiYXNlIGlzIHN1YnN0aXR1dGVkCiAgIHdpdGggdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gIl9fbXJvX2VudHJpZXNfXygpIiB3aGVuIGNyZWF0aW5nIHRoZQogICBjbGFzcy4gVGhlIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUgb3JpZ2luYWwgYmFzZXMgdHVwbGUgcGFzc2VkIHRvCiAgIHRoZSAqYmFzZXMqIHBhcmFtZXRlciwgYW5kIG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IHdpbGwKICAgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBiYXNlLiBUaGUgcmV0dXJuZWQgdHVwbGUgbWF5IGJlIGVtcHR5OiBpbgogICB0aGVzZSBjYXNlcywgdGhlIG9yaWdpbmFsIGJhc2UgaXMgaWdub3JlZC4KClNlZSBhbHNvOgoKICAidHlwZXMucmVzb2x2ZV9iYXNlcygpIgogICAgIER5bmFtaWNhbGx5IHJlc29sdmUgYmFzZXMgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiAidHlwZSIuCgogICoqUEVQIDU2MCoqCiAgICAgQ29yZSBzdXBwb3J0IGZvciB0eXBpbmcgbW9kdWxlIGFuZCBnZW5lcmljIHR5cGVzLgoKCkRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBmb3IgYSBjbGFzcyBkZWZpbml0aW9uIGlzIGRldGVybWluZWQgYXMKZm9sbG93czoKCiogaWYgbm8gYmFzZXMgYW5kIG5vIGV4cGxpY2l0IG1ldGFjbGFzcyBhcmUgZ2l2ZW4sIHRoZW4gInR5cGUoKSIgaXMKICB1c2VkOwoKKiBpZiBhbiBleHBsaWNpdCBtZXRhY2xhc3MgaXMgZ2l2ZW4gYW5kIGl0IGlzICpub3QqIGFuIGluc3RhbmNlIG9mCiAgInR5cGUoKSIsIHRoZW4gaXQgaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgbWV0YWNsYXNzOwoKKiBpZiBhbiBpbnN0YW5jZSBvZiAidHlwZSgpIiBpcyBnaXZlbiBhcyB0aGUgZXhwbGljaXQgbWV0YWNsYXNzLCBvcgogIGJhc2VzIGFyZSBkZWZpbmVkLCB0aGVuIHRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHVzZWQuCgpUaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBzZWxlY3RlZCBmcm9tIHRoZSBleHBsaWNpdGx5IHNwZWNpZmllZAptZXRhY2xhc3MgKGlmIGFueSkgYW5kIHRoZSBtZXRhY2xhc3NlcyAoaS5lLiAidHlwZShjbHMpIikgb2YgYWxsCnNwZWNpZmllZCBiYXNlIGNsYXNzZXMuIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIG9uZSB3aGljaCBpcyBhCnN1YnR5cGUgb2YgKmFsbCogb2YgdGhlc2UgY2FuZGlkYXRlIG1ldGFjbGFzc2VzLiBJZiBub25lIG9mIHRoZQpjYW5kaWRhdGUgbWV0YWNsYXNzZXMgbWVldHMgdGhhdCBjcml0ZXJpb24sIHRoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24Kd2lsbCBmYWlsIHdpdGggIlR5cGVFcnJvciIuCgoKUHJlcGFyaW5nIHRoZSBjbGFzcyBuYW1lc3BhY2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk9uY2UgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBoYXMgYmVlbiBpZGVudGlmaWVkLCB0aGVuIHRoZSBjbGFzcwpuYW1lc3BhY2UgaXMgcHJlcGFyZWQuIElmIHRoZSBtZXRhY2xhc3MgaGFzIGEgIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsCml0IGlzIGNhbGxlZCBhcyAibmFtZXNwYWNlID0gbWV0YWNsYXNzLl9fcHJlcGFyZV9fKG5hbWUsIGJhc2VzLAoqKmt3ZHMpIiAod2hlcmUgdGhlIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgY29tZSBmcm9tCnRoZSBjbGFzcyBkZWZpbml0aW9uKS4gVGhlICJfX3ByZXBhcmVfXyIgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZAphcyBhICJjbGFzc21ldGhvZCIuIFRoZSBuYW1lc3BhY2UgcmV0dXJuZWQgYnkgIl9fcHJlcGFyZV9fIiBpcyBwYXNzZWQKaW4gdG8gIl9fbmV3X18iLCBidXQgd2hlbiB0aGUgZmluYWwgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQgdGhlCm5hbWVzcGFjZSBpcyBjb3BpZWQgaW50byBhIG5ldyAiZGljdCIuCgpJZiB0aGUgbWV0YWNsYXNzIGhhcyBubyAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSwgdGhlbiB0aGUgY2xhc3MKbmFtZXNwYWNlIGlzIGluaXRpYWxpc2VkIGFzIGFuIGVtcHR5IG9yZGVyZWQgbWFwcGluZy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMAogICAgIEludHJvZHVjZWQgdGhlICJfX3ByZXBhcmVfXyIgbmFtZXNwYWNlIGhvb2sKCgpFeGVjdXRpbmcgdGhlIGNsYXNzIGJvZHkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZCAoYXBwcm94aW1hdGVseSkgYXMgImV4ZWMoYm9keSwgZ2xvYmFscygpLApuYW1lc3BhY2UpIi4gVGhlIGtleSBkaWZmZXJlbmNlIGZyb20gYSBub3JtYWwgY2FsbCB0byAiZXhlYygpIiBpcyB0aGF0CmxleGljYWwgc2NvcGluZyBhbGxvd3MgdGhlIGNsYXNzIGJvZHkgKGluY2x1ZGluZyBhbnkgbWV0aG9kcykgdG8KcmVmZXJlbmNlIG5hbWVzIGZyb20gdGhlIGN1cnJlbnQgYW5kIG91dGVyIHNjb3BlcyB3aGVuIHRoZSBjbGFzcwpkZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgYSBmdW5jdGlvbi4KCkhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIHRoZSBmdW5jdGlvbiwKbWV0aG9kcyBkZWZpbmVkIGluc2lkZSB0aGUgY2xhc3Mgc3RpbGwgY2Fubm90IHNlZSBuYW1lcyBkZWZpbmVkIGF0IHRoZQpjbGFzcyBzY29wZS4gQ2xhc3MgdmFyaWFibGVzIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgZmlyc3QKcGFyYW1ldGVyIG9mIGluc3RhbmNlIG9yIGNsYXNzIG1ldGhvZHMsIG9yIHRocm91Z2ggdGhlIGltcGxpY2l0CmxleGljYWxseSBzY29wZWQgIl9fY2xhc3NfXyIgcmVmZXJlbmNlIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgoKCkNyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3QKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKT25jZSB0aGUgY2xhc3MgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBleGVjdXRpbmcgdGhlIGNsYXNzCmJvZHksIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCBieSBjYWxsaW5nICJtZXRhY2xhc3MobmFtZSwgYmFzZXMsCm5hbWVzcGFjZSwgKiprd2RzKSIgKHRoZSBhZGRpdGlvbmFsIGtleXdvcmRzIHBhc3NlZCBoZXJlIGFyZSB0aGUgc2FtZQphcyB0aG9zZSBwYXNzZWQgdG8gIl9fcHJlcGFyZV9fIikuCgpUaGlzIGNsYXNzIG9iamVjdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSB6ZXJvLQphcmd1bWVudCBmb3JtIG9mICJzdXBlcigpIi4gIl9fY2xhc3NfXyIgaXMgYW4gaW1wbGljaXQgY2xvc3VyZQpyZWZlcmVuY2UgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaWYgYW55IG1ldGhvZHMgaW4gYSBjbGFzcyBib2R5IHJlZmVyCnRvIGVpdGhlciAiX19jbGFzc19fIiBvciAic3VwZXIiLiBUaGlzIGFsbG93cyB0aGUgemVybyBhcmd1bWVudCBmb3JtCm9mICJzdXBlcigpIiB0byBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgYmFzZWQgb24KbGV4aWNhbCBzY29waW5nLCB3aGlsZSB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UgdGhhdCB3YXMgdXNlZCB0byBtYWtlIHRoZQpjdXJyZW50IGNhbGwgaXMgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoZQptZXRob2QuCgoqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIENQeXRob24gMy42IGFuZCBsYXRlciwgdGhlCiJfX2NsYXNzX18iIGNlbGwgaXMgcGFzc2VkIHRvIHRoZSBtZXRhY2xhc3MgYXMgYSAiX19jbGFzc2NlbGxfXyIgZW50cnkKaW4gdGhlIGNsYXNzIG5hbWVzcGFjZS4gSWYgcHJlc2VudCwgdGhpcyBtdXN0IGJlIHByb3BhZ2F0ZWQgdXAgdG8gdGhlCiJ0eXBlLl9fbmV3X18iIGNhbGwgaW4gb3JkZXIgZm9yIHRoZSBjbGFzcyB0byBiZSBpbml0aWFsaXNlZApjb3JyZWN0bHkuIEZhaWxpbmcgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYSAiUnVudGltZUVycm9yIiBpbiBQeXRob24KMy44LgoKV2hlbiB1c2luZyB0aGUgZGVmYXVsdCBtZXRhY2xhc3MgInR5cGUiLCBvciBhbnkgbWV0YWNsYXNzIHRoYXQKdWx0aW1hdGVseSBjYWxscyAidHlwZS5fX25ld19fIiwgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCmN1c3RvbWl6YXRpb24gc3RlcHMgYXJlIGludm9rZWQgYWZ0ZXIgY3JlYXRpbmcgdGhlIGNsYXNzIG9iamVjdDoKCjEuIFRoZSAidHlwZS5fX25ld19fIiBtZXRob2QgY29sbGVjdHMgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGluIHRoZQogICBjbGFzcyBuYW1lc3BhY2UgdGhhdCBkZWZpbmUgYSAiX19zZXRfbmFtZV9fKCkiIG1ldGhvZDsKCjIuIFRob3NlICJfX3NldF9uYW1lX18iIG1ldGhvZHMgYXJlIGNhbGxlZCB3aXRoIHRoZSBjbGFzcyBiZWluZwogICBkZWZpbmVkIGFuZCB0aGUgYXNzaWduZWQgbmFtZSBvZiB0aGF0IHBhcnRpY3VsYXIgYXR0cmlidXRlOwoKMy4gVGhlICJfX2luaXRfc3ViY2xhc3NfXygpIiBob29rIGlzIGNhbGxlZCBvbiB0aGUgaW1tZWRpYXRlIHBhcmVudCBvZgogICB0aGUgbmV3IGNsYXNzIGluIGl0cyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlci4KCkFmdGVyIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSBjbGFzcwpkZWNvcmF0b3JzIGluY2x1ZGVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIChpZiBhbnkpIGFuZCB0aGUgcmVzdWx0aW5nCm9iamVjdCBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIHRoZSBkZWZpbmVkIGNsYXNzLgoKV2hlbiBhIG5ldyBjbGFzcyBpcyBjcmVhdGVkIGJ5ICJ0eXBlLl9fbmV3X18iLCB0aGUgb2JqZWN0IHByb3ZpZGVkIGFzCnRoZSBuYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIG5ldyBvcmRlcmVkIG1hcHBpbmcgYW5kIHRoZQpvcmlnaW5hbCBvYmplY3QgaXMgZGlzY2FyZGVkLiBUaGUgbmV3IGNvcHkgaXMgd3JhcHBlZCBpbiBhIHJlYWQtb25seQpwcm94eSwgd2hpY2ggYmVjb21lcyB0aGUgIl9fZGljdF9fIiBhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzIG9iamVjdC4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTM1KiogLSBOZXcgc3VwZXIKICAgICBEZXNjcmliZXMgdGhlIGltcGxpY2l0ICJfX2NsYXNzX18iIGNsb3N1cmUgcmVmZXJlbmNlCgoKVXNlcyBmb3IgbWV0YWNsYXNzZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBwb3RlbnRpYWwgdXNlcyBmb3IgbWV0YWNsYXNzZXMgYXJlIGJvdW5kbGVzcy4gU29tZSBpZGVhcyB0aGF0IGhhdmUKYmVlbiBleHBsb3JlZCBpbmNsdWRlIGVudW0sIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgYXV0b21hdGljCmRlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgZnJhbWV3b3JrcywgYW5kCmF1dG9tYXRpYyByZXNvdXJjZSBsb2NraW5nL3N5bmNocm9uaXphdGlvbi4KCgpDdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUKImlzaW5zdGFuY2UoKSIgYW5kICJpc3N1YmNsYXNzKCkiIGJ1aWx0LWluIGZ1bmN0aW9ucy4KCkluIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgImFiYy5BQkNNZXRhIiBpbXBsZW1lbnRzIHRoZXNlIG1ldGhvZHMgaW4Kb3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgYXMK4oCcdmlydHVhbCBiYXNlIGNsYXNzZXPigJ0gdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pbgp0eXBlcyksIGluY2x1ZGluZyBvdGhlciBBQkNzLgoKY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpCgogICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvcgogICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudAogICAiaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpIi4KCmNsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKQoKICAgUmV0dXJuIHRydWUgaWYgKnN1YmNsYXNzKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3IKICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50CiAgICJpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcykiLgoKTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAobWV0YWNsYXNzKSBvZiBhCmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuClRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZApvbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSBjbGFzcy4KClNlZSBhbHNvOgoKICAqKlBFUCAzMTE5KiogLSBJbnRyb2R1Y2luZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMKICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgImlzaW5zdGFuY2UoKSIgYW5kCiAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgYW5kCiAgICAgIl9fc3ViY2xhc3NjaGVja19fKCkiLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpbgogICAgIHRoZSBjb250ZXh0IG9mIGFkZGluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKHNlZSB0aGUgImFiYyIKICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS4KCgpFbXVsYXRpbmcgZ2VuZXJpYyB0eXBlcwo9PT09PT09PT09PT09PT09PT09PT09PQoKV2hlbiB1c2luZyAqdHlwZSBhbm5vdGF0aW9ucyosIGl0IGlzIG9mdGVuIHVzZWZ1bCB0byAqcGFyYW1ldGVyaXplKiBhCipnZW5lcmljIHR5cGUqIHVzaW5nIFB5dGhvbuKAmXMgc3F1YXJlLWJyYWNrZXRzIG5vdGF0aW9uLiBGb3IgZXhhbXBsZSwKdGhlIGFubm90YXRpb24gImxpc3RbaW50XSIgbWlnaHQgYmUgdXNlZCB0byBzaWduaWZ5IGEgImxpc3QiIGluIHdoaWNoCmFsbCB0aGUgZWxlbWVudHMgYXJlIG9mIHR5cGUgImludCIuCgpTZWUgYWxzbzoKCiAgKipQRVAgNDg0KiogLSBUeXBlIEhpbnRzCiAgICAgSW50cm9kdWNpbmcgUHl0aG9u4oCZcyBmcmFtZXdvcmsgZm9yIHR5cGUgYW5ub3RhdGlvbnMKCiAgR2VuZXJpYyBBbGlhcyBUeXBlcwogICAgIERvY3VtZW50YXRpb24gZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIHBhcmFtZXRlcml6ZWQgZ2VuZXJpYwogICAgIGNsYXNzZXMKCiAgR2VuZXJpY3MsIHVzZXItZGVmaW5lZCBnZW5lcmljcyBhbmQgInR5cGluZy5HZW5lcmljIgogICAgIERvY3VtZW50YXRpb24gb24gaG93IHRvIGltcGxlbWVudCBnZW5lcmljIGNsYXNzZXMgdGhhdCBjYW4gYmUKICAgICBwYXJhbWV0ZXJpemVkIGF0IHJ1bnRpbWUgYW5kIHVuZGVyc3Rvb2QgYnkgc3RhdGljIHR5cGUtY2hlY2tlcnMuCgpBIGNsYXNzIGNhbiAqZ2VuZXJhbGx5KiBvbmx5IGJlIHBhcmFtZXRlcml6ZWQgaWYgaXQgZGVmaW5lcyB0aGUKc3BlY2lhbCBjbGFzcyBtZXRob2QgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiLgoKY2xhc3NtZXRob2Qgb2JqZWN0Ll9fY2xhc3NfZ2V0aXRlbV9fKGNscywga2V5KQoKICAgUmV0dXJuIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpYWxpemF0aW9uIG9mIGEgZ2VuZXJpYyBjbGFzcwogICBieSB0eXBlIGFyZ3VtZW50cyBmb3VuZCBpbiAqa2V5Ki4KCiAgIFdoZW4gZGVmaW5lZCBvbiBhIGNsYXNzLCAiX19jbGFzc19nZXRpdGVtX18oKSIgaXMgYXV0b21hdGljYWxseSBhCiAgIGNsYXNzIG1ldGhvZC4gQXMgc3VjaCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgaXQgdG8gYmUgZGVjb3JhdGVkIHdpdGgKICAgIkBjbGFzc21ldGhvZCIgd2hlbiBpdCBpcyBkZWZpbmVkLgoKClRoZSBwdXJwb3NlIG9mICpfX2NsYXNzX2dldGl0ZW1fXyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIHB1cnBvc2Ugb2YgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIGlzIHRvIGFsbG93IHJ1bnRpbWUKcGFyYW1ldGVyaXphdGlvbiBvZiBzdGFuZGFyZC1saWJyYXJ5IGdlbmVyaWMgY2xhc3NlcyBpbiBvcmRlciB0byBtb3JlCmVhc2lseSBhcHBseSAqdHlwZSBoaW50cyogdG8gdGhlc2UgY2xhc3Nlcy4KClRvIGltcGxlbWVudCBjdXN0b20gZ2VuZXJpYyBjbGFzc2VzIHRoYXQgY2FuIGJlIHBhcmFtZXRlcml6ZWQgYXQKcnVudGltZSBhbmQgdW5kZXJzdG9vZCBieSBzdGF0aWMgdHlwZS1jaGVja2VycywgdXNlcnMgc2hvdWxkIGVpdGhlcgppbmhlcml0IGZyb20gYSBzdGFuZGFyZCBsaWJyYXJ5IGNsYXNzIHRoYXQgYWxyZWFkeSBpbXBsZW1lbnRzCiJfX2NsYXNzX2dldGl0ZW1fXygpIiwgb3IgaW5oZXJpdCBmcm9tICJ0eXBpbmcuR2VuZXJpYyIsIHdoaWNoIGhhcyBpdHMKb3duIGltcGxlbWVudGF0aW9uIG9mICJfX2NsYXNzX2dldGl0ZW1fXygpIi4KCkN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb2YgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIG9uIGNsYXNzZXMgZGVmaW5lZApvdXRzaWRlIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1heSBub3QgYmUgdW5kZXJzdG9vZCBieSB0aGlyZC1wYXJ0eQp0eXBlLWNoZWNrZXJzIHN1Y2ggYXMgbXlweS4gVXNpbmcgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIG9uIGFueSBjbGFzcwpmb3IgcHVycG9zZXMgb3RoZXIgdGhhbiB0eXBlIGhpbnRpbmcgaXMgZGlzY291cmFnZWQuCgoKKl9fY2xhc3NfZ2V0aXRlbV9fKiB2ZXJzdXMgKl9fZ2V0aXRlbV9fKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpVc3VhbGx5LCB0aGUgc3Vic2NyaXB0aW9uIG9mIGFuIG9iamVjdCB1c2luZyBzcXVhcmUgYnJhY2tldHMgd2lsbCBjYWxsCnRoZSAiX19nZXRpdGVtX18oKSIgaW5zdGFuY2UgbWV0aG9kIGRlZmluZWQgb24gdGhlIG9iamVjdOKAmXMgY2xhc3MuCkhvd2V2ZXIsIGlmIHRoZSBvYmplY3QgYmVpbmcgc3Vic2NyaWJlZCBpcyBpdHNlbGYgYSBjbGFzcywgdGhlIGNsYXNzCm1ldGhvZCAiX19jbGFzc19nZXRpdGVtX18oKSIgbWF5IGJlIGNhbGxlZCBpbnN0ZWFkLgoiX19jbGFzc19nZXRpdGVtX18oKSIgc2hvdWxkIHJldHVybiBhIEdlbmVyaWNBbGlhcyBvYmplY3QgaWYgaXQgaXMKcHJvcGVybHkgZGVmaW5lZC4KClByZXNlbnRlZCB3aXRoIHRoZSAqZXhwcmVzc2lvbiogIm9ialt4XSIsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKZm9sbG93cyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHByb2Nlc3MgdG8gZGVjaWRlIHdoZXRoZXIKIl9fZ2V0aXRlbV9fKCkiIG9yICJfX2NsYXNzX2dldGl0ZW1fXygpIiBzaG91bGQgYmUgY2FsbGVkOgoKICAgZnJvbSBpbnNwZWN0IGltcG9ydCBpc2NsYXNzCgogICBkZWYgc3Vic2NyaWJlKG9iaiwgeCk6CiAgICAgICAiIiJSZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiAnb2JqW3hdJyIiIgoKICAgICAgIGNsYXNzX29mX29iaiA9IHR5cGUob2JqKQoKICAgICAgICMgSWYgdGhlIGNsYXNzIG9mIG9iaiBkZWZpbmVzIF9fZ2V0aXRlbV9fLAogICAgICAgIyBjYWxsIGNsYXNzX29mX29iai5fX2dldGl0ZW1fXyhvYmosIHgpCiAgICAgICBpZiBoYXNhdHRyKGNsYXNzX29mX29iaiwgJ19fZ2V0aXRlbV9fJyk6CiAgICAgICAgICAgcmV0dXJuIGNsYXNzX29mX29iai5fX2dldGl0ZW1fXyhvYmosIHgpCgogICAgICAgIyBFbHNlLCBpZiBvYmogaXMgYSBjbGFzcyBhbmQgZGVmaW5lcyBfX2NsYXNzX2dldGl0ZW1fXywKICAgICAgICMgY2FsbCBvYmouX19jbGFzc19nZXRpdGVtX18oeCkKICAgICAgIGVsaWYgaXNjbGFzcyhvYmopIGFuZCBoYXNhdHRyKG9iaiwgJ19fY2xhc3NfZ2V0aXRlbV9fJyk6CiAgICAgICAgICAgcmV0dXJuIG9iai5fX2NsYXNzX2dldGl0ZW1fXyh4KQoKICAgICAgICMgRWxzZSwgcmFpc2UgYW4gZXhjZXB0aW9uCiAgICAgICBlbHNlOgogICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgZiIne2NsYXNzX29mX29iai5fX25hbWVfX30nIG9iamVjdCBpcyBub3Qgc3Vic2NyaXB0YWJsZSIKICAgICAgICAgICApCgpJbiBQeXRob24sIGFsbCBjbGFzc2VzIGFyZSB0aGVtc2VsdmVzIGluc3RhbmNlcyBvZiBvdGhlciBjbGFzc2VzLiBUaGUKY2xhc3Mgb2YgYSBjbGFzcyBpcyBrbm93biBhcyB0aGF0IGNsYXNz4oCZcyAqbWV0YWNsYXNzKiwgYW5kIG1vc3QKY2xhc3NlcyBoYXZlIHRoZSAidHlwZSIgY2xhc3MgYXMgdGhlaXIgbWV0YWNsYXNzLiAidHlwZSIgZG9lcyBub3QKZGVmaW5lICJfX2dldGl0ZW1fXygpIiwgbWVhbmluZyB0aGF0IGV4cHJlc3Npb25zIHN1Y2ggYXMgImxpc3RbaW50XSIsCiJkaWN0W3N0ciwgZmxvYXRdIiBhbmQgInR1cGxlW3N0ciwgYnl0ZXNdIiBhbGwgcmVzdWx0IGluCiJfX2NsYXNzX2dldGl0ZW1fXygpIiBiZWluZyBjYWxsZWQ6CgogICA+Pj4gIyBsaXN0IGhhcyBjbGFzcyAidHlwZSIgYXMgaXRzIG1ldGFjbGFzcywgbGlrZSBtb3N0IGNsYXNzZXM6CiAgID4+PiB0eXBlKGxpc3QpCiAgIDxjbGFzcyAndHlwZSc+CiAgID4+PiB0eXBlKGRpY3QpID09IHR5cGUobGlzdCkgPT0gdHlwZSh0dXBsZSkgPT0gdHlwZShzdHIpID09IHR5cGUoYnl0ZXMpCiAgIFRydWUKICAgPj4+ICMgImxpc3RbaW50XSIgY2FsbHMgImxpc3QuX19jbGFzc19nZXRpdGVtX18oaW50KSIKICAgPj4+IGxpc3RbaW50XQogICBsaXN0W2ludF0KICAgPj4+ICMgbGlzdC5fX2NsYXNzX2dldGl0ZW1fXyByZXR1cm5zIGEgR2VuZXJpY0FsaWFzIG9iamVjdDoKICAgPj4+IHR5cGUobGlzdFtpbnRdKQogICA8Y2xhc3MgJ3R5cGVzLkdlbmVyaWNBbGlhcyc+CgpIb3dldmVyLCBpZiBhIGNsYXNzIGhhcyBhIGN1c3RvbSBtZXRhY2xhc3MgdGhhdCBkZWZpbmVzCiJfX2dldGl0ZW1fXygpIiwgc3Vic2NyaWJpbmcgdGhlIGNsYXNzIG1heSByZXN1bHQgaW4gZGlmZmVyZW50CmJlaGF2aW91ci4gQW4gZXhhbXBsZSBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUgImVudW0iIG1vZHVsZToKCiAgID4+PiBmcm9tIGVudW0gaW1wb3J0IEVudW0KICAgPj4+IGNsYXNzIE1lbnUoRW51bSk6CiAgIC4uLiAgICAgIiIiQSBicmVha2Zhc3QgbWVudSIiIgogICAuLi4gICAgIFNQQU0gPSAnc3BhbScKICAgLi4uICAgICBCQUNPTiA9ICdiYWNvbicKICAgLi4uCiAgID4+PiAjIEVudW0gY2xhc3NlcyBoYXZlIGEgY3VzdG9tIG1ldGFjbGFzczoKICAgPj4+IHR5cGUoTWVudSkKICAgPGNsYXNzICdlbnVtLkVudW1NZXRhJz4KICAgPj4+ICMgRW51bU1ldGEgZGVmaW5lcyBfX2dldGl0ZW1fXywKICAgPj4+ICMgc28gX19jbGFzc19nZXRpdGVtX18gaXMgbm90IGNhbGxlZCwKICAgPj4+ICMgYW5kIHRoZSByZXN1bHQgaXMgbm90IGEgR2VuZXJpY0FsaWFzIG9iamVjdDoKICAgPj4+IE1lbnVbJ1NQQU0nXQogICA8TWVudS5TUEFNOiAnc3BhbSc+CiAgID4+PiB0eXBlKE1lbnVbJ1NQQU0nXSkKICAgPGVudW0gJ01lbnUnPgoKU2VlIGFsc286CgogICoqUEVQIDU2MCoqIC0gQ29yZSBTdXBwb3J0IGZvciB0eXBpbmcgbW9kdWxlIGFuZCBnZW5lcmljIHR5cGVzCiAgICAgSW50cm9kdWNpbmcgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiLCBhbmQgb3V0bGluaW5nIHdoZW4gYQogICAgIHN1YnNjcmlwdGlvbiByZXN1bHRzIGluICJfX2NsYXNzX2dldGl0ZW1fXygpIiBiZWluZyBjYWxsZWQKICAgICBpbnN0ZWFkIG9mICJfX2dldGl0ZW1fXygpIgoKCkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpvYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKQoKICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIOKAnGNhbGxlZOKAnSBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZAogICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiByb3VnaGx5IHRyYW5zbGF0ZXMgdG8KICAgInR5cGUoeCkuX19jYWxsX18oeCwgYXJnMSwgLi4uKSIuCgoKRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlcwo9PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLgpDb250YWluZXJzIHVzdWFsbHkgYXJlICpzZXF1ZW5jZXMqIChzdWNoIGFzICJsaXN0cyIgb3IgInR1cGxlcyIpIG9yCiptYXBwaW5ncyogKGxpa2UgImRpY3Rpb25hcmllcyIpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzCmFzIHdlbGwuICBUaGUgZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhCnNlcXVlbmNlIG9yIHRvIGVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhCnNlcXVlbmNlLCB0aGUgYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwCjw9IGsgPCBOIiB3aGVyZSAqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yICJzbGljZSIgb2JqZWN0cywKd2hpY2ggZGVmaW5lIGEgcmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MKcHJvdmlkZSB0aGUgbWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLAoiY2xlYXIoKSIsICJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZAoidXBkYXRlKCkiIGJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbuKAmXMgc3RhbmRhcmQKImRpY3Rpb25hcnkiIG9iamVjdHMuICBUaGUgImNvbGxlY3Rpb25zLmFiYyIgbW9kdWxlIHByb3ZpZGVzIGEKIk11dGFibGVNYXBwaW5nIiAqYWJzdHJhY3QgYmFzZSBjbGFzcyogdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcwpmcm9tIGEgYmFzZSBzZXQgb2YgIl9fZ2V0aXRlbV9fKCkiLCAiX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwKYW5kICJrZXlzKCkiLiBNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzICJhcHBlbmQoKSIsCiJjb3VudCgpIiwgImluZGV4KCkiLCAiZXh0ZW5kKCkiLCAiaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLAoicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsIGxpa2UgUHl0aG9uIHN0YW5kYXJkICJsaXN0IiBvYmplY3RzLgpGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50IGFkZGl0aW9uIChtZWFuaW5nCmNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUKbWV0aG9kcyAiX19hZGRfXygpIiwgIl9fcmFkZF9fKCkiLCAiX19pYWRkX18oKSIsICJfX211bF9fKCkiLAoiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiBkZXNjcmliZWQgYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUKb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQKc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZQpvZiB0aGUgImluIiBvcGVyYXRvcjsgZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmfigJlzCmtleXM7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMKZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlCiJfX2l0ZXJfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZQpjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiIHNob3VsZCBpdGVyYXRlIHRocm91Z2ggdGhlCm9iamVjdOKAmXMga2V5czsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLgoKb2JqZWN0Ll9fbGVuX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuCiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdAogICBkb2VzbuKAmXQgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kCiAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiBjb250ZXh0LgoKICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiBDUHl0aG9uLCB0aGUgbGVuZ3RoIGlzCiAgIHJlcXVpcmVkIHRvIGJlIGF0IG1vc3QgInN5cy5tYXhzaXplIi4gSWYgdGhlIGxlbmd0aCBpcyBsYXJnZXIgdGhhbgogICAic3lzLm1heHNpemUiIHNvbWUgZmVhdHVyZXMgKHN1Y2ggYXMgImxlbigpIikgbWF5IHJhaXNlCiAgICJPdmVyZmxvd0Vycm9yIi4gIFRvIHByZXZlbnQgcmFpc2luZyAiT3ZlcmZsb3dFcnJvciIgYnkgdHJ1dGggdmFsdWUKICAgdGVzdGluZywgYW4gb2JqZWN0IG11c3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZC4KCm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmxlbmd0aF9oaW50KCkiLiBTaG91bGQgcmV0dXJuIGFuCiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhbgogICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhlCiAgIHJldHVybiB2YWx1ZSBtYXkgYWxzbyBiZSAiTm90SW1wbGVtZW50ZWQiLCB3aGljaCBpcyB0cmVhdGVkIHRoZQogICBzYW1lIGFzIGlmIHRoZSAiX19sZW5ndGhfaGludF9fIiBtZXRob2QgZGlkbuKAmXQgZXhpc3QgYXQgYWxsLiBUaGlzCiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3IKICAgY29ycmVjdG5lc3MuCgogICBOZXcgaW4gdmVyc2lvbiAzLjQuCgpOb3RlOgoKICBTbGljaW5nIGlzIGRvbmUgZXhjbHVzaXZlbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMuICBBCiAgY2FsbCBsaWtlCgogICAgIGFbMToyXSA9IGIKCiAgaXMgdHJhbnNsYXRlZCB0bwoKICAgICBhW3NsaWNlKDEsIDIsIE5vbmUpXSA9IGIKCiAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiB3aXRoICJOb25lIi4KCm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgInNlbGZba2V5XSIuIEZvciAqc2VxdWVuY2UqCiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMuIE9wdGlvbmFsbHksIHRoZXkgbWF5CiAgIHN1cHBvcnQgInNsaWNlIiBvYmplY3RzIGFzIHdlbGwuICBOZWdhdGl2ZSBpbmRleCBzdXBwb3J0IGlzIGFsc28KICAgb3B0aW9uYWwuIElmICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlCiAgIHJhaXNlZDsgaWYgKmtleSogaXMgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YgaW5kZXhlcyBmb3IgdGhlCiAgIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLAogICAiSW5kZXhFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC4gRm9yICptYXBwaW5nKiB0eXBlcywgaWYgKmtleSogaXMKICAgbWlzc2luZyAobm90IGluIHRoZSBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuCgogICBOb3RlOgoKICAgICAiZm9yIiBsb29wcyBleHBlY3QgdGhhdCBhbiAiSW5kZXhFcnJvciIgd2lsbCBiZSByYWlzZWQgZm9yCiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGUKICAgICBzZXF1ZW5jZS4KCiAgIE5vdGU6CgogICAgIFdoZW4gc3Vic2NyaXB0aW5nIGEgKmNsYXNzKiwgdGhlIHNwZWNpYWwgY2xhc3MgbWV0aG9kCiAgICAgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiIG1heSBiZSBjYWxsZWQgaW5zdGVhZCBvZiAiX19nZXRpdGVtX18oKSIuCiAgICAgU2VlIF9fY2xhc3NfZ2V0aXRlbV9fIHZlcnN1cyBfX2dldGl0ZW1fXyBmb3IgbW9yZSBkZXRhaWxzLgoKb2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yCiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmCiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5cwogICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlCiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yCiAgIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLgoKb2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSkKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yCiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmCiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzCiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUKICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLgoKb2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSkKCiAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiBmb3IgZGljdAogICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS4KCm9iamVjdC5fX2l0ZXJfXyhzZWxmKQoKICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gKml0ZXJhdG9yKiBpcyByZXF1aXJlZCBmb3IgYQogICBjb250YWluZXIuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuCiAgIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQKICAgc2hvdWxkIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLgoKb2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKQoKICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvIGltcGxlbWVudAogICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQKICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLgoKICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICJyZXZlcnNlZCgpIgogICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKCJfX2xlbl9fKCkiCiAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sCiAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiBwcm92aWRlIGFuCiAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5CiAgICJyZXZlcnNlZCgpIi4KClRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlIG5vcm1hbGx5CmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgY29udGFpbmVyLiBIb3dldmVyLCBjb250YWluZXIKb2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50CmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBpdGVyYWJsZS4KCm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSkKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZQogICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzCiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yCiAgIHRoZSBrZXktaXRlbSBwYWlycy4KCiAgIEZvciBvYmplY3RzIHRoYXQgZG9u4oCZdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlIG1lbWJlcnNoaXAgdGVzdAogICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkIHNlcXVlbmNlCiAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgdGhpcyBzZWN0aW9uIGluIHRoZQogICBsYW5ndWFnZSByZWZlcmVuY2UuCgoKRW11bGF0aW5nIG51bWVyaWMgdHlwZXMKPT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy4KTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUKcGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvcgpub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLgoKb2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKQoKICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWMKICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIiwKICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvCiAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhCiAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInR5cGUoeCkuX19hZGRfXyh4LCB5KSIgaXMKICAgY2FsbGVkLiAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8KICAgdXNpbmcgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0bwogICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0CiAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluCiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLgoKICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlCiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLgoKb2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pCm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpCgogICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpYwogICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLAogICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZCkKICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcwogICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gWzNdIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mCiAgIGRpZmZlcmVudCB0eXBlcy4gWzRdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggLQogICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiCiAgIG1ldGhvZCwgInR5cGUoeSkuX19yc3ViX18oeSwgeCkiIGlzIGNhbGxlZCBpZiAidHlwZSh4KS5fX3N1Yl9fKHgsCiAgIHkpIiByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIuCgogICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICJfX3Jwb3dfXygpIiAodGhlCiAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLgoKICAgTm90ZToKCiAgICAgSWYgdGhlIHJpZ2h0IG9wZXJhbmTigJlzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5k4oCZcwogICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCiAgICAgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKICAgICBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZOKAmXMgbm9uLXJlZmxlY3RlZCBtZXRob2QuIFRoaXMgYmVoYXZpb3IKICAgICBhbGxvd3Mgc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnPigJkgb3BlcmF0aW9ucy4KCm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSkKb2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpCm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcikKb2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKQpvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcikKCiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljCiAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgIioqPSIsCiAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvCiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdAogICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSBzcGVjaWZpYwogICBtZXRob2QgaXMgbm90IGRlZmluZWQsIG9yIGlmIHRoYXQgbWV0aG9kIHJldHVybnMgIk5vdEltcGxlbWVudGVkIiwKICAgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yCiAgIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIGFuICJfX2lhZGRfXygpIgogICBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggPSB4Ll9faWFkZF9fKHkpIiAuIElmCiAgICJfX2lhZGRfXygpIiBkb2VzIG5vdCBleGlzdCwgb3IgaWYgInguX19pYWRkX18oeSkiIHJldHVybnMKICAgIk5vdEltcGxlbWVudGVkIiwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmUKICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiBjZXJ0YWluCiAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBlcnJvcnMKICAgKHNlZSBXaHkgZG9lcyBhX3R1cGxlW2ldICs9IFvigJhpdGVt4oCZXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGUKICAgYWRkaXRpb24gd29ya3M/KSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mIHRoZSBkYXRhCiAgIG1vZGVsLgoKb2JqZWN0Ll9fbmVnX18oc2VsZikKb2JqZWN0Ll9fcG9zX18oc2VsZikKb2JqZWN0Ll9fYWJzX18oc2VsZikKb2JqZWN0Ll9faW52ZXJ0X18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsCiAgICJhYnMoKSIgYW5kICJ+IikuCgpvYmplY3QuX19jb21wbGV4X18oc2VsZikKb2JqZWN0Ll9faW50X18oc2VsZikKb2JqZWN0Ll9fZmxvYXRfXyhzZWxmKQoKICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiIGFuZAogICAiZmxvYXQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCgpvYmplY3QuX19pbmRleF9fKHNlbGYpCgogICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyIFB5dGhvbiBuZWVkcwogICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoCiAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAib2N0KCkiCiAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBudW1lcmljCiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLgoKICAgSWYgIl9faW50X18oKSIsICJfX2Zsb2F0X18oKSIgYW5kICJfX2NvbXBsZXhfXygpIiBhcmUgbm90IGRlZmluZWQKICAgdGhlbiBjb3JyZXNwb25kaW5nIGJ1aWx0LWluIGZ1bmN0aW9ucyAiaW50KCkiLCAiZmxvYXQoKSIgYW5kCiAgICJjb21wbGV4KCkiIGZhbGwgYmFjayB0byAiX19pbmRleF9fKCkiLgoKb2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbmRpZ2l0c10pCm9iamVjdC5fX3RydW5jX18oc2VsZikKb2JqZWN0Ll9fZmxvb3JfXyhzZWxmKQpvYmplY3QuX19jZWlsX18oc2VsZikKCiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyb3VuZCgpIiBhbmQgIm1hdGgiCiAgIGZ1bmN0aW9ucyAidHJ1bmMoKSIsICJmbG9vcigpIiBhbmQgImNlaWwoKSIuIFVubGVzcyAqbmRpZ2l0cyogaXMKICAgcGFzc2VkIHRvICJfX3JvdW5kX18oKSIgYWxsIHRoZXNlIG1ldGhvZHMgc2hvdWxkIHJldHVybiB0aGUgdmFsdWUKICAgb2YgdGhlIG9iamVjdCB0cnVuY2F0ZWQgdG8gYW4gIkludGVncmFsIiAodHlwaWNhbGx5IGFuICJpbnQiKS4KCiAgIFRoZSBidWlsdC1pbiBmdW5jdGlvbiAiaW50KCkiIGZhbGxzIGJhY2sgdG8gIl9fdHJ1bmNfXygpIiBpZgogICBuZWl0aGVyICJfX2ludF9fKCkiIG5vciAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xMTogVGhlIGRlbGVnYXRpb24gb2YgImludCgpIiB0byAiX190cnVuY19fKCkiCiAgIGlzIGRlcHJlY2F0ZWQuCgoKV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vycwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpBICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0bwpiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXIKaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dApmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5Cmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uIFRoZSB3aXRoCnN0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuCgpUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXMKa2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZApmaWxlcywgZXRjLgoKRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgTWFuYWdlciBUeXBlcy4KCm9iamVjdC5fX2VudGVyX18oc2VsZikKCiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIgogICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9k4oCZcyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKQogICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS4KCm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spCgogICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnMKICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZQogICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbAogICBiZSAiTm9uZSIuCgogICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGUKICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZAogICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWQKICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuCgogICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW4KICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXLigJlzIHJlc3BvbnNpYmlsaXR5LgoKU2VlIGFsc286CgogICoqUEVQIDM0MyoqIC0gVGhlIOKAnHdpdGjigJ0gc3RhdGVtZW50CiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCIKICAgICBzdGF0ZW1lbnQuCgoKQ3VzdG9taXppbmcgcG9zaXRpb25hbCBhcmd1bWVudHMgaW4gY2xhc3MgcGF0dGVybiBtYXRjaGluZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpXaGVuIHVzaW5nIGEgY2xhc3MgbmFtZSBpbiBhIHBhdHRlcm4sIHBvc2l0aW9uYWwgYXJndW1lbnRzIGluIHRoZQpwYXR0ZXJuIGFyZSBub3QgYWxsb3dlZCBieSBkZWZhdWx0LCBpLmUuICJjYXNlIE15Q2xhc3MoeCwgeSkiIGlzCnR5cGljYWxseSBpbnZhbGlkIHdpdGhvdXQgc3BlY2lhbCBzdXBwb3J0IGluICJNeUNsYXNzIi4gVG8gYmUgYWJsZSB0bwp1c2UgdGhhdCBraW5kIG9mIHBhdHRlcm4sIHRoZSBjbGFzcyBuZWVkcyB0byBkZWZpbmUgYSAqX19tYXRjaF9hcmdzX18qCmF0dHJpYnV0ZS4KCm9iamVjdC5fX21hdGNoX2FyZ3NfXwoKICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSB0dXBsZSBvZiBzdHJpbmdzLiBXaGVuIHRoaXMKICAgY2xhc3MgaXMgdXNlZCBpbiBhIGNsYXNzIHBhdHRlcm4gd2l0aCBwb3NpdGlvbmFsIGFyZ3VtZW50cywgZWFjaAogICBwb3NpdGlvbmFsIGFyZ3VtZW50IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBrZXl3b3JkIGFyZ3VtZW50LAogICB1c2luZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiAqX19tYXRjaF9hcmdzX18qIGFzIHRoZSBrZXl3b3JkLgogICBUaGUgYWJzZW5jZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gIigpIi4KCkZvciBleGFtcGxlLCBpZiAiTXlDbGFzcy5fX21hdGNoX2FyZ3NfXyIgaXMgIigibGVmdCIsICJjZW50ZXIiLAoicmlnaHQiKSIgdGhhdCBtZWFucyB0aGF0ICJjYXNlIE15Q2xhc3MoeCwgeSkiIGlzIGVxdWl2YWxlbnQgdG8gImNhc2UKTXlDbGFzcyhsZWZ0PXgsIGNlbnRlcj15KSIuIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUKcGF0dGVybiBtdXN0IGJlIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluCipfX21hdGNoX2FyZ3NfXyo7IGlmIGl0IGlzIGxhcmdlciwgdGhlIHBhdHRlcm4gbWF0Y2ggYXR0ZW1wdCB3aWxsCnJhaXNlIGEgIlR5cGVFcnJvciIuCgpOZXcgaW4gdmVyc2lvbiAzLjEwLgoKU2VlIGFsc286CgogICoqUEVQIDYzNCoqIC0gU3RydWN0dXJhbCBQYXR0ZXJuIE1hdGNoaW5nCiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBQeXRob24gIm1hdGNoIiBzdGF0ZW1lbnQuCgoKU3BlY2lhbCBtZXRob2QgbG9va3VwCj09PT09PT09PT09PT09PT09PT09PQoKRm9yIGN1c3RvbSBjbGFzc2VzLCBpbXBsaWNpdCBpbnZvY2F0aW9ucyBvZiBzcGVjaWFsIG1ldGhvZHMgYXJlIG9ubHkKZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdOKAmXMgdHlwZSwgbm90IGluCnRoZSBvYmplY3TigJlzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgcmVhc29uIHdoeQp0aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbjoKCiAgID4+PiBjbGFzcyBDOgogICAuLi4gICAgIHBhc3MKICAgLi4uCiAgID4+PiBjID0gQygpCiAgID4+PiBjLl9fbGVuX18gPSBsYW1iZGE6IDUKICAgPj4+IGxlbihjKQogICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgVHlwZUVycm9yOiBvYmplY3Qgb2YgdHlwZSAnQycgaGFzIG5vIGxlbigpCgpUaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbAptZXRob2RzIHN1Y2ggYXMgIl9faGFzaF9fKCkiIGFuZCAiX19yZXByX18oKSIgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnkKYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgb2YgdGhlc2UKbWV0aG9kcyB1c2VkIHRoZSBjb252ZW50aW9uYWwgbG9va3VwIHByb2Nlc3MsIHRoZXkgd291bGQgZmFpbCB3aGVuCmludm9rZWQgb24gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjoKCiAgID4+PiAxIC5fX2hhc2hfXygpID09IGhhc2goMSkKICAgVHJ1ZQogICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpCiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgJ19faGFzaF9fJyBvZiAnaW50JyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQKCkluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIHVuYm91bmQgbWV0aG9kIG9mIGEgY2xhc3MgaW4gdGhpcwp3YXkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIOKAmG1ldGFjbGFzcyBjb25mdXNpb27igJksIGFuZCBpcyBhdm9pZGVkCmJ5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczoKCiAgID4+PiB0eXBlKDEpLl9faGFzaF9fKDEpID09IGhhc2goMSkKICAgVHJ1ZQogICA+Pj4gdHlwZShpbnQpLl9faGFzaF9fKGludCkgPT0gaGFzaChpbnQpCiAgIFRydWUKCkluIGFkZGl0aW9uIHRvIGJ5cGFzc2luZyBhbnkgaW5zdGFuY2UgYXR0cmlidXRlcyBpbiB0aGUgaW50ZXJlc3Qgb2YKY29ycmVjdG5lc3MsIGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBnZW5lcmFsbHkgYWxzbyBieXBhc3Nlcwp0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdOKAmXMgbWV0YWNsYXNzOgoKICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6CiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOgogICAuLi4gICAgICAgICBwcmludCgiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIikKICAgLi4uICAgICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncykKICAgLi4uCiAgID4+PiBjbGFzcyBDKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOgogICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAuLi4gICAgICAgICByZXR1cm4gMTAKICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6CiAgIC4uLiAgICAgICAgIHByaW50KCJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpCiAgIC4uLiAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygqYXJncykKICAgLi4uCiAgID4+PiBjID0gQygpCiAgID4+PiBjLl9fbGVuX18oKSAgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIGluc3RhbmNlCiAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkCiAgIDEwCiAgID4+PiB0eXBlKGMpLl9fbGVuX18oYykgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIHR5cGUKICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkCiAgIDEwCiAgID4+PiBsZW4oYykgICAgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdCBsb29rdXAKICAgMTAKCkJ5cGFzc2luZyB0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWFjaGluZXJ5IGluIHRoaXMgZmFzaGlvbiBwcm92aWRlcwpzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlIGludGVycHJldGVyLCBhdAp0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBzcGVjaWFsIG1ldGhvZHMgKHRoZQpzcGVjaWFsIG1ldGhvZCAqbXVzdCogYmUgc2V0IG9uIHRoZSBjbGFzcyBvYmplY3QgaXRzZWxmIGluIG9yZGVyIHRvIGJlCmNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuCnoOc3RyaW5nLW1ldGhvZHN11GAAAFN0cmluZyBNZXRob2RzCioqKioqKioqKioqKioqCgpTdHJpbmdzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zLCBhbG9uZyB3aXRoCnRoZSBhZGRpdGlvbmFsIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LgoKU3RyaW5ncyBhbHNvIHN1cHBvcnQgdHdvIHN0eWxlcyBvZiBzdHJpbmcgZm9ybWF0dGluZywgb25lIHByb3ZpZGluZyBhCmxhcmdlIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9taXphdGlvbiAoc2VlICJzdHIuZm9ybWF0KCkiLApGb3JtYXQgU3RyaW5nIFN5bnRheCBhbmQgQ3VzdG9tIFN0cmluZyBGb3JtYXR0aW5nKSBhbmQgdGhlIG90aGVyIGJhc2VkCm9uIEMgInByaW50ZiIgc3R5bGUgZm9ybWF0dGluZyB0aGF0IGhhbmRsZXMgYSBuYXJyb3dlciByYW5nZSBvZiB0eXBlcwphbmQgaXMgc2xpZ2h0bHkgaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHksIGJ1dCBpcyBvZnRlbiBmYXN0ZXIgZm9yIHRoZQpjYXNlcyBpdCBjYW4gaGFuZGxlIChwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcpLgoKVGhlIFRleHQgUHJvY2Vzc2luZyBTZXJ2aWNlcyBzZWN0aW9uIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGNvdmVycyBhCm51bWJlciBvZiBvdGhlciBtb2R1bGVzIHRoYXQgcHJvdmlkZSB2YXJpb3VzIHRleHQgcmVsYXRlZCB1dGlsaXRpZXMKKGluY2x1ZGluZyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBpbiB0aGUgInJlIiBtb2R1bGUpLgoKc3RyLmNhcGl0YWxpemUoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZAogICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgbm93IHB1dCBpbnRvCiAgIHRpdGxlY2FzZSByYXRoZXIgdGhhbiB1cHBlcmNhc2UuIFRoaXMgbWVhbnMgdGhhdCBjaGFyYWN0ZXJzIGxpa2UKICAgZGlncmFwaHMgd2lsbCBvbmx5IGhhdmUgdGhlaXIgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLCBpbnN0ZWFkIG9mCiAgIHRoZSBmdWxsIGNoYXJhY3Rlci4KCnN0ci5jYXNlZm9sZCgpCgogICBSZXR1cm4gYSBjYXNlZm9sZGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gQ2FzZWZvbGRlZCBzdHJpbmdzIG1heSBiZQogICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy4KCiAgIENhc2Vmb2xkaW5nIGlzIHNpbWlsYXIgdG8gbG93ZXJjYXNpbmcgYnV0IG1vcmUgYWdncmVzc2l2ZSBiZWNhdXNlCiAgIGl0IGlzIGludGVuZGVkIHRvIHJlbW92ZSBhbGwgY2FzZSBkaXN0aW5jdGlvbnMgaW4gYSBzdHJpbmcuIEZvcgogICBleGFtcGxlLCB0aGUgR2VybWFuIGxvd2VyY2FzZSBsZXR0ZXIgIifDnyciIGlzIGVxdWl2YWxlbnQgdG8gIiJzcyIiLgogICBTaW5jZSBpdCBpcyBhbHJlYWR5IGxvd2VyY2FzZSwgImxvd2VyKCkiIHdvdWxkIGRvIG5vdGhpbmcgdG8gIifDnyciOwogICAiY2FzZWZvbGQoKSIgY29udmVydHMgaXQgdG8gIiJzcyIiLgoKICAgVGhlIGNhc2Vmb2xkaW5nIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZQogICBVbmljb2RlIFN0YW5kYXJkLgoKICAgTmV3IGluIHZlcnNpb24gMy4zLgoKc3RyLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSkKCiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lCiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSBzcGFjZSkuIFRoZQogICBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAgImxlbihzKSIuCgpzdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YioKICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQKICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgoKICAgSWYgKnN1YiogaXMgZW1wdHksIHJldHVybnMgdGhlIG51bWJlciBvZiBlbXB0eSBzdHJpbmdzIGJldHdlZW4KICAgY2hhcmFjdGVycyB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGx1cyBvbmUuCgpzdHIuZW5jb2RlKGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0nc3RyaWN0JykKCiAgIFJldHVybiB0aGUgc3RyaW5nIGVuY29kZWQgdG8gImJ5dGVzIi4KCiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gIid1dGYtOCciOyBzZWUgU3RhbmRhcmQgRW5jb2RpbmdzIGZvcgogICBwb3NzaWJsZSB2YWx1ZXMuCgogICAqZXJyb3JzKiBjb250cm9scyBob3cgZW5jb2RpbmcgZXJyb3JzIGFyZSBoYW5kbGVkLiBJZiAiJ3N0cmljdCciCiAgICh0aGUgZGVmYXVsdCksIGEgIlVuaWNvZGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXIgcG9zc2libGUKICAgdmFsdWVzIGFyZSAiJ2lnbm9yZSciLCAiJ3JlcGxhY2UnIiwgIid4bWxjaGFycmVmcmVwbGFjZSciLAogICAiJ2JhY2tzbGFzaHJlcGxhY2UnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEKICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIi4gU2VlIEVycm9yIEhhbmRsZXJzIGZvciBkZXRhaWxzLgoKICAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSB2YWx1ZSBvZiAqZXJyb3JzKiBpcyBub3QgY2hlY2tlZCBmb3IKICAgdmFsaWRpdHkgdW5sZXNzIGFuIGVuY29kaW5nIGVycm9yIGFjdHVhbGx5IG9jY3VycywgUHl0aG9uCiAgIERldmVsb3BtZW50IE1vZGUgaXMgZW5hYmxlZCBvciBhIGRlYnVnIGJ1aWxkIGlzIHVzZWQuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCBzdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cy4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjk6IFRoZSB2YWx1ZSBvZiB0aGUgKmVycm9ycyogYXJndW1lbnQgaXMgbm93CiAgIGNoZWNrZWQgaW4gUHl0aG9uIERldmVsb3BtZW50IE1vZGUgYW5kIGluIGRlYnVnIG1vZGUuCgpzdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KiwKICAgb3RoZXJ3aXNlIHJldHVybiAiRmFsc2UiLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdWZmaXhlcwogICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgdGhhdAogICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgcG9zaXRpb24uCgpzdHIuZXhwYW5kdGFicyh0YWJzaXplPTgpCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZAogICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gYW5kIHRoZQogICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqIGNoYXJhY3RlcnMKICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLgogICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvIGFuZCB0aGUKICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgY2hhcmFjdGVyIGlzIGEKICAgdGFiICgiXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIHJlc3VsdAogICB1bnRpbCB0aGUgY3VycmVudCBjb2x1bW4gaXMgZXF1YWwgdG8gdGhlIG5leHQgdGFiIHBvc2l0aW9uLiAoVGhlCiAgIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhIG5ld2xpbmUKICAgKCJcbiIpIG9yIHJldHVybiAoIlxyIiksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzCiAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgYW5kIHRoZQogICBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgdGhlCiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuCgogICA+Pj4gJzAxXHQwMTJcdDAxMjNcdDAxMjM0Jy5leHBhbmR0YWJzKCkKICAgJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0JwogICA+Pj4gJzAxXHQwMTJcdDAxMjNcdDAxMjM0Jy5leHBhbmR0YWJzKDQpCiAgICcwMSAgMDEyIDAxMjMgICAgMDEyMzQnCgpzdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKQoKICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXMKICAgZm91bmQgd2l0aGluIHRoZSBzbGljZSAic1tzdGFydDplbmRdIi4gIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqCiAgIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uICBSZXR1cm4gIi0xIiBpZgogICAqc3ViKiBpcyBub3QgZm91bmQuCgogICBOb3RlOgoKICAgICBUaGUgImZpbmQoKSIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vdyB0aGUKICAgICBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCwgdXNlCiAgICAgdGhlICJpbiIgb3BlcmF0b3I6CgogICAgICAgID4+PiAnUHknIGluICdQeXRob24nCiAgICAgICAgVHJ1ZQoKc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpCgogICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzCiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkcwogICBkZWxpbWl0ZWQgYnkgYnJhY2VzICJ7fSIuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlcgogICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGEKICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaAogICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlCiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuCgogICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKQogICAnVGhlIHN1bSBvZiAxICsgMiBpcyAzJwoKICAgU2VlIEZvcm1hdCBTdHJpbmcgU3ludGF4IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzCiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuCgogICBOb3RlOgoKICAgICBXaGVuIGZvcm1hdHRpbmcgYSBudW1iZXIgKCJpbnQiLCAiZmxvYXQiLCAiY29tcGxleCIsCiAgICAgImRlY2ltYWwuRGVjaW1hbCIgYW5kIHN1YmNsYXNzZXMpIHdpdGggdGhlICJuIiB0eXBlIChleDoKICAgICAiJ3s6bn0nLmZvcm1hdCgxMjM0KSIpLCB0aGUgZnVuY3Rpb24gdGVtcG9yYXJpbHkgc2V0cyB0aGUKICAgICAiTENfQ1RZUEUiIGxvY2FsZSB0byB0aGUgIkxDX05VTUVSSUMiIGxvY2FsZSB0byBkZWNvZGUKICAgICAiZGVjaW1hbF9wb2ludCIgYW5kICJ0aG91c2FuZHNfc2VwIiBmaWVsZHMgb2YgImxvY2FsZWNvbnYoKSIgaWYKICAgICB0aGV5IGFyZSBub24tQVNDSUkgb3IgbG9uZ2VyIHRoYW4gMSBieXRlLCBhbmQgdGhlICJMQ19OVU1FUklDIgogICAgIGxvY2FsZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgIkxDX0NUWVBFIiBsb2NhbGUuICBUaGlzIHRlbXBvcmFyeQogICAgIGNoYW5nZSBhZmZlY3RzIG90aGVyIHRocmVhZHMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBXaGVuIGZvcm1hdHRpbmcgYSBudW1iZXIgd2l0aCB0aGUgIm4iIHR5cGUsCiAgIHRoZSBmdW5jdGlvbiBzZXRzIHRlbXBvcmFyaWx5IHRoZSAiTENfQ1RZUEUiIGxvY2FsZSB0byB0aGUKICAgIkxDX05VTUVSSUMiIGxvY2FsZSBpbiBzb21lIGNhc2VzLgoKc3RyLmZvcm1hdF9tYXAobWFwcGluZykKCiAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICJtYXBwaW5nIiBpcyB1c2VkCiAgIGRpcmVjdGx5IGFuZCBub3QgY29waWVkIHRvIGEgImRpY3QiLiAgVGhpcyBpcyB1c2VmdWwgaWYgZm9yIGV4YW1wbGUKICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczoKCiAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOgogICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgogICAuLi4gICAgICAgICByZXR1cm4ga2V5CiAgIC4uLgogICA+Pj4gJ3tuYW1lfSB3YXMgYm9ybiBpbiB7Y291bnRyeX0nLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPSdHdWlkbycpKQogICAnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeScKCiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi4KCnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKQoKICAgTGlrZSAiZmluZCgpIiwgYnV0IHJhaXNlICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90CiAgIGZvdW5kLgoKc3RyLmlzYWxudW0oKQoKICAgUmV0dXJuICJUcnVlIiBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kCiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLiAgQSBjaGFyYWN0ZXIKICAgImMiIGlzIGFscGhhbnVtZXJpYyBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyByZXR1cm5zICJUcnVlIjoKICAgImMuaXNhbHBoYSgpIiwgImMuaXNkZWNpbWFsKCkiLCAiYy5pc2RpZ2l0KCkiLCBvciAiYy5pc251bWVyaWMoKSIuCgpzdHIuaXNhbHBoYSgpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kCiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLiAgQWxwaGFiZXRpYwogICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyCiAgIGRhdGFiYXNlIGFzIOKAnExldHRlcuKAnSwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5CiAgIGJlaW5nIG9uZSBvZiDigJxMbeKAnSwg4oCcTHTigJ0sIOKAnEx14oCdLCDigJxMbOKAnSwgb3Ig4oCcTG/igJ0uICBOb3RlIHRoYXQgdGhpcyBpcwogICBkaWZmZXJlbnQgZnJvbSB0aGUg4oCcQWxwaGFiZXRpY+KAnSBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBVbmljb2RlCiAgIFN0YW5kYXJkLgoKc3RyLmlzYXNjaWkoKQoKICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGlzIGVtcHR5IG9yIGFsbCBjaGFyYWN0ZXJzIGluIHRoZQogICBzdHJpbmcgYXJlIEFTQ0lJLCAiRmFsc2UiIG90aGVyd2lzZS4gQVNDSUkgY2hhcmFjdGVycyBoYXZlIGNvZGUKICAgcG9pbnRzIGluIHRoZSByYW5nZSBVKzAwMDAtVSswMDdGLgoKICAgTmV3IGluIHZlcnNpb24gMy43LgoKc3RyLmlzZGVjaW1hbCgpCgogICBSZXR1cm4gIlRydWUiIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRlY2ltYWwKICAgY2hhcmFjdGVycyBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgIkZhbHNlIiBvdGhlcndpc2UuCiAgIERlY2ltYWwgY2hhcmFjdGVycyBhcmUgdGhvc2UgdGhhdCBjYW4gYmUgdXNlZCB0byBmb3JtIG51bWJlcnMgaW4KICAgYmFzZSAxMCwgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLiAgRm9ybWFsbHkgYSBkZWNpbWFsCiAgIGNoYXJhY3RlciBpcyBhIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZSBHZW5lcmFsIENhdGVnb3J5IOKAnE5k4oCdLgoKc3RyLmlzZGlnaXQoKQoKICAgUmV0dXJuICJUcnVlIiBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlCiAgIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLiAgRGlnaXRzIGluY2x1ZGUKICAgZGVjaW1hbCBjaGFyYWN0ZXJzIGFuZCBkaWdpdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcsIHN1Y2ggYXMKICAgdGhlIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiBUaGlzIGNvdmVycyBkaWdpdHMgd2hpY2gKICAgY2Fubm90IGJlIHVzZWQgdG8gZm9ybSBudW1iZXJzIGluIGJhc2UgMTAsIGxpa2UgdGhlIEtoYXJvc3RoaQogICBudW1iZXJzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgYSBjaGFyYWN0ZXIgdGhhdCBoYXMgdGhlIHByb3BlcnR5CiAgIHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvciBOdW1lcmljX1R5cGU9RGVjaW1hbC4KCnN0ci5pc2lkZW50aWZpZXIoKQoKICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gdGhlCiAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLgoKICAgQ2FsbCAia2V5d29yZC5pc2tleXdvcmQoKSIgdG8gdGVzdCB3aGV0aGVyIHN0cmluZyAicyIgaXMgYSByZXNlcnZlZAogICBpZGVudGlmaWVyLCBzdWNoIGFzICJkZWYiIGFuZCAiY2xhc3MiLgoKICAgRXhhbXBsZToKCiAgICAgID4+PiBmcm9tIGtleXdvcmQgaW1wb3J0IGlza2V5d29yZAoKICAgICAgPj4+ICdoZWxsbycuaXNpZGVudGlmaWVyKCksIGlza2V5d29yZCgnaGVsbG8nKQogICAgICAoVHJ1ZSwgRmFsc2UpCiAgICAgID4+PiAnZGVmJy5pc2lkZW50aWZpZXIoKSwgaXNrZXl3b3JkKCdkZWYnKQogICAgICAoVHJ1ZSwgVHJ1ZSkKCnN0ci5pc2xvd2VyKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlCiAgIGxvd2VyY2FzZSBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgIkZhbHNlIgogICBvdGhlcndpc2UuCgpzdHIuaXNudW1lcmljKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgbnVtZXJpYwogICBjaGFyYWN0ZXJzLCBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgIkZhbHNlIiBvdGhlcndpc2UuCiAgIE51bWVyaWMgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycwogICB0aGF0IGhhdmUgdGhlIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZSBwcm9wZXJ0eSwgZS5nLiBVKzIxNTUsIFZVTEdBUgogICBGUkFDVElPTiBPTkUgRklGVEguICBGb3JtYWxseSwgbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoCiAgIHRoZSBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQsIE51bWVyaWNfVHlwZT1EZWNpbWFsIG9yCiAgIE51bWVyaWNfVHlwZT1OdW1lcmljLgoKc3RyLmlzcHJpbnRhYmxlKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgcHJpbnRhYmxlIG9yIHRoZQogICBzdHJpbmcgaXMgZW1wdHksICJGYWxzZSIgb3RoZXJ3aXNlLiAgTm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlCiAgIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UgYXMKICAg4oCcT3RoZXLigJ0gb3Ig4oCcU2VwYXJhdG9y4oCdLCBleGNlcHRpbmcgdGhlIEFTQ0lJIHNwYWNlICgweDIwKSB3aGljaCBpcwogICBjb25zaWRlcmVkIHByaW50YWJsZS4gIChOb3RlIHRoYXQgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhpcwogICBjb250ZXh0IGFyZSB0aG9zZSB3aGljaCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2hlbiAicmVwcigpIiBpcwogICBpbnZva2VkIG9uIGEgc3RyaW5nLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGhhbmRsaW5nIG9mIHN0cmluZ3MKICAgd3JpdHRlbiB0byAic3lzLnN0ZG91dCIgb3IgInN5cy5zdGRlcnIiLikKCnN0ci5pc3NwYWNlKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcKICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsICJGYWxzZSIgb3RoZXJ3aXNlLgoKICAgQSBjaGFyYWN0ZXIgaXMgKndoaXRlc3BhY2UqIGlmIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZQogICAoc2VlICJ1bmljb2RlZGF0YSIpLCBlaXRoZXIgaXRzIGdlbmVyYWwgY2F0ZWdvcnkgaXMgIlpzIgogICAo4oCcU2VwYXJhdG9yLCBzcGFjZeKAnSksIG9yIGl0cyBiaWRpcmVjdGlvbmFsIGNsYXNzIGlzIG9uZSBvZiAiV1MiLAogICAiQiIsIG9yICJTIi4KCnN0ci5pc3RpdGxlKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdAogICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seQogICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuCiAgIFJldHVybiAiRmFsc2UiIG90aGVyd2lzZS4KCnN0ci5pc3VwcGVyKCkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlCiAgIHVwcGVyY2FzZSBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgIkZhbHNlIgogICBvdGhlcndpc2UuCgogICA+Pj4gJ0JBTkFOQScuaXN1cHBlcigpCiAgIFRydWUKICAgPj4+ICdiYW5hbmEnLmlzdXBwZXIoKQogICBGYWxzZQogICA+Pj4gJ2JhTmFuYScuaXN1cHBlcigpCiAgIEZhbHNlCiAgID4+PiAnICcuaXN1cHBlcigpCiAgIEZhbHNlCgpzdHIuam9pbihpdGVyYWJsZSkKCiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbgogICAqaXRlcmFibGUqLiBBICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmIHRoZXJlIGFyZSBhbnkgbm9uLQogICBzdHJpbmcgdmFsdWVzIGluICppdGVyYWJsZSosIGluY2x1ZGluZyAiYnl0ZXMiIG9iamVjdHMuICBUaGUKICAgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuCgpzdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pCgogICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4KICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSQogICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IKICAgZXF1YWwgdG8gImxlbihzKSIuCgpzdHIubG93ZXIoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XQogICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgoKICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlCiAgIFVuaWNvZGUgU3RhbmRhcmQuCgpzdHIubHN0cmlwKFtjaGFyc10pCgogICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZQogICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlCiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8KICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLAogICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOgoKICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcubHN0cmlwKCkKICAgICAgJ3NwYWNpb3VzICAgJwogICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScubHN0cmlwKCdjbW93ei4nKQogICAgICAnZXhhbXBsZS5jb20nCgogICBTZWUgInN0ci5yZW1vdmVwcmVmaXgoKSIgZm9yIGEgbWV0aG9kIHRoYXQgd2lsbCByZW1vdmUgYSBzaW5nbGUKICAgcHJlZml4IHN0cmluZyByYXRoZXIgdGhhbiBhbGwgb2YgYSBzZXQgb2YgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdBcnRodXI6IHRocmVlIScubHN0cmlwKCdBcnRodXI6ICcpCiAgICAgICdlZSEnCiAgICAgID4+PiAnQXJ0aHVyOiB0aHJlZSEnLnJlbW92ZXByZWZpeCgnQXJ0aHVyOiAnKQogICAgICAndGhyZWUhJwoKc3RhdGljIHN0ci5tYWtldHJhbnMoeFssIHlbLCB6XV0pCgogICBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIHRyYW5zbGF0aW9uIHRhYmxlIHVzYWJsZSBmb3IKICAgInN0ci50cmFuc2xhdGUoKSIuCgogICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZwogICBVbmljb2RlIG9yZGluYWxzIChpbnRlZ2Vycykgb3IgY2hhcmFjdGVycyAoc3RyaW5ncyBvZiBsZW5ndGggMSkgdG8KICAgVW5pY29kZSBvcmRpbmFscywgc3RyaW5ncyAob2YgYXJiaXRyYXJ5IGxlbmd0aHMpIG9yICJOb25lIi4KICAgQ2hhcmFjdGVyIGtleXMgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBvcmRpbmFscy4KCiAgIElmIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzLCB0aGV5IG11c3QgYmUgc3RyaW5ncyBvZiBlcXVhbCBsZW5ndGgsCiAgIGFuZCBpbiB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnksIGVhY2ggY2hhcmFjdGVyIGluIHggd2lsbCBiZSBtYXBwZWQKICAgdG8gdGhlIGNoYXJhY3RlciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB5LiAgSWYgdGhlcmUgaXMgYSB0aGlyZAogICBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hvc2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hcHBlZCB0bwogICAiTm9uZSIgaW4gdGhlIHJlc3VsdC4KCnN0ci5wYXJ0aXRpb24oc2VwKQoKICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhCiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvcgogICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3QKICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnkKICAgdHdvIGVtcHR5IHN0cmluZ3MuCgpzdHIucmVtb3ZlcHJlZml4KHByZWZpeCwgLykKCiAgIElmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqIHN0cmluZywgcmV0dXJuCiAgICJzdHJpbmdbbGVuKHByZWZpeCk6XSIuIE90aGVyd2lzZSwgcmV0dXJuIGEgY29weSBvZiB0aGUgb3JpZ2luYWwKICAgc3RyaW5nOgoKICAgICAgPj4+ICdUZXN0SG9vaycucmVtb3ZlcHJlZml4KCdUZXN0JykKICAgICAgJ0hvb2snCiAgICAgID4+PiAnQmFzZVRlc3RDYXNlJy5yZW1vdmVwcmVmaXgoJ1Rlc3QnKQogICAgICAnQmFzZVRlc3RDYXNlJwoKICAgTmV3IGluIHZlcnNpb24gMy45LgoKc3RyLnJlbW92ZXN1ZmZpeChzdWZmaXgsIC8pCgogICBJZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgKnN1ZmZpeCogc3RyaW5nIGFuZCB0aGF0ICpzdWZmaXgqIGlzCiAgIG5vdCBlbXB0eSwgcmV0dXJuICJzdHJpbmdbOi1sZW4oc3VmZml4KV0iLiBPdGhlcndpc2UsIHJldHVybiBhIGNvcHkKICAgb2YgdGhlIG9yaWdpbmFsIHN0cmluZzoKCiAgICAgID4+PiAnTWlzY1Rlc3RzJy5yZW1vdmVzdWZmaXgoJ1Rlc3RzJykKICAgICAgJ01pc2MnCiAgICAgID4+PiAnVG1wRGlyTWl4aW4nLnJlbW92ZXN1ZmZpeCgnVGVzdHMnKQogICAgICAnVG1wRGlyTWl4aW4nCgogICBOZXcgaW4gdmVyc2lvbiAzLjkuCgpzdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCoKICAgcmVwbGFjZWQgYnkgKm5ldyouICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmNvdW50KiBpcyBnaXZlbiwgb25seQogICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuCgpzdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpcwogICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gInNbc3RhcnQ6ZW5kXSIuCiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2UKICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLgoKc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKQoKICAgTGlrZSAicmZpbmQoKSIgYnV0IHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqIGlzCiAgIG5vdCBmb3VuZC4KCnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSkKCiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4KICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSQogICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IKICAgZXF1YWwgdG8gImxlbihzKSIuCgpzdHIucnBhcnRpdGlvbihzZXApCgogICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYQogICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IKICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90CiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5CiAgIHRoZSBzdHJpbmcgaXRzZWxmLgoKc3RyLnJzcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpCgogICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGUKICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0cwogICBhcmUgZG9uZSwgdGhlICpyaWdodG1vc3QqIG9uZXMuICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yCiAgICJOb25lIiwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nIGlzIGEgc2VwYXJhdG9yLiAgRXhjZXB0IGZvciBzcGxpdHRpbmcKICAgZnJvbSB0aGUgcmlnaHQsICJyc3BsaXQoKSIgYmVoYXZlcyBsaWtlICJzcGxpdCgpIiB3aGljaCBpcwogICBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LgoKc3RyLnJzdHJpcChbY2hhcnNdKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlCiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUKICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0bwogICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsCiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6CgogICAgICA+Pj4gJyAgIHNwYWNpb3VzICAgJy5yc3RyaXAoKQogICAgICAnICAgc3BhY2lvdXMnCiAgICAgID4+PiAnbWlzc2lzc2lwcGknLnJzdHJpcCgnaXB6JykKICAgICAgJ21pc3Npc3MnCgogICBTZWUgInN0ci5yZW1vdmVzdWZmaXgoKSIgZm9yIGEgbWV0aG9kIHRoYXQgd2lsbCByZW1vdmUgYSBzaW5nbGUKICAgc3VmZml4IHN0cmluZyByYXRoZXIgdGhhbiBhbGwgb2YgYSBzZXQgb2YgY2hhcmFjdGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgPj4+ICdNb250eSBQeXRob24nLnJzdHJpcCgnIFB5dGhvbicpCiAgICAgICdNJwogICAgICA+Pj4gJ01vbnR5IFB5dGhvbicucmVtb3Zlc3VmZml4KCcgUHl0aG9uJykKICAgICAgJ01vbnR5JwoKc3RyLnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSkKCiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZQogICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqCiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgIm1heHNwbGl0KzEiCiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciAiLTEiLCB0aGVuIHRoZXJlIGlzCiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS4KCiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlcgogICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLAogICAiJzEsLDInLnNwbGl0KCcsJykiIHJldHVybnMgIlsnMScsICcnLCAnMiddIikuICBUaGUgKnNlcCogYXJndW1lbnQKICAgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsCiAgICInMTw+Mjw+Mycuc3BsaXQoJzw+JykiIHJldHVybnMgIlsnMScsICcyJywgJzMnXSIpLiBTcGxpdHRpbmcgYW4KICAgZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgIlsnJ10iLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJzEsMiwzJy5zcGxpdCgnLCcpCiAgICAgIFsnMScsICcyJywgJzMnXQogICAgICA+Pj4gJzEsMiwzJy5zcGxpdCgnLCcsIG1heHNwbGl0PTEpCiAgICAgIFsnMScsICcyLDMnXQogICAgICA+Pj4gJzEsMiwsMywnLnNwbGl0KCcsJykKICAgICAgWycxJywgJzInLCAnJywgJzMnLCAnJ10KCiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgIk5vbmUiLCBhIGRpZmZlcmVudCBzcGxpdHRpbmcKICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWQKICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5ncwogICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmcKICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZwogICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgIk5vbmUiIHNlcGFyYXRvciByZXR1cm5zICJbXSIuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAnMSAyIDMnLnNwbGl0KCkKICAgICAgWycxJywgJzInLCAnMyddCiAgICAgID4+PiAnMSAyIDMnLnNwbGl0KG1heHNwbGl0PTEpCiAgICAgIFsnMScsICcyIDMnXQogICAgICA+Pj4gJyAgIDEgICAyICAgMyAgICcuc3BsaXQoKQogICAgICBbJzEnLCAnMicsICczJ10KCnN0ci5zcGxpdGxpbmVzKGtlZXBlbmRzPUZhbHNlKQoKICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZQogICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QKICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuCgogICBUaGlzIG1ldGhvZCBzcGxpdHMgb24gdGhlIGZvbGxvd2luZyBsaW5lIGJvdW5kYXJpZXMuICBJbgogICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsIG5ld2xpbmVzKi4KCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgUmVwcmVzZW50YXRpb24gICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8CiAgIHw9PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18CiAgIHwgIlxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lIEZlZWQgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxyXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx2IiBvciAiXHgwYiIgICAgICAgICAgfCBMaW5lIFRhYnVsYXRpb24gICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlxmIiBvciAiXHgwYyIgICAgICAgICAgfCBGb3JtIEZlZWQgICAgICAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWMiICAgICAgICAgICAgICAgICAgfCBGaWxlIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCBTZXBhcmF0b3IgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgU2VwYXJhdG9yICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx4ODUiICAgICAgICAgICAgICAgICAgfCBOZXh0IExpbmUgKEMxIENvbnRyb2wgQ29kZSkgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgIlx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggU2VwYXJhdG9yICAgICAgICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXHYiIGFuZCAiXGYiIGFkZGVkIHRvIGxpc3Qgb2YgbGluZQogICBib3VuZGFyaWVzLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcygpCiAgICAgIFsnYWIgYycsICcnLCAnZGUgZmcnLCAna2wnXQogICAgICA+Pj4gJ2FiIGNcblxuZGUgZmdccmtsXHJcbicuc3BsaXRsaW5lcyhrZWVwZW5kcz1UcnVlKQogICAgICBbJ2FiIGNcbicsICdcbicsICdkZSBmZ1xyJywgJ2tsXHJcbiddCgogICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzCiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsCiAgIGxpbmUgYnJlYWsgZG9lcyBub3QgcmVzdWx0IGluIGFuIGV4dHJhIGxpbmU6CgogICAgICA+Pj4gIiIuc3BsaXRsaW5lcygpCiAgICAgIFtdCiAgICAgID4+PiAiT25lIGxpbmVcbiIuc3BsaXRsaW5lcygpCiAgICAgIFsnT25lIGxpbmUnXQoKICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdCgnXG4nKSIgZ2l2ZXM6CgogICAgICA+Pj4gJycuc3BsaXQoJ1xuJykKICAgICAgWycnXQogICAgICA+Pj4gJ1R3byBsaW5lc1xuJy5zcGxpdCgnXG4nKQogICAgICBbJ1R3byBsaW5lcycsICcnXQoKc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkKCiAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlIHJldHVybgogICAiRmFsc2UiLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2sgZm9yLgogICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLgogICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCBwb3NpdGlvbi4KCnN0ci5zdHJpcChbY2hhcnNdKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nCiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUKICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqCiAgIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzCiAgIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZQogICBzdHJpcHBlZDoKCiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnN0cmlwKCkKICAgICAgJ3NwYWNpb3VzJwogICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpCiAgICAgICdleGFtcGxlJwoKICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50IHZhbHVlcyBhcmUKICAgc3RyaXBwZWQgZnJvbSB0aGUgc3RyaW5nLiBDaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGxlYWRpbmcKICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlCiAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgcGxhY2Ugb24gdGhlCiAgIHRyYWlsaW5nIGVuZC4gRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gY29tbWVudF9zdHJpbmcgPSAnIy4uLi4uLi4gU2VjdGlvbiAzLjIuMSBJc3N1ZSAjMzIgLi4uLi4uLicKICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nLnN0cmlwKCcuIyEgJykKICAgICAgJ1NlY3Rpb24gMy4yLjEgSXNzdWUgIzMyJwoKc3RyLnN3YXBjYXNlKCkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0bwogICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSB0aGF0CiAgICJzLnN3YXBjYXNlKCkuc3dhcGNhc2UoKSA9PSBzIi4KCnN0ci50aXRsZSgpCgogICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuCiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLgoKICAgRm9yIGV4YW1wbGU6CgogICAgICA+Pj4gJ0hlbGxvIHdvcmxkJy50aXRsZSgpCiAgICAgICdIZWxsbyBXb3JsZCcKCiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGEKICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluCiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZAogICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZAogICByZXN1bHQ6CgogICAgICA+Pj4gInRoZXkncmUgYmlsbCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKCkKICAgICAgIlRoZXknUmUgQmlsbCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiCgogICBUaGUgInN0cmluZy5jYXB3b3JkcygpIiBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbSwgYXMgaXQKICAgc3BsaXRzIHdvcmRzIG9uIHNwYWNlcyBvbmx5LgoKICAgQWx0ZXJuYXRpdmVseSwgYSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQKICAgdXNpbmcgcmVndWxhciBleHByZXNzaW9uczoKCiAgICAgID4+PiBpbXBvcnQgcmUKICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6CiAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKygnW0EtWmEtel0rKT8iLAogICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKS5jYXBpdGFsaXplKCksCiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKQogICAgICAuLi4KICAgICAgPj4+IHRpdGxlY2FzZSgidGhleSdyZSBiaWxsJ3MgZnJpZW5kcy4iKQogICAgICAiVGhleSdyZSBCaWxsJ3MgRnJpZW5kcy4iCgpzdHIudHJhbnNsYXRlKHRhYmxlKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyBiZWVuIG1hcHBlZAogICB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGJlIGFuIG9iamVjdAogICB0aGF0IGltcGxlbWVudHMgaW5kZXhpbmcgdmlhICJfX2dldGl0ZW1fXygpIiwgdHlwaWNhbGx5IGEgKm1hcHBpbmcqCiAgIG9yICpzZXF1ZW5jZSouICBXaGVuIGluZGV4ZWQgYnkgYSBVbmljb2RlIG9yZGluYWwgKGFuIGludGVnZXIpLCB0aGUKICAgdGFibGUgb2JqZWN0IGNhbiBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzogcmV0dXJuIGEgVW5pY29kZSBvcmRpbmFsCiAgIG9yIGEgc3RyaW5nLCB0byBtYXAgdGhlIGNoYXJhY3RlciB0byBvbmUgb3IgbW9yZSBvdGhlciBjaGFyYWN0ZXJzOwogICByZXR1cm4gIk5vbmUiLCB0byBkZWxldGUgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSByZXR1cm4gc3RyaW5nOyBvcgogICByYWlzZSBhICJMb29rdXBFcnJvciIgZXhjZXB0aW9uLCB0byBtYXAgdGhlIGNoYXJhY3RlciB0byBpdHNlbGYuCgogICBZb3UgY2FuIHVzZSAic3RyLm1ha2V0cmFucygpIiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBtYXAgZnJvbQogICBjaGFyYWN0ZXItdG8tY2hhcmFjdGVyIG1hcHBpbmdzIGluIGRpZmZlcmVudCBmb3JtYXRzLgoKICAgU2VlIGFsc28gdGhlICJjb2RlY3MiIG1vZHVsZSBmb3IgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIHRvIGN1c3RvbQogICBjaGFyYWN0ZXIgbWFwcGluZ3MuCgpzdHIudXBwZXIoKQoKICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XQogICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0ICJzLnVwcGVyKCkuaXN1cHBlcigpIiBtaWdodCBiZQogICAiRmFsc2UiIGlmICJzIiBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGUKICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90IOKAnEx14oCdIChMZXR0ZXIsCiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuIOKAnEx04oCdIChMZXR0ZXIsIHRpdGxlY2FzZSkuCgogICBUaGUgdXBwZXJjYXNpbmcgYWxnb3JpdGhtIHVzZWQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGUKICAgVW5pY29kZSBTdGFuZGFyZC4KCnN0ci56ZmlsbCh3aWR0aCkKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICInMCciIGRpZ2l0cyB0bwogICBtYWtlIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBBIGxlYWRpbmcgc2lnbiBwcmVmaXgKICAgKCInKyciLyInLSciKSBpcyBoYW5kbGVkIGJ5IGluc2VydGluZyB0aGUgcGFkZGluZyAqYWZ0ZXIqIHRoZSBzaWduCiAgIGNoYXJhY3RlciByYXRoZXIgdGhhbiBiZWZvcmUuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYKICAgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gImxlbihzKSIuCgogICBGb3IgZXhhbXBsZToKCiAgICAgID4+PiAiNDIiLnpmaWxsKDUpCiAgICAgICcwMDA0MicKICAgICAgPj4+ICItNDIiLnpmaWxsKDUpCiAgICAgICctMDA0MicK2gdzdHJpbmdzdf8jAABTdHJpbmcgYW5kIEJ5dGVzIGxpdGVyYWxzCioqKioqKioqKioqKioqKioqKioqKioqKioKClN0cmluZyBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczoKCiAgIHN0cmluZ2xpdGVyYWwgICA6Oj0gW3N0cmluZ3ByZWZpeF0oc2hvcnRzdHJpbmcgfCBsb25nc3RyaW5nKQogICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIiB8ICJmIiB8ICJGIgogICAgICAgICAgICAgICAgICAgIHwgImZyIiB8ICJGciIgfCAiZlIiIHwgIkZSIiB8ICJyZiIgfCAickYiIHwgIlJmIiB8ICJSRiIKICAgc2hvcnRzdHJpbmcgICAgIDo6PSAiJyIgc2hvcnRzdHJpbmdpdGVtKiAiJyIgfCAnIicgc2hvcnRzdHJpbmdpdGVtKiAnIicKICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiJycnIiBsb25nc3RyaW5naXRlbSogIicnJyIgfCAnIiIiJyBsb25nc3RyaW5naXRlbSogJyIiIicKICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXEKICAgbG9uZ3N0cmluZ2l0ZW0gIDo6PSBsb25nc3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcQogICBzaG9ydHN0cmluZ2NoYXIgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPgogICBsb25nc3RyaW5nY2hhciAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlwiPgogICBzdHJpbmdlc2NhcGVzZXEgOjo9ICJcIiA8YW55IHNvdXJjZSBjaGFyYWN0ZXI+CgogICBieXRlc2xpdGVyYWwgICA6Oj0gYnl0ZXNwcmVmaXgoc2hvcnRieXRlcyB8IGxvbmdieXRlcykKICAgYnl0ZXNwcmVmaXggICAgOjo9ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiIgfCAicmIiIHwgInJCIiB8ICJSYiIgfCAiUkIiCiAgIHNob3J0Ynl0ZXMgICAgIDo6PSAiJyIgc2hvcnRieXRlc2l0ZW0qICInIiB8ICciJyBzaG9ydGJ5dGVzaXRlbSogJyInCiAgIGxvbmdieXRlcyAgICAgIDo6PSAiJycnIiBsb25nYnl0ZXNpdGVtKiAiJycnIiB8ICciIiInIGxvbmdieXRlc2l0ZW0qICciIiInCiAgIHNob3J0Ynl0ZXNpdGVtIDo6PSBzaG9ydGJ5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxCiAgIGxvbmdieXRlc2l0ZW0gIDo6PSBsb25nYnl0ZXNjaGFyIHwgYnl0ZXNlc2NhcGVzZXEKICAgc2hvcnRieXRlc2NoYXIgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+CiAgIGxvbmdieXRlc2NoYXIgIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlwiPgogICBieXRlc2VzY2FwZXNlcSA6Oj0gIlwiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPgoKT25lIHN5bnRhY3RpYyByZXN0cmljdGlvbiBub3QgaW5kaWNhdGVkIGJ5IHRoZXNlIHByb2R1Y3Rpb25zIGlzIHRoYXQKd2hpdGVzcGFjZSBpcyBub3QgYWxsb3dlZCBiZXR3ZWVuIHRoZSAic3RyaW5ncHJlZml4IiBvciAiYnl0ZXNwcmVmaXgiCmFuZCB0aGUgcmVzdCBvZiB0aGUgbGl0ZXJhbC4gVGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGlzIGRlZmluZWQgYnkKdGhlIGVuY29kaW5nIGRlY2xhcmF0aW9uOyBpdCBpcyBVVEYtOCBpZiBubyBlbmNvZGluZyBkZWNsYXJhdGlvbiBpcwpnaXZlbiBpbiB0aGUgc291cmNlIGZpbGU7IHNlZSBzZWN0aW9uIEVuY29kaW5nIGRlY2xhcmF0aW9ucy4KCkluIHBsYWluIEVuZ2xpc2g6IEJvdGggdHlwZXMgb2YgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nCnNpbmdsZSBxdW90ZXMgKCInIikgb3IgZG91YmxlIHF1b3RlcyAoIiIiKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWQKaW4gbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmUKZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSBiYWNrc2xhc2gKKCJcIikgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhCnNwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGUKY2hhcmFjdGVyLgoKQnl0ZXMgbGl0ZXJhbHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoICInYiciIG9yICInQiciOyB0aGV5IHByb2R1Y2UKYW4gaW5zdGFuY2Ugb2YgdGhlICJieXRlcyIgdHlwZSBpbnN0ZWFkIG9mIHRoZSAic3RyIiB0eXBlLiAgVGhleSBtYXkKb25seSBjb250YWluIEFTQ0lJIGNoYXJhY3RlcnM7IGJ5dGVzIHdpdGggYSBudW1lcmljIHZhbHVlIG9mIDEyOCBvcgpncmVhdGVyIG11c3QgYmUgZXhwcmVzc2VkIHdpdGggZXNjYXBlcy4KCkJvdGggc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGEKbGV0dGVyICInciciIG9yICInUiciOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB0cmVhdApiYWNrc2xhc2hlcyBhcyBsaXRlcmFsIGNoYXJhY3RlcnMuICBBcyBhIHJlc3VsdCwgaW4gc3RyaW5nIGxpdGVyYWxzLAoiJ1xVJyIgYW5kICInXHUnIiBlc2NhcGVzIGluIHJhdyBzdHJpbmdzIGFyZSBub3QgdHJlYXRlZCBzcGVjaWFsbHkuCkdpdmVuIHRoYXQgUHl0aG9uIDIueOKAmXMgcmF3IHVuaWNvZGUgbGl0ZXJhbHMgYmVoYXZlIGRpZmZlcmVudGx5IHRoYW4KUHl0aG9uIDMueOKAmXMgdGhlICIndXInIiBzeW50YXggaXMgbm90IHN1cHBvcnRlZC4KCk5ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICIncmInIiBwcmVmaXggb2YgcmF3IGJ5dGVzIGxpdGVyYWxzIGhhcyBiZWVuCmFkZGVkIGFzIGEgc3lub255bSBvZiAiJ2JyJyIuU3VwcG9ydCBmb3IgdGhlIHVuaWNvZGUgbGVnYWN5IGxpdGVyYWwKKCJ1J3ZhbHVlJyIpIHdhcyByZWludHJvZHVjZWQgdG8gc2ltcGxpZnkgdGhlIG1haW50ZW5hbmNlIG9mIGR1YWwKUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKQSBzdHJpbmcgbGl0ZXJhbCB3aXRoICInZiciIG9yICInRiciIGluIGl0cyBwcmVmaXggaXMgYSAqZm9ybWF0dGVkCnN0cmluZyBsaXRlcmFsKjsgc2VlIGYtc3RyaW5ncy4gIFRoZSAiJ2YnIiBtYXkgYmUgY29tYmluZWQgd2l0aCAiJ3InIiwKYnV0IG5vdCB3aXRoICInYiciIG9yICIndSciLCB0aGVyZWZvcmUgcmF3IGZvcm1hdHRlZCBzdHJpbmdzIGFyZQpwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgbm90LgoKSW4gdHJpcGxlLXF1b3RlZCBsaXRlcmFscywgdW5lc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZXMgYXJlIGFsbG93ZWQKKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93CnRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBIOKAnHF1b3Rl4oCdIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZQpsaXRlcmFsLCBpLmUuIGVpdGhlciAiJyIgb3IgIiIiLikKCgpFc2NhcGUgc2VxdWVuY2VzCj09PT09PT09PT09PT09PT0KClVubGVzcyBhbiAiJ3InIiBvciAiJ1InIiBwcmVmaXggaXMgcHJlc2VudCwgZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcKYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZQp1c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZToKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8IEVzY2FwZSBTZXF1ZW5jZSAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHwKfD09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT18CnwgIlwiPG5ld2xpbmU+ICAgICAgICAgICAgICB8IEJhY2tzbGFzaCBhbmQgbmV3bGluZSBpZ25vcmVkICAgICB8ICgxKSAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXFwiICAgICAgICAgICAgICAgICAgICAgIHwgQmFja3NsYXNoICgiXCIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcJyIgICAgICAgICAgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKCInIikgICAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlwiIiAgICAgICAgICAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoIiIiKSAgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXGEiICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgQmVsbCAoQkVMKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcYiIgICAgICAgICAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlxmIiAgICAgICAgICAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXG4iICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgTGluZWZlZWQgKExGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcciIgICAgICAgICAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgfCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlx0IiAgICAgICAgICAgICAgICAgICAgICB8IEFTQ0lJIEhvcml6b250YWwgVGFiIChUQUIpICAgICAgICB8ICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCAiXHYiICAgICAgICAgICAgICAgICAgICAgIHwgQVNDSUkgVmVydGljYWwgVGFiIChWVCkgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcKm9vbyoiICAgICAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMiw0KSAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCnwgIlx4KmhoKiIgICAgICAgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICgzLDQpICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKCkVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSsKfCBFc2NhcGUgU2VxdWVuY2UgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09fAp8ICJcTnsqbmFtZSp9IiAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgbmFtZWQgKm5hbWUqIGluIHRoZSAgICAgfCAoNSkgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcdSp4eHh4KiIgICAgICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlICAgfCAoNikgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwp8ICJcVSp4eHh4eHh4eCoiICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAzMi1iaXQgaGV4IHZhbHVlICAgfCAoNykgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiBBIGJhY2tzbGFzaCBjYW4gYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGxpbmUgdG8gaWdub3JlIHRoZQogICBuZXdsaW5lOgoKICAgICAgPj4+ICdUaGlzIHN0cmluZyB3aWxsIG5vdCBpbmNsdWRlIFwKICAgICAgLi4uIGJhY2tzbGFzaGVzIG9yIG5ld2xpbmUgY2hhcmFjdGVycy4nCiAgICAgICdUaGlzIHN0cmluZyB3aWxsIG5vdCBpbmNsdWRlIGJhY2tzbGFzaGVzIG9yIG5ld2xpbmUgY2hhcmFjdGVycy4nCgogICBUaGUgc2FtZSByZXN1bHQgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRyaXBsZS1xdW90ZWQgc3RyaW5ncywgb3IKICAgcGFyZW50aGVzZXMgYW5kIHN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24uCgoyLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLgoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTE6IE9jdGFsIGVzY2FwZXMgd2l0aCB2YWx1ZSBsYXJnZXIgdGhhbgogICAiMG8zNzciIHByb2R1Y2UgYSAiRGVwcmVjYXRpb25XYXJuaW5nIi4gSW4gYSBmdXR1cmUgUHl0aG9uIHZlcnNpb24KICAgdGhleSB3aWxsIGJlIGEgIlN5bnRheFdhcm5pbmciIGFuZCBldmVudHVhbGx5IGEgIlN5bnRheEVycm9yIi4KCjMuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC4KCjQuIEluIGEgYnl0ZXMgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZSBieXRlCiAgIHdpdGggdGhlIGdpdmVuIHZhbHVlLiBJbiBhIHN0cmluZyBsaXRlcmFsLCB0aGVzZSBlc2NhcGVzIGRlbm90ZSBhCiAgIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlLgoKNS4gQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgbmFtZSBhbGlhc2VzIFsxXSBoYXMgYmVlbgogICBhZGRlZC4KCjYuIEV4YWN0bHkgZm91ciBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC4KCjcuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheS4gIEV4YWN0bHkgZWlnaHQgaGV4CiAgIGRpZ2l0cyBhcmUgcmVxdWlyZWQuCgpVbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluIHRoZQpzdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSByZXN1bHQqLiAgKFRoaXMKYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsCnRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzIGFsc28KaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gc3RyaW5nCmxpdGVyYWxzIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YgdW5yZWNvZ25pemVkIGVzY2FwZXMgZm9yIGJ5dGVzCmxpdGVyYWxzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNjogVW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgcHJvZHVjZSBhCiJEZXByZWNhdGlvbldhcm5pbmciLiAgSW4gYSBmdXR1cmUgUHl0aG9uIHZlcnNpb24gdGhleSB3aWxsIGJlIGEKIlN5bnRheFdhcm5pbmciIGFuZCBldmVudHVhbGx5IGEgIlN5bnRheEVycm9yIi4KCkV2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGUKYmFja3NsYXNoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdDsgZm9yIGV4YW1wbGUsICJyIlwiIiIgaXMgYSB2YWxpZApzdHJpbmcgbGl0ZXJhbCBjb25zaXN0aW5nIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBkb3VibGUKcXVvdGU7ICJyIlwiIiBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgY2Fubm90CmVuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3IGxpdGVyYWwKY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2gqIChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkIGVzY2FwZQp0aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZSBiYWNrc2xhc2gKZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzIGFzIHBhcnQKb2YgdGhlIGxpdGVyYWwsICpub3QqIGFzIGEgbGluZSBjb250aW51YXRpb24uCtoNc3Vic2NyaXB0aW9uc3WHCQAAU3Vic2NyaXB0aW9ucwoqKioqKioqKioqKioqCgpUaGUgc3Vic2NyaXB0aW9uIG9mIGFuIGluc3RhbmNlIG9mIGEgY29udGFpbmVyIGNsYXNzIHdpbGwgZ2VuZXJhbGx5CnNlbGVjdCBhbiBlbGVtZW50IGZyb20gdGhlIGNvbnRhaW5lci4gVGhlIHN1YnNjcmlwdGlvbiBvZiBhICpnZW5lcmljCmNsYXNzKiB3aWxsIGdlbmVyYWxseSByZXR1cm4gYSBHZW5lcmljQWxpYXMgb2JqZWN0LgoKICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iCgpXaGVuIGFuIG9iamVjdCBpcyBzdWJzY3JpcHRlZCwgdGhlIGludGVycHJldGVyIHdpbGwgZXZhbHVhdGUgdGhlCnByaW1hcnkgYW5kIHRoZSBleHByZXNzaW9uIGxpc3QuCgpUaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIHN1YnNjcmlwdGlvbi4gQW4Kb2JqZWN0IG1heSBzdXBwb3J0IHN1YnNjcmlwdGlvbiB0aHJvdWdoIGRlZmluaW5nIG9uZSBvciBib3RoIG9mCiJfX2dldGl0ZW1fXygpIiBhbmQgIl9fY2xhc3NfZ2V0aXRlbV9fKCkiLiBXaGVuIHRoZSBwcmltYXJ5IGlzCnN1YnNjcmlwdGVkLCB0aGUgZXZhbHVhdGVkIHJlc3VsdCBvZiB0aGUgZXhwcmVzc2lvbiBsaXN0IHdpbGwgYmUKcGFzc2VkIHRvIG9uZSBvZiB0aGVzZSBtZXRob2RzLiBGb3IgbW9yZSBkZXRhaWxzIG9uIHdoZW4KIl9fY2xhc3NfZ2V0aXRlbV9fIiBpcyBjYWxsZWQgaW5zdGVhZCBvZiAiX19nZXRpdGVtX18iLCBzZWUKX19jbGFzc19nZXRpdGVtX18gdmVyc3VzIF9fZ2V0aXRlbV9fLgoKSWYgdGhlIGV4cHJlc3Npb24gbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIGl0IHdpbGwgZXZhbHVhdGUKdG8gYSAidHVwbGUiIGNvbnRhaW5pbmcgdGhlIGl0ZW1zIG9mIHRoZSBleHByZXNzaW9uIGxpc3QuIE90aGVyd2lzZSwKdGhlIGV4cHJlc3Npb24gbGlzdCB3aWxsIGV2YWx1YXRlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbGlzdOKAmXMgc29sZQptZW1iZXIuCgpGb3IgYnVpbHQtaW4gb2JqZWN0cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvYmplY3RzIHRoYXQgc3VwcG9ydApzdWJzY3JpcHRpb24gdmlhICJfX2dldGl0ZW1fXygpIjoKCjEuIE1hcHBpbmdzLiBJZiB0aGUgcHJpbWFyeSBpcyBhICptYXBwaW5nKiwgdGhlIGV4cHJlc3Npb24gbGlzdCBtdXN0CiAgIGV2YWx1YXRlIHRvIGFuIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlCiAgIG1hcHBpbmcsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlIHZhbHVlIGluIHRoZSBtYXBwaW5nIHRoYXQKICAgY29ycmVzcG9uZHMgdG8gdGhhdCBrZXkuIEFuIGV4YW1wbGUgb2YgYSBidWlsdGluIG1hcHBpbmcgY2xhc3MgaXMKICAgdGhlICJkaWN0IiBjbGFzcy4KCjIuIFNlcXVlbmNlcy4gSWYgdGhlIHByaW1hcnkgaXMgYSAqc2VxdWVuY2UqLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QKICAgZXZhbHVhdGUgdG8gYW4gImludCIgb3IgYSAic2xpY2UiIChhcyBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZwogICBzZWN0aW9uKS4gRXhhbXBsZXMgb2YgYnVpbHRpbiBzZXF1ZW5jZSBjbGFzc2VzIGluY2x1ZGUgdGhlICJzdHIiLAogICAibGlzdCIgYW5kICJ0dXBsZSIgY2xhc3Nlcy4KClRoZSBmb3JtYWwgc3ludGF4IG1ha2VzIG5vIHNwZWNpYWwgcHJvdmlzaW9uIGZvciBuZWdhdGl2ZSBpbmRpY2VzIGluCipzZXF1ZW5jZXMqLiBIb3dldmVyLCBidWlsdC1pbiBzZXF1ZW5jZXMgYWxsIHByb3ZpZGUgYSAiX19nZXRpdGVtX18oKSIKbWV0aG9kIHRoYXQgaW50ZXJwcmV0cyBuZWdhdGl2ZSBpbmRpY2VzIGJ5IGFkZGluZyB0aGUgbGVuZ3RoIG9mIHRoZQpzZXF1ZW5jZSB0byB0aGUgaW5kZXggc28gdGhhdCwgZm9yIGV4YW1wbGUsICJ4Wy0xXSIgc2VsZWN0cyB0aGUgbGFzdAppdGVtIG9mICJ4Ii4gVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzCnRoYW4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2VxdWVuY2UsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMKdGhlIGl0ZW0gd2hvc2UgaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4gU2luY2UgdGhlCnN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgYW5kIHNsaWNpbmcgb2NjdXJzIGluIHRoZSBvYmplY3TigJlzCiJfX2dldGl0ZW1fXygpIiBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8KZXhwbGljaXRseSBhZGQgdGhhdCBzdXBwb3J0LgoKQSAic3RyaW5nIiBpcyBhIHNwZWNpYWwga2luZCBvZiBzZXF1ZW5jZSB3aG9zZSBpdGVtcyBhcmUgKmNoYXJhY3RlcnMqLgpBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhIHR5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lCmNoYXJhY3Rlci4K2gV0cnV0aGF3AwAAVHJ1dGggVmFsdWUgVGVzdGluZwoqKioqKioqKioqKioqKioqKioqCgpBbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuICJpZiIgb3IKIndoaWxlIiBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LgoKQnkgZGVmYXVsdCwgYW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgdHJ1ZSB1bmxlc3MgaXRzIGNsYXNzIGRlZmluZXMKZWl0aGVyIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCB0aGF0IHJldHVybnMgIkZhbHNlIiBvciBhICJfX2xlbl9fKCkiCm1ldGhvZCB0aGF0IHJldHVybnMgemVybywgd2hlbiBjYWxsZWQgd2l0aCB0aGUgb2JqZWN0LiBbMV0gIEhlcmUgYXJlCm1vc3Qgb2YgdGhlIGJ1aWx0LWluIG9iamVjdHMgY29uc2lkZXJlZCBmYWxzZToKCiogY29uc3RhbnRzIGRlZmluZWQgdG8gYmUgZmFsc2U6ICJOb25lIiBhbmQgIkZhbHNlIgoKKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGU6ICIwIiwgIjAuMCIsICIwaiIsICJEZWNpbWFsKDApIiwKICAiRnJhY3Rpb24oMCwgMSkiCgoqIGVtcHR5IHNlcXVlbmNlcyBhbmQgY29sbGVjdGlvbnM6ICInJyIsICIoKSIsICJbXSIsICJ7fSIsICJzZXQoKSIsCiAgInJhbmdlKDApIgoKT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0IGFsd2F5cwpyZXR1cm4gIjAiIG9yICJGYWxzZSIgZm9yIGZhbHNlIGFuZCAiMSIgb3IgIlRydWUiIGZvciB0cnVlLCB1bmxlc3MKb3RoZXJ3aXNlIHN0YXRlZC4gKEltcG9ydGFudCBleGNlcHRpb246IHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgIm9yIgphbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKQraA3RyeXUvHwAAVGhlICJ0cnkiIHN0YXRlbWVudAoqKioqKioqKioqKioqKioqKioqCgpUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZQpmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOgoKICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXQgfCB0cnkzX3N0bXQKICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGUKICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiBzdWl0ZSkrCiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdCiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgKCJleGNlcHQiICIqIiBleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdICI6IiBzdWl0ZSkrCiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdCiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdCiAgIHRyeTNfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlCiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZQoKQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uCkV4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG8gZ2VuZXJhdGUKZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiBUaGUgcmFpc2Ugc3RhdGVtZW50LgoKCiJleGNlcHQiIGNsYXVzZQo9PT09PT09PT09PT09PT0KClRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm8KZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpcwpleGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuCmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSAiZXhjZXB0IgpjbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiBBbgpleHByZXNzaW9uLWxlc3MgImV4Y2VwdCIgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMKYW55IGV4Y2VwdGlvbi4gRm9yIGFuICJleGNlcHQiIGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQKZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUKcmVzdWx0aW5nIG9iamVjdCBpcyDigJxjb21wYXRpYmxl4oCdIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcwpjb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgdGhlIGNsYXNzIG9yIGEgKm5vbi0KdmlydHVhbCBiYXNlIGNsYXNzKiBvZiB0aGUgZXhjZXB0aW9uIG9iamVjdCwgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuCml0ZW0gdGhhdCBpcyB0aGUgY2xhc3Mgb3IgYSBub24tdmlydHVhbCBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24Kb2JqZWN0LgoKSWYgbm8gImV4Y2VwdCIgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4KZXhjZXB0aW9uIGhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUKaW52b2NhdGlvbiBzdGFjay4gIFsxXQoKSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuICJleGNlcHQiIGNsYXVzZQpyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kCmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uCnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZAp0aGUgZXhjZXB0aW9uKS4KCldoZW4gYSBtYXRjaGluZyAiZXhjZXB0IiBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG8KdGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0ICJleGNlcHQiIGNsYXVzZSwKaWYgcHJlc2VudCwgYW5kIHRoZSAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLiBBbGwgImV4Y2VwdCIKY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMKcmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlICJ0cnkiCnN0YXRlbWVudC4gKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZQpleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlIG9mIHRoZSBpbm5lcgpoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pCgpXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZAphdCB0aGUgZW5kIG9mIHRoZSAiZXhjZXB0IiBjbGF1c2UuICBUaGlzIGlzIGFzIGlmCgogICBleGNlcHQgRSBhcyBOOgogICAgICAgZm9vCgp3YXMgdHJhbnNsYXRlZCB0bwoKICAgZXhjZXB0IEUgYXMgTjoKICAgICAgIHRyeToKICAgICAgICAgICBmb28KICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgZGVsIE4KClRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmUKYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgImV4Y2VwdCIgY2xhdXNlLiBFeGNlcHRpb25zIGFyZSBjbGVhcmVkCmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZQpjeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmUKdW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy4KCkJlZm9yZSBhbiAiZXhjZXB0IiBjbGF1c2XigJlzIHN1aXRlIGlzIGV4ZWN1dGVkLCB0aGUgZXhjZXB0aW9uIGlzIHN0b3JlZAppbiB0aGUgInN5cyIgbW9kdWxlLCB3aGVyZSBpdCBjYW4gYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIGJvZHkgb2YKdGhlICJleGNlcHQiIGNsYXVzZSBieSBjYWxsaW5nICJzeXMuZXhjZXB0aW9uKCkiLiBXaGVuIGxlYXZpbmcgYW4KZXhjZXB0aW9uIGhhbmRsZXIsIHRoZSBleGNlcHRpb24gc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgaXMgcmVzZXQKdG8gaXRzIHByZXZpb3VzIHZhbHVlOgoKICAgPj4+IHByaW50KHN5cy5leGNlcHRpb24oKSkKICAgTm9uZQogICA+Pj4gdHJ5OgogICAuLi4gICAgIHJhaXNlIFR5cGVFcnJvcgogICAuLi4gZXhjZXB0OgogICAuLi4gICAgIHByaW50KHJlcHIoc3lzLmV4Y2VwdGlvbigpKSkKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgIC4uLiAgICAgZXhjZXB0OgogICAuLi4gICAgICAgICBwcmludChyZXByKHN5cy5leGNlcHRpb24oKSkpCiAgIC4uLiAgICAgcHJpbnQocmVwcihzeXMuZXhjZXB0aW9uKCkpKQogICAuLi4KICAgVHlwZUVycm9yKCkKICAgVmFsdWVFcnJvcigpCiAgIFR5cGVFcnJvcigpCiAgID4+PiBwcmludChzeXMuZXhjZXB0aW9uKCkpCiAgIE5vbmUKCgoiZXhjZXB0KiIgY2xhdXNlCj09PT09PT09PT09PT09PT0KClRoZSAiZXhjZXB0KiIgY2xhdXNlKHMpIGFyZSB1c2VkIGZvciBoYW5kbGluZyAiRXhjZXB0aW9uR3JvdXAicy4gVGhlCmV4Y2VwdGlvbiB0eXBlIGZvciBtYXRjaGluZyBpcyBpbnRlcnByZXRlZCBhcyBpbiB0aGUgY2FzZSBvZiAiZXhjZXB0IiwKYnV0IGluIHRoZSBjYXNlIG9mIGV4Y2VwdGlvbiBncm91cHMgd2UgY2FuIGhhdmUgcGFydGlhbCBtYXRjaGVzIHdoZW4KdGhlIHR5cGUgbWF0Y2hlcyBzb21lIG9mIHRoZSBleGNlcHRpb25zIGluIHRoZSBncm91cC4gVGhpcyBtZWFucyB0aGF0Cm11bHRpcGxlICJleGNlcHQqIiBjbGF1c2VzIGNhbiBleGVjdXRlLCBlYWNoIGhhbmRsaW5nIHBhcnQgb2YgdGhlCmV4Y2VwdGlvbiBncm91cC4gRWFjaCBjbGF1c2UgZXhlY3V0ZXMgYXQgbW9zdCBvbmNlIGFuZCBoYW5kbGVzIGFuCmV4Y2VwdGlvbiBncm91cCBvZiBhbGwgbWF0Y2hpbmcgZXhjZXB0aW9ucy4gIEVhY2ggZXhjZXB0aW9uIGluIHRoZQpncm91cCBpcyBoYW5kbGVkIGJ5IGF0IG1vc3Qgb25lICJleGNlcHQqIiBjbGF1c2UsIHRoZSBmaXJzdCB0aGF0Cm1hdGNoZXMgaXQuCgogICA+Pj4gdHJ5OgogICAuLi4gICAgIHJhaXNlIEV4Y2VwdGlvbkdyb3VwKCJlZyIsCiAgIC4uLiAgICAgICAgIFtWYWx1ZUVycm9yKDEpLCBUeXBlRXJyb3IoMiksIE9TRXJyb3IoMyksIE9TRXJyb3IoNCldKQogICAuLi4gZXhjZXB0KiBUeXBlRXJyb3IgYXMgZToKICAgLi4uICAgICBwcmludChmJ2NhdWdodCB7dHlwZShlKX0gd2l0aCBuZXN0ZWQge2UuZXhjZXB0aW9uc30nKQogICAuLi4gZXhjZXB0KiBPU0Vycm9yIGFzIGU6CiAgIC4uLiAgICAgcHJpbnQoZidjYXVnaHQge3R5cGUoZSl9IHdpdGggbmVzdGVkIHtlLmV4Y2VwdGlvbnN9JykKICAgLi4uCiAgIGNhdWdodCA8Y2xhc3MgJ0V4Y2VwdGlvbkdyb3VwJz4gd2l0aCBuZXN0ZWQgKFR5cGVFcnJvcigyKSwpCiAgIGNhdWdodCA8Y2xhc3MgJ0V4Y2VwdGlvbkdyb3VwJz4gd2l0aCBuZXN0ZWQgKE9TRXJyb3IoMyksIE9TRXJyb3IoNCkpCiAgICAgKyBFeGNlcHRpb24gR3JvdXAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIHwgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPgogICAgIHwgRXhjZXB0aW9uR3JvdXA6IGVnCiAgICAgKy0rLS0tLS0tLS0tLS0tLS0tLSAxIC0tLS0tLS0tLS0tLS0tLS0KICAgICAgIHwgVmFsdWVFcnJvcjogMQogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQW55IHJlbWFpbmluZyBleGNlcHRpb25zIHRoYXQgd2VyZSBub3QgaGFuZGxlZCBieSBhbnkgImV4Y2VwdCoiIGNsYXVzZQphcmUgcmUtcmFpc2VkIGF0IHRoZSBlbmQsIGNvbWJpbmVkIGludG8gYW4gZXhjZXB0aW9uIGdyb3VwIGFsb25nIHdpdGgKYWxsIGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHJhaXNlZCBmcm9tIHdpdGhpbiAiZXhjZXB0KiIgY2xhdXNlcy4KCkZyb20gdmVyc2lvbiAzLjExLjQsIHdoZW4gdGhlIGVudGlyZSAiRXhjZXB0aW9uR3JvdXAiIGlzIGhhbmRsZWQgYW5kCm9ubHkgb25lIGV4Y2VwdGlvbiBpcyByYWlzZWQgZnJvbSBhbiAiZXhjZXB0KiIgY2xhdXNlLCB0aGlzIGV4Y2VwdGlvbgppcyBubyBsb25nZXIgd3JhcHBlZCB0byBmb3JtIGEgbmV3ICJFeGNlcHRpb25Hcm91cCIuCgpJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QgYW4gZXhjZXB0aW9uIGdyb3VwIGFuZCBpdHMgdHlwZSBtYXRjaGVzCm9uZSBvZiB0aGUgImV4Y2VwdCoiIGNsYXVzZXMsIGl0IGlzIGNhdWdodCBhbmQgd3JhcHBlZCBieSBhbiBleGNlcHRpb24KZ3JvdXAgd2l0aCBhbiBlbXB0eSBtZXNzYWdlIHN0cmluZy4KCiAgID4+PiB0cnk6CiAgIC4uLiAgICAgcmFpc2UgQmxvY2tpbmdJT0Vycm9yCiAgIC4uLiBleGNlcHQqIEJsb2NraW5nSU9FcnJvciBhcyBlOgogICAuLi4gICAgIHByaW50KHJlcHIoZSkpCiAgIC4uLgogICBFeGNlcHRpb25Hcm91cCgnJywgKEJsb2NraW5nSU9FcnJvcigpKSkKCkFuICJleGNlcHQqIiBjbGF1c2UgbXVzdCBoYXZlIGEgbWF0Y2hpbmcgdHlwZSwgYW5kIHRoaXMgdHlwZSBjYW5ub3QgYmUKYSBzdWJjbGFzcyBvZiAiQmFzZUV4Y2VwdGlvbkdyb3VwIi4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIG1peCAiZXhjZXB0IgphbmQgImV4Y2VwdCoiIGluIHRoZSBzYW1lICJ0cnkiLiAiYnJlYWsiLCAiY29udGludWUiIGFuZCAicmV0dXJuIgpjYW5ub3QgYXBwZWFyIGluIGFuICJleGNlcHQqIiBjbGF1c2UuCgoKImVsc2UiIGNsYXVzZQo9PT09PT09PT09PT09CgpUaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiB0aGUgY29udHJvbCBmbG93IGxlYXZlcyB0aGUKInRyeSIgc3VpdGUsIG5vIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLCBhbmQgbm8gInJldHVybiIsICJjb250aW51ZSIsIG9yCiJicmVhayIgc3RhdGVtZW50IHdhcyBleGVjdXRlZC4gIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlCm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy4KCgoiZmluYWxseSIgY2xhdXNlCj09PT09PT09PT09PT09PT0KCklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSDigJhjbGVhbnVw4oCZIGhhbmRsZXIuICBUaGUgInRyeSIKY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuCmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlCmV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQuICBJZgp0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiCmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkCmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSIKY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZApleGNlcHRpb24gaXMgZGlzY2FyZGVkOgoKICAgPj4+IGRlZiBmKCk6CiAgIC4uLiAgICAgdHJ5OgogICAuLi4gICAgICAgICAxLzAKICAgLi4uICAgICBmaW5hbGx5OgogICAuLi4gICAgICAgICByZXR1cm4gNDIKICAgLi4uCiAgID4+PiBmKCkKICAgNDIKClRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmcKZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLgoKV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZQoidHJ5IiBzdWl0ZSBvZiBhICJ0cnki4oCmImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXMKYWxzbyBleGVjdXRlZCDigJhvbiB0aGUgd2F5IG91dC7igJkKClRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iCnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYQoicmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlCmxhc3Qgb25lIGV4ZWN1dGVkOgoKICAgPj4+IGRlZiBmb28oKToKICAgLi4uICAgICB0cnk6CiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5JwogICAuLi4gICAgIGZpbmFsbHk6CiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseScKICAgLi4uCiAgID4+PiBmb28oKQogICAnZmluYWxseScKCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IFByaW9yIHRvIFB5dGhvbiAzLjgsIGEgImNvbnRpbnVlIiBzdGF0ZW1lbnQKd2FzIGlsbGVnYWwgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2UgZHVlIHRvIGEgcHJvYmxlbSB3aXRoIHRoZQppbXBsZW1lbnRhdGlvbi4KdY/LAABUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkKKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uCm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlCmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2YKUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCBudW1iZXJzLAplZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKSwgYWx0aG91Z2ggc3VjaCBhZGRpdGlvbnMKd2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC4KClNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZwrigJhzcGVjaWFsIGF0dHJpYnV0ZXMu4oCZICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZQppbXBsZW1lbnRhdGlvbiBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBUaGVpciBkZWZpbml0aW9uCm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCgpOb25lCj09PT0KClRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzCnZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lICJOb25lIi4gSXQgaXMKdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLCBlLmcuLCBpdCBpcwpyZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbuKAmXQgZXhwbGljaXRseSByZXR1cm4gYW55dGhpbmcuIEl0cwp0cnV0aCB2YWx1ZSBpcyBmYWxzZS4KCgpOb3RJbXBsZW1lbnRlZAo9PT09PT09PT09PT09PQoKVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXMKdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUKIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBzaG91bGQKcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIHRoZQpvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGUgcmVmbGVjdGVkCm9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRvci4pICBJdApzaG91bGQgbm90IGJlIGV2YWx1YXRlZCBpbiBhIGJvb2xlYW4gY29udGV4dC4KClNlZSBJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuOTogRXZhbHVhdGluZyAiTm90SW1wbGVtZW50ZWQiIGluIGEgYm9vbGVhbgpjb250ZXh0IGlzIGRlcHJlY2F0ZWQuIFdoaWxlIGl0IGN1cnJlbnRseSBldmFsdWF0ZXMgYXMgdHJ1ZSwgaXQgd2lsbAplbWl0IGEgIkRlcHJlY2F0aW9uV2FybmluZyIuIEl0IHdpbGwgcmFpc2UgYSAiVHlwZUVycm9yIiBpbiBhIGZ1dHVyZQp2ZXJzaW9uIG9mIFB5dGhvbi4KCgpFbGxpcHNpcwo9PT09PT09PQoKVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXMKdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGxpdGVyYWwgIi4uLiIgb3IgdGhlIGJ1aWx0LQppbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS4KCgoibnVtYmVycy5OdW1iZXIiCj09PT09PT09PT09PT09PT0KClRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgYnkKYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpYwpvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLiAgUHl0aG9uCm51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbCBudW1iZXJzLCBidXQKc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIGluIGNvbXB1dGVycy4KClRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBudW1lcmljIGNsYXNzZXMsIGNvbXB1dGVkIGJ5CiJfX3JlcHJfXygpIiBhbmQgIl9fc3RyX18oKSIsIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgoKKiBUaGV5IGFyZSB2YWxpZCBudW1lcmljIGxpdGVyYWxzIHdoaWNoLCB3aGVuIHBhc3NlZCB0byB0aGVpciBjbGFzcwogIGNvbnN0cnVjdG9yLCBwcm9kdWNlIGFuIG9iamVjdCBoYXZpbmcgdGhlIHZhbHVlIG9mIHRoZSBvcmlnaW5hbAogIG51bWVyaWMuCgoqIFRoZSByZXByZXNlbnRhdGlvbiBpcyBpbiBiYXNlIDEwLCB3aGVuIHBvc3NpYmxlLgoKKiBMZWFkaW5nIHplcm9zLCBwb3NzaWJseSBleGNlcHRpbmcgYSBzaW5nbGUgemVybyBiZWZvcmUgYSBkZWNpbWFsCiAgcG9pbnQsIGFyZSBub3Qgc2hvd24uCgoqIFRyYWlsaW5nIHplcm9zLCBwb3NzaWJseSBleGNlcHRpbmcgYSBzaW5nbGUgemVybyBhZnRlciBhIGRlY2ltYWwKICBwb2ludCwgYXJlIG5vdCBzaG93bi4KCiogQSBzaWduIGlzIHNob3duIG9ubHkgd2hlbiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLgoKUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kCmNvbXBsZXggbnVtYmVyczoKCgoibnVtYmVycy5JbnRlZ3JhbCIKLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2VycwoocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS4KCk5vdGU6CgogIFRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGUgbW9zdAogIG1lYW5pbmdmdWwgaW50ZXJwcmV0YXRpb24gb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9ucyBpbnZvbHZpbmcKICBuZWdhdGl2ZSBpbnRlZ2Vycy4KClRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6CgpJbnRlZ2VycyAoImludCIpCiAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIGFuIHVubGltaXRlZCByYW5nZSwgc3ViamVjdCB0byBhdmFpbGFibGUKICAgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0IGFuZCBtYXNrCiAgIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsIGFuZCBuZWdhdGl2ZQogICBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMuKAmXMgY29tcGxlbWVudCB3aGljaCBnaXZlcwogICB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlCiAgIGxlZnQuCgpCb29sZWFucyAoImJvb2wiKQogICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d28gb2JqZWN0cwogICByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHRoZSBvbmx5IEJvb2xlYW4KICAgb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIGludGVnZXIgdHlwZSwgYW5kCiAgIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmQgMSwgcmVzcGVjdGl2ZWx5LCBpbgogICBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uIGJlaW5nIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYQogICBzdHJpbmcsIHRoZSBzdHJpbmdzICIiRmFsc2UiIiBvciAiIlRydWUiIiBhcmUgcmV0dXJuZWQsCiAgIHJlc3BlY3RpdmVseS4KCgoibnVtYmVycy5SZWFsIiAoImZsb2F0IikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCllvdSBhcmUgYXQgdGhlIG1lcmN5IG9mIHRoZSB1bmRlcmx5aW5nIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIChhbmQgQyBvcgpKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4KUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUKc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yCnVzaW5nIHRoZXNlIGFyZSBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28KdGhlcmUgaXMgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mCmZsb2F0aW5nIHBvaW50IG51bWJlcnMuCgoKIm51bWJlcnMuQ29tcGxleCIgKCJjb21wbGV4IikKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWwgZG91YmxlCnByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseSBhcyBmb3IKZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhIGNvbXBsZXgKbnVtYmVyICJ6IiBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seSBhdHRyaWJ1dGVzICJ6LnJlYWwiCmFuZCAiei5pbWFnIi4KCgpTZXF1ZW5jZXMKPT09PT09PT09CgpUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZSBudW1iZXJzLgpUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgYQpzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGUgaW5kZXggc2V0IGNvbnRhaW5zCnRoZSBudW1iZXJzIDAsIDEsIOKApiwgKm4qLTEuICBJdGVtICppKiBvZiBzZXF1ZW5jZSAqYSogaXMgc2VsZWN0ZWQgYnkKImFbaV0iLiBTb21lIHNlcXVlbmNlcywgaW5jbHVkaW5nIGJ1aWx0LWluIHNlcXVlbmNlcywgaW50ZXJwcmV0Cm5lZ2F0aXZlIHN1YnNjcmlwdHMgYnkgYWRkaW5nIHRoZSBzZXF1ZW5jZSBsZW5ndGguIEZvciBleGFtcGxlLAoiYVstMl0iIGVxdWFscyAiYVtuLTJdIiwgdGhlIHNlY29uZCB0byBsYXN0IGl0ZW0gb2Ygc2VxdWVuY2UgYSB3aXRoCmxlbmd0aCAibiIuCgpTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6ICJhW2k6al0iIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGggaW5kZXgKKmsqIHN1Y2ggdGhhdCAqaSogIjw9IiAqayogIjwiICpqKi4gIFdoZW4gdXNlZCBhcyBhbiBleHByZXNzaW9uLCBhCnNsaWNlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gVGhlIGNvbW1lbnQgYWJvdmUgYWJvdXQgbmVnYXRpdmUKaW5kZXhlcyBhbHNvIGFwcGxpZXMgdG8gbmVnYXRpdmUgc2xpY2UgcG9zaXRpb25zLgoKU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IOKAnGV4dGVuZGVkIHNsaWNpbmfigJ0gd2l0aCBhIHRoaXJkIOKAnHN0ZXDigJ0KcGFyYW1ldGVyOiAiYVtpOmo6a10iIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KiB3aGVyZSAieAo9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLgoKU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OgoKCkltbXV0YWJsZSBzZXF1ZW5jZXMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpcwpjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLCB0aGVzZQpvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlciwgdGhlCmNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZSBvYmplY3QKY2Fubm90IGNoYW5nZS4pCgpUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOgoKU3RyaW5ncwogICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlIGNvZGUKICAgcG9pbnRzLiBBbGwgdGhlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSAiVSswMDAwIC0gVSsxMEZGRkYiIGNhbiBiZQogICByZXByZXNlbnRlZCBpbiBhIHN0cmluZy4gIFB5dGhvbiBkb2VzbuKAmXQgaGF2ZSBhIGNoYXIgdHlwZTsgaW5zdGVhZCwKICAgZXZlcnkgY29kZSBwb2ludCBpbiB0aGUgc3RyaW5nIGlzIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nIG9iamVjdAogICB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gIm9yZCgpIiBjb252ZXJ0cyBhIGNvZGUKICAgcG9pbnQgZnJvbSBpdHMgc3RyaW5nIGZvcm0gdG8gYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiOwogICAiY2hyKCkiIGNvbnZlcnRzIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIiB0byB0aGUKICAgY29ycmVzcG9uZGluZyBsZW5ndGggIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkCiAgIHRvIGNvbnZlcnQgYSAic3RyIiB0byAiYnl0ZXMiIHVzaW5nIHRoZSBnaXZlbiB0ZXh0IGVuY29kaW5nLCBhbmQKICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS4KClR1cGxlcwogICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgb2YgdHdvIG9yCiAgIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2YgZXhwcmVzc2lvbnMuICBBCiAgIHR1cGxlIG9mIG9uZSBpdGVtIChhIOKAmHNpbmdsZXRvbuKAmSkgY2FuIGJlIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hCiAgIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnkgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLAogICBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4KICAgZW1wdHkgdHVwbGUgY2FuIGJlIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLgoKQnl0ZXMKICAgQSBieXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIGFycmF5LiAgVGhlIGl0ZW1zIGFyZSA4LWJpdCBieXRlcywKICAgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgPD0geCA8IDI1Ni4gIEJ5dGVzIGxpdGVyYWxzCiAgIChsaWtlICJiJ2FiYyciKSBhbmQgdGhlIGJ1aWx0LWluICJieXRlcygpIiBjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZAogICB0byBjcmVhdGUgYnl0ZXMgb2JqZWN0cy4gIEFsc28sIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8KICAgc3RyaW5ncyB2aWEgdGhlICJkZWNvZGUoKSIgbWV0aG9kLgoKCk11dGFibGUgc2VxdWVuY2VzCi0tLS0tLS0tLS0tLS0tLS0tCgpNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlCnN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZgphc3NpZ25tZW50IGFuZCAiZGVsIiAoZGVsZXRlKSBzdGF0ZW1lbnRzLgoKTm90ZToKCiAgVGhlICJjb2xsZWN0aW9ucyIgYW5kICJhcnJheSIgbW9kdWxlIHByb3ZpZGUgYWRkaXRpb25hbCBleGFtcGxlcyBvZgogIG11dGFibGUgc2VxdWVuY2UgdHlwZXMuCgpUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczoKCkxpc3RzCiAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZSBmb3JtZWQKICAgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluIHNxdWFyZQogICBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyBuZWVkZWQgdG8gZm9ybQogICBsaXN0cyBvZiBsZW5ndGggMCBvciAxLikKCkJ5dGUgQXJyYXlzCiAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlCiAgIGJ1aWx0LWluICJieXRlYXJyYXkoKSIgY29uc3RydWN0b3IuICBBc2lkZSBmcm9tIGJlaW5nIG11dGFibGUgKGFuZAogICBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIHNhbWUgaW50ZXJmYWNlCiAgIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSAiYnl0ZXMiIG9iamVjdHMuCgoKU2V0IHR5cGVzCj09PT09PT09PQoKVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGUgb2JqZWN0cy4KQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLCB0aGV5IGNhbiBiZQppdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mCml0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdCBtZW1iZXJzaGlwIHRlc3RpbmcsCnJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmQgY29tcHV0aW5nIG1hdGhlbWF0aWNhbApvcGVyYXRpb25zIHN1Y2ggYXMgaW50ZXJzZWN0aW9uLCB1bmlvbiwgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYwpkaWZmZXJlbmNlLgoKRm9yIHNldCBlbGVtZW50cywgdGhlIHNhbWUgaW1tdXRhYmlsaXR5IHJ1bGVzIGFwcGx5IGFzIGZvciBkaWN0aW9uYXJ5CmtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYwpjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICIxLjAiKSwgb25seQpvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LgoKVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczoKClNldHMKICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCiAgICJzZXQoKSIgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5IHNldmVyYWwKICAgbWV0aG9kcywgc3VjaCBhcyAiYWRkKCkiLgoKRnJvemVuIHNldHMKICAgVGhlc2UgcmVwcmVzZW50IGFuIGltbXV0YWJsZSBzZXQuICBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pbgogICAiZnJvemVuc2V0KCkiIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMgaW1tdXRhYmxlIGFuZAogICAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mIGFub3RoZXIgc2V0LCBvcgogICBhcyBhIGRpY3Rpb25hcnkga2V5LgoKCk1hcHBpbmdzCj09PT09PT09CgpUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleApzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uICJhW2tdIiBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkgImsiCmZyb20gdGhlIG1hcHBpbmcgImEiOyB0aGlzIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zIGFuZCBhcyB0aGUKdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbgoibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuCgpUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZToKCgpEaWN0aW9uYXJpZXMKLS0tLS0tLS0tLS0tCgpUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseSBhcmJpdHJhcnkKdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlIGFzIGtleXMgYXJlIHZhbHVlcwpjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlciBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlCmNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdCBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZwp0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2YgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V54oCZcwpoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC4gTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlCm5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsCihlLmcuLCAiMSIgYW5kICIxLjAiKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGluZGV4CnRoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuCgpEaWN0aW9uYXJpZXMgcHJlc2VydmUgaW5zZXJ0aW9uIG9yZGVyLCBtZWFuaW5nIHRoYXQga2V5cyB3aWxsIGJlCnByb2R1Y2VkIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCBzZXF1ZW50aWFsbHkgb3ZlciB0aGUKZGljdGlvbmFyeS4gUmVwbGFjaW5nIGFuIGV4aXN0aW5nIGtleSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9yZGVyLApob3dldmVyIHJlbW92aW5nIGEga2V5IGFuZCByZS1pbnNlcnRpbmcgaXQgd2lsbCBhZGQgaXQgdG8gdGhlIGVuZAppbnN0ZWFkIG9mIGtlZXBpbmcgaXRzIG9sZCBwbGFjZS4KCkRpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInsuLi59IiBub3RhdGlvbgooc2VlIHNlY3Rpb24gRGljdGlvbmFyeSBkaXNwbGF5cykuCgpUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgImRibS5uZGJtIiBhbmQgImRibS5nbnUiIHByb3ZpZGUgYWRkaXRpb25hbApleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS4KCkNoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IERpY3Rpb25hcmllcyBkaWQgbm90IHByZXNlcnZlIGluc2VydGlvbiBvcmRlcgppbiB2ZXJzaW9ucyBvZiBQeXRob24gYmVmb3JlIDMuNi4gSW4gQ1B5dGhvbiAzLjYsIGluc2VydGlvbiBvcmRlciB3YXMKcHJlc2VydmVkLCBidXQgaXQgd2FzIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGF0IHRoYXQgdGltZQpyYXRoZXIgdGhhbiBhIGxhbmd1YWdlIGd1YXJhbnRlZS4KCgpDYWxsYWJsZSB0eXBlcwo9PT09PT09PT09PT09PQoKVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZSBzZWN0aW9uCkNhbGxzKSBjYW4gYmUgYXBwbGllZDoKCgpVc2VyLWRlZmluZWQgZnVuY3Rpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb24gZGVmaW5pdGlvbgooc2VlIHNlY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbnMpLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGFuCmFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIGZ1bmN0aW9u4oCZcwpmb3JtYWwgcGFyYW1ldGVyIGxpc3QuCgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8IGZ1bmN0aW9uLl9fZ2xvYmFsc19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlICJkaWN0aW9uYXJ5IiB0aGF0IGhvbGRzIHRoZSAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb27igJlzIGdsb2JhbCB2YXJpYWJsZXMg4oCTIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBmdW5jdGlvbi5fX2Nsb3N1cmVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBvciBhICJ0dXBsZSIgb2YgY2VsbHMgdGhhdCBjb250YWluIGJpbmRpbmdzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZvciB0aGUgZnVuY3Rpb27igJlzIGZyZWUgdmFyaWFibGVzLiAgQSBjZWxsIG9iamVjdCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGFzIHRoZSBhdHRyaWJ1dGUgImNlbGxfY29udGVudHMiLiBUaGlzIGNhbiBiZSAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXNlZCB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBjZWxsLCBhcyB3ZWxsIGFzIHNldCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKClNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlcwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KCk1vc3Qgb2YgdGhlc2UgYXR0cmlidXRlcyBjaGVjayB0aGUgdHlwZSBvZiB0aGUgYXNzaWduZWQgdmFsdWU6CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fAp8IGZ1bmN0aW9uLl9fZG9jX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9u4oCZcyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZS4gTm90IGluaGVyaXRlZCBieSBzdWJjbGFzc2VzLiAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgZnVuY3Rpb24uX19uYW1lX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb27igJlzIG5hbWUuIFNlZSBhbHNvOiAiX19uYW1lX18gICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXMiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBmdW5jdGlvbi5fX3F1YWxuYW1lX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvbuKAmXMgKnF1YWxpZmllZCBuYW1lKi4gU2VlIGFsc286ICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIl9fcXVhbG5hbWVfXyBhdHRyaWJ1dGVzIi4gIE5ldyBpbiB2ZXJzaW9uIDMuMy4gICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fbW9kdWxlX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW4sIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fZGVmYXVsdHNfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSAidHVwbGUiIGNvbnRhaW5pbmcgZGVmYXVsdCAqcGFyYW1ldGVyKiB2YWx1ZXMgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIHRob3NlIHBhcmFtZXRlcnMgdGhhdCBoYXZlIGRlZmF1bHRzLCBvciAiTm9uZSIgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWYgbm8gcGFyYW1ldGVycyBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4gICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fY29kZV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29tcGlsZWQgZnVuY3Rpb24gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYm9keS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fZGljdF9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIG5hbWVzcGFjZSBzdXBwb3J0aW5nIGFyYml0cmFyeSBmdW5jdGlvbiAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlcy4gU2VlIGFsc286ICJfX2RpY3RfXyBhdHRyaWJ1dGVzIi4gICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fYW5ub3RhdGlvbnNfXyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSAiZGljdGlvbmFyeSIgY29udGFpbmluZyBhbm5vdGF0aW9ucyBvZiAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnBhcmFtZXRlcnMqLiBUaGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeSBhcmUgdGhlICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyIG5hbWVzLCBhbmQgIidyZXR1cm4nIiBmb3IgdGhlIHJldHVybiAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5ub3RhdGlvbiwgaWYgcHJvdmlkZWQuIFNlZSBhbHNvOiBBbm5vdGF0aW9ucyAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQmVzdCBQcmFjdGljZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZ1bmN0aW9uLl9fa3dkZWZhdWx0c19fICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSAiZGljdGlvbmFyeSIgY29udGFpbmluZyBkZWZhdWx0cyBmb3Iga2V5d29yZC0gICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb25seSAqcGFyYW1ldGVycyouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnkKYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGEgdG8KZnVuY3Rpb25zLiAgUmVndWxhciBhdHRyaWJ1dGUgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0IGFuZCBzZXQgc3VjaAphdHRyaWJ1dGVzLgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9u4oCZcyBjdXJyZW50IGltcGxlbWVudGF0aW9uCm9ubHkgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvbgphdHRyaWJ1dGVzIG9uIGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCgpBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb27igJlzIGRlZmluaXRpb24gY2FuIGJlIHJldHJpZXZlZApmcm9tIGl0cyBjb2RlIG9iamVjdCAoYWNjZXNzaWJsZSB2aWEgdGhlICJfX2NvZGVfXyIgYXR0cmlidXRlKS4KCgpJbnN0YW5jZSBtZXRob2RzCi0tLS0tLS0tLS0tLS0tLS0KCkFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSBhbmQgYW55CmNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24pLgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczoKCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgbWV0aG9kLl9fc2VsZl9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZWZlcnMgdG8gdGhlIGNsYXNzIGluc3RhbmNlIG9iamVjdCB0byB3aGljaCB0aGUgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtZXRob2QgaXMgYm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgbWV0aG9kLl9fZnVuY19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZWZlcnMgdG8gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdCAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgbWV0aG9kLl9fZG9jX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaGUgbWV0aG9k4oCZcyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJtZXRob2QuX19mdW5jX18uX19kb2NfXyIpLiBBICJzdHJpbmciIGlmIHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yaWdpbmFsIGZ1bmN0aW9uIGhhZCBhIGRvY3N0cmluZywgZWxzZSAiTm9uZSIuICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBtZXRob2QuX19uYW1lX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgKHNhbWUgYXMgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJtZXRob2QuX19mdW5jX18uX19uYW1lX18iKSAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBtZXRob2QuX19tb2R1bGVfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCk1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5CmZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LgoKVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhbiBhdHRyaWJ1dGUKb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksIGlmIHRoYXQgYXR0cmlidXRlCmlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhICJjbGFzc21ldGhvZCIgb2JqZWN0LgoKV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhIHVzZXItZGVmaW5lZApmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcywgaXRzICJfX3NlbGZfXyIKYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBtZXRob2Qgb2JqZWN0IGlzIHNhaWQgdG8gYmUKKmJvdW5kKi4gIFRoZSBuZXcgbWV0aG9k4oCZcyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGUgb3JpZ2luYWwKZnVuY3Rpb24gb2JqZWN0LgoKV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhCiJjbGFzc21ldGhvZCIgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzICJfX3NlbGZfXyIKYXR0cmlidXRlIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXMgdGhlCmZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuCgpXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZyBmdW5jdGlvbgooIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzIGluc3RhbmNlICgiX19zZWxmX18iKSBpbgpmcm9udCBvZiB0aGUgYXJndW1lbnQgbGlzdC4gIEZvciBpbnN0YW5jZSwgd2hlbiAiQyIgaXMgYSBjbGFzcyB3aGljaApjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gImYoKSIsIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YKIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAiQy5mKHgsIDEpIi4KCldoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBkZXJpdmVkIGZyb20gYSAiY2xhc3NtZXRob2QiIG9iamVjdCwKdGhlIOKAnGNsYXNzIGluc3RhbmNl4oCdIHN0b3JlZCBpbiAiX19zZWxmX18iIHdpbGwgYWN0dWFsbHkgYmUgdGhlIGNsYXNzCml0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAiQy5mKDEpIiBpcyBlcXVpdmFsZW50IHRvCmNhbGxpbmcgImYoQywxKSIgd2hlcmUgImYiIGlzIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLgoKTm90ZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGZ1bmN0aW9uIG9iamVjdCB0byBpbnN0YW5jZSBtZXRob2QKb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb20gdGhlIGluc3RhbmNlLgpJbiBzb21lIGNhc2VzLCBhIGZydWl0ZnVsIG9wdGltaXphdGlvbiBpcyB0byBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhCmxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWwgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcwp0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnM7IG90aGVyIGNhbGxhYmxlCm9iamVjdHMgKGFuZCBhbGwgbm9uLWNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dAp0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2VyLWRlZmluZWQKZnVuY3Rpb25zIHdoaWNoIGFyZSBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdCBjb252ZXJ0ZWQKdG8gYm91bmQgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbgphdHRyaWJ1dGUgb2YgdGhlIGNsYXNzLgoKCkdlbmVyYXRvciBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZSBzZWN0aW9uIFRoZQp5aWVsZCBzdGF0ZW1lbnQpIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgZnVuY3Rpb24qLiAgU3VjaCBhIGZ1bmN0aW9uLAp3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gKml0ZXJhdG9yKiBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgdG8KZXhlY3V0ZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb246ICBjYWxsaW5nIHRoZSBpdGVyYXRvcuKAmXMKIml0ZXJhdG9yLl9fbmV4dF9fKCkiIG1ldGhvZCB3aWxsIGNhdXNlIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsCml0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICJ5aWVsZCIgc3RhdGVtZW50LiAgV2hlbiB0aGUgZnVuY3Rpb24KZXhlY3V0ZXMgYSAicmV0dXJuIiBzdGF0ZW1lbnQgb3IgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgIlN0b3BJdGVyYXRpb24iCmV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQpzZXQgb2YgdmFsdWVzIHRvIGJlIHJldHVybmVkLgoKCkNvcm91dGluZSBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpcyBjYWxsZWQgYQoqY29yb3V0aW5lIGZ1bmN0aW9uKi4gIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIHJldHVybnMgYQoqY29yb3V0aW5lKiBvYmplY3QuICBJdCBtYXkgY29udGFpbiAiYXdhaXQiIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzCiJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgc3RhdGVtZW50cy4gU2VlIGFsc28gdGhlIENvcm91dGluZQpPYmplY3RzIHNlY3Rpb24uCgoKQXN5bmNocm9ub3VzIGdlbmVyYXRvciBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIGlzIGRlZmluZWQgdXNpbmcgImFzeW5jIGRlZiIgYW5kIHdoaWNoIHVzZXMKdGhlICJ5aWVsZCIgc3RhdGVtZW50IGlzIGNhbGxlZCBhICphc3luY2hyb25vdXMgZ2VuZXJhdG9yIGZ1bmN0aW9uKi4KU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgcmV0dXJucyBhbiAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKgpvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgaW4gYW4gImFzeW5jIGZvciIgc3RhdGVtZW50IHRvIGV4ZWN1dGUgdGhlCmJvZHkgb2YgdGhlIGZ1bmN0aW9uLgoKQ2FsbGluZyB0aGUgYXN5bmNocm9ub3VzIGl0ZXJhdG9y4oCZcyAiYWl0ZXJhdG9yLl9fYW5leHRfXyIgbWV0aG9kIHdpbGwKcmV0dXJuIGFuICphd2FpdGFibGUqIHdoaWNoIHdoZW4gYXdhaXRlZCB3aWxsIGV4ZWN1dGUgdW50aWwgaXQKcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgInlpZWxkIiBleHByZXNzaW9uLiAgV2hlbiB0aGUgZnVuY3Rpb24KZXhlY3V0ZXMgYW4gZW1wdHkgInJldHVybiIgc3RhdGVtZW50IG9yIGZhbGxzIG9mZiB0aGUgZW5kLCBhCiJTdG9wQXN5bmNJdGVyYXRpb24iIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSBhc3luY2hyb25vdXMgaXRlcmF0b3IKd2lsbCBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZSB5aWVsZGVkLgoKCkJ1aWx0LWluIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0KCkEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLiAgRXhhbXBsZXMKb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSIgKCJtYXRoIiBpcyBhCnN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBhcmUKZGV0ZXJtaW5lZCBieSB0aGUgQyBmdW5jdGlvbi4gU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczoKCiogIl9fZG9jX18iIGlzIHRoZSBmdW5jdGlvbuKAmXMgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZgogIHVuYXZhaWxhYmxlLiBTZWUgImZ1bmN0aW9uLl9fZG9jX18iLgoKKiAiX19uYW1lX18iIGlzIHRoZSBmdW5jdGlvbuKAmXMgbmFtZS4gU2VlICJmdW5jdGlvbi5fX25hbWVfXyIuCgoqICJfX3NlbGZfXyIgaXMgc2V0IHRvICJOb25lIiAoYnV0IHNlZSB0aGUgbmV4dCBpdGVtKS4KCiogIl9fbW9kdWxlX18iIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluCiAgb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiBTZWUgImZ1bmN0aW9uLl9fbW9kdWxlX18iLgoKCkJ1aWx0LWluIG1ldGhvZHMKLS0tLS0tLS0tLS0tLS0tLQoKVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpcyB0aW1lCmNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhbiBpbXBsaWNpdCBleHRyYQphcmd1bWVudC4gIEFuIGV4YW1wbGUgb2YgYSBidWlsdC1pbiBtZXRob2QgaXMgImFsaXN0LmFwcGVuZCgpIiwKYXNzdW1pbmcgKmFsaXN0KiBpcyBhIGxpc3Qgb2JqZWN0LiBJbiB0aGlzIGNhc2UsIHRoZSBzcGVjaWFsIHJlYWQtb25seQphdHRyaWJ1dGUgIl9fc2VsZl9fIiBpcyBzZXQgdG8gdGhlIG9iamVjdCBkZW5vdGVkIGJ5ICphbGlzdCouIChUaGUKYXR0cmlidXRlIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgaXQgZG9lcyB3aXRoICJvdGhlciBpbnN0YW5jZQptZXRob2RzIi4pCgoKQ2xhc3NlcwotLS0tLS0tCgpDbGFzc2VzIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzIGZhY3RvcmllcyBmb3IgbmV3Cmluc3RhbmNlcyBvZiB0aGVtc2VsdmVzLCBidXQgdmFyaWF0aW9ucyBhcmUgcG9zc2libGUgZm9yIGNsYXNzIHR5cGVzCnRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsIGFyZSBwYXNzZWQgdG8KIl9fbmV3X18oKSIgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0byAiX19pbml0X18oKSIgdG8gaW5pdGlhbGl6ZQp0aGUgbmV3IGluc3RhbmNlLgoKCkNsYXNzIEluc3RhbmNlcwotLS0tLS0tLS0tLS0tLS0KCkluc3RhbmNlcyBvZiBhcmJpdHJhcnkgY2xhc3NlcyBjYW4gYmUgbWFkZSBjYWxsYWJsZSBieSBkZWZpbmluZyBhCiJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuCgoKTW9kdWxlcwo9PT09PT09CgpNb2R1bGVzIGFyZSBhIGJhc2ljIG9yZ2FuaXphdGlvbmFsIHVuaXQgb2YgUHl0aG9uIGNvZGUsIGFuZCBhcmUKY3JlYXRlZCBieSB0aGUgaW1wb3J0IHN5c3RlbSBhcyBpbnZva2VkIGVpdGhlciBieSB0aGUgImltcG9ydCIKc3RhdGVtZW50LCBvciBieSBjYWxsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzICJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIgphbmQgYnVpbHQtaW4gIl9faW1wb3J0X18oKSIuICBBIG1vZHVsZSBvYmplY3QgaGFzIGEgbmFtZXNwYWNlCmltcGxlbWVudGVkIGJ5IGEgImRpY3Rpb25hcnkiIG9iamVjdCAodGhpcyBpcyB0aGUgZGljdGlvbmFyeQpyZWZlcmVuY2VkIGJ5IHRoZSAiX19nbG9iYWxzX18iIGF0dHJpYnV0ZSBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUKbW9kdWxlKS4gIEF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcwpkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0iLiBBIG1vZHVsZQpvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZSBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUKKHNpbmNlIGl0IGlzbuKAmXQgbmVlZGVkIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUpLgoKQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxl4oCZcyBuYW1lc3BhY2UgZGljdGlvbmFyeSwgZS5nLiwKIm0ueCA9IDEiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSA9IDEiLgoKUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6CgogICAiX19uYW1lX18iCiAgICAgIFRoZSBtb2R1bGXigJlzIG5hbWUuCgogICAiX19kb2NfXyIKICAgICAgVGhlIG1vZHVsZeKAmXMgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS4KCiAgICJfX2ZpbGVfXyIKICAgICAgVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdAogICAgICB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGUgIl9fZmlsZV9fIiBhdHRyaWJ1dGUgbWF5IGJlIG1pc3NpbmcKICAgICAgZm9yIGNlcnRhaW4gdHlwZXMgb2YgbW9kdWxlcywgc3VjaCBhcyBDIG1vZHVsZXMgdGhhdCBhcmUKICAgICAgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXIuICBGb3IgZXh0ZW5zaW9uIG1vZHVsZXMKICAgICAgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXTigJlzIHRoZSBwYXRobmFtZSBvZgogICAgICB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS4KCiAgICJfX2Fubm90YXRpb25zX18iCiAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nICp2YXJpYWJsZSBhbm5vdGF0aW9ucyogY29sbGVjdGVkIGR1cmluZwogICAgICBtb2R1bGUgYm9keSBleGVjdXRpb24uICBGb3IgYmVzdCBwcmFjdGljZXMgb24gd29ya2luZyB3aXRoCiAgICAgICJfX2Fubm90YXRpb25zX18iLCBwbGVhc2Ugc2VlIEFubm90YXRpb25zIEJlc3QgUHJhY3RpY2VzLgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGXigJlzIG5hbWVzcGFjZSBhcyBhCmRpY3Rpb25hcnkgb2JqZWN0LgoKKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBCZWNhdXNlIG9mIHRoZSB3YXkgQ1B5dGhvbiBjbGVhcnMKbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZQptb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzIGxpdmUKcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCB0aGUgbW9kdWxlCmFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS4KCgpDdXN0b20gY2xhc3Nlcwo9PT09PT09PT09PT09PQoKQ3VzdG9tIGNsYXNzIHR5cGVzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucyAoc2VlCnNlY3Rpb24gQ2xhc3MgZGVmaW5pdGlvbnMpLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnkgYQpkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8KbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJDLngiIGlzIHRyYW5zbGF0ZWQgdG8KIkMuX19kaWN0X19bIngiXSIgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvdwpmb3Igb3RoZXIgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzCm5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlIGNsYXNzZXMuClRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIKd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2Yg4oCYZGlhbW9uZOKAmSBpbmhlcml0YW5jZQpzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8KYSBjb21tb24gYW5jZXN0b3IuIEFkZGl0aW9uYWwgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbgpiZSBmb3VuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuMyByZWxlYXNlIGF0Cmh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uCgpXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzICJDIiwgc2F5KSB3b3VsZCB5aWVsZCBhCmNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdAp3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyAiQyIuIFdoZW4gaXQgd291bGQgeWllbGQgYQoic3RhdGljbWV0aG9kIiBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkIGJ5CnRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzIGZvcgphbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5IGRpZmZlciBmcm9tCnRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgIl9fZGljdF9fIi4KCkNsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNz4oCZcyBkaWN0aW9uYXJ5LCBuZXZlciB0aGUKZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuCgpBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgaW5zdGFuY2UKKHNlZSBiZWxvdykuCgpTcGVjaWFsIGF0dHJpYnV0ZXM6CgogICAiX19uYW1lX18iCiAgICAgIFRoZSBjbGFzcyBuYW1lLgoKICAgIl9fbW9kdWxlX18iCiAgICAgIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkLgoKICAgIl9fZGljdF9fIgogICAgICBUaGUgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzc+KAmXMgbmFtZXNwYWNlLgoKICAgIl9fYmFzZXNfXyIKICAgICAgQSB0dXBsZSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluIHRoZSBvcmRlciBvZiB0aGVpcgogICAgICBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3QuCgogICAiX19kb2NfXyIKICAgICAgVGhlIGNsYXNz4oCZcyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmIHVuZGVmaW5lZC4KCiAgICJfX2Fubm90YXRpb25zX18iCiAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nICp2YXJpYWJsZSBhbm5vdGF0aW9ucyogY29sbGVjdGVkIGR1cmluZwogICAgICBjbGFzcyBib2R5IGV4ZWN1dGlvbi4gIEZvciBiZXN0IHByYWN0aWNlcyBvbiB3b3JraW5nIHdpdGgKICAgICAgIl9fYW5ub3RhdGlvbnNfXyIsIHBsZWFzZSBzZWUgQW5ub3RhdGlvbnMgQmVzdCBQcmFjdGljZXMuCgoKQ2xhc3MgaW5zdGFuY2VzCj09PT09PT09PT09PT09PQoKQSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgYSBjbGFzcyBvYmplY3QgKHNlZSBhYm92ZSkuICBBCmNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgd2hpY2ggaXMKdGhlIGZpcnN0IHBsYWNlIGluIHdoaWNoIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSBzZWFyY2hlZC4gIFdoZW4gYW4KYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZeKAmXMgY2xhc3MgaGFzIGFuCmF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzCmF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkCmZ1bmN0aW9uIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0Cndob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZS4gIFN0YXRpYyBtZXRob2QgYW5kIGNsYXNzCm1ldGhvZCBvYmplY3RzIGFyZSBhbHNvIHRyYW5zZm9ybWVkOyBzZWUgYWJvdmUgdW5kZXIg4oCcQ2xhc3Nlc+KAnS4gIFNlZQpzZWN0aW9uIEltcGxlbWVudGluZyBEZXNjcmlwdG9ycyBmb3IgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcwpvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXkgZGlmZmVyIGZyb20gdGhlIG9iamVjdHMKYWN0dWFsbHkgc3RvcmVkIGluIHRoZSBjbGFzc+KAmXMgIl9fZGljdF9fIi4gIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcwpmb3VuZCwgYW5kIHRoZSBvYmplY3TigJlzIGNsYXNzIGhhcyBhICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMKY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC4KCkF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2XigJlzIGRpY3Rpb25hcnksCm5ldmVyIGEgY2xhc3PigJlzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGEgIl9fc2V0YXR0cl9fKCkiIG9yCiJfX2RlbGF0dHJfXygpIiBtZXRob2QsIHRoaXMgaXMgY2FsbGVkIGluc3RlYWQgb2YgdXBkYXRpbmcgdGhlCmluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuCgpDbGFzcyBpbnN0YW5jZXMgY2FuIHByZXRlbmQgdG8gYmUgbnVtYmVycywgc2VxdWVuY2VzLCBvciBtYXBwaW5ncyBpZgp0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uIFNwZWNpYWwKbWV0aG9kIG5hbWVzLgoKU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19kaWN0X18iIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTsKIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNl4oCZcyBjbGFzcy4KCgpJL08gb2JqZWN0cyAoYWxzbyBrbm93biBhcyBmaWxlIG9iamVjdHMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkEgKmZpbGUgb2JqZWN0KiByZXByZXNlbnRzIGFuIG9wZW4gZmlsZS4gIFZhcmlvdXMgc2hvcnRjdXRzIGFyZQphdmFpbGFibGUgdG8gY3JlYXRlIGZpbGUgb2JqZWN0czogdGhlICJvcGVuKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQKYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiIG1ldGhvZCBvZgpzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHMgcHJvdmlkZWQgYnkKZXh0ZW5zaW9uIG1vZHVsZXMpLgoKVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZSBpbml0aWFsaXplZAp0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJwcmV0ZXLigJlzIHN0YW5kYXJkIGlucHV0LApvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXM7IHRoZXkgYXJlIGFsbCBvcGVuIGluIHRleHQgbW9kZSBhbmQgdGhlcmVmb3JlCmZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy4KCgpJbnRlcm5hbCB0eXBlcwo9PT09PT09PT09PT09PQoKQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byB0aGUKdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUKaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLgoKCkNvZGUgb2JqZWN0cwotLS0tLS0tLS0tLS0KCkNvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsIG9yCipieXRlY29kZSouIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb2RlIG9iamVjdCBhbmQgYSBmdW5jdGlvbiBvYmplY3QKaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0IHJlZmVyZW5jZSB0byB0aGUKZnVuY3Rpb27igJlzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUKb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZQpzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgbm90IGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5CnJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdCBydW4tdGltZSkuICBVbmxpa2UgZnVuY3Rpb24gb2JqZWN0cywKY29kZSBvYmplY3RzIGFyZSBpbW11dGFibGUgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IKaW5kaXJlY3RseSkgdG8gbXV0YWJsZSBvYmplY3RzLgoKClNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMKfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvbiBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3F1YWxuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSAgTmV3IGluIHZlcnNpb24gIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMuMTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2FyZ2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSB0b3RhbCBudW1iZXIgb2YgcG9zaXRpb25hbCAqcGFyYW1ldGVycyogICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgYW5kICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcykgdGhhdCB0aGUgZnVuY3Rpb24gIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3Bvc29ubHlhcmdjb3VudCAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5ICpwYXJhbWV0ZXJzKiAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpIHRoYXQgdGhlIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2t3b25seWFyZ2NvdW50ICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2Yga2V5d29yZC1vbmx5ICpwYXJhbWV0ZXJzKiAoaW5jbHVkaW5nIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzKSB0aGF0IHRoZSBmdW5jdGlvbiAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25sb2NhbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbmNsdWRpbmcgcGFyYW1ldGVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3Zhcm5hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWwgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhcmlhYmxlcyBpbiB0aGUgZnVuY3Rpb24gKHN0YXJ0aW5nIHdpdGggdGhlICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlciBuYW1lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NlbGx2YXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBsb2NhbCB2YXJpYWJsZXMgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgbmVzdGVkIGZ1bmN0aW9ucyBpbnNpZGUgdGhlIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZyZWV2YXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlIHZhcmlhYmxlcyAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluIHRoZSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2YgKmJ5dGVjb2RlKiAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluc3RydWN0aW9ucyBpbiB0aGUgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2NvbnN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICpieXRlY29kZSogaW4gdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX25hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgInR1cGxlIiBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICpieXRlY29kZSogaW4gdGhlIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbXBpbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZpcnN0bGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSBsaW5lIG51bWJlciBvZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZnVuY3Rpb24gIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2xub3RhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20gKmJ5dGVjb2RlKiAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mZnNldHMgdG8gbGluZSBudW1iZXJzLiBGb3IgZGV0YWlscywgc2VlIHRoZSAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvdXJjZSBjb2RlIG9mIHRoZSBpbnRlcnByZXRlci4gICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX3N0YWNrc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRoZSByZXF1aXJlZCBzdGFjayBzaXplIG9mIHRoZSBjb2RlIG9iamVjdCAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBjb2Rlb2JqZWN0LmNvX2ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFuICJpbnRlZ2VyIiBlbmNvZGluZyBhIG51bWJlciBvZiBmbGFncyBmb3IgdGhlICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludGVycHJldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKClRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciAiY29fZmxhZ3MiOiBiaXQgIjB4MDQiIGlzIHNldAppZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIiphcmd1bWVudHMiIHN5bnRheCB0byBhY2NlcHQgYW4gYXJiaXRyYXJ5Cm51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMKdGhlICIqKmtleXdvcmRzIiBzeW50YXggdG8gYWNjZXB0IGFyYml0cmFyeSBrZXl3b3JkIGFyZ3VtZW50czsgYml0CiIweDIwIiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLiBTZWUgQ29kZSBPYmplY3RzIEJpdApGbGFncyBmb3IgZGV0YWlscyBvbiB0aGUgc2VtYW50aWNzIG9mIGVhY2ggZmxhZ3MgdGhhdCBtaWdodCBiZQpwcmVzZW50LgoKRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zICgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIpIGFsc28KdXNlIGJpdHMgaW4gImNvX2ZsYWdzIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgY29kZSBvYmplY3Qgd2FzIGNvbXBpbGVkCndpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0ICIweDIwMDAiIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24Kd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlIGRpdmlzaW9uIGVuYWJsZWQ7IGJpdHMgIjB4MTAiIGFuZCAiMHgxMDAwIgp3ZXJlIHVzZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uCgpPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuCgpJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW4gImNvX2NvbnN0cyIKaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3IgIk5vbmUiIGlmIHVuZGVmaW5lZC4KCgpNZXRob2RzIG9uIGNvZGUgb2JqZWN0cwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoKY29kZW9iamVjdC5jb19wb3NpdGlvbnMoKQoKICAgUmV0dXJucyBhbiBpdGVyYWJsZSBvdmVyIHRoZSBzb3VyY2UgY29kZSBwb3NpdGlvbnMgb2YgZWFjaAogICAqYnl0ZWNvZGUqIGluc3RydWN0aW9uIGluIHRoZSBjb2RlIG9iamVjdC4KCiAgIFRoZSBpdGVyYXRvciByZXR1cm5zICJ0dXBsZSJzIGNvbnRhaW5pbmcgdGhlICIoc3RhcnRfbGluZSwKICAgZW5kX2xpbmUsIHN0YXJ0X2NvbHVtbiwgZW5kX2NvbHVtbikiLiBUaGUgKmktdGgqIHR1cGxlIGNvcnJlc3BvbmRzCiAgIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCBjb21waWxlZCB0byB0aGUgKmktdGgqIGNvZGUKICAgdW5pdC4gQ29sdW1uIGluZm9ybWF0aW9uIGlzIDAtaW5kZXhlZCB1dGYtOCBieXRlIG9mZnNldHMgb24gdGhlCiAgIGdpdmVuIHNvdXJjZSBsaW5lLgoKICAgVGhpcyBwb3NpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBiZSBtaXNzaW5nLiBBIG5vbi1leGhhdXN0aXZlIGxpc3RzCiAgIG9mIGNhc2VzIHdoZXJlIHRoaXMgbWF5IGhhcHBlbjoKCiAgICogUnVubmluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCAiLVgiICJub19kZWJ1Z19yYW5nZXMiLgoKICAgKiBMb2FkaW5nIGEgcHljIGZpbGUgY29tcGlsZWQgd2hpbGUgdXNpbmcgIi1YIiAibm9fZGVidWdfcmFuZ2VzIi4KCiAgICogUG9zaXRpb24gdHVwbGVzIGNvcnJlc3BvbmRpbmcgdG8gYXJ0aWZpY2lhbCBpbnN0cnVjdGlvbnMuCgogICAqIExpbmUgYW5kIGNvbHVtbiBudW1iZXJzIHRoYXQgY2Fu4oCZdCBiZSByZXByZXNlbnRlZCBkdWUgdG8KICAgICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBsaW1pdGF0aW9ucy4KCiAgIFdoZW4gdGhpcyBvY2N1cnMsIHNvbWUgb3IgYWxsIG9mIHRoZSB0dXBsZSBlbGVtZW50cyBjYW4gYmUgIk5vbmUiLgoKICAgTmV3IGluIHZlcnNpb24gMy4xMS4KCiAgIE5vdGU6CgogICAgIFRoaXMgZmVhdHVyZSByZXF1aXJlcyBzdG9yaW5nIGNvbHVtbiBwb3NpdGlvbnMgaW4gY29kZSBvYmplY3RzCiAgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBhIHNtYWxsIGluY3JlYXNlIG9mIGRpc2sgdXNhZ2Ugb2YgY29tcGlsZWQKICAgICBQeXRob24gZmlsZXMgb3IgaW50ZXJwcmV0ZXIgbWVtb3J5IHVzYWdlLiBUbyBhdm9pZCBzdG9yaW5nIHRoZQogICAgIGV4dHJhIGluZm9ybWF0aW9uIGFuZC9vciBkZWFjdGl2YXRlIHByaW50aW5nIHRoZSBleHRyYSB0cmFjZWJhY2sKICAgICBpbmZvcm1hdGlvbiwgdGhlICItWCIgIm5vX2RlYnVnX3JhbmdlcyIgY29tbWFuZCBsaW5lIGZsYWcgb3IgdGhlCiAgICAgIlBZVEhPTk5PREVCVUdSQU5HRVMiIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkLgoKY29kZW9iamVjdC5jb19saW5lcygpCgogICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIGluZm9ybWF0aW9uIGFib3V0IHN1Y2Nlc3NpdmUgcmFuZ2VzCiAgIG9mICpieXRlY29kZSpzLiBFYWNoIGl0ZW0geWllbGRlZCBpcyBhICIoc3RhcnQsIGVuZCwgbGluZW5vKSIKICAgInR1cGxlIjoKCiAgICogInN0YXJ0IiAoYW4gImludCIpIHJlcHJlc2VudHMgdGhlIG9mZnNldCAoaW5jbHVzaXZlKSBvZiB0aGUgc3RhcnQKICAgICBvZiB0aGUgKmJ5dGVjb2RlKiByYW5nZQoKICAgKiAiZW5kIiAoYW4gImludCIpIHJlcHJlc2VudHMgdGhlIG9mZnNldCAoZXhjbHVzaXZlKSBvZiB0aGUgZW5kIG9mCiAgICAgdGhlICpieXRlY29kZSogcmFuZ2UKCiAgICogImxpbmVubyIgaXMgYW4gImludCIgcmVwcmVzZW50aW5nIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKICAgICAqYnl0ZWNvZGUqIHJhbmdlLCBvciAiTm9uZSIgaWYgdGhlIGJ5dGVjb2RlcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UKICAgICBoYXZlIG5vIGxpbmUgbnVtYmVyCgogICBUaGUgaXRlbXMgeWllbGRlZCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgoKICAgKiBUaGUgZmlyc3QgcmFuZ2UgeWllbGRlZCB3aWxsIGhhdmUgYSAic3RhcnQiIG9mIDAuCgogICAqIFRoZSAiKHN0YXJ0LCBlbmQpIiByYW5nZXMgd2lsbCBiZSBub24tZGVjcmVhc2luZyBhbmQgY29uc2VjdXRpdmUuCiAgICAgVGhhdCBpcywgZm9yIGFueSBwYWlyIG9mICJ0dXBsZSJzLCB0aGUgInN0YXJ0IiBvZiB0aGUgc2Vjb25kIHdpbGwKICAgICBiZSBlcXVhbCB0byB0aGUgImVuZCIgb2YgdGhlIGZpcnN0LgoKICAgKiBObyByYW5nZSB3aWxsIGJlIGJhY2t3YXJkczogImVuZCA+PSBzdGFydCIgZm9yIGFsbCB0cmlwbGVzLgoKICAgKiBUaGUgbGFzdCAidHVwbGUiIHlpZWxkZWQgd2lsbCBoYXZlICJlbmQiIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZQogICAgICpieXRlY29kZSouCgogICBaZXJvLXdpZHRoIHJhbmdlcywgd2hlcmUgInN0YXJ0ID09IGVuZCIsIGFyZSBhbGxvd2VkLiBaZXJvLXdpZHRoCiAgIHJhbmdlcyBhcmUgdXNlZCBmb3IgbGluZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgc291cmNlIGNvZGUsIGJ1dAogICBoYXZlIGJlZW4gZWxpbWluYXRlZCBieSB0aGUgKmJ5dGVjb2RlKiBjb21waWxlci4KCiAgIE5ldyBpbiB2ZXJzaW9uIDMuMTAuCgogICBTZWUgYWxzbzoKCiAgICAgKipQRVAgNjI2KiogLSBQcmVjaXNlIGxpbmUgbnVtYmVycyBmb3IgZGVidWdnaW5nIGFuZCBvdGhlciB0b29scy4KICAgICAgICBUaGUgUEVQIHRoYXQgaW50cm9kdWNlZCB0aGUgImNvX2xpbmVzKCkiIG1ldGhvZC4KCmNvZGVvYmplY3QucmVwbGFjZSgqKmt3YXJncykKCiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGNvZGUgb2JqZWN0IHdpdGggbmV3IHZhbHVlcyBmb3IgdGhlIHNwZWNpZmllZAogICBmaWVsZHMuCgogICBOZXcgaW4gdmVyc2lvbiAzLjguCgoKRnJhbWUgb2JqZWN0cwotLS0tLS0tLS0tLS0tCgpGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW4gdHJhY2ViYWNrCm9iamVjdHMsIGFuZCBhcmUgYWxzbyBwYXNzZWQgdG8gcmVnaXN0ZXJlZCB0cmFjZSBmdW5jdGlvbnMuCgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcwp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9pbnRzIHRvIHRoZSBwcmV2aW91cyBzdGFjayBmcmFtZSAodG93YXJkcyB0aGUgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2FsbGVyKSwgb3IgIk5vbmUiIGlmIHRoaXMgaXMgdGhlIGJvdHRvbSBzdGFjayAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXMgZnJhbWUuICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWNjZXNzaW5nIHRoaXMgYXR0cmlidXRlIHJhaXNlcyBhbiBhdWRpdGluZyBldmVudCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIm9iamVjdC5fX2dldGF0dHJfXyIgd2l0aCBhcmd1bWVudHMgIm9iaiIgYW5kICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIiJmX2NvZGUiIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbG9jYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBsb2NhbCAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfZ2xvYmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBnbG9iYWwgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfYnVpbHRpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGRpY3Rpb25hcnkgdXNlZCBieSB0aGUgZnJhbWUgdG8gbG9vayB1cCBidWlsdC0gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW4gKGludHJpbnNpYykgbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbGFzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIOKAnHByZWNpc2UgaW5zdHJ1Y3Rpb27igJ0gb2YgdGhlIGZyYW1lIG9iamVjdCAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlICpieXRlY29kZSogc3RyaW5nIG9mICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb2RlIG9iamVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXMKfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSWYgbm90ICJOb25lIiwgdGhpcyBpcyBhIGZ1bmN0aW9uIGNhbGxlZCBmb3IgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFyaW91cyBldmVudHMgZHVyaW5nIGNvZGUgZXhlY3V0aW9uICh0aGlzIGlzIHVzZWQgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYnkgZGVidWdnZXJzKS4gTm9ybWFsbHkgYW4gZXZlbnQgaXMgdHJpZ2dlcmVkIGZvciAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWFjaCBuZXcgc291cmNlIGxpbmUgKHNlZSAiZl90cmFjZV9saW5lcyIpLiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2VfbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IHRoaXMgYXR0cmlidXRlIHRvICJGYWxzZSIgdG8gZGlzYWJsZSAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJpZ2dlcmluZyBhIHRyYWNpbmcgZXZlbnQgZm9yIGVhY2ggc291cmNlIGxpbmUuICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfdHJhY2Vfb3Bjb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0IHRoaXMgYXR0cmlidXRlIHRvICJUcnVlIiB0byBhbGxvdyBwZXItb3Bjb2RlICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXZlbnRzIHRvIGJlIHJlcXVlc3RlZC4gTm90ZSB0aGF0IHRoaXMgbWF5IGxlYWQgdG8gfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5kZWZpbmVkIGludGVycHJldGVyIGJlaGF2aW91ciBpZiBleGNlcHRpb25zICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmFpc2VkIGJ5IHRoZSB0cmFjZSBmdW5jdGlvbiBlc2NhcGUgdG8gdGhlICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gYmVpbmcgdHJhY2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGZyYW1lLmZfbGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2YgdGhlIGZyYW1lIOKAkyB3cml0aW5nIHRvICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHMgdG8gdGhlICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkZWJ1Z2dlciBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0ICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZyB0byB0aGlzIGF0dHJpYnV0ZS4gICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRnJhbWUgb2JqZWN0IG1ldGhvZHMKfn5+fn5+fn5+fn5+fn5+fn5+fn4KCkZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOgoKZnJhbWUuY2xlYXIoKQoKICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkIGJ5IHRoZQogICBmcmFtZS4gIEFsc28sIGlmIHRoZSBmcmFtZSBiZWxvbmdlZCB0byBhICpnZW5lcmF0b3IqLCB0aGUgZ2VuZXJhdG9yCiAgIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlIGN5Y2xlcyBpbnZvbHZpbmcgZnJhbWUKICAgb2JqZWN0cyAoZm9yIGV4YW1wbGUgd2hlbiBjYXRjaGluZyBhbiBleGNlcHRpb24gYW5kIHN0b3JpbmcgaXRzCiAgIHRyYWNlYmFjayBmb3IgbGF0ZXIgdXNlKS4KCiAgICJSdW50aW1lRXJyb3IiIGlzIHJhaXNlZCBpZiB0aGUgZnJhbWUgaXMgY3VycmVudGx5IGV4ZWN1dGluZy4KCiAgIE5ldyBpbiB2ZXJzaW9uIDMuNC4KCgpUcmFjZWJhY2sgb2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLQoKVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IHRoZSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uIEEKdHJhY2ViYWNrIG9iamVjdCBpcyBpbXBsaWNpdGx5IGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBhbmQKbWF5IGFsc28gYmUgZXhwbGljaXRseSBjcmVhdGVkIGJ5IGNhbGxpbmcgInR5cGVzLlRyYWNlYmFja1R5cGUiLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNzogVHJhY2ViYWNrIG9iamVjdHMgY2FuIG5vdyBiZSBleHBsaWNpdGx5Cmluc3RhbnRpYXRlZCBmcm9tIFB5dGhvbiBjb2RlLgoKRm9yIGltcGxpY2l0bHkgY3JlYXRlZCB0cmFjZWJhY2tzLCB3aGVuIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbgpoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXQgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrCm9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZiB0aGUgY3VycmVudCB0cmFjZWJhY2suICBXaGVuIGFuCmV4Y2VwdGlvbiBoYW5kbGVyIGlzIGVudGVyZWQsIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUKcHJvZ3JhbS4gKFNlZSBzZWN0aW9uIFRoZSB0cnkgc3RhdGVtZW50LikgSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUKdGhpcmQgaXRlbSBvZiB0aGUgdHVwbGUgcmV0dXJuZWQgYnkgInN5cy5leGNfaW5mbygpIiwgYW5kIGFzIHRoZQoiX190cmFjZWJhY2tfXyIgYXR0cmlidXRlIG9mIHRoZSBjYXVnaHQgZXhjZXB0aW9uLgoKV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBubyBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMKd3JpdHRlbiAobmljZWx5IGZvcm1hdHRlZCkgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsgaWYgdGhlCmludGVycHJldGVyIGlzIGludGVyYWN0aXZlLCBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzCiJzeXMubGFzdF90cmFjZWJhY2siLgoKRm9yIGV4cGxpY2l0bHkgY3JlYXRlZCB0cmFjZWJhY2tzLCBpdCBpcyB1cCB0byB0aGUgY3JlYXRvciBvZiB0aGUKdHJhY2ViYWNrIHRvIGRldGVybWluZSBob3cgdGhlICJ0Yl9uZXh0IiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsaW5rZWQKdG8gZm9ybSBhIGZ1bGwgc3RhY2sgdHJhY2UuCgpTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOgoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvaW50cyB0byB0aGUgZXhlY3V0aW9uIGZyYW1lIG9mIHRoZSBjdXJyZW50ICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxldmVsLiAgQWNjZXNzaW5nIHRoaXMgYXR0cmlidXRlIHJhaXNlcyBhbiAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGF1ZGl0aW5nIGV2ZW50ICJvYmplY3QuX19nZXRhdHRyX18iIHdpdGggYXJndW1lbnRzIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJvYmoiIGFuZCAiInRiX2ZyYW1lIiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfbGluZW5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdpdmVzIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCB0cmFjZWJhY2sudGJfbGFzdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEluZGljYXRlcyB0aGUg4oCccHJlY2lzZSBpbnN0cnVjdGlvbuKAnS4gICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgpUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIHRyYWNlYmFjayBtYXkgZGlmZmVyIGZyb20KdGhlIGxpbmUgbnVtYmVyIG9mIGl0cyBmcmFtZSBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhCiJ0cnkiIHN0YXRlbWVudCB3aXRoIG5vIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhICJmaW5hbGx5IgpjbGF1c2UuCgp0cmFjZWJhY2sudGJfbmV4dAoKICAgVGhlIHNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiB0aGUKICAgc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQpLCBvcgogICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbC4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IFRoaXMgYXR0cmlidXRlIGlzIG5vdyB3cml0YWJsZQoKClNsaWNlIG9iamVjdHMKLS0tLS0tLS0tLS0tLQoKU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAiX19nZXRpdGVtX18oKSIKbWV0aG9kcy4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4gInNsaWNlKCkiIGZ1bmN0aW9uLgoKU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInN0YXJ0IiBpcyB0aGUgbG93ZXIgYm91bmQ7ICJzdG9wIiBpcwp0aGUgdXBwZXIgYm91bmQ7ICJzdGVwIiBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpcyAiTm9uZSIgaWYgb21pdHRlZC4KVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS4KClNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOgoKc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpCgogICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZCBjb21wdXRlcwogICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xpY2UgdGhhdCB0aGUgc2xpY2Ugb2JqZWN0IHdvdWxkIGRlc2NyaWJlIGlmCiAgIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiBpdGVtcy4gIEl0IHJldHVybnMgYSB0dXBsZSBvZgogICB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZSB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqCiAgIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3IKICAgb3V0LW9mLWJvdW5kcyBpbmRpY2VzIGFyZSBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aAogICByZWd1bGFyIHNsaWNlcy4KCgpTdGF0aWMgbWV0aG9kIG9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIG9mCmZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgZGVzY3JpYmVkIGFib3ZlLiBBIHN0YXRpYyBtZXRob2QKb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYW55IG90aGVyIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZAptZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcwpvciBhIGNsYXNzIGluc3RhbmNlLCB0aGUgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkCm9iamVjdCwgd2hpY2ggaXMgbm90IHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYwptZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyBjYWxsYWJsZS4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5CnRoZSBidWlsdC1pbiAic3RhdGljbWV0aG9kKCkiIGNvbnN0cnVjdG9yLgoKCkNsYXNzIG1ldGhvZCBvYmplY3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyCmFyb3VuZCBhbm90aGVyIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgd2F5IGluIHdoaWNoIHRoYXQgb2JqZWN0IGlzCnJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZiBjbGFzcwptZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSwgdW5kZXIg4oCcaW5zdGFuY2UKbWV0aG9kc+KAnS4gQ2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluCiJjbGFzc21ldGhvZCgpIiBjb25zdHJ1Y3Rvci4KYawBAABGdW5jdGlvbnMKKioqKioqKioqCgpGdW5jdGlvbiBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlIG9ubHkKb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICJmdW5jKGFyZ3VtZW50LWxpc3QpIi4KClRoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gZnVuY3Rpb25zCmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbAp0aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgdGhlCmRpZmZlcmVudCBvYmplY3QgdHlwZXMuCgpTZWUgRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCnU+MAAATWFwcGluZyBUeXBlcyDigJQgImRpY3QiCioqKioqKioqKioqKioqKioqKioqKioKCkEgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSBvYmplY3RzLgpNYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkCm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0LQppbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLikKCkEgZGljdGlvbmFyeeKAmXMga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyB0aGF0IGFyZQpub3QgKmhhc2hhYmxlKiwgdGhhdCBpcywgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMsIGRpY3Rpb25hcmllcyBvcgpvdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3QKaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiBWYWx1ZXMgdGhhdCBjb21wYXJlIGVxdWFsIChzdWNoIGFzCiIxIiwgIjEuMCIsIGFuZCAiVHJ1ZSIpIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZQpkaWN0aW9uYXJ5IGVudHJ5LgoKY2xhc3MgZGljdCgqKmt3YXJncykKY2xhc3MgZGljdChtYXBwaW5nLCAqKmt3YXJncykKY2xhc3MgZGljdChpdGVyYWJsZSwgKiprd2FyZ3MpCgogICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWwKICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLgoKICAgRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHNldmVyYWwgbWVhbnM6CgogICAqIFVzZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mICJrZXk6IHZhbHVlIiBwYWlycyB3aXRoaW4gYnJhY2VzOgogICAgICJ7J2phY2snOiA0MDk4LCAnc2pvZXJkJzogNDEyN30iIG9yICJ7NDA5ODogJ2phY2snLCA0MTI3OgogICAgICdzam9lcmQnfSIKCiAgICogVXNlIGEgZGljdCBjb21wcmVoZW5zaW9uOiAie30iLCAie3g6IHggKiogMiBmb3IgeCBpbiByYW5nZSgxMCl9IgoKICAgKiBVc2UgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJkaWN0KCkiLCAiZGljdChbKCdmb28nLCAxMDApLCAoJ2JhcicsCiAgICAgMjAwKV0pIiwgImRpY3QoZm9vPTEwMCwgYmFyPTIwMCkiCgogICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuCiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYQogICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgdGhlIG1hcHBpbmcKICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYWJsZSoKICAgb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoCiAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSBiZWNvbWVzIGEga2V5CiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nCiAgIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXkKICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuCgogICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXIKICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlIHBvc2l0aW9uYWwKICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tCiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsCiAgIGFyZ3VtZW50LgoKICAgVG8gaWxsdXN0cmF0ZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbAogICB0byAieyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30iOgoKICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MykKICAgICAgPj4+IGIgPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzfQogICAgICA+Pj4gYyA9IGRpY3QoemlwKFsnb25lJywgJ3R3bycsICd0aHJlZSddLCBbMSwgMiwgM10pKQogICAgICA+Pj4gZCA9IGRpY3QoWygndHdvJywgMiksICgnb25lJywgMSksICgndGhyZWUnLCAzKV0pCiAgICAgID4+PiBlID0gZGljdCh7J3RocmVlJzogMywgJ29uZSc6IDEsICd0d28nOiAyfSkKICAgICAgPj4+IGYgPSBkaWN0KHsnb25lJzogMSwgJ3RocmVlJzogM30sIHR3bz0yKQogICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlID09IGYKICAgICAgVHJ1ZQoKICAgUHJvdmlkaW5nIGtleXdvcmQgYXJndW1lbnRzIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlIG9ubHkgd29ya3MgZm9yCiAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgdmFsaWQga2V5cwogICBjYW4gYmUgdXNlZC4KCiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLAogICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOgoKICAgbGlzdChkKQoKICAgICAgUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGtleXMgdXNlZCBpbiB0aGUgZGljdGlvbmFyeSAqZCouCgogICBsZW4oZCkKCiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi4KCiAgIGRba2V5XQoKICAgICAgUmV0dXJuIHRoZSBpdGVtIG9mICpkKiB3aXRoIGtleSAqa2V5Ki4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWYKICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuCgogICAgICBJZiBhIHN1YmNsYXNzIG9mIGRpY3QgZGVmaW5lcyBhIG1ldGhvZCAiX19taXNzaW5nX18oKSIgYW5kICprZXkqCiAgICAgIGlzIG5vdCBwcmVzZW50LCB0aGUgImRba2V5XSIgb3BlcmF0aW9uIGNhbGxzIHRoYXQgbWV0aG9kIHdpdGgKICAgICAgdGhlIGtleSAqa2V5KiBhcyBhcmd1bWVudC4gIFRoZSAiZFtrZXldIiBvcGVyYXRpb24gdGhlbiByZXR1cm5zCiAgICAgIG9yIHJhaXNlcyB3aGF0ZXZlciBpcyByZXR1cm5lZCBvciByYWlzZWQgYnkgdGhlCiAgICAgICJfX21pc3NpbmdfXyhrZXkpIiBjYWxsLiBObyBvdGhlciBvcGVyYXRpb25zIG9yIG1ldGhvZHMgaW52b2tlCiAgICAgICJfX21pc3NpbmdfXygpIi4gSWYgIl9fbWlzc2luZ19fKCkiIGlzIG5vdCBkZWZpbmVkLCAiS2V5RXJyb3IiCiAgICAgIGlzIHJhaXNlZC4gIl9fbWlzc2luZ19fKCkiIG11c3QgYmUgYSBtZXRob2Q7IGl0IGNhbm5vdCBiZSBhbgogICAgICBpbnN0YW5jZSB2YXJpYWJsZToKCiAgICAgICAgID4+PiBjbGFzcyBDb3VudGVyKGRpY3QpOgogICAgICAgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgogICAgICAgICAuLi4gICAgICAgICByZXR1cm4gMAogICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKQogICAgICAgICA+Pj4gY1sncmVkJ10KICAgICAgICAgMAogICAgICAgICA+Pj4gY1sncmVkJ10gKz0gMQogICAgICAgICA+Pj4gY1sncmVkJ10KICAgICAgICAgMQoKICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YKICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiAgQSBkaWZmZXJlbnQgIl9fbWlzc2luZ19fIiBtZXRob2QgaXMgdXNlZAogICAgICBieSAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLgoKICAgZFtrZXldID0gdmFsdWUKCiAgICAgIFNldCAiZFtrZXldIiB0byAqdmFsdWUqLgoKICAgZGVsIGRba2V5XQoKICAgICAgUmVtb3ZlICJkW2tleV0iIGZyb20gKmQqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZiAqa2V5KiBpcyBub3QKICAgICAgaW4gdGhlIG1hcC4KCiAgIGtleSBpbiBkCgogICAgICBSZXR1cm4gIlRydWUiIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgIkZhbHNlIi4KCiAgIGtleSBub3QgaW4gZAoKICAgICAgRXF1aXZhbGVudCB0byAibm90IGtleSBpbiBkIi4KCiAgIGl0ZXIoZCkKCiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBhCiAgICAgIHNob3J0Y3V0IGZvciAiaXRlcihkLmtleXMoKSkiLgoKICAgY2xlYXIoKQoKICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LgoKICAgY29weSgpCgogICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuCgogICBjbGFzc21ldGhvZCBmcm9ta2V5cyhpdGVyYWJsZVssIHZhbHVlXSkKCiAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICppdGVyYWJsZSogYW5kIHZhbHVlcyBzZXQKICAgICAgdG8gKnZhbHVlKi4KCiAgICAgICJmcm9ta2V5cygpIiBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS4KICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byAiTm9uZSIuICBBbGwgb2YgdGhlIHZhbHVlcyByZWZlciB0byBqdXN0IGEKICAgICAgc2luZ2xlIGluc3RhbmNlLCBzbyBpdCBnZW5lcmFsbHkgZG9lc27igJl0IG1ha2Ugc2Vuc2UgZm9yICp2YWx1ZSoKICAgICAgdG8gYmUgYSBtdXRhYmxlIG9iamVjdCBzdWNoIGFzIGFuIGVtcHR5IGxpc3QuICBUbyBnZXQgZGlzdGluY3QKICAgICAgdmFsdWVzLCB1c2UgYSBkaWN0IGNvbXByZWhlbnNpb24gaW5zdGVhZC4KCiAgIGdldChrZXlbLCBkZWZhdWx0XSkKCiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlCiAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gIk5vbmUiLCBzbwogICAgICB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhICJLZXlFcnJvciIuCgogICBpdGVtcygpCgogICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeeKAmXMgaXRlbXMgKCIoa2V5LCB2YWx1ZSkiCiAgICAgIHBhaXJzKS4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy4KCiAgIGtleXMoKQoKICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnnigJlzIGtleXMuICBTZWUgdGhlCiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLgoKICAgcG9wKGtleVssIGRlZmF1bHRdKQoKICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSwKICAgICAgZWxzZSByZXR1cm4gKmRlZmF1bHQqLiAgSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiBhbmQgKmtleSogaXMKICAgICAgbm90IGluIHRoZSBkaWN0aW9uYXJ5LCBhICJLZXlFcnJvciIgaXMgcmFpc2VkLgoKICAgcG9waXRlbSgpCgogICAgICBSZW1vdmUgYW5kIHJldHVybiBhICIoa2V5LCB2YWx1ZSkiIHBhaXIgZnJvbSB0aGUgZGljdGlvbmFyeS4KICAgICAgUGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dCkgb3JkZXIuCgogICAgICAicG9waXRlbSgpIiBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYQogICAgICBkaWN0aW9uYXJ5LCBhcyBvZnRlbiB1c2VkIGluIHNldCBhbGdvcml0aG1zLiAgSWYgdGhlIGRpY3Rpb25hcnkKICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi4KCiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjc6IExJRk8gb3JkZXIgaXMgbm93IGd1YXJhbnRlZWQuIEluIHByaW9yCiAgICAgIHZlcnNpb25zLCAicG9waXRlbSgpIiB3b3VsZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlyLgoKICAgcmV2ZXJzZWQoZCkKCiAgICAgIFJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gVGhpcwogICAgICBpcyBhIHNob3J0Y3V0IGZvciAicmV2ZXJzZWQoZC5rZXlzKCkpIi4KCiAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuOC4KCiAgIHNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pCgogICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0cyB2YWx1ZS4gIElmIG5vdCwgaW5zZXJ0CiAgICAgICprZXkqIHdpdGggYSB2YWx1ZSBvZiAqZGVmYXVsdCogYW5kIHJldHVybiAqZGVmYXVsdCouICAqZGVmYXVsdCoKICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLgoKICAgdXBkYXRlKFtvdGhlcl0pCgogICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gKm90aGVyKiwKICAgICAgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybiAiTm9uZSIuCgogICAgICAidXBkYXRlKCkiIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgZGljdGlvbmFyeSBvYmplY3Qgb3IgYW4KICAgICAgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzIChhcyB0dXBsZXMgb3Igb3RoZXIgaXRlcmFibGVzIG9mCiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnkKICAgICAgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOiAiZC51cGRhdGUocmVkPTEsCiAgICAgIGJsdWU9MikiLgoKICAgdmFsdWVzKCkKCiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ54oCZcyB2YWx1ZXMuICBTZWUgdGhlCiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLgoKICAgICAgQW4gZXF1YWxpdHkgY29tcGFyaXNvbiBiZXR3ZWVuIG9uZSAiZGljdC52YWx1ZXMoKSIgdmlldyBhbmQKICAgICAgYW5vdGhlciB3aWxsIGFsd2F5cyByZXR1cm4gIkZhbHNlIi4gVGhpcyBhbHNvIGFwcGxpZXMgd2hlbgogICAgICBjb21wYXJpbmcgImRpY3QudmFsdWVzKCkiIHRvIGl0c2VsZjoKCiAgICAgICAgID4+PiBkID0geydhJzogMX0KICAgICAgICAgPj4+IGQudmFsdWVzKCkgPT0gZC52YWx1ZXMoKQogICAgICAgICBGYWxzZQoKICAgZCB8IG90aGVyCgogICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIHRoZSBtZXJnZWQga2V5cyBhbmQgdmFsdWVzIG9mICpkKgogICAgICBhbmQgKm90aGVyKiwgd2hpY2ggbXVzdCBib3RoIGJlIGRpY3Rpb25hcmllcy4gVGhlIHZhbHVlcyBvZgogICAgICAqb3RoZXIqIHRha2UgcHJpb3JpdHkgd2hlbiAqZCogYW5kICpvdGhlciogc2hhcmUga2V5cy4KCiAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuOS4KCiAgIGQgfD0gb3RoZXIKCiAgICAgIFVwZGF0ZSB0aGUgZGljdGlvbmFyeSAqZCogd2l0aCBrZXlzIGFuZCB2YWx1ZXMgZnJvbSAqb3RoZXIqLAogICAgICB3aGljaCBtYXkgYmUgZWl0aGVyIGEgKm1hcHBpbmcqIG9yIGFuICppdGVyYWJsZSogb2Yga2V5L3ZhbHVlCiAgICAgIHBhaXJzLiBUaGUgdmFsdWVzIG9mICpvdGhlciogdGFrZSBwcmlvcml0eSB3aGVuICpkKiBhbmQgKm90aGVyKgogICAgICBzaGFyZSBrZXlzLgoKICAgICAgTmV3IGluIHZlcnNpb24gMy45LgoKICAgRGljdGlvbmFyaWVzIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lICIoa2V5LAogICB2YWx1ZSkiIHBhaXJzIChyZWdhcmRsZXNzIG9mIG9yZGVyaW5nKS4gT3JkZXIgY29tcGFyaXNvbnMgKOKAmDzigJksCiAgIOKAmDw94oCZLCDigJg+PeKAmSwg4oCYPuKAmSkgcmFpc2UgIlR5cGVFcnJvciIuCgogICBEaWN0aW9uYXJpZXMgcHJlc2VydmUgaW5zZXJ0aW9uIG9yZGVyLiAgTm90ZSB0aGF0IHVwZGF0aW5nIGEga2V5CiAgIGRvZXMgbm90IGFmZmVjdCB0aGUgb3JkZXIuICBLZXlzIGFkZGVkIGFmdGVyIGRlbGV0aW9uIGFyZSBpbnNlcnRlZAogICBhdCB0aGUgZW5kLgoKICAgICAgPj4+IGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzLCAiZm91ciI6IDR9CiAgICAgID4+PiBkCiAgICAgIHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNH0KICAgICAgPj4+IGxpc3QoZCkKICAgICAgWydvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInXQogICAgICA+Pj4gbGlzdChkLnZhbHVlcygpKQogICAgICBbMSwgMiwgMywgNF0KICAgICAgPj4+IGRbIm9uZSJdID0gNDIKICAgICAgPj4+IGQKICAgICAgeydvbmUnOiA0MiwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNH0KICAgICAgPj4+IGRlbCBkWyJ0d28iXQogICAgICA+Pj4gZFsidHdvIl0gPSBOb25lCiAgICAgID4+PiBkCiAgICAgIHsnb25lJzogNDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ3R3byc6IE5vbmV9CgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBEaWN0aW9uYXJ5IG9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gYmUKICAgaW5zZXJ0aW9uIG9yZGVyLiAgVGhpcyBiZWhhdmlvciB3YXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mCiAgIENQeXRob24gZnJvbSAzLjYuCgogICBEaWN0aW9uYXJpZXMgYW5kIGRpY3Rpb25hcnkgdmlld3MgYXJlIHJldmVyc2libGUuCgogICAgICA+Pj4gZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsICJmb3VyIjogNH0KICAgICAgPj4+IGQKICAgICAgeydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0fQogICAgICA+Pj4gbGlzdChyZXZlcnNlZChkKSkKICAgICAgWydmb3VyJywgJ3RocmVlJywgJ3R3bycsICdvbmUnXQogICAgICA+Pj4gbGlzdChyZXZlcnNlZChkLnZhbHVlcygpKSkKICAgICAgWzQsIDMsIDIsIDFdCiAgICAgID4+PiBsaXN0KHJldmVyc2VkKGQuaXRlbXMoKSkpCiAgICAgIFsoJ2ZvdXInLCA0KSwgKCd0aHJlZScsIDMpLCAoJ3R3bycsIDIpLCAoJ29uZScsIDEpXQoKICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuODogRGljdGlvbmFyaWVzIGFyZSBub3cgcmV2ZXJzaWJsZS4KClNlZSBhbHNvOgoKICAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVhZC1vbmx5IHZpZXcgb2YgYQogICJkaWN0Ii4KCgpEaWN0aW9uYXJ5IHZpZXcgb2JqZWN0cwo9PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgImRpY3Qua2V5cygpIiwgImRpY3QudmFsdWVzKCkiIGFuZAoiZGljdC5pdGVtcygpIiBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljIHZpZXcgb24gdGhlCmRpY3Rpb25hcnnigJlzIGVudHJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiB0aGUgZGljdGlvbmFyeSBjaGFuZ2VzLAp0aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLgoKRGljdGlvbmFyeSB2aWV3cyBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB0byB5aWVsZCB0aGVpciByZXNwZWN0aXZlIGRhdGEsCmFuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6CgpsZW4oZGljdHZpZXcpCgogICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5LgoKaXRlcihkaWN0dmlldykKCiAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgKHJlcHJlc2VudGVkIGFzCiAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuCgogICBLZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gaW5zZXJ0aW9uIG9yZGVyLiBUaGlzIGFsbG93cwogICB0aGUgY3JlYXRpb24gb2YgIih2YWx1ZSwga2V5KSIgcGFpcnMgdXNpbmcgInppcCgpIjogInBhaXJzID0KICAgemlwKGQudmFsdWVzKCksIGQua2V5cygpKSIuICBBbm90aGVyIHdheSB0byBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcwogICAicGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW4gZC5pdGVtcygpXSIuCgogICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkKICAgbWF5IHJhaXNlIGEgIlJ1bnRpbWVFcnJvciIgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMuCgogICBDaGFuZ2VkIGluIHZlcnNpb24gMy43OiBEaWN0aW9uYXJ5IG9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gYmUKICAgaW5zZXJ0aW9uIG9yZGVyLgoKeCBpbiBkaWN0dmlldwoKICAgUmV0dXJuICJUcnVlIiBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeeKAmXMga2V5cywgdmFsdWVzCiAgIG9yIGl0ZW1zIChpbiB0aGUgbGF0dGVyIGNhc2UsICp4KiBzaG91bGQgYmUgYSAiKGtleSwgdmFsdWUpIgogICB0dXBsZSkuCgpyZXZlcnNlZChkaWN0dmlldykKCiAgIFJldHVybiBhIHJldmVyc2UgaXRlcmF0b3Igb3ZlciB0aGUga2V5cywgdmFsdWVzIG9yIGl0ZW1zIG9mIHRoZQogICBkaWN0aW9uYXJ5LiBUaGUgdmlldyB3aWxsIGJlIGl0ZXJhdGVkIGluIHJldmVyc2Ugb3JkZXIgb2YgdGhlCiAgIGluc2VydGlvbi4KCiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjg6IERpY3Rpb25hcnkgdmlld3MgYXJlIG5vdyByZXZlcnNpYmxlLgoKZGljdHZpZXcubWFwcGluZwoKICAgUmV0dXJuIGEgInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsCiAgIGRpY3Rpb25hcnkgdG8gd2hpY2ggdGhlIHZpZXcgcmVmZXJzLgoKICAgTmV3IGluIHZlcnNpb24gMy4xMC4KCktleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgKmhhc2hhYmxlKi4KSWYgYWxsIHZhbHVlcyBhcmUgaGFzaGFibGUsIHNvIHRoYXQgIihrZXksIHZhbHVlKSIgcGFpcnMgYXJlIHVuaXF1ZQphbmQgaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlCm5vdCB0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pCkZvciBzZXQtbGlrZSB2aWV3cywgYWxsIG9mIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIHRoZSBhYnN0cmFjdApiYXNlIGNsYXNzICJjb2xsZWN0aW9ucy5hYmMuU2V0IiBhcmUgYXZhaWxhYmxlIChmb3IgZXhhbXBsZSwgIj09IiwKIjwiLCBvciAiXiIpLgoKQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6CgogICA+Pj4gZGlzaGVzID0geydlZ2dzJzogMiwgJ3NhdXNhZ2UnOiAxLCAnYmFjb24nOiAxLCAnc3BhbSc6IDUwMH0KICAgPj4+IGtleXMgPSBkaXNoZXMua2V5cygpCiAgID4+PiB2YWx1ZXMgPSBkaXNoZXMudmFsdWVzKCkKCiAgID4+PiAjIGl0ZXJhdGlvbgogICA+Pj4gbiA9IDAKICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOgogICAuLi4gICAgIG4gKz0gdmFsCiAgID4+PiBwcmludChuKQogICA1MDQKCiAgID4+PiAjIGtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgc2FtZSBvcmRlciAoaW5zZXJ0aW9uIG9yZGVyKQogICA+Pj4gbGlzdChrZXlzKQogICBbJ2VnZ3MnLCAnc2F1c2FnZScsICdiYWNvbicsICdzcGFtJ10KICAgPj4+IGxpc3QodmFsdWVzKQogICBbMiwgMSwgMSwgNTAwXQoKICAgPj4+ICMgdmlldyBvYmplY3RzIGFyZSBkeW5hbWljIGFuZCByZWZsZWN0IGRpY3QgY2hhbmdlcwogICA+Pj4gZGVsIGRpc2hlc1snZWdncyddCiAgID4+PiBkZWwgZGlzaGVzWydzYXVzYWdlJ10KICAgPj4+IGxpc3Qoa2V5cykKICAgWydiYWNvbicsICdzcGFtJ10KCiAgID4+PiAjIHNldCBvcGVyYXRpb25zCiAgID4+PiBrZXlzICYgeydlZ2dzJywgJ2JhY29uJywgJ3NhbGFkJ30KICAgeydiYWNvbid9CiAgID4+PiBrZXlzIF4geydzYXVzYWdlJywgJ2p1aWNlJ30gPT0geydqdWljZScsICdzYXVzYWdlJywgJ2JhY29uJywgJ3NwYW0nfQogICBUcnVlCiAgID4+PiBrZXlzIHwgWydqdWljZScsICdqdWljZScsICdqdWljZSddID09IHsnYmFjb24nLCAnc3BhbScsICdqdWljZSd9CiAgIFRydWUKCiAgID4+PiAjIGdldCBiYWNrIGEgcmVhZC1vbmx5IHByb3h5IGZvciB0aGUgb3JpZ2luYWwgZGljdGlvbmFyeQogICA+Pj4gdmFsdWVzLm1hcHBpbmcKICAgbWFwcGluZ3Byb3h5KHsnYmFjb24nOiAxLCAnc3BhbSc6IDUwMH0pCiAgID4+PiB2YWx1ZXMubWFwcGluZ1snc3BhbSddCiAgIDUwMAphfwYAAE1ldGhvZHMKKioqKioqKgoKTWV0aG9kcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB1c2luZyB0aGUgYXR0cmlidXRlIG5vdGF0aW9uLgpUaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgImFwcGVuZCgpIiBvbiBsaXN0cykKYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZC4gQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkIHdpdGggdGhlCnR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLgoKSWYgeW91IGFjY2VzcyBhIG1ldGhvZCAoYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgY2xhc3MgbmFtZXNwYWNlKQp0aHJvdWdoIGFuIGluc3RhbmNlLCB5b3UgZ2V0IGEgc3BlY2lhbCBvYmplY3Q6IGEgKmJvdW5kIG1ldGhvZCogKGFsc28KY2FsbGVkIGluc3RhbmNlIG1ldGhvZCkgb2JqZWN0LiBXaGVuIGNhbGxlZCwgaXQgd2lsbCBhZGQgdGhlICJzZWxmIgphcmd1bWVudCB0byB0aGUgYXJndW1lbnQgbGlzdC4gIEJvdW5kIG1ldGhvZHMgaGF2ZSB0d28gc3BlY2lhbCByZWFkLQpvbmx5IGF0dHJpYnV0ZXM6ICJtLl9fc2VsZl9fIiBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QKb3BlcmF0ZXMsIGFuZCAibS5fX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgbWV0aG9kLgpDYWxsaW5nICJtKGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiIGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0bwpjYWxsaW5nICJtLl9fZnVuY19fKG0uX19zZWxmX18sIGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiLgoKTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBib3VuZCBtZXRob2Qgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcgYXJiaXRyYXJ5CmF0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIG9uCnRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoIm1ldGhvZC5fX2Z1bmNfXyIpLCBzZXR0aW5nIG1ldGhvZAphdHRyaWJ1dGVzIG9uIGJvdW5kIG1ldGhvZHMgaXMgZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gc2V0IGFuCmF0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluIGFuICJBdHRyaWJ1dGVFcnJvciIgYmVpbmcgcmFpc2VkLiAgSW4Kb3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlCnVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OgoKICAgPj4+IGNsYXNzIEM6CiAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKToKICAgLi4uICAgICAgICAgcGFzcwogICAuLi4KICAgPj4+IGMgPSBDKCkKICAgPj4+IGMubWV0aG9kLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcgICMgY2FuJ3Qgc2V0IG9uIHRoZSBtZXRob2QKICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgIEF0dHJpYnV0ZUVycm9yOiAnbWV0aG9kJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnd2hvYW1pJwogICA+Pj4gYy5tZXRob2QuX19mdW5jX18ud2hvYW1pID0gJ215IG5hbWUgaXMgbWV0aG9kJwogICA+Pj4gYy5tZXRob2Qud2hvYW1pCiAgICdteSBuYW1lIGlzIG1ldGhvZCcKClNlZSBJbnN0YW5jZSBtZXRob2RzIGZvciBtb3JlIGluZm9ybWF0aW9uLgp1JAQAAE1vZHVsZXMKKioqKioqKgoKVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczogIm0ubmFtZSIsCndoZXJlICptKiBpcyBhIG1vZHVsZSBhbmQgKm5hbWUqIGFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkIGluICptKuKAmXMKc3ltYm9sIHRhYmxlLiBNb2R1bGUgYXR0cmlidXRlcyBjYW4gYmUgYXNzaWduZWQgdG8uICAoTm90ZSB0aGF0IHRoZQoiaW1wb3J0IiBzdGF0ZW1lbnQgaXMgbm90LCBzdHJpY3RseSBzcGVha2luZywgYW4gb3BlcmF0aW9uIG9uIGEgbW9kdWxlCm9iamVjdDsgImltcG9ydCBmb28iIGRvZXMgbm90IHJlcXVpcmUgYSBtb2R1bGUgb2JqZWN0IG5hbWVkICpmb28qIHRvCmV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbiogZm9yIGEgbW9kdWxlCm5hbWVkICpmb28qIHNvbWV3aGVyZS4pCgpBIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyAiX19kaWN0X18iLiBUaGlzIGlzIHRoZQpkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZHVsZeKAmXMgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpcwpkaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGXigJlzIHN5bWJvbCB0YWJsZSwgYnV0IGRpcmVjdAphc3NpZ25tZW50IHRvIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW4gd3JpdGUKIm0uX19kaWN0X19bJ2EnXSA9IDEiLCB3aGljaCBkZWZpbmVzICJtLmEiIHRvIGJlICIxIiwgYnV0IHlvdSBjYW7igJl0CndyaXRlICJtLl9fZGljdF9fID0ge30iKS4gIE1vZGlmeWluZyAiX19kaWN0X18iIGRpcmVjdGx5IGlzIG5vdApyZWNvbW1lbmRlZC4KCk1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPG1vZHVsZQonc3lzJyAoYnVpbHQtaW4pPiIuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXMKIjxtb2R1bGUgJ29zJyBmcm9tICcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljJz4iLgp1yVsAAFNlcXVlbmNlIFR5cGVzIOKAlCAibGlzdCIsICJ0dXBsZSIsICJyYW5nZSIKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKClRoZXJlIGFyZSB0aHJlZSBiYXNpYyBzZXF1ZW5jZSB0eXBlczogbGlzdHMsIHR1cGxlcywgYW5kIHJhbmdlCm9iamVjdHMuIEFkZGl0aW9uYWwgc2VxdWVuY2UgdHlwZXMgdGFpbG9yZWQgZm9yIHByb2Nlc3Npbmcgb2YgYmluYXJ5CmRhdGEgYW5kIHRleHQgc3RyaW5ncyBhcmUgZGVzY3JpYmVkIGluIGRlZGljYXRlZCBzZWN0aW9ucy4KCgpDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucwo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgc3VwcG9ydGVkIGJ5IG1vc3Qgc2VxdWVuY2UKdHlwZXMsIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDCmlzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucwpvbiBjdXN0b20gc2VxdWVuY2UgdHlwZXMuCgpUaGlzIHRhYmxlIGxpc3RzIHRoZSBzZXF1ZW5jZSBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkuCkluIHRoZSB0YWJsZSwgKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLCAqbiosICppKiwKKmoqIGFuZCAqayogYXJlIGludGVnZXJzIGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueQp0eXBlIGFuZCB2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyouCgpUaGUgImluIiBhbmQgIm5vdCBpbiIgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXRpZXMgYXMgdGhlCmNvbXBhcmlzb24gb3BlcmF0aW9ucy4gVGhlICIrIiAoY29uY2F0ZW5hdGlvbikgYW5kICIqIiAocmVwZXRpdGlvbikKb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWMKb3BlcmF0aW9ucy4gWzNdCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT18PT09PT09PT09PT09fAp8ICJ4IGluIHMiICAgICAgICAgICAgICAgICAgIHwgIlRydWUiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAgfCAoMSkgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiRmFsc2UiICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJ4IG5vdCBpbiBzIiAgICAgICAgICAgICAgIHwgIkZhbHNlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgfCAoMSkgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiVHJ1ZSIgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJzICsgdCIgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogfCAoNikoNykgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgInMgKiBuIiBvciAibiAqIHMiICAgICAgICAgfCBlcXVpdmFsZW50IHRvIGFkZGluZyAqcyogdG8gICAgICB8ICgyKSg3KSAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRzZWxmICpuKiB0aW1lcyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgInNbaV0iICAgICAgICAgICAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICB8ICgzKSAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAic1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNSkgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJsZW4ocykiICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mICpzKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCnwgIm1pbihzKSIgICAgICAgICAgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAibWF4KHMpIiAgICAgICAgICAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwp8ICJzLmluZGV4KHhbLCBpWywgal1dKSIgICAgIHwgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgfCAoOCkgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogKGF0IG9yIGFmdGVyIGluZGV4ICAgIHwgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqaSogYW5kIGJlZm9yZSBpbmRleCAqaiopICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKfCAicy5jb3VudCh4KSIgICAgICAgICAgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAgIHwgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsKClNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluIHBhcnRpY3VsYXIsCnR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZwpjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZXZlcnkKZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWUKdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgQ29tcGFyaXNvbnMgaW4KdGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pCgpGb3J3YXJkIGFuZCByZXZlcnNlZCBpdGVyYXRvcnMgb3ZlciBtdXRhYmxlIHNlcXVlbmNlcyBhY2Nlc3MgdmFsdWVzCnVzaW5nIGFuIGluZGV4LiAgVGhhdCBpbmRleCB3aWxsIGNvbnRpbnVlIHRvIG1hcmNoIGZvcndhcmQgKG9yCmJhY2t3YXJkKSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHNlcXVlbmNlIGlzIG11dGF0ZWQuICBUaGUgaXRlcmF0b3IKdGVybWluYXRlcyBvbmx5IHdoZW4gYW4gIkluZGV4RXJyb3IiIG9yIGEgIlN0b3BJdGVyYXRpb24iIGlzCmVuY291bnRlcmVkIChvciB3aGVuIHRoZSBpbmRleCBkcm9wcyBiZWxvdyB6ZXJvKS4KCk5vdGVzOgoKMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3Igc2ltcGxlCiAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCBzZXF1ZW5jZXMKICAgKHN1Y2ggYXMgInN0ciIsICJieXRlcyIgYW5kICJieXRlYXJyYXkiKSBhbHNvIHVzZSB0aGVtIGZvcgogICBzdWJzZXF1ZW5jZSB0ZXN0aW5nOgoKICAgICAgPj4+ICJnZyIgaW4gImVnZ3MiCiAgICAgIFRydWUKCjIuIFZhbHVlcyBvZiAqbiogbGVzcyB0aGFuICIwIiBhcmUgdHJlYXRlZCBhcyAiMCIgKHdoaWNoIHlpZWxkcyBhbgogICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIHRoYXQgaXRlbXMgaW4gdGhlCiAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSB0aW1lcy4KICAgVGhpcyBvZnRlbiBoYXVudHMgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6CgogICAgICA+Pj4gbGlzdHMgPSBbW11dICogMwogICAgICA+Pj4gbGlzdHMKICAgICAgW1tdLCBbXSwgW11dCiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMykKICAgICAgPj4+IGxpc3RzCiAgICAgIFtbM10sIFszXSwgWzNdXQoKICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCAiW1tdXSIgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmcKICAgYW4gZW1wdHkgbGlzdCwgc28gYWxsIHRocmVlIGVsZW1lbnRzIG9mICJbW11dICogMyIgYXJlIHJlZmVyZW5jZXMKICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mCiAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mCiAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheToKCiAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV0KICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKQogICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpCiAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNykKICAgICAgPj4+IGxpc3RzCiAgICAgIFtbM10sIFs1XSwgWzddXQoKICAgRnVydGhlciBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEZBUSBlbnRyeSBIb3cgZG8gSSBjcmVhdGUgYQogICBtdWx0aWRpbWVuc2lvbmFsIGxpc3Q/LgoKMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YKICAgc2VxdWVuY2UgKnMqOiAibGVuKHMpICsgaSIgb3IgImxlbihzKSArIGoiIGlzIHN1YnN0aXR1dGVkLiAgQnV0CiAgIG5vdGUgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi4KCjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mCiAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuICBJZiAqaSogb3IgKmoqIGlzCiAgIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlICJsZW4ocykiLiAgSWYgKmkqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLAogICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMKICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzIGVtcHR5LgoKNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZQogICBzZXF1ZW5jZSBvZiBpdGVtcyB3aXRoIGluZGV4ICAieCA9IGkgKyBuKmsiIHN1Y2ggdGhhdCAiMCA8PSBuIDwKICAgKGotaSkvayIuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlICJpIiwgImkrayIsICJpKzIqayIsCiAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXIKICAgaW5jbHVkaW5nICpqKikuICBXaGVuICprKiBpcyBwb3NpdGl2ZSwgKmkqIGFuZCAqaiogYXJlIHJlZHVjZWQgdG8KICAgImxlbihzKSIgaWYgdGhleSBhcmUgZ3JlYXRlci4gV2hlbiAqayogaXMgbmVnYXRpdmUsICppKiBhbmQgKmoqIGFyZQogICByZWR1Y2VkIHRvICJsZW4ocykgLSAxIiBpZiB0aGV5IGFyZSBncmVhdGVyLiAgSWYgKmkqIG9yICpqKiBhcmUKICAgb21pdHRlZCBvciAiTm9uZSIsIHRoZXkgYmVjb21lIOKAnGVuZOKAnSB2YWx1ZXMgKHdoaWNoIGVuZCBkZXBlbmRzIG9uCiAgIHRoZSBzaWduIG9mICprKikuICBOb3RlLCAqayogY2Fubm90IGJlIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0CiAgIGlzIHRyZWF0ZWQgbGlrZSAiMSIuCgo2LiBDb25jYXRlbmF0aW5nIGltbXV0YWJsZSBzZXF1ZW5jZXMgYWx3YXlzIHJlc3VsdHMgaW4gYSBuZXcgb2JqZWN0LgogICBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZCBjb25jYXRlbmF0aW9uCiAgIHdpbGwgaGF2ZSBhIHF1YWRyYXRpYyBydW50aW1lIGNvc3QgaW4gdGhlIHRvdGFsIHNlcXVlbmNlIGxlbmd0aC4KICAgVG8gZ2V0IGEgbGluZWFyIHJ1bnRpbWUgY29zdCwgeW91IG11c3Qgc3dpdGNoIHRvIG9uZSBvZiB0aGUKICAgYWx0ZXJuYXRpdmVzIGJlbG93OgoKICAgKiBpZiBjb25jYXRlbmF0aW5nICJzdHIiIG9iamVjdHMsIHlvdSBjYW4gYnVpbGQgYSBsaXN0IGFuZCB1c2UKICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGFuICJpby5TdHJpbmdJTyIKICAgICBpbnN0YW5jZSBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGUKCiAgICogaWYgY29uY2F0ZW5hdGluZyAiYnl0ZXMiIG9iamVjdHMsIHlvdSBjYW4gc2ltaWxhcmx5IHVzZQogICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZQogICAgIGNvbmNhdGVuYXRpb24gd2l0aCBhICJieXRlYXJyYXkiIG9iamVjdC4gICJieXRlYXJyYXkiIG9iamVjdHMgYXJlCiAgICAgbXV0YWJsZSBhbmQgaGF2ZSBhbiBlZmZpY2llbnQgb3ZlcmFsbG9jYXRpb24gbWVjaGFuaXNtCgogICAqIGlmIGNvbmNhdGVuYXRpbmcgInR1cGxlIiBvYmplY3RzLCBleHRlbmQgYSAibGlzdCIgaW5zdGVhZAoKICAgKiBmb3Igb3RoZXIgdHlwZXMsIGludmVzdGlnYXRlIHRoZSByZWxldmFudCBjbGFzcyBkb2N1bWVudGF0aW9uCgo3LiBTb21lIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzICJyYW5nZSIpIG9ubHkgc3VwcG9ydCBpdGVtIHNlcXVlbmNlcwogICB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvbuKAmXQgc3VwcG9ydCBzZXF1ZW5jZQogICBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uCgo4LiAiaW5kZXgiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gTm90IGFsbAogICBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCBwYXNzaW5nIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyAqaSogYW5kCiAgICpqKi4gVGhlc2UgYXJndW1lbnRzIGFsbG93IGVmZmljaWVudCBzZWFyY2hpbmcgb2Ygc3Vic2VjdGlvbnMgb2YKICAgdGhlIHNlcXVlbmNlLiBQYXNzaW5nIHRoZSBleHRyYSBhcmd1bWVudHMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCiAgIHVzaW5nICJzW2k6al0uaW5kZXgoeCkiLCBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUKICAgcmV0dXJuZWQgaW5kZXggYmVpbmcgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZXF1ZW5jZSByYXRoZXIKICAgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIHNsaWNlLgoKCkltbXV0YWJsZSBTZXF1ZW5jZSBUeXBlcwo9PT09PT09PT09PT09PT09PT09PT09PT0KClRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBnZW5lcmFsbHkgaW1wbGVtZW50CnRoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyBzdXBwb3J0IGZvcgp0aGUgImhhc2goKSIgYnVpbHQtaW4uCgpUaGlzIHN1cHBvcnQgYWxsb3dzIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHN1Y2ggYXMgInR1cGxlIiBpbnN0YW5jZXMsIHRvCmJlIHVzZWQgYXMgImRpY3QiIGtleXMgYW5kIHN0b3JlZCBpbiAic2V0IiBhbmQgImZyb3plbnNldCIgaW5zdGFuY2VzLgoKQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHVuaGFzaGFibGUKdmFsdWVzIHdpbGwgcmVzdWx0IGluICJUeXBlRXJyb3IiLgoKCk11dGFibGUgU2VxdWVuY2UgVHlwZXMKPT09PT09PT09PT09PT09PT09PT09PQoKVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlCnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlCml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlCnR5cGVzLgoKSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueQppdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55IHR5cGUgYW5kCnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHkKYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09fAp8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSBbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICpzKiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCBzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICpzKiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnBvcCgpIiBvciAicy5wb3AoaSkiICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSIgaXMgZXF1YWwgdG8gKngqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLgoKMi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byAiLTEiLCBzbyB0aGF0IGJ5IGRlZmF1bHQgdGhlCiAgIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC4KCjMuICJyZW1vdmUoKSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLgoKNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkKICAgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0CiAgIG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkIHNlcXVlbmNlLgoKNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlCiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9u4oCZdCBzdXBwb3J0IHNsaWNpbmcKICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKS4gImNvcHkoKSIgaXMgbm90IHBhcnQgb2YgdGhlCiAgICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMsIGJ1dCBtb3N0IGNvbmNyZXRlIG11dGFibGUKICAgc2VxdWVuY2UgY2xhc3NlcyBwcm92aWRlIGl0LgoKICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuCgo2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcKICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLgogICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGUKICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciBDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucy4KCgpMaXN0cwo9PT09PQoKTGlzdHMgYXJlIG11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZgpob21vZ2VuZW91cyBpdGVtcyAod2hlcmUgdGhlIHByZWNpc2UgZGVncmVlIG9mIHNpbWlsYXJpdHkgd2lsbCB2YXJ5IGJ5CmFwcGxpY2F0aW9uKS4KCmNsYXNzIGxpc3QoW2l0ZXJhYmxlXSkKCiAgIExpc3RzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBzZXZlcmFsIHdheXM6CgogICAqIFVzaW5nIGEgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMgdG8gZGVub3RlIHRoZSBlbXB0eSBsaXN0OiAiW10iCgogICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogIlthXSIsICJbYSwKICAgICBiLCBjXSIKCiAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iCgogICAqIFVzaW5nIHRoZSB0eXBlIGNvbnN0cnVjdG9yOiAibGlzdCgpIiBvciAibGlzdChpdGVyYWJsZSkiCgogICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZQogICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSrigJlzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGEKICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvcgogICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmQKICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICJsaXN0KCdhYmMnKSIKICAgcmV0dXJucyAiWydhJywgJ2InLCAnYyddIiBhbmQgImxpc3QoICgxLCAyLCAzKSApIiByZXR1cm5zICJbMSwgMiwKICAgM10iLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkKICAgbGlzdCwgIltdIi4KCiAgIE1hbnkgb3RoZXIgb3BlcmF0aW9ucyBhbHNvIHByb2R1Y2UgbGlzdHMsIGluY2x1ZGluZyB0aGUgInNvcnRlZCgpIgogICBidWlsdC1pbi4KCiAgIExpc3RzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBhbmQgbXV0YWJsZSBzZXF1ZW5jZSBvcGVyYXRpb25zLgogICBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDoKCiAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9RmFsc2UpCgogICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgY29tcGFyaXNvbnMKICAgICAgYmV0d2VlbiBpdGVtcy4gRXhjZXB0aW9ucyBhcmUgbm90IHN1cHByZXNzZWQgLSBpZiBhbnkgY29tcGFyaXNvbgogICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgdGhlCiAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuCgogICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnkKICAgICAga2V5d29yZCAoa2V5d29yZC1vbmx5IGFyZ3VtZW50cyk6CgogICAgICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvCiAgICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50IChmb3IgZXhhbXBsZSwKICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAogICAgICBpcyBjYWxjdWxhdGVkIG9uY2UgYW5kIHRoZW4gdXNlZCBmb3IgdGhlIGVudGlyZSBzb3J0aW5nIHByb2Nlc3MuCiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJOb25lIiBtZWFucyB0aGF0IGxpc3QgaXRlbXMgYXJlIHNvcnRlZAogICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLgoKICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGEKICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uCgogICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgbGlzdAogICAgICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLgoKICAgICAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvciBlY29ub215IG9mIHNwYWNlCiAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgb3BlcmF0ZXMKICAgICAgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc29ydGVkIHNlcXVlbmNlICh1c2UKICAgICAgInNvcnRlZCgpIiB0byBleHBsaWNpdGx5IHJlcXVlc3QgYSBuZXcgc29ydGVkIGxpc3QgaW5zdGFuY2UpLgoKICAgICAgVGhlICJzb3J0KCkiIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCBpcwogICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciBvZgogICAgICBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwg4oCUIHRoaXMgaXMgaGVscGZ1bCBmb3Igc29ydGluZyBpbgogICAgICBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsIHRoZW4gYnkgc2FsYXJ5CiAgICAgIGdyYWRlKS4KCiAgICAgIEZvciBzb3J0aW5nIGV4YW1wbGVzIGFuZCBhIGJyaWVmIHNvcnRpbmcgdHV0b3JpYWwsIHNlZSBTb3J0aW5nCiAgICAgIEhPVyBUTy4KCiAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCwKICAgICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpcwogICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgYXBwZWFyCiAgICAgIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgIlZhbHVlRXJyb3IiIGlmIGl0IGNhbiBkZXRlY3QKICAgICAgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuCgoKVHVwbGVzCj09PT09PQoKVHVwbGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZgpoZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAiZW51bWVyYXRlKCkiCmJ1aWx0LWluKS4gVHVwbGVzIGFyZSBhbHNvIHVzZWQgZm9yIGNhc2VzIHdoZXJlIGFuIGltbXV0YWJsZSBzZXF1ZW5jZQpvZiBob21vZ2VuZW91cyBkYXRhIGlzIG5lZWRlZCAoc3VjaCBhcyBhbGxvd2luZyBzdG9yYWdlIGluIGEgInNldCIgb3IKImRpY3QiIGluc3RhbmNlKS4KCmNsYXNzIHR1cGxlKFtpdGVyYWJsZV0pCgogICBUdXBsZXMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHdheXM6CgogICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAiKCkiCgogICAqIFVzaW5nIGEgdHJhaWxpbmcgY29tbWEgZm9yIGEgc2luZ2xldG9uIHR1cGxlOiAiYSwiIG9yICIoYSwpIgoKICAgKiBTZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiAiYSwgYiwgYyIgb3IgIihhLCBiLCBjKSIKCiAgICogVXNpbmcgdGhlICJ0dXBsZSgpIiBidWlsdC1pbjogInR1cGxlKCkiIG9yICJ0dXBsZShpdGVyYWJsZSkiCgogICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgdHVwbGUgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCBpbiB0aGUKICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUq4oCZcyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciBhCiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3IKICAgb2JqZWN0LiAgSWYgKml0ZXJhYmxlKiBpcyBhbHJlYWR5IGEgdHVwbGUsIGl0IGlzIHJldHVybmVkCiAgIHVuY2hhbmdlZC4gRm9yIGV4YW1wbGUsICJ0dXBsZSgnYWJjJykiIHJldHVybnMgIignYScsICdiJywgJ2MnKSIKICAgYW5kICJ0dXBsZSggWzEsIDIsIDNdICkiIHJldHVybnMgIigxLCAyLCAzKSIuIElmIG5vIGFyZ3VtZW50IGlzCiAgIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSB0dXBsZSwgIigpIi4KCiAgIE5vdGUgdGhhdCBpdCBpcyBhY3R1YWxseSB0aGUgY29tbWEgd2hpY2ggbWFrZXMgYSB0dXBsZSwgbm90IHRoZQogICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSBlbXB0eQogICB0dXBsZSBjYXNlLCBvciB3aGVuIHRoZXkgYXJlIG5lZWRlZCB0byBhdm9pZCBzeW50YWN0aWMgYW1iaWd1aXR5LgogICBGb3IgZXhhbXBsZSwgImYoYSwgYiwgYykiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRocmVlIGFyZ3VtZW50cywKICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSBzb2xlCiAgIGFyZ3VtZW50LgoKICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zLgoKRm9yIGhldGVyb2dlbmVvdXMgY29sbGVjdGlvbnMgb2YgZGF0YSB3aGVyZSBhY2Nlc3MgYnkgbmFtZSBpcyBjbGVhcmVyCnRoYW4gYWNjZXNzIGJ5IGluZGV4LCAiY29sbGVjdGlvbnMubmFtZWR0dXBsZSgpIiBtYXkgYmUgYSBtb3JlCmFwcHJvcHJpYXRlIGNob2ljZSB0aGFuIGEgc2ltcGxlIHR1cGxlIG9iamVjdC4KCgpSYW5nZXMKPT09PT09CgpUaGUgInJhbmdlIiB0eXBlIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIG51bWJlcnMgYW5kIGlzCmNvbW1vbmx5IHVzZWQgZm9yIGxvb3BpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMgaW4gImZvciIgbG9vcHMuCgpjbGFzcyByYW5nZShzdG9wKQpjbGFzcyByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKQoKICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAoZWl0aGVyCiAgIGJ1aWx0LWluICJpbnQiIG9yIGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSAiX19pbmRleF9fKCkiCiAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KICAgIjEiLiBJZiB0aGUgKnN0YXJ0KiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAiMCIuIElmCiAgICpzdGVwKiBpcyB6ZXJvLCAiVmFsdWVFcnJvciIgaXMgcmFpc2VkLgoKICAgRm9yIGEgcG9zaXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgYSByYW5nZSAiciIgYXJlIGRldGVybWluZWQKICAgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIgd2hlcmUgImkgPj0gMCIgYW5kICJyW2ldIDwKICAgc3RvcCIuCgogICBGb3IgYSBuZWdhdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiB0aGUgcmFuZ2UgYXJlIHN0aWxsCiAgIGRldGVybWluZWQgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIsIGJ1dCB0aGUKICAgY29uc3RyYWludHMgYXJlICJpID49IDAiIGFuZCAicltpXSA+IHN0b3AiLgoKICAgQSByYW5nZSBvYmplY3Qgd2lsbCBiZSBlbXB0eSBpZiAiclswXSIgZG9lcyBub3QgbWVldCB0aGUgdmFsdWUKICAgY29uc3RyYWludC4gUmFuZ2VzIGRvIHN1cHBvcnQgbmVnYXRpdmUgaW5kaWNlcywgYnV0IHRoZXNlIGFyZQogICBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGRldGVybWluZWQgYnkKICAgdGhlIHBvc2l0aXZlIGluZGljZXMuCgogICBSYW5nZXMgY29udGFpbmluZyBhYnNvbHV0ZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhcmUKICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZQogICAiT3ZlcmZsb3dFcnJvciIuCgogICBSYW5nZSBleGFtcGxlczoKCiAgICAgID4+PiBsaXN0KHJhbmdlKDEwKSkKICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDExKSkKICAgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQogICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpCiAgICAgIFswLCA1LCAxMCwgMTUsIDIwLCAyNV0KICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMTAsIDMpKQogICAgICBbMCwgMywgNiwgOV0KICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgLTEwLCAtMSkpCiAgICAgIFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XQogICAgICA+Pj4gbGlzdChyYW5nZSgwKSkKICAgICAgW10KICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMCkpCiAgICAgIFtdCgogICBSYW5nZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMgZXhjZXB0CiAgIGNvbmNhdGVuYXRpb24gYW5kIHJlcGV0aXRpb24gKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJhbmdlIG9iamVjdHMKICAgY2FuIG9ubHkgcmVwcmVzZW50IHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBhIHN0cmljdCBwYXR0ZXJuIGFuZAogICByZXBldGl0aW9uIGFuZCBjb25jYXRlbmF0aW9uIHdpbGwgdXN1YWxseSB2aW9sYXRlIHRoYXQgcGF0dGVybikuCgogICBzdGFydAoKICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RhcnQqIHBhcmFtZXRlciAob3IgIjAiIGlmIHRoZSBwYXJhbWV0ZXIgd2FzCiAgICAgIG5vdCBzdXBwbGllZCkKCiAgIHN0b3AKCiAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0b3AqIHBhcmFtZXRlcgoKICAgc3RlcAoKICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RlcCogcGFyYW1ldGVyIChvciAiMSIgaWYgdGhlIHBhcmFtZXRlciB3YXMKICAgICAgbm90IHN1cHBsaWVkKQoKVGhlIGFkdmFudGFnZSBvZiB0aGUgInJhbmdlIiB0eXBlIG92ZXIgYSByZWd1bGFyICJsaXN0IiBvciAidHVwbGUiIGlzCnRoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50IG9mCm1lbW9yeSwgbm8gbWF0dGVyIHRoZSBzaXplIG9mIHRoZSByYW5nZSBpdCByZXByZXNlbnRzIChhcyBpdCBvbmx5CnN0b3JlcyB0aGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgdmFsdWVzLCBjYWxjdWxhdGluZyBpbmRpdmlkdWFsCml0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS4KClJhbmdlIG9iamVjdHMgaW1wbGVtZW50IHRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkMsIGFuZApwcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggbG9va3VwLApzbGljaW5nIGFuZCBzdXBwb3J0IGZvciBuZWdhdGl2ZSBpbmRpY2VzIChzZWUgU2VxdWVuY2UgVHlwZXMg4oCUIGxpc3QsCnR1cGxlLCByYW5nZSk6Cgo+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKQo+Pj4gcgpyYW5nZSgwLCAyMCwgMikKPj4+IDExIGluIHIKRmFsc2UKPj4+IDEwIGluIHIKVHJ1ZQo+Pj4gci5pbmRleCgxMCkKNQo+Pj4gcls1XQoxMAo+Pj4gcls6NV0KcmFuZ2UoMCwgMTAsIDIpCj4+PiByWy0xXQoxOAoKVGVzdGluZyByYW5nZSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoICI9PSIgYW5kICIhPSIgY29tcGFyZXMgdGhlbSBhcwpzZXF1ZW5jZXMuICBUaGF0IGlzLCB0d28gcmFuZ2Ugb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5CnJlcHJlc2VudCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiB2YWx1ZXMuICAoTm90ZSB0aGF0IHR3byByYW5nZSBvYmplY3RzCnRoYXQgY29tcGFyZSBlcXVhbCBtaWdodCBoYXZlIGRpZmZlcmVudCAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIgphdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZSAicmFuZ2UoMCkgPT0gcmFuZ2UoMiwgMSwgMykiIG9yICJyYW5nZSgwLCAzLAoyKSA9PSByYW5nZSgwLCA0LCAyKSIuKQoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogSW1wbGVtZW50IHRoZSBTZXF1ZW5jZSBBQkMuIFN1cHBvcnQgc2xpY2luZwphbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluIGNvbnN0YW50CnRpbWUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgaXRlbXMuCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUg4oCYPT3igJkgYW5kIOKAmCE94oCZIHRvIGNvbXBhcmUgcmFuZ2Ugb2JqZWN0cwpiYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mIGNvbXBhcmluZwpiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkpLkFkZGVkIHRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIgphdHRyaWJ1dGVzLgoKU2VlIGFsc286CgogICogVGhlIGxpbnNwYWNlIHJlY2lwZSBzaG93cyBob3cgdG8gaW1wbGVtZW50IGEgbGF6eSB2ZXJzaW9uIG9mIHJhbmdlCiAgICBzdWl0YWJsZSBmb3IgZmxvYXRpbmcgcG9pbnQgYXBwbGljYXRpb25zLgp18xcAAE11dGFibGUgU2VxdWVuY2UgVHlwZXMKKioqKioqKioqKioqKioqKioqKioqKgoKVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlCnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlCml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlCnR5cGVzLgoKSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueQppdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55IHR5cGUgYW5kCnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHkKYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuCgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8Cnw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09fD09PT09PT09PT09PT09PT09PT09PT09fAp8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSBbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICpzKiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCBzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICpzKiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnBvcCgpIiBvciAicy5wb3AoaSkiICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSIgaXMgZXF1YWwgdG8gKngqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKTm90ZXM6CgoxLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLgoKMi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byAiLTEiLCBzbyB0aGF0IGJ5IGRlZmF1bHQgdGhlCiAgIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC4KCjMuICJyZW1vdmUoKSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLgoKNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkKICAgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0CiAgIG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkIHNlcXVlbmNlLgoKNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlCiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9u4oCZdCBzdXBwb3J0IHNsaWNpbmcKICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKS4gImNvcHkoKSIgaXMgbm90IHBhcnQgb2YgdGhlCiAgICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMsIGJ1dCBtb3N0IGNvbmNyZXRlIG11dGFibGUKICAgc2VxdWVuY2UgY2xhc3NlcyBwcm92aWRlIGl0LgoKICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuCgo2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcKICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLgogICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGUKICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciBDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucy4KYU0DAABVbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpBbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6CgogICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByCgpUaGUgdW5hcnkgIi0iIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpYwphcmd1bWVudDsgdGhlIG9wZXJhdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSAiX19uZWdfXygpIiBzcGVjaWFsCm1ldGhvZC4KClRoZSB1bmFyeSAiKyIgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCB1bmNoYW5nZWQ7CnRoZSBvcGVyYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgIl9fcG9zX18oKSIgc3BlY2lhbCBtZXRob2QuCgpUaGUgdW5hcnkgIn4iIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzCmludGVnZXIgYXJndW1lbnQuICBUaGUgYml0d2lzZSBpbnZlcnNpb24gb2YgIngiIGlzIGRlZmluZWQgYXMKIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycyBvciB0byBjdXN0b20gb2JqZWN0cwp0aGF0IG92ZXJyaWRlIHRoZSAiX19pbnZlcnRfXygpIiBzcGVjaWFsIG1ldGhvZC4KCkluIGFsbCB0aHJlZSBjYXNlcywgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90IGhhdmUgdGhlIHByb3BlciB0eXBlLCBhCiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuCnW8AgAAVGhlICJ3aGlsZSIgc3RhdGVtZW50CioqKioqKioqKioqKioqKioqKioqKgoKVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuCmV4cHJlc3Npb24gaXMgdHJ1ZToKCiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgYXNzaWdubWVudF9leHByZXNzaW9uICI6IiBzdWl0ZQogICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV0KClRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZQpmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZQppdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQKYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuCgpBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wCndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNl4oCZcyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQKZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrCnRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uCnXYDAAAVGhlICJ3aXRoIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioKClRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aAptZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggU3RhdGVtZW50CkNvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSLigKYiZXhjZXB0IuKApiJmaW5hbGx5IiB1c2FnZQpwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuCgogICB3aXRoX3N0bXQgICAgICAgICAgOjo9ICJ3aXRoIiAoICIoIiB3aXRoX3N0bXRfY29udGVudHMgIiwiPyAiKSIgfCB3aXRoX3N0bXRfY29udGVudHMgKSAiOiIgc3VpdGUKICAgd2l0aF9zdG10X2NvbnRlbnRzIDo6PSB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKgogICB3aXRoX2l0ZW0gICAgICAgICAgOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XQoKVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSDigJxpdGVt4oCdIHByb2NlZWRzIGFzCmZvbGxvd3M6CgoxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpIGlzCiAgIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuCgoyLiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19lbnRlcl9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKMy4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLgoKNC4gVGhlIGNvbnRleHQgbWFuYWdlcuKAmXMgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC4KCjUuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuCgogICBOb3RlOgoKICAgICBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSIgbWV0aG9kCiAgICAgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZQogICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGUKICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZwogICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDcgYmVsb3cuCgo2LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuCgo3LiBUaGUgY29udGV4dCBtYW5hZ2Vy4oCZcyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhbgogICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kCiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWUKICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuCgogICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZQogICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC4KICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmQKICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCIKICAgc3RhdGVtZW50LgoKICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZQogICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkcwogICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLgoKVGhlIGZvbGxvd2luZyBjb2RlOgoKICAgd2l0aCBFWFBSRVNTSU9OIGFzIFRBUkdFVDoKICAgICAgIFNVSVRFCgppcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzoKCiAgIG1hbmFnZXIgPSAoRVhQUkVTU0lPTikKICAgZW50ZXIgPSB0eXBlKG1hbmFnZXIpLl9fZW50ZXJfXwogICBleGl0ID0gdHlwZShtYW5hZ2VyKS5fX2V4aXRfXwogICB2YWx1ZSA9IGVudGVyKG1hbmFnZXIpCiAgIGhpdF9leGNlcHQgPSBGYWxzZQoKICAgdHJ5OgogICAgICAgVEFSR0VUID0gdmFsdWUKICAgICAgIFNVSVRFCiAgIGV4Y2VwdDoKICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCiAgICAgICBpZiBub3QgZXhpdChtYW5hZ2VyLCAqc3lzLmV4Y19pbmZvKCkpOgogICAgICAgICAgIHJhaXNlCiAgIGZpbmFsbHk6CiAgICAgICBpZiBub3QgaGl0X2V4Y2VwdDoKICAgICAgICAgICBleGl0KG1hbmFnZXIsIE5vbmUsIE5vbmUsIE5vbmUpCgpXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZgptdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDoKCiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOgogICAgICAgU1VJVEUKCmlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOgoKICAgd2l0aCBBKCkgYXMgYToKICAgICAgIHdpdGggQigpIGFzIGI6CiAgICAgICAgICAgU1VJVEUKCllvdSBjYW4gYWxzbyB3cml0ZSBtdWx0aS1pdGVtIGNvbnRleHQgbWFuYWdlcnMgaW4gbXVsdGlwbGUgbGluZXMgaWYKdGhlIGl0ZW1zIGFyZSBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzLiBGb3IgZXhhbXBsZToKCiAgIHdpdGggKAogICAgICAgQSgpIGFzIGEsCiAgICAgICBCKCkgYXMgYiwKICAgKToKICAgICAgIFNVSVRFCgpDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLgoKQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTA6IFN1cHBvcnQgZm9yIHVzaW5nIGdyb3VwaW5nIHBhcmVudGhlc2VzIHRvCmJyZWFrIHRoZSBzdGF0ZW1lbnQgaW4gbXVsdGlwbGUgbGluZXMuCgpTZWUgYWxzbzoKCiAgKipQRVAgMzQzKiogLSBUaGUg4oCcd2l0aOKAnSBzdGF0ZW1lbnQKICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIgogICAgIHN0YXRlbWVudC4KYSwDAABUaGUgInlpZWxkIiBzdGF0ZW1lbnQKKioqKioqKioqKioqKioqKioqKioqCgogICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uCgpBICJ5aWVsZCIgc3RhdGVtZW50IGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgeWllbGQgZXhwcmVzc2lvbi4KVGhlIHlpZWxkIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBvbWl0IHRoZSBwYXJlbnRoZXNlcyB0aGF0IHdvdWxkCm90aGVyd2lzZSBiZSByZXF1aXJlZCBpbiB0aGUgZXF1aXZhbGVudCB5aWVsZCBleHByZXNzaW9uIHN0YXRlbWVudC4KRm9yIGV4YW1wbGUsIHRoZSB5aWVsZCBzdGF0ZW1lbnRzCgogICB5aWVsZCA8ZXhwcj4KICAgeWllbGQgZnJvbSA8ZXhwcj4KCmFyZSBlcXVpdmFsZW50IHRvIHRoZSB5aWVsZCBleHByZXNzaW9uIHN0YXRlbWVudHMKCiAgICh5aWVsZCA8ZXhwcj4pCiAgICh5aWVsZCBmcm9tIDxleHByPikKCllpZWxkIGV4cHJlc3Npb25zIGFuZCBzdGF0ZW1lbnRzIGFyZSBvbmx5IHVzZWQgd2hlbiBkZWZpbmluZyBhCipnZW5lcmF0b3IqIGZ1bmN0aW9uLCBhbmQgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZ2VuZXJhdG9yCmZ1bmN0aW9uLiAgVXNpbmcgeWllbGQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8gY2F1c2UKdGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgbm9ybWFsCmZ1bmN0aW9uLgoKRm9yIGZ1bGwgZGV0YWlscyBvZiAieWllbGQiIHNlbWFudGljcywgcmVmZXIgdG8gdGhlIFlpZWxkIGV4cHJlc3Npb25zCnNlY3Rpb24uCikL2gV0eXBlc9oOdHlwZXNmdW5jdGlvbnPaDHR5cGVzbWFwcGluZ9oMdHlwZXNtZXRob2Rz2gx0eXBlc21vZHVsZXPaCHR5cGVzc2VxehB0eXBlc3NlcS1tdXRhYmxl2gV1bmFyedoFd2hpbGXaBHdpdGjaBXlpZWxkTikB2gZ0b3BpY3OpAPMAAAAA+j4vb3B0L2FsdC9weXRob24taW50ZXJuYWwvbGliNjQvcHl0aG9uMy4xMS9weWRvY19kYXRhL3RvcGljcy5wefoIPG1vZHVsZT5yRAAAAAEAAABzKQYAAPADAQEB8AhNeQMKGIgo8AAmFUMB8ABNeQMKGPBOAQACDvAAdwUQIfBPAU15AwoY8H4MAAIJ8ABBAws38H8MTXkDChjwQhMAAhTwACcWMfBDE015AwoY8FIUAAIR8AAcEx3wUxRNeQMKGPBMFQACFPAAbgcWQAHwTRVNeQMKGPBqJAACGPAAHRpKAfBrJE15AwoY8GYlAAIN8AA/Dx/wZyVNeQMKGPBmJwACCfAACAsi8GcnTXkDChjweCcAAgrwAGoBDBfweSdNeQMKGPBOKwACC/AAFw1GAfBPK015AwoY8H4rAAIW8AAaGCjwfytNeQMKGPB0LAACGfAACxtEAfB1LE15AwoY8EwtAAIV8AALFzPwTS1NeQMKGPBkLQACFvAACxhLAfBlLU15AwoY8HwtAAIM8AAwDh/wfS1NeQMKGPBeLwACCfAAFAsU8F8vTXkDChjwAE15AwoY8EgwAAIS8AAIFDzwSTBNeQMKGPBaMAACCfAASgMLNPBbME15AwoY8HA2AAIJ8ABjAQs+8HE2TXkDChjweDkAAg/wAGMFETvweTlNeQMKGPBARQEAAgzwAEodDjrwQUUBTXkDChjwVn8BAAIU8AA9FinwV38BTXkDChjwUkECAAIM8AAPDi/wU0ECTXkDChjwckECAAIP8AAZESnwc0ECTXkDChjwZkICAAIR8ABMBxMq8GdCAk15AwoY8EBRAgACDPAASwwOSAHwQVECTXkDChjwWGkCAAIH8AAcCRPwWWkCTXkDChjwUmoCAAII8AAzClAB8FNqAk15AwoY8HprAgACFPAAGRY58HtrAk15AwoY8G5sAgACCPAAEAoj8G9sAk15AwoY8FBtAgACDvAATAEQHfBRbQJNeQMKGPBqbwIAAg3wAFQFDxzwa28CTXkDChjwVHoCAAIN8AAkDybwVXoCTXkDChjwAE15AwoY8ABNeQMKGPBeewIAAgzwAB0OJ/BfewJNeQMKGPBafAIAAgfwAC0JHfBbfAJNeQMKGPB2fQIAAhHwAE0MEzHwd30CTXkDChjwUlYDAAIM8ABPAw438FNWA015AwoY8HJcAwACCvAALAwq8HNcA015AwoY8ExeAwACDvAAORBIAfBNXgNNeQMKGPBAYAMAAg/wAHQCEUkB8EFgA015AwoY8GplAwACBvAADwgh8GtlA015AwoY8EpmAwACDfAAEw8e8EtmA015AwoY8HJmAwACCvAASwQMSAHwc2YDTXkDChjwSm8DAAIG8AAlCBHwS28DTXkDChjwVnADAAIM8AAtDifwV3ADTXkDChjwcnEDAAIK8AAUDCrwc3EDTXkDChjwXHIDAAIJ8AAQCznwXXIDTXkDChjwfnIDAAIK8ABVAwwv8H9yA015AwoY8Gp5AwACDPAAHg5GAfBreQNNeQMKGPBoegMAAgvwAA0NHfBpegNNeQMKGPAATXkDChjwAE15AwoY8ER7AwACEfAASgMTKPBFewNNeQMKGPBaQQQAAgvwAEACDSbwW0EETXkDChjwXEUEAAIU8AByAhYx8F1FBE15AwoY8EJLBAACCPAADQpEAfBDSwRNeQMKGPBeSwQAAgnwACQLFvBfSwRNeQMKGPBoTAQAAgnwAHkBCxbwaUwETXkDChjwXFAEAAIK8AAiDEUB8F1QBE15AwoY8GJRBAACEvAAcQMULvBjUQRNeQMKGPBGWQQAAgzwABUOHfBHWQRNeQMKGPByWQQAAgzwADIOMfBzWQRNeQMKGPBYWwQAAhDwAD0SQAHwWVsETXkDChjwVF0EAAIQ8AByIhI/8FVdBE15AwoY8HpiBQACEvAAZw4UJfB7YgVNeQMKGPBKQAYAAgvwAHkDDT7wS0AGTXkDChjwfkcGAAIR8ABSARMh8H9HBk15AwoY8GRKBgACCfAAGgs+8GVKBk15AwoY8FpLBgACB/AAeQMJHPBbSwZNeQMKGPAATXkDChjwTlMGbxULK/BgKxAURgHwImQHEhzwSg84EkAB8HIBJBI88EoBSgsOP/BWFk4CFiXwXgQbCy/wOBcLKfAwdQEKHfBsAx4LF/BfcQdNeQMKGPAATXkDChjwAE15AwoYgAaABoAGckIAAAA=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 6
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
topics.cpython-311.opt-1.pyc
472.25 KB
lrw-r--r--
2025-07-23 10:03:43
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
topics.cpython-311.opt-2.pyc
472.25 KB
lrw-r--r--
2025-07-23 10:03:43
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
topics.cpython-311.pyc
472.25 KB
lrw-r--r--
2025-07-23 10:03:43
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-311.opt-1.pyc
173 B
lrw-r--r--
2025-07-23 10:03:43
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-311.opt-2.pyc
173 B
lrw-r--r--
2025-07-23 10:03:43
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-311.pyc
173 B
lrw-r--r--
2025-07-23 10:03:43
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).