From 16f13729771b6ff10935ebc404396b95387ce636 Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Thu, 4 Aug 2016 10:06:15 +0200 Subject: [PATCH 1/7] Initial proposal for artifact dependency declaration. --- .../EiffelArtifactCreatedEvent.md | 115 +++++++++++++++++- .../EiffelArtifactCreatedEvent/backend.json | 50 ++++++++ .../EiffelArtifactCreatedEvent/dependent.json | 50 ++++++++ .../EiffelArtifactCreatedEvent/interface.json | 53 ++++++++ 4 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 examples/events/EiffelArtifactCreatedEvent/backend.json create mode 100644 examples/events/EiffelArtifactCreatedEvent/dependent.json create mode 100644 examples/events/EiffelArtifactCreatedEvent/interface.json diff --git a/eiffel-vocabulary/EiffelArtifactCreatedEvent.md b/eiffel-vocabulary/EiffelArtifactCreatedEvent.md index 045734a0..253027d9 100644 --- a/eiffel-vocabulary/EiffelArtifactCreatedEvent.md +++ b/eiffel-vocabulary/EiffelArtifactCreatedEvent.md @@ -42,5 +42,118 @@ __Type:__ String __Required:__ No __Description:__ The command used to build the artifact within the identified environment. Used for reproducability purposes. +### data.buildDependencies +__Type:__ Object +__Required:__ No +__Description:__ Container object for any build dependency definitions. + +#### data.buildDependencies.requiresImplementation +__Type:__ String +__Required:__ No +__Legal values:__ NONE, ANY, EXACTLY_ONE, AT_LEAST_ONE +__Description:__ Defines whether this artifact requires an implementing artifact in build time. This is typically used for interfaces requiring some backend implementation, although the interface does not presume to define __which__ implementation. Implicitly interpreted as "ANY" if undefined. +NONE signifies that there SHALL no implementations of this artifact. In other words, a composition containing another artifact identifying it in __data.buildDependencies.implements__ would be illegal. +ANY signifies that there may or may not be implementations of this artifact. +EXACTLY_ONE signifies that a legal composition must contain one and only one implementation of this artifact. +AT_LEAST_ONE signifies that a legal composition must contain one or more implementations of this artifact. + +#### data.buildDependencies.implements +__Type:__ Object[] +__Required:__ No +__Description:__ An array of [GAVs](https://maven.apache.org/guides/mini/guide-naming-conventions.html) this artifact implements in build time. The typical use case of this is to identify interfaces implemented by this artifact. + +##### data.buildDependencies.implements.groupId +__Type:__ String +__Required:__ Yes +__Description:__ The groupId of the implemented artifact. + +##### data.buildDependencies.implements.artifactId +__Type:__ String +__Required:__ Yes +__Description:__ The artifactId of the implemented artifact. + +##### data.buildDependencies.implements.version +__Type:__ String +__Required:__ Yes +__Description:__ The version of the implemented artifact. Note that [version range notation](https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402) is supported. + +#### data.buildDependencies.dependsOn +__Type:__ Object[] +__Required:__ No +__Description:__ An array of [GAVs](https://maven.apache.org/guides/mini/guide-naming-conventions.html) this artifact depends on in build time. + +##### data.buildDependencies.dependsOn.groupId +__Type:__ String +__Required:__ Yes +__Description:__ The groupId of the dependency. + +##### data.buildDependencies.dependsOn.artifactId +__Type:__ String +__Required:__ Yes +__Description:__ The artifactId of the dependency. + +##### data.buildDependencies.dependsOn.version +__Type:__ String +__Required:__ Yes +__Description:__ The version of the dependency. Note that [version range notation](https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402) is supported. + +### data.runtimeDependencies +__Type:__ Object +__Required:__ No +__Description:__ Container object for any runtime dependency definitions. + +#### data.runtimeDependencies.requiresImplementation +__Type:__ String +__Required:__ No +__Legal values:__ NONE, ANY, EXACTLY_ONE, AT_LEAST_ONE +__Description:__ Defines whether this artifact requires an implementing artifact in runtime. This is typically used for interfaces requiring some backend implementation, although the interface does not presume to define __which__ implementation. Implicitly interpreted as "ANY" if undefined. +NONE signifies that there SHALL no implementations of this artifact. In other words, a composition containing another artifact identifying it in __data.runtimeDependencies.implements__ would be illegal. +ANY signifies that there may or may not be implementations of this artifact. +EXACTLY_ONE signifies that a legal composition must contain one and only one implementation of this artifact. +AT_LEAST_ONE signifies that a legal composition must contain one or more implementations of this artifact. + +#### data.runtimeDependencies.implements +__Type:__ Object[] +__Required:__ No +__Description:__ An array of [GAVs](https://maven.apache.org/guides/mini/guide-naming-conventions.html) this artifact implements in runtime. The typical use case of this is to identify interfaces implemented by this artifact. + +##### data.runtimeDependencies.implements.groupId +__Type:__ String +__Required:__ Yes +__Description:__ The groupId of the implemented artifact. + +##### data.runtimeDependencies.implements.artifactId +__Type:__ String +__Required:__ Yes +__Description:__ The artifactId of the implemented artifact. + +##### data.runtimeDependencies.implements.version +__Type:__ String +__Required:__ Yes +__Description:__ The version of the implemented artifact. Note that [version range notation](https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402) is supported. + +#### data.runtimeDependencies.dependsOn +__Type:__ Object[] +__Required:__ No +__Description:__ An array of [GAVs](https://maven.apache.org/guides/mini/guide-naming-conventions.html) this artifact depends on in runtime. + +##### data.runtimeDependencies.dependsOn.groupId +__Type:__ String +__Required:__ Yes +__Description:__ The groupId of the dependency. + +##### data.runtimeDependencies.dependsOn.artifactId +__Type:__ String +__Required:__ Yes +__Description:__ The artifactId of the dependency. + +##### data.runtimeDependencies.dependsOn.version +__Type:__ String +__Required:__ Yes +__Description:__ The version of the dependency. Note that [version range notation](https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN402) is supported. + ## Examples -* [Simple example](../examples/events/EiffelArtifactCreatedEvent/simple.json) \ No newline at end of file +* [Simple example](../examples/events/EiffelArtifactCreatedEvent/simple.json) +* [Interface example](../examples/events/EiffelArtifactCreatedEvent/interface.json) +* [Backend example](../examples/events/EiffelArtifactCreatedEvent/backend.json) +* [Dependent example](../examples/events/EiffelArtifactCreatedEvent/dependent.json) \ No newline at end of file diff --git a/examples/events/EiffelArtifactCreatedEvent/backend.json b/examples/events/EiffelArtifactCreatedEvent/backend.json new file mode 100644 index 00000000..85f5021f --- /dev/null +++ b/examples/events/EiffelArtifactCreatedEvent/backend.json @@ -0,0 +1,50 @@ +{ + "meta": { + "type": "EiffelArtifactCreatedEvent", + "version": "1.0", + "time": 1234567890, + "domainId": "example.domain", + "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" + }, + "data": { + "gav": { + "groupId": "com.mycompany.myproduct", + "artifactId": "my-dependent", + "version": "1.0.4" + }, + "fileInformation": [ + { + "classifier": "", + "extension": "jar" + } + ], + "buildCommand": "/my/build/command with arguments", + "runtimeDependencies": { + "dependsOn": [ + { + "groupId": "com.mycompany.myproduct", + "artifactId": "my-interface", + "version": "[1.0,2.0)" + } + ] + } + }, + "links": [ + { + "type": "CAUSE", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "PREVIOUS_VERSION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee2" + }, + { + "type": "COMPOSITION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "ENVIRONMENT", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee3" + } + ] +} diff --git a/examples/events/EiffelArtifactCreatedEvent/dependent.json b/examples/events/EiffelArtifactCreatedEvent/dependent.json new file mode 100644 index 00000000..a04641bf --- /dev/null +++ b/examples/events/EiffelArtifactCreatedEvent/dependent.json @@ -0,0 +1,50 @@ +{ + "meta": { + "type": "EiffelArtifactCreatedEvent", + "version": "1.0", + "time": 1234567890, + "domainId": "example.domain", + "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" + }, + "data": { + "gav": { + "groupId": "com.mycompany.myproduct", + "artifactId": "my-dependent", + "version": "1.0.4" + }, + "fileInformation": [ + { + "classifier": "", + "extension": "jar" + } + ], + "buildCommand": "/my/build/command with arguments", + "runtimeDependencies": { + "implements": [ + { + "groupId": "com.mycompany.myproduct", + "artifactId": "my-interface", + "version": "[1.0,2.0)" + } + ] + } + }, + "links": [ + { + "type": "CAUSE", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "PREVIOUS_VERSION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee2" + }, + { + "type": "COMPOSITION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "ENVIRONMENT", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee3" + } + ] +} diff --git a/examples/events/EiffelArtifactCreatedEvent/interface.json b/examples/events/EiffelArtifactCreatedEvent/interface.json new file mode 100644 index 00000000..3dff8f5e --- /dev/null +++ b/examples/events/EiffelArtifactCreatedEvent/interface.json @@ -0,0 +1,53 @@ +{ + "meta": { + "type": "EiffelArtifactCreatedEvent", + "version": "1.0", + "time": 1234567890, + "domainId": "example.domain", + "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" + }, + "data": { + "gav": { + "groupId": "com.mycompany.myproduct", + "artifactId": "my-interface", + "version": "1.0.4" + }, + "fileInformation": [ + { + "classifier": "", + "extension": "jar" + } + ], + "buildCommand": "/my/build/command with arguments", + "runtimeDependencies": { + "requiresImplementation": "AT_LEAST_ONE" + }, + "buildDependencies": { + "dependsOn": [ + { + "groupId": "com.mycompany.myproduct", + "artifactId": "common-definitions", + "version": "[1.5,)" + } + ] + } + }, + "links": [ + { + "type": "CAUSE", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "PREVIOUS_VERSION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee2" + }, + { + "type": "COMPOSITION", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee1" + }, + { + "type": "ENVIRONMENT", + "target": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee3" + } + ] +} From 51fd38fe692928acb02f4b0c086115341db05c48 Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Thu, 4 Aug 2016 10:11:06 +0200 Subject: [PATCH 2/7] Fixed typo. --- examples/events/EiffelArtifactCreatedEvent/backend.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/events/EiffelArtifactCreatedEvent/backend.json b/examples/events/EiffelArtifactCreatedEvent/backend.json index 85f5021f..1bda99d1 100644 --- a/examples/events/EiffelArtifactCreatedEvent/backend.json +++ b/examples/events/EiffelArtifactCreatedEvent/backend.json @@ -9,7 +9,7 @@ "data": { "gav": { "groupId": "com.mycompany.myproduct", - "artifactId": "my-dependent", + "artifactId": "my-backend", "version": "1.0.4" }, "fileInformation": [ @@ -20,7 +20,7 @@ ], "buildCommand": "/my/build/command with arguments", "runtimeDependencies": { - "dependsOn": [ + "implements": [ { "groupId": "com.mycompany.myproduct", "artifactId": "my-interface", From cbab7e0ad017aa105ffe617e4b7ff4f825b5e568 Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Thu, 4 Aug 2016 11:31:17 +0200 Subject: [PATCH 3/7] Simplified dependency syntax, added documentation Added documentation describing the dependency syntax. Also removed buildDependencies and runtimeDependencies, for the reasons described in the documentation. --- README.md | 1 + ...tion-backend-implementation-example.gliffy | 1 + ...osition-backend-implementation-example.png | Bin 0 -> 50338 bytes ...omposition-build-dependency-example.gliffy | 1 + .../composition-build-dependency-example.png | Bin 0 -> 38598 bytes .../compositions-and-validity-checking.md | 28 ++++++ .../EiffelArtifactCreatedEvent.md | 86 +++--------------- .../EiffelArtifactCreatedEvent/backend.json | 16 ++-- .../EiffelArtifactCreatedEvent/dependent.json | 16 ++-- .../EiffelArtifactCreatedEvent/interface.json | 13 +-- 10 files changed, 59 insertions(+), 103 deletions(-) create mode 100644 eiffel-syntax-and-usage/composition-backend-implementation-example.gliffy create mode 100644 eiffel-syntax-and-usage/composition-backend-implementation-example.png create mode 100644 eiffel-syntax-and-usage/composition-build-dependency-example.gliffy create mode 100644 eiffel-syntax-and-usage/composition-build-dependency-example.png create mode 100644 eiffel-syntax-and-usage/compositions-and-validity-checking.md diff --git a/README.md b/README.md index 74871051..16d1e71c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ __IMPORTANT NOTICE:__ The contents of this repository currectly reflect a __DRAF 1. [Event Structure](./eiffel-syntax-and-usage/event-structure.md) 1. [The Meta Object](./eiffel-syntax-and-usage/the-meta-object.md) 1. [The Links Object](./eiffel-syntax-and-usage/the-links-object.md) + 1. [Compositions and Validity Checking](./eiffel-syntax-and-usage/compositions-and-validity-checking.md) 1. The Eiffel Vocabulary 1. [EiffelActivityTriggeredEvent](./eiffel-vocabulary/EiffelActivityTriggeredEvent.md) 1. [EiffelActivityCanceledEvent](./eiffel-vocabulary/EiffelActivityCanceledEvent.md) diff --git a/eiffel-syntax-and-usage/composition-backend-implementation-example.gliffy b/eiffel-syntax-and-usage/composition-backend-implementation-example.gliffy new file mode 100644 index 00000000..aa273029 --- /dev/null +++ b/eiffel-syntax-and-usage/composition-backend-implementation-example.gliffy @@ -0,0 +1 @@ +{"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":786.5,"y":592.5,"rotation":0,"id":662,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":12,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-701.5,-338],[-701.5,-568],[-589.5,-568],[-589.5,-528]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":710,"px":0.5,"py":0}}},"linkMap":[]},{"x":280,"y":436.5,"rotation":0,"id":699,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":80,"lockAspectRatio":false,"lockShape":false,"order":19,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:i:2.0.0\n

