Skip to content
This repository has been archived by the owner on Nov 27, 2023. It is now read-only.

feature(rest-dsl): Adding basic icon to REST DSL steps #681

Merged
merged 2 commits into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified api/src/main/resources/view-definition.zip
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
import io.kaoto.backend.model.parameter.StringParameter;
import io.kaoto.backend.model.step.Step;
import io.smallrye.common.constraint.NotNull;
import org.jboss.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
Expand All @@ -33,13 +35,15 @@ public class CamelRestDSLParseCatalog implements StepCatalogParser {
public static final String CAMEL_REST_DSL = Rest.CAMEL_REST_DSL;
public static final String CAMEL_REST_VERB = "CAMEL-REST-VERB";
public static final String CAMEL_REST_ENDPOINT = "CAMEL-REST-ENDPOINT";
protected static final String[] KINDS = {CAMEL_REST_DSL, CAMEL_REST_VERB, CAMEL_REST_ENDPOINT};
public static final String REST_DSL = "REST DSL";
protected static final String[] KINDS = {CAMEL_REST_DSL, CAMEL_REST_VERB, CAMEL_REST_ENDPOINT};
private static String ICON = null;
private Logger log = Logger.getLogger(CamelRestDSLParseCatalog.class);

@NotNull
private static Step getRestParentStep() {
var step = new Step(Rest.CAMEL_REST_DSL, "rest",
null, new LinkedList<>(), CAMEL_REST_DSL, Step.Type.START);
ICON, new LinkedList<>(), CAMEL_REST_DSL, Step.Type.START);
step.setMinBranches(1);
step.setMaxBranches(9);
step.setDescription("This step represents a REST API.");
Expand All @@ -61,7 +65,7 @@ private static Step getRestParentStep() {
@NotNull
private static Step getVerbStep(String verb) {
var step = new Step("camel-rest-verb-" + verb, verb,
null, new LinkedList<>(), CAMEL_REST_VERB, Step.Type.MIDDLE);
ICON, new LinkedList<>(), CAMEL_REST_VERB, Step.Type.MIDDLE);
step.setMinBranches(1);
step.setMaxBranches(-1);
step.setDescription("This step represents a " + verb.toUpperCase() + " HTTP endpoint in the REST API.");
Expand All @@ -70,6 +74,55 @@ private static Step getVerbStep(String verb) {
return step;
}

@NotNull
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seriously? You are moved down a couple of lines because of new code and suddenly you are all brand new?

private static Step getConsumesStep() {
var step = new Step(Rest.CAMEL_REST_CONSUMES, Rest.CONSUMES_LABEL,
ICON, new LinkedList<>(), CAMEL_REST_ENDPOINT, Step.Type.MIDDLE);

var parameters = new LinkedList<Parameter>();

var parameter = new StringParameter();
parameter.setId(Rest.CONSUMES_LABEL);
parameter.setDescription("What kind of Media Type this endpoint consumes.");
parameter.setTitle("Consumes Media Type");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.PRODUCES_LABEL);
parameter.setDescription("What kind of Media Type this endpoint produces.");
parameter.setTitle("Produces Media Type");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.ID_LABEL);
parameter.setDescription("Identifier of this endpoint.");
parameter.setTitle("Identifier");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.URI_LABEL);
parameter.setDescription("Uri path of this endpoint");
parameter.setTitle("Uri Path");
parameter.setDefaultValue("/");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.DESCRIPTION_LABEL);
parameter.setDescription("Description of the endpoint.");
parameter.setTitle("Description");
parameters.add(parameter);

var oparameter = new ObjectParameter();
oparameter.setId(Rest.PARAM_LABEL);
oparameter.setDescription("Parameters of the endpoint.");
oparameter.setTitle("Parameters");
parameters.add(oparameter);

step.setParameters(parameters);

return step;
}

