murano-deployment/ExecutionPlan/SqlServerAlwaysOnAvailabili.../InstallSqlServerForAOAG.yam...

27 lines
124 KiB
JSON

{
"Commands": [
{
"Name": "Disable-Firewall",
"Arguments": {}
},
{
"Name": "Install-SQLServerForAOAG",
"Arguments": {
"SQLServiceUserPassword": "$domainAdminAccountPassword",
"SQLServiceUserDomain": "$domainName",
"SQLServiceUserName": "$domainAdminAccountName"
}
},
{
"Name": "Install-SqlServerPowerShellModule",
"Arguments": {}
}
],
"Scripts": [
"SW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zIC1Gb3JjZQoKCmZ1bmN0aW9uIFNob3ctSW52b2NhdGlvbkluZm8gewogICAgcGFyYW0gKAogICAgICAgICRJbnZvY2F0aW9uLAogICAgICAgIFtTd2l0Y2hdICRFbmQKICAgICkKCiAgICBpZiAoJEVuZCkgewogICAgICAgIFdyaXRlLUxvZ0RlYnVnICI8L2Z1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiPGZ1bmN0aW9uIG5hbWU9JyQoJEludm9jYXRpb24uTXlDb21tYW5kLk5hbWUpJz4iCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjxwYXJhbT4iCiAgICAgICAgZm9yZWFjaCAoJFBhcmFtZXRlciBpbiAkSW52b2NhdGlvbi5NeUNvbW1hbmQuUGFyYW1ldGVycykgewogICAgICAgICAgICBmb3JlYWNoICgkS2V5IGluICRQYXJhbWV0ZXIuS2V5cykgewogICAgICAgICAgICAgICAgJFR5cGUgPSAkUGFyYW1ldGVyWyRLZXldLlBhcmFtZXRlclR5cGUuRnVsbE5hbWUKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRWYWx1ZSBpbiAkSW52b2NhdGlvbi5Cb3VuZFBhcmFtZXRlcnNbJEtleV0pIHsKICAgICAgICAgICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiWyRUeXBlXSAkS2V5ID0gJyRWYWx1ZSciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgV3JpdGUtTG9nRGVidWcgIjwvcGFyYW0+IgogICAgfQp9CgoKJFRyYXBIYW5kbGVyID0gewogICAgV3JpdGUtTG9nRXJyb3IgQCgiPGV4Y2VwdGlvbj4iLCAkXykgLUVudGlyZU9iamVjdAogICAgV3JpdGUtTG9nRXJyb3IgIjwvZXhjZXB0aW9uPiIKICAgIGJyZWFrCn0KCgp0cmFwIHsKICAgICYkVHJhcEhhbmRsZXIKfQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICdTdG9wJwoKCjwjCiMgVXNhZ2UgZXhhbXBsZSBmb3IgU2hvdy1JbnZvY2F0aW9uSW5mbwoKZnVuY3Rpb24gTXlGdW5jdGlvbiB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJFZhbHVlMSwKICAgICAgICBbU3RyaW5nXSAkVmFsdWUyLAogICAgICAgIFtJbnRdICRJbnQxCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KICAgICAgICAjIE1haW4gY29kZSBoZXJlCiAgICB9Cn0KIz4K",
"ZnVuY3Rpb24gTmV3LU9wdGlvbiAoW3N0cmluZ10kTmFtZSwgW3N3aXRjaF0kU3dpdGNoLCBbc3dpdGNoXSRCb29sZWFuLCBbc3dpdGNoXSRTdHJpbmcsIFtzd2l0Y2hdJExpc3QsICRDb25zdHJhaW50cz0kbnVsbCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb24gb2JqZWN0CgogICAgLkRFU0NSSVBUSU9OCiAgICBPcHRpb24gb2JqZWN0IGlzIGEgdmlydHVhbCBvYmplY3QgcmVwcmVzdG50aW5nIHR5cGVkIGNvbW1hbmQgbGluZSBvcHRpb24uIFRoZXNlIG9iamVjdHMgZW5jYXBzdWxhdGUgZXNjYXBpbmcgYW5kCiAgICB2YWxpZGF0aW9uIG1hdHRlcnMuCgogICAgT25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgc3dpdGNoZXMgJ1N3aXRjaCcsICdCb29sZWFuJywgJ1N0cmluZycgb3IgJ0xpc3QnIHNob3VsZCBiZSBwcm92aWRlZC4KCiAgICAuUEFSQU1FVEVSIE5hbWUKICAgIE9wdGlvbiBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIGNvbW1hbmQgbGluZS4KCiAgICAuUEFSQU1FVEVSIFN3aXRjaAogICAgVXNlIHRoaXMgc3dpdGNoIHRvIGNyZWF0ZSB2YWx1ZWxlc3Mgb3B0aW9uIChhIHN3aXRjaCkuCgogICAgLlBBUkFNRVRFUiBCb29sZWFuCiAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gY3JlYXRlIGJvb2xlYW4gb3B0aW9uLiBJdHMgdmFsdWUgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byAiMSIgb3IgIjAiCgogICAgLlBBUkFNRVRFUiBTdHJpbmcKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgc3RyaW5nIG9wdGlvbi4gSXRzIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgcXVvdGVkIGlmIG5lY2Vzc2FyeS4KCiAgICAuUEFSQU1FVEVSIExpc3QKICAgIFVzZSB0aGlzIHN3aXRjaCB0byBjcmVhdGUgb3B0aW9uIHdpdGggbGlzdCB2YWx1ZS4gVmFsdWVzIHdpbGwgYmUgcHV0IGludG8gY29tbWFuZCBsaW5lIHVzaW5nIHZhbGlkIHZhbHVlIGRlbGVtaXRlciAoYSBjb21tYSkKCiAgICAuUEFSQU1FVEVSIENvbnN0cmFpbnRzCiAgICBXaGVuIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgb3B0aW9uIHZhbHVlcyBhcmUgbGltaXRlZCB0byBvcHRpb25zIGZyb20gdGhhdCBsaXN0LgoKICAgICM+CgogICAgJE9wdGlvbiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFBTT2JqZWN0CgogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBUeXBlIC12YWx1ZSAkbnVsbAogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IE5hbWUgLXZhbHVlICRudWxsCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgQWxsb3dlZFZhbHVlcyAtdmFsdWUgJG51bGwKCiAgICAjIEluaXQKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgX19pbml0X18gewogICAgICAgIHBhcmFtKFtzdHJpbmddJE5hbWUsICRTd2l0Y2gsICRCb29sZWFuLCAkU3RyaW5nLCAkTGlzdCkKCiAgICAgICAgJHRoaXMuTmFtZSA9ICROYW1lCiAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgIyBXaXRoIHJlc3BlY3QgZm9yIG91ciBkZXZlbG9wZXJzIHdlIGRvIG5vdCBjaGVjayBmb3IgZG91YmxlIHR5cGUgc2VsZWN0ZWQKICAgICAgICBpZiAoJFN3aXRjaCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3dpdGNoKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkQm9vbGVhbikgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uQm9vbGVhbigkdGhpcykKICAgICAgICB9IGVsc2VpZiAoJFN0cmluZykgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uU3RyaW5nKCR0aGlzKQogICAgICAgIH0gZWxzZWlmICgkTGlzdCkgewogICAgICAgICAgICBBdWdtZW50T3B0aW9uTGlzdCgkdGhpcykKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyAiU3dpdGNoLCBCb29sZWFuLCBTdHJpbmcgb3IgTGlzdCBvcHRpb24gdHlwZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBvcHRpb24gJyROYW1lJyIKICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIF9fcG9zdF9pbml0X18gewogICAgICAgIHBhcmFtKCRDb25zdHJhaW50cz0kbnVsbCkKICAgICAgICBpZiAoJENvbnN0cmFpbnRzIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkdGhpcy5BbGxvd2VkVmFsdWVzID0gQCgpCiAgICAgICAgICAgICR0aGlzLkFsbG93ZWRWYWx1ZXMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzICsgJENvbnN0cmFpbnRzCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJENvbnN0cmFpbnRzID0gJG51bGwKICAgICAgICB9CiAgICB9CgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBWYWxpZGF0ZSB7CiAgICAgICAgaWYgKCR0aGlzLkFsbG93ZWRWYWx1ZXMgLW5lICRudWxsKSB7CiAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICR0aGlzLlZhbHVlKSkgewogICAgICAgICAgICAgICAgJEN0cyA9ICR0aGlzLkFsbG93ZWRWYWx1ZXMgLWpvaW4gJywnCiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckKCR0aGlzLk5hbWUpJyBtYXkgaGF2ZSB2YWx1ZXMgKCRDdHMpIGJ1dCBub3QgJyQoJHRoaXMuVmFsdWUpJyIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFRvU3RyaW5nIHsKICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpIgogICAgfQoKICAgICMgaW52b2tlIGNvbnN0cnVjdG9yCgogICAgJE9wdGlvbi5fX2luaXRfXygkTmFtZSwgJFN3aXRjaCwgJEJvb2xlYW4sICRTdHJpbmcsICRMaXN0KQogICAgJE9wdGlvbi5fX3Bvc3RfaW5pdF9fKCRDb25zdHJhaW50cykKCiAgICByZXR1cm4gJE9wdGlvbgp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3dpdGNoKCRPcHRpb24pIHsKfQoKZnVuY3Rpb24gQXVnbWVudE9wdGlvbkJvb2xlYW4oJE9wdGlvbikgewogICAgIyBGaWVsZHMKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIE5vdGVQcm9wZXJ0eSBWYWx1ZSAtdmFsdWUgJGZhbHNlCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgaWYgKCR0aGlzLlZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9MSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gIi8kKCR0aGlzLk5hbWUpPTAiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uU3RyaW5nKCRPcHRpb24pIHsKICAgICMgRmllbGRzCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgVmFsdWUgLXZhbHVlICIiCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgLUZvcmNlIFNjcmlwdE1ldGhvZCBUb1N0cmluZyB7CiAgICAgICAgJHYgPSAiJCgkdGhpcy5WYWx1ZSkiCiAgICAgICAgaWYgKCR2IC1tYXRjaCAnLiogLionKSB7CiAgICAgICAgICAgICMgVE9ETzogRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9YCIkdmAiIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JHYiCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBBdWdtZW50T3B0aW9uTGlzdCgkT3B0aW9uKSB7CiAgICAjIEZpZWxkcwogICAgJE9wdGlvbiB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFZhbHVlIC12YWx1ZSBAKCkKCiAgICAjIE1ldGhvZHMKCiAgICAkT3B0aW9uIHwgQWRkLU1lbWJlciAtRm9yY2UgU2NyaXB0TWV0aG9kIFZhbGlkYXRlIHsKICAgICAgICBpZiAoJHRoaXMuQWxsb3dlZFZhbHVlcyAtbmUgJG51bGwpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJFYgaW4gJHRoaXMuVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgtbm90KCR0aGlzLkFsbG93ZWRWYWx1ZXMgLWNvbnRhaW5zICRWKSkgewogICAgICAgICAgICAgICAgICAgICRDdHMgPSAkdGhpcy5BbGxvd2VkVmFsdWVzIC1qb2luICcsJwogICAgICAgICAgICAgICAgICAgIHRocm93ICJPcHRpb24gJyQoJHRoaXMuTmFtZSknIG1heSBoYXZlIHZhbHVlcyAoJEN0cykgYnV0IG5vdCAnJFYnIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRPcHRpb24gfCBBZGQtTWVtYmVyIC1Gb3JjZSBTY3JpcHRNZXRob2QgVG9TdHJpbmcgewogICAgICAgIHJldHVybiAiLyQoJHRoaXMuTmFtZSk9JCgkdGhpcy5WYWx1ZSAtam9pbiAnLCcpIgogICAgfQp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyKCkgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBPcHRpb25QYXJzZXIgb2JqZWN0LgoKICAgIC5ERVNDUklQVElPTgogICAgT3B0aW9uUGFyc2VyIG9iamVjdCBsZXZlcmFnZXMgT3B0aW9uIG9iamVjdHMgY2FwYWJpbGl0aWVzIGFuZCBidWlsZHMgdmFsaWQgY29tbWFuZCBsaW5lIHVzaW5nIHNwZWNpZmllZCBvcHRpb25zLgogICAgQW4gYXBwbGljYXRpb24gbWF5IGFsc28gYmUgaW52b2tlZCB3aXRoIE9wdGlvblBhcnNlci4KCiAgICAjPgoKICAgICRPcHRpb25QYXJzZXIgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBQU09iamVjdAoKICAgICMgRmllbGRzCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgT3B0aW9ucyAtdmFsdWUgQHt9CiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBOb3RlUHJvcGVydHkgRGVmYXVsdHMgLXZhbHVlIEB7fQogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgTm90ZVByb3BlcnR5IFJlcXVpcmVkT3B0aW9ucyAtdmFsdWUgQCgpCgogICAgIyBNZXRob2RzCgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIEFkZE9wdGlvbiB7CiAgICAgICAgPCMKICAgICAgICAuU1lOT1BTSVMKICAgICAgICBBZGRzIHN1cHBvcnRlZCBvcHRpb24gaW50byBPcHRpb25QYXJzZXIuCiAgICAgICAgCiAgICAgICAgLkRFU0NSSVBUSU9OCiAgICAgICAgT3B0aW9uUGFyc2VyIGRvZXMgbm90IGFsbG93IHVzaW5nIHVucmVjb2duaXplZCBvcHRpb25zLiBVc2UgdGhpcyBtZXRob2QgdG8gZmlsbCBPcHRpb25QYXJzZXIgd2l0aCByZWNvZ25pemVkIG9wdGlvbnMKCiAgICAgICAgLlBBUkFNRVRFUiBPcHRpb24KICAgICAgICBPcHRpb24gb2JqZWN0CgogICAgICAgIC5QQVJBTUVURVIgUmVxdWlyZWQKICAgICAgICBSZXF1aXJlZCBvcHRpb24gc3dpdGNoCgogICAgICAgIC5QQVJBTUVURVIgRGVmYXVsdAogICAgICAgIE9wdGlvbiBkZWZhdWx0IHZhbHVlCiAgICAgICAgIz4KICAgICAgICBwYXJhbSgkT3B0aW9uLCBbYm9vbF0kUmVxdWlyZWQ9JGZhbHNlLCAkRGVmYXVsdD0kbnVsbCkKICAgICAgICAkdGhpcy5PcHRpb25zLkFkZCgkT3B0aW9uLk5hbWUsICRPcHRpb24pCiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgPSAkdGhpcy5SZXF1aXJlZE9wdGlvbnMgKyAkT3B0aW9uLk5hbWUKICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgIGlmICgkRGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLkRlZmF1bHRzLkFkZCgkT3B0aW9uLk5hbWUsICREZWZhdWx0KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMuRGVmYXVsdHMuQWRkKCRPcHRpb24uTmFtZSwgJG51bGwpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJE9wdGlvblBhcnNlciB8IEFkZC1NZW1iZXIgU2NyaXB0TWV0aG9kIFBhcnNlIHsKICAgICAgICA8IwogICAgICAgIC5TWU5PUFNJUwogICAgICAgIFBhcnNlcyBzdXBwbGllZCBvcHRpb25zIGFuZCByZXR1cm5zIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzIGFycmF5LgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgb25seSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGFsbCBtYW5kYXRvcnkgb3B0aW9ucyBhcmUgaW4gcGxhY2UsIAogICAgICAgIGFsbCBvcHRpb24gbWVldCBjb25zdHJhaW50cyBpZiBhbnkuIFVuc3BlY2lmaWVkIG9wdGlvbnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhcmUgYWRkZWQgdG8gY29tbWFuZCBsaW5lLgogICAgICAgIFNvLCBtYW5kYXRvcnkgb3B0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZSBuZXZlciBjYXVzZXMgZXhjZXB0aW9uLgoKICAgICAgICAuUEFSQU1FVEVSIE9wdGlvbnMKICAgICAgICBBIGhhc2ggbWFwIG9mIG9wdGlvbnMgdG8gcGFyc2UuIE9wdGlvbiBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgogICAgICAgICM+CiAgICAgICAgcGFyYW0oW2hhc2h0YWJsZV0kT3B0aW9ucykKCiAgICAgICAgJENvbW1hbmRMaW5lID0gQCgpCiAgICAgICAgZm9yZWFjaCAoJFJlcXVpcmVkT3B0aW9uTmFtZSBpbiAkdGhpcy5SZXF1aXJlZE9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJE9wdGlvbnMuQ29udGFpbnNLZXkoJFJlcXVpcmVkT3B0aW9uTmFtZSkpIHsKICAgICAgICAgICAgICAgICREZWZhdWx0ID0gJHRoaXMuRGVmYXVsdHMuR2V0X0l0ZW0oJFJlcXVpcmVkT3B0aW9uTmFtZSkKICAgICAgICAgICAgICAgIGlmICgkdGhpcy5EZWZhdWx0cy5Db250YWluc0tleSgkUmVxdWlyZWRPcHRpb25OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25zLkFkZCgkUmVxdWlyZWRPcHRpb25OYW1lLCAkdGhpcy5EZWZhdWx0cy5HZXRfSXRlbSgkUmVxdWlyZWRPcHRpb25OYW1lKSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgIlJlcXVpcmVkIG9wdGlvbiAnJFJlcXVpcmVkT3B0aW9uTmFtZScgaXMgbWlzc2luZyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJE9wdGlvbk5hbWUgaW4gJCgkT3B0aW9ucy5rZXlzKSkgewogICAgICAgICAgICAkT3B0aW9uID0gJHRoaXMuT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgaWYgKCRPcHRpb24gLWVxICRudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiT3B0aW9uICckT3B0aW9uTmFtZScgaXMgbm90IGFsbG93ZWQiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRPcHRpb24gfCBHZXQtTWVtYmVyICJWYWx1ZSIpIHsKICAgICAgICAgICAgICAgICRPcHRpb24uVmFsdWUgPSAkT3B0aW9ucy5HZXRfSXRlbSgkT3B0aW9uTmFtZSkKICAgICAgICAgICAgfQogICAgICAgICAgICAkT3B0aW9uLlZhbGlkYXRlKCkKICAgICAgICAgICAgJENvbW1hbmRMaW5lID0gJENvbW1hbmRMaW5lICsgJE9wdGlvbi5Ub1N0cmluZygpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ29tbWFuZExpbmUKICAgIH0KCiAgICAkT3B0aW9uUGFyc2VyIHwgQWRkLU1lbWJlciBTY3JpcHRNZXRob2QgRXhlY3V0ZUJpbmFyeSB7CiAgICAgICAgcGFyYW0oJEJpbmFyeSwgW2hhc2h0YWJsZV0kT3B0aW9ucyA9IEB7fSwgJENvbW1hbmRMaW5lU3VmZml4ID0gQCgpKQogICAgICAgIDwjCiAgICAgICAgLlNZTk9QU0lTCiAgICAgICAgRXhlY3V0ZXMgYmluYXJ5IHdpdGggYSBjb21tYW5kIGxpbmUgY29uc3RydWN0ZWQgZnJvbSBwcm92aWRlZCBvcHRpb25zLiBBbiBhcmJpdHJhcnkgc3VmZml4IG1heSBiZSAKICAgICAgICBhcHBlbmRlZCB0byB0aGUgY29tbWFuZCBsaW5lLgogICAgICAgIAogICAgICAgIC5ERVNDUklQVElPTgogICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgT3B0aW9uUGFyc2VyLlBhcnNlIG1ldGhvZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lLiBJZiB0aGVyZSBhIGNvbW1hbmQgbGluZSBzdWZmaXggCiAgICAgICAgd2FzIHN1cHBsaWVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIGNvbW1hbmQgbGluZS4gTm9ybWFsbHkgY29tbWFuZCBsaW5lIHN1ZmZpeCBzaG91bGQgY29udGFpbgogICAgICAgIGxlYWRpbmcgc3BhY2UgY2hhcmFjdGVyLgoKICAgICAgICBNZXRob2Qgd2FpdHMgZm9yIGV4ZWN1dGFibGUgcHJvY2VzcyB0byBjb21wbGV0ZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBjb2RlLgoKICAgICAgICAuUEFSQU1FVEVSIEJpbmFyeQogICAgICAgIEZ1bGwgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSB0byBydW4uCgogICAgICAgIC5QQVJBTUVURVIgT3B0aW9ucwogICAgICAgIEEgaGFzaCBtYXAgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBleGVjdXRhYmxlLgoKICAgICAgICAuUEFSQU1FVEVSIENvbW1hbmRMaW5lU3VmZml4CiAgICAgICAgQXJiaXRyYXJ5IGNvbW1hbmQgbGluZSBzdWZmaXguIE5vcm1hbGx5IGl0IHNob3VkIGhhdmUgbGVhZGluZyBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICAgIz4KCiAgICAgICAgJEJpbmFyeSA9IEdldC1JdGVtICRCaW5hcnkKICAgICAgICAkQ29tbWFuZExpbmUgPSAkdGhpcy5QYXJzZSgkT3B0aW9ucykKICAgICAgICBpZiAoJENvbW1hbmRMaW5lU3VmZml4KSB7CiAgICAgICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICRDb21tYW5kTGluZVN1ZmZpeAogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6ICQoJEJpbmFyeS5GdWxsTmFtZSkgJCgkQ29tbWFuZExpbmUgLWpvaW4gJyAnKSIKICAgICAgICAkcHJvY2VzcyA9IFtTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzc106OlN0YXJ0KCRCaW5hcnksICRDb21tYW5kTGluZSkKICAgICAgICAkcHJvY2Vzcy5XYWl0Rm9yRXhpdCgpCiAgICAgICAgJHByb2Nlc3MuUmVmcmVzaCgpCiAgICAgICAgcmV0dXJuICRwcm9jZXNzLkV4aXRDb2RlCiAgICB9CgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQo=",
"ZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckluc3RhbGwgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIklOU1RBTEwiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkSXNQYXJ0T2ZEb21haW4gPSAoR2V0LVdtaU9iamVjdCBXaW4zMl9Db21wdXRlclN5c3RlbSkuUGFydE9mRG9tYWluCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIklOU1RBTEwiKSwgJHRydWUsICJJTlNUQUxMIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICMkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVwZGF0ZVNvdXJjZSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIkRSRVBMQVlfQ1RMUiIsIkRSRVBMQVlfQ0xUIiwiU05BQ19TREsiLCJTREsiLCJMb2NhbERCIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJPTEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU1BJX0FTX0V4aXN0aW5nRmFybSIsICJTUElfQVNfTmV3RmFybSIsICJBbGxGZWF0dXJlc19XaXRoRGVmYXVsdHMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRFdPV0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlVJTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJOb3JtYWwiLCAiQXV0b0FkdmFuY2UiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU0NPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNDT05GSUdESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQVNMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU0VSVkVSTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNVUxUSURJTUVOU0lPTkFMIiwgIlBPV0VSUElWT1QiLCAiVEFCVUxBUiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgaWYgKCRJc1BhcnRPZkRvbWFpbikgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6VVNFUkRPTUFJTlxBZG1pbmlzdHJhdG9yIikKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1NZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFbnY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBU1RFTVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFTUFJPVklERVJNU09MQVAiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkFSTVBBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJQQVNTUEhSQVNFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGQVJNQURNSU5JUE9SVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQlJPV1NFUlNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5BQkxFUkFOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNRTERBVEFESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNBUFdEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTRUNVUklUWU1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnJzICgiU1FMIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTEJBQ0tVUERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQ09MTEFUSU9OIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBRERDVVJSRU5UVVNFUkFTU1FMQURNSU4iIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgCiAgICAjJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgIGlmICgkSXNQYXJ0T2ZEb21haW4pIHsKICAgICAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6Q09NUFVURVJOQU1FXEFkbWluaXN0cmF0b3IiKQogICAgfQogICAgCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNTEVWRUwiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiMCIsICIxIiwgIjIiLCAiMyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGSUxFU1RSRUFNU0hBUkVOQU1FIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ0FDQ09VTlQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSVNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIk5QRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlRDUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU0lOU1RBTExNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIlNoYXJlUG9pbnRGaWxlc09ubHlNb2RlIiwgIkRlZmF1bHROYXRpdmVNb2RlIiwgIkZpbGVzT25seU1vZGUiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ1N0YXJ0dXBUeXBlIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZSB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IGZvciBpbnN0YWxsZXIgdmVyc2lvbiBvZiBNUyBTUUwgU2VydmVyIHByaW9yIHRvIDIwMTIgU1AxIEN1bXVsYXRpdmUgVXBkYXRlIDIgb25seSB0aGUKICAgIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOiBTUUxFbmdpbmUsIFJlcGxpY2F0aW9uLCBGdWxsVGV4dCwgUlMKCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiUHJlcGFyZUltYWdlIiksICR0cnVlLCAiUHJlcGFyZUltYWdlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJQUNDRVBUU1FMU0VSVkVSTElDRU5TRVRFUk1TIiAtU3dpdGNoKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVFbmFibGVkIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJVcGRhdGVTb3VyY2UiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKIyAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJSUyIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGRUFUVVJFUyIgLUxpc3QgLUNvbnN0cmFpbnRzICgiU1FMIiwiU1FMRW5naW5lIiwiUmVwbGljYXRpb24iLCJGdWxsVGV4dCIsIkRRIiwiQVMiLCJSUyIsIkRRQyIsIklTIiwiTURTIiwiVG9vbHMiLCJCQyIsIkJPTCIsIkJJRFMiLCJDb25uIiwiU1NNUyIsIkFEVl9TU01TIiwiRFJFUExBWV9DVExSIiwiRFJFUExBWV9DTFQiLCJTTkFDX1NESyIsIlNESyIsIkxvY2FsREIiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTSEFSRURESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQU5DRUlEIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJQcmVwYXJlSW1hZ2VTUDFVMiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDcmVhdGVzIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiUHJlcGFyZUltYWdlIiBhY3Rpb24uCgogICAgVGhpcyBjbWRsZXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9yIGxhdGVyLgoKICAgIE5vdGUgdGhhdCBmb3IgaW5zdGFsbGVyIHZlcnNpb24gb2YgTVMgU1FMIFNlcnZlciBwcmlvciB0byAyMDEyIFNQMSBDaW1pbGF0aXZlIFVwZGF0ZSAyIG9ubHkgdGhlCiAgICBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDogU1FMRW5naW5lLCBSZXBsaWNhdGlvbiwgRnVsbFRleHQsIFJTCgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlByZXBhcmVJbWFnZSIpLCAkdHJ1ZSwgIlByZXBhcmVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlRW5hYmxlZCIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVXBkYXRlU291cmNlIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJDT05GSUdVUkFUSU9ORklMRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRkVBVFVSRVMiIC1MaXN0IC1Db25zdHJhaW50cyAoIlNRTCIsIlNRTEVuZ2luZSIsIlJlcGxpY2F0aW9uIiwiRnVsbFRleHQiLCJEUSIsIkFTIiwiUlMiLCJEUUMiLCJJUyIsIk1EUyIsIlRvb2xzIiwiQkMiLCJCT0wiLCJCSURTIiwiQ29ubiIsIlNTTVMiLCJBRFZfU1NNUyIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJISURFQ09OU09MRSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFMTFNIQVJFRERJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk1TU1FMU0VSVkVSIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCgogICAgcmV0dXJuICRPcHRpb25QYXJzZXIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBhbiBvcHRpb24gcGFyc2VyIGZvciBNUyBTUUwgU2VydmVyIDIwMTIgc2V0dXAgIkNvbXBsZXRlSW1hZ2UiIGFjdGlvbi4KCiAgICAuREVTQ1JJUFRJT04KICAgIFVzZSB0aGlzIGNtZGxldCB0byBjcmVhdGUgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgTm90ZSB0aGF0IElOU1RBTkNFSUQgcGFyYW1ldGVyIHZhbHVlIE1VU1QgYmUgdGhlIHNhbWUgYXMgc3BlY2lmaWVkIG9uICJQcmVwYXJlSW1hZ2UiIHBoYXNlLgoKICAgIEFsbCBkb2N1bWVudGVkIG9wdGlvbiBhcmUgc3VwcG9ydGVkLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvciBkZXRhaWxzOgogICAgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKICAgICM+CiAgICAkT3B0aW9uUGFyc2VyID0gTmV3LU9wdGlvblBhcnNlcgoKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBQ1RJT04iIC1TdHJpbmcgLUNvbnN0cmFpbnRzICJDb21wbGV0ZUltYWdlIiksICR0cnVlLCAiQ29tcGxldGVJbWFnZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSUFDQ0VQVFNRTFNFUlZFUkxJQ0VOU0VURVJNUyIgLVN3aXRjaCksICR0cnVlKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOVSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVSUk9SUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VJRCIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZyksICR0cnVlLCAiTVNTUUxTRVJWRVIiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlBJRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUVMiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTVJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkhJREVDT05TT0xFIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNBQ0NPVU5UIiAtU3RyaW5nKSwgJHRydWUsICJOVCBBVVRIT1JJVFlcTmV0d29yayBTZXJ2aWNlIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUdUU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJCUk9XU0VSU1ZDU1RBUlRVUFRZUEUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTkFCTEVSQU5VIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJJTlNUQUxMU1FMREFUQURJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0FQV0QiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNFQ1VSSVRZTU9ERSIgLVN0cmluZyAtQ29uc3RyYWlucnMgKCJTUUwiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMQkFDS1VQRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxDT0xMQVRJT04iIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNZU0FETUlOQUNDT1VOVFMiIC1TdHJpbmcpLCAkdHJ1ZSwgIiRFTlY6VVNFUkRPTUFJTlwkRU5WOlVTRVJOQU1FIikKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxURU1QREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVVNFUkRCRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJMT0dESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1MRVZFTCIgLVN0cmluZyAtQ29uc3RyYWludHMgKCIwIiwgIjEiLCAiMiIsICIzIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZJTEVTVFJFQU1TSEFSRU5BTUUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZUU1ZDQUNDT1VOVCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiTlBFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiVENQRU5BQkxFRCIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTSU5TVEFMTE1PREUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiU2hhcmVQb2ludEZpbGVzT25seU1vZGUiLCAiRGVmYXVsdE5hdGl2ZU1vZGUiLCAiRmlsZXNPbmx5TW9kZSIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJSU1NWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDU3RhcnR1cFR5cGUiIC1TdHJpbmcgLUNvbnN0cmFpbnRzICgiTWFudWFsIiwgIkF1dG9tYXRpYyIsICJEaXNhYmxlZCIpKSkKCiAgICByZXR1cm4gJE9wdGlvblBhcnNlcgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVJbWFnZVNQMVUyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJDb21wbGV0ZUltYWdlIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiQ29tcGxldGVJbWFnZSIgYWN0aW9uLgoKICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBTUDEgQ2ltaWxhdGl2ZSBVcGRhdGUgMiBvciBsYXRlci4KCiAgICBBbGwgZG9jdW1lbnRlZCBvcHRpb24gYXJlIHN1cHBvcnRlZC4gU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgZGV0YWlsczoKICAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE0NDI1OS5hc3B4CiAgICAjPgogICAgJE9wdGlvblBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXIKCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQUNUSU9OIiAtU3RyaW5nIC1Db25zdHJhaW50cyAiQ29tcGxldGVJbWFnZSIpLCAkdHJ1ZSwgIkNvbXBsZXRlSW1hZ2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklBQ0NFUFRTUUxTRVJWRVJMSUNFTlNFVEVSTVMiIC1Td2l0Y2gpLCAkdHJ1ZSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkNPTkZJR1VSQVRJT05GSUxFIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJFUlJPUlJFUE9SVElORyIgLUJvb2xlYW4pKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklORElDQVRFUFJPR1JFU1MiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFSUQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTkNFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUElEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRIiAtU3dpdGNoKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJRUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FNUkVQT1JUSU5HIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ0FDQ09VTlQiIC1TdHJpbmcpLCAkdHJ1ZSwgIk5UIEFVVEhPUklUWVxOZXR3b3JrIFNlcnZpY2UiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFHVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJBR1RTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkJST1dTRVJTVkNTVEFSVFVQVFlQRSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkVOQUJMRVJBTlUiIC1Td2l0Y2gpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIklOU1RBTExTUUxEQVRBRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTQVBXRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU0VDVVJJVFlNT0RFIiAtU3RyaW5nIC1Db25zdHJhaW5ycyAoIlNRTCIpKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxCQUNLVVBESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTENPTExBVElPTiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1ZDUEFTU1dPUkQiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFNWQ1NUQVJUVVBUWVBFIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIk1hbnVhbCIsICJBdXRvbWF0aWMiLCAiRGlzYWJsZWQiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMU1lTQURNSU5BQ0NPVU5UUyIgLVN0cmluZyksICR0cnVlLCAiJEVOVjpVU0VSRE9NQUlOXCRFTlY6VVNFUk5BTUUiKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFRFTVBEQkRJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiU1FMVEVNUERCTE9HRElSIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJTUUxVU0VSREJESVIiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlNRTFVTRVJEQkxPR0RJUiIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTUxFVkVMIiAtU3RyaW5nIC1Db25zdHJhaW50cyAoIjAiLCAiMSIsICIyIiwgIjMiKSkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRklMRVNUUkVBTVNIQVJFTkFNRSIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiRlRTVkNBQ0NPVU5UIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJGVFNWQ1BBU1NXT1JEIiAtU3RyaW5nKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJOUEVOQUJMRUQiIC1Cb29sZWFuKSkKICAgICRPcHRpb25QYXJzZXIuQWRkT3B0aW9uKChOZXctT3B0aW9uICJUQ1BFTkFCTEVEIiAtQm9vbGVhbikpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNJTlNUQUxMTU9ERSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJTaGFyZVBvaW50RmlsZXNPbmx5TW9kZSIsICJEZWZhdWx0TmF0aXZlTW9kZSIsICJGaWxlc09ubHlNb2RlIikpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIlJTU1ZDQUNDT1VOVCIgLVN0cmluZyksICR0cnVlLCAiTlQgQVVUSE9SSVRZXE5ldHdvcmsgU2VydmljZSIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNQQVNTV09SRCIgLVN0cmluZykpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUlNTVkNTdGFydHVwVHlwZSIgLVN0cmluZyAtQ29uc3RyYWludHMgKCJNYW51YWwiLCAiQXV0b21hdGljIiwgIkRpc2FibGVkIikpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJVcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlckVkaXRpb25VcGdyYWRlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlcGFpciB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJSZWJ1aWxkZGF0YWJhc2UgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVW5pbnN0YWxsIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgYW4gb3B0aW9uIHBhcnNlciBmb3IgTVMgU1FMIFNlcnZlciAyMDEyIHNldHVwICJJTlNUQUxMIiBhY3Rpb24uCgogICAgLkRFU0NSSVBUSU9OCiAgICBVc2UgdGhpcyBjbWRsZXQgdG8gY3JlYXRlIGFuIG9wdGlvbiBwYXJzZXIgZm9yIE1TIFNRTCBTZXJ2ZXIgMjAxMiBzZXR1cCAiSU5TVEFMTCIgYWN0aW9uLgogICAgQWxsIGRvY3VtZW50ZWQgb3B0aW9uIGFyZSBzdXBwb3J0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yIGRldGFpbHM6CiAgICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAogICAgIz4KICAgICRPcHRpb25QYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VyCgogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkFDVElPTiIgLVN0cmluZyAtQ29uc3RyYWludHMgIlVOSU5TVEFMTCIpLCAkdHJ1ZSwgIlVOSU5TVEFMTCIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiQ09ORklHVVJBVElPTkZJTEUiIC1TdHJpbmcpKQogICAgJE9wdGlvblBhcnNlci5BZGRPcHRpb24oKE5ldy1PcHRpb24gIkZFQVRVUkVTIiAtTGlzdCAtQ29uc3RyYWludHMgKCJTUUwiLCJTUUxFbmdpbmUiLCJSZXBsaWNhdGlvbiIsIkZ1bGxUZXh0IiwiRFEiLCJBUyIsIlJTIiwiRFFDIiwiSVMiLCJNRFMiLCJUb29scyIsIkJDIiwiQk9MIiwiQklEUyIsIkNvbm4iLCJTU01TIiwiQURWX1NTTVMiLCJEUkVQTEFZX0NUTFIiLCJEUkVQTEFZX0NMVCIsIlNOQUNfU0RLIiwiU0RLIiwiTG9jYWxEQiIpKSwgJHRydWUpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5ESUNBVEVQUk9HUkVTUyIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSU5TVEFOQ0VOQU1FIiAtU3RyaW5nKSwgJHRydWUsICJNU1NRTFNFUlZFUiIpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiUSIgLVN3aXRjaCkpCiAgICAkT3B0aW9uUGFyc2VyLkFkZE9wdGlvbigoTmV3LU9wdGlvbiAiSElERUNPTlNPTEUiIC1Td2l0Y2gpKQoKICAgIHJldHVybiAkT3B0aW9uUGFyc2VyCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsRmFpbG92ZXJDbHVzdGVyIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclByZXBhcmVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyQ29tcGxldGVGYWlsb3ZlckNsdXN0ZXIgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9CgpmdW5jdGlvbiBOZXctT3B0aW9uUGFyc2VyVXBncmFkZSB7CiAgICAjIFRvRG86IEltcGxlbWVudAogICAgdGhyb3cgIk5vdCB5ZXQgaW1wbGVtZW50ZWQiCn0KCmZ1bmN0aW9uIE5ldy1PcHRpb25QYXJzZXJBZGROb2RlIHsKICAgICMgVG9EbzogSW1wbGVtZW50CiAgICB0aHJvdyAiTm90IHlldCBpbXBsZW1lbnRlZCIKfQoKZnVuY3Rpb24gTmV3LU9wdGlvblBhcnNlclJlbW92ZU5vZGUgewogICAgIyBUb0RvOiBJbXBsZW1lbnQKICAgIHRocm93ICJOb3QgeWV0IGltcGxlbWVudGVkIgp9Cg==",
"SW1wb3J0LU1vZHVsZSBOZXRTZWN1cml0eQoKZnVuY3Rpb24gVGVzdC1LZXkoW3N0cmluZ10kcGF0aCwgW3N0cmluZ10ka2V5KSB7CiAgICBpZighKFRlc3QtUGF0aCAkcGF0aCkpIHsgcmV0dXJuICRmYWxzZSB9CiAgICBpZiAoKEdldC1JdGVtUHJvcGVydHkgJHBhdGgpLiRrZXkgLWVxICRudWxsKSB7IHJldHVybiAkZmFsc2UgfQogICAgcmV0dXJuICR0cnVlCn0KCmZ1bmN0aW9uIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBNUyBTUUwgU2VydmVyIHByZXJlcXVpc2l0ZXMgKC5OZXQgRnJhbWV3b3JrIDMuNSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgcHJlcmVxdWlzaXRlcyAoLk5ldCBGcmFtZXdvcmsgMy41KQoKICAgICM+CiAgICBpZiAoLW5vdCAoVGVzdC1LZXkgIkhLTE06XFNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41IiAiSW5zdGFsbCIpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBTZXJ2ZXJNYW5hZ2VyCiAgICAgICAgV3JpdGUtSG9zdCAiLk5ldCBGcmFtZXdvcmsgMy41IG5vdCBmb3VuZC4gSW5zdGFsbGluZyBpdCB1c2luZyBTZXJ2ZXIgTWFuYWdlci4uLiIKICAgICAgICAkRmVhdHVyZSA9IEdldC1XaW5kb3dzRmVhdHVyZSBORVQtRnJhbWV3b3JrCiAgICAgICAgaWYgKCRGZWF0dXJlIC1lcSAkbnVsbCkgewogICAgICAgICAgICAjIFdlIGFyZSBwcm9iYWJseSBvbiBXaW5kb3dzIFNlcnZlciAyMDEyCiAgICAgICAgICAgICRGZWF0dXJlID0gR2V0LVdpbmRvd3NGZWF0dXJlIE5FVC1GcmFtZXdvcmstQ29yZQogICAgICAgIH0KICAgICAgICBpZiAoLW5vdCAkRmVhdHVyZSkgewogICAgICAgICAgICB0aHJvdyAiLk5ldCBmcmFtZXdvcmsgMy41IGZlYXR1cmUgd2FzIG5vdCBmb3VuZC4iCiAgICAgICAgfQogICAgICAgIGlmICgtbm90ICRGZWF0dXJlLkRpc3BsYXlOYW1lIC1tYXRjaCAiMy41IikgewogICAgICAgICAgICBMb2ctV2FybmluZyAiLk5ldCBmcmFtZXdvcmsgMy41IGlzIHJlcXVpcmVkLCBidXQgJCgkRmVhdHVyZS5EaXNwbGF5TmFtZSkgaXMgYXZhaWxhYmxlIGFzIFdpbmRvd3MgZmVhdHVyZS4gUHJvY2VlZGluZyB3aXRoIGluc3RhbGxhdGlvbiIKICAgICAgICB9CiAgICAgICAgW3ZvaWRdKEFkZC1XaW5kb3dzRmVhdHVyZSAkRmVhdHVyZSkKICAgIH0KfQoKZnVuY3Rpb24gTmV3LVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbiB1bmF0dGVuZGVkIG1vZGUuCgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgIFJlc29sdmUtU1FMU2VydmVyUHJlcmVxdWlzaXRlcwoKICAgICRwYXJzZXIgPSBOZXctT3B0aW9uUGFyc2VySW5zdGFsbAogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUSIgPSAkbnVsbDsgIkZFQVRVUkVTIiA9IEAoIlNRTEVuZ2luZSIsICJDb25uIiwgIlNTTVMiLCAiQURWX1NTTVMiKSArICRFeHRyYUZlYXR1cmVzfSArICRFeHRyYU9wdGlvbnMpCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBOZXctU1FMU2VydmVyRm9yQU9BRyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnN0YWxscyBuZXcgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSB3aXRoIGFsbCBuZWVkZWQgZmVhdHVyZXMgdG8gc2V0IHVwIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCAKICAgIGFuZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW4gdW5hdHRlbmRlZCBtb2RlLiBBbGwgZmVhdHVyZXMgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cHMgYXJlCiAgICBpbnN0YWxsZWQuCgogICAgQWxsIGF2YWlsYWJpbGl0eSBncm91cCBtZW1iZXJzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggdGhlIHNhbWUgU1FMU3ZjVXNyRG9tYW4sIFNRTFN2Y1Vzck5hbWUgYW5kIFNRTFN2Y1VzclBhc3N3b3JkIHBhcmFtZXRlcnMuCiAgICBVc2VyIG11c3QgYmUgYSBkb21haW4gdXNlciBzaW5jZSBpdCB3aWxsIGJlIHVzZWQgZm9yIG5vZGVzIGludGVyY29ubmVjdGlvbi4KCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBTUUxTdmNVc3JEb21haW4KICAgIE1TIFNRTCBTZXJ2ZXIgdXNlciBhY2NvdW50IGRvbWFpbiBuYW1lLgoKICAgIC5QQVJBTUVURVIgU1FMU3ZjVXNyTmFtZQogICAgTVMgU1FMIFNlcnZlciB1c2VyIGFjY291bnQgbmFtZS4KCiAgICAuUEFSQU1FVEVSIFNRTFN2Y1VzclBhc3N3b3JkCiAgICBNUyBTUUwgU2VydmVyIHVzZXIgYWNjb3VudCBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgcmVtb3ZlZCBiZXNpZGVzICJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIiwgIkRSRVBMQVlfQ1RMUiIsICJEUkVQTEFZX0NMVCIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JEb21haW4sCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU1FMU3ZjVXNyTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTUUxTdmNVc3JQYXNzd29yZCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCksCiAgICAgICAgW0hhc2h0YWJsZV0kRXh0cmFPcHRpb25zID0gQHt9CiAgICApCgogICAgJFNldHVwRGlyID0gR2V0LUl0ZW0gJFNldHVwUm9vdAogICAgJFNldHVwRXhlID0gJFNldHVwRGlyLkdldEZpbGVzKCJzZXR1cC5leGUiKVswXQoKICAgICRTUUxVc2VyID0gIiRTUUxTdmNVc3JEb21haW5cJFNRTFN2Y1Vzck5hbWUiCiAgICAkZG9tYWluID0gTmV3LU9iamVjdCBTeXN0ZW0uRGlyZWN0b3J5U2VydmljZXMuRGlyZWN0b3J5RW50cnkoIkxEQVA6Ly8kU1FMU3ZjVXNyRG9tYWluIiwgJFNRTFN2Y1Vzck5hbWUsICRTUUxTdmNVc3JQYXNzd29yZCkKCiAgICBpZiAoJGRvbWFpbi5uYW1lIC1lcSAkbnVsbCkgewogICAgICAgIHRocm93ICJDcmVkZW50aWFscyB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgdXNlciAkU1FMVXNlci4gQ2hlY2sgZG9tYWluLCBsb2dpbiBuYW1lIGFuZCBwYXNzd29yZC4iCiAgICB9CgogICAgUmVzb2x2ZS1TUUxTZXJ2ZXJQcmVyZXF1aXNpdGVzCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJJbnN0YWxsCiAgICAkRXhpdENvZGUgPSAkcGFyc2VyLkV4ZWN1dGVCaW5hcnkoJFNldHVwRXhlLkZ1bGxOYW1lLCBAeyJRIiA9ICRudWxsOyAiRkVBVFVSRVMiID0gQCgiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIsICJEUkVQTEFZX0NUTFIiLCAiRFJFUExBWV9DTFQiKSArICRFeHRyYUZlYXR1cmVzOwogICAgICAgICJBR1RTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQUdUU1ZDUEFTU1dPUkQiID0gJFNRTFN2Y1VzclBhc3N3b3JkOyAiQVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiQVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJBU1NZU0FETUlOQUNDT1VOVFMiID0gJFNRTFVTZXI7CiAgICAgICAgIlNRTFNWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJTUUxTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7ICJTUUxTWVNBRE1JTkFDQ09VTlRTIiA9ICRTUUxVc2VyOyAiSVNTVkNBQ0NPVU5UIiA9ICRTUUxVc2VyOyAiSVNTVkNQQVNTV09SRCIgPSAkU1FMU3ZjVXNyUGFzc3dvcmQ7IAogICAgICAgICJSU1NWQ0FDQ09VTlQiID0gJFNRTFVzZXI7ICJSU1NWQ1BBU1NXT1JEIiA9ICRTUUxTdmNVc3JQYXNzd29yZH0gKyAkRXh0cmFPcHRpb25zKQoKICAgIGlmICgkRXhpdENvZGUgLWVxIDMwMTApIHsKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KCiAgICBpZiAoJEV4aXRDb2RlIC1uZSAwKSB7CiAgICAgICAgdGhyb3cgIkluc3RhbGxhdGlvbiBleGVjdXRhYmxlIGV4aXRlZCB3aXRoIGNvZGUgJCgiezA6WDh9IiAtZiAkRXhpdENvZGUpIChEZWNpbWFsOiAkRXhpdENvZGUpIgogICAgfQoKICAgIHJldHVybiAkZmFsc2UKfQoKZnVuY3Rpb24gUmVtb3ZlLVNRTFNlcnZlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBVbmluc3RhbGxzIE1TIFNRTCBTZXJ2ZXIgaW5zdGFuY2UgaW5zdGFsbGVkIHdpdGggTmV3LVNRTFNlcnZlciBjbWRsZXQKCiAgICAuREVTQ1JJUFRJT04KICAgIFVuaW5zdGFsbHMgTVMgU1FMIFNlcnZlciBpbnN0YW5jZSBpbnN0YWxsZWQgd2l0aCBOZXctU1FMU2VydmVyIGNtZGxldCBpbiB1bmF0dGVuZGVkIG1vZGUKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBFeHRyYUZlYXR1cmVzCiAgICBMaXN0IG9mIGZlYXR1cmVzIHRvIGJlIHJlbW92ZWQgYmVzaWRlcyAiU1FMRW5naW5lIiwgIkNvbm4iLCAiU1NNUyIsICJBRFZfU1NNUyIuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdCwKICAgICAgICBbYXJyYXldJEV4dHJhRmVhdHVyZXMgPSBAKCkKICAgICkKCiAgICAkU2V0dXBEaXIgPSBHZXQtSXRlbSAkU2V0dXBSb290CiAgICAkU2V0dXBFeGUgPSAkU2V0dXBEaXIuR2V0RmlsZXMoInNldHVwLmV4ZSIpWzBdCgogICAgJHBhcnNlciA9IE5ldy1PcHRpb25QYXJzZXJVbmluc3RhbGwKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlEiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiLCAiQ29ubiIsICJTU01TIiwgIkFEVl9TU01TIikgKyAkRXh0cmFGZWF0dXJlc30pCgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSIKICAgIH0KfQoKZnVuY3Rpb24gSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4KCiAgICAuREVTQ1JJUFRJT04KICAgIEluc3RhbGxzIG5ldyBNUyBTUUwgU2VydmVyIGluIHN5c3ByZXAgbW9kZS4gUmV0dXJucyAkdHJ1ZSBpZiBhIHJlYm9vdCBpcyByZXF1aXJlZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLCAKICAgICRmYWxzZSBpZiBhIHJlYm9vdCBpcyBub3QgcmVxdWlyZWQgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaW4gY2FzZSBpZiBpbnN0YWxsYXRpb24gZmFpbHMuCgogICAgU2V0dXAgbXVzdCBiZSBjb21wbGV0ZWQgYWZ0ZXIgYm9vdGluZyByZWFybWVkIG1hY2hpbmUgYnkgdXNpbmcgQ29tcGxldGUtU1FMU2VydmVyIGNtZGxldAoKICAgIC5QQVJBTUVURVIgU2V0dXBSb290CiAgICBNUyBTUUwgU2VydmVyIGluc3RhbGxhdGlvbiBmaWxlcyByb290IGRpcmVjdG9yeS4gTm9ybWFsbHkgaXQgaXMganVzdCBEVkQgZHJpdmUgbmFtZS4KCiAgICAuUEFSQU1FVEVSIEV4dHJhRmVhdHVyZXMKICAgIExpc3Qgb2YgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvIGRlZmF1bHQgIlNRTEVuZ2luZSIuIE5vdGUgdGhhdCBwcmlvciB0bwogICAgU1FMIFNlcnZlciB2ZXJzaW9uIDIwMTIgU2VydmljZSBQYWNrIDEgQ3VtdWxhdGl2ZSBVcGRhdGUgMiAoSmFudWFyeSAyMDEzKSBvbmx5ICJSZXBsaWNhdGlvbiIsIAogICAgIkZ1bGxUZXh0IiBhbmQgIlJTIiBtYXkgYmUgaW5zdGFsbGVkIGluIGFkZGl0aW9uIHRvICJTUUxFbmdpbmUiLiBTZWUgdGhlIGZvbGxvd2luZyBsaW5rIGZvcgogICAgZGV0aWFsczogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTQ0MjU5LmFzcHgKCiAgICAjPgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLgoKICAgIC5ERVNDUklQVElPTgogICAgSW5zdGFsbHMgbmV3IE1TIFNRTCBTZXJ2ZXIgaW4gc3lzcHJlcCBtb2RlLiBSZXR1cm5zICR0cnVlIGlmIGEgcmVib290IGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBpbnN0YWxsYXRpb24sIAogICAgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbiBjYXNlIGlmIGluc3RhbGxhdGlvbiBmYWlscy4KCiAgICBTZXR1cCBtdXN0IGJlIGNvbXBsZXRlZCBhZnRlciBib290aW5nIHJlYXJtZWQgbWFjaGluZSBieSB1c2luZyBDb21wbGV0ZS1TUUxTZXJ2ZXIgY21kbGV0CgogICAgLlBBUkFNRVRFUiBTZXR1cFJvb3QKICAgIE1TIFNRTCBTZXJ2ZXIgaW5zdGFsbGF0aW9uIGZpbGVzIHJvb3QgZGlyZWN0b3J5LiBOb3JtYWxseSBpdCBpcyBqdXN0IERWRCBkcml2ZSBuYW1lLgoKICAgIC5QQVJBTUVURVIgRXh0cmFGZWF0dXJlcwogICAgTGlzdCBvZiBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gZGVmYXVsdCAiU1FMRW5naW5lIi4gTm90ZSB0aGF0IHByaW9yIHRvCiAgICBTUUwgU2VydmVyIHZlcnNpb24gMjAxMiBTZXJ2aWNlIFBhY2sgMSBDdW11bGF0aXZlIFVwZGF0ZSAyIChKYW51YXJ5IDIwMTMpIG9ubHkgIlJlcGxpY2F0aW9uIiwgCiAgICAiRnVsbFRleHQiIGFuZCAiUlMiIG1heSBiZSBpbnN0YWxsZWQgaW4gYWRkaXRpb24gdG8gIlNRTEVuZ2luZSIuIFNlZSB0aGUgZm9sbG93aW5nIGxpbmsgZm9yCiAgICBkZXRpYWxzOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNDQyNTkuYXNweAoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kU2V0dXBSb290LAogICAgICAgIFthcnJheV0kRXh0cmFGZWF0dXJlcyA9IEAoKQogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICBSZXNvbHZlLVNRTFNlcnZlclByZXJlcXVpc2l0ZXMKCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlclByZXBhcmVJbWFnZQogICAgJEV4aXRDb2RlID0gJHBhcnNlci5FeGVjdXRlQmluYXJ5KCRTZXR1cEV4ZS5GdWxsTmFtZSwgQHsiUVMiID0gJG51bGw7ICJGRUFUVVJFUyIgPSBAKCJTUUxFbmdpbmUiKSArICRFeHRyYUZlYXR1cmVzIH0pCgogICAgaWYgKCRFeGl0Q29kZSAtZXEgMzAxMCkgewogICAgICAgIHJldHVybiAkdHJ1ZQogICAgfQoKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICB0aHJvdyAiSW5zdGFsbGF0aW9uIGV4ZWN1dGFibGUgZXhpdGVkIHdpdGggY29kZSAkKCJ7MDpYOH0iIC1mICRFeGl0Q29kZSkgKERlY2ltYWw6ICRFeGl0Q29kZSkiCiAgICB9CgogICAgcmV0dXJuICRmYWxzZQp9CgpmdW5jdGlvbiBDb21wbGV0ZS1TUUxTZXJ2ZXJBZnRlclN5c1ByZXAgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29tcGxldGVzIHByZXZpb3VzbHkgcHJlcGFyZWQgd2l0aCAiSW5zdGFsbC1TUUxTZXJ2ZXJGb3JTeXNQcmVwIiBNUyBTUUwgU2VydmVyIGFmdGVyIHRoZSBzeXN0ZW0gd2FzIHJlYXJtZWQuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDb21wbGV0ZXMgcHJldmlvdXNseSBwcmVwYXJlZCB3aXRoICJJbnN0YWxsLVNRTFNlcnZlckZvclN5c1ByZXAiIE1TIFNRTCBTZXJ2ZXIgYWZ0ZXIgdGhlIHN5c3RlbSB3YXMgcmVhcm1lZC4KICAgIFJldHVybnMgJHRydWUgaWYgYSByZWJvb3QgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiwgJGZhbHNlIGlmIGEgcmVib290IGlzIG5vdCByZXF1aXJlZCBhbmQgdGhyb3dzIAogICAgYW4gZXhjZXB0aW9uIGluIGNhc2UgaWYgaW5zdGFsbGF0aW9uIGZhaWxzLgoKICAgIFNldHVwIG11c3QgYmUgY29tcGxldGVkIGFmdGVyIGJvb3RpbmcgcmVhcm1lZCBtYWNoaW5lIGJ5IHVzaW5nIENvbXBsZXRlLVNRTFNlcnZlciBjbWRsZXQKCiAgICAuUEFSQU1FVEVSIFNldHVwUm9vdAogICAgTVMgU1FMIFNlcnZlciBpbnN0YWxsYXRpb24gZmlsZXMgcm9vdCBkaXJlY3RvcnkuIE5vcm1hbGx5IGl0IGlzIGp1c3QgRFZEIGRyaXZlIG5hbWUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNldHVwUm9vdAogICAgKQoKICAgICRTZXR1cERpciA9IEdldC1JdGVtICRTZXR1cFJvb3QKICAgICRTZXR1cEV4ZSA9ICRTZXR1cERpci5HZXRGaWxlcygic2V0dXAuZXhlIilbMF0KCiAgICAkcGFyc2VyID0gTmV3LU9wdGlvblBhcnNlckNvbXBsZXRlSW1hZ2UKICAgICRFeGl0Q29kZSA9ICRwYXJzZXIuRXhlY3V0ZUJpbmFyeSgkU2V0dXBFeGUuRnVsbE5hbWUsIEB7IlFTIiA9ICRudWxsfSkKCiAgICBpZiAoJEV4aXRDb2RlIC1lcSAzMDEwKSB7CiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CgogICAgaWYgKCRFeGl0Q29kZSAtbmUgMCkgewogICAgICAgIHRocm93ICJJbnN0YWxsYXRpb24gZXhlY3V0YWJsZSBleGl0ZWQgd2l0aCBjb2RlICQoInswOlg4fSIgLWYgJEV4aXRDb2RlKSAoRGVjaW1hbDogJEV4aXRDb2RlKSIKICAgIH0KCiAgICByZXR1cm4gJGZhbHNlCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxTdHJpbmcgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3RlcwoKICAgIC5ERVNDUklQVElPTgogICAgQ29udmVydHMgYXJndW1lbnQgdG8gYSB2YWxpZCBTUUwgc3RyaW5nIGluIHF1b3Rlcy4gVGhlIHN0cmluZyBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVycy4KICAgIFNlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxNzk4OTkuYXNweAoKICAgIC5QQVJBTUVURVIgUwogICAgU3RyaW5nIHRvIGNvbnZlcnQKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlKV0KICAgICAgICBbc3RyaW5nXSRTCiAgICApCiAgICAKICAgIHJldHVybiAiJyQoJFMgLXJlcGxhY2UgIiciLCAiJyciKSciCn0KCmZ1bmN0aW9uIENvbnZlcnRUby1TUUxOYW1lIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbnZlcnRzIGFyZ3VtZW50IHRvIGEgdmFsaWQgU1FMIG5hbWUgaW4gYnJhY2tldHMuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICBTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTc1ODc0LmFzcHgKCiAgICAuUEFSQU1FVEVSIFMKICAgIFN0cmluZyB0byBjb252ZXJ0CiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW3N0cmluZ10kUwogICAgKQogICAgcmV0dXJuICJbJCgkUyAtcmVwbGFjZSAiXSIsICJdXSIpXSIKfQoKZnVuY3Rpb24gSW52b2tlLVNRTFRleHQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgSW52b2tlcyBTUUwgdGV4dAoKICAgIC5ERVNDUklQVElPTgogICAgSW52b2tlcyBTUUwgdGV4dC4gUmV0dXJucyByYXcgU1FMIHNlcnZlciBvdXRwdXQuCgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQoKICAgICNXcml0ZS1XYXJuaW5nICIkU1FMYG4iCiAgICAjcmV0dXJuCgogICAgJEJpbmFyeSA9IEdldC1Db21tYW5kICJzcWxjbWQuZXhlIgoKICAgICR0ZW1wRmlsZSA9IFtJTy5QYXRoXTo6R2V0VGVtcEZpbGVOYW1lKCkKICAgICR0ZW1wRmlsZSA9IEdldC1JdGVtICR0ZW1wRmlsZQogICAgU2V0LUNvbnRlbnQgLVBhdGggJHRlbXBGaWxlIC1WYWx1ZSAkU1FMCgogICAgJENvbW1hbmRMaW5lID0gQCgnLWgnLCAnLTEnLCAnLWInLCAnLWknLCAiYCIkKCR0ZW1wRmlsZS5GdWxsTmFtZSlgIiIpCiAgICBpZiAoKCRVc2VyIC1uZSAkbnVsbCkgLWFuZCAoJFVzZXIgLW5lICcnKSkgewogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctVScKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkVXNlcgogICAgICAgICRDb21tYW5kTGluZSA9ICRDb21tYW5kTGluZSArICctUCcKICAgICAgICAkQ29tbWFuZExpbmUgPSAkQ29tbWFuZExpbmUgKyAkUGFzc3dvcmQKICAgIH0KCiAgICBXcml0ZS1EZWJ1ZyAiRXhlY3V0aW5nOiBgbiRTUUxgbiIKICAgIFtzdHJpbmddJG91dHB1dCA9ICYkQmluYXJ5ICRDb21tYW5kTGluZQoKICAgICRFeGl0Q29kZSA9ICRMYXN0RXhpdENvZGUKICAgIGlmICgkRXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICRvdXRwdXQKICAgICAgICB0aHJvdyAiU1FMQ01ELkVYRSByZXR1cm5lZCB3aXRoIGV4aXQgY29kZSAkRXhpdENvZGUgd2hpbGUgcnVubmluZyAkQmluYXJ5ICRDb21tYW5kTGluZSIKICAgIH0KICAgCiAgICBSZW1vdmUtSXRlbSAkdGVtcEZpbGUKCiAgICByZXR1cm4gJG91dHB1dAp9CgpmdW5jdGlvbiBOZXctU1FMVXNlciB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLkRFU0NSSVBUSU9OCiAgICBJbnZva2VzIFNRTCB0ZXh0CgogICAgLlBBUkFNRVRFUiBTUUwKICAgIFNRTCBUZXh0CgogICAgLlBBUkFNRVRFUiBVc2VyCiAgICBTUUwgU2VydmVyIHVzZXIgbmFtZQoKICAgIC5QQVJBTUVURVIgUGFzc3dvcmQKICAgIFNRTCBTZXJ2ZXIgdXNlciBwYXNzd29yZAogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtzdHJpbmddJFNRTCwKICAgICAgICBbc3RyaW5nXSRVc2VyID0gJG51bGwsCiAgICAgICAgW3N0cmluZ10kUGFzc3dvcmQgPSAkbnVsbAogICAgKQp9CgpmdW5jdGlvbiBOZXctUGFzc3dvcmQgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyByYW5kb20gcGFzc3dvcmQgb2YgdGhlIHNwZWNpZmllZCBsZW5ndGgKCiAgICAuREVTQ1JJUFRJT04KICAgIFBhc3N3b3JkIGNvbnRhaW5zIHJhbmRvbSBjaGFyYWN0ZXJzIGEteiwgQS1aLCBudW1iZXJzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMuCiAgICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgdGhlIHR5cGVzIG9mIHN5bWJvbHMgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBwYXNzd29yZC4KCiAgICAuUEFSQU1FVEVSIExlbmd0aAogICAgRGVzaXJlZCBsZW5ndGggb2YgdGhlIHBhc3N3b3JkLgoKICAgICM+CiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbaW50XSRMZW5ndGg9NgogICAgKQoKICAgICRSZXN1bHQgPSAiIgogICAgJGFscGhhID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5IUAjJCVeJiooKSdgImBgXytbXVx7fXw7OiwuLzw+P34iCiAgICB3aGlsZSAoJExlbmd0aCAtZ3QgMCkgewogICAgICAgICR4ID0gR2V0LVJhbmRvbSAkYWxwaGEuTGVuZ3RoCiAgICAgICAgJGMgPSAkYWxwaGFbJHhdCiAgICAgICAgJFJlc3VsdCA9ICIkUmVzdWx0JGMiCiAgICAgICAgJExlbmd0aCA9ICRMZW5ndGggLSAxCiAgICB9CiAgICByZXR1cm4gJFJlc3VsdAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5ERVNDUklQVElPTgogICAgTWFzdGVyIGtleSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4gSG9zdCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHdoZW4gbmVjZXNzYXJ5IGVpdGhlciAobm9ybWFsbHkgb24gZmlyc3QgZW5kcG9pbnQgY3JlYXRpb24pLgoKICAgIEVuZHBvaW50IGFuZCBjZXJ0aWZpY2F0ZSBhcmUgcmVjcmVhdGVkIGluIGNhc2UgaWYgbWFzdGVyIGtleSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3Qgbm9ybWFsbHkgaGFwcGVuKS4KCiAgICBFbmRwb2ludCBpcyByZWNyZWF0ZWQgaW4gY2FzZSBpZiBjZXJ0aWZpY2F0ZSBkaWQgbm90IGV4aXN0ZWQgKHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgZW5kcG9pbnQgd2FzIGNyZWF0ZWQgbWFudWFsbHkpLgoKICAgIE1pcnJvcmluZyBlbmRwb2ludCBpcyBjcmVhdGVkIHVubGVzcyBvbmUgYWxyZWFkeSBleGlzdHMuIFRoZSBlbmRwb2ludCBpcyBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBXaGVuIHRoZSBlbmRwb2ludAogICAgYWxyZWFkeSBleGlzdHMgaXMgaXMgdW5jaGFuZ2VkLgoKICAgIEVuZHBvaW50IHBvcnQgaXMgc2VsZWN0ZWQgYXV0b21hdGljYWxseSBhcyA0MDIyIG9yIGFzIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGFmdGVyIDQwMjIgaW4gY2FzZSBpZiA0MDIyIGlzIGFscmVhZHkgbGlzdGVuaW5nLgogICAgSWYgdGhlcmUgaXMgbm8gZmlyZXdhbGwgcnVsZSB3aXRoIG5hbWUgJ0RhdGFiYXNlTWlycm9yaW5nLVRDUC17cG9ydG51bWJlcn0nLCBhbGxvd2luZyBydWxlIGlzIGNyZWF0ZWQuCgogICAgQ2VydGlmaWNhdGUgaXMgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KCiAgICBSZXR1cm5zIGVuZHBvaW50IGxpc3RlbmluZyBwb3J0LgoKICAgIC5QQVJBTUVURVIgRW5jcnlwdGlvblBhc3N3b3JkCiAgICBFbmNyeXB0aW9uIHBhc3N3b3JkIHVzZWQgdG8gY3JlYXRlIGNlcnRpZmljYXRlLgoKICAgIC5QQVJBTUVURVIgQ2VydGlmaWNhdGVGaWxlTmFtZQogICAgQ2VydGlmaWNhdGUgdGFyZ2V0IGZpbGUgbmFtZS4gRmlsZSBNVVNUIE5PVCBleGlzdC4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRDZXJ0aWZpY2F0ZUZpbGVOYW1lCiAgICApCgogICAgJEVuZHBvaW50TmFtZSA9ICdNaXJyb3JpbmdFbmRwb2ludCcKCiAgICAkRm9sZGVyID0gR2V0LUl0ZW0gJFdvcmtEaXIKCiAgICAkSCA9ICRFbnY6Q09NUFVURVJOQU1FIC1yZXBsYWNlICdbXkEtWmEtejAtOV9dJywgJ18nCgogICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0IDQwMjIKCiAgICAkQ3JlYXRlTWFzdGVyS2V5ID0gIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnN5bW1ldHJpY19rZXlzIHdoZXJlIG5hbWUgPSAnIyNNU19EYXRhYmFzZU1hc3RlcktleSMjJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBNQVNURVIgS0VZIEVOQ1JZUFRJT04gQlkgUEFTU1dPUkQgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJEVuY3J5cHRpb25QYXNzd29yZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWUgPSAnJHtIfV9jZXJ0JykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBDRVJUSUZJQ0FURSAke0h9X2NlcnQgV0lUSCBTVUJKRUNUID0gJyR7SH0gZW5kcG9pbnQgY2VydGlmaWNhdGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUYgRVhJU1RTKFNFTEVDVCAqIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBUT1AgMSBgQG5hbWUgPSBuYW1lIEZST00gc3lzLmVuZHBvaW50cyBXSEVSRSB0eXBlX2Rlc2M9J0RBVEFCQVNFX01JUlJPUklORycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEVDICgnRFJPUCBFTkRQT0lOVCBbJyArIGBAbmFtZSArICddJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIEJBQ0tVUCBDRVJUSUZJQ0FURSAke0h9X2NlcnQgVE8gRklMRSA9ICQoQ29udmVydFRvLVNRTFN0cmluZyAiJENlcnRpZmljYXRlRmlsZU5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBwb3J0IGludAogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoU0VMRUNUICogRlJPTSBzeXMuZW5kcG9pbnRzIFdIRVJFIHR5cGVfZGVzYz0nREFUQUJBU0VfTUlSUk9SSU5HJykKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSBwb3J0IEZST00gc3lzLnRjcF9lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIEVORCBFTFNFCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgRU5EUE9JTlQgJChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFID0gU1RBUlRFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTIFRDUCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RFTkVSX1BPUlQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIExJU1RFTkVSX0lQID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1IgREFUQUJBU0VfTUlSUk9SSU5HICggCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OID0gQ0VSVElGSUNBVEUgJHtIfV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRU5DUllQVElPTiA9IFJFUVVJUkVEIEFMR09SSVRITSBBRVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBST0xFID0gQUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCBgQHBvcnQgPSAkUG9ydAogICAgICAgICAgICAgICAgICAgICAgICBFTkQKCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAncG9ydDooJyArIENPTlZFUlQoVkFSQ0hBUiwgYEBwb3J0KSArICcpJyBhcyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICAiCgogICAgJHJhd2RhdGEgPSBJbnZva2UtU1FMVGV4dCAtU1FMICRDcmVhdGVNYXN0ZXJLZXkKICAgIFtpbnRdJFBvcnQgPSAkcmF3ZGF0YSAtcmVwbGFjZSAnLipwb3J0OlwoKFteKV0qKVwpLionLCAnJDEnCgogICAgIyBPcGVuIHBvcnQgaW4gV2luZG93cyBGaXJld2FsbAoKICAgICRQb3J0T3BlbiA9ICRmYWxzZQogICAgJFJ1bGVOYW1lID0gIkRhdGFiYXNlTWlycm9yaW5nLVRDUC0kUG9ydCIKICAgIEdldC1OZXRGaXJld2FsbFJ1bGUgfCBGb3JlYWNoLU9iamVjdCB7CiAgICAgICAgaWYgKCRfLk5hbWUgLWVxICRSdWxlTmFtZSkgewogICAgICAgICAgICAkUG9ydE9wZW4gPSAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGlmICgtbm90ICRQb3J0T3BlbikgewogICAgICAgICREaXNwbGF5TmFtZSA9ICJNUyBTUUwgRGF0YWJhc2UgTWlycm9yaW5nIEVuZHBvaW50IGF0IFRDUCBwb3J0ICRQb3J0IgogICAgICAgIE5ldy1OZXRGaXJld2FsbFJ1bGUgLU5hbWUgJFJ1bGVOYW1lIC1EaXNwbGF5TmFtZSAkRGlzcGxheU5hbWUgLURlc2NyaXB0aW9uICREaXNwbGF5TmFtZSAtUHJvdG9jb2wgVENQIC1Mb2NhbFBvcnQgJFBvcnQgLUVuYWJsZWQgVHJ1ZSAtUHJvZmlsZSBBbnkgLUFjdGlvbiBBbGxvdwogICAgfQogICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIENvbXBsZXRlLU1pcnJvcmluZ0VuZHBvaW50IHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBtaXJyb3JpbmcgZW5kcG9pbnQKCiAgICAuREVTQ1JJUFRJT04KICAgIEFsbG93cyBpbmJvdW5kIGNvbm5lY3Rpb25zIGZyb20gcmVtb3RlIGhvc3QKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TG9naW4sCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFVzZXIsCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdFBhc3N3b3JkCiAgICApCgogICAgJEZvbGRlciA9IEdldC1JdGVtICRSZW1vdGVXb3JrRGlyCiAgICAkUmVtb3RlV29ya0RpciA9ICRGb2xkZXIuRnVsbE5hbWUKCiAgICAkSCA9ICRSZW1vdGVIb3N0TmFtZSAtcmVwbGFjZSAnW15BLVphLXowLTlfXScsICdfJwoKICAgIGlmICgtbm90ICRSZW1vdGVIb3N0TG9naW4pIHsKICAgICAgICAkUmVtb3RlSG9zdExvZ2luID0gIiR7SH1fbG9naW4iCiAgICB9CiAgICBpZiAoLW5vdCAkUmVtb3RlSG9zdFVzZXIpIHsKICAgICAgICAkUmVtb3RlSG9zdFVzZXIgPSAiJHtIfV91c2VyIgogICAgfQogICAgaWYgKC1ub3QgJFJlbW90ZUhvc3RQYXNzd29yZCkgewogICAgICAgICRSZW1vdGVIb3N0UGFzc3dvcmQgPSAiJChOZXctUGFzc3dvcmQgMTApYUEjMyIKICAgIH0KCiAgICAkU1FMID0gICAgICAgICAgICAgIlVTRSBtYXN0ZXI7CgogICAgICAgICAgICAgICAgICAgICAgICBJRiBOT1QgRVhJU1RTKHNlbGVjdCAqIGZyb20gc3lzLnNxbF9sb2dpbnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RMb2dpbikpCiAgICAgICAgICAgICAgICAgICAgICAgIEJFR0lOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEUgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKSBXSVRIIFBBU1NXT1JEID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZW1vdGVIb3N0UGFzc3dvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBFTkQKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIElGIE5PVCBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuc3lzdXNlcnMgd2hlcmUgbmFtZT0kKENvbnZlcnRUby1TUUxTdHJpbmcgJFJlbW90ZUhvc3RVc2VyKSkKICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURSBVU0VSICQoQ29udmVydFRvLVNRTE5hbWUgJFJlbW90ZUhvc3RVc2VyKSBGT1IgTE9HSU4gJChDb252ZXJ0VG8tU1FMTmFtZSAkUmVtb3RlSG9zdExvZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgRU5ECiAgICAgICAgICAgICAgICAgICAgICAgIEdPCgogICAgICAgICAgICAgICAgICAgICAgICBJRiBFWElTVFMoc2VsZWN0ICogZnJvbSBzeXMuY2VydGlmaWNhdGVzIHdoZXJlIG5hbWU9JyR7SH1fcmVtb3RlX2NlcnQnKQogICAgICAgICAgICAgICAgICAgICAgICBCRUdJTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUCBDRVJUSUZJQ0FURSAke0h9X3JlbW90ZV9jZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIEVORAogICAgICAgICAgICAgICAgICAgICAgICBHTwoKICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFIENFUlRJRklDQVRFICR7SH1fcmVtb3RlX2NlcnQgQVVUSE9SSVpBVElPTiAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0VXNlcikgRlJPTSBGSUxFID0gJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxjZXJ0aWZpY2F0ZS5jZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgR08KCiAgICAgICAgICAgICAgICAgICAgICAgIERFQ0xBUkUgYEBuYW1lIFZBUkNIQVIoMjU1KQogICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1QgVE9QIDEgYEBuYW1lID0gbmFtZSBGUk9NIHN5cy5lbmRwb2ludHMgV0hFUkUgdHlwZV9kZXNjPSdEQVRBQkFTRV9NSVJST1JJTkcnCiAgICAgICAgICAgICAgICAgICAgICAgIFNFTEVDVCAnbmFtZTooJyArIGBAbmFtZSArICcpJyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICIKCiAgICAkcmF3ZGF0YSA9IEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTAogICAgJEVuZHBvaW50TmFtZSA9ICRyYXdkYXRhIC1yZXBsYWNlICcuKm5hbWU6XCgoW14pXSopXCkuKicsICckMScKICAgICRTUUwgPSAgICAgICAgICAgICAiR1JBTlQgQ09OTkVDVCBPTiBFTkRQT0lOVDo6JChDb252ZXJ0VG8tU1FMTmFtZSAkRW5kcG9pbnROYW1lKSBUTyAkKENvbnZlcnRUby1TUUxOYW1lICRSZW1vdGVIb3N0TG9naW4pIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFNRTCkKfQoKZnVuY3Rpb24gQ29tcGxldGUtU1FMTWlycm9yIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENvbXBsZXRlcyBjcmVhdGlvbiBvZiBtaXJyb3JlZCBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIFRoaXMgY21kbGV0IHNob3VsZCBiZSBmaXJzdCBleGVjdXRlZCBvbiBtaXJyb3Igc2VydmVyIGFuZCB0aGVuIG9uIHByaW5jaXBhbCBzZXJ2ZXIuCiAgICBPdGhlcndpc2UgaXQgd2lsbCBmYWlsIChob3dldmVyIGl0IG1heSBiZSBleGVjdXRlZCBhZ2FpbiB3aXRoIG5vIGhhcm0pLgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbSW50XSRSZW1vdGVQb3J0LAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgICRVcmwgPSAiVENQOi8vJHtSZW1vdGVIb3N0TmFtZX06JHtSZW1vdGVQb3J0fSIKICAgICRBbHRlckRiID0gIkFMVEVSIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgU0VUIFBBUlRORVIgPSAkKENvbnZlcnRUby1TUUxTdHJpbmcgJFVybCk7CiAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRBbHRlckRiKQp9CgpmdW5jdGlvbiBOZXctU1FMRGF0YWJhc2UgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ3JlYXRlcyBlbXB0eSBTUUwgZGF0YWJhc2UKCiAgICAuREVTQ1JJUFRJT04KICAgIENyZWF0ZXMgZW1wdHkgU1FMIGRhdGFiYXNlIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4gRmFpbHMgaW4gY2FzZSBpcyB0aGUgZGF0YWJhc2UgYWxyZWFkeSBleGlzdHMuCgogICAgLlBBUkFNRVRFUiBEYXRhQmFzZU5hbWUKICAgIERhdGFiYXNlIG5hbWUuCgogICAgLlBBUkFNRVRFUiBtZGZGaWxlCiAgICBOYW1lIG9mIHRoZSBNREYgKGRhdGEpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX0ubWRmIgogICAgV2hlcmUge0RhdGFCYXNlUGF0aE5hbWV9IGlzIGRhdGFiYXNlIG5hbWUgd2l0aCBhbGwgYnV0IEEtWiwgYS16LCAwLTkgY2hhcmFjdGVycwogICAgcmVwbGFjZWQgYnkgdW5kZXJzY29yZS4KCiAgICAuUEFSQU1FVEVSIERhdGFCYXNlTmFtZQogICAgTmFtZSBvZiB0aGUgTERGICh0cmFuc2FjdGlvbiBsb2cpIGZpbGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBmb2xsb3dpbmcgdmFsdWUgaXMgdXNlZDoKICAgICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVx7RGF0YUJhc2VQYXRoTmFtZX1fbG9nLm1kZiIKICAgIFdoZXJlIHtEYXRhQmFzZVBhdGhOYW1lfSBpcyBkYXRhYmFzZSBuYW1lIHdpdGggYWxsIGJ1dCBBLVosIGEteiwgMC05IGNoYXJhY3RlcnMKICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSRtZGZGaWxlPSRudWxsLAogICAgICAgIFtTdHJpbmddJGxkZkZpbGU9JG51bGwKICAgICkKCiAgICAkRGF0YUJhc2VQYXRoTmFtZSA9ICREYXRhQmFzZU5hbWUgLXJlcGxhY2UgJ1teMC05YS16QS1aXScsICdfJwogICAgaWYgKC1ub3QgJG1kZkZpbGUpIHsKICAgICAgICAkbWRmRmlsZSA9ICJDOlxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBTUUwgU2VydmVyXE1TU1FMMTEuTVNTUUxTRVJWRVJcTVNTUUxcREFUQVwke0RhdGFCYXNlUGF0aE5hbWV9Lm1kZiIKICAgIH0KICAgIGlmICgtbm90ICRsZGZGaWxlKSB7CiAgICAgICAgJGxkZkZpbGUgPSAiQzpcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgU1FMIFNlcnZlclxNU1NRTDExLk1TU1FMU0VSVkVSXE1TU1FMXERBVEFcJHtEYXRhQmFzZVBhdGhOYW1lfV9sb2cubGRmIgogICAgfQoKICAgICROZXdEYXRhYmFzZSA9ICIKICAgICAgICBDUkVBVEUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgICAgICAgICAgQ09OVEFJTk1FTlQgPSBOT05FCiAgICAgICAgICAgICAgICBPTiAgUFJJTUFSWSAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAkRGF0YUJhc2VOYW1lKSwgRklMRU5BTUUgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRtZGZGaWxlKSAsIFNJWkUgPSA0MDk2S0IgLCBGSUxFR1JPV1RIID0gMTAyNEtCICkKICAgICAgICAgICAgICAgIExPRyBPTiAKICAgICAgICAgICAgKCBOQU1FID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJHtEYXRhQmFzZU5hbWV9X2xvZyIpLCBGSUxFTkFNRSA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgJGxkZkZpbGUpICwgU0laRSA9IDEwMjRLQiAsIEZJTEVHUk9XVEggPSAxMCUpCiAgICAgICAgR08KICAgICAgICBVU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKQogICAgICAgIEdPCiAgICAgICAgSUYgTk9UIEVYSVNUUyAoU0VMRUNUIG5hbWUgRlJPTSBzeXMuZmlsZWdyb3VwcyBXSEVSRSBpc19kZWZhdWx0PTEgQU5EIG5hbWUgPSBOJ1BSSU1BUlknKSBBTFRFUiBEQVRBQkFTRSAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIE1PRElGWSBGSUxFR1JPVVAgW1BSSU1BUlldIERFRkFVTFQKICAgICAgICBHTyIKCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkTmV3RGF0YWJhc2UpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nUHJpbmNpcGFsU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgcHJpbmNpcGFsIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMSkKCiAgICAuREVTQ1JJUFRJT04KICAgIEluaXRpYWxpemVzIG1pcnJvcmluZyBlbmRwb2ludCAodGhpcyBpcyBhYnNvbHV0ZWx5IHN5bW1ldHJpYyBzdGVwIHRvIHRoZSBtaXJyb3IgaW5pdCkuIEluIGFkZGl0aW9uIHRvIHRoYXQgaXQgY3JlYXRlcwogICAgYSBkYXRhYmFzZSBhbmQgc3RvcmVzIGJhY2t1cHMgb2YgaXQgYW5kIGl0cyB0cmFuc2FjdGlvbiBsb2cgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBlbmRwb2ludCBjZXJ0aWZpY2F0ZS4KCiAgICBBIGZpcmV3YWxsIHJ1bGUgaXMgY3JlYXRlZCBmb3IgZW5kcG9pbnQgaWYgbmVjZXNzYXJ5LgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSBtaXJyb3Igc2VydmVyIGFmdGVyIHRoaXMKICAgIHN0ZXAgaXMgZXhlY3V0ZWQuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIGJlIHVzZSBhdCBtaXJyb3Igc2VydmVyIGVpdGhlci4KICAgIAogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQogICAgaWYgKChHZXQtQ2hpbGRJdGVtIC1QYXRoICRXb3JrRGlyKS5MZW5ndGggLWd0IDApIHsKICAgICAgICB0aHJvdyAiV29ya2luZyBkaXJlY3RvcnkgJFdvcmtEaXIgaXMgbm90IGVtcHR5IgogICAgfQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCiAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQoKICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlLmJhayIpIFdJVEggTk9GT1JNQVQsIElOSVQsIE5BTUUgPSBOJ0Z1bGwgRGF0YWJhc2UgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAkQmFja3VwTG9nID0gIkJBQ0tVUCBMT0cgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcU291cmNlX2xvZy5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCAgTkFNRSA9IE4nVHJhbnNhY3Rpb24gTG9nICBCYWNrdXAnLCBTS0lQLCBOT1JFV0lORCwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQp9CgpmdW5jdGlvbiBJbml0aWFsaXplLVNRTE1pcnJvcmluZ1ByaW5jaXBhbFN0ZXAyIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIFByZXBhcmVzIHByaW5jaXBhbCBTUUwgU2VydmVyIGZvciBkYXRhYmFzZSBtaXJyb3JpbmcgKFN0YWdlIDIpCgogICAgLkRFU0NSSVBUSU9OCiAgICBJbXBvcnRzIHJlbW90ZSBzZXJ2ZXIgY2VydGlmaWNhdGUgYW5kIGdyYW50cyBpdCB3aXRoIGFjY2VzcyB0byB0aGUgbWlycm9yaW5nIGVuZHBvaW50LgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAobWlycm9yKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIG1pcnJvciBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpcgogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKfQoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1TUUxNaXJyb3JpbmdQcmluY2lwYWxTdGVwMyB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBQcmVwYXJlcyBwcmluY2lwYWwgU1FMIFNlcnZlciBmb3IgZGF0YWJhc2UgbWlycm9yaW5nIChTdGFnZSAzKQoKICAgIC5ERVNDUklQVElPTgogICAgQ29tcGxldGVzIG1pcnJvciBjcmVhdGlvbi4gVGhpcyBzdGVwIG11c3QgYmUgZ2xvYmFsbHkgdGhlIGxhc3Qgb25lIGluIG1pcnJvciBjcmVhdGlvbiBzZXF1ZW5jZS4KCiAgICBOb3RlIHRoYXQgdGhlIHJlbW90ZSBob3N0IGNlcnRpZmljYXRlIGlzIHZhbGlkIGZyb20gdGhlIHRpbWUgaXQgaXMgY3JlYXRlZCB0aGVyZS4gU28KICAgIHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgdGhlcmUgaXMgbm90aWNhYmxlIGRpZmZlcmVudCBpbiB0aW1lIGxvY2FsIGFuZCByZW1vdGUgbWFjaGluZXMuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVIb3N0TmFtZQogICAgUmVtb3RlIChwcmluY2lwYWwpIGhvc3QgbmFtZS4gRlFETiBpcyBwcmVmZXJyZWQsIGJ1dCBOZXRCSU9TIG5hbWVzIGFuZCBJUCBhZGRyZXNzZXMgYXJlIGFsc28gYWNjZXB0ZWQuCgogICAgLlBBUkFNRVRFUiBSZW1vdGVXb3JrRGlyCiAgICBQYXRoIHRvIGEgY29weSBvZiB3b3JrZGlyIG9idGFpbmVkIGZyb20gcHJpbmNpcGFsIG1hY2hpbmUgY3JlYXRlZCBvbiBTdGFnZSAxLgoKICAgIC5QQVJBTUVURVIgRGF0YWJhc2VOYW1lCiAgICBNaXJyb3JlZCBkYXRhYmFzZSBuYW1lLiBUaGlzIG5hbWUgTVVTVCBtYXRjaCBwcmluY2lwYWwgZGF0YWJhc2UgbmFtZSBhbmQgbmFtZSBwcm92aWRlZCBvbiBzdGVwIDEuCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZUhvc3ROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFJlbW90ZVdvcmtEaXIsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kRGF0YWJhc2VOYW1lCiAgICApCgogICAgW2ludF0kcG9ydCA9IEdldC1Db250ZW50ICIke1JlbW90ZVdvcmtEaXJ9XGVuZHBvaW50LXBvcnQudHh0IgogICAgQ29tcGxldGUtU1FMTWlycm9yICRSZW1vdGVIb3N0TmFtZSAkcG9ydCAkRGF0YWJhc2VOYW1lCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDEgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UxKQoKICAgIC5ERVNDUklQVElPTgogICAgSW5pdGlhbGl6ZXMgbWlycm9yaW5nIGVuZHBvaW50IGZvciBtaXJyb3Igc2VydmVyLiBTdG9yZXMgbWlycm9yaW5nIGVuZHBvaW50IGNlcnRpZmljYXRlIGluIFdvcmtkaXIuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5kIGRpcmVjdG9yeS4gVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRyYW5mZXJyZWQgdG8gdGhlIHByaW5jaXBhbCBzZXJ2ZXIgYWZ0ZXIgdGhpcwogICAgc3RlcCBpcyBleGVjdXRlZC4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFiYXNlTmFtZQogICAgKQoKICAgIFtTdHJpbmddJEVuY3J5cHRpb25QYXNzd29yZCA9ICIkKE5ldy1QYXNzd29yZCAxMClhQSMzIgoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgW3ZvaWRdKE5ldy1JdGVtIC1UeXBlIERpcmVjdG9yeSAkV29ya0RpcikKICAgIH0KICAgICRXb3JrRGlyID0gKEdldC1JdGVtICRXb3JrRGlyKS5GdWxsTmFtZQoKICAgICRFbmRwb2ludFBvcnQgPSBJbml0aWFsaXplLU1pcnJvcmluZ0VuZHBvaW50ICRFbmNyeXB0aW9uUGFzc3dvcmQgIiRXb3JrRGlyXGNlcnRpZmljYXRlLmNlciIKICAgICRFbmRwb2ludFBvcnQgfCBTZXQtQ29udGVudCAiJFdvcmtEaXJcZW5kcG9pbnQtcG9ydC50eHQiCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDIgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMikKCiAgICAuREVTQ1JJUFRJT04KICAgIEltcG9ydHMgcmVtb3RlIHNlcnZlciBjZXJ0aWZpY2F0ZSBhbmQgZ3JhbnRzIGl0IHdpdGggYWNjZXNzIHRvIHRoZSBtaXJyb3JpbmcgZW5kcG9pbnQuCiAgICBSZXN0b3JlcyBkYXRhYmFzZSBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBhbmQgbGVhdmVzIGl0IGluICdSZXN0b3JpbmcnIHN0YXRlLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlSG9zdE5hbWUKICAgIFJlbW90ZSAocHJpbmNpcGFsKSBob3N0IG5hbWUuIEZRRE4gaXMgcHJlZmVycmVkLCBidXQgTmV0QklPUyBuYW1lcyBhbmQgSVAgYWRkcmVzc2VzIGFyZSBhbHNvIGFjY2VwdGVkLgoKICAgIC5QQVJBTUVURVIgUmVtb3RlV29ya0RpcgogICAgUGF0aCB0byBhIGNvcHkgb2Ygd29ya2RpciBvYnRhaW5lZCBmcm9tIHByaW5jaXBhbCBtYWNoaW5lIGNyZWF0ZWQgb24gU3RhZ2UgMS4KCiAgICAuUEFSQU1FVEVSIERhdGFiYXNlTmFtZQogICAgTWlycm9yZWQgZGF0YWJhc2UgbmFtZS4gVGhpcyBuYW1lIE1VU1QgbWF0Y2ggcHJpbmNpcGFsIGRhdGFiYXNlIG5hbWUuCgogICAgIz4KCiAgICBwYXJhbSgKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVIb3N0TmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSRSZW1vdGVXb3JrRGlyLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJERhdGFCYXNlTmFtZQogICAgKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFJlbW90ZVdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIlJlbW90ZSB3b3JrIGRpciAnJFJlbW90ZVdvcmtEaXInIHdhcyBub3QgZm91bmQiCiAgICB9CiAgICAkUmVtb3RlV29ya0RpciA9IChHZXQtSXRlbSAkUmVtb3RlV29ya0RpcikuRnVsbE5hbWUKCiAgICBDb21wbGV0ZS1NaXJyb3JpbmdFbmRwb2ludCAkUmVtb3RlSG9zdE5hbWUgJFJlbW90ZVdvcmtEaXIKCiAgICAkUmVzdG9yZURiID0gIlJFU1RPUkUgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBGUk9NIERJU0sgPSBOJChDb252ZXJ0VG8tU1FMU3RyaW5nICIkUmVtb3RlV29ya0RpclxTb3VyY2UuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFJFUExBQ0UsIFNUQVRTID0gNQogICAgICAgICAgICAgICAgICBHTyIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRSZXN0b3JlRGIpCiAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRSZW1vdGVXb3JrRGlyXFNvdXJjZV9sb2cuYmFrIikgV0lUSCBGSUxFID0gMSwgTk9SRUNPVkVSWSwgTk9VTkxPQUQsIFNUQVRTID0gMTAKICAgICAgICAgICAgICAgICAgIEdPIgogICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCn0KCmZ1bmN0aW9uIEluaXRpYWxpemUtU1FMTWlycm9yaW5nTWlycm9yU3RlcDMgewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgUHJlcGFyZXMgbWlycm9yIFNRTCBTZXJ2ZXIgZm9yIGRhdGFiYXNlIG1pcnJvcmluZyAoU3RhZ2UgMykKCiAgICAuREVTQ1JJUFRJT04KICAgIENvbXBsZXRlcyBtaXJyb3IgY3JlYXRpb24uIFRoaXMgc3RlcCBtdXN0IGJlIGV4ZWN1dGVkIHN0cmljdGx5IGJlZm9yZSBzeW1tZXRyaWMgc3RlcCBvbiB0aGUgcHJpbmNpcGFsLgoKICAgIE5vdGUgdGhhdCB0aGUgcmVtb3RlIGhvc3QgY2VydGlmaWNhdGUgaXMgdmFsaWQgZnJvbSB0aGUgdGltZSBpdCBpcyBjcmVhdGVkIHRoZXJlLiBTbwogICAgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiB0aGVyZSBpcyBub3RpY2FibGUgZGlmZmVyZW50IGluIHRpbWUgbG9jYWwgYW5kIHJlbW90ZSBtYWNoaW5lcy4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZUhvc3ROYW1lCiAgICBSZW1vdGUgKHByaW5jaXBhbCkgaG9zdCBuYW1lLiBGUUROIGlzIHByZWZlcnJlZCwgYnV0IE5ldEJJT1MgbmFtZXMgYW5kIElQIGFkZHJlc3NlcyBhcmUgYWxzbyBhY2NlcHRlZC4KCiAgICAuUEFSQU1FVEVSIFJlbW90ZVdvcmtEaXIKICAgIFBhdGggdG8gYSBjb3B5IG9mIHdvcmtkaXIgb2J0YWluZWQgZnJvbSBwcmluY2lwYWwgbWFjaGluZSBjcmVhdGVkIG9uIFN0YWdlIDEuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWUKICAgIE1pcnJvcmVkIGRhdGFiYXNlIG5hbWUuIFRoaXMgbmFtZSBNVVNUIG1hdGNoIHByaW5jaXBhbCBkYXRhYmFzZSBuYW1lLgoKICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlSG9zdE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kUmVtb3RlV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSREYXRhYmFzZU5hbWUKICAgICkKCiAgICBbaW50XSRwb3J0ID0gR2V0LUNvbnRlbnQgIiR7UmVtb3RlV29ya0Rpcn1cZW5kcG9pbnQtcG9ydC50eHQiCiAgICBDb21wbGV0ZS1TUUxNaXJyb3IgJFJlbW90ZUhvc3ROYW1lICRwb3J0ICREYXRhYmFzZU5hbWUKfQoKZnVuY3Rpb24gR2V0LU5leHRGcmVlUG9ydCB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBSZXR1cm5zIHNwZWNpZmllZCBkZXNpcmVkIHBvcnQgb3IgY2xvc2VzdCBuZXh0IG9uZSB1bm9jY3VwaWVkLgoKICAgIC5QQVJBTUVURVIgUG9ydAogICAgRGVzaXJlZCBwb3J0IG51bWJlci4KCiAgICAjPgoKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtpbnRdJFBvcnQKICAgICkKICAgICRPcGVuUG9ydHMgPSBuZXRzdGF0IC1hb24gfCBzZWxlY3Qtc3RyaW5nICdMSVNURU5JTkcnIHwgRm9yZWFjaC1PYmplY3QgeyAoKCRfIC1yZXBsYWNlICdeXHMqJywgJycgLXNwbGl0ICdccysnKVsxXSAtc3BsaXQgJy4qOicpWzFdIH0gfCBTb3J0LU9iamVjdCB8IEdldC1VbmlxdWUKICAgIHdoaWxlICgkT3BlblBvcnRzLkNvbnRhaW5zKCR7UG9ydH0pKSB7CiAgICAgICAgJFBvcnQgPSAkUG9ydCArIDEKICAgIH0KICAgIHJldHVybiAkUG9ydAp9CgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIEluaXRpYWxpemVzIEFsd2F5c09uIGNsdXN0ZXJpbmcgb24gbG9jYWwgU1FMIHNlcnZlciBhbmQgY3JlYXRlcyBBbHdheXNPbiBlbmRwb2ludCBsaXN0ZW5lci4gUmV0dXJucyBBbHdheXNPbiBlbmRwb2ludCBwb3J0IG51bWJlci4KCiAgICAuREVTQ1JJUFRJT04KICAgIEVuYWJsZXMgQWx3YXlzT24gY2x1c3RlcmluZyBvbiBsb2NhbCBTUUwgc2VydmVyLiBDcmVhdGVzIEFsd2F5c09uIFRDUCBlbmRwb2ludCBvbiBwb3J0IDUwMjIgb3IgZ3JlYXRlciBpZiB0aGUgb25lIGlzIG9jY3VwaWVkLiAgIAogICAgIz4KCiAgICBpZiAoIShUZXN0LVBhdGggU1FMU0VSVkVSOlwpKSB7CiAgICAgICAgSW1wb3J0LU1vZHVsZSBzcWxwcwogICAgfQogICAgJE1hY2hpbmVOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUwpWzBdLlBTQ2hpbGROYW1lCiAgICAkSW5zdGFuY2VOYW1lID0gKEdldC1DaGlsZEl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lKS5QU0NoaWxkTmFtZQogICAgJEFsd2F5c09uRW5hYmxlZCA9ICgoR2V0LUl0ZW0gU1FMU0VSVkVSOlxTUUxcJE1hY2hpbmVOYW1lXCRJbnN0YW5jZU5hbWUpIHwgc2VsZWN0IElzSGFkckVuYWJsZWQpLklzSGFkckVuYWJsZWQKICAgIGlmICgtbm90ICRBbHdheXNPbkVuYWJsZWQpIHsKICAgICAgICBFbmFibGUtU3FsQWx3YXlzT24gLVBhdGggIlNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lIiAtRm9yY2UKICAgIH0KICAgICRJbnN0YW5jZSA9IEdldC1JdGVtIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICAkZW5kcG9pbnQgPSAkSW5zdGFuY2UuRW5kcG9pbnRzWyJBbHdheXNPbkVuZHBvaW50Il0KICAgIGlmICgtbm90ICRlbmRwb2ludCkgewogICAgICAgICRQb3J0ID0gR2V0LU5leHRGcmVlUG9ydCA1MDIyCiAgICAgICAgJGVuZHBvaW50ID0gTmV3LVNxbEhhZHJFbmRwb2ludCBBbHdheXNPbkVuZHBvaW50IC1Qb3J0ICRQb3J0IC1QYXRoIFNRTFNFUlZFUjpcU1FMXCRNYWNoaW5lTmFtZVwkSW5zdGFuY2VOYW1lCiAgICB9IGVsc2UgewogICAgICAgICRQb3J0ID0gJGVuZHBvaW50LlByb3RvY29sLlRjcC5MaXN0ZW5lclBvcnQKICAgIH0gCiAgICBpZiAoJGVuZHBvaW50LkVuZHBvaW50U3RhdGUgLW5lICJTdGFydGVkIikgewogICAgICAgICRlbmRwb2ludC5TdGFydCgpCiAgICB9ICAgIAogICAgcmV0dXJuICRQb3J0Cn0KCmZ1bmN0aW9uIE5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgbmV3IEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBvbiBwcmltYXJ5IHJlcGxpY2EuCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIG5ldyBBbHdheXNPbiBhdmFpbGFiaWxpdHkgZ3JvdXAgb24gcHJpbWFyeSByZXBsaWNhLgoKICAgIC5QQVJBTUVURVIgV29ya0RpcgogICAgV29ya2luZCBkaXJlY3RvcnkuIFRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZSB0cmFuZmVycmVkIHRvIHRoZSByZXBsaWNhIHNlcnZlcihzKSBhZnRlciB0aGlzCiAgICBzdGVwIGlzIGV4ZWN1dGVkLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgQXZhaWxhYmlsaXR5IGdyb3VwIG5hbWUuCgogICAgLlBBUkFNRVRFUiBEYXRhYmFzZU5hbWVzCiAgICBSZXBsaWNhIGRhdGFiYXNlKHMpIG5hbWVzLgoKICAgIC5QQVJBTUVURVIgUmVwbGljYURlZnMKICAgIEFycmF5IG9mIHJlcGxpY2EgZGVmaW5pdGlvbi4gRWFjaCBkZWZpbml0aW9uIGlzIGEgaGFzaCB0YWJsZSB3aXRoIHJlcGxpY2Etc3BlY2lmaWMgdmFsdWVzLgogICAgCiAgICBNYW5kYXRvcnkgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW1N0cmluZ10gU0VSVkVSX0lOU1RBTkNFICAgLSBSZXBsaWNhIHNlcnZlciBpbnN0YW5jZSBuYW1lCiAgICAgICAgKiBbU3RyaW5nXSBFTkRQT0lOVF9VUkwgICAgICAtIFJlcGxpY2Egc2VydmVyIGVuZHBvaW50IFVSTC4gTm9ybWFsbHkgaXQgaXMgVENQOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lOjUwMjIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHNob3VsZCBiZSBvYnRhaW5lZCB3aXRoIEluaXRpYWxpemUtQWx3YXlzT24gYXQgdGhlIHJlcGxpY2Egc2VydmVyCiAgICAgICAgKiBbU3RyaW5nXSBBVkFJTEFCSUxJVFlfTU9ERSAtIFJlcGxpY2EgYXZhaWxhYmlsaXR5IG1vZGUuIENhbiBiZSAiU1lOQ0hST05PVVNfQ09NTUlUIiBvciAiQVNZTkNIUk9OT1VTX0NPTU1JVCIgb25seS4KICAgICAgICAqIFtTdHJpbmddIEZBSUxPVkVSX01PREUgICAgIC0gUmVwbGljYSBhdmFpbGFiaWxpdHkgbW9kZS4gQ2FuIGJlICJNQU5VQUwiIG9yICJBVVRPTUFUSUMiIG9ubHkuCgogICAgT3B0aW9uYWwgcmVwbGljYSBkZWZpbml0aW9uIHZhbHVlcyBhcmU6CgogICAgICAgICogW0ludGVnZXJdIEJBQ0tVUF9QUklPUklUWSAgICAgICAgICAtIEJhY2t1cCBwcmlvcml0eQogICAgICAgICogW0ludGVnZXJdIFNFU1NJT05fVElNRU9VVCAgICAgICAgICAtIFNlc3Npb24gdGltZW91dAogICAgICAgICogW1N0cmluZ10gIFBfQUxMT1dfQ09OTkVDVElPTlMgICAgICAtIEFsbG93ZWQgY29ubmVjdGlvbiB0eXBlcyBmb3IgIlByaW1hcnkiIHJlcGxpY2EgbW9kZS4gQ2FuIGJlICJSRUFEX1dSSVRFIiBvciAiQUxMIiBvbmx5LgogICAgICAgICogW0FycmF5XSAgIFBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCAtIExpc3Qgb2YgcmVwbGljYXMgcHJvdmlyaW5nIHJlYWRvbmx5IGFjY2VzcyB3aGVuIHRoaXMgb25lIGlzIHByaW1hcnkuCiAgICAgICAgKiBbU3RyaW5nXSAgU19BTExPV19DT05ORUNUSU9OUyAgICAgIC0gQWxsb3dlZCBjb25uZWN0aW9uIHR5cGVzIGZvciAiU2Vjb25kYXJ5IiByZXBsaWNhIG1vZGUuIENhbiBiZSBvbmUgb2YgIk5PIiwgIlJFQURfT05MWSIsICJBTEwiLgogICAgICAgICogW1N0cmluZ10gIFNfUkVBRF9PTkxZX1JPVVRJTkdfVVJMICAtIFJlcGxpY2EgcmVhZC1vbmx5IHJlcXVlc3RzIGxpc3RlbmVyIFVSTC4gTm9ybWFsbHkgZGVmYXVsdCBzZXJ2ZXIgbGlzdGVuZXIgYXQgcG9ydCAxNDMzIGlzIHVzZWQuCgogICAgLlBBUkFNRVRFUiBQcmVmZXJlbmNlcwogICAgSGFzaCB0YWJsZSBvZiBnZW5lcmFsIGF2YWlsYWJpbGl0eSBncm91cCBwcmVmZXJlbmNlcy4gQWxsIHRoZSBrZXlzIGFyZSBvcHRpb25hbC4gU3VwcG9ydGVkIGVudHJ5IGtleXMgYXJlOgoKICAgICAgICAqIFtTdHJpbmddICBBVVRPTUFURURfQkFDS1VQX1BSRUZFUkVOQ0UgLSBBdXRvbWF0ZWQgYmFja3VwIHByZWZlcmVuY2UuIENhbiBiZSAiUFJJTUFSWSIsICJTRUNPTkRBUllfT05MWSIsICJTRUNPTkRBUlkiIG9yICJOT05FIi4KICAgICAgICAqIFtTdHJpbmddICBGQUlMVVJFX0NPTkRJVElPTl9MRVZFTCAgICAgLSBGYWlsdXJlIGNvbmRpdGlvbiBsZXZlbC4gQ2FuIGJlICIxIiwgIjIiLCAiMyIsICI0IiBvciAiNSIuCiAgICAgICAgKiBbSW50ZWdlcl0gSEVBTFRIX0NIRUNLX1RJTUVPVVQgICAgICAgIC0gUmVwbGljYSBoZWFsdGggY2hlY2sgdGltZW91dC4KCiAgICAuUEFSQU1FVEVSIExpc3RlbmVyRGVmCiAgICBIYXNoIHRhYmxlIGNvbnRhaW5pbmcgYXZhaWxhYmlsaXR5IGdyb3VwIGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24uCgogICAgTWFuZGF0b3J5IGxpc3RlbmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGFyZToKCiAgICAgICAgW1N0cmluZ10gTkFNRSAtIExpc3RlbmVyIG5hbWUuCgogICAgT3B0aW9uYWwgbGlzdGVuZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMgYXJlOgogICAgCiAgICAgICAgW1N0cmluZ10gUE9SVCAtIExpc3RlbmVyIHBvcnQgbnVtYmVyLiBJbnRlZ2VyIHZhbHVlIG1heSBiZSBzdWZmaXhlZCBieSBhICIrIiBzeW1vbCAoc3VjaCBhcyAiNTAyMisiKSB3aGljaCBhbGxvd3MgdGhlIHJvdXRpbmUgdG8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IG5leHQgZnJlZSBwb3J0IHdpdGggbnVtYmVyIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KICAgICAgICBbU3RyaW5nXSBESENQIC0gREhDUCBsaXN0ZW5lciBhZGRyZXNzIGNvbmZpZ3VyYXRpb24gZmxhZy4gV2hlbiBhbnkgdmFsdWUgc3BlY2lmaWVkLCBESENQIGlzIHVzZWQgdG8gY29uZmlndXJlIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGlzIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiBBbHNvLCBhIHNwZWNpZmljIGludGVyZmFjZSBmb3IgREhDUCBtYXkgYmUgc3BlY2lmaWVkIGFzIElQX0FERFJFU1MvTUFTSwogICAgICAgICAgICAgICAgICAgICAgICAobGlrZSAiMTkyLjE2OC4xLjAvMjU1LjI1NS4yNTUuMCIpIGFzIGEgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KICAgICAgICBbQXJyYXldIFNUQVRJQyAtIFN0YXRpYyBJUCBhZGRyZXNzZXMgdG8gbGlzdGVuLiBJUCBhZGRyZXNzZXMgbWF5IGJlIElQdjQgYWRkcmVzc2VzIGluIHRoZSAiSVBfQUREUkVTUy9NQVNLIiBmb3JtIG9yIElQdjYKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2VzIGluIHN0YW5kYXJkIElQdjYgbm90YXRpb24uCgogICAgU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9mZjg3ODM5OS5hc3B4IHBhZ2UgZm9yIG1vcmUgZGV0YWlscyByZWdhcmRpbmcgYWxsIHRoZSBzdXBwb3J0ZWQgb3B0aW9ucy4KICAgICM+CgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kV29ya0RpciwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbU3RyaW5nXSROYW1lLAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtBcnJheV0kRGF0YWJhc2VOYW1lcywKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0KICAgICAgICBbQXJyYXldJFJlcGxpY2FEZWZzLAogICAgICAgIFtwYXJhbWV0ZXJdCiAgICAgICAgW0hhc2h0YWJsZV0kUHJlZmVyZW5jZXMsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW0hhc2h0YWJsZV0kTGlzdGVuZXJEZWYKICAgICkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRXb3JrRGlyKSkgewogICAgICAgIFt2b2lkXShOZXctSXRlbSAtVHlwZSBEaXJlY3RvcnkgJFdvcmtEaXIpCiAgICB9CiAgICAkV29ya0RpciA9IChHZXQtSXRlbSAkV29ya0RpcikuRnVsbE5hbWUKICAgIGlmICgoR2V0LUNoaWxkSXRlbSAtUGF0aCAkV29ya0RpcikuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgdGhyb3cgIldvcmtpbmcgZGlyZWN0b3J5ICRXb3JrRGlyIGlzIG5vdCBlbXB0eSIKICAgIH0KCiAgICAkUXVvdGVkREJOYW1lcyA9ICgkRGF0YWJhc2VOYW1lcyB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVNRTE5hbWUgJF8gfSkgLWpvaW4gIiwgIgoKICAgIGlmICgkUHJlZmVyZW5jZXMgLWVxICRudWxsKSB7CiAgICAgICAgJFByZWZlcmVuY2VzID0gQCgpCiAgICB9CiAgICAkUHJlZnMgPSBAKCkKICAgIGZvcmVhY2goJFByZWYgaW4gJFByZWZlcmVuY2VzKSB7CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgJG51bGwpIHsKICAgICAgICAgICAgQ29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKCRQcmVmLktleSAtZXEgIkFVVE9NQVRFRF9CQUNLVVBfUFJFRkVSRU5DRSIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLU9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlLCBAKCJQUklNQVJZIiwgIlNFQ09OREFSWV9PTkxZIiwgIlNFQ09OREFSWSIsICJOT05FIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAkUHJlZi5LZXkpCiAgICAgICAgfSBlbHNlaWYgKCRQcmVmLktleSAtZXEgIkZBSUxVUkVfQ09ORElUSU9OX0xFVkVMIikgewogICAgICAgICAgICAkUHJlZnMgPSAkUHJlZnMgKyAoVmFsaWRhdGUtT3B0aW9uICRQcmVmLktleSwgJFByZWYuVmFsdWUsIEAoIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZWlmICgkUHJlZi5LZXkgLWVxICJIRUFMVEhfQ0hFQ0tfVElNRU9VVCIpIHsKICAgICAgICAgICAgJFByZWZzID0gJFByZWZzICsgKFZhbGlkYXRlLUludE9wdGlvbiAkUHJlZi5LZXksICRQcmVmLlZhbHVlIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgJFByZWYuS2V5KQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICJVbmV4cGVjdGVkIHBlZmVyZW5jZXMgb3B0aW9uOiAnJCgkUHJlZi5LZXkpJyIKICAgICAgICB9CiAgICB9CgogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICRSZXBsaWNhRGVmcy5MZW5ndGg7ICRpKyspIHsKICAgICAgICAkUkRlZiA9ICRSZXBsaWNhRGVmc1skaV0KICAgICAgICBpZiAoJFJEZWYuR2V0VHlwZSgpLk5hbWUgLW5lICJIYXNodGFibGUiKSB7CiAgICAgICAgICAgIHRocm93ICJBbGwgZWxlbWVudHMgb2YgUmVwbGljYURlZnMgYXJyYXkgc2hvdWxkIGJlIEhhc2h0YWJsZXMiCiAgICAgICAgfQoKICAgICAgICAkUmVwbGljYU9wdHMgPSBAKCkKCiAgICAgICAgIyBNYW5kYXRvcnkgb3B0aW9ucwogICAgICAgICRSZXBsaWNhTmFtZSA9IFZhbGlkYXRlLURlZmluZWRPcHRpb24gIlNFUlZFUl9JTlNUQU5DRSIgJFJEZWZbIlNFUlZFUl9JTlNUQU5DRSJdCiAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLURlZmluZWRPcHRpb24gIkVORFBPSU5UX1VSTCIgJFJEZWZbIkVORFBPSU5UX1VSTCJdIHwgQ29udmVydFRvLVNRTFN0cmluZyB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJFTkRQT0lOVF9VUkwiKQogICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArIChWYWxpZGF0ZS1PcHRpb24gIkFWQUlMQUJJTElUWV9NT0RFIiAkUkRlZlsiQVZBSUxBQklMSVRZX01PREUiXSBAKCJTWU5DSFJPTk9VU19DT01NSVQiLCAiQVNZTkNIUk9OT1VTX0NPTU1JVCIpIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIkFWQUlMQUJJTElUWV9NT0RFIikKICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoVmFsaWRhdGUtT3B0aW9uICJGQUlMT1ZFUl9NT0RFIiAkUkRlZlsiRkFJTE9WRVJfTU9ERSJdIEAoIkFVVE9NQVRJQyIsICJNQU5VQUwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJGQUlMT1ZFUl9NT0RFIikKCiAgICAgICAgIyBPcHRpb25hbCBvcHRpb25zCiAgICAgICAgaWYgKCRSRGVmWyJCQUNLVVBfUFJJT1JJVFkiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiQkFDS1VQX1BSSU9SSVRZIiAkUkRlZlsiQkFDS1VQX1BSSU9SSVRZIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQkFDS1VQX1BSSU9SSVRZIikKICAgICAgICB9CiAgICAgICAgaWYgKCRSRGVmWyJTRVNTSU9OX1RJTUVPVVQiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFJlcGxpY2FPcHRzID0gJFJlcGxpY2FPcHRzICsgKFZhbGlkYXRlLUludE9wdGlvbiAiU0VTU0lPTl9USU1FT1VUIiAkUkRlZlsiU0VTU0lPTl9USU1FT1VUIl0gfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiU0VTU0lPTl9USU1FT1VUIikKICAgICAgICB9CgogICAgICAgICRTZWNvbmRhcnlSb2xlID0gQCgpCiAgICAgICAgaWYgKCRSRGVmWyJTX0FMTE9XX0NPTk5FQ1RJT05TIl0gLW5lICRudWxsKSB7CiAgICAgICAgICAgICRTZWNvbmRhcnlSb2xlID0gJFNlY29uZGFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJTX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiU19BTExPV19DT05ORUNUSU9OUyJdIEAoIk5PIiwgIlJFQURfT05MWSIsICJBTEwiKSB8IE5ldy1SZXBsaWNhT3B0aW9uIC1OYW1lICJBTExPV19DT05ORUNUSU9OUyIpCiAgICAgICAgfQogICAgICAgIGlmICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSAtbmUgJG51bGwpIHsKICAgICAgICAgICAgJFNlY29uZGFyeVJvbGUgPSAkU2Vjb25kYXJ5Um9sZSArICgkUkRlZlsiU19SRUFEX09OTFlfUk9VVElOR19VUkwiXSB8IENvbnZlcnRUby1TUUxTdHJpbmcgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFNlY29uZGFyeVJvbGUuTGVuZ3RoIC1ndCAwKSB7CiAgICAgICAgICAgICRSZXBsaWNhT3B0cyA9ICRSZXBsaWNhT3B0cyArICgiKCAkKCRTZWNvbmRhcnlSb2xlIC1qb2luICcsICcpICkiIHwgTmV3LVJlcGxpY2FPcHRpb24gLU5hbWUgIlNFQ09OREFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRQcmltYXJ5Um9sZSA9IEAoKQogICAgICAgIGlmICgkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoVmFsaWRhdGUtT3B0aW9uICJQX0FMTE9XX0NPTk5FQ1RJT05TIiAkUkRlZlsiUF9BTExPV19DT05ORUNUSU9OUyJdIEAoIlJFQURfV1JJVEUiLCAiQUxMIikgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFJEZWZbIlBfUkVBRF9PTkxZX1JPVVRJTkdfTElTVCJdIC1uZSAkbnVsbCkgewogICAgICAgICAgICAkUHJpbWFyeVJvbGUgPSAkUHJpbWFyeVJvbGUgKyAoKCgkUkRlZlsiUF9SRUFEX09OTFlfUk9VVElOR19MSVNUIl0gfCBGb3JFYWNoLU9iamVjdCB7IENvbnZlcnRUby1TUUxTdHJpbmcgJF8gfSkgLWpvaW4gJywgJykgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiQUxMT1dfQ09OTkVDVElPTlMiKQogICAgICAgIH0KICAgICAgICBpZiAoJFByaW1hcnlSb2xlLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICAgICAkUmVwbGljYU9wdHMgPSAkUmVwbGljYU9wdHMgKyAoIiggJCgkUHJpbWFyeVJvbGUgLWpvaW4gJywgJykgKSIgfCBOZXctUmVwbGljYU9wdGlvbiAtTmFtZSAiUFJJTUFSWV9ST0xFIikKICAgICAgICB9CgogICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSArCiAgICAgICAgICAgICMgIFRDUDovL2JyYXZvLm11cmFuby5sb2NhbDo1MDIyCiAgICAgICAgICAgICJOJChDb252ZXJ0VG8tU1FMU3RyaW5nICRSZXBsaWNhTmFtZSkgV0lUSCAoJCgkUmVwbGljYU9wdHMgLWpvaW4gJywgJykpIgogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9ucyA9ICRSZXBsaWNhRGVmaW5pdGlvbnNBcnJheSAtam9pbiAiLGByYG4gICAgICAgICI7CgogICAgaWYgKCRMaXN0ZW5lckRlZlsiREhDUCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIkRIQ1AiXS5tYXRjaGVzKCJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikpIHsKICAgICAgICAgICAgKCRJcEFkZHIsICRNYXNrKSA9ICRMaXN0ZW5lckRlZlsiREhDUCJdIC1zcGxpdCAiLyIKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICJESENQIE9OICggJElwQWRkciwgJE1hc2sgKSIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIkRIQ1AiCiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBbYXJyYXldJElQQWRkcmVzc2VzID0gJExpc3RlbmVyRGVmWyJTVEFUSUMiXQogICAgICAgIGlmICgoJElQQWRkcmVzc2VzIC1lcSAkbnVsbCkgLW9yICgkSVBBZGRyZXNzZXMuQ291bnQgLWVxIDApKSB7CiAgICAgICAgICAgICRMaXN0ZW5lckFkZHIgPSAiREhDUCIKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkQ29udmVydGVkT3B0cyA9IEAoKQogICAgICAgICAgICBmb3JlYWNoICgkSXBPcHRpb24gaW4gJElQQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAjIElQdjQKICAgICAgICAgICAgICAgIGlmICgkSXBPcHRpb24gLW1hdGNoICJcZCtcLlxkK1wuXGQrXC5cZCsvXGQrXC5cZCtcLlxkK1wuXGQrIikgewogICAgICAgICAgICAgICAgICAgICgkSXBBZGRyLCAkTWFzaykgPSAkSXBPcHRpb24gLXNwbGl0ICIvIgogICAgICAgICAgICAgICAgICAgICRDb252ZXJ0ZWRPcHRzID0gJENvbnZlcnRlZE9wdHMgKyAiKCAkKENvbnZlcnRUby1TUUxTdHJpbmcgJElwQWRkciksICQoQ29udmVydFRvLVNRTFN0cmluZyAkTWFzaykgKSIKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBJUHY2CiAgICAgICAgICAgICAgICBpZiAoJElwT3B0aW9uIC1tYXRjaCAiXigoKD89KD8+Lio/OjopKD8hLio6OikpKSg6Oik/KFswLTlBLUZdezEsNH06Oj8pezAsNX18KFswLTlBLUZdezEsNH06KXs2fSkoXDIoWzAtOUEtRl17MSw0fSg6Oj98JCkpezAsMn18KCgyNVswLTVdfCgyWzAtNF18MVxkfFsxLTldKT9cZCkoXC58JCkpezR9fFswLTlBLUZdezEsNH06WzAtOUEtRl17MSw0fSkoPzwhW146XTp8XC4pXHoiKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcnRlZE9wdHMgPSAkQ29udmVydGVkT3B0cyArICIoICQoQ29udmVydFRvLVNRTFN0cmluZyAkSXBPcHRpb24pICkiCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93ICJNYWxmb3JtZWQgSVB2NC9JUHY2IGFkZHJlc3M6ICRJcE9wdGlvbiIKICAgICAgICAgICAgfQogICAgICAgICAgICAkTGlzdGVuZXJBZGRyID0gIklQICggJCgkQ29udmVydGVkT3B0cyAtam9pbiAnLCAnKSApIgogICAgICAgIH0KICAgIH0KICAgIGlmICgoJExpc3RlbmVyRGVmWyJOQU1FIl0gLWVxICRudWxsKSAtb3IgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXlxzKiQiKSkgewogICAgICAgIHRocm93ICJMaXN0ZW5lciBuYW1lIGlzIHJlcXVpcmVkIgogICAgfQogICAgaWYgKC1ub3QgKCRMaXN0ZW5lckRlZlsiTkFNRSJdIC1tYXRjaCAiXltBLVphLXowLTlcLl9cLV0rJCIpKSB7CiAgICAgICAgdGhyb3cgIklsbGVnYWwgbGlzdGVuZXIgbmFtZS4gSXQgY2FuIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgZGFzaGVzICgtKSwgYW5kIGh5cGhlbnMgKF8pLCBpbiBhbnkgb3JkZXIuIgogICAgfQogICAgJFBvcnQgPSAkbnVsbAogICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1uZSAkbnVsbCkgewogICAgICAgIGlmICgkTGlzdGVuZXJEZWZbIlBPUlQiXSAtbWF0Y2ggIlxkK1wrIikgewogICAgICAgICAgICAkU3RhcnRpbmdQb3J0ID0gJExpc3RlbmVyRGVmWyJQT1JUIl0gLXJlcGxhY2UgIlwrIiwgIiIKICAgICAgICAgICAgJFBvcnQgPSBHZXQtTmV4dEZyZWVQb3J0ICRTdGFydGluZ1BvcnQKICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJFBvcnQiCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRMaXN0ZW5lckRlZlsiUE9SVCJdIC1tYXRjaCAiXGQrIikgewogICAgICAgICAgICAgICAgJExpc3RlbmVyQWRkciA9ICRMaXN0ZW5lckFkZHIgKyAiLCBQT1JUID0gJCgkTGlzdGVuZXJEZWZbIlBPUlQiXSkiCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiSW52YWxpZCBwb3J0IHZhbHVlOiAkKCRMaXN0ZW5lckRlZlsiUE9SVCJdKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRMaXN0ZW5lciA9ICJMSVNURU5FUiAnJCgkTGlzdGVuZXJEZWZbIk5BTUUiXSknICggV0lUSCAkTGlzdGVuZXJBZGRyICkiCgogICAgJE5hbWUgfCBPdXQtRmlsZSAiJFdvcmtEaXJcYXZncm91cC5uYW1lIgogICAgCiAgICBmb3IgKCRpID0gMDsgJGkgLWx0ICREYXRhYmFzZU5hbWVzLkxlbmd0aDsgJGkrKykgewogICAgICAgICREYXRhQmFzZU5hbWUgPSAkRGF0YWJhc2VOYW1lc1skaV0KICAgICAgICAkRGF0YUJhc2VOYW1lIHwgT3V0LUZpbGUgIiRXb3JrRGlyXGRiJGkubmFtZSIKICAgICAgICBOZXctU1FMRGF0YWJhc2UgJERhdGFCYXNlTmFtZQogICAgICAgICRCYWNrdXBEYiA9ICJCQUNLVVAgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBUTyBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIE5PRk9STUFULCBJTklULCBOQU1FID0gTidGdWxsIERhdGFiYXNlIEJhY2t1cCcsIFNLSVAsIE5PUkVXSU5ELCBOT1VOTE9BRCwgU1RBVFMgPSAxMAogICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwRGIpCiAgICAgICAgJEJhY2t1cExvZyA9ICJCQUNLVVAgTE9HICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgVE8gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJHtpfS5sb2cuYmFrIikgV0lUSCBOT0ZPUk1BVCwgSU5JVCwgIE5BTUUgPSBOJ1RyYW5zYWN0aW9uIExvZyAgQmFja3VwJywgU0tJUCwgTk9SRVdJTkQsIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgICBHTyIKICAgICAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkQmFja3VwTG9nKQogICAgfQogICAgJFJlcGxpY2FEZWZpbml0aW9uc0FycmF5ID0gQCgpCiAgICBpZiAoJFByZWZzLkxlbmd0aCAtZ3QgMCkgewogICAgICAgICRQcmVmc0xpbmUgPSAiV0lUSCAoICQoJFByZWZzIC1qb2luICcsICcpICkiCiAgICB9IGVsc2UgewogICAgICAgICRQcmVmc0xpbmUgPSAiIgogICAgfQogICAgJFNRTCA9ICJDUkVBVEUgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJE5hbWUpICRQcmVmc0xpbmUKICAgICAgICAgICAgICAgIEZPUiBEQVRBQkFTRSAkUXVvdGVkREJOYW1lcwogICAgICAgICAgICAgICAgUkVQTElDQSBPTmByYG4gICAgICAgICRSZXBsaWNhRGVmaW5pdGlvbnMKICAgICAgICAgICAgICAgICRMaXN0ZW5lcjsKICAgICIKICAgIFt2b2lkXShJbnZva2UtU1FMVGV4dCAtU1FMICRTUUwpCiAgICByZXR1cm4gJFBvcnQKfQoKZnVuY3Rpb24gTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENyZWF0ZXMgQWx3YXlzT24gYXZhaWxhYmlsaXR5IGdyb3VwIHNlY29uZGFyeSByZXBsaWNhCgogICAgLkRFU0NSSVBUSU9OCiAgICBDcmVhdGVzIEFsd2F5c09uIGF2YWlsYWJpbGl0eSBncm91cCBzZWNvbmRhcnkgcmVwbGljYSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byBhbmQgYnkgTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAuCgogICAgLlBBUkFNRVRFUiBXb3JrRGlyCiAgICBXb3JraW5nIGRpcmVjdG9yeSB3aGljaCB3YXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJpbWFyeSByZXBsaWNhLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJFdvcmtEaXIKICAgICkKICAgIGlmICgtbm90IChUZXN0LVBhdGggJFdvcmtEaXIpKSB7CiAgICAgICAgdGhyb3cgIldvcmsgZGlyICckV29ya0Rpcicgbm90IGZvdW5kIgogICAgfQogICAgJFdvcmtEaXJPYmogPSBHZXQtSXRlbSAtUGF0aCAkV29ya0RpcgogICAgJFdvcmtEaXIgPSAkV29ya0Rpck9iai5GdWxsTmFtZQogICAgJEdyb3VwTmFtZSA9IEdldC1Db250ZW50ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJhdmdyb3VwLm5hbWUiKS5GdWxsTmFtZQoKICAgICRKb2luR3JvdXAgPSAiQUxURVIgQVZBSUxBQklMSVRZIEdST1VQICQoQ29udmVydFRvLVNRTE5hbWUgJEdyb3VwTmFtZSkgSk9JTgogICAgICAgICAgICAgICAgICAgR08iCiAgICBbdm9pZF0oSW52b2tlLVNRTFRleHQgLVNRTCAkSm9pbkdyb3VwKQoKICAgIGZvciAoJGkgPSAwOyA7ICRpKyspIHsKICAgICAgICAkRmlsZSA9ICRXb3JrRGlyT2JqLkdldEZpbGVzKCJkYiRpLm5hbWUiKQogICAgICAgIGlmICgtbm90ICRGaWxlKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAkRGF0YUJhc2VOYW1lID0gR2V0LUNvbnRlbnQgJFdvcmtEaXJPYmouR2V0RmlsZXMoImRiJGkubmFtZSIpLkZ1bGxOYW1lCiAgICAgICAgJFJlc3RvcmVEYiA9ICJSRVNUT1JFIERBVEFCQVNFICQoQ29udmVydFRvLVNRTE5hbWUgJERhdGFCYXNlTmFtZSkgRlJPTSBESVNLID0gTiQoQ29udmVydFRvLVNRTFN0cmluZyAiJFdvcmtEaXJcZGIkaS5iYWsiKSBXSVRIIEZJTEUgPSAxLCBOT1JFQ09WRVJZLCBOT1VOTE9BRCwgUkVQTEFDRSwgU1RBVFMgPSA1CiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVEYikKICAgICAgICAkUmVzdG9yZUxvZyA9ICJSRVNUT1JFIExPRyAkKENvbnZlcnRUby1TUUxOYW1lICREYXRhQmFzZU5hbWUpIEZST00gRElTSyA9IE4kKENvbnZlcnRUby1TUUxTdHJpbmcgIiRXb3JrRGlyXGRiJGkubG9nLmJhayIpIFdJVEggRklMRSA9IDEsIE5PUkVDT1ZFUlksIE5PVU5MT0FELCBTVEFUUyA9IDEwCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJFJlc3RvcmVMb2cpCiAgICAgICAgJEFsdGVyREIgPSAiQUxURVIgREFUQUJBU0UgJChDb252ZXJ0VG8tU1FMTmFtZSAkRGF0YUJhc2VOYW1lKSBTRVQgSEFEUiBBVkFJTEFCSUxJVFkgR1JPVVAgPSAkKENvbnZlcnRUby1TUUxOYW1lICRHcm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgR08iCiAgICAgICAgW3ZvaWRdKEludm9rZS1TUUxUZXh0IC1TUUwgJEFsdGVyREIpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1SZXBsaWNhT3B0aW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIHJldHVybiAiJE5hbWUgPSAkVmFsdWUiCn0KCmZ1bmN0aW9uIFZhbGlkYXRlLU9wdGlvbiB7CiAgICA8IwogICAgLlNZTk9QU0lTCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzCgogICAgLkRFU0NSSVBUSU9OCiAgICBDaGVja3MgdGhhdCB0aGUgdmFsdWUgaXMgb25lIG9mIGFsbG93ZWQgdmFsdWVzIG9yIHRocm93cyBleGNlcHRpb24gb3RoZXJ3aXNlLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCgogICAgLlBBUkFNRVRFUiBBbGxvd2VkCiAgICBMaXN0IG9mIGFsbG93ZWQgb3B0aW9uIHZhbHVzLgogICAgIz4KICAgIHBhcmFtKAogICAgICAgIFtwYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQogICAgICAgIFtTdHJpbmddJE5hbWUsCiAgICAgICAgW1N0cmluZ10kVmFsdWUsCiAgICAgICAgW0FycmF5XSRBbGxvd2VkCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGZvcmVhY2ggKCRWIGluICRBbGxvd2VkKSB7CiAgICAgICAgaWYgKCRWIC1lcSAkVmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICRWYWx1ZQogICAgICAgIH0KICAgIH0KICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IG9uZSBvZiAkKCRBbGxvd2VkIC1qb2luICcsICcpIgp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1JbnRPcHRpb24gewogICAgPCMKICAgIC5TWU5PUFNJUwogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIGludGVnZXIKCiAgICAuREVTQ1JJUFRJT04KICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBpbnRlZ2VyLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyXQogICAgICAgIFtTdHJpbmddJFZhbHVlCiAgICApCiAgICBpZiAoKCRWYWx1ZSAtZXEgJG51bGwpIC1vciAoJFZhbHVlIC1lcSAiIikpIHsKICAgICAgICB0aHJvdyAiTm8gdmFsdWUgd2FzIHByb3ZpZGVkIGZvciAkTmFtZSIKICAgIH0KICAgIGlmICgtbm90ICgiJFZhbHVlIiAtbWF0Y2ggIl5bKy1dP1xkKyQiKSkgewogICAgICAgIHRocm93ICJQcm92aWRlZCB2YWx1ZSAnJFZhbHVlJyBmb3IgJE5hbWUgaXMgbm90IGEgbnVtYmVyIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgpmdW5jdGlvbiBWYWxpZGF0ZS1EZWZpbmVkT3B0aW9uIHsKICAgIDwjCiAgICAuU1lOT1BTSVMKICAgIENoZWNrcyB0aGF0IHRoZSB2YWx1ZSBpcyBub3QgbnVsbAoKICAgIC5ERVNDUklQVElPTgogICAgQ2hlY2tzIHRoYXQgdGhlIHZhbHVlIGlzIG5vdCBudWxsLiBSZXR1cm5zIHByb3ZpZGVkIHZhbHVlLgoKICAgIC5QQVJBTUVURVIgTmFtZQogICAgT3B0aW9uIG5hbWUuIFVzZWQgb25seSBmb3IgZXJyb3IgbWVzc2FnZS4KCiAgICAuUEFSQU1FVEVSIFZhbHVlCiAgICBPcHRpb24gdmFsdWUuCiAgICAjPgogICAgcGFyYW0oCiAgICAgICAgW3BhcmFtZXRlcihNYW5kYXRvcnkgPSAkdHJ1ZSldCiAgICAgICAgW1N0cmluZ10kTmFtZSwKICAgICAgICBbcGFyYW1ldGVyKE1hbmRhdG9yeSA9ICRmYWxzZSldCiAgICAgICAgW1N0cmluZ10kVmFsdWUKICAgICkKICAgIGlmICgoJFZhbHVlIC1lcSAkbnVsbCkgLW9yICgkVmFsdWUgLWVxICIiKSkgewogICAgICAgIHRocm93ICJObyB2YWx1ZSB3YXMgcHJvdmlkZWQgZm9yICROYW1lIgogICAgfQogICAgcmV0dXJuICRWYWx1ZQp9CgoKCg==",
"CnRyYXAgewogICAgJiRUcmFwSGFuZGxlcgp9CgpmdW5jdGlvbiBJbnN0YWxsLVNxbFNlcnZlclBvd2VyU2hlbGxNb2R1bGUgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICRTZXR1cFJvb3QgPSAnJwogICAgKQogICAgYmVnaW4gewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbgogICAgfQogICAgZW5kIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24gLUVuZAogICAgfQogICAgcHJvY2VzcyB7CiAgICAgICAgdHJhcCB7CiAgICAgICAgICAgICYkVHJhcEhhbmRsZXIKICAgICAgICB9CgogICAgICAgIGlmICgoR2V0LU1vZHVsZSBTUUxQUyAtTGlzdEF2YWlsYWJsZSkgLW5lICRudWxsKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiTW9kdWxlIFNRTFNQIGFscmVhZHkgaW5zdGFsbGVkLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcVG9vbHMnKQogICAgICAgIH0KICAgICAgICAKICAgICAgICAkRmlsZUxpc3QgPSBAKAogICAgICAgICAgICAnU1FMU3lzQ2xyVHlwZXMubXNpJywKICAgICAgICAgICAgJ1NoYXJlZE1hbmFnZW1lbnRPYmplY3RzLm1zaScsCiAgICAgICAgICAgICdQb3dlclNoZWxsVG9vbHMubXNpJwogICAgICAgICkKCiAgICAgICAgZm9yZWFjaCAoJE1zaUZpbGUgaW4gJEZpbGVMaXN0KSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVHJ5aW5nIHRvIGluc3RhbGwgJyRNc2lGaWxlJyAuLi4iCiAgICAgICAgICAgICRNc2lQYXRoID0gSm9pbi1QYXRoICRTZXR1cFJvb3QgJE1zaUZpbGUKICAgICAgICAgICAgaWYgKFtJTy5GaWxlXTo6RXhpc3RzKCRNc2lQYXRoKSkgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nICJTdGFydGluZyBtc2lleGUgLi4uIgogICAgICAgICAgICAgICAgJFJlc3VsdCA9IEV4ZWMgLUZpbGVQYXRoICJtc2lleGVjLmV4ZSIgLUFyZ3VtZW50TGlzdCBAKCcvaScsICJgIiRNc2lQYXRoYCIiLCAnL3F1aWV0JykgLVBhc3NUaHJ1CiAgICAgICAgICAgICAgICBpZiAoJFJlc3VsdC5FeGl0Q29kZSAtbmUgMCkgewogICAgICAgICAgICAgICAgICAgIHRocm93ICgiSW5zdGFsbGF0aW9uIG9mIE1TSSBwYWNrYWdlICckTXNpUGF0aCcgZmFpbGVkIHdpdGggZXJyb3IgY29kZSAnJCgkUmVzdWx0LkV4aXRDb2RlKSciKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgV3JpdGUtTG9nICJGaWxlICckTXNpUGF0aCcgbm90IGZvdW5kLiIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKCgpmdW5jdGlvbiBJbnN0YWxsLVNxbFNlcnZlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgUGF0aCB0byBmb2xkZXIgd2hlcmUgbXNpIGZpbGVzIGZvciBhZGRpdGlvbmFsIFNRTCBmZWF0dXJlcyBhcmUgbG9jYXRlZAogICAgICAgIFtTdHJpbmddICRTZXR1cFJvb3QgPSAnJywKCiAgICAgICAgIyBQYXRoIHRvIGZvbGRlciB3aGVyZSBtc2kgZmlsZXMgZm9yIGFkZGl0aW9uYWwgU1FMUFMgbW9kdWxlIGFyZSBsb2NhdGVkCiAgICAgICAgW1N0cmluZ10gJFNxbHBzU2V0dXBSb290ID0gJycsCgogICAgICAgIFtTdHJpbmddICRNdXJhbm9GaWxlU2hhcmUgPSAnJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIERvbWFpbiBuYW1lCiAgICAgICAgW1N0cmluZ10gJFNRTFNlcnZpY2VVc2VyRG9tYWluID0gJ2ZjLWFjbWUubG9jYWwnLAoKICAgICAgICAjIChSRVFVSVJFRCkgVXNlciBuYW1lIGZvciB0aGUgYWNjb3VudCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgU1FMIHNlcnZpY2UKICAgICAgICBbU3RyaW5nXSAkU1FMU2VydmljZVVzZXJOYW1lID0gJ0FkbWluaXN0cmF0b3InLAoKICAgICAgICAjIChSRVFVSVJFRCkgUGFzc3dvcmQgZm9yIHRoYXQgdXNlcgogICAgICAgIFtTdHJpbmddICRTUUxTZXJ2aWNlVXNlclBhc3N3b3JkID0gJ1BAc3N3MHJkJywKCiAgICAgICAgW1N3aXRjaF0gJFVwZGF0ZUVuYWJsZWQKICAgICkKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBpZiAoJE11cmFub0ZpbGVTaGFyZSAtZXEgJycpIHsKICAgICAgICAgICAgJE11cmFub0ZpbGVTaGFyZSA9IFtFbnZpcm9ubWVudF06OkdldEVudmlyb25tZW50VmFyaWFibGUoJ011cmFub0ZpbGVTaGFyZScpCiAgICAgICAgICAgIGlmICgkTXVyYW5vRmlsZVNoYXJlIC1lcSAnJykgewogICAgICAgICAgICAgICAgdGhyb3coIlVuYWJsZSB0byBmaW5kIE11cmFub0ZpbGVTaGFyZSBwYXRoLiIpCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkU2V0dXBSb290IC1lcSAnJykgewogICAgICAgICAgICAkU2V0dXBSb290ID0gW0lPLlBhdGhdOjpDb21iaW5lKCRNdXJhbm9GaWxlU2hhcmUsICdQcmVyZXF1aXNpdGVzXFNRTCBTZXJ2ZXJcMjAxMicpCiAgICAgICAgfQoKICAgICAgICAkRXh0cmFPcHRpb25zID0gQHt9CgogICAgICAgIGlmICgkVXBkYXRlRW5hYmxlZCkgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJHRydWV9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRXh0cmFPcHRpb25zICs9IEB7J1VwZGF0ZUVuYWJsZWQnID0gJGZhbHNlfQogICAgICAgIH0KCiAgICAgICAgTmV3LVNRTFNlcnZlckZvckFPQUcgYAogICAgICAgICAgICAtU2V0dXBSb290ICRTZXR1cFJvb3QgYAogICAgICAgICAgICAtU1FMU3ZjVXNyRG9tYWluICRTUUxTZXJ2aWNlVXNlckRvbWFpbiBgCiAgICAgICAgICAgIC1TUUxTdmNVc3JOYW1lICRTUUxTZXJ2aWNlVXNlck5hbWUgYAogICAgICAgICAgICAtU1FMU3ZjVXNyUGFzc3dvcmQgJFNRTFNlcnZpY2VVc2VyUGFzc3dvcmQgYAogICAgICAgICAgICAtRXh0cmFPcHRpb25zICRFeHRyYU9wdGlvbnMKICAgIH0KfQoKCgpmdW5jdGlvbiBJbml0aWFsaXplLUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXAgewogICAgcGFyYW0gKAogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICREb21haW5BZG1pbkFjY291bnRQYXNzd29yZCwKICAgICAgICBbU3RyaW5nXSAkU3FsU2VydmljZUFjY291bnROYW1lLAogICAgICAgIFtTdHJpbmddICRQcmltYXJ5Tm9kZSwKICAgICAgICBbU3RyaW5nXSAkU2hhcmVOYW1lID0gJ1NoYXJlZFdvcmtEaXInCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgJFNoYXJlTmV0d29ya1BhdGggPSAnXFwnICsgJFByaW1hcnlOb2RlICsgJ1wnICsgJFNoYXJlTmFtZQoKICAgICAgICAkRG9tYWluQWRtaW5BY2NvdW50Q3JlZHMgPSBOZXctQ3JlZGVudGlhbCBgCiAgICAgICAgICAgIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJERvbWFpbkFkbWluQWNjb3VudE5hbWUiIGAKICAgICAgICAgICAgLVBhc3N3b3JkICIkRG9tYWluQWRtaW5BY2NvdW50UGFzc3dvcmQiCgogICAgICAgICRGdW5jdGlvbnNGaWxlID0gRXhwb3J0LUZ1bmN0aW9uICdHZXQtTmV4dEZyZWVQb3J0JywgJ0luaXRpYWxpemUtQWx3YXlzT24nCgogICAgICAgICRudWxsID0gU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICBgJF8KICAgIGV4aXQgMQp9CgpJbXBvcnQtTW9kdWxlIENvcmVGdW5jdGlvbnMKCldyaXRlLUxvZyAiSW1wb3J0aW5nIGZ1bmN0aW9ucyBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ0luaXRpYWxpemUtQWx3YXlzT24nIC4uLiIKYCRYbWxGaWxlID0gW0lPLlBhdGhdOjpDb21iaW5lKCIkU2hhcmVOZXR3b3JrUGF0aCIsICJgJChgJEVudjpDb21wdXRlck5hbWUpLnhtbCIpCldyaXRlLUxvZyAiT3V0cHV0IFhNTCBmaWxlIGlzICdgJFhtbEZpbGUnIgpJbml0aWFsaXplLUFsd2F5c09uIHwgRXhwb3J0LUNsaVhtbCAtUGF0aCBgJFhtbEZpbGUKIkAgLUNyZWRlbnRpYWwgJERvbWFpbkFkbWluQWNjb3VudENyZWRzIC1Ob0Jhc2U2NAogICAgfQp9CgoKZnVuY3Rpb24gTmV3LVNoYXJlZEZvbGRlckZvckFPQUcgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKQogICAgICAgIFtTdHJpbmddICRTaGFyZVBhdGggPSBbSU8uUGF0aF06OkNvbWJpbmUoJEVudjpTeXN0ZW1Ecml2ZSArICdcJywgJ1NoYXJlZFdvcmtEaXInKSwKCiAgICAgICAgIyAoT1BUSU9OQUwpCiAgICAgICAgW1N0cmluZ10gJFNoYXJlTmFtZSA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlID0gJyAnCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBzY3JpcHQgcnVucyBvbiBwcmltYXJ5IG5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZyBzY3JpcHQuIgogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmICgkU2hhcmVOYW1lIC1lcSAnJykgewogICAgICAgICAgICAkU2hhcmVOYW1lID0gW0lPLlBhdGhdOjpHZXRGaWxlTmFtZVdpdGhvdXRFeHRlbnNpb24oJFNoYXJlUGF0aCkKICAgICAgICB9CgogICAgICAgIFdyaXRlLUxvZ0RlYnVnICJTaGFyZVBhdGggPSAnJFNoYXJlUGF0aCciCiAgICAgICAgV3JpdGUtTG9nRGVidWcgIlNoYXJlTmFtZSA9ICckU2hhcmVOYW1lJyIKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgc2hhcmUgJyRTaGFyZU5hbWUnIgogICAgICAgICAgICAkbnVsbCA9IEdldC1TbWJTaGFyZSAtTmFtZSAkU2hhcmVOYW1lIC1FcnJvckFjdGlvbiAnU3RvcCcKICAgICAgICAgICAgJG51bGwgPSBSZW1vdmUtU21iU2hhcmUgLU5hbWUgJFNoYXJlTmFtZSAtRm9yY2UKICAgICAgICAgICAgd3JpdGUtTG9nICJTaGFyZSAnJFNoYXJlTmFtZScgcmVtb3ZlZC4iCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nV2FybmluZyAiU2hhcmUgJyRTaGFyZU5hbWUnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgV3JpdGUtTG9nRGVidWcgIlRyeWluZyB0byByZW1vdmUgZm9sZGVyICckU2hhcmVQYXRoIgogICAgICAgICAgICAkbnVsbCA9IEdldC1JdGVtIC1QYXRoICRTaGFyZVBhdGggLUVycm9yQWN0aW9uICdTdG9wJwogICAgICAgICAgICAkbnVsbCA9IFJlbW92ZS1JdGVtIC1QYXRoICRTaGFyZVBhdGggLVJlY3Vyc2UgLUZvcmNlCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRm9sZGVyICckU2hhcmVQYXRoJyByZW1vdmVkLiIKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICBXcml0ZS1Mb2dXYXJuaW5nICJGb2xkZXIgJyRTaGFyZVBhdGgnIG5vdCBleGlzdHMgb3IgY2Fubm90IGJlIGRlbGV0ZWQuIgogICAgICAgIH0KCiAgICAgICAgJG51bGwgPSBOZXctSXRlbSAtUGF0aCAkU2hhcmVQYXRoIC1JdGVtVHlwZSBDb250YWluZXIgLUZvcmNlCiAgICAgICAgICAgICAgICAKICAgICAgICAkbnVsbCA9IE5ldy1TbWJTaGFyZSAtUGF0aCAkU2hhcmVQYXRoIGAKICAgICAgICAgICAgLU5hbWUgJFNoYXJlTmFtZSBgCiAgICAgICAgICAgIC1GdWxsQWNjZXNzICJFdmVyeW9uZSIgYAogICAgICAgICAgICAtRGVzY3JpcHRpb24gIlNoYXJlZCBmb2xkZXIgZm9yIEFsd2F5c09uIEF2YWlsYWJpbGl0eSBHcm91cCBzZXR1cC4iCgogICAgICAgIHJldHVybiAnXFwnICsgJEVudjpDb21wdXRlck5hbWUgKyAnXCcgKyAkU2hhcmVOYW1lCiAgICB9Cn0KCgoKZnVuY3Rpb24gTmV3LURhdGFiYXNlRm9yQU9BRyB7CiAgICBwYXJhbSAoCiAgICAgICAgW1N0cmluZ10gJERhdGFiYXNlTmFtZSwKICAgICAgICBbU3RyaW5nXSAkRG9tYWluTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlck5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJQYXNzd29yZAogICAgKQoKICAgICRDcmVkcyA9IE5ldy1DcmVkZW50aWFsIC1Vc2VyTmFtZSAiJERvbWFpbk5hbWVcJFVzZXJOYW1lIiAtUGFzc3dvcmQgIiRVc2VyUGFzc3dvcmQiCgogICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gJ0ludm9rZS1TUUxUZXh0JywgJ0NvbnZlcnRUby1TUUxOYW1lJywgJ0NvbnZlcnRUby1TUUxTdHJpbmcnLCAnTmV3LVNRTERhdGFiYXNlJwoKICAgIFN0YXJ0LVBvd2VyU2hlbGxQcm9jZXNzIEAiCnRyYXAgewogICAgYCRfCiAgICBleGl0IDEKfQoKSW1wb3J0LU1vZHVsZSBDb3JlRnVuY3Rpb25zCgpXcml0ZS1Mb2cgIkltcG9ydGluZyBmdW5jdGlvbnMgZnJvbSBmaWxlICckRnVuY3Rpb25zRmlsZScgLi4uIgouICIkRnVuY3Rpb25zRmlsZSIKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1TUUxEYXRhYmFzZScgLi4uIgpOZXctU1FMRGF0YWJhc2UgJERhdGFiYXNlTmFtZQoiQCAtQ3JlZGVudGlhbCAkQ3JlZHMgLU5vQmFzZTY0Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHUHJpbWFyeVJlcGxpY2EgewogICAgcGFyYW0gKAogICAgICAgICMgKE9QVElPTkFMKSBOYW1lIG9mIHRoZSBuZXcgQXZhaWxhYmlsaXR5IEdyb3VwLiBJZiBub3Qgc3BlY2lmaWVkIHRoZW4gZGVmYXVsdCBuYW1lIHdpbGwgYmUgdXNlZC4KICAgICAgICBbU3RyaW5nXSAkR3JvdXBOYW1lID0gJ011cmFub0FHJywKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICROb2RlTGlzdCwKCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGUgbmFtZSB0aGF0IHdpbGwgYmUgcHJpbWFyeSBmb3Igc2VsZWN0ZWQgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nXSAkUHJpbWFyeU5vZGUsCgogICAgICAgICMgKFJFUVVJUkVEKSBEYXRhYmFzZSBsaXN0IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgQXZhaWxhYmlsaXR5IEdyb3VwCiAgICAgICAgI1tQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV0KICAgICAgICBbU3RyaW5nW11dICREYXRhYmFzZUxpc3QsCgogICAgICAgICMgKFJFUVVJUkVEKSBMaXN0ZW5lciBuYW1lIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gY29ubmVjdCB0byBkYXRhYmFzZXMgaW4gdGhhdCBBRwogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVyTmFtZSA9ICdNdXJhbm9BR19MaXN0ZW5lcicsCgogICAgICAgICMgKFJFUVVJUkVEKSBJUCBhZGRyZXNzIG9mIHRoZSBsaXN0ZW5lcgogICAgICAgICNbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVySVAsCgogICAgICAgIFtTdHJpbmddICRMaXN0ZW5lcklQTWFzayA9ICcyNTUuMjU1LjI1NS4wJywKCiAgICAgICAgW1N0cmluZ10gJExpc3RlbmVyUG9ydCA9ICc1MDIzJywKCiAgICAgICAgIyBTeW5jIE1vZGUgTm9kZSBMaXN0CiAgICAgICAgW1N0cmluZ1tdXSAkU3luY01vZGVOb2RlTGlzdCwKCiAgICAgICAgW1N0cmluZ10gJFNoYXJlZFdvcmtEaXIgPSAnU2hhcmVkV29ya0RpcicsCgogICAgICAgIFtTdHJpbmddICRDbGlYbWxGaWxlID0gJycsCgogICAgICAgIFtTdHJpbmddICREb21haW5OYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyTmFtZSwKICAgICAgICBbU3RyaW5nXSAkVXNlclBhc3N3b3JkCiAgICApCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgV3JpdGUtTG9nICJQcmltYXJ5IG5vZGU6ICckKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkpJyIKICAgICAgICBXcml0ZS1Mb2cgIkN1cnJlbnQgbm9kZTogJyQoKCRFbnY6Q29tcHV0ZXJOYW1lKS5Ub0xvd2VyKCkpJyIKCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLW5lICQoJEVudjpDb21wdXRlck5hbWUpLlRvTG93ZXIoKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlRoaXMgZnVuY3Rpb24gd29ya3Mgb24gUHJpbWFyeU5vZGUgb25seS4iCiAgICAgICAgICAgIFdyaXRlLUxvZyAiRXhpdGluZy4iCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYgKCRDbGlYbWxGaWxlIC1lcSAnJykgewogICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ID0gQCgpCiAgICAgICAgICAgIGZvcmVhY2ggKCROb2RlIGluICROb2RlTGlzdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkTm9kZUVuZHBvaW50UG9ydCA9IEltcG9ydC1DbGlYbWwgLVBhdGggIlxcJFByaW1hcnlOb2RlXFNoYXJlZFdvcmtEaXJcJE5vZGUueG1sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiVXNpbmcgZGVmYXVsdCBlbmRwb2ludCBwb3J0IDUwMjIiCiAgICAgICAgICAgICAgICAgICAgJE5vZGVFbmRwb2ludFBvcnQgPSA1MDIyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uID0gQHsKICAgICAgICAgICAgICAgICAgICAiU0VSVkVSX0lOU1RBTkNFIiA9ICIkTm9kZSI7CiAgICAgICAgICAgICAgICAgICAgIkVORFBPSU5UX1VSTCIgPSAiVENQOi8vJHtOb2RlfToke05vZGVFbmRwb2ludFBvcnR9IjsKICAgICAgICAgICAgICAgICAgICAiQVZBSUxBQklMSVRZX01PREUiID0gIkFTWU5DSFJPTk9VU19DT01NSVQiOwogICAgICAgICAgICAgICAgICAgICJGQUlMT1ZFUl9NT0RFIj0iTUFOVUFMIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJFN5bmNNb2RlTm9kZUxpc3QgLWNvbnRhaW5zICROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBpbiBTeW5jTW9kZU5vZGVMaXN0IgogICAgICAgICAgICAgICAgICAgICRSZXBsaWNhRGVmaW5pdGlvblsnQVZBSUxBQklMSVRZX01PREUnXSA9ICJTWU5DSFJPTk9VU19DT01NSVQiCiAgICAgICAgICAgICAgICAgICAgJFJlcGxpY2FEZWZpbml0aW9uWydGQUlMT1ZFUl9NT0RFJ10gPSAiQVVUT01BVElDIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgV3JpdGUtTG9nICIkTm9kZSBpcyBOT1QgaW4gU3luY01vZGVOb2RlTGlzdCIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUmVwbGljYURlZmluaXRpb25MaXN0ICs9IEAoJFJlcGxpY2FEZWZpbml0aW9uKQogICAgICAgICAgICB9CgogICAgICAgICAgICAkUHJlZmVyZW5jZXMgPSBAe30KCiAgICAgICAgICAgICRMaXN0ZW5lckRlZmluaXRpb24gPSBAewogICAgICAgICAgICAgICAgIk5BTUUiPSRMaXN0ZW5lck5hbWU7CiAgICAgICAgICAgICAgICAiUE9SVCIgPSAiJExpc3RlbmVyUG9ydCI7CiAgICAgICAgICAgICAgICAiU1RBVElDIiA9ICIkTGlzdGVuZXJJUC8kTGlzdGVuZXJJUE1hc2siCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbWV0ZXJzID0gQHsKICAgICAgICAgICAgICAgICdXb3JrRGlyJyA9ICJcXCRQcmltYXJ5Tm9kZVwkU2hhcmVkV29ya0RpciI7CiAgICAgICAgICAgICAgICAnTmFtZScgPSAkR3JvdXBOYW1lOwogICAgICAgICAgICAgICAgJ0RhdGFiYXNlTmFtZXMnID0gJERhdGFiYXNlTGlzdDsKICAgICAgICAgICAgICAgICdSZXBsaWNhRGVmcycgPSAkUmVwbGljYURlZmluaXRpb25MaXN0OwogICAgICAgICAgICAgICAgJ1ByZWZlcmVuY2VzJyA9ICRQcmVmZXJlbmNlczsKICAgICAgICAgICAgICAgICdMaXN0ZW5lckRlZicgPSAkTGlzdGVuZXJEZWZpbml0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVsbCA9IFJlbW92ZS1JdGVtIC1QYXRoICJcXCRQcmltYXJ5Tm9kZVxTaGFyZWRXb3JrRGlyXCoiIC1Gb3JjZQoKICAgICAgICAgICAgJENsaVhtbEZpbGUgPSBbSU8uUGF0aF06OkdldFRlbXBGaWxlTmFtZSgpCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiQ2xpWG1sIGZpbGU6ICckQ2xpWG1sRmlsZSciCgogICAgICAgICAgICAkbnVsbCA9IEV4cG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUgLUlucHV0T2JqZWN0ICRQYXJhbWV0ZXJzIC1EZXB0aCAxMAoKICAgICAgICAgICAgJG51bGwgPSBJbml0aWFsaXplLUFPQUdQcmltYXJ5UmVwbGljYSBgCiAgICAgICAgICAgICAgICAtQ2xpWG1sRmlsZSAkQ2xpWG1sRmlsZSBgCiAgICAgICAgICAgICAgICAtRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgCiAgICAgICAgICAgICAgICAtVXNlck5hbWUgJFVzZXJOYW1lIGAKICAgICAgICAgICAgICAgIC1Vc2VyUGFzc3dvcmQgJFVzZXJQYXNzd29yZCBgCiAgICAgICAgICAgICAgICAtUHJpbWFyeU5vZGUgJFByaW1hcnlOb2RlCgogICAgICAgICAgICBXcml0ZS1Mb2dEZWJ1ZyAiSW5uZXIgJ0luaXRpYWxpemUtQU9BR1ByaW1hcnlSZXBsaWNhJyBjYWxsIGNvbXBsZXRlZC4iCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAgICAgJEZ1bmN0aW9uc0ZpbGUgPSBFeHBvcnQtRnVuY3Rpb24gLUFsbAoKICAgICAgICAgICAgJG51bGwgPSBTdGFydC1Qb3dlclNoZWxsUHJvY2VzcyBAIgp0cmFwIHsKICAgIGAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJJbXBvcnRpbmcgQ2xpWG1sIHBhcmFtZXRlcnMgZmlsZSAuLi4iCmAkUGFyYW1ldGVycyA9IEltcG9ydC1DbGlYbWwgLVBhdGggJENsaVhtbEZpbGUKCldyaXRlLUxvZyAiU3RhcnRpbmcgJ05ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwIGBgCiAgICAtV29ya0RpciBgJFBhcmFtZXRlcnNbJ1dvcmtEaXInXSBgYAogICAgLU5hbWUgYCRQYXJhbWV0ZXJzWydOYW1lJ10gYGAKICAgIC1EYXRhYmFzZU5hbWVzIGAkUGFyYW1ldGVyc1snRGF0YWJhc2VOYW1lcyddIGBgCiAgICAtUmVwbGljYURlZnMgYCRQYXJhbWV0ZXJzWydSZXBsaWNhRGVmcyddIGBgCiAgICAtUHJlZmVyZW5jZXMgYCRQYXJhbWV0ZXJzWydQcmVmZXJlbmNlcyddIGBgCiAgICAtTGlzdGVuZXJEZWYgYCRQYXJhbWV0ZXJzWydMaXN0ZW5lckRlZiddCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgICAgICB9CiAgICB9Cn0KCgoKZnVuY3Rpb24gSW5pdGlhbGl6ZS1BT0FHU2Vjb25kYXJ5UmVwbGljYSB7CiAgICBwYXJhbSAoCiAgICAgICAgIyAoUkVRVUlSRUQpIE5vZGVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFzIHJlcGxpY2EgcGFydG5lcnMuCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgICAgIFtTdHJpbmdbXV0gJE5vZGVMaXN0LAoKICAgICAgICAjIChSRVFVSVJFRCkgTm9kZSBuYW1lIHRoYXQgd2lsbCBiZSBwcmltYXJ5IGZvciBzZWxlY3RlZCBBdmFpbGFiaWxpdHkgR3JvdXAKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldCiAgICAgICAgW1N0cmluZ10gJFByaW1hcnlOb2RlLAoKICAgICAgICBbU3RyaW5nXSAkU2hhcmVkV29ya0RpciA9ICdTaGFyZWRXb3JrRGlyJywKCiAgICAgICAgW1N0cmluZ10gJERvbWFpbk5hbWUsCiAgICAgICAgW1N0cmluZ10gJFVzZXJOYW1lLAogICAgICAgIFtTdHJpbmddICRVc2VyUGFzc3dvcmQKICAgICkgCiAgICBiZWdpbiB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uCiAgICB9CiAgICBlbmQgewogICAgICAgIFNob3ctSW52b2NhdGlvbkluZm8gJE15SW52b2NhdGlvbiAtRW5kCiAgICB9CiAgICBwcm9jZXNzIHsKICAgICAgICB0cmFwIHsKICAgICAgICAgICAgJiRUcmFwSGFuZGxlcgogICAgICAgIH0KCiAgICAgICAgaWYgKCRQcmltYXJ5Tm9kZS5Ub0xvd2VyKCkgLWVxICgkRW52OkNvbXB1dGVyTmFtZSkuVG9Mb3dlcigpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiVGhpcyBmdW5jdGlvbiB3b3JrcyBvbiBhbnkgU2Vjb25kYXJ5Tm9kZSBvbmx5LiIKICAgICAgICAgICAgV3JpdGUtTG9nICJFeGl0aW5nLiIKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICAkQ3JlZHMgPSBOZXctQ3JlZGVudGlhbCAtVXNlck5hbWUgIiREb21haW5OYW1lXCRVc2VyTmFtZSIgLVBhc3N3b3JkICIkVXNlclBhc3N3b3JkIgoKICAgICAgICAkRnVuY3Rpb25zRmlsZSA9IEV4cG9ydC1GdW5jdGlvbiAtQWxsCgogICAgICAgICRudWxsID0gU3RhcnQtUG93ZXJTaGVsbFByb2Nlc3MgQCIKdHJhcCB7CiAgICAkXwogICAgZXhpdCAxCn0KCkltcG9ydC1Nb2R1bGUgQ29yZUZ1bmN0aW9ucwoKV3JpdGUtTG9nICJJbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20gJyRGdW5jdGlvbnNGaWxlJyAuLi4iCi4gIiRGdW5jdGlvbnNGaWxlIgoKV3JpdGUtTG9nICJTdGFydGluZyAnTmV3LUFsd2F5c09uQXZhaWxhYmlsaXR5R3JvdXBSZXBsaWNhJyAuLi4iCk5ldy1BbHdheXNPbkF2YWlsYWJpbGl0eUdyb3VwUmVwbGljYSAtV29ya0RpciAiXFwkUHJpbWFyeU5vZGVcJFNoYXJlZFdvcmtEaXIiCiJAIC1DcmVkZW50aWFsICRDcmVkcyAtTm9CYXNlNjQKICAgIH0KfQoKCgpmdW5jdGlvbiBEaXNhYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb2ZmCiAgICB9Cn0KCgoKZnVuY3Rpb24gRW5hYmxlLUZpcmV3YWxsIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBuZXRzaCBhZHZmaXJld2FsbCBzZXQgYWxscHJvZmlsZXMgc3RhdGUgb24KICAgIH0KfQoKCgpmdW5jdGlvbiBFbmFibGUtVHJ1c3RlZEhvc3RzIHsKICAgIGJlZ2luIHsKICAgICAgICBTaG93LUludm9jYXRpb25JbmZvICRNeUludm9jYXRpb24KICAgIH0KICAgIGVuZCB7CiAgICAgICAgU2hvdy1JbnZvY2F0aW9uSW5mbyAkTXlJbnZvY2F0aW9uIC1FbmQKICAgIH0KICAgIHByb2Nlc3MgewogICAgICAgIHRyYXAgewogICAgICAgICAgICAmJFRyYXBIYW5kbGVyCiAgICAgICAgfQoKICAgICAgICBTZXQtSXRlbSBXU01hbjpcbG9jYWxob3N0XENsaWVudFxUcnVzdGVkSG9zdHMgLVZhbHVlICcqJyAtRm9yY2UKICAgIH0KfQo="
]
}