\n

requiresImplementation\n

AT_LEAST_ONE

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":349,"y":384.5,"rotation":0,"id":697,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":17,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":698,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

I2

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":88,"y":436.5,"rotation":0,"id":629,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":80,"lockAspectRatio":false,"lockShape":false,"order":16,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:i:1.0.0\n

\n

requiresImplementation\n

AT_LEAST_ONE

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":633,"y":555.5,"rotation":0,"id":664,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":13,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-131,-251],[-131,-211],[-451,-211],[-451,-171]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":627,"px":0.5,"py":0}}},"linkMap":[]},{"x":157,"y":384.5,"rotation":0,"id":627,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":10,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":628,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

I1

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":700,"y":155.5,"rotation":0,"id":413,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":9,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-223,124],[-345.33333333333337,124],[-467.6666666666667,124],[-590,124]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":281,"px":1,"py":0.5}}},"linkMap":[]},{"x":409,"y":306.5,"rotation":0,"id":411,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":16,"lockAspectRatio":false,"lockShape":false,"order":8,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CompositionDefined

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":477,"y":254.5,"rotation":0,"id":409,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":6,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":410,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CDef\n

C2

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":613,"y":535.5,"rotation":0,"id":400,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":5,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-528,-231],[-528,-191],[-431,-191],[-431,-151]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":627,"px":0.5,"py":0}}},"linkMap":[]},{"x":-10,"y":304.5,"rotation":0,"id":283,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":16,"lockAspectRatio":false,"lockShape":false,"order":4,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CompositionDefined

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":60,"y":254.5,"rotation":0,"id":281,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":2,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":282,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CDef\n

C1

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":796.5,"y":587.5,"rotation":0,"id":716,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":23,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-711.5,-333],[-711.5,-498],[-624.5,-498]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":710,"px":0,"py":0.5}}},"linkMap":[]},{"x":623,"y":545.5,"rotation":0,"id":718,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-538,-241],[-538,-201],[-249,-201],[-249,-161]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":697,"px":0.5,"py":0}}},"linkMap":[]},{"x":347,"y":104.5,"rotation":0,"id":721,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":25,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":722,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

B

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":287,"y":154.5,"rotation":0,"id":723,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":80,"lockAspectRatio":false,"lockShape":false,"order":27,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:b:1.0.0\n

\n

implements\n

com.example:i:[1.0.0,3.0.0)

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":643,"y":565.5,"rotation":0,"id":725,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":28,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-141,-311],[-141,-436],[-246,-436]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":721,"px":1,"py":0.5}}},"linkMap":[]},{"x":653,"y":575.5,"rotation":0,"id":726,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":29,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-151,-321],[-151,-486],[-431,-486]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":710,"px":1,"py":0.5}}},"linkMap":[]},{"x":663,"y":585.5,"rotation":0,"id":728,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":30,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-161,-331],[-161,-561],[-466,-561],[-466,-521]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":710,"px":0.5,"py":0}}},"linkMap":[]},{"x":172,"y":64.5,"rotation":0,"id":710,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":20,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":711,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

A

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":112,"y":114.5,"rotation":0,"id":712,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":80,"lockAspectRatio":false,"lockShape":false,"order":22,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:a:1.0.0\n

\n

implements\n

com.example:i:[1.0.0,2.0.0)

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":714.5,"y":247.5,"rotation":0,"id":666,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":14,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":667,"uid":null,"width":141,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

PREVIOUS_VERSION

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":712,"y":173,"rotation":0,"id":165,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":166,"uid":null,"width":66,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

