diff --git a/.gitignore b/.gitignore index badc6d04224..fe25abd4a98 100644 --- a/.gitignore +++ b/.gitignore @@ -55,7 +55,7 @@ buildNumber.properties *.tmp *.bak *.swp -*~.nib +#*~.nib local.properties .settings/ .loadpath @@ -75,7 +75,7 @@ local.properties .worksheet # Emacs backup files -*~ +#*~ .scannerwork spock-reports @@ -119,7 +119,7 @@ gradle-app.setting # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 # gradle/wrapper/gradle-wrapper.properties -exclude ruby specifics: +#exclude ruby specifics: *.gem *.rbc @@ -203,4 +203,186 @@ DartConfiguration.tcl /.idea/codeStyles/Project.xml # Develocity -.mvn/.gradle-enterprise/ \ No newline at end of file +.mvn/.gradle-enterprise/ +/plc4j/tools/ui/frontend/frontend/node/ +/plc4j/tools/ui/frontend/frontend/node_modules/ +/plc4j/tools/ui/frontend/frontend/dist/ +/plc4j/tools/ui/backend/storage/settings/log/log.ctrl +/plc4j/tools/ui/backend/storage/settings/log/log1.dat +/plc4j/tools/ui/backend/storage/settings/log/logmirror.ctrl +/plc4j/tools/ui/backend/storage/settings/log/README_DO_NOT_TOUCH_FILES.txt +/plc4j/tools/ui/backend/storage/settings/seg0/c1a1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c1b1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c1c0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c1d1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c1e0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c1f1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2a1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2b1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2c1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2d0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2e1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c2f0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3a1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3b1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3c0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3d1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3e1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c3f1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4a1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4b0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4c1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4d0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4e1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c4f1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c10.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c20.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c31.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c41.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c51.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c60.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c71.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c81.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c90.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c101.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c111.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c121.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c130.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c141.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c150.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c161.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c171.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c180.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c191.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c200.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c211.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c221.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c230.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c241.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c251.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c260.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c271.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c281.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c290.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c300.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c311.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c321.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c331.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c340.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c351.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c361.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c371.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c380.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c391.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c400.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c411.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c421.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c430.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c441.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c451.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c461.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c470.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c481.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c490.dat +/plc4j/tools/ui/backend/storage/settings/seg0/c501.dat +/plc4j/tools/ui/backend/storage/settings/seg0/ca1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/cb1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/cc0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/cd1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/ce1.dat +/plc4j/tools/ui/backend/storage/settings/seg0/cf0.dat +/plc4j/tools/ui/backend/storage/settings/seg0/README_DO_NOT_TOUCH_FILES.txt +/plc4j/tools/ui/backend/storage/settings/db.lck +/plc4j/tools/ui/backend/storage/settings/dbex.lck +/plc4j/tools/ui/backend/storage/settings/README_DO_NOT_TOUCH_FILES.txt +/plc4j/tools/ui/backend/storage/settings/service.properties +/.idea/.name +/storage/settings/log/log.ctrl +/storage/settings/log/log1.dat +/storage/settings/log/logmirror.ctrl +/storage/settings/log/README_DO_NOT_TOUCH_FILES.txt +/storage/settings/seg0/c1a1.dat +/storage/settings/seg0/c1b1.dat +/storage/settings/seg0/c1c0.dat +/storage/settings/seg0/c1d1.dat +/storage/settings/seg0/c1e0.dat +/storage/settings/seg0/c1f1.dat +/storage/settings/seg0/c2a1.dat +/storage/settings/seg0/c2b1.dat +/storage/settings/seg0/c2c1.dat +/storage/settings/seg0/c2d0.dat +/storage/settings/seg0/c2e1.dat +/storage/settings/seg0/c2f0.dat +/storage/settings/seg0/c3a1.dat +/storage/settings/seg0/c3b1.dat +/storage/settings/seg0/c3c0.dat +/storage/settings/seg0/c3d1.dat +/storage/settings/seg0/c3e1.dat +/storage/settings/seg0/c3f1.dat +/storage/settings/seg0/c4a1.dat +/storage/settings/seg0/c4b0.dat +/storage/settings/seg0/c4c1.dat +/storage/settings/seg0/c4d0.dat +/storage/settings/seg0/c4e1.dat +/storage/settings/seg0/c4f1.dat +/storage/settings/seg0/c10.dat +/storage/settings/seg0/c20.dat +/storage/settings/seg0/c31.dat +/storage/settings/seg0/c41.dat +/storage/settings/seg0/c51.dat +/storage/settings/seg0/c60.dat +/storage/settings/seg0/c71.dat +/storage/settings/seg0/c81.dat +/storage/settings/seg0/c90.dat +/storage/settings/seg0/c101.dat +/storage/settings/seg0/c111.dat +/storage/settings/seg0/c121.dat +/storage/settings/seg0/c130.dat +/storage/settings/seg0/c141.dat +/storage/settings/seg0/c150.dat +/storage/settings/seg0/c161.dat +/storage/settings/seg0/c171.dat +/storage/settings/seg0/c180.dat +/storage/settings/seg0/c191.dat +/storage/settings/seg0/c200.dat +/storage/settings/seg0/c211.dat +/storage/settings/seg0/c221.dat +/storage/settings/seg0/c230.dat +/storage/settings/seg0/c241.dat +/storage/settings/seg0/c251.dat +/storage/settings/seg0/c260.dat +/storage/settings/seg0/c271.dat +/storage/settings/seg0/c281.dat +/storage/settings/seg0/c290.dat +/storage/settings/seg0/c300.dat +/storage/settings/seg0/c311.dat +/storage/settings/seg0/c321.dat +/storage/settings/seg0/c331.dat +/storage/settings/seg0/c340.dat +/storage/settings/seg0/c351.dat +/storage/settings/seg0/c361.dat +/storage/settings/seg0/c371.dat +/storage/settings/seg0/c380.dat +/storage/settings/seg0/c391.dat +/storage/settings/seg0/c400.dat +/storage/settings/seg0/c411.dat +/storage/settings/seg0/c421.dat +/storage/settings/seg0/c430.dat +/storage/settings/seg0/c441.dat +/storage/settings/seg0/c451.dat +/storage/settings/seg0/c461.dat +/storage/settings/seg0/c470.dat +/storage/settings/seg0/c481.dat +/storage/settings/seg0/c490.dat +/storage/settings/seg0/c501.dat +/storage/settings/seg0/ca1.dat +/storage/settings/seg0/cb1.dat +/storage/settings/seg0/cc0.dat +/storage/settings/seg0/cd1.dat +/storage/settings/seg0/ce1.dat +/storage/settings/seg0/cf0.dat +/storage/settings/seg0/README_DO_NOT_TOUCH_FILES.txt +/storage/settings/db.lck +/storage/settings/dbex.lck +/storage/settings/README_DO_NOT_TOUCH_FILES.txt +/storage/settings/service.properties diff --git a/Dockerfile b/Dockerfile index 467c7f11034..1ecd1c72712 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ # This is the image we'll use to execute the build (and give it the name 'build'). # (This image is based on Ubuntu) # Fixed version of this in order to have a fixed JDK version -FROM azul/zulu-openjdk:11 as build +FROM azul/zulu-openjdk:17 as build # Install some stuff we need to run the build RUN apt update -y diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java deleted file mode 100644 index 7357127265f..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public abstract class TypeSwitchInTypeSwitchParentType implements Message { - - // Abstract accessors for discriminator values. - public abstract Short getTypeNumber(); - - // Properties. - protected final short parentFieldHurz; - - public TypeSwitchInTypeSwitchParentType(short parentFieldHurz) { - super(); - this.parentFieldHurz = parentFieldHurz; - } - - public short getParentFieldHurz() { - return parentFieldHurz; - } - - protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer) - throws SerializationException; - - public void serialize(WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentType"); - - // Discriminator Field (typeNumber) (Used as input to a switch field) - writeDiscriminatorField("typeNumber", getTypeNumber(), writeUnsignedShort(writeBuffer, 8)); - - // Simple Field (parentFieldHurz) - writeSimpleField("parentFieldHurz", parentFieldHurz, writeUnsignedShort(writeBuffer, 8)); - - // Switch field (Serialize the sub-type) - serializeTypeSwitchInTypeSwitchParentTypeChild(writeBuffer); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentType"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = 0; - TypeSwitchInTypeSwitchParentType _value = this; - - // Discriminator Field (typeNumber) - lengthInBits += 8; - - // Simple field (parentFieldHurz) - lengthInBits += 8; - - // Length of sub-type elements will be added by sub-type... - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentType staticParse(ReadBuffer readBuffer, Object... args) - throws ParseException { - PositionAware positionAware = readBuffer; - return staticParse(readBuffer); - } - - public static TypeSwitchInTypeSwitchParentType staticParse(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentType"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short typeNumber = readDiscriminatorField("typeNumber", readUnsignedShort(readBuffer, 8)); - - short parentFieldHurz = readSimpleField("parentFieldHurz", readUnsignedShort(readBuffer, 8)); - - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) - TypeSwitchInTypeSwitchParentTypeBuilder builder = null; - if (EvaluationHelper.equals(typeNumber, (short) 0x00)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0.staticParseTypeSwitchInTypeSwitchParentTypeBuilder( - readBuffer); - } else if (EvaluationHelper.equals(typeNumber, (short) 0x10)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild1.staticParseTypeSwitchInTypeSwitchParentTypeBuilder( - readBuffer); - } else if (EvaluationHelper.equals(typeNumber, (short) 0x20)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild2.staticParseTypeSwitchInTypeSwitchParentTypeBuilder( - readBuffer); - } - if (builder == null) { - throw new ParseException( - "Unsupported case for discriminated type" - + " parameters [" - + "typeNumber=" - + typeNumber - + "]"); - } - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentType"); - // Create the instance - TypeSwitchInTypeSwitchParentType _typeSwitchInTypeSwitchParentType = - builder.build(parentFieldHurz); - return _typeSwitchInTypeSwitchParentType; - } - - public interface TypeSwitchInTypeSwitchParentTypeBuilder { - TypeSwitchInTypeSwitchParentType build(short parentFieldHurz); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentType)) { - return false; - } - TypeSwitchInTypeSwitchParentType that = (TypeSwitchInTypeSwitchParentType) o; - return (getParentFieldHurz() == that.getParentFieldHurz()) && true; - } - - @Override - public int hashCode() { - return Objects.hash(getParentFieldHurz()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java deleted file mode 100644 index 01ba553c16b..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public abstract class TypeSwitchInTypeSwitchParentTypeChild0 - extends TypeSwitchInTypeSwitchParentType implements Message { - - // Accessors for discriminator values. - public Short getTypeNumber() { - return (short) 0x00; - } - // Abstract accessors for discriminator values. - public abstract Short getChildNumber(); - - // Properties. - protected final short childFieldwolf; - - public TypeSwitchInTypeSwitchParentTypeChild0(short parentFieldHurz, short childFieldwolf) { - super(parentFieldHurz); - this.childFieldwolf = childFieldwolf; - } - - public short getChildFieldwolf() { - return childFieldwolf; - } - - protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild0Child( - WriteBuffer writeBuffer) throws SerializationException; - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0"); - - // Discriminator Field (childNumber) (Used as input to a switch field) - writeDiscriminatorField("childNumber", getChildNumber(), writeUnsignedShort(writeBuffer, 8)); - - // Simple Field (childFieldwolf) - writeSimpleField("childFieldwolf", childFieldwolf, writeUnsignedShort(writeBuffer, 8)); - - // Switch field (Serialize the sub-type) - serializeTypeSwitchInTypeSwitchParentTypeChild0Child(writeBuffer); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0 _value = this; - - // Discriminator Field (childNumber) - lengthInBits += 8; - - // Simple field (childFieldwolf) - lengthInBits += 8; - - // Length of sub-type elements will be added by sub-type... - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeBuilder - staticParseTypeSwitchInTypeSwitchParentTypeBuilder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short childNumber = readDiscriminatorField("childNumber", readUnsignedShort(readBuffer, 8)); - - short childFieldwolf = readSimpleField("childFieldwolf", readUnsignedShort(readBuffer, 8)); - - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) - TypeSwitchInTypeSwitchParentTypeChild0Builder builder = null; - if (EvaluationHelper.equals(childNumber, (short) 0x01)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0Infant0 - .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x02)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0Infant1 - .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x03)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0Infant2 - .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer); - } - if (builder == null) { - throw new ParseException( - "Unsupported case for discriminated type" - + " parameters [" - + "childNumber=" - + childNumber - + "]"); - } - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl(childFieldwolf, builder); - } - - public interface TypeSwitchInTypeSwitchParentTypeChild0Builder { - TypeSwitchInTypeSwitchParentTypeChild0 build(short parentFieldHurz, short childFieldwolf); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl - implements TypeSwitchInTypeSwitchParentType.TypeSwitchInTypeSwitchParentTypeBuilder { - private final short childFieldwolf; - private final TypeSwitchInTypeSwitchParentTypeChild0Builder builder; - - public TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl( - short childFieldwolf, TypeSwitchInTypeSwitchParentTypeChild0Builder builder) { - - this.childFieldwolf = childFieldwolf; - this.builder = builder; - } - - public TypeSwitchInTypeSwitchParentTypeChild0 build(short parentFieldHurz) { - return builder.build(parentFieldHurz, childFieldwolf); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0 that = (TypeSwitchInTypeSwitchParentTypeChild0) o; - return (getChildFieldwolf() == that.getChildFieldwolf()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getChildFieldwolf()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java deleted file mode 100644 index 0f86a2ba7b3..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public abstract class TypeSwitchInTypeSwitchParentTypeChild0Infant0 - extends TypeSwitchInTypeSwitchParentTypeChild0 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x01; - } - // Abstract accessors for discriminator values. - public abstract Short getInfantNumber(); - - // Properties. - protected final short infantSomeField00; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0( - short parentFieldHurz, short childFieldwolf, short infantSomeField00) { - super(parentFieldHurz, childFieldwolf); - this.infantSomeField00 = infantSomeField00; - } - - public short getInfantSomeField00() { - return infantSomeField00; - } - - protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child( - WriteBuffer writeBuffer) throws SerializationException; - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0"); - - // Discriminator Field (infantNumber) (Used as input to a switch field) - writeDiscriminatorField("infantNumber", getInfantNumber(), writeUnsignedShort(writeBuffer, 8)); - - // Simple Field (infantSomeField00) - writeSimpleField("infantSomeField00", infantSomeField00, writeUnsignedShort(writeBuffer, 8)); - - // Switch field (Serialize the sub-type) - serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child(writeBuffer); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0Infant0 _value = this; - - // Discriminator Field (infantNumber) - lengthInBits += 8; - - // Simple field (infantSomeField00) - lengthInBits += 8; - - // Length of sub-type elements will be added by sub-type... - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild0Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantNumber = readDiscriminatorField("infantNumber", readUnsignedShort(readBuffer, 8)); - - short infantSomeField00 = - readSimpleField("infantSomeField00", readUnsignedShort(readBuffer, 8)); - - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) - TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder builder = null; - if (EvaluationHelper.equals(infantNumber, (short) 0x98)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 - .staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(readBuffer); - } else if (EvaluationHelper.equals(infantNumber, (short) 0x99)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 - .staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(readBuffer); - } - if (builder == null) { - throw new ParseException( - "Unsupported case for discriminated type" - + " parameters [" - + "infantNumber=" - + infantNumber - + "]"); - } - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0Infant0BuilderImpl(infantSomeField00, builder); - } - - public interface TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder { - TypeSwitchInTypeSwitchParentTypeChild0Infant0 build( - short parentFieldHurz, short childFieldwolf, short infantSomeField00); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0Infant0BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild0 - .TypeSwitchInTypeSwitchParentTypeChild0Builder { - private final short infantSomeField00; - private final TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder builder; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0BuilderImpl( - short infantSomeField00, TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder builder) { - - this.infantSomeField00 = infantSomeField00; - this.builder = builder; - } - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0 build( - short parentFieldHurz, short childFieldwolf) { - return builder.build(parentFieldHurz, childFieldwolf, infantSomeField00); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0Infant0)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0Infant0 that = - (TypeSwitchInTypeSwitchParentTypeChild0Infant0) o; - return (getInfantSomeField00() == that.getInfantSomeField00()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField00()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0.java deleted file mode 100644 index d93427bb2ed..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 - extends TypeSwitchInTypeSwitchParentTypeChild0Infant0 implements Message { - - // Accessors for discriminator values. - public Short getInfantNumber() { - return (short) 0x98; - } - - // Properties. - protected final short infantsChild0SomeField00; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0( - short parentFieldHurz, - short childFieldwolf, - short infantSomeField00, - short infantsChild0SomeField00) { - super(parentFieldHurz, childFieldwolf, infantSomeField00); - this.infantsChild0SomeField00 = infantsChild0SomeField00; - } - - public short getInfantsChild0SomeField00() { - return infantsChild0SomeField00; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child( - WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0"); - - // Simple Field (infantsChild0SomeField00) - writeSimpleField( - "infantsChild0SomeField00", infantsChild0SomeField00, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 _value = this; - - // Simple field (infantsChild0SomeField00) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantsChild0SomeField00 = - readSimpleField("infantsChild0SomeField00", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0BuilderImpl( - infantsChild0SomeField00); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild0Infant0 - .TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder { - private final short infantsChild0SomeField00; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0BuilderImpl( - short infantsChild0SomeField00) { - - this.infantsChild0SomeField00 = infantsChild0SomeField00; - } - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 build( - short parentFieldHurz, short childFieldwolf, short infantSomeField00) { - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 - typeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 = - new TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0( - parentFieldHurz, childFieldwolf, infantSomeField00, infantsChild0SomeField00); - return typeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0 that = - (TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0) o; - return (getInfantsChild0SomeField00() == that.getInfantsChild0SomeField00()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantsChild0SomeField00()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1.java deleted file mode 100644 index 791dab20b32..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 - extends TypeSwitchInTypeSwitchParentTypeChild0Infant0 implements Message { - - // Accessors for discriminator values. - public Short getInfantNumber() { - return (short) 0x99; - } - - // Properties. - protected final short infantsChild1SomeField00; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1( - short parentFieldHurz, - short childFieldwolf, - short infantSomeField00, - short infantsChild1SomeField00) { - super(parentFieldHurz, childFieldwolf, infantSomeField00); - this.infantsChild1SomeField00 = infantsChild1SomeField00; - } - - public short getInfantsChild1SomeField00() { - return infantsChild1SomeField00; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child( - WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1"); - - // Simple Field (infantsChild1SomeField00) - writeSimpleField( - "infantsChild1SomeField00", infantsChild1SomeField00, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 _value = this; - - // Simple field (infantsChild1SomeField00) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantsChild1SomeField00 = - readSimpleField("infantsChild1SomeField00", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1BuilderImpl( - infantsChild1SomeField00); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild0Infant0 - .TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder { - private final short infantsChild1SomeField00; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1BuilderImpl( - short infantsChild1SomeField00) { - - this.infantsChild1SomeField00 = infantsChild1SomeField00; - } - - public TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 build( - short parentFieldHurz, short childFieldwolf, short infantSomeField00) { - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 - typeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 = - new TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1( - parentFieldHurz, childFieldwolf, infantSomeField00, infantsChild1SomeField00); - return typeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1 that = - (TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1) o; - return (getInfantsChild1SomeField00() == that.getInfantsChild1SomeField00()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantsChild1SomeField00()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant1.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant1.java deleted file mode 100644 index be4fb44dc57..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant1.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild0Infant1 - extends TypeSwitchInTypeSwitchParentTypeChild0 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x02; - } - - // Properties. - protected final short infantSomeField01; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant1( - short parentFieldHurz, short childFieldwolf, short infantSomeField01) { - super(parentFieldHurz, childFieldwolf); - this.infantSomeField01 = infantSomeField01; - } - - public short getInfantSomeField01() { - return infantSomeField01; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant1"); - - // Simple Field (infantSomeField01) - writeSimpleField("infantSomeField01", infantSomeField01, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant1"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0Infant1 _value = this; - - // Simple field (infantSomeField01) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild0Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant1"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField01 = - readSimpleField("infantSomeField01", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0Infant1"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0Infant1BuilderImpl(infantSomeField01); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0Infant1BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild0 - .TypeSwitchInTypeSwitchParentTypeChild0Builder { - private final short infantSomeField01; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant1BuilderImpl(short infantSomeField01) { - - this.infantSomeField01 = infantSomeField01; - } - - public TypeSwitchInTypeSwitchParentTypeChild0Infant1 build( - short parentFieldHurz, short childFieldwolf) { - TypeSwitchInTypeSwitchParentTypeChild0Infant1 typeSwitchInTypeSwitchParentTypeChild0Infant1 = - new TypeSwitchInTypeSwitchParentTypeChild0Infant1( - parentFieldHurz, childFieldwolf, infantSomeField01); - return typeSwitchInTypeSwitchParentTypeChild0Infant1; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0Infant1)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0Infant1 that = - (TypeSwitchInTypeSwitchParentTypeChild0Infant1) o; - return (getInfantSomeField01() == that.getInfantSomeField01()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField01()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant2.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant2.java deleted file mode 100644 index 2306c216969..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant2.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild0Infant2 - extends TypeSwitchInTypeSwitchParentTypeChild0 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x03; - } - - // Properties. - protected final short infantSomeField02; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant2( - short parentFieldHurz, short childFieldwolf, short infantSomeField02) { - super(parentFieldHurz, childFieldwolf); - this.infantSomeField02 = infantSomeField02; - } - - public short getInfantSomeField02() { - return infantSomeField02; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant2"); - - // Simple Field (infantSomeField02) - writeSimpleField("infantSomeField02", infantSomeField02, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant2"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild0Infant2 _value = this; - - // Simple field (infantSomeField02) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild0Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant2"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField02 = - readSimpleField("infantSomeField02", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0Infant2"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild0Infant2BuilderImpl(infantSomeField02); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild0Infant2BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild0 - .TypeSwitchInTypeSwitchParentTypeChild0Builder { - private final short infantSomeField02; - - public TypeSwitchInTypeSwitchParentTypeChild0Infant2BuilderImpl(short infantSomeField02) { - - this.infantSomeField02 = infantSomeField02; - } - - public TypeSwitchInTypeSwitchParentTypeChild0Infant2 build( - short parentFieldHurz, short childFieldwolf) { - TypeSwitchInTypeSwitchParentTypeChild0Infant2 typeSwitchInTypeSwitchParentTypeChild0Infant2 = - new TypeSwitchInTypeSwitchParentTypeChild0Infant2( - parentFieldHurz, childFieldwolf, infantSomeField02); - return typeSwitchInTypeSwitchParentTypeChild0Infant2; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0Infant2)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild0Infant2 that = - (TypeSwitchInTypeSwitchParentTypeChild0Infant2) o; - return (getInfantSomeField02() == that.getInfantSomeField02()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField02()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1.java deleted file mode 100644 index 8c20ac32920..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public abstract class TypeSwitchInTypeSwitchParentTypeChild1 - extends TypeSwitchInTypeSwitchParentType implements Message { - - // Accessors for discriminator values. - public Short getTypeNumber() { - return (short) 0x10; - } - // Abstract accessors for discriminator values. - public abstract Short getChildNumber(); - - // Properties. - protected final short childFieldLamm; - - public TypeSwitchInTypeSwitchParentTypeChild1(short parentFieldHurz, short childFieldLamm) { - super(parentFieldHurz); - this.childFieldLamm = childFieldLamm; - } - - public short getChildFieldLamm() { - return childFieldLamm; - } - - protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild1Child( - WriteBuffer writeBuffer) throws SerializationException; - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild1"); - - // Discriminator Field (childNumber) (Used as input to a switch field) - writeDiscriminatorField("childNumber", getChildNumber(), writeUnsignedShort(writeBuffer, 8)); - - // Simple Field (childFieldLamm) - writeSimpleField("childFieldLamm", childFieldLamm, writeUnsignedShort(writeBuffer, 8)); - - // Switch field (Serialize the sub-type) - serializeTypeSwitchInTypeSwitchParentTypeChild1Child(writeBuffer); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild1"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild1 _value = this; - - // Discriminator Field (childNumber) - lengthInBits += 8; - - // Simple field (childFieldLamm) - lengthInBits += 8; - - // Length of sub-type elements will be added by sub-type... - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeBuilder - staticParseTypeSwitchInTypeSwitchParentTypeBuilder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild1"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short childNumber = readDiscriminatorField("childNumber", readUnsignedShort(readBuffer, 8)); - - short childFieldLamm = readSimpleField("childFieldLamm", readUnsignedShort(readBuffer, 8)); - - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) - TypeSwitchInTypeSwitchParentTypeChild1Builder builder = null; - if (EvaluationHelper.equals(childNumber, (short) 0x11)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild1Infant3 - .staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x12)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild1Infant4 - .staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x13)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild1Infant5 - .staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(readBuffer); - } - if (builder == null) { - throw new ParseException( - "Unsupported case for discriminated type" - + " parameters [" - + "childNumber=" - + childNumber - + "]"); - } - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild1"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild1BuilderImpl(childFieldLamm, builder); - } - - public interface TypeSwitchInTypeSwitchParentTypeChild1Builder { - TypeSwitchInTypeSwitchParentTypeChild1 build(short parentFieldHurz, short childFieldLamm); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild1BuilderImpl - implements TypeSwitchInTypeSwitchParentType.TypeSwitchInTypeSwitchParentTypeBuilder { - private final short childFieldLamm; - private final TypeSwitchInTypeSwitchParentTypeChild1Builder builder; - - public TypeSwitchInTypeSwitchParentTypeChild1BuilderImpl( - short childFieldLamm, TypeSwitchInTypeSwitchParentTypeChild1Builder builder) { - - this.childFieldLamm = childFieldLamm; - this.builder = builder; - } - - public TypeSwitchInTypeSwitchParentTypeChild1 build(short parentFieldHurz) { - return builder.build(parentFieldHurz, childFieldLamm); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild1)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild1 that = (TypeSwitchInTypeSwitchParentTypeChild1) o; - return (getChildFieldLamm() == that.getChildFieldLamm()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getChildFieldLamm()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant3.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant3.java deleted file mode 100644 index 931fb4cb482..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant3.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild1Infant3 - extends TypeSwitchInTypeSwitchParentTypeChild1 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x11; - } - - // Properties. - protected final short infantSomeField1; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant3( - short parentFieldHurz, short childFieldLamm, short infantSomeField1) { - super(parentFieldHurz, childFieldLamm); - this.infantSomeField1 = infantSomeField1; - } - - public short getInfantSomeField1() { - return infantSomeField1; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild1Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild1Infant3"); - - // Simple Field (infantSomeField1) - writeSimpleField("infantSomeField1", infantSomeField1, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild1Infant3"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild1Infant3 _value = this; - - // Simple field (infantSomeField1) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild1Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild1Infant3"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField1 = readSimpleField("infantSomeField1", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild1Infant3"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild1Infant3BuilderImpl(infantSomeField1); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild1Infant3BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild1 - .TypeSwitchInTypeSwitchParentTypeChild1Builder { - private final short infantSomeField1; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant3BuilderImpl(short infantSomeField1) { - - this.infantSomeField1 = infantSomeField1; - } - - public TypeSwitchInTypeSwitchParentTypeChild1Infant3 build( - short parentFieldHurz, short childFieldLamm) { - TypeSwitchInTypeSwitchParentTypeChild1Infant3 typeSwitchInTypeSwitchParentTypeChild1Infant3 = - new TypeSwitchInTypeSwitchParentTypeChild1Infant3( - parentFieldHurz, childFieldLamm, infantSomeField1); - return typeSwitchInTypeSwitchParentTypeChild1Infant3; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild1Infant3)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild1Infant3 that = - (TypeSwitchInTypeSwitchParentTypeChild1Infant3) o; - return (getInfantSomeField1() == that.getInfantSomeField1()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField1()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant4.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant4.java deleted file mode 100644 index 884733ee45d..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant4.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild1Infant4 - extends TypeSwitchInTypeSwitchParentTypeChild1 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x12; - } - - // Properties. - protected final short infantSomeField11; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant4( - short parentFieldHurz, short childFieldLamm, short infantSomeField11) { - super(parentFieldHurz, childFieldLamm); - this.infantSomeField11 = infantSomeField11; - } - - public short getInfantSomeField11() { - return infantSomeField11; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild1Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild1Infant4"); - - // Simple Field (infantSomeField11) - writeSimpleField("infantSomeField11", infantSomeField11, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild1Infant4"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild1Infant4 _value = this; - - // Simple field (infantSomeField11) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild1Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild1Infant4"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField11 = - readSimpleField("infantSomeField11", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild1Infant4"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild1Infant4BuilderImpl(infantSomeField11); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild1Infant4BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild1 - .TypeSwitchInTypeSwitchParentTypeChild1Builder { - private final short infantSomeField11; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant4BuilderImpl(short infantSomeField11) { - - this.infantSomeField11 = infantSomeField11; - } - - public TypeSwitchInTypeSwitchParentTypeChild1Infant4 build( - short parentFieldHurz, short childFieldLamm) { - TypeSwitchInTypeSwitchParentTypeChild1Infant4 typeSwitchInTypeSwitchParentTypeChild1Infant4 = - new TypeSwitchInTypeSwitchParentTypeChild1Infant4( - parentFieldHurz, childFieldLamm, infantSomeField11); - return typeSwitchInTypeSwitchParentTypeChild1Infant4; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild1Infant4)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild1Infant4 that = - (TypeSwitchInTypeSwitchParentTypeChild1Infant4) o; - return (getInfantSomeField11() == that.getInfantSomeField11()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField11()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant5.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant5.java deleted file mode 100644 index e4955cad745..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant5.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild1Infant5 - extends TypeSwitchInTypeSwitchParentTypeChild1 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x13; - } - - // Properties. - protected final short infantSomeField12; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant5( - short parentFieldHurz, short childFieldLamm, short infantSomeField12) { - super(parentFieldHurz, childFieldLamm); - this.infantSomeField12 = infantSomeField12; - } - - public short getInfantSomeField12() { - return infantSomeField12; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild1Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild1Infant5"); - - // Simple Field (infantSomeField12) - writeSimpleField("infantSomeField12", infantSomeField12, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild1Infant5"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild1Infant5 _value = this; - - // Simple field (infantSomeField12) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild1Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild1Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild1Infant5"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField12 = - readSimpleField("infantSomeField12", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild1Infant5"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild1Infant5BuilderImpl(infantSomeField12); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild1Infant5BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild1 - .TypeSwitchInTypeSwitchParentTypeChild1Builder { - private final short infantSomeField12; - - public TypeSwitchInTypeSwitchParentTypeChild1Infant5BuilderImpl(short infantSomeField12) { - - this.infantSomeField12 = infantSomeField12; - } - - public TypeSwitchInTypeSwitchParentTypeChild1Infant5 build( - short parentFieldHurz, short childFieldLamm) { - TypeSwitchInTypeSwitchParentTypeChild1Infant5 typeSwitchInTypeSwitchParentTypeChild1Infant5 = - new TypeSwitchInTypeSwitchParentTypeChild1Infant5( - parentFieldHurz, childFieldLamm, infantSomeField12); - return typeSwitchInTypeSwitchParentTypeChild1Infant5; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild1Infant5)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild1Infant5 that = - (TypeSwitchInTypeSwitchParentTypeChild1Infant5) o; - return (getInfantSomeField12() == that.getInfantSomeField12()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField12()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2.java deleted file mode 100644 index 386af1bbbc4..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public abstract class TypeSwitchInTypeSwitchParentTypeChild2 - extends TypeSwitchInTypeSwitchParentType implements Message { - - // Accessors for discriminator values. - public Short getTypeNumber() { - return (short) 0x20; - } - // Abstract accessors for discriminator values. - public abstract Short getChildNumber(); - - // Properties. - protected final short childFieldGrueneWiese; - - public TypeSwitchInTypeSwitchParentTypeChild2( - short parentFieldHurz, short childFieldGrueneWiese) { - super(parentFieldHurz); - this.childFieldGrueneWiese = childFieldGrueneWiese; - } - - public short getChildFieldGrueneWiese() { - return childFieldGrueneWiese; - } - - protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild2Child( - WriteBuffer writeBuffer) throws SerializationException; - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild2"); - - // Discriminator Field (childNumber) (Used as input to a switch field) - writeDiscriminatorField("childNumber", getChildNumber(), writeUnsignedShort(writeBuffer, 8)); - - // Simple Field (childFieldGrueneWiese) - writeSimpleField( - "childFieldGrueneWiese", childFieldGrueneWiese, writeUnsignedShort(writeBuffer, 8)); - - // Switch field (Serialize the sub-type) - serializeTypeSwitchInTypeSwitchParentTypeChild2Child(writeBuffer); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild2"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild2 _value = this; - - // Discriminator Field (childNumber) - lengthInBits += 8; - - // Simple field (childFieldGrueneWiese) - lengthInBits += 8; - - // Length of sub-type elements will be added by sub-type... - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeBuilder - staticParseTypeSwitchInTypeSwitchParentTypeBuilder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild2"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short childNumber = readDiscriminatorField("childNumber", readUnsignedShort(readBuffer, 8)); - - short childFieldGrueneWiese = - readSimpleField("childFieldGrueneWiese", readUnsignedShort(readBuffer, 8)); - - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) - TypeSwitchInTypeSwitchParentTypeChild2Builder builder = null; - if (EvaluationHelper.equals(childNumber, (short) 0x21)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild2Infant6 - .staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x22)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild2Infant7 - .staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(readBuffer); - } else if (EvaluationHelper.equals(childNumber, (short) 0x23)) { - builder = - TypeSwitchInTypeSwitchParentTypeChild2Infant8 - .staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(readBuffer); - } - if (builder == null) { - throw new ParseException( - "Unsupported case for discriminated type" - + " parameters [" - + "childNumber=" - + childNumber - + "]"); - } - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild2"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild2BuilderImpl(childFieldGrueneWiese, builder); - } - - public interface TypeSwitchInTypeSwitchParentTypeChild2Builder { - TypeSwitchInTypeSwitchParentTypeChild2 build( - short parentFieldHurz, short childFieldGrueneWiese); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild2BuilderImpl - implements TypeSwitchInTypeSwitchParentType.TypeSwitchInTypeSwitchParentTypeBuilder { - private final short childFieldGrueneWiese; - private final TypeSwitchInTypeSwitchParentTypeChild2Builder builder; - - public TypeSwitchInTypeSwitchParentTypeChild2BuilderImpl( - short childFieldGrueneWiese, TypeSwitchInTypeSwitchParentTypeChild2Builder builder) { - - this.childFieldGrueneWiese = childFieldGrueneWiese; - this.builder = builder; - } - - public TypeSwitchInTypeSwitchParentTypeChild2 build(short parentFieldHurz) { - return builder.build(parentFieldHurz, childFieldGrueneWiese); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild2)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild2 that = (TypeSwitchInTypeSwitchParentTypeChild2) o; - return (getChildFieldGrueneWiese() == that.getChildFieldGrueneWiese()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getChildFieldGrueneWiese()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant6.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant6.java deleted file mode 100644 index 32421b31422..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant6.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild2Infant6 - extends TypeSwitchInTypeSwitchParentTypeChild2 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x21; - } - - // Properties. - protected final short infantSomeField21; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant6( - short parentFieldHurz, short childFieldGrueneWiese, short infantSomeField21) { - super(parentFieldHurz, childFieldGrueneWiese); - this.infantSomeField21 = infantSomeField21; - } - - public short getInfantSomeField21() { - return infantSomeField21; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild2Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild2Infant6"); - - // Simple Field (infantSomeField21) - writeSimpleField("infantSomeField21", infantSomeField21, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild2Infant6"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild2Infant6 _value = this; - - // Simple field (infantSomeField21) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild2Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild2Infant6"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField21 = - readSimpleField("infantSomeField21", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild2Infant6"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild2Infant6BuilderImpl(infantSomeField21); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild2Infant6BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild2 - .TypeSwitchInTypeSwitchParentTypeChild2Builder { - private final short infantSomeField21; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant6BuilderImpl(short infantSomeField21) { - - this.infantSomeField21 = infantSomeField21; - } - - public TypeSwitchInTypeSwitchParentTypeChild2Infant6 build( - short parentFieldHurz, short childFieldGrueneWiese) { - TypeSwitchInTypeSwitchParentTypeChild2Infant6 typeSwitchInTypeSwitchParentTypeChild2Infant6 = - new TypeSwitchInTypeSwitchParentTypeChild2Infant6( - parentFieldHurz, childFieldGrueneWiese, infantSomeField21); - return typeSwitchInTypeSwitchParentTypeChild2Infant6; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild2Infant6)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild2Infant6 that = - (TypeSwitchInTypeSwitchParentTypeChild2Infant6) o; - return (getInfantSomeField21() == that.getInfantSomeField21()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField21()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant7.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant7.java deleted file mode 100644 index 4dd8c294b4b..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant7.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild2Infant7 - extends TypeSwitchInTypeSwitchParentTypeChild2 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x22; - } - - // Properties. - protected final short infantSomeField22; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant7( - short parentFieldHurz, short childFieldGrueneWiese, short infantSomeField22) { - super(parentFieldHurz, childFieldGrueneWiese); - this.infantSomeField22 = infantSomeField22; - } - - public short getInfantSomeField22() { - return infantSomeField22; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild2Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild2Infant7"); - - // Simple Field (infantSomeField22) - writeSimpleField("infantSomeField22", infantSomeField22, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild2Infant7"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild2Infant7 _value = this; - - // Simple field (infantSomeField22) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild2Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild2Infant7"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField22 = - readSimpleField("infantSomeField22", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild2Infant7"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild2Infant7BuilderImpl(infantSomeField22); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild2Infant7BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild2 - .TypeSwitchInTypeSwitchParentTypeChild2Builder { - private final short infantSomeField22; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant7BuilderImpl(short infantSomeField22) { - - this.infantSomeField22 = infantSomeField22; - } - - public TypeSwitchInTypeSwitchParentTypeChild2Infant7 build( - short parentFieldHurz, short childFieldGrueneWiese) { - TypeSwitchInTypeSwitchParentTypeChild2Infant7 typeSwitchInTypeSwitchParentTypeChild2Infant7 = - new TypeSwitchInTypeSwitchParentTypeChild2Infant7( - parentFieldHurz, childFieldGrueneWiese, infantSomeField22); - return typeSwitchInTypeSwitchParentTypeChild2Infant7; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild2Infant7)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild2Infant7 that = - (TypeSwitchInTypeSwitchParentTypeChild2Infant7) o; - return (getInfantSomeField22() == that.getInfantSomeField22()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField22()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant8.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant8.java deleted file mode 100644 index c86907358fc..00000000000 --- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant8.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.test.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class TypeSwitchInTypeSwitchParentTypeChild2Infant8 - extends TypeSwitchInTypeSwitchParentTypeChild2 implements Message { - - // Accessors for discriminator values. - public Short getChildNumber() { - return (short) 0x23; - } - - // Properties. - protected final short infantSomeField23; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant8( - short parentFieldHurz, short childFieldGrueneWiese, short infantSomeField23) { - super(parentFieldHurz, childFieldGrueneWiese); - this.infantSomeField23 = infantSomeField23; - } - - public short getInfantSomeField23() { - return infantSomeField23; - } - - @Override - protected void serializeTypeSwitchInTypeSwitchParentTypeChild2Child(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - int startPos = positionAware.getPos(); - writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild2Infant8"); - - // Simple Field (infantSomeField23) - writeSimpleField("infantSomeField23", infantSomeField23, writeUnsignedShort(writeBuffer, 8)); - - writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild2Infant8"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - TypeSwitchInTypeSwitchParentTypeChild2Infant8 _value = this; - - // Simple field (infantSomeField23) - lengthInBits += 8; - - return lengthInBits; - } - - public static TypeSwitchInTypeSwitchParentTypeChild2Builder - staticParseTypeSwitchInTypeSwitchParentTypeChild2Builder(ReadBuffer readBuffer) - throws ParseException { - readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild2Infant8"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - - short infantSomeField23 = - readSimpleField("infantSomeField23", readUnsignedShort(readBuffer, 8)); - - readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild2Infant8"); - // Create the instance - return new TypeSwitchInTypeSwitchParentTypeChild2Infant8BuilderImpl(infantSomeField23); - } - - public static class TypeSwitchInTypeSwitchParentTypeChild2Infant8BuilderImpl - implements TypeSwitchInTypeSwitchParentTypeChild2 - .TypeSwitchInTypeSwitchParentTypeChild2Builder { - private final short infantSomeField23; - - public TypeSwitchInTypeSwitchParentTypeChild2Infant8BuilderImpl(short infantSomeField23) { - - this.infantSomeField23 = infantSomeField23; - } - - public TypeSwitchInTypeSwitchParentTypeChild2Infant8 build( - short parentFieldHurz, short childFieldGrueneWiese) { - TypeSwitchInTypeSwitchParentTypeChild2Infant8 typeSwitchInTypeSwitchParentTypeChild2Infant8 = - new TypeSwitchInTypeSwitchParentTypeChild2Infant8( - parentFieldHurz, childFieldGrueneWiese, infantSomeField23); - return typeSwitchInTypeSwitchParentTypeChild2Infant8; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild2Infant8)) { - return false; - } - TypeSwitchInTypeSwitchParentTypeChild2Infant8 that = - (TypeSwitchInTypeSwitchParentTypeChild2Infant8) o; - return (getInfantSomeField23() == that.getInfantSomeField23()) && super.equals(that) && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getInfantSomeField23()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/docker-compose.yaml b/docker-compose.yaml index 8d88c202326..8014e944bf9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -23,7 +23,7 @@ services: build: context: . dockerfile: Dockerfile - command: ["/ws/mvnw", "-e", "-Dskip-pgp-signing=true", "-P", "with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,apache-release", "-Dmaven.repo.local=/ws/out/.repository", "-DaltDeploymentRepository=snapshot-repo::default::file:/ws/out/.local-snapshots-dir", "clean", "deploy"] + command: ["/ws/mvnw", "-e", "-Dskip-pgp-signing=true", "-P", "with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,apache-release", "-Dmaven.repo.local=/ws/out/.repository", "clean", "install"] volumes: # Bind the local directory as "/ws" - type: bind diff --git a/plc4go/pom.xml b/plc4go/pom.xml index e1be676fb53..6ca4ce1b7de 100644 --- a/plc4go/pom.xml +++ b/plc4go/pom.xml @@ -454,6 +454,7 @@ exec + ${skipTests} ${project.build.directory}/go-junit-report -in diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go index a11ceb44197..a391a945bc9 100644 --- a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go +++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go @@ -1494,6 +1494,9 @@ const ( BACnetVendorId_AETERLINK_CORPORATION BACnetVendorId = 1457 BACnetVendorId_ALPHA_EPSILON_AUTOMATION BACnetVendorId = 1458 BACnetVendorId_ASTRALITE_INC BACnetVendorId = 1459 + BACnetVendorId_DELTA_FIRE_LTDA BACnetVendorId = 1460 + BACnetVendorId_BOCK_WATER_HEATERS_INC BACnetVendorId = 1461 + BACnetVendorId_CLEAVER_BROOKS BACnetVendorId = 1462 BACnetVendorId_UNKNOWN_VENDOR BACnetVendorId = 0xFFFF ) @@ -2953,6 +2956,9 @@ func init() { BACnetVendorId_AETERLINK_CORPORATION, BACnetVendorId_ALPHA_EPSILON_AUTOMATION, BACnetVendorId_ASTRALITE_INC, + BACnetVendorId_DELTA_FIRE_LTDA, + BACnetVendorId_BOCK_WATER_HEATERS_INC, + BACnetVendorId_CLEAVER_BROOKS, BACnetVendorId_UNKNOWN_VENDOR, } } @@ -5007,6 +5013,18 @@ func (e BACnetVendorId) VendorId() uint16 { { /* '146' */ return 146 } + case 1460: + { /* '1460' */ + return 1460 + } + case 1461: + { /* '1461' */ + return 1461 + } + case 1462: + { /* '1462' */ + return 1462 + } case 147: { /* '147' */ return 147 @@ -10833,6 +10851,18 @@ func (e BACnetVendorId) VendorName() string { { /* '146' */ return "Sanyo Electric Co., Ltd." } + case 1460: + { /* '1460' */ + return "Delta Fire Ltda." + } + case 1461: + { /* '1461' */ + return "Bock Water Heaters, Inc." + } + case 1462: + { /* '1462' */ + return "Cleaver-Brooks" + } case 147: { /* '147' */ return "Integrated Information Systems, Inc." @@ -15634,6 +15664,12 @@ func BACnetVendorIdByValue(value uint16) (enum BACnetVendorId, ok bool) { return BACnetVendorId_ASTRALITE_INC, true case 146: return BACnetVendorId_SANYO_ELECTRIC_CO_LTD, true + case 1460: + return BACnetVendorId_DELTA_FIRE_LTDA, true + case 1461: + return BACnetVendorId_BOCK_WATER_HEATERS_INC, true + case 1462: + return BACnetVendorId_CLEAVER_BROOKS, true case 147: return BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC, true case 148: @@ -18544,6 +18580,12 @@ func BACnetVendorIdByName(value string) (enum BACnetVendorId, ok bool) { return BACnetVendorId_ASTRALITE_INC, true case "SANYO_ELECTRIC_CO_LTD": return BACnetVendorId_SANYO_ELECTRIC_CO_LTD, true + case "DELTA_FIRE_LTDA": + return BACnetVendorId_DELTA_FIRE_LTDA, true + case "BOCK_WATER_HEATERS_INC": + return BACnetVendorId_BOCK_WATER_HEATERS_INC, true + case "CLEAVER_BROOKS": + return BACnetVendorId_CLEAVER_BROOKS, true case "INTEGRATED_INFORMATION_SYSTEMS_INC": return BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC, true case "TEMCO_CONTROLS_LTD": @@ -21515,6 +21557,12 @@ func (e BACnetVendorId) PLC4XEnumName() string { return "ASTRALITE_INC" case BACnetVendorId_SANYO_ELECTRIC_CO_LTD: return "SANYO_ELECTRIC_CO_LTD" + case BACnetVendorId_DELTA_FIRE_LTDA: + return "DELTA_FIRE_LTDA" + case BACnetVendorId_BOCK_WATER_HEATERS_INC: + return "BOCK_WATER_HEATERS_INC" + case BACnetVendorId_CLEAVER_BROOKS: + return "CLEAVER_BROOKS" case BACnetVendorId_INTEGRATED_INFORMATION_SYSTEMS_INC: return "INTEGRATED_INFORMATION_SYSTEMS_INC" case BACnetVendorId_TEMCO_CONTROLS_LTD: diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go index 6b453c9c37e..93c72530198 100644 --- a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go +++ b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go @@ -701,8 +701,11 @@ const ( KnxManufacturer_M_CAV_AUDIOGUANGZHOUCO__LTD KnxManufacturer = 655 KnxManufacturer_M_HELKAMA_BICA_OY KnxManufacturer = 656 KnxManufacturer_M_MODULYTE KnxManufacturer = 657 - KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 658 - KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 659 + KnxManufacturer_M_CONSOLINNO_ENERGY_GMBH KnxManufacturer = 658 + KnxManufacturer_M_SCHIDERON_ELECTRIC_ASIA_LIMITED KnxManufacturer = 659 + KnxManufacturer_M_3R KnxManufacturer = 660 + KnxManufacturer_M_ABB___RESERVED KnxManufacturer = 661 + KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED KnxManufacturer = 662 ) var KnxManufacturerValues []KnxManufacturer @@ -1368,6 +1371,9 @@ func init() { KnxManufacturer_M_CAV_AUDIOGUANGZHOUCO__LTD, KnxManufacturer_M_HELKAMA_BICA_OY, KnxManufacturer_M_MODULYTE, + KnxManufacturer_M_CONSOLINNO_ENERGY_GMBH, + KnxManufacturer_M_SCHIDERON_ELECTRIC_ASIA_LIMITED, + KnxManufacturer_M_3R, KnxManufacturer_M_ABB___RESERVED, KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, } @@ -3861,16 +3867,28 @@ func (e KnxManufacturer) Number() uint16 { } case 658: { /* '658' */ - return 43954 + return 716 } case 659: { /* '659' */ - return 43959 + return 717 } case 66: { /* '66' */ return 105 } + case 660: + { /* '660' */ + return 718 + } + case 661: + { /* '661' */ + return 43954 + } + case 662: + { /* '662' */ + return 43959 + } case 67: { /* '67' */ return 106 @@ -6519,16 +6537,28 @@ func (e KnxManufacturer) Name() string { } case 658: { /* '658' */ - return "ABB - reserved" + return "Consolinno Energy GmbH" } case 659: { /* '659' */ - return "Busch-Jaeger Elektro - reserved" + return "SCHIDERON ELECTRIC (ASIA) LIMITED" } case 66: { /* '66' */ return "RTS Automation" } + case 660: + { /* '660' */ + return "3R" + } + case 661: + { /* '661' */ + return "ABB - reserved" + } + case 662: + { /* '662' */ + return "Busch-Jaeger Elektro - reserved" + } case 67: { /* '67' */ return "EIBMARKT GmbH" @@ -7933,11 +7963,17 @@ func KnxManufacturerByValue(value uint16) (enum KnxManufacturer, ok bool) { case 657: return KnxManufacturer_M_MODULYTE, true case 658: - return KnxManufacturer_M_ABB___RESERVED, true + return KnxManufacturer_M_CONSOLINNO_ENERGY_GMBH, true case 659: - return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, true + return KnxManufacturer_M_SCHIDERON_ELECTRIC_ASIA_LIMITED, true case 66: return KnxManufacturer_M_RTS_AUTOMATION, true + case 660: + return KnxManufacturer_M_3R, true + case 661: + return KnxManufacturer_M_ABB___RESERVED, true + case 662: + return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, true case 67: return KnxManufacturer_M_EIBMARKT_GMBH, true case 68: @@ -9258,12 +9294,18 @@ func KnxManufacturerByName(value string) (enum KnxManufacturer, ok bool) { return KnxManufacturer_M_HELKAMA_BICA_OY, true case "M_MODULYTE": return KnxManufacturer_M_MODULYTE, true + case "M_CONSOLINNO_ENERGY_GMBH": + return KnxManufacturer_M_CONSOLINNO_ENERGY_GMBH, true + case "M_SCHIDERON_ELECTRIC_ASIA_LIMITED": + return KnxManufacturer_M_SCHIDERON_ELECTRIC_ASIA_LIMITED, true + case "M_RTS_AUTOMATION": + return KnxManufacturer_M_RTS_AUTOMATION, true + case "M_3R": + return KnxManufacturer_M_3R, true case "M_ABB___RESERVED": return KnxManufacturer_M_ABB___RESERVED, true case "M_BUSCH_JAEGER_ELEKTRO___RESERVED": return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED, true - case "M_RTS_AUTOMATION": - return KnxManufacturer_M_RTS_AUTOMATION, true case "M_EIBMARKT_GMBH": return KnxManufacturer_M_EIBMARKT_GMBH, true case "M_WAREMA_RENKHOFF_SE": @@ -10645,12 +10687,18 @@ func (e KnxManufacturer) PLC4XEnumName() string { return "M_HELKAMA_BICA_OY" case KnxManufacturer_M_MODULYTE: return "M_MODULYTE" + case KnxManufacturer_M_CONSOLINNO_ENERGY_GMBH: + return "M_CONSOLINNO_ENERGY_GMBH" + case KnxManufacturer_M_SCHIDERON_ELECTRIC_ASIA_LIMITED: + return "M_SCHIDERON_ELECTRIC_ASIA_LIMITED" + case KnxManufacturer_M_RTS_AUTOMATION: + return "M_RTS_AUTOMATION" + case KnxManufacturer_M_3R: + return "M_3R" case KnxManufacturer_M_ABB___RESERVED: return "M_ABB___RESERVED" case KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED: return "M_BUSCH_JAEGER_ELEKTRO___RESERVED" - case KnxManufacturer_M_RTS_AUTOMATION: - return "M_RTS_AUTOMATION" case KnxManufacturer_M_EIBMARKT_GMBH: return "M_EIBMARKT_GMBH" case KnxManufacturer_M_WAREMA_RENKHOFF_SE: diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java index 7ace7ad223d..b9d11bf3add 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.api; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.exceptions.PlcNotImplementedException; import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException; @@ -45,6 +46,11 @@ public interface PlcDriver { */ String getProtocolName(); + /** + * @return the type of the Configuration used by this driver. + */ + Class getConfigurationType(); + /** * Provides driver metadata. */ diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/configuration/PlcConnectionConfiguration.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/configuration/PlcConnectionConfiguration.java new file mode 100644 index 00000000000..f47ec0416f2 --- /dev/null +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/configuration/PlcConnectionConfiguration.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.api.configuration; + +public interface PlcConnectionConfiguration { +} diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/mock/ApiMockDriver.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/ApiMockDriver.java index 62876d31e0f..9f71b13d4be 100644 --- a/plc4j/api/src/test/java/org/apache/plc4x/java/mock/ApiMockDriver.java +++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/ApiMockDriver.java @@ -21,6 +21,7 @@ import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.PlcDriver; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -37,6 +38,11 @@ public String getProtocolName() { return "Mock Protocol Implementation"; } + @Override + public Class getConfigurationType() { + return null; + } + @Override public PlcConnection getConnection(String url) { MockPlcConnection connection = mock(MockPlcConnection.class); diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java index ea08d3fdd5d..420d66d4dfe 100644 --- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java +++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/AbEthDriver.java @@ -25,11 +25,11 @@ import org.apache.plc4x.java.abeth.tag.AbEthTagHandler; import org.apache.plc4x.java.abeth.protocol.AbEthProtocolLogic; import org.apache.plc4x.java.abeth.readwrite.CIPEncapsulationPacket; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.spi.transport.TransportConfiguration; import org.apache.plc4x.java.spi.transport.TransportConfigurationTypeProvider; import org.apache.plc4x.java.spi.values.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -52,7 +52,7 @@ public String getProtocolName() { @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return AbEthConfiguration.class; } diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java index 17fce286d91..53e300fa1e5 100644 --- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java +++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java @@ -25,13 +25,13 @@ import org.apache.plc4x.java.ads.tag.AdsTagHandler; import org.apache.plc4x.java.ads.protocol.AdsProtocolLogic; import org.apache.plc4x.java.ads.readwrite.AmsTCPPacket; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; import org.apache.plc4x.java.spi.transport.TransportConfiguration; import org.apache.plc4x.java.spi.transport.TransportConfigurationTypeProvider; import org.apache.plc4x.java.spi.values.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -87,7 +87,7 @@ protected boolean canBrowse() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return AdsConfiguration.class; } diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java index cb0ce804d29..8702da2184b 100644 --- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java +++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java @@ -1673,6 +1673,9 @@ public enum BACnetVendorId { AETERLINK_CORPORATION((int) 1457, (int) 1457, (String) "Aeterlink Corporation"), ALPHA_EPSILON_AUTOMATION((int) 1458, (int) 1458, (String) "Alpha Epsilon Automation"), ASTRALITE_INC((int) 1459, (int) 1459, (String) "Astralite Inc."), + DELTA_FIRE_LTDA((int) 1460, (int) 1460, (String) "Delta Fire Ltda."), + BOCK_WATER_HEATERS_INC((int) 1461, (int) 1461, (String) "Bock Water Heaters, Inc."), + CLEAVER_BROOKS((int) 1462, (int) 1462, (String) "Cleaver-Brooks"), UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown"); private static final Map map; diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java index 27b2f8c4f86..49d7931520e 100644 --- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java +++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/BacNetIpDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.bacnetip; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.bacnetip.configuration.BacNetIpConfiguration; import org.apache.plc4x.java.bacnetip.configuration.BacNetPcapReplayTransportConfiguration; import org.apache.plc4x.java.bacnetip.configuration.BacNetRawSocketTransportConfiguration; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.bacnetip.tag.BacNetIpTagHandler; import org.apache.plc4x.java.bacnetip.protocol.BacNetIpProtocolLogic; import org.apache.plc4x.java.bacnetip.readwrite.BVLC; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -50,7 +50,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return BacNetIpConfiguration.class; } diff --git a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java index 3e24141764f..e1287b874dc 100644 --- a/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java +++ b/plc4j/drivers/c-bus/src/main/java/org/apache/plc4x/java/cbus/CBusDriver.java @@ -19,13 +19,13 @@ package org.apache.plc4x.java.cbus; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.cbus.configuration.CBusConfiguration; import org.apache.plc4x.java.cbus.configuration.CBusTcpTransportConfiguration; import org.apache.plc4x.java.cbus.context.CBusDriverContext; import org.apache.plc4x.java.cbus.protocol.CBusProtocolLogic; import org.apache.plc4x.java.cbus.readwrite.CBusCommand; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -59,7 +59,7 @@ protected boolean canRead() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return CBusConfiguration.class; } diff --git a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java index 4f20cc5b083..787ab4ffb67 100644 --- a/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java +++ b/plc4j/drivers/can/src/main/java/org/apache/plc4x/java/can/generic/GenericCANDriver.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.can.generic; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.can.adapter.CANDriverAdapter; import org.apache.plc4x.java.can.generic.configuration.GenericCANConfiguration; @@ -25,7 +26,6 @@ import org.apache.plc4x.java.can.generic.tag.GenericCANTagHandler; import org.apache.plc4x.java.can.generic.protocol.GenericCANProtocolLogic; import org.apache.plc4x.java.can.generic.transport.GenericCANFrameDataHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.connection.CustomProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; @@ -54,7 +54,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return GenericCANConfiguration.class; } diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java index e1311d87018..23eb0a38d90 100644 --- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java +++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/CANOpenPlcDriver.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.canopen; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.api.value.PlcValue; @@ -27,7 +28,6 @@ import org.apache.plc4x.java.canopen.tag.CANOpenTagHandler; import org.apache.plc4x.java.canopen.protocol.CANOpenProtocolLogic; import org.apache.plc4x.java.canopen.transport.CANOpenFrameDataHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.connection.CustomProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; @@ -55,7 +55,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return CANOpenConfiguration.class; } diff --git a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/CANTestTransport.java b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/CANTestTransport.java index 64638bd405a..ee0daf89065 100644 --- a/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/CANTestTransport.java +++ b/plc4j/drivers/canopen/src/test/java/org/apache/plc4x/java/canopen/CANTestTransport.java @@ -23,10 +23,10 @@ import java.util.function.Function; import java.util.function.ToIntFunction; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.canopen.readwrite.CANOpenFrame; import org.apache.plc4x.java.canopen.transport.CANOpenFrameDataAdapter; import org.apache.plc4x.java.canopen.transport.IdentityCANOpenFrameBuilder; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.generation.MessageInput; import org.apache.plc4x.java.transport.can.CANFrameBuilder; import org.apache.plc4x.java.transport.can.CANTransport; @@ -46,7 +46,7 @@ public Class getMessageType() { } @Override - public MessageInput getMessageInput(Configuration configuration) { + public MessageInput getMessageInput(PlcConnectionConfiguration configuration) { return CANOpenFrame::staticParse; } diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/CtrlXDriver.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/CtrlXDriver.java index d9c219c37b9..8a1d6101d3a 100644 --- a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/CtrlXDriver.java +++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/CtrlXDriver.java @@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.ctrlx.readwrite.configuration.CtrlXConfiguration; @@ -100,6 +101,11 @@ public PlcConnection getConnection(String connectionString, PlcAuthentication au usernamePasswordAuthentication.getPassword()); } + @Override + public Class getConfigurationType() { + return CtrlXConfiguration.class; + } + @Override public Class getTransportConfigurationType(String transportCode) { return null; diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java similarity index 99% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java index 6ee41fff364..54c40d41824 100644 --- a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java +++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java @@ -754,7 +754,7 @@ public T deserialize(HttpResponse response, TypeReference valueType) thro if (mimeType == null || isJsonMime(mimeType)) { // Assume json if no mime type // convert input stream to string - java.util.Scanner s = new java.util.Scanner(entity.getContent()).useDelimiter("\\A"); + Scanner s = new Scanner(entity.getContent()).useDelimiter("\\A"); String content = (String) (s.hasNext() ? s.next() : ""); if ("".equals(content)) { // returns null for empty body @@ -764,7 +764,7 @@ public T deserialize(HttpResponse response, TypeReference valueType) thro return objectMapper.readValue(content, valueType); } else if ("text/plain".equalsIgnoreCase(mimeType)) { // convert input stream to string - java.util.Scanner s = new java.util.Scanner(entity.getContent()).useDelimiter("\\A"); + Scanner s = new Scanner(entity.getContent()).useDelimiter("\\A"); return (T) (s.hasNext() ? s.next() : ""); } else { throw new ApiException( diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequest.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequest.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequest.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequest.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequestAllOf.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequestAllOf.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequestAllOf.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequestAllOf.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLARString.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLARString.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLARString.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLARString.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLString.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLString.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLString.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLString.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLUInt32.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLUInt32.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLUInt32.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLUInt32.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Data.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Data.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Data.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Data.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Extension.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Extension.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Extension.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Extension.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/JsonString.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/JsonString.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/JsonString.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/JsonString.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Memory.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Memory.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Memory.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Memory.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryType.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryType.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryType.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryType.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryValue.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryValue.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryValue.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryValue.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MetaData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MetaData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MetaData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MetaData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/NodeClass.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/NodeClass.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/NodeClass.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/NodeClass.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Problem.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Problem.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Problem.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Problem.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReadNode200Response.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReadNode200Response.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReadNode200Response.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReadNode200Response.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reference.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reference.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reference.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reference.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reflection.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reflection.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reflection.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reflection.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionBaseType.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionBaseType.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionBaseType.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionBaseType.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnum.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnum.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnum.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnum.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnumVal.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnumVal.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnumVal.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnumVal.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionField.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionField.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionField.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionField.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionKeyValue.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionKeyValue.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionKeyValue.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionKeyValue.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionObject.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionObject.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionObject.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionObject.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionRPCCall.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionRPCCall.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionRPCCall.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionRPCCall.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionSchema.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionSchema.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionSchema.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionSchema.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionService.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionService.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionService.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionService.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionType.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionType.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionType.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionType.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RemoteConfig.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RemoteConfig.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RemoteConfig.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RemoteConfig.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RetainStats.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RetainStats.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RetainStats.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RetainStats.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEvent.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEvent.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEvent.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEvent.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData1.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData1.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData1.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData1.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ServerSettings.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ServerSettings.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ServerSettings.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ServerSettings.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/State.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/State.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/State.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/State.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionID.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionID.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionID.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionID.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionNodeList.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionNodeList.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionNodeList.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionNodeList.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionProperties.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionProperties.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionProperties.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionProperties.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionPropertiesData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionPropertiesData.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionPropertiesData.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionPropertiesData.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionSettings.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionSettings.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionSettings.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionSettings.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Task.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Task.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Task.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Task.java diff --git a/plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/UInt32.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/UInt32.java similarity index 100% rename from plc4j/drivers/ctrlx/src/main/generated/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/UInt32.java rename to plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/UInt32.java diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java deleted file mode 100644 index f8a2480ee5e..00000000000 --- a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.eip.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class CipExchange implements Message { - - // Constant values. - public static final Integer ITEMCOUNT = 0x02; - public static final Long NULLPTR = 0x0L; - public static final Integer UNCONNECTEDDATA = 0x00B2; - - // Properties. - protected final CipService service; - - public CipExchange(CipService service) { - super(); - this.service = service; - } - - public CipService getService() { - return service; - } - - public int getItemCount() { - return ITEMCOUNT; - } - - public long getNullPtr() { - return NULLPTR; - } - - public int getUnconnectedData() { - return UNCONNECTEDDATA; - } - - public void serialize(WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int startPos = positionAware.getPos(); - writeBuffer.pushContext("CipExchange"); - - // Const Field (itemCount) - writeConstField("itemCount", ITEMCOUNT, writeUnsignedInt(writeBuffer, 16)); - - // Const Field (nullPtr) - writeConstField("nullPtr", NULLPTR, writeUnsignedLong(writeBuffer, 32)); - - // Const Field (unconnectedData) - writeConstField("unconnectedData", UNCONNECTEDDATA, writeUnsignedInt(writeBuffer, 16)); - - // Implicit Field (size) (Used for parsing, but its value is not stored as it's implicitly given - // by the objects content) - int size = (int) (((getLengthInBytes()) - (8)) - (2)); - writeImplicitField("size", size, writeUnsignedInt(writeBuffer, 16)); - - // Simple Field (service) - writeSimpleField("service", service, new DataWriterComplexDefault<>(writeBuffer)); - - writeBuffer.popContext("CipExchange"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = 0; - CipExchange _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - // Const Field (itemCount) - lengthInBits += 16; - - // Const Field (nullPtr) - lengthInBits += 32; - - // Const Field (unconnectedData) - lengthInBits += 16; - - // Implicit Field (size) - lengthInBits += 16; - - // Simple field (service) - lengthInBits += service.getLengthInBits(); - - return lengthInBits; - } - - public static CipExchange staticParse(ReadBuffer readBuffer, Object... args) - throws ParseException { - PositionAware positionAware = readBuffer; - if ((args == null) || (args.length != 1)) { - throw new PlcRuntimeException( - "Wrong number of arguments, expected 1, but got " + args.length); - } - Integer exchangeLen; - if (args[0] instanceof Integer) { - exchangeLen = (Integer) args[0]; - } else if (args[0] instanceof String) { - exchangeLen = Integer.valueOf((String) args[0]); - } else { - throw new PlcRuntimeException( - "Argument 0 expected to be of type Integer or a string which is parseable but was " - + args[0].getClass().getName()); - } - return staticParse(readBuffer, exchangeLen); - } - - public static CipExchange staticParse(ReadBuffer readBuffer, Integer exchangeLen) - throws ParseException { - readBuffer.pullContext("CipExchange"); - PositionAware positionAware = readBuffer; - int startPos = positionAware.getPos(); - int curPos; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - int itemCount = - readConstField("itemCount", readUnsignedInt(readBuffer, 16), CipExchange.ITEMCOUNT); - - long nullPtr = readConstField("nullPtr", readUnsignedLong(readBuffer, 32), CipExchange.NULLPTR); - - int unconnectedData = - readConstField( - "unconnectedData", readUnsignedInt(readBuffer, 16), CipExchange.UNCONNECTEDDATA); - - int size = readImplicitField("size", readUnsignedInt(readBuffer, 16)); - - CipService service = - readSimpleField( - "service", - new DataReaderComplexDefault<>( - () -> CipService.staticParse(readBuffer, (int) ((exchangeLen) - (10))), - readBuffer)); - - readBuffer.closeContext("CipExchange"); - // Create the instance - CipExchange _cipExchange; - _cipExchange = new CipExchange(service); - return _cipExchange; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof CipExchange)) { - return false; - } - CipExchange that = (CipExchange) o; - return (getService() == that.getService()) && true; - } - - @Override - public int hashCode() { - return Objects.hash(getService()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java index fb94204d3e8..dccd73c91b7 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/base/EIPDriver.java @@ -20,6 +20,7 @@ import io.netty.buffer.ByteBuf; import org.apache.plc4x.java.api.PlcConnection; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.eip.base.configuration.EIPConfiguration; import org.apache.plc4x.java.eip.base.configuration.EipTcpTransportConfiguration; @@ -34,7 +35,6 @@ import org.apache.plc4x.java.spi.transport.Transport; import org.apache.plc4x.java.api.value.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.transport.TransportConfiguration; import org.apache.plc4x.java.spi.transport.TransportConfigurationTypeProvider; @@ -64,7 +64,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return EIPConfiguration.class; } diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java index 79a83384762..cb025aa3e99 100644 --- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java +++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/logix/LogixDriver.java @@ -19,13 +19,13 @@ package org.apache.plc4x.java.eip.logix; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.eip.base.tag.EipTag; import org.apache.plc4x.java.eip.base.protocol.EipProtocolLogic; import org.apache.plc4x.java.eip.logix.configuration.LogixConfiguration; import org.apache.plc4x.java.eip.readwrite.EipPacket; import org.apache.plc4x.java.eip.base.tag.EipTagHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.*; import java.util.function.Consumer; @@ -44,7 +44,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return LogixConfiguration.class; } diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java index 3f69f94d3aa..e0368e2ee47 100644 --- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java +++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/FirmataDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.firmata.readwrite; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.firmata.readwrite.configuration.FirmataConfiguration; import org.apache.plc4x.java.firmata.readwrite.context.FirmataDriverContext; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.firmata.readwrite.tag.FirmataTagHandler; import org.apache.plc4x.java.firmata.readwrite.protocol.FirmataProtocolLogic; import org.apache.plc4x.java.spi.values.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -48,7 +48,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return FirmataConfiguration.class; } diff --git a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java index 7dad94f16e0..a37fb42932d 100644 --- a/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java +++ b/plc4j/drivers/iec-60870/src/main/java/org/apache/plc4x/java/iec608705104/readwrite/Iec60870514PlcDriver.java @@ -19,12 +19,11 @@ package org.apache.plc4x.java.iec608705104.readwrite; import io.netty.buffer.ByteBuf; -import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.iec608705104.readwrite.configuration.Iec608705014Configuration; import org.apache.plc4x.java.iec608705104.readwrite.configuration.Iec608705014TcpTransportConfiguration; import org.apache.plc4x.java.iec608705104.readwrite.protocol.Iec608705104Protocol; import org.apache.plc4x.java.iec608705104.readwrite.tag.Iec608705104TagHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -59,7 +58,7 @@ protected boolean canSubscribe() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return Iec608705014Configuration.class; } @@ -78,11 +77,6 @@ protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { return new PlcValueHandler(); } - @Override - public PlcDriverMetadata getMetadata() { - return () -> true; - } - /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. * @return false diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java index 875557c16ae..d77e50518a6 100644 --- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java +++ b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxManufacturer.java @@ -755,9 +755,13 @@ public enum KnxManufacturer { M_CAV_AUDIOGUANGZHOUCO__LTD((int) 655, (int) 713, (String) "CAV AUDIO(GUANGZHOU)CO.,LTD"), M_HELKAMA_BICA_OY((int) 656, (int) 714, (String) "Helkama Bica Oy"), M_MODULYTE((int) 657, (int) 715, (String) "ModuLyte"), - M_ABB___RESERVED((int) 658, (int) 43954, (String) "ABB - reserved"), + M_CONSOLINNO_ENERGY_GMBH((int) 658, (int) 716, (String) "Consolinno Energy GmbH"), + M_SCHIDERON_ELECTRIC_ASIA_LIMITED( + (int) 659, (int) 717, (String) "SCHIDERON ELECTRIC (ASIA) LIMITED"), + M_3R((int) 660, (int) 718, (String) "3R"), + M_ABB___RESERVED((int) 661, (int) 43954, (String) "ABB - reserved"), M_BUSCH_JAEGER_ELEKTRO___RESERVED( - (int) 659, (int) 43959, (String) "Busch-Jaeger Elektro - reserved"); + (int) 662, (int) 43959, (String) "Busch-Jaeger Elektro - reserved"); private static final Map map; static { diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java index aabad6c6fd0..872870f7f8c 100644 --- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java +++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/KnxNetIpDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.knxnetip; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.knxnetip.configuration.KnxNetIpConfiguration; import org.apache.plc4x.java.knxnetip.configuration.KnxNetIpPcapReplayTransportConfiguration; import org.apache.plc4x.java.knxnetip.configuration.KnxNetIpRawSocketTransportConfiguration; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.knxnetip.context.KnxNetIpDriverContext; import org.apache.plc4x.java.knxnetip.tag.KnxNetIpTag; import org.apache.plc4x.java.knxnetip.readwrite.KnxNetIpMessage; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.knxnetip.tag.KnxNetIpTagHandler; import org.apache.plc4x.java.knxnetip.protocol.KnxNetIpProtocolLogic; import org.apache.plc4x.java.spi.transport.TransportConfiguration; @@ -81,7 +81,7 @@ protected boolean canSubscribe() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return KnxNetIpConfiguration.class; } diff --git a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/MockDriver.java b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/MockDriver.java index 219a29cc2bf..eb830ef3517 100644 --- a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/MockDriver.java +++ b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/MockDriver.java @@ -21,6 +21,7 @@ import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.PlcConnection; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.mock.connection.MockConnection; import org.apache.plc4x.java.mock.tag.MockTag; @@ -66,4 +67,9 @@ public MockTag prepareTag(String tagAddress){ return MockTag.of(tagAddress); } + @Override + public Class getConfigurationType() { + return null; + } + } diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java index a2517a9652f..3aa90bd432d 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ascii/ModbusAsciiDriver.java @@ -21,6 +21,7 @@ import io.netty.buffer.ByteBuf; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.modbus.ascii.config.ModbusAsciiConfiguration; import org.apache.plc4x.java.modbus.ascii.protocol.ModbusAsciiProtocolLogic; import org.apache.plc4x.java.modbus.base.tag.ModbusTag; @@ -28,7 +29,6 @@ import org.apache.plc4x.java.modbus.readwrite.DriverType; import org.apache.plc4x.java.modbus.readwrite.ModbusAsciiADU; import org.apache.plc4x.java.modbus.tcp.config.ModbusTcpTransportConfiguration; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -55,7 +55,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return ModbusAsciiConfiguration.class; } diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java index 3c20c50b036..e5de348f7ee 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/rtu/ModbusRtuDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.modbus.rtu; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.modbus.base.tag.ModbusTag; import org.apache.plc4x.java.modbus.base.tag.ModbusTagHandler; import org.apache.plc4x.java.modbus.readwrite.DriverType; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.modbus.rtu.config.ModbusRtuConfiguration; import org.apache.plc4x.java.modbus.rtu.protocol.ModbusRtuProtocolLogic; import org.apache.plc4x.java.modbus.tcp.config.ModbusTcpTransportConfiguration; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -51,7 +51,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return ModbusRtuConfiguration.class; } diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java index 31d319d9b0a..64606027eb1 100644 --- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java +++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/tcp/ModbusTcpDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.modbus.tcp; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; import org.apache.plc4x.java.modbus.base.tag.ModbusTag; @@ -33,7 +34,6 @@ import org.apache.plc4x.java.spi.transport.TransportConfiguration; import org.apache.plc4x.java.spi.transport.TransportConfigurationTypeProvider; import org.apache.plc4x.java.spi.values.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -55,7 +55,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return ModbusTcpConfiguration.class; } diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Date.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Date.java deleted file mode 100644 index f1bdb82b30e..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Date.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class Date implements Message { - - public Date() { - super(); - } - - public void serialize(WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - writeBuffer.pushContext("Date"); - - writeBuffer.popContext("Date"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = 0; - Date _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - return lengthInBits; - } - - public static Date staticParse(ReadBuffer readBuffer, Object... args) throws ParseException { - PositionAware positionAware = readBuffer; - return staticParse(readBuffer); - } - - public static Date staticParse(ReadBuffer readBuffer) throws ParseException { - readBuffer.pullContext("Date"); - PositionAware positionAware = readBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - readBuffer.closeContext("Date"); - // Create the instance - Date _date; - _date = new Date(); - return _date; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Date)) { - return false; - } - Date that = (Date) o; - return true; - } - - @Override - public int hashCode() { - return Objects.hash(); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DecimalDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DecimalDataType.java deleted file mode 100644 index 2f3c1fe4f54..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DecimalDataType.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class DecimalDataType extends ExtensionObjectDefinition implements Message { - - // Accessors for discriminator values. - public String getIdentifier() { - return (String) "17863"; - } - - // Properties. - protected final short scale; - protected final PascalByteString value; - - public DecimalDataType(short scale, PascalByteString value) { - super(); - this.scale = scale; - this.value = value; - } - - public short getScale() { - return scale; - } - - public PascalByteString getValue() { - return value; - } - - @Override - protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - writeBuffer.pushContext("DecimalDataType"); - - // Simple Field (scale) - writeSimpleField("scale", scale, writeSignedShort(writeBuffer, 16)); - - // Simple Field (value) - writeSimpleField("value", value, new DataWriterComplexDefault<>(writeBuffer)); - - writeBuffer.popContext("DecimalDataType"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - DecimalDataType _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - // Simple field (scale) - lengthInBits += 16; - - // Simple field (value) - lengthInBits += value.getLengthInBits(); - - return lengthInBits; - } - - public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder( - ReadBuffer readBuffer, String identifier) throws ParseException { - readBuffer.pullContext("DecimalDataType"); - PositionAware positionAware = readBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - short scale = readSimpleField("scale", readSignedShort(readBuffer, 16)); - - PascalByteString value = - readSimpleField( - "value", - new DataReaderComplexDefault<>( - () -> PascalByteString.staticParse(readBuffer), readBuffer)); - - readBuffer.closeContext("DecimalDataType"); - // Create the instance - return new DecimalDataTypeBuilderImpl(scale, value); - } - - public static class DecimalDataTypeBuilderImpl - implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder { - private final short scale; - private final PascalByteString value; - - public DecimalDataTypeBuilderImpl(short scale, PascalByteString value) { - this.scale = scale; - this.value = value; - } - - public DecimalDataType build() { - DecimalDataType decimalDataType = new DecimalDataType(scale, value); - return decimalDataType; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof DecimalDataType)) { - return false; - } - DecimalDataType that = (DecimalDataType) o; - return (getScale() == that.getScale()) - && (getValue() == that.getValue()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getScale(), getValue()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Node.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Node.java deleted file mode 100644 index 17e4a9ee15b..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Node.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class Node extends ExtensionObjectDefinition implements Message { - - // Accessors for discriminator values. - public String getIdentifier() { - return (String) "260"; - } - - // Properties. - protected final NodeId nodeId; - protected final NodeClass nodeClass; - protected final QualifiedName browseName; - protected final LocalizedText displayName; - protected final LocalizedText description; - protected final long writeMask; - protected final long userWriteMask; - protected final int noOfReferences; - protected final List references; - - public Node( - NodeId nodeId, - NodeClass nodeClass, - QualifiedName browseName, - LocalizedText displayName, - LocalizedText description, - long writeMask, - long userWriteMask, - int noOfReferences, - List references) { - super(); - this.nodeId = nodeId; - this.nodeClass = nodeClass; - this.browseName = browseName; - this.displayName = displayName; - this.description = description; - this.writeMask = writeMask; - this.userWriteMask = userWriteMask; - this.noOfReferences = noOfReferences; - this.references = references; - } - - public NodeId getNodeId() { - return nodeId; - } - - public NodeClass getNodeClass() { - return nodeClass; - } - - public QualifiedName getBrowseName() { - return browseName; - } - - public LocalizedText getDisplayName() { - return displayName; - } - - public LocalizedText getDescription() { - return description; - } - - public long getWriteMask() { - return writeMask; - } - - public long getUserWriteMask() { - return userWriteMask; - } - - public int getNoOfReferences() { - return noOfReferences; - } - - public List getReferences() { - return references; - } - - @Override - protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - writeBuffer.pushContext("Node"); - - // Simple Field (nodeId) - writeSimpleField("nodeId", nodeId, new DataWriterComplexDefault<>(writeBuffer)); - - // Simple Field (nodeClass) - writeSimpleEnumField( - "nodeClass", - "NodeClass", - nodeClass, - new DataWriterEnumDefault<>( - NodeClass::getValue, NodeClass::name, writeUnsignedLong(writeBuffer, 32))); - - // Simple Field (browseName) - writeSimpleField("browseName", browseName, new DataWriterComplexDefault<>(writeBuffer)); - - // Simple Field (displayName) - writeSimpleField("displayName", displayName, new DataWriterComplexDefault<>(writeBuffer)); - - // Simple Field (description) - writeSimpleField("description", description, new DataWriterComplexDefault<>(writeBuffer)); - - // Simple Field (writeMask) - writeSimpleField("writeMask", writeMask, writeUnsignedLong(writeBuffer, 32)); - - // Simple Field (userWriteMask) - writeSimpleField("userWriteMask", userWriteMask, writeUnsignedLong(writeBuffer, 32)); - - // Simple Field (noOfReferences) - writeSimpleField("noOfReferences", noOfReferences, writeSignedInt(writeBuffer, 32)); - - // Array Field (references) - writeComplexTypeArrayField("references", references, writeBuffer); - - writeBuffer.popContext("Node"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - Node _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - // Simple field (nodeId) - lengthInBits += nodeId.getLengthInBits(); - - // Simple field (nodeClass) - lengthInBits += 32; - - // Simple field (browseName) - lengthInBits += browseName.getLengthInBits(); - - // Simple field (displayName) - lengthInBits += displayName.getLengthInBits(); - - // Simple field (description) - lengthInBits += description.getLengthInBits(); - - // Simple field (writeMask) - lengthInBits += 32; - - // Simple field (userWriteMask) - lengthInBits += 32; - - // Simple field (noOfReferences) - lengthInBits += 32; - - // Array field - if (references != null) { - int i = 0; - for (ExtensionObjectDefinition element : references) { - ThreadLocalHelper.lastItemThreadLocal.set(++i >= references.size()); - lengthInBits += element.getLengthInBits(); - } - } - - return lengthInBits; - } - - public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder( - ReadBuffer readBuffer, String identifier) throws ParseException { - readBuffer.pullContext("Node"); - PositionAware positionAware = readBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - NodeId nodeId = - readSimpleField( - "nodeId", - new DataReaderComplexDefault<>(() -> NodeId.staticParse(readBuffer), readBuffer)); - - NodeClass nodeClass = - readEnumField( - "nodeClass", - "NodeClass", - new DataReaderEnumDefault<>(NodeClass::enumForValue, readUnsignedLong(readBuffer, 32))); - - QualifiedName browseName = - readSimpleField( - "browseName", - new DataReaderComplexDefault<>( - () -> QualifiedName.staticParse(readBuffer), readBuffer)); - - LocalizedText displayName = - readSimpleField( - "displayName", - new DataReaderComplexDefault<>( - () -> LocalizedText.staticParse(readBuffer), readBuffer)); - - LocalizedText description = - readSimpleField( - "description", - new DataReaderComplexDefault<>( - () -> LocalizedText.staticParse(readBuffer), readBuffer)); - - long writeMask = readSimpleField("writeMask", readUnsignedLong(readBuffer, 32)); - - long userWriteMask = readSimpleField("userWriteMask", readUnsignedLong(readBuffer, 32)); - - int noOfReferences = readSimpleField("noOfReferences", readSignedInt(readBuffer, 32)); - - List references = - readCountArrayField( - "references", - new DataReaderComplexDefault<>( - () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("287")), - readBuffer), - noOfReferences); - - readBuffer.closeContext("Node"); - // Create the instance - return new NodeBuilderImpl( - nodeId, - nodeClass, - browseName, - displayName, - description, - writeMask, - userWriteMask, - noOfReferences, - references); - } - - public static class NodeBuilderImpl - implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder { - private final NodeId nodeId; - private final NodeClass nodeClass; - private final QualifiedName browseName; - private final LocalizedText displayName; - private final LocalizedText description; - private final long writeMask; - private final long userWriteMask; - private final int noOfReferences; - private final List references; - - public NodeBuilderImpl( - NodeId nodeId, - NodeClass nodeClass, - QualifiedName browseName, - LocalizedText displayName, - LocalizedText description, - long writeMask, - long userWriteMask, - int noOfReferences, - List references) { - this.nodeId = nodeId; - this.nodeClass = nodeClass; - this.browseName = browseName; - this.displayName = displayName; - this.description = description; - this.writeMask = writeMask; - this.userWriteMask = userWriteMask; - this.noOfReferences = noOfReferences; - this.references = references; - } - - public Node build() { - Node node = - new Node( - nodeId, - nodeClass, - browseName, - displayName, - description, - writeMask, - userWriteMask, - noOfReferences, - references); - return node; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Node)) { - return false; - } - Node that = (Node) o; - return (getNodeId() == that.getNodeId()) - && (getNodeClass() == that.getNodeClass()) - && (getBrowseName() == that.getBrowseName()) - && (getDisplayName() == that.getDisplayName()) - && (getDescription() == that.getDescription()) - && (getWriteMask() == that.getWriteMask()) - && (getUserWriteMask() == that.getUserWriteMask()) - && (getNoOfReferences() == that.getNoOfReferences()) - && (getReferences() == that.getReferences()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash( - super.hashCode(), - getNodeId(), - getNodeClass(), - getBrowseName(), - getDisplayName(), - getDescription(), - getWriteMask(), - getUserWriteMask(), - getNoOfReferences(), - getReferences()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableAddress.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableAddress.java deleted file mode 100644 index 088585e66b0..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableAddress.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableAddress { - AddressSpaceFileType_Size((int) 11596L), - AddressSpaceFileType_OpenCount((int) 11599L), - AddressSpaceFileType_Open_InputArguments((int) 11601L), - AddressSpaceFileType_Open_OutputArguments((int) 11602L), - AddressSpaceFileType_Close_InputArguments((int) 11604L), - AddressSpaceFileType_Read_InputArguments((int) 11606L), - AddressSpaceFileType_Read_OutputArguments((int) 11607L), - AddressSpaceFileType_Write_InputArguments((int) 11609L), - AddressSpaceFileType_GetPosition_InputArguments((int) 11611L), - AddressSpaceFileType_GetPosition_OutputArguments((int) 11612L), - AddressSpaceFileType_SetPosition_InputArguments((int) 11614L), - AddressSpaceFileType_Writable((int) 12688L), - AddressSpaceFileType_UserWritable((int) 12689L), - AddressSpaceFileType_MimeType((int) 13398L), - AddressSpaceFileType_MaxByteStringLength((int) 24245L), - AddressSpaceFileType_LastModifiedTime((int) 25201L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableAddress value : OpcuaNodeIdServicesVariableAddress.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableAddress(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableAddress enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableChoice.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableChoice.java deleted file mode 100644 index 4ba3c1472e4..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableChoice.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableChoice { - ChoiceStateType_StateNumber((int) 15110L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableChoice value : OpcuaNodeIdServicesVariableChoice.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableChoice(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableChoice enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDevice.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDevice.java deleted file mode 100644 index 32586c97884..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDevice.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableDevice { - DeviceFailureEventType_EventId((int) 3662L), - DeviceFailureEventType_EventType((int) 3663L), - DeviceFailureEventType_SourceNode((int) 3664L), - DeviceFailureEventType_SourceName((int) 3665L), - DeviceFailureEventType_Time((int) 3666L), - DeviceFailureEventType_ReceiveTime((int) 3667L), - DeviceFailureEventType_LocalTime((int) 3668L), - DeviceFailureEventType_Message((int) 3669L), - DeviceFailureEventType_Severity((int) 3670L), - DeviceFailureEventType_ConditionClassId((int) 31879L), - DeviceFailureEventType_ConditionClassName((int) 31880L), - DeviceFailureEventType_ConditionSubClassId((int) 31881L), - DeviceFailureEventType_ConditionSubClassName((int) 31882L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableDevice value : OpcuaNodeIdServicesVariableDevice.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableDevice(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableDevice enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDiscrete.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDiscrete.java deleted file mode 100644 index 03de3759277..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDiscrete.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableDiscrete { - DiscreteItemType_Definition((int) 3776L), - DiscreteItemType_ValuePrecision((int) 3777L), - DiscreteAlarmType_EventId((int) 10524L), - DiscreteAlarmType_EventType((int) 10525L), - DiscreteAlarmType_SourceNode((int) 10526L), - DiscreteAlarmType_SourceName((int) 10527L), - DiscreteAlarmType_Time((int) 10528L), - DiscreteAlarmType_ReceiveTime((int) 10529L), - DiscreteAlarmType_LocalTime((int) 10530L), - DiscreteAlarmType_Message((int) 10531L), - DiscreteAlarmType_Severity((int) 10532L), - DiscreteAlarmType_ConditionName((int) 10533L), - DiscreteAlarmType_BranchId((int) 10534L), - DiscreteAlarmType_Retain((int) 10535L), - DiscreteAlarmType_EnabledState((int) 10536L), - DiscreteAlarmType_EnabledState_Id((int) 10537L), - DiscreteAlarmType_EnabledState_Name((int) 10538L), - DiscreteAlarmType_EnabledState_Number((int) 10539L), - DiscreteAlarmType_EnabledState_EffectiveDisplayName((int) 10540L), - DiscreteAlarmType_EnabledState_TransitionTime((int) 10541L), - DiscreteAlarmType_EnabledState_EffectiveTransitionTime((int) 10542L), - DiscreteAlarmType_EnabledState_TrueState((int) 10543L), - DiscreteAlarmType_EnabledState_FalseState((int) 10544L), - DiscreteAlarmType_Quality((int) 10545L), - DiscreteAlarmType_Quality_SourceTimestamp((int) 10546L), - DiscreteAlarmType_LastSeverity((int) 10547L), - DiscreteAlarmType_LastSeverity_SourceTimestamp((int) 10548L), - DiscreteAlarmType_Comment((int) 10549L), - DiscreteAlarmType_Comment_SourceTimestamp((int) 10550L), - DiscreteAlarmType_ClientUserId((int) 10551L), - DiscreteAlarmType_AddComment_InputArguments((int) 10555L), - DiscreteAlarmType_ConditionRefresh_InputArguments((int) 10557L), - DiscreteAlarmType_AckedState((int) 10558L), - DiscreteAlarmType_AckedState_Id((int) 10559L), - DiscreteAlarmType_AckedState_Name((int) 10560L), - DiscreteAlarmType_AckedState_Number((int) 10561L), - DiscreteAlarmType_AckedState_EffectiveDisplayName((int) 10562L), - DiscreteAlarmType_AckedState_TransitionTime((int) 10563L), - DiscreteAlarmType_AckedState_EffectiveTransitionTime((int) 10564L), - DiscreteAlarmType_AckedState_TrueState((int) 10565L), - DiscreteAlarmType_AckedState_FalseState((int) 10566L), - DiscreteAlarmType_ConfirmedState((int) 10567L), - DiscreteAlarmType_ConfirmedState_Id((int) 10568L), - DiscreteAlarmType_ConfirmedState_Name((int) 10569L), - DiscreteAlarmType_ConfirmedState_Number((int) 10570L), - DiscreteAlarmType_ConfirmedState_EffectiveDisplayName((int) 10571L), - DiscreteAlarmType_ConfirmedState_TransitionTime((int) 10572L), - DiscreteAlarmType_ConfirmedState_EffectiveTransitionTime((int) 10573L), - DiscreteAlarmType_ConfirmedState_TrueState((int) 10574L), - DiscreteAlarmType_ConfirmedState_FalseState((int) 10575L), - DiscreteAlarmType_Acknowledge_InputArguments((int) 10577L), - DiscreteAlarmType_Confirm_InputArguments((int) 10579L), - DiscreteAlarmType_ActiveState((int) 10580L), - DiscreteAlarmType_ActiveState_Id((int) 10581L), - DiscreteAlarmType_ActiveState_Name((int) 10582L), - DiscreteAlarmType_ActiveState_Number((int) 10583L), - DiscreteAlarmType_ActiveState_EffectiveDisplayName((int) 10584L), - DiscreteAlarmType_ActiveState_TransitionTime((int) 10585L), - DiscreteAlarmType_ActiveState_EffectiveTransitionTime((int) 10586L), - DiscreteAlarmType_ActiveState_TrueState((int) 10587L), - DiscreteAlarmType_ActiveState_FalseState((int) 10588L), - DiscreteAlarmType_SuppressedState((int) 10589L), - DiscreteAlarmType_SuppressedState_Id((int) 10590L), - DiscreteAlarmType_SuppressedState_Name((int) 10591L), - DiscreteAlarmType_SuppressedState_Number((int) 10592L), - DiscreteAlarmType_SuppressedState_EffectiveDisplayName((int) 10593L), - DiscreteAlarmType_SuppressedState_TransitionTime((int) 10594L), - DiscreteAlarmType_SuppressedState_EffectiveTransitionTime((int) 10595L), - DiscreteAlarmType_SuppressedState_TrueState((int) 10596L), - DiscreteAlarmType_SuppressedState_FalseState((int) 10597L), - DiscreteAlarmType_ShelvingState_CurrentState((int) 10599L), - DiscreteAlarmType_ShelvingState_CurrentState_Id((int) 10600L), - DiscreteAlarmType_ShelvingState_CurrentState_Name((int) 10601L), - DiscreteAlarmType_ShelvingState_CurrentState_Number((int) 10602L), - DiscreteAlarmType_ShelvingState_CurrentState_EffectiveDisplayName((int) 10603L), - DiscreteAlarmType_ShelvingState_LastTransition((int) 10604L), - DiscreteAlarmType_ShelvingState_LastTransition_Id((int) 10605L), - DiscreteAlarmType_ShelvingState_LastTransition_Name((int) 10606L), - DiscreteAlarmType_ShelvingState_LastTransition_Number((int) 10607L), - DiscreteAlarmType_ShelvingState_LastTransition_TransitionTime((int) 10608L), - DiscreteAlarmType_ShelvingState_UnshelveTime((int) 10609L), - DiscreteAlarmType_ShelvingState_TimedShelve_InputArguments((int) 10634L), - DiscreteAlarmType_SuppressedOrShelved((int) 10635L), - DiscreteAlarmType_MaxTimeShelved((int) 10636L), - DiscreteAlarmType_ConditionClassId((int) 11152L), - DiscreteAlarmType_ConditionClassName((int) 11153L), - DiscreteAlarmType_InputNode((int) 11154L), - DiscreteAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime((int) 11481L), - DiscreteAlarmType_ConditionRefresh2_InputArguments((int) 13005L), - DiscreteAlarmType_ConditionSubClassId((int) 16900L), - DiscreteAlarmType_ConditionSubClassName((int) 16901L), - DiscreteAlarmType_OutOfServiceState((int) 16902L), - DiscreteAlarmType_OutOfServiceState_Id((int) 16903L), - DiscreteAlarmType_OutOfServiceState_Name((int) 16904L), - DiscreteAlarmType_OutOfServiceState_Number((int) 16905L), - DiscreteAlarmType_OutOfServiceState_EffectiveDisplayName((int) 16906L), - DiscreteAlarmType_OutOfServiceState_TransitionTime((int) 16907L), - DiscreteAlarmType_OutOfServiceState_EffectiveTransitionTime((int) 16908L), - DiscreteAlarmType_OutOfServiceState_TrueState((int) 16909L), - DiscreteAlarmType_OutOfServiceState_FalseState((int) 16910L), - DiscreteAlarmType_SilenceState((int) 16911L), - DiscreteAlarmType_SilenceState_Id((int) 16912L), - DiscreteAlarmType_SilenceState_Name((int) 16913L), - DiscreteAlarmType_SilenceState_Number((int) 16914L), - DiscreteAlarmType_SilenceState_EffectiveDisplayName((int) 16915L), - DiscreteAlarmType_SilenceState_TransitionTime((int) 16916L), - DiscreteAlarmType_SilenceState_EffectiveTransitionTime((int) 16917L), - DiscreteAlarmType_SilenceState_TrueState((int) 16918L), - DiscreteAlarmType_SilenceState_FalseState((int) 16919L), - DiscreteAlarmType_AudibleEnabled((int) 16920L), - DiscreteAlarmType_AudibleSound((int) 16921L), - DiscreteAlarmType_OnDelay((int) 16926L), - DiscreteAlarmType_OffDelay((int) 16927L), - DiscreteAlarmType_FirstInGroupFlag((int) 16928L), - DiscreteAlarmType_ReAlarmTime((int) 16931L), - DiscreteAlarmType_ReAlarmRepeatCount((int) 16932L), - DiscreteAlarmType_ShelvingState_AvailableStates((int) 17692L), - DiscreteAlarmType_ShelvingState_AvailableTransitions((int) 17693L), - DiscreteAlarmType_AudibleSound_ListId((int) 17942L), - DiscreteAlarmType_AudibleSound_AgencyId((int) 17943L), - DiscreteAlarmType_AudibleSound_VersionId((int) 17944L), - DiscreteAlarmType_LatchedState((int) 18307L), - DiscreteAlarmType_LatchedState_Id((int) 18308L), - DiscreteAlarmType_LatchedState_Name((int) 18309L), - DiscreteAlarmType_LatchedState_Number((int) 18310L), - DiscreteAlarmType_LatchedState_EffectiveDisplayName((int) 18311L), - DiscreteAlarmType_LatchedState_TransitionTime((int) 18312L), - DiscreteAlarmType_LatchedState_EffectiveTransitionTime((int) 18313L), - DiscreteAlarmType_LatchedState_TrueState((int) 18314L), - DiscreteAlarmType_LatchedState_FalseState((int) 18315L), - DiscreteAlarmType_Suppress2_InputArguments((int) 24429L), - DiscreteAlarmType_Unsuppress2_InputArguments((int) 24431L), - DiscreteAlarmType_RemoveFromService2_InputArguments((int) 24433L), - DiscreteAlarmType_PlaceInService2_InputArguments((int) 24435L), - DiscreteAlarmType_Reset2_InputArguments((int) 24437L), - DiscreteAlarmType_ShelvingState_TimedShelve2_InputArguments((int) 24907L), - DiscreteAlarmType_ShelvingState_Unshelve2_InputArguments((int) 24909L), - DiscreteAlarmType_ShelvingState_OneShotShelve2_InputArguments((int) 24911L), - DiscreteAlarmType_GetGroupMemberships_OutputArguments((int) 25168L), - DiscreteAlarmType_SupportsFilteredRetain((int) 32236L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableDiscrete value : OpcuaNodeIdServicesVariableDiscrete.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableDiscrete(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableDiscrete enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInitial.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInitial.java deleted file mode 100644 index 0c9d707043c..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInitial.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableInitial { - InitialStateType_StateNumber((int) 3736L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableInitial value : OpcuaNodeIdServicesVariableInitial.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableInitial(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableInitial enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInstrument.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInstrument.java deleted file mode 100644 index d35b990cb0e..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInstrument.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableInstrument { - InstrumentDiagnosticAlarmType_EventId((int) 18348L), - InstrumentDiagnosticAlarmType_EventType((int) 18349L), - InstrumentDiagnosticAlarmType_SourceNode((int) 18350L), - InstrumentDiagnosticAlarmType_SourceName((int) 18351L), - InstrumentDiagnosticAlarmType_Time((int) 18352L), - InstrumentDiagnosticAlarmType_ReceiveTime((int) 18353L), - InstrumentDiagnosticAlarmType_LocalTime((int) 18354L), - InstrumentDiagnosticAlarmType_Message((int) 18355L), - InstrumentDiagnosticAlarmType_Severity((int) 18356L), - InstrumentDiagnosticAlarmType_ConditionClassId((int) 18357L), - InstrumentDiagnosticAlarmType_ConditionClassName((int) 18358L), - InstrumentDiagnosticAlarmType_ConditionSubClassId((int) 18359L), - InstrumentDiagnosticAlarmType_ConditionSubClassName((int) 18360L), - InstrumentDiagnosticAlarmType_ConditionName((int) 18361L), - InstrumentDiagnosticAlarmType_BranchId((int) 18362L), - InstrumentDiagnosticAlarmType_Retain((int) 18363L), - InstrumentDiagnosticAlarmType_EnabledState((int) 18364L), - InstrumentDiagnosticAlarmType_EnabledState_Id((int) 18365L), - InstrumentDiagnosticAlarmType_EnabledState_Name((int) 18366L), - InstrumentDiagnosticAlarmType_EnabledState_Number((int) 18367L), - InstrumentDiagnosticAlarmType_EnabledState_EffectiveDisplayName((int) 18368L), - InstrumentDiagnosticAlarmType_EnabledState_TransitionTime((int) 18369L), - InstrumentDiagnosticAlarmType_EnabledState_EffectiveTransitionTime((int) 18370L), - InstrumentDiagnosticAlarmType_EnabledState_TrueState((int) 18371L), - InstrumentDiagnosticAlarmType_EnabledState_FalseState((int) 18372L), - InstrumentDiagnosticAlarmType_Quality((int) 18373L), - InstrumentDiagnosticAlarmType_Quality_SourceTimestamp((int) 18374L), - InstrumentDiagnosticAlarmType_LastSeverity((int) 18375L), - InstrumentDiagnosticAlarmType_LastSeverity_SourceTimestamp((int) 18376L), - InstrumentDiagnosticAlarmType_Comment((int) 18377L), - InstrumentDiagnosticAlarmType_Comment_SourceTimestamp((int) 18378L), - InstrumentDiagnosticAlarmType_ClientUserId((int) 18379L), - InstrumentDiagnosticAlarmType_AddComment_InputArguments((int) 18383L), - InstrumentDiagnosticAlarmType_ConditionRefresh_InputArguments((int) 18385L), - InstrumentDiagnosticAlarmType_ConditionRefresh2_InputArguments((int) 18387L), - InstrumentDiagnosticAlarmType_AckedState((int) 18388L), - InstrumentDiagnosticAlarmType_AckedState_Id((int) 18389L), - InstrumentDiagnosticAlarmType_AckedState_Name((int) 18390L), - InstrumentDiagnosticAlarmType_AckedState_Number((int) 18391L), - InstrumentDiagnosticAlarmType_AckedState_EffectiveDisplayName((int) 18392L), - InstrumentDiagnosticAlarmType_AckedState_TransitionTime((int) 18393L), - InstrumentDiagnosticAlarmType_AckedState_EffectiveTransitionTime((int) 18394L), - InstrumentDiagnosticAlarmType_AckedState_TrueState((int) 18395L), - InstrumentDiagnosticAlarmType_AckedState_FalseState((int) 18396L), - InstrumentDiagnosticAlarmType_ConfirmedState((int) 18397L), - InstrumentDiagnosticAlarmType_ConfirmedState_Id((int) 18398L), - InstrumentDiagnosticAlarmType_ConfirmedState_Name((int) 18399L), - InstrumentDiagnosticAlarmType_ConfirmedState_Number((int) 18400L), - InstrumentDiagnosticAlarmType_ConfirmedState_EffectiveDisplayName((int) 18401L), - InstrumentDiagnosticAlarmType_ConfirmedState_TransitionTime((int) 18402L), - InstrumentDiagnosticAlarmType_ConfirmedState_EffectiveTransitionTime((int) 18403L), - InstrumentDiagnosticAlarmType_ConfirmedState_TrueState((int) 18404L), - InstrumentDiagnosticAlarmType_ConfirmedState_FalseState((int) 18405L), - InstrumentDiagnosticAlarmType_Acknowledge_InputArguments((int) 18407L), - InstrumentDiagnosticAlarmType_Confirm_InputArguments((int) 18409L), - InstrumentDiagnosticAlarmType_ActiveState((int) 18410L), - InstrumentDiagnosticAlarmType_ActiveState_Id((int) 18411L), - InstrumentDiagnosticAlarmType_ActiveState_Name((int) 18412L), - InstrumentDiagnosticAlarmType_ActiveState_Number((int) 18413L), - InstrumentDiagnosticAlarmType_ActiveState_EffectiveDisplayName((int) 18414L), - InstrumentDiagnosticAlarmType_ActiveState_TransitionTime((int) 18415L), - InstrumentDiagnosticAlarmType_ActiveState_EffectiveTransitionTime((int) 18416L), - InstrumentDiagnosticAlarmType_ActiveState_TrueState((int) 18417L), - InstrumentDiagnosticAlarmType_ActiveState_FalseState((int) 18418L), - InstrumentDiagnosticAlarmType_InputNode((int) 18419L), - InstrumentDiagnosticAlarmType_SuppressedState((int) 18420L), - InstrumentDiagnosticAlarmType_SuppressedState_Id((int) 18421L), - InstrumentDiagnosticAlarmType_SuppressedState_Name((int) 18422L), - InstrumentDiagnosticAlarmType_SuppressedState_Number((int) 18423L), - InstrumentDiagnosticAlarmType_SuppressedState_EffectiveDisplayName((int) 18424L), - InstrumentDiagnosticAlarmType_SuppressedState_TransitionTime((int) 18425L), - InstrumentDiagnosticAlarmType_SuppressedState_EffectiveTransitionTime((int) 18426L), - InstrumentDiagnosticAlarmType_SuppressedState_TrueState((int) 18427L), - InstrumentDiagnosticAlarmType_SuppressedState_FalseState((int) 18428L), - InstrumentDiagnosticAlarmType_OutOfServiceState((int) 18429L), - InstrumentDiagnosticAlarmType_OutOfServiceState_Id((int) 18430L), - InstrumentDiagnosticAlarmType_OutOfServiceState_Name((int) 18431L), - InstrumentDiagnosticAlarmType_OutOfServiceState_Number((int) 18432L), - InstrumentDiagnosticAlarmType_OutOfServiceState_EffectiveDisplayName((int) 18433L), - InstrumentDiagnosticAlarmType_OutOfServiceState_TransitionTime((int) 18434L), - InstrumentDiagnosticAlarmType_OutOfServiceState_EffectiveTransitionTime((int) 18435L), - InstrumentDiagnosticAlarmType_OutOfServiceState_TrueState((int) 18436L), - InstrumentDiagnosticAlarmType_OutOfServiceState_FalseState((int) 18437L), - InstrumentDiagnosticAlarmType_ShelvingState_CurrentState((int) 18439L), - InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Id((int) 18440L), - InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Name((int) 18441L), - InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_Number((int) 18442L), - InstrumentDiagnosticAlarmType_ShelvingState_CurrentState_EffectiveDisplayName((int) 18443L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition((int) 18444L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Id((int) 18445L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Name((int) 18446L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_Number((int) 18447L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_TransitionTime((int) 18448L), - InstrumentDiagnosticAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime((int) 18449L), - InstrumentDiagnosticAlarmType_ShelvingState_AvailableStates((int) 18450L), - InstrumentDiagnosticAlarmType_ShelvingState_AvailableTransitions((int) 18451L), - InstrumentDiagnosticAlarmType_ShelvingState_UnshelveTime((int) 18452L), - InstrumentDiagnosticAlarmType_ShelvingState_TimedShelve_InputArguments((int) 18454L), - InstrumentDiagnosticAlarmType_SuppressedOrShelved((int) 18457L), - InstrumentDiagnosticAlarmType_MaxTimeShelved((int) 18458L), - InstrumentDiagnosticAlarmType_AudibleEnabled((int) 18459L), - InstrumentDiagnosticAlarmType_AudibleSound((int) 18460L), - InstrumentDiagnosticAlarmType_AudibleSound_ListId((int) 18461L), - InstrumentDiagnosticAlarmType_AudibleSound_AgencyId((int) 18462L), - InstrumentDiagnosticAlarmType_AudibleSound_VersionId((int) 18463L), - InstrumentDiagnosticAlarmType_SilenceState((int) 18464L), - InstrumentDiagnosticAlarmType_SilenceState_Id((int) 18465L), - InstrumentDiagnosticAlarmType_SilenceState_Name((int) 18466L), - InstrumentDiagnosticAlarmType_SilenceState_Number((int) 18467L), - InstrumentDiagnosticAlarmType_SilenceState_EffectiveDisplayName((int) 18468L), - InstrumentDiagnosticAlarmType_SilenceState_TransitionTime((int) 18469L), - InstrumentDiagnosticAlarmType_SilenceState_EffectiveTransitionTime((int) 18470L), - InstrumentDiagnosticAlarmType_SilenceState_TrueState((int) 18471L), - InstrumentDiagnosticAlarmType_SilenceState_FalseState((int) 18472L), - InstrumentDiagnosticAlarmType_OnDelay((int) 18473L), - InstrumentDiagnosticAlarmType_OffDelay((int) 18474L), - InstrumentDiagnosticAlarmType_FirstInGroupFlag((int) 18475L), - InstrumentDiagnosticAlarmType_LatchedState((int) 18477L), - InstrumentDiagnosticAlarmType_LatchedState_Id((int) 18478L), - InstrumentDiagnosticAlarmType_LatchedState_Name((int) 18479L), - InstrumentDiagnosticAlarmType_LatchedState_Number((int) 18480L), - InstrumentDiagnosticAlarmType_LatchedState_EffectiveDisplayName((int) 18481L), - InstrumentDiagnosticAlarmType_LatchedState_TransitionTime((int) 18482L), - InstrumentDiagnosticAlarmType_LatchedState_EffectiveTransitionTime((int) 18483L), - InstrumentDiagnosticAlarmType_LatchedState_TrueState((int) 18484L), - InstrumentDiagnosticAlarmType_LatchedState_FalseState((int) 18485L), - InstrumentDiagnosticAlarmType_ReAlarmTime((int) 18487L), - InstrumentDiagnosticAlarmType_ReAlarmRepeatCount((int) 18488L), - InstrumentDiagnosticAlarmType_NormalState((int) 18495L), - InstrumentDiagnosticAlarmType_Suppress2_InputArguments((int) 24469L), - InstrumentDiagnosticAlarmType_Unsuppress2_InputArguments((int) 24471L), - InstrumentDiagnosticAlarmType_RemoveFromService2_InputArguments((int) 24473L), - InstrumentDiagnosticAlarmType_PlaceInService2_InputArguments((int) 24475L), - InstrumentDiagnosticAlarmType_Reset2_InputArguments((int) 24477L), - InstrumentDiagnosticAlarmType_ShelvingState_TimedShelve2_InputArguments((int) 24939L), - InstrumentDiagnosticAlarmType_ShelvingState_Unshelve2_InputArguments((int) 24941L), - InstrumentDiagnosticAlarmType_ShelvingState_OneShotShelve2_InputArguments((int) 24943L), - InstrumentDiagnosticAlarmType_GetGroupMemberships_OutputArguments((int) 25172L), - InstrumentDiagnosticAlarmType_SupportsFilteredRetain((int) 32240L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableInstrument value : - OpcuaNodeIdServicesVariableInstrument.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableInstrument(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableInstrument enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableRefresh.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableRefresh.java deleted file mode 100644 index 135bbf66df2..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableRefresh.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableRefresh { - RefreshStartEventType_EventId((int) 3969L), - RefreshStartEventType_EventType((int) 3970L), - RefreshStartEventType_SourceNode((int) 3971L), - RefreshStartEventType_SourceName((int) 3972L), - RefreshStartEventType_Time((int) 3973L), - RefreshStartEventType_ReceiveTime((int) 3974L), - RefreshStartEventType_LocalTime((int) 3975L), - RefreshStartEventType_Message((int) 3976L), - RefreshStartEventType_Severity((int) 3977L), - RefreshEndEventType_EventId((int) 3978L), - RefreshEndEventType_EventType((int) 3979L), - RefreshEndEventType_SourceNode((int) 3980L), - RefreshEndEventType_SourceName((int) 3981L), - RefreshEndEventType_Time((int) 3982L), - RefreshEndEventType_ReceiveTime((int) 3983L), - RefreshEndEventType_LocalTime((int) 3984L), - RefreshEndEventType_Message((int) 3985L), - RefreshEndEventType_Severity((int) 3986L), - RefreshRequiredEventType_EventId((int) 3987L), - RefreshRequiredEventType_EventType((int) 3988L), - RefreshRequiredEventType_SourceNode((int) 3989L), - RefreshRequiredEventType_SourceName((int) 3990L), - RefreshRequiredEventType_Time((int) 3991L), - RefreshRequiredEventType_ReceiveTime((int) 3992L), - RefreshRequiredEventType_LocalTime((int) 3993L), - RefreshRequiredEventType_Message((int) 3994L), - RefreshRequiredEventType_Severity((int) 3995L), - RefreshStartEventType_ConditionClassId((int) 31975L), - RefreshStartEventType_ConditionClassName((int) 31976L), - RefreshStartEventType_ConditionSubClassId((int) 31977L), - RefreshStartEventType_ConditionSubClassName((int) 31978L), - RefreshEndEventType_ConditionClassId((int) 31979L), - RefreshEndEventType_ConditionClassName((int) 31980L), - RefreshEndEventType_ConditionSubClassId((int) 31981L), - RefreshEndEventType_ConditionSubClassName((int) 31982L), - RefreshRequiredEventType_ConditionClassId((int) 31983L), - RefreshRequiredEventType_ConditionClassName((int) 31984L), - RefreshRequiredEventType_ConditionSubClassId((int) 31985L), - RefreshRequiredEventType_ConditionSubClassName((int) 31986L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableRefresh value : OpcuaNodeIdServicesVariableRefresh.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableRefresh(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableRefresh enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableTrip.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableTrip.java deleted file mode 100644 index e1ce3f84b45..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableTrip.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import java.util.HashMap; -import java.util.Map; - -// Code generated by code-generation. DO NOT EDIT. - -public enum OpcuaNodeIdServicesVariableTrip { - TripAlarmType_EventId((int) 10752L), - TripAlarmType_EventType((int) 10753L), - TripAlarmType_SourceNode((int) 10754L), - TripAlarmType_SourceName((int) 10755L), - TripAlarmType_Time((int) 10756L), - TripAlarmType_ReceiveTime((int) 10757L), - TripAlarmType_LocalTime((int) 10758L), - TripAlarmType_Message((int) 10759L), - TripAlarmType_Severity((int) 10760L), - TripAlarmType_ConditionName((int) 10761L), - TripAlarmType_BranchId((int) 10762L), - TripAlarmType_Retain((int) 10763L), - TripAlarmType_EnabledState((int) 10764L), - TripAlarmType_EnabledState_Id((int) 10765L), - TripAlarmType_EnabledState_Name((int) 10766L), - TripAlarmType_EnabledState_Number((int) 10767L), - TripAlarmType_EnabledState_EffectiveDisplayName((int) 10768L), - TripAlarmType_EnabledState_TransitionTime((int) 10769L), - TripAlarmType_EnabledState_EffectiveTransitionTime((int) 10770L), - TripAlarmType_EnabledState_TrueState((int) 10771L), - TripAlarmType_EnabledState_FalseState((int) 10772L), - TripAlarmType_Quality((int) 10773L), - TripAlarmType_Quality_SourceTimestamp((int) 10774L), - TripAlarmType_LastSeverity((int) 10775L), - TripAlarmType_LastSeverity_SourceTimestamp((int) 10776L), - TripAlarmType_Comment((int) 10777L), - TripAlarmType_Comment_SourceTimestamp((int) 10778L), - TripAlarmType_ClientUserId((int) 10779L), - TripAlarmType_AddComment_InputArguments((int) 10783L), - TripAlarmType_ConditionRefresh_InputArguments((int) 10785L), - TripAlarmType_AckedState((int) 10786L), - TripAlarmType_AckedState_Id((int) 10787L), - TripAlarmType_AckedState_Name((int) 10788L), - TripAlarmType_AckedState_Number((int) 10789L), - TripAlarmType_AckedState_EffectiveDisplayName((int) 10790L), - TripAlarmType_AckedState_TransitionTime((int) 10791L), - TripAlarmType_AckedState_EffectiveTransitionTime((int) 10792L), - TripAlarmType_AckedState_TrueState((int) 10793L), - TripAlarmType_AckedState_FalseState((int) 10794L), - TripAlarmType_ConfirmedState((int) 10795L), - TripAlarmType_ConfirmedState_Id((int) 10796L), - TripAlarmType_ConfirmedState_Name((int) 10797L), - TripAlarmType_ConfirmedState_Number((int) 10798L), - TripAlarmType_ConfirmedState_EffectiveDisplayName((int) 10799L), - TripAlarmType_ConfirmedState_TransitionTime((int) 10800L), - TripAlarmType_ConfirmedState_EffectiveTransitionTime((int) 10801L), - TripAlarmType_ConfirmedState_TrueState((int) 10802L), - TripAlarmType_ConfirmedState_FalseState((int) 10803L), - TripAlarmType_Acknowledge_InputArguments((int) 10805L), - TripAlarmType_Confirm_InputArguments((int) 10807L), - TripAlarmType_ActiveState((int) 10808L), - TripAlarmType_ActiveState_Id((int) 10809L), - TripAlarmType_ActiveState_Name((int) 10810L), - TripAlarmType_ActiveState_Number((int) 10811L), - TripAlarmType_ActiveState_EffectiveDisplayName((int) 10812L), - TripAlarmType_ActiveState_TransitionTime((int) 10813L), - TripAlarmType_ActiveState_EffectiveTransitionTime((int) 10814L), - TripAlarmType_ActiveState_TrueState((int) 10815L), - TripAlarmType_ActiveState_FalseState((int) 10816L), - TripAlarmType_SuppressedState((int) 10817L), - TripAlarmType_SuppressedState_Id((int) 10818L), - TripAlarmType_SuppressedState_Name((int) 10819L), - TripAlarmType_SuppressedState_Number((int) 10820L), - TripAlarmType_SuppressedState_EffectiveDisplayName((int) 10821L), - TripAlarmType_SuppressedState_TransitionTime((int) 10822L), - TripAlarmType_SuppressedState_EffectiveTransitionTime((int) 10823L), - TripAlarmType_SuppressedState_TrueState((int) 10824L), - TripAlarmType_SuppressedState_FalseState((int) 10825L), - TripAlarmType_ShelvingState_CurrentState((int) 10827L), - TripAlarmType_ShelvingState_CurrentState_Id((int) 10828L), - TripAlarmType_ShelvingState_CurrentState_Name((int) 10829L), - TripAlarmType_ShelvingState_CurrentState_Number((int) 10830L), - TripAlarmType_ShelvingState_CurrentState_EffectiveDisplayName((int) 10831L), - TripAlarmType_ShelvingState_LastTransition((int) 10832L), - TripAlarmType_ShelvingState_LastTransition_Id((int) 10833L), - TripAlarmType_ShelvingState_LastTransition_Name((int) 10834L), - TripAlarmType_ShelvingState_LastTransition_Number((int) 10835L), - TripAlarmType_ShelvingState_LastTransition_TransitionTime((int) 10836L), - TripAlarmType_ShelvingState_UnshelveTime((int) 10837L), - TripAlarmType_ShelvingState_TimedShelve_InputArguments((int) 10862L), - TripAlarmType_SuppressedOrShelved((int) 10863L), - TripAlarmType_MaxTimeShelved((int) 10864L), - TripAlarmType_ConditionClassId((int) 11159L), - TripAlarmType_ConditionClassName((int) 11160L), - TripAlarmType_InputNode((int) 11161L), - TripAlarmType_NormalState((int) 11162L), - TripAlarmType_ShelvingState_LastTransition_EffectiveTransitionTime((int) 11483L), - TripAlarmType_ConditionRefresh2_InputArguments((int) 13011L), - TripAlarmType_ConditionSubClassId((int) 17008L), - TripAlarmType_ConditionSubClassName((int) 17009L), - TripAlarmType_OutOfServiceState((int) 17010L), - TripAlarmType_OutOfServiceState_Id((int) 17011L), - TripAlarmType_OutOfServiceState_Name((int) 17012L), - TripAlarmType_OutOfServiceState_Number((int) 17013L), - TripAlarmType_OutOfServiceState_EffectiveDisplayName((int) 17014L), - TripAlarmType_OutOfServiceState_TransitionTime((int) 17015L), - TripAlarmType_OutOfServiceState_EffectiveTransitionTime((int) 17016L), - TripAlarmType_OutOfServiceState_TrueState((int) 17017L), - TripAlarmType_OutOfServiceState_FalseState((int) 17018L), - TripAlarmType_SilenceState((int) 17019L), - TripAlarmType_SilenceState_Id((int) 17020L), - TripAlarmType_SilenceState_Name((int) 17021L), - TripAlarmType_SilenceState_Number((int) 17022L), - TripAlarmType_SilenceState_EffectiveDisplayName((int) 17023L), - TripAlarmType_SilenceState_TransitionTime((int) 17024L), - TripAlarmType_SilenceState_EffectiveTransitionTime((int) 17025L), - TripAlarmType_SilenceState_TrueState((int) 17026L), - TripAlarmType_SilenceState_FalseState((int) 17027L), - TripAlarmType_AudibleEnabled((int) 17028L), - TripAlarmType_AudibleSound((int) 17029L), - TripAlarmType_OnDelay((int) 17034L), - TripAlarmType_OffDelay((int) 17035L), - TripAlarmType_FirstInGroupFlag((int) 17036L), - TripAlarmType_ReAlarmTime((int) 17039L), - TripAlarmType_ReAlarmRepeatCount((int) 17040L), - TripAlarmType_ShelvingState_AvailableStates((int) 17698L), - TripAlarmType_ShelvingState_AvailableTransitions((int) 17699L), - TripAlarmType_AudibleSound_ListId((int) 17963L), - TripAlarmType_AudibleSound_AgencyId((int) 17964L), - TripAlarmType_AudibleSound_VersionId((int) 17965L), - TripAlarmType_LatchedState((int) 18337L), - TripAlarmType_LatchedState_Id((int) 18338L), - TripAlarmType_LatchedState_Name((int) 18339L), - TripAlarmType_LatchedState_Number((int) 18340L), - TripAlarmType_LatchedState_EffectiveDisplayName((int) 18341L), - TripAlarmType_LatchedState_TransitionTime((int) 18342L), - TripAlarmType_LatchedState_EffectiveTransitionTime((int) 18343L), - TripAlarmType_LatchedState_TrueState((int) 18344L), - TripAlarmType_LatchedState_FalseState((int) 18345L), - TripAlarmType_Suppress2_InputArguments((int) 24459L), - TripAlarmType_Unsuppress2_InputArguments((int) 24461L), - TripAlarmType_RemoveFromService2_InputArguments((int) 24463L), - TripAlarmType_PlaceInService2_InputArguments((int) 24465L), - TripAlarmType_Reset2_InputArguments((int) 24467L), - TripAlarmType_ShelvingState_TimedShelve2_InputArguments((int) 24931L), - TripAlarmType_ShelvingState_Unshelve2_InputArguments((int) 24933L), - TripAlarmType_ShelvingState_OneShotShelve2_InputArguments((int) 24935L), - TripAlarmType_GetGroupMemberships_OutputArguments((int) 25171L), - TripAlarmType_SupportsFilteredRetain((int) 32239L); - private static final Map map; - - static { - map = new HashMap<>(); - for (OpcuaNodeIdServicesVariableTrip value : OpcuaNodeIdServicesVariableTrip.values()) { - map.put((int) value.getValue(), value); - } - } - - private final int value; - - OpcuaNodeIdServicesVariableTrip(int value) { - this.value = value; - } - - public int getValue() { - return value; - } - - public static OpcuaNodeIdServicesVariableTrip enumForValue(int value) { - return map.get(value); - } - - public static Boolean isDefined(int value) { - return map.containsKey(value); - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReferenceNode.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReferenceNode.java deleted file mode 100644 index 7875ada5e64..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReferenceNode.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class ReferenceNode extends ExtensionObjectDefinition implements Message { - - // Accessors for discriminator values. - public String getIdentifier() { - return (String) "287"; - } - - // Properties. - protected final NodeId referenceTypeId; - protected final boolean isInverse; - protected final ExpandedNodeId targetId; - - public ReferenceNode(NodeId referenceTypeId, boolean isInverse, ExpandedNodeId targetId) { - super(); - this.referenceTypeId = referenceTypeId; - this.isInverse = isInverse; - this.targetId = targetId; - } - - public NodeId getReferenceTypeId() { - return referenceTypeId; - } - - public boolean getIsInverse() { - return isInverse; - } - - public ExpandedNodeId getTargetId() { - return targetId; - } - - @Override - protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer) - throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - writeBuffer.pushContext("ReferenceNode"); - - // Simple Field (referenceTypeId) - writeSimpleField( - "referenceTypeId", referenceTypeId, new DataWriterComplexDefault<>(writeBuffer)); - - // Reserved Field (reserved) - writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 7)); - - // Simple Field (isInverse) - writeSimpleField("isInverse", isInverse, writeBoolean(writeBuffer)); - - // Simple Field (targetId) - writeSimpleField("targetId", targetId, new DataWriterComplexDefault<>(writeBuffer)); - - writeBuffer.popContext("ReferenceNode"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = super.getLengthInBits(); - ReferenceNode _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - // Simple field (referenceTypeId) - lengthInBits += referenceTypeId.getLengthInBits(); - - // Reserved Field (reserved) - lengthInBits += 7; - - // Simple field (isInverse) - lengthInBits += 1; - - // Simple field (targetId) - lengthInBits += targetId.getLengthInBits(); - - return lengthInBits; - } - - public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder( - ReadBuffer readBuffer, String identifier) throws ParseException { - readBuffer.pullContext("ReferenceNode"); - PositionAware positionAware = readBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - NodeId referenceTypeId = - readSimpleField( - "referenceTypeId", - new DataReaderComplexDefault<>(() -> NodeId.staticParse(readBuffer), readBuffer)); - - Byte reservedField0 = - readReservedField("reserved", readUnsignedByte(readBuffer, 7), (byte) 0x00); - - boolean isInverse = readSimpleField("isInverse", readBoolean(readBuffer)); - - ExpandedNodeId targetId = - readSimpleField( - "targetId", - new DataReaderComplexDefault<>( - () -> ExpandedNodeId.staticParse(readBuffer), readBuffer)); - - readBuffer.closeContext("ReferenceNode"); - // Create the instance - return new ReferenceNodeBuilderImpl(referenceTypeId, isInverse, targetId); - } - - public static class ReferenceNodeBuilderImpl - implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder { - private final NodeId referenceTypeId; - private final boolean isInverse; - private final ExpandedNodeId targetId; - - public ReferenceNodeBuilderImpl( - NodeId referenceTypeId, boolean isInverse, ExpandedNodeId targetId) { - this.referenceTypeId = referenceTypeId; - this.isInverse = isInverse; - this.targetId = targetId; - } - - public ReferenceNode build() { - ReferenceNode referenceNode = new ReferenceNode(referenceTypeId, isInverse, targetId); - return referenceNode; - } - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof ReferenceNode)) { - return false; - } - ReferenceNode that = (ReferenceNode) o; - return (getReferenceTypeId() == that.getReferenceTypeId()) - && (getIsInverse() == that.getIsInverse()) - && (getTargetId() == that.getTargetId()) - && super.equals(that) - && true; - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getReferenceTypeId(), getIsInverse(), getTargetId()); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Time.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Time.java deleted file mode 100644 index 640905cb702..00000000000 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Time.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.plc4x.java.opcua.readwrite; - -import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*; -import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*; -import static org.apache.plc4x.java.spi.generation.StaticHelper.*; - -import java.time.*; -import java.util.*; -import org.apache.plc4x.java.api.exceptions.*; -import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.*; -import org.apache.plc4x.java.spi.codegen.fields.*; -import org.apache.plc4x.java.spi.codegen.io.*; -import org.apache.plc4x.java.spi.generation.*; - -// Code generated by code-generation. DO NOT EDIT. - -public class Time implements Message { - - public Time() { - super(); - } - - public void serialize(WriteBuffer writeBuffer) throws SerializationException { - PositionAware positionAware = writeBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - writeBuffer.pushContext("Time"); - - writeBuffer.popContext("Time"); - } - - @Override - public int getLengthInBytes() { - return (int) Math.ceil((float) getLengthInBits() / 8.0); - } - - @Override - public int getLengthInBits() { - int lengthInBits = 0; - Time _value = this; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - return lengthInBits; - } - - public static Time staticParse(ReadBuffer readBuffer, Object... args) throws ParseException { - PositionAware positionAware = readBuffer; - return staticParse(readBuffer); - } - - public static Time staticParse(ReadBuffer readBuffer) throws ParseException { - readBuffer.pullContext("Time"); - PositionAware positionAware = readBuffer; - boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - - readBuffer.closeContext("Time"); - // Create the instance - Time _time; - _time = new Time(); - return _time; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof Time)) { - return false; - } - Time that = (Time) o; - return true; - } - - @Override - public int hashCode() { - return Objects.hash(); - } - - @Override - public String toString() { - WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true); - try { - writeBufferBoxBased.writeSerializable(this); - } catch (SerializationException e) { - throw new RuntimeException(e); - } - return "\n" + writeBufferBoxBased.getBox().toString() + "\n"; - } -} diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java index 4a4a9a59375..68474b6c7c1 100644 --- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java +++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.opcua; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.opcua.config.OpcuaConfiguration; import org.apache.plc4x.java.opcua.context.OpcuaDriverContext; import org.apache.plc4x.java.opcua.optimizer.OpcuaOptimizer; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.opcua.readwrite.OpcuaAPU; import org.apache.plc4x.java.opcua.tag.OpcuaPlcTagHandler; import org.apache.plc4x.java.opcua.tag.OpcuaTag; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -47,7 +47,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return OpcuaConfiguration.class; } diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java index 938737740fc..43d50060a0d 100644 --- a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java +++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.openprotocol; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; import org.apache.plc4x.java.openprotocol.config.OpenProtocolConfiguration; import org.apache.plc4x.java.openprotocol.config.OpenProtocolTcpTransportConfiguration; @@ -26,7 +27,6 @@ import org.apache.plc4x.java.openprotocol.readwrite.OpenProtocolMessage; import org.apache.plc4x.java.openprotocol.tag.OpenProtocolTag; import org.apache.plc4x.java.openprotocol.tag.OpenProtocolTagHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -51,7 +51,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return OpenProtocolConfiguration.class; } diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java index 344c7cf9ff4..198ffb87d7c 100644 --- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/Plc4xDriver.java @@ -19,12 +19,12 @@ package org.apache.plc4x.java.plc4x; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.plc4x.config.Plc4xConfiguration; import org.apache.plc4x.java.plc4x.config.Plc4xTcpTransportConfiguration; import org.apache.plc4x.java.plc4x.tag.Plc4XTagHandler; import org.apache.plc4x.java.plc4x.protocol.Plc4xProtocolLogic; import org.apache.plc4x.java.plc4x.readwrite.Plc4xMessage; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.PlcTagHandler; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -48,7 +48,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return Plc4xConfiguration.class; } diff --git a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java index 4e36f11017f..078e10d49b2 100644 --- a/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java +++ b/plc4j/drivers/profinet-ng/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java @@ -22,6 +22,7 @@ import org.apache.commons.net.util.SubnetUtils; import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; @@ -34,7 +35,6 @@ import org.apache.plc4x.java.profinet.readwrite.*; import org.apache.plc4x.java.profinet.tag.ProfinetTag; import org.apache.plc4x.java.profinet.tag.ProfinetTagHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; @@ -103,7 +103,7 @@ public PlcDiscoveryRequest.Builder discoveryRequestBuilder() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return ProfinetConfiguration.class; } diff --git a/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.2-Advantech-ADAM6100-20111216.xml b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.2-Advantech-ADAM6100-20111216.xml new file mode 100755 index 00000000000..5c7f009ff14 --- /dev/null +++ b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.2-Advantech-ADAM6100-20111216.xml @@ -0,0 +1,346 @@ + + + + + PROFINET Device Profile + 1.00 + Device Profile for PROFINET Devices + PROFIBUS Nutzerorganisation e. V. (PNO) + Device + + 4 + 1 + GSDML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml new file mode 100755 index 00000000000..9fdde3f4c4d --- /dev/null +++ b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml @@ -0,0 +1,873 @@ + + + + + PROFINET Device Profile + 1.00 + Device Profile for PROFINET Devices + PROFIBUS Nutzerorganisation e. V. (PNO) + Device + + 4 + 1 + GSDML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.33-wago-series750_753-20230115.xml b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.33-wago-series750_753-20230115.xml new file mode 100755 index 00000000000..2533fb935ed --- /dev/null +++ b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.33-wago-series750_753-20230115.xml @@ -0,0 +1,113157 @@ + + + + + PROFINET Device Profile + 1.00 + Device Profile for PROFINET Devices + PROFIBUS Nutzerorganisation e. V. (PNO) + Device + + 4 + 1 + GSDML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml new file mode 100755 index 00000000000..f4423a2aab9 --- /dev/null +++ b/plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml @@ -0,0 +1,1217 @@ + + + + + PROFINET Device Profile + 1.00 + Device Profile for PROFINET Devices + PROFIBUS Nutzerorganisation e. V. (PNO) + Device + + 4 + 1 + GSDML + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java index dd09cc6ce87..399d4f0e476 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/ProfinetDriver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.profinet; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; @@ -30,7 +31,6 @@ import org.apache.plc4x.java.profinet.readwrite.Ethernet_Frame; import org.apache.plc4x.java.profinet.tag.ProfinetTag; import org.apache.plc4x.java.profinet.tag.ProfinetTagHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest; @@ -76,7 +76,7 @@ public PlcDiscoveryRequest.Builder discoveryRequestBuilder() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return ProfinetConfiguration.class; } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java index 97b8fac4626..3693907d2a4 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java @@ -17,7 +17,7 @@ * under the License. */ package org.apache.plc4x.java.s7.readwrite; -// + import java.util.HashMap; import java.util.Map; diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java index 88a757d1ce2..a61fe04788a 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.s7.readwrite; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.s7.readwrite.configuration.S7Configuration; import org.apache.plc4x.java.s7.readwrite.context.S7DriverContext; import org.apache.plc4x.java.s7.readwrite.optimizer.S7Optimizer; @@ -27,10 +28,8 @@ import org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic; import org.apache.plc4x.java.s7.readwrite.tag.S7PlcTagHandler; import org.apache.plc4x.java.s7.readwrite.tag.S7Tag; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; -import org.apache.plc4x.java.spi.transport.TransportConfigurationTypeProvider; import org.apache.plc4x.java.spi.values.PlcValueHandler; import java.util.function.Consumer; @@ -51,7 +50,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return S7Configuration.class; } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java index d97ccd6bc88..d97b8ba3513 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java @@ -18,7 +18,6 @@ */ package org.apache.plc4x.java.s7.readwrite.configuration; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter; import org.apache.plc4x.java.spi.configuration.annotations.defaults.BooleanDefaultValue; import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue; diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java index 66f47cda383..9f54e6a34a2 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java @@ -20,6 +20,7 @@ import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.s7.readwrite.TPKTPacket; @@ -80,7 +81,7 @@ public PlcConnection getConnection(String connectionString) throws PlcConnection } // Create the configuration object. - Configuration configuration = configurationFactory.createConfiguration( + PlcConnectionConfiguration configuration = configurationFactory.createConfiguration( getConfigurationType(), protocolCode, transportCode, transportConfig, paramString); if (configuration == null) { throw new PlcConnectionException("Unsupported configuration"); @@ -182,7 +183,7 @@ public PlcConnection getConnection(String connectionString) throws PlcConnection } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { throw new UnsupportedOperationException("getConfigurationType, Not supported yet."); } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java index 0217f9ae44e..fe50c5ba25b 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java @@ -19,11 +19,11 @@ package org.apache.plc4x.java.s7.readwrite.protocol; import io.netty.channel.Channel; -import org.apache.plc4x.java.spi.configuration.Configuration; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; public interface S7HMux { - void setEmbededhannel(Channel embeded_channel, Configuration configuration); + void setEmbededhannel(Channel embeded_channel, PlcConnectionConfiguration configuration); void setPrimaryChannel(Channel primary_channel); diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java index 68f935fbdf6..f815dc470b0 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java @@ -26,8 +26,8 @@ import io.netty.handler.codec.MessageToMessageCodec; import io.netty.handler.timeout.ReadTimeoutHandler; import io.netty.util.AttributeKey; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.s7.readwrite.configuration.S7Configuration; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.events.ConnectEvent; import org.apache.plc4x.java.spi.events.ConnectedEvent; import org.apache.plc4x.java.spi.events.DisconnectEvent; @@ -270,7 +270,7 @@ public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { @Override - public void setEmbededhannel(Channel embeded_channel, Configuration configuration) { + public void setEmbededhannel(Channel embeded_channel, PlcConnectionConfiguration configuration) { final S7Configuration conf = (S7Configuration) configuration; this.embeded_channel = embeded_channel; this.embeded_channel.attr(IS_CONNECTED).set(false); diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java index 17d20ec4f8e..d93a4df50e8 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java @@ -26,6 +26,7 @@ import io.netty.handler.logging.LoggingHandler; import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.messages.PlcPingResponse; import org.apache.plc4x.java.api.messages.PlcReadRequest; @@ -87,7 +88,7 @@ public S7HPlcConnection( boolean canBrowse, PlcTagHandler tagHandler, PlcValueHandler valueHandler, - Configuration configuration, + PlcConnectionConfiguration configuration, ChannelFactory channelFactory, ChannelFactory secondaryChannelFactory, boolean fireDiscoverEvent, diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java index 46da7720247..7bc4210b9c3 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HSingleProtocolStackConfigurer.java @@ -23,12 +23,12 @@ import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.MessageToMessageCodec; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.spi.EventListenerMessageCodec; import org.apache.plc4x.java.spi.Plc4xNettyWrapper; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedProtocolMessageCodec; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -97,7 +97,7 @@ public static S7HSingleProtocolStackBuilder builder(C this.encryptionHandler = encryptionHandler; } - private ChannelHandler getMessageCodec(Configuration configuration) { + private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) { return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder, parserArgs, packetSizeEstimatorClass != null ? configure(configuration, createInstance(packetSizeEstimatorClass)) : null, corruptPacketRemoverClass != null ? configure(configuration, createInstance(corruptPacketRemoverClass)) : null); @@ -107,7 +107,7 @@ private ChannelHandler getMessageCodec(Configuration configuration) { * Applies the given Stack to the Pipeline */ @Override - public Plc4xProtocolBase configurePipeline(Configuration configuration, ChannelPipeline pipeline, + public Plc4xProtocolBase configurePipeline(PlcConnectionConfiguration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners) { if (null == protocol) { diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedDriver.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedDriver.java index 318c4d3a9de..41f2d81b672 100644 --- a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedDriver.java +++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedDriver.java @@ -20,7 +20,9 @@ import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.apache.plc4x.java.simulated.configuration.SimulatedConfiguration; import org.apache.plc4x.java.simulated.connection.SimulatedConnection; import org.apache.plc4x.java.simulated.connection.SimulatedDevice; import org.apache.plc4x.java.api.PlcDriver; @@ -66,4 +68,9 @@ public SimulatedTag prepareTag(String tagAddress){ return SimulatedTag.of(tagAddress); } + @Override + public Class getConfigurationType() { + return SimulatedConfiguration.class; + } + } diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/configuration/SimulatedConfiguration.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/configuration/SimulatedConfiguration.java new file mode 100644 index 00000000000..0e21e98fa76 --- /dev/null +++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/configuration/SimulatedConfiguration.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.simulated.configuration; + +import org.apache.plc4x.java.spi.configuration.Configuration; + +public class SimulatedConfiguration implements Configuration { +} diff --git a/plc4j/integrations/pom.xml b/plc4j/integrations/pom.xml index c09fc26eadb..210ab519c16 100644 --- a/plc4j/integrations/pom.xml +++ b/plc4j/integrations/pom.xml @@ -40,19 +40,7 @@ apache-calcite apache-nifi + apache-kafka - - - - .below-java-21 - - [11,21) - - - apache-kafka - - - - diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java index b1dbb37b588..027abde031a 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xNettyWrapper.java @@ -18,7 +18,6 @@ */ package org.apache.plc4x.java.spi; -import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/Configuration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/Configuration.java index ce47796d1b4..3ee60cdfd09 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/Configuration.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/Configuration.java @@ -18,6 +18,8 @@ */ package org.apache.plc4x.java.spi.configuration; -public interface Configuration { +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; + +public interface Configuration extends PlcConnectionConfiguration { } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/ConfigurationFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/ConfigurationFactory.java index 6e4bfd91106..af2717bae8f 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/ConfigurationFactory.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/ConfigurationFactory.java @@ -21,6 +21,7 @@ import org.apache.commons.lang3.ClassUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter; import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter; @@ -54,15 +55,15 @@ public class ConfigurationFactory { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationFactory.class); - public T createConfiguration(Class pClazz, String protocolCode, String transportCode, - String transportConfig, String paramString) { + public T createConfiguration(Class pClazz, String protocolCode, String transportCode, + String transportConfig, String paramString) { // Get a map of all parameters in the connection string. Map> paramStringValues = splitQuery(paramString); return createConfiguration(pClazz, protocolCode, transportCode, transportConfig, paramStringValues); } - public T createPrefixedConfiguration(Class pClazz, String prefix, String protocolCode, + public T createPrefixedConfiguration(Class pClazz, String prefix, String protocolCode, String transportCode, String transportConfig, String paramString) { @@ -79,7 +80,7 @@ public T createPrefixedConfiguration(Class pClazz, return createConfiguration(pClazz, protocolCode, transportCode, transportConfig, filteredParamStringValues); } - public T createConfiguration(Class pClazz, String protocolCode, String transportCode, + public T createConfiguration(Class pClazz, String protocolCode, String transportCode, String transportConfig, Map> paramStringValues) { // Get a map of all configuration parameter fields. // - Get a list of all fields in the given class. @@ -172,7 +173,7 @@ public T createConfiguration(Class pClazz, String p return instance; } - public static T configure(Configuration configuration, T obj) { + public static T configure(PlcConnectionConfiguration configuration, T obj) { // Check if in this object is configurable at all. if (ClassUtils.isAssignable(obj.getClass(), HasConfiguration.class)) { // Check if the type declared by the HasConfiguration interface is @@ -210,7 +211,7 @@ public static T configure(Configuration configuration, T obj) { * @param field name of the field. * @return name of the configuration (either from the annotation or from the field itself) */ - private static String getConfigurationName(Field field) { + public static String getConfigurationName(Field field) { if (field.getAnnotation(ComplexConfigurationParameter.class) != null) { return field.getAnnotation(ComplexConfigurationParameter.class).prefix(); } else if (StringUtils.isBlank(field.getAnnotation(ConfigurationParameter.class).value())) { @@ -274,7 +275,7 @@ private static Object toFieldValue(Field field, String valueString) { throw new IllegalArgumentException("Unsupported property type " + field.getType().getName()); } - private static Object getDefaultValueFromAnnotation(Field field) { + public static Object getDefaultValueFromAnnotation(Field field) { IntDefaultValue intDefaultValue = field.getAnnotation(IntDefaultValue.class); if (intDefaultValue != null) { return intDefaultValue.value(); diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/HasConfiguration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/HasConfiguration.java index 2baa49a388d..8be7cbc5e07 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/HasConfiguration.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/configuration/HasConfiguration.java @@ -18,6 +18,8 @@ */ package org.apache.plc4x.java.spi.configuration; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; + /** * (Marker) Interface which can be used to tell PLC4X that a class (that is instantiated by PLC4X) * has a Configuration. @@ -25,7 +27,7 @@ * * @param Class of the Configuration */ -public interface HasConfiguration { +public interface HasConfiguration { /** * Is called directly after instantiation before the class is used somewhere. diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java index a37e1dd9277..1871cb0893a 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/CustomProtocolStackConfigurer.java @@ -26,11 +26,11 @@ import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.MessageToMessageCodec; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.spi.EventListenerMessageCodec; import org.apache.plc4x.java.spi.Plc4xNettyWrapper; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.context.DriverContext; import org.apache.plc4x.java.spi.generation.ByteOrder; import org.apache.plc4x.java.spi.generation.Message; @@ -49,16 +49,16 @@ public class CustomProtocolStackConfigurer im private final Class basePacketClass; private final ByteOrder byteOrder; - private final Function> protocol; - private final Function driverContext; - private final Function> protocolIO; - private final Function> packetSizeEstimator; - private final Function> corruptPacketRemover; + private final Function> protocol; + private final Function driverContext; + private final Function> protocolIO; + private final Function> packetSizeEstimator; + private final Function> corruptPacketRemover; private final MessageToMessageCodec encryptionHandler; private final Object[] parserArgs; - public static CustomProtocolStackBuilder builder(Class basePacketClass, Function> messageInput) { + public static CustomProtocolStackBuilder builder(Class basePacketClass, Function> messageInput) { return new CustomProtocolStackBuilder<>(basePacketClass, messageInput); } @@ -66,11 +66,11 @@ public static CustomProtocolStackBuilder builder(Clas CustomProtocolStackConfigurer(Class basePacketClass, ByteOrder byteOrder, Object[] parserArgs, - Function> protocol, - Function driverContext, - Function> protocolIO, - Function> packetSizeEstimator, - Function> corruptPacketRemover, + Function> protocol, + Function driverContext, + Function> protocolIO, + Function> packetSizeEstimator, + Function> corruptPacketRemover, MessageToMessageCodec encryptionHandler) { this.basePacketClass = basePacketClass; this.byteOrder = byteOrder; @@ -83,7 +83,7 @@ public static CustomProtocolStackBuilder builder(Clas this.encryptionHandler = encryptionHandler; } - private ChannelHandler getMessageCodec(Configuration configuration) { + private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) { return new GeneratedProtocolMessageCodec<>(basePacketClass, protocolIO.apply(configuration), byteOrder, parserArgs, packetSizeEstimator == null ? null : packetSizeEstimator.apply(configuration), corruptPacketRemover == null ? null : corruptPacketRemover.apply(configuration)); @@ -91,7 +91,7 @@ private ChannelHandler getMessageCodec(Configuration configuration) { /** Applies the given Stack to the Pipeline */ @Override - public Plc4xProtocolBase configurePipeline(Configuration configuration, ChannelPipeline pipeline, + public Plc4xProtocolBase configurePipeline(PlcConnectionConfiguration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners) { if (this.encryptionHandler != null) { @@ -117,21 +117,21 @@ public Plc4xProtocolBase configurePipeline(Configuration conf public static final class CustomProtocolStackBuilder { private final Class basePacketClass; - private final Function> messageInput; - private Function driverContext; + private final Function> messageInput; + private Function driverContext; private ByteOrder byteOrder = ByteOrder.BIG_ENDIAN; private Object[] parserArgs; - private Function> protocol; - private Function> packetSizeEstimator; - private Function> corruptPacketRemover; + private Function> protocol; + private Function> packetSizeEstimator; + private Function> corruptPacketRemover; private MessageToMessageCodec encryptionHandler; - public CustomProtocolStackBuilder(Class basePacketClass, Function> messageInput) { + public CustomProtocolStackBuilder(Class basePacketClass, Function> messageInput) { this.basePacketClass = basePacketClass; this.messageInput = messageInput; } - public CustomProtocolStackBuilder withDriverContext(Function driverContextClass) { + public CustomProtocolStackBuilder withDriverContext(Function driverContextClass) { this.driverContext = driverContextClass; return this; } @@ -156,17 +156,17 @@ public CustomProtocolStackBuilder withParserArgs(Object... pa return this; } - public CustomProtocolStackBuilder withProtocol(Function> protocol) { + public CustomProtocolStackBuilder withProtocol(Function> protocol) { this.protocol = protocol; return this; } - public CustomProtocolStackBuilder withPacketSizeEstimator(Function> packetSizeEstimator) { + public CustomProtocolStackBuilder withPacketSizeEstimator(Function> packetSizeEstimator) { this.packetSizeEstimator = packetSizeEstimator; return this; } - public CustomProtocolStackBuilder withCorruptPacketRemover(Function> corruptPacketRemover) { + public CustomProtocolStackBuilder withCorruptPacketRemover(Function> corruptPacketRemover) { this.corruptPacketRemover = corruptPacketRemover; return this; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java index ccc95d6b9c8..f50fd0d7a13 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java @@ -22,6 +22,7 @@ import java.util.concurrent.RejectedExecutionException; import org.apache.plc4x.java.api.EventPlcConnection; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.exceptions.PlcIoException; import org.apache.plc4x.java.api.listener.ConnectionStateListener; @@ -48,7 +49,7 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements protected final static long DEFAULT_DISCONNECT_WAIT_TIME = 10000L; private static final Logger logger = LoggerFactory.getLogger(DefaultNettyPlcConnection.class); - protected final Configuration configuration; + protected final PlcConnectionConfiguration configuration; protected final ChannelFactory channelFactory; protected final boolean fireDiscoverEvent; protected final boolean awaitSessionSetupComplete; @@ -68,7 +69,7 @@ public DefaultNettyPlcConnection(boolean canPing, boolean canBrowse, PlcTagHandler tagHandler, PlcValueHandler valueHandler, - Configuration configuration, + PlcConnectionConfiguration configuration, ChannelFactory channelFactory, boolean fireDiscoverEvent, boolean awaitSessionSetupComplete, diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java index a04939a4993..9ac8c4c4aa3 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java @@ -21,6 +21,7 @@ import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.value.PlcValueHandler; import org.apache.plc4x.java.spi.configuration.Configuration; @@ -47,7 +48,7 @@ public abstract class GeneratedDriverBase implement public static final Pattern URI_PATTERN = Pattern.compile( "^(?[a-z0-9\\-]*)(:(?[a-z0-9]*))?://(?[^?]*)(\\?(?.*))?"); - protected abstract Class getConfigurationType(); + public abstract Class getConfigurationType(); protected boolean canPing() { return false; @@ -133,7 +134,7 @@ public PlcConnection getConnection(String connectionString, PlcAuthentication au } // Create the configuration object. - Configuration configuration = configurationFactory + PlcConnectionConfiguration configuration = configurationFactory .createConfiguration(getConfigurationType(), protocolCode, transportCode, transportConfig, paramString); if (configuration == null) { throw new PlcConnectionException("Unsupported configuration"); diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ProtocolStackConfigurer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ProtocolStackConfigurer.java index 42b070aa7d5..c338d8d08d7 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ProtocolStackConfigurer.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ProtocolStackConfigurer.java @@ -20,16 +20,15 @@ import io.netty.channel.ChannelPipeline; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.generation.Message; -import java.util.Collections; import java.util.List; public interface ProtocolStackConfigurer { - Plc4xProtocolBase configurePipeline(Configuration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners); + Plc4xProtocolBase configurePipeline(PlcConnectionConfiguration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java index dfae98eaf8f..d4209e99400 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/SingleProtocolStackConfigurer.java @@ -25,12 +25,12 @@ import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.MessageToMessageCodec; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.spi.EventListenerMessageCodec; import org.apache.plc4x.java.spi.Plc4xNettyWrapper; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.context.DriverContext; import org.apache.plc4x.java.spi.generation.ByteOrder; import org.apache.plc4x.java.spi.generation.Message; @@ -92,7 +92,7 @@ public static SingleProtocolStackBuilder builder(Clas this.encryptionHandler = encryptionHandler; } - private ChannelHandler getMessageCodec(Configuration configuration) { + private ChannelHandler getMessageCodec(PlcConnectionConfiguration configuration) { return new GeneratedProtocolMessageCodec<>(basePacketClass, messageInput, messageOutput, byteOrder, parserArgs, packetSizeEstimatorClass != null ? configure(configuration, createInstance(packetSizeEstimatorClass)) : null, corruptPacketRemoverClass != null ? configure(configuration, createInstance(corruptPacketRemoverClass)) : null); @@ -102,7 +102,7 @@ private ChannelHandler getMessageCodec(Configuration configuration) { * Applies the given Stack to the Pipeline */ @Override - public Plc4xProtocolBase configurePipeline(Configuration configuration, ChannelPipeline pipeline, + public Plc4xProtocolBase configurePipeline(PlcConnectionConfiguration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners) { if (this.encryptionHandler != null) { diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/configuration/config/TestConfigurationComplex.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/configuration/config/TestConfigurationComplex.java index cc286c08d45..8f76aa7a9c3 100644 --- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/configuration/config/TestConfigurationComplex.java +++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/configuration/config/TestConfigurationComplex.java @@ -21,7 +21,6 @@ import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter; -import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter; public class TestConfigurationComplex implements Configuration { diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnectionTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnectionTest.java index a01e3c0ffdf..7ea957b3232 100644 --- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnectionTest.java +++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnectionTest.java @@ -22,15 +22,10 @@ import static java.util.concurrent.ForkJoinPool.commonPool; import static org.junit.jupiter.api.Assertions.assertEquals; -import io.netty.channel.ChannelPipeline; -import java.util.List; -import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; -import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.spi.ConversationContext; import org.apache.plc4x.java.spi.Plc4xNettyWrapper; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.generation.Message; import org.apache.plc4x.java.spi.netty.NettyHashTimerTimeoutManager; import org.junit.jupiter.api.Test; @@ -50,26 +45,20 @@ void checkInitializationSequence() throws Exception { final GateKeeper disconnect = new GateKeeper("disconnect"); final GateKeeper close = new GateKeeper("close"); - ProtocolStackConfigurer stackConfigurer = new ProtocolStackConfigurer<>() { - @Override - public Plc4xProtocolBase configurePipeline(Configuration configuration, ChannelPipeline pipeline, PlcAuthentication authentication, boolean passive, List listeners) { - TestProtocolBase base = new TestProtocolBase(discovery, connect, disconnect, close); - Plc4xNettyWrapper context = new Plc4xNettyWrapper<>(new NettyHashTimerTimeoutManager(), pipeline, passive, base, authentication, Message.class); - pipeline.addLast(context); - return base; - } + ProtocolStackConfigurer stackConfigurer = (configuration, pipeline, authentication, passive, listeners) -> { + TestProtocolBase base = new TestProtocolBase(discovery, connect, disconnect, close); + Plc4xNettyWrapper context = new Plc4xNettyWrapper<>(new NettyHashTimerTimeoutManager(), pipeline, passive, base, authentication, Message.class); + pipeline.addLast(context); + return base; }; DefaultNettyPlcConnection connection = new PlcConnectionFactory().withDiscovery().create(channelFactory, stackConfigurer); - commonPool().submit(new Runnable() { - @Override - public void run() { - try { - logger.info("Activating connection"); - connection.connect(); - } catch (PlcConnectionException e) { - throw new RuntimeException(e); - } + commonPool().submit(() -> { + try { + logger.info("Activating connection"); + connection.connect(); + } catch (PlcConnectionException e) { + throw new RuntimeException(e); } }); diff --git a/plc4j/tools/opcua-server/pom.xml b/plc4j/tools/opcua-server/pom.xml index d551d44f1f5..d0e0f1a4971 100644 --- a/plc4j/tools/opcua-server/pom.xml +++ b/plc4j/tools/opcua-server/pom.xml @@ -28,7 +28,7 @@ plc4x-opcua-server - PLC4J: Integrations: Eclipse Milo OPC UA Server + PLC4J: Tools: OPC-UA Server 2023-11-02T07:23:09Z diff --git a/plc4j/tools/pom.xml b/plc4j/tools/pom.xml index faa8369456c..30aa025ab3f 100644 --- a/plc4j/tools/pom.xml +++ b/plc4j/tools/pom.xml @@ -47,4 +47,21 @@ scraper-ng + + + + .above-or-equal-java-19 + + [19,) + + + ui + + + + \ No newline at end of file diff --git a/plc4j/tools/ui/application/pom.xml b/plc4j/tools/ui/application/pom.xml new file mode 100644 index 00000000000..087b8efc01c --- /dev/null +++ b/plc4j/tools/ui/application/pom.xml @@ -0,0 +1,178 @@ + + + + 4.0.0 + + + org.apache.plc4x + plc4j-tools-ui + 0.12.0-SNAPSHOT + + + plc4j-tools-ui-application + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.1 + + + unpack + generate-resources + + unpack + + + + + org.apache.plc4x + plc4j-tools-ui-frontend + ${project.version} + jar + ${project.build.outputDirectory}/static + + + + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/libs + + + + + + org.apache.plc4x:plc4j-tools-ui-backend + ch.qos.logback:logback-core + + + + + org.springframework.boot + spring-boot-maven-plugin + 3.1.2 + + org.apache.plc4x.java.tools.ui.Plc4xUiBackendApplication + + dev + + + + + org.apache.rat + apache-rat-plugin + + + license-check + verify + + check + + + + storage/** + derby.log + + + + + + + + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework + spring-context + + + org.springframework.data + spring-data-jpa + + + + org.apache.plc4x + plc4j-tools-ui-backend + 0.12.0-SNAPSHOT + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + compile + + + ch.qos.logback + logback-core + compile + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-test + test + + + org.springframework + spring-test + test + + + org.springframework.security + spring-security-test + test + + + + + org.apache.plc4x + plc4j-tools-ui-frontend + 0.12.0-SNAPSHOT + provided + + + + diff --git a/plc4j/tools/ui/application/src/main/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplication.java b/plc4j/tools/ui/application/src/main/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplication.java new file mode 100644 index 00000000000..c6290bef300 --- /dev/null +++ b/plc4j/tools/ui/application/src/main/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplication.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +@SpringBootApplication +@EnableJpaRepositories("org.apache.plc4x.java.tools.ui") +public class Plc4xUiBackendApplication { + + public static void main(String[] args) { + SpringApplication.run(Plc4xUiBackendApplication.class, args); + } + +} diff --git a/plc4j/tools/ui/application/src/main/resources/application-dev.properties b/plc4j/tools/ui/application/src/main/resources/application-dev.properties new file mode 100644 index 00000000000..fe95886d5c1 --- /dev/null +++ b/plc4j/tools/ui/application/src/main/resources/application-dev.properties @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# diff --git a/plc4j/tools/ui/application/src/main/resources/application.properties b/plc4j/tools/ui/application/src/main/resources/application.properties new file mode 100644 index 00000000000..0497f630c05 --- /dev/null +++ b/plc4j/tools/ui/application/src/main/resources/application.properties @@ -0,0 +1,31 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Settings for the Derby sql database, which contains the application settings. +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=update +spring.jpa.database=default +spring.datasource.url=jdbc:derby:directory:storage/settings;create=true + +# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) +spring.sql.init.continue-on-error=false +spring.datasource.generate-unique-name=false + +# Just setting this to the default in order to avoid warning messages. +spring.jpa.open-in-view=true diff --git a/plc4j/tools/ui/application/src/main/resources/logback.xml b/plc4j/tools/ui/application/src/main/resources/logback.xml new file mode 100644 index 00000000000..22a5cdfee2c --- /dev/null +++ b/plc4j/tools/ui/application/src/main/resources/logback.xml @@ -0,0 +1,39 @@ + + + + + + + [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n + + + + + + + + + + + \ No newline at end of file diff --git a/plc4j/tools/ui/application/src/test/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplicationTests.java b/plc4j/tools/ui/application/src/test/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplicationTests.java new file mode 100644 index 00000000000..0bc6625e6e6 --- /dev/null +++ b/plc4j/tools/ui/application/src/test/java/org/apache/plc4x/java/tools/ui/Plc4xUiBackendApplicationTests.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@SpringBootTest +@ActiveProfiles(value = "test") +class Plc4xUiBackendApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/plc4j/tools/ui/application/src/test/resources/application-test.properties b/plc4j/tools/ui/application/src/test/resources/application-test.properties new file mode 100644 index 00000000000..fe95886d5c1 --- /dev/null +++ b/plc4j/tools/ui/application/src/test/resources/application-test.properties @@ -0,0 +1,18 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# diff --git a/plc4j/tools/ui/backend/pom.xml b/plc4j/tools/ui/backend/pom.xml new file mode 100644 index 00000000000..ee8f2f0b39f --- /dev/null +++ b/plc4j/tools/ui/backend/pom.xml @@ -0,0 +1,169 @@ + + + + 4.0.0 + + + org.apache.plc4x + plc4j-tools-ui + 0.12.0-SNAPSHOT + + + plc4j-tools-ui-backend + + + + + org.apache.maven.plugins + maven-dependency-plugin + + + org.apache.plc4x:plc4j-driver-all + org.springframework.boot:spring-boot-starter-web + org.springframework.boot:spring-boot-starter-websocket + org.springframework.boot:spring-boot-starter-data-jpa + org.apache.derby:derby + org.apache.derby:derbytools + ch.qos.logback:logback-core + + + + + org.apache.rat + apache-rat-plugin + + + license-check + verify + + check + + + + + + storage/** + derby.log + + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework + spring-core + + + org.springframework + spring-context + + + org.springframework + spring-web + + + org.springframework.data + spring-data-jpa + + + org.springframework + spring-websocket + + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.apache.derby + derby + + + org.apache.derby + derbytools + + + + org.apache.plc4x + plc4j-api + 0.12.0-SNAPSHOT + + + org.apache.plc4x + plc4j-spi + 0.12.0-SNAPSHOT + + + org.apache.plc4x + plc4j-connection-cache + 0.12.0-SNAPSHOT + + + org.apache.plc4x + plc4j-driver-all + 0.12.0-SNAPSHOT + pom + + + + jakarta.persistence + jakarta.persistence-api + + + org.apache.commons + commons-lang3 + + + com.fasterxml.jackson.core + jackson-databind + + + + + org.slf4j + slf4j-api + + + ch.qos.logback + logback-classic + compile + + + ch.qos.logback + logback-core + compile + + + + diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/Plc4xConfiguration.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/Plc4xConfiguration.java new file mode 100644 index 00000000000..1b79413fd69 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/Plc4xConfiguration.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.configuration; + +import org.apache.plc4x.java.api.PlcDriverManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class Plc4xConfiguration { + + @Bean + public PlcDriverManager driverManager() { + return PlcDriverManager.getDefault(); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/WebSocketConfig.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/WebSocketConfig.java new file mode 100644 index 00000000000..18d3d0f98d3 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/configuration/WebSocketConfig.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.configuration; + +import org.apache.plc4x.java.tools.ui.handler.WebSocketHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; + +@Configuration +@EnableWebSocket +public class WebSocketConfig implements WebSocketConfigurer { + + private final WebSocketHandler webSocketHandler; + + public WebSocketConfig(WebSocketHandler webSocketHandler) { + this.webSocketHandler = webSocketHandler; + } + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(webSocketHandler, "/ws").setAllowedOrigins("*"); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DeviceController.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DeviceController.java new file mode 100644 index 00000000000..d4eda63f396 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DeviceController.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.controller; + +import org.apache.plc4x.java.tools.ui.model.Device; +import org.apache.plc4x.java.tools.ui.service.DeviceService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +//@CrossOrigin(origins = {"http://localhost:8080", "http://localhost:5173"}) +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping("/api/devices") +public class DeviceController { + + private final DeviceService deviceService; + + public DeviceController(DeviceService deviceService) { + this.deviceService = deviceService; + } + + @GetMapping("/{id}") + public Device getDeviceById(@PathVariable Integer id) { + return deviceService.readDevice(id).orElseThrow(() -> new RuntimeException("Error finding connection with id: " + id)); + } + + @GetMapping + public List getAllDevices() { + return deviceService.getAllDevices(); + } + + @PostMapping + public Device saveDevice(@RequestBody Device device) { + if (device.getId() == null) { + return deviceService.createDevice(device); + } else { + return deviceService.updateDevice(device); + } + } + + @DeleteMapping + public void deleteDevice(@RequestBody Device device) { + deviceService.deleteDevice(device); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DriverController.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DriverController.java new file mode 100644 index 00000000000..eec1494c462 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/controller/DriverController.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.controller; + +import org.apache.plc4x.java.tools.ui.model.Driver; +import org.apache.plc4x.java.tools.ui.service.DriverService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +// Allow from the default port 8080 as well as the one node usually uses for it's dev-mode 5173 +//@CrossOrigin(origins = {"http://localhost:8080", "http://localhost:5173"}) +@CrossOrigin(origins = {"*"}) +@RestController +@RequestMapping("/api") +public class DriverController { + + private final DriverService driverService; + + public DriverController(DriverService driverService) { + this.driverService = driverService; + } + + @GetMapping("/drivers") + public List getAllDrivers() { + return driverService.getDriverList(); + } + + @GetMapping("/discover/{protocolCode}") + public void discover(@PathVariable("protocolCode") String protocolCode) { + driverService.discover(protocolCode); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/DeviceEvent.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/DeviceEvent.java new file mode 100644 index 00000000000..038ee23e46b --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/DeviceEvent.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.event; + +import org.apache.plc4x.java.tools.ui.model.Device; + +public class DeviceEvent extends UiApplicationEvent { + + public DeviceEvent(Device source, EventType eventType) { + super(source, eventType); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/EventType.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/EventType.java new file mode 100644 index 00000000000..a7613333b1e --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/EventType.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.event; + +public enum EventType { + + CREATED, + UPDATED, + DELETED + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/UiApplicationEvent.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/UiApplicationEvent.java new file mode 100644 index 00000000000..7c7f205b35c --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/event/UiApplicationEvent.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.event; + +public abstract class UiApplicationEvent extends org.springframework.context.ApplicationEvent { + + private final EventType eventType; + + public UiApplicationEvent(T source, EventType eventType) { + super(source); + this.eventType = eventType; + } + + public EventType getEventType() { + return eventType; + } + + @Override + public T getSource() { + // We're only accepting objects of type T, so in this case it's safe to cast. + //noinspection unchecked + return (T) super.getSource(); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/handler/WebSocketHandler.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/handler/WebSocketHandler.java new file mode 100644 index 00000000000..2748dce0ded --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/handler/WebSocketHandler.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.plc4x.java.tools.ui.event.UiApplicationEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.lang.Nullable; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class WebSocketHandler implements org.springframework.web.socket.WebSocketHandler { + + private final Map openSessions = new ConcurrentHashMap<>(); + private final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * ApplicationEvent listener forwarding all ApplicationEvents from this application to all connected clients. + * @param uiApplicationEvent event that we want to be forwarded. + */ + @EventListener + public void onApplicationEvent(UiApplicationEvent uiApplicationEvent) { + openSessions.forEach((s, webSocketSession) -> { + try { + webSocketSession.sendMessage(new TextMessage(objectMapper.writeValueAsString(uiApplicationEvent))); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + /** + * Register a new web-socket session. + * @param session the new web-socket session. + */ + @Override + public void afterConnectionEstablished(@Nullable WebSocketSession session) { + if(session != null) { + openSessions.put(session.getId(), session); + } + } + + /** + * Remove a web-socket session from the list. + * @param session the web-socket session we want to remove + * @param closeStatus the status of the closed session + */ + @Override + public void afterConnectionClosed(@Nullable WebSocketSession session, @Nullable CloseStatus closeStatus) { + if((session != null) && (closeStatus != null)) { + //noinspection resource + openSessions.remove(session.getId()); + } + } + + /** + * Handle an incoming message on the web-socket session + * (this should actually not happen, as we only use the web-sockets for server-to-client communication) + * @param session the web-socket session the message is coming in on + * @param message the message + */ + @Override + public void handleMessage(@Nullable WebSocketSession session, @Nullable WebSocketMessage message) { + System.out.println("handleMessage"); + } + + /** + * Callback for handling transport errors. + * @param session the web-socket session causing the error + * @param exception the error that happened + */ + @Override + public void handleTransportError(@Nullable WebSocketSession session, @Nullable Throwable exception) { + System.out.println("handleTransportError"); + } + + @Override + public boolean supportsPartialMessages() { + return false; + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/ConfigurationOption.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/ConfigurationOption.java new file mode 100644 index 00000000000..58ccb2bda6b --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/ConfigurationOption.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.model; + +public class ConfigurationOption { + + public final String name; + public final String typeName; + public final boolean required; + public final Object defaultValue; + + public ConfigurationOption(String name, String typeName, boolean required, Object defaultValue) { + this.name = name; + this.typeName = typeName; + this.required = required; + this.defaultValue = defaultValue; + } + + public String getName() { + return name; + } + + public String getTypeName() { + return typeName; + } + + public boolean isRequired() { + return required; + } + + public Object getDefaultValue() { + return defaultValue; + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Device.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Device.java new file mode 100644 index 00000000000..e1029b2dbd4 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Device.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.model; + +import jakarta.persistence.*; + +import java.util.Map; + +@Entity +public class Device { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + private String name; + + private String protocolCode; + private String transportCode; + + private String transportUrl; + @ElementCollection + @MapKeyColumn(name="name") + @Column(name="value") + @CollectionTable(name="device_options", joinColumns=@JoinColumn(name="device_id")) + private Map options; + @ElementCollection + @MapKeyColumn(name="name") + @Column(name="value") + @CollectionTable(name="device_attributes", joinColumns=@JoinColumn(name="device_id")) + private Map attributes; + + public Device() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getProtocolCode() { + return protocolCode; + } + + public void setProtocolCode(String protocolCode) { + this.protocolCode = protocolCode; + } + + public String getTransportCode() { + return transportCode; + } + + public void setTransportCode(String transportCode) { + this.transportCode = transportCode; + } + + public String getTransportUrl() { + return transportUrl; + } + + public void setTransportUrl(String transportUrl) { + this.transportUrl = transportUrl; + } + + public Map getOptions() { + return options; + } + + public void setOptions(Map options) { + this.options = options; + } + + public Map getAttributes() { + return attributes; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Driver.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Driver.java new file mode 100644 index 00000000000..7b9fed9eb86 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Driver.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.model; + +import java.util.Map; + +public class Driver { + + private final String code; + private final String name; + + private final boolean supportsDiscovery; + + private final Map configurationOptions; + private final Map transports; + + public Driver(String code, String name, boolean supportsDiscovery, Map configurationOptions, Map transports) { + this.code = code; + this.name = name; + this.supportsDiscovery = supportsDiscovery; + this.configurationOptions = configurationOptions; + this.transports = transports; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public boolean isSupportsDiscovery() { + return supportsDiscovery; + } + + public Map getConfigurationOptions() { + return configurationOptions; + } + + public Map getTransports() { + return transports; + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Transport.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Transport.java new file mode 100644 index 00000000000..aebe8a59e19 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/model/Transport.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.model; + +import java.util.Map; + +public class Transport { + + private final String code; + private final String name; + + private final Map options; + + public Transport(String code, String name, Map options) { + this.code = code; + this.name = name; + this.options = options; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public Map getOptions() { + return options; + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/repository/DeviceRepository.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/repository/DeviceRepository.java new file mode 100644 index 00000000000..067478b5f56 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/repository/DeviceRepository.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.repository; + +import org.apache.plc4x.java.tools.ui.model.Device; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DeviceRepository extends JpaRepository { +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DeviceService.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DeviceService.java new file mode 100644 index 00000000000..40dc657d5a2 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DeviceService.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.service; + +import org.apache.plc4x.java.api.PlcDriverManager; +import org.apache.plc4x.java.tools.ui.model.Device; +import org.apache.plc4x.java.tools.ui.repository.DeviceRepository; +import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; + +@Component +public class DeviceService { + + private final DeviceRepository deviceRepository; + private final ApplicationEventPublisher publisher; + private final CachedPlcConnectionManager cachedPlcConnectionManager; + + public DeviceService(DeviceRepository deviceRepository, ApplicationEventPublisher publisher, PlcDriverManager driverManager) { + this.deviceRepository = deviceRepository; + this.publisher = publisher; + this.cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(driverManager.getConnectionManager()).build(); + } + + public List getAllDevices() { + return deviceRepository.findAll(); + } + + public Device createDevice(Device device) { + return deviceRepository.save(device); + } + + public Optional readDevice(Integer id) { + return deviceRepository.findById(id); + } + + public Device updateDevice(Device device) { + return deviceRepository.save(device); + } + + public void deleteDevice(Device device) { + deviceRepository.delete(device); + } + +} diff --git a/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DriverService.java b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DriverService.java new file mode 100644 index 00000000000..9ae4bda8cf6 --- /dev/null +++ b/plc4j/tools/ui/backend/src/main/java/org/apache/plc4x/java/tools/ui/service/DriverService.java @@ -0,0 +1,138 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.plc4x.java.tools.ui.service; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.plc4x.java.api.PlcDriver; +import org.apache.plc4x.java.api.PlcDriverManager; +import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; +import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; +import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; +import org.apache.plc4x.java.spi.configuration.annotations.ComplexConfigurationParameter; +import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter; +import org.apache.plc4x.java.spi.configuration.annotations.Required; +import org.apache.plc4x.java.tools.ui.event.DeviceEvent; +import org.apache.plc4x.java.tools.ui.event.EventType; +import org.apache.plc4x.java.tools.ui.model.ConfigurationOption; +import org.apache.plc4x.java.tools.ui.model.Device; +import org.apache.plc4x.java.tools.ui.model.Driver; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +@Component +public class DriverService { + + private static final String ALL_DRIVERS = "all"; + + private final PlcDriverManager driverManager; + + private final ApplicationEventPublisher applicationEventPublisher; + + public DriverService(PlcDriverManager driverManager, ApplicationEventPublisher applicationEventPublisher) { + this.driverManager = driverManager; + this.applicationEventPublisher = applicationEventPublisher; + } + + public List getDriverList() { + List drivers = new ArrayList<>(); + for (String protocolCode : driverManager.listDrivers()) { + try { + PlcDriver driver = driverManager.getDriver(protocolCode); + PlcDriverMetadata metadata = driver.getMetadata(); + + // Get a description of all supported configuration options of the given driver. + Class configurationType = driver.getConfigurationType(); + Map configurationOptions = Arrays.stream(FieldUtils.getAllFields(configurationType)) + .filter(field -> (field.getAnnotation(ConfigurationParameter.class) != null) || (field.getAnnotation(ComplexConfigurationParameter.class) != null)) + .map(field -> new ConfigurationOption(field.getName(), field.getType().getTypeName(), field.isAnnotationPresent(Required.class), ConfigurationFactory.getDefaultValueFromAnnotation(field))) + .collect(Collectors.toMap( + ConfigurationOption::getName, + Function.identity() + )); + + // TODO: Get a list of all directly supported transports and for each a list of the configuration options. + + drivers.add(new Driver(protocolCode, driver.getProtocolName(), metadata.canDiscover(), configurationOptions, null)); + } catch (Exception e) { + throw new RuntimeException("Error retrieving driver list", e); + } + } + return drivers; + } + + public void discover(String protocolCode) { + if(ALL_DRIVERS.equals(protocolCode)) { + for (String curProtocolCode : driverManager.listDrivers()) { + try { + if("modbus-tcp".equals(curProtocolCode)) { + continue; + } + PlcDriver driver = driverManager.getDriver(curProtocolCode); + if (driver.getMetadata().canDiscover()) { + discoverProtocol(curProtocolCode); + } + } catch (PlcConnectionException e) { + throw new RuntimeException(e); + } + } + } else { + discoverProtocol(protocolCode); + } + } + + private void discoverProtocol(String protocolCode) { + try { + PlcDriver driver = driverManager.getDriver(protocolCode); + if (!driver.getMetadata().canDiscover()) { + throw new RuntimeException("Driver doesn't support discovery"); + } else { + PlcDiscoveryRequest request = driver.discoveryRequestBuilder().addQuery("all", "*").build(); + // Execute the discovery request and have all connections found be added as connections. + request.executeWithHandler(discoveryItem -> { + Map attributes = new HashMap<>(); + for (String attributeName : discoveryItem.getAttributes().keySet()) { + String attributeValue = discoveryItem.getAttributes().get(attributeName).getString(); + attributes.put(attributeName, attributeValue); + } + Device device = new Device(); + device.setName(discoveryItem.getName()); + device.setProtocolCode(discoveryItem.getProtocolCode()); + device.setTransportCode(discoveryItem.getTransportCode()); + device.setTransportUrl(discoveryItem.getTransportUrl()); + device.setOptions(discoveryItem.getOptions()); + device.setAttributes(attributes); + applicationEventPublisher.publishEvent(new DeviceEvent(device, EventType.CREATED)); + }).whenComplete((plcDiscoveryResponse, throwable) -> { + if(throwable != null) { + throw new RuntimeException("Error executing discovery", throwable); + } + }); + } + } catch (PlcConnectionException e) { + throw new RuntimeException("Error getting driver", e); + } + } + +} diff --git a/plc4j/tools/ui/backend/ws.html b/plc4j/tools/ui/backend/ws.html new file mode 100644 index 00000000000..492e0ae1062 --- /dev/null +++ b/plc4j/tools/ui/backend/ws.html @@ -0,0 +1,36 @@ + + + + + + Profile notification client + + + + + + diff --git a/plc4j/tools/ui/frontend/frontend/.eslintrc.cjs b/plc4j/tools/ui/frontend/frontend/.eslintrc.cjs new file mode 100644 index 00000000000..398c39fc323 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/.eslintrc.cjs @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/plc4j/tools/ui/frontend/frontend/.gitignore b/plc4j/tools/ui/frontend/frontend/.gitignore new file mode 100644 index 00000000000..7445c69d6e3 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Inspect directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/package-lock.json diff --git a/plc4j/tools/ui/frontend/frontend/README.md b/plc4j/tools/ui/frontend/frontend/README.md new file mode 100644 index 00000000000..8b12d8dbbf5 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/README.md @@ -0,0 +1,49 @@ + + +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/plc4j/tools/ui/frontend/frontend/index.html b/plc4j/tools/ui/frontend/frontend/index.html new file mode 100644 index 00000000000..abc30c4b2ed --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/index.html @@ -0,0 +1,32 @@ + + + + + + + + + Vite + React + TS + + +
+ + + diff --git a/plc4j/tools/ui/frontend/frontend/package.json b/plc4j/tools/ui/frontend/frontend/package.json new file mode 100644 index 00000000000..a8072d63210 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/package.json @@ -0,0 +1,51 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mdi/js": "^7.3.67", + "@mdi/react": "^1.6.1", + "@mui/icons-material": "^5.14.19", + "@mui/material": "^5.15.5", + "@reduxjs/toolkit": "^2.0.1", + "axios": "^1.6.2", + "primeflex": "^3.3.1", + "primeicons": "^6.0.1", + "primereact": "10.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^9.0.4", + "react-router-dom": "^6.20.1", + "react-use-websocket": "^4.5.0" + }, + "devDependencies": { + "@types/react": "^18.2.37", + "@types/react-dom": "^18.2.15", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "@vitejs/plugin-react": "^4.2.0", + "eslint": "^8.53.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.4", + "typescript": "^5.2.2", + "vite": "^5.0.0" + }, + "proxy": { + "/ws": { + "target": "ws://localhost:8080", + "ws": true + }, + "/": { + "target": "http://localhost:8080" + } + } +} diff --git a/plc4j/tools/ui/frontend/frontend/public/plc4x-favicon.png b/plc4j/tools/ui/frontend/frontend/public/plc4x-favicon.png new file mode 100644 index 00000000000..9b415719146 Binary files /dev/null and b/plc4j/tools/ui/frontend/frontend/public/plc4x-favicon.png differ diff --git a/plc4j/tools/ui/frontend/frontend/src/App.css b/plc4j/tools/ui/frontend/frontend/src/App.css new file mode 100644 index 00000000000..bd244d07ab4 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/App.css @@ -0,0 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + diff --git a/plc4j/tools/ui/frontend/frontend/src/App.tsx b/plc4j/tools/ui/frontend/frontend/src/App.tsx new file mode 100644 index 00000000000..85ba9180d52 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/App.tsx @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import './App.css' +import axios from 'axios'; +import {createBrowserRouter, RouterProvider} from "react-router-dom"; +import MainLayout from "./layouts/MainLayout.tsx"; +import Inspect from "./pages/Inspect.tsx"; +import OpcUa from "./pages/OpcUa.tsx"; +import Mqtt from "./pages/Mqtt.tsx"; +import Settings from "./pages/Settings.tsx"; +import About from "./pages/About.tsx"; +import useWebSocket from 'react-use-websocket'; +import {useState} from "react"; +import {DeviceEvent, RestApplicationClient} from "./generated/plc4j-tools-ui-frontend.ts"; +import store, { + addDevice, + deleteDevice, + DeviceAction, + InitializeConnectionsAction, + initializeLists, + updateDevice +} from "./store"; + +axios.defaults.baseURL = 'http://localhost:8080'; +const restClient = new RestApplicationClient(axios); + +// We're actually just using this concept in order to separate the layout for the general page from the content. +const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + {path: '/inspect', element: }, + {path: '/opcua', element: }, + {path: '/mqtt', element: }, + {path: '/settings', element: }, + {path: '/about', element: }, + ] + }, +]) + +function App() { + const [initialized, setInitialized] = useState(false) + + useWebSocket( 'ws://localhost:8080/ws', { + onOpen: () => { + console.log('WebSocket connection established.'); + }, + onMessage: event => { + const deviceEvent = JSON.parse(event.data) as DeviceEvent; + if(deviceEvent != null) { + switch (deviceEvent.eventType) { + case "CREATED": { + const action:DeviceAction = {device: deviceEvent.source} + store.dispatch(addDevice(action)); + break; + } + case "UPDATED": { + const action:DeviceAction = {device: deviceEvent.source} + updateDevice(action) + break; + } + case "DELETED": { + const action: DeviceAction = {device: deviceEvent.source} + deleteDevice(action) + break; + } + } + } + } + }); + + // Load the initial list of drivers and connections and initialize the store with that. + if(!initialized) { + setInitialized(true); + restClient.getAllDrivers().then(driverList => { + restClient.getAllDevices().then(deviceList => { + const action:InitializeConnectionsAction = {driverList:driverList.data, deviceList: deviceList.data} + store.dispatch(initializeLists(action)) + }) + }) + } + + return ( + + ) +} + +export default App diff --git a/plc4j/tools/ui/frontend/frontend/src/assets/plc4x-logo.svg b/plc4j/tools/ui/frontend/frontend/src/assets/plc4x-logo.svg new file mode 100644 index 00000000000..b34c1c3b05c --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/assets/plc4x-logo.svg @@ -0,0 +1,1494 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Asset 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/assets/react.svg b/plc4j/tools/ui/frontend/frontend/src/assets/react.svg new file mode 100644 index 00000000000..d150b944d2a --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/assets/react.svg @@ -0,0 +1,23 @@ + + \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/components/DeviceDialog.tsx b/plc4j/tools/ui/frontend/frontend/src/components/DeviceDialog.tsx new file mode 100644 index 00000000000..8c659f695bb --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/components/DeviceDialog.tsx @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Device} from "../generated/plc4j-tools-ui-frontend.ts"; +import {Dialog} from "primereact/dialog"; +import {Button} from "primereact/button"; +import {InputText} from "primereact/inputtext"; +import {DataTable} from "primereact/datatable"; +import {Column} from "primereact/column"; + +interface ConnectionDialogProps { + device: Device + visible: boolean + + onSave: (device:Device) => void + onCancel: () => void +} + +interface TableEntry { + key: string + value: string +} + +type Dictionary = { [index: string]: string } + +function mapToTableEntry(map : Dictionary):TableEntry[] { + let tableEntries = [] as TableEntry[] + for(const key in map) { + const value = map[key] + tableEntries = [...tableEntries, {key: key, value: value}] + } + return tableEntries +} + +export default function DeviceDialog({device, visible, onSave, onCancel}: ConnectionDialogProps) { + function handleSave() { + onSave(device) + } + function handleCancel() { + onCancel() + } + + return ( + { + }}> +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + + +
+
+
+ +
+ + + + +
+
+
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/components/NavigationTree.tsx b/plc4j/tools/ui/frontend/frontend/src/components/NavigationTree.tsx new file mode 100644 index 00000000000..3bddf5e49ad --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/components/NavigationTree.tsx @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {TreeItemData} from "../model/TreeItemData.ts"; +import {Tree} from "primereact/tree"; +import {TreeNode} from "primereact/treenode"; +import {IconType} from "primereact/utils"; +import 'primeicons/primeicons.css'; +import {useRef, useState} from "react"; +import {ContextMenu} from "primereact/contextmenu"; +import {MenuItem} from "primereact/menuitem"; +import {Device, RestApplicationClient} from "../generated/plc4j-tools-ui-frontend.ts"; +import axios from "axios"; +import {Counter} from "../utils/Counter.ts"; +import DeviceDialog from "./DeviceDialog.tsx"; + +type NavigationTreeProps = { + treeItems: TreeItemData[]; +} + +const restClient = new RestApplicationClient(axios); + +export default function NavigationTree({treeItems}: NavigationTreeProps) { + const dialogDevice = useRef({ + id: 0, + name: "", + protocolCode: "", + transportCode: "", + transportUrl: "", + options: {}, + attributes: {}, + }); + const [showDeviceDialog, setShowDeviceDialog] = useState(false) + + const cm = useRef(null); + const menu = [ + { + key: "1", + label: 'Discover', + data: "discover-data", + icon: 'pi pi-search', + disabled: false, + } as MenuItem, + { + key: "2", + label: 'Add', + data: "add-data", + icon: 'pi pi-plus-circle', + disabled: false, + } as MenuItem, + { + key: "3", + label: 'Edit', + data: "edit-data", + icon: 'pi pi-pencil', + disabled: false, + } as MenuItem, + { + key: "4", + label: 'Delete', + data: "delete-data", + icon: 'pi pi-minus-circle', + disabled: false, + } as MenuItem, + { + key: "5", + label: 'Connect', + data: "connect-data", + icon: 'pi pi-phone', + disabled: false, + } as MenuItem + ] as MenuItem[] + + function updateMenu(selectedItem: TreeItemData) { + // Discover + menu[0].disabled = !selectedItem.supportsDiscovery && selectedItem.type != "ROOT" + menu[0].command = () => { + restClient.discover(selectedItem.id) + } + + // Add + menu[1].disabled = selectedItem.type != "DRIVER" + menu[1].command = () => { + dialogDevice.current.id = 0; + dialogDevice.current.name = ""; + dialogDevice.current.transportCode = ""; + dialogDevice.current.transportUrl = ""; + dialogDevice.current.protocolCode = selectedItem.id; + dialogDevice.current.options = {}; + dialogDevice.current.attributes = {}; + setShowDeviceDialog(true); + } + + // Edit + menu[2].disabled = selectedItem.type != "DEVICE" + menu[2].command = () => { + console.log(JSON.stringify(selectedItem)) + if(selectedItem.device) { + dialogDevice.current.id = selectedItem.device.id; + dialogDevice.current.name = selectedItem.device.name; + dialogDevice.current.transportCode = selectedItem.device.transportCode; + dialogDevice.current.transportUrl = selectedItem.device.transportUrl; + dialogDevice.current.protocolCode = selectedItem.device.protocolCode; + dialogDevice.current.options = selectedItem.device.options; + dialogDevice.current.attributes = selectedItem.device.attributes; + setShowDeviceDialog(true); + } + } + // Delete + menu[3].disabled = selectedItem.type != "DEVICE" + menu[3].command = () => { + // TODO: Ask for confirmation ... + } + // Connect + menu[4].disabled = selectedItem.type != "DEVICE" + menu[4].command = () => { + // TODO: Open a new tab with the connection ... + } + } + + function getIcon(curItem: TreeItemData): IconType { + switch (curItem.type) { + case "DRIVER": + return "pi pi-fw pi-folder-open"//"material-icons md-18 folder_open" + case "CONNECTION": + return "pi pi-fw pi-phone"//"material-icons md-18 tty" + case "DEVICE": + return "pi pi-fw"//"material-icons md-18 computer" + + // discover: "Radar" + // browse: "Manage Search" + // read: "Keyboard Arrow Down" + // write: "Keyboard Arrow Up" + // subscribe: "Keyboard Double Arrow Down" + // publish: "Keyboard Double Arrow Up" + } + } + + function createTreeNode(curItem: TreeItemData, keyGenerator: Counter): TreeNode { + return { + key: keyGenerator.getAndIncrement(), + id: curItem.id, + label: curItem.name, + icon: getIcon(curItem), + data: curItem, + children: curItem.children?.map(value => createTreeNode(value, keyGenerator)) + } + } + + const treeNodes: TreeNode[] = treeItems.map(value => createTreeNode(value, new Counter())) + return ( +
+ + + { + if (cm.current) { + // Update the state of the menu (enabling/disabling some menu items) + updateMenu(event.node.data as TreeItemData) + //cm.current.props.model = menu + cm.current.show(event.originalEvent); + } + }}/> +
) +} \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/components/PlcConnection.tsx b/plc4j/tools/ui/frontend/frontend/src/components/PlcConnection.tsx new file mode 100644 index 00000000000..08c807a850c --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/components/PlcConnection.tsx @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import 'primeicons/primeicons.css'; +import {TabPanel} from "primereact/tabview"; +import {TreeTable} from "primereact/treetable"; +import {Column} from "primereact/column"; + +type PlcConnectionProps = { + connectionString: string; +} + +export default function PlcConnection({connectionString}: PlcConnectionProps) { + return ( + + + + + + + + + + + + + + ) +} \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/generated/plc4j-tools-ui-frontend.ts b/plc4j/tools/ui/frontend/frontend/src/generated/plc4j-tools-ui-frontend.ts new file mode 100644 index 00000000000..139e1cb75af --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/generated/plc4j-tools-ui-frontend.ts @@ -0,0 +1,202 @@ +/*- + * #%L + * plc4j-tools-ui-frontend + * %% + * Copyright (C) 2017 - 2024 The Apache Software Foundation + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ +/* tslint:disable */ +/* eslint-disable */ +// Generated using typescript-generator version 3.2.1263 on 2024-01-20 16:17:47. + +export interface Device { + id: number; + name: string; + protocolCode: string; + transportCode: string; + transportUrl: string; + options: { [index: string]: string }; + attributes: { [index: string]: string }; +} + +export interface Driver { + code: string; + name: string; + supportsDiscovery: boolean; + configurationOptions: { [index: string]: ConfigurationOption }; + transports: { [index: string]: Transport }; +} + +export interface UiApplicationEvent extends ApplicationEvent { + source: T; + eventType: EventType; +} + +export interface DeviceEvent extends UiApplicationEvent { + source: Device; +} + +export interface ConfigurationOption { + name: string; + typeName: string; + required: boolean; + defaultValue: any; +} + +export interface Transport { + code: string; + name: string; + options: { [index: string]: any }; +} + +export interface ApplicationEvent extends EventObject { + timestamp: number; +} + +export interface EventObject extends Serializable { + source: any; +} + +export interface Serializable { +} + +export interface HttpClient { + + request(requestConfig: { method: string; url: string; queryParams?: any; data?: any; copyFn?: (data: R) => R; options?: O; }): RestResponse; +} + +export class RestApplicationClient { + + constructor(protected httpClient: HttpClient) { + } + + /** + * HTTP DELETE /api/devices + * Java method: org.apache.plc4x.java.tools.ui.controller.DeviceController.deleteDevice + */ + deleteDevice(arg0: Device, options?: O): RestResponse { + return this.httpClient.request({ method: "DELETE", url: uriEncoding`api/devices`, data: arg0, options: options }); + } + + /** + * HTTP GET /api/devices + * Java method: org.apache.plc4x.java.tools.ui.controller.DeviceController.getAllDevices + */ + getAllDevices(options?: O): RestResponse { + return this.httpClient.request({ method: "GET", url: uriEncoding`api/devices`, options: options }); + } + + /** + * HTTP POST /api/devices + * Java method: org.apache.plc4x.java.tools.ui.controller.DeviceController.saveDevice + */ + saveDevice(arg0: Device, options?: O): RestResponse { + return this.httpClient.request({ method: "POST", url: uriEncoding`api/devices`, data: arg0, options: options }); + } + + /** + * HTTP GET /api/devices/{id} + * Java method: org.apache.plc4x.java.tools.ui.controller.DeviceController.getDeviceById + */ + getDeviceById(id: string, options?: O): RestResponse { + return this.httpClient.request({ method: "GET", url: uriEncoding`api/devices/${id}`, options: options }); + } + + /** + * HTTP GET /api/discover/{protocolCode} + * Java method: org.apache.plc4x.java.tools.ui.controller.DriverController.discover + */ + discover(protocolCode: string, options?: O): RestResponse { + return this.httpClient.request({ method: "GET", url: uriEncoding`api/discover/${protocolCode}`, options: options }); + } + + /** + * HTTP GET /api/drivers + * Java method: org.apache.plc4x.java.tools.ui.controller.DriverController.getAllDrivers + */ + getAllDrivers(options?: O): RestResponse { + return this.httpClient.request({ method: "GET", url: uriEncoding`api/drivers`, options: options }); + } +} + +export type RestResponse = Promise>; + +export type EventType = "CREATED" | "UPDATED" | "DELETED"; + +function uriEncoding(template: TemplateStringsArray, ...substitutions: any[]): string { + let result = ""; + for (let i = 0; i < substitutions.length; i++) { + result += template[i]; + result += encodeURIComponent(substitutions[i]); + } + result += template[template.length - 1]; + return result; +} + + +// Added by 'AxiosClientExtension' extension + +import axios from "axios"; +import * as Axios from "axios"; + +declare module "axios" { + export interface GenericAxiosResponse extends Axios.AxiosResponse { + data: R; + } +} + +class AxiosHttpClient implements HttpClient { + + constructor(private axios: Axios.AxiosInstance) { + } + + request(requestConfig: { method: string; url: string; queryParams?: any; data?: any; copyFn?: (data: R) => R; options?: Axios.AxiosRequestConfig; }): RestResponse { + function assign(target: any, source?: any) { + if (source != undefined) { + for (const key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + } + return target; + } + + const config: Axios.AxiosRequestConfig = {}; + config.method = requestConfig.method as typeof config.method; // `string` in axios 0.16.0, `Method` in axios 0.19.0 + config.url = requestConfig.url; + config.params = requestConfig.queryParams; + config.data = requestConfig.data; + assign(config, requestConfig.options); + const copyFn = requestConfig.copyFn; + + const axiosResponse = this.axios.request(config); + return axiosResponse.then(axiosResponse => { + if (copyFn && axiosResponse.data) { + (axiosResponse as any).originalData = axiosResponse.data; + axiosResponse.data = copyFn(axiosResponse.data); + } + return axiosResponse; + }); + } +} + +export class AxiosRestApplicationClient extends RestApplicationClient { + + constructor(baseURL: string, axiosInstance: Axios.AxiosInstance = axios.create()) { + axiosInstance.defaults.baseURL = baseURL; + super(new AxiosHttpClient(axiosInstance)); + } +} diff --git a/plc4j/tools/ui/frontend/frontend/src/index.css b/plc4j/tools/ui/frontend/frontend/src/index.css new file mode 100644 index 00000000000..f5e8d23f0ca --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/index.css @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#root { + height:100%; + width:100%!important; + background-color: gray; +} + +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +html { + height: 100%; +} + +body { + margin: 0; + display: flex; + place-items: center; + height:100% +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} + diff --git a/plc4j/tools/ui/frontend/frontend/src/layouts/MainLayout.tsx b/plc4j/tools/ui/frontend/frontend/src/layouts/MainLayout.tsx new file mode 100644 index 00000000000..70020e04e32 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/layouts/MainLayout.tsx @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import {Menubar} from "primereact/menubar"; +import {MenuItem} from "primereact/menuitem"; +import plc4xLogo from "../assets/plc4x-logo.svg"; +import {Image} from "primereact/image"; +import {Outlet, useNavigate} from "react-router-dom"; + +export default function MainLayout() { + const navigate = useNavigate(); + + const menuItems = [ + { + label: 'Inspect', + command() { + navigate('/inspect'); + } + }, + { + label: 'OPC-UA Server', + command() { + navigate('/opcua'); + } + }, + { + label: 'MQTT Emitter', + command() { + navigate('/mqtt'); + } + }, + { + label: 'Settings', + command() { + navigate('/settings'); + } + }, + { + label: 'About', + command() { + navigate('/about'); + } + } + ] as MenuItem[]; + + const startLogo = ; + + return ( + <> + +
+ +
+ + ) +} \ No newline at end of file diff --git a/plc4j/tools/ui/frontend/frontend/src/main.tsx b/plc4j/tools/ui/frontend/frontend/src/main.tsx new file mode 100644 index 00000000000..21455b05bcd --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/main.tsx @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' +import 'primereact/resources/themes/lara-light-indigo/theme.css'; +import 'primeicons/primeicons.css'; +import 'primereact/resources/primereact.css'; +import 'primeflex/primeflex.css' +import { Provider } from "react-redux"; +import store from "./store"; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + , +) diff --git a/plc4j/tools/ui/frontend/frontend/src/model/TreeItemData.ts b/plc4j/tools/ui/frontend/frontend/src/model/TreeItemData.ts new file mode 100644 index 00000000000..b361cedf018 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/model/TreeItemData.ts @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Device, Driver} from "../generated/plc4j-tools-ui-frontend.ts"; + +export type TreeItemType = "ROOT" | "DRIVER" | "CONNECTION" | "DEVICE"; + +export interface TreeItemData { + id: string, + name: string, + type: TreeItemType, + driver?: Driver, + device?: Device, + supportsDiscovery: boolean, + supportsBrowsing: boolean, + supportsReading: boolean, + supportsWriting: boolean, + supportsSubscribing: boolean, + supportsPublishing: boolean, + children?: readonly TreeItemData[] +} diff --git a/plc4j/tools/ui/frontend/frontend/src/pages/About.tsx b/plc4j/tools/ui/frontend/frontend/src/pages/About.tsx new file mode 100644 index 00000000000..e786aa5694c --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/pages/About.tsx @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function Inspect() { + return ( +

