Files
disco-ad-compare-plugin/Build-Plugin.ps1
T
jessikitty df6671d729 fix: add AssemblyResolve handler for reflection diagnostics
Previous version failed GetExportedTypes() because Assembly.Load(bytes)
couldn't resolve Disco.Services.dll from the PowerShell process. Now
uses LoadFrom() with an AssemblyResolve handler that probes both the
build output and Disco bin directories. Also adds ReflectionTypeLoad
exception detail logging and proper handler cleanup in finally block.
2026-04-29 09:36:17 +10:00

1 line
29 KiB
PowerShell

IyBCdWlsZC1QbHVnaW4ucHMxCiMgQnVpbGRzIGFuZCBwYWNrYWdlcyB0aGUgQUQgQ29tcGFyZSBwbHVnaW4gZm9yIERpc2NvIElDVCBpbXBvcnQKIwojIFVzYWdlOgojICAgLlxCdWlsZC1QbHVnaW4ucHMxIC1EaXNjb0JpblBhdGggIkM6XFByb2dyYW0gRmlsZXNcRGlzY29cV2ViQXBwXGJpbiIKCnBhcmFtKAogICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXQogICAgW3N0cmluZ10kRGlzY29CaW5QYXRoLAoKICAgIFtzdHJpbmddJENvbmZpZ3VyYXRpb24gPSAiUmVsZWFzZSIKKQoKJEVycm9yQWN0aW9uUHJlZmVyZW5jZSA9ICJTdG9wIgokUGx1Z2luRGlyID0gJFBTU2NyaXB0Um9vdAokUGx1Z2luTmFtZSA9ICJEaXNjby5QbHVnaW5zLkFEQ29tcGFyZSIKCldyaXRlLUhvc3QgIj09PSBBRCBDb21wYXJlIFBsdWdpbiBCdWlsZGVyID09PSIgLUZvcmVncm91bmRDb2xvciBDeWFuCldyaXRlLUhvc3QgIkRpc2NvIGJpbiBwYXRoOiAkRGlzY29CaW5QYXRoIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKCiMgLS0tIFZhbGlkYXRlIC0tLQppZiAoLW5vdCAoVGVzdC1QYXRoICREaXNjb0JpblBhdGgpKSB7CiAgICBXcml0ZS1FcnJvciAiRGlzY28gYmluIHBhdGggbm90IGZvdW5kOiAkRGlzY29CaW5QYXRoIgogICAgZXhpdCAxCn0KCiRyZXF1aXJlZERsbHMgPSBAKCJEaXNjby5TZXJ2aWNlcy5kbGwiLCAiRGlzY28uTW9kZWxzLmRsbCIsICJEaXNjby5EYXRhLmRsbCIpCmZvcmVhY2ggKCRkbGwgaW4gJHJlcXVpcmVkRGxscykgewogICAgJGRsbFBhdGggPSBKb2luLVBhdGggJERpc2NvQmluUGF0aCAkZGxsCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoICRkbGxQYXRoKSkgewogICAgICAgIFdyaXRlLUVycm9yICJSZXF1aXJlZCBhc3NlbWJseSBub3QgZm91bmQ6ICRkbGxQYXRoIgogICAgICAgIGV4aXQgMQogICAgfQp9CldyaXRlLUhvc3QgIkFsbCByZXF1aXJlZCBEaXNjbyBhc3NlbWJsaWVzIGZvdW5kIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCgojIC0tLSBTaG93IERpc2NvIEFzc2VtYmx5IFZlcnNpb25zIC0tLQpXcml0ZS1Ib3N0ICJgbi0tLSBEaXNjbyBBc3NlbWJseSBWZXJzaW9ucyAtLS0iIC1Gb3JlZ3JvdW5kQ29sb3IgRGFya0dyYXkKZm9yZWFjaCAoJGRsbCBpbiAkcmVxdWlyZWREbGxzKSB7CiAgICAkZGxsUGF0aCA9IEpvaW4tUGF0aCAkRGlzY29CaW5QYXRoICRkbGwKICAgIHRyeSB7CiAgICAgICAgJGFzbU5hbWUgPSBbU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHlOYW1lXTo6R2V0QXNzZW1ibHlOYW1lKCRkbGxQYXRoKQogICAgICAgIFdyaXRlLUhvc3QgIiAgJGRsbCA6IHYkKCRhc21OYW1lLlZlcnNpb24pIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgIH0gY2F0Y2ggewogICAgICAgIFdyaXRlLVdhcm5pbmcgIiAgJGRsbCA6IGNvdWxkIG5vdCByZWFkIHZlcnNpb24gLSAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIKICAgIH0KfQoKIyAtLS0gRmluZCBNU0J1aWxkIC0tLQokbXNidWlsZCA9ICRudWxsCiR2c1doZXJlID0gIiR7ZW52OlByb2dyYW1GaWxlcyh4ODYpfVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xJbnN0YWxsZXJcdnN3aGVyZS5leGUiCmlmIChUZXN0LVBhdGggJHZzV2hlcmUpIHsKICAgICRtc2J1aWxkID0gJiAkdnNXaGVyZSAtbGF0ZXN0IC1yZXF1aXJlcyBNaWNyb3NvZnQuQ29tcG9uZW50Lk1TQnVpbGQgLWZpbmQgIk1TQnVpbGRcKipcQmluXE1TQnVpbGQuZXhlIiAyPiRudWxsIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQp9CmlmICgtbm90ICRtc2J1aWxkIC1vciAtbm90IChUZXN0LVBhdGggJG1zYnVpbGQpKSB7CiAgICAkbXNidWlsZCA9ICJDOlxXaW5kb3dzXE1pY3Jvc29mdC5ORVRcRnJhbWV3b3JrNjRcdjQuMC4zMDMxOVxNU0J1aWxkLmV4ZSIKfQppZiAoLW5vdCAoVGVzdC1QYXRoICRtc2J1aWxkKSkgewogICAgV3JpdGUtRXJyb3IgIk1TQnVpbGQgbm90IGZvdW5kLiIKICAgIGV4aXQgMQp9CldyaXRlLUhvc3QgIlVzaW5nIE1TQnVpbGQ6ICRtc2J1aWxkIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKCiMgLS0tIFJlc29sdmUgYWxsIEhpbnRQYXRocyB0byBEaXNjbyBiaW4gLS0tCiRjc3Byb2ogPSBKb2luLVBhdGggJFBsdWdpbkRpciAiJFBsdWdpbk5hbWUuY3Nwcm9qIgokY3Nwcm9qQ29udGVudCA9IEdldC1Db250ZW50ICRjc3Byb2ogLVJhdwokY3Nwcm9qQ29udGVudCA9IFtyZWdleF06OlJlcGxhY2UoJGNzcHJvakNvbnRlbnQsICc8SGludFBhdGg+W148XStcXChbXlxcPF0rXC5kbGwpPC9IaW50UGF0aD4nLCAiPEhpbnRQYXRoPiREaXNjb0JpblBhdGhcYCQxPC9IaW50UGF0aD4iKQoKJHRlbXBDc3Byb2ogPSBKb2luLVBhdGggJFBsdWdpbkRpciAiJFBsdWdpbk5hbWUuYnVpbGQuY3Nwcm9qIgokY3Nwcm9qQ29udGVudCB8IFNldC1Db250ZW50ICR0ZW1wQ3Nwcm9qIC1FbmNvZGluZyBVVEY4CldyaXRlLUhvc3QgIkFzc2VtYmx5IHJlZmVyZW5jZXMgcmVzb2x2ZWQgdG8gJERpc2NvQmluUGF0aCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgoKIyAtLS0gQnVpbGQgLS0tCldyaXRlLUhvc3QgImBuQnVpbGRpbmcgJFBsdWdpbk5hbWUgKCRDb25maWd1cmF0aW9uKS4uLiIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKJGJ1aWxkT3V0cHV0ID0gSm9pbi1QYXRoICRQbHVnaW5EaXIgImJpblwkQ29uZmlndXJhdGlvbiIKCiYgJG1zYnVpbGQgJHRlbXBDc3Byb2ogL3A6Q29uZmlndXJhdGlvbj0kQ29uZmlndXJhdGlvbiAvcDpPdXRwdXRQYXRoPSRidWlsZE91dHB1dCAvdDpCdWlsZCAvdjptaW5pbWFsCgppZiAoJExBU1RFWElUQ09ERSAtbmUgMCkgewogICAgUmVtb3ZlLUl0ZW0gJHRlbXBDc3Byb2ogLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgIFdyaXRlLUVycm9yICJCdWlsZCBmYWlsZWQhIgogICAgZXhpdCAxCn0KUmVtb3ZlLUl0ZW0gJHRlbXBDc3Byb2ogLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKCiRwbHVnaW5EbGwgPSBKb2luLVBhdGggJGJ1aWxkT3V0cHV0ICIkUGx1Z2luTmFtZS5kbGwiCmlmICgtbm90IChUZXN0LVBhdGggJHBsdWdpbkRsbCkpIHsKICAgIFdyaXRlLUVycm9yICJCdWlsZCBvdXRwdXQgbm90IGZvdW5kOiAkcGx1Z2luRGxsIgogICAgZXhpdCAxCn0KV3JpdGUtSG9zdCAiQnVpbGQgc3VjY2Vzc2Z1bDogJHBsdWdpbkRsbCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgoKIyAtLS0gQ29weSBEZXBlbmRlbmNpZXMgZm9yIFJlZmxlY3Rpb24gYW5kIE1hbmlmZXN0R2VuZXJhdG9yIC0tLQpmb3JlYWNoICgkZGxsIGluICRyZXF1aXJlZERsbHMpIHsKICAgIENvcHktSXRlbSAoSm9pbi1QYXRoICREaXNjb0JpblBhdGggJGRsbCkgJGJ1aWxkT3V0cHV0IC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQp9CiRleHRyYURsbHMgPSBAKCJFbnRpdHlGcmFtZXdvcmsuZGxsIiwgIlN5c3RlbS5XZWIuTXZjLmRsbCIsICJTeXN0ZW0uV2ViLldlYlBhZ2VzLmRsbCIsICJTeXN0ZW0uV2ViLlJhem9yLmRsbCIsICJSYXpvckdlbmVyYXRvci5NdmMuZGxsIiwgIk5ld3RvbnNvZnQuSnNvbi5kbGwiKQpmb3JlYWNoICgkZGVwIGluICRleHRyYURsbHMpIHsKICAgICRkZXBQYXRoID0gSm9pbi1QYXRoICREaXNjb0JpblBhdGggJGRlcAogICAgaWYgKFRlc3QtUGF0aCAkZGVwUGF0aCkgeyBDb3B5LUl0ZW0gJGRlcFBhdGggJGJ1aWxkT3V0cHV0IC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZSB9Cn0KCiMgLS0tIFJlZmxlY3Rpb24tQmFzZWQgRmVhdHVyZSBEaWFnbm9zdGljcyAtLS0KV3JpdGUtSG9zdCAiYG4tLS0gUGx1Z2luIEFzc2VtYmx5IERpYWdub3N0aWNzIC0tLSIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKCiRyZWZsZWN0aW9uT2sgPSAkdHJ1ZQp0cnkgewogICAgIyBTZXQgdXAgQXNzZW1ibHlSZXNvbHZlIGhhbmRsZXIgc28gdGhlIENMUiBjYW4gZmluZCBEaXNjby5TZXJ2aWNlcy5kbGwgZXRjLgogICAgIyB3aGVuIHdlIGxvYWQgdGhlIHBsdWdpbiBhc3NlbWJseSBmb3IgcmVmbGVjdGlvbgogICAgJHJlc29sdmVIYW5kbGVyID0gW1N5c3RlbS5SZXNvbHZlRXZlbnRIYW5kbGVyXXsKICAgICAgICBwYXJhbSgkc2VuZGVyLCAkYXJncykKICAgICAgICAkc2hvcnROYW1lID0gKCRhcmdzLk5hbWUgLXNwbGl0ICcsJylbMF0uVHJpbSgpCiAgICAgICAgJHByb2JlUGF0aHMgPSBAKCRidWlsZE91dHB1dCwgJERpc2NvQmluUGF0aCkKICAgICAgICBmb3JlYWNoICgkcHJvYmUgaW4gJHByb2JlUGF0aHMpIHsKICAgICAgICAgICAgJGNhbmRpZGF0ZSA9IEpvaW4tUGF0aCAkcHJvYmUgIiRzaG9ydE5hbWUuZGxsIgogICAgICAgICAgICBpZiAoVGVzdC1QYXRoICRjYW5kaWRhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHldOjpMb2FkRnJvbSgkY2FuZGlkYXRlKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbnVsbAogICAgfQogICAgW1N5c3RlbS5BcHBEb21haW5dOjpDdXJyZW50RG9tYWluLmFkZF9Bc3NlbWJseVJlc29sdmUoJHJlc29sdmVIYW5kbGVyKQoKICAgICRwbHVnaW5Bc20gPSBbU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHldOjpMb2FkRnJvbSgkcGx1Z2luRGxsKQoKICAgIFdyaXRlLUhvc3QgIiAgUGx1Z2luIGFzc2VtYmx5IGxvYWRlZDogJCgkcGx1Z2luQXNtLkZ1bGxOYW1lKSIgLUZvcmVncm91bmRDb2xvciBHcmF5CgogICAgIyBGaW5kIGFsbCB0eXBlcyB0aGF0IGV4dGVuZCBVSUV4dGVuc2lvbkZlYXR1cmU8VD4KICAgICR1aUV4dFR5cGVzID0gQCgpCiAgICBmb3JlYWNoICgkdCBpbiAkcGx1Z2luQXNtLkdldEV4cG9ydGVkVHlwZXMoKSkgewogICAgICAgICRiYXNlVHlwZSA9ICR0LkJhc2VUeXBlCiAgICAgICAgaWYgKCRiYXNlVHlwZSAtbmUgJG51bGwgLWFuZCAkYmFzZVR5cGUuSXNHZW5lcmljVHlwZSkgewogICAgICAgICAgICAkZ2VuRGVmID0gJGJhc2VUeXBlLkdldEdlbmVyaWNUeXBlRGVmaW5pdGlvbigpCiAgICAgICAgICAgIGlmICgkZ2VuRGVmLkZ1bGxOYW1lIC1lcSAnRGlzY28uU2VydmljZXMuUGx1Z2lucy5GZWF0dXJlcy5VSUV4dGVuc2lvbi5VSUV4dGVuc2lvbkZlYXR1cmVgMScpIHsKICAgICAgICAgICAgICAgICR1aUV4dFR5cGVzICs9ICR0CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCR1aUV4dFR5cGVzLkNvdW50IC1lcSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAiICBOTyBVSUV4dGVuc2lvbkZlYXR1cmU8VD4gaW1wbGVtZW50YXRpb25zIGZvdW5kIGluIGFzc2VtYmx5ISIKICAgICAgICBXcml0ZS1XYXJuaW5nICIgIEV4ZWN1dGVBY3Rpb24gd2lsbCBuZXZlciBiZSBjYWxsZWQgd2l0aG91dCBVSUV4dGVuc2lvbiBmZWF0dXJlcy4iCiAgICAgICAgJHJlZmxlY3Rpb25PayA9ICRmYWxzZQogICAgfSBlbHNlIHsKICAgICAgICBXcml0ZS1Ib3N0ICIgIEZvdW5kICQoJHVpRXh0VHlwZXMuQ291bnQpIFVJRXh0ZW5zaW9uIGZlYXR1cmUocyk6IiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICB9CgogICAgZm9yZWFjaCAoJHQgaW4gJHVpRXh0VHlwZXMpIHsKICAgICAgICAkYmFzZVR5cGUgPSAkdC5CYXNlVHlwZQogICAgICAgICRnZW5BcmdzID0gJGJhc2VUeXBlLkdldEdlbmVyaWNBcmd1bWVudHMoKQogICAgICAgICRtb2RlbFR5cGUgPSAkZ2VuQXJnc1swXQogICAgICAgICRnZW5EZWZGdWxsTmFtZSA9ICRiYXNlVHlwZS5HZXRHZW5lcmljVHlwZURlZmluaXRpb24oKS5GdWxsTmFtZQoKICAgICAgICBXcml0ZS1Ib3N0ICJgbiAgRmVhdHVyZTogJCgkdC5GdWxsTmFtZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgQ3lhbgogICAgICAgIFdyaXRlLUhvc3QgIiAgICBCYXNlIHR5cGU6ICAgICAgICAgICAkKCRiYXNlVHlwZS5GdWxsTmFtZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgICAgIFdyaXRlLUhvc3QgIiAgICBHZW5lcmljIGRlZmluaXRpb246ICAkZ2VuRGVmRnVsbE5hbWUiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgICAgIFdyaXRlLUhvc3QgIiAgICBNb2RlbCB0eXBlOiAgICAgICAgICAkKCRtb2RlbFR5cGUuRnVsbE5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICBXcml0ZS1Ib3N0ICIgICAgTW9kZWwgYXNzZW1ibHk6ICAgICAgJCgkbW9kZWxUeXBlLkFzc2VtYmx5LkdldE5hbWUoKS5OYW1lKSB2JCgkbW9kZWxUeXBlLkFzc2VtYmx5LkdldE5hbWUoKS5WZXJzaW9uKSIgLUZvcmVncm91bmRDb2xvciBHcmF5CgogICAgICAgICMgVmVyaWZ5IFtQbHVnaW5GZWF0dXJlXSBhdHRyaWJ1dGUKICAgICAgICAkYXR0cnMgPSAkdC5HZXRDdXN0b21BdHRyaWJ1dGVzKCR0cnVlKSB8IFdoZXJlLU9iamVjdCB7ICRfLkdldFR5cGUoKS5OYW1lIC1lcSAnUGx1Z2luRmVhdHVyZUF0dHJpYnV0ZScgfQogICAgICAgIGlmICgkYXR0cnMpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGF0dHIgaW4gJGF0dHJzKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICIgICAgW1BsdWdpbkZlYXR1cmVdIElkOiAgJCgkYXR0ci5JZCkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICAgIFtQbHVnaW5GZWF0dXJlXSBOYW1lOiAkKCRhdHRyLk5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIiAgICBNSVNTSU5HIFtQbHVnaW5GZWF0dXJlXSBhdHRyaWJ1dGUhIERpc2NvIGNhbm5vdCBkaXNjb3ZlciB0aGlzIGZlYXR1cmUuIgogICAgICAgICAgICAkcmVmbGVjdGlvbk9rID0gJGZhbHNlCiAgICAgICAgfQoKICAgICAgICAjIFZlcmlmeSBFeGVjdXRlQWN0aW9uIGlzIG92ZXJyaWRkZW4gKG5vdCBqdXN0IHRoZSBhYnN0cmFjdCBiYXNlKQogICAgICAgICRleGVjTWV0aG9kID0gJHQuR2V0TWV0aG9kKCdFeGVjdXRlQWN0aW9uJywgW1N5c3RlbS5SZWZsZWN0aW9uLkJpbmRpbmdGbGFnc10nUHVibGljLEluc3RhbmNlJykKICAgICAgICBpZiAoJGV4ZWNNZXRob2QgLWFuZCAkZXhlY01ldGhvZC5EZWNsYXJpbmdUeXBlIC1lcSAkdCkgewogICAgICAgICAgICBXcml0ZS1Ib3N0ICIgICAgRXhlY3V0ZUFjdGlvbjogICAgICAgb3ZlcnJpZGRlbiAoT0spIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICAgICAgfSBlbHNlaWYgKCRleGVjTWV0aG9kKSB7CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIiAgICBFeGVjdXRlQWN0aW9uOiAgICAgICBOT1Qgb3ZlcnJpZGRlbiAoZGVjbGFyZWQgaW4gJCgkZXhlY01ldGhvZC5EZWNsYXJpbmdUeXBlLk5hbWUpKSIKICAgICAgICAgICAgJHJlZmxlY3Rpb25PayA9ICRmYWxzZQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIiAgICBFeGVjdXRlQWN0aW9uOiAgICAgICBOT1QgRk9VTkQiCiAgICAgICAgICAgICRyZWZsZWN0aW9uT2sgPSAkZmFsc2UKICAgICAgICB9CgogICAgICAgICMgVmVyaWZ5IEluaXRpYWxpemUgaXMgb3ZlcnJpZGRlbiBhbmQgY2FsbHMgUmVnaXN0ZXIoKQogICAgICAgICRpbml0TWV0aG9kID0gJHQuR2V0TWV0aG9kKCdJbml0aWFsaXplJywgW1N5c3RlbS5SZWZsZWN0aW9uLkJpbmRpbmdGbGFnc10nUHVibGljLEluc3RhbmNlJywgJG51bGwsIEAoW1R5cGVdJ0Rpc2NvLkRhdGEuUmVwb3NpdG9yeS5EaXNjb0RhdGFDb250ZXh0JyksICRudWxsKQogICAgICAgIGlmICgkaW5pdE1ldGhvZCAtYW5kICRpbml0TWV0aG9kLkRlY2xhcmluZ1R5cGUgLWVxICR0KSB7CiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICBJbml0aWFsaXplOiAgICAgICAgICBvdmVycmlkZGVuIChPSykiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBXcml0ZS1XYXJuaW5nICIgICAgSW5pdGlhbGl6ZTogICAgICAgICAgTk9UIG92ZXJyaWRkZW4gLSBSZWdpc3RlcigpIHdpbGwgbmV2ZXIgYmUgY2FsbGVkISIKICAgICAgICAgICAgJHJlZmxlY3Rpb25PayA9ICRmYWxzZQogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBtb2RlbCB0eXBlIGltcGxlbWVudHMgQmFzZVVJTW9kZWwKICAgICAgICAkYmFzZVVJTW9kZWwgPSAkbW9kZWxUeXBlLkdldEludGVyZmFjZSgnQmFzZVVJTW9kZWwnKQogICAgICAgIGlmICgkYmFzZVVJTW9kZWwpIHsKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICAgIEJhc2VVSU1vZGVsOiAgICAgICAgICQoJG1vZGVsVHlwZS5OYW1lKSBpbXBsZW1lbnRzIEJhc2VVSU1vZGVsIChPSykiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBXcml0ZS1XYXJuaW5nICIgICAgQmFzZVVJTW9kZWw6ICAgICAgICAgJCgkbW9kZWxUeXBlLk5hbWUpIGRvZXMgTk9UIGltcGxlbWVudCBCYXNlVUlNb2RlbCEiCiAgICAgICAgICAgICRyZWZsZWN0aW9uT2sgPSAkZmFsc2UKICAgICAgICB9CiAgICB9CgogICAgIyBDaGVjayB0aGUgbWFpbiBwbHVnaW4gY2xhc3MKICAgICRwbHVnaW5DbGFzcyA9ICRwbHVnaW5Bc20uR2V0RXhwb3J0ZWRUeXBlcygpIHwgV2hlcmUtT2JqZWN0IHsKICAgICAgICAkXy5CYXNlVHlwZSAtbmUgJG51bGwgLWFuZCAkXy5CYXNlVHlwZS5GdWxsTmFtZSAtZXEgJ0Rpc2NvLlNlcnZpY2VzLlBsdWdpbnMuUGx1Z2luJwogICAgfQogICAgaWYgKCRwbHVnaW5DbGFzcykgewogICAgICAgIFdyaXRlLUhvc3QgImBuICBQbHVnaW4gY2xhc3M6ICQoJHBsdWdpbkNsYXNzLkZ1bGxOYW1lKSIgLUZvcmVncm91bmRDb2xvciBDeWFuCiAgICAgICAgJHBsdWdpbkF0dHJzID0gJHBsdWdpbkNsYXNzLkdldEN1c3RvbUF0dHJpYnV0ZXMoJHRydWUpIHwgV2hlcmUtT2JqZWN0IHsgJF8uR2V0VHlwZSgpLk5hbWUgLWVxICdQbHVnaW5BdHRyaWJ1dGUnIH0KICAgICAgICBpZiAoJHBsdWdpbkF0dHJzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRhdHRyIGluICRwbHVnaW5BdHRycykgewogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiICAgIFtQbHVnaW5dIElkOiAgICQoJGF0dHIuSWQpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICBbUGx1Z2luXSBOYW1lOiAkKCRhdHRyLk5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFdyaXRlLVdhcm5pbmcgIiAgICBNSVNTSU5HIFtQbHVnaW5dIGF0dHJpYnV0ZSEiCiAgICAgICAgfQogICAgfQoKfSBjYXRjaCB7CiAgICBXcml0ZS1XYXJuaW5nICIgIFJlZmxlY3Rpb24gZGlhZ25vc3RpY3MgZmFpbGVkOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIKICAgIGlmICgkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24pIHsKICAgICAgICBXcml0ZS1XYXJuaW5nICIgIElubmVyIGV4Y2VwdGlvbjogJCgkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24uTWVzc2FnZSkiCiAgICB9CiAgICAjIEZvciBSZWZsZWN0aW9uVHlwZUxvYWRFeGNlcHRpb24sIHNob3cgdGhlIGxvYWRlciBleGNlcHRpb25zCiAgICBpZiAoJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uIC1hbmQgJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uLkdldFR5cGUoKS5OYW1lIC1lcSAnUmVmbGVjdGlvblR5cGVMb2FkRXhjZXB0aW9uJykgewogICAgICAgICRsb2FkZXJFeGNlcHRpb25zID0gJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uLkxvYWRlckV4Y2VwdGlvbnMKICAgICAgICBpZiAoJGxvYWRlckV4Y2VwdGlvbnMpIHsKICAgICAgICAgICAgV3JpdGUtV2FybmluZyAiICBMb2FkZXIgZXhjZXB0aW9uczoiCiAgICAgICAgICAgICRsb2FkZXJFeGNlcHRpb25zIHwgU2VsZWN0LU9iamVjdCAtVW5pcXVlIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICAgICAgV3JpdGUtV2FybmluZyAiICAgIC0gJCgkXy5NZXNzYWdlKSIKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFdyaXRlLVdhcm5pbmcgIiAgVGhpcyBtYXkgaW5kaWNhdGUgYXNzZW1ibHkgbG9hZCBpc3N1ZXMgKG1pc3NpbmcgZGVwZW5kZW5jaWVzLCB2ZXJzaW9uIG1pc21hdGNoZXMpLiIKICAgICRyZWZsZWN0aW9uT2sgPSAkZmFsc2UKfSBmaW5hbGx5IHsKICAgICMgQ2xlYW4gdXAgdGhlIEFzc2VtYmx5UmVzb2x2ZSBoYW5kbGVyCiAgICBpZiAoJHJlc29sdmVIYW5kbGVyKSB7CiAgICAgICAgW1N5c3RlbS5BcHBEb21haW5dOjpDdXJyZW50RG9tYWluLnJlbW92ZV9Bc3NlbWJseVJlc29sdmUoJHJlc29sdmVIYW5kbGVyKQogICAgfQp9CgppZiAoJHJlZmxlY3Rpb25PaykgewogICAgV3JpdGUtSG9zdCAiYG4gIEFsbCByZWZsZWN0aW9uIGNoZWNrcyBQQVNTRUQiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KfSBlbHNlIHsKICAgIFdyaXRlLUhvc3QgImBuICBTb21lIHJlZmxlY3Rpb24gY2hlY2tzIEZBSUxFRCAtIHNlZSB3YXJuaW5ncyBhYm92ZSIgLUZvcmVncm91bmRDb2xvciBSZWQKfQoKIyAtLS0gR2VuZXJhdGUgTWFuaWZlc3QgLS0tCldyaXRlLUhvc3QgImBuLS0tIE1hbmlmZXN0IEdlbmVyYXRpb24gLS0tIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwoKJHVzZU1hbmlmZXN0R2VuID0gJGZhbHNlCiRtYW5pZmVzdEdlbkV4ZSA9IEpvaW4tUGF0aCAkRGlzY29CaW5QYXRoICJEaXNjby5TZXJ2aWNlcy5QbHVnaW5zLk1hbmlmZXN0R2VuZXJhdG9yLmV4ZSIKaWYgKC1ub3QgKFRlc3QtUGF0aCAkbWFuaWZlc3RHZW5FeGUpKSB7CiAgICAkbWFuaWZlc3RHZW5FeGUgPSBKb2luLVBhdGggKFNwbGl0LVBhdGggJERpc2NvQmluUGF0aCAtUGFyZW50KSAiRGlzY28uU2VydmljZXMuUGx1Z2lucy5NYW5pZmVzdEdlbmVyYXRvci5leGUiCn0KaWYgKFRlc3QtUGF0aCAkbWFuaWZlc3RHZW5FeGUpIHsKICAgIFdyaXRlLUhvc3QgIkZvdW5kIE1hbmlmZXN0R2VuZXJhdG9yOiAkbWFuaWZlc3RHZW5FeGUiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgJHVzZU1hbmlmZXN0R2VuID0gJHRydWUKCiAgICAjIENhcHR1cmUgc3Rkb3V0IGFuZCBzdGRlcnIgc2VwYXJhdGVseSBmb3IgZGlhZ25vc3RpY3MKICAgICRtYW5pZmVzdEdlbk91dHB1dCA9ICYgJG1hbmlmZXN0R2VuRXhlICRwbHVnaW5EbGwgMj4mMQogICAgJG1hbmlmZXN0R2VuRXhpdCA9ICRMQVNURVhJVENPREUKCiAgICBpZiAoJG1hbmlmZXN0R2VuT3V0cHV0KSB7CiAgICAgICAgV3JpdGUtSG9zdCAiICBNYW5pZmVzdEdlbmVyYXRvciBvdXRwdXQ6IiAtRm9yZWdyb3VuZENvbG9yIERhcmtHcmF5CiAgICAgICAgJG1hbmlmZXN0R2VuT3V0cHV0IHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICAgICAkbGluZSA9ICRfLlRvU3RyaW5nKCkKICAgICAgICAgICAgaWYgKCRfIC1pcyBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvclJlY29yZF0pIHsKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICBbU1RERVJSXSAkbGluZSIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICAkbGluZSIgLUZvcmVncm91bmRDb2xvciBEYXJrR3JheQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkbWFuaWZlc3RHZW5FeGl0IC1uZSAwKSB7CiAgICAgICAgV3JpdGUtV2FybmluZyAiTWFuaWZlc3RHZW5lcmF0b3IgZXhpdGVkIHdpdGggY29kZSAkbWFuaWZlc3RHZW5FeGl0LCBmYWxsaW5nIGJhY2sgdG8gbWFudWFsIG1hbmlmZXN0Li4uIgogICAgICAgICR1c2VNYW5pZmVzdEdlbiA9ICRmYWxzZQogICAgfSBlbHNlIHsKICAgICAgICBXcml0ZS1Ib3N0ICJNYW5pZmVzdEdlbmVyYXRvciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICB9Cn0gZWxzZSB7CiAgICBXcml0ZS1Ib3N0ICJNYW5pZmVzdEdlbmVyYXRvciBub3QgZm91bmQgYXQ6IiAtRm9yZWdyb3VuZENvbG9yIERhcmtHcmF5CiAgICBXcml0ZS1Ib3N0ICIgICREaXNjb0JpblBhdGgiIC1Gb3JlZ3JvdW5kQ29sb3IgRGFya0dyYXkKICAgIFdyaXRlLUhvc3QgIiAgJChTcGxpdC1QYXRoICREaXNjb0JpblBhdGggLVBhcmVudCkiIC1Gb3JlZ3JvdW5kQ29sb3IgRGFya0dyYXkKICAgIFdyaXRlLUhvc3QgIkZhbGxpbmcgYmFjayB0byBtYW51YWwgbWFuaWZlc3QgZ2VuZXJhdGlvbi4uLiIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKfQoKaWYgKC1ub3QgJHVzZU1hbmlmZXN0R2VuKSB7CiAgICAkdmVyc2lvbiA9IFtTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseU5hbWVdOjpHZXRBc3NlbWJseU5hbWUoJHBsdWdpbkRsbCkuVmVyc2lvbgoKICAgICMgQ2F0ZWdvcnlUeXBlTmFtZSBtdXN0IG1hdGNoIHRoZSAuTkVUIGdlbmVyaWMgdHlwZSBkZWZpbml0aW9uIEZ1bGxOYW1lLgogICAgIyBGb3IgVUlFeHRlbnNpb25GZWF0dXJlPFQ+LCB0aGlzIGlzIFVJRXh0ZW5zaW9uRmVhdHVyZWAxIChvbmUgYmFja3RpY2ssIHRoZW4gMSkuCiAgICAjIEluIFBvd2VyU2hlbGwgZG91YmxlLXF1b3RlZCBzdHJpbmdzLCBgYCAodHdvIGJhY2t0aWNrcykgcHJvZHVjZXMgb25lIGxpdGVyYWwgYmFja3RpY2suCiAgICAkdWlFeHRDYXRlZ29yeVR5cGVOYW1lID0gIkRpc2NvLlNlcnZpY2VzLlBsdWdpbnMuRmVhdHVyZXMuVUlFeHRlbnNpb24uVUlFeHRlbnNpb25GZWF0dXJlYGAxIgoKICAgICRtYW5pZmVzdCA9IFtvcmRlcmVkXUB7CiAgICAgICAgSWQgPSAkUGx1Z2luTmFtZQogICAgICAgIE5hbWUgPSAiQUQgQ29tcGFyZSIKICAgICAgICBBdXRob3IgPSAiSmVzcyBSb2dlcnNvbiIKICAgICAgICBVcmwgPSAiaHR0cHM6Ly9naXRlYS5oaWRlYXdheWdhbWluZy5jb20uYXUvamVzc2lraXR0eS9kaXNjby1hZC1jb21wYXJlLXBsdWdpbiIKICAgICAgICBWZXJzaW9uID0gJHZlcnNpb24uVG9TdHJpbmcoKQogICAgICAgIEFzc2VtYmx5UGF0aCA9ICIkUGx1Z2luTmFtZS5kbGwiCiAgICAgICAgVHlwZU5hbWUgPSAiRGlzY28uUGx1Z2lucy5BRENvbXBhcmUuQURDb21wYXJlUGx1Z2luIgogICAgICAgIENvbmZpZ3VyYXRpb25IYW5kbGVyVHlwZU5hbWUgPSAiRGlzY28uUGx1Z2lucy5BRENvbXBhcmUuQ29uZmlndXJhdGlvbkhhbmRsZXIuQURDb21wYXJlQ29uZmlndXJhdGlvbkhhbmRsZXIiCiAgICAgICAgV2ViSGFuZGxlclR5cGVOYW1lID0gIkRpc2NvLlBsdWdpbnMuQURDb21wYXJlLldlYkhhbmRsZXIuQURDb21wYXJlV2ViSGFuZGxlciIKICAgICAgICBGZWF0dXJlcyA9IEAoCiAgICAgICAgICAgIFtvcmRlcmVkXUB7CiAgICAgICAgICAgICAgICBJZCA9ICJBRENvbXBhcmVEZXZpY2VVSSIKICAgICAgICAgICAgICAgIE5hbWUgPSAiRGV2aWNlIFBhZ2UgLSBBRCBDb21wYXJlIgogICAgICAgICAgICAgICAgVHlwZU5hbWUgPSAiRGlzY28uUGx1Z2lucy5BRENvbXBhcmUuRmVhdHVyZXMuRGV2aWNlVUlFeHRlbnNpb24iCiAgICAgICAgICAgICAgICBQcmltYXJ5RmVhdHVyZSA9ICRmYWxzZQogICAgICAgICAgICAgICAgQ2F0ZWdvcnlUeXBlTmFtZSA9ICR1aUV4dENhdGVnb3J5VHlwZU5hbWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgW29yZGVyZWRdQHsKICAgICAgICAgICAgICAgIElkID0gIkFEQ29tcGFyZVVzZXJVSSIKICAgICAgICAgICAgICAgIE5hbWUgPSAiVXNlciBQYWdlIC0gQUQgQ29tcGFyZSIKICAgICAgICAgICAgICAgIFR5cGVOYW1lID0gIkRpc2NvLlBsdWdpbnMuQURDb21wYXJlLkZlYXR1cmVzLlVzZXJVSUV4dGVuc2lvbiIKICAgICAgICAgICAgICAgIFByaW1hcnlGZWF0dXJlID0gJGZhbHNlCiAgICAgICAgICAgICAgICBDYXRlZ29yeVR5cGVOYW1lID0gJHVpRXh0Q2F0ZWdvcnlUeXBlTmFtZQogICAgICAgICAgICB9CiAgICAgICAgKQogICAgfQogICAgJG1hbmlmZXN0SnNvbiA9ICRtYW5pZmVzdCB8IENvbnZlcnRUby1Kc29uIC1EZXB0aCA1CiAgICAkbWFuaWZlc3RKc29uIHwgU2V0LUNvbnRlbnQgKEpvaW4tUGF0aCAkYnVpbGRPdXRwdXQgIm1hbmlmZXN0Lmpzb24iKSAtRW5jb2RpbmcgVVRGOAogICAgV3JpdGUtSG9zdCAiTWFudWFsIG1hbmlmZXN0Lmpzb24gY3JlYXRlZCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgp9CgojIC0tLSBWYWxpZGF0ZSBNYW5pZmVzdCAtLS0KV3JpdGUtSG9zdCAiYG4tLS0gTWFuaWZlc3QgVmFsaWRhdGlvbiAtLS0iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CgokbWFuaWZlc3RQYXRoID0gSm9pbi1QYXRoICRidWlsZE91dHB1dCAibWFuaWZlc3QuanNvbiIKaWYgKC1ub3QgKFRlc3QtUGF0aCAkbWFuaWZlc3RQYXRoKSkgewogICAgV3JpdGUtRXJyb3IgIm1hbmlmZXN0Lmpzb24gTk9UIEZPVU5EIGluIGJ1aWxkIG91dHB1dCEgUGx1Z2luIGNhbm5vdCBiZSBsb2FkZWQgYnkgRGlzY28uIgogICAgZXhpdCAxCn0KCiRtYW5pZmVzdENvbnRlbnQgPSBHZXQtQ29udGVudCAkbWFuaWZlc3RQYXRoIC1SYXcKJG1hbmlmZXN0T2JqID0gJG1hbmlmZXN0Q29udGVudCB8IENvbnZlcnRGcm9tLUpzb24KCiMgQmFzaWMgc3RydWN0dXJlIGNoZWNrcwokbWFuaWZlc3RFcnJvcnMgPSBAKCkKJG1hbmlmZXN0V2FybmluZ3MgPSBAKCkKCmlmICgtbm90ICRtYW5pZmVzdE9iai5JZCkgeyAkbWFuaWZlc3RFcnJvcnMgKz0gIk1pc3NpbmcgJ0lkJyIgfQppZiAoLW5vdCAkbWFuaWZlc3RPYmouVHlwZU5hbWUpIHsgJG1hbmlmZXN0RXJyb3JzICs9ICJNaXNzaW5nICdUeXBlTmFtZSciIH0KaWYgKC1ub3QgJG1hbmlmZXN0T2JqLkFzc2VtYmx5UGF0aCkgeyAkbWFuaWZlc3RFcnJvcnMgKz0gIk1pc3NpbmcgJ0Fzc2VtYmx5UGF0aCciIH0KaWYgKC1ub3QgJG1hbmlmZXN0T2JqLlZlcnNpb24pIHsgJG1hbmlmZXN0V2FybmluZ3MgKz0gIk1pc3NpbmcgJ1ZlcnNpb24nIiB9CgpXcml0ZS1Ib3N0ICIgIElkOiAgICAgICAkKCRtYW5pZmVzdE9iai5JZCkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQpXcml0ZS1Ib3N0ICIgIFZlcnNpb246ICAkKCRtYW5pZmVzdE9iai5WZXJzaW9uKSIgLUZvcmVncm91bmRDb2xvciBHcmF5CldyaXRlLUhvc3QgIiAgVHlwZU5hbWU6ICQoJG1hbmlmZXN0T2JqLlR5cGVOYW1lKSIgLUZvcmVncm91bmRDb2xvciBHcmF5CgppZiAoLW5vdCAkbWFuaWZlc3RPYmouRmVhdHVyZXMgLW9yICRtYW5pZmVzdE9iai5GZWF0dXJlcy5Db3VudCAtZXEgMCkgewogICAgJG1hbmlmZXN0RXJyb3JzICs9ICJGZWF0dXJlcyBhcnJheSBpcyBFTVBUWSBvciBNSVNTSU5HIC0gbm8gVUlFeHRlbnNpb25zIHdpbGwgYmUgbG9hZGVkISIKfSBlbHNlIHsKICAgIFdyaXRlLUhvc3QgIiAgRmVhdHVyZXM6ICQoJG1hbmlmZXN0T2JqLkZlYXR1cmVzLkNvdW50KSBmb3VuZCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgoKICAgICMgRXhwZWN0ZWQgQ2F0ZWdvcnlUeXBlTmFtZSAod2l0aCBsaXRlcmFsIGJhY2t0aWNrKQogICAgJGV4cGVjdGVkQ2F0ZWdvcnkgPSAnRGlzY28uU2VydmljZXMuUGx1Z2lucy5GZWF0dXJlcy5VSUV4dGVuc2lvbi5VSUV4dGVuc2lvbkZlYXR1cmVgMScKCiAgICBmb3JlYWNoICgkZmVhdHVyZSBpbiAkbWFuaWZlc3RPYmouRmVhdHVyZXMpIHsKICAgICAgICBXcml0ZS1Ib3N0ICJgbiAgRmVhdHVyZTogJCgkZmVhdHVyZS5JZCkiIC1Gb3JlZ3JvdW5kQ29sb3IgQ3lhbgogICAgICAgIFdyaXRlLUhvc3QgIiAgICBOYW1lOiAgICAgICAgICAgICAkKCRmZWF0dXJlLk5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICBXcml0ZS1Ib3N0ICIgICAgVHlwZU5hbWU6ICAgICAgICAgJCgkZmVhdHVyZS5UeXBlTmFtZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgICAgIFdyaXRlLUhvc3QgIiAgICBDYXRlZ29yeVR5cGVOYW1lOiAkKCRmZWF0dXJlLkNhdGVnb3J5VHlwZU5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIEdyYXkKICAgICAgICBXcml0ZS1Ib3N0ICIgICAgUHJpbWFyeUZlYXR1cmU6ICAgJCgkZmVhdHVyZS5QcmltYXJ5RmVhdHVyZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQoKICAgICAgICBpZiAoLW5vdCAkZmVhdHVyZS5UeXBlTmFtZSkgewogICAgICAgICAgICAkbWFuaWZlc3RFcnJvcnMgKz0gIkZlYXR1cmUgJyQoJGZlYXR1cmUuSWQpJyBpcyBtaXNzaW5nIFR5cGVOYW1lIgogICAgICAgIH0KCiAgICAgICAgaWYgKC1ub3QgJGZlYXR1cmUuQ2F0ZWdvcnlUeXBlTmFtZSkgewogICAgICAgICAgICAkbWFuaWZlc3RFcnJvcnMgKz0gIkZlYXR1cmUgJyQoJGZlYXR1cmUuSWQpJyBpcyBtaXNzaW5nIENhdGVnb3J5VHlwZU5hbWUiCiAgICAgICAgfSBlbHNlaWYgKCRmZWF0dXJlLkNhdGVnb3J5VHlwZU5hbWUgLW5lICRleHBlY3RlZENhdGVnb3J5KSB7CiAgICAgICAgICAgICRtYW5pZmVzdEVycm9ycyArPSAiRmVhdHVyZSAnJCgkZmVhdHVyZS5JZCknIENhdGVnb3J5VHlwZU5hbWUgTUlTTUFUQ0ghIgogICAgICAgICAgICBXcml0ZS1Ib3N0ICIgICAgICBFeHBlY3RlZDogJGV4cGVjdGVkQ2F0ZWdvcnkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICAgIEdvdDogICAgICAkKCRmZWF0dXJlLkNhdGVnb3J5VHlwZU5hbWUpIiAtRm9yZWdyb3VuZENvbG9yIFJlZAoKICAgICAgICAgICAgIyBDaGFyLWJ5LWNoYXIgY29tcGFyaXNvbiB0byBpZGVudGlmeSB0aGUgZXhhY3QgZGlmZmVyZW5jZQogICAgICAgICAgICAkZXhwQ2hhcnMgPSAkZXhwZWN0ZWRDYXRlZ29yeS5Ub0NoYXJBcnJheSgpCiAgICAgICAgICAgICRhY3RDaGFycyA9ICRmZWF0dXJlLkNhdGVnb3J5VHlwZU5hbWUuVG9DaGFyQXJyYXkoKQogICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgLWx0IFtNYXRoXTo6TWF4KCRleHBDaGFycy5MZW5ndGgsICRhY3RDaGFycy5MZW5ndGgpOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkZWMgPSBpZiAoJGkgLWx0ICRleHBDaGFycy5MZW5ndGgpIHsgJGV4cENoYXJzWyRpXSB9IGVsc2UgeyAkbnVsbCB9CiAgICAgICAgICAgICAgICAkYWMgPSBpZiAoJGkgLWx0ICRhY3RDaGFycy5MZW5ndGgpIHsgJGFjdENoYXJzWyRpXSB9IGVsc2UgeyAkbnVsbCB9CiAgICAgICAgICAgICAgICBpZiAoJGVjIC1uZSAkYWMpIHsKICAgICAgICAgICAgICAgICAgICAkZWNEaXNwbGF5ID0gaWYgKCRlYykgeyAiJyRlYycgKDB4ezA6WDJ9KSIgLWYgW2ludF1bY2hhcl0kZWMgfSBlbHNlIHsgJ1tFTkRdJyB9CiAgICAgICAgICAgICAgICAgICAgJGFjRGlzcGxheSA9IGlmICgkYWMpIHsgIickYWMnICgweHswOlgyfSkiIC1mIFtpbnRdW2NoYXJdJGFjIH0gZWxzZSB7ICdbRU5EXScgfQogICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgICAgIEZpcnN0IGRpZmZlcmVuY2UgYXQgcG9zaXRpb24gJHtpfTogZXhwZWN0ZWQgJGVjRGlzcGxheSB2cyBnb3QgJGFjRGlzcGxheSIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICAgIENhdGVnb3J5VHlwZU5hbWU6IFZBTElEIiAtRm9yZWdyb3VuZENvbG9yIEdyZWVuCiAgICAgICAgfQogICAgfQp9CgojIFNob3cgcmF3IG1hbmlmZXN0IGZvciBtYW51YWwgaW5zcGVjdGlvbgpXcml0ZS1Ib3N0ICJgbiAgLS0tIFJhdyBtYW5pZmVzdC5qc29uIC0tLSIgLUZvcmVncm91bmRDb2xvciBEYXJrR3JheQokbWFuaWZlc3RDb250ZW50IC1zcGxpdCAiYG4iIHwgRm9yRWFjaC1PYmplY3QgewogICAgV3JpdGUtSG9zdCAiICAkXyIgLUZvcmVncm91bmRDb2xvciBEYXJrR3JheQp9CldyaXRlLUhvc3QgIiAgLS0tIEVuZCBtYW5pZmVzdC5qc29uIC0tLSIgLUZvcmVncm91bmRDb2xvciBEYXJrR3JheQoKaWYgKCRtYW5pZmVzdEVycm9ycy5Db3VudCAtZ3QgMCkgewogICAgV3JpdGUtSG9zdCAiYG4gIE1BTklGRVNUIEVSUk9SUzoiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICBmb3JlYWNoICgkZXJyIGluICRtYW5pZmVzdEVycm9ycykgewogICAgICAgIFdyaXRlLUhvc3QgIiAgICBbRVJST1JdICRlcnIiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCiAgICB9Cn0KaWYgKCRtYW5pZmVzdFdhcm5pbmdzLkNvdW50IC1ndCAwKSB7CiAgICBmb3JlYWNoICgkd2FybiBpbiAkbWFuaWZlc3RXYXJuaW5ncykgewogICAgICAgIFdyaXRlLUhvc3QgIiAgICBbV0FSTl0gICR3YXJuIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgfQp9CmlmICgkbWFuaWZlc3RFcnJvcnMuQ291bnQgLWVxIDApIHsKICAgIFdyaXRlLUhvc3QgImBuICBBbGwgbWFuaWZlc3QgY2hlY2tzIFBBU1NFRCIgLUZvcmVncm91bmRDb2xvciBHcmVlbgp9IGVsc2UgewogICAgV3JpdGUtSG9zdCAiYG4gIE1hbmlmZXN0IGhhcyBlcnJvcnMgLSBVSUV4dGVuc2lvbnMgd2lsbCBOT1QgcmVuZGVyISIgLUZvcmVncm91bmRDb2xvciBSZWQKICAgIFdyaXRlLUhvc3QgIiAgRml4IHRoZSBlcnJvcnMgYWJvdmUgYmVmb3JlIGluc3RhbGxpbmcgdGhlIHBsdWdpbi4iIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkCn0KCiMgLS0tIFBhY2thZ2UgLS0tCldyaXRlLUhvc3QgImBuUGFja2FnaW5nIC5kaXNjb1BsdWdpbiBmaWxlLi4uIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwoKJGluY2x1ZGVGaWxlcyA9IEAoIiRQbHVnaW5OYW1lLmRsbCIsICIkUGx1Z2luTmFtZS5wZGIiLCAibWFuaWZlc3QuanNvbiIpCgppZiAoLW5vdCAkdmVyc2lvbikgewogICAgJHZlcnNpb24gPSBbU3lzdGVtLlJlZmxlY3Rpb24uQXNzZW1ibHlOYW1lXTo6R2V0QXNzZW1ibHlOYW1lKCRwbHVnaW5EbGwpLlZlcnNpb24KfQoKJHBhY2thZ2VOYW1lID0gIiRQbHVnaW5OYW1lLSQoJHZlcnNpb24uVG9TdHJpbmcoKSkuZGlzY29QbHVnaW4iCiRwYWNrYWdlUGF0aCA9IEpvaW4tUGF0aCAkUGx1Z2luRGlyICRwYWNrYWdlTmFtZQoKR2V0LUNoaWxkSXRlbSAkUGx1Z2luRGlyIC1GaWx0ZXIgIiouZGlzY29QbHVnaW4iIHwgUmVtb3ZlLUl0ZW0gLUZvcmNlCkdldC1DaGlsZEl0ZW0gJFBsdWdpbkRpciAtRmlsdGVyICIqLnppcCIgfCBXaGVyZS1PYmplY3QgeyAkXy5OYW1lIC1saWtlICIkUGx1Z2luTmFtZSoiIH0gfCBSZW1vdmUtSXRlbSAtRm9yY2UKCiR0ZW1wUGtnID0gSm9pbi1QYXRoICRlbnY6VEVNUCAiZGlzY29wbHVnaW5fJChbZ3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygnTicpKSIKTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkdGVtcFBrZyAtRm9yY2UgfCBPdXQtTnVsbAokbWlzc2luZ0ZpbGVzID0gQCgpCmZvcmVhY2ggKCRmIGluICRpbmNsdWRlRmlsZXMpIHsKICAgICRzcmMgPSBKb2luLVBhdGggJGJ1aWxkT3V0cHV0ICRmCiAgICBpZiAoVGVzdC1QYXRoICRzcmMpIHsKICAgICAgICBDb3B5LUl0ZW0gJHNyYyAkdGVtcFBrZyAtRm9yY2UKICAgIH0gZWxzZSB7CiAgICAgICAgJG1pc3NpbmdGaWxlcyArPSAkZgogICAgfQp9CgppZiAoJG1pc3NpbmdGaWxlcy5Db3VudCAtZ3QgMCkgewogICAgV3JpdGUtV2FybmluZyAiTWlzc2luZyBmaWxlcyBub3QgaW5jbHVkZWQgaW4gcGFja2FnZTogJCgkbWlzc2luZ0ZpbGVzIC1qb2luICcsICcpIgp9CgpXcml0ZS1Ib3N0ICJGaWxlcyBpbiBwYWNrYWdlOiIgLUZvcmVncm91bmRDb2xvciBHcmF5CkdldC1DaGlsZEl0ZW0gJHRlbXBQa2cgLUZpbGUgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAkc2l6ZSA9IFttYXRoXTo6Um91bmQoJF8uTGVuZ3RoIC8gMUtCLCAxKQogICAgV3JpdGUtSG9zdCAiICAkKCRfLk5hbWUpICgkc2l6ZSBLQikiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQp9CgokemlwUGF0aCA9IEpvaW4tUGF0aCAkUGx1Z2luRGlyICIkUGx1Z2luTmFtZS0kKCR2ZXJzaW9uLlRvU3RyaW5nKCkpLnppcCIKQ29tcHJlc3MtQXJjaGl2ZSAtUGF0aCAiJHRlbXBQa2dcKiIgLURlc3RpbmF0aW9uUGF0aCAkemlwUGF0aCAtRm9yY2UKUmVuYW1lLUl0ZW0gJHppcFBhdGggJHBhY2thZ2VOYW1lIC1Gb3JjZQpSZW1vdmUtSXRlbSAkdGVtcFBrZyAtUmVjdXJzZSAtRm9yY2UKCiMgLS0tIEZpbmFsIFBhY2thZ2UgVmVyaWZpY2F0aW9uIC0tLQpXcml0ZS1Ib3N0ICJgbi0tLSBQYWNrYWdlIFZlcmlmaWNhdGlvbiAtLS0iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CnRyeSB7CiAgICBBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtCiAgICAkemlwID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBGaWxlXTo6T3BlblJlYWQoJHBhY2thZ2VQYXRoKQogICAgJGVudHJpZXMgPSAkemlwLkVudHJpZXMgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSBOYW1lCiAgICAkemlwLkRpc3Bvc2UoKQoKICAgICRyZXF1aXJlZEVudHJpZXMgPSBAKCIkUGx1Z2luTmFtZS5kbGwiLCAibWFuaWZlc3QuanNvbiIpCiAgICBmb3JlYWNoICgkcmVxIGluICRyZXF1aXJlZEVudHJpZXMpIHsKICAgICAgICBpZiAoJGVudHJpZXMgLWNvbnRhaW5zICRyZXEpIHsKICAgICAgICAgICAgV3JpdGUtSG9zdCAiICBbT0tdICRyZXEiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBXcml0ZS1Ib3N0ICIgIFtNSVNTSU5HXSAkcmVxIiAtRm9yZWdyb3VuZENvbG9yIFJlZAogICAgICAgIH0KICAgIH0KICAgICMgU2hvdyBhbnkgZXh0cmFzCiAgICBmb3JlYWNoICgkZW50cnkgaW4gJGVudHJpZXMpIHsKICAgICAgICBpZiAoJGVudHJ5IC1ub3RpbiAkcmVxdWlyZWRFbnRyaWVzKSB7CiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiAgWytdICAkZW50cnkiIC1Gb3JlZ3JvdW5kQ29sb3IgR3JheQogICAgICAgIH0KICAgIH0KfSBjYXRjaCB7CiAgICBXcml0ZS1XYXJuaW5nICIgIENvdWxkIG5vdCB2ZXJpZnkgcGFja2FnZSBjb250ZW50czogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiCn0KCiRwYWNrYWdlU2l6ZSA9IFttYXRoXTo6Um91bmQoKEdldC1JdGVtICRwYWNrYWdlUGF0aCkuTGVuZ3RoIC8gMUtCLCAxKQpXcml0ZS1Ib3N0ICJgbj09PSBQYWNrYWdlIGNyZWF0ZWQ6ICRwYWNrYWdlUGF0aCAoJCgkcGFja2FnZVNpemUpIEtCKSA9PT0iIC1Gb3JlZ3JvdW5kQ29sb3IgR3JlZW4KV3JpdGUtSG9zdCAiSW1wb3J0IGludG8gRGlzY28gSUNUIHZpYTogQ29uZmlndXJhdGlvbiA+IFBsdWdpbnMgPiBJbnN0YWxsIFBsdWdpbiIgLUZvcmVncm91bmRDb2xvciBDeWFuCgojIC0tLSBTdW1tYXJ5IC0tLQokaGFzSXNzdWVzID0gKC1ub3QgJHJlZmxlY3Rpb25PaykgLW9yICgkbWFuaWZlc3RFcnJvcnMuQ291bnQgLWd0IDApCmlmICgkaGFzSXNzdWVzKSB7CiAgICBXcml0ZS1Ib3N0ICJgbj09PSBCVUlMRCBDT01QTEVURUQgV0lUSCBXQVJOSU5HUyA9PT0iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICBXcml0ZS1Ib3N0ICJSZXZpZXcgdGhlIGRpYWdub3N0aWNzIGFib3ZlIGJlZm9yZSBpbnN0YWxsaW5nLiIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKICAgIFdyaXRlLUhvc3QgIklmIFVJRXh0ZW5zaW9ucyBzdGlsbCBkb24ndCByZW5kZXIgYWZ0ZXIgaW5zdGFsbDoiIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICBXcml0ZS1Ib3N0ICIgIDEuIENoZWNrIERpc2NvIGxvZ3MgZm9yIGZlYXR1cmUgaW5pdGlhbGl6YXRpb24gbWVzc2FnZXMiIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICBXcml0ZS1Ib3N0ICIgIDIuIFZpZXcgcGFnZSBzb3VyY2UgYW5kIHNlYXJjaCBmb3IgJ2xheW91dF91aUV4dGVuc2lvbnMnIiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgV3JpdGUtSG9zdCAiICAgICAtIFByZXNlbnQgYnV0IGVtcHR5ID0gRXhlY3V0ZUFjdGlvbiByZXR1cm5lZCBOb3RoaW5nKCkvbnVsbCIgLUZvcmVncm91bmRDb2xvciBZZWxsb3cKICAgIFdyaXRlLUhvc3QgIiAgICAgLSBNaXNzaW5nIGVudGlyZWx5ICA9IEZlYXR1cmUgbm90IHJlZ2lzdGVyZWQgKFJlZ2lzdGVyKCkgbm90IGNhbGxlZCkiIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93CiAgICBXcml0ZS1Ib3N0ICIgIDMuIENoZWNrIHRoZSBpbnN0YWxsZWQgbWFuaWZlc3QgYXQ6IiAtRm9yZWdyb3VuZENvbG9yIFllbGxvdwogICAgV3JpdGUtSG9zdCAiICAgICBBcHBfRGF0YVxQbHVnaW5zXCRQbHVnaW5OYW1lXG1hbmlmZXN0Lmpzb24iIC1Gb3JlZ3JvdW5kQ29sb3IgWWVsbG93Cn0gZWxzZSB7CiAgICBXcml0ZS1Ib3N0ICJgbj09PSBCVUlMRCBDT01QTEVURUQgU1VDQ0VTU0ZVTExZID09PSIgLUZvcmVncm91bmRDb2xvciBHcmVlbgp9Cg==