ELEMENT

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]}],"background":"#FFFFFF","width":700,"height":518.5,"maxWidth":5000,"maxHeight":5000,"nodeIndex":732,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#d5a6bd","stroke":"#333333","strokeWidth":2}},"lineStyles":{"global":{"stroke":"#cc0000","dashStyle":"1.0,1.0","endArrow":17}},"textStyles":{},"themeData":null}} \ No newline at end of file diff --git a/eiffel-syntax-and-usage/composition-backend-implementation-example.png b/eiffel-syntax-and-usage/composition-backend-implementation-example.png new file mode 100644 index 0000000000000000000000000000000000000000..320c247385834fb72cd3fc03bd4da227ea6cb085 GIT binary patch literal 50338 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�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 ?@Za&*0G@J>Nd1?|LM@B^zH3u-rpcs zlvL8drX9Y7P%k-*Uvvm$Ne-;6H+N2EzFzIb~yV_@)kTW1ZY zis*V&0M7v{NRmgzOU*O2w%y4IuOXqc> zke4g1yiH3sF68i-m4c-=0DU5{X9tYJt^g~7`5h9VkTd2n>9YW`_VI0{fwOZQIO?V7LD6FvXH-XQpn(k+lQ6NF9ki03-h4? zefM~)*4;uRK92RRz4c#~QacIo1D{fH>5W1N1j%6|I@6{z$+pLRwtZWhVNZPDJUUN# zetGivs3Ed){KpWeK@+JKQ{PkiT-^=fUP5`^DR=%*`WQ5&<%iiM@7KLzXx$#bNeMfTiPChx1MxHYL3@g0T@d`{KAQ}*U}1KzI) z7pq&E+8PP*a=GIZ(|5!WMan0{&q-H^p=2PDX!y9%M|6jNeyRA?A0LLhI>Q;X`@D{X zifsybXAA3AcIsniJ2gW$)2dtN%v&n-+Rcp8k6uR$uLO6_n0&UTzIf#t9|ie+rM;x+ zYmK>smBw!MFI_Yz_6;u%1qQU45pudUZW@EGAVh7~y7*f9i5uyvU4BPGiExtKyhc%j zo8W+<6kKm3u+2P73HL+OtB9s!UuKVl*c4tRklNk9GV9R@8a z){%LdE0&*_d$-p?%hR+d2$@4z9c7@+c#U3z{p;RH5_-USdR@e6!!VM@qj5AcBN&>j5^C>uWrk{Q?fBMHz@)QX6S^1dUiY-( z=#&H{YNjAbtPb}NV{5CC^_gx2?XD!RfV4qK7w_`xo4xua)vM-deJ?qW9yas+sp*R| zDRsCS`|1NKY+FtLxai34?)GVby|{z(@@EB?#Ej2yRTui??HiBu%F1W=6_wAR`r-lp zz{A2LR)}vqs0J4T0_agdE!T+SGVQHSGePN#qJI_udO-PL9E!3zuL4s$k8kdm$X4@O zVj)p`v6tZzB}}LimJ@}s3V*^gUP*wile8dL8v~IT@+{Pqkk@xP5PJ71Fii>MslTr7 zKZYtm$`j<1`fi2#xRW6M&lbCM+7qF?_pN;dF31HC@`TYga^~3juJsJJMI{9#&A2DP z@S4kIka_k5_E1!`3khqqy3)Ky#j6=22(sVFcipL6d)LqXtV}?Y>*2f_ro1}aE8(vA z*1TAe6VIwbt#nlfYd6!Xa{OU=9rRQ`6zi#UJfuP?8X#t`h?fI;s7Db_2#U)t8@(NY zDR00y)8Qg?E+f9AI5O^dtMx29*UG;XO}foZzklhObKQ#wp&p630LJrKK++0Ygq=1b z(C5ES&#HXfH;{nt3Rku_bOExcBkKwn%O+BhBLWib_`Mv3t5J+Ph~ zpNxtO<;$hfJb(T?5nb?C0MRF!SH@4!hGX8{MmaLyq%MRtysYm$I?(=ZPE-!{Cnsh4 zGss*Hzb_`%=_?6NG!Fe_PfP>>CNNW(?Sq*(0`m=gU;V*-)dzT32rV8bW-bdYDfs`~ zHq-c+Vl<0cnX4B9j>c#feM7N<;*gz+hAi zXs_ThJQYwk;gZ?ks}{E4cAzT>5i2D^J)9B@8uBm&oAI~djCs(>4Dc~Mpy}(JozW(v zQeIyu8w~&9DVolF}};jXG0r{Ot9MKMRdc>tIKcs3oE#6PVN{ zqypqpIb(q{&2u8LBz$Ejyky7Pz@X+stPxW0)>xhsY|KO}sgqAjUH~P-AC8wh|F!z< zeQ0kbBxC^bPXnIdxIMvm`Da{#mVtqeHa+JfZ@2C5A4SxqRPlR56^30C`K@qw9iY#l zN1OjuvH^%sjsD?E@*?0qhg1}V@{oPDCyIn@$H&>yEMhumG4t-X!P51G*GjePfz!Q@ z@1&gduf3q4_y6xw$u?K>fY0?=0)3XZaxf;*H{=~~*UuD^&bNIESd2j#)|OmB2=3C7 z_etb%rjSmHIzXENn%x%f!E(eK_+GxdB|E)7-JxF}Oi;NO@xG|Ix(~)8S?j_PiO&@B zk_N~lftSZRI|JMyD&ht_R_YqmN`r?Cn+uw13{T~7sqi9~e zQbaq%CgU$$QaaoJy;G4zD;@8i%lhGdd$L4+&u{@~opIoT;UF-Jz5ov5`0%H!W2@H3 zx8S}qK4D3$e+XE0A!OJl`@hbPcXE4I2u{NPrdV{6N4&yxPxSh;NmYo`VY%Z_hcoH_ zfK@p+6u-VeA?pdMMksWy)~ZCM!}EN<)LOK=vjnqpAzzNo9~;i^IqxE6e49; zuK*-s1g?x`RkBl}Tk$49U?eN0SMt?=QBLyycRA;WVY7YbRjVEdaQ*SZt*z zB<)4_Rjh!5o7?jx4IT{4$yevW;BIT*=UT~j6|i%eaZdI?>HEte2+KYQiEak^fHbE@ znXcBdPw;XYpHn`6=NxYKA?oyZEtSY_{h#~l=k}CVd<=3=de`Vf^i(R|cS0e7I;@49Ri4{uAsS6Z937X z{|Ur)NdbHBIL*98d*pl2=1+`M?z**8i8UN?h2{7>v}?PqgR{CBD_fgR9aF8hUQcgt zSHf8*goBp+?)45;QFulh48`wU%^x1HOmGQ2@oEjWA#GL7e)CYpJMxHcrO43`l~1shbeA7Y41m@LPSSd0{aRy#xL&BD5;vM!j!3 z8YO^6u*QQ_Fcd{5U~+$VTV*rPU8Gi$h#v!F1ob|9f#c3O3>Z-Im=9icau1`L8&^NS z!oqXWmNFYFU*_h*>F%6*|rCm2<{pz@n__4Mr&P3cras$jNB*!8|>} z4%)NlMEVrhA6W-j+isM}y>{8k133iMLTQ8P^L%fwm{buBqHurhqniiDP^uz144-8a zqvnZzcLqsfQgOGZwItG`>}m@jy`dOrp-?D+HygWZ*TS59StpV6GHr|VR-E?1kxh4x z=SNh1;9Q!c*|F|=X`Kmp)8B;AmIv|22t|C~o z;Qnceu8xk5XxZQr-#H9(jk9Gk3Dhu~VEkaqhI4X&sF>3uZ!vqdx!+d6XPL2#RrlBr zVykY5LT-&}_1(t(^D4nX-3m??Qej9IAnxTVnr7V=h{Ca<)(gqJJJrAjOTSw|fylFV zf!QmE*ZCeu-q#C~HFMyPI()59Pa0(59`6T=o6$g@6z!Qh_U4|KeaRa;aqTWrpIdD*B=qRbJ{{j1mr zzT+lYpqUF-Y8JuEiauu*?8D8vh;Sjqz?u_xB?;t#wtT!rcenh)W2av``&2;`H$Ujq zVuq~~OE*XY>V=|j-F$#f$naj8H;1C17ip9|)3PHivcamk{%6@NDa@>Ig`s!$y-}#U zj>BFkYhX)>@H~dO!Ys6xf&_k*&ZV~U8TkheFM;8<>bsJGXXXlpJx*BgoQq~Mm=si9 z(%gm?7&+>R0S0vFtRQD&U84&vDMzTT^6vLQ2~zzf66vi~3K zy=7FF-L^L@hzQc4(hVX?cXuhRAR;Lsf2B)8TDn1yk`xsMB}7V6T4@9U=|*Xgu6JJG zK6{^i&a=n+;raNC;kbw1aK(yitvTl}Rv?!G8`EM2pY5oAqoDc=0o6ls^)#`YS~6E* zXH#h0iXh`=aQ2I~7M(wPf#y5I{&_&P`wAt`FjsHa!G;@W>=Q(N&Mo6UulLcx&Dx6J z*`7uz(1(?gstNGE{NKCXR+p7I>IMx5q~#{xofB_*3=hiJou6DwiJ0-Z`%Cg@M;168*)}Hjrr0#WNzU4Bk&WTa zgI@THyFa&>t0hpdX-AfhQaS_eQCkhC!QC_+8@i%z{A@m0f$(CN7|pl*3KiYN#G`oI zeuEGXN-)|idGxB6tF4Gop{{%lBIL9hJ6w%Z=3>7C?Y;!jOuk%fd|E_R6v$p=?H5Sy zKF{e)%}AR^@55u>wxfivKYYWqjnIrxddto8L#BEzgn~Chq#TGk%>7d}&&yD}Fs(U0 za(_(nu;EMcrH(}J;fsv8XUNS9xJkUn+;+GuQ_SCdsA)=+cWd=6zNa*;Car1h`H;gP5r2NDH>HYbi&q2g+IVZE@zTX`>9M?S{CbI@pBo9?xDBY=ZkJ#`UA zqTP4?d|iBjFk#STdJhbDti=G%G<^DY>fciv-e3{-4b7iK!5XJ}0T&gP^w`3jZ5eBB zXNO_2PCI>~#R27*!7i#udEH*tFZ*e*W78}|*u2*nh!%i5es(OzuB1IGi~w(V)3oTE z*U#m;sPJ&D!e;{ytfwa$rkq_<>;*#!D5va&{d0>_iWLlstQq_BDz;K)Y6G^>qL%HS z>Oq3=-dFWx5R)P5H=PK-AzyZ;fmMcL+*sQFxpuuXx3MXgKg|~QxO?ru)c93W?w%?7 zG+OnGM5DgZ7>d8eMDfX?i! z`rQda9>N>BD?2PkiPq#LaSU~%7>Hpcj2-2O#{*k{*tuC5Kr?)X8A1}>V^xP8+dTD@Fm*_mY5be_cqAE3bOTXC73 z0~enXn4L(3p^7=T6TrJ;oW)kRPiH~NZ}AFWHe{uMprMt*9RuEvBJBc0Wd;cR3voJL z$ch|8 zpJFpNg({G@7LYIojn8%X(6fGCM2|X8Ga@W{b1+#qQycjEMoi-?b%UfyMe1L}&X@vB zC5S9{0&glWbr61a#SIj7joXpoUrmP2fGt1e&1{~yPTgQUmq}hBD{&Ow#AD+VUB?Af z9vX20B0E;7MpAK$iyf<1DJfS8X#?+aSy9z8iVW$07UCGxjnr*OEhovb-(EH-T@ohl zP{1FC3?tWIV4yEzjn0lA|NPkOCdfE3%t(J0a;a9QJV6f0Ft5+kHZjP083~2DF}=1m_?x5_%>b|oADH$O`68y zhIRdZh@Xnx#?*}?oBjKut#c8t4hK}Dz8@ESX+D9B?kkFmDY;S$dR;Bqtr%H)(NQ_O z_2NnRcCvkJsD5FI@ONr!^g5a|ZD)B#$6d@KLOQ2B4tDIB<6`dcC`M9+Hs%>r(0tW5 zEpREVCScdj{|x38m#UfExJTW0f}C=9{$O(YJmPIaghu`n0F5Rx%g~%7jEq zv+;(vYTWGV4ocd%Pwq_`MPtpJ4gRjq+)jFK0vaO8@2+nLqlVcj1 zouD#|ENpepfT+g^N&X$qi8a1ie3PGEe(x(bV|R$7mLvj-YT91y+5y{q5`0fpIF!vnzoKKTCwx zL(?R^4MVo0qY0UJqPt&1Mh)4wcJ7^bS;ejK>RU!G zLgA%I-;?@>4F^Pt3(YaO-wdjVy95+eZ1QuI%JIubIli1! zk86U8&t*~gCP)94#~w0857Z6nO4#C(oTrmA1}_;oUjJaa>9dMWCcKu(e2;oF1tDA2 zsUv6jDKxGaWVgkXUw-(ffh7fRXrPzWh?^0hi7FpO%KPkFG}bN)mijg!7T_1AxyEvH zD$q`$<@WM$Imv5+ukVn8X_4w*1YQ9>QZDZPsMXuR!SC0AV6y5V0+ZWo{1dy`6KN`e zNG)1!6MvB;E0BY%BQ(tEud#ia6<4un2a8Zq&2_puhK`DLZ$@Ji^o<&LNd3e$ZU25 zFtbzcBDDaLFL6nnw(4T$CA<8j9Qto*_9+{6*89_h9TggPIY1^ALhLF$28D9PI*M?w zg|_T4feAq!{dYWJ_kJwZWTO3g7JYCbYvHZeH?PT= zu1z*REx^N?hTJ3v&kwfnccB4+SV3h9i5LRonJddrQXbFn3-aiZS=PB8lL>z>ykQ4) zRf`14$;Kr?)z8;ch(4mLi`iVIJFw>~LU`k?BaAys7?gY3`wwx<5TAVDoIUbq+xdF1_^CAjX=>$jA`-HD7Sw4xF8?sZ!qDm~Geg z;1wW%lD$rdow|QfWaVsRPxoV>^g+>z(a2*hfQ~xV`llpp`-}3WOYI?9d(g95h9H;S zSDmr-S}N|36Qp&Vwed7q_}0G&74x6rOe)@yG~ziFb$B8&74JD*YbK&O{ezfF!GOrV z$x~N|H^_Qzz@rl8)@|0B)v_Uh&i7SP4)N}S)l?-rlldB%GE@`ON<#a$j_xVm$HgML zTVj<|-|n{7* ze1@%BQSsB!fujmV z@%-%mnQ^)_;0R`mb(WkPt7)>Mu2!E=h{4Vhg9;+JN0BH5&*d zm3K)|&}aGO->NJtoZjR1*$L8qsMzGjXRKEQsJVBoeJ#Yi_i=yq;2!uQ9&o*UX9m7i z!h>p_DZa8orrso5%S=vd+XZ-V@9W=m0(czpQ{37bd$Q~)D zVcgczkTMjRwbJx;Xs}(DUVK<#y9{)MIG`itL+|fz{&~VD<1H!RU(d+sOiF)= zdaHhb6xNb1RRsYLZ6VVOiS^Deo#ZL#sEHYJk_bNxo% z2GAiaIHVlm;(>!7eXnrW2ggzhJG>G}BQICfMV|K87w=Kp8FhTV&QShTxZUhJ*!aL7 zB^78+$PLNePZ9dvI|;*)Lru86xq(fO)lRo5@UuFDU53mJYqLrpj9~^~UtZ>zd;VX5 z2i&9-dc7hdoHW`;58iB~P982LRYmL*&tN}9Xhh^!+hcsF5#&MnDa|QXfk@hGt>M`= zj8o^B#sLpRmD+Vr{Vx}S3+ImyXkhbcs@!^tfaD?1GjE_^8pnhGUzLe+VMpR~n8e7> z#|4mk#jK$d+l9fRq*s=r^Iy;oJarhceHP#`ltQ%%?%4~!psN=m6CLPMXy^~w-E6-NyXRqyU^!n!31W3=vcT zku9dgdgvy^0cMK>h3i1JR|XBM*`N7tgxvk5_^naCq4+LHY9BxbwEpEh?NxOfKpFZL zN=6r5tET!1^#&43CMt_XFi1agm zDfCWZ7g=9om^(Rrs@z|$aM+ktMT+pmtsv$lado>>~HD2)S>)aa81_Dg!%yzh&s}(1oe}jm zid%{ga0&YN``as=p#Fajt|Z@p#R!Hi%si+LswOE*!?}wc$-X^Q*aJw9moXu^5+Jmz zXVD{}@cV(^@`qNIpOjh*Lx2ZJXnxNDOW*;-GCcN^av@L-U_j*i>(Ix!dn{@x8Z@X% z{LVc36ncI7Y8KVxSCHe*b*Ae)mX(n)SxC0t2R4PxkRIS;i09=dUZa4PDa;cdi{7g< zc%2EH>9lR{SMZ_pT;>ABHwcgkHy86?oj0x|G-Pwp-!71p44v#8y5pCp=L+k{GbtdX ziYI2i`L=(mC}{P3u+=^~0hbKZ`fU4t%N2Q)HRu9|t=&8Pd3mhHXN@5kxmDxk*@w7l zA{?*-<9JU?EC7D_X%{1oPi9^AKW811S+8eE`)S?vpRfQv$W_^50>&R&yn4UG<`}3A-gOzcNBTR0I&7wq)F=*;^434UzH8$OG;IKIk+ZXa zO>#vEnto{f#uJ6~7BA^yi1$fqoBz+=qOK#S#P;5uAr^e$d@g3g zW%fMYM;`L{Y5Kvxq1rBai!@&pr%$RZsA3BWr+LSSHOXFOl*FDAFd!%?D?G<*(JqaJ z4?qrXnX4MZwg(vSg6R!qrtx4{yP6&&{0TRLcYlXKY5BRu-7YhCGI~^3+E*s-xMr68gPbXxiLsKcw_7f#32D!an|t|7hK*x8})a4x%yxboI5`ZMnS)_{$B5tcwR+ zejL9Lw9UEbqePM@>SFVKBDC5&9?=3KbzGHV{axG z#4lQPBtw0Lf1E(VpeI+u4!f zfF`+JqrT+6zslx3-zD93xuFLNL^DO560zW5geD&)m0C$rn zMCYaZ=HaiQoc{an5_~dm>*ekCXyo2jK?=13VxsG6LjD*mBtH%HfX*wF4|S{;0@k-2 z&)g3kQ;eXvly4{Dbx=n9jc^nZ22eRK{d|ofs78dLI5c_VkVgE;+wVj;m)YK`Oc;}5 z-KF|$VkB0$l51 z+q9`>3FUxE91mK$>$bn(Z*k*I_Pr1*Yd$`Yhj48#iUHTw2;tgB)}N4V6NRWbVFwy~ z8g%LYxl^)jLC_vTw)L;853R1{XbMbsrDhPPkrvW-&sq6ZWJ#1;j#+u8B)d*FUvweo*k03UuYK!&pu9{JVY4ye?sn6w5;Pr%7=pCb^L6SQhnbnnr&qv?_qt z0I<7Yw`>*lDl$CWDcANbLCl4f9HOUZG6SnKR)9TgLZ7!J{(0-LWGSPfZm{f!ifapK zjZLC{3hYpfIu2V61bWxzRcuC7kI$ap2p4`hT3J46hV^);@H5i7_m_ri+aMW!`t&LB zW)%$j+nqsI9y)|b`s{DmNf@(Ib8P5!w2KO=`_XM#@{$c<*%;of-^T)T0#1y_9y0A` z2r_XBEsVzBDa;4aM?-SS3V7(PG&9#v5oHF!!mcO)kTWq3Ayj$=L6!wupk2x450M4R z-;9e5cdUM1=zqqn+!T4qWK^Z59cz5YB*p#%CpOBI&Gi}=tk{i|>LiP{fo&J=*QX8c zVWCM|@z<$C2oe8w#Q@yi8#|j~5p&&$*ndn@ptd%wimWS8#`>+E!Lq_aVeunHCPp?k zl?V5fK)>9ZZ)6nUE+r%@2NFNRmetR)ZIqc5gdKT%sTwqMJ2KRCJVZSvoIE2RR_0X^ zW=t_X(Z>CiZf7K^>ZqK@K2(4p@!_NuXZgu?J@t3>I`DR%L!;4ND_%=T?s`r6gh-kQ z;}tfB>?I;x12kzg)=Wm~XJ<0c$t2|YDBXUQL%Vw37b`fJ?^p26l`4|o+bLi0Kx4Nu zySzM7wc<%bLnrDo+qRO@?zz2~M1H0an-qu4U73He{dZG*DlQJrZ72`kBGk*K5^+*u z7l;$F8pKzv&PzCF0;H{aU}^WgECvU^+@V(OU5ll$(XBS2 zjs8p6i9xW7L{>wnPjsb%0qsSj?@HxHB(W00eAE2_$oD|8P?zR})gZI%Wy)_RytK5m z+Oic7yI($(W(y;31@YufzE^kdeG`zQqZM=2c&^=+B7D0~rd8*NA@6miDd2tIoRtFy z(s+oKA1MMbA16f0%@KC?feX<>Kr~N36g}S+PJSHvSP{Tno1#0#HgnA+-6OGptspK{ zVOsX4)ll~%Yfg!0N0NKVBJ5Bx<%6s6L@}U{!{R6@{T7j z1a^->OVx))dQ0%S4(tmDoP2Fm1+v{us34 zRX;`YK}>Otk>jW*tEx@gSvUr_#u|6N+uLJH@2;H=-qB|Uv<)P0?e72E1S#}xj78nx zIb8iUc6_HM*R4OSGaR>MG$9*tPZq6;crYY0C@Gdlt({`y-*=`>sN$JGGY@h)1a%c8 zql_xfNPag#rHqR#4t;JF?%Nl_9*GG@+iDSWks`l#2&L82Uo*yC!n`^3#DwU_k9&9xIs z;3)>NtPlBILswCG0zC8obX%Q+2-cLx{$KO{CB_O57mW6~0`Hb=rzx}$9A=V?o@ zp(SdGM0(LuCRkikDP&Iswr~B1+lJPF!Zwm?@Dfrgi1sl@UNUA4lekL`-i?F<#?-#> zI#Q;fLraBmS-_1OiSfZh##;6%Ig0xJ$G<;pM_!U~3Xdrx1Xh77`p}gBrJafPKLjzM z7Vihg6HEd9bjNZ9PhTuX1}~a@MYi&u*jex<2nEEM4ycEF_-&)7eW;>dyGPE{`BJv# zjkbzmuB)E7`wlLTXE32p2S%d3^O<=d3KRla6oe(`V6h2Xrq^piZ%HqDzjs{7J7mB1 zv!*+LcXu}v>fNi`+lm1fE>V#^FGbpm{2}b;RT{vkCdncEaKOxlc}>EPOqeNy0GcQ& z{EZV5k~{ZXXW7d<=bZl-R99EG#BuWiBOn|s1#-PxA8-D=q+j*qT>tcnr4CS94(Hu_ z-l*ovIYD;7`f_Qy(;OKUV{>#5%%s8nl!_P_XqNE^;1?T1a1b0G9&V#sAVnYNl`HnG zQky2gkkuqXGU~{a%zJS-kXp2KBHcSmVT^>3&*aB;-Xawz zV`I8|r8W^M!X*7JFL9^ZPj4DX2REf3mSR*IKL=Bx5Tg-zl7ti#6b6QC(y0m$@7Az_ zTUUl97F0$^l;b%Y2qf9vu5@^M5?#I=2z~Wi1YeZ#Jt}fo?QvgHQFejTu8f?`z3ir6KZ~#5E3x|3 z%RMN3Iy2X>R>{r8(z_Ul3!r{vC2tBY7pq{r>#;_<@J$mi)}kzNH6mEh|*@yqW;y z)k^2L==C{ZnE6}G8o}7XUAH-Qa2|ysqkcT#d;(Pb6^# z1C-vkL~WdY_kR7bWoLK#(aaHz^R~EI4f0~otJeOhL*i&M0jtExYcI>SLQv-u%l3a3 zqbi6y9nPIUp9O*avOvgG?8(f8)uEFv)%T+)u^kWEZJar%1ZBXf4;R+5*`KZ&s+xv; z=eN``>8O17ts2;jSx&!t)bP(ctDiRa8q(ZQzGix~L#)JmLLi-{0;pB<>27RPI`+dX z1IIb_=HJEFH6W2=yIWBEaJHM~^nK4`uaZyG35_bC+b|j5o2WGVO6(sL#HiCz8BE4q zAHkvIIzM{$=hUAhlKK98S}0Y-!SPRUz7#UcAHqY)e~R-(VoWj_-<&v@{z}sOL5~zL zEUD}*PmMy4OR_;N`9lIG-@?0F(!@o*4%QTbWZc`e)gyHBbl);~dc!=N+`z96mb^{+k_3p?^iw$YLs6APmGX-{`^dxWBh@S zk4?kfUmFbl7}2P3vpS7wPn>4( z@TbeB3Tld(I-w1NUMokbWa1JS5)u-y63B&KWEB%xeJF;^_r#bp>C)zZMCKM%F;rMm zAVUoXTb8V@>-mhI#uCY@D_vGN0t2?2e{M=`M zd#yEk;cIMj;zm1P<*fp&Q4Sq)mz5D|aCAQ=>A3yeE`9-~^^W-$+;AE}GRK;GzB)#3 zcz!|Kb;myr$xNw;`uKCIqcly=-(TxNDOz2hpz1wOJxSCdnP(WjlF%*>>zj;B+R|Fv z$vGuTwT`fUObb`Pe9c5ii3}@1hLgb5CKGtb1Lm-#eqWa*kEOzX(9${8KID5ez|av4 zCk;^S;d@*GM+t9^l$m464~BtWUs4GrtS*4MH`GR4kMXUiI-g|^#rDcr{XmGU{lXTW ze?YiA3?#RO)zzcnQXJEI6rIuN(=~-(?|7Su#9r}&4$B_|qD?=yy0a9O(!_+bQcpsc zS|5zcLvk~zX}%B)CuZYo5GGqm1R2?clkqK`i)KjC^V&jtvQ73hzWrz8^_2YpF_Ml6 zSZ^~yAk%B=SR~fyM6zSruJNJ+iopL3u(`umnizmkPMhW z1Qby