Settings

+ ) +} diff --git a/plc4j/tools/ui/frontend/frontend/src/pages/Inspect.tsx b/plc4j/tools/ui/frontend/frontend/src/pages/Inspect.tsx new file mode 100644 index 00000000000..f00735425b6 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/pages/Inspect.tsx @@ -0,0 +1,140 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import {TabPanel, TabView} from "primereact/tabview"; +import {Splitter, SplitterPanel} from "primereact/splitter"; +import {ScrollPanel} from "primereact/scrollpanel"; +import NavigationTree from "../components/NavigationTree.tsx"; +import PlcConnection from "../components/PlcConnection.tsx"; +import { useSelector } from "react-redux"; +import {Device, Driver} from "../generated/plc4j-tools-ui-frontend.ts"; +import {TreeItemData} from "../model/TreeItemData.ts"; +import {RootState} from "../store"; + +function getByDriverTree(driverList: Driver[], deviceList: Device[]):TreeItemData[] { + console.log("getByDriverTree " + JSON.stringify(driverList) + " " + JSON.stringify(deviceList)) + if(driverList && deviceList) { + const driverMap = new Map() + let drivers:TreeItemData[] = [] + driverList.forEach(value => { + const driverEntry:TreeItemData = { + id: value.code, + name: value.name, + type: "DRIVER", + driver: value, + supportsDiscovery: value.supportsDiscovery, + supportsBrowsing: false, + supportsReading: false, + supportsWriting: false, + supportsSubscribing: false, + supportsPublishing: false, + children: [] + } + driverMap.set(value.code, driverEntry) + drivers = [...drivers, driverEntry] + }) + drivers.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)) + + deviceList.forEach(value => { + const curDriverTreeItem = driverMap.get(value.protocolCode); + if(curDriverTreeItem && curDriverTreeItem.children) { + curDriverTreeItem.children = [...curDriverTreeItem.children, { + id: value.id?.toString(), + name: value.name, + type: "DEVICE", + device: value, + // Even if most connections will support reading/writing, in order to really know, we need a + // connection first. As we're not offering any connection-actions here anyway we just set all + // to false. + supportsDiscovery: false, + supportsBrowsing: false, + supportsReading: false, + supportsWriting: false, + supportsSubscribing: false, + supportsPublishing: false} as TreeItemData + ] + } + }) + + return [{ + id: "all", + name: "Root", + type: "ROOT", + supportsDiscovery: true, + supportsBrowsing: false, + supportsReading: false, + supportsWriting: false, + supportsSubscribing: false, + supportsPublishing: false, + children: drivers + }] + } + return [] +} + +function getByDeviceTree(deviceList: Device[]):TreeItemData[] { + console.log("getByDeviceTree " + JSON.stringify(deviceList)) + if(deviceList) { + // Group the connections by transport-url. + // TODO: Possibly create filters for the different types of urls (IP, Hostname, Port, Mac-Address, ...) + const deviceMap = new Map + deviceList.forEach(device => { + const devices = deviceMap.get(device.transportUrl) + if(devices) { + deviceMap.set(device.transportUrl, [...devices, device]) + } else { + deviceMap.set(device.transportUrl, [device]) + } + }) + + // Build a tree based on the grouped locations. + } + return [] +} + +export default function Inspect() { + const lists = useSelector((state: RootState) => { + console.log("Updated connections " + JSON.stringify(state.connections)) + return state.connections + }) + return ( + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/plc4j/tools/ui/frontend/frontend/src/pages/Mqtt.tsx b/plc4j/tools/ui/frontend/frontend/src/pages/Mqtt.tsx new file mode 100644 index 00000000000..cd3b4d09004 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/pages/Mqtt.tsx @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function Inspect() { + return ( +

MQTT

+ ) +} diff --git a/plc4j/tools/ui/frontend/frontend/src/pages/OpcUa.tsx b/plc4j/tools/ui/frontend/frontend/src/pages/OpcUa.tsx new file mode 100644 index 00000000000..9f75a32fb8e --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/pages/OpcUa.tsx @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function Inspect() { + return ( +

OPC-UA

+ ) +} diff --git a/plc4j/tools/ui/frontend/frontend/src/pages/Settings.tsx b/plc4j/tools/ui/frontend/frontend/src/pages/Settings.tsx new file mode 100644 index 00000000000..e786aa5694c --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/pages/Settings.tsx @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function Inspect() { + return ( +

Settings

+ ) +} diff --git a/plc4j/tools/ui/frontend/frontend/src/store/index.ts b/plc4j/tools/ui/frontend/frontend/src/store/index.ts new file mode 100644 index 00000000000..b9823c9c585 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/store/index.ts @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {configureStore, createSlice, PayloadAction} from '@reduxjs/toolkit' +import {Device, Driver} from "../generated/plc4j-tools-ui-frontend.ts"; +import {useDispatch} from "react-redux"; + +export type InitializeConnectionsAction = { + driverList: Driver[] + deviceList: Device[] +} + +export type DeviceAction = { + device: Device +} + +export interface ConnectionsState { + driverList: Driver[] + deviceList: Device[] +} + +const connectionsInitialState: ConnectionsState = { + driverList: [] as Driver[], + deviceList: [] as Device[], +} + +const connectionsSlice = createSlice({ + name: 'connections', + initialState: connectionsInitialState, + reducers: { + initializeLists: (state, action: PayloadAction) => { + state.driverList = action.payload.driverList + state.deviceList = action.payload.deviceList + }, + addDevice: (state, action: PayloadAction) => { + console.log("ADD " + action) + state.deviceList = [...state.deviceList, action.payload.device] + }, + updateDevice: (state, action: PayloadAction) => { + console.log("UPDATE " + action) + const device = state.deviceList.find(value => value.id == action.payload.device.id); + if (device) { + const index = state.deviceList.indexOf(device); + if (index) { + state.deviceList.splice(index, 1, action.payload.device); + } + } + }, + deleteDevice: (state, action: PayloadAction) => { + console.log("DELETE " + action) + const device = state.deviceList.find(value => value.id == action.payload.device.id); + if (device) { + const index = state.deviceList.indexOf(device); + if (index) { + state.deviceList.splice(index, 1); + } + } + } + } +}) + +export const { initializeLists, addDevice, updateDevice, deleteDevice } = connectionsSlice.actions + +const store = configureStore({ + reducer: { + connections: connectionsSlice.reducer + } +}) +export default store + +// Infer the `RootState` and `AppDispatch` types from the store itself +export type RootState = ReturnType +// Inferred type: {connections: ConnectionsState} +export type AppDispatch = typeof store.dispatch +export const useAppDispatch: () => AppDispatch = useDispatch diff --git a/plc4j/tools/ui/frontend/frontend/src/utils/Counter.ts b/plc4j/tools/ui/frontend/frontend/src/utils/Counter.ts new file mode 100644 index 00000000000..4f44ad300c6 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/utils/Counter.ts @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export class Counter { + + private _value:number = 0; + + public getAndIncrement():number { + return this._value++ + } + +} diff --git a/plc4j/tools/ui/frontend/frontend/src/vite-env.d.ts b/plc4j/tools/ui/frontend/frontend/src/vite-env.d.ts new file mode 100644 index 00000000000..1a3bdc26658 --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/src/vite-env.d.ts @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/// diff --git a/plc4j/tools/ui/frontend/frontend/tsconfig.json b/plc4j/tools/ui/frontend/frontend/tsconfig.json new file mode 100644 index 00000000000..a7fc6fbf23d --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/plc4j/tools/ui/frontend/frontend/tsconfig.node.json b/plc4j/tools/ui/frontend/frontend/tsconfig.node.json new file mode 100644 index 00000000000..42872c59f5b --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/plc4j/tools/ui/frontend/frontend/vite.config.ts b/plc4j/tools/ui/frontend/frontend/vite.config.ts new file mode 100644 index 00000000000..7f9b416f55d --- /dev/null +++ b/plc4j/tools/ui/frontend/frontend/vite.config.ts @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/plc4j/tools/ui/frontend/pom.xml b/plc4j/tools/ui/frontend/pom.xml new file mode 100644 index 00000000000..525a10db02d --- /dev/null +++ b/plc4j/tools/ui/frontend/pom.xml @@ -0,0 +1,210 @@ + + + + 4.0.0 + + + org.apache.plc4x + plc4j-tools-ui + 0.12.0-SNAPSHOT + + + plc4j-tools-ui-frontend + + + + + + + + cz.habarta.typescript-generator + typescript-generator-maven-plugin + 3.2.1263 + + + generate-rest-client + generate-sources + + generate + + + false + + + + org.apache.plc4x.java.tools.ui.model.Device + org.apache.plc4x.java.tools.ui.model.Driver + org.apache.plc4x.java.tools.ui.event.EventType + org.apache.plc4x.java.tools.ui.event.UiApplicationEvent + org.apache.plc4x.java.tools.ui.event.DeviceEvent + + org.apache.plc4x.java.tools.ui.controller.DeviceController + org.apache.plc4x.java.tools.ui.controller.DriverController + + + java.lang.Comparable + + + cz.habarta.typescript.generator.ext.AxiosClientExtension + + module + implementationFile + true + true + true + jackson2 + AxiosRequestConfig + AxiosPromise + frontend/src/generated/plc4j-tools-ui-frontend.ts + + + + + + cz.habarta.typescript-generator + typescript-generator-spring + 3.2.1263 + + + + + org.codehaus.mojo + license-maven-plugin + 2.3.0 + + + add-apache-headers + process-sources + + update-file-header + + + apache_v2 + + frontend/src/generated + + + + + + + com.github.eirslett + frontend-maven-plugin + 1.14.2 + + + install-node-and-npm + generate-resources + + install-node-and-npm + + + + npm-install + generate-resources + + npm + + + install + + + + npm-run-build + compile + + npm + + + run build + + + + + frontend + v20.9.0 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + default-jar + package + + jar + + + frontend/dist + + ** + + + + + + + + org.apache.rat + apache-rat-plugin + + + frontend/dist/** + frontend/node/** + frontend/node_modules/** + + + + + + + + + org.apache.plc4x + plc4j-api + 0.12.0-SNAPSHOT + provided + + + org.apache.plc4x + plc4j-tools-ui-backend + 0.12.0-SNAPSHOT + provided + + + + diff --git a/plc4j/tools/ui/pom.xml b/plc4j/tools/ui/pom.xml new file mode 100644 index 00000000000..edb630124d2 --- /dev/null +++ b/plc4j/tools/ui/pom.xml @@ -0,0 +1,113 @@ + + + + + 4.0.0 + + + org.apache.plc4x + plc4j-tools + 0.12.0-SNAPSHOT + + + plc4j-tools-ui + pom + + PLC4J: Tools: UI + Parent for the UI project, bundling the backend and the frontend part together. + + + 2023-11-02T07:23:09Z + 3.2.1 + + 10.17.1.0 + + + + application + backend + frontend + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + + enforce-java-compatability + + enforce + + + + + 19 + + + + + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + org.apache.derby + derby + ${derby.version} + + + org.apache.derby + derbytools + ${derby.version} + + + jakarta.annotation + jakarta.annotation-api + 2.1.1 + + + org.aspectj + aspectjweaver + 1.9.20.1 + + + + + \ No newline at end of file diff --git a/plc4j/transports/can/pom.xml b/plc4j/transports/can/pom.xml index 0163d5bb429..df1da86d1be 100644 --- a/plc4j/transports/can/pom.xml +++ b/plc4j/transports/can/pom.xml @@ -36,6 +36,11 @@
+ + org.apache.plc4x + plc4j-api + 0.12.0-SNAPSHOT + org.apache.plc4x plc4j-spi diff --git a/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/CANTransport.java b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/CANTransport.java index 31869d5be3d..6f46078d8ff 100644 --- a/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/CANTransport.java +++ b/plc4j/transports/can/src/main/java/org/apache/plc4x/java/transport/can/CANTransport.java @@ -22,7 +22,8 @@ Licensed to the Apache Software Foundation (ASF) under one import java.util.function.Function; import java.util.function.ToIntFunction; -import org.apache.plc4x.java.spi.configuration.Configuration; + +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.spi.generation.Message; import org.apache.plc4x.java.spi.generation.MessageInput; import org.apache.plc4x.java.spi.transport.Transport; @@ -33,7 +34,7 @@ public interface CANTransport extends Transport { Class getMessageType(); - MessageInput getMessageInput(Configuration configuration); + MessageInput getMessageInput(PlcConnectionConfiguration configuration); CANFrameBuilder getTransportFrameBuilder(); diff --git a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java index 433fa839a0f..5370d165506 100644 --- a/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java +++ b/plc4j/transports/socketcan/src/main/java/org/apache/plc4x/java/transport/socketcan/SocketCANTransport.java @@ -23,9 +23,9 @@ import java.util.function.Function; import java.util.function.ToIntFunction; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.socketcan.readwrite.SocketCANFrame; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.ChannelFactory; import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.transport.can.CANFrameBuilder; @@ -60,7 +60,7 @@ public ToIntFunction getEstimator() { } @Override - public MessageInput getMessageInput(Configuration cfg) { + public MessageInput getMessageInput(PlcConnectionConfiguration cfg) { return SocketCANFrame::staticParse; } diff --git a/plc4j/transports/test/pom.xml b/plc4j/transports/test/pom.xml index dec6b8303d9..eff2360ef14 100644 --- a/plc4j/transports/test/pom.xml +++ b/plc4j/transports/test/pom.xml @@ -36,6 +36,11 @@ + + org.apache.plc4x + plc4j-api + 0.12.0-SNAPSHOT + org.apache.plc4x plc4j-spi diff --git a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java index f7ac12bf382..32e22569a47 100644 --- a/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java +++ b/plc4j/transports/virtualcan/src/main/java/org/apache/plc4x/java/transport/virtualcan/VirtualCANTransport.java @@ -19,8 +19,8 @@ package org.apache.plc4x.java.transport.virtualcan; import io.netty.buffer.ByteBuf; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.transport.can.CANFrameBuilder; import org.apache.plc4x.java.transport.can.CANTransport; @@ -109,7 +109,7 @@ public byte[] getData() { } @Override - public MessageInput getMessageInput(Configuration configuration) { + public MessageInput getMessageInput(PlcConnectionConfiguration configuration) { return new VirtualCANFrameIO(); } diff --git a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs index 698c63fe191..b26c08f82a2 100644 --- a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs +++ b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs @@ -682,8 +682,11 @@ public enum KnxManufacturer M_CAV_AUDIOGUANGZHOUCO__LTD = 655, M_HELKAMA_BICA_OY = 656, M_MODULYTE = 657, - M_ABB___RESERVED = 658, - M_BUSCH_JAEGER_ELEKTRO___RESERVED = 659, + M_CONSOLINNO_ENERGY_GMBH = 658, + M_SCHIDERON_ELECTRIC_ASIA_LIMITED = 659, + M_3R = 660, + M_ABB___RESERVED = 661, + M_BUSCH_JAEGER_ELEKTRO___RESERVED = 662, } public static class KnxManufacturerInfo @@ -2556,15 +2559,24 @@ public static class KnxManufacturerInfo case KnxManufacturer.M_MODULYTE: { /* '657' */ return 715; } - case KnxManufacturer.M_ABB___RESERVED: { /* '658' */ - return 43954; + case KnxManufacturer.M_CONSOLINNO_ENERGY_GMBH: { /* '658' */ + return 716; } - case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '659' */ - return 43959; + case KnxManufacturer.M_SCHIDERON_ELECTRIC_ASIA_LIMITED: { /* '659' */ + return 717; } case KnxManufacturer.M_RTS_AUTOMATION: { /* '66' */ return 105; } + case KnxManufacturer.M_3R: { /* '660' */ + return 718; + } + case KnxManufacturer.M_ABB___RESERVED: { /* '661' */ + return 43954; + } + case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '662' */ + return 43959; + } case KnxManufacturer.M_EIBMARKT_GMBH: { /* '67' */ return 106; } @@ -4546,15 +4558,24 @@ public static string Name(this KnxManufacturer value) case KnxManufacturer.M_MODULYTE: { /* '657' */ return "ModuLyte"; } - case KnxManufacturer.M_ABB___RESERVED: { /* '658' */ - return "ABB - reserved"; + case KnxManufacturer.M_CONSOLINNO_ENERGY_GMBH: { /* '658' */ + return "Consolinno Energy GmbH"; } - case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '659' */ - return "Busch-Jaeger Elektro - reserved"; + case KnxManufacturer.M_SCHIDERON_ELECTRIC_ASIA_LIMITED: { /* '659' */ + return "SCHIDERON ELECTRIC (ASIA) LIMITED"; } case KnxManufacturer.M_RTS_AUTOMATION: { /* '66' */ return "RTS Automation"; } + case KnxManufacturer.M_3R: { /* '660' */ + return "3R"; + } + case KnxManufacturer.M_ABB___RESERVED: { /* '661' */ + return "ABB - reserved"; + } + case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '662' */ + return "Busch-Jaeger Elektro - reserved"; + } case KnxManufacturer.M_EIBMARKT_GMBH: { /* '67' */ return "EIBMARKT GmbH"; } diff --git a/pom.xml b/pom.xml index 52e2ffea595..0fc8a0d633b 100644 --- a/pom.xml +++ b/pom.xml @@ -137,7 +137,8 @@ 6.5.1 4.0.4 - 12.0.5 + + 11.0.19 5.14.0 2.12.6 2.10.4 @@ -905,6 +906,20 @@ true
+ + + enforce-java-compatability + + enforce + + + + + 11 + + + + enforce-version-convergence @@ -1037,7 +1052,8 @@ org.apache.rat apache-rat-plugin - 0.16 + + 0.15 + 3.26.3-b1 diff --git a/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec b/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec index 3860325e2f2..b49f4330afb 100644 --- a/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec +++ b/protocols/bacnetip/src/main/generated/protocols/bacnetip/bacnet-vendorids.mspec @@ -1472,6 +1472,9 @@ ['1457' AETERLINK_CORPORATION ['1457', '"Aeterlink Corporation"']] ['1458' ALPHA_EPSILON_AUTOMATION ['1458', '"Alpha Epsilon Automation"']] ['1459' ASTRALITE_INC ['1459', '"Astralite Inc."']] + ['1460' DELTA_FIRE_LTDA ['1460', '"Delta Fire Ltda."']] + ['1461' BOCK_WATER_HEATERS_INC ['1461', '"Bock Water Heaters, Inc."']] + ['1462' CLEAVER_BROOKS ['1462', '"Cleaver-Brooks"']] ['0xFFFF' UNKNOWN_VENDOR ['0xFFFF', '"Unknown"']] ] diff --git a/protocols/knxnetip/src/main/generated/protocols/knxnetip/knx-master-data.mspec b/protocols/knxnetip/src/main/generated/protocols/knxnetip/knx-master-data.mspec index a162508f1f4..e53ad10795f 100644 --- a/protocols/knxnetip/src/main/generated/protocols/knxnetip/knx-master-data.mspec +++ b/protocols/knxnetip/src/main/generated/protocols/knxnetip/knx-master-data.mspec @@ -1406,8 +1406,11 @@ ['655' M_CAV_AUDIOGUANGZHOUCO__LTD ['713', '"CAV AUDIO(GUANGZHOU)CO.,LTD"']] ['656' M_HELKAMA_BICA_OY ['714', '"Helkama Bica Oy"']] ['657' M_MODULYTE ['715', '"ModuLyte"']] - ['658' M_ABB___RESERVED ['43954', '"ABB - reserved"']] - ['659' M_BUSCH_JAEGER_ELEKTRO___RESERVED ['43959', '"Busch-Jaeger Elektro - reserved"']] + ['658' M_CONSOLINNO_ENERGY_GMBH ['716', '"Consolinno Energy GmbH"']] + ['659' M_SCHIDERON_ELECTRIC_ASIA_LIMITED ['717', '"SCHIDERON ELECTRIC (ASIA) LIMITED"']] + ['660' M_3R ['718', '"3R"']] + ['661' M_ABB___RESERVED ['43954', '"ABB - reserved"']] + ['662' M_BUSCH_JAEGER_ELEKTRO___RESERVED ['43959', '"Busch-Jaeger Elektro - reserved"']] ] diff --git a/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryDriver.java b/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryDriver.java index ec618e34922..c878cf879c3 100644 --- a/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryDriver.java +++ b/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryDriver.java @@ -21,6 +21,7 @@ import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.PlcDriver; import org.apache.plc4x.java.api.authentication.PlcAuthentication; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; /** @@ -49,4 +50,9 @@ public PlcConnection getConnection(String url, PlcAuthentication authentication) throw new PlcConnectionException("Authentication not supported."); } + @Override + public Class getConfigurationType() { + return null; + } + } diff --git a/sandbox/plc4py/plc4py/drivers/modbus/ModbusConfiguration.py b/sandbox/plc4py/plc4py/drivers/modbus/ModbusConfiguration.py index 83a0d50eb6b..f3d897b1689 100644 --- a/sandbox/plc4py/plc4py/drivers/modbus/ModbusConfiguration.py +++ b/sandbox/plc4py/plc4py/drivers/modbus/ModbusConfiguration.py @@ -23,6 +23,7 @@ class ModbusConfiguration(PlcConfiguration): """ Specific Modbus Configuration """ + def __init__(self, url): super().__init__(url) diff --git a/sandbox/plc4py/plc4py/drivers/modbus/ModbusConnection.py b/sandbox/plc4py/plc4py/drivers/modbus/ModbusConnection.py index 0aa89b86834..670ba77d14a 100644 --- a/sandbox/plc4py/plc4py/drivers/modbus/ModbusConnection.py +++ b/sandbox/plc4py/plc4py/drivers/modbus/ModbusConnection.py @@ -48,7 +48,7 @@ class ModbusConnection(PlcConnection): def __init__(self, config: ModbusConfiguration, transport: Plc4xBaseTransport): super().__init__(config) - self._configuration : ModbusConfiguration + self._configuration: ModbusConfiguration self._device: ModbusDevice = ModbusDevice(self._configuration) self._transport: Plc4xBaseTransport = transport @@ -64,11 +64,14 @@ async def create(url: str): config = ModbusConfiguration(url) loop = asyncio.get_running_loop() connection_future = loop.create_future() - transport = await asyncio.wait_for(TCPTransport.create( - protocol_factory=lambda: ModbusProtocol(connection_future), - host=config.host, - port=config.port, - ), 10) + transport = await asyncio.wait_for( + TCPTransport.create( + protocol_factory=lambda: ModbusProtocol(connection_future), + host=config.host, + port=config.port, + ), + 10, + ) return ModbusConnection(config, transport) def is_connected(self) -> bool: @@ -152,6 +155,7 @@ class ModbusDriverLoader(PlcDriverLoader): """ Modbus Driver Pluggy Hook Implmentation, lets pluggy find the driver by name """ + @staticmethod @plc4py.hookimpl def get_driver() -> Type[ModbusDriver]: diff --git a/sandbox/plc4py/plc4py/drivers/modbus/ModbusDevice.py b/sandbox/plc4py/plc4py/drivers/modbus/ModbusDevice.py index bdb5c53f840..9a0157d2c1e 100644 --- a/sandbox/plc4py/plc4py/drivers/modbus/ModbusDevice.py +++ b/sandbox/plc4py/plc4py/drivers/modbus/ModbusDevice.py @@ -121,7 +121,11 @@ async def read( result = message_future.result() if isinstance(result, ModbusPDUError): - response_items = [ResponseItem(PlcResponseCode.ACCESS_DENIED, PlcNull(result.exception_code))] + response_items = [ + ResponseItem( + PlcResponseCode.ACCESS_DENIED, PlcNull(result.exception_code) + ) + ] response = PlcReadResponse( PlcResponseCode.OK, {request.tag_names[0]: response_items} diff --git a/sandbox/plc4py/plc4py/spi/generation/ReadBuffer.py b/sandbox/plc4py/plc4py/spi/generation/ReadBuffer.py index c981d5e7efd..64beca2b8ef 100644 --- a/sandbox/plc4py/plc4py/spi/generation/ReadBuffer.py +++ b/sandbox/plc4py/plc4py/spi/generation/ReadBuffer.py @@ -150,7 +150,6 @@ def read_array_field( class ReadBufferByteBased(ReadBuffer): - def __init__(self, bb: bytearray, byte_order: ByteOrder): if byte_order == ByteOrder.LITTLE_ENDIAN: bb = bitarray(buffer=bb) @@ -347,7 +346,11 @@ def read_enum( self, bit_length: int = -1, logical_name: str = "", read_function=None, **kwargs ) -> Any: if isinstance(read_function, aenum._enum.EnumType): - enum_return_value = read_function(ba2int(self.bb[self.position : self.position + bit_length], signed=False)) + enum_return_value = read_function( + ba2int( + self.bb[self.position : self.position + bit_length], signed=False + ) + ) return enum_return_value else: raise RuntimeError("read_enum called but read_function wasn't an enum") diff --git a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java index 4f76687ea78..4dd7dbfb112 100644 --- a/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java +++ b/sandbox/test-java-df1-driver/src/main/java/org/apache/plc4x/java/df1/DF1PlcDriver.java @@ -18,11 +18,11 @@ */ package org.apache.plc4x.java.df1; +import org.apache.plc4x.java.api.configuration.PlcConnectionConfiguration; import org.apache.plc4x.java.df1.configuration.Df1Configuration; import org.apache.plc4x.java.df1.field.Df1TagHandler; import org.apache.plc4x.java.df1.protocol.Df1ProtocolLogic; import org.apache.plc4x.java.df1.readwrite.DF1Command; -import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.connection.GeneratedDriverBase; import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; @@ -41,7 +41,7 @@ public String getProtocolName() { } @Override - protected Class getConfigurationType() { + public Class getConfigurationType() { return Df1Configuration.class; } diff --git a/src/site/site.xml b/src/site/site.xml index 570e6f61b08..5aa06f872e3 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -151,7 +151,8 @@ - + + diff --git a/tools/docker-compose.yaml b/tools/docker-compose.yaml new file mode 100644 index 00000000000..a6d974c7308 --- /dev/null +++ b/tools/docker-compose.yaml @@ -0,0 +1,32 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +version: "3.8" +services: + releaser: + build: + context: .. + dockerfile: Dockerfile + # Builds all modules and uses an alternate maven local repo and deploys artifacts to a local directory. + command: ["/ws/mvnw", "-e", "-Dskip-pgp-signing=true", "-P", "with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,apache-release", "-Dmaven.repo.local=/ws/out/.repository", "-DaltDeploymentRepository=snapshot-repo::default::file:/ws/out/.local-snapshots-dir", "clean", "deploy"] + volumes: + # Bind the local directory as "/ws" + - type: bind + source: .. + target: /ws diff --git a/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh new file mode 100755 index 00000000000..2ef80cbb73e --- /dev/null +++ b/tools/release-0-update-generated-code.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- +DIRECTORY=.. + +# 0. Check if there are uncommitted changes as these would automatically be committed (local) +if [[ $(git status --porcelain) ]]; then + # Changes + echo "There are untracked files or changed files, aborting." + exit 1 +fi + +# 1. Delete the pre-exising "out" directory that contains the maven local repo and deployments (local) +echo "Deleting the maven local repo and previous deployments" +rm -r $DIRECTORY/out + +# 2. Delete all generated sources (local) +echo "Deleting generated-sources:" +for f in $(find $DIRECTORY -path "*/src/main/generated") +do + echo " - Deleting: " $f + rm -r $f +done +# Delete the PLC4C code (local) +echo " - Deleting: $DIRECTORY/plc4c/generated-sources" +rm -r "$DIRECTORY/plc4c/generated-sources" +# TODO: delete the generated code for go, c# and python. + +# TODO: Possibly check, if the year in the NOTICE is outdated + +# 3. Run the maven build for all modules with "update-generated-code" enabled (Docker container) +docker compose run --rm releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package +if [ $? -ne 0 ]; then + echo "Got non-0 exit code from docker compose, aborting." + exit 1 +fi + +# Check if there is unchanged files (or committing and pushing nothing will fail) (local) +if [[ $(git status --porcelain) ]]; then + echo "Committing changes." + git add --all + git commit -m "chore: updated generated code" + git push +else + echo "No changes." +fi + +echo "Pre-release updates complete. Please continue with 'release-1-create-branch.sh' next." \ No newline at end of file diff --git a/tools/release-1-create-branch.sh b/tools/release-1-create-branch.sh new file mode 100755 index 00000000000..259a67728f9 --- /dev/null +++ b/tools/release-1-create-branch.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# 0. Check if there are uncommitted changes as these would automatically be committed (local) +if [[ $(git status --porcelain) ]]; then + # Changes + echo "There are untracked files or changed files, aborting." + exit 1 +fi + +# 1. Get and calculate the current version (local) +PROJECT_VERSION=$(../mvnw -f ../pom.xml -q -Dexec.executable=echo -Dexec.args="${project.version}" --non-recursive exec:exec) +RELEASE_VERSION=${PROJECT_VERSION%"-SNAPSHOT"} +RELEASE_SHORT_VERSION=${RELEASE_VERSION%".0"} +BRANCH_NAME="rel/$RELEASE_SHORT_VERSION" +IFS='.' read -ra VERSION_SEGMENTS <<< "$RELEASE_VERSION" +NEW_VERSION="${VERSION_SEGMENTS[0]}.$((VERSION_SEGMENTS[1] + 1)).0-SNAPSHOT" +echo "Current Version: '$PROJECT_VERSION'" +echo "Release Version: '$RELEASE_VERSION'" +echo "Release Branch Name: '$BRANCH_NAME'" +echo "New develop Version: '$NEW_VERSION'" + +# 2. Ask if the RELEASE_NOTES have been filled out at all (local) +read -p "Have the RELEASE_NOTES been updated for this version? (yes/no) " yn +case $yn in + yes ) echo continuing with the proess;; + no ) echo Please update the RELEASE_NOTES first; + exit 1;; + * ) echo invalid response; + exit 1;; +esac + +# 3. Do a simple maven branch command with pushChanges=false (inside the Docker container) +docker compose run --rm releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox -Dmaven.repo.local=/ws/out/.repository release:branch -DautoVersionSubmodules=true -DpushChanges=false -DdevelopmentVersion="$NEW_VERSION" -DbranchName="$BRANCH_NAME" +if [ $? -ne 0 ]; then + echo "Got non-0 exit code from docker compose, aborting." + exit 1 +fi + +# 4. Remove the "(Unreleased)" prefix from the current version of the RELEASE_NOTES file (local) +sed -i '' "s/(Unreleased) Apache PLC4X $PROJECT_VERSION*/Apache PLC4X $RELEASE_VERSION/" ../RELEASE_NOTES + +# 5. Add a new section for the new version to the RELEASE_NOTES file (local) +NEW_HEADER="==============================================================\n\ +(Unreleased) Apache PLC4X $NEW_VERSION\n\ +==============================================================\n\ +\n\ +New Features\n\ +------------\n\ +\n\ +Incompatible changes\n\ +--------------------\n\ +\n\ +Bug Fixes\n\ +---------\n\ +\ +" +echo NEW_VERSION +sed -i '' "1s/.*/$NEW_HEADER/" ../RELEASE_NOTES + +# 6. Commit the change (local) +git add --all +git commit -m "chore: prepared the RELEASE_NOTES for the next version." + +# 7. Push the changes (local) +git push + +# 8. Switch to the release branch (local) +git checkout "$BRANCH_NAME" + +echo "Release branch creation complete. We have switched the local branch to the release branch. Please continue with 'release-2-prepare-release.sh' as soon as the release branch is ready for being released." \ No newline at end of file diff --git a/tools/release-2-prepare-release.sh b/tools/release-2-prepare-release.sh new file mode 100755 index 00000000000..1bd91423d85 --- /dev/null +++ b/tools/release-2-prepare-release.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# 0. Check if there are uncommitted changes as these would automatically be committed (local) +if [[ $(git status --porcelain) ]]; then + # Changes + echo "There are untracked files or changed files, aborting." + exit 1 +fi + +PROJECT_VERSION=$(../mvnw -f ../pom.xml -q -Dexec.executable=echo -Dexec.args="${project.version}" --non-recursive exec:exec) +RELEASE_VERSION=${PROJECT_VERSION%"-SNAPSHOT"} +IFS='.' read -ra VERSION_SEGMENTS <<< "$RELEASE_VERSION" +NEW_VERSION="${VERSION_SEGMENTS[0]}.${VERSION_SEGMENTS[1]}.$((VERSION_SEGMENTS[2] + 1))-SNAPSHOT" + +# 1. Do a simple release-prepare command with pushChanges=false (inside the Docker container) +docker compose run --rm releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox -Dmaven.repo.local=/ws/out/.repository release:prepare -DautoVersionSubmodules=true -DpushChanges=false -DreleaseVersion="$RELEASE_VERSION" -DdevelopmentVersion="$NEW_VERSION" -Dtag="v$RELEASE_VERSION" +if [ $? -ne 0 ]; then + echo "Got non-0 exit code from docker compose, aborting." + exit 1 +fi + +# 2. Push the changes (local) +git push \ No newline at end of file diff --git a/tools/release-3-perform-release.sh b/tools/release-3-perform-release.sh new file mode 100755 index 00000000000..447365bd4c3 --- /dev/null +++ b/tools/release-3-perform-release.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# 0. Check if the release properties file exists. +#if [[ `git status --porcelain` ]]; then +# # Changes +# echo "There are untracked files or changed files, aborting." +# exit 1 +#fi + +# 1. Do a simple release-perform command skip signing of artifacts and deploy to local directory (inside the Docker container) +docker compose run --rm releaser bash /ws/mvnw -e -Dmaven.repo.local=/ws/out/.repository -DaltDeploymentRepository=snapshot-repo::default::file:/ws/out/.local-artifacts-dir release:perform + +# 2. Sign the artifacts +# TODO: it seems the gpg sign plugin only signs one artifact ... gotta find out how to sign every jar in out/.local-artifacts-dir + +# 3. Deploy the artifacts to Nexus +# TODO: Use the same technique we use on Jenkins to deploy everything in a local repo + +# 4. Prepare a directory for the release candidate +# TODO: Implement ... + +# 5. Upload the release candidate artifacts to SVN +# TODO: Implement ...