@Override
public ParseCatalog<Step> getParser(String url) {
return new CamelRestDSLParser();
Expand Down Expand Up @@ -101,6 +154,14 @@ public boolean generatesKind(String kind) {
class CamelRestDSLParser implements ParseCatalog<Step> {
@Override
public CompletableFuture<List<Step>> parse() {
if (ICON == null) {
try {
ICON = new String(this.getClass().getResourceAsStream("base64icon.txt").readAllBytes());
} catch (IOException e) {
log.error("Couldn't load the icon file for REST DSL steps.");
}
}

List<Step> steps = new ArrayList<>();
steps.add(getRestParentStep());

Expand All @@ -122,53 +183,4 @@ public void setFileVisitor(ProcessFile<Step> fileVisitor) {
}

}

@NotNull
private static Step getConsumesStep() {
var step = new Step(Rest.CAMEL_REST_CONSUMES, Rest.CONSUMES_LABEL,
null, new LinkedList<>(), CAMEL_REST_ENDPOINT, Step.Type.MIDDLE);

var parameters = new LinkedList<Parameter>();

var parameter = new StringParameter();
parameter.setId(Rest.CONSUMES_LABEL);
parameter.setDescription("What kind of Media Type this endpoint consumes.");
parameter.setTitle("Consumes Media Type");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.PRODUCES_LABEL);
parameter.setDescription("What kind of Media Type this endpoint produces.");
parameter.setTitle("Produces Media Type");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.ID_LABEL);
parameter.setDescription("Identifier of this endpoint.");
parameter.setTitle("Identifier");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.URI_LABEL);
parameter.setDescription("Uri path of this endpoint");
parameter.setTitle("Uri Path");
parameter.setDefaultValue("/");
parameters.add(parameter);

parameter = new StringParameter();
parameter.setId(Rest.DESCRIPTION_LABEL);
parameter.setDescription("Description of the endpoint.");
parameter.setTitle("Description");
parameters.add(parameter);

var oparameter = new ObjectParameter();
oparameter.setId(Rest.PARAM_LABEL);
oparameter.setDescription("Parameters of the endpoint.");
oparameter.setTitle("Parameters");
parameters.add(oparameter);

step.setParameters(parameters);

return step;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
},
{
"pattern": "io/kaoto/backend/api/service/deployment/generator/camelroute/integration.json$"
},
{
"pattern": "io/kaoto/backend/metadata/parser/step/camelroute/base64icon.txt$"
}
]
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgdmVyc2lvbj0iMS4xIgogICB4PSIwcHgiCiAgIHk9IjBweCIKICAgdmlld0JveD0iMCAwIDIwMCAyMDAiCiAgIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMCAxMDAiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlkPSJzdmc1MSIKICAgc29kaXBvZGk6ZG9jbmFtZT0icmVzdC1hcGkuc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjIuMiAoYjBhODQ4NjU0MSwgMjAyMi0xMi0wMSkiCiAgIHdpZHRoPSIyMDAiCiAgIGhlaWdodD0iMjAwIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyI+PGRlZnMKICAgICBpZD0iZGVmczU1IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpZD0ibmFtZWR2aWV3NTMiCiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZWNoZWNrZXJib2FyZD0iMCIKICAgICBpbmtzY2FwZTpkZXNrY29sb3I9IiNkMWQxZDEiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjMuMzE2MzMwOCIKICAgICBpbmtzY2FwZTpjeD0iMTA2LjI5MjE3IgogICAgIGlua3NjYXBlOmN5PSIxMDIuNTIyOTQiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjEwMTEiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmc1MSIgLz48cGF0aAogICAgIGZpbGw9IiMwMDAwMDAiCiAgICAgZD0ibSAyMDAuMTk4MTQsNDUuMjE1MTY4IGMgLTAuMDA5LC0wLjA1MzgyIC0wLjAxOCwtMC4xMDc2MzggLTAuMDI3LC0wLjE2MTQ1NyAtMC4wNDI4LC0wLjIyMzI1IC0wLjA5MjMsLTAuNDQ0NTA2IC0wLjE2MjIxLC0wLjY2Mzc2OSAtMC4wMTM2LC0wLjA0Mzg1IC0wLjAyMjUsLTAuMDg3NyAtMC4wNDA1LC0wLjEyOTU2NCAtMC4wNzg4LC0wLjI0NTE3NyAtMC4xODAyMywtMC40OTAzNTIgLTAuMjk5NjQsLTAuNzI3NTU1IC0wLjAzMzgsLTAuMDUzODIgLTAuMDYwOCwtMC4xMDM2NTEgLTAuMDg3OSwtMC4xNTc0NyAtMC4wNjA4LC0wLjExNzYwNSAtMC4xMjYxNiwtMC4yMzUyMSAtMC4xOTM3NSwtMC4zNTA4MjEgLTAuMDQyOCwtMC4wNjM3OCAtMC4wOTIzLC0wLjEyMzU4NCAtMC4xMzk2OSwtMC4xODUzNzcgLTAuMDQyOCwtMC4wNjU3OCAtMC4wODc5LC0wLjEyOTU2NSAtMC4xMzUxOCwtMC4xOTUzNDMgLTAuMTQxOTMsLTAuMTk1MzQzIC0wLjI5OTY0LC0wLjM4NDcwNyAtMC40NjE4NSwtMC41NjIxMSAtMC4wMTgsLTAuMDE3OTQgLTAuMDM2LC0wLjAzNzg3IC0wLjA0NzMsLTAuMDU1OCAtMC4xOTM3NSwtMC4yMDUzMSAtMC40MDc3OSwtMC4zODg2OTQgLTAuNjIxODIsLTAuNTY4MDkgLTAuMDQ3MywtMC4wMzU4OCAtMC4wODc5LC0wLjA2Nzc4IC0wLjEzOTY4LC0wLjEwMTY1OSAtMC4xOTM3NiwtMC4xNDk0OTcgLTAuMzk0MjcsLTAuMjg5MDI4IC0wLjYwMTU0LC0wLjQxNDYwNSAtMC4wNDUxLC0wLjAyNzkxIC0wLjA4NzgsLTAuMDU1ODEgLTAuMTMyOTQsLTAuMDgxNzMgLTAuMjQ1NTYsLTAuMTQ1NTExIC0wLjUwNjkxLC0wLjI3NTA3NSAtMC43NzUwMSwtMC4zODg2OTQgLTAuMDE4LC0wLjAwOCAtMC4wMzE1LC0wLjAxOTkyIC0wLjA1MTksLTAuMDI3OTEgTCAxMDMuMDc5MjYsMC44MzIzNjY5IGMgLTEuOTE5NTQsLTAuODE1MjU5MzkgLTQuMTUyMjMzLC0wLjgxNTI1OTM5IC02LjA2OTUxMywwIEwgMy43OTMwMDExLDQwLjQ0MTIxNiBjIC0yLjQyODcwNDQsMS4wMzI1MjkgLTMuOTc0MjQzNzYsMy4yMDUyMjYgLTMuOTc0MjQzNzYsNS41ODkyMTEgViAxNDcuOTE5OTEgYyAwLDIuMjU0NDIgMS4zODEwNzIzNiw0LjMyOTQ1IDMuNjA5MjYyMjYsNS40MjM3NyBsIDkzLjIxNjc0NDQsNDUuNzMwMjYgYyAwLjAwMjMsMC4wMDIgMC4wMDY4LDAuMDA0IDAuMDA5MSwwLjAwNCAwLjI0NTU3NywwLjEyMzU5IDAuNTAyNDE2LDAuMjI3MjUgMC43NjYwMTcsMC4zMjI5MiAwLjA0NTA4LDAuMDE2IDAuMDg3NzksMC4wMjk5IDAuMTMyOTE3LDAuMDQxOSAwLjIwOTUzNCwwLjA2OTggMC40MjU4MjEsMC4xMzE1NSAwLjY0NjYwNSwwLjE4NzM3IDAuMDY5ODgsMC4wMTYgMC4xMzk2ODksMC4wMzM4IDAuMjA5NTI0LDAuMDQ1OSAwLjIwMDUyOCwwLjA0MzkgMC40MDU1NDQsMC4wNzU3IDAuNjEyODE0LDAuMTA1NjUgMC4wNjc2MiwwLjAxIDAuMTM3NDM1LDAuMDIxOSAwLjIwNzI4LDAuMDI5OSAwLjI2ODA5OCwwLjAyOTkgMC41Mzg0NjEsMC4wNDM5IDAuODE1NTY5LDAuMDQzOSAwLjI3NDg2LDAgMC41NDc0NywtMC4wMTk5IDAuODEzMzMsLTAuMDQzOSAwLjA2OTgsLTAuMDA4IDAuMTM5NjksLTAuMDE5OSAwLjIwNzI3LC0wLjAyOTkgMC4yMDcyNywtMC4wMjk5IDAuNDEyMjksLTAuMDU3NyAwLjYxMDU2LC0wLjEwNTY1IDAuMDY5OCwtMC4wMTYgMC4xNDQxOCwtMC4wMzM4IDAuMjE2MjgsLTAuMDQ1OSAwLjIxODU0LC0wLjA1MTkgMC40MzAzMiwtMC4xMTc2MSAwLjY0MjA5LC0wLjE4NzM3IDAuMDQ3MywtMC4wMTIgMC4wODc5LC0wLjAyNzkgMC4xMzUxOCwtMC4wNDE5IDAuMjU2ODUsLTAuMDk1NiAwLjUxNTkzLC0wLjIwMTMzIDAuNzY2MDIsLTAuMzIyOTIgMC4wMDQsMCAwLjAwOSwtMC4wMDIgMC4wMDksLTAuMDA0IGwgOTMuMjE2NzUsLTQ1LjczMDI2IGMgMi4yMjU5MywtMS4wOTQzMiAzLjYxMTUxLC0zLjE2OTM1IDMuNjExNTEsLTUuNDIzNzcgViA0Ni4wMzA0MjcgYyAwLC0wLjAwNCAwLC0wLjAwOCAwLC0wLjAxMzk1IC0wLjAwOSwtMC4yNjcxMDMgLTAuMDMzOCwtMC41MzQyMDUgLTAuMDc0NCwtMC44MDEzMDcgeiBNIDE4Ni4yNTksMTQ0LjI2NDIgMTA3LjA1MTI0LDE4My4xMjk1NSB2IC0yMS44NTI1MyBjIDAsLTMuNDI0NTEgLTMuMTQwNjQsLTYuMTk3MTggLTcuMDA4OTksLTYuMTk3MTggLTMuODY4MzU4LDAgLTcuMDA2NzQ4LDIuNzc2NjYgLTcuMDA2NzQ4LDYuMTk3MTggdiAyMS44NTI1MyBMIDEzLjgzMjI0OCwxNDQuMjY4MTkgViA1Ni4wOTA2MDkgYyA4LjMxNzk3NSwxLjI5MzY1IDE1Ljc3MzA2Miw0LjgzOTczIDIxLjUxMTM4Miw5LjkxODY1NiBsIDE0LjE0NDE2MiwxMy44MjM1MzEgYyAtMi4zNTY2MDgsMi42NDcxIC01LjM3MzMzOCw2LjM1ODYyNCAtNi4yMTM2OTcsOS4xNTMyMyAtMS45MTk1MzMsNi4zNjg1OTEgLTAuNzM0NDcsMTIuODIwODk0IDIuNzIxNTksMTguMTExMTE0IEwgOTIuNjg2MjksODMuMTU3NjE4IEMgODkuMjIxMjE4LDc3Ljg3NTM3NiA4My40ODI4OTcsNzMuNzU3MjIgNzYuMjgwMTQ1LDcyLjA2MDkyMiA3Mi4xMDMxMzIsNzEuMDc4MjI1IDY1LjcxMzcwMSw3MS43MDQxMjEgNjEuNzAzNDExLDcyLjQzNTY2MyBMIDYwLjYzMzI0OSw3My4wNDE2MjYgNDQuODQ4OTIyLDU3LjU5NTU1IEMgMzguODcxNzg2LDUyLjMwOTMxOSAzMS40OTU1NTMsNDguMjYyOTIzIDIzLjI2NTQ0NCw0NS45MjA3OTcgTCAxMDAuMDQyMjUsMTMuMjk2NDY3IDE3OC4wMDQxMSw0Ni40MjUxIDEyNy4yMDYzNCw3MS4zNDkzMTUgYyAtMy4zODM5NywxLjY2MDQxNyAtNC42MDczMyw1LjQzMzczMyAtMi43MjgzNSw4LjQyOTY2MiAxLjI3OTY5LDIuMDQxMTM4IDMuNjcwMDksMy4xOTUyNTkgNi4xMzQ4NCwzLjE5NTI1OSAxLjE0Njc2LDAgMi4zMTM4LC0wLjI1MTE1NiAzLjM4ODQ3LC0wLjc4MTM3NCBsIDUyLjI1MzIsLTI1LjYzMzgyOSB2IDM2Ljk4MTY4MSBoIC0wLjQyMzU2IGMgMCwyMC4zMzU2MzYgLTE4LjY5NTE2LDM2Ljg3NjAzNiAtNDEuNjc5OTksMzYuODc2MDM2IC04LjE3ODI5LDAgLTE1Ljc4MjA3LC0yLjEyMDg4IC0yMi4yMTY1NywtNS43MzQ3MyAwLjg3ODY3LC0yLjA0MTEyIDEuMzc2NTcsLTQuMjQ3NzIgMS4zNzY1NywtNi41NTk5MyAwLC01LjA5Mjg5IC0yLjMzMTgyLC05LjcwMTQgLTYuMDk4OCwtMTMuMDM4MTggbCAtNS4zMzczLDQuNzE4MTQgLTEwLjM1MDE2LC05LjE1MzIzIC0wLjAwNywwLjAwNiBjIC0xLjM1MTc4LC0xLjE5Nzk2MyAtMy41NDYxNzEsLTEuMTk3OTYzIC00LjkwMDIxMywwLjAwMiAtMS4zNTQwMzcsMS4xOTk5OCAtMS4zNTQwMzcsMy4xNDE0NSAwLDQuMzM3NDMgbCAxMC4zNDMzOTMsOS4xNTMyMiAtOC45ODI1OTksNy45NDUyOSAtMTAuNjUyMDU0LC05LjQyNDMyIC0wLjAwNjgsMC4wMDYgYyAtMS4zNTYyODksLTEuMTk5OTcgLTMuNTUwNjg1LC0xLjE5OTk3IC00LjkwMjQ2OCwwIC0xLjM1NDAzNywxLjE5OTk2IC0xLjM1NDAzNywzLjE0MTQzIDAsNC4zMzk0MSBsIDEwLjY1NDMwNyw5LjQyNjMxIC01LjMzNzI5MSw0LjcxODE0IGMgMy43NzU5ODIsMy4zMzY3NyA4Ljk4MjYwMiw1LjM5OTg1IDE0LjczODk0NSw1LjM5OTg1IDMuNzcxNDgsMCA3LjI5NTEzLC0wLjg5ODk5IDEwLjM1MDE1LC0yLjQ0Nzc4IDguOTI4NTMsNS40MTE4MiAxOS43MTM1Miw4LjU5NTExIDMxLjMyOTg0LDguNTk1MTEgMTYuODIyOTYsMCAzMS45MDY2MSwtNi42NTM2NCA0Mi4xMDU4MSwtMTcuMTM0NCB6IgogICAgIGlkPSJwYXRoNDkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDBmZjtmaWxsLW9wYWNpdHk6MC4xODQxMTk2MTtzdHJva2Utd2lkdGg6Mi4xMTkxNiIgLz48dGV4dAogICAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgICAgc3R5bGU9ImZvbnQtc2l6ZTo1Ni41MDQ4cHg7bGluZS1oZWlnaHQ6MS4yNTtmb250LWZhbWlseTonQmFuZ2xhIE1OJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidCYW5nbGEgTU4sIE5vcm1hbCc7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojMDAwMDgwO3N0cm9rZS13aWR0aDoyLjExODkyIgogICAgIHg9IjEwMC42ODQ1MSIKICAgICB5PSI3Ny44MjIzNSIKICAgICBpZD0idGV4dDIxOSIKICAgICB0cmFuc2Zvcm09InNjYWxlKDAuOTg5OTI4MjIsMS4wMTAxNzQzKSI+PHRzcGFuCiAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgeD0iMTAwLjY4NDUxIgogICAgICAgeT0iNzcuODIyMzUiCiAgICAgICBpZD0idHNwYW4yMjEiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpib2xkO2ZvbnQtc3RyZXRjaDpub3JtYWw7Zm9udC1zaXplOjU2LjUwNDhweDtmb250LWZhbWlseTonRGVqYVZ1IFNlcmlmJzstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidEZWphVnUgU2VyaWYgQm9sZCc7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1hbmNob3I6bWlkZGxlO2ZpbGw6IzAwMDA4MDtzdHJva2Utd2lkdGg6Mi4xMTg5MiI+UkVTVDwvdHNwYW4+PHRzcGFuCiAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgeD0iMTAwLjY4NDUxIgogICAgICAgeT0iMTU4Ljg2NzM0IgogICAgICAgc3R5bGU9ImZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTo1Ni41MDQ4cHg7Zm9udC1mYW1pbHk6J0RlamFWdSBTZXJpZic7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjonRGVqYVZ1IFNlcmlmIEJvbGQnO3RleHQtYWxpZ246Y2VudGVyO3RleHQtYW5jaG9yOm1pZGRsZTtmaWxsOiMwMDAwODA7c3Ryb2tlLXdpZHRoOjIuMTE4OTIiCiAgICAgICBpZD0idHNwYW4yNzUiPkFQSTwvdHNwYW4+PC90ZXh0PjxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTYyNDMiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48Y2M6bGljZW5zZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLyIgLz48L2NjOldvcms+PGNjOkxpY2Vuc2UKICAgICAgICAgcmRmOmFib3V0PSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvIj48Y2M6cGVybWl0cwogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjUmVwcm9kdWN0aW9uIiAvPjxjYzpwZXJtaXRzCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyNEaXN0cmlidXRpb24iIC8+PGNjOnBlcm1pdHMKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zI0Rlcml2YXRpdmVXb3JrcyIgLz48L2NjOkxpY2Vuc2U+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PC9zdmc+Cg==