^TM9;zrbcudGr4oK^6XG4uFw%&)p4%;VXPt*5lfpTc&cBpfb0}=`F-!Fe zatdI(_^ImiV+tP_zp1Syy?M#Eyd^ea9+|NGJt7(wq$;-fQNKy4!_8O8DIk{@*_~&z zq%hy_NcN0H-8UH9FS8_>QeY%6d?T%@W-5%leqv=M3WNyFgzY?70lZ^BPu5=*^ihb5 zt~|OYkKTcF*Dz@7APdC$Qq|00G%90%>p8`wd>HD!=d?wNs5iv}WgVGVO!f(*cbK={ zD1}f8=H2%J2k3Mh6j57G-lJFn*IcvR`Li0Y^ru>dNeaBCj^C|GyxpLec=Q7es4ueM z{uWL&;bF|85MtLsay%(je!LTsMRvKHB)@8lqI&Q5b?r3zB=c7JiN#7moRetUw}EiA z1l3jPwn6OYxBbjVkr=uxPdoQAhf#HSw=9ZrN;yfq=YD^lk#u_WkGJ=VuK|icBg@z7 z|LPMH)PZP(1u4LjUJ89w#rWu8m$2{`US|fxi^gC*G`h&q5rJWXd^`GYRLG0_*Tb=| z6N~kAzFlM3DqS%o0FPrS5P(EjTv<95`~(L`foE*xBsmky)DhIk|8Qd`M*6(-FJhje zl5mYzM5XNG+0=&@{Tj_l;ey~eo20-jrD}q_A-pJCk#Wf-4*A{J)$fg>u%=r{Tq26H zxD4#a)?yWjB&r21Qw-2vn4SdHkr)v;HvoG4Ft{yoybUDpexwT~(%6Jv=<9lg&Ij>4HS2Rhh=`W2i8vGztQG z)BuLH-8IcZ)2_n#<}M=@-lS92SlUUmdDKtWY>M|RR;I^F6itSwrB^p^1WaV!j;ZG) zxT1zrUn1!xUEZ@|Jaf$6kZ}}3(t+wsuWeaNzka_G%AR+v!H_2AV-V>-qSmtC*Jm8nb}C>^CVlJ z^Sop&xda}Kw8nLD^wH@-Thvhi)>vSEK}DOJRer(2hW7%}FcB1G6^<$cx~uB#+BrsC zjL$!P!l$reQ%|(x#applI!tn{t~_VzH3i8Vf`&p8MM5GXU&I%PUx4!OeiP&)nkLP& zFYfN$To9bLQy@*rm$Us&Hppj<+$=@tCG#?)vB<;$)LStyFy5wK75PLF%n)$%;mewp zS~aJGO772}2oz#5KP-LjcTiU{BI@vU9x)x7U+tFU_Uz!=+1a7v;UQ+d^~&xo?Wo*o zEG&V(?25T0`3c9AB_QK&cWKvJk=N>`>IZTNv5;JslNp}K=9R*4c^UMKflqf073Vqw zA37{aHsdpzxhlqSQu|~G9KzN&eRc7*WSjhtHqI=W@*HmG9|JCSEFzm$;n5OPnpvTy zb#CiAeyg2pepnYS$Uy0xZ?LTiS(&BKo9M@LP|;!u&MPBk2$WWP=*_oyqC@{IjfOnA8 zk6yD9+~EJHQ*I}?>zC{6+J$b&{;yofxjb#@upH5mHoH4%r}8 z&orv>Lbw-K^ac}8_i|T^ltbLl?kfUKUPR$7?71c?)y7BtTxDZS(;eEiHdj3`2O~o9 zRHbS^)#-W+0gIJN*a72cW=wY6J>9}#dlx6WaIv|3;L~Gv4t+7dTef$kjF-$^E3Ddh z@P29eJ0?ibni%I7zNN|dpk+GqJHOCv$l@Z0J{bTSU1p4wrzsU#f)8)H^!o5G(YO4| zqZJ!Z?Pz*kUXIiyb<#~W5wJTFK%RwaHUIO}(BJX3L-FubfRMt-`aVSqCwsYx=xT#T zQxDnc*P{waVUK@U#En`)3>Eg2#L z2b7=rD1O))2Br(LYnlpJ4G^w}#r<8;gt5ww$v<6`w0*LLJI&id#oerH0rVED`o$Nv z)n8uSi0xHpUeJFnBX0I}F+25rpeToda8S#K>jmy(=8ttiK-mRR37&WX>*)e1NNCr| zJI}^Yng=(d1P=~7(8tc*CA1wVK!al^%fMdjNwLY`Ppr4AXt%O&X6MSnz`gd;J^buh z{JX!upA?LBAx_B2n=0Tv9hy$0E;6?h8lMbCNsd$!l8&>uU|bRbxk%1s*4sPdsTX`* zvy_C*I(8ghGR%A{-Wc%SaXI+-n3+Z_{FdiAOw5;$7k;!rg!6K5_HS7vO&xOa&TV?s zcq-JnNLClXXS+9&GA1Ubo88f@GYI@wCi|W;N4Mr@7{u7`4NLAUq>Br!ciN;>*@^9? z`S_eEc2oezlcnE55vMh+Hd(mi#!fQtCN2!0^WGz<&fhJzxP-)xqAqFa4NOV%PLFsQ z41Oj=bF?e}9&;G^?1@*ptl#`$XnpRUlew;;a_kkngTq733TJDrw;Es6a0cM?YWTiu z-^0-IOrgx6rprS`SKg`YDk8DlrZFJ#yPPhKOGDfRRenbX;hS5#fYOyY{USd4 z>3)_}{gsBedFwu5{^d>|kPtB_$Fp5){hNCEVEkb+KE!>7>drL!p0jN9w}96ZE3nUi zhLmZq4peQjc@4SV+T3w|E_PLyJ}9!P=x<$-I5@p_Cz?G+Ix6#dFjRSKv0(rn```Qz z72yRp)7>YFkX`{zRrU`7YYMgh*P+v1cR~PN90g|?bbDgE9J~0>V{qQb1TbcrVi*-Q z0AGE4%@B0E<5N>pnl@0jzmP0w8wuNH<>n8)`N1L zVhKDEi!al__KCTseXXhj<$bzYI789C8IHHfI1 z38|>UkpmX7JAstUQs=ZiVnI~uz*bU>)yFtRr8o9$@Cfv-T*kF$aB0NI5FExJ7Vh)* z9u;zKU`1nz0d;dvaNVG$LuC{)X{cC?_m|-G#wj*87VH7pTGnSeEouMY0@Mj#yLJIQ zQl!B>S1bO9i0ri_l$&*1BKK9Tw}haY3xyXl0fI+#TaKCDP_bq9$M|PomxjxE!Ll|C zq|f8P)VPzqaN{yR0|PoxX4!Le@+0AJns?P~OQ5Fpd_DuUjZ)$Wh92Gr-(I;k2&Q3a zk)s-diG;ikgn-%jy1^oZnE7SVHwu61xWj0vKp>bZKwU-0Oebo(9lMnDJ3j43B+9A zOVh_xgkB9?aki(cIdpmy?7&69Fn)3308E3jbn*=oh3pxC>qE(c?`9fG`23Jretx9J z8&XMpImlhsz$I%6EO%~3U%sj#g{@39o$k3sZZldL0vv&Bg<{~<#Vo*FVeyD_a0y@@ zdhmd{X$(qFy^&)Wa@XeAXP94u!&)v@Bybu^M~oSz)_hdkXb-sosO(*(Ygt9J`BKIa4bYG-FE z>bWORKUBSP`sKxNNba*Z>m?)yw>(d8eBfusHMy`4yUfjuRx}P!Bm{U=&^doSj~j2{ z+EtPM22LWzN?aOJuj1)A*!qrPi?7yAkFG}4QFFAHOKiQqSry!0mX|8(lJovG)@`Cr z2Vjipgy_9ngFAg7c73+_{HJ00E2FQ*VYTr!aJq#*@N=$xaRyBeGlTpmWz_=xTQm&h zC^v(xvT)lsd=BMJSwrj51# zCMOTk@cP94I)ChIx$OPG;P2C~udjc;s;(rY=U7}a0R*tME%u=5aBxW8ZT~2A>wuZu z>jElhG^jGJ z@G(wLi9Nq}?%v1B_Ai8Ji6Yji(|O!;xQF+_p-Ev`<4|T zvWgMxEQhbbgIGZll+)i8)5j;Wf>!f231>##;;q#ms%>3B?HbdCT}O@~)V|3;OKipY zRbP2m4p;*upt8j|_rV%S;<}Zd%I2fa^y6?eT7lEATNhCIM~}aJjqyPdaZQz`U!EAg zU#sWrnbm45DSrLUqYwMoLh?fCV6OeZ^L6B4iI(hdZ?JI=hq#fod*Q+a8~SaYcHqo} zyND4DnWUSgdGGyV0bhD7AnM)T?1^724OVr*MnU~&pdr^-2;h%zU zx!>e}f6h>b97Xi?R<_kw4NKO(f=jzl1l7PHf--Lu?57nLDNF2q!OEX*ay4n^6gn^6 zW1f5+C+F`7ZdQ9WuiNA~C%{D@&vifE_M(||Hk($Qe5gaAR()HIf{+U_*A+Bgul+|v z9p_s0`%)4=>IiKNshc*5esI8pw?T1_JdqB>>O=+w&{}luZ>+@NVxqg4Eia_U`6QP6 z!54i*lwwj3pmxK4pSGD969jNCe+SMi0>7#5=7CB1Sn9OL5Cq6D5*^{3;QHej% z@+6y_lTH0%4lDYm5t^b@du*{x6C=u0-5^p4K2HXUtogUrf4fmA?LgKq}_LA2VfPR__=CKDMF#R1haUuSX7KYggTB zy(|rqbDK?X#ekx?drZBhl{6F-IVBj=&Q7Ddt-eJJXzDD+O}3K7@fHtnOx~UJ9rJp! zC+fGw66kXq1pc^=(}oKHJ{`d2p?~p5=nQiv_m0SEczB4>wzZV~1L-%UxsuBRJqUiY zFs}y)zbL^`~$-6vqDzvA%xP^q=5v2yYr1|DwlE2zQ%T z!&wns0BH^`w)ua6mbs_iGjg0j^zcjs>^=dHjGG4CxDl9m;3MiJK=$>A4rFNyW>=!) z2KZDBSNw(he?qJq#}fYo+zsUI$g+XI=y3<~l9=C?m1@DmttgWIOZb0)miKu&qG-jX zzm_^?+-mm_+3NV)W+gfs^n{L)F9+``wEbvguM@$|eMk_19BZ?sT6yO|Urm|IHjyD` z3?Bb)(w;(>zfG1xwdXxBHE?xZkVrQ(U#_sU9=k)bBqD{Ta zegEy!9qalVRzt4Dxe-M#HR)w3(g z_T5+`+9wu9QWS0V^NeC&{{yH2$I%|Jeqxp1iRqj2xto1%AfxlC2yq)9Zn+V5nK6bub zV=d(Sc0a1`kL3?e|Cg^nz92d`r-IIb*nl(jGNcI}><}FN^wxcl#;yZ(hViKvRPVmO zk^0TYn!@+l#pMN?+pV3QE3(N>te2G8b$Y85gF~PAi=eCA4p=rlJdPyiuIBdPlG8*~-lFi28W{UihNJ&GhM2)lIgAbT9*1 z@vTpC75AN6J0{fBjLMplg!6z}h?Ec9#R+58xLl5Km5!fr_MoPnv#;QxsSQOSYYJAn zEK8&h*8JHD4wG$Ll-y}UNZ1`;B ztmdk01P1GLik0ke>a&IEbSA}~0P-$KE=cMYnR^|Lh`?cZ(P*DzYV+Bk-R8P@isa)k z_vGI{rk==Z+ZtO{9#i|pfOK`JDfY~>@!8G&Z^X-wek%mo zJxm}jXsB8IOh5MdB1c-^>nTSrSD64l+5$C98iGX&rsza3dtps=FZ!qfM$- z$uxTntuqLH;V1l}wgivmxK-rr4ElP841ef(6ff$yiQYKGn^ni8 zJkb6?Mj5_^N`z^)z4MG0jm}6XU(fBLdfJ&{it5n*n`Vrp#9Vl2%H>V1<=YO9Zte|c^hox`uwcUVno(&+cW14{*> zj`DSsU4<&&Nx7^Np|l9P#X5fZWh(fxG}ChUGg-h{(>g5-rlZ##MnICeU7i*T&#)tc zR+IY9a^)d&j-rFAF%cRT@rx7?8K!Y@WC)uRQm|{od9!MJ;a{ptUTSHu^PEGPe26+HN7@ABLmhcugF6KFEF+1e;JCct_UM*Wj*^BN_N6(kC2Q147_JWdMsevb_g+&RBDzm5BY>e zeo%dNMc#9cP_%H@k!cEMl|Y*MLuAoIX4n>o zce0lNoB|D{w6pM|;(cK^=z3D5>(R{cCq!T${eKPozc_*&^mbbfs`^4Mq6%~UdBgST zLmltZt8_;R$a%9v*Pb}nd}@gita8LP$!8juK^M#)Yi?iAQgwCDGZ)TPB# zUuyBm7g46xXQryry>UI_+&ZS@hw4hkL+8&pLI`&)1U`ZnErX+C+Hli9HCiu%F+1@w{!lo#7=oG^o&h0*lZRJs=(NbSIp4~+z- ztAKB8m1igbO1|*V+997NLeo=YDtNqb$7-~a9Ndh*lsk5oq!;Ovf1lAh zu5?~d2~XeuZ%nn6htw5U(B_DZ4@46<-4T9@ZyB_cS3oS#Cph4rNJWiwD){5h829)Rs{Y~ zouCtwFeTc~a8vn$kL-QK#5&LC8-G`U7w>di%+NdMG-3A(Kw^`de)HHO1Mt96c-;sB}}ZGz@hDUT%f58Sz_I5s>_^7K`ZedSxr_0 z1@wE{D=R%~!inYBTu1Fo-W|vWu!AhWD~#XoUS)VZ^7)vjntK1G!|UHRN&9cuB~5#J zH7yo_Y9-Zx%Smh}0KHm-UF3~CRSCRW=Nfp;2t)`Ic^-uR6lS#k=``POdG!M66N4Z_ z>XpfsZa*wqlBXaJc}Fb>-jUO;sLEIjVmj!<;FCT?!Cc?Mm2@k9{ujdNrIP1MxTg7o zaAV}ZG1CGI!W3XnX{vGAjV%Iql~o&9%SV@t>N{iCdx{?v$+@2~) zo!g%$HBlE(X#52|D@oB^Eb+|Lm|v>mci8e&kmEYzYy_KLfiV5)>Z;xJwpl8rhu(MCbn(a@wfgU?hei(q9^<{RP^xEtML#%0A!@)Im{E@P7BDDI*{HbG&(=K}a@hY{2c77NCJ_;7AO6BlbKv})hE%FgyLjSUJrQ3(s9hoan1Jg@*gCnP5ixyX9U z^%L#GN_Q--qmla5tdq{9fg#+?Xp!I}0#`srFrSQ&$*+v;@-m&Q+^)@(>@Kv#>3zE; z0dQS5#zukkRE)%-^6#_-!Mw~)AG+ZRZvxxOqboywPky}f^X)grUMt7;pynt%6_ctwCh!UGsn zGRNwqK%EPhzYNV>8`92OoBG|j<29&{fr-h$G(AYuS*aw21GDh*JuBrCEEqOcD>m=M zy5xW3pe>~28`Ojz(Wg#KO@(Dk4rtY4H)iMt)}vo+Q^-Sd3t|> z7vaxr;~Nk6UAXVBV;z*+k~Rf)N>x{$E8Opt?0UI*9*dfbLY1OK>EhIFR3xLT63Xmb z95&R%RJDvM2UB3>n*Ae+0yfP!H4^aEN73-&wE7YVA2^scWIVF}dALveqWgo6rIS@Z z4tsKOJxndGhj-P3Gw^9e&JBL7e(&#C6CLS#u!F5Y@FEoSOpMolOCY4P;x=xFdPm7p^?OL-(J#kmjxUkzlLC9 zqdNUdjg0o6d17LNXY@04IHa8lTkkou99~m6KeuSP8j5#|sqzhu5sgfUfzPfKM2XAhg)0Rj_b6_u6Shq|u-J}_F~yvm!#fU28^O%%aL0=gb91m7{H%GXpBF;p zsIk-c(%F8j%#DARJvkIg|EA-$sO=2~G~}yV%4`rgN!XDCB%3xPbngAgQY1j41cRRh zav_s5CaF_GOrOY4OLSGxr26)5o2i;wiTm52=mX z{=e?NJDlqN|G!YkiXyUdq|A_#Eh{UM5RU8_$10=HNk(KuHm7Bkl|4#k9GOv(lgyJ* z$S9n$zR!0W_vgMo-|Kh%{`md#yRUP1o$FlA`@F|%JjY|O(qpmMNN#RFqYpxNTQvDn zw-FV4s0iDUT3l5EBthtfG`D#c5z`TvPgGyzS-vl_T-{zDbdy2MYEdkIV4fF$J2mKp zxhUh{DJ`K1>?$8#Xa9}SpgO%rbo8V%Qn%rMZDPQxkJa0%-8h9y9Cw3$WSp(JZOE;k z^xSblIRCa8UF*dpkqgv1`^$ps;+--zNZa;C@U)!aXa=x|FX*g@xedvEm5!D0M)m}& z%g za1*=P&4Fya-5_CY!Yd|uhGV-nUc`T1_;#1n3j2ppV2Fg=5SX)HOM5+wL!eyykhBQp zaJA7u`1rl`tEvYq?(K8N$y?C_Bv_3^8p`)rrf^{EfJm`{L-`U?={bo|Zldb@_BOF3V>6c>hGf=8N*y_UVtIvb$_bc~{Iw9TO z>eNgA`QgT@$R5l{RN6Z+N8b~q8XV1_Y-nRk%ZX>N2C=R$V&-2lzRhL;h_Gmnjfsr$ z26lL4@+GsJwBCvIiBB(?7epU9JRv#pu!wx$1rh*COV?!_ziRr}cEua+>yE@;5G&aO z_m2TWu9=6?Ukyru1Q-Yk2P0buG3)e4;M)=AI^VuwCN=!jj~#@I=`T%S1HrS+X8t<0 zZ)NJWe?!6!U!|X^m!rUOZUXS9K7FpP@nZ_F&B=oEj|eo}!kk%MB%gSWIe6CdJCTrO zM2#U$1ptE{;P>-wPMluayeo}=T1|?9WpvH+$Yq*ch5Np*{d*g8Wvh4&#$Quzb6?2f~?jM0Y66Pv0bD%rV;-gg}WI!^CbAvJ9?hnLO!91 z^vgN7!mhe=D-E*S=+!Me&N=rlD3=3q0kvI(0>`#_{)u^0=BF1iigS66t4<7$@huhT;h%*4rt1wVy+B3sBCB9cr8!vhq#O-#5y^GQ=tB zfIWmOaK^20_6I)Tief~-TnhgNa~*8+9&*todvXi=u-aj6?z1n6fxS#AcWWZ8Sx~8Zj$QBliSkM)4Lz`p4=;7&}hXT@6Oe$(ktcT#O=b1^GPR8 zMlrrVAAIS-3maosIsb2GPT!ZH-9p6&zl~c&Z7-lOW8Pe4m~HIWT#Mk**Yo>{)HJ|9aK0ZH?yfGd*lu9Ce)Mh zuY7v{1Gc3#7V`CD;m*wpusyf|ZL5p68IMF%Hx}T>}`mju; z-&rZ2FTE51#pN^oZ{RG>lB5%{*LSODd|nuhIbu{sENelMUX`p zk*(>_aAyyMuKEGsJ!5pw z4=mP*Zw|h#*TUv&MK8Zul^Bb#@dLuCAt=-{cFS%6%V}ExWjTJ(&&PasSI`gL%NkM= z8*FvRE{JqdBr+NbD1<4M!x&LGp@h6~BR?0)VE|)=xyM9M-eYY$Zf-?O92WZUQWI`W zGNQc@j>Ejod172lhIk220HS(dA+w+p)j5X$1Y#+m-?LeJ9%~eX5Gd4R2OXjm8At(( z;Nh?^Ix{6pAetsiIM4&yDB_Ib=cwmT&Apn7Jfc0uzFCld41lS!4?FOfm4Su+;UWX& ziYr+pc5YeJLH%!uk4rHQ*he^!#9(z|U095<1te#X&)- z5ZMo#ZA`d8Y9kj1*WmD@)46~p7A#fukJo)pU{6oQsw8!JtxwpIuDoG7ZV#8nV;#DW zy6P5u(J)h*9vK!=r(pjRcYWR-PEq@Pf*oYjHKPugObRl8=FzrSJRD7B_RNz$7Jc4w zrMB}T4ix+!f>_%BmchPF#Qeoxjp-G;U?>bo+j7ojy-8>v^sC(c)Qj)hV6ExW^z?K@ zQIVKIfvMp;kA604N1l4pJLL$>&w{QOtaKMzQhA*Yy8nZg=97JTG{{GgVk`#Q=nO8VsUS#lbV8_L+XL|2ZTcRMP7Z`pWm$L zpt*=K+0(UM?~i}}bZK*>5W76`QnA`&xp862kBp2AXj^dE<$2tasO{&G007vnNTn-~ z1kYYVSuV65;SpZ!6-1&gpD%KXY&u7KKE1YAeO4yQb0Ib9ZQb}YuhspogHNN;mE*6< zr#hg$e@JIPX>~ONkiU=h9^PmXd+>0Aubyv*Oa@&5ruE)ZavJ+&>qJ9F!eipYi z>c!v(>4>}bEB}Pc!t8^Wr7cYTQ_Ime-ye!d0BML|00T>T?R>Jo<(?*MD~sQZ9s4As zyPM;9M1gq$?20e4c!L4OjsDXVZg!Y=Y`f z?It%28lR8SDOWJp^LRKgc+KJeKR}4S% zq5&iGW+>Xk9=RaHS04m8sk-s^r4DEEy;+W!k#?YM*Fc~OKXAXp55h^~5?ksazd3m* z4^RNh4_eKZb35>g#9>PwO(c^200d`3C%xF>Jfz!(%DPSNj*k4`_?%hN1q$p&b_|I} zXqD%^XAPK!KQ-Q_=fzD zOUmoi?+`i9j^}pfcjSj_{6P9RaEKB@fV#lO*ld`}tccX35{H$l1b{k2nT3pyElW#J z>rgqE$MGBGCo|pBkG8CVI33_SzTkn_UmG9`P?HG2-q9i2C?}twE9s$Bd&}_j`&~Z~ zOfyCCn0{WINCb1UJ!8Wir;3_g%z~L(0*H--!tN%!M+NS>j}=W=ovL^1O(2`oE(h`& zMksz_$wPQ`U-eZ~^A9J^udXnV*G7R$^s$f=7 z4cyzc^9rxn#(miv3vMwFGTC663WWlX3)KnMS5%CJB@bMowEXhEBDO4WamfqBy9`_L zvUAVl;KxmjOvL!TS^-#RWMiBpyav!a(fDJ=w8foLXm7I|edh@d_j4jI!&+id zWYQ)FrQ)|N-q)^O6P4oSk;Nd-Mbq0%OE2Gt-zq1xc!)f5b8^FSja^96i4GPS1eH>q zRL7%^T_Y7UrIg$+3Y&!GT5Z6|M2v5ICrUDF=lf?f4Jb!)a`LmK_B!Q7-7+tnYozoj zvS;4%km;8+En-b*`Lh@S;ui5uID%X)6T8%Ve)s5+>a%hnW|RbnuoE`9?wIz|;$XkJ!hx5{Y9^#AfD!>ZOC$UTVD5y>W$hwlozVx;Y!=wpbu%It za`gEOQJ&zK493V(-K=hu$Yf=W)ewTo8i{x^g_(Pl>Yya~GK5Xenov0UwW5>=JFFpC zxfmhoJSvPqH15kW7Xa~UC~(TG(ImK-!w9whvbV~^#&8%)VYW+Op_U>XBS57c z$)tb3XhF?@aI)*c&tCf04hNhJNI_l9hP#jc*)!n{InvOKk#Gc{)t`f2_dvGIcPGlW z@YTPz&6CKs`H?nt%#_RnqvLR!d3i|4Po|yg)qVd(YC)rXR)=>bvqR8CDYoz2kCfi% z_8-$*Y4!FkzF;~qAaS@teBX9I8!1Ua>Ont5OJ?{Phl%KbR$E1U$z=5mU7@<1#6~A` z9!`Xs73n|6K377UX&rcY6Kfsy6a=;2(_94!t$q;5#Wk8VdBH3{TkC(t>i}Rp&%6yl zJy1J+7`kJj0;U6py}6zb14vA0qwqp?_HrQnD+!gyo!{#?G7nO2KnZ(dN3to=#My7| z8B#1AL=g^L zNe1&8HmIo^5>V2c$s8KEl#IdIZtz zz2OH4&|7IsS>-ixDxEQd5*svXbrxovo1U3#RUX87*mO}Up|pYuAN#)mA;Nl%v>9bF=i+Qzp^oSb~rGz1txL!)!i zX&W#FGH$;_+!$rDLSiv!=%<-& zs--AQb_EJLpwJP*M7q;c@peJ$5W1us`flfMY*Y?kQ#pC^B<-k6AqK^fIn!k7Z%RV| zw7Kdl!=~r*-p-6ouM-;yOKxKL%~A#{IK%IF%^{*^E2YtZn=7fIXK9WhT7&Fhj1)}F zaH7M@>Om0>VYaaEXv?*TD33K{Wje z@I@|S0`tR*@{5bSYWjTp-VcR8#6LmWaL8ssbC+u%sQIW4qCUm^sA9~x_7vS8{i!C1 znDry*vgpw){8}~8K+ozWOGhGD=&x$rl_`Iw)29BhVfwKUBo5M!om}+Np6iRq7`igaSsv63>;QwrrG_9%ZxBB+fStcJra83a z<*Sw!^zpSw;v^7B&IRbo|u?B&Y? zmm+#O_p~NGRm=sHt?W}oi;`MBf>b)>t#i#jKuXC)S+sV)16#YdPzCs;+5j^H3K-Gp z14ULUh7tgeKVq29W04i1*Oe@86FEC&+b}XiDDCaTcpi8CVBCA6eXIc>$~lxpyp1L- z(rwG$htJ$IxRl^h8RjtX6mM6_p`7j|`;0_Ufw6e)4M~vT^z&=$SIZ5};|}Q<>@-`; zD6dHhEz5Qi-?%TD?d7%BPQQOqwq^NFbN%8*5<^i%odoMhx-la$!dv$(!V%hTRS=@9PF>4($;?ND++gWZb`&pOBZG<7I^SeTc!)iDp7uzNws*QL1jfuYxY*@VYi&;IWD_ali6P(@RtLj! zF7qt>f^_&cVjU&xrtYpI-q3s3k-hW82@P$e#d zxS|507dkUk!w$LydMO{EHI?(OpmZFFMNx5aeZ?Vp^6TL>aKL7eexC19=e7ck01Y70 zw3WR|7FYT1034$>T_;`~2uWvLbG0(8av$CIzTJ7DQ|E`4e^2v5Qs^gd!Sc(sy>vbEm`691*@OOv{Mf`?Bh@4jmVT%LTU79dSa z1^hU6NEi1wI9FJC&-Ozp6OfO!TaD&>tpU?8*TwgV*;DJHFcBhzMbEH|FHu}-RBgk+ z@M{EiPzEN6fo72>9qK;0b5M`TdD_mwSL)2zg)$=&ZJnIw`e9#s`{BOVAq$ssmd4^8 zn*Or|A*CG{D9N<7pze*oul6ZqdUK~Y8spj*pl$Si&k=aIijt!)iKLa_6@JXY?WOQ+ zmv^6OsnFA;hzV04&_0@`|D_1zO{Pj{B2I!Z7$*pse=c&bFy~M1CheeMF-Z4;^2uXJ z-x}YPmPUFH2x8HG?pYa z-jVV(2dNuSQ5?g#qX&@S7r3uc)aS6Rut6jdbNQ8C!87K>|tqEh<0!nLBHWURx4tf z!Dk*2}cD&_WV2BSjrf}_=_#>`qnmXw`OUqQgxW76~f4@ zru_IL{kx|7gD)u)wObot<{Hpd2*hCe*jTCl64(@Ca zQ0E_~AeNE6$0xe(qSr0jwqrL}XC9Qk2^`4`zsr5fab)dtdC7(l)u( zx8c%mUyD>h0?c9g@0G*?4D5z*X1sOs6o9FUL-;g zeV0kLASKNvNGO23UrBq1&fDw`se)L-d9}I5=luEMSu|qmfOACg%Bkf5G9D8U7SO#K{;(O0k^EJ zCwN!dxcW;NF2SapAeK}N33PVwH)s#_8YA9MEL~vsVIXH$=hDuc=3a3#FxDEM=3=!r zFsFmBThH&mgG92>b@00_>Xp)pXa#H+yt5>fx{;QXm3hkd?X1Vj!6BFlTsL~eMlOx2U>bi+fM@Ob zdDumW8Uz(sgL@hK`qKMYqN&cSD^O7-fe2yFId(hR0qtn^eO4lN`|gATX%wpDNLvii z@;#ju58h#;?!D{yVC#s5O%7?I#mcMQuhmdu;-+7H~)81d*v+JNGVzh$)7J<$OWl1)peB(fYbJ+)AJz=J@%z zj)Kw<73HOx<$lM&!%L6}FHj;-3FsR>R1IemBp3E-No?==ZtQTYoN5x30IZ=OO9eSE zw+8Uwf821_4GToyctH{Leh)etA5qgN%`-e;!%G~dXlN4v&}3B<#QFo>?9P@E8i|8E zE}|xDhX`nB23GEJ@WVt#<;UOG_!LTYzLj*yNb2x6!zJkD^weRoOFT{bxmJv7iTfQ} z-H{Git{ndA`KaKgxMEa`Y<}^HiVp&~+49(hIZp9b6A0~DkzTU+`j}^4h1>8G?>9(8 zdvWp=w|s4wEWuPqOLG4)#}T7Zm)lVw1&;`qyj^w&h*WsPSuGSIU|KR6&fG;U61`v6 zJHM?TElOX;(gYnIz0=&76|ZgE$aiR}Dj8&TnN*ZzxO-oD*}~d=uitu2Q5{e6aeMB0 z85R{}7S83KfdAoVbR~LMU$}ovL&OxW|1(4W_9bR$WWO>84oOjU=!vRu~ zsS%J$7mTTDwAbjD@D!>+Xguf06Ln?}s-d6~CKF~w3zk~F- z$|o=M@Fg>&o}AC!BQXcR%m zC-=|_%;|8Zu40jEcV6f~h{!xQ%6*3q+yfq5kZdE96A+0FGEv2~NxIXqOEz8KP96iE z9jqgJcyU?0B9ssMcR2_Uc2DRBVP0+L*WV|C-m&;PX&VuHPjKJs64B~r@7M$ zT&$3^mM#RS(m-7OC!eH6=sVkVA5j0v@Zb#|5mWK!W*ce*@A}69;Sh_yGR7>G$s5;T z6haveFr4Tf7;7GwAdZfzeTAa|D6NrTN&is#KMn$Es>|uRZoyv*{Lf`R2q|qRt2q9I z4E)MeuZtt4?Kh%jTLQ|z5eE*C+ z<-9)^3UB^DJWUc-?AEb6_oGpo+u%P;|jNK?1AmSAgPY9r2j1{G$5_)4xVE-{|+LJ`hRfDepd<(T8hD1xAPJe n(kA(RM1=Le%faSHh|xbQ0RL}Jb4~HNjQ^b^;<1c>-kbjcHkdAS literal 0 HcmV?d00001 diff --git a/eiffel-syntax-and-usage/composition-build-dependency-example.gliffy b/eiffel-syntax-and-usage/composition-build-dependency-example.gliffy new file mode 100644 index 00000000..630d8008 --- /dev/null +++ b/eiffel-syntax-and-usage/composition-build-dependency-example.gliffy @@ -0,0 +1 @@ +{"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":791,"y":733,"rotation":0,"id":415,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":10,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-270,-673],[-270,-589.6660000026666],[-270,-506.33200000533327],[-270,-422.99800000799996]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":649,"px":0.5,"py":0}}},"linkMap":[]},{"x":868,"y":343,"rotation":0,"id":413,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":9,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-372,-308],[-494.33333333333337,-308],[-616.6666666666667,-308],[-739,-308]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":281,"px":1,"py":0.5}}},"linkMap":[]},{"x":781,"y":723,"rotation":0,"id":400,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":5,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-677,-663],[-677,-623],[-468,-623],[-468,-583]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":627,"px":0.5,"py":0}}},"linkMap":[]},{"x":878,"y":353,"rotation":0,"id":660,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":21,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-383,-18],[-504.66666666666663,-18],[-626.3333333333333,-18],[-748,-18]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":649,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":641,"px":1,"py":0.5}}},"linkMap":[]},{"x":801,"y":743,"rotation":0,"id":662,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":23,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-697,-683],[-697,-599.6660000026666],[-697,-516.3320000053333],[-697,-432.99800000799996]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":281,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":641,"px":0.5,"py":0}}},"linkMap":[]},{"x":801,"y":743,"rotation":0,"id":664,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-280,-683],[-280,-643],[-488,-643],[-488,-603]],"lockSegments":{}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":409,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":627,"px":0.5,"py":0}}},"linkMap":[]},{"x":766,"y":202,"rotation":0,"id":666,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":26,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#d9d9d9","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":667,"uid":null,"width":141,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

PREVIOUS_VERSION

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":763.5,"y":127.5,"rotation":0,"id":165,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#8e7cc3","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":166,"uid":null,"width":66,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

ELEMENT

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":767,"y":274,"rotation":0,"id":679,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":28,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#00ff00","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":680,"uid":null,"width":136,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

Satisfied dependency

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":769,"y":346,"rotation":0,"id":681,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":30,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#cc0000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-122,-104],[-87,-104],[-87,-57],[-52,-57]],"lockSegments":{}}},"children":[{"x":0,"y":0,"rotation":0,"id":682,"uid":null,"width":152,"height":16,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"both","vposition":"none","hposition":"none","html":"

Unsatisfied dependency

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":423,"y":539,"rotation":0,"id":683,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":35,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#cc0000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-135,-374],[-265,-374],[-265,-204],[-293,-204]],"lockSegments":{"1":true}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":627,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":641,"px":1,"py":0.5}}},"linkMap":[]},{"x":777,"y":284,"rotation":0,"id":685,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":32,"graphic":{"type":"Line","Line":{"strokeWidth":2,"strokeColor":"#00ff00","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":17,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-439,-119],[-302.5,-119],[-302.5,51],[-282,51]],"lockSegments":{"1":true}}},"children":[],"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":627,"px":1,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":649,"px":0,"py":0.5}}},"linkMap":[]},{"x":288,"y":140,"rotation":0,"id":627,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":11,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":628,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

B1

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":219,"y":192,"rotation":0,"id":629,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":80,"lockAspectRatio":false,"lockShape":false,"order":36,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:b:1.0.0\n

\n

dependsOn\n

com.example:a:[1.1.0,)

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":496,"y":10,"rotation":0,"id":409,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":6,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":410,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CDef\n

C2

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":428,"y":62,"rotation":0,"id":411,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":16,"lockAspectRatio":false,"lockShape":false,"order":8,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CompositionDefined

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":495,"y":310,"rotation":0,"id":649,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":18,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":650,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

A2

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":428,"y":362,"rotation":0,"id":651,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":32,"lockAspectRatio":false,"lockShape":false,"order":20,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:a:1.1.0

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":79,"y":10,"rotation":0,"id":281,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":2,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":282,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CDef\n

C1

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":9,"y":62,"rotation":0,"id":283,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":16,"lockAspectRatio":false,"lockShape":false,"order":4,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

CompositionDefined

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":80,"y":310,"rotation":0,"id":641,"uid":"com.gliffy.shape.basic.basic_v1.default.circle","width":50,"height":50,"lockAspectRatio":true,"lockShape":false,"order":15,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.ellipse.basic_v1","strokeWidth":2,"strokeColor":"#333333","fillColor":"#b4a7d6","gradient":true,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":642,"uid":null,"width":46,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtC\n

A1

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":10,"y":362,"rotation":0,"id":643,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":190,"height":32,"lockAspectRatio":false,"lockShape":false,"order":17,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

ArtifactCreated\n

com.example:a:1.0.0

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]}],"background":"#FFFFFF","width":758,"height":396,"maxWidth":5000,"maxHeight":5000,"nodeIndex":694,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"#d5a6bd","stroke":"#333333","strokeWidth":2}},"lineStyles":{"global":{"stroke":"#cc0000","dashStyle":"1.0,1.0","endArrow":17}},"textStyles":{},"themeData":null}} \ No newline at end of file diff --git a/eiffel-syntax-and-usage/composition-build-dependency-example.png b/eiffel-syntax-and-usage/composition-build-dependency-example.png new file mode 100644 index 0000000000000000000000000000000000000000..67736c798724e4e7d28f5299e9ea28fa9919848e GIT binary patch literal 38598 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 ZXNp=AEeC_s3Nhf1yv!ZxH Date: Thu, 4 Aug 2016 11:35:18 +0200 Subject: [PATCH 4/7] Small rewording to prevent GitHub from inserting emojis. --- eiffel-syntax-and-usage/compositions-and-validity-checking.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eiffel-syntax-and-usage/compositions-and-validity-checking.md b/eiffel-syntax-and-usage/compositions-and-validity-checking.md index 0d5d6a60..e58a9d3b 100644 --- a/eiffel-syntax-and-usage/compositions-and-validity-checking.md +++ b/eiffel-syntax-and-usage/compositions-and-validity-checking.md @@ -9,7 +9,7 @@ In this straight forward example, the integration of a system requires the prese ![alt text](./composition-build-dependency-example.png "Dependency Checking Example") -Here composition C2 is legal, but C1 is not. The reason is that B1 requires "com.example:a:[1.1.0,)" (that is, version 1.1.0 or later). In composition C1 there is no such artifact, but in composition C2 there is. +Here composition C2 is legal, but C1 is not. The reason is that B1 requires version "[1.1.0,)" of com.example:a (that is, version 1.1.0 or later). In composition C1 there is no such artifact, but in composition C2 there is. ### Checking Backend Implementation Validity In this example we imagine a microservice setup. The service interface I has no implementation itself - instead it requires one or more implementations to which it can forward requests. There are multiple versions of the interface included, affording clients backwards compatibility. From b3c699302317267b6e11f27945a1902aadaf4f0f Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Thu, 4 Aug 2016 15:28:30 +0200 Subject: [PATCH 5/7] Fixed runtime and build time mistakes. Added motive for using GAVs. --- ...mposition-dependency-check-example.gliffy} | 0 ... composition-dependency-check-example.png} | Bin .../compositions-and-validity-checking.md | 21 +++++++++++++----- 3 files changed, 15 insertions(+), 6 deletions(-) rename eiffel-syntax-and-usage/{composition-build-dependency-example.gliffy => composition-dependency-check-example.gliffy} (100%) rename eiffel-syntax-and-usage/{composition-build-dependency-example.png => composition-dependency-check-example.png} (100%) diff --git a/eiffel-syntax-and-usage/composition-build-dependency-example.gliffy b/eiffel-syntax-and-usage/composition-dependency-check-example.gliffy similarity index 100% rename from eiffel-syntax-and-usage/composition-build-dependency-example.gliffy rename to eiffel-syntax-and-usage/composition-dependency-check-example.gliffy diff --git a/eiffel-syntax-and-usage/composition-build-dependency-example.png b/eiffel-syntax-and-usage/composition-dependency-check-example.png similarity index 100% rename from eiffel-syntax-and-usage/composition-build-dependency-example.png rename to eiffel-syntax-and-usage/composition-dependency-check-example.png diff --git a/eiffel-syntax-and-usage/compositions-and-validity-checking.md b/eiffel-syntax-and-usage/compositions-and-validity-checking.md index e58a9d3b..5edd0bb8 100644 --- a/eiffel-syntax-and-usage/compositions-and-validity-checking.md +++ b/eiffel-syntax-and-usage/compositions-and-validity-checking.md @@ -1,13 +1,13 @@ # Compositions and validity checking -A central concept in Eiffel is that of _compositions_. A composition represents a set of source, artifact and documentation items defined by [EiffelCompositionDefinedEvent](../eiffel-vocabulary/EiffelCompositionDefinedEvent.md) for some purpose, e.g. forming an execution environment, defining the contents of a delivery or instructing a build. Compositions may be very simple, consisting of a single item, or very large, containing any number of items in nested composition structures. +A central concept in Eiffel is that of _compositions_. A composition represents a set of source, artifact and documentation items defined by [EiffelCompositionDefinedEvent](../eiffel-vocabulary/EiffelCompositionDefinedEvent.md) for some purpose, e.g. forming an execution environment, defining the contents of a delivery or instructing the integration of a system. Compositions may be very simple, consisting of a single item, or very large, containing any number of items in nested composition structures. ## Composition Validity -Using the __data.buildDependencies__ and __data.runtimeDependencies__ members of [EiffelArtifactCreatedEvent](../eiffel-vocabulary/EiffelArtifactCreatedEvent.md) the validity of any given composition can be checked. +Using the __data.dependsOn__, __data.implements__ and __data.requiresImplementation__ members of [EiffelArtifactCreatedEvent](../eiffel-vocabulary/EiffelArtifactCreatedEvent.md) the validity of any given composition can be checked. -### Checking Dependencies +### Checking Dependencies In this straight forward example, the integration of a system requires the presence of an interface and a third party library. Consider the following composition: -![alt text](./composition-build-dependency-example.png "Dependency Checking Example") +![alt text](./composition-dependency-check-example.png "Dependency Checking Example") Here composition C2 is legal, but C1 is not. The reason is that B1 requires version "[1.1.0,)" of com.example:a (that is, version 1.1.0 or later). In composition C1 there is no such artifact, but in composition C2 there is. @@ -20,9 +20,18 @@ Composition C1 is not valid: it contains two instances of A, one of I1 and one o Composition C2, on the other hand, is valid. It also contains two instances of A, but also one instance of B, which implements I from version 1.0.0 up to 3.0.0. Consequently, in this composition I1 has three artifacts implementing it, while I2 has one. +### GAV vs event links +Wherever feasible, the Eiffel framework promotes the usage of event references to link to other artifacts. It may seem like a reasonable option to use event links to declare dependencies, as well. + +The pragmatic reason for using GAVs in this particular case is version ranges: with event links there is no practical way of declaring ranges. + +There is also a conceptual reason why event links are not suitable, however. Event links are consistently used to reference historical engineering artifacts - things that have been created and exist. Dependency declarations - particularly dependencies on version ranges - are much more intangible in nature. They do not simply provide a description of something that ought to be present. For this reason they can not be used as trace links, and are unsuitable for event reference representation. + ### Additional Notes _Isn't this a reinvention of the wheel?_ you may ask. After all, there are plenty of tools that excel in handling dependency graphs. This is true, and the Eiffel dependency definition syntax is heavily influenced not least by [Maven](http://maven.apache.org). Eiffel operates at a highly technology and context agnostic level of abstraction, however, covering e.g. projects with highly diversified technology stacks and/or projects near or crossing over into hardware. This has both limitations and benefits. An Eiffel composition check can never guarantee that a given composition will work; what it can tell you is whether it is obviously broken. -It should also be noted that Eiffel's dependency syntax is opinionated. An interface requiring supporting implementation does not dictate that it requires any particular implementation (actually it can - simply use e.g. __data.runtimeDependency.dependsOn). Rather, it is up to that implementation to declare that it supports the interface. This is in order to encourage separation of concerns and decoupling. +It should also be noted that Eiffel's dependency syntax is opinionated. An interface requiring supporting implementation does not dictate that it requires any particular implementation (actually it can - simply use __data.dependsOn__). Rather, it is up to that implementation to declare that it supports the interface. This is in order to encourage separation of concerns and decoupling. + +Furthermore, Eiffel's dependency syntax makes no distinction between e.g. build time and runtime dependencies. This is for two reasons. First, it is not intended for low level dependency management: most programming languages have dedicated and specialized tools that will handle this type of dependency management. Instead, where Eiffel's comes into play is in tracking and validating large, sprawling systems of heterogeneous artifacts. Second, even if one attempts to develop specific syntax each type of dependency there will always be corner use cases which are not covered: better then to err on the side of abstraction, rather than implicitly ruling out use cases by being overly specific. That being said, it is also generally the case that an artifact has a fair idea of its intended use - it is rare that one and the same artifact is both a deployable service and a source code library, with the need to declare a unique set of dependencies for each case. Hence, the EiffelArtifactCreatedEvent dependency declarations shall be read in context. + -Furthermore, Eiffel's dependency syntax makes no distinction between e.g. build time and runtime dependencies. This is for two reasons. First, it is not intended for low level dependency management: most programming languages have dedicated and specialized tools that will handle this type of dependency management. Instead, where Eiffel's comes into play is in tracking and validating large, sprawling systems of heterogeneous artifacts. Second, even if one attempts to develop specific syntax each type of dependency there will always be corner use cases which are not covered: better then to err on the side of abstraction, rather than implicitly ruling out use cases by being overly specific. That being said, it is also generally the case that an artifact has a fair idea of its intended use - it is rare that one and the same artifact is both a deployable service and a source code library, with the need to declare a unique set of dependencies for each case. Hence, the EiffelArtifactCreatedEvent dependency declarations shall be read in context. From ef75e5b503f39f185680f66207e3b3e356a334d9 Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Fri, 26 Aug 2016 10:28:53 +0200 Subject: [PATCH 6/7] Added missing line breaks. --- eiffel-vocabulary/EiffelArtifactCreatedEvent.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/eiffel-vocabulary/EiffelArtifactCreatedEvent.md b/eiffel-vocabulary/EiffelArtifactCreatedEvent.md index 141a9e91..7a527a09 100644 --- a/eiffel-vocabulary/EiffelArtifactCreatedEvent.md +++ b/eiffel-vocabulary/EiffelArtifactCreatedEvent.md @@ -45,11 +45,11 @@ __Description:__ The command used to build the artifact within the identified en ### data.requiresImplementation __Type:__ String __Required:__ No -__Legal values:__ NONE, ANY, EXACTLY_ONE, AT_LEAST_ONE +__Legal values:__ NONE, ANY, EXACTLY_ONE, AT_LEAST_ONE __Description:__ Defines whether this artifact requires an implementing artifact. This is typically used for interfaces requiring some backend implementation, although the interface does not presume to define _which_ implementation. Implicitly interpreted as "ANY" if undefined. -NONE signifies that there SHALL no implementations of this artifact. In other words, a composition containing another artifact identifying it in __data.implements__ would be illegal. -ANY signifies that there may or may not be implementations of this artifact. -EXACTLY_ONE signifies that a legal composition must contain one and only one implementation of this artifact. +NONE signifies that there SHALL no implementations of this artifact. In other words, a composition containing another artifact identifying it in __data.implements__ would be illegal. +ANY signifies that there may or may not be implementations of this artifact. +EXACTLY_ONE signifies that a legal composition must contain one and only one implementation of this artifact. AT_LEAST_ONE signifies that a legal composition must contain one or more implementations of this artifact. ### data.implements From 89fd677b3c640419a01af5b72d078ffb069a3603 Mon Sep 17 00:00:00 2001 From: Daniel Stahl Date: Fri, 26 Aug 2016 10:59:40 +0200 Subject: [PATCH 7/7] Updated ArtifactCreated schema and examples. --- .../EiffelArtifactCreatedEvent/backend.json | 4 +- .../EiffelArtifactCreatedEvent/dependent.json | 4 +- .../EiffelArtifactCreatedEvent/interface.json | 4 +- schemas/EiffelArtifactCreatedEvent.json | 55 +++++++++++++++++++ 4 files changed, 64 insertions(+), 3 deletions(-) diff --git a/examples/events/EiffelArtifactCreatedEvent/backend.json b/examples/events/EiffelArtifactCreatedEvent/backend.json index 80a9c95d..954c3e21 100644 --- a/examples/events/EiffelArtifactCreatedEvent/backend.json +++ b/examples/events/EiffelArtifactCreatedEvent/backend.json @@ -3,7 +3,9 @@ "type": "EiffelArtifactCreatedEvent", "version": "1.0", "time": 1234567890, - "domainId": "example.domain", + "source": { + "domainId": "example.domain" + }, "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" }, "data": { diff --git a/examples/events/EiffelArtifactCreatedEvent/dependent.json b/examples/events/EiffelArtifactCreatedEvent/dependent.json index bd9d91a1..db22cda2 100644 --- a/examples/events/EiffelArtifactCreatedEvent/dependent.json +++ b/examples/events/EiffelArtifactCreatedEvent/dependent.json @@ -3,7 +3,9 @@ "type": "EiffelArtifactCreatedEvent", "version": "1.0", "time": 1234567890, - "domainId": "example.domain", + "source": { + "domainId": "example.domain" + }, "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" }, "data": { diff --git a/examples/events/EiffelArtifactCreatedEvent/interface.json b/examples/events/EiffelArtifactCreatedEvent/interface.json index 487b0e16..4ca39e9c 100644 --- a/examples/events/EiffelArtifactCreatedEvent/interface.json +++ b/examples/events/EiffelArtifactCreatedEvent/interface.json @@ -3,7 +3,9 @@ "type": "EiffelArtifactCreatedEvent", "version": "1.0", "time": 1234567890, - "domainId": "example.domain", + "source": { + "domainId": "example.domain" + }, "id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeee0" }, "data": { diff --git a/schemas/EiffelArtifactCreatedEvent.json b/schemas/EiffelArtifactCreatedEvent.json index d92d357d..c1925776 100644 --- a/schemas/EiffelArtifactCreatedEvent.json +++ b/schemas/EiffelArtifactCreatedEvent.json @@ -119,6 +119,61 @@ "buildCommand": { "type": "string" }, + "requiresImplementation": { + "type": "string", + "enum": [ + "NONE", + "ANY", + "EXACTLY_ONE", + "AT_LEAST_ONE" + ] + }, + "dependsOn": { + "type": "array", + "items": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "artifactId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "groupId", + "artifactId", + "version" + ], + "additionalProperties": false + } + }, + "implements": { + "type": "array", + "items": { + "type": "object", + "properties": { + "groupId": { + "type": "string" + }, + "artifactId": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "groupId", + "artifactId", + "version" + ], + "additionalProperties": false + } + }, "customData": { "type": "array", "items": {