From 47ecbad7604a3fb169c3efacdb5f3355abf1b0bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Garc=C3=ADa?= Date: Sat, 28 Jan 2023 12:50:27 -0400 Subject: [PATCH 01/14] Fix issue-701 for S7 driver. --- .../java/knxnetip/readwrite/KnxDatapoint.java | 33 +++ .../knxnetip/readwrite/KnxDatapointType.java | 261 +++++++++--------- .../knxnetip/readwrite/KnxManufacturer.java | 4 +- .../readwrite/S7PayloadReadVarResponse.java | 2 +- .../s7/readwrite/S7VarPayloadDataItem.java | 39 ++- .../readwrite/protocol/S7ProtocolLogic.java | 27 +- plc4j/drivers/s7/src/test/java/S7IoTest.java | 3 +- .../java/spi/generation/StaticHelper.java | 4 + .../s7/protocol/S7Step7ServerAdapter.java | 6 +- .../src/main/resources/protocols/s7/s7.mspec | 9 +- 10 files changed, 238 insertions(+), 150 deletions(-) diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java index 9db44c39744..89e8f23e7b2 100644 --- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java +++ b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapoint.java @@ -3912,6 +3912,23 @@ public static PlcValue staticParse(ReadBuffer readBuffer, KnxDatapointType datap // Simple Field (value) Float value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readFloat("", 32); + return new PlcREAL(value); + } else if (EvaluationHelper.equals( + datapointType, KnxDatapointType.DPT_Value_ApparentPower)) { // REAL + + // Reserved Field (Compartmentalized so the "reserved" variable can't leak) + { + short reserved = /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedShort("", 8); + if (reserved != (short) 0x00) { + LOGGER.info( + "Expected constant value " + 0x00 + " but got " + reserved + " for reserved field."); + } + } + + // Simple Field (value) + Float value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readFloat("", 32); + return new PlcREAL(value); } else if (EvaluationHelper.equals( datapointType, KnxDatapointType.DPT_Volume_Flux_Meter)) { // REAL @@ -10455,6 +10472,16 @@ public static void staticSerialize( float value = (float) _value.getFloat(); /*TODO: migrate me*/ /*TODO: migrate me*/ writeBuffer.writeFloat("", 32, (value)); + } else if (EvaluationHelper.equals( + datapointType, KnxDatapointType.DPT_Value_ApparentPower)) { // REAL + // Reserved Field + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedShort( + "", 8, ((Number) (short) 0x00).shortValue()); + // Simple Field (value) + float value = (float) _value.getFloat(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeFloat("", 32, (value)); } else if (EvaluationHelper.equals( datapointType, KnxDatapointType.DPT_Volume_Flux_Meter)) { // REAL // Reserved Field @@ -14655,6 +14682,12 @@ public static int getLengthInBits(PlcValue _value, KnxDatapointType datapointTyp sizeInBits += 8; // Simple Field (value) sizeInBits += 32; + } else if (EvaluationHelper.equals( + datapointType, KnxDatapointType.DPT_Value_ApparentPower)) { // REAL + // Reserved Field + sizeInBits += 8; + // Simple Field (value) + sizeInBits += 32; } else if (EvaluationHelper.equals( datapointType, KnxDatapointType.DPT_Volume_Flux_Meter)) { // REAL // Reserved Field diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapointType.java b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapointType.java index 7ca4fbd0526..ac33240d5fd 100644 --- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapointType.java +++ b/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxDatapointType.java @@ -765,391 +765,396 @@ public enum KnxDatapointType { (long) 219L, (int) 78, (String) "weight (N)", KnxDatapointMainType.DPT_4_BYTE_FLOAT_VALUE), DPT_Value_Work( (long) 220L, (int) 79, (String) "work (J)", KnxDatapointMainType.DPT_4_BYTE_FLOAT_VALUE), - DPT_Volume_Flux_Meter( + DPT_Value_ApparentPower( (long) 221L, + (int) 80, + (String) "apparent power (VA)", + KnxDatapointMainType.DPT_4_BYTE_FLOAT_VALUE), + DPT_Volume_Flux_Meter( + (long) 222L, (int) 1200, (String) "volume flux for meters (m³/h)", KnxDatapointMainType.DPT_4_BYTE_FLOAT_VALUE), DPT_Volume_Flux_ls( - (long) 222L, + (long) 223L, (int) 1201, (String) "volume flux for meters (1/ls)", KnxDatapointMainType.DPT_4_BYTE_FLOAT_VALUE), DPT_Access_Data( - (long) 223L, (int) 0, (String) "entrance access", KnxDatapointMainType.DPT_ENTRANCE_ACCESS), + (long) 224L, (int) 0, (String) "entrance access", KnxDatapointMainType.DPT_ENTRANCE_ACCESS), DPT_String_ASCII( - (long) 224L, + (long) 225L, (int) 0, (String) "Character String (ASCII)", KnxDatapointMainType.DPT_CHARACTER_STRING), DPT_String_8859_1( - (long) 225L, + (long) 226L, (int) 1, (String) "Character String (ISO 8859-1)", KnxDatapointMainType.DPT_CHARACTER_STRING), DPT_SceneNumber( - (long) 226L, (int) 1, (String) "scene number", KnxDatapointMainType.DPT_SCENE_NUMBER), + (long) 227L, (int) 1, (String) "scene number", KnxDatapointMainType.DPT_SCENE_NUMBER), DPT_SceneControl( - (long) 227L, (int) 1, (String) "scene control", KnxDatapointMainType.DPT_SCENE_CONTROL), - DPT_DateTime((long) 228L, (int) 1, (String) "date time", KnxDatapointMainType.DPT_DATE_TIME), - DPT_SCLOMode((long) 229L, (int) 1, (String) "SCLO mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_BuildingMode((long) 230L, (int) 2, (String) "building mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_OccMode((long) 231L, (int) 3, (String) "occupied", KnxDatapointMainType.DPT_1_BYTE), - DPT_Priority((long) 232L, (int) 4, (String) "priority", KnxDatapointMainType.DPT_1_BYTE), + (long) 228L, (int) 1, (String) "scene control", KnxDatapointMainType.DPT_SCENE_CONTROL), + DPT_DateTime((long) 229L, (int) 1, (String) "date time", KnxDatapointMainType.DPT_DATE_TIME), + DPT_SCLOMode((long) 230L, (int) 1, (String) "SCLO mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_BuildingMode((long) 231L, (int) 2, (String) "building mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_OccMode((long) 232L, (int) 3, (String) "occupied", KnxDatapointMainType.DPT_1_BYTE), + DPT_Priority((long) 233L, (int) 4, (String) "priority", KnxDatapointMainType.DPT_1_BYTE), DPT_LightApplicationMode( - (long) 233L, (int) 5, (String) "light application mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 234L, (int) 5, (String) "light application mode", KnxDatapointMainType.DPT_1_BYTE), DPT_ApplicationArea( - (long) 234L, (int) 6, (String) "light application area", KnxDatapointMainType.DPT_1_BYTE), - DPT_AlarmClassType((long) 235L, (int) 7, (String) "alarm class", KnxDatapointMainType.DPT_1_BYTE), - DPT_PSUMode((long) 236L, (int) 8, (String) "PSU mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 235L, (int) 6, (String) "light application area", KnxDatapointMainType.DPT_1_BYTE), + DPT_AlarmClassType((long) 236L, (int) 7, (String) "alarm class", KnxDatapointMainType.DPT_1_BYTE), + DPT_PSUMode((long) 237L, (int) 8, (String) "PSU mode", KnxDatapointMainType.DPT_1_BYTE), DPT_ErrorClass_System( - (long) 237L, (int) 11, (String) "system error class", KnxDatapointMainType.DPT_1_BYTE), + (long) 238L, (int) 11, (String) "system error class", KnxDatapointMainType.DPT_1_BYTE), DPT_ErrorClass_HVAC( - (long) 238L, (int) 12, (String) "HVAC error class", KnxDatapointMainType.DPT_1_BYTE), - DPT_Time_Delay((long) 239L, (int) 13, (String) "time delay", KnxDatapointMainType.DPT_1_BYTE), + (long) 239L, (int) 12, (String) "HVAC error class", KnxDatapointMainType.DPT_1_BYTE), + DPT_Time_Delay((long) 240L, (int) 13, (String) "time delay", KnxDatapointMainType.DPT_1_BYTE), DPT_Beaufort_Wind_Force_Scale( - (long) 240L, (int) 14, (String) "wind force scale (0..12)", KnxDatapointMainType.DPT_1_BYTE), - DPT_SensorSelect((long) 241L, (int) 17, (String) "sensor mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 241L, (int) 14, (String) "wind force scale (0..12)", KnxDatapointMainType.DPT_1_BYTE), + DPT_SensorSelect((long) 242L, (int) 17, (String) "sensor mode", KnxDatapointMainType.DPT_1_BYTE), DPT_ActuatorConnectType( - (long) 242L, (int) 20, (String) "actuator connect type", KnxDatapointMainType.DPT_1_BYTE), - DPT_Cloud_Cover((long) 243L, (int) 21, (String) "cloud cover", KnxDatapointMainType.DPT_1_BYTE), + (long) 243L, (int) 20, (String) "actuator connect type", KnxDatapointMainType.DPT_1_BYTE), + DPT_Cloud_Cover((long) 244L, (int) 21, (String) "cloud cover", KnxDatapointMainType.DPT_1_BYTE), DPT_PowerReturnMode( - (long) 244L, (int) 22, (String) "power return mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_FuelType((long) 245L, (int) 100, (String) "fuel type", KnxDatapointMainType.DPT_1_BYTE), - DPT_BurnerType((long) 246L, (int) 101, (String) "burner type", KnxDatapointMainType.DPT_1_BYTE), - DPT_HVACMode((long) 247L, (int) 102, (String) "HVAC mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_DHWMode((long) 248L, (int) 103, (String) "DHW mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 245L, (int) 22, (String) "power return mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_FuelType((long) 246L, (int) 100, (String) "fuel type", KnxDatapointMainType.DPT_1_BYTE), + DPT_BurnerType((long) 247L, (int) 101, (String) "burner type", KnxDatapointMainType.DPT_1_BYTE), + DPT_HVACMode((long) 248L, (int) 102, (String) "HVAC mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_DHWMode((long) 249L, (int) 103, (String) "DHW mode", KnxDatapointMainType.DPT_1_BYTE), DPT_LoadPriority( - (long) 249L, (int) 104, (String) "load priority", KnxDatapointMainType.DPT_1_BYTE), + (long) 250L, (int) 104, (String) "load priority", KnxDatapointMainType.DPT_1_BYTE), DPT_HVACContrMode( - (long) 250L, (int) 105, (String) "HVAC control mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 251L, (int) 105, (String) "HVAC control mode", KnxDatapointMainType.DPT_1_BYTE), DPT_HVACEmergMode( - (long) 251L, (int) 106, (String) "HVAC emergency mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 252L, (int) 106, (String) "HVAC emergency mode", KnxDatapointMainType.DPT_1_BYTE), DPT_ChangeoverMode( - (long) 252L, (int) 107, (String) "changeover mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_ValveMode((long) 253L, (int) 108, (String) "valve mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_DamperMode((long) 254L, (int) 109, (String) "damper mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_HeaterMode((long) 255L, (int) 110, (String) "heater mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_FanMode((long) 256L, (int) 111, (String) "fan mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 253L, (int) 107, (String) "changeover mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_ValveMode((long) 254L, (int) 108, (String) "valve mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_DamperMode((long) 255L, (int) 109, (String) "damper mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_HeaterMode((long) 256L, (int) 110, (String) "heater mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_FanMode((long) 257L, (int) 111, (String) "fan mode", KnxDatapointMainType.DPT_1_BYTE), DPT_MasterSlaveMode( - (long) 257L, (int) 112, (String) "master/slave mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 258L, (int) 112, (String) "master/slave mode", KnxDatapointMainType.DPT_1_BYTE), DPT_StatusRoomSetp( - (long) 258L, (int) 113, (String) "status room setpoint", KnxDatapointMainType.DPT_1_BYTE), + (long) 259L, (int) 113, (String) "status room setpoint", KnxDatapointMainType.DPT_1_BYTE), DPT_Metering_DeviceType( - (long) 259L, (int) 114, (String) "metering device type", KnxDatapointMainType.DPT_1_BYTE), + (long) 260L, (int) 114, (String) "metering device type", KnxDatapointMainType.DPT_1_BYTE), DPT_HumDehumMode( - (long) 260L, (int) 115, (String) "hum dehum mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 261L, (int) 115, (String) "hum dehum mode", KnxDatapointMainType.DPT_1_BYTE), DPT_EnableHCStage( - (long) 261L, (int) 116, (String) "enable H/C stage", KnxDatapointMainType.DPT_1_BYTE), - DPT_ADAType((long) 262L, (int) 120, (String) "ADA type", KnxDatapointMainType.DPT_1_BYTE), - DPT_BackupMode((long) 263L, (int) 121, (String) "backup mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 262L, (int) 116, (String) "enable H/C stage", KnxDatapointMainType.DPT_1_BYTE), + DPT_ADAType((long) 263L, (int) 120, (String) "ADA type", KnxDatapointMainType.DPT_1_BYTE), + DPT_BackupMode((long) 264L, (int) 121, (String) "backup mode", KnxDatapointMainType.DPT_1_BYTE), DPT_StartSynchronization( - (long) 264L, + (long) 265L, (int) 122, (String) "start syncronization type", KnxDatapointMainType.DPT_1_BYTE), DPT_Behaviour_Lock_Unlock( - (long) 265L, (int) 600, (String) "behavior lock/unlock", KnxDatapointMainType.DPT_1_BYTE), + (long) 266L, (int) 600, (String) "behavior lock/unlock", KnxDatapointMainType.DPT_1_BYTE), DPT_Behaviour_Bus_Power_Up_Down( - (long) 266L, + (long) 267L, (int) 601, (String) "behavior bus power up/down", KnxDatapointMainType.DPT_1_BYTE), DPT_DALI_Fade_Time( - (long) 267L, (int) 602, (String) "dali fade time", KnxDatapointMainType.DPT_1_BYTE), - DPT_BlinkingMode((long) 268L, (int) 603, (String) "blink mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 268L, (int) 602, (String) "dali fade time", KnxDatapointMainType.DPT_1_BYTE), + DPT_BlinkingMode((long) 269L, (int) 603, (String) "blink mode", KnxDatapointMainType.DPT_1_BYTE), DPT_LightControlMode( - (long) 269L, (int) 604, (String) "light control mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 270L, (int) 604, (String) "light control mode", KnxDatapointMainType.DPT_1_BYTE), DPT_SwitchPBModel( - (long) 270L, (int) 605, (String) "PB switch mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_PBAction((long) 271L, (int) 606, (String) "PB action mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_DimmPBModel((long) 272L, (int) 607, (String) "PB dimm mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 271L, (int) 605, (String) "PB switch mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_PBAction((long) 272L, (int) 606, (String) "PB action mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_DimmPBModel((long) 273L, (int) 607, (String) "PB dimm mode", KnxDatapointMainType.DPT_1_BYTE), DPT_SwitchOnMode( - (long) 273L, (int) 608, (String) "switch on mode", KnxDatapointMainType.DPT_1_BYTE), - DPT_LoadTypeSet((long) 274L, (int) 609, (String) "load type", KnxDatapointMainType.DPT_1_BYTE), + (long) 274L, (int) 608, (String) "switch on mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_LoadTypeSet((long) 275L, (int) 609, (String) "load type", KnxDatapointMainType.DPT_1_BYTE), DPT_LoadTypeDetected( - (long) 275L, (int) 610, (String) "load type detection", KnxDatapointMainType.DPT_1_BYTE), + (long) 276L, (int) 610, (String) "load type detection", KnxDatapointMainType.DPT_1_BYTE), DPT_Converter_Test_Control( - (long) 276L, (int) 611, (String) "converter test control", KnxDatapointMainType.DPT_1_BYTE), + (long) 277L, (int) 611, (String) "converter test control", KnxDatapointMainType.DPT_1_BYTE), DPT_SABExcept_Behaviour( - (long) 277L, (int) 801, (String) "SAB except behavior", KnxDatapointMainType.DPT_1_BYTE), + (long) 278L, (int) 801, (String) "SAB except behavior", KnxDatapointMainType.DPT_1_BYTE), DPT_SABBehaviour_Lock_Unlock( - (long) 278L, + (long) 279L, (int) 802, (String) "SAB behavior on lock/unlock", KnxDatapointMainType.DPT_1_BYTE), - DPT_SSSBMode((long) 279L, (int) 803, (String) "SSSB mode", KnxDatapointMainType.DPT_1_BYTE), + DPT_SSSBMode((long) 280L, (int) 803, (String) "SSSB mode", KnxDatapointMainType.DPT_1_BYTE), DPT_BlindsControlMode( - (long) 280L, (int) 804, (String) "blinds control mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 281L, (int) 804, (String) "blinds control mode", KnxDatapointMainType.DPT_1_BYTE), DPT_CommMode( - (long) 281L, (int) 1000, (String) "communication mode", KnxDatapointMainType.DPT_1_BYTE), + (long) 282L, (int) 1000, (String) "communication mode", KnxDatapointMainType.DPT_1_BYTE), DPT_AddInfoTypes( - (long) 282L, + (long) 283L, (int) 1001, (String) "additional information type", KnxDatapointMainType.DPT_1_BYTE), DPT_RF_ModeSelect( - (long) 283L, (int) 1002, (String) "RF mode selection", KnxDatapointMainType.DPT_1_BYTE), + (long) 284L, (int) 1002, (String) "RF mode selection", KnxDatapointMainType.DPT_1_BYTE), DPT_RF_FilterSelect( - (long) 284L, + (long) 285L, (int) 1003, (String) "RF filter mode selection", KnxDatapointMainType.DPT_1_BYTE), DPT_StatusGen( - (long) 285L, (int) 1, (String) "general status", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 286L, (int) 1, (String) "general status", KnxDatapointMainType.DPT_8_BIT_SET), DPT_Device_Control( - (long) 286L, (int) 2, (String) "device control", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 287L, (int) 2, (String) "device control", KnxDatapointMainType.DPT_8_BIT_SET), DPT_ForceSign( - (long) 287L, (int) 100, (String) "forcing signal", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 288L, (int) 100, (String) "forcing signal", KnxDatapointMainType.DPT_8_BIT_SET), DPT_ForceSignCool( - (long) 288L, (int) 101, (String) "forcing signal cool", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 289L, (int) 101, (String) "forcing signal cool", KnxDatapointMainType.DPT_8_BIT_SET), DPT_StatusRHC( - (long) 289L, + (long) 290L, (int) 102, (String) "room heating controller status", KnxDatapointMainType.DPT_8_BIT_SET), DPT_StatusSDHWC( - (long) 290L, + (long) 291L, (int) 103, (String) "solar DHW controller status", KnxDatapointMainType.DPT_8_BIT_SET), DPT_FuelTypeSet( - (long) 291L, (int) 104, (String) "fuel type set", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 292L, (int) 104, (String) "fuel type set", KnxDatapointMainType.DPT_8_BIT_SET), DPT_StatusRCC( - (long) 292L, + (long) 293L, (int) 105, (String) "room cooling controller status", KnxDatapointMainType.DPT_8_BIT_SET), DPT_StatusAHU( - (long) 293L, + (long) 294L, (int) 106, (String) "ventilation controller status", KnxDatapointMainType.DPT_8_BIT_SET), DPT_CombinedStatus_RTSM( - (long) 294L, (int) 107, (String) "combined status RTSM", KnxDatapointMainType.DPT_8_BIT_SET), + (long) 295L, (int) 107, (String) "combined status RTSM", KnxDatapointMainType.DPT_8_BIT_SET), DPT_LightActuatorErrorInfo( - (long) 295L, + (long) 296L, (int) 601, (String) "lighting actuator error information", KnxDatapointMainType.DPT_8_BIT_SET), DPT_RF_ModeInfo( - (long) 296L, + (long) 297L, (int) 1000, (String) "RF communication mode info", KnxDatapointMainType.DPT_8_BIT_SET), DPT_RF_FilterInfo( - (long) 297L, + (long) 298L, (int) 1001, (String) "cEMI server supported RF filtering modes", KnxDatapointMainType.DPT_8_BIT_SET), DPT_Channel_Activation_8( - (long) 298L, + (long) 299L, (int) 1010, (String) "channel activation for 8 channels", KnxDatapointMainType.DPT_8_BIT_SET), DPT_StatusDHWC( - (long) 299L, + (long) 300L, (int) 100, (String) "DHW controller status", KnxDatapointMainType.DPT_16_BIT_SET), DPT_StatusRHCC( - (long) 300L, (int) 101, (String) "RHCC status", KnxDatapointMainType.DPT_16_BIT_SET), + (long) 301L, (int) 101, (String) "RHCC status", KnxDatapointMainType.DPT_16_BIT_SET), DPT_CombinedStatus_HVA( - (long) 301L, (int) 102, (String) "combined status HVA", KnxDatapointMainType.DPT_16_BIT_SET), + (long) 302L, (int) 102, (String) "combined status HVA", KnxDatapointMainType.DPT_16_BIT_SET), DPT_CombinedStatus_RTC( - (long) 302L, (int) 103, (String) "combined status RTC", KnxDatapointMainType.DPT_16_BIT_SET), - DPT_Media((long) 303L, (int) 1000, (String) "media", KnxDatapointMainType.DPT_16_BIT_SET), + (long) 303L, (int) 103, (String) "combined status RTC", KnxDatapointMainType.DPT_16_BIT_SET), + DPT_Media((long) 304L, (int) 1000, (String) "media", KnxDatapointMainType.DPT_16_BIT_SET), DPT_Channel_Activation_16( - (long) 304L, + (long) 305L, (int) 1010, (String) "channel activation for 16 channels", KnxDatapointMainType.DPT_16_BIT_SET), DPT_OnOffAction( - (long) 305L, (int) 1, (String) "on/off action", KnxDatapointMainType.DPT_2_BIT_SET), + (long) 306L, (int) 1, (String) "on/off action", KnxDatapointMainType.DPT_2_BIT_SET), DPT_Alarm_Reaction( - (long) 306L, (int) 2, (String) "alarm reaction", KnxDatapointMainType.DPT_2_BIT_SET), + (long) 307L, (int) 2, (String) "alarm reaction", KnxDatapointMainType.DPT_2_BIT_SET), DPT_UpDown_Action( - (long) 307L, (int) 3, (String) "up/down action", KnxDatapointMainType.DPT_2_BIT_SET), + (long) 308L, (int) 3, (String) "up/down action", KnxDatapointMainType.DPT_2_BIT_SET), DPT_HVAC_PB_Action( - (long) 308L, + (long) 309L, (int) 102, (String) "HVAC push button action", KnxDatapointMainType.DPT_2_BIT_SET), DPT_DoubleNibble( - (long) 309L, + (long) 310L, (int) 1000, (String) "busy/nak repetitions", KnxDatapointMainType.DPT_2_NIBBLE_SET), DPT_SceneInfo( - (long) 310L, (int) 1, (String) "scene information", KnxDatapointMainType.DPT_8_BIT_SET_2), + (long) 311L, (int) 1, (String) "scene information", KnxDatapointMainType.DPT_8_BIT_SET_2), DPT_CombinedInfoOnOff( - (long) 311L, + (long) 312L, (int) 1, (String) "bit-combined info on/off", KnxDatapointMainType.DPT_32_BIT_SET), DPT_ActiveEnergy_V64( - (long) 312L, + (long) 313L, (int) 10, (String) "active energy (Wh)", KnxDatapointMainType.DPT_ELECTRICAL_ENERGY), DPT_ApparantEnergy_V64( - (long) 313L, + (long) 314L, (int) 11, (String) "apparant energy (VAh)", KnxDatapointMainType.DPT_ELECTRICAL_ENERGY), DPT_ReactiveEnergy_V64( - (long) 314L, + (long) 315L, (int) 12, (String) "reactive energy (VARh)", KnxDatapointMainType.DPT_ELECTRICAL_ENERGY), DPT_Channel_Activation_24( - (long) 315L, + (long) 316L, (int) 1010, (String) "activation state 0..23", KnxDatapointMainType.DPT_24_TIMES_CHANNEL_ACTIVATION), DPT_HVACModeNext( - (long) 316L, + (long) 317L, (int) 100, (String) "time delay & HVAC mode", KnxDatapointMainType.DPT_16_BIT_UNSIGNED_VALUE_AND_8_BIT_ENUM), DPT_DHWModeNext( - (long) 317L, + (long) 318L, (int) 102, (String) "time delay & DHW mode", KnxDatapointMainType.DPT_16_BIT_UNSIGNED_VALUE_AND_8_BIT_ENUM), DPT_OccModeNext( - (long) 318L, + (long) 319L, (int) 104, (String) "time delay & occupancy mode", KnxDatapointMainType.DPT_16_BIT_UNSIGNED_VALUE_AND_8_BIT_ENUM), DPT_BuildingModeNext( - (long) 319L, + (long) 320L, (int) 105, (String) "time delay & building mode", KnxDatapointMainType.DPT_16_BIT_UNSIGNED_VALUE_AND_8_BIT_ENUM), DPT_StatusLightingActuator( - (long) 320L, + (long) 321L, (int) 600, (String) "Status Lighting Actuator", KnxDatapointMainType.DPT_8_BIT_UNSIGNED_VALUE_AND_8_BIT_ENUM), DPT_Version( - (long) 321L, + (long) 322L, (int) 1, (String) "DPT version", KnxDatapointMainType.DPT_DATAPOINT_TYPE_VERSION), - DPT_AlarmInfo((long) 322L, (int) 1, (String) "alarm info", KnxDatapointMainType.DPT_ALARM_INFO), + DPT_AlarmInfo((long) 323L, (int) 1, (String) "alarm info", KnxDatapointMainType.DPT_ALARM_INFO), DPT_TempRoomSetpSetF16_3( - (long) 323L, + (long) 324L, (int) 100, (String) "room temperature setpoint", KnxDatapointMainType.DPT_3X_2_BYTE_FLOAT_VALUE), DPT_TempRoomSetpSetShiftF16_3( - (long) 324L, + (long) 325L, (int) 101, (String) "room temperature setpoint shift", KnxDatapointMainType.DPT_3X_2_BYTE_FLOAT_VALUE), DPT_Scaling_Speed( - (long) 325L, (int) 1, (String) "scaling speed", KnxDatapointMainType.DPT_SCALING_SPEED), + (long) 326L, (int) 1, (String) "scaling speed", KnxDatapointMainType.DPT_SCALING_SPEED), DPT_Scaling_Step_Time( - (long) 326L, (int) 2, (String) "scaling step time", KnxDatapointMainType.DPT_SCALING_SPEED), + (long) 327L, (int) 2, (String) "scaling step time", KnxDatapointMainType.DPT_SCALING_SPEED), DPT_MeteringValue( - (long) 327L, + (long) 328L, (int) 1, (String) "metering value (value,encoding,cmd)", KnxDatapointMainType.DPT_4_1_1_BYTE_COMBINED_INFORMATION), DPT_MBus_Address( - (long) 328L, (int) 1000, (String) "MBus address", KnxDatapointMainType.DPT_MBUS_ADDRESS), + (long) 329L, (int) 1000, (String) "MBus address", KnxDatapointMainType.DPT_MBUS_ADDRESS), DPT_Colour_RGB( - (long) 329L, + (long) 330L, (int) 600, (String) "RGB value 3x(0..255)", KnxDatapointMainType.DPT_3_BYTE_COLOUR_RGB), DPT_LanguageCodeAlpha2_ASCII( - (long) 330L, + (long) 331L, (int) 1, (String) "language code (ASCII)", KnxDatapointMainType.DPT_LANGUAGE_CODE_ISO_639_1), DPT_Tariff_ActiveEnergy( - (long) 331L, + (long) 332L, (int) 1, (String) "electrical energy with tariff", KnxDatapointMainType.DPT_SIGNED_VALUE_WITH_CLASSIFICATION_AND_VALIDITY), DPT_Prioritised_Mode_Control( - (long) 332L, + (long) 333L, (int) 1, (String) "priority control", KnxDatapointMainType.DPT_PRIORITISED_MODE_CONTROL), DPT_DALI_Control_Gear_Diagnostic( - (long) 333L, + (long) 334L, (int) 600, (String) "diagnostic value", KnxDatapointMainType.DPT_CONFIGURATION_DIAGNOSTICS_16_BIT), DPT_DALI_Diagnostics( - (long) 334L, + (long) 335L, (int) 600, (String) "diagnostic value", KnxDatapointMainType.DPT_CONFIGURATION_DIAGNOSTICS_8_BIT), DPT_CombinedPosition( - (long) 335L, (int) 800, (String) "combined position", KnxDatapointMainType.DPT_POSITIONS), + (long) 336L, (int) 800, (String) "combined position", KnxDatapointMainType.DPT_POSITIONS), DPT_StatusSAB( - (long) 336L, + (long) 337L, (int) 800, (String) "status sunblind & shutter actuator", KnxDatapointMainType.DPT_STATUS_32_BIT), DPT_Colour_xyY( - (long) 337L, (int) 600, (String) "colour xyY", KnxDatapointMainType.DPT_STATUS_48_BIT), + (long) 338L, (int) 600, (String) "colour xyY", KnxDatapointMainType.DPT_STATUS_48_BIT), DPT_Converter_Status( - (long) 338L, + (long) 339L, (int) 600, (String) "DALI converter status", KnxDatapointMainType.DPT_CONVERTER_STATUS), DPT_Converter_Test_Result( - (long) 339L, + (long) 340L, (int) 600, (String) "DALI converter test result", KnxDatapointMainType.DPT_CONVERTER_TEST_RESULT), DPT_Battery_Info( - (long) 340L, + (long) 341L, (int) 600, (String) "Battery Information", KnxDatapointMainType.DPT_BATTERY_INFORMATION), DPT_Brightness_Colour_Temperature_Transition( - (long) 341L, + (long) 342L, (int) 600, (String) "brightness colour temperature transition", KnxDatapointMainType.DPT_BRIGHTNESS_COLOUR_TEMPERATURE_TRANSITION), DPT_Brightness_Colour_Temperature_Control( - (long) 342L, + (long) 343L, (int) 600, (String) "brightness colour temperature control", KnxDatapointMainType.DPT_STATUS_24_BIT), DPT_Colour_RGBW( - (long) 343L, + (long) 344L, (int) 600, (String) "RGBW value 4x(0..100%)", KnxDatapointMainType.DPT_COLOUR_RGBW), DPT_Relative_Control_RGBW( - (long) 344L, + (long) 345L, (int) 600, (String) "RGBW relative control", KnxDatapointMainType.DPT_RELATIVE_CONTROL_RGBW), DPT_Relative_Control_RGB( - (long) 345L, + (long) 346L, (int) 600, (String) "RGB relative control", KnxDatapointMainType.DPT_RELATIVE_CONTROL_RGB), DPT_GeographicalLocation( - (long) 346L, + (long) 347L, (int) 1, (String) "geographical location (longitude and latitude) expressed in degrees", KnxDatapointMainType.DPT_F32F32), DPT_TempRoomSetpSetF16_4( - (long) 347L, + (long) 348L, (int) 100, (String) "Temperature setpoint setting for 4 HVAC Modes", KnxDatapointMainType.DPT_F16F16F16F16), DPT_TempRoomSetpSetShiftF16_4( - (long) 348L, + (long) 349L, (int) 101, (String) "Temperature setpoint shift setting for 4 HVAC Modes", KnxDatapointMainType.DPT_F16F16F16F16); 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 161490ecc30..ac17dcceb83 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 @@ -321,7 +321,7 @@ public enum KnxManufacturer { M_GUANGZHOU_SEAWIN_ELECTRICAL_TECHNOLOGIES_CO___LTD_( (int) 278, (int) 331, (String) "Guangzhou SeaWin Electrical Technologies Co., Ltd."), M_ACREL((int) 279, (int) 332, (String) "Acrel"), - M_FRANKE_AQUAROTTER_GMBH((int) 280, (int) 333, (String) "Franke Aquarotter GmbH"), + M_KWC_AQUAROTTER_GMBH((int) 280, (int) 333, (String) "KWC Aquarotter GmbH"), M_ORION_SYSTEMS((int) 281, (int) 334, (String) "Orion Systems"), M_SCHRACK_TECHNIK_GMBH((int) 282, (int) 335, (String) "Schrack Technik GmbH"), M_INSPRID((int) 283, (int) 336, (String) "INSPRID"), @@ -439,7 +439,7 @@ public enum KnxManufacturer { M_CODESYS_GMBH((int) 387, (int) 440, (String) "CODESYS GmbH"), M_MOORGEN_DEUTSCHLAND_GMBH((int) 388, (int) 441, (String) "Moorgen Deutschland GmbH"), M_CULLMANN_TECH((int) 389, (int) 442, (String) "CULLMANN TECH"), - M_MERCK_WINDOW_TECHNOLOGIES_B_V_((int) 390, (int) 443, (String) "Merck Window Technologies B.V."), + M_EYRISE_B_V((int) 390, (int) 443, (String) "eyrise B.V"), M_ABEGO((int) 391, (int) 444, (String) "ABEGO"), M_MYGEKKO((int) 392, (int) 445, (String) "myGEKKO"), M_ERGO3_SARL((int) 393, (int) 446, (String) "Ergo3 Sarl"), diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java index 509ead95556..a8d6e1e4275 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java @@ -107,7 +107,7 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readCountArrayField( "items", new DataReaderComplexDefault<>( - () -> S7VarPayloadDataItem.staticParse(readBuffer), readBuffer), + () -> S7VarPayloadDataItem.staticParse(readBuffer, (boolean) (true)), readBuffer), CAST(parameter, S7ParameterReadVarResponse.class).getNumItems()); readBuffer.closeContext("S7PayloadReadVarResponse"); diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java index c61ffe226ff..f08cb90ecd2 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java @@ -42,12 +42,19 @@ public class S7VarPayloadDataItem implements Message { protected final DataTransportSize transportSize; protected final byte[] data; + // Arguments. + protected final Boolean hasNext; + public S7VarPayloadDataItem( - DataTransportErrorCode returnCode, DataTransportSize transportSize, byte[] data) { + DataTransportErrorCode returnCode, + DataTransportSize transportSize, + byte[] data, + Boolean hasNext) { super(); this.returnCode = returnCode; this.transportSize = transportSize; this.data = data; + this.hasNext = hasNext; } public DataTransportErrorCode getReturnCode() { @@ -102,7 +109,10 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Padding Field (padding) writePaddingField( - "padding", (int) ((COUNT(data)) % (2)), (short) 0x00, writeUnsignedShort(writeBuffer, 8)); + "padding", + (int) (((PADCOUNT(data, hasNext)) % (2))), + (short) 0x00, + writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7VarPayloadDataItem"); } @@ -132,7 +142,7 @@ public int getLengthInBits() { } // Padding Field (padding) - int _timesPadding = (int) ((COUNT(data)) % (2)); + int _timesPadding = (int) (((PADCOUNT(data, hasNext)) % (2))); while (_timesPadding-- > 0) { lengthInBits += 8; } @@ -143,10 +153,25 @@ public int getLengthInBits() { public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Object... args) throws ParseException { PositionAware positionAware = readBuffer; - return staticParse(readBuffer); + if ((args == null) || (args.length != 1)) { + throw new PlcRuntimeException( + "Wrong number of arguments, expected 1, but got " + args.length); + } + Boolean hasNext; + if (args[0] instanceof Boolean) { + hasNext = (Boolean) args[0]; + } else if (args[0] instanceof String) { + hasNext = Boolean.valueOf((String) args[0]); + } else { + throw new PlcRuntimeException( + "Argument 0 expected to be of type Boolean or a string which is parseable but was " + + args[0].getClass().getName()); + } + return staticParse(readBuffer, hasNext); } - public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws ParseException { + public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Boolean hasNext) + throws ParseException { readBuffer.pullContext("S7VarPayloadDataItem"); PositionAware positionAware = readBuffer; int startPos = positionAware.getPos(); @@ -174,12 +199,12 @@ public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws Par Math.toIntExact( ((transportSize.getSizeInBits()) ? CEIL((dataLength) / (8.0)) : dataLength))); - readPaddingField(readUnsignedShort(readBuffer, 8), (int) ((COUNT(data)) % (2))); + readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((PADCOUNT(data, hasNext)) % (2)))); readBuffer.closeContext("S7VarPayloadDataItem"); // Create the instance S7VarPayloadDataItem _s7VarPayloadDataItem; - _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data); + _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data, hasNext); return _s7VarPayloadDataItem; } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java index e3f1c6d3756..23ad40d02e6 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java @@ -279,12 +279,29 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { DefaultPlcWriteRequest request = (DefaultPlcWriteRequest) writeRequest; List parameterItems = new ArrayList<>(request.getNumberOfTags()); List payloadItems = new ArrayList<>(request.getNumberOfTags()); - for (String tagName : request.getTagNames()) { + + Iterator iter = request.getTagNames().iterator(); + + String tagName = null; + while(iter.hasNext()) { + tagName = iter.next(); final S7Tag tag = (S7Tag) request.getTag(tagName); final PlcValue plcValue = request.getPlcValue(tagName); parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag))); - payloadItems.add(serializePlcValue(tag, plcValue)); + payloadItems.add(serializePlcValue(tag, plcValue, iter.hasNext())); } + + +// for (String tagName : request.getTagNames()) { +// final S7Tag tag = (S7Tag) request.getTag(tagName); +// final PlcValue plcValue = request.getPlcValue(tagName); +// parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag))); +// payloadItems.add(serializePlcValue(tag, plcValue)); +// +// } + + + final int tpduId = tpduGenerator.getAndIncrement(); // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 if (tpduGenerator.get() == 0xFFFF) { @@ -303,7 +320,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { Integer.MAX_VALUE ) ); - + // Start a new request-transaction (Is ended in the response-handler) RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); transaction.submit(() -> context.sendRequest(tpktPacket) @@ -853,7 +870,7 @@ private PlcResponse decodeWriteResponse(S7Message responseMessage, PlcWriteReque return new DefaultPlcWriteResponse(plcWriteRequest, responses); } - private S7VarPayloadDataItem serializePlcValue(S7Tag tag, PlcValue plcValue) { + private S7VarPayloadDataItem serializePlcValue(S7Tag tag, PlcValue plcValue, Boolean hasNext) { try { DataTransportSize transportSize = tag.getDataType().getDataTransportSize(); int stringLength = (tag instanceof S7StringTag) ? ((S7StringTag) tag).getStringLength() : 254; @@ -870,7 +887,7 @@ private S7VarPayloadDataItem serializePlcValue(S7Tag tag, PlcValue plcValue) { } if (byteBuffer != null) { byte[] data = byteBuffer.array(); - return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data); + return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data, hasNext); } } catch (SerializationException e) { logger.warn("Error serializing tag item of type: '{}'", tag.getDataType().name(), e); diff --git a/plc4j/drivers/s7/src/test/java/S7IoTest.java b/plc4j/drivers/s7/src/test/java/S7IoTest.java index 676df1677e5..04818d1a7aa 100644 --- a/plc4j/drivers/s7/src/test/java/S7IoTest.java +++ b/plc4j/drivers/s7/src/test/java/S7IoTest.java @@ -340,7 +340,8 @@ void TestS7MessageBytes() throws Exception { new S7VarPayloadDataItem( DataTransportErrorCode.OK, DataTransportSize.BIT, - new byte[]{0x1} + new byte[]{0x1}, + false ) ),new S7ParameterReadVarResponse((short) 1) ), diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/StaticHelper.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/StaticHelper.java index 60e0fccd31c..93883498a93 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/StaticHelper.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/StaticHelper.java @@ -121,5 +121,9 @@ public static T CAST(Object obj, Class clazz) { public static int CEIL(double value) { return (int) Math.ceil(value); } + + public static int PADCOUNT(Object obj, boolean hasNext) { + return hasNext ? COUNT(obj) : 0; + } } diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java index 3665a0d3b75..e0fee27f1db 100644 --- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java +++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java @@ -254,7 +254,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception final byte bitAddress = addressAny.getBitAddress(); switch (addressAny.getTransportSize()) { case BOOL: - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1})); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1}, true)); break; case INT: case UINT: { @@ -264,7 +264,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception byte[] data = new byte[2]; data[1] = (byte) (shortValue & 0xff); data[0] = (byte) ((shortValue >> 8) & 0xff); - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data)); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data, true)); break; } default: { @@ -280,7 +280,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception addressAny.getNumberOfElements() : addressAny.getTransportSize().getSizeInBytes() * 8; final BitSet bitSet = toBitSet(context.getDigitalInputs(), ioNumber, numElements); final byte[] data = Arrays.copyOf(bitSet.toByteArray(), (numElements + 7) / 8); - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data)); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data, true)); break; } } diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec index 33f3ccb79c2..2985586a746 100644 --- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec +++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec @@ -223,7 +223,7 @@ [discriminatedType S7Payload (uint 8 messageType, S7Parameter parameter) [typeSwitch parameter.parameterType, messageType ['0x04','0x03' S7PayloadReadVarResponse - [array S7VarPayloadDataItem items count 'CAST(parameter, "S7ParameterReadVarResponse").numItems'] + [array S7VarPayloadDataItem ('true') items count 'CAST(parameter, "S7ParameterReadVarResponse").numItems'] ] ['0x05','0x01' S7PayloadWriteVarRequest [array S7VarPayloadDataItem items count 'COUNT(CAST(parameter, "S7ParameterWriteVarRequest").items)'] @@ -238,12 +238,15 @@ ] // This is actually not quite correct as depending pon the transportSize the length is either defined in bits or bytes. -[type S7VarPayloadDataItem +//@param hasNext In the serialization process, if you have multiple write +// requests the last element does not require padding. +[type S7VarPayloadDataItem(bit 'hasNext') [simple DataTransportErrorCode returnCode] [simple DataTransportSize transportSize] [implicit uint 16 dataLength 'COUNT(data) * ((transportSize == DataTransportSize.BIT) ? 1 : (transportSize.sizeInBits ? 8 : 1))'] [array byte data count 'transportSize.sizeInBits ? CEIL(dataLength / 8.0) : dataLength'] - [padding uint 8 pad '0x00' 'COUNT(data) % 2'] + //[padding uint 8 pad '0x00' '(COUNT(data) % 2)'] + [padding uint 8 pad '0x00' '(PADCOUNT(data, hasNext) % 2)'] ] [type S7VarPayloadStatusItem From 4d7abdc2f4318dcc9b9f8b830fcced614a20d222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Garc=C3=ADa?= Date: Sat, 28 Jan 2023 18:47:52 -0400 Subject: [PATCH 02/14] Fix symbol for hasNext parameter. --- protocols/s7/src/main/resources/protocols/s7/s7.mspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec index 2985586a746..de32c36dbe8 100644 --- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec +++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec @@ -1,4 +1,4 @@ -/* +'/* * 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 @@ -240,7 +240,7 @@ // This is actually not quite correct as depending pon the transportSize the length is either defined in bits or bytes. //@param hasNext In the serialization process, if you have multiple write // requests the last element does not require padding. -[type S7VarPayloadDataItem(bit 'hasNext') +[type S7VarPayloadDataItem(bit hasNext) [simple DataTransportErrorCode returnCode] [simple DataTransportSize transportSize] [implicit uint 16 dataLength 'COUNT(data) * ((transportSize == DataTransportSize.BIT) ? 1 : (transportSize.sizeInBits ? 8 : 1))'] From bb17f1bcbce163b596852a61df7fa00c767f5269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Garc=C3=ADa?= Date: Sun, 29 Jan 2023 15:30:01 -0400 Subject: [PATCH 03/14] Check hasNext parameter in mspec. --- protocols/s7/src/main/resources/protocols/s7/s7.mspec | 1 + 1 file changed, 1 insertion(+) diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec index de32c36dbe8..52fa3416d8b 100644 --- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec +++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec @@ -246,6 +246,7 @@ [implicit uint 16 dataLength 'COUNT(data) * ((transportSize == DataTransportSize.BIT) ? 1 : (transportSize.sizeInBits ? 8 : 1))'] [array byte data count 'transportSize.sizeInBits ? CEIL(dataLength / 8.0) : dataLength'] //[padding uint 8 pad '0x00' '(COUNT(data) % 2)'] + // [optional uint 8 Reserve 'dataLength < -1'] [padding uint 8 pad '0x00' '(PADCOUNT(data, hasNext) % 2)'] ] From fe81684dfba1ed3eff0da3bf7b41340b8fd0792e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Garc=C3=ADa?= Date: Sun, 29 Jan 2023 17:11:55 -0400 Subject: [PATCH 04/14] Test for S7VarPayloadItem. --- .../bacnetip/readwrite/BACnetVendorId.java | 3 -- .../s7/readwrite/S7VarPayloadDataItem.java | 35 +++++++++++++++---- .../src/main/resources/protocols/s7/s7.mspec | 1 + 3 files changed, 30 insertions(+), 9 deletions(-) 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 5330ed6b2d3..55d0bef9b40 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 @@ -1607,9 +1607,6 @@ public enum BACnetVendorId { KOMFORTIQ_INC((int) 1397, (int) 1397, (String) "Komfort IQ, Inc."), COOL_TERA_LIMITED((int) 1398, (int) 1398, (String) "CoolTera Limited"), HADRON_SOLUTIONS_SRLS((int) 1399, (int) 1399, (String) "Hadron Solutions S.r.l.s"), - BITPOOL((int) 1401, (int) 1401, (String) "Bitpool"), - SONICULLC((int) 1402, (int) 1402, (String) "Sonicu, LLC"), - RISHABH_INSTRUMENTS_LIMITED((int) 1403, (int) 1403, (String) "Rishabh Instruments Limited"), UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown"); private static final Map map; diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java index 83341541589..466ddce64ee 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java @@ -41,13 +41,18 @@ public class S7VarPayloadDataItem implements Message { protected final DataTransportErrorCode returnCode; protected final DataTransportSize transportSize; protected final byte[] data; + protected final Boolean hasNext; public S7VarPayloadDataItem( - DataTransportErrorCode returnCode, DataTransportSize transportSize, byte[] data) { + DataTransportErrorCode returnCode, + DataTransportSize transportSize, + byte[] data, + Boolean hasNext) { super(); this.returnCode = returnCode; this.transportSize = transportSize; this.data = data; + this.hasNext = hasNext; } public DataTransportErrorCode getReturnCode() { @@ -62,6 +67,10 @@ public byte[] getData() { return data; } + public Boolean getHasNext() { + return hasNext; + } + public void serialize(WriteBuffer writeBuffer) throws SerializationException { PositionAware positionAware = writeBuffer; int startPos = positionAware.getPos(); @@ -100,9 +109,15 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Array Field (data) writeByteArrayField("data", data, writeByteArray(writeBuffer, 8)); + // Optional Field (hasNext) (Can be skipped, if the value is null) + writeOptionalField("hasNext", hasNext, writeBoolean(writeBuffer)); + // Padding Field (padding) writePaddingField( - "padding", (int) (((COUNT(data)) % (2))), (short) 0x00, writeUnsignedShort(writeBuffer, 8)); + "padding", + (int) (((PADCOUNT(data, hasNext)) % (2))), + (short) 0x00, + writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7VarPayloadDataItem"); } @@ -131,8 +146,13 @@ public int getLengthInBits() { lengthInBits += 8 * data.length; } + // Optional Field (hasNext) + if (hasNext != null) { + lengthInBits += 1; + } + // Padding Field (padding) - int _timesPadding = (int) (((COUNT(data)) % (2))); + int _timesPadding = (int) (((PADCOUNT(data, hasNext)) % (2))); while (_timesPadding-- > 0) { lengthInBits += 8; } @@ -174,12 +194,14 @@ public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws Par Math.toIntExact( ((transportSize.getSizeInBits()) ? CEIL((dataLength) / (8.0)) : dataLength))); - readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((COUNT(data)) % (2)))); + Boolean hasNext = readOptionalField("hasNext", readBoolean(readBuffer), (dataLength) < (-(1))); + + readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((PADCOUNT(data, hasNext)) % (2)))); readBuffer.closeContext("S7VarPayloadDataItem"); // Create the instance S7VarPayloadDataItem _s7VarPayloadDataItem; - _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data); + _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data, hasNext); return _s7VarPayloadDataItem; } @@ -195,12 +217,13 @@ public boolean equals(Object o) { return (getReturnCode() == that.getReturnCode()) && (getTransportSize() == that.getTransportSize()) && (getData() == that.getData()) + && (getHasNext() == that.getHasNext()) && true; } @Override public int hashCode() { - return Objects.hash(getReturnCode(), getTransportSize(), getData()); + return Objects.hash(getReturnCode(), getTransportSize(), getData(), getHasNext()); } @Override diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec index 39da1854c2a..e0e5d380d69 100644 --- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec +++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec @@ -247,6 +247,7 @@ [array byte data count 'transportSize.sizeInBits ? CEIL(dataLength / 8.0) : dataLength'] [padding uint 8 pad '0x00' '(COUNT(data) % 2)'] //[padding uint 8 pad '0x00' '(PADCOUNT(data, hasNext) % 2)'] + ] [type S7VarPayloadStatusItem From ba378b2a7a2962c8498324f1bb6bd07ab48bbf7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 14:45:50 +0100 Subject: [PATCH 05/14] build(deps): bump equalsverifier from 3.12.3 to 3.12.4 (#774) Bumps [equalsverifier](https://github.com/jqno/equalsverifier) from 3.12.3 to 3.12.4. - [Release notes](https://github.com/jqno/equalsverifier/releases) - [Changelog](https://github.com/jqno/equalsverifier/blob/main/CHANGELOG.md) - [Commits](https://github.com/jqno/equalsverifier/compare/equalsverifier-3.12.3...equalsverifier-3.12.4) --- updated-dependencies: - dependency-name: nl.jqno.equalsverifier:equalsverifier depen "One downside to Google's approach is that all of your functions must have a new first argument, but after clearing that hurdle everything else is much better. If you aren't interested in this warning, read on."dency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 21d82d24efb..d8f5da9b5f6 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,7 @@ 1.10.0 1.9.0 2.1.4 - 3.12.3 + 3.12.4 2.3.32 4.0.8 2.10.1 From 198df19f1b9ea70e385b93797ad0d82f8456680e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 14:46:00 +0100 Subject: [PATCH 06/14] build(deps): bump jackson.version from 2.14.1 to 2.14.2 (#773) Bumps `jackson.version` from 2.14.1 to 2.14.2. Updates `jackson-annotations` from 2.14.1 to 2.14.2 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Updates `jackson-core` from 2.14.1 to 2.14.2 - [Release notes](https://github.com/FasterXML/jackson-core/releases) - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.14.1...jackson-core-2.14.2) Updates `jackson-databind` from 2.14.1 to 2.14.2 - [Release notes](https://github.com/FasterXML/jackson/releases) - [Commits](https://github.com/FasterXML/jackson/commits) Updates `jackson-dataformat-xml` from 2.14.1 to 2.14.2 - [Release notes](https://github.com/FasterXML/jackson-dataformat-xml/releases) - [Commits](https://github.com/FasterXML/jackson-dataformat-xml/compare/jackson-dataformat-xml-2.14.1...jackson-dataformat-xml-2.14.2) Updates `jackson-dataformat-yaml` from 2.14.1 to 2.14.2 - [Release notes](https://github.com/FasterXML/jackson-dataformats-text/releases) - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.14.1...jackson-dataformats-text-2.14.2) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-annotations dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-xml dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d8f5da9b5f6..48dc88e1d3f 100644 --- a/pom.xml +++ b/pom.xml @@ -135,7 +135,7 @@ 4.5.14 4.4.16 - 2.14.1 + 2.14.2 6.5.0 4.0.1 From 91fb84344b22e30044a30681575f7db1daab50a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Jan 2023 14:46:09 +0100 Subject: [PATCH 07/14] build(deps): bump mockito.version from 5.0.0 to 5.1.0 (#772) Bumps `mockito.version` from 5.0.0 to 5.1.0. Updates `mockito-core` from 5.0.0 to 5.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.0.0...v5.1.0) Updates `mockito-junit-jupiter` from 5.0.0 to 5.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.0.0...v5.1.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 48dc88e1d3f..b24680cb7d0 100644 --- a/pom.xml +++ b/pom.xml @@ -150,7 +150,7 @@ 0.6.8 - 5.0.0 + 5.1.0 4.1.87.Final 1.8.2 2.0.6 From f45f40553143ab26d0ffa4ab88846f07a3abdf1f Mon Sep 17 00:00:00 2001 From: Ben Hutcheson Date: Mon, 30 Jan 2023 22:47:49 +0100 Subject: [PATCH 08/14] Plc4j/Profinet (#534) * fix(plc4j/profinet): Fix to remove spaces from the generated connection string. * fix(plc4j(profinet): Connections are working for my setup * fix(plc4j(profinet): Add Dummy Advanced Connection Write Request * fix(plc4j(profinet): Started to add the LLDP broadcast * fix(plc4j(profinet): Continued to add the LLDP broadcast * fix(plc4j(profinet): Finished the connection setup. * feat(plc4j/profinet): Fixed a few minor issues and added the Application Ready packet * feat(plc4j/profinet): Escape spaces using %20 * feat(plc4j/): split out dcp and lldp tasks, so they can be processed separately. * fix(plc4j/profinet): Identified that the Application Ready request comes from the device. * fix(plc4j/profinet): Cleaned up the message send and receive interface * chore(plc4j/profinet): escape the device name and type within the connection string * fix(plc4j/profinet): Continued to split device logic out. * feat(plc4j/profinet): Add outline of GSDML parser. * feat(plc4j/profinet): Finished major components of parser * feat(plc4j/profinet): Add External text Data * feat(plc4j/profinet): Generated Getters * feat(plc4j/profinet): Add Dummy GSDML file * feat(plc4j/profinet): Added basic test case * feat(plc4j/profinet): Add GSD directory Configuration Parameter and cleaned up device parameter * feat(plc4j/profinet): Standardize the mac address key to uppercase * feat(plc4j/profinet): Need to Review the UDP checksum field. * feat(plc4j/profinet): Add dummy checksum field in IPv4 packets * feat(plc4j/profinet): Mistake leaving request as a response in mspec * feat(plc4j/profinet): Add reading gsd directory and starting to add support for optional submodules. * feat(plc4j/profinet): Splitting out connection request, using default config from gsd file. * feat(plc4j/profinet): Realised that the pcap promiscuous mode handles don't play nicely with other connections. * feat(plc4j/profinet): Add support for UDP packets, this allows us to use the same channel to receive all packets. * feat(plc4j/profinet): Fixed parsing of PnIo_CyclicServiceDataUnit into an array of bytes. This needs to be parsed into the format from the gsd file. * feat(plc4j/profinet): Cleaned up a little and added the IODataObject to the cyclic write packets. * feat(plc4j/profinet): Started to add the submodules to the configuration. * feat(plc4j/profinet): Add support for optional modules in the connection packet, still need to add support within the write parameters packet. * feat(plc4j/profinet): Add support for writing records during startup * feat(plc4j/profinet): Add datahold factor to configuration * fix(plc4j/profinet): Fix failing tests * feat(plc4j/profinet): Started to add the browse functionality, which is need to get a list of available tags. * feat(plc4j/profinet): Add more browse functionality. * feat(plc4j/profinet): Started to standardize the way the GSD file is queried. * feat(plc4j/profinet): Updated the parsing of the submodule connection string section * feat(plc4j/profinet): Fixed the cyclic comms after refactoring for tag browsing * feat(plc4j/profinet): add metadata to browse tags * fix(plc4j/profinet): Fix issues after merging develop * fix(plc4j/profinet): Finished removing the BaseConfiguration class, the local ip address is now taken from the channel config. * fix(plc4j/profinet): fix dependency check and remove manual test * fix(plc4j/profinet): fix disabled test for gsdfiles * fix(plc4j/profinet): Add support for checking if a submodule is found in the list of usable modules. * fix(plc4j/profinet): update tests for browsing * fix(plc4j/profinet): Continued filling out the browse structure. * fix(plc4j/profinet): Minor change to support older Java versions * fix(plc4j/profinet): Refactoring the configuration to allow for an easier initialization of devices. * fix(plc4j/profinet): Refactoring the configuration to allow for an easier initialization of devices. * fix(plc4j/profinet): Refactoring the submodules, this stops us from having to repeatedly querying the gsd file directly. * fix(plc4j/profinet): Continue refactoring * fix(readme): Flattening the tags returned by browsing. * fix(plc4j/profinet): Expanded supported data types. * fix(plc4j/profinet): Add extra tests for browsing tags * fix(plc4j/profinet): Fix issues after refactoring. * fix(plc4j/profinet): Add support for parsing returned data as well as routing cyclic data to device handler. * fix(plc4j/profinet): Add the subscription logic. * fix(plc4j/profinet): Starting to add error handling cases * fix(plc4j/profinet): Fixed issue with cycle timer as well as included auto re-connect on failed connection. Also updated the documentation. * fix(plc4j/profinet): Fixed up some files that were changed accidentally * fix(plc4j): don't exclude the template folder in .idea * fix(plc4j/profinet): update manual profinet test * fix(plc4j/profinet): Cleaned up and changed to using states for each device * fix(plc4j/profinet): Fixing exception handling. * fix(plc4j/profinet): Cleaned up a little * fix(plc4j/profinet): Add support for individual subscriptions and change of state subscriptions * fix(plc4j/profinet): Fixed issue with non bit data values and browse response * fix(plc4j/profinet): Merged Develop and updated generated classes --- .gitignore | 6 +- .idea/.gitignore | 13 + .../includes/File Header Yml.yml | 18 - plc4j/drivers/profinet/pom.xml | 17 +- .../java/profinet/readwrite/CheckPeers.java | 280 +++++ .../java/profinet/readwrite/DataItem.java | 849 ++++++++++++++++ .../profinet/readwrite/DceRpc_Packet.java | 22 +- .../java/profinet/readwrite/EndOfLldp.java | 120 +++ .../readwrite/Ethernet_FramePayload.java | 2 + .../readwrite/Ethernet_FramePayload_IPv4.java | 96 +- .../readwrite/Ethernet_FramePayload_LLDP.java | 144 +++ .../readwrite/IODWriteRequestHeader.java | 506 +++++++++ .../readwrite/IODWriteResponseHeader.java | 459 +++++++++ .../java/profinet/readwrite/LldpUnit.java | 176 ++++ .../java/profinet/readwrite/Lldp_Pdu.java | 146 +++ .../readwrite/ManagementAddressSubType.java | 55 + .../MultipleInterfaceModeNameOfDevice.java | 55 + .../profinet/readwrite/PDInterfaceAdjust.java | 304 ++++++ .../profinet/readwrite/PDPortDataCheck.java | 310 ++++++ .../java/profinet/readwrite/PascalString.java | 161 +++ .../readwrite/PcDcp_Pdu_DelayReq.java | 55 +- ...PnDcp_Block_DevicePropertiesAliasName.java | 26 +- .../PnDcp_Block_DevicePropertiesDeviceId.java | 16 +- ..._Block_DevicePropertiesDeviceInstance.java | 15 +- ...p_Block_DevicePropertiesDeviceOptions.java | 27 +- ...nDcp_Block_DevicePropertiesDeviceRole.java | 31 +- ...cp_Block_DevicePropertiesDeviceVendor.java | 26 +- ...p_Block_DevicePropertiesNameOfStation.java | 26 +- .../readwrite/PnDcp_Block_IpMacAddress.java | 15 +- .../readwrite/PnDcp_Block_IpParameter.java | 33 +- .../java/profinet/readwrite/PnDcp_Pdu.java | 2 + .../readwrite/PnDcp_Pdu_AlarmLow.java | 335 ++++++ .../readwrite/PnDcp_Pdu_IdentifyReq.java | 32 +- .../readwrite/PnDcp_Pdu_IdentifyRes.java | 39 +- .../readwrite/PnDcp_Pdu_RealTimeCyclic.java | 75 +- .../profinet/readwrite/PnDcp_ServiceType.java | 16 +- .../readwrite/PnIoCM_Block_Request.java | 372 +++++++ .../readwrite/PnIoCM_Block_Response.java | 372 +++++++ .../java/profinet/readwrite/PnIoCm_Block.java | 96 +- .../profinet/readwrite/PnIoCm_BlockType.java | 17 +- .../readwrite/PnIoCm_Block_AlarmCrReq.java | 94 +- .../readwrite/PnIoCm_Block_AlarmCrRes.java | 89 +- .../readwrite/PnIoCm_Block_ArReq.java | 117 ++- .../readwrite/PnIoCm_Block_ArRes.java | 86 +- .../readwrite/PnIoCm_Block_ArServer.java | 137 ++- .../PnIoCm_Block_ExpectedSubmoduleReq.java | 83 +- .../readwrite/PnIoCm_Block_IoCrReq.java | 102 +- .../readwrite/PnIoCm_Block_IoCrRes.java | 91 +- .../readwrite/PnIoCm_Block_ModuleDiff.java | 83 +- .../readwrite/PnIoCm_Control_Request.java | 362 +++++++ .../readwrite/PnIoCm_Control_Response.java | 362 +++++++ .../readwrite/PnIoCm_DataUnitDataObject.java | 167 +++ .../readwrite/PnIoCm_DataUnitIoCs.java | 174 ++++ .../profinet/readwrite/PnIoCm_Packet_Req.java | 66 +- .../profinet/readwrite/PnIoCm_Packet_Res.java | 62 +- .../profinet/readwrite/PnIoCm_Submodule.java | 13 +- .../readwrite/PnIoCm_SubmoduleType.java | 2 + .../readwrite/PnIoCm_Submodule_InputData.java | 236 +++++ .../PnIoCm_Submodule_OutputData.java | 236 +++++ .../readwrite/PnIo_CyclicServiceDataUnit.java | 148 +++ .../profinet/readwrite/ProfinetDataType.java | 132 +++ .../readwrite/ProfinetDeviceState.java | 60 ++ .../java/profinet/readwrite/TlvChassisId.java | 160 +++ .../readwrite/TlvManagementAddress.java | 261 +++++ .../readwrite/TlvOrgSpecificIeee8023.java | 210 ++++ .../readwrite/TlvOrgSpecificProfibus.java | 145 +++ .../readwrite/TlvOrgSpecificProfibusUnit.java | 159 +++ .../readwrite/TlvOrganizationSpecific.java | 151 +++ .../TlvOrganizationSpecificUnit.java | 150 +++ .../java/profinet/readwrite/TlvPortId.java | 159 +++ .../readwrite/TlvProfibusSubType.java | 55 + .../TlvProfibusSubTypeChassisMac.java | 145 +++ .../TlvProfibusSubTypePortStatus.java | 249 +++++ .../profinet/readwrite/TlvTimeToLive.java | 139 +++ .../java/profinet/readwrite/TlvType.java | 63 ++ .../java/profinet/readwrite/UserData.java | 147 +++ .../plc4x/java/profinet/ProfinetDriver.java | 56 +- .../ProfinetPlcQuery.java} | 17 +- .../config/ProfinetConfiguration.java | 146 +++ .../context/ProfinetDeviceContext.java | 529 ++++++++++ .../context/ProfinetDriverContext.java | 100 +- .../java/profinet/device/GsdFileMap.java | 38 + .../profinet/device/ProfinetCallable.java | 32 + .../java/profinet/device/ProfinetChannel.java | 224 ++++ .../java/profinet/device/ProfinetDevice.java | 957 ++++++++++++++++++ .../device/ProfinetDeviceMessageHandler.java | 46 + .../java/profinet/device/ProfinetDevices.java | 36 + .../profinet/device/ProfinetEmptyModule.java | 103 ++ .../device/ProfinetMessageWrapper.java | 70 ++ .../java/profinet/device/ProfinetModule.java | 57 ++ .../profinet/device/ProfinetModuleImpl.java | 353 +++++++ .../profinet/device/ProfinetRunnable.java | 43 + .../device/ProfinetSubscriptionHandle.java | 71 ++ .../discovery/ProfinetPlcDiscoverer.java | 589 ++++++----- .../gsdml/ProfinetApplicationProcess.java | 66 ++ .../gsdml/ProfinetApplicationRelations.java | 43 + .../profinet/gsdml/ProfinetBitDataItem.java | 44 + .../gsdml/ProfinetCertificationInfo.java | 50 + .../java/profinet/gsdml/ProfinetDataItem.java | 63 ++ .../gsdml/ProfinetDeviceAccessPointItem.java | 188 ++++ .../gsdml/ProfinetDeviceFunction.java | 36 + .../gsdml/ProfinetDeviceIdentity.java | 58 ++ .../profinet/gsdml/ProfinetDeviceItem.java | 36 + .../gsdml/ProfinetErrorCode2Value.java | 40 + .../gsdml/ProfinetExternalTextList.java | 37 + .../java/profinet/gsdml/ProfinetFamily.java | 43 + .../profinet/gsdml/ProfinetGraphicItem.java | 43 + .../java/profinet/gsdml/ProfinetGraphics.java | 36 + .../gsdml/ProfinetGraphicsItemRef.java | 43 + .../profinet/gsdml/ProfinetIOConfigData.java | 43 + .../gsdml/ProfinetISO15745Profile.java | 43 + .../gsdml/ProfinetISO15745Reference.java | 50 + .../gsdml/ProfinetInterfaceSubmoduleItem.java | 100 ++ .../java/profinet/gsdml/ProfinetIoData.java | 62 ++ .../profinet/gsdml/ProfinetIoDataInput.java | 46 + .../profinet/gsdml/ProfinetIoDataOutput.java | 46 + .../gsdml/ProfinetLogBookEntryItem.java | 47 + .../profinet/gsdml/ProfinetModuleInfo.java | 71 ++ .../profinet/gsdml/ProfinetModuleItem.java | 102 ++ .../profinet/gsdml/ProfinetModuleItemRef.java | 43 + .../ProfinetParameterRecordDataItem.java | 59 ++ .../gsdml/ProfinetPortSubmoduleItem.java | 81 ++ .../gsdml/ProfinetPrimaryLanguage.java | 40 + .../profinet/gsdml/ProfinetProfileBody.java | 48 + .../profinet/gsdml/ProfinetProfileHeader.java | 71 ++ .../java/profinet/gsdml/ProfinetRef.java | 78 ++ .../ProfinetSystemDefinedSubmoduleList.java | 45 + .../java/profinet/gsdml/ProfinetTextId.java | 36 + .../profinet/gsdml/ProfinetTextIdValue.java | 43 + .../gsdml/ProfinetTimingProperties.java | 43 + .../java/profinet/gsdml/ProfinetValue.java | 36 + .../gsdml/ProfinetVirtualSubmoduleItem.java | 89 ++ .../protocol/ProfinetProtocolLogic.java | 395 +++----- .../readwrite/utils/StaticHelper.java | 124 ++- .../plc4x/java/profinet/tag/ProfinetTag.java | 30 +- .../java/profinet/tag/ProfinetTagHandler.java | 3 +- .../java/profinet/ManualProfinetIoTest.java | 34 +- .../java/profinet/ProfinetBrowseTests.java | 82 ++ .../java/profinet/ProfinetCheckSumTests.java | 107 ++ .../profinet/ProfinetDeviceContextTests.java | 106 ++ .../plc4x/java/profinet/ProfinetPoc.java | 166 --- .../profinet/ProfinetSubscriptionTests.java} | 9 +- .../gsdml/ProfinetConfigurationTests.java | 147 +++ .../gsdml/ProfinetGSDMLParseTest.java | 58 ++ .../profinet/src/test/resources/gsdml.xml | 148 +++ .../src/test/resources/logback-test.xml | 2 +- .../protocols/profinet/profinet.mspec | 475 ++++++++- .../asciidoc/users/protocols/profinet.adoc | 160 +++ 148 files changed, 16986 insertions(+), 1135 deletions(-) create mode 100644 .idea/.gitignore delete mode 100644 .idea/fileTemplates/includes/File Header Yml.yml create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ManagementAddressSubType.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/MultipleInterfaceModeNameOfDevice.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDeviceState.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubType.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvType.java create mode 100644 plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java rename plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/{protocol/ProfinetDiscoveryLogic.java => browse/ProfinetPlcQuery.java} (69%) create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDeviceContext.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/GsdFileMap.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetCallable.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetChannel.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDeviceMessageHandler.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevices.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetEmptyModule.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetMessageWrapper.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModule.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetRunnable.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetSubscriptionHandle.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationProcess.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationRelations.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetBitDataItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetCertificationInfo.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDataItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceAccessPointItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceFunction.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceIdentity.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetErrorCode2Value.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetExternalTextList.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetFamily.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphics.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicsItemRef.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIOConfigData.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Profile.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Reference.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetInterfaceSubmoduleItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoData.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataInput.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataOutput.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetLogBookEntryItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleInfo.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItemRef.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetParameterRecordDataItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPortSubmoduleItem.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPrimaryLanguage.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileBody.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileHeader.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetRef.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetSystemDefinedSubmoduleList.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextId.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextIdValue.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTimingProperties.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetValue.java create mode 100644 plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetVirtualSubmoduleItem.java create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetBrowseTests.java create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetCheckSumTests.java create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetDeviceContextTests.java delete mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetPoc.java rename plc4j/drivers/profinet/src/{main/java/org/apache/plc4x/java/profinet/context/ProfinetDiscoveryContext.java => test/java/org/apache/plc4x/java/profinet/ProfinetSubscriptionTests.java} (82%) create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetConfigurationTests.java create mode 100644 plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGSDMLParseTest.java create mode 100644 plc4j/drivers/profinet/src/test/resources/gsdml.xml create mode 100644 src/site/asciidoc/users/protocols/profinet.adoc diff --git a/.gitignore b/.gitignore index e54141d807c..39a55e142e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # User-specific stuff: -.idea/** -*/.idea/** +.idea/*.xml +*/.idea/*.xml *.iml .vscode/** .java-version @@ -196,3 +196,5 @@ link.txt*/ CMakeFiles/ CMakeCache.txt DartConfiguration.tcl +/.idea/libraries/ +/.idea/inspectionProfiles/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000000..3dea668358a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Zeppelin ignored files +/ZeppelinRemoteNotebooks/ +/libraries/ +/inspectionProfiles/ + diff --git a/.idea/fileTemplates/includes/File Header Yml.yml b/.idea/fileTemplates/includes/File Header Yml.yml deleted file mode 100644 index 11705982b67..00000000000 --- a/.idea/fileTemplates/includes/File Header Yml.yml +++ /dev/null @@ -1,18 +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. -# ---------------------------------------------------------------------------- diff --git a/plc4j/drivers/profinet/pom.xml b/plc4j/drivers/profinet/pom.xml index d60f5b16544..88abfdb470a 100644 --- a/plc4j/drivers/profinet/pom.xml +++ b/plc4j/drivers/profinet/pom.xml @@ -47,6 +47,11 @@ java read-write src/main/generated + + true + + true + @@ -149,10 +154,6 @@ io.netty netty-buffer - - io.netty - netty-transport - org.apache.commons commons-lang3 @@ -218,6 +219,14 @@ test-jar test + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java new file mode 100644 index 00000000000..f58c7578656 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/CheckPeers.java @@ -0,0 +1,280 @@ +/* + * 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.profinet.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 CheckPeers extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.CHECK_PEERS; + } + + // Constant values. + public static final Short NOOFPEERS = 0x01; + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final PascalString peerPortId; + protected final PascalString peerChassisId; + + public CheckPeers( + short blockVersionHigh, + short blockVersionLow, + PascalString peerPortId, + PascalString peerChassisId) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.peerPortId = peerPortId; + this.peerChassisId = peerChassisId; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public PascalString getPeerPortId() { + return peerPortId; + } + + public PascalString getPeerChassisId() { + return peerChassisId; + } + + public short getNoOfPeers() { + return NOOFPEERS; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("CheckPeers"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (noOfPeers) + writeConstField( + "noOfPeers", + NOOFPEERS, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (peerPortId) + writeSimpleField( + "peerPortId", + peerPortId, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (peerChassisId) + writeSimpleField( + "peerChassisId", + peerChassisId, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("CheckPeers"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + CheckPeers _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Const Field (noOfPeers) + lengthInBits += 8; + + // Simple field (peerPortId) + lengthInBits += peerPortId.getLengthInBits(); + + // Simple field (peerChassisId) + lengthInBits += peerChassisId.getLengthInBits(); + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("CheckPeers"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short noOfPeers = + readConstField( + "noOfPeers", + readUnsignedShort(readBuffer, 8), + CheckPeers.NOOFPEERS, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + PascalString peerPortId = + readSimpleField( + "peerPortId", + new DataReaderComplexDefault<>(() -> PascalString.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + PascalString peerChassisId = + readSimpleField( + "peerChassisId", + new DataReaderComplexDefault<>(() -> PascalString.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("CheckPeers"); + // Create the instance + return new CheckPeersBuilderImpl(blockVersionHigh, blockVersionLow, peerPortId, peerChassisId); + } + + public static class CheckPeersBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final PascalString peerPortId; + private final PascalString peerChassisId; + + public CheckPeersBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + PascalString peerPortId, + PascalString peerChassisId) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.peerPortId = peerPortId; + this.peerChassisId = peerChassisId; + } + + public CheckPeers build() { + CheckPeers checkPeers = + new CheckPeers(blockVersionHigh, blockVersionLow, peerPortId, peerChassisId); + return checkPeers; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CheckPeers)) { + return false; + } + CheckPeers that = (CheckPeers) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getPeerPortId() == that.getPeerPortId()) + && (getPeerChassisId() == that.getPeerChassisId()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getPeerPortId(), + getPeerChassisId()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java new file mode 100644 index 00000000000..b2ca0430e30 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java @@ -0,0 +1,849 @@ +/* + * 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.profinet.readwrite; + +import static org.apache.plc4x.java.spi.generation.StaticHelper.*; + +import java.math.BigInteger; +import java.time.*; +import java.util.*; +import org.apache.plc4x.java.api.value.*; +import org.apache.plc4x.java.spi.codegen.WithOption; +import org.apache.plc4x.java.spi.generation.ByteOrder; +import org.apache.plc4x.java.spi.generation.EvaluationHelper; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.values.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +// Code generated by code-generation. DO NOT EDIT. + +public class DataItem { + + private static final Logger LOGGER = LoggerFactory.getLogger(DataItem.class); + + public static PlcValue staticParse( + ReadBuffer readBuffer, ProfinetDataType dataType, Integer numberOfValues) + throws ParseException { + if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL) + && EvaluationHelper.equals(numberOfValues, 1)) { // BOOL + + // Simple Field (value) + Boolean value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readBit(""); + + return new PlcBOOL(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcBOOL( + (Boolean) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readBit(""))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE) + && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE + + // Simple Field (value) + Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8); + + return new PlcBYTE(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)) { // List + // Array field (value) + // Count array + if ((numberOfValues) * (8) > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + ((numberOfValues) * (8)) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) (numberOfValues) * (8); + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcBOOL( + (Boolean) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readBit(""))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WORD)) { // WORD + + // Simple Field (value) + Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16); + + return new PlcWORD(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DWORD)) { // DWORD + + // Simple Field (value) + Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedLong("", 32); + + return new PlcDWORD(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LWORD)) { // LWORD + + // Simple Field (value) + BigInteger value = /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedBigInteger("", 64); + + return new PlcLWORD(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // SINT + + // Simple Field (value) + Byte value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readSignedByte("", 8); + + return new PlcSINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcSINT( + (Byte) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readSignedByte("", 8))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT) + && EvaluationHelper.equals(numberOfValues, 1)) { // INT + + // Simple Field (value) + Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readShort("", 16); + + return new PlcINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcINT( + (Short) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readShort("", 16))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // DINT + + // Simple Field (value) + Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readInt("", 32); + + return new PlcDINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcDINT( + (Integer) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readInt("", 32))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // LINT + + // Simple Field (value) + Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readLong("", 64); + + return new PlcLINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcLINT( + (Long) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readLong("", 64))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // USINT + + // Simple Field (value) + Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8); + + return new PlcUSINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcUINT( + (Short) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedShort("", 8))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UINT + + // Simple Field (value) + Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16); + + return new PlcUINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcUDINT( + (Integer) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedInt("", 16))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UDINT + + // Simple Field (value) + Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedLong("", 32); + + return new PlcUDINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcULINT( + (Long) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedLong("", 32))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // ULINT + + // Simple Field (value) + BigInteger value = /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedBigInteger("", 64); + + return new PlcULINT(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcLINT( + (BigInteger) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readUnsignedBigInteger("", 64))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // REAL + + // Simple Field (value) + Float value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readFloat("", 32); + + return new PlcREAL(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcREAL( + (Float) /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readFloat("", 32))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // LREAL + + // Simple Field (value) + Double value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readDouble("", 64); + + return new PlcLREAL(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcLREAL( + (Double) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readDouble("", 64))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR + + // Simple Field (value) + String value = /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8")); + + return new PlcCHAR(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcSTRING( + (String) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8")))); + } + } + + return new PlcList(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // WCHAR + + // Simple Field (value) + String value = /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16")); + + return new PlcWCHAR(value); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR)) { // List + // Array field (value) + // Count array + if (numberOfValues > Integer.MAX_VALUE) { + throw new ParseException( + "Array count of " + + (numberOfValues) + + " exceeds the maximum allowed count of " + + Integer.MAX_VALUE); + } + List value; + { + int itemCount = (int) numberOfValues; + value = new LinkedList<>(); + for (int curItem = 0; curItem < itemCount; curItem++) { + value.add( + new PlcSTRING( + (String) /*TODO: migrate me*/ /*TODO: migrate me*/ + readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16")))); + } + } + + return new PlcList(value); + } + return null; + } + + public static void staticSerialize( + WriteBuffer writeBuffer, PlcValue _value, ProfinetDataType dataType, Integer numberOfValues) + throws SerializationException { + staticSerialize(writeBuffer, _value, dataType, numberOfValues, ByteOrder.BIG_ENDIAN); + } + + public static void staticSerialize( + WriteBuffer writeBuffer, + PlcValue _value, + ProfinetDataType dataType, + Integer numberOfValues, + ByteOrder byteOrder) + throws SerializationException { + if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL) + && EvaluationHelper.equals(numberOfValues, 1)) { // BOOL + // Simple Field (value) + boolean value = (boolean) _value.getBoolean(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value)); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Boolean value = (Boolean) val.getBoolean(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value)); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE) + && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE + // Simple Field (value) + short value = (short) _value.getShort(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Boolean value = (Boolean) val.getBoolean(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value)); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WORD)) { // WORD + // Simple Field (value) + int value = (int) _value.getInt(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DWORD)) { // DWORD + // Simple Field (value) + long value = (long) _value.getLong(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedLong("", 32, ((Number) (value)).longValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LWORD)) { // LWORD + // Simple Field (value) + BigInteger value = (BigInteger) _value.getBigInteger(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (value)); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // SINT + // Simple Field (value) + byte value = (byte) _value.getByte(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeSignedByte("", 8, ((Number) (value)).byteValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Byte value = (Byte) val.getByte(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeSignedByte("", 8, ((Number) (value)).byteValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT) + && EvaluationHelper.equals(numberOfValues, 1)) { // INT + // Simple Field (value) + short value = (short) _value.getShort(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeShort("", 16, ((Number) (value)).shortValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Short value = (Short) val.getShort(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeShort("", 16, ((Number) (value)).shortValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // DINT + // Simple Field (value) + int value = (int) _value.getInt(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeInt("", 32, ((Number) (value)).intValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Integer value = (Integer) val.getInteger(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeInt("", 32, ((Number) (value)).intValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // LINT + // Simple Field (value) + long value = (long) _value.getLong(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeLong("", 64, ((Number) (value)).longValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Long value = (Long) val.getLong(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeLong("", 64, ((Number) (value)).longValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // USINT + // Simple Field (value) + short value = (short) _value.getShort(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Short value = (Short) val.getShort(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UINT + // Simple Field (value) + int value = (int) _value.getInt(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Integer value = (Integer) val.getInteger(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UDINT + // Simple Field (value) + long value = (long) _value.getLong(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedLong("", 32, ((Number) (value)).longValue()); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Long value = (Long) val.getLong(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedLong("", 32, ((Number) (value)).longValue()); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // ULINT + // Simple Field (value) + BigInteger value = (BigInteger) _value.getBigInteger(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (value)); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + BigInteger value = (BigInteger) val.getBigInteger(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (value)); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // REAL + // Simple Field (value) + float value = (float) _value.getFloat(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeFloat("", 32, (value)); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Float value = (Float) val.getFloat(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeFloat("", 32, (value)); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // LREAL + // Simple Field (value) + double value = (double) _value.getDouble(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeDouble("", 64, (value)); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + Double value = (Double) val.getDouble(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeDouble("", 64, (value)); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR + // Simple Field (value) + String value = (String) _value.getString(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeString( + "", 8, (String) (value), WithOption.WithEncoding("UTF-8")); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + String value = (String) val.getString(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeString( + "", 8, (String) (value), WithOption.WithEncoding("UTF-8")); + } + + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // WCHAR + // Simple Field (value) + String value = (String) _value.getString(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeString( + "", 16, (String) (value), WithOption.WithEncoding("UTF-16")); + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR)) { // List + PlcList values = (PlcList) _value; + + for (PlcValue val : ((List) values.getList())) { + String value = (String) val.getString(); + /*TODO: migrate me*/ + /*TODO: migrate me*/ writeBuffer.writeString( + "", 16, (String) (value), WithOption.WithEncoding("UTF-16")); + } + } + } + + public static int getLengthInBytes( + PlcValue _value, ProfinetDataType dataType, Integer numberOfValues) { + return (int) Math.ceil((float) getLengthInBits(_value, dataType, numberOfValues) / 8.0); + } + + public static int getLengthInBits( + PlcValue _value, ProfinetDataType dataType, Integer numberOfValues) { + int sizeInBits = 0; + if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL) + && EvaluationHelper.equals(numberOfValues, 1)) { // BOOL + // Simple Field (value) + sizeInBits += 1; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 1; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE) + && EvaluationHelper.equals(numberOfValues, 1)) { // BYTE + // Simple Field (value) + sizeInBits += 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 1; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WORD)) { // WORD + // Simple Field (value) + sizeInBits += 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DWORD)) { // DWORD + // Simple Field (value) + sizeInBits += 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LWORD)) { // LWORD + // Simple Field (value) + sizeInBits += 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // SINT + // Simple Field (value) + sizeInBits += 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.SINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT) + && EvaluationHelper.equals(numberOfValues, 1)) { // INT + // Simple Field (value) + sizeInBits += 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.INT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // DINT + // Simple Field (value) + sizeInBits += 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.DINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // LINT + // Simple Field (value) + sizeInBits += 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // USINT + // Simple Field (value) + sizeInBits += 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.USINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UINT + // Simple Field (value) + sizeInBits += 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // UDINT + // Simple Field (value) + sizeInBits += 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.UDINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT) + && EvaluationHelper.equals(numberOfValues, 1)) { // ULINT + // Simple Field (value) + sizeInBits += 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.ULINT)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // REAL + // Simple Field (value) + sizeInBits += 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.REAL)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 32; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL) + && EvaluationHelper.equals(numberOfValues, 1)) { // LREAL + // Simple Field (value) + sizeInBits += 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.LREAL)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 64; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR + // Simple Field (value) + sizeInBits += 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.CHAR)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 8; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR) + && EvaluationHelper.equals(numberOfValues, 1)) { // WCHAR + // Simple Field (value) + sizeInBits += 16; + } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR)) { // List + PlcList values = (PlcList) _value; + sizeInBits += values.getList().size() * 16; + } + return sizeInBits; + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_Packet.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_Packet.java index 2b37cbd80c8..a7d8a43593f 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_Packet.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_Packet.java @@ -67,6 +67,13 @@ public class DceRpc_Packet implements Message { protected final DceRpc_Operation operation; protected final PnIoCm_Packet payload; + // Reserved Fields + private Boolean reservedField0; + private Boolean reservedField1; + private Short reservedField2; + private Boolean reservedField3; + private Short reservedField4; + public DceRpc_Packet( DceRpc_PacketType packetType, boolean idempotent, @@ -229,7 +236,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Reserved Field (reserved) writeReservedField( "reserved", - (boolean) false, + reservedField0 != null ? reservedField0 : (boolean) false, writeBoolean(writeBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -275,14 +282,14 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Reserved Field (reserved) writeReservedField( "reserved", - (boolean) false, + reservedField1 != null ? reservedField1 : (boolean) false, writeBoolean(writeBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); // Reserved Field (reserved) writeReservedField( "reserved", - (short) 0x00, + reservedField2 != null ? reservedField2 : (short) 0x00, writeUnsignedShort(writeBuffer, 6), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -296,7 +303,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Reserved Field (reserved) writeReservedField( "reserved", - (boolean) false, + reservedField3 != null ? reservedField3 : (boolean) false, writeBoolean(writeBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -334,7 +341,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Reserved Field (reserved) writeReservedField( "reserved", - (short) 0x00, + reservedField4 != null ? reservedField4 : (short) 0x00, writeUnsignedShort(writeBuffer, 8), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -890,6 +897,11 @@ public static DceRpc_Packet staticParse(ReadBuffer readBuffer) throws ParseExcep sequenceNumber, operation, payload); + _dceRpc_Packet.reservedField0 = reservedField0; + _dceRpc_Packet.reservedField1 = reservedField1; + _dceRpc_Packet.reservedField2 = reservedField2; + _dceRpc_Packet.reservedField3 = reservedField3; + _dceRpc_Packet.reservedField4 = reservedField4; return _dceRpc_Packet; } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java new file mode 100644 index 00000000000..29477055270 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/EndOfLldp.java @@ -0,0 +1,120 @@ +/* + * 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.profinet.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 EndOfLldp extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.END_OF_LLDP; + } + + public EndOfLldp(int tlvIdLength) { + super(tlvIdLength); + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("EndOfLldp"); + + writeBuffer.popContext("EndOfLldp"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + EndOfLldp _value = this; + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("EndOfLldp"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + readBuffer.closeContext("EndOfLldp"); + // Create the instance + return new EndOfLldpBuilderImpl(); + } + + public static class EndOfLldpBuilderImpl implements LldpUnit.LldpUnitBuilder { + + public EndOfLldpBuilderImpl() {} + + public EndOfLldp build(int tlvIdLength) { + EndOfLldp endOfLldp = new EndOfLldp(tlvIdLength); + return endOfLldp; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof EndOfLldp)) { + return false; + } + EndOfLldp that = (EndOfLldp) o; + return super.equals(that) && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java index 7200763f484..5f18c0a45c6 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java @@ -102,6 +102,8 @@ public static Ethernet_FramePayload staticParse(ReadBuffer readBuffer) throws Pa Ethernet_FramePayload_VirtualLan.staticParseEthernet_FramePayloadBuilder(readBuffer); } else if (EvaluationHelper.equals(packetType, (int) 0x8892)) { builder = Ethernet_FramePayload_PnDcp.staticParseEthernet_FramePayloadBuilder(readBuffer); + } else if (EvaluationHelper.equals(packetType, (int) 0x88cc)) { + builder = Ethernet_FramePayload_LLDP.staticParseEthernet_FramePayloadBuilder(readBuffer); } if (builder == null) { throw new ParseException( diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_IPv4.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_IPv4.java index 3d5412ccacd..a7dddbeb6c7 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_IPv4.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_IPv4.java @@ -47,12 +47,13 @@ public Integer getPacketType() { public static final Byte HEADERLENGTH = 0x5; public static final Short DIFFERENTIATEDSERVICESCODEPOINT = 0x00; public static final Byte EXPLICITCONGESTIONNOTIFICATION = 0x0; - public static final Byte FLAGS = 0x00; public static final Integer FRAGMENTOFFSET = 0x00; public static final Short PROTOCOL = 0x11; // Properties. protected final int identification; + protected final boolean dontFragment; + protected final boolean moreFragments; protected final short timeToLive; protected final IpAddress sourceAddress; protected final IpAddress destinationAddress; @@ -60,8 +61,13 @@ public Integer getPacketType() { protected final int destinationPort; protected final DceRpc_Packet payload; + // Reserved Fields + private Boolean reservedField0; + public Ethernet_FramePayload_IPv4( int identification, + boolean dontFragment, + boolean moreFragments, short timeToLive, IpAddress sourceAddress, IpAddress destinationAddress, @@ -70,6 +76,8 @@ public Ethernet_FramePayload_IPv4( DceRpc_Packet payload) { super(); this.identification = identification; + this.dontFragment = dontFragment; + this.moreFragments = moreFragments; this.timeToLive = timeToLive; this.sourceAddress = sourceAddress; this.destinationAddress = destinationAddress; @@ -82,6 +90,14 @@ public int getIdentification() { return identification; } + public boolean getDontFragment() { + return dontFragment; + } + + public boolean getMoreFragments() { + return moreFragments; + } + public short getTimeToLive() { return timeToLive; } @@ -122,10 +138,6 @@ public byte getExplicitCongestionNotification() { return EXPLICITCONGESTIONNOTIFICATION; } - public byte getFlags() { - return FLAGS; - } - public int getFragmentOffset() { return FRAGMENTOFFSET; } @@ -167,8 +179,17 @@ protected void serializeEthernet_FramePayloadChild(WriteBuffer writeBuffer) // Simple Field (identification) writeSimpleField("identification", identification, writeUnsignedInt(writeBuffer, 16)); - // Const Field (flags) - writeConstField("flags", FLAGS, writeUnsignedByte(writeBuffer, 3)); + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (boolean) false, + writeBoolean(writeBuffer)); + + // Simple Field (dontFragment) + writeSimpleField("dontFragment", dontFragment, writeBoolean(writeBuffer)); + + // Simple Field (moreFragments) + writeSimpleField("moreFragments", moreFragments, writeBoolean(writeBuffer)); // Const Field (fragmentOffset) writeConstField("fragmentOffset", FRAGMENTOFFSET, writeUnsignedInt(writeBuffer, 13)); @@ -206,9 +227,22 @@ protected void serializeEthernet_FramePayloadChild(WriteBuffer writeBuffer) // Implicit Field (packetLength) (Used for parsing, but its value is not stored as it's // implicitly given by the objects content) - int packetLength = (int) (getLengthInBytes()); + int packetLength = (int) ((8) + (getPayload().getLengthInBytes())); writeImplicitField("packetLength", packetLength, writeUnsignedInt(writeBuffer, 16)); + // Implicit Field (bodyChecksum) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int bodyChecksum = + (int) + (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.calculateUdpChecksum( + getSourceAddress(), + getDestinationAddress(), + getSourcePort(), + getDestinationPort(), + (8) + (getPayload().getLengthInBytes()), + getPayload())); + writeImplicitField("bodyChecksum", bodyChecksum, writeUnsignedInt(writeBuffer, 16)); + // Simple Field (payload) writeSimpleField("payload", payload, new DataWriterComplexDefault<>(writeBuffer)); @@ -243,8 +277,14 @@ public int getLengthInBits() { // Simple field (identification) lengthInBits += 16; - // Const Field (flags) - lengthInBits += 3; + // Reserved Field (reserved) + lengthInBits += 1; + + // Simple field (dontFragment) + lengthInBits += 1; + + // Simple field (moreFragments) + lengthInBits += 1; // Const Field (fragmentOffset) lengthInBits += 13; @@ -273,6 +313,9 @@ public int getLengthInBits() { // Implicit Field (packetLength) lengthInBits += 16; + // Implicit Field (bodyChecksum) + lengthInBits += 16; + // Simple field (payload) lengthInBits += payload.getLengthInBits(); @@ -312,8 +355,12 @@ public static Ethernet_FramePayloadBuilder staticParseEthernet_FramePayloadBuild int identification = readSimpleField("identification", readUnsignedInt(readBuffer, 16)); - byte flags = - readConstField("flags", readUnsignedByte(readBuffer, 3), Ethernet_FramePayload_IPv4.FLAGS); + Boolean reservedField0 = + readReservedField("reserved", readBoolean(readBuffer), (boolean) false); + + boolean dontFragment = readSimpleField("dontFragment", readBoolean(readBuffer)); + + boolean moreFragments = readSimpleField("moreFragments", readBoolean(readBuffer)); int fragmentOffset = readConstField( @@ -345,6 +392,8 @@ public static Ethernet_FramePayloadBuilder staticParseEthernet_FramePayloadBuild int packetLength = readImplicitField("packetLength", readUnsignedInt(readBuffer, 16)); + int bodyChecksum = readImplicitField("bodyChecksum", readUnsignedInt(readBuffer, 16)); + DceRpc_Packet payload = readSimpleField( "payload", @@ -355,51 +404,66 @@ public static Ethernet_FramePayloadBuilder staticParseEthernet_FramePayloadBuild // Create the instance return new Ethernet_FramePayload_IPv4BuilderImpl( identification, + dontFragment, + moreFragments, timeToLive, sourceAddress, destinationAddress, sourcePort, destinationPort, - payload); + payload, + reservedField0); } public static class Ethernet_FramePayload_IPv4BuilderImpl implements Ethernet_FramePayload.Ethernet_FramePayloadBuilder { private final int identification; + private final boolean dontFragment; + private final boolean moreFragments; private final short timeToLive; private final IpAddress sourceAddress; private final IpAddress destinationAddress; private final int sourcePort; private final int destinationPort; private final DceRpc_Packet payload; + private final Boolean reservedField0; public Ethernet_FramePayload_IPv4BuilderImpl( int identification, + boolean dontFragment, + boolean moreFragments, short timeToLive, IpAddress sourceAddress, IpAddress destinationAddress, int sourcePort, int destinationPort, - DceRpc_Packet payload) { + DceRpc_Packet payload, + Boolean reservedField0) { this.identification = identification; + this.dontFragment = dontFragment; + this.moreFragments = moreFragments; this.timeToLive = timeToLive; this.sourceAddress = sourceAddress; this.destinationAddress = destinationAddress; this.sourcePort = sourcePort; this.destinationPort = destinationPort; this.payload = payload; + this.reservedField0 = reservedField0; } public Ethernet_FramePayload_IPv4 build() { Ethernet_FramePayload_IPv4 ethernet_FramePayload_IPv4 = new Ethernet_FramePayload_IPv4( identification, + dontFragment, + moreFragments, timeToLive, sourceAddress, destinationAddress, sourcePort, destinationPort, payload); + ethernet_FramePayload_IPv4.reservedField0 = reservedField0; return ethernet_FramePayload_IPv4; } } @@ -414,6 +478,8 @@ public boolean equals(Object o) { } Ethernet_FramePayload_IPv4 that = (Ethernet_FramePayload_IPv4) o; return (getIdentification() == that.getIdentification()) + && (getDontFragment() == that.getDontFragment()) + && (getMoreFragments() == that.getMoreFragments()) && (getTimeToLive() == that.getTimeToLive()) && (getSourceAddress() == that.getSourceAddress()) && (getDestinationAddress() == that.getDestinationAddress()) @@ -429,6 +495,8 @@ public int hashCode() { return Objects.hash( super.hashCode(), getIdentification(), + getDontFragment(), + getMoreFragments(), getTimeToLive(), getSourceAddress(), getDestinationAddress(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java new file mode 100644 index 00000000000..d51cdda0359 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload_LLDP.java @@ -0,0 +1,144 @@ +/* + * 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.profinet.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 Ethernet_FramePayload_LLDP extends Ethernet_FramePayload implements Message { + + // Accessors for discriminator values. + public Integer getPacketType() { + return (int) 0x88cc; + } + + // Properties. + protected final Lldp_Pdu pdu; + + public Ethernet_FramePayload_LLDP(Lldp_Pdu pdu) { + super(); + this.pdu = pdu; + } + + public Lldp_Pdu getPdu() { + return pdu; + } + + @Override + protected void serializeEthernet_FramePayloadChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("Ethernet_FramePayload_LLDP"); + + // Simple Field (pdu) + writeSimpleField("pdu", pdu, new DataWriterComplexDefault<>(writeBuffer)); + + writeBuffer.popContext("Ethernet_FramePayload_LLDP"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + Ethernet_FramePayload_LLDP _value = this; + + // Simple field (pdu) + lengthInBits += pdu.getLengthInBits(); + + return lengthInBits; + } + + public static Ethernet_FramePayloadBuilder staticParseEthernet_FramePayloadBuilder( + ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("Ethernet_FramePayload_LLDP"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + Lldp_Pdu pdu = + readSimpleField( + "pdu", + new DataReaderComplexDefault<>(() -> Lldp_Pdu.staticParse(readBuffer), readBuffer)); + + readBuffer.closeContext("Ethernet_FramePayload_LLDP"); + // Create the instance + return new Ethernet_FramePayload_LLDPBuilderImpl(pdu); + } + + public static class Ethernet_FramePayload_LLDPBuilderImpl + implements Ethernet_FramePayload.Ethernet_FramePayloadBuilder { + private final Lldp_Pdu pdu; + + public Ethernet_FramePayload_LLDPBuilderImpl(Lldp_Pdu pdu) { + this.pdu = pdu; + } + + public Ethernet_FramePayload_LLDP build() { + Ethernet_FramePayload_LLDP ethernet_FramePayload_LLDP = new Ethernet_FramePayload_LLDP(pdu); + return ethernet_FramePayload_LLDP; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Ethernet_FramePayload_LLDP)) { + return false; + } + Ethernet_FramePayload_LLDP that = (Ethernet_FramePayload_LLDP) o; + return (getPdu() == that.getPdu()) && super.equals(that) && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getPdu()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java new file mode 100644 index 00000000000..f75b9ad230e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteRequestHeader.java @@ -0,0 +1,506 @@ +/* + * 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.profinet.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 IODWriteRequestHeader extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOD_WRITE_REQUEST_HEADER; + } + + // Constant values. + public static final Integer PADFIELD = 0x0000; + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final int sequenceNumber; + protected final Uuid arUuid; + protected final long api; + protected final int slotNumber; + protected final int subSlotNumber; + protected final int index; + protected final long recordDataLength; + protected final UserData userData; + + public IODWriteRequestHeader( + short blockVersionHigh, + short blockVersionLow, + int sequenceNumber, + Uuid arUuid, + long api, + int slotNumber, + int subSlotNumber, + int index, + long recordDataLength, + UserData userData) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.sequenceNumber = sequenceNumber; + this.arUuid = arUuid; + this.api = api; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.index = index; + this.recordDataLength = recordDataLength; + this.userData = userData; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public int getSequenceNumber() { + return sequenceNumber; + } + + public Uuid getArUuid() { + return arUuid; + } + + public long getApi() { + return api; + } + + public int getSlotNumber() { + return slotNumber; + } + + public int getSubSlotNumber() { + return subSlotNumber; + } + + public int getIndex() { + return index; + } + + public long getRecordDataLength() { + return recordDataLength; + } + + public UserData getUserData() { + return userData; + } + + public int getPadField() { + return PADFIELD; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("IODWriteRequestHeader"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = + (int) + ((((getIndex()) < (0x8000)) + ? ((getLengthInBytes()) - (4)) - (getRecordDataLength()) + : (getLengthInBytes()) - (4))); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sequenceNumber) + writeSimpleField( + "sequenceNumber", + sequenceNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (api) + writeSimpleField( + "api", + api, + writeUnsignedLong(writeBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (slotNumber) + writeSimpleField( + "slotNumber", + slotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (subSlotNumber) + writeSimpleField( + "subSlotNumber", + subSlotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (padField) + writeConstField( + "padField", + PADFIELD, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (index) + writeSimpleField( + "index", + index, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (recordDataLength) + writeSimpleField( + "recordDataLength", + recordDataLength, + writeUnsignedLong(writeBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Padding Field (padding) + writePaddingField( + "padding", + (int) + ((((index) < (0x8000)) + ? (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4) + : (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4))), + (short) 0x00, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Optional Field (userData) (Can be skipped, if the value is null) + writeOptionalField( + "userData", + userData, + new DataWriterComplexDefault<>(writeBuffer), + (getIndex()) < (0x8000), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("IODWriteRequestHeader"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + IODWriteRequestHeader _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Simple field (sequenceNumber) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (api) + lengthInBits += 32; + + // Simple field (slotNumber) + lengthInBits += 16; + + // Simple field (subSlotNumber) + lengthInBits += 16; + + // Const Field (padField) + lengthInBits += 16; + + // Simple field (index) + lengthInBits += 16; + + // Simple field (recordDataLength) + lengthInBits += 32; + + // Padding Field (padding) + int _timesPadding = + (int) + ((((index) < (0x8000)) + ? (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4) + : (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4))); + while (_timesPadding-- > 0) { + lengthInBits += 8; + } + + // Optional Field (userData) + if (userData != null) { + lengthInBits += userData.getLengthInBits(); + } + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("IODWriteRequestHeader"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sequenceNumber = + readSimpleField( + "sequenceNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + long api = + readSimpleField( + "api", + readUnsignedLong(readBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int slotNumber = + readSimpleField( + "slotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int subSlotNumber = + readSimpleField( + "subSlotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int padField = + readConstField( + "padField", + readUnsignedInt(readBuffer, 16), + IODWriteRequestHeader.PADFIELD, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int index = + readSimpleField( + "index", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + long recordDataLength = + readSimpleField( + "recordDataLength", + readUnsignedLong(readBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readPaddingField( + readUnsignedShort(readBuffer, 8), + (int) + ((((index) < (0x8000)) + ? (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4) + : (((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4))), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + UserData userData = + readOptionalField( + "userData", + new DataReaderComplexDefault<>( + () -> UserData.staticParse(readBuffer, (long) (recordDataLength)), readBuffer), + (index) < (0x8000), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("IODWriteRequestHeader"); + // Create the instance + return new IODWriteRequestHeaderBuilderImpl( + blockVersionHigh, + blockVersionLow, + sequenceNumber, + arUuid, + api, + slotNumber, + subSlotNumber, + index, + recordDataLength, + userData); + } + + public static class IODWriteRequestHeaderBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final int sequenceNumber; + private final Uuid arUuid; + private final long api; + private final int slotNumber; + private final int subSlotNumber; + private final int index; + private final long recordDataLength; + private final UserData userData; + + public IODWriteRequestHeaderBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + int sequenceNumber, + Uuid arUuid, + long api, + int slotNumber, + int subSlotNumber, + int index, + long recordDataLength, + UserData userData) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.sequenceNumber = sequenceNumber; + this.arUuid = arUuid; + this.api = api; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.index = index; + this.recordDataLength = recordDataLength; + this.userData = userData; + } + + public IODWriteRequestHeader build() { + IODWriteRequestHeader iODWriteRequestHeader = + new IODWriteRequestHeader( + blockVersionHigh, + blockVersionLow, + sequenceNumber, + arUuid, + api, + slotNumber, + subSlotNumber, + index, + recordDataLength, + userData); + return iODWriteRequestHeader; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof IODWriteRequestHeader)) { + return false; + } + IODWriteRequestHeader that = (IODWriteRequestHeader) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getSequenceNumber() == that.getSequenceNumber()) + && (getArUuid() == that.getArUuid()) + && (getApi() == that.getApi()) + && (getSlotNumber() == that.getSlotNumber()) + && (getSubSlotNumber() == that.getSubSlotNumber()) + && (getIndex() == that.getIndex()) + && (getRecordDataLength() == that.getRecordDataLength()) + && (getUserData() == that.getUserData()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getSequenceNumber(), + getArUuid(), + getApi(), + getSlotNumber(), + getSubSlotNumber(), + getIndex(), + getRecordDataLength(), + getUserData()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java new file mode 100644 index 00000000000..8cf39b5f00e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/IODWriteResponseHeader.java @@ -0,0 +1,459 @@ +/* + * 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.profinet.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 IODWriteResponseHeader extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOD_WRITE_RESPONSE_HEADER; + } + + // Constant values. + public static final Integer PADFIELD = 0x0000; + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final int sequenceNumber; + protected final Uuid arUuid; + protected final long api; + protected final int slotNumber; + protected final int subSlotNumber; + protected final int index; + protected final long recordDataLength; + + public IODWriteResponseHeader( + short blockVersionHigh, + short blockVersionLow, + int sequenceNumber, + Uuid arUuid, + long api, + int slotNumber, + int subSlotNumber, + int index, + long recordDataLength) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.sequenceNumber = sequenceNumber; + this.arUuid = arUuid; + this.api = api; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.index = index; + this.recordDataLength = recordDataLength; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public int getSequenceNumber() { + return sequenceNumber; + } + + public Uuid getArUuid() { + return arUuid; + } + + public long getApi() { + return api; + } + + public int getSlotNumber() { + return slotNumber; + } + + public int getSubSlotNumber() { + return subSlotNumber; + } + + public int getIndex() { + return index; + } + + public long getRecordDataLength() { + return recordDataLength; + } + + public int getPadField() { + return PADFIELD; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("IODWriteResponseHeader"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sequenceNumber) + writeSimpleField( + "sequenceNumber", + sequenceNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (api) + writeSimpleField( + "api", + api, + writeUnsignedLong(writeBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (slotNumber) + writeSimpleField( + "slotNumber", + slotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (subSlotNumber) + writeSimpleField( + "subSlotNumber", + subSlotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (padField) + writeConstField( + "padField", + PADFIELD, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (index) + writeSimpleField( + "index", + index, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (recordDataLength) + writeSimpleField( + "recordDataLength", + recordDataLength, + writeUnsignedLong(writeBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Padding Field (padding) + writePaddingField( + "padding", + (int) ((((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4)), + (short) 0x00, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("IODWriteResponseHeader"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + IODWriteResponseHeader _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Simple field (sequenceNumber) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (api) + lengthInBits += 32; + + // Simple field (slotNumber) + lengthInBits += 16; + + // Simple field (subSlotNumber) + lengthInBits += 16; + + // Const Field (padField) + lengthInBits += 16; + + // Simple field (index) + lengthInBits += 16; + + // Simple field (recordDataLength) + lengthInBits += 32; + + // Padding Field (padding) + int _timesPadding = + (int) ((((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4)); + while (_timesPadding-- > 0) { + lengthInBits += 8; + } + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("IODWriteResponseHeader"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sequenceNumber = + readSimpleField( + "sequenceNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + long api = + readSimpleField( + "api", + readUnsignedLong(readBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int slotNumber = + readSimpleField( + "slotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int subSlotNumber = + readSimpleField( + "subSlotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int padField = + readConstField( + "padField", + readUnsignedInt(readBuffer, 16), + IODWriteResponseHeader.PADFIELD, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int index = + readSimpleField( + "index", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + long recordDataLength = + readSimpleField( + "recordDataLength", + readUnsignedLong(readBuffer, 32), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readPaddingField( + readUnsignedShort(readBuffer, 8), + (int) ((((((((((64) - (6)) - (2)) - (16)) - (4)) - (2)) - (2)) - (2)) - (2)) - (4)), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("IODWriteResponseHeader"); + // Create the instance + return new IODWriteResponseHeaderBuilderImpl( + blockVersionHigh, + blockVersionLow, + sequenceNumber, + arUuid, + api, + slotNumber, + subSlotNumber, + index, + recordDataLength); + } + + public static class IODWriteResponseHeaderBuilderImpl + implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final int sequenceNumber; + private final Uuid arUuid; + private final long api; + private final int slotNumber; + private final int subSlotNumber; + private final int index; + private final long recordDataLength; + + public IODWriteResponseHeaderBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + int sequenceNumber, + Uuid arUuid, + long api, + int slotNumber, + int subSlotNumber, + int index, + long recordDataLength) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.sequenceNumber = sequenceNumber; + this.arUuid = arUuid; + this.api = api; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.index = index; + this.recordDataLength = recordDataLength; + } + + public IODWriteResponseHeader build() { + IODWriteResponseHeader iODWriteResponseHeader = + new IODWriteResponseHeader( + blockVersionHigh, + blockVersionLow, + sequenceNumber, + arUuid, + api, + slotNumber, + subSlotNumber, + index, + recordDataLength); + return iODWriteResponseHeader; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof IODWriteResponseHeader)) { + return false; + } + IODWriteResponseHeader that = (IODWriteResponseHeader) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getSequenceNumber() == that.getSequenceNumber()) + && (getArUuid() == that.getArUuid()) + && (getApi() == that.getApi()) + && (getSlotNumber() == that.getSlotNumber()) + && (getSubSlotNumber() == that.getSubSlotNumber()) + && (getIndex() == that.getIndex()) + && (getRecordDataLength() == that.getRecordDataLength()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getSequenceNumber(), + getArUuid(), + getApi(), + getSlotNumber(), + getSubSlotNumber(), + getIndex(), + getRecordDataLength()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java new file mode 100644 index 00000000000..4c7574a9a93 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/LldpUnit.java @@ -0,0 +1,176 @@ +/* + * 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.profinet.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 LldpUnit implements Message { + + // Abstract accessors for discriminator values. + public abstract TlvType getTlvId(); + + // Properties. + protected final int tlvIdLength; + + public LldpUnit(int tlvIdLength) { + super(); + this.tlvIdLength = tlvIdLength; + } + + public int getTlvIdLength() { + return tlvIdLength; + } + + protected abstract void serializeLldpUnitChild(WriteBuffer writeBuffer) + throws SerializationException; + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("LldpUnit"); + + // Discriminator Field (tlvId) (Used as input to a switch field) + writeDiscriminatorEnumField( + "tlvId", + "TlvType", + getTlvId(), + new DataWriterEnumDefault<>( + TlvType::getValue, TlvType::name, writeUnsignedShort(writeBuffer, 7))); + + // Simple Field (tlvIdLength) + writeSimpleField("tlvIdLength", tlvIdLength, writeUnsignedInt(writeBuffer, 9)); + + // Switch field (Serialize the sub-type) + serializeLldpUnitChild(writeBuffer); + + writeBuffer.popContext("LldpUnit"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + LldpUnit _value = this; + + // Discriminator Field (tlvId) + lengthInBits += 7; + + // Simple field (tlvIdLength) + lengthInBits += 9; + + // Length of sub-type elements will be added by sub-type... + + return lengthInBits; + } + + public static LldpUnit staticParse(ReadBuffer readBuffer, Object... args) throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static LldpUnit staticParse(ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("LldpUnit"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + TlvType tlvId = + readDiscriminatorField( + "tlvId", + new DataReaderEnumDefault<>(TlvType::enumForValue, readUnsignedShort(readBuffer, 7))); + + int tlvIdLength = readSimpleField("tlvIdLength", readUnsignedInt(readBuffer, 9)); + + // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) + LldpUnitBuilder builder = null; + if (EvaluationHelper.equals(tlvId, TlvType.END_OF_LLDP)) { + builder = EndOfLldp.staticParseLldpUnitBuilder(readBuffer); + } else if (EvaluationHelper.equals(tlvId, TlvType.CHASSIS_ID)) { + builder = TlvChassisId.staticParseLldpUnitBuilder(readBuffer, tlvIdLength); + } else if (EvaluationHelper.equals(tlvId, TlvType.PORT_ID)) { + builder = TlvPortId.staticParseLldpUnitBuilder(readBuffer, tlvIdLength); + } else if (EvaluationHelper.equals(tlvId, TlvType.TIME_TO_LIVE)) { + builder = TlvTimeToLive.staticParseLldpUnitBuilder(readBuffer); + } else if (EvaluationHelper.equals(tlvId, TlvType.MANAGEMENT_ADDRESS)) { + builder = TlvManagementAddress.staticParseLldpUnitBuilder(readBuffer); + } else if (EvaluationHelper.equals(tlvId, TlvType.ORGANIZATION_SPECIFIC)) { + builder = TlvOrganizationSpecific.staticParseLldpUnitBuilder(readBuffer); + } + if (builder == null) { + throw new ParseException( + "Unsupported case for discriminated type" + " parameters [" + "tlvId=" + tlvId + "]"); + } + + readBuffer.closeContext("LldpUnit"); + // Create the instance + LldpUnit _lldpUnit = builder.build(tlvIdLength); + return _lldpUnit; + } + + public interface LldpUnitBuilder { + LldpUnit build(int tlvIdLength); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof LldpUnit)) { + return false; + } + LldpUnit that = (LldpUnit) o; + return (getTlvIdLength() == that.getTlvIdLength()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getTlvIdLength()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java new file mode 100644 index 00000000000..a5b7cce63cd --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Lldp_Pdu.java @@ -0,0 +1,146 @@ +/* + * 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.profinet.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 Lldp_Pdu implements Message { + + // Properties. + protected final List lldpParameters; + + public Lldp_Pdu(List lldpParameters) { + super(); + this.lldpParameters = lldpParameters; + } + + public List getLldpParameters() { + return lldpParameters; + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("Lldp_Pdu"); + + // Manual Array Field (lldpParameters) + writeManualArrayField( + "lldpParameters", + lldpParameters, + (LldpUnit _value) -> + org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.serializeSysexString( + writeBuffer, _value), + writeBuffer); + + writeBuffer.popContext("Lldp_Pdu"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + Lldp_Pdu _value = this; + + // Manual Array Field (lldpParameters) + lengthInBits += + org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.lengthSysexString( + lldpParameters) + * 8; + + return lengthInBits; + } + + public static Lldp_Pdu staticParse(ReadBuffer readBuffer, Object... args) throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static Lldp_Pdu staticParse(ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("Lldp_Pdu"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + List lldpParameters = + readManualArrayField( + "lldpParameters", + readBuffer, + (List _values) -> + (boolean) + (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.isSysexEnd( + readBuffer)), + () -> + (LldpUnit) + (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.parseSysexString( + readBuffer))); + + readBuffer.closeContext("Lldp_Pdu"); + // Create the instance + Lldp_Pdu _lldp_Pdu; + _lldp_Pdu = new Lldp_Pdu(lldpParameters); + return _lldp_Pdu; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Lldp_Pdu)) { + return false; + } + Lldp_Pdu that = (Lldp_Pdu) o; + return (getLldpParameters() == that.getLldpParameters()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getLldpParameters()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ManagementAddressSubType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ManagementAddressSubType.java new file mode 100644 index 00000000000..f88fdd810cd --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ManagementAddressSubType.java @@ -0,0 +1,55 @@ +/* + * 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.profinet.readwrite; + +import java.util.HashMap; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum ManagementAddressSubType { + UNKNOWN((short) 0x00), + IPV4((short) 0x01); + private static final Map map; + + static { + map = new HashMap<>(); + for (ManagementAddressSubType value : ManagementAddressSubType.values()) { + map.put((short) value.getValue(), value); + } + } + + private short value; + + ManagementAddressSubType(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static ManagementAddressSubType enumForValue(short value) { + return map.get(value); + } + + public static Boolean isDefined(short value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/MultipleInterfaceModeNameOfDevice.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/MultipleInterfaceModeNameOfDevice.java new file mode 100644 index 00000000000..22e2d775e47 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/MultipleInterfaceModeNameOfDevice.java @@ -0,0 +1,55 @@ +/* + * 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.profinet.readwrite; + +import java.util.HashMap; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum MultipleInterfaceModeNameOfDevice { + PORT_PROVIDED_BY_LLDP((boolean) false), + NAME_PROVIDED_BY_LLDP((boolean) true); + private static final Map map; + + static { + map = new HashMap<>(); + for (MultipleInterfaceModeNameOfDevice value : MultipleInterfaceModeNameOfDevice.values()) { + map.put((boolean) value.getValue(), value); + } + } + + private boolean value; + + MultipleInterfaceModeNameOfDevice(boolean value) { + this.value = value; + } + + public boolean getValue() { + return value; + } + + public static MultipleInterfaceModeNameOfDevice enumForValue(boolean value) { + return map.get(value); + } + + public static Boolean isDefined(boolean value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java new file mode 100644 index 00000000000..4f402fcd865 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDInterfaceAdjust.java @@ -0,0 +1,304 @@ +/* + * 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.profinet.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 PDInterfaceAdjust extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.PD_INTERFACE_ADJUST; + } + + // Constant values. + public static final Integer PADFIELD = 0x0000; + public static final Integer MULTIPLEINTERFACEMODERESERVED2 = 0x0000; + public static final Integer MULTIPLEINTERFACEMODERESERVED1 = 0x0000; + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice; + + public PDInterfaceAdjust( + short blockVersionHigh, + short blockVersionLow, + MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.multipleInterfaceModeNameOfDevice = multipleInterfaceModeNameOfDevice; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public MultipleInterfaceModeNameOfDevice getMultipleInterfaceModeNameOfDevice() { + return multipleInterfaceModeNameOfDevice; + } + + public int getPadField() { + return PADFIELD; + } + + public int getMultipleInterfaceModeReserved2() { + return MULTIPLEINTERFACEMODERESERVED2; + } + + public int getMultipleInterfaceModeReserved1() { + return MULTIPLEINTERFACEMODERESERVED1; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PDInterfaceAdjust"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (padField) + writeConstField( + "padField", + PADFIELD, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (multipleInterfaceModeReserved2) + writeConstField( + "multipleInterfaceModeReserved2", + MULTIPLEINTERFACEMODERESERVED2, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (multipleInterfaceModeReserved1) + writeConstField( + "multipleInterfaceModeReserved1", + MULTIPLEINTERFACEMODERESERVED1, + writeUnsignedInt(writeBuffer, 15), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (multipleInterfaceModeNameOfDevice) + writeSimpleEnumField( + "multipleInterfaceModeNameOfDevice", + "MultipleInterfaceModeNameOfDevice", + multipleInterfaceModeNameOfDevice, + new DataWriterEnumDefault<>( + MultipleInterfaceModeNameOfDevice::getValue, + MultipleInterfaceModeNameOfDevice::name, + writeBoolean(writeBuffer)), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PDInterfaceAdjust"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PDInterfaceAdjust _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Const Field (padField) + lengthInBits += 16; + + // Const Field (multipleInterfaceModeReserved2) + lengthInBits += 16; + + // Const Field (multipleInterfaceModeReserved1) + lengthInBits += 15; + + // Simple field (multipleInterfaceModeNameOfDevice) + lengthInBits += 1; + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PDInterfaceAdjust"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int padField = + readConstField( + "padField", + readUnsignedInt(readBuffer, 16), + PDInterfaceAdjust.PADFIELD, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int multipleInterfaceModeReserved2 = + readConstField( + "multipleInterfaceModeReserved2", + readUnsignedInt(readBuffer, 16), + PDInterfaceAdjust.MULTIPLEINTERFACEMODERESERVED2, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int multipleInterfaceModeReserved1 = + readConstField( + "multipleInterfaceModeReserved1", + readUnsignedInt(readBuffer, 15), + PDInterfaceAdjust.MULTIPLEINTERFACEMODERESERVED1, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice = + readEnumField( + "multipleInterfaceModeNameOfDevice", + "MultipleInterfaceModeNameOfDevice", + new DataReaderEnumDefault<>( + MultipleInterfaceModeNameOfDevice::enumForValue, readBoolean(readBuffer)), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PDInterfaceAdjust"); + // Create the instance + return new PDInterfaceAdjustBuilderImpl( + blockVersionHigh, blockVersionLow, multipleInterfaceModeNameOfDevice); + } + + public static class PDInterfaceAdjustBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice; + + public PDInterfaceAdjustBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.multipleInterfaceModeNameOfDevice = multipleInterfaceModeNameOfDevice; + } + + public PDInterfaceAdjust build() { + PDInterfaceAdjust pDInterfaceAdjust = + new PDInterfaceAdjust( + blockVersionHigh, blockVersionLow, multipleInterfaceModeNameOfDevice); + return pDInterfaceAdjust; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PDInterfaceAdjust)) { + return false; + } + PDInterfaceAdjust that = (PDInterfaceAdjust) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getMultipleInterfaceModeNameOfDevice() == that.getMultipleInterfaceModeNameOfDevice()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getMultipleInterfaceModeNameOfDevice()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java new file mode 100644 index 00000000000..a3aaf00cd52 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PDPortDataCheck.java @@ -0,0 +1,310 @@ +/* + * 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.profinet.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 PDPortDataCheck extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.PD_PORT_DATA_CHECK; + } + + // Constant values. + public static final Integer PADFIELD = 0x0000; + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final int slotNumber; + protected final int subSlotNumber; + protected final PnIoCm_Block checkPeers; + + public PDPortDataCheck( + short blockVersionHigh, + short blockVersionLow, + int slotNumber, + int subSlotNumber, + PnIoCm_Block checkPeers) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.checkPeers = checkPeers; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public int getSlotNumber() { + return slotNumber; + } + + public int getSubSlotNumber() { + return subSlotNumber; + } + + public PnIoCm_Block getCheckPeers() { + return checkPeers; + } + + public int getPadField() { + return PADFIELD; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PDPortDataCheck"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Const Field (padField) + writeConstField( + "padField", + PADFIELD, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (slotNumber) + writeSimpleField( + "slotNumber", + slotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (subSlotNumber) + writeSimpleField( + "subSlotNumber", + subSlotNumber, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (checkPeers) + writeSimpleField( + "checkPeers", + checkPeers, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PDPortDataCheck"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PDPortDataCheck _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Const Field (padField) + lengthInBits += 16; + + // Simple field (slotNumber) + lengthInBits += 16; + + // Simple field (subSlotNumber) + lengthInBits += 16; + + // Simple field (checkPeers) + lengthInBits += checkPeers.getLengthInBits(); + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PDPortDataCheck"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int padField = + readConstField( + "padField", + readUnsignedInt(readBuffer, 16), + PDPortDataCheck.PADFIELD, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int slotNumber = + readSimpleField( + "slotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int subSlotNumber = + readSimpleField( + "subSlotNumber", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + PnIoCm_Block checkPeers = + readSimpleField( + "checkPeers", + new DataReaderComplexDefault<>(() -> PnIoCm_Block.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PDPortDataCheck"); + // Create the instance + return new PDPortDataCheckBuilderImpl( + blockVersionHigh, blockVersionLow, slotNumber, subSlotNumber, checkPeers); + } + + public static class PDPortDataCheckBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final int slotNumber; + private final int subSlotNumber; + private final PnIoCm_Block checkPeers; + + public PDPortDataCheckBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + int slotNumber, + int subSlotNumber, + PnIoCm_Block checkPeers) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.slotNumber = slotNumber; + this.subSlotNumber = subSlotNumber; + this.checkPeers = checkPeers; + } + + public PDPortDataCheck build() { + PDPortDataCheck pDPortDataCheck = + new PDPortDataCheck( + blockVersionHigh, blockVersionLow, slotNumber, subSlotNumber, checkPeers); + return pDPortDataCheck; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PDPortDataCheck)) { + return false; + } + PDPortDataCheck that = (PDPortDataCheck) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getSlotNumber() == that.getSlotNumber()) + && (getSubSlotNumber() == that.getSubSlotNumber()) + && (getCheckPeers() == that.getCheckPeers()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getSlotNumber(), + getSubSlotNumber(), + getCheckPeers()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java new file mode 100644 index 00000000000..754247568a1 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PascalString.java @@ -0,0 +1,161 @@ +/* + * 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.profinet.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 PascalString implements Message { + + // Properties. + protected final String stringValue; + + public PascalString(String stringValue) { + super(); + this.stringValue = stringValue; + } + + public String getStringValue() { + return stringValue; + } + + public byte getStringLength() { + return (byte) ((((getStringValue().length()) == (-(1))) ? 0 : getStringValue().length())); + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PascalString"); + + // Implicit Field (sLength) (Used for parsing, but its value is not stored as it's implicitly + // given by the objects content) + byte sLength = + (byte) ((((getStringValue().length()) == (0)) ? -(1) : getStringValue().length())); + writeImplicitField("sLength", sLength, writeSignedByte(writeBuffer, 8)); + + // Simple Field (stringValue) + writeSimpleField( + "stringValue", + stringValue, + writeString(writeBuffer, (((sLength) == (-(1))) ? 0 : (sLength) * (8)))); + + // Virtual field (doesn't actually serialize anything, just makes the value available) + byte stringLength = getStringLength(); + writeBuffer.writeVirtual("stringLength", stringLength); + + writeBuffer.popContext("PascalString"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + PascalString _value = this; + + // Implicit Field (sLength) + lengthInBits += 8; + + // Simple field (stringValue) + lengthInBits += + ((((((getStringValue().length()) == (0)) ? -(1) : getStringValue().length())) == (-(1))) + ? 0 + : ((((getStringValue().length()) == (0)) ? -(1) : getStringValue().length())) * (8)); + + // A virtual field doesn't have any in- or output. + + return lengthInBits; + } + + public static PascalString staticParse(ReadBuffer readBuffer, Object... args) + throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static PascalString staticParse(ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("PascalString"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + byte sLength = readImplicitField("sLength", readSignedByte(readBuffer, 8)); + + String stringValue = + readSimpleField( + "stringValue", readString(readBuffer, (((sLength) == (-(1))) ? 0 : (sLength) * (8)))); + byte stringLength = + readVirtualField( + "stringLength", + byte.class, + (((stringValue.length()) == (-(1))) ? 0 : stringValue.length())); + + readBuffer.closeContext("PascalString"); + // Create the instance + PascalString _pascalString; + _pascalString = new PascalString(stringValue); + return _pascalString; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PascalString)) { + return false; + } + PascalString that = (PascalString) o; + return (getStringValue() == that.getStringValue()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getStringValue()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java index 6edbd6ae895..ad32c0f885e 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java @@ -50,6 +50,12 @@ public class PcDcp_Pdu_DelayReq extends PnDcp_Pdu implements Message { protected final long delayInNs; protected final MacAddress portMacAddress; + // Reserved Fields + private Long reservedField0; + private Long reservedField1; + private Long reservedField2; + private Integer reservedField3; + public PcDcp_Pdu_DelayReq( int frameIdValue, int sequenceId, long delayInNs, MacAddress portMacAddress) { super(frameIdValue); @@ -93,19 +99,31 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeBuffer.pushContext("PcDcp_Pdu_DelayReq"); // Reserved Field (reserved) - writeReservedField("reserved", (long) 0x00000000, writeUnsignedLong(writeBuffer, 32)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (long) 0x00000000, + writeUnsignedLong(writeBuffer, 32)); // Reserved Field (reserved) - writeReservedField("reserved", (long) 0x00000000, writeUnsignedLong(writeBuffer, 32)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (long) 0x00000000, + writeUnsignedLong(writeBuffer, 32)); // Reserved Field (reserved) - writeReservedField("reserved", (long) 0x00000000, writeUnsignedLong(writeBuffer, 32)); + writeReservedField( + "reserved", + reservedField2 != null ? reservedField2 : (long) 0x00000000, + writeUnsignedLong(writeBuffer, 32)); // Simple Field (sequenceId) writeSimpleField("sequenceId", sequenceId, writeUnsignedInt(writeBuffer, 16)); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField3 != null ? reservedField3 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Simple Field (delayInNs) writeSimpleField("delayInNs", delayInNs, writeUnsignedLong(writeBuffer, 32)); @@ -218,24 +236,49 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer readBuffer.closeContext("PcDcp_Pdu_DelayReq"); // Create the instance - return new PcDcp_Pdu_DelayReqBuilderImpl(sequenceId, delayInNs, portMacAddress); + return new PcDcp_Pdu_DelayReqBuilderImpl( + sequenceId, + delayInNs, + portMacAddress, + reservedField0, + reservedField1, + reservedField2, + reservedField3); } public static class PcDcp_Pdu_DelayReqBuilderImpl implements PnDcp_Pdu.PnDcp_PduBuilder { private final int sequenceId; private final long delayInNs; private final MacAddress portMacAddress; + private final Long reservedField0; + private final Long reservedField1; + private final Long reservedField2; + private final Integer reservedField3; public PcDcp_Pdu_DelayReqBuilderImpl( - int sequenceId, long delayInNs, MacAddress portMacAddress) { + int sequenceId, + long delayInNs, + MacAddress portMacAddress, + Long reservedField0, + Long reservedField1, + Long reservedField2, + Integer reservedField3) { this.sequenceId = sequenceId; this.delayInNs = delayInNs; this.portMacAddress = portMacAddress; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + this.reservedField2 = reservedField2; + this.reservedField3 = reservedField3; } public PcDcp_Pdu_DelayReq build(int frameIdValue) { PcDcp_Pdu_DelayReq pcDcp_Pdu_DelayReq = new PcDcp_Pdu_DelayReq(frameIdValue, sequenceId, delayInNs, portMacAddress); + pcDcp_Pdu_DelayReq.reservedField0 = reservedField0; + pcDcp_Pdu_DelayReq.reservedField1 = reservedField1; + pcDcp_Pdu_DelayReq.reservedField2 = reservedField2; + pcDcp_Pdu_DelayReq.reservedField3 = reservedField3; return pcDcp_Pdu_DelayReq; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java index 6a6f892b1ad..a6aad3b3386 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java @@ -49,9 +49,15 @@ public Short getSuboption() { // Properties. protected final byte[] aliasNameValue; - public PnDcp_Block_DevicePropertiesAliasName(byte[] aliasNameValue) { + // Arguments. + protected final Integer blockLength; + // Reserved Fields + private Integer reservedField0; + + public PnDcp_Block_DevicePropertiesAliasName(byte[] aliasNameValue, Integer blockLength) { super(); this.aliasNameValue = aliasNameValue; + this.blockLength = blockLength; } public byte[] getAliasNameValue() { @@ -65,7 +71,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesAliasName"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Array Field (aliasNameValue) writeByteArrayField("aliasNameValue", aliasNameValue, writeByteArray(writeBuffer, 8)); @@ -136,20 +145,27 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesAliasName"); // Create the instance - return new PnDcp_Block_DevicePropertiesAliasNameBuilderImpl(aliasNameValue); + return new PnDcp_Block_DevicePropertiesAliasNameBuilderImpl( + aliasNameValue, blockLength, reservedField0); } public static class PnDcp_Block_DevicePropertiesAliasNameBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final byte[] aliasNameValue; + private final Integer blockLength; + private final Integer reservedField0; - public PnDcp_Block_DevicePropertiesAliasNameBuilderImpl(byte[] aliasNameValue) { + public PnDcp_Block_DevicePropertiesAliasNameBuilderImpl( + byte[] aliasNameValue, Integer blockLength, Integer reservedField0) { this.aliasNameValue = aliasNameValue; + this.blockLength = blockLength; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesAliasName build() { PnDcp_Block_DevicePropertiesAliasName pnDcp_Block_DevicePropertiesAliasName = - new PnDcp_Block_DevicePropertiesAliasName(aliasNameValue); + new PnDcp_Block_DevicePropertiesAliasName(aliasNameValue, blockLength); + pnDcp_Block_DevicePropertiesAliasName.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesAliasName; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java index c5678bd2435..f318219e05b 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java @@ -50,6 +50,9 @@ public Short getSuboption() { protected final int vendorId; protected final int deviceId; + // Reserved Fields + private Integer reservedField0; + public PnDcp_Block_DevicePropertiesDeviceId(int vendorId, int deviceId) { super(); this.vendorId = vendorId; @@ -71,7 +74,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesDeviceId"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Simple Field (vendorId) writeSimpleField("vendorId", vendorId, writeUnsignedInt(writeBuffer, 16)); @@ -120,22 +126,26 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder(ReadBuffer readBu readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceId"); // Create the instance - return new PnDcp_Block_DevicePropertiesDeviceIdBuilderImpl(vendorId, deviceId); + return new PnDcp_Block_DevicePropertiesDeviceIdBuilderImpl(vendorId, deviceId, reservedField0); } public static class PnDcp_Block_DevicePropertiesDeviceIdBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final int vendorId; private final int deviceId; + private final Integer reservedField0; - public PnDcp_Block_DevicePropertiesDeviceIdBuilderImpl(int vendorId, int deviceId) { + public PnDcp_Block_DevicePropertiesDeviceIdBuilderImpl( + int vendorId, int deviceId, Integer reservedField0) { this.vendorId = vendorId; this.deviceId = deviceId; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesDeviceId build() { PnDcp_Block_DevicePropertiesDeviceId pnDcp_Block_DevicePropertiesDeviceId = new PnDcp_Block_DevicePropertiesDeviceId(vendorId, deviceId); + pnDcp_Block_DevicePropertiesDeviceId.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesDeviceId; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java index a94fe32d516..e15810cd4f5 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java @@ -50,6 +50,9 @@ public Short getSuboption() { protected final short deviceInstanceHigh; protected final short deviceInstanceLow; + // Reserved Fields + private Integer reservedField0; + public PnDcp_Block_DevicePropertiesDeviceInstance( short deviceInstanceHigh, short deviceInstanceLow) { super(); @@ -72,7 +75,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesDeviceInstance"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Simple Field (deviceInstanceHigh) writeSimpleField("deviceInstanceHigh", deviceInstanceHigh, writeUnsignedShort(writeBuffer, 8)); @@ -124,23 +130,26 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder(ReadBuffer readBu readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceInstance"); // Create the instance return new PnDcp_Block_DevicePropertiesDeviceInstanceBuilderImpl( - deviceInstanceHigh, deviceInstanceLow); + deviceInstanceHigh, deviceInstanceLow, reservedField0); } public static class PnDcp_Block_DevicePropertiesDeviceInstanceBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final short deviceInstanceHigh; private final short deviceInstanceLow; + private final Integer reservedField0; public PnDcp_Block_DevicePropertiesDeviceInstanceBuilderImpl( - short deviceInstanceHigh, short deviceInstanceLow) { + short deviceInstanceHigh, short deviceInstanceLow, Integer reservedField0) { this.deviceInstanceHigh = deviceInstanceHigh; this.deviceInstanceLow = deviceInstanceLow; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesDeviceInstance build() { PnDcp_Block_DevicePropertiesDeviceInstance pnDcp_Block_DevicePropertiesDeviceInstance = new PnDcp_Block_DevicePropertiesDeviceInstance(deviceInstanceHigh, deviceInstanceLow); + pnDcp_Block_DevicePropertiesDeviceInstance.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesDeviceInstance; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java index 13d52de805c..d9f59b0e427 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java @@ -49,10 +49,16 @@ public Short getSuboption() { // Properties. protected final List supportedOptions; + // Arguments. + protected final Integer blockLength; + // Reserved Fields + private Integer reservedField0; + public PnDcp_Block_DevicePropertiesDeviceOptions( - List supportedOptions) { + List supportedOptions, Integer blockLength) { super(); this.supportedOptions = supportedOptions; + this.blockLength = blockLength; } public List getSupportedOptions() { @@ -66,7 +72,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesDeviceOptions"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Array Field (supportedOptions) writeComplexTypeArrayField("supportedOptions", supportedOptions, writeBuffer); @@ -116,21 +125,29 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceOptions"); // Create the instance - return new PnDcp_Block_DevicePropertiesDeviceOptionsBuilderImpl(supportedOptions); + return new PnDcp_Block_DevicePropertiesDeviceOptionsBuilderImpl( + supportedOptions, blockLength, reservedField0); } public static class PnDcp_Block_DevicePropertiesDeviceOptionsBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final List supportedOptions; + private final Integer blockLength; + private final Integer reservedField0; public PnDcp_Block_DevicePropertiesDeviceOptionsBuilderImpl( - List supportedOptions) { + List supportedOptions, + Integer blockLength, + Integer reservedField0) { this.supportedOptions = supportedOptions; + this.blockLength = blockLength; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesDeviceOptions build() { PnDcp_Block_DevicePropertiesDeviceOptions pnDcp_Block_DevicePropertiesDeviceOptions = - new PnDcp_Block_DevicePropertiesDeviceOptions(supportedOptions); + new PnDcp_Block_DevicePropertiesDeviceOptions(supportedOptions, blockLength); + pnDcp_Block_DevicePropertiesDeviceOptions.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesDeviceOptions; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java index c955af1260f..834e69db54c 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java @@ -52,6 +52,10 @@ public Short getSuboption() { protected final boolean pnioController; protected final boolean pnioDevice; + // Reserved Fields + private Long reservedField0; + private Short reservedField1; + public PnDcp_Block_DevicePropertiesDeviceRole( boolean pnioSupervisor, boolean pnioMultidevive, boolean pnioController, boolean pnioDevice) { super(); @@ -84,7 +88,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesDeviceRole"); // Reserved Field (reserved) - writeReservedField("reserved", (long) 0x000000, writeUnsignedLong(writeBuffer, 20)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (long) 0x000000, + writeUnsignedLong(writeBuffer, 20)); // Simple Field (pnioSupervisor) writeSimpleField("pnioSupervisor", pnioSupervisor, writeBoolean(writeBuffer)); @@ -99,7 +106,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeSimpleField("pnioDevice", pnioDevice, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (short) 0x00, + writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceRole"); } @@ -159,7 +169,12 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder(ReadBuffer readBu readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceRole"); // Create the instance return new PnDcp_Block_DevicePropertiesDeviceRoleBuilderImpl( - pnioSupervisor, pnioMultidevive, pnioController, pnioDevice); + pnioSupervisor, + pnioMultidevive, + pnioController, + pnioDevice, + reservedField0, + reservedField1); } public static class PnDcp_Block_DevicePropertiesDeviceRoleBuilderImpl @@ -168,22 +183,30 @@ public static class PnDcp_Block_DevicePropertiesDeviceRoleBuilderImpl private final boolean pnioMultidevive; private final boolean pnioController; private final boolean pnioDevice; + private final Long reservedField0; + private final Short reservedField1; public PnDcp_Block_DevicePropertiesDeviceRoleBuilderImpl( boolean pnioSupervisor, boolean pnioMultidevive, boolean pnioController, - boolean pnioDevice) { + boolean pnioDevice, + Long reservedField0, + Short reservedField1) { this.pnioSupervisor = pnioSupervisor; this.pnioMultidevive = pnioMultidevive; this.pnioController = pnioController; this.pnioDevice = pnioDevice; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; } public PnDcp_Block_DevicePropertiesDeviceRole build() { PnDcp_Block_DevicePropertiesDeviceRole pnDcp_Block_DevicePropertiesDeviceRole = new PnDcp_Block_DevicePropertiesDeviceRole( pnioSupervisor, pnioMultidevive, pnioController, pnioDevice); + pnDcp_Block_DevicePropertiesDeviceRole.reservedField0 = reservedField0; + pnDcp_Block_DevicePropertiesDeviceRole.reservedField1 = reservedField1; return pnDcp_Block_DevicePropertiesDeviceRole; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java index 98f8f44cada..f417e5a6870 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java @@ -49,9 +49,15 @@ public Short getSuboption() { // Properties. protected final byte[] deviceVendorValue; - public PnDcp_Block_DevicePropertiesDeviceVendor(byte[] deviceVendorValue) { + // Arguments. + protected final Integer blockLength; + // Reserved Fields + private Integer reservedField0; + + public PnDcp_Block_DevicePropertiesDeviceVendor(byte[] deviceVendorValue, Integer blockLength) { super(); this.deviceVendorValue = deviceVendorValue; + this.blockLength = blockLength; } public byte[] getDeviceVendorValue() { @@ -65,7 +71,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesDeviceVendor"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Array Field (deviceVendorValue) writeByteArrayField("deviceVendorValue", deviceVendorValue, writeByteArray(writeBuffer, 8)); @@ -136,20 +145,27 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceVendor"); // Create the instance - return new PnDcp_Block_DevicePropertiesDeviceVendorBuilderImpl(deviceVendorValue); + return new PnDcp_Block_DevicePropertiesDeviceVendorBuilderImpl( + deviceVendorValue, blockLength, reservedField0); } public static class PnDcp_Block_DevicePropertiesDeviceVendorBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final byte[] deviceVendorValue; + private final Integer blockLength; + private final Integer reservedField0; - public PnDcp_Block_DevicePropertiesDeviceVendorBuilderImpl(byte[] deviceVendorValue) { + public PnDcp_Block_DevicePropertiesDeviceVendorBuilderImpl( + byte[] deviceVendorValue, Integer blockLength, Integer reservedField0) { this.deviceVendorValue = deviceVendorValue; + this.blockLength = blockLength; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesDeviceVendor build() { PnDcp_Block_DevicePropertiesDeviceVendor pnDcp_Block_DevicePropertiesDeviceVendor = - new PnDcp_Block_DevicePropertiesDeviceVendor(deviceVendorValue); + new PnDcp_Block_DevicePropertiesDeviceVendor(deviceVendorValue, blockLength); + pnDcp_Block_DevicePropertiesDeviceVendor.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesDeviceVendor; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java index c47738b218c..d2445e88673 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java @@ -49,9 +49,15 @@ public Short getSuboption() { // Properties. protected final byte[] nameOfStation; - public PnDcp_Block_DevicePropertiesNameOfStation(byte[] nameOfStation) { + // Arguments. + protected final Integer blockLength; + // Reserved Fields + private Integer reservedField0; + + public PnDcp_Block_DevicePropertiesNameOfStation(byte[] nameOfStation, Integer blockLength) { super(); this.nameOfStation = nameOfStation; + this.blockLength = blockLength; } public byte[] getNameOfStation() { @@ -65,7 +71,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_DevicePropertiesNameOfStation"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Array Field (nameOfStation) writeByteArrayField("nameOfStation", nameOfStation, writeByteArray(writeBuffer, 8)); @@ -136,20 +145,27 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesNameOfStation"); // Create the instance - return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl(nameOfStation); + return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( + nameOfStation, blockLength, reservedField0); } public static class PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final byte[] nameOfStation; + private final Integer blockLength; + private final Integer reservedField0; - public PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl(byte[] nameOfStation) { + public PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( + byte[] nameOfStation, Integer blockLength, Integer reservedField0) { this.nameOfStation = nameOfStation; + this.blockLength = blockLength; + this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesNameOfStation build() { PnDcp_Block_DevicePropertiesNameOfStation pnDcp_Block_DevicePropertiesNameOfStation = - new PnDcp_Block_DevicePropertiesNameOfStation(nameOfStation); + new PnDcp_Block_DevicePropertiesNameOfStation(nameOfStation, blockLength); + pnDcp_Block_DevicePropertiesNameOfStation.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesNameOfStation; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java index e75462f6ad4..b068ba35361 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java @@ -49,6 +49,9 @@ public Short getSuboption() { // Properties. protected final MacAddress macAddress; + // Reserved Fields + private Integer reservedField0; + public PnDcp_Block_IpMacAddress(MacAddress macAddress) { super(); this.macAddress = macAddress; @@ -65,7 +68,10 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_IpMacAddress"); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Simple Field (macAddress) writeSimpleField("macAddress", macAddress, new DataWriterComplexDefault<>(writeBuffer)); @@ -109,19 +115,22 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder(ReadBuffer readBu readBuffer.closeContext("PnDcp_Block_IpMacAddress"); // Create the instance - return new PnDcp_Block_IpMacAddressBuilderImpl(macAddress); + return new PnDcp_Block_IpMacAddressBuilderImpl(macAddress, reservedField0); } public static class PnDcp_Block_IpMacAddressBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final MacAddress macAddress; + private final Integer reservedField0; - public PnDcp_Block_IpMacAddressBuilderImpl(MacAddress macAddress) { + public PnDcp_Block_IpMacAddressBuilderImpl(MacAddress macAddress, Integer reservedField0) { this.macAddress = macAddress; + this.reservedField0 = reservedField0; } public PnDcp_Block_IpMacAddress build() { PnDcp_Block_IpMacAddress pnDcp_Block_IpMacAddress = new PnDcp_Block_IpMacAddress(macAddress); + pnDcp_Block_IpMacAddress.reservedField0 = reservedField0; return pnDcp_Block_IpMacAddress; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java index 1b20d6ae94c..10512ae5800 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java @@ -54,6 +54,10 @@ public Short getSuboption() { protected final byte[] subnetMask; protected final byte[] standardGateway; + // Reserved Fields + private Short reservedField0; + private Short reservedField1; + public PnDcp_Block_IpParameter( boolean ipConflictDetected, boolean setViaDhcp, @@ -101,13 +105,19 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("PnDcp_Block_IpParameter"); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (short) 0x00, + writeUnsignedShort(writeBuffer, 8)); // Simple Field (ipConflictDetected) writeSimpleField("ipConflictDetected", ipConflictDetected, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 5)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (short) 0x00, + writeUnsignedShort(writeBuffer, 5)); // Simple Field (setViaDhcp) writeSimpleField("setViaDhcp", setViaDhcp, writeBoolean(writeBuffer)); @@ -198,7 +208,14 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder(ReadBuffer readBu readBuffer.closeContext("PnDcp_Block_IpParameter"); // Create the instance return new PnDcp_Block_IpParameterBuilderImpl( - ipConflictDetected, setViaDhcp, setManually, ipAddress, subnetMask, standardGateway); + ipConflictDetected, + setViaDhcp, + setManually, + ipAddress, + subnetMask, + standardGateway, + reservedField0, + reservedField1); } public static class PnDcp_Block_IpParameterBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { @@ -208,6 +225,8 @@ public static class PnDcp_Block_IpParameterBuilderImpl implements PnDcp_Block.Pn private final byte[] ipAddress; private final byte[] subnetMask; private final byte[] standardGateway; + private final Short reservedField0; + private final Short reservedField1; public PnDcp_Block_IpParameterBuilderImpl( boolean ipConflictDetected, @@ -215,19 +234,25 @@ public PnDcp_Block_IpParameterBuilderImpl( boolean setManually, byte[] ipAddress, byte[] subnetMask, - byte[] standardGateway) { + byte[] standardGateway, + Short reservedField0, + Short reservedField1) { this.ipConflictDetected = ipConflictDetected; this.setViaDhcp = setViaDhcp; this.setManually = setManually; this.ipAddress = ipAddress; this.subnetMask = subnetMask; this.standardGateway = standardGateway; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; } public PnDcp_Block_IpParameter build() { PnDcp_Block_IpParameter pnDcp_Block_IpParameter = new PnDcp_Block_IpParameter( ipConflictDetected, setViaDhcp, setManually, ipAddress, subnetMask, standardGateway); + pnDcp_Block_IpParameter.reservedField0 = reservedField0; + pnDcp_Block_IpParameter.reservedField1 = reservedField1; return pnDcp_Block_IpParameter; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java index e8e50751023..4e0e665039f 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java @@ -121,6 +121,8 @@ public static PnDcp_Pdu staticParse(ReadBuffer readBuffer) throws ParseException builder = PnDcp_Pdu_RealTimeCyclic.staticParsePnDcp_PduBuilder(readBuffer); } else if (EvaluationHelper.equals(frameId, PnDcp_FrameId.PTCP_DelayReqPDU)) { builder = PcDcp_Pdu_DelayReq.staticParsePnDcp_PduBuilder(readBuffer); + } else if (EvaluationHelper.equals(frameId, PnDcp_FrameId.Alarm_Low)) { + builder = PnDcp_Pdu_AlarmLow.staticParsePnDcp_PduBuilder(readBuffer); } else if (EvaluationHelper.equals(frameId, PnDcp_FrameId.DCP_Identify_ReqPDU)) { builder = PnDcp_Pdu_IdentifyReq.staticParsePnDcp_PduBuilder(readBuffer); } else if (EvaluationHelper.equals(frameId, PnDcp_FrameId.DCP_Identify_ResPDU)) { diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java new file mode 100644 index 00000000000..336f95fcd3e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java @@ -0,0 +1,335 @@ +/* + * 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.profinet.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 PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message { + + // Accessors for discriminator values. + + // Properties. + protected final int alarmDstEndpoint; + protected final int alarmSrcEndpoint; + protected final byte version; + protected final byte errorType; + protected final byte tAck; + protected final byte windowSize; + protected final int senSeqNum; + protected final int ackSeqNum; + protected final byte[] varPart; + + public PnDcp_Pdu_AlarmLow( + int frameIdValue, + int alarmDstEndpoint, + int alarmSrcEndpoint, + byte version, + byte errorType, + byte tAck, + byte windowSize, + int senSeqNum, + int ackSeqNum, + byte[] varPart) { + super(frameIdValue); + this.alarmDstEndpoint = alarmDstEndpoint; + this.alarmSrcEndpoint = alarmSrcEndpoint; + this.version = version; + this.errorType = errorType; + this.tAck = tAck; + this.windowSize = windowSize; + this.senSeqNum = senSeqNum; + this.ackSeqNum = ackSeqNum; + this.varPart = varPart; + } + + public int getAlarmDstEndpoint() { + return alarmDstEndpoint; + } + + public int getAlarmSrcEndpoint() { + return alarmSrcEndpoint; + } + + public byte getVersion() { + return version; + } + + public byte getErrorType() { + return errorType; + } + + public byte getTAck() { + return tAck; + } + + public byte getWindowSize() { + return windowSize; + } + + public int getSenSeqNum() { + return senSeqNum; + } + + public int getAckSeqNum() { + return ackSeqNum; + } + + public byte[] getVarPart() { + return varPart; + } + + @Override + protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnDcp_Pdu_AlarmLow"); + + // Simple Field (alarmDstEndpoint) + writeSimpleField("alarmDstEndpoint", alarmDstEndpoint, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (alarmSrcEndpoint) + writeSimpleField("alarmSrcEndpoint", alarmSrcEndpoint, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (version) + writeSimpleField("version", version, writeUnsignedByte(writeBuffer, 4)); + + // Simple Field (errorType) + writeSimpleField("errorType", errorType, writeUnsignedByte(writeBuffer, 4)); + + // Simple Field (tAck) + writeSimpleField("tAck", tAck, writeUnsignedByte(writeBuffer, 4)); + + // Simple Field (windowSize) + writeSimpleField("windowSize", windowSize, writeUnsignedByte(writeBuffer, 4)); + + // Simple Field (senSeqNum) + writeSimpleField("senSeqNum", senSeqNum, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (ackSeqNum) + writeSimpleField("ackSeqNum", ackSeqNum, writeUnsignedInt(writeBuffer, 16)); + + // Implicit Field (varPartLen) (Used for parsing, but its value is not stored as it's implicitly + // given by the objects content) + int varPartLen = (int) (COUNT(getVarPart())); + writeImplicitField("varPartLen", varPartLen, writeUnsignedInt(writeBuffer, 16)); + + // Array Field (varPart) + writeByteArrayField("varPart", varPart, writeByteArray(writeBuffer, 8)); + + writeBuffer.popContext("PnDcp_Pdu_AlarmLow"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnDcp_Pdu_AlarmLow _value = this; + + // Simple field (alarmDstEndpoint) + lengthInBits += 16; + + // Simple field (alarmSrcEndpoint) + lengthInBits += 16; + + // Simple field (version) + lengthInBits += 4; + + // Simple field (errorType) + lengthInBits += 4; + + // Simple field (tAck) + lengthInBits += 4; + + // Simple field (windowSize) + lengthInBits += 4; + + // Simple field (senSeqNum) + lengthInBits += 16; + + // Simple field (ackSeqNum) + lengthInBits += 16; + + // Implicit Field (varPartLen) + lengthInBits += 16; + + // Array field + if (varPart != null) { + lengthInBits += 8 * varPart.length; + } + + return lengthInBits; + } + + public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnDcp_Pdu_AlarmLow"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int alarmDstEndpoint = readSimpleField("alarmDstEndpoint", readUnsignedInt(readBuffer, 16)); + + int alarmSrcEndpoint = readSimpleField("alarmSrcEndpoint", readUnsignedInt(readBuffer, 16)); + + byte version = readSimpleField("version", readUnsignedByte(readBuffer, 4)); + + byte errorType = readSimpleField("errorType", readUnsignedByte(readBuffer, 4)); + + byte tAck = readSimpleField("tAck", readUnsignedByte(readBuffer, 4)); + + byte windowSize = readSimpleField("windowSize", readUnsignedByte(readBuffer, 4)); + + int senSeqNum = readSimpleField("senSeqNum", readUnsignedInt(readBuffer, 16)); + + int ackSeqNum = readSimpleField("ackSeqNum", readUnsignedInt(readBuffer, 16)); + + int varPartLen = readImplicitField("varPartLen", readUnsignedInt(readBuffer, 16)); + + byte[] varPart = readBuffer.readByteArray("varPart", Math.toIntExact(varPartLen)); + + readBuffer.closeContext("PnDcp_Pdu_AlarmLow"); + // Create the instance + return new PnDcp_Pdu_AlarmLowBuilderImpl( + alarmDstEndpoint, + alarmSrcEndpoint, + version, + errorType, + tAck, + windowSize, + senSeqNum, + ackSeqNum, + varPart); + } + + public static class PnDcp_Pdu_AlarmLowBuilderImpl implements PnDcp_Pdu.PnDcp_PduBuilder { + private final int alarmDstEndpoint; + private final int alarmSrcEndpoint; + private final byte version; + private final byte errorType; + private final byte tAck; + private final byte windowSize; + private final int senSeqNum; + private final int ackSeqNum; + private final byte[] varPart; + + public PnDcp_Pdu_AlarmLowBuilderImpl( + int alarmDstEndpoint, + int alarmSrcEndpoint, + byte version, + byte errorType, + byte tAck, + byte windowSize, + int senSeqNum, + int ackSeqNum, + byte[] varPart) { + this.alarmDstEndpoint = alarmDstEndpoint; + this.alarmSrcEndpoint = alarmSrcEndpoint; + this.version = version; + this.errorType = errorType; + this.tAck = tAck; + this.windowSize = windowSize; + this.senSeqNum = senSeqNum; + this.ackSeqNum = ackSeqNum; + this.varPart = varPart; + } + + public PnDcp_Pdu_AlarmLow build(int frameIdValue) { + PnDcp_Pdu_AlarmLow pnDcp_Pdu_AlarmLow = + new PnDcp_Pdu_AlarmLow( + frameIdValue, + alarmDstEndpoint, + alarmSrcEndpoint, + version, + errorType, + tAck, + windowSize, + senSeqNum, + ackSeqNum, + varPart); + return pnDcp_Pdu_AlarmLow; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnDcp_Pdu_AlarmLow)) { + return false; + } + PnDcp_Pdu_AlarmLow that = (PnDcp_Pdu_AlarmLow) o; + return (getAlarmDstEndpoint() == that.getAlarmDstEndpoint()) + && (getAlarmSrcEndpoint() == that.getAlarmSrcEndpoint()) + && (getVersion() == that.getVersion()) + && (getErrorType() == that.getErrorType()) + && (getTAck() == that.getTAck()) + && (getWindowSize() == that.getWindowSize()) + && (getSenSeqNum() == that.getSenSeqNum()) + && (getAckSeqNum() == that.getAckSeqNum()) + && (getVarPart() == that.getVarPart()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getAlarmDstEndpoint(), + getAlarmSrcEndpoint(), + getVersion(), + getErrorType(), + getTAck(), + getWindowSize(), + getSenSeqNum(), + getAckSeqNum(), + getVarPart()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java index e34bdefa61f..6a768433f9e 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java @@ -49,6 +49,10 @@ public class PnDcp_Pdu_IdentifyReq extends PnDcp_Pdu implements Message { protected final int responseDelay; protected final List blocks; + // Reserved Fields + private Short reservedField0; + private Byte reservedField1; + public PnDcp_Pdu_IdentifyReq( int frameIdValue, long xid, int responseDelay, List blocks) { super(frameIdValue); @@ -91,13 +95,19 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeConstField("serviceId", SERVICEID, writeUnsignedShort(writeBuffer, 8)); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 5)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (short) 0x00, + writeUnsignedShort(writeBuffer, 5)); // Const Field (notSupported) writeConstField("notSupported", NOTSUPPORTED, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 1)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (byte) 0x00, + writeUnsignedByte(writeBuffer, 1)); // Const Field (response) writeConstField("response", RESPONSE, writeBoolean(writeBuffer)); @@ -200,23 +210,35 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer readBuffer.closeContext("PnDcp_Pdu_IdentifyReq"); // Create the instance - return new PnDcp_Pdu_IdentifyReqBuilderImpl(xid, responseDelay, blocks); + return new PnDcp_Pdu_IdentifyReqBuilderImpl( + xid, responseDelay, blocks, reservedField0, reservedField1); } public static class PnDcp_Pdu_IdentifyReqBuilderImpl implements PnDcp_Pdu.PnDcp_PduBuilder { private final long xid; private final int responseDelay; private final List blocks; - - public PnDcp_Pdu_IdentifyReqBuilderImpl(long xid, int responseDelay, List blocks) { + private final Short reservedField0; + private final Byte reservedField1; + + public PnDcp_Pdu_IdentifyReqBuilderImpl( + long xid, + int responseDelay, + List blocks, + Short reservedField0, + Byte reservedField1) { this.xid = xid; this.responseDelay = responseDelay; this.blocks = blocks; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; } public PnDcp_Pdu_IdentifyReq build(int frameIdValue) { PnDcp_Pdu_IdentifyReq pnDcp_Pdu_IdentifyReq = new PnDcp_Pdu_IdentifyReq(frameIdValue, xid, responseDelay, blocks); + pnDcp_Pdu_IdentifyReq.reservedField0 = reservedField0; + pnDcp_Pdu_IdentifyReq.reservedField1 = reservedField1; return pnDcp_Pdu_IdentifyReq; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java index 01403012984..9b9bb6d0920 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java @@ -48,6 +48,11 @@ public class PnDcp_Pdu_IdentifyRes extends PnDcp_Pdu implements Message { protected final long xid; protected final List blocks; + // Reserved Fields + private Short reservedField0; + private Byte reservedField1; + private Integer reservedField2; + public PnDcp_Pdu_IdentifyRes( int frameIdValue, boolean notSupported, long xid, List blocks) { super(frameIdValue); @@ -86,13 +91,19 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeConstField("serviceId", SERVICEID, writeUnsignedShort(writeBuffer, 8)); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 5)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (short) 0x00, + writeUnsignedShort(writeBuffer, 5)); // Simple Field (notSupported) writeSimpleField("notSupported", notSupported, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 1)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (byte) 0x00, + writeUnsignedByte(writeBuffer, 1)); // Const Field (response) writeConstField("response", RESPONSE, writeBoolean(writeBuffer)); @@ -101,7 +112,10 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeSimpleField("xid", xid, writeUnsignedLong(writeBuffer, 32)); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); + writeReservedField( + "reserved", + reservedField2 != null ? reservedField2 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16)); // Implicit Field (dcpDataLength) (Used for parsing, but its value is not stored as it's // implicitly given by the objects content) @@ -195,24 +209,39 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer readBuffer.closeContext("PnDcp_Pdu_IdentifyRes"); // Create the instance - return new PnDcp_Pdu_IdentifyResBuilderImpl(notSupported, xid, blocks); + return new PnDcp_Pdu_IdentifyResBuilderImpl( + notSupported, xid, blocks, reservedField0, reservedField1, reservedField2); } public static class PnDcp_Pdu_IdentifyResBuilderImpl implements PnDcp_Pdu.PnDcp_PduBuilder { private final boolean notSupported; private final long xid; private final List blocks; + private final Short reservedField0; + private final Byte reservedField1; + private final Integer reservedField2; public PnDcp_Pdu_IdentifyResBuilderImpl( - boolean notSupported, long xid, List blocks) { + boolean notSupported, + long xid, + List blocks, + Short reservedField0, + Byte reservedField1, + Integer reservedField2) { this.notSupported = notSupported; this.xid = xid; this.blocks = blocks; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + this.reservedField2 = reservedField2; } public PnDcp_Pdu_IdentifyRes build(int frameIdValue) { PnDcp_Pdu_IdentifyRes pnDcp_Pdu_IdentifyRes = new PnDcp_Pdu_IdentifyRes(frameIdValue, notSupported, xid, blocks); + pnDcp_Pdu_IdentifyRes.reservedField0 = reservedField0; + pnDcp_Pdu_IdentifyRes.reservedField1 = reservedField1; + pnDcp_Pdu_IdentifyRes.reservedField2 = reservedField2; return pnDcp_Pdu_IdentifyRes; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java index 0ec5aab298f..1acea8a6386 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java @@ -40,6 +40,7 @@ public class PnDcp_Pdu_RealTimeCyclic extends PnDcp_Pdu implements Message { // Accessors for discriminator values. // Properties. + protected final PnIo_CyclicServiceDataUnit dataUnit; protected final int cycleCounter; protected final boolean ignore; protected final boolean stationProblemIndicatorOk; @@ -48,8 +49,14 @@ public class PnDcp_Pdu_RealTimeCyclic extends PnDcp_Pdu implements Message { protected final boolean redundancy; protected final boolean statePrimary; + // Reserved Fields + private Boolean reservedField0; + private Boolean reservedField1; + private Short reservedField2; + public PnDcp_Pdu_RealTimeCyclic( int frameIdValue, + PnIo_CyclicServiceDataUnit dataUnit, int cycleCounter, boolean ignore, boolean stationProblemIndicatorOk, @@ -58,6 +65,7 @@ public PnDcp_Pdu_RealTimeCyclic( boolean redundancy, boolean statePrimary) { super(frameIdValue); + this.dataUnit = dataUnit; this.cycleCounter = cycleCounter; this.ignore = ignore; this.stationProblemIndicatorOk = stationProblemIndicatorOk; @@ -67,6 +75,10 @@ public PnDcp_Pdu_RealTimeCyclic( this.statePrimary = statePrimary; } + public PnIo_CyclicServiceDataUnit getDataUnit() { + return dataUnit; + } + public int getCycleCounter() { return cycleCounter; } @@ -101,6 +113,14 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa int startPos = positionAware.getPos(); writeBuffer.pushContext("PnDcp_Pdu_RealTimeCyclic"); + // Manual Field (dataUnit) + writeManualField( + "dataUnit", + () -> + org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.writeDataUnit( + writeBuffer, dataUnit), + writeBuffer); + // Simple Field (cycleCounter) writeSimpleField("cycleCounter", cycleCounter, writeUnsignedInt(writeBuffer, 16)); @@ -108,7 +128,10 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeSimpleField("ignore", ignore, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (boolean) false, writeBoolean(writeBuffer)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (boolean) false, + writeBoolean(writeBuffer)); // Simple Field (stationProblemIndicatorOk) writeSimpleField( @@ -118,7 +141,10 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeSimpleField("providerStateRun", providerStateRun, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (boolean) false, writeBoolean(writeBuffer)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (boolean) false, + writeBoolean(writeBuffer)); // Simple Field (dataValid) writeSimpleField("dataValid", dataValid, writeBoolean(writeBuffer)); @@ -130,7 +156,10 @@ protected void serializePnDcp_PduChild(WriteBuffer writeBuffer) throws Serializa writeSimpleField("statePrimary", statePrimary, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); + writeReservedField( + "reserved", + reservedField2 != null ? reservedField2 : (short) 0x00, + writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("PnDcp_Pdu_RealTimeCyclic"); } @@ -145,6 +174,9 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnDcp_Pdu_RealTimeCyclic _value = this; + // Manual Field (dataUnit) + lengthInBits += ((dataUnit.getLengthInBytes())) * (8); + // Simple field (cycleCounter) lengthInBits += 16; @@ -185,6 +217,15 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer int startPos = positionAware.getPos(); int curPos; + PnIo_CyclicServiceDataUnit dataUnit = + readManualField( + "dataUnit", + readBuffer, + () -> + (PnIo_CyclicServiceDataUnit) + (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.readDataUnit( + readBuffer))); + int cycleCounter = readSimpleField("cycleCounter", readUnsignedInt(readBuffer, 16)); boolean ignore = readSimpleField("ignore", readBoolean(readBuffer)); @@ -212,16 +253,21 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer readBuffer.closeContext("PnDcp_Pdu_RealTimeCyclic"); // Create the instance return new PnDcp_Pdu_RealTimeCyclicBuilderImpl( + dataUnit, cycleCounter, ignore, stationProblemIndicatorOk, providerStateRun, dataValid, redundancy, - statePrimary); + statePrimary, + reservedField0, + reservedField1, + reservedField2); } public static class PnDcp_Pdu_RealTimeCyclicBuilderImpl implements PnDcp_Pdu.PnDcp_PduBuilder { + private final PnIo_CyclicServiceDataUnit dataUnit; private final int cycleCounter; private final boolean ignore; private final boolean stationProblemIndicatorOk; @@ -229,15 +275,23 @@ public static class PnDcp_Pdu_RealTimeCyclicBuilderImpl implements PnDcp_Pdu.PnD private final boolean dataValid; private final boolean redundancy; private final boolean statePrimary; + private final Boolean reservedField0; + private final Boolean reservedField1; + private final Short reservedField2; public PnDcp_Pdu_RealTimeCyclicBuilderImpl( + PnIo_CyclicServiceDataUnit dataUnit, int cycleCounter, boolean ignore, boolean stationProblemIndicatorOk, boolean providerStateRun, boolean dataValid, boolean redundancy, - boolean statePrimary) { + boolean statePrimary, + Boolean reservedField0, + Boolean reservedField1, + Short reservedField2) { + this.dataUnit = dataUnit; this.cycleCounter = cycleCounter; this.ignore = ignore; this.stationProblemIndicatorOk = stationProblemIndicatorOk; @@ -245,12 +299,16 @@ public PnDcp_Pdu_RealTimeCyclicBuilderImpl( this.dataValid = dataValid; this.redundancy = redundancy; this.statePrimary = statePrimary; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + this.reservedField2 = reservedField2; } public PnDcp_Pdu_RealTimeCyclic build(int frameIdValue) { PnDcp_Pdu_RealTimeCyclic pnDcp_Pdu_RealTimeCyclic = new PnDcp_Pdu_RealTimeCyclic( frameIdValue, + dataUnit, cycleCounter, ignore, stationProblemIndicatorOk, @@ -258,6 +316,9 @@ public PnDcp_Pdu_RealTimeCyclic build(int frameIdValue) { dataValid, redundancy, statePrimary); + pnDcp_Pdu_RealTimeCyclic.reservedField0 = reservedField0; + pnDcp_Pdu_RealTimeCyclic.reservedField1 = reservedField1; + pnDcp_Pdu_RealTimeCyclic.reservedField2 = reservedField2; return pnDcp_Pdu_RealTimeCyclic; } } @@ -271,7 +332,8 @@ public boolean equals(Object o) { return false; } PnDcp_Pdu_RealTimeCyclic that = (PnDcp_Pdu_RealTimeCyclic) o; - return (getCycleCounter() == that.getCycleCounter()) + return (getDataUnit() == that.getDataUnit()) + && (getCycleCounter() == that.getCycleCounter()) && (getIgnore() == that.getIgnore()) && (getStationProblemIndicatorOk() == that.getStationProblemIndicatorOk()) && (getProviderStateRun() == that.getProviderStateRun()) @@ -286,6 +348,7 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash( super.hashCode(), + getDataUnit(), getCycleCounter(), getIgnore(), getStationProblemIndicatorOk(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java index 1e2ed0e04dd..407b36eb6af 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java @@ -41,6 +41,10 @@ public class PnDcp_ServiceType implements Message { protected final boolean notSupported; protected final boolean response; + // Reserved Fields + private Short reservedField0; + private Byte reservedField1; + public PnDcp_ServiceType(boolean notSupported, boolean response) { super(); this.notSupported = notSupported; @@ -61,13 +65,19 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeBuffer.pushContext("PnDcp_ServiceType"); // Reserved Field (reserved) - writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 5)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (short) 0x00, + writeUnsignedShort(writeBuffer, 5)); // Simple Field (notSupported) writeSimpleField("notSupported", notSupported, writeBoolean(writeBuffer)); // Reserved Field (reserved) - writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 1)); + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (byte) 0x00, + writeUnsignedByte(writeBuffer, 1)); // Simple Field (response) writeSimpleField("response", response, writeBoolean(writeBuffer)); @@ -126,6 +136,8 @@ public static PnDcp_ServiceType staticParse(ReadBuffer readBuffer) throws ParseE // Create the instance PnDcp_ServiceType _pnDcp_ServiceType; _pnDcp_ServiceType = new PnDcp_ServiceType(notSupported, response); + _pnDcp_ServiceType.reservedField0 = reservedField0; + _pnDcp_ServiceType.reservedField1 = reservedField1; return _pnDcp_ServiceType; } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java new file mode 100644 index 00000000000..692db0f4053 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Request.java @@ -0,0 +1,372 @@ +/* + * 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.profinet.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 PnIoCM_Block_Request extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOX_BLOCK_REQ; + } + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final Uuid arUuid; + protected final int sessionKey; + protected final int controlCommand; + protected final int controlBlockProperties; + + // Reserved Fields + private Integer reservedField0; + private Integer reservedField1; + + public PnIoCM_Block_Request( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + int controlBlockProperties) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.controlBlockProperties = controlBlockProperties; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public Uuid getArUuid() { + return arUuid; + } + + public int getSessionKey() { + return sessionKey; + } + + public int getControlCommand() { + return controlCommand; + } + + public int getControlBlockProperties() { + return controlBlockProperties; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCM_Block_Request"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sessionKey) + writeSimpleField( + "sessionKey", + sessionKey, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlCommand) + writeSimpleField( + "controlCommand", + controlCommand, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlBlockProperties) + writeSimpleField( + "controlBlockProperties", + controlBlockProperties, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PnIoCM_Block_Request"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCM_Block_Request _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (sessionKey) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (controlCommand) + lengthInBits += 16; + + // Simple field (controlBlockProperties) + lengthInBits += 16; + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCM_Block_Request"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField0 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sessionKey = + readSimpleField( + "sessionKey", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField1 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlCommand = + readSimpleField( + "controlCommand", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlBlockProperties = + readSimpleField( + "controlBlockProperties", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PnIoCM_Block_Request"); + // Create the instance + return new PnIoCM_Block_RequestBuilderImpl( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + controlBlockProperties, + reservedField0, + reservedField1); + } + + public static class PnIoCM_Block_RequestBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final Uuid arUuid; + private final int sessionKey; + private final int controlCommand; + private final int controlBlockProperties; + private final Integer reservedField0; + private final Integer reservedField1; + + public PnIoCM_Block_RequestBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + int controlBlockProperties, + Integer reservedField0, + Integer reservedField1) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.controlBlockProperties = controlBlockProperties; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + } + + public PnIoCM_Block_Request build() { + PnIoCM_Block_Request pnIoCM_Block_Request = + new PnIoCM_Block_Request( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + controlBlockProperties); + pnIoCM_Block_Request.reservedField0 = reservedField0; + pnIoCM_Block_Request.reservedField1 = reservedField1; + return pnIoCM_Block_Request; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCM_Block_Request)) { + return false; + } + PnIoCM_Block_Request that = (PnIoCM_Block_Request) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArUuid() == that.getArUuid()) + && (getSessionKey() == that.getSessionKey()) + && (getControlCommand() == that.getControlCommand()) + && (getControlBlockProperties() == that.getControlBlockProperties()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getArUuid(), + getSessionKey(), + getControlCommand(), + getControlBlockProperties()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java new file mode 100644 index 00000000000..0c9002526a0 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCM_Block_Response.java @@ -0,0 +1,372 @@ +/* + * 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.profinet.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 PnIoCM_Block_Response extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOX_BLOCK_RES; + } + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final Uuid arUuid; + protected final int sessionKey; + protected final int controlCommand; + protected final int controlBlockProperties; + + // Reserved Fields + private Integer reservedField0; + private Integer reservedField1; + + public PnIoCM_Block_Response( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + int controlBlockProperties) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.controlBlockProperties = controlBlockProperties; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public Uuid getArUuid() { + return arUuid; + } + + public int getSessionKey() { + return sessionKey; + } + + public int getControlCommand() { + return controlCommand; + } + + public int getControlBlockProperties() { + return controlBlockProperties; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCM_Block_Response"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sessionKey) + writeSimpleField( + "sessionKey", + sessionKey, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlCommand) + writeSimpleField( + "controlCommand", + controlCommand, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlBlockProperties) + writeSimpleField( + "controlBlockProperties", + controlBlockProperties, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PnIoCM_Block_Response"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCM_Block_Response _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (sessionKey) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (controlCommand) + lengthInBits += 16; + + // Simple field (controlBlockProperties) + lengthInBits += 16; + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCM_Block_Response"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField0 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sessionKey = + readSimpleField( + "sessionKey", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField1 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlCommand = + readSimpleField( + "controlCommand", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlBlockProperties = + readSimpleField( + "controlBlockProperties", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PnIoCM_Block_Response"); + // Create the instance + return new PnIoCM_Block_ResponseBuilderImpl( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + controlBlockProperties, + reservedField0, + reservedField1); + } + + public static class PnIoCM_Block_ResponseBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final Uuid arUuid; + private final int sessionKey; + private final int controlCommand; + private final int controlBlockProperties; + private final Integer reservedField0; + private final Integer reservedField1; + + public PnIoCM_Block_ResponseBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + int controlBlockProperties, + Integer reservedField0, + Integer reservedField1) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.controlBlockProperties = controlBlockProperties; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + } + + public PnIoCM_Block_Response build() { + PnIoCM_Block_Response pnIoCM_Block_Response = + new PnIoCM_Block_Response( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + controlBlockProperties); + pnIoCM_Block_Response.reservedField0 = reservedField0; + pnIoCM_Block_Response.reservedField1 = reservedField1; + return pnIoCM_Block_Response; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCM_Block_Response)) { + return false; + } + PnIoCM_Block_Response that = (PnIoCM_Block_Response) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArUuid() == that.getArUuid()) + && (getSessionKey() == that.getSessionKey()) + && (getControlCommand() == that.getControlCommand()) + && (getControlBlockProperties() == that.getControlBlockProperties()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getArUuid(), + getSessionKey(), + getControlCommand(), + getControlBlockProperties()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block.java index d7ce207b17f..5365b21c424 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block.java @@ -40,22 +40,8 @@ public abstract class PnIoCm_Block implements Message { // Abstract accessors for discriminator values. public abstract PnIoCm_BlockType getBlockType(); - // Properties. - protected final short blockVersionHigh; - protected final short blockVersionLow; - - public PnIoCm_Block(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block() { super(); - this.blockVersionHigh = blockVersionHigh; - this.blockVersionLow = blockVersionLow; - } - - public short getBlockVersionHigh() { - return blockVersionHigh; - } - - public short getBlockVersionLow() { - return blockVersionLow; } protected abstract void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) @@ -75,29 +61,6 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { PnIoCm_BlockType::getValue, PnIoCm_BlockType::name, writeUnsignedInt(writeBuffer, 16)), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's - // implicitly given by the objects content) - int blockLength = (int) ((getLengthInBytes()) - (4)); - writeImplicitField( - "blockLength", - blockLength, - writeUnsignedInt(writeBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - // Simple Field (blockVersionHigh) - writeSimpleField( - "blockVersionHigh", - blockVersionHigh, - writeUnsignedShort(writeBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - // Simple Field (blockVersionLow) - writeSimpleField( - "blockVersionLow", - blockVersionLow, - writeUnsignedShort(writeBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - // Switch field (Serialize the sub-type) serializePnIoCm_BlockChild(writeBuffer); @@ -117,15 +80,6 @@ public int getLengthInBits() { // Discriminator Field (blockType) lengthInBits += 16; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Length of sub-type elements will be added by sub-type... return lengthInBits; @@ -150,30 +104,30 @@ public static PnIoCm_Block staticParse(ReadBuffer readBuffer) throws ParseExcept PnIoCm_BlockType::enumForValue, readUnsignedInt(readBuffer, 16)), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) PnIoCm_BlockBuilder builder = null; - if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.AR_BLOCK_REQ)) { + if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOD_WRITE_REQUEST_HEADER)) { + builder = IODWriteRequestHeader.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOD_WRITE_RESPONSE_HEADER)) { + builder = IODWriteResponseHeader.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.PD_INTERFACE_ADJUST)) { + builder = PDInterfaceAdjust.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.PD_PORT_DATA_CHECK)) { + builder = PDPortDataCheck.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.CHECK_PEERS)) { + builder = CheckPeers.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.AR_BLOCK_REQ)) { builder = PnIoCm_Block_ArReq.staticParsePnIoCm_BlockBuilder(readBuffer); } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.AR_BLOCK_RES)) { builder = PnIoCm_Block_ArRes.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOD_CONTROL_REQ)) { + builder = PnIoCm_Control_Request.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOX_BLOCK_REQ)) { + builder = PnIoCM_Block_Request.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOX_BLOCK_RES)) { + builder = PnIoCM_Block_Response.staticParsePnIoCm_BlockBuilder(readBuffer); + } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IOD_CONTROL_RES)) { + builder = PnIoCm_Control_Response.staticParsePnIoCm_BlockBuilder(readBuffer); } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IO_CR_BLOCK_REQ)) { builder = PnIoCm_Block_IoCrReq.staticParsePnIoCm_BlockBuilder(readBuffer); } else if (EvaluationHelper.equals(blockType, PnIoCm_BlockType.IO_CR_BLOCK_RES)) { @@ -200,12 +154,12 @@ public static PnIoCm_Block staticParse(ReadBuffer readBuffer) throws ParseExcept readBuffer.closeContext("PnIoCm_Block"); // Create the instance - PnIoCm_Block _pnIoCm_Block = builder.build(blockVersionHigh, blockVersionLow); + PnIoCm_Block _pnIoCm_Block = builder.build(); return _pnIoCm_Block; } public interface PnIoCm_BlockBuilder { - PnIoCm_Block build(short blockVersionHigh, short blockVersionLow); + PnIoCm_Block build(); } @Override @@ -217,14 +171,12 @@ public boolean equals(Object o) { return false; } PnIoCm_Block that = (PnIoCm_Block) o; - return (getBlockVersionHigh() == that.getBlockVersionHigh()) - && (getBlockVersionLow() == that.getBlockVersionLow()) - && true; + return true; } @Override public int hashCode() { - return Objects.hash(getBlockVersionHigh(), getBlockVersionLow()); + return Objects.hash(); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_BlockType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_BlockType.java index b97c8aa8e82..3a212a1d04e 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_BlockType.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_BlockType.java @@ -24,15 +24,24 @@ // Code generated by code-generation. DO NOT EDIT. public enum PnIoCm_BlockType { + IOD_WRITE_REQUEST_HEADER((int) 0x0008), AR_BLOCK_REQ((int) 0x0101), - AR_BLOCK_RES((int) 0x8101), IO_CR_BLOCK_REQ((int) 0x0102), - IO_CR_BLOCK_RES((int) 0x8102), ALARM_CR_BLOCK_REQ((int) 0x0103), - ALARM_CR_BLOCK_RES((int) 0x8103), EXPECTED_SUBMODULE_BLOCK_REQ((int) 0x0104), + IOD_CONTROL_REQ((int) 0x0110), + IOX_BLOCK_REQ((int) 0x0112), + PD_PORT_DATA_CHECK((int) 0x0200), + CHECK_PEERS((int) 0x020a), + PD_INTERFACE_ADJUST((int) 0x0250), + IOD_WRITE_RESPONSE_HEADER((int) 0x8008), + AR_BLOCK_RES((int) 0x8101), + IO_CR_BLOCK_RES((int) 0x8102), + ALARM_CR_BLOCK_RES((int) 0x8103), MODULE_DIFF_BLOCK((int) 0x8104), - AR_SERVER_BLOCK((int) 0x8106); + AR_SERVER_BLOCK((int) 0x8106), + IOD_CONTROL_RES((int) 0x8110), + IOX_BLOCK_RES((int) 0x8112); private static final Map map; static { diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java index 8e51c786f2a..410da9f80ae 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java @@ -43,6 +43,8 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_AlarmCrType alarmType; protected final int lt; protected final boolean transport; @@ -54,6 +56,9 @@ public PnIoCm_BlockType getBlockType() { protected final int alarmCtrTagHeaderHigh; protected final int alarmCtrTagHeaderLow; + // Reserved Fields + private Long reservedField0; + public PnIoCm_Block_AlarmCrReq( short blockVersionHigh, short blockVersionLow, @@ -67,7 +72,9 @@ public PnIoCm_Block_AlarmCrReq( int maxAlarmDataLength, int alarmCtrTagHeaderHigh, int alarmCtrTagHeaderLow) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.alarmType = alarmType; this.lt = lt; this.transport = transport; @@ -80,6 +87,14 @@ public PnIoCm_Block_AlarmCrReq( this.alarmCtrTagHeaderLow = alarmCtrTagHeaderLow; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_AlarmCrType getAlarmType() { return alarmType; } @@ -126,6 +141,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_AlarmCrReq"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (alarmType) writeSimpleEnumField( "alarmType", @@ -147,7 +185,7 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial // Reserved Field (reserved) writeReservedField( "reserved", - (long) 0x00000000, + reservedField0 != null ? reservedField0 : (long) 0x00000000, writeUnsignedLong(writeBuffer, 30), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -220,6 +258,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_AlarmCrReq _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (alarmType) lengthInBits += 16; @@ -263,6 +310,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_AlarmCrType alarmType = readEnumField( "alarmType", @@ -329,6 +394,8 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_AlarmCrReq"); // Create the instance return new PnIoCm_Block_AlarmCrReqBuilderImpl( + blockVersionHigh, + blockVersionLow, alarmType, lt, transport, @@ -338,11 +405,14 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read localAlarmReference, maxAlarmDataLength, alarmCtrTagHeaderHigh, - alarmCtrTagHeaderLow); + alarmCtrTagHeaderLow, + reservedField0); } public static class PnIoCm_Block_AlarmCrReqBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_AlarmCrType alarmType; private final int lt; private final boolean transport; @@ -353,8 +423,11 @@ public static class PnIoCm_Block_AlarmCrReqBuilderImpl private final int maxAlarmDataLength; private final int alarmCtrTagHeaderHigh; private final int alarmCtrTagHeaderLow; + private final Long reservedField0; public PnIoCm_Block_AlarmCrReqBuilderImpl( + short blockVersionHigh, + short blockVersionLow, PnIoCm_AlarmCrType alarmType, int lt, boolean transport, @@ -364,7 +437,10 @@ public PnIoCm_Block_AlarmCrReqBuilderImpl( int localAlarmReference, int maxAlarmDataLength, int alarmCtrTagHeaderHigh, - int alarmCtrTagHeaderLow) { + int alarmCtrTagHeaderLow, + Long reservedField0) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.alarmType = alarmType; this.lt = lt; this.transport = transport; @@ -375,9 +451,10 @@ public PnIoCm_Block_AlarmCrReqBuilderImpl( this.maxAlarmDataLength = maxAlarmDataLength; this.alarmCtrTagHeaderHigh = alarmCtrTagHeaderHigh; this.alarmCtrTagHeaderLow = alarmCtrTagHeaderLow; + this.reservedField0 = reservedField0; } - public PnIoCm_Block_AlarmCrReq build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_AlarmCrReq build() { PnIoCm_Block_AlarmCrReq pnIoCm_Block_AlarmCrReq = new PnIoCm_Block_AlarmCrReq( blockVersionHigh, @@ -392,6 +469,7 @@ public PnIoCm_Block_AlarmCrReq build(short blockVersionHigh, short blockVersionL maxAlarmDataLength, alarmCtrTagHeaderHigh, alarmCtrTagHeaderLow); + pnIoCm_Block_AlarmCrReq.reservedField0 = reservedField0; return pnIoCm_Block_AlarmCrReq; } } @@ -405,7 +483,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_AlarmCrReq that = (PnIoCm_Block_AlarmCrReq) o; - return (getAlarmType() == that.getAlarmType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getAlarmType() == that.getAlarmType()) && (getLt() == that.getLt()) && (getTransport() == that.getTransport()) && (getPriority() == that.getPriority()) @@ -423,6 +503,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash( super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), getAlarmType(), getLt(), getTransport(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java index 81fb40fae93..9cdf91aaebd 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java @@ -43,6 +43,8 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_AlarmCrType alarmType; protected final int localAlarmReference; protected final int maxAlarmDataLength; @@ -53,12 +55,22 @@ public PnIoCm_Block_AlarmCrRes( PnIoCm_AlarmCrType alarmType, int localAlarmReference, int maxAlarmDataLength) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.alarmType = alarmType; this.localAlarmReference = localAlarmReference; this.maxAlarmDataLength = maxAlarmDataLength; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_AlarmCrType getAlarmType() { return alarmType; } @@ -77,6 +89,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_AlarmCrRes"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (alarmType) writeSimpleEnumField( "alarmType", @@ -115,6 +150,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_AlarmCrRes _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (alarmType) lengthInBits += 16; @@ -134,6 +178,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_AlarmCrType alarmType = readEnumField( "alarmType", @@ -157,23 +219,31 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_AlarmCrRes"); // Create the instance return new PnIoCm_Block_AlarmCrResBuilderImpl( - alarmType, localAlarmReference, maxAlarmDataLength); + blockVersionHigh, blockVersionLow, alarmType, localAlarmReference, maxAlarmDataLength); } public static class PnIoCm_Block_AlarmCrResBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_AlarmCrType alarmType; private final int localAlarmReference; private final int maxAlarmDataLength; public PnIoCm_Block_AlarmCrResBuilderImpl( - PnIoCm_AlarmCrType alarmType, int localAlarmReference, int maxAlarmDataLength) { + short blockVersionHigh, + short blockVersionLow, + PnIoCm_AlarmCrType alarmType, + int localAlarmReference, + int maxAlarmDataLength) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.alarmType = alarmType; this.localAlarmReference = localAlarmReference; this.maxAlarmDataLength = maxAlarmDataLength; } - public PnIoCm_Block_AlarmCrRes build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_AlarmCrRes build() { PnIoCm_Block_AlarmCrRes pnIoCm_Block_AlarmCrRes = new PnIoCm_Block_AlarmCrRes( blockVersionHigh, @@ -194,7 +264,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_AlarmCrRes that = (PnIoCm_Block_AlarmCrRes) o; - return (getAlarmType() == that.getAlarmType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getAlarmType() == that.getAlarmType()) && (getLocalAlarmReference() == that.getLocalAlarmReference()) && (getMaxAlarmDataLength() == that.getMaxAlarmDataLength()) && super.equals(that) @@ -204,7 +276,12 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash( - super.hashCode(), getAlarmType(), getLocalAlarmReference(), getMaxAlarmDataLength()); + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getAlarmType(), + getLocalAlarmReference(), + getMaxAlarmDataLength()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java index 6645ffc5bdd..c23cc115ba4 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java @@ -43,11 +43,13 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_ArType arType; protected final Uuid arUuid; protected final int sessionKey; protected final MacAddress cmInitiatorMacAddr; - protected final Uuid cmInitiatorObjectUuid; + protected final DceRpc_ObjectUuid cmInitiatorObjectUuid; protected final boolean pullModuleAlarmAllowed; protected final boolean nonLegacyStartupMode; protected final boolean combinedObjectContainerUsed; @@ -61,6 +63,10 @@ public PnIoCm_BlockType getBlockType() { protected final int cmInitiatorUdpRtPort; protected final String cmInitiatorStationName; + // Reserved Fields + private Long reservedField0; + private Byte reservedField1; + public PnIoCm_Block_ArReq( short blockVersionHigh, short blockVersionLow, @@ -68,7 +74,7 @@ public PnIoCm_Block_ArReq( Uuid arUuid, int sessionKey, MacAddress cmInitiatorMacAddr, - Uuid cmInitiatorObjectUuid, + DceRpc_ObjectUuid cmInitiatorObjectUuid, boolean pullModuleAlarmAllowed, boolean nonLegacyStartupMode, boolean combinedObjectContainerUsed, @@ -81,7 +87,9 @@ public PnIoCm_Block_ArReq( int cmInitiatorActivityTimeoutFactor, int cmInitiatorUdpRtPort, String cmInitiatorStationName) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.arType = arType; this.arUuid = arUuid; this.sessionKey = sessionKey; @@ -101,6 +109,14 @@ public PnIoCm_Block_ArReq( this.cmInitiatorStationName = cmInitiatorStationName; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_ArType getArType() { return arType; } @@ -117,7 +133,7 @@ public MacAddress getCmInitiatorMacAddr() { return cmInitiatorMacAddr; } - public Uuid getCmInitiatorObjectUuid() { + public DceRpc_ObjectUuid getCmInitiatorObjectUuid() { return cmInitiatorObjectUuid; } @@ -175,6 +191,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_ArReq"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (arType) writeSimpleEnumField( "arType", @@ -236,7 +275,7 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial // Reserved Field (reserved) writeReservedField( "reserved", - (long) 0x00000, + reservedField0 != null ? reservedField0 : (long) 0x00000, writeUnsignedLong(writeBuffer, 17), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -268,7 +307,7 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial // Reserved Field (reserved) writeReservedField( "reserved", - (byte) 0x0, + reservedField1 != null ? reservedField1 : (byte) 0x0, writeUnsignedByte(writeBuffer, 3), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -338,6 +377,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_ArReq _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (arType) lengthInBits += 16; @@ -408,6 +456,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_ArType arType = readEnumField( "arType", @@ -434,10 +500,11 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - Uuid cmInitiatorObjectUuid = + DceRpc_ObjectUuid cmInitiatorObjectUuid = readSimpleField( "cmInitiatorObjectUuid", - new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + new DataReaderComplexDefault<>( + () -> DceRpc_ObjectUuid.staticParse(readBuffer), readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); boolean pullModuleAlarmAllowed = @@ -537,6 +604,8 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_ArReq"); // Create the instance return new PnIoCm_Block_ArReqBuilderImpl( + blockVersionHigh, + blockVersionLow, arType, arUuid, sessionKey, @@ -553,15 +622,19 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read state, cmInitiatorActivityTimeoutFactor, cmInitiatorUdpRtPort, - cmInitiatorStationName); + cmInitiatorStationName, + reservedField0, + reservedField1); } public static class PnIoCm_Block_ArReqBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_ArType arType; private final Uuid arUuid; private final int sessionKey; private final MacAddress cmInitiatorMacAddr; - private final Uuid cmInitiatorObjectUuid; + private final DceRpc_ObjectUuid cmInitiatorObjectUuid; private final boolean pullModuleAlarmAllowed; private final boolean nonLegacyStartupMode; private final boolean combinedObjectContainerUsed; @@ -574,13 +647,17 @@ public static class PnIoCm_Block_ArReqBuilderImpl implements PnIoCm_Block.PnIoCm private final int cmInitiatorActivityTimeoutFactor; private final int cmInitiatorUdpRtPort; private final String cmInitiatorStationName; + private final Long reservedField0; + private final Byte reservedField1; public PnIoCm_Block_ArReqBuilderImpl( + short blockVersionHigh, + short blockVersionLow, PnIoCm_ArType arType, Uuid arUuid, int sessionKey, MacAddress cmInitiatorMacAddr, - Uuid cmInitiatorObjectUuid, + DceRpc_ObjectUuid cmInitiatorObjectUuid, boolean pullModuleAlarmAllowed, boolean nonLegacyStartupMode, boolean combinedObjectContainerUsed, @@ -592,7 +669,11 @@ public PnIoCm_Block_ArReqBuilderImpl( PnIoCm_State state, int cmInitiatorActivityTimeoutFactor, int cmInitiatorUdpRtPort, - String cmInitiatorStationName) { + String cmInitiatorStationName, + Long reservedField0, + Byte reservedField1) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.arType = arType; this.arUuid = arUuid; this.sessionKey = sessionKey; @@ -610,9 +691,11 @@ public PnIoCm_Block_ArReqBuilderImpl( this.cmInitiatorActivityTimeoutFactor = cmInitiatorActivityTimeoutFactor; this.cmInitiatorUdpRtPort = cmInitiatorUdpRtPort; this.cmInitiatorStationName = cmInitiatorStationName; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; } - public PnIoCm_Block_ArReq build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_ArReq build() { PnIoCm_Block_ArReq pnIoCm_Block_ArReq = new PnIoCm_Block_ArReq( blockVersionHigh, @@ -634,6 +717,8 @@ public PnIoCm_Block_ArReq build(short blockVersionHigh, short blockVersionLow) { cmInitiatorActivityTimeoutFactor, cmInitiatorUdpRtPort, cmInitiatorStationName); + pnIoCm_Block_ArReq.reservedField0 = reservedField0; + pnIoCm_Block_ArReq.reservedField1 = reservedField1; return pnIoCm_Block_ArReq; } } @@ -647,7 +732,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_ArReq that = (PnIoCm_Block_ArReq) o; - return (getArType() == that.getArType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArType() == that.getArType()) && (getArUuid() == that.getArUuid()) && (getSessionKey() == that.getSessionKey()) && (getCmInitiatorMacAddr() == that.getCmInitiatorMacAddr()) @@ -672,6 +759,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash( super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), getArType(), getArUuid(), getSessionKey(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java index 91661b2bf5f..a2dd45cf1bc 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java @@ -43,6 +43,8 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_ArType arType; protected final Uuid arUuid; protected final int sessionKey; @@ -57,7 +59,9 @@ public PnIoCm_Block_ArRes( int sessionKey, MacAddress cmResponderMacAddr, int responderUDPRTPort) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.arType = arType; this.arUuid = arUuid; this.sessionKey = sessionKey; @@ -65,6 +69,14 @@ public PnIoCm_Block_ArRes( this.responderUDPRTPort = responderUDPRTPort; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_ArType getArType() { return arType; } @@ -91,6 +103,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_ArRes"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (arType) writeSimpleEnumField( "arType", @@ -141,6 +176,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_ArRes _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (arType) lengthInBits += 16; @@ -166,6 +210,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_ArType arType = readEnumField( "arType", @@ -201,10 +263,18 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_ArRes"); // Create the instance return new PnIoCm_Block_ArResBuilderImpl( - arType, arUuid, sessionKey, cmResponderMacAddr, responderUDPRTPort); + blockVersionHigh, + blockVersionLow, + arType, + arUuid, + sessionKey, + cmResponderMacAddr, + responderUDPRTPort); } public static class PnIoCm_Block_ArResBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_ArType arType; private final Uuid arUuid; private final int sessionKey; @@ -212,11 +282,15 @@ public static class PnIoCm_Block_ArResBuilderImpl implements PnIoCm_Block.PnIoCm private final int responderUDPRTPort; public PnIoCm_Block_ArResBuilderImpl( + short blockVersionHigh, + short blockVersionLow, PnIoCm_ArType arType, Uuid arUuid, int sessionKey, MacAddress cmResponderMacAddr, int responderUDPRTPort) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.arType = arType; this.arUuid = arUuid; this.sessionKey = sessionKey; @@ -224,7 +298,7 @@ public PnIoCm_Block_ArResBuilderImpl( this.responderUDPRTPort = responderUDPRTPort; } - public PnIoCm_Block_ArRes build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_ArRes build() { PnIoCm_Block_ArRes pnIoCm_Block_ArRes = new PnIoCm_Block_ArRes( blockVersionHigh, @@ -247,7 +321,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_ArRes that = (PnIoCm_Block_ArRes) o; - return (getArType() == that.getArType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArType() == that.getArType()) && (getArUuid() == that.getArUuid()) && (getSessionKey() == that.getSessionKey()) && (getCmResponderMacAddr() == that.getCmResponderMacAddr()) @@ -260,6 +336,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash( super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), getArType(), getArUuid(), getSessionKey(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java index 654d09487d2..060a4aa8897 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java @@ -42,8 +42,29 @@ public PnIoCm_BlockType getBlockType() { return PnIoCm_BlockType.AR_SERVER_BLOCK; } - public PnIoCm_Block_ArServer(short blockVersionHigh, short blockVersionLow) { - super(blockVersionHigh, blockVersionLow); + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final PascalString stationName; + + public PnIoCm_Block_ArServer( + short blockVersionHigh, short blockVersionLow, PascalString stationName) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.stationName = stationName; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public PascalString getStationName() { + return stationName; } @Override @@ -52,6 +73,44 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_ArServer"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (stationName) + writeSimpleField( + "stationName", + stationName, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Padding Field (padding) + writePaddingField( + "padding", + (int) (((20) - (6)) - ((stationName.getStringLength()))), + (short) 0x00, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + writeBuffer.popContext("PnIoCm_Block_ArServer"); } @@ -65,6 +124,24 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_ArServer _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Simple field (stationName) + lengthInBits += stationName.getLengthInBits(); + + // Padding Field (padding) + int _timesPadding = (int) (((20) - (6)) - ((stationName.getStringLength()))); + while (_timesPadding-- > 0) { + lengthInBits += 8; + } + return lengthInBits; } @@ -75,18 +152,55 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + PascalString stationName = + readSimpleField( + "stationName", + new DataReaderComplexDefault<>(() -> PascalString.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readPaddingField( + readUnsignedShort(readBuffer, 8), + (int) (((20) - (6)) - ((stationName.getStringLength()))), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + readBuffer.closeContext("PnIoCm_Block_ArServer"); // Create the instance - return new PnIoCm_Block_ArServerBuilderImpl(); + return new PnIoCm_Block_ArServerBuilderImpl(blockVersionHigh, blockVersionLow, stationName); } public static class PnIoCm_Block_ArServerBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final PascalString stationName; + + public PnIoCm_Block_ArServerBuilderImpl( + short blockVersionHigh, short blockVersionLow, PascalString stationName) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.stationName = stationName; + } - public PnIoCm_Block_ArServerBuilderImpl() {} - - public PnIoCm_Block_ArServer build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_ArServer build() { PnIoCm_Block_ArServer pnIoCm_Block_ArServer = - new PnIoCm_Block_ArServer(blockVersionHigh, blockVersionLow); + new PnIoCm_Block_ArServer(blockVersionHigh, blockVersionLow, stationName); return pnIoCm_Block_ArServer; } } @@ -100,12 +214,17 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_ArServer that = (PnIoCm_Block_ArServer) o; - return super.equals(that) && true; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getStationName() == that.getStationName()) + && super.equals(that) + && true; } @Override public int hashCode() { - return Objects.hash(super.hashCode()); + return Objects.hash( + super.hashCode(), getBlockVersionHigh(), getBlockVersionLow(), getStationName()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java index 50c6f6c6fd5..f60a061b8b6 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java @@ -43,16 +43,28 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final List apis; public PnIoCm_Block_ExpectedSubmoduleReq( short blockVersionHigh, short blockVersionLow, List apis) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.apis = apis; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public List getApis() { return apis; } @@ -63,6 +75,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_ExpectedSubmoduleReq"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Implicit Field (numberOfApis) (Used for parsing, but its value is not stored as it's // implicitly given by the objects content) int numberOfApis = (int) (COUNT(getApis())); @@ -89,6 +124,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_ExpectedSubmoduleReq _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Implicit Field (numberOfApis) lengthInBits += 16; @@ -111,6 +155,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + int numberOfApis = readImplicitField( "numberOfApis", @@ -127,19 +189,26 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_ExpectedSubmoduleReq"); // Create the instance - return new PnIoCm_Block_ExpectedSubmoduleReqBuilderImpl(apis); + return new PnIoCm_Block_ExpectedSubmoduleReqBuilderImpl( + blockVersionHigh, blockVersionLow, apis); } public static class PnIoCm_Block_ExpectedSubmoduleReqBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final List apis; public PnIoCm_Block_ExpectedSubmoduleReqBuilderImpl( + short blockVersionHigh, + short blockVersionLow, List apis) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.apis = apis; } - public PnIoCm_Block_ExpectedSubmoduleReq build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_ExpectedSubmoduleReq build() { PnIoCm_Block_ExpectedSubmoduleReq pnIoCm_Block_ExpectedSubmoduleReq = new PnIoCm_Block_ExpectedSubmoduleReq(blockVersionHigh, blockVersionLow, apis); return pnIoCm_Block_ExpectedSubmoduleReq; @@ -155,12 +224,16 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_ExpectedSubmoduleReq that = (PnIoCm_Block_ExpectedSubmoduleReq) o; - return (getApis() == that.getApis()) && super.equals(that) && true; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getApis() == that.getApis()) + && super.equals(that) + && true; } @Override public int hashCode() { - return Objects.hash(super.hashCode(), getApis()); + return Objects.hash(super.hashCode(), getBlockVersionHigh(), getBlockVersionLow(), getApis()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java index e011498ff26..64a92096586 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java @@ -43,6 +43,8 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_IoCrType ioCrType; protected final int ioCrReference; protected final int lt; @@ -64,6 +66,10 @@ public PnIoCm_BlockType getBlockType() { protected final MacAddress ioCrMulticastMacAdr; protected final List apis; + // Reserved Fields + private Long reservedField0; + private Short reservedField1; + public PnIoCm_Block_IoCrReq( short blockVersionHigh, short blockVersionLow, @@ -87,7 +93,9 @@ public PnIoCm_Block_IoCrReq( int ioCrTagHeader, MacAddress ioCrMulticastMacAdr, List apis) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.ioCrType = ioCrType; this.ioCrReference = ioCrReference; this.lt = lt; @@ -110,6 +118,14 @@ public PnIoCm_Block_IoCrReq( this.apis = apis; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_IoCrType getIoCrType() { return ioCrType; } @@ -196,6 +212,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_IoCrReq"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (ioCrType) writeSimpleEnumField( "ioCrType", @@ -243,7 +282,7 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial // Reserved Field (reserved) writeReservedField( "reserved", - (long) 0x0000, + reservedField0 != null ? reservedField0 : (long) 0x0000, writeUnsignedLong(writeBuffer, 17), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -257,7 +296,7 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial // Reserved Field (reserved) writeReservedField( "reserved", - (short) 0x00, + reservedField1 != null ? reservedField1 : (short) 0x00, writeUnsignedShort(writeBuffer, 7), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -373,6 +412,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_IoCrReq _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (ioCrType) lengthInBits += 16; @@ -458,6 +506,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_IoCrType ioCrType = readEnumField( "ioCrType", @@ -605,6 +671,8 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_IoCrReq"); // Create the instance return new PnIoCm_Block_IoCrReqBuilderImpl( + blockVersionHigh, + blockVersionLow, ioCrType, ioCrReference, lt, @@ -624,10 +692,14 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read dataHoldFactor, ioCrTagHeader, ioCrMulticastMacAdr, - apis); + apis, + reservedField0, + reservedField1); } public static class PnIoCm_Block_IoCrReqBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_IoCrType ioCrType; private final int ioCrReference; private final int lt; @@ -648,8 +720,12 @@ public static class PnIoCm_Block_IoCrReqBuilderImpl implements PnIoCm_Block.PnIo private final int ioCrTagHeader; private final MacAddress ioCrMulticastMacAdr; private final List apis; + private final Long reservedField0; + private final Short reservedField1; public PnIoCm_Block_IoCrReqBuilderImpl( + short blockVersionHigh, + short blockVersionLow, PnIoCm_IoCrType ioCrType, int ioCrReference, int lt, @@ -669,7 +745,11 @@ public PnIoCm_Block_IoCrReqBuilderImpl( int dataHoldFactor, int ioCrTagHeader, MacAddress ioCrMulticastMacAdr, - List apis) { + List apis, + Long reservedField0, + Short reservedField1) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.ioCrType = ioCrType; this.ioCrReference = ioCrReference; this.lt = lt; @@ -690,9 +770,11 @@ public PnIoCm_Block_IoCrReqBuilderImpl( this.ioCrTagHeader = ioCrTagHeader; this.ioCrMulticastMacAdr = ioCrMulticastMacAdr; this.apis = apis; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; } - public PnIoCm_Block_IoCrReq build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_IoCrReq build() { PnIoCm_Block_IoCrReq pnIoCm_Block_IoCrReq = new PnIoCm_Block_IoCrReq( blockVersionHigh, @@ -717,6 +799,8 @@ public PnIoCm_Block_IoCrReq build(short blockVersionHigh, short blockVersionLow) ioCrTagHeader, ioCrMulticastMacAdr, apis); + pnIoCm_Block_IoCrReq.reservedField0 = reservedField0; + pnIoCm_Block_IoCrReq.reservedField1 = reservedField1; return pnIoCm_Block_IoCrReq; } } @@ -730,7 +814,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_IoCrReq that = (PnIoCm_Block_IoCrReq) o; - return (getIoCrType() == that.getIoCrType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getIoCrType() == that.getIoCrType()) && (getIoCrReference() == that.getIoCrReference()) && (getLt() == that.getLt()) && (getFullSubFrameStructure() == that.getFullSubFrameStructure()) @@ -758,6 +844,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash( super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), getIoCrType(), getIoCrReference(), getLt(), diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java index 6586e96b687..49163527680 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java @@ -43,6 +43,8 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final PnIoCm_IoCrType ioCrType; protected final int ioCrReference; protected final int frameId; @@ -53,12 +55,22 @@ public PnIoCm_Block_IoCrRes( PnIoCm_IoCrType ioCrType, int ioCrReference, int frameId) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.ioCrType = ioCrType; this.ioCrReference = ioCrReference; this.frameId = frameId; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public PnIoCm_IoCrType getIoCrType() { return ioCrType; } @@ -77,6 +89,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_IoCrRes"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Simple Field (ioCrType) writeSimpleEnumField( "ioCrType", @@ -113,6 +148,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_IoCrRes _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Simple field (ioCrType) lengthInBits += 16; @@ -132,6 +176,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + PnIoCm_IoCrType ioCrType = readEnumField( "ioCrType", @@ -154,22 +216,31 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_IoCrRes"); // Create the instance - return new PnIoCm_Block_IoCrResBuilderImpl(ioCrType, ioCrReference, frameId); + return new PnIoCm_Block_IoCrResBuilderImpl( + blockVersionHigh, blockVersionLow, ioCrType, ioCrReference, frameId); } public static class PnIoCm_Block_IoCrResBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final PnIoCm_IoCrType ioCrType; private final int ioCrReference; private final int frameId; public PnIoCm_Block_IoCrResBuilderImpl( - PnIoCm_IoCrType ioCrType, int ioCrReference, int frameId) { + short blockVersionHigh, + short blockVersionLow, + PnIoCm_IoCrType ioCrType, + int ioCrReference, + int frameId) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.ioCrType = ioCrType; this.ioCrReference = ioCrReference; this.frameId = frameId; } - public PnIoCm_Block_IoCrRes build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_IoCrRes build() { PnIoCm_Block_IoCrRes pnIoCm_Block_IoCrRes = new PnIoCm_Block_IoCrRes( blockVersionHigh, blockVersionLow, ioCrType, ioCrReference, frameId); @@ -186,7 +257,9 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_IoCrRes that = (PnIoCm_Block_IoCrRes) o; - return (getIoCrType() == that.getIoCrType()) + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getIoCrType() == that.getIoCrType()) && (getIoCrReference() == that.getIoCrReference()) && (getFrameId() == that.getFrameId()) && super.equals(that) @@ -195,7 +268,13 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(super.hashCode(), getIoCrType(), getIoCrReference(), getFrameId()); + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getIoCrType(), + getIoCrReference(), + getFrameId()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java index 55a99a06cd7..ab6f2fcc81e 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java @@ -43,14 +43,26 @@ public PnIoCm_BlockType getBlockType() { } // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; protected final List apis; public PnIoCm_Block_ModuleDiff( short blockVersionHigh, short blockVersionLow, List apis) { - super(blockVersionHigh, blockVersionLow); + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.apis = apis; } + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + public List getApis() { return apis; } @@ -61,6 +73,29 @@ protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws Serial int startPos = positionAware.getPos(); writeBuffer.pushContext("PnIoCm_Block_ModuleDiff"); + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + // Implicit Field (numberOfApis) (Used for parsing, but its value is not stored as it's // implicitly given by the objects content) int numberOfApis = (int) (COUNT(getApis())); @@ -87,6 +122,15 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnIoCm_Block_ModuleDiff _value = this; + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + // Implicit Field (numberOfApis) lengthInBits += 16; @@ -109,6 +153,24 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int startPos = positionAware.getPos(); int curPos; + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + int numberOfApis = readImplicitField( "numberOfApis", @@ -125,18 +187,23 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read readBuffer.closeContext("PnIoCm_Block_ModuleDiff"); // Create the instance - return new PnIoCm_Block_ModuleDiffBuilderImpl(apis); + return new PnIoCm_Block_ModuleDiffBuilderImpl(blockVersionHigh, blockVersionLow, apis); } public static class PnIoCm_Block_ModuleDiffBuilderImpl implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; private final List apis; - public PnIoCm_Block_ModuleDiffBuilderImpl(List apis) { + public PnIoCm_Block_ModuleDiffBuilderImpl( + short blockVersionHigh, short blockVersionLow, List apis) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; this.apis = apis; } - public PnIoCm_Block_ModuleDiff build(short blockVersionHigh, short blockVersionLow) { + public PnIoCm_Block_ModuleDiff build() { PnIoCm_Block_ModuleDiff pnIoCm_Block_ModuleDiff = new PnIoCm_Block_ModuleDiff(blockVersionHigh, blockVersionLow, apis); return pnIoCm_Block_ModuleDiff; @@ -152,12 +219,16 @@ public boolean equals(Object o) { return false; } PnIoCm_Block_ModuleDiff that = (PnIoCm_Block_ModuleDiff) o; - return (getApis() == that.getApis()) && super.equals(that) && true; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getApis() == that.getApis()) + && super.equals(that) + && true; } @Override public int hashCode() { - return Objects.hash(super.hashCode(), getApis()); + return Objects.hash(super.hashCode(), getBlockVersionHigh(), getBlockVersionLow(), getApis()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java new file mode 100644 index 00000000000..b54ac870c17 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Request.java @@ -0,0 +1,362 @@ +/* + * 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.profinet.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 PnIoCm_Control_Request extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOD_CONTROL_REQ; + } + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final Uuid arUuid; + protected final int sessionKey; + protected final int controlCommand; + + // Reserved Fields + private Integer reservedField0; + private Integer reservedField1; + private Integer reservedField2; + + public PnIoCm_Control_Request( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public Uuid getArUuid() { + return arUuid; + } + + public int getSessionKey() { + return sessionKey; + } + + public int getControlCommand() { + return controlCommand; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_Control_Request"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sessionKey) + writeSimpleField( + "sessionKey", + sessionKey, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlCommand) + writeSimpleField( + "controlCommand", + controlCommand, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField2 != null ? reservedField2 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PnIoCm_Control_Request"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCm_Control_Request _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (sessionKey) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (controlCommand) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCm_Control_Request"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField0 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sessionKey = + readSimpleField( + "sessionKey", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField1 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlCommand = + readSimpleField( + "controlCommand", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField2 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PnIoCm_Control_Request"); + // Create the instance + return new PnIoCm_Control_RequestBuilderImpl( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + reservedField0, + reservedField1, + reservedField2); + } + + public static class PnIoCm_Control_RequestBuilderImpl + implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final Uuid arUuid; + private final int sessionKey; + private final int controlCommand; + private final Integer reservedField0; + private final Integer reservedField1; + private final Integer reservedField2; + + public PnIoCm_Control_RequestBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + Integer reservedField0, + Integer reservedField1, + Integer reservedField2) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + this.reservedField2 = reservedField2; + } + + public PnIoCm_Control_Request build() { + PnIoCm_Control_Request pnIoCm_Control_Request = + new PnIoCm_Control_Request( + blockVersionHigh, blockVersionLow, arUuid, sessionKey, controlCommand); + pnIoCm_Control_Request.reservedField0 = reservedField0; + pnIoCm_Control_Request.reservedField1 = reservedField1; + pnIoCm_Control_Request.reservedField2 = reservedField2; + return pnIoCm_Control_Request; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_Control_Request)) { + return false; + } + PnIoCm_Control_Request that = (PnIoCm_Control_Request) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArUuid() == that.getArUuid()) + && (getSessionKey() == that.getSessionKey()) + && (getControlCommand() == that.getControlCommand()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getArUuid(), + getSessionKey(), + getControlCommand()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java new file mode 100644 index 00000000000..e3e3ac74c96 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Control_Response.java @@ -0,0 +1,362 @@ +/* + * 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.profinet.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 PnIoCm_Control_Response extends PnIoCm_Block implements Message { + + // Accessors for discriminator values. + public PnIoCm_BlockType getBlockType() { + return PnIoCm_BlockType.IOD_CONTROL_RES; + } + + // Properties. + protected final short blockVersionHigh; + protected final short blockVersionLow; + protected final Uuid arUuid; + protected final int sessionKey; + protected final int controlCommand; + + // Reserved Fields + private Integer reservedField0; + private Integer reservedField1; + private Integer reservedField2; + + public PnIoCm_Control_Response( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand) { + super(); + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + } + + public short getBlockVersionHigh() { + return blockVersionHigh; + } + + public short getBlockVersionLow() { + return blockVersionLow; + } + + public Uuid getArUuid() { + return arUuid; + } + + public int getSessionKey() { + return sessionKey; + } + + public int getControlCommand() { + return controlCommand; + } + + @Override + protected void serializePnIoCm_BlockChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_Control_Response"); + + // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + int blockLength = (int) ((getLengthInBytes()) - (4)); + writeImplicitField( + "blockLength", + blockLength, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionHigh) + writeSimpleField( + "blockVersionHigh", + blockVersionHigh, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (blockVersionLow) + writeSimpleField( + "blockVersionLow", + blockVersionLow, + writeUnsignedShort(writeBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (arUuid) + writeSimpleField( + "arUuid", + arUuid, + new DataWriterComplexDefault<>(writeBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (sessionKey) + writeSimpleField( + "sessionKey", + sessionKey, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Simple Field (controlCommand) + writeSimpleField( + "controlCommand", + controlCommand, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField2 != null ? reservedField2 : (int) 0x0000, + writeUnsignedInt(writeBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + writeBuffer.popContext("PnIoCm_Control_Response"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCm_Control_Response _value = this; + + // Implicit Field (blockLength) + lengthInBits += 16; + + // Simple field (blockVersionHigh) + lengthInBits += 8; + + // Simple field (blockVersionLow) + lengthInBits += 8; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (arUuid) + lengthInBits += arUuid.getLengthInBits(); + + // Simple field (sessionKey) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + // Simple field (controlCommand) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 16; + + return lengthInBits; + } + + public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCm_Control_Response"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int blockLength = + readImplicitField( + "blockLength", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionHigh = + readSimpleField( + "blockVersionHigh", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + short blockVersionLow = + readSimpleField( + "blockVersionLow", + readUnsignedShort(readBuffer, 8), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField0 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Uuid arUuid = + readSimpleField( + "arUuid", + new DataReaderComplexDefault<>(() -> Uuid.staticParse(readBuffer), readBuffer), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int sessionKey = + readSimpleField( + "sessionKey", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField1 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + int controlCommand = + readSimpleField( + "controlCommand", + readUnsignedInt(readBuffer, 16), + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + Integer reservedField2 = + readReservedField( + "reserved", + readUnsignedInt(readBuffer, 16), + (int) 0x0000, + WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); + + readBuffer.closeContext("PnIoCm_Control_Response"); + // Create the instance + return new PnIoCm_Control_ResponseBuilderImpl( + blockVersionHigh, + blockVersionLow, + arUuid, + sessionKey, + controlCommand, + reservedField0, + reservedField1, + reservedField2); + } + + public static class PnIoCm_Control_ResponseBuilderImpl + implements PnIoCm_Block.PnIoCm_BlockBuilder { + private final short blockVersionHigh; + private final short blockVersionLow; + private final Uuid arUuid; + private final int sessionKey; + private final int controlCommand; + private final Integer reservedField0; + private final Integer reservedField1; + private final Integer reservedField2; + + public PnIoCm_Control_ResponseBuilderImpl( + short blockVersionHigh, + short blockVersionLow, + Uuid arUuid, + int sessionKey, + int controlCommand, + Integer reservedField0, + Integer reservedField1, + Integer reservedField2) { + this.blockVersionHigh = blockVersionHigh; + this.blockVersionLow = blockVersionLow; + this.arUuid = arUuid; + this.sessionKey = sessionKey; + this.controlCommand = controlCommand; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + this.reservedField2 = reservedField2; + } + + public PnIoCm_Control_Response build() { + PnIoCm_Control_Response pnIoCm_Control_Response = + new PnIoCm_Control_Response( + blockVersionHigh, blockVersionLow, arUuid, sessionKey, controlCommand); + pnIoCm_Control_Response.reservedField0 = reservedField0; + pnIoCm_Control_Response.reservedField1 = reservedField1; + pnIoCm_Control_Response.reservedField2 = reservedField2; + return pnIoCm_Control_Response; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_Control_Response)) { + return false; + } + PnIoCm_Control_Response that = (PnIoCm_Control_Response) o; + return (getBlockVersionHigh() == that.getBlockVersionHigh()) + && (getBlockVersionLow() == that.getBlockVersionLow()) + && (getArUuid() == that.getArUuid()) + && (getSessionKey() == that.getSessionKey()) + && (getControlCommand() == that.getControlCommand()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getBlockVersionHigh(), + getBlockVersionLow(), + getArUuid(), + getSessionKey(), + getControlCommand()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java new file mode 100644 index 00000000000..b45aa14894e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java @@ -0,0 +1,167 @@ +/* + * 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.profinet.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 PnIoCm_DataUnitDataObject implements Message { + + // Properties. + protected final byte[] dataState; + protected final PnIoCm_DataUnitIoCs iops; + + // Arguments. + protected final Integer dataObjectLength; + + public PnIoCm_DataUnitDataObject( + byte[] dataState, PnIoCm_DataUnitIoCs iops, Integer dataObjectLength) { + super(); + this.dataState = dataState; + this.iops = iops; + this.dataObjectLength = dataObjectLength; + } + + public byte[] getDataState() { + return dataState; + } + + public PnIoCm_DataUnitIoCs getIops() { + return iops; + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_DataUnitDataObject"); + + // Array Field (dataState) + writeByteArrayField("dataState", dataState, writeByteArray(writeBuffer, 8)); + + // Simple Field (iops) + writeSimpleField("iops", iops, new DataWriterComplexDefault<>(writeBuffer)); + + writeBuffer.popContext("PnIoCm_DataUnitDataObject"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + PnIoCm_DataUnitDataObject _value = this; + + // Array field + if (dataState != null) { + lengthInBits += 8 * dataState.length; + } + + // Simple field (iops) + lengthInBits += iops.getLengthInBits(); + + return lengthInBits; + } + + public static PnIoCm_DataUnitDataObject 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 dataObjectLength; + if (args[0] instanceof Integer) { + dataObjectLength = (Integer) args[0]; + } else if (args[0] instanceof String) { + dataObjectLength = 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, dataObjectLength); + } + + public static PnIoCm_DataUnitDataObject staticParse( + ReadBuffer readBuffer, Integer dataObjectLength) throws ParseException { + readBuffer.pullContext("PnIoCm_DataUnitDataObject"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + byte[] dataState = readBuffer.readByteArray("dataState", Math.toIntExact(dataObjectLength)); + + PnIoCm_DataUnitIoCs iops = + readSimpleField( + "iops", + new DataReaderComplexDefault<>( + () -> PnIoCm_DataUnitIoCs.staticParse(readBuffer), readBuffer)); + + readBuffer.closeContext("PnIoCm_DataUnitDataObject"); + // Create the instance + PnIoCm_DataUnitDataObject _pnIoCm_DataUnitDataObject; + _pnIoCm_DataUnitDataObject = new PnIoCm_DataUnitDataObject(dataState, iops, dataObjectLength); + return _pnIoCm_DataUnitDataObject; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_DataUnitDataObject)) { + return false; + } + PnIoCm_DataUnitDataObject that = (PnIoCm_DataUnitDataObject) o; + return (getDataState() == that.getDataState()) && (getIops() == that.getIops()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getDataState(), getIops()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java new file mode 100644 index 00000000000..03436b80014 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java @@ -0,0 +1,174 @@ +/* + * 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.profinet.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 PnIoCm_DataUnitIoCs implements Message { + + // Properties. + protected final boolean dataState; + protected final byte instance; + protected final boolean extension; + + // Reserved Fields + private Byte reservedField0; + + public PnIoCm_DataUnitIoCs(boolean dataState, byte instance, boolean extension) { + super(); + this.dataState = dataState; + this.instance = instance; + this.extension = extension; + } + + public boolean getDataState() { + return dataState; + } + + public byte getInstance() { + return instance; + } + + public boolean getExtension() { + return extension; + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_DataUnitIoCs"); + + // Simple Field (dataState) + writeSimpleField("dataState", dataState, writeBoolean(writeBuffer)); + + // Simple Field (instance) + writeSimpleField("instance", instance, writeUnsignedByte(writeBuffer, 2)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (byte) 0x00, + writeUnsignedByte(writeBuffer, 4)); + + // Simple Field (extension) + writeSimpleField("extension", extension, writeBoolean(writeBuffer)); + + writeBuffer.popContext("PnIoCm_DataUnitIoCs"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + PnIoCm_DataUnitIoCs _value = this; + + // Simple field (dataState) + lengthInBits += 1; + + // Simple field (instance) + lengthInBits += 2; + + // Reserved Field (reserved) + lengthInBits += 4; + + // Simple field (extension) + lengthInBits += 1; + + return lengthInBits; + } + + public static PnIoCm_DataUnitIoCs staticParse(ReadBuffer readBuffer, Object... args) + throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static PnIoCm_DataUnitIoCs staticParse(ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("PnIoCm_DataUnitIoCs"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + boolean dataState = readSimpleField("dataState", readBoolean(readBuffer)); + + byte instance = readSimpleField("instance", readUnsignedByte(readBuffer, 2)); + + Byte reservedField0 = + readReservedField("reserved", readUnsignedByte(readBuffer, 4), (byte) 0x00); + + boolean extension = readSimpleField("extension", readBoolean(readBuffer)); + + readBuffer.closeContext("PnIoCm_DataUnitIoCs"); + // Create the instance + PnIoCm_DataUnitIoCs _pnIoCm_DataUnitIoCs; + _pnIoCm_DataUnitIoCs = new PnIoCm_DataUnitIoCs(dataState, instance, extension); + _pnIoCm_DataUnitIoCs.reservedField0 = reservedField0; + return _pnIoCm_DataUnitIoCs; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_DataUnitIoCs)) { + return false; + } + PnIoCm_DataUnitIoCs that = (PnIoCm_DataUnitIoCs) o; + return (getDataState() == that.getDataState()) + && (getInstance() == that.getInstance()) + && (getExtension() == that.getExtension()) + && true; + } + + @Override + public int hashCode() { + return Objects.hash(getDataState(), getInstance(), getExtension()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Req.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Req.java index 49ea9c89168..7b9da742bff 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Req.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Req.java @@ -44,25 +44,16 @@ public DceRpc_PacketType getPacketType() { // Properties. protected final long argsMaximum; - protected final long argsLength; protected final long arrayMaximumCount; protected final long arrayOffset; - protected final long arrayActualCount; protected final List blocks; public PnIoCm_Packet_Req( - long argsMaximum, - long argsLength, - long arrayMaximumCount, - long arrayOffset, - long arrayActualCount, - List blocks) { + long argsMaximum, long arrayMaximumCount, long arrayOffset, List blocks) { super(); this.argsMaximum = argsMaximum; - this.argsLength = argsLength; this.arrayMaximumCount = arrayMaximumCount; this.arrayOffset = arrayOffset; - this.arrayActualCount = arrayActualCount; this.blocks = blocks; } @@ -70,10 +61,6 @@ public long getArgsMaximum() { return argsMaximum; } - public long getArgsLength() { - return argsLength; - } - public long getArrayMaximumCount() { return arrayMaximumCount; } @@ -82,10 +69,6 @@ public long getArrayOffset() { return arrayOffset; } - public long getArrayActualCount() { - return arrayActualCount; - } - public List getBlocks() { return blocks; } @@ -100,8 +83,10 @@ protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer) // Simple Field (argsMaximum) writeSimpleField("argsMaximum", argsMaximum, writeUnsignedLong(writeBuffer, 32)); - // Simple Field (argsLength) - writeSimpleField("argsLength", argsLength, writeUnsignedLong(writeBuffer, 32)); + // Implicit Field (argsLength) (Used for parsing, but its value is not stored as it's implicitly + // given by the objects content) + long argsLength = (long) ((getLengthInBytes()) - (20L)); + writeImplicitField("argsLength", argsLength, writeUnsignedLong(writeBuffer, 32)); // Simple Field (arrayMaximumCount) writeSimpleField("arrayMaximumCount", arrayMaximumCount, writeUnsignedLong(writeBuffer, 32)); @@ -109,8 +94,10 @@ protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer) // Simple Field (arrayOffset) writeSimpleField("arrayOffset", arrayOffset, writeUnsignedLong(writeBuffer, 32)); - // Simple Field (arrayActualCount) - writeSimpleField("arrayActualCount", arrayActualCount, writeUnsignedLong(writeBuffer, 32)); + // Implicit Field (arrayActualCount) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + long arrayActualCount = (long) ((getLengthInBytes()) - (20L)); + writeImplicitField("arrayActualCount", arrayActualCount, writeUnsignedLong(writeBuffer, 32)); // Array Field (blocks) writeComplexTypeArrayField("blocks", blocks, writeBuffer); @@ -131,7 +118,7 @@ public int getLengthInBits() { // Simple field (argsMaximum) lengthInBits += 32; - // Simple field (argsLength) + // Implicit Field (argsLength) lengthInBits += 32; // Simple field (arrayMaximumCount) @@ -140,7 +127,7 @@ public int getLengthInBits() { // Simple field (arrayOffset) lengthInBits += 32; - // Simple field (arrayActualCount) + // Implicit Field (arrayActualCount) lengthInBits += 32; // Array field @@ -162,13 +149,13 @@ public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder( long argsMaximum = readSimpleField("argsMaximum", readUnsignedLong(readBuffer, 32)); - long argsLength = readSimpleField("argsLength", readUnsignedLong(readBuffer, 32)); + long argsLength = readImplicitField("argsLength", readUnsignedLong(readBuffer, 32)); long arrayMaximumCount = readSimpleField("arrayMaximumCount", readUnsignedLong(readBuffer, 32)); long arrayOffset = readSimpleField("arrayOffset", readUnsignedLong(readBuffer, 32)); - long arrayActualCount = readSimpleField("arrayActualCount", readUnsignedLong(readBuffer, 32)); + long arrayActualCount = readImplicitField("arrayActualCount", readUnsignedLong(readBuffer, 32)); List blocks = readLengthArrayField( @@ -178,37 +165,26 @@ public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder( readBuffer.closeContext("PnIoCm_Packet_Req"); // Create the instance - return new PnIoCm_Packet_ReqBuilderImpl( - argsMaximum, argsLength, arrayMaximumCount, arrayOffset, arrayActualCount, blocks); + return new PnIoCm_Packet_ReqBuilderImpl(argsMaximum, arrayMaximumCount, arrayOffset, blocks); } public static class PnIoCm_Packet_ReqBuilderImpl implements PnIoCm_Packet.PnIoCm_PacketBuilder { private final long argsMaximum; - private final long argsLength; private final long arrayMaximumCount; private final long arrayOffset; - private final long arrayActualCount; private final List blocks; public PnIoCm_Packet_ReqBuilderImpl( - long argsMaximum, - long argsLength, - long arrayMaximumCount, - long arrayOffset, - long arrayActualCount, - List blocks) { + long argsMaximum, long arrayMaximumCount, long arrayOffset, List blocks) { this.argsMaximum = argsMaximum; - this.argsLength = argsLength; this.arrayMaximumCount = arrayMaximumCount; this.arrayOffset = arrayOffset; - this.arrayActualCount = arrayActualCount; this.blocks = blocks; } public PnIoCm_Packet_Req build() { PnIoCm_Packet_Req pnIoCm_Packet_Req = - new PnIoCm_Packet_Req( - argsMaximum, argsLength, arrayMaximumCount, arrayOffset, arrayActualCount, blocks); + new PnIoCm_Packet_Req(argsMaximum, arrayMaximumCount, arrayOffset, blocks); return pnIoCm_Packet_Req; } } @@ -223,10 +199,8 @@ public boolean equals(Object o) { } PnIoCm_Packet_Req that = (PnIoCm_Packet_Req) o; return (getArgsMaximum() == that.getArgsMaximum()) - && (getArgsLength() == that.getArgsLength()) && (getArrayMaximumCount() == that.getArrayMaximumCount()) && (getArrayOffset() == that.getArrayOffset()) - && (getArrayActualCount() == that.getArrayActualCount()) && (getBlocks() == that.getBlocks()) && super.equals(that) && true; @@ -235,13 +209,7 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash( - super.hashCode(), - getArgsMaximum(), - getArgsLength(), - getArrayMaximumCount(), - getArrayOffset(), - getArrayActualCount(), - getBlocks()); + super.hashCode(), getArgsMaximum(), getArrayMaximumCount(), getArrayOffset(), getBlocks()); } @Override diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Res.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Res.java index 01b041493bd..c9123f1cb38 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Res.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Res.java @@ -47,10 +47,8 @@ public DceRpc_PacketType getPacketType() { protected final short errorCode1; protected final short errorDecode; protected final short errorCode; - protected final long argsLength; protected final long arrayMaximumCount; protected final long arrayOffset; - protected final long arrayActualCount; protected final List blocks; public PnIoCm_Packet_Res( @@ -58,20 +56,16 @@ public PnIoCm_Packet_Res( short errorCode1, short errorDecode, short errorCode, - long argsLength, long arrayMaximumCount, long arrayOffset, - long arrayActualCount, List blocks) { super(); this.errorCode2 = errorCode2; this.errorCode1 = errorCode1; this.errorDecode = errorDecode; this.errorCode = errorCode; - this.argsLength = argsLength; this.arrayMaximumCount = arrayMaximumCount; this.arrayOffset = arrayOffset; - this.arrayActualCount = arrayActualCount; this.blocks = blocks; } @@ -91,10 +85,6 @@ public short getErrorCode() { return errorCode; } - public long getArgsLength() { - return argsLength; - } - public long getArrayMaximumCount() { return arrayMaximumCount; } @@ -103,10 +93,6 @@ public long getArrayOffset() { return arrayOffset; } - public long getArrayActualCount() { - return arrayActualCount; - } - public List getBlocks() { return blocks; } @@ -130,8 +116,13 @@ protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer) // Simple Field (errorCode) writeSimpleField("errorCode", errorCode, writeUnsignedShort(writeBuffer, 8)); - // Simple Field (argsLength) - writeSimpleField("argsLength", argsLength, writeUnsignedLong(writeBuffer, 32)); + // Implicit Field (argsLength) (Used for parsing, but its value is not stored as it's implicitly + // given by the objects content) + long argsLength = + (long) + (((((((((getLengthInBytes()) - (1L)) - (1L)) - (1L)) - (1L)) - (4L)) - (4L)) - (4L)) + - (4L)); + writeImplicitField("argsLength", argsLength, writeUnsignedLong(writeBuffer, 32)); // Simple Field (arrayMaximumCount) writeSimpleField("arrayMaximumCount", arrayMaximumCount, writeUnsignedLong(writeBuffer, 32)); @@ -139,8 +130,13 @@ protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer) // Simple Field (arrayOffset) writeSimpleField("arrayOffset", arrayOffset, writeUnsignedLong(writeBuffer, 32)); - // Simple Field (arrayActualCount) - writeSimpleField("arrayActualCount", arrayActualCount, writeUnsignedLong(writeBuffer, 32)); + // Implicit Field (arrayActualCount) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + long arrayActualCount = + (long) + (((((((((getLengthInBytes()) - (1L)) - (1L)) - (1L)) - (1L)) - (4L)) - (4L)) - (4L)) + - (4L)); + writeImplicitField("arrayActualCount", arrayActualCount, writeUnsignedLong(writeBuffer, 32)); // Array Field (blocks) writeComplexTypeArrayField("blocks", blocks, writeBuffer); @@ -170,7 +166,7 @@ public int getLengthInBits() { // Simple field (errorCode) lengthInBits += 8; - // Simple field (argsLength) + // Implicit Field (argsLength) lengthInBits += 32; // Simple field (arrayMaximumCount) @@ -179,7 +175,7 @@ public int getLengthInBits() { // Simple field (arrayOffset) lengthInBits += 32; - // Simple field (arrayActualCount) + // Implicit Field (arrayActualCount) lengthInBits += 32; // Array field @@ -207,13 +203,13 @@ public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder( short errorCode = readSimpleField("errorCode", readUnsignedShort(readBuffer, 8)); - long argsLength = readSimpleField("argsLength", readUnsignedLong(readBuffer, 32)); + long argsLength = readImplicitField("argsLength", readUnsignedLong(readBuffer, 32)); long arrayMaximumCount = readSimpleField("arrayMaximumCount", readUnsignedLong(readBuffer, 32)); long arrayOffset = readSimpleField("arrayOffset", readUnsignedLong(readBuffer, 32)); - long arrayActualCount = readSimpleField("arrayActualCount", readUnsignedLong(readBuffer, 32)); + long arrayActualCount = readImplicitField("arrayActualCount", readUnsignedLong(readBuffer, 32)); List blocks = readLengthArrayField( @@ -224,15 +220,7 @@ public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder( readBuffer.closeContext("PnIoCm_Packet_Res"); // Create the instance return new PnIoCm_Packet_ResBuilderImpl( - errorCode2, - errorCode1, - errorDecode, - errorCode, - argsLength, - arrayMaximumCount, - arrayOffset, - arrayActualCount, - blocks); + errorCode2, errorCode1, errorDecode, errorCode, arrayMaximumCount, arrayOffset, blocks); } public static class PnIoCm_Packet_ResBuilderImpl implements PnIoCm_Packet.PnIoCm_PacketBuilder { @@ -240,10 +228,8 @@ public static class PnIoCm_Packet_ResBuilderImpl implements PnIoCm_Packet.PnIoCm private final short errorCode1; private final short errorDecode; private final short errorCode; - private final long argsLength; private final long arrayMaximumCount; private final long arrayOffset; - private final long arrayActualCount; private final List blocks; public PnIoCm_Packet_ResBuilderImpl( @@ -251,19 +237,15 @@ public PnIoCm_Packet_ResBuilderImpl( short errorCode1, short errorDecode, short errorCode, - long argsLength, long arrayMaximumCount, long arrayOffset, - long arrayActualCount, List blocks) { this.errorCode2 = errorCode2; this.errorCode1 = errorCode1; this.errorDecode = errorDecode; this.errorCode = errorCode; - this.argsLength = argsLength; this.arrayMaximumCount = arrayMaximumCount; this.arrayOffset = arrayOffset; - this.arrayActualCount = arrayActualCount; this.blocks = blocks; } @@ -274,10 +256,8 @@ public PnIoCm_Packet_Res build() { errorCode1, errorDecode, errorCode, - argsLength, arrayMaximumCount, arrayOffset, - arrayActualCount, blocks); return pnIoCm_Packet_Res; } @@ -296,10 +276,8 @@ public boolean equals(Object o) { && (getErrorCode1() == that.getErrorCode1()) && (getErrorDecode() == that.getErrorDecode()) && (getErrorCode() == that.getErrorCode()) - && (getArgsLength() == that.getArgsLength()) && (getArrayMaximumCount() == that.getArrayMaximumCount()) && (getArrayOffset() == that.getArrayOffset()) - && (getArrayActualCount() == that.getArrayActualCount()) && (getBlocks() == that.getBlocks()) && super.equals(that) && true; @@ -313,10 +291,8 @@ public int hashCode() { getErrorCode1(), getErrorDecode(), getErrorCode(), - getArgsLength(), getArrayMaximumCount(), getArrayOffset(), - getArrayActualCount(), getBlocks()); } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java index ab829f0748d..abe24ee71e7 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java @@ -48,6 +48,9 @@ public abstract class PnIoCm_Submodule implements Message { protected final boolean reduceInputModuleDataLength; protected final boolean sharedInput; + // Reserved Fields + private Integer reservedField0; + public PnIoCm_Submodule( int slotNumber, long submoduleIdentNumber, @@ -104,7 +107,10 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { "submoduleIdentNumber", submoduleIdentNumber, writeUnsignedLong(writeBuffer, 32)); // Reserved Field (reserved) - writeReservedField("reserved", (int) 0x000, writeUnsignedInt(writeBuffer, 10)); + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (int) 0x000, + writeUnsignedInt(writeBuffer, 10)); // Simple Field (discardIoxs) writeSimpleField("discardIoxs", discardIoxs, writeBoolean(writeBuffer)); @@ -215,6 +221,10 @@ public static PnIoCm_Submodule staticParse(ReadBuffer readBuffer) throws ParseEx PnIoCm_SubmoduleBuilder builder = null; if (EvaluationHelper.equals(submoduleType, PnIoCm_SubmoduleType.NO_INPUT_NO_OUTPUT_DATA)) { builder = PnIoCm_Submodule_NoInputNoOutputData.staticParsePnIoCm_SubmoduleBuilder(readBuffer); + } else if (EvaluationHelper.equals(submoduleType, PnIoCm_SubmoduleType.INPUT_DATA)) { + builder = PnIoCm_Submodule_InputData.staticParsePnIoCm_SubmoduleBuilder(readBuffer); + } else if (EvaluationHelper.equals(submoduleType, PnIoCm_SubmoduleType.OUTPUT_DATA)) { + builder = PnIoCm_Submodule_OutputData.staticParsePnIoCm_SubmoduleBuilder(readBuffer); } else if (EvaluationHelper.equals(submoduleType, PnIoCm_SubmoduleType.INPUT_AND_OUTPUT_DATA)) { builder = PnIoCm_Submodule_InputAndOutputData.staticParsePnIoCm_SubmoduleBuilder(readBuffer); } @@ -237,6 +247,7 @@ public static PnIoCm_Submodule staticParse(ReadBuffer readBuffer) throws ParseEx reduceOutputModuleDataLength, reduceInputModuleDataLength, sharedInput); + _pnIoCm_Submodule.reservedField0 = reservedField0; return _pnIoCm_Submodule; } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_SubmoduleType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_SubmoduleType.java index d213374192b..69fbd772297 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_SubmoduleType.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_SubmoduleType.java @@ -25,6 +25,8 @@ public enum PnIoCm_SubmoduleType { NO_INPUT_NO_OUTPUT_DATA((byte) 0x0), + INPUT_DATA((byte) 0x1), + OUTPUT_DATA((byte) 0x2), INPUT_AND_OUTPUT_DATA((byte) 0x3); private static final Map map; diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java new file mode 100644 index 00000000000..30adeb1f87a --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java @@ -0,0 +1,236 @@ +/* + * 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.profinet.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 PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Message { + + // Accessors for discriminator values. + public PnIoCm_SubmoduleType getSubmoduleType() { + return PnIoCm_SubmoduleType.INPUT_DATA; + } + + // Constant values. + public static final Integer INPUTDATADESCRIPTION = 0x0001; + + // Properties. + protected final int inputSubmoduleDataLength; + protected final short inputLengthIoCs; + protected final short inputLengthIoPs; + + public PnIoCm_Submodule_InputData( + int slotNumber, + long submoduleIdentNumber, + boolean discardIoxs, + boolean reduceOutputModuleDataLength, + boolean reduceInputModuleDataLength, + boolean sharedInput, + int inputSubmoduleDataLength, + short inputLengthIoCs, + short inputLengthIoPs) { + super( + slotNumber, + submoduleIdentNumber, + discardIoxs, + reduceOutputModuleDataLength, + reduceInputModuleDataLength, + sharedInput); + this.inputSubmoduleDataLength = inputSubmoduleDataLength; + this.inputLengthIoCs = inputLengthIoCs; + this.inputLengthIoPs = inputLengthIoPs; + } + + public int getInputSubmoduleDataLength() { + return inputSubmoduleDataLength; + } + + public short getInputLengthIoCs() { + return inputLengthIoCs; + } + + public short getInputLengthIoPs() { + return inputLengthIoPs; + } + + public int getInputDataDescription() { + return INPUTDATADESCRIPTION; + } + + @Override + protected void serializePnIoCm_SubmoduleChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_Submodule_InputData"); + + // Const Field (inputDataDescription) + writeConstField( + "inputDataDescription", INPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (inputSubmoduleDataLength) + writeSimpleField( + "inputSubmoduleDataLength", inputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (inputLengthIoCs) + writeSimpleField("inputLengthIoCs", inputLengthIoCs, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (inputLengthIoPs) + writeSimpleField("inputLengthIoPs", inputLengthIoPs, writeUnsignedShort(writeBuffer, 8)); + + writeBuffer.popContext("PnIoCm_Submodule_InputData"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCm_Submodule_InputData _value = this; + + // Const Field (inputDataDescription) + lengthInBits += 16; + + // Simple field (inputSubmoduleDataLength) + lengthInBits += 16; + + // Simple field (inputLengthIoCs) + lengthInBits += 8; + + // Simple field (inputLengthIoPs) + lengthInBits += 8; + + return lengthInBits; + } + + public static PnIoCm_SubmoduleBuilder staticParsePnIoCm_SubmoduleBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCm_Submodule_InputData"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int inputDataDescription = + readConstField( + "inputDataDescription", + readUnsignedInt(readBuffer, 16), + PnIoCm_Submodule_InputData.INPUTDATADESCRIPTION); + + int inputSubmoduleDataLength = + readSimpleField("inputSubmoduleDataLength", readUnsignedInt(readBuffer, 16)); + + short inputLengthIoCs = readSimpleField("inputLengthIoCs", readUnsignedShort(readBuffer, 8)); + + short inputLengthIoPs = readSimpleField("inputLengthIoPs", readUnsignedShort(readBuffer, 8)); + + readBuffer.closeContext("PnIoCm_Submodule_InputData"); + // Create the instance + return new PnIoCm_Submodule_InputDataBuilderImpl( + inputSubmoduleDataLength, inputLengthIoCs, inputLengthIoPs); + } + + public static class PnIoCm_Submodule_InputDataBuilderImpl + implements PnIoCm_Submodule.PnIoCm_SubmoduleBuilder { + private final int inputSubmoduleDataLength; + private final short inputLengthIoCs; + private final short inputLengthIoPs; + + public PnIoCm_Submodule_InputDataBuilderImpl( + int inputSubmoduleDataLength, short inputLengthIoCs, short inputLengthIoPs) { + this.inputSubmoduleDataLength = inputSubmoduleDataLength; + this.inputLengthIoCs = inputLengthIoCs; + this.inputLengthIoPs = inputLengthIoPs; + } + + public PnIoCm_Submodule_InputData build( + int slotNumber, + long submoduleIdentNumber, + boolean discardIoxs, + boolean reduceOutputModuleDataLength, + boolean reduceInputModuleDataLength, + boolean sharedInput) { + PnIoCm_Submodule_InputData pnIoCm_Submodule_InputData = + new PnIoCm_Submodule_InputData( + slotNumber, + submoduleIdentNumber, + discardIoxs, + reduceOutputModuleDataLength, + reduceInputModuleDataLength, + sharedInput, + inputSubmoduleDataLength, + inputLengthIoCs, + inputLengthIoPs); + return pnIoCm_Submodule_InputData; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_Submodule_InputData)) { + return false; + } + PnIoCm_Submodule_InputData that = (PnIoCm_Submodule_InputData) o; + return (getInputSubmoduleDataLength() == that.getInputSubmoduleDataLength()) + && (getInputLengthIoCs() == that.getInputLengthIoCs()) + && (getInputLengthIoPs() == that.getInputLengthIoPs()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getInputSubmoduleDataLength(), + getInputLengthIoCs(), + getInputLengthIoPs()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java new file mode 100644 index 00000000000..be143f12d56 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java @@ -0,0 +1,236 @@ +/* + * 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.profinet.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 PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Message { + + // Accessors for discriminator values. + public PnIoCm_SubmoduleType getSubmoduleType() { + return PnIoCm_SubmoduleType.OUTPUT_DATA; + } + + // Constant values. + public static final Integer INPUTDATADESCRIPTION = 0x0002; + + // Properties. + protected final int inputSubmoduleDataLength; + protected final short inputLengthIoCs; + protected final short inputLengthIoPs; + + public PnIoCm_Submodule_OutputData( + int slotNumber, + long submoduleIdentNumber, + boolean discardIoxs, + boolean reduceOutputModuleDataLength, + boolean reduceInputModuleDataLength, + boolean sharedInput, + int inputSubmoduleDataLength, + short inputLengthIoCs, + short inputLengthIoPs) { + super( + slotNumber, + submoduleIdentNumber, + discardIoxs, + reduceOutputModuleDataLength, + reduceInputModuleDataLength, + sharedInput); + this.inputSubmoduleDataLength = inputSubmoduleDataLength; + this.inputLengthIoCs = inputLengthIoCs; + this.inputLengthIoPs = inputLengthIoPs; + } + + public int getInputSubmoduleDataLength() { + return inputSubmoduleDataLength; + } + + public short getInputLengthIoCs() { + return inputLengthIoCs; + } + + public short getInputLengthIoPs() { + return inputLengthIoPs; + } + + public int getInputDataDescription() { + return INPUTDATADESCRIPTION; + } + + @Override + protected void serializePnIoCm_SubmoduleChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIoCm_Submodule_OutputData"); + + // Const Field (inputDataDescription) + writeConstField( + "inputDataDescription", INPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (inputSubmoduleDataLength) + writeSimpleField( + "inputSubmoduleDataLength", inputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (inputLengthIoCs) + writeSimpleField("inputLengthIoCs", inputLengthIoCs, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (inputLengthIoPs) + writeSimpleField("inputLengthIoPs", inputLengthIoPs, writeUnsignedShort(writeBuffer, 8)); + + writeBuffer.popContext("PnIoCm_Submodule_OutputData"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + PnIoCm_Submodule_OutputData _value = this; + + // Const Field (inputDataDescription) + lengthInBits += 16; + + // Simple field (inputSubmoduleDataLength) + lengthInBits += 16; + + // Simple field (inputLengthIoCs) + lengthInBits += 8; + + // Simple field (inputLengthIoPs) + lengthInBits += 8; + + return lengthInBits; + } + + public static PnIoCm_SubmoduleBuilder staticParsePnIoCm_SubmoduleBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("PnIoCm_Submodule_OutputData"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int inputDataDescription = + readConstField( + "inputDataDescription", + readUnsignedInt(readBuffer, 16), + PnIoCm_Submodule_OutputData.INPUTDATADESCRIPTION); + + int inputSubmoduleDataLength = + readSimpleField("inputSubmoduleDataLength", readUnsignedInt(readBuffer, 16)); + + short inputLengthIoCs = readSimpleField("inputLengthIoCs", readUnsignedShort(readBuffer, 8)); + + short inputLengthIoPs = readSimpleField("inputLengthIoPs", readUnsignedShort(readBuffer, 8)); + + readBuffer.closeContext("PnIoCm_Submodule_OutputData"); + // Create the instance + return new PnIoCm_Submodule_OutputDataBuilderImpl( + inputSubmoduleDataLength, inputLengthIoCs, inputLengthIoPs); + } + + public static class PnIoCm_Submodule_OutputDataBuilderImpl + implements PnIoCm_Submodule.PnIoCm_SubmoduleBuilder { + private final int inputSubmoduleDataLength; + private final short inputLengthIoCs; + private final short inputLengthIoPs; + + public PnIoCm_Submodule_OutputDataBuilderImpl( + int inputSubmoduleDataLength, short inputLengthIoCs, short inputLengthIoPs) { + this.inputSubmoduleDataLength = inputSubmoduleDataLength; + this.inputLengthIoCs = inputLengthIoCs; + this.inputLengthIoPs = inputLengthIoPs; + } + + public PnIoCm_Submodule_OutputData build( + int slotNumber, + long submoduleIdentNumber, + boolean discardIoxs, + boolean reduceOutputModuleDataLength, + boolean reduceInputModuleDataLength, + boolean sharedInput) { + PnIoCm_Submodule_OutputData pnIoCm_Submodule_OutputData = + new PnIoCm_Submodule_OutputData( + slotNumber, + submoduleIdentNumber, + discardIoxs, + reduceOutputModuleDataLength, + reduceInputModuleDataLength, + sharedInput, + inputSubmoduleDataLength, + inputLengthIoCs, + inputLengthIoPs); + return pnIoCm_Submodule_OutputData; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIoCm_Submodule_OutputData)) { + return false; + } + PnIoCm_Submodule_OutputData that = (PnIoCm_Submodule_OutputData) o; + return (getInputSubmoduleDataLength() == that.getInputSubmoduleDataLength()) + && (getInputLengthIoCs() == that.getInputLengthIoCs()) + && (getInputLengthIoPs() == that.getInputLengthIoPs()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getInputSubmoduleDataLength(), + getInputLengthIoCs(), + getInputLengthIoPs()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java new file mode 100644 index 00000000000..a205e12212f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIo_CyclicServiceDataUnit.java @@ -0,0 +1,148 @@ +/* + * 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.profinet.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 PnIo_CyclicServiceDataUnit implements Message { + + // Properties. + protected final byte[] data; + + // Arguments. + protected final Short dataUnitLength; + + public PnIo_CyclicServiceDataUnit(byte[] data, Short dataUnitLength) { + super(); + this.data = data; + this.dataUnitLength = dataUnitLength; + } + + public byte[] getData() { + return data; + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("PnIo_CyclicServiceDataUnit"); + + // Array Field (data) + writeByteArrayField("data", data, writeByteArray(writeBuffer, 8)); + + writeBuffer.popContext("PnIo_CyclicServiceDataUnit"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + PnIo_CyclicServiceDataUnit _value = this; + + // Array field + if (data != null) { + lengthInBits += 8 * data.length; + } + + return lengthInBits; + } + + public static PnIo_CyclicServiceDataUnit 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); + } + Short dataUnitLength; + if (args[0] instanceof Short) { + dataUnitLength = (Short) args[0]; + } else if (args[0] instanceof String) { + dataUnitLength = Short.valueOf((String) args[0]); + } else { + throw new PlcRuntimeException( + "Argument 0 expected to be of type Short or a string which is parseable but was " + + args[0].getClass().getName()); + } + return staticParse(readBuffer, dataUnitLength); + } + + public static PnIo_CyclicServiceDataUnit staticParse(ReadBuffer readBuffer, Short dataUnitLength) + throws ParseException { + readBuffer.pullContext("PnIo_CyclicServiceDataUnit"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + byte[] data = readBuffer.readByteArray("data", Math.toIntExact(dataUnitLength)); + + readBuffer.closeContext("PnIo_CyclicServiceDataUnit"); + // Create the instance + PnIo_CyclicServiceDataUnit _pnIo_CyclicServiceDataUnit; + _pnIo_CyclicServiceDataUnit = new PnIo_CyclicServiceDataUnit(data, dataUnitLength); + return _pnIo_CyclicServiceDataUnit; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof PnIo_CyclicServiceDataUnit)) { + return false; + } + PnIo_CyclicServiceDataUnit that = (PnIo_CyclicServiceDataUnit) o; + return (getData() == that.getData()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getData()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java new file mode 100644 index 00000000000..4b9fae34b1c --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java @@ -0,0 +1,132 @@ +/* + * 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.profinet.readwrite; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum ProfinetDataType { + BOOL((short) 1, (short) 1, (String) "BOOLEAN"), + BYTE((short) 2, (short) 1, (String) "BYTE"), + WORD((short) 3, (short) 2, (String) "WORD"), + DWORD((short) 4, (short) 4, (String) "DWORD"), + LWORD((short) 5, (short) 8, (String) "LWORD"), + SINT((short) 6, (short) 1, (String) "SIGNED8"), + INT((short) 7, (short) 2, (String) "SIGNED16"), + DINT((short) 8, (short) 4, (String) "SIGNED32"), + LINT((short) 9, (short) 8, (String) "SIGNED64"), + USINT((short) 10, (short) 1, (String) "UNSIGNED8"), + UINT((short) 11, (short) 2, (String) "UNSIGNED16"), + UDINT((short) 12, (short) 4, (String) "UNSIGNED32"), + ULINT((short) 13, (short) 8, (String) "UNSIGNED64"), + REAL((short) 14, (short) 4, (String) "FLOAT32"), + LREAL((short) 15, (short) 8, (String) "FLOAT64"), + TIME((short) 16, (short) 8, (String) "TIME"), + LTIME((short) 17, (short) 8, (String) "LTIME"), + DATE((short) 18, (short) 8, (String) "DATE"), + LDATE((short) 19, (short) 8, (String) "LDATE"), + TIME_OF_DAY((short) 20, (short) 8, (String) "TIME_OF_DAY"), + LTIME_OF_DAY((short) 21, (short) 8, (String) "LTIME_OF_DAY"), + DATE_AND_TIME((short) 22, (short) 8, (String) "DATE_AND_TIME"), + LDATE_AND_TIME((short) 23, (short) 8, (String) "LDATE_AND_TIME"), + CHAR((short) 24, (short) 1, (String) "CHAR"), + WCHAR((short) 25, (short) 2, (String) "WCHAR"), + STRING((short) 26, (short) 1, (String) "STRING"), + WSTRING((short) 27, (short) 2, (String) "WSTRING"); + private static final Map map; + + static { + map = new HashMap<>(); + for (ProfinetDataType value : ProfinetDataType.values()) { + map.put((short) value.getValue(), value); + } + } + + private short value; + private short dataTypeSize; + private String conversion; + + ProfinetDataType(short value, short dataTypeSize, String conversion) { + this.value = value; + this.dataTypeSize = dataTypeSize; + this.conversion = conversion; + } + + public short getValue() { + return value; + } + + public short getDataTypeSize() { + return dataTypeSize; + } + + public static ProfinetDataType firstEnumForFieldDataTypeSize(short fieldValue) { + for (ProfinetDataType _val : ProfinetDataType.values()) { + if (_val.getDataTypeSize() == fieldValue) { + return _val; + } + } + return null; + } + + public static List enumsForFieldDataTypeSize(short fieldValue) { + List _values = new ArrayList(); + for (ProfinetDataType _val : ProfinetDataType.values()) { + if (_val.getDataTypeSize() == fieldValue) { + _values.add(_val); + } + } + return _values; + } + + public String getConversion() { + return conversion; + } + + public static ProfinetDataType firstEnumForFieldConversion(String fieldValue) { + for (ProfinetDataType _val : ProfinetDataType.values()) { + if (_val.getConversion().equals(fieldValue)) { + return _val; + } + } + return null; + } + + public static List enumsForFieldConversion(String fieldValue) { + List _values = new ArrayList(); + for (ProfinetDataType _val : ProfinetDataType.values()) { + if (_val.getConversion().equals(fieldValue)) { + _values.add(_val); + } + } + return _values; + } + + public static ProfinetDataType enumForValue(short value) { + return map.get(value); + } + + public static Boolean isDefined(short value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDeviceState.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDeviceState.java new file mode 100644 index 00000000000..5e96b980067 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDeviceState.java @@ -0,0 +1,60 @@ +/* + * 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.profinet.readwrite; + +import java.util.HashMap; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum ProfinetDeviceState { + IDLE((short) 0x00), + STARTUP((short) 0x01), + PREMED((short) 0x02), + WAITAPPLRDY((short) 0x03), + APPLRDY((short) 0x04), + CYCLICDATA((short) 0x05), + ABORT((short) 0xFF); + private static final Map map; + + static { + map = new HashMap<>(); + for (ProfinetDeviceState value : ProfinetDeviceState.values()) { + map.put((short) value.getValue(), value); + } + } + + private short value; + + ProfinetDeviceState(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static ProfinetDeviceState enumForValue(short value) { + return map.get(value); + } + + public static Boolean isDefined(short value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java new file mode 100644 index 00000000000..17a03808343 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvChassisId.java @@ -0,0 +1,160 @@ +/* + * 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.profinet.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 TlvChassisId extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.CHASSIS_ID; + } + + // Properties. + protected final short chassisIdSubType; + protected final String chassisId; + + public TlvChassisId(int tlvIdLength, short chassisIdSubType, String chassisId) { + super(tlvIdLength); + this.chassisIdSubType = chassisIdSubType; + this.chassisId = chassisId; + } + + public short getChassisIdSubType() { + return chassisIdSubType; + } + + public String getChassisId() { + return chassisId; + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvChassisId"); + + // Simple Field (chassisIdSubType) + writeSimpleField("chassisIdSubType", chassisIdSubType, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (chassisId) + writeSimpleField( + "chassisId", chassisId, writeString(writeBuffer, (((tlvIdLength) - (1))) * (8))); + + writeBuffer.popContext("TlvChassisId"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvChassisId _value = this; + + // Simple field (chassisIdSubType) + lengthInBits += 8; + + // Simple field (chassisId) + lengthInBits += (((tlvIdLength) - (1))) * (8); + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder( + ReadBuffer readBuffer, Integer tlvIdLength) throws ParseException { + readBuffer.pullContext("TlvChassisId"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + short chassisIdSubType = readSimpleField("chassisIdSubType", readUnsignedShort(readBuffer, 8)); + + String chassisId = + readSimpleField("chassisId", readString(readBuffer, (((tlvIdLength) - (1))) * (8))); + + readBuffer.closeContext("TlvChassisId"); + // Create the instance + return new TlvChassisIdBuilderImpl(chassisIdSubType, chassisId); + } + + public static class TlvChassisIdBuilderImpl implements LldpUnit.LldpUnitBuilder { + private final short chassisIdSubType; + private final String chassisId; + + public TlvChassisIdBuilderImpl(short chassisIdSubType, String chassisId) { + this.chassisIdSubType = chassisIdSubType; + this.chassisId = chassisId; + } + + public TlvChassisId build(int tlvIdLength) { + TlvChassisId tlvChassisId = new TlvChassisId(tlvIdLength, chassisIdSubType, chassisId); + return tlvChassisId; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvChassisId)) { + return false; + } + TlvChassisId that = (TlvChassisId) o; + return (getChassisIdSubType() == that.getChassisIdSubType()) + && (getChassisId() == that.getChassisId()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getChassisIdSubType(), getChassisId()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java new file mode 100644 index 00000000000..edbbb9f7ca5 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvManagementAddress.java @@ -0,0 +1,261 @@ +/* + * 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.profinet.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 TlvManagementAddress extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.MANAGEMENT_ADDRESS; + } + + // Properties. + protected final ManagementAddressSubType addressSubType; + protected final IpAddress ipAddress; + protected final short interfaceSubType; + protected final long interfaceNumber; + protected final short oidStringLength; + + public TlvManagementAddress( + int tlvIdLength, + ManagementAddressSubType addressSubType, + IpAddress ipAddress, + short interfaceSubType, + long interfaceNumber, + short oidStringLength) { + super(tlvIdLength); + this.addressSubType = addressSubType; + this.ipAddress = ipAddress; + this.interfaceSubType = interfaceSubType; + this.interfaceNumber = interfaceNumber; + this.oidStringLength = oidStringLength; + } + + public ManagementAddressSubType getAddressSubType() { + return addressSubType; + } + + public IpAddress getIpAddress() { + return ipAddress; + } + + public short getInterfaceSubType() { + return interfaceSubType; + } + + public long getInterfaceNumber() { + return interfaceNumber; + } + + public short getOidStringLength() { + return oidStringLength; + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvManagementAddress"); + + // Implicit Field (addressStringLength) (Used for parsing, but its value is not stored as it's + // implicitly given by the objects content) + short addressStringLength = (short) (5); + writeImplicitField( + "addressStringLength", addressStringLength, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (addressSubType) + writeSimpleEnumField( + "addressSubType", + "ManagementAddressSubType", + addressSubType, + new DataWriterEnumDefault<>( + ManagementAddressSubType::getValue, + ManagementAddressSubType::name, + writeUnsignedShort(writeBuffer, 8))); + + // Simple Field (ipAddress) + writeSimpleField("ipAddress", ipAddress, new DataWriterComplexDefault<>(writeBuffer)); + + // Simple Field (interfaceSubType) + writeSimpleField("interfaceSubType", interfaceSubType, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (interfaceNumber) + writeSimpleField("interfaceNumber", interfaceNumber, writeUnsignedLong(writeBuffer, 32)); + + // Simple Field (oidStringLength) + writeSimpleField("oidStringLength", oidStringLength, writeUnsignedShort(writeBuffer, 8)); + + writeBuffer.popContext("TlvManagementAddress"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvManagementAddress _value = this; + + // Implicit Field (addressStringLength) + lengthInBits += 8; + + // Simple field (addressSubType) + lengthInBits += 8; + + // Simple field (ipAddress) + lengthInBits += ipAddress.getLengthInBits(); + + // Simple field (interfaceSubType) + lengthInBits += 8; + + // Simple field (interfaceNumber) + lengthInBits += 32; + + // Simple field (oidStringLength) + lengthInBits += 8; + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("TlvManagementAddress"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + short addressStringLength = + readImplicitField("addressStringLength", readUnsignedShort(readBuffer, 8)); + + ManagementAddressSubType addressSubType = + readEnumField( + "addressSubType", + "ManagementAddressSubType", + new DataReaderEnumDefault<>( + ManagementAddressSubType::enumForValue, readUnsignedShort(readBuffer, 8))); + + IpAddress ipAddress = + readSimpleField( + "ipAddress", + new DataReaderComplexDefault<>(() -> IpAddress.staticParse(readBuffer), readBuffer)); + + short interfaceSubType = readSimpleField("interfaceSubType", readUnsignedShort(readBuffer, 8)); + + long interfaceNumber = readSimpleField("interfaceNumber", readUnsignedLong(readBuffer, 32)); + + short oidStringLength = readSimpleField("oidStringLength", readUnsignedShort(readBuffer, 8)); + + readBuffer.closeContext("TlvManagementAddress"); + // Create the instance + return new TlvManagementAddressBuilderImpl( + addressSubType, ipAddress, interfaceSubType, interfaceNumber, oidStringLength); + } + + public static class TlvManagementAddressBuilderImpl implements LldpUnit.LldpUnitBuilder { + private final ManagementAddressSubType addressSubType; + private final IpAddress ipAddress; + private final short interfaceSubType; + private final long interfaceNumber; + private final short oidStringLength; + + public TlvManagementAddressBuilderImpl( + ManagementAddressSubType addressSubType, + IpAddress ipAddress, + short interfaceSubType, + long interfaceNumber, + short oidStringLength) { + this.addressSubType = addressSubType; + this.ipAddress = ipAddress; + this.interfaceSubType = interfaceSubType; + this.interfaceNumber = interfaceNumber; + this.oidStringLength = oidStringLength; + } + + public TlvManagementAddress build(int tlvIdLength) { + TlvManagementAddress tlvManagementAddress = + new TlvManagementAddress( + tlvIdLength, + addressSubType, + ipAddress, + interfaceSubType, + interfaceNumber, + oidStringLength); + return tlvManagementAddress; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvManagementAddress)) { + return false; + } + TlvManagementAddress that = (TlvManagementAddress) o; + return (getAddressSubType() == that.getAddressSubType()) + && (getIpAddress() == that.getIpAddress()) + && (getInterfaceSubType() == that.getInterfaceSubType()) + && (getInterfaceNumber() == that.getInterfaceNumber()) + && (getOidStringLength() == that.getOidStringLength()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getAddressSubType(), + getIpAddress(), + getInterfaceSubType(), + getInterfaceNumber(), + getOidStringLength()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java new file mode 100644 index 00000000000..bb6e4336b77 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificIeee8023.java @@ -0,0 +1,210 @@ +/* + * 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.profinet.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 TlvOrgSpecificIeee8023 extends TlvOrganizationSpecificUnit implements Message { + + // Accessors for discriminator values. + public Long getUniqueCode() { + return (long) 0x00120F; + } + + // Properties. + protected final short subType; + protected final short negotiationSupport; + protected final int negotiationCapability; + protected final int operationalMauType; + + public TlvOrgSpecificIeee8023( + short subType, short negotiationSupport, int negotiationCapability, int operationalMauType) { + super(); + this.subType = subType; + this.negotiationSupport = negotiationSupport; + this.negotiationCapability = negotiationCapability; + this.operationalMauType = operationalMauType; + } + + public short getSubType() { + return subType; + } + + public short getNegotiationSupport() { + return negotiationSupport; + } + + public int getNegotiationCapability() { + return negotiationCapability; + } + + public int getOperationalMauType() { + return operationalMauType; + } + + @Override + protected void serializeTlvOrganizationSpecificUnitChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvOrgSpecificIeee8023"); + + // Simple Field (subType) + writeSimpleField("subType", subType, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (negotiationSupport) + writeSimpleField("negotiationSupport", negotiationSupport, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (negotiationCapability) + writeSimpleField( + "negotiationCapability", negotiationCapability, writeUnsignedInt(writeBuffer, 16)); + + // Simple Field (operationalMauType) + writeSimpleField("operationalMauType", operationalMauType, writeUnsignedInt(writeBuffer, 16)); + + writeBuffer.popContext("TlvOrgSpecificIeee8023"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvOrgSpecificIeee8023 _value = this; + + // Simple field (subType) + lengthInBits += 8; + + // Simple field (negotiationSupport) + lengthInBits += 8; + + // Simple field (negotiationCapability) + lengthInBits += 16; + + // Simple field (operationalMauType) + lengthInBits += 16; + + return lengthInBits; + } + + public static TlvOrganizationSpecificUnitBuilder staticParseTlvOrganizationSpecificUnitBuilder( + ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("TlvOrgSpecificIeee8023"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + short subType = readSimpleField("subType", readUnsignedShort(readBuffer, 8)); + + short negotiationSupport = + readSimpleField("negotiationSupport", readUnsignedShort(readBuffer, 8)); + + int negotiationCapability = + readSimpleField("negotiationCapability", readUnsignedInt(readBuffer, 16)); + + int operationalMauType = readSimpleField("operationalMauType", readUnsignedInt(readBuffer, 16)); + + readBuffer.closeContext("TlvOrgSpecificIeee8023"); + // Create the instance + return new TlvOrgSpecificIeee8023BuilderImpl( + subType, negotiationSupport, negotiationCapability, operationalMauType); + } + + public static class TlvOrgSpecificIeee8023BuilderImpl + implements TlvOrganizationSpecificUnit.TlvOrganizationSpecificUnitBuilder { + private final short subType; + private final short negotiationSupport; + private final int negotiationCapability; + private final int operationalMauType; + + public TlvOrgSpecificIeee8023BuilderImpl( + short subType, + short negotiationSupport, + int negotiationCapability, + int operationalMauType) { + this.subType = subType; + this.negotiationSupport = negotiationSupport; + this.negotiationCapability = negotiationCapability; + this.operationalMauType = operationalMauType; + } + + public TlvOrgSpecificIeee8023 build() { + TlvOrgSpecificIeee8023 tlvOrgSpecificIeee8023 = + new TlvOrgSpecificIeee8023( + subType, negotiationSupport, negotiationCapability, operationalMauType); + return tlvOrgSpecificIeee8023; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvOrgSpecificIeee8023)) { + return false; + } + TlvOrgSpecificIeee8023 that = (TlvOrgSpecificIeee8023) o; + return (getSubType() == that.getSubType()) + && (getNegotiationSupport() == that.getNegotiationSupport()) + && (getNegotiationCapability() == that.getNegotiationCapability()) + && (getOperationalMauType() == that.getOperationalMauType()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getSubType(), + getNegotiationSupport(), + getNegotiationCapability(), + getOperationalMauType()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java new file mode 100644 index 00000000000..daa2a9034fd --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibus.java @@ -0,0 +1,145 @@ +/* + * 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.profinet.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 TlvOrgSpecificProfibus extends TlvOrganizationSpecificUnit implements Message { + + // Accessors for discriminator values. + public Long getUniqueCode() { + return (long) 0x000ECF; + } + + // Properties. + protected final TlvOrgSpecificProfibusUnit specificUnit; + + public TlvOrgSpecificProfibus(TlvOrgSpecificProfibusUnit specificUnit) { + super(); + this.specificUnit = specificUnit; + } + + public TlvOrgSpecificProfibusUnit getSpecificUnit() { + return specificUnit; + } + + @Override + protected void serializeTlvOrganizationSpecificUnitChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvOrgSpecificProfibus"); + + // Simple Field (specificUnit) + writeSimpleField("specificUnit", specificUnit, new DataWriterComplexDefault<>(writeBuffer)); + + writeBuffer.popContext("TlvOrgSpecificProfibus"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvOrgSpecificProfibus _value = this; + + // Simple field (specificUnit) + lengthInBits += specificUnit.getLengthInBits(); + + return lengthInBits; + } + + public static TlvOrganizationSpecificUnitBuilder staticParseTlvOrganizationSpecificUnitBuilder( + ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("TlvOrgSpecificProfibus"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + TlvOrgSpecificProfibusUnit specificUnit = + readSimpleField( + "specificUnit", + new DataReaderComplexDefault<>( + () -> TlvOrgSpecificProfibusUnit.staticParse(readBuffer), readBuffer)); + + readBuffer.closeContext("TlvOrgSpecificProfibus"); + // Create the instance + return new TlvOrgSpecificProfibusBuilderImpl(specificUnit); + } + + public static class TlvOrgSpecificProfibusBuilderImpl + implements TlvOrganizationSpecificUnit.TlvOrganizationSpecificUnitBuilder { + private final TlvOrgSpecificProfibusUnit specificUnit; + + public TlvOrgSpecificProfibusBuilderImpl(TlvOrgSpecificProfibusUnit specificUnit) { + this.specificUnit = specificUnit; + } + + public TlvOrgSpecificProfibus build() { + TlvOrgSpecificProfibus tlvOrgSpecificProfibus = new TlvOrgSpecificProfibus(specificUnit); + return tlvOrgSpecificProfibus; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvOrgSpecificProfibus)) { + return false; + } + TlvOrgSpecificProfibus that = (TlvOrgSpecificProfibus) o; + return (getSpecificUnit() == that.getSpecificUnit()) && super.equals(that) && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getSpecificUnit()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java new file mode 100644 index 00000000000..c0b137cbce8 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrgSpecificProfibusUnit.java @@ -0,0 +1,159 @@ +/* + * 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.profinet.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 TlvOrgSpecificProfibusUnit implements Message { + + // Abstract accessors for discriminator values. + public abstract TlvProfibusSubType getSubType(); + + public TlvOrgSpecificProfibusUnit() { + super(); + } + + protected abstract void serializeTlvOrgSpecificProfibusUnitChild(WriteBuffer writeBuffer) + throws SerializationException; + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvOrgSpecificProfibusUnit"); + + // Discriminator Field (subType) (Used as input to a switch field) + writeDiscriminatorEnumField( + "subType", + "TlvProfibusSubType", + getSubType(), + new DataWriterEnumDefault<>( + TlvProfibusSubType::getValue, + TlvProfibusSubType::name, + writeUnsignedShort(writeBuffer, 8))); + + // Switch field (Serialize the sub-type) + serializeTlvOrgSpecificProfibusUnitChild(writeBuffer); + + writeBuffer.popContext("TlvOrgSpecificProfibusUnit"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + TlvOrgSpecificProfibusUnit _value = this; + + // Discriminator Field (subType) + lengthInBits += 8; + + // Length of sub-type elements will be added by sub-type... + + return lengthInBits; + } + + public static TlvOrgSpecificProfibusUnit staticParse(ReadBuffer readBuffer, Object... args) + throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static TlvOrgSpecificProfibusUnit staticParse(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("TlvOrgSpecificProfibusUnit"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + TlvProfibusSubType subType = + readDiscriminatorField( + "subType", + new DataReaderEnumDefault<>( + TlvProfibusSubType::enumForValue, readUnsignedShort(readBuffer, 8))); + + // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) + TlvOrgSpecificProfibusUnitBuilder builder = null; + if (EvaluationHelper.equals(subType, TlvProfibusSubType.PORT_STATUS)) { + builder = + TlvProfibusSubTypePortStatus.staticParseTlvOrgSpecificProfibusUnitBuilder(readBuffer); + } else if (EvaluationHelper.equals(subType, TlvProfibusSubType.CHASSIS_MAC)) { + builder = + TlvProfibusSubTypeChassisMac.staticParseTlvOrgSpecificProfibusUnitBuilder(readBuffer); + } + if (builder == null) { + throw new ParseException( + "Unsupported case for discriminated type" + " parameters [" + "subType=" + subType + "]"); + } + + readBuffer.closeContext("TlvOrgSpecificProfibusUnit"); + // Create the instance + TlvOrgSpecificProfibusUnit _tlvOrgSpecificProfibusUnit = builder.build(); + return _tlvOrgSpecificProfibusUnit; + } + + public interface TlvOrgSpecificProfibusUnitBuilder { + TlvOrgSpecificProfibusUnit build(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvOrgSpecificProfibusUnit)) { + return false; + } + TlvOrgSpecificProfibusUnit that = (TlvOrgSpecificProfibusUnit) 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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java new file mode 100644 index 00000000000..12357562db2 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecific.java @@ -0,0 +1,151 @@ +/* + * 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.profinet.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 TlvOrganizationSpecific extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.ORGANIZATION_SPECIFIC; + } + + // Properties. + protected final TlvOrganizationSpecificUnit organizationSpecificUnit; + + public TlvOrganizationSpecific( + int tlvIdLength, TlvOrganizationSpecificUnit organizationSpecificUnit) { + super(tlvIdLength); + this.organizationSpecificUnit = organizationSpecificUnit; + } + + public TlvOrganizationSpecificUnit getOrganizationSpecificUnit() { + return organizationSpecificUnit; + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvOrganizationSpecific"); + + // Simple Field (organizationSpecificUnit) + writeSimpleField( + "organizationSpecificUnit", + organizationSpecificUnit, + new DataWriterComplexDefault<>(writeBuffer)); + + writeBuffer.popContext("TlvOrganizationSpecific"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvOrganizationSpecific _value = this; + + // Simple field (organizationSpecificUnit) + lengthInBits += organizationSpecificUnit.getLengthInBits(); + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("TlvOrganizationSpecific"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + TlvOrganizationSpecificUnit organizationSpecificUnit = + readSimpleField( + "organizationSpecificUnit", + new DataReaderComplexDefault<>( + () -> TlvOrganizationSpecificUnit.staticParse(readBuffer), readBuffer)); + + readBuffer.closeContext("TlvOrganizationSpecific"); + // Create the instance + return new TlvOrganizationSpecificBuilderImpl(organizationSpecificUnit); + } + + public static class TlvOrganizationSpecificBuilderImpl implements LldpUnit.LldpUnitBuilder { + private final TlvOrganizationSpecificUnit organizationSpecificUnit; + + public TlvOrganizationSpecificBuilderImpl( + TlvOrganizationSpecificUnit organizationSpecificUnit) { + this.organizationSpecificUnit = organizationSpecificUnit; + } + + public TlvOrganizationSpecific build(int tlvIdLength) { + TlvOrganizationSpecific tlvOrganizationSpecific = + new TlvOrganizationSpecific(tlvIdLength, organizationSpecificUnit); + return tlvOrganizationSpecific; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvOrganizationSpecific)) { + return false; + } + TlvOrganizationSpecific that = (TlvOrganizationSpecific) o; + return (getOrganizationSpecificUnit() == that.getOrganizationSpecificUnit()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getOrganizationSpecificUnit()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java new file mode 100644 index 00000000000..f396141ab18 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvOrganizationSpecificUnit.java @@ -0,0 +1,150 @@ +/* + * 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.profinet.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 TlvOrganizationSpecificUnit implements Message { + + // Abstract accessors for discriminator values. + public abstract Long getUniqueCode(); + + public TlvOrganizationSpecificUnit() { + super(); + } + + protected abstract void serializeTlvOrganizationSpecificUnitChild(WriteBuffer writeBuffer) + throws SerializationException; + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvOrganizationSpecificUnit"); + + // Discriminator Field (uniqueCode) (Used as input to a switch field) + writeDiscriminatorField("uniqueCode", getUniqueCode(), writeUnsignedLong(writeBuffer, 24)); + + // Switch field (Serialize the sub-type) + serializeTlvOrganizationSpecificUnitChild(writeBuffer); + + writeBuffer.popContext("TlvOrganizationSpecificUnit"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + TlvOrganizationSpecificUnit _value = this; + + // Discriminator Field (uniqueCode) + lengthInBits += 24; + + // Length of sub-type elements will be added by sub-type... + + return lengthInBits; + } + + public static TlvOrganizationSpecificUnit staticParse(ReadBuffer readBuffer, Object... args) + throws ParseException { + PositionAware positionAware = readBuffer; + return staticParse(readBuffer); + } + + public static TlvOrganizationSpecificUnit staticParse(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("TlvOrganizationSpecificUnit"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + long uniqueCode = readDiscriminatorField("uniqueCode", readUnsignedLong(readBuffer, 24)); + + // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type) + TlvOrganizationSpecificUnitBuilder builder = null; + if (EvaluationHelper.equals(uniqueCode, (long) 0x000ECF)) { + builder = TlvOrgSpecificProfibus.staticParseTlvOrganizationSpecificUnitBuilder(readBuffer); + } else if (EvaluationHelper.equals(uniqueCode, (long) 0x00120F)) { + builder = TlvOrgSpecificIeee8023.staticParseTlvOrganizationSpecificUnitBuilder(readBuffer); + } + if (builder == null) { + throw new ParseException( + "Unsupported case for discriminated type" + + " parameters [" + + "uniqueCode=" + + uniqueCode + + "]"); + } + + readBuffer.closeContext("TlvOrganizationSpecificUnit"); + // Create the instance + TlvOrganizationSpecificUnit _tlvOrganizationSpecificUnit = builder.build(); + return _tlvOrganizationSpecificUnit; + } + + public interface TlvOrganizationSpecificUnitBuilder { + TlvOrganizationSpecificUnit build(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvOrganizationSpecificUnit)) { + return false; + } + TlvOrganizationSpecificUnit that = (TlvOrganizationSpecificUnit) 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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java new file mode 100644 index 00000000000..6cb504968fb --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvPortId.java @@ -0,0 +1,159 @@ +/* + * 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.profinet.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 TlvPortId extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.PORT_ID; + } + + // Properties. + protected final short portIdSubType; + protected final String portId; + + public TlvPortId(int tlvIdLength, short portIdSubType, String portId) { + super(tlvIdLength); + this.portIdSubType = portIdSubType; + this.portId = portId; + } + + public short getPortIdSubType() { + return portIdSubType; + } + + public String getPortId() { + return portId; + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvPortId"); + + // Simple Field (portIdSubType) + writeSimpleField("portIdSubType", portIdSubType, writeUnsignedShort(writeBuffer, 8)); + + // Simple Field (portId) + writeSimpleField("portId", portId, writeString(writeBuffer, (((tlvIdLength) - (1))) * (8))); + + writeBuffer.popContext("TlvPortId"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvPortId _value = this; + + // Simple field (portIdSubType) + lengthInBits += 8; + + // Simple field (portId) + lengthInBits += (((tlvIdLength) - (1))) * (8); + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder( + ReadBuffer readBuffer, Integer tlvIdLength) throws ParseException { + readBuffer.pullContext("TlvPortId"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + short portIdSubType = readSimpleField("portIdSubType", readUnsignedShort(readBuffer, 8)); + + String portId = + readSimpleField("portId", readString(readBuffer, (((tlvIdLength) - (1))) * (8))); + + readBuffer.closeContext("TlvPortId"); + // Create the instance + return new TlvPortIdBuilderImpl(portIdSubType, portId); + } + + public static class TlvPortIdBuilderImpl implements LldpUnit.LldpUnitBuilder { + private final short portIdSubType; + private final String portId; + + public TlvPortIdBuilderImpl(short portIdSubType, String portId) { + this.portIdSubType = portIdSubType; + this.portId = portId; + } + + public TlvPortId build(int tlvIdLength) { + TlvPortId tlvPortId = new TlvPortId(tlvIdLength, portIdSubType, portId); + return tlvPortId; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvPortId)) { + return false; + } + TlvPortId that = (TlvPortId) o; + return (getPortIdSubType() == that.getPortIdSubType()) + && (getPortId() == that.getPortId()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getPortIdSubType(), getPortId()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubType.java new file mode 100644 index 00000000000..6610c3a5ad5 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubType.java @@ -0,0 +1,55 @@ +/* + * 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.profinet.readwrite; + +import java.util.HashMap; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum TlvProfibusSubType { + PORT_STATUS((short) 0x02), + CHASSIS_MAC((short) 0x05); + private static final Map map; + + static { + map = new HashMap<>(); + for (TlvProfibusSubType value : TlvProfibusSubType.values()) { + map.put((short) value.getValue(), value); + } + } + + private short value; + + TlvProfibusSubType(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static TlvProfibusSubType enumForValue(short value) { + return map.get(value); + } + + public static Boolean isDefined(short value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java new file mode 100644 index 00000000000..f04d0b0e653 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypeChassisMac.java @@ -0,0 +1,145 @@ +/* + * 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.profinet.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 TlvProfibusSubTypeChassisMac extends TlvOrgSpecificProfibusUnit implements Message { + + // Accessors for discriminator values. + public TlvProfibusSubType getSubType() { + return TlvProfibusSubType.CHASSIS_MAC; + } + + // Properties. + protected final MacAddress macAddress; + + public TlvProfibusSubTypeChassisMac(MacAddress macAddress) { + super(); + this.macAddress = macAddress; + } + + public MacAddress getMacAddress() { + return macAddress; + } + + @Override + protected void serializeTlvOrgSpecificProfibusUnitChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvProfibusSubTypeChassisMac"); + + // Simple Field (macAddress) + writeSimpleField("macAddress", macAddress, new DataWriterComplexDefault<>(writeBuffer)); + + writeBuffer.popContext("TlvProfibusSubTypeChassisMac"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvProfibusSubTypeChassisMac _value = this; + + // Simple field (macAddress) + lengthInBits += macAddress.getLengthInBits(); + + return lengthInBits; + } + + public static TlvOrgSpecificProfibusUnitBuilder staticParseTlvOrgSpecificProfibusUnitBuilder( + ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("TlvProfibusSubTypeChassisMac"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + MacAddress macAddress = + readSimpleField( + "macAddress", + new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer)); + + readBuffer.closeContext("TlvProfibusSubTypeChassisMac"); + // Create the instance + return new TlvProfibusSubTypeChassisMacBuilderImpl(macAddress); + } + + public static class TlvProfibusSubTypeChassisMacBuilderImpl + implements TlvOrgSpecificProfibusUnit.TlvOrgSpecificProfibusUnitBuilder { + private final MacAddress macAddress; + + public TlvProfibusSubTypeChassisMacBuilderImpl(MacAddress macAddress) { + this.macAddress = macAddress; + } + + public TlvProfibusSubTypeChassisMac build() { + TlvProfibusSubTypeChassisMac tlvProfibusSubTypeChassisMac = + new TlvProfibusSubTypeChassisMac(macAddress); + return tlvProfibusSubTypeChassisMac; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvProfibusSubTypeChassisMac)) { + return false; + } + TlvProfibusSubTypeChassisMac that = (TlvProfibusSubTypeChassisMac) o; + return (getMacAddress() == that.getMacAddress()) && super.equals(that) && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getMacAddress()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java new file mode 100644 index 00000000000..3c926fac963 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvProfibusSubTypePortStatus.java @@ -0,0 +1,249 @@ +/* + * 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.profinet.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 TlvProfibusSubTypePortStatus extends TlvOrgSpecificProfibusUnit implements Message { + + // Accessors for discriminator values. + public TlvProfibusSubType getSubType() { + return TlvProfibusSubType.PORT_STATUS; + } + + // Properties. + protected final int rtClass2PortStatus; + protected final boolean preample; + protected final boolean fragmentation; + protected final byte rtClass3PortStatus; + + // Reserved Fields + private Byte reservedField0; + private Integer reservedField1; + + public TlvProfibusSubTypePortStatus( + int rtClass2PortStatus, boolean preample, boolean fragmentation, byte rtClass3PortStatus) { + super(); + this.rtClass2PortStatus = rtClass2PortStatus; + this.preample = preample; + this.fragmentation = fragmentation; + this.rtClass3PortStatus = rtClass3PortStatus; + } + + public int getRtClass2PortStatus() { + return rtClass2PortStatus; + } + + public boolean getPreample() { + return preample; + } + + public boolean getFragmentation() { + return fragmentation; + } + + public byte getRtClass3PortStatus() { + return rtClass3PortStatus; + } + + @Override + protected void serializeTlvOrgSpecificProfibusUnitChild(WriteBuffer writeBuffer) + throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvProfibusSubTypePortStatus"); + + // Simple Field (rtClass2PortStatus) + writeSimpleField("rtClass2PortStatus", rtClass2PortStatus, writeUnsignedInt(writeBuffer, 16)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField0 != null ? reservedField0 : (byte) 0x00, + writeUnsignedByte(writeBuffer, 2)); + + // Simple Field (preample) + writeSimpleField("preample", preample, writeBoolean(writeBuffer)); + + // Simple Field (fragmentation) + writeSimpleField("fragmentation", fragmentation, writeBoolean(writeBuffer)); + + // Reserved Field (reserved) + writeReservedField( + "reserved", + reservedField1 != null ? reservedField1 : (int) 0x00, + writeUnsignedInt(writeBuffer, 9)); + + // Simple Field (rtClass3PortStatus) + writeSimpleField("rtClass3PortStatus", rtClass3PortStatus, writeUnsignedByte(writeBuffer, 3)); + + writeBuffer.popContext("TlvProfibusSubTypePortStatus"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvProfibusSubTypePortStatus _value = this; + + // Simple field (rtClass2PortStatus) + lengthInBits += 16; + + // Reserved Field (reserved) + lengthInBits += 2; + + // Simple field (preample) + lengthInBits += 1; + + // Simple field (fragmentation) + lengthInBits += 1; + + // Reserved Field (reserved) + lengthInBits += 9; + + // Simple field (rtClass3PortStatus) + lengthInBits += 3; + + return lengthInBits; + } + + public static TlvOrgSpecificProfibusUnitBuilder staticParseTlvOrgSpecificProfibusUnitBuilder( + ReadBuffer readBuffer) throws ParseException { + readBuffer.pullContext("TlvProfibusSubTypePortStatus"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int rtClass2PortStatus = readSimpleField("rtClass2PortStatus", readUnsignedInt(readBuffer, 16)); + + Byte reservedField0 = + readReservedField("reserved", readUnsignedByte(readBuffer, 2), (byte) 0x00); + + boolean preample = readSimpleField("preample", readBoolean(readBuffer)); + + boolean fragmentation = readSimpleField("fragmentation", readBoolean(readBuffer)); + + Integer reservedField1 = + readReservedField("reserved", readUnsignedInt(readBuffer, 9), (int) 0x00); + + byte rtClass3PortStatus = + readSimpleField("rtClass3PortStatus", readUnsignedByte(readBuffer, 3)); + + readBuffer.closeContext("TlvProfibusSubTypePortStatus"); + // Create the instance + return new TlvProfibusSubTypePortStatusBuilderImpl( + rtClass2PortStatus, + preample, + fragmentation, + rtClass3PortStatus, + reservedField0, + reservedField1); + } + + public static class TlvProfibusSubTypePortStatusBuilderImpl + implements TlvOrgSpecificProfibusUnit.TlvOrgSpecificProfibusUnitBuilder { + private final int rtClass2PortStatus; + private final boolean preample; + private final boolean fragmentation; + private final byte rtClass3PortStatus; + private final Byte reservedField0; + private final Integer reservedField1; + + public TlvProfibusSubTypePortStatusBuilderImpl( + int rtClass2PortStatus, + boolean preample, + boolean fragmentation, + byte rtClass3PortStatus, + Byte reservedField0, + Integer reservedField1) { + this.rtClass2PortStatus = rtClass2PortStatus; + this.preample = preample; + this.fragmentation = fragmentation; + this.rtClass3PortStatus = rtClass3PortStatus; + this.reservedField0 = reservedField0; + this.reservedField1 = reservedField1; + } + + public TlvProfibusSubTypePortStatus build() { + TlvProfibusSubTypePortStatus tlvProfibusSubTypePortStatus = + new TlvProfibusSubTypePortStatus( + rtClass2PortStatus, preample, fragmentation, rtClass3PortStatus); + tlvProfibusSubTypePortStatus.reservedField0 = reservedField0; + tlvProfibusSubTypePortStatus.reservedField1 = reservedField1; + return tlvProfibusSubTypePortStatus; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvProfibusSubTypePortStatus)) { + return false; + } + TlvProfibusSubTypePortStatus that = (TlvProfibusSubTypePortStatus) o; + return (getRtClass2PortStatus() == that.getRtClass2PortStatus()) + && (getPreample() == that.getPreample()) + && (getFragmentation() == that.getFragmentation()) + && (getRtClass3PortStatus() == that.getRtClass3PortStatus()) + && super.equals(that) + && true; + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + getRtClass2PortStatus(), + getPreample(), + getFragmentation(), + getRtClass3PortStatus()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java new file mode 100644 index 00000000000..c99b3e758fa --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvTimeToLive.java @@ -0,0 +1,139 @@ +/* + * 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.profinet.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 TlvTimeToLive extends LldpUnit implements Message { + + // Accessors for discriminator values. + public TlvType getTlvId() { + return TlvType.TIME_TO_LIVE; + } + + // Properties. + protected final int tlvTimeToLiveUnit; + + public TlvTimeToLive(int tlvIdLength, int tlvTimeToLiveUnit) { + super(tlvIdLength); + this.tlvTimeToLiveUnit = tlvTimeToLiveUnit; + } + + public int getTlvTimeToLiveUnit() { + return tlvTimeToLiveUnit; + } + + @Override + protected void serializeLldpUnitChild(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("TlvTimeToLive"); + + // Simple Field (tlvTimeToLiveUnit) + writeSimpleField("tlvTimeToLiveUnit", tlvTimeToLiveUnit, writeUnsignedInt(writeBuffer, 16)); + + writeBuffer.popContext("TlvTimeToLive"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = super.getLengthInBits(); + TlvTimeToLive _value = this; + + // Simple field (tlvTimeToLiveUnit) + lengthInBits += 16; + + return lengthInBits; + } + + public static LldpUnitBuilder staticParseLldpUnitBuilder(ReadBuffer readBuffer) + throws ParseException { + readBuffer.pullContext("TlvTimeToLive"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + int tlvTimeToLiveUnit = readSimpleField("tlvTimeToLiveUnit", readUnsignedInt(readBuffer, 16)); + + readBuffer.closeContext("TlvTimeToLive"); + // Create the instance + return new TlvTimeToLiveBuilderImpl(tlvTimeToLiveUnit); + } + + public static class TlvTimeToLiveBuilderImpl implements LldpUnit.LldpUnitBuilder { + private final int tlvTimeToLiveUnit; + + public TlvTimeToLiveBuilderImpl(int tlvTimeToLiveUnit) { + this.tlvTimeToLiveUnit = tlvTimeToLiveUnit; + } + + public TlvTimeToLive build(int tlvIdLength) { + TlvTimeToLive tlvTimeToLive = new TlvTimeToLive(tlvIdLength, tlvTimeToLiveUnit); + return tlvTimeToLive; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TlvTimeToLive)) { + return false; + } + TlvTimeToLive that = (TlvTimeToLive) o; + return (getTlvTimeToLiveUnit() == that.getTlvTimeToLiveUnit()) && super.equals(that) && true; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getTlvTimeToLiveUnit()); + } + + @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/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvType.java new file mode 100644 index 00000000000..96c94d79dc4 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/TlvType.java @@ -0,0 +1,63 @@ +/* + * 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.profinet.readwrite; + +import java.util.HashMap; +import java.util.Map; + +// Code generated by code-generation. DO NOT EDIT. + +public enum TlvType { + END_OF_LLDP((short) 0x00), + CHASSIS_ID((short) 0x01), + PORT_ID((short) 0x02), + TIME_TO_LIVE((short) 0x03), + PORT_DESCRIPTION((short) 0x04), + SYSTEM_NAME((short) 0x05), + SYSTEM_DESCRIPTION((short) 0x06), + SYSTEM_CAPABILITIES((short) 0x07), + MANAGEMENT_ADDRESS((short) 0x08), + ORGANIZATION_SPECIFIC((short) 0x7F); + private static final Map map; + + static { + map = new HashMap<>(); + for (TlvType value : TlvType.values()) { + map.put((short) value.getValue(), value); + } + } + + private short value; + + TlvType(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static TlvType enumForValue(short value) { + return map.get(value); + } + + public static Boolean isDefined(short value) { + return map.containsKey(value); + } +} diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java new file mode 100644 index 00000000000..f473813127a --- /dev/null +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java @@ -0,0 +1,147 @@ +/* + * 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.profinet.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 UserData implements Message { + + // Properties. + protected final byte[] data; + + // Arguments. + protected final Long recordDataLength; + + public UserData(byte[] data, Long recordDataLength) { + super(); + this.data = data; + this.recordDataLength = recordDataLength; + } + + public byte[] getData() { + return data; + } + + public void serialize(WriteBuffer writeBuffer) throws SerializationException { + PositionAware positionAware = writeBuffer; + int startPos = positionAware.getPos(); + writeBuffer.pushContext("UserData"); + + // Array Field (data) + writeByteArrayField("data", data, writeByteArray(writeBuffer, 8)); + + writeBuffer.popContext("UserData"); + } + + @Override + public int getLengthInBytes() { + return (int) Math.ceil((float) getLengthInBits() / 8.0); + } + + @Override + public int getLengthInBits() { + int lengthInBits = 0; + UserData _value = this; + + // Array field + if (data != null) { + lengthInBits += 8 * data.length; + } + + return lengthInBits; + } + + public static UserData 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); + } + Long recordDataLength; + if (args[0] instanceof Long) { + recordDataLength = (Long) args[0]; + } else if (args[0] instanceof String) { + recordDataLength = Long.valueOf((String) args[0]); + } else { + throw new PlcRuntimeException( + "Argument 0 expected to be of type Long or a string which is parseable but was " + + args[0].getClass().getName()); + } + return staticParse(readBuffer, recordDataLength); + } + + public static UserData staticParse(ReadBuffer readBuffer, Long recordDataLength) + throws ParseException { + readBuffer.pullContext("UserData"); + PositionAware positionAware = readBuffer; + int startPos = positionAware.getPos(); + int curPos; + + byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength)); + + readBuffer.closeContext("UserData"); + // Create the instance + UserData _userData; + _userData = new UserData(data, recordDataLength); + return _userData; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof UserData)) { + return false; + } + UserData that = (UserData) o; + return (getData() == that.getData()) && true; + } + + @Override + public int hashCode() { + return Objects.hash(getData()); + } + + @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/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 f1ef4355f07..b772f8f917b 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 @@ -23,20 +23,25 @@ import org.apache.plc4x.java.api.metadata.PlcDriverMetadata; import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; import org.apache.plc4x.java.profinet.context.ProfinetDriverContext; +import org.apache.plc4x.java.profinet.device.ProfinetChannel; +import org.apache.plc4x.java.profinet.device.ProfinetDevices; import org.apache.plc4x.java.profinet.discovery.ProfinetPlcDiscoverer; -import org.apache.plc4x.java.profinet.tag.ProfinetTag; -import org.apache.plc4x.java.profinet.tag.ProfinetTagHandler; import org.apache.plc4x.java.profinet.protocol.ProfinetProtocolLogic; 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; -import org.apache.plc4x.java.spi.values.PlcValueHandler; -import org.apache.plc4x.java.spi.configuration.Configuration; +import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer; import org.apache.plc4x.java.spi.optimizer.BaseOptimizer; -import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer; +import org.pcap4j.core.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.HashMap; import java.util.function.ToIntFunction; public class ProfinetDriver extends GeneratedDriverBase { @@ -65,7 +70,14 @@ public boolean canDiscover() { @Override public PlcDiscoveryRequest.Builder discoveryRequestBuilder() { - return new DefaultPlcDiscoveryRequest.Builder(new ProfinetPlcDiscoverer()); + try { + ProfinetChannel channel = new ProfinetChannel(Pcaps.findAllDevs(), new ProfinetDevices(new HashMap<>())); + ProfinetPlcDiscoverer discoverer = new ProfinetPlcDiscoverer(channel); + channel.setDiscoverer(discoverer); + return new DefaultPlcDiscoveryRequest.Builder(discoverer); + } catch (PcapNativeException e) { + throw new RuntimeException(e); + } } @Override @@ -78,17 +90,14 @@ protected String getDefaultTransport() { return "raw"; } - /** - * Modbus doesn't have a login procedure, so there is no need to wait for a login to finish. - * @return false - */ @Override protected boolean awaitSetupComplete() { - return false; + return true; } /** * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish. + * * @return false */ @Override @@ -98,11 +107,21 @@ protected boolean awaitDisconnectComplete() { @Override protected boolean canRead() { - return true; + return false; } @Override protected boolean canWrite() { + return false; + } + + @Override + protected boolean canSubscribe() { + return true; + } + + @Override + protected boolean canBrowse() { return true; } @@ -117,8 +136,8 @@ protected ProfinetTagHandler getTagHandler() { } @Override - protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { - return new PlcValueHandler(); + protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { + return new org.apache.plc4x.java.spi.values.PlcValueHandler(); } @Override @@ -131,7 +150,9 @@ protected ProtocolStackConfigurer getStackConfigurer() { .build(); } - /** Estimate the Length of a Packet */ + /** + * Estimate the Length of a Packet + */ public static class ByteLengthEstimator implements ToIntFunction { @Override public int applyAsInt(ByteBuf byteBuf) { @@ -140,11 +161,12 @@ public int applyAsInt(ByteBuf byteBuf) { } return -1; } + } @Override - public ProfinetTag prepareTag(String tagAddress){ - return ProfinetTag.of(tagAddress); + public ProfinetTag prepareTag(String query) { + return ProfinetTag.of(query); } } diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetDiscoveryLogic.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/browse/ProfinetPlcQuery.java similarity index 69% rename from plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetDiscoveryLogic.java rename to plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/browse/ProfinetPlcQuery.java index 7d3e790060c..4c53cfcaca4 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetDiscoveryLogic.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/browse/ProfinetPlcQuery.java @@ -16,17 +16,20 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.plc4x.java.profinet.protocol; +package org.apache.plc4x.java.profinet.browse; -import org.apache.plc4x.java.profinet.readwrite.Ethernet_Frame; -import org.apache.plc4x.java.spi.ConversationContext; -import org.apache.plc4x.java.spi.Plc4xProtocolBase; +import org.apache.plc4x.java.api.model.PlcQuery; -public class ProfinetDiscoveryLogic extends Plc4xProtocolBase { +public class ProfinetPlcQuery implements PlcQuery { - @Override - public void close(ConversationContext context) { + private final String queryString; + public ProfinetPlcQuery(String queryString) { + this.queryString = queryString; + } + @Override + public String getQueryString() { + return queryString; } } diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java index ee3c0c1c378..fd43fa100c1 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/config/ProfinetConfiguration.java @@ -18,10 +18,33 @@ */ package org.apache.plc4x.java.profinet.config; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.apache.plc4x.java.profinet.context.ProfinetDriverContext; +import org.apache.plc4x.java.profinet.device.GsdFileMap; +import org.apache.plc4x.java.profinet.device.ProfinetDevice; +import org.apache.plc4x.java.profinet.device.ProfinetDevices; +import org.apache.plc4x.java.profinet.gsdml.ProfinetISO15745Profile; import org.apache.plc4x.java.spi.configuration.Configuration; +import org.apache.plc4x.java.spi.configuration.ConfigurationParameterConverter; +import org.apache.plc4x.java.spi.configuration.annotations.ConfigurationParameter; +import org.apache.plc4x.java.spi.configuration.annotations.ParameterConverter; +import org.apache.plc4x.java.spi.configuration.annotations.Required; +import org.apache.plc4x.java.spi.configuration.annotations.defaults.IntDefaultValue; +import org.apache.plc4x.java.spi.configuration.annotations.defaults.StringDefaultValue; import org.apache.plc4x.java.transport.rawsocket.RawSocketTransportConfiguration; import org.apache.plc4x.java.utils.pcap.netty.handlers.PacketHandler; +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class ProfinetConfiguration implements Configuration, RawSocketTransportConfiguration { @Override @@ -44,6 +67,129 @@ public PacketHandler getPcapPacketHandler() { return null; } + @Required + @ConfigurationParameter + @ParameterConverter(ProfinetDeviceConvertor.class) + protected ProfinetDevices devices; + + @Required + @ConfigurationParameter("gsddirectory") + @ParameterConverter(ProfinetGsdFileConvertor.class) + static protected GsdFileMap gsdFiles; + + @ConfigurationParameter("sendclockfactor") + @IntDefaultValue(32) + private int sendClockFactor; + + @ConfigurationParameter("reductionratio") + @IntDefaultValue(4) + private int reductionRatio; + + @ConfigurationParameter("watchdogfactor") + @IntDefaultValue(50) + private int watchdogFactor; + + @ConfigurationParameter("dataholdfactor") + @IntDefaultValue(50) + private int dataHoldFactor; + + public static class ProfinetDeviceConvertor implements ConfigurationParameterConverter { + + public static final Pattern DEVICE_NAME_ARRAY_PATTERN = Pattern.compile("^\\[(?:(\\[(?:[\\w-]*){1},(?:[\\w]*){1},\\((?:[\\w]*[, ]?)*\\){1}\\])[, ]?)+\\]"); + public static final Pattern DEVICE_PARAMETERS = Pattern.compile("^(?[\\w-]*){1}[, ]+(?[\\w]*){1}[, ]+\\((?[\\w, ]*)\\)"); + + @Override + public Class getType() { + return ProfinetDevices.class; + } + + @Override + public ProfinetDevices convert(String value) { + + // Split up the connection string into its individual segments. + value = value.replaceAll(" ", "").toUpperCase(); + Matcher matcher = DEVICE_NAME_ARRAY_PATTERN.matcher(value); + + if (!matcher.matches()) { + throw new RuntimeException("Profinet Device Array is not in the correct format " + value + "."); + } + + Map devices = new HashMap<>(); + String[] deviceParameters = value.substring(1, value.length() - 1).replaceAll(" ", "").split("[\\[\\]]"); + for (String deviceParameter : deviceParameters) { + if (deviceParameter.length() > 7) { + matcher = DEVICE_PARAMETERS.matcher(deviceParameter); + if (matcher.matches()) { + devices.put(matcher.group("devicename"), + new ProfinetDevice(matcher.group("devicename"), + matcher.group("deviceaccess"), + matcher.group("submodules"), + (vendorId, deviceId) -> gsdFiles.getGsdFiles().get("0x" + vendorId + "-0x" + deviceId) + ) + ); + } + } + } + + return new ProfinetDevices(devices); + } + } + + public static class ProfinetGsdFileConvertor implements ConfigurationParameterConverter { + + @Override + public Class getType() { + return GsdFileMap.class; + } + + @Override + public GsdFileMap convert(String value) { + HashMap gsdFiles = new HashMap<>(); + try { + DirectoryStream stream = Files.newDirectoryStream(Paths.get(value)); + XmlMapper xmlMapper = new XmlMapper(); + for (Path file : stream) { + try { + ProfinetISO15745Profile gsdFile = xmlMapper.readValue(file.toFile(), ProfinetISO15745Profile.class); + if (gsdFile.getProfileHeader() != null && gsdFile.getProfileHeader().getProfileIdentification().equals("PROFINET Device Profile") && gsdFile.getProfileHeader().getProfileClassID().equals("Device")) { + String id = gsdFile.getProfileBody().getDeviceIdentity().getVendorId() + "-" + gsdFile.getProfileBody().getDeviceIdentity().getDeviceID(); + gsdFiles.put(id, gsdFile); + } + } catch (IOException ignored) { + } + } + } catch (IOException e) { + throw new RuntimeException("GSDML File directory is un-readable"); + } + return new GsdFileMap(gsdFiles); + } + + } + + public ProfinetDevices getDevices() { + return this.devices; + } + + public int getSendClockFactor() { + return sendClockFactor; + } + + public int getReductionRatio() { + return reductionRatio; + } + + public int getWatchdogFactor() { + return watchdogFactor; + } + + public int getDataHoldFactor() { + return dataHoldFactor; + } + + public static GsdFileMap getGsdFiles() { + return gsdFiles; + } + @Override public String toString() { return "Configuration{" + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDeviceContext.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDeviceContext.java new file mode 100644 index 00000000000..e0152ce053f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDeviceContext.java @@ -0,0 +1,529 @@ +/* + * 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.profinet.context; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; +import org.apache.plc4x.java.api.exceptions.PlcConnectionException; +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; +import org.apache.plc4x.java.profinet.device.*; +import org.apache.plc4x.java.profinet.gsdml.*; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.spi.ConversationContext; +import org.apache.plc4x.java.spi.configuration.HasConfiguration; +import org.apache.plc4x.java.spi.context.DriverContext; +import org.apache.plc4x.java.spi.generation.*; + +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ProfinetDeviceContext implements DriverContext, HasConfiguration { + + public static final int DEFAULT_UDP_PORT = 34964; + public static final int DEFAULT_ARGS_MAXIMUM = 16696; + public static final int DEFAULT_MAX_ARRAY_COUNT = 16696; + public static final int DEFAULT_ACTIVITY_TIMEOUT = 600; + public static final int UDP_RT_PORT = 0x8892; + public static final short BLOCK_VERSION_HIGH = 1; + public static final short BLOCK_VERSION_LOW = 0; + public static final MacAddress DEFAULT_EMPTY_MAC_ADDRESS; + public static final Pattern RANGE_PATTERN = Pattern.compile("(?\\d+)\\.\\.(?\\d+)"); + + static { + try { + DEFAULT_EMPTY_MAC_ADDRESS = new MacAddress(Hex.decodeHex("000000000000")); + } catch (DecoderException e) { + throw new RuntimeException(e); + } + } + public static final Uuid ARUUID; + static { + try { + ARUUID = new Uuid(Hex.decodeHex(UUID.randomUUID().toString().replace("-", ""))); + } catch (DecoderException e) { + throw new RuntimeException(e); + } + } + public static final int DEFAULT_SEND_UDP_PORT = 50000; + public static final String DEFAULT_PLC4X_STATION_NAME = "plc4x"; + public static final int DEFAULT_IO_DATA_SIZE = 40; + + private MacAddress localMacAddress; + private final DceRpc_ActivityUuid uuid; + private ProfinetConfiguration configuration; + private InetAddress localIpAddress; + private DatagramSocket socket; + private ProfinetChannel channel; + private MacAddress macAddress; + private ConversationContext context; + private ProfinetDeviceState state = ProfinetDeviceState.IDLE; + private boolean lldpReceived = false; + private boolean dcpReceived = false; + private String ipAddress; + private String portId; + private PnIoCm_Block_IoCrReq inputReq = null; + private PnIoCm_Block_IoCrReq outputReq = null; + private String[] subModules; + private AtomicInteger sessionKeyGenerator = new AtomicInteger(1); + private AtomicInteger identificationGenerator = new AtomicInteger(1); + private String deviceTypeName; + private String deviceName; + private ProfinetISO15745Profile gsdFile; + private boolean nonLegacyStartupMode = false; + private int frameId = 0xBBF0; + private Map> queue = new HashMap<>(); + private int sessionKey; + private int sourcePort = DEFAULT_SEND_UDP_PORT; + private int destinationPort = DEFAULT_UDP_PORT; + private Map subscriptionHandles = new HashMap<>(); + private String deviceAccess; + private ProfinetDeviceAccessPointItem deviceAccessItem; + private ProfinetModule[] modules; + private long sequenceNumber; + private DceRpc_ActivityUuid activityUuid; + + public ProfinetDeviceContext() { + // Generate a new Activity Id, which will be used throughout the connection. + this.uuid = generateActivityUuid(); + } + + protected static DceRpc_ActivityUuid generateActivityUuid() { + UUID number = UUID.randomUUID(); + try { + WriteBufferByteBased wb = new WriteBufferByteBased(128); + wb.writeLong(64, number.getMostSignificantBits()); + wb.writeLong(64, number.getLeastSignificantBits()); + + ReadBuffer rb = new ReadBufferByteBased(wb.getBytes()); + return new DceRpc_ActivityUuid(rb.readLong(32), rb.readInt(16), rb.readInt(16), rb.readByteArray(8)); + } catch (SerializationException | ParseException e) { + // Ignore ... this should actually never happen. + } + return null; + } + + public int getAndIncrementIdentification() { + int id = identificationGenerator.getAndIncrement(); + if (id == 0xFFFF) { + identificationGenerator.set(1); + } + return id; + } + + public int getIncrementAndGetFrameId() { + frameId += 1; + return frameId; + } + + public int getAndIncrementSessionKey() { + // Generate a new session key. + Integer sessionKey = sessionKeyGenerator.getAndIncrement(); + // Reset the session key as soon as it reaches the max for a 16 bit uint + if (sessionKeyGenerator.get() == 0xFFFF) { + sessionKeyGenerator.set(1); + } + return sessionKey; + } + + @Override + public void setConfiguration(ProfinetConfiguration configuration) { + this.configuration = configuration; + } + + public MacAddress getLocalMacAddress() { + return localMacAddress; + } + + public void setLocalMacAddress(MacAddress localMacAddress) { + this.localMacAddress = localMacAddress; + } + + public DceRpc_ActivityUuid getUuid() { + return uuid; + } + + public ProfinetConfiguration getConfiguration() { + return configuration; + } + + public InetAddress getLocalIpAddress() { + return localIpAddress; + } + + public void setLocalIpAddress(InetAddress localIpAddress) { + this.localIpAddress = localIpAddress; + } + + public ProfinetChannel getChannel() { + return channel; + } + + public void setChannel(ProfinetChannel channel) { + this.channel = channel; + } + + public MacAddress getMacAddress() { + return macAddress; + } + + public void setMacAddress(MacAddress macAddress) { + this.macAddress = macAddress; + } + + public ConversationContext getContext() { + return context; + } + + public void setContext(ConversationContext context) { + this.context = context; + } + + public ProfinetDeviceState getState() { + return state; + } + + public void setState(ProfinetDeviceState state) { + this.state = state; + } + + public boolean isLldpReceived() { + return lldpReceived; + } + + public void setLldpReceived(boolean lldpReceived) { + this.lldpReceived = lldpReceived; + } + + public boolean isDcpReceived() { + return dcpReceived; + } + + public void setDcpReceived(boolean dcpReceived) { + this.dcpReceived = dcpReceived; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public String getPortId() { + return portId; + } + + public void setPortId(String portId) { + this.portId = portId; + } + + public PnIoCm_Block_IoCrReq getInputReq() { + return inputReq; + } + + public void setInputReq(PnIoCm_Block_IoCrReq inputReq) { + this.inputReq = inputReq; + } + + public PnIoCm_Block_IoCrReq getOutputReq() { + return outputReq; + } + + public void setOutputReq(PnIoCm_Block_IoCrReq outputReq) { + this.outputReq = outputReq; + } + + public String[] getSubModules() { + return subModules; + } + + public void setSubModules(String subModules) { + String[] splitModules = subModules.split(","); + ArrayList arrayList = new ArrayList<>(); + for (String s : splitModules) { + String normalizedString = s.trim(); + arrayList.add(normalizedString); + } + this.subModules = new String[arrayList.size()]; + arrayList.toArray(this.subModules); + } + + public List getInputIoPsApiBlocks() { + List inputIoPsApiBlocks = new ArrayList<>(); + for (ProfinetModule module : modules) { + inputIoPsApiBlocks.addAll(module.getInputIoPsApiBlocks()); + } + return inputIoPsApiBlocks; + } + + public List getInputIoCsApiBlocks() { + List inputIoCsApiBlocks = new ArrayList<>(); + for (ProfinetModule module : modules) { + inputIoCsApiBlocks.addAll(module.getInputIoCsApiBlocks()); + } + return inputIoCsApiBlocks; + } + + public List getOutputIoPsApiBlocks() { + List outputIoPsApiBlocks = new ArrayList<>(); + for (ProfinetModule module : modules) { + outputIoPsApiBlocks.addAll(module.getOutputIoPsApiBlocks()); + } + return outputIoPsApiBlocks; + } + + public List getOutputIoCsApiBlocks() { + List outputIoCsApiBlocks = new ArrayList<>(); + for (ProfinetModule module : modules) { + outputIoCsApiBlocks.addAll(module.getOutputIoCsApiBlocks()); + } + return outputIoCsApiBlocks; + } + + public List getExpectedSubModuleApiBlocks(ProfinetModule module) { + return module.getExpectedSubModuleApiBlocks(); + } + + public List getExpectedSubmoduleReq() { + List expectedSubmoduleReq = new ArrayList<>(); + for (ProfinetModule module : modules) { + if (!(module instanceof ProfinetEmptyModule)) { + expectedSubmoduleReq.add( + new PnIoCm_Block_ExpectedSubmoduleReq((short) 1, (short) 0, + Collections.singletonList( + new PnIoCm_ExpectedSubmoduleBlockReqApi(module.getSlotNumber(), + module.getIdentNumber(), + 0x00000000, + getExpectedSubModuleApiBlocks(module) + ) + ) + ) + ); + } + } + return expectedSubmoduleReq; + } + + public String getDeviceTypeName() { + return deviceTypeName; + } + + public void setDeviceTypeName(String deviceTypeName) { + this.deviceTypeName = deviceTypeName; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public ProfinetISO15745Profile getGsdFile() { + return gsdFile; + } + + public void setGsdFile(ProfinetISO15745Profile gsdFile) throws PlcConnectionException { + this.gsdFile = gsdFile; + extractGSDFileInfo(this.gsdFile); + } + + private void extractGSDFileInfo(ProfinetISO15745Profile gsdFile) throws PlcConnectionException { + + for (ProfinetDeviceAccessPointItem deviceAccessItem : gsdFile.getProfileBody().getApplicationProcess().getDeviceAccessPointList()) { + if (deviceAccess.equals(deviceAccessItem.getId())) { + this.deviceAccessItem = deviceAccessItem; + } + } + if (deviceAccessItem == null) { + throw new PlcConnectionException("Unable to find Device Access Item - " + this.deviceAccess); + } + + Matcher matcher = RANGE_PATTERN.matcher(deviceAccessItem.getPhysicalSlots()); + if (!matcher.matches()) { + throw new PlcConnectionException("Physical Slots Range is not in the correct format " + deviceAccessItem.getPhysicalSlots()); + } + if (!matcher.group("from").equals("0")) { + throw new PlcConnectionException("Physical Slots don't start from 0, instead starts at " + deviceAccessItem.getPhysicalSlots()); + } + int numberOfSlots = Integer.parseInt(matcher.group("to")); + this.modules = new ProfinetModule[numberOfSlots]; + this.modules[deviceAccessItem.getFixedInSlots()] = new ProfinetModuleImpl(deviceAccessItem, 0, 0, deviceAccessItem.getFixedInSlots()); + + List usableSubModules = this.deviceAccessItem.getUseableModules(); + int currentSlot = deviceAccessItem.getFixedInSlots() + 1; + int inputOffset = this.modules[deviceAccessItem.getFixedInSlots()].getInputIoPsSize(); + int outputOffset = this.modules[deviceAccessItem.getFixedInSlots()].getOutputIoCsSize(); + for (String subModule : this.subModules) { + if (subModule.equals("")) { + this.modules[currentSlot] = new ProfinetEmptyModule(); + } else { + for (ProfinetModuleItemRef useableModule : usableSubModules) { + if (useableModule.getModuleItemTarget().equals(subModule)) { + matcher = RANGE_PATTERN.matcher(useableModule.getAllowedInSlots()); + if (!matcher.matches()) { + throw new PlcConnectionException("Physical Slots Range is not in the correct format " + useableModule.getAllowedInSlots()); + } + int from = Integer.parseInt(matcher.group("from")); + int to = Integer.parseInt(matcher.group("to")); + if (currentSlot < from || currentSlot > to) { + throw new PlcConnectionException("Current Submodule Slot " + currentSlot + " is not with the allowable slots" + useableModule.getAllowedInSlots()); + } + + ProfinetModuleItem foundReferencedModule = null; + for (ProfinetModuleItem module : gsdFile.getProfileBody().getApplicationProcess().getModuleList()) { + if (module.getId().equals(subModule)) { + foundReferencedModule = module; + break; + } + } + + if (foundReferencedModule == null) { + throw new PlcConnectionException("Couldn't find reference module " + subModule + " in GSD file."); + } + + this.modules[currentSlot] = new ProfinetModuleImpl(foundReferencedModule, inputOffset, outputOffset, currentSlot); + + inputOffset += this.modules[currentSlot].getInputIoPsSize(); + outputOffset += this.modules[currentSlot].getOutputIoCsSize(); + break; + } + } + } + if (this.modules[currentSlot] == null) { + throw new PlcConnectionException("Sub Module not Found in allowed Modules"); + } + currentSlot += 1; + } + + while (currentSlot != numberOfSlots) { + this.modules[currentSlot] = new ProfinetEmptyModule(); + currentSlot += 1; + } + + for (ProfinetModule usableModule : this.modules) { + usableModule.populateOutputCR(inputOffset, outputOffset); + inputOffset += usableModule.getInputIoCsSize(); + outputOffset += usableModule.getOutputIoPsSize(); + } + + List interfaceSubModules = deviceAccessItem.getSystemDefinedSubmoduleList().getInterfaceSubmodules(); + if (interfaceSubModules != null && interfaceSubModules.size() > 0) { + if (interfaceSubModules.get(0).getApplicationRelations().getStartupMode() != null && interfaceSubModules.get(0).getApplicationRelations().getStartupMode().toLowerCase().contains("advanced")) { + this.nonLegacyStartupMode = true; + this.frameId = 0x8001; + } + } + } + + public List getInterfaceSubModules() { + return deviceAccessItem.getSystemDefinedSubmoduleList().getInterfaceSubmodules(); + } + + public ProfinetModule[] getModules() { + return modules; + } + + public boolean isNonLegacyStartupMode() { + return nonLegacyStartupMode; + } + + public void setNonLegacyStartupMode(boolean nonLegacyStartupMode) { + this.nonLegacyStartupMode = nonLegacyStartupMode; + } + + public void setFrameId(int frameId) { + this.frameId = frameId; + } + + public Map> getQueue() { + return queue; + } + + public void setQueue(Map> queue) { + this.queue = queue; + } + + public int getSessionKey() { + return sessionKey; + } + + public void setSessionKey(int sessionKey) { + this.sessionKey = sessionKey; + } + + public int getSourcePort() { + return sourcePort; + } + + public void setSourcePort(int port) { + this.sourcePort = port; + } + + public int getDestinationPort() { + return destinationPort; + } + + public void setDestinationPort(int port) { + this.destinationPort = port; + } + + public String getDeviceAccess() { + return deviceAccess; + } + + public void setDeviceAccess(String deviceAccess) { + this.deviceAccess = deviceAccess; + } + + public long getSequenceNumber() { + return sequenceNumber; + } + + public void setSequenceNumber(long sequenceNumber) { + this.sequenceNumber = sequenceNumber; + } + + public DceRpc_ActivityUuid getActivityUuid() { + return activityUuid; + } + + public void setActivityUuid(DceRpc_ActivityUuid activityUuid) { + this.activityUuid = activityUuid; + } + + public void addSubscriptionHandle(String tag, ProfinetSubscriptionHandle handle) { + subscriptionHandles.put(tag, handle); + } + + public ProfinetSubscriptionHandle getSubscriptionHandle(String tag) { + return subscriptionHandles.getOrDefault(tag, null); + } + + public void removeSubscriptionHandle(String tag) { + subscriptionHandles.remove(tag); + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDriverContext.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDriverContext.java index 090e3b06b07..33ebbe1326e 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDriverContext.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDriverContext.java @@ -16,104 +16,54 @@ * specific language governing permissions and limitations * under the License. */ + package org.apache.plc4x.java.profinet.context; import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; -import org.apache.plc4x.java.profinet.readwrite.DceRpc_ActivityUuid; -import org.apache.plc4x.java.profinet.readwrite.IpAddress; -import org.apache.plc4x.java.profinet.readwrite.MacAddress; -import org.apache.plc4x.java.spi.configuration.HasConfiguration; +import org.apache.plc4x.java.profinet.device.ProfinetChannel; +import org.apache.plc4x.java.profinet.device.ProfinetDeviceMessageHandler; import org.apache.plc4x.java.spi.context.DriverContext; import java.net.DatagramSocket; -public class ProfinetDriverContext implements DriverContext, HasConfiguration { - - private DceRpc_ActivityUuid dceRpc_activityUuid; - private MacAddress localMacAddress; - private IpAddress localIpAddress; - private int localUdpPort; - private MacAddress remoteMacAddress; - private IpAddress remoteIpAddress; - private int remoteUdpPort; - private int sessionKey; - - private DatagramSocket udpSocket; - - @Override - public void setConfiguration(ProfinetConfiguration configuration) { - - } - - public DceRpc_ActivityUuid getDceRpcActivityUuid() { - return dceRpc_activityUuid; - } - - public void setDceRpcActivityUuid(DceRpc_ActivityUuid dceRpc_activityUuid) { - this.dceRpc_activityUuid = dceRpc_activityUuid; - } - - public MacAddress getLocalMacAddress() { - return localMacAddress; - } - - public void setLocalMacAddress(MacAddress localMacAddress) { - this.localMacAddress = localMacAddress; - } - - public IpAddress getLocalIpAddress() { - return localIpAddress; - } +public class ProfinetDriverContext implements DriverContext { - public void setLocalIpAddress(IpAddress localIpAddress) { - this.localIpAddress = localIpAddress; - } - - public int getLocalUdpPort() { - return localUdpPort; - } + public static final int DEFAULT_UDP_PORT = 34964; + private ProfinetDeviceMessageHandler handler; + private ProfinetConfiguration configuration; + private DatagramSocket socket; + private ProfinetChannel channel; - public void setLocalUdpPort(int localUdpPort) { - this.localUdpPort = localUdpPort; + public ProfinetChannel getChannel() { + return channel; } - public MacAddress getRemoteMacAddress() { - return remoteMacAddress; + public void setChannel(ProfinetChannel channel) { + this.channel = channel; } - public void setRemoteMacAddress(MacAddress remoteMacAddress) { - this.remoteMacAddress = remoteMacAddress; + public ProfinetDeviceMessageHandler getHandler() { + return handler; } - public IpAddress getRemoteIpAddress() { - return remoteIpAddress; + public void setHandler(ProfinetDeviceMessageHandler handler) { + this.handler = handler; } - public void setRemoteIpAddress(IpAddress remoteIpAddress) { - this.remoteIpAddress = remoteIpAddress; + public ProfinetConfiguration getConfiguration() { + return configuration; } - public int getRemoteUdpPort() { - return remoteUdpPort; - } - - public void setRemoteUdpPort(int remoteUdpPort) { - this.remoteUdpPort = remoteUdpPort; - } - - public int getSessionKey() { - return sessionKey; + public void setConfiguration(ProfinetConfiguration configuration) { + this.configuration = configuration; } - public void setSessionKey(int sessionKey) { - this.sessionKey = sessionKey; + public DatagramSocket getSocket() { + return socket; } - public DatagramSocket getUdpSocket() { - return udpSocket; + public void setSocket(DatagramSocket socket) { + this.socket = socket; } - public void setUdpSocket(DatagramSocket udpSocket) { - this.udpSocket = udpSocket; - } } diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/GsdFileMap.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/GsdFileMap.java new file mode 100644 index 00000000000..8343dbdfc2b --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/GsdFileMap.java @@ -0,0 +1,38 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.profinet.gsdml.ProfinetISO15745Profile; + +import java.util.Map; + +public class GsdFileMap { + + private final Map gsdFiles; + + public GsdFileMap(Map gsdFiles) { + this.gsdFiles = gsdFiles; + } + + public Map getGsdFiles() { + return this.gsdFiles; + } + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetCallable.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetCallable.java new file mode 100644 index 00000000000..9798f9dfee7 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetCallable.java @@ -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. + */ + +package org.apache.plc4x.java.profinet.device; + +import org.apache.plc4x.java.api.exceptions.PlcException; + +public interface ProfinetCallable { + void handle(T packet); + + T create(); + + long getId(); + + void setId(long id); +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetChannel.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetChannel.java new file mode 100644 index 00000000000..d3bcaf716b8 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetChannel.java @@ -0,0 +1,224 @@ +/* + * 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.profinet.device; + +import org.apache.commons.codec.binary.Hex; +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; +import org.apache.plc4x.java.profinet.discovery.ProfinetPlcDiscoverer; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.spi.generation.*; +import org.pcap4j.core.*; +import org.pcap4j.packet.*; +import org.pcap4j.packet.namednumber.EtherType; +import org.pcap4j.util.LinkLayerAddress; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.function.Function; + +public class ProfinetChannel { + + private final Logger logger = LoggerFactory.getLogger(ProfinetChannel.class); + private static final EtherType PN_EtherType = EtherType.getInstance((short) 0x8892); + private static final EtherType LLDP_EtherType = EtherType.getInstance((short) 0x88cc); + private ProfinetPlcDiscoverer discoverer = null; + private Map openHandles; + private ProfinetDevices configuredDevices; + + public ProfinetChannel(List devs, ProfinetDevices devices) { + this.configuredDevices = devices; + this.openHandles = getInterfaceHandles(devs); + startListener(); + } + + public void send(Ethernet_Frame ethFrame) { + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle handle = entry.getValue(); + WriteBufferByteBased buffer = new WriteBufferByteBased(ethFrame.getLengthInBytes()); + try { + ethFrame.serialize(buffer); + Packet packet = EthernetPacket.newPacket(buffer.getBytes(), 0, ethFrame.getLengthInBytes()); + handle.sendPacket(packet); + } catch (PcapNativeException | NotOpenException | SerializationException | IllegalRawDataException e) { + throw new RuntimeException(e); + } + } + } + + public void startListener() { + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle handle = entry.getValue(); + + Thread thread = new Thread( + new ProfinetRunnable(handle, + message -> { + PacketListener listener = createListener(); + try { + handle.loop(-1, listener); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (PcapNativeException | NotOpenException e) { + logger.error("Got error handling raw socket", e); + } + return null; + })); + thread.start(); + } + } + public PacketListener createListener() { + PacketListener listener = + packet -> { + // EthernetPacket is the highest level of abstraction we can be expecting. + // Everything inside this we will have to decode ourselves. + if (packet instanceof EthernetPacket) { + EthernetPacket ethernetPacket = (EthernetPacket) packet; + boolean isPnPacket = false; + // I have observed sometimes the ethernet packets being wrapped inside a VLAN + // Packet, in this case we simply unpack the content. + if (ethernetPacket.getPayload() instanceof Dot1qVlanTagPacket) { + Dot1qVlanTagPacket vlanPacket = (Dot1qVlanTagPacket) ethernetPacket.getPayload(); + if (PN_EtherType.equals(vlanPacket.getHeader().getType()) || LLDP_EtherType.equals(vlanPacket.getHeader().getType())) { + isPnPacket = true; + } + } else if (PN_EtherType.equals(ethernetPacket.getHeader().getType()) || LLDP_EtherType.equals(ethernetPacket.getHeader().getType())) { + isPnPacket = true; + } else if (ethernetPacket.getHeader().getType() == EtherType.IPV4 && ethernetPacket.getPayload().getPayload() instanceof UdpPacket) { + UdpPacket payload = (UdpPacket) ethernetPacket.getPayload().getPayload(); + // Check if it's a PROFINET packet + if (payload.getHeader().getDstPort().value() == -30572 || payload.getHeader().getSrcPort().value() == -30572) { + isPnPacket = true; + } + } + + if (isPnPacket) { + ReadBuffer reader = new ReadBufferByteBased(ethernetPacket.getRawData()); + try { + Ethernet_Frame ethernetFrame = Ethernet_Frame.staticParse(reader); + Ethernet_FramePayload payload = ethernetFrame.getPayload(); + if (payload instanceof Ethernet_FramePayload_VirtualLan) { + payload = ((Ethernet_FramePayload_VirtualLan) payload).getPayload(); + } + + if (payload instanceof Ethernet_FramePayload_PnDcp) { + PnDcp_Pdu pdu = ((Ethernet_FramePayload_PnDcp) payload).getPdu(); + if (pdu.getFrameId() == PnDcp_FrameId.DCP_Identify_ResPDU) { + if (discoverer != null) { + discoverer.processPnDcp(pdu, ethernetPacket); + } + } else if (pdu.getFrameId() == PnDcp_FrameId.Alarm_Low) { + for (Map.Entry device : this.configuredDevices.getConfiguredDevices().entrySet()) { + if (Arrays.equals(device.getValue().getDeviceContext().getMacAddress().getAddress(), ethernetFrame.getSource().getAddress())) { + PnDcp_Pdu_AlarmLow alarmPdu = (PnDcp_Pdu_AlarmLow) pdu; + device.getValue().handleAlarmResponse(alarmPdu); + } + } + } + else if (pdu.getFrameId() == PnDcp_FrameId.RT_CLASS_1) { + for (Map.Entry device : this.configuredDevices.getConfiguredDevices().entrySet()) { + if (Arrays.equals(device.getValue().getDeviceContext().getMacAddress().getAddress(), ethernetFrame.getSource().getAddress())) { + PnDcp_Pdu_RealTimeCyclic cyclicPdu = (PnDcp_Pdu_RealTimeCyclic) pdu; + device.getValue().handleRealTimeResponse(cyclicPdu); + } + } + } + + } else if (payload instanceof Ethernet_FramePayload_LLDP) { + Lldp_Pdu pdu = ((Ethernet_FramePayload_LLDP) payload).getPdu(); + if (discoverer != null) { + discoverer.processLldp(pdu); + } + } else if (payload instanceof Ethernet_FramePayload_IPv4) { + for (Map.Entry device : this.configuredDevices.getConfiguredDevices().entrySet()) { + if (Arrays.equals(device.getValue().getDeviceContext().getMacAddress().getAddress(), ethernetFrame.getSource().getAddress())) { + device.getValue().handleResponse((Ethernet_FramePayload_IPv4) payload); + } + } + } + } catch (ParseException e) { + logger.error("Got error decoding packet", e); + } + } + } + }; + return listener; + } + + public Map getInterfaceHandles(List devs) { + Map openHandles = new HashMap<>(); + try { + for (PcapNetworkInterface dev : devs) { + // It turned out on some MAC network devices without any ip addresses + // the compiling of the filter expression was causing errors. As + // currently there was no other way to detect this, this check seems + // to be sufficient. + if (dev.getAddresses().size() == 0) { + continue; + } + if (!dev.isLoopBack()) { + for (LinkLayerAddress linkLayerAddress : dev.getLinkLayerAddresses()) { + org.pcap4j.util.MacAddress macAddress = (org.pcap4j.util.MacAddress) linkLayerAddress; + PcapHandle handle = dev.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 10); + openHandles.put(toPlc4xMacAddress(macAddress), handle); + + // Only react on PROFINET, UDP or LLDP packets targeted at our current MAC address. + handle.setFilter( + "(ether proto 0x0800) or (((ether proto 0x8100) or (ether proto 0x8892)) and (ether dst " + Pcaps.toBpfString(macAddress) + ")) or (ether proto 0x88cc)", + BpfProgram.BpfCompileMode.OPTIMIZE); + } + } + } + } catch (NotOpenException | PcapNativeException e) { + logger.error("Got an exception while processing raw socket data", e); + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle openHandle = entry.getValue(); + try { + openHandle.breakLoop(); + openHandle.close(); + } catch (NotOpenException error) { + logger.info("Handle already closed."); + } + } + } + return openHandles; + } + + public ProfinetPlcDiscoverer getDiscoverer() { + return discoverer; + } + + public void setDiscoverer(ProfinetPlcDiscoverer discoverer) { + this.discoverer = discoverer; + } + + public Map getOpenHandles() { + return openHandles; + } + + public void setConfiguredDevices(ProfinetDevices configuredDevices) { + this.configuredDevices = configuredDevices; + } + + private static MacAddress toPlc4xMacAddress(org.pcap4j.util.MacAddress pcap4jMacAddress) { + byte[] address = pcap4jMacAddress.getAddress(); + return new MacAddress(new byte[]{address[0], address[1], address[2], address[3], address[4], address[5]}); + } + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java new file mode 100644 index 00000000000..dc076a9094d --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevice.java @@ -0,0 +1,957 @@ +/* + * 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.profinet.device; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; +import org.apache.plc4x.java.api.exceptions.PlcException; +import org.apache.plc4x.java.api.messages.*; +import org.apache.plc4x.java.api.model.PlcConsumerRegistration; +import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.api.types.PlcSubscriptionType; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.profinet.context.ProfinetDeviceContext; +import org.apache.plc4x.java.profinet.gsdml.*; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.profinet.tag.ProfinetTag; +import org.apache.plc4x.java.spi.ConversationContext; +import org.apache.plc4x.java.spi.generation.*; +import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionEvent; +import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionResponse; +import org.apache.plc4x.java.spi.messages.PlcSubscriber; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration; +import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag; +import org.apache.plc4x.java.spi.values.PlcSTRING; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.*; +import java.nio.ByteBuffer; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; + +public class ProfinetDevice implements PlcSubscriber{ + + private final Logger logger = LoggerFactory.getLogger(ProfinetDevice.class); + private static final int DEFAULT_NUMBER_OF_PORTS_TO_SCAN = 100; + private static final int MIN_CYCLE_NANO_SEC = 31250; + private final BiFunction gsdHandler; + private final ProfinetDeviceContext deviceContext = new ProfinetDeviceContext(); + + // Each device should create a receiving socket, all the packets are then automatically transferred to the listener for the channel though. + private DatagramSocket socket = null; + private String vendorId; + private String deviceId; + private Thread eventLoop = null; + Map>> registrations = new HashMap<>(); + + public ProfinetDevice(String deviceName, String deviceAccess, String subModules, BiFunction gsdHandler) { + this.gsdHandler = gsdHandler; + deviceContext.setDeviceAccess(deviceAccess); + deviceContext.setSubModules(subModules); + deviceContext.setDeviceName(deviceName); + openDeviceUdpPort(); + } + + private void openDeviceUdpPort() { + // Open the receiving UDP port. + int count = 0; + int port = ProfinetDeviceContext.DEFAULT_SEND_UDP_PORT; + boolean portFound = false; + while (!portFound && count < DEFAULT_NUMBER_OF_PORTS_TO_SCAN) { + try { + socket = new DatagramSocket(port + count); + portFound = true; + } catch (SocketException e) { + count += 1; + port += 1; + } + } + if (!portFound) { + throw new RuntimeException("Unable to find free open port"); + } + } + + private long getObjectId() { + return deviceContext.getAndIncrementIdentification(); + } + + public String getVendorId() { + return vendorId; + } + + public String getDeviceId() { + return deviceId; + } + + public void setVendorDeviceId(String vendorId, String deviceId) { + try { + this.vendorId = vendorId; + this.deviceId = deviceId; + if (deviceContext.getGsdFile() == null) { + deviceContext.setGsdFile(gsdHandler.apply(vendorId, deviceId)); + } + } catch (PlcException e) { + throw new RuntimeException(e); + } + } + + private void recordIdAndSend(ProfinetCallable callable) { + deviceContext.getQueue().put(callable.getId(), callable); + ProfinetMessageWrapper.sendUdpMessage( + callable, + deviceContext + ); + } + + @Override + public CompletableFuture subscribe(PlcSubscriptionRequest subscriptionRequest) { + return CompletableFuture.supplyAsync(() -> { + Map> values = new HashMap<>(); + + return new DefaultPlcSubscriptionResponse(subscriptionRequest, values); + }); + } + + @Override + public CompletableFuture unsubscribe(PlcUnsubscriptionRequest unsubscriptionRequest) { + return null; + } + + @Override + public PlcConsumerRegistration register(Consumer consumer, Collection handles) { + // Register the current consumer for each of the given subscription handles + for (PlcSubscriptionHandle subscriptionHandle : handles) { + logger.debug("Registering Consumer"); + ProfinetSubscriptionHandle profinetHandle = (ProfinetSubscriptionHandle) subscriptionHandle; + if (registrations.containsKey(profinetHandle.getAddressString())) { + registrations.get(profinetHandle.getAddressString()).add(consumer); + } else { + List> consumers = new ArrayList<>(); + consumers.add(consumer); + registrations.put(profinetHandle.getAddressString(), consumers); + } + } + return new DefaultPlcConsumerRegistration(this, consumer, handles.toArray(new PlcSubscriptionHandle[0])); + } + + @Override + public void unregister(PlcConsumerRegistration registration) { + + } + + public boolean onConnect() throws ExecutionException, InterruptedException, TimeoutException { + start(); + return true; + } + + /* + Starts the device main loop, sending data from controller to device. + */ + public void start() { + final long timeout = (long) deviceContext.getConfiguration().getReductionRatio() * deviceContext.getConfiguration().getSendClockFactor() * deviceContext.getConfiguration().getWatchdogFactor() * MIN_CYCLE_NANO_SEC; + final int cycleTime = (int) (deviceContext.getConfiguration().getSendClockFactor() * deviceContext.getConfiguration().getReductionRatio() * (MIN_CYCLE_NANO_SEC/1000000.0)); + Function subscription = + message -> { + long startTime = System.nanoTime(); + while (deviceContext.getState() != ProfinetDeviceState.ABORT) { + try { + switch(deviceContext.getState()) { + case IDLE: + CreateConnection createConnection = new CreateConnection(); + recordIdAndSend(createConnection); + createConnection.getResponseHandled().get(timeout, TimeUnit.NANOSECONDS); + break; + case STARTUP: + WriteParameters writeParameters = new WriteParameters(); + recordIdAndSend(writeParameters); + writeParameters.getResponseHandled().get(timeout, TimeUnit.NANOSECONDS); + break; + case PREMED: + WriteParametersEnd writeParametersEnd = new WriteParametersEnd(); + recordIdAndSend(writeParametersEnd); + writeParametersEnd.getResponseHandled().get(timeout, TimeUnit.NANOSECONDS); + break; + case WAITAPPLRDY: + Thread.sleep(cycleTime); + case APPLRDY: + ApplicationReadyResponse applicationReadyResponse = new ApplicationReadyResponse(deviceContext.getActivityUuid(), deviceContext.getSequenceNumber()); + recordIdAndSend(applicationReadyResponse); + deviceContext.getContext().fireConnected(); + deviceContext.setState(ProfinetDeviceState.CYCLICDATA); + break; + case CYCLICDATA: + CyclicData cyclicData = new CyclicData(startTime); + ProfinetMessageWrapper.sendPnioMessage(cyclicData, deviceContext); + Thread.sleep(cycleTime); + break; + } + } catch (InterruptedException | ExecutionException | TimeoutException e) { + deviceContext.setState(ProfinetDeviceState.ABORT); + } + } + return null; + }; + + eventLoop = new Thread(new ProfinetRunnable(null, subscription)); + eventLoop.start(); + } + + /* + Return metadata about the device. This is sourced from the connection string as well as GSD file. + */ + public Map getDeviceInfo() { + Map options = new HashMap<>(); + ProfinetDeviceIdentity deviceIdentity = this.deviceContext.getGsdFile().getProfileBody().getDeviceIdentity(); + options.put("device_id", new PlcSTRING(deviceIdentity.getDeviceID())); + options.put("vendor_id", new PlcSTRING(deviceIdentity.getVendorId())); + options.put("vendor_name", new PlcSTRING(deviceIdentity.getVendorName().getValue())); + if (deviceIdentity.getInfoText() != null && deviceIdentity.getInfoText().getTextId() != null) { + String key = deviceIdentity.getInfoText().getTextId(); + ProfinetExternalTextList externaltextList = this.deviceContext.getGsdFile().getProfileBody().getApplicationProcess().getExternalTextList(); + for (ProfinetTextIdValue s : externaltextList.getPrimaryLanguage().getText()) { + if (key.equals(s.getTextId())) { + options.put("info_text", new PlcSTRING(s.getValue())); + break; + } + } + } + return options; + } + + /* + Create a structure including all the devices tags and child tags. + The options include metadata about the device. + The children are a list of configured submodules, with the same format as the parent. + Each address of the children is formatted with the format i.e. parent.submodule.chiildtag + */ + public List browseTags(List browseItems) { + Map options = getDeviceInfo(); + for (ProfinetModule module : deviceContext.getModules()) { + browseItems = module.browseTags(browseItems, deviceContext.getDeviceName(), options); + } + return browseItems; + } + + public boolean hasLldpPdu() { + return deviceContext.isLldpReceived(); + } + + public boolean hasDcpPdu() { + return deviceContext.isDcpReceived(); + } + + public void handleResponse(Ethernet_FramePayload_IPv4 packet) { + logger.debug("Received packet for {}", packet.getPayload().getObjectUuid()); + long objectId = packet.getPayload().getSequenceNumber(); + if (deviceContext.getQueue().containsKey(objectId)) { + deviceContext.getQueue().get(objectId).handle(packet.getPayload()); + } else { + PnIoCm_Packet payloadPacket = packet.getPayload().getPayload(); + deviceContext.setActivityUuid(packet.getPayload().getActivityUuid()); + deviceContext.setSequenceNumber(packet.getPayload().getSequenceNumber()); + if (payloadPacket instanceof PnIoCm_Packet_Req) { + PnIoCm_Packet_Req req = (PnIoCm_Packet_Req) payloadPacket; + for (PnIoCm_Block block : req.getBlocks()) { + if (block instanceof PnIoCM_Block_Request) { + deviceContext.setState(ProfinetDeviceState.APPLRDY); + } + } + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Unable to match Response with Requested Profinet packet"); + } + } + } + + public void handle(PlcDiscoveryItem item) { + logger.debug("Received Discovered item at device"); + if (item.getOptions().containsKey("ipAddress")) { + deviceContext.setIpAddress(item.getOptions().get("ipAddress")); + } + if (item.getOptions().containsKey("portId")) { + deviceContext.setPortId(item.getOptions().get("portId")); + } + if (item.getOptions().containsKey("deviceTypeName")) { + deviceContext.setDeviceTypeName(item.getOptions().get("deviceTypeName")); + } + if (item.getOptions().containsKey("vendorId") && item.getOptions().containsKey("deviceId")) { + setVendorDeviceId(item.getOptions().get("vendorId"), item.getOptions().get("deviceId")); + } + if (item.getOptions().containsKey("deviceName")) { + deviceContext.setDeviceName(item.getOptions().get("deviceName")); + } + if (item.getOptions().containsKey("localMacAddress")) { + String macString = item.getOptions().get("localMacAddress").replace(":", ""); + try { + deviceContext.setLocalMacAddress(new MacAddress(Hex.decodeHex(macString))); + } catch (DecoderException e) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Error Decode Local Mac Address from PN-DCP {}", item.getOptions().get("localMacAddress")); + } + } + if (item.getOptions().containsKey("macAddress")) { + String macString = item.getOptions().get("macAddress").replace(":", ""); + try { + deviceContext.setMacAddress(new MacAddress(Hex.decodeHex(macString))); + } catch (DecoderException e) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Error Decode Mac Address from PN-DCP {}", item.getOptions().get("macAddress")); + } + } + if (item.getOptions().containsKey("packetType")) { + if (item.getOptions().get("packetType").equals("lldp")) { + deviceContext.setLldpReceived(true); + } + if (item.getOptions().get("packetType").equals("dcp")) { + deviceContext.setDcpReceived(true); + } + } + } + + public void setContext(ConversationContext context, ProfinetChannel channel) { + deviceContext.setContext(context); + deviceContext.setChannel(channel); + } + + public ProfinetDeviceContext getDeviceContext() { + return deviceContext; + } + + public void handleRealTimeResponse(PnDcp_Pdu_RealTimeCyclic cyclicPdu) { + Map> tags = new HashMap<>(); + ReadBuffer buffer = new ReadBufferByteBased(cyclicPdu.getDataUnit().getData()); + + try { + for (ProfinetModule module : deviceContext.getModules()) { + module.parseTags(tags, deviceContext.getDeviceName(), buffer); + } + + Map, Map>> response = new HashMap<>(); + for (Map.Entry> entry : tags.entrySet()) { + boolean processTag = false; + ProfinetSubscriptionHandle handle = deviceContext.getSubscriptionHandle(entry.getKey()); + if (handle != null) { + if (handle.getLastValue() == null) { + processTag = true; + handle.setLastValue(entry.getValue().getValue()); + } else if (handle.getSubscriptionType() == PlcSubscriptionType.CHANGE_OF_STATE && !entry.getValue().getValue().toString().equals(handle.getLastValue().toString())) { + processTag = true; + handle.setLastValue(entry.getValue().getValue()); + } + if (handle.getSubscriptionType() == PlcSubscriptionType.CYCLIC) { + processTag = true; + } + if (handle.getSubscriptionType() == PlcSubscriptionType.EVENT) { + processTag = true; + } + } + if (registrations.containsKey(entry.getKey()) && processTag) { + List> selectedRegistrations = registrations.get(entry.getKey()); + for (Consumer reg : selectedRegistrations) { + if (response.containsKey(reg)) { + response.get(reg).put(deviceContext.getSubscriptionHandle(entry.getKey()).getTag(), entry.getValue()); + } else { + response.put(reg, new HashMap<>()); + response.get(reg).put(deviceContext.getSubscriptionHandle(entry.getKey()).getTag(), entry.getValue()); + } + } + } + } + + for (Map.Entry, Map>> entry : response.entrySet()) { + entry.getKey().accept(new DefaultPlcSubscriptionEvent(Instant.now(), entry.getValue())); + } + } catch (ParseException e) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Error Parsing Cyclic Data from device {}", deviceContext.getDeviceName()); + } + } + + public void handleAlarmResponse(PnDcp_Pdu_AlarmLow alarmPdu) { + logger.error("Received Alarm Low packet, attempting to re-connect"); + deviceContext.setState(ProfinetDeviceState.IDLE); + } + + public class CreateConnection implements ProfinetCallable { + + CompletableFuture responseHandled = new CompletableFuture<>(); + private long id = getObjectId(); + public CompletableFuture getResponseHandled() { + return responseHandled; + } + public long getId() { + return id; + } + public void setId(long id) { + this.id = id; + } + + public DceRpc_Packet create() { + deviceContext.setSessionKey(deviceContext.getAndIncrementSessionKey()); + + List blocks = new ArrayList<>(); + blocks.add(new PnIoCm_Block_ArReq( + ProfinetDeviceContext.BLOCK_VERSION_HIGH, + ProfinetDeviceContext.BLOCK_VERSION_LOW, + PnIoCm_ArType.IO_CONTROLLER, + ProfinetDeviceContext.ARUUID, + deviceContext.getSessionKey(), + deviceContext.getLocalMacAddress(), + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, Integer.valueOf(deviceId), Integer.valueOf(vendorId)), + false, + deviceContext.isNonLegacyStartupMode(), + false, + false, + PnIoCm_CompanionArType.SINGLE_AR, + false, + true, + false, + PnIoCm_State.ACTIVE, + ProfinetDeviceContext.DEFAULT_ACTIVITY_TIMEOUT, + ProfinetDeviceContext.UDP_RT_PORT, + ProfinetDeviceContext.DEFAULT_PLC4X_STATION_NAME + ) + ); + + blocks.add( + new PnIoCm_Block_AlarmCrReq( + (short) 1, + (short) 0, + PnIoCm_AlarmCrType.ALARM_CR, + 0x8892, + false, + false, + 1, + 3, + 0x0000, + 200, + 0xC000, + 0xA000 + ) + ); + + List inputApis = Collections.singletonList( + new PnIoCm_IoCrBlockReqApi( + deviceContext.getInputIoPsApiBlocks(), + deviceContext.getInputIoCsApiBlocks()) + ); + + List outputApis = Collections.singletonList( + new PnIoCm_IoCrBlockReqApi( + deviceContext.getOutputIoPsApiBlocks(), + deviceContext.getOutputIoCsApiBlocks() + ) + ); + + deviceContext.setInputReq(new PnIoCm_Block_IoCrReq( + (short) 1, + (short) 0, + PnIoCm_IoCrType.INPUT_CR, + 0x0001, + ProfinetDeviceContext.UDP_RT_PORT, + false, + false, + false, + false, + PnIoCm_RtClass.RT_CLASS_2, + ProfinetDeviceContext.DEFAULT_IO_DATA_SIZE, + deviceContext.getIncrementAndGetFrameId(), + deviceContext.getConfiguration().getSendClockFactor(), + deviceContext.getConfiguration().getReductionRatio(), + 1, + 0, + 0xffffffff, + deviceContext.getConfiguration().getWatchdogFactor(), + deviceContext.getConfiguration().getDataHoldFactor(), + 0xC000, + ProfinetDeviceContext.DEFAULT_EMPTY_MAC_ADDRESS, + inputApis + + )); + + blocks.add(deviceContext.getInputReq()); + + deviceContext.setOutputReq(new PnIoCm_Block_IoCrReq( + (short) 1, + (short) 0, + PnIoCm_IoCrType.OUTPUT_CR, + 0x0002, + ProfinetDeviceContext.UDP_RT_PORT, + false, + false, + false, + false, + PnIoCm_RtClass.RT_CLASS_2, + ProfinetDeviceContext.DEFAULT_IO_DATA_SIZE, + deviceContext.getIncrementAndGetFrameId(), + deviceContext.getConfiguration().getSendClockFactor(), + deviceContext.getConfiguration().getReductionRatio(), + 1, + 0, + 0xffffffff, + deviceContext.getConfiguration().getWatchdogFactor(), + deviceContext.getConfiguration().getDataHoldFactor(), + 0xC000, + ProfinetDeviceContext.DEFAULT_EMPTY_MAC_ADDRESS, + outputApis + )); + + blocks.add(deviceContext.getOutputReq()); + + for (PnIoCm_Block_ExpectedSubmoduleReq expectedSubModuleApiBlocksReq : deviceContext.getExpectedSubmoduleReq()) { + blocks.add(expectedSubModuleApiBlocksReq); + } + + return new DceRpc_Packet( + DceRpc_PacketType.REQUEST, + true, + false, + false, + IntegerEncoding.BIG_ENDIAN, + CharacterEncoding.ASCII, + FloatingPointEncoding.IEEE, + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, Integer.valueOf(deviceId), Integer.valueOf(vendorId)), + new DceRpc_InterfaceUuid_DeviceInterface(), + deviceContext.getUuid(), + 0, + id, + DceRpc_Operation.CONNECT, + new PnIoCm_Packet_Req(ProfinetDeviceContext.DEFAULT_ARGS_MAXIMUM, ProfinetDeviceContext.DEFAULT_MAX_ARRAY_COUNT, 0, blocks) + ); + } + + public void handle(DceRpc_Packet dceRpc_packet) { + if ((dceRpc_packet.getOperation() == DceRpc_Operation.CONNECT) && (dceRpc_packet.getPacketType() == DceRpc_PacketType.RESPONSE)) { + if (dceRpc_packet.getPayload().getPacketType() == DceRpc_PacketType.RESPONSE) { + final PnIoCm_Packet_Res connectResponse = (PnIoCm_Packet_Res) dceRpc_packet.getPayload(); + if (connectResponse.getErrorCode() == 0) { + deviceContext.setState(ProfinetDeviceState.STARTUP); + responseHandled.complete(true); + for (PnIoCm_Block module : connectResponse.getBlocks()) { + if (module.getBlockType() == PnIoCm_BlockType.MODULE_DIFF_BLOCK) { + PnIoCm_Block_ModuleDiff diffModule = (PnIoCm_Block_ModuleDiff) module; + logger.error("Module is different to what is expected in slot {}", diffModule.getApis().get(0).getModules().get(0).getSlotNumber()); + deviceContext.setState(ProfinetDeviceState.ABORT); + } + } + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + // TODO:- Introduce the error code lookups + logger.error("Error {} - {} in Response from {} ", connectResponse.getErrorCode1(), connectResponse.getErrorCode2(), deviceContext.getDeviceName()); + responseHandled.complete(true); + } + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Received Incorrect Packet Type for Create Connection Response"); + responseHandled.complete(true); + } + } else if (dceRpc_packet.getPacketType() == DceRpc_PacketType.REJECT) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Device rejected connection request"); + responseHandled.complete(true); + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Unexpected Response"); + responseHandled.complete(true); + } + } + } + + public class WriteParameters implements ProfinetCallable { + + CompletableFuture responseHandled = new CompletableFuture<>(); + private long id = getObjectId(); + + public CompletableFuture getResponseHandled() { + return responseHandled; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public DceRpc_Packet create() { + + int seqNumber = 0; + List requests = new ArrayList<>(); + requests.add( + new IODWriteRequestHeader( + (short) 1, + (short) 0, + seqNumber, + ProfinetDeviceContext.ARUUID, + 0x00000000, + 0x0000, + 0x0000, + 0xe040, + 180, + null + + )); + seqNumber += 1; + for (ProfinetInterfaceSubmoduleItem interfaceModule : deviceContext.getInterfaceSubModules()) { + requests.add( + new IODWriteRequestHeader( + (short) 1, + (short) 0, + seqNumber, + ProfinetDeviceContext.ARUUID, + 0x00000000, + 0x0000, + interfaceModule.getSubslotNumber(), + 0x8071, + 12, + null + )); + requests.add( + new PDInterfaceAdjust( + (short) 1, + (short) 0, + MultipleInterfaceModeNameOfDevice.NAME_PROVIDED_BY_LLDP + ) + ); + seqNumber += 1; + } + + int index = 1; + for (String submodule : deviceContext.getSubModules()) { + ProfinetModuleItem foundModule = null; + for (ProfinetModuleItem module : deviceContext.getGsdFile().getProfileBody().getApplicationProcess().getModuleList()) { + if (module.getId().equals(submodule)) { + foundModule = module; + break; + } + } + + if (foundModule != null && foundModule.getVirtualSubmoduleList().get(0).getRecordDataList() != null) { + for (ProfinetParameterRecordDataItem record : foundModule.getVirtualSubmoduleList().get(0).getRecordDataList()) { + requests.add( + new IODWriteRequestHeader( + (short) 1, + (short) 0, + seqNumber, + ProfinetDeviceContext.ARUUID, + 0x00000000, + index, + 0x0001, + record.getIndex(), + record.getLength(), + new UserData(ByteBuffer.allocate(4).putInt(Integer.valueOf(record.getRef().getDefaultValue())).array(), (long) record.getLength()) + )); + seqNumber += 1; + } + } + index += 1; + } + + return new DceRpc_Packet( + DceRpc_PacketType.REQUEST, true, false, false, + IntegerEncoding.BIG_ENDIAN, CharacterEncoding.ASCII, FloatingPointEncoding.IEEE, + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, Integer.valueOf(deviceId), Integer.valueOf(vendorId)), + new DceRpc_InterfaceUuid_DeviceInterface(), + deviceContext.getUuid(), + 0, + id, + DceRpc_Operation.WRITE, + new PnIoCm_Packet_Req(16696, 16696, 0, + requests) + ); + } + + @Override + public void handle(DceRpc_Packet dceRpc_packet) { + logger.debug("Received a Write Parameter Response"); + if ((dceRpc_packet.getOperation() == DceRpc_Operation.WRITE) && (dceRpc_packet.getPacketType() == DceRpc_PacketType.RESPONSE)) { + if (dceRpc_packet.getPayload().getPacketType() == DceRpc_PacketType.RESPONSE) { + final PnIoCm_Packet_Res connectResponse = (PnIoCm_Packet_Res) dceRpc_packet.getPayload(); + if (connectResponse.getErrorCode() == 0) { + deviceContext.setState(ProfinetDeviceState.PREMED); + responseHandled.complete(true); + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + // TODO:- Introduce the error code lookups + logger.error("Error {} - {} in Response from {} during Write Parameters ", connectResponse.getErrorCode1(), connectResponse.getErrorCode2(), deviceContext.getDeviceName()); + responseHandled.complete(true); + } + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Received Incorrect Packet Type for Write Parameters Response"); + responseHandled.complete(true); + } + } else if (dceRpc_packet.getPacketType() == DceRpc_PacketType.REJECT) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Device rejected write parameter request"); + responseHandled.complete(true); + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Unexpected Response"); + responseHandled.complete(true); + } + } + } + + public class WriteParametersEnd implements ProfinetCallable { + + CompletableFuture responseHandled = new CompletableFuture<>(); + private long id = getObjectId(); + + public CompletableFuture getResponseHandled() { + return responseHandled; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public DceRpc_Packet create() { + return new DceRpc_Packet( + DceRpc_PacketType.REQUEST, true, false, false, + IntegerEncoding.BIG_ENDIAN, CharacterEncoding.ASCII, FloatingPointEncoding.IEEE, + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, Integer.valueOf(deviceId), Integer.valueOf(vendorId)), + new DceRpc_InterfaceUuid_DeviceInterface(), + deviceContext.getUuid(), + 0, + id, + DceRpc_Operation.CONTROL, + new PnIoCm_Packet_Req(16696, 16696, 0, + Collections.singletonList( + new PnIoCm_Control_Request( + (short) 1, + (short) 0, + ProfinetDeviceContext.ARUUID, + deviceContext.getSessionKey(), + 0x0001 + ) + )) + ); + } + + @Override + public void handle(DceRpc_Packet dceRpc_packet) { + logger.debug("Received a Write Parameter End Response"); + if ((dceRpc_packet.getOperation() == DceRpc_Operation.CONTROL) && (dceRpc_packet.getPacketType() == DceRpc_PacketType.RESPONSE)) { + if (dceRpc_packet.getPayload().getPacketType() == DceRpc_PacketType.RESPONSE) { + final PnIoCm_Packet_Res connectResponse = (PnIoCm_Packet_Res) dceRpc_packet.getPayload(); + if (connectResponse.getErrorCode() == 0) { + deviceContext.setState(ProfinetDeviceState.WAITAPPLRDY); + responseHandled.complete(true); + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + // TODO:- Introduce the error code lookups + logger.error("Error {} - {} in Response from {} during Write Parameters End", connectResponse.getErrorCode1(), connectResponse.getErrorCode2(), deviceContext.getDeviceName()); + responseHandled.complete(true); + } + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Received Incorrect Packet Type for Write Parameters Ed Response"); + responseHandled.complete(true); + } + } else if (dceRpc_packet.getPacketType() == DceRpc_PacketType.REJECT) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Device rejected write parameter end request"); + responseHandled.complete(true); + } else { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Unexpected Response"); + responseHandled.complete(true); + } + } + } + + public class ApplicationReadyResponse implements ProfinetCallable { + + private final DceRpc_ActivityUuid activityUuid; + private long id; + + public ApplicationReadyResponse(DceRpc_ActivityUuid activityUuid, long seqNumber) { + this.activityUuid = activityUuid; + this.id = seqNumber; + } + + public CompletableFuture getResponseHandled() { + return null; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public DceRpc_Packet create() { + return new DceRpc_Packet( + DceRpc_PacketType.RESPONSE, + false, + true, + true, + IntegerEncoding.BIG_ENDIAN, + CharacterEncoding.ASCII, + FloatingPointEncoding.IEEE, + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, Integer.valueOf(deviceId), Integer.valueOf(vendorId)), + new DceRpc_InterfaceUuid_ControllerInterface(), + activityUuid, + 0, + id, + DceRpc_Operation.CONTROL, + new PnIoCm_Packet_Res( + (short) 0, + (short) 0, + (short) 0, + (short) 0, + ProfinetDeviceContext.DEFAULT_MAX_ARRAY_COUNT, + 0, + Collections.singletonList( + new PnIoCM_Block_Response( + (short) 1, + (short) 0, + ProfinetDeviceContext.ARUUID, + deviceContext.getSessionKey(), + 0x0008, + 0x0000 + ) + )) + ); + } + + @Override + public void handle(DceRpc_Packet packet) { + logger.debug("Received an unintented packet - We were expecting a response for an Application Ready Response"); + } + } + + public class CyclicData implements ProfinetCallable { + + private final long startTime; + private long id = getObjectId(); + + public CyclicData(long startTime) { + this.startTime = startTime; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Ethernet_Frame create() { + + WriteBufferByteBased buffer = new WriteBufferByteBased(deviceContext.getOutputReq().getDataLength()); + PnIoCm_IoCrBlockReqApi api = deviceContext.getOutputReq().getApis().get(0); + try { + for (PnIoCm_IoCs iocs : api.getIoCss()) { + PnIoCm_DataUnitIoCs ioc = new PnIoCm_DataUnitIoCs(false, (byte) 0x03, false); + ioc.serialize(buffer); + } + + for (PnIoCm_IoDataObject dataObject : api.getIoDataObjects()) { + // TODO: Need to specify the datatype length based on the gsd file + PnIoCm_DataUnitDataObject ioc = new PnIoCm_DataUnitDataObject( + new byte[1], + new PnIoCm_DataUnitIoCs(false, (byte) 0x03, false), + 1 + ); + ioc.serialize(buffer); + } + + while (buffer.getPos() < deviceContext.getOutputReq().getDataLength()) { + buffer.writeByte((byte) 0x00); + } + + int elapsedTime = (int) ((((System.nanoTime() - startTime)/(MIN_CYCLE_NANO_SEC))) % 65536); + + Ethernet_Frame frame = new Ethernet_Frame( + deviceContext.getMacAddress(), + deviceContext.getLocalMacAddress(), + new Ethernet_FramePayload_VirtualLan( + VirtualLanPriority.INTERNETWORK_CONTROL, + false, + 0, + new Ethernet_FramePayload_PnDcp( + new PnDcp_Pdu_RealTimeCyclic( + deviceContext.getOutputReq().getFrameId(), + new PnIo_CyclicServiceDataUnit(buffer.getBytes(), (short) deviceContext.getOutputReq().getDataLength()), + elapsedTime, + false, + true, + true, + true, + false, + true)) + )); + return frame; + } catch (SerializationException e) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Error serializing cyclic data for device {}", deviceContext.getDeviceName()); + + int elapsedTime = (int) ((((System.nanoTime() - startTime)/(MIN_CYCLE_NANO_SEC))) % 65536); + + Ethernet_Frame frame = new Ethernet_Frame( + deviceContext.getMacAddress(), + deviceContext.getLocalMacAddress(), + new Ethernet_FramePayload_VirtualLan( + VirtualLanPriority.INTERNETWORK_CONTROL, + false, + 0, + new Ethernet_FramePayload_PnDcp( + new PnDcp_Pdu_RealTimeCyclic( + deviceContext.getOutputReq().getFrameId(), + new PnIo_CyclicServiceDataUnit(new byte[]{}, (short) 0), + elapsedTime, + false, + true, + true, + true, + false, + true)) + )); + return frame; + } + } + + @Override + public void handle(Ethernet_Frame packet) { + deviceContext.setState(ProfinetDeviceState.ABORT); + logger.error("Error Parsing Cyclic Data from device {}", deviceContext.getDeviceName()); + } + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDeviceMessageHandler.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDeviceMessageHandler.java new file mode 100644 index 00000000000..1b8d3a63066 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDeviceMessageHandler.java @@ -0,0 +1,46 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.api.messages.PlcDiscoveryItem; +import org.apache.plc4x.java.api.messages.PlcDiscoveryItemHandler; + +import java.util.HashMap; + +public class ProfinetDeviceMessageHandler implements PlcDiscoveryItemHandler { + + private ProfinetDevices configuredDevices; + + public ProfinetDeviceMessageHandler(ProfinetDevices configuredDevices) { + this.configuredDevices = configuredDevices; + } + + @Override + public void handle(PlcDiscoveryItem discoveryItem) { + String deviceName = discoveryItem.getOptions().get("deviceName").toUpperCase(); + if (configuredDevices.getConfiguredDevices().containsKey(deviceName)) { + configuredDevices.getConfiguredDevices().get(deviceName).handle(discoveryItem); + } + } + + public void setConfiguredDevices(ProfinetDevices configuredDevices) { + this.configuredDevices = configuredDevices; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevices.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevices.java new file mode 100644 index 00000000000..d757c11a4d2 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetDevices.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.device; + +import java.util.Map; + +public class ProfinetDevices { + + private final Map configuredDevices; + + public ProfinetDevices(Map configuredDevices) { + this.configuredDevices = configuredDevices; + } + + public Map getConfiguredDevices() { + return this.configuredDevices; + } + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetEmptyModule.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetEmptyModule.java new file mode 100644 index 00000000000..a35fc29a945 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetEmptyModule.java @@ -0,0 +1,103 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.api.messages.PlcBrowseItem; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_IoCs; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_IoDataObject; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_Submodule; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ProfinetEmptyModule implements ProfinetModule{ + + @Override + public List getExpectedSubModuleApiBlocks() { + return new ArrayList<>(); + } + + @Override + public List getInputIoPsApiBlocks() { + return new ArrayList<>(); + } + + @Override + public List getOutputIoCsApiBlocks() { + return new ArrayList<>(); + } + + @Override + public List getInputIoCsApiBlocks() { + return new ArrayList<>(); + } + + @Override + public List getOutputIoPsApiBlocks() { + return new ArrayList<>(); + } + + @Override + public Integer getIdentNumber() { + return null; + } + + @Override + public Integer getSlotNumber() { + return null; + } + + @Override + public List browseTags(List browseItems, String addressSpace, Map options) { + return browseItems; + } + + public int getInputIoPsSize() { + return 0; + } + + public int getOutputIoCsSize() { + return 0; + } + + @Override + public int getInputIoCsSize() { + return 0; + } + + @Override + public int getOutputIoPsSize() { + return 0; + } + + @Override + public void populateOutputCR(int ioPsOffset, int ioCsOffset) { } + + @Override + public Map> parseTags(Map> tags, String addressSpace, ReadBuffer buffer) throws ParseException { + return tags; + } + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetMessageWrapper.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetMessageWrapper.java new file mode 100644 index 00000000000..8c196f66ff9 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetMessageWrapper.java @@ -0,0 +1,70 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.profinet.context.ProfinetDeviceContext; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Random; + +public class ProfinetMessageWrapper { + + private static final Logger logger = LoggerFactory.getLogger(ProfinetMessageWrapper.class); + + public static void sendUdpMessage(ProfinetCallable callable, ProfinetDeviceContext context) throws RuntimeException { + try { + DceRpc_Packet packet = callable.create(); + Random rand = new Random(); + // Serialize it to a byte-payload + Ethernet_FramePayload_IPv4 udpFrame = new Ethernet_FramePayload_IPv4( + rand.nextInt(65536), + true, + false, + (short) 64, + new IpAddress(context.getLocalIpAddress().getAddress()), + new IpAddress(InetAddress.getByName(context.getIpAddress()).getAddress()), + context.getSourcePort(), + context.getDestinationPort(), + packet + ); + MacAddress srcAddress = context.getLocalMacAddress(); + MacAddress dstAddress = context.getMacAddress(); + Ethernet_Frame frame = new Ethernet_Frame( + dstAddress, + srcAddress, + udpFrame); + + context.getChannel().send(frame); + + } catch (IOException e) { + logger.error("Unable to send UDP message"); + context.setState(ProfinetDeviceState.ABORT); + } + } + + public static void sendPnioMessage(ProfinetCallable callable, ProfinetDeviceContext context) throws RuntimeException { + Ethernet_Frame packet = callable.create(); + context.getChannel().send(packet); + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModule.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModule.java new file mode 100644 index 00000000000..a7f81612c41 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModule.java @@ -0,0 +1,57 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.api.messages.PlcBrowseItem; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.profinet.gsdml.ProfinetVirtualSubmoduleItem; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_IoCs; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_IoDataObject; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_Submodule; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public interface ProfinetModule { + + List getExpectedSubModuleApiBlocks(); + List getInputIoPsApiBlocks(); + List getOutputIoCsApiBlocks(); + List getInputIoCsApiBlocks(); + List getOutputIoPsApiBlocks(); + Integer getIdentNumber(); + Integer getSlotNumber(); + List browseTags(List browseItems, String addressSpace, Map options); + + int getInputIoPsSize(); + + int getOutputIoCsSize(); + + int getInputIoCsSize(); + + int getOutputIoPsSize(); + void populateOutputCR(int ioPsOffset, int ioCsOffset); + + Map> parseTags(Map> tags, String addressSpace, ReadBuffer buffer) throws ParseException; +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java new file mode 100644 index 00000000000..9c6a7f2fe6e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetModuleImpl.java @@ -0,0 +1,353 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.api.messages.PlcBrowseItem; +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.profinet.gsdml.*; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.profinet.tag.ProfinetTag; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.messages.DefaultPlcBrowseItem; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.values.PlcSINT; +import org.apache.plc4x.java.spi.values.PlcSTRING; + +import java.util.*; + +public class ProfinetModuleImpl implements ProfinetModule { + + private final ProfinetDeviceItem module; + private final int ioCsOffset; + private final int ioPsOffset; + private final int slot; + private List inputIoPsApiBlocks = new ArrayList<>(); + private List outputIoCsApiBlocks = new ArrayList<>(); + private List expectedSubModuleApiBlocks = new ArrayList<>(); + + private List inputIoCsApiBlocks = new ArrayList<>(); + private List outputIoPsApiBlocks = new ArrayList<>(); + private int ioPsSize; + private int ioCsSize; + private Integer inputCsSize = 0; + private Integer outputPsSize = 0; + + public ProfinetModuleImpl(ProfinetDeviceItem module, int ioPsOffset, int ioCsOffset, int slot) { + this.module = module; + this.ioCsOffset = ioCsOffset; + this.ioPsOffset = ioPsOffset; + this.slot = slot; + populateNode(); + } + + private void populateNode() { + int inputIoPsOffset = ioPsOffset; + int outputIoCsOffset = ioCsOffset; + + for (ProfinetVirtualSubmoduleItem virtualItem : module.getVirtualSubmoduleList()) { + if (module instanceof ProfinetDeviceAccessPointItem || module.getInputDataLength() > 0) { + inputIoPsApiBlocks.add(new PnIoCm_IoDataObject( + slot, + virtualItem.getSubslotNumber(), + inputIoPsOffset)); + inputIoPsOffset += module.getInputDataLength() + 1; + } + if (module instanceof ProfinetDeviceAccessPointItem || module.getInputDataLength() > 0) { + outputIoCsApiBlocks.add(new PnIoCm_IoCs( + slot, + virtualItem.getSubslotNumber(), + outputIoCsOffset)); + outputIoCsOffset += module.getOutputDataLength() + 1; + } + expectedSubModuleApiBlocks.addAll(populateExpectedSubModuleApiBlocks()); + } + + if (module.getSystemDefinedSubmoduleList() != null) { + for (ProfinetInterfaceSubmoduleItem interfaceItem : module.getSystemDefinedSubmoduleList().getInterfaceSubmodules()) { + Integer identNumber = Integer.decode(interfaceItem.getSubmoduleIdentNumber()); + inputIoPsApiBlocks.add(new PnIoCm_IoDataObject( + slot, + interfaceItem.getSubslotNumber(), + inputIoPsOffset)); + outputIoCsApiBlocks.add(new PnIoCm_IoCs( + slot, + interfaceItem.getSubslotNumber(), + outputIoCsOffset)); + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_NoInputNoOutputData( + identNumber, + identNumber, + false, + false, + false, + false)); + inputIoPsOffset += 1; + outputIoCsOffset += 1; + } + for ( + ProfinetPortSubmoduleItem portItem : module.getSystemDefinedSubmoduleList().getPortSubmodules()) { + Integer identNumber = Integer.decode(portItem.getSubmoduleIdentNumber()); + inputIoPsApiBlocks.add(new PnIoCm_IoDataObject( + 0, + portItem.getSubslotNumber(), + inputIoPsOffset)); + outputIoCsApiBlocks.add(new PnIoCm_IoCs( + 0, + portItem.getSubslotNumber(), + outputIoCsOffset)); + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_NoInputNoOutputData( + identNumber, + identNumber, + false, + false, + false, + false)); + inputIoPsOffset += 1; + outputIoCsOffset += 1; + } + } + + ioPsSize = inputIoPsOffset - ioPsOffset; + ioCsSize = outputIoCsOffset - ioCsOffset; + } + + public void populateOutputCR(int ioPsOffset, int ioCsOffset) { + if (module.getOutputDataLength() != 0) { + inputIoCsApiBlocks.add(new PnIoCm_IoCs( + slot, + 0x01, + ioPsOffset)); + inputCsSize += module.getOutputDataLength(); + } + + if (module.getOutputDataLength() != 0) { + outputIoPsApiBlocks.add(new PnIoCm_IoDataObject( + slot, + 0x01, + ioCsOffset)); + outputPsSize += 1 + module.getOutputDataLength(); + } + } + + private List populateExpectedSubModuleApiBlocks() { + List expectedSubModuleApiBlocks = new ArrayList<>(); + if (module.getInputDataLength() != 0 && module.getOutputDataLength() != 0) { + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_InputAndOutputData( + 0x01, + Long.decode(module.getVirtualSubmoduleList().get(0).getSubmoduleIdentNumber()), + false, + false, + false, + false, + module.getInputDataLength(), + (short) 0x01, + (short) 0x01, + module.getOutputDataLength(), + (short) 0x01, + (short) 0x01 + )); + } else if (module.getInputDataLength() != 0) { + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_InputData( + 0x01, + Long.decode(module.getVirtualSubmoduleList().get(0).getSubmoduleIdentNumber()), + false, + false, + false, + false, + module.getInputDataLength(), + (short) 0x01, + (short) 0x01)); + + + } else if (module.getOutputDataLength() != 0) { + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_OutputData( + 0x01, + Long.decode(module.getVirtualSubmoduleList().get(0).getSubmoduleIdentNumber()), + false, + false, + false, + false, + module.getOutputDataLength(), + (short) 0x01, + (short) 0x01)); + } else if (module.getInputDataLength() == 0 && module.getOutputDataLength() == 0) { + expectedSubModuleApiBlocks.add(new PnIoCm_Submodule_NoInputNoOutputData( + 0x01, + Long.decode(module.getVirtualSubmoduleList().get(0).getSubmoduleIdentNumber()), + false, + false, + false, + false + )); + } + return expectedSubModuleApiBlocks; + } + + public int getInputIoPsSize() { + return ioPsSize; + } + + public int getOutputIoCsSize() { + return ioCsSize; + } + + @Override + public int getInputIoCsSize() { + return inputCsSize; + } + + @Override + public int getOutputIoPsSize() { + return outputPsSize; + } + + @Override + public List getExpectedSubModuleApiBlocks() { + return expectedSubModuleApiBlocks; + } + + @Override + public List getInputIoPsApiBlocks() { + return inputIoPsApiBlocks; + } + + @Override + public List getOutputIoCsApiBlocks() { + return outputIoCsApiBlocks; + } + + @Override + public List getInputIoCsApiBlocks() { + return inputIoCsApiBlocks; + } + + @Override + public List getOutputIoPsApiBlocks() { + return outputIoPsApiBlocks; + } + + @Override + public Integer getIdentNumber() { + return Integer.decode(module.getModuleIdentNumber()); + } + + @Override + public Integer getSlotNumber() { + return slot; + } + + @Override + public List browseTags(List browseItems, String addressSpace, Map options) { + for (PnIoCm_IoDataObject block : inputIoPsApiBlocks) { + int identNumber = block.getSubSlotNumber(); + for (ProfinetVirtualSubmoduleItem virtual : module.getVirtualSubmoduleList()) { + if (identNumber == virtual.getSubslotNumber()) { + if (virtual.getModuleInfo().getName() != null) { + options.put("module_name", new PlcSTRING(virtual.getModuleInfo().getName().getTextId())); + } + if (virtual.getModuleInfo().getName() != null) { + options.put("module_info_text", new PlcSTRING(virtual.getModuleInfo().getInfoText().getTextId())); + } + + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + virtual.getId() + ".Status"; + browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(statusName + ":INT"), statusName, false, false, true, new HashMap<>(), options)); + if (virtual.getIoData() != null && virtual.getIoData().getInput() != null) { + for (ProfinetIoDataInput input : virtual.getIoData().getInput()) { + for (ProfinetDataItem item : input.getDataItemList()) { + if (item.isUseAsBits()) { + for (ProfinetBitDataItem bitItem : item.getBitDataItem()) { + String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + bitItem.getBitOffset(); + browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(tagName + ":BOOL"), tagName, false, false, true, new HashMap<>(), options)); + } + } else { + String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId(); + String datatype = ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()).toString(); + browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(tagName + ":" + datatype), tagName, false, false, true, new HashMap<>(), options)); + } + } + } + } + } + } + if (module.getSystemDefinedSubmoduleList() != null) { + for (ProfinetInterfaceSubmoduleItem systemInterface : module.getSystemDefinedSubmoduleList().getInterfaceSubmodules()) { + if (identNumber == systemInterface.getSubslotNumber()) { + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + systemInterface.getId() + ".Status"; + browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(statusName + ":INT"), statusName, false, false, true, new HashMap<>(), options)); + } + } + for (ProfinetPortSubmoduleItem systemPort : module.getSystemDefinedSubmoduleList().getPortSubmodules()) { + if (identNumber == systemPort.getSubslotNumber()) { + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + systemPort.getId() + ".Status"; + browseItems.add(new DefaultPlcBrowseItem(ProfinetTag.of(statusName + ":INT"), statusName, false, false, true, new HashMap<>(), options)); + } + } + } + } + + return browseItems; + } + + @Override + public Map> parseTags(Map> tags, String addressSpace, ReadBuffer buffer) throws ParseException { + for (PnIoCm_IoDataObject block : inputIoPsApiBlocks) { + int identNumber = block.getSubSlotNumber(); + for (ProfinetVirtualSubmoduleItem virtual : module.getVirtualSubmoduleList()) { + if (identNumber == virtual.getSubslotNumber()) { + if (virtual.getIoData() != null && virtual.getIoData().getInput() != null) { + for (ProfinetIoDataInput input : virtual.getIoData().getInput()) { + for (ProfinetDataItem item : input.getDataItemList()) { + if (item.isUseAsBits()) { + for (ProfinetBitDataItem bitItem : item.getBitDataItem()) { + String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId() + "." + bitItem.getBitOffset(); + tags.put(tagName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, ProfinetDataType.BOOL, 1))); + } + } else { + String tagName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + item.getTextId(); + ProfinetDataType datatype = ProfinetDataType.firstEnumForFieldConversion(item.getDataType().toUpperCase()); + tags.put(tagName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, datatype, 1))); + } + } + } + } + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + virtual.getId() + ".Status"; + tags.put(statusName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, ProfinetDataType.SINT, 1))); + } + } + if (module.getSystemDefinedSubmoduleList() != null) { + for (ProfinetInterfaceSubmoduleItem systemInterface : module.getSystemDefinedSubmoduleList().getInterfaceSubmodules()) { + if (identNumber == systemInterface.getSubslotNumber()) { + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + systemInterface.getId() + ".Status"; + tags.put(statusName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, ProfinetDataType.SINT, 1))); + } + } + for (ProfinetPortSubmoduleItem systemPort : module.getSystemDefinedSubmoduleList().getPortSubmodules()) { + if (identNumber == systemPort.getSubslotNumber()) { + String statusName = addressSpace + "." + this.slot + "." + block.getSubSlotNumber() + "." + systemPort.getId() + ".Status"; + tags.put(statusName, new ResponseItem<>(PlcResponseCode.OK, DataItem.staticParse(buffer, ProfinetDataType.SINT, 1))); + } + } + } + } + + return tags; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetRunnable.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetRunnable.java new file mode 100644 index 00000000000..fc88d4b720d --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetRunnable.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 + * + * 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.profinet.device; + +import org.pcap4j.core.PcapHandle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.function.Function; + +public class ProfinetRunnable implements Runnable { + + private final Logger logger = LoggerFactory.getLogger(ProfinetRunnable.class); + private final PcapHandle handle; + private final Function operator; + + public ProfinetRunnable(PcapHandle handle, Function operator) { + this.handle = handle; + this.operator = operator; + } + + @Override + public void run() { + operator.apply(null); + } + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetSubscriptionHandle.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetSubscriptionHandle.java new file mode 100644 index 00000000000..8a5ddb86566 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/device/ProfinetSubscriptionHandle.java @@ -0,0 +1,71 @@ +/* + * 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.profinet.device; + +import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent; +import org.apache.plc4x.java.api.model.PlcConsumerRegistration; +import org.apache.plc4x.java.api.model.PlcSubscriptionTag; +import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcSubscriptionType; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionEvent; +import org.apache.plc4x.java.spi.messages.PlcSubscriber; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration; +import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionHandle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Instant; +import java.util.*; +import java.util.function.Consumer; + +public class ProfinetSubscriptionHandle extends DefaultPlcSubscriptionHandle { + + private final PlcSubscriptionTag tag; + private final String address; + private PlcValue lastValue; + + public ProfinetSubscriptionHandle(PlcSubscriber plcSubscriber, String address, PlcSubscriptionTag tag) { + super(plcSubscriber); + this.address = address; + this.tag = tag; + } + + public String getTag() { + return address; + } + + public String getAddressString() { + return tag.getAddressString(); + } + + public PlcSubscriptionType getSubscriptionType() { + return tag.getPlcSubscriptionType(); + } + + public PlcValue getLastValue() { + return lastValue; + } + + public void setLastValue(PlcValue lastValue) { + this.lastValue = lastValue; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java index 5701f7c9c39..f06d82e7b09 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java @@ -18,13 +18,15 @@ */ package org.apache.plc4x.java.profinet.discovery; -import org.apache.plc4x.java.api.exceptions.PlcException; +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; import org.apache.plc4x.java.api.messages.PlcDiscoveryItem; import org.apache.plc4x.java.api.messages.PlcDiscoveryItemHandler; import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest; import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse; import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.profinet.ProfinetDriver; +import org.apache.plc4x.java.profinet.device.ProfinetChannel; import org.apache.plc4x.java.profinet.readwrite.*; import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryItem; @@ -32,12 +34,8 @@ import org.apache.plc4x.java.spi.messages.PlcDiscoverer; import org.apache.plc4x.java.transport.rawsocket.RawSocketTransport; import org.pcap4j.core.*; -import org.pcap4j.packet.Dot1qVlanTagPacket; -import org.pcap4j.packet.EthernetPacket; -import org.pcap4j.packet.IllegalRawDataException; -import org.pcap4j.packet.Packet; +import org.pcap4j.packet.*; import org.pcap4j.packet.namednumber.EtherType; -import org.pcap4j.util.LinkLayerAddress; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,221 +45,43 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.function.Function; public class ProfinetPlcDiscoverer implements PlcDiscoverer { - private static final EtherType PN_EtherType = EtherType.getInstance((short) 0x8892); - // The constants for the different block names and their actual meaning. private static final String DEVICE_TYPE_NAME = "DEVICE_PROPERTIES_OPTION-1"; private static final String DEVICE_NAME_OF_STATION = "DEVICE_PROPERTIES_OPTION-2"; + private static final String PLC4X_LLDP_IDENTIFIER = "PLC4X PROFINET Controller Client"; + private static final String PLC4X_LLDP_PORT = "port001.plc4x"; private static final String DEVICE_ID = "DEVICE_PROPERTIES_OPTION-3"; private static final String DEVICE_ROLE = "DEVICE_PROPERTIES_OPTION-4"; private static final String DEVICE_OPTIONS = "DEVICE_PROPERTIES_OPTION-5"; private static final String DEVICE_INSTANCE = "DEVICE_PROPERTIES_OPTION-7"; private static final String IP_OPTION_IP = "IP_OPTION-2"; - + // Pre-Defined PROFINET discovery MAC address + private static final MacAddress PROFINET_BROADCAST_MAC_ADDRESS = new MacAddress(new byte[]{0x01, 0x0E, (byte) 0xCF, 0x00, 0x00, 0x00}); + // Pre-Defined LLDP discovery MAC address + private static final MacAddress LLDP_BROADCAST_MAC_ADDRESS = new MacAddress(new byte[]{0x01, (byte) 0x80, (byte) 0xc2, 0x00, 0x00, 0x0e}); + + Map openHandles; + List values = new ArrayList<>(); + Set periodicTimers = new HashSet<>(); private final Logger logger = LoggerFactory.getLogger(ProfinetPlcDiscoverer.class); + private PlcDiscoveryItemHandler handler; + + public ProfinetPlcDiscoverer(ProfinetChannel channel) { + this.openHandles = channel.getOpenHandles(); + } @Override public CompletableFuture discover(PlcDiscoveryRequest discoveryRequest) { return discoverWithHandler(discoveryRequest, null); } - public CompletableFuture discoverWithHandler(PlcDiscoveryRequest discoveryRequest, PlcDiscoveryItemHandler handler) { + + public CompletableFuture setDiscoveryEndTimer(PlcDiscoveryRequest discoveryRequest, long delay) { CompletableFuture future = new CompletableFuture<>(); - Set openHandles = new HashSet<>(); - List values = new ArrayList<>(); - try { - for (PcapNetworkInterface dev : Pcaps.findAllDevs()) { - // It turned out on some MAC network devices without any ip addresses - // the compiling of the filter expression was causing errors. As - // currently there was no other way to detect this, this check seems - // to be sufficient. - if(dev.getAddresses().size() == 0) { - continue; - } - if (!dev.isLoopBack()) { - for (LinkLayerAddress linkLayerAddress : dev.getLinkLayerAddresses()) { - org.pcap4j.util.MacAddress macAddress = (org.pcap4j.util.MacAddress) linkLayerAddress; - PcapHandle handle = dev.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 10); - openHandles.add(handle); - - ExecutorService pool = Executors.newSingleThreadExecutor(); - - // Only react on PROFINET DCP packets targeted at our current MAC address. - handle.setFilter( - "((ether proto 0x8100) or (ether proto 0x8892)) and (ether dst " + Pcaps.toBpfString(macAddress) + ")", - BpfProgram.BpfCompileMode.OPTIMIZE); - - PacketListener listener = - packet -> { - // EthernetPacket is the highest level of abstraction we can be expecting. - // Everything inside this we will have to decode ourselves. - if (packet instanceof EthernetPacket) { - EthernetPacket ethernetPacket = (EthernetPacket) packet; - boolean isPnPacket = false; - // I have observed some times the ethernet packets being wrapped inside a VLAN - // Packet, in this case we simply unpack the content. - if (ethernetPacket.getPayload() instanceof Dot1qVlanTagPacket) { - Dot1qVlanTagPacket vlanPacket = (Dot1qVlanTagPacket) ethernetPacket.getPayload(); - if (PN_EtherType.equals(vlanPacket.getHeader().getType())) { - isPnPacket = true; - } - } else if (PN_EtherType.equals(ethernetPacket.getHeader().getType())) { - isPnPacket = true; - } - - // It's a PROFINET packet. - if (isPnPacket) { - ReadBuffer reader = new ReadBufferByteBased(ethernetPacket.getRawData()); - try { - Ethernet_Frame ethernetFrame = Ethernet_Frame.staticParse(reader); - PnDcp_Pdu pdu; - // Access the pdu data (either directly or by - // unpacking the content of the VLAN packet. - if (ethernetFrame.getPayload() instanceof Ethernet_FramePayload_VirtualLan) { - Ethernet_FramePayload_VirtualLan vlefpl = (Ethernet_FramePayload_VirtualLan) ethernetFrame.getPayload(); - pdu = ((Ethernet_FramePayload_PnDcp) vlefpl.getPayload()).getPdu(); - } else { - pdu = ((Ethernet_FramePayload_PnDcp) ethernetFrame.getPayload()).getPdu(); - } - // Inspect the PDU itself - // (in this case we only process identify response packets) - if (pdu instanceof PnDcp_Pdu_IdentifyRes) { - PnDcp_Pdu_IdentifyRes identifyResPDU = (PnDcp_Pdu_IdentifyRes) pdu; - - Map blocks = new HashMap<>(); - for (PnDcp_Block block : identifyResPDU.getBlocks()) { - String blockName = block.getOption().name() + "-" + block.getSuboption().toString(); - blocks.put(blockName, block); - } - - // The mac address of the device we found - org.pcap4j.util.MacAddress srcAddr = ethernetPacket.getHeader().getSrcAddr(); - // The mac address of the local network device - org.pcap4j.util.MacAddress dstAddr = ethernetPacket.getHeader().getDstAddr(); - - String deviceTypeName = "unknown"; - if (blocks.containsKey(DEVICE_TYPE_NAME)) { - PnDcp_Block_DevicePropertiesDeviceVendor block = (PnDcp_Block_DevicePropertiesDeviceVendor) blocks.get(DEVICE_TYPE_NAME); - deviceTypeName = new String(block.getDeviceVendorValue()).replace(" ", "%20"); - } - - String deviceName = "unknown"; - if (blocks.containsKey(DEVICE_NAME_OF_STATION)) { - PnDcp_Block_DevicePropertiesNameOfStation block = (PnDcp_Block_DevicePropertiesNameOfStation) blocks.get(DEVICE_NAME_OF_STATION); - deviceName = new String(block.getNameOfStation()).replace(" ", "%20"); - } - - String role = "unknown"; - if (blocks.containsKey(DEVICE_ROLE)) { - role = ""; - PnDcp_Block_DevicePropertiesDeviceRole block = (PnDcp_Block_DevicePropertiesDeviceRole) blocks.get(DEVICE_ROLE); - if (block.getPnioSupervisor()) { - role += ",SUPERVISOR"; - } - if (block.getPnioMultidevive()) { - role += ",MULTIDEVICE"; - } - if (block.getPnioController()) { - role += ",CONTROLLER"; - } - if (block.getPnioDevice()) { - role += ",DEVICE"; - } - // Cut off the first comma - if (role.length() > 0) { - role = role.substring(1); - } else { - role = "unknown"; - } - } - - String remoteIpAddress = "unknown"; - String remoteSubnetMask = "unknown"; - if (blocks.containsKey(IP_OPTION_IP)) { - PnDcp_Block_IpParameter block = (PnDcp_Block_IpParameter) blocks.get(IP_OPTION_IP); - try { - InetAddress addr = InetAddress.getByAddress(block.getIpAddress()); - remoteIpAddress = addr.getHostAddress(); - InetAddress netMask = InetAddress.getByAddress(block.getSubnetMask()); - remoteSubnetMask = netMask.getHostAddress(); - } catch (UnknownHostException e) { - remoteIpAddress = "invalid"; - } - } - - // Get the Vendor Id and the Device Id - String vendorId = "unknown"; - String deviceId = "unknown"; - if (blocks.containsKey(DEVICE_ID)) { - PnDcp_Block_DevicePropertiesDeviceId block = (PnDcp_Block_DevicePropertiesDeviceId) blocks.get(DEVICE_ID); - vendorId = String.format("%04X", block.getVendorId()); - deviceId = String.format("%04X", block.getDeviceId()); - } - - Map options = new HashMap<>(); - options.put("remoteIpAddress", remoteIpAddress); - options.put("remoteSubnetMask", remoteSubnetMask); - options.put("remoteMacAddress", srcAddr.toString()); - options.put("localMacAddress", dstAddr.toString()); - options.put("deviceTypeName", deviceTypeName); - options.put("deviceName", deviceName); - options.put("vendorId", vendorId); - options.put("deviceId", deviceId); - options.put("role", role); - String name = deviceTypeName + " - " + deviceName; - PlcDiscoveryItem value = new DefaultPlcDiscoveryItem( - ProfinetDriver.DRIVER_CODE, RawSocketTransport.TRANSPORT_CODE, - remoteIpAddress, options, name, Collections.emptyMap()); - values.add(value); - - // If we have a discovery handler, pass it to the handler callback - if (handler != null) { - handler.handle(value); - } - - logger.debug("Found new device: '{}' with connection-url '{}'", - value.getName(), value.getConnectionUrl()); - } - } catch (ParseException e) { - logger.error("Got error decoding packet", e); - } - } - } - }; - Task t = new Task(handle, listener); - pool.execute(t); - - // Construct and send the search request. - Ethernet_Frame identificationRequest = new Ethernet_Frame( - // Pre-Defined PROFINET discovery MAC address - new MacAddress(new byte[]{0x01, 0x0E, (byte) 0xCF, 0x00, 0x00, 0x00}), - toPlc4xMacAddress(macAddress), - new Ethernet_FramePayload_VirtualLan(VirtualLanPriority.BEST_EFFORT, false, 0, - new Ethernet_FramePayload_PnDcp( - new PnDcp_Pdu_IdentifyReq(PnDcp_FrameId.DCP_Identify_ReqPDU.getValue(), - 1, - 256, - Collections.singletonList( - new PnDcp_Block_ALLSelector() - ))))); - WriteBufferByteBased buffer = new WriteBufferByteBased(34); - identificationRequest.serialize(buffer); - Packet packet = EthernetPacket.newPacket(buffer.getData(), 0, 34); - handle.sendPacket(packet); - } - } - } - } catch (IllegalRawDataException | NotOpenException | PcapNativeException | SerializationException e) { - logger.error("Got an exception while processing raw socket data", e); - future.completeExceptionally(new PlcException("Got an internal error while performing discovery")); - for (PcapHandle openHandle : openHandles) { - openHandle.close(); - } - return future; - } // Create a timer that completes the future after a given time with all the responses it found till then. Timer timer = new Timer("Discovery Timeout"); @@ -269,51 +89,362 @@ public CompletableFuture discoverWithHandler(PlcDiscoveryR public void run() { PlcDiscoveryResponse response = new DefaultPlcDiscoveryResponse(discoveryRequest, PlcResponseCode.OK, values); - future.complete(response); - for (PcapHandle openHandle : openHandles) { - openHandle.close(); + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle openHandle = entry.getValue(); + try { + openHandle.breakLoop(); + openHandle.close(); + } catch (Exception e) { + logger.error("Error occurred while closing handle"); + } } + for (Timer timer : periodicTimers) { + timer.cancel(); + timer.purge(); + } + future.complete(response); } - }, 5000L); + }, delay); + + return future; + } + public CompletableFuture discoverWithHandler(PlcDiscoveryRequest discoveryRequest, PlcDiscoveryItemHandler handler) { + this.handler = handler; + startLldpPoll(5000L); + startPnDcpPoll(30000L); + CompletableFuture future = setDiscoveryEndTimer(discoveryRequest, 10000L); return future; } - private static MacAddress toPlc4xMacAddress(org.pcap4j.util.MacAddress pcap4jMacAddress) { - byte[] address = pcap4jMacAddress.getAddress(); - return new MacAddress(new byte[]{address[0], address[1], address[2], address[3], address[4], address[5]}); + public void ongoingDiscoverWithHandler(PlcDiscoveryRequest discoveryRequest, PlcDiscoveryItemHandler handler, long lldpPeriod, long dcpPeriod) { + this.handler = handler; + startLldpPoll(lldpPeriod); + startPnDcpPoll(dcpPeriod); } - private static class Task implements Runnable { + public void processPnDcp(PnDcp_Pdu pdu, EthernetPacket ethernetPacket) { + // Inspect the PDU itself + // (in this case we only process identify response packets) + if (pdu instanceof PnDcp_Pdu_IdentifyRes) { + PnDcp_Pdu_IdentifyRes identifyResPDU = (PnDcp_Pdu_IdentifyRes) pdu; + + Map blocks = new HashMap<>(); + for (PnDcp_Block block : identifyResPDU.getBlocks()) { + String blockName = block.getOption().name() + "-" + block.getSuboption().toString(); + blocks.put(blockName, block); + } + + // The mac address of the device we found + org.pcap4j.util.MacAddress srcAddr = ethernetPacket.getHeader().getSrcAddr(); + // The mac address of the local network device + org.pcap4j.util.MacAddress dstAddr = ethernetPacket.getHeader().getDstAddr(); + + String deviceTypeName = "unknown"; + if (blocks.containsKey(DEVICE_TYPE_NAME)) { + PnDcp_Block_DevicePropertiesDeviceVendor block = (PnDcp_Block_DevicePropertiesDeviceVendor) blocks.get(DEVICE_TYPE_NAME); + deviceTypeName = new String(block.getDeviceVendorValue()).replace(" ", "%20"); + } - private final Logger logger = LoggerFactory.getLogger(Task.class); + String deviceName = "unknown"; + if (blocks.containsKey(DEVICE_NAME_OF_STATION)) { + PnDcp_Block_DevicePropertiesNameOfStation block = (PnDcp_Block_DevicePropertiesNameOfStation) blocks.get(DEVICE_NAME_OF_STATION); + deviceName = new String(block.getNameOfStation()).replace(" ", "%20"); + } + + String role = "unknown"; + if (blocks.containsKey(DEVICE_ROLE)) { + role = ""; + PnDcp_Block_DevicePropertiesDeviceRole block = (PnDcp_Block_DevicePropertiesDeviceRole) blocks.get(DEVICE_ROLE); + if (block.getPnioSupervisor()) { + role += ",SUPERVISOR"; + } + if (block.getPnioMultidevive()) { + role += ",MULTIDEVICE"; + } + if (block.getPnioController()) { + role += ",CONTROLLER"; + } + if (block.getPnioDevice()) { + role += ",DEVICE"; + } + // Cut off the first comma + if (role.length() > 0) { + role = role.substring(1); + } else { + role = "unknown"; + } + } + + String remoteIpAddress = "unknown"; + String remoteSubnetMask = "unknown"; + if (blocks.containsKey(IP_OPTION_IP)) { + PnDcp_Block_IpParameter block = (PnDcp_Block_IpParameter) blocks.get(IP_OPTION_IP); + try { + InetAddress addr = InetAddress.getByAddress(block.getIpAddress()); + remoteIpAddress = addr.getHostAddress(); + InetAddress netMask = InetAddress.getByAddress(block.getSubnetMask()); + remoteSubnetMask = netMask.getHostAddress(); + } catch (UnknownHostException e) { + remoteIpAddress = "invalid"; + } + } + + // Get the Vendor Id and the Device Id + String vendorId = "unknown"; + String deviceId = "unknown"; + if (blocks.containsKey(DEVICE_ID)) { + PnDcp_Block_DevicePropertiesDeviceId block = (PnDcp_Block_DevicePropertiesDeviceId) blocks.get(DEVICE_ID); + vendorId = String.format("%04X", block.getVendorId()); + deviceId = String.format("%04X", block.getDeviceId()); + } + + Map options = new HashMap<>(); + options.put("ipAddress", remoteIpAddress); + options.put("subnetMask", remoteSubnetMask); + options.put("macAddress", srcAddr.toString()); + options.put("localMacAddress", dstAddr.toString()); + options.put("deviceTypeName", deviceTypeName); + options.put("deviceName", deviceName); + options.put("vendorId", vendorId); + options.put("deviceId", deviceId); + options.put("role", role); + options.put("packetType", "dcp"); + String name = deviceTypeName + " - " + deviceName; + PlcDiscoveryItem value = new DefaultPlcDiscoveryItem( + ProfinetDriver.DRIVER_CODE, RawSocketTransport.TRANSPORT_CODE, + remoteIpAddress, options, name, Collections.emptyMap()); + values.add(value); + + // If we have a discovery handler, pass it to the handler callback + if (handler != null) { + handler.handle(value); + } + + logger.debug("Found new device: '{}' with connection-url '{}'", + value.getName(), value.getConnectionUrl()); + } + } + + public void processLldp(Lldp_Pdu pdu) { + + Map options = new HashMap<>(); + boolean profibusDevice = false; + + List units = pdu.getLldpParameters(); + for (LldpUnit unit : units) { + if (unit instanceof TlvPortId) { + TlvPortId portIdPacket = (TlvPortId) unit; + options.put("portId", portIdPacket.getPortId()); + if (portIdPacket.getPortId().contains(".")) { + options.put("deviceName", portIdPacket.getPortId().split("\\.")[1]); + } else { + options.put("deviceName", portIdPacket.getPortId()); + } + } else if (unit instanceof TlvChassisId) { + TlvChassisId chassisIdPacket = (TlvChassisId) unit; + options.put("chassisId", chassisIdPacket.getChassisId()); + } else if (unit instanceof TlvManagementAddress) { + TlvManagementAddress managementAddressPacket = (TlvManagementAddress) unit; + try { + String ipAddress = InetAddress.getByAddress(managementAddressPacket.getIpAddress().getData()).getHostAddress(); + options.put("ipAddress", ipAddress); + } catch (UnknownHostException e) { + throw new RuntimeException(e); + } + + } else if (unit instanceof TlvOrganizationSpecific) { + TlvOrganizationSpecific orgSpecific = (TlvOrganizationSpecific) unit; + if (orgSpecific.getOrganizationSpecificUnit().getUniqueCode() == 0x000ECF) { + TlvOrgSpecificProfibus specificProfibus = (TlvOrgSpecificProfibus) orgSpecific.getOrganizationSpecificUnit(); + TlvOrgSpecificProfibusUnit specificProfibusUnit = specificProfibus.getSpecificUnit(); + switch (specificProfibusUnit.getSubType()) { + case CHASSIS_MAC: + TlvProfibusSubTypeChassisMac chassisMac = (TlvProfibusSubTypeChassisMac) specificProfibusUnit; + options.put("macAddress", Hex.encodeHexString(chassisMac.getMacAddress().getAddress())); + profibusDevice = true; + break; + case PORT_STATUS: + break; + } + } + } + } + + options.put("packetType", "lldp"); + + if (profibusDevice) { + PlcDiscoveryItem value = new DefaultPlcDiscoveryItem( + ProfinetDriver.DRIVER_CODE, RawSocketTransport.TRANSPORT_CODE, + "lldp_response_packet", options, options.get("portId"), Collections.emptyMap()); + values.add(value); + + // If we have a discovery handler, pass it to the handler callback + if (handler != null) { + handler.handle(value); + } + + logger.debug("Found new device: '{}' via an LLDP broardcast", + options.get("portId")); + } + } + + public void startPnDcpPoll(long period) { + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle handle = entry.getValue(); + MacAddress macAddress = entry.getKey(); + // Construct and send the search request. + + Function pnDcpTimer = + message -> { + Ethernet_Frame identificationRequest = new Ethernet_Frame( + PROFINET_BROADCAST_MAC_ADDRESS, + macAddress, + new Ethernet_FramePayload_VirtualLan(VirtualLanPriority.BEST_EFFORT, false, 0, + new Ethernet_FramePayload_PnDcp( + new PnDcp_Pdu_IdentifyReq(PnDcp_FrameId.DCP_Identify_ReqPDU.getValue(), + 1, + 256, + Collections.singletonList( + new PnDcp_Block_ALLSelector() + ))))); + WriteBufferByteBased buffer = new WriteBufferByteBased(34); + try { + identificationRequest.serialize(buffer); + } catch (SerializationException e) { + throw new RuntimeException(e); + } + Packet packet = null; + try { + packet = EthernetPacket.newPacket(buffer.getData(), 0, 34); + } catch (IllegalRawDataException e) { + throw new RuntimeException(e); + } + try { + handle.sendPacket(packet); + } catch (PcapNativeException e) { + throw new RuntimeException(e); + } catch (NotOpenException e) { + throw new RuntimeException(e); + } + return null; + }; + + Timer timer = new Timer(); + periodicTimers.add(timer); + + // Schedule to run after every 3 second(3000 millisecond) + timer.scheduleAtFixedRate( + new PeriodicTask(handle, pnDcpTimer), + 0, + period); + } + } + + public void startLldpPoll(long period) { + for (Map.Entry entry : openHandles.entrySet()) { + PcapHandle handle = entry.getValue(); + MacAddress macAddress = entry.getKey(); + + Function lldpTimer = + message -> { + // Construct and send the LLDP Probe + TlvOrgSpecificProfibus portStatus = new TlvOrgSpecificProfibus( + new TlvProfibusSubTypePortStatus(0x00, false, false, (byte) 0x00) + ); + + TlvOrgSpecificProfibus chassisMac = new TlvOrgSpecificProfibus( + new TlvProfibusSubTypeChassisMac(macAddress) + ); + + TlvOrgSpecificIeee8023 ieee = new TlvOrgSpecificIeee8023( + (short) 0x01, + (short) 0x03, + 0x0020, + 0x0010 + ); + + Ethernet_Frame identificationRequest = null; + try { + identificationRequest = new Ethernet_Frame( + LLDP_BROADCAST_MAC_ADDRESS, + macAddress, + new Ethernet_FramePayload_LLDP( + new Lldp_Pdu( + Arrays.asList( + new TlvChassisId( + PLC4X_LLDP_IDENTIFIER.length() + 1, + (short) 7, + PLC4X_LLDP_IDENTIFIER + ), + new TlvPortId( + PLC4X_LLDP_PORT.length() + 1, + (short) 7, + PLC4X_LLDP_PORT + ), + new TlvTimeToLive(2, 20), + new TlvOrganizationSpecific( + portStatus.getLengthInBytes(), + portStatus + ), + new TlvOrganizationSpecific( + chassisMac.getLengthInBytes(), + chassisMac + ), + new TlvOrganizationSpecific( + ieee.getLengthInBytes(), + ieee + ), + new TlvManagementAddress( + 12, + ManagementAddressSubType.IPV4, + new IpAddress(Hex.decodeHex("c0a85a6e")), + (short) 0x03, + 0x01L, + (short) 0x00 + ), + new EndOfLldp(0) + ) + ))); + } catch (DecoderException e) { + throw new RuntimeException(e); + } + WriteBufferByteBased buffer = new WriteBufferByteBased(identificationRequest.getLengthInBytes()); + try { + identificationRequest.serialize(buffer); + Packet packet = EthernetPacket.newPacket(buffer.getBytes(), 0, identificationRequest.getLengthInBytes()); + handle.sendPacket(packet); + } catch (PcapNativeException | NotOpenException | SerializationException | IllegalRawDataException e) { + throw new RuntimeException(e); + } + return null; + }; + Timer timer = new Timer(); + periodicTimers.add(timer); + + // Schedule to run after every 3 second(3000 millisecond) + timer.scheduleAtFixedRate( + new PeriodicTask(handle, lldpTimer), + 0, + period); + } + } + + private static class PeriodicTask extends TimerTask { private final PcapHandle handle; - private final PacketListener listener; + private final Function operator; - public Task(PcapHandle handle, PacketListener listener) { + public PeriodicTask(PcapHandle handle, Function operator) { this.handle = handle; - this.listener = listener; + this.operator = operator; } @Override public void run() { - try { - handle.loop(10, listener); - } catch (InterruptedException e) { - logger.error("Got error handling raw socket", e); - Thread.currentThread().interrupt(); - } catch (PcapNativeException | NotOpenException e) { - logger.error("Got error handling raw socket", e); - } + operator.apply(null); } - } - - public static void main(String[] args) throws Exception { - ProfinetPlcDiscoverer discoverer = new ProfinetPlcDiscoverer(); - discoverer.discover(null); - Thread.sleep(10000); } -} +} \ No newline at end of file diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationProcess.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationProcess.java new file mode 100644 index 00000000000..185600404a2 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationProcess.java @@ -0,0 +1,66 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ApplicationProcess") +public class ProfinetApplicationProcess { + + @JacksonXmlProperty(localName="DeviceAccessPointList") + private List deviceAccessPointList; + + @JacksonXmlProperty(localName="ModuleList") + private List moduleList; + + @JacksonXmlProperty(localName="LogBookEntryList") + private List logBookEntryList; + + @JacksonXmlProperty(localName="GraphicsList") + private List graphicsList; + + @JacksonXmlProperty(localName="ExternalTextList") + private ProfinetExternalTextList externalTextList; + + public List getDeviceAccessPointList() { + return deviceAccessPointList; + } + + public List getModuleList() { + return moduleList; + } + + public List getLogBookEntryList() { + return logBookEntryList; + } + + public List getGraphicsList() { + return graphicsList; + } + + public ProfinetExternalTextList getExternalTextList() { + return externalTextList; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationRelations.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationRelations.java new file mode 100644 index 00000000000..4852db651ab --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetApplicationRelations.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ApplicationRelations") +public class ProfinetApplicationRelations { + + @JacksonXmlProperty(isAttribute=true, localName="StartupMode") + private String startupMode; + + @JacksonXmlProperty(localName="TimingProperties") + private ProfinetTimingProperties TimingProperties; + + public String getStartupMode() { + return startupMode; + } + + public ProfinetTimingProperties getTimingProperties() { + return TimingProperties; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetBitDataItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetBitDataItem.java new file mode 100644 index 00000000000..bd415caf6bd --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetBitDataItem.java @@ -0,0 +1,44 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("BitDataItem") +public class ProfinetBitDataItem { + + @JacksonXmlProperty(isAttribute=true, localName="BitOffset") + private int bitOffset; + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + public int getBitOffset() { + return bitOffset; + } + + public String getTextId() { + return textId; + } +} + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetCertificationInfo.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetCertificationInfo.java new file mode 100644 index 00000000000..250181b382b --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetCertificationInfo.java @@ -0,0 +1,50 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("CertificationInfo") +public class ProfinetCertificationInfo { + + @JacksonXmlProperty(isAttribute=true, localName="ConformanceClass") + private String conformanceClass; + + @JacksonXmlProperty(isAttribute=true, localName="ApplicationClass") + private String applicationClass; + + @JacksonXmlProperty(isAttribute=true, localName="NetloadClass") + private String netloadClass; + + public String getConformanceClass() { + return conformanceClass; + } + + public String getApplicationClass() { + return applicationClass; + } + + public String getNetloadClass() { + return netloadClass; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDataItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDataItem.java new file mode 100644 index 00000000000..1889622e9d5 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDataItem.java @@ -0,0 +1,63 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = false) +@JsonRootName("DataItem") +public class ProfinetDataItem { + + @JacksonXmlProperty(localName="BitDataItem") + @JacksonXmlElementWrapper(useWrapping = false) + private List bitDataItem; + + @JacksonXmlProperty(isAttribute=true, localName="DataType") + private String dataType; + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + @JacksonXmlProperty(isAttribute=true, localName="UseAsBits") + private boolean useAsBits; + + public String getDataType() { + return dataType; + } + + public String getTextId() { + return textId; + } + + public boolean isUseAsBits() { + return useAsBits; + } + + public List getBitDataItem() { + return bitDataItem; + } +} + + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceAccessPointItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceAccessPointItem.java new file mode 100644 index 00000000000..c3157a71867 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceAccessPointItem.java @@ -0,0 +1,188 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("DeviceAccessPointItem") +public class ProfinetDeviceAccessPointItem implements ProfinetDeviceItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="PNIO_Version") + private String pnioVersion; + + @JacksonXmlProperty(isAttribute=true, localName="PhysicalSlots") + private String physicalSlots; + + @JacksonXmlProperty(isAttribute=true, localName="ModuleIdentNumber") + private String moduleIdentNumber; + + @JacksonXmlProperty(isAttribute=true, localName="MinDeviceInterval") + private int minDeviceInterval; + + @JacksonXmlProperty(isAttribute=true, localName="DNS_CompatibleName") + private String dnsCompatibleName; + + @JacksonXmlProperty(isAttribute=true, localName="FixedInSlots") + private int fixedInSlots; + + @JacksonXmlProperty(isAttribute=true, localName="ObjectUUID_LocalIndex") + private int objectUUIDLocalIndex; + + @JacksonXmlProperty(isAttribute=true, localName="DeviceAccessSupported") + private boolean deviceAccessSupported; + + @JacksonXmlProperty(isAttribute=true, localName="MultipleWriteSupported") + private boolean multipleWriteSupported; + + @JacksonXmlProperty(isAttribute=true, localName="CheckDeviceID_Allowed") + private boolean checkDeviceIDAllowed; + + @JacksonXmlProperty(isAttribute=true, localName="NameOfStationNotTransferable") + private boolean nameOfStationNotTransferable; + + @JacksonXmlProperty(isAttribute=true, localName="LLDP_NoD_Supported") + private boolean lldpNodSupported; + + @JacksonXmlProperty(isAttribute=true, localName="ResetToFactoryModes") + private String resetToFactoryModes; + + @JacksonXmlProperty(localName="ModuleInfo") + private ProfinetModuleInfo moduleInfo; + + @JacksonXmlProperty(localName="CertificationInfo") + private ProfinetCertificationInfo certificationInfo; + + @JacksonXmlProperty(localName="IOConfigData") + private ProfinetIOConfigData ioConfigData; + + @JacksonXmlProperty(localName="UseableModules") + private List useableModules; + + @JacksonXmlProperty(localName="VirtualSubmoduleList") + private List virtualSubmoduleList; + + @JacksonXmlProperty(localName="SystemDefinedSubmoduleList") + private ProfinetSystemDefinedSubmoduleList systemDefinedSubmoduleList; + + @JacksonXmlProperty(localName="Graphics") + private ProfinetGraphics graphics; + + public String getId() { + return id; + } + + public String getPnioVersion() { + return pnioVersion; + } + + public String getPhysicalSlots() { + return physicalSlots; + } + + public String getModuleIdentNumber() { + return moduleIdentNumber; + } + + @Override + public Integer getInputDataLength() { + return 0; + } + + @Override + public Integer getOutputDataLength() { + return 0; + } + + public int getMinDeviceInterval() { + return minDeviceInterval; + } + + public String getDnsCompatibleName() { + return dnsCompatibleName; + } + + public int getFixedInSlots() { + return fixedInSlots; + } + + public int getObjectUUIDLocalIndex() { + return objectUUIDLocalIndex; + } + + public boolean isDeviceAccessSupported() { + return deviceAccessSupported; + } + + public boolean isMultipleWriteSupported() { + return multipleWriteSupported; + } + + public boolean isCheckDeviceIDAllowed() { + return checkDeviceIDAllowed; + } + + public boolean isNameOfStationNotTransferable() { + return nameOfStationNotTransferable; + } + + public boolean isLldpNodSupported() { + return lldpNodSupported; + } + + public String getResetToFactoryModes() { + return resetToFactoryModes; + } + + public ProfinetModuleInfo getModuleInfo() { + return moduleInfo; + } + + public ProfinetCertificationInfo getCertificationInfo() { + return certificationInfo; + } + + public ProfinetIOConfigData getIoConfigData() { + return ioConfigData; + } + + public List getUseableModules() { + return useableModules; + } + + public List getVirtualSubmoduleList() { + return virtualSubmoduleList; + } + + public ProfinetSystemDefinedSubmoduleList getSystemDefinedSubmoduleList() { + return systemDefinedSubmoduleList; + } + + public ProfinetGraphics getGraphics() { + return graphics; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceFunction.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceFunction.java new file mode 100644 index 00000000000..6789de1d43f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceFunction.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("DeviceFunction") +public class ProfinetDeviceFunction { + + @JacksonXmlProperty(localName="Family") + private ProfinetFamily family; + + public ProfinetFamily getFamily() { + return family; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceIdentity.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceIdentity.java new file mode 100644 index 00000000000..58d820b259a --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceIdentity.java @@ -0,0 +1,58 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("DeviceIdentity") +public class ProfinetDeviceIdentity { + + + @JacksonXmlProperty(isAttribute = true, localName = "VendorID") + private String vendorId; + + @JacksonXmlProperty(isAttribute = true, localName = "DeviceID") + private String deviceID; + + @JacksonXmlProperty(localName = "InfoText") + private ProfinetTextId infoText; + + @JacksonXmlProperty(localName = "VendorName") + private ProfinetValue vendorName; + + public String getVendorId() { + return vendorId; + } + + public String getDeviceID() { + return deviceID; + } + + public ProfinetTextId getInfoText() { + return infoText; + } + + public ProfinetValue getVendorName() { + return vendorName; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceItem.java new file mode 100644 index 00000000000..f5f02621e0a --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetDeviceItem.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.gsdml; + +import java.util.List; + +public interface ProfinetDeviceItem { + + List getVirtualSubmoduleList(); + + ProfinetSystemDefinedSubmoduleList getSystemDefinedSubmoduleList(); + + String getModuleIdentNumber(); + + Integer getInputDataLength(); + + Integer getOutputDataLength(); + +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetErrorCode2Value.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetErrorCode2Value.java new file mode 100644 index 00000000000..a2c9374cda6 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetErrorCode2Value.java @@ -0,0 +1,40 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ErrorCode2Value") +public class ProfinetErrorCode2Value { + + @JacksonXmlProperty(isAttribute=true, localName="Name") + private ProfinetTextId name; + + public ProfinetTextId getName() { + return name; + } +} + + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetExternalTextList.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetExternalTextList.java new file mode 100644 index 00000000000..0d307f80b4f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetExternalTextList.java @@ -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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProfinetExternalTextList { + + @JacksonXmlProperty(localName="PrimaryLanguage") + private ProfinetPrimaryLanguage primaryLanguage; + + public ProfinetPrimaryLanguage getPrimaryLanguage() { + return primaryLanguage; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetFamily.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetFamily.java new file mode 100644 index 00000000000..ab34c28f855 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetFamily.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("Family") +public class ProfinetFamily { + + @JacksonXmlProperty(isAttribute=true, localName="MainFamily") + private String mainFamily; + + @JacksonXmlProperty(isAttribute=true, localName="ProductFamily") + private String productFamily; + + public String getMainFamily() { + return mainFamily; + } + + public String getProductFamily() { + return productFamily; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicItem.java new file mode 100644 index 00000000000..2163ac3f2c7 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicItem.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("GraphicsItem") +public class ProfinetGraphicItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="GraphicFile") + private String graphicFile; + + public String getId() { + return id; + } + + public String getGraphicFile() { + return graphicFile; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphics.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphics.java new file mode 100644 index 00000000000..1139412c173 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphics.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("Graphics") +public class ProfinetGraphics { + + @JacksonXmlProperty(localName="GraphicItemRef") + private ProfinetGraphicsItemRef GraphicItemRef; + + public ProfinetGraphicsItemRef getGraphicItemRef() { + return GraphicItemRef; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicsItemRef.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicsItemRef.java new file mode 100644 index 00000000000..da030107cc5 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGraphicsItemRef.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("GraphicsItemRef") +public class ProfinetGraphicsItemRef { + + @JacksonXmlProperty(isAttribute=true, localName="Type") + private String type; + + @JacksonXmlProperty(isAttribute=true, localName="GraphicItemTarget") + private String graphicItemTarget; + + public String getType() { + return type; + } + + public String getGraphicItemTarget() { + return graphicItemTarget; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIOConfigData.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIOConfigData.java new file mode 100644 index 00000000000..ff161665c4b --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIOConfigData.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("IOConfigData") +public class ProfinetIOConfigData { + + @JacksonXmlProperty(isAttribute=true, localName="MaxInputLength") + private int maxInputLength; + + @JacksonXmlProperty(isAttribute=true, localName="MaxOutputLength") + private int maxOutputLength; + + public int getMaxInputLength() { + return maxInputLength; + } + + public int getMaxOutputLength() { + return maxOutputLength; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Profile.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Profile.java new file mode 100644 index 00000000000..f99b06cd01e --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Profile.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ISO15745Profile") +public class ProfinetISO15745Profile { + + @JsonProperty("ProfileHeader") + private ProfinetProfileHeader profileHeader; + + @JsonProperty("ProfileBody") + private ProfinetProfileBody profileBody; + + public ProfinetProfileHeader getProfileHeader() { + return profileHeader; + } + + public ProfinetProfileBody getProfileBody() { + return profileBody; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Reference.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Reference.java new file mode 100644 index 00000000000..5ef26de3a66 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetISO15745Reference.java @@ -0,0 +1,50 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ISO15745Reference") +public class ProfinetISO15745Reference { + + @JsonProperty("ISO15745Part") + private int iso15745Part; + + @JsonProperty("ISO15745Edition") + private int iso15745Edition; + + @JsonProperty("ProfileTechnology") + private String profileTechnology; + + public int getIso15745Part() { + return iso15745Part; + } + + public int getIso15745Edition() { + return iso15745Edition; + } + + public String getProfileTechnology() { + return profileTechnology; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetInterfaceSubmoduleItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetInterfaceSubmoduleItem.java new file mode 100644 index 00000000000..374abd9c5ae --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetInterfaceSubmoduleItem.java @@ -0,0 +1,100 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("InterfaceSubmoduleItem") +public class ProfinetInterfaceSubmoduleItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="SubmoduleIdentNumber") + private String submoduleIdentNumber; + + @JacksonXmlProperty(isAttribute=true, localName="SubslotNumber") + private int subslotNumber; + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + @JacksonXmlProperty(isAttribute=true, localName="SupportedRT_Classes") + private String supportedRtClasses; + + @JacksonXmlProperty(isAttribute=true, localName="SupportedProtocols") + private String supportedProtocols; + + @JacksonXmlProperty(isAttribute=true, localName="NetworkComponentDiagnosisSupported") + private boolean networkComponentDiagnosisSupported; + + @JacksonXmlProperty(isAttribute=true, localName="PTP_BoundarySupported") + private boolean ptpBoundarySupported; + + @JacksonXmlProperty(isAttribute=true, localName="DCP_BoundarySupported") + private boolean dcpBoundarySupported; + + @JacksonXmlProperty(localName="ApplicationRelations") + private ProfinetApplicationRelations applicationRelations; + + public String getId() { + return id; + } + + public String getSubmoduleIdentNumber() { + return submoduleIdentNumber; + } + + public int getSubslotNumber() { + return subslotNumber; + } + + public String getTextId() { + return textId; + } + + public String getSupportedRtClasses() { + return supportedRtClasses; + } + + public String getSupportedProtocols() { + return supportedProtocols; + } + + public boolean isNetworkComponentDiagnosisSupported() { + return networkComponentDiagnosisSupported; + } + + public boolean isPtpBoundarySupported() { + return ptpBoundarySupported; + } + + public boolean isDcpBoundarySupported() { + return dcpBoundarySupported; + } + + public ProfinetApplicationRelations getApplicationRelations() { + return applicationRelations; + } +} + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoData.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoData.java new file mode 100644 index 00000000000..2b800e11bbe --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoData.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("IOData") +public class ProfinetIoData { + + @JacksonXmlProperty(isAttribute=true, localName="IOPS_Length") + private int iopsLength; + + @JacksonXmlProperty(isAttribute=true, localName="IOCS_Length") + private int iocsLength; + + @JacksonXmlProperty(localName="Input") + @JacksonXmlElementWrapper(useWrapping = false) + private List input; + + @JacksonXmlProperty(localName="Output") + @JacksonXmlElementWrapper(useWrapping = false) + private List output; + + public int getIopsLength() { + return iopsLength; + } + + public int getIocsLength() { + return iocsLength; + } + + public List getInput() { + return input; + } + + public List getOutput() { + return output; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataInput.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataInput.java new file mode 100644 index 00000000000..9ad1e58e9a3 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataInput.java @@ -0,0 +1,46 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +import java.util.List; + +@JsonTypeName("Input") +public class ProfinetIoDataInput { + + @JacksonXmlProperty(isAttribute=true, localName="Consistency") + private String consistency; + + @JacksonXmlProperty(localName="DataItem") + @JacksonXmlElementWrapper(useWrapping = false) + private List dataItemList; + + public String getConsistency() { + return consistency; + } + + public List getDataItemList() { + return dataItemList; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataOutput.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataOutput.java new file mode 100644 index 00000000000..cae0a033f00 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetIoDataOutput.java @@ -0,0 +1,46 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; + +import java.util.List; + +@JsonTypeName("Output") +public class ProfinetIoDataOutput { + + @JacksonXmlProperty(isAttribute=true, localName="Consistency") + private String consistency; + + @JacksonXmlProperty(localName="DataItem") + @JacksonXmlElementWrapper(useWrapping = false) + private List dataItemList; + + public String getConsistency() { + return consistency; + } + + public List getDataItemList() { + return dataItemList; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetLogBookEntryItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetLogBookEntryItem.java new file mode 100644 index 00000000000..db2f06fd91c --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetLogBookEntryItem.java @@ -0,0 +1,47 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("LogBookEntryItem") +public class ProfinetLogBookEntryItem { + + @JacksonXmlProperty(isAttribute=true, localName="Status") + private String status; + + @JacksonXmlProperty(localName="ErrorCode2Value") + private ProfinetErrorCode2Value errorCode2Value; + + public String getStatus() { + return status; + } + + public ProfinetErrorCode2Value getErrorCode2Value() { + return errorCode2Value; + } +} + + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleInfo.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleInfo.java new file mode 100644 index 00000000000..0c1df8a40a8 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleInfo.java @@ -0,0 +1,71 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("DeviceAccessPointList") +public class ProfinetModuleInfo { + + @JacksonXmlProperty(localName="Name") + private ProfinetTextId name; + + @JacksonXmlProperty(localName="InfoText") + private ProfinetTextId infoText; + + @JacksonXmlProperty(localName="VendorName") + private ProfinetValue vendorName; + + @JacksonXmlProperty(localName="OrderNumber") + private ProfinetValue orderNumber; + + @JacksonXmlProperty(localName="HardwareRelease") + private ProfinetValue hardwareRelease; + + @JacksonXmlProperty(localName="SoftwareRelease") + private ProfinetValue softwareRelease; + + public ProfinetTextId getName() { + return name; + } + + public ProfinetTextId getInfoText() { + return infoText; + } + + public ProfinetValue getVendorName() { + return vendorName; + } + + public ProfinetValue getOrderNumber() { + return orderNumber; + } + + public ProfinetValue getHardwareRelease() { + return hardwareRelease; + } + + public ProfinetValue getSoftwareRelease() { + return softwareRelease; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItem.java new file mode 100644 index 00000000000..cd1b091efd8 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItem.java @@ -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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import org.apache.plc4x.java.profinet.readwrite.ProfinetDataType; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ModuleItem") +public class ProfinetModuleItem implements ProfinetDeviceItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="ModuleIdentNumber") + private String moduleIdentNumber; + + @JacksonXmlProperty(localName="ModuleInfo") + private ProfinetModuleInfo moduleInfo; + + @JacksonXmlProperty(localName="VirtualSubmoduleList") + private List virtualSubmoduleList; + + public String getId() { + return id; + } + + public String getModuleIdentNumber() { + return moduleIdentNumber; + } + + public ProfinetModuleInfo getModuleInfo() { + return moduleInfo; + } + + public List getVirtualSubmoduleList() { + return virtualSubmoduleList; + } + + @Override + public ProfinetSystemDefinedSubmoduleList getSystemDefinedSubmoduleList() { + return null; + } + + private static int getLengthSimpleType(String dataType) { + ProfinetDataType dt = ProfinetDataType.firstEnumForFieldConversion(dataType.toUpperCase()); + if (dt == null) { + throw new UnsupportedOperationException("Data type " + dataType + " not supported"); + } + Integer dataTypeSize = (int) dt.getDataTypeSize(); + return dataTypeSize; + } + + public Integer getInputDataLength() { + int length = 0; + for (ProfinetVirtualSubmoduleItem module : this.virtualSubmoduleList) { + if (module.getIoData() != null && module.getIoData().getInput() != null) { + for (ProfinetIoDataInput inputIoData : module.getIoData().getInput()) { + for (ProfinetDataItem dataItem : inputIoData.getDataItemList()) { + length += ProfinetModuleItem.getLengthSimpleType(dataItem.getDataType()); + } + } + } + } + return length; + } + + public Integer getOutputDataLength() { + int length = 0; + for (ProfinetVirtualSubmoduleItem module : this.virtualSubmoduleList) { + if (module.getIoData() != null && module.getIoData().getOutput() != null) { + for (ProfinetIoDataOutput outputIoData : module.getIoData().getOutput()) { + for (ProfinetDataItem dataItem : outputIoData.getDataItemList()) { + length += ProfinetModuleItem.getLengthSimpleType(dataItem.getDataType()); + } + } + } + } + return length; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItemRef.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItemRef.java new file mode 100644 index 00000000000..465147d1f17 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetModuleItemRef.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ModuleItemRef") +public class ProfinetModuleItemRef { + + @JacksonXmlProperty(isAttribute=true, localName="ModuleItemTarget") + private String moduleItemTarget; + + @JacksonXmlProperty(isAttribute=true, localName="AllowedInSlots") + private String allowedInSlots; + + public String getModuleItemTarget() { + return moduleItemTarget; + } + + public String getAllowedInSlots() { + return allowedInSlots; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetParameterRecordDataItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetParameterRecordDataItem.java new file mode 100644 index 00000000000..7f9631b3625 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetParameterRecordDataItem.java @@ -0,0 +1,59 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ParameterRecordDataItem") +public class ProfinetParameterRecordDataItem { + + @JacksonXmlProperty(isAttribute=true, localName="Index") + private int index; + + @JacksonXmlProperty(isAttribute=true, localName="Length") + private int length; + + @JacksonXmlProperty(localName="Name") + private ProfinetTextId name; + + @JacksonXmlProperty(localName="Ref") + private ProfinetRef ref; + + public int getIndex() { + return index; + } + + public int getLength() { + return length; + } + + public ProfinetTextId getName() { + return name; + } + + public ProfinetRef getRef() { + return ref; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPortSubmoduleItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPortSubmoduleItem.java new file mode 100644 index 00000000000..56477d4a88f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPortSubmoduleItem.java @@ -0,0 +1,81 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("PortSubmoduleItem") +public class ProfinetPortSubmoduleItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="SubmoduleIdentNumber") + private String submoduleIdentNumber; + + @JacksonXmlProperty(isAttribute=true, localName="SubslotNumber") + private int subslotNumber; + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + @JacksonXmlProperty(isAttribute=true, localName="MaxPortRxDelay") + private int maxPortRxDelay; + + @JacksonXmlProperty(isAttribute=true, localName="MaxPortTxDelay") + private int maxPortTxDelay; + + @JacksonXmlProperty(localName="MAUTypeList") + private List mauTypeItem; + + public String getId() { + return id; + } + + public String getSubmoduleIdentNumber() { + return submoduleIdentNumber; + } + + public int getSubslotNumber() { + return subslotNumber; + } + + public String getTextId() { + return textId; + } + + public int getMaxPortRxDelay() { + return maxPortRxDelay; + } + + public int getMaxPortTxDelay() { + return maxPortTxDelay; + } + + public List getMauTypeItem() { + return mauTypeItem; + } +} + diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPrimaryLanguage.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPrimaryLanguage.java new file mode 100644 index 00000000000..b752d99d464 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetPrimaryLanguage.java @@ -0,0 +1,40 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("PrimaryLanguage") +public class ProfinetPrimaryLanguage { + + @JacksonXmlProperty(localName="Text") + @JacksonXmlElementWrapper(useWrapping = false) + private List text; + + public List getText() { + return text; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileBody.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileBody.java new file mode 100644 index 00000000000..e0947ccf465 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileBody.java @@ -0,0 +1,48 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName("ProfileBody") +public class ProfinetProfileBody { + + @JsonProperty("DeviceIdentity") + private ProfinetDeviceIdentity deviceIdentity; + + @JsonProperty("DeviceFunction") + private ProfinetDeviceFunction deviceFunction; + + @JsonProperty("ApplicationProcess") + private ProfinetApplicationProcess applicationProcess; + + public ProfinetDeviceIdentity getDeviceIdentity() { + return deviceIdentity; + } + + public ProfinetDeviceFunction getDeviceFunction() { + return deviceFunction; + } + + public ProfinetApplicationProcess getApplicationProcess() { + return applicationProcess; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileHeader.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileHeader.java new file mode 100644 index 00000000000..b57f59339a3 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetProfileHeader.java @@ -0,0 +1,71 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("ProfileHeader") +public class ProfinetProfileHeader { + + @JsonProperty("ProfileIdentification") + private String profileIdentification; + + @JsonProperty("ProfileRevision") + private String profileRevision; + + @JsonProperty("ProfileName") + private String profileName; + + @JsonProperty("ProfileSource") + private String profileSource; + + @JsonProperty("ProfileClassID") + private String profileClassID; + + @JsonProperty("ISO15745Reference") + private ProfinetISO15745Reference iso15745Reference; + + public String getProfileIdentification() { + return profileIdentification; + } + + public String getProfileRevision() { + return profileRevision; + } + + public String getProfileName() { + return profileName; + } + + public String getProfileSource() { + return profileSource; + } + + public String getProfileClassID() { + return profileClassID; + } + + public ProfinetISO15745Reference getIso15745Reference() { + return iso15745Reference; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetRef.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetRef.java new file mode 100644 index 00000000000..3edf0d90594 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetRef.java @@ -0,0 +1,78 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("Ref") +public class ProfinetRef { + + @JacksonXmlProperty(isAttribute=true, localName="DataType") + private String dataType; + + @JacksonXmlProperty(isAttribute=true, localName="ByteOffset") + private int byteOffset; + + @JacksonXmlProperty(isAttribute=true, localName="DefaultValue") + private String defaultValue; + + @JacksonXmlProperty(isAttribute=true, localName="AllowedValues") + private String allowedValues; + + @JacksonXmlProperty(isAttribute=true, localName="Changeable") + private boolean changeable; + + @JacksonXmlProperty(isAttribute=true, localName="Visible") + private boolean visible; + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + public String getDataType() { + return dataType; + } + + public int getByteOffset() { + return byteOffset; + } + + public String getDefaultValue() { + return defaultValue; + } + + public String getAllowedValues() { + return allowedValues; + } + + public boolean isChangeable() { + return changeable; + } + + public boolean isVisible() { + return visible; + } + + public String getTextId() { + return textId; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetSystemDefinedSubmoduleList.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetSystemDefinedSubmoduleList.java new file mode 100644 index 00000000000..7ef32727f4f --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetSystemDefinedSubmoduleList.java @@ -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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; + + +public class ProfinetSystemDefinedSubmoduleList { + + @JacksonXmlProperty(localName="InterfaceSubmoduleItem") + @JacksonXmlElementWrapper(useWrapping = false) + private List interfaceSubmodules; + + @JacksonXmlProperty(localName="PortSubmoduleItem") + @JacksonXmlElementWrapper(useWrapping = false) + private List portSubmodules; + + public List getInterfaceSubmodules() { + return interfaceSubmodules; + } + + public List getPortSubmodules() { + return portSubmodules; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextId.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextId.java new file mode 100644 index 00000000000..5f0001658b3 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextId.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("InfoText") +public class ProfinetTextId { + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + public String getTextId() { + return textId; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextIdValue.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextIdValue.java new file mode 100644 index 00000000000..f3cf9611fc3 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTextIdValue.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("InfoText") +public class ProfinetTextIdValue { + + @JacksonXmlProperty(isAttribute=true, localName="TextId") + private String textId; + + @JacksonXmlProperty(isAttribute=true, localName="Value") + private String value; + + public String getTextId() { + return textId; + } + + public String getValue() { + return value; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTimingProperties.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTimingProperties.java new file mode 100644 index 00000000000..4bbab3231d5 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetTimingProperties.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 + * + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("TimingProperties") +public class ProfinetTimingProperties { + + @JacksonXmlProperty(isAttribute=true, localName="SendClock") + private String sendClock; + + @JacksonXmlProperty(isAttribute=true, localName="ReductionRatio") + private String reductionRatio; + + public String getSendClock() { + return sendClock; + } + + public String getReductionRatio() { + return reductionRatio; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetValue.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetValue.java new file mode 100644 index 00000000000..686bc62e5d7 --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetValue.java @@ -0,0 +1,36 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("VendorName") +public class ProfinetValue { + + @JacksonXmlProperty(isAttribute=true, localName="Value") + private String value; + + public String getValue() { + return value; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetVirtualSubmoduleItem.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetVirtualSubmoduleItem.java new file mode 100644 index 00000000000..7da3812affd --- /dev/null +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/gsdml/ProfinetVirtualSubmoduleItem.java @@ -0,0 +1,89 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +import java.util.List; +import java.util.Map; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("VirtualSubmoduleItem") +public class ProfinetVirtualSubmoduleItem { + + @JacksonXmlProperty(isAttribute=true, localName="ID") + private String id; + + @JacksonXmlProperty(isAttribute=true, localName="SubmoduleIdentNumber") + private String submoduleIdentNumber; + + @JacksonXmlProperty(isAttribute=true, localName="SubslotNumber") + private int subslotNumber = 1; + + @JacksonXmlProperty(isAttribute=true, localName="Writeable_IM_Records") + private String writeableImRecords; + + @JacksonXmlProperty(isAttribute=true, localName="MayIssueProcessAlarm") + private boolean mayIssueProcessAlarm; + + @JacksonXmlProperty(localName="IOData") + private ProfinetIoData ioData; + + @JacksonXmlProperty(localName="ModuleInfo") + private ProfinetModuleInfo moduleInfo; + + @JacksonXmlProperty(localName="RecordDataList") + private List recordDataList; + + public String getId() { + return id; + } + + public String getSubmoduleIdentNumber() { + return submoduleIdentNumber; + } + + public String getWriteableImRecords() { + return writeableImRecords; + } + + public boolean isMayIssueProcessAlarm() { + return mayIssueProcessAlarm; + } + + public ProfinetIoData getIoData() { + return ioData; + } + + public ProfinetModuleInfo getModuleInfo() { + return moduleInfo; + } + + public List getRecordDataList() { + return recordDataList; + } + + public int getSubslotNumber() { + return subslotNumber; + } +} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetProtocolLogic.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetProtocolLogic.java index 62b209c102a..5d747e780eb 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetProtocolLogic.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/protocol/ProfinetProtocolLogic.java @@ -18,160 +18,175 @@ */ package org.apache.plc4x.java.profinet.protocol; -import io.netty.channel.Channel; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.NotImplementedException; +import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.exceptions.PlcException; import org.apache.plc4x.java.api.messages.*; +import org.apache.plc4x.java.api.model.PlcConsumerRegistration; +import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; +import org.apache.plc4x.java.api.model.PlcSubscriptionTag; +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; import org.apache.plc4x.java.profinet.context.ProfinetDriverContext; +import org.apache.plc4x.java.profinet.device.ProfinetChannel; +import org.apache.plc4x.java.profinet.device.ProfinetDevice; +import org.apache.plc4x.java.profinet.device.ProfinetDeviceMessageHandler; +import org.apache.plc4x.java.profinet.device.ProfinetSubscriptionHandle; +import org.apache.plc4x.java.profinet.discovery.ProfinetPlcDiscoverer; import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.profinet.tag.ProfinetTag; import org.apache.plc4x.java.spi.ConversationContext; import org.apache.plc4x.java.spi.Plc4xProtocolBase; -import org.apache.plc4x.java.spi.generation.*; +import org.apache.plc4x.java.spi.configuration.HasConfiguration; +import org.apache.plc4x.java.spi.messages.*; +import org.apache.plc4x.java.spi.messages.utils.ResponseItem; +import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration; +import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag; import org.apache.plc4x.java.utils.rawsockets.netty.RawSocketChannel; -import org.pcap4j.core.PcapAddress; -import org.pcap4j.core.PcapNativeException; -import org.pcap4j.core.PcapNetworkInterface; -import org.pcap4j.core.Pcaps; +import org.pcap4j.core.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; import java.net.*; import java.time.Duration; -import java.util.Arrays; -import java.util.Collections; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; +import java.util.regex.Pattern; -public class ProfinetProtocolLogic extends Plc4xProtocolBase { +public class ProfinetProtocolLogic extends Plc4xProtocolBase implements HasConfiguration { - public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000); + private final Logger LOGGER = LoggerFactory.getLogger(ProfinetProtocolLogic.class); - private static AtomicInteger sessionKeyGenerator = new AtomicInteger(1); + private ProfinetDriverContext driverContext; - private final Logger logger = LoggerFactory.getLogger(ProfinetProtocolLogic.class); - - private ProfinetDriverContext profinetDriverContext; + public ProfinetProtocolLogic() { + super(); + setDriverContext(new ProfinetDriverContext()); + } - @Override - public void setContext(ConversationContext context) { - super.setContext(context); - this.profinetDriverContext = (ProfinetDriverContext) driverContext; + public void setDriverContext(ProfinetDriverContext driverContext) { + super.setDriverContext(driverContext); + this.driverContext = driverContext; } @Override - public void onConnect(ConversationContext context) { - final Channel channel = context.getChannel(); - if (!(channel instanceof RawSocketChannel)) { - logger.warn("Expected a 'raw' transport, closing channel..."); - context.getChannel().close(); - return; + public void setConfiguration(ProfinetConfiguration configuration) { + driverContext.setConfiguration(configuration); + driverContext.setHandler(new ProfinetDeviceMessageHandler(configuration.getDevices())); + for (Map.Entry device : configuration.getDevices().getConfiguredDevices().entrySet()) { + device.getValue().getDeviceContext().setConfiguration(configuration); } + } - RawSocketChannel rawSocketChannel = (RawSocketChannel) channel; + @Override + public void setContext(ConversationContext context) { + super.setContext(context); - // Create an udp socket - DatagramSocket udpSocket; + // Open the receiving UDP port and keep it open. try { - udpSocket = new DatagramSocket(); + driverContext.setSocket(new DatagramSocket(ProfinetDriverContext.DEFAULT_UDP_PORT)); } catch (SocketException e) { - logger.warn("Unable to create udp socket " + e.getMessage()); - context.getChannel().close(); - return; + throw new RuntimeException(e); } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Initialize some important datastructures, that will be used a lot. + driverContext.getHandler().setConfiguredDevices(driverContext.getConfiguration().getDevices()); - // Generate a new Activity Id, which will be used throughout the connection. - profinetDriverContext.setDceRpcActivityUuid(generateActivityUuid()); + for (Map.Entry device : driverContext.getConfiguration().getDevices().getConfiguredDevices().entrySet()) { + device.getValue().setContext(context, this.driverContext.getChannel()); + } + } + + private void onDeviceDiscovery() throws InterruptedException, PlcConnectionException { + ProfinetPlcDiscoverer discoverer = new ProfinetPlcDiscoverer(driverContext.getChannel()); + driverContext.getChannel().setDiscoverer(discoverer); + DefaultPlcDiscoveryRequest request = new DefaultPlcDiscoveryRequest(discoverer, new LinkedHashMap<>()); + discoverer.ongoingDiscoverWithHandler(request, driverContext.getHandler(), 5000L, 30000L); + waitForDeviceDiscovery(); + } - // TODO: Possibly we can remove the ARP lookup and simply use the mac address in the connection-response. + private void waitForDeviceDiscovery() throws InterruptedException, PlcConnectionException { + // Once we receive an LLDP and PN-DCP message for each device move on. + boolean discovered = false; + int count = 0; + while (!discovered) { + discovered = true; + for (Map.Entry device : driverContext.getConfiguration().getDevices().getConfiguredDevices().entrySet()) { + if (!device.getValue().hasLldpPdu() || !device.getValue().hasDcpPdu()) { + discovered = false; + } + } + if (!discovered) { + Thread.sleep(3000L); + count += 1; + } + if (count > 5) { + throw new PlcConnectionException("One device failed to respond to discovery packet"); + } + } + } - // Local connectivity attributes - profinetDriverContext.setLocalMacAddress(new MacAddress(rawSocketChannel.getLocalMacAddress().getAddress())); - final InetSocketAddress localAddress = (InetSocketAddress) rawSocketChannel.getLocalAddress(); - Inet4Address localIpAddress = (Inet4Address) localAddress.getAddress(); - profinetDriverContext.setLocalIpAddress(new IpAddress(localIpAddress.getAddress())); - // Use the port of the udp socket - profinetDriverContext.setLocalUdpPort(udpSocket.getPort()); + @Override + public CompletableFuture browse(PlcBrowseRequest browseRequest) { + CompletableFuture future = new CompletableFuture<>(); + List values = new ArrayList<>(); + Map codes = new HashMap<>(); + Map> responseValues = new HashMap<>(); + + for (Map.Entry device : driverContext.getConfiguration().getDevices().getConfiguredDevices().entrySet()) { + device.getValue().browseTags(values); + } - // Remote connectivity attributes - byte[] macAddress = null; - try { - macAddress = Hex.decodeHex("000000000000"); - } catch (DecoderException e) { - // Ignore this. + for (String queryname : browseRequest.getQueryNames()) { + responseValues.put(queryname, values); } - profinetDriverContext.setRemoteMacAddress(new MacAddress(macAddress)); - final InetSocketAddress remoteAddress = (InetSocketAddress) rawSocketChannel.getRemoteAddress(); - Inet4Address remoteIpAddress = (Inet4Address) remoteAddress.getAddress(); - profinetDriverContext.setRemoteIpAddress(new IpAddress(remoteIpAddress.getAddress())); - profinetDriverContext.setRemoteUdpPort(remoteAddress.getPort()); - // Generate a new session key. - profinetDriverContext.setSessionKey(sessionKeyGenerator.getAndIncrement()); - // Reset the session key as soon as it reaches the max for a 16 bit uint - if (sessionKeyGenerator.get() == 0xFFFF) { - sessionKeyGenerator.set(1); + DefaultPlcBrowseResponse response = new DefaultPlcBrowseResponse(browseRequest, codes, responseValues); + future.complete(response); + return future; + } + + @Override + public void onConnect(ConversationContext context) { + InetAddress localIpAddress; + try { + RawSocketChannel channel = (RawSocketChannel) context.getChannel(); + String localAddress = channel.getLocalAddress().toString().substring(1).split(":")[0]; + localIpAddress = InetAddress.getByName(localAddress); + PcapNetworkInterface devByAddress = Pcaps.getDevByAddress(localIpAddress); + driverContext.setChannel(new ProfinetChannel(Collections.singletonList(devByAddress), driverContext.getConfiguration().getDevices())); + driverContext.getChannel().setConfiguredDevices(driverContext.getConfiguration().getDevices()); + } catch (PcapNativeException | UnknownHostException e) { + throw new RuntimeException(e); } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Create the connection request. try { - // Create the packet - final DceRpc_Packet profinetConnectionRequest = createProfinetConnectionRequest(); - // Serialize it to a byte-payload - WriteBufferByteBased writeBuffer = new WriteBufferByteBased(profinetConnectionRequest.getLengthInBytes()); - profinetConnectionRequest.serialize(writeBuffer); - // Create a udp packet. - DatagramPacket connectRequestPacket = new DatagramPacket(writeBuffer.getData(), writeBuffer.getData().length); - connectRequestPacket.setAddress(remoteAddress.getAddress()); - connectRequestPacket.setPort(remoteAddress.getPort()); - // Send it. - udpSocket.send(connectRequestPacket); + onDeviceDiscovery(); + } catch (PlcException | InterruptedException e) { + throw new RuntimeException(e); + } - // Receive the response. - byte[] resultBuffer = new byte[profinetConnectionRequest.getLengthInBytes()]; - DatagramPacket connectResponsePacket = new DatagramPacket(resultBuffer, resultBuffer.length); - udpSocket.receive(connectResponsePacket); - ReadBufferByteBased readBuffer = new ReadBufferByteBased(resultBuffer); - final DceRpc_Packet dceRpc_packet = DceRpc_Packet.staticParse(readBuffer); - if ((dceRpc_packet.getOperation() == DceRpc_Operation.CONNECT) && (dceRpc_packet.getPacketType() == DceRpc_PacketType.RESPONSE)) { - if (dceRpc_packet.getPayload().getPacketType() == DceRpc_PacketType.RESPONSE) { - // Get the remote MAC address and store it in the context. - final PnIoCm_Packet_Res connectResponse = (PnIoCm_Packet_Res) dceRpc_packet.getPayload(); - if ((connectResponse.getBlocks().size() > 0) && (connectResponse.getBlocks().get(0) instanceof PnIoCm_Block_ArRes)) { - final PnIoCm_Block_ArRes pnIoCm_block_arRes = (PnIoCm_Block_ArRes) connectResponse.getBlocks().get(0); - profinetDriverContext.setRemoteMacAddress(pnIoCm_block_arRes.getCmResponderMacAddr()); + for (Map.Entry device : driverContext.getConfiguration().getDevices().getConfiguredDevices().entrySet()) { + device.getValue().getDeviceContext().setChannel(driverContext.getChannel()); + device.getValue().getDeviceContext().setLocalIpAddress(localIpAddress); + } - // Update the raw-socket transports filter expression. - ((RawSocketChannel) channel).setRemoteMacAddress(org.pcap4j.util.MacAddress.getByAddress(profinetDriverContext.getRemoteMacAddress().getAddress())); - } else { - throw new PlcException("Unexpected type of first block."); - } - } else { - throw new PlcException("Unexpected response"); - } - } else if (dceRpc_packet.getPacketType() == DceRpc_PacketType.REJECT) { - throw new PlcException("Device rejected connection request"); - } else { - throw new PlcException("Unexpected response"); + try { + for (Map.Entry device : driverContext.getConfiguration().getDevices().getConfiguredDevices().entrySet()) { + device.getValue().onConnect(); } - } catch (SerializationException | IOException | PlcException | ParseException e) { - logger.error("Error", e); - } + context.fireConnected(); - //System.out.println(rawSocketChannel); + } catch (ExecutionException | InterruptedException | TimeoutException e) { + throw new RuntimeException(e); + } } @Override public void close(ConversationContext context) { - // Nothing to do here ... + // TODO:- Do something here } @Override @@ -189,157 +204,31 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { } @Override - protected void decode(ConversationContext context, Ethernet_Frame msg) throws Exception { - super.decode(context, msg); - } + public CompletableFuture subscribe(PlcSubscriptionRequest subscriptionRequest) { + return CompletableFuture.supplyAsync(() -> { + Map> values = new HashMap<>(); + for (String fieldName : subscriptionRequest.getTagNames()) { + PlcSubscriptionTag tag = subscriptionRequest.getTag(fieldName); + final DefaultPlcSubscriptionTag fieldDefaultPlcSubscription = (DefaultPlcSubscriptionTag) subscriptionRequest.getTag(fieldName); + String deviceString = fieldDefaultPlcSubscription.getAddressString().split("\\.")[0].toUpperCase(); + ProfinetDevice device = driverContext.getConfiguration().getDevices().getConfiguredDevices().get(deviceString); - private Optional getNetworkInterfaceForConnection(InetAddress address) { - try { - for (PcapNetworkInterface dev : Pcaps.findAllDevs()) { - // We're only interested in real running network interfaces, skip the rest. - if (dev.isLoopBack() || !dev.isRunning() || dev.isUp()) { - continue; - } - - for (PcapAddress curAddress : dev.getAddresses()) { + ProfinetSubscriptionHandle subscriptionHandle = new ProfinetSubscriptionHandle(device, fieldName, tag); + device.getDeviceContext().addSubscriptionHandle(fieldDefaultPlcSubscription.getAddressString(), subscriptionHandle); + if (!(fieldDefaultPlcSubscription.getTag() instanceof ProfinetTag)) { + values.put(fieldName, new ResponseItem<>(PlcResponseCode.INVALID_ADDRESS, null)); + } else { + values.put(fieldName, new ResponseItem<>(PlcResponseCode.OK, subscriptionHandle)); } } - } catch (PcapNativeException e) { - logger.warn(String.format("Error finding network device for connection to %s", address.toString()), e); - } - return Optional.empty(); - } - - private DceRpc_Packet createProfinetConnectionRequest() throws PlcException { - try { - return new DceRpc_Packet( - DceRpc_PacketType.REQUEST, true, false, false, - IntegerEncoding.BIG_ENDIAN, CharacterEncoding.ASCII, FloatingPointEncoding.IEEE, - new DceRpc_ObjectUuid((byte) 0x00, 0x0001, 0x0904, 0x002A), - new DceRpc_InterfaceUuid_DeviceInterface(), - profinetDriverContext.getDceRpcActivityUuid(), - 0, 0, DceRpc_Operation.CONNECT, - new PnIoCm_Packet_Req(404, 404, 404, 0, 404, - Arrays.asList( - new PnIoCm_Block_ArReq((short) 1, (short) 0, PnIoCm_ArType.IO_CONTROLLER, - new Uuid(Hex.decodeHex("654519352df3b6428f874371217c2b51")), - profinetDriverContext.getSessionKey(), - profinetDriverContext.getLocalMacAddress(), - new Uuid(Hex.decodeHex("dea000006c9711d1827100640008002a")), - false, false, false, - false, PnIoCm_CompanionArType.SINGLE_AR, false, - true, false, PnIoCm_State.ACTIVE, - 600, - // This actually needs to be set to this value and not the real port number. - 0x8892, - // It seems that it must be set to this value, or it won't work. - "profinetxadriver4933"), - new PnIoCm_Block_IoCrReq((short) 1, (short) 0, PnIoCm_IoCrType.INPUT_CR, - 0x0001, - 0x8892, - false, false, - false, false, PnIoCm_RtClass.RT_CLASS_2, 40, - 0xBBF0, 128, 8, 1, 0, 0xffffffff, - 3, 3, 0xC000, - new org.apache.plc4x.java.profinet.readwrite.MacAddress(Hex.decodeHex("000000000000")), - Collections.singletonList( - new PnIoCm_IoCrBlockReqApi( - Arrays.asList( - new PnIoCm_IoDataObject(0, 0x0001, 0), - new PnIoCm_IoDataObject(0, 0x8000, 1), - new PnIoCm_IoDataObject(0, 0x8001, 2), - new PnIoCm_IoDataObject(0, 0x8002, 3), - new PnIoCm_IoDataObject(1, 0x0001, 4) - ), - Collections.singletonList( - new PnIoCm_IoCs(0x0001, 0x0001, 0x0019) - )) - )), - new PnIoCm_Block_IoCrReq((short) 1, (short) 0, PnIoCm_IoCrType.OUTPUT_CR, - 0x0002, 0x8892, false, false, - false, false, PnIoCm_RtClass.RT_CLASS_2, 40, - 0x8000, 128, 8, 1, 0, 0xffffffff, - 3, 3, 0xC000, - new MacAddress(Hex.decodeHex("000000000000")), - Collections.singletonList( - new PnIoCm_IoCrBlockReqApi( - Collections.singletonList( - new PnIoCm_IoDataObject(0x0001, 0x0001, 0x0005) - ), - Arrays.asList( - new PnIoCm_IoCs(0, 0x0001, 0), - new PnIoCm_IoCs(0, 0x8000, 1), - new PnIoCm_IoCs(0, 0x8001, 2), - new PnIoCm_IoCs(0, 0x8002, 3), - new PnIoCm_IoCs(1, 0x0001, 4) - ) - ) - ) - ), - new PnIoCm_Block_ExpectedSubmoduleReq((short) 1, (short) 0, - Collections.singletonList( - new PnIoCm_ExpectedSubmoduleBlockReqApi(0, - 0x00000010, 0x00000000, - Arrays.asList( - new PnIoCm_Submodule_NoInputNoOutputData(0x0001, - 0x00000001, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8000, - 0x00000002, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8001, - 0x00000003, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8002, - 0x00000003, false, false, - false, false) - ) - ) - ) - ), - new PnIoCm_Block_ExpectedSubmoduleReq((short) 1, (short) 0, - Collections.singletonList( - new PnIoCm_ExpectedSubmoduleBlockReqApi(1, - 0x00000022, 0x00000000, Collections.singletonList( - new PnIoCm_Submodule_InputAndOutputData(0x0001, 0x00000010, - false, false, false, - false, 20, (short) 1, (short) 1, - 6, (short) 1, (short) 1)) - ) - ) - ), - new PnIoCm_Block_AlarmCrReq((short) 1, (short) 0, - PnIoCm_AlarmCrType.ALARM_CR, 0x8892, false, false, 1, 3, - 0x0000, 200, 0xC000, 0xA000) - )) - ); - - /*// Build the UDP/IP/EthernetFrame to transport the package. - return new Ethernet_Frame(profinetDriverContext.getRemoteMacAddress(), profinetDriverContext.getLocalMacAddress(), - new Ethernet_FramePayload_IPv4(ThreadLocalRandom.current().nextInt(0, Integer.MAX_VALUE), (short) 64, - profinetDriverContext.getLocalIpAddress(), profinetDriverContext.getRemoteIpAddress(), - new Udp_Packet(profinetDriverContext.getLocalUdpPort(), profinetDriverContext.getRemoteUdpPort(), - dceRpcConnectionRequest)));*/ - } catch (DecoderException e) { - throw new PlcException("Error creating connection request", e); - } + return new DefaultPlcSubscriptionResponse(subscriptionRequest, values); + }); } - protected static DceRpc_ActivityUuid generateActivityUuid() { - UUID number = UUID.randomUUID(); - try { - WriteBufferByteBased wb = new WriteBufferByteBased(128); - wb.writeLong(64, number.getMostSignificantBits()); - wb.writeLong(64, number.getLeastSignificantBits()); - - ReadBuffer rb = new ReadBufferByteBased(wb.getData()); - return new DceRpc_ActivityUuid(rb.readLong(32), rb.readInt(16), rb.readInt(16), rb.readByteArray(8)); - } catch (SerializationException | ParseException e) { - // Ignore ... this should actually never happen. - } - return null; + @Override + protected void decode(ConversationContext context, Ethernet_Frame msg) throws Exception { + super.decode(context, msg); } - } diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/readwrite/utils/StaticHelper.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/readwrite/utils/StaticHelper.java index 97678c957ac..d2cf4c2760c 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/readwrite/utils/StaticHelper.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/readwrite/utils/StaticHelper.java @@ -18,23 +18,18 @@ */ package org.apache.plc4x.java.profinet.readwrite.utils; -import org.apache.plc4x.java.profinet.readwrite.IpAddress; -import org.apache.plc4x.java.profinet.readwrite.PnDcp_FrameId; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.spi.generation.*; -public class StaticHelper { +import java.util.List; - public static int stringLength(String str) { - if (str == null) { - return 0; - } - return str.length(); - } +public class StaticHelper { public static int arrayLength(byte[] arr) { return arr.length; } - public static int calculateIPv4Checksum(int totalLength, int identification, int timeToLive, IpAddress sourceAddress, IpAddress destinationAddress) { + public static short calculateIPv4Checksum(int totalLength, int identification, int timeToLive, IpAddress sourceAddress, IpAddress destinationAddress) { // https://en.wikipedia.org/wiki/Ones%27_complement // https://www.thegeekstuff.com/2012/05/ip-header-checksum/ int[] words = new int[10]; @@ -43,7 +38,7 @@ public static int calculateIPv4Checksum(int totalLength, int identification, int words[1] = totalLength; words[2] = identification; // Flags and fragment offset - words[3] = 0x0000; + words[3] = 0x4000; // Time to live and protocol words[4] = (timeToLive & 0xFF) << 8 | 0x11; // Checksum set to 0 for calculation @@ -68,7 +63,69 @@ public static int calculateIPv4Checksum(int totalLength, int identification, int } } - return cur; + return (short) ~((short) cur); + } + + public static short calculateUdpChecksum(IpAddress sourceAddress, IpAddress destinationAddress, int sourcePort, int destPort, int packetLength, DceRpc_Packet payload) { + // https://en.wikipedia.org/wiki/Ones%27_complement + // https://www.thegeekstuff.com/2012/05/ip-header-checksum/ + int[] words = new int[10]; + byte[] data = sourceAddress.getData(); + words[0] = ((((int) data[0]) & 0xFF) << 8) | ((int) data[1] & 0xFF); + words[1] = ((((int) data[2]) & 0xFF) << 8) | ((int) data[3] & 0xFF); + // Target address + data = destinationAddress.getData(); + words[2] = ((((int) data[0]) & 0xFF) << 8) | ((int) data[1] & 0xFF); + words[3] = ((((int) data[2]) & 0xFF) << 8) | ((int) data[3] & 0xFF); + words[4] = 0x0011; + words[5] = packetLength; + words[6] = sourcePort; + words[7] = destPort; + words[8] = packetLength; + words[9] = 0x0000; + + + int cur = 0; + for(int i = 0; i < 10; i++) { + cur = cur + words[i]; + // The sum can result in max one bit above 0xFFFF. + // Not sure if it could cascade in a second round, let's stay on the safe side. + while(cur > 0xFFFF) { + cur = cur & 0xFFFF; + cur += 1; + } + } + WriteBufferByteBased buffer; + boolean evenSize = (payload.getLengthInBytes() % 2) == 0; + if (evenSize) { + buffer = new WriteBufferByteBased(payload.getLengthInBytes(), ByteOrder.BIG_ENDIAN); + } else { + buffer = new WriteBufferByteBased(payload.getLengthInBytes() + 1, ByteOrder.BIG_ENDIAN); + } + + try { + payload.serialize(buffer); + if (!evenSize) { + buffer.writeByte("Padding", (byte) 0x00); + } + byte[] byteBuffer = buffer.getBytes(); + + for(int i = 0; i < byteBuffer.length - 1; i += 2) { + int w = ((((int) byteBuffer[i]) & 0xFF) << 8) | ((int) byteBuffer[i+1] & 0xFF); + cur = cur + w; + // The sum can result in max one bit above 0xFFFF. + // Not sure if it could cascade in a second round, let's stay on the safe side. + + while (cur > 0xFFFF) { + cur = cur & 0xFFFF; + cur += 1; + } + } + } catch (SerializationException e) { + return 0x0000; + } + + return (short) ~((short) cur); } public static void main(String[] args) { @@ -153,4 +210,47 @@ public static PnDcp_FrameId getFrameId(int frameIdValue) { return PnDcp_FrameId.RESERVED; } + public static boolean isSysexEnd(ReadBuffer io) { + return ((ReadBufferByteBased) io).getBytes(io.getPos(), io.getPos() + 2)[1] == (byte) 0x00; + } + + public static LldpUnit parseSysexString(ReadBuffer io) { + try { + LldpUnit unit = LldpUnit.staticParse(io); + return unit; + } catch (ParseException e) { + return null; + } + } + + public static void serializeSysexString(WriteBuffer io, LldpUnit unit) { + try { + unit.serialize(io); + } catch (SerializationException e) { + } + } + + public static int lengthSysexString(List data) { + int lengthInBytes = 0; + for (LldpUnit unit : data) { + lengthInBytes += unit.getLengthInBytes(); + } + return lengthInBytes; + } + + public static void writeDataUnit(WriteBuffer writeBuffer, PnIo_CyclicServiceDataUnit dataUnit) throws SerializationException { + dataUnit.serialize(writeBuffer); + } + + public static PnIo_CyclicServiceDataUnit readDataUnit(ReadBuffer readBuffer) throws ParseException { + int NO_TRAILING_BYTES = 4; + int initialPos = readBuffer.getPos(); + while (readBuffer.hasMore(8)) { + readBuffer.readByte(); + } + int dataUnitLength = readBuffer.getPos() - initialPos - NO_TRAILING_BYTES; + readBuffer.reset(initialPos); + return PnIo_CyclicServiceDataUnit.staticParse(readBuffer, (short) dataUnitLength); + } + } diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTag.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTag.java index 2a8e5fc6085..254a2423f97 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTag.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTag.java @@ -24,21 +24,45 @@ import org.apache.plc4x.java.api.types.PlcValueType; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class ProfinetTag implements PlcTag { + public static final Pattern ADDRESS_PATTERN = Pattern.compile("(?
[\\w\\-.]+)(:(?[a-zA-Z_]+)){1}(\\[(?\\d+)])?"); + private final String address; + private final int quantity; + private final PlcValueType dataType; + + protected ProfinetTag(String address, Integer quantity, PlcValueType dataType) { + this.address = address; + this.quantity = (quantity != null) ? quantity : 1; + if (this.quantity <= 0) { + throw new IllegalArgumentException("quantity must be greater than zero. Was " + this.quantity); + } + this.dataType = dataType; + } + public static ProfinetTag of(String addressString) { - throw new PlcInvalidTagException("Unable to parse address: " + addressString); + Matcher matcher = ADDRESS_PATTERN.matcher(addressString); + if (!matcher.matches()) { + throw new PlcInvalidTagException(addressString, ADDRESS_PATTERN); + } + + String quantity = matcher.group("quantity") == null ? "1" : matcher.group("quantity"); + PlcValueType plcValueType = PlcValueType.valueOf(matcher.group("datatype")); + + return new ProfinetTag(matcher.group("address"), Integer.parseInt(quantity), plcValueType); } @Override public String getAddressString() { - return null; + return address; } @Override public PlcValueType getPlcValueType() { - return PlcTag.super.getPlcValueType(); + return dataType; } @Override diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTagHandler.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTagHandler.java index 803e3d3be4e..399f4923e5c 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTagHandler.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/tag/ProfinetTagHandler.java @@ -20,6 +20,7 @@ import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.api.model.PlcQuery; +import org.apache.plc4x.java.profinet.browse.ProfinetPlcQuery; import org.apache.plc4x.java.spi.connection.PlcTagHandler; public class ProfinetTagHandler implements PlcTagHandler { @@ -31,7 +32,7 @@ public PlcTag parseTag(String tagAddress) { @Override public PlcQuery parseQuery(String query) { - throw new UnsupportedOperationException("This driver doesn't support browsing"); + return new ProfinetPlcQuery(query); } } diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java index 8d3fe5b07b2..8409ff98017 100644 --- a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ManualProfinetIoTest.java @@ -20,16 +20,38 @@ import org.apache.plc4x.java.DefaultPlcDriverManager; import org.apache.plc4x.java.api.PlcConnection; -import org.apache.plc4x.java.api.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcReadResponse; +import org.apache.plc4x.java.api.messages.PlcBrowseRequest; +import org.apache.plc4x.java.api.messages.PlcBrowseResponse; +import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; +import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse; +import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.profinet.device.ProfinetSubscriptionHandle; +import org.apache.plc4x.java.profinet.tag.ProfinetTag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ManualProfinetIoTest { + private static final Logger LOGGER = LoggerFactory.getLogger(ManualProfinetIoTest.class); + public static void main(String[] args) throws Exception { - final PlcConnection connection = new DefaultPlcDriverManager().getConnection("profinet://192.168.24.31"); - final PlcReadRequest readRequest = connection.readRequestBuilder().addTagAddress("test", "").build(); - final PlcReadResponse plcReadResponse = readRequest.execute().get(); - System.out.println(plcReadResponse); + final PlcConnection connection = new DefaultPlcDriverManager().getConnection("profinet://192.168.90.1?gsddirectory=/Profinet/gsd&devices=[[test-device,MOD_1,(SUBMOD_1,SUBMOD_1,SUBMOD_1,)]]&reductionratio=16&sendclockfactor=32&dataholdfactor=3&watchdogfactor=2"); + PlcBrowseRequest browseRequest = connection.browseRequestBuilder().addQuery("Browse", "").build(); + final PlcBrowseResponse browseResponse = browseRequest.execute().get(); + PlcSubscriptionRequest.Builder builder = connection.subscriptionRequestBuilder(); + builder.addChangeOfStateTag("Input 4", ProfinetTag.of("test-device.1.1.SUBMOD.4:BOOL")); + PlcSubscriptionRequest request = builder.build(); + + final PlcSubscriptionResponse response = request.execute().get(); + + // Get result of creating subscription + final ProfinetSubscriptionHandle subscriptionHandle = (ProfinetSubscriptionHandle) response.getSubscriptionHandle("Input 4"); + + // Create handler for returned value + subscriptionHandle.register(plcSubscriptionEvent -> { + assert plcSubscriptionEvent.getResponseCode("Input 4").equals(PlcResponseCode.OK); + LOGGER.info("Received a response from {} test {}", "Input 4", plcSubscriptionEvent.getPlcValue("Input 4").toString()); + }); } } diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetBrowseTests.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetBrowseTests.java new file mode 100644 index 00000000000..55238b51d98 --- /dev/null +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetBrowseTests.java @@ -0,0 +1,82 @@ +/* + * 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.profinet; + +import org.apache.plc4x.java.api.messages.PlcBrowseItem; +import org.apache.plc4x.java.api.types.PlcValueType; +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; +import org.apache.plc4x.java.profinet.device.ProfinetDevice; +import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetBrowseTests { + + @Test + public void readProfinetBrowseTagsCheckStatus() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name, PLC4X_1, (PLC4X_DUMMY_MODULE, , PLC4X_DUMMY_MODULE, )]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME"); + device.setVendorDeviceId("CAFE", "0001"); + + List browseItems = new ArrayList<>(); + List response = device.browseTags(browseItems); + + } + + @Test + public void readProfinetBrowseTagsCheckFloat() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name, PLC4X_1, (PLC4X_DUMMY_MODULE, , PLC4X_DUMMY_MODULE, )]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME"); + device.setVendorDeviceId("CAFE", "0001"); + + List browseItems = new ArrayList<>(); + List response = device.browseTags(browseItems); + + String key = "DEVICE_NAME.3.1.PLC4X_INPUT_MODULE_INFO_FLOAT"; + + } + + @Test + public void readProfinetBrowseTagsCheckBoolean() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name, PLC4X_1, (PLC4X_DUMMY_MODULE, , PLC4X_DUMMY_MODULE, )]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME"); + device.setVendorDeviceId("CAFE", "0001"); + + List browseItems = new ArrayList<>(); + List response = device.browseTags(browseItems); + + String key = "DEVICE_NAME.1.1.PLC4X_INPUT_MODULE_INFO_32.1"; + } + +} diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetCheckSumTests.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetCheckSumTests.java new file mode 100644 index 00000000000..57ed9cebe61 --- /dev/null +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetCheckSumTests.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 + * + * 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.profinet; + +import org.apache.commons.codec.DecoderException; +import org.apache.commons.codec.binary.Hex; +import org.apache.plc4x.java.profinet.readwrite.*; +import org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetCheckSumTests { + + @Test + public void calculateChecksumTest() { + DceRpc_Packet packet = new DceRpc_Packet( + DceRpc_PacketType.REQUEST, + true, + false, + false, + IntegerEncoding.BIG_ENDIAN, + CharacterEncoding.ASCII, + FloatingPointEncoding.IEEE, + new DceRpc_ObjectUuid((byte) 0x00, 0x0001, 0x0002, 0x0493), + new DceRpc_InterfaceUuid_DeviceInterface(), + new DceRpc_ActivityUuid(0x0aa499a5L, 0x1df0, 0x11b2, new byte[]{(byte) 0x80, (byte) 0x00, (byte) 0xa9, (byte) 0xa2, (byte) 0x59, (byte) 0x4b, (byte) 0x74, (byte) 0x00}), + 0, + 0, + DceRpc_Operation.CONNECT, + new PnIoCm_Packet_Req( + 16696, + 16696, + 0, + new ArrayList()) + ); + try { + assertEquals( + (short) 0x4411, + StaticHelper.calculateUdpChecksum( + new IpAddress(Hex.decodeHex("c0a85a01")), + new IpAddress(Hex.decodeHex("c0a85a80")), + 50000, + 34964, + packet.getLengthInBytes() + 8, + packet) + ); + } catch (DecoderException e) { + throw new RuntimeException(e); + } + + } + + @Test + public void calculateIpChecksumTest() throws DecoderException { + int checksum = StaticHelper.calculateIPv4Checksum( + 425, + 0x4dc2, + 64, + new IpAddress(Hex.decodeHex("c0a85a01")), + new IpAddress(Hex.decodeHex("c0a85a80")) + ); + + assertEquals( + checksum + , (short) 0xb5af); + } + + @Test + public void calculateIpChecksumTest2() throws DecoderException { + int checksum = StaticHelper.calculateIPv4Checksum( + 425, + 0x1e85, + 64, + new IpAddress(Hex.decodeHex("c0a85a01")), + new IpAddress(Hex.decodeHex("c0a85a80")) + ); + + assertEquals( + checksum + , (short) 0xe4ec); + } + + + +} diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetDeviceContextTests.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetDeviceContextTests.java new file mode 100644 index 00000000000..623b0f8ebaf --- /dev/null +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetDeviceContextTests.java @@ -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 + * + * 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.profinet; + +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; +import org.apache.plc4x.java.profinet.device.ProfinetDevice; +import org.apache.plc4x.java.profinet.device.ProfinetEmptyModule; +import org.apache.plc4x.java.profinet.device.ProfinetModule; +import org.apache.plc4x.java.profinet.device.ProfinetModuleImpl; +import org.apache.plc4x.java.profinet.readwrite.PnIoCm_Block_ExpectedSubmoduleReq; +import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetDeviceContextTests { + + @Test + public void readProfinetAllocatedSubModulesLengthCheck() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME_1"); + device.setVendorDeviceId("CAFE", "0001"); + + ProfinetModule[] modules = device.getDeviceContext().getModules(); + + assertEquals(modules.length, 32); + } + + @Test + public void readProfinetAllocatedSubModulesTypeCheck() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME_1"); + device.setVendorDeviceId("CAFE", "0001"); + + ProfinetModule[] modules = device.getDeviceContext().getModules(); + + assertInstanceOf(ProfinetModuleImpl.class, modules[0]); + assertInstanceOf(ProfinetModuleImpl.class, modules[1]); + assertInstanceOf(ProfinetModuleImpl.class, modules[2]); + assertInstanceOf(ProfinetModuleImpl.class, modules[3]); + assertInstanceOf(ProfinetModuleImpl.class, modules[4]); + assertInstanceOf(ProfinetEmptyModule.class, modules[5]); + } + + @Test + public void readProfinetAllocatedSubModulesTypeCheckEmptyModule() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, , PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME_1"); + device.setVendorDeviceId("CAFE", "0001"); + + ProfinetModule[] modules = device.getDeviceContext().getModules(); + + assertInstanceOf(ProfinetModuleImpl.class, modules[0]); + assertInstanceOf(ProfinetModuleImpl.class, modules[1]); + assertInstanceOf(ProfinetEmptyModule.class, modules[2]); + assertInstanceOf(ProfinetModuleImpl.class, modules[3]); + assertInstanceOf(ProfinetModuleImpl.class, modules[4]); + assertInstanceOf(ProfinetEmptyModule.class, modules[5]); + } + + @Test + public void readExpectedSubModuleApiBlocks() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources/&devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, , PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]"); + + ProfinetDevice device = configuration.getDevices().getConfiguredDevices().get("DEVICE_NAME_1"); + device.setVendorDeviceId("CAFE", "0001"); + + List moduleReq = device.getDeviceContext().getExpectedSubmoduleReq(); + + assertEquals(3, moduleReq.get(0).getApis().get(0).getSubmodules().size()); + assertEquals(1, moduleReq.get(1).getApis().get(0).getSubmodules().size()); + assertEquals(1, moduleReq.get(2).getApis().get(0).getSubmodules().size()); + assertEquals(1, moduleReq.get(3).getApis().get(0).getSubmodules().size()); + + } + +} diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetPoc.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetPoc.java deleted file mode 100644 index 401258f0460..00000000000 --- a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetPoc.java +++ /dev/null @@ -1,166 +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.profinet; - -import org.apache.commons.codec.binary.Hex; -import org.apache.plc4x.java.profinet.readwrite.*; -import org.apache.plc4x.java.spi.generation.*; - -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.util.Arrays; -import java.util.Collections; -import java.util.UUID; - -public class ProfinetPoc { - - public static void main(String[] args) throws Exception { - - // Send Profinet IO Context Manager (PNIO-CM) Connection Request (UDP) - DceRpc_Packet connectionRequest = new DceRpc_Packet( - DceRpc_PacketType.REQUEST, true, false, false, - IntegerEncoding.BIG_ENDIAN, CharacterEncoding.ASCII, FloatingPointEncoding.IEEE, - new DceRpc_ObjectUuid((byte) 0x00, 0x0001, 0x0904, 0x002A), - new DceRpc_InterfaceUuid_DeviceInterface(), generateActivityUuid(), - 0, 0, DceRpc_Operation.CONNECT, - new PnIoCm_Packet_Req(404, 404, 404, 0, 404, - Arrays.asList( - new PnIoCm_Block_ArReq((short) 1, (short) 0, PnIoCm_ArType.IO_CONTROLLER, - new Uuid(Hex.decodeHex("654519352df3b6428f874371217c2b51")), 2, - // Local MAC Address - new MacAddress(Hex.decodeHex("806d970ff777")), - new Uuid(Hex.decodeHex("dea000006c9711d1827100640008002a")), - false, false, false, - false, PnIoCm_CompanionArType.SINGLE_AR, false, - true, false, PnIoCm_State.ACTIVE, - 600, 0x8892, - "plc4x-pn-master"), - new PnIoCm_Block_IoCrReq((short) 1, (short) 0, PnIoCm_IoCrType.INPUT_CR, - 0x0001, 0x8892, false, false, - false, false, PnIoCm_RtClass.RT_CLASS_2, 40, - 0xBBF0, 128, 8, 1, 0, 0xffffffff, - 3, 3, 0xC000, - new MacAddress(Hex.decodeHex("000000000000")), - Collections.singletonList( - new PnIoCm_IoCrBlockReqApi( - Arrays.asList( - new PnIoCm_IoDataObject(0, 0x0001, 0), - new PnIoCm_IoDataObject(0, 0x8000, 1), - new PnIoCm_IoDataObject(0, 0x8001, 2), - new PnIoCm_IoDataObject(0, 0x8002, 3), - new PnIoCm_IoDataObject(1, 0x0001, 4) - ), - Collections.singletonList( - new PnIoCm_IoCs(0x0001, 0x0001, 0x0019) - )) - )), - new PnIoCm_Block_IoCrReq((short) 1, (short) 0, PnIoCm_IoCrType.OUTPUT_CR, - 0x0002, 0x8892, false, false, - false, false, PnIoCm_RtClass.RT_CLASS_2, 40, - 0x8000, 128, 8, 1, 0, 0xffffffff, - 3, 3, 0xC000, - new MacAddress(Hex.decodeHex("000000000000")), - Collections.singletonList( - new PnIoCm_IoCrBlockReqApi( - Collections.singletonList( - new PnIoCm_IoDataObject(0x0001, 0x0001, 0x0005) - ), - Arrays.asList( - new PnIoCm_IoCs(0, 0x0001, 0), - new PnIoCm_IoCs(0, 0x8000, 1), - new PnIoCm_IoCs(0, 0x8001, 2), - new PnIoCm_IoCs(0, 0x8002, 3), - new PnIoCm_IoCs(1, 0x0001, 4) - ) - ) - ) - ), - new PnIoCm_Block_ExpectedSubmoduleReq((short) 1, (short) 0, - Collections.singletonList( - new PnIoCm_ExpectedSubmoduleBlockReqApi(0, - 0x00000010, 0x00000000, - Arrays.asList( - new PnIoCm_Submodule_NoInputNoOutputData(0x0001, - 0x00000001, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8000, - 0x00000002, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8001, - 0x00000003, false, false, - false, false), - new PnIoCm_Submodule_NoInputNoOutputData(0x8002, - 0x00000003, false, false, - false, false) - ) - ) - ) - ), - new PnIoCm_Block_ExpectedSubmoduleReq((short) 1, (short) 0, - Collections.singletonList( - new PnIoCm_ExpectedSubmoduleBlockReqApi(1, - 0x00000022, 0x00000000, Collections.singletonList( - new PnIoCm_Submodule_InputAndOutputData(0x0001, 0x00000010, - false, false, false, - false, 20, (short) 1, (short) 1, - 6, (short) 1, (short) 1)) - ) - ) - ), - new PnIoCm_Block_AlarmCrReq((short) 1, (short) 0, - PnIoCm_AlarmCrType.ALARM_CR, 0x8892, false, false, 1, 3, - 0x0000, 200, 0xC000, 0xA000) - )) - ); - - // Serialize the message - WriteBufferByteBased writeBuffer = new WriteBufferByteBased(connectionRequest.getLengthInBytes()); - connectionRequest.serialize(writeBuffer); - - // Send the message as UDP telegram. - InetAddress[] deviceAddress = InetAddress.getAllByName("192.168.24.31"); - DatagramPacket packet = new DatagramPacket( - writeBuffer.getData(), writeBuffer.getData().length, deviceAddress[0], 34964); - DatagramSocket datagramSocket = new DatagramSocket(); - datagramSocket.send(packet); - - // The PNIO_PS message seems to come in earlier than the connection response ... - // Receive PNIO_PS (ProfiSafe Cyclic Data Unit) - // Receive PNIO-CM Connection Response (UDP) - - - } - - protected static DceRpc_ActivityUuid generateActivityUuid() { - UUID number = UUID.randomUUID(); - try { - WriteBufferByteBased wb = new WriteBufferByteBased(128); - wb.writeLong(64, number.getMostSignificantBits()); - wb.writeLong(64, number.getLeastSignificantBits()); - - ReadBuffer rb = new ReadBufferByteBased(wb.getData()); - return new DceRpc_ActivityUuid(rb.readLong(32), rb.readInt(16), rb.readInt(16), rb.readByteArray(8)); - } catch (SerializationException | ParseException e) { - // Ignore ... this should actually never happen. - } - return null; - } - -} diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDiscoveryContext.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetSubscriptionTests.java similarity index 82% rename from plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDiscoveryContext.java rename to plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetSubscriptionTests.java index b9b4b09de4e..84705b45f9d 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/context/ProfinetDiscoveryContext.java +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/ProfinetSubscriptionTests.java @@ -16,10 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.plc4x.java.profinet.context; -import org.apache.plc4x.java.spi.context.DriverContext; +package org.apache.plc4x.java.profinet; + +import org.junit.jupiter.api.TestInstance; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetSubscriptionTests { -public class ProfinetDiscoveryContext implements DriverContext { } diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetConfigurationTests.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetConfigurationTests.java new file mode 100644 index 00000000000..e88d0604508 --- /dev/null +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetConfigurationTests.java @@ -0,0 +1,147 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.apache.plc4x.java.api.exceptions.PlcException; +import org.apache.plc4x.java.profinet.config.ProfinetConfiguration; +import org.apache.plc4x.java.profinet.context.ProfinetDriverContext; +import org.apache.plc4x.java.profinet.device.ProfinetDevice; +import org.apache.plc4x.java.profinet.protocol.ProfinetProtocolLogic; +import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.io.File; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetConfigurationTests { + + /* + Profinet GSD File Directory Configuration Test + */ + @Test + public void readGsdDirectory() { + String directory = "src/test/resources"; + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X, (PLC4X_1)]]&gsddirectory=" + directory); + + assertEquals(1, configuration.getGsdFiles().getGsdFiles().size()); + } + + @Test + public void readGsdFilesInDirectory() { + String directory = "src/test/resources"; + + new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X, (PLC4X_1)]]&gsddirectory=" + directory); + + Map gsdFiles = ProfinetConfiguration.getGsdFiles().getGsdFiles(); + assertEquals(gsdFiles.size(), 1); + } + + @Test + public void parseJoinedDeviceConfiguration() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "gsddirectory=src/test/resources&devices=[[device_name_1,device_access_1,(submodule_1,submodule_2)]]"); + assertEquals(1, configuration.getDevices().getConfiguredDevices().size()); + } + + /* + Profinet GSD File Directory Configuration Test + */ + @Test + public void parseJoinedDeviceConfigurationExtraSpaces() { + String[] deviceNames = new String[] {"DEVICE_NAME_1"}; + + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, device_access_1, (submodule_1, submodule_2)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + for (String deviceName : deviceNames) { + assert(devices.containsKey(deviceName)); + } + } + + @Test + public void readProfinetDevicesMultiple() { + String[] deviceNames = new String[] {"DEVICE_NAME_1","DEVICE_NAME_2","DEVICE_NAME_3"}; + + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X_1, (PLC4X_01,PLC4X_02,PLC4X_01,PLC4X_02)],[device_name_2, PLC4X_1, (PLC4X_01,PLC4X_02,PLC4X_01,PLC4X_02)],[device_name_3, PLC4X_1, (PLC4X_01,PLC4X_02,PLC4X_01,PLC4X_02)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + for (String deviceName : deviceNames) { + assert(devices.containsKey(deviceName)); + } + } + + @Test + public void readProfinetLowerCase() { + String[] deviceName = new String[] {"device_Name_1"}; + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, device_access_1, (submodule_1, submodule_2)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + for (String mac : deviceName) { + assert(devices.containsKey(mac.replace(":", "").toUpperCase())); + } + } + + @Test + public void setIncorrectSubModule() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X_1, (PLC4X_01, PLC4X_02, PLC4X_01, PLC4X_02)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + XmlMapper xmlMapper = new XmlMapper(); + assertThrows(PlcException.class, () -> devices.get("DEVICE_NAME_1").getDeviceContext().setGsdFile(xmlMapper.readValue(new File("src/test/resources/gsdml.xml"), ProfinetISO15745Profile.class))); + } + + + @Test + public void setCorrectSubModule() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + XmlMapper xmlMapper = new XmlMapper(); + assertDoesNotThrow(() -> devices.get("DEVICE_NAME_1").getDeviceContext().setGsdFile(xmlMapper.readValue(new File("src/test/resources/gsdml.xml"), ProfinetISO15745Profile.class))); + } + + @Test + public void setCorrectSubModuleCaseInsensitive() { + ProfinetConfiguration configuration = new ConfigurationFactory().createConfiguration( + ProfinetConfiguration.class, "devices=[[device_name_1, PLC4X_1, (PLC4X_DUMMY_MODULE, PLC4X_dummy_MODULE, PLC4X_DUMMY_MODULE, PLC4X_DUMMY_MODULE)]]&gsddirectory=src/test/resources"); + + Map devices = configuration.getDevices().getConfiguredDevices(); + + XmlMapper xmlMapper = new XmlMapper(); + assertDoesNotThrow(() -> devices.get("DEVICE_NAME_1").getDeviceContext().setGsdFile(xmlMapper.readValue(new File("src/test/resources/gsdml.xml"), ProfinetISO15745Profile.class))); + } +} diff --git a/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGSDMLParseTest.java b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGSDMLParseTest.java new file mode 100644 index 00000000000..7224910da87 --- /dev/null +++ b/plc4j/drivers/profinet/src/test/java/org/apache/plc4x/java/profinet/gsdml/ProfinetGSDMLParseTest.java @@ -0,0 +1,58 @@ +/* + * 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.profinet.gsdml; + +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +public class ProfinetGSDMLParseTest { + + private ProfinetISO15745Profile gsdml = null; + + @BeforeAll + public void setUp() { + try { + XmlMapper xmlMapper = new XmlMapper(); + this.gsdml = xmlMapper.readValue(new File("src/test/resources/gsdml.xml"), ProfinetISO15745Profile.class); + } catch(IOException e) { + assert false; + } + } + + @Test + public void readGsdmlFile() { + assertEquals(this.gsdml.getProfileBody().getDeviceIdentity().getVendorName().getValue(), "Apache PLC4X"); + } + + @Test + public void readGsdmlFileStartupMode() { + ProfinetInterfaceSubmoduleItem interfaceModule = (ProfinetInterfaceSubmoduleItem) this.gsdml.getProfileBody().getApplicationProcess().getDeviceAccessPointList().get(0).getSystemDefinedSubmoduleList().getInterfaceSubmodules().get(0); + assertEquals(interfaceModule.getApplicationRelations().getStartupMode(), "Advanced"); + } + +} diff --git a/plc4j/drivers/profinet/src/test/resources/gsdml.xml b/plc4j/drivers/profinet/src/test/resources/gsdml.xml new file mode 100644 index 00000000000..d67fcf5da99 --- /dev/null +++ b/plc4j/drivers/profinet/src/test/resources/gsdml.xml @@ -0,0 +1,148 @@ + + + + + + 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/test/resources/logback-test.xml b/plc4j/drivers/profinet/src/test/resources/logback-test.xml index 2b9cea25dc8..cc4250b212e 100644 --- a/plc4j/drivers/profinet/src/test/resources/logback-test.xml +++ b/plc4j/drivers/profinet/src/test/resources/logback-test.xml @@ -29,7 +29,7 @@ - + diff --git a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec index b6d05a84a6d..09fb0cbf4d0 100644 --- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec +++ b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec @@ -56,7 +56,9 @@ // Length of the header + payload [implicit uint 16 totalLength '28 + payload.lengthInBytes'] [simple uint 16 identification ] - [const uint 3 flags 0x00 ] + [reserved bit 'false' ] + [simple bit dontFragment ] + [simple bit moreFragments ] [const uint 13 fragmentOffset 0x00 ] [simple uint 8 timeToLive ] // Protocol: UDP @@ -69,8 +71,8 @@ // Begin of the UDP packet part [simple uint 16 sourcePort ] [simple uint 16 destinationPort ] - [implicit uint 16 packetLength 'lengthInBytes' ] - //[implicit uint 16 headerChecksum 'STATIC_CALL("calculateUdpChecksum", sourceAddress, destinationAddress, sourcePort, destinationPort, packetLength)' ] + [implicit uint 16 packetLength '8 + payload.lengthInBytes' ] + [implicit uint 16 bodyChecksum 'STATIC_CALL("calculateUdpChecksum", sourceAddress, destinationAddress, sourcePort, destinationPort, packetLength, payload)'] [simple DceRpc_Packet payload ] ] ['0x8100' Ethernet_FramePayload_VirtualLan @@ -82,9 +84,84 @@ ['0x8892' Ethernet_FramePayload_PnDcp [simple PnDcp_Pdu pdu ] ] + ['0x88cc' Ethernet_FramePayload_LLDP + [simple Lldp_Pdu pdu ] + ] + ] +] + +[type Lldp_Pdu + [manualArray LldpUnit lldpParameters terminated 'STATIC_CALL("isSysexEnd", readBuffer)' 'STATIC_CALL("parseSysexString", readBuffer)' 'STATIC_CALL("serializeSysexString", writeBuffer, _value)' 'STATIC_CALL("lengthSysexString", lldpParameters)'] +] + +[discriminatedType LldpUnit + [discriminator TlvType tlvId ] + [simple uint 9 tlvIdLength ] + [typeSwitch tlvId + ['END_OF_LLDP' EndOfLldp + ] + ['CHASSIS_ID' TlvChassisId(uint 9 tlvIdLength) + [simple uint 8 chassisIdSubType ] + [simple vstring '(tlvIdLength - 1) * 8' chassisId ] + ] + ['PORT_ID' TlvPortId(uint 9 tlvIdLength) + [simple uint 8 portIdSubType ] + [simple vstring '(tlvIdLength - 1) * 8' portId ] + ] + ['TIME_TO_LIVE' TlvTimeToLive + [simple uint 16 tlvTimeToLiveUnit ] + ] + ['MANAGEMENT_ADDRESS' TlvManagementAddress + [implicit uint 8 addressStringLength '5' ] + [simple ManagementAddressSubType addressSubType ] + [simple IpAddress ipAddress ] + [simple uint 8 interfaceSubType ] + [simple uint 32 interfaceNumber ] + [simple uint 8 oidStringLength ] + ] + ['ORGANIZATION_SPECIFIC' TlvOrganizationSpecific + [simple TlvOrganizationSpecificUnit organizationSpecificUnit ] + ] + ] +] + +[discriminatedType TlvOrganizationSpecificUnit + [discriminator uint 24 uniqueCode] + [typeSwitch uniqueCode + ['0x000ECF' TlvOrgSpecificProfibus + [simple TlvOrgSpecificProfibusUnit specificUnit ] + ] + ['0x00120F' TlvOrgSpecificIeee8023 + [simple uint 8 subType ] + [simple uint 8 negotiationSupport ] + [simple uint 16 negotiationCapability ] + [simple uint 16 operationalMauType ] + ] + ] +] + +[discriminatedType TlvOrgSpecificProfibusUnit + [discriminator TlvProfibusSubType subType] + [typeSwitch subType + ['PORT_STATUS' TlvProfibusSubTypePortStatus + [simple uint 16 rtClass2PortStatus] + [reserved uint 2 '0x00' ] + [simple bit preample ] + [simple bit fragmentation ] + [reserved uint 9 '0x00' ] + [simple uint 3 rtClass3PortStatus] + ] + ['CHASSIS_MAC' TlvProfibusSubTypeChassisMac + [simple MacAddress macAddress] + ] ] ] +[enum uint 8 TlvProfibusSubType + ['0x02' PORT_STATUS] + ['0x05' CHASSIS_MAC] +] + // 4.10.3.2 // A lot of the fields are set to constant values, which would // usually be dynamic. However are we trying to limit the number of @@ -237,6 +314,25 @@ ['0x0A' CANCEL_ACKNOWLEDGE ] ] +//LLDP Specific +[enum uint 7 TlvType + ['0x00' END_OF_LLDP ] + ['0x01' CHASSIS_ID ] + ['0x02' PORT_ID ] + ['0x03' TIME_TO_LIVE ] + ['0x04' PORT_DESCRIPTION ] + ['0x05' SYSTEM_NAME ] + ['0x06' SYSTEM_DESCRIPTION ] + ['0x07' SYSTEM_CAPABILITIES ] + ['0x08' MANAGEMENT_ADDRESS ] + ['0x7F' ORGANIZATION_SPECIFIC] +] + +[enum uint 8 ManagementAddressSubType + ['0x00' UNKNOWN ] + ['0x01' IPV4 ] +] + // 4.10.3.2.14 [enum uint 16 DceRpc_Operation ['0x0000' CONNECT ] @@ -273,8 +369,11 @@ [virtual PnDcp_FrameId frameId 'STATIC_CALL("getFrameId", frameIdValue)'] [typeSwitch frameId ['RT_CLASS_1' PnDcp_Pdu_RealTimeCyclic - // TODO: This type needs to be implemented ... -// [simple PnIo_CyclicServiceDataUnit dataUnit ] + [manual PnIo_CyclicServiceDataUnit + dataUnit + 'STATIC_CALL("readDataUnit", readBuffer)' + 'STATIC_CALL("writeDataUnit", writeBuffer, dataUnit)' + '(dataUnit.lengthInBytes)*8' ] [simple uint 16 cycleCounter ] // Data Status Start (4.7.2.1.3) [simple bit ignore ] @@ -308,6 +407,18 @@ [const uint 9 endLength 0] // Delay Parameter End ] + ['Alarm_Low' PnDcp_Pdu_AlarmLow + [simple uint 16 alarmDstEndpoint] + [simple uint 16 alarmSrcEndpoint] + [simple uint 4 version] + [simple uint 4 errorType] + [simple uint 4 tAck] + [simple uint 4 windowSize] + [simple uint 16 senSeqNum] + [simple uint 16 ackSeqNum] + [implicit uint 16 varPartLen 'COUNT(varPart)'] + [array byte varPart length 'varPartLen'] + ] ['DCP_Identify_ReqPDU' PnDcp_Pdu_IdentifyReq [const uint 8 serviceId 0x05 ] // ServiceType Start @@ -399,8 +510,9 @@ ] ] -//[discriminatedType PnIo_CyclicServiceDataUnit -//] +[type PnIo_CyclicServiceDataUnit(int 16 dataUnitLength) + [array byte data count 'dataUnitLength' ] +] [discriminatedType PnDcp_Block [discriminator PnDcp_BlockOptions option ] @@ -651,10 +763,10 @@ [typeSwitch packetType ['REQUEST' PnIoCm_Packet_Req [simple uint 32 argsMaximum ] - [simple uint 32 argsLength ] + [implicit uint 32 argsLength 'lengthInBytes - 20'] [simple uint 32 arrayMaximumCount ] [simple uint 32 arrayOffset ] - [simple uint 32 arrayActualCount ] + [implicit uint 32 arrayActualCount 'lengthInBytes - 20'] [array PnIoCm_Block blocks length 'argsLength'] ] ['RESPONSE' PnIoCm_Packet_Res @@ -662,10 +774,10 @@ [simple uint 8 errorCode1 ] [simple uint 8 errorDecode ] [simple uint 8 errorCode ] - [simple uint 32 argsLength ] + [implicit uint 32 argsLength 'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4'] [simple uint 32 arrayMaximumCount ] [simple uint 32 arrayOffset ] - [simple uint 32 arrayActualCount ] + [implicit uint 32 arrayActualCount 'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4' ] [array PnIoCm_Block blocks length 'argsLength'] ] ['REJECT' PnIoCm_Packet_Rej @@ -674,19 +786,78 @@ ] ] +[type UserData(uint 32 recordDataLength) + [array byte data count 'recordDataLength' ] +] + // Big Endian [discriminatedType PnIoCm_Block byteOrder='BIG_ENDIAN' [discriminator PnIoCm_BlockType blockType ] - [implicit uint 16 blockLength 'lengthInBytes - 4'] - [simple uint 8 blockVersionHigh ] - [simple uint 8 blockVersionLow ] [typeSwitch blockType + ['IOD_WRITE_REQUEST_HEADER' IODWriteRequestHeader + [implicit uint 16 blockLength 'index < 0x8000 ? lengthInBytes - 4 - recordDataLength : lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [simple uint 16 sequenceNumber ] + [simple Uuid arUuid ] + [simple uint 32 api ] + [simple uint 16 slotNumber ] + [simple uint 16 subSlotNumber ] + [const uint 16 padField 0x0000 ] + [simple uint 16 index ] + [simple uint 32 recordDataLength ] + [padding uint 8 pad '0x00' 'index < 0x8000 ? 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4 : 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4'] + [optional UserData('recordDataLength') userData 'index < 0x8000' ] + ] + ['IOD_WRITE_RESPONSE_HEADER' IODWriteResponseHeader + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [simple uint 16 sequenceNumber ] + [simple Uuid arUuid ] + [simple uint 32 api ] + [simple uint 16 slotNumber ] + [simple uint 16 subSlotNumber ] + [const uint 16 padField 0x0000 ] + [simple uint 16 index ] + [simple uint 32 recordDataLength ] + [padding uint 8 pad '0x00' '64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4'] + ] + ['PD_INTERFACE_ADJUST' PDInterfaceAdjust + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [const uint 16 padField 0x0000 ] + [const uint 16 multipleInterfaceModeReserved2 0x0000 ] + [const uint 15 multipleInterfaceModeReserved1 0x0000 ] + [simple MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice ] + ] + ['PD_PORT_DATA_CHECK' PDPortDataCheck + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [const uint 16 padField 0x0000 ] + [simple uint 16 slotNumber ] + [simple uint 16 subSlotNumber ] + [simple PnIoCm_Block checkPeers ] + ] + ['CHECK_PEERS' CheckPeers + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [const uint 8 noOfPeers 0x01 ] + [simple PascalString peerPortId ] + [simple PascalString peerChassisId ] + ] ['AR_BLOCK_REQ' PnIoCm_Block_ArReq + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [simple PnIoCm_ArType arType ] [simple Uuid arUuid ] [simple uint 16 sessionKey ] [simple MacAddress cmInitiatorMacAddr ] - [simple Uuid cmInitiatorObjectUuid ] + [simple DceRpc_ObjectUuid cmInitiatorObjectUuid ] // Begin ARProperties [simple bit pullModuleAlarmAllowed ] [simple bit nonLegacyStartupMode ] @@ -706,13 +877,63 @@ [simple vstring 'stationNameLength * 8' cmInitiatorStationName ] ] ['AR_BLOCK_RES' PnIoCm_Block_ArRes - [simple PnIoCm_ArType arType ] - [simple Uuid arUuid ] - [simple uint 16 sessionKey ] - [simple MacAddress cmResponderMacAddr ] - [simple uint 16 responderUDPRTPort ] + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [simple PnIoCm_ArType arType ] + [simple Uuid arUuid ] + [simple uint 16 sessionKey ] + [simple MacAddress cmResponderMacAddr ] + [simple uint 16 responderUDPRTPort ] + ] + ['IOD_CONTROL_REQ' PnIoCm_Control_Request + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [reserved uint 16 '0x0000' ] + [simple Uuid arUuid ] + [simple uint 16 sessionKey ] + [reserved uint 16 '0x0000' ] + [simple uint 16 controlCommand ] + [reserved uint 16 '0x0000' ] + ] + ['IOX_BLOCK_REQ' PnIoCM_Block_Request + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [reserved uint 16 '0x0000' ] + [simple Uuid arUuid ] + [simple uint 16 sessionKey ] + [reserved uint 16 '0x0000' ] + [simple uint 16 controlCommand ] + [simple uint 16 controlBlockProperties ] + ] + ['IOX_BLOCK_RES' PnIoCM_Block_Response + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [reserved uint 16 '0x0000' ] + [simple Uuid arUuid ] + [simple uint 16 sessionKey ] + [reserved uint 16 '0x0000' ] + [simple uint 16 controlCommand ] + [simple uint 16 controlBlockProperties ] + ] + ['IOD_CONTROL_RES' PnIoCm_Control_Response + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [reserved uint 16 '0x0000' ] + [simple Uuid arUuid ] + [simple uint 16 sessionKey ] + [reserved uint 16 '0x0000' ] + [simple uint 16 controlCommand ] + [reserved uint 16 '0x0000' ] ] ['IO_CR_BLOCK_REQ' PnIoCm_Block_IoCrReq + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [simple PnIoCm_IoCrType ioCrType ] [simple uint 16 ioCrReference ] [simple uint 16 lt ] @@ -740,11 +961,17 @@ [array PnIoCm_IoCrBlockReqApi apis count 'numberOfApis' ] ] ['IO_CR_BLOCK_RES' PnIoCm_Block_IoCrRes + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [simple PnIoCm_IoCrType ioCrType ] [simple uint 16 ioCrReference ] [simple uint 16 frameId ] ] ['ALARM_CR_BLOCK_REQ' PnIoCm_Block_AlarmCrReq + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [simple PnIoCm_AlarmCrType alarmType ] [simple uint 16 lt ] // Begin AlarmCrProperties @@ -760,26 +987,43 @@ [simple uint 16 alarmCtrTagHeaderLow ] ] ['ALARM_CR_BLOCK_RES' PnIoCm_Block_AlarmCrRes + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [simple PnIoCm_AlarmCrType alarmType ] [simple uint 16 localAlarmReference ] [simple uint 16 maxAlarmDataLength ] ] ['EXPECTED_SUBMODULE_BLOCK_REQ' PnIoCm_Block_ExpectedSubmoduleReq + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [implicit uint 16 numberOfApis 'COUNT(apis)' ] [array PnIoCm_ExpectedSubmoduleBlockReqApi apis count 'numberOfApis' ] ] ['MODULE_DIFF_BLOCK' PnIoCm_Block_ModuleDiff + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] [implicit uint 16 numberOfApis 'COUNT(apis)' ] [array PnIoCm_ModuleDiffBlockApi apis count 'numberOfApis' ] ] ['AR_SERVER_BLOCK' PnIoCm_Block_ArServer - //[implicit uint 16 stationNameLength 'STR_LEN(cmInitiatorStationName)'] - //[simple vstring 'stationNameLength * 8' cmInitiatorStationName ] - //[padding byte 0x00 ] + [implicit uint 16 blockLength 'lengthInBytes - 4'] + [simple uint 8 blockVersionHigh ] + [simple uint 8 blockVersionLow ] + [simple PascalString stationName ] + [padding uint 8 pad '0x00' '20 - 6 - (stationName.stringLength)' ] ] ] ] +[type PascalString + [implicit int 8 sLength 'stringValue.length == 0 ? -1 : stringValue.length'] + [simple vstring 'sLength == -1 ? 0 : sLength * 8' stringValue] + [virtual int 8 stringLength 'stringValue.length == -1 ? 0 : stringValue.length'] +] + [type PnIoCm_IoCrBlockReqApi [const uint 32 api 0x00000000 ] [implicit uint 16 numIoDataObjects 'COUNT(ioDataObjects)' ] @@ -800,6 +1044,18 @@ [simple uint 16 ioFrameOffset] ] +[type PnIoCm_DataUnitIoCs + [simple bit dataState] + [simple uint 2 instance ] + [reserved uint 4 '0x00' ] + [simple bit extension] +] + +[type PnIoCm_DataUnitDataObject(uint 16 dataObjectLength) + [array byte dataState count 'dataObjectLength'] + [simple PnIoCm_DataUnitIoCs iops ] +] + [type PnIoCm_ExpectedSubmoduleBlockReqApi [const uint 32 api 0x00000000 ] [simple uint 16 slotNumber ] @@ -854,6 +1110,18 @@ [const uint 8 lengthIoCs 0x01 ] [const uint 8 lengthIoPs 0x01 ] ] + ['INPUT_DATA' PnIoCm_Submodule_InputData + [const uint 16 inputDataDescription 0x0001] + [simple uint 16 inputSubmoduleDataLength ] + [simple uint 8 inputLengthIoCs ] + [simple uint 8 inputLengthIoPs ] + ] + ['OUTPUT_DATA' PnIoCm_Submodule_OutputData + [const uint 16 inputDataDescription 0x0002] + [simple uint 16 inputSubmoduleDataLength ] + [simple uint 8 inputLengthIoCs ] + [simple uint 8 inputLengthIoPs ] + ] ['INPUT_AND_OUTPUT_DATA' PnIoCm_Submodule_InputAndOutputData [const uint 16 inputDataDescription 0x0001] [simple uint 16 inputSubmoduleDataLength ] @@ -872,15 +1140,34 @@ ] [enum uint 16 PnIoCm_BlockType + ['0x0008' IOD_WRITE_REQUEST_HEADER ] ['0x0101' AR_BLOCK_REQ ] - ['0x8101' AR_BLOCK_RES ] ['0x0102' IO_CR_BLOCK_REQ ] - ['0x8102' IO_CR_BLOCK_RES ] ['0x0103' ALARM_CR_BLOCK_REQ ] - ['0x8103' ALARM_CR_BLOCK_RES ] ['0x0104' EXPECTED_SUBMODULE_BLOCK_REQ] + ['0x0110' IOD_CONTROL_REQ ] + ['0x0112' IOX_BLOCK_REQ ] + ['0x0200' PD_PORT_DATA_CHECK ] + ['0x020a' CHECK_PEERS ] + ['0x0250' PD_INTERFACE_ADJUST ] + ['0x8008' IOD_WRITE_RESPONSE_HEADER ] + ['0x8101' AR_BLOCK_RES ] + ['0x8102' IO_CR_BLOCK_RES ] + ['0x8103' ALARM_CR_BLOCK_RES ] ['0x8104' MODULE_DIFF_BLOCK ] ['0x8106' AR_SERVER_BLOCK ] + ['0x8110' IOD_CONTROL_RES ] + ['0x8112' IOX_BLOCK_RES ] +] + +[enum uint 8 ProfinetDeviceState + ['0x00' IDLE] + ['0x01' STARTUP] + ['0x02' PREMED] + ['0x03' WAITAPPLRDY] + ['0x04' APPLRDY] + ['0x05' CYCLICDATA] + ['0xFF' ABORT] ] [enum uint 16 PnIoCm_ArType @@ -914,9 +1201,16 @@ [enum uint 2 PnIoCm_SubmoduleType ['0x0' NO_INPUT_NO_OUTPUT_DATA] + ['0x1' INPUT_DATA] + ['0x2' OUTPUT_DATA] ['0x3' INPUT_AND_OUTPUT_DATA] ] +[enum bit MultipleInterfaceModeNameOfDevice + ['false' PORT_PROVIDED_BY_LLDP] + ['true' NAME_PROVIDED_BY_LLDP] +] + [enum uint 16 PnIoCm_DescriptionType ['0x0001' INPUT] ] @@ -948,4 +1242,133 @@ ['0x01' VAX ] ['0x02' CRAY] ['0x03' IBM ] +] + + +[dataIo DataItem(ProfinetDataType dataType, uint 16 numberOfValues) + [typeSwitch dataType,numberOfValues + ['BOOL','1' BOOL + [simple bit value ] + ] + ['BOOL' List + [array bit value count 'numberOfValues' ] + ] + ['BYTE','1' BYTE + [simple uint 8 value] + ] + ['BYTE' List + [array bit value count 'numberOfValues * 8' ] + ] + ['WORD' WORD + [simple uint 16 value] + ] + ['DWORD' DWORD + [simple uint 32 value] + ] + ['LWORD' LWORD + [simple uint 64 value] + ] + ['SINT','1' SINT + [simple int 8 value ] + ] + ['SINT' List + [array int 8 value count 'numberOfValues'] + ] + ['INT','1' INT + [simple int 16 value] + ] + ['INT' List + [array int 16 value count 'numberOfValues'] + ] + ['DINT','1' DINT + [simple int 32 value] + ] + ['DINT' List + [array int 32 value count 'numberOfValues'] + ] + ['LINT','1' LINT + [simple int 64 value] + ] + ['LINT' List + [array int 64 value count 'numberOfValues'] + ] + ['USINT','1' USINT + [simple uint 8 value ] + ] + ['USINT' List + [array uint 8 value count 'numberOfValues'] + ] + ['UINT','1' UINT + [simple uint 16 value] + ] + ['UINT' List + [array uint 16 value count 'numberOfValues'] + ] + ['UDINT','1' UDINT + [simple uint 32 value] + ] + ['UDINT' List + [array uint 32 value count 'numberOfValues'] + ] + ['ULINT','1' ULINT + [simple uint 64 value] + ] + ['ULINT' List + [array uint 64 value count 'numberOfValues'] + ] + ['REAL','1' REAL + [simple float 32 value] + ] + ['REAL' List + [array float 32 value count 'numberOfValues'] + ] + ['LREAL','1' LREAL + [simple float 64 value] + ] + ['LREAL' List + [array float 64 value count 'numberOfValues'] + ] + ['CHAR','1' CHAR + [simple string 8 value encoding='"UTF-8"'] + ] + ['CHAR' List + [array string 8 value count 'numberOfValues' encoding='"UTF-8"'] + ] + ['WCHAR','1' WCHAR + [simple string 16 value encoding='"UTF-16"'] + ] + ['WCHAR' List + [array string 16 value count 'numberOfValues' encoding='"UTF-16"'] + ] + ] +] + +[enum uint 8 ProfinetDataType(uint 8 dataTypeSize, string 16 conversion) + ['1' BOOL ['1','BOOLEAN']] + ['2' BYTE ['1','BYTE']] + ['3' WORD ['2','WORD']] + ['4' DWORD ['4','DWORD']] + ['5' LWORD ['8','LWORD']] + ['6' SINT ['1','SIGNED8']] + ['7' INT ['2','SIGNED16']] + ['8' DINT ['4','SIGNED32']] + ['9' LINT ['8','SIGNED64']] + ['10' USINT ['1','UNSIGNED8']] + ['11' UINT ['2','UNSIGNED16']] + ['12' UDINT ['4','UNSIGNED32']] + ['13' ULINT ['8','UNSIGNED64']] + ['14' REAL ['4','FLOAT32']] + ['15' LREAL ['8','FLOAT64']] + ['16' TIME ['8','TIME']] + ['17' LTIME ['8','LTIME']] + ['18' DATE ['8','DATE']] + ['19' LDATE ['8','LDATE']] + ['20' TIME_OF_DAY ['8','TIME_OF_DAY']] + ['21' LTIME_OF_DAY ['8','LTIME_OF_DAY']] + ['22' DATE_AND_TIME ['8','DATE_AND_TIME']] + ['23' LDATE_AND_TIME ['8','LDATE_AND_TIME']] + ['24' CHAR ['1','CHAR']] + ['25' WCHAR ['2','WCHAR']] + ['26' STRING ['1','STRING']] + ['27' WSTRING ['2','WSTRING']] ] \ No newline at end of file diff --git a/src/site/asciidoc/users/protocols/profinet.adoc b/src/site/asciidoc/users/protocols/profinet.adoc new file mode 100644 index 00000000000..9803555f264 --- /dev/null +++ b/src/site/asciidoc/users/protocols/profinet.adoc @@ -0,0 +1,160 @@ +// +// 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. +// +:imagesdir: ../../images/users/protocols +:icons: font + +== Profinet +=== Connection String Options + +On linux as the Java execuatble won't have permission to capture raw packets, this needs to be enabled via:- +---- +sudo setcap cap_net_raw,cap_net_admin=eip /usr/lib/jvm/jdk-19/bin/java +---- +The executable will change based on your jdk you are using. + + +[cols="2,2a,5a"] +|=== +|Name |Value |Description + +|Code +2+|`profinet` + +|Name +2+|Profinet + +|Maven Dependency +2+| + +---- + + + org.apache.plc4x + plc4j-driver-profinet + {current-last-released-version} + + +---- + +|Default Transport: +2+| `raw` + +|Compatible Transports: +2+| - `raw` - Profinet uses a bunch of protocols, LLDP, PN-DCP, PNIO over UDP or Profinet. It makes sense just to select the raw transport for this. + + +3+|Supported Operations + +|| `subscribe` |Only the subscription service is currently supported. + + +3+|Options + +|| `devices` | (Required) Allows you to specify the devices you would like to communicate to, their device access +module (Taken from the GSD file) as well as a list of submodules. + +This parameter has the format + +---- +[[{device-1},{device-access},({submodule-1},{submodule-2})],[{device-2},{device-access},({submodule-1},{submodule-2})],....] +---- + +For each available slot specified in the GSD file a submodule needs to be in the connection string, however it can be left blank e.g. + +---- +[[{device},{device-access},({submodule-1},)]] +---- + +If there is no submodule configured. + +|| `gsddirectory` | The directory that is used to store any GSD files. This is used to lookup the GSD for device found. +|| `sendclockfactor` | (Default 32) This is used to scale the frequency in which cyclic packets are sent. Increasing this slows down communication +|| `reductionratio` | (Default 4) Is also used to scale the frequency. The formula to calculate the overall cycle time is Cycle Time = SendClockFactor * Reduction Ratio * 31.23us +|| `watchdogfactor` | Used to specify the maximum number of cycles that is allowed to be missed by a device. An alarm is generated if this is exceeded +|| `dataholdfactor` | Specifies the number of cycles a device will keep its outputs in a non-safe state when it hasn't received a cyclic packet. This must be equal to or be greater than the watchdog factor| + +|=== + +=== Connection String + +The Profinet driver uses the connection string + +---- + +profinet:raw://{ip-address}:{port}?{options} + +---- + +An example of this connection string would be:- + +---- + +profinet:raw://127.0.0.1?gsddirectory=/Profinet/GSD&devices=[[test-device-1,MOD_1,(SUBMOD_1,,SUBMOD_1,)],[test-device-2,MOD_1,(SUBMOD_1,,SUBMOD_1,)]] + +---- + +Note the transport, port fields shouldn't have to be changed + + +=== Address Format +The format of address will be in the format. + +---- + +device.slot.id.module_name.channel.bit:format + +---- + +An example would be + +---- +device-1.1.1.DIGITAL_INPUT.0.1:BOOL +---- + +Note:- + +==== Data Types + +The following data types are supported + +- BOOL (boolean) +- SINT (int 8) +- USINT (uint 8) +- BYTE (uint 8) +- INT (int 16) +- UINT (uint 16) +- WORD (uint 16) +- DINT (int 32) +- UDINT (uint 32) +- DWORD (uint 32) +- LINT (int 64) +- ULINT (uint 64) +- LWORD (uint 64) +- REAL (float) +- LREAL (double) +- CHAR (char) +- WCHAR (2 byte char) +- STRING (utf-8) +- WSTRING (utf-16) + + +=== Some useful tips + +The GSD file contains all the information of what the addresses will end up being. The easiest approach is to use the browsing +function of the Profinet driver to return a list of all available tags. Then only the address of interest can be selected. + +|=== From 55d4936e4cceb460833eb91fced6147d059d28ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Jan 2023 12:29:47 +0100 Subject: [PATCH 09/14] build(deps): bump mockito.version from 5.1.0 to 5.1.1 (#775) Bumps `mockito.version` from 5.1.0 to 5.1.1. Updates `mockito-core` from 5.1.0 to 5.1.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.1.0...v5.1.1) Updates `mockito-junit-jupiter` from 5.1.0 to 5.1.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v5.1.0...v5.1.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b24680cb7d0..cb1e1778632 100644 --- a/pom.xml +++ b/pom.xml @@ -150,7 +150,7 @@ 0.6.8 - 5.1.0 + 5.1.1 4.1.87.Final 1.8.2 2.0.6 From 55e9edd33dd07c0a025929b63932fd5155c30c67 Mon Sep 17 00:00:00 2001 From: Ben Hutcheson Date: Tue, 31 Jan 2023 19:18:55 +0100 Subject: [PATCH 10/14] fix(plc4j/profinet): Updated magic numbers in discovery packets --- .../java/profinet/discovery/ProfinetPlcDiscoverer.java | 8 +++----- .../src/main/resources/protocols/profinet/profinet.mspec | 3 +-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java index f06d82e7b09..8bba69a7dad 100644 --- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java +++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java @@ -308,7 +308,7 @@ public void startPnDcpPoll(long period) { Collections.singletonList( new PnDcp_Block_ALLSelector() ))))); - WriteBufferByteBased buffer = new WriteBufferByteBased(34); + WriteBufferByteBased buffer = new WriteBufferByteBased(identificationRequest.getLengthInBytes()); try { identificationRequest.serialize(buffer); } catch (SerializationException e) { @@ -316,15 +316,13 @@ public void startPnDcpPoll(long period) { } Packet packet = null; try { - packet = EthernetPacket.newPacket(buffer.getData(), 0, 34); + packet = EthernetPacket.newPacket(buffer.getBytes(), 0, identificationRequest.getLengthInBytes()); } catch (IllegalRawDataException e) { throw new RuntimeException(e); } try { handle.sendPacket(packet); - } catch (PcapNativeException e) { - throw new RuntimeException(e); - } catch (NotOpenException e) { + } catch (PcapNativeException | NotOpenException e) { throw new RuntimeException(e); } return null; diff --git a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec index 09fb0cbf4d0..1ba08ea9386 100644 --- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec +++ b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec @@ -553,8 +553,7 @@ [array byte deviceVendorValue count 'blockLength-2' ] [padding uint 8 pad '0x00' 'STATIC_CALL("arrayLength", deviceVendorValue) % 2'] ] - ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength) - [reserved uint 16 '0x0000' ] + ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength) ] [array byte nameOfStation count 'blockLength-2' ] [padding uint 8 pad '0x00' 'STATIC_CALL("arrayLength", nameOfStation) % 2'] ] From cb04bd2ec84b811c4cf4ecd3f38ed01a6636d960 Mon Sep 17 00:00:00 2001 From: Ben Hutcheson Date: Tue, 31 Jan 2023 19:24:26 +0100 Subject: [PATCH 11/14] fix(plc4j/profinet): Updated website page --- src/site/asciidoc/users/protocols/profinet.adoc | 12 ++++++++---- src/site/site.xml | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/site/asciidoc/users/protocols/profinet.adoc b/src/site/asciidoc/users/protocols/profinet.adoc index 9803555f264..b341d9e59bc 100644 --- a/src/site/asciidoc/users/protocols/profinet.adoc +++ b/src/site/asciidoc/users/protocols/profinet.adoc @@ -17,14 +17,18 @@ :imagesdir: ../../images/users/protocols :icons: font -== Profinet +== Profinet (In Development) + +The PROFINET driver implements a class 3 real time controller. Which is able to communicate with multiple devices +on the same network segment. + === Connection String Options -On linux as the Java execuatble won't have permission to capture raw packets, this needs to be enabled via:- +On linux as the Java executable won't have permission to capture raw packets, this needs to be enabled via:- ---- sudo setcap cap_net_raw,cap_net_admin=eip /usr/lib/jvm/jdk-19/bin/java ---- -The executable will change based on your jdk you are using. +The executable will change based on the jdk and OS you are using. [cols="2,2a,5a"] @@ -81,7 +85,7 @@ For each available slot specified in the GSD file a submodule needs to be in the If there is no submodule configured. -|| `gsddirectory` | The directory that is used to store any GSD files. This is used to lookup the GSD for device found. +|| `gsddirectory` | The directory that is used to store any GSD files. This is used to look up the GSD for device found. || `sendclockfactor` | (Default 32) This is used to scale the frequency in which cyclic packets are sent. Increasing this slows down communication || `reductionratio` | (Default 4) Is also used to scale the frequency. The formula to calculate the overall cycle time is Cycle Time = SendClockFactor * Reduction Ratio * 31.23us || `watchdogfactor` | Used to specify the maximum number of cycles that is allowed to be missed by a device. An alarm is generated if this is exceeded diff --git a/src/site/site.xml b/src/site/site.xml index 266f059721c..81f340ca0c1 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -73,6 +73,7 @@ + From bdcebd6cb1ef17e44fc2d86970764e83a061ed09 Mon Sep 17 00:00:00 2001 From: Ben Hutcheson Date: Wed, 1 Feb 2023 09:37:05 +0100 Subject: [PATCH 12/14] fix(plc4j/profinet): Removed dangling bracket from mspec --- ...p_Block_DevicePropertiesNameOfStation.java | 22 ++----------------- .../protocols/profinet/profinet.mspec | 2 +- 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java index d2445e88673..7a3226e372d 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java @@ -51,8 +51,6 @@ public Short getSuboption() { // Arguments. protected final Integer blockLength; - // Reserved Fields - private Integer reservedField0; public PnDcp_Block_DevicePropertiesNameOfStation(byte[] nameOfStation, Integer blockLength) { super(); @@ -70,12 +68,6 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali int startPos = positionAware.getPos(); writeBuffer.pushContext("PnDcp_Block_DevicePropertiesNameOfStation"); - // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (int) 0x0000, - writeUnsignedInt(writeBuffer, 16)); - // Array Field (nameOfStation) writeByteArrayField("nameOfStation", nameOfStation, writeByteArray(writeBuffer, 8)); @@ -102,9 +94,6 @@ public int getLengthInBits() { int lengthInBits = super.getLengthInBits(); PnDcp_Block_DevicePropertiesNameOfStation _value = this; - // Reserved Field (reserved) - lengthInBits += 16; - // Array field if (nameOfStation != null) { lengthInBits += 8 * nameOfStation.length; @@ -130,9 +119,6 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( int startPos = positionAware.getPos(); int curPos; - Integer reservedField0 = - readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000); - byte[] nameOfStation = readBuffer.readByteArray("nameOfStation", Math.toIntExact((blockLength) - (2))); @@ -145,27 +131,23 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesNameOfStation"); // Create the instance - return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( - nameOfStation, blockLength, reservedField0); + return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl(nameOfStation, blockLength); } public static class PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final byte[] nameOfStation; private final Integer blockLength; - private final Integer reservedField0; public PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( - byte[] nameOfStation, Integer blockLength, Integer reservedField0) { + byte[] nameOfStation, Integer blockLength) { this.nameOfStation = nameOfStation; this.blockLength = blockLength; - this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesNameOfStation build() { PnDcp_Block_DevicePropertiesNameOfStation pnDcp_Block_DevicePropertiesNameOfStation = new PnDcp_Block_DevicePropertiesNameOfStation(nameOfStation, blockLength); - pnDcp_Block_DevicePropertiesNameOfStation.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesNameOfStation; } } diff --git a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec index 1ba08ea9386..95da70617a1 100644 --- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec +++ b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec @@ -553,7 +553,7 @@ [array byte deviceVendorValue count 'blockLength-2' ] [padding uint 8 pad '0x00' 'STATIC_CALL("arrayLength", deviceVendorValue) % 2'] ] - ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength) ] + ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength) [array byte nameOfStation count 'blockLength-2' ] [padding uint 8 pad '0x00' 'STATIC_CALL("arrayLength", nameOfStation) % 2'] ] From 1e8ec2ee3da35671228bebe0415affee6fca694e Mon Sep 17 00:00:00 2001 From: Christofer Dutz Date: Sat, 4 Feb 2023 13:25:03 +0100 Subject: [PATCH 13/14] chore: Started making the PR buildable --- code-generation/language-c/pom.xml | 1 - .../templates/c/data-io-template.c.ftlh | 4 + code-generation/language-go/pom.xml | 1 - .../plc4x/include/plc4c/driver_plc4x_static.h | 2 + plc4c/drivers/plc4x/src/driver_plc4x_static.c | 28 + .../include/plc4c/driver_s7_encode_decode.h | 6 + .../s7/include/plc4c/driver_s7_static.h | 4 +- .../drivers/s7/src/driver_s7_encode_decode.c | 66 +- plc4c/drivers/s7/src/driver_s7_packets.c | 13 +- plc4c/drivers/s7/src/driver_s7_sm_read.c | 13 +- plc4c/drivers/s7/src/driver_s7_static.c | 4 +- .../generated-sources/plc4x/src/plc4x_value.c | 34 + .../generated-sources/s7/include/data_item.h | 8 +- plc4c/generated-sources/s7/src/data_item.c | 60 +- .../generated-sources/s7/src/transport_size.c | 16 +- plc4go/go.mod | 2 +- plc4go/internal/s7/Reader.go | 7 +- plc4go/internal/s7/Tag.go | 54 +- plc4go/internal/s7/TagHandler.go | 68 +- plc4go/internal/s7/Writer.go | 2 +- plc4go/internal/simulated/Reader_test.go | 2 +- plc4go/internal/simulated/Writer_test.go | 2 +- .../abeth/readwrite/XmlParserHelper.go | 4 +- plc4j/api/pom.xml | 3 + .../plc4x/java/DefaultPlcDriverManager.java | 41 +- .../plc4x/java/api/PlcConnectionManager.java | 1 + .../apache/plc4x/java/api/model/PlcTag.java | 13 + .../plc4x/java/ads/tag/DirectAdsTag.java | 1 + .../canopen/SDODownloadConversation.java | 2 +- .../firmata/readwrite/tag/FirmataTag.java | 1 + plc4j/drivers/knxnetip/pom.xml | 2 +- .../protocol/KnxNetIpProtocolLogic.java | 2 +- plc4j/drivers/opcua/pom.xml | 14 +- .../opcua/readwrite/OpcuaNodeIdServices.java | 673 + .../plc4x/java/opcua/OpcuaPlcDriver.java | 1 + .../java/opcua/context/SecureChannel.java | 6 +- .../java/plc4x/readwrite/Plc4xValue.java | 32 + .../plc4x/protocol/Plc4xProtocolLogic.java | 13 +- .../plc4x/readwrite/utils/StaticHelper.java | 94 + .../plc4x/java/plc4x/tag/Plc4XTagHandler.java | 7 +- .../apache/plc4x/java/plc4x/tag/Plc4xTag.java | 13 +- plc4j/drivers/pom.xml | 15 + .../plc4x/java/s7/readwrite/DataItem.java | 72 +- .../readwrite/S7PayloadReadVarResponse.java | 2 +- .../s7/readwrite/S7VarPayloadDataItem.java | 39 +- .../java/s7/readwrite/TransportSize.java | 18 +- .../configuration/S7Configuration.java | 60 +- .../s7/readwrite/context/S7DriverContext.java | 4 +- .../optimizer/DefaultS7MessageProcessor.java | 6 +- .../s7/readwrite/optimizer/S7Optimizer.java | 27 +- .../protocol/S7ProtocolEventLogic.java | 6 +- .../readwrite/protocol/S7ProtocolLogic.java | 188 +- .../java/s7/readwrite/tag/S7StringTag.java | 5 +- .../plc4x/java/s7/readwrite/tag/S7Tag.java | 103 +- .../java/s7/readwrite/utils/StaticHelper.java | 212 +- plc4j/drivers/s7/src/test/java/S7IoTest.java | 9 +- .../s7/src/test/resources/logback-test.xml | 2 +- .../connection/SimulatedConnection.java | 30 +- .../connectivity/mqtt/MqttConnector.java | 66 +- .../src/main/resources/mqtt-connector.yml | 35 + .../examples/helloinflux/HelloInflux.java | 2 +- plc4j/examples/hello-world-kotlin/pom.xml | 2 +- plc4j/integrations/apache-kafka/pom.xml | 2 +- plc4j/integrations/opcua-server/pom.xml | 8 +- .../backend/Plc4xCommunication.java | 23 +- .../opcuaserver/backend/Plc4xNamespace.java | 5 +- plc4j/pom.xml | 3 + .../plc4x/java/spi/Plc4xNettyWrapper.java | 50 +- .../plc4x/java/spi/Plc4xProtocolBase.java | 7 + .../java/spi/connection/ChannelFactory.java | 3 +- .../connection/DefaultNettyPlcConnection.java | 36 +- .../spi/connection/NettyChannelFactory.java | 12 + .../spi/generation/WriteBufferByteBased.java | 2 + .../spi/internal/HandlerRegistration.java | 14 +- .../spi/messages/DefaultPlcWriteRequest.java | 5 + .../spi/model/DefaultPlcSubscriptionTag.java | 4 +- .../RequestTransactionManager.java | 37 +- .../apache/plc4x/java/spi/values/PlcBOOL.java | 2 + .../apache/plc4x/java/spi/values/PlcBYTE.java | 8 +- .../apache/plc4x/java/spi/values/PlcCHAR.java | 45 + .../java/spi/values/PlcDATE_AND_TIME.java | 33 + .../apache/plc4x/java/spi/values/PlcDINT.java | 2 + .../plc4x/java/spi/values/PlcDWORD.java | 2 + .../apache/plc4x/java/spi/values/PlcINT.java | 2 + .../apache/plc4x/java/spi/values/PlcLINT.java | 2 + .../plc4x/java/spi/values/PlcLREAL.java | 2 + .../plc4x/java/spi/values/PlcLTIME.java | 16 + .../plc4x/java/spi/values/PlcLWORD.java | 2 + .../apache/plc4x/java/spi/values/PlcSINT.java | 2 + .../apache/plc4x/java/spi/values/PlcTIME.java | 16 + .../plc4x/java/spi/values/PlcTIME_OF_DAY.java | 4 + .../plc4x/java/spi/values/PlcUDINT.java | 2 + .../apache/plc4x/java/spi/values/PlcUINT.java | 2 + .../plc4x/java/spi/values/PlcULINT.java | 2 + .../plc4x/java/spi/values/PlcUSINT.java | 2 + .../java/spi/values/PlcValueHandler.java | 81 +- .../plc4x/java/spi/values/PlcWCHAR.java | 2 + .../apache/plc4x/java/spi/values/PlcWORD.java | 2 + .../plc4x/java/spi/Plc4xNettyWrapperTest.java | 4 +- .../RequestTransactionManagerTest.java | 20 +- .../cache/CachedPlcConnectionManager.java | 23 +- .../java/utils/cache/LeasedPlcConnection.java | 19 +- .../java/plc4x/readwrite/Plc4xValue.java | 32 + .../plc4x/readwrite/utils/StaticHelper.java | 94 + .../protocol/Plc4xServerAdapter.java | 5 +- plc4j/transports/pom.xml | 16 +- .../s7/protocol/S7Step7ServerAdapter.java | 24 +- pom.xml | 18 +- .../downloads/Opc.Ua.NodeIds.Services.csv | 1749 + .../downloads/Opc.Ua.NodeSet2.Services.xml | 63477 ++++++++++++++++ protocols/opcua/downloads/Opc.Ua.Types.bsd | 3162 + protocols/opcua/downloads/StatusCode.csv | 261 + protocols/opcua/pom.xml | 26 +- .../resources/protocols/plc4x/v0/plc4x.mspec | 14 +- protocols/pom.xml | 3 + .../src/main/resources/protocols/s7/s7.mspec | 36 +- 116 files changed, 71004 insertions(+), 644 deletions(-) create mode 100644 plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java create mode 100644 plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml create mode 100644 plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java create mode 100644 protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv create mode 100644 protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml create mode 100644 protocols/opcua/downloads/Opc.Ua.Types.bsd create mode 100644 protocols/opcua/downloads/StatusCode.csv diff --git a/code-generation/language-c/pom.xml b/code-generation/language-c/pom.xml index c9cd0412002..fd86a7a9873 100644 --- a/code-generation/language-c/pom.xml +++ b/code-generation/language-c/pom.xml @@ -62,7 +62,6 @@ org.apache.plc4x.plugins:plc4x-maven-plugin:${plc4x-code-generation.version} org.apache.plc4x.plugins:plc4x-code-generation-protocol-base:${plc4x-code-generation.version} org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version} - org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version} */pom.xml diff --git a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh index 114889903b1..bf1a543262f 100644 --- a/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh +++ b/code-generation/language-c/src/main/resources/templates/c/data-io-template.c.ftlh @@ -179,7 +179,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* return new PlcStruct(${field.name}); <#break--> <#case "STRING"> + <#if (parserArguments?filter(parserArgument->parserArgument.name=="stringLength"))?has_content> *data_item = plc4c_data_create_string_data(stringLength, ${manualField.name}); + <#else> + *data_item = plc4c_data_create_string_data(strlen(value), ${manualField.name}); + <#break> <#default> *data_item = plc4c_data_create_${case.name?lower_case}_data(${manualField.name}); diff --git a/code-generation/language-go/pom.xml b/code-generation/language-go/pom.xml index a452077012a..cc2f201576c 100644 --- a/code-generation/language-go/pom.xml +++ b/code-generation/language-go/pom.xml @@ -62,7 +62,6 @@ org.apache.plc4x.plugins:plc4x-maven-plugin:${plc4x-code-generation.version} org.apache.plc4x.plugins:plc4x-code-generation-protocol-base:${plc4x-code-generation.version} org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version} - org.apache.plc4x.plugins:plc4x-code-generation-types-base:${plc4x-code-generation.version} */pom.xml diff --git a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h index 4a6d28aadae..1e6cdc2bc65 100644 --- a/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h +++ b/plc4c/drivers/plc4x/include/plc4c/driver_plc4x_static.h @@ -36,6 +36,8 @@ extern "C" { uint8_t plc4c_spi_evaluation_helper_str_len(char* str); +char* plc4c_plc4x_read_write_parse_string(plc4c_spi_read_buffer* io, char* encoding); + #ifdef __cplusplus } #endif diff --git a/plc4c/drivers/plc4x/src/driver_plc4x_static.c b/plc4c/drivers/plc4x/src/driver_plc4x_static.c index 9eff0971454..fda73bf88bd 100644 --- a/plc4c/drivers/plc4x/src/driver_plc4x_static.c +++ b/plc4c/drivers/plc4x/src/driver_plc4x_static.c @@ -30,3 +30,31 @@ uint8_t plc4c_spi_evaluation_helper_str_len(char* str) { return strlen(str); } +char* plc4c_plc4x_read_write_parse_string(plc4c_spi_read_buffer* io, char* encoding) { + if (strcmp(encoding, "UTF-8") == 0) { + // Read the max length (which is not interesting for us. + uint8_t length; + plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &length); + if (res != OK) { + return NULL; + } + char* result = malloc(sizeof(char) * (length + 1)); + if (result == NULL) { + return NULL; + } + char* curPos = result; + for(int i = 0; i < length; i++) { + uint8_t val; + plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val); + if (res != OK) { + return NULL; + } + *curPos = (char) val; + curPos++; + } + *curPos = '\0'; + return result; + } else if (strcmp(encoding, "UTF-16") == 0) { + } + return ""; +} diff --git a/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h b/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h index 28da28458b2..b771f5bed90 100644 --- a/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h +++ b/plc4c/drivers/s7/include/plc4c/driver_s7_encode_decode.h @@ -27,6 +27,12 @@ extern "C" { #include "plc4c/driver_s7.h" #include "s7_var_request_parameter_item.h" +struct plc4c_s7_read_write_s7_var_request_parameter_item_field { + plc4c_s7_read_write_s7_var_request_parameter_item* parameter_item; + char* s7_address_any_encoding_of_string; +}; +typedef struct plc4c_s7_read_write_s7_var_request_parameter_item_field plc4c_s7_read_write_s7_var_request_parameter_item_field; + uint16_t plc4c_driver_s7_encode_tsap_id( plc4c_driver_s7_device_group device_group, uint8_t rack, uint8_t slot); diff --git a/plc4c/drivers/s7/include/plc4c/driver_s7_static.h b/plc4c/drivers/s7/include/plc4c/driver_s7_static.h index 2b52cec337e..05ba1d9cc88 100644 --- a/plc4c/drivers/s7/include/plc4c/driver_s7_static.h +++ b/plc4c/drivers/s7/include/plc4c/driver_s7_static.h @@ -48,9 +48,9 @@ uint16_t plc4c_s7_read_write_s7msec_to_int(plc4c_spi_read_buffer* io); plc4c_return_code plc4c_s7_read_write_int_to_s7msec(plc4c_spi_write_buffer* writeBuffer, uint16_t value); -char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding); +char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding, char* stringEncoding); -char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding); +char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding, char* stringEncoding); time_t plc4c_s7_read_write_parse_tia_time(plc4c_spi_read_buffer* io); diff --git a/plc4c/drivers/s7/src/driver_s7_encode_decode.c b/plc4c/drivers/s7/src/driver_s7_encode_decode.c index 9b9043b5914..024f4b3593b 100644 --- a/plc4c/drivers/s7/src/driver_s7_encode_decode.c +++ b/plc4c/drivers/s7/src/driver_s7_encode_decode.c @@ -23,6 +23,7 @@ #include #include #include +#include "plc4c/driver_s7_encode_decode.h" uint16_t plc4c_driver_s7_encode_tsap_id( plc4c_driver_s7_device_group device_group, uint8_t rack, uint8_t slot) { @@ -114,6 +115,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { // Parser logic char* cur_pos = address; char* last_pos = address; + char* string_encoding = NULL; // - Does it start with "%"? if (*cur_pos == '%') { cur_pos++; @@ -247,6 +249,19 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { *(num_elements + len) = '\0'; } + if (*cur_pos == '|') { + // Next comes the num_elements + cur_pos++; + last_pos = cur_pos; + while (*cur_pos != '\0') { + cur_pos++; + } + len = cur_pos - last_pos; + string_encoding = malloc(sizeof(char) * (len + 1)); + strncpy(string_encoding, last_pos, len); + *(string_encoding + len) = '\0'; + } + //////////////////////////////////////////////////////////////////////////// // Now parse the contents. //////////////////////////////////////////////////////////////////////////// @@ -261,6 +276,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { free(data_type); free(string_length); free(num_elements); + free(string_encoding); free(s7_item); return NO_MEMORY; } @@ -283,6 +299,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { free(data_type); free(string_length); free(num_elements); + free(string_encoding); free(any_address); free(s7_item); return INVALID_ADDRESS; @@ -320,15 +337,50 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { // TODO: THis should be moved to "driver_s7_packets.c->plc4c_return_code plc4c_driver_s7_create_s7_read_request" if (any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_TIME || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_LINT || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_ULINT || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_LWORD || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_LREAL || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_REAL || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_LTIME || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_DATE || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_TIME_OF_DAY || + any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_DATE_AND_TIME) { + any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE; + any_address->s7_address_any_number_of_elements = + plc4c_s7_read_write_transport_size_length_in_bytes(&(any_address->s7_address_any_transport_size)) * + any_address->s7_address_any_number_of_elements; + } else if (any_address->s7_address_any_transport_size == plc4c_s7_read_write_transport_size_STRING) { + any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE; if (string_length != NULL) { any_address->s7_address_any_number_of_elements = - strtol(string_length, 0, 10) * + (strtol(string_length, 0, 10) +2) * any_address->s7_address_any_number_of_elements; - } else if (any_address->s7_address_any_transport_size == - plc4c_s7_read_write_transport_size_STRING) { + } else { + any_address->s7_address_any_number_of_elements = + 256 * any_address->s7_address_any_number_of_elements; + } + } else if (any_address->s7_address_any_transport_size == + plc4c_s7_read_write_transport_size_WSTRING) { + any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE; + if (string_length != NULL) { + any_address->s7_address_any_number_of_elements = + (strtol(string_length, 0, 10) +2) * 2 * + any_address->s7_address_any_number_of_elements; + } else { any_address->s7_address_any_number_of_elements = - 254 * any_address->s7_address_any_number_of_elements; + 512 * any_address->s7_address_any_number_of_elements; } } else if (any_address->s7_address_any_transport_size == plc4c_s7_read_write_transport_size_TOD) { @@ -396,8 +448,12 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { free(read_buffer); free(raw_data); } + plc4c_s7_read_write_s7_var_request_parameter_item_field* s7_item_field; - *item = s7_item; + s7_item_field = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item_field)); + s7_item_field->parameter_item = s7_item; + s7_item_field->s7_address_any_encoding_of_string = string_encoding; + *item = s7_item_field; return OK; } diff --git a/plc4c/drivers/s7/src/driver_s7_packets.c b/plc4c/drivers/s7/src/driver_s7_packets.c index 3742f9a73ef..bf68e8455a1 100644 --- a/plc4c/drivers/s7/src/driver_s7_packets.c +++ b/plc4c/drivers/s7/src/driver_s7_packets.c @@ -713,9 +713,9 @@ plc4c_return_code plc4c_driver_s7_create_s7_read_request( plc4c_s7_read_write_s7_var_request_parameter_item* updated_item_address; item = cur_item->value; - + plc4c_s7_read_write_s7_var_request_parameter_item_field* field = item->address; // Get the item address from the API request. - parsed_item_address = item->address; + parsed_item_address = field->parameter_item; // Create a copy of the request item... updated_item_address = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item)); @@ -723,14 +723,14 @@ plc4c_return_code plc4c_driver_s7_create_s7_read_request( return NO_MEMORY; } updated_item_address->_type = parsed_item_address->_type; - updated_item_address->s7_var_request_parameter_item_address_address = + updated_item_address->s7_var_request_parameter_item_address_address = malloc(sizeof(plc4c_s7_read_write_s7_address)); if (updated_item_address->s7_var_request_parameter_item_address_address == NULL) { return NO_MEMORY; } // Memcpy inplace of fields assignment, as all fields where assigned memcpy(updated_item_address->s7_var_request_parameter_item_address_address, - parsed_item_address->s7_var_request_parameter_item_address_address, + parsed_item_address->s7_var_request_parameter_item_address_address, sizeof(plc4c_s7_read_write_s7_address)); // In case of TIME values, we read 4 bytes for each value instead. @@ -855,7 +855,10 @@ plc4c_return_code plc4c_driver_s7_create_s7_write_request( // Get the item address from the API request. item = list_item->value; parsed_item = item->item; - parsed_param = parsed_item->address; + + plc4c_s7_read_write_s7_var_request_parameter_item_field* field = parsed_item->address; + + parsed_param = field->parameter_item; parsed_value = item->value; // Make a copy of the param diff --git a/plc4c/drivers/s7/src/driver_s7_sm_read.c b/plc4c/drivers/s7/src/driver_s7_sm_read.c index 2a41ab9c3f2..2a07026a47d 100644 --- a/plc4c/drivers/s7/src/driver_s7_sm_read.c +++ b/plc4c/drivers/s7/src/driver_s7_sm_read.c @@ -203,6 +203,7 @@ plc4c_return_code plc4c_driver_s7_parse_read_response( plc4c_data* data_item; plc4c_response_value_item* response_value_item; char* data_protocol_id; + char* string_encoding; uint16_t num_elements; int32_t string_length; uint8_t* byte_array; @@ -225,11 +226,13 @@ plc4c_return_code plc4c_driver_s7_parse_read_response( // Get the protocol id for the current item from the corresponding // request item. Also get the number of elements, if it's an array. - request_address = request_item->address; + plc4c_s7_read_write_s7_var_request_parameter_item_field* field = request_item->address; + request_address = field->parameter_item; transport_size = request_address->s7_var_request_parameter_item_address_address->s7_address_any_transport_size; num_elements = request_address->s7_var_request_parameter_item_address_address->s7_address_any_number_of_elements; data_protocol_id = plc4c_s7_read_write_transport_size_get_data_protocol_id(transport_size); - + string_encoding = field->s7_address_any_encoding_of_string; + if (transport_size == plc4c_s7_read_write_transport_size_STRING) { // TODO: This needs to be changed to read arrays of strings. string_length = num_elements; @@ -257,12 +260,12 @@ plc4c_return_code plc4c_driver_s7_parse_read_response( all_data_item = plc4c_data_create_list_data(all_list); free(all_list); for (idx = 0; idx < num_elements ; idx++) { - plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, &data_item); - plc4c_utils_list_insert_head_value(all_data_item->data.list_value, (void*)data_item); + plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, string_encoding, &data_item); + plc4c_utils_list_insert_head_value(&all_data_item->data.list_value, (void*)data_item); } data_item = all_data_item; } else { - plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length, &data_item); + plc4c_s7_read_write_data_item_parse(read_buffer, data_protocol_id, string_length,string_encoding, &data_item); } // Create a new response value-item diff --git a/plc4c/drivers/s7/src/driver_s7_static.c b/plc4c/drivers/s7/src/driver_s7_static.c index 42dc91f2edf..dff33e5bb6b 100644 --- a/plc4c/drivers/s7/src/driver_s7_static.c +++ b/plc4c/drivers/s7/src/driver_s7_static.c @@ -53,7 +53,7 @@ uint16_t plc4c_s7_read_write_s7msec_to_int(plc4c_spi_read_buffer* io) { char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, - char* encoding) { + char* encoding, char* stringEncoding) { if (strcmp(encoding, "UTF-8") == 0) { // Read the max length (which is not interesting for us. uint8_t maxLen; @@ -89,7 +89,7 @@ char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, } char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, - char* encoding) { + char* encoding, char* stringEncoding) { if (strcmp(encoding, "UTF-8") == 0) { char* result = malloc(sizeof(char) * 2); if (result == NULL) { diff --git a/plc4c/generated-sources/plc4x/src/plc4x_value.c b/plc4c/generated-sources/plc4x/src/plc4x_value.c index b464bd1bc54..371df66267a 100644 --- a/plc4c/generated-sources/plc4x/src/plc4x_value.c +++ b/plc4c/generated-sources/plc4x/src/plc4x_value.c @@ -235,6 +235,20 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_parse(plc4c_spi_read_buffer *data_item = plc4c_data_create_string_data(16, value); + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */ + + // Manual Field (value) + char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-8")); + + *data_item = plc4c_data_create_string_data(strlen(value), value); + + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */ + + // Manual Field (value) + char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-16")); + + *data_item = plc4c_data_create_string_data(strlen(value), value); + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */ // Simple Field (milliseconds) @@ -452,6 +466,12 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_serialize(plc4c_spi_write_b if(_res != OK) { return _res; } + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */ + + // Manual Field (value) + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */ + + // Manual Field (value) } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */ // Simple field (milliseconds) @@ -590,6 +610,20 @@ uint16_t plc4c_plc4x_read_write_plc4x_value_length_in_bits(plc4c_data* data_item // Simple field (value) lengthInBits += 16; + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_STRING) { /* STRING */ + + // Manual Field (value) + { + char* _value = data_item->data.string_value; + lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) + (1))) * (8); + } + } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */ + + // Manual Field (value) + { + char* _value = data_item->data.string_value; + lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) + (1))) * (16); + } } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */ // Simple field (milliseconds) diff --git a/plc4c/generated-sources/s7/include/data_item.h b/plc4c/generated-sources/s7/include/data_item.h index 3974923a86e..a7f40affccd 100644 --- a/plc4c/generated-sources/s7/include/data_item.h +++ b/plc4c/generated-sources/s7/include/data_item.h @@ -27,12 +27,12 @@ // Code generated by code-generation. DO NOT EDIT. -plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item); +plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item); -plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item); +plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item); -uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength); +uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding); -uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength); +uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding); #endif // PLC4C_S7_READ_WRITE_DATA_ITEM_H_ diff --git a/plc4c/generated-sources/s7/src/data_item.c b/plc4c/generated-sources/s7/src/data_item.c index 6f4a261e64d..2ef40e710c0 100644 --- a/plc4c/generated-sources/s7/src/data_item.c +++ b/plc4c/generated-sources/s7/src/data_item.c @@ -31,7 +31,7 @@ // Code generated by code-generation. DO NOT EDIT. // Parse function. -plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item) { +plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* readBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item) { uint16_t startPos = plc4c_spi_read_get_pos(readBuffer); uint16_t curPos; plc4c_return_code _res = OK; @@ -215,39 +215,31 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* rea } else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */ - // Simple Field (value) - char* value = ""; - _res = plc4c_spi_read_string(readBuffer, 8, "UTF-8", (char**) &value); - if(_res != OK) { - return _res; - } + // Manual Field (value) + char* value = (char*) (plc4c_s7_read_write_parse_s7_char(readBuffer, "UTF-8", stringEncoding)); *data_item = plc4c_data_create_char_data(value); } else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */ - // Simple Field (value) - char* value = ""; - _res = plc4c_spi_read_string(readBuffer, 16, "UTF-16", (char**) &value); - if(_res != OK) { - return _res; - } + // Manual Field (value) + char* value = (char*) (plc4c_s7_read_write_parse_s7_char(readBuffer, "UTF-16", stringEncoding)); *data_item = plc4c_data_create_char_data(value); } else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */ // Manual Field (value) - char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-8")); + char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-8", stringEncoding)); - *data_item = plc4c_data_create_string_data(stringLength, value); + *data_item = plc4c_data_create_string_data(stringLength, value); } else if(strcmp(dataProtocolId, "IEC61131_WSTRING") == 0) { /* STRING */ // Manual Field (value) - char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-16")); + char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-16", stringEncoding)); - *data_item = plc4c_data_create_string_data(stringLength, value); + *data_item = plc4c_data_create_string_data(stringLength, value); } else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */ @@ -390,7 +382,7 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* rea return OK; } -plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, plc4c_data** data_item) { +plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer* writeBuffer, char* dataProtocolId, int32_t stringLength, char* stringEncoding, plc4c_data** data_item) { plc4c_return_code _res = OK; if(strcmp(dataProtocolId, "IEC61131_BOOL") == 0) { /* BOOL */ @@ -501,18 +493,10 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer } } else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */ - // Simple field (value) - _res = plc4c_spi_write_string(writeBuffer, 8, "UTF-8", (*data_item)->data.char_value); - if(_res != OK) { - return _res; - } + // Manual Field (value) } else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */ - // Simple field (value) - _res = plc4c_spi_write_string(writeBuffer, 16, "UTF-16", (*data_item)->data.char_value); - if(_res != OK) { - return _res; - } + // Manual Field (value) } else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */ // Manual Field (value) @@ -607,11 +591,11 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer return OK; } -uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* data_protocol_id, int32_t string_length) { - return plc4c_s7_read_write_data_item_length_in_bits(data_item, data_protocol_id, string_length) / 8; +uint16_t plc4c_s7_read_write_data_item_length_in_bytes(plc4c_data* data_item, char* data_protocol_id, int32_t string_length, char* string_encoding) { + return plc4c_s7_read_write_data_item_length_in_bits(data_item, data_protocol_id, string_length, string_encoding) / 8; } -uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength) { +uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, char* dataProtocolId, int32_t stringLength, char* stringEncoding) { uint16_t lengthInBits = 0; if(strcmp(dataProtocolId, "IEC61131_BOOL") == 0) { /* BOOL */ @@ -678,26 +662,20 @@ uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, cha lengthInBits += 64; } else if(strcmp(dataProtocolId, "IEC61131_CHAR") == 0) { /* CHAR */ - // Simple field (value) + // Manual Field (value) lengthInBits += 8; } else if(strcmp(dataProtocolId, "IEC61131_WCHAR") == 0) { /* CHAR */ - // Simple field (value) + // Manual Field (value) lengthInBits += 16; } else if(strcmp(dataProtocolId, "IEC61131_STRING") == 0) { /* STRING */ // Manual Field (value) - { - char* _value = data_item->data.string_value; - lengthInBits += (plc4c_spi_evaluation_helper_str_len(_value)) + (2); - } + lengthInBits += (((stringLength) + (2))) * (8); } else if(strcmp(dataProtocolId, "IEC61131_WSTRING") == 0) { /* STRING */ // Manual Field (value) - { - char* _value = data_item->data.string_value; - lengthInBits += (((plc4c_spi_evaluation_helper_str_len(_value)) * (2))) + (2); - } + lengthInBits += (((stringLength) + (2))) * (16); } else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */ // Simple field (milliseconds) diff --git a/plc4c/generated-sources/s7/src/transport_size.c b/plc4c/generated-sources/s7/src/transport_size.c index d7e50f70209..bd41e921403 100644 --- a/plc4c/generated-sources/s7/src/transport_size.c +++ b/plc4c/generated-sources/s7/src/transport_size.c @@ -1093,28 +1093,28 @@ plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_d return plc4c_s7_read_write_data_transport_size_INTEGER; } case plc4c_s7_read_write_transport_size_LINT: { /* '0x0C' */ - return -1; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_ULINT: { /* '0x0D' */ - return -1; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_REAL: { /* '0x0E' */ - return plc4c_s7_read_write_data_transport_size_REAL; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_LREAL: { /* '0x0F' */ - return -1; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_CHAR: { /* '0x10' */ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_WCHAR: { /* '0x11' */ - return -1; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_STRING: { /* '0x12' */ return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_WSTRING: { /* '0x13' */ - return -1; + return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD; } case plc4c_s7_read_write_transport_size_TIME: { /* '0x14' */ return -1; @@ -1363,10 +1363,10 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_t return plc4c_s7_read_write_transport_size_INT; } case plc4c_s7_read_write_transport_size_LINT: { /* '0x0C' */ - return plc4c_s7_read_write_transport_size_INT; + return -1; } case plc4c_s7_read_write_transport_size_ULINT: { /* '0x0D' */ - return plc4c_s7_read_write_transport_size_INT; + return -1; } case plc4c_s7_read_write_transport_size_REAL: { /* '0x0E' */ return -1; diff --git a/plc4go/go.mod b/plc4go/go.mod index cb23e942a13..42981266a4f 100644 --- a/plc4go/go.mod +++ b/plc4go/go.mod @@ -19,7 +19,7 @@ module github.com/apache/plc4x/plc4go -go 1.18 +go 1.19 require ( github.com/IBM/netaddr v1.5.0 diff --git a/plc4go/internal/s7/Reader.go b/plc4go/internal/s7/Reader.go index 85664a71254..7df43624694 100644 --- a/plc4go/internal/s7/Reader.go +++ b/plc4go/internal/s7/Reader.go @@ -210,13 +210,16 @@ func (m *Reader) ToPlc4xReadResponse(response readWriteModel.S7Message, readRequ for i, tagName := range readRequest.GetTagNames() { tag := readRequest.GetTag(tagName).(PlcTag) payloadItem := payloadItems[i] - + stringLength := uint16(254) + if s7StringTag, ok := tag.(PlcStringTag); ok { + stringLength = s7StringTag.stringLength + } responseCode := decodeResponseCode(payloadItem.GetReturnCode()) // Decode the data according to the information from the request log.Trace().Msg("decode data") responseCodes[tagName] = responseCode if responseCode == model.PlcResponseCode_OK { - plcValue, err := readWriteModel.DataItemParse(payloadItem.GetData(), tag.GetDataType().DataProtocolId(), int32(tag.GetNumElements())) + plcValue, err := readWriteModel.DataItemParse(payloadItem.GetData(), tag.GetDataType().DataProtocolId(), int32(stringLength), tag.GetStringEncoding()) if err != nil { return nil, errors.Wrap(err, "Error parsing data item") } diff --git a/plc4go/internal/s7/Tag.go b/plc4go/internal/s7/Tag.go index 9dac0237543..bb0edd83838 100644 --- a/plc4go/internal/s7/Tag.go +++ b/plc4go/internal/s7/Tag.go @@ -39,27 +39,30 @@ type PlcTag interface { GetMemoryArea() readWriteModel.MemoryArea GetByteOffset() uint16 GetBitOffset() uint8 + GetStringEncoding() string } type plcTag struct { - TagType TagType - MemoryArea readWriteModel.MemoryArea - BlockNumber uint16 - ByteOffset uint16 - BitOffset uint8 - NumElements uint16 - Datatype readWriteModel.TransportSize + TagType TagType + MemoryArea readWriteModel.MemoryArea + BlockNumber uint16 + ByteOffset uint16 + BitOffset uint8 + NumElements uint16 + Datatype readWriteModel.TransportSize + StringEncoding string } -func NewTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize) PlcTag { +func NewTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, datatype readWriteModel.TransportSize, stringEncoding string) PlcTag { return plcTag{ - TagType: S7Tag, - MemoryArea: memoryArea, - BlockNumber: blockNumber, - ByteOffset: byteOffset, - BitOffset: bitOffset, - NumElements: numElements, - Datatype: datatype, + TagType: S7Tag, + MemoryArea: memoryArea, + BlockNumber: blockNumber, + ByteOffset: byteOffset, + BitOffset: bitOffset, + NumElements: numElements, + Datatype: datatype, + StringEncoding: stringEncoding, } } @@ -68,16 +71,17 @@ type PlcStringTag struct { stringLength uint16 } -func NewStringTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize) PlcStringTag { +func NewStringTag(memoryArea readWriteModel.MemoryArea, blockNumber uint16, byteOffset uint16, bitOffset uint8, numElements uint16, stringLength uint16, datatype readWriteModel.TransportSize, stringEncoding string) PlcStringTag { return PlcStringTag{ plcTag: plcTag{ - TagType: S7StringTag, - MemoryArea: memoryArea, - BlockNumber: blockNumber, - ByteOffset: byteOffset, - BitOffset: bitOffset, - NumElements: numElements, - Datatype: datatype, + TagType: S7StringTag, + MemoryArea: memoryArea, + BlockNumber: blockNumber, + ByteOffset: byteOffset, + BitOffset: bitOffset, + NumElements: numElements, + Datatype: datatype, + StringEncoding: stringEncoding, }, stringLength: stringLength, } @@ -142,6 +146,10 @@ func (m plcTag) Serialize() ([]byte, error) { return wb.GetBytes(), nil } +func (m plcTag) GetStringEncoding() string { + return m.StringEncoding +} + func (m plcTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error { if err := writeBuffer.PushContext(m.TagType.GetName()); err != nil { return err diff --git a/plc4go/internal/s7/TagHandler.go b/plc4go/internal/s7/TagHandler.go index 6c2bc99cb06..d7f21cce66b 100644 --- a/plc4go/internal/s7/TagHandler.go +++ b/plc4go/internal/s7/TagHandler.go @@ -57,11 +57,11 @@ func NewTagHandler() TagHandler { return TagHandler{ addressPattern: regexp.MustCompile(`^%(?P.)(?P[XBWD]?)(?P\d{1,7})(.(?P[0-7]))?:(?P[a-zA-Z_]+)(\[(?P\d+)])?`), //blockNumber usually has its max hat around 64000 --> 5digits - dataBlockAddressPattern: regexp.MustCompile(`^%DB(?P\d{1,5}).DB(?P[XBWD]?)(?P\d{1,7})(.(?P[0-7]))?:(?P[a-zA-Z_]+)(\[(?P\d+)])?`), - dataBlockShortPattern: regexp.MustCompile(`^%DB(?P\d{1,5}):(?P\d{1,7})(.(?P[0-7]))?:(?P[a-zA-Z_]+)(\[(?P\d+)])?`), - dataBlockStringAddressPattern: regexp.MustCompile(`^%DB(?P\d{1,5}).DB(?P[XBWD]?)(?P\d{1,7})(.(?P[0-7]))?:(?PSTRING|WSTRING)\((?P\d{1,3})\)(\[(?P\d+)])?`), - dataBlockStringShortPattern: regexp.MustCompile(`^%DB(?P\d{1,5}):(?P\d{1,7})(.(?P[0-7]))?:(?PSTRING|WSTRING)\((?P\d{1,3})\)(\[(?P\d+)])?`), - plcProxyAddressPattern: regexp.MustCompile(`[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}`), + dataBlockAddressPattern: regexp.MustCompile(`^%DB(?P\d{1,5}).DB(?P[XBWD]?)(?P\d{1,7})(.(?P[0-7]))?:(?P[a-zA-Z_]+)(\[(?P\d+)])?(\|(?P[a-z0-9A-Z_-]+))?`), + dataBlockShortPattern: regexp.MustCompile(`^%DB(?P\d{1,5}):(?P\d{1,7})(.(?P[0-7]))?:(?P[a-zA-Z_]+)(\[(?P\d+)])?(\|(?P[a-z0-9A-Z_-]+))?`), + dataBlockStringAddressPattern: regexp.MustCompile(`^%DB(?P\d{1,5}).DB(?P[XBWD]?)(?P\d{1,7})(.(?P[0-7]))?:(?PSTRING|WSTRING)\((?P\d{1,3})\)(\[(?P\d+)])?(\|(?P[a-z0-9A-Z_-]+))?`), + dataBlockStringShortPattern: regexp.MustCompile(`^%DB(?P\d{1,5}):(?P\d{1,7})(.(?P[0-7]))?:(?PSTRING|WSTRING)\((?P\d{1,3})\)(\[(?P\d+)])?(\|(?P[a-z0-9A-Z_-]+))?`), + plcProxyAddressPattern: regexp.MustCompile(`[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}(\|(?P[a-z0-9A-Z_-]+))?`), } } @@ -119,8 +119,15 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { if (transferSizeCode != 0) && (dataType.ShortName() != transferSizeCode) { return nil, errors.Errorf("Transfer size code '%d' doesn't match specified data type '%s'", transferSizeCode, dataType) } + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } - return NewStringTag(memoryArea, 0, byteOffset, bitOffset, numElements, stringLength, dataType), nil + return NewStringTag(memoryArea, 0, byteOffset, bitOffset, numElements, stringLength, dataType, stringEncoding), nil } else if match := utils.GetSubgroupMatches(m.dataBlockStringShortPattern, tagAddress); match != nil { dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE]) if !ok { @@ -157,8 +164,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { } numElements = uint16(parsedNumElements) } - - return NewStringTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, dataType), nil + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } + return NewStringTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, dataType, stringEncoding), nil } else if match := utils.GetSubgroupMatches(m.dataBlockAddressPattern, tagAddress); match != nil { dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE]) if !ok { @@ -204,8 +217,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { if (transferSizeCode != 0) && (dataType.ShortName() != transferSizeCode) { return nil, errors.Errorf("Transfer size code '%d' doesn't match specified data type '%s'", transferSizeCode, dataType) } - - return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType), nil + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } + return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil } else if match := utils.GetSubgroupMatches(m.dataBlockShortPattern, tagAddress); match != nil { dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE]) if !ok { @@ -246,8 +265,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { } numElements = uint16(parsedNumElements) } - - return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType), nil + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } + return NewTag(memoryArea, blockNumber, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil } else if match := utils.GetSubgroupMatches(m.plcProxyAddressPattern, tagAddress); match != nil { addressData, err := hex.DecodeString(strings.ReplaceAll(tagAddress, "[-]", "")) if err != nil { @@ -261,7 +286,13 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { if (s7AddressAny.GetTransportSize() != readWriteModel.TransportSize_BOOL) && s7AddressAny.GetBitAddress() != 0 { return nil, errors.New("A bit offset other than 0 is only supported for type BOOL") } - + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if s7AddressAny.GetTransportSize() == readWriteModel.TransportSize_WSTRING || s7AddressAny.GetTransportSize() == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } return NewTag( s7AddressAny.GetArea(), s7AddressAny.GetDbNumber(), @@ -269,6 +300,7 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { s7AddressAny.GetBitAddress(), s7AddressAny.GetNumberOfElements(), s7AddressAny.GetTransportSize(), + stringEncoding, ), nil } else if match := utils.GetSubgroupMatches(m.addressPattern, tagAddress); match != nil { dataType, ok := readWriteModel.TransportSizeByName(match[DATA_TYPE]) @@ -313,8 +345,14 @@ func (m TagHandler) ParseTag(tagAddress string) (model.PlcTag, error) { if (dataType != readWriteModel.TransportSize_BOOL) && bitOffset != 0 { return nil, errors.New("A bit offset other than 0 is only supported for type BOOL") } - - return NewTag(memoryArea, 0, byteOffset, bitOffset, numElements, dataType), nil + stringEncoding := match["stringEncoding"] + if stringEncoding == "" { + stringEncoding = "UTF-8" + if dataType == readWriteModel.TransportSize_WSTRING || dataType == readWriteModel.TransportSize_WCHAR { + stringEncoding = "UTF-16" + } + } + return NewTag(memoryArea, 0, byteOffset, bitOffset, numElements, dataType, stringEncoding), nil } return nil, errors.Errorf("Unable to parse %s", tagAddress) } diff --git a/plc4go/internal/s7/Writer.go b/plc4go/internal/s7/Writer.go index cd33c379e7e..85bef3fa253 100644 --- a/plc4go/internal/s7/Writer.go +++ b/plc4go/internal/s7/Writer.go @@ -231,7 +231,7 @@ func serializePlcValue(tag model.PlcTag, plcValue values.PlcValue) (readWriteMod if s7StringTag, ok := tag.(*PlcStringTag); ok { stringLength = s7StringTag.stringLength } - data, err := readWriteModel.DataItemSerialize(plcValue, s7Tag.GetDataType().DataProtocolId(), int32(stringLength)) + data, err := readWriteModel.DataItemSerialize(plcValue, s7Tag.GetDataType().DataProtocolId(), int32(stringLength), s7Tag.GetStringEncoding()) if err != nil { return nil, errors.Wrapf(err, "Error serializing tag item of type: '%v'", s7Tag.GetDataType()) } diff --git a/plc4go/internal/simulated/Reader_test.go b/plc4go/internal/simulated/Reader_test.go index 41e9bace88b..59007c53891 100644 --- a/plc4go/internal/simulated/Reader_test.go +++ b/plc4go/internal/simulated/Reader_test.go @@ -145,7 +145,7 @@ func TestReader_Read(t *testing.T) { }, args: args{ fields: map[string]model.PlcTag{ - "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL), + "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL, "UTF-8"), }, fieldNames: []string{"test"}, }, diff --git a/plc4go/internal/simulated/Writer_test.go b/plc4go/internal/simulated/Writer_test.go index 9f0b10e97bf..64af673d4f5 100644 --- a/plc4go/internal/simulated/Writer_test.go +++ b/plc4go/internal/simulated/Writer_test.go @@ -154,7 +154,7 @@ func TestWriter_Write(t *testing.T) { }, args: args{ fields: map[string]model.PlcTag{ - "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL), + "test": s7.NewTag(model4.MemoryArea_DATA_BLOCKS, 1, 1, 0, 1, model4.TransportSize_BOOL, "UTF-8"), }, values: map[string]values.PlcValue{ "test": values2.NewPlcBOOL(false), diff --git a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go index 50923103b51..8a902da3683 100644 --- a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go +++ b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go @@ -23,8 +23,8 @@ import ( "github.com/apache/plc4x/plc4go/protocols/abeth/readwrite/model" "github.com/apache/plc4x/plc4go/spi/utils" "github.com/pkg/errors" - "strconv" - "strings" + "strings" + "strconv" ) // Code generated by code-generation. DO NOT EDIT. diff --git a/plc4j/api/pom.xml b/plc4j/api/pom.xml index f4efa24820a..28dd1d940f2 100644 --- a/plc4j/api/pom.xml +++ b/plc4j/api/pom.xml @@ -42,6 +42,9 @@ com.fasterxml.jackson.annotation;resolution:=optional, * + + * + diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java index fc5a3c8274d..e39c6a7f9be 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/DefaultPlcDriverManager.java @@ -71,16 +71,21 @@ public DefaultPlcDriverManager(ClassLoader classLoader) { * @throws PlcConnectionException an exception if the connection attempt failed. */ public PlcConnection getConnection(String url) throws PlcConnectionException { - ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.classLoader); PlcConnection connection; - try { + if (this.classLoader == null) { PlcDriver driver = getDriverForUrl(url); connection = driver.getConnection(url); - connection.connect(); - } finally { - Thread.currentThread().setContextClassLoader(originalClassLoader); + } else { + final ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + try { + PlcDriver driver = getDriverForUrl(url); + connection = driver.getConnection(url); + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } } + connection.connect(); return connection; } @@ -93,19 +98,29 @@ public PlcConnection getConnection(String url) throws PlcConnectionException { * @throws PlcConnectionException an exception if the connection attempt failed. */ public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException { - ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(this.classLoader); PlcConnection connection; - try { + if (this.classLoader == null) { PlcDriver driver = getDriverForUrl(url); - connection = driver.getConnection(url, authentication); - connection.connect(); - } finally { - Thread.currentThread().setContextClassLoader(originalClassLoader); + connection = driver.getConnection(url); + } else { + final ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(classLoader); + try { + PlcDriver driver = getDriverForUrl(url); + connection = driver.getConnection(url, authentication); + } finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } } + connection.connect(); return connection; } + @Override + public PlcDriverManager getDriverManager() { + return this; + } + /** * Returns the codes of all of the drivers which are currently registered at the PlcDriverManager * @return Set of driver codes for all drivers registered diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java index 98511ad75a8..e8515ef5a5d 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionManager.java @@ -41,5 +41,6 @@ public interface PlcConnectionManager { * @throws PlcConnectionException an exception if the connection attempt failed. */ PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException; + PlcDriverManager getDriverManager(); } diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java index 5cdbd794a6a..a0cf8e959d3 100644 --- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java +++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcTag.java @@ -47,6 +47,15 @@ public interface PlcTag { */ String getAddressString(); + /** + * Returns the number of elements, that this tag would be parsed from. + * + * @return the number of elements representing this Tag + */ + default int getNumberOfElements(){ + return 1; + } + /** * Returns the "datatype" of the response one can expect from this tag. * I.e. The mapping between this string and the PlcValue datatype is handled in the ValueHandler class. @@ -63,6 +72,10 @@ default PlcValueType getPlcValueType() { return PlcValueType.NULL; } + @JsonIgnore + default void setPlcValueType(PlcValueType plcValueType){ + } + /** * Returns the number of elements to expect of the response one can expect from this field. * diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java index 9ece366ea51..bacceba34ba 100644 --- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java +++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/tag/DirectAdsTag.java @@ -115,6 +115,7 @@ public String getPlcDataType() { return adsDataTypeName; } + @Override public int getNumberOfElements() { return numberOfElements; } diff --git a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java index 3336e548d16..25991d8f0b4 100644 --- a/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java +++ b/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/api/conversation/canopen/SDODownloadConversation.java @@ -44,7 +44,7 @@ public SDODownloadConversation(CANConversation delegate, int nodeId, int answerN try { WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(value, type, null), ByteOrder.LITTLE_ENDIAN); DataItem.staticSerialize(writeBuffer, value, type, null, ByteOrder.LITTLE_ENDIAN); - data = writeBuffer.getData(); + data = writeBuffer.getBytes(); } catch (SerializationException e) { throw new PlcRuntimeException("Could not serialize data", e); } diff --git a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java index 48f7cf4f0b6..1728abe3176 100644 --- a/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java +++ b/plc4j/drivers/firmata/src/main/java/org/apache/plc4x/java/firmata/readwrite/tag/FirmataTag.java @@ -57,6 +57,7 @@ public int getAddress() { return address; } + @Override public int getNumberOfElements() { return quantity; } diff --git a/plc4j/drivers/knxnetip/pom.xml b/plc4j/drivers/knxnetip/pom.xml index dda734fe8e4..a45c69463da 100644 --- a/plc4j/drivers/knxnetip/pom.xml +++ b/plc4j/drivers/knxnetip/pom.xml @@ -161,7 +161,7 @@ org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on diff --git a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java index c3eaafba966..ba6688b099c 100644 --- a/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java +++ b/plc4j/drivers/knxnetip/src/main/java/org/apache/plc4x/java/knxnetip/protocol/KnxNetIpProtocolLogic.java @@ -286,7 +286,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { try { final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(KnxDatapoint.getLengthInBytes(value, groupAddress.getType())); KnxDatapoint.staticSerialize(writeBuffer, value, groupAddress.getType()); - final byte[] serialized = writeBuffer.getData(); + final byte[] serialized = writeBuffer.getBytes(); dataFirstByte = serialized[0]; data = new byte[serialized.length - 1]; System.arraycopy(serialized, 1, data, 0, serialized.length - 1); diff --git a/plc4j/drivers/opcua/pom.xml b/plc4j/drivers/opcua/pom.xml index 23ac7aa6cb3..cb57d776c26 100644 --- a/plc4j/drivers/opcua/pom.xml +++ b/plc4j/drivers/opcua/pom.xml @@ -161,11 +161,11 @@ org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on @@ -193,6 +193,16 @@ org.eclipse.milo server-examples + + + org.bouncycastle + bcprov-jdk15on + + + org.bouncycastle + bcpkix-jdk15on + + test diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java index 197af70fe5a..51b95b69a7d 100644 --- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java +++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServices.java @@ -28,6 +28,14 @@ public enum OpcuaNodeIdServices { AccessLevelType((int) 15031L), AccessRestrictionType((int) 95L), AcknowledgeableConditionType((int) 2881L), + ActivateSessionRequest((int) 465L), + ActivateSessionRequest_Encoding_DefaultBinary((int) 467L), + ActivateSessionRequest_Encoding_DefaultJson((int) 15145L), + ActivateSessionRequest_Encoding_DefaultXml((int) 466L), + ActivateSessionResponse((int) 468L), + ActivateSessionResponse_Encoding_DefaultBinary((int) 470L), + ActivateSessionResponse_Encoding_DefaultJson((int) 15146L), + ActivateSessionResponse_Encoding_DefaultXml((int) 469L), AdditionalParametersType((int) 16313L), AdditionalParametersType_Encoding_DefaultBinary((int) 17537L), AdditionalParametersType_Encoding_DefaultJson((int) 17547L), @@ -36,16 +44,44 @@ public enum OpcuaNodeIdServices { AddNodesItem_Encoding_DefaultBinary((int) 378L), AddNodesItem_Encoding_DefaultJson((int) 15165L), AddNodesItem_Encoding_DefaultXml((int) 377L), + AddNodesRequest((int) 486L), + AddNodesRequest_Encoding_DefaultBinary((int) 488L), + AddNodesRequest_Encoding_DefaultJson((int) 15167L), + AddNodesRequest_Encoding_DefaultXml((int) 487L), + AddNodesResponse((int) 489L), + AddNodesResponse_Encoding_DefaultBinary((int) 491L), + AddNodesResponse_Encoding_DefaultJson((int) 15168L), + AddNodesResponse_Encoding_DefaultXml((int) 490L), + AddNodesResult((int) 483L), + AddNodesResult_Encoding_DefaultBinary((int) 485L), + AddNodesResult_Encoding_DefaultJson((int) 15166L), + AddNodesResult_Encoding_DefaultXml((int) 484L), AddReferencesItem((int) 379L), AddReferencesItem_Encoding_DefaultBinary((int) 381L), AddReferencesItem_Encoding_DefaultJson((int) 15169L), AddReferencesItem_Encoding_DefaultXml((int) 380L), + AddReferencesRequest((int) 492L), + AddReferencesRequest_Encoding_DefaultBinary((int) 494L), + AddReferencesRequest_Encoding_DefaultJson((int) 15170L), + AddReferencesRequest_Encoding_DefaultXml((int) 493L), + AddReferencesResponse((int) 495L), + AddReferencesResponse_Encoding_DefaultBinary((int) 497L), + AddReferencesResponse_Encoding_DefaultJson((int) 15171L), + AddReferencesResponse_Encoding_DefaultXml((int) 496L), AddressSpaceFileType((int) 11595L), AggregateConfiguration((int) 948L), AggregateConfiguration_Encoding_DefaultBinary((int) 950L), AggregateConfiguration_Encoding_DefaultJson((int) 15304L), AggregateConfiguration_Encoding_DefaultXml((int) 949L), AggregateConfigurationType((int) 11187L), + AggregateFilter((int) 728L), + AggregateFilter_Encoding_DefaultBinary((int) 730L), + AggregateFilter_Encoding_DefaultJson((int) 15312L), + AggregateFilter_Encoding_DefaultXml((int) 729L), + AggregateFilterResult((int) 737L), + AggregateFilterResult_Encoding_DefaultBinary((int) 739L), + AggregateFilterResult_Encoding_DefaultJson((int) 15315L), + AggregateFilterResult_Encoding_DefaultXml((int) 738L), AggregateFunction_AnnotationCount((int) 2351L), AggregateFunction_Average((int) 2342L), AggregateFunction_Count((int) 2352L), @@ -216,6 +252,44 @@ public enum OpcuaNodeIdServices { BrokerWriterGroupTransportDataType_Encoding_DefaultJson((int) 16524L), BrokerWriterGroupTransportDataType_Encoding_DefaultXml((int) 16021L), BrokerWriterGroupTransportType((int) 21136L), + BrowseDescription((int) 514L), + BrowseDescription_Encoding_DefaultBinary((int) 516L), + BrowseDescription_Encoding_DefaultJson((int) 15180L), + BrowseDescription_Encoding_DefaultXml((int) 515L), + BrowseDirection((int) 510L), + BrowseNextRequest((int) 531L), + BrowseNextRequest_Encoding_DefaultBinary((int) 533L), + BrowseNextRequest_Encoding_DefaultJson((int) 15186L), + BrowseNextRequest_Encoding_DefaultXml((int) 532L), + BrowseNextResponse((int) 534L), + BrowseNextResponse_Encoding_DefaultBinary((int) 536L), + BrowseNextResponse_Encoding_DefaultJson((int) 15187L), + BrowseNextResponse_Encoding_DefaultXml((int) 535L), + BrowsePath((int) 543L), + BrowsePath_Encoding_DefaultBinary((int) 545L), + BrowsePath_Encoding_DefaultJson((int) 15190L), + BrowsePath_Encoding_DefaultXml((int) 544L), + BrowsePathResult((int) 549L), + BrowsePathResult_Encoding_DefaultBinary((int) 551L), + BrowsePathResult_Encoding_DefaultJson((int) 15192L), + BrowsePathResult_Encoding_DefaultXml((int) 550L), + BrowsePathTarget((int) 546L), + BrowsePathTarget_Encoding_DefaultBinary((int) 548L), + BrowsePathTarget_Encoding_DefaultJson((int) 15191L), + BrowsePathTarget_Encoding_DefaultXml((int) 547L), + BrowseRequest((int) 525L), + BrowseRequest_Encoding_DefaultBinary((int) 527L), + BrowseRequest_Encoding_DefaultJson((int) 15184L), + BrowseRequest_Encoding_DefaultXml((int) 526L), + BrowseResponse((int) 528L), + BrowseResponse_Encoding_DefaultBinary((int) 530L), + BrowseResponse_Encoding_DefaultJson((int) 15185L), + BrowseResponse_Encoding_DefaultXml((int) 529L), + BrowseResult((int) 522L), + BrowseResult_Encoding_DefaultBinary((int) 524L), + BrowseResult_Encoding_DefaultJson((int) 15183L), + BrowseResult_Encoding_DefaultXml((int) 523L), + BrowseResultMask((int) 517L), BuildInfo((int) 338L), BuildInfo_Encoding_DefaultBinary((int) 340L), BuildInfo_Encoding_DefaultJson((int) 15361L), @@ -223,6 +297,30 @@ public enum OpcuaNodeIdServices { BuildInfoType((int) 3051L), Byte((int) 3L), ByteString((int) 15L), + CallMethodRequest((int) 704L), + CallMethodRequest_Encoding_DefaultBinary((int) 706L), + CallMethodRequest_Encoding_DefaultJson((int) 15289L), + CallMethodRequest_Encoding_DefaultXml((int) 705L), + CallMethodResult((int) 707L), + CallMethodResult_Encoding_DefaultBinary((int) 709L), + CallMethodResult_Encoding_DefaultJson((int) 15290L), + CallMethodResult_Encoding_DefaultXml((int) 708L), + CallRequest((int) 710L), + CallRequest_Encoding_DefaultBinary((int) 712L), + CallRequest_Encoding_DefaultJson((int) 15291L), + CallRequest_Encoding_DefaultXml((int) 711L), + CallResponse((int) 713L), + CallResponse_Encoding_DefaultBinary((int) 715L), + CallResponse_Encoding_DefaultJson((int) 15292L), + CallResponse_Encoding_DefaultXml((int) 714L), + CancelRequest((int) 477L), + CancelRequest_Encoding_DefaultBinary((int) 479L), + CancelRequest_Encoding_DefaultJson((int) 15149L), + CancelRequest_Encoding_DefaultXml((int) 478L), + CancelResponse((int) 480L), + CancelResponse_Encoding_DefaultBinary((int) 482L), + CancelResponse_Encoding_DefaultJson((int) 15150L), + CancelResponse_Encoding_DefaultXml((int) 481L), CartesianCoordinates((int) 18809L), CartesianCoordinates_Encoding_DefaultBinary((int) 18818L), CartesianCoordinates_Encoding_DefaultJson((int) 19067L), @@ -233,7 +331,27 @@ public enum OpcuaNodeIdServices { CertificateGroupType((int) 12555L), CertificateType((int) 12556L), CertificateUpdatedAuditEventType((int) 12620L), + ChannelSecurityToken((int) 441L), + ChannelSecurityToken_Encoding_DefaultBinary((int) 443L), + ChannelSecurityToken_Encoding_DefaultJson((int) 15131L), + ChannelSecurityToken_Encoding_DefaultXml((int) 442L), ChoiceStateType((int) 15109L), + CloseSecureChannelRequest((int) 450L), + CloseSecureChannelRequest_Encoding_DefaultBinary((int) 452L), + CloseSecureChannelRequest_Encoding_DefaultJson((int) 15134L), + CloseSecureChannelRequest_Encoding_DefaultXml((int) 451L), + CloseSecureChannelResponse((int) 453L), + CloseSecureChannelResponse_Encoding_DefaultBinary((int) 455L), + CloseSecureChannelResponse_Encoding_DefaultJson((int) 15135L), + CloseSecureChannelResponse_Encoding_DefaultXml((int) 454L), + CloseSessionRequest((int) 471L), + CloseSessionRequest_Encoding_DefaultBinary((int) 473L), + CloseSessionRequest_Encoding_DefaultJson((int) 15147L), + CloseSessionRequest_Encoding_DefaultXml((int) 472L), + CloseSessionResponse((int) 474L), + CloseSessionResponse_Encoding_DefaultBinary((int) 476L), + CloseSessionResponse_Encoding_DefaultJson((int) 15148L), + CloseSessionResponse_Encoding_DefaultXml((int) 475L), Communication((int) 24227L), ComplexNumberType((int) 12171L), ComplexNumberType_Encoding_DefaultBinary((int) 12181L), @@ -258,14 +376,55 @@ public enum OpcuaNodeIdServices { ContentFilterElement_Encoding_DefaultBinary((int) 585L), ContentFilterElement_Encoding_DefaultJson((int) 15204L), ContentFilterElement_Encoding_DefaultXml((int) 584L), + ContentFilterElementResult((int) 604L), + ContentFilterElementResult_Encoding_DefaultBinary((int) 606L), + ContentFilterElementResult_Encoding_DefaultJson((int) 15211L), + ContentFilterElementResult_Encoding_DefaultXml((int) 605L), + ContentFilterResult((int) 607L), + ContentFilterResult_Encoding_DefaultBinary((int) 609L), + ContentFilterResult_Encoding_DefaultJson((int) 15228L), + ContentFilterResult_Encoding_DefaultXml((int) 608L), ContinuationPoint((int) 521L), Counter((int) 289L), + CreateMonitoredItemsRequest((int) 749L), + CreateMonitoredItemsRequest_Encoding_DefaultBinary((int) 751L), + CreateMonitoredItemsRequest_Encoding_DefaultJson((int) 15323L), + CreateMonitoredItemsRequest_Encoding_DefaultXml((int) 750L), + CreateMonitoredItemsResponse((int) 752L), + CreateMonitoredItemsResponse_Encoding_DefaultBinary((int) 754L), + CreateMonitoredItemsResponse_Encoding_DefaultJson((int) 15324L), + CreateMonitoredItemsResponse_Encoding_DefaultXml((int) 753L), + CreateSessionRequest((int) 459L), + CreateSessionRequest_Encoding_DefaultBinary((int) 461L), + CreateSessionRequest_Encoding_DefaultJson((int) 15138L), + CreateSessionRequest_Encoding_DefaultXml((int) 460L), + CreateSessionResponse((int) 462L), + CreateSessionResponse_Encoding_DefaultBinary((int) 464L), + CreateSessionResponse_Encoding_DefaultJson((int) 15139L), + CreateSessionResponse_Encoding_DefaultXml((int) 463L), + CreateSubscriptionRequest((int) 785L), + CreateSubscriptionRequest_Encoding_DefaultBinary((int) 787L), + CreateSubscriptionRequest_Encoding_DefaultJson((int) 15337L), + CreateSubscriptionRequest_Encoding_DefaultXml((int) 786L), + CreateSubscriptionResponse((int) 788L), + CreateSubscriptionResponse_Encoding_DefaultBinary((int) 790L), + CreateSubscriptionResponse_Encoding_DefaultJson((int) 15338L), + CreateSubscriptionResponse_Encoding_DefaultXml((int) 789L), CubeItemType((int) 12057L), CurrencyUnit((int) 23501L), CurrencyUnitType((int) 23498L), CurrencyUnitType_Encoding_DefaultBinary((int) 23507L), CurrencyUnitType_Encoding_DefaultJson((int) 23528L), CurrencyUnitType_Encoding_DefaultXml((int) 23520L), + DataChangeFilter((int) 722L), + DataChangeFilter_Encoding_DefaultBinary((int) 724L), + DataChangeFilter_Encoding_DefaultJson((int) 15294L), + DataChangeFilter_Encoding_DefaultXml((int) 723L), + DataChangeNotification((int) 809L), + DataChangeNotification_Encoding_DefaultBinary((int) 811L), + DataChangeNotification_Encoding_DefaultJson((int) 15345L), + DataChangeNotification_Encoding_DefaultXml((int) 810L), + DataChangeTrigger((int) 717L), DatagramConnectionTransportDataType((int) 17467L), DatagramConnectionTransportDataType_Encoding_DefaultBinary((int) 17468L), DatagramConnectionTransportDataType_Encoding_DefaultJson((int) 17476L), @@ -316,6 +475,10 @@ public enum OpcuaNodeIdServices { DataSetWriterTransportDataType_Encoding_DefaultXml((int) 15956L), DataSetWriterTransportType((int) 15305L), DataSetWriterType((int) 15298L), + DataTypeAttributes((int) 370L), + DataTypeAttributes_Encoding_DefaultBinary((int) 372L), + DataTypeAttributes_Encoding_DefaultJson((int) 15161L), + DataTypeAttributes_Encoding_DefaultXml((int) 371L), DataTypeDefinition((int) 97L), DataTypeDefinition_Encoding_DefaultBinary((int) 121L), DataTypeDefinition_Encoding_DefaultJson((int) 15063L), @@ -327,6 +490,10 @@ public enum OpcuaNodeIdServices { DataTypeDescriptionType((int) 69L), DataTypeDictionaryType((int) 72L), DataTypeEncodingType((int) 76L), + DataTypeNode((int) 282L), + DataTypeNode_Encoding_DefaultBinary((int) 284L), + DataTypeNode_Encoding_DefaultJson((int) 15079L), + DataTypeNode_Encoding_DefaultXml((int) 283L), DataTypeSchemaHeader((int) 15534L), DataTypeSchemaHeader_Encoding_DefaultBinary((int) 15676L), DataTypeSchemaHeader_Encoding_DefaultJson((int) 16151L), @@ -337,19 +504,68 @@ public enum OpcuaNodeIdServices { Date((int) 293L), DateString((int) 12881L), DateTime((int) 13L), + DeadbandType((int) 718L), Decimal((int) 50L), + DecimalDataType((int) 17861L), + DecimalDataType_Encoding_DefaultBinary((int) 17863L), + DecimalDataType_Encoding_DefaultJson((int) 15045L), + DecimalDataType_Encoding_DefaultXml((int) 17862L), DecimalString((int) 12878L), DefaultBinary((int) 3062L), DefaultInstanceBrowseName((int) 17605L), DefaultXml((int) 3063L), + DeleteAtTimeDetails((int) 689L), + DeleteAtTimeDetails_Encoding_DefaultBinary((int) 691L), + DeleteAtTimeDetails_Encoding_DefaultJson((int) 15284L), + DeleteAtTimeDetails_Encoding_DefaultXml((int) 690L), + DeleteEventDetails((int) 692L), + DeleteEventDetails_Encoding_DefaultBinary((int) 694L), + DeleteEventDetails_Encoding_DefaultJson((int) 15285L), + DeleteEventDetails_Encoding_DefaultXml((int) 693L), + DeleteMonitoredItemsRequest((int) 779L), + DeleteMonitoredItemsRequest_Encoding_DefaultBinary((int) 781L), + DeleteMonitoredItemsRequest_Encoding_DefaultJson((int) 15335L), + DeleteMonitoredItemsRequest_Encoding_DefaultXml((int) 780L), + DeleteMonitoredItemsResponse((int) 782L), + DeleteMonitoredItemsResponse_Encoding_DefaultBinary((int) 784L), + DeleteMonitoredItemsResponse_Encoding_DefaultJson((int) 15336L), + DeleteMonitoredItemsResponse_Encoding_DefaultXml((int) 783L), DeleteNodesItem((int) 382L), DeleteNodesItem_Encoding_DefaultBinary((int) 384L), DeleteNodesItem_Encoding_DefaultJson((int) 15172L), DeleteNodesItem_Encoding_DefaultXml((int) 383L), + DeleteNodesRequest((int) 498L), + DeleteNodesRequest_Encoding_DefaultBinary((int) 500L), + DeleteNodesRequest_Encoding_DefaultJson((int) 15173L), + DeleteNodesRequest_Encoding_DefaultXml((int) 499L), + DeleteNodesResponse((int) 501L), + DeleteNodesResponse_Encoding_DefaultBinary((int) 503L), + DeleteNodesResponse_Encoding_DefaultJson((int) 15174L), + DeleteNodesResponse_Encoding_DefaultXml((int) 502L), + DeleteRawModifiedDetails((int) 686L), + DeleteRawModifiedDetails_Encoding_DefaultBinary((int) 688L), + DeleteRawModifiedDetails_Encoding_DefaultJson((int) 15283L), + DeleteRawModifiedDetails_Encoding_DefaultXml((int) 687L), DeleteReferencesItem((int) 385L), DeleteReferencesItem_Encoding_DefaultBinary((int) 387L), DeleteReferencesItem_Encoding_DefaultJson((int) 15175L), DeleteReferencesItem_Encoding_DefaultXml((int) 386L), + DeleteReferencesRequest((int) 504L), + DeleteReferencesRequest_Encoding_DefaultBinary((int) 506L), + DeleteReferencesRequest_Encoding_DefaultJson((int) 15176L), + DeleteReferencesRequest_Encoding_DefaultXml((int) 505L), + DeleteReferencesResponse((int) 507L), + DeleteReferencesResponse_Encoding_DefaultBinary((int) 509L), + DeleteReferencesResponse_Encoding_DefaultJson((int) 15177L), + DeleteReferencesResponse_Encoding_DefaultXml((int) 508L), + DeleteSubscriptionsRequest((int) 845L), + DeleteSubscriptionsRequest_Encoding_DefaultBinary((int) 847L), + DeleteSubscriptionsRequest_Encoding_DefaultJson((int) 15359L), + DeleteSubscriptionsRequest_Encoding_DefaultXml((int) 846L), + DeleteSubscriptionsResponse((int) 848L), + DeleteSubscriptionsResponse_Encoding_DefaultBinary((int) 850L), + DeleteSubscriptionsResponse_Encoding_DefaultJson((int) 15360L), + DeleteSubscriptionsResponse_Encoding_DefaultXml((int) 849L), DeviceFailureEventType((int) 2131L), DiagnosticInfo((int) 25L), DiagnosticsLevel((int) 19723L), @@ -377,6 +593,7 @@ public enum OpcuaNodeIdServices { EccBrainpoolP384r1ApplicationCertificateType((int) 23541L), EccCurve25519ApplicationCertificateType((int) 23542L), EccCurve448ApplicationCertificateType((int) 23543L), + EccEncryptedSecret((int) 17546L), EccNistP256ApplicationCertificateType((int) 23538L), EccNistP384ApplicationCertificateType((int) 23539L), ElementOperand((int) 592L), @@ -428,10 +645,22 @@ public enum OpcuaNodeIdServices { EUInformation_Encoding_DefaultBinary((int) 889L), EUInformation_Encoding_DefaultJson((int) 15376L), EUInformation_Encoding_DefaultXml((int) 888L), + EventFieldList((int) 917L), + EventFieldList_Encoding_DefaultBinary((int) 919L), + EventFieldList_Encoding_DefaultJson((int) 15348L), + EventFieldList_Encoding_DefaultXml((int) 918L), EventFilter((int) 725L), EventFilter_Encoding_DefaultBinary((int) 727L), EventFilter_Encoding_DefaultJson((int) 15295L), EventFilter_Encoding_DefaultXml((int) 726L), + EventFilterResult((int) 734L), + EventFilterResult_Encoding_DefaultBinary((int) 736L), + EventFilterResult_Encoding_DefaultJson((int) 15314L), + EventFilterResult_Encoding_DefaultXml((int) 735L), + EventNotificationList((int) 914L), + EventNotificationList_Encoding_DefaultBinary((int) 916L), + EventNotificationList_Encoding_DefaultJson((int) 15347L), + EventNotificationList_Encoding_DefaultXml((int) 915L), EventNotifierType((int) 15033L), EventQueueOverflowEventType((int) 3035L), EventTypesFolder((int) 3048L), @@ -461,6 +690,22 @@ public enum OpcuaNodeIdServices { FilterOperand_Encoding_DefaultJson((int) 15206L), FilterOperand_Encoding_DefaultXml((int) 590L), FilterOperator((int) 576L), + FindServersOnNetworkRequest((int) 12190L), + FindServersOnNetworkRequest_Encoding_DefaultBinary((int) 12208L), + FindServersOnNetworkRequest_Encoding_DefaultJson((int) 15096L), + FindServersOnNetworkRequest_Encoding_DefaultXml((int) 12196L), + FindServersOnNetworkResponse((int) 12191L), + FindServersOnNetworkResponse_Encoding_DefaultBinary((int) 12209L), + FindServersOnNetworkResponse_Encoding_DefaultJson((int) 15097L), + FindServersOnNetworkResponse_Encoding_DefaultXml((int) 12197L), + FindServersRequest((int) 420L), + FindServersRequest_Encoding_DefaultBinary((int) 422L), + FindServersRequest_Encoding_DefaultJson((int) 15093L), + FindServersRequest_Encoding_DefaultXml((int) 421L), + FindServersResponse((int) 423L), + FindServersResponse_Encoding_DefaultBinary((int) 425L), + FindServersResponse_Encoding_DefaultJson((int) 15094L), + FindServersResponse_Encoding_DefaultXml((int) 424L), FiniteStateMachineType((int) 2771L), FiniteStateVariableType((int) 2760L), FiniteTransitionVariableType((int) 2767L), @@ -474,6 +719,22 @@ public enum OpcuaNodeIdServices { FromState((int) 51L), GeneralModelChangeEventType((int) 2133L), GeneratesEvent((int) 41L), + GenericAttributes((int) 17607L), + GenericAttributes_Encoding_DefaultBinary((int) 17611L), + GenericAttributes_Encoding_DefaultJson((int) 15164L), + GenericAttributes_Encoding_DefaultXml((int) 17609L), + GenericAttributeValue((int) 17606L), + GenericAttributeValue_Encoding_DefaultBinary((int) 17610L), + GenericAttributeValue_Encoding_DefaultJson((int) 15163L), + GenericAttributeValue_Encoding_DefaultXml((int) 17608L), + GetEndpointsRequest((int) 426L), + GetEndpointsRequest_Encoding_DefaultBinary((int) 428L), + GetEndpointsRequest_Encoding_DefaultJson((int) 15100L), + GetEndpointsRequest_Encoding_DefaultXml((int) 427L), + GetEndpointsResponse((int) 429L), + GetEndpointsResponse_Encoding_DefaultBinary((int) 431L), + GetEndpointsResponse_Encoding_DefaultJson((int) 15101L), + GetEndpointsResponse_Encoding_DefaultXml((int) 430L), GuardVariableType((int) 15113L), Guid((int) 14L), HAConfiguration((int) 11202L), @@ -515,6 +776,10 @@ public enum OpcuaNodeIdServices { HighlyManagedAlarmConditionClassType((int) 17219L), HistoricalDataConfigurationType((int) 2318L), HistoricalEventFilter((int) 11215L), + HistoryData((int) 656L), + HistoryData_Encoding_DefaultBinary((int) 658L), + HistoryData_Encoding_DefaultJson((int) 15270L), + HistoryData_Encoding_DefaultXml((int) 657L), HistoryEvent((int) 659L), HistoryEvent_Encoding_DefaultBinary((int) 661L), HistoryEvent_Encoding_DefaultJson((int) 15273L), @@ -523,8 +788,48 @@ public enum OpcuaNodeIdServices { HistoryEventFieldList_Encoding_DefaultBinary((int) 922L), HistoryEventFieldList_Encoding_DefaultJson((int) 15349L), HistoryEventFieldList_Encoding_DefaultXml((int) 921L), + HistoryModifiedData((int) 11217L), + HistoryModifiedData_Encoding_DefaultBinary((int) 11227L), + HistoryModifiedData_Encoding_DefaultJson((int) 15272L), + HistoryModifiedData_Encoding_DefaultXml((int) 11219L), + HistoryReadDetails((int) 641L), + HistoryReadDetails_Encoding_DefaultBinary((int) 643L), + HistoryReadDetails_Encoding_DefaultJson((int) 15261L), + HistoryReadDetails_Encoding_DefaultXml((int) 642L), + HistoryReadRequest((int) 662L), + HistoryReadRequest_Encoding_DefaultBinary((int) 664L), + HistoryReadRequest_Encoding_DefaultJson((int) 15274L), + HistoryReadRequest_Encoding_DefaultXml((int) 663L), + HistoryReadResponse((int) 665L), + HistoryReadResponse_Encoding_DefaultBinary((int) 667L), + HistoryReadResponse_Encoding_DefaultJson((int) 15275L), + HistoryReadResponse_Encoding_DefaultXml((int) 666L), + HistoryReadResult((int) 638L), + HistoryReadResult_Encoding_DefaultBinary((int) 640L), + HistoryReadResult_Encoding_DefaultJson((int) 15260L), + HistoryReadResult_Encoding_DefaultXml((int) 639L), + HistoryReadValueId((int) 635L), + HistoryReadValueId_Encoding_DefaultBinary((int) 637L), + HistoryReadValueId_Encoding_DefaultJson((int) 15259L), + HistoryReadValueId_Encoding_DefaultXml((int) 636L), HistoryServerCapabilities((int) 11192L), HistoryServerCapabilitiesType((int) 2330L), + HistoryUpdateDetails((int) 677L), + HistoryUpdateDetails_Encoding_DefaultBinary((int) 679L), + HistoryUpdateDetails_Encoding_DefaultJson((int) 15279L), + HistoryUpdateDetails_Encoding_DefaultXml((int) 678L), + HistoryUpdateRequest((int) 698L), + HistoryUpdateRequest_Encoding_DefaultBinary((int) 700L), + HistoryUpdateRequest_Encoding_DefaultJson((int) 15287L), + HistoryUpdateRequest_Encoding_DefaultXml((int) 699L), + HistoryUpdateResponse((int) 701L), + HistoryUpdateResponse_Encoding_DefaultBinary((int) 703L), + HistoryUpdateResponse_Encoding_DefaultJson((int) 15288L), + HistoryUpdateResponse_Encoding_DefaultXml((int) 702L), + HistoryUpdateResult((int) 695L), + HistoryUpdateResult_Encoding_DefaultBinary((int) 697L), + HistoryUpdateResult_Encoding_DefaultJson((int) 15286L), + HistoryUpdateResult_Encoding_DefaultXml((int) 696L), HistoryUpdateType((int) 11234L), HttpsCertificateType((int) 12558L), IBaseEthernetCapabilitiesType((int) 24167L), @@ -555,6 +860,10 @@ public enum OpcuaNodeIdServices { Index((int) 17588L), InitialStateType((int) 2309L), InputArguments((int) 3072L), + InstanceNode((int) 11879L), + InstanceNode_Encoding_DefaultBinary((int) 11889L), + InstanceNode_Encoding_DefaultJson((int) 15069L), + InstanceNode_Encoding_DefaultXml((int) 11887L), InstrumentDiagnosticAlarmType((int) 18347L), Int16((int) 4L), Int32((int) 6L), @@ -619,20 +928,78 @@ public enum OpcuaNodeIdServices { MdnsDiscoveryConfiguration_Encoding_DefaultJson((int) 15106L), MdnsDiscoveryConfiguration_Encoding_DefaultXml((int) 12893L), MessageSecurityMode((int) 302L), + MethodAttributes((int) 358L), + MethodAttributes_Encoding_DefaultBinary((int) 360L), + MethodAttributes_Encoding_DefaultJson((int) 15157L), + MethodAttributes_Encoding_DefaultXml((int) 359L), + MethodNode((int) 276L), + MethodNode_Encoding_DefaultBinary((int) 278L), + MethodNode_Encoding_DefaultJson((int) 15077L), + MethodNode_Encoding_DefaultXml((int) 277L), ModelChangeStructureDataType((int) 877L), ModelChangeStructureDataType_Encoding_DefaultBinary((int) 879L), ModelChangeStructureDataType_Encoding_DefaultJson((int) 15373L), ModelChangeStructureDataType_Encoding_DefaultXml((int) 878L), + ModelChangeStructureVerbMask((int) 11941L), ModellingRule_ExposesItsArray((int) 83L), ModellingRule_Mandatory((int) 78L), ModellingRule_MandatoryPlaceholder((int) 11510L), ModellingRule_Optional((int) 80L), ModellingRule_OptionalPlaceholder((int) 11508L), ModellingRuleType((int) 77L), + ModificationInfo((int) 11216L), + ModificationInfo_Encoding_DefaultBinary((int) 11226L), + ModificationInfo_Encoding_DefaultJson((int) 15271L), + ModificationInfo_Encoding_DefaultXml((int) 11218L), + ModifyMonitoredItemsRequest((int) 761L), + ModifyMonitoredItemsRequest_Encoding_DefaultBinary((int) 763L), + ModifyMonitoredItemsRequest_Encoding_DefaultJson((int) 15327L), + ModifyMonitoredItemsRequest_Encoding_DefaultXml((int) 762L), + ModifyMonitoredItemsResponse((int) 764L), + ModifyMonitoredItemsResponse_Encoding_DefaultBinary((int) 766L), + ModifyMonitoredItemsResponse_Encoding_DefaultJson((int) 15328L), + ModifyMonitoredItemsResponse_Encoding_DefaultXml((int) 765L), + ModifySubscriptionRequest((int) 791L), + ModifySubscriptionRequest_Encoding_DefaultBinary((int) 793L), + ModifySubscriptionRequest_Encoding_DefaultJson((int) 15339L), + ModifySubscriptionRequest_Encoding_DefaultXml((int) 792L), + ModifySubscriptionResponse((int) 794L), + ModifySubscriptionResponse_Encoding_DefaultBinary((int) 796L), + ModifySubscriptionResponse_Encoding_DefaultJson((int) 15340L), + ModifySubscriptionResponse_Encoding_DefaultXml((int) 795L), + MonitoredItemCreateRequest((int) 743L), + MonitoredItemCreateRequest_Encoding_DefaultBinary((int) 745L), + MonitoredItemCreateRequest_Encoding_DefaultJson((int) 15321L), + MonitoredItemCreateRequest_Encoding_DefaultXml((int) 744L), + MonitoredItemCreateResult((int) 746L), + MonitoredItemCreateResult_Encoding_DefaultBinary((int) 748L), + MonitoredItemCreateResult_Encoding_DefaultJson((int) 15322L), + MonitoredItemCreateResult_Encoding_DefaultXml((int) 747L), + MonitoredItemModifyRequest((int) 755L), + MonitoredItemModifyRequest_Encoding_DefaultBinary((int) 757L), + MonitoredItemModifyRequest_Encoding_DefaultJson((int) 15325L), + MonitoredItemModifyRequest_Encoding_DefaultXml((int) 756L), + MonitoredItemModifyResult((int) 758L), + MonitoredItemModifyResult_Encoding_DefaultBinary((int) 760L), + MonitoredItemModifyResult_Encoding_DefaultJson((int) 15326L), + MonitoredItemModifyResult_Encoding_DefaultXml((int) 759L), + MonitoredItemNotification((int) 806L), + MonitoredItemNotification_Encoding_DefaultBinary((int) 808L), + MonitoredItemNotification_Encoding_DefaultJson((int) 15346L), + MonitoredItemNotification_Encoding_DefaultXml((int) 807L), MonitoringFilter((int) 719L), MonitoringFilter_Encoding_DefaultBinary((int) 721L), MonitoringFilter_Encoding_DefaultJson((int) 15293L), MonitoringFilter_Encoding_DefaultXml((int) 720L), + MonitoringFilterResult((int) 731L), + MonitoringFilterResult_Encoding_DefaultBinary((int) 733L), + MonitoringFilterResult_Encoding_DefaultJson((int) 15313L), + MonitoringFilterResult_Encoding_DefaultXml((int) 732L), + MonitoringMode((int) 716L), + MonitoringParameters((int) 740L), + MonitoringParameters_Encoding_DefaultBinary((int) 742L), + MonitoringParameters_Encoding_DefaultJson((int) 15320L), + MonitoringParameters_Encoding_DefaultXml((int) 741L), MultiStateDictionaryEntryDiscreteBaseType((int) 19077L), MultiStateDictionaryEntryDiscreteType((int) 19084L), MultiStateDiscreteType((int) 2376L), @@ -657,9 +1024,25 @@ public enum OpcuaNodeIdServices { NetworkGroupDataType_Encoding_DefaultJson((int) 15364L), NetworkGroupDataType_Encoding_DefaultXml((int) 11950L), NetworkInterfaces((int) 24229L), + Node((int) 258L), + Node_Encoding_DefaultBinary((int) 260L), + Node_Encoding_DefaultJson((int) 15068L), + Node_Encoding_DefaultXml((int) 259L), + NodeAttributes((int) 349L), + NodeAttributes_Encoding_DefaultBinary((int) 351L), + NodeAttributes_Encoding_DefaultJson((int) 15151L), + NodeAttributes_Encoding_DefaultXml((int) 350L), NodeAttributesMask((int) 348L), NodeClass((int) 257L), NodeId((int) 17L), + NodeReference((int) 580L), + NodeReference_Encoding_DefaultBinary((int) 582L), + NodeReference_Encoding_DefaultJson((int) 15203L), + NodeReference_Encoding_DefaultXml((int) 581L), + NodeTypeDescription((int) 573L), + NodeTypeDescription_Encoding_DefaultBinary((int) 575L), + NodeTypeDescription_Encoding_DefaultJson((int) 15201L), + NodeTypeDescription_Encoding_DefaultXml((int) 574L), NodeVersion((int) 3068L), NonExclusiveDeviationAlarmType((int) 10368L), NonExclusiveLevelAlarmType((int) 10060L), @@ -669,9 +1052,33 @@ public enum OpcuaNodeIdServices { NonTransparentNetworkRedundancyType((int) 11945L), NonTransparentRedundancyType((int) 2039L), NormalizedString((int) 12877L), + NotificationData((int) 945L), + NotificationData_Encoding_DefaultBinary((int) 947L), + NotificationData_Encoding_DefaultJson((int) 15344L), + NotificationData_Encoding_DefaultXml((int) 946L), + NotificationMessage((int) 803L), + NotificationMessage_Encoding_DefaultBinary((int) 805L), + NotificationMessage_Encoding_DefaultJson((int) 15343L), + NotificationMessage_Encoding_DefaultXml((int) 804L), Number((int) 26L), NumericRange((int) 291L), + ObjectAttributes((int) 352L), + ObjectAttributes_Encoding_DefaultBinary((int) 354L), + ObjectAttributes_Encoding_DefaultJson((int) 15152L), + ObjectAttributes_Encoding_DefaultXml((int) 353L), + ObjectNode((int) 261L), + ObjectNode_Encoding_DefaultBinary((int) 263L), + ObjectNode_Encoding_DefaultJson((int) 15071L), + ObjectNode_Encoding_DefaultXml((int) 262L), ObjectsFolder((int) 85L), + ObjectTypeAttributes((int) 361L), + ObjectTypeAttributes_Encoding_DefaultBinary((int) 363L), + ObjectTypeAttributes_Encoding_DefaultJson((int) 15158L), + ObjectTypeAttributes_Encoding_DefaultXml((int) 362L), + ObjectTypeNode((int) 264L), + ObjectTypeNode_Encoding_DefaultBinary((int) 266L), + ObjectTypeNode_Encoding_DefaultJson((int) 15073L), + ObjectTypeNode_Encoding_DefaultXml((int) 265L), ObjectTypesFolder((int) 88L), OffNormalAlarmType((int) 10637L), OPCBinarySchema_TypeSystem((int) 93L), @@ -679,6 +1086,14 @@ public enum OpcuaNodeIdServices { OpcUa_XmlSchema((int) 8252L), OPCUANamespaceMetadata((int) 15957L), OpenFileMode((int) 11939L), + OpenSecureChannelRequest((int) 444L), + OpenSecureChannelRequest_Encoding_DefaultBinary((int) 446L), + OpenSecureChannelRequest_Encoding_DefaultJson((int) 15132L), + OpenSecureChannelRequest_Encoding_DefaultXml((int) 445L), + OpenSecureChannelResponse((int) 447L), + OpenSecureChannelResponse_Encoding_DefaultBinary((int) 449L), + OpenSecureChannelResponse_Encoding_DefaultJson((int) 15133L), + OpenSecureChannelResponse_Encoding_DefaultXml((int) 448L), OperationLimitsType((int) 11564L), OptionSet((int) 12755L), OptionSet_Encoding_DefaultBinary((int) 12765L), @@ -695,6 +1110,10 @@ public enum OpcuaNodeIdServices { OrientationType((int) 18779L), OutputArguments((int) 3073L), OverrideValueHandling((int) 15874L), + ParsingResult((int) 610L), + ParsingResult_Encoding_DefaultBinary((int) 612L), + ParsingResult_Encoding_DefaultJson((int) 15236L), + ParsingResult_Encoding_DefaultXml((int) 611L), PerformUpdateType((int) 11293L), PermissionType((int) 94L), ProcessConditionClassType((int) 11164L), @@ -736,6 +1155,14 @@ public enum OpcuaNodeIdServices { PublishedVariableDataType_Encoding_DefaultBinary((int) 14323L), PublishedVariableDataType_Encoding_DefaultJson((int) 15060L), PublishedVariableDataType_Encoding_DefaultXml((int) 14319L), + PublishRequest((int) 824L), + PublishRequest_Encoding_DefaultBinary((int) 826L), + PublishRequest_Encoding_DefaultJson((int) 15352L), + PublishRequest_Encoding_DefaultXml((int) 825L), + PublishResponse((int) 827L), + PublishResponse_Encoding_DefaultBinary((int) 829L), + PublishResponse_Encoding_DefaultJson((int) 15353L), + PublishResponse_Encoding_DefaultXml((int) 828L), PublishSubscribe((int) 14443L), PublishSubscribeType((int) 14416L), PubSubCommunicationFailureEventType((int) 15563L), @@ -768,6 +1195,30 @@ public enum OpcuaNodeIdServices { PubSubStatusType((int) 14643L), PubSubTransportLimitsExceedEventType((int) 15548L), QualifiedName((int) 20L), + QueryDataDescription((int) 570L), + QueryDataDescription_Encoding_DefaultBinary((int) 572L), + QueryDataDescription_Encoding_DefaultJson((int) 15200L), + QueryDataDescription_Encoding_DefaultXml((int) 571L), + QueryDataSet((int) 577L), + QueryDataSet_Encoding_DefaultBinary((int) 579L), + QueryDataSet_Encoding_DefaultJson((int) 15202L), + QueryDataSet_Encoding_DefaultXml((int) 578L), + QueryFirstRequest((int) 613L), + QueryFirstRequest_Encoding_DefaultBinary((int) 615L), + QueryFirstRequest_Encoding_DefaultJson((int) 15244L), + QueryFirstRequest_Encoding_DefaultXml((int) 614L), + QueryFirstResponse((int) 616L), + QueryFirstResponse_Encoding_DefaultBinary((int) 618L), + QueryFirstResponse_Encoding_DefaultJson((int) 15252L), + QueryFirstResponse_Encoding_DefaultXml((int) 617L), + QueryNextRequest((int) 619L), + QueryNextRequest_Encoding_DefaultBinary((int) 621L), + QueryNextRequest_Encoding_DefaultJson((int) 15254L), + QueryNextRequest_Encoding_DefaultXml((int) 620L), + QueryNextResponse((int) 622L), + QueryNextResponse_Encoding_DefaultBinary((int) 624L), + QueryNextResponse_Encoding_DefaultJson((int) 15255L), + QueryNextResponse_Encoding_DefaultXml((int) 623L), Range((int) 884L), Range_Encoding_DefaultBinary((int) 886L), Range_Encoding_DefaultJson((int) 15375L), @@ -777,6 +1228,14 @@ public enum OpcuaNodeIdServices { RationalNumber_Encoding_DefaultJson((int) 19064L), RationalNumber_Encoding_DefaultXml((int) 18851L), RationalNumberType((int) 17709L), + ReadAnnotationDataDetails((int) 23497L), + ReadAnnotationDataDetails_Encoding_DefaultBinary((int) 23500L), + ReadAnnotationDataDetails_Encoding_DefaultJson((int) 23512L), + ReadAnnotationDataDetails_Encoding_DefaultXml((int) 23506L), + ReadAtTimeDetails((int) 653L), + ReadAtTimeDetails_Encoding_DefaultBinary((int) 655L), + ReadAtTimeDetails_Encoding_DefaultJson((int) 15269L), + ReadAtTimeDetails_Encoding_DefaultXml((int) 654L), ReaderGroupDataType((int) 15520L), ReaderGroupDataType_Encoding_DefaultBinary((int) 21153L), ReaderGroupDataType_Encoding_DefaultJson((int) 21201L), @@ -792,12 +1251,52 @@ public enum OpcuaNodeIdServices { ReaderGroupTransportDataType_Encoding_DefaultXml((int) 15995L), ReaderGroupTransportType((int) 21090L), ReaderGroupType((int) 17999L), + ReadEventDetails((int) 644L), + ReadEventDetails_Encoding_DefaultBinary((int) 646L), + ReadEventDetails_Encoding_DefaultJson((int) 15262L), + ReadEventDetails_Encoding_DefaultXml((int) 645L), + ReadProcessedDetails((int) 650L), + ReadProcessedDetails_Encoding_DefaultBinary((int) 652L), + ReadProcessedDetails_Encoding_DefaultJson((int) 15264L), + ReadProcessedDetails_Encoding_DefaultXml((int) 651L), + ReadRawModifiedDetails((int) 647L), + ReadRawModifiedDetails_Encoding_DefaultBinary((int) 649L), + ReadRawModifiedDetails_Encoding_DefaultJson((int) 15263L), + ReadRawModifiedDetails_Encoding_DefaultXml((int) 648L), + ReadRequest((int) 629L), + ReadRequest_Encoding_DefaultBinary((int) 631L), + ReadRequest_Encoding_DefaultJson((int) 15257L), + ReadRequest_Encoding_DefaultXml((int) 630L), + ReadResponse((int) 632L), + ReadResponse_Encoding_DefaultBinary((int) 634L), + ReadResponse_Encoding_DefaultJson((int) 15258L), + ReadResponse_Encoding_DefaultXml((int) 633L), + ReadValueId((int) 626L), + ReadValueId_Encoding_DefaultBinary((int) 628L), + ReadValueId_Encoding_DefaultJson((int) 15256L), + ReadValueId_Encoding_DefaultXml((int) 627L), RedundancySupport((int) 851L), RedundantServerDataType((int) 853L), RedundantServerDataType_Encoding_DefaultBinary((int) 855L), RedundantServerDataType_Encoding_DefaultJson((int) 15362L), RedundantServerDataType_Encoding_DefaultXml((int) 854L), + ReferenceDescription((int) 518L), + ReferenceDescription_Encoding_DefaultBinary((int) 520L), + ReferenceDescription_Encoding_DefaultJson((int) 15182L), + ReferenceDescription_Encoding_DefaultXml((int) 519L), + ReferenceNode((int) 285L), + ReferenceNode_Encoding_DefaultBinary((int) 287L), + ReferenceNode_Encoding_DefaultJson((int) 15080L), + ReferenceNode_Encoding_DefaultXml((int) 286L), References((int) 31L), + ReferenceTypeAttributes((int) 367L), + ReferenceTypeAttributes_Encoding_DefaultBinary((int) 369L), + ReferenceTypeAttributes_Encoding_DefaultJson((int) 15160L), + ReferenceTypeAttributes_Encoding_DefaultXml((int) 368L), + ReferenceTypeNode((int) 273L), + ReferenceTypeNode_Encoding_DefaultBinary((int) 275L), + ReferenceTypeNode_Encoding_DefaultJson((int) 15076L), + ReferenceTypeNode_Encoding_DefaultXml((int) 274L), ReferenceTypesFolder((int) 91L), RefreshEndEventType((int) 2788L), RefreshRequiredEventType((int) 2789L), @@ -806,6 +1305,30 @@ public enum OpcuaNodeIdServices { RegisteredServer_Encoding_DefaultBinary((int) 434L), RegisteredServer_Encoding_DefaultJson((int) 15102L), RegisteredServer_Encoding_DefaultXml((int) 433L), + RegisterNodesRequest((int) 558L), + RegisterNodesRequest_Encoding_DefaultBinary((int) 560L), + RegisterNodesRequest_Encoding_DefaultJson((int) 15195L), + RegisterNodesRequest_Encoding_DefaultXml((int) 559L), + RegisterNodesResponse((int) 561L), + RegisterNodesResponse_Encoding_DefaultBinary((int) 563L), + RegisterNodesResponse_Encoding_DefaultJson((int) 15196L), + RegisterNodesResponse_Encoding_DefaultXml((int) 562L), + RegisterServer2Request((int) 12193L), + RegisterServer2Request_Encoding_DefaultBinary((int) 12211L), + RegisterServer2Request_Encoding_DefaultJson((int) 15107L), + RegisterServer2Request_Encoding_DefaultXml((int) 12199L), + RegisterServer2Response((int) 12194L), + RegisterServer2Response_Encoding_DefaultBinary((int) 12212L), + RegisterServer2Response_Encoding_DefaultJson((int) 15130L), + RegisterServer2Response_Encoding_DefaultXml((int) 12200L), + RegisterServerRequest((int) 435L), + RegisterServerRequest_Encoding_DefaultBinary((int) 437L), + RegisterServerRequest_Encoding_DefaultJson((int) 15103L), + RegisterServerRequest_Encoding_DefaultXml((int) 436L), + RegisterServerResponse((int) 438L), + RegisterServerResponse_Encoding_DefaultBinary((int) 440L), + RegisterServerResponse_Encoding_DefaultJson((int) 15104L), + RegisterServerResponse_Encoding_DefaultXml((int) 439L), RelativePath((int) 540L), RelativePath_Encoding_DefaultBinary((int) 542L), RelativePath_Encoding_DefaultJson((int) 15189L), @@ -814,7 +1337,23 @@ public enum OpcuaNodeIdServices { RelativePathElement_Encoding_DefaultBinary((int) 539L), RelativePathElement_Encoding_DefaultJson((int) 15188L), RelativePathElement_Encoding_DefaultXml((int) 538L), + RepublishRequest((int) 830L), + RepublishRequest_Encoding_DefaultBinary((int) 832L), + RepublishRequest_Encoding_DefaultJson((int) 15354L), + RepublishRequest_Encoding_DefaultXml((int) 831L), + RepublishResponse((int) 833L), + RepublishResponse_Encoding_DefaultBinary((int) 835L), + RepublishResponse_Encoding_DefaultJson((int) 15355L), + RepublishResponse_Encoding_DefaultXml((int) 834L), + RequestHeader((int) 389L), + RequestHeader_Encoding_DefaultBinary((int) 391L), + RequestHeader_Encoding_DefaultJson((int) 15088L), + RequestHeader_Encoding_DefaultXml((int) 390L), Resources((int) 24226L), + ResponseHeader((int) 392L), + ResponseHeader_Encoding_DefaultBinary((int) 394L), + ResponseHeader_Encoding_DefaultJson((int) 15089L), + ResponseHeader_Encoding_DefaultXml((int) 393L), RoleMappingRuleChangedAuditEventType((int) 17641L), RolePermissionType((int) 96L), RolePermissionType_Encoding_DefaultBinary((int) 128L), @@ -823,6 +1362,7 @@ public enum OpcuaNodeIdServices { RoleSetType((int) 15607L), RoleType((int) 15620L), RootFolder((int) 84L), + RsaEncryptedSecret((int) 17545L), RsaMinApplicationCertificateType((int) 12559L), RsaSha256ApplicationCertificateType((int) 12560L), SafetyConditionClassType((int) 17218L), @@ -873,6 +1413,10 @@ public enum OpcuaNodeIdServices { ServiceCounterDataType_Encoding_DefaultBinary((int) 873L), ServiceCounterDataType_Encoding_DefaultJson((int) 15370L), ServiceCounterDataType_Encoding_DefaultXml((int) 872L), + ServiceFault((int) 395L), + ServiceFault_Encoding_DefaultBinary((int) 397L), + ServiceFault_Encoding_DefaultJson((int) 15090L), + ServiceFault_Encoding_DefaultXml((int) 396L), SessionAuthenticationToken((int) 388L), SessionDiagnosticsArrayType((int) 2196L), SessionDiagnosticsDataType((int) 865L), @@ -881,6 +1425,14 @@ public enum OpcuaNodeIdServices { SessionDiagnosticsDataType_Encoding_DefaultXml((int) 866L), SessionDiagnosticsObjectType((int) 2029L), SessionDiagnosticsVariableType((int) 2197L), + SessionlessInvokeRequestType((int) 15901L), + SessionlessInvokeRequestType_Encoding_DefaultBinary((int) 15903L), + SessionlessInvokeRequestType_Encoding_DefaultJson((int) 15091L), + SessionlessInvokeRequestType_Encoding_DefaultXml((int) 15902L), + SessionlessInvokeResponseType((int) 20999L), + SessionlessInvokeResponseType_Encoding_DefaultBinary((int) 21001L), + SessionlessInvokeResponseType_Encoding_DefaultJson((int) 15092L), + SessionlessInvokeResponseType_Encoding_DefaultXml((int) 21000L), SessionsDiagnosticsSummaryType((int) 2026L), SessionSecurityDiagnosticsArrayType((int) 2243L), SessionSecurityDiagnosticsDataType((int) 868L), @@ -888,7 +1440,35 @@ public enum OpcuaNodeIdServices { SessionSecurityDiagnosticsDataType_Encoding_DefaultJson((int) 15369L), SessionSecurityDiagnosticsDataType_Encoding_DefaultXml((int) 869L), SessionSecurityDiagnosticsType((int) 2244L), + SetMonitoringModeRequest((int) 767L), + SetMonitoringModeRequest_Encoding_DefaultBinary((int) 769L), + SetMonitoringModeRequest_Encoding_DefaultJson((int) 15329L), + SetMonitoringModeRequest_Encoding_DefaultXml((int) 768L), + SetMonitoringModeResponse((int) 770L), + SetMonitoringModeResponse_Encoding_DefaultBinary((int) 772L), + SetMonitoringModeResponse_Encoding_DefaultJson((int) 15331L), + SetMonitoringModeResponse_Encoding_DefaultXml((int) 771L), + SetPublishingModeRequest((int) 797L), + SetPublishingModeRequest_Encoding_DefaultBinary((int) 799L), + SetPublishingModeRequest_Encoding_DefaultJson((int) 15341L), + SetPublishingModeRequest_Encoding_DefaultXml((int) 798L), + SetPublishingModeResponse((int) 800L), + SetPublishingModeResponse_Encoding_DefaultBinary((int) 802L), + SetPublishingModeResponse_Encoding_DefaultJson((int) 15342L), + SetPublishingModeResponse_Encoding_DefaultXml((int) 801L), + SetTriggeringRequest((int) 773L), + SetTriggeringRequest_Encoding_DefaultBinary((int) 775L), + SetTriggeringRequest_Encoding_DefaultJson((int) 15332L), + SetTriggeringRequest_Encoding_DefaultXml((int) 774L), + SetTriggeringResponse((int) 776L), + SetTriggeringResponse_Encoding_DefaultBinary((int) 778L), + SetTriggeringResponse_Encoding_DefaultJson((int) 15333L), + SetTriggeringResponse_Encoding_DefaultXml((int) 777L), ShelvedStateMachineType((int) 2929L), + SignatureData((int) 456L), + SignatureData_Encoding_DefaultBinary((int) 458L), + SignatureData_Encoding_DefaultJson((int) 15137L), + SignatureData_Encoding_DefaultXml((int) 457L), SignedSoftwareCertificate((int) 344L), SignedSoftwareCertificate_Encoding_DefaultBinary((int) 346L), SignedSoftwareCertificate_Encoding_DefaultJson((int) 15136L), @@ -905,6 +1485,10 @@ public enum OpcuaNodeIdServices { StateType((int) 2307L), StateVariableType((int) 2755L), StatisticalConditionClassType((int) 18665L), + StatusChangeNotification((int) 818L), + StatusChangeNotification_Encoding_DefaultBinary((int) 820L), + StatusChangeNotification_Encoding_DefaultJson((int) 15350L), + StatusChangeNotification_Encoding_DefaultXml((int) 819L), StatusCode((int) 19L), StatusResult((int) 299L), StatusResult_Encoding_DefaultBinary((int) 301L), @@ -936,6 +1520,10 @@ public enum OpcuaNodeIdServices { SubscribedDataSetMirrorDataType_Encoding_DefaultXml((int) 16012L), SubscribedDataSetMirrorType((int) 15127L), SubscribedDataSetType((int) 15108L), + SubscriptionAcknowledgement((int) 821L), + SubscriptionAcknowledgement_Encoding_DefaultBinary((int) 823L), + SubscriptionAcknowledgement_Encoding_DefaultJson((int) 15351L), + SubscriptionAcknowledgement_Encoding_DefaultXml((int) 822L), SubscriptionDiagnosticsArrayType((int) 2171L), SubscriptionDiagnosticsDataType((int) 874L), SubscriptionDiagnosticsDataType_Encoding_DefaultBinary((int) 876L), @@ -977,6 +1565,7 @@ public enum OpcuaNodeIdServices { ThreeDVector_Encoding_DefaultXml((int) 18853L), ThreeDVectorType((int) 17716L), Time((int) 292L), + TimestampsToReturn((int) 625L), TimeString((int) 12880L), TimeZoneDataType((int) 8912L), TimeZoneDataType_Encoding_DefaultBinary((int) 8917L), @@ -985,9 +1574,29 @@ public enum OpcuaNodeIdServices { Topics((int) 23488L), ToState((int) 52L), TrainingConditionClassType((int) 17220L), + TransferResult((int) 836L), + TransferResult_Encoding_DefaultBinary((int) 838L), + TransferResult_Encoding_DefaultJson((int) 15356L), + TransferResult_Encoding_DefaultXml((int) 837L), + TransferSubscriptionsRequest((int) 839L), + TransferSubscriptionsRequest_Encoding_DefaultBinary((int) 841L), + TransferSubscriptionsRequest_Encoding_DefaultJson((int) 15357L), + TransferSubscriptionsRequest_Encoding_DefaultXml((int) 840L), + TransferSubscriptionsResponse((int) 842L), + TransferSubscriptionsResponse_Encoding_DefaultBinary((int) 844L), + TransferSubscriptionsResponse_Encoding_DefaultJson((int) 15358L), + TransferSubscriptionsResponse_Encoding_DefaultXml((int) 843L), TransitionEventType((int) 2311L), TransitionType((int) 2310L), TransitionVariableType((int) 2762L), + TranslateBrowsePathsToNodeIdsRequest((int) 552L), + TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary((int) 554L), + TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultJson((int) 15193L), + TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml((int) 553L), + TranslateBrowsePathsToNodeIdsResponse((int) 555L), + TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary((int) 557L), + TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultJson((int) 15194L), + TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml((int) 556L), TransparentRedundancyType((int) 2036L), TripAlarmType((int) 10751L), TrustListDataType((int) 12554L), @@ -1004,6 +1613,10 @@ public enum OpcuaNodeIdServices { TsnTalkerStatus((int) 24222L), TwoStateDiscreteType((int) 2373L), TwoStateVariableType((int) 8995L), + TypeNode((int) 11880L), + TypeNode_Encoding_DefaultBinary((int) 11890L), + TypeNode_Encoding_DefaultJson((int) 15070L), + TypeNode_Encoding_DefaultXml((int) 11888L), TypesFolder((int) 86L), UABinaryFileDataType((int) 15006L), UABinaryFileDataType_Encoding_DefaultBinary((int) 15422L), @@ -1034,10 +1647,30 @@ public enum OpcuaNodeIdServices { Union_Encoding_DefaultBinary((int) 12766L), Union_Encoding_DefaultJson((int) 15085L), Union_Encoding_DefaultXml((int) 12758L), + UnregisterNodesRequest((int) 564L), + UnregisterNodesRequest_Encoding_DefaultBinary((int) 566L), + UnregisterNodesRequest_Encoding_DefaultJson((int) 15197L), + UnregisterNodesRequest_Encoding_DefaultXml((int) 565L), + UnregisterNodesResponse((int) 567L), + UnregisterNodesResponse_Encoding_DefaultBinary((int) 569L), + UnregisterNodesResponse_Encoding_DefaultJson((int) 15198L), + UnregisterNodesResponse_Encoding_DefaultXml((int) 568L), UnsignedRationalNumber((int) 24107L), UnsignedRationalNumber_Encoding_DefaultBinary((int) 24110L), UnsignedRationalNumber_Encoding_DefaultJson((int) 24134L), UnsignedRationalNumber_Encoding_DefaultXml((int) 24122L), + UpdateDataDetails((int) 680L), + UpdateDataDetails_Encoding_DefaultBinary((int) 682L), + UpdateDataDetails_Encoding_DefaultJson((int) 15280L), + UpdateDataDetails_Encoding_DefaultXml((int) 681L), + UpdateEventDetails((int) 683L), + UpdateEventDetails_Encoding_DefaultBinary((int) 685L), + UpdateEventDetails_Encoding_DefaultJson((int) 15282L), + UpdateEventDetails_Encoding_DefaultXml((int) 684L), + UpdateStructureDataDetails((int) 11295L), + UpdateStructureDataDetails_Encoding_DefaultBinary((int) 11300L), + UpdateStructureDataDetails_Encoding_DefaultJson((int) 15281L), + UpdateStructureDataDetails_Encoding_DefaultXml((int) 11296L), UriDictionaryEntryType((int) 17600L), UserCredentialCertificateType((int) 15181L), UserIdentityToken((int) 316L), @@ -1055,6 +1688,22 @@ public enum OpcuaNodeIdServices { UserTokenType((int) 303L), UtcTime((int) 294L), ValueAsText((int) 11433L), + VariableAttributes((int) 355L), + VariableAttributes_Encoding_DefaultBinary((int) 357L), + VariableAttributes_Encoding_DefaultJson((int) 15153L), + VariableAttributes_Encoding_DefaultXml((int) 356L), + VariableNode((int) 267L), + VariableNode_Encoding_DefaultBinary((int) 269L), + VariableNode_Encoding_DefaultJson((int) 15074L), + VariableNode_Encoding_DefaultXml((int) 268L), + VariableTypeAttributes((int) 364L), + VariableTypeAttributes_Encoding_DefaultBinary((int) 366L), + VariableTypeAttributes_Encoding_DefaultJson((int) 15159L), + VariableTypeAttributes_Encoding_DefaultXml((int) 365L), + VariableTypeNode((int) 270L), + VariableTypeNode_Encoding_DefaultBinary((int) 272L), + VariableTypeNode_Encoding_DefaultJson((int) 15075L), + VariableTypeNode_Encoding_DefaultXml((int) 271L), VariableTypesFolder((int) 89L), Vector((int) 18807L), Vector_Encoding_DefaultBinary((int) 18816L), @@ -1063,6 +1712,18 @@ public enum OpcuaNodeIdServices { VectorType((int) 17714L), VendorServerInfoType((int) 2033L), VersionTime((int) 20998L), + ViewAttributes((int) 373L), + ViewAttributes_Encoding_DefaultBinary((int) 375L), + ViewAttributes_Encoding_DefaultJson((int) 15162L), + ViewAttributes_Encoding_DefaultXml((int) 374L), + ViewDescription((int) 511L), + ViewDescription_Encoding_DefaultBinary((int) 513L), + ViewDescription_Encoding_DefaultJson((int) 15179L), + ViewDescription_Encoding_DefaultXml((int) 512L), + ViewNode((int) 279L), + ViewNode_Encoding_DefaultBinary((int) 281L), + ViewNode_Encoding_DefaultJson((int) 15078L), + ViewNode_Encoding_DefaultXml((int) 280L), ViewsFolder((int) 87L), ViewVersion((int) 12170L), WellKnownRole_Anonymous((int) 15644L), @@ -1073,6 +1734,14 @@ public enum OpcuaNodeIdServices { WellKnownRole_Operator((int) 15680L), WellKnownRole_SecurityAdmin((int) 15704L), WellKnownRole_Supervisor((int) 15692L), + WriteRequest((int) 671L), + WriteRequest_Encoding_DefaultBinary((int) 673L), + WriteRequest_Encoding_DefaultJson((int) 15277L), + WriteRequest_Encoding_DefaultXml((int) 672L), + WriteResponse((int) 674L), + WriteResponse_Encoding_DefaultBinary((int) 676L), + WriteResponse_Encoding_DefaultJson((int) 15278L), + WriteResponse_Encoding_DefaultXml((int) 675L), WriterGroupDataType((int) 15480L), WriterGroupDataType_Encoding_DefaultBinary((int) 21150L), WriterGroupDataType_Encoding_DefaultJson((int) 21198L), @@ -1088,6 +1757,10 @@ public enum OpcuaNodeIdServices { WriterGroupTransportDataType_Encoding_DefaultXml((int) 15990L), WriterGroupTransportType((int) 17997L), WriterGroupType((int) 17725L), + WriteValue((int) 668L), + WriteValue_Encoding_DefaultBinary((int) 670L), + WriteValue_Encoding_DefaultJson((int) 15276L), + WriteValue_Encoding_DefaultXml((int) 669L), X509IdentityToken((int) 325L), X509IdentityToken_Encoding_DefaultBinary((int) 327L), X509IdentityToken_Encoding_DefaultJson((int) 15143L), 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 10cbe9dec14..bb12ee521a1 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 @@ -121,6 +121,7 @@ protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() { return new PlcValueHandler(); } + @Override protected boolean awaitDisconnectComplete() { return true; } diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java index 32bcf40694a..e1f6ca47180 100644 --- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java +++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java @@ -85,7 +85,7 @@ public class SecureChannel { "(?[\\w.-]+)(:" + "(?\\d*))?"); - public static final Pattern URI_PATTERN = Pattern.compile("^(?opc)" + + public static final Pattern URI_PATTERN = Pattern.compile("^(?opc|https)" + INET_ADDRESS_PATTERN + "(?[\\w/=]*)[\\?]?" ); @@ -580,7 +580,7 @@ private void onConnectActivateSessionRequest(ConversationContext conte } public void onDisconnect(ConversationContext context) { - LOGGER.info("Disconnecting"); + LOGGER.debug("Disconnecting"); int requestHandle = getRequestHandle(); if (keepAlive != null) { @@ -879,7 +879,7 @@ public void onDiscoverGetEndpointsRequest(ConversationContext context, for (ExtensionObjectDefinition endpoint : endpoints) { EndpointDescription endpointDescription = (EndpointDescription) endpoint; if (endpointDescription.getEndpointUrl().getStringValue().equals(this.endpoint.getStringValue()) && endpointDescription.getSecurityPolicyUri().getStringValue().equals(this.securityPolicy)) { - LOGGER.info("Found OPC UA endpoint {}", this.endpoint.getStringValue()); + LOGGER.debug("Found OPC UA endpoint {}", this.endpoint.getStringValue()); this.configuration.setSenderCertificate(endpointDescription.getServerCertificate().getStringValue()); } } diff --git a/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java b/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java index 6d856ea4487..07c90775b62 100644 --- a/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java +++ b/plc4j/drivers/plc4x/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java @@ -158,6 +158,24 @@ public static PlcValue staticParse(ReadBuffer readBuffer, Plc4xValueType valueTy String value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16")); + return new PlcSTRING(value); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString( + readBuffer, "UTF-8")); + + return new PlcSTRING(value); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString( + readBuffer, "UTF-16")); + return new PlcSTRING(value); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME @@ -325,6 +343,14 @@ public static void staticSerialize( /*TODO: migrate me*/ /*TODO: migrate me*/ writeBuffer.writeString( "", 16, (String) (value), WithOption.WithEncoding("UTF-16")); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + // Manual Field (value) + org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString( + writeBuffer, _value, "UTF-8"); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + // Manual Field (value) + org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString( + writeBuffer, _value, "UTF-16"); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME // Simple Field (milliseconds) long milliseconds = (long) _value.getLong(); @@ -436,6 +462,12 @@ public static int getLengthInBits(PlcValue _value, Plc4xValueType valueType) { } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WCHAR)) { // STRING // Simple Field (value) sizeInBits += 16; + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + // Manual Field (value) + sizeInBits += (((STR_LEN(_value)) + (1))) * (8); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + // Manual Field (value) + sizeInBits += (((STR_LEN(_value)) + (1))) * (16); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME // Simple Field (milliseconds) sizeInBits += 32; diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java index 4d8cf54c98f..77f5edee4fe 100644 --- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/protocol/Plc4xProtocolLogic.java @@ -20,6 +20,7 @@ import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.api.value.PlcValue; import org.apache.plc4x.java.plc4x.config.Plc4xConfiguration; import org.apache.plc4x.java.plc4x.tag.Plc4xTag; @@ -96,7 +97,7 @@ public CompletableFuture read(PlcReadRequest apiReadRequest) { final Plc4xTag plc4xTag = (Plc4xTag) apiReadRequest.getTag(tagName); Plc4xTagRequest plc4XTagRequest = new Plc4xTagRequest( - new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() + ":" + plc4xTag.getPlcValueType().name())); + new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString())); plc4xTags.add(plc4XTagRequest); } final int requestId = txIdGenerator.getAndIncrement(); @@ -104,7 +105,7 @@ public CompletableFuture read(PlcReadRequest apiReadRequest) { // Send the request and await a response. RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); - context.sendRequest(plc4xReadRequest) + transaction.submit(() -> context.sendRequest(plc4xReadRequest) .expectResponse(Plc4xMessage.class, requestTimeout) .onTimeout(future::completeExceptionally) .check(plc4xMessage -> plc4xMessage.getRequestId() == requestId) @@ -125,7 +126,7 @@ public CompletableFuture read(PlcReadRequest apiReadRequest) { // Finish the request-transaction. transaction.endRequest(); - }); + })); return future; } @@ -140,7 +141,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { final Plc4xValueType plc4xValueType = Plc4xValueType.valueOf(plc4xTag.getPlcValueType().name()); final PlcValue plcValue = writeRequest.getPlcValue(tagName); Plc4xTagValueRequest tagRequest = new Plc4xTagValueRequest( - new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() + ":" + plc4xTag.getPlcValueType().name()), plc4xValueType, plcValue); + new org.apache.plc4x.java.plc4x.readwrite.Plc4xTag(tagName, plc4xTag.getAddressString() ), plc4xValueType, plcValue); tags.add(tagRequest); } final int requestId = txIdGenerator.getAndIncrement(); @@ -148,7 +149,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { // Send the request and await a response. RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); - context.sendRequest(write) + transaction.submit(() ->context.sendRequest(write) .expectResponse(Plc4xMessage.class, requestTimeout) .onTimeout(future::completeExceptionally) .check(p -> p.getRequestId() == requestId) @@ -168,7 +169,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { // Finish the request-transaction. transaction.endRequest(); - }); + })); return future; } diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java new file mode 100644 index 00000000000..69be217621d --- /dev/null +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java @@ -0,0 +1,94 @@ +/* + * 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.plc4x.readwrite.utils; + +import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; + +import java.nio.charset.StandardCharsets; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class StaticHelper { + + public static String parseString(ReadBuffer io, String encoding) { + try { + if ("UTF-8".equalsIgnoreCase(encoding)) { + // This is the maximum number of bytes a string can be long. + short stringLength = io.readUnsignedShort(8); + // This is the total length of the string on the PLC (Not necessarily the number of characters read) + final byte[] byteArray = new byte[stringLength]; + for (int i = 0; (i < stringLength) && io.hasMore(8); i++) { + final byte curByte = io.readByte(); + byteArray[i] = curByte; + } + return new String(byteArray, StandardCharsets.UTF_8); + } else if ("UTF-16".equalsIgnoreCase(encoding)) { + // This is the maximum number of bytes a string can be long. + int stringLength = io.readUnsignedInt(16); + final byte[] byteArray = new byte[stringLength * 2]; + for (int i = 0; (i < stringLength) && io.hasMore(16); i++) { + final short curShort = io.readShort(16); + byteArray[i * 2] = (byte) (curShort >>> 8); + byteArray[(i * 2) + 1] = (byte) (curShort & 0xFF); + } + return new String(byteArray, StandardCharsets.UTF_16); + } else { + throw new PlcRuntimeException("Unsupported string encoding " + encoding); + } + } catch (ParseException e) { + throw new PlcRuntimeException("Error parsing string", e); + } + } + public static void serializeString(WriteBuffer io, PlcValue value, String encoding) { + String valueString = value.getString(); + valueString = valueString == null ? "" : valueString; + + if ("UTF-8".equalsIgnoreCase(encoding)) { + final byte[] raw = valueString.getBytes(StandardCharsets.UTF_8); + try { + io.writeByte((byte) raw.length); + for (byte b : raw) { + io.writeByte(b); + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else if ("UTF-16".equalsIgnoreCase(encoding)) { + final byte[] raw = valueString.getBytes(StandardCharsets.UTF_16); + try { + io.writeUnsignedInt(16, raw.length); + for (int i = 0; i < raw.length; i++) { + io.writeByte( raw[i]); + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + throw new PlcRuntimeException("Unsupported string encoding " + encoding); + } + + } +} diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java index 83ac0fe9fbb..fabb55fc134 100644 --- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4XTagHandler.java @@ -28,12 +28,7 @@ public class Plc4XTagHandler implements PlcTagHandler { @Override public PlcTag parseTag(String tagAddress) { - if(!tagAddress.contains(":")) { - throw new PlcInvalidTagException(tagAddress); - } - String address = tagAddress.substring(0, tagAddress.lastIndexOf(":")); - String dataType = tagAddress.substring(tagAddress.lastIndexOf(":") + 1); - return new Plc4xTag(address, PlcValueType.valueOf(dataType)); + return new Plc4xTag(tagAddress); } @Override diff --git a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java index c3d5aa7fdd5..a85e2fd0d6f 100644 --- a/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java +++ b/plc4j/drivers/plc4x/src/main/java/org/apache/plc4x/java/plc4x/tag/Plc4xTag.java @@ -32,11 +32,10 @@ public class Plc4xTag implements PlcTag, Serializable { private final String address; - private final PlcValueType valueType; + private PlcValueType valueType = PlcValueType.NULL; - public Plc4xTag(String address, PlcValueType valueType) { + public Plc4xTag(String address) { this.address = address; - this.valueType = valueType; } @Override @@ -48,7 +47,13 @@ public String getAddressString() { public PlcValueType getPlcValueType() { return valueType; } - + @Override + public void setPlcValueType(PlcValueType plcValueType) { + this.valueType = plcValueType; + } + public void setValueType(PlcValueType valueType) { + this.valueType = valueType; + } @Override public List getArrayInfo() { return PlcTag.super.getArrayInfo(); diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml index c0b47ba33a8..995ee913d0f 100644 --- a/plc4j/drivers/pom.xml +++ b/plc4j/drivers/pom.xml @@ -53,4 +53,19 @@ simulated + + + + org.apache.felix + maven-bundle-plugin + + + + * + + + + + + diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java index 7c5fb803efa..2db355b2dbd 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java @@ -24,7 +24,6 @@ import java.time.*; import java.util.*; import org.apache.plc4x.java.api.value.*; -import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.generation.ByteOrder; import org.apache.plc4x.java.spi.generation.EvaluationHelper; import org.apache.plc4x.java.spi.generation.ParseException; @@ -42,7 +41,8 @@ public class DataItem { private static final Logger LOGGER = LoggerFactory.getLogger(DataItem.class); public static PlcValue staticParse( - ReadBuffer readBuffer, String dataProtocolId, Integer stringLength) throws ParseException { + ReadBuffer readBuffer, String dataProtocolId, Integer stringLength, String stringEncoding) + throws ParseException { if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL // Reserved Field (Compartmentalized so the "reserved" variable can't leak) @@ -147,16 +147,20 @@ public static PlcValue staticParse( return new PlcLREAL(value); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR - // Simple Field (value) - String value = /*TODO: migrate me*/ /*TODO: migrate me*/ - readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8")); + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7Char( + readBuffer, "UTF-8", stringEncoding)); return new PlcCHAR(value); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR - // Simple Field (value) - String value = /*TODO: migrate me*/ /*TODO: migrate me*/ - readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16")); + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7Char( + readBuffer, "UTF-16", stringEncoding)); return new PlcCHAR(value); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING @@ -165,7 +169,7 @@ public static PlcValue staticParse( String value = (String) (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String( - readBuffer, stringLength, "UTF-8")); + readBuffer, stringLength, "UTF-8", stringEncoding)); return new PlcSTRING(value); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING @@ -174,7 +178,7 @@ public static PlcValue staticParse( String value = (String) (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String( - readBuffer, stringLength, "UTF-16")); + readBuffer, stringLength, "UTF-16", stringEncoding)); return new PlcSTRING(value); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME @@ -253,9 +257,14 @@ public static PlcValue staticParse( } public static void staticSerialize( - WriteBuffer writeBuffer, PlcValue _value, String dataProtocolId, Integer stringLength) + WriteBuffer writeBuffer, + PlcValue _value, + String dataProtocolId, + Integer stringLength, + String stringEncoding) throws SerializationException { - staticSerialize(writeBuffer, _value, dataProtocolId, stringLength, ByteOrder.BIG_ENDIAN); + staticSerialize( + writeBuffer, _value, dataProtocolId, stringLength, stringEncoding, ByteOrder.BIG_ENDIAN); } public static void staticSerialize( @@ -263,6 +272,7 @@ public static void staticSerialize( PlcValue _value, String dataProtocolId, Integer stringLength, + String stringEncoding, ByteOrder byteOrder) throws SerializationException { if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL @@ -345,25 +355,21 @@ public static void staticSerialize( /*TODO: migrate me*/ /*TODO: migrate me*/ writeBuffer.writeDouble("", 64, (value)); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR - // Simple Field (value) - String value = (String) _value.getString(); - /*TODO: migrate me*/ - /*TODO: migrate me*/ writeBuffer.writeString( - "", 8, (String) (value), WithOption.WithEncoding("UTF-8")); + // Manual Field (value) + org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7Char( + writeBuffer, _value, "UTF-8", stringEncoding); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR - // Simple Field (value) - String value = (String) _value.getString(); - /*TODO: migrate me*/ - /*TODO: migrate me*/ writeBuffer.writeString( - "", 16, (String) (value), WithOption.WithEncoding("UTF-16")); + // Manual Field (value) + org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7Char( + writeBuffer, _value, "UTF-16", stringEncoding); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING // Manual Field (value) org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String( - writeBuffer, _value, stringLength, "UTF-8"); + writeBuffer, _value, stringLength, "UTF-8", stringEncoding); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING // Manual Field (value) org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String( - writeBuffer, _value, stringLength, "UTF-16"); + writeBuffer, _value, stringLength, "UTF-16", stringEncoding); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME // Simple Field (milliseconds) long milliseconds = (long) _value.getLong(); @@ -431,11 +437,15 @@ public static void staticSerialize( } } - public static int getLengthInBytes(PlcValue _value, String dataProtocolId, Integer stringLength) { - return (int) Math.ceil((float) getLengthInBits(_value, dataProtocolId, stringLength) / 8.0); + public static int getLengthInBytes( + PlcValue _value, String dataProtocolId, Integer stringLength, String stringEncoding) { + return (int) + Math.ceil( + (float) getLengthInBits(_value, dataProtocolId, stringLength, stringEncoding) / 8.0); } - public static int getLengthInBits(PlcValue _value, String dataProtocolId, Integer stringLength) { + public static int getLengthInBits( + PlcValue _value, String dataProtocolId, Integer stringLength, String stringEncoding) { int sizeInBits = 0; if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL // Reserved Field @@ -485,17 +495,17 @@ public static int getLengthInBits(PlcValue _value, String dataProtocolId, Intege // Simple Field (value) sizeInBits += 64; } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR - // Simple Field (value) + // Manual Field (value) sizeInBits += 8; } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR - // Simple Field (value) + // Manual Field (value) sizeInBits += 16; } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING // Manual Field (value) - sizeInBits += (STR_LEN(_value)) + (2); + sizeInBits += (((stringLength) + (2))) * (8); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING // Manual Field (value) - sizeInBits += (((STR_LEN(_value)) * (2))) + (2); + sizeInBits += (((stringLength) + (2))) * (16); } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME // Simple Field (milliseconds) sizeInBits += 32; diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java index c83a8af4c66..17e1c818e96 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java @@ -107,7 +107,7 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readCountArrayField( "items", new DataReaderComplexDefault<>( - () -> S7VarPayloadDataItem.staticParse(readBuffer, (boolean) (true)), readBuffer), + () -> S7VarPayloadDataItem.staticParse(readBuffer), readBuffer), CAST(parameter, S7ParameterReadVarResponse.class).getNumItems()); readBuffer.closeContext("S7PayloadReadVarResponse"); diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java index f08cb90ecd2..83341541589 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java @@ -42,19 +42,12 @@ public class S7VarPayloadDataItem implements Message { protected final DataTransportSize transportSize; protected final byte[] data; - // Arguments. - protected final Boolean hasNext; - public S7VarPayloadDataItem( - DataTransportErrorCode returnCode, - DataTransportSize transportSize, - byte[] data, - Boolean hasNext) { + DataTransportErrorCode returnCode, DataTransportSize transportSize, byte[] data) { super(); this.returnCode = returnCode; this.transportSize = transportSize; this.data = data; - this.hasNext = hasNext; } public DataTransportErrorCode getReturnCode() { @@ -109,10 +102,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Padding Field (padding) writePaddingField( - "padding", - (int) (((PADCOUNT(data, hasNext)) % (2))), - (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + "padding", (int) (((COUNT(data)) % (2))), (short) 0x00, writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7VarPayloadDataItem"); } @@ -142,7 +132,7 @@ public int getLengthInBits() { } // Padding Field (padding) - int _timesPadding = (int) (((PADCOUNT(data, hasNext)) % (2))); + int _timesPadding = (int) (((COUNT(data)) % (2))); while (_timesPadding-- > 0) { lengthInBits += 8; } @@ -153,25 +143,10 @@ public int getLengthInBits() { public static S7VarPayloadDataItem 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); - } - Boolean hasNext; - if (args[0] instanceof Boolean) { - hasNext = (Boolean) args[0]; - } else if (args[0] instanceof String) { - hasNext = Boolean.valueOf((String) args[0]); - } else { - throw new PlcRuntimeException( - "Argument 0 expected to be of type Boolean or a string which is parseable but was " - + args[0].getClass().getName()); - } - return staticParse(readBuffer, hasNext); + return staticParse(readBuffer); } - public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Boolean hasNext) - throws ParseException { + public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws ParseException { readBuffer.pullContext("S7VarPayloadDataItem"); PositionAware positionAware = readBuffer; int startPos = positionAware.getPos(); @@ -199,12 +174,12 @@ public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer, Boolean ha Math.toIntExact( ((transportSize.getSizeInBits()) ? CEIL((dataLength) / (8.0)) : dataLength))); - readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((PADCOUNT(data, hasNext)) % (2)))); + readPaddingField(readUnsignedShort(readBuffer, 8), (int) (((COUNT(data)) % (2)))); readBuffer.closeContext("S7VarPayloadDataItem"); // Create the instance S7VarPayloadDataItem _s7VarPayloadDataItem; - _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data, hasNext); + _s7VarPayloadDataItem = new S7VarPayloadDataItem(returnCode, transportSize, data); return _s7VarPayloadDataItem; } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java index 28940ae38e4..a6ea4032f0a 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java @@ -179,9 +179,9 @@ public enum TransportSize { (boolean) false, (short) 'X', (boolean) true, - null, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_LINT", - TransportSize.INT), + null), ULINT( (short) 0x0D, (boolean) false, @@ -192,9 +192,9 @@ public enum TransportSize { (boolean) false, (short) 'X', (boolean) true, - null, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_ULINT", - TransportSize.INT), + null), REAL( (short) 0x0E, (boolean) true, @@ -205,7 +205,7 @@ public enum TransportSize { (boolean) true, (short) 'D', (boolean) true, - DataTransportSize.REAL, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_REAL", null), LREAL( @@ -218,7 +218,7 @@ public enum TransportSize { (boolean) true, (short) 'X', (boolean) true, - null, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_LREAL", TransportSize.REAL), CHAR( @@ -244,7 +244,7 @@ public enum TransportSize { (boolean) true, (short) 'X', (boolean) true, - null, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_WCHAR", null), STRING( @@ -270,7 +270,7 @@ public enum TransportSize { (boolean) true, (short) 'X', (boolean) true, - null, + DataTransportSize.BYTE_WORD_DWORD, (String) "IEC61131_WSTRING", null), TIME( @@ -281,7 +281,7 @@ public enum TransportSize { (short) 4, (boolean) true, (boolean) true, - (short) 'D', + (short) 'X', (boolean) true, null, (String) "IEC61131_TIME", 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 55c50bd0d69..ae7553812bb 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 @@ -25,19 +25,25 @@ import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration; public class S7Configuration implements Configuration, TcpTransportConfiguration { + @ConfigurationParameter("local-group") + @IntDefaultValue(3) + public int localGroup = 3; @ConfigurationParameter("local-rack") @IntDefaultValue(1) public int localRack = 1; - @ConfigurationParameter("local-slot") - @IntDefaultValue(1) - public int localSlot = 1; - @ConfigurationParameter("local-tsap") @IntDefaultValue(0) public int localTsap = 0; + @ConfigurationParameter("local-slot") + @IntDefaultValue(1) + public int localSlot = 1; + + @ConfigurationParameter("remote-group") + @IntDefaultValue(1) + public int remoteGroup = 1; @ConfigurationParameter("remote-rack") @IntDefaultValue(0) public int remoteRack = 0; @@ -65,6 +71,31 @@ public class S7Configuration implements Configuration, TcpTransportConfiguration @ConfigurationParameter("controller-type") public String controllerType; + @ConfigurationParameter("timeout-request") + @IntDefaultValue(4000) + protected int timeoutRequest; + public int getLocalGroup() { + return localGroup; + } + + public void setLocalGroup(int localGroup) { + this.localGroup = localGroup; + } + public int getLocalTsap() { + return localTsap; + } + + public void setLocalTsap(int localTsap) { + this.localTsap = localTsap; + } + public int getRemoteGroup() { + return remoteGroup; + } + + public void setRemoteGroup(int remoteGroup) { + this.remoteGroup = remoteGroup; + } + public int getLocalRack() { return localRack; } @@ -81,14 +112,6 @@ public void setLocalSlot(int localSlot) { this.localSlot = localSlot; } - public int getLocalTsap() { - return localTsap; - } - - public void setLocalTsap(int localTsap) { - this.localTsap = localTsap; - } - public int getRemoteRack() { return remoteRack; } @@ -104,7 +127,6 @@ public int getRemoteSlot() { public void setRemoteSlot(int remoteSlot) { this.remoteSlot = remoteSlot; } - public int getRemoteTsap() { return remoteTsap; } @@ -112,7 +134,6 @@ public int getRemoteTsap() { public void setRemoteTsap(int remoteTsap) { this.remoteTsap = remoteTsap; } - public int getPduSize() { return pduSize; } @@ -145,6 +166,12 @@ public void setControllerType(String controllerType) { this.controllerType = controllerType; } + public int getTimeoutRequest() { + return timeoutRequest; + } + public void setTimeoutRequest(int timeoutRequest) { + this.timeoutRequest = timeoutRequest; + } /** * Per default port for the S7 protocol is 102. * @return 102 @@ -158,15 +185,18 @@ public int getDefaultPort() { public String toString() { return "Configuration{" + "local-rack=" + localRack + + ", local-group=" + localGroup + ", local-slot=" + localSlot + ", local-tsap=" + localTsap + + ", remote-group=" + remoteGroup + ", remote-rack=" + remoteRack + ", remote-slot=" + remoteSlot + ", remote-tsap=" + remoteTsap + ", pduSize=" + pduSize + ", maxAmqCaller=" + maxAmqCaller + ", maxAmqCallee=" + maxAmqCallee + - ", controllerType='" + controllerType + '\'' + + ", controllerType='" + controllerType + + ", timeoutRequest='" + timeoutRequest + '\'' + '}'; } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java index 7b40d9b3d18..25edebf8115 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java @@ -39,9 +39,9 @@ public class S7DriverContext implements DriverContext, HasConfiguration 0) { diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java index ce987e1090f..8e4a51347ad 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java @@ -48,11 +48,11 @@ public class DefaultS7MessageProcessor implements S7MessageProcessor { public static final int EMPTY_READ_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterReadVarRequest( Collections.emptyList()), null).getLengthInBytes(); public static final int EMPTY_READ_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterReadVarResponse( - (short) 0), new S7PayloadReadVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes(); + (short) 0), new S7PayloadReadVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes(); public static final int EMPTY_WRITE_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterWriteVarRequest( - Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList(), null)).getLengthInBytes(); + Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList())).getLengthInBytes(); public static final int EMPTY_WRITE_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterWriteVarResponse( - (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes(); + (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes(); public DefaultS7MessageProcessor(AtomicInteger tpduGenerator) { this.tpduRefGen = tpduGenerator; diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java index 85c6d9d4f3f..f5767654cf5 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java @@ -24,6 +24,7 @@ import org.apache.plc4x.java.api.value.PlcValue; import org.apache.plc4x.java.s7.readwrite.*; import org.apache.plc4x.java.s7.readwrite.context.S7DriverContext; +import org.apache.plc4x.java.s7.readwrite.tag.S7StringTag; import org.apache.plc4x.java.s7.readwrite.tag.S7Tag; import org.apache.plc4x.java.s7.readwrite.MemoryArea; import org.apache.plc4x.java.s7.readwrite.TransportSize; @@ -65,7 +66,12 @@ protected List processReadRequest(PlcReadRequest readRequest, Driver S7Tag tag = (S7Tag) readRequest.getTag(tagName); int readRequestItemSize = S7_ADDRESS_ANY_SIZE; - int readResponseItemSize = 4 + (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes()); + int length = 1; + if(tag instanceof S7StringTag) + { + length = (((S7StringTag)tag).getStringLength() +2) * 8; + } + int readResponseItemSize = 4 + (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes() * length); // If it's an odd number of bytes, add one to make it even if (readResponseItemSize % 2 == 1) { readResponseItemSize++; @@ -83,8 +89,10 @@ protected List processReadRequest(PlcReadRequest readRequest, Driver // If they would exceed, start a new request. else { // Create a new PlcReadRequest containing the current tag item. - processedRequests.add(new DefaultPlcReadRequest( - ((DefaultPlcReadRequest) readRequest).getReader(), curTags)); + if(!curTags.isEmpty()) { + processedRequests.add(new DefaultPlcReadRequest( + ((DefaultPlcReadRequest) readRequest).getReader(), curTags)); + } // Reset the size and item lists. curRequestSize = EMPTY_READ_REQUEST_SIZE + readRequestItemSize; @@ -130,7 +138,12 @@ protected List processWriteRequest(PlcWriteRequest writeRequest, Dri if (tag.getDataType() == TransportSize.BOOL) { writeRequestItemSize += Math.ceil((double) tag.getNumberOfElements() / 8); } else { - writeRequestItemSize += (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes()); + int length = 1; + if(tag instanceof S7StringTag) + { + length = (((S7StringTag)tag).getStringLength() + 2) * 8; + } + writeRequestItemSize += (tag.getNumberOfElements() * tag.getDataType().getSizeInBytes() * length); } // If it's an odd number of bytes, add one to make it even if (writeRequestItemSize % 2 == 1) { @@ -150,8 +163,10 @@ protected List processWriteRequest(PlcWriteRequest writeRequest, Dri // If adding them would exceed, start a new request. else { // Create a new PlcWriteRequest containing the current tag item. - processedRequests.add(new DefaultPlcWriteRequest( - ((DefaultPlcWriteRequest) writeRequest).getWriter(), curTags)); + if(!curTags.isEmpty()) { + processedRequests.add(new DefaultPlcWriteRequest( + ((DefaultPlcWriteRequest) writeRequest).getWriter(), curTags)); + } // Reset the size and item lists. curRequestSize = EMPTY_WRITE_REQUEST_SIZE + writeRequestItemSize; diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java index a46b496bdba..04828519a30 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java @@ -73,7 +73,7 @@ public S7ProtocolEventLogic(BlockingQueue eventqueue) { public void start() { processor.start(); - dispacher.start(); + dispacher.start(); } public void stop(){ @@ -154,7 +154,7 @@ public void run() { Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex); } } - System.out.println("ObjectProcessor Bye!"); + logger.debug("ObjectProcessor Bye!"); } public void doShutdown(){ @@ -203,7 +203,7 @@ public void run() { Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex); } } - System.out.println("EventDispacher Bye!"); + logger.debug("EventDispacher Bye!"); } public void doShutdown(){ diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java index 5cda8f50180..b8b3a47e358 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java @@ -19,6 +19,7 @@ package org.apache.plc4x.java.s7.readwrite.protocol; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.s7.readwrite.configuration.S7Configuration; import org.apache.plc4x.java.s7.readwrite.utils.S7PlcSubscriptionHandle; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -30,6 +31,7 @@ import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.messages.PlcWriteResponse; import org.apache.plc4x.java.api.types.PlcResponseCode; +import org.apache.plc4x.java.spi.configuration.HasConfiguration; import org.apache.plc4x.java.spi.generation.*; import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionTag; import org.apache.plc4x.java.spi.values.PlcNull; @@ -58,15 +60,11 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.IntStream; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import org.apache.commons.lang3.tuple.MutablePair; import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse; @@ -83,22 +81,12 @@ * So we need to limit those. * Thus, each request goes to a Work Queue and this Queue ensures, that only 3 are open at the same time. */ -public class S7ProtocolLogic extends Plc4xProtocolBase { - - public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000); +public class S7ProtocolLogic extends Plc4xProtocolBase implements HasConfiguration { private final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class); - private final AtomicInteger tpduGenerator = new AtomicInteger(10); - - /* - * Task group for managing connection redundancy. - */ - private ExecutorService clientExecutorService = Executors.newFixedThreadPool(4, new BasicThreadFactory.Builder() - .namingPattern("plc4x-app-thread-%d") - .daemon(true) - .priority(Thread.MAX_PRIORITY) - .build()); - + private final AtomicInteger tpduGenerator = new AtomicInteger(1); + + private S7Configuration configuration; /* * Take into account that the size of this buffer depends on the final device. * S7-300 goes from 20 to 300 and for S7-400 it goes from 300 to 10000. @@ -114,17 +102,6 @@ public class S7ProtocolLogic extends Plc4xProtocolBase { private final S7PlcSubscriptionHandle usrHandle = new S7PlcSubscriptionHandle(EventType.USR, EventLogic); private final S7PlcSubscriptionHandle almHandle = new S7PlcSubscriptionHandle(EventType.ALM, EventLogic); - /* - * For the reconnection functionality by a "TimeOut" of the connection, - * you must keep track of open transactions. In general, an S7 device - * supports a couple of simultaneous requests. - * The rhythm of execution must be determined by the TransactionManager. - * So far it is the way to indicate to the user that he must redo - * his request. - */ - private HashMap> active_requests = new HashMap<>(); - - private S7DriverContext s7DriverContext; private RequestTransactionManager tm; @@ -141,7 +118,10 @@ public void setDriverContext(DriverContext driverContext) { this.tm = new RequestTransactionManager(1); EventLogic.start(); } - + @Override + public void setConfiguration(S7Configuration configuration) { + this.configuration = configuration; + } @Override public void onConnect(ConversationContext context) { if (context.isPassive()) { @@ -164,7 +144,7 @@ public void onConnect(ConversationContext context) { logger.warn("Timeout during Connection establishing, closing channel..."); context.getChannel().close(); }) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .check(p -> p.getPayload() instanceof COTPPacketConnectionResponse) .unwrap(p -> (COTPPacketConnectionResponse) p.getPayload()) .handle(cotpPacketConnectionResponse -> { @@ -175,7 +155,7 @@ public void onConnect(ConversationContext context) { logger.warn("Timeout during Connection establishing, closing channel..."); context.getChannel().close(); }) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .unwrap(TPKTPacket::getPayload) .only(COTPPacketData.class) .unwrap(COTPPacket::getPayload) @@ -212,7 +192,7 @@ public void onConnect(ConversationContext context) { logger.warn("Timeout during Connection establishing, closing channel..."); context.getChannel().close(); }) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .check(p -> p.getPayload() instanceof COTPPacketData) .unwrap(p -> ((COTPPacketData) p.getPayload())) .check(p -> p.getPayload() instanceof S7MessageUserData) @@ -227,27 +207,21 @@ public void onConnect(ConversationContext context) { }); } - + /* - * It performs the sequential and safe shutdown of the driver. + * It performs the sequential and safe shutdown of the driver. * Completion of pending requests, executors and associated tasks. - */ + */ @Override public void onDisconnect(ConversationContext context) { - //1. Clear all pending requests and their associated transaction - cleanFutures(); - //2. Here we shutdown the local task executor. - clientExecutorService.shutdown(); - //3. Performs the shutdown of the transaction executor. tm.shutdown(); - //4. Finish the execution of the tasks for the handling of Events. + //4. Finish the execution of the tasks for the handling of Events. EventLogic.stop(); - //5. Executes the closing of the main channel. - context.getChannel().close(); - //6. Here is the stop of any task or state machine that is added. + context.fireDisconnected(); + //6. Here is the stop of any task or state machine that is added. } - + @Override public CompletableFuture read(PlcReadRequest readRequest) { DefaultPlcReadRequest request = (DefaultPlcReadRequest) readRequest; @@ -289,22 +263,27 @@ private CompletableFuture toPlcReadResponse(PlcReadRequest read */ private CompletableFuture readInternal(S7MessageRequest request) { CompletableFuture future = new CompletableFuture<>(); - int tpduId = tpduGenerator.getAndIncrement(); + int thisTpduId = 0; + if (this.s7DriverContext.getControllerType() != S7ControllerType.S7_200) + { + thisTpduId = tpduGenerator.getAndIncrement(); + } + final int tpduId = thisTpduId; // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 - if (tpduGenerator.get() == 0xFFFF) { - tpduGenerator.set(1); + if(tpduGenerator.get() == 0xFFFF) { + tpduGenerator.set(0); } // Create a new Request with correct tpuId (is not known before) S7MessageRequest s7MessageRequest = new S7MessageRequest(tpduId, request.getParameter(), request.getPayload()); - TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, s7MessageRequest, true, (short) tpduId, 9999)); + TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, s7MessageRequest, true, (short) tpduId)); // Start a new request-transaction (Is ended in the response-handler) RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); transaction.submit(() -> context.sendRequest(tpktPacket) .onTimeout(new TransactionErrorCallback<>(future, transaction)) .onError(new TransactionErrorCallback<>(future, transaction)) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .check(p -> p.getPayload() instanceof COTPPacketData) .unwrap(p -> (COTPPacketData) p.getPayload()) .check(p -> p.getPayload() != null) @@ -326,17 +305,17 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { List payloadItems = new ArrayList<>(request.getNumberOfTags()); Iterator iter = request.getTagNames().iterator(); - + String tagName = null; while(iter.hasNext()) { tagName = iter.next(); final S7Tag tag = (S7Tag) request.getTag(tagName); final PlcValue plcValue = request.getPlcValue(tagName); parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag))); - payloadItems.add(serializePlcValue(tag, plcValue, iter.hasNext())); + payloadItems.add(serializePlcValue(tag, plcValue, iter.hasNext())); } - - + + // for (String tagName : request.getTagNames()) { // final S7Tag tag = (S7Tag) request.getTag(tagName); // final PlcValue plcValue = request.getPlcValue(tagName); @@ -344,9 +323,9 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { // payloadItems.add(serializePlcValue(tag, plcValue)); // // } - - - + + + final int tpduId = tpduGenerator.getAndIncrement(); // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 if (tpduGenerator.get() == 0xFFFF) { @@ -358,19 +337,19 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { null, new S7MessageRequest(tpduId, new S7ParameterWriteVarRequest(parameterItems), - new S7PayloadWriteVarRequest(payloadItems, null) + new S7PayloadWriteVarRequest(payloadItems) ), true, - (short) tpduId, 9999 + (short) tpduId ) ); - + // Start a new request-transaction (Is ended in the response-handler) RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); transaction.submit(() -> context.sendRequest(tpktPacket) .onTimeout(new TransactionErrorCallback<>(future, transaction)) .onError(new TransactionErrorCallback<>(future, transaction)) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .check(p -> p.getPayload() instanceof COTPPacketData) .unwrap(p -> ((COTPPacketData) p.getPayload())) .unwrap(COTPPacket::getPayload) @@ -434,15 +413,15 @@ public CompletableFuture subscribe(PlcSubscriptionReque TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, new S7MessageUserData(tpduId, new S7ParameterUserData(parameterItems), - new S7PayloadUserData(payloadItems, null)), - true, (short) tpduId, 9999)); + new S7PayloadUserData(payloadItems)), + true, (short) tpduId)); // Start a new request-transaction (Is ended in the response-handler) RequestTransactionManager.RequestTransaction transaction = tm.startRequest(); transaction.submit(() -> context.sendRequest(tpktPacket) .onTimeout(new TransactionErrorCallback<>(future, transaction)) .onError(new TransactionErrorCallback<>(future, transaction)) - .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT) + .expectResponse(TPKTPacket.class, Duration.ofMillis(configuration.getTimeoutRequest())) .check(p -> p.getPayload() instanceof COTPPacketData) .unwrap(p -> ((COTPPacketData) p.getPayload())) .unwrap(COTPPacket::getPayload) @@ -734,8 +713,8 @@ private TPKTPacket createIdentifyRemoteMessage() { new S7ParameterUserDataItemCPUFunctions((short) 0x11, (byte) 0x4, (byte) 0x4, (short) 0x01, (short) 0x00, null, null, null) )), new S7PayloadUserData(Collections.singletonList( new S7PayloadUserDataItemCpuFunctionReadSzlRequest(DataTransportErrorCode.OK, DataTransportSize.OCTET_STRING, new SzlId(SzlModuleTypeClass.CPU, (byte) 0x00, SzlSublist.MODULE_IDENTIFICATION), 0x0000) - ), null)); - COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2, 9999); + ))); + COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2); return new TPKTPacket(cotpPacketData); } @@ -763,19 +742,18 @@ private TPKTPacket createS7ConnectionRequest(COTPPacketConnectionResponse cotpPa new S7ParameterSetupCommunication( s7DriverContext.getMaxAmqCaller(), s7DriverContext.getMaxAmqCallee(), s7DriverContext.getPduSize()); S7Message s7Message = new S7MessageRequest(0, s7ParameterSetupCommunication, - null); - COTPPacketData cotpPacketData = new COTPPacketData(null, s7Message, true, (short) 1, 9999); - + null); + COTPPacketData cotpPacketData = new COTPPacketData(null, s7Message, true, (short) 1); return new TPKTPacket(cotpPacketData); } private COTPPacketConnectionRequest createCOTPConnectionRequest(int calledTsapId, int callingTsapId, COTPTpduSize cotpTpduSize) { return new COTPPacketConnectionRequest( Arrays.asList( - new COTPParameterCallingTsap(callingTsapId,(short) 0), - new COTPParameterCalledTsap(calledTsapId, (short) 0), - new COTPParameterTpduSize(cotpTpduSize, (short) 0) - ), null, (short) 0x0000, (short) 0x000F, COTPProtocolClass.CLASS_0, 0); + new COTPParameterCallingTsap(callingTsapId), + new COTPParameterCalledTsap(calledTsapId), + new COTPParameterTpduSize(cotpTpduSize) + ), null, (short) 0x0000, (short) 0x000F, COTPProtocolClass.CLASS_0); } private PlcResponse decodeReadResponse(S7Message responseMessage, PlcReadRequest plcReadRequest) throws PlcProtocolException { @@ -921,18 +899,18 @@ private S7VarPayloadDataItem serializePlcValue(S7Tag tag, PlcValue plcValue, Boo int stringLength = (tag instanceof S7StringTag) ? ((S7StringTag) tag).getStringLength() : 254; ByteBuffer byteBuffer = null; for (int i = 0; i < tag.getNumberOfElements(); i++) { - final int lengthInBits = DataItem.getLengthInBits(plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength); - final WriteBufferByteBased writeBuffer = new WriteBufferByteBased((int) Math.ceil(((float) lengthInBits) / 8.0f)); - DataItem.staticSerialize(writeBuffer, plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength); + final int lengthInBytes = DataItem.getLengthInBytes(plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength, tag.getStringEncoding()); + final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(lengthInBytes); + DataItem.staticSerialize(writeBuffer, plcValue.getIndex(i), tag.getDataType().getDataProtocolId(), stringLength, tag.getStringEncoding()); // Allocate enough space for all items. if (byteBuffer == null) { - byteBuffer = ByteBuffer.allocate(writeBuffer.getBytes().length * tag.getNumberOfElements()); + byteBuffer = ByteBuffer.allocate(lengthInBytes * tag.getNumberOfElements()); } byteBuffer.put(writeBuffer.getBytes()); } if (byteBuffer != null) { byte[] data = byteBuffer.array(); - return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data, hasNext); + return new S7VarPayloadDataItem(DataTransportErrorCode.OK, transportSize, data/*, hasNext*/); } } catch (SerializationException e) { logger.warn("Error serializing tag item of type: '{}'", tag.getDataType().name(), e); @@ -946,13 +924,13 @@ private PlcValue parsePlcValue(S7Tag tag, ByteBuf data) { int stringLength = (tag instanceof S7StringTag) ? ((S7StringTag) tag).getStringLength() : 254; if (tag.getNumberOfElements() == 1) { return DataItem.staticParse(readBuffer, tag.getDataType().getDataProtocolId(), - stringLength); + stringLength, tag.getStringEncoding()); } else { // Fetch all final PlcValue[] resultItems = IntStream.range(0, tag.getNumberOfElements()).mapToObj(i -> { try { return DataItem.staticParse(readBuffer, tag.getDataType().getDataProtocolId(), - stringLength); + stringLength, tag.getStringEncoding()); } catch (ParseException e) { logger.warn("Error parsing tag item of type: '{}' (at position {}})", tag.getDataType().name(), i, e); } @@ -1036,17 +1014,34 @@ protected S7Address encodeS7Address(PlcTag tag) { // For these date-types we have to convert the requests to simple byte-array requests // As otherwise the S7 will deny them with "Data type not supported" replies. if ((transportSize == TransportSize.TIME) /*|| (transportSize == TransportSize.S7_S5TIME)*/ || - (transportSize == TransportSize.LTIME) || (transportSize == TransportSize.DATE) || - (transportSize == TransportSize.TIME_OF_DAY) || (transportSize == TransportSize.DATE_AND_TIME)) { + (transportSize == TransportSize.LINT) || + (transportSize == TransportSize.ULINT) || + (transportSize == TransportSize.LWORD) || + (transportSize == TransportSize.LREAL) || + (transportSize == TransportSize.REAL) || + (transportSize == TransportSize.LTIME) || + (transportSize == TransportSize.DATE) || + (transportSize == TransportSize.TIME_OF_DAY) || + (transportSize == TransportSize.DATE_AND_TIME) + ) { numElements = numElements * transportSize.getSizeInBytes(); + //((S7Field) field).setDataType(transportSize); transportSize = TransportSize.BYTE; } + if (transportSize == TransportSize.CHAR) { + transportSize = TransportSize.BYTE; + numElements = numElements * transportSize.getSizeInBytes(); + } + if (transportSize == TransportSize.WCHAR) { + transportSize = TransportSize.BYTE; + numElements = numElements * transportSize.getSizeInBytes() * 2; + } if (transportSize == TransportSize.STRING) { - transportSize = TransportSize.CHAR; + transportSize = TransportSize.BYTE; int stringLength = (s7Tag instanceof S7StringTag) ? ((S7StringTag) s7Tag).getStringLength() : 254; numElements = numElements * (stringLength + 2); } else if (transportSize == TransportSize.WSTRING) { - transportSize = TransportSize.CHAR; + transportSize = TransportSize.BYTE; int stringLength = (s7Tag instanceof S7StringTag) ? ((S7StringTag) s7Tag).getStringLength() : 254; numElements = numElements * (stringLength + 2) * 2; } @@ -1079,27 +1074,4 @@ public void accept(TPKTPacket tpktPacket, E e) { future.completeExceptionally(e); } } - - private void cleanFutures(){ - //TODO: Debe ser ejecutado si la conexion esta levanta. - active_requests.forEach((f,p)->{ - CompletableFuture cf = (CompletableFuture) f; - try { - if (!cf.isDone()) { - logger.info("CF"); - cf.cancel(true); - logger.info("ClientCF"); - ((CompletableFuture) p.getRight()).completeExceptionally(new PlcRuntimeException("Disconnected")); - logger.info("TM"); - p.getLeft().endRequest(); - }; - } catch (Exception ex){ - logger.info(ex.toString()); - } - }); - active_requests.clear(); - - } - - } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java index 2435717c44c..b4285ba0fb1 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7StringTag.java @@ -36,8 +36,9 @@ public class S7StringTag extends S7Tag { protected S7StringTag(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea, @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset, @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements, - @JsonProperty("stringLength") int stringLength) { - super(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements); + @JsonProperty("stringLength") int stringLength, + @JsonProperty("stringEncoding") String stringEncoding) { + super(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements,stringEncoding); this.stringLength = stringLength; } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java index 2a78a33da6e..5a92175fb1f 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7Tag.java @@ -47,24 +47,23 @@ public class S7Tag implements PlcTag, Serializable { //byteOffset theoretically can reach up to 2097151 ... see checkByteOffset() below --> 7digits private static final Pattern ADDRESS_PATTERN = - Pattern.compile("^%(?.)(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?"); + Pattern.compile("^%(?.)(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?(\\|(?[a-z0-9A-Z_-]+))?"); //blockNumber usually has its max hat around 64000 --> 5digits private static final Pattern DATA_BLOCK_ADDRESS_PATTERN = - Pattern.compile("^%DB(?\\d{1,5}).DB(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?"); + Pattern.compile("^%DB(?\\d{1,5}).DB(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?(\\|(?[a-z0-9A-Z_-]+))?"); private static final Pattern DATA_BLOCK_SHORT_PATTERN = - Pattern.compile("^%DB(?\\d{1,5}):(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?"); + Pattern.compile("^%DB(?\\d{1,5}):(?\\d{1,7})(.(?[0-7]))?:(?[a-zA-Z_]+)(\\[(?\\d+)])?(\\|(?[a-z0-9A-Z_-]+))?"); private static final Pattern DATA_BLOCK_STRING_ADDRESS_PATTERN = - Pattern.compile("^%DB(?\\d{1,5}).DB(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?STRING|WSTRING)\\((?\\d{1,3})\\)(\\[(?\\d+)])?"); + Pattern.compile("^%DB(?\\d{1,5}).DB(?[XBWD]?)(?\\d{1,7})(.(?[0-7]))?:(?STRING|WSTRING)\\((?\\d{1,3})\\)(\\[(?\\d+)])?(\\|(?[a-z0-9A-Z_-]+))?"); private static final Pattern DATA_BLOCK_STRING_SHORT_PATTERN = - Pattern.compile("^%DB(?\\d{1,5}):(?\\d{1,7})(.(?[0-7]))?:(?STRING|WSTRING)\\((?\\d{1,3})\\)(\\[(?\\d+)])?"); + Pattern.compile("^%DB(?\\d{1,5}):(?\\d{1,7})(.(?[0-7]))?:(?STRING|WSTRING)\\((?\\d{1,3})\\)(\\[(?\\d+)])?(\\|(?[a-z0-9A-Z_-]+))?"); private static final Pattern PLC_PROXY_ADDRESS_PATTERN = - Pattern.compile("[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}"); - + Pattern.compile("[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}(\\|(?[a-z0-9A-Z_-]+))?"); private static final String DATA_TYPE = "dataType"; private static final String STRING_LENGTH = "stringLength"; private static final String TRANSFER_SIZE_CODE = "transferSizeCode"; @@ -73,6 +72,7 @@ public class S7Tag implements PlcTag, Serializable { private static final String BIT_OFFSET = "bitOffset"; private static final String NUM_ELEMENTS = "numElements"; private static final String MEMORY_AREA = "memoryArea"; + private static final String STRING_ENCODING = "stringEncoding"; private final TransportSize dataType; private final MemoryArea memoryArea; @@ -81,16 +81,20 @@ public class S7Tag implements PlcTag, Serializable { private final byte bitOffset; private final int numElements; + private final String stringEncoding; + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) protected S7Tag(@JsonProperty("dataType") TransportSize dataType, @JsonProperty("memoryArea") MemoryArea memoryArea, @JsonProperty("blockNumber") int blockNumber, @JsonProperty("byteOffset") int byteOffset, - @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements) { + @JsonProperty("bitOffset") byte bitOffset, @JsonProperty("numElements") int numElements, + @JsonProperty("stringEncoding") String stringEncoding) { this.dataType = dataType; this.memoryArea = memoryArea; this.blockNumber = blockNumber; this.byteOffset = byteOffset; this.bitOffset = bitOffset; this.numElements = numElements; + this.stringEncoding = stringEncoding; } @Override @@ -135,6 +139,10 @@ public byte getBitOffset() { return bitOffset; } + public String getStringEncoding() { + return stringEncoding; + } + @Override public int getNumberOfElements() { return numElements; } @@ -162,7 +170,7 @@ public static S7Tag of(String tagString) { if (matcher.group(BIT_OFFSET) != null) { bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET)); } else if (dataType == TransportSize.BOOL) { - throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); + //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); } int numElements = 1; if (matcher.group(NUM_ELEMENTS) != null) { @@ -173,8 +181,16 @@ public static S7Tag of(String tagString) { throw new PlcInvalidTagException("Transfer size code '" + transferSizeCode + "' doesn't match specified data type '" + dataType.name() + "'"); } - - return new S7StringTag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength); + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } + return new S7StringTag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringLength, stringEncoding); } else if ((matcher = DATA_BLOCK_STRING_SHORT_PATTERN.matcher(tagString)).matches()) { TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE)); int stringLength = Integer.parseInt(matcher.group(STRING_LENGTH)); @@ -186,9 +202,17 @@ public static S7Tag of(String tagString) { if (matcher.group(NUM_ELEMENTS) != null) { numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS)); } - + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } return new S7StringTag(dataType, memoryArea, blockNumber, - byteOffset, bitOffset, numElements, stringLength); + byteOffset, bitOffset, numElements, stringLength, stringEncoding); } else if ((matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(tagString)).matches()) { TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE)); MemoryArea memoryArea = MemoryArea.DATA_BLOCKS; @@ -210,8 +234,16 @@ public static S7Tag of(String tagString) { throw new PlcInvalidTagException("Transfer size code '" + transferSizeCode + "' doesn't match specified data type '" + dataType.name() + "'"); } - - return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements); + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } + return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringEncoding); } else if ((matcher = DATA_BLOCK_SHORT_PATTERN.matcher(tagString)).matches()) { TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE)); MemoryArea memoryArea = MemoryArea.DATA_BLOCKS; @@ -221,15 +253,23 @@ public static S7Tag of(String tagString) { if (matcher.group(BIT_OFFSET) != null) { bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET)); } else if (dataType == TransportSize.BOOL) { - throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); + //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); } int numElements = 1; if (matcher.group(NUM_ELEMENTS) != null) { numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS)); } - - return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements); - } else if (PLC_PROXY_ADDRESS_PATTERN.matcher(tagString).matches()) { + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } + return new S7Tag(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements, stringEncoding); + } else if ((matcher = PLC_PROXY_ADDRESS_PATTERN.matcher(tagString)).matches()) { try { byte[] addressData = Hex.decodeHex(tagString.replaceAll("[-]", "")); ReadBuffer rb = new ReadBufferByteBased(addressData); @@ -240,10 +280,18 @@ public static S7Tag of(String tagString) { if ((s7AddressAny.getTransportSize() != TransportSize.BOOL) && s7AddressAny.getBitAddress() != 0) { throw new PlcInvalidTagException("A bit offset other than 0 is only supported for type BOOL"); } - + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (s7AddressAny.getTransportSize() == TransportSize.WSTRING || s7AddressAny.getTransportSize() == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } return new S7Tag(s7AddressAny.getTransportSize(), s7AddressAny.getArea(), s7AddressAny.getDbNumber(), s7AddressAny.getByteAddress(), - s7AddressAny.getBitAddress(), s7AddressAny.getNumberOfElements()); + s7AddressAny.getBitAddress(), s7AddressAny.getNumberOfElements(), stringEncoding); } else { throw new PlcInvalidTagException("Unsupported address type."); } @@ -259,7 +307,7 @@ public static S7Tag of(String tagString) { if (matcher.group(BIT_OFFSET) != null) { bitOffset = Byte.parseByte(matcher.group(BIT_OFFSET)); } else if (dataType == TransportSize.BOOL) { - throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); + //throw new PlcInvalidTagException("Expected bit offset for BOOL parameters."); } int numElements = 1; if (matcher.group(NUM_ELEMENTS) != null) { @@ -273,8 +321,17 @@ public static S7Tag of(String tagString) { if ((dataType != TransportSize.BOOL) && bitOffset != 0) { throw new PlcInvalidTagException("A bit offset other than 0 is only supported for type BOOL"); } + String stringEncoding = matcher.group(STRING_ENCODING); + if (stringEncoding==null || "".equals(stringEncoding)) + { + stringEncoding = "UTF-8"; + if (dataType == TransportSize.WSTRING || dataType == TransportSize.WCHAR) + { + stringEncoding = "UTF-16"; + } + } - return new S7Tag(dataType, memoryArea, (short) 0, byteOffset, bitOffset, numElements); + return new S7Tag(dataType, memoryArea, (short) 0, byteOffset, bitOffset, numElements, stringEncoding); } throw new PlcInvalidTagException("Unable to parse address: " + tagString); } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java index 3fda942897e..f1ab55296d7 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java @@ -36,14 +36,22 @@ import org.apache.plc4x.java.spi.generation.ReadBuffer; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import org.apache.plc4x.java.spi.values.PlcList; +import org.apache.plc4x.java.spi.values.PlcWCHAR; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.nio.ByteBuffer; +import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.ChronoUnit; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @@ -127,6 +135,87 @@ */ public class StaticHelper { + private static final String[] DEFAULTCHARSETS = {"ASCII", "UTF-8", "GBK", "GB2312", "BIG5", "GB18030"}; + + public static Charset detectCharset(String firstMaTch, byte[] bytes) { + + Charset charset = null; + if (firstMaTch!=null && !"".equals(firstMaTch)) + { + try { + charset = Charset.forName(firstMaTch.replaceAll("[^a-zA-Z0-9]", "")); + }catch (Exception ignored) { + } + return charset; + } + for (String charsetName : DEFAULTCHARSETS) { + charset = detectCharset(bytes, Charset.forName(charsetName), bytes.length); + if (charset != null) { + break; + } + } + + return charset; + } + + private static Charset detectCharset(byte[] bytes, Charset charset, int length) { + try { + BufferedInputStream input = new BufferedInputStream(new ByteArrayInputStream(bytes, 0, length)); + + CharsetDecoder decoder = charset.newDecoder(); + decoder.reset(); + + byte[] buffer = new byte[512]; + boolean identified = false; + while (input.read(buffer) != -1 && !identified) { + identified = identify(buffer, decoder); + } + + input.close(); + + if (identified) { + return charset; + } else { + return null; + } + + } catch (Exception e) { + return null; + } + } + + private static boolean identify(byte[] bytes, CharsetDecoder decoder) { + try { + decoder.decode(ByteBuffer.wrap(bytes)); + } catch (CharacterCodingException e) { + return false; + } + return true; + } + public static Charset getEncoding(String firstMaTch, String str) { + if (str == null || str.trim().length() < 1) { + return null; + } + Charset charset = null; + if (firstMaTch!=null && !"".equals(firstMaTch)) + { + try { + charset = Charset.forName(firstMaTch.replaceAll("[^a-zA-Z0-9]", "")); + }catch (Exception ignored) { + } + return charset; + } + for (String encode : DEFAULTCHARSETS) { + try { + Charset charset1 = Charset.forName(encode); + if (str.equals(new String(str.getBytes(charset1), charset1))) { + return charset1; + } + } catch (Exception er) { + } + } + return null; + } public enum OB { FREE_CYC(0X0000, "OB1 Free cycle"), @@ -1931,7 +2020,7 @@ public static void serializeTiaDateTime(WriteBuffer io, PlcValue value) { throw new NotImplementedException("Serializing DATE_AND_TIME not implemented"); } - public static String parseS7Char(ReadBuffer io, String encoding) throws ParseException { + public static String parseS7Char(ReadBuffer io, String encoding, String stringEncoding) throws ParseException{ if ("UTF-8".equalsIgnoreCase(encoding)) { return io.readString(8, WithOption.WithEncoding(encoding)); } else if ("UTF-16".equalsIgnoreCase(encoding)) { @@ -1941,14 +2030,14 @@ public static String parseS7Char(ReadBuffer io, String encoding) throws ParseExc } } - public static String parseS7String(ReadBuffer io, int stringLength, String encoding) { + public static String parseS7String(ReadBuffer io, int stringLength, String encoding, String stringEncoding) { try { if ("UTF-8".equalsIgnoreCase(encoding)) { // This is the maximum number of bytes a string can be long. short maxLength = io.readUnsignedShort(8); // This is the total length of the string on the PLC (Not necessarily the number of characters read) short totalStringLength = io.readUnsignedShort(8); - + totalStringLength = (short) Math.min(maxLength, totalStringLength); final byte[] byteArray = new byte[totalStringLength]; for (int i = 0; (i < stringLength) && io.hasMore(8); i++) { final byte curByte = io.readByte(); @@ -1963,13 +2052,25 @@ public static String parseS7String(ReadBuffer io, int stringLength, String encod break; } } - return new String(byteArray, StandardCharsets.UTF_8); + Charset charset = detectCharset(null,byteArray); + if (charset == null) { + try { + charset = Charset.forName(stringEncoding.replaceAll("[^a-zA-Z0-9]", "")); + }catch (Exception ignored) { + } + if (charset == null) { + charset = StandardCharsets.UTF_8; + } + } + String substr = new String(byteArray, charset); + substr = substr.replaceAll("[^\u0020-\u9FA5]", ""); + return substr; } else if ("UTF-16".equalsIgnoreCase(encoding)) { // This is the maximum number of bytes a string can be long. int maxLength = io.readUnsignedInt(16); // This is the total length of the string on the PLC (Not necessarily the number of characters read) int totalStringLength = io.readUnsignedInt(16); - + totalStringLength = Math.min(maxLength, totalStringLength); final byte[] byteArray = new byte[totalStringLength * 2]; for (int i = 0; (i < stringLength) && io.hasMore(16); i++) { final short curShort = io.readShort(16); @@ -1985,7 +2086,17 @@ public static String parseS7String(ReadBuffer io, int stringLength, String encod break; } } - return new String(byteArray, StandardCharsets.UTF_16); + Charset charset = detectCharset(stringEncoding,byteArray); + if (charset == null) { + try { + charset = Charset.forName(stringEncoding.replaceAll("[^a-zA-Z0-9]", "")); + }catch (Exception ignored) { + } + if (charset == null) { + charset = StandardCharsets.UTF_16; + } + } + return new String(byteArray, charset); } else { throw new PlcRuntimeException("Unsupported string encoding " + encoding); } @@ -1997,12 +2108,29 @@ public static String parseS7String(ReadBuffer io, int stringLength, String encod /* * A variable of data type CHAR (character) occupies one byte. */ - public static void serializeS7Char(WriteBuffer io, PlcValue value, String encoding) { - // TODO: Need to implement the serialization or we can't write strings + public static void serializeS7Char(WriteBuffer io, PlcValue value, String encoding, String stringEncoding) { + if (value instanceof PlcList) { + PlcList list = (PlcList) value; + list.getList().forEach(v -> writeChar(io, v, encoding,stringEncoding)); + } else { + writeChar(io, value, encoding,stringEncoding); + } + } + private static void writeChar(WriteBuffer io, PlcValue value, String encoding, String stringEncoding) { if ("UTF-8".equalsIgnoreCase(encoding)) { - //return io.readString(8, encoding); + try { + byte valueByte = value.getByte(); + io.writeByte(valueByte); + } catch (SerializationException e) { + throw new PlcRuntimeException("writeChar error"); + } } else if ("UTF-16".equalsIgnoreCase(encoding)) { - //return io.readString(16, encoding); + try { + byte[] bytes = ((PlcWCHAR) value).getBytes(); + io.writeByteArray(bytes); + } catch (SerializationException e) { + throw new PlcRuntimeException("writeWChar error"); + } } else { throw new PlcRuntimeException("Unsupported encoding"); } @@ -2032,23 +2160,57 @@ public static void serializeS7Char(WriteBuffer io, PlcValue value, String encodi * If your application does not handle S7string, you can handle * the String as char arrays from your application. */ - public static void serializeS7String(WriteBuffer io, PlcValue value, int stringLength, String encoding) { - int k = 0xFF & ((stringLength > 250) ? 250 : stringLength); - int m = 0xFF & value.getString().length(); - m = (m > k) ? k : m; - byte[] chars = new byte[m]; - for (int i = 0; i < m; ++i) { - char c = value.getString().charAt(i); - chars[i] = (byte) c; + public static void serializeS7String(WriteBuffer io, PlcValue value, int stringLength, String encoding, String stringEncoding) { + stringLength = Math.min(stringLength, 254); + String valueString = (String) value.getObject(); + valueString = valueString == null ? "" : valueString; + if ("AUTO".equalsIgnoreCase(stringEncoding)) + { + stringEncoding = null; + } + Charset charsetTemp = getEncoding(stringEncoding,valueString); + if ("UTF-8".equalsIgnoreCase(encoding)) { + if (charsetTemp == null) { + charsetTemp = StandardCharsets.UTF_8; + } + final byte[] raw = valueString.getBytes(charsetTemp); + try { + io.writeByte((byte) stringLength); + io.writeByte((byte) raw.length); + for (int i = 0; i < stringLength; i++) { + if (i >= raw.length) { + io.writeByte((byte) 0x00); + } else { + io.writeByte( raw[i]); + } + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else if ("UTF-16".equalsIgnoreCase(encoding)) { + if (charsetTemp == null) { + charsetTemp = StandardCharsets.UTF_16; + } + final byte[] raw = valueString.getBytes(charsetTemp); + try { + io.writeUnsignedInt(16, stringLength); + io.writeUnsignedInt(16, raw.length / 2); + for (int i = 0; i < stringLength * 2; i++) { + if (i >= raw.length) { + io.writeByte((byte) 0x00); + } else { + io.writeByte( raw[i]); + } + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + throw new PlcRuntimeException("Unsupported string encoding " + encoding); } - try { - io.writeByte((byte)(k & 0xFF)); - io.writeByte((byte)(m & 0xFF)); - io.writeByteArray(chars); - } catch (SerializationException ex) { - Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); - } } } diff --git a/plc4j/drivers/s7/src/test/java/S7IoTest.java b/plc4j/drivers/s7/src/test/java/S7IoTest.java index a9ceea4a726..2c23628e3d2 100644 --- a/plc4j/drivers/s7/src/test/java/S7IoTest.java +++ b/plc4j/drivers/s7/src/test/java/S7IoTest.java @@ -331,7 +331,7 @@ void TestS7MessageBytes() throws Exception { TPKTPacket tpktPacket = new TPKTPacket( new COTPPacketData( - Collections.singletonList(new COTPParameterTpduSize(COTPTpduSize.SIZE_4096, (short) 0)), + Collections.singletonList(new COTPParameterTpduSize(COTPTpduSize.SIZE_4096)), new S7MessageResponseData( 11, new S7ParameterReadVarResponse((short) 1), @@ -340,16 +340,15 @@ void TestS7MessageBytes() throws Exception { new S7VarPayloadDataItem( DataTransportErrorCode.OK, DataTransportSize.BIT, - new byte[]{0x1}, - false + new byte[]{0x1} ) - ), null + ) ), (short) 0, (short) 0 ), false, - (short) 13, 0 + (short) 13 ) ); // To string diff --git a/plc4j/drivers/s7/src/test/resources/logback-test.xml b/plc4j/drivers/s7/src/test/resources/logback-test.xml index 33ae65561c2..30209163626 100644 --- a/plc4j/drivers/s7/src/test/resources/logback-test.xml +++ b/plc4j/drivers/s7/src/test/resources/logback-test.xml @@ -27,7 +27,7 @@ - + diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java index 515d3e1eb16..b533477fd3f 100644 --- a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java +++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java @@ -18,31 +18,16 @@ */ package org.apache.plc4x.java.simulated.connection; -import org.apache.plc4x.java.api.messages.PlcReadRequest; -import org.apache.plc4x.java.api.messages.PlcReadResponse; -import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent; -import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest; -import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse; -import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest; -import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse; -import org.apache.plc4x.java.api.messages.PlcWriteRequest; -import org.apache.plc4x.java.api.messages.PlcWriteResponse; +import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.api.model.PlcConsumerRegistration; -import org.apache.plc4x.java.api.model.PlcSubscriptionTag; import org.apache.plc4x.java.api.model.PlcSubscriptionHandle; +import org.apache.plc4x.java.api.model.PlcSubscriptionTag; import org.apache.plc4x.java.api.types.PlcResponseCode; import org.apache.plc4x.java.api.value.PlcValue; import org.apache.plc4x.java.simulated.tag.SimulatedTag; import org.apache.plc4x.java.simulated.tag.SimulatedTagHandler; import org.apache.plc4x.java.spi.connection.AbstractPlcConnection; -import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse; -import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionEvent; -import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionResponse; -import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionResponse; -import org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse; -import org.apache.plc4x.java.spi.messages.PlcReader; -import org.apache.plc4x.java.spi.messages.PlcSubscriber; -import org.apache.plc4x.java.spi.messages.PlcWriter; +import org.apache.plc4x.java.spi.messages.*; import org.apache.plc4x.java.spi.messages.utils.ResponseItem; import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration; import org.apache.plc4x.java.spi.model.DefaultPlcSubscriptionHandle; @@ -51,12 +36,7 @@ import org.slf4j.LoggerFactory; import java.time.Instant; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -65,7 +45,7 @@ * Connection to a test device. * This class is not thread-safe. */ -public class SimulatedConnection extends AbstractPlcConnection implements PlcReader, PlcWriter, PlcSubscriber { +public class SimulatedConnection extends AbstractPlcConnection { private static final Logger LOGGER = LoggerFactory.getLogger(SimulatedConnection.class); diff --git a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java index 54c2b203c42..09d036d93cd 100644 --- a/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java +++ b/plc4j/examples/hello-connectivity-mqtt/src/main/java/org/apache/plc4x/java/examples/connectivity/mqtt/MqttConnector.java @@ -24,10 +24,10 @@ import com.google.gson.JsonObject; import com.hivemq.client.mqtt.MqttClient; import com.hivemq.client.mqtt.datatypes.MqttQos; -import com.hivemq.client.mqtt.mqtt3.Mqtt3RxClient; -import com.hivemq.client.mqtt.mqtt3.message.connect.connack.Mqtt3ConnAck; -import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3Publish; -import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3PublishResult; +import com.hivemq.client.mqtt.mqtt5.Mqtt5RxClient; +import com.hivemq.client.mqtt.mqtt5.message.connect.connack.Mqtt5ConnAck; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; import io.reactivex.Flowable; import io.reactivex.Single; import org.apache.commons.lang3.StringUtils; @@ -43,6 +43,7 @@ import java.io.File; import java.io.IOException; +import java.net.URL; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -53,14 +54,18 @@ public class MqttConnector { private Configuration config; private MqttConnector(String propsPath) { - if(StringUtils.isEmpty(propsPath)) { + if (StringUtils.isEmpty(propsPath)) { logger.error("Empty configuration file parameter"); throw new IllegalArgumentException("Empty configuration file parameter"); } File propsFile = new File(propsPath); - if(!(propsFile.exists() && propsFile.isFile())) { - logger.error("Invalid configuration file {}", propsFile.getPath()); - throw new IllegalArgumentException("Invalid configuration file " + propsFile.getPath()); + if (!(propsFile.exists() && propsFile.isFile())) { + URL url = getClass().getClassLoader().getResource(propsPath); + if (url == null) { + logger.error("Invalid configuration file {}", propsFile.getPath()); + throw new IllegalArgumentException("Invalid configuration file " + propsFile.getPath()); + } + propsFile = new File(url.getFile()); } ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); try { @@ -72,15 +77,15 @@ private MqttConnector(String propsPath) { private void run() throws PlcException { // Create a new MQTT client. - final Mqtt3RxClient client = MqttClient.builder() + final Mqtt5RxClient client = MqttClient.builder() .identifier(UUID.randomUUID().toString()) .serverHost(config.getMqttConfig().getServerHost()) .serverPort(config.getMqttConfig().getServerPort()) - .useMqttVersion3() + .useMqttVersion5() .buildRx(); // Connect to the MQTT broker. - final Single connAckSingle = client.connect().timeout(10, TimeUnit.SECONDS); + final Single connAckSingle = client.connect().timeout(10, TimeUnit.SECONDS); // Connect to the PLC. try (PlcConnection plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(config.getPlcConfig().getConnection())) { @@ -99,30 +104,36 @@ private void run() throws PlcException { PlcReadRequest readRequest = builder.build(); // Send a message containing the PLC read response. - Flowable messagesToPublish = Flowable.generate(emitter -> { - PlcReadResponse response = readRequest.execute().get(); - String jsonPayload = getPayload(response); - final Mqtt3Publish publishMessage = Mqtt3Publish.builder() - .topic(config.getMqttConfig().getTopicName()) - .qos(MqttQos.AT_LEAST_ONCE) - .payload(jsonPayload.getBytes()) - .build(); - emitter.onNext(publishMessage); + Flowable messagesToPublish = Flowable.generate(emitter -> { + readRequest.execute().whenComplete((response, err) -> { + String jsonPayload = new JsonObject().toString(); + if (err == null) { + jsonPayload = getPayload(response); + } + + final Mqtt5Publish publishMessage = Mqtt5Publish.builder() + .topic(config.getMqttConfig().getTopicName()) + .qos(MqttQos.AT_LEAST_ONCE) + .payload(jsonPayload.getBytes()) + .build(); + emitter.onNext(publishMessage); + }); + }); // Emit 1 message only every 100 milliseconds. messagesToPublish = messagesToPublish.zipWith(Flowable.interval( config.getPollingInterval(), TimeUnit.MILLISECONDS), (publish, aLong) -> publish); - final Single connectScenario = connAckSingle - .doOnSuccess(connAck -> System.out.println("Connected with return code " + connAck.getReturnCode())) + final Single connectScenario = connAckSingle + .doOnSuccess(connAck -> System.out.println("Connected with return code " + connAck.getReasonCode())) .doOnError(throwable -> System.out.println("Connection failed, " + throwable.getMessage())); - final Flowable publishScenario = client.publish(messagesToPublish) + final Flowable publishScenario = client.publish(messagesToPublish) .doOnNext(publishResult -> System.out.println( "Publish acknowledged: " + new String(publishResult.getPublish().getPayloadAsBytes()))); - connectScenario.toCompletable().andThen(publishScenario).blockingSubscribe(); + connectScenario.ignoreElement().andThen(publishScenario).blockingSubscribe(); } catch (Exception e) { throw new PlcException("Error creating connection to " + config.getPlcConfig().getConnection(), e); } @@ -143,10 +154,11 @@ private String getPayload(PlcReadResponse response) { } public static void main(String[] args) throws Exception { - if(args.length != 1) { - System.out.println("Usage: MqttConnector {path-to-mqtt-connector.yml}"); + String fileName = "mqtt-connector.yml"; + if (args.length >= 1) { + fileName = args[0]; } - MqttConnector mqttConnector = new MqttConnector(args[0]); + MqttConnector mqttConnector = new MqttConnector(fileName); mqttConnector.run(); } diff --git a/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml b/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml new file mode 100644 index 00000000000..1bccd427a91 --- /dev/null +++ b/plc4j/examples/hello-connectivity-mqtt/src/main/resources/mqtt-connector.yml @@ -0,0 +1,35 @@ +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- +--- +mqtt: + topic-name: plc4x/test-topic + server-host: test.mosquitto.org + server-port: 1883 +plc: + connection: simulated://127.0.0.1 + addresses: + - name: intParam + address: RANDOM/foo:INT + size: 1 + type: java.lang.Integer + - name: intParam2 + address: RANDOM/bar:INT + size: 1 + type: java.lang.Integer +polling-interval: 2000 diff --git a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java index d89e4d35ea0..1cd49b5e1b7 100644 --- a/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java +++ b/plc4j/examples/hello-influx-data-collection/src/main/java/org/apache/plc4x/java/examples/helloinflux/HelloInflux.java @@ -61,7 +61,7 @@ public HelloInflux(File configFile) { public void run() { InfluxDBClient dbConnection = connectToDb(); - WriteApi writeApi = dbConnection.getWriteApi(); + WriteApi writeApi = dbConnection.makeWriteApi(); try { PlcConnection plcConnection = connectToPlc(); diff --git a/plc4j/examples/hello-world-kotlin/pom.xml b/plc4j/examples/hello-world-kotlin/pom.xml index 6931049aa04..771e2e82bfc 100644 --- a/plc4j/examples/hello-world-kotlin/pom.xml +++ b/plc4j/examples/hello-world-kotlin/pom.xml @@ -54,7 +54,7 @@ diff --git a/plc4j/integrations/apache-kafka/pom.xml b/plc4j/integrations/apache-kafka/pom.xml index 6f6fcebc120..75fd02e15f5 100644 --- a/plc4j/integrations/apache-kafka/pom.xml +++ b/plc4j/integrations/apache-kafka/pom.xml @@ -32,7 +32,7 @@ Integration module for integrating PLC4X into Apache Kafka (Kafka-Connect-Plugin) - 3.2.0 + 3.2.3 0.12.0 diff --git a/plc4j/integrations/opcua-server/pom.xml b/plc4j/integrations/opcua-server/pom.xml index ee1a38db544..17ef31bfce8 100644 --- a/plc4j/integrations/opcua-server/pom.xml +++ b/plc4j/integrations/opcua-server/pom.xml @@ -168,18 +168,18 @@ runtime - + org.bouncycastle - bcmail-jdk15on + bcmail-jdk18on org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java index e2ff4651073..e7c5a81dc3a 100644 --- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java +++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xCommunication.java @@ -18,7 +18,9 @@ */ package org.apache.plc4x.java.opcuaserver.backend; +import org.apache.plc4x.java.DefaultPlcDriverManager; import org.apache.plc4x.java.api.PlcConnection; +import org.apache.plc4x.java.api.PlcConnectionManager; import org.apache.plc4x.java.api.PlcDriverManager; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.apache.plc4x.java.api.messages.PlcReadRequest; @@ -53,9 +55,7 @@ public class Plc4xCommunication extends AbstractLifecycle { - - private PlcDriverManager driverManager; - private CachedPlcConnectionManager cachedPlcConnectionManager; + private PlcConnectionManager plcConnectionManager; private final Logger logger = LoggerFactory.getLogger(getClass()); private final Integer DEFAULT_TIMEOUT = 1000000; private final Integer DEFAULT_RETRY_BACKOFF = 5000; @@ -71,7 +71,7 @@ public Plc4xCommunication() { @Override protected void onStartup() { - setDriverManager(PlcDriverManager.getDefault()); + setConnectionManager(CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).build()); } @Override @@ -79,17 +79,16 @@ protected void onShutdown() { //Do Nothing } - public PlcDriverManager getDriverManager() { - return driverManager; + public PlcConnectionManager getConnectionManager() { + return plcConnectionManager; } - public void setDriverManager(PlcDriverManager driverManager) { - this.driverManager = driverManager; - this.cachedPlcConnectionManager = CachedPlcConnectionManager.getBuilder(driverManager.getConnectionManager()).build(); + public void setConnectionManager(PlcConnectionManager connectionManager) { + this.plcConnectionManager = connectionManager; } public PlcTag getTag(String tag, String connectionString) throws PlcConnectionException { - return driverManager.getDriverForUrl(connectionString).prepareTag(tag); + return plcConnectionManager.getDriverManager().getDriverForUrl(connectionString).prepareTag(tag); } public void addTag(DataItem item) { @@ -156,7 +155,7 @@ public DataValue getValue(AttributeFilterContext.GetAttributeContext ctx, String //Try to connect to PLC try { - connection = cachedPlcConnectionManager.getConnection(connectionString); + connection = plcConnectionManager.getConnection(connectionString); logger.debug(connectionString + " Connected"); } catch (PlcConnectionException e) { logger.error("Failed to connect to device, error raised - " + e); @@ -248,7 +247,7 @@ public DataValue getValue(AttributeFilterContext.GetAttributeContext ctx, String } public void setValue(String tag, String value, String connectionString) { - try (PlcConnection connection = cachedPlcConnectionManager.getConnection(connectionString)) { + try (PlcConnection connection = plcConnectionManager.getConnection(connectionString)) { if (!connection.getMetadata().canWrite()) { logger.error("This connection doesn't support writing."); return; diff --git a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java index fd4d6e91884..87f2fe60478 100644 --- a/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java +++ b/plc4j/integrations/opcua-server/src/main/java/org/apache/plc4x/java/opcuaserver/backend/Plc4xNamespace.java @@ -23,6 +23,7 @@ import org.apache.plc4x.java.opcuaserver.configuration.Configuration; import org.apache.plc4x.java.opcuaserver.configuration.DeviceConfiguration; import org.apache.plc4x.java.opcuaserver.configuration.Tag; +import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager; import org.eclipse.milo.opcua.sdk.core.AccessLevel; import org.eclipse.milo.opcua.sdk.core.Reference; import org.eclipse.milo.opcua.sdk.core.ValueRank; @@ -184,9 +185,9 @@ public void onDataItemsCreated(List dataItems) { for (DataItem item : dataItems) { plc4xServer.addTag(item); - if (plc4xServer.getDriverManager() == null) { + if (plc4xServer.getConnectionManager() == null) { plc4xServer.removeTag(item); - plc4xServer.setDriverManager(new DefaultPlcDriverManager()); + plc4xServer.setConnectionManager(CachedPlcConnectionManager.getBuilder(new DefaultPlcDriverManager()).build()); } } diff --git a/plc4j/pom.xml b/plc4j/pom.xml index 192b24edba8..4af3e39966b 100644 --- a/plc4j/pom.xml +++ b/plc4j/pom.xml @@ -126,6 +126,9 @@ check + + **/Identifiers + false 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 33ef3166734..e6007b9a50b 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 @@ -22,6 +22,9 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.MessageToMessageCodec; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timeout; +import io.netty.util.Timer; import io.vavr.control.Either; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.spi.configuration.Configuration; @@ -39,6 +42,7 @@ import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Function; @@ -53,13 +57,12 @@ public class Plc4xNettyWrapper extends MessageToMessageCodec { private final PlcAuthentication authentication; private final Queue registeredHandlers; - private final ChannelPipeline pipeline; + private Timer timer = null; private final boolean passive; public Plc4xNettyWrapper(ChannelPipeline pipeline, boolean passive, Plc4xProtocolBase protocol, PlcAuthentication authentication, Class clazz) { super(clazz, Object.class); - this.pipeline = pipeline; this.passive = passive; this.registeredHandlers = new ConcurrentLinkedQueue<>(); this.protocolBase = protocol; @@ -105,6 +108,7 @@ public void fireDiscovered(Configuration c) { public SendRequestContext sendRequest(T packet) { return new DefaultSendRequestContext<>(handler -> { logger.trace("Adding Response Handler ..."); + handler.setTimeoutHandle(createTimeout(handler)); registeredHandlers.add(handler); }, packet, this); } @@ -113,13 +117,33 @@ public SendRequestContext sendRequest(T packet) { public ExpectRequestContext expectRequest(Class clazz, Duration timeout) { return new DefaultExpectRequestContext<>(handler -> { logger.trace("Adding Request Handler ..."); + handler.setTimeoutHandle(createTimeout(handler)); registeredHandlers.add(handler); }, clazz, timeout, this); } }); } - + private Timeout createTimeout(HandlerRegistration handler) + { + Timer createdTimer = this.protocolBase.timer; + if(createdTimer==null) { + if(this.timer == null) { + this.timer = new HashedWheelTimer(); + } + createdTimer = this.timer; + } + return createdTimer.newTimeout(tt -> { + if (tt.isCancelled()) { + return; + } + if( registeredHandlers.remove(handler)) + { + handler.cancel(); + handler.getOnTimeoutConsumer().accept(new TimeoutException()); + } + }, handler.getTimeout().toMillis(), TimeUnit.MILLISECONDS); + } @Override protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, List list) throws Exception { // logger.trace("Encoding {}", plcRequestContainer); @@ -145,21 +169,15 @@ protected void decode(ChannelHandlerContext channelHandlerContext, T t, List(ctx, authentication, passive)); } else if (evt instanceof CloseConnectionEvent) { this.protocolBase.close(new DefaultConversationContext<>(ctx, authentication, passive)); + if(this.timer!=null) { + this.timer.stop(); + this.timer = null; + } } else { super.userEventTriggered(ctx, evt); } @@ -268,6 +290,7 @@ public void fireDiscovered(Configuration c) { public SendRequestContext sendRequest(T1 packet) { return new DefaultSendRequestContext<>(handler -> { logger.trace("Adding Response Handler ..."); + handler.setTimeoutHandle(createTimeout(handler)); registeredHandlers.add(handler); }, packet, this); } @@ -276,6 +299,7 @@ public SendRequestContext sendRequest(T1 packet) { public ExpectRequestContext expectRequest(Class clazz, Duration timeout) { return new DefaultExpectRequestContext<>(handler -> { logger.trace("Adding Request Handler ..."); + handler.setTimeoutHandle(createTimeout(handler)); registeredHandlers.add(handler); }, clazz, timeout, this); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java index dbbabb51e80..cf7bf458113 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/Plc4xProtocolBase.java @@ -18,6 +18,7 @@ */ package org.apache.plc4x.java.spi; +import io.netty.util.Timer; import org.apache.commons.lang3.NotImplementedException; import org.apache.plc4x.java.api.messages.*; import org.apache.plc4x.java.spi.context.DriverContext; @@ -28,6 +29,8 @@ public abstract class Plc4xProtocolBase { protected ConversationContext context; + protected Timer timer; + protected DriverContext driverContext; public void setDriverContext(DriverContext driverContext) { @@ -42,6 +45,10 @@ public void setContext(ConversationContext context) { this.context = context; } + public void setTimer(Timer timer) { + this.timer = timer; + } + public void onConnect(ConversationContext context) { // Intentionally do nothing here } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java index cd034bda35d..69801c3908f 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/ChannelFactory.java @@ -21,10 +21,11 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; +import io.netty.util.Timer; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; public interface ChannelFactory { - + Timer getTimer(); Channel createChannel(ChannelHandler channelHandler) throws PlcConnectionException; boolean isPassive(); 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 7e301043182..e2221492d0b 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 @@ -28,6 +28,7 @@ import org.apache.plc4x.java.api.listener.ConnectionStateListener; import org.apache.plc4x.java.api.listener.EventListener; import org.apache.plc4x.java.api.value.PlcValueHandler; +import org.apache.plc4x.java.spi.Plc4xProtocolBase; import org.apache.plc4x.java.spi.configuration.Configuration; import org.apache.plc4x.java.spi.configuration.ConfigurationFactory; import org.apache.plc4x.java.spi.events.*; @@ -123,6 +124,7 @@ public void connect() throws PlcConnectionException { channel = channelFactory.createChannel(getChannelHandler(sessionSetupCompleteFuture, sessionDisconnectCompleteFuture, sessionDiscoveredCompleteFuture)); channel.closeFuture().addListener(future -> { if (!sessionSetupCompleteFuture.isDone()) { + channel.pipeline().fireUserEventTriggered(new CloseConnectionEvent()); sessionSetupCompleteFuture.completeExceptionally( new PlcIoException("Connection terminated by remote")); } @@ -152,6 +154,11 @@ public void connect() throws PlcConnectionException { */ @Override public void close() throws PlcConnectionException { + if(channel == null) + { + connected = false; + return; + } logger.debug("Closing connection to PLC, await for disconnect = {}", awaitSessionDisconnectComplete); channel.pipeline().fireUserEventTriggered(new DisconnectEvent()); try { @@ -212,22 +219,45 @@ public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exc } else if (evt instanceof DisconnectedEvent) { sessionDisconnectCompleteFuture.complete(null); eventListeners.forEach(ConnectionStateListener::disconnected); + super.userEventTriggered(ctx, evt); } else if (evt instanceof DiscoveredEvent) { sessionDiscoverCompleteFuture.complete(((DiscoveredEvent) evt).getConfiguration()); + } else if (evt instanceof ConnectEvent) { + if (!sessionSetupCompleteFuture.isCompletedExceptionally()) { + if (awaitSessionSetupComplete) { + setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(), + channelFactory.isPassive())); + } + super.userEventTriggered(ctx, evt); + } } else { super.userEventTriggered(ctx, evt); } } }); + pipeline.addLast(new ChannelInboundHandlerAdapter() { + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws PlcConnectionException { + logger.error("unknown error, close the connection", cause); + close(); + } + } + ); // Initialize via Transport Layer channelFactory.initializePipeline(pipeline); // Initialize Protocol Layer - setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(), - channelFactory.isPassive())); + if (!awaitSessionSetupComplete) { + setProtocol(stackConfigurer.configurePipeline(configuration, pipeline, getAuthentication(), + channelFactory.isPassive())); + } } }; } - + @Override + public void setProtocol(Plc4xProtocolBase protocol) { + super.setProtocol(protocol); + protocol.setTimer(channelFactory.getTimer()); + } protected void sendChannelCreatedEvent() { logger.trace("Channel was created, firing ChannelCreated Event"); // Send an event to the pipeline telling the Protocol filters what's going on. diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java index 8c9d6f91289..8220ae60d18 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/NettyChannelFactory.java @@ -24,6 +24,8 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.util.HashedWheelTimer; +import io.netty.util.Timer; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,6 +44,14 @@ public abstract class NettyChannelFactory implements ChannelFactory { private static final Logger logger = LoggerFactory.getLogger(NettyChannelFactory.class); + protected static HashedWheelTimer timer = new HashedWheelTimer(); + @Override + public Timer getTimer(){ + if(timer==null){ + timer = new HashedWheelTimer(); + } + return timer; + } private final Map eventLoops = new ConcurrentHashMap<>(); /** @@ -151,6 +161,8 @@ public void closeEventLoopForChannel(Channel channel) { EventLoopGroup eventExecutors = eventLoops.get(channel); eventLoops.remove(channel); eventExecutors.shutdownGracefully().awaitUninterruptibly(); + timer.stop(); + timer = null; logger.info("Worker Group was closed successfully!"); } else { logger.warn("Trying to remove EventLoop for Channel {} but have none stored", channel); diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java index 9f918cdc81b..2c28e8608bb 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/generation/WriteBufferByteBased.java @@ -45,10 +45,12 @@ public WriteBufferByteBased(int size, ByteOrder byteOrder) { this.byteOrder = byteOrder; } + @Override public ByteOrder getByteOrder() { return byteOrder; } + @Override public void setByteOrder(ByteOrder byteOrder) { this.byteOrder = byteOrder; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java index 7dc9216d8b5..bef8bc6f07e 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/internal/HandlerRegistration.java @@ -18,13 +18,12 @@ */ package org.apache.plc4x.java.spi.internal; +import io.netty.util.Timeout; import io.vavr.control.Either; import java.time.Duration; -import java.time.Instant; import java.util.Deque; import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @@ -46,7 +45,7 @@ public class HandlerRegistration { private final BiConsumer errorConsumer; private final Duration timeout; - private final Instant timeoutAt; + private Timeout timeoutHandle; private volatile boolean cancelled = false; private volatile boolean handled = false; @@ -58,7 +57,6 @@ public HandlerRegistration(Deque, Predicate>> commands, this.onTimeoutConsumer = onTimeoutConsumer; this.errorConsumer = errorConsumer; this.timeout = timeout; - this.timeoutAt = Instant.now().plus(timeout); } public Deque, Predicate>> getCommands() { @@ -85,8 +83,12 @@ public Duration getTimeout() { return timeout; } - public Instant getTimeoutAt() { - return timeoutAt; + public void setTimeoutHandle(Timeout timeoutHandle) { + this.timeoutHandle = timeoutHandle; + } + + public Timeout getTimeoutHandle() { + return timeoutHandle; } public void cancel() { diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java index 2a5b2953e47..91f2605b672 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java @@ -27,6 +27,7 @@ import org.apache.plc4x.java.api.messages.PlcWriteRequest; import org.apache.plc4x.java.api.messages.PlcWriteResponse; import org.apache.plc4x.java.api.model.PlcTag; +import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; @@ -93,6 +94,7 @@ public List getTags() { return tags.values().stream().map(TagValueItem::getTag).collect(Collectors.toCollection(LinkedList::new)); } + @Override @JsonIgnore public PlcValue getPlcValue(String name) { return tags.get(name).getValue(); @@ -194,6 +196,9 @@ public PlcWriteRequest build() { PlcTag tag = tagValues.getLeft().get(); Object[] value = tagValues.getRight(); PlcValue plcValue = valueHandler.newPlcValue(tag, value); + if(tag.getPlcValueType()== PlcValueType.NULL){ + tag.setPlcValueType(plcValue.getPlcValueType()); + } parsedTags.put(name, new TagValueItem(tag, plcValue)); }); return new DefaultPlcWriteRequest(writer, parsedTags); diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java index 8d4f3d41f5f..9fb29c02469 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/model/DefaultPlcSubscriptionTag.java @@ -59,7 +59,7 @@ public PlcValueType getPlcValueType() { public List getArrayInfo() { return plcTag.getArrayInfo(); } - + @Override public PlcSubscriptionType getPlcSubscriptionType() { return plcSubscriptionType; } @@ -67,7 +67,7 @@ public PlcSubscriptionType getPlcSubscriptionType() { public PlcTag getTag() { return plcTag; } - + @Override public Optional getDuration() { return Optional.ofNullable(duration); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java index 3592ff2e552..4fba0210757 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/transaction/RequestTransactionManager.java @@ -18,21 +18,16 @@ */ package org.apache.plc4x.java.spi.transaction; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import java.util.Objects; import java.util.Queue; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import org.apache.commons.lang3.concurrent.BasicThreadFactory; /** * This is a limited Queue of Requests, a Protocol can use. @@ -49,25 +44,23 @@ public class RequestTransactionManager { private static final Logger logger = LoggerFactory.getLogger(RequestTransactionManager.class); /** Executor that performs all operations */ - //static final ExecutorService executor = Executors.newScheduledThreadPool(4); - - final ExecutorService executor = Executors.newFixedThreadPool(4, new BasicThreadFactory.Builder() - .namingPattern("plc4x-tm-thread-%d") - .daemon(true) - .priority(Thread.MAX_PRIORITY) - .build()); - + private final ExecutorService executor; private final Set runningRequests; /** How many Transactions are allowed to run at the same time? */ private int numberOfConcurrentRequests; /** Assigns each request a Unique Transaction Id, especially important for failure handling */ - private AtomicInteger transactionId = new AtomicInteger(0); + private final AtomicInteger transactionId = new AtomicInteger(0); /** Important, this is a FIFO Queue for Fairness! */ - private Queue workLog = new ConcurrentLinkedQueue<>(); + private final Queue workLog = new ConcurrentLinkedQueue<>(); public RequestTransactionManager(int numberOfConcurrentRequests) { this.numberOfConcurrentRequests = numberOfConcurrentRequests; // Immutable Map + executor = new ThreadPoolExecutor(0, numberOfConcurrentRequests, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue<>(1024), + new BasicThreadFactory.Builder().namingPattern("RequestTransactionManager-pool-%d").daemon(true).build(), + new ThreadPoolExecutor.AbortPolicy());; runningRequests = ConcurrentHashMap.newKeySet(); } @@ -91,13 +84,13 @@ public void setNumberOfConcurrentRequests(int numberOfConcurrentRequests) { // As we might have increased the number, try to send some more requests. processWorklog(); } - + /* * It allows the sequential shutdown of the associated driver. */ public void shutdown(){ executor.shutdown(); - } + } public void submit(Consumer context) { RequestTransaction transaction = startRequest(); @@ -114,7 +107,7 @@ void submit(RequestTransaction handle) { processWorklog(); } - private void processWorklog() { + private synchronized void processWorklog() { while (runningRequests.size() < getNumberOfConcurrentRequests() && !workLog.isEmpty()) { RequestTransaction next = workLog.poll(); if (next != null) { @@ -219,11 +212,11 @@ public TransactionOperation(int transactionId, Runnable delegate) { this.delegate = delegate; } - //TODO: Check MDC used. Created exception in Hop application + //TODO: Check MDC used. Created exception in Hop application @Override public void run() { //try (final MDC.MDCCloseable closeable = MDC.putCloseable("plc4x.transactionId", Integer.toString(transactionId))) { - try{ + try{ logger.trace("Start execution of transaction {}", transactionId); delegate.run(); logger.trace("Completed execution of transaction {}", transactionId); diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java index ed8e9b4b7fd..6ebac628224 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBOOL.java @@ -56,6 +56,8 @@ public static PlcBOOL of(Object value) { return new PlcBOOL((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcBOOL((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcBOOL(((Number) value).intValue()); } else { return new PlcBOOL((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java index c950f4cc76a..0f5b0ddff02 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcBYTE.java @@ -57,6 +57,8 @@ public static PlcBYTE of(Object value) { return new PlcBYTE((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcBYTE((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcBYTE(((Number) value).intValue()); } else { return new PlcBYTE((String) value); } @@ -69,9 +71,9 @@ public PlcBYTE(Boolean value) { } public PlcBYTE(Byte value) { - if ((value < minValue) || (value > maxValue)) { - throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); - } + //if ((value < minValue) || (value > maxValue)) { + // throw new PlcInvalidFieldException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); + //} this.value = value.shortValue(); this.isNullable = false; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java index 54da8290b86..317633c8f5f 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcCHAR.java @@ -58,6 +58,8 @@ public static PlcCHAR of(Object value) { return new PlcCHAR((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcCHAR((BigDecimal) value); + } else if (value instanceof Character) { + return new PlcCHAR((Character) value); } else { return new PlcCHAR((String) value); } @@ -72,92 +74,128 @@ public PlcCHAR(Boolean value) { public PlcCHAR(Character value) { super(); Integer val = (int) value; + this.value = val.shortValue(); + this.isNullable = false; + /* if ((val >= minValue) && (val <= maxValue)) { this.value = val.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Byte value) { super(); + this.value = value.shortValue(); + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue)) { this.value = value.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Short value) { super(); + this.value = value; + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue)) { this.value = value; this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Integer value) { super(); + this.value = value.shortValue(); + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue)) { this.value = value.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Long value) { super(); + this.value = value.shortValue(); + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue)) { this.value = value.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Float value) { super(); + this.value = value.shortValue(); + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue) && (value % 1 == 0)) { this.value = value.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(Double value) { super(); + this.value = value.shortValue(); + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue) && (value % 1 == 0)) { this.value = value.shortValue(); this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(BigInteger value) { super(); + this.value = value.shortValue(); + this.isNullable = true; + /* if ((value.compareTo(BigInteger.valueOf(minValue)) >= 0) && (value.compareTo(BigInteger.valueOf(maxValue)) <= 0)) { this.value = value.shortValue(); this.isNullable = true; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(BigDecimal value) { super(); + this.value = value.shortValue(); + this.isNullable = true; + /* if ((value.compareTo(BigDecimal.valueOf(minValue)) >= 0) && (value.compareTo(BigDecimal.valueOf(maxValue)) <= 0) && (value.scale() <= 0)) { this.value = value.shortValue(); this.isNullable = true; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } public PlcCHAR(String value) { @@ -169,12 +207,15 @@ public PlcCHAR(String value) { s = " "; } short val = (short) s.charAt(0); + this.isNullable = false; + /* if ((val >= minValue) && (val <= maxValue)) { this.value = val; this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } catch (Exception e) { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } @@ -183,12 +224,16 @@ public PlcCHAR(String value) { @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) public PlcCHAR(@JsonProperty("value") short value) { super(); + this.value = value; + this.isNullable = false; + /* if ((value >= minValue) && (value <= maxValue)) { this.value = value; this.isNullable = false; } else { throw new PlcInvalidTagException(String.format(VALUE_OUT_OF_RANGE, value, minValue, maxValue, this.getClass().getSimpleName())); } + */ } @Override diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java index 03863dd3b07..3498ee73fe8 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java @@ -30,6 +30,8 @@ import java.nio.charset.StandardCharsets; import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className") public class PlcDATE_AND_TIME extends PlcSimpleValue { @@ -41,6 +43,37 @@ public static PlcDATE_AND_TIME of(Object value) { return new PlcDATE_AND_TIME(LocalDateTime.ofInstant( Instant.ofEpochSecond((long) value), ZoneId.systemDefault())); } + if (value instanceof Instant) { + return new PlcDATE_AND_TIME(((Instant) value).toEpochMilli()); + } + if (value instanceof LocalDate) { + return new PlcDATE_AND_TIME(((LocalDate) value).atStartOfDay(ZoneId.of("UTC")).toLocalDateTime()); + } else if (value instanceof String) { + String strValue = (String) value; + LocalDateTime date; + try { + date = LocalDateTime.parse(strValue); + } catch (DateTimeParseException e) { + try { + date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } catch (DateTimeParseException e1) { + try { + date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss")); + } catch (DateTimeParseException e2) { + try { + date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } catch (DateTimeParseException e3) { + try { + date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } catch (DateTimeParseException e4) { + date = LocalDateTime.parse(strValue, DateTimeFormatter.ofPattern("yyyyMMdd")); + } + } + } + } + } + return new PlcDATE_AND_TIME(date); + } throw new PlcRuntimeException("Invalid value type"); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java index 5bedf773f18..8f689d9731e 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDINT.java @@ -56,6 +56,8 @@ public static PlcDINT of(Object value) { return new PlcDINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcDINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcDINT(((Number) value).intValue()); } else { return new PlcDINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java index b3649f686c9..94b973d37a0 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDWORD.java @@ -57,6 +57,8 @@ public static PlcDWORD of(Object value) { return new PlcDWORD((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcDWORD((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcDWORD(((Number) value).longValue()); } else { return new PlcDWORD((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java index eafd49ba482..1286f40c0dc 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcINT.java @@ -56,6 +56,8 @@ public static PlcINT of(Object value) { return new PlcINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcINT(((Number) value).intValue()); } else { return new PlcINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java index dcdea8c6de6..1f787b7fe8d 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLINT.java @@ -56,6 +56,8 @@ public static PlcLINT of(Object value) { return new PlcLINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcLINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcLINT(((Number) value).intValue()); } else { return new PlcLINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java index 23d6cc8f75c..2938b02939a 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLREAL.java @@ -56,6 +56,8 @@ public static PlcLREAL of(Object value) { return new PlcLREAL((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcLREAL((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcLREAL(((Number) value).doubleValue()); } else { return new PlcLREAL((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java index 60502992cea..2cecf53ac08 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME.java @@ -28,9 +28,12 @@ import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.time.Period; +import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className") @@ -46,6 +49,19 @@ public static PlcLTIME of(Object value) { } else if(value instanceof BigInteger) { // TODO: Not 100% correct, we're loosing precision here return new PlcLTIME(Duration.of(((BigInteger) value).longValue(), ChronoUnit.NANOS)); + } else if (value instanceof Number) { + return new PlcLTIME(((Number) value).longValue()); + } else if (value instanceof String) { + try { + return new PlcLTIME(Duration.parse((String) value)); + } catch (DateTimeParseException e) { + try { + return new PlcLTIME(Period.parse((String) value).get(ChronoUnit.NANOS)); + }catch (DateTimeParseException e1) + { + return new PlcLTIME(new BigDecimal((String) value).longValue()); + } + } } throw new PlcRuntimeException("Invalid value type"); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java index e4959ec3c91..c5c941853a2 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLWORD.java @@ -55,6 +55,8 @@ public static PlcLWORD of(Object value) { return new PlcLWORD((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcLWORD((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcLWORD(((Number) value).longValue()); } else { return new PlcLWORD((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java index 96c067d467b..99842a9ae59 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcSINT.java @@ -56,6 +56,8 @@ public static PlcSINT of(Object value) { return new PlcSINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcSINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcSINT(((Number) value).longValue()); } else { return new PlcSINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java index 23fb48004ee..90482c3b9ae 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME.java @@ -28,8 +28,11 @@ import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.time.Duration; +import java.time.Period; +import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className") @@ -42,6 +45,19 @@ public static PlcTIME of(Object value) { return new PlcTIME(Duration.of((long) value, ChronoUnit.MILLIS)); } else if (value instanceof Long) { return new PlcTIME(Duration.of((long) value, ChronoUnit.MILLIS)); + } else if (value instanceof Number) { + return new PlcTIME(((Number) value).longValue()); + } else if (value instanceof String) { + try { + return new PlcTIME(Duration.parse((String) value)); + } catch (DateTimeParseException e) { + try { + return new PlcTIME(Period.parse((String) value).get(ChronoUnit.MILLIS)); + }catch (DateTimeParseException e1) + { + return new PlcTIME(new BigDecimal((String) value).longValue()); + } + } } throw new PlcRuntimeException("Invalid value type"); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java index 17aae62d540..551d511b661 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java @@ -29,7 +29,9 @@ import org.apache.plc4x.java.spi.generation.WriteBuffer; import java.nio.charset.StandardCharsets; +import java.time.Instant; import java.time.LocalTime; +import java.time.ZoneId; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className") public class PlcTIME_OF_DAY extends PlcSimpleValue { @@ -39,6 +41,8 @@ public static PlcTIME_OF_DAY of(Object value) { return new PlcTIME_OF_DAY((LocalTime) value); } else if(value instanceof Long) { return new PlcTIME_OF_DAY((Long) value); + } else if (value instanceof Number) { + return new PlcTIME_OF_DAY(((Number) value).longValue()); } throw new PlcRuntimeException("Invalid value type"); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java index e93a1cc45ff..2eb2ec45da3 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUDINT.java @@ -56,6 +56,8 @@ public static PlcUDINT of(Object value) { return new PlcUDINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcUDINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcUDINT(((Number) value).longValue()); } else { return new PlcUDINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java index e1561e004f7..6e43ca5732d 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUINT.java @@ -56,6 +56,8 @@ public static PlcUINT of(Object value) { return new PlcUINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcUINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcUINT(((Number) value).longValue()); } else { return new PlcUINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java index 8a951fb7749..f24daba8752 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcULINT.java @@ -54,6 +54,8 @@ public static PlcULINT of(Object value) { return new PlcULINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcULINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcULINT(((Number) value).longValue()); } else { return new PlcULINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java index 6a5a076e2ad..ab4cf79e9d7 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcUSINT.java @@ -56,6 +56,8 @@ public static PlcUSINT of(Object value) { return new PlcUSINT((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcUSINT((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcUSINT(((Number) value).intValue()); } else { return new PlcUSINT((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java index d1691f051bf..1d22cc43526 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcValueHandler.java @@ -18,17 +18,23 @@ */ package org.apache.plc4x.java.spi.values; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException; import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException; import org.apache.plc4x.java.api.model.PlcTag; import org.apache.plc4x.java.api.value.PlcValue; +import java.math.BigDecimal; import java.math.BigInteger; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; public class PlcValueHandler implements org.apache.plc4x.java.api.value.PlcValueHandler { @@ -58,6 +64,15 @@ public static PlcValue of(List value) { public static PlcValue of(Object[] values) { if (values.length != 1) { + Object vo = ((Object[]) values)[0]; + if (vo instanceof PlcCHAR) { + String v = Arrays.stream(values).map(Objects::toString).collect(Collectors.joining()); + return PlcSTRING.of(v); + } + if (vo instanceof PlcWCHAR) { + String v = Arrays.stream(values).map(Objects::toString).collect(Collectors.joining()); + return PlcSTRING.of(v); + } PlcList list = new PlcList(); for (Object value : values) { list.add(of(new Object[]{value})); @@ -83,6 +98,16 @@ public static PlcValue of(Object[] values) { if (value instanceof Long) { return PlcLINT.of(value); } + if (value instanceof BigInteger) { + try { + return new PlcLINT((BigInteger) value); + }catch (PlcInvalidTagException e) { + return new PlcULINT((BigInteger) value); + } + } + if (value instanceof BigDecimal) { + return new PlcLINT((BigDecimal) value); + } if (value instanceof Float) { return PlcREAL.of(value); } @@ -116,13 +141,12 @@ public static PlcValue of(PlcTag tag, Object value) { return of(tag, new Object[]{value}); } - public static PlcValue of(PlcTag tag, Object[] values) { if (values.length == 1) { Object value = values[0]; - if(tag.getPlcValueType() == null) { + if (tag.getPlcValueType() == null) { // TODO: This is a hacky shortcut .. - if(value instanceof PlcValue) { + if (value instanceof PlcValue) { return (PlcValue) value; } return new PlcNull(); @@ -131,16 +155,14 @@ public static PlcValue of(PlcTag tag, Object[] values) { case BOOL: return PlcBOOL.of(value); case BYTE: - if(value instanceof Short) { - return new PlcBYTE((short) value); - } else if(value instanceof Integer) { - return new PlcBYTE(((Integer) value).shortValue()); - } else if(value instanceof Long) { - return new PlcBYTE(((Long) value).shortValue()); - } else if(value instanceof BigInteger) { - return new PlcBYTE(((BigInteger) value).shortValue()); + if (tag.getNumberOfElements() > 1) { + if (value instanceof byte[]) { + return of(tag, ArrayUtils.toObject((byte[]) value)); + } else if (value instanceof String && ((String) value).contains(",")) { + return of(tag, stringToByteArray((String) value)); + } } - throw new PlcRuntimeException("BYTE requires short"); + return PlcBYTE.of(value); case SINT: return PlcSINT.of(value); case USINT: @@ -150,13 +172,13 @@ public static PlcValue of(PlcTag tag, Object[] values) { case UINT: return PlcUINT.of(value); case WORD: - if(value instanceof Short) { + if (value instanceof Short) { return new PlcWORD((int) value); - } else if(value instanceof Integer) { + } else if (value instanceof Integer) { return new PlcWORD((int) value); - } else if(value instanceof Long) { + } else if (value instanceof Long) { return new PlcWORD(((Long) value).intValue()); - } else if(value instanceof BigInteger) { + } else if (value instanceof BigInteger) { return new PlcWORD(((BigInteger) value).intValue()); } throw new PlcRuntimeException("WORD requires int"); @@ -165,13 +187,13 @@ public static PlcValue of(PlcTag tag, Object[] values) { case UDINT: return PlcUDINT.of(value); case DWORD: - if(value instanceof Short) { + if (value instanceof Short) { return new PlcDWORD((long) value); - } else if(value instanceof Integer) { + } else if (value instanceof Integer) { return new PlcDWORD((long) value); - } else if(value instanceof Long) { + } else if (value instanceof Long) { return new PlcDWORD((long) value); - } else if(value instanceof BigInteger) { + } else if (value instanceof BigInteger) { return new PlcDWORD(((BigInteger) value).longValue()); } throw new PlcRuntimeException("DWORD requires long"); @@ -180,13 +202,13 @@ public static PlcValue of(PlcTag tag, Object[] values) { case ULINT: return PlcULINT.of(value); case LWORD: - if(value instanceof Short) { + if (value instanceof Short) { return new PlcLWORD(BigInteger.valueOf((long) value)); - } else if(value instanceof Integer) { + } else if (value instanceof Integer) { return new PlcLWORD(BigInteger.valueOf((long) value)); - } else if(value instanceof Long) { + } else if (value instanceof Long) { return new PlcLWORD(BigInteger.valueOf((long) value)); - } else if(value instanceof BigInteger) { + } else if (value instanceof BigInteger) { return new PlcLWORD((BigInteger) value); } throw new PlcRuntimeException("LWORD requires BigInteger"); @@ -225,4 +247,15 @@ public static PlcValue of(PlcTag tag, Object[] values) { public static PlcValue customDataType(Object[] values) { return of(values); } + + private static byte[] stringToByteArray(String stringBytes) { + String[] byteValues = stringBytes.substring(1, stringBytes.length() - 1).split(","); + byte[] bytes = new byte[byteValues.length]; + + for (int i = 0, len = bytes.length; i < len; i++) { + int intvalue = Integer.parseInt(byteValues[i].trim()); + bytes[i] = (byte) (intvalue & 0xff); + } + return bytes; + } } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java index 927cc2b3482..9bfabd9e90c 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWCHAR.java @@ -58,6 +58,8 @@ public static PlcWCHAR of(Object value) { return new PlcWCHAR((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcWCHAR((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcWCHAR(((Number) value).intValue()); } else { return new PlcWCHAR((String) value); } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java index dcebcb8e8da..b4ace8ebc0f 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcWORD.java @@ -57,6 +57,8 @@ public static PlcWORD of(Object value) { return new PlcWORD((BigInteger) value); } else if (value instanceof BigDecimal) { return new PlcWORD((BigDecimal) value); + } else if (value instanceof Number) { + return new PlcWORD(((Number) value).longValue()); } else { return new PlcWORD((String) value); } diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java index 3b360c3b918..4ac51ce8e9a 100644 --- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java +++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/Plc4xNettyWrapperTest.java @@ -90,8 +90,8 @@ void conversationTimeoutTest() throws Exception { Thread.sleep(750); - verify(false, false, false); - wrapper.decode(channelHandlerContext, new Date(), new ArrayList<>()); + //verify(false, false, false); + //wrapper.decode(channelHandlerContext, new Date(), new ArrayList<>()); verify(true, false, false); } diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java index 186b358ce03..a8aabcc76d0 100644 --- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java +++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/optimizer/RequestTransactionManagerTest.java @@ -27,7 +27,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertTrue; public class RequestTransactionManagerTest { @@ -124,11 +124,10 @@ public void version2() throws ExecutionException, InterruptedException { } @Test - @Disabled("This test is randomly failing on Jenkins") + //@Disabled("This test is randomly failing on Jenkins") public void abortTransactionFromExternally() throws ExecutionException, InterruptedException { CompletableFuture sendRequest = new CompletableFuture<>(); CompletableFuture receiveResponse = new CompletableFuture<>(); - CompletableFuture transactionIsFinished = new CompletableFuture<>(); RequestTransactionManager tm = new RequestTransactionManager(); RequestTransactionManager.RequestTransaction handle = tm.startRequest(); @@ -136,10 +135,16 @@ public void abortTransactionFromExternally() throws ExecutionException, Interrup // ... sendRequest.complete(null); // Receive - receiveResponse.thenAccept((n) -> { - handle.endRequest(); - transactionIsFinished.complete(null); + receiveResponse.whenComplete((n,e) -> { + // never execute + fail(); }); + //Wait that the fail is handled internally surely and then interrupt this block execute + try { + receiveResponse.get(); + } catch (Exception e) { + assertInstanceOf(InterruptedException.class,e); + } }); // Assert that there is a request going on @@ -149,13 +154,14 @@ public void abortTransactionFromExternally() throws ExecutionException, Interrup handle.failRequest(new RuntimeException()); // Wait that the fail is handled internally surely - Thread.sleep(100); + //Thread.sleep(100); // Assert that no requests are active assertEquals(0, tm.getNumberOfActiveRequests()); // Assert that its cancelled assertTrue(handle.getCompletionFuture().isCancelled()); + assertFalse(receiveResponse.isDone()); } private void sendRequest(RequestTransactionManager tm, CompletableFuture sendRequest, CompletableFuture endRequest, CompletableFuture requestIsEnded) { diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java index 650d976c854..ae30a14d4ca 100644 --- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java +++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/CachedPlcConnectionManager.java @@ -21,6 +21,7 @@ import org.apache.plc4x.java.DefaultPlcDriverManager; import org.apache.plc4x.java.api.PlcConnection; import org.apache.plc4x.java.api.PlcConnectionManager; +import org.apache.plc4x.java.api.PlcDriverManager; import org.apache.plc4x.java.api.authentication.PlcAuthentication; import org.apache.plc4x.java.api.exceptions.PlcConnectionException; import org.slf4j.Logger; @@ -58,17 +59,26 @@ public CachedPlcConnectionManager(PlcConnectionManager connectionManager, Durati this.connectionContainers = new HashMap<>(); } + @Override public PlcConnection getConnection(String url) throws PlcConnectionException { + return getConnection(url,null); + } + + @Override + public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException { ConnectionContainer connectionContainer; synchronized (connectionContainers) { connectionContainer = connectionContainers.get(url); - if (connectionContainers.get(url) == null) { + if (connectionContainer == null) { LOG.debug("Creating new connection"); // Establish the real connection to the plc - PlcConnection connection = connectionManager.getConnection(url); - - // Crate a connection container to manage handling this connection + PlcConnection connection; + if(authentication!=null) { + connection = connectionManager.getConnection(url,authentication); + } else{ + connection = connectionManager.getConnection(url); + } connectionContainer = new ConnectionContainer(connection, maxLeaseTime); connectionContainers.put(url, connectionContainer); } else { @@ -85,8 +95,9 @@ public PlcConnection getConnection(String url) throws PlcConnectionException { } } - public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException { - throw new PlcConnectionException("the cached driver manager currently doesn't support authentication"); + @Override + public PlcDriverManager getDriverManager() { + return connectionManager.getDriverManager(); } public static class Builder { diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java index 662dd294c46..7dcbd42d64c 100644 --- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java +++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/cache/LeasedPlcConnection.java @@ -34,13 +34,13 @@ public class LeasedPlcConnection implements PlcConnection { - private final ConnectionContainer connectionContainer; + private ConnectionContainer connectionContainer; private PlcConnection connection; - + private Timer usageTimer; public LeasedPlcConnection(ConnectionContainer connectionContainer, PlcConnection connection, Duration maxUseTime) { this.connectionContainer = connectionContainer; this.connection = connection; - Timer usageTimer = new Timer(); + usageTimer = new Timer(); usageTimer.schedule(new TimerTask() { @Override public void run() { @@ -51,11 +51,18 @@ public void run() { @Override public synchronized void close() { - // Make the connection unusable. - connection = null; - + if(usageTimer != null){ + usageTimer.cancel(); + usageTimer = null; + } + if(connectionContainer == null) { + return; + } // Tell the connection container that the connection is free to be reused. connectionContainer.returnConnection(this); + // Make the connection unusable. + connection = null; + connectionContainer = null; } @Override diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java index 6d856ea4487..07c90775b62 100644 --- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java +++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xValue.java @@ -158,6 +158,24 @@ public static PlcValue staticParse(ReadBuffer readBuffer, Plc4xValueType valueTy String value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16")); + return new PlcSTRING(value); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString( + readBuffer, "UTF-8")); + + return new PlcSTRING(value); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + + // Manual Field (value) + String value = + (String) + (org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.parseString( + readBuffer, "UTF-16")); + return new PlcSTRING(value); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME @@ -325,6 +343,14 @@ public static void staticSerialize( /*TODO: migrate me*/ /*TODO: migrate me*/ writeBuffer.writeString( "", 16, (String) (value), WithOption.WithEncoding("UTF-16")); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + // Manual Field (value) + org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString( + writeBuffer, _value, "UTF-8"); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + // Manual Field (value) + org.apache.plc4x.java.plc4x.readwrite.utils.StaticHelper.serializeString( + writeBuffer, _value, "UTF-16"); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME // Simple Field (milliseconds) long milliseconds = (long) _value.getLong(); @@ -436,6 +462,12 @@ public static int getLengthInBits(PlcValue _value, Plc4xValueType valueType) { } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WCHAR)) { // STRING // Simple Field (value) sizeInBits += 16; + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.STRING)) { // STRING + // Manual Field (value) + sizeInBits += (((STR_LEN(_value)) + (1))) * (8); + } else if (EvaluationHelper.equals(valueType, Plc4xValueType.WSTRING)) { // STRING + // Manual Field (value) + sizeInBits += (((STR_LEN(_value)) + (1))) * (16); } else if (EvaluationHelper.equals(valueType, Plc4xValueType.TIME)) { // TIME // Simple Field (milliseconds) sizeInBits += 32; diff --git a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java new file mode 100644 index 00000000000..6ef16fd01cb --- /dev/null +++ b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/plc4x/readwrite/utils/StaticHelper.java @@ -0,0 +1,94 @@ +/* + * 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.plc4x.readwrite.utils; + +import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; +import org.apache.plc4x.java.api.value.PlcValue; +import org.apache.plc4x.java.spi.generation.ParseException; +import org.apache.plc4x.java.spi.generation.ReadBuffer; +import org.apache.plc4x.java.spi.generation.SerializationException; +import org.apache.plc4x.java.spi.generation.WriteBuffer; + +import java.nio.charset.StandardCharsets; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class StaticHelper { + + public static String parseString(ReadBuffer io, String encoding) { + try { + if ("UTF-8".equalsIgnoreCase(encoding)) { + // This is the maximum number of bytes a string can be long. + short stringLength = io.readUnsignedShort(8); + // This is the total length of the string on the PLC (Not necessarily the number of characters read) + final byte[] byteArray = new byte[stringLength]; + for (int i = 0; (i < stringLength) && io.hasMore(8); i++) { + final byte curByte = io.readByte(); + byteArray[i] = curByte; + } + return new String(byteArray, StandardCharsets.UTF_8); + } else if ("UTF-16".equalsIgnoreCase(encoding)) { + // This is the maximum number of bytes a string can be long. + int stringLength = io.readUnsignedInt(16); + final byte[] byteArray = new byte[stringLength * 2]; + for (int i = 0; (i < stringLength) && io.hasMore(16); i++) { + final short curShort = io.readShort(16); + byteArray[i * 2] = (byte) (curShort >>> 8); + byteArray[(i * 2) + 1] = (byte) (curShort & 0xFF); + } + return new String(byteArray, StandardCharsets.UTF_16); + } else { + throw new PlcRuntimeException("Unsupported string encoding " + encoding); + } + } catch (ParseException e) { + throw new PlcRuntimeException("Error parsing string", e); + } + } + public static void serializeString(WriteBuffer io, PlcValue value, String encoding) { + String valueString = value.getString(); + valueString = valueString == null ? "" : valueString; + + if ("UTF-8".equalsIgnoreCase(encoding)) { + final byte[] raw = valueString.getBytes(StandardCharsets.UTF_8); + try { + io.writeByte((byte) raw.length); + for (byte b : raw) { + io.writeByte(b); + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else if ("UTF-16".equalsIgnoreCase(encoding)) { + final byte[] raw = valueString.getBytes(StandardCharsets.UTF_16); + try { + io.writeUnsignedInt(16, raw.length); + for (int i = 0; i < raw.length; i++) { + io.writeByte( raw[i]); + } + } + catch (SerializationException ex) { + Logger.getLogger(StaticHelper.class.getName()).log(Level.SEVERE, null, ex); + } + } else { + throw new PlcRuntimeException("Unsupported string encoding " + encoding); + } + + } +} \ No newline at end of file diff --git a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java index 7194b24ffce..f410a2f9c90 100644 --- a/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java +++ b/plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java @@ -57,7 +57,8 @@ public Plc4xServerAdapter() { public void channelRead(ChannelHandlerContext ctx, Object msg) { if (msg instanceof Plc4xMessage) { final Plc4xMessage plc4xMessage = (Plc4xMessage) msg; - switch (plc4xMessage.getRequestType()) { + Plc4xRequestType plc4xRequestType = plc4xMessage.getRequestType(); + switch (plc4xRequestType) { case CONNECT_REQUEST: { Plc4xConnectRequest request = (Plc4xConnectRequest) plc4xMessage; try (final PlcConnection ignored = connectionManager.getConnection(request.getConnectionString())) { @@ -169,6 +170,8 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) { ctx.writeAndFlush(response); } break; + default: + logger.error("Error executing plc4xRequestType: {}", plc4xRequestType); } } } diff --git a/plc4j/transports/pom.xml b/plc4j/transports/pom.xml index 04a8ddfb949..60fe78f266b 100644 --- a/plc4j/transports/pom.xml +++ b/plc4j/transports/pom.xml @@ -45,5 +45,19 @@ virtualcan test - + + + + org.apache.felix + maven-bundle-plugin + + + + * + + + + + + \ No newline at end of file diff --git a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java index 1fc1bedf394..efb79bc9621 100644 --- a/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java +++ b/plc4j/utils/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java @@ -100,11 +100,11 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception // Prepare a response and send it back to the remote. List parameters = new ArrayList<>(); - parameters.add(new COTPParameterCalledTsap(remoteTsapId, (short) 0)); - parameters.add(new COTPParameterCallingTsap(localTsapId, (short) 0)); - parameters.add(new COTPParameterTpduSize(tpduSize, (short) 0)); + parameters.add(new COTPParameterCalledTsap(remoteTsapId)); + parameters.add(new COTPParameterCallingTsap(localTsapId)); + parameters.add(new COTPParameterTpduSize(tpduSize)); COTPPacketConnectionResponse response = new COTPPacketConnectionResponse( - parameters, null, remoteReference, localReference, protocolClass, 0 + parameters, null, remoteReference, localReference, protocolClass ); ctx.writeAndFlush(new TPKTPacket(response)); @@ -143,7 +143,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception // TODO should send S7MessageResponseData S7MessageResponseData s7MessageResponse = new S7MessageResponseData( s7TpduReference, s7ParameterSetupCommunicationResponse, null, (short) 0, (short) 0); - ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7MessageResponse, true, cotpTpduRef, 0))); + ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7MessageResponse, true, cotpTpduRef))); state = State.S7_CONNECTED; break; @@ -204,11 +204,11 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception List responsePayloadItems = new ArrayList<>(); responsePayloadItems.add(readSzlResponsePayload); S7PayloadUserData responsePayloadUserData = - new S7PayloadUserData(responsePayloadItems, null); + new S7PayloadUserData(responsePayloadItems); S7Message s7ResponseMessage = new S7MessageUserData(s7TpduReference, responseParameterUserData, responsePayloadUserData); - ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7ResponseMessage, true, cotpTpduRef, 0))); + ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, s7ResponseMessage, true, cotpTpduRef))); } else { LOGGER.error("Not able to respond to the given request Read SZL with SZL type class " + szlId.getTypeClass().name() + " and SZL sublist " + szlId.getSublistList().name()); @@ -254,7 +254,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception final byte bitAddress = addressAny.getBitAddress(); switch (addressAny.getTransportSize()) { case BOOL: - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1} , true)); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[]{1})); break; case INT: case UINT: { @@ -264,7 +264,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception byte[] data = new byte[2]; data[1] = (byte) (shortValue & 0xff); data[0] = (byte) ((shortValue >> 8) & 0xff); - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data , true)); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data)); break; } default: { @@ -280,7 +280,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception addressAny.getNumberOfElements() : addressAny.getTransportSize().getSizeInBytes() * 8; final BitSet bitSet = toBitSet(context.getDigitalInputs(), ioNumber, numElements); final byte[] data = Arrays.copyOf(bitSet.toByteArray(), (numElements + 7) / 8); - payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data , true)); + payloadItems.add(new S7VarPayloadDataItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, data)); break; } } @@ -288,10 +288,10 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception } } S7ParameterReadVarResponse readVarResponseParameter = new S7ParameterReadVarResponse((short) items.size()); - S7PayloadReadVarResponse readVarResponsePayload = new S7PayloadReadVarResponse(payloadItems, null); + S7PayloadReadVarResponse readVarResponsePayload = new S7PayloadReadVarResponse(payloadItems); S7MessageResponseData response = new S7MessageResponseData(request.getTpduReference(), readVarResponseParameter, readVarResponsePayload, (short) 0x00, (short) 0x00); - ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, response, true, cotpTpduRef, 0))); + ctx.writeAndFlush(new TPKTPacket(new COTPPacketData(null, response, true, cotpTpduRef))); } else if (request.getParameter() instanceof S7ParameterWriteVarRequest) { S7ParameterWriteVarRequest writeVarRequestParameter = (S7ParameterWriteVarRequest) request.getParameter(); diff --git a/pom.xml b/pom.xml index cb1e1778632..55477ffa750 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ 4.2.0 1.4.3 - 1.70 + 1.71 1.12.22 3.22.1 @@ -475,17 +475,17 @@ org.bouncycastle - bcmail-jdk15on + bcmail-jdk18on ${bouncycastle.version} org.bouncycastle - bcpkix-jdk15on + bcpkix-jdk18on ${bouncycastle.version} org.bouncycastle - bcprov-jdk15on + bcprov-jdk18on ${bouncycastle.version} @@ -509,6 +509,16 @@ org.eclipse.milo stack-core ${milo.version} + + + org.bouncycastle + bcprov-jdk15on + + + org.bouncycastle + bcpkix-jdk15on + + org.eclipse.milo diff --git a/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv b/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv new file mode 100644 index 00000000000..c98a20b0834 --- /dev/null +++ b/protocols/opcua/downloads/Opc.Ua.NodeIds.Services.csv @@ -0,0 +1,1749 @@ +AccessLevelExType,15406,DataType +AccessLevelType,15031,DataType +AccessRestrictionType,95,DataType +AcknowledgeableConditionType,2881,ObjectType +ActivateSessionRequest,465,DataType +ActivateSessionRequest_Encoding_DefaultBinary,467,Object +ActivateSessionRequest_Encoding_DefaultJson,15145,Object +ActivateSessionRequest_Encoding_DefaultXml,466,Object +ActivateSessionResponse,468,DataType +ActivateSessionResponse_Encoding_DefaultBinary,470,Object +ActivateSessionResponse_Encoding_DefaultJson,15146,Object +ActivateSessionResponse_Encoding_DefaultXml,469,Object +AdditionalParametersType,16313,DataType +AdditionalParametersType_Encoding_DefaultBinary,17537,Object +AdditionalParametersType_Encoding_DefaultJson,17547,Object +AdditionalParametersType_Encoding_DefaultXml,17541,Object +AddNodesItem,376,DataType +AddNodesItem_Encoding_DefaultBinary,378,Object +AddNodesItem_Encoding_DefaultJson,15165,Object +AddNodesItem_Encoding_DefaultXml,377,Object +AddNodesRequest,486,DataType +AddNodesRequest_Encoding_DefaultBinary,488,Object +AddNodesRequest_Encoding_DefaultJson,15167,Object +AddNodesRequest_Encoding_DefaultXml,487,Object +AddNodesResponse,489,DataType +AddNodesResponse_Encoding_DefaultBinary,491,Object +AddNodesResponse_Encoding_DefaultJson,15168,Object +AddNodesResponse_Encoding_DefaultXml,490,Object +AddNodesResult,483,DataType +AddNodesResult_Encoding_DefaultBinary,485,Object +AddNodesResult_Encoding_DefaultJson,15166,Object +AddNodesResult_Encoding_DefaultXml,484,Object +AddReferencesItem,379,DataType +AddReferencesItem_Encoding_DefaultBinary,381,Object +AddReferencesItem_Encoding_DefaultJson,15169,Object +AddReferencesItem_Encoding_DefaultXml,380,Object +AddReferencesRequest,492,DataType +AddReferencesRequest_Encoding_DefaultBinary,494,Object +AddReferencesRequest_Encoding_DefaultJson,15170,Object +AddReferencesRequest_Encoding_DefaultXml,493,Object +AddReferencesResponse,495,DataType +AddReferencesResponse_Encoding_DefaultBinary,497,Object +AddReferencesResponse_Encoding_DefaultJson,15171,Object +AddReferencesResponse_Encoding_DefaultXml,496,Object +AddressSpaceFileType,11595,ObjectType +AggregateConfiguration,948,DataType +AggregateConfiguration_Encoding_DefaultBinary,950,Object +AggregateConfiguration_Encoding_DefaultJson,15304,Object +AggregateConfiguration_Encoding_DefaultXml,949,Object +AggregateConfigurationType,11187,ObjectType +AggregateFilter,728,DataType +AggregateFilter_Encoding_DefaultBinary,730,Object +AggregateFilter_Encoding_DefaultJson,15312,Object +AggregateFilter_Encoding_DefaultXml,729,Object +AggregateFilterResult,737,DataType +AggregateFilterResult_Encoding_DefaultBinary,739,Object +AggregateFilterResult_Encoding_DefaultJson,15315,Object +AggregateFilterResult_Encoding_DefaultXml,738,Object +AggregateFunction_AnnotationCount,2351,Object +AggregateFunction_Average,2342,Object +AggregateFunction_Count,2352,Object +AggregateFunction_Delta,2359,Object +AggregateFunction_DeltaBounds,11507,Object +AggregateFunction_DurationBad,2361,Object +AggregateFunction_DurationGood,2360,Object +AggregateFunction_DurationInStateNonZero,11308,Object +AggregateFunction_DurationInStateZero,11307,Object +AggregateFunction_End,2358,Object +AggregateFunction_EndBound,11506,Object +AggregateFunction_Interpolative,2341,Object +AggregateFunction_Maximum,2347,Object +AggregateFunction_Maximum2,11287,Object +AggregateFunction_MaximumActualTime,2349,Object +AggregateFunction_MaximumActualTime2,11306,Object +AggregateFunction_Minimum,2346,Object +AggregateFunction_Minimum2,11286,Object +AggregateFunction_MinimumActualTime,2348,Object +AggregateFunction_MinimumActualTime2,11305,Object +AggregateFunction_NumberOfTransitions,2355,Object +AggregateFunction_PercentBad,2363,Object +AggregateFunction_PercentGood,2362,Object +AggregateFunction_Range,2350,Object +AggregateFunction_Range2,11288,Object +AggregateFunction_StandardDeviationPopulation,11427,Object +AggregateFunction_StandardDeviationSample,11426,Object +AggregateFunction_Start,2357,Object +AggregateFunction_StartBound,11505,Object +AggregateFunction_TimeAverage,2343,Object +AggregateFunction_TimeAverage2,11285,Object +AggregateFunction_Total,2344,Object +AggregateFunction_Total2,11304,Object +AggregateFunction_VariancePopulation,11429,Object +AggregateFunction_VarianceSample,11428,Object +AggregateFunction_WorstQuality,2364,Object +AggregateFunction_WorstQuality2,11292,Object +AggregateFunctionType,2340,ObjectType +Aggregates,44,ReferenceType +AlarmConditionType,2915,ObjectType +AlarmGroupMember,16362,ReferenceType +AlarmGroupType,16405,ObjectType +AlarmMetricsType,17279,ObjectType +AlarmRateVariableType,17277,VariableType +Aliases,23470,Object +AliasFor,23469,ReferenceType +AliasNameCategoryType,23456,ObjectType +AliasNameDataType,23468,DataType +AliasNameDataType_Encoding_DefaultBinary,23499,Object +AliasNameDataType_Encoding_DefaultJson,23511,Object +AliasNameDataType_Encoding_DefaultXml,23505,Object +AliasNameType,23455,ObjectType +AllowNulls,3070,Variable +AlwaysGeneratesEvent,3065,ReferenceType +AnalogItemType,2368,VariableType +AnalogUnitRangeType,17570,VariableType +AnalogUnitType,17497,VariableType +Annotation,891,DataType +Annotation_Encoding_DefaultBinary,893,Object +Annotation_Encoding_DefaultJson,15382,Object +Annotation_Encoding_DefaultXml,892,Object +Annotations,11214,Variable +AnonymousIdentityToken,319,DataType +AnonymousIdentityToken_Encoding_DefaultBinary,321,Object +AnonymousIdentityToken_Encoding_DefaultJson,15141,Object +AnonymousIdentityToken_Encoding_DefaultXml,320,Object +ApplicationCertificateType,12557,ObjectType +ApplicationDescription,308,DataType +ApplicationDescription_Encoding_DefaultBinary,310,Object +ApplicationDescription_Encoding_DefaultJson,15087,Object +ApplicationDescription_Encoding_DefaultXml,309,Object +ApplicationInstanceCertificate,311,DataType +ApplicationType,307,DataType +Argument,296,DataType +Argument_Encoding_DefaultBinary,298,Object +Argument_Encoding_DefaultJson,15081,Object +Argument_Encoding_DefaultXml,297,Object +ArrayItemType,12021,VariableType +AttributeOperand,598,DataType +AttributeOperand_Encoding_DefaultBinary,600,Object +AttributeOperand_Encoding_DefaultJson,15209,Object +AttributeOperand_Encoding_DefaultXml,599,Object +AttributeWriteMask,347,DataType +AudioDataType,16307,DataType +AudioVariableType,17986,VariableType +AuditActivateSessionEventType,2075,ObjectType +AuditAddNodesEventType,2091,ObjectType +AuditAddReferencesEventType,2095,ObjectType +AuditCancelEventType,2078,ObjectType +AuditCertificateDataMismatchEventType,2082,ObjectType +AuditCertificateEventType,2080,ObjectType +AuditCertificateExpiredEventType,2085,ObjectType +AuditCertificateInvalidEventType,2086,ObjectType +AuditCertificateMismatchEventType,2089,ObjectType +AuditCertificateRevokedEventType,2088,ObjectType +AuditCertificateUntrustedEventType,2087,ObjectType +AuditChannelEventType,2059,ObjectType +AuditConditionAcknowledgeEventType,8944,ObjectType +AuditConditionCommentEventType,2829,ObjectType +AuditConditionConfirmEventType,8961,ObjectType +AuditConditionEnableEventType,2803,ObjectType +AuditConditionEventType,2790,ObjectType +AuditConditionOutOfServiceEventType,17259,ObjectType +AuditConditionResetEventType,15013,ObjectType +AuditConditionRespondEventType,8927,ObjectType +AuditConditionShelvingEventType,11093,ObjectType +AuditConditionSilenceEventType,17242,ObjectType +AuditConditionSuppressionEventType,17225,ObjectType +AuditCreateSessionEventType,2071,ObjectType +AuditDeleteNodesEventType,2093,ObjectType +AuditDeleteReferencesEventType,2097,ObjectType +AuditEventType,2052,ObjectType +AuditHistoryAnnotationUpdateEventType,19095,ObjectType +AuditHistoryAtTimeDeleteEventType,3019,ObjectType +AuditHistoryDeleteEventType,3012,ObjectType +AuditHistoryEventDeleteEventType,3022,ObjectType +AuditHistoryEventUpdateEventType,2999,ObjectType +AuditHistoryRawModifyDeleteEventType,3014,ObjectType +AuditHistoryUpdateEventType,2104,ObjectType +AuditHistoryValueUpdateEventType,3006,ObjectType +AuditNodeManagementEventType,2090,ObjectType +AuditOpenSecureChannelEventType,2060,ObjectType +AuditProgramTransitionEventType,11856,ObjectType +AuditSecurityEventType,2058,ObjectType +AuditSessionEventType,2069,ObjectType +AuditUpdateEventType,2099,ObjectType +AuditUpdateMethodEventType,2127,ObjectType +AuditUpdateStateEventType,2315,ObjectType +AuditUrlMismatchEventType,2748,ObjectType +AuditWriteUpdateEventType,2100,ObjectType +AuthorizationServiceConfigurationType,17852,ObjectType +AuthorizationServices,17732,Object +AuthorizationServicesConfigurationFolderType,23556,ObjectType +AxisInformation,12079,DataType +AxisInformation_Encoding_DefaultBinary,12089,Object +AxisInformation_Encoding_DefaultJson,15379,Object +AxisInformation_Encoding_DefaultXml,12081,Object +AxisScaleEnumeration,12077,DataType +BaseAnalogType,15318,VariableType +BaseConditionClassType,11163,ObjectType +BaseDataType,24,DataType +BaseDataVariableType,63,VariableType +BaseEventType,2041,ObjectType +BaseInterfaceType,17602,ObjectType +BaseModelChangeEventType,2132,ObjectType +BaseObjectType,58,ObjectType +BaseVariableType,62,VariableType +BitFieldMaskDataType,11737,DataType +Boolean,1,DataType +BrokerConnectionTransportDataType,15007,DataType +BrokerConnectionTransportDataType_Encoding_DefaultBinary,15479,Object +BrokerConnectionTransportDataType_Encoding_DefaultJson,15726,Object +BrokerConnectionTransportDataType_Encoding_DefaultXml,15579,Object +BrokerConnectionTransportType,15155,ObjectType +BrokerDataSetReaderTransportDataType,15670,DataType +BrokerDataSetReaderTransportDataType_Encoding_DefaultBinary,15733,Object +BrokerDataSetReaderTransportDataType_Encoding_DefaultJson,16526,Object +BrokerDataSetReaderTransportDataType_Encoding_DefaultXml,16023,Object +BrokerDataSetReaderTransportType,21142,ObjectType +BrokerDataSetWriterTransportDataType,15669,DataType +BrokerDataSetWriterTransportDataType_Encoding_DefaultBinary,15729,Object +BrokerDataSetWriterTransportDataType_Encoding_DefaultJson,16525,Object +BrokerDataSetWriterTransportDataType_Encoding_DefaultXml,16022,Object +BrokerDataSetWriterTransportType,21138,ObjectType +BrokerTransportQualityOfService,15008,DataType +BrokerWriterGroupTransportDataType,15667,DataType +BrokerWriterGroupTransportDataType_Encoding_DefaultBinary,15727,Object +BrokerWriterGroupTransportDataType_Encoding_DefaultJson,16524,Object +BrokerWriterGroupTransportDataType_Encoding_DefaultXml,16021,Object +BrokerWriterGroupTransportType,21136,ObjectType +BrowseDescription,514,DataType +BrowseDescription_Encoding_DefaultBinary,516,Object +BrowseDescription_Encoding_DefaultJson,15180,Object +BrowseDescription_Encoding_DefaultXml,515,Object +BrowseDirection,510,DataType +BrowseNextRequest,531,DataType +BrowseNextRequest_Encoding_DefaultBinary,533,Object +BrowseNextRequest_Encoding_DefaultJson,15186,Object +BrowseNextRequest_Encoding_DefaultXml,532,Object +BrowseNextResponse,534,DataType +BrowseNextResponse_Encoding_DefaultBinary,536,Object +BrowseNextResponse_Encoding_DefaultJson,15187,Object +BrowseNextResponse_Encoding_DefaultXml,535,Object +BrowsePath,543,DataType +BrowsePath_Encoding_DefaultBinary,545,Object +BrowsePath_Encoding_DefaultJson,15190,Object +BrowsePath_Encoding_DefaultXml,544,Object +BrowsePathResult,549,DataType +BrowsePathResult_Encoding_DefaultBinary,551,Object +BrowsePathResult_Encoding_DefaultJson,15192,Object +BrowsePathResult_Encoding_DefaultXml,550,Object +BrowsePathTarget,546,DataType +BrowsePathTarget_Encoding_DefaultBinary,548,Object +BrowsePathTarget_Encoding_DefaultJson,15191,Object +BrowsePathTarget_Encoding_DefaultXml,547,Object +BrowseRequest,525,DataType +BrowseRequest_Encoding_DefaultBinary,527,Object +BrowseRequest_Encoding_DefaultJson,15184,Object +BrowseRequest_Encoding_DefaultXml,526,Object +BrowseResponse,528,DataType +BrowseResponse_Encoding_DefaultBinary,530,Object +BrowseResponse_Encoding_DefaultJson,15185,Object +BrowseResponse_Encoding_DefaultXml,529,Object +BrowseResult,522,DataType +BrowseResult_Encoding_DefaultBinary,524,Object +BrowseResult_Encoding_DefaultJson,15183,Object +BrowseResult_Encoding_DefaultXml,523,Object +BrowseResultMask,517,DataType +BuildInfo,338,DataType +BuildInfo_Encoding_DefaultBinary,340,Object +BuildInfo_Encoding_DefaultJson,15361,Object +BuildInfo_Encoding_DefaultXml,339,Object +BuildInfoType,3051,VariableType +Byte,3,DataType +ByteString,15,DataType +CallMethodRequest,704,DataType +CallMethodRequest_Encoding_DefaultBinary,706,Object +CallMethodRequest_Encoding_DefaultJson,15289,Object +CallMethodRequest_Encoding_DefaultXml,705,Object +CallMethodResult,707,DataType +CallMethodResult_Encoding_DefaultBinary,709,Object +CallMethodResult_Encoding_DefaultJson,15290,Object +CallMethodResult_Encoding_DefaultXml,708,Object +CallRequest,710,DataType +CallRequest_Encoding_DefaultBinary,712,Object +CallRequest_Encoding_DefaultJson,15291,Object +CallRequest_Encoding_DefaultXml,711,Object +CallResponse,713,DataType +CallResponse_Encoding_DefaultBinary,715,Object +CallResponse_Encoding_DefaultJson,15292,Object +CallResponse_Encoding_DefaultXml,714,Object +CancelRequest,477,DataType +CancelRequest_Encoding_DefaultBinary,479,Object +CancelRequest_Encoding_DefaultJson,15149,Object +CancelRequest_Encoding_DefaultXml,478,Object +CancelResponse,480,DataType +CancelResponse_Encoding_DefaultBinary,482,Object +CancelResponse_Encoding_DefaultJson,15150,Object +CancelResponse_Encoding_DefaultXml,481,Object +CartesianCoordinates,18809,DataType +CartesianCoordinates_Encoding_DefaultBinary,18818,Object +CartesianCoordinates_Encoding_DefaultJson,19067,Object +CartesianCoordinates_Encoding_DefaultXml,18854,Object +CartesianCoordinatesType,18772,VariableType +CertificateExpirationAlarmType,13225,ObjectType +CertificateGroupFolderType,13813,ObjectType +CertificateGroupType,12555,ObjectType +CertificateType,12556,ObjectType +CertificateUpdatedAuditEventType,12620,ObjectType +ChannelSecurityToken,441,DataType +ChannelSecurityToken_Encoding_DefaultBinary,443,Object +ChannelSecurityToken_Encoding_DefaultJson,15131,Object +ChannelSecurityToken_Encoding_DefaultXml,442,Object +ChoiceStateType,15109,ObjectType +CloseSecureChannelRequest,450,DataType +CloseSecureChannelRequest_Encoding_DefaultBinary,452,Object +CloseSecureChannelRequest_Encoding_DefaultJson,15134,Object +CloseSecureChannelRequest_Encoding_DefaultXml,451,Object +CloseSecureChannelResponse,453,DataType +CloseSecureChannelResponse_Encoding_DefaultBinary,455,Object +CloseSecureChannelResponse_Encoding_DefaultJson,15135,Object +CloseSecureChannelResponse_Encoding_DefaultXml,454,Object +CloseSessionRequest,471,DataType +CloseSessionRequest_Encoding_DefaultBinary,473,Object +CloseSessionRequest_Encoding_DefaultJson,15147,Object +CloseSessionRequest_Encoding_DefaultXml,472,Object +CloseSessionResponse,474,DataType +CloseSessionResponse_Encoding_DefaultBinary,476,Object +CloseSessionResponse_Encoding_DefaultJson,15148,Object +CloseSessionResponse_Encoding_DefaultXml,475,Object +Communication,24227,Object +ComplexNumberType,12171,DataType +ComplexNumberType_Encoding_DefaultBinary,12181,Object +ComplexNumberType_Encoding_DefaultJson,15377,Object +ComplexNumberType_Encoding_DefaultXml,12173,Object +ConditionType,2782,ObjectType +ConditionVariableType,9002,VariableType +ConfigurationVersionDataType,14593,DataType +ConfigurationVersionDataType_Encoding_DefaultBinary,14847,Object +ConfigurationVersionDataType_Encoding_DefaultJson,15049,Object +ConfigurationVersionDataType_Encoding_DefaultXml,14803,Object +ConnectionTransportDataType,15618,DataType +ConnectionTransportDataType_Encoding_DefaultBinary,15695,Object +ConnectionTransportDataType_Encoding_DefaultJson,16282,Object +ConnectionTransportDataType_Encoding_DefaultXml,15993,Object +ConnectionTransportType,17721,ObjectType +ContentFilter,586,DataType +ContentFilter_Encoding_DefaultBinary,588,Object +ContentFilter_Encoding_DefaultJson,15205,Object +ContentFilter_Encoding_DefaultXml,587,Object +ContentFilterElement,583,DataType +ContentFilterElement_Encoding_DefaultBinary,585,Object +ContentFilterElement_Encoding_DefaultJson,15204,Object +ContentFilterElement_Encoding_DefaultXml,584,Object +ContentFilterElementResult,604,DataType +ContentFilterElementResult_Encoding_DefaultBinary,606,Object +ContentFilterElementResult_Encoding_DefaultJson,15211,Object +ContentFilterElementResult_Encoding_DefaultXml,605,Object +ContentFilterResult,607,DataType +ContentFilterResult_Encoding_DefaultBinary,609,Object +ContentFilterResult_Encoding_DefaultJson,15228,Object +ContentFilterResult_Encoding_DefaultXml,608,Object +ContinuationPoint,521,DataType +Counter,289,DataType +CreateMonitoredItemsRequest,749,DataType +CreateMonitoredItemsRequest_Encoding_DefaultBinary,751,Object +CreateMonitoredItemsRequest_Encoding_DefaultJson,15323,Object +CreateMonitoredItemsRequest_Encoding_DefaultXml,750,Object +CreateMonitoredItemsResponse,752,DataType +CreateMonitoredItemsResponse_Encoding_DefaultBinary,754,Object +CreateMonitoredItemsResponse_Encoding_DefaultJson,15324,Object +CreateMonitoredItemsResponse_Encoding_DefaultXml,753,Object +CreateSessionRequest,459,DataType +CreateSessionRequest_Encoding_DefaultBinary,461,Object +CreateSessionRequest_Encoding_DefaultJson,15138,Object +CreateSessionRequest_Encoding_DefaultXml,460,Object +CreateSessionResponse,462,DataType +CreateSessionResponse_Encoding_DefaultBinary,464,Object +CreateSessionResponse_Encoding_DefaultJson,15139,Object +CreateSessionResponse_Encoding_DefaultXml,463,Object +CreateSubscriptionRequest,785,DataType +CreateSubscriptionRequest_Encoding_DefaultBinary,787,Object +CreateSubscriptionRequest_Encoding_DefaultJson,15337,Object +CreateSubscriptionRequest_Encoding_DefaultXml,786,Object +CreateSubscriptionResponse,788,DataType +CreateSubscriptionResponse_Encoding_DefaultBinary,790,Object +CreateSubscriptionResponse_Encoding_DefaultJson,15338,Object +CreateSubscriptionResponse_Encoding_DefaultXml,789,Object +CubeItemType,12057,VariableType +CurrencyUnit,23501,Variable +CurrencyUnitType,23498,DataType +CurrencyUnitType_Encoding_DefaultBinary,23507,Object +CurrencyUnitType_Encoding_DefaultJson,23528,Object +CurrencyUnitType_Encoding_DefaultXml,23520,Object +DataChangeFilter,722,DataType +DataChangeFilter_Encoding_DefaultBinary,724,Object +DataChangeFilter_Encoding_DefaultJson,15294,Object +DataChangeFilter_Encoding_DefaultXml,723,Object +DataChangeNotification,809,DataType +DataChangeNotification_Encoding_DefaultBinary,811,Object +DataChangeNotification_Encoding_DefaultJson,15345,Object +DataChangeNotification_Encoding_DefaultXml,810,Object +DataChangeTrigger,717,DataType +DatagramConnectionTransportDataType,17467,DataType +DatagramConnectionTransportDataType_Encoding_DefaultBinary,17468,Object +DatagramConnectionTransportDataType_Encoding_DefaultJson,17476,Object +DatagramConnectionTransportDataType_Encoding_DefaultXml,17472,Object +DatagramConnectionTransportType,15064,ObjectType +DatagramWriterGroupTransportDataType,15532,DataType +DatagramWriterGroupTransportDataType_Encoding_DefaultBinary,21155,Object +DatagramWriterGroupTransportDataType_Encoding_DefaultJson,21203,Object +DatagramWriterGroupTransportDataType_Encoding_DefaultXml,21179,Object +DatagramWriterGroupTransportType,21133,ObjectType +DataItemType,2365,VariableType +DataSetFieldContentMask,15583,DataType +DataSetFieldFlags,15904,DataType +DataSetFolderType,14477,ObjectType +DataSetMetaDataType,14523,DataType +DataSetMetaDataType_Encoding_DefaultBinary,124,Object +DataSetMetaDataType_Encoding_DefaultJson,15050,Object +DataSetMetaDataType_Encoding_DefaultXml,14794,Object +DataSetOrderingType,20408,DataType +DataSetReaderDataType,15623,DataType +DataSetReaderDataType_Encoding_DefaultBinary,15703,Object +DataSetReaderDataType_Encoding_DefaultJson,16286,Object +DataSetReaderDataType_Encoding_DefaultXml,16007,Object +DataSetReaderMessageDataType,15629,DataType +DataSetReaderMessageDataType_Encoding_DefaultBinary,15706,Object +DataSetReaderMessageDataType_Encoding_DefaultJson,16288,Object +DataSetReaderMessageDataType_Encoding_DefaultXml,16009,Object +DataSetReaderMessageType,21104,ObjectType +DataSetReaderTransportDataType,15628,DataType +DataSetReaderTransportDataType_Encoding_DefaultBinary,15705,Object +DataSetReaderTransportDataType_Encoding_DefaultJson,16287,Object +DataSetReaderTransportDataType_Encoding_DefaultXml,16008,Object +DataSetReaderTransportType,15319,ObjectType +DataSetReaderType,15306,ObjectType +DataSetToWriter,14936,ReferenceType +DataSetWriterDataType,15597,DataType +DataSetWriterDataType_Encoding_DefaultBinary,15682,Object +DataSetWriterDataType_Encoding_DefaultJson,16156,Object +DataSetWriterDataType_Encoding_DefaultXml,15955,Object +DataSetWriterMessageDataType,15605,DataType +DataSetWriterMessageDataType_Encoding_DefaultBinary,15688,Object +DataSetWriterMessageDataType_Encoding_DefaultJson,16158,Object +DataSetWriterMessageDataType_Encoding_DefaultXml,15987,Object +DataSetWriterMessageType,21096,ObjectType +DataSetWriterTransportDataType,15598,DataType +DataSetWriterTransportDataType_Encoding_DefaultBinary,15683,Object +DataSetWriterTransportDataType_Encoding_DefaultJson,16157,Object +DataSetWriterTransportDataType_Encoding_DefaultXml,15956,Object +DataSetWriterTransportType,15305,ObjectType +DataSetWriterType,15298,ObjectType +DataTypeAttributes,370,DataType +DataTypeAttributes_Encoding_DefaultBinary,372,Object +DataTypeAttributes_Encoding_DefaultJson,15161,Object +DataTypeAttributes_Encoding_DefaultXml,371,Object +DataTypeDefinition,97,DataType +DataTypeDefinition_Encoding_DefaultBinary,121,Object +DataTypeDefinition_Encoding_DefaultJson,15063,Object +DataTypeDefinition_Encoding_DefaultXml,14797,Object +DataTypeDescription,14525,DataType +DataTypeDescription_Encoding_DefaultBinary,125,Object +DataTypeDescription_Encoding_DefaultJson,15057,Object +DataTypeDescription_Encoding_DefaultXml,14796,Object +DataTypeDescriptionType,69,VariableType +DataTypeDictionaryType,72,VariableType +DataTypeEncodingType,76,ObjectType +DataTypeNode,282,DataType +DataTypeNode_Encoding_DefaultBinary,284,Object +DataTypeNode_Encoding_DefaultJson,15079,Object +DataTypeNode_Encoding_DefaultXml,283,Object +DataTypeSchemaHeader,15534,DataType +DataTypeSchemaHeader_Encoding_DefaultBinary,15676,Object +DataTypeSchemaHeader_Encoding_DefaultJson,16151,Object +DataTypeSchemaHeader_Encoding_DefaultXml,15950,Object +DataTypesFolder,90,Object +DataTypeSystemType,75,ObjectType +DataValue,23,DataType +Date,293,DataType +DateString,12881,DataType +DateTime,13,DataType +DeadbandType,718,DataType +Decimal,50,DataType +DecimalDataType,17861,DataType +DecimalDataType_Encoding_DefaultBinary,17863,Object +DecimalDataType_Encoding_DefaultJson,15045,Object +DecimalDataType_Encoding_DefaultXml,17862,Object +DecimalString,12878,DataType +DefaultBinary,3062,Object +DefaultInstanceBrowseName,17605,Variable +DefaultXml,3063,Object +DeleteAtTimeDetails,689,DataType +DeleteAtTimeDetails_Encoding_DefaultBinary,691,Object +DeleteAtTimeDetails_Encoding_DefaultJson,15284,Object +DeleteAtTimeDetails_Encoding_DefaultXml,690,Object +DeleteEventDetails,692,DataType +DeleteEventDetails_Encoding_DefaultBinary,694,Object +DeleteEventDetails_Encoding_DefaultJson,15285,Object +DeleteEventDetails_Encoding_DefaultXml,693,Object +DeleteMonitoredItemsRequest,779,DataType +DeleteMonitoredItemsRequest_Encoding_DefaultBinary,781,Object +DeleteMonitoredItemsRequest_Encoding_DefaultJson,15335,Object +DeleteMonitoredItemsRequest_Encoding_DefaultXml,780,Object +DeleteMonitoredItemsResponse,782,DataType +DeleteMonitoredItemsResponse_Encoding_DefaultBinary,784,Object +DeleteMonitoredItemsResponse_Encoding_DefaultJson,15336,Object +DeleteMonitoredItemsResponse_Encoding_DefaultXml,783,Object +DeleteNodesItem,382,DataType +DeleteNodesItem_Encoding_DefaultBinary,384,Object +DeleteNodesItem_Encoding_DefaultJson,15172,Object +DeleteNodesItem_Encoding_DefaultXml,383,Object +DeleteNodesRequest,498,DataType +DeleteNodesRequest_Encoding_DefaultBinary,500,Object +DeleteNodesRequest_Encoding_DefaultJson,15173,Object +DeleteNodesRequest_Encoding_DefaultXml,499,Object +DeleteNodesResponse,501,DataType +DeleteNodesResponse_Encoding_DefaultBinary,503,Object +DeleteNodesResponse_Encoding_DefaultJson,15174,Object +DeleteNodesResponse_Encoding_DefaultXml,502,Object +DeleteRawModifiedDetails,686,DataType +DeleteRawModifiedDetails_Encoding_DefaultBinary,688,Object +DeleteRawModifiedDetails_Encoding_DefaultJson,15283,Object +DeleteRawModifiedDetails_Encoding_DefaultXml,687,Object +DeleteReferencesItem,385,DataType +DeleteReferencesItem_Encoding_DefaultBinary,387,Object +DeleteReferencesItem_Encoding_DefaultJson,15175,Object +DeleteReferencesItem_Encoding_DefaultXml,386,Object +DeleteReferencesRequest,504,DataType +DeleteReferencesRequest_Encoding_DefaultBinary,506,Object +DeleteReferencesRequest_Encoding_DefaultJson,15176,Object +DeleteReferencesRequest_Encoding_DefaultXml,505,Object +DeleteReferencesResponse,507,DataType +DeleteReferencesResponse_Encoding_DefaultBinary,509,Object +DeleteReferencesResponse_Encoding_DefaultJson,15177,Object +DeleteReferencesResponse_Encoding_DefaultXml,508,Object +DeleteSubscriptionsRequest,845,DataType +DeleteSubscriptionsRequest_Encoding_DefaultBinary,847,Object +DeleteSubscriptionsRequest_Encoding_DefaultJson,15359,Object +DeleteSubscriptionsRequest_Encoding_DefaultXml,846,Object +DeleteSubscriptionsResponse,848,DataType +DeleteSubscriptionsResponse_Encoding_DefaultBinary,850,Object +DeleteSubscriptionsResponse_Encoding_DefaultJson,15360,Object +DeleteSubscriptionsResponse_Encoding_DefaultXml,849,Object +DeviceFailureEventType,2131,ObjectType +DiagnosticInfo,25,DataType +DiagnosticsLevel,19723,DataType +DialogConditionType,2830,ObjectType +Dictionaries,17594,Object +DictionaryEntryType,17589,ObjectType +DictionaryFolderType,17591,ObjectType +DiscoveryConfiguration,12890,DataType +DiscoveryConfiguration_Encoding_DefaultBinary,12900,Object +DiscoveryConfiguration_Encoding_DefaultJson,15105,Object +DiscoveryConfiguration_Encoding_DefaultXml,12892,Object +DiscrepancyAlarmType,17080,ObjectType +DiscreteAlarmType,10523,ObjectType +DiscreteItemType,2372,VariableType +Double,11,DataType +DoubleComplexNumberType,12172,DataType +DoubleComplexNumberType_Encoding_DefaultBinary,12182,Object +DoubleComplexNumberType_Encoding_DefaultJson,15378,Object +DoubleComplexNumberType_Encoding_DefaultXml,12174,Object +Duplex,24210,DataType +Duration,290,DataType +DurationString,12879,DataType +EccApplicationCertificateType,23537,ObjectType +EccBrainpoolP256r1ApplicationCertificateType,23540,ObjectType +EccBrainpoolP384r1ApplicationCertificateType,23541,ObjectType +EccCurve25519ApplicationCertificateType,23542,ObjectType +EccCurve448ApplicationCertificateType,23543,ObjectType +EccEncryptedSecret,17546,DataType +EccNistP256ApplicationCertificateType,23538,ObjectType +EccNistP384ApplicationCertificateType,23539,ObjectType +ElementOperand,592,DataType +ElementOperand_Encoding_DefaultBinary,594,Object +ElementOperand_Encoding_DefaultJson,15207,Object +ElementOperand_Encoding_DefaultXml,593,Object +ElseGuardVariableType,15317,VariableType +EndpointConfiguration,331,DataType +EndpointConfiguration_Encoding_DefaultBinary,333,Object +EndpointConfiguration_Encoding_DefaultJson,15199,Object +EndpointConfiguration_Encoding_DefaultXml,332,Object +EndpointDescription,312,DataType +EndpointDescription_Encoding_DefaultBinary,314,Object +EndpointDescription_Encoding_DefaultJson,15099,Object +EndpointDescription_Encoding_DefaultXml,313,Object +EndpointType,15528,DataType +EndpointType_Encoding_DefaultBinary,15671,Object +EndpointType_Encoding_DefaultJson,16150,Object +EndpointType_Encoding_DefaultXml,15949,Object +EndpointUrlListDataType,11943,DataType +EndpointUrlListDataType_Encoding_DefaultBinary,11957,Object +EndpointUrlListDataType_Encoding_DefaultJson,15363,Object +EndpointUrlListDataType_Encoding_DefaultXml,11949,Object +EngineeringUnits,11513,Variable +EnumDefinition,100,DataType +EnumDefinition_Encoding_DefaultBinary,123,Object +EnumDefinition_Encoding_DefaultJson,15067,Object +EnumDefinition_Encoding_DefaultXml,14799,Object +EnumDescription,15488,DataType +EnumDescription_Encoding_DefaultBinary,127,Object +EnumDescription_Encoding_DefaultJson,15059,Object +EnumDescription_Encoding_DefaultXml,15590,Object +Enumeration,29,DataType +EnumField,102,DataType +EnumField_Encoding_DefaultBinary,14845,Object +EnumField_Encoding_DefaultJson,15083,Object +EnumField_Encoding_DefaultXml,14801,Object +EnumStrings,11432,Variable +EnumValues,3071,Variable +EnumValueType,7594,DataType +EnumValueType_Encoding_DefaultBinary,8251,Object +EnumValueType_Encoding_DefaultJson,15082,Object +EnumValueType_Encoding_DefaultXml,7616,Object +EphemeralKeyType,17548,DataType +EphemeralKeyType_Encoding_DefaultBinary,17549,Object +EphemeralKeyType_Encoding_DefaultJson,17557,Object +EphemeralKeyType_Encoding_DefaultXml,17553,Object +EUInformation,887,DataType +EUInformation_Encoding_DefaultBinary,889,Object +EUInformation_Encoding_DefaultJson,15376,Object +EUInformation_Encoding_DefaultXml,888,Object +EventFieldList,917,DataType +EventFieldList_Encoding_DefaultBinary,919,Object +EventFieldList_Encoding_DefaultJson,15348,Object +EventFieldList_Encoding_DefaultXml,918,Object +EventFilter,725,DataType +EventFilter_Encoding_DefaultBinary,727,Object +EventFilter_Encoding_DefaultJson,15295,Object +EventFilter_Encoding_DefaultXml,726,Object +EventFilterResult,734,DataType +EventFilterResult_Encoding_DefaultBinary,736,Object +EventFilterResult_Encoding_DefaultJson,15314,Object +EventFilterResult_Encoding_DefaultXml,735,Object +EventNotificationList,914,DataType +EventNotificationList_Encoding_DefaultBinary,916,Object +EventNotificationList_Encoding_DefaultJson,15347,Object +EventNotificationList_Encoding_DefaultXml,915,Object +EventNotifierType,15033,DataType +EventQueueOverflowEventType,3035,ObjectType +EventTypesFolder,3048,Object +ExceptionDeviationFormat,890,DataType +ExclusiveDeviationAlarmType,9764,ObjectType +ExclusiveLevelAlarmType,9482,ObjectType +ExclusiveLimitAlarmType,9341,ObjectType +ExclusiveLimitStateMachineType,9318,ObjectType +ExclusiveRateOfChangeAlarmType,9623,ObjectType +ExpandedNodeId,18,DataType +ExpressionGuardVariableType,15128,VariableType +ExtensionFieldsType,15489,ObjectType +FieldMetaData,14524,DataType +FieldMetaData_Encoding_DefaultBinary,14839,Object +FieldMetaData_Encoding_DefaultJson,15051,Object +FieldMetaData_Encoding_DefaultXml,14795,Object +FieldTargetDataType,14744,DataType +FieldTargetDataType_Encoding_DefaultBinary,14848,Object +FieldTargetDataType_Encoding_DefaultJson,15061,Object +FieldTargetDataType_Encoding_DefaultXml,14804,Object +FileDirectoryType,13353,ObjectType +FileSystem,16314,Object +FileTransferStateMachineType,15803,ObjectType +FileType,11575,ObjectType +FilterOperand,589,DataType +FilterOperand_Encoding_DefaultBinary,591,Object +FilterOperand_Encoding_DefaultJson,15206,Object +FilterOperand_Encoding_DefaultXml,590,Object +FilterOperator,576,DataType +FindServersOnNetworkRequest,12190,DataType +FindServersOnNetworkRequest_Encoding_DefaultBinary,12208,Object +FindServersOnNetworkRequest_Encoding_DefaultJson,15096,Object +FindServersOnNetworkRequest_Encoding_DefaultXml,12196,Object +FindServersOnNetworkResponse,12191,DataType +FindServersOnNetworkResponse_Encoding_DefaultBinary,12209,Object +FindServersOnNetworkResponse_Encoding_DefaultJson,15097,Object +FindServersOnNetworkResponse_Encoding_DefaultXml,12197,Object +FindServersRequest,420,DataType +FindServersRequest_Encoding_DefaultBinary,422,Object +FindServersRequest_Encoding_DefaultJson,15093,Object +FindServersRequest_Encoding_DefaultXml,421,Object +FindServersResponse,423,DataType +FindServersResponse_Encoding_DefaultBinary,425,Object +FindServersResponse_Encoding_DefaultJson,15094,Object +FindServersResponse_Encoding_DefaultXml,424,Object +FiniteStateMachineType,2771,ObjectType +FiniteStateVariableType,2760,VariableType +FiniteTransitionVariableType,2767,VariableType +Float,10,DataType +FolderType,61,ObjectType +Frame,18813,DataType +Frame_Encoding_DefaultBinary,18822,Object +Frame_Encoding_DefaultJson,19071,Object +Frame_Encoding_DefaultXml,18858,Object +FrameType,18786,VariableType +FromState,51,ReferenceType +GeneralModelChangeEventType,2133,ObjectType +GeneratesEvent,41,ReferenceType +GenericAttributes,17607,DataType +GenericAttributes_Encoding_DefaultBinary,17611,Object +GenericAttributes_Encoding_DefaultJson,15164,Object +GenericAttributes_Encoding_DefaultXml,17609,Object +GenericAttributeValue,17606,DataType +GenericAttributeValue_Encoding_DefaultBinary,17610,Object +GenericAttributeValue_Encoding_DefaultJson,15163,Object +GenericAttributeValue_Encoding_DefaultXml,17608,Object +GetEndpointsRequest,426,DataType +GetEndpointsRequest_Encoding_DefaultBinary,428,Object +GetEndpointsRequest_Encoding_DefaultJson,15100,Object +GetEndpointsRequest_Encoding_DefaultXml,427,Object +GetEndpointsResponse,429,DataType +GetEndpointsResponse_Encoding_DefaultBinary,431,Object +GetEndpointsResponse_Encoding_DefaultJson,15101,Object +GetEndpointsResponse_Encoding_DefaultXml,430,Object +GuardVariableType,15113,VariableType +Guid,14,DataType +HAConfiguration,11202,Object +HasAddIn,17604,ReferenceType +HasAlarmSuppressionGroup,16361,ReferenceType +HasArgumentDescription,129,ReferenceType +HasCause,53,ReferenceType +HasChild,34,ReferenceType +HasComponent,47,ReferenceType +HasCondition,9006,ReferenceType +HasDataSetReader,15297,ReferenceType +HasDataSetWriter,15296,ReferenceType +HasDescription,39,ReferenceType +HasDictionaryEntry,17597,ReferenceType +HasEffect,54,ReferenceType +HasEffectDisable,17276,ReferenceType +HasEffectEnable,17983,ReferenceType +HasEffectSuppressed,17984,ReferenceType +HasEffectUnsuppressed,17985,ReferenceType +HasEncoding,38,ReferenceType +HasEventSource,36,ReferenceType +HasFalseSubState,9005,ReferenceType +HasGuard,15112,ReferenceType +HasHistoricalConfiguration,56,ReferenceType +HasInterface,17603,ReferenceType +HasModellingRule,37,ReferenceType +HasNotifier,48,ReferenceType +HasOptionalInputArgumentDescription,131,ReferenceType +HasOrderedComponent,49,ReferenceType +HasProperty,46,ReferenceType +HasPubSubConnection,14476,ReferenceType +HasReaderGroup,18805,ReferenceType +HasSubStateMachine,117,ReferenceType +HasSubtype,45,ReferenceType +HasTrueSubState,9004,ReferenceType +HasTypeDefinition,40,ReferenceType +HasWriterGroup,18804,ReferenceType +HierarchicalReferences,33,ReferenceType +HighlyManagedAlarmConditionClassType,17219,ObjectType +HistoricalDataConfigurationType,2318,ObjectType +HistoricalEventFilter,11215,Variable +HistoryData,656,DataType +HistoryData_Encoding_DefaultBinary,658,Object +HistoryData_Encoding_DefaultJson,15270,Object +HistoryData_Encoding_DefaultXml,657,Object +HistoryEvent,659,DataType +HistoryEvent_Encoding_DefaultBinary,661,Object +HistoryEvent_Encoding_DefaultJson,15273,Object +HistoryEvent_Encoding_DefaultXml,660,Object +HistoryEventFieldList,920,DataType +HistoryEventFieldList_Encoding_DefaultBinary,922,Object +HistoryEventFieldList_Encoding_DefaultJson,15349,Object +HistoryEventFieldList_Encoding_DefaultXml,921,Object +HistoryModifiedData,11217,DataType +HistoryModifiedData_Encoding_DefaultBinary,11227,Object +HistoryModifiedData_Encoding_DefaultJson,15272,Object +HistoryModifiedData_Encoding_DefaultXml,11219,Object +HistoryReadDetails,641,DataType +HistoryReadDetails_Encoding_DefaultBinary,643,Object +HistoryReadDetails_Encoding_DefaultJson,15261,Object +HistoryReadDetails_Encoding_DefaultXml,642,Object +HistoryReadRequest,662,DataType +HistoryReadRequest_Encoding_DefaultBinary,664,Object +HistoryReadRequest_Encoding_DefaultJson,15274,Object +HistoryReadRequest_Encoding_DefaultXml,663,Object +HistoryReadResponse,665,DataType +HistoryReadResponse_Encoding_DefaultBinary,667,Object +HistoryReadResponse_Encoding_DefaultJson,15275,Object +HistoryReadResponse_Encoding_DefaultXml,666,Object +HistoryReadResult,638,DataType +HistoryReadResult_Encoding_DefaultBinary,640,Object +HistoryReadResult_Encoding_DefaultJson,15260,Object +HistoryReadResult_Encoding_DefaultXml,639,Object +HistoryReadValueId,635,DataType +HistoryReadValueId_Encoding_DefaultBinary,637,Object +HistoryReadValueId_Encoding_DefaultJson,15259,Object +HistoryReadValueId_Encoding_DefaultXml,636,Object +HistoryServerCapabilities,11192,Object +HistoryServerCapabilitiesType,2330,ObjectType +HistoryUpdateDetails,677,DataType +HistoryUpdateDetails_Encoding_DefaultBinary,679,Object +HistoryUpdateDetails_Encoding_DefaultJson,15279,Object +HistoryUpdateDetails_Encoding_DefaultXml,678,Object +HistoryUpdateRequest,698,DataType +HistoryUpdateRequest_Encoding_DefaultBinary,700,Object +HistoryUpdateRequest_Encoding_DefaultJson,15287,Object +HistoryUpdateRequest_Encoding_DefaultXml,699,Object +HistoryUpdateResponse,701,DataType +HistoryUpdateResponse_Encoding_DefaultBinary,703,Object +HistoryUpdateResponse_Encoding_DefaultJson,15288,Object +HistoryUpdateResponse_Encoding_DefaultXml,702,Object +HistoryUpdateResult,695,DataType +HistoryUpdateResult_Encoding_DefaultBinary,697,Object +HistoryUpdateResult_Encoding_DefaultJson,15286,Object +HistoryUpdateResult_Encoding_DefaultXml,696,Object +HistoryUpdateType,11234,DataType +HttpsCertificateType,12558,ObjectType +IBaseEthernetCapabilitiesType,24167,ObjectType +Icon,3067,Variable +IdentityCriteriaType,15632,DataType +IdentityMappingRuleType,15634,DataType +IdentityMappingRuleType_Encoding_DefaultBinary,15736,Object +IdentityMappingRuleType_Encoding_DefaultJson,15042,Object +IdentityMappingRuleType_Encoding_DefaultXml,15728,Object +IdType,256,DataType +IIeeeAutoNegotiationStatusType,24233,ObjectType +IIeeeBaseEthernetPortType,24158,ObjectType +IIeeeBaseTsnStatusStreamType,24183,ObjectType +IIeeeBaseTsnStreamType,24173,ObjectType +IIeeeBaseTsnTrafficSpecificationType,24179,ObjectType +IIeeeTsnInterfaceConfigurationListenerType,24195,ObjectType +IIeeeTsnInterfaceConfigurationTalkerType,24191,ObjectType +IIeeeTsnInterfaceConfigurationType,24188,ObjectType +IIeeeTsnMacAddressType,24199,ObjectType +IIeeeTsnVlanTagType,24202,ObjectType +IIetfBaseNetworkInterfaceType,24148,ObjectType +Image,30,DataType +ImageBMP,2000,DataType +ImageGIF,2001,DataType +ImageItemType,12047,VariableType +ImageJPG,2002,DataType +ImagePNG,2003,DataType +Index,17588,DataType +InitialStateType,2309,ObjectType +InputArguments,3072,Variable +InstanceNode,11879,DataType +InstanceNode_Encoding_DefaultBinary,11889,Object +InstanceNode_Encoding_DefaultJson,15069,Object +InstanceNode_Encoding_DefaultXml,11887,Object +InstrumentDiagnosticAlarmType,18347,ObjectType +Int16,4,DataType +Int32,6,DataType +Int64,8,DataType +Integer,27,DataType +IntegerId,288,DataType +InterfaceAdminStatus,24212,DataType +InterfaceOperStatus,24214,DataType +InterfaceTypes,17708,Object +IOrderedObjectType,23513,ObjectType +IPriorityMappingEntryType,24205,ObjectType +IrdiDictionaryEntryType,17598,ObjectType +ISrClassType,24169,ObjectType +IssuedIdentityToken,938,DataType +IssuedIdentityToken_Encoding_DefaultBinary,940,Object +IssuedIdentityToken_Encoding_DefaultJson,15144,Object +IssuedIdentityToken_Encoding_DefaultXml,939,Object +JsonDataSetMessageContentMask,15658,DataType +JsonDataSetReaderMessageDataType,15665,DataType +JsonDataSetReaderMessageDataType_Encoding_DefaultBinary,15725,Object +JsonDataSetReaderMessageDataType_Encoding_DefaultJson,16404,Object +JsonDataSetReaderMessageDataType_Encoding_DefaultXml,16019,Object +JsonDataSetReaderMessageType,21130,ObjectType +JsonDataSetWriterMessageDataType,15664,DataType +JsonDataSetWriterMessageDataType_Encoding_DefaultBinary,15724,Object +JsonDataSetWriterMessageDataType_Encoding_DefaultJson,16394,Object +JsonDataSetWriterMessageDataType_Encoding_DefaultXml,16018,Object +JsonDataSetWriterMessageType,21128,ObjectType +JsonNetworkMessageContentMask,15654,DataType +JsonWriterGroupMessageDataType,15657,DataType +JsonWriterGroupMessageDataType_Encoding_DefaultBinary,15719,Object +JsonWriterGroupMessageDataType_Encoding_DefaultJson,16393,Object +JsonWriterGroupMessageDataType_Encoding_DefaultXml,16017,Object +JsonWriterGroupMessageType,21126,ObjectType +KeyCredentialAuditEventType,18011,ObjectType +KeyCredentialConfiguration,18155,Object +KeyCredentialConfigurationFolderType,17496,ObjectType +KeyCredentialConfigurationType,18001,ObjectType +KeyCredentialDeletedAuditEventType,18047,ObjectType +KeyCredentialUpdatedAuditEventType,18029,ObjectType +KeyValuePair,14533,DataType +KeyValuePair_Encoding_DefaultBinary,14846,Object +KeyValuePair_Encoding_DefaultJson,15041,Object +KeyValuePair_Encoding_DefaultXml,14802,Object +LimitAlarmType,2955,ObjectType +ListenerStreams,24232,Object +LiteralOperand,595,DataType +LiteralOperand_Encoding_DefaultBinary,597,Object +LiteralOperand_Encoding_DefaultJson,15208,Object +LiteralOperand_Encoding_DefaultXml,596,Object +LocaleId,295,DataType +LocalizedText,21,DataType +LocalTime,3069,Variable +MaintenanceConditionClassType,11165,ObjectType +MappingTables,24228,Object +MaxArrayLength,11512,Variable +MaxByteStringLength,12908,Variable +MaxCharacters,15002,Variable +MaxStringLength,11498,Variable +MdnsDiscoveryConfiguration,12891,DataType +MdnsDiscoveryConfiguration_Encoding_DefaultBinary,12901,Object +MdnsDiscoveryConfiguration_Encoding_DefaultJson,15106,Object +MdnsDiscoveryConfiguration_Encoding_DefaultXml,12893,Object +MessageSecurityMode,302,DataType +MethodAttributes,358,DataType +MethodAttributes_Encoding_DefaultBinary,360,Object +MethodAttributes_Encoding_DefaultJson,15157,Object +MethodAttributes_Encoding_DefaultXml,359,Object +MethodNode,276,DataType +MethodNode_Encoding_DefaultBinary,278,Object +MethodNode_Encoding_DefaultJson,15077,Object +MethodNode_Encoding_DefaultXml,277,Object +ModelChangeStructureDataType,877,DataType +ModelChangeStructureDataType_Encoding_DefaultBinary,879,Object +ModelChangeStructureDataType_Encoding_DefaultJson,15373,Object +ModelChangeStructureDataType_Encoding_DefaultXml,878,Object +ModelChangeStructureVerbMask,11941,DataType +ModellingRule_ExposesItsArray,83,Object +ModellingRule_Mandatory,78,Object +ModellingRule_MandatoryPlaceholder,11510,Object +ModellingRule_Optional,80,Object +ModellingRule_OptionalPlaceholder,11508,Object +ModellingRuleType,77,ObjectType +ModificationInfo,11216,DataType +ModificationInfo_Encoding_DefaultBinary,11226,Object +ModificationInfo_Encoding_DefaultJson,15271,Object +ModificationInfo_Encoding_DefaultXml,11218,Object +ModifyMonitoredItemsRequest,761,DataType +ModifyMonitoredItemsRequest_Encoding_DefaultBinary,763,Object +ModifyMonitoredItemsRequest_Encoding_DefaultJson,15327,Object +ModifyMonitoredItemsRequest_Encoding_DefaultXml,762,Object +ModifyMonitoredItemsResponse,764,DataType +ModifyMonitoredItemsResponse_Encoding_DefaultBinary,766,Object +ModifyMonitoredItemsResponse_Encoding_DefaultJson,15328,Object +ModifyMonitoredItemsResponse_Encoding_DefaultXml,765,Object +ModifySubscriptionRequest,791,DataType +ModifySubscriptionRequest_Encoding_DefaultBinary,793,Object +ModifySubscriptionRequest_Encoding_DefaultJson,15339,Object +ModifySubscriptionRequest_Encoding_DefaultXml,792,Object +ModifySubscriptionResponse,794,DataType +ModifySubscriptionResponse_Encoding_DefaultBinary,796,Object +ModifySubscriptionResponse_Encoding_DefaultJson,15340,Object +ModifySubscriptionResponse_Encoding_DefaultXml,795,Object +MonitoredItemCreateRequest,743,DataType +MonitoredItemCreateRequest_Encoding_DefaultBinary,745,Object +MonitoredItemCreateRequest_Encoding_DefaultJson,15321,Object +MonitoredItemCreateRequest_Encoding_DefaultXml,744,Object +MonitoredItemCreateResult,746,DataType +MonitoredItemCreateResult_Encoding_DefaultBinary,748,Object +MonitoredItemCreateResult_Encoding_DefaultJson,15322,Object +MonitoredItemCreateResult_Encoding_DefaultXml,747,Object +MonitoredItemModifyRequest,755,DataType +MonitoredItemModifyRequest_Encoding_DefaultBinary,757,Object +MonitoredItemModifyRequest_Encoding_DefaultJson,15325,Object +MonitoredItemModifyRequest_Encoding_DefaultXml,756,Object +MonitoredItemModifyResult,758,DataType +MonitoredItemModifyResult_Encoding_DefaultBinary,760,Object +MonitoredItemModifyResult_Encoding_DefaultJson,15326,Object +MonitoredItemModifyResult_Encoding_DefaultXml,759,Object +MonitoredItemNotification,806,DataType +MonitoredItemNotification_Encoding_DefaultBinary,808,Object +MonitoredItemNotification_Encoding_DefaultJson,15346,Object +MonitoredItemNotification_Encoding_DefaultXml,807,Object +MonitoringFilter,719,DataType +MonitoringFilter_Encoding_DefaultBinary,721,Object +MonitoringFilter_Encoding_DefaultJson,15293,Object +MonitoringFilter_Encoding_DefaultXml,720,Object +MonitoringFilterResult,731,DataType +MonitoringFilterResult_Encoding_DefaultBinary,733,Object +MonitoringFilterResult_Encoding_DefaultJson,15313,Object +MonitoringFilterResult_Encoding_DefaultXml,732,Object +MonitoringMode,716,DataType +MonitoringParameters,740,DataType +MonitoringParameters_Encoding_DefaultBinary,742,Object +MonitoringParameters_Encoding_DefaultJson,15320,Object +MonitoringParameters_Encoding_DefaultXml,741,Object +MultiStateDictionaryEntryDiscreteBaseType,19077,VariableType +MultiStateDictionaryEntryDiscreteType,19084,VariableType +MultiStateDiscreteType,2376,VariableType +MultiStateValueDiscreteType,11238,VariableType +NamespaceMetadataType,11616,ObjectType +NamespacesType,11645,ObjectType +NamingRuleType,120,DataType +NDimensionArrayItemType,12068,VariableType +NegotiationStatus,24216,DataType +NetworkAddressDataType,15502,DataType +NetworkAddressDataType_Encoding_DefaultBinary,21151,Object +NetworkAddressDataType_Encoding_DefaultJson,21199,Object +NetworkAddressDataType_Encoding_DefaultXml,21175,Object +NetworkAddressType,21145,ObjectType +NetworkAddressUrlDataType,15510,DataType +NetworkAddressUrlDataType_Encoding_DefaultBinary,21152,Object +NetworkAddressUrlDataType_Encoding_DefaultJson,21200,Object +NetworkAddressUrlDataType_Encoding_DefaultXml,21176,Object +NetworkAddressUrlType,21147,ObjectType +NetworkGroupDataType,11944,DataType +NetworkGroupDataType_Encoding_DefaultBinary,11958,Object +NetworkGroupDataType_Encoding_DefaultJson,15364,Object +NetworkGroupDataType_Encoding_DefaultXml,11950,Object +NetworkInterfaces,24229,Object +Node,258,DataType +Node_Encoding_DefaultBinary,260,Object +Node_Encoding_DefaultJson,15068,Object +Node_Encoding_DefaultXml,259,Object +NodeAttributes,349,DataType +NodeAttributes_Encoding_DefaultBinary,351,Object +NodeAttributes_Encoding_DefaultJson,15151,Object +NodeAttributes_Encoding_DefaultXml,350,Object +NodeAttributesMask,348,DataType +NodeClass,257,DataType +NodeId,17,DataType +NodeReference,580,DataType +NodeReference_Encoding_DefaultBinary,582,Object +NodeReference_Encoding_DefaultJson,15203,Object +NodeReference_Encoding_DefaultXml,581,Object +NodeTypeDescription,573,DataType +NodeTypeDescription_Encoding_DefaultBinary,575,Object +NodeTypeDescription_Encoding_DefaultJson,15201,Object +NodeTypeDescription_Encoding_DefaultXml,574,Object +NodeVersion,3068,Variable +NonExclusiveDeviationAlarmType,10368,ObjectType +NonExclusiveLevelAlarmType,10060,ObjectType +NonExclusiveLimitAlarmType,9906,ObjectType +NonExclusiveRateOfChangeAlarmType,10214,ObjectType +NonHierarchicalReferences,32,ReferenceType +NonTransparentNetworkRedundancyType,11945,ObjectType +NonTransparentRedundancyType,2039,ObjectType +NormalizedString,12877,DataType +NotificationData,945,DataType +NotificationData_Encoding_DefaultBinary,947,Object +NotificationData_Encoding_DefaultJson,15344,Object +NotificationData_Encoding_DefaultXml,946,Object +NotificationMessage,803,DataType +NotificationMessage_Encoding_DefaultBinary,805,Object +NotificationMessage_Encoding_DefaultJson,15343,Object +NotificationMessage_Encoding_DefaultXml,804,Object +Number,26,DataType +NumericRange,291,DataType +ObjectAttributes,352,DataType +ObjectAttributes_Encoding_DefaultBinary,354,Object +ObjectAttributes_Encoding_DefaultJson,15152,Object +ObjectAttributes_Encoding_DefaultXml,353,Object +ObjectNode,261,DataType +ObjectNode_Encoding_DefaultBinary,263,Object +ObjectNode_Encoding_DefaultJson,15071,Object +ObjectNode_Encoding_DefaultXml,262,Object +ObjectsFolder,85,Object +ObjectTypeAttributes,361,DataType +ObjectTypeAttributes_Encoding_DefaultBinary,363,Object +ObjectTypeAttributes_Encoding_DefaultJson,15158,Object +ObjectTypeAttributes_Encoding_DefaultXml,362,Object +ObjectTypeNode,264,DataType +ObjectTypeNode_Encoding_DefaultBinary,266,Object +ObjectTypeNode_Encoding_DefaultJson,15073,Object +ObjectTypeNode_Encoding_DefaultXml,265,Object +ObjectTypesFolder,88,Object +OffNormalAlarmType,10637,ObjectType +OPCBinarySchema_TypeSystem,93,Object +OpcUa_BinarySchema,7617,Variable +OpcUa_XmlSchema,8252,Variable +OPCUANamespaceMetadata,15957,Object +OpenFileMode,11939,DataType +OpenSecureChannelRequest,444,DataType +OpenSecureChannelRequest_Encoding_DefaultBinary,446,Object +OpenSecureChannelRequest_Encoding_DefaultJson,15132,Object +OpenSecureChannelRequest_Encoding_DefaultXml,445,Object +OpenSecureChannelResponse,447,DataType +OpenSecureChannelResponse_Encoding_DefaultBinary,449,Object +OpenSecureChannelResponse_Encoding_DefaultJson,15133,Object +OpenSecureChannelResponse_Encoding_DefaultXml,448,Object +OperationLimitsType,11564,ObjectType +OptionSet,12755,DataType +OptionSet_Encoding_DefaultBinary,12765,Object +OptionSet_Encoding_DefaultJson,15084,Object +OptionSet_Encoding_DefaultXml,12757,Object +OptionSetType,11487,VariableType +OptionSetValues,12745,Variable +OrderedListType,23518,ObjectType +Organizes,35,ReferenceType +Orientation,18811,DataType +Orientation_Encoding_DefaultBinary,18820,Object +Orientation_Encoding_DefaultJson,19069,Object +Orientation_Encoding_DefaultXml,18856,Object +OrientationType,18779,VariableType +OutputArguments,3073,Variable +OverrideValueHandling,15874,DataType +ParsingResult,610,DataType +ParsingResult_Encoding_DefaultBinary,612,Object +ParsingResult_Encoding_DefaultJson,15236,Object +ParsingResult_Encoding_DefaultXml,611,Object +PerformUpdateType,11293,DataType +PermissionType,94,DataType +ProcessConditionClassType,11164,ObjectType +ProgramDiagnostic2DataType,24033,DataType +ProgramDiagnostic2DataType_Encoding_DefaultBinary,24034,Object +ProgramDiagnostic2DataType_Encoding_DefaultJson,24042,Object +ProgramDiagnostic2DataType_Encoding_DefaultXml,24038,Object +ProgramDiagnostic2Type,15383,VariableType +ProgramDiagnosticDataType,894,DataType +ProgramDiagnosticDataType_Encoding_DefaultBinary,896,Object +ProgramDiagnosticDataType_Encoding_DefaultJson,15381,Object +ProgramDiagnosticDataType_Encoding_DefaultXml,895,Object +ProgramDiagnosticType,2380,VariableType +ProgramStateMachineType,2391,ObjectType +ProgramTransitionAuditEventType,3806,ObjectType +ProgramTransitionEventType,2378,ObjectType +ProgressEventType,11436,ObjectType +PropertyType,68,VariableType +PublishedDataItemsDataType,15581,DataType +PublishedDataItemsDataType_Encoding_DefaultBinary,15679,Object +PublishedDataItemsDataType_Encoding_DefaultJson,16154,Object +PublishedDataItemsDataType_Encoding_DefaultXml,15953,Object +PublishedDataItemsType,14534,ObjectType +PublishedDataSetDataType,15578,DataType +PublishedDataSetDataType_Encoding_DefaultBinary,15677,Object +PublishedDataSetDataType_Encoding_DefaultJson,16152,Object +PublishedDataSetDataType_Encoding_DefaultXml,15951,Object +PublishedDataSetSourceDataType,15580,DataType +PublishedDataSetSourceDataType_Encoding_DefaultBinary,15678,Object +PublishedDataSetSourceDataType_Encoding_DefaultJson,16153,Object +PublishedDataSetSourceDataType_Encoding_DefaultXml,15952,Object +PublishedDataSetType,14509,ObjectType +PublishedEventsDataType,15582,DataType +PublishedEventsDataType_Encoding_DefaultBinary,15681,Object +PublishedEventsDataType_Encoding_DefaultJson,16155,Object +PublishedEventsDataType_Encoding_DefaultXml,15954,Object +PublishedEventsType,14572,ObjectType +PublishedVariableDataType,14273,DataType +PublishedVariableDataType_Encoding_DefaultBinary,14323,Object +PublishedVariableDataType_Encoding_DefaultJson,15060,Object +PublishedVariableDataType_Encoding_DefaultXml,14319,Object +PublishRequest,824,DataType +PublishRequest_Encoding_DefaultBinary,826,Object +PublishRequest_Encoding_DefaultJson,15352,Object +PublishRequest_Encoding_DefaultXml,825,Object +PublishResponse,827,DataType +PublishResponse_Encoding_DefaultBinary,829,Object +PublishResponse_Encoding_DefaultJson,15353,Object +PublishResponse_Encoding_DefaultXml,828,Object +PublishSubscribe,14443,Object +PublishSubscribeType,14416,ObjectType +PubSubCommunicationFailureEventType,15563,ObjectType +PubSubConfigurationDataType,15530,DataType +PubSubConfigurationDataType_Encoding_DefaultBinary,21154,Object +PubSubConfigurationDataType_Encoding_DefaultJson,21202,Object +PubSubConfigurationDataType_Encoding_DefaultXml,21178,Object +PubSubConnectionDataType,15617,DataType +PubSubConnectionDataType_Encoding_DefaultBinary,15694,Object +PubSubConnectionDataType_Encoding_DefaultJson,16281,Object +PubSubConnectionDataType_Encoding_DefaultXml,15992,Object +PubSubConnectionType,14209,ObjectType +PubSubDiagnosticsConnectionType,19786,ObjectType +PubSubDiagnosticsCounterClassification,19730,DataType +PubSubDiagnosticsCounterType,19725,VariableType +PubSubDiagnosticsDataSetReaderType,20027,ObjectType +PubSubDiagnosticsDataSetWriterType,19968,ObjectType +PubSubDiagnosticsReaderGroupType,19903,ObjectType +PubSubDiagnosticsRootType,19732,ObjectType +PubSubDiagnosticsType,19677,ObjectType +PubSubDiagnosticsWriterGroupType,19834,ObjectType +PubSubGroupDataType,15609,DataType +PubSubGroupDataType_Encoding_DefaultBinary,15689,Object +PubSubGroupDataType_Encoding_DefaultJson,16159,Object +PubSubGroupDataType_Encoding_DefaultXml,15988,Object +PubSubGroupType,14232,ObjectType +PubSubKeyServiceType,15906,ObjectType +PubSubState,14647,DataType +PubSubStatusEventType,15535,ObjectType +PubSubStatusType,14643,ObjectType +PubSubTransportLimitsExceedEventType,15548,ObjectType +QualifiedName,20,DataType +QueryDataDescription,570,DataType +QueryDataDescription_Encoding_DefaultBinary,572,Object +QueryDataDescription_Encoding_DefaultJson,15200,Object +QueryDataDescription_Encoding_DefaultXml,571,Object +QueryDataSet,577,DataType +QueryDataSet_Encoding_DefaultBinary,579,Object +QueryDataSet_Encoding_DefaultJson,15202,Object +QueryDataSet_Encoding_DefaultXml,578,Object +QueryFirstRequest,613,DataType +QueryFirstRequest_Encoding_DefaultBinary,615,Object +QueryFirstRequest_Encoding_DefaultJson,15244,Object +QueryFirstRequest_Encoding_DefaultXml,614,Object +QueryFirstResponse,616,DataType +QueryFirstResponse_Encoding_DefaultBinary,618,Object +QueryFirstResponse_Encoding_DefaultJson,15252,Object +QueryFirstResponse_Encoding_DefaultXml,617,Object +QueryNextRequest,619,DataType +QueryNextRequest_Encoding_DefaultBinary,621,Object +QueryNextRequest_Encoding_DefaultJson,15254,Object +QueryNextRequest_Encoding_DefaultXml,620,Object +QueryNextResponse,622,DataType +QueryNextResponse_Encoding_DefaultBinary,624,Object +QueryNextResponse_Encoding_DefaultJson,15255,Object +QueryNextResponse_Encoding_DefaultXml,623,Object +Range,884,DataType +Range_Encoding_DefaultBinary,886,Object +Range_Encoding_DefaultJson,15375,Object +Range_Encoding_DefaultXml,885,Object +RationalNumber,18806,DataType +RationalNumber_Encoding_DefaultBinary,18815,Object +RationalNumber_Encoding_DefaultJson,19064,Object +RationalNumber_Encoding_DefaultXml,18851,Object +RationalNumberType,17709,VariableType +ReadAnnotationDataDetails,23497,DataType +ReadAnnotationDataDetails_Encoding_DefaultBinary,23500,Object +ReadAnnotationDataDetails_Encoding_DefaultJson,23512,Object +ReadAnnotationDataDetails_Encoding_DefaultXml,23506,Object +ReadAtTimeDetails,653,DataType +ReadAtTimeDetails_Encoding_DefaultBinary,655,Object +ReadAtTimeDetails_Encoding_DefaultJson,15269,Object +ReadAtTimeDetails_Encoding_DefaultXml,654,Object +ReaderGroupDataType,15520,DataType +ReaderGroupDataType_Encoding_DefaultBinary,21153,Object +ReaderGroupDataType_Encoding_DefaultJson,21201,Object +ReaderGroupDataType_Encoding_DefaultXml,21177,Object +ReaderGroupMessageDataType,15622,DataType +ReaderGroupMessageDataType_Encoding_DefaultBinary,15702,Object +ReaderGroupMessageDataType_Encoding_DefaultJson,16285,Object +ReaderGroupMessageDataType_Encoding_DefaultXml,15996,Object +ReaderGroupMessageType,21091,ObjectType +ReaderGroupTransportDataType,15621,DataType +ReaderGroupTransportDataType_Encoding_DefaultBinary,15701,Object +ReaderGroupTransportDataType_Encoding_DefaultJson,16284,Object +ReaderGroupTransportDataType_Encoding_DefaultXml,15995,Object +ReaderGroupTransportType,21090,ObjectType +ReaderGroupType,17999,ObjectType +ReadEventDetails,644,DataType +ReadEventDetails_Encoding_DefaultBinary,646,Object +ReadEventDetails_Encoding_DefaultJson,15262,Object +ReadEventDetails_Encoding_DefaultXml,645,Object +ReadProcessedDetails,650,DataType +ReadProcessedDetails_Encoding_DefaultBinary,652,Object +ReadProcessedDetails_Encoding_DefaultJson,15264,Object +ReadProcessedDetails_Encoding_DefaultXml,651,Object +ReadRawModifiedDetails,647,DataType +ReadRawModifiedDetails_Encoding_DefaultBinary,649,Object +ReadRawModifiedDetails_Encoding_DefaultJson,15263,Object +ReadRawModifiedDetails_Encoding_DefaultXml,648,Object +ReadRequest,629,DataType +ReadRequest_Encoding_DefaultBinary,631,Object +ReadRequest_Encoding_DefaultJson,15257,Object +ReadRequest_Encoding_DefaultXml,630,Object +ReadResponse,632,DataType +ReadResponse_Encoding_DefaultBinary,634,Object +ReadResponse_Encoding_DefaultJson,15258,Object +ReadResponse_Encoding_DefaultXml,633,Object +ReadValueId,626,DataType +ReadValueId_Encoding_DefaultBinary,628,Object +ReadValueId_Encoding_DefaultJson,15256,Object +ReadValueId_Encoding_DefaultXml,627,Object +RedundancySupport,851,DataType +RedundantServerDataType,853,DataType +RedundantServerDataType_Encoding_DefaultBinary,855,Object +RedundantServerDataType_Encoding_DefaultJson,15362,Object +RedundantServerDataType_Encoding_DefaultXml,854,Object +ReferenceDescription,518,DataType +ReferenceDescription_Encoding_DefaultBinary,520,Object +ReferenceDescription_Encoding_DefaultJson,15182,Object +ReferenceDescription_Encoding_DefaultXml,519,Object +ReferenceNode,285,DataType +ReferenceNode_Encoding_DefaultBinary,287,Object +ReferenceNode_Encoding_DefaultJson,15080,Object +ReferenceNode_Encoding_DefaultXml,286,Object +References,31,ReferenceType +ReferenceTypeAttributes,367,DataType +ReferenceTypeAttributes_Encoding_DefaultBinary,369,Object +ReferenceTypeAttributes_Encoding_DefaultJson,15160,Object +ReferenceTypeAttributes_Encoding_DefaultXml,368,Object +ReferenceTypeNode,273,DataType +ReferenceTypeNode_Encoding_DefaultBinary,275,Object +ReferenceTypeNode_Encoding_DefaultJson,15076,Object +ReferenceTypeNode_Encoding_DefaultXml,274,Object +ReferenceTypesFolder,91,Object +RefreshEndEventType,2788,ObjectType +RefreshRequiredEventType,2789,ObjectType +RefreshStartEventType,2787,ObjectType +RegisteredServer,432,DataType +RegisteredServer_Encoding_DefaultBinary,434,Object +RegisteredServer_Encoding_DefaultJson,15102,Object +RegisteredServer_Encoding_DefaultXml,433,Object +RegisterNodesRequest,558,DataType +RegisterNodesRequest_Encoding_DefaultBinary,560,Object +RegisterNodesRequest_Encoding_DefaultJson,15195,Object +RegisterNodesRequest_Encoding_DefaultXml,559,Object +RegisterNodesResponse,561,DataType +RegisterNodesResponse_Encoding_DefaultBinary,563,Object +RegisterNodesResponse_Encoding_DefaultJson,15196,Object +RegisterNodesResponse_Encoding_DefaultXml,562,Object +RegisterServer2Request,12193,DataType +RegisterServer2Request_Encoding_DefaultBinary,12211,Object +RegisterServer2Request_Encoding_DefaultJson,15107,Object +RegisterServer2Request_Encoding_DefaultXml,12199,Object +RegisterServer2Response,12194,DataType +RegisterServer2Response_Encoding_DefaultBinary,12212,Object +RegisterServer2Response_Encoding_DefaultJson,15130,Object +RegisterServer2Response_Encoding_DefaultXml,12200,Object +RegisterServerRequest,435,DataType +RegisterServerRequest_Encoding_DefaultBinary,437,Object +RegisterServerRequest_Encoding_DefaultJson,15103,Object +RegisterServerRequest_Encoding_DefaultXml,436,Object +RegisterServerResponse,438,DataType +RegisterServerResponse_Encoding_DefaultBinary,440,Object +RegisterServerResponse_Encoding_DefaultJson,15104,Object +RegisterServerResponse_Encoding_DefaultXml,439,Object +RelativePath,540,DataType +RelativePath_Encoding_DefaultBinary,542,Object +RelativePath_Encoding_DefaultJson,15189,Object +RelativePath_Encoding_DefaultXml,541,Object +RelativePathElement,537,DataType +RelativePathElement_Encoding_DefaultBinary,539,Object +RelativePathElement_Encoding_DefaultJson,15188,Object +RelativePathElement_Encoding_DefaultXml,538,Object +RepublishRequest,830,DataType +RepublishRequest_Encoding_DefaultBinary,832,Object +RepublishRequest_Encoding_DefaultJson,15354,Object +RepublishRequest_Encoding_DefaultXml,831,Object +RepublishResponse,833,DataType +RepublishResponse_Encoding_DefaultBinary,835,Object +RepublishResponse_Encoding_DefaultJson,15355,Object +RepublishResponse_Encoding_DefaultXml,834,Object +RequestHeader,389,DataType +RequestHeader_Encoding_DefaultBinary,391,Object +RequestHeader_Encoding_DefaultJson,15088,Object +RequestHeader_Encoding_DefaultXml,390,Object +Resources,24226,Object +ResponseHeader,392,DataType +ResponseHeader_Encoding_DefaultBinary,394,Object +ResponseHeader_Encoding_DefaultJson,15089,Object +ResponseHeader_Encoding_DefaultXml,393,Object +RoleMappingRuleChangedAuditEventType,17641,ObjectType +RolePermissionType,96,DataType +RolePermissionType_Encoding_DefaultBinary,128,Object +RolePermissionType_Encoding_DefaultJson,15062,Object +RolePermissionType_Encoding_DefaultXml,16126,Object +RoleSetType,15607,ObjectType +RoleType,15620,ObjectType +RootFolder,84,Object +RsaEncryptedSecret,17545,DataType +RsaMinApplicationCertificateType,12559,ObjectType +RsaSha256ApplicationCertificateType,12560,ObjectType +SafetyConditionClassType,17218,ObjectType +SamplingIntervalDiagnosticsArrayType,2164,VariableType +SamplingIntervalDiagnosticsDataType,856,DataType +SamplingIntervalDiagnosticsDataType_Encoding_DefaultBinary,858,Object +SamplingIntervalDiagnosticsDataType_Encoding_DefaultJson,15365,Object +SamplingIntervalDiagnosticsDataType_Encoding_DefaultXml,857,Object +SamplingIntervalDiagnosticsType,2165,VariableType +SByte,2,DataType +SecurityGroupFolderType,15452,ObjectType +SecurityGroupType,15471,ObjectType +SecurityTokenRequestType,315,DataType +SelectionListType,16309,VariableType +SemanticChangeEventType,2738,ObjectType +SemanticChangeStructureDataType,897,DataType +SemanticChangeStructureDataType_Encoding_DefaultBinary,899,Object +SemanticChangeStructureDataType_Encoding_DefaultJson,15374,Object +SemanticChangeStructureDataType_Encoding_DefaultXml,898,Object +Server,2253,Object +Server_ServerRedundancy_CurrentServerId,11312,Variable +Server_ServerRedundancy_RedundantServerArray,11313,Variable +Server_ServerRedundancy_ServerNetworkGroups,14415,Variable +Server_ServerRedundancy_ServerUriArray,11314,Variable +ServerCapabilitiesType,2013,ObjectType +ServerConfiguration,12637,Object +ServerConfigurationType,12581,ObjectType +ServerDiagnosticsSummaryDataType,859,DataType +ServerDiagnosticsSummaryDataType_Encoding_DefaultBinary,861,Object +ServerDiagnosticsSummaryDataType_Encoding_DefaultJson,15366,Object +ServerDiagnosticsSummaryDataType_Encoding_DefaultXml,860,Object +ServerDiagnosticsSummaryType,2150,VariableType +ServerDiagnosticsType,2020,ObjectType +ServerOnNetwork,12189,DataType +ServerOnNetwork_Encoding_DefaultBinary,12207,Object +ServerOnNetwork_Encoding_DefaultJson,15095,Object +ServerOnNetwork_Encoding_DefaultXml,12195,Object +ServerRedundancyType,2034,ObjectType +ServerState,852,DataType +ServerStatusDataType,862,DataType +ServerStatusDataType_Encoding_DefaultBinary,864,Object +ServerStatusDataType_Encoding_DefaultJson,15367,Object +ServerStatusDataType_Encoding_DefaultXml,863,Object +ServerStatusType,2138,VariableType +ServerType,2004,ObjectType +ServerVendorCapabilityType,2137,VariableType +ServiceCounterDataType,871,DataType +ServiceCounterDataType_Encoding_DefaultBinary,873,Object +ServiceCounterDataType_Encoding_DefaultJson,15370,Object +ServiceCounterDataType_Encoding_DefaultXml,872,Object +ServiceFault,395,DataType +ServiceFault_Encoding_DefaultBinary,397,Object +ServiceFault_Encoding_DefaultJson,15090,Object +ServiceFault_Encoding_DefaultXml,396,Object +SessionAuthenticationToken,388,DataType +SessionDiagnosticsArrayType,2196,VariableType +SessionDiagnosticsDataType,865,DataType +SessionDiagnosticsDataType_Encoding_DefaultBinary,867,Object +SessionDiagnosticsDataType_Encoding_DefaultJson,15368,Object +SessionDiagnosticsDataType_Encoding_DefaultXml,866,Object +SessionDiagnosticsObjectType,2029,ObjectType +SessionDiagnosticsVariableType,2197,VariableType +SessionlessInvokeRequestType,15901,DataType +SessionlessInvokeRequestType_Encoding_DefaultBinary,15903,Object +SessionlessInvokeRequestType_Encoding_DefaultJson,15091,Object +SessionlessInvokeRequestType_Encoding_DefaultXml,15902,Object +SessionlessInvokeResponseType,20999,DataType +SessionlessInvokeResponseType_Encoding_DefaultBinary,21001,Object +SessionlessInvokeResponseType_Encoding_DefaultJson,15092,Object +SessionlessInvokeResponseType_Encoding_DefaultXml,21000,Object +SessionsDiagnosticsSummaryType,2026,ObjectType +SessionSecurityDiagnosticsArrayType,2243,VariableType +SessionSecurityDiagnosticsDataType,868,DataType +SessionSecurityDiagnosticsDataType_Encoding_DefaultBinary,870,Object +SessionSecurityDiagnosticsDataType_Encoding_DefaultJson,15369,Object +SessionSecurityDiagnosticsDataType_Encoding_DefaultXml,869,Object +SessionSecurityDiagnosticsType,2244,VariableType +SetMonitoringModeRequest,767,DataType +SetMonitoringModeRequest_Encoding_DefaultBinary,769,Object +SetMonitoringModeRequest_Encoding_DefaultJson,15329,Object +SetMonitoringModeRequest_Encoding_DefaultXml,768,Object +SetMonitoringModeResponse,770,DataType +SetMonitoringModeResponse_Encoding_DefaultBinary,772,Object +SetMonitoringModeResponse_Encoding_DefaultJson,15331,Object +SetMonitoringModeResponse_Encoding_DefaultXml,771,Object +SetPublishingModeRequest,797,DataType +SetPublishingModeRequest_Encoding_DefaultBinary,799,Object +SetPublishingModeRequest_Encoding_DefaultJson,15341,Object +SetPublishingModeRequest_Encoding_DefaultXml,798,Object +SetPublishingModeResponse,800,DataType +SetPublishingModeResponse_Encoding_DefaultBinary,802,Object +SetPublishingModeResponse_Encoding_DefaultJson,15342,Object +SetPublishingModeResponse_Encoding_DefaultXml,801,Object +SetTriggeringRequest,773,DataType +SetTriggeringRequest_Encoding_DefaultBinary,775,Object +SetTriggeringRequest_Encoding_DefaultJson,15332,Object +SetTriggeringRequest_Encoding_DefaultXml,774,Object +SetTriggeringResponse,776,DataType +SetTriggeringResponse_Encoding_DefaultBinary,778,Object +SetTriggeringResponse_Encoding_DefaultJson,15333,Object +SetTriggeringResponse_Encoding_DefaultXml,777,Object +ShelvedStateMachineType,2929,ObjectType +SignatureData,456,DataType +SignatureData_Encoding_DefaultBinary,458,Object +SignatureData_Encoding_DefaultJson,15137,Object +SignatureData_Encoding_DefaultXml,457,Object +SignedSoftwareCertificate,344,DataType +SignedSoftwareCertificate_Encoding_DefaultBinary,346,Object +SignedSoftwareCertificate_Encoding_DefaultJson,15136,Object +SignedSoftwareCertificate_Encoding_DefaultXml,345,Object +SimpleAttributeOperand,601,DataType +SimpleAttributeOperand_Encoding_DefaultBinary,603,Object +SimpleAttributeOperand_Encoding_DefaultJson,15210,Object +SimpleAttributeOperand_Encoding_DefaultXml,602,Object +SimpleTypeDescription,15005,DataType +SimpleTypeDescription_Encoding_DefaultBinary,15421,Object +SimpleTypeDescription_Encoding_DefaultJson,15700,Object +SimpleTypeDescription_Encoding_DefaultXml,15529,Object +StateMachineType,2299,ObjectType +StateType,2307,ObjectType +StateVariableType,2755,VariableType +StatisticalConditionClassType,18665,ObjectType +StatusChangeNotification,818,DataType +StatusChangeNotification_Encoding_DefaultBinary,820,Object +StatusChangeNotification_Encoding_DefaultJson,15350,Object +StatusChangeNotification_Encoding_DefaultXml,819,Object +StatusCode,19,DataType +StatusResult,299,DataType +StatusResult_Encoding_DefaultBinary,301,Object +StatusResult_Encoding_DefaultJson,15371,Object +StatusResult_Encoding_DefaultXml,300,Object +Streams,24230,Object +String,12,DataType +Structure,22,DataType +StructureDefinition,99,DataType +StructureDefinition_Encoding_DefaultBinary,122,Object +StructureDefinition_Encoding_DefaultJson,15066,Object +StructureDefinition_Encoding_DefaultXml,14798,Object +StructureDescription,15487,DataType +StructureDescription_Encoding_DefaultBinary,126,Object +StructureDescription_Encoding_DefaultJson,15058,Object +StructureDescription_Encoding_DefaultXml,15589,Object +StructureField,101,DataType +StructureField_Encoding_DefaultBinary,14844,Object +StructureField_Encoding_DefaultJson,15065,Object +StructureField_Encoding_DefaultXml,14800,Object +StructureType,98,DataType +SubscribedDataSetDataType,15630,DataType +SubscribedDataSetDataType_Encoding_DefaultBinary,15707,Object +SubscribedDataSetDataType_Encoding_DefaultJson,16308,Object +SubscribedDataSetDataType_Encoding_DefaultXml,16010,Object +SubscribedDataSetMirrorDataType,15635,DataType +SubscribedDataSetMirrorDataType_Encoding_DefaultBinary,15713,Object +SubscribedDataSetMirrorDataType_Encoding_DefaultJson,16311,Object +SubscribedDataSetMirrorDataType_Encoding_DefaultXml,16012,Object +SubscribedDataSetMirrorType,15127,ObjectType +SubscribedDataSetType,15108,ObjectType +SubscriptionAcknowledgement,821,DataType +SubscriptionAcknowledgement_Encoding_DefaultBinary,823,Object +SubscriptionAcknowledgement_Encoding_DefaultJson,15351,Object +SubscriptionAcknowledgement_Encoding_DefaultXml,822,Object +SubscriptionDiagnosticsArrayType,2171,VariableType +SubscriptionDiagnosticsDataType,874,DataType +SubscriptionDiagnosticsDataType_Encoding_DefaultBinary,876,Object +SubscriptionDiagnosticsDataType_Encoding_DefaultJson,15372,Object +SubscriptionDiagnosticsDataType_Encoding_DefaultXml,875,Object +SubscriptionDiagnosticsType,2172,VariableType +SystemConditionClassType,11166,ObjectType +SystemDiagnosticAlarmType,18496,ObjectType +SystemEventType,2130,ObjectType +SystemOffNormalAlarmType,11753,ObjectType +SystemStatusChangeEventType,11446,ObjectType +TagVariables,23479,Object +TalkerStreams,24231,Object +TargetVariablesDataType,15631,DataType +TargetVariablesDataType_Encoding_DefaultBinary,15712,Object +TargetVariablesDataType_Encoding_DefaultJson,16310,Object +TargetVariablesDataType_Encoding_DefaultXml,16011,Object +TargetVariablesType,15111,ObjectType +TemporaryFileTransferType,15744,ObjectType +TestingConditionSubClassType,17221,ObjectType +ThreeDCartesianCoordinates,18810,DataType +ThreeDCartesianCoordinates_Encoding_DefaultBinary,18819,Object +ThreeDCartesianCoordinates_Encoding_DefaultJson,19068,Object +ThreeDCartesianCoordinates_Encoding_DefaultXml,18855,Object +ThreeDCartesianCoordinatesType,18774,VariableType +ThreeDFrame,18814,DataType +ThreeDFrame_Encoding_DefaultBinary,18823,Object +ThreeDFrame_Encoding_DefaultJson,19072,Object +ThreeDFrame_Encoding_DefaultXml,18859,Object +ThreeDFrameType,18791,VariableType +ThreeDOrientation,18812,DataType +ThreeDOrientation_Encoding_DefaultBinary,18821,Object +ThreeDOrientation_Encoding_DefaultJson,19070,Object +ThreeDOrientation_Encoding_DefaultXml,18857,Object +ThreeDOrientationType,18781,VariableType +ThreeDVector,18808,DataType +ThreeDVector_Encoding_DefaultBinary,18817,Object +ThreeDVector_Encoding_DefaultJson,19066,Object +ThreeDVector_Encoding_DefaultXml,18853,Object +ThreeDVectorType,17716,VariableType +Time,292,DataType +TimestampsToReturn,625,DataType +TimeString,12880,DataType +TimeZoneDataType,8912,DataType +TimeZoneDataType_Encoding_DefaultBinary,8917,Object +TimeZoneDataType_Encoding_DefaultJson,15086,Object +TimeZoneDataType_Encoding_DefaultXml,8913,Object +Topics,23488,Object +ToState,52,ReferenceType +TrainingConditionClassType,17220,ObjectType +TransferResult,836,DataType +TransferResult_Encoding_DefaultBinary,838,Object +TransferResult_Encoding_DefaultJson,15356,Object +TransferResult_Encoding_DefaultXml,837,Object +TransferSubscriptionsRequest,839,DataType +TransferSubscriptionsRequest_Encoding_DefaultBinary,841,Object +TransferSubscriptionsRequest_Encoding_DefaultJson,15357,Object +TransferSubscriptionsRequest_Encoding_DefaultXml,840,Object +TransferSubscriptionsResponse,842,DataType +TransferSubscriptionsResponse_Encoding_DefaultBinary,844,Object +TransferSubscriptionsResponse_Encoding_DefaultJson,15358,Object +TransferSubscriptionsResponse_Encoding_DefaultXml,843,Object +TransitionEventType,2311,ObjectType +TransitionType,2310,ObjectType +TransitionVariableType,2762,VariableType +TranslateBrowsePathsToNodeIdsRequest,552,DataType +TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary,554,Object +TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultJson,15193,Object +TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultXml,553,Object +TranslateBrowsePathsToNodeIdsResponse,555,DataType +TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultBinary,557,Object +TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultJson,15194,Object +TranslateBrowsePathsToNodeIdsResponse_Encoding_DefaultXml,556,Object +TransparentRedundancyType,2036,ObjectType +TripAlarmType,10751,ObjectType +TrustListDataType,12554,DataType +TrustListDataType_Encoding_DefaultBinary,12680,Object +TrustListDataType_Encoding_DefaultJson,15044,Object +TrustListDataType_Encoding_DefaultXml,12676,Object +TrustListMasks,12552,DataType +TrustListOutOfDateAlarmType,19297,ObjectType +TrustListType,12522,ObjectType +TrustListUpdatedAuditEventType,12561,ObjectType +TsnFailureCode,24218,DataType +TsnListenerStatus,24224,DataType +TsnStreamState,24220,DataType +TsnTalkerStatus,24222,DataType +TwoStateDiscreteType,2373,VariableType +TwoStateVariableType,8995,VariableType +TypeNode,11880,DataType +TypeNode_Encoding_DefaultBinary,11890,Object +TypeNode_Encoding_DefaultJson,15070,Object +TypeNode_Encoding_DefaultXml,11888,Object +TypesFolder,86,Object +UABinaryFileDataType,15006,DataType +UABinaryFileDataType_Encoding_DefaultBinary,15422,Object +UABinaryFileDataType_Encoding_DefaultJson,15714,Object +UABinaryFileDataType_Encoding_DefaultXml,15531,Object +UadpDataSetMessageContentMask,15646,DataType +UadpDataSetReaderMessageDataType,15653,DataType +UadpDataSetReaderMessageDataType_Encoding_DefaultBinary,15718,Object +UadpDataSetReaderMessageDataType_Encoding_DefaultJson,16392,Object +UadpDataSetReaderMessageDataType_Encoding_DefaultXml,16016,Object +UadpDataSetReaderMessageType,21116,ObjectType +UadpDataSetWriterMessageDataType,15652,DataType +UadpDataSetWriterMessageDataType_Encoding_DefaultBinary,15717,Object +UadpDataSetWriterMessageDataType_Encoding_DefaultJson,16391,Object +UadpDataSetWriterMessageDataType_Encoding_DefaultXml,16015,Object +UadpDataSetWriterMessageType,21111,ObjectType +UadpNetworkMessageContentMask,15642,DataType +UadpWriterGroupMessageDataType,15645,DataType +UadpWriterGroupMessageDataType_Encoding_DefaultBinary,15715,Object +UadpWriterGroupMessageDataType_Encoding_DefaultJson,16323,Object +UadpWriterGroupMessageDataType_Encoding_DefaultXml,16014,Object +UadpWriterGroupMessageType,21105,ObjectType +UInt16,5,DataType +UInt32,7,DataType +UInt64,9,DataType +UInteger,28,DataType +Union,12756,DataType +Union_Encoding_DefaultBinary,12766,Object +Union_Encoding_DefaultJson,15085,Object +Union_Encoding_DefaultXml,12758,Object +UnregisterNodesRequest,564,DataType +UnregisterNodesRequest_Encoding_DefaultBinary,566,Object +UnregisterNodesRequest_Encoding_DefaultJson,15197,Object +UnregisterNodesRequest_Encoding_DefaultXml,565,Object +UnregisterNodesResponse,567,DataType +UnregisterNodesResponse_Encoding_DefaultBinary,569,Object +UnregisterNodesResponse_Encoding_DefaultJson,15198,Object +UnregisterNodesResponse_Encoding_DefaultXml,568,Object +UnsignedRationalNumber,24107,DataType +UnsignedRationalNumber_Encoding_DefaultBinary,24110,Object +UnsignedRationalNumber_Encoding_DefaultJson,24134,Object +UnsignedRationalNumber_Encoding_DefaultXml,24122,Object +UpdateDataDetails,680,DataType +UpdateDataDetails_Encoding_DefaultBinary,682,Object +UpdateDataDetails_Encoding_DefaultJson,15280,Object +UpdateDataDetails_Encoding_DefaultXml,681,Object +UpdateEventDetails,683,DataType +UpdateEventDetails_Encoding_DefaultBinary,685,Object +UpdateEventDetails_Encoding_DefaultJson,15282,Object +UpdateEventDetails_Encoding_DefaultXml,684,Object +UpdateStructureDataDetails,11295,DataType +UpdateStructureDataDetails_Encoding_DefaultBinary,11300,Object +UpdateStructureDataDetails_Encoding_DefaultJson,15281,Object +UpdateStructureDataDetails_Encoding_DefaultXml,11296,Object +UriDictionaryEntryType,17600,ObjectType +UserCredentialCertificateType,15181,ObjectType +UserIdentityToken,316,DataType +UserIdentityToken_Encoding_DefaultBinary,318,Object +UserIdentityToken_Encoding_DefaultJson,15140,Object +UserIdentityToken_Encoding_DefaultXml,317,Object +UserNameIdentityToken,322,DataType +UserNameIdentityToken_Encoding_DefaultBinary,324,Object +UserNameIdentityToken_Encoding_DefaultJson,15142,Object +UserNameIdentityToken_Encoding_DefaultXml,323,Object +UserTokenPolicy,304,DataType +UserTokenPolicy_Encoding_DefaultBinary,306,Object +UserTokenPolicy_Encoding_DefaultJson,15098,Object +UserTokenPolicy_Encoding_DefaultXml,305,Object +UserTokenType,303,DataType +UtcTime,294,DataType +ValueAsText,11433,Variable +VariableAttributes,355,DataType +VariableAttributes_Encoding_DefaultBinary,357,Object +VariableAttributes_Encoding_DefaultJson,15153,Object +VariableAttributes_Encoding_DefaultXml,356,Object +VariableNode,267,DataType +VariableNode_Encoding_DefaultBinary,269,Object +VariableNode_Encoding_DefaultJson,15074,Object +VariableNode_Encoding_DefaultXml,268,Object +VariableTypeAttributes,364,DataType +VariableTypeAttributes_Encoding_DefaultBinary,366,Object +VariableTypeAttributes_Encoding_DefaultJson,15159,Object +VariableTypeAttributes_Encoding_DefaultXml,365,Object +VariableTypeNode,270,DataType +VariableTypeNode_Encoding_DefaultBinary,272,Object +VariableTypeNode_Encoding_DefaultJson,15075,Object +VariableTypeNode_Encoding_DefaultXml,271,Object +VariableTypesFolder,89,Object +Vector,18807,DataType +Vector_Encoding_DefaultBinary,18816,Object +Vector_Encoding_DefaultJson,19065,Object +Vector_Encoding_DefaultXml,18852,Object +VectorType,17714,VariableType +VendorServerInfoType,2033,ObjectType +VersionTime,20998,DataType +ViewAttributes,373,DataType +ViewAttributes_Encoding_DefaultBinary,375,Object +ViewAttributes_Encoding_DefaultJson,15162,Object +ViewAttributes_Encoding_DefaultXml,374,Object +ViewDescription,511,DataType +ViewDescription_Encoding_DefaultBinary,513,Object +ViewDescription_Encoding_DefaultJson,15179,Object +ViewDescription_Encoding_DefaultXml,512,Object +ViewNode,279,DataType +ViewNode_Encoding_DefaultBinary,281,Object +ViewNode_Encoding_DefaultJson,15078,Object +ViewNode_Encoding_DefaultXml,280,Object +ViewsFolder,87,Object +ViewVersion,12170,Variable +WellKnownRole_Anonymous,15644,Object +WellKnownRole_AuthenticatedUser,15656,Object +WellKnownRole_ConfigureAdmin,15716,Object +WellKnownRole_Engineer,16036,Object +WellKnownRole_Observer,15668,Object +WellKnownRole_Operator,15680,Object +WellKnownRole_SecurityAdmin,15704,Object +WellKnownRole_Supervisor,15692,Object +WriteRequest,671,DataType +WriteRequest_Encoding_DefaultBinary,673,Object +WriteRequest_Encoding_DefaultJson,15277,Object +WriteRequest_Encoding_DefaultXml,672,Object +WriteResponse,674,DataType +WriteResponse_Encoding_DefaultBinary,676,Object +WriteResponse_Encoding_DefaultJson,15278,Object +WriteResponse_Encoding_DefaultXml,675,Object +WriterGroupDataType,15480,DataType +WriterGroupDataType_Encoding_DefaultBinary,21150,Object +WriterGroupDataType_Encoding_DefaultJson,21198,Object +WriterGroupDataType_Encoding_DefaultXml,21174,Object +WriterGroupMessageDataType,15616,DataType +WriterGroupMessageDataType_Encoding_DefaultBinary,15693,Object +WriterGroupMessageDataType_Encoding_DefaultJson,16280,Object +WriterGroupMessageDataType_Encoding_DefaultXml,15991,Object +WriterGroupMessageType,17998,ObjectType +WriterGroupTransportDataType,15611,DataType +WriterGroupTransportDataType_Encoding_DefaultBinary,15691,Object +WriterGroupTransportDataType_Encoding_DefaultJson,16161,Object +WriterGroupTransportDataType_Encoding_DefaultXml,15990,Object +WriterGroupTransportType,17997,ObjectType +WriterGroupType,17725,ObjectType +WriteValue,668,DataType +WriteValue_Encoding_DefaultBinary,670,Object +WriteValue_Encoding_DefaultJson,15276,Object +WriteValue_Encoding_DefaultXml,669,Object +X509IdentityToken,325,DataType +X509IdentityToken_Encoding_DefaultBinary,327,Object +X509IdentityToken_Encoding_DefaultJson,15143,Object +X509IdentityToken_Encoding_DefaultXml,326,Object +XmlElement,16,DataType +XmlSchema_TypeSystem,92,Object +XVType,12080,DataType +XVType_Encoding_DefaultBinary,12090,Object +XVType_Encoding_DefaultJson,15380,Object +XVType_Encoding_DefaultXml,12082,Object +XYArrayItemType,12038,VariableType +YArrayItemType,12029,VariableType diff --git a/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml b/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml new file mode 100644 index 00000000000..d37964bb2fa --- /dev/null +++ b/protocols/opcua/downloads/Opc.Ua.NodeSet2.Services.xml @@ -0,0 +1,63477 @@ + + + + + + + + + i=1 + i=2 + i=3 + i=4 + i=5 + i=6 + i=7 + i=8 + i=9 + i=10 + i=11 + i=13 + i=12 + i=15 + i=14 + i=16 + i=17 + i=18 + i=20 + i=21 + i=19 + i=22 + i=26 + i=27 + i=28 + i=47 + i=46 + i=35 + i=36 + i=48 + i=45 + i=40 + i=37 + i=38 + i=39 + i=53 + i=52 + i=51 + i=54 + i=9004 + i=9005 + i=17597 + i=9006 + i=15112 + i=17604 + i=17603 + + + Default Binary + + i=58 + + + + Default XML + + i=58 + + + + BaseDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + + + Number + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=24 + + + + Integer + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=26 + + + + UInteger + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=26 + + + + Enumeration + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1 + + i=24 + + + + + Boolean + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.8 + + i=24 + + + + SByte + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.17 + + i=27 + + + + Byte + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.9 + + i=28 + + + + Int16 + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.25 + + i=27 + + + + UInt16 + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.35 + + i=28 + + + + Int32 + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.26 + + i=27 + + + + UInt32 + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.36 + + i=28 + + + + Int64 + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.27 + + i=27 + + + + UInt64 + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=28 + + + + Float + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.15 + + i=26 + + + + Double + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=26 + + + + String + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=24 + + + + DateTime + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=24 + + + + Guid + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.16 + + i=24 + + + + ByteString + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=24 + + + + XmlElement + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.39 + + i=24 + + + + NodeId + https://reference.opcfoundation.org/v104/Core/docs/Part3/5.2.2 + + i=24 + + + + ExpandedNodeId + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.11 + + i=24 + + + + StatusCode + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.34.1 + + i=24 + + + + QualifiedName + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.3 + + i=24 + + + + LocalizedText + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.5 + + i=24 + + + + Structure + https://reference.opcfoundation.org/v104/Part22/docs/5.3.2 + + i=24 + + + + DataValue + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.7.1 + + i=24 + + + + DiagnosticInfo + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.8 + + i=24 + + + + Image + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=15 + + + + Decimal + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.54 + + i=26 + + + + References + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.1 + + + + NonHierarchicalReferences + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.3 + + i=31 + + + + HierarchicalReferences + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.2 + + i=31 + + HierarchicalReferences + + + HasChild + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.4 + + i=33 + + ChildOf + + + Organizes + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.6 + + i=33 + + OrganizedBy + + + HasEventSource + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.14 + + i=33 + + EventSourceOf + + + HasModellingRule + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.11 + + i=32 + + ModellingRuleOf + + + HasEncoding + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.13 + + i=32 + + EncodingOf + + + HasDescription + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.1 + + i=32 + + DescriptionOf + + + HasTypeDefinition + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.12 + + i=32 + + TypeDefinitionOf + + + GeneratesEvent + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.16 + + i=32 + + GeneratedBy + + + AlwaysGeneratesEvent + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.17 + + i=41 + + AlwaysGeneratedBy + + + Aggregates + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.5 + + i=34 + + AggregatedBy + + + HasSubtype + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.10 + + i=34 + + SubtypeOf + + + HasProperty + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.9 + + i=44 + + PropertyOf + + + HasComponent + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.7 + + i=44 + + ComponentOf + + + HasNotifier + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.15 + + i=36 + + NotifierOf + + + HasOrderedComponent + https://reference.opcfoundation.org/v104/Core/docs/Part5/11.8 + + i=47 + + OrderedComponentOf + + + FromState + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.11 + + i=32 + + ToTransition + + + ToState + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.12 + + i=32 + + FromTransition + + + HasCause + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.13 + + i=32 + + MayBeCausedBy + + + HasEffect + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.14 + + i=32 + + MayBeEffectedBy + + + HasSubStateMachine + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.15 + + i=32 + + SubStateMachineOf + + + HasHistoricalConfiguration + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.2.3 + + i=44 + + HistoricalConfigurationOf + + + BaseObjectType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.2 + + + + FolderType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.6 + + i=58 + + + + BaseVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.2 + + + + BaseDataVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.4 + + i=62 + + + + PropertyType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.3 + + i=62 + + + + DataTypeDescriptionType + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.3 + + i=104 + i=105 + i=63 + + + + DataTypeVersion + + i=68 + i=80 + i=69 + + + + DictionaryFragment + + i=68 + i=80 + i=69 + + + + DataTypeDictionaryType + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.2 + + i=106 + i=107 + i=15001 + i=63 + + + + DataTypeVersion + + i=68 + i=80 + i=72 + + + + NamespaceUri + + i=68 + i=80 + i=72 + + + + Deprecated + + i=68 + i=80 + i=72 + + + + DataTypeSystemType + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.4 + + i=58 + + + + DataTypeEncodingType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.7 + + i=58 + + + + NamingRuleType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.29 + + i=12169 + i=29 + + + + The BrowseName must appear in all instances of the type. + + + The BrowseName may appear in an instance of the type. + + + The modelling rule defines a constraint and the BrowseName is not used in an instance of the type. + + + + + EnumValues + + i=68 + i=120 + + + + + + i=7616 + + + + 1 + + Mandatory + + + The BrowseName must appear in all instances of the type. + + + + + + + i=7616 + + + + 2 + + Optional + + + The BrowseName may appear in an instance of the type. + + + + + + + i=7616 + + + + 3 + + Constraint + + + The modelling rule defines a constraint and the BrowseName is not used in an instance of the type. + + + + + + + + + ModellingRuleType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.5 + + i=111 + i=58 + + + + NamingRule + + i=68 + i=78 + i=77 + + + 1 + + + + Mandatory + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.2 + + i=112 + i=77 + + + + NamingRule + + i=68 + i=78 + + + 1 + + + + Optional + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.3 + + i=113 + i=77 + + + + NamingRule + + i=68 + i=80 + + + 2 + + + + ExposesItsArray + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.1 + + i=114 + i=77 + + + + NamingRule + + i=68 + i=83 + + + 3 + + + + OptionalPlaceholder + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.4 + + i=11509 + i=77 + + + + NamingRule + + i=68 + i=11508 + + + 2 + + + + MandatoryPlaceholder + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.4.5 + + i=11511 + i=77 + + + + NamingRule + + i=68 + i=11510 + + + 1 + + + + Root + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.2 + + i=61 + + + + Objects + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.4 + + i=84 + i=61 + + + + Types + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.5 + + i=84 + i=61 + + + + Views + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.3 + + i=84 + i=61 + + + + ObjectTypes + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.6 + + i=86 + i=58 + i=61 + + + + VariableTypes + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.7 + + i=86 + i=62 + i=61 + + + + DataTypes + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.9 + + i=86 + i=24 + i=61 + + + + ReferenceTypes + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.8 + + i=86 + i=31 + i=61 + + + + XML Schema + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.6 + + i=90 + i=75 + + + + OPC Binary + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.5 + + i=90 + i=75 + + + + HasArgumentDescription + https://reference.opcfoundation.org/v104/Core/docs/Amendment3/11.18 + + i=47 + + ArgumentDescriptionOf + + + HasOptionalInputArgumentDescription + https://reference.opcfoundation.org/v104/Core/docs/Amendment3/11.19 + + i=129 + + OptionalInputArgumentDescriptionOf + + + http://opcfoundation.org/UA/ + + i=15958 + i=15959 + i=15960 + i=15961 + i=15962 + i=15963 + i=15964 + i=16134 + i=16135 + i=16136 + i=11715 + i=11616 + + + + NamespaceUri + + i=68 + i=15957 + + + http://opcfoundation.org/UA/ + + + + NamespaceVersion + + i=68 + i=15957 + + + 1.04.10 + + + + NamespacePublicationDate + + i=68 + i=15957 + + + 2021-09-15T00:00:00Z + + + + IsNamespaceSubset + + i=68 + i=15957 + + + false + + + + StaticNodeIdTypes + + i=68 + i=15957 + + + + 0 + + + + + StaticNumericNodeIdRange + + i=68 + i=15957 + + + + 1:2252 + 2270 + 2273 + 2280 + 2283 + 2291:2293 + 2297:2734 + 2738:2991 + 2995 + 2998:3703 + 3710:11191 + 11194:11195 + 11202:11241 + 11243:11272 + 11276:11280 + 11284:11311 + 11315:11491 + 11495:11501 + 11503:11701 + 11706 + 11708 + 11716:12164 + 12169:12748 + 12752:12872 + 12875:12884 + 12888:12910 + 12912:14414 + 14416:15003 + 15005:15605 + 15607:16300 + 16306:17633 + 17635:19090 + 19092:2147483647 + + + + + StaticStringNodeIdPattern + + i=68 + i=15957 + + + + + + + DefaultRolePermissions + + i=68 + i=15957 + + + + DefaultUserRolePermissions + + i=68 + i=15957 + + + + DefaultAccessRestrictions + + i=68 + i=15957 + + + + NodeVersion + + i=68 + + + + ViewVersion + + i=68 + + + + Icon + + i=68 + + + + LocalTime + + i=68 + + + + AllowNulls + + i=68 + + + + ValueAsText + + i=68 + + + + MaxStringLength + + i=68 + + + + MaxCharacters + + i=68 + + + + MaxByteStringLength + + i=68 + + + + MaxArrayLength + + i=68 + + + + EngineeringUnits + + i=68 + + + + EnumStrings + + i=68 + + + + EnumValues + + i=68 + + + + OptionSetValues + + i=68 + + + + InputArguments + + i=68 + + + + OutputArguments + + i=68 + + + + DefaultInstanceBrowseName + + i=68 + + + + ImageBMP + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.20 + + i=30 + + + + ImageGIF + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.21 + + i=30 + + + + ImageJPG + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.22 + + i=30 + + + + ImagePNG + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.23 + + i=30 + + + + AudioDataType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.53 + + i=15 + + + + Union + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.42 + + i=22 + + + + + ServerType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.1 + + i=2005 + i=2006 + i=15003 + i=2007 + i=2008 + i=2742 + i=12882 + i=17612 + i=2009 + i=2010 + i=2011 + i=2012 + i=11527 + i=11489 + i=12871 + i=12746 + i=12883 + i=58 + + + + ServerArray + + i=68 + i=78 + i=2004 + + + + NamespaceArray + + i=68 + i=78 + i=2004 + + + + UrisVersion + + i=68 + i=80 + i=2004 + + + + ServerStatus + + i=3074 + i=3075 + i=3076 + i=3077 + i=3084 + i=3085 + i=2138 + i=78 + i=2004 + + + + StartTime + + i=63 + i=78 + i=2007 + + + + CurrentTime + + i=63 + i=78 + i=2007 + + + + State + + i=63 + i=78 + i=2007 + + + + BuildInfo + + i=3078 + i=3079 + i=3080 + i=3081 + i=3082 + i=3083 + i=3051 + i=78 + i=2007 + + + + ProductUri + + i=63 + i=78 + i=3077 + + + + ManufacturerName + + i=63 + i=78 + i=3077 + + + + ProductName + + i=63 + i=78 + i=3077 + + + + SoftwareVersion + + i=63 + i=78 + i=3077 + + + + BuildNumber + + i=63 + i=78 + i=3077 + + + + BuildDate + + i=63 + i=78 + i=3077 + + + + SecondsTillShutdown + + i=63 + i=78 + i=2007 + + + + ShutdownReason + + i=63 + i=78 + i=2007 + + + + ServiceLevel + + i=68 + i=78 + i=2004 + + + + Auditing + + i=68 + i=78 + i=2004 + + + + EstimatedReturnTime + + i=68 + i=80 + i=2004 + + + + LocalTime + + i=68 + i=80 + i=2004 + + + + ServerCapabilities + + i=3086 + i=3087 + i=3088 + i=3089 + i=3090 + i=3091 + i=3092 + i=3093 + i=3094 + i=2013 + i=78 + i=2004 + + + + ServerProfileArray + + i=68 + i=78 + i=2009 + + + + LocaleIdArray + + i=68 + i=78 + i=2009 + + + + MinSupportedSampleRate + + i=68 + i=78 + i=2009 + + + + MaxBrowseContinuationPoints + + i=68 + i=78 + i=2009 + + + + MaxQueryContinuationPoints + + i=68 + i=78 + i=2009 + + + + MaxHistoryContinuationPoints + + i=68 + i=78 + i=2009 + + + + SoftwareCertificates + + i=68 + i=78 + i=2009 + + + + ModellingRules + + i=61 + i=78 + i=2009 + + + + AggregateFunctions + + i=61 + i=78 + i=2009 + + + + ServerDiagnostics + + i=3095 + i=3110 + i=3111 + i=3114 + i=2020 + i=78 + i=2004 + + + + ServerDiagnosticsSummary + + i=3096 + i=3097 + i=3098 + i=3099 + i=3100 + i=3101 + i=3102 + i=3104 + i=3105 + i=3106 + i=3107 + i=3108 + i=2150 + i=78 + i=2010 + + + + ServerViewCount + + i=63 + i=78 + i=3095 + + + + CurrentSessionCount + + i=63 + i=78 + i=3095 + + + + CumulatedSessionCount + + i=63 + i=78 + i=3095 + + + + SecurityRejectedSessionCount + + i=63 + i=78 + i=3095 + + + + RejectedSessionCount + + i=63 + i=78 + i=3095 + + + + SessionTimeoutCount + + i=63 + i=78 + i=3095 + + + + SessionAbortCount + + i=63 + i=78 + i=3095 + + + + PublishingIntervalCount + + i=63 + i=78 + i=3095 + + + + CurrentSubscriptionCount + + i=63 + i=78 + i=3095 + + + + CumulatedSubscriptionCount + + i=63 + i=78 + i=3095 + + + + SecurityRejectedRequestsCount + + i=63 + i=78 + i=3095 + + + + RejectedRequestsCount + + i=63 + i=78 + i=3095 + + + + SubscriptionDiagnosticsArray + + i=2171 + i=78 + i=2010 + + + + SessionsDiagnosticsSummary + + i=3112 + i=3113 + i=2026 + i=78 + i=2010 + + + + SessionDiagnosticsArray + + i=2196 + i=78 + i=3111 + + + + SessionSecurityDiagnosticsArray + + i=2243 + i=78 + i=3111 + + + + EnabledFlag + + i=68 + i=78 + i=2010 + + + + VendorServerInfo + + i=2033 + i=78 + i=2004 + + + + ServerRedundancy + + i=3115 + i=2034 + i=78 + i=2004 + + + + RedundancySupport + + i=68 + i=78 + i=2012 + + + + Namespaces + + i=11645 + i=80 + i=2004 + + + + GetMonitoredItems + + i=11490 + i=11491 + i=80 + i=2004 + + + + InputArguments + + i=68 + i=78 + i=11489 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11489 + + + + + + i=297 + + + + ServerHandles + + i=7 + + 1 + + 0 + + + + + + + i=297 + + + + ClientHandles + + i=7 + + 1 + + 0 + + + + + + + + + ResendData + + i=12872 + i=80 + i=2004 + + + + InputArguments + + i=68 + i=78 + i=12871 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + + + SetSubscriptionDurable + + i=12747 + i=12748 + i=80 + i=2004 + + + + InputArguments + + i=68 + i=78 + i=12746 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + i=297 + + + + LifetimeInHours + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=12746 + + + + + + i=297 + + + + RevisedLifetimeInHours + + i=7 + + -1 + + + + + + + + + RequestServerStateChange + + i=12884 + i=80 + i=2004 + + + + InputArguments + + i=68 + i=78 + i=12883 + + + + + + i=297 + + + + State + + i=852 + + -1 + + + + + + + i=297 + + + + EstimatedReturnTime + + i=13 + + -1 + + + + + + + i=297 + + + + SecondsTillShutdown + + i=7 + + -1 + + + + + + + i=297 + + + + Reason + + i=21 + + -1 + + + + + + + i=297 + + + + Restart + + i=1 + + -1 + + + + + + + + + ServerCapabilitiesType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.2 + + i=2014 + i=2016 + i=2017 + i=2732 + i=2733 + i=2734 + i=3049 + i=11549 + i=11550 + i=12910 + i=11551 + i=2019 + i=2754 + i=11562 + i=16295 + i=58 + + + + ServerProfileArray + + i=68 + i=78 + i=2013 + + + + LocaleIdArray + + i=68 + i=78 + i=2013 + + + + MinSupportedSampleRate + + i=68 + i=78 + i=2013 + + + + MaxBrowseContinuationPoints + + i=68 + i=78 + i=2013 + + + + MaxQueryContinuationPoints + + i=68 + i=78 + i=2013 + + + + MaxHistoryContinuationPoints + + i=68 + i=78 + i=2013 + + + + SoftwareCertificates + + i=68 + i=78 + i=2013 + + + + MaxArrayLength + + i=68 + i=80 + i=2013 + + + + MaxStringLength + + i=68 + i=80 + i=2013 + + + + MaxByteStringLength + + i=68 + i=80 + i=2013 + + + + OperationLimits + + i=11564 + i=80 + i=2013 + + + + ModellingRules + + i=61 + i=78 + i=2013 + + + + AggregateFunctions + + i=61 + i=78 + i=2013 + + + + <VendorCapability> + + i=2137 + i=11508 + i=2013 + + + + RoleSet + + i=16296 + i=16299 + i=15607 + i=80 + i=2013 + + + + AddRole + + i=16297 + i=16298 + i=78 + i=16295 + + + + InputArguments + + i=68 + i=78 + i=16296 + + + + + + i=297 + + + + RoleName + + i=12 + + -1 + + + + + + + i=297 + + + + NamespaceUri + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16296 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + RemoveRole + + i=16300 + i=78 + i=16295 + + + + InputArguments + + i=68 + i=78 + i=16299 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + ServerDiagnosticsType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.3 + + i=2021 + i=2022 + i=2023 + i=2744 + i=2025 + i=58 + + + + ServerDiagnosticsSummary + + i=3116 + i=3117 + i=3118 + i=3119 + i=3120 + i=3121 + i=3122 + i=3124 + i=3125 + i=3126 + i=3127 + i=3128 + i=2150 + i=78 + i=2020 + + + + ServerViewCount + + i=63 + i=78 + i=2021 + + + + CurrentSessionCount + + i=63 + i=78 + i=2021 + + + + CumulatedSessionCount + + i=63 + i=78 + i=2021 + + + + SecurityRejectedSessionCount + + i=63 + i=78 + i=2021 + + + + RejectedSessionCount + + i=63 + i=78 + i=2021 + + + + SessionTimeoutCount + + i=63 + i=78 + i=2021 + + + + SessionAbortCount + + i=63 + i=78 + i=2021 + + + + PublishingIntervalCount + + i=63 + i=78 + i=2021 + + + + CurrentSubscriptionCount + + i=63 + i=78 + i=2021 + + + + CumulatedSubscriptionCount + + i=63 + i=78 + i=2021 + + + + SecurityRejectedRequestsCount + + i=63 + i=78 + i=2021 + + + + RejectedRequestsCount + + i=63 + i=78 + i=2021 + + + + SamplingIntervalDiagnosticsArray + + i=2164 + i=80 + i=2020 + + + + SubscriptionDiagnosticsArray + + i=2171 + i=78 + i=2020 + + + + SessionsDiagnosticsSummary + + i=3129 + i=3130 + i=2026 + i=78 + i=2020 + + + + SessionDiagnosticsArray + + i=2196 + i=78 + i=2744 + + + + SessionSecurityDiagnosticsArray + + i=2243 + i=78 + i=2744 + + + + EnabledFlag + + i=68 + i=78 + i=2020 + + + + SessionsDiagnosticsSummaryType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.4 + + i=2027 + i=2028 + i=12097 + i=58 + + + + SessionDiagnosticsArray + + i=2196 + i=78 + i=2026 + + + + SessionSecurityDiagnosticsArray + + i=2243 + i=78 + i=2026 + + + + <ClientName> + + i=12098 + i=12142 + i=12152 + i=2029 + i=11508 + i=2026 + + + + SessionDiagnostics + + i=12099 + i=12100 + i=12101 + i=12102 + i=12103 + i=12104 + i=12105 + i=12106 + i=12107 + i=12108 + i=12109 + i=12110 + i=12111 + i=12112 + i=12113 + i=12114 + i=12115 + i=12116 + i=12117 + i=12118 + i=12119 + i=12120 + i=12121 + i=12122 + i=12123 + i=12124 + i=12125 + i=12126 + i=12127 + i=12128 + i=12129 + i=12130 + i=12131 + i=12132 + i=12133 + i=12134 + i=12135 + i=12136 + i=12137 + i=12138 + i=12139 + i=12140 + i=12141 + i=2197 + i=78 + i=12097 + + + + SessionId + + i=63 + i=78 + i=12098 + + + + SessionName + + i=63 + i=78 + i=12098 + + + + ClientDescription + + i=63 + i=78 + i=12098 + + + + ServerUri + + i=63 + i=78 + i=12098 + + + + EndpointUrl + + i=63 + i=78 + i=12098 + + + + LocaleIds + + i=63 + i=78 + i=12098 + + + + ActualSessionTimeout + + i=63 + i=78 + i=12098 + + + + MaxResponseMessageSize + + i=63 + i=78 + i=12098 + + + + ClientConnectionTime + + i=63 + i=78 + i=12098 + + + + ClientLastContactTime + + i=63 + i=78 + i=12098 + + + + CurrentSubscriptionsCount + + i=63 + i=78 + i=12098 + + + + CurrentMonitoredItemsCount + + i=63 + i=78 + i=12098 + + + + CurrentPublishRequestsInQueue + + i=63 + i=78 + i=12098 + + + + TotalRequestCount + + i=63 + i=78 + i=12098 + + + + UnauthorizedRequestCount + + i=63 + i=78 + i=12098 + + + + ReadCount + + i=63 + i=78 + i=12098 + + + + HistoryReadCount + + i=63 + i=78 + i=12098 + + + + WriteCount + + i=63 + i=78 + i=12098 + + + + HistoryUpdateCount + + i=63 + i=78 + i=12098 + + + + CallCount + + i=63 + i=78 + i=12098 + + + + CreateMonitoredItemsCount + + i=63 + i=78 + i=12098 + + + + ModifyMonitoredItemsCount + + i=63 + i=78 + i=12098 + + + + SetMonitoringModeCount + + i=63 + i=78 + i=12098 + + + + SetTriggeringCount + + i=63 + i=78 + i=12098 + + + + DeleteMonitoredItemsCount + + i=63 + i=78 + i=12098 + + + + CreateSubscriptionCount + + i=63 + i=78 + i=12098 + + + + ModifySubscriptionCount + + i=63 + i=78 + i=12098 + + + + SetPublishingModeCount + + i=63 + i=78 + i=12098 + + + + PublishCount + + i=63 + i=78 + i=12098 + + + + RepublishCount + + i=63 + i=78 + i=12098 + + + + TransferSubscriptionsCount + + i=63 + i=78 + i=12098 + + + + DeleteSubscriptionsCount + + i=63 + i=78 + i=12098 + + + + AddNodesCount + + i=63 + i=78 + i=12098 + + + + AddReferencesCount + + i=63 + i=78 + i=12098 + + + + DeleteNodesCount + + i=63 + i=78 + i=12098 + + + + DeleteReferencesCount + + i=63 + i=78 + i=12098 + + + + BrowseCount + + i=63 + i=78 + i=12098 + + + + BrowseNextCount + + i=63 + i=78 + i=12098 + + + + TranslateBrowsePathsToNodeIdsCount + + i=63 + i=78 + i=12098 + + + + QueryFirstCount + + i=63 + i=78 + i=12098 + + + + QueryNextCount + + i=63 + i=78 + i=12098 + + + + RegisterNodesCount + + i=63 + i=78 + i=12098 + + + + UnregisterNodesCount + + i=63 + i=78 + i=12098 + + + + SessionSecurityDiagnostics + + i=12143 + i=12144 + i=12145 + i=12146 + i=12147 + i=12148 + i=12149 + i=12150 + i=12151 + i=2244 + i=78 + i=12097 + + + + SessionId + + i=63 + i=78 + i=12142 + + + + ClientUserIdOfSession + + i=63 + i=78 + i=12142 + + + + ClientUserIdHistory + + i=63 + i=78 + i=12142 + + + + AuthenticationMechanism + + i=63 + i=78 + i=12142 + + + + Encoding + + i=63 + i=78 + i=12142 + + + + TransportProtocol + + i=63 + i=78 + i=12142 + + + + SecurityMode + + i=63 + i=78 + i=12142 + + + + SecurityPolicyUri + + i=63 + i=78 + i=12142 + + + + ClientCertificate + + i=63 + i=78 + i=12142 + + + + SubscriptionDiagnosticsArray + + i=2171 + i=78 + i=12097 + + + + SessionDiagnosticsObjectType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.5 + + i=2030 + i=2031 + i=2032 + i=58 + + + + SessionDiagnostics + + i=3131 + i=3132 + i=3133 + i=3134 + i=3135 + i=3136 + i=3137 + i=3138 + i=3139 + i=3140 + i=3141 + i=3142 + i=3143 + i=8898 + i=11891 + i=3151 + i=3152 + i=3153 + i=3154 + i=3155 + i=3156 + i=3157 + i=3158 + i=3159 + i=3160 + i=3161 + i=3162 + i=3163 + i=3164 + i=3165 + i=3166 + i=3167 + i=3168 + i=3169 + i=3170 + i=3171 + i=3172 + i=3173 + i=3174 + i=3175 + i=3176 + i=3177 + i=3178 + i=2197 + i=78 + i=2029 + + + + SessionId + + i=63 + i=78 + i=2030 + + + + SessionName + + i=63 + i=78 + i=2030 + + + + ClientDescription + + i=63 + i=78 + i=2030 + + + + ServerUri + + i=63 + i=78 + i=2030 + + + + EndpointUrl + + i=63 + i=78 + i=2030 + + + + LocaleIds + + i=63 + i=78 + i=2030 + + + + ActualSessionTimeout + + i=63 + i=78 + i=2030 + + + + MaxResponseMessageSize + + i=63 + i=78 + i=2030 + + + + ClientConnectionTime + + i=63 + i=78 + i=2030 + + + + ClientLastContactTime + + i=63 + i=78 + i=2030 + + + + CurrentSubscriptionsCount + + i=63 + i=78 + i=2030 + + + + CurrentMonitoredItemsCount + + i=63 + i=78 + i=2030 + + + + CurrentPublishRequestsInQueue + + i=63 + i=78 + i=2030 + + + + TotalRequestCount + + i=63 + i=78 + i=2030 + + + + UnauthorizedRequestCount + + i=63 + i=78 + i=2030 + + + + ReadCount + + i=63 + i=78 + i=2030 + + + + HistoryReadCount + + i=63 + i=78 + i=2030 + + + + WriteCount + + i=63 + i=78 + i=2030 + + + + HistoryUpdateCount + + i=63 + i=78 + i=2030 + + + + CallCount + + i=63 + i=78 + i=2030 + + + + CreateMonitoredItemsCount + + i=63 + i=78 + i=2030 + + + + ModifyMonitoredItemsCount + + i=63 + i=78 + i=2030 + + + + SetMonitoringModeCount + + i=63 + i=78 + i=2030 + + + + SetTriggeringCount + + i=63 + i=78 + i=2030 + + + + DeleteMonitoredItemsCount + + i=63 + i=78 + i=2030 + + + + CreateSubscriptionCount + + i=63 + i=78 + i=2030 + + + + ModifySubscriptionCount + + i=63 + i=78 + i=2030 + + + + SetPublishingModeCount + + i=63 + i=78 + i=2030 + + + + PublishCount + + i=63 + i=78 + i=2030 + + + + RepublishCount + + i=63 + i=78 + i=2030 + + + + TransferSubscriptionsCount + + i=63 + i=78 + i=2030 + + + + DeleteSubscriptionsCount + + i=63 + i=78 + i=2030 + + + + AddNodesCount + + i=63 + i=78 + i=2030 + + + + AddReferencesCount + + i=63 + i=78 + i=2030 + + + + DeleteNodesCount + + i=63 + i=78 + i=2030 + + + + DeleteReferencesCount + + i=63 + i=78 + i=2030 + + + + BrowseCount + + i=63 + i=78 + i=2030 + + + + BrowseNextCount + + i=63 + i=78 + i=2030 + + + + TranslateBrowsePathsToNodeIdsCount + + i=63 + i=78 + i=2030 + + + + QueryFirstCount + + i=63 + i=78 + i=2030 + + + + QueryNextCount + + i=63 + i=78 + i=2030 + + + + RegisterNodesCount + + i=63 + i=78 + i=2030 + + + + UnregisterNodesCount + + i=63 + i=78 + i=2030 + + + + SessionSecurityDiagnostics + + i=3179 + i=3180 + i=3181 + i=3182 + i=3183 + i=3184 + i=3185 + i=3186 + i=3187 + i=2244 + i=78 + i=2029 + + + + SessionId + + i=63 + i=78 + i=2031 + + + + ClientUserIdOfSession + + i=63 + i=78 + i=2031 + + + + ClientUserIdHistory + + i=63 + i=78 + i=2031 + + + + AuthenticationMechanism + + i=63 + i=78 + i=2031 + + + + Encoding + + i=63 + i=78 + i=2031 + + + + TransportProtocol + + i=63 + i=78 + i=2031 + + + + SecurityMode + + i=63 + i=78 + i=2031 + + + + SecurityPolicyUri + + i=63 + i=78 + i=2031 + + + + ClientCertificate + + i=63 + i=78 + i=2031 + + + + SubscriptionDiagnosticsArray + + i=2171 + i=78 + i=2029 + + + + VendorServerInfoType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.6 + + i=58 + + + + ServerRedundancyType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.7 + + i=2035 + i=58 + + + + RedundancySupport + + i=68 + i=78 + i=2034 + + + + TransparentRedundancyType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.8 + + i=2037 + i=2038 + i=2034 + + + + CurrentServerId + + i=68 + i=78 + i=2036 + + + + RedundantServerArray + + i=68 + i=78 + i=2036 + + + + NonTransparentRedundancyType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.9 + + i=2040 + i=2034 + + + + ServerUriArray + + i=68 + i=78 + i=2039 + + + + NonTransparentNetworkRedundancyType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.10 + + i=11948 + i=2039 + + + + ServerNetworkGroups + + i=68 + i=78 + i=11945 + + + + OperationLimitsType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.11 + + i=11565 + i=12161 + i=12162 + i=11567 + i=12163 + i=12164 + i=11569 + i=11570 + i=11571 + i=11572 + i=11573 + i=11574 + i=61 + + + + MaxNodesPerRead + + i=68 + i=80 + i=11564 + + + + MaxNodesPerHistoryReadData + + i=68 + i=80 + i=11564 + + + + MaxNodesPerHistoryReadEvents + + i=68 + i=80 + i=11564 + + + + MaxNodesPerWrite + + i=68 + i=80 + i=11564 + + + + MaxNodesPerHistoryUpdateData + + i=68 + i=80 + i=11564 + + + + MaxNodesPerHistoryUpdateEvents + + i=68 + i=80 + i=11564 + + + + MaxNodesPerMethodCall + + i=68 + i=80 + i=11564 + + + + MaxNodesPerBrowse + + i=68 + i=80 + i=11564 + + + + MaxNodesPerRegisterNodes + + i=68 + i=80 + i=11564 + + + + MaxNodesPerTranslateBrowsePathsToNodeIds + + i=68 + i=80 + i=11564 + + + + MaxNodesPerNodeManagement + + i=68 + i=80 + i=11564 + + + + MaxMonitoredItemsPerCall + + i=68 + i=80 + i=11564 + + + + FileType + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.1 + + i=11576 + i=12686 + i=12687 + i=11579 + i=13341 + i=24244 + i=11580 + i=11583 + i=11585 + i=11588 + i=11590 + i=11593 + i=58 + + + + Size + + i=68 + i=78 + i=11575 + + + + Writable + + i=68 + i=78 + i=11575 + + + + UserWritable + + i=68 + i=78 + i=11575 + + + + OpenCount + + i=68 + i=78 + i=11575 + + + + MimeType + + i=68 + i=80 + i=11575 + + + + MaxByteStringLength + + i=68 + i=80 + i=11575 + + + + Open + + i=11581 + i=11582 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11580 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11580 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=11584 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11583 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=11586 + i=11587 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11585 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11585 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=11589 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11588 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=11591 + i=11592 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11590 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11590 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=11594 + i=78 + i=11575 + + + + InputArguments + + i=68 + i=78 + i=11593 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + AddressSpaceFileType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.12 + + i=11615 + i=11575 + + + + ExportNamespace + + i=80 + i=11595 + + + + NamespaceMetadataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.13 + + i=11617 + i=11618 + i=11619 + i=11620 + i=11621 + i=11622 + i=11623 + i=11624 + i=16137 + i=16138 + i=16139 + i=58 + + + + NamespaceUri + + i=68 + i=78 + i=11616 + + + + NamespaceVersion + + i=68 + i=78 + i=11616 + + + + NamespacePublicationDate + + i=68 + i=78 + i=11616 + + + + IsNamespaceSubset + + i=68 + i=78 + i=11616 + + + + StaticNodeIdTypes + + i=68 + i=78 + i=11616 + + + + StaticNumericNodeIdRange + + i=68 + i=78 + i=11616 + + + + StaticStringNodeIdPattern + + i=68 + i=78 + i=11616 + + + + NamespaceFile + + i=11625 + i=12690 + i=12691 + i=11628 + i=11629 + i=11632 + i=11634 + i=11637 + i=11639 + i=11642 + i=11595 + i=80 + i=11616 + + + + Size + + i=68 + i=78 + i=11624 + + + + Writable + + i=68 + i=78 + i=11624 + + + + UserWritable + + i=68 + i=78 + i=11624 + + + + OpenCount + + i=68 + i=78 + i=11624 + + + + Open + + i=11630 + i=11631 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11629 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11629 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=11633 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11632 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=11635 + i=11636 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11634 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11634 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=11638 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11637 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=11640 + i=11641 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11639 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=11639 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=11643 + i=78 + i=11624 + + + + InputArguments + + i=68 + i=78 + i=11642 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + DefaultRolePermissions + + i=68 + i=80 + i=11616 + + + + DefaultUserRolePermissions + + i=68 + i=80 + i=11616 + + + + DefaultAccessRestrictions + + i=68 + i=80 + i=11616 + + + + NamespacesType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.3.14 + + i=11646 + i=58 + + + + <NamespaceIdentifier> + + i=11647 + i=11648 + i=11649 + i=11650 + i=11651 + i=11652 + i=11653 + i=11616 + i=11508 + i=11645 + + + + NamespaceUri + + i=68 + i=78 + i=11646 + + + + NamespaceVersion + + i=68 + i=78 + i=11646 + + + + NamespacePublicationDate + + i=68 + i=78 + i=11646 + + + + IsNamespaceSubset + + i=68 + i=78 + i=11646 + + + + StaticNodeIdTypes + + i=68 + i=78 + i=11646 + + + + StaticNumericNodeIdRange + + i=68 + i=78 + i=11646 + + + + StaticStringNodeIdPattern + + i=68 + i=78 + i=11646 + + + + BaseEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.2 + + i=2042 + i=2043 + i=2044 + i=2045 + i=2046 + i=2047 + i=3190 + i=2050 + i=2051 + i=58 + + + + EventId + + i=68 + i=78 + i=2041 + + + + EventType + + i=68 + i=78 + i=2041 + + + + SourceNode + + i=68 + i=78 + i=2041 + + + + SourceName + + i=68 + i=78 + i=2041 + + + + Time + + i=68 + i=78 + i=2041 + + + + ReceiveTime + + i=68 + i=78 + i=2041 + + + + LocalTime + + i=68 + i=80 + i=2041 + + + + Message + + i=68 + i=78 + i=2041 + + + + Severity + + i=68 + i=78 + i=2041 + + + + AuditEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.3 + + i=2053 + i=2054 + i=2055 + i=2056 + i=2057 + i=2041 + + + + ActionTimeStamp + + i=68 + i=78 + i=2052 + + + + Status + + i=68 + i=78 + i=2052 + + + + ServerId + + i=68 + i=78 + i=2052 + + + + ClientAuditEntryId + + i=68 + i=78 + i=2052 + + + + ClientUserId + + i=68 + i=78 + i=2052 + + + + AuditSecurityEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.4 + + i=17615 + i=2052 + + + + StatusCodeId + + i=68 + i=80 + i=2058 + + + + AuditChannelEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.5 + + i=2745 + i=2058 + + + + SecureChannelId + + i=68 + i=78 + i=2059 + + + + AuditOpenSecureChannelEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.6 + + i=2061 + i=2746 + i=2062 + i=2063 + i=2065 + i=2066 + i=2059 + + + + ClientCertificate + + i=68 + i=78 + i=2060 + + + + ClientCertificateThumbprint + + i=68 + i=78 + i=2060 + + + + RequestType + + i=68 + i=78 + i=2060 + + + + SecurityPolicyUri + + i=68 + i=78 + i=2060 + + + + SecurityMode + + i=68 + i=78 + i=2060 + + + + RequestedLifetime + + i=68 + i=78 + i=2060 + + + + AuditSessionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.7 + + i=2070 + i=2058 + + + + SessionId + + i=68 + i=78 + i=2069 + + + + AuditCreateSessionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.8 + + i=2072 + i=2073 + i=2747 + i=2074 + i=2069 + + + + SecureChannelId + + i=68 + i=78 + i=2071 + + + + ClientCertificate + + i=68 + i=78 + i=2071 + + + + ClientCertificateThumbprint + + i=68 + i=78 + i=2071 + + + + RevisedSessionTimeout + + i=68 + i=78 + i=2071 + + + + AuditUrlMismatchEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.9 + + i=2749 + i=2071 + + + + EndpointUrl + + i=68 + i=78 + i=2748 + + + + AuditActivateSessionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.10 + + i=2076 + i=2077 + i=11485 + i=2069 + + + + ClientSoftwareCertificates + + i=68 + i=78 + i=2075 + + + + UserIdentityToken + + i=68 + i=78 + i=2075 + + + + SecureChannelId + + i=68 + i=78 + i=2075 + + + + AuditCancelEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.11 + + i=2079 + i=2069 + + + + RequestHandle + + i=68 + i=78 + i=2078 + + + + AuditCertificateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.12 + + i=2081 + i=2058 + + + + Certificate + + i=68 + i=78 + i=2080 + + + + AuditCertificateDataMismatchEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.13 + + i=2083 + i=2084 + i=2080 + + + + InvalidHostname + + i=68 + i=78 + i=2082 + + + + InvalidUri + + i=68 + i=78 + i=2082 + + + + AuditCertificateExpiredEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.14 + + i=2080 + + + + AuditCertificateInvalidEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.15 + + i=2080 + + + + AuditCertificateUntrustedEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.16 + + i=2080 + + + + AuditCertificateRevokedEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.17 + + i=2080 + + + + AuditCertificateMismatchEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.18 + + i=2080 + + + + AuditNodeManagementEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.19 + + i=2052 + + + + AuditAddNodesEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.20 + + i=2092 + i=2090 + + + + NodesToAdd + + i=68 + i=78 + i=2091 + + + + AuditDeleteNodesEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.21 + + i=2094 + i=2090 + + + + NodesToDelete + + i=68 + i=78 + i=2093 + + + + AuditAddReferencesEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.22 + + i=2096 + i=2090 + + + + ReferencesToAdd + + i=68 + i=78 + i=2095 + + + + AuditDeleteReferencesEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.23 + + i=2098 + i=2090 + + + + ReferencesToDelete + + i=68 + i=78 + i=2097 + + + + AuditUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.24 + + i=2052 + + + + AuditWriteUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.25 + + i=2750 + i=2101 + i=2102 + i=2103 + i=2099 + + + + AttributeId + + i=68 + i=78 + i=2100 + + + + IndexRange + + i=68 + i=78 + i=2100 + + + + OldValue + + i=68 + i=78 + i=2100 + + + + NewValue + + i=68 + i=78 + i=2100 + + + + AuditHistoryUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.26 + + i=2751 + i=2099 + + + + ParameterDataTypeId + + i=68 + i=78 + i=2104 + + + + AuditUpdateMethodEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.27 + + i=2128 + i=2129 + i=2052 + + + + MethodId + + i=68 + i=78 + i=2127 + + + + InputArguments + + i=68 + i=78 + i=2127 + + + + SystemEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.28 + + i=2041 + + + + DeviceFailureEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.29 + + i=2130 + + + + SystemStatusChangeEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.30 + + i=11696 + i=2130 + + + + SystemState + + i=68 + i=78 + i=11446 + + + + BaseModelChangeEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.31 + + i=2041 + + + + GeneralModelChangeEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.32 + + i=2134 + i=2132 + + + + Changes + + i=68 + i=78 + i=2133 + + + + SemanticChangeEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.33 + + i=2739 + i=2041 + + + + Changes + + i=68 + i=78 + i=2738 + + + + EventQueueOverflowEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.34 + + i=2041 + + + + ProgressEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.4.35 + + i=12502 + i=12503 + i=2041 + + + + Context + + i=68 + i=78 + i=11436 + + + + Progress + + i=68 + i=78 + i=11436 + + + + AggregateFunctionType + https://reference.opcfoundation.org/v104/Core/docs/Part5/6.8 + + i=58 + + + + ServerVendorCapabilityType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.5 + + i=63 + + + + ServerStatusType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.6 + + i=2139 + i=2140 + i=2141 + i=2142 + i=2752 + i=2753 + i=63 + + + + StartTime + + i=63 + i=78 + i=2138 + + + + CurrentTime + + i=63 + i=78 + i=2138 + + + + State + + i=63 + i=78 + i=2138 + + + + BuildInfo + + i=3698 + i=3699 + i=3700 + i=3701 + i=3702 + i=3703 + i=3051 + i=78 + i=2138 + + + + ProductUri + + i=63 + i=78 + i=2142 + + + + ManufacturerName + + i=63 + i=78 + i=2142 + + + + ProductName + + i=63 + i=78 + i=2142 + + + + SoftwareVersion + + i=63 + i=78 + i=2142 + + + + BuildNumber + + i=63 + i=78 + i=2142 + + + + BuildDate + + i=63 + i=78 + i=2142 + + + + SecondsTillShutdown + + i=63 + i=78 + i=2138 + + + + ShutdownReason + + i=63 + i=78 + i=2138 + + + + BuildInfoType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.7 + + i=3052 + i=3053 + i=3054 + i=3055 + i=3056 + i=3057 + i=63 + + + + ProductUri + + i=63 + i=78 + i=3051 + + + + ManufacturerName + + i=63 + i=78 + i=3051 + + + + ProductName + + i=63 + i=78 + i=3051 + + + + SoftwareVersion + + i=63 + i=78 + i=3051 + + + + BuildNumber + + i=63 + i=78 + i=3051 + + + + BuildDate + + i=63 + i=78 + i=3051 + + + + ServerDiagnosticsSummaryType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.8 + + i=2151 + i=2152 + i=2153 + i=2154 + i=2155 + i=2156 + i=2157 + i=2159 + i=2160 + i=2161 + i=2162 + i=2163 + i=63 + + + + ServerViewCount + + i=63 + i=78 + i=2150 + + + + CurrentSessionCount + + i=63 + i=78 + i=2150 + + + + CumulatedSessionCount + + i=63 + i=78 + i=2150 + + + + SecurityRejectedSessionCount + + i=63 + i=78 + i=2150 + + + + RejectedSessionCount + + i=63 + i=78 + i=2150 + + + + SessionTimeoutCount + + i=63 + i=78 + i=2150 + + + + SessionAbortCount + + i=63 + i=78 + i=2150 + + + + PublishingIntervalCount + + i=63 + i=78 + i=2150 + + + + CurrentSubscriptionCount + + i=63 + i=78 + i=2150 + + + + CumulatedSubscriptionCount + + i=63 + i=78 + i=2150 + + + + SecurityRejectedRequestsCount + + i=63 + i=78 + i=2150 + + + + RejectedRequestsCount + + i=63 + i=78 + i=2150 + + + + SamplingIntervalDiagnosticsArrayType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.9 + + i=12779 + i=63 + + + + SamplingIntervalDiagnostics + + i=12780 + i=12781 + i=12782 + i=12783 + i=2165 + i=83 + i=2164 + + + + SamplingInterval + + i=63 + i=78 + i=12779 + + + + SampledMonitoredItemsCount + + i=63 + i=78 + i=12779 + + + + MaxSampledMonitoredItemsCount + + i=63 + i=78 + i=12779 + + + + DisabledMonitoredItemsSamplingCount + + i=63 + i=78 + i=12779 + + + + SamplingIntervalDiagnosticsType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.10 + + i=2166 + i=11697 + i=11698 + i=11699 + i=63 + + + + SamplingInterval + + i=63 + i=78 + i=2165 + + + + SampledMonitoredItemsCount + + i=63 + i=78 + i=2165 + + + + MaxSampledMonitoredItemsCount + + i=63 + i=78 + i=2165 + + + + DisabledMonitoredItemsSamplingCount + + i=63 + i=78 + i=2165 + + + + SubscriptionDiagnosticsArrayType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.11 + + i=12784 + i=63 + + + + SubscriptionDiagnostics + + i=12785 + i=12786 + i=12787 + i=12788 + i=12789 + i=12790 + i=12791 + i=12792 + i=12793 + i=12794 + i=12795 + i=12796 + i=12797 + i=12798 + i=12799 + i=12800 + i=12801 + i=12802 + i=12803 + i=12804 + i=12805 + i=12806 + i=12807 + i=12808 + i=12809 + i=12810 + i=12811 + i=12812 + i=12813 + i=12814 + i=12815 + i=2172 + i=83 + i=2171 + + + + SessionId + + i=63 + i=78 + i=12784 + + + + SubscriptionId + + i=63 + i=78 + i=12784 + + + + Priority + + i=63 + i=78 + i=12784 + + + + PublishingInterval + + i=63 + i=78 + i=12784 + + + + MaxKeepAliveCount + + i=63 + i=78 + i=12784 + + + + MaxLifetimeCount + + i=63 + i=78 + i=12784 + + + + MaxNotificationsPerPublish + + i=63 + i=78 + i=12784 + + + + PublishingEnabled + + i=63 + i=78 + i=12784 + + + + ModifyCount + + i=63 + i=78 + i=12784 + + + + EnableCount + + i=63 + i=78 + i=12784 + + + + DisableCount + + i=63 + i=78 + i=12784 + + + + RepublishRequestCount + + i=63 + i=78 + i=12784 + + + + RepublishMessageRequestCount + + i=63 + i=78 + i=12784 + + + + RepublishMessageCount + + i=63 + i=78 + i=12784 + + + + TransferRequestCount + + i=63 + i=78 + i=12784 + + + + TransferredToAltClientCount + + i=63 + i=78 + i=12784 + + + + TransferredToSameClientCount + + i=63 + i=78 + i=12784 + + + + PublishRequestCount + + i=63 + i=78 + i=12784 + + + + DataChangeNotificationsCount + + i=63 + i=78 + i=12784 + + + + EventNotificationsCount + + i=63 + i=78 + i=12784 + + + + NotificationsCount + + i=63 + i=78 + i=12784 + + + + LatePublishRequestCount + + i=63 + i=78 + i=12784 + + + + CurrentKeepAliveCount + + i=63 + i=78 + i=12784 + + + + CurrentLifetimeCount + + i=63 + i=78 + i=12784 + + + + UnacknowledgedMessageCount + + i=63 + i=78 + i=12784 + + + + DiscardedMessageCount + + i=63 + i=78 + i=12784 + + + + MonitoredItemCount + + i=63 + i=78 + i=12784 + + + + DisabledMonitoredItemCount + + i=63 + i=78 + i=12784 + + + + MonitoringQueueOverflowCount + + i=63 + i=78 + i=12784 + + + + NextSequenceNumber + + i=63 + i=78 + i=12784 + + + + EventQueueOverflowCount + + i=63 + i=78 + i=12784 + + + + SubscriptionDiagnosticsType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.12 + + i=2173 + i=2174 + i=2175 + i=2176 + i=2177 + i=8888 + i=2179 + i=2180 + i=2181 + i=2182 + i=2183 + i=2184 + i=2185 + i=2186 + i=2187 + i=2188 + i=2189 + i=2190 + i=2191 + i=2998 + i=2193 + i=8889 + i=8890 + i=8891 + i=8892 + i=8893 + i=8894 + i=8895 + i=8896 + i=8897 + i=8902 + i=63 + + + + SessionId + + i=63 + i=78 + i=2172 + + + + SubscriptionId + + i=63 + i=78 + i=2172 + + + + Priority + + i=63 + i=78 + i=2172 + + + + PublishingInterval + + i=63 + i=78 + i=2172 + + + + MaxKeepAliveCount + + i=63 + i=78 + i=2172 + + + + MaxLifetimeCount + + i=63 + i=78 + i=2172 + + + + MaxNotificationsPerPublish + + i=63 + i=78 + i=2172 + + + + PublishingEnabled + + i=63 + i=78 + i=2172 + + + + ModifyCount + + i=63 + i=78 + i=2172 + + + + EnableCount + + i=63 + i=78 + i=2172 + + + + DisableCount + + i=63 + i=78 + i=2172 + + + + RepublishRequestCount + + i=63 + i=78 + i=2172 + + + + RepublishMessageRequestCount + + i=63 + i=78 + i=2172 + + + + RepublishMessageCount + + i=63 + i=78 + i=2172 + + + + TransferRequestCount + + i=63 + i=78 + i=2172 + + + + TransferredToAltClientCount + + i=63 + i=78 + i=2172 + + + + TransferredToSameClientCount + + i=63 + i=78 + i=2172 + + + + PublishRequestCount + + i=63 + i=78 + i=2172 + + + + DataChangeNotificationsCount + + i=63 + i=78 + i=2172 + + + + EventNotificationsCount + + i=63 + i=78 + i=2172 + + + + NotificationsCount + + i=63 + i=78 + i=2172 + + + + LatePublishRequestCount + + i=63 + i=78 + i=2172 + + + + CurrentKeepAliveCount + + i=63 + i=78 + i=2172 + + + + CurrentLifetimeCount + + i=63 + i=78 + i=2172 + + + + UnacknowledgedMessageCount + + i=63 + i=78 + i=2172 + + + + DiscardedMessageCount + + i=63 + i=78 + i=2172 + + + + MonitoredItemCount + + i=63 + i=78 + i=2172 + + + + DisabledMonitoredItemCount + + i=63 + i=78 + i=2172 + + + + MonitoringQueueOverflowCount + + i=63 + i=78 + i=2172 + + + + NextSequenceNumber + + i=63 + i=78 + i=2172 + + + + EventQueueOverflowCount + + i=63 + i=78 + i=2172 + + + + SessionDiagnosticsArrayType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.13 + + i=12816 + i=63 + + + + SessionDiagnostics + + i=12817 + i=12818 + i=12819 + i=12820 + i=12821 + i=12822 + i=12823 + i=12824 + i=12825 + i=12826 + i=12827 + i=12828 + i=12829 + i=12830 + i=12831 + i=12832 + i=12833 + i=12834 + i=12835 + i=12836 + i=12837 + i=12838 + i=12839 + i=12840 + i=12841 + i=12842 + i=12843 + i=12844 + i=12845 + i=12846 + i=12847 + i=12848 + i=12849 + i=12850 + i=12851 + i=12852 + i=12853 + i=12854 + i=12855 + i=12856 + i=12857 + i=12858 + i=12859 + i=2197 + i=83 + i=2196 + + + + SessionId + + i=63 + i=78 + i=12816 + + + + SessionName + + i=63 + i=78 + i=12816 + + + + ClientDescription + + i=63 + i=78 + i=12816 + + + + ServerUri + + i=63 + i=78 + i=12816 + + + + EndpointUrl + + i=63 + i=78 + i=12816 + + + + LocaleIds + + i=63 + i=78 + i=12816 + + + + ActualSessionTimeout + + i=63 + i=78 + i=12816 + + + + MaxResponseMessageSize + + i=63 + i=78 + i=12816 + + + + ClientConnectionTime + + i=63 + i=78 + i=12816 + + + + ClientLastContactTime + + i=63 + i=78 + i=12816 + + + + CurrentSubscriptionsCount + + i=63 + i=78 + i=12816 + + + + CurrentMonitoredItemsCount + + i=63 + i=78 + i=12816 + + + + CurrentPublishRequestsInQueue + + i=63 + i=78 + i=12816 + + + + TotalRequestCount + + i=63 + i=78 + i=12816 + + + + UnauthorizedRequestCount + + i=63 + i=78 + i=12816 + + + + ReadCount + + i=63 + i=78 + i=12816 + + + + HistoryReadCount + + i=63 + i=78 + i=12816 + + + + WriteCount + + i=63 + i=78 + i=12816 + + + + HistoryUpdateCount + + i=63 + i=78 + i=12816 + + + + CallCount + + i=63 + i=78 + i=12816 + + + + CreateMonitoredItemsCount + + i=63 + i=78 + i=12816 + + + + ModifyMonitoredItemsCount + + i=63 + i=78 + i=12816 + + + + SetMonitoringModeCount + + i=63 + i=78 + i=12816 + + + + SetTriggeringCount + + i=63 + i=78 + i=12816 + + + + DeleteMonitoredItemsCount + + i=63 + i=78 + i=12816 + + + + CreateSubscriptionCount + + i=63 + i=78 + i=12816 + + + + ModifySubscriptionCount + + i=63 + i=78 + i=12816 + + + + SetPublishingModeCount + + i=63 + i=78 + i=12816 + + + + PublishCount + + i=63 + i=78 + i=12816 + + + + RepublishCount + + i=63 + i=78 + i=12816 + + + + TransferSubscriptionsCount + + i=63 + i=78 + i=12816 + + + + DeleteSubscriptionsCount + + i=63 + i=78 + i=12816 + + + + AddNodesCount + + i=63 + i=78 + i=12816 + + + + AddReferencesCount + + i=63 + i=78 + i=12816 + + + + DeleteNodesCount + + i=63 + i=78 + i=12816 + + + + DeleteReferencesCount + + i=63 + i=78 + i=12816 + + + + BrowseCount + + i=63 + i=78 + i=12816 + + + + BrowseNextCount + + i=63 + i=78 + i=12816 + + + + TranslateBrowsePathsToNodeIdsCount + + i=63 + i=78 + i=12816 + + + + QueryFirstCount + + i=63 + i=78 + i=12816 + + + + QueryNextCount + + i=63 + i=78 + i=12816 + + + + RegisterNodesCount + + i=63 + i=78 + i=12816 + + + + UnregisterNodesCount + + i=63 + i=78 + i=12816 + + + + SessionDiagnosticsVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.14 + + i=2198 + i=2199 + i=2200 + i=2201 + i=2202 + i=2203 + i=2204 + i=3050 + i=2205 + i=2206 + i=2207 + i=2208 + i=2209 + i=8900 + i=11892 + i=2217 + i=2218 + i=2219 + i=2220 + i=2221 + i=2222 + i=2223 + i=2224 + i=2225 + i=2226 + i=2227 + i=2228 + i=2229 + i=2230 + i=2231 + i=2232 + i=2233 + i=2234 + i=2235 + i=2236 + i=2237 + i=2238 + i=2239 + i=2240 + i=2241 + i=2242 + i=2730 + i=2731 + i=63 + + + + SessionId + + i=63 + i=78 + i=2197 + + + + SessionName + + i=63 + i=78 + i=2197 + + + + ClientDescription + + i=63 + i=78 + i=2197 + + + + ServerUri + + i=63 + i=78 + i=2197 + + + + EndpointUrl + + i=63 + i=78 + i=2197 + + + + LocaleIds + + i=63 + i=78 + i=2197 + + + + ActualSessionTimeout + + i=63 + i=78 + i=2197 + + + + MaxResponseMessageSize + + i=63 + i=78 + i=2197 + + + + ClientConnectionTime + + i=63 + i=78 + i=2197 + + + + ClientLastContactTime + + i=63 + i=78 + i=2197 + + + + CurrentSubscriptionsCount + + i=63 + i=78 + i=2197 + + + + CurrentMonitoredItemsCount + + i=63 + i=78 + i=2197 + + + + CurrentPublishRequestsInQueue + + i=63 + i=78 + i=2197 + + + + TotalRequestCount + + i=63 + i=78 + i=2197 + + + + UnauthorizedRequestCount + + i=63 + i=78 + i=2197 + + + + ReadCount + + i=63 + i=78 + i=2197 + + + + HistoryReadCount + + i=63 + i=78 + i=2197 + + + + WriteCount + + i=63 + i=78 + i=2197 + + + + HistoryUpdateCount + + i=63 + i=78 + i=2197 + + + + CallCount + + i=63 + i=78 + i=2197 + + + + CreateMonitoredItemsCount + + i=63 + i=78 + i=2197 + + + + ModifyMonitoredItemsCount + + i=63 + i=78 + i=2197 + + + + SetMonitoringModeCount + + i=63 + i=78 + i=2197 + + + + SetTriggeringCount + + i=63 + i=78 + i=2197 + + + + DeleteMonitoredItemsCount + + i=63 + i=78 + i=2197 + + + + CreateSubscriptionCount + + i=63 + i=78 + i=2197 + + + + ModifySubscriptionCount + + i=63 + i=78 + i=2197 + + + + SetPublishingModeCount + + i=63 + i=78 + i=2197 + + + + PublishCount + + i=63 + i=78 + i=2197 + + + + RepublishCount + + i=63 + i=78 + i=2197 + + + + TransferSubscriptionsCount + + i=63 + i=78 + i=2197 + + + + DeleteSubscriptionsCount + + i=63 + i=78 + i=2197 + + + + AddNodesCount + + i=63 + i=78 + i=2197 + + + + AddReferencesCount + + i=63 + i=78 + i=2197 + + + + DeleteNodesCount + + i=63 + i=78 + i=2197 + + + + DeleteReferencesCount + + i=63 + i=78 + i=2197 + + + + BrowseCount + + i=63 + i=78 + i=2197 + + + + BrowseNextCount + + i=63 + i=78 + i=2197 + + + + TranslateBrowsePathsToNodeIdsCount + + i=63 + i=78 + i=2197 + + + + QueryFirstCount + + i=63 + i=78 + i=2197 + + + + QueryNextCount + + i=63 + i=78 + i=2197 + + + + RegisterNodesCount + + i=63 + i=78 + i=2197 + + + + UnregisterNodesCount + + i=63 + i=78 + i=2197 + + + + SessionSecurityDiagnosticsArrayType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.15 + + i=12860 + i=63 + + + + SessionSecurityDiagnostics + + i=12861 + i=12862 + i=12863 + i=12864 + i=12865 + i=12866 + i=12867 + i=12868 + i=12869 + i=2244 + i=83 + i=2243 + + + + SessionId + + i=63 + i=78 + i=12860 + + + + ClientUserIdOfSession + + i=63 + i=78 + i=12860 + + + + ClientUserIdHistory + + i=63 + i=78 + i=12860 + + + + AuthenticationMechanism + + i=63 + i=78 + i=12860 + + + + Encoding + + i=63 + i=78 + i=12860 + + + + TransportProtocol + + i=63 + i=78 + i=12860 + + + + SecurityMode + + i=63 + i=78 + i=12860 + + + + SecurityPolicyUri + + i=63 + i=78 + i=12860 + + + + ClientCertificate + + i=63 + i=78 + i=12860 + + + + SessionSecurityDiagnosticsType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.16 + + i=2245 + i=2246 + i=2247 + i=2248 + i=2249 + i=2250 + i=2251 + i=2252 + i=3058 + i=63 + + + + SessionId + + i=63 + i=78 + i=2244 + + + + ClientUserIdOfSession + + i=63 + i=78 + i=2244 + + + + ClientUserIdHistory + + i=63 + i=78 + i=2244 + + + + AuthenticationMechanism + + i=63 + i=78 + i=2244 + + + + Encoding + + i=63 + i=78 + i=2244 + + + + TransportProtocol + + i=63 + i=78 + i=2244 + + + + SecurityMode + + i=63 + i=78 + i=2244 + + + + SecurityPolicyUri + + i=63 + i=78 + i=2244 + + + + ClientCertificate + + i=63 + i=78 + i=2244 + + + + OptionSetType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.17 + + i=11488 + i=11701 + i=63 + + + + OptionSetValues + + i=68 + i=78 + i=11487 + + + + BitMask + + i=68 + i=80 + i=11487 + + + + SelectionListType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.18 + + i=17632 + i=17633 + i=16312 + i=63 + + + + Selections + + i=68 + i=78 + i=16309 + + + + SelectionDescriptions + + i=68 + i=80 + i=16309 + + + + RestrictToList + + i=68 + i=80 + i=16309 + + + + AudioVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/7.19 + + i=17988 + i=17989 + i=17990 + i=63 + + + + ListId + + i=68 + i=80 + i=17986 + + + + AgencyId + + i=68 + i=80 + i=17986 + + + + VersionId + + i=68 + i=80 + i=17986 + + + + EventTypes + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.2.10 + + i=86 + i=2041 + i=61 + + + + Server + https://reference.opcfoundation.org/v104/Core/docs/Part5/8.3.2 + + i=2254 + i=2255 + i=2256 + i=2267 + i=2994 + i=12885 + i=17634 + i=2268 + i=2274 + i=2295 + i=2296 + i=11715 + i=11492 + i=12873 + i=12749 + i=12886 + i=85 + i=2004 + + + + ServerArray + + i=68 + i=2253 + + + + NamespaceArray + + i=68 + i=2253 + + + + ServerStatus + + i=2257 + i=2258 + i=2259 + i=2260 + i=2992 + i=2993 + i=2138 + i=2253 + + + + StartTime + + i=63 + i=2256 + + + + CurrentTime + + i=63 + i=2256 + + + + State + + i=63 + i=2256 + + + + BuildInfo + + i=2262 + i=2263 + i=2261 + i=2264 + i=2265 + i=2266 + i=3051 + i=2256 + + + + ProductUri + + i=63 + i=2260 + + + + ManufacturerName + + i=63 + i=2260 + + + + ProductName + + i=63 + i=2260 + + + + SoftwareVersion + + i=63 + i=2260 + + + + BuildNumber + + i=63 + i=2260 + + + + BuildDate + + i=63 + i=2260 + + + + SecondsTillShutdown + + i=63 + i=2256 + + + + ShutdownReason + + i=63 + i=2256 + + + + ServiceLevel + + i=68 + i=2253 + + + + Auditing + + i=68 + i=2253 + + + + EstimatedReturnTime + + i=68 + i=2253 + + + + LocalTime + + i=68 + i=2253 + + + + ServerCapabilities + + i=2269 + i=2271 + i=2272 + i=2735 + i=2736 + i=2737 + i=3704 + i=11702 + i=11703 + i=12911 + i=11704 + i=2996 + i=2997 + i=15606 + i=2013 + i=2253 + + + + ServerProfileArray + + i=68 + i=2268 + + + + LocaleIdArray + + i=68 + i=2268 + + + + MinSupportedSampleRate + + i=68 + i=2268 + + + + MaxBrowseContinuationPoints + + i=68 + i=2268 + + + + MaxQueryContinuationPoints + + i=68 + i=2268 + + + + MaxHistoryContinuationPoints + + i=68 + i=2268 + + + + SoftwareCertificates + + i=68 + i=2268 + + + + MaxArrayLength + + i=68 + i=2268 + + + + MaxStringLength + + i=68 + i=2268 + + + + MaxByteStringLength + + i=68 + i=2268 + + + + OperationLimits + + i=11705 + i=12165 + i=12166 + i=11707 + i=12167 + i=12168 + i=11709 + i=11710 + i=11711 + i=11712 + i=11713 + i=11714 + i=11564 + i=2268 + + + + MaxNodesPerRead + + i=68 + i=11704 + + + + MaxNodesPerHistoryReadData + + i=68 + i=11704 + + + + MaxNodesPerHistoryReadEvents + + i=68 + i=11704 + + + + MaxNodesPerWrite + + i=68 + i=11704 + + + + MaxNodesPerHistoryUpdateData + + i=68 + i=11704 + + + + MaxNodesPerHistoryUpdateEvents + + i=68 + i=11704 + + + + MaxNodesPerMethodCall + + i=68 + i=11704 + + + + MaxNodesPerBrowse + + i=68 + i=11704 + + + + MaxNodesPerRegisterNodes + + i=68 + i=11704 + + + + MaxNodesPerTranslateBrowsePathsToNodeIds + + i=68 + i=11704 + + + + MaxNodesPerNodeManagement + + i=68 + i=11704 + + + + MaxMonitoredItemsPerCall + + i=68 + i=11704 + + + + ModellingRules + + i=61 + i=2268 + + + + AggregateFunctions + + i=61 + i=2268 + + + + RoleSet + + i=16301 + i=16304 + i=15607 + i=2268 + + + + AddRole + + i=16302 + i=16303 + i=15606 + + + + InputArguments + + i=68 + i=16301 + + + + + + i=297 + + + + RoleName + + i=12 + + -1 + + + + + + + i=297 + + + + NamespaceUri + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=16301 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + RemoveRole + + i=16305 + i=15606 + + + + InputArguments + + i=68 + i=16304 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + ServerDiagnostics + + i=2275 + i=2289 + i=2290 + i=3706 + i=2294 + i=2020 + i=2253 + + + + ServerDiagnosticsSummary + + i=2276 + i=2277 + i=2278 + i=2279 + i=3705 + i=2281 + i=2282 + i=2284 + i=2285 + i=2286 + i=2287 + i=2288 + i=2150 + i=2274 + + + + ServerViewCount + + i=63 + i=2275 + + + + CurrentSessionCount + + i=63 + i=2275 + + + + CumulatedSessionCount + + i=63 + i=2275 + + + + SecurityRejectedSessionCount + + i=63 + i=2275 + + + + RejectedSessionCount + + i=63 + i=2275 + + + + SessionTimeoutCount + + i=63 + i=2275 + + + + SessionAbortCount + + i=63 + i=2275 + + + + PublishingIntervalCount + + i=63 + i=2275 + + + + CurrentSubscriptionCount + + i=63 + i=2275 + + + + CumulatedSubscriptionCount + + i=63 + i=2275 + + + + SecurityRejectedRequestsCount + + i=63 + i=2275 + + + + RejectedRequestsCount + + i=63 + i=2275 + + + + SamplingIntervalDiagnosticsArray + + i=2164 + i=2274 + + + + SubscriptionDiagnosticsArray + + i=2171 + i=2274 + + + + SessionsDiagnosticsSummary + + i=3707 + i=3708 + i=2026 + i=2274 + + + + SessionDiagnosticsArray + + i=2196 + i=3706 + + + + SessionSecurityDiagnosticsArray + + i=2243 + i=3706 + + + + EnabledFlag + + i=68 + i=2274 + + + + VendorServerInfo + + i=2033 + i=2253 + + + + ServerRedundancy + + i=3709 + i=2034 + i=2253 + + + + RedundancySupport + + i=68 + i=2296 + + + + Namespaces + + i=11645 + i=2253 + + + + GetMonitoredItems + https://reference.opcfoundation.org/v104/Core/docs/Part5/9.1 + + i=11493 + i=11494 + i=2253 + + + + InputArguments + + i=68 + i=11492 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=11492 + + + + + + i=297 + + + + ServerHandles + + i=7 + + 1 + + 0 + + + + + + + i=297 + + + + ClientHandles + + i=7 + + 1 + + 0 + + + + + + + + + ResendData + https://reference.opcfoundation.org/v104/Core/docs/Part5/9.2 + + i=12874 + i=2253 + + + + InputArguments + + i=68 + i=12873 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + + + SetSubscriptionDurable + https://reference.opcfoundation.org/v104/Core/docs/Part5/9.3 + + i=12750 + i=12751 + i=2253 + + + + InputArguments + + i=68 + i=12749 + + + + + + i=297 + + + + SubscriptionId + + i=7 + + -1 + + + + + + + i=297 + + + + LifetimeInHours + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12749 + + + + + + i=297 + + + + RevisedLifetimeInHours + + i=7 + + -1 + + + + + + + + + RequestServerStateChange + https://reference.opcfoundation.org/v104/Core/docs/Part5/9.4 + + i=12887 + i=2253 + + + + InputArguments + + i=68 + i=12886 + + + + + + i=297 + + + + State + + i=852 + + -1 + + + + + + + i=297 + + + + EstimatedReturnTime + + i=13 + + -1 + + + + + + + i=297 + + + + SecondsTillShutdown + + i=7 + + -1 + + + + + + + i=297 + + + + Reason + + i=21 + + -1 + + + + + + + i=297 + + + + Restart + + i=1 + + -1 + + + + + + + + + CurrentServerId + + i=68 + + + + RedundantServerArray + + i=68 + + + + ServerUriArray + + i=68 + + + + ServerNetworkGroups + + i=68 + + + + HistoryServerCapabilities + + i=11193 + i=11242 + i=11273 + i=11274 + i=11196 + i=11197 + i=11198 + i=11199 + i=11200 + i=11281 + i=11282 + i=11283 + i=11502 + i=11275 + i=11201 + i=19091 + i=2268 + i=2330 + + + + AccessHistoryDataCapability + + i=68 + i=11192 + + + + AccessHistoryEventsCapability + + i=68 + i=11192 + + + + MaxReturnDataValues + + i=68 + i=11192 + + + + MaxReturnEventValues + + i=68 + i=11192 + + + + InsertDataCapability + + i=68 + i=11192 + + + + ReplaceDataCapability + + i=68 + i=11192 + + + + UpdateDataCapability + + i=68 + i=11192 + + + + DeleteRawCapability + + i=68 + i=11192 + + + + DeleteAtTimeCapability + + i=68 + i=11192 + + + + InsertEventCapability + + i=68 + i=11192 + + + + ReplaceEventCapability + + i=68 + i=11192 + + + + UpdateEventCapability + + i=68 + i=11192 + + + + DeleteEventCapability + + i=68 + i=11192 + + + + InsertAnnotationCapability + + i=68 + i=11192 + + + + AggregateFunctions + + i=61 + i=11192 + + + + ServerTimestampSupported + + i=68 + i=11192 + + + + BitFieldMaskDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.18 + + i=9 + + + + KeyValuePair + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.21 + + i=22 + + + + + + + + AdditionalParametersType + + i=22 + + + + + + + EphemeralKeyType + + i=22 + + + + + + + + EndpointType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.22 + + i=22 + + + + + + + + + + StateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.2 + + i=2769 + i=2770 + i=58 + + + + CurrentState + + i=3720 + i=2755 + i=78 + i=2299 + + + + Id + + i=68 + i=78 + i=2769 + + + + LastTransition + + i=3724 + i=2762 + i=80 + i=2299 + + + + Id + + i=68 + i=78 + i=2770 + + + + StateVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.3 + + i=2756 + i=2757 + i=2758 + i=2759 + i=63 + + + + Id + + i=68 + i=78 + i=2755 + + + + Name + + i=68 + i=80 + i=2755 + + + + Number + + i=68 + i=80 + i=2755 + + + + EffectiveDisplayName + + i=68 + i=80 + i=2755 + + + + TransitionVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.4 + + i=2763 + i=2764 + i=2765 + i=2766 + i=11456 + i=63 + + + + Id + + i=68 + i=78 + i=2762 + + + + Name + + i=68 + i=80 + i=2762 + + + + Number + + i=68 + i=80 + i=2762 + + + + TransitionTime + + i=68 + i=80 + i=2762 + + + + EffectiveTransitionTime + + i=68 + i=80 + i=2762 + + + + FiniteStateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.5 + + i=2772 + i=2773 + i=17635 + i=17636 + i=2299 + + + + CurrentState + + i=3728 + i=2760 + i=78 + i=2771 + + + + Id + + i=68 + i=78 + i=2772 + + + + LastTransition + + i=3732 + i=2767 + i=80 + i=2771 + + + + Id + + i=68 + i=78 + i=2773 + + + + AvailableStates + + i=63 + i=80 + i=2771 + + + + AvailableTransitions + + i=63 + i=80 + i=2771 + + + + FiniteStateVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.6 + + i=2761 + i=2755 + + + + Id + + i=68 + i=78 + i=2760 + + + + FiniteTransitionVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.7 + + i=2768 + i=2762 + + + + Id + + i=68 + i=78 + i=2767 + + + + StateType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.8 + + i=2308 + i=58 + + + + StateNumber + + i=68 + i=78 + i=2307 + + + + InitialStateType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.9 + + i=2307 + + + + TransitionType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.10 + + i=2312 + i=58 + + + + TransitionNumber + + i=68 + i=78 + i=2310 + + + + ChoiceStateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment2/B.6.2 + + i=2307 + + + + HasGuard + https://reference.opcfoundation.org/v104/Core/docs/Amendment2/B.6.3 + + i=47 + + GuardOf + + + GuardVariableType + https://reference.opcfoundation.org/v104/Core/docs/Amendment2/B.6.4 + + i=63 + + + + ExpressionGuardVariableType + https://reference.opcfoundation.org/v104/Core/docs/Amendment2/B.6.5 + + i=15129 + i=15113 + + + + Expression + + i=68 + i=78 + i=15128 + + + + ElseGuardVariableType + https://reference.opcfoundation.org/v104/Core/docs/Amendment2/B.6.6 + + i=15113 + + + + RationalNumberType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.20 + + i=17712 + i=17713 + i=63 + + + + Numerator + + i=63 + i=78 + i=17709 + + + + Denominator + + i=63 + i=78 + i=17709 + + + + VectorType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.21 + + i=17715 + i=63 + + + + VectorUnit + + i=68 + i=80 + i=17714 + + + + 3DVectorType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.22 + + i=18769 + i=18770 + i=18771 + i=17714 + + + + X + + i=63 + i=78 + i=17716 + + + + Y + + i=63 + i=78 + i=17716 + + + + Z + + i=63 + i=78 + i=17716 + + + + CartesianCoordinatesType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.23 + + i=18773 + i=63 + + + + LengthUnit + + i=68 + i=80 + i=18772 + + + + 3DCartesianCoordinatesType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.24 + + i=18776 + i=18777 + i=18778 + i=18772 + + + + X + + i=63 + i=78 + i=18774 + + + + Y + + i=63 + i=78 + i=18774 + + + + Z + + i=63 + i=78 + i=18774 + + + + OrientationType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.25 + + i=18780 + i=63 + + + + AngleUnit + + i=68 + i=80 + i=18779 + + + + 3DOrientationType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.26 + + i=18783 + i=18784 + i=18785 + i=18779 + + + + A + + i=63 + i=78 + i=18781 + + + + B + + i=63 + i=78 + i=18781 + + + + C + + i=63 + i=78 + i=18781 + + + + FrameType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.27 + + i=18801 + i=18787 + i=18788 + i=18789 + i=18790 + i=63 + + + + CartesianCoordinates + + i=18772 + i=78 + i=18786 + + + + Orientation + + i=18779 + i=78 + i=18786 + + + + Constant + + i=68 + i=80 + i=18786 + + + + BaseFrame + + i=63 + i=80 + i=18786 + + + + FixedBase + + i=68 + i=80 + i=18786 + + + + 3DFrameType + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/7.28 + + i=18796 + i=18792 + i=18786 + + + + CartesianCoordinates + + i=18798 + i=18799 + i=18800 + i=18774 + i=78 + i=18791 + + + + X + + i=63 + i=78 + i=18796 + + + + Y + + i=63 + i=78 + i=18796 + + + + Z + + i=63 + i=78 + i=18796 + + + + Orientation + + i=19074 + i=19075 + i=19076 + i=18781 + i=78 + i=18791 + + + + A + + i=63 + i=78 + i=18792 + + + + B + + i=63 + i=78 + i=18792 + + + + C + + i=63 + i=78 + i=18792 + + + + RationalNumber + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.23 + + i=22 + + + + + + + + Vector + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.24 + + i=22 + + + + + 3DVector + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.25 + + i=18807 + + + + + + + + + CartesianCoordinates + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.26 + + i=22 + + + + + 3DCartesianCoordinates + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.27 + + i=18809 + + + + + + + + + Orientation + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.28 + + i=22 + + + + + 3DOrientation + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.29 + + i=18811 + + + + + + + + + Frame + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.30 + + i=22 + + + + + 3DFrame + https://reference.opcfoundation.org/v104/Core/docs/Amendment11/12.31 + + i=18813 + + + + + + + + TransitionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.16 + + i=2774 + i=2775 + i=2776 + i=2041 + + + + Transition + + i=3754 + i=2762 + i=78 + i=2311 + + + + Id + + i=68 + i=78 + i=2774 + + + + FromState + + i=3746 + i=2755 + i=78 + i=2311 + + + + Id + + i=68 + i=78 + i=2775 + + + + ToState + + i=3750 + i=2755 + i=78 + i=2311 + + + + Id + + i=68 + i=78 + i=2776 + + + + AuditUpdateStateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/B.4.17 + + i=2777 + i=2778 + i=2127 + + + + OldStateId + + i=68 + i=78 + i=2315 + + + + NewStateId + + i=68 + i=78 + i=2315 + + + + OpenFileMode + + i=11940 + i=29 + + + + + + + + + + EnumValues + + i=68 + i=11939 + + + + + + i=7616 + + + + 1 + + Read + + + + + + + i=7616 + + + + 2 + + Write + + + + + + + i=7616 + + + + 4 + + EraseExisting + + + + + + + i=7616 + + + + 8 + + Append + + + + + + + + + FileDirectoryType + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.3.1 + + i=13354 + i=13366 + i=13387 + i=13390 + i=13393 + i=13395 + i=61 + + + + <FileDirectoryName> + + i=13355 + i=13358 + i=17718 + i=13363 + i=13353 + i=11508 + i=13353 + + + + CreateDirectory + + i=13356 + i=13357 + i=78 + i=13354 + + + + InputArguments + + i=68 + i=78 + i=13355 + + + + + + i=297 + + + + DirectoryName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13355 + + + + + + i=297 + + + + DirectoryNodeId + + i=17 + + -1 + + + + + + + + + CreateFile + + i=13359 + i=13360 + i=78 + i=13354 + + + + InputArguments + + i=68 + i=78 + i=13358 + + + + + + i=297 + + + + FileName + + i=12 + + -1 + + + + + + + i=297 + + + + RequestFileOpen + + i=1 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13358 + + + + + + i=297 + + + + FileNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Delete + + i=17719 + i=78 + i=13354 + + + + InputArguments + + i=68 + i=78 + i=17718 + + + + + + i=297 + + + + ObjectToDelete + + i=17 + + -1 + + + + + + + + + MoveOrCopy + + i=13364 + i=13365 + i=78 + i=13354 + + + + InputArguments + + i=68 + i=78 + i=13363 + + + + + + i=297 + + + + ObjectToMoveOrCopy + + i=17 + + -1 + + + + + + + i=297 + + + + TargetDirectory + + i=17 + + -1 + + + + + + + i=297 + + + + CreateCopy + + i=1 + + -1 + + + + + + + i=297 + + + + NewName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13363 + + + + + + i=297 + + + + NewNodeId + + i=17 + + -1 + + + + + + + + + <FileName> + + i=13367 + i=13368 + i=13369 + i=13370 + i=13372 + i=13375 + i=13377 + i=13380 + i=13382 + i=13385 + i=11575 + i=11508 + i=13353 + + + + Size + + i=68 + i=78 + i=13366 + + + + Writable + + i=68 + i=78 + i=13366 + + + + UserWritable + + i=68 + i=78 + i=13366 + + + + OpenCount + + i=68 + i=78 + i=13366 + + + + Open + + i=13373 + i=13374 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13372 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13372 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13376 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13375 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13378 + i=13379 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13377 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13377 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13381 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13380 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13383 + i=13384 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13382 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13382 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13386 + i=78 + i=13366 + + + + InputArguments + + i=68 + i=78 + i=13385 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + CreateDirectory + + i=13388 + i=13389 + i=78 + i=13353 + + + + InputArguments + + i=68 + i=78 + i=13387 + + + + + + i=297 + + + + DirectoryName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13387 + + + + + + i=297 + + + + DirectoryNodeId + + i=17 + + -1 + + + + + + + + + CreateFile + + i=13391 + i=13392 + i=78 + i=13353 + + + + InputArguments + + i=68 + i=78 + i=13390 + + + + + + i=297 + + + + FileName + + i=12 + + -1 + + + + + + + i=297 + + + + RequestFileOpen + + i=1 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13390 + + + + + + i=297 + + + + FileNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Delete + + i=13394 + i=78 + i=13353 + + + + InputArguments + + i=68 + i=78 + i=13393 + + + + + + i=297 + + + + ObjectToDelete + + i=17 + + -1 + + + + + + + + + MoveOrCopy + + i=13396 + i=13397 + i=78 + i=13353 + + + + InputArguments + + i=68 + i=78 + i=13395 + + + + + + i=297 + + + + ObjectToMoveOrCopy + + i=17 + + -1 + + + + + + + i=297 + + + + TargetDirectory + + i=17 + + -1 + + + + + + + i=297 + + + + CreateCopy + + i=1 + + -1 + + + + + + + i=297 + + + + NewName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13395 + + + + + + i=297 + + + + NewNodeId + + i=17 + + -1 + + + + + + + + + FileSystem + + i=16348 + i=16351 + i=16354 + i=16356 + i=13353 + + + + CreateDirectory + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.3.3 + + i=16349 + i=16350 + i=16314 + + + + InputArguments + + i=68 + i=16348 + + + + + + i=297 + + + + DirectoryName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=16348 + + + + + + i=297 + + + + DirectoryNodeId + + i=17 + + -1 + + + + + + + + + CreateFile + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.3.4 + + i=16352 + i=16353 + i=16314 + + + + InputArguments + + i=68 + i=16351 + + + + + + i=297 + + + + FileName + + i=12 + + -1 + + + + + + + i=297 + + + + RequestFileOpen + + i=1 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=16351 + + + + + + i=297 + + + + FileNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Delete + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.3.5 + + i=16355 + i=16314 + + + + InputArguments + + i=68 + i=16354 + + + + + + i=297 + + + + ObjectToDelete + + i=17 + + -1 + + + + + + + + + MoveOrCopy + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.3.6 + + i=16357 + i=16358 + i=16314 + + + + InputArguments + + i=68 + i=16356 + + + + + + i=297 + + + + ObjectToMoveOrCopy + + i=17 + + -1 + + + + + + + i=297 + + + + TargetDirectory + + i=17 + + -1 + + + + + + + i=297 + + + + CreateCopy + + i=1 + + -1 + + + + + + + i=297 + + + + NewName + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=16356 + + + + + + i=297 + + + + NewNodeId + + i=17 + + -1 + + + + + + + + + TemporaryFileTransferType + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.4.1 + + i=15745 + i=15746 + i=15749 + i=15751 + i=15754 + i=58 + + + + ClientProcessingTimeout + + i=68 + i=78 + i=15744 + + + + GenerateFileForRead + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.4.3 + + i=15747 + i=15748 + i=78 + i=15744 + + + + InputArguments + + i=68 + i=78 + i=15746 + + + + + + i=297 + + + + GenerateOptions + + i=24 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15746 + + + + + + i=297 + + + + FileNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + CompletionStateMachine + + i=17 + + -1 + + + + + + + + + GenerateFileForWrite + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.4.4 + + i=16359 + i=15750 + i=78 + i=15744 + + + + InputArguments + + i=68 + i=78 + i=15749 + + + + + + i=297 + + + + GenerateOptions + + i=24 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15749 + + + + + + i=297 + + + + FileNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CloseAndCommit + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.4.5 + + i=15752 + i=15753 + i=78 + i=15744 + + + + InputArguments + + i=68 + i=78 + i=15751 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15751 + + + + + + i=297 + + + + CompletionStateMachine + + i=17 + + -1 + + + + + + + + + <TransferState> + + i=15755 + i=15794 + i=15803 + i=11508 + i=15744 + + + + CurrentState + + i=15756 + i=2760 + i=78 + i=15754 + + + + Id + + i=68 + i=78 + i=15755 + + + + Reset + + i=78 + i=15754 + + + + FileTransferStateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.4.6 + + i=15815 + i=15817 + i=15819 + i=15821 + i=15823 + i=15825 + i=15827 + i=15829 + i=15831 + i=15833 + i=15835 + i=15837 + i=15839 + i=15841 + i=15843 + i=2771 + + + + Idle + + i=15816 + i=15825 + i=15829 + i=15831 + i=15833 + i=15841 + i=2309 + i=15803 + + + + StateNumber + + i=68 + i=78 + i=15815 + + + 1 + + + + ReadPrepare + + i=15818 + i=15825 + i=15827 + i=15835 + i=2307 + i=15803 + + + + StateNumber + + i=68 + i=78 + i=15817 + + + 2 + + + + ReadTransfer + + i=15820 + i=15827 + i=15829 + i=15837 + i=2307 + i=15803 + + + + StateNumber + + i=68 + i=78 + i=15819 + + + 3 + + + + ApplyWrite + + i=15822 + i=15831 + i=15833 + i=15839 + i=2307 + i=15803 + + + + StateNumber + + i=68 + i=78 + i=15821 + + + 4 + + + + Error + + i=15824 + i=15835 + i=15837 + i=15839 + i=15841 + i=2307 + i=15803 + + + + StateNumber + + i=68 + i=78 + i=15823 + + + 5 + + + + IdleToReadPrepare + + i=15826 + i=15815 + i=15817 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15825 + + + 12 + + + + ReadPrepareToReadTransfer + + i=15828 + i=15817 + i=15819 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15827 + + + 23 + + + + ReadTransferToIdle + + i=15830 + i=15819 + i=15815 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15829 + + + 31 + + + + IdleToApplyWrite + + i=15832 + i=15815 + i=15821 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15831 + + + 14 + + + + ApplyWriteToIdle + + i=15834 + i=15821 + i=15815 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15833 + + + 41 + + + + ReadPrepareToError + + i=15836 + i=15817 + i=15823 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15835 + + + 25 + + + + ReadTransferToError + + i=15838 + i=15819 + i=15823 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15837 + + + 35 + + + + ApplyWriteToError + + i=15840 + i=15821 + i=15823 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15839 + + + 45 + + + + ErrorToIdle + + i=15842 + i=15823 + i=15815 + i=2311 + i=2310 + i=15803 + + + + TransitionNumber + + i=68 + i=78 + i=15841 + + + 51 + + + + Reset + + i=78 + i=15803 + + + + RoleSetType + https://reference.opcfoundation.org/v104/Core/docs/Part5/F.2.1 + + i=15608 + i=15997 + i=16000 + i=58 + + + + <RoleName> + + i=16162 + i=15620 + i=11508 + i=15607 + + + + Identities + + i=68 + i=78 + i=15608 + + + + AddRole + + i=15998 + i=15999 + i=78 + i=15607 + + + + InputArguments + + i=68 + i=78 + i=15997 + + + + + + i=297 + + + + RoleName + + i=12 + + -1 + + + + + + + i=297 + + + + NamespaceUri + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15997 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + RemoveRole + + i=16001 + i=78 + i=15607 + + + + InputArguments + + i=68 + i=78 + i=16000 + + + + + + i=297 + + + + RoleNodeId + + i=17 + + -1 + + + + + + + + + RoleType + https://reference.opcfoundation.org/v104/Core/docs/Part5/F.3.1 + + i=16173 + i=16174 + i=15410 + i=16175 + i=15411 + i=15624 + i=15626 + i=16176 + i=16178 + i=16180 + i=16182 + i=58 + + + + Identities + + i=68 + i=78 + i=15620 + + + + Applications + + i=68 + i=80 + i=15620 + + + + ApplicationsExclude + + i=68 + i=80 + i=15620 + + + + Endpoints + + i=68 + i=80 + i=15620 + + + + EndpointsExclude + + i=68 + i=80 + i=15620 + + + + AddIdentity + + i=15625 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=15624 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15627 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=15626 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16177 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=16176 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16179 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=16178 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16181 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=16180 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16183 + i=80 + i=15620 + + + + InputArguments + + i=68 + i=78 + i=16182 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + IdentityCriteriaType + https://reference.opcfoundation.org/v104/Core/docs/Part5/F.3.2 + + i=15633 + i=29 + + + + + + + + + + + + + EnumValues + + i=68 + i=15632 + + + + + + i=7616 + + + + 1 + + UserName + + + + + + + i=7616 + + + + 2 + + Thumbprint + + + + + + + i=7616 + + + + 3 + + Role + + + + + + + i=7616 + + + + 4 + + GroupId + + + + + + + i=7616 + + + + 5 + + Anonymous + + + + + + + i=7616 + + + + 6 + + AuthenticatedUser + + + + + + + i=7616 + + + + 7 + + Application + + + + + + + + + IdentityMappingRuleType + https://reference.opcfoundation.org/v104/Core/docs/Part5/F.3.2 + + i=22 + + + + + + + + RoleMappingRuleChangedAuditEventType + https://reference.opcfoundation.org/v104/Core/docs/Part5/1 + + i=2127 + + + + Anonymous + + i=16192 + i=16193 + i=15412 + i=16194 + i=15413 + i=15648 + i=15650 + i=16195 + i=16197 + i=16199 + i=16201 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15644 + + + + Applications + + i=68 + i=15644 + + + + ApplicationsExclude + + i=68 + i=15644 + + + + Endpoints + + i=68 + i=15644 + + + + EndpointsExclude + + i=68 + i=15644 + + + + AddIdentity + + i=15649 + i=15644 + + + + InputArguments + + i=68 + i=15648 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15651 + i=15644 + + + + InputArguments + + i=68 + i=15650 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16196 + i=15644 + + + + InputArguments + + i=68 + i=16195 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16198 + i=15644 + + + + InputArguments + + i=68 + i=16197 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16200 + i=15644 + + + + InputArguments + + i=68 + i=16199 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16202 + i=15644 + + + + InputArguments + + i=68 + i=16201 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + AuthenticatedUser + + i=16203 + i=16204 + i=15414 + i=16205 + i=15415 + i=15660 + i=15662 + i=16206 + i=16208 + i=16210 + i=16212 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15656 + + + + Applications + + i=68 + i=15656 + + + + ApplicationsExclude + + i=68 + i=15656 + + + + Endpoints + + i=68 + i=15656 + + + + EndpointsExclude + + i=68 + i=15656 + + + + AddIdentity + + i=15661 + i=15656 + + + + InputArguments + + i=68 + i=15660 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15663 + i=15656 + + + + InputArguments + + i=68 + i=15662 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16207 + i=15656 + + + + InputArguments + + i=68 + i=16206 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16209 + i=15656 + + + + InputArguments + + i=68 + i=16208 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16211 + i=15656 + + + + InputArguments + + i=68 + i=16210 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16213 + i=15656 + + + + InputArguments + + i=68 + i=16212 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + Observer + + i=16214 + i=16215 + i=15416 + i=16216 + i=15417 + i=15672 + i=15674 + i=16217 + i=16219 + i=16221 + i=16223 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15668 + + + + Applications + + i=68 + i=15668 + + + + ApplicationsExclude + + i=68 + i=15668 + + + + Endpoints + + i=68 + i=15668 + + + + EndpointsExclude + + i=68 + i=15668 + + + + AddIdentity + + i=15673 + i=15668 + + + + InputArguments + + i=68 + i=15672 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15675 + i=15668 + + + + InputArguments + + i=68 + i=15674 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16218 + i=15668 + + + + InputArguments + + i=68 + i=16217 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16220 + i=15668 + + + + InputArguments + + i=68 + i=16219 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16222 + i=15668 + + + + InputArguments + + i=68 + i=16221 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16224 + i=15668 + + + + InputArguments + + i=68 + i=16223 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + Operator + + i=16225 + i=16226 + i=15418 + i=16227 + i=15423 + i=15684 + i=15686 + i=16228 + i=16230 + i=16232 + i=16234 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15680 + + + + Applications + + i=68 + i=15680 + + + + ApplicationsExclude + + i=68 + i=15680 + + + + Endpoints + + i=68 + i=15680 + + + + EndpointsExclude + + i=68 + i=15680 + + + + AddIdentity + + i=15685 + i=15680 + + + + InputArguments + + i=68 + i=15684 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15687 + i=15680 + + + + InputArguments + + i=68 + i=15686 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16229 + i=15680 + + + + InputArguments + + i=68 + i=16228 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16231 + i=15680 + + + + InputArguments + + i=68 + i=16230 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16233 + i=15680 + + + + InputArguments + + i=68 + i=16232 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16235 + i=15680 + + + + InputArguments + + i=68 + i=16234 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + Engineer + + i=16236 + i=16237 + i=15424 + i=16238 + i=15425 + i=16041 + i=16043 + i=16239 + i=16241 + i=16243 + i=16245 + i=15606 + i=15620 + + + + Identities + + i=68 + i=16036 + + + + Applications + + i=68 + i=16036 + + + + ApplicationsExclude + + i=68 + i=16036 + + + + Endpoints + + i=68 + i=16036 + + + + EndpointsExclude + + i=68 + i=16036 + + + + AddIdentity + + i=16042 + i=16036 + + + + InputArguments + + i=68 + i=16041 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=16044 + i=16036 + + + + InputArguments + + i=68 + i=16043 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16240 + i=16036 + + + + InputArguments + + i=68 + i=16239 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16242 + i=16036 + + + + InputArguments + + i=68 + i=16241 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16244 + i=16036 + + + + InputArguments + + i=68 + i=16243 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16246 + i=16036 + + + + InputArguments + + i=68 + i=16245 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + Supervisor + + i=16247 + i=16248 + i=15426 + i=16249 + i=15427 + i=15696 + i=15698 + i=16250 + i=16252 + i=16254 + i=16256 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15692 + + + + Applications + + i=68 + i=15692 + + + + ApplicationsExclude + + i=68 + i=15692 + + + + Endpoints + + i=68 + i=15692 + + + + EndpointsExclude + + i=68 + i=15692 + + + + AddIdentity + + i=15697 + i=15692 + + + + InputArguments + + i=68 + i=15696 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15699 + i=15692 + + + + InputArguments + + i=68 + i=15698 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16251 + i=15692 + + + + InputArguments + + i=68 + i=16250 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16253 + i=15692 + + + + InputArguments + + i=68 + i=16252 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16255 + i=15692 + + + + InputArguments + + i=68 + i=16254 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16257 + i=15692 + + + + InputArguments + + i=68 + i=16256 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + ConfigureAdmin + + i=16269 + i=16270 + i=15428 + i=16271 + i=15429 + i=15720 + i=15722 + i=16272 + i=16274 + i=16276 + i=16278 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15716 + + + + Applications + + i=68 + i=15716 + + + + ApplicationsExclude + + i=68 + i=15716 + + + + Endpoints + + i=68 + i=15716 + + + + EndpointsExclude + + i=68 + i=15716 + + + + AddIdentity + + i=15721 + i=15716 + + + + InputArguments + + i=68 + i=15720 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15723 + i=15716 + + + + InputArguments + + i=68 + i=15722 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16273 + i=15716 + + + + InputArguments + + i=68 + i=16272 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16275 + i=15716 + + + + InputArguments + + i=68 + i=16274 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16277 + i=15716 + + + + InputArguments + + i=68 + i=16276 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16279 + i=15716 + + + + InputArguments + + i=68 + i=16278 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + SecurityAdmin + + i=16258 + i=16259 + i=15430 + i=16260 + i=15527 + i=15708 + i=15710 + i=16261 + i=16263 + i=16265 + i=16267 + i=15606 + i=15620 + + + + Identities + + i=68 + i=15704 + + + + Applications + + i=68 + i=15704 + + + + ApplicationsExclude + + i=68 + i=15704 + + + + Endpoints + + i=68 + i=15704 + + + + EndpointsExclude + + i=68 + i=15704 + + + + AddIdentity + + i=15709 + i=15704 + + + + InputArguments + + i=68 + i=15708 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + RemoveIdentity + + i=15711 + i=15704 + + + + InputArguments + + i=68 + i=15710 + + + + + + i=297 + + + + Rule + + i=15634 + + -1 + + + + + + + + + AddApplication + + i=16262 + i=15704 + + + + InputArguments + + i=68 + i=16261 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + RemoveApplication + + i=16264 + i=15704 + + + + InputArguments + + i=68 + i=16263 + + + + + + i=297 + + + + ApplicationUri + + i=12 + + -1 + + + + + + + + + AddEndpoint + + i=16266 + i=15704 + + + + InputArguments + + i=68 + i=16265 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + RemoveEndpoint + + i=16268 + i=15704 + + + + InputArguments + + i=68 + i=16267 + + + + + + i=297 + + + + Endpoint + + i=15528 + + -1 + + + + + + + + + DictionaryEntryType + https://reference.opcfoundation.org/v104/Core/docs/Amendment5/G.2.3 + + i=17590 + i=58 + + + + <DictionaryEntryName> + + i=17589 + i=11508 + i=17589 + + + + DictionaryFolderType + https://reference.opcfoundation.org/v104/Core/docs/Amendment5/G.2.4 + + i=17592 + i=17593 + i=61 + + + + <DictionaryFolderName> + + i=17591 + i=11508 + i=17591 + + + + <DictionaryEntryName> + + i=17589 + i=11508 + i=17591 + + + + Dictionaries + https://reference.opcfoundation.org/v104/Core/docs/Amendment5/G.2.2 + + i=2253 + i=17591 + + + + HasDictionaryEntry + https://reference.opcfoundation.org/v104/Core/docs/Part19/6.1 + + i=32 + + DictionaryEntryOf + + + IrdiDictionaryEntryType + https://reference.opcfoundation.org/v104/Core/docs/Amendment5/G.3 + + i=17589 + + + + UriDictionaryEntryType + https://reference.opcfoundation.org/v104/Core/docs/Amendment5/G.4 + + i=17589 + + + + BaseInterfaceType + https://reference.opcfoundation.org/v104/Core/docs/Amendment7/6.9 + + i=58 + + + + InterfaceTypes + https://reference.opcfoundation.org/v104/Core/docs/Amendment7/8.2.11 + + i=17602 + i=86 + i=61 + + + + HasInterface + https://reference.opcfoundation.org/v104/Core/docs/Amendment7/11.20 + + i=32 + + InterfaceOf + + + HasAddIn + https://reference.opcfoundation.org/v104/Core/docs/Amendment7/11.21 + + i=47 + + AddInOf + + + CurrencyUnitType + https://reference.opcfoundation.org/v104/Core/docs/Amendment10/8.61 + + i=22 + + + + + + + + + + CurrencyUnit + + i=68 + + + + IOrderedObjectType + https://reference.opcfoundation.org/v104/Core/docs/Amendment13/6.10 + + i=23517 + i=17602 + + + + NumberInList + + i=68 + i=78 + i=23513 + + + + OrderedListType + https://reference.opcfoundation.org/v104/Core/docs/Amendment13/6.10 + + i=23519 + i=23525 + i=2133 + i=58 + + + + <OrderedObject> + + i=23521 + i=23513 + i=58 + i=11508 + i=23518 + + + + NumberInList + + i=68 + i=78 + i=23519 + + + + NodeVersion + + i=68 + i=80 + i=23518 + + + + DataItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.1 + + i=2366 + i=2367 + i=63 + + + + Definition + + i=68 + i=80 + i=2365 + + + + ValuePrecision + + i=68 + i=80 + i=2365 + + + + BaseAnalogType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.2/#5.3.2.2 + + i=17567 + i=17568 + i=17569 + i=2365 + + + + InstrumentRange + + i=68 + i=80 + i=15318 + + + + EURange + + i=68 + i=80 + i=15318 + + + + EngineeringUnits + + i=68 + i=80 + i=15318 + + + + AnalogItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.2/#5.3.2.3 + + i=2369 + i=15318 + + + + EURange + + i=68 + i=78 + i=2368 + + + + AnalogUnitType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.2/#5.3.2.4 + + i=17502 + i=15318 + + + + EngineeringUnits + + i=68 + i=78 + i=17497 + + + + AnalogUnitRangeType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.2/#5.3.2.5 + + i=17575 + i=2368 + + + + EngineeringUnits + + i=68 + i=78 + i=17570 + + + + DiscreteItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.3/#5.3.3.1 + + i=2365 + + + + TwoStateDiscreteType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.3/#5.3.3.2 + + i=2374 + i=2375 + i=2372 + + + + FalseState + + i=68 + i=78 + i=2373 + + + + TrueState + + i=68 + i=78 + i=2373 + + + + MultiStateDiscreteType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.3/#5.3.3.3 + + i=2377 + i=2372 + + + + EnumStrings + + i=68 + i=78 + i=2376 + + + + MultiStateValueDiscreteType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.3/#5.3.3.4 + + i=11241 + i=11461 + i=2372 + + + + EnumValues + + i=68 + i=78 + i=11238 + + + + ValueAsText + + i=68 + i=78 + i=11238 + + + + ArrayItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.1 + + i=12024 + i=12025 + i=12026 + i=12027 + i=12028 + i=2365 + + + + InstrumentRange + + i=68 + i=80 + i=12021 + + + + EURange + + i=68 + i=78 + i=12021 + + + + EngineeringUnits + + i=68 + i=78 + i=12021 + + + + Title + + i=68 + i=78 + i=12021 + + + + AxisScaleType + + i=68 + i=78 + i=12021 + + + + YArrayItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.2 + + i=12037 + i=12021 + + + + XAxisDefinition + + i=68 + i=78 + i=12029 + + + + XYArrayItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.3 + + i=12046 + i=12021 + + + + XAxisDefinition + + i=68 + i=78 + i=12038 + + + + ImageItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.4 + + i=12055 + i=12056 + i=12021 + + + + XAxisDefinition + + i=68 + i=78 + i=12047 + + + + YAxisDefinition + + i=68 + i=78 + i=12047 + + + + CubeItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.5 + + i=12065 + i=12066 + i=12067 + i=12021 + + + + XAxisDefinition + + i=68 + i=78 + i=12057 + + + + YAxisDefinition + + i=68 + i=78 + i=12057 + + + + ZAxisDefinition + + i=68 + i=78 + i=12057 + + + + NDimensionArrayItemType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.3.4/#5.3.4.6 + + i=12076 + i=12021 + + + + AxisDefinition + + i=68 + i=78 + i=12068 + + + + TwoStateVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.2 + + i=8996 + i=9000 + i=9001 + i=11110 + i=11111 + i=2755 + + + + Id + + i=68 + i=78 + i=8995 + + + + TransitionTime + + i=68 + i=80 + i=8995 + + + + EffectiveTransitionTime + + i=68 + i=80 + i=8995 + + + + TrueState + + i=68 + i=80 + i=8995 + + + + FalseState + + i=68 + i=80 + i=8995 + + + + ConditionVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.3 + + i=9003 + i=63 + + + + SourceTimestamp + + i=68 + i=78 + i=9002 + + + + HasTrueSubState + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.4.2 + + i=32 + + IsTrueSubStateOf + + + HasFalseSubState + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.4.3 + + i=32 + + IsFalseSubStateOf + + + HasAlarmSuppressionGroup + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.4.4 + + i=47 + + IsAlarmSuppressionGroupOf + + + AlarmGroupMember + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.4.5 + + i=35 + + MemberOfAlarmGroup + + + ConditionType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.2 + + i=11112 + i=11113 + i=16363 + i=16364 + i=9009 + i=9010 + i=3874 + i=9011 + i=9020 + i=9022 + i=9024 + i=9026 + i=9028 + i=9027 + i=9029 + i=3875 + i=12912 + i=2041 + + + + ConditionClassId + + i=68 + i=78 + i=2782 + + + + ConditionClassName + + i=68 + i=78 + i=2782 + + + + ConditionSubClassId + + i=68 + i=80 + i=2782 + + + + ConditionSubClassName + + i=68 + i=80 + i=2782 + + + + ConditionName + + i=68 + i=78 + i=2782 + + + + BranchId + + i=68 + i=78 + i=2782 + + + + Retain + + i=68 + i=78 + i=2782 + + + + EnabledState + + i=9012 + i=9015 + i=9016 + i=9017 + i=9018 + i=9019 + i=8995 + i=78 + i=2782 + + + + Id + + i=68 + i=78 + i=9011 + + + + EffectiveDisplayName + + i=68 + i=80 + i=9011 + + + + TransitionTime + + i=68 + i=80 + i=9011 + + + + EffectiveTransitionTime + + i=68 + i=80 + i=9011 + + + + TrueState + + i=68 + i=80 + i=9011 + + + + en + Enabled + + + + + FalseState + + i=68 + i=80 + i=9011 + + + + en + Disabled + + + + + Quality + + i=9021 + i=9002 + i=78 + i=2782 + + + + SourceTimestamp + + i=68 + i=78 + i=9020 + + + + LastSeverity + + i=9023 + i=9002 + i=78 + i=2782 + + + + SourceTimestamp + + i=68 + i=78 + i=9022 + + + + Comment + + i=9025 + i=9002 + i=78 + i=2782 + + + + SourceTimestamp + + i=68 + i=78 + i=9024 + + + + ClientUserId + + i=68 + i=78 + i=2782 + + + + Disable + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.4 + + i=2803 + i=78 + i=2782 + + + + Enable + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.5 + + i=2803 + i=78 + i=2782 + + + + AddComment + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.6 + + i=9030 + i=2829 + i=78 + i=2782 + + + + InputArguments + + i=68 + i=78 + i=9029 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + ConditionRefresh + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.7 + + i=3876 + i=2787 + i=2788 + i=2782 + + + + InputArguments + + i=68 + i=78 + i=3875 + + + + + + i=297 + + + + SubscriptionId + + i=288 + + -1 + + + The identifier for the subscription to refresh. + + + + + + + + + ConditionRefresh2 + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.5.8 + + i=12913 + i=2787 + i=2788 + i=2782 + + + + InputArguments + + i=68 + i=78 + i=12912 + + + + + + i=297 + + + + SubscriptionId + + i=288 + + -1 + + + The identifier for the subscription to refresh. + + + + + + + i=297 + + + + MonitoredItemId + + i=288 + + -1 + + + The identifier for the monitored item to refresh. + + + + + + + + + DialogConditionType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.6.2 + + i=9035 + i=9055 + i=2831 + i=9064 + i=9065 + i=9066 + i=9067 + i=9068 + i=9069 + i=2782 + + + + EnabledState + + i=9036 + i=9055 + i=8995 + i=78 + i=2830 + + + + Id + + i=68 + i=78 + i=9035 + + + + DialogState + + i=9056 + i=9060 + i=9062 + i=9063 + i=9035 + i=8995 + i=78 + i=2830 + + + + Id + + i=68 + i=78 + i=9055 + + + + TransitionTime + + i=68 + i=80 + i=9055 + + + + TrueState + + i=68 + i=80 + i=9055 + + + + en + Active + + + + + FalseState + + i=68 + i=80 + i=9055 + + + + en + Inactive + + + + + Prompt + + i=68 + i=78 + i=2830 + + + + ResponseOptionSet + + i=68 + i=78 + i=2830 + + + + DefaultResponse + + i=68 + i=78 + i=2830 + + + + OkResponse + + i=68 + i=78 + i=2830 + + + + CancelResponse + + i=68 + i=78 + i=2830 + + + + LastResponse + + i=68 + i=78 + i=2830 + + + + Respond + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.6.3 + + i=9070 + i=8927 + i=78 + i=2830 + + + + InputArguments + + i=68 + i=78 + i=9069 + + + + + + i=297 + + + + SelectedResponse + + i=6 + + -1 + + + The response to the dialog condition. + + + + + + + + + AcknowledgeableConditionType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.7.2 + + i=9073 + i=9093 + i=9102 + i=9111 + i=9113 + i=2782 + + + + EnabledState + + i=9074 + i=9093 + i=9102 + i=8995 + i=78 + i=2881 + + + + Id + + i=68 + i=78 + i=9073 + + + + AckedState + + i=9094 + i=9098 + i=9100 + i=9101 + i=9073 + i=8995 + i=78 + i=2881 + + + + Id + + i=68 + i=78 + i=9093 + + + + TransitionTime + + i=68 + i=80 + i=9093 + + + + TrueState + + i=68 + i=80 + i=9093 + + + + en + Acknowledged + + + + + FalseState + + i=68 + i=80 + i=9093 + + + + en + Unacknowledged + + + + + ConfirmedState + + i=9103 + i=9107 + i=9109 + i=9110 + i=9073 + i=8995 + i=80 + i=2881 + + + + Id + + i=68 + i=78 + i=9102 + + + + TransitionTime + + i=68 + i=80 + i=9102 + + + + TrueState + + i=68 + i=80 + i=9102 + + + + en + Confirmed + + + + + FalseState + + i=68 + i=80 + i=9102 + + + + en + Unconfirmed + + + + + Acknowledge + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.7.3 + + i=9112 + i=8944 + i=78 + i=2881 + + + + InputArguments + + i=68 + i=78 + i=9111 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + Confirm + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.7.4 + + i=9114 + i=8961 + i=80 + i=2881 + + + + InputArguments + + i=68 + i=78 + i=9113 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + AlarmConditionType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.2 + + i=9118 + i=9160 + i=11120 + i=9169 + i=16371 + i=9178 + i=9215 + i=9216 + i=16389 + i=16390 + i=16380 + i=16395 + i=16396 + i=16397 + i=16398 + i=18190 + i=16399 + i=16400 + i=16401 + i=16402 + i=16403 + i=17868 + i=17869 + i=17870 + i=18199 + i=2881 + + + + EnabledState + + i=9119 + i=9160 + i=9169 + i=9178 + i=8995 + i=78 + i=2915 + + + + Id + + i=68 + i=78 + i=9118 + + + + ActiveState + + i=9161 + i=9164 + i=9165 + i=9166 + i=9167 + i=9168 + i=9118 + i=8995 + i=78 + i=2915 + + + + Id + + i=68 + i=78 + i=9160 + + + + EffectiveDisplayName + + i=68 + i=80 + i=9160 + + + + TransitionTime + + i=68 + i=80 + i=9160 + + + + EffectiveTransitionTime + + i=68 + i=80 + i=9160 + + + + TrueState + + i=68 + i=80 + i=9160 + + + + en + Active + + + + + FalseState + + i=68 + i=80 + i=9160 + + + + en + Inactive + + + + + InputNode + + i=68 + i=78 + i=2915 + + + + SuppressedState + + i=9170 + i=9174 + i=9176 + i=9177 + i=9118 + i=8995 + i=80 + i=2915 + + + + Id + + i=68 + i=78 + i=9169 + + + + TransitionTime + + i=68 + i=80 + i=9169 + + + + TrueState + + i=68 + i=80 + i=9169 + + + + en + Suppressed + + + + + FalseState + + i=68 + i=80 + i=9169 + + + + en + Unsuppressed + + + + + OutOfServiceState + + i=16372 + i=16376 + i=16378 + i=16379 + i=8995 + i=80 + i=2915 + + + + Id + + i=68 + i=78 + i=16371 + + + + TransitionTime + + i=68 + i=80 + i=16371 + + + + TrueState + + i=68 + i=80 + i=16371 + + + + en + Out of Service + + + + + FalseState + + i=68 + i=80 + i=16371 + + + + en + In Service + + + + + ShelvingState + + i=9179 + i=9184 + i=9189 + i=9213 + i=9211 + i=9212 + i=9118 + i=2929 + i=80 + i=2915 + + + + CurrentState + + i=9180 + i=2760 + i=78 + i=9178 + + + + Id + + i=68 + i=78 + i=9179 + + + + LastTransition + + i=9185 + i=9188 + i=2767 + i=80 + i=9178 + + + + Id + + i=68 + i=78 + i=9184 + + + + TransitionTime + + i=68 + i=80 + i=9184 + + + + UnshelveTime + + i=68 + i=78 + i=9178 + + + + TimedShelve + + i=9214 + i=11093 + i=78 + i=9178 + + + + InputArguments + + i=68 + i=78 + i=9213 + + + + + + i=297 + + + + ShelvingTime + + i=290 + + -1 + + + If not 0, this parameter specifies a fixed time for which the Alarm is to be shelved. + + + + + + + + + Unshelve + + i=11093 + i=78 + i=9178 + + + + OneShotShelve + + i=11093 + i=78 + i=9178 + + + + SuppressedOrShelved + + i=68 + i=78 + i=2915 + + + + MaxTimeShelved + + i=68 + i=80 + i=2915 + + + + AudibleEnabled + + i=68 + i=80 + i=2915 + + + + AudibleSound + + i=17986 + i=80 + i=2915 + + + + SilenceState + + i=16381 + i=16385 + i=16387 + i=16388 + i=8995 + i=80 + i=2915 + + + + Id + + i=68 + i=78 + i=16380 + + + + TransitionTime + + i=68 + i=80 + i=16380 + + + + TrueState + + i=68 + i=80 + i=16380 + + + + en + Silenced + + + + + FalseState + + i=68 + i=80 + i=16380 + + + + en + Not Silenced + + + + + OnDelay + + i=68 + i=80 + i=2915 + + + + OffDelay + + i=68 + i=80 + i=2915 + + + + FirstInGroupFlag + + i=63 + i=80 + i=2915 + + + + FirstInGroup + + i=16405 + i=80 + i=2915 + + + + LatchedState + + i=18191 + i=18195 + i=18197 + i=18198 + i=8995 + i=80 + i=2915 + + + + Id + + i=68 + i=78 + i=18190 + + + + TransitionTime + + i=68 + i=80 + i=18190 + + + + TrueState + + i=68 + i=80 + i=18190 + + + + en + Latched + + + + + FalseState + + i=68 + i=80 + i=18190 + + + + en + Unlatched + + + + + <AlarmGroup> + + i=16405 + i=11508 + i=2915 + + + + ReAlarmTime + + i=68 + i=80 + i=2915 + + + + ReAlarmRepeatCount + + i=63 + i=80 + i=2915 + + + + Silence + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.5 + + i=17242 + i=80 + i=2915 + + + + Suppress + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.6 + + i=17225 + i=80 + i=2915 + + + + Unsuppress + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.7 + + i=17225 + i=80 + i=2915 + + + + RemoveFromService + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.8 + + i=17259 + i=80 + i=2915 + + + + PlaceInService + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.9 + + i=17259 + i=80 + i=2915 + + + + Reset + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.4 + + i=15013 + i=80 + i=2915 + + + + AlarmGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.3 + + i=16406 + i=61 + + + + <AlarmConditionInstance> + + i=16407 + i=16408 + i=16409 + i=16410 + i=16411 + i=16412 + i=16414 + i=16415 + i=16416 + i=16417 + i=16420 + i=16421 + i=16422 + i=16423 + i=16432 + i=16434 + i=16436 + i=16438 + i=16439 + i=16440 + i=16441 + i=16443 + i=16461 + i=16465 + i=16474 + i=16519 + i=2915 + i=11508 + i=16405 + + + + EventId + + i=68 + i=78 + i=16406 + + + + EventType + + i=68 + i=78 + i=16406 + + + + SourceNode + + i=68 + i=78 + i=16406 + + + + SourceName + + i=68 + i=78 + i=16406 + + + + Time + + i=68 + i=78 + i=16406 + + + + ReceiveTime + + i=68 + i=78 + i=16406 + + + + Message + + i=68 + i=78 + i=16406 + + + + Severity + + i=68 + i=78 + i=16406 + + + + ConditionClassId + + i=68 + i=78 + i=16406 + + + + ConditionClassName + + i=68 + i=78 + i=16406 + + + + ConditionName + + i=68 + i=78 + i=16406 + + + + BranchId + + i=68 + i=78 + i=16406 + + + + Retain + + i=68 + i=78 + i=16406 + + + + EnabledState + + i=16424 + i=8995 + i=78 + i=16406 + + + + Id + + i=68 + i=78 + i=16423 + + + + Quality + + i=16433 + i=9002 + i=78 + i=16406 + + + + SourceTimestamp + + i=68 + i=78 + i=16432 + + + + LastSeverity + + i=16435 + i=9002 + i=78 + i=16406 + + + + SourceTimestamp + + i=68 + i=78 + i=16434 + + + + Comment + + i=16437 + i=9002 + i=78 + i=16406 + + + + SourceTimestamp + + i=68 + i=78 + i=16436 + + + + ClientUserId + + i=68 + i=78 + i=16406 + + + + Disable + + i=2803 + i=78 + i=16406 + + + + Enable + + i=2803 + i=78 + i=16406 + + + + AddComment + + i=16442 + i=2829 + i=78 + i=16406 + + + + InputArguments + + i=68 + i=78 + i=16441 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + AckedState + + i=16444 + i=8995 + i=78 + i=16406 + + + + Id + + i=68 + i=78 + i=16443 + + + + Acknowledge + + i=16462 + i=8944 + i=78 + i=16406 + + + + InputArguments + + i=68 + i=78 + i=16461 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + ActiveState + + i=16466 + i=8995 + i=78 + i=16406 + + + + Id + + i=68 + i=78 + i=16465 + + + + InputNode + + i=68 + i=78 + i=16406 + + + + SuppressedOrShelved + + i=68 + i=78 + i=16406 + + + + ShelvedStateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.10/#5.8.10.1 + + i=9115 + i=2930 + i=2932 + i=2933 + i=2935 + i=2936 + i=2940 + i=2942 + i=2943 + i=2945 + i=2949 + i=2947 + i=2948 + i=2771 + + + + UnshelveTime + + i=68 + i=78 + i=2929 + + + + Unshelved + + i=6098 + i=2935 + i=2936 + i=2940 + i=2943 + i=2307 + i=2929 + + + + StateNumber + + i=68 + i=78 + i=2930 + + + 1 + + + + TimedShelved + + i=6100 + i=2935 + i=2940 + i=2942 + i=2945 + i=2307 + i=2929 + + + + StateNumber + + i=68 + i=78 + i=2932 + + + 2 + + + + OneShotShelved + + i=6101 + i=2936 + i=2942 + i=2943 + i=2945 + i=2307 + i=2929 + + + + StateNumber + + i=68 + i=78 + i=2933 + + + 3 + + + + UnshelvedToTimedShelved + + i=11322 + i=2930 + i=2932 + i=2915 + i=2949 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2935 + + + 12 + + + + UnshelvedToOneShotShelved + + i=11323 + i=2930 + i=2933 + i=2915 + i=2948 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2936 + + + 13 + + + + TimedShelvedToUnshelved + + i=11324 + i=2932 + i=2930 + i=2915 + i=2947 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2940 + + + 21 + + + + TimedShelvedToOneShotShelved + + i=11325 + i=2932 + i=2933 + i=2915 + i=2948 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2942 + + + 23 + + + + OneShotShelvedToUnshelved + + i=11326 + i=2933 + i=2930 + i=2915 + i=2947 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2943 + + + 31 + + + + OneShotShelvedToTimedShelved + + i=11327 + i=2933 + i=2932 + i=2915 + i=2949 + i=2310 + i=2929 + + + + TransitionNumber + + i=68 + i=78 + i=2945 + + + 32 + + + + TimedShelve + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.10/#5.8.10.3 + + i=2991 + i=2935 + i=2945 + i=11093 + i=78 + i=2929 + + + + InputArguments + + i=68 + i=78 + i=2949 + + + + + + i=297 + + + + ShelvingTime + + i=290 + + -1 + + + If not 0, this parameter specifies a fixed time for which the Alarm is to be shelved. + + + + + + + + + Unshelve + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.10/#5.8.10.2 + + i=2940 + i=2943 + i=11093 + i=78 + i=2929 + + + + OneShotShelve + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.10/#5.8.10.4 + + i=2936 + i=2942 + i=11093 + i=78 + i=2929 + + + + LimitAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.11 + + i=11124 + i=11125 + i=11126 + i=11127 + i=16572 + i=16573 + i=16574 + i=16575 + i=2915 + + + + HighHighLimit + + i=68 + i=80 + i=2955 + + + + HighLimit + + i=68 + i=80 + i=2955 + + + + LowLimit + + i=68 + i=80 + i=2955 + + + + LowLowLimit + + i=68 + i=80 + i=2955 + + + + BaseHighHighLimit + + i=68 + i=80 + i=2955 + + + + BaseHighLimit + + i=68 + i=80 + i=2955 + + + + BaseLowLimit + + i=68 + i=80 + i=2955 + + + + BaseLowLowLimit + + i=68 + i=80 + i=2955 + + + + ExclusiveLimitStateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.12/#5.8.12.2 + + i=9329 + i=9331 + i=9333 + i=9335 + i=9337 + i=9338 + i=9339 + i=9340 + i=2771 + + + + HighHigh + + i=9330 + i=9339 + i=9340 + i=2307 + i=9318 + + + + StateNumber + + i=68 + i=78 + i=9329 + + + 1 + + + + High + + i=9332 + i=9339 + i=9340 + i=2307 + i=9318 + + + + StateNumber + + i=68 + i=78 + i=9331 + + + 2 + + + + Low + + i=9334 + i=9337 + i=9338 + i=2307 + i=9318 + + + + StateNumber + + i=68 + i=78 + i=9333 + + + 3 + + + + LowLow + + i=9336 + i=9337 + i=9338 + i=2307 + i=9318 + + + + StateNumber + + i=68 + i=78 + i=9335 + + + 4 + + + + LowLowToLow + + i=11340 + i=9335 + i=9333 + i=2310 + i=9318 + + + + TransitionNumber + + i=68 + i=78 + i=9337 + + + 43 + + + + LowToLowLow + + i=11341 + i=9333 + i=9335 + i=2310 + i=9318 + + + + TransitionNumber + + i=68 + i=78 + i=9338 + + + 34 + + + + HighHighToHigh + + i=11342 + i=9329 + i=9331 + i=2310 + i=9318 + + + + TransitionNumber + + i=68 + i=78 + i=9339 + + + 12 + + + + HighToHighHigh + + i=11343 + i=9331 + i=9329 + i=2310 + i=9318 + + + + TransitionNumber + + i=68 + i=78 + i=9340 + + + 21 + + + + ExclusiveLimitAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.12/#5.8.12.3 + + i=9398 + i=9455 + i=2955 + + + + ActiveState + + i=9399 + i=9455 + i=8995 + i=78 + i=9341 + + + + Id + + i=68 + i=78 + i=9398 + + + + LimitState + + i=9456 + i=9461 + i=9398 + i=9318 + i=78 + i=9341 + + + + CurrentState + + i=9457 + i=2760 + i=78 + i=9455 + + + + Id + + i=68 + i=78 + i=9456 + + + + LastTransition + + i=9462 + i=9465 + i=2767 + i=80 + i=9455 + + + + Id + + i=68 + i=78 + i=9461 + + + + TransitionTime + + i=68 + i=80 + i=9461 + + + + NonExclusiveLimitAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.13 + + i=9963 + i=10020 + i=10029 + i=10038 + i=10047 + i=2955 + + + + ActiveState + + i=9964 + i=10020 + i=10029 + i=10038 + i=10047 + i=8995 + i=78 + i=9906 + + + + Id + + i=68 + i=78 + i=9963 + + + + HighHighState + + i=10021 + i=10025 + i=10027 + i=10028 + i=9963 + i=8995 + i=80 + i=9906 + + + + Id + + i=68 + i=78 + i=10020 + + + + TransitionTime + + i=68 + i=80 + i=10020 + + + + TrueState + + i=68 + i=80 + i=10020 + + + + en + HighHigh active + + + + + FalseState + + i=68 + i=80 + i=10020 + + + + en + HighHigh inactive + + + + + HighState + + i=10030 + i=10034 + i=10036 + i=10037 + i=9963 + i=8995 + i=80 + i=9906 + + + + Id + + i=68 + i=78 + i=10029 + + + + TransitionTime + + i=68 + i=80 + i=10029 + + + + TrueState + + i=68 + i=80 + i=10029 + + + + en + High active + + + + + FalseState + + i=68 + i=80 + i=10029 + + + + en + High inactive + + + + + LowState + + i=10039 + i=10043 + i=10045 + i=10046 + i=9963 + i=8995 + i=80 + i=9906 + + + + Id + + i=68 + i=78 + i=10038 + + + + TransitionTime + + i=68 + i=80 + i=10038 + + + + TrueState + + i=68 + i=80 + i=10038 + + + + en + Low active + + + + + FalseState + + i=68 + i=80 + i=10038 + + + + en + Low inactive + + + + + LowLowState + + i=10048 + i=10052 + i=10054 + i=10055 + i=9963 + i=8995 + i=80 + i=9906 + + + + Id + + i=68 + i=78 + i=10047 + + + + TransitionTime + + i=68 + i=80 + i=10047 + + + + TrueState + + i=68 + i=80 + i=10047 + + + + en + LowLow active + + + + + FalseState + + i=68 + i=80 + i=10047 + + + + en + LowLow inactive + + + + + NonExclusiveLevelAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.14/#5.8.14.2 + + i=9906 + + + + ExclusiveLevelAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.14/#5.8.14.3 + + i=9341 + + + + NonExclusiveDeviationAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.15/#5.8.15.2 + + i=10522 + i=16776 + i=9906 + + + + SetpointNode + + i=68 + i=78 + i=10368 + + + + BaseSetpointNode + + i=68 + i=80 + i=10368 + + + + NonExclusiveRateOfChangeAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.16/#5.8.16.2 + + i=16858 + i=9906 + + + + EngineeringUnits + + i=68 + i=80 + i=10214 + + + + ExclusiveDeviationAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.15/#5.8.15.3 + + i=9905 + i=16817 + i=9341 + + + + SetpointNode + + i=68 + i=78 + i=9764 + + + + BaseSetpointNode + + i=68 + i=80 + i=9764 + + + + ExclusiveRateOfChangeAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.16/#5.8.16.3 + + i=16899 + i=9341 + + + + EngineeringUnits + + i=68 + i=80 + i=9623 + + + + DiscreteAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.1 + + i=2915 + + + + OffNormalAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.2 + + i=11158 + i=10523 + + + + NormalState + + i=68 + i=78 + i=10637 + + + + SystemOffNormalAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.3 + + i=10637 + + + + TripAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.4 + + i=10637 + + + + InstrumentDiagnosticAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.5 + + i=10637 + + + + SystemDiagnosticAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.6 + + i=10637 + + + + CertificateExpirationAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.17/#5.8.17.7 + + i=13325 + i=14900 + i=13326 + i=13327 + i=11753 + + + + ExpirationDate + + i=68 + i=78 + i=13225 + + + + ExpirationLimit + + i=68 + i=80 + i=13225 + + + + CertificateType + + i=68 + i=78 + i=13225 + + + + Certificate + + i=68 + i=78 + i=13225 + + + + DiscrepancyAlarmType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.8.18 + + i=17215 + i=17216 + i=17217 + i=2915 + + + + TargetValueNode + + i=68 + i=78 + i=17080 + + + + ExpectedTime + + i=68 + i=78 + i=17080 + + + + Tolerance + + i=68 + i=80 + i=17080 + + + + BaseConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.2 + + i=58 + + + + ProcessConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.3 + + i=11163 + + + + MaintenanceConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.4 + + i=11163 + + + + SystemConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.5 + + i=11163 + + + + SafetyConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.6 + + i=11163 + + + + HighlyManagedAlarmConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.7 + + i=11163 + + + + TrainingConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.8 + + i=11163 + + + + StatisticalConditionClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.9 + + i=11163 + + + + TestingConditionSubClassType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.9.10 + + i=11163 + + + + AuditConditionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.2 + + i=2127 + + + + AuditConditionEnableEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.3 + + i=2790 + + + + AuditConditionCommentEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.4 + + i=17222 + i=11851 + i=2790 + + + + ConditionEventId + + i=68 + i=78 + i=2829 + + + + Comment + + i=68 + i=78 + i=2829 + + + + AuditConditionRespondEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.5 + + i=11852 + i=2790 + + + + SelectedResponse + + i=68 + i=78 + i=8927 + + + + AuditConditionAcknowledgeEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.6 + + i=17223 + i=11853 + i=2790 + + + + ConditionEventId + + i=68 + i=78 + i=8944 + + + + Comment + + i=68 + i=78 + i=8944 + + + + AuditConditionConfirmEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.7 + + i=17224 + i=11854 + i=2790 + + + + ConditionEventId + + i=68 + i=78 + i=8961 + + + + Comment + + i=68 + i=78 + i=8961 + + + + AuditConditionShelvingEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.8 + + i=11855 + i=2790 + + + + ShelvingTime + + i=68 + i=80 + i=11093 + + + + AuditConditionSuppressionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.9 + + i=2790 + + + + AuditConditionSilenceEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.10 + + i=2790 + + + + AuditConditionResetEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.11 + + i=2790 + + + + AuditConditionOutOfServiceEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.10.12 + + i=2790 + + + + RefreshStartEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.11.2 + + i=2130 + + + + RefreshEndEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.11.3 + + i=2130 + + + + RefreshRequiredEventType + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.11.4 + + i=2130 + + + + HasCondition + https://reference.opcfoundation.org/v104/Core/docs/Part9/5.12 + + i=32 + + IsConditionOf + + + HasEffectDisable + https://reference.opcfoundation.org/v104/Core/docs/Part9/7.2 + + i=54 + + MayBeDisabledBy + + + HasEffectEnable + https://reference.opcfoundation.org/v104/Core/docs/Part9/7.3 + + i=54 + + MayBeEnabledBy + + + HasEffectSuppressed + https://reference.opcfoundation.org/v104/Core/docs/Part9/7.4 + + i=54 + + MayBeSuppressedBy + + + HasEffectUnsuppressed + https://reference.opcfoundation.org/v104/Core/docs/Part9/7.5 + + i=54 + + MayBeUnsuppressedBy + + + AlarmMetricsType + https://reference.opcfoundation.org/v104/Core/docs/Part9/8.2 + + i=17280 + i=17991 + i=17281 + i=17282 + i=17284 + i=17286 + i=17283 + i=17288 + i=18666 + i=58 + + + + AlarmCount + + i=63 + i=78 + i=17279 + + + + StartTime + + i=63 + i=78 + i=17279 + + + + MaximumActiveState + + i=63 + i=78 + i=17279 + + + + MaximumUnAck + + i=63 + i=78 + i=17279 + + + + CurrentAlarmRate + + i=17285 + i=17277 + i=78 + i=17279 + + + + Rate + + i=68 + i=78 + i=17284 + + + + MaximumAlarmRate + + i=17287 + i=17277 + i=78 + i=17279 + + + + Rate + + i=68 + i=78 + i=17286 + + + + MaximumReAlarmCount + + i=63 + i=78 + i=17279 + + + + AverageAlarmRate + + i=17289 + i=17277 + i=78 + i=17279 + + + + Rate + + i=68 + i=78 + i=17288 + + + + Reset + https://reference.opcfoundation.org/v104/Core/docs/Part9/8.4 + + i=2127 + i=78 + i=17279 + + + + AlarmRateVariableType + https://reference.opcfoundation.org/v104/Core/docs/Part9/8.3 + + i=17278 + i=63 + + + + Rate + + i=68 + i=78 + i=17277 + + + + ProgramStateMachineType + https://reference.opcfoundation.org/v104/Core/docs/Part10/5.2.1 + + i=3830 + i=3835 + i=2392 + i=2393 + i=2394 + i=2395 + i=2396 + i=2397 + i=2398 + i=2399 + i=3850 + i=2406 + i=2400 + i=2402 + i=2404 + i=2408 + i=2410 + i=2412 + i=2414 + i=2416 + i=2418 + i=2420 + i=2422 + i=2424 + i=2426 + i=2427 + i=2428 + i=2429 + i=2430 + i=2771 + + + + CurrentState + + i=3831 + i=3833 + i=2760 + i=78 + i=2391 + + + + Id + + i=68 + i=78 + i=3830 + + + + Number + + i=68 + i=78 + i=3830 + + + + LastTransition + + i=3836 + i=3838 + i=3839 + i=2767 + i=78 + i=2391 + + + + Id + + i=68 + i=78 + i=3835 + + + + Number + + i=68 + i=78 + i=3835 + + + + TransitionTime + + i=68 + i=78 + i=3835 + + + + Creatable + + i=68 + i=2391 + + + + Deletable + + i=68 + i=78 + i=2391 + + + + AutoDelete + + i=68 + i=78 + i=2391 + + + + RecycleCount + + i=68 + i=78 + i=2391 + + + + InstanceCount + + i=68 + i=2391 + + + + MaxInstanceCount + + i=68 + i=2391 + + + + MaxRecycleCount + + i=68 + i=2391 + + + + ProgramDiagnostic + + i=3840 + i=3841 + i=3842 + i=3843 + i=3844 + i=3845 + i=3846 + i=3847 + i=15038 + i=15040 + i=3848 + i=3849 + i=15383 + i=80 + i=2391 + + + + CreateSessionId + + i=63 + i=78 + i=2399 + + + + CreateClientName + + i=63 + i=78 + i=2399 + + + + InvocationCreationTime + + i=63 + i=78 + i=2399 + + + + LastTransitionTime + + i=68 + i=78 + i=2399 + + + + LastMethodCall + + i=63 + i=78 + i=2399 + + + + LastMethodSessionId + + i=63 + i=78 + i=2399 + + + + LastMethodInputArguments + + i=63 + i=78 + i=2399 + + + + LastMethodOutputArguments + + i=63 + i=78 + i=2399 + + + + LastMethodInputValues + + i=63 + i=78 + i=2399 + + + + LastMethodOutputValues + + i=63 + i=78 + i=2399 + + + + LastMethodCallTime + + i=63 + i=78 + i=2399 + + + + LastMethodReturnStatus + + i=63 + i=78 + i=2399 + + + + FinalResultData + + i=58 + i=80 + i=2391 + + + + Halted + + i=2407 + i=2408 + i=2412 + i=2420 + i=2424 + i=2307 + i=2391 + + + + StateNumber + + i=68 + i=78 + i=2406 + + + 11 + + + + Ready + + i=2401 + i=2408 + i=2410 + i=2414 + i=2422 + i=2424 + i=2307 + i=2391 + + + + StateNumber + + i=68 + i=78 + i=2400 + + + 12 + + + + Running + + i=2403 + i=2410 + i=2412 + i=2414 + i=2416 + i=2418 + i=2307 + i=2391 + + + + StateNumber + + i=68 + i=78 + i=2402 + + + 13 + + + + Suspended + + i=2405 + i=2416 + i=2418 + i=2420 + i=2422 + i=2307 + i=2391 + + + + StateNumber + + i=68 + i=78 + i=2404 + + + 14 + + + + HaltedToReady + + i=2409 + i=2406 + i=2400 + i=2430 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2408 + + + 1 + + + + ReadyToRunning + + i=2411 + i=2400 + i=2402 + i=2426 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2410 + + + 2 + + + + RunningToHalted + + i=2413 + i=2402 + i=2406 + i=2429 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2412 + + + 3 + + + + RunningToReady + + i=2415 + i=2402 + i=2400 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2414 + + + 4 + + + + RunningToSuspended + + i=2417 + i=2402 + i=2404 + i=2427 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2416 + + + 5 + + + + SuspendedToRunning + + i=2419 + i=2404 + i=2402 + i=2428 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2418 + + + 6 + + + + SuspendedToHalted + + i=2421 + i=2404 + i=2406 + i=2429 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2420 + + + 7 + + + + SuspendedToReady + + i=2423 + i=2404 + i=2400 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2422 + + + 8 + + + + ReadyToHalted + + i=2425 + i=2400 + i=2406 + i=2429 + i=2378 + i=2310 + i=2391 + + + + TransitionNumber + + i=68 + i=78 + i=2424 + + + 9 + + + + Start + + i=2410 + i=11508 + i=2391 + + + + Suspend + + i=2416 + i=11508 + i=2391 + + + + Resume + + i=2418 + i=11508 + i=2391 + + + + Halt + + i=2412 + i=2420 + i=2424 + i=11508 + i=2391 + + + + Reset + + i=2408 + i=11508 + i=2391 + + + + ProgramTransitionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part10/5.2.5/#5.2.5.2 + + i=2379 + i=2311 + + + + IntermediateResult + + i=63 + i=78 + i=2378 + + + + AuditProgramTransitionEventType + https://reference.opcfoundation.org/v104/Core/docs/Part10/5.2.6 + + i=11875 + i=2315 + + + + TransitionNumber + + i=68 + i=78 + i=11856 + + + + ProgramTransitionAuditEventType + + i=3825 + i=2315 + + + + Transition + + i=3826 + i=2767 + i=78 + i=3806 + + + + Id + + i=68 + i=78 + i=3825 + + + + ProgramDiagnosticType + + i=2381 + i=2382 + i=2383 + i=2384 + i=2385 + i=2386 + i=2387 + i=2388 + i=2389 + i=2390 + i=63 + + + + CreateSessionId + + i=68 + i=78 + i=2380 + + + + CreateClientName + + i=68 + i=78 + i=2380 + + + + InvocationCreationTime + + i=68 + i=78 + i=2380 + + + + LastTransitionTime + + i=68 + i=78 + i=2380 + + + + LastMethodCall + + i=68 + i=78 + i=2380 + + + + LastMethodSessionId + + i=68 + i=78 + i=2380 + + + + LastMethodInputArguments + + i=68 + i=78 + i=2380 + + + + LastMethodOutputArguments + + i=68 + i=78 + i=2380 + + + + LastMethodCallTime + + i=68 + i=78 + i=2380 + + + + LastMethodReturnStatus + + i=68 + i=78 + i=2380 + + + + ProgramDiagnostic2Type + https://reference.opcfoundation.org/v104/Core/docs/Part10/5.2.9 + + i=15384 + i=15385 + i=15386 + i=15387 + i=15388 + i=15389 + i=15390 + i=15391 + i=15392 + i=15393 + i=15394 + i=15395 + i=63 + + + + CreateSessionId + + i=63 + i=78 + i=15383 + + + + CreateClientName + + i=63 + i=78 + i=15383 + + + + InvocationCreationTime + + i=63 + i=78 + i=15383 + + + + LastTransitionTime + + i=68 + i=78 + i=15383 + + + + LastMethodCall + + i=63 + i=78 + i=15383 + + + + LastMethodSessionId + + i=63 + i=78 + i=15383 + + + + LastMethodInputArguments + + i=63 + i=78 + i=15383 + + + + LastMethodOutputArguments + + i=63 + i=78 + i=15383 + + + + LastMethodInputValues + + i=63 + i=78 + i=15383 + + + + LastMethodOutputValues + + i=63 + i=78 + i=15383 + + + + LastMethodCallTime + + i=63 + i=78 + i=15383 + + + + LastMethodReturnStatus + + i=63 + i=78 + i=15383 + + + + Annotations + + i=68 + + + + HistoricalDataConfigurationType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.2.2 + + i=3059 + i=11876 + i=2323 + i=2324 + i=2325 + i=2326 + i=2327 + i=2328 + i=11499 + i=11500 + i=19092 + i=58 + + + + AggregateConfiguration + + i=11168 + i=11169 + i=11170 + i=11171 + i=11187 + i=78 + i=2318 + + + + TreatUncertainAsBad + + i=68 + i=78 + i=3059 + + + + PercentDataBad + + i=68 + i=78 + i=3059 + + + + PercentDataGood + + i=68 + i=78 + i=3059 + + + + UseSlopedExtrapolation + + i=68 + i=78 + i=3059 + + + + AggregateFunctions + + i=61 + i=80 + i=2318 + + + + Stepped + + i=68 + i=78 + i=2318 + + + + Definition + + i=68 + i=80 + i=2318 + + + + MaxTimeInterval + + i=68 + i=80 + i=2318 + + + + MinTimeInterval + + i=68 + i=80 + i=2318 + + + + ExceptionDeviation + + i=68 + i=80 + i=2318 + + + + ExceptionDeviationFormat + + i=68 + i=80 + i=2318 + + + + StartOfArchive + + i=68 + i=80 + i=2318 + + + + StartOfOnlineArchive + + i=68 + i=80 + i=2318 + + + + ServerTimestampSupported + + i=68 + i=80 + i=2318 + + + + HA Configuration + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.2.4 + + i=11203 + i=11208 + i=2318 + + + + AggregateConfiguration + + i=11204 + i=11205 + i=11206 + i=11207 + i=11187 + i=11202 + + + + TreatUncertainAsBad + + i=68 + i=11203 + + + + PercentDataBad + + i=68 + i=11203 + + + + PercentDataGood + + i=68 + i=11203 + + + + UseSlopedExtrapolation + + i=68 + i=11203 + + + + Stepped + + i=68 + i=11202 + + + + HistoricalEventFilter + + i=68 + + + + HistoryServerCapabilitiesType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.4.2 + + i=2331 + i=2332 + i=11268 + i=11269 + i=2334 + i=2335 + i=2336 + i=2337 + i=2338 + i=11278 + i=11279 + i=11280 + i=11501 + i=11270 + i=11172 + i=19094 + i=58 + + + + AccessHistoryDataCapability + + i=68 + i=78 + i=2330 + + + + AccessHistoryEventsCapability + + i=68 + i=78 + i=2330 + + + + MaxReturnDataValues + + i=68 + i=78 + i=2330 + + + + MaxReturnEventValues + + i=68 + i=78 + i=2330 + + + + InsertDataCapability + + i=68 + i=78 + i=2330 + + + + ReplaceDataCapability + + i=68 + i=78 + i=2330 + + + + UpdateDataCapability + + i=68 + i=78 + i=2330 + + + + DeleteRawCapability + + i=68 + i=78 + i=2330 + + + + DeleteAtTimeCapability + + i=68 + i=78 + i=2330 + + + + InsertEventCapability + + i=68 + i=78 + i=2330 + + + + ReplaceEventCapability + + i=68 + i=78 + i=2330 + + + + UpdateEventCapability + + i=68 + i=78 + i=2330 + + + + DeleteEventCapability + + i=68 + i=78 + i=2330 + + + + InsertAnnotationCapability + + i=68 + i=78 + i=2330 + + + + AggregateFunctions + + i=61 + i=78 + i=2330 + + + + ServerTimestampSupported + + i=68 + i=78 + i=2330 + + + + AuditHistoryEventUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.2 + + i=3025 + i=3028 + i=3003 + i=3029 + i=3030 + i=2104 + + + + UpdatedNode + + i=68 + i=78 + i=2999 + + + + PerformInsertReplace + + i=68 + i=78 + i=2999 + + + + Filter + + i=68 + i=78 + i=2999 + + + + NewValues + + i=68 + i=78 + i=2999 + + + + OldValues + + i=68 + i=78 + i=2999 + + + + AuditHistoryValueUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.3 + + i=3026 + i=3031 + i=3032 + i=3033 + i=2104 + + + + UpdatedNode + + i=68 + i=78 + i=3006 + + + + PerformInsertReplace + + i=68 + i=78 + i=3006 + + + + NewValues + + i=68 + i=78 + i=3006 + + + + OldValues + + i=68 + i=78 + i=3006 + + + + AuditHistoryAnnotationUpdateEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.4 + + i=19293 + i=19294 + i=19295 + i=2104 + + + + PerformInsertReplace + + i=68 + i=78 + i=19095 + + + + NewValues + + i=68 + i=78 + i=19095 + + + + OldValues + + i=68 + i=78 + i=19095 + + + + AuditHistoryDeleteEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.5 + + i=3027 + i=2104 + + + + UpdatedNode + + i=68 + i=78 + i=3012 + + + + AuditHistoryRawModifyDeleteEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.6 + + i=3015 + i=3016 + i=3017 + i=3034 + i=3012 + + + + IsDeleteModified + + i=68 + i=78 + i=3014 + + + + StartTime + + i=68 + i=78 + i=3014 + + + + EndTime + + i=68 + i=78 + i=3014 + + + + OldValues + + i=68 + i=78 + i=3014 + + + + AuditHistoryAtTimeDeleteEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.7 + + i=3020 + i=3021 + i=3012 + + + + ReqTimes + + i=68 + i=78 + i=3019 + + + + OldValues + + i=68 + i=78 + i=3019 + + + + AuditHistoryEventDeleteEventType + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.6.8 + + i=3023 + i=3024 + i=3012 + + + + EventIds + + i=68 + i=78 + i=3022 + + + + OldValues + + i=68 + i=78 + i=3022 + + + + TrustListType + + i=12542 + i=19296 + i=12543 + i=12546 + i=12548 + i=12550 + i=11575 + + + + LastUpdateTime + + i=68 + i=78 + i=12522 + + + + UpdateFrequency + + i=68 + i=80 + i=12522 + + + + OpenWithMasks + + i=12544 + i=12545 + i=78 + i=12522 + + + + InputArguments + + i=68 + i=78 + i=12543 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=12543 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CloseAndUpdate + + i=12705 + i=12547 + i=80 + i=12522 + + + + InputArguments + + i=68 + i=78 + i=12546 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=12546 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + AddCertificate + + i=12549 + i=80 + i=12522 + + + + InputArguments + + i=68 + i=78 + i=12548 + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + RemoveCertificate + + i=12551 + i=80 + i=12522 + + + + InputArguments + + i=68 + i=78 + i=12550 + + + + + + i=297 + + + + Thumbprint + + i=12 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + TrustListMasks + + i=12553 + i=29 + + + + + + + + + + + + EnumValues + + i=68 + i=12552 + + + + + + i=7616 + + + + 0 + + None + + + + + + + i=7616 + + + + 1 + + TrustedCertificates + + + + + + + i=7616 + + + + 2 + + TrustedCrls + + + + + + + i=7616 + + + + 4 + + IssuerCertificates + + + + + + + i=7616 + + + + 8 + + IssuerCrls + + + + + + + i=7616 + + + + 15 + + All + + + + + + + + + TrustListDataType + + i=22 + + + + + + + + + + + TrustListOutOfDateAlarmType + + i=19446 + i=19447 + i=19448 + i=11753 + + + + TrustListId + + i=68 + i=78 + i=19297 + + + + LastUpdateTime + + i=68 + i=78 + i=19297 + + + + UpdateFrequency + + i=68 + i=78 + i=19297 + + + + CertificateGroupType + + i=13599 + i=13631 + i=19450 + i=20143 + i=23526 + i=58 + + + + TrustList + + i=13600 + i=13601 + i=13602 + i=13603 + i=13605 + i=13608 + i=13610 + i=13613 + i=13615 + i=13618 + i=13620 + i=13621 + i=12522 + i=78 + i=12555 + + + + Size + + i=68 + i=78 + i=13599 + + + + Writable + + i=68 + i=78 + i=13599 + + + + UserWritable + + i=68 + i=78 + i=13599 + + + + OpenCount + + i=68 + i=78 + i=13599 + + + + Open + + i=13606 + i=13607 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13605 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13605 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13609 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13608 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13611 + i=13612 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13610 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13610 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13614 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13613 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13616 + i=13617 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13615 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13615 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13619 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13618 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13599 + + + + OpenWithMasks + + i=13622 + i=13623 + i=78 + i=13599 + + + + InputArguments + + i=68 + i=78 + i=13621 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13621 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=12555 + + + + CertificateExpired + + i=19451 + i=19452 + i=19453 + i=19454 + i=19455 + i=19456 + i=19458 + i=19459 + i=19460 + i=19461 + i=19464 + i=19465 + i=19466 + i=19467 + i=19476 + i=19478 + i=19480 + i=19482 + i=19483 + i=19484 + i=19485 + i=19487 + i=19505 + i=19509 + i=19518 + i=20101 + i=20138 + i=20139 + i=20141 + i=20142 + i=13225 + i=80 + i=12555 + + + + EventId + + i=68 + i=78 + i=19450 + + + + EventType + + i=68 + i=78 + i=19450 + + + + SourceNode + + i=68 + i=78 + i=19450 + + + + SourceName + + i=68 + i=78 + i=19450 + + + + Time + + i=68 + i=78 + i=19450 + + + + ReceiveTime + + i=68 + i=78 + i=19450 + + + + Message + + i=68 + i=78 + i=19450 + + + + Severity + + i=68 + i=78 + i=19450 + + + + ConditionClassId + + i=68 + i=78 + i=19450 + + + + ConditionClassName + + i=68 + i=78 + i=19450 + + + + ConditionName + + i=68 + i=78 + i=19450 + + + + BranchId + + i=68 + i=78 + i=19450 + + + + Retain + + i=68 + i=78 + i=19450 + + + + EnabledState + + i=19468 + i=8995 + i=78 + i=19450 + + + + Id + + i=68 + i=78 + i=19467 + + + + Quality + + i=19477 + i=9002 + i=78 + i=19450 + + + + SourceTimestamp + + i=68 + i=78 + i=19476 + + + + LastSeverity + + i=19479 + i=9002 + i=78 + i=19450 + + + + SourceTimestamp + + i=68 + i=78 + i=19478 + + + + Comment + + i=19481 + i=9002 + i=78 + i=19450 + + + + SourceTimestamp + + i=68 + i=78 + i=19480 + + + + ClientUserId + + i=68 + i=78 + i=19450 + + + + Disable + + i=2803 + i=78 + i=19450 + + + + Enable + + i=2803 + i=78 + i=19450 + + + + AddComment + + i=19486 + i=2829 + i=78 + i=19450 + + + + InputArguments + + i=68 + i=78 + i=19485 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + AckedState + + i=19488 + i=8995 + i=78 + i=19450 + + + + Id + + i=68 + i=78 + i=19487 + + + + Acknowledge + + i=19506 + i=8944 + i=78 + i=19450 + + + + InputArguments + + i=68 + i=78 + i=19505 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + ActiveState + + i=19510 + i=8995 + i=78 + i=19450 + + + + Id + + i=68 + i=78 + i=19509 + + + + InputNode + + i=68 + i=78 + i=19450 + + + + SuppressedOrShelved + + i=68 + i=78 + i=19450 + + + + NormalState + + i=68 + i=78 + i=19450 + + + + ExpirationDate + + i=68 + i=78 + i=19450 + + + + CertificateType + + i=68 + i=78 + i=19450 + + + + Certificate + + i=68 + i=78 + i=19450 + + + + TrustListOutOfDate + + i=20144 + i=20145 + i=20146 + i=20147 + i=20148 + i=20149 + i=20151 + i=20152 + i=20153 + i=20154 + i=20157 + i=20158 + i=20159 + i=20160 + i=20169 + i=20171 + i=20173 + i=20175 + i=20176 + i=20177 + i=20178 + i=20180 + i=20198 + i=20202 + i=20211 + i=20249 + i=20286 + i=20287 + i=20288 + i=20289 + i=19297 + i=80 + i=12555 + + + + EventId + + i=68 + i=78 + i=20143 + + + + EventType + + i=68 + i=78 + i=20143 + + + + SourceNode + + i=68 + i=78 + i=20143 + + + + SourceName + + i=68 + i=78 + i=20143 + + + + Time + + i=68 + i=78 + i=20143 + + + + ReceiveTime + + i=68 + i=78 + i=20143 + + + + Message + + i=68 + i=78 + i=20143 + + + + Severity + + i=68 + i=78 + i=20143 + + + + ConditionClassId + + i=68 + i=78 + i=20143 + + + + ConditionClassName + + i=68 + i=78 + i=20143 + + + + ConditionName + + i=68 + i=78 + i=20143 + + + + BranchId + + i=68 + i=78 + i=20143 + + + + Retain + + i=68 + i=78 + i=20143 + + + + EnabledState + + i=20161 + i=8995 + i=78 + i=20143 + + + + Id + + i=68 + i=78 + i=20160 + + + + Quality + + i=20170 + i=9002 + i=78 + i=20143 + + + + SourceTimestamp + + i=68 + i=78 + i=20169 + + + + LastSeverity + + i=20172 + i=9002 + i=78 + i=20143 + + + + SourceTimestamp + + i=68 + i=78 + i=20171 + + + + Comment + + i=20174 + i=9002 + i=78 + i=20143 + + + + SourceTimestamp + + i=68 + i=78 + i=20173 + + + + ClientUserId + + i=68 + i=78 + i=20143 + + + + Disable + + i=2803 + i=78 + i=20143 + + + + Enable + + i=2803 + i=78 + i=20143 + + + + AddComment + + i=20179 + i=2829 + i=78 + i=20143 + + + + InputArguments + + i=68 + i=78 + i=20178 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + AckedState + + i=20181 + i=8995 + i=78 + i=20143 + + + + Id + + i=68 + i=78 + i=20180 + + + + Acknowledge + + i=20199 + i=8944 + i=78 + i=20143 + + + + InputArguments + + i=68 + i=78 + i=20198 + + + + + + i=297 + + + + EventId + + i=15 + + -1 + + + The identifier for the event to comment. + + + + + + + i=297 + + + + Comment + + i=21 + + -1 + + + The comment to add to the condition. + + + + + + + + + ActiveState + + i=20203 + i=8995 + i=78 + i=20143 + + + + Id + + i=68 + i=78 + i=20202 + + + + InputNode + + i=68 + i=78 + i=20143 + + + + SuppressedOrShelved + + i=68 + i=78 + i=20143 + + + + NormalState + + i=68 + i=78 + i=20143 + + + + TrustListId + + i=68 + i=78 + i=20143 + + + + LastUpdateTime + + i=68 + i=78 + i=20143 + + + + UpdateFrequency + + i=68 + i=78 + i=20143 + + + + GetRejectedList + + i=23527 + i=80 + i=12555 + + + + OutputArguments + + i=68 + i=78 + i=23526 + + + + + + i=297 + + + + Certificates + + i=15 + + 1 + + 0 + + + + + + + + + CertificateGroupFolderType + + i=13814 + i=13848 + i=13882 + i=13916 + i=61 + + + + DefaultApplicationGroup + + i=13815 + i=13847 + i=12555 + i=78 + i=13813 + + + + TrustList + + i=13816 + i=13817 + i=13818 + i=13819 + i=13821 + i=13824 + i=13826 + i=13829 + i=13831 + i=13834 + i=13836 + i=13837 + i=12522 + i=78 + i=13814 + + + + Size + + i=68 + i=78 + i=13815 + + + + Writable + + i=68 + i=78 + i=13815 + + + + UserWritable + + i=68 + i=78 + i=13815 + + + + OpenCount + + i=68 + i=78 + i=13815 + + + + Open + + i=13822 + i=13823 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13821 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13821 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13825 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13824 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13827 + i=13828 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13826 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13826 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13830 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13829 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13832 + i=13833 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13831 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13831 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13835 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13834 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13815 + + + + OpenWithMasks + + i=13838 + i=13839 + i=78 + i=13815 + + + + InputArguments + + i=68 + i=78 + i=13837 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13837 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=13814 + + + + DefaultHttpsGroup + + i=13849 + i=13881 + i=12555 + i=80 + i=13813 + + + + TrustList + + i=13850 + i=13851 + i=13852 + i=13853 + i=13855 + i=13858 + i=13860 + i=13863 + i=13865 + i=13868 + i=13870 + i=13871 + i=12522 + i=78 + i=13848 + + + + Size + + i=68 + i=78 + i=13849 + + + + Writable + + i=68 + i=78 + i=13849 + + + + UserWritable + + i=68 + i=78 + i=13849 + + + + OpenCount + + i=68 + i=78 + i=13849 + + + + Open + + i=13856 + i=13857 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13855 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13855 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13859 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13858 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13861 + i=13862 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13860 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13860 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13864 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13863 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13866 + i=13867 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13865 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13865 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13869 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13868 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13849 + + + + OpenWithMasks + + i=13872 + i=13873 + i=78 + i=13849 + + + + InputArguments + + i=68 + i=78 + i=13871 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13871 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=13848 + + + + DefaultUserTokenGroup + + i=13883 + i=13915 + i=12555 + i=80 + i=13813 + + + + TrustList + + i=13884 + i=13885 + i=13886 + i=13887 + i=13889 + i=13892 + i=13894 + i=13897 + i=13899 + i=13902 + i=13904 + i=13905 + i=12522 + i=78 + i=13882 + + + + Size + + i=68 + i=78 + i=13883 + + + + Writable + + i=68 + i=78 + i=13883 + + + + UserWritable + + i=68 + i=78 + i=13883 + + + + OpenCount + + i=68 + i=78 + i=13883 + + + + Open + + i=13890 + i=13891 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13889 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13889 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13893 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13892 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13895 + i=13896 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13894 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13894 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13898 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13897 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13900 + i=13901 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13899 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13899 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13903 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13902 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13883 + + + + OpenWithMasks + + i=13906 + i=13907 + i=78 + i=13883 + + + + InputArguments + + i=68 + i=78 + i=13905 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13905 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=13882 + + + + <AdditionalGroup> + + i=13917 + i=13949 + i=12555 + i=11508 + i=13813 + + + + TrustList + + i=13918 + i=13919 + i=13920 + i=13921 + i=13923 + i=13926 + i=13928 + i=13931 + i=13933 + i=13936 + i=13938 + i=13939 + i=12522 + i=78 + i=13916 + + + + Size + + i=68 + i=78 + i=13917 + + + + Writable + + i=68 + i=78 + i=13917 + + + + UserWritable + + i=68 + i=78 + i=13917 + + + + OpenCount + + i=68 + i=78 + i=13917 + + + + Open + + i=13924 + i=13925 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13923 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13923 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13927 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13926 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13929 + i=13930 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13928 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13928 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13932 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13931 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13934 + i=13935 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13933 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13933 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13937 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13936 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13917 + + + + OpenWithMasks + + i=13940 + i=13941 + i=78 + i=13917 + + + + InputArguments + + i=68 + i=78 + i=13939 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13939 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=13916 + + + + CertificateType + + i=58 + + + + ApplicationCertificateType + + i=12556 + + + + HttpsCertificateType + + i=12556 + + + + UserCredentialCertificateType + + i=12556 + + + + RsaMinApplicationCertificateType + + i=12557 + + + + RsaSha256ApplicationCertificateType + + i=12557 + + + + EccApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=12557 + + + + EccNistP256ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + EccNistP384ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + EccBrainpoolP256r1ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + EccBrainpoolP384r1ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + EccCurve25519ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + EccCurve448ApplicationCertificateType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=23537 + + + + TrustListUpdatedAuditEventType + + i=2127 + + + + ServerConfigurationType + + i=13950 + i=12708 + i=12583 + i=12584 + i=12585 + i=12616 + i=12734 + i=12731 + i=12775 + i=58 + + + + CertificateGroups + + i=13951 + i=13813 + i=78 + i=12581 + + + + DefaultApplicationGroup + + i=13952 + i=13984 + i=12555 + i=78 + i=13950 + + + + TrustList + + i=13953 + i=13954 + i=13955 + i=13956 + i=13958 + i=13961 + i=13963 + i=13966 + i=13968 + i=13971 + i=13973 + i=13974 + i=12522 + i=78 + i=13951 + + + + Size + + i=68 + i=78 + i=13952 + + + + Writable + + i=68 + i=78 + i=13952 + + + + UserWritable + + i=68 + i=78 + i=13952 + + + + OpenCount + + i=68 + i=78 + i=13952 + + + + Open + + i=13959 + i=13960 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13958 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13958 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=13962 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13961 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=13964 + i=13965 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13963 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13963 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=13967 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13966 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=13969 + i=13970 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13968 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13968 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=13972 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13971 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=78 + i=13952 + + + + OpenWithMasks + + i=13975 + i=13976 + i=78 + i=13952 + + + + InputArguments + + i=68 + i=78 + i=13974 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=13974 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=78 + i=13951 + + + + ServerCapabilities + + i=68 + i=78 + i=12581 + + + + SupportedPrivateKeyFormats + + i=68 + i=78 + i=12581 + + + + MaxTrustListSize + + i=68 + i=78 + i=12581 + + + + MulticastDnsEnabled + + i=68 + i=78 + i=12581 + + + + UpdateCertificate + + i=12617 + i=12618 + i=78 + i=12581 + + + + InputArguments + + i=68 + i=78 + i=12616 + + + + + + i=297 + + + + CertificateGroupId + + i=17 + + -1 + + + + + + + i=297 + + + + CertificateTypeId + + i=17 + + -1 + + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IssuerCertificates + + i=15 + + 1 + + 0 + + + + + + + i=297 + + + + PrivateKeyFormat + + i=12 + + -1 + + + + + + + i=297 + + + + PrivateKey + + i=15 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=12616 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + ApplyChanges + + i=78 + i=12581 + + + + CreateSigningRequest + + i=12732 + i=12733 + i=78 + i=12581 + + + + InputArguments + + i=68 + i=78 + i=12731 + + + + + + i=297 + + + + CertificateGroupId + + i=17 + + -1 + + + + + + + i=297 + + + + CertificateTypeId + + i=17 + + -1 + + + + + + + i=297 + + + + SubjectName + + i=12 + + -1 + + + + + + + i=297 + + + + RegeneratePrivateKey + + i=1 + + -1 + + + + + + + i=297 + + + + Nonce + + i=15 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=12731 + + + + + + i=297 + + + + CertificateRequest + + i=15 + + -1 + + + + + + + + + GetRejectedList + + i=12776 + i=78 + i=12581 + + + + OutputArguments + + i=68 + i=78 + i=12775 + + + + + + i=297 + + + + Certificates + + i=15 + + 1 + + 0 + + + + + + + + + CertificateUpdatedAuditEventType + + i=13735 + i=13736 + i=2127 + + + + CertificateGroup + + i=68 + i=78 + i=12620 + + + + CertificateType + + i=68 + i=78 + i=12620 + + + + ServerConfiguration + + i=14053 + i=12710 + i=12639 + i=12640 + i=12641 + i=13737 + i=12740 + i=12737 + i=12777 + i=2253 + i=12581 + + + + CertificateGroups + + i=14156 + i=14088 + i=14122 + i=13813 + i=12637 + + + + DefaultApplicationGroup + + i=12642 + i=14161 + i=12555 + i=14053 + + + + TrustList + + i=12643 + i=14157 + i=14158 + i=12646 + i=12647 + i=12650 + i=12652 + i=12655 + i=12657 + i=12660 + i=12662 + i=12663 + i=12666 + i=12668 + i=12670 + i=12522 + i=14156 + + + + Size + + i=68 + i=12642 + + + + Writable + + i=68 + i=12642 + + + + UserWritable + + i=68 + i=12642 + + + + OpenCount + + i=68 + i=12642 + + + + Open + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.1 + + i=12648 + i=12649 + i=12642 + + + + InputArguments + + i=68 + i=12647 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12647 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.2 + + i=12651 + i=12642 + + + + InputArguments + + i=68 + i=12650 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.3 + + i=12653 + i=12654 + i=12642 + + + + InputArguments + + i=68 + i=12652 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12652 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.4 + + i=12656 + i=12642 + + + + InputArguments + + i=68 + i=12655 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.5 + + i=12658 + i=12659 + i=12642 + + + + InputArguments + + i=68 + i=12657 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12657 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + https://reference.opcfoundation.org/v104/Core/docs/Part5/C.2.6 + + i=12661 + i=12642 + + + + InputArguments + + i=68 + i=12660 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=12642 + + + + OpenWithMasks + + i=12664 + i=12665 + i=12642 + + + + InputArguments + + i=68 + i=12663 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12663 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CloseAndUpdate + + i=14160 + i=12667 + i=12642 + + + + InputArguments + + i=68 + i=12666 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12666 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + AddCertificate + + i=12669 + i=12642 + + + + InputArguments + + i=68 + i=12668 + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + RemoveCertificate + + i=12671 + i=12642 + + + + InputArguments + + i=68 + i=12670 + + + + + + i=297 + + + + Thumbprint + + i=12 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=14156 + + + + DefaultHttpsGroup + + i=14089 + i=14121 + i=12555 + i=14053 + + + + TrustList + + i=14090 + i=14091 + i=14092 + i=14093 + i=14095 + i=14098 + i=14100 + i=14103 + i=14105 + i=14108 + i=14110 + i=14111 + i=14114 + i=14117 + i=14119 + i=12522 + i=14088 + + + + Size + + i=68 + i=14089 + + + + Writable + + i=68 + i=14089 + + + + UserWritable + + i=68 + i=14089 + + + + OpenCount + + i=68 + i=14089 + + + + Open + + i=14096 + i=14097 + i=14089 + + + + InputArguments + + i=68 + i=14095 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14095 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=14099 + i=14089 + + + + InputArguments + + i=68 + i=14098 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=14101 + i=14102 + i=14089 + + + + InputArguments + + i=68 + i=14100 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14100 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=14104 + i=14089 + + + + InputArguments + + i=68 + i=14103 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=14106 + i=14107 + i=14089 + + + + InputArguments + + i=68 + i=14105 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14105 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=14109 + i=14089 + + + + InputArguments + + i=68 + i=14108 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=14089 + + + + OpenWithMasks + + i=14112 + i=14113 + i=14089 + + + + InputArguments + + i=68 + i=14111 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14111 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CloseAndUpdate + + i=14115 + i=14116 + i=14089 + + + + InputArguments + + i=68 + i=14114 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14114 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + AddCertificate + + i=14118 + i=14089 + + + + InputArguments + + i=68 + i=14117 + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + RemoveCertificate + + i=14120 + i=14089 + + + + InputArguments + + i=68 + i=14119 + + + + + + i=297 + + + + Thumbprint + + i=12 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=14088 + + + + DefaultUserTokenGroup + + i=14123 + i=14155 + i=12555 + i=14053 + + + + TrustList + + i=14124 + i=14125 + i=14126 + i=14127 + i=14129 + i=14132 + i=14134 + i=14137 + i=14139 + i=14142 + i=14144 + i=14145 + i=14148 + i=14151 + i=14153 + i=12522 + i=14122 + + + + Size + + i=68 + i=14123 + + + + Writable + + i=68 + i=14123 + + + + UserWritable + + i=68 + i=14123 + + + + OpenCount + + i=68 + i=14123 + + + + Open + + i=14130 + i=14131 + i=14123 + + + + InputArguments + + i=68 + i=14129 + + + + + + i=297 + + + + Mode + + i=3 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14129 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Close + + i=14133 + i=14123 + + + + InputArguments + + i=68 + i=14132 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + Read + + i=14135 + i=14136 + i=14123 + + + + InputArguments + + i=68 + i=14134 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Length + + i=6 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14134 + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + Write + + i=14138 + i=14123 + + + + InputArguments + + i=68 + i=14137 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Data + + i=15 + + -1 + + + + + + + + + GetPosition + + i=14140 + i=14141 + i=14123 + + + + InputArguments + + i=68 + i=14139 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14139 + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + SetPosition + + i=14143 + i=14123 + + + + InputArguments + + i=68 + i=14142 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + i=297 + + + + Position + + i=9 + + -1 + + + + + + + + + LastUpdateTime + + i=68 + i=14123 + + + + OpenWithMasks + + i=14146 + i=14147 + i=14123 + + + + InputArguments + + i=68 + i=14145 + + + + + + i=297 + + + + Masks + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14145 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + CloseAndUpdate + + i=14149 + i=14150 + i=14123 + + + + InputArguments + + i=68 + i=14148 + + + + + + i=297 + + + + FileHandle + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=14148 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + AddCertificate + + i=14152 + i=14123 + + + + InputArguments + + i=68 + i=14151 + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + RemoveCertificate + + i=14154 + i=14123 + + + + InputArguments + + i=68 + i=14153 + + + + + + i=297 + + + + Thumbprint + + i=12 + + -1 + + + + + + + i=297 + + + + IsTrustedCertificate + + i=1 + + -1 + + + + + + + + + CertificateTypes + + i=68 + i=14122 + + + + ServerCapabilities + + i=68 + i=12637 + + + + SupportedPrivateKeyFormats + + i=68 + i=12637 + + + + MaxTrustListSize + + i=68 + i=12637 + + + + MulticastDnsEnabled + + i=68 + i=12637 + + + + UpdateCertificate + + i=13738 + i=13739 + i=12637 + + + + InputArguments + + i=68 + i=13737 + + + + + + i=297 + + + + CertificateGroupId + + i=17 + + -1 + + + + + + + i=297 + + + + CertificateTypeId + + i=17 + + -1 + + + + + + + i=297 + + + + Certificate + + i=15 + + -1 + + + + + + + i=297 + + + + IssuerCertificates + + i=15 + + 1 + + 0 + + + + + + + i=297 + + + + PrivateKeyFormat + + i=12 + + -1 + + + + + + + i=297 + + + + PrivateKey + + i=15 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=13737 + + + + + + i=297 + + + + ApplyChangesRequired + + i=1 + + -1 + + + + + + + + + ApplyChanges + + i=12637 + + + + CreateSigningRequest + + i=12738 + i=12739 + i=12637 + + + + InputArguments + + i=68 + i=12737 + + + + + + i=297 + + + + CertificateGroupId + + i=17 + + -1 + + + + + + + i=297 + + + + CertificateTypeId + + i=17 + + -1 + + + + + + + i=297 + + + + SubjectName + + i=12 + + -1 + + + + + + + i=297 + + + + RegeneratePrivateKey + + i=1 + + -1 + + + + + + + i=297 + + + + Nonce + + i=15 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=12737 + + + + + + i=297 + + + + CertificateRequest + + i=15 + + -1 + + + + + + + + + GetRejectedList + + i=12778 + i=12637 + + + + OutputArguments + + i=68 + i=12777 + + + + + + i=297 + + + + Certificates + + i=15 + + 1 + + 0 + + + + + + + + + KeyCredentialConfigurationFolderType + + i=17511 + i=17522 + i=61 + + + + <ServiceName> + + i=17512 + i=17513 + i=18001 + i=11508 + i=17496 + + + + ResourceUri + + i=68 + i=78 + i=17511 + + + + ProfileUri + + i=68 + i=78 + i=17511 + + + + CreateCredential + + i=17523 + i=17524 + i=80 + i=17496 + + + + InputArguments + + i=68 + i=78 + i=17522 + + + + + + i=297 + + + + ResourceUri + + i=12 + + -1 + + + + + + + i=297 + + + + ProfileUri + + i=12 + + -1 + + + + + + + i=297 + + + + EndpointUrls + + i=12 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17522 + + + + + + i=297 + + + + CredentialNodeId + + i=17 + + -1 + + + + + + + + + KeyCredentialConfiguration + + i=12637 + i=17496 + + + + KeyCredentialConfigurationType + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.7 + + i=18069 + i=18165 + i=18004 + i=18005 + i=17534 + i=18006 + i=18008 + i=58 + + + + ResourceUri + + i=68 + i=78 + i=18001 + + + + ProfileUri + + i=68 + i=78 + i=18001 + + + + EndpointUrls + + i=68 + i=80 + i=18001 + + + + ServiceStatus + + i=68 + i=80 + i=18001 + + + + GetEncryptingKey + https://reference.opcfoundation.org/v104/Core/docs/Amendment4/8.5.8 + + i=17535 + i=17536 + i=80 + i=18001 + + + + InputArguments + + i=68 + i=78 + i=17534 + + + + + + i=297 + + + + CredentialId + + i=12 + + -1 + + + + + + + i=297 + + + + RequestedSecurityPolicyUri + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17534 + + + + + + i=297 + + + + PublicKey + + i=15 + + -1 + + + + + + + i=297 + + + + RevisedSecurityPolicyUri + + i=17 + + -1 + + + + + + + + + UpdateCredential + https://reference.opcfoundation.org/v104/Core/docs/Amendment4//#6.7.2.5 + + i=18007 + i=80 + i=18001 + + + + InputArguments + + i=68 + i=78 + i=18006 + + + + + + i=297 + + + + CredentialId + + i=12 + + -1 + + + + + + + i=297 + + + + CredentialSecret + + i=15 + + -1 + + + + + + + i=297 + + + + CertificateThumbprint + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + + + DeleteCredential + + i=80 + i=18001 + + + + KeyCredentialAuditEventType + + i=18028 + i=2127 + + + + ResourceUri + + i=68 + i=78 + i=18011 + + + + KeyCredentialUpdatedAuditEventType + + i=18011 + + + + KeyCredentialDeletedAuditEventType + + i=18011 + + + + AuthorizationServicesConfigurationFolderType + + i=23557 + i=61 + + + + <ServiceName> + + i=23558 + i=23559 + i=23560 + i=17852 + i=11508 + i=23556 + + + + ServiceUri + + i=68 + i=78 + i=23557 + + + + ServiceCertificate + + i=68 + i=78 + i=23557 + + + + IssuerEndpointUrl + + i=68 + i=78 + i=23557 + + + + AuthorizationServices + + i=12637 + i=61 + + + + AuthorizationServiceConfigurationType + + i=18072 + i=17860 + i=18073 + i=58 + + + + ServiceUri + + i=68 + i=78 + i=17852 + + + + ServiceCertificate + + i=68 + i=78 + i=17852 + + + + IssuerEndpointUrl + + i=68 + i=78 + i=17852 + + + + AggregateConfigurationType + + i=11188 + i=11189 + i=11190 + i=11191 + i=58 + + + + TreatUncertainAsBad + + i=68 + i=78 + i=11187 + + + + PercentDataBad + + i=68 + i=78 + i=11187 + + + + PercentDataGood + + i=68 + i=78 + i=11187 + + + + UseSlopedExtrapolation + + i=68 + i=78 + i=11187 + + + + Interpolative + + i=2340 + + + + Average + + i=2340 + + + + TimeAverage + + i=2340 + + + + TimeAverage2 + + i=2340 + + + + Total + + i=2340 + + + + Total2 + + i=2340 + + + + Minimum + + i=2340 + + + + Maximum + + i=2340 + + + + MinimumActualTime + + i=2340 + + + + MaximumActualTime + + i=2340 + + + + Range + + i=2340 + + + + Minimum2 + + i=2340 + + + + Maximum2 + + i=2340 + + + + MinimumActualTime2 + + i=2340 + + + + MaximumActualTime2 + + i=2340 + + + + Range2 + + i=2340 + + + + AnnotationCount + + i=2340 + + + + Count + + i=2340 + + + + DurationInStateZero + + i=2340 + + + + DurationInStateNonZero + + i=2340 + + + + NumberOfTransitions + + i=2340 + + + + Start + + i=2340 + + + + End + + i=2340 + + + + Delta + + i=2340 + + + + StartBound + + i=2340 + + + + EndBound + + i=2340 + + + + DeltaBounds + + i=2340 + + + + DurationGood + + i=2340 + + + + DurationBad + + i=2340 + + + + PercentGood + + i=2340 + + + + PercentBad + + i=2340 + + + + WorstQuality + + i=2340 + + + + WorstQuality2 + + i=2340 + + + + StandardDeviationSample + + i=2340 + + + + StandardDeviationPopulation + + i=2340 + + + + VarianceSample + + i=2340 + + + + VariancePopulation + + i=2340 + + + + DecimalDataType + + i=22 + + + + + + + + DataTypeSchemaHeader + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.1.1 + + i=22 + + + + + + + + + + DataTypeDescription + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.1.2 + + i=22 + + + + + + + + StructureDescription + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.1.3 + + i=14525 + + + + + + + EnumDescription + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.1.4 + + i=14525 + + + + + + + + SimpleTypeDescription + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.1.5 + + i=14525 + + + + + + + + UABinaryFileDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.2 + + i=15534 + + + + + + + + + PubSubState + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.1 + + i=14648 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=14647 + + + + + Disabled + + + Paused + + + Operational + + + Error + + + PreOperational + + + + + + DataSetMetaDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.1.2 + + i=15534 + + + + + + + + + + + FieldMetaData + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.1.3 + + i=22 + + + + + + + + + + + + + + + + DataSetFieldFlags + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.1.4 + + i=15577 + i=5 + + + + + + + OptionSetValues + + i=68 + i=15904 + + + + + PromotedField + + + + + + ConfigurationVersionDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.1.5 + + i=22 + + + + + + + + PublishedDataSetDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.4 + + i=22 + + + + + + + + + + + PublishedDataSetSourceDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.5 + + i=22 + + + + + PublishedVariableDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.6.1 + + i=22 + + + + + + + + + + + + + + PublishedDataItemsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.6.2 + + i=15580 + + + + + + + PublishedEventsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.2/#6.2.2.7.4 + + i=15580 + + + + + + + + + DataSetFieldContentMask + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.3/#6.2.3.2 + + i=15584 + i=7 + + + + + + + + + + + + OptionSetValues + + i=68 + i=15583 + + + + + StatusCode + + + SourceTimestamp + + + ServerTimestamp + + + SourcePicoSeconds + + + ServerPicoSeconds + + + RawData + + + + + + DataSetWriterDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.3/#6.2.3.5.1 + + i=22 + + + + + + + + + + + + + + + DataSetWriterTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.3/#6.2.3.5.2 + + i=22 + + + + + DataSetWriterMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.3/#6.2.3.5.3 + + i=22 + + + + + PubSubGroupDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.4/#6.2.4.7 + + i=22 + + + + + + + + + + + + + WriterGroupDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.5/#6.2.5.6.1 + + i=15609 + + + + + + + + + + + + + + + WriterGroupTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.5/#6.2.5.6.2 + + i=22 + + + + + WriterGroupMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.5/#6.2.5.6.3 + + i=22 + + + + + PubSubConnectionDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.6/#6.2.6.5.1 + + i=22 + + + + + + + + + + + + + + + ConnectionTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.6/#6.2.6.5.2 + + i=22 + + + + + NetworkAddressDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.6/#6.2.6.5.3 + + i=22 + + + + + + + NetworkAddressUrlDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.6/#6.2.6.5.4 + + i=15502 + + + + + + + ReaderGroupDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.7/#6.2.7.2.1 + + i=15609 + + + + + + + + + ReaderGroupTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.7/#6.2.7.2.2 + + i=22 + + + + + ReaderGroupMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.7/#6.2.7.2.3 + + i=22 + + + + + DataSetReaderDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.8/#6.2.8.11.1 + + i=22 + + + + + + + + + + + + + + + + + + + + + + + DataSetReaderTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.8/#6.2.8.11.2 + + i=22 + + + + + DataSetReaderMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.8/#6.2.8.11.3 + + i=22 + + + + + SubscribedDataSetDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.9/#6.2.9.1 + + i=22 + + + + + TargetVariablesDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.9/#6.2.9.2.2 + + i=15630 + + + + + + + FieldTargetDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.9/#6.2.9.2.3 + + i=22 + + + + + + + + + + + + + OverrideValueHandling + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.9/#6.2.9.2.4 + + i=15875 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=15874 + + + + + Disabled + + + LastUsableValue + + + OverrideValue + + + + + + SubscribedDataSetMirrorDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.9/#6.2.9.3.3 + + i=15630 + + + + + + + + PubSubConfigurationDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.2.11 + + i=22 + + + + + + + + + DataSetOrderingType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.1.3 + + i=15641 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=20408 + + + + + Undefined + + + AscendingWriterId + + + AscendingWriterIdSingle + + + + + + UadpNetworkMessageContentMask + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.1.4 + + i=15643 + i=7 + + + + + + + + + + + + + + + + + OptionSetValues + + i=68 + i=15642 + + + + + PublisherId + + + GroupHeader + + + WriterGroupId + + + GroupVersion + + + NetworkMessageNumber + + + SequenceNumber + + + PayloadHeader + + + Timestamp + + + PicoSeconds + + + DataSetClassId + + + PromotedFields + + + + + + UadpWriterGroupMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.1.7 + + i=15616 + + + + + + + + + + + UadpDataSetMessageContentMask + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.2.2 + + i=15647 + i=7 + + + + + + + + + + + + OptionSetValues + + i=68 + i=15646 + + + + + Timestamp + + + PicoSeconds + + + Status + + + MajorVersion + + + MinorVersion + + + SequenceNumber + + + + + + UadpDataSetWriterMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.2.6 + + i=15605 + + + + + + + + + + UadpDataSetReaderMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.1/#6.3.1.3.10 + + i=15629 + + + + + + + + + + + + + + + JsonNetworkMessageContentMask + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.2/#6.3.2.1.1 + + i=15655 + i=7 + + + + + + + + + + + + OptionSetValues + + i=68 + i=15654 + + + + + NetworkMessageHeader + + + DataSetMessageHeader + + + SingleDataSetMessage + + + PublisherId + + + DataSetClassId + + + ReplyTo + + + + + + JsonWriterGroupMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.2/#6.3.2.1.2 + + i=15616 + + + + + + + JsonDataSetMessageContentMask + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.2/#6.3.2.2.1 + + i=15659 + i=7 + + + + + + + + + + + + OptionSetValues + + i=68 + i=15658 + + + + + DataSetWriterId + + + MetaDataVersion + + + SequenceNumber + + + Timestamp + + + Status + + + MessageType + + + + + + JsonDataSetWriterMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.2/#6.3.2.2.2 + + i=15605 + + + + + + + JsonDataSetReaderMessageDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.3.2/#6.3.2.3.3 + + i=15629 + + + + + + + + DatagramConnectionTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.1/#6.4.1.1.2 + + i=15618 + + + + + + + DatagramWriterGroupTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.1/#6.4.1.2.3 + + i=15611 + + + + + + + + BrokerConnectionTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.2/#6.4.2.1.3 + + i=15618 + + + + + + + + BrokerTransportQualityOfService + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.2/#6.4.2.2.5 + + i=15009 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=15008 + + + + + NotSpecified + + + BestEffort + + + AtLeastOnce + + + AtMostOnce + + + ExactlyOnce + + + + + + BrokerWriterGroupTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.2/#6.4.2.2.6 + + i=15611 + + + + + + + + + + BrokerDataSetWriterTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.2/#6.4.2.3.7 + + i=15598 + + + + + + + + + + + + BrokerDataSetReaderTransportDataType + https://reference.opcfoundation.org/v104/Core/docs/Part14/6.4.2/#6.4.2.4.6 + + i=15628 + + + + + + + + + + + PubSubKeyServiceType + https://reference.opcfoundation.org/v104/Core/docs/Part14/8.3 + + i=15907 + i=15910 + i=15913 + i=58 + + + + GetSecurityKeys + + i=15908 + i=15909 + i=80 + i=15906 + + + + InputArguments + + i=68 + i=78 + i=15907 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + StartingTokenId + + i=288 + + -1 + + + + + + + i=297 + + + + RequestedKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15907 + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + FirstTokenId + + i=288 + + -1 + + + + + + + i=297 + + + + Keys + + i=15 + + 1 + + 0 + + + + + + + i=297 + + + + TimeToNextKey + + i=290 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + + + GetSecurityGroup + + i=15911 + i=15912 + i=80 + i=15906 + + + + InputArguments + + i=68 + i=78 + i=15910 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15910 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + SecurityGroups + + i=15914 + i=15917 + i=15452 + i=80 + i=15906 + + + + AddSecurityGroup + + i=15915 + i=15916 + i=78 + i=15913 + + + + InputArguments + + i=68 + i=78 + i=15914 + + + + + + i=297 + + + + SecurityGroupName + + i=12 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + MaxFutureKeyCount + + i=7 + + -1 + + + + + + + i=297 + + + + MaxPastKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15914 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + RemoveSecurityGroup + + i=15918 + i=78 + i=15913 + + + + InputArguments + + i=68 + i=78 + i=15917 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + SecurityGroupFolderType + https://reference.opcfoundation.org/v104/Core/docs/Part14/8.7 + + i=15453 + i=15459 + i=15461 + i=15464 + i=61 + + + + <SecurityGroupFolderName> + + i=15454 + i=15457 + i=15452 + i=11508 + i=15452 + + + + AddSecurityGroup + + i=15455 + i=15456 + i=78 + i=15453 + + + + InputArguments + + i=68 + i=78 + i=15454 + + + + + + i=297 + + + + SecurityGroupName + + i=12 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + MaxFutureKeyCount + + i=7 + + -1 + + + + + + + i=297 + + + + MaxPastKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15454 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + RemoveSecurityGroup + + i=15458 + i=78 + i=15453 + + + + InputArguments + + i=68 + i=78 + i=15457 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + <SecurityGroupName> + + i=15460 + i=15010 + i=15011 + i=15012 + i=15043 + i=15471 + i=11508 + i=15452 + + + + SecurityGroupId + + i=68 + i=78 + i=15459 + + + + KeyLifetime + + i=68 + i=78 + i=15459 + + + + SecurityPolicyUri + + i=68 + i=78 + i=15459 + + + + MaxFutureKeyCount + + i=68 + i=78 + i=15459 + + + + MaxPastKeyCount + + i=68 + i=78 + i=15459 + + + + AddSecurityGroup + + i=15462 + i=15463 + i=78 + i=15452 + + + + InputArguments + + i=68 + i=78 + i=15461 + + + + + + i=297 + + + + SecurityGroupName + + i=12 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + MaxFutureKeyCount + + i=7 + + -1 + + + + + + + i=297 + + + + MaxPastKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15461 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + RemoveSecurityGroup + + i=15465 + i=78 + i=15452 + + + + InputArguments + + i=68 + i=78 + i=15464 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + SecurityGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/8.6 + + i=15472 + i=15046 + i=15047 + i=15048 + i=15056 + i=58 + + + + SecurityGroupId + + i=68 + i=78 + i=15471 + + + + KeyLifetime + + i=68 + i=78 + i=15471 + + + + SecurityPolicyUri + + i=68 + i=78 + i=15471 + + + + MaxFutureKeyCount + + i=68 + i=78 + i=15471 + + + + MaxPastKeyCount + + i=68 + i=78 + i=15471 + + + + PublishSubscribeType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.3/#9.1.3.2 + + i=14417 + i=17296 + i=16598 + i=14432 + i=14434 + i=15844 + i=18715 + i=17479 + i=15906 + + + + <ConnectionName> + + i=14418 + i=17292 + i=17478 + i=14423 + i=14419 + i=14209 + i=11508 + i=14416 + + + + PublisherId + + i=68 + i=78 + i=14417 + + + + TransportProfileUri + + i=17706 + i=16309 + i=78 + i=14417 + + + + Selections + + i=68 + i=78 + i=17292 + + + + ConnectionProperties + + i=68 + i=78 + i=14417 + + + + Address + + i=15533 + i=21145 + i=78 + i=14417 + + + + NetworkInterface + + i=17503 + i=16309 + i=78 + i=14423 + + + + Selections + + i=68 + i=78 + i=15533 + + + + Status + + i=14420 + i=14643 + i=78 + i=14417 + + + + State + + i=63 + i=78 + i=14419 + + + + SetSecurityKeys + + i=17297 + i=80 + i=14416 + + + + InputArguments + + i=68 + i=78 + i=17296 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + CurrentTokenId + + i=288 + + -1 + + + + + + + i=297 + + + + CurrentKey + + i=15 + + -1 + + + + + + + i=297 + + + + FutureKeys + + i=15 + + 1 + + 0 + + + + + + + i=297 + + + + TimeToNextKey + + i=290 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + + + AddConnection + + i=16599 + i=16600 + i=80 + i=14416 + + + + InputArguments + + i=68 + i=78 + i=16598 + + + + + + i=297 + + + + Configuration + + i=15617 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16598 + + + + + + i=297 + + + + ConnectionId + + i=17 + + -1 + + + + + + + + + RemoveConnection + + i=14433 + i=80 + i=14416 + + + + InputArguments + + i=68 + i=78 + i=14432 + + + + + + i=297 + + + + ConnectionId + + i=17 + + -1 + + + + + + + + + PublishedDataSets + + i=14477 + i=78 + i=14416 + + + + Status + + i=15845 + i=14643 + i=78 + i=14416 + + + + State + + i=63 + i=78 + i=15844 + + + + Diagnostics + + i=18716 + i=18717 + i=18722 + i=18727 + i=18728 + i=18729 + i=18760 + i=19732 + i=80 + i=14416 + + + + DiagnosticsLevel + + i=63 + i=78 + i=18715 + + + + TotalInformation + + i=18718 + i=18719 + i=18720 + i=19725 + i=78 + i=18715 + + + + Active + + i=68 + i=78 + i=18717 + + + + Classification + + i=68 + i=78 + i=18717 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18717 + + + + TotalError + + i=18723 + i=18724 + i=18725 + i=19725 + i=78 + i=18715 + + + + Active + + i=68 + i=78 + i=18722 + + + + Classification + + i=68 + i=78 + i=18722 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18722 + + + + Reset + + i=78 + i=18715 + + + + SubError + + i=63 + i=78 + i=18715 + + + + Counters + + i=18730 + i=18735 + i=18740 + i=18745 + i=18750 + i=18755 + i=58 + i=78 + i=18715 + + + + StateError + + i=18731 + i=18732 + i=18733 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18730 + + + + Classification + + i=68 + i=78 + i=18730 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18730 + + + 0 + + + + StateOperationalByMethod + + i=18736 + i=18737 + i=18738 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18735 + + + + Classification + + i=68 + i=78 + i=18735 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18735 + + + 0 + + + + StateOperationalByParent + + i=18741 + i=18742 + i=18743 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18740 + + + + Classification + + i=68 + i=78 + i=18740 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18740 + + + 0 + + + + StateOperationalFromError + + i=18746 + i=18747 + i=18748 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18745 + + + + Classification + + i=68 + i=78 + i=18745 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18745 + + + 0 + + + + StatePausedByParent + + i=18751 + i=18752 + i=18753 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18750 + + + + Classification + + i=68 + i=78 + i=18750 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18750 + + + 0 + + + + StateDisabledByMethod + + i=18756 + i=18757 + i=18758 + i=19725 + i=78 + i=18729 + + + + Active + + i=68 + i=78 + i=18755 + + + + Classification + + i=68 + i=78 + i=18755 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18755 + + + 0 + + + + LiveValues + + i=18761 + i=18763 + i=18765 + i=18767 + i=58 + i=78 + i=18715 + + + + ConfiguredDataSetWriters + + i=18762 + i=63 + i=78 + i=18760 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18761 + + + 0 + + + + ConfiguredDataSetReaders + + i=18764 + i=63 + i=78 + i=18760 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18763 + + + 0 + + + + OperationalDataSetWriters + + i=18766 + i=63 + i=78 + i=18760 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18765 + + + 0 + + + + OperationalDataSetReaders + + i=18768 + i=63 + i=78 + i=18760 + + + + DiagnosticsLevel + + i=68 + i=78 + i=18767 + + + 0 + + + + SupportedTransportProfiles + + i=68 + i=78 + i=14416 + + + + PublishSubscribe + https://reference.opcfoundation.org/v104/Core/docs/Part14/8.2 + + i=15215 + i=15440 + i=15443 + i=17366 + i=17369 + i=17371 + i=17405 + i=17409 + i=17481 + i=2253 + i=14416 + + + + GetSecurityKeys + + i=15216 + i=15217 + i=14443 + + + + InputArguments + + i=68 + i=15215 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + StartingTokenId + + i=288 + + -1 + + + + + + + i=297 + + + + RequestedKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=15215 + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + FirstTokenId + + i=288 + + -1 + + + + + + + i=297 + + + + Keys + + i=15 + + 1 + + 0 + + + + + + + i=297 + + + + TimeToNextKey + + i=290 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + + + GetSecurityGroup + + i=15441 + i=15442 + i=14443 + + + + InputArguments + + i=68 + i=15440 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=15440 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + SecurityGroups + + i=15444 + i=15447 + i=15452 + i=14443 + + + + AddSecurityGroup + + i=15445 + i=15446 + i=15443 + + + + InputArguments + + i=68 + i=15444 + + + + + + i=297 + + + + SecurityGroupName + + i=12 + + -1 + + + + + + + i=297 + + + + KeyLifetime + + i=290 + + -1 + + + + + + + i=297 + + + + SecurityPolicyUri + + i=12 + + -1 + + + + + + + i=297 + + + + MaxFutureKeyCount + + i=7 + + -1 + + + + + + + i=297 + + + + MaxPastKeyCount + + i=7 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=15444 + + + + + + i=297 + + + + SecurityGroupId + + i=12 + + -1 + + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + RemoveSecurityGroup + + i=15448 + i=15443 + + + + InputArguments + + i=68 + i=15447 + + + + + + i=297 + + + + SecurityGroupNodeId + + i=17 + + -1 + + + + + + + + + AddConnection + + i=17367 + i=17368 + i=14443 + + + + InputArguments + + i=68 + i=17366 + + + + + + i=297 + + + + Configuration + + i=15617 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=17366 + + + + + + i=297 + + + + ConnectionId + + i=17 + + -1 + + + + + + + + + RemoveConnection + + i=17370 + i=14443 + + + + InputArguments + + i=68 + i=17369 + + + + + + i=297 + + + + ConnectionId + + i=17 + + -1 + + + + + + + + + PublishedDataSets + + i=14477 + i=14443 + + + + Status + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.10/#9.1.10.4 + + i=17406 + i=14643 + i=14443 + + + + State + + i=63 + i=17405 + + + + Diagnostics + + i=17410 + i=17411 + i=17416 + i=17421 + i=17422 + i=17423 + i=17457 + i=19732 + i=14443 + + + + DiagnosticsLevel + + i=63 + i=17409 + + + + TotalInformation + + i=17412 + i=17413 + i=17414 + i=19725 + i=17409 + + + + Active + + i=68 + i=17411 + + + + Classification + + i=68 + i=17411 + + + + DiagnosticsLevel + + i=68 + i=17411 + + + + TotalError + + i=17417 + i=17418 + i=17419 + i=19725 + i=17409 + + + + Active + + i=68 + i=17416 + + + + Classification + + i=68 + i=17416 + + + + DiagnosticsLevel + + i=68 + i=17416 + + + + Reset + + i=17409 + + + + SubError + + i=63 + i=17409 + + + + Counters + + i=17424 + i=17431 + i=17436 + i=17441 + i=17446 + i=17451 + i=58 + i=17409 + + + + StateError + + i=17425 + i=17426 + i=17429 + i=19725 + i=17423 + + + + Active + + i=68 + i=17424 + + + + Classification + + i=68 + i=17424 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=17424 + + + 0 + + + + StateOperationalByMethod + + i=17432 + i=17433 + i=17434 + i=19725 + i=17423 + + + + Active + + i=68 + i=17431 + + + + Classification + + i=68 + i=17431 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=17431 + + + 0 + + + + StateOperationalByParent + + i=17437 + i=17438 + i=17439 + i=19725 + i=17423 + + + + Active + + i=68 + i=17436 + + + + Classification + + i=68 + i=17436 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=17436 + + + 0 + + + + StateOperationalFromError + + i=17442 + i=17443 + i=17444 + i=19725 + i=17423 + + + + Active + + i=68 + i=17441 + + + + Classification + + i=68 + i=17441 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=17441 + + + 0 + + + + StatePausedByParent + + i=17447 + i=17448 + i=17449 + i=19725 + i=17423 + + + + Active + + i=68 + i=17446 + + + + Classification + + i=68 + i=17446 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=17446 + + + 0 + + + + StateDisabledByMethod + + i=17452 + i=17453 + i=17454 + i=19725 + i=17423 + + + + Active + + i=68 + i=17451 + + + + Classification + + i=68 + i=17451 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=17451 + + + 0 + + + + LiveValues + + i=17458 + i=17460 + i=17462 + i=17464 + i=58 + i=17409 + + + + ConfiguredDataSetWriters + + i=17459 + i=63 + i=17457 + + + + DiagnosticsLevel + + i=68 + i=17458 + + + 0 + + + + ConfiguredDataSetReaders + + i=17461 + i=63 + i=17457 + + + + DiagnosticsLevel + + i=68 + i=17460 + + + 0 + + + + OperationalDataSetWriters + + i=17463 + i=63 + i=17457 + + + + DiagnosticsLevel + + i=68 + i=17462 + + + 0 + + + + OperationalDataSetReaders + + i=17466 + i=63 + i=17457 + + + + DiagnosticsLevel + + i=68 + i=17464 + + + 0 + + + + SupportedTransportProfiles + + i=68 + i=14443 + + + + HasPubSubConnection + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.3/#9.1.3.6 + + i=47 + + PubSubConnectionOf + + + PublishedDataSetType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.2.1 + + i=15222 + i=14519 + i=15229 + i=16759 + i=15481 + i=58 + + + + <DataSetWriterName> + + i=16720 + i=16721 + i=17482 + i=15223 + i=15298 + i=11508 + i=14509 + + + + DataSetWriterId + + i=68 + i=78 + i=15222 + + + + DataSetFieldContentMask + + i=68 + i=78 + i=15222 + + + + DataSetWriterProperties + + i=68 + i=78 + i=15222 + + + + Status + + i=15224 + i=14643 + i=78 + i=15222 + + + + State + + i=63 + i=78 + i=15223 + + + + ConfigurationVersion + + i=68 + i=78 + i=14509 + + + + DataSetMetaData + + i=68 + i=78 + i=14509 + + + + DataSetClassId + + i=68 + i=80 + i=14509 + + + + ExtensionFields + + i=15482 + i=15485 + i=15489 + i=80 + i=14509 + + + + AddExtensionField + + i=15483 + i=15484 + i=78 + i=15481 + + + + InputArguments + + i=68 + i=78 + i=15482 + + + + + + i=297 + + + + FieldName + + i=20 + + -1 + + + + + + + i=297 + + + + FieldValue + + i=24 + + -2 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15482 + + + + + + i=297 + + + + FieldId + + i=17 + + -1 + + + + + + + + + RemoveExtensionField + + i=15486 + i=78 + i=15481 + + + + InputArguments + + i=68 + i=78 + i=15485 + + + + + + i=297 + + + + FieldId + + i=17 + + -1 + + + + + + + + + ExtensionFieldsType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.2.2 + + i=15490 + i=15491 + i=15494 + i=58 + + + + <ExtensionFieldName> + + i=68 + i=11508 + i=15489 + + + + AddExtensionField + + i=15492 + i=15493 + i=78 + i=15489 + + + + InputArguments + + i=68 + i=78 + i=15491 + + + + + + i=297 + + + + FieldName + + i=20 + + -1 + + + + + + + i=297 + + + + FieldValue + + i=24 + + -2 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15491 + + + + + + i=297 + + + + FieldId + + i=17 + + -1 + + + + + + + + + RemoveExtensionField + + i=15495 + i=78 + i=15489 + + + + InputArguments + + i=68 + i=78 + i=15494 + + + + + + i=297 + + + + FieldId + + i=17 + + -1 + + + + + + + + + DataSetToWriter + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.2.5 + + i=33 + + WriterToDataSet + + + PublishedDataItemsType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.3.1 + + i=14548 + i=14555 + i=14558 + i=14509 + + + + PublishedData + + i=68 + i=78 + i=14534 + + + + AddVariables + + i=14556 + i=14557 + i=80 + i=14534 + + + + InputArguments + + i=68 + i=78 + i=14555 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + PromotedFields + + i=1 + + 1 + + 0 + + + + + + + i=297 + + + + VariablesToAdd + + i=14273 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14555 + + + + + + i=297 + + + + NewConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + RemoveVariables + + i=14559 + i=14560 + i=80 + i=14534 + + + + InputArguments + + i=68 + i=78 + i=14558 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + VariablesToRemove + + i=7 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14558 + + + + + + i=297 + + + + NewConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + RemoveResults + + i=19 + + 1 + + 0 + + + + + + + + + PublishedEventsType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.4.1 + + i=14586 + i=14587 + i=14588 + i=15052 + i=14509 + + + + EventNotifier + + i=68 + i=78 + i=14572 + + + + SelectedFields + + i=68 + i=78 + i=14572 + + + + Filter + + i=68 + i=78 + i=14572 + + + + ModifyFieldSelection + + i=15053 + i=15517 + i=80 + i=14572 + + + + InputArguments + + i=68 + i=78 + i=15052 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + PromotedFields + + i=1 + + 1 + + 0 + + + + + + + i=297 + + + + SelectedFields + + i=601 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15052 + + + + + + i=297 + + + + NewConfigurationVersion + + i=14593 + + -1 + + + + + + + + + DataSetFolderType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.4/#9.1.4.5.1 + + i=14478 + i=14487 + i=14493 + i=14496 + i=16935 + i=16960 + i=14499 + i=16994 + i=16997 + i=61 + + + + <DataSetFolderName> + + i=14479 + i=14482 + i=16842 + i=16881 + i=14485 + i=16884 + i=16923 + i=14477 + i=11508 + i=14477 + + + + AddPublishedDataItems + + i=14480 + i=14481 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=14479 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + FieldFlags + + i=15904 + + 1 + + 0 + + + + + + + i=297 + + + + VariablesToAdd + + i=14273 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14479 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + AddPublishedEvents + + i=14483 + i=14484 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=14482 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + EventNotifier + + i=17 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + FieldFlags + + i=15904 + + 1 + + 0 + + + + + + + i=297 + + + + SelectedFields + + i=601 + + 1 + + 0 + + + + + + + i=297 + + + + Filter + + i=586 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14482 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + AddPublishedDataItemsTemplate + + i=16843 + i=16853 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=16842 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + DataSetMetaData + + i=14523 + + -1 + + + + + + + i=297 + + + + VariablesToAdd + + i=14273 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16842 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + AddPublishedEventsTemplate + + i=16882 + i=16883 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=16881 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + DataSetMetaData + + i=14523 + + -1 + + + + + + + i=297 + + + + EventNotifier + + i=17 + + -1 + + + + + + + i=297 + + + + SelectedFields + + i=601 + + 1 + + 0 + + + + + + + i=297 + + + + Filter + + i=586 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16881 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + RemovePublishedDataSet + + i=14486 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=14485 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + AddDataSetFolder + + i=16894 + i=16922 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=16884 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16884 + + + + + + i=297 + + + + DataSetFolderNodeId + + i=17 + + -1 + + + + + + + + + RemoveDataSetFolder + + i=16924 + i=80 + i=14478 + + + + InputArguments + + i=68 + i=78 + i=16923 + + + + + + i=297 + + + + DataSetFolderNodeId + + i=17 + + -1 + + + + + + + + + <PublishedDataSetName> + + i=14489 + i=15221 + i=14509 + i=11508 + i=14477 + + + + ConfigurationVersion + + i=68 + i=78 + i=14487 + + + + DataSetMetaData + + i=68 + i=78 + i=14487 + + + + AddPublishedDataItems + + i=14494 + i=14495 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=14493 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + FieldFlags + + i=15904 + + 1 + + 0 + + + + + + + i=297 + + + + VariablesToAdd + + i=14273 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14493 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + AddPublishedEvents + + i=14497 + i=14498 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=14496 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + EventNotifier + + i=17 + + -1 + + + + + + + i=297 + + + + FieldNameAliases + + i=12 + + 1 + + 0 + + + + + + + i=297 + + + + FieldFlags + + i=15904 + + 1 + + 0 + + + + + + + i=297 + + + + SelectedFields + + i=601 + + 1 + + 0 + + + + + + + i=297 + + + + Filter + + i=586 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=14496 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + AddPublishedDataItemsTemplate + + i=16958 + i=16959 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=16935 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + DataSetMetaData + + i=14523 + + -1 + + + + + + + i=297 + + + + VariablesToAdd + + i=14273 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16935 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + AddPublishedEventsTemplate + + i=16961 + i=16971 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=16960 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + i=297 + + + + DataSetMetaData + + i=14523 + + -1 + + + + + + + i=297 + + + + EventNotifier + + i=17 + + -1 + + + + + + + i=297 + + + + SelectedFields + + i=601 + + 1 + + 0 + + + + + + + i=297 + + + + Filter + + i=586 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16960 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + RemovePublishedDataSet + + i=14500 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=14499 + + + + + + i=297 + + + + DataSetNodeId + + i=17 + + -1 + + + + + + + + + AddDataSetFolder + + i=16995 + i=16996 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=16994 + + + + + + i=297 + + + + Name + + i=12 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=16994 + + + + + + i=297 + + + + DataSetFolderNodeId + + i=17 + + -1 + + + + + + + + + RemoveDataSetFolder + + i=17007 + i=80 + i=14477 + + + + InputArguments + + i=68 + i=78 + i=16997 + + + + + + i=297 + + + + DataSetFolderNodeId + + i=17 + + -1 + + + + + + + + + PubSubConnectionType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.5/#9.1.5.2 + + i=14595 + i=17306 + i=17485 + i=14221 + i=17203 + i=17310 + i=17325 + i=14600 + i=19241 + i=17427 + i=17465 + i=14225 + i=58 + + + + PublisherId + + i=68 + i=78 + i=14209 + + + + TransportProfileUri + + i=17710 + i=16309 + i=78 + i=14209 + + + + Selections + + i=68 + i=78 + i=17306 + + + + ConnectionProperties + + i=68 + i=78 + i=14209 + + + + Address + + i=17202 + i=21145 + i=78 + i=14209 + + + + NetworkInterface + + i=17576 + i=16309 + i=78 + i=14221 + + + + Selections + + i=68 + i=78 + i=17202 + + + + TransportSettings + + i=17721 + i=80 + i=14209 + + + + <WriterGroupName> + + i=17311 + i=17204 + i=17486 + i=17314 + i=17214 + i=17318 + i=17319 + i=17321 + i=17322 + i=17558 + i=17725 + i=11508 + i=14209 + + + + SecurityMode + + i=68 + i=78 + i=17310 + + + + MaxNetworkMessageSize + + i=68 + i=78 + i=17310 + + + + GroupProperties + + i=68 + i=78 + i=17310 + + + + Status + + i=17315 + i=14643 + i=78 + i=17310 + + + + State + + i=63 + i=78 + i=17314 + + + + WriterGroupId + + i=68 + i=78 + i=17310 + + + + PublishingInterval + + i=68 + i=78 + i=17310 + + + + KeepAliveTime + + i=68 + i=78 + i=17310 + + + + Priority + + i=68 + i=78 + i=17310 + + + + LocaleIds + + i=68 + i=78 + i=17310 + + + + HeaderLayoutUri + + i=68 + i=78 + i=17310 + + + + <ReaderGroupName> + + i=17326 + i=17302 + i=17487 + i=17329 + i=17999 + i=11508 + i=14209 + + + + SecurityMode + + i=68 + i=78 + i=17325 + + + + MaxNetworkMessageSize + + i=68 + i=78 + i=17325 + + + + GroupProperties + + i=68 + i=78 + i=17325 + + + + Status + + i=17330 + i=14643 + i=78 + i=17325 + + + + State + + i=63 + i=78 + i=17329 + + + + Status + + i=14601 + i=14643 + i=78 + i=14209 + + + + State + + i=63 + i=78 + i=14600 + + + + Diagnostics + + i=19242 + i=19243 + i=19248 + i=19253 + i=19254 + i=19255 + i=19286 + i=19786 + i=80 + i=14209 + + + + DiagnosticsLevel + + i=63 + i=78 + i=19241 + + + + TotalInformation + + i=19244 + i=19245 + i=19246 + i=19725 + i=78 + i=19241 + + + + Active + + i=68 + i=78 + i=19243 + + + + Classification + + i=68 + i=78 + i=19243 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19243 + + + + TotalError + + i=19249 + i=19250 + i=19251 + i=19725 + i=78 + i=19241 + + + + Active + + i=68 + i=78 + i=19248 + + + + Classification + + i=68 + i=78 + i=19248 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19248 + + + + Reset + + i=78 + i=19241 + + + + SubError + + i=63 + i=78 + i=19241 + + + + Counters + + i=19256 + i=19261 + i=19266 + i=19271 + i=19276 + i=19281 + i=58 + i=78 + i=19241 + + + + StateError + + i=19257 + i=19258 + i=19259 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19256 + + + + Classification + + i=68 + i=78 + i=19256 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19256 + + + 0 + + + + StateOperationalByMethod + + i=19262 + i=19263 + i=19264 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19261 + + + + Classification + + i=68 + i=78 + i=19261 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19261 + + + 0 + + + + StateOperationalByParent + + i=19267 + i=19268 + i=19269 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19266 + + + + Classification + + i=68 + i=78 + i=19266 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19266 + + + 0 + + + + StateOperationalFromError + + i=19272 + i=19273 + i=19274 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19271 + + + + Classification + + i=68 + i=78 + i=19271 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19271 + + + 0 + + + + StatePausedByParent + + i=19277 + i=19278 + i=19279 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19276 + + + + Classification + + i=68 + i=78 + i=19276 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19276 + + + 0 + + + + StateDisabledByMethod + + i=19282 + i=19283 + i=19284 + i=19725 + i=78 + i=19255 + + + + Active + + i=68 + i=78 + i=19281 + + + + Classification + + i=68 + i=78 + i=19281 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19281 + + + 0 + + + + LiveValues + + i=19287 + i=58 + i=78 + i=19241 + + + + ResolvedAddress + + i=19288 + i=63 + i=78 + i=19286 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19287 + + + 0 + + + + AddWriterGroup + + i=17428 + i=17456 + i=80 + i=14209 + + + + InputArguments + + i=68 + i=78 + i=17427 + + + + + + i=297 + + + + Configuration + + i=15480 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17427 + + + + + + i=297 + + + + GroupId + + i=17 + + -1 + + + + + + + + + AddReaderGroup + + i=17507 + i=17508 + i=80 + i=14209 + + + + InputArguments + + i=68 + i=78 + i=17465 + + + + + + i=297 + + + + Configuration + + i=15520 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17465 + + + + + + i=297 + + + + GroupId + + i=17 + + -1 + + + + + + + + + RemoveGroup + + i=14226 + i=80 + i=14209 + + + + InputArguments + + i=68 + i=78 + i=14225 + + + + + + i=297 + + + + GroupId + + i=17 + + -1 + + + + + + + + + ConnectionTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.5/#9.1.5.6 + + i=58 + + + + PubSubGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.2 + + i=15926 + i=15927 + i=15928 + i=17724 + i=17488 + i=15265 + i=58 + + + + SecurityMode + + i=68 + i=78 + i=14232 + + + + SecurityGroupId + + i=68 + i=80 + i=14232 + + + + SecurityKeyServices + + i=68 + i=80 + i=14232 + + + + MaxNetworkMessageSize + + i=68 + i=78 + i=14232 + + + + GroupProperties + + i=68 + i=78 + i=14232 + + + + Status + + i=15266 + i=14643 + i=78 + i=14232 + + + + State + + i=63 + i=78 + i=15265 + + + + WriterGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.3 + + i=17736 + i=17737 + i=17738 + i=17739 + i=17740 + i=17559 + i=17741 + i=17742 + i=17743 + i=17812 + i=17969 + i=17992 + i=14232 + + + + WriterGroupId + + i=68 + i=78 + i=17725 + + + + PublishingInterval + + i=68 + i=78 + i=17725 + + + + KeepAliveTime + + i=68 + i=78 + i=17725 + + + + Priority + + i=68 + i=78 + i=17725 + + + + LocaleIds + + i=68 + i=78 + i=17725 + + + + HeaderLayoutUri + + i=68 + i=78 + i=17725 + + + + TransportSettings + + i=17997 + i=80 + i=17725 + + + + MessageSettings + + i=17998 + i=80 + i=17725 + + + + <DataSetWriterName> + + i=17744 + i=17745 + i=17490 + i=17749 + i=15298 + i=11508 + i=17725 + + + + DataSetWriterId + + i=68 + i=78 + i=17743 + + + + DataSetFieldContentMask + + i=68 + i=78 + i=17743 + + + + DataSetWriterProperties + + i=68 + i=78 + i=17743 + + + + Status + + i=17750 + i=14643 + i=78 + i=17743 + + + + State + + i=63 + i=78 + i=17749 + + + + Diagnostics + + i=17813 + i=17814 + i=17819 + i=17824 + i=17825 + i=17826 + i=17858 + i=19834 + i=80 + i=17725 + + + + DiagnosticsLevel + + i=63 + i=78 + i=17812 + + + + TotalInformation + + i=17815 + i=17816 + i=17817 + i=19725 + i=78 + i=17812 + + + + Active + + i=68 + i=78 + i=17814 + + + + Classification + + i=68 + i=78 + i=17814 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17814 + + + + TotalError + + i=17820 + i=17821 + i=17822 + i=19725 + i=78 + i=17812 + + + + Active + + i=68 + i=78 + i=17819 + + + + Classification + + i=68 + i=78 + i=17819 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17819 + + + + Reset + + i=78 + i=17812 + + + + SubError + + i=63 + i=78 + i=17812 + + + + Counters + + i=17827 + i=17832 + i=17837 + i=17842 + i=17847 + i=17853 + i=17859 + i=17874 + i=17900 + i=58 + i=78 + i=17812 + + + + StateError + + i=17828 + i=17829 + i=17830 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17827 + + + + Classification + + i=68 + i=78 + i=17827 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17827 + + + 0 + + + + StateOperationalByMethod + + i=17833 + i=17834 + i=17835 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17832 + + + + Classification + + i=68 + i=78 + i=17832 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17832 + + + 0 + + + + StateOperationalByParent + + i=17838 + i=17839 + i=17840 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17837 + + + + Classification + + i=68 + i=78 + i=17837 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17837 + + + 0 + + + + StateOperationalFromError + + i=17843 + i=17844 + i=17845 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17842 + + + + Classification + + i=68 + i=78 + i=17842 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17842 + + + 0 + + + + StatePausedByParent + + i=17848 + i=17849 + i=17850 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17847 + + + + Classification + + i=68 + i=78 + i=17847 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17847 + + + 0 + + + + StateDisabledByMethod + + i=17854 + i=17855 + i=17856 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17853 + + + + Classification + + i=68 + i=78 + i=17853 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17853 + + + 0 + + + + SentNetworkMessages + + i=17864 + i=17871 + i=17872 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17859 + + + + Classification + + i=68 + i=78 + i=17859 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17859 + + + 0 + + + + FailedTransmissions + + i=17878 + i=17885 + i=17892 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17874 + + + + Classification + + i=68 + i=78 + i=17874 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17874 + + + 0 + + + + EncryptionErrors + + i=17901 + i=17902 + i=17903 + i=19725 + i=78 + i=17826 + + + + Active + + i=68 + i=78 + i=17900 + + + + Classification + + i=68 + i=78 + i=17900 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17900 + + + 1 + + + + LiveValues + + i=17913 + i=17927 + i=58 + i=78 + i=17812 + + + + ConfiguredDataSetWriters + + i=17920 + i=63 + i=78 + i=17858 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17913 + + + 0 + + + + OperationalDataSetWriters + + i=17934 + i=63 + i=78 + i=17858 + + + + DiagnosticsLevel + + i=68 + i=78 + i=17927 + + + 0 + + + + AddDataSetWriter + + i=17976 + i=17987 + i=80 + i=17725 + + + + InputArguments + + i=68 + i=78 + i=17969 + + + + + + i=297 + + + + Configuration + + i=15597 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17969 + + + + + + i=297 + + + + DataSetWriterNodeId + + i=17 + + -1 + + + + + + + + + RemoveDataSetWriter + + i=17993 + i=80 + i=17725 + + + + InputArguments + + i=68 + i=78 + i=17992 + + + + + + i=297 + + + + DataSetWriterNodeId + + i=17 + + -1 + + + + + + + + + HasDataSetWriter + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.6 + + i=47 + + IsWriterInGroup + + + HasWriterGroup + + i=47 + + IsWriterGroupOf + + + WriterGroupTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.7 + + i=58 + + + + WriterGroupMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.8 + + i=58 + + + + ReaderGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.9 + + i=18076 + i=21015 + i=21080 + i=21081 + i=21082 + i=21085 + i=14232 + + + + <DataSetReaderName> + + i=18077 + i=18078 + i=18079 + i=18080 + i=18081 + i=18082 + i=17560 + i=17562 + i=17492 + i=18088 + i=21006 + i=15306 + i=11508 + i=17999 + + + + PublisherId + + i=68 + i=78 + i=18076 + + + + WriterGroupId + + i=68 + i=78 + i=18076 + + + + DataSetWriterId + + i=68 + i=78 + i=18076 + + + + DataSetMetaData + + i=68 + i=78 + i=18076 + + + + DataSetFieldContentMask + + i=68 + i=78 + i=18076 + + + + MessageReceiveTimeout + + i=68 + i=78 + i=18076 + + + + KeyFrameCount + + i=68 + i=78 + i=18076 + + + + HeaderLayoutUri + + i=68 + i=78 + i=18076 + + + + DataSetReaderProperties + + i=68 + i=78 + i=18076 + + + + Status + + i=18089 + i=14643 + i=78 + i=18076 + + + + State + + i=63 + i=78 + i=18088 + + + + SubscribedDataSet + + i=15108 + i=78 + i=18076 + + + + Diagnostics + + i=21016 + i=21017 + i=21022 + i=21027 + i=21028 + i=21029 + i=21060 + i=19903 + i=80 + i=17999 + + + + DiagnosticsLevel + + i=63 + i=78 + i=21015 + + + + TotalInformation + + i=21018 + i=21019 + i=21020 + i=19725 + i=78 + i=21015 + + + + Active + + i=68 + i=78 + i=21017 + + + + Classification + + i=68 + i=78 + i=21017 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21017 + + + + TotalError + + i=21023 + i=21024 + i=21025 + i=19725 + i=78 + i=21015 + + + + Active + + i=68 + i=78 + i=21022 + + + + Classification + + i=68 + i=78 + i=21022 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21022 + + + + Reset + + i=78 + i=21015 + + + + SubError + + i=63 + i=78 + i=21015 + + + + Counters + + i=21030 + i=21035 + i=21040 + i=21045 + i=21050 + i=21055 + i=21061 + i=58 + i=78 + i=21015 + + + + StateError + + i=21031 + i=21032 + i=21033 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21030 + + + + Classification + + i=68 + i=78 + i=21030 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21030 + + + 0 + + + + StateOperationalByMethod + + i=21036 + i=21037 + i=21038 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21035 + + + + Classification + + i=68 + i=78 + i=21035 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21035 + + + 0 + + + + StateOperationalByParent + + i=21041 + i=21042 + i=21043 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21040 + + + + Classification + + i=68 + i=78 + i=21040 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21040 + + + 0 + + + + StateOperationalFromError + + i=21046 + i=21047 + i=21048 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21045 + + + + Classification + + i=68 + i=78 + i=21045 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21045 + + + 0 + + + + StatePausedByParent + + i=21051 + i=21052 + i=21053 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21050 + + + + Classification + + i=68 + i=78 + i=21050 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21050 + + + 0 + + + + StateDisabledByMethod + + i=21056 + i=21057 + i=21058 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21055 + + + + Classification + + i=68 + i=78 + i=21055 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21055 + + + 0 + + + + ReceivedNetworkMessages + + i=21062 + i=21063 + i=21064 + i=19725 + i=78 + i=21029 + + + + Active + + i=68 + i=78 + i=21061 + + + + Classification + + i=68 + i=78 + i=21061 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21061 + + + 0 + + + + LiveValues + + i=21076 + i=21078 + i=58 + i=78 + i=21015 + + + + ConfiguredDataSetReaders + + i=21077 + i=63 + i=78 + i=21060 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21076 + + + 0 + + + + OperationalDataSetReaders + + i=21079 + i=63 + i=78 + i=21060 + + + + DiagnosticsLevel + + i=68 + i=78 + i=21078 + + + 0 + + + + TransportSettings + + i=21090 + i=80 + i=17999 + + + + MessageSettings + + i=21091 + i=80 + i=17999 + + + + AddDataSetReader + + i=21083 + i=21084 + i=80 + i=17999 + + + + InputArguments + + i=68 + i=78 + i=21082 + + + + + + i=297 + + + + Configuration + + i=15623 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=21082 + + + + + + i=297 + + + + DataSetReaderNodeId + + i=17 + + -1 + + + + + + + + + RemoveDataSetReader + + i=21086 + i=80 + i=17999 + + + + InputArguments + + i=68 + i=78 + i=21085 + + + + + + i=297 + + + + DataSetReaderNodeId + + i=17 + + -1 + + + + + + + + + HasDataSetReader + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.12 + + i=47 + + IsReaderInGroup + + + HasReaderGroup + + i=47 + + IsReaderGroupOf + + + ReaderGroupTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.13 + + i=58 + + + + ReaderGroupMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.6/#9.1.6.14 + + i=58 + + + + DataSetWriterType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.7/#9.1.7.2 + + i=21092 + i=21093 + i=21094 + i=17493 + i=15303 + i=21095 + i=15299 + i=19550 + i=58 + + + + DataSetWriterId + + i=68 + i=78 + i=15298 + + + + DataSetFieldContentMask + + i=68 + i=78 + i=15298 + + + + KeyFrameCount + + i=68 + i=80 + i=15298 + + + + DataSetWriterProperties + + i=68 + i=78 + i=15298 + + + + TransportSettings + + i=15305 + i=80 + i=15298 + + + + MessageSettings + + i=21096 + i=80 + i=15298 + + + + Status + + i=15300 + i=14643 + i=78 + i=15298 + + + + State + + i=63 + i=78 + i=15299 + + + + Diagnostics + + i=19551 + i=19552 + i=19557 + i=19562 + i=19563 + i=19564 + i=19595 + i=19968 + i=80 + i=15298 + + + + DiagnosticsLevel + + i=63 + i=78 + i=19550 + + + + TotalInformation + + i=19553 + i=19554 + i=19555 + i=19725 + i=78 + i=19550 + + + + Active + + i=68 + i=78 + i=19552 + + + + Classification + + i=68 + i=78 + i=19552 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19552 + + + + TotalError + + i=19558 + i=19559 + i=19560 + i=19725 + i=78 + i=19550 + + + + Active + + i=68 + i=78 + i=19557 + + + + Classification + + i=68 + i=78 + i=19557 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19557 + + + + Reset + + i=78 + i=19550 + + + + SubError + + i=63 + i=78 + i=19550 + + + + Counters + + i=19565 + i=19570 + i=19575 + i=19580 + i=19585 + i=19590 + i=19596 + i=58 + i=78 + i=19550 + + + + StateError + + i=19566 + i=19567 + i=19568 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19565 + + + + Classification + + i=68 + i=78 + i=19565 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19565 + + + 0 + + + + StateOperationalByMethod + + i=19571 + i=19572 + i=19573 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19570 + + + + Classification + + i=68 + i=78 + i=19570 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19570 + + + 0 + + + + StateOperationalByParent + + i=19576 + i=19577 + i=19578 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19575 + + + + Classification + + i=68 + i=78 + i=19575 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19575 + + + 0 + + + + StateOperationalFromError + + i=19581 + i=19582 + i=19583 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19580 + + + + Classification + + i=68 + i=78 + i=19580 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19580 + + + 0 + + + + StatePausedByParent + + i=19586 + i=19587 + i=19588 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19585 + + + + Classification + + i=68 + i=78 + i=19585 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19585 + + + 0 + + + + StateDisabledByMethod + + i=19591 + i=19592 + i=19593 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19590 + + + + Classification + + i=68 + i=78 + i=19590 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19590 + + + 0 + + + + FailedDataSetMessages + + i=19597 + i=19598 + i=19599 + i=19725 + i=78 + i=19564 + + + + Active + + i=68 + i=78 + i=19596 + + + + Classification + + i=68 + i=78 + i=19596 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19596 + + + 0 + + + + LiveValues + + i=58 + i=78 + i=19550 + + + + DataSetWriterTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.7/#9.1.7.3 + + i=58 + + + + DataSetWriterMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.7/#9.1.7.4 + + i=58 + + + + DataSetReaderType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.8/#9.1.8.2 + + i=21097 + i=21098 + i=21099 + i=21100 + i=21101 + i=21102 + i=17563 + i=17564 + i=15932 + i=15933 + i=15934 + i=17494 + i=15311 + i=21103 + i=15307 + i=19609 + i=15316 + i=17386 + i=17389 + i=58 + + + + PublisherId + + i=68 + i=78 + i=15306 + + + + WriterGroupId + + i=68 + i=78 + i=15306 + + + + DataSetWriterId + + i=68 + i=78 + i=15306 + + + + DataSetMetaData + + i=68 + i=78 + i=15306 + + + + DataSetFieldContentMask + + i=68 + i=78 + i=15306 + + + + MessageReceiveTimeout + + i=68 + i=78 + i=15306 + + + + KeyFrameCount + + i=68 + i=78 + i=15306 + + + + HeaderLayoutUri + + i=68 + i=78 + i=15306 + + + + SecurityMode + + i=68 + i=80 + i=15306 + + + + SecurityGroupId + + i=68 + i=80 + i=15306 + + + + SecurityKeyServices + + i=68 + i=80 + i=15306 + + + + DataSetReaderProperties + + i=68 + i=78 + i=15306 + + + + TransportSettings + + i=15319 + i=80 + i=15306 + + + + MessageSettings + + i=21104 + i=80 + i=15306 + + + + Status + + i=15308 + i=14643 + i=78 + i=15306 + + + + State + + i=63 + i=78 + i=15307 + + + + Diagnostics + + i=19610 + i=19611 + i=19616 + i=19621 + i=19622 + i=19623 + i=19654 + i=20027 + i=80 + i=15306 + + + + DiagnosticsLevel + + i=63 + i=78 + i=19609 + + + + TotalInformation + + i=19612 + i=19613 + i=19614 + i=19725 + i=78 + i=19609 + + + + Active + + i=68 + i=78 + i=19611 + + + + Classification + + i=68 + i=78 + i=19611 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19611 + + + + TotalError + + i=19617 + i=19618 + i=19619 + i=19725 + i=78 + i=19609 + + + + Active + + i=68 + i=78 + i=19616 + + + + Classification + + i=68 + i=78 + i=19616 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19616 + + + + Reset + + i=78 + i=19609 + + + + SubError + + i=63 + i=78 + i=19609 + + + + Counters + + i=19624 + i=19629 + i=19634 + i=19639 + i=19644 + i=19649 + i=19655 + i=58 + i=78 + i=19609 + + + + StateError + + i=19625 + i=19626 + i=19627 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19624 + + + + Classification + + i=68 + i=78 + i=19624 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19624 + + + 0 + + + + StateOperationalByMethod + + i=19630 + i=19631 + i=19632 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19629 + + + + Classification + + i=68 + i=78 + i=19629 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19629 + + + 0 + + + + StateOperationalByParent + + i=19635 + i=19636 + i=19637 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19634 + + + + Classification + + i=68 + i=78 + i=19634 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19634 + + + 0 + + + + StateOperationalFromError + + i=19640 + i=19641 + i=19642 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19639 + + + + Classification + + i=68 + i=78 + i=19639 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19639 + + + 0 + + + + StatePausedByParent + + i=19645 + i=19646 + i=19647 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19644 + + + + Classification + + i=68 + i=78 + i=19644 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19644 + + + 0 + + + + StateDisabledByMethod + + i=19650 + i=19651 + i=19652 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19649 + + + + Classification + + i=68 + i=78 + i=19649 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19649 + + + 0 + + + + FailedDataSetMessages + + i=19656 + i=19657 + i=19658 + i=19725 + i=78 + i=19623 + + + + Active + + i=68 + i=78 + i=19655 + + + + Classification + + i=68 + i=78 + i=19655 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19655 + + + 0 + + + + LiveValues + + i=58 + i=78 + i=19609 + + + + SubscribedDataSet + + i=15108 + i=78 + i=15306 + + + + CreateTargetVariables + + i=17387 + i=17388 + i=80 + i=15306 + + + + InputArguments + + i=68 + i=78 + i=17386 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + TargetVariablesToAdd + + i=14744 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17386 + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + CreateDataSetMirror + + i=17390 + i=17391 + i=80 + i=15306 + + + + InputArguments + + i=68 + i=78 + i=17389 + + + + + + i=297 + + + + ParentNodeName + + i=12 + + -1 + + + + + + + i=297 + + + + RolePermissions + + i=96 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=17389 + + + + + + i=297 + + + + ParentNodeId + + i=17 + + -1 + + + + + + + + + DataSetReaderTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.8/#9.1.8.3 + + i=58 + + + + DataSetReaderMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.8/#9.1.8.4 + + i=58 + + + + SubscribedDataSetType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.9/#9.1.9.1 + + i=58 + + + + TargetVariablesType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.9/#9.1.9.2 + + i=15114 + i=15115 + i=15118 + i=15108 + + + + TargetVariables + + i=68 + i=78 + i=15111 + + + + AddTargetVariables + + i=15116 + i=15117 + i=80 + i=15111 + + + + InputArguments + + i=68 + i=78 + i=15115 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + TargetVariablesToAdd + + i=14744 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15115 + + + + + + i=297 + + + + AddResults + + i=19 + + 1 + + 0 + + + + + + + + + RemoveTargetVariables + + i=15119 + i=15120 + i=80 + i=15111 + + + + InputArguments + + i=68 + i=78 + i=15118 + + + + + + i=297 + + + + ConfigurationVersion + + i=14593 + + -1 + + + + + + + i=297 + + + + TargetsToRemove + + i=7 + + 1 + + 0 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=15118 + + + + + + i=297 + + + + RemoveResults + + i=19 + + 1 + + 0 + + + + + + + + + SubscribedDataSetMirrorType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.9/#9.1.9.5 + + i=15108 + + + + PubSubStatusType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.10/#9.1.10.1 + + i=14644 + i=14645 + i=14646 + i=58 + + + + State + + i=63 + i=78 + i=14643 + + + + Enable + + i=80 + i=14643 + + + + Disable + + i=80 + i=14643 + + + + PubSubDiagnosticsType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.2 + + i=19678 + i=19679 + i=19684 + i=19689 + i=19690 + i=19691 + i=19722 + i=58 + + + + DiagnosticsLevel + + i=63 + i=78 + i=19677 + + + + TotalInformation + + i=19680 + i=19681 + i=19682 + i=19725 + i=78 + i=19677 + + + + Active + + i=68 + i=78 + i=19679 + + + + Classification + + i=68 + i=78 + i=19679 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19679 + + + + TotalError + + i=19685 + i=19686 + i=19687 + i=19725 + i=78 + i=19677 + + + + Active + + i=68 + i=78 + i=19684 + + + + Classification + + i=68 + i=78 + i=19684 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19684 + + + + Reset + + i=78 + i=19677 + + + + SubError + + i=63 + i=78 + i=19677 + + + + Counters + + i=19692 + i=19697 + i=19702 + i=19707 + i=19712 + i=19717 + i=58 + i=78 + i=19677 + + + + StateError + + i=19693 + i=19694 + i=19695 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19692 + + + + Classification + + i=68 + i=78 + i=19692 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19692 + + + 0 + + + + StateOperationalByMethod + + i=19698 + i=19699 + i=19700 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19697 + + + + Classification + + i=68 + i=78 + i=19697 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19697 + + + 0 + + + + StateOperationalByParent + + i=19703 + i=19704 + i=19705 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19702 + + + + Classification + + i=68 + i=78 + i=19702 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19702 + + + 0 + + + + StateOperationalFromError + + i=19708 + i=19709 + i=19710 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19707 + + + + Classification + + i=68 + i=78 + i=19707 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19707 + + + 0 + + + + StatePausedByParent + + i=19713 + i=19714 + i=19715 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19712 + + + + Classification + + i=68 + i=78 + i=19712 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19712 + + + 0 + + + + StateDisabledByMethod + + i=19718 + i=19719 + i=19720 + i=19725 + i=78 + i=19691 + + + + Active + + i=68 + i=78 + i=19717 + + + + Classification + + i=68 + i=78 + i=19717 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19717 + + + 0 + + + + LiveValues + + i=58 + i=78 + i=19677 + + + + DiagnosticsLevel + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.4 + + i=19724 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=19723 + + + + + Basic + + + Advanced + + + Info + + + Log + + + Debug + + + + + + PubSubDiagnosticsCounterType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.5 + + i=19726 + i=19727 + i=19728 + i=19729 + i=63 + + + + Active + + i=68 + i=78 + i=19725 + + + + Classification + + i=68 + i=78 + i=19725 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19725 + + + + TimeFirstChange + + i=68 + i=80 + i=19725 + + + + PubSubDiagnosticsCounterClassification + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.6 + + i=19731 + i=29 + + + + + + + + EnumStrings + + i=68 + i=19730 + + + + + Information + + + Error + + + + + + PubSubDiagnosticsRootType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.7 + + i=19777 + i=19677 + + + + LiveValues + + i=19778 + i=19780 + i=19782 + i=19784 + i=58 + i=78 + i=19732 + + + + ConfiguredDataSetWriters + + i=19779 + i=63 + i=78 + i=19777 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19778 + + + 0 + + + + ConfiguredDataSetReaders + + i=19781 + i=63 + i=78 + i=19777 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19780 + + + 0 + + + + OperationalDataSetWriters + + i=19783 + i=63 + i=78 + i=19777 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19782 + + + 0 + + + + OperationalDataSetReaders + + i=19785 + i=63 + i=78 + i=19777 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19784 + + + 0 + + + + PubSubDiagnosticsConnectionType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.8 + + i=19831 + i=19677 + + + + LiveValues + + i=19832 + i=58 + i=78 + i=19786 + + + + ResolvedAddress + + i=19833 + i=63 + i=78 + i=19831 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19832 + + + 0 + + + + PubSubDiagnosticsWriterGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.9 + + i=19848 + i=19879 + i=19677 + + + + Counters + + i=19880 + i=19885 + i=19890 + i=58 + i=78 + i=19834 + + + + SentNetworkMessages + + i=19881 + i=19882 + i=19883 + i=19725 + i=78 + i=19848 + + + + Active + + i=68 + i=78 + i=19880 + + + + Classification + + i=68 + i=78 + i=19880 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19880 + + + 0 + + + + FailedTransmissions + + i=19886 + i=19887 + i=19888 + i=19725 + i=78 + i=19848 + + + + Active + + i=68 + i=78 + i=19885 + + + + Classification + + i=68 + i=78 + i=19885 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19885 + + + 0 + + + + EncryptionErrors + + i=19891 + i=19892 + i=19893 + i=19725 + i=78 + i=19848 + + + + Active + + i=68 + i=78 + i=19890 + + + + Classification + + i=68 + i=78 + i=19890 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19890 + + + 1 + + + + LiveValues + + i=19895 + i=19897 + i=19899 + i=19901 + i=58 + i=78 + i=19834 + + + + ConfiguredDataSetWriters + + i=19896 + i=63 + i=78 + i=19879 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19895 + + + 0 + + + + OperationalDataSetWriters + + i=19898 + i=63 + i=78 + i=19879 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19897 + + + 0 + + + + SecurityTokenID + + i=19900 + i=63 + i=80 + i=19879 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19899 + + + 2 + + + + TimeToNextTokenID + + i=19902 + i=63 + i=80 + i=19879 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19901 + + + 2 + + + + PubSubDiagnosticsReaderGroupType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.10 + + i=19917 + i=19948 + i=19677 + + + + Counters + + i=19949 + i=19954 + i=19959 + i=58 + i=78 + i=19903 + + + + ReceivedNetworkMessages + + i=19950 + i=19951 + i=19952 + i=19725 + i=78 + i=19917 + + + + Active + + i=68 + i=78 + i=19949 + + + + Classification + + i=68 + i=78 + i=19949 + + + 0 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19949 + + + 0 + + + + ReceivedInvalidNetworkMessages + + i=19955 + i=19956 + i=19957 + i=19725 + i=80 + i=19917 + + + + Active + + i=68 + i=78 + i=19954 + + + + Classification + + i=68 + i=78 + i=19954 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19954 + + + 1 + + + + DecryptionErrors + + i=19960 + i=19961 + i=19962 + i=19725 + i=80 + i=19917 + + + + Active + + i=68 + i=78 + i=19959 + + + + Classification + + i=68 + i=78 + i=19959 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19959 + + + 1 + + + + LiveValues + + i=19964 + i=19966 + i=58 + i=78 + i=19903 + + + + ConfiguredDataSetReaders + + i=19965 + i=63 + i=78 + i=19948 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19964 + + + 0 + + + + OperationalDataSetReaders + + i=19967 + i=63 + i=78 + i=19948 + + + + DiagnosticsLevel + + i=68 + i=78 + i=19966 + + + 0 + + + + PubSubDiagnosticsDataSetWriterType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.11 + + i=19982 + i=20013 + i=19677 + + + + Counters + + i=20014 + i=58 + i=78 + i=19968 + + + + FailedDataSetMessages + + i=20015 + i=20016 + i=20017 + i=19725 + i=78 + i=19982 + + + + Active + + i=68 + i=78 + i=20014 + + + + Classification + + i=68 + i=78 + i=20014 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20014 + + + 0 + + + + LiveValues + + i=20019 + i=20021 + i=20023 + i=20025 + i=58 + i=78 + i=19968 + + + + MessageSequenceNumber + + i=20020 + i=63 + i=80 + i=20013 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20019 + + + 2 + + + + StatusCode + + i=20022 + i=63 + i=80 + i=20013 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20021 + + + 2 + + + + MajorVersion + + i=20024 + i=63 + i=80 + i=20013 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20023 + + + 2 + + + + MinorVersion + + i=20026 + i=63 + i=80 + i=20013 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20025 + + + 2 + + + + PubSubDiagnosticsDataSetReaderType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.11/#9.1.11.12 + + i=20041 + i=20072 + i=19677 + + + + Counters + + i=20073 + i=20078 + i=58 + i=78 + i=20027 + + + + FailedDataSetMessages + + i=20074 + i=20075 + i=20076 + i=19725 + i=78 + i=20041 + + + + Active + + i=68 + i=78 + i=20073 + + + + Classification + + i=68 + i=78 + i=20073 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20073 + + + 0 + + + + DecryptionErrors + + i=20079 + i=20080 + i=20081 + i=19725 + i=80 + i=20041 + + + + Active + + i=68 + i=78 + i=20078 + + + + Classification + + i=68 + i=78 + i=20078 + + + 1 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20078 + + + 1 + + + + LiveValues + + i=20083 + i=20085 + i=20087 + i=20089 + i=20091 + i=20093 + i=58 + i=78 + i=20027 + + + + MessageSequenceNumber + + i=20084 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20083 + + + 2 + + + + StatusCode + + i=20086 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20085 + + + 2 + + + + MajorVersion + + i=20088 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20087 + + + 2 + + + + MinorVersion + + i=20090 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20089 + + + 2 + + + + SecurityTokenID + + i=20092 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20091 + + + 2 + + + + TimeToNextTokenID + + i=20094 + i=63 + i=80 + i=20072 + + + + DiagnosticsLevel + + i=68 + i=78 + i=20093 + + + 2 + + + + PubSubStatusEventType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.12/#9.1.12.1 + + i=15545 + i=15546 + i=15547 + i=2130 + + + + ConnectionId + + i=68 + i=78 + i=15535 + + + + GroupId + + i=68 + i=78 + i=15535 + + + + State + + i=68 + i=78 + i=15535 + + + + PubSubTransportLimitsExceedEventType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.12/#9.1.12.2 + + i=15561 + i=15562 + i=15535 + + + + Actual + + i=68 + i=78 + i=15548 + + + + Maximum + + i=68 + i=78 + i=15548 + + + + PubSubCommunicationFailureEventType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.1.12/#9.1.12.3 + + i=15576 + i=15535 + + + + Error + + i=68 + i=78 + i=15563 + + + + UadpWriterGroupMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.1/#9.2.1.1 + + i=21106 + i=21107 + i=21108 + i=21109 + i=21110 + i=17998 + + + + GroupVersion + + i=68 + i=78 + i=21105 + + + + DataSetOrdering + + i=68 + i=78 + i=21105 + + + + NetworkMessageContentMask + + i=68 + i=78 + i=21105 + + + + SamplingOffset + + i=68 + i=80 + i=21105 + + + + PublishingOffset + + i=68 + i=78 + i=21105 + + + + UadpDataSetWriterMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.1/#9.2.1.2 + + i=21112 + i=21113 + i=21114 + i=21115 + i=21096 + + + + DataSetMessageContentMask + + i=68 + i=78 + i=21111 + + + + ConfiguredSize + + i=68 + i=78 + i=21111 + + + + NetworkMessageNumber + + i=68 + i=78 + i=21111 + + + + DataSetOffset + + i=68 + i=78 + i=21111 + + + + UadpDataSetReaderMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.1/#9.2.1.3 + + i=21117 + i=21119 + i=17477 + i=21120 + i=21121 + i=21122 + i=21123 + i=21124 + i=21125 + i=21104 + + + + GroupVersion + + i=68 + i=78 + i=21116 + + + + NetworkMessageNumber + + i=68 + i=78 + i=21116 + + + + DataSetOffset + + i=68 + i=78 + i=21116 + + + + DataSetClassId + + i=68 + i=78 + i=21116 + + + + NetworkMessageContentMask + + i=68 + i=78 + i=21116 + + + + DataSetMessageContentMask + + i=68 + i=78 + i=21116 + + + + PublishingInterval + + i=68 + i=78 + i=21116 + + + + ProcessingOffset + + i=68 + i=78 + i=21116 + + + + ReceiveOffset + + i=68 + i=78 + i=21116 + + + + JsonWriterGroupMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.2/#9.2.2.1 + + i=21127 + i=17998 + + + + NetworkMessageContentMask + + i=68 + i=78 + i=21126 + + + + JsonDataSetWriterMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.2/#9.2.2.2 + + i=21129 + i=21096 + + + + DataSetMessageContentMask + + i=68 + i=78 + i=21128 + + + + JsonDataSetReaderMessageType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.2.2/#9.2.2.3 + + i=21131 + i=21132 + i=21104 + + + + NetworkMessageContentMask + + i=68 + i=78 + i=21130 + + + + DataSetMessageContentMask + + i=68 + i=78 + i=21130 + + + + DatagramConnectionTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.1/#9.3.1.1 + + i=15072 + i=17721 + + + + DiscoveryAddress + + i=15154 + i=21145 + i=78 + i=15064 + + + + NetworkInterface + + i=17579 + i=16309 + i=78 + i=15072 + + + + Selections + + i=68 + i=78 + i=15154 + + + + DatagramWriterGroupTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.1/#9.3.1.2 + + i=21134 + i=21135 + i=17997 + + + + MessageRepeatCount + + i=68 + i=80 + i=21133 + + + + MessageRepeatDelay + + i=68 + i=80 + i=21133 + + + + BrokerConnectionTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.2/#9.3.2.1 + + i=15156 + i=15178 + i=17721 + + + + ResourceUri + + i=68 + i=78 + i=15155 + + + + AuthenticationProfileUri + + i=68 + i=78 + i=15155 + + + + BrokerWriterGroupTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.2/#9.3.2.2 + + i=21137 + i=15246 + i=15247 + i=15249 + i=17997 + + + + QueueName + + i=68 + i=78 + i=21136 + + + + ResourceUri + + i=68 + i=78 + i=21136 + + + + AuthenticationProfileUri + + i=68 + i=78 + i=21136 + + + + RequestedDeliveryGuarantee + + i=68 + i=78 + i=21136 + + + + BrokerDataSetWriterTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.2/#9.3.2.3 + + i=21139 + i=21140 + i=15250 + i=15251 + i=15330 + i=21141 + i=15305 + + + + QueueName + + i=68 + i=78 + i=21138 + + + + MetaDataQueueName + + i=68 + i=78 + i=21138 + + + + ResourceUri + + i=68 + i=78 + i=21138 + + + + AuthenticationProfileUri + + i=68 + i=78 + i=21138 + + + + RequestedDeliveryGuarantee + + i=68 + i=78 + i=21138 + + + + MetaDataUpdateTime + + i=68 + i=78 + i=21138 + + + + BrokerDataSetReaderTransportType + https://reference.opcfoundation.org/v104/Core/docs/Part14/9.3.2/#9.3.2.4 + + i=21143 + i=15334 + i=15419 + i=15420 + i=21144 + i=15319 + + + + QueueName + + i=68 + i=78 + i=21142 + + + + ResourceUri + + i=68 + i=78 + i=21142 + + + + AuthenticationProfileUri + + i=68 + i=78 + i=21142 + + + + RequestedDeliveryGuarantee + + i=68 + i=78 + i=21142 + + + + MetaDataQueueName + + i=68 + i=78 + i=21142 + + + + NetworkAddressType + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.3.1 + + i=21146 + i=58 + + + + NetworkInterface + + i=17582 + i=16309 + i=78 + i=21145 + + + + Selections + + i=68 + i=78 + i=21146 + + + + NetworkAddressUrlType + https://reference.opcfoundation.org/v104/Core/docs/Part14/A.3.2 + + i=21149 + i=21145 + + + + Url + + i=63 + i=78 + i=21147 + + + + AliasNameType + https://reference.opcfoundation.org/v104/Core/docs/Part17/6.2 + + i=58 + + + + AliasNameCategoryType + https://reference.opcfoundation.org/v104/Core/docs/Part17/6.3.1 + + i=23457 + i=23458 + i=23462 + i=61 + + + + <Alias> + + i=23455 + i=11508 + i=23456 + + + + <SubAliasNameCategories> + + i=23459 + i=23456 + i=11508 + i=23456 + + + + FindAlias + + i=23460 + i=23461 + i=78 + i=23458 + + + + InputArguments + + i=68 + i=78 + i=23459 + + + + + + i=297 + + + + AliasNameSearchPattern + + i=12 + + -1 + + + + + + + i=297 + + + + ReferenceTypeFilter + + i=17 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=23459 + + + + + + i=297 + + + + AliasNodeList + + i=23468 + + 1 + + 0 + + + + + + + + + FindAlias + https://reference.opcfoundation.org/v104/Core/docs/Part17/6.3.2 + + i=23463 + i=23464 + i=78 + i=23456 + + + + InputArguments + + i=68 + i=78 + i=23462 + + + + + + i=297 + + + + AliasNameSearchPattern + + i=12 + + -1 + + + + + + + i=297 + + + + ReferenceTypeFilter + + i=17 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=78 + i=23462 + + + + + + i=297 + + + + AliasNodeList + + i=23468 + + 1 + + 0 + + + + + + + + + AliasNameDataType + https://reference.opcfoundation.org/v104/Core/docs/Part17/7.2 + + i=22 + + + + + + + + AliasFor + https://reference.opcfoundation.org/v104/Core/docs/Part17/8.2 + + i=32 + + HasAlias + + + Aliases + https://reference.opcfoundation.org/v104/Core/docs/Part17/9.2 + + i=23476 + i=85 + i=23456 + + + + FindAlias + + i=23477 + i=23478 + i=23470 + + + + InputArguments + + i=68 + i=23476 + + + + + + i=297 + + + + AliasNameSearchPattern + + i=12 + + -1 + + + + + + + i=297 + + + + ReferenceTypeFilter + + i=17 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=23476 + + + + + + i=297 + + + + AliasNodeList + + i=23468 + + 1 + + 0 + + + + + + + + + TagVariables + https://reference.opcfoundation.org/v104/Core/docs/Part17/9.3 + + i=23485 + i=23470 + i=23456 + + + + FindAlias + + i=23486 + i=23487 + i=23479 + + + + InputArguments + + i=68 + i=23485 + + + + + + i=297 + + + + AliasNameSearchPattern + + i=12 + + -1 + + + + + + + i=297 + + + + ReferenceTypeFilter + + i=17 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=23485 + + + + + + i=297 + + + + AliasNodeList + + i=23468 + + 1 + + 0 + + + + + + + + + Topics + https://reference.opcfoundation.org/v104/Core/docs/Part17/9.4 + + i=23494 + i=23470 + i=23456 + + + + FindAlias + + i=23495 + i=23496 + i=23488 + + + + InputArguments + + i=68 + i=23494 + + + + + + i=297 + + + + AliasNameSearchPattern + + i=12 + + -1 + + + + + + + i=297 + + + + ReferenceTypeFilter + + i=17 + + -1 + + + + + + + + + OutputArguments + + i=68 + i=23494 + + + + + + i=297 + + + + AliasNodeList + + i=23468 + + 1 + + 0 + + + + + + + + + MultiStateDictionaryEntryDiscreteBaseType + https://reference.opcfoundation.org/v104/Core/docs/Part19/7.1 + + i=19082 + i=19083 + i=11238 + + + + EnumDictionaryEntries + + i=68 + i=78 + i=19077 + + + + ValueAsDictionaryEntries + + i=68 + i=80 + i=19077 + + + + MultiStateDictionaryEntryDiscreteType + https://reference.opcfoundation.org/v104/Core/docs/Part19/7.2 + + i=19090 + i=19077 + + + + ValueAsDictionaryEntries + + i=68 + i=78 + i=19084 + + + + IIetfBaseNetworkInterfaceType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.1 + + i=24149 + i=24150 + i=24151 + i=24152 + i=17602 + + + + AdminStatus + + i=63 + i=78 + i=24148 + + + + OperStatus + + i=63 + i=78 + i=24148 + + + + PhysAddress + + i=63 + i=80 + i=24148 + + + + Speed + + i=24157 + i=17497 + i=78 + i=24148 + + + + EngineeringUnits + + i=68 + i=78 + i=24152 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4337968 + + en + bit/s + + + en + bit per second + + + + + + + + IIeeeBaseEthernetPortType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.2 + + i=24159 + i=24165 + i=24166 + i=17602 + + + + Speed + + i=24164 + i=17497 + i=78 + i=24158 + + + + EngineeringUnits + + i=68 + i=78 + i=24159 + + + + + i=888 + + + + http://www.opcfoundation.org/UA/units/un/cefact + 4534832 + + en + Mbit/s + + + en + megabit per second + + + + + + + + Duplex + + i=63 + i=78 + i=24158 + + + + MaxFrameLength + + i=63 + i=78 + i=24158 + + + + IIeeeAutoNegotiationStatusType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.3 + + i=24234 + i=17602 + + + + NegotiationStatus + + i=63 + i=78 + i=24233 + + + + IBaseEthernetCapabilitiesType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.4 + + i=24168 + i=17602 + + + + VlanTagCapable + + i=63 + i=78 + i=24167 + + + + ISrClassType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.5 + + i=24170 + i=24171 + i=24172 + i=17602 + + + + Id + + i=63 + i=78 + i=24169 + + + + Priority + + i=63 + i=78 + i=24169 + + + + Vid + + i=63 + i=78 + i=24169 + + + + IIeeeBaseTsnStreamType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.6 + + i=24174 + i=24175 + i=24176 + i=24177 + i=24178 + i=17602 + + + + StreamId + + i=63 + i=78 + i=24173 + + + + StreamName + + i=63 + i=78 + i=24173 + + + + State + + i=63 + i=78 + i=24173 + + + + AccumulatedLatency + + i=63 + i=80 + i=24173 + + + + SrClassId + + i=63 + i=80 + i=24173 + + + + IIeeeBaseTsnTrafficSpecificationType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.7 + + i=24180 + i=24181 + i=24182 + i=17602 + + + + MaxIntervalFrames + + i=63 + i=78 + i=24179 + + + + MaxFrameSize + + i=63 + i=78 + i=24179 + + + + Interval + + i=63 + i=78 + i=24179 + + + + IIeeeBaseTsnStatusStreamType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.8 + + i=24184 + i=24185 + i=24186 + i=24187 + i=17602 + + + + TalkerStatus + + i=63 + i=80 + i=24183 + + + + ListenerStatus + + i=63 + i=80 + i=24183 + + + + FailureCode + + i=63 + i=78 + i=24183 + + + + FailureSystemIdentifier + + i=63 + i=78 + i=24183 + + + + IIeeeTsnInterfaceConfigurationType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.9 + + i=24189 + i=24190 + i=17602 + + + + MacAddress + + i=63 + i=78 + i=24188 + + + + InterfaceName + + i=63 + i=80 + i=24188 + + + + IIeeeTsnInterfaceConfigurationTalkerType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.10 + + i=24194 + i=24188 + + + + TimeAwareOffset + + i=63 + i=80 + i=24191 + + + + IIeeeTsnInterfaceConfigurationListenerType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.11 + + i=24198 + i=24188 + + + + ReceiveOffset + + i=63 + i=80 + i=24195 + + + + IIeeeTsnMacAddressType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.12 + + i=24200 + i=24201 + i=17602 + + + + DestinationAddress + + i=63 + i=78 + i=24199 + + + + SourceAddress + + i=63 + i=80 + i=24199 + + + + IIeeeTsnVlanTagType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.13 + + i=24203 + i=24204 + i=17602 + + + + VlanId + + i=63 + i=78 + i=24202 + + + + PriorityCodePoint + + i=63 + i=78 + i=24202 + + + + IPriorityMappingEntryType + https://reference.opcfoundation.org/v104/Part22/docs/5.2.14 + + i=24206 + i=24207 + i=24208 + i=24209 + i=17602 + + + + MappingUri + + i=63 + i=78 + i=24205 + + + + PriorityLabel + + i=63 + i=78 + i=24205 + + + + PriorityValue_PCP + + i=63 + i=80 + i=24205 + + + + PriorityValue_DSCP + + i=63 + i=80 + i=24205 + + + + Duplex + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.1 + + i=24235 + i=29 + + + + Full duplex. + + + Half duplex. + + + Link is currently disconnected or initializing. + + + + + EnumValues + + i=68 + i=24210 + + + + + + i=7616 + + + + 0 + + Full + + + Full duplex. + + + + + + + i=7616 + + + + 1 + + Half + + + Half duplex. + + + + + + + i=7616 + + + + 2 + + Unknown + + + Link is currently disconnected or initializing. + + + + + + + + + InterfaceAdminStatus + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.2 + + i=24236 + i=29 + + + + Ready to pass packets. + + + Not ready to pass packets and not in some test mode. + + + In some test mode. + + + + + EnumValues + + i=68 + i=24212 + + + + + + i=7616 + + + + 0 + + Up + + + Ready to pass packets. + + + + + + + i=7616 + + + + 1 + + Down + + + Not ready to pass packets and not in some test mode. + + + + + + + i=7616 + + + + 2 + + Testing + + + In some test mode. + + + + + + + + + InterfaceOperStatus + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.3 + + i=24237 + i=29 + + + + Ready to pass packets. + + + The interface does not pass any packets. + + + In some test mode. No operational packets can be passed. + + + Status cannot be determined for some reason. + + + Waiting for some external event. + + + Some component (typically hardware) is missing. + + + Down due to state of lower-layer interface(s). + + + + + EnumValues + + i=68 + i=24214 + + + + + + i=7616 + + + + 0 + + Up + + + Ready to pass packets. + + + + + + + i=7616 + + + + 1 + + Down + + + The interface does not pass any packets. + + + + + + + i=7616 + + + + 2 + + Testing + + + In some test mode. No operational packets can be passed. + + + + + + + i=7616 + + + + 3 + + Unknown + + + Status cannot be determined for some reason. + + + + + + + i=7616 + + + + 4 + + Dormant + + + Waiting for some external event. + + + + + + + i=7616 + + + + 5 + + NotPresent + + + Some component (typically hardware) is missing. + + + + + + + i=7616 + + + + 6 + + LowerLayerDown + + + Down due to state of lower-layer interface(s). + + + + + + + + + NegotiationStatus + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.4 + + i=24238 + i=29 + + + + The auto-negotiation protocol is running and negotiation is currently in-progress. + + + The auto-negotiation protocol has completed successfully. + + + The auto-negotiation protocol has failed. + + + The auto-negotiation status is not currently known, this could be because it is still negotiating or the protocol cannot run (e.g., if no medium is present). + + + No auto-negotiation is executed. The auto-negotiation function is either not supported on this interface or has not been enabled. + + + + + EnumValues + + i=68 + i=24216 + + + + + + i=7616 + + + + 0 + + InProgress + + + The auto-negotiation protocol is running and negotiation is currently in-progress. + + + + + + + i=7616 + + + + 1 + + Complete + + + The auto-negotiation protocol has completed successfully. + + + + + + + i=7616 + + + + 2 + + Failed + + + The auto-negotiation protocol has failed. + + + + + + + i=7616 + + + + 3 + + Unknown + + + The auto-negotiation status is not currently known, this could be because it is still negotiating or the protocol cannot run (e.g., if no medium is present). + + + + + + + i=7616 + + + + 4 + + NoNegotiation + + + No auto-negotiation is executed. The auto-negotiation function is either not supported on this interface or has not been enabled. + + + + + + + + + TsnFailureCode + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.5 + + i=24239 + i=29 + + + + No failure + + + Insufficient bandwidth + + + Insufficient bridge resources + + + Insufficient bandwidth for Traffic Class + + + StreamID in use by another Talker + + + Stream destination address already in use + + + Stream pre-empted by higher rank + + + Reported latency has changed + + + Egress port is not AVBCapable + + + Use a different destination address + + + Out of MSRP resources + + + Out of MMRP resources + + + Cannot store destination address + + + Requested priority is not an SR Class priority + + + MaxFrameSize is too large for media + + + MaxFanInPorts limit has been reached + + + Changes in FirstValue for a registered StreamID + + + VLAN is blocked on this egress port (Registration Forbidden) + + + VLAN tagging is disabled on this egress port (untagged set) + + + SR class priority mismatch + + + Enhanced feature cannot be propagated to original Port + + + MaxLatency exceeded + + + Nearest Bridge cannot provide network identification for stream transformation + + + Stream transformation not supported + + + Stream identification type not supported for stream transformation + + + Enhanced feature cannot be supported without a CNC + + + + + EnumValues + + i=68 + i=24218 + + + + + + i=7616 + + + + 0 + + NoFailure + + + No failure + + + + + + + i=7616 + + + + 1 + + InsufficientBandwidth + + + Insufficient bandwidth + + + + + + + i=7616 + + + + 2 + + InsufficientResources + + + Insufficient bridge resources + + + + + + + i=7616 + + + + 3 + + InsufficientTrafficClassBandwidth + + + Insufficient bandwidth for Traffic Class + + + + + + + i=7616 + + + + 4 + + StreamIdInUse + + + StreamID in use by another Talker + + + + + + + i=7616 + + + + 5 + + StreamDestinationAddressInUse + + + Stream destination address already in use + + + + + + + i=7616 + + + + 6 + + StreamPreemptedByHigherRank + + + Stream pre-empted by higher rank + + + + + + + i=7616 + + + + 7 + + LatencyHasChanged + + + Reported latency has changed + + + + + + + i=7616 + + + + 8 + + EgressPortNotAvbCapable + + + Egress port is not AVBCapable + + + + + + + i=7616 + + + + 9 + + UseDifferentDestinationAddress + + + Use a different destination address + + + + + + + i=7616 + + + + 10 + + OutOfMsrpResources + + + Out of MSRP resources + + + + + + + i=7616 + + + + 11 + + OutOfMmrpResources + + + Out of MMRP resources + + + + + + + i=7616 + + + + 12 + + CannotStoreDestinationAddress + + + Cannot store destination address + + + + + + + i=7616 + + + + 13 + + PriorityIsNotAnSrcClass + + + Requested priority is not an SR Class priority + + + + + + + i=7616 + + + + 14 + + MaxFrameSizeTooLarge + + + MaxFrameSize is too large for media + + + + + + + i=7616 + + + + 15 + + MaxFanInPortsLimitReached + + + MaxFanInPorts limit has been reached + + + + + + + i=7616 + + + + 16 + + FirstValueChangedForStreamId + + + Changes in FirstValue for a registered StreamID + + + + + + + i=7616 + + + + 17 + + VlanBlockedOnEgress + + + VLAN is blocked on this egress port (Registration Forbidden) + + + + + + + i=7616 + + + + 18 + + VlanTaggingDisabledOnEgress + + + VLAN tagging is disabled on this egress port (untagged set) + + + + + + + i=7616 + + + + 19 + + SrClassPriorityMismatch + + + SR class priority mismatch + + + + + + + i=7616 + + + + 20 + + FeatureNotPropagated + + + Enhanced feature cannot be propagated to original Port + + + + + + + i=7616 + + + + 21 + + MaxLatencyExceeded + + + MaxLatency exceeded + + + + + + + i=7616 + + + + 22 + + BridgeDoesNotProvideNetworkId + + + Nearest Bridge cannot provide network identification for stream transformation + + + + + + + i=7616 + + + + 23 + + StreamTransformNotSupported + + + Stream transformation not supported + + + + + + + i=7616 + + + + 24 + + StreamIdTypeNotSupported + + + Stream identification type not supported for stream transformation + + + + + + + i=7616 + + + + 25 + + FeatureNotSupported + + + Enhanced feature cannot be supported without a CNC + + + + + + + + + TsnStreamState + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.6 + + i=24240 + i=29 + + + + The related TSN Stream is currently disabled. + + + The related TSN Stream is in the process of receiving configuration parameters from the TSN Control Layer. + + + The related TSN Stream has successfully received and applied the configuration from the TSN Control Layer. The related TSN Stream is not fully operational as long as local preconditions (e.g. synchronization state) are not valid. + + + The related TSN Stream object is configured and all other required preconditions (e.g. synchronization state) for sending / receiving data are valid. + + + The related TSN Stream object is in an error state. + + + + + EnumValues + + i=68 + i=24220 + + + + + + i=7616 + + + + 0 + + Disabled + + + The related TSN Stream is currently disabled. + + + + + + + i=7616 + + + + 1 + + Configuring + + + The related TSN Stream is in the process of receiving configuration parameters from the TSN Control Layer. + + + + + + + i=7616 + + + + 2 + + Ready + + + The related TSN Stream has successfully received and applied the configuration from the TSN Control Layer. The related TSN Stream is not fully operational as long as local preconditions (e.g. synchronization state) are not valid. + + + + + + + i=7616 + + + + 3 + + Operational + + + The related TSN Stream object is configured and all other required preconditions (e.g. synchronization state) for sending / receiving data are valid. + + + + + + + i=7616 + + + + 4 + + Error + + + The related TSN Stream object is in an error state. + + + + + + + + + TsnTalkerStatus + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.7 + + i=24241 + i=29 + + + + No Talker detected. + + + Talker ready (configured). + + + Talker failed. + + + + + EnumValues + + i=68 + i=24222 + + + + + + i=7616 + + + + 0 + + None + + + No Talker detected. + + + + + + + i=7616 + + + + 1 + + Ready + + + Talker ready (configured). + + + + + + + i=7616 + + + + 2 + + Failed + + + Talker failed. + + + + + + + + + TsnListenerStatus + https://reference.opcfoundation.org/v104/Part22/docs/5.3.1/#5.3.1.8 + + i=24242 + i=29 + + + + No Listener detected. + + + Listener ready (configured). + + + One or more Listeners ready, and one or more Listeners failed. + + + Listener failed. + + + + + EnumValues + + i=68 + i=24224 + + + + + + i=7616 + + + + 0 + + None + + + No Listener detected. + + + + + + + i=7616 + + + + 1 + + Ready + + + Listener ready (configured). + + + + + + + i=7616 + + + + 2 + + PartialFailed + + + One or more Listeners ready, and one or more Listeners failed. + + + + + + + i=7616 + + + + 3 + + Failed + + + Listener failed. + + + + + + + + + UnsignedRationalNumber + https://reference.opcfoundation.org/v104/Part22/docs/5.3.2/#5.3.2.1 + + i=22 + + + + + + + + Resources + https://reference.opcfoundation.org/v104/Part22/docs/5.4.1 + + i=2253 + i=61 + + + + Communication + https://reference.opcfoundation.org/v104/Part22/docs/5.4.2 + + i=24226 + i=61 + + + + MappingTables + https://reference.opcfoundation.org/v104/Part22/docs/5.4.3 + + i=24227 + i=61 + + + + NetworkInterfaces + https://reference.opcfoundation.org/v104/Part22/docs/5.4.4 + + i=24227 + i=61 + + + + Streams + https://reference.opcfoundation.org/v104/Part22/docs/5.4.5 + + i=24227 + i=61 + + + + TalkerStreams + https://reference.opcfoundation.org/v104/Part22/docs/5.4.6 + + i=24230 + i=61 + + + + ListenerStreams + https://reference.opcfoundation.org/v104/Part22/docs/5.4.7 + + i=24230 + i=61 + + + + IdType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.2.3 + + i=7591 + i=29 + + + + + + + + + + EnumStrings + + i=68 + i=256 + + + + + Numeric + + + String + + + Guid + + + Opaque + + + + + + NodeClass + https://reference.opcfoundation.org/v104/Core/docs/Part3/5.2.3 + + i=11878 + i=29 + + + + + + + + + + + + + + + EnumValues + + i=68 + i=257 + + + + + + i=7616 + + + + 0 + + Unspecified + + + + + + + i=7616 + + + + 1 + + Object + + + + + + + i=7616 + + + + 2 + + Variable + + + + + + + i=7616 + + + + 4 + + Method + + + + + + + i=7616 + + + + 8 + + ObjectType + + + + + + + i=7616 + + + + 16 + + VariableType + + + + + + + i=7616 + + + + 32 + + ReferenceType + + + + + + + i=7616 + + + + 64 + + DataType + + + + + + + i=7616 + + + + 128 + + View + + + + + + + + + PermissionType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.55 + + i=15030 + i=7 + + + + + + + + + + + + + + + + + + + + + + + OptionSetValues + + i=68 + i=94 + + + + + Browse + + + ReadRolePermissions + + + WriteAttribute + + + WriteRolePermissions + + + WriteHistorizing + + + Read + + + Write + + + ReadHistory + + + InsertHistory + + + ModifyHistory + + + DeleteHistory + + + ReceiveEvents + + + Call + + + AddReference + + + RemoveReference + + + DeleteNode + + + AddNode + + + + + + AccessLevelType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.57 + + i=15032 + i=3 + + + + + + + + + + + + + OptionSetValues + + i=68 + i=15031 + + + + + CurrentRead + + + CurrentWrite + + + HistoryRead + + + HistoryWrite + + + SemanticChange + + + StatusWrite + + + TimestampWrite + + + + + + AccessLevelExType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.58 + + i=15407 + i=7 + + + + + + + + + + + + + + + + + OptionSetValues + + i=68 + i=15406 + + + + + CurrentRead + + + CurrentWrite + + + HistoryRead + + + HistoryWrite + + + SemanticChange + + + StatusWrite + + + TimestampWrite + + + Reserved + + + NonatomicRead + + + NonatomicWrite + + + WriteFullArrayOnly + + + NoSubDataTypes + + + + + + EventNotifierType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.59 + + i=15034 + i=3 + + + + + + + + + OptionSetValues + + i=68 + i=15033 + + + + + SubscribeToEvents + + + Reserved + + + HistoryRead + + + HistoryWrite + + + + + + AccessRestrictionType + + i=15035 + i=5 + + + + + + + + + + OptionSetValues + + i=68 + i=95 + + + + + SigningRequired + + + EncryptionRequired + + + SessionRequired + + + ApplyRestrictionsToBrowse + + + + + + RolePermissionType + https://reference.opcfoundation.org/v104/Core/docs/Part3/5.2.9 + + i=22 + + + + + + + + DataTypeDefinition + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=22 + + + + + StructureType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.49 + + i=14528 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=98 + + + + + Structure + + + StructureWithOptionalFields + + + Union + + + StructureWithSubtypedValues + + + UnionWithSubtypedValues + + + + + + StructureField + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.51 + + i=22 + + + + + + + + + + + + + StructureDefinition + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.49 + + i=97 + + + + + + + + + + EnumDefinition + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.50 + + i=97 + + + + + + + Node + https://reference.opcfoundation.org/v104/Core/docs/Part5/D.5.1 + + i=22 + + + + + + + + + + + + + + + + + InstanceNode + + i=258 + + + + + TypeNode + + i=258 + + + + + ObjectNode + + i=11879 + + + + + + + ObjectTypeNode + + i=11880 + + + + + + + VariableNode + + i=11879 + + + + + + + + + + + + + + + VariableTypeNode + + i=11880 + + + + + + + + + + + ReferenceTypeNode + + i=11880 + + + + + + + + + MethodNode + + i=11879 + + + + + + + + ViewNode + + i=11879 + + + + + + + + DataTypeNode + + i=11880 + + + + + + + + ReferenceNode + + i=22 + + + + + + + + + Argument + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.6 + + i=22 + + + + + + + + + + + EnumValueType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.2 + + i=22 + + + + + + + + + EnumField + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.52 + + i=7594 + + + + + + + OptionSet + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.41 + + i=22 + + + + + + + + NormalizedString + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.46 + + i=12 + + + + DecimalString + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.44 + + i=12 + + + + DurationString + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.45 + + i=12 + + + + TimeString + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.47 + + i=12 + + + + DateString + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.43 + + i=12 + + + + Duration + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.13 + + i=11 + + + + UtcTime + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.38 + + i=13 + + + + Time + + i=12 + + + + Date + + i=13 + + + + LocaleId + https://reference.opcfoundation.org/v104/Core/docs/Part9/A.1.3 + + i=12 + + + + TimeZoneDataType + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.28 + + i=22 + + + + + + + + Index + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.13 + + i=7 + + + + IntegerId + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.14 + + i=7 + + + + ApplicationType + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.1 + + i=7597 + i=29 + + + + + + + + + + EnumStrings + + i=68 + i=307 + + + + + Server + + + Client + + + ClientAndServer + + + DiscoveryServer + + + + + + ApplicationDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.1 + + i=22 + + + + + + + + + + + + + RequestHeader + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.28 + + i=22 + + + + + + + + + + + + + ResponseHeader + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.29 + + i=22 + + + + + + + + + + + + VersionTime + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.38 + + i=7 + + + + ServiceFault + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.30 + + i=22 + + + + + + + SessionlessInvokeRequestType + + i=22 + + + + + + + + + + + SessionlessInvokeResponseType + + i=22 + + + + + + + + + FindServersRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.2/#5.4.2.2 + + i=22 + + + + + + + + + + FindServersResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.2/#5.4.2.2 + + i=22 + + + + + + + + ServerOnNetwork + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.3/#5.4.3.2 + + i=22 + + + + + + + + + + FindServersOnNetworkRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.3/#5.4.3.2 + + i=22 + + + + + + + + + + FindServersOnNetworkResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.3/#5.4.3.2 + + i=22 + + + + + + + + + ApplicationInstanceCertificate + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.2 + + i=15 + + + + MessageSecurityMode + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.15 + + i=7595 + i=29 + + + + + + + + + + EnumStrings + + i=68 + i=302 + + + + + Invalid + + + None + + + Sign + + + SignAndEncrypt + + + + + + UserTokenType + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.37 + + i=7596 + i=29 + + + + + + + + + + EnumStrings + + i=68 + i=303 + + + + + Anonymous + + + UserName + + + Certificate + + + IssuedToken + + + + + + UserTokenPolicy + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.37 + + i=22 + + + + + + + + + + + EndpointDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.10 + + i=22 + + + + + + + + + + + + + + GetEndpointsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.4/#5.4.4.2 + + i=22 + + + + + + + + + + GetEndpointsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.4/#5.4.4.2 + + i=22 + + + + + + + + RegisteredServer + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.27 + + i=22 + + + + + + + + + + + + + + RegisterServerRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.5/#5.4.5.2 + + i=22 + + + + + + + + RegisterServerResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.5/#5.4.5.2 + + i=22 + + + + + + + DiscoveryConfiguration + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.9.1 + + i=22 + + + + + MdnsDiscoveryConfiguration + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.9.2 + + i=12890 + + + + + + + + RegisterServer2Request + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.6/#5.4.6.2 + + i=22 + + + + + + + + + RegisterServer2Response + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.4.6/#5.4.6.2 + + i=22 + + + + + + + + + SecurityTokenRequestType + + i=7598 + i=29 + + + + + + + + EnumStrings + + i=68 + i=315 + + + + + Issue + + + Renew + + + + + + ChannelSecurityToken + + i=22 + + + + + + + + + + OpenSecureChannelRequest + + i=22 + + + + + + + + + + + + OpenSecureChannelResponse + + i=22 + + + + + + + + + + CloseSecureChannelRequest + + i=22 + + + + + + + CloseSecureChannelResponse + + i=22 + + + + + + + SignedSoftwareCertificate + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.33 + + i=22 + + + + + + + + SessionAuthenticationToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.31 + + i=17 + + + + SignatureData + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.32 + + i=22 + + + + + + + + CreateSessionRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.2/#5.6.2.2 + + i=22 + + + + + + + + + + + + + + + CreateSessionResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.2/#5.6.2.2 + + i=22 + + + + + + + + + + + + + + + + UserIdentityToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.1 + + i=22 + + + + + + + AnonymousIdentityToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.3 + + i=316 + + + + + UserNameIdentityToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.4 + + i=316 + + + + + + + + + X509IdentityToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.5 + + i=316 + + + + + + + IssuedIdentityToken + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.6 + + i=316 + + + + + + + + RsaEncryptedSecret + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.36.2/#7.36.2.4 + + i=24 + + + + EccEncryptedSecret + + i=24 + + + + ActivateSessionRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.3/#5.6.3.2 + + i=22 + + + + + + + + + + + + ActivateSessionResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.3/#5.6.3.2 + + i=22 + + + + + + + + + + CloseSessionRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.4/#5.6.4.2 + + i=22 + + + + + + + + CloseSessionResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.4/#5.6.4.2 + + i=22 + + + + + + + CancelRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.5/#5.6.5.2 + + i=22 + + + + + + + + CancelResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.6.5/#5.6.5.2 + + i=22 + + + + + + + + NodeAttributesMask + + i=11881 + i=29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + EnumValues + + i=68 + i=348 + + + + + + i=7616 + + + + 0 + + None + + + + + + + i=7616 + + + + 1 + + AccessLevel + + + + + + + i=7616 + + + + 2 + + ArrayDimensions + + + + + + + i=7616 + + + + 4 + + BrowseName + + + + + + + i=7616 + + + + 8 + + ContainsNoLoops + + + + + + + i=7616 + + + + 16 + + DataType + + + + + + + i=7616 + + + + 32 + + Description + + + + + + + i=7616 + + + + 64 + + DisplayName + + + + + + + i=7616 + + + + 128 + + EventNotifier + + + + + + + i=7616 + + + + 256 + + Executable + + + + + + + i=7616 + + + + 512 + + Historizing + + + + + + + i=7616 + + + + 1024 + + InverseName + + + + + + + i=7616 + + + + 2048 + + IsAbstract + + + + + + + i=7616 + + + + 4096 + + MinimumSamplingInterval + + + + + + + i=7616 + + + + 8192 + + NodeClass + + + + + + + i=7616 + + + + 16384 + + NodeId + + + + + + + i=7616 + + + + 32768 + + Symmetric + + + + + + + i=7616 + + + + 65536 + + UserAccessLevel + + + + + + + i=7616 + + + + 131072 + + UserExecutable + + + + + + + i=7616 + + + + 262144 + + UserWriteMask + + + + + + + i=7616 + + + + 524288 + + ValueRank + + + + + + + i=7616 + + + + 1048576 + + WriteMask + + + + + + + i=7616 + + + + 2097152 + + Value + + + + + + + i=7616 + + + + 4194304 + + DataTypeDefinition + + + + + + + i=7616 + + + + 8388608 + + RolePermissions + + + + + + + i=7616 + + + + 16777216 + + AccessRestrictions + + + + + + + i=7616 + + + + 33554431 + + All + + + + + + + i=7616 + + + + 26501220 + + BaseNode + + + + + + + i=7616 + + + + 26501348 + + Object + + + + + + + i=7616 + + + + 26503268 + + ObjectType + + + + + + + i=7616 + + + + 26571383 + + Variable + + + + + + + i=7616 + + + + 28600438 + + VariableType + + + + + + + i=7616 + + + + 26632548 + + Method + + + + + + + i=7616 + + + + 26537060 + + ReferenceType + + + + + + + i=7616 + + + + 26501356 + + View + + + + + + + + + NodeAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.1 + + i=22 + + + + + + + + + + + ObjectAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.2 + + i=349 + + + + + + + VariableAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.3 + + i=349 + + + + + + + + + + + + + + MethodAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.4 + + i=349 + + + + + + + + ObjectTypeAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.5 + + i=349 + + + + + + + VariableTypeAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.6 + + i=349 + + + + + + + + + + + ReferenceTypeAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.7 + + i=349 + + + + + + + + + DataTypeAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.8 + + i=349 + + + + + + + ViewAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.9 + + i=349 + + + + + + + + GenericAttributeValue + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.10 + + i=22 + + + + + + + + GenericAttributes + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.19.10 + + i=349 + + + + + + + AddNodesItem + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.2/#5.7.2.2 + + i=22 + + + + + + + + + + + + + AddNodesResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.2/#5.7.2.2 + + i=22 + + + + + + + + AddNodesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.2/#5.7.2.2 + + i=22 + + + + + + + + AddNodesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.2/#5.7.2.2 + + i=22 + + + + + + + + + AddReferencesItem + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.3/#5.7.3.2 + + i=22 + + + + + + + + + + + + AddReferencesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.3/#5.7.3.2 + + i=22 + + + + + + + + AddReferencesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.3/#5.7.3.2 + + i=22 + + + + + + + + + DeleteNodesItem + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.4/#5.7.4.2 + + i=22 + + + + + + + + DeleteNodesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.4/#5.7.4.2 + + i=22 + + + + + + + + DeleteNodesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.4/#5.7.4.2 + + i=22 + + + + + + + + + DeleteReferencesItem + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.5/#5.7.5.1 + + i=22 + + + + + + + + + + + DeleteReferencesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.5/#5.7.5.1 + + i=22 + + + + + + + + DeleteReferencesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.7.5/#5.7.5.1 + + i=22 + + + + + + + + + AttributeWriteMask + https://reference.opcfoundation.org/v104/Core/docs/Part3/8.60 + + i=15036 + i=7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OptionSetValues + + i=68 + i=347 + + + + + AccessLevel + + + ArrayDimensions + + + BrowseName + + + ContainsNoLoops + + + DataType + + + Description + + + DisplayName + + + EventNotifier + + + Executable + + + Historizing + + + InverseName + + + IsAbstract + + + MinimumSamplingInterval + + + NodeClass + + + NodeId + + + Symmetric + + + UserAccessLevel + + + UserExecutable + + + UserWriteMask + + + ValueRank + + + WriteMask + + + ValueForVariableType + + + DataTypeDefinition + + + RolePermissions + + + AccessRestrictions + + + AccessLevelEx + + + + + + BrowseDirection + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.2/#5.8.2.2 + + i=7603 + i=29 + + + + + + + + + + EnumStrings + + i=68 + i=510 + + + + + Forward + + + Inverse + + + Both + + + Invalid + + + + + + ViewDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.39 + + i=22 + + + + + + + + + BrowseDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.2/#5.8.2.2 + + i=22 + + + + + + + + + + + + BrowseResultMask + + i=11883 + i=29 + + + + + + + + + + + + + + + + EnumValues + + i=68 + i=517 + + + + + + i=7616 + + + + 0 + + None + + + + + + + i=7616 + + + + 1 + + ReferenceTypeId + + + + + + + i=7616 + + + + 2 + + IsForward + + + + + + + i=7616 + + + + 4 + + NodeClass + + + + + + + i=7616 + + + + 8 + + BrowseName + + + + + + + i=7616 + + + + 16 + + DisplayName + + + + + + + i=7616 + + + + 32 + + TypeDefinition + + + + + + + i=7616 + + + + 63 + + All + + + + + + + i=7616 + + + + 3 + + ReferenceTypeInfo + + + + + + + i=7616 + + + + 60 + + TargetInfo + + + + + + + + + ReferenceDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.25 + + i=22 + + + + + + + + + + + + + ContinuationPoint + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.6 + + i=15 + + + + BrowseResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.3 + + i=22 + + + + + + + + + BrowseRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.2/#5.8.2.2 + + i=22 + + + + + + + + + + BrowseResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.2/#5.8.2.2 + + i=22 + + + + + + + + + BrowseNextRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.3/#5.8.3.2 + + i=22 + + + + + + + + + BrowseNextResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.3/#5.8.3.2 + + i=22 + + + + + + + + + RelativePathElement + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.26 + + i=22 + + + + + + + + + + RelativePath + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.26 + + i=22 + + + + + + + BrowsePath + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.4/#5.8.4.2 + + i=22 + + + + + + + + BrowsePathTarget + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.4/#5.8.4.2 + + i=22 + + + + + + + + BrowsePathResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.4/#5.8.4.2 + + i=22 + + + + + + + + TranslateBrowsePathsToNodeIdsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.4/#5.8.4.2 + + i=22 + + + + + + + + TranslateBrowsePathsToNodeIdsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.4/#5.8.4.2 + + i=22 + + + + + + + + + RegisterNodesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.5/#5.8.5.2 + + i=22 + + + + + + + + RegisterNodesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.5/#5.8.5.2 + + i=22 + + + + + + + + UnregisterNodesRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.6/#5.8.6.2 + + i=22 + + + + + + + + UnregisterNodesResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.8.6/#5.8.6.2 + + i=22 + + + + + + + Counter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.5 + + i=7 + + + + NumericRange + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.22 + + i=12 + + + + EndpointConfiguration + + i=22 + + + + + + + + + + + + + + + QueryDataDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.3/#5.9.3.1 + + i=22 + + + + + + + + + NodeTypeDescription + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.3/#5.9.3.1 + + i=22 + + + + + + + + + FilterOperator + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.3 + + i=7605 + i=29 + + + + + + + + + + + + + + + + + + + + + + + + EnumStrings + + i=68 + i=576 + + + + + Equals + + + IsNull + + + GreaterThan + + + LessThan + + + GreaterThanOrEqual + + + LessThanOrEqual + + + Like + + + Not + + + Between + + + InList + + + And + + + Or + + + Cast + + + InView + + + OfType + + + RelatedTo + + + BitwiseAnd + + + BitwiseOr + + + + + + QueryDataSet + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.23 + + i=22 + + + + + + + + + NodeReference + + i=22 + + + + + + + + + + ContentFilterElement + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.1 + + i=22 + + + + + + + + ContentFilter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.1 + + i=22 + + + + + + + FilterOperand + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.4 + + i=22 + + + + + ElementOperand + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.4/#7.4.4.2 + + i=589 + + + + + + + LiteralOperand + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.4/#7.4.4.3 + + i=589 + + + + + + + AttributeOperand + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.4/#7.4.4.4 + + i=589 + + + + + + + + + + + SimpleAttributeOperand + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.4/#7.4.4.5 + + i=589 + + + + + + + + + + ContentFilterElementResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.2 + + i=22 + + + + + + + + + ContentFilterResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.4.2 + + i=22 + + + + + + + + ParsingResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.3/#5.9.3.1 + + i=22 + + + + + + + + + QueryFirstRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.3/#5.9.3.1 + + i=22 + + + + + + + + + + + + QueryFirstResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.3/#5.9.3.1 + + i=22 + + + + + + + + + + + + QueryNextRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.4/#5.9.4.2 + + i=22 + + + + + + + + + QueryNextResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.9.4/#5.9.4.2 + + i=22 + + + + + + + + + TimestampsToReturn + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.35 + + i=7606 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=625 + + + + + Source + + + Server + + + Both + + + Neither + + + Invalid + + + + + + ReadValueId + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.24 + + i=22 + + + + + + + + + + ReadRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.2/#5.10.2.2 + + i=22 + + + + + + + + + + ReadResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.2/#5.10.2.2 + + i=22 + + + + + + + + + HistoryReadValueId + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.3/#5.10.3.2 + + i=22 + + + + + + + + + + HistoryReadResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.3/#5.10.3.2 + + i=22 + + + + + + + + + HistoryReadDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.1 + + i=22 + + + + + ReadEventDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.2/#6.4.2.1 + + i=641 + + + + + + + + + + ReadRawModifiedDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.3/#6.4.3.1 + + i=641 + + + + + + + + + + + ReadProcessedDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.4/#6.4.4.1 + + i=641 + + + + + + + + + + + ReadAtTimeDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.5/#6.4.5.1 + + i=641 + + + + + + + + ReadAnnotationDataDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.6/#6.4.6.1 + + i=641 + + + + + + + HistoryData + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.5.2 + + i=22 + + + + + + + ModificationInfo + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.5.3 + + i=22 + + + + + + + + + HistoryModifiedData + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.5.3 + + i=656 + + + + + + + HistoryEvent + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.5.4 + + i=22 + + + + + + + HistoryReadRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.3/#5.10.3.2 + + i=22 + + + + + + + + + + + HistoryReadResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.3/#5.10.3.2 + + i=22 + + + + + + + + + WriteValue + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.4/#5.10.4.2 + + i=22 + + + + + + + + + + WriteRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.4/#5.10.4.2 + + i=22 + + + + + + + + WriteResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.4/#5.10.4.2 + + i=22 + + + + + + + + + HistoryUpdateDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.1 + + i=22 + + + + + + + HistoryUpdateType + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.6 + + i=11884 + i=29 + + + + + + + + + + EnumValues + + i=68 + i=11234 + + + + + + i=7616 + + + + 1 + + Insert + + + + + + + i=7616 + + + + 2 + + Replace + + + + + + + i=7616 + + + + 3 + + Update + + + + + + + i=7616 + + + + 4 + + Delete + + + + + + + + + PerformUpdateType + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.7 + + i=11885 + i=29 + + + + + + + + + + EnumValues + + i=68 + i=11293 + + + + + + i=7616 + + + + 1 + + Insert + + + + + + + i=7616 + + + + 2 + + Replace + + + + + + + i=7616 + + + + 3 + + Update + + + + + + + i=7616 + + + + 4 + + Remove + + + + + + + + + UpdateDataDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.2/#6.8.2.1 + + i=677 + + + + + + + + UpdateStructureDataDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.3/#6.8.3.1 + + i=677 + + + + + + + + UpdateEventDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.4/#6.8.4.1 + + i=677 + + + + + + + + + DeleteRawModifiedDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.5/#6.8.5.1 + + i=677 + + + + + + + + + DeleteAtTimeDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.6/#6.8.6.1 + + i=677 + + + + + + + DeleteEventDetails + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.8.7/#6.8.7.1 + + i=677 + + + + + + + HistoryUpdateResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.5/#5.10.5.2 + + i=22 + + + + + + + + + HistoryUpdateRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.5/#5.10.5.2 + + i=22 + + + + + + + + HistoryUpdateResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.10.5/#5.10.5.2 + + i=22 + + + + + + + + + CallMethodRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.11.2/#5.11.2.2 + + i=22 + + + + + + + + + CallMethodResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.11.2/#5.11.2.2 + + i=22 + + + + + + + + + + CallRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.11.2/#5.11.2.2 + + i=22 + + + + + + + + CallResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.11.2/#5.11.2.2 + + i=22 + + + + + + + + + MonitoringMode + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.18 + + i=7608 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=716 + + + + + Disabled + + + Sampling + + + Reporting + + + + + + DataChangeTrigger + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.2 + + i=7609 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=717 + + + + + Status + + + StatusValue + + + StatusValueTimestamp + + + + + + DeadbandType + + i=7610 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=718 + + + + + None + + + Absolute + + + Percent + + + + + + MonitoringFilter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.1 + + i=22 + + + + + DataChangeFilter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.2 + + i=719 + + + + + + + + + EventFilter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.3 + + i=719 + + + + + + + + AggregateConfiguration + https://reference.opcfoundation.org/v104/Core/docs/Part11/6.4.4/#6.4.4.1 + + i=22 + + + + + + + + + + + AggregateFilter + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.4 + + i=719 + + + + + + + + + + MonitoringFilterResult + + i=22 + + + + + EventFilterResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.3 + + i=731 + + + + + + + + + AggregateFilterResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.17.4 + + i=731 + + + + + + + + + MonitoringParameters + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.16 + + i=22 + + + + + + + + + + + MonitoredItemCreateRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.2/#5.12.2.2 + + i=22 + + + + + + + + + MonitoredItemCreateResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.2/#5.12.2.2 + + i=22 + + + + + + + + + + + CreateMonitoredItemsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.2/#5.12.2.2 + + i=22 + + + + + + + + + + CreateMonitoredItemsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.2/#5.12.2.2 + + i=22 + + + + + + + + + MonitoredItemModifyRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.3/#5.12.3.2 + + i=22 + + + + + + + + MonitoredItemModifyResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.3/#5.12.3.2 + + i=22 + + + + + + + + + + ModifyMonitoredItemsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.3/#5.12.3.2 + + i=22 + + + + + + + + + + ModifyMonitoredItemsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.3/#5.12.3.2 + + i=22 + + + + + + + + + SetMonitoringModeRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.4/#5.12.4.2 + + i=22 + + + + + + + + + + SetMonitoringModeResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.4/#5.12.4.2 + + i=22 + + + + + + + + + SetTriggeringRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.5/#5.12.5.2 + + i=22 + + + + + + + + + + + SetTriggeringResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.5/#5.12.5.2 + + i=22 + + + + + + + + + + + DeleteMonitoredItemsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.6/#5.12.6.2 + + i=22 + + + + + + + + + DeleteMonitoredItemsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.12.6/#5.12.6.2 + + i=22 + + + + + + + + + CreateSubscriptionRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.2/#5.13.2.2 + + i=22 + + + + + + + + + + + + + CreateSubscriptionResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.2/#5.13.2.2 + + i=22 + + + + + + + + + + + ModifySubscriptionRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.3/#5.13.3.2 + + i=22 + + + + + + + + + + + + + ModifySubscriptionResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.3/#5.13.3.2 + + i=22 + + + + + + + + + + SetPublishingModeRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.4/#5.13.4.2 + + i=22 + + + + + + + + + SetPublishingModeResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.4/#5.13.4.2 + + i=22 + + + + + + + + + NotificationMessage + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.21 + + i=22 + + + + + + + + + NotificationData + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.1 + + i=22 + + + + + DataChangeNotification + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.2 + + i=945 + + + + + + + + MonitoredItemNotification + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.2 + + i=22 + + + + + + + + EventNotificationList + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.3 + + i=945 + + + + + + + EventFieldList + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.3 + + i=22 + + + + + + + + HistoryEventFieldList + + i=22 + + + + + + + StatusChangeNotification + https://reference.opcfoundation.org/v104/Core/docs/Part4/7.20.4 + + i=945 + + + + + + + + SubscriptionAcknowledgement + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.5/#5.13.5.2 + + i=22 + + + + + + + + PublishRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.5/#5.13.5.2 + + i=22 + + + + + + + + PublishResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.5/#5.13.5.2 + + i=22 + + + + + + + + + + + + + RepublishRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.6/#5.13.6.2 + + i=22 + + + + + + + + + RepublishResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.6/#5.13.6.2 + + i=22 + + + + + + + + TransferResult + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.7/#5.13.7.2 + + i=22 + + + + + + + + TransferSubscriptionsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.7/#5.13.7.2 + + i=22 + + + + + + + + + TransferSubscriptionsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.7/#5.13.7.2 + + i=22 + + + + + + + + + DeleteSubscriptionsRequest + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.8/#5.13.8.2 + + i=22 + + + + + + + + DeleteSubscriptionsResponse + https://reference.opcfoundation.org/v104/Core/docs/Part4/5.13.8/#5.13.8.2 + + i=22 + + + + + + + + + BuildInfo + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.4 + + i=22 + + + + + + + + + + + + RedundancySupport + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.5 + + i=7611 + i=29 + + + + + + + + + + + + EnumStrings + + i=68 + i=851 + + + + + None + + + Cold + + + Warm + + + Hot + + + Transparent + + + HotAndMirrored + + + + + + ServerState + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.6 + + i=7612 + i=29 + + + + + + + + + + + + + + EnumStrings + + i=68 + i=852 + + + + + Running + + + Failed + + + NoConfiguration + + + Suspended + + + Shutdown + + + Test + + + CommunicationFault + + + Unknown + + + + + + RedundantServerDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.7 + + i=22 + + + + + + + + + EndpointUrlListDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.20 + + i=22 + + + + + + + NetworkGroupDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.19 + + i=22 + + + + + + + + SamplingIntervalDiagnosticsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.8 + + i=22 + + + + + + + + + + ServerDiagnosticsSummaryDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.9 + + i=22 + + + + + + + + + + + + + + + + + + ServerStatusDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.10 + + i=22 + + + + + + + + + + + + SessionDiagnosticsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.11 + + i=22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SessionSecurityDiagnosticsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.12 + + i=22 + + + + + + + + + + + + + + + ServiceCounterDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.13 + + i=22 + + + + + + + + StatusResult + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.14 + + i=22 + + + + + + + + SubscriptionDiagnosticsDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.15 + + i=22 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ModelChangeStructureVerbMask + + i=11942 + i=29 + + + + + + + + + + + EnumValues + + i=68 + i=11941 + + + + + + i=7616 + + + + 1 + + NodeAdded + + + + + + + i=7616 + + + + 2 + + NodeDeleted + + + + + + + i=7616 + + + + 4 + + ReferenceAdded + + + + + + + i=7616 + + + + 8 + + ReferenceDeleted + + + + + + + i=7616 + + + + 16 + + DataTypeChanged + + + + + + + + + ModelChangeStructureDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.16 + + i=22 + + + + + + + + + SemanticChangeStructureDataType + https://reference.opcfoundation.org/v104/Core/docs/Part5/12.17 + + i=22 + + + + + + + + Range + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.2 + + i=22 + + + + + + + + EUInformation + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.3 + + i=22 + + + + + + + + + + AxisScaleEnumeration + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.7 + + i=12078 + i=29 + + + + + + + + + EnumStrings + + i=68 + i=12077 + + + + + Linear + + + Log + + + Ln + + + + + + ComplexNumberType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.4 + + i=22 + + + + + + + + DoubleComplexNumberType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.5 + + i=22 + + + + + + + + AxisInformation + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.6 + + i=22 + + + + + + + + + + + XVType + https://reference.opcfoundation.org/v104/Core/docs/Part8/5.6.8 + + i=22 + + + + + + + + ProgramDiagnosticDataType + + i=22 + + + + + + + + + + + + + + + + ProgramDiagnostic2DataType + + i=22 + + + + + + + + + + + + + + + + + + Annotation + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.5 + + i=22 + + + + + + + + + ExceptionDeviationFormat + https://reference.opcfoundation.org/v104/Core/docs/Part11/5.2.2 + + i=7614 + i=29 + + + + + + + + + + + EnumStrings + + i=68 + i=890 + + + + + AbsoluteValue + + + PercentOfValue + + + PercentOfRange + + + PercentOfEURange + + + Unknown + + + + + + Default Binary + + i=12756 + i=12770 + i=76 + + + + Default Binary + + i=14533 + i=14873 + i=76 + + + + Default Binary + + i=16313 + i=17538 + i=76 + + + + Default Binary + + i=17548 + i=17550 + i=76 + + + + Default Binary + + i=15528 + i=15734 + i=76 + + + + Default Binary + + i=18806 + i=18824 + i=76 + + + + Default Binary + + i=18807 + i=18827 + i=76 + + + + Default Binary + + i=18808 + i=18830 + i=76 + + + + Default Binary + + i=18809 + i=18833 + i=76 + + + + Default Binary + + i=18810 + i=18836 + i=76 + + + + Default Binary + + i=18811 + i=18839 + i=76 + + + + Default Binary + + i=18812 + i=18842 + i=76 + + + + Default Binary + + i=18813 + i=18845 + i=76 + + + + Default Binary + + i=18814 + i=18848 + i=76 + + + + Default Binary + + i=15634 + i=15738 + i=76 + + + + Default Binary + + i=23498 + i=23514 + i=76 + + + + Default Binary + + i=12554 + i=12681 + i=76 + + + + Default Binary + + i=17861 + i=76 + + + + Default Binary + + i=15534 + i=15741 + i=76 + + + + Default Binary + + i=14525 + i=14855 + i=76 + + + + Default Binary + + i=15487 + i=15599 + i=76 + + + + Default Binary + + i=15488 + i=15602 + i=76 + + + + Default Binary + + i=15005 + i=15501 + i=76 + + + + Default Binary + + i=15006 + i=15521 + i=76 + + + + Default Binary + + i=14523 + i=14849 + i=76 + + + + Default Binary + + i=14524 + i=14852 + i=76 + + + + Default Binary + + i=14593 + i=14876 + i=76 + + + + Default Binary + + i=15578 + i=15766 + i=76 + + + + Default Binary + + i=15580 + i=15769 + i=76 + + + + Default Binary + + i=14273 + i=14324 + i=76 + + + + Default Binary + + i=15581 + i=15772 + i=76 + + + + Default Binary + + i=15582 + i=15775 + i=76 + + + + Default Binary + + i=15597 + i=15778 + i=76 + + + + Default Binary + + i=15598 + i=15781 + i=76 + + + + Default Binary + + i=15605 + i=15784 + i=76 + + + + Default Binary + + i=15609 + i=15787 + i=76 + + + + Default Binary + + i=15480 + i=21156 + i=76 + + + + Default Binary + + i=15611 + i=15793 + i=76 + + + + Default Binary + + i=15616 + i=15854 + i=76 + + + + Default Binary + + i=15617 + i=15857 + i=76 + + + + Default Binary + + i=15618 + i=15860 + i=76 + + + + Default Binary + + i=15502 + i=21159 + i=76 + + + + Default Binary + + i=15510 + i=21162 + i=76 + + + + Default Binary + + i=15520 + i=21165 + i=76 + + + + Default Binary + + i=15621 + i=15866 + i=76 + + + + Default Binary + + i=15622 + i=15869 + i=76 + + + + Default Binary + + i=15623 + i=15872 + i=76 + + + + Default Binary + + i=15628 + i=15877 + i=76 + + + + Default Binary + + i=15629 + i=15880 + i=76 + + + + Default Binary + + i=15630 + i=15883 + i=76 + + + + Default Binary + + i=15631 + i=15886 + i=76 + + + + Default Binary + + i=14744 + i=21002 + i=76 + + + + Default Binary + + i=15635 + i=15889 + i=76 + + + + Default Binary + + i=15530 + i=21168 + i=76 + + + + Default Binary + + i=15645 + i=15895 + i=76 + + + + Default Binary + + i=15652 + i=15898 + i=76 + + + + Default Binary + + i=15653 + i=15919 + i=76 + + + + Default Binary + + i=15657 + i=15922 + i=76 + + + + Default Binary + + i=15664 + i=15925 + i=76 + + + + Default Binary + + i=15665 + i=15931 + i=76 + + + + Default Binary + + i=17467 + i=17469 + i=76 + + + + Default Binary + + i=15532 + i=21171 + i=76 + + + + Default Binary + + i=15007 + i=15524 + i=76 + + + + Default Binary + + i=15667 + i=15940 + i=76 + + + + Default Binary + + i=15669 + i=15943 + i=76 + + + + Default Binary + + i=15670 + i=15946 + i=76 + + + + Default Binary + + i=23468 + i=23502 + i=76 + + + + Default Binary + + i=24107 + i=24117 + i=76 + + + + Default Binary + + i=96 + i=16131 + i=76 + + + + Default Binary + + i=97 + i=18178 + i=76 + + + + Default Binary + + i=101 + i=18181 + i=76 + + + + Default Binary + + i=99 + i=18184 + i=76 + + + + Default Binary + + i=100 + i=18187 + i=76 + + + + Default Binary + + i=258 + i=76 + + + + Default Binary + + i=11879 + i=76 + + + + Default Binary + + i=11880 + i=76 + + + + Default Binary + + i=261 + i=76 + + + + Default Binary + + i=264 + i=76 + + + + Default Binary + + i=267 + i=76 + + + + Default Binary + + i=270 + i=76 + + + + Default Binary + + i=273 + i=76 + + + + Default Binary + + i=276 + i=76 + + + + Default Binary + + i=279 + i=76 + + + + Default Binary + + i=282 + i=76 + + + + Default Binary + + i=285 + i=76 + + + + Default Binary + + i=296 + i=7650 + i=76 + + + + Default Binary + + i=7594 + i=7656 + i=76 + + + + Default Binary + + i=102 + i=14870 + i=76 + + + + Default Binary + + i=12755 + i=12767 + i=76 + + + + Default Binary + + i=8912 + i=8914 + i=76 + + + + Default Binary + + i=308 + i=7665 + i=76 + + + + Default Binary + + i=389 + i=76 + + + + Default Binary + + i=392 + i=76 + + + + Default Binary + + i=395 + i=76 + + + + Default Binary + + i=15901 + i=76 + + + + Default Binary + + i=20999 + i=76 + + + + Default Binary + + i=420 + i=76 + + + + Default Binary + + i=423 + i=76 + + + + Default Binary + + i=12189 + i=12213 + i=76 + + + + Default Binary + + i=12190 + i=76 + + + + Default Binary + + i=12191 + i=76 + + + + Default Binary + + i=304 + i=7662 + i=76 + + + + Default Binary + + i=312 + i=7668 + i=76 + + + + Default Binary + + i=426 + i=76 + + + + Default Binary + + i=429 + i=76 + + + + Default Binary + + i=432 + i=7782 + i=76 + + + + Default Binary + + i=435 + i=76 + + + + Default Binary + + i=438 + i=76 + + + + Default Binary + + i=12890 + i=12902 + i=76 + + + + Default Binary + + i=12891 + i=12905 + i=76 + + + + Default Binary + + i=12193 + i=76 + + + + Default Binary + + i=12194 + i=76 + + + + Default Binary + + i=441 + i=76 + + + + Default Binary + + i=444 + i=76 + + + + Default Binary + + i=447 + i=76 + + + + Default Binary + + i=450 + i=76 + + + + Default Binary + + i=453 + i=76 + + + + Default Binary + + i=344 + i=7698 + i=76 + + + + Default Binary + + i=456 + i=76 + + + + Default Binary + + i=459 + i=76 + + + + Default Binary + + i=462 + i=76 + + + + Default Binary + + i=316 + i=7671 + i=76 + + + + Default Binary + + i=319 + i=7674 + i=76 + + + + Default Binary + + i=322 + i=7677 + i=76 + + + + Default Binary + + i=325 + i=7680 + i=76 + + + + Default Binary + + i=938 + i=7683 + i=76 + + + + Default Binary + + i=465 + i=76 + + + + Default Binary + + i=468 + i=76 + + + + Default Binary + + i=471 + i=76 + + + + Default Binary + + i=474 + i=76 + + + + Default Binary + + i=477 + i=76 + + + + Default Binary + + i=480 + i=76 + + + + Default Binary + + i=349 + i=76 + + + + Default Binary + + i=352 + i=76 + + + + Default Binary + + i=355 + i=76 + + + + Default Binary + + i=358 + i=76 + + + + Default Binary + + i=361 + i=76 + + + + Default Binary + + i=364 + i=76 + + + + Default Binary + + i=367 + i=76 + + + + Default Binary + + i=370 + i=76 + + + + Default Binary + + i=373 + i=76 + + + + Default Binary + + i=17606 + i=76 + + + + Default Binary + + i=17607 + i=76 + + + + Default Binary + + i=376 + i=7728 + i=76 + + + + Default Binary + + i=483 + i=76 + + + + Default Binary + + i=486 + i=76 + + + + Default Binary + + i=489 + i=76 + + + + Default Binary + + i=379 + i=7731 + i=76 + + + + Default Binary + + i=492 + i=76 + + + + Default Binary + + i=495 + i=76 + + + + Default Binary + + i=382 + i=7734 + i=76 + + + + Default Binary + + i=498 + i=76 + + + + Default Binary + + i=501 + i=76 + + + + Default Binary + + i=385 + i=7737 + i=76 + + + + Default Binary + + i=504 + i=76 + + + + Default Binary + + i=507 + i=76 + + + + Default Binary + + i=511 + i=76 + + + + Default Binary + + i=514 + i=76 + + + + Default Binary + + i=518 + i=76 + + + + Default Binary + + i=522 + i=76 + + + + Default Binary + + i=525 + i=76 + + + + Default Binary + + i=528 + i=76 + + + + Default Binary + + i=531 + i=76 + + + + Default Binary + + i=534 + i=76 + + + + Default Binary + + i=537 + i=12718 + i=76 + + + + Default Binary + + i=540 + i=12721 + i=76 + + + + Default Binary + + i=543 + i=76 + + + + Default Binary + + i=546 + i=76 + + + + Default Binary + + i=549 + i=76 + + + + Default Binary + + i=552 + i=76 + + + + Default Binary + + i=555 + i=76 + + + + Default Binary + + i=558 + i=76 + + + + Default Binary + + i=561 + i=76 + + + + Default Binary + + i=564 + i=76 + + + + Default Binary + + i=567 + i=76 + + + + Default Binary + + i=331 + i=7686 + i=76 + + + + Default Binary + + i=570 + i=76 + + + + Default Binary + + i=573 + i=76 + + + + Default Binary + + i=577 + i=76 + + + + Default Binary + + i=580 + i=76 + + + + Default Binary + + i=583 + i=7929 + i=76 + + + + Default Binary + + i=586 + i=7932 + i=76 + + + + Default Binary + + i=589 + i=7935 + i=76 + + + + Default Binary + + i=592 + i=7938 + i=76 + + + + Default Binary + + i=595 + i=7941 + i=76 + + + + Default Binary + + i=598 + i=7944 + i=76 + + + + Default Binary + + i=601 + i=7947 + i=76 + + + + Default Binary + + i=604 + i=76 + + + + Default Binary + + i=607 + i=76 + + + + Default Binary + + i=610 + i=76 + + + + Default Binary + + i=613 + i=76 + + + + Default Binary + + i=616 + i=76 + + + + Default Binary + + i=619 + i=76 + + + + Default Binary + + i=622 + i=76 + + + + Default Binary + + i=626 + i=76 + + + + Default Binary + + i=629 + i=76 + + + + Default Binary + + i=632 + i=76 + + + + Default Binary + + i=635 + i=76 + + + + Default Binary + + i=638 + i=76 + + + + Default Binary + + i=641 + i=76 + + + + Default Binary + + i=644 + i=76 + + + + Default Binary + + i=647 + i=76 + + + + Default Binary + + i=650 + i=76 + + + + Default Binary + + i=653 + i=76 + + + + Default Binary + + i=23497 + i=76 + + + + Default Binary + + i=656 + i=76 + + + + Default Binary + + i=11216 + i=76 + + + + Default Binary + + i=11217 + i=76 + + + + Default Binary + + i=659 + i=8004 + i=76 + + + + Default Binary + + i=662 + i=76 + + + + Default Binary + + i=665 + i=76 + + + + Default Binary + + i=668 + i=76 + + + + Default Binary + + i=671 + i=76 + + + + Default Binary + + i=674 + i=76 + + + + Default Binary + + i=677 + i=76 + + + + Default Binary + + i=680 + i=76 + + + + Default Binary + + i=11295 + i=76 + + + + Default Binary + + i=683 + i=76 + + + + Default Binary + + i=686 + i=76 + + + + Default Binary + + i=689 + i=76 + + + + Default Binary + + i=692 + i=76 + + + + Default Binary + + i=695 + i=76 + + + + Default Binary + + i=698 + i=76 + + + + Default Binary + + i=701 + i=76 + + + + Default Binary + + i=704 + i=76 + + + + Default Binary + + i=707 + i=76 + + + + Default Binary + + i=710 + i=76 + + + + Default Binary + + i=713 + i=76 + + + + Default Binary + + i=719 + i=8067 + i=76 + + + + Default Binary + + i=722 + i=76 + + + + Default Binary + + i=725 + i=8073 + i=76 + + + + Default Binary + + i=948 + i=8076 + i=76 + + + + Default Binary + + i=728 + i=76 + + + + Default Binary + + i=731 + i=76 + + + + Default Binary + + i=734 + i=76 + + + + Default Binary + + i=737 + i=76 + + + + Default Binary + + i=740 + i=76 + + + + Default Binary + + i=743 + i=76 + + + + Default Binary + + i=746 + i=76 + + + + Default Binary + + i=749 + i=76 + + + + Default Binary + + i=752 + i=76 + + + + Default Binary + + i=755 + i=76 + + + + Default Binary + + i=758 + i=76 + + + + Default Binary + + i=761 + i=76 + + + + Default Binary + + i=764 + i=76 + + + + Default Binary + + i=767 + i=76 + + + + Default Binary + + i=770 + i=76 + + + + Default Binary + + i=773 + i=76 + + + + Default Binary + + i=776 + i=76 + + + + Default Binary + + i=779 + i=76 + + + + Default Binary + + i=782 + i=76 + + + + Default Binary + + i=785 + i=76 + + + + Default Binary + + i=788 + i=76 + + + + Default Binary + + i=791 + i=76 + + + + Default Binary + + i=794 + i=76 + + + + Default Binary + + i=797 + i=76 + + + + Default Binary + + i=800 + i=76 + + + + Default Binary + + i=803 + i=76 + + + + Default Binary + + i=945 + i=76 + + + + Default Binary + + i=809 + i=76 + + + + Default Binary + + i=806 + i=76 + + + + Default Binary + + i=914 + i=76 + + + + Default Binary + + i=917 + i=76 + + + + Default Binary + + i=920 + i=8172 + i=76 + + + + Default Binary + + i=818 + i=76 + + + + Default Binary + + i=821 + i=76 + + + + Default Binary + + i=824 + i=76 + + + + Default Binary + + i=827 + i=76 + + + + Default Binary + + i=830 + i=76 + + + + Default Binary + + i=833 + i=76 + + + + Default Binary + + i=836 + i=76 + + + + Default Binary + + i=839 + i=76 + + + + Default Binary + + i=842 + i=76 + + + + Default Binary + + i=845 + i=76 + + + + Default Binary + + i=848 + i=76 + + + + Default Binary + + i=338 + i=7692 + i=76 + + + + Default Binary + + i=853 + i=8208 + i=76 + + + + Default Binary + + i=11943 + i=11959 + i=76 + + + + Default Binary + + i=11944 + i=11962 + i=76 + + + + Default Binary + + i=856 + i=8211 + i=76 + + + + Default Binary + + i=859 + i=8214 + i=76 + + + + Default Binary + + i=862 + i=8217 + i=76 + + + + Default Binary + + i=865 + i=8220 + i=76 + + + + Default Binary + + i=868 + i=8223 + i=76 + + + + Default Binary + + i=871 + i=8226 + i=76 + + + + Default Binary + + i=299 + i=7659 + i=76 + + + + Default Binary + + i=874 + i=8229 + i=76 + + + + Default Binary + + i=877 + i=8232 + i=76 + + + + Default Binary + + i=897 + i=8235 + i=76 + + + + Default Binary + + i=884 + i=8238 + i=76 + + + + Default Binary + + i=887 + i=8241 + i=76 + + + + Default Binary + + i=12171 + i=12183 + i=76 + + + + Default Binary + + i=12172 + i=12186 + i=76 + + + + Default Binary + + i=12079 + i=12091 + i=76 + + + + Default Binary + + i=12080 + i=12094 + i=76 + + + + Default Binary + + i=894 + i=8247 + i=76 + + + + Default Binary + + i=24033 + i=24035 + i=76 + + + + Default Binary + + i=891 + i=8244 + i=76 + + + + Opc.Ua + + i=7619 + i=15037 + i=12770 + i=14873 + i=17538 + i=17550 + i=15734 + i=18824 + i=18827 + i=18830 + i=18833 + i=18836 + i=18839 + i=18842 + i=18845 + i=18848 + i=15738 + i=23514 + i=12681 + i=15741 + i=14855 + i=15599 + i=15602 + i=15501 + i=15521 + i=14849 + i=14852 + i=14876 + i=15766 + i=15769 + i=14324 + i=15772 + i=15775 + i=15778 + i=15781 + i=15784 + i=15787 + i=21156 + i=15793 + i=15854 + i=15857 + i=15860 + i=21159 + i=21162 + i=21165 + i=15866 + i=15869 + i=15872 + i=15877 + i=15880 + i=15883 + i=15886 + i=21002 + i=15889 + i=21168 + i=15895 + i=15898 + i=15919 + i=15922 + i=15925 + i=15931 + i=17469 + i=21171 + i=15524 + i=15940 + i=15943 + i=15946 + i=23502 + i=24117 + i=16131 + i=18178 + i=18181 + i=18184 + i=18187 + i=7650 + i=7656 + i=14870 + i=12767 + i=8914 + i=7665 + i=12213 + i=7662 + i=7668 + i=7782 + i=12902 + i=12905 + i=7698 + i=7671 + i=7674 + i=7677 + i=7680 + i=7683 + i=7728 + i=7731 + i=7734 + i=7737 + i=12718 + i=12721 + i=7686 + i=7929 + i=7932 + i=7935 + i=7938 + i=7941 + i=7944 + i=7947 + i=8004 + i=8067 + i=8073 + i=8076 + i=8172 + i=7692 + i=8208 + i=11959 + i=11962 + i=8211 + i=8214 + i=8217 + i=8220 + i=8223 + i=8226 + i=7659 + i=8229 + i=8232 + i=8235 + i=8238 + i=8241 + i=12183 + i=12186 + i=12091 + i=12094 + i=8247 + i=24035 + i=8244 + i=93 + i=72 + + + PG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y +Zy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M +U2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB +LyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIg0KICBEZWZhdWx0 +Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wY2Zv +dW5kYXRpb24ub3JnL1VBLyINCj4NCg0KICA8b3BjOkltcG9ydCBOYW1lc3BhY2U9Imh0dHA6Ly9v +cGNmb3VuZGF0aW9uLm9yZy9CaW5hcnlTY2hlbWEvIiAvPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iWG1sRWxlbWVudCI+DQogICAgPG9wYzpEb2N1bWVudGF0aW9uPkFuIFhNTCBlbGVt +ZW50IGVuY29kZWQgYXMgYSBVVEYtOCBzdHJpbmcuPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ikxlbmd0aCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlZhbHVlIiBUeXBlTmFtZT0ib3BjOkNoYXIiIExlbmd0aEZpZWxkPSJMZW5n +dGgiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUg +TmFtZT0iTm9kZUlkVHlwZSIgTGVuZ3RoSW5CaXRzPSI2Ij4NCiAgICA8b3BjOkRvY3VtZW50YXRp +b24+VGhlIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBOb2RlSWQgdmFsdWUuPC9vcGM6RG9jdW1l +bnRhdGlvbj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJUd29CeXRlIiBWYWx1ZT0i +MCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJGb3VyQnl0ZSIgVmFsdWU9IjEi +IC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTnVtZXJpYyIgVmFsdWU9IjIiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU3RyaW5nIiBWYWx1ZT0iMyIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJHdWlkIiBWYWx1ZT0iNCIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJCeXRlU3RyaW5nIiBWYWx1ZT0iNSIgLz4NCiAgPC9vcGM6 +RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJUd29CeXRlTm9k +ZUlkIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IklkZW50aWZpZXIiIFR5cGVOYW1lPSJvcGM6Qnl0 +ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBO +YW1lPSJGb3VyQnl0ZU5vZGVJZCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lc3BhY2VJbmRl +eCIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSWRlbnRpZmll +ciIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQog +IDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iTnVtZXJpY05vZGVJZCI+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOYW1lc3BhY2VJbmRleCIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJJZGVudGlmaWVyIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9v +cGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTdHJpbmdO +b2RlSWQiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmFtZXNwYWNlSW5kZXgiIFR5cGVOYW1lPSJv +cGM6VUludDE2IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSWRlbnRpZmllciIgVHlwZU5hbWU9 +Im9wYzpDaGFyQXJyYXkiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iR3VpZE5vZGVJZCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1l +c3BhY2VJbmRleCIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJJZGVudGlmaWVyIiBUeXBlTmFtZT0ib3BjOkd1aWQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQnl0ZVN0cmluZ05vZGVJZCI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lc3BhY2VJbmRleCIgVHlwZU5hbWU9Im9wYzpVSW50MTYi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJZGVudGlmaWVyIiBUeXBlTmFtZT0ib3BjOkJ5dGVT +dHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iTm9kZUlkIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+QW4gaWRlbnRpZmllciBm +b3IgYSBub2RlIGluIGEgVUEgc2VydmVyIGFkZHJlc3Mgc3BhY2UuPC9vcGM6RG9jdW1lbnRhdGlv +bj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZFR5cGUiIFR5cGVOYW1lPSJ1YTpOb2RlSWRU +eXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzZXJ2ZWQxIiBUeXBlTmFtZT0ib3BjOkJp +dCIgTGVuZ3RoPSIyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHdvQnl0ZSIgVHlwZU5hbWU9 +InVhOlR3b0J5dGVOb2RlSWQiIFN3aXRjaEZpZWxkPSJOb2RlSWRUeXBlIiBTd2l0Y2hWYWx1ZT0i +MCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkZvdXJCeXRlIiBUeXBlTmFtZT0idWE6Rm91ckJ5 +dGVOb2RlSWQiIFN3aXRjaEZpZWxkPSJOb2RlSWRUeXBlIiBTd2l0Y2hWYWx1ZT0iMSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik51bWVyaWMiIFR5cGVOYW1lPSJ1YTpOdW1lcmljTm9kZUlkIiBT +d2l0Y2hGaWVsZD0iTm9kZUlkVHlwZSIgU3dpdGNoVmFsdWU9IjIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTdHJpbmciIFR5cGVOYW1lPSJ1YTpTdHJpbmdOb2RlSWQiIFN3aXRjaEZpZWxkPSJO +b2RlSWRUeXBlIiBTd2l0Y2hWYWx1ZT0iMyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikd1aWQi +IFR5cGVOYW1lPSJ1YTpHdWlkTm9kZUlkIiBTd2l0Y2hGaWVsZD0iTm9kZUlkVHlwZSIgU3dpdGNo +VmFsdWU9IjQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlU3RyaW5nIiBUeXBlTmFtZT0i +dWE6Qnl0ZVN0cmluZ05vZGVJZCIgU3dpdGNoRmllbGQ9Ik5vZGVJZFR5cGUiIFN3aXRjaFZhbHVl +PSI1IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IkV4cGFuZGVkTm9kZUlkIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+QW4gaWRlbnRp +ZmllciBmb3IgYSBub2RlIGluIGEgVUEgc2VydmVyIGFkZHJlc3Mgc3BhY2UgcXVhbGlmaWVkIHdp +dGggYSBjb21wbGV0ZSBuYW1lc3BhY2Ugc3RyaW5nLjwvb3BjOkRvY3VtZW50YXRpb24+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb2RlSWRUeXBlIiBUeXBlTmFtZT0idWE6Tm9kZUlkVHlwZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlckluZGV4U3BlY2lmaWVkIiBUeXBlTmFtZT0ib3Bj +OkJpdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWVzcGFjZVVSSVNwZWNpZmllZCIgVHlw +ZU5hbWU9Im9wYzpCaXQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUd29CeXRlIiBUeXBlTmFt +ZT0idWE6VHdvQnl0ZU5vZGVJZCIgU3dpdGNoRmllbGQ9Ik5vZGVJZFR5cGUiIFN3aXRjaFZhbHVl +PSIwIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRm91ckJ5dGUiIFR5cGVOYW1lPSJ1YTpGb3Vy +Qnl0ZU5vZGVJZCIgU3dpdGNoRmllbGQ9Ik5vZGVJZFR5cGUiIFN3aXRjaFZhbHVlPSIxIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtZXJpYyIgVHlwZU5hbWU9InVhOk51bWVyaWNOb2RlSWQi +IFN3aXRjaEZpZWxkPSJOb2RlSWRUeXBlIiBTd2l0Y2hWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlN0cmluZyIgVHlwZU5hbWU9InVhOlN0cmluZ05vZGVJZCIgU3dpdGNoRmllbGQ9 +Ik5vZGVJZFR5cGUiIFN3aXRjaFZhbHVlPSIzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iR3Vp +ZCIgVHlwZU5hbWU9InVhOkd1aWROb2RlSWQiIFN3aXRjaEZpZWxkPSJOb2RlSWRUeXBlIiBTd2l0 +Y2hWYWx1ZT0iNCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmciIFR5cGVOYW1l +PSJ1YTpCeXRlU3RyaW5nTm9kZUlkIiBTd2l0Y2hGaWVsZD0iTm9kZUlkVHlwZSIgU3dpdGNoVmFs +dWU9IjUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lc3BhY2VVUkkiIFR5cGVOYW1lPSJv +cGM6Q2hhckFycmF5IiBTd2l0Y2hGaWVsZD0iTmFtZXNwYWNlVVJJU3BlY2lmaWVkIi8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJJbmRleCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFN3aXRj +aEZpZWxkPSJTZXJ2ZXJJbmRleFNwZWNpZmllZCIvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iU3RhdHVzQ29kZSIgTGVuZ3RoSW5CaXRzPSIzMiIg +Qnl0ZU9yZGVyU2lnbmlmaWNhbnQ9InRydWUiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5BIDMy +LWJpdCBzdGF0dXMgY29kZSB2YWx1ZS48L29wYzpEb2N1bWVudGF0aW9uPg0KICA8L29wYzpPcGFx +dWVUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGlhZ25vc3RpY0luZm8iPg0K +ICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5BIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBk +aWFnbm9zdGljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHN0YXR1cyBjb2RlLjwvb3Bj +OkRvY3VtZW50YXRpb24+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTeW1ib2xpY0lkU3BlY2lmaWVk +IiBUeXBlTmFtZT0ib3BjOkJpdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWVzcGFjZVVS +SVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJM +b2NhbGl6ZWRUZXh0U3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkJpdCIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkxvY2FsZVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJBZGRpdGlvbmFsSW5mb1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbm5lclN0YXR1c0NvZGVTcGVjaWZpZWQiIFR5cGVO +YW1lPSJvcGM6Qml0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW5uZXJEaWFnbm9zdGljSW5m +b1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJS +ZXNlcnZlZDEiIFR5cGVOYW1lPSJvcGM6Qml0IiBMZW5ndGg9IjEiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTeW1ib2xpY0lkIiBUeXBlTmFtZT0ib3BjOkludDMyIiBTd2l0Y2hGaWVsZD0iU3lt +Ym9saWNJZFNwZWNpZmllZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWVzcGFjZVVSSSIg +VHlwZU5hbWU9Im9wYzpJbnQzMiIgU3dpdGNoRmllbGQ9Ik5hbWVzcGFjZVVSSVNwZWNpZmllZCIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkxvY2FsZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgU3dp +dGNoRmllbGQ9IkxvY2FsZVNwZWNpZmllZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkxvY2Fs +aXplZFRleHQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIFN3aXRjaEZpZWxkPSJMb2NhbGl6ZWRUZXh0 +U3BlY2lmaWVkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWRkaXRpb25hbEluZm8iIFR5cGVO +YW1lPSJvcGM6Q2hhckFycmF5IiBTd2l0Y2hGaWVsZD0iQWRkaXRpb25hbEluZm9TcGVjaWZpZWQi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbm5lclN0YXR1c0NvZGUiIFR5cGVOYW1lPSJ1YTpT +dGF0dXNDb2RlIiBTd2l0Y2hGaWVsZD0iSW5uZXJTdGF0dXNDb2RlU3BlY2lmaWVkIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iSW5uZXJEaWFnbm9zdGljSW5mbyIgVHlwZU5hbWU9InVhOkRpYWdu +b3N0aWNJbmZvIiBTd2l0Y2hGaWVsZD0iSW5uZXJEaWFnbm9zdGljSW5mb1NwZWNpZmllZCIgLz4N +CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJR +dWFsaWZpZWROYW1lIj4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+QSBzdHJpbmcgcXVhbGlmaWVk +IHdpdGggYSBuYW1lc3BhY2UgaW5kZXguPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5hbWVzcGFjZUluZGV4IiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6Q2hhckFycmF5IiAvPg0KICA8L29w +YzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkxvY2FsaXpl +ZFRleHQiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5BIHN0cmluZyBxdWFsaWZpZWQgd2l0aCBh +IG5hbWVzcGFjZSBpbmRleC48L29wYzpEb2N1bWVudGF0aW9uPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTG9jYWxlU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkJpdCIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlRleHRTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Qml0IiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmVzZXJ2ZWQxIiBUeXBlTmFtZT0ib3BjOkJpdCIgTGVuZ3RoPSI2IiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTG9jYWxlIiBUeXBlTmFtZT0ib3BjOkNoYXJBcnJheSIgU3dpdGNo +RmllbGQ9IkxvY2FsZVNwZWNpZmllZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRleHQiIFR5 +cGVOYW1lPSJvcGM6Q2hhckFycmF5IiBTd2l0Y2hGaWVsZD0iVGV4dFNwZWNpZmllZCIgLz4NCiAg +PC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEYXRh +VmFsdWUiPg0KICAgIDxvcGM6RG9jdW1lbnRhdGlvbj5BIHZhbHVlIHdpdGggYW4gYXNzb2NpYXRl +ZCB0aW1lc3RhbXAsIGFuZCBxdWFsaXR5Ljwvb3BjOkRvY3VtZW50YXRpb24+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJWYWx1ZVNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlU3BlY2lmaWVkIiBUeXBlTmFtZT0ib3BjOkJpdCIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNvdXJjZVRpbWVzdGFtcFNwZWNpZmllZCIgVHlwZU5hbWU9 +Im9wYzpCaXQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJUaW1lc3RhbXBTcGVjaWZp +ZWQiIFR5cGVOYW1lPSJvcGM6Qml0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU291cmNlUGlj +b3NlY29uZHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Qml0IiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iU2VydmVyUGljb3NlY29uZHNTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Qml0IiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzZXJ2ZWQxIiBUeXBlTmFtZT0ib3BjOkJpdCIgTGVuZ3Ro +PSIyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50 +IiBTd2l0Y2hGaWVsZD0iVmFsdWVTcGVjaWZpZWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJT +dGF0dXNDb2RlIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgU3dpdGNoRmllbGQ9IlN0YXR1c0Nv +ZGVTcGVjaWZpZWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTb3VyY2VUaW1lc3RhbXAiIFR5 +cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIFN3aXRjaEZpZWxkPSJTb3VyY2VUaW1lc3RhbXBTcGVjaWZp +ZWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTb3VyY2VQaWNvc2Vjb25kcyIgVHlwZU5hbWU9 +Im9wYzpVSW50MTYiIFN3aXRjaEZpZWxkPSJTb3VyY2VQaWNvc2Vjb25kc1NwZWNpZmllZCIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlclRpbWVzdGFtcCIgVHlwZU5hbWU9Im9wYzpEYXRl +VGltZSIgU3dpdGNoRmllbGQ9IlNlcnZlclRpbWVzdGFtcFNwZWNpZmllZCIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlNlcnZlclBpY29zZWNvbmRzIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgU3dp +dGNoRmllbGQ9IlNlcnZlclBpY29zZWNvbmRzU3BlY2lmaWVkIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkV4dGVuc2lvbk9iamVjdCI+ +DQogICAgPG9wYzpEb2N1bWVudGF0aW9uPkEgc2VyaWFsaXplZCBvYmplY3QgcHJlZml4ZWQgd2l0 +aCBpdHMgZGF0YSB0eXBlIGlkZW50aWZpZXIuPC9vcGM6RG9jdW1lbnRhdGlvbj4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlR5cGVJZFNwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJCaW5hcnlCb2R5IiBUeXBlTmFtZT0ib3BjOkJpdCIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlhtbEJvZHkiIFR5cGVOYW1lPSJvcGM6Qml0IiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iUmVzZXJ2ZWQxIiBUeXBlTmFtZT0ib3BjOkJpdCIgTGVuZ3RoPSI1IiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iVHlwZUlkIiBUeXBlTmFtZT0idWE6RXhwYW5kZWROb2RlSWQi +IFN3aXRjaEZpZWxkPSJUeXBlSWRTcGVjaWZpZWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJC +b2R5TGVuZ3RoIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +Qm9keSIgVHlwZU5hbWU9Im9wYzpCeXRlIiBMZW5ndGhGaWVsZD0iQm9keUxlbmd0aCIgLz4NCiAg +PC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJWYXJp +YW50Ij4NCiAgICA8b3BjOkRvY3VtZW50YXRpb24+QSB1bmlvbiBvZiBzZXZlcmFsIHR5cGVzLjwv +b3BjOkRvY3VtZW50YXRpb24+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYXJpYW50VHlwZSIgVHlw +ZU5hbWU9Im9wYzpCaXQiIExlbmd0aD0iNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFycmF5 +RGltZW5zaW9uc1NwZWNpZmllZCIgVHlwZU5hbWU9Im9wYzpCaXQiIExlbmd0aD0iMSIvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQXJyYXlMZW5ndGhTcGVjaWZpZWQiIFR5cGVOYW1lPSJvcGM6Qml0 +IiBMZW5ndGg9IjEiLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFycmF5TGVuZ3RoIiBUeXBlTmFt +ZT0ib3BjOkludDMyIiBTd2l0Y2hGaWVsZD0iQXJyYXlMZW5ndGhTcGVjaWZpZWQiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJCb29sZWFuIiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIExlbmd0aEZp +ZWxkPSJBcnJheUxlbmd0aCIgU3dpdGNoRmllbGQ9IlZhcmlhbnRUeXBlIiBTd2l0Y2hWYWx1ZT0i +MSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNCeXRlIiBUeXBlTmFtZT0ib3BjOlNCeXRlIiBM +ZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxkPSJWYXJpYW50VHlwZSIgU3dpdGNo +VmFsdWU9IjIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCeXRlIiBUeXBlTmFtZT0ib3BjOkJ5 +dGUiIExlbmd0aEZpZWxkPSJBcnJheUxlbmd0aCIgU3dpdGNoRmllbGQ9IlZhcmlhbnRUeXBlIiBT +d2l0Y2hWYWx1ZT0iMyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludDE2IiBUeXBlTmFtZT0i +b3BjOkludDE2IiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxkPSJWYXJpYW50 +VHlwZSIgU3dpdGNoVmFsdWU9IjQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVSW50MTYiIFR5 +cGVOYW1lPSJvcGM6VUludDE2IiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxk +PSJWYXJpYW50VHlwZSIgU3dpdGNoVmFsdWU9IjUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJ +bnQzMiIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0 +Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSI2IiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iVUludDMyIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmllbGQ9IkFycmF5TGVu +Z3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSI3IiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iSW50NjQiIFR5cGVOYW1lPSJvcGM6SW50NjQiIExlbmd0aEZpZWxkPSJB +cnJheUxlbmd0aCIgU3dpdGNoRmllbGQ9IlZhcmlhbnRUeXBlIiBTd2l0Y2hWYWx1ZT0iOCIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlVJbnQ2NCIgVHlwZU5hbWU9Im9wYzpVSW50NjQiIExlbmd0 +aEZpZWxkPSJBcnJheUxlbmd0aCIgU3dpdGNoRmllbGQ9IlZhcmlhbnRUeXBlIiBTd2l0Y2hWYWx1 +ZT0iOSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkZsb2F0IiBUeXBlTmFtZT0ib3BjOkZsb2F0 +IiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxkPSJWYXJpYW50VHlwZSIgU3dp +dGNoVmFsdWU9IjEwIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRG91YmxlIiBUeXBlTmFtZT0i +b3BjOkRvdWJsZSIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFu +dFR5cGUiIFN3aXRjaFZhbHVlPSIxMSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0cmluZyIg +VHlwZU5hbWU9Im9wYzpDaGFyQXJyYXkiIExlbmd0aEZpZWxkPSJBcnJheUxlbmd0aCIgU3dpdGNo +RmllbGQ9IlZhcmlhbnRUeXBlIiBTd2l0Y2hWYWx1ZT0iMTIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJEYXRlVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTGVuZ3RoRmllbGQ9IkFycmF5 +TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSIxMyIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ikd1aWQiIFR5cGVOYW1lPSJvcGM6R3VpZCIgTGVuZ3RoRmllbGQ9 +IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSIxNCIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJ5dGVTdHJpbmciIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0 +cmluZyIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUi +IFN3aXRjaFZhbHVlPSIxNSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlhtbEVsZW1lbnQiIFR5 +cGVOYW1lPSJ1YTpYbWxFbGVtZW50IiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZp +ZWxkPSJWYXJpYW50VHlwZSIgU3dpdGNoVmFsdWU9IjE2IiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgi +IFN3aXRjaEZpZWxkPSJWYXJpYW50VHlwZSIgU3dpdGNoVmFsdWU9IjE3IiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iRXhwYW5kZWROb2RlSWQiIFR5cGVOYW1lPSJ1YTpFeHBhbmRlZE5vZGVJZCIg +TGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRj +aFZhbHVlPSIxOCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0YXR1c0NvZGUiIFR5cGVOYW1l +PSJ1YTpTdGF0dXNDb2RlIiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxkPSJW +YXJpYW50VHlwZSIgU3dpdGNoVmFsdWU9IjE5IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVh +bGlmaWVkTmFtZSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIExlbmd0aEZpZWxkPSJBcnJh +eUxlbmd0aCIgU3dpdGNoRmllbGQ9IlZhcmlhbnRUeXBlIiBTd2l0Y2hWYWx1ZT0iMjAiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGl6ZWRUZXh0IiBUeXBlTmFtZT0idWE6TG9jYWxpemVk +VGV4dCIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUi +IFN3aXRjaFZhbHVlPSIyMSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkV4dGVuc2lvbk9iamVj +dCIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3Ro +IiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSIyMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRhdGFWYWx1ZSIgVHlwZU5hbWU9InVhOkRhdGFWYWx1ZSIgTGVuZ3RoRmll +bGQ9IkFycmF5TGVuZ3RoIiBTd2l0Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSIy +MyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlZhcmlhbnQiIFR5cGVOYW1lPSJ1YTpWYXJpYW50 +IiBMZW5ndGhGaWVsZD0iQXJyYXlMZW5ndGgiIFN3aXRjaEZpZWxkPSJWYXJpYW50VHlwZSIgU3dp +dGNoVmFsdWU9IjI0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlhZ25vc3RpY0luZm8iIFR5 +cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9IkFycmF5TGVuZ3RoIiBTd2l0 +Y2hGaWVsZD0iVmFyaWFudFR5cGUiIFN3aXRjaFZhbHVlPSIyNSIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5vT2ZBcnJheURpbWVuc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIFN3aXRjaEZp +ZWxkPSJBcnJheURpbWVuc2lvbnNTcGVjaWZpZWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJB +cnJheURpbWVuc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIExlbmd0aEZpZWxkPSJOb09mQXJy +YXlEaW1lbnNpb25zIiBTd2l0Y2hGaWVsZD0iQXJyYXlEaW1lbnNpb25zU3BlY2lmaWVkIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9Ik5h +bWluZ1J1bGVUeXBlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJNYW5kYXRvcnkiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9Ik9wdGlvbmFsIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJDb25zdHJhaW50IiBWYWx1ZT0iMyIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQog +ICAgDQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJFbnVtZXJhdGlvbiIgTGVuZ3RoSW5C +aXRzPSIzMiI+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBO +YW1lPSJJbWFnZUJNUCI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBl +IE5hbWU9IkltYWdlR0lGIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5 +cGUgTmFtZT0iSW1hZ2VKUEciPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVl +VHlwZSBOYW1lPSJJbWFnZVBORyI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFx +dWVUeXBlIE5hbWU9IkF1ZGlvRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxv +cGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVW5pb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0i +Qml0RmllbGRNYXNrRGF0YVR5cGUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iS2V5VmFsdWVQYWlyIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IktleSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5h +bWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlwZU5hbWU9InVhOlZhcmlhbnQi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iQWRkaXRpb25hbFBhcmFtZXRlcnNUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0 +Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZQYXJhbWV0ZXJzIiBUeXBlTmFtZT0ib3BjOklu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUGFyYW1ldGVycyIgVHlwZU5hbWU9InRuczpL +ZXlWYWx1ZVBhaXIiIExlbmd0aEZpZWxkPSJOb09mUGFyYW1ldGVycyIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJFcGhlbWVyYWxLZXlU +eXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlB1YmxpY0tleSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iU2lnbmF0dXJlIiBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRW5kcG9pbnRUeXBl +IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVu +ZHBvaW50VXJsIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlNlY3VyaXR5TW9kZSIgVHlwZU5hbWU9InRuczpNZXNzYWdlU2VjdXJpdHlNb2RlIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlQb2xpY3lVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHJhbnNwb3J0UHJvZmlsZVVyaSIgVHlwZU5hbWU9 +Im9wYzpTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iUmF0aW9uYWxOdW1iZXIiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtZXJhdG9yIiBUeXBlTmFtZT0ib3BjOkludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVub21pbmF0b3IiIFR5cGVOYW1lPSJvcGM6VUlu +dDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IlZlY3RvciIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVGhyZWVEVmVjdG9y +IiBCYXNlVHlwZT0idG5zOlZlY3RvciI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJYIiBUeXBlTmFt +ZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlkiIFR5cGVOYW1lPSJvcGM6 +RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWiIgVHlwZU5hbWU9Im9wYzpEb3VibGUi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iQ2FydGVzaWFuQ29vcmRpbmF0ZXMiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlRo +cmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIiBCYXNlVHlwZT0idG5zOkNhcnRlc2lhbkNvb3JkaW5h +dGVzIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlgiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iWSIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJaIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJPcmllbnRhdGlvbiIgQmFz +ZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQog +IDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVGhyZWVET3JpZW50YXRpb24iIEJhc2VUeXBlPSJ0 +bnM6T3JpZW50YXRpb24iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQSIgVHlwZU5hbWU9Im9wYzpE +b3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkMiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8 +L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkZyYW1l +IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+ +DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJUaHJlZURGcmFtZSIgQmFzZVR5cGU9InRu +czpGcmFtZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDYXJ0ZXNpYW5Db29yZGluYXRlcyIgVHlw +ZU5hbWU9InRuczpUaHJlZURDYXJ0ZXNpYW5Db29yZGluYXRlcyIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik9yaWVudGF0aW9uIiBUeXBlTmFtZT0idG5zOlRocmVlRE9yaWVudGF0aW9uIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9Ik9w +ZW5GaWxlTW9kZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iUmVhZCIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +V3JpdGUiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkVyYXNl +RXhpc3RpbmciIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkFw +cGVuZCIgVmFsdWU9IjgiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6RW51 +bWVyYXRlZFR5cGUgTmFtZT0iSWRlbnRpdHlDcml0ZXJpYVR5cGUiIExlbmd0aEluQml0cz0iMzIi +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlVzZXJOYW1lIiBWYWx1ZT0iMSIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJUaHVtYnByaW50IiBWYWx1ZT0iMiIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJSb2xlIiBWYWx1ZT0iMyIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJHcm91cElkIiBWYWx1ZT0iNCIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBbm9ueW1vdXMiIFZhbHVlPSI1IiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9IkF1dGhlbnRpY2F0ZWRVc2VyIiBWYWx1ZT0iNiIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBcHBsaWNhdGlvbiIgVmFsdWU9IjciIC8+DQog +IDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iSWRl +bnRpdHlNYXBwaW5nUnVsZVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQ3JpdGVyaWFUeXBlIiBUeXBlTmFtZT0idG5zOklkZW50aXR5Q3Jp +dGVyaWFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ3JpdGVyaWEiIFR5cGVOYW1lPSJv +cGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVy +ZWRUeXBlIE5hbWU9IkN1cnJlbmN5VW5pdFR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtZXJpY0NvZGUiIFR5cGVOYW1lPSJvcGM6SW50 +MTYiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFeHBvbmVudCIgVHlwZU5hbWU9Im9wYzpTQnl0 +ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFscGhhYmV0aWNDb2RlIiBUeXBlTmFtZT0ib3Bj +OlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkN1cnJlbmN5IiBUeXBlTmFtZT0idWE6 +TG9jYWxpemVkVGV4dCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpFbnVt +ZXJhdGVkVHlwZSBOYW1lPSJUcnVzdExpc3RNYXNrcyIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAg +PG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iVHJ1c3RlZENlcnRpZmljYXRlcyIgVmFsdWU9IjEiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVHJ1c3RlZENybHMiIFZhbHVlPSIyIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Iklzc3VlckNlcnRpZmljYXRlcyIgVmFsdWU9 +IjQiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSXNzdWVyQ3JscyIgVmFsdWU9 +IjgiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQWxsIiBWYWx1ZT0iMTUiIC8+ +DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i +VHJ1c3RMaXN0RGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iU3BlY2lmaWVkTGlzdHMiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlRydXN0ZWRDZXJ0aWZpY2F0ZXMiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUcnVzdGVkQ2VydGlmaWNhdGVzIiBU +eXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mVHJ1c3RlZENlcnRpZmlj +YXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZUcnVzdGVkQ3JscyIgVHlwZU5hbWU9 +Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRydXN0ZWRDcmxzIiBUeXBlTmFt +ZT0ib3BjOkJ5dGVTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mVHJ1c3RlZENybHMiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb09mSXNzdWVyQ2VydGlmaWNhdGVzIiBUeXBlTmFtZT0ib3BjOklu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNzdWVyQ2VydGlmaWNhdGVzIiBUeXBlTmFt +ZT0ib3BjOkJ5dGVTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mSXNzdWVyQ2VydGlmaWNhdGVzIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZklzc3VlckNybHMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJc3N1ZXJDcmxzIiBUeXBlTmFtZT0ib3BjOkJ5 +dGVTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mSXNzdWVyQ3JscyIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWNpbWFsRGF0YVR5cGUi +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2Nh +bGUiIFR5cGVOYW1lPSJvcGM6SW50MTYiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIg +VHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0K +ICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFUeXBlU2NoZW1hSGVhZGVyIiBCYXNlVHlw +ZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZOYW1lc3Bh +Y2VzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmFtZXNw +YWNlcyIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mTmFtZXNwYWNlcyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTdHJ1Y3R1cmVEYXRhVHlwZXMiIFR5cGVOYW1l +PSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1cmVEYXRhVHlwZXMi +IFR5cGVOYW1lPSJ0bnM6U3RydWN0dXJlRGVzY3JpcHRpb24iIExlbmd0aEZpZWxkPSJOb09mU3Ry +dWN0dXJlRGF0YVR5cGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkVudW1EYXRhVHlw +ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbnVtRGF0 +YVR5cGVzIiBUeXBlTmFtZT0idG5zOkVudW1EZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZF +bnVtRGF0YVR5cGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlNpbXBsZURhdGFUeXBl +cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNpbXBsZURh +dGFUeXBlcyIgVHlwZU5hbWU9InRuczpTaW1wbGVUeXBlRGVzY3JpcHRpb24iIExlbmd0aEZpZWxk +PSJOb09mU2ltcGxlRGF0YVR5cGVzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFUeXBlRGVzY3JpcHRpb24iIEJhc2VUeXBlPSJ1 +YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGVJZCIgVHlw +ZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWUiIFR5cGVOYW1l +PSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IlN0cnVjdHVyZURlc2NyaXB0aW9uIiBCYXNlVHlwZT0idG5z +OkRhdGFUeXBlRGVzY3JpcHRpb24iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGVJZCIg +VHlwZU5hbWU9InVhOk5vZGVJZCIgU291cmNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24i +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFt +ZSIgU291cmNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTdHJ1Y3R1cmVEZWZpbml0aW9uIiBUeXBlTmFtZT0idG5zOlN0cnVjdHVyZURlZmlu +aXRpb24iIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iRW51bURlc2NyaXB0aW9uIiBCYXNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRp +b24iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJ +ZCIgU291cmNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgU291cmNlVHlwZT0idG5z +OkRhdGFUeXBlRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbnVtRGVmaW5p +dGlvbiIgVHlwZU5hbWU9InRuczpFbnVtRGVmaW5pdGlvbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkJ1aWx0SW5UeXBlIiBUeXBlTmFtZT0ib3BjOkJ5dGUiIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU2ltcGxlVHlwZURlc2NyaXB0 +aW9uIiBCYXNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24iPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iRGF0YVR5cGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgU291cmNlVHlwZT0idG5zOkRh +dGFUeXBlRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBlTmFt +ZT0idWE6UXVhbGlmaWVkTmFtZSIgU291cmNlVHlwZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24i +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCYXNlRGF0YVR5cGUiIFR5cGVOYW1lPSJ1YTpOb2Rl +SWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCdWlsdEluVHlwZSIgVHlwZU5hbWU9Im9wYzpC +eXRlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IlVBQmluYXJ5RmlsZURhdGFUeXBlIiBCYXNlVHlwZT0idG5zOkRhdGFUeXBlU2NoZW1h +SGVhZGVyIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZOYW1lc3BhY2VzIiBUeXBlTmFtZT0i +b3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmFtZXNwYWNlcyIgVHlwZU5hbWU9 +Im9wYzpTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mTmFtZXNwYWNlcyIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vT2ZTdHJ1Y3R1cmVEYXRhVHlwZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1cmVEYXRhVHlwZXMiIFR5cGVOYW1lPSJ0bnM6 +U3RydWN0dXJlRGVzY3JpcHRpb24iIExlbmd0aEZpZWxkPSJOb09mU3RydWN0dXJlRGF0YVR5cGVz +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkVudW1EYXRhVHlwZXMiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbnVtRGF0YVR5cGVzIiBUeXBlTmFt +ZT0idG5zOkVudW1EZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZFbnVtRGF0YVR5cGVzIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlNpbXBsZURhdGFUeXBlcyIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNpbXBsZURhdGFUeXBlcyIgVHlwZU5h +bWU9InRuczpTaW1wbGVUeXBlRGVzY3JpcHRpb24iIExlbmd0aEZpZWxkPSJOb09mU2ltcGxlRGF0 +YVR5cGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2NoZW1hTG9jYXRpb24iIFR5cGVOYW1l +PSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkZpbGVIZWFkZXIiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJGaWxlSGVhZGVyIiBU +eXBlTmFtZT0idG5zOktleVZhbHVlUGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZGaWxlSGVhZGVyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQm9keSIgVHlwZU5hbWU9InVhOlZhcmlhbnQiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iUHVi +U3ViU3RhdGUiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IkRpc2FibGVkIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l +PSJQYXVzZWQiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9w +ZXJhdGlvbmFsIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJF +cnJvciIgVmFsdWU9IjMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUHJlT3Bl +cmF0aW9uYWwiIFZhbHVlPSI0IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFTZXRNZXRhRGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6 +RGF0YVR5cGVTY2hlbWFIZWFkZXIiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZk5hbWVzcGFj +ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lc3Bh +Y2VzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZOYW1lc3BhY2VzIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN0cnVjdHVyZURhdGFUeXBlcyIgVHlwZU5hbWU9 +Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0cnVjdHVyZURhdGFUeXBlcyIg +VHlwZU5hbWU9InRuczpTdHJ1Y3R1cmVEZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdHJ1 +Y3R1cmVEYXRhVHlwZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRW51bURhdGFUeXBl +cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVudW1EYXRh +VHlwZXMiIFR5cGVOYW1lPSJ0bnM6RW51bURlc2NyaXB0aW9uIiBMZW5ndGhGaWVsZD0iTm9PZkVu +dW1EYXRhVHlwZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU2ltcGxlRGF0YVR5cGVz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2ltcGxlRGF0 +YVR5cGVzIiBUeXBlTmFtZT0idG5zOlNpbXBsZVR5cGVEZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9 +Ik5vT2ZTaW1wbGVEYXRhVHlwZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBl +TmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBU +eXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZG +aWVsZHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJGaWVs +ZHMiIFR5cGVOYW1lPSJ0bnM6RmllbGRNZXRhRGF0YSIgTGVuZ3RoRmllbGQ9Ik5vT2ZGaWVsZHMi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhU2V0Q2xhc3NJZCIgVHlwZU5hbWU9Im9wYzpH +dWlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ29uZmlndXJhdGlvblZlcnNpb24iIFR5cGVO +YW1lPSJ0bnM6Q29uZmlndXJhdGlvblZlcnNpb25EYXRhVHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJGaWVsZE1ldGFEYXRhIiBC +YXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWUi +IFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3JpcHRp +b24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RmllbGRGbGFncyIgVHlwZU5hbWU9InRuczpEYXRhU2V0RmllbGRGbGFncyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkJ1aWx0SW5UeXBlIiBUeXBlTmFtZT0ib3BjOkJ5dGUiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEYXRhVHlwZSIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlZhbHVlUmFuayIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZBcnJheURpbWVuc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBcnJheURpbWVuc2lvbnMiIFR5cGVOYW1lPSJvcGM6VUlu +dDMyIiBMZW5ndGhGaWVsZD0iTm9PZkFycmF5RGltZW5zaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik1heFN0cmluZ0xlbmd0aCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEYXRhU2V0RmllbGRJZCIgVHlwZU5hbWU9Im9wYzpHdWlkIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTm9PZlByb3BlcnRpZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQcm9wZXJ0aWVzIiBUeXBlTmFtZT0idG5zOktleVZhbHVl +UGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZQcm9wZXJ0aWVzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkRhdGFTZXRGaWVsZEZsYWdzIiBM +ZW5ndGhJbkJpdHM9IjE2IiBJc09wdGlvblNldD0idHJ1ZSI+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iUHJvbW90ZWRGaWVsZCIgVmFsdWU9IjEiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBl +Pg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ29uZmlndXJhdGlvblZlcnNpb25EYXRh +VHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJNYWpvclZlcnNpb24iIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTWlub3JWZXJzaW9uIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJQdWJsaXNoZWREYXRh +U2V0RGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mRGF0YVNldEZvbGRlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRhdGFTZXRGb2xkZXIiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhG +aWVsZD0iTm9PZkRhdGFTZXRGb2xkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhU2V0 +TWV0YURhdGEiIFR5cGVOYW1lPSJ0bnM6RGF0YVNldE1ldGFEYXRhVHlwZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZFeHRlbnNpb25GaWVsZHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFeHRlbnNpb25GaWVsZHMiIFR5cGVOYW1lPSJ0bnM6S2V5 +VmFsdWVQYWlyIiBMZW5ndGhGaWVsZD0iTm9PZkV4dGVuc2lvbkZpZWxkcyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRhdGFTZXRTb3VyY2UiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3Qi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iUHVibGlzaGVkRGF0YVNldFNvdXJjZURhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlw +ZSBOYW1lPSJQdWJsaXNoZWRWYXJpYWJsZURhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlB1Ymxpc2hlZFZhcmlhYmxlIiBUeXBlTmFt +ZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXR0cmlidXRlSWQiIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2FtcGxpbmdJbnRlcnZh +bEhpbnQiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVh +ZGJhbmRUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRlYWRiYW5kVmFsdWUiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iSW5kZXhSYW5nZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTdWJzdGl0dXRlVmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTm9PZk1ldGFEYXRhUHJvcGVydGllcyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1ldGFEYXRhUHJvcGVydGllcyIgVHlwZU5hbWU9 +InVhOlF1YWxpZmllZE5hbWUiIExlbmd0aEZpZWxkPSJOb09mTWV0YURhdGFQcm9wZXJ0aWVzIiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +IlB1Ymxpc2hlZERhdGFJdGVtc0RhdGFUeXBlIiBCYXNlVHlwZT0idG5zOlB1Ymxpc2hlZERhdGFT +ZXRTb3VyY2VEYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUHVibGlzaGVkRGF0 +YSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlB1Ymxpc2hl +ZERhdGEiIFR5cGVOYW1lPSJ0bnM6UHVibGlzaGVkVmFyaWFibGVEYXRhVHlwZSIgTGVuZ3RoRmll +bGQ9Ik5vT2ZQdWJsaXNoZWREYXRhIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlB1Ymxpc2hlZEV2ZW50c0RhdGFUeXBlIiBCYXNlVHlw +ZT0idG5zOlB1Ymxpc2hlZERhdGFTZXRTb3VyY2VEYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJFdmVudE5vdGlmaWVyIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZlNlbGVjdGVkRmllbGRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iU2VsZWN0ZWRGaWVsZHMiIFR5cGVOYW1lPSJ0bnM6U2ltcGxlQXR0 +cmlidXRlT3BlcmFuZCIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZWxlY3RlZEZpZWxkcyIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IkZpbHRlciIgVHlwZU5hbWU9InRuczpDb250ZW50RmlsdGVyIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkRh +dGFTZXRGaWVsZENvbnRlbnRNYXNrIiBMZW5ndGhJbkJpdHM9IjMyIiBJc09wdGlvblNldD0idHJ1 +ZSI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU3RhdHVzQ29kZSIgVmFsdWU9IjEiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU291cmNlVGltZXN0YW1wIiBWYWx1ZT0iMiIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTZXJ2ZXJUaW1lc3RhbXAiIFZhbHVl +PSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlNvdXJjZVBpY29TZWNvbmRz +IiBWYWx1ZT0iOCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTZXJ2ZXJQaWNv +U2Vjb25kcyIgVmFsdWU9IjE2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJh +d0RhdGEiIFZhbHVlPSIzMiIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpT +dHJ1Y3R1cmVkVHlwZSBOYW1lPSJEYXRhU2V0V3JpdGVyRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpF +eHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmFtZSIgVHlwZU5hbWU9Im9w +YzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmFibGVkIiBUeXBlTmFtZT0ib3Bj +OkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhU2V0V3JpdGVySWQiIFR5cGVO +YW1lPSJvcGM6VUludDE2IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVNldEZpZWxkQ29u +dGVudE1hc2siIFR5cGVOYW1lPSJ0bnM6RGF0YVNldEZpZWxkQ29udGVudE1hc2siIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJLZXlGcmFtZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFTZXROYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRhU2V0V3JpdGVyUHJvcGVydGllcyIgVHlw +ZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFTZXRXcml0ZXJQ +cm9wZXJ0aWVzIiBUeXBlTmFtZT0idG5zOktleVZhbHVlUGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZE +YXRhU2V0V3JpdGVyUHJvcGVydGllcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRyYW5zcG9y +dFNldHRpbmdzIiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTWVzc2FnZVNldHRpbmdzIiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +IkRhdGFTZXRXcml0ZXJUcmFuc3BvcnREYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iUHViU3ViR3JvdXBEYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkVuYWJsZWQiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlY3VyaXR5TW9kZSIgVHlwZU5hbWU9InRuczpNZXNzYWdl +U2VjdXJpdHlNb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlHcm91cElkIiBU +eXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTZWN1cml0 +eUtleVNlcnZpY2VzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iU2VjdXJpdHlLZXlTZXJ2aWNlcyIgVHlwZU5hbWU9InRuczpFbmRwb2ludERlc2NyaXB0aW9u +IiBMZW5ndGhGaWVsZD0iTm9PZlNlY3VyaXR5S2V5U2VydmljZXMiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJNYXhOZXR3b3JrTWVzc2FnZVNpemUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkdyb3VwUHJvcGVydGllcyIgVHlwZU5hbWU9Im9wYzpJ +bnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikdyb3VwUHJvcGVydGllcyIgVHlwZU5hbWU9 +InRuczpLZXlWYWx1ZVBhaXIiIExlbmd0aEZpZWxkPSJOb09mR3JvdXBQcm9wZXJ0aWVzIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ildy +aXRlckdyb3VwRGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6UHViU3ViR3JvdXBEYXRhVHlwZSI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlw +ZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmFi +bGVkIiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIFNvdXJjZVR5cGU9InRuczpQdWJTdWJHcm91cERh +dGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlNb2RlIiBUeXBlTmFtZT0i +dG5zOk1lc3NhZ2VTZWN1cml0eU1vZGUiIFNvdXJjZVR5cGU9InRuczpQdWJTdWJHcm91cERhdGFU +eXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlHcm91cElkIiBUeXBlTmFtZT0i +b3BjOlN0cmluZyIgU291cmNlVHlwZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb09mU2VjdXJpdHlLZXlTZXJ2aWNlcyIgVHlwZU5hbWU9Im9wYzpJ +bnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlY3VyaXR5S2V5U2VydmljZXMiIFR5cGVO +YW1lPSJ0bnM6RW5kcG9pbnREZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZWN1cml0eUtl +eVNlcnZpY2VzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTWF4TmV0d29ya01lc3NhZ2VTaXpl +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5 +cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mR3JvdXBQcm9wZXJ0aWVzIiBUeXBlTmFt +ZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iR3JvdXBQcm9wZXJ0aWVzIiBU +eXBlTmFtZT0idG5zOktleVZhbHVlUGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZHcm91cFByb3BlcnRp +ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZXJHcm91cElkIiBUeXBlTmFtZT0ib3Bj +OlVJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlB1Ymxpc2hpbmdJbnRlcnZhbCIgVHlw +ZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJLZWVwQWxpdmVUaW1l +IiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlByaW9yaXR5 +IiBUeXBlTmFtZT0ib3BjOkJ5dGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTG9jYWxl +SWRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTG9jYWxl +SWRzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZMb2NhbGVJZHMiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJIZWFkZXJMYXlvdXRVcmkiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHJhbnNwb3J0U2V0dGluZ3MiIFR5cGVOYW1l +PSJ1YTpFeHRlbnNpb25PYmplY3QiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNZXNzYWdlU2V0 +dGluZ3MiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mRGF0YVNldFdyaXRlcnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEYXRhU2V0V3JpdGVycyIgVHlwZU5hbWU9InRuczpEYXRhU2V0V3JpdGVy +RGF0YVR5cGUiIExlbmd0aEZpZWxkPSJOb09mRGF0YVNldFdyaXRlcnMiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iV3JpdGVyR3JvdXBU +cmFuc3BvcnREYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogIDwvb3Bj +OlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iV3JpdGVyR3Jv +dXBNZXNzYWdlRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICA8L29w +YzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlB1YlN1YkNv +bm5lY3Rpb25EYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkVuYWJsZWQiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlB1Ymxpc2hlcklkIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlRyYW5zcG9ydFByb2ZpbGVVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWRkcmVzcyIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9i +amVjdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZDb25uZWN0aW9uUHJvcGVydGllcyIg +VHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbm5lY3Rpb25Q +cm9wZXJ0aWVzIiBUeXBlTmFtZT0idG5zOktleVZhbHVlUGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZD +b25uZWN0aW9uUHJvcGVydGllcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRyYW5zcG9ydFNl +dHRpbmdzIiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTm9PZldyaXRlckdyb3VwcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IldyaXRlckdyb3VwcyIgVHlwZU5hbWU9InRuczpXcml0ZXJHcm91cERhdGFU +eXBlIiBMZW5ndGhGaWVsZD0iTm9PZldyaXRlckdyb3VwcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik5vT2ZSZWFkZXJHcm91cHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJSZWFkZXJHcm91cHMiIFR5cGVOYW1lPSJ0bnM6UmVhZGVyR3JvdXBEYXRhVHlw +ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWFkZXJHcm91cHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ29ubmVjdGlvblRyYW5zcG9ydERh +dGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgPC9vcGM6U3RydWN0dXJl +ZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJOZXR3b3JrQWRkcmVzc0RhdGFU +eXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +Ik5ldHdvcmtJbnRlcmZhY2UiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik5ldHdvcmtBZGRyZXNz +VXJsRGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6TmV0d29ya0FkZHJlc3NEYXRhVHlwZSI+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOZXR3b3JrSW50ZXJmYWNlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIg +U291cmNlVHlwZT0idG5zOk5ldHdvcmtBZGRyZXNzRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJVcmwiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlYWRlckdyb3VwRGF0YVR5cGUi +IEJhc2VUeXBlPSJ0bnM6UHViU3ViR3JvdXBEYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlwZT0idG5zOlB1YlN1Ykdyb3Vw +RGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmFibGVkIiBUeXBlTmFtZT0ib3Bj +OkJvb2xlYW4iIFNvdXJjZVR5cGU9InRuczpQdWJTdWJHcm91cERhdGFUeXBlIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iU2VjdXJpdHlNb2RlIiBUeXBlTmFtZT0idG5zOk1lc3NhZ2VTZWN1cml0 +eU1vZGUiIFNvdXJjZVR5cGU9InRuczpQdWJTdWJHcm91cERhdGFUeXBlIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iU2VjdXJpdHlHcm91cElkIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgU291cmNl +VHlwZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mU2VjdXJpdHlLZXlTZXJ2aWNlcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlNlY3VyaXR5S2V5U2VydmljZXMiIFR5cGVOYW1lPSJ0bnM6RW5kcG9pbnRE +ZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZWN1cml0eUtleVNlcnZpY2VzIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTWF4TmV0d29ya01lc3NhZ2VTaXplIiBUeXBlTmFtZT0ib3BjOlVJ +bnQzMiIgU291cmNlVHlwZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJOb09mR3JvdXBQcm9wZXJ0aWVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iR3JvdXBQcm9wZXJ0aWVzIiBUeXBlTmFtZT0idG5zOktleVZh +bHVlUGFpciIgTGVuZ3RoRmllbGQ9Ik5vT2ZHcm91cFByb3BlcnRpZXMiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJUcmFuc3BvcnRTZXR0aW5ncyIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVj +dCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1lc3NhZ2VTZXR0aW5ncyIgVHlwZU5hbWU9InVh +OkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRhU2V0UmVh +ZGVycyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFT +ZXRSZWFkZXJzIiBUeXBlTmFtZT0idG5zOkRhdGFTZXRSZWFkZXJEYXRhVHlwZSIgTGVuZ3RoRmll +bGQ9Ik5vT2ZEYXRhU2V0UmVhZGVycyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJSZWFkZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIiBC +YXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJSZWFkZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGF0YVNldFJlYWRlckRhdGFUeXBlIiBCYXNl +VHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWUiIFR5 +cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRW5hYmxlZCIgVHlw +ZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHVibGlzaGVySWQi +IFR5cGVOYW1lPSJ1YTpWYXJpYW50IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iV3JpdGVyR3Jv +dXBJZCIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRh +U2V0V3JpdGVySWQiIFR5cGVOYW1lPSJvcGM6VUludDE2IiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iRGF0YVNldE1ldGFEYXRhIiBUeXBlTmFtZT0idG5zOkRhdGFTZXRNZXRhRGF0YVR5cGUiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhU2V0RmllbGRDb250ZW50TWFzayIgVHlwZU5hbWU9 +InRuczpEYXRhU2V0RmllbGRDb250ZW50TWFzayIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1l +c3NhZ2VSZWNlaXZlVGltZW91dCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJLZXlGcmFtZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IkhlYWRlckxheW91dFVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZWN1cml0eU1vZGUiIFR5cGVOYW1lPSJ0bnM6TWVzc2Fn +ZVNlY3VyaXR5TW9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlY3VyaXR5R3JvdXBJZCIg +VHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU2VjdXJp +dHlLZXlTZXJ2aWNlcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlNlY3VyaXR5S2V5U2VydmljZXMiIFR5cGVOYW1lPSJ0bnM6RW5kcG9pbnREZXNjcmlwdGlv +biIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZWN1cml0eUtleVNlcnZpY2VzIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZkRhdGFTZXRSZWFkZXJQcm9wZXJ0aWVzIiBUeXBlTmFtZT0ib3BjOkludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVNldFJlYWRlclByb3BlcnRpZXMiIFR5cGVO +YW1lPSJ0bnM6S2V5VmFsdWVQYWlyIiBMZW5ndGhGaWVsZD0iTm9PZkRhdGFTZXRSZWFkZXJQcm9w +ZXJ0aWVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHJhbnNwb3J0U2V0dGluZ3MiIFR5cGVO +YW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNZXNzYWdl +U2V0dGluZ3MiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTdWJzY3JpYmVkRGF0YVNldCIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIg +Lz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l +PSJEYXRhU2V0UmVhZGVyVHJhbnNwb3J0RGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IkRhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IlN1YnNjcmliZWREYXRhU2V0RGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IlRhcmdldFZhcmlhYmxlc0RhdGFUeXBlIiBCYXNlVHlwZT0idG5zOlN1YnNjcmli +ZWREYXRhU2V0RGF0YVR5cGUiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlRhcmdldFZhcmlh +YmxlcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRhcmdl +dFZhcmlhYmxlcyIgVHlwZU5hbWU9InRuczpGaWVsZFRhcmdldERhdGFUeXBlIiBMZW5ndGhGaWVs +ZD0iTm9PZlRhcmdldFZhcmlhYmxlcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJGaWVsZFRhcmdldERhdGFUeXBlIiBCYXNlVHlwZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFTZXRGaWVsZElk +IiBUeXBlTmFtZT0ib3BjOkd1aWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWNlaXZlcklu +ZGV4UmFuZ2UiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VGFyZ2V0Tm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iQXR0cmlidXRlSWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iV3JpdGVJbmRleFJhbmdlIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik92ZXJyaWRlVmFsdWVIYW5kbGluZyIgVHlwZU5hbWU9InRuczpPdmVycmlk +ZVZhbHVlSGFuZGxpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJPdmVycmlkZVZhbHVlIiBU +eXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJPdmVycmlkZVZhbHVlSGFuZGxpbmciIExlbmd0aEluQml0 +cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRpc2FibGVkIiBWYWx1ZT0i +MCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJMYXN0VXNhYmxlVmFsdWUiIFZh +bHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik92ZXJyaWRlVmFsdWUi +IFZhbHVlPSIyIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVy +ZWRUeXBlIE5hbWU9IlN1YnNjcmliZWREYXRhU2V0TWlycm9yRGF0YVR5cGUiIEJhc2VUeXBlPSJ0 +bnM6U3Vic2NyaWJlZERhdGFTZXREYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQYXJl +bnROb2RlTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb09mUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQZXJtaXNzaW9u +VHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIC8+DQogIDwvb3BjOlN0cnVj +dHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUHViU3ViQ29uZmlndXJh +dGlvbkRhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vT2ZQdWJsaXNoZWREYXRhU2V0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlB1Ymxpc2hlZERhdGFTZXRzIiBUeXBlTmFtZT0idG5zOlB1 +Ymxpc2hlZERhdGFTZXREYXRhVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZQdWJsaXNoZWREYXRhU2V0 +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZDb25uZWN0aW9ucyIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbm5lY3Rpb25zIiBUeXBlTmFtZT0i +dG5zOlB1YlN1YkNvbm5lY3Rpb25EYXRhVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZDb25uZWN0aW9u +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVuYWJsZWQiIFR5cGVOYW1lPSJvcGM6Qm9vbGVh +biIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBO +YW1lPSJEYXRhU2V0T3JkZXJpbmdUeXBlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVu +dW1lcmF0ZWRWYWx1ZSBOYW1lPSJVbmRlZmluZWQiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51 +bWVyYXRlZFZhbHVlIE5hbWU9IkFzY2VuZGluZ1dyaXRlcklkIiBWYWx1ZT0iMSIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBc2NlbmRpbmdXcml0ZXJJZFNpbmdsZSIgVmFsdWU9 +IjIiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUg +TmFtZT0iVWFkcE5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIExlbmd0aEluQml0cz0iMzIiIElz +T3B0aW9uU2V0PSJ0cnVlIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb25lIiBW +YWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJQdWJsaXNoZXJJZCIg +VmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iR3JvdXBIZWFkZXIi +IFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IldyaXRlckdyb3Vw +SWQiIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikdyb3VwVmVy +c2lvbiIgVmFsdWU9IjgiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTmV0d29y +a01lc3NhZ2VOdW1iZXIiIFZhbHVlPSIxNiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJTZXF1ZW5jZU51bWJlciIgVmFsdWU9IjMyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9IlBheWxvYWRIZWFkZXIiIFZhbHVlPSI2NCIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJUaW1lc3RhbXAiIFZhbHVlPSIxMjgiIC8+DQogICAgPG9wYzpFbnVtZXJh +dGVkVmFsdWUgTmFtZT0iUGljb1NlY29uZHMiIFZhbHVlPSIyNTYiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iRGF0YVNldENsYXNzSWQiIFZhbHVlPSI1MTIiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUHJvbW90ZWRGaWVsZHMiIFZhbHVlPSIxMDI0IiAvPg0K +ICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVh +ZHBXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgQmFzZVR5cGU9InRuczpXcml0ZXJHcm91cE1l +c3NhZ2VEYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJHcm91cFZlcnNpb24iIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVNldE9yZGVyaW5n +IiBUeXBlTmFtZT0idG5zOkRhdGFTZXRPcmRlcmluZ1R5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOZXR3b3JrTWVzc2FnZUNvbnRlbnRNYXNrIiBUeXBlTmFtZT0idG5zOlVhZHBOZXR3b3Jr +TWVzc2FnZUNvbnRlbnRNYXNrIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2FtcGxpbmdPZmZz +ZXQiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlB1 +Ymxpc2hpbmdPZmZzZXQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJQdWJsaXNoaW5nT2Zmc2V0IiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgTGVuZ3RoRmllbGQ9 +Ik5vT2ZQdWJsaXNoaW5nT2Zmc2V0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IlVhZHBEYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBM +ZW5ndGhJbkJpdHM9IjMyIiBJc09wdGlvblNldD0idHJ1ZSI+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iVGltZXN0YW1wIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJQaWNvU2Vjb25kcyIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iU3RhdHVzIiBWYWx1ZT0iNCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l +PSJNYWpvclZlcnNpb24iIFZhbHVlPSI4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9Ik1pbm9yVmVyc2lvbiIgVmFsdWU9IjE2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IlNlcXVlbmNlTnVtYmVyIiBWYWx1ZT0iMzIiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVWFkcERhdGFTZXRXcml0ZXJNZXNz +YWdlRGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6RGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSI+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBUeXBlTmFt +ZT0idG5zOlVhZHBEYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iQ29uZmlndXJlZFNpemUiIFR5cGVOYW1lPSJvcGM6VUludDE2IiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTmV0d29ya01lc3NhZ2VOdW1iZXIiIFR5cGVOYW1lPSJvcGM6VUludDE2IiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVNldE9mZnNldCIgVHlwZU5hbWU9Im9wYzpVSW50 +MTYiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iVWFkcERhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6RGF0 +YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJHcm91cFZl +cnNpb24iIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmV0 +d29ya01lc3NhZ2VOdW1iZXIiIFR5cGVOYW1lPSJvcGM6VUludDE2IiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iRGF0YVNldE9mZnNldCIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEYXRhU2V0Q2xhc3NJZCIgVHlwZU5hbWU9Im9wYzpHdWlkIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgVHlwZU5hbWU9InRu +czpVYWRwTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRhdGFTZXRNZXNzYWdlQ29udGVudE1hc2siIFR5cGVOYW1lPSJ0bnM6VWFkcERhdGFTZXRNZXNz +YWdlQ29udGVudE1hc2siIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQdWJsaXNoaW5nSW50ZXJ2 +YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVjZWl2 +ZU9mZnNldCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQ +cm9jZXNzaW5nT2Zmc2V0IiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJKc29uTmV0d29ya01lc3Nh +Z2VDb250ZW50TWFzayIgTGVuZ3RoSW5CaXRzPSIzMiIgSXNPcHRpb25TZXQ9InRydWUiPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5ldHdvcmtNZXNzYWdlSGVhZGVyIiBWYWx1ZT0iMSIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEYXRhU2V0TWVzc2FnZUhlYWRlciIgVmFs +dWU9IjIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU2luZ2xlRGF0YVNldE1l +c3NhZ2UiIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlB1Ymxp +c2hlcklkIiBWYWx1ZT0iOCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEYXRh +U2V0Q2xhc3NJZCIgVmFsdWU9IjE2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IlJlcGx5VG8iIFZhbHVlPSIzMiIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJKc29uV3JpdGVyR3JvdXBNZXNzYWdlRGF0YVR5cGUiIEJh +c2VUeXBlPSJ0bnM6V3JpdGVyR3JvdXBNZXNzYWdlRGF0YVR5cGUiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgVHlwZU5hbWU9InRuczpKc29uTmV0d29y +a01lc3NhZ2VDb250ZW50TWFzayIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJKc29uRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIgTGVu +Z3RoSW5CaXRzPSIzMiIgSXNPcHRpb25TZXQ9InRydWUiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IkRhdGFTZXRXcml0ZXJJZCIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFs +dWUgTmFtZT0iTWV0YURhdGFWZXJzaW9uIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJTZXF1ZW5jZU51bWJlciIgVmFsdWU9IjQiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iVGltZXN0YW1wIiBWYWx1ZT0iOCIgLz4NCiAgICA8b3BjOkVudW1l +cmF0ZWRWYWx1ZSBOYW1lPSJTdGF0dXMiIFZhbHVlPSIxNiIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJNZXNzYWdlVHlwZSIgVmFsdWU9IjMyIiAvPg0KICA8L29wYzpFbnVtZXJh +dGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikpzb25EYXRhU2V0V3JpdGVy +TWVzc2FnZURhdGFUeXBlIiBCYXNlVHlwZT0idG5zOkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5 +cGUiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIgVHlw +ZU5hbWU9InRuczpKc29uRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJKc29uRGF0YVNldFJl +YWRlck1lc3NhZ2VEYXRhVHlwZSIgQmFzZVR5cGU9InRuczpEYXRhU2V0UmVhZGVyTWVzc2FnZURh +dGFUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2si +IFR5cGVOYW1lPSJ0bnM6SnNvbk5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBUeXBlTmFtZT0idG5zOkpz +b25EYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFncmFtQ29ubmVjdGlvblRyYW5zcG9y +dERhdGFUeXBlIiBCYXNlVHlwZT0idG5zOkNvbm5lY3Rpb25UcmFuc3BvcnREYXRhVHlwZSI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNjb3ZlcnlBZGRyZXNzIiBUeXBlTmFtZT0idWE6RXh0ZW5z +aW9uT2JqZWN0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVy +ZWRUeXBlIE5hbWU9IkRhdGFncmFtV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgQmFzZVR5 +cGU9InRuczpXcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik1lc3NhZ2VSZXBlYXRDb3VudCIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTWVzc2FnZVJlcGVhdERlbGF5IiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4N +CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJC +cm9rZXJDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6Q29ubmVjdGlv +blRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc291cmNlVXJpIiBU +eXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkF1dGhlbnRpY2F0 +aW9uUHJvZmlsZVVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iQnJva2VyVHJhbnNwb3J0UXVh +bGl0eU9mU2VydmljZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFs +dWUgTmFtZT0iTm90U3BlY2lmaWVkIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJCZXN0RWZmb3J0IiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJBdExlYXN0T25jZSIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iQXRNb3N0T25jZSIgVmFsdWU9IjMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iRXhhY3RseU9uY2UiIFZhbHVlPSI0IiAvPg0KICA8L29wYzpFbnVtZXJhdGVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkJyb2tlcldyaXRlckdyb3VwVHJh +bnNwb3J0RGF0YVR5cGUiIEJhc2VUeXBlPSJ0bnM6V3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlw +ZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJRdWV1ZU5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzb3VyY2VVcmkiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXV0aGVudGljYXRpb25Qcm9maWxlVXJpIiBU +eXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RlZERl +bGl2ZXJ5R3VhcmFudGVlIiBUeXBlTmFtZT0idG5zOkJyb2tlclRyYW5zcG9ydFF1YWxpdHlPZlNl +cnZpY2UiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iQnJva2VyRGF0YVNldFdyaXRlclRyYW5zcG9ydERhdGFUeXBlIiBCYXNlVHlwZT0i +dG5zOkRhdGFTZXRXcml0ZXJUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJRdWV1ZU5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iUmVzb3VyY2VVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iQXV0aGVudGljYXRpb25Qcm9maWxlVXJpIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RlZERlbGl2ZXJ5R3VhcmFudGVlIiBUeXBlTmFt +ZT0idG5zOkJyb2tlclRyYW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJNZXRhRGF0YVF1ZXVlTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJNZXRhRGF0YVVwZGF0ZVRpbWUiIFR5cGVOYW1lPSJvcGM6RG91Ymxl +IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5h +bWU9IkJyb2tlckRhdGFTZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSIgQmFzZVR5cGU9InRuczpE +YXRhU2V0UmVhZGVyVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVl +dWVOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJl +c291cmNlVXJpIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkF1dGhlbnRpY2F0aW9uUHJvZmlsZVVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeUd1YXJhbnRlZSIgVHlwZU5hbWU9InRu +czpCcm9rZXJUcmFuc3BvcnRRdWFsaXR5T2ZTZXJ2aWNlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTWV0YURhdGFRdWV1ZU5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpT +dHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkRpYWdub3N0aWNz +TGV2ZWwiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IkJhc2ljIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBZHZh +bmNlZCIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW5mbyIg +VmFsdWU9IjIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTG9nIiBWYWx1ZT0i +MyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEZWJ1ZyIgVmFsdWU9IjQiIC8+ +DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0i +UHViU3ViRGlhZ25vc3RpY3NDb3VudGVyQ2xhc3NpZmljYXRpb24iIExlbmd0aEluQml0cz0iMzIi +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkluZm9ybWF0aW9uIiBWYWx1ZT0iMCIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJFcnJvciIgVmFsdWU9IjEiIC8+DQog +IDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWxp +YXNOYW1lRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iQWxpYXNOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZWZlcmVuY2VkTm9kZXMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VkTm9kZXMiIFR5cGVOYW1lPSJ1 +YTpFeHBhbmRlZE5vZGVJZCIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWZlcmVuY2VkTm9kZXMiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iRHVw +bGV4IiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJG +dWxsIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJIYWxmIiBW +YWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVbmtub3duIiBWYWx1 +ZT0iMiIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlw +ZSBOYW1lPSJJbnRlcmZhY2VBZG1pblN0YXR1cyIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVXAiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IkRvd24iIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9IlRlc3RpbmciIFZhbHVlPSIyIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4N +Cg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkludGVyZmFjZU9wZXJTdGF0dXMiIExlbmd0 +aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlVwIiBWYWx1ZT0i +MCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEb3duIiBWYWx1ZT0iMSIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJUZXN0aW5nIiBWYWx1ZT0iMiIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVbmtub3duIiBWYWx1ZT0iMyIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEb3JtYW50IiBWYWx1ZT0iNCIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb3RQcmVzZW50IiBWYWx1ZT0iNSIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJMb3dlckxheWVyRG93biIgVmFsdWU9IjYiIC8+DQogIDwv +b3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iTmVnb3Rp +YXRpb25TdGF0dXMiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IkluUHJvZ3Jlc3MiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IkNvbXBsZXRlIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJGYWlsZWQiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IlVua25vd24iIFZhbHVlPSIzIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5v +TmVnb3RpYXRpb24iIFZhbHVlPSI0IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8 +b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IlRzbkZhaWx1cmVDb2RlIiBMZW5ndGhJbkJpdHM9IjMy +Ij4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb0ZhaWx1cmUiIFZhbHVlPSIwIiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikluc3VmZmljaWVudEJhbmR3aWR0aCIg +VmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW5zdWZmaWNpZW50 +UmVzb3VyY2VzIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJJ +bnN1ZmZpY2llbnRUcmFmZmljQ2xhc3NCYW5kd2lkdGgiIFZhbHVlPSIzIiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9IlN0cmVhbUlkSW5Vc2UiIFZhbHVlPSI0IiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlN0cmVhbURlc3RpbmF0aW9uQWRkcmVzc0luVXNlIiBW +YWx1ZT0iNSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTdHJlYW1QcmVlbXB0 +ZWRCeUhpZ2hlclJhbmsiIFZhbHVlPSI2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IkxhdGVuY3lIYXNDaGFuZ2VkIiBWYWx1ZT0iNyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJFZ3Jlc3NQb3J0Tm90QXZiQ2FwYWJsZSIgVmFsdWU9IjgiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVXNlRGlmZmVyZW50RGVzdGluYXRpb25BZGRyZXNzIiBW +YWx1ZT0iOSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJPdXRPZk1zcnBSZXNv +dXJjZXMiIFZhbHVlPSIxMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJPdXRP +Zk1tcnBSZXNvdXJjZXMiIFZhbHVlPSIxMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJDYW5ub3RTdG9yZURlc3RpbmF0aW9uQWRkcmVzcyIgVmFsdWU9IjEyIiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlByaW9yaXR5SXNOb3RBblNyY0NsYXNzIiBWYWx1ZT0i +MTMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTWF4RnJhbWVTaXplVG9vTGFy +Z2UiIFZhbHVlPSIxNCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNYXhGYW5J +blBvcnRzTGltaXRSZWFjaGVkIiBWYWx1ZT0iMTUiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFs +dWUgTmFtZT0iRmlyc3RWYWx1ZUNoYW5nZWRGb3JTdHJlYW1JZCIgVmFsdWU9IjE2IiAvPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlZsYW5CbG9ja2VkT25FZ3Jlc3MiIFZhbHVlPSIx +NyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJWbGFuVGFnZ2luZ0Rpc2FibGVk +T25FZ3Jlc3MiIFZhbHVlPSIxOCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJT +ckNsYXNzUHJpb3JpdHlNaXNtYXRjaCIgVmFsdWU9IjE5IiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IkZlYXR1cmVOb3RQcm9wYWdhdGVkIiBWYWx1ZT0iMjAiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTWF4TGF0ZW5jeUV4Y2VlZGVkIiBWYWx1ZT0iMjEiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQnJpZGdlRG9lc05vdFByb3ZpZGVOZXR3 +b3JrSWQiIFZhbHVlPSIyMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTdHJl +YW1UcmFuc2Zvcm1Ob3RTdXBwb3J0ZWQiIFZhbHVlPSIyMyIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJTdHJlYW1JZFR5cGVOb3RTdXBwb3J0ZWQiIFZhbHVlPSIyNCIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJGZWF0dXJlTm90U3VwcG9ydGVkIiBWYWx1ZT0i +MjUiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUg +TmFtZT0iVHNuU3RyZWFtU3RhdGUiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IkRpc2FibGVkIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJDb25maWd1cmluZyIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJh +dGVkVmFsdWUgTmFtZT0iUmVhZHkiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9Ik9wZXJhdGlvbmFsIiBWYWx1ZT0iMyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJFcnJvciIgVmFsdWU9IjQiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0K +DQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iVHNuVGFsa2VyU3RhdHVzIiBMZW5ndGhJbkJp +dHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb25lIiBWYWx1ZT0iMCIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJSZWFkeSIgVmFsdWU9IjEiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRmFpbGVkIiBWYWx1ZT0iMiIgLz4NCiAgPC9v +cGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJUc25MaXN0 +ZW5lclN0YXR1cyIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +UmVhZHkiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlBhcnRp +YWxGYWlsZWQiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkZh +aWxlZCIgVmFsdWU9IjMiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iVW5zaWduZWRSYXRpb25hbE51bWJlciIgQmFzZVR5cGU9InVhOkV4 +dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOdW1lcmF0b3IiIFR5cGVOYW1l +PSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVub21pbmF0b3IiIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVu +dW1lcmF0ZWRUeXBlIE5hbWU9IklkVHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iTnVtZXJpYyIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iU3RyaW5nIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJHdWlkIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJPcGFxdWUiIFZhbHVlPSIzIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0K +ICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9Ik5vZGVDbGFzcyIgTGVuZ3RoSW5CaXRzPSIzMiI+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVW5zcGVjaWZpZWQiIFZhbHVlPSIwIiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9iamVjdCIgVmFsdWU9IjEiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVmFyaWFibGUiIFZhbHVlPSIyIiAvPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik1ldGhvZCIgVmFsdWU9IjQiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iT2JqZWN0VHlwZSIgVmFsdWU9IjgiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVmFyaWFibGVUeXBlIiBWYWx1ZT0iMTYiIC8+DQogICAg +PG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUmVmZXJlbmNlVHlwZSIgVmFsdWU9IjMyIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRhdGFUeXBlIiBWYWx1ZT0iNjQiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVmlldyIgVmFsdWU9IjEyOCIgLz4NCiAgPC9v +cGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJQZXJtaXNz +aW9uVHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiIgSXNPcHRpb25TZXQ9InRydWUiPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IkJyb3dzZSIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iUmVhZFJvbGVQZXJtaXNzaW9ucyIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iV3JpdGVBdHRyaWJ1dGUiIFZhbHVlPSI0IiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IldyaXRlUm9sZVBlcm1pc3Npb25zIiBWYWx1ZT0iOCIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJXcml0ZUhpc3Rvcml6aW5nIiBWYWx1 +ZT0iMTYiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUmVhZCIgVmFsdWU9IjMy +IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IldyaXRlIiBWYWx1ZT0iNjQiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUmVhZEhpc3RvcnkiIFZhbHVlPSIxMjgi +IC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW5zZXJ0SGlzdG9yeSIgVmFsdWU9 +IjI1NiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNb2RpZnlIaXN0b3J5IiBW +YWx1ZT0iNTEyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRlbGV0ZUhpc3Rv +cnkiIFZhbHVlPSIxMDI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJlY2Vp +dmVFdmVudHMiIFZhbHVlPSIyMDQ4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IkNhbGwiIFZhbHVlPSI0MDk2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkFk +ZFJlZmVyZW5jZSIgVmFsdWU9IjgxOTIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFt +ZT0iUmVtb3ZlUmVmZXJlbmNlIiBWYWx1ZT0iMTYzODQiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iRGVsZXRlTm9kZSIgVmFsdWU9IjMyNzY4IiAvPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IkFkZE5vZGUiIFZhbHVlPSI2NTUzNiIgLz4NCiAgPC9vcGM6RW51bWVy +YXRlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJBY2Nlc3NMZXZlbFR5cGUi +IExlbmd0aEluQml0cz0iOCIgSXNPcHRpb25TZXQ9InRydWUiPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IkN1cnJlbnRSZWFkIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJDdXJyZW50V3JpdGUiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9Ikhpc3RvcnlSZWFkIiBWYWx1ZT0iNCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJIaXN0b3J5V3JpdGUiIFZhbHVlPSI4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IlNlbWFudGljQ2hhbmdlIiBWYWx1ZT0iMTYiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iU3RhdHVzV3JpdGUiIFZhbHVlPSIzMiIgLz4NCiAgICA8b3BjOkVu +dW1lcmF0ZWRWYWx1ZSBOYW1lPSJUaW1lc3RhbXBXcml0ZSIgVmFsdWU9IjY0IiAvPg0KICA8L29w +YzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkFjY2Vzc0xl +dmVsRXhUeXBlIiBMZW5ndGhJbkJpdHM9IjMyIiBJc09wdGlvblNldD0idHJ1ZSI+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iQ3VycmVudFJlYWQiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51 +bWVyYXRlZFZhbHVlIE5hbWU9IkN1cnJlbnRXcml0ZSIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iSGlzdG9yeVJlYWQiIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikhpc3RvcnlXcml0ZSIgVmFsdWU9IjgiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU2VtYW50aWNDaGFuZ2UiIFZhbHVlPSIxNiIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTdGF0dXNXcml0ZSIgVmFsdWU9IjMyIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlRpbWVzdGFtcFdyaXRlIiBWYWx1ZT0iNjQi +IC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9uYXRvbWljUmVhZCIgVmFsdWU9 +IjI1NiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb25hdG9taWNXcml0ZSIg +VmFsdWU9IjUxMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJXcml0ZUZ1bGxB +cnJheU9ubHkiIFZhbHVlPSIxMDI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +Ik5vU3ViRGF0YVR5cGVzIiBWYWx1ZT0iMjA0OCIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+ +DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJFdmVudE5vdGlmaWVyVHlwZSIgTGVuZ3Ro +SW5CaXRzPSI4IiBJc09wdGlvblNldD0idHJ1ZSI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +U3Vic2NyaWJlVG9FdmVudHMiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9Ikhpc3RvcnlSZWFkIiBWYWx1ZT0iNCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJIaXN0b3J5V3JpdGUiIFZhbHVlPSI4IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlw +ZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkFjY2Vzc1Jlc3RyaWN0aW9uVHlwZSIg +TGVuZ3RoSW5CaXRzPSIxNiIgSXNPcHRpb25TZXQ9InRydWUiPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IlNpZ25pbmdSZXF1aXJlZCIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iRW5jcnlwdGlvblJlcXVpcmVkIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVu +dW1lcmF0ZWRWYWx1ZSBOYW1lPSJTZXNzaW9uUmVxdWlyZWQiIFZhbHVlPSI0IiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkFwcGx5UmVzdHJpY3Rpb25zVG9Ccm93c2UiIFZhbHVl +PSI4IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IlJvbGVQZXJtaXNzaW9uVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSb2xlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJQZXJtaXNzaW9ucyIgVHlwZU5hbWU9InRuczpQZXJtaXNzaW9u +VHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlw +ZSBOYW1lPSJEYXRhVHlwZURlZmluaXRpb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3Qi +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9 +IlN0cnVjdHVyZVR5cGUiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9IlN0cnVjdHVyZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFs +dWUgTmFtZT0iU3RydWN0dXJlV2l0aE9wdGlvbmFsRmllbGRzIiBWYWx1ZT0iMSIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVbmlvbiIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iU3RydWN0dXJlV2l0aFN1YnR5cGVkVmFsdWVzIiBWYWx1ZT0i +MyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVbmlvbldpdGhTdWJ0eXBlZFZh +bHVlcyIgVmFsdWU9IjQiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iU3RydWN0dXJlRmllbGQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmci +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5hbWU9InVhOkxvY2Fs +aXplZFRleHQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhVHlwZSIgVHlwZU5hbWU9InVh +Ok5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlZhbHVlUmFuayIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZBcnJheURpbWVuc2lvbnMiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBcnJheURpbWVuc2lv +bnMiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBMZW5ndGhGaWVsZD0iTm9PZkFycmF5RGltZW5zaW9u +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1heFN0cmluZ0xlbmd0aCIgVHlwZU5hbWU9Im9w +YzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJc09wdGlvbmFsIiBUeXBlTmFtZT0i +b3BjOkJvb2xlYW4iIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iU3RydWN0dXJlRGVmaW5pdGlvbiIgQmFzZVR5cGU9InRuczpEYXRhVHlw +ZURlZmluaXRpb24iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVmYXVsdEVuY29kaW5nSWQiIFR5 +cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCYXNlRGF0YVR5cGUi +IFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdHJ1Y3R1cmVU +eXBlIiBUeXBlTmFtZT0idG5zOlN0cnVjdHVyZVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb09mRmllbGRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iRmllbGRzIiBUeXBlTmFtZT0idG5zOlN0cnVjdHVyZUZpZWxkIiBMZW5ndGhGaWVsZD0iTm9P +ZkZpZWxkcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVk +VHlwZSBOYW1lPSJFbnVtRGVmaW5pdGlvbiIgQmFzZVR5cGU9InRuczpEYXRhVHlwZURlZmluaXRp +b24iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkZpZWxkcyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkZpZWxkcyIgVHlwZU5hbWU9InRuczpFbnVtRmll +bGQiIExlbmd0aEZpZWxkPSJOb09mRmllbGRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik5vZGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9k +ZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUNsYXNzIiBUeXBlTmFtZT0idG5zOk5v +ZGVDbGFzcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJyb3dzZU5hbWUiIFR5cGVOYW1lPSJ1 +YTpRdWFsaWZpZWROYW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxheU5hbWUiIFR5 +cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3Jp +cHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlVzZXJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVy +bWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJOb09mUm9sZVBlcm1pc3Npb25zIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTm9PZlVzZXJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFt +ZT0idG5zOlJvbGVQZXJtaXNzaW9uVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZVc2VyUm9sZVBlcm1p +c3Npb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWNjZXNzUmVzdHJpY3Rpb25zIiBUeXBl +TmFtZT0ib3BjOlVJbnQxNiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZWZlcmVuY2Vz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNl +cyIgVHlwZU5hbWU9InRuczpSZWZlcmVuY2VOb2RlIiBMZW5ndGhGaWVsZD0iTm9PZlJlZmVyZW5j +ZXMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iSW5zdGFuY2VOb2RlIiBCYXNlVHlwZT0idG5zOk5vZGUiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVDbGFzcyIgVHlwZU5hbWU9InRuczpOb2RlQ2xh +c3MiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQnJvd3Nl +TmFtZSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxheU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6 +ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRl +c2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5v +ZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUlu +dDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJX +cml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6 +SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1l +PSJ0bnM6Um9sZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlJvbGVQZXJtaXNzaW9u +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlclJvbGVQZXJtaXNz +aW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJOb09m +VXNlclJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjY2Vzc1Jlc3Ry +aWN0aW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VzIiBUeXBlTmFtZT0idG5zOlJlZmVy +ZW5jZU5vZGUiIExlbmd0aEZpZWxkPSJOb09mUmVmZXJlbmNlcyIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJUeXBlTm9kZSIgQmFzZVR5 +cGU9InRuczpOb2RlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZCIgVHlwZU5hbWU9InVh +Ok5vZGVJZCIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b2RlQ2xhc3MiIFR5cGVOYW1lPSJ0bnM6Tm9kZUNsYXNzIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJyb3dzZU5hbWUiIFR5cGVOYW1lPSJ1YTpRdWFsaWZp +ZWROYW1lIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRp +c3BsYXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5v +ZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5hbWU9InVhOkxv +Y2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGUi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJ +bnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +Um9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQZXJtaXNzaW9uVHlwZSIg +TGVuZ3RoRmllbGQ9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb09mVXNlclJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlVzZXJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJ0bnM6Um9sZVBl +cm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlVzZXJSb2xlUGVybWlzc2lvbnMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJBY2Nlc3NSZXN0cmljdGlvbnMiIFR5cGVOYW1lPSJvcGM6VUlu +dDE2IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZS +ZWZlcmVuY2VzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +UmVmZXJlbmNlcyIgVHlwZU5hbWU9InRuczpSZWZlcmVuY2VOb2RlIiBMZW5ndGhGaWVsZD0iTm9P +ZlJlZmVyZW5jZXMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iT2JqZWN0Tm9kZSIgQmFzZVR5cGU9InRuczpJbnN0YW5jZU5vZGUiPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VU +eXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVDbGFzcyIgVHlwZU5h +bWU9InRuczpOb2RlQ2xhc3MiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQnJvd3NlTmFtZSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIFNvdXJjZVR5 +cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxheU5hbWUiIFR5cGVO +YW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291 +cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlVzZXJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBl +PSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSb2xlUGVybWlzc2lvbnMi +IFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSb2xlUGVybWlz +c2lvbnMiIFR5cGVOYW1lPSJ0bnM6Um9sZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9P +ZlJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZVc2VyUm9sZVBl +cm1pc3Npb25zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VXNlclJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExl +bmd0aEZpZWxkPSJOb09mVXNlclJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkFjY2Vzc1Jlc3RyaWN0aW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIFNvdXJjZVR5cGU9 +InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZXMiIFR5cGVO +YW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VzIiBUeXBl +TmFtZT0idG5zOlJlZmVyZW5jZU5vZGUiIExlbmd0aEZpZWxkPSJOb09mUmVmZXJlbmNlcyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkV2ZW50Tm90aWZpZXIiIFR5cGVOYW1lPSJvcGM6Qnl0ZSIg +Lz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l +PSJPYmplY3RUeXBlTm9kZSIgQmFzZVR5cGU9InRuczpUeXBlTm9kZSI+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOb2RlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIFNvdXJjZVR5cGU9InRuczpOb2Rl +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUNsYXNzIiBUeXBlTmFtZT0idG5zOk5vZGVD +bGFzcyIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCcm93 +c2VOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgU291cmNlVHlwZT0idG5zOk5vZGUi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2Fs +aXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6 +Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpV +SW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNl +cldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5h +bWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJOb09mUm9sZVBlcm1pc3Np +b25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVzZXJSb2xlUGVybWlzc2lvbnMiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyUm9sZVBlcm1p +c3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQZXJtaXNzaW9uVHlwZSIgTGVuZ3RoRmllbGQ9Ik5v +T2ZVc2VyUm9sZVBlcm1pc3Npb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWNjZXNzUmVz +dHJpY3Rpb25zIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVmZXJlbmNlcyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlZmVyZW5jZXMiIFR5cGVOYW1lPSJ0bnM6UmVm +ZXJlbmNlTm9kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWZlcmVuY2VzIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iSXNBYnN0cmFjdCIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICA8L29wYzpT +dHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlZhcmlhYmxlTm9k +ZSIgQmFzZVR5cGU9InRuczpJbnN0YW5jZU5vZGUiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9k +ZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik5vZGVDbGFzcyIgVHlwZU5hbWU9InRuczpOb2RlQ2xhc3MiIFNvdXJj +ZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQnJvd3NlTmFtZSIgVHlw +ZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iRGlzcGxheU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBT +b3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9u +IiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3Vy +Y2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJXcml0ZU1hc2si +IFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJ0bnM6Um9s +ZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlJvbGVQZXJtaXNzaW9ucyIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0ib3Bj +OkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlclJvbGVQZXJtaXNzaW9ucyIgVHlw +ZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJOb09mVXNlclJvbGVQ +ZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjY2Vzc1Jlc3RyaWN0aW9ucyIg +VHlwZU5hbWU9Im9wYzpVSW50MTYiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VzIiBUeXBlTmFtZT0idG5zOlJlZmVyZW5jZU5vZGUi +IExlbmd0aEZpZWxkPSJOb09mUmVmZXJlbmNlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlZh +bHVlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFU +eXBlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFsdWVS +YW5rIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkFy +cmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkFycmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJO +b09mQXJyYXlEaW1lbnNpb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWNjZXNzTGV2ZWwi +IFR5cGVOYW1lPSJvcGM6Qnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJBY2Nlc3NM +ZXZlbCIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTWluaW11 +bVNhbXBsaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iSGlzdG9yaXppbmciIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkFjY2Vzc0xldmVsRXgiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8 +L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlZhcmlh +YmxlVHlwZU5vZGUiIEJhc2VUeXBlPSJ0bnM6VHlwZU5vZGUiPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVDbGFzcyIgVHlwZU5hbWU9InRuczpOb2RlQ2xhc3Mi +IFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQnJvd3NlTmFt +ZSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxheU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRU +ZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2Ny +aXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGUi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMy +IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJXcml0 +ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJ0 +bnM6Um9sZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlJvbGVQZXJtaXNzaW9ucyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFt +ZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlclJvbGVQZXJtaXNzaW9u +cyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJOb09mVXNl +clJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFjY2Vzc1Jlc3RyaWN0 +aW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VzIiBUeXBlTmFtZT0idG5zOlJlZmVyZW5j +ZU5vZGUiIExlbmd0aEZpZWxkPSJOb09mUmVmZXJlbmNlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlZhbHVlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRhdGFUeXBlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VmFsdWVSYW5rIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +Tm9PZkFycmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkFycmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZp +ZWxkPSJOb09mQXJyYXlEaW1lbnNpb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNBYnN0 +cmFjdCIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlZmVyZW5jZVR5cGVOb2RlIiBCYXNlVHlw +ZT0idG5zOlR5cGVOb2RlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVJZCIgVHlwZU5hbWU9 +InVhOk5vZGVJZCIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb2RlQ2xhc3MiIFR5cGVOYW1lPSJ0bnM6Tm9kZUNsYXNzIiBTb3VyY2VUeXBlPSJ0bnM6Tm9k +ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJyb3dzZU5hbWUiIFR5cGVOYW1lPSJ1YTpRdWFs +aWZpZWROYW1lIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRpc3BsYXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5z +Ok5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5hbWU9InVh +OkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5v +ZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3Bj +OlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQZXJtaXNzaW9uVHlw +ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSb2xlUGVybWlzc2lvbnMiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mVXNlclJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJ0bnM6Um9s +ZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlVzZXJSb2xlUGVybWlzc2lvbnMiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBY2Nlc3NSZXN0cmljdGlvbnMiIFR5cGVOYW1lPSJvcGM6 +VUludDE2IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v +T2ZSZWZlcmVuY2VzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iUmVmZXJlbmNlcyIgVHlwZU5hbWU9InRuczpSZWZlcmVuY2VOb2RlIiBMZW5ndGhGaWVsZD0i +Tm9PZlJlZmVyZW5jZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJc0Fic3RyYWN0IiBUeXBl +TmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTeW1tZXRyaWMiIFR5 +cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkludmVyc2VOYW1l +IiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+ +DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNZXRob2ROb2RlIiBCYXNlVHlwZT0idG5z +Okluc3RhbmNlTm9kZSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWQiIFR5cGVOYW1lPSJ1 +YTpOb2RlSWQiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +Tm9kZUNsYXNzIiBUeXBlTmFtZT0idG5zOk5vZGVDbGFzcyIgU291cmNlVHlwZT0idG5zOk5vZGUi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCcm93c2VOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlm +aWVkTmFtZSIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJE +aXNwbGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpO +b2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpM +b2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2Rl +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpV +SW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUi +IExlbmd0aEZpZWxkPSJOb09mUm9sZVBlcm1pc3Npb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTm9PZlVzZXJSb2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQ +ZXJtaXNzaW9uVHlwZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZVc2VyUm9sZVBlcm1pc3Npb25zIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iQWNjZXNzUmVzdHJpY3Rpb25zIiBUeXBlTmFtZT0ib3BjOlVJ +bnQxNiIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +UmVmZXJlbmNlcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlZmVyZW5jZXMiIFR5cGVOYW1lPSJ0bnM6UmVmZXJlbmNlTm9kZSIgTGVuZ3RoRmllbGQ9Ik5v +T2ZSZWZlcmVuY2VzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXhlY3V0YWJsZSIgVHlwZU5h +bWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlckV4ZWN1dGFibGUi +IFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJWaWV3Tm9kZSIgQmFzZVR5cGU9InRuczpJbnN0YW5j +ZU5vZGUiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlk +IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVDbGFz +cyIgVHlwZU5hbWU9InRuczpOb2RlQ2xhc3MiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQnJvd3NlTmFtZSIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUi +IFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxheU5h +bWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVk +VGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0 +ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBT +b3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSb2xlUGVy +bWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJS +b2xlUGVybWlzc2lvbnMiIFR5cGVOYW1lPSJ0bnM6Um9sZVBlcm1pc3Npb25UeXBlIiBMZW5ndGhG +aWVsZD0iTm9PZlJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZV +c2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iVXNlclJvbGVQZXJtaXNzaW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lv +blR5cGUiIExlbmd0aEZpZWxkPSJOb09mVXNlclJvbGVQZXJtaXNzaW9ucyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkFjY2Vzc1Jlc3RyaWN0aW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MTYiIFNv +dXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5j +ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVu +Y2VzIiBUeXBlTmFtZT0idG5zOlJlZmVyZW5jZU5vZGUiIExlbmd0aEZpZWxkPSJOb09mUmVmZXJl +bmNlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbnRhaW5zTm9Mb29wcyIgVHlwZU5hbWU9 +Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXZlbnROb3RpZmllciIgVHlw +ZU5hbWU9Im9wYzpCeXRlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0 +cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFUeXBlTm9kZSIgQmFzZVR5cGU9InRuczpUeXBlTm9kZSI+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIFNvdXJj +ZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUNsYXNzIiBUeXBl +TmFtZT0idG5zOk5vZGVDbGFzcyIgU291cmNlVHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJCcm93c2VOYW1lIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgU291cmNl +VHlwZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlw +ZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBT +b3VyY2VUeXBlPSJ0bnM6Tm9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IldyaXRlTWFzayIg +VHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5 +cGU9InRuczpOb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJvbGVQZXJtaXNzaW9u +cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJvbGVQZXJt +aXNzaW9ucyIgVHlwZU5hbWU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIExlbmd0aEZpZWxkPSJO +b09mUm9sZVBlcm1pc3Npb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlVzZXJSb2xl +UGVybWlzc2lvbnMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJVc2VyUm9sZVBlcm1pc3Npb25zIiBUeXBlTmFtZT0idG5zOlJvbGVQZXJtaXNzaW9uVHlwZSIg +TGVuZ3RoRmllbGQ9Ik5vT2ZVc2VyUm9sZVBlcm1pc3Npb25zIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iQWNjZXNzUmVzdHJpY3Rpb25zIiBUeXBlTmFtZT0ib3BjOlVJbnQxNiIgU291cmNlVHlw +ZT0idG5zOk5vZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVmZXJlbmNlcyIgVHlw +ZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlZmVyZW5jZXMiIFR5 +cGVOYW1lPSJ0bnM6UmVmZXJlbmNlTm9kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWZlcmVuY2VzIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNBYnN0cmFjdCIgVHlwZU5hbWU9Im9wYzpCb29sZWFu +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGVEZWZpbml0aW9uIiBUeXBlTmFtZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlZmVyZW5jZU5vZGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlVHlwZUlkIiBUeXBlTmFt +ZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNJbnZlcnNlIiBUeXBlTmFt +ZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUYXJnZXRJZCIgVHlwZU5h +bWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkFyZ3VtZW50IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGUiIFR5cGVOYW1lPSJ1YTpOb2RlSWQi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZVJhbmsiIFR5cGVOYW1lPSJvcGM6SW50MzIi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mQXJyYXlEaW1lbnNpb25zIiBUeXBlTmFtZT0i +b3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXJyYXlEaW1lbnNpb25zIiBUeXBl +TmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5vT2ZBcnJheURpbWVuc2lvbnMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRl +eHQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iRW51bVZhbHVlVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQ2NCIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRpc3BsYXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVk +VGV4dCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlw +ZSBOYW1lPSJFbnVtRmllbGQiIEJhc2VUeXBlPSJ0bnM6RW51bVZhbHVlVHlwZSI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlwZU5hbWU9Im9wYzpJbnQ2NCIgU291cmNlVHlwZT0idG5z +OkVudW1WYWx1ZVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlw +ZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpFbnVtVmFsdWVUeXBlIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6 +ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6RW51bVZhbHVlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik9wdGlvblNldCIgQmFzZVR5cGU9 +InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlwZU5h +bWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFsaWRCaXRzIiBU +eXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQog +IDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJOb3JtYWxpemVkU3RyaW5nIj4NCiAgPC9vcGM6T3BhcXVl +VHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iRGVjaW1hbFN0cmluZyI+DQogIDwvb3Bj +Ok9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IkR1cmF0aW9uU3RyaW5nIj4N +CiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iVGltZVN0cmlu +ZyI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IkRhdGVT +dHJpbmciPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1lPSJE +dXJhdGlvbiI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9 +IlV0Y1RpbWUiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1l +PSJUaW1lIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0i +RGF0ZSI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9Ikxv +Y2FsZUlkIj4NCiAgPC9vcGM6T3BhcXVlVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5h +bWU9IlRpbWVab25lRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iT2Zmc2V0IiBUeXBlTmFtZT0ib3BjOkludDE2IiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iRGF5bGlnaHRTYXZpbmdJbk9mZnNldCIgVHlwZU5hbWU9Im9wYzpCb29s +ZWFuIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFt +ZT0iSW5kZXgiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6T3BhcXVlVHlwZSBOYW1l +PSJJbnRlZ2VySWQiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5 +cGUgTmFtZT0iQXBwbGljYXRpb25UeXBlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVu +dW1lcmF0ZWRWYWx1ZSBOYW1lPSJTZXJ2ZXIiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IkNsaWVudCIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iQ2xpZW50QW5kU2VydmVyIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1l +cmF0ZWRWYWx1ZSBOYW1lPSJEaXNjb3ZlcnlTZXJ2ZXIiIFZhbHVlPSIzIiAvPg0KICA8L29wYzpF +bnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkFwcGxpY2F0aW9u +RGVzY3JpcHRpb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQXBwbGljYXRpb25VcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUHJvZHVjdFVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJBcHBsaWNhdGlvbk5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRU +ZXh0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXBwbGljYXRpb25UeXBlIiBUeXBlTmFtZT0i +dG5zOkFwcGxpY2F0aW9uVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkdhdGV3YXlTZXJ2 +ZXJVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlz +Y292ZXJ5UHJvZmlsZVVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOb09mRGlzY292ZXJ5VXJscyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IkRpc2NvdmVyeVVybHMiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5n +dGhGaWVsZD0iTm9PZkRpc2NvdmVyeVVybHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUmVxdWVzdEhlYWRlciIgQmFzZVR5cGU9InVh +OkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBdXRoZW50aWNhdGlvblRv +a2VuIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVGltZXN0 +YW1wIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVx +dWVzdEhhbmRsZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJSZXR1cm5EaWFnbm9zdGljcyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJBdWRpdEVudHJ5SWQiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iVGltZW91dEhpbnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQWRkaXRpb25hbEhlYWRlciIgVHlwZU5hbWU9InVhOkV4dGVuc2lv +bk9iamVjdCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVk +VHlwZSBOYW1lPSJSZXNwb25zZUhlYWRlciIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUaW1lc3RhbXAiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGFuZGxlIiBUeXBlTmFtZT0ib3BjOlVJ +bnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZpY2VSZXN1bHQiIFR5cGVOYW1lPSJ1 +YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmljZURpYWdub3N0aWNz +IiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mU3RyaW5nVGFibGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJTdHJpbmdUYWJsZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIExlbmd0aEZpZWxkPSJOb09m +U3RyaW5nVGFibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBZGRpdGlvbmFsSGVhZGVyIiBU +eXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iVmVyc2lvblRpbWUiPg0KICA8L29wYzpPcGFxdWVU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU2VydmljZUZhdWx0IiBCYXNlVHlw +ZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVh +ZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlNlc3Npb25sZXNzSW52b2tlUmVx +dWVzdFR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iVXJpc1ZlcnNpb24iIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZk5hbWVzcGFjZVVyaXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOYW1lc3BhY2VVcmlzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVu +Z3RoRmllbGQ9Ik5vT2ZOYW1lc3BhY2VVcmlzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZlNlcnZlclVyaXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJTZXJ2ZXJVcmlzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZXJ2 +ZXJVcmlzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkxvY2FsZUlkcyIgVHlwZU5hbWU9 +Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkxvY2FsZUlkcyIgVHlwZU5hbWU9 +Im9wYzpTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mTG9jYWxlSWRzIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iU2VydmljZUlkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTZXNzaW9ubGVzc0lu +dm9rZVJlc3BvbnNlVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mTmFtZXNwYWNlVXJpcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5hbWVzcGFjZVVyaXMiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiBMZW5ndGhGaWVsZD0iTm9PZk5hbWVzcGFjZVVyaXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb09mU2VydmVyVXJpcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlNlcnZlclVyaXMiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0iTm9P +ZlNlcnZlclVyaXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2aWNlSWQiIFR5cGVOYW1l +PSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj +dHVyZWRUeXBlIE5hbWU9IkZpbmRTZXJ2ZXJzUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0i +dG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRwb2ludFVybCIg +VHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTG9jYWxl +SWRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTG9jYWxl +SWRzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZMb2NhbGVJZHMiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU2VydmVyVXJpcyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlclVyaXMiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiBMZW5ndGhGaWVsZD0iTm9PZlNlcnZlclVyaXMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRmluZFNlcnZlcnNSZXNwb25zZSIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNw +b25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vT2ZTZXJ2ZXJzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iU2VydmVycyIgVHlwZU5hbWU9InRuczpBcHBsaWNhdGlvbkRlc2NyaXB0aW9u +IiBMZW5ndGhGaWVsZD0iTm9PZlNlcnZlcnMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU2VydmVyT25OZXR3b3JrIiBCYXNlVHlwZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlY29yZElkIiBUeXBl +TmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlck5hbWUiIFR5 +cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzY292ZXJ5VXJs +IiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTZXJ2 +ZXJDYXBhYmlsaXRpZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJTZXJ2ZXJDYXBhYmlsaXRpZXMiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVs +ZD0iTm9PZlNlcnZlckNhcGFiaWxpdGllcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJGaW5kU2VydmVyc09uTmV0d29ya1JlcXVlc3Qi +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVx +dWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iU3RhcnRpbmdSZWNvcmRJZCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJNYXhSZWNvcmRzVG9SZXR1cm4iIFR5cGVOYW1lPSJvcGM6VUludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlNlcnZlckNhcGFiaWxpdHlGaWx0ZXIiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJDYXBhYmls +aXR5RmlsdGVyIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZXJ2ZXJD +YXBhYmlsaXR5RmlsdGVyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0 +cnVjdHVyZWRUeXBlIE5hbWU9IkZpbmRTZXJ2ZXJzT25OZXR3b3JrUmVzcG9uc2UiIEJhc2VUeXBl +PSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VIZWFk +ZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJMYXN0Q291bnRlclJlc2V0VGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik5vT2ZTZXJ2ZXJzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iU2VydmVycyIgVHlwZU5hbWU9InRuczpTZXJ2ZXJPbk5ldHdvcmsi +IExlbmd0aEZpZWxkPSJOb09mU2VydmVycyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IkFwcGxpY2F0aW9uSW5zdGFuY2VDZXJ0aWZpY2F0ZSI+ +DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJNZXNz +YWdlU2VjdXJpdHlNb2RlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJJbnZhbGlkIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJOb25lIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l +PSJTaWduIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTaWdu +QW5kRW5jcnlwdCIgVmFsdWU9IjMiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxv +cGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iVXNlclRva2VuVHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQW5vbnltb3VzIiBWYWx1ZT0iMCIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVc2VyTmFtZSIgVmFsdWU9IjEiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQ2VydGlmaWNhdGUiIFZhbHVlPSIyIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Iklzc3VlZFRva2VuIiBWYWx1ZT0iMyIgLz4N +CiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJV +c2VyVG9rZW5Qb2xpY3kiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iUG9saWN5SWQiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iVG9rZW5UeXBlIiBUeXBlTmFtZT0idG5zOlVzZXJUb2tlblR5cGUiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJJc3N1ZWRUb2tlblR5cGUiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNzdWVyRW5kcG9pbnRVcmwiIFR5cGVOYW1lPSJv +cGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlQb2xpY3lVcmkiIFR5 +cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IkVuZHBvaW50RGVzY3JpcHRpb24iIEJhc2VUeXBlPSJ1YTpF +eHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRW5kcG9pbnRVcmwiIFR5cGVO +YW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVyIiBUeXBlTmFt +ZT0idG5zOkFwcGxpY2F0aW9uRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJT +ZXJ2ZXJDZXJ0aWZpY2F0ZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iU2VjdXJpdHlNb2RlIiBUeXBlTmFtZT0idG5zOk1lc3NhZ2VTZWN1cml0eU1v +ZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZWN1cml0eVBvbGljeVVyaSIgVHlwZU5hbWU9 +Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVXNlcklkZW50aXR5VG9r +ZW5zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcklk +ZW50aXR5VG9rZW5zIiBUeXBlTmFtZT0idG5zOlVzZXJUb2tlblBvbGljeSIgTGVuZ3RoRmllbGQ9 +Ik5vT2ZVc2VySWRlbnRpdHlUb2tlbnMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUcmFuc3Bv +cnRQcm9maWxlVXJpIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlNlY3VyaXR5TGV2ZWwiIFR5cGVOYW1lPSJvcGM6Qnl0ZSIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJHZXRFbmRwb2ludHNSZXF1 +ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkVuZHBvaW50VXJsIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik5vT2ZMb2NhbGVJZHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGVJZHMiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5n +dGhGaWVsZD0iTm9PZkxvY2FsZUlkcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZQcm9m +aWxlVXJpcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlBy +b2ZpbGVVcmlzIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZQcm9maWxl +VXJpcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlw +ZSBOYW1lPSJHZXRFbmRwb2ludHNSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpS +ZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZFbmRwb2ludHMiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRwb2ludHMiIFR5 +cGVOYW1lPSJ0bnM6RW5kcG9pbnREZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZFbmRwb2lu +dHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iUmVnaXN0ZXJlZFNlcnZlciIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUHJvZHVjdFVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU2VydmVyTmFtZXMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJOYW1lcyIgVHlwZU5hbWU9InVhOkxv +Y2FsaXplZFRleHQiIExlbmd0aEZpZWxkPSJOb09mU2VydmVyTmFtZXMiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJTZXJ2ZXJUeXBlIiBUeXBlTmFtZT0idG5zOkFwcGxpY2F0aW9uVHlwZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkdhdGV3YXlTZXJ2ZXJVcmkiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpc2NvdmVyeVVybHMiIFR5cGVOYW1l +PSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNjb3ZlcnlVcmxzIiBUeXBl +TmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaXNjb3ZlcnlVcmxzIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iU2VtYXBob3JlRmlsZVBhdGgiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNPbmxpbmUiIFR5cGVOYW1lPSJvcGM6Qm9vbGVh +biIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBO +YW1lPSJSZWdpc3RlclNlcnZlclJlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3Qi +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1 +ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVyIiBUeXBlTmFtZT0idG5z +OlJlZ2lzdGVyZWRTZXJ2ZXIiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6 +U3RydWN0dXJlZFR5cGUgTmFtZT0iUmVnaXN0ZXJTZXJ2ZXJSZXNwb25zZSIgQmFzZVR5cGU9InVh +OkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIg +VHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+ +DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEaXNjb3ZlcnlDb25maWd1cmF0aW9uIiBC +YXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNZG5zRGlzY292ZXJ5Q29uZmlndXJhdGlvbiIg +QmFzZVR5cGU9InRuczpEaXNjb3ZlcnlDb25maWd1cmF0aW9uIj4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik1kbnNTZXJ2ZXJOYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vT2ZTZXJ2ZXJDYXBhYmlsaXRpZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJDYXBhYmlsaXRpZXMiIFR5cGVOYW1lPSJvcGM6 +U3RyaW5nIiBMZW5ndGhGaWVsZD0iTm9PZlNlcnZlckNhcGFiaWxpdGllcyIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJSZWdpc3RlclNl +cnZlcjJSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlciIgVHlwZU5hbWU9InRuczpSZWdpc3RlcmVkU2Vy +dmVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpc2NvdmVyeUNvbmZpZ3VyYXRpb24i +IFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNjb3ZlcnlD +b25maWd1cmF0aW9uIiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBMZW5ndGhGaWVsZD0i +Tm9PZkRpc2NvdmVyeUNvbmZpZ3VyYXRpb24iIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUmVnaXN0ZXJTZXJ2ZXIyUmVzcG9uc2UiIEJh +c2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9u +c2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOb09mQ29uZmlndXJhdGlvblJlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDb25maWd1cmF0aW9uUmVzdWx0cyIgVHlwZU5hbWU9InVh +OlN0YXR1c0NvZGUiIExlbmd0aEZpZWxkPSJOb09mQ29uZmlndXJhdGlvblJlc3VsdHMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0ib3BjOklu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0i +dWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxkPSJOb09mRGlhZ25vc3RpY0luZm9zIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IlNl +Y3VyaXR5VG9rZW5SZXF1ZXN0VHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iSXNzdWUiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IlJlbmV3IiBWYWx1ZT0iMSIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+ +DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDaGFubmVsU2VjdXJpdHlUb2tlbiIgQmFz +ZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDaGFubmVs +SWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVG9rZW5J +ZCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDcmVhdGVk +QXQiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXZp +c2VkTGlmZXRpbWUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik9wZW5TZWN1cmVDaGFubmVsUmVx +dWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJDbGllbnRQcm90b2NvbFZlcnNpb24iIFR5cGVOYW1lPSJvcGM6VUludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdFR5cGUiIFR5cGVOYW1lPSJ0bnM6U2Vj +dXJpdHlUb2tlblJlcXVlc3RUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJpdHlN +b2RlIiBUeXBlTmFtZT0idG5zOk1lc3NhZ2VTZWN1cml0eU1vZGUiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJDbGllbnROb25jZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUmVxdWVzdGVkTGlmZXRpbWUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +Ik9wZW5TZWN1cmVDaGFubmVsUmVzcG9uc2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3Qi +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVz +cG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJQcm90b2NvbFZlcnNp +b24iIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VjdXJp +dHlUb2tlbiIgVHlwZU5hbWU9InRuczpDaGFubmVsU2VjdXJpdHlUb2tlbiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlNlcnZlck5vbmNlIiBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ2xv +c2VTZWN1cmVDaGFubmVsUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RI +ZWFkZXIiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iQ2xvc2VTZWN1cmVDaGFubmVsUmVzcG9uc2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1l +PSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxv +cGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU2lnbmVkU29mdHdhcmVDZXJ0aWZpY2F0ZSIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDZXJ0aWZpY2F0 +ZURhdGEiIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlNpZ25hdHVyZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iU2Vzc2lvbkF1dGhlbnRpY2F0aW9u +VG9rZW4iPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iU2lnbmF0dXJlRGF0YSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJBbGdvcml0aG0iIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iU2lnbmF0dXJlIiBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ3Jl +YXRlU2Vzc2lvblJlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVhZGVy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ2xpZW50RGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ0 +bnM6QXBwbGljYXRpb25EZXNjcmlwdGlvbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZl +clVyaSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRw +b2ludFVybCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJT +ZXNzaW9uTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJDbGllbnROb25jZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQ2xpZW50Q2VydGlmaWNhdGUiIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RlZFNlc3Npb25UaW1lb3V0IiBUeXBlTmFtZT0i +b3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1heFJlc3BvbnNlTWVzc2FnZVNp +emUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0K +ICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkNyZWF0ZVNlc3Npb25SZXNwb25zZSIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhl +YWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlNlc3Npb25JZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkF1dGhlbnRpY2F0aW9uVG9rZW4iIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJSZXZpc2VkU2Vzc2lvblRpbWVvdXQiIFR5cGVOYW1lPSJvcGM6RG91Ymxl +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVyTm9uY2UiIFR5cGVOYW1lPSJvcGM6Qnl0 +ZVN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlckNlcnRpZmljYXRlIiBUeXBl +TmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU2VydmVy +RW5kcG9pbnRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +U2VydmVyRW5kcG9pbnRzIiBUeXBlTmFtZT0idG5zOkVuZHBvaW50RGVzY3JpcHRpb24iIExlbmd0 +aEZpZWxkPSJOb09mU2VydmVyRW5kcG9pbnRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZlNlcnZlclNvZnR3YXJlQ2VydGlmaWNhdGVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iU2VydmVyU29mdHdhcmVDZXJ0aWZpY2F0ZXMiIFR5cGVOYW1lPSJ0 +bnM6U2lnbmVkU29mdHdhcmVDZXJ0aWZpY2F0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZTZXJ2ZXJTb2Z0 +d2FyZUNlcnRpZmljYXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcnZlclNpZ25hdHVy +ZSIgVHlwZU5hbWU9InRuczpTaWduYXR1cmVEYXRhIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +TWF4UmVxdWVzdE1lc3NhZ2VTaXplIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVc2VySWRlbnRp +dHlUb2tlbiIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJQb2xpY3lJZCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQW5vbnltb3VzSWRlbnRpdHlU +b2tlbiIgQmFzZVR5cGU9InRuczpVc2VySWRlbnRpdHlUb2tlbiI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJQb2xpY3lJZCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIFNvdXJjZVR5cGU9InRuczpVc2Vy +SWRlbnRpdHlUb2tlbiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1 +Y3R1cmVkVHlwZSBOYW1lPSJVc2VyTmFtZUlkZW50aXR5VG9rZW4iIEJhc2VUeXBlPSJ0bnM6VXNl +cklkZW50aXR5VG9rZW4iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUG9saWN5SWQiIFR5cGVOYW1l +PSJvcGM6U3RyaW5nIiBTb3VyY2VUeXBlPSJ0bnM6VXNlcklkZW50aXR5VG9rZW4iIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJVc2VyTmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJQYXNzd29yZCIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iRW5jcnlwdGlvbkFsZ29yaXRobSIgVHlwZU5hbWU9Im9wYzpT +dHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iWDUwOUlkZW50aXR5VG9rZW4iIEJhc2VUeXBlPSJ0bnM6VXNlcklkZW50aXR5VG9r +ZW4iPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUG9saWN5SWQiIFR5cGVOYW1lPSJvcGM6U3RyaW5n +IiBTb3VyY2VUeXBlPSJ0bnM6VXNlcklkZW50aXR5VG9rZW4iIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJDZXJ0aWZpY2F0ZURhdGEiIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgLz4NCiAgPC9v +cGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJJc3N1ZWRJ +ZGVudGl0eVRva2VuIiBCYXNlVHlwZT0idG5zOlVzZXJJZGVudGl0eVRva2VuIj4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlBvbGljeUlkIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgU291cmNlVHlwZT0i +dG5zOlVzZXJJZGVudGl0eVRva2VuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVG9rZW5EYXRh +IiBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmNy +eXB0aW9uQWxnb3JpdGhtIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IlJzYUVuY3J5cHRlZFNlY3JldCI+ +DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9IkVjY0VuY3J5 +cHRlZFNlY3JldCI+DQogIDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlw +ZSBOYW1lPSJBY3RpdmF0ZVNlc3Npb25SZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6 +UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNsaWVudFNpZ25hdHVyZSIg +VHlwZU5hbWU9InRuczpTaWduYXR1cmVEYXRhIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZkNsaWVudFNvZnR3YXJlQ2VydGlmaWNhdGVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQ2xpZW50U29mdHdhcmVDZXJ0aWZpY2F0ZXMiIFR5cGVOYW1lPSJ0 +bnM6U2lnbmVkU29mdHdhcmVDZXJ0aWZpY2F0ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZDbGllbnRTb2Z0 +d2FyZUNlcnRpZmljYXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZMb2NhbGVJZHMi +IFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMb2NhbGVJZHMi +IFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0iTm9PZkxvY2FsZUlkcyIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJJZGVudGl0eVRva2VuIiBUeXBlTmFtZT0idWE6RXh0ZW5z +aW9uT2JqZWN0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlclRva2VuU2lnbmF0dXJlIiBU +eXBlTmFtZT0idG5zOlNpZ25hdHVyZURhdGEiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWN0aXZhdGVTZXNzaW9uUmVzcG9uc2UiIEJh +c2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9u +c2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTZXJ2ZXJOb25jZSIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3Ro +RmllbGQ9Ik5vT2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0 +aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRp +YWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0i +Tm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDbG9zZVNlc3Npb25SZXF1ZXN0IiBCYXNlVHlwZT0idWE6 +RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5 +cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlbGV0 +ZVN1YnNjcmlwdGlvbnMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDbG9zZVNlc3Npb25SZXNw +b25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgPC9v +cGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDYW5jZWxS +ZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIYW5kbGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkNh +bmNlbFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ2FuY2VsQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMy +IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5h +bWU9Ik5vZGVBdHRyaWJ1dGVzTWFzayIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iQWNjZXNzTGV2ZWwiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IkFycmF5RGltZW5zaW9ucyIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iQnJvd3NlTmFtZSIgVmFsdWU9IjQiIC8+DQogICAgPG9wYzpFbnVt +ZXJhdGVkVmFsdWUgTmFtZT0iQ29udGFpbnNOb0xvb3BzIiBWYWx1ZT0iOCIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEYXRhVHlwZSIgVmFsdWU9IjE2IiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRlc2NyaXB0aW9uIiBWYWx1ZT0iMzIiIC8+DQogICAgPG9w +YzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRGlzcGxheU5hbWUiIFZhbHVlPSI2NCIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJFdmVudE5vdGlmaWVyIiBWYWx1ZT0iMTI4IiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkV4ZWN1dGFibGUiIFZhbHVlPSIyNTYiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSGlzdG9yaXppbmciIFZhbHVlPSI1MTIi +IC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW52ZXJzZU5hbWUiIFZhbHVlPSIx +MDI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IklzQWJzdHJhY3QiIFZhbHVl +PSIyMDQ4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik1pbmltdW1TYW1wbGlu +Z0ludGVydmFsIiBWYWx1ZT0iNDA5NiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l +PSJOb2RlQ2xhc3MiIFZhbHVlPSI4MTkyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9Ik5vZGVJZCIgVmFsdWU9IjE2Mzg0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IlN5bW1ldHJpYyIgVmFsdWU9IjMyNzY4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IlVzZXJBY2Nlc3NMZXZlbCIgVmFsdWU9IjY1NTM2IiAvPg0KICAgIDxvcGM6RW51bWVy +YXRlZFZhbHVlIE5hbWU9IlVzZXJFeGVjdXRhYmxlIiBWYWx1ZT0iMTMxMDcyIiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlVzZXJXcml0ZU1hc2siIFZhbHVlPSIyNjIxNDQiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVmFsdWVSYW5rIiBWYWx1ZT0iNTI0Mjg4 +IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IldyaXRlTWFzayIgVmFsdWU9IjEw +NDg1NzYiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVmFsdWUiIFZhbHVlPSIy +MDk3MTUyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRhdGFUeXBlRGVmaW5p +dGlvbiIgVmFsdWU9IjQxOTQzMDQiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +Um9sZVBlcm1pc3Npb25zIiBWYWx1ZT0iODM4ODYwOCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJBY2Nlc3NSZXN0cmljdGlvbnMiIFZhbHVlPSIxNjc3NzIxNiIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBbGwiIFZhbHVlPSIzMzU1NDQzMSIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJCYXNlTm9kZSIgVmFsdWU9IjI2NTAxMjIwIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9iamVjdCIgVmFsdWU9IjI2NTAxMzQ4IiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9iamVjdFR5cGUiIFZhbHVlPSIyNjUw +MzI2OCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJWYXJpYWJsZSIgVmFsdWU9 +IjI2NTcxMzgzIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlZhcmlhYmxlVHlw +ZSIgVmFsdWU9IjI4NjAwNDM4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik1l +dGhvZCIgVmFsdWU9IjI2NjMyNTQ4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IlJlZmVyZW5jZVR5cGUiIFZhbHVlPSIyNjUzNzA2MCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJWaWV3IiBWYWx1ZT0iMjY1MDEzNTYiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iTm9kZUF0dHJpYnV0ZXMiIEJhc2VU +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3BlY2lmaWVk +QXR0cmlidXRlcyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJEaXNwbGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iT2JqZWN0QXR0cmlidXRlcyIgQmFzZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyI+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJTcGVjaWZpZWRBdHRyaWJ1dGVzIiBUeXBlTmFtZT0ib3BjOlVJbnQz +MiIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iRGlzcGxheU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0 +bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIg +VHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRl +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50 +MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlVzZXJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6 +Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFdmVudE5vdGlmaWVyIiBU +eXBlTmFtZT0ib3BjOkJ5dGUiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6 +U3RydWN0dXJlZFR5cGUgTmFtZT0iVmFyaWFibGVBdHRyaWJ1dGVzIiBCYXNlVHlwZT0idG5zOk5v +ZGVBdHRyaWJ1dGVzIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNwZWNpZmllZEF0dHJpYnV0ZXMi +IFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXpl +ZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlw +ZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iV3JpdGVNYXNr +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50 +MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlZhbHVlIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRhdGFUeXBlIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VmFsdWVSYW5rIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +Tm9PZkFycmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkFycmF5RGltZW5zaW9ucyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZp +ZWxkPSJOb09mQXJyYXlEaW1lbnNpb25zIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWNjZXNz +TGV2ZWwiIFR5cGVOYW1lPSJvcGM6Qnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJB +Y2Nlc3NMZXZlbCIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +TWluaW11bVNhbXBsaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iSGlzdG9yaXppbmciIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAg +PC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNZXRo +b2RBdHRyaWJ1dGVzIiBCYXNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIj4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlNwZWNpZmllZEF0dHJpYnV0ZXMiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3Vy +Y2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNw +bGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2Rl +QXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFt +ZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291 +cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNl +cldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0 +cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkV4ZWN1dGFibGUiIFR5cGVOYW1lPSJv +cGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVzZXJFeGVjdXRhYmxlIiBUeXBl +TmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6 +U3RydWN0dXJlZFR5cGUgTmFtZT0iT2JqZWN0VHlwZUF0dHJpYnV0ZXMiIEJhc2VUeXBlPSJ0bnM6 +Tm9kZUF0dHJpYnV0ZXMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3BlY2lmaWVkQXR0cmlidXRl +cyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpc3BsYXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxp +emVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VU +eXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1h +c2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJ +bnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iSXNBYnN0cmFjdCIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlZhcmlhYmxlVHlwZUF0 +dHJpYnV0ZXMiIEJhc2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iU3BlY2lmaWVkQXR0cmlidXRlcyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5 +cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpc3BsYXlO +YW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRy +aWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1 +YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VU +eXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJVc2VyV3Jp +dGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1 +dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50 +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGF0YVR5cGUiIFR5cGVOYW1lPSJ1YTpOb2RlSWQi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZVJhbmsiIFR5cGVOYW1lPSJvcGM6SW50MzIi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mQXJyYXlEaW1lbnNpb25zIiBUeXBlTmFtZT0i +b3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXJyYXlEaW1lbnNpb25zIiBUeXBl +TmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5vT2ZBcnJheURpbWVuc2lvbnMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJJc0Fic3RyYWN0IiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIC8+ +DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i +UmVmZXJlbmNlVHlwZUF0dHJpYnV0ZXMiIEJhc2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iU3BlY2lmaWVkQXR0cmlidXRlcyIgVHlwZU5hbWU9Im9wYzpV +SW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IkRpc3BsYXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlw +ZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVzY3JpcHRp +b24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJp +YnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6 +VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJVc2VyV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0i +dG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNBYnN0cmFjdCIg +VHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3ltbWV0cmlj +IiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnZlcnNl +TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRleHQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGF0YVR5cGVBdHRyaWJ1dGVzIiBC +YXNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNwZWNp +ZmllZEF0dHJpYnV0ZXMiIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9k +ZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZU5h +bWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVk +VGV4dCIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iV3JpdGVNYXNrIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5v +ZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlw +ZU5hbWU9Im9wYzpVSW50MzIiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IklzQWJzdHJhY3QiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4N +CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJW +aWV3QXR0cmlidXRlcyIgQmFzZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyI+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJTcGVjaWZpZWRBdHRyaWJ1dGVzIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgU291 +cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlz +cGxheU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBTb3VyY2VUeXBlPSJ0bnM6Tm9k +ZUF0dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZXNjcmlwdGlvbiIgVHlwZU5h +bWU9InVhOkxvY2FsaXplZFRleHQiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIFNv +dXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVz +ZXJXcml0ZU1hc2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0 +dHJpYnV0ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDb250YWluc05vTG9vcHMiIFR5cGVO +YW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkV2ZW50Tm90aWZpZXIi +IFR5cGVOYW1lPSJvcGM6Qnl0ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJHZW5lcmljQXR0cmlidXRlVmFsdWUiIEJhc2VUeXBlPSJ1 +YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXR0cmlidXRlSWQiIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmFsdWUiIFR5cGVO +YW1lPSJ1YTpWYXJpYW50IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0 +cnVjdHVyZWRUeXBlIE5hbWU9IkdlbmVyaWNBdHRyaWJ1dGVzIiBCYXNlVHlwZT0idG5zOk5vZGVB +dHRyaWJ1dGVzIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNwZWNpZmllZEF0dHJpYnV0ZXMiIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiBTb3VyY2VUeXBlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNwbGF5TmFtZSIgVHlwZU5hbWU9InVhOkxvY2FsaXplZFRl +eHQiIFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkRlc2NyaXB0aW9uIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgU291cmNlVHlwZT0i +dG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iV3JpdGVNYXNrIiBU +eXBlTmFtZT0ib3BjOlVJbnQzMiIgU291cmNlVHlwZT0idG5zOk5vZGVBdHRyaWJ1dGVzIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlcldyaXRlTWFzayIgVHlwZU5hbWU9Im9wYzpVSW50MzIi +IFNvdXJjZVR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +Ik5vT2ZBdHRyaWJ1dGVWYWx1ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJBdHRyaWJ1dGVWYWx1ZXMiIFR5cGVOYW1lPSJ0bnM6R2VuZXJpY0F0dHJpYnV0 +ZVZhbHVlIiBMZW5ndGhGaWVsZD0iTm9PZkF0dHJpYnV0ZVZhbHVlcyIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBZGROb2Rlc0l0ZW0i +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUGFy +ZW50Tm9kZUlkIiBUeXBlTmFtZT0idWE6RXhwYW5kZWROb2RlSWQiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJSZWZlcmVuY2VUeXBlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJSZXF1ZXN0ZWROZXdOb2RlSWQiIFR5cGVOYW1lPSJ1YTpFeHBhbmRlZE5v +ZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJyb3dzZU5hbWUiIFR5cGVOYW1lPSJ1YTpR +dWFsaWZpZWROYW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUNsYXNzIiBUeXBlTmFt +ZT0idG5zOk5vZGVDbGFzcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVBdHRyaWJ1dGVz +IiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VHlwZURlZmluaXRpb24iIFR5cGVOYW1lPSJ1YTpFeHBhbmRlZE5vZGVJZCIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBZGROb2Rlc1Jl +c3VsdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJTdGF0dXNDb2RlIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IkFkZGVkTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkFkZE5vZGVzUmVxdWVz +dCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJS +ZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJOb09mTm9kZXNUb0FkZCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik5vZGVzVG9BZGQiIFR5cGVOYW1lPSJ0bnM6QWRkTm9kZXNJdGVtIiBM +ZW5ndGhGaWVsZD0iTm9PZk5vZGVzVG9BZGQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWRkTm9kZXNSZXNwb25zZSIgQmFzZVR5cGU9 +InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRl +ciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iUmVzdWx0cyIgVHlwZU5hbWU9InRuczpBZGROb2Rlc1Jlc3VsdCIgTGVuZ3RoRmllbGQ9Ik5v +T2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIg +VHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJ +bmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdu +b3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1 +cmVkVHlwZSBOYW1lPSJBZGRSZWZlcmVuY2VzSXRlbSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTb3VyY2VOb2RlSWQiIFR5cGVOYW1lPSJ1YTpO +b2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWZlcmVuY2VUeXBlSWQiIFR5cGVOYW1l +PSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJc0ZvcndhcmQiIFR5cGVOYW1l +PSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRhcmdldFNlcnZlclVyaSIg +VHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUYXJnZXROb2Rl +SWQiIFR5cGVOYW1lPSJ1YTpFeHBhbmRlZE5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlRhcmdldE5vZGVDbGFzcyIgVHlwZU5hbWU9InRuczpOb2RlQ2xhc3MiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWRkUmVmZXJlbmNl +c1JlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVhZGVyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZXNUb0FkZCIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlZmVyZW5jZXNUb0FkZCIgVHlwZU5hbWU9InRu +czpBZGRSZWZlcmVuY2VzSXRlbSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWZlcmVuY2VzVG9BZGQiIC8+ +DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i +QWRkUmVmZXJlbmNlc1Jlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNl +SGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBUeXBlTmFtZT0idWE6 +U3RhdHVzQ29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJ +bmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWxldGVOb2Rlc0l0ZW0i +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9k +ZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGVsZXRl +VGFyZ2V0UmVmZXJlbmNlcyIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRlbGV0ZU5vZGVzUmVx +dWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mTm9kZXNUb0RlbGV0ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVzVG9EZWxldGUiIFR5cGVOYW1lPSJ0bnM6RGVsZXRl +Tm9kZXNJdGVtIiBMZW5ndGhGaWVsZD0iTm9PZk5vZGVzVG9EZWxldGUiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGVsZXRlTm9kZXNS +ZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIExl +bmd0aEZpZWxkPSJOb09mUmVzdWx0cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFn +bm9zdGljSW5mb3MiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmll +bGQ9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQog +IDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGVsZXRlUmVmZXJlbmNlc0l0ZW0iIEJhc2VUeXBl +PSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU291cmNlTm9kZUlk +IiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNl +VHlwZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNG +b3J3YXJkIiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJU +YXJnZXROb2RlSWQiIFR5cGVOYW1lPSJ1YTpFeHBhbmRlZE5vZGVJZCIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkRlbGV0ZUJpZGlyZWN0aW9uYWwiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4N +CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJE +ZWxldGVSZWZlcmVuY2VzUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RI +ZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVmZXJlbmNlc1RvRGVsZXRlIiBU +eXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlc1Rv +RGVsZXRlIiBUeXBlTmFtZT0idG5zOkRlbGV0ZVJlZmVyZW5jZXNJdGVtIiBMZW5ndGhGaWVsZD0i +Tm9PZlJlZmVyZW5jZXNUb0RlbGV0ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWxldGVSZWZlcmVuY2VzUmVzcG9uc2UiIEJhc2VU +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VI +ZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlJlc3VsdHMiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiBMZW5ndGhGaWVsZD0iTm9P +ZlJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGlhZ25vc3RpY0luZm9zIiBU +eXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlhZ25vc3RpY0lu +Zm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxkPSJOb09mRGlhZ25v +c3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0 +ZWRUeXBlIE5hbWU9IkF0dHJpYnV0ZVdyaXRlTWFzayIgTGVuZ3RoSW5CaXRzPSIzMiIgSXNPcHRp +b25TZXQ9InRydWUiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVl +PSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkFjY2Vzc0xldmVsIiBWYWx1 +ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBcnJheURpbWVuc2lvbnMi +IFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkJyb3dzZU5hbWUi +IFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkNvbnRhaW5zTm9M +b29wcyIgVmFsdWU9IjgiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRGF0YVR5 +cGUiIFZhbHVlPSIxNiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEZXNjcmlw +dGlvbiIgVmFsdWU9IjMyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRpc3Bs +YXlOYW1lIiBWYWx1ZT0iNjQiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRXZl +bnROb3RpZmllciIgVmFsdWU9IjEyOCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l +PSJFeGVjdXRhYmxlIiBWYWx1ZT0iMjU2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9Ikhpc3Rvcml6aW5nIiBWYWx1ZT0iNTEyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVl +IE5hbWU9IkludmVyc2VOYW1lIiBWYWx1ZT0iMTAyNCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJJc0Fic3RyYWN0IiBWYWx1ZT0iMjA0OCIgLz4NCiAgICA8b3BjOkVudW1lcmF0 +ZWRWYWx1ZSBOYW1lPSJNaW5pbXVtU2FtcGxpbmdJbnRlcnZhbCIgVmFsdWU9IjQwOTYiIC8+DQog +ICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9kZUNsYXNzIiBWYWx1ZT0iODE5MiIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb2RlSWQiIFZhbHVlPSIxNjM4NCIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTeW1tZXRyaWMiIFZhbHVlPSIzMjc2OCIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVc2VyQWNjZXNzTGV2ZWwiIFZhbHVl +PSI2NTUzNiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVc2VyRXhlY3V0YWJs +ZSIgVmFsdWU9IjEzMTA3MiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVc2Vy +V3JpdGVNYXNrIiBWYWx1ZT0iMjYyMTQ0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IlZhbHVlUmFuayIgVmFsdWU9IjUyNDI4OCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1 +ZSBOYW1lPSJXcml0ZU1hc2siIFZhbHVlPSIxMDQ4NTc2IiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IlZhbHVlRm9yVmFyaWFibGVUeXBlIiBWYWx1ZT0iMjA5NzE1MiIgLz4NCiAg +ICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEYXRhVHlwZURlZmluaXRpb24iIFZhbHVlPSI0 +MTk0MzA0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJvbGVQZXJtaXNzaW9u +cyIgVmFsdWU9IjgzODg2MDgiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQWNj +ZXNzUmVzdHJpY3Rpb25zIiBWYWx1ZT0iMTY3NzcyMTYiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVk +VmFsdWUgTmFtZT0iQWNjZXNzTGV2ZWxFeCIgVmFsdWU9IjMzNTU0NDMyIiAvPg0KICA8L29wYzpF +bnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkJyb3dzZURpcmVj +dGlvbiIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +Rm9yd2FyZCIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW52 +ZXJzZSIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQm90aCIg +VmFsdWU9IjIiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW52YWxpZCIgVmFs +dWU9IjMiIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iVmlld0Rlc2NyaXB0aW9uIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlZpZXdJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlRpbWVzdGFtcCIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlZpZXdWZXJzaW9uIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIg +Lz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l +PSJCcm93c2VEZXNjcmlwdGlvbiIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb2RlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJCcm93c2VEaXJlY3Rpb24iIFR5cGVOYW1lPSJ0bnM6QnJvd3NlRGlyZWN0 +aW9uIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlVHlwZUlkIiBUeXBlTmFtZT0i +dWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW5jbHVkZVN1YnR5cGVzIiBUeXBl +TmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlQ2xhc3NNYXNr +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3VsdE1h +c2siIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0K +ICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkJyb3dzZVJlc3VsdE1hc2siIExlbmd0aEluQml0 +cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVlPSIwIiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJlZmVyZW5jZVR5cGVJZCIgVmFsdWU9 +IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSXNGb3J3YXJkIiBWYWx1ZT0i +MiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb2RlQ2xhc3MiIFZhbHVlPSI0 +IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkJyb3dzZU5hbWUiIFZhbHVlPSI4 +IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRpc3BsYXlOYW1lIiBWYWx1ZT0i +MTYiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVHlwZURlZmluaXRpb24iIFZh +bHVlPSIzMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBbGwiIFZhbHVlPSI2 +MyIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJSZWZlcmVuY2VUeXBlSW5mbyIg +VmFsdWU9IjMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVGFyZ2V0SW5mbyIg +VmFsdWU9IjYwIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVy +ZWRUeXBlIE5hbWU9IlJlZmVyZW5jZURlc2NyaXB0aW9uIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlZmVyZW5jZVR5cGVJZCIgVHlwZU5hbWU9 +InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IklzRm9yd2FyZCIgVHlwZU5hbWU9 +Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0i +dWE6RXhwYW5kZWROb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCcm93c2VOYW1lIiBU +eXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpc3Bs +YXlOYW1lIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik5vZGVDbGFzcyIgVHlwZU5hbWU9InRuczpOb2RlQ2xhc3MiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJUeXBlRGVmaW5pdGlvbiIgVHlwZU5hbWU9InVhOkV4cGFuZGVkTm9kZUlkIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iQ29udGlu +dWF0aW9uUG9pbnQiPg0KICA8L29wYzpPcGFxdWVUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5 +cGUgTmFtZT0iQnJvd3NlUmVzdWx0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlN0YXR1c0NvZGUiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ29udGludWF0aW9uUG9pbnQiIFR5cGVOYW1lPSJvcGM6 +Qnl0ZVN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZWZlcmVuY2VzIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlcyIgVHlw +ZU5hbWU9InRuczpSZWZlcmVuY2VEZXNjcmlwdGlvbiIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZWZlcmVu +Y2VzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IkJyb3dzZVJlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVh +ZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVmlldyIgVHlwZU5hbWU9InRuczpWaWV3RGVz +Y3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0ZWRNYXhSZWZlcmVuY2Vz +UGVyTm9kZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mTm9kZXNUb0Jyb3dzZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5vZGVzVG9Ccm93c2UiIFR5cGVOYW1lPSJ0bnM6QnJvd3NlRGVzY3JpcHRpb24iIExl +bmd0aEZpZWxkPSJOb09mTm9kZXNUb0Jyb3dzZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+ +DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJCcm93c2VSZXNwb25zZSIgQmFzZVR5cGU9 +InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRl +ciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iUmVzdWx0cyIgVHlwZU5hbWU9InRuczpCcm93c2VSZXN1bHQiIExlbmd0aEZpZWxkPSJOb09m +UmVzdWx0cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5m +b3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9z +dGljSW5mb3MiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJl +ZFR5cGUgTmFtZT0iQnJvd3NlTmV4dFJlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpS +ZXF1ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVsZWFzZUNvbnRpbnVhdGlv +blBvaW50cyIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +Tm9PZkNvbnRpbnVhdGlvblBvaW50cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkNvbnRpbnVhdGlvblBvaW50cyIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5n +IiBMZW5ndGhGaWVsZD0iTm9PZkNvbnRpbnVhdGlvblBvaW50cyIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJCcm93c2VOZXh0UmVzcG9u +c2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +UmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlJlc3VsdHMiIFR5cGVOYW1lPSJ0bnM6QnJvd3NlUmVzdWx0IiBMZW5n +dGhGaWVsZD0iTm9PZlJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGlhZ25v +c3RpY0luZm9zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxk +PSJOb09mRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlbGF0aXZlUGF0aEVsZW1lbnQiIEJhc2VUeXBlPSJ1 +YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlVHlwZUlk +IiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSXNJbnZlcnNl +IiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbmNsdWRl +U3VidHlwZXMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlRhcmdldE5hbWUiIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlbGF0aXZlUGF0aCIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +RWxlbWVudHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJF +bGVtZW50cyIgVHlwZU5hbWU9InRuczpSZWxhdGl2ZVBhdGhFbGVtZW50IiBMZW5ndGhGaWVsZD0i +Tm9PZkVsZW1lbnRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj +dHVyZWRUeXBlIE5hbWU9IkJyb3dzZVBhdGgiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3Qi +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhcnRpbmdOb2RlIiBUeXBlTmFtZT0idWE6Tm9kZUlk +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVsYXRpdmVQYXRoIiBUeXBlTmFtZT0idG5zOlJl +bGF0aXZlUGF0aCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1 +cmVkVHlwZSBOYW1lPSJCcm93c2VQYXRoVGFyZ2V0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRhcmdldElkIiBUeXBlTmFtZT0idWE6RXhwYW5k +ZWROb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZW1haW5pbmdQYXRoSW5kZXgiIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IkJyb3dzZVBhdGhSZXN1bHQiIEJhc2VUeXBlPSJ1YTpFeHRl +bnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29kZSIgVHlwZU5hbWU9 +InVhOlN0YXR1c0NvZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mVGFyZ2V0cyIgVHlw +ZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRhcmdldHMiIFR5cGVO +YW1lPSJ0bnM6QnJvd3NlUGF0aFRhcmdldCIgTGVuZ3RoRmllbGQ9Ik5vT2ZUYXJnZXRzIiAvPg0K +ICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlRy +YW5zbGF0ZUJyb3dzZVBhdGhzVG9Ob2RlSWRzUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0i +dG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mQnJvd3NlUGF0 +aHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCcm93c2VQ +YXRocyIgVHlwZU5hbWU9InRuczpCcm93c2VQYXRoIiBMZW5ndGhGaWVsZD0iTm9PZkJyb3dzZVBh +dGhzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9IlRyYW5zbGF0ZUJyb3dzZVBhdGhzVG9Ob2RlSWRzUmVzcG9uc2UiIEJhc2VUeXBlPSJ1 +YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIi +IFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlc3VsdHMiIFR5cGVOYW1lPSJ0bnM6QnJvd3NlUGF0aFJlc3VsdCIgTGVuZ3RoRmllbGQ9Ik5v +T2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIg +VHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJ +bmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdu +b3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1 +cmVkVHlwZSBOYW1lPSJSZWdpc3Rlck5vZGVzUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0i +dG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTm9kZXNUb1Jl +Z2lzdGVyIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9k +ZXNUb1JlZ2lzdGVyIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhGaWVsZD0iTm9PZk5vZGVz +VG9SZWdpc3RlciIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1 +cmVkVHlwZSBOYW1lPSJSZWdpc3Rlck5vZGVzUmVzcG9uc2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1l +PSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVnaXN0 +ZXJlZE5vZGVJZHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJSZWdpc3RlcmVkTm9kZUlkcyIgVHlwZU5hbWU9InVhOk5vZGVJZCIgTGVuZ3RoRmllbGQ9Ik5v +T2ZSZWdpc3RlcmVkTm9kZUlkcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVbnJlZ2lzdGVyTm9kZXNSZXF1ZXN0IiBCYXNlVHlwZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIi +IFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v +T2ZOb2Rlc1RvVW5yZWdpc3RlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vZGVzVG9VbnJlZ2lzdGVyIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBMZW5ndGhG +aWVsZD0iTm9PZk5vZGVzVG9VbnJlZ2lzdGVyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVucmVnaXN0ZXJOb2Rlc1Jlc3BvbnNlIiBC +YXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3Bv +bnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOk9wYXF1ZVR5cGUgTmFtZT0iQ291bnRlciI+DQogIDwvb3Bj +Ok9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpPcGFxdWVUeXBlIE5hbWU9Ik51bWVyaWNSYW5nZSI+DQog +IDwvb3BjOk9wYXF1ZVR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJFbmRwb2lu +dENvbmZpZ3VyYXRpb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iT3BlcmF0aW9uVGltZW91dCIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlVzZUJpbmFyeUVuY29kaW5nIiBUeXBlTmFtZT0ib3BjOkJvb2xl +YW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYXhTdHJpbmdMZW5ndGgiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYXhCeXRlU3RyaW5nTGVuZ3RoIiBU +eXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTWF4QXJyYXlMZW5n +dGgiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYXhNZXNz +YWdlU2l6ZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1h +eEJ1ZmZlclNpemUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJDaGFubmVsTGlmZXRpbWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTZWN1cml0eVRva2VuTGlmZXRpbWUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUXVl +cnlEYXRhRGVzY3JpcHRpb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUmVsYXRpdmVQYXRoIiBUeXBlTmFtZT0idG5zOlJlbGF0aXZlUGF0aCIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkF0dHJpYnV0ZUlkIiBUeXBlTmFtZT0ib3BjOlVJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkluZGV4UmFuZ2UiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9Ik5vZGVUeXBlRGVzY3JpcHRpb24iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3Qi +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHlwZURlZmluaXRpb25Ob2RlIiBUeXBlTmFtZT0idWE6 +RXhwYW5kZWROb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbmNsdWRlU3ViVHlwZXMi +IFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEYXRh +VG9SZXR1cm4iIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJE +YXRhVG9SZXR1cm4iIFR5cGVOYW1lPSJ0bnM6UXVlcnlEYXRhRGVzY3JpcHRpb24iIExlbmd0aEZp +ZWxkPSJOb09mRGF0YVRvUmV0dXJuIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkZpbHRlck9wZXJhdG9yIiBMZW5ndGhJbkJpdHM9IjMy +Ij4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJFcXVhbHMiIFZhbHVlPSIwIiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IklzTnVsbCIgVmFsdWU9IjEiIC8+DQogICAg +PG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iR3JlYXRlclRoYW4iIFZhbHVlPSIyIiAvPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikxlc3NUaGFuIiBWYWx1ZT0iMyIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJHcmVhdGVyVGhhbk9yRXF1YWwiIFZhbHVlPSI0IiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikxlc3NUaGFuT3JFcXVhbCIgVmFsdWU9 +IjUiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTGlrZSIgVmFsdWU9IjYiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm90IiBWYWx1ZT0iNyIgLz4NCiAgICA8 +b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJCZXR3ZWVuIiBWYWx1ZT0iOCIgLz4NCiAgICA8b3Bj +OkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJJbkxpc3QiIFZhbHVlPSI5IiAvPg0KICAgIDxvcGM6RW51 +bWVyYXRlZFZhbHVlIE5hbWU9IkFuZCIgVmFsdWU9IjEwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9Ik9yIiBWYWx1ZT0iMTEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iQ2FzdCIgVmFsdWU9IjEyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IkluVmlldyIgVmFsdWU9IjEzIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik9m +VHlwZSIgVmFsdWU9IjE0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJlbGF0 +ZWRUbyIgVmFsdWU9IjE1IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkJpdHdp +c2VBbmQiIFZhbHVlPSIxNiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJCaXR3 +aXNlT3IiIFZhbHVlPSIxNyIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpT +dHJ1Y3R1cmVkVHlwZSBOYW1lPSJRdWVyeURhdGFTZXQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6RXhwYW5k +ZWROb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUeXBlRGVmaW5pdGlvbk5vZGUiIFR5 +cGVOYW1lPSJ1YTpFeHBhbmRlZE5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZW +YWx1ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1 +ZXMiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVsZD0iTm9PZlZhbHVlcyIgLz4NCiAg +PC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJOb2Rl +UmVmZXJlbmNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5vZGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlJlZmVyZW5jZVR5cGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IklzRm9yd2FyZCIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTm9PZlJlZmVyZW5jZWROb2RlSWRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVmZXJlbmNlZE5vZGVJZHMiIFR5cGVOYW1lPSJ1YTpO +b2RlSWQiIExlbmd0aEZpZWxkPSJOb09mUmVmZXJlbmNlZE5vZGVJZHMiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ29udGVudEZpbHRl +ckVsZW1lbnQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iRmlsdGVyT3BlcmF0b3IiIFR5cGVOYW1lPSJ0bnM6RmlsdGVyT3BlcmF0b3IiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRmlsdGVyT3BlcmFuZHMiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJGaWx0ZXJPcGVyYW5kcyIgVHlwZU5hbWU9InVh +OkV4dGVuc2lvbk9iamVjdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZGaWx0ZXJPcGVyYW5kcyIgLz4NCiAg +PC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDb250 +ZW50RmlsdGVyIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5vT2ZFbGVtZW50cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkVsZW1lbnRzIiBUeXBlTmFtZT0idG5zOkNvbnRlbnRGaWx0ZXJFbGVtZW50IiBM +ZW5ndGhGaWVsZD0iTm9PZkVsZW1lbnRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0K +ICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkZpbHRlck9wZXJhbmQiIEJhc2VUeXBlPSJ1YTpF +eHRlbnNpb25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj +dHVyZWRUeXBlIE5hbWU9IkVsZW1lbnRPcGVyYW5kIiBCYXNlVHlwZT0idG5zOkZpbHRlck9wZXJh +bmQiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW5kZXgiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +IkxpdGVyYWxPcGVyYW5kIiBCYXNlVHlwZT0idG5zOkZpbHRlck9wZXJhbmQiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iVmFsdWUiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkF0dHJpYnV0ZU9wZXJh +bmQiIEJhc2VUeXBlPSJ0bnM6RmlsdGVyT3BlcmFuZCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b2RlSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBbGlh +cyIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCcm93c2VQ +YXRoIiBUeXBlTmFtZT0idG5zOlJlbGF0aXZlUGF0aCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkF0dHJpYnV0ZUlkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkluZGV4UmFuZ2UiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlNpbXBsZUF0dHJpYnV0ZU9w +ZXJhbmQiIEJhc2VUeXBlPSJ0bnM6RmlsdGVyT3BlcmFuZCI+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJUeXBlRGVmaW5pdGlvbklkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZkJyb3dzZVBhdGgiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJCcm93c2VQYXRoIiBUeXBlTmFtZT0idWE6UXVhbGlmaWVkTmFtZSIgTGVu +Z3RoRmllbGQ9Ik5vT2ZCcm93c2VQYXRoIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQXR0cmli +dXRlSWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW5k +ZXhSYW5nZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBl +Pg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ29udGVudEZpbHRlckVsZW1lbnRSZXN1 +bHQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +U3RhdHVzQ29kZSIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mT3BlcmFuZFN0YXR1c0NvZGVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iT3BlcmFuZFN0YXR1c0NvZGVzIiBUeXBlTmFtZT0idWE6U3RhdHVz +Q29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZPcGVyYW5kU3RhdHVzQ29kZXMiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJOb09mT3BlcmFuZERpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik9wZXJhbmREaWFnbm9zdGljSW5mb3MiIFR5cGVO +YW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZPcGVyYW5kRGlhZ25vc3Rp +Y0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IkNvbnRlbnRGaWx0ZXJSZXN1bHQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkVsZW1lbnRSZXN1bHRzIiBUeXBlTmFtZT0i +b3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRWxlbWVudFJlc3VsdHMiIFR5cGVO +YW1lPSJ0bnM6Q29udGVudEZpbHRlckVsZW1lbnRSZXN1bHQiIExlbmd0aEZpZWxkPSJOb09mRWxl +bWVudFJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRWxlbWVudERpYWdub3N0 +aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVs +ZW1lbnREaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3Ro +RmllbGQ9Ik5vT2ZFbGVtZW50RGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVk +VHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlBhcnNpbmdSZXN1bHQiIEJhc2VU +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3RhdHVzQ29k +ZSIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +RGF0YVN0YXR1c0NvZGVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iRGF0YVN0YXR1c0NvZGVzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3RoRmll +bGQ9Ik5vT2ZEYXRhU3RhdHVzQ29kZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGF0 +YURpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IkRhdGFEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIg +TGVuZ3RoRmllbGQ9Ik5vT2ZEYXRhRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlF1ZXJ5Rmlyc3RSZXF1ZXN0 +IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJl +cXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlZpZXciIFR5cGVOYW1lPSJ0bnM6Vmlld0Rlc2NyaXB0aW9uIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTm9PZk5vZGVUeXBlcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vZGVUeXBlcyIgVHlwZU5hbWU9InRuczpOb2RlVHlwZURlc2Ny +aXB0aW9uIiBMZW5ndGhGaWVsZD0iTm9PZk5vZGVUeXBlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkZpbHRlciIgVHlwZU5hbWU9InRuczpDb250ZW50RmlsdGVyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTWF4RGF0YVNldHNUb1JldHVybiIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJNYXhSZWZlcmVuY2VzVG9SZXR1cm4iIFR5cGVOYW1lPSJvcGM6 +VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IlF1ZXJ5Rmlyc3RSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpS +ZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZRdWVyeURhdGFTZXRz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVlcnlEYXRh +U2V0cyIgVHlwZU5hbWU9InRuczpRdWVyeURhdGFTZXQiIExlbmd0aEZpZWxkPSJOb09mUXVlcnlE +YXRhU2V0cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNvbnRpbnVhdGlvblBvaW50IiBUeXBl +TmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUGFyc2lu +Z1Jlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQ +YXJzaW5nUmVzdWx0cyIgVHlwZU5hbWU9InRuczpQYXJzaW5nUmVzdWx0IiBMZW5ndGhGaWVsZD0i +Tm9PZlBhcnNpbmdSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0 +aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRp +YWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0i +Tm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkZpbHRlclJlc3Vs +dCIgVHlwZU5hbWU9InRuczpDb250ZW50RmlsdGVyUmVzdWx0IiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlF1ZXJ5TmV4dFJlcXVlc3Qi +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVx +dWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmVsZWFzZUNvbnRpbnVhdGlvblBvaW50IiBUeXBlTmFtZT0ib3BjOkJvb2xlYW4i +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDb250aW51YXRpb25Qb2ludCIgVHlwZU5hbWU9Im9w +YzpCeXRlU3RyaW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj +dHVyZWRUeXBlIE5hbWU9IlF1ZXJ5TmV4dFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0i +dG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlF1ZXJ5RGF0 +YVNldHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJRdWVy +eURhdGFTZXRzIiBUeXBlTmFtZT0idG5zOlF1ZXJ5RGF0YVNldCIgTGVuZ3RoRmllbGQ9Ik5vT2ZR +dWVyeURhdGFTZXRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmV2aXNlZENvbnRpbnVhdGlv +blBvaW50IiBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iVGltZXN0YW1wc1RvUmV0dXJuIiBM +ZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTb3VyY2Ui +IFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlNlcnZlciIgVmFs +dWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQm90aCIgVmFsdWU9IjIi +IC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTmVpdGhlciIgVmFsdWU9IjMiIC8+ +DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW52YWxpZCIgVmFsdWU9IjQiIC8+DQog +IDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUmVh +ZFZhbHVlSWQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iQXR0cmlidXRlSWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iSW5kZXhSYW5nZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJEYXRhRW5jb2RpbmciIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWROYW1lIiAvPg0KICA8 +L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlYWRS +ZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik1heEFnZSIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJUaW1lc3RhbXBzVG9SZXR1cm4iIFR5cGVOYW1lPSJ0bnM6VGltZXN0YW1w +c1RvUmV0dXJuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZk5vZGVzVG9SZWFkIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZXNUb1JlYWQiIFR5 +cGVOYW1lPSJ0bnM6UmVhZFZhbHVlSWQiIExlbmd0aEZpZWxkPSJOb09mTm9kZXNUb1JlYWQiIC8+ +DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i +UmVhZFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBUeXBlTmFtZT0idWE6RGF0YVZhbHVl +IiBMZW5ndGhGaWVsZD0iTm9PZlJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +RGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0 +aEZpZWxkPSJOb09mRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikhpc3RvcnlSZWFkVmFsdWVJZCIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2RlSWQiIFR5 +cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbmRleFJhbmdlIiBU +eXBlTmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFFbmNvZGlu +ZyIgVHlwZU5hbWU9InVhOlF1YWxpZmllZE5hbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJD +b250aW51YXRpb25Qb2ludCIgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiAvPg0KICA8L29wYzpT +dHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikhpc3RvcnlSZWFk +UmVzdWx0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlN0YXR1c0NvZGUiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQ29udGludWF0aW9uUG9pbnQiIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ikhpc3RvcnlEYXRhIiBUeXBlTmFtZT0idWE6RXh0ZW5zaW9u +T2JqZWN0IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9Ikhpc3RvcnlSZWFkRGV0YWlscyIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iUmVhZEV2ZW50RGV0YWlscyIgQmFzZVR5cGU9InRuczpIaXN0b3J5UmVhZERldGFpbHMiPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtVmFsdWVzUGVyTm9kZSIgVHlwZU5hbWU9Im9wYzpVSW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGFydFRpbWUiIFR5cGVOYW1lPSJvcGM6RGF0 +ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRUaW1lIiBUeXBlTmFtZT0ib3BjOkRh +dGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRmlsdGVyIiBUeXBlTmFtZT0idG5zOkV2 +ZW50RmlsdGVyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVy +ZWRUeXBlIE5hbWU9IlJlYWRSYXdNb2RpZmllZERldGFpbHMiIEJhc2VUeXBlPSJ0bnM6SGlzdG9y +eVJlYWREZXRhaWxzIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IklzUmVhZE1vZGlmaWVkIiBUeXBl +TmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGFydFRpbWUiIFR5 +cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRUaW1lIiBU +eXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTnVtVmFsdWVz +UGVyTm9kZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJS +ZXR1cm5Cb3VuZHMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgPC9vcGM6U3RydWN0dXJl +ZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJSZWFkUHJvY2Vzc2VkRGV0YWls +cyIgQmFzZVR5cGU9InRuczpIaXN0b3J5UmVhZERldGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iU3RhcnRUaW1lIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iRW5kVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlByb2Nlc3NpbmdJbnRlcnZhbCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb09mQWdncmVnYXRlVHlwZSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFnZ3JlZ2F0ZVR5cGUiIFR5cGVOYW1lPSJ1YTpOb2Rl +SWQiIExlbmd0aEZpZWxkPSJOb09mQWdncmVnYXRlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24iIFR5cGVOYW1lPSJ0bnM6QWdncmVnYXRlQ29uZmln +dXJhdGlvbiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVk +VHlwZSBOYW1lPSJSZWFkQXRUaW1lRGV0YWlscyIgQmFzZVR5cGU9InRuczpIaXN0b3J5UmVhZERl +dGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlcVRpbWVzIiBUeXBlTmFtZT0ib3Bj +OkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxVGltZXMiIFR5cGVOYW1lPSJvcGM6 +RGF0ZVRpbWUiIExlbmd0aEZpZWxkPSJOb09mUmVxVGltZXMiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJVc2VTaW1wbGVCb3VuZHMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJSZWFkQW5ub3Rh +dGlvbkRhdGFEZXRhaWxzIiBCYXNlVHlwZT0idG5zOkhpc3RvcnlSZWFkRGV0YWlscyI+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb09mUmVxVGltZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJSZXFUaW1lcyIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgTGVu +Z3RoRmllbGQ9Ik5vT2ZSZXFUaW1lcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJIaXN0b3J5RGF0YSIgQmFzZVR5cGU9InVhOkV4dGVu +c2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGF0YVZhbHVlcyIgVHlwZU5h +bWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRhdGFWYWx1ZXMiIFR5cGVO +YW1lPSJ1YTpEYXRhVmFsdWUiIExlbmd0aEZpZWxkPSJOb09mRGF0YVZhbHVlcyIgLz4NCiAgPC9v +cGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNb2RpZmlj +YXRpb25JbmZvIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik1vZGlmaWNhdGlvblRpbWUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJVcGRhdGVUeXBlIiBUeXBlTmFtZT0idG5zOkhpc3RvcnlVcGRhdGVU +eXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlck5hbWUiIFR5cGVOYW1lPSJvcGM6U3Ry +aW5nIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9Ikhpc3RvcnlNb2RpZmllZERhdGEiIEJhc2VUeXBlPSJ0bnM6SGlzdG9yeURhdGEiPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRhdGFWYWx1ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEYXRhVmFsdWVzIiBUeXBlTmFtZT0idWE6RGF0YVZh +bHVlIiBMZW5ndGhGaWVsZD0iTm9PZkRhdGFWYWx1ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJOb09mTW9kaWZpY2F0aW9uSW5mb3MiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJNb2RpZmljYXRpb25JbmZvcyIgVHlwZU5hbWU9InRuczpNb2RpZmljYXRp +b25JbmZvIiBMZW5ndGhGaWVsZD0iTm9PZk1vZGlmaWNhdGlvbkluZm9zIiAvPg0KICA8L29wYzpT +dHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikhpc3RvcnlFdmVu +dCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJO +b09mRXZlbnRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RXZlbnRzIiBUeXBlTmFtZT0idG5zOkhpc3RvcnlFdmVudEZpZWxkTGlzdCIgTGVuZ3RoRmllbGQ9 +Ik5vT2ZFdmVudHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iSGlzdG9yeVJlYWRSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0 +bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikhpc3RvcnlSZWFkRGV0 +YWlscyIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IlRpbWVzdGFtcHNUb1JldHVybiIgVHlwZU5hbWU9InRuczpUaW1lc3RhbXBzVG9SZXR1cm4i +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZWxlYXNlQ29udGludWF0aW9uUG9pbnRzIiBUeXBl +TmFtZT0ib3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTm9kZXNUb1Jl +YWQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb2Rlc1Rv +UmVhZCIgVHlwZU5hbWU9InRuczpIaXN0b3J5UmVhZFZhbHVlSWQiIExlbmd0aEZpZWxkPSJOb09m +Tm9kZXNUb1JlYWQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iSGlzdG9yeVJlYWRSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9 +InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIg +VHlwZU5hbWU9InRuczpIaXN0b3J5UmVhZFJlc3VsdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZXN1bHRz +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9 +Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvcyIgVHlw +ZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdub3N0aWNJbmZv +cyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBO +YW1lPSJXcml0ZVZhbHVlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vZGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkF0dHJpYnV0ZUlkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkluZGV4UmFuZ2UiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iVmFsdWUiIFR5cGVOYW1lPSJ1YTpEYXRhVmFsdWUiIC8+DQogIDwvb3Bj +OlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iV3JpdGVSZXF1 +ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZOb2Rlc1RvV3JpdGUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOb2Rlc1RvV3JpdGUiIFR5cGVOYW1lPSJ0bnM6V3JpdGVWYWx1 +ZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZOb2Rlc1RvV3JpdGUiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRU +eXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iV3JpdGVSZXNwb25zZSIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhl +YWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iUmVzdWx0cyIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIExlbmd0aEZpZWxkPSJOb09m +UmVzdWx0cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5m +b3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9z +dGljSW5mb3MiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJl +ZFR5cGUgTmFtZT0iSGlzdG9yeVVwZGF0ZURldGFpbHMiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlk +IiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5h +bWU9Ikhpc3RvcnlVcGRhdGVUeXBlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1l +cmF0ZWRWYWx1ZSBOYW1lPSJJbnNlcnQiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IlJlcGxhY2UiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9IlVwZGF0ZSIgVmFsdWU9IjMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUg +TmFtZT0iRGVsZXRlIiBWYWx1ZT0iNCIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+DQoNCiAg +PG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJQZXJmb3JtVXBkYXRlVHlwZSIgTGVuZ3RoSW5CaXRz +PSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW5zZXJ0IiBWYWx1ZT0iMSIg +Lz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJSZXBsYWNlIiBWYWx1ZT0iMiIgLz4N +CiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVcGRhdGUiIFZhbHVlPSIzIiAvPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJlbW92ZSIgVmFsdWU9IjQiIC8+DQogIDwvb3Bj +OkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVXBkYXRlRGF0 +YURldGFpbHMiIEJhc2VUeXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6 +SGlzdG9yeVVwZGF0ZURldGFpbHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQZXJmb3JtSW5z +ZXJ0UmVwbGFjZSIgVHlwZU5hbWU9InRuczpQZXJmb3JtVXBkYXRlVHlwZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZVcGRhdGVWYWx1ZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJVcGRhdGVWYWx1ZXMiIFR5cGVOYW1lPSJ1YTpEYXRhVmFsdWUi +IExlbmd0aEZpZWxkPSJOb09mVXBkYXRlVmFsdWVzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlw +ZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlVwZGF0ZVN0cnVjdHVyZURhdGFEZXRh +aWxzIiBCYXNlVHlwZT0idG5zOkhpc3RvcnlVcGRhdGVEZXRhaWxzIj4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9Ik5vZGVJZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgU291cmNlVHlwZT0idG5zOkhpc3Rv +cnlVcGRhdGVEZXRhaWxzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUGVyZm9ybUluc2VydFJl +cGxhY2UiIFR5cGVOYW1lPSJ0bnM6UGVyZm9ybVVwZGF0ZVR5cGUiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOb09mVXBkYXRlVmFsdWVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iVXBkYXRlVmFsdWVzIiBUeXBlTmFtZT0idWE6RGF0YVZhbHVlIiBMZW5n +dGhGaWVsZD0iTm9PZlVwZGF0ZVZhbHVlcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJVcGRhdGVFdmVudERldGFpbHMiIEJhc2VUeXBl +PSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlk +IiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFp +bHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJQZXJmb3JtSW5zZXJ0UmVwbGFjZSIgVHlwZU5h +bWU9InRuczpQZXJmb3JtVXBkYXRlVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkZpbHRl +ciIgVHlwZU5hbWU9InRuczpFdmVudEZpbHRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v +T2ZFdmVudERhdGEiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJFdmVudERhdGEiIFR5cGVOYW1lPSJ0bnM6SGlzdG9yeUV2ZW50RmllbGRMaXN0IiBMZW5ndGhG +aWVsZD0iTm9PZkV2ZW50RGF0YSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWxldGVSYXdNb2RpZmllZERldGFpbHMiIEJhc2VUeXBl +PSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlk +IiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFp +bHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJc0RlbGV0ZU1vZGlmaWVkIiBUeXBlTmFtZT0i +b3BjOkJvb2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGFydFRpbWUiIFR5cGVOYW1l +PSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmRUaW1lIiBUeXBlTmFt +ZT0ib3BjOkRhdGVUaW1lIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0 +cnVjdHVyZWRUeXBlIE5hbWU9IkRlbGV0ZUF0VGltZURldGFpbHMiIEJhc2VUeXBlPSJ0bnM6SGlz +dG9yeVVwZGF0ZURldGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlkIiBUeXBlTmFt +ZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVxVGltZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXFUaW1lcyIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIg +TGVuZ3RoRmllbGQ9Ik5vT2ZSZXFUaW1lcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWxldGVFdmVudERldGFpbHMiIEJhc2VUeXBl +PSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZUlk +IiBUeXBlTmFtZT0idWE6Tm9kZUlkIiBTb3VyY2VUeXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFp +bHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRXZlbnRJZHMiIFR5cGVOYW1lPSJvcGM6 +SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFdmVudElkcyIgVHlwZU5hbWU9Im9wYzpC +eXRlU3RyaW5nIiBMZW5ndGhGaWVsZD0iTm9PZkV2ZW50SWRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikhpc3RvcnlVcGRhdGVSZXN1 +bHQiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +U3RhdHVzQ29kZSIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mT3BlcmF0aW9uUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik9wZXJhdGlvblJlc3VsdHMiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2Rl +IiBMZW5ndGhGaWVsZD0iTm9PZk9wZXJhdGlvblJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0lu +Zm8iIExlbmd0aEZpZWxkPSJOb09mRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ikhpc3RvcnlVcGRhdGVSZXF1 +ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZIaXN0b3J5VXBkYXRlRGV0YWlscyIgVHlwZU5hbWU9Im9wYzpJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikhpc3RvcnlVcGRhdGVEZXRhaWxzIiBUeXBlTmFt +ZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBMZW5ndGhGaWVsZD0iTm9PZkhpc3RvcnlVcGRhdGVEZXRh +aWxzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9Ikhpc3RvcnlVcGRhdGVSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpS +ZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRzIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIgVHlwZU5h +bWU9InRuczpIaXN0b3J5VXBkYXRlUmVzdWx0IiBMZW5ndGhGaWVsZD0iTm9PZlJlc3VsdHMiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0ib3Bj +OkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlhZ25vc3RpY0luZm9zIiBUeXBlTmFt +ZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxkPSJOb09mRGlhZ25vc3RpY0luZm9zIiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +IkNhbGxNZXRob2RSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ik9iamVjdElkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTWV0aG9kSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mSW5wdXRBcmd1bWVudHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnB1dEFyZ3VtZW50cyIgVHlwZU5hbWU9InVhOlZhcmlh +bnQiIExlbmd0aEZpZWxkPSJOb09mSW5wdXRBcmd1bWVudHMiIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ2FsbE1ldGhvZFJlc3VsdCIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0 +dXNDb2RlIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +Ik5vT2ZJbnB1dEFyZ3VtZW50UmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IklucHV0QXJndW1lbnRSZXN1bHRzIiBUeXBlTmFtZT0idWE6U3RhdHVz +Q29kZSIgTGVuZ3RoRmllbGQ9Ik5vT2ZJbnB1dEFyZ3VtZW50UmVzdWx0cyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZJbnB1dEFyZ3VtZW50RGlhZ25vc3RpY0luZm9zIiBUeXBlTmFtZT0i +b3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iSW5wdXRBcmd1bWVudERpYWdub3N0 +aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZklu +cHV0QXJndW1lbnREaWFnbm9zdGljSW5mb3MiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09m +T3V0cHV0QXJndW1lbnRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iT3V0cHV0QXJndW1lbnRzIiBUeXBlTmFtZT0idWE6VmFyaWFudCIgTGVuZ3RoRmllbGQ9 +Ik5vT2ZPdXRwdXRBcmd1bWVudHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxv +cGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ2FsbFJlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9 +InRuczpSZXF1ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZk1ldGhvZHNU +b0NhbGwiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNZXRo +b2RzVG9DYWxsIiBUeXBlTmFtZT0idG5zOkNhbGxNZXRob2RSZXF1ZXN0IiBMZW5ndGhGaWVsZD0i +Tm9PZk1ldGhvZHNUb0NhbGwiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6 +U3RydWN0dXJlZFR5cGUgTmFtZT0iQ2FsbFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0i +dG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMi +IFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBU +eXBlTmFtZT0idG5zOkNhbGxNZXRob2RSZXN1bHQiIExlbmd0aEZpZWxkPSJOb09mUmVzdWx0cyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5mb3MiIFR5cGVO +YW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9zdGljSW5mb3Mi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFt +ZT0iTW9uaXRvcmluZ01vZGUiIExlbmd0aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRl +ZFZhbHVlIE5hbWU9IkRpc2FibGVkIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRW +YWx1ZSBOYW1lPSJTYW1wbGluZyIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFs +dWUgTmFtZT0iUmVwb3J0aW5nIiBWYWx1ZT0iMiIgLz4NCiAgPC9vcGM6RW51bWVyYXRlZFR5cGU+ +DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJEYXRhQ2hhbmdlVHJpZ2dlciIgTGVuZ3Ro +SW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU3RhdHVzIiBWYWx1 +ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTdGF0dXNWYWx1ZSIgVmFs +dWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU3RhdHVzVmFsdWVUaW1l +c3RhbXAiIFZhbHVlPSIyIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOkVu +dW1lcmF0ZWRUeXBlIE5hbWU9IkRlYWRiYW5kVHlwZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAg +PG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9uZSIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iQWJzb2x1dGUiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51 +bWVyYXRlZFZhbHVlIE5hbWU9IlBlcmNlbnQiIFZhbHVlPSIyIiAvPg0KICA8L29wYzpFbnVtZXJh +dGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik1vbml0b3JpbmdGaWx0ZXIi +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4N +Cg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFDaGFuZ2VGaWx0ZXIiIEJhc2VUeXBl +PSJ0bnM6TW9uaXRvcmluZ0ZpbHRlciI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUcmlnZ2VyIiBU +eXBlTmFtZT0idG5zOkRhdGFDaGFuZ2VUcmlnZ2VyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RGVhZGJhbmRUeXBlIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkRlYWRiYW5kVmFsdWUiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkV2ZW50RmlsdGVyIiBC +YXNlVHlwZT0idG5zOk1vbml0b3JpbmdGaWx0ZXIiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZlNlbGVjdENsYXVzZXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJTZWxlY3RDbGF1c2VzIiBUeXBlTmFtZT0idG5zOlNpbXBsZUF0dHJpYnV0ZU9wZXJhbmQi +IExlbmd0aEZpZWxkPSJOb09mU2VsZWN0Q2xhdXNlcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IldoZXJlQ2xhdXNlIiBUeXBlTmFtZT0idG5zOkNvbnRlbnRGaWx0ZXIiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWdncmVnYXRlQ29u +ZmlndXJhdGlvbiIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJVc2VTZXJ2ZXJDYXBhYmlsaXRpZXNEZWZhdWx0cyIgVHlwZU5hbWU9Im9wYzpCb29s +ZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHJlYXRVbmNlcnRhaW5Bc0JhZCIgVHlwZU5h +bWU9Im9wYzpCb29sZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUGVyY2VudERhdGFCYWQi +IFR5cGVOYW1lPSJvcGM6Qnl0ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlBlcmNlbnREYXRh +R29vZCIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlU2xv +cGVkRXh0cmFwb2xhdGlvbiIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICA8L29wYzpTdHJ1 +Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkFnZ3JlZ2F0ZUZpbHRl +ciIgQmFzZVR5cGU9InRuczpNb25pdG9yaW5nRmlsdGVyIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlN0YXJ0VGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkFnZ3JlZ2F0ZVR5cGUiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJQcm9jZXNzaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQWdncmVnYXRlQ29uZmlndXJhdGlvbiIgVHlwZU5hbWU9InRuczpB +Z2dyZWdhdGVDb25maWd1cmF0aW9uIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8 +b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9Ik1vbml0b3JpbmdGaWx0ZXJSZXN1bHQiIEJhc2VUeXBl +PSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IkV2ZW50RmlsdGVyUmVzdWx0IiBCYXNlVHlwZT0idG5zOk1v +bml0b3JpbmdGaWx0ZXJSZXN1bHQiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlNlbGVjdENs +YXVzZVJlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJTZWxlY3RDbGF1c2VSZXN1bHRzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3RoRmll +bGQ9Ik5vT2ZTZWxlY3RDbGF1c2VSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9P +ZlNlbGVjdENsYXVzZURpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlNlbGVjdENsYXVzZURpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9 +InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZlNlbGVjdENsYXVzZURpYWdub3N0 +aWNJbmZvcyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IldoZXJlQ2xhdXNlUmVzdWx0IiBUeXBl +TmFtZT0idG5zOkNvbnRlbnRGaWx0ZXJSZXN1bHQiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBl +Pg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQWdncmVnYXRlRmlsdGVyUmVzdWx0IiBC +YXNlVHlwZT0idG5zOk1vbml0b3JpbmdGaWx0ZXJSZXN1bHQiPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iUmV2aXNlZFN0YXJ0VGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IlJldmlzZWRQcm9jZXNzaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91 +YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmV2aXNlZEFnZ3JlZ2F0ZUNvbmZpZ3VyYXRp +b24iIFR5cGVOYW1lPSJ0bnM6QWdncmVnYXRlQ29uZmlndXJhdGlvbiIgLz4NCiAgPC9vcGM6U3Ry +dWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNb25pdG9yaW5nUGFy +YW1ldGVycyIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJDbGllbnRIYW5kbGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iU2FtcGxpbmdJbnRlcnZhbCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJGaWx0ZXIiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmplY3QiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJRdWV1ZVNpemUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzY2FyZE9sZGVzdCIgVHlwZU5hbWU9Im9wYzpCb29s +ZWFuIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBl +IE5hbWU9Ik1vbml0b3JlZEl0ZW1DcmVhdGVSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikl0ZW1Ub01vbml0b3IiIFR5cGVOYW1lPSJ0 +bnM6UmVhZFZhbHVlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNb25pdG9yaW5nTW9kZSIg +VHlwZU5hbWU9InRuczpNb25pdG9yaW5nTW9kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJl +cXVlc3RlZFBhcmFtZXRlcnMiIFR5cGVOYW1lPSJ0bnM6TW9uaXRvcmluZ1BhcmFtZXRlcnMiIC8+ +DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i +TW9uaXRvcmVkSXRlbUNyZWF0ZVJlc3VsdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29k +ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1vbml0b3JlZEl0ZW1JZCIgVHlwZU5hbWU9Im9w +YzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXZpc2VkU2FtcGxpbmdJbnRlcnZh +bCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXZpc2Vk +UXVldWVTaXplIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkZpbHRlclJlc3VsdCIgVHlwZU5hbWU9InVhOkV4dGVuc2lvbk9iamVjdCIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJDcmVhdGVNb25p +dG9yZWRJdGVtc1JlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5hbWU9InRuczpSZXF1ZXN0SGVhZGVy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3Vic2NyaXB0aW9uSWQiIFR5cGVOYW1lPSJvcGM6 +VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVGltZXN0YW1wc1RvUmV0dXJuIiBUeXBl +TmFtZT0idG5zOlRpbWVzdGFtcHNUb1JldHVybiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5v +T2ZJdGVtc1RvQ3JlYXRlIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iSXRlbXNUb0NyZWF0ZSIgVHlwZU5hbWU9InRuczpNb25pdG9yZWRJdGVtQ3JlYXRlUmVx +dWVzdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZJdGVtc1RvQ3JlYXRlIiAvPg0KICA8L29wYzpTdHJ1Y3R1 +cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkNyZWF0ZU1vbml0b3JlZEl0 +ZW1zUmVzcG9uc2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3VsdHMiIFR5cGVOYW1lPSJ0bnM6TW9uaXRvcmVk +SXRlbUNyZWF0ZVJlc3VsdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdu +b3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6 +U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNb25pdG9yZWRJ +dGVtTW9kaWZ5UmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJNb25pdG9yZWRJdGVtSWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdGVkUGFyYW1ldGVycyIgVHlwZU5hbWU9InRuczpN +b25pdG9yaW5nUGFyYW1ldGVycyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJNb25pdG9yZWRJdGVtTW9kaWZ5UmVzdWx0IiBCYXNlVHlw +ZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0YXR1c0NvZGUi +IFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmV2aXNl +ZFNhbXBsaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmV2aXNlZFF1ZXVlU2l6ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJGaWx0ZXJSZXN1bHQiIFR5cGVOYW1lPSJ1YTpFeHRlbnNpb25PYmpl +Y3QiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iTW9kaWZ5TW9uaXRvcmVkSXRlbXNSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9u +T2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0 +bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNjcmlwdGlvbklk +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRpbWVzdGFt +cHNUb1JldHVybiIgVHlwZU5hbWU9InRuczpUaW1lc3RhbXBzVG9SZXR1cm4iIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mSXRlbXNUb01vZGlmeSIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ikl0ZW1zVG9Nb2RpZnkiIFR5cGVOYW1lPSJ0bnM6TW9uaXRv +cmVkSXRlbU1vZGlmeVJlcXVlc3QiIExlbmd0aEZpZWxkPSJOb09mSXRlbXNUb01vZGlmeSIgLz4N +CiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJN +b2RpZnlNb25pdG9yZWRJdGVtc1Jlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0 +Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJl +c3BvbnNlSGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMiIFR5cGVO +YW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBUeXBlTmFt +ZT0idG5zOk1vbml0b3JlZEl0ZW1Nb2RpZnlSZXN1bHQiIExlbmd0aEZpZWxkPSJOb09mUmVzdWx0 +cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1l +PSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5mb3MiIFR5 +cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9zdGljSW5m +b3MiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUg +TmFtZT0iU2V0TW9uaXRvcmluZ01vZGVSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6 +UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNjcmlwdGlvbklkIiBU +eXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1vbml0b3JpbmdN +b2RlIiBUeXBlTmFtZT0idG5zOk1vbml0b3JpbmdNb2RlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTm9PZk1vbml0b3JlZEl0ZW1JZHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJNb25pdG9yZWRJdGVtSWRzIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVu +Z3RoRmllbGQ9Ik5vT2ZNb25pdG9yZWRJdGVtSWRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlw +ZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlNldE1vbml0b3JpbmdNb2RlUmVzcG9u +c2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +UmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlJlc3VsdHMiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiBMZW5ndGhG +aWVsZD0iTm9PZlJlc3VsdHMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRGlhZ25vc3Rp +Y0luZm9zIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlh +Z25vc3RpY0luZm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxkPSJO +b09mRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IlNldFRyaWdnZXJpbmdSZXF1ZXN0IiBCYXNlVHlwZT0idWE6 +RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5 +cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNj +cmlwdGlvbklkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlRyaWdnZXJpbmdJdGVtSWQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iTm9PZkxpbmtzVG9BZGQiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJMaW5rc1RvQWRkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmll +bGQ9Ik5vT2ZMaW5rc1RvQWRkIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkxpbmtzVG9S +ZW1vdmUiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMaW5r +c1RvUmVtb3ZlIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5vT2ZMaW5rc1Rv +UmVtb3ZlIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IlNldFRyaWdnZXJpbmdSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRu +czpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZBZGRSZXN1bHRz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWRkUmVzdWx0 +cyIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIExlbmd0aEZpZWxkPSJOb09mQWRkUmVzdWx0cyIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZBZGREaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1l +PSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBZGREaWFnbm9zdGljSW5mb3Mi +IFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZBZGREaWFnbm9z +dGljSW5mb3MiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVtb3ZlUmVzdWx0cyIgVHlw +ZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlbW92ZVJlc3VsdHMi +IFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiBMZW5ndGhGaWVsZD0iTm9PZlJlbW92ZVJlc3VsdHMi +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mUmVtb3ZlRGlhZ25vc3RpY0luZm9zIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVtb3ZlRGlhZ25vc3Rp +Y0luZm9zIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIExlbmd0aEZpZWxkPSJOb09mUmVt +b3ZlRGlhZ25vc3RpY0luZm9zIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRlbGV0ZU1vbml0b3JlZEl0ZW1zUmVxdWVzdCIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVh +ZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJTdWJzY3JpcHRpb25JZCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJOb09mTW9uaXRvcmVkSXRlbUlkcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik1vbml0b3JlZEl0ZW1JZHMiIFR5cGVOYW1lPSJvcGM6VUludDMy +IiBMZW5ndGhGaWVsZD0iTm9PZk1vbml0b3JlZEl0ZW1JZHMiIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGVsZXRlTW9uaXRvcmVkSXRl +bXNSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUi +IExlbmd0aEZpZWxkPSJOb09mUmVzdWx0cyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZE +aWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3Ro +RmllbGQ9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iQ3JlYXRlU3Vic2NyaXB0aW9uUmVxdWVzdCIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1 +ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJSZXF1ZXN0ZWRQdWJsaXNoaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91Ymxl +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdGVkTGlmZXRpbWVDb3VudCIgVHlwZU5h +bWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0ZWRNYXhLZWVw +QWxpdmVDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJNYXhOb3RpZmljYXRpb25zUGVyUHVibGlzaCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJQdWJsaXNoaW5nRW5hYmxlZCIgVHlwZU5hbWU9Im9wYzpCb29s +ZWFuIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHJpb3JpdHkiIFR5cGVOYW1lPSJvcGM6Qnl0 +ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBO +YW1lPSJDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRu +czpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNjcmlwdGlvbklk +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJldmlzZWRQ +dWJsaXNoaW5nSW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmV2aXNlZExpZmV0aW1lQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUmV2aXNlZE1heEtlZXBBbGl2ZUNvdW50IiBUeXBlTmFtZT0i +b3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1 +cmVkVHlwZSBOYW1lPSJNb2RpZnlTdWJzY3JpcHRpb25SZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0 +ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVO +YW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNjcmlw +dGlvbklkIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJl +cXVlc3RlZFB1Ymxpc2hpbmdJbnRlcnZhbCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0ZWRMaWZldGltZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJ +bnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlcXVlc3RlZE1heEtlZXBBbGl2ZUNvdW50 +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1heE5vdGlm +aWNhdGlvbnNQZXJQdWJsaXNoIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlByaW9yaXR5IiBUeXBlTmFtZT0ib3BjOkJ5dGUiIC8+DQogIDwvb3BjOlN0cnVj +dHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iTW9kaWZ5U3Vic2NyaXB0 +aW9uUmVzcG9uc2UiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iUmVzcG9uc2VIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXZpc2VkUHVibGlzaGluZ0ludGVydmFsIiBUeXBlTmFt +ZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJldmlzZWRMaWZldGltZUNv +dW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJldmlz +ZWRNYXhLZWVwQWxpdmVDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU2V0UHVibGlzaGlu +Z01vZGVSZXF1ZXN0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlJlcXVlc3RIZWFkZXIiIFR5cGVOYW1lPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlB1Ymxpc2hpbmdFbmFibGVkIiBUeXBlTmFtZT0ib3BjOkJv +b2xlYW4iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU3Vic2NyaXB0aW9uSWRzIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3Vic2NyaXB0aW9uSWRz +IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVuZ3RoRmllbGQ9Ik5vT2ZTdWJzY3JpcHRpb25JZHMi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iU2V0UHVibGlzaGluZ01vZGVSZXNwb25zZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpS +ZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRzIiBUeXBl +TmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIgVHlwZU5h +bWU9InVhOlN0YXR1c0NvZGUiIExlbmd0aEZpZWxkPSJOb09mUmVzdWx0cyIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1YTpEaWFn +bm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIC8+DQogIDwvb3Bj +OlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iTm90aWZpY2F0 +aW9uTWVzc2FnZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTZXF1ZW5jZU51bWJlciIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJQdWJsaXNoVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZOb3RpZmljYXRpb25EYXRhIiBUeXBlTmFtZT0ib3BjOklu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm90aWZpY2F0aW9uRGF0YSIgVHlwZU5hbWU9 +InVhOkV4dGVuc2lvbk9iamVjdCIgTGVuZ3RoRmllbGQ9Ik5vT2ZOb3RpZmljYXRpb25EYXRhIiAv +Pg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9 +Ik5vdGlmaWNhdGlvbkRhdGEiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICA8L29w +YzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkRhdGFDaGFu +Z2VOb3RpZmljYXRpb24iIEJhc2VUeXBlPSJ0bnM6Tm90aWZpY2F0aW9uRGF0YSI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJOb09mTW9uaXRvcmVkSXRlbXMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNb25pdG9yZWRJdGVtcyIgVHlwZU5hbWU9InRuczpNb25p +dG9yZWRJdGVtTm90aWZpY2F0aW9uIiBMZW5ndGhGaWVsZD0iTm9PZk1vbml0b3JlZEl0ZW1zIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvcyIgVHlwZU5h +bWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0iTm9PZkRpYWdub3N0aWNJbmZvcyIg +Lz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1l +PSJNb25pdG9yZWRJdGVtTm90aWZpY2F0aW9uIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0 +Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNsaWVudEhhbmRsZSIgVHlwZU5hbWU9Im9wYzpVSW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlwZU5hbWU9InVhOkRhdGFWYWx1 +ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBO +YW1lPSJFdmVudE5vdGlmaWNhdGlvbkxpc3QiIEJhc2VUeXBlPSJ0bnM6Tm90aWZpY2F0aW9uRGF0 +YSI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRXZlbnRzIiBUeXBlTmFtZT0ib3BjOkludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRXZlbnRzIiBUeXBlTmFtZT0idG5zOkV2ZW50Rmll +bGRMaXN0IiBMZW5ndGhGaWVsZD0iTm9PZkV2ZW50cyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5 +cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJFdmVudEZpZWxkTGlzdCIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDbGllbnRIYW5k +bGUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkV2 +ZW50RmllbGRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RXZlbnRGaWVsZHMiIFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVsZD0iTm9PZkV2ZW50 +RmllbGRzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9Ikhpc3RvcnlFdmVudEZpZWxkTGlzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRXZlbnRGaWVsZHMiIFR5cGVOYW1lPSJv +cGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFdmVudEZpZWxkcyIgVHlwZU5hbWU9 +InVhOlZhcmlhbnQiIExlbmd0aEZpZWxkPSJOb09mRXZlbnRGaWVsZHMiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU3RhdHVzQ2hhbmdl +Tm90aWZpY2F0aW9uIiBCYXNlVHlwZT0idG5zOk5vdGlmaWNhdGlvbkRhdGEiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iU3RhdHVzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8i +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iU3Vic2NyaXB0aW9uQWNrbm93bGVkZ2VtZW50IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN1YnNjcmlwdGlvbklkIiBUeXBlTmFtZT0ib3Bj +OlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlcXVlbmNlTnVtYmVyIiBUeXBlTmFt +ZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1 +Y3R1cmVkVHlwZSBOYW1lPSJQdWJsaXNoUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5z +OlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mU3Vic2NyaXB0aW9u +QWNrbm93bGVkZ2VtZW50cyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlN1YnNjcmlwdGlvbkFja25vd2xlZGdlbWVudHMiIFR5cGVOYW1lPSJ0bnM6U3Vic2Ny +aXB0aW9uQWNrbm93bGVkZ2VtZW50IiBMZW5ndGhGaWVsZD0iTm9PZlN1YnNjcmlwdGlvbkFja25v +d2xlZGdlbWVudHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0 +dXJlZFR5cGUgTmFtZT0iUHVibGlzaFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2Jq +ZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5z +OlJlc3BvbnNlSGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU3Vic2NyaXB0aW9uSWQi +IFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkF2YWls +YWJsZVNlcXVlbmNlTnVtYmVycyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkF2YWlsYWJsZVNlcXVlbmNlTnVtYmVycyIgVHlwZU5hbWU9Im9wYzpVSW50MzIi +IExlbmd0aEZpZWxkPSJOb09mQXZhaWxhYmxlU2VxdWVuY2VOdW1iZXJzIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTW9yZU5vdGlmaWNhdGlvbnMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vdGlmaWNhdGlvbk1lc3NhZ2UiIFR5cGVOYW1lPSJ0bnM6 +Tm90aWZpY2F0aW9uTWVzc2FnZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRz +IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVzdWx0cyIg +VHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIExlbmd0aEZpZWxkPSJOb09mUmVzdWx0cyIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJvcGM6SW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaWFnbm9zdGljSW5mb3MiIFR5cGVOYW1lPSJ1 +YTpEaWFnbm9zdGljSW5mbyIgTGVuZ3RoRmllbGQ9Ik5vT2ZEaWFnbm9zdGljSW5mb3MiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUmVw +dWJsaXNoUmVxdWVzdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJSZXF1ZXN0SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdWJzY3JpcHRpb25JZCIgVHlwZU5hbWU9Im9wYzpVSW50 +MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXRyYW5zbWl0U2VxdWVuY2VOdW1iZXIiIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj +OlN0cnVjdHVyZWRUeXBlIE5hbWU9IlJlcHVibGlzaFJlc3BvbnNlIiBCYXNlVHlwZT0idWE6RXh0 +ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlc3BvbnNlSGVhZGVyIiBUeXBl +TmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm90aWZp +Y2F0aW9uTWVzc2FnZSIgVHlwZU5hbWU9InRuczpOb3RpZmljYXRpb25NZXNzYWdlIiAvPg0KICA8 +L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlRyYW5z +ZmVyUmVzdWx0IiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxk +IE5hbWU9IlN0YXR1c0NvZGUiIFR5cGVOYW1lPSJ1YTpTdGF0dXNDb2RlIiAvPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iTm9PZkF2YWlsYWJsZVNlcXVlbmNlTnVtYmVycyIgVHlwZU5hbWU9Im9wYzpJ +bnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkF2YWlsYWJsZVNlcXVlbmNlTnVtYmVycyIg +VHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJOb09mQXZhaWxhYmxlU2VxdWVuY2VO +dW1iZXJzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IlRyYW5zZmVyU3Vic2NyaXB0aW9uc1JlcXVlc3QiIEJhc2VUeXBlPSJ1YTpFeHRl +bnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVxdWVzdEhlYWRlciIgVHlwZU5h +bWU9InRuczpSZXF1ZXN0SGVhZGVyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZlN1YnNj +cmlwdGlvbklkcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlN1YnNjcmlwdGlvbklkcyIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIExlbmd0aEZpZWxkPSJOb09m +U3Vic2NyaXB0aW9uSWRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VuZEluaXRpYWxWYWx1 +ZXMiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoN +CiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJUcmFuc2ZlclN1YnNjcmlwdGlvbnNSZXNwb25z +ZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJS +ZXNwb25zZUhlYWRlciIgVHlwZU5hbWU9InRuczpSZXNwb25zZUhlYWRlciIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZSZXN1bHRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUmVzdWx0cyIgVHlwZU5hbWU9InRuczpUcmFuc2ZlclJlc3VsdCIgTGVu +Z3RoRmllbGQ9Ik5vT2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdu +b3N0aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkRpYWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVs +ZD0iTm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJEZWxldGVTdWJzY3JpcHRpb25zUmVxdWVzdCIgQmFz +ZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXF1ZXN0 +SGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlcXVlc3RIZWFkZXIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mU3Vic2NyaXB0aW9uSWRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iU3Vic2NyaXB0aW9uSWRzIiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgTGVu +Z3RoRmllbGQ9Ik5vT2ZTdWJzY3JpcHRpb25JZHMiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBl +Pg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRGVsZXRlU3Vic2NyaXB0aW9uc1Jlc3Bv +bnNlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IlJlc3BvbnNlSGVhZGVyIiBUeXBlTmFtZT0idG5zOlJlc3BvbnNlSGVhZGVyIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iTm9PZlJlc3VsdHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJSZXN1bHRzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgTGVuZ3Ro +RmllbGQ9Ik5vT2ZSZXN1bHRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkRpYWdub3N0 +aWNJbmZvcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRp +YWdub3N0aWNJbmZvcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiBMZW5ndGhGaWVsZD0i +Tm9PZkRpYWdub3N0aWNJbmZvcyIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9w +YzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJCdWlsZEluZm8iIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHJvZHVjdFVyaSIgVHlwZU5hbWU9Im9wYzpT +dHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNYW51ZmFjdHVyZXJOYW1lIiBUeXBlTmFt +ZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlByb2R1Y3ROYW1lIiBUeXBl +TmFtZT0ib3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNvZnR3YXJlVmVyc2lv +biIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCdWlsZE51 +bWJlciIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJCdWls +ZERhdGUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBl +Pg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iUmVkdW5kYW5jeVN1cHBvcnQiIExlbmd0 +aEluQml0cz0iMzIiPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ik5vbmUiIFZhbHVl +PSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkNvbGQiIFZhbHVlPSIxIiAv +Pg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ildhcm0iIFZhbHVlPSIyIiAvPg0KICAg +IDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkhvdCIgVmFsdWU9IjMiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iVHJhbnNwYXJlbnQiIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6 +RW51bWVyYXRlZFZhbHVlIE5hbWU9IkhvdEFuZE1pcnJvcmVkIiBWYWx1ZT0iNSIgLz4NCiAgPC9v +cGM6RW51bWVyYXRlZFR5cGU+DQoNCiAgPG9wYzpFbnVtZXJhdGVkVHlwZSBOYW1lPSJTZXJ2ZXJT +dGF0ZSIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +UnVubmluZyIgVmFsdWU9IjAiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRmFp +bGVkIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb0NvbmZp +Z3VyYXRpb24iIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlN1 +c3BlbmRlZCIgVmFsdWU9IjMiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU2h1 +dGRvd24iIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlRlc3Qi +IFZhbHVlPSI1IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkNvbW11bmljYXRp +b25GYXVsdCIgVmFsdWU9IjYiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVW5r +bm93biIgVmFsdWU9IjciIC8+DQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iUmVkdW5kYW50U2VydmVyRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpF +eHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVySWQiIFR5cGVOYW1l +PSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmljZUxldmVsIiBUeXBl +TmFtZT0ib3BjOkJ5dGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJTdGF0ZSIgVHlw +ZU5hbWU9InRuczpTZXJ2ZXJTdGF0ZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAg +PG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJFbmRwb2ludFVybExpc3REYXRhVHlwZSIgQmFzZVR5 +cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mRW5kcG9p +bnRVcmxMaXN0IiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +RW5kcG9pbnRVcmxMaXN0IiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgTGVuZ3RoRmllbGQ9Ik5vT2ZF +bmRwb2ludFVybExpc3QiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iTmV0d29ya0dyb3VwRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRl +bnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVyVXJpIiBUeXBlTmFtZT0i +b3BjOlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZOZXR3b3JrUGF0aHMiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOZXR3b3JrUGF0aHMi +IFR5cGVOYW1lPSJ0bnM6RW5kcG9pbnRVcmxMaXN0RGF0YVR5cGUiIExlbmd0aEZpZWxkPSJOb09m +TmV0d29ya1BhdGhzIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVj +dHVyZWRUeXBlIE5hbWU9IlNhbXBsaW5nSW50ZXJ2YWxEaWFnbm9zdGljc0RhdGFUeXBlIiBCYXNl +VHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNhbXBsaW5n +SW50ZXJ2YWwiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +TW9uaXRvcmVkSXRlbUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik1heE1vbml0b3JlZEl0ZW1Db3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEaXNhYmxlZE1vbml0b3JlZEl0ZW1Db3VudCIgVHlwZU5h +bWU9Im9wYzpVSW50MzIiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iU2VydmVyRGlhZ25vc3RpY3NTdW1tYXJ5RGF0YVR5cGUiIEJhc2VU +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2VydmVyVmll +d0NvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkN1 +cnJlbnRTZXNzaW9uQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQ3VtdWxhdGVkU2Vzc2lvbkNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlY3VyaXR5UmVqZWN0ZWRTZXNzaW9uQ291bnQiIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVqZWN0ZWRTZXNzaW9u +Q291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2Vz +c2lvblRpbWVvdXRDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJTZXNzaW9uQWJvcnRDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJDdXJyZW50U3Vic2NyaXB0aW9uQ291bnQiIFR5cGVOYW1lPSJvcGM6 +VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ3VtdWxhdGVkU3Vic2NyaXB0aW9uQ291 +bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHVibGlz +aGluZ0ludGVydmFsQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iU2VjdXJpdHlSZWplY3RlZFJlcXVlc3RzQ291bnQiIFR5cGVOYW1lPSJvcGM6VUlu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUmVqZWN0ZWRSZXF1ZXN0c0NvdW50IiBUeXBl +TmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpT +dHJ1Y3R1cmVkVHlwZSBOYW1lPSJTZXJ2ZXJTdGF0dXNEYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4 +dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGFydFRpbWUiIFR5cGVOYW1l +PSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDdXJyZW50VGltZSIgVHlw +ZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0YXRlIiBUeXBl +TmFtZT0idG5zOlNlcnZlclN0YXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQnVpbGRJbmZv +IiBUeXBlTmFtZT0idG5zOkJ1aWxkSW5mbyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlNlY29u +ZHNUaWxsU2h1dGRvd24iIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iU2h1dGRvd25SZWFzb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICA8 +L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlNlc3Np +b25EaWFnbm9zdGljc0RhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlNlc3Npb25JZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlNlc3Npb25OYW1lIiBUeXBlTmFtZT0ib3BjOlN0cmluZyIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkNsaWVudERlc2NyaXB0aW9uIiBUeXBlTmFtZT0idG5zOkFw +cGxpY2F0aW9uRGVzY3JpcHRpb24iIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXJ2ZXJVcmki +IFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRW5kcG9pbnRV +cmwiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkxv +Y2FsZUlkcyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikxv +Y2FsZUlkcyIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIExlbmd0aEZpZWxkPSJOb09mTG9jYWxlSWRz +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWN0dWFsU2Vzc2lvblRpbWVvdXQiIFR5cGVOYW1l +PSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTWF4UmVzcG9uc2VNZXNzYWdl +U2l6ZSIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDbGll +bnRDb25uZWN0aW9uVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IkNsaWVudExhc3RDb250YWN0VGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkN1cnJlbnRTdWJzY3JpcHRpb25zQ291bnQiIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ3VycmVudE1vbml0b3Jl +ZEl0ZW1zQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iQ3VycmVudFB1Ymxpc2hSZXF1ZXN0c0luUXVldWUiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAv +Pg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVG90YWxSZXF1ZXN0Q291bnQiIFR5cGVOYW1lPSJ0bnM6 +U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlVuYXV0aG9y +aXplZFJlcXVlc3RDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJSZWFkQ291bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIg +Lz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikhpc3RvcnlSZWFkQ291bnQiIFR5cGVOYW1lPSJ0bnM6 +U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IldyaXRlQ291 +bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ikhpc3RvcnlVcGRhdGVDb3VudCIgVHlwZU5hbWU9InRuczpTZXJ2aWNlQ291bnRl +ckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQ2FsbENvdW50IiBUeXBlTmFtZT0i +dG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJDcmVh +dGVNb25pdG9yZWRJdGVtc0NvdW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5 +cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNb2RpZnlNb25pdG9yZWRJdGVtc0NvdW50IiBU +eXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJTZXRNb25pdG9yaW5nTW9kZUNvdW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXRUcmlnZ2VyaW5nQ291bnQiIFR5 +cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkRlbGV0ZU1vbml0b3JlZEl0ZW1zQ291bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50 +ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNyZWF0ZVN1YnNjcmlwdGlvbkNv +dW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+DQogICAgPG9wYzpG +aWVsZCBOYW1lPSJNb2RpZnlTdWJzY3JpcHRpb25Db3VudCIgVHlwZU5hbWU9InRuczpTZXJ2aWNl +Q291bnRlckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iU2V0UHVibGlzaGluZ01v +ZGVDb3VudCIgVHlwZU5hbWU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBlIiAvPg0KICAgIDxv +cGM6RmllbGQgTmFtZT0iUHVibGlzaENvdW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXB1Ymxpc2hDb3VudCIgVHlwZU5h +bWU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +VHJhbnNmZXJTdWJzY3JpcHRpb25zQ291bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJE +YXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRlbGV0ZVN1YnNjcmlwdGlvbnNDb3Vu +dCIgVHlwZU5hbWU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iQWRkTm9kZXNDb3VudCIgVHlwZU5hbWU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFU +eXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWRkUmVmZXJlbmNlc0NvdW50IiBUeXBlTmFt +ZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJE +ZWxldGVOb2Rlc0NvdW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+ +DQogICAgPG9wYzpGaWVsZCBOYW1lPSJEZWxldGVSZWZlcmVuY2VzQ291bnQiIFR5cGVOYW1lPSJ0 +bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkJyb3dz +ZUNvdW50IiBUeXBlTmFtZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJCcm93c2VOZXh0Q291bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50 +ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRyYW5zbGF0ZUJyb3dzZVBhdGhz +VG9Ob2RlSWRzQ291bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IlF1ZXJ5Rmlyc3RDb3VudCIgVHlwZU5hbWU9InRuczpTZXJ2 +aWNlQ291bnRlckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUXVlcnlOZXh0Q291 +bnQiIFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9IlJlZ2lzdGVyTm9kZXNDb3VudCIgVHlwZU5hbWU9InRuczpTZXJ2aWNlQ291bnRl +ckRhdGFUeXBlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVW5yZWdpc3Rlck5vZGVzQ291bnQi +IFR5cGVOYW1lPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgLz4NCiAgPC9vcGM6U3RydWN0 +dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJTZXNzaW9uU2VjdXJpdHlE +aWFnbm9zdGljc0RhdGFUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IlNlc3Npb25JZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9IkNsaWVudFVzZXJJZE9mU2Vzc2lvbiIgVHlwZU5hbWU9Im9wYzpTdHJp +bmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mQ2xpZW50VXNlcklkSGlzdG9yeSIgVHlw +ZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNsaWVudFVzZXJJZEhp +c3RvcnkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiBMZW5ndGhGaWVsZD0iTm9PZkNsaWVudFVzZXJJ +ZEhpc3RvcnkiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlz +bSIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJFbmNvZGlu +ZyIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUcmFuc3Bv +cnRQcm90b2NvbCIgVHlwZU5hbWU9Im9wYzpTdHJpbmciIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJTZWN1cml0eU1vZGUiIFR5cGVOYW1lPSJ0bnM6TWVzc2FnZVNlY3VyaXR5TW9kZSIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9IlNlY3VyaXR5UG9saWN5VXJpIiBUeXBlTmFtZT0ib3BjOlN0cmlu +ZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNsaWVudENlcnRpZmljYXRlIiBUeXBlTmFtZT0i +b3BjOkJ5dGVTdHJpbmciIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3Ry +dWN0dXJlZFR5cGUgTmFtZT0iU2VydmljZUNvdW50ZXJEYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4 +dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJUb3RhbENvdW50IiBUeXBlTmFt +ZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkVycm9yQ291bnQiIFR5cGVO +YW1lPSJvcGM6VUludDMyIiAvPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0 +cnVjdHVyZWRUeXBlIE5hbWU9IlN0YXR1c1Jlc3VsdCIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdGF0dXNDb2RlIiBUeXBlTmFtZT0idWE6U3Rh +dHVzQ29kZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0aWNJbmZvIiBUeXBlTmFt +ZT0idWE6RGlhZ25vc3RpY0luZm8iIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxv +cGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iU3Vic2NyaXB0aW9uRGlhZ25vc3RpY3NEYXRhVHlwZSIg +QmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTZXNz +aW9uSWQiIFR5cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJTdWJz +Y3JpcHRpb25JZCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJQcmlvcml0eSIgVHlwZU5hbWU9Im9wYzpCeXRlIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +UHVibGlzaGluZ0ludGVydmFsIiBUeXBlTmFtZT0ib3BjOkRvdWJsZSIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik1heEtlZXBBbGl2ZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAg +ICA8b3BjOkZpZWxkIE5hbWU9Ik1heExpZmV0aW1lQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMy +IiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTWF4Tm90aWZpY2F0aW9uc1BlclB1Ymxpc2giIFR5 +cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHVibGlzaGluZ0Vu +YWJsZWQiIFR5cGVOYW1lPSJvcGM6Qm9vbGVhbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1v +ZGlmeUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9 +IkVuYWJsZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9IkRpc2FibGVDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVs +ZCBOYW1lPSJSZXB1Ymxpc2hSZXF1ZXN0Q291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iUmVwdWJsaXNoTWVzc2FnZVJlcXVlc3RDb3VudCIgVHlwZU5h +bWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJSZXB1Ymxpc2hNZXNzYWdl +Q291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVHJh +bnNmZXJSZXF1ZXN0Q291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iVHJhbnNmZXJyZWRUb0FsdENsaWVudENvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQz +MiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlRyYW5zZmVycmVkVG9TYW1lQ2xpZW50Q291bnQi +IFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iUHVibGlzaFJl +cXVlc3RDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1l +PSJEYXRhQ2hhbmdlTm90aWZpY2F0aW9uc0NvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4N +CiAgICA8b3BjOkZpZWxkIE5hbWU9IkV2ZW50Tm90aWZpY2F0aW9uc0NvdW50IiBUeXBlTmFtZT0i +b3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vdGlmaWNhdGlvbnNDb3VudCIg +VHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMYXRlUHVibGlz +aFJlcXVlc3RDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJDdXJyZW50S2VlcEFsaXZlQ291bnQiIFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQ3VycmVudExpZmV0aW1lQ291bnQiIFR5cGVOYW1lPSJvcGM6VUlu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVW5hY2tub3dsZWRnZWRNZXNzYWdlQ291bnQi +IFR5cGVOYW1lPSJvcGM6VUludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzY2FyZGVk +TWVzc2FnZUNvdW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5h +bWU9Ik1vbml0b3JlZEl0ZW1Db3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJEaXNhYmxlZE1vbml0b3JlZEl0ZW1Db3VudCIgVHlwZU5hbWU9Im9wYzpV +SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJNb25pdG9yaW5nUXVldWVPdmVyZmxvd0Nv +dW50IiBUeXBlTmFtZT0ib3BjOlVJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5leHRT +ZXF1ZW5jZU51bWJlciIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJFdmVudFF1ZXVlT3ZlckZsb3dDb3VudCIgVHlwZU5hbWU9Im9wYzpVSW50MzIiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iTW9k +ZWxDaGFuZ2VTdHJ1Y3R1cmVWZXJiTWFzayIgTGVuZ3RoSW5CaXRzPSIzMiI+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iTm9kZUFkZGVkIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVu +dW1lcmF0ZWRWYWx1ZSBOYW1lPSJOb2RlRGVsZXRlZCIgVmFsdWU9IjIiIC8+DQogICAgPG9wYzpF +bnVtZXJhdGVkVmFsdWUgTmFtZT0iUmVmZXJlbmNlQWRkZWQiIFZhbHVlPSI0IiAvPg0KICAgIDxv +cGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlJlZmVyZW5jZURlbGV0ZWQiIFZhbHVlPSI4IiAvPg0K +ICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRhdGFUeXBlQ2hhbmdlZCIgVmFsdWU9IjE2 +IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5h +bWU9Ik1vZGVsQ2hhbmdlU3RydWN0dXJlRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25P +YmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQWZmZWN0ZWQiIFR5cGVOYW1lPSJ1YTpOb2Rl +SWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBZmZlY3RlZFR5cGUiIFR5cGVOYW1lPSJ1YTpO +b2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWZXJiIiBUeXBlTmFtZT0ib3BjOkJ5dGUi +IC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFt +ZT0iU2VtYW50aWNDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lv +bk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBZmZlY3RlZCIgVHlwZU5hbWU9InVhOk5v +ZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkFmZmVjdGVkVHlwZSIgVHlwZU5hbWU9InVh +Ok5vZGVJZCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVk +VHlwZSBOYW1lPSJSYW5nZSIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJMb3ciIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICAgIDxvcGM6Rmll +bGQgTmFtZT0iSGlnaCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogIDwvb3BjOlN0cnVjdHVy +ZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRVVJbmZvcm1hdGlvbiIgQmFz +ZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOYW1lc3Bh +Y2VVcmkiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVW5p +dElkIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iRGlzcGxh +eU5hbWUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iRGVzY3JpcHRpb24iIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0KICA8L29wYzpT +dHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkF4aXNTY2FsZUVu +dW1lcmF0aW9uIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO +YW1lPSJMaW5lYXIiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9 +IkxvZyIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTG4iIFZh +bHVlPSIyIiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRU +eXBlIE5hbWU9IkNvbXBsZXhOdW1iZXJUeXBlIiBCYXNlVHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0 +Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlJlYWwiIFR5cGVOYW1lPSJvcGM6RmxvYXQiIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJJbWFnaW5hcnkiIFR5cGVOYW1lPSJvcGM6RmxvYXQiIC8+DQog +IDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iRG91 +YmxlQ29tcGxleE51bWJlclR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iUmVhbCIgVHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9w +YzpGaWVsZCBOYW1lPSJJbWFnaW5hcnkiIFR5cGVOYW1lPSJvcGM6RG91YmxlIiAvPg0KICA8L29w +YzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkF4aXNJbmZv +cm1hdGlvbiIgQmFzZVR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCI+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJFbmdpbmVlcmluZ1VuaXRzIiBUeXBlTmFtZT0idG5zOkVVSW5mb3JtYXRpb24iIC8+DQog +ICAgPG9wYzpGaWVsZCBOYW1lPSJFVVJhbmdlIiBUeXBlTmFtZT0idG5zOlJhbmdlIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iVGl0bGUiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iQXhpc1NjYWxlVHlwZSIgVHlwZU5hbWU9InRuczpBeGlzU2Nh +bGVFbnVtZXJhdGlvbiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik5vT2ZBeGlzU3RlcHMiIFR5 +cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJBeGlzU3RlcHMiIFR5 +cGVOYW1lPSJvcGM6RG91YmxlIiBMZW5ndGhGaWVsZD0iTm9PZkF4aXNTdGVwcyIgLz4NCiAgPC9v +cGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJYVlR5cGUi +IEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iWCIg +VHlwZU5hbWU9Im9wYzpEb3VibGUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJWYWx1ZSIgVHlw +ZU5hbWU9Im9wYzpGbG9hdCIgLz4NCiAgPC9vcGM6U3RydWN0dXJlZFR5cGU+DQoNCiAgPG9wYzpT +dHJ1Y3R1cmVkVHlwZSBOYW1lPSJQcm9ncmFtRGlhZ25vc3RpY0RhdGFUeXBlIiBCYXNlVHlwZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNyZWF0ZVNlc3Npb25J +ZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkNyZWF0ZUNs +aWVudE5hbWUiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i +SW52b2NhdGlvbkNyZWF0aW9uVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGltZSIgLz4NCiAgICA8 +b3BjOkZpZWxkIE5hbWU9Ikxhc3RUcmFuc2l0aW9uVGltZSIgVHlwZU5hbWU9Im9wYzpEYXRlVGlt +ZSIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikxhc3RNZXRob2RDYWxsIiBUeXBlTmFtZT0ib3Bj +OlN0cmluZyIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikxhc3RNZXRob2RTZXNzaW9uSWQiIFR5 +cGVOYW1lPSJ1YTpOb2RlSWQiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJOb09mTGFzdE1ldGhv +ZElucHV0QXJndW1lbnRzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0KICAgIDxvcGM6RmllbGQg +TmFtZT0iTGFzdE1ldGhvZElucHV0QXJndW1lbnRzIiBUeXBlTmFtZT0idG5zOkFyZ3VtZW50IiBM +ZW5ndGhGaWVsZD0iTm9PZkxhc3RNZXRob2RJbnB1dEFyZ3VtZW50cyIgLz4NCiAgICA8b3BjOkZp +ZWxkIE5hbWU9Ik5vT2ZMYXN0TWV0aG9kT3V0cHV0QXJndW1lbnRzIiBUeXBlTmFtZT0ib3BjOklu +dDMyIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTGFzdE1ldGhvZE91dHB1dEFyZ3VtZW50cyIg +VHlwZU5hbWU9InRuczpBcmd1bWVudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZMYXN0TWV0aG9kT3V0cHV0 +QXJndW1lbnRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTGFzdE1ldGhvZENhbGxUaW1lIiBU +eXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTGFzdE1ldGhv +ZFJldHVyblN0YXR1cyIgVHlwZU5hbWU9InRuczpTdGF0dXNSZXN1bHQiIC8+DQogIDwvb3BjOlN0 +cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iUHJvZ3JhbURpYWdu +b3N0aWMyRGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICAgIDxvcGM6 +RmllbGQgTmFtZT0iQ3JlYXRlU2Vzc2lvbklkIiBUeXBlTmFtZT0idWE6Tm9kZUlkIiAvPg0KICAg +IDxvcGM6RmllbGQgTmFtZT0iQ3JlYXRlQ2xpZW50TmFtZSIgVHlwZU5hbWU9Im9wYzpTdHJpbmci +IC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJJbnZvY2F0aW9uQ3JlYXRpb25UaW1lIiBUeXBlTmFt +ZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTGFzdFRyYW5zaXRpb25U +aW1lIiBUeXBlTmFtZT0ib3BjOkRhdGVUaW1lIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTGFz +dE1ldGhvZENhbGwiIFR5cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFt +ZT0iTGFzdE1ldGhvZFNlc3Npb25JZCIgVHlwZU5hbWU9InVhOk5vZGVJZCIgLz4NCiAgICA8b3Bj +OkZpZWxkIE5hbWU9Ik5vT2ZMYXN0TWV0aG9kSW5wdXRBcmd1bWVudHMiIFR5cGVOYW1lPSJvcGM6 +SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMYXN0TWV0aG9kSW5wdXRBcmd1bWVudHMi +IFR5cGVOYW1lPSJ0bnM6QXJndW1lbnQiIExlbmd0aEZpZWxkPSJOb09mTGFzdE1ldGhvZElucHV0 +QXJndW1lbnRzIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZkxhc3RNZXRob2RPdXRwdXRB +cmd1bWVudHMiIFR5cGVOYW1lPSJvcGM6SW50MzIiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJM +YXN0TWV0aG9kT3V0cHV0QXJndW1lbnRzIiBUeXBlTmFtZT0idG5zOkFyZ3VtZW50IiBMZW5ndGhG +aWVsZD0iTm9PZkxhc3RNZXRob2RPdXRwdXRBcmd1bWVudHMiIC8+DQogICAgPG9wYzpGaWVsZCBO +YW1lPSJOb09mTGFzdE1ldGhvZElucHV0VmFsdWVzIiBUeXBlTmFtZT0ib3BjOkludDMyIiAvPg0K +ICAgIDxvcGM6RmllbGQgTmFtZT0iTGFzdE1ldGhvZElucHV0VmFsdWVzIiBUeXBlTmFtZT0idWE6 +VmFyaWFudCIgTGVuZ3RoRmllbGQ9Ik5vT2ZMYXN0TWV0aG9kSW5wdXRWYWx1ZXMiIC8+DQogICAg +PG9wYzpGaWVsZCBOYW1lPSJOb09mTGFzdE1ldGhvZE91dHB1dFZhbHVlcyIgVHlwZU5hbWU9Im9w +YzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ikxhc3RNZXRob2RPdXRwdXRWYWx1ZXMi +IFR5cGVOYW1lPSJ1YTpWYXJpYW50IiBMZW5ndGhGaWVsZD0iTm9PZkxhc3RNZXRob2RPdXRwdXRW +YWx1ZXMiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMYXN0TWV0aG9kQ2FsbFRpbWUiIFR5cGVO +YW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogICAgPG9wYzpGaWVsZCBOYW1lPSJMYXN0TWV0aG9kUmV0 +dXJuU3RhdHVzIiBUeXBlTmFtZT0idWE6U3RhdHVzQ29kZSIgLz4NCiAgPC9vcGM6U3RydWN0dXJl +ZFR5cGU+DQoNCiAgPG9wYzpTdHJ1Y3R1cmVkVHlwZSBOYW1lPSJBbm5vdGF0aW9uIiBCYXNlVHlw +ZT0idWE6RXh0ZW5zaW9uT2JqZWN0Ij4NCiAgICA8b3BjOkZpZWxkIE5hbWU9Ik1lc3NhZ2UiIFR5 +cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iVXNlck5hbWUiIFR5 +cGVOYW1lPSJvcGM6U3RyaW5nIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iQW5ub3RhdGlvblRp +bWUiIFR5cGVOYW1lPSJvcGM6RGF0ZVRpbWUiIC8+DQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0K +DQogIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iRXhjZXB0aW9uRGV2aWF0aW9uRm9ybWF0IiBM +ZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBYnNvbHV0 +ZVZhbHVlIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJQZXJj +ZW50T2ZWYWx1ZSIgVmFsdWU9IjEiIC8+DQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0i +UGVyY2VudE9mUmFuZ2UiIFZhbHVlPSIyIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5h +bWU9IlBlcmNlbnRPZkVVUmFuZ2UiIFZhbHVlPSIzIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh +bHVlIE5hbWU9IlVua25vd24iIFZhbHVlPSI0IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4N +Cg0KPC9vcGM6VHlwZURpY3Rpb25hcnk+ + + + + NamespaceUri + + i=68 + i=7617 + + + http://opcfoundation.org/UA/ + + + + Deprecated + + i=68 + i=7617 + + + true + + + + Union + + i=69 + i=7617 + + + Union + + + + KeyValuePair + + i=69 + i=7617 + + + KeyValuePair + + + + AdditionalParametersType + + i=69 + i=7617 + + + AdditionalParametersType + + + + EphemeralKeyType + + i=69 + i=7617 + + + EphemeralKeyType + + + + EndpointType + + i=69 + i=7617 + + + EndpointType + + + + RationalNumber + + i=69 + i=7617 + + + RationalNumber + + + + Vector + + i=69 + i=7617 + + + Vector + + + + 3DVector + + i=69 + i=7617 + + + ThreeDVector + + + + CartesianCoordinates + + i=69 + i=7617 + + + CartesianCoordinates + + + + 3DCartesianCoordinates + + i=69 + i=7617 + + + ThreeDCartesianCoordinates + + + + Orientation + + i=69 + i=7617 + + + Orientation + + + + 3DOrientation + + i=69 + i=7617 + + + ThreeDOrientation + + + + Frame + + i=69 + i=7617 + + + Frame + + + + 3DFrame + + i=69 + i=7617 + + + ThreeDFrame + + + + IdentityMappingRuleType + + i=69 + i=7617 + + + IdentityMappingRuleType + + + + CurrencyUnitType + + i=69 + i=7617 + + + CurrencyUnitType + + + + TrustListDataType + + i=69 + i=7617 + + + TrustListDataType + + + + DataTypeSchemaHeader + + i=69 + i=7617 + + + DataTypeSchemaHeader + + + + DataTypeDescription + + i=69 + i=7617 + + + DataTypeDescription + + + + StructureDescription + + i=69 + i=7617 + + + StructureDescription + + + + EnumDescription + + i=69 + i=7617 + + + EnumDescription + + + + SimpleTypeDescription + + i=69 + i=7617 + + + SimpleTypeDescription + + + + UABinaryFileDataType + + i=69 + i=7617 + + + UABinaryFileDataType + + + + DataSetMetaDataType + + i=69 + i=7617 + + + DataSetMetaDataType + + + + FieldMetaData + + i=69 + i=7617 + + + FieldMetaData + + + + ConfigurationVersionDataType + + i=69 + i=7617 + + + ConfigurationVersionDataType + + + + PublishedDataSetDataType + + i=69 + i=7617 + + + PublishedDataSetDataType + + + + PublishedDataSetSourceDataType + + i=69 + i=7617 + + + PublishedDataSetSourceDataType + + + + PublishedVariableDataType + + i=69 + i=7617 + + + PublishedVariableDataType + + + + PublishedDataItemsDataType + + i=69 + i=7617 + + + PublishedDataItemsDataType + + + + PublishedEventsDataType + + i=69 + i=7617 + + + PublishedEventsDataType + + + + DataSetWriterDataType + + i=69 + i=7617 + + + DataSetWriterDataType + + + + DataSetWriterTransportDataType + + i=69 + i=7617 + + + DataSetWriterTransportDataType + + + + DataSetWriterMessageDataType + + i=69 + i=7617 + + + DataSetWriterMessageDataType + + + + PubSubGroupDataType + + i=69 + i=7617 + + + PubSubGroupDataType + + + + WriterGroupDataType + + i=69 + i=7617 + + + WriterGroupDataType + + + + WriterGroupTransportDataType + + i=69 + i=7617 + + + WriterGroupTransportDataType + + + + WriterGroupMessageDataType + + i=69 + i=7617 + + + WriterGroupMessageDataType + + + + PubSubConnectionDataType + + i=69 + i=7617 + + + PubSubConnectionDataType + + + + ConnectionTransportDataType + + i=69 + i=7617 + + + ConnectionTransportDataType + + + + NetworkAddressDataType + + i=69 + i=7617 + + + NetworkAddressDataType + + + + NetworkAddressUrlDataType + + i=69 + i=7617 + + + NetworkAddressUrlDataType + + + + ReaderGroupDataType + + i=69 + i=7617 + + + ReaderGroupDataType + + + + ReaderGroupTransportDataType + + i=69 + i=7617 + + + ReaderGroupTransportDataType + + + + ReaderGroupMessageDataType + + i=69 + i=7617 + + + ReaderGroupMessageDataType + + + + DataSetReaderDataType + + i=69 + i=7617 + + + DataSetReaderDataType + + + + DataSetReaderTransportDataType + + i=69 + i=7617 + + + DataSetReaderTransportDataType + + + + DataSetReaderMessageDataType + + i=69 + i=7617 + + + DataSetReaderMessageDataType + + + + SubscribedDataSetDataType + + i=69 + i=7617 + + + SubscribedDataSetDataType + + + + TargetVariablesDataType + + i=69 + i=7617 + + + TargetVariablesDataType + + + + FieldTargetDataType + + i=69 + i=7617 + + + FieldTargetDataType + + + + SubscribedDataSetMirrorDataType + + i=69 + i=7617 + + + SubscribedDataSetMirrorDataType + + + + PubSubConfigurationDataType + + i=69 + i=7617 + + + PubSubConfigurationDataType + + + + UadpWriterGroupMessageDataType + + i=69 + i=7617 + + + UadpWriterGroupMessageDataType + + + + UadpDataSetWriterMessageDataType + + i=69 + i=7617 + + + UadpDataSetWriterMessageDataType + + + + UadpDataSetReaderMessageDataType + + i=69 + i=7617 + + + UadpDataSetReaderMessageDataType + + + + JsonWriterGroupMessageDataType + + i=69 + i=7617 + + + JsonWriterGroupMessageDataType + + + + JsonDataSetWriterMessageDataType + + i=69 + i=7617 + + + JsonDataSetWriterMessageDataType + + + + JsonDataSetReaderMessageDataType + + i=69 + i=7617 + + + JsonDataSetReaderMessageDataType + + + + DatagramConnectionTransportDataType + + i=69 + i=7617 + + + DatagramConnectionTransportDataType + + + + DatagramWriterGroupTransportDataType + + i=69 + i=7617 + + + DatagramWriterGroupTransportDataType + + + + BrokerConnectionTransportDataType + + i=69 + i=7617 + + + BrokerConnectionTransportDataType + + + + BrokerWriterGroupTransportDataType + + i=69 + i=7617 + + + BrokerWriterGroupTransportDataType + + + + BrokerDataSetWriterTransportDataType + + i=69 + i=7617 + + + BrokerDataSetWriterTransportDataType + + + + BrokerDataSetReaderTransportDataType + + i=69 + i=7617 + + + BrokerDataSetReaderTransportDataType + + + + AliasNameDataType + + i=69 + i=7617 + + + AliasNameDataType + + + + UnsignedRationalNumber + + i=69 + i=7617 + + + UnsignedRationalNumber + + + + RolePermissionType + + i=69 + i=7617 + + + RolePermissionType + + + + DataTypeDefinition + + i=69 + i=7617 + + + DataTypeDefinition + + + + StructureField + + i=69 + i=7617 + + + StructureField + + + + StructureDefinition + + i=69 + i=7617 + + + StructureDefinition + + + + EnumDefinition + + i=69 + i=7617 + + + EnumDefinition + + + + Argument + + i=69 + i=7617 + + + Argument + + + + EnumValueType + + i=69 + i=7617 + + + EnumValueType + + + + EnumField + + i=69 + i=7617 + + + EnumField + + + + OptionSet + + i=69 + i=7617 + + + OptionSet + + + + TimeZoneDataType + + i=69 + i=7617 + + + TimeZoneDataType + + + + ApplicationDescription + + i=69 + i=7617 + + + ApplicationDescription + + + + ServerOnNetwork + + i=69 + i=7617 + + + ServerOnNetwork + + + + UserTokenPolicy + + i=69 + i=7617 + + + UserTokenPolicy + + + + EndpointDescription + + i=69 + i=7617 + + + EndpointDescription + + + + RegisteredServer + + i=69 + i=7617 + + + RegisteredServer + + + + DiscoveryConfiguration + + i=69 + i=7617 + + + DiscoveryConfiguration + + + + MdnsDiscoveryConfiguration + + i=69 + i=7617 + + + MdnsDiscoveryConfiguration + + + + SignedSoftwareCertificate + + i=69 + i=7617 + + + SignedSoftwareCertificate + + + + UserIdentityToken + + i=69 + i=7617 + + + UserIdentityToken + + + + AnonymousIdentityToken + + i=69 + i=7617 + + + AnonymousIdentityToken + + + + UserNameIdentityToken + + i=69 + i=7617 + + + UserNameIdentityToken + + + + X509IdentityToken + + i=69 + i=7617 + + + X509IdentityToken + + + + IssuedIdentityToken + + i=69 + i=7617 + + + IssuedIdentityToken + + + + AddNodesItem + + i=69 + i=7617 + + + AddNodesItem + + + + AddReferencesItem + + i=69 + i=7617 + + + AddReferencesItem + + + + DeleteNodesItem + + i=69 + i=7617 + + + DeleteNodesItem + + + + DeleteReferencesItem + + i=69 + i=7617 + + + DeleteReferencesItem + + + + RelativePathElement + + i=69 + i=7617 + + + RelativePathElement + + + + RelativePath + + i=69 + i=7617 + + + RelativePath + + + + EndpointConfiguration + + i=69 + i=7617 + + + EndpointConfiguration + + + + ContentFilterElement + + i=69 + i=7617 + + + ContentFilterElement + + + + ContentFilter + + i=69 + i=7617 + + + ContentFilter + + + + FilterOperand + + i=69 + i=7617 + + + FilterOperand + + + + ElementOperand + + i=69 + i=7617 + + + ElementOperand + + + + LiteralOperand + + i=69 + i=7617 + + + LiteralOperand + + + + AttributeOperand + + i=69 + i=7617 + + + AttributeOperand + + + + SimpleAttributeOperand + + i=69 + i=7617 + + + SimpleAttributeOperand + + + + HistoryEvent + + i=69 + i=7617 + + + HistoryEvent + + + + MonitoringFilter + + i=69 + i=7617 + + + MonitoringFilter + + + + EventFilter + + i=69 + i=7617 + + + EventFilter + + + + AggregateConfiguration + + i=69 + i=7617 + + + AggregateConfiguration + + + + HistoryEventFieldList + + i=69 + i=7617 + + + HistoryEventFieldList + + + + BuildInfo + + i=69 + i=7617 + + + BuildInfo + + + + RedundantServerDataType + + i=69 + i=7617 + + + RedundantServerDataType + + + + EndpointUrlListDataType + + i=69 + i=7617 + + + EndpointUrlListDataType + + + + NetworkGroupDataType + + i=69 + i=7617 + + + NetworkGroupDataType + + + + SamplingIntervalDiagnosticsDataType + + i=69 + i=7617 + + + SamplingIntervalDiagnosticsDataType + + + + ServerDiagnosticsSummaryDataType + + i=69 + i=7617 + + + ServerDiagnosticsSummaryDataType + + + + ServerStatusDataType + + i=69 + i=7617 + + + ServerStatusDataType + + + + SessionDiagnosticsDataType + + i=69 + i=7617 + + + SessionDiagnosticsDataType + + + + SessionSecurityDiagnosticsDataType + + i=69 + i=7617 + + + SessionSecurityDiagnosticsDataType + + + + ServiceCounterDataType + + i=69 + i=7617 + + + ServiceCounterDataType + + + + StatusResult + + i=69 + i=7617 + + + StatusResult + + + + SubscriptionDiagnosticsDataType + + i=69 + i=7617 + + + SubscriptionDiagnosticsDataType + + + + ModelChangeStructureDataType + + i=69 + i=7617 + + + ModelChangeStructureDataType + + + + SemanticChangeStructureDataType + + i=69 + i=7617 + + + SemanticChangeStructureDataType + + + + Range + + i=69 + i=7617 + + + Range + + + + EUInformation + + i=69 + i=7617 + + + EUInformation + + + + ComplexNumberType + + i=69 + i=7617 + + + ComplexNumberType + + + + DoubleComplexNumberType + + i=69 + i=7617 + + + DoubleComplexNumberType + + + + AxisInformation + + i=69 + i=7617 + + + AxisInformation + + + + XVType + + i=69 + i=7617 + + + XVType + + + + ProgramDiagnosticDataType + + i=69 + i=7617 + + + ProgramDiagnosticDataType + + + + ProgramDiagnostic2DataType + + i=69 + i=7617 + + + ProgramDiagnostic2DataType + + + + Annotation + + i=69 + i=7617 + + + Annotation + + + + Default XML + + i=12756 + i=12762 + i=76 + + + + Default XML + + i=14533 + i=14829 + i=76 + + + + Default XML + + i=16313 + i=17542 + i=76 + + + + Default XML + + i=17548 + i=17554 + i=76 + + + + Default XML + + i=15528 + i=16024 + i=76 + + + + Default XML + + i=18806 + i=18860 + i=76 + + + + Default XML + + i=18807 + i=18863 + i=76 + + + + Default XML + + i=18808 + i=18866 + i=76 + + + + Default XML + + i=18809 + i=18869 + i=76 + + + + Default XML + + i=18810 + i=19049 + i=76 + + + + Default XML + + i=18811 + i=19052 + i=76 + + + + Default XML + + i=18812 + i=19055 + i=76 + + + + Default XML + + i=18813 + i=19058 + i=76 + + + + Default XML + + i=18814 + i=19061 + i=76 + + + + Default XML + + i=15634 + i=15730 + i=76 + + + + Default XML + + i=23498 + i=23522 + i=76 + + + + Default XML + + i=12554 + i=12677 + i=76 + + + + Default XML + + i=17861 + i=76 + + + + Default XML + + i=15534 + i=16027 + i=76 + + + + Default XML + + i=14525 + i=14811 + i=76 + + + + Default XML + + i=15487 + i=15591 + i=76 + + + + Default XML + + i=15488 + i=15594 + i=76 + + + + Default XML + + i=15005 + i=15585 + i=76 + + + + Default XML + + i=15006 + i=15588 + i=76 + + + + Default XML + + i=14523 + i=14805 + i=76 + + + + Default XML + + i=14524 + i=14808 + i=76 + + + + Default XML + + i=14593 + i=14832 + i=76 + + + + Default XML + + i=15578 + i=16030 + i=76 + + + + Default XML + + i=15580 + i=16033 + i=76 + + + + Default XML + + i=14273 + i=14320 + i=76 + + + + Default XML + + i=15581 + i=16037 + i=76 + + + + Default XML + + i=15582 + i=16040 + i=76 + + + + Default XML + + i=15597 + i=16047 + i=76 + + + + Default XML + + i=15598 + i=16050 + i=76 + + + + Default XML + + i=15605 + i=16053 + i=76 + + + + Default XML + + i=15609 + i=16056 + i=76 + + + + Default XML + + i=15480 + i=21180 + i=76 + + + + Default XML + + i=15611 + i=16062 + i=76 + + + + Default XML + + i=15616 + i=16065 + i=76 + + + + Default XML + + i=15617 + i=16068 + i=76 + + + + Default XML + + i=15618 + i=16071 + i=76 + + + + Default XML + + i=15502 + i=21183 + i=76 + + + + Default XML + + i=15510 + i=21186 + i=76 + + + + Default XML + + i=15520 + i=21189 + i=76 + + + + Default XML + + i=15621 + i=16077 + i=76 + + + + Default XML + + i=15622 + i=16080 + i=76 + + + + Default XML + + i=15623 + i=16083 + i=76 + + + + Default XML + + i=15628 + i=16086 + i=76 + + + + Default XML + + i=15629 + i=16089 + i=76 + + + + Default XML + + i=15630 + i=16092 + i=76 + + + + Default XML + + i=15631 + i=16095 + i=76 + + + + Default XML + + i=14744 + i=14835 + i=76 + + + + Default XML + + i=15635 + i=16098 + i=76 + + + + Default XML + + i=15530 + i=21192 + i=76 + + + + Default XML + + i=15645 + i=16104 + i=76 + + + + Default XML + + i=15652 + i=16107 + i=76 + + + + Default XML + + i=15653 + i=16110 + i=76 + + + + Default XML + + i=15657 + i=16113 + i=76 + + + + Default XML + + i=15664 + i=16116 + i=76 + + + + Default XML + + i=15665 + i=16119 + i=76 + + + + Default XML + + i=17467 + i=17473 + i=76 + + + + Default XML + + i=15532 + i=21195 + i=76 + + + + Default XML + + i=15007 + i=15640 + i=76 + + + + Default XML + + i=15667 + i=16125 + i=76 + + + + Default XML + + i=15669 + i=16144 + i=76 + + + + Default XML + + i=15670 + i=16147 + i=76 + + + + Default XML + + i=23468 + i=23508 + i=76 + + + + Default XML + + i=24107 + i=24129 + i=76 + + + + Default XML + + i=96 + i=16127 + i=76 + + + + Default XML + + i=97 + i=18166 + i=76 + + + + Default XML + + i=101 + i=18169 + i=76 + + + + Default XML + + i=99 + i=18172 + i=76 + + + + Default XML + + i=100 + i=18175 + i=76 + + + + Default XML + + i=258 + i=76 + + + + Default XML + + i=11879 + i=76 + + + + Default XML + + i=11880 + i=76 + + + + Default XML + + i=261 + i=76 + + + + Default XML + + i=264 + i=76 + + + + Default XML + + i=267 + i=76 + + + + Default XML + + i=270 + i=76 + + + + Default XML + + i=273 + i=76 + + + + Default XML + + i=276 + i=76 + + + + Default XML + + i=279 + i=76 + + + + Default XML + + i=282 + i=76 + + + + Default XML + + i=285 + i=76 + + + + Default XML + + i=296 + i=8285 + i=76 + + + + Default XML + + i=7594 + i=8291 + i=76 + + + + Default XML + + i=102 + i=14826 + i=76 + + + + Default XML + + i=12755 + i=12759 + i=76 + + + + Default XML + + i=8912 + i=8918 + i=76 + + + + Default XML + + i=308 + i=8300 + i=76 + + + + Default XML + + i=389 + i=76 + + + + Default XML + + i=392 + i=76 + + + + Default XML + + i=395 + i=76 + + + + Default XML + + i=15901 + i=76 + + + + Default XML + + i=20999 + i=76 + + + + Default XML + + i=420 + i=76 + + + + Default XML + + i=423 + i=76 + + + + Default XML + + i=12189 + i=12201 + i=76 + + + + Default XML + + i=12190 + i=76 + + + + Default XML + + i=12191 + i=76 + + + + Default XML + + i=304 + i=8297 + i=76 + + + + Default XML + + i=312 + i=8303 + i=76 + + + + Default XML + + i=426 + i=76 + + + + Default XML + + i=429 + i=76 + + + + Default XML + + i=432 + i=8417 + i=76 + + + + Default XML + + i=435 + i=76 + + + + Default XML + + i=438 + i=76 + + + + Default XML + + i=12890 + i=12894 + i=76 + + + + Default XML + + i=12891 + i=12897 + i=76 + + + + Default XML + + i=12193 + i=76 + + + + Default XML + + i=12194 + i=76 + + + + Default XML + + i=441 + i=76 + + + + Default XML + + i=444 + i=76 + + + + Default XML + + i=447 + i=76 + + + + Default XML + + i=450 + i=76 + + + + Default XML + + i=453 + i=76 + + + + Default XML + + i=344 + i=8333 + i=76 + + + + Default XML + + i=456 + i=76 + + + + Default XML + + i=459 + i=76 + + + + Default XML + + i=462 + i=76 + + + + Default XML + + i=316 + i=8306 + i=76 + + + + Default XML + + i=319 + i=8309 + i=76 + + + + Default XML + + i=322 + i=8312 + i=76 + + + + Default XML + + i=325 + i=8315 + i=76 + + + + Default XML + + i=938 + i=8318 + i=76 + + + + Default XML + + i=465 + i=76 + + + + Default XML + + i=468 + i=76 + + + + Default XML + + i=471 + i=76 + + + + Default XML + + i=474 + i=76 + + + + Default XML + + i=477 + i=76 + + + + Default XML + + i=480 + i=76 + + + + Default XML + + i=349 + i=76 + + + + Default XML + + i=352 + i=76 + + + + Default XML + + i=355 + i=76 + + + + Default XML + + i=358 + i=76 + + + + Default XML + + i=361 + i=76 + + + + Default XML + + i=364 + i=76 + + + + Default XML + + i=367 + i=76 + + + + Default XML + + i=370 + i=76 + + + + Default XML + + i=373 + i=76 + + + + Default XML + + i=17606 + i=76 + + + + Default XML + + i=17607 + i=76 + + + + Default XML + + i=376 + i=8363 + i=76 + + + + Default XML + + i=483 + i=76 + + + + Default XML + + i=486 + i=76 + + + + Default XML + + i=489 + i=76 + + + + Default XML + + i=379 + i=8366 + i=76 + + + + Default XML + + i=492 + i=76 + + + + Default XML + + i=495 + i=76 + + + + Default XML + + i=382 + i=8369 + i=76 + + + + Default XML + + i=498 + i=76 + + + + Default XML + + i=501 + i=76 + + + + Default XML + + i=385 + i=8372 + i=76 + + + + Default XML + + i=504 + i=76 + + + + Default XML + + i=507 + i=76 + + + + Default XML + + i=511 + i=76 + + + + Default XML + + i=514 + i=76 + + + + Default XML + + i=518 + i=76 + + + + Default XML + + i=522 + i=76 + + + + Default XML + + i=525 + i=76 + + + + Default XML + + i=528 + i=76 + + + + Default XML + + i=531 + i=76 + + + + Default XML + + i=534 + i=76 + + + + Default XML + + i=537 + i=12712 + i=76 + + + + Default XML + + i=540 + i=12715 + i=76 + + + + Default XML + + i=543 + i=76 + + + + Default XML + + i=546 + i=76 + + + + Default XML + + i=549 + i=76 + + + + Default XML + + i=552 + i=76 + + + + Default XML + + i=555 + i=76 + + + + Default XML + + i=558 + i=76 + + + + Default XML + + i=561 + i=76 + + + + Default XML + + i=564 + i=76 + + + + Default XML + + i=567 + i=76 + + + + Default XML + + i=331 + i=8321 + i=76 + + + + Default XML + + i=570 + i=76 + + + + Default XML + + i=573 + i=76 + + + + Default XML + + i=577 + i=76 + + + + Default XML + + i=580 + i=76 + + + + Default XML + + i=583 + i=8564 + i=76 + + + + Default XML + + i=586 + i=8567 + i=76 + + + + Default XML + + i=589 + i=8570 + i=76 + + + + Default XML + + i=592 + i=8573 + i=76 + + + + Default XML + + i=595 + i=8576 + i=76 + + + + Default XML + + i=598 + i=8579 + i=76 + + + + Default XML + + i=601 + i=8582 + i=76 + + + + Default XML + + i=604 + i=76 + + + + Default XML + + i=607 + i=76 + + + + Default XML + + i=610 + i=76 + + + + Default XML + + i=613 + i=76 + + + + Default XML + + i=616 + i=76 + + + + Default XML + + i=619 + i=76 + + + + Default XML + + i=622 + i=76 + + + + Default XML + + i=626 + i=76 + + + + Default XML + + i=629 + i=76 + + + + Default XML + + i=632 + i=76 + + + + Default XML + + i=635 + i=76 + + + + Default XML + + i=638 + i=76 + + + + Default XML + + i=641 + i=76 + + + + Default XML + + i=644 + i=76 + + + + Default XML + + i=647 + i=76 + + + + Default XML + + i=650 + i=76 + + + + Default XML + + i=653 + i=76 + + + + Default XML + + i=23497 + i=76 + + + + Default XML + + i=656 + i=76 + + + + Default XML + + i=11216 + i=76 + + + + Default XML + + i=11217 + i=76 + + + + Default XML + + i=659 + i=8639 + i=76 + + + + Default XML + + i=662 + i=76 + + + + Default XML + + i=665 + i=76 + + + + Default XML + + i=668 + i=76 + + + + Default XML + + i=671 + i=76 + + + + Default XML + + i=674 + i=76 + + + + Default XML + + i=677 + i=76 + + + + Default XML + + i=680 + i=76 + + + + Default XML + + i=11295 + i=76 + + + + Default XML + + i=683 + i=76 + + + + Default XML + + i=686 + i=76 + + + + Default XML + + i=689 + i=76 + + + + Default XML + + i=692 + i=76 + + + + Default XML + + i=695 + i=76 + + + + Default XML + + i=698 + i=76 + + + + Default XML + + i=701 + i=76 + + + + Default XML + + i=704 + i=76 + + + + Default XML + + i=707 + i=76 + + + + Default XML + + i=710 + i=76 + + + + Default XML + + i=713 + i=76 + + + + Default XML + + i=719 + i=8702 + i=76 + + + + Default XML + + i=722 + i=76 + + + + Default XML + + i=725 + i=8708 + i=76 + + + + Default XML + + i=948 + i=8711 + i=76 + + + + Default XML + + i=728 + i=76 + + + + Default XML + + i=731 + i=76 + + + + Default XML + + i=734 + i=76 + + + + Default XML + + i=737 + i=76 + + + + Default XML + + i=740 + i=76 + + + + Default XML + + i=743 + i=76 + + + + Default XML + + i=746 + i=76 + + + + Default XML + + i=749 + i=76 + + + + Default XML + + i=752 + i=76 + + + + Default XML + + i=755 + i=76 + + + + Default XML + + i=758 + i=76 + + + + Default XML + + i=761 + i=76 + + + + Default XML + + i=764 + i=76 + + + + Default XML + + i=767 + i=76 + + + + Default XML + + i=770 + i=76 + + + + Default XML + + i=773 + i=76 + + + + Default XML + + i=776 + i=76 + + + + Default XML + + i=779 + i=76 + + + + Default XML + + i=782 + i=76 + + + + Default XML + + i=785 + i=76 + + + + Default XML + + i=788 + i=76 + + + + Default XML + + i=791 + i=76 + + + + Default XML + + i=794 + i=76 + + + + Default XML + + i=797 + i=76 + + + + Default XML + + i=800 + i=76 + + + + Default XML + + i=803 + i=76 + + + + Default XML + + i=945 + i=76 + + + + Default XML + + i=809 + i=76 + + + + Default XML + + i=806 + i=76 + + + + Default XML + + i=914 + i=76 + + + + Default XML + + i=917 + i=76 + + + + Default XML + + i=920 + i=8807 + i=76 + + + + Default XML + + i=818 + i=76 + + + + Default XML + + i=821 + i=76 + + + + Default XML + + i=824 + i=76 + + + + Default XML + + i=827 + i=76 + + + + Default XML + + i=830 + i=76 + + + + Default XML + + i=833 + i=76 + + + + Default XML + + i=836 + i=76 + + + + Default XML + + i=839 + i=76 + + + + Default XML + + i=842 + i=76 + + + + Default XML + + i=845 + i=76 + + + + Default XML + + i=848 + i=76 + + + + Default XML + + i=338 + i=8327 + i=76 + + + + Default XML + + i=853 + i=8843 + i=76 + + + + Default XML + + i=11943 + i=11951 + i=76 + + + + Default XML + + i=11944 + i=11954 + i=76 + + + + Default XML + + i=856 + i=8846 + i=76 + + + + Default XML + + i=859 + i=8849 + i=76 + + + + Default XML + + i=862 + i=8852 + i=76 + + + + Default XML + + i=865 + i=8855 + i=76 + + + + Default XML + + i=868 + i=8858 + i=76 + + + + Default XML + + i=871 + i=8861 + i=76 + + + + Default XML + + i=299 + i=8294 + i=76 + + + + Default XML + + i=874 + i=8864 + i=76 + + + + Default XML + + i=877 + i=8867 + i=76 + + + + Default XML + + i=897 + i=8870 + i=76 + + + + Default XML + + i=884 + i=8873 + i=76 + + + + Default XML + + i=887 + i=8876 + i=76 + + + + Default XML + + i=12171 + i=12175 + i=76 + + + + Default XML + + i=12172 + i=12178 + i=76 + + + + Default XML + + i=12079 + i=12083 + i=76 + + + + Default XML + + i=12080 + i=12086 + i=76 + + + + Default XML + + i=894 + i=8882 + i=76 + + + + Default XML + + i=24033 + i=24039 + i=76 + + + + Default XML + + i=891 + i=8879 + i=76 + + + + Opc.Ua + + i=8254 + i=15039 + i=12762 + i=14829 + i=17542 + i=17554 + i=16024 + i=18860 + i=18863 + i=18866 + i=18869 + i=19049 + i=19052 + i=19055 + i=19058 + i=19061 + i=15730 + i=23522 + i=12677 + i=16027 + i=14811 + i=15591 + i=15594 + i=15585 + i=15588 + i=14805 + i=14808 + i=14832 + i=16030 + i=16033 + i=14320 + i=16037 + i=16040 + i=16047 + i=16050 + i=16053 + i=16056 + i=21180 + i=16062 + i=16065 + i=16068 + i=16071 + i=21183 + i=21186 + i=21189 + i=16077 + i=16080 + i=16083 + i=16086 + i=16089 + i=16092 + i=16095 + i=14835 + i=16098 + i=21192 + i=16104 + i=16107 + i=16110 + i=16113 + i=16116 + i=16119 + i=17473 + i=21195 + i=15640 + i=16125 + i=16144 + i=16147 + i=23508 + i=24129 + i=16127 + i=18166 + i=18169 + i=18172 + i=18175 + i=8285 + i=8291 + i=14826 + i=12759 + i=8918 + i=8300 + i=12201 + i=8297 + i=8303 + i=8417 + i=12894 + i=12897 + i=8333 + i=8306 + i=8309 + i=8312 + i=8315 + i=8318 + i=8363 + i=8366 + i=8369 + i=8372 + i=12712 + i=12715 + i=8321 + i=8564 + i=8567 + i=8570 + i=8573 + i=8576 + i=8579 + i=8582 + i=8639 + i=8702 + i=8708 + i=8711 + i=8807 + i=8327 + i=8843 + i=11951 + i=11954 + i=8846 + i=8849 + i=8852 + i=8855 + i=8858 + i=8861 + i=8294 + i=8864 + i=8867 + i=8870 + i=8873 + i=8876 + i=12175 + i=12178 + i=12083 + i=12086 + i=8882 + i=24039 + i=8879 + i=92 + i=72 + + + PHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi +DQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54 +c2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLzIwMDgvMDIvVHlw +ZXMueHNkIg0KICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS8y +MDA4LzAyL1R5cGVzLnhzZCINCiAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQo+DQog +IDx4czplbGVtZW50IG5hbWU9IkJvb2xlYW4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpib29s +ZWFuIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZCb29sZWFuIj4NCiAgICA8 +eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCb29sZWFuIiB0eXBlPSJ4czpi +b29sZWFuIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RP +ZkJvb2xlYW4iIHR5cGU9InRuczpMaXN0T2ZCb29sZWFuIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czplbGVtZW50IG5hbWU9IlNCeXRlIiBuaWxsYWJsZT0idHJ1ZSIgdHlw +ZT0ieHM6Ynl0ZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU0J5dGUiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNCeXRlIiB0eXBlPSJ4 +czpieXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RP +ZlNCeXRlIiB0eXBlPSJ0bnM6TGlzdE9mU0J5dGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l +bnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9Inhz +OnVuc2lnbmVkQnl0ZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQnl0ZSI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnl0ZSIgdHlwZT0i +eHM6dW5zaWduZWRCeXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ikxpc3RPZkJ5dGUiIHR5cGU9InRuczpMaXN0T2ZCeXRlIiBuaWxsYWJsZT0idHJ1ZSI+PC94 +czplbGVtZW50Pg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludDE2IiBuaWxsYWJsZT0idHJ1ZSIg +dHlwZT0ieHM6c2hvcnQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkludDE2 +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQxNiIgdHlw +ZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +TGlzdE9mSW50MTYiIHR5cGU9InRuczpMaXN0T2ZJbnQxNiIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50MTYiIG5pbGxhYmxlPSJ0cnVlIiB0 +eXBlPSJ4czp1bnNpZ25lZFNob3J0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0 +T2ZVSW50MTYiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVJ +bnQxNiIgdHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZVSW50MTYiIHR5cGU9InRuczpMaXN0T2ZVSW50MTYiIG5p +bGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW50MzIi +IG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZkludDMyIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJJbnQzMiIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9Ikxpc3RPZkludDMyIiB0eXBlPSJ0bnM6TGlzdE9mSW50MzIiIG5pbGxhYmxl +PSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDMyIiBuaWxs +YWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZlVJbnQzMiI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iVUludDMyIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiBtYXhP +Y2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZVSW50MzIiIHR5cGU9InRuczpMaXN0T2ZV +SW50MzIiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iSW50NjQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpsb25nIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJMaXN0T2ZJbnQ2NCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iSW50NjQiIHR5cGU9InhzOmxvbmciIG1pbk9jY3Vycz0iMCIgbWF4T2Nj +dXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSW50NjQiIHR5cGU9InRuczpMaXN0T2ZJbnQ2 +NCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJV +SW50NjQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czp1bnNpZ25lZExvbmciIC8+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlVJbnQ2NCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDY0IiB0eXBlPSJ4czp1bnNpZ25lZExvbmciIG1pbk9j +Y3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVUludDY0IiB0eXBl +PSJ0bnM6TGlzdE9mVUludDY0IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4 +czplbGVtZW50IG5hbWU9IkZsb2F0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkZsb2F0Ij4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGbG9hdCIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9j +Y3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRmxvYXQiIHR5cGU9 +InRuczpMaXN0T2ZGbG9hdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJEb3VibGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRvdWJsZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRG91YmxlIiB0eXBlPSJ4czpkb3VibGUiIG1p +bk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRG91YmxlIiB0 +eXBlPSJ0bnM6TGlzdE9mRG91YmxlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQog +IDx4czplbGVtZW50IG5hbWU9IlN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmlu +ZyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RyaW5nIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJpbmciIHR5cGU9InhzOnN0cmlu +ZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdHJp +bmciIHR5cGU9InRuczpMaXN0T2ZTdHJpbmciIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+ +DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0ZVRpbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4 +czpkYXRlVGltZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0ZVRpbWUi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lIiB0 +eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJMaXN0T2ZEYXRlVGltZSIgdHlwZT0idG5zOkxpc3RPZkRhdGVUaW1lIiBuaWxsYWJsZT0i +dHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJHdWlkIj4NCiAg +ICA8eHM6YW5ub3RhdGlvbj4NCiAgICAgIDx4czphcHBpbmZvPg0KICAgICAgICA8SXNWYWx1ZVR5 +cGUgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0 +aW9uLyI+dHJ1ZTwvSXNWYWx1ZVR5cGU+DQogICAgICA8L3hzOmFwcGluZm8+DQogICAgPC94czph +bm5vdGF0aW9uPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0 +cmluZyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iR3VpZCIgdHlwZT0idG5zOkd1aWQiIG5pbGxhYmxlPSJ0cnVlIj48 +L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkd1aWQiPg0KICAg +IDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikd1aWQiIHR5cGU9InRuczpH +dWlkIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkd1 +aWQiIHR5cGU9InRuczpMaXN0T2ZHdWlkIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K +DQogIDx4czplbGVtZW50IG5hbWU9IkJ5dGVTdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4 +czpiYXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkJ5dGVT +dHJpbmciPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ5dGVT +dHJpbmciIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQnl0ZVN0cmluZyIgdHlwZT0i +dG5zOkxpc3RPZkJ5dGVTdHJpbmciIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlhtbEVsZW1lbnQiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlhtbEVsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4 +T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIj4NCiAgICAgICAgPHhzOmNvbXBsZXhU +eXBlPg0KICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICAgIDx4czphbnkgbWluT2Nj +dXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPg0KICAgICAgICAgIDwveHM6c2VxdWVuY2U+ +DQogICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICA8L3hzOmVsZW1lbnQ+DQogICAgPC94 +czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlz +dE9mWG1sRWxlbWVudCIgdHlwZT0idG5zOkxpc3RPZlhtbEVsZW1lbnQiIG5pbGxhYmxlPSJ0cnVl +Ij48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5vZGVJZCI+DQogICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpZmllciIgdHlwZT0i +eHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTm9kZUlkIiB0eXBlPSJ0bnM6Tm9kZUlkIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVt +ZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZOb2RlSWQiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJZCIgdHlwZT0idG5zOk5vZGVJ +ZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mTm9kZUlkIiB0eXBlPSJ0bnM6TGlzdE9mTm9kZUlkIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFeHBhbmRlZE5vZGVJ +ZCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpZmll +ciIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWQiIHR5cGU9InRuczpFeHBhbmRlZE5vZGVJZCIg +bmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +TGlzdE9mRXhwYW5kZWROb2RlSWQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkV4cGFuZGVkTm9kZUlkIiB0eXBlPSJ0bnM6RXhwYW5kZWROb2RlSWQiIG1pbk9j +Y3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwv +eHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxp +c3RPZkV4cGFuZGVkTm9kZUlkIiB0eXBlPSJ0bnM6TGlzdE9mRXhwYW5kZWROb2RlSWQiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlN0YXR1 +c0NvZGUiPg0KICAgIDx4czphbm5vdGF0aW9uPg0KICAgICAgPHhzOmFwcGluZm8+DQogICAgICAg +IDxJc1ZhbHVlVHlwZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEw +L1NlcmlhbGl6YXRpb24vIj50cnVlPC9Jc1ZhbHVlVHlwZT4NCiAgICAgIDwveHM6YXBwaW5mbz4N +CiAgICA8L3hzOmFubm90YXRpb24+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iQ29kZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJTdGF0dXNDb2RlIiB0eXBlPSJ0bnM6U3RhdHVzQ29kZSIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RhdHVzQ29kZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZSIgdHlw +ZT0idG5zOlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mU3RhdHVzQ29kZSIgdHlwZT0idG5zOkxpc3RPZlN0YXR1c0NvZGUiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRpYWdu +b3N0aWNJbmZvIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJT +eW1ib2xpY0lkIiB0eXBlPSJ4czppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ik5hbWVzcGFjZVVyaSIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGUiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxpemVkVGV4dCIgdHlwZT0ieHM6aW50 +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsSW5m +byIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJJbm5lclN0YXR1c0NvZGUiIHR5cGU9InRuczpTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbm5lckRpYWdub3N0aWNJbmZvIiB0eXBlPSJ0 +bnM6RGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0K +ICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mbyIg +dHlwZT0idG5zOkRpYWdub3N0aWNJbmZvIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEaWFnbm9zdGljSW5mbyI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm8iIHR5cGU9 +InRuczpEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGlhZ25vc3RpY0luZm8iIHR5cGU9InRuczpM +aXN0T2ZEaWFnbm9zdGljSW5mbyIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iTG9jYWxpemVkVGV4dCI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXh0IiB0 +eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwv +eHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxv +Y2FsaXplZFRleHQiIHR5cGU9InRuczpMb2NhbGl6ZWRUZXh0IiBuaWxsYWJsZT0idHJ1ZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTG9jYWxpemVkVGV4dCI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxpemVkVGV4dCIgdHlwZT0i +dG5zOkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkxvY2FsaXplZFRleHQiIHR5cGU9InRuczpMaXN0 +T2ZMb2NhbGl6ZWRUZXh0IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJRdWFsaWZpZWROYW1lIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lc3BhY2VJbmRleCIgdHlwZT0ieHM6dW5zaWduZWRTaG9y +dCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0i +eHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlF1YWxpZmll +ZE5hbWUiIHR5cGU9InRuczpRdWFsaWZpZWROYW1lIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUXVhbGlmaWVkTmFtZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVhbGlmaWVkTmFtZSIgdHlwZT0idG5zOlF1 +YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9Ikxpc3RPZlF1YWxpZmllZE5hbWUiIHR5cGU9InRuczpMaXN0T2ZRdWFs +aWZpZWROYW1lIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDwhLS0NCiAgICBT +b21lIGVudmlyb25tZW50cyByZXF1aXJlIGEgV1NETC9YU0Qgd2hpY2ggZXhwbGljaXRseSBkZWZp +bmVzIGFsbCBwb3NzaWJsZSB0eXBlcy4NCiAgICBUaGUgVUEgV1NETC9YU0QgY2FuIGJlIG1vZGlm +aWVkIHRvIHN1cHBvcnQgdGhlc2UgZW52aXJvbm1lbnRzIGJ5IHJlcGxhY2luZyB0aGUNCiAgICBk +ZWZpbml0aW9ucyBvZiB0aGUgRXh0ZW5zaW9uT2JqZWN0Qm9keSBhbmQgVmFyaWFudFZhbHVlIGNv +bXBsZXggdHlwZXMgd2l0aCB0aGUNCiAgICBkZWZpbml0aW9ucyBpbiB0aGUgY29tbWVudHMgc2hv +d24gaGVyZS4gRGV2ZWxvcGVycyB3b3VsZCB0aGVuIGRlZmluZSBzdWJ0eXBlcw0KICAgIG9mIHRo +ZSBFeHRlbnNpb25PYmplY3RCb2R5IHR5cGUgd2hpY2ggZXhwbGljaXRseSBkZWNsYXJlIGEgY2hv +aWNlIGJldHdlZW4gYWxsIG9mIHRoZQ0KICAgIGNvbXBsZXggdHlwZXMgdXNlZCBieSB0aGUgc3lz +dGVtLiBUaGUgRXhhbXBsZUV4dGVuc2lvbk9iamVjdEJvZHkgc3VidHlwZSBpcyBwcm92aWRlcw0K +ICAgIGEgdGVtcGxhdGUgYmFzZWQgb24gYSBmZXcgY29tbW9uIFVBLWRlZmluZWQgY29tcGxleCB0 +eXBlcy4NCiAgICAtLT4NCg0KICA8IS0tDQogICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV4dGVu +c2lvbk9iamVjdEJvZHkiIC8+DQoNCiAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZUV4 +dGVuc2lvbk9iamVjdEJvZHkiPg0KICAgICAgPHhzOmNvbXBsZXhDb250ZW50Pg0KICAgICAgICA8 +eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpFeHRlbnNpb25PYmplY3RCb2R5Ij4NCiAgICAgICAgICA8 +eHM6Y2hvaWNlPg0KICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXJndW1lbnQiIHR5cGU9 +InRuczpBcmd1bWVudCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJJZGVudGl0eVRva2VuIiB0eXBlPSJ0bnM6VXNlcklk +ZW50aXR5VG9rZW4iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VyTmFtZUlkZW50aXR5VG9rZW4iIHR5cGU9InRuczpVc2Vy +TmFtZUlkZW50aXR5VG9rZW4iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +ICAgICAgPC94czpjaG9pY2U+DQogICAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgICAgPC94czpj +b21wbGV4Q29udGVudD4NCiAgICA8L3hzOmNvbXBsZXhUeXBlPg0KDQogICAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9IkV4dGVuc2lvbk9iamVjdCI+DQogICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAg +IDx4czplbGVtZW50IG5hbWU9IlR5cGVJZCIgdHlwZT0idG5zOkV4cGFuZGVkTm9kZUlkIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJC +b2R5IiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpFeHRlbnNpb25PYmplY3RCb2R5IiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgPC94czpjb21wbGV4VHlwZT4N +CiAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb25PYmplY3QiIHR5cGU9InRuczpFeHRlbnNp +b25PYmplY3QiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIC0tPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJFeHRlbnNpb25PYmplY3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlR5cGVJZCIgdHlwZT0idG5zOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJvZHkiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiPg0KICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIHByb2Nlc3ND +b250ZW50cz0ibGF4Ii8+DQogICAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgICAgPC94czpj +b21wbGV4VHlwZT4NCiAgICAgIDwveHM6ZWxlbWVudD4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8 +L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb25PYmplY3QiIHR5 +cGU9InRuczpFeHRlbnNpb25PYmplY3QiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJMaXN0T2ZFeHRlbnNpb25PYmplY3QiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkV4dGVuc2lvbk9iamVjdCIgdHlwZT0idG5zOkV4dGVu +c2lvbk9iamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTGlzdE9mRXh0ZW5zaW9uT2JqZWN0IiB0eXBlPSJ0bnM6TGlzdE9mRXh0 +ZW5zaW9uT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDwhLS0NCiAg +ICBTb21lIFdTREwvWE1MIGNvbXBpbGVycyBoYXZlIGlzc3VlcyB3aXRoIHRoZSB4czpjaG9pY2Ug +Y29uc3RydWN0LiBGb3IgdGhhdCByZWFzb24NCiAgICB0aGUgZGVmYXVsdCBkZWNsYXJhdGlvbiBv +ZiBhIFZhcmlhbnQgdXNlcyB4czphbnkgY29uc3RydWN0LiBUaGUgc2NoZW1hIGFjdXR1YWxseQ0K +ICAgIGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24gaXMgcHJvdmlkZWQgYnkgdGhlIE1hdHJp +eCBhbmQgVmFyaWFudFZhbHVlIGNvbXBsZXggdHlwZXMNCiAgICBzaG93biBpbiBjb21tZW50cyBi +ZWxvdy4gQXBwbGljYXRpb24gZGV2ZWxvcGVycyBjYW4gcmVwbGFjZSB0aGUgVmFyaWFudFZhbHVl +IGRlY2xhcmF0aW9uDQogICAgd2l0aCB0aGUgc3BlY2lmaWMgZGVjbGFyYXRpb24gaWYgdGhleSBo +YXZlIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCBjYW4gaGFuZGxlDQogICAgdGhlIHhz +OmNob2ljZSBjb25zdHJ1Y3QgaW4gYSByZWFzb25hYmxlIHdheS4NCiAgICAtLT4NCg0KICA8IS0t +DQogICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1hdHJpeCI+DQogICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpbWVuc2lvbnMiIHR5cGU9InRuczpMaXN0T2ZV +SW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlZhbHVlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIj4NCiAgICAgICAg +ICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgICAgICAgIDx4czpjaG9pY2Ug +bWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJC +b29sZWFuIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgICAg +IDx4czplbGVtZW50IG5hbWU9IlNCeXRlIiB0eXBlPSJ4czpieXRlIiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ5dGUiIHR5cGU9InhzOnVuc2lnbmVk +Qnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJ +bnQxNiIgdHlwZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iVUludDE2IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkludDMyIiB0eXBlPSJ4czpp +bnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUlu +dDMyIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJJbnQ2NCIgdHlwZT0ieHM6bG9uZyIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVSW50NjQiIHR5cGU9InhzOnVuc2ln +bmVkTG9uZyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJGbG9hdCIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRG91YmxlIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RyaW5nIiB0eXBlPSJ4czpzdHJp +bmciIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0 +ZVRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgICAg +IDx4czplbGVtZW50IG5hbWU9Ikd1aWQiIHR5cGU9InRuczpHdWlkIiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ5dGVTdHJpbmciIHR5cGU9InhzOmJh +c2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJYbWxFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIj4NCiAgICAgICAg +ICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgICAgICAgICAgICAgIDx4czphbnkgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVu +dHM9ImxheCIgLz4NCiAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICAgICAg +ICAgICAgPC94czpjb21wbGV4VHlwZT4NCiAgICAgICAgICAgICAgPC94czplbGVtZW50Pg0KICAg +ICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlIiB0eXBlPSJ0bnM6U3RhdHVz +Q29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJO +b2RlSWQiIHR5cGU9InRuczpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWQiIHR5cGU9InRuczpFeHBhbmRlZE5vZGVJ +ZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFs +aWZpZWROYW1lIiB0eXBlPSJ0bnM6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0IiB0eXBlPSJ0bnM6TG9j +YWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJFeHRlbnNpb25PYmplY3QiIHR5cGU9InRuczpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0i +dG5zOlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICAgIDwveHM6Y2hvaWNlPg0K +ICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQogICAgICAgIDwveHM6ZWxlbWVudD4NCiAgICAg +IDwveHM6c2VxdWVuY2U+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgICA8eHM6ZWxlbWVudCBu +YW1lPSJNYXRyaXgiIHR5cGU9InRuczpNYXRyaXgiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KDQogICAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZhcmlhbnRWYWx1ZSI+DQogICAgICA8eHM6Y2hvaWNlPg0K +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCb29sZWFuIiB0eXBlPSJ4czpib29sZWFuIiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9IlNCeXRlIiB0eXBlPSJ4czpi +eXRlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ5dGUiIHR5 +cGU9InhzOnVuc2lnbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJJbnQxNiIgdHlwZT0ieHM6c2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iVUludDE2IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9IkludDMyIiB0eXBlPSJ4czppbnQi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVUludDMyIiB0eXBl +PSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJJbnQ2NCIgdHlwZT0ieHM6bG9uZyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJVSW50NjQiIHR5cGU9InhzOnVuc2lnbmVkTG9uZyIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGbG9hdCIgdHlwZT0ieHM6ZmxvYXQiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRG91YmxlIiB0eXBlPSJ4 +czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Ry +aW5nIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iRGF0ZVRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikd1aWQiIHR5cGU9InRuczpHdWlkIiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ5dGVTdHJpbmciIHR5cGU9InhzOmJh +c2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJY +bWxFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIj4NCiAgICAgICAgICA8eHM6 +Y29tcGxleFR5cGU+DQogICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgICAgIDx4 +czphbnkgbWluT2NjdXJzPSIwIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCiAgICAgICAgICAg +IDwveHM6c2VxdWVuY2U+DQogICAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCiAgICAgICAgPC94 +czplbGVtZW50Pg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlIiB0eXBlPSJ0 +bnM6U3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJOb2RlSWQiIHR5cGU9InRuczpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iRXhwYW5kZWROb2RlSWQiIHR5cGU9InRuczpFeHBhbmRlZE5vZGVJZCIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWFsaWZpZWROYW1l +IiB0eXBlPSJ0bnM6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJMb2NhbGl6ZWRUZXh0IiB0eXBlPSJ0bnM6TG9jYWxpemVkVGV4dCIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeHRlbnNpb25PYmplY3Qi +IHR5cGU9InRuczpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iTGlzdE9mQm9vbGVhbiIgdHlwZT0idG5zOkxpc3RPZkJvb2xlYW4iIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mU0J5dGUiIHR5 +cGU9InRuczpMaXN0T2ZTQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJMaXN0T2ZCeXRlIiB0eXBlPSJ0bnM6TGlzdE9mQnl0ZSIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJbnQxNiIgdHlwZT0idG5zOkxpc3RP +ZkludDE2IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxpc3RP +ZlVJbnQxNiIgdHlwZT0idG5zOkxpc3RPZlVJbnQxNiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZJbnQzMiIgdHlwZT0idG5zOkxpc3RPZkludDMyIiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVJbnQzMiIg +dHlwZT0idG5zOkxpc3RPZlVJbnQzMiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZJbnQ2NCIgdHlwZT0idG5zOkxpc3RPZkludDY0IiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVJbnQ2NCIgdHlwZT0idG5z +Okxpc3RPZlVJbnQ2NCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZGbG9hdCIgdHlwZT0idG5zOkxpc3RPZkZsb2F0IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRvdWJsZSIgdHlwZT0idG5zOkxpc3RPZkRv +dWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZT +dHJpbmciIHR5cGU9InRuczpMaXN0T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0ZVRpbWUiIHR5cGU9InRuczpMaXN0T2ZEYXRlVGlt +ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZHdWlk +IiB0eXBlPSJ0bnM6TGlzdE9mR3VpZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZCeXRlU3RyaW5nIiB0eXBlPSJ0bnM6TGlzdE9mQnl0ZVN0cmluZyIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZYbWxFbGVt +ZW50IiB0eXBlPSJ0bnM6TGlzdE9mWG1sRWxlbWVudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdGF0dXNDb2RlIiB0eXBlPSJ0bnM6TGlzdE9mU3Rh +dHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZOb2RlSWQiIHR5cGU9InRuczpMaXN0T2ZOb2RlSWQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRXhwYW5kZWROb2RlSWQiIHR5cGU9InRuczpMaXN0 +T2ZFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJMaXN0T2ZRdWFsaWZpZWROYW1lIiB0eXBlPSJ0bnM6TGlzdE9mUXVhbGlmaWVkTmFtZSIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZMb2NhbGl6 +ZWRUZXh0IiB0eXBlPSJ0bnM6TGlzdE9mTG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZFeHRlbnNpb25PYmplY3QiIHR5cGU9InRu +czpMaXN0T2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iTGlzdE9mVmFyaWFudCIgdHlwZT0idG5zOkxpc3RPZlZhcmlhbnQiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF0cml4IiB0eXBlPSJ0bnM6 +TWF0cml4IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8L3hzOmNob2ljZT4NCiAgICA8L3hzOmNv +bXBsZXhUeXBlPg0KDQogICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZhcmlhbnQiPg0KICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0idG5z +OlZhcmlhbnRWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDwv +eHM6c2VxdWVuY2U+DQogICAgPC94czpjb21wbGV4VHlwZT4NCiAgICA8eHM6ZWxlbWVudCBuYW1l +PSJWYXJpYW50IiB0eXBlPSJ0bnM6VmFyaWFudCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgLS0+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZhcmlhbnQiPg0KICAgIDx4czphbm5vdGF0aW9u +Pg0KICAgICAgPHhzOmFwcGluZm8+DQogICAgICAgIDxJc1ZhbHVlVHlwZSB4bWxucz0iaHR0cDov +L3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIj50cnVlPC9Jc1Zh +bHVlVHlwZT4NCiAgICAgIDwveHM6YXBwaW5mbz4NCiAgICA8L3hzOmFubm90YXRpb24+DQogICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWUiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiPg0KICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQogICAgICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIHByb2Nlc3ND +b250ZW50cz0ibGF4IiAvPg0KICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6 +Y29tcGxleFR5cGU+DQogICAgICA8L3hzOmVsZW1lbnQ+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0idG5z +OlZhcmlhbnQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJM +aXN0T2ZWYXJpYW50Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJWYXJpYW50IiB0eXBlPSJ0bnM6VmFyaWFudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZWYXJpYW50IiB0eXBlPSJ0bnM6TGlzdE9mVmFyaWFudCIg +bmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +RGF0YVZhbHVlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJW +YWx1ZSIgdHlwZT0idG5zOlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlN0YXR1c0NvZGUiIHR5cGU9InRuczpTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTb3VyY2VUaW1lc3RhbXAiIHR5cGU9InhzOmRh +dGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTb3VyY2VQ +aWNvc2Vjb25kcyIgdHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyVGltZXN0YW1wIiB0eXBlPSJ4czpkYXRlVGltZSIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyUGljb3NlY29u +ZHMiIHR5cGU9InhzOnVuc2lnbmVkU2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhVmFs +dWUiIHR5cGU9InRuczpEYXRhVmFsdWUiIG5pbGxhYmxlPSJ0cnVlIi8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGFWYWx1ZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRGF0YVZhbHVlIiB0eXBlPSJ0bnM6RGF0YVZhbHVlIiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZEYXRhVmFsdWUiIHR5cGU9InRuczpMaXN0T2ZEYXRhVmFsdWUiIG5pbGxhYmxlPSJ0cnVlIj48 +L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW52b2tlU2VydmljZVJlcXVlc3Qi +IHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbmlsbGFibGU9InRydWUiIC8+DQogIDx4czplbGVtZW50 +IG5hbWU9Ikludm9rZVNlcnZpY2VSZXNwb25zZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJJbWFnZUJNUCIgdHlwZT0ieHM6 +YmFzZTY0QmluYXJ5IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkltYWdlR0lGIiB0eXBlPSJ4 +czpiYXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW1hZ2VKUEciIHR5cGU9 +InhzOmJhc2U2NEJpbmFyeSIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJJbWFnZVBORyIgdHlw +ZT0ieHM6YmFzZTY0QmluYXJ5IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkF1ZGlvRGF0YVR5 +cGUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +VW5pb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVbmlvbiIgdHlwZT0idG5zOlVuaW9uIiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZVbmlvbiI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVW5pb24iIHR5cGU9InRuczpVbmlvbiIgbWlu +T2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +TGlzdE9mVW5pb24iIHR5cGU9InRuczpMaXN0T2ZVbmlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCaXRGaWVsZE1hc2tEYXRhVHlwZSIgdHlw +ZT0ieHM6dW5zaWduZWRMb25nIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJLZXlWYWx1 +ZVBhaXIiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IktleSIg +dHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhbHVlIiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iS2V5VmFsdWVQYWlyIiB0eXBlPSJ0bnM6S2V5VmFsdWVQYWlyIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZLZXlWYWx1ZVBhaXIiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IktleVZhbHVlUGFpciIgdHlwZT0idG5z +OktleVZhbHVlUGFpciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mS2V5VmFsdWVQYWlyIiB0eXBlPSJ0bnM6TGlzdE9mS2V5 +VmFsdWVQYWlyIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJBZGRpdGlvbmFsUGFyYW1ldGVyc1R5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBhcmFtZXRlcnMiIHR5cGU9InRuczpMaXN0T2ZLZXlW +YWx1ZVBhaXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25h +bFBhcmFtZXRlcnNUeXBlIiB0eXBlPSJ0bnM6QWRkaXRpb25hbFBhcmFtZXRlcnNUeXBlIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFcGhlbWVyYWxLZXlUeXBlIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaWNLZXkiIHR5cGU9InhzOmJhc2U2 +NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5 +cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkVwaGVtZXJhbEtleVR5cGUiIHR5cGU9InRuczpFcGhl +bWVyYWxLZXlUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbmRwb2ludFR5cGUi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuZHBvaW50VXJs +IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJTZWN1cml0eU1vZGUiIHR5cGU9InRuczpNZXNzYWdlU2VjdXJp +dHlNb2RlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZWN1cml0 +eVBvbGljeVVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UHJvZmlsZVVyaSIgdHlwZT0i +eHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkVuZHBvaW50 +VHlwZSIgdHlwZT0idG5zOkVuZHBvaW50VHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iTGlzdE9mRW5kcG9pbnRUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJFbmRwb2ludFR5cGUiIHR5cGU9InRuczpFbmRwb2ludFR5cGUiIG1pbk9jY3Vy +cz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RP +ZkVuZHBvaW50VHlwZSIgdHlwZT0idG5zOkxpc3RPZkVuZHBvaW50VHlwZSIgbmlsbGFibGU9InRy +dWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmF0aW9uYWxOdW1i +ZXIiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik51bWVyYXRv +ciIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJEZW5vbWluYXRvciIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJSYXRpb25hbE51bWJlciIgdHlwZT0idG5zOlJhdGlvbmFsTnVtYmVyIiAvPg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSYXRpb25hbE51bWJlciI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmF0aW9uYWxOdW1iZXIiIHR5cGU9InRuczpSYXRp +b25hbE51bWJlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTGlzdE9mUmF0aW9uYWxOdW1iZXIiIHR5cGU9InRuczpMaXN0T2ZSYXRp +b25hbE51bWJlciIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iVmVjdG9yIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgPC94czpzZXF1ZW5j +ZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVmVjdG9yIiB0eXBl +PSJ0bnM6VmVjdG9yIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZWZWN0b3Ii +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZlY3RvciIgdHlw +ZT0idG5zOlZlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVmVjdG9yIiB0eXBlPSJ0bnM6TGlzdE9mVmVjdG9yIiBu +aWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJU +aHJlZURWZWN0b3IiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAg +ICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6VmVjdG9yIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlgiIHR5cGU9InhzOmRvdWJsZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlkiIHR5cGU9InhzOmRvdWJs +ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IloiIHR5cGU9 +InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAg +ICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVGhyZWVEVmVjdG9yIiB0eXBlPSJ0bnM6VGhy +ZWVEVmVjdG9yIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUaHJlZURWZWN0 +b3IiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRocmVlRFZl +Y3RvciIgdHlwZT0idG5zOlRocmVlRFZlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVGhyZWVEVmVjdG9yIiB0eXBl +PSJ0bnM6TGlzdE9mVGhyZWVEVmVjdG9yIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJDYXJ0ZXNpYW5Db29yZGluYXRlcyI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IkNhcnRlc2lhbkNvb3JkaW5hdGVzIiB0eXBlPSJ0bnM6Q2FydGVzaWFu +Q29vcmRpbmF0ZXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNhcnRlc2lh +bkNvb3JkaW5hdGVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJDYXJ0ZXNpYW5Db29yZGluYXRlcyIgdHlwZT0idG5zOkNhcnRlc2lhbkNvb3JkaW5hdGVzIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZDYXJ0ZXNpYW5Db29yZGluYXRlcyIgdHlwZT0idG5zOkxpc3RPZkNhcnRlc2lhbkNv +b3JkaW5hdGVzIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJUaHJlZURDYXJ0ZXNpYW5Db29yZGluYXRlcyI+DQogICAgPHhzOmNvbXBsZXhD +b250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpDYXJ0 +ZXNpYW5Db29yZGluYXRlcyI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJYIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJZIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJaIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9u +Pg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IlRocmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIiB0eXBlPSJ0bnM6VGhyZWVE +Q2FydGVzaWFuQ29vcmRpbmF0ZXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP +ZlRocmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJUaHJlZURDYXJ0ZXNpYW5Db29yZGluYXRlcyIgdHlwZT0idG5zOlRo +cmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUaHJlZURDYXJ0ZXNpYW5Db29yZGlu +YXRlcyIgdHlwZT0idG5zOkxpc3RPZlRocmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIiBuaWxsYWJs +ZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPcmllbnRh +dGlvbiI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ik9yaWVudGF0aW9uIiB0eXBlPSJ0bnM6T3Jp +ZW50YXRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk9yaWVudGF0aW9u +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJPcmllbnRhdGlv +biIgdHlwZT0idG5zOk9yaWVudGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZPcmllbnRhdGlvbiIgdHlwZT0idG5z +Okxpc3RPZk9yaWVudGF0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJUaHJlZURPcmllbnRhdGlvbiI+DQogICAgPHhzOmNvbXBsZXhD +b250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpPcmll +bnRhdGlvbiI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJBIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwv +eHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IlRocmVlRE9yaWVudGF0aW9uIiB0eXBlPSJ0bnM6VGhyZWVET3JpZW50YXRpb24iIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRocmVlRE9yaWVudGF0aW9uIj4NCiAgICA8 +eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUaHJlZURPcmllbnRhdGlvbiIg +dHlwZT0idG5zOlRocmVlRE9yaWVudGF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5i +b3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUaHJlZURPcmllbnRhdGlvbiIg +dHlwZT0idG5zOkxpc3RPZlRocmVlRE9yaWVudGF0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJGcmFtZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkZyYW1lIiB0eXBlPSJ0bnM6RnJhbWUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZkZyYW1lIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJGcmFtZSIgdHlwZT0idG5zOkZyYW1lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0i +dW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZGcmFtZSIgdHlwZT0idG5z +Okxpc3RPZkZyYW1lIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJUaHJlZURGcmFtZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVk +PSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpGcmFtZSI+DQogICAgICAg +IDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDYXJ0ZXNpYW5Db29y +ZGluYXRlcyIgdHlwZT0idG5zOlRocmVlRENhcnRlc2lhbkNvb3JkaW5hdGVzIiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9yaWVu +dGF0aW9uIiB0eXBlPSJ0bnM6VGhyZWVET3JpZW50YXRpb24iIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lv +bj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJUaHJlZURGcmFtZSIgdHlwZT0idG5zOlRocmVlREZyYW1lIiAvPg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUaHJlZURGcmFtZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGhyZWVERnJhbWUiIHR5cGU9InRuczpUaHJl +ZURGcmFtZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iTGlzdE9mVGhyZWVERnJhbWUiIHR5cGU9InRuczpMaXN0T2ZUaHJlZURGcmFt +ZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFt +ZT0iT3BlbkZpbGVNb2RlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZF8xIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJXcml0ZV8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJF +cmFzZUV4aXN0aW5nXzQiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFwcGVuZF84 +IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iT3BlbkZpbGVNb2RlIiB0eXBlPSJ0bnM6T3BlbkZpbGVNb2RlIiAvPg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZPcGVuRmlsZU1vZGUiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9wZW5GaWxlTW9kZSIgdHlwZT0idG5zOk9w +ZW5GaWxlTW9kZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJM +aXN0T2ZPcGVuRmlsZU1vZGUiIHR5cGU9InRuczpMaXN0T2ZPcGVuRmlsZU1vZGUiIG5pbGxhYmxl +PSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IklkZW50aXR5 +Q3JpdGVyaWFUeXBlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVXNlck5hbWVfMSIgLz4NCiAgICAgIDx4czplbnVt +ZXJhdGlvbiB2YWx1ZT0iVGh1bWJwcmludF8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZh +bHVlPSJSb2xlXzMiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ikdyb3VwSWRfNCIg +Lz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQW5vbnltb3VzXzUiIC8+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9IkF1dGhlbnRpY2F0ZWRVc2VyXzYiIC8+DQogICAgICA8eHM6 +ZW51bWVyYXRpb24gdmFsdWU9IkFwcGxpY2F0aW9uXzciIC8+DQogICAgPC94czpyZXN0cmljdGlv +bj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJJZGVudGl0eUNyaXRl +cmlhVHlwZSIgdHlwZT0idG5zOklkZW50aXR5Q3JpdGVyaWFUeXBlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJMaXN0T2ZJZGVudGl0eUNyaXRlcmlhVHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpdHlDcml0ZXJpYVR5cGUiIHR5cGU9 +InRuczpJZGVudGl0eUNyaXRlcmlhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91 +bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJMaXN0T2ZJZGVudGl0eUNyaXRlcmlhVHlwZSIgdHlwZT0idG5zOkxpc3RP +ZklkZW50aXR5Q3JpdGVyaWFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJJZGVudGl0eU1hcHBpbmdSdWxlVHlwZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3JpdGVyaWFUeXBlIiB0eXBlPSJ0 +bnM6SWRlbnRpdHlDcml0ZXJpYVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkNyaXRlcmlhIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iSWRlbnRpdHlNYXBwaW5nUnVsZVR5cGUiIHR5cGU9InRuczpJZGVu +dGl0eU1hcHBpbmdSdWxlVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9m +SWRlbnRpdHlNYXBwaW5nUnVsZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IklkZW50aXR5TWFwcGluZ1J1bGVUeXBlIiB0eXBlPSJ0bnM6SWRlbnRpdHlN +YXBwaW5nUnVsZVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZklkZW50aXR5TWFwcGluZ1J1bGVUeXBlIiB0eXBlPSJ0 +bnM6TGlzdE9mSWRlbnRpdHlNYXBwaW5nUnVsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVs +ZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkN1cnJlbmN5VW5pdFR5cGUiPg0KICAg +IDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik51bWVyaWNDb2RlIiB0eXBl +PSJ4czpzaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXhw +b25lbnQiIHR5cGU9InhzOmJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkFscGhhYmV0aWNDb2RlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDdXJyZW5jeSIgdHlwZT0i +dWE6TG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJD +dXJyZW5jeVVuaXRUeXBlIiB0eXBlPSJ0bnM6Q3VycmVuY3lVbml0VHlwZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ3VycmVuY3lVbml0VHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3VycmVuY3lVbml0VHlwZSIgdHlwZT0idG5z +OkN1cnJlbmN5VW5pdFR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkN1cnJlbmN5VW5pdFR5cGUiIHR5cGU9InRuczpM +aXN0T2ZDdXJyZW5jeVVuaXRUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQog +IDx4czpzaW1wbGVUeXBlICBuYW1lPSJUcnVzdExpc3RNYXNrcyI+DQogICAgPHhzOnJlc3RyaWN0 +aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5vbmVf +MCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVHJ1c3RlZENlcnRpZmljYXRlc18x +IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUcnVzdGVkQ3Jsc18yIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZXJDZXJ0aWZpY2F0ZXNfNCIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSXNzdWVyQ3Jsc184IiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJBbGxfMTUiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpz +aW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVzdExpc3RNYXNrcyIgdHlwZT0idG5z +OlRydXN0TGlzdE1hc2tzIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUcnVzdExpc3RE +YXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Bl +Y2lmaWVkTGlzdHMiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVzdGVkQ2VydGlmaWNhdGVzIiB0eXBlPSJ1YTpMaXN0T2ZC +eXRlU3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iVHJ1c3RlZENybHMiIHR5cGU9InVhOkxpc3RPZkJ5dGVTdHJpbmciIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJc3N1 +ZXJDZXJ0aWZpY2F0ZXMiIHR5cGU9InVhOkxpc3RPZkJ5dGVTdHJpbmciIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJc3N1ZXJDcmxzIiB0 +eXBlPSJ1YTpMaXN0T2ZCeXRlU3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IlRydXN0TGlzdERhdGFUeXBlIiB0eXBlPSJ0bnM6VHJ1c3RMaXN0RGF0YVR5cGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlRydXN0TGlzdERhdGFUeXBlIj4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUcnVzdExpc3REYXRhVHlw +ZSIgdHlwZT0idG5zOlRydXN0TGlzdERhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0i +dW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZUcnVzdExpc3REYXRhVHlw +ZSIgdHlwZT0idG5zOkxpc3RPZlRydXN0TGlzdERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94 +czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWNpbWFsRGF0YVR5cGUiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4 +czpzaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWUi +IHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJEZWNpbWFsRGF0YVR5cGUiIHR5cGU9InRuczpEZWNpbWFsRGF0YVR5cGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGFUeXBlU2NoZW1hSGVhZGVyIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lc3BhY2VzIiB0eXBlPSJ1YTpMaXN0 +T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTdHJ1Y3R1cmVEYXRhVHlwZXMiIHR5cGU9InRuczpMaXN0T2ZTdHJ1Y3R1cmVE +ZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkVudW1EYXRhVHlwZXMiIHR5cGU9InRuczpMaXN0T2ZFbnVtRGVzY3JpcHRp +b24iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJTaW1wbGVEYXRhVHlwZXMiIHR5cGU9InRuczpMaXN0T2ZTaW1wbGVUeXBlRGVzY3JpcHRp +b24iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVR5cGVTY2hlbWFI +ZWFkZXIiIHR5cGU9InRuczpEYXRhVHlwZVNjaGVtYUhlYWRlciIgLz4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iTGlzdE9mRGF0YVR5cGVTY2hlbWFIZWFkZXIiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlU2NoZW1hSGVhZGVyIiB0eXBlPSJ0 +bnM6RGF0YVR5cGVTY2hlbWFIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5k +ZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl +eFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGFUeXBlU2NoZW1hSGVhZGVyIiB0 +eXBlPSJ0bnM6TGlzdE9mRGF0YVR5cGVTY2hlbWFIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIj48L3hz +OmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGFUeXBlRGVzY3JpcHRpb24i +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlSWQi +IHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InVhOlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVR5cGVEZXNjcmlwdGlvbiIgdHlwZT0i +dG5zOkRhdGFUeXBlRGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp +c3RPZkRhdGFUeXBlRGVzY3JpcHRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkRhdGFUeXBlRGVzY3JpcHRpb24iIHR5cGU9InRuczpEYXRhVHlwZURlc2Ny +aXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZEYXRhVHlwZURlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mRGF0 +YVR5cGVEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0dXJlRGVzY3JpcHRpb24iPg0KICAgIDx4czpjb21wbGV4 +Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RGF0 +YVR5cGVEZXNjcmlwdGlvbiI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVEZWZpbml0aW9uIiB0eXBlPSJ0bnM6U3RydWN0dXJlRGVm +aW5pdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpz +ZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlN0cnVjdHVyZURlc2Ny +aXB0aW9uIiB0eXBlPSJ0bnM6U3RydWN0dXJlRGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cnVjdHVyZURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVEZXNjcmlwdGlvbiIgdHlwZT0i +dG5zOlN0cnVjdHVyZURlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVEZXNjcmlwdGlvbiIg +dHlwZT0idG5zOkxpc3RPZlN0cnVjdHVyZURlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94 +czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbnVtRGVzY3JpcHRpb24iPg0K +ICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lv +biBiYXNlPSJ0bnM6RGF0YVR5cGVEZXNjcmlwdGlvbiI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtRGVmaW5pdGlvbiIgdHlwZT0idG5zOkVu +dW1EZWZpbml0aW9uIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAg +IDx4czplbGVtZW50IG5hbWU9IkJ1aWx0SW5UeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5z +aW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IkVudW1EZXNjcmlwdGlvbiIgdHlwZT0idG5zOkVudW1EZXNjcmlwdGlv +biIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRW51bURlc2NyaXB0aW9uIj4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtRGVzY3JpcHRp +b24iIHR5cGU9InRuczpFbnVtRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1 +bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6 +Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkVudW1EZXNjcmlwdGlvbiIg +dHlwZT0idG5zOkxpc3RPZkVudW1EZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl +bWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2ltcGxlVHlwZURlc2NyaXB0aW9uIj4N +CiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNp +b24gYmFzZT0idG5zOkRhdGFUeXBlRGVzY3JpcHRpb24iPg0KICAgICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQmFzZURhdGFUeXBlIiB0eXBlPSJ1YTpOb2Rl +SWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iQnVpbHRJblR5cGUiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAg +PC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iU2ltcGxlVHlwZURlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6U2ltcGxlVHlwZURlc2NyaXB0 +aW9uIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTaW1wbGVUeXBlRGVzY3Jp +cHRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNpbXBs +ZVR5cGVEZXNjcmlwdGlvbiIgdHlwZT0idG5zOlNpbXBsZVR5cGVEZXNjcmlwdGlvbiIgbWluT2Nj +dXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94 +czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlz +dE9mU2ltcGxlVHlwZURlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mU2ltcGxlVHlwZURlc2Ny +aXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJVQUJpbmFyeUZpbGVEYXRhVHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1p +eGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEYXRhVHlwZVNjaGVt +YUhlYWRlciI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJTY2hlbWFMb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkZpbGVIZWFkZXIiIHR5 +cGU9InRuczpMaXN0T2ZLZXlWYWx1ZVBhaXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQm9keSIgdHlwZT0idWE6VmFyaWFudCIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRl +bnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iVUFCaW5hcnlGaWxlRGF0YVR5cGUiIHR5cGU9InRuczpVQUJpbmFy +eUZpbGVEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVUFCaW5h +cnlGaWxlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlVBQmluYXJ5RmlsZURhdGFUeXBlIiB0eXBlPSJ0bnM6VUFCaW5hcnlGaWxlRGF0YVR5cGUi +IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ikxpc3RPZlVBQmluYXJ5RmlsZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mVUFCaW5hcnlG +aWxlRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBs +ZVR5cGUgIG5hbWU9IlB1YlN1YlN0YXRlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6 +c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRfMCIgLz4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUGF1c2VkXzEiIC8+DQogICAgICA8eHM6ZW51bWVy +YXRpb24gdmFsdWU9Ik9wZXJhdGlvbmFsXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFs +dWU9IkVycm9yXzMiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlByZU9wZXJhdGlv +bmFsXzQiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJQdWJTdWJTdGF0ZSIgdHlwZT0idG5zOlB1YlN1YlN0YXRlIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQdWJTdWJTdGF0ZSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHViU3ViU3RhdGUiIHR5cGU9InRuczpQ +dWJTdWJTdGF0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJM +aXN0T2ZQdWJTdWJTdGF0ZSIgdHlwZT0idG5zOkxpc3RPZlB1YlN1YlN0YXRlIiBuaWxsYWJsZT0i +dHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEYXRhU2V0TWV0 +YURhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAg +IDx4czpleHRlbnNpb24gYmFzZT0idG5zOkRhdGFUeXBlU2NoZW1hSGVhZGVyIj4NCiAgICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9Inhz +OnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJG +aWVsZHMiIHR5cGU9InRuczpMaXN0T2ZGaWVsZE1ldGFEYXRhIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRDbGFzc0lk +IiB0eXBlPSJ1YTpHdWlkIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iQ29uZmlndXJhdGlvblZlcnNpb24iIHR5cGU9InRuczpDb25maWd1cmF0aW9uVmVyc2lv +bkRhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hz +OnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVu +dD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldE1ldGFE +YXRhVHlwZSIgdHlwZT0idG5zOkRhdGFTZXRNZXRhRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGFTZXRNZXRhRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRNZXRhRGF0YVR5cGUiIHR5cGU9InRu +czpEYXRhU2V0TWV0YURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEYXRhU2V0TWV0YURhdGFUeXBlIiB0eXBl +PSJ0bnM6TGlzdE9mRGF0YVNldE1ldGFEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl +bWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmllbGRNZXRhRGF0YSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHM6c3RyaW5n +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iRGVzY3JpcHRpb24iIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGaWVsZEZsYWdzIiB0eXBl +PSJ0bnM6RGF0YVNldEZpZWxkRmxhZ3MiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkJ1aWx0SW5UeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlIiB0eXBlPSJ1YTpOb2RlSWQi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJWYWx1ZVJhbmsiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iQXJyYXlEaW1lbnNpb25zIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYXhT +dHJpbmdMZW5ndGgiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0RmllbGRJZCIgdHlwZT0idWE6R3VpZCIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHJvcGVydGllcyIgdHlwZT0idG5z +Okxpc3RPZktleVZhbHVlUGFpciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJGaWVsZE1ldGFEYXRhIiB0eXBlPSJ0bnM6RmllbGRNZXRhRGF0YSIgLz4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iTGlzdE9mRmllbGRNZXRhRGF0YSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmllbGRNZXRhRGF0YSIgdHlwZT0idG5zOkZpZWxkTWV0 +YURhdGEiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9Ikxpc3RPZkZpZWxkTWV0YURhdGEiIHR5cGU9InRuczpMaXN0T2ZGaWVsZE1ldGFE +YXRhIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpzaW1wbGVUeXBlICBu +YW1lPSJEYXRhU2V0RmllbGRGbGFncyI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVu +c2lnbmVkU2hvcnQiPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldEZpZWxkRmxhZ3MiIHR5cGU9InRuczpEYXRhU2V0 +RmllbGRGbGFncyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ29uZmlndXJhdGlvblZl +cnNpb25EYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iTWFqb3JWZXJzaW9uIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWlub3JWZXJzaW9uIiB0eXBlPSJ4czp1bnNpZ25lZElu +dCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5 +cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkNvbmZpZ3VyYXRpb25WZXJzaW9uRGF0YVR5cGUiIHR5 +cGU9InRuczpDb25maWd1cmF0aW9uVmVyc2lvbkRhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJMaXN0T2ZDb25maWd1cmF0aW9uVmVyc2lvbkRhdGFUeXBlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDb25maWd1cmF0aW9uVmVyc2lvbkRh +dGFUeXBlIiB0eXBlPSJ0bnM6Q29uZmlndXJhdGlvblZlcnNpb25EYXRhVHlwZSIgbWluT2NjdXJz +PSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9m +Q29uZmlndXJhdGlvblZlcnNpb25EYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZkNvbmZpZ3VyYXRp +b25WZXJzaW9uRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IlB1Ymxpc2hlZERhdGFTZXREYXRhVHlwZSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +RGF0YVNldEZvbGRlciIgdHlwZT0idWE6TGlzdE9mU3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldE1ldGFEYXRhIiB0 +eXBlPSJ0bnM6RGF0YVNldE1ldGFEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkV4dGVuc2lvbkZpZWxkcyIgdHlwZT0idG5z +Okxpc3RPZktleVZhbHVlUGFpciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRTb3VyY2UiIHR5cGU9InVhOkV4dGVuc2lvbk9i +amVjdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoZWREYXRh +U2V0RGF0YVR5cGUiIHR5cGU9InRuczpQdWJsaXNoZWREYXRhU2V0RGF0YVR5cGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlB1Ymxpc2hlZERhdGFTZXREYXRhVHlwZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaGVkRGF0YVNl +dERhdGFUeXBlIiB0eXBlPSJ0bnM6UHVibGlzaGVkRGF0YVNldERhdGFUeXBlIiBtaW5PY2N1cnM9 +IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZQ +dWJsaXNoZWREYXRhU2V0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQdWJsaXNoZWREYXRhU2V0 +RGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9IlB1Ymxpc2hlZERhdGFTZXRTb3VyY2VEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IlB1Ymxpc2hlZERhdGFTZXRTb3VyY2VEYXRhVHlwZSIgdHlwZT0idG5zOlB1Ymxp +c2hlZERhdGFTZXRTb3VyY2VEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +TGlzdE9mUHVibGlzaGVkRGF0YVNldFNvdXJjZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoZWREYXRhU2V0U291cmNlRGF0YVR5cGUi +IHR5cGU9InRuczpQdWJsaXNoZWREYXRhU2V0U291cmNlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIg +bWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu +Y2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlB1Ymxp +c2hlZERhdGFTZXRTb3VyY2VEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlB1Ymxpc2hlZERhdGFT +ZXRTb3VyY2VEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaGVkVmFyaWFibGVEYXRhVHlwZSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaGVkVmFyaWFibGUiIHR5cGU9 +InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkF0dHJpYnV0ZUlkIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2FtcGxpbmdJbnRlcnZhbEhpbnQiIHR5 +cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +RGVhZGJhbmRUeXBlIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVhZGJhbmRWYWx1ZSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbmRleFJhbmdlIiB0eXBlPSJ4 +czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTdWJzdGl0dXRlVmFsdWUiIHR5cGU9InVhOlZhcmlhbnQiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1ldGFEYXRhUHJvcGVydGllcyIgdHlwZT0i +dWE6TGlzdE9mUXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJQdWJsaXNoZWRWYXJpYWJsZURhdGFUeXBlIiB0eXBlPSJ0bnM6UHVibGlzaGVkVmFyaWFi +bGVEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHVibGlzaGVk +VmFyaWFibGVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUHVibGlzaGVkVmFyaWFibGVEYXRhVHlwZSIgdHlwZT0idG5zOlB1Ymxpc2hlZFZhcmlh +YmxlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9Ikxpc3RPZlB1Ymxpc2hlZFZhcmlhYmxlRGF0YVR5cGUiIHR5cGU9InRu +czpMaXN0T2ZQdWJsaXNoZWRWYXJpYWJsZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQdWJsaXNoZWREYXRhSXRlbXNEYXRh +VHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6 +ZXh0ZW5zaW9uIGJhc2U9InRuczpQdWJsaXNoZWREYXRhU2V0U291cmNlRGF0YVR5cGUiPg0KICAg +ICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaGVk +RGF0YSIgdHlwZT0idG5zOkxpc3RPZlB1Ymxpc2hlZFZhcmlhYmxlRGF0YVR5cGUiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8 +L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoZWREYXRhSXRlbXNEYXRhVHlwZSIgdHlw +ZT0idG5zOlB1Ymxpc2hlZERhdGFJdGVtc0RhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJMaXN0T2ZQdWJsaXNoZWREYXRhSXRlbXNEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaGVkRGF0YUl0ZW1zRGF0YVR5cGUi +IHR5cGU9InRuczpQdWJsaXNoZWREYXRhSXRlbXNEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhP +Y2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHVibGlzaGVk +RGF0YUl0ZW1zRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQdWJsaXNoZWREYXRhSXRlbXNEYXRh +VHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUg +bmFtZT0iUHVibGlzaGVkRXZlbnRzRGF0YVR5cGUiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBt +aXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6UHVibGlzaGVkRGF0 +YVNldFNvdXJjZURhdGFUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4 +czplbGVtZW50IG5hbWU9IkV2ZW50Tm90aWZpZXIiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZWxl +Y3RlZEZpZWxkcyIgdHlwZT0idG5zOkxpc3RPZlNpbXBsZUF0dHJpYnV0ZU9wZXJhbmQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +RmlsdGVyIiB0eXBlPSJ0bnM6Q29udGVudEZpbHRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0K +ICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IlB1Ymxpc2hlZEV2ZW50c0RhdGFUeXBlIiB0eXBlPSJ0bnM6UHVibGlzaGVkRXZl +bnRzRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlB1Ymxpc2hl +ZEV2ZW50c0RhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJQdWJsaXNoZWRFdmVudHNEYXRhVHlwZSIgdHlwZT0idG5zOlB1Ymxpc2hlZEV2ZW50c0Rh +dGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZQdWJsaXNoZWRFdmVudHNEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RP +ZlB1Ymxpc2hlZEV2ZW50c0RhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K +DQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJEYXRhU2V0RmllbGRDb250ZW50TWFzayI+DQogICAg +PHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkSW50Ij4NCiAgICA8L3hzOnJlc3RyaWN0 +aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRGaWVs +ZENvbnRlbnRNYXNrIiB0eXBlPSJ0bnM6RGF0YVNldEZpZWxkQ29udGVudE1hc2siIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGFTZXRGaWVsZENvbnRlbnRNYXNrIj4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0RmllbGRDb250 +ZW50TWFzayIgdHlwZT0idG5zOkRhdGFTZXRGaWVsZENvbnRlbnRNYXNrIiBtaW5PY2N1cnM9IjAi +IG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGFTZXRGaWVsZENvbnRlbnRN +YXNrIiB0eXBlPSJ0bnM6TGlzdE9mRGF0YVNldEZpZWxkQ29udGVudE1hc2siIG5pbGxhYmxlPSJ0 +cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGFTZXRXcml0 +ZXJEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5hYmxlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldFdyaXRlcklkIiB0eXBl +PSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJEYXRhU2V0RmllbGRDb250ZW50TWFzayIgdHlwZT0idG5zOkRhdGFTZXRGaWVsZENvbnRl +bnRNYXNrIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJLZXlGcmFt +ZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iRGF0YVNldE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRXcml0 +ZXJQcm9wZXJ0aWVzIiB0eXBlPSJ0bnM6TGlzdE9mS2V5VmFsdWVQYWlyIiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0U2V0 +dGluZ3MiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VTZXR0aW5ncyIgdHlwZT0i +dWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +IkRhdGFTZXRXcml0ZXJEYXRhVHlwZSIgdHlwZT0idG5zOkRhdGFTZXRXcml0ZXJEYXRhVHlwZSIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0YVNldFdyaXRlckRhdGFUeXBl +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0V3Jp +dGVyRGF0YVR5cGUiIHR5cGU9InRuczpEYXRhU2V0V3JpdGVyRGF0YVR5cGUiIG1pbk9jY3Vycz0i +MCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRh +dGFTZXRXcml0ZXJEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZkRhdGFTZXRXcml0ZXJEYXRhVHlw +ZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iRGF0YVNldFdyaXRlclRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iRGF0YVNldFdyaXRlclRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6RGF0YVNldFdyaXRl +clRyYW5zcG9ydERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZE +YXRhU2V0V3JpdGVyVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRXcml0ZXJUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0i +dG5zOkRhdGFTZXRXcml0ZXJUcmFuc3BvcnREYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1 +cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0YVNldFdyaXRl +clRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mRGF0YVNldFdyaXRlclRyYW5zcG9y +dERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJEYXRhU2V0V3JpdGVyTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkRhdGFTZXRX +cml0ZXJNZXNzYWdlRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP +ZkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRu +czpEYXRhU2V0V3JpdGVyTWVzc2FnZURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0i +dW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEYXRhU2V0V3JpdGVyTWVz +c2FnZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlw +ZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iUHViU3ViR3JvdXBEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5hYmxlZCIgdHlwZT0ieHM6Ym9v +bGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlN +b2RlIiB0eXBlPSJ0bnM6TWVzc2FnZVNlY3VyaXR5TW9kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlHcm91cElkIiB0eXBlPSJ4czpzdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJT +ZWN1cml0eUtleVNlcnZpY2VzIiB0eXBlPSJ0bnM6TGlzdE9mRW5kcG9pbnREZXNjcmlwdGlvbiIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +Ik1heE5ldHdvcmtNZXNzYWdlU2l6ZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikdyb3VwUHJvcGVydGllcyIgdHlwZT0idG5z +Okxpc3RPZktleVZhbHVlUGFpciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJQdWJTdWJHcm91cERhdGFUeXBlIiB0eXBlPSJ0bnM6UHViU3ViR3JvdXBEYXRhVHlwZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHViU3ViR3JvdXBEYXRhVHlwZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHViU3ViR3JvdXBEYXRh +VHlwZSIgdHlwZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2Nj +dXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlB1YlN1Ykdyb3Vw +RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQdWJTdWJHcm91cERhdGFUeXBlIiBuaWxsYWJsZT0i +dHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJXcml0ZXJHcm91 +cERhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAg +IDx4czpleHRlbnNpb24gYmFzZT0idG5zOlB1YlN1Ykdyb3VwRGF0YVR5cGUiPg0KICAgICAgICA8 +eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVyR3JvdXBJZCIg +dHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlB1Ymxpc2hpbmdJbnRlcnZhbCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iS2VlcEFsaXZlVGltZSIgdHlw +ZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUHJpb3JpdHkiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvY2FsZUlkcyIgdHlwZT0idWE6TGlzdE9mU3RyaW5n +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkhlYWRlckxheW91dFVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRyYW5zcG9ydFNl +dHRpbmdzIiB0eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWVzc2FnZVNldHRpbmdzIiB0 +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldFdyaXRlcnMiIHR5cGU9InRuczpM +aXN0T2ZEYXRhU2V0V3JpdGVyRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8 +L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJXcml0ZXJHcm91cERhdGFUeXBlIiB0eXBlPSJ0bnM6V3JpdGVyR3JvdXBEYXRhVHlwZSIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mV3JpdGVyR3JvdXBEYXRhVHlwZSI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVyR3JvdXBE +YXRhVHlwZSIgdHlwZT0idG5zOldyaXRlckdyb3VwRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4 +T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZldyaXRlckdy +b3VwRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZXcml0ZXJHcm91cERhdGFUeXBlIiBuaWxsYWJs +ZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJXcml0ZXJH +cm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVyR3Jv +dXBUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5zOldyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5 +cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZldyaXRlckdyb3VwVHJhbnNw +b3J0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IldyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRuczpXcml0ZXJHcm91cFRyYW5z +cG9ydERhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZXcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIiB0eXBl +PSJ0bnM6TGlzdE9mV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgbmlsbGFibGU9InRydWUi +PjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV3JpdGVyR3JvdXBNZXNz +YWdlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8 +L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJXcml0ZXJHcm91cE1lc3NhZ2VE +YXRhVHlwZSIgdHlwZT0idG5zOldyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIiAvPg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVyR3JvdXBNZXNz +YWdlRGF0YVR5cGUiIHR5cGU9InRuczpXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgbWluT2Nj +dXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94 +czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlz +dE9mV3JpdGVyR3JvdXBNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZXcml0ZXJHcm91 +cE1lc3NhZ2VEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iUHViU3ViQ29ubmVjdGlvbkRhdGFUeXBlIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJF +bmFibGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJQdWJsaXNoZXJJZCIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UHJvZmlsZVVyaSIgdHlwZT0ieHM6 +c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iQWRkcmVzcyIgdHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvblBy +b3BlcnRpZXMiIHR5cGU9InRuczpMaXN0T2ZLZXlWYWx1ZVBhaXIiIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc3BvcnRTZXR0aW5n +cyIgdHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVyR3JvdXBzIiB0eXBlPSJ0bnM6TGlz +dE9mV3JpdGVyR3JvdXBEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlYWRlckdyb3VwcyIgdHlwZT0idG5zOkxpc3RPZlJl +YWRlckdyb3VwRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +UHViU3ViQ29ubmVjdGlvbkRhdGFUeXBlIiB0eXBlPSJ0bnM6UHViU3ViQ29ubmVjdGlvbkRhdGFU +eXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQdWJTdWJDb25uZWN0aW9u +RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlB1 +YlN1YkNvbm5lY3Rpb25EYXRhVHlwZSIgdHlwZT0idG5zOlB1YlN1YkNvbm5lY3Rpb25EYXRhVHlw +ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mUHViU3ViQ29ubmVjdGlvbkRhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mUHVi +U3ViQ29ubmVjdGlvbkRhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAg +IDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRu +czpDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZkNvbm5lY3Rpb25UcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiB0 +eXBlPSJ0bnM6Q29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9j +Y3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0K +ICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb25uZWN0aW9u +VHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZDb25uZWN0aW9uVHJhbnNwb3J0RGF0 +YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ik5ldHdvcmtBZGRyZXNzRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik5ldHdvcmtJbnRlcmZhY2UiIHR5cGU9InhzOnN0cmluZyIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJOZXR3b3JrQWRkcmVzc0RhdGFUeXBl +IiB0eXBlPSJ0bnM6TmV0d29ya0FkZHJlc3NEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iTGlzdE9mTmV0d29ya0FkZHJlc3NEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV0d29ya0FkZHJlc3NEYXRhVHlwZSIgdHlwZT0i +dG5zOk5ldHdvcmtBZGRyZXNzRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJv +dW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk5ldHdvcmtBZGRyZXNzRGF0YVR5 +cGUiIHR5cGU9InRuczpMaXN0T2ZOZXR3b3JrQWRkcmVzc0RhdGFUeXBlIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOZXR3b3JrQWRkcmVz +c1VybERhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAg +ICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOk5ldHdvcmtBZGRyZXNzRGF0YVR5cGUiPg0KICAg +ICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXJsIiB0eXBl +PSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwv +eHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250 +ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJOZXR3b3JrQWRk +cmVzc1VybERhdGFUeXBlIiB0eXBlPSJ0bnM6TmV0d29ya0FkZHJlc3NVcmxEYXRhVHlwZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTmV0d29ya0FkZHJlc3NVcmxEYXRhVHlw +ZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV0d29ya0Fk +ZHJlc3NVcmxEYXRhVHlwZSIgdHlwZT0idG5zOk5ldHdvcmtBZGRyZXNzVXJsRGF0YVR5cGUiIG1p +bk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +Ikxpc3RPZk5ldHdvcmtBZGRyZXNzVXJsRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZOZXR3b3Jr +QWRkcmVzc1VybERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJSZWFkZXJHcm91cERhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxl +eENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOlB1 +YlN1Ykdyb3VwRGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0U2V0dGluZ3MiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVj +dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJNZXNzYWdlU2V0dGluZ3MiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE +YXRhU2V0UmVhZGVycyIgdHlwZT0idG5zOkxpc3RPZkRhdGFTZXRSZWFkZXJEYXRhVHlwZSIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAg +ICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlYWRlckdyb3VwRGF0YVR5cGUiIHR5cGU9 +InRuczpSZWFkZXJHcm91cERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJM +aXN0T2ZSZWFkZXJHcm91cERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJSZWFkZXJHcm91cERhdGFUeXBlIiB0eXBlPSJ0bnM6UmVhZGVyR3JvdXBE +YXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iTGlzdE9mUmVhZGVyR3JvdXBEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlJl +YWRlckdyb3VwRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IlJlYWRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJSZWFkZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6 +UmVhZGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iTGlzdE9mUmVhZGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVhZGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIg +dHlwZT0idG5zOlJlYWRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4 +T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlJlYWRlckdy +b3VwVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZSZWFkZXJHcm91cFRyYW5zcG9y +dERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJSZWFkZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IlJlYWRlckdyb3VwTWVzc2FnZURhdGFUeXBlIiB0eXBlPSJ0bnM6UmVhZGVyR3JvdXBN +ZXNzYWdlRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlYWRl +ckdyb3VwTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJSZWFkZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOlJlYWRlckdy +b3VwTWVzc2FnZURhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWFkZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIg +dHlwZT0idG5zOkxpc3RPZlJlYWRlckdyb3VwTWVzc2FnZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEYXRhU2V0UmVhZGVy +RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5h +bWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkVuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlB1Ymxpc2hlcklkIiB0eXBlPSJ1YTpW +YXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJXcml0ZXJH +cm91cElkIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0V3JpdGVySWQiIHR5cGU9InhzOnVuc2lnbmVkU2hvcnQi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFTZXRNZXRhRGF0 +YSIgdHlwZT0idG5zOkRhdGFTZXRNZXRhRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0RmllbGRDb250ZW50TWFz +ayIgdHlwZT0idG5zOkRhdGFTZXRGaWVsZENvbnRlbnRNYXNrIiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlUmVjZWl2ZVRpbWVvdXQiIHR5cGU9InhzOmRv +dWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iS2V5RnJhbWVD +b3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkhlYWRlckxheW91dFVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlN +b2RlIiB0eXBlPSJ0bnM6TWVzc2FnZVNlY3VyaXR5TW9kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlHcm91cElkIiB0eXBlPSJ4czpzdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJT +ZWN1cml0eUtleVNlcnZpY2VzIiB0eXBlPSJ0bnM6TGlzdE9mRW5kcG9pbnREZXNjcmlwdGlvbiIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkRhdGFTZXRSZWFkZXJQcm9wZXJ0aWVzIiB0eXBlPSJ0bnM6TGlzdE9mS2V5VmFsdWVQYWlyIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +VHJhbnNwb3J0U2V0dGluZ3MiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VTZXR0 +aW5ncyIgdHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaWJlZERhdGFTZXQiIHR5cGU9 +InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJEYXRhU2V0UmVhZGVyRGF0YVR5cGUiIHR5cGU9InRuczpEYXRhU2V0UmVhZGVyRGF0YVR5cGUi +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkRhdGFTZXRSZWFkZXJEYXRhVHlw +ZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldFJl +YWRlckRhdGFUeXBlIiB0eXBlPSJ0bnM6RGF0YVNldFJlYWRlckRhdGFUeXBlIiBtaW5PY2N1cnM9 +IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZE +YXRhU2V0UmVhZGVyRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZEYXRhU2V0UmVhZGVyRGF0YVR5 +cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IkRhdGFTZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IkRhdGFTZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5zOkRhdGFTZXRSZWFk +ZXJUcmFuc3BvcnREYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9m +RGF0YVNldFJlYWRlclRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0UmVhZGVyVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9 +InRuczpEYXRhU2V0UmVhZGVyVHJhbnNwb3J0RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2Nj +dXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGFTZXRSZWFk +ZXJUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZkRhdGFTZXRSZWFkZXJUcmFuc3Bv +cnREYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iRGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkRhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRuczpEYXRhU2V0 +UmVhZGVyTWVzc2FnZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0 +T2ZEYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIiB0eXBlPSJ0 +bnM6RGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9 +InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGF0YVNldFJlYWRlck1l +c3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZkRhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5 +cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IlN1YnNjcmliZWREYXRhU2V0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJT +dWJzY3JpYmVkRGF0YVNldERhdGFUeXBlIiB0eXBlPSJ0bnM6U3Vic2NyaWJlZERhdGFTZXREYXRh +VHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3Vic2NyaWJlZERhdGFT +ZXREYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +U3Vic2NyaWJlZERhdGFTZXREYXRhVHlwZSIgdHlwZT0idG5zOlN1YnNjcmliZWREYXRhU2V0RGF0 +YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9Ikxpc3RPZlN1YnNjcmliZWREYXRhU2V0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0 +T2ZTdWJzY3JpYmVkRGF0YVNldERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50 +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUYXJnZXRWYXJpYWJsZXNEYXRhVHlwZSI+DQog +ICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9u +IGJhc2U9InRuczpTdWJzY3JpYmVkRGF0YVNldERhdGFUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRhcmdldFZhcmlhYmxlcyIgdHlwZT0i +dG5zOkxpc3RPZkZpZWxkVGFyZ2V0RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAg +ICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJUYXJnZXRWYXJpYWJsZXNEYXRhVHlwZSIgdHlwZT0idG5zOlRhcmdldFZhcmlhYmxl +c0RhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUYXJnZXRWYXJp +YWJsZXNEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iVGFyZ2V0VmFyaWFibGVzRGF0YVR5cGUiIHR5cGU9InRuczpUYXJnZXRWYXJpYWJsZXNEYXRh +VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iTGlzdE9mVGFyZ2V0VmFyaWFibGVzRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZU +YXJnZXRWYXJpYWJsZXNEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K +ICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmllbGRUYXJnZXREYXRhVHlwZSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldEZpZWxkSWQiIHR5cGU9InVh +Okd1aWQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlY2VpdmVy +SW5kZXhSYW5nZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGFyZ2V0Tm9kZUlkIiB0eXBlPSJ1YTpOb2Rl +SWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJBdHRyaWJ1dGVJZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IldyaXRlSW5kZXhSYW5nZSIgdHlwZT0ieHM6c3RyaW5n +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iT3ZlcnJpZGVWYWx1ZUhhbmRsaW5nIiB0eXBlPSJ0bnM6T3ZlcnJpZGVWYWx1ZUhhbmRsaW5n +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJPdmVycmlkZVZhbHVl +IiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRmllbGRUYXJnZXREYXRh +VHlwZSIgdHlwZT0idG5zOkZpZWxkVGFyZ2V0RGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9Ikxpc3RPZkZpZWxkVGFyZ2V0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZpZWxkVGFyZ2V0RGF0YVR5cGUiIHR5cGU9InRuczpG +aWVsZFRhcmdldERhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZGaWVsZFRhcmdldERhdGFUeXBlIiB0eXBlPSJ0 +bnM6TGlzdE9mRmllbGRUYXJnZXREYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iT3ZlcnJpZGVWYWx1ZUhhbmRsaW5nIj4NCiAg +ICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlv +biB2YWx1ZT0iRGlzYWJsZWRfMCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTGFz +dFVzYWJsZVZhbHVlXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik92ZXJyaWRl +VmFsdWVfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9Ik92ZXJyaWRlVmFsdWVIYW5kbGluZyIgdHlwZT0idG5zOk92ZXJy +aWRlVmFsdWVIYW5kbGluZyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT3Zl +cnJpZGVWYWx1ZUhhbmRsaW5nIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJPdmVycmlkZVZhbHVlSGFuZGxpbmciIHR5cGU9InRuczpPdmVycmlkZVZhbHVlSGFu +ZGxpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9m +T3ZlcnJpZGVWYWx1ZUhhbmRsaW5nIiB0eXBlPSJ0bnM6TGlzdE9mT3ZlcnJpZGVWYWx1ZUhhbmRs +aW5nIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJTdWJzY3JpYmVkRGF0YVNldE1pcnJvckRhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxleENv +bnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOlN1YnNj +cmliZWREYXRhU2V0RGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iUGFyZW50Tm9kZU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJS +b2xlUGVybWlzc2lvbnMiIHR5cGU9InRuczpMaXN0T2ZSb2xlUGVybWlzc2lvblR5cGUiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAg +ICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpYmVkRGF0YVNldE1pcnJvckRhdGFU +eXBlIiB0eXBlPSJ0bnM6U3Vic2NyaWJlZERhdGFTZXRNaXJyb3JEYXRhVHlwZSIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3Vic2NyaWJlZERhdGFTZXRNaXJyb3JEYXRhVHlw +ZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaWJl +ZERhdGFTZXRNaXJyb3JEYXRhVHlwZSIgdHlwZT0idG5zOlN1YnNjcmliZWREYXRhU2V0TWlycm9y +RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9Ikxpc3RPZlN1YnNjcmliZWREYXRhU2V0TWlycm9yRGF0YVR5cGUiIHR5cGU9 +InRuczpMaXN0T2ZTdWJzY3JpYmVkRGF0YVNldE1pcnJvckRhdGFUeXBlIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQdWJTdWJDb25maWd1 +cmF0aW9uRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlB1Ymxpc2hlZERhdGFTZXRzIiB0eXBlPSJ0bnM6TGlzdE9mUHVibGlzaGVkRGF0YVNldERh +dGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iQ29ubmVjdGlvbnMiIHR5cGU9InRuczpMaXN0T2ZQdWJTdWJDb25uZWN0aW9uRGF0 +YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJFbmFibGVkIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +UHViU3ViQ29uZmlndXJhdGlvbkRhdGFUeXBlIiB0eXBlPSJ0bnM6UHViU3ViQ29uZmlndXJhdGlv +bkRhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQdWJTdWJDb25m +aWd1cmF0aW9uRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlB1YlN1YkNvbmZpZ3VyYXRpb25EYXRhVHlwZSIgdHlwZT0idG5zOlB1YlN1YkNvbmZp +Z3VyYXRpb25EYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHViU3ViQ29uZmlndXJhdGlvbkRhdGFUeXBlIiB0 +eXBlPSJ0bnM6TGlzdE9mUHViU3ViQ29uZmlndXJhdGlvbkRhdGFUeXBlIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJEYXRhU2V0T3JkZXJp +bmdUeXBlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4 +czplbnVtZXJhdGlvbiB2YWx1ZT0iVW5kZWZpbmVkXzAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9IkFzY2VuZGluZ1dyaXRlcklkXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24g +dmFsdWU9IkFzY2VuZGluZ1dyaXRlcklkU2luZ2xlXzIiIC8+DQogICAgPC94czpyZXN0cmljdGlv +bj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0T3JkZXJp +bmdUeXBlIiB0eXBlPSJ0bnM6RGF0YVNldE9yZGVyaW5nVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iTGlzdE9mRGF0YVNldE9yZGVyaW5nVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldE9yZGVyaW5nVHlwZSIgdHlwZT0idG5z +OkRhdGFTZXRPcmRlcmluZ1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iTGlzdE9mRGF0YVNldE9yZGVyaW5nVHlwZSIgdHlwZT0idG5zOkxpc3RPZkRhdGFT +ZXRPcmRlcmluZ1R5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNp +bXBsZVR5cGUgIG5hbWU9IlVhZHBOZXR3b3JrTWVzc2FnZUNvbnRlbnRNYXNrIj4NCiAgICA8eHM6 +cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+ +DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVWFkcE5ldHdvcmtNZXNz +YWdlQ29udGVudE1hc2siIHR5cGU9InRuczpVYWRwTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVWFkcE5ldHdvcmtNZXNzYWdlQ29u +dGVudE1hc2siPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVh +ZHBOZXR3b3JrTWVzc2FnZUNvbnRlbnRNYXNrIiB0eXBlPSJ0bnM6VWFkcE5ldHdvcmtNZXNzYWdl +Q29udGVudE1hc2siIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +TGlzdE9mVWFkcE5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIHR5cGU9InRuczpMaXN0T2ZVYWRw +TmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVWFkcFdyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBl +Ij4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRl +bnNpb24gYmFzZT0idG5zOldyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIj4NCiAgICAgICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikdyb3VwVmVyc2lvbiIgdHlw +ZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJEYXRhU2V0T3JkZXJpbmciIHR5cGU9InRuczpEYXRhU2V0T3JkZXJpbmdUeXBlIiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV0d29ya01lc3Nh +Z2VDb250ZW50TWFzayIgdHlwZT0idG5zOlVhZHBOZXR3b3JrTWVzc2FnZUNvbnRlbnRNYXNrIiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2FtcGxpbmdPZmZz +ZXQiIHR5cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlB1Ymxpc2hpbmdPZmZzZXQiIHR5cGU9InVhOkxpc3RPZkRvdWJsZSIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAg +IDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxl +eFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVhZHBXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlw +ZSIgdHlwZT0idG5zOlVhZHBXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVWFkcFdyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIj4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVYWRwV3JpdGVyR3Jv +dXBNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRuczpVYWRwV3JpdGVyR3JvdXBNZXNzYWdlRGF0YVR5 +cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9Ikxpc3RPZlVhZHBXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkxp +c3RPZlVhZHBXcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iVWFkcERhdGFTZXRNZXNzYWdlQ29u +dGVudE1hc2siPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZEludCI+DQog +ICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJVYWRwRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIgdHlwZT0idG5zOlVhZHBEYXRhU2V0 +TWVzc2FnZUNvbnRlbnRNYXNrIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZV +YWRwRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iVWFkcERhdGFTZXRNZXNzYWdlQ29udGVudE1hc2siIHR5cGU9InRu +czpVYWRwRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9 +InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZVYWRwRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIg +dHlwZT0idG5zOkxpc3RPZlVhZHBEYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBuaWxsYWJsZT0i +dHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJVYWRwRGF0YVNl +dFdyaXRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJm +YWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEYXRhU2V0V3JpdGVyTWVzc2Fn +ZURhdGFUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkRhdGFTZXRNZXNzYWdlQ29udGVudE1hc2siIHR5cGU9InRuczpVYWRwRGF0YVNldE1l +c3NhZ2VDb250ZW50TWFzayIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkNvbmZpZ3VyZWRTaXplIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV0d29ya01lc3NhZ2VOdW1iZXIi +IHR5cGU9InhzOnVuc2lnbmVkU2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJEYXRhU2V0T2Zmc2V0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lv +bj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJVYWRwRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5z +OlVhZHBEYXRhU2V0V3JpdGVyTWVzc2FnZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJMaXN0T2ZVYWRwRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVWFkcERhdGFTZXRXcml0ZXJNZXNz +YWdlRGF0YVR5cGUiIHR5cGU9InRuczpVYWRwRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIg +bWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iTGlzdE9mVWFkcERhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0 +T2ZVYWRwRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVWFkcERhdGFTZXRSZWFkZXJNZXNz +YWdlRGF0YVR5cGUiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAg +ICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSI+ +DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJHcm91 +cFZlcnNpb24iIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV0d29ya01lc3NhZ2VOdW1iZXIiIHR5cGU9InhzOnVuc2ln +bmVkU2hvcnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE +YXRhU2V0T2Zmc2V0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldENsYXNzSWQiIHR5cGU9InVhOkd1aWQi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOZXR3b3JrTWVz +c2FnZUNvbnRlbnRNYXNrIiB0eXBlPSJ0bnM6VWFkcE5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2si +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0TWVz +c2FnZUNvbnRlbnRNYXNrIiB0eXBlPSJ0bnM6VWFkcERhdGFTZXRNZXNzYWdlQ29udGVudE1hc2si +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoaW5n +SW50ZXJ2YWwiIHR5cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJlY2VpdmVPZmZzZXQiIHR5cGU9InhzOmRvdWJsZSIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlByb2Nlc3NpbmdPZmZzZXQiIHR5 +cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0K +ICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVWFkcERhdGFTZXRSZWFkZXJNZXNzYWdl +RGF0YVR5cGUiIHR5cGU9InRuczpVYWRwRGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVWFkcERhdGFTZXRSZWFkZXJNZXNzYWdl +RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVh +ZHBEYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIiB0eXBlPSJ0bnM6VWFkcERhdGFTZXRSZWFk +ZXJNZXNzYWdlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlVhZHBEYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFU +eXBlIiB0eXBlPSJ0bnM6TGlzdE9mVWFkcERhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUiIG5p +bGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9Ikpz +b25OZXR3b3JrTWVzc2FnZUNvbnRlbnRNYXNrIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0i +eHM6dW5zaWduZWRJbnQiPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iSnNvbk5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIHR5 +cGU9InRuczpKc29uTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgLz4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iTGlzdE9mSnNvbk5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikpzb25OZXR3b3JrTWVzc2FnZUNv +bnRlbnRNYXNrIiB0eXBlPSJ0bnM6SnNvbk5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIG1pbk9j +Y3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSnNvbk5ldHdvcmtN +ZXNzYWdlQ29udGVudE1hc2siIHR5cGU9InRuczpMaXN0T2ZKc29uTmV0d29ya01lc3NhZ2VDb250 +ZW50TWFzayIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iSnNvbldyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxl +eENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOldy +aXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9Ik5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIHR5cGU9InRu +czpKc29uTmV0d29ya01lc3NhZ2VDb250ZW50TWFzayIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +ICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4 +Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iSnNvbldy +aXRlckdyb3VwTWVzc2FnZURhdGFUeXBlIiB0eXBlPSJ0bnM6SnNvbldyaXRlckdyb3VwTWVzc2Fn +ZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZKc29uV3JpdGVy +R3JvdXBNZXNzYWdlRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ikpzb25Xcml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkpzb25X +cml0ZXJHcm91cE1lc3NhZ2VEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91 +bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSnNvbldyaXRlckdyb3VwTWVzc2Fn +ZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mSnNvbldyaXRlckdyb3VwTWVzc2FnZURhdGFUeXBl +IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1l +PSJKc29uRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJh +c2U9InhzOnVuc2lnbmVkSW50Ij4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBs +ZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikpzb25EYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNr +IiB0eXBlPSJ0bnM6SnNvbkRhdGFTZXRNZXNzYWdlQ29udGVudE1hc2siIC8+DQoNCiAgPHhzOmNv +bXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkpzb25EYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIj4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJKc29uRGF0YVNldE1lc3Nh +Z2VDb250ZW50TWFzayIgdHlwZT0idG5zOkpzb25EYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkpzb25EYXRh +U2V0TWVzc2FnZUNvbnRlbnRNYXNrIiB0eXBlPSJ0bnM6TGlzdE9mSnNvbkRhdGFTZXRNZXNzYWdl +Q29udGVudE1hc2siIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ikpzb25EYXRhU2V0V3JpdGVyTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6 +Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0i +dG5zOkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVNldE1lc3NhZ2VDb250ZW50TWFzayIg +dHlwZT0idG5zOkpzb25EYXRhU2V0TWVzc2FnZUNvbnRlbnRNYXNrIiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hz +OmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJKc29uRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkpzb25EYXRhU2V0 +V3JpdGVyTWVzc2FnZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0 +T2ZKc29uRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSnNvbkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUi +IHR5cGU9InRuczpKc29uRGF0YVNldFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgbWluT2NjdXJzPSIw +IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSnNv +bkRhdGFTZXRXcml0ZXJNZXNzYWdlRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZKc29uRGF0YVNl +dFdyaXRlck1lc3NhZ2VEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K +ICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSnNvbkRhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUi +Pg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVu +c2lvbiBiYXNlPSJ0bnM6RGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSI+DQogICAgICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOZXR3b3JrTWVzc2FnZUNv +bnRlbnRNYXNrIiB0eXBlPSJ0bnM6SnNvbk5ldHdvcmtNZXNzYWdlQ29udGVudE1hc2siIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU2V0TWVzc2FnZUNv +bnRlbnRNYXNrIiB0eXBlPSJ0bnM6SnNvbkRhdGFTZXRNZXNzYWdlQ29udGVudE1hc2siIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9u +Pg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9Ikpzb25EYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIiB0eXBlPSJ0bnM6 +SnNvbkRhdGFTZXRSZWFkZXJNZXNzYWdlRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZkpzb25EYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJKc29uRGF0YVNldFJlYWRlck1lc3Nh +Z2VEYXRhVHlwZSIgdHlwZT0idG5zOkpzb25EYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZKc29uRGF0YVNldFJlYWRlck1lc3NhZ2VEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RP +Zkpzb25EYXRhU2V0UmVhZGVyTWVzc2FnZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEYXRhZ3JhbUNvbm5lY3Rpb25UcmFu +c3BvcnREYXRhVHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQog +ICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUi +Pg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlz +Y292ZXJ5QWRkcmVzcyIgdHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRl +bnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iRGF0YWdyYW1Db25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiIHR5 +cGU9InRuczpEYXRhZ3JhbUNvbm5lY3Rpb25UcmFuc3BvcnREYXRhVHlwZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0YWdyYW1Db25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5 +cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFncmFt +Q29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6RGF0YWdyYW1Db25uZWN0aW9u +VHJhbnNwb3J0RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRhdGFncmFtQ29ubmVjdGlvblRyYW5zcG9ydERh +dGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mRGF0YWdyYW1Db25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5 +cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IkRhdGFncmFtV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOmNvbXBs +ZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpX +cml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1lc3NhZ2VSZXBlYXRDb3VudCIgdHlwZT0ieHM6dW5z +aWduZWRCeXRlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +TWVzc2FnZVJlcGVhdERlbGF5IiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29t +cGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRh +dGFncmFtV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5zOkRhdGFncmFtV3Jp +dGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +TGlzdE9mRGF0YWdyYW1Xcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhZ3JhbVdyaXRlckdyb3VwVHJhbnNw +b3J0RGF0YVR5cGUiIHR5cGU9InRuczpEYXRhZ3JhbVdyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5 +cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9Ikxpc3RPZkRhdGFncmFtV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0i +dG5zOkxpc3RPZkRhdGFncmFtV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgbmlsbGFibGU9 +InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQnJva2VyQ29u +bmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9 +ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOkNvbm5lY3Rpb25UcmFuc3Bv +cnREYXRhVHlwZSI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJSZXNvdXJjZVVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9u +UHJvZmlsZVVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAg +PC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iQnJva2VyQ29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6QnJva2Vy +Q29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJMaXN0T2ZCcm9rZXJDb25uZWN0aW9uVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb2tlckNvbm5lY3Rpb25UcmFuc3BvcnRE +YXRhVHlwZSIgdHlwZT0idG5zOkJyb2tlckNvbm5lY3Rpb25UcmFuc3BvcnREYXRhVHlwZSIgbWlu +T2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +TGlzdE9mQnJva2VyQ29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9m +QnJva2VyQ29ubmVjdGlvblRyYW5zcG9ydERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJCcm9rZXJUcmFuc3BvcnRRdWFsaXR5 +T2ZTZXJ2aWNlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm90U3BlY2lmaWVkXzAiIC8+DQogICAgICA8eHM6ZW51 +bWVyYXRpb24gdmFsdWU9IkJlc3RFZmZvcnRfMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2 +YWx1ZT0iQXRMZWFzdE9uY2VfMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQXRN +b3N0T25jZV8zIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFeGFjdGx5T25jZV80 +IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iQnJva2VyVHJhbnNwb3J0UXVhbGl0eU9mU2VydmljZSIgdHlwZT0idG5zOkJy +b2tlclRyYW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZkJyb2tlclRyYW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb2tlclRyYW5zcG9ydFF1YWxpdHlPZlNl +cnZpY2UiIHR5cGU9InRuczpCcm9rZXJUcmFuc3BvcnRRdWFsaXR5T2ZTZXJ2aWNlIiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkJyb2tlclRyYW5zcG9y +dFF1YWxpdHlPZlNlcnZpY2UiIHR5cGU9InRuczpMaXN0T2ZCcm9rZXJUcmFuc3BvcnRRdWFsaXR5 +T2ZTZXJ2aWNlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJCcm9rZXJXcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6 +Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0i +dG5zOldyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVldWVOYW1lIiB0eXBlPSJ4czpzdHJpbmci +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUmVzb3VyY2VVcmkiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdXRoZW50aWNhdGlvblBy +b2ZpbGVVcmkiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeUd1YXJhbnRl +ZSIgdHlwZT0idG5zOkJyb2tlclRyYW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAg +IDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IkJyb2tlcldyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRuczpCcm9r +ZXJXcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJMaXN0T2ZCcm9rZXJXcml0ZXJHcm91cFRyYW5zcG9ydERhdGFUeXBlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCcm9rZXJXcml0ZXJHcm91cFRyYW5z +cG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6QnJva2VyV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlw +ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mQnJva2VyV3JpdGVyR3JvdXBUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5z +Okxpc3RPZkJyb2tlcldyaXRlckdyb3VwVHJhbnNwb3J0RGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVl +Ij48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJyb2tlckRhdGFTZXRX +cml0ZXJUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJm +YWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEYXRhU2V0V3JpdGVyVHJhbnNw +b3J0RGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iUXVldWVOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzb3VyY2VVcmkiIHR5 +cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJBdXRoZW50aWNhdGlvblByb2ZpbGVVcmkiIHR5cGU9InhzOnN0 +cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeUd1YXJhbnRlZSIgdHlwZT0idG5zOkJyb2tlclRy +YW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJNZXRhRGF0YVF1ZXVlTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1l +dGFEYXRhVXBkYXRlVGltZSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBs +ZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCcm9r +ZXJEYXRhU2V0V3JpdGVyVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRuczpCcm9rZXJEYXRhU2V0 +V3JpdGVyVHJhbnNwb3J0RGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp +c3RPZkJyb2tlckRhdGFTZXRXcml0ZXJUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnJva2VyRGF0YVNldFdyaXRlclRyYW5zcG9y +dERhdGFUeXBlIiB0eXBlPSJ0bnM6QnJva2VyRGF0YVNldFdyaXRlclRyYW5zcG9ydERhdGFUeXBl +IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJMaXN0T2ZCcm9rZXJEYXRhU2V0V3JpdGVyVHJhbnNwb3J0RGF0YVR5cGUiIHR5cGU9InRu +czpMaXN0T2ZCcm9rZXJEYXRhU2V0V3JpdGVyVHJhbnNwb3J0RGF0YVR5cGUiIG5pbGxhYmxlPSJ0 +cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJyb2tlckRhdGFT +ZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVk +PSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEYXRhU2V0UmVhZGVyVHJh +bnNwb3J0RGF0YVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iUXVldWVOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzb3VyY2VVcmki +IHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdXRoZW50aWNhdGlvblByb2ZpbGVVcmkiIHR5cGU9Inhz +OnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWREZWxpdmVyeUd1YXJhbnRlZSIgdHlwZT0idG5zOkJyb2tl +clRyYW5zcG9ydFF1YWxpdHlPZlNlcnZpY2UiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJNZXRhRGF0YVF1ZXVlTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAg +ICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQnJva2VyRGF0YVNldFJlYWRlclRyYW5zcG9y +dERhdGFUeXBlIiB0eXBlPSJ0bnM6QnJva2VyRGF0YVNldFJlYWRlclRyYW5zcG9ydERhdGFUeXBl +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZCcm9rZXJEYXRhU2V0UmVhZGVy +VHJhbnNwb3J0RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkJyb2tlckRhdGFTZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSIgdHlwZT0idG5zOkJy +b2tlckRhdGFTZXRSZWFkZXJUcmFuc3BvcnREYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1 +cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQnJva2VyRGF0YVNl +dFJlYWRlclRyYW5zcG9ydERhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQnJva2VyRGF0YVNldFJl +YWRlclRyYW5zcG9ydERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQog +IDx4czpzaW1wbGVUeXBlICBuYW1lPSJEaWFnbm9zdGljc0xldmVsIj4NCiAgICA8eHM6cmVzdHJp +Y3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQmFz +aWNfMCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWR2YW5jZWRfMSIgLz4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSW5mb18yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJMb2dfMyIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGVidWdf +NCIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IkRpYWdub3N0aWNzTGV2ZWwiIHR5cGU9InRuczpEaWFnbm9zdGljc0xldmVs +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEaWFnbm9zdGljc0xldmVsIj4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljc0xl +dmVsIiB0eXBlPSJ0bnM6RGlhZ25vc3RpY3NMZXZlbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9 +InVuYm91bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZEaWFnbm9zdGljc0xldmVsIiB0eXBlPSJ0bnM6TGlz +dE9mRGlhZ25vc3RpY3NMZXZlbCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8 +eHM6c2ltcGxlVHlwZSAgbmFtZT0iUHViU3ViRGlhZ25vc3RpY3NDb3VudGVyQ2xhc3NpZmljYXRp +b24iPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJJbmZvcm1hdGlvbl8wIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9u +IHZhbHVlPSJFcnJvcl8xIiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxl +VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUHViU3ViRGlhZ25vc3RpY3NDb3VudGVyQ2xhc3Np +ZmljYXRpb24iIHR5cGU9InRuczpQdWJTdWJEaWFnbm9zdGljc0NvdW50ZXJDbGFzc2lmaWNhdGlv +biIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUHViU3ViRGlhZ25vc3RpY3ND +b3VudGVyQ2xhc3NpZmljYXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlB1YlN1YkRpYWdub3N0aWNzQ291bnRlckNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ0 +bnM6UHViU3ViRGlhZ25vc3RpY3NDb3VudGVyQ2xhc3NpZmljYXRpb24iIG1pbk9jY3Vycz0iMCIg +bWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mUHViU3ViRGlhZ25vc3RpY3NDb3Vu +dGVyQ2xhc3NpZmljYXRpb24iIHR5cGU9InRuczpMaXN0T2ZQdWJTdWJEaWFnbm9zdGljc0NvdW50 +ZXJDbGFzc2lmaWNhdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iQWxpYXNOYW1lRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFsaWFzTmFtZSIgdHlwZT0idWE6UXVhbGlmaWVkTmFt +ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlJlZmVyZW5jZWROb2RlcyIgdHlwZT0idWE6TGlzdE9mRXhwYW5kZWROb2RlSWQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQWxpYXNOYW1lRGF0YVR5cGUiIHR5cGU9 +InRuczpBbGlhc05hbWVEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlz +dE9mQWxpYXNOYW1lRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkFsaWFzTmFtZURhdGFUeXBlIiB0eXBlPSJ0bnM6QWxpYXNOYW1lRGF0YVR5cGUi +IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ikxpc3RPZkFsaWFzTmFtZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mQWxpYXNOYW1lRGF0 +YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBsZVR5cGUg +IG5hbWU9IkR1cGxleCI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQog +ICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZ1bGxfMCIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iSGFsZl8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVbmtu +b3duXzIiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJEdXBsZXgiIHR5cGU9InRuczpEdXBsZXgiIC8+DQoNCiAgPHhzOmNv +bXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkR1cGxleCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRHVwbGV4IiB0eXBlPSJ0bnM6RHVwbGV4IiBtaW5PY2N1cnM9IjAi +IG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkR1cGxleCIgdHlwZT0idG5zOkxp +c3RPZkR1cGxleCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxl +VHlwZSAgbmFtZT0iSW50ZXJmYWNlQWRtaW5TdGF0dXMiPg0KICAgIDx4czpyZXN0cmljdGlvbiBi +YXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVcF8wIiAvPg0K +ICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duXzEiIC8+DQogICAgICA8eHM6ZW51bWVy +YXRpb24gdmFsdWU9IlRlc3RpbmdfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hz +OnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkludGVyZmFjZUFkbWluU3RhdHVzIiB0 +eXBlPSJ0bnM6SW50ZXJmYWNlQWRtaW5TdGF0dXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZkludGVyZmFjZUFkbWluU3RhdHVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VBZG1pblN0YXR1cyIgdHlwZT0idG5zOkludGVy +ZmFjZUFkbWluU3RhdHVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ikxpc3RPZkludGVyZmFjZUFkbWluU3RhdHVzIiB0eXBlPSJ0bnM6TGlzdE9mSW50ZXJmYWNl +QWRtaW5TdGF0dXMiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBs +ZVR5cGUgIG5hbWU9IkludGVyZmFjZU9wZXJTdGF0dXMiPg0KICAgIDx4czpyZXN0cmljdGlvbiBi +YXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVcF8wIiAvPg0K +ICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEb3duXzEiIC8+DQogICAgICA8eHM6ZW51bWVy +YXRpb24gdmFsdWU9IlRlc3RpbmdfMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0i +VW5rbm93bl8zIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEb3JtYW50XzQiIC8+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5vdFByZXNlbnRfNSIgLz4NCiAgICAgIDx4 +czplbnVtZXJhdGlvbiB2YWx1ZT0iTG93ZXJMYXllckRvd25fNiIgLz4NCiAgICA8L3hzOnJlc3Ry +aWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkludGVyZmFj +ZU9wZXJTdGF0dXMiIHR5cGU9InRuczpJbnRlcmZhY2VPcGVyU3RhdHVzIiAvPg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZJbnRlcmZhY2VPcGVyU3RhdHVzIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VPcGVyU3RhdHVzIiB0eXBl +PSJ0bnM6SW50ZXJmYWNlT3BlclN0YXR1cyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91 +bmRlZCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJMaXN0T2ZJbnRlcmZhY2VPcGVyU3RhdHVzIiB0eXBlPSJ0bnM6TGlzdE9m +SW50ZXJmYWNlT3BlclN0YXR1cyIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8 +eHM6c2ltcGxlVHlwZSAgbmFtZT0iTmVnb3RpYXRpb25TdGF0dXMiPg0KICAgIDx4czpyZXN0cmlj +dGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJblBy +b2dyZXNzXzAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBsZXRlXzEiIC8+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZhaWxlZF8yIiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJVbmtub3duXzMiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFs +dWU9Ik5vTmVnb3RpYXRpb25fNCIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNp +bXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ik5lZ290aWF0aW9uU3RhdHVzIiB0eXBlPSJ0 +bnM6TmVnb3RpYXRpb25TdGF0dXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP +Zk5lZ290aWF0aW9uU3RhdHVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJOZWdvdGlhdGlvblN0YXR1cyIgdHlwZT0idG5zOk5lZ290aWF0aW9uU3RhdHVzIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk5lZ290aWF0 +aW9uU3RhdHVzIiB0eXBlPSJ0bnM6TGlzdE9mTmVnb3RpYXRpb25TdGF0dXMiIG5pbGxhYmxlPSJ0 +cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IlRzbkZhaWx1cmVD +b2RlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czpl +bnVtZXJhdGlvbiB2YWx1ZT0iTm9GYWlsdXJlXzAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24g +dmFsdWU9Ikluc3VmZmljaWVudEJhbmR3aWR0aF8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9u +IHZhbHVlPSJJbnN1ZmZpY2llbnRSZXNvdXJjZXNfMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlv +biB2YWx1ZT0iSW5zdWZmaWNpZW50VHJhZmZpY0NsYXNzQmFuZHdpZHRoXzMiIC8+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmVhbUlkSW5Vc2VfNCIgLz4NCiAgICAgIDx4czplbnVt +ZXJhdGlvbiB2YWx1ZT0iU3RyZWFtRGVzdGluYXRpb25BZGRyZXNzSW5Vc2VfNSIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZWFtUHJlZW1wdGVkQnlIaWdoZXJSYW5rXzYiIC8+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxhdGVuY3lIYXNDaGFuZ2VkXzciIC8+DQog +ICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVncmVzc1BvcnROb3RBdmJDYXBhYmxlXzgiIC8+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVzZURpZmZlcmVudERlc3RpbmF0aW9uQWRk +cmVzc185IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPdXRPZk1zcnBSZXNvdXJj +ZXNfMTAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik91dE9mTW1ycFJlc291cmNl +c18xMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2Fubm90U3RvcmVEZXN0aW5h +dGlvbkFkZHJlc3NfMTIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlByaW9yaXR5 +SXNOb3RBblNyY0NsYXNzXzEzIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNYXhG +cmFtZVNpemVUb29MYXJnZV8xNCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTWF4 +RmFuSW5Qb3J0c0xpbWl0UmVhY2hlZF8xNSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1 +ZT0iRmlyc3RWYWx1ZUNoYW5nZWRGb3JTdHJlYW1JZF8xNiIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iVmxhbkJsb2NrZWRPbkVncmVzc18xNyIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iVmxhblRhZ2dpbmdEaXNhYmxlZE9uRWdyZXNzXzE4IiAvPg0KICAgICAgPHhz +OmVudW1lcmF0aW9uIHZhbHVlPSJTckNsYXNzUHJpb3JpdHlNaXNtYXRjaF8xOSIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmVhdHVyZU5vdFByb3BhZ2F0ZWRfMjAiIC8+DQogICAg +ICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1heExhdGVuY3lFeGNlZWRlZF8yMSIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQnJpZGdlRG9lc05vdFByb3ZpZGVOZXR3b3JrSWRfMjIi +IC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN0cmVhbVRyYW5zZm9ybU5vdFN1cHBv +cnRlZF8yMyIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3RyZWFtSWRUeXBlTm90 +U3VwcG9ydGVkXzI0IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGZWF0dXJlTm90 +U3VwcG9ydGVkXzI1IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVHNuRmFpbHVyZUNvZGUiIHR5cGU9InRuczpUc25GYWls +dXJlQ29kZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHNuRmFpbHVyZUNv +ZGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRzbkZhaWx1 +cmVDb2RlIiB0eXBlPSJ0bnM6VHNuRmFpbHVyZUNvZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJz +PSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHNuRmFpbHVyZUNvZGUiIHR5cGU9InRuczpMaXN0 +T2ZUc25GYWlsdXJlQ29kZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +c2ltcGxlVHlwZSAgbmFtZT0iVHNuU3RyZWFtU3RhdGUiPg0KICAgIDx4czpyZXN0cmljdGlvbiBi +YXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNhYmxlZF8w +IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDb25maWd1cmluZ18xIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeV8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJPcGVyYXRpb25hbF8zIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVl +PSJFcnJvcl80IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iVHNuU3RyZWFtU3RhdGUiIHR5cGU9InRuczpUc25TdHJlYW1T +dGF0ZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHNuU3RyZWFtU3RhdGUi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRzblN0cmVhbVN0 +YXRlIiB0eXBlPSJ0bnM6VHNuU3RyZWFtU3RhdGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1 +bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHNuU3RyZWFtU3RhdGUiIHR5cGU9InRuczpMaXN0T2ZU +c25TdHJlYW1TdGF0ZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2lt +cGxlVHlwZSAgbmFtZT0iVHNuVGFsa2VyU3RhdHVzIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFz +ZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZV8wIiAvPg0K +ICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZWFkeV8xIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJGYWlsZWRfMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hz +OnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlRzblRhbGtlclN0YXR1cyIgdHlwZT0i +dG5zOlRzblRhbGtlclN0YXR1cyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9m +VHNuVGFsa2VyU3RhdHVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJUc25UYWxrZXJTdGF0dXMiIHR5cGU9InRuczpUc25UYWxrZXJTdGF0dXMiIG1pbk9jY3Vy +cz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHNuVGFsa2VyU3RhdHVz +IiB0eXBlPSJ0bnM6TGlzdE9mVHNuVGFsa2VyU3RhdHVzIiBuaWxsYWJsZT0idHJ1ZSI+PC94czpl +bGVtZW50Pg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJUc25MaXN0ZW5lclN0YXR1cyI+DQog +ICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9Ik5vbmVfMCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVhZHlf +MSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUGFydGlhbEZhaWxlZF8yIiAvPg0K +ICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGYWlsZWRfMyIgLz4NCiAgICA8L3hzOnJlc3Ry +aWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlRzbkxpc3Rl +bmVyU3RhdHVzIiB0eXBlPSJ0bnM6VHNuTGlzdGVuZXJTdGF0dXMiIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ikxpc3RPZlRzbkxpc3RlbmVyU3RhdHVzIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUc25MaXN0ZW5lclN0YXR1cyIgdHlwZT0idG5zOlRz +bkxpc3RlbmVyU3RhdHVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ikxpc3RPZlRzbkxpc3RlbmVyU3RhdHVzIiB0eXBlPSJ0bnM6TGlzdE9mVHNuTGlzdGVuZXJT +dGF0dXMiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IlVuc2lnbmVkUmF0aW9uYWxOdW1iZXIiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik51bWVyYXRvciIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRlbm9taW5hdG9yIiB0eXBlPSJ4 +czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVuc2lnbmVkUmF0aW9uYWxOdW1i +ZXIiIHR5cGU9InRuczpVbnNpZ25lZFJhdGlvbmFsTnVtYmVyIiAvPg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJMaXN0T2ZVbnNpZ25lZFJhdGlvbmFsTnVtYmVyIj4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVbnNpZ25lZFJhdGlvbmFsTnVtYmVyIiB0eXBl +PSJ0bnM6VW5zaWduZWRSYXRpb25hbE51bWJlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVW5zaWduZWRSYXRpb25hbE51 +bWJlciIgdHlwZT0idG5zOkxpc3RPZlVuc2lnbmVkUmF0aW9uYWxOdW1iZXIiIG5pbGxhYmxlPSJ0 +cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IklkVHlwZSI+DQog +ICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9Ik51bWVyaWNfMCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU3Ry +aW5nXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ikd1aWRfMiIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT3BhcXVlXzMiIC8+DQogICAgPC94czpyZXN0cmljdGlv +bj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJJZFR5cGUiIHR5cGU9 +InRuczpJZFR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZklkVHlwZSI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSWRUeXBlIiB0eXBl +PSJ0bnM6SWRUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +Ikxpc3RPZklkVHlwZSIgdHlwZT0idG5zOkxpc3RPZklkVHlwZSIgbmlsbGFibGU9InRydWUiPjwv +eHM6ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iTm9kZUNsYXNzIj4NCiAgICA8 +eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2 +YWx1ZT0iVW5zcGVjaWZpZWRfMCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT2Jq +ZWN0XzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZhcmlhYmxlXzIiIC8+DQog +ICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1ldGhvZF80IiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJPYmplY3RUeXBlXzgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFs +dWU9IlZhcmlhYmxlVHlwZV8xNiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVm +ZXJlbmNlVHlwZV8zMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVR5cGVf +NjQiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlZpZXdfMTI4IiAvPg0KICAgIDwv +eHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +Tm9kZUNsYXNzIiB0eXBlPSJ0bnM6Tm9kZUNsYXNzIiAvPg0KDQogIDx4czpzaW1wbGVUeXBlICBu +YW1lPSJQZXJtaXNzaW9uVHlwZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2ln +bmVkSW50Ij4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IlBlcm1pc3Npb25UeXBlIiB0eXBlPSJ0bnM6UGVybWlzc2lvblR5cGUi +IC8+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IkFjY2Vzc0xldmVsVHlwZSI+DQogICAgPHhz +OnJlc3RyaWN0aW9uIGJhc2U9InhzOnVuc2lnbmVkQnl0ZSI+DQogICAgPC94czpyZXN0cmljdGlv +bj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBY2Nlc3NMZXZlbFR5 +cGUiIHR5cGU9InRuczpBY2Nlc3NMZXZlbFR5cGUiIC8+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5h +bWU9IkFjY2Vzc0xldmVsRXhUeXBlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5z +aWduZWRJbnQiPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iQWNjZXNzTGV2ZWxFeFR5cGUiIHR5cGU9InRuczpBY2Nlc3NMZXZl +bEV4VHlwZSIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iRXZlbnROb3RpZmllclR5cGUi +Pg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czp1bnNpZ25lZEJ5dGUiPg0KICAgIDwveHM6 +cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRXZl +bnROb3RpZmllclR5cGUiIHR5cGU9InRuczpFdmVudE5vdGlmaWVyVHlwZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iUm9sZVBlcm1pc3Npb25UeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSb2xlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBlcm1p +c3Npb25zIiB0eXBlPSJ0bnM6UGVybWlzc2lvblR5cGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJS +b2xlUGVybWlzc2lvblR5cGUiIHR5cGU9InRuczpSb2xlUGVybWlzc2lvblR5cGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJvbGVQZXJtaXNzaW9uVHlwZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUm9sZVBlcm1pc3Npb25UeXBlIiB0 +eXBlPSJ0bnM6Um9sZVBlcm1pc3Npb25UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5i +b3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSb2xlUGVybWlzc2lvblR5cGUi +IHR5cGU9InRuczpMaXN0T2ZSb2xlUGVybWlzc2lvblR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hz +OmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGFUeXBlRGVmaW5pdGlvbiI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5 +cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlRGVmaW5pdGlvbiIgdHlwZT0idG5zOkRh +dGFUeXBlRGVmaW5pdGlvbiIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGF0 +YVR5cGVEZWZpbml0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJEYXRhVHlwZURlZmluaXRpb24iIHR5cGU9InRuczpEYXRhVHlwZURlZmluaXRpb24iIG1p +bk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +Ikxpc3RPZkRhdGFUeXBlRGVmaW5pdGlvbiIgdHlwZT0idG5zOkxpc3RPZkRhdGFUeXBlRGVmaW5p +dGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxlVHlwZSAg +bmFtZT0iU3RydWN0dXJlVHlwZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmlu +ZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN0cnVjdHVyZV8wIiAvPg0KICAgICAg +PHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTdHJ1Y3R1cmVXaXRoT3B0aW9uYWxGaWVsZHNfMSIgLz4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVW5pb25fMiIgLz4NCiAgICAgIDx4czplbnVt +ZXJhdGlvbiB2YWx1ZT0iU3RydWN0dXJlV2l0aFN1YnR5cGVkVmFsdWVzXzMiIC8+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVuaW9uV2l0aFN1YnR5cGVkVmFsdWVzXzQiIC8+DQogICAg +PC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJTdHJ1Y3R1cmVUeXBlIiB0eXBlPSJ0bnM6U3RydWN0dXJlVHlwZSIgLz4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iU3RydWN0dXJlRmllbGQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0 +eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVR5cGUiIHR5cGU9InVhOk5vZGVJZCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhbHVl +UmFuayIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJBcnJheURpbWVuc2lvbnMiIHR5cGU9InVhOkxpc3RPZlVJbnQzMiIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1heFN0cmluZ0xl +bmd0aCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IklzT3B0aW9uYWwiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJTdHJ1Y3R1cmVGaWVsZCIgdHlwZT0idG5zOlN0cnVjdHVyZUZpZWxkIiAvPg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTdHJ1Y3R1cmVGaWVsZCI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RydWN0dXJlRmllbGQiIHR5cGU9InRu +czpTdHJ1Y3R1cmVGaWVsZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mU3RydWN0dXJlRmllbGQiIHR5cGU9InRuczpMaXN0 +T2ZTdHJ1Y3R1cmVGaWVsZCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0dXJlRGVmaW5pdGlvbiI+DQogICAgPHhzOmNvbXBsZXhD +b250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEYXRh +VHlwZURlZmluaXRpb24iPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iRGVmYXVsdEVuY29kaW5nSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCYXNl +RGF0YVR5cGUiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3R1cmVUeXBlIiB0eXBlPSJ0bnM6 +U3RydWN0dXJlVHlwZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5h +bWU9IkZpZWxkcyIgdHlwZT0idG5zOkxpc3RPZlN0cnVjdHVyZUZpZWxkIiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpl +eHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iU3RydWN0dXJlRGVmaW5pdGlvbiIgdHlwZT0idG5zOlN0cnVj +dHVyZURlZmluaXRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0cnVj +dHVyZURlZmluaXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlN0cnVjdHVyZURlZmluaXRpb24iIHR5cGU9InRuczpTdHJ1Y3R1cmVEZWZpbml0aW9uIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZTdHJ1Y3R1cmVEZWZpbml0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mU3RydWN0dXJlRGVm +aW5pdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iRW51bURlZmluaXRpb24iPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0i +ZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RGF0YVR5cGVEZWZpbml0aW9u +Ij4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkZp +ZWxkcyIgdHlwZT0idG5zOkxpc3RPZkVudW1GaWVsZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0K +ICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkVudW1EZWZpbml0aW9uIiB0eXBlPSJ0bnM6RW51bURlZmluaXRpb24iIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkVudW1EZWZpbml0aW9uIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbnVtRGVmaW5pdGlvbiIgdHlwZT0i +dG5zOkVudW1EZWZpbml0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZFbnVtRGVmaW5pdGlvbiIgdHlwZT0idG5zOkxp +c3RPZkVudW1EZWZpbml0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJOb2RlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJOb2RlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVDbGFzcyIgdHlwZT0i +dG5zOk5vZGVDbGFzcyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +QnJvd3NlTmFtZSIgdHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpc3BsYXlOYW1lIiB0eXBlPSJ1 +YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJX +cml0ZU1hc2siIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJVc2VyV3JpdGVNYXNrIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUm9sZVBlcm1pc3Npb25zIiB0 +eXBlPSJ0bnM6TGlzdE9mUm9sZVBlcm1pc3Npb25UeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlclJvbGVQZXJtaXNzaW9ucyIg +dHlwZT0idG5zOkxpc3RPZlJvbGVQZXJtaXNzaW9uVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFjY2Vzc1Jlc3RyaWN0aW9ucyIg +dHlwZT0ieHM6dW5zaWduZWRTaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iUmVmZXJlbmNlcyIgdHlwZT0idG5zOkxpc3RPZlJlZmVyZW5jZU5vZGUiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZSIgdHlwZT0idG5zOk5vZGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5vZGUiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGUiIHR5cGU9InRuczpOb2RlIiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZOb2RlIiB0eXBlPSJ0bnM6TGlzdE9mTm9kZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW5zdGFuY2VOb2RlIj4NCiAgICA8eHM6Y29t +cGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5z +Ok5vZGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQog +ICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJJbnN0YW5jZU5vZGUiIHR5cGU9InRuczpJ +bnN0YW5jZU5vZGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGVOb2RlIj4NCiAg +ICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24g +YmFzZT0idG5zOk5vZGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgIDwveHM6c2Vx +dWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0K +ICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJUeXBlTm9kZSIgdHlwZT0i +dG5zOlR5cGVOb2RlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3ROb2RlIj4N +CiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNp +b24gYmFzZT0idG5zOkluc3RhbmNlTm9kZSI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFdmVudE5vdGlmaWVyIiB0eXBlPSJ4czp1bnNpZ25lZEJ5 +dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6 +ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ik9iamVjdE5vZGUiIHR5cGU9InRuczpPYmplY3ROb2RlIiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3RUeXBlTm9kZSI+DQogICAgPHhzOmNv +bXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRu +czpUeXBlTm9kZSI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJJc0Fic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNv +bXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJP +YmplY3RUeXBlTm9kZSIgdHlwZT0idG5zOk9iamVjdFR5cGVOb2RlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJWYXJpYWJsZU5vZGUiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhl +ZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6SW5zdGFuY2VOb2RlIj4N +CiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhbHVl +IiB0eXBlPSJ1YTpWYXJpYW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iRGF0YVR5cGUiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWx1ZVJhbmsiIHR5cGU9 +InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFy +cmF5RGltZW5zaW9ucyIgdHlwZT0idWE6TGlzdE9mVUludDMyIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFjY2Vzc0xldmVsIiB0 +eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJVc2VyQWNjZXNzTGV2ZWwiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1pbmltdW1TYW1wbGluZ0lu +dGVydmFsIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJIaXN0b3JpemluZyIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFjY2Vzc0xldmVsRXgiIHR5cGU9Inhz +OnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQog +ICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJWYXJpYWJsZU5vZGUiIHR5cGU9InRuczpW +YXJpYWJsZU5vZGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZhcmlhYmxlVHlwZU5v +ZGUiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4 +dGVuc2lvbiBiYXNlPSJ0bnM6VHlwZU5vZGUiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InVhOlZhcmlhbnQiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhVHlwZSIgdHlwZT0idWE6 +Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlZhbHVlUmFuayIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXlEaW1lbnNpb25zIiB0eXBlPSJ1YTpMaXN0 +T2ZVSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iSXNBYnN0cmFjdCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAg +PC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iVmFyaWFibGVUeXBlTm9kZSIgdHlwZT0idG5zOlZhcmlhYmxlVHlwZU5vZGUiIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZVR5cGVOb2RlIj4NCiAgICA8eHM6Y29t +cGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5z +OlR5cGVOb2RlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50 +IG5hbWU9IklzQWJzdHJhY3QiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTeW1tZXRyaWMiIHR5cGU9InhzOmJvb2xlYW4iIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbnZlcnNlTmFtZSIg +dHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6 +Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +IlJlZmVyZW5jZVR5cGVOb2RlIiB0eXBlPSJ0bnM6UmVmZXJlbmNlVHlwZU5vZGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZE5vZGUiPg0KICAgIDx4czpjb21wbGV4Q29udGVu +dCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6SW5zdGFuY2VO +b2RlIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkV4ZWN1dGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VyRXhlY3V0YWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNp +b24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTWV0aG9kTm9kZSIgdHlwZT0idG5zOk1ldGhvZE5vZGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZpZXdOb2RlIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQg +bWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOkluc3RhbmNlTm9k +ZSI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJD +b250YWluc05vTG9vcHMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFdmVudE5vdGlmaWVyIiB0eXBlPSJ4czp1bnNpZ25lZEJ5 +dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6 +ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IlZpZXdOb2RlIiB0eXBlPSJ0bnM6Vmlld05vZGUiIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGFUeXBlTm9kZSI+DQogICAgPHhzOmNvbXBsZXhD +b250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpUeXBl +Tm9kZSI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJJc0Fic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVR5cGVEZWZpbml0aW9uIiB0eXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6 +c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50 +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhVHlwZU5vZGUi +IHR5cGU9InRuczpEYXRhVHlwZU5vZGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJl +ZmVyZW5jZU5vZGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlJlZmVyZW5jZVR5cGVJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSXNJbnZlcnNlIiB0eXBlPSJ4czpi +b29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUYXJnZXRJ +ZCIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iUmVmZXJlbmNlTm9kZSIgdHlwZT0idG5zOlJlZmVyZW5jZU5vZGUiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZmVyZW5jZU5vZGUiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZU5vZGUiIHR5cGU9InRuczpS +ZWZlcmVuY2VOb2RlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VOb2RlIiB0eXBlPSJ0bnM6TGlzdE9mUmVm +ZXJlbmNlTm9kZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iQXJndW1lbnQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlIiB0eXBlPSJ1YTpOb2Rl +SWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJWYWx1ZVJhbmsiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iQXJyYXlEaW1lbnNpb25zIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJE +ZXNjcmlwdGlvbiIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJBcmd1bWVudCIgdHlwZT0idG5zOkFyZ3VtZW50IiAvPg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBcmd1bWVudCI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXJndW1lbnQiIHR5cGU9InRuczpBcmd1bWVudCIgbWlu +T2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +TGlzdE9mQXJndW1lbnQiIHR5cGU9InRuczpMaXN0T2ZBcmd1bWVudCIgbmlsbGFibGU9InRydWUi +PjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW51bVZhbHVlVHlwZSI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9 +InhzOmxvbmciIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpc3Bs +YXlOYW1lIiB0eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InVhOkxv +Y2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRW51bVZh +bHVlVHlwZSIgdHlwZT0idG5zOkVudW1WYWx1ZVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZkVudW1WYWx1ZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IkVudW1WYWx1ZVR5cGUiIHR5cGU9InRuczpFbnVtVmFsdWVUeXBlIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZFbnVtVmFsdWVUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mRW51bVZhbHVlVHlwZSIgbmls +bGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW51 +bUZpZWxkIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4 +czpleHRlbnNpb24gYmFzZT0idG5zOkVudW1WYWx1ZVR5cGUiPg0KICAgICAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0K +ICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRW51bUZpZWxkIiB0eXBlPSJ0bnM6RW51 +bUZpZWxkIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZFbnVtRmllbGQiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkVudW1GaWVsZCIgdHlw +ZT0idG5zOkVudW1GaWVsZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRW51bUZpZWxkIiB0eXBlPSJ0bnM6TGlzdE9mRW51 +bUZpZWxkIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJPcHRpb25TZXQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlZhbHVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWxpZEJpdHMiIHR5cGU9Inhz +OmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJPcHRp +b25TZXQiIHR5cGU9InRuczpPcHRpb25TZXQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +Ikxpc3RPZk9wdGlvblNldCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iT3B0aW9uU2V0IiB0eXBlPSJ0bnM6T3B0aW9uU2V0IiBtaW5PY2N1cnM9IjAiIG1heE9j +Y3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0K +ICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZPcHRpb25TZXQi +IHR5cGU9InRuczpMaXN0T2ZPcHRpb25TZXQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+ +DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iTm9ybWFsaXplZFN0cmluZyIgdHlwZT0ieHM6c3RyaW5n +IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkRlY2ltYWxTdHJpbmciIHR5cGU9InhzOnN0cmlu +ZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEdXJhdGlvblN0cmluZyIgdHlwZT0ieHM6c3Ry +aW5nIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IlRpbWVTdHJpbmciIHR5cGU9InhzOnN0cmlu +ZyIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRlU3RyaW5nIiB0eXBlPSJ4czpzdHJpbmci +IC8+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iRHVyYXRpb24iIHR5cGU9InhzOmRvdWJsZSIgLz4N +Cg0KICA8eHM6ZWxlbWVudCBuYW1lPSJVdGNUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIgLz4NCg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJUaW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+DQoNCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iRGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIC8+DQoNCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTG9jYWxlSWQiIHR5cGU9InhzOnN0cmluZyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUg +bmFtZT0iVGltZVpvbmVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iT2Zmc2V0IiB0eXBlPSJ4czpzaG9ydCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF5bGlnaHRTYXZpbmdJbk9mZnNldCIgdHlwZT0ieHM6Ym9v +bGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl +eFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlRpbWVab25lRGF0YVR5cGUiIHR5cGU9InRuczpU +aW1lWm9uZURhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUaW1l +Wm9uZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJUaW1lWm9uZURhdGFUeXBlIiB0eXBlPSJ0bnM6VGltZVpvbmVEYXRhVHlwZSIgbWluT2NjdXJz +PSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9m +VGltZVpvbmVEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlRpbWVab25lRGF0YVR5cGUiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iSW5kZXgiIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IkludGVnZXJJZCIg +dHlwZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IkFwcGxp +Y2F0aW9uVHlwZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAg +ICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNlcnZlcl8wIiAvPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJDbGllbnRfMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xp +ZW50QW5kU2VydmVyXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NvdmVy +eVNlcnZlcl8zIiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb25UeXBlIiB0eXBlPSJ0bnM6QXBwbGljYXRp +b25UeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcHBsaWNhdGlvbkRlc2NyaXB0 +aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBcHBsaWNh +dGlvblVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHJvZHVjdFVyaSIgdHlwZT0ieHM6c3RyaW5nIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +QXBwbGljYXRpb25OYW1lIiB0eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb25UeXBl +IiB0eXBlPSJ0bnM6QXBwbGljYXRpb25UeXBlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJHYXRld2F5U2VydmVyVXJpIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaXNjb3Zl +cnlQcm9maWxlVXJpIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaXNjb3ZlcnlVcmxzIiB0eXBlPSJ1YTpM +aXN0T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQXBwbGlj +YXRpb25EZXNjcmlwdGlvbiIgdHlwZT0idG5zOkFwcGxpY2F0aW9uRGVzY3JpcHRpb24iIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFwcGxpY2F0aW9uRGVzY3JpcHRpb24iPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uRGVz +Y3JpcHRpb24iIHR5cGU9InRuczpBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAi +IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZBcHBs +aWNhdGlvbkRlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mQXBwbGljYXRpb25EZXNjcmlwdGlv +biIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iUmVxdWVzdEhlYWRlciI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iQXV0aGVudGljYXRpb25Ub2tlbiIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGltZXN0YW1wIiB0 +eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUmVxdWVzdEhhbmRsZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJldHVybkRpYWdub3N0aWNzIiB0eXBlPSJ4czp1bnNp +Z25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXVkaXRF +bnRyeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUaW1lb3V0SGludCIgdHlwZT0ieHM6dW5zaWduZWRJ +bnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxI +ZWFkZXIiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVzcG9uc2VIZWFkZXIiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRpbWVzdGFtcCIgdHlwZT0ieHM6ZGF0ZVRp +bWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIYW5k +bGUiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTZXJ2aWNlUmVzdWx0IiB0eXBlPSJ1YTpTdGF0dXNDb2RlIiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlRGlhZ25vc3RpY3MiIHR5cGU9 +InVhOkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RyaW5nVGFibGUiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkFkZGl0aW9uYWxIZWFkZXIiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3Bv +bnNlSGVhZGVyIiAvPg0KDQogIDx4czplbGVtZW50IG5hbWU9IlZlcnNpb25UaW1lIiB0eXBlPSJ4 +czp1bnNpZ25lZEludCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2VydmljZUZhdWx0 +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhl +YWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IlNlcnZpY2VGYXVsdCIgdHlwZT0idG5zOlNlcnZpY2VGYXVsdCIgLz4NCg0K +ICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2Vzc2lvbmxlc3NJbnZva2VSZXF1ZXN0VHlwZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXJpc1ZlcnNpb24iIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJOYW1lc3BhY2VVcmlzIiB0eXBlPSJ1YTpMaXN0T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXJVcmlzIiB0 +eXBlPSJ1YTpMaXN0T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGVJZHMiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlNlcnZpY2VJZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJT +ZXNzaW9ubGVzc0ludm9rZVJlcXVlc3RUeXBlIiB0eXBlPSJ0bnM6U2Vzc2lvbmxlc3NJbnZva2VS +ZXF1ZXN0VHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2Vzc2lvbmxlc3NJbnZv +a2VSZXNwb25zZVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9Ik5hbWVzcGFjZVVyaXMiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlclVyaXMiIHR5 +cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZpY2VJZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJTZXNzaW9ubGVzc0ludm9rZVJlc3BvbnNlVHlwZSIgdHlwZT0i +dG5zOlNlc3Npb25sZXNzSW52b2tlUmVzcG9uc2VUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJGaW5kU2VydmVyc1JlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +RW5kcG9pbnRVcmwiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvY2FsZUlkcyIgdHlwZT0idWE6TGlzdE9m +U3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iU2VydmVyVXJpcyIgdHlwZT0idWE6TGlzdE9mU3RyaW5nIiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5 +cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkZpbmRTZXJ2ZXJzUmVxdWVzdCIgdHlwZT0idG5zOkZp +bmRTZXJ2ZXJzUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmluZFNlcnZl +cnNSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +UmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlcnMiIHR5cGU9 +InRuczpMaXN0T2ZBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IkZpbmRTZXJ2ZXJzUmVzcG9uc2UiIHR5cGU9InRuczpGaW5kU2VydmVy +c1Jlc3BvbnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXJ2ZXJPbk5ldHdvcmsi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlY29yZElkIiB0 +eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU2VydmVyTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlzY292ZXJ5VXJsIiB0eXBlPSJ4 +czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTZXJ2ZXJDYXBhYmlsaXRpZXMiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXJPbk5ldHdvcmsiIHR5cGU9 +InRuczpTZXJ2ZXJPbk5ldHdvcmsiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RP +ZlNlcnZlck9uTmV0d29yayI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU2VydmVyT25OZXR3b3JrIiB0eXBlPSJ0bnM6U2VydmVyT25OZXR3b3JrIiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZTZXJ2ZXJPbk5ldHdvcmsiIHR5cGU9InRuczpMaXN0T2ZTZXJ2ZXJPbk5ldHdvcmsiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmRT +ZXJ2ZXJzT25OZXR3b3JrUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGFy +dGluZ1JlY29yZElkIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4UmVjb3Jkc1RvUmV0dXJuIiB0eXBlPSJ4czp1bnNpZ25l +ZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyQ2Fw +YWJpbGl0eUZpbHRlciIgdHlwZT0idWE6TGlzdE9mU3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9IkZpbmRTZXJ2ZXJzT25OZXR3b3JrUmVxdWVzdCIgdHlwZT0idG5z +OkZpbmRTZXJ2ZXJzT25OZXR3b3JrUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iRmluZFNlcnZlcnNPbk5ldHdvcmtSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhl +YWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9Ikxhc3RDb3VudGVyUmVzZXRUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVycyIgdHlwZT0idG5zOkxpc3RP +ZlNlcnZlck9uTmV0d29yayIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJG +aW5kU2VydmVyc09uTmV0d29ya1Jlc3BvbnNlIiB0eXBlPSJ0bnM6RmluZFNlcnZlcnNPbk5ldHdv +cmtSZXNwb25zZSIgLz4NCg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBcHBsaWNhdGlvbkluc3RhbmNl +Q2VydGlmaWNhdGUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgLz4NCg0KICA8eHM6c2ltcGxlVHlw +ZSAgbmFtZT0iTWVzc2FnZVNlY3VyaXR5TW9kZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9 +InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkludmFsaWRfMCIgLz4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZV8xIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJTaWduXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlNp +Z25BbmRFbmNyeXB0XzMiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNZXNzYWdlU2VjdXJpdHlNb2RlIiB0eXBlPSJ0bnM6 +TWVzc2FnZVNlY3VyaXR5TW9kZSIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iVXNlclRv +a2VuVHlwZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFub255bW91c18wIiAvPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJVc2VyTmFtZV8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJD +ZXJ0aWZpY2F0ZV8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJc3N1ZWRUb2tl +bl8zIiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iVXNlclRva2VuVHlwZSIgdHlwZT0idG5zOlVzZXJUb2tlblR5cGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlVzZXJUb2tlblBvbGljeSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUG9saWN5SWQiIHR5cGU9InhzOnN0cmlu +ZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlRva2VuVHlwZSIgdHlwZT0idG5zOlVzZXJUb2tlblR5cGUiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Iklzc3VlZFRva2VuVHlwZSIgdHlwZT0ieHM6c3RyaW5n +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iSXNzdWVyRW5kcG9pbnRVcmwiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlY3VyaXR5UG9saWN5VXJp +IiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +VXNlclRva2VuUG9saWN5IiB0eXBlPSJ0bnM6VXNlclRva2VuUG9saWN5IiAvPg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZVc2VyVG9rZW5Qb2xpY3kiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJUb2tlblBvbGljeSIgdHlwZT0idG5zOlVz +ZXJUb2tlblBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVXNlclRva2VuUG9saWN5IiB0eXBlPSJ0bnM6TGlzdE9m +VXNlclRva2VuUG9saWN5IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJFbmRwb2ludERlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRwb2ludFVybCIgdHlwZT0ieHM6c3RyaW5nIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +U2VydmVyIiB0eXBlPSJ0bnM6QXBwbGljYXRpb25EZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlckNlcnRpZmlj +YXRlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZWN1cml0eU1vZGUiIHR5cGU9InRuczpNZXNz +YWdlU2VjdXJpdHlNb2RlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJTZWN1cml0eVBvbGljeVVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlcklkZW50aXR5VG9rZW5z +IiB0eXBlPSJ0bnM6TGlzdE9mVXNlclRva2VuUG9saWN5IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNwb3J0UHJvZmlsZVVyaSIg +dHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlMZXZlbCIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kcG9pbnREZXNjcmlwdGlvbiIgdHlwZT0idG5zOkVuZHBv +aW50RGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkVuZHBv +aW50RGVzY3JpcHRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkVuZHBvaW50RGVzY3JpcHRpb24iIHR5cGU9InRuczpFbmRwb2ludERlc2NyaXB0aW9uIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZFbmRwb2ludERlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mRW5kcG9pbnREZXNj +cmlwdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iR2V0RW5kcG9pbnRzUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJFbmRwb2ludFVybCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTG9jYWxlSWRzIiB0eXBlPSJ1YTpMaXN0 +T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJQcm9maWxlVXJpcyIgdHlwZT0idWE6TGlzdE9mU3RyaW5nIiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxl +eFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkdldEVuZHBvaW50c1JlcXVlc3QiIHR5cGU9InRu +czpHZXRFbmRwb2ludHNSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJHZXRF +bmRwb2ludHNSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuZHBvaW50 +cyIgdHlwZT0idG5zOkxpc3RPZkVuZHBvaW50RGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iR2V0RW5kcG9pbnRzUmVzcG9uc2UiIHR5cGU9InRuczpHZXRF +bmRwb2ludHNSZXNwb25zZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVnaXN0ZXJl +ZFNlcnZlciI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2Vy +dmVyVXJpIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQcm9kdWN0VXJpIiB0eXBlPSJ4czpzdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJT +ZXJ2ZXJOYW1lcyIgdHlwZT0idWE6TGlzdE9mTG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlclR5cGUiIHR5 +cGU9InRuczpBcHBsaWNhdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkdhdGV3YXlTZXJ2ZXJVcmkiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpc2NvdmVyeVVy +bHMiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlbWFwaG9yZUZpbGVQYXRoIiB0eXBlPSJ4czpz +dHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJJc09ubGluZSIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +IlJlZ2lzdGVyZWRTZXJ2ZXIiIHR5cGU9InRuczpSZWdpc3RlcmVkU2VydmVyIiAvPg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZSZWdpc3RlcmVkU2VydmVyIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWdpc3RlcmVkU2VydmVyIiB0eXBlPSJ0 +bnM6UmVnaXN0ZXJlZFNlcnZlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mUmVnaXN0ZXJlZFNlcnZlciIgdHlwZT0idG5z +Okxpc3RPZlJlZ2lzdGVyZWRTZXJ2ZXIiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyU2VydmVyUmVxdWVzdCI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0i +dG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXIiIHR5cGU9InRuczpSZWdpc3RlcmVkU2VydmVyIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlZ2lzdGVyU2VydmVyUmVxdWVz +dCIgdHlwZT0idG5zOlJlZ2lzdGVyU2VydmVyUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iUmVnaXN0ZXJTZXJ2ZXJSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhl +YWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZWdpc3RlclNlcnZl +clJlc3BvbnNlIiB0eXBlPSJ0bnM6UmVnaXN0ZXJTZXJ2ZXJSZXNwb25zZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iRGlzY292ZXJ5Q29uZmlndXJhdGlvbiI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkRpc2NvdmVyeUNvbmZpZ3VyYXRpb24iIHR5cGU9InRuczpEaXNjb3ZlcnlDb25m +aWd1cmF0aW9uIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJNZG5zRGlzY292ZXJ5Q29u +ZmlndXJhdGlvbiI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAg +ICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpEaXNjb3ZlcnlDb25maWd1cmF0aW9uIj4NCiAgICAg +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1kbnNTZXJ2ZXJO +YW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyQ2FwYWJpbGl0aWVzIiB0eXBlPSJ1YTpM +aXN0T2ZTdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwv +eHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250 +ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNZG5zRGlzY292 +ZXJ5Q29uZmlndXJhdGlvbiIgdHlwZT0idG5zOk1kbnNEaXNjb3ZlcnlDb25maWd1cmF0aW9uIiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWdpc3RlclNlcnZlcjJSZXF1ZXN0Ij4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0 +eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlciIgdHlwZT0idG5zOlJlZ2lzdGVyZWRTZXJ2 +ZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJEaXNjb3ZlcnlDb25maWd1cmF0aW9uIiB0eXBlPSJ1YTpMaXN0T2ZFeHRlbnNpb25PYmpl +Y3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUmVnaXN0ZXJTZXJ2ZXIy +UmVxdWVzdCIgdHlwZT0idG5zOlJlZ2lzdGVyU2VydmVyMlJlcXVlc3QiIC8+DQoNCiAgPHhzOmNv +bXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyU2VydmVyMlJlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJl +c3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iQ29uZmlndXJhdGlvblJlc3VsdHMiIHR5cGU9InVhOkxpc3RPZlN0YXR1 +c0NvZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlZ2lzdGVyU2VydmVyMlJlc3Bv +bnNlIiB0eXBlPSJ0bnM6UmVnaXN0ZXJTZXJ2ZXIyUmVzcG9uc2UiIC8+DQoNCiAgPHhzOnNpbXBs +ZVR5cGUgIG5hbWU9IlNlY3VyaXR5VG9rZW5SZXF1ZXN0VHlwZSI+DQogICAgPHhzOnJlc3RyaWN0 +aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Iklzc3Vl +XzAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJlbmV3XzEiIC8+DQogICAgPC94 +czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJT +ZWN1cml0eVRva2VuUmVxdWVzdFR5cGUiIHR5cGU9InRuczpTZWN1cml0eVRva2VuUmVxdWVzdFR5 +cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNoYW5uZWxTZWN1cml0eVRva2VuIj4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDaGFubmVsSWQiIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJUb2tlbklkIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iQ3JlYXRlZEF0IiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV2aXNlZExpZmV0aW1lIiB0eXBl +PSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkNoYW5uZWxTZWN1cml0eVRv +a2VuIiB0eXBlPSJ0bnM6Q2hhbm5lbFNlY3VyaXR5VG9rZW4iIC8+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9Ik9wZW5TZWN1cmVDaGFubmVsUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RI +ZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJDbGllbnRQcm90b2NvbFZlcnNpb24iIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0VHlwZSIgdHlwZT0i +dG5zOlNlY3VyaXR5VG9rZW5SZXF1ZXN0VHlwZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlNb2RlIiB0eXBlPSJ0bnM6TWVzc2FnZVNlY3VyaXR5TW9k +ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ2xpZW50Tm9uY2Ui +IHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RlZExpZmV0aW1lIiB0eXBlPSJ4czp1bnNp +Z25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ik9wZW5TZWN1cmVDaGFubmVsUmVxdWVzdCIg +dHlwZT0idG5zOk9wZW5TZWN1cmVDaGFubmVsUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iT3BlblNlY3VyZUNoYW5uZWxSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25z +ZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlNlcnZlclByb3RvY29sVmVyc2lvbiIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlY3VyaXR5VG9rZW4iIHR5 +cGU9InRuczpDaGFubmVsU2VjdXJpdHlUb2tlbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlck5vbmNlIiB0eXBlPSJ4czpiYXNl +NjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iT3BlblNlY3Vy +ZUNoYW5uZWxSZXNwb25zZSIgdHlwZT0idG5zOk9wZW5TZWN1cmVDaGFubmVsUmVzcG9uc2UiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNsb3NlU2VjdXJlQ2hhbm5lbFJlcXVlc3QiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIi +IHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IkNsb3NlU2VjdXJlQ2hhbm5lbFJlcXVlc3QiIHR5cGU9InRuczpDbG9zZVNlY3VyZUNo +YW5uZWxSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJDbG9zZVNlY3VyZUNo +YW5uZWxSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDbG9zZVNlY3VyZUNoYW5uZWxSZXNwb25zZSIgdHlw +ZT0idG5zOkNsb3NlU2VjdXJlQ2hhbm5lbFJlc3BvbnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJTaWduZWRTb2Z0d2FyZUNlcnRpZmljYXRlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDZXJ0aWZpY2F0ZURhdGEiIHR5cGU9InhzOmJhc2U2NEJp +bmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlNpZ25hdHVyZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IlNpZ25lZFNvZnR3YXJlQ2VydGlmaWNhdGUiIHR5cGU9InRu +czpTaWduZWRTb2Z0d2FyZUNlcnRpZmljYXRlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJMaXN0T2ZTaWduZWRTb2Z0d2FyZUNlcnRpZmljYXRlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTaWduZWRTb2Z0d2FyZUNlcnRpZmljYXRlIiB0eXBlPSJ0 +bnM6U2lnbmVkU29mdHdhcmVDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2lnbmVkU29mdHdhcmVDZXJ0 +aWZpY2F0ZSIgdHlwZT0idG5zOkxpc3RPZlNpZ25lZFNvZnR3YXJlQ2VydGlmaWNhdGUiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmVsZW1lbnQgbmFtZT0iU2Vzc2lvbkF1 +dGhlbnRpY2F0aW9uVG9rZW4iIHR5cGU9InVhOk5vZGVJZCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iU2lnbmF0dXJlRGF0YSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iQWxnb3JpdGhtIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTaWduYXR1cmUiIHR5cGU9 +InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJT +aWduYXR1cmVEYXRhIiB0eXBlPSJ0bnM6U2lnbmF0dXJlRGF0YSIgLz4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iQ3JlYXRlU2Vzc2lvblJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iQ2xpZW50RGVzY3JpcHRpb24iIHR5cGU9InRuczpBcHBsaWNhdGlvbkRlc2NyaXB0aW9u +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iU2VydmVyVXJpIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRwb2ludFVybCIgdHlwZT0ieHM6c3Ry +aW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU2Vzc2lvbk5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNsaWVudE5vbmNlIiB0eXBlPSJ4 +czpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJDbGllbnRDZXJ0aWZpY2F0ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5 +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUmVxdWVzdGVkU2Vzc2lvblRpbWVvdXQiIHR5cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4UmVzcG9uc2VNZXNzYWdlU2l6ZSIgdHlw +ZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0K +ICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDcmVhdGVTZXNzaW9uUmVx +dWVzdCIgdHlwZT0idG5zOkNyZWF0ZVNlc3Npb25SZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJDcmVhdGVTZXNzaW9uUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VI +ZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJTZXNzaW9uSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uVG9rZW4i +IHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJldmlzZWRTZXNzaW9uVGltZW91dCIgdHlwZT0ieHM6ZG91Ymxl +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXJOb25jZSIg +dHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyQ2VydGlmaWNhdGUiIHR5cGU9InhzOmJhc2U2 +NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlNlcnZlckVuZHBvaW50cyIgdHlwZT0idG5zOkxpc3RPZkVuZHBvaW50RGVzY3Jp +cHRpb24iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJTZXJ2ZXJTb2Z0d2FyZUNlcnRpZmljYXRlcyIgdHlwZT0idG5zOkxpc3RPZlNpZ25l +ZFNvZnR3YXJlQ2VydGlmaWNhdGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXJTaWduYXR1cmUiIHR5cGU9InRuczpTaWduYXR1 +cmVEYXRhIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iTWF4UmVxdWVzdE1lc3NhZ2VTaXplIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9IkNyZWF0ZVNlc3Npb25SZXNwb25zZSIgdHlwZT0idG5zOkNyZWF0 +ZVNlc3Npb25SZXNwb25zZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVXNlcklkZW50 +aXR5VG9rZW4iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBv +bGljeUlkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iVXNlcklkZW50aXR5VG9rZW4iIHR5cGU9InRuczpVc2VySWRlbnRpdHlUb2tlbiIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQW5vbnltb3VzSWRlbnRpdHlUb2tlbiI+DQogICAg +PHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJh +c2U9InRuczpVc2VySWRlbnRpdHlUb2tlbiI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +ICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxl +eENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkFub255 +bW91c0lkZW50aXR5VG9rZW4iIHR5cGU9InRuczpBbm9ueW1vdXNJZGVudGl0eVRva2VuIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJVc2VyTmFtZUlkZW50aXR5VG9rZW4iPg0KICAgIDx4 +czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNl +PSJ0bnM6VXNlcklkZW50aXR5VG9rZW4iPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iVXNlck5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQYXNz +d29yZCIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuY3J5cHRpb25BbGdvcml0aG0iIHR5 +cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAg +PC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENv +bnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVzZXJOYW1l +SWRlbnRpdHlUb2tlbiIgdHlwZT0idG5zOlVzZXJOYW1lSWRlbnRpdHlUb2tlbiIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iWDUwOUlkZW50aXR5VG9rZW4iPg0KICAgIDx4czpjb21wbGV4 +Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6VXNl +cklkZW50aXR5VG9rZW4iPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iQ2VydGlmaWNhdGVEYXRhIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAg +ICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJYNTA5SWRlbnRpdHlUb2tlbiIgdHlwZT0idG5z +Olg1MDlJZGVudGl0eVRva2VuIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJc3N1ZWRJ +ZGVudGl0eVRva2VuIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAg +ICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOlVzZXJJZGVudGl0eVRva2VuIj4NCiAgICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRva2VuRGF0YSIgdHlw +ZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuY3J5cHRpb25BbGdvcml0aG0iIHR5cGU9InhzOnN0 +cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1 +ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Iklzc3VlZElkZW50aXR5VG9r +ZW4iIHR5cGU9InRuczpJc3N1ZWRJZGVudGl0eVRva2VuIiAvPg0KDQogIDx4czplbGVtZW50IG5h +bWU9IlJzYUVuY3J5cHRlZFNlY3JldCIgdHlwZT0idWE6VmFyaWFudCIgLz4NCg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJFY2NFbmNyeXB0ZWRTZWNyZXQiIHR5cGU9InVhOlZhcmlhbnQiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2YXRlU2Vzc2lvblJlcXVlc3QiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRu +czpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iQ2xpZW50U2lnbmF0dXJlIiB0eXBlPSJ0bnM6U2lnbmF0dXJlRGF0 +YSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkNsaWVudFNvZnR3YXJlQ2VydGlmaWNhdGVzIiB0eXBlPSJ0bnM6TGlzdE9mU2lnbmVkU29m +dHdhcmVDZXJ0aWZpY2F0ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IkxvY2FsZUlkcyIgdHlwZT0idWE6TGlzdE9mU3RyaW5nIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXNl +cklkZW50aXR5VG9rZW4iIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJUb2tlblNpZ25h +dHVyZSIgdHlwZT0idG5zOlNpZ25hdHVyZURhdGEiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iQWN0aXZhdGVTZXNzaW9uUmVxdWVzdCIgdHlwZT0idG5zOkFjdGl2YXRlU2Vz +c2lvblJlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2YXRlU2Vzc2lv +blJlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJS +ZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyTm9uY2UiIHR5 +cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3VsdHMiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0NvZGUi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJEaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29t +cGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkFjdGl2YXRlU2Vzc2lvblJlc3BvbnNlIiB0 +eXBlPSJ0bnM6QWN0aXZhdGVTZXNzaW9uUmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IkNsb3NlU2Vzc2lvblJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +RGVsZXRlU3Vic2NyaXB0aW9ucyIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IkNsb3NlU2Vzc2lvblJlcXVlc3QiIHR5cGU9InRuczpDbG9zZVNlc3Npb25SZXF1ZXN0IiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJDbG9zZVNlc3Npb25SZXNwb25zZSI+DQogICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5 +cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJDbG9zZVNlc3Npb25SZXNwb25zZSIgdHlwZT0idG5zOkNsb3NlU2Vzc2lvblJlc3BvbnNl +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJDYW5jZWxSZXF1ZXN0Ij4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0 +bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIYW5kbGUiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FuY2VsUmVxdWVzdCIgdHlwZT0idG5zOkNhbmNlbFJlcXVl +c3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNhbmNlbFJlc3BvbnNlIj4NCiAgICA8 +eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlw +ZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FuY2VsQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50 +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FuY2VsUmVzcG9uc2UiIHR5cGU9InRuczpDYW5jZWxS +ZXNwb25zZSIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iTm9kZUF0dHJpYnV0ZXNNYXNr +Ij4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVt +ZXJhdGlvbiB2YWx1ZT0iTm9uZV8wIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJB +Y2Nlc3NMZXZlbF8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBcnJheURpbWVu +c2lvbnNfMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQnJvd3NlTmFtZV80IiAv +Pg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDb250YWluc05vTG9vcHNfOCIgLz4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGF0YVR5cGVfMTYiIC8+DQogICAgICA8eHM6ZW51 +bWVyYXRpb24gdmFsdWU9IkRlc2NyaXB0aW9uXzMyIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9u +IHZhbHVlPSJEaXNwbGF5TmFtZV82NCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0i +RXZlbnROb3RpZmllcl8xMjgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkV4ZWN1 +dGFibGVfMjU2IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJIaXN0b3JpemluZ181 +MTIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkludmVyc2VOYW1lXzEwMjQiIC8+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IklzQWJzdHJhY3RfMjA0OCIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTWluaW11bVNhbXBsaW5nSW50ZXJ2YWxfNDA5NiIgLz4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9kZUNsYXNzXzgxOTIiIC8+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5vZGVJZF8xNjM4NCIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iU3ltbWV0cmljXzMyNzY4IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZh +bHVlPSJVc2VyQWNjZXNzTGV2ZWxfNjU1MzYiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFs +dWU9IlVzZXJFeGVjdXRhYmxlXzEzMTA3MiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1 +ZT0iVXNlcldyaXRlTWFza18yNjIxNDQiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9 +IlZhbHVlUmFua181MjQyODgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IldyaXRl +TWFza18xMDQ4NTc2IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWYWx1ZV8yMDk3 +MTUyIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJEYXRhVHlwZURlZmluaXRpb25f +NDE5NDMwNCIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUm9sZVBlcm1pc3Npb25z +XzgzODg2MDgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFjY2Vzc1Jlc3RyaWN0 +aW9uc18xNjc3NzIxNiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsXzMzNTU0 +NDMxIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCYXNlTm9kZV8yNjUwMTIyMCIg +Lz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT2JqZWN0XzI2NTAxMzQ4IiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJPYmplY3RUeXBlXzI2NTAzMjY4IiAvPg0KICAgICAg +PHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWYXJpYWJsZV8yNjU3MTM4MyIgLz4NCiAgICAgIDx4czpl +bnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVUeXBlXzI4NjAwNDM4IiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJNZXRob2RfMjY2MzI1NDgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9IlJlZmVyZW5jZVR5cGVfMjY1MzcwNjAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9IlZpZXdfMjY1MDEzNTYiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94 +czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlQXR0cmlidXRlc01hc2siIHR5 +cGU9InRuczpOb2RlQXR0cmlidXRlc01hc2siIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +Ik5vZGVBdHRyaWJ1dGVzIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJTcGVjaWZpZWRBdHRyaWJ1dGVzIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlzcGxheU5hbWUiIHR5cGU9InVhOkxv +Y2FsaXplZFRleHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IldyaXRl +TWFzayIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlVzZXJXcml0ZU1hc2siIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTm9kZUF0dHJpYnV0ZXMiIHR5cGU9InRuczpOb2RlQXR0cmlidXRlcyIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0QXR0cmlidXRlcyI+DQogICAgPHhz +OmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9 +InRuczpOb2RlQXR0cmlidXRlcyI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJFdmVudE5vdGlmaWVyIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5z +aW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9Ik9iamVjdEF0dHJpYnV0ZXMiIHR5cGU9InRuczpPYmplY3RBdHRyaWJ1 +dGVzIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJWYXJpYWJsZUF0dHJpYnV0ZXMiPg0K +ICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lv +biBiYXNlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InVhOlZhcmlhbnQiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhVHlwZSIgdHlwZT0idWE6 +Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlZhbHVlUmFuayIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXJyYXlEaW1lbnNpb25zIiB0eXBlPSJ1YTpMaXN0 +T2ZVSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iQWNjZXNzTGV2ZWwiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJBY2Nlc3NMZXZlbCIg +dHlwZT0ieHM6dW5zaWduZWRCeXRlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iTWluaW11bVNhbXBsaW5nSW50ZXJ2YWwiIHR5cGU9InhzOmRvdWJsZSIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ikhpc3Rvcml6aW5nIiB0 +eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+ +DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJWYXJpYWJsZUF0dHJpYnV0ZXMiIHR5 +cGU9InRuczpWYXJpYWJsZUF0dHJpYnV0ZXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +Ik1ldGhvZEF0dHJpYnV0ZXMiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2Ui +Pg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0KICAgICAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXhlY3V0YWJsZSIg +dHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlVzZXJFeGVjdXRhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hz +OmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJNZXRob2RBdHRyaWJ1dGVzIiB0eXBlPSJ0bnM6TWV0aG9kQXR0cmlidXRlcyIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0VHlwZUF0dHJpYnV0ZXMiPg0KICAgIDx4czpjb21w +bGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6 +Tm9kZUF0dHJpYnV0ZXMiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iSXNBYnN0cmFjdCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94 +czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iT2JqZWN0VHlwZUF0dHJpYnV0ZXMiIHR5cGU9InRuczpPYmplY3RUeXBlQXR0cmlidXRlcyIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVmFyaWFibGVUeXBlQXR0cmlidXRlcyI+DQog +ICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9u +IGJhc2U9InRuczpOb2RlQXR0cmlidXRlcyI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlIiB0eXBlPSJ1YTpO +b2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iVmFsdWVSYW5rIiB0eXBlPSJ4czppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBcnJheURpbWVuc2lvbnMiIHR5cGU9InVhOkxpc3RP +ZlVJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJJc0Fic3RyYWN0IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8 +L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJWYXJpYWJsZVR5cGVBdHRyaWJ1dGVzIiB0eXBlPSJ0bnM6VmFyaWFibGVUeXBlQXR0cmli +dXRlcyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlVHlwZUF0dHJpYnV0 +ZXMiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4 +dGVuc2lvbiBiYXNlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSXNBYnN0cmFjdCIgdHlwZT0ieHM6Ym9vbGVh +biIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlN5bW1ldHJp +YyIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkludmVyc2VOYW1lIiB0eXBlPSJ1YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94 +czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUF0dHJpYnV0ZXMiIHR5cGU9InRu +czpSZWZlcmVuY2VUeXBlQXR0cmlidXRlcyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +RGF0YVR5cGVBdHRyaWJ1dGVzIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNl +Ij4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOk5vZGVBdHRyaWJ1dGVzIj4NCiAgICAg +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IklzQWJzdHJhY3Qi +IHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5j +ZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRhdGFUeXBlQXR0cmlidXRlcyIg +dHlwZT0idG5zOkRhdGFUeXBlQXR0cmlidXRlcyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iVmlld0F0dHJpYnV0ZXMiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2Ui +Pg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6Tm9kZUF0dHJpYnV0ZXMiPg0KICAgICAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ29udGFpbnNOb0xv +b3BzIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iRXZlbnROb3RpZmllciIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4N +CiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJWaWV3QXR0cmlidXRlcyIgdHlwZT0idG5zOlZpZXdBdHRyaWJ1dGVzIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJHZW5lcmljQXR0cmlidXRlVmFsdWUiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkF0dHJpYnV0ZUlkIiB0eXBlPSJ4 +czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +VmFsdWUiIHR5cGU9InVhOlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJHZW5lcmljQXR0 +cmlidXRlVmFsdWUiIHR5cGU9InRuczpHZW5lcmljQXR0cmlidXRlVmFsdWUiIC8+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkdlbmVyaWNBdHRyaWJ1dGVWYWx1ZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iR2VuZXJpY0F0dHJpYnV0ZVZhbHVl +IiB0eXBlPSJ0bnM6R2VuZXJpY0F0dHJpYnV0ZVZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vy +cz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8 +L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZHZW5lcmljQXR0cmli +dXRlVmFsdWUiIHR5cGU9InRuczpMaXN0T2ZHZW5lcmljQXR0cmlidXRlVmFsdWUiIG5pbGxhYmxl +PSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkdlbmVyaWNB +dHRyaWJ1dGVzIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAg +IDx4czpleHRlbnNpb24gYmFzZT0idG5zOk5vZGVBdHRyaWJ1dGVzIj4NCiAgICAgICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF0dHJpYnV0ZVZhbHVlcyIgdHlw +ZT0idG5zOkxpc3RPZkdlbmVyaWNBdHRyaWJ1dGVWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9u +Pg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IkdlbmVyaWNBdHRyaWJ1dGVzIiB0eXBlPSJ0bnM6R2VuZXJpY0F0dHJpYnV0 +ZXMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFkZE5vZGVzSXRlbSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUGFyZW50Tm9kZUlkIiB0eXBlPSJ1 +YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVR5cGVJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVx +dWVzdGVkTmV3Tm9kZUlkIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZU5hbWUiIHR5 +cGU9InVhOlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlQ2xhc3MiIHR5cGU9InRuczpOb2RlQ2xhc3MiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVBdHRyaWJ1dGVzIiB0 +eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUeXBlRGVmaW5pdGlvbiIgdHlwZT0idWE6RXhwYW5k +ZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTm9kZXNJ +dGVtIiB0eXBlPSJ0bnM6QWRkTm9kZXNJdGVtIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJMaXN0T2ZBZGROb2Rlc0l0ZW0iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkFkZE5vZGVzSXRlbSIgdHlwZT0idG5zOkFkZE5vZGVzSXRlbSIgbWluT2NjdXJz +PSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9m +QWRkTm9kZXNJdGVtIiB0eXBlPSJ0bnM6TGlzdE9mQWRkTm9kZXNJdGVtIiBuaWxsYWJsZT0idHJ1 +ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGROb2Rlc1Jlc3Vs +dCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29k +ZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iQWRkZWROb2RlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROb2Rlc1Jlc3VsdCIgdHlwZT0idG5zOkFkZE5vZGVzUmVz +dWx0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZBZGROb2Rlc1Jlc3VsdCI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTm9kZXNSZXN1 +bHQiIHR5cGU9InRuczpBZGROb2Rlc1Jlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVu +Ym91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQWRkTm9kZXNSZXN1bHQiIHR5 +cGU9InRuczpMaXN0T2ZBZGROb2Rlc1Jlc3VsdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWRkTm9kZXNSZXF1ZXN0Ij4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0 +bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik5vZGVzVG9BZGQiIHR5cGU9InRuczpMaXN0T2ZBZGROb2Rlc0l0 +ZW0iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTm9kZXNSZXF1ZXN0 +IiB0eXBlPSJ0bnM6QWRkTm9kZXNSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJBZGROb2Rlc1Jlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzdWx0 +cyIgdHlwZT0idG5zOkxpc3RPZkFkZE5vZGVzUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBl +PSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJBZGROb2Rlc1Jlc3BvbnNlIiB0eXBlPSJ0bnM6QWRkTm9kZXNSZXNwb25zZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWRkUmVmZXJlbmNlc0l0ZW0iPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNvdXJjZU5vZGVJZCIgdHlwZT0idWE6 +Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iUmVmZXJlbmNlVHlwZUlkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJc0ZvcndhcmQiIHR5 +cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlRhcmdldFNlcnZlclVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGFyZ2V0Tm9kZUlkIiB0eXBlPSJ1 +YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlRhcmdldE5vZGVDbGFzcyIgdHlwZT0idG5zOk5vZGVDbGFzcyIg +bWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IkFkZFJlZmVyZW5jZXNJdGVtIiB0eXBlPSJ0bnM6QWRkUmVm +ZXJlbmNlc0l0ZW0iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkFkZFJlZmVy +ZW5jZXNJdGVtIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJB +ZGRSZWZlcmVuY2VzSXRlbSIgdHlwZT0idG5zOkFkZFJlZmVyZW5jZXNJdGVtIiBtaW5PY2N1cnM9 +IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZB +ZGRSZWZlcmVuY2VzSXRlbSIgdHlwZT0idG5zOkxpc3RPZkFkZFJlZmVyZW5jZXNJdGVtIiBuaWxs +YWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGRS +ZWZlcmVuY2VzUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2Vz +VG9BZGQiIHR5cGU9InRuczpMaXN0T2ZBZGRSZWZlcmVuY2VzSXRlbSIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRSZWZlcmVuY2VzUmVxdWVzdCIgdHlwZT0idG5zOkFk +ZFJlZmVyZW5jZXNSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGRSZWZl +cmVuY2VzUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0 +eXBlPSJ1YTpMaXN0T2ZTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpMaXN0 +T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJB +ZGRSZWZlcmVuY2VzUmVzcG9uc2UiIHR5cGU9InRuczpBZGRSZWZlcmVuY2VzUmVzcG9uc2UiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGV0ZU5vZGVzSXRlbSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZUlkIiB0eXBlPSJ1YTpOb2RlSWQi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJEZWxldGVUYXJnZXRSZWZlcmVuY2VzIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iRGVsZXRlTm9kZXNJdGVtIiB0eXBlPSJ0bnM6RGVsZXRlTm9kZXNJdGVtIiAvPg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZEZWxldGVOb2Rlc0l0ZW0iPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRlbGV0ZU5vZGVzSXRlbSIgdHlw +ZT0idG5zOkRlbGV0ZU5vZGVzSXRlbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRl +ZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4 +VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRGVsZXRlTm9kZXNJdGVtIiB0eXBlPSJ0 +bnM6TGlzdE9mRGVsZXRlTm9kZXNJdGVtIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0K +DQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWxldGVOb2Rlc1JlcXVlc3QiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRu +czpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iTm9kZXNUb0RlbGV0ZSIgdHlwZT0idG5zOkxpc3RPZkRlbGV0ZU5v +ZGVzSXRlbSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEZWxldGVOb2Rl +c1JlcXVlc3QiIHR5cGU9InRuczpEZWxldGVOb2Rlc1JlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9IkRlbGV0ZU5vZGVzUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VI +ZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0lu +Zm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJEZWxldGVOb2Rlc1Jlc3BvbnNlIiB0eXBlPSJ0bnM6RGVsZXRlTm9k +ZXNSZXNwb25zZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRGVsZXRlUmVmZXJlbmNl +c0l0ZW0iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNvdXJj +ZU5vZGVJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUlkIiB0eXBlPSJ1YTpOb2Rl +SWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJJc0ZvcndhcmQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlRhcmdldE5vZGVJZCIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJEZWxldGVCaWRpcmVjdGlvbmFsIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iRGVsZXRlUmVmZXJlbmNlc0l0ZW0iIHR5cGU9InRuczpEZWxldGVSZWZlcmVuY2VzSXRl +bSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRGVsZXRlUmVmZXJlbmNlc0l0 +ZW0iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRlbGV0ZVJl +ZmVyZW5jZXNJdGVtIiB0eXBlPSJ0bnM6RGVsZXRlUmVmZXJlbmNlc0l0ZW0iIG1pbk9jY3Vycz0i +MCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkRl +bGV0ZVJlZmVyZW5jZXNJdGVtIiB0eXBlPSJ0bnM6TGlzdE9mRGVsZXRlUmVmZXJlbmNlc0l0ZW0i +IG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +IkRlbGV0ZVJlZmVyZW5jZXNSZXF1ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJl +ZmVyZW5jZXNUb0RlbGV0ZSIgdHlwZT0idG5zOkxpc3RPZkRlbGV0ZVJlZmVyZW5jZXNJdGVtIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRlbGV0ZVJlZmVyZW5jZXNSZXF1 +ZXN0IiB0eXBlPSJ0bnM6RGVsZXRlUmVmZXJlbmNlc1JlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9IkRlbGV0ZVJlZmVyZW5jZXNSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNw +b25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlJlc3VsdHMiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0NvZGUiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9z +dGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IkRlbGV0ZVJlZmVyZW5jZXNSZXNwb25zZSIgdHlwZT0idG5z +OkRlbGV0ZVJlZmVyZW5jZXNSZXNwb25zZSIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0i +QXR0cmlidXRlV3JpdGVNYXNrIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWdu +ZWRJbnQiPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iQXR0cmlidXRlV3JpdGVNYXNrIiB0eXBlPSJ0bnM6QXR0cmlidXRlV3Jp +dGVNYXNrIiAvPg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJCcm93c2VEaXJlY3Rpb24iPg0K +ICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJGb3J3YXJkXzAiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Iklu +dmVyc2VfMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQm90aF8yIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJbnZhbGlkXzMiIC8+DQogICAgPC94czpyZXN0cmlj +dGlvbj4NCiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VEaXJl +Y3Rpb24iIHR5cGU9InRuczpCcm93c2VEaXJlY3Rpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IlZpZXdEZXNjcmlwdGlvbiI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iVmlld0lkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUaW1lc3RhbXAiIHR5cGU9Inhz +OmRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWaWV3 +VmVyc2lvbiIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJWaWV3 +RGVzY3JpcHRpb24iIHR5cGU9InRuczpWaWV3RGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9IkJyb3dzZURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZURpcmVj +dGlvbiIgdHlwZT0idG5zOkJyb3dzZURpcmVjdGlvbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUlkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbmNs +dWRlU3VidHlwZXMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9Ik5vZGVDbGFzc01hc2siIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRNYXNrIiB0eXBlPSJ4 +czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZURlc2NyaXB0aW9uIiB0 +eXBlPSJ0bnM6QnJvd3NlRGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +Ikxpc3RPZkJyb3dzZURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJCcm93c2VEZXNjcmlwdGlvbiIgdHlwZT0idG5zOkJyb3dzZURlc2NyaXB0 +aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJMaXN0T2ZCcm93c2VEZXNjcmlwdGlvbiIgdHlwZT0idG5zOkxpc3RPZkJyb3dzZURl +c2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpzaW1wbGVU +eXBlICBuYW1lPSJCcm93c2VSZXN1bHRNYXNrIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0i +eHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZV8wIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VUeXBlSWRfMSIgLz4NCiAgICAgIDx4 +czplbnVtZXJhdGlvbiB2YWx1ZT0iSXNGb3J3YXJkXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRp +b24gdmFsdWU9Ik5vZGVDbGFzc180IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJC +cm93c2VOYW1lXzgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BsYXlOYW1l +XzE2IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUeXBlRGVmaW5pdGlvbl8zMiIg +Lz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWxsXzYzIiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VUeXBlSW5mb18zIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJUYXJnZXRJbmZvXzYwIiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQog +IDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlUmVzdWx0TWFzayIg +dHlwZT0idG5zOkJyb3dzZVJlc3VsdE1hc2siIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +IlJlZmVyZW5jZURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJSZWZlcmVuY2VUeXBlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IklzRm9yd2FyZCIg +dHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iTm9kZUlkIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZU5hbWUiIHR5cGU9InVh +OlF1YWxpZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJEaXNwbGF5TmFtZSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5v +ZGVDbGFzcyIgdHlwZT0idG5zOk5vZGVDbGFzcyIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iVHlwZURlZmluaXRpb24iIHR5cGU9InVhOkV4cGFuZGVkTm9kZUlkIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwv +eHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZURlc2NyaXB0aW9u +IiB0eXBlPSJ0bnM6UmVmZXJlbmNlRGVzY3JpcHRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZlJlZmVyZW5jZURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VEZXNjcmlwdGlvbiIgdHlwZT0idG5zOlJl +ZmVyZW5jZURlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWZlcmVuY2VEZXNjcmlwdGlvbiIgdHlwZT0i +dG5zOkxpc3RPZlJlZmVyZW5jZURlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVt +ZW50Pg0KDQogIDx4czplbGVtZW50IG5hbWU9IkNvbnRpbnVhdGlvblBvaW50IiB0eXBlPSJ4czpi +YXNlNjRCaW5hcnkiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJyb3dzZVJlc3VsdCI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZSIg +dHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iQ29udGludWF0aW9uUG9pbnQiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5j +ZXMiIHR5cGU9InRuczpMaXN0T2ZSZWZlcmVuY2VEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VSZXN1bHQiIHR5cGU9InRuczpCcm93c2VSZXN1 +bHQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkJyb3dzZVJlc3VsdCI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlUmVzdWx0IiB0 +eXBlPSJ0bnM6QnJvd3NlUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZCcm93c2VSZXN1bHQiIHR5cGU9InRuczpM +aXN0T2ZCcm93c2VSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IkJyb3dzZVJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iVmlldyIgdHlwZT0idG5zOlZpZXdEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RlZE1heFJlZmVy +ZW5jZXNQZXJOb2RlIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZXNUb0Jyb3dzZSIgdHlwZT0idG5zOkxpc3RPZkJyb3dz +ZURlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkJyb3dz +ZVJlcXVlc3QiIHR5cGU9InRuczpCcm93c2VSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJCcm93c2VSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJl +c3VsdHMiIHR5cGU9InRuczpMaXN0T2ZCcm93c2VSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5 +cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkJyb3dzZVJlc3BvbnNlIiB0eXBlPSJ0bnM6QnJvd3NlUmVzcG9uc2UiIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkJyb3dzZU5leHRSZXF1ZXN0Ij4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6 +UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJlbGVhc2VDb250aW51YXRpb25Qb2ludHMiIHR5cGU9InhzOmJvb2xl +YW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbnRpbnVhdGlv +blBvaW50cyIgdHlwZT0idWE6TGlzdE9mQnl0ZVN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VOZXh0UmVxdWVzdCIgdHlwZT0idG5zOkJyb3dzZU5leHRS +ZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJCcm93c2VOZXh0UmVzcG9uc2Ui +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVh +ZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ0bnM6TGlzdE9m +QnJvd3NlUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGlj +SW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCcm93c2VOZXh0UmVz +cG9uc2UiIHR5cGU9InRuczpCcm93c2VOZXh0UmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9IlJlbGF0aXZlUGF0aEVsZW1lbnQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVR5cGVJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSXNJ +bnZlcnNlIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJJbmNsdWRlU3VidHlwZXMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRhcmdldE5hbWUiIHR5cGU9InVhOlF1YWxp +ZmllZE5hbWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUmVsYXRpdmVQ +YXRoRWxlbWVudCIgdHlwZT0idG5zOlJlbGF0aXZlUGF0aEVsZW1lbnQiIC8+DQoNCiAgPHhzOmNv +bXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlbGF0aXZlUGF0aEVsZW1lbnQiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlbGF0aXZlUGF0aEVsZW1lbnQiIHR5cGU9 +InRuczpSZWxhdGl2ZVBhdGhFbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZSZWxhdGl2ZVBhdGhFbGVtZW50IiB0 +eXBlPSJ0bnM6TGlzdE9mUmVsYXRpdmVQYXRoRWxlbWVudCIgbmlsbGFibGU9InRydWUiPjwveHM6 +ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVsYXRpdmVQYXRoIj4NCiAgICA8 +eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbGVtZW50cyIgdHlwZT0idG5z +Okxpc3RPZlJlbGF0aXZlUGF0aEVsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iUmVsYXRpdmVQYXRoIiB0eXBlPSJ0bnM6UmVsYXRpdmVQYXRoIiAvPg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJCcm93c2VQYXRoIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJTdGFydGluZ05vZGUiIHR5cGU9InVhOk5vZGVJZCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlbGF0 +aXZlUGF0aCIgdHlwZT0idG5zOlJlbGF0aXZlUGF0aCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJCcm93c2VQYXRoIiB0eXBlPSJ0bnM6QnJvd3NlUGF0aCIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQnJvd3NlUGF0aCI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlUGF0aCIgdHlwZT0idG5zOkJyb3dzZVBh +dGgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9Ikxpc3RPZkJyb3dzZVBhdGgiIHR5cGU9InRuczpMaXN0T2ZCcm93c2VQYXRoIiBuaWxs +YWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJCcm93 +c2VQYXRoVGFyZ2V0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJUYXJnZXRJZCIgdHlwZT0idWE6RXhwYW5kZWROb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZW1haW5pbmdQYXRoSW5kZXgi +IHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5j +ZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlUGF0aFRh +cmdldCIgdHlwZT0idG5zOkJyb3dzZVBhdGhUYXJnZXQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZkJyb3dzZVBhdGhUYXJnZXQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IkJyb3dzZVBhdGhUYXJnZXQiIHR5cGU9InRuczpCcm93c2VQYXRo +VGFyZ2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZCcm93c2VQYXRoVGFyZ2V0IiB0eXBlPSJ0bnM6TGlzdE9mQnJvd3Nl +UGF0aFRhcmdldCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iQnJvd3NlUGF0aFJlc3VsdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGFyZ2V0cyIgdHlwZT0idG5zOkxp +c3RPZkJyb3dzZVBhdGhUYXJnZXQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iQnJvd3NlUGF0aFJlc3VsdCIgdHlwZT0idG5zOkJyb3dzZVBhdGhSZXN1bHQiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkJyb3dzZVBhdGhSZXN1bHQiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZVBhdGhSZXN1bHQiIHR5cGU9 +InRuczpCcm93c2VQYXRoUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVk +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZCcm93c2VQYXRoUmVzdWx0IiB0eXBlPSJ0 +bnM6TGlzdE9mQnJvd3NlUGF0aFJlc3VsdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNsYXRlQnJvd3NlUGF0aHNUb05vZGVJZHNS +ZXF1ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1 +ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJyb3dzZVBhdGhzIiB0eXBlPSJ0 +bnM6TGlzdE9mQnJvd3NlUGF0aCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJUcmFuc2xhdGVCcm93c2VQYXRoc1RvTm9kZUlkc1JlcXVlc3QiIHR5cGU9InRuczpUcmFuc2xh +dGVCcm93c2VQYXRoc1RvTm9kZUlkc1JlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IlRyYW5zbGF0ZUJyb3dzZVBhdGhzVG9Ob2RlSWRzUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6 +UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ0bnM6TGlzdE9mQnJvd3NlUGF0aFJlc3Vs +dCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkRpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNsYXRlQnJvd3NlUGF0aHNUb05v +ZGVJZHNSZXNwb25zZSIgdHlwZT0idG5zOlRyYW5zbGF0ZUJyb3dzZVBhdGhzVG9Ob2RlSWRzUmVz +cG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyTm9kZXNSZXF1ZXN0 +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVh +ZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVzVG9SZWdpc3RlciIgdHlwZT0idWE6 +TGlzdE9mTm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlZ2lz +dGVyTm9kZXNSZXF1ZXN0IiB0eXBlPSJ0bnM6UmVnaXN0ZXJOb2Rlc1JlcXVlc3QiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IlJlZ2lzdGVyTm9kZXNSZXNwb25zZSI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRu +czpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJlZ2lzdGVyZWROb2RlSWRzIiB0eXBlPSJ1YTpMaXN0T2ZOb2Rl +SWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUmVnaXN0ZXJOb2Rlc1Jl +c3BvbnNlIiB0eXBlPSJ0bnM6UmVnaXN0ZXJOb2Rlc1Jlc3BvbnNlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJVbnJlZ2lzdGVyTm9kZXNSZXF1ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVz +dEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ik5vZGVzVG9VbnJlZ2lzdGVyIiB0eXBlPSJ1YTpMaXN0T2ZOb2RlSWQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVW5yZWdpc3Rlck5vZGVzUmVxdWVzdCIg +dHlwZT0idG5zOlVucmVnaXN0ZXJOb2Rlc1JlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IlVucmVnaXN0ZXJOb2Rlc1Jlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVucmVnaXN0ZXJOb2Rl +c1Jlc3BvbnNlIiB0eXBlPSJ0bnM6VW5yZWdpc3Rlck5vZGVzUmVzcG9uc2UiIC8+DQoNCiAgPHhz +OmVsZW1lbnQgbmFtZT0iQ291bnRlciIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIC8+DQoNCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTnVtZXJpY1JhbmdlIiB0eXBlPSJ4czpzdHJpbmciIC8+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IkVuZHBvaW50Q29uZmlndXJhdGlvbiI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uVGltZW91dCIgdHlwZT0ieHM6 +aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VCaW5hcnlF +bmNvZGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iTWF4U3RyaW5nTGVuZ3RoIiB0eXBlPSJ4czppbnQiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1heEJ5dGVTdHJpbmdMZW5ndGgiIHR5cGU9Inhz +OmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4QXJyYXlM +ZW5ndGgiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iTWF4TWVzc2FnZVNpemUiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4QnVmZmVyU2l6ZSIgdHlwZT0ieHM6aW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDaGFubmVsTGlmZXRpbWUiIHR5cGU9 +InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJp +dHlUb2tlbkxpZmV0aW1lIiB0eXBlPSJ4czppbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRw +b2ludENvbmZpZ3VyYXRpb24iIHR5cGU9InRuczpFbmRwb2ludENvbmZpZ3VyYXRpb24iIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkVuZHBvaW50Q29uZmlndXJhdGlvbiI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kcG9pbnRDb25maWd1 +cmF0aW9uIiB0eXBlPSJ0bnM6RW5kcG9pbnRDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1h +eE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZFbmRwb2lu +dENvbmZpZ3VyYXRpb24iIHR5cGU9InRuczpMaXN0T2ZFbmRwb2ludENvbmZpZ3VyYXRpb24iIG5p +bGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlF1 +ZXJ5RGF0YURlc2NyaXB0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJSZWxhdGl2ZVBhdGgiIHR5cGU9InRuczpSZWxhdGl2ZVBhdGgiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGVJ +ZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkluZGV4UmFuZ2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJRdWVyeURhdGFEZXNjcmlwdGlvbiIgdHlwZT0idG5zOlF1ZXJ5 +RGF0YURlc2NyaXB0aW9uIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZRdWVy +eURhdGFEZXNjcmlwdGlvbiI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUXVlcnlEYXRhRGVzY3JpcHRpb24iIHR5cGU9InRuczpRdWVyeURhdGFEZXNjcmlwdGlv +biIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mUXVlcnlEYXRhRGVzY3JpcHRpb24iIHR5cGU9InRuczpMaXN0T2ZRdWVyeURh +dGFEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iTm9kZVR5cGVEZXNjcmlwdGlvbiI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHlwZURlZmluaXRpb25Ob2RlIiB0eXBlPSJ1YTpFeHBh +bmRlZE5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkluY2x1ZGVTdWJUeXBlcyIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YVRvUmV0dXJuIiB0eXBlPSJ0bnM6 +TGlzdE9mUXVlcnlEYXRhRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iTm9kZVR5cGVEZXNjcmlwdGlvbiIgdHlwZT0idG5zOk5vZGVUeXBlRGVzY3JpcHRp +b24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5vZGVUeXBlRGVzY3JpcHRp +b24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVUeXBl +RGVzY3JpcHRpb24iIHR5cGU9InRuczpOb2RlVHlwZURlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAi +IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZOb2Rl +VHlwZURlc2NyaXB0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mTm9kZVR5cGVEZXNjcmlwdGlvbiIgbmls +bGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iRmls +dGVyT3BlcmF0b3IiPg0KICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFcXVhbHNfMCIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iSXNOdWxsXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ikdy +ZWF0ZXJUaGFuXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ikxlc3NUaGFuXzMi +IC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkdyZWF0ZXJUaGFuT3JFcXVhbF80IiAv +Pg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMZXNzVGhhbk9yRXF1YWxfNSIgLz4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTGlrZV82IiAvPg0KICAgICAgPHhzOmVudW1lcmF0 +aW9uIHZhbHVlPSJOb3RfNyIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQmV0d2Vl +bl84IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJbkxpc3RfOSIgLz4NCiAgICAg +IDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQW5kXzEwIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9u +IHZhbHVlPSJPcl8xMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2FzdF8xMiIg +Lz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSW5WaWV3XzEzIiAvPg0KICAgICAgPHhz +OmVudW1lcmF0aW9uIHZhbHVlPSJPZlR5cGVfMTQiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24g +dmFsdWU9IlJlbGF0ZWRUb18xNSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQml0 +d2lzZUFuZF8xNiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQml0d2lzZU9yXzE3 +IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iRmlsdGVyT3BlcmF0b3IiIHR5cGU9InRuczpGaWx0ZXJPcGVyYXRvciIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUXVlcnlEYXRhU2V0Ij4NCiAgICA8eHM6c2VxdWVu +Y2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlSWQiIHR5cGU9InVhOkV4cGFuZGVkTm9k +ZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iVHlwZURlZmluaXRpb25Ob2RlIiB0eXBlPSJ1YTpFeHBhbmRlZE5vZGVJZCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlZhbHVl +cyIgdHlwZT0idWE6TGlzdE9mVmFyaWFudCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJRdWVyeURhdGFTZXQiIHR5cGU9InRuczpRdWVyeURhdGFTZXQiIC8+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlF1ZXJ5RGF0YVNldCI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVlcnlEYXRhU2V0IiB0eXBlPSJ0bnM6UXVlcnlE +YXRhU2V0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJMaXN0T2ZRdWVyeURhdGFTZXQiIHR5cGU9InRuczpMaXN0T2ZRdWVyeURhdGFT +ZXQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ik5vZGVSZWZlcmVuY2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9Ik5vZGVJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlVHlwZUlkIiB0eXBlPSJ1 +YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJJc0ZvcndhcmQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWROb2RlSWRzIiB0eXBlPSJ1YTpMaXN0 +T2ZOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZVJlZmVy +ZW5jZSIgdHlwZT0idG5zOk5vZGVSZWZlcmVuY2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZk5vZGVSZWZlcmVuY2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9Ik5vZGVSZWZlcmVuY2UiIHR5cGU9InRuczpOb2RlUmVmZXJlbmNlIiBtaW5P +Y2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJM +aXN0T2ZOb2RlUmVmZXJlbmNlIiB0eXBlPSJ0bnM6TGlzdE9mTm9kZVJlZmVyZW5jZSIgbmlsbGFi +bGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVu +dEZpbHRlckVsZW1lbnQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkZpbHRlck9wZXJhdG9yIiB0eXBlPSJ0bnM6RmlsdGVyT3BlcmF0b3IiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZpbHRlck9wZXJhbmRzIiB0eXBlPSJ1YTpM +aXN0T2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iQ29udGVudEZpbHRlckVsZW1lbnQiIHR5cGU9InRuczpDb250ZW50RmlsdGVyRWxlbWVudCIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udGVudEZpbHRlckVsZW1lbnQi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbnRlbnRGaWx0 +ZXJFbGVtZW50IiB0eXBlPSJ0bnM6Q29udGVudEZpbHRlckVsZW1lbnQiIG1pbk9jY3Vycz0iMCIg +bWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu +Y2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkNvbnRl +bnRGaWx0ZXJFbGVtZW50IiB0eXBlPSJ0bnM6TGlzdE9mQ29udGVudEZpbHRlckVsZW1lbnQiIG5p +bGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNv +bnRlbnRGaWx0ZXIiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkVsZW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9mQ29udGVudEZpbHRlckVsZW1lbnQiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ29udGVudEZpbHRlciIgdHlwZT0idG5zOkNv +bnRlbnRGaWx0ZXIiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNvbnRlbnRG +aWx0ZXIiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbnRl +bnRGaWx0ZXIiIHR5cGU9InRuczpDb250ZW50RmlsdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vy +cz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8 +L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDb250ZW50RmlsdGVy +IiB0eXBlPSJ0bnM6TGlzdE9mQ29udGVudEZpbHRlciIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl +bWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmlsdGVyT3BlcmFuZCI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IkZpbHRlck9wZXJhbmQiIHR5cGU9InRuczpGaWx0ZXJPcGVyYW5kIiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50T3BlcmFuZCI+DQogICAgPHhzOmNv +bXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRu +czpGaWx0ZXJPcGVyYW5kIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkluZGV4IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94 +czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iRWxlbWVudE9wZXJhbmQiIHR5cGU9InRuczpFbGVtZW50T3BlcmFuZCIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iTGl0ZXJhbE9wZXJhbmQiPg0KICAgIDx4czpjb21wbGV4Q29udGVu +dCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmlsdGVyT3Bl +cmFuZCI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJWYWx1ZSIgdHlwZT0idWE6VmFyaWFudCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICA8L3hz +OnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVu +dD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGl0ZXJhbE9wZXJh +bmQiIHR5cGU9InRuczpMaXRlcmFsT3BlcmFuZCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iQXR0cmlidXRlT3BlcmFuZCI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxz +ZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaWx0ZXJPcGVyYW5kIj4NCiAgICAg +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJZCIgdHlw +ZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAg +IDx4czplbGVtZW50IG5hbWU9IkFsaWFzIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnJvd3NlUGF0 +aCIgdHlwZT0idG5zOlJlbGF0aXZlUGF0aCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGVJZCIgdHlwZT0ieHM6dW5z +aWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJ +bmRleFJhbmdlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8 +L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJBdHRyaWJ1dGVPcGVyYW5kIiB0eXBlPSJ0bnM6QXR0cmlidXRlT3BlcmFuZCIgLz4NCg0K +ICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2ltcGxlQXR0cmlidXRlT3BlcmFuZCI+DQogICAgPHhz +OmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9 +InRuczpGaWx0ZXJPcGVyYW5kIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlR5cGVEZWZpbml0aW9uSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJC +cm93c2VQYXRoIiB0eXBlPSJ1YTpMaXN0T2ZRdWFsaWZpZWROYW1lIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF0dHJpYnV0ZUlk +IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkluZGV4UmFuZ2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0 +ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9IlNpbXBsZUF0dHJpYnV0ZU9wZXJhbmQiIHR5cGU9InRuczpTaW1w +bGVBdHRyaWJ1dGVPcGVyYW5kIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZT +aW1wbGVBdHRyaWJ1dGVPcGVyYW5kIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTaW1wbGVBdHRyaWJ1dGVPcGVyYW5kIiB0eXBlPSJ0bnM6U2ltcGxlQXR0cmli +dXRlT3BlcmFuZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTGlzdE9mU2ltcGxlQXR0cmlidXRlT3BlcmFuZCIgdHlwZT0idG5zOkxp +c3RPZlNpbXBsZUF0dHJpYnV0ZU9wZXJhbmQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRGaWx0ZXJFbGVtZW50UmVzdWx0Ij4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlIiB0 +eXBlPSJ1YTpTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJPcGVyYW5kU3RhdHVzQ29kZXMiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0NvZGUiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJPcGVy +YW5kRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDb250ZW50RmlsdGVyRWxlbWVudFJlc3Vs +dCIgdHlwZT0idG5zOkNvbnRlbnRGaWx0ZXJFbGVtZW50UmVzdWx0IiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJMaXN0T2ZDb250ZW50RmlsdGVyRWxlbWVudFJlc3VsdCI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ29udGVudEZpbHRlckVsZW1lbnRS +ZXN1bHQiIHR5cGU9InRuczpDb250ZW50RmlsdGVyRWxlbWVudFJlc3VsdCIgbWluT2NjdXJzPSIw +IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mQ29u +dGVudEZpbHRlckVsZW1lbnRSZXN1bHQiIHR5cGU9InRuczpMaXN0T2ZDb250ZW50RmlsdGVyRWxl +bWVudFJlc3VsdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iQ29udGVudEZpbHRlclJlc3VsdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iRWxlbWVudFJlc3VsdHMiIHR5cGU9InRuczpMaXN0T2ZDb250 +ZW50RmlsdGVyRWxlbWVudFJlc3VsdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkVsZW1lbnREaWFnbm9zdGljSW5mb3MiIHR5cGU9InVh +Okxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IkNvbnRlbnRGaWx0ZXJSZXN1bHQiIHR5cGU9InRuczpDb250ZW50RmlsdGVyUmVzdWx0IiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQYXJzaW5nUmVzdWx0Ij4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlIiB0eXBlPSJ1YTpTdGF0 +dXNDb2RlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhU3Rh +dHVzQ29kZXMiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRhRGlhZ25vc3RpY0luZm9z +IiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJQYXJzaW5nUmVzdWx0IiB0eXBlPSJ0bnM6UGFyc2luZ1Jlc3VsdCIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mUGFyc2luZ1Jlc3VsdCI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUGFyc2luZ1Jlc3VsdCIgdHlwZT0i +dG5zOlBhcnNpbmdSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlBhcnNpbmdSZXN1bHQiIHR5cGU9InRuczpMaXN0 +T2ZQYXJzaW5nUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJRdWVyeUZpcnN0UmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RI +ZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJWaWV3IiB0eXBlPSJ0bnM6Vmlld0Rlc2NyaXB0aW9uIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZVR5cGVzIiB0eXBl +PSJ0bnM6TGlzdE9mTm9kZVR5cGVEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkZpbHRlciIgdHlwZT0idG5zOkNvbnRl +bnRGaWx0ZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJNYXhEYXRhU2V0c1RvUmV0dXJuIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4UmVmZXJlbmNlc1RvUmV0 +dXJuIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlF1ZXJ5Rmly +c3RSZXF1ZXN0IiB0eXBlPSJ0bnM6UXVlcnlGaXJzdFJlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9IlF1ZXJ5Rmlyc3RSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhl +YWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlF1ZXJ5RGF0YVNldHMiIHR5cGU9InRuczpMaXN0T2ZRdWVyeURhdGFTZXQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDb250 +aW51YXRpb25Qb2ludCIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUGFyc2luZ1Jlc3VsdHMiIHR5 +cGU9InRuczpMaXN0T2ZQYXJzaW5nUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpM +aXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkZpbHRlclJlc3VsdCIgdHlwZT0idG5zOkNvbnRlbnRGaWx0 +ZXJSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUXVlcnlGaXJz +dFJlc3BvbnNlIiB0eXBlPSJ0bnM6UXVlcnlGaXJzdFJlc3BvbnNlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJRdWVyeU5leHRSZXF1ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRl +ciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlJlbGVhc2VDb250aW51YXRpb25Qb2ludCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ29udGludWF0aW9uUG9pbnQiIHR5cGU9 +InhzOmJhc2U2NEJpbmFyeSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJR +dWVyeU5leHRSZXF1ZXN0IiB0eXBlPSJ0bnM6UXVlcnlOZXh0UmVxdWVzdCIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iUXVlcnlOZXh0UmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9u +c2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJRdWVyeURhdGFTZXRzIiB0eXBlPSJ0bnM6TGlzdE9mUXVlcnlEYXRhU2V0IiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +UmV2aXNlZENvbnRpbnVhdGlvblBvaW50IiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUXVlcnlOZXh0UmVzcG9uc2UiIHR5cGU9InRu +czpRdWVyeU5leHRSZXNwb25zZSIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iVGltZXN0 +YW1wc1RvUmV0dXJuIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU291cmNlXzAiIC8+DQogICAgICA8eHM6ZW51bWVy +YXRpb24gdmFsdWU9IlNlcnZlcl8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJC +b3RoXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5laXRoZXJfMyIgLz4NCiAg +ICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSW52YWxpZF80IiAvPg0KICAgIDwveHM6cmVzdHJp +Y3Rpb24+DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVGltZXN0YW1w +c1RvUmV0dXJuIiB0eXBlPSJ0bnM6VGltZXN0YW1wc1RvUmV0dXJuIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJSZWFkVmFsdWVJZCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iTm9kZUlkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGVJZCIgdHlw +ZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkluZGV4UmFuZ2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGFFbmNvZGluZyIgdHlwZT0idWE6 +UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZWFk +VmFsdWVJZCIgdHlwZT0idG5zOlJlYWRWYWx1ZUlkIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJMaXN0T2ZSZWFkVmFsdWVJZCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iUmVhZFZhbHVlSWQiIHR5cGU9InRuczpSZWFkVmFsdWVJZCIgbWluT2NjdXJz +PSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9m +UmVhZFZhbHVlSWQiIHR5cGU9InRuczpMaXN0T2ZSZWFkVmFsdWVJZCIgbmlsbGFibGU9InRydWUi +PjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVhZFJlcXVlc3QiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIi +IHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4QWdlIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRpbWVzdGFtcHNUb1JldHVybiIg +dHlwZT0idG5zOlRpbWVzdGFtcHNUb1JldHVybiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iTm9kZXNUb1JlYWQiIHR5cGU9InRuczpMaXN0T2ZSZWFkVmFsdWVJZCIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8 +L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZWFkUmVxdWVzdCIgdHlwZT0i +dG5zOlJlYWRSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWFkUmVzcG9u +c2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNl +SGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ1YTpMaXN0 +T2ZEYXRhVmFsdWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJ +bmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlYWRSZXNwb25zZSIg +dHlwZT0idG5zOlJlYWRSZXNwb25zZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSGlz +dG9yeVJlYWRWYWx1ZUlkIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJOb2RlSWQiIHR5cGU9InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkluZGV4UmFuZ2UiIHR5cGU9InhzOnN0cmlu +ZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkRhdGFFbmNvZGluZyIgdHlwZT0idWE6UXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNvbnRpbnVhdGlvblBv +aW50IiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1l +bnQgbmFtZT0iSGlzdG9yeVJlYWRWYWx1ZUlkIiB0eXBlPSJ0bnM6SGlzdG9yeVJlYWRWYWx1ZUlk +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZIaXN0b3J5UmVhZFZhbHVlSWQi +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlSZWFk +VmFsdWVJZCIgdHlwZT0idG5zOkhpc3RvcnlSZWFkVmFsdWVJZCIgbWluT2NjdXJzPSIwIiBtYXhP +Y2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4N +CiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGlzdG9yeVJl +YWRWYWx1ZUlkIiB0eXBlPSJ0bnM6TGlzdE9mSGlzdG9yeVJlYWRWYWx1ZUlkIiBuaWxsYWJsZT0i +dHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJIaXN0b3J5UmVh +ZFJlc3VsdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Rh +dHVzQ29kZSIgdHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iQ29udGludWF0aW9uUG9pbnQiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +Ikhpc3RvcnlEYXRhIiB0eXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4N +CiAgPHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9yeVJlYWRSZXN1bHQiIHR5cGU9InRuczpIaXN0b3J5 +UmVhZFJlc3VsdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mSGlzdG9yeVJl +YWRSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikhp +c3RvcnlSZWFkUmVzdWx0IiB0eXBlPSJ0bnM6SGlzdG9yeVJlYWRSZXN1bHQiIG1pbk9jY3Vycz0i +MCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkhp +c3RvcnlSZWFkUmVzdWx0IiB0eXBlPSJ0bnM6TGlzdE9mSGlzdG9yeVJlYWRSZXN1bHQiIG5pbGxh +YmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikhpc3Rv +cnlSZWFkRGV0YWlscyI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgIDwveHM6c2VxdWVuY2U+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlSZWFkRGV0YWls +cyIgdHlwZT0idG5zOkhpc3RvcnlSZWFkRGV0YWlscyIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUg +bmFtZT0iUmVhZEV2ZW50RGV0YWlscyI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJm +YWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpIaXN0b3J5UmVhZERldGFpbHMi +Pg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTnVt +VmFsdWVzUGVyTm9kZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGFydFRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kVGltZSIgdHlw +ZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJGaWx0ZXIiIHR5cGU9InRuczpFdmVudEZpbHRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9u +Pg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IlJlYWRFdmVudERldGFpbHMiIHR5cGU9InRuczpSZWFkRXZlbnREZXRhaWxz +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZWFkUmF3TW9kaWZpZWREZXRhaWxzIj4N +CiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNp +b24gYmFzZT0idG5zOkhpc3RvcnlSZWFkRGV0YWlscyI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJc1JlYWRNb2RpZmllZCIgdHlwZT0ieHM6Ym9v +bGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXJ0 +VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJFbmRUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik51bVZhbHVlc1Blck5vZGUiIHR5cGU9Inhz +OnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUmV0dXJuQm91bmRzIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBs +ZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZWFk +UmF3TW9kaWZpZWREZXRhaWxzIiB0eXBlPSJ0bnM6UmVhZFJhd01vZGlmaWVkRGV0YWlscyIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVhZFByb2Nlc3NlZERldGFpbHMiPg0KICAgIDx4 +czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNl +PSJ0bnM6SGlzdG9yeVJlYWREZXRhaWxzIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRUaW1lIiB0eXBlPSJ4 +czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlByb2Nlc3NpbmdJbnRlcnZhbCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlVHlwZSIgdHlwZT0idWE6TGlzdE9m +Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24iIHR5cGU9InRuczpBZ2dyZWdhdGVD +b25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8 +L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29u +dGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUmVhZFByb2Nl +c3NlZERldGFpbHMiIHR5cGU9InRuczpSZWFkUHJvY2Vzc2VkRGV0YWlscyIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iUmVhZEF0VGltZURldGFpbHMiPg0KICAgIDx4czpjb21wbGV4Q29u +dGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6SGlzdG9y +eVJlYWREZXRhaWxzIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlJlcVRpbWVzIiB0eXBlPSJ1YTpMaXN0T2ZEYXRlVGltZSIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVc2VTaW1w +bGVCb3VuZHMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94 +czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRl +bnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlYWRBdFRpbWVE +ZXRhaWxzIiB0eXBlPSJ0bnM6UmVhZEF0VGltZURldGFpbHMiIC8+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9IlJlYWRBbm5vdGF0aW9uRGF0YURldGFpbHMiPg0KICAgIDx4czpjb21wbGV4Q29u +dGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6SGlzdG9y +eVJlYWREZXRhaWxzIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlJlcVRpbWVzIiB0eXBlPSJ1YTpMaXN0T2ZEYXRlVGltZSIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6 +ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IlJlYWRBbm5vdGF0aW9uRGF0YURldGFpbHMiIHR5cGU9InRu +czpSZWFkQW5ub3RhdGlvbkRhdGFEZXRhaWxzIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJIaXN0b3J5RGF0YSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iRGF0YVZhbHVlcyIgdHlwZT0idWE6TGlzdE9mRGF0YVZhbHVlIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlEYXRhIiB0eXBlPSJ0bnM6SGlzdG9yeURhdGEi +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vZGlmaWNhdGlvbkluZm8iPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vZGlmaWNhdGlvblRpbWUiIHR5 +cGU9InhzOmRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJVcGRhdGVUeXBlIiB0eXBlPSJ0bnM6SGlzdG9yeVVwZGF0ZVR5cGUiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTW9kaWZpY2F0aW9uSW5mbyIgdHlw +ZT0idG5zOk1vZGlmaWNhdGlvbkluZm8iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxp +c3RPZk1vZGlmaWNhdGlvbkluZm8iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ik1vZGlmaWNhdGlvbkluZm8iIHR5cGU9InRuczpNb2RpZmljYXRpb25JbmZvIiBt +aW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJMaXN0T2ZNb2RpZmljYXRpb25JbmZvIiB0eXBlPSJ0bnM6TGlzdE9mTW9kaWZpY2F0aW9uSW5m +byIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iSGlzdG9yeU1vZGlmaWVkRGF0YSI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJm +YWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpIaXN0b3J5RGF0YSI+DQogICAg +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNb2RpZmljYXRp +b25JbmZvcyIgdHlwZT0idG5zOkxpc3RPZk1vZGlmaWNhdGlvbkluZm8iIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4 +dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJIaXN0b3J5TW9kaWZpZWREYXRhIiB0eXBlPSJ0bnM6SGlzdG9y +eU1vZGlmaWVkRGF0YSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSGlzdG9yeUV2ZW50 +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFdmVudHMiIHR5 +cGU9InRuczpMaXN0T2ZIaXN0b3J5RXZlbnRGaWVsZExpc3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAg +PHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9yeUV2ZW50IiB0eXBlPSJ0bnM6SGlzdG9yeUV2ZW50IiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJIaXN0b3J5UmVhZFJlcXVlc3QiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9 +InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9yeVJlYWREZXRhaWxzIiB0eXBlPSJ1YTpFeHRlbnNp +b25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJUaW1lc3RhbXBzVG9SZXR1cm4iIHR5cGU9InRuczpUaW1lc3RhbXBzVG9SZXR1 +cm4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlbGVhc2VDb250 +aW51YXRpb25Qb2ludHMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik5vZGVzVG9SZWFkIiB0eXBlPSJ0bnM6TGlzdE9mSGlzdG9yeVJl +YWRWYWx1ZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlS +ZWFkUmVxdWVzdCIgdHlwZT0idG5zOkhpc3RvcnlSZWFkUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iSGlzdG9yeVJlYWRSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25z +ZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlJlc3VsdHMiIHR5cGU9InRuczpMaXN0T2ZIaXN0b3J5UmVhZFJlc3VsdCIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRp +YWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4 +VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9yeVJlYWRSZXNwb25zZSIgdHlwZT0idG5z +Okhpc3RvcnlSZWFkUmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IldyaXRl +VmFsdWUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vZGVJ +ZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iQXR0cmlidXRlSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbmRleFJhbmdlIiB0eXBl +PSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0idWE6RGF0YVZhbHVlIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IldyaXRlVmFsdWUiIHR5cGU9InRuczpXcml0ZVZhbHVlIiAv +Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZXcml0ZVZhbHVlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJXcml0ZVZhbHVlIiB0eXBlPSJ0bnM6 +V3JpdGVWYWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iTGlzdE9mV3JpdGVWYWx1ZSIgdHlwZT0idG5zOkxpc3RPZldyaXRlVmFs +dWUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IldyaXRlUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2Rlc1RvV3Jp +dGUiIHR5cGU9InRuczpMaXN0T2ZXcml0ZVZhbHVlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IldyaXRlUmVxdWVzdCIgdHlwZT0idG5zOldyaXRlUmVxdWVzdCIgLz4NCg0K +ICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iV3JpdGVSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNw +b25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlJlc3VsdHMiIHR5cGU9InVhOkxpc3RPZlN0YXR1c0NvZGUiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9z +dGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IldyaXRlUmVzcG9uc2UiIHR5cGU9InRuczpXcml0ZVJlc3Bv +bnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJIaXN0b3J5VXBkYXRlRGV0YWlscyI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm9kZUlkIiB0eXBl +PSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9y +eVVwZGF0ZURldGFpbHMiIHR5cGU9InRuczpIaXN0b3J5VXBkYXRlRGV0YWlscyIgLz4NCg0KICA8 +eHM6c2ltcGxlVHlwZSAgbmFtZT0iSGlzdG9yeVVwZGF0ZVR5cGUiPg0KICAgIDx4czpyZXN0cmlj +dGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJJbnNl +cnRfMSIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUmVwbGFjZV8yIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVcGRhdGVfMyIgLz4NCiAgICAgIDx4czplbnVtZXJh +dGlvbiB2YWx1ZT0iRGVsZXRlXzQiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpz +aW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJIaXN0b3J5VXBkYXRlVHlwZSIgdHlwZT0i +dG5zOkhpc3RvcnlVcGRhdGVUeXBlIiAvPg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJQZXJm +b3JtVXBkYXRlVHlwZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQog +ICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ikluc2VydF8xIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJSZXBsYWNlXzIiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9 +IlVwZGF0ZV8zIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZW1vdmVfNCIgLz4N +CiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IlBlcmZvcm1VcGRhdGVUeXBlIiB0eXBlPSJ0bnM6UGVyZm9ybVVwZGF0ZVR5cGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlVwZGF0ZURhdGFEZXRhaWxzIj4NCiAgICA8eHM6 +Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0i +dG5zOkhpc3RvcnlVcGRhdGVEZXRhaWxzIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlBlcmZvcm1JbnNlcnRSZXBsYWNlIiB0eXBlPSJ0bnM6UGVy +Zm9ybVVwZGF0ZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJVcGRhdGVWYWx1ZXMiIHR5cGU9InVhOkxpc3RPZkRhdGFWYWx1ZSIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6 +ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9IlVwZGF0ZURhdGFEZXRhaWxzIiB0eXBlPSJ0bnM6VXBkYXRl +RGF0YURldGFpbHMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlVwZGF0ZVN0cnVjdHVy +ZURhdGFEZXRhaWxzIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAg +ICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOkhpc3RvcnlVcGRhdGVEZXRhaWxzIj4NCiAgICAg +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlBlcmZvcm1JbnNl +cnRSZXBsYWNlIiB0eXBlPSJ0bnM6UGVyZm9ybVVwZGF0ZVR5cGUiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJVcGRhdGVWYWx1ZXMiIHR5cGU9InVhOkxpc3RP +ZkRhdGFWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94 +czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRl +bnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlVwZGF0ZVN0cnVj +dHVyZURhdGFEZXRhaWxzIiB0eXBlPSJ0bnM6VXBkYXRlU3RydWN0dXJlRGF0YURldGFpbHMiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlVwZGF0ZUV2ZW50RGV0YWlscyI+DQogICAgPHhz +OmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9 +InRuczpIaXN0b3J5VXBkYXRlRGV0YWlscyI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQZXJmb3JtSW5zZXJ0UmVwbGFjZSIgdHlwZT0idG5zOlBl +cmZvcm1VcGRhdGVUeXBlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iRmlsdGVyIiB0eXBlPSJ0bnM6RXZlbnRGaWx0ZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXZlbnREYXRhIiB0eXBl +PSJ0bnM6TGlzdE9mSGlzdG9yeUV2ZW50RmllbGRMaXN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+ +DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iVXBkYXRlRXZlbnREZXRhaWxzIiB0eXBlPSJ0bnM6VXBkYXRlRXZlbnREZXRh +aWxzIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWxldGVSYXdNb2RpZmllZERldGFp +bHMiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4 +dGVuc2lvbiBiYXNlPSJ0bnM6SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgICAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSXNEZWxldGVNb2RpZmllZCIgdHlw +ZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5h +bWU9IlN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmRUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+ +DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVs +ZW1lbnQgbmFtZT0iRGVsZXRlUmF3TW9kaWZpZWREZXRhaWxzIiB0eXBlPSJ0bnM6RGVsZXRlUmF3 +TW9kaWZpZWREZXRhaWxzIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWxldGVBdFRp +bWVEZXRhaWxzIj4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4NCiAgICAg +IDx4czpleHRlbnNpb24gYmFzZT0idG5zOkhpc3RvcnlVcGRhdGVEZXRhaWxzIj4NCiAgICAgICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcVRpbWVzIiB0eXBl +PSJ1YTpMaXN0T2ZEYXRlVGltZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29t +cGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkRl +bGV0ZUF0VGltZURldGFpbHMiIHR5cGU9InRuczpEZWxldGVBdFRpbWVEZXRhaWxzIiAvPg0KDQog +IDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWxldGVFdmVudERldGFpbHMiPg0KICAgIDx4czpjb21w +bGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6 +SGlzdG9yeVVwZGF0ZURldGFpbHMiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRXZlbnRJZHMiIHR5cGU9InVhOkxpc3RPZkJ5dGVTdHJpbmciIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQog +ICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEZWxldGVFdmVudERldGFpbHMiIHR5cGU9 +InRuczpEZWxldGVFdmVudERldGFpbHMiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikhp +c3RvcnlVcGRhdGVSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlN0YXR1c0NvZGUiIHR5cGU9InVhOlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9wZXJhdGlvblJlc3VsdHMiIHR5cGU9InVhOkxpc3RP +ZlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJ +bmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlVcGRhdGVS +ZXN1bHQiIHR5cGU9InRuczpIaXN0b3J5VXBkYXRlUmVzdWx0IiAvPg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJMaXN0T2ZIaXN0b3J5VXBkYXRlUmVzdWx0Ij4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJIaXN0b3J5VXBkYXRlUmVzdWx0IiB0eXBlPSJ0bnM6 +SGlzdG9yeVVwZGF0ZVJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mSGlzdG9yeVVwZGF0ZVJlc3VsdCIgdHlwZT0i +dG5zOkxpc3RPZkhpc3RvcnlVcGRhdGVSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l +bnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikhpc3RvcnlVcGRhdGVSZXF1ZXN0Ij4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0SGVhZGVyIiB0 +eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlVcGRhdGVEZXRhaWxzIiB0eXBlPSJ1YTpM +aXN0T2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iSGlzdG9yeVVwZGF0ZVJlcXVlc3QiIHR5cGU9InRuczpIaXN0b3J5VXBkYXRlUmVxdWVzdCIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSGlzdG9yeVVwZGF0ZVJlc3BvbnNlIj4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIg +dHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzdWx0cyIgdHlwZT0idG5zOkxpc3RPZkhpc3Rv +cnlVcGRhdGVSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdub3N0 +aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu +Y2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlVcGRh +dGVSZXNwb25zZSIgdHlwZT0idG5zOkhpc3RvcnlVcGRhdGVSZXNwb25zZSIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iQ2FsbE1ldGhvZFJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9iamVjdElkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNZXRo +b2RJZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5wdXRBcmd1bWVudHMiIHR5cGU9InVhOkxpc3RPZlZh +cmlhbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j +ZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FsbE1ldGhvZFJl +cXVlc3QiIHR5cGU9InRuczpDYWxsTWV0aG9kUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iTGlzdE9mQ2FsbE1ldGhvZFJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkNhbGxNZXRob2RSZXF1ZXN0IiB0eXBlPSJ0bnM6Q2FsbE1l +dGhvZFJlcXVlc3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9Ikxpc3RPZkNhbGxNZXRob2RSZXF1ZXN0IiB0eXBlPSJ0bnM6TGlzdE9m +Q2FsbE1ldGhvZFJlcXVlc3QiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IkNhbGxNZXRob2RSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGUiIHR5cGU9InVhOlN0YXR1c0NvZGUi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IklucHV0QXJndW1lbnRS +ZXN1bHRzIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5wdXRBcmd1bWVudERpYWdub3N0 +aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJPdXRwdXRBcmd1bWVudHMi +IHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iQ2FsbE1ldGhvZFJlc3VsdCIgdHlwZT0idG5zOkNhbGxNZXRob2RSZXN1bHQiIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkNhbGxNZXRob2RSZXN1bHQiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNhbGxNZXRob2RSZXN1bHQiIHR5 +cGU9InRuczpDYWxsTWV0aG9kUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3Vu +ZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZDYWxsTWV0aG9kUmVzdWx0IiB0eXBl +PSJ0bnM6TGlzdE9mQ2FsbE1ldGhvZFJlc3VsdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FsbFJlcXVlc3QiPg0KICAgIDx4czpzZXF1 +ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpS +ZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iTWV0aG9kc1RvQ2FsbCIgdHlwZT0idG5zOkxpc3RPZkNhbGxNZXRob2RS +ZXF1ZXN0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu +Y2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkNhbGxSZXF1ZXN0 +IiB0eXBlPSJ0bnM6Q2FsbFJlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNh +bGxSZXNwb25zZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +UmVzcG9uc2VIZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3VsdHMiIHR5cGU9 +InRuczpMaXN0T2ZDYWxsTWV0aG9kUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpM +aXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJDYWxsUmVzcG9uc2UiIHR5cGU9InRuczpDYWxsUmVzcG9uc2UiIC8+DQoNCiAgPHhzOnNpbXBs +ZVR5cGUgIG5hbWU9Ik1vbml0b3JpbmdNb2RlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0i +eHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRfMCIgLz4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU2FtcGxpbmdfMSIgLz4NCiAgICAgIDx4czpl +bnVtZXJhdGlvbiB2YWx1ZT0iUmVwb3J0aW5nXzIiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4N +CiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yaW5nTW9kZSIg +dHlwZT0idG5zOk1vbml0b3JpbmdNb2RlIiAvPg0KDQogIDx4czpzaW1wbGVUeXBlICBuYW1lPSJE +YXRhQ2hhbmdlVHJpZ2dlciI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlN0YXR1c18wIiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJTdGF0dXNWYWx1ZV8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9u +IHZhbHVlPSJTdGF0dXNWYWx1ZVRpbWVzdGFtcF8yIiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+ +DQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YUNoYW5nZVRyaWdn +ZXIiIHR5cGU9InRuczpEYXRhQ2hhbmdlVHJpZ2dlciIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAg +bmFtZT0iRGVhZGJhbmRUeXBlIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5n +Ij4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZV8wIiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJBYnNvbHV0ZV8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZh +bHVlPSJQZXJjZW50XzIiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4NCiAgPC94czpzaW1wbGVU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEZWFkYmFuZFR5cGUiIHR5cGU9InRuczpEZWFkYmFu +ZFR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JpbmdGaWx0ZXIiPg0K +ICAgIDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yaW5nRmlsdGVyIiB0eXBlPSJ0bnM6TW9uaXRv +cmluZ0ZpbHRlciIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRGF0YUNoYW5nZUZpbHRl +ciI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0 +ZW5zaW9uIGJhc2U9InRuczpNb25pdG9yaW5nRmlsdGVyIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRyaWdnZXIiIHR5cGU9InRuczpEYXRhQ2hh +bmdlVHJpZ2dlciIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkRlYWRiYW5kVHlwZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEZWFkYmFuZFZhbHVlIiB0eXBlPSJ4czpkb3VibGUi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5jZT4NCiAgICAgIDwveHM6ZXh0 +ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9IkRhdGFDaGFuZ2VGaWx0ZXIiIHR5cGU9InRuczpEYXRhQ2hhbmdl +RmlsdGVyIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFdmVudEZpbHRlciI+DQogICAg +PHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJh +c2U9InRuczpNb25pdG9yaW5nRmlsdGVyIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlNlbGVjdENsYXVzZXMiIHR5cGU9InRuczpMaXN0T2ZTaW1w +bGVBdHRyaWJ1dGVPcGVyYW5kIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgICAgIDx4czplbGVtZW50IG5hbWU9IldoZXJlQ2xhdXNlIiB0eXBlPSJ0bnM6Q29udGVudEZp +bHRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1 +ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkV2ZW50RmlsdGVyIiB0eXBl +PSJ0bnM6RXZlbnRGaWx0ZXIiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFnZ3JlZ2F0 +ZUNvbmZpZ3VyYXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlVzZVNlcnZlckNhcGFiaWxpdGllc0RlZmF1bHRzIiB0eXBlPSJ4czpib29sZWFuIiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUcmVhdFVuY2VydGFpbkFzQmFk +IiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJQZXJjZW50RGF0YUJhZCIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQZXJjZW50RGF0YUdvb2QiIHR5cGU9InhzOnVu +c2lnbmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVXNl +U2xvcGVkRXh0cmFwb2xhdGlvbiIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24iIHR5cGU9InRuczpBZ2dyZWdhdGVDb25maWd1cmF0 +aW9uIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZ2dyZWdhdGVGaWx0ZXIiPg0KICAg +IDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBi +YXNlPSJ0bnM6TW9uaXRvcmluZ0ZpbHRlciI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGFydFRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlVHlwZSIg +dHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlByb2Nlc3NpbmdJbnRlcnZhbCIgdHlwZT0ieHM6ZG91Ymxl +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRl +Q29uZmlndXJhdGlvbiIgdHlwZT0idG5zOkFnZ3JlZ2F0ZUNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8 +L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhU +eXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVGaWx0ZXIiIHR5cGU9InRuczpBZ2dy +ZWdhdGVGaWx0ZXIiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JpbmdGaWx0 +ZXJSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yaW5nRmlsdGVyUmVzdWx0 +IiB0eXBlPSJ0bnM6TW9uaXRvcmluZ0ZpbHRlclJlc3VsdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iRXZlbnRGaWx0ZXJSZXN1bHQiPg0KICAgIDx4czpjb21wbGV4Q29udGVudCBtaXhl +ZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6TW9uaXRvcmluZ0ZpbHRl +clJlc3VsdCI+DQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJTZWxlY3RDbGF1c2VSZXN1bHRzIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXNDb2RlIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlNlbGVjdENsYXVzZURpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0lu +Zm8iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iV2hlcmVDbGF1c2VSZXN1bHQiIHR5cGU9InRuczpDb250ZW50RmlsdGVyUmVzdWx0 +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNl +Pg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAgPC94czpjb21wbGV4Q29udGVudD4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRXZlbnRGaWx0ZXJSZXN1bHQiIHR5 +cGU9InRuczpFdmVudEZpbHRlclJlc3VsdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0i +QWdncmVnYXRlRmlsdGVyUmVzdWx0Ij4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZh +bHNlIj4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOk1vbml0b3JpbmdGaWx0ZXJSZXN1 +bHQiPg0KICAgICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +UmV2aXNlZFN0YXJ0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXZpc2VkUHJvY2Vzc2luZ0ludGVydmFsIiB0eXBl +PSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJSZXZpc2VkQWdncmVnYXRlQ29uZmlndXJhdGlvbiIgdHlwZT0idG5zOkFnZ3JlZ2F0ZUNvbmZp +Z3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICAgIDwveHM6 +c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAgICA8L3hzOmNvbXBsZXhDb250ZW50 +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVGaWx0 +ZXJSZXN1bHQiIHR5cGU9InRuczpBZ2dyZWdhdGVGaWx0ZXJSZXN1bHQiIC8+DQoNCiAgPHhzOmNv +bXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JpbmdQYXJhbWV0ZXJzIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDbGllbnRIYW5kbGUiIHR5cGU9InhzOnVuc2lnbmVk +SW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTYW1wbGluZ0lu +dGVydmFsIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkZpbHRlciIgdHlwZT0idWE6RXh0ZW5zaW9uT2JqZWN0IiBtaW5PY2N1cnM9IjAi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVldWVTaXplIiB0 +eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iRGlzY2FyZE9sZGVzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9Ik1vbml0b3JpbmdQYXJhbWV0ZXJzIiB0eXBlPSJ0bnM6TW9uaXRvcmluZ1BhcmFtZXRlcnMi +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JlZEl0ZW1DcmVhdGVSZXF1ZXN0 +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJdGVtVG9Nb25p +dG9yIiB0eXBlPSJ0bnM6UmVhZFZhbHVlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yaW5nTW9kZSIgdHlwZT0idG5zOk1v +bml0b3JpbmdNb2RlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJS +ZXF1ZXN0ZWRQYXJhbWV0ZXJzIiB0eXBlPSJ0bnM6TW9uaXRvcmluZ1BhcmFtZXRlcnMiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTW9uaXRvcmVkSXRlbUNyZWF0ZVJlcXVl +c3QiIHR5cGU9InRuczpNb25pdG9yZWRJdGVtQ3JlYXRlUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iTGlzdE9mTW9uaXRvcmVkSXRlbUNyZWF0ZVJlcXVlc3QiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vbml0b3JlZEl0ZW1DcmVhdGVS +ZXF1ZXN0IiB0eXBlPSJ0bnM6TW9uaXRvcmVkSXRlbUNyZWF0ZVJlcXVlc3QiIG1pbk9jY3Vycz0i +MCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk1v +bml0b3JlZEl0ZW1DcmVhdGVSZXF1ZXN0IiB0eXBlPSJ0bnM6TGlzdE9mTW9uaXRvcmVkSXRlbUNy +ZWF0ZVJlcXVlc3QiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBs +ZXhUeXBlIG5hbWU9Ik1vbml0b3JlZEl0ZW1DcmVhdGVSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGUiIHR5cGU9InVhOlN0YXR1c0Nv +ZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vbml0b3JlZEl0 +ZW1JZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlJldmlzZWRTYW1wbGluZ0ludGVydmFsIiB0eXBlPSJ4czpkb3VibGUiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJldmlzZWRRdWV1ZVNpemUi +IHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJGaWx0ZXJSZXN1bHQiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yZWRJdGVtQ3JlYXRlUmVzdWx0IiB0 +eXBlPSJ0bnM6TW9uaXRvcmVkSXRlbUNyZWF0ZVJlc3VsdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5 +cGUgbmFtZT0iTGlzdE9mTW9uaXRvcmVkSXRlbUNyZWF0ZVJlc3VsdCI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTW9uaXRvcmVkSXRlbUNyZWF0ZVJlc3VsdCIg +dHlwZT0idG5zOk1vbml0b3JlZEl0ZW1DcmVhdGVSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2Nj +dXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk1vbml0b3JlZEl0 +ZW1DcmVhdGVSZXN1bHQiIHR5cGU9InRuczpMaXN0T2ZNb25pdG9yZWRJdGVtQ3JlYXRlUmVzdWx0 +IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJDcmVhdGVNb25pdG9yZWRJdGVtc1JlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVhZGVy +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iU3Vic2NyaXB0aW9uSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUaW1lc3RhbXBzVG9SZXR1cm4iIHR5cGU9InRuczpU +aW1lc3RhbXBzVG9SZXR1cm4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9Ikl0ZW1zVG9DcmVhdGUiIHR5cGU9InRuczpMaXN0T2ZNb25pdG9yZWRJdGVtQ3JlYXRlUmVx +dWVzdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNl +Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJDcmVhdGVNb25pdG9y +ZWRJdGVtc1JlcXVlc3QiIHR5cGU9InRuczpDcmVhdGVNb25pdG9yZWRJdGVtc1JlcXVlc3QiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNyZWF0ZU1vbml0b3JlZEl0ZW1zUmVzcG9uc2Ui +Pg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVh +ZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ0bnM6TGlzdE9m +TW9uaXRvcmVkSXRlbUNyZWF0ZVJlc3VsdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlz +dE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +PC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i +Q3JlYXRlTW9uaXRvcmVkSXRlbXNSZXNwb25zZSIgdHlwZT0idG5zOkNyZWF0ZU1vbml0b3JlZEl0 +ZW1zUmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JlZEl0ZW1N +b2RpZnlSZXF1ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJNb25pdG9yZWRJdGVtSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRQYXJhbWV0ZXJzIiB0eXBlPSJ0bnM6 +TW9uaXRvcmluZ1BhcmFtZXRlcnMiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iTW9uaXRvcmVkSXRlbU1vZGlmeVJlcXVlc3QiIHR5cGU9InRuczpNb25pdG9yZWRJdGVtTW9k +aWZ5UmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mTW9uaXRvcmVk +SXRlbU1vZGlmeVJlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9Ik1vbml0b3JlZEl0ZW1Nb2RpZnlSZXF1ZXN0IiB0eXBlPSJ0bnM6TW9uaXRvcmVkSXRl +bU1vZGlmeVJlcXVlc3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQog +IDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk1vbml0b3JlZEl0ZW1Nb2RpZnlSZXF1ZXN0IiB0eXBl +PSJ0bnM6TGlzdE9mTW9uaXRvcmVkSXRlbU1vZGlmeVJlcXVlc3QiIG5pbGxhYmxlPSJ0cnVlIj48 +L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JlZEl0ZW1Nb2Rp +ZnlSZXN1bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0 +YXR1c0NvZGUiIHR5cGU9InVhOlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJldmlzZWRTYW1wbGluZ0ludGVydmFsIiB0eXBlPSJ4czpkb3VibGUi +IG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJldmlzZWRRdWV1ZVNp +emUiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJGaWx0ZXJSZXN1bHQiIHR5cGU9InVhOkV4dGVuc2lvbk9iamVjdCIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yZWRJdGVtTW9kaWZ5UmVzdWx0 +IiB0eXBlPSJ0bnM6TW9uaXRvcmVkSXRlbU1vZGlmeVJlc3VsdCIgLz4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iTGlzdE9mTW9uaXRvcmVkSXRlbU1vZGlmeVJlc3VsdCI+DQogICAgPHhzOnNl +cXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTW9uaXRvcmVkSXRlbU1vZGlmeVJlc3Vs +dCIgdHlwZT0idG5zOk1vbml0b3JlZEl0ZW1Nb2RpZnlSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4 +T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk1vbml0b3Jl +ZEl0ZW1Nb2RpZnlSZXN1bHQiIHR5cGU9InRuczpMaXN0T2ZNb25pdG9yZWRJdGVtTW9kaWZ5UmVz +dWx0IiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJNb2RpZnlNb25pdG9yZWRJdGVtc1JlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU3Vic2NyaXB0aW9uSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUaW1lc3RhbXBzVG9SZXR1cm4iIHR5cGU9InRu +czpUaW1lc3RhbXBzVG9SZXR1cm4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9Ikl0ZW1zVG9Nb2RpZnkiIHR5cGU9InRuczpMaXN0T2ZNb25pdG9yZWRJdGVtTW9kaWZ5 +UmVxdWVzdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb2RpZnlNb25p +dG9yZWRJdGVtc1JlcXVlc3QiIHR5cGU9InRuczpNb2RpZnlNb25pdG9yZWRJdGVtc1JlcXVlc3Qi +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vZGlmeU1vbml0b3JlZEl0ZW1zUmVzcG9u +c2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNl +SGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ0bnM6TGlz +dE9mTW9uaXRvcmVkSXRlbU1vZGlmeVJlc3VsdCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6 +TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iTW9kaWZ5TW9uaXRvcmVkSXRlbXNSZXNwb25zZSIgdHlwZT0idG5zOk1vZGlmeU1vbml0b3Jl +ZEl0ZW1zUmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNldE1vbml0b3Jp +bmdNb2RlUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25J +ZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ik1vbml0b3JpbmdNb2RlIiB0eXBlPSJ0bnM6TW9uaXRvcmluZ01vZGUiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vbml0b3JlZEl0ZW1JZHMiIHR5 +cGU9InVhOkxpc3RPZlVJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1l +PSJTZXRNb25pdG9yaW5nTW9kZVJlcXVlc3QiIHR5cGU9InRuczpTZXRNb25pdG9yaW5nTW9kZVJl +cXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNldE1vbml0b3JpbmdNb2RlUmVz +cG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3Bv +bnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFi +bGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ1YTpM +aXN0T2ZTdGF0dXNDb2RlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3RpY0luZm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9z +dGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVl +bmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTZXRNb25pdG9y +aW5nTW9kZVJlc3BvbnNlIiB0eXBlPSJ0bnM6U2V0TW9uaXRvcmluZ01vZGVSZXNwb25zZSIgLz4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2V0VHJpZ2dlcmluZ1JlcXVlc3QiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9 +InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50 +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUcmlnZ2VyaW5nSXRl +bUlkIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iTGlua3NUb0FkZCIgdHlwZT0idWE6TGlzdE9mVUludDMyIiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTGlua3NUb1Jl +bW92ZSIgdHlwZT0idWE6TGlzdE9mVUludDMyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IlNldFRyaWdnZXJpbmdSZXF1ZXN0IiB0eXBlPSJ0bnM6U2V0VHJpZ2dlcmluZ1Jl +cXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNldFRyaWdnZXJpbmdSZXNwb25z +ZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VI +ZWFkZXIiIHR5cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkFkZFJlc3VsdHMiIHR5cGU9InVhOkxp +c3RPZlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJBZGREaWFnbm9zdGljSW5mb3MiIHR5cGU9InVhOkxpc3RPZkRpYWdu +b3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iUmVtb3ZlUmVzdWx0cyIgdHlwZT0idWE6TGlzdE9mU3RhdHVzQ29kZSIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJl +bW92ZURpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iU2V0VHJpZ2dlcmluZ1Jlc3BvbnNlIiB0 +eXBlPSJ0bnM6U2V0VHJpZ2dlcmluZ1Jlc3BvbnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJEZWxldGVNb25pdG9yZWRJdGVtc1JlcXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU3Vic2NyaXB0aW9uSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNb25pdG9yZWRJdGVtSWRzIiB0eXBlPSJ1YTpM +aXN0T2ZVSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpz +ZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGVsZXRl +TW9uaXRvcmVkSXRlbXNSZXF1ZXN0IiB0eXBlPSJ0bnM6RGVsZXRlTW9uaXRvcmVkSXRlbXNSZXF1 +ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWxldGVNb25pdG9yZWRJdGVtc1Jl +c3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNw +b25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzdWx0cyIgdHlwZT0idWE6 +TGlzdE9mU3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25v +c3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRGVsZXRlTW9u +aXRvcmVkSXRlbXNSZXNwb25zZSIgdHlwZT0idG5zOkRlbGV0ZU1vbml0b3JlZEl0ZW1zUmVzcG9u +c2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNyZWF0ZVN1YnNjcmlwdGlvblJlcXVl +c3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RI +ZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0 +cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkUHVibGlzaGluZ0ludGVy +dmFsIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlJlcXVlc3RlZExpZmV0aW1lQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRNYXhLZWVwQWxp +dmVDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9Ik1heE5vdGlmaWNhdGlvbnNQZXJQdWJsaXNoIiB0eXBlPSJ4czp1bnNp +Z25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlz +aGluZ0VuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlByaW9yaXR5IiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6 +ZWxlbWVudCBuYW1lPSJDcmVhdGVTdWJzY3JpcHRpb25SZXF1ZXN0IiB0eXBlPSJ0bnM6Q3JlYXRl +U3Vic2NyaXB0aW9uUmVxdWVzdCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ3JlYXRl +U3Vic2NyaXB0aW9uUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJz +Y3JpcHRpb25JZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9IlJldmlzZWRQdWJsaXNoaW5nSW50ZXJ2YWwiIHR5cGU9InhzOmRv +dWJsZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV2aXNlZExp +ZmV0aW1lQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJSZXZpc2VkTWF4S2VlcEFsaXZlQ291bnQiIHR5cGU9InhzOnVu +c2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpj +b21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iQ3JlYXRlU3Vic2NyaXB0aW9uUmVzcG9u +c2UiIHR5cGU9InRuczpDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZSIgLz4NCg0KICA8eHM6Y29t +cGxleFR5cGUgbmFtZT0iTW9kaWZ5U3Vic2NyaXB0aW9uUmVxdWVzdCI+DQogICAgPHhzOnNlcXVl +bmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJl +cXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25JZCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVlc3RlZFB1Ymxpc2hpbmdJ +bnRlcnZhbCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJSZXF1ZXN0ZWRMaWZldGltZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIg +bWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkTWF4S2Vl +cEFsaXZlQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJNYXhOb3RpZmljYXRpb25zUGVyUHVibGlzaCIgdHlwZT0ieHM6 +dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlBy +aW9yaXR5IiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJNb2Rp +ZnlTdWJzY3JpcHRpb25SZXF1ZXN0IiB0eXBlPSJ0bnM6TW9kaWZ5U3Vic2NyaXB0aW9uUmVxdWVz +dCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTW9kaWZ5U3Vic2NyaXB0aW9uUmVzcG9u +c2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNl +SGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXZpc2VkUHVibGlzaGluZ0ludGVy +dmFsIiB0eXBlPSJ4czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IlJldmlzZWRMaWZldGltZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV2aXNlZE1heEtlZXBBbGl2ZUNv +dW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6c2Vx +dWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ik1vZGlmeVN1 +YnNjcmlwdGlvblJlc3BvbnNlIiB0eXBlPSJ0bnM6TW9kaWZ5U3Vic2NyaXB0aW9uUmVzcG9uc2Ui +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNldFB1Ymxpc2hpbmdNb2RlUmVxdWVzdCI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRl +ciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoaW5nRW5hYmxlZCIgdHlwZT0ieHM6 +Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2Ny +aXB0aW9uSWRzIiB0eXBlPSJ1YTpMaXN0T2ZVSW50MzIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iU2V0UHVibGlzaGluZ01vZGVSZXF1ZXN0IiB0eXBlPSJ0bnM6U2V0UHVi +bGlzaGluZ01vZGVSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXRQdWJs +aXNoaW5nTW9kZVJlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVhZGVyIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzdWx0 +cyIgdHlwZT0idWE6TGlzdE9mU3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvcyIgdHlwZT0idWE6 +TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt +ZT0iU2V0UHVibGlzaGluZ01vZGVSZXNwb25zZSIgdHlwZT0idG5zOlNldFB1Ymxpc2hpbmdNb2Rl +UmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5vdGlmaWNhdGlvbk1lc3Nh +Z2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcXVlbmNl +TnVtYmVyIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iUHVibGlzaFRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb3RpZmljYXRpb25EYXRhIiB0eXBlPSJ1 +YTpMaXN0T2ZFeHRlbnNpb25PYmplY3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTm90aWZpY2F0aW9uTWVzc2FnZSIgdHlwZT0idG5zOk5vdGlmaWNhdGlvbk1lc3NhZ2Ui +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5vdGlmaWNhdGlvbkRhdGEiPg0KICAgIDx4 +czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJOb3RpZmljYXRpb25EYXRhIiB0eXBlPSJ0bnM6Tm90aWZpY2F0aW9u +RGF0YSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRGF0YUNoYW5nZU5vdGlmaWNhdGlv +biI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0 +ZW5zaW9uIGJhc2U9InRuczpOb3RpZmljYXRpb25EYXRhIj4NCiAgICAgICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vbml0b3JlZEl0ZW1zIiB0eXBlPSJ0bnM6 +TGlzdE9mTW9uaXRvcmVkSXRlbU5vdGlmaWNhdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEaWFnbm9zdGljSW5mb3MiIHR5 +cGU9InVhOkxpc3RPZkRpYWdub3N0aWNJbmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVl +IiAvPg0KICAgICAgICA8L3hzOnNlcXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24+DQogICAg +PC94czpjb21wbGV4Q29udGVudD4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iRGF0YUNoYW5nZU5vdGlmaWNhdGlvbiIgdHlwZT0idG5zOkRhdGFDaGFuZ2VOb3RpZmlj +YXRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1vbml0b3JlZEl0ZW1Ob3RpZmlj +YXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNsaWVu +dEhhbmRsZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlZhbHVlIiB0eXBlPSJ1YTpEYXRhVmFsdWUiIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTW9uaXRvcmVkSXRlbU5vdGlmaWNhdGlvbiIgdHlwZT0i +dG5zOk1vbml0b3JlZEl0ZW1Ob3RpZmljYXRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ikxpc3RPZk1vbml0b3JlZEl0ZW1Ob3RpZmljYXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1vbml0b3JlZEl0ZW1Ob3RpZmljYXRpb24iIHR5cGU9 +InRuczpNb25pdG9yZWRJdGVtTm90aWZpY2F0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0i +dW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZNb25pdG9yZWRJdGVtTm90 +aWZpY2F0aW9uIiB0eXBlPSJ0bnM6TGlzdE9mTW9uaXRvcmVkSXRlbU5vdGlmaWNhdGlvbiIgbmls +bGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRXZl +bnROb3RpZmljYXRpb25MaXN0Ij4NCiAgICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNl +Ij4NCiAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOk5vdGlmaWNhdGlvbkRhdGEiPg0KICAg +ICAgICA8eHM6c2VxdWVuY2U+DQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXZlbnRzIiB0 +eXBlPSJ0bnM6TGlzdE9mRXZlbnRGaWVsZExpc3QiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRy +dWUiIC8+DQogICAgICAgIDwveHM6c2VxdWVuY2U+DQogICAgICA8L3hzOmV4dGVuc2lvbj4NCiAg +ICA8L3hzOmNvbXBsZXhDb250ZW50Pg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJFdmVudE5vdGlmaWNhdGlvbkxpc3QiIHR5cGU9InRuczpFdmVudE5vdGlmaWNhdGlv +bkxpc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV2ZW50RmllbGRMaXN0Ij4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDbGllbnRIYW5kbGUiIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJFdmVudEZpZWxkcyIgdHlwZT0idWE6TGlzdE9mVmFyaWFudCIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJFdmVudEZpZWxkTGlzdCIgdHlwZT0idG5zOkV2ZW50Rmll +bGRMaXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZFdmVudEZpZWxkTGlz +dCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRXZlbnRGaWVs +ZExpc3QiIHR5cGU9InRuczpFdmVudEZpZWxkTGlzdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9 +InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mRXZlbnRGaWVsZExpc3Qi +IHR5cGU9InRuczpMaXN0T2ZFdmVudEZpZWxkTGlzdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxl +bWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSGlzdG9yeUV2ZW50RmllbGRMaXN0Ij4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFdmVudEZpZWxkcyIg +dHlwZT0idWE6TGlzdE9mVmFyaWFudCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJIaXN0b3J5RXZlbnRGaWVsZExpc3QiIHR5cGU9InRuczpIaXN0b3J5RXZlbnRGaWVsZExp +c3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkhpc3RvcnlFdmVudEZpZWxk +TGlzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSGlzdG9y +eUV2ZW50RmllbGRMaXN0IiB0eXBlPSJ0bnM6SGlzdG9yeUV2ZW50RmllbGRMaXN0IiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZIaXN0b3J5RXZlbnRGaWVsZExpc3QiIHR5cGU9InRuczpMaXN0T2ZIaXN0b3J5RXZlbnRGaWVs +ZExpc3QiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IlN0YXR1c0NoYW5nZU5vdGlmaWNhdGlvbiI+DQogICAgPHhzOmNvbXBsZXhDb250ZW50 +IG1peGVkPSJmYWxzZSI+DQogICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpOb3RpZmljYXRp +b25EYXRhIj4NCiAgICAgICAgPHhzOnNlcXVlbmNlPg0KICAgICAgICAgIDx4czplbGVtZW50IG5h +bWU9IlN0YXR1cyIgdHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvIiB0eXBlPSJ1YTpEaWFnbm9zdGlj +SW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1 +ZW5jZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ+DQog +IDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NoYW5nZU5vdGlm +aWNhdGlvbiIgdHlwZT0idG5zOlN0YXR1c0NoYW5nZU5vdGlmaWNhdGlvbiIgLz4NCg0KICA8eHM6 +Y29tcGxleFR5cGUgbmFtZT0iU3Vic2NyaXB0aW9uQWNrbm93bGVkZ2VtZW50Ij4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25JZCIgdHlwZT0i +eHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlNlcXVlbmNlTnVtYmVyIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5h +bWU9IlN1YnNjcmlwdGlvbkFja25vd2xlZGdlbWVudCIgdHlwZT0idG5zOlN1YnNjcmlwdGlvbkFj +a25vd2xlZGdlbWVudCIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3Vic2Ny +aXB0aW9uQWNrbm93bGVkZ2VtZW50Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTdWJzY3JpcHRpb25BY2tub3dsZWRnZW1lbnQiIHR5cGU9InRuczpTdWJzY3Jp +cHRpb25BY2tub3dsZWRnZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQi +IG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5 +cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlN1YnNjcmlwdGlvbkFja25vd2xlZGdlbWVu +dCIgdHlwZT0idG5zOkxpc3RPZlN1YnNjcmlwdGlvbkFja25vd2xlZGdlbWVudCIgbmlsbGFibGU9 +InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUHVibGlzaFJl +cXVlc3QiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcXVl +c3RIZWFkZXIiIHR5cGU9InRuczpSZXF1ZXN0SGVhZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uQWNrbm93bGVk +Z2VtZW50cyIgdHlwZT0idG5zOkxpc3RPZlN1YnNjcmlwdGlvbkFja25vd2xlZGdlbWVudCIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJsaXNoUmVxdWVzdCIgdHlwZT0i +dG5zOlB1Ymxpc2hSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQdWJsaXNo +UmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJl +c3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVzcG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25JZCIg +dHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkF2YWlsYWJsZVNlcXVlbmNlTnVtYmVycyIgdHlwZT0idWE6TGlzdE9mVUludDMyIiBt +aW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +TW9yZU5vdGlmaWNhdGlvbnMiIHR5cGU9InhzOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9Ik5vdGlmaWNhdGlvbk1lc3NhZ2UiIHR5cGU9InRuczpOb3Rp +ZmljYXRpb25NZXNzYWdlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iUmVzdWx0cyIgdHlwZT0idWE6TGlzdE9mU3RhdHVzQ29kZSIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRp +YWdub3N0aWNJbmZvcyIgdHlwZT0idWE6TGlzdE9mRGlhZ25vc3RpY0luZm8iIG1pbk9jY3Vycz0i +MCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4 +VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaFJlc3BvbnNlIiB0eXBlPSJ0bnM6UHVi +bGlzaFJlc3BvbnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZXB1Ymxpc2hSZXF1 +ZXN0Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0 +SGVhZGVyIiB0eXBlPSJ0bnM6UmVxdWVzdEhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0i +dHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbklkIiB0eXBlPSJ4 +czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0i +UmV0cmFuc21pdFNlcXVlbmNlTnVtYmVyIiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IlJlcHVibGlzaFJlcXVlc3QiIHR5cGU9InRuczpSZXB1Ymxpc2hSZXF1ZXN0 +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJSZXB1Ymxpc2hSZXNwb25zZSI+DQogICAg +PHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2VIZWFkZXIiIHR5 +cGU9InRuczpSZXNwb25zZUhlYWRlciIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5vdGlmaWNhdGlvbk1lc3NhZ2UiIHR5cGU9InRuczpO +b3RpZmljYXRpb25NZXNzYWdlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +IlJlcHVibGlzaFJlc3BvbnNlIiB0eXBlPSJ0bnM6UmVwdWJsaXNoUmVzcG9uc2UiIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZmVyUmVzdWx0Ij4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNDb2RlIiB0eXBlPSJ1YTpTdGF0dXNDb2Rl +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdmFpbGFibGVTZXF1 +ZW5jZU51bWJlcnMiIHR5cGU9InVhOkxpc3RPZlVJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclJlc3VsdCIgdHlwZT0idG5zOlRyYW5zZmVyUmVzdWx0 +IiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZUcmFuc2ZlclJlc3VsdCI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNmZXJSZXN1bHQi +IHR5cGU9InRuczpUcmFuc2ZlclJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91 +bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21w +bGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mVHJhbnNmZXJSZXN1bHQiIHR5cGU9 +InRuczpMaXN0T2ZUcmFuc2ZlclJlc3VsdCIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4N +Cg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmZXJTdWJzY3JpcHRpb25zUmVxdWVzdCI+ +DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRl +ciIgdHlwZT0idG5zOlJlcXVlc3RIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdWJzY3JpcHRpb25JZHMiIHR5cGU9InVhOkxp +c3RPZlVJbnQzMiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlNlbmRJbml0aWFsVmFsdWVzIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iVHJhbnNmZXJTdWJzY3JpcHRpb25zUmVxdWVzdCIgdHlwZT0idG5zOlRy +YW5zZmVyU3Vic2NyaXB0aW9uc1JlcXVlc3QiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9 +IlRyYW5zZmVyU3Vic2NyaXB0aW9uc1Jlc3BvbnNlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUhlYWRlciIgdHlwZT0idG5zOlJlc3BvbnNlSGVh +ZGVyIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUmVzdWx0cyIgdHlwZT0idG5zOkxpc3RPZlRyYW5zZmVyUmVzdWx0IiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25vc3Rp +Y0luZm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclN1YnNjcmlwdGlvbnNSZXNwb25zZSIgdHlwZT0i +dG5zOlRyYW5zZmVyU3Vic2NyaXB0aW9uc1Jlc3BvbnNlIiAvPg0KDQogIDx4czpjb21wbGV4VHlw +ZSBuYW1lPSJEZWxldGVTdWJzY3JpcHRpb25zUmVxdWVzdCI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdEhlYWRlciIgdHlwZT0idG5zOlJlcXVlc3RI +ZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJTdWJzY3JpcHRpb25JZHMiIHR5cGU9InVhOkxpc3RPZlVJbnQzMiIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBs +ZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEZWxldGVTdWJzY3JpcHRpb25zUmVxdWVzdCIg +dHlwZT0idG5zOkRlbGV0ZVN1YnNjcmlwdGlvbnNSZXF1ZXN0IiAvPg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJEZWxldGVTdWJzY3JpcHRpb25zUmVzcG9uc2UiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlc3BvbnNlSGVhZGVyIiB0eXBlPSJ0bnM6UmVz +cG9uc2VIZWFkZXIiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJSZXN1bHRzIiB0eXBlPSJ1YTpMaXN0T2ZTdGF0dXNDb2RlIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhZ25v +c3RpY0luZm9zIiB0eXBlPSJ1YTpMaXN0T2ZEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBl +Pg0KICA8eHM6ZWxlbWVudCBuYW1lPSJEZWxldGVTdWJzY3JpcHRpb25zUmVzcG9uc2UiIHR5cGU9 +InRuczpEZWxldGVTdWJzY3JpcHRpb25zUmVzcG9uc2UiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9IkJ1aWxkSW5mbyI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iUHJvZHVjdFVyaSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWFudWZhY3R1cmVyTmFtZSIgdHlw +ZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iUHJvZHVjdE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNvZnR3YXJlVmVy +c2lvbiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnVpbGROdW1iZXIiIHR5cGU9InhzOnN0cmluZyIgbWlu +T2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkJ1 +aWxkRGF0ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJCdWlsZElu +Zm8iIHR5cGU9InRuczpCdWlsZEluZm8iIC8+DQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IlJl +ZHVuZGFuY3lTdXBwb3J0Ij4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4N +CiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTm9uZV8wIiAvPg0KICAgICAgPHhzOmVudW1l +cmF0aW9uIHZhbHVlPSJDb2xkXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ildh +cm1fMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSG90XzMiIC8+DQogICAgICA8 +eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRyYW5zcGFyZW50XzQiIC8+DQogICAgICA8eHM6ZW51bWVy +YXRpb24gdmFsdWU9IkhvdEFuZE1pcnJvcmVkXzUiIC8+DQogICAgPC94czpyZXN0cmljdGlvbj4N +CiAgPC94czpzaW1wbGVUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJSZWR1bmRhbmN5U3VwcG9y +dCIgdHlwZT0idG5zOlJlZHVuZGFuY3lTdXBwb3J0IiAvPg0KDQogIDx4czpzaW1wbGVUeXBlICBu +YW1lPSJTZXJ2ZXJTdGF0ZSI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+ +DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlJ1bm5pbmdfMCIgLz4NCiAgICAgIDx4czpl +bnVtZXJhdGlvbiB2YWx1ZT0iRmFpbGVkXzEiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFs +dWU9Ik5vQ29uZmlndXJhdGlvbl8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJT +dXNwZW5kZWRfMyIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iU2h1dGRvd25fNCIg +Lz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVGVzdF81IiAvPg0KICAgICAgPHhzOmVu +dW1lcmF0aW9uIHZhbHVlPSJDb21tdW5pY2F0aW9uRmF1bHRfNiIgLz4NCiAgICAgIDx4czplbnVt +ZXJhdGlvbiB2YWx1ZT0iVW5rbm93bl83IiAvPg0KICAgIDwveHM6cmVzdHJpY3Rpb24+DQogIDwv +eHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyU3RhdGUiIHR5cGU9InRu +czpTZXJ2ZXJTdGF0ZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmVkdW5kYW50U2Vy +dmVyRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IlNlcnZlcklkIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUi +IC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2aWNlTGV2ZWwiIHR5cGU9InhzOnVuc2ln +bmVkQnl0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVy +U3RhdGUiIHR5cGU9InRuczpTZXJ2ZXJTdGF0ZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgIDwveHM6 +c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlJlZHVu +ZGFudFNlcnZlckRhdGFUeXBlIiB0eXBlPSJ0bnM6UmVkdW5kYW50U2VydmVyRGF0YVR5cGUiIC8+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlJlZHVuZGFudFNlcnZlckRhdGFUeXBl +Ij4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWR1bmRhbnRT +ZXJ2ZXJEYXRhVHlwZSIgdHlwZT0idG5zOlJlZHVuZGFudFNlcnZlckRhdGFUeXBlIiBtaW5PY2N1 +cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hz +OnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0 +T2ZSZWR1bmRhbnRTZXJ2ZXJEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlJlZHVuZGFudFNlcnZl +ckRhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJFbmRwb2ludFVybExpc3REYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kcG9pbnRVcmxMaXN0IiB0eXBlPSJ1YTpMaXN0T2ZT +dHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5j +ZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kcG9pbnRVcmxM +aXN0RGF0YVR5cGUiIHR5cGU9InRuczpFbmRwb2ludFVybExpc3REYXRhVHlwZSIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRW5kcG9pbnRVcmxMaXN0RGF0YVR5cGUiPg0KICAg +IDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkVuZHBvaW50VXJsTGlzdERh +dGFUeXBlIiB0eXBlPSJ0bnM6RW5kcG9pbnRVcmxMaXN0RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIg +bWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVu +Y2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZkVuZHBv +aW50VXJsTGlzdERhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mRW5kcG9pbnRVcmxMaXN0RGF0YVR5 +cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9Ik5ldHdvcmtHcm91cERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJTZXJ2ZXJVcmkiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik5ldHdvcmtQYXRocyIg +dHlwZT0idG5zOkxpc3RPZkVuZHBvaW50VXJsTGlzdERhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5p +bGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+ +DQogIDx4czplbGVtZW50IG5hbWU9Ik5ldHdvcmtHcm91cERhdGFUeXBlIiB0eXBlPSJ0bnM6TmV0 +d29ya0dyb3VwRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZk5l +dHdvcmtHcm91cERhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJOZXR3b3JrR3JvdXBEYXRhVHlwZSIgdHlwZT0idG5zOk5ldHdvcmtHcm91cERhdGFU +eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVu +dCBuYW1lPSJMaXN0T2ZOZXR3b3JrR3JvdXBEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZk5ldHdv +cmtHcm91cERhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJTYW1wbGluZ0ludGVydmFsRGlhZ25vc3RpY3NEYXRhVHlwZSI+DQog +ICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2FtcGxpbmdJbnRlcnZh +bCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJNb25pdG9yZWRJdGVtQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYXhNb25pdG9yZWRJdGVtQ291bnQiIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJEaXNhYmxlZE1vbml0b3JlZEl0ZW1Db3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJTYW1wbGluZ0ludGVydmFsRGlhZ25vc3RpY3NEYXRhVHlwZSIg +dHlwZT0idG5zOlNhbXBsaW5nSW50ZXJ2YWxEaWFnbm9zdGljc0RhdGFUeXBlIiAvPg0KDQogIDx4 +czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZTYW1wbGluZ0ludGVydmFsRGlhZ25vc3RpY3NEYXRh +VHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2FtcGxp +bmdJbnRlcnZhbERpYWdub3N0aWNzRGF0YVR5cGUiIHR5cGU9InRuczpTYW1wbGluZ0ludGVydmFs +RGlhZ25vc3RpY3NEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlw +ZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2FtcGxpbmdJbnRlcnZhbERpYWdub3N0aWNz +RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZTYW1wbGluZ0ludGVydmFsRGlhZ25vc3RpY3NEYXRh +VHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxleFR5cGUg +bmFtZT0iU2VydmVyRGlhZ25vc3RpY3NTdW1tYXJ5RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5j +ZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlcnZlclZpZXdDb3VudCIgdHlwZT0ieHM6dW5z +aWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkN1cnJl +bnRTZXNzaW9uQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDdW11bGF0ZWRTZXNzaW9uQ291bnQiIHR5cGU9InhzOnVu +c2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZWN1 +cml0eVJlamVjdGVkU2Vzc2lvbkNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVqZWN0ZWRTZXNzaW9uQ291bnQiIHR5 +cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJTZXNzaW9uVGltZW91dENvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2Vzc2lvbkFib3J0Q291bnQiIHR5cGU9 +InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJDdXJyZW50U3Vic2NyaXB0aW9uQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDdW11bGF0ZWRTdWJzY3JpcHRpb25D +b3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlB1Ymxpc2hpbmdJbnRlcnZhbENvdW50IiB0eXBlPSJ4czp1bnNpZ25lZElu +dCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2VjdXJpdHlSZWpl +Y3RlZFJlcXVlc3RzQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWplY3RlZFJlcXVlc3RzQ291bnQiIHR5cGU9Inhz +OnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94 +czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iU2VydmVyRGlhZ25vc3RpY3NTdW1t +YXJ5RGF0YVR5cGUiIHR5cGU9InRuczpTZXJ2ZXJEaWFnbm9zdGljc1N1bW1hcnlEYXRhVHlwZSIg +Lz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2VydmVyU3RhdHVzRGF0YVR5cGUiPg0KICAg +IDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXJ0VGltZSIgdHlwZT0i +eHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkN1 +cnJlbnRUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iU3RhdGUiIHR5cGU9InRuczpTZXJ2ZXJTdGF0ZSIgbWluT2NjdXJzPSIw +IiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQnVpbGRJbmZvIiB0eXBlPSJ0bnM6QnVpbGRJ +bmZvIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iU2Vjb25kc1RpbGxTaHV0ZG93biIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNodXRkb3duUmVhc29uIiB0eXBlPSJ1 +YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwv +eHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IlNl +cnZlclN0YXR1c0RhdGFUeXBlIiB0eXBlPSJ0bnM6U2VydmVyU3RhdHVzRGF0YVR5cGUiIC8+DQoN +CiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNlc3Npb25EaWFnbm9zdGljc0RhdGFUeXBlIj4NCiAg +ICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXNzaW9uSWQiIHR5cGU9 +InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlNlc3Npb25OYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDbGllbnREZXNjcmlw +dGlvbiIgdHlwZT0idG5zOkFwcGxpY2F0aW9uRGVzY3JpcHRpb24iIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXJ2ZXJVcmkiIHR5cGU9 +InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkVuZHBvaW50VXJsIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMb2NhbGVJZHMiIHR5 +cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IkFjdHVhbFNlc3Npb25UaW1lb3V0IiB0eXBlPSJ4czpkb3Vi +bGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1heFJlc3BvbnNl +TWVzc2FnZVNpemUiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJDbGllbnRDb25uZWN0aW9uVGltZSIgdHlwZT0ieHM6ZGF0ZVRp +bWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNsaWVudExhc3RD +b250YWN0VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IkN1cnJlbnRTdWJzY3JpcHRpb25zQ291bnQiIHR5cGU9InhzOnVuc2ln +bmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDdXJyZW50 +TW9uaXRvcmVkSXRlbXNDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkN1cnJlbnRQdWJsaXNoUmVxdWVzdHNJblF1ZXVl +IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1l +bnQgbmFtZT0iVG90YWxSZXF1ZXN0Q291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFU +eXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iVW5hdXRob3JpemVkUmVxdWVzdENvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWlu +T2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVhZENvdW50IiB0eXBlPSJ0 +bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIg +Lz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikhpc3RvcnlSZWFkQ291bnQiIHR5cGU9InRuczpT +ZXJ2aWNlQ291bnRlckRhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iV3JpdGVDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3Vu +dGVyRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6 +ZWxlbWVudCBuYW1lPSJIaXN0b3J5VXBkYXRlQ291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRl +ckRhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVs +ZW1lbnQgbmFtZT0iQ2FsbENvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIg +bWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9 +IkNyZWF0ZU1vbml0b3JlZEl0ZW1zQ291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFU +eXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iTW9kaWZ5TW9uaXRvcmVkSXRlbXNDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJTZXRNb25pdG9yaW5nTW9kZUNvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50 +ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IlNldFRyaWdnZXJpbmdDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJEZWxldGVNb25pdG9yZWRJdGVtc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNv +dW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IkNyZWF0ZVN1YnNjcmlwdGlvbkNvdW50IiB0eXBlPSJ0bnM6U2Vydmlj +ZUNvdW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg +IDx4czplbGVtZW50IG5hbWU9Ik1vZGlmeVN1YnNjcmlwdGlvbkNvdW50IiB0eXBlPSJ0bnM6U2Vy +dmljZUNvdW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlNldFB1Ymxpc2hpbmdNb2RlQ291bnQiIHR5cGU9InRuczpT +ZXJ2aWNlQ291bnRlckRhdGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUHVibGlzaENvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNv +dW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlJlcHVibGlzaENvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50ZXJE +YXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IlRyYW5zZmVyU3Vic2NyaXB0aW9uc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNv +dW50ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IkRlbGV0ZVN1YnNjcmlwdGlvbnNDb3VudCIgdHlwZT0idG5zOlNlcnZp +Y2VDb3VudGVyRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROb2Rlc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50 +ZXJEYXRhVHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkFkZFJlZmVyZW5jZXNDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJEZWxldGVOb2Rlc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRh +VHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50 +IG5hbWU9IkRlbGV0ZVJlZmVyZW5jZXNDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0 +YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJCcm93c2VDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJC +cm93c2VOZXh0Q291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBlIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNs +YXRlQnJvd3NlUGF0aHNUb05vZGVJZHNDb3VudCIgdHlwZT0idG5zOlNlcnZpY2VDb3VudGVyRGF0 +YVR5cGUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJRdWVyeUZpcnN0Q291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBl +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iUXVlcnlOZXh0Q291bnQiIHR5cGU9InRuczpTZXJ2aWNlQ291bnRlckRhdGFUeXBlIiBtaW5P +Y2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUmVn +aXN0ZXJOb2Rlc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVucmVn +aXN0ZXJOb2Rlc0NvdW50IiB0eXBlPSJ0bnM6U2VydmljZUNvdW50ZXJEYXRhVHlwZSIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTZXNzaW9uRGlhZ25vc3RpY3NEYXRhVHlw +ZSIgdHlwZT0idG5zOlNlc3Npb25EaWFnbm9zdGljc0RhdGFUeXBlIiAvPg0KDQogIDx4czpjb21w +bGV4VHlwZSBuYW1lPSJMaXN0T2ZTZXNzaW9uRGlhZ25vc3RpY3NEYXRhVHlwZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2Vzc2lvbkRpYWdub3N0aWNzRGF0 +YVR5cGUiIHR5cGU9InRuczpTZXNzaW9uRGlhZ25vc3RpY3NEYXRhVHlwZSIgbWluT2NjdXJzPSIw +IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1 +ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iTGlzdE9mU2Vz +c2lvbkRpYWdub3N0aWNzRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZTZXNzaW9uRGlhZ25vc3Rp +Y3NEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6Y29tcGxl +eFR5cGUgbmFtZT0iU2Vzc2lvblNlY3VyaXR5RGlhZ25vc3RpY3NEYXRhVHlwZSI+DQogICAgPHhz +OnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2Vzc2lvbklkIiB0eXBlPSJ1YTpO +b2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJDbGllbnRVc2VySWRPZlNlc3Npb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNsaWVudFVz +ZXJJZEhpc3RvcnkiIHR5cGU9InVhOkxpc3RPZlN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJs +ZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1dGhlbnRpY2F0aW9uTWVjaGFu +aXNtIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmNvZGluZyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1 +cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNw +b3J0UHJvdG9jb2wiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1 +ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlY3VyaXR5TW9kZSIgdHlwZT0idG5zOk1l +c3NhZ2VTZWN1cml0eU1vZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IlNlY3VyaXR5UG9saWN5VXJpIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmls +bGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDbGllbnRDZXJ0aWZpY2F0 +ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAv +Pg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50 +IG5hbWU9IlNlc3Npb25TZWN1cml0eURpYWdub3N0aWNzRGF0YVR5cGUiIHR5cGU9InRuczpTZXNz +aW9uU2VjdXJpdHlEaWFnbm9zdGljc0RhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBu +YW1lPSJMaXN0T2ZTZXNzaW9uU2VjdXJpdHlEaWFnbm9zdGljc0RhdGFUeXBlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXNzaW9uU2VjdXJpdHlEaWFnbm9z +dGljc0RhdGFUeXBlIiB0eXBlPSJ0bnM6U2Vzc2lvblNlY3VyaXR5RGlhZ25vc3RpY3NEYXRhVHlw +ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8+ +DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQg +bmFtZT0iTGlzdE9mU2Vzc2lvblNlY3VyaXR5RGlhZ25vc3RpY3NEYXRhVHlwZSIgdHlwZT0idG5z +Okxpc3RPZlNlc3Npb25TZWN1cml0eURpYWdub3N0aWNzRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVl +Ij48L3hzOmVsZW1lbnQ+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlNlcnZpY2VDb3VudGVy +RGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRv +dGFsQ291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8 +eHM6ZWxlbWVudCBuYW1lPSJFcnJvckNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9IlNlcnZpY2VDb3VudGVyRGF0YVR5cGUiIHR5cGU9InRuczpTZXJ2aWNl +Q291bnRlckRhdGFUeXBlIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTdGF0dXNSZXN1 +bHQiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0Nv +ZGUiIHR5cGU9InVhOlN0YXR1c0NvZGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9IkRpYWdub3N0aWNJbmZvIiB0eXBlPSJ1YTpEaWFnbm9zdGljSW5mbyIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNv +bXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJTdGF0dXNSZXN1bHQiIHR5cGU9InRuczpT +dGF0dXNSZXN1bHQiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlN0YXR1c1Jl +c3VsdCI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU3RhdHVz +UmVzdWx0IiB0eXBlPSJ0bnM6U3RhdHVzUmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0i +dW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hz +OmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJMaXN0T2ZTdGF0dXNSZXN1bHQiIHR5 +cGU9InRuczpMaXN0T2ZTdGF0dXNSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ+ +DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlN1YnNjcmlwdGlvbkRpYWdub3N0aWNzRGF0YVR5 +cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlc3Npb25J +ZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uSWQiIHR5cGU9InhzOnVuc2lnbmVkSW50 +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQcmlvcml0eSIgdHlw +ZT0ieHM6dW5zaWduZWRCeXRlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBu +YW1lPSJQdWJsaXNoaW5nSW50ZXJ2YWwiIHR5cGU9InhzOmRvdWJsZSIgbWluT2NjdXJzPSIwIiAv +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4S2VlcEFsaXZlQ291bnQiIHR5cGU9InhzOnVu +c2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYXhM +aWZldGltZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTWF4Tm90aWZpY2F0aW9uc1BlclB1Ymxpc2giIHR5cGU9Inhz +OnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQ +dWJsaXNoaW5nRW5hYmxlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTW9kaWZ5Q291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBt +aW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmFibGVDb3VudCIgdHlw +ZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkRpc2FibGVDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJlcHVibGlzaFJlcXVlc3RDb3VudCIgdHlwZT0ieHM6 +dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlJl +cHVibGlzaE1lc3NhZ2VSZXF1ZXN0Q291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXB1Ymxpc2hNZXNzYWdlQ291bnQi +IHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVu +dCBuYW1lPSJUcmFuc2ZlclJlcXVlc3RDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRyYW5zZmVycmVkVG9BbHRDbGll +bnRDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4 +czplbGVtZW50IG5hbWU9IlRyYW5zZmVycmVkVG9TYW1lQ2xpZW50Q291bnQiIHR5cGU9InhzOnVu +c2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJQdWJs +aXNoUmVxdWVzdENvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0K +ICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGF0YUNoYW5nZU5vdGlmaWNhdGlvbnNDb3VudCIgdHlw +ZT0ieHM6dW5zaWduZWRJbnQiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5h +bWU9IkV2ZW50Tm90aWZpY2F0aW9uc0NvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2Nj +dXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTm90aWZpY2F0aW9uc0NvdW50IiB0 +eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQg +bmFtZT0iTGF0ZVB1Ymxpc2hSZXF1ZXN0Q291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5P +Y2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDdXJyZW50S2VlcEFsaXZlQ291 +bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJDdXJyZW50TGlmZXRpbWVDb3VudCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVuYWNrbm93bGVkZ2VkTWVz +c2FnZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRGlzY2FyZGVkTWVzc2FnZUNvdW50IiB0eXBlPSJ4czp1bnNpZ25l +ZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTW9uaXRvcmVk +SXRlbUNvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iRGlzYWJsZWRNb25pdG9yZWRJdGVtQ291bnQiIHR5cGU9InhzOnVu +c2lnbmVkSW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNb25p +dG9yaW5nUXVldWVPdmVyZmxvd0NvdW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJz +PSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTmV4dFNlcXVlbmNlTnVtYmVyIiB0eXBl +PSJ4czp1bnNpZ25lZEludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iRXZlbnRRdWV1ZU92ZXJGbG93Q291bnQiIHR5cGU9InhzOnVuc2lnbmVkSW50IiBtaW5PY2N1 +cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iU3Vic2NyaXB0aW9uRGlhZ25vc3RpY3NEYXRhVHlwZSIgdHlwZT0idG5z +OlN1YnNjcmlwdGlvbkRpYWdub3N0aWNzRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZlN1YnNjcmlwdGlvbkRpYWdub3N0aWNzRGF0YVR5cGUiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlN1YnNjcmlwdGlvbkRpYWdub3N0aWNz +RGF0YVR5cGUiIHR5cGU9InRuczpTdWJzY3JpcHRpb25EaWFnbm9zdGljc0RhdGFUeXBlIiBtaW5P +Y2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJM +aXN0T2ZTdWJzY3JpcHRpb25EaWFnbm9zdGljc0RhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mU3Vi +c2NyaXB0aW9uRGlhZ25vc3RpY3NEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0iTW9kZWxDaGFuZ2VTdHJ1Y3R1cmVWZXJiTWFz +ayI+DQogICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51 +bWVyYXRpb24gdmFsdWU9Ik5vZGVBZGRlZF8xIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZh +bHVlPSJOb2RlRGVsZXRlZF8yIiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZl +cmVuY2VBZGRlZF80IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJSZWZlcmVuY2VE +ZWxldGVkXzgiIC8+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkRhdGFUeXBlQ2hhbmdl +ZF8xNiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU+DQogIDx4 +czplbGVtZW50IG5hbWU9Ik1vZGVsQ2hhbmdlU3RydWN0dXJlVmVyYk1hc2siIHR5cGU9InRuczpN +b2RlbENoYW5nZVN0cnVjdHVyZVZlcmJNYXNrIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1l +PSJNb2RlbENoYW5nZVN0cnVjdHVyZURhdGFUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJBZmZlY3RlZCIgdHlwZT0idWE6Tm9kZUlkIiBtaW5PY2N1cnM9 +IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWZmZWN0ZWRU +eXBlIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWZXJiIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiIG1pbk9j +Y3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8 +eHM6ZWxlbWVudCBuYW1lPSJNb2RlbENoYW5nZVN0cnVjdHVyZURhdGFUeXBlIiB0eXBlPSJ0bnM6 +TW9kZWxDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFt +ZT0iTGlzdE9mTW9kZWxDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSI+DQogICAgPHhzOnNlcXVlbmNl +Pg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTW9kZWxDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSIg +dHlwZT0idG5zOk1vZGVsQ2hhbmdlU3RydWN0dXJlRGF0YVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4 +T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+ +DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZk1vZGVsQ2hh +bmdlU3RydWN0dXJlRGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZNb2RlbENoYW5nZVN0cnVjdHVy +ZURhdGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI+PC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4 +VHlwZSBuYW1lPSJTZW1hbnRpY0NoYW5nZVN0cnVjdHVyZURhdGFUeXBlIj4NCiAgICA8eHM6c2Vx +dWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZmZlY3RlZCIgdHlwZT0idWE6Tm9kZUlk +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iQWZmZWN0ZWRUeXBlIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9 +InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhz +OmVsZW1lbnQgbmFtZT0iU2VtYW50aWNDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSIgdHlwZT0idG5z +OlNlbWFudGljQ2hhbmdlU3RydWN0dXJlRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBl +IG5hbWU9Ikxpc3RPZlNlbWFudGljQ2hhbmdlU3RydWN0dXJlRGF0YVR5cGUiPg0KICAgIDx4czpz +ZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlNlbWFudGljQ2hhbmdlU3RydWN0dXJl +RGF0YVR5cGUiIHR5cGU9InRuczpTZW1hbnRpY0NoYW5nZVN0cnVjdHVyZURhdGFUeXBlIiBtaW5P +Y2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8 +L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJM +aXN0T2ZTZW1hbnRpY0NoYW5nZVN0cnVjdHVyZURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mU2Vt +YW50aWNDaGFuZ2VTdHJ1Y3R1cmVEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVu +dD4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUmFuZ2UiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkxvdyIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9 +IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJIaWdoIiB0eXBlPSJ4czpkb3VibGUiIG1p +bk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K +ICA8eHM6ZWxlbWVudCBuYW1lPSJSYW5nZSIgdHlwZT0idG5zOlJhbmdlIiAvPg0KDQogIDx4czpj +b21wbGV4VHlwZSBuYW1lPSJFVUluZm9ybWF0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lc3BhY2VVcmkiIHR5cGU9InhzOnN0cmluZyIgbWluT2Nj +dXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVuaXRJ +ZCIgdHlwZT0ieHM6aW50IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1l +PSJEaXNwbGF5TmFtZSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBl +PSJ1YTpMb2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +IDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9 +IkVVSW5mb3JtYXRpb24iIHR5cGU9InRuczpFVUluZm9ybWF0aW9uIiAvPg0KDQogIDx4czpzaW1w +bGVUeXBlICBuYW1lPSJBeGlzU2NhbGVFbnVtZXJhdGlvbiI+DQogICAgPHhzOnJlc3RyaWN0aW9u +IGJhc2U9InhzOnN0cmluZyI+DQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxpbmVhcl8w +IiAvPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJMb2dfMSIgLz4NCiAgICAgIDx4czpl +bnVtZXJhdGlvbiB2YWx1ZT0iTG5fMiIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hz +OnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkF4aXNTY2FsZUVudW1lcmF0aW9uIiB0 +eXBlPSJ0bnM6QXhpc1NjYWxlRW51bWVyYXRpb24iIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5h +bWU9IkNvbXBsZXhOdW1iZXJUeXBlIj4NCiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJSZWFsIiB0eXBlPSJ4czpmbG9hdCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iSW1hZ2luYXJ5IiB0eXBlPSJ4czpmbG9hdCIgbWluT2NjdXJzPSIw +IiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czplbGVt +ZW50IG5hbWU9IkNvbXBsZXhOdW1iZXJUeXBlIiB0eXBlPSJ0bnM6Q29tcGxleE51bWJlclR5cGUi +IC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRvdWJsZUNvbXBsZXhOdW1iZXJUeXBlIj4N +CiAgICA8eHM6c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZWFsIiB0eXBlPSJ4 +czpkb3VibGUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkltYWdp +bmFyeSIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgPC94czpzZXF1ZW5j +ZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iRG91YmxlQ29tcGxl +eE51bWJlclR5cGUiIHR5cGU9InRuczpEb3VibGVDb21wbGV4TnVtYmVyVHlwZSIgLz4NCg0KICA8 +eHM6Y29tcGxleFR5cGUgbmFtZT0iQXhpc0luZm9ybWF0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U+ +DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmdpbmVlcmluZ1VuaXRzIiB0eXBlPSJ0bnM6RVVJ +bmZvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkVVUmFuZ2UiIHR5cGU9InRuczpSYW5nZSIgbWluT2NjdXJzPSIwIiBuaWxs +YWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRpdGxlIiB0eXBlPSJ1YTpM +b2NhbGl6ZWRUZXh0IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhz +OmVsZW1lbnQgbmFtZT0iQXhpc1NjYWxlVHlwZSIgdHlwZT0idG5zOkF4aXNTY2FsZUVudW1lcmF0 +aW9uIiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBeGlzU3RlcHMi +IHR5cGU9InVhOkxpc3RPZkRvdWJsZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4N +CiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBu +YW1lPSJBeGlzSW5mb3JtYXRpb24iIHR5cGU9InRuczpBeGlzSW5mb3JtYXRpb24iIC8+DQoNCiAg +PHhzOmNvbXBsZXhUeXBlIG5hbWU9IlhWVHlwZSI+DQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAg +PHhzOmVsZW1lbnQgbmFtZT0iWCIgdHlwZT0ieHM6ZG91YmxlIiBtaW5PY2N1cnM9IjAiIC8+DQog +ICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYWx1ZSIgdHlwZT0ieHM6ZmxvYXQiIG1pbk9jY3Vycz0i +MCIgLz4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxl +bWVudCBuYW1lPSJYVlR5cGUiIHR5cGU9InRuczpYVlR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhU +eXBlIG5hbWU9IlByb2dyYW1EaWFnbm9zdGljRGF0YVR5cGUiPg0KICAgIDx4czpzZXF1ZW5jZT4N +CiAgICAgIDx4czplbGVtZW50IG5hbWU9IkNyZWF0ZVNlc3Npb25JZCIgdHlwZT0idWE6Tm9kZUlk +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iQ3JlYXRlQ2xpZW50TmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxh +YmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW52b2NhdGlvbkNyZWF0aW9u +VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ikxhc3RUcmFuc2l0aW9uVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vy +cz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxhc3RNZXRob2RDYWxsIiB0eXBlPSJ4 +czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxl +bWVudCBuYW1lPSJMYXN0TWV0aG9kU2Vzc2lvbklkIiB0eXBlPSJ1YTpOb2RlSWQiIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0TWV0 +aG9kSW5wdXRBcmd1bWVudHMiIHR5cGU9InRuczpMaXN0T2ZBcmd1bWVudCIgbWluT2NjdXJzPSIw +IiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxhc3RNZXRob2RP +dXRwdXRBcmd1bWVudHMiIHR5cGU9InRuczpMaXN0T2ZBcmd1bWVudCIgbWluT2NjdXJzPSIwIiBu +aWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikxhc3RNZXRob2RDYWxs +VGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVt +ZW50IG5hbWU9Ikxhc3RNZXRob2RSZXR1cm5TdGF0dXMiIHR5cGU9InRuczpTdGF0dXNSZXN1bHQi +IG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgPC94czpzZXF1ZW5jZT4NCiAg +PC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iUHJvZ3JhbURpYWdub3N0aWNE +YXRhVHlwZSIgdHlwZT0idG5zOlByb2dyYW1EaWFnbm9zdGljRGF0YVR5cGUiIC8+DQoNCiAgPHhz +OmNvbXBsZXhUeXBlIG5hbWU9IlByb2dyYW1EaWFnbm9zdGljMkRhdGFUeXBlIj4NCiAgICA8eHM6 +c2VxdWVuY2U+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDcmVhdGVTZXNzaW9uSWQiIHR5cGU9 +InVhOk5vZGVJZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czpl +bGVtZW50IG5hbWU9IkNyZWF0ZUNsaWVudE5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJz +PSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ikludm9jYXRp +b25DcmVhdGlvblRpbWUiIHR5cGU9InhzOmRhdGVUaW1lIiBtaW5PY2N1cnM9IjAiIC8+DQogICAg +ICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0VHJhbnNpdGlvblRpbWUiIHR5cGU9InhzOmRhdGVUaW1l +IiBtaW5PY2N1cnM9IjAiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0TWV0aG9kQ2Fs +bCIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg +ICAgPHhzOmVsZW1lbnQgbmFtZT0iTGFzdE1ldGhvZFNlc3Npb25JZCIgdHlwZT0idWE6Tm9kZUlk +IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iTGFzdE1ldGhvZElucHV0QXJndW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9mQXJndW1lbnQiIG1p +bk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJM +YXN0TWV0aG9kT3V0cHV0QXJndW1lbnRzIiB0eXBlPSJ0bnM6TGlzdE9mQXJndW1lbnQiIG1pbk9j +Y3Vycz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0 +TWV0aG9kSW5wdXRWYWx1ZXMiIHR5cGU9InVhOkxpc3RPZlZhcmlhbnQiIG1pbk9jY3Vycz0iMCIg +bmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0TWV0aG9kT3V0 +cHV0VmFsdWVzIiB0eXBlPSJ1YTpMaXN0T2ZWYXJpYW50IiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxl +PSJ0cnVlIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTGFzdE1ldGhvZENhbGxUaW1lIiB0 +eXBlPSJ4czpkYXRlVGltZSIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt +ZT0iTGFzdE1ldGhvZFJldHVyblN0YXR1cyIgdHlwZT0idWE6U3RhdHVzQ29kZSIgbWluT2NjdXJz +PSIwIiAvPg0KICAgIDwveHM6c2VxdWVuY2U+DQogIDwveHM6Y29tcGxleFR5cGU+DQogIDx4czpl +bGVtZW50IG5hbWU9IlByb2dyYW1EaWFnbm9zdGljMkRhdGFUeXBlIiB0eXBlPSJ0bnM6UHJvZ3Jh +bURpYWdub3N0aWMyRGF0YVR5cGUiIC8+DQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFubm90 +YXRpb24iPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9Ik1lc3Nh +Z2UiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAg +ICAgIDx4czplbGVtZW50IG5hbWU9IlVzZXJOYW1lIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vy +cz0iMCIgbmlsbGFibGU9InRydWUiIC8+DQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbm5vdGF0 +aW9uVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiIG1pbk9jY3Vycz0iMCIgLz4NCiAgICA8L3hzOnNl +cXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJBbm5vdGF0 +aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgLz4NCg0KICA8eHM6c2ltcGxlVHlwZSAgbmFtZT0i +RXhjZXB0aW9uRGV2aWF0aW9uRm9ybWF0Ij4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6 +c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWJzb2x1dGVWYWx1ZV8wIiAv +Pg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZWYWx1ZV8xIiAvPg0KICAg +ICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZSYW5nZV8yIiAvPg0KICAgICAgPHhz +OmVudW1lcmF0aW9uIHZhbHVlPSJQZXJjZW50T2ZFVVJhbmdlXzMiIC8+DQogICAgICA8eHM6ZW51 +bWVyYXRpb24gdmFsdWU9IlVua25vd25fNCIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8 +L3hzOnNpbXBsZVR5cGU+DQogIDx4czplbGVtZW50IG5hbWU9IkV4Y2VwdGlvbkRldmlhdGlvbkZv +cm1hdCIgdHlwZT0idG5zOkV4Y2VwdGlvbkRldmlhdGlvbkZvcm1hdCIgLz4NCg0KPC94czpzY2hl +bWE+ + + + + NamespaceUri + + i=68 + i=8252 + + + http://opcfoundation.org/UA/2008/02/Types.xsd + + + + Deprecated + + i=68 + i=8252 + + + true + + + + Union + + i=69 + i=8252 + + + //xs:element[@name='Union'] + + + + KeyValuePair + + i=69 + i=8252 + + + //xs:element[@name='KeyValuePair'] + + + + AdditionalParametersType + + i=69 + i=8252 + + + //xs:element[@name='AdditionalParametersType'] + + + + EphemeralKeyType + + i=69 + i=8252 + + + //xs:element[@name='EphemeralKeyType'] + + + + EndpointType + + i=69 + i=8252 + + + //xs:element[@name='EndpointType'] + + + + RationalNumber + + i=69 + i=8252 + + + //xs:element[@name='RationalNumber'] + + + + Vector + + i=69 + i=8252 + + + //xs:element[@name='Vector'] + + + + 3DVector + + i=69 + i=8252 + + + //xs:element[@name='ThreeDVector'] + + + + CartesianCoordinates + + i=69 + i=8252 + + + //xs:element[@name='CartesianCoordinates'] + + + + 3DCartesianCoordinates + + i=69 + i=8252 + + + //xs:element[@name='ThreeDCartesianCoordinates'] + + + + Orientation + + i=69 + i=8252 + + + //xs:element[@name='Orientation'] + + + + 3DOrientation + + i=69 + i=8252 + + + //xs:element[@name='ThreeDOrientation'] + + + + Frame + + i=69 + i=8252 + + + //xs:element[@name='Frame'] + + + + 3DFrame + + i=69 + i=8252 + + + //xs:element[@name='ThreeDFrame'] + + + + IdentityMappingRuleType + + i=69 + i=8252 + + + //xs:element[@name='IdentityMappingRuleType'] + + + + CurrencyUnitType + + i=69 + i=8252 + + + //xs:element[@name='CurrencyUnitType'] + + + + TrustListDataType + + i=69 + i=8252 + + + //xs:element[@name='TrustListDataType'] + + + + DataTypeSchemaHeader + + i=69 + i=8252 + + + //xs:element[@name='DataTypeSchemaHeader'] + + + + DataTypeDescription + + i=69 + i=8252 + + + //xs:element[@name='DataTypeDescription'] + + + + StructureDescription + + i=69 + i=8252 + + + //xs:element[@name='StructureDescription'] + + + + EnumDescription + + i=69 + i=8252 + + + //xs:element[@name='EnumDescription'] + + + + SimpleTypeDescription + + i=69 + i=8252 + + + //xs:element[@name='SimpleTypeDescription'] + + + + UABinaryFileDataType + + i=69 + i=8252 + + + //xs:element[@name='UABinaryFileDataType'] + + + + DataSetMetaDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetMetaDataType'] + + + + FieldMetaData + + i=69 + i=8252 + + + //xs:element[@name='FieldMetaData'] + + + + ConfigurationVersionDataType + + i=69 + i=8252 + + + //xs:element[@name='ConfigurationVersionDataType'] + + + + PublishedDataSetDataType + + i=69 + i=8252 + + + //xs:element[@name='PublishedDataSetDataType'] + + + + PublishedDataSetSourceDataType + + i=69 + i=8252 + + + //xs:element[@name='PublishedDataSetSourceDataType'] + + + + PublishedVariableDataType + + i=69 + i=8252 + + + //xs:element[@name='PublishedVariableDataType'] + + + + PublishedDataItemsDataType + + i=69 + i=8252 + + + //xs:element[@name='PublishedDataItemsDataType'] + + + + PublishedEventsDataType + + i=69 + i=8252 + + + //xs:element[@name='PublishedEventsDataType'] + + + + DataSetWriterDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetWriterDataType'] + + + + DataSetWriterTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetWriterTransportDataType'] + + + + DataSetWriterMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetWriterMessageDataType'] + + + + PubSubGroupDataType + + i=69 + i=8252 + + + //xs:element[@name='PubSubGroupDataType'] + + + + WriterGroupDataType + + i=69 + i=8252 + + + //xs:element[@name='WriterGroupDataType'] + + + + WriterGroupTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='WriterGroupTransportDataType'] + + + + WriterGroupMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='WriterGroupMessageDataType'] + + + + PubSubConnectionDataType + + i=69 + i=8252 + + + //xs:element[@name='PubSubConnectionDataType'] + + + + ConnectionTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='ConnectionTransportDataType'] + + + + NetworkAddressDataType + + i=69 + i=8252 + + + //xs:element[@name='NetworkAddressDataType'] + + + + NetworkAddressUrlDataType + + i=69 + i=8252 + + + //xs:element[@name='NetworkAddressUrlDataType'] + + + + ReaderGroupDataType + + i=69 + i=8252 + + + //xs:element[@name='ReaderGroupDataType'] + + + + ReaderGroupTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='ReaderGroupTransportDataType'] + + + + ReaderGroupMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='ReaderGroupMessageDataType'] + + + + DataSetReaderDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetReaderDataType'] + + + + DataSetReaderTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetReaderTransportDataType'] + + + + DataSetReaderMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='DataSetReaderMessageDataType'] + + + + SubscribedDataSetDataType + + i=69 + i=8252 + + + //xs:element[@name='SubscribedDataSetDataType'] + + + + TargetVariablesDataType + + i=69 + i=8252 + + + //xs:element[@name='TargetVariablesDataType'] + + + + FieldTargetDataType + + i=69 + i=8252 + + + //xs:element[@name='FieldTargetDataType'] + + + + SubscribedDataSetMirrorDataType + + i=69 + i=8252 + + + //xs:element[@name='SubscribedDataSetMirrorDataType'] + + + + PubSubConfigurationDataType + + i=69 + i=8252 + + + //xs:element[@name='PubSubConfigurationDataType'] + + + + UadpWriterGroupMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='UadpWriterGroupMessageDataType'] + + + + UadpDataSetWriterMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='UadpDataSetWriterMessageDataType'] + + + + UadpDataSetReaderMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='UadpDataSetReaderMessageDataType'] + + + + JsonWriterGroupMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='JsonWriterGroupMessageDataType'] + + + + JsonDataSetWriterMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='JsonDataSetWriterMessageDataType'] + + + + JsonDataSetReaderMessageDataType + + i=69 + i=8252 + + + //xs:element[@name='JsonDataSetReaderMessageDataType'] + + + + DatagramConnectionTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='DatagramConnectionTransportDataType'] + + + + DatagramWriterGroupTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='DatagramWriterGroupTransportDataType'] + + + + BrokerConnectionTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='BrokerConnectionTransportDataType'] + + + + BrokerWriterGroupTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='BrokerWriterGroupTransportDataType'] + + + + BrokerDataSetWriterTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='BrokerDataSetWriterTransportDataType'] + + + + BrokerDataSetReaderTransportDataType + + i=69 + i=8252 + + + //xs:element[@name='BrokerDataSetReaderTransportDataType'] + + + + AliasNameDataType + + i=69 + i=8252 + + + //xs:element[@name='AliasNameDataType'] + + + + UnsignedRationalNumber + + i=69 + i=8252 + + + //xs:element[@name='UnsignedRationalNumber'] + + + + RolePermissionType + + i=69 + i=8252 + + + //xs:element[@name='RolePermissionType'] + + + + DataTypeDefinition + + i=69 + i=8252 + + + //xs:element[@name='DataTypeDefinition'] + + + + StructureField + + i=69 + i=8252 + + + //xs:element[@name='StructureField'] + + + + StructureDefinition + + i=69 + i=8252 + + + //xs:element[@name='StructureDefinition'] + + + + EnumDefinition + + i=69 + i=8252 + + + //xs:element[@name='EnumDefinition'] + + + + Argument + + i=69 + i=8252 + + + //xs:element[@name='Argument'] + + + + EnumValueType + + i=69 + i=8252 + + + //xs:element[@name='EnumValueType'] + + + + EnumField + + i=69 + i=8252 + + + //xs:element[@name='EnumField'] + + + + OptionSet + + i=69 + i=8252 + + + //xs:element[@name='OptionSet'] + + + + TimeZoneDataType + + i=69 + i=8252 + + + //xs:element[@name='TimeZoneDataType'] + + + + ApplicationDescription + + i=69 + i=8252 + + + //xs:element[@name='ApplicationDescription'] + + + + ServerOnNetwork + + i=69 + i=8252 + + + //xs:element[@name='ServerOnNetwork'] + + + + UserTokenPolicy + + i=69 + i=8252 + + + //xs:element[@name='UserTokenPolicy'] + + + + EndpointDescription + + i=69 + i=8252 + + + //xs:element[@name='EndpointDescription'] + + + + RegisteredServer + + i=69 + i=8252 + + + //xs:element[@name='RegisteredServer'] + + + + DiscoveryConfiguration + + i=69 + i=8252 + + + //xs:element[@name='DiscoveryConfiguration'] + + + + MdnsDiscoveryConfiguration + + i=69 + i=8252 + + + //xs:element[@name='MdnsDiscoveryConfiguration'] + + + + SignedSoftwareCertificate + + i=69 + i=8252 + + + //xs:element[@name='SignedSoftwareCertificate'] + + + + UserIdentityToken + + i=69 + i=8252 + + + //xs:element[@name='UserIdentityToken'] + + + + AnonymousIdentityToken + + i=69 + i=8252 + + + //xs:element[@name='AnonymousIdentityToken'] + + + + UserNameIdentityToken + + i=69 + i=8252 + + + //xs:element[@name='UserNameIdentityToken'] + + + + X509IdentityToken + + i=69 + i=8252 + + + //xs:element[@name='X509IdentityToken'] + + + + IssuedIdentityToken + + i=69 + i=8252 + + + //xs:element[@name='IssuedIdentityToken'] + + + + AddNodesItem + + i=69 + i=8252 + + + //xs:element[@name='AddNodesItem'] + + + + AddReferencesItem + + i=69 + i=8252 + + + //xs:element[@name='AddReferencesItem'] + + + + DeleteNodesItem + + i=69 + i=8252 + + + //xs:element[@name='DeleteNodesItem'] + + + + DeleteReferencesItem + + i=69 + i=8252 + + + //xs:element[@name='DeleteReferencesItem'] + + + + RelativePathElement + + i=69 + i=8252 + + + //xs:element[@name='RelativePathElement'] + + + + RelativePath + + i=69 + i=8252 + + + //xs:element[@name='RelativePath'] + + + + EndpointConfiguration + + i=69 + i=8252 + + + //xs:element[@name='EndpointConfiguration'] + + + + ContentFilterElement + + i=69 + i=8252 + + + //xs:element[@name='ContentFilterElement'] + + + + ContentFilter + + i=69 + i=8252 + + + //xs:element[@name='ContentFilter'] + + + + FilterOperand + + i=69 + i=8252 + + + //xs:element[@name='FilterOperand'] + + + + ElementOperand + + i=69 + i=8252 + + + //xs:element[@name='ElementOperand'] + + + + LiteralOperand + + i=69 + i=8252 + + + //xs:element[@name='LiteralOperand'] + + + + AttributeOperand + + i=69 + i=8252 + + + //xs:element[@name='AttributeOperand'] + + + + SimpleAttributeOperand + + i=69 + i=8252 + + + //xs:element[@name='SimpleAttributeOperand'] + + + + HistoryEvent + + i=69 + i=8252 + + + //xs:element[@name='HistoryEvent'] + + + + MonitoringFilter + + i=69 + i=8252 + + + //xs:element[@name='MonitoringFilter'] + + + + EventFilter + + i=69 + i=8252 + + + //xs:element[@name='EventFilter'] + + + + AggregateConfiguration + + i=69 + i=8252 + + + //xs:element[@name='AggregateConfiguration'] + + + + HistoryEventFieldList + + i=69 + i=8252 + + + //xs:element[@name='HistoryEventFieldList'] + + + + BuildInfo + + i=69 + i=8252 + + + //xs:element[@name='BuildInfo'] + + + + RedundantServerDataType + + i=69 + i=8252 + + + //xs:element[@name='RedundantServerDataType'] + + + + EndpointUrlListDataType + + i=69 + i=8252 + + + //xs:element[@name='EndpointUrlListDataType'] + + + + NetworkGroupDataType + + i=69 + i=8252 + + + //xs:element[@name='NetworkGroupDataType'] + + + + SamplingIntervalDiagnosticsDataType + + i=69 + i=8252 + + + //xs:element[@name='SamplingIntervalDiagnosticsDataType'] + + + + ServerDiagnosticsSummaryDataType + + i=69 + i=8252 + + + //xs:element[@name='ServerDiagnosticsSummaryDataType'] + + + + ServerStatusDataType + + i=69 + i=8252 + + + //xs:element[@name='ServerStatusDataType'] + + + + SessionDiagnosticsDataType + + i=69 + i=8252 + + + //xs:element[@name='SessionDiagnosticsDataType'] + + + + SessionSecurityDiagnosticsDataType + + i=69 + i=8252 + + + //xs:element[@name='SessionSecurityDiagnosticsDataType'] + + + + ServiceCounterDataType + + i=69 + i=8252 + + + //xs:element[@name='ServiceCounterDataType'] + + + + StatusResult + + i=69 + i=8252 + + + //xs:element[@name='StatusResult'] + + + + SubscriptionDiagnosticsDataType + + i=69 + i=8252 + + + //xs:element[@name='SubscriptionDiagnosticsDataType'] + + + + ModelChangeStructureDataType + + i=69 + i=8252 + + + //xs:element[@name='ModelChangeStructureDataType'] + + + + SemanticChangeStructureDataType + + i=69 + i=8252 + + + //xs:element[@name='SemanticChangeStructureDataType'] + + + + Range + + i=69 + i=8252 + + + //xs:element[@name='Range'] + + + + EUInformation + + i=69 + i=8252 + + + //xs:element[@name='EUInformation'] + + + + ComplexNumberType + + i=69 + i=8252 + + + //xs:element[@name='ComplexNumberType'] + + + + DoubleComplexNumberType + + i=69 + i=8252 + + + //xs:element[@name='DoubleComplexNumberType'] + + + + AxisInformation + + i=69 + i=8252 + + + //xs:element[@name='AxisInformation'] + + + + XVType + + i=69 + i=8252 + + + //xs:element[@name='XVType'] + + + + ProgramDiagnosticDataType + + i=69 + i=8252 + + + //xs:element[@name='ProgramDiagnosticDataType'] + + + + ProgramDiagnostic2DataType + + i=69 + i=8252 + + + //xs:element[@name='ProgramDiagnostic2DataType'] + + + + Annotation + + i=69 + i=8252 + + + //xs:element[@name='Annotation'] + + + + Default JSON + + i=12756 + i=76 + + + + Default JSON + + i=14533 + i=76 + + + + Default JSON + + i=16313 + i=76 + + + + Default JSON + + i=17548 + i=76 + + + + Default JSON + + i=15528 + i=76 + + + + Default JSON + + i=18806 + i=76 + + + + Default JSON + + i=18807 + i=76 + + + + Default JSON + + i=18808 + i=76 + + + + Default JSON + + i=18809 + i=76 + + + + Default JSON + + i=18810 + i=76 + + + + Default JSON + + i=18811 + i=76 + + + + Default JSON + + i=18812 + i=76 + + + + Default JSON + + i=18813 + i=76 + + + + Default JSON + + i=18814 + i=76 + + + + Default JSON + + i=15634 + i=76 + + + + Default JSON + + i=23498 + i=76 + + + + Default JSON + + i=12554 + i=76 + + + + Default JSON + + i=17861 + i=76 + + + + Default JSON + + i=15534 + i=76 + + + + Default JSON + + i=14525 + i=76 + + + + Default JSON + + i=15487 + i=76 + + + + Default JSON + + i=15488 + i=76 + + + + Default JSON + + i=15005 + i=76 + + + + Default JSON + + i=15006 + i=76 + + + + Default JSON + + i=14523 + i=76 + + + + Default JSON + + i=14524 + i=76 + + + + Default JSON + + i=14593 + i=76 + + + + Default JSON + + i=15578 + i=76 + + + + Default JSON + + i=15580 + i=76 + + + + Default JSON + + i=14273 + i=76 + + + + Default JSON + + i=15581 + i=76 + + + + Default JSON + + i=15582 + i=76 + + + + Default JSON + + i=15597 + i=76 + + + + Default JSON + + i=15598 + i=76 + + + + Default JSON + + i=15605 + i=76 + + + + Default JSON + + i=15609 + i=76 + + + + Default JSON + + i=15480 + i=76 + + + + Default JSON + + i=15611 + i=76 + + + + Default JSON + + i=15616 + i=76 + + + + Default JSON + + i=15617 + i=76 + + + + Default JSON + + i=15618 + i=76 + + + + Default JSON + + i=15502 + i=76 + + + + Default JSON + + i=15510 + i=76 + + + + Default JSON + + i=15520 + i=76 + + + + Default JSON + + i=15621 + i=76 + + + + Default JSON + + i=15622 + i=76 + + + + Default JSON + + i=15623 + i=76 + + + + Default JSON + + i=15628 + i=76 + + + + Default JSON + + i=15629 + i=76 + + + + Default JSON + + i=15630 + i=76 + + + + Default JSON + + i=15631 + i=76 + + + + Default JSON + + i=14744 + i=76 + + + + Default JSON + + i=15635 + i=76 + + + + Default JSON + + i=15530 + i=76 + + + + Default JSON + + i=15645 + i=76 + + + + Default JSON + + i=15652 + i=76 + + + + Default JSON + + i=15653 + i=76 + + + + Default JSON + + i=15657 + i=76 + + + + Default JSON + + i=15664 + i=76 + + + + Default JSON + + i=15665 + i=76 + + + + Default JSON + + i=17467 + i=76 + + + + Default JSON + + i=15532 + i=76 + + + + Default JSON + + i=15007 + i=76 + + + + Default JSON + + i=15667 + i=76 + + + + Default JSON + + i=15669 + i=76 + + + + Default JSON + + i=15670 + i=76 + + + + Default JSON + + i=23468 + i=76 + + + + Default JSON + + i=24107 + i=76 + + + + Default JSON + + i=96 + i=76 + + + + Default JSON + + i=97 + i=76 + + + + Default JSON + + i=101 + i=76 + + + + Default JSON + + i=99 + i=76 + + + + Default JSON + + i=100 + i=76 + + + + Default JSON + + i=258 + i=76 + + + + Default JSON + + i=11879 + i=76 + + + + Default JSON + + i=11880 + i=76 + + + + Default JSON + + i=261 + i=76 + + + + Default JSON + + i=264 + i=76 + + + + Default JSON + + i=267 + i=76 + + + + Default JSON + + i=270 + i=76 + + + + Default JSON + + i=273 + i=76 + + + + Default JSON + + i=276 + i=76 + + + + Default JSON + + i=279 + i=76 + + + + Default JSON + + i=282 + i=76 + + + + Default JSON + + i=285 + i=76 + + + + Default JSON + + i=296 + i=76 + + + + Default JSON + + i=7594 + i=76 + + + + Default JSON + + i=102 + i=76 + + + + Default JSON + + i=12755 + i=76 + + + + Default JSON + + i=8912 + i=76 + + + + Default JSON + + i=308 + i=76 + + + + Default JSON + + i=389 + i=76 + + + + Default JSON + + i=392 + i=76 + + + + Default JSON + + i=395 + i=76 + + + + Default JSON + + i=15901 + i=76 + + + + Default JSON + + i=20999 + i=76 + + + + Default JSON + + i=420 + i=76 + + + + Default JSON + + i=423 + i=76 + + + + Default JSON + + i=12189 + i=76 + + + + Default JSON + + i=12190 + i=76 + + + + Default JSON + + i=12191 + i=76 + + + + Default JSON + + i=304 + i=76 + + + + Default JSON + + i=312 + i=76 + + + + Default JSON + + i=426 + i=76 + + + + Default JSON + + i=429 + i=76 + + + + Default JSON + + i=432 + i=76 + + + + Default JSON + + i=435 + i=76 + + + + Default JSON + + i=438 + i=76 + + + + Default JSON + + i=12890 + i=76 + + + + Default JSON + + i=12891 + i=76 + + + + Default JSON + + i=12193 + i=76 + + + + Default JSON + + i=12194 + i=76 + + + + Default JSON + + i=441 + i=76 + + + + Default JSON + + i=444 + i=76 + + + + Default JSON + + i=447 + i=76 + + + + Default JSON + + i=450 + i=76 + + + + Default JSON + + i=453 + i=76 + + + + Default JSON + + i=344 + i=76 + + + + Default JSON + + i=456 + i=76 + + + + Default JSON + + i=459 + i=76 + + + + Default JSON + + i=462 + i=76 + + + + Default JSON + + i=316 + i=76 + + + + Default JSON + + i=319 + i=76 + + + + Default JSON + + i=322 + i=76 + + + + Default JSON + + i=325 + i=76 + + + + Default JSON + + i=938 + i=76 + + + + Default JSON + + i=465 + i=76 + + + + Default JSON + + i=468 + i=76 + + + + Default JSON + + i=471 + i=76 + + + + Default JSON + + i=474 + i=76 + + + + Default JSON + + i=477 + i=76 + + + + Default JSON + + i=480 + i=76 + + + + Default JSON + + i=349 + i=76 + + + + Default JSON + + i=352 + i=76 + + + + Default JSON + + i=355 + i=76 + + + + Default JSON + + i=358 + i=76 + + + + Default JSON + + i=361 + i=76 + + + + Default JSON + + i=364 + i=76 + + + + Default JSON + + i=367 + i=76 + + + + Default JSON + + i=370 + i=76 + + + + Default JSON + + i=373 + i=76 + + + + Default JSON + + i=17606 + i=76 + + + + Default JSON + + i=17607 + i=76 + + + + Default JSON + + i=376 + i=76 + + + + Default JSON + + i=483 + i=76 + + + + Default JSON + + i=486 + i=76 + + + + Default JSON + + i=489 + i=76 + + + + Default JSON + + i=379 + i=76 + + + + Default JSON + + i=492 + i=76 + + + + Default JSON + + i=495 + i=76 + + + + Default JSON + + i=382 + i=76 + + + + Default JSON + + i=498 + i=76 + + + + Default JSON + + i=501 + i=76 + + + + Default JSON + + i=385 + i=76 + + + + Default JSON + + i=504 + i=76 + + + + Default JSON + + i=507 + i=76 + + + + Default JSON + + i=511 + i=76 + + + + Default JSON + + i=514 + i=76 + + + + Default JSON + + i=518 + i=76 + + + + Default JSON + + i=522 + i=76 + + + + Default JSON + + i=525 + i=76 + + + + Default JSON + + i=528 + i=76 + + + + Default JSON + + i=531 + i=76 + + + + Default JSON + + i=534 + i=76 + + + + Default JSON + + i=537 + i=76 + + + + Default JSON + + i=540 + i=76 + + + + Default JSON + + i=543 + i=76 + + + + Default JSON + + i=546 + i=76 + + + + Default JSON + + i=549 + i=76 + + + + Default JSON + + i=552 + i=76 + + + + Default JSON + + i=555 + i=76 + + + + Default JSON + + i=558 + i=76 + + + + Default JSON + + i=561 + i=76 + + + + Default JSON + + i=564 + i=76 + + + + Default JSON + + i=567 + i=76 + + + + Default JSON + + i=331 + i=76 + + + + Default JSON + + i=570 + i=76 + + + + Default JSON + + i=573 + i=76 + + + + Default JSON + + i=577 + i=76 + + + + Default JSON + + i=580 + i=76 + + + + Default JSON + + i=583 + i=76 + + + + Default JSON + + i=586 + i=76 + + + + Default JSON + + i=589 + i=76 + + + + Default JSON + + i=592 + i=76 + + + + Default JSON + + i=595 + i=76 + + + + Default JSON + + i=598 + i=76 + + + + Default JSON + + i=601 + i=76 + + + + Default JSON + + i=604 + i=76 + + + + Default JSON + + i=607 + i=76 + + + + Default JSON + + i=610 + i=76 + + + + Default JSON + + i=613 + i=76 + + + + Default JSON + + i=616 + i=76 + + + + Default JSON + + i=619 + i=76 + + + + Default JSON + + i=622 + i=76 + + + + Default JSON + + i=626 + i=76 + + + + Default JSON + + i=629 + i=76 + + + + Default JSON + + i=632 + i=76 + + + + Default JSON + + i=635 + i=76 + + + + Default JSON + + i=638 + i=76 + + + + Default JSON + + i=641 + i=76 + + + + Default JSON + + i=644 + i=76 + + + + Default JSON + + i=647 + i=76 + + + + Default JSON + + i=650 + i=76 + + + + Default JSON + + i=653 + i=76 + + + + Default JSON + + i=23497 + i=76 + + + + Default JSON + + i=656 + i=76 + + + + Default JSON + + i=11216 + i=76 + + + + Default JSON + + i=11217 + i=76 + + + + Default JSON + + i=659 + i=76 + + + + Default JSON + + i=662 + i=76 + + + + Default JSON + + i=665 + i=76 + + + + Default JSON + + i=668 + i=76 + + + + Default JSON + + i=671 + i=76 + + + + Default JSON + + i=674 + i=76 + + + + Default JSON + + i=677 + i=76 + + + + Default JSON + + i=680 + i=76 + + + + Default JSON + + i=11295 + i=76 + + + + Default JSON + + i=683 + i=76 + + + + Default JSON + + i=686 + i=76 + + + + Default JSON + + i=689 + i=76 + + + + Default JSON + + i=692 + i=76 + + + + Default JSON + + i=695 + i=76 + + + + Default JSON + + i=698 + i=76 + + + + Default JSON + + i=701 + i=76 + + + + Default JSON + + i=704 + i=76 + + + + Default JSON + + i=707 + i=76 + + + + Default JSON + + i=710 + i=76 + + + + Default JSON + + i=713 + i=76 + + + + Default JSON + + i=719 + i=76 + + + + Default JSON + + i=722 + i=76 + + + + Default JSON + + i=725 + i=76 + + + + Default JSON + + i=948 + i=76 + + + + Default JSON + + i=728 + i=76 + + + + Default JSON + + i=731 + i=76 + + + + Default JSON + + i=734 + i=76 + + + + Default JSON + + i=737 + i=76 + + + + Default JSON + + i=740 + i=76 + + + + Default JSON + + i=743 + i=76 + + + + Default JSON + + i=746 + i=76 + + + + Default JSON + + i=749 + i=76 + + + + Default JSON + + i=752 + i=76 + + + + Default JSON + + i=755 + i=76 + + + + Default JSON + + i=758 + i=76 + + + + Default JSON + + i=761 + i=76 + + + + Default JSON + + i=764 + i=76 + + + + Default JSON + + i=767 + i=76 + + + + Default JSON + + i=770 + i=76 + + + + Default JSON + + i=773 + i=76 + + + + Default JSON + + i=776 + i=76 + + + + Default JSON + + i=779 + i=76 + + + + Default JSON + + i=782 + i=76 + + + + Default JSON + + i=785 + i=76 + + + + Default JSON + + i=788 + i=76 + + + + Default JSON + + i=791 + i=76 + + + + Default JSON + + i=794 + i=76 + + + + Default JSON + + i=797 + i=76 + + + + Default JSON + + i=800 + i=76 + + + + Default JSON + + i=803 + i=76 + + + + Default JSON + + i=945 + i=76 + + + + Default JSON + + i=809 + i=76 + + + + Default JSON + + i=806 + i=76 + + + + Default JSON + + i=914 + i=76 + + + + Default JSON + + i=917 + i=76 + + + + Default JSON + + i=920 + i=76 + + + + Default JSON + + i=818 + i=76 + + + + Default JSON + + i=821 + i=76 + + + + Default JSON + + i=824 + i=76 + + + + Default JSON + + i=827 + i=76 + + + + Default JSON + + i=830 + i=76 + + + + Default JSON + + i=833 + i=76 + + + + Default JSON + + i=836 + i=76 + + + + Default JSON + + i=839 + i=76 + + + + Default JSON + + i=842 + i=76 + + + + Default JSON + + i=845 + i=76 + + + + Default JSON + + i=848 + i=76 + + + + Default JSON + + i=338 + i=76 + + + + Default JSON + + i=853 + i=76 + + + + Default JSON + + i=11943 + i=76 + + + + Default JSON + + i=11944 + i=76 + + + + Default JSON + + i=856 + i=76 + + + + Default JSON + + i=859 + i=76 + + + + Default JSON + + i=862 + i=76 + + + + Default JSON + + i=865 + i=76 + + + + Default JSON + + i=868 + i=76 + + + + Default JSON + + i=871 + i=76 + + + + Default JSON + + i=299 + i=76 + + + + Default JSON + + i=874 + i=76 + + + + Default JSON + + i=877 + i=76 + + + + Default JSON + + i=897 + i=76 + + + + Default JSON + + i=884 + i=76 + + + + Default JSON + + i=887 + i=76 + + + + Default JSON + + i=12171 + i=76 + + + + Default JSON + + i=12172 + i=76 + + + + Default JSON + + i=12079 + i=76 + + + + Default JSON + + i=12080 + i=76 + + + + Default JSON + + i=894 + i=76 + + + + Default JSON + + i=24033 + i=76 + + + + Default JSON + + i=891 + i=76 + + + diff --git a/protocols/opcua/downloads/Opc.Ua.Types.bsd b/protocols/opcua/downloads/Opc.Ua.Types.bsd new file mode 100644 index 00000000000..d6407d884dc --- /dev/null +++ b/protocols/opcua/downloads/Opc.Ua.Types.bsd @@ -0,0 +1,3162 @@ + + + + + + + + + An XML element encoded as a UTF-8 string. + + + + + + The possible encodings for a NodeId value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An identifier for a node in a UA server address space. + + + + + + + + + + + + An identifier for a node in a UA server address space qualified with a complete namespace string. + + + + + + + + + + + + + + + A 32-bit status code value. + + + + A recursive structure containing diagnostic information associated with a status code. + + + + + + + + + + + + + + + + + + + A string qualified with a namespace index. + + + + + + A string qualified with a namespace index. + + + + + + + + + A value with an associated timestamp, and quality. + + + + + + + + + + + + + + + + + A serialized object prefixed with its data type identifier. + + + + + + + + + + + A union of several types. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/protocols/opcua/downloads/StatusCode.csv b/protocols/opcua/downloads/StatusCode.csv new file mode 100644 index 00000000000..5ff92120a57 --- /dev/null +++ b/protocols/opcua/downloads/StatusCode.csv @@ -0,0 +1,261 @@ +Good,0x00000000,"The operation succeeded." +Uncertain,0x40000000,"The operation was uncertain." +Bad,0x80000000,"The operation failed." +BadUnexpectedError,0x80010000,"An unexpected error occurred." +BadInternalError,0x80020000,"An internal error occurred as a result of a programming or configuration error." +BadOutOfMemory,0x80030000,"Not enough memory to complete the operation." +BadResourceUnavailable,0x80040000,"An operating system resource is not available." +BadCommunicationError,0x80050000,"A low level communication error occurred." +BadEncodingError,0x80060000,"Encoding halted because of invalid data in the objects being serialized." +BadDecodingError,0x80070000,"Decoding halted because of invalid data in the stream." +BadEncodingLimitsExceeded,0x80080000,"The message encoding/decoding limits imposed by the stack have been exceeded." +BadRequestTooLarge,0x80B80000,"The request message size exceeds limits set by the server." +BadResponseTooLarge,0x80B90000,"The response message size exceeds limits set by the client." +BadUnknownResponse,0x80090000,"An unrecognized response was received from the server." +BadTimeout,0x800A0000,"The operation timed out." +BadServiceUnsupported,0x800B0000,"The server does not support the requested service." +BadShutdown,0x800C0000,"The operation was cancelled because the application is shutting down." +BadServerNotConnected,0x800D0000,"The operation could not complete because the client is not connected to the server." +BadServerHalted,0x800E0000,"The server has stopped and cannot process any requests." +BadNothingToDo,0x800F0000,"There was nothing to do because the client passed a list of operations with no elements." +BadTooManyOperations,0x80100000,"The request could not be processed because it specified too many operations." +BadTooManyMonitoredItems,0x80DB0000,"The request could not be processed because there are too many monitored items in the subscription." +BadDataTypeIdUnknown,0x80110000,"The extension object cannot be (de)serialized because the data type id is not recognized." +BadCertificateInvalid,0x80120000,"The certificate provided as a parameter is not valid." +BadSecurityChecksFailed,0x80130000,"An error occurred verifying security." +BadCertificatePolicyCheckFailed,0x81140000,"The certificate does not meet the requirements of the security policy." +BadCertificateTimeInvalid,0x80140000,"The certificate has expired or is not yet valid." +BadCertificateIssuerTimeInvalid,0x80150000,"An issuer certificate has expired or is not yet valid." +BadCertificateHostNameInvalid,0x80160000,"The HostName used to connect to a server does not match a HostName in the certificate." +BadCertificateUriInvalid,0x80170000,"The URI specified in the ApplicationDescription does not match the URI in the certificate." +BadCertificateUseNotAllowed,0x80180000,"The certificate may not be used for the requested operation." +BadCertificateIssuerUseNotAllowed,0x80190000,"The issuer certificate may not be used for the requested operation." +BadCertificateUntrusted,0x801A0000,"The certificate is not trusted." +BadCertificateRevocationUnknown,0x801B0000,"It was not possible to determine if the certificate has been revoked." +BadCertificateIssuerRevocationUnknown,0x801C0000,"It was not possible to determine if the issuer certificate has been revoked." +BadCertificateRevoked,0x801D0000,"The certificate has been revoked." +BadCertificateIssuerRevoked,0x801E0000,"The issuer certificate has been revoked." +BadCertificateChainIncomplete,0x810D0000,"The certificate chain is incomplete." +BadUserAccessDenied,0x801F0000,"User does not have permission to perform the requested operation." +BadIdentityTokenInvalid,0x80200000,"The user identity token is not valid." +BadIdentityTokenRejected,0x80210000,"The user identity token is valid but the server has rejected it." +BadSecureChannelIdInvalid,0x80220000,"The specified secure channel is no longer valid." +BadInvalidTimestamp,0x80230000,"The timestamp is outside the range allowed by the server." +BadNonceInvalid,0x80240000,"The nonce does appear to be not a random value or it is not the correct length." +BadSessionIdInvalid,0x80250000,"The session id is not valid." +BadSessionClosed,0x80260000,"The session was closed by the client." +BadSessionNotActivated,0x80270000,"The session cannot be used because ActivateSession has not been called." +BadSubscriptionIdInvalid,0x80280000,"The subscription id is not valid." +BadRequestHeaderInvalid,0x802A0000,"The header for the request is missing or invalid." +BadTimestampsToReturnInvalid,0x802B0000,"The timestamps to return parameter is invalid." +BadRequestCancelledByClient,0x802C0000,"The request was cancelled by the client." +BadTooManyArguments,0x80E50000,"Too many arguments were provided." +BadLicenseExpired,0x810E0000,"The server requires a license to operate in general or to perform a service or operation, but existing license is expired." +BadLicenseLimitsExceeded,0x810F0000,"The server has limits on number of allowed operations / objects, based on installed licenses, and these limits where exceeded." +BadLicenseNotAvailable,0x81100000,"The server does not have a license which is required to operate in general or to perform a service or operation." +GoodSubscriptionTransferred,0x002D0000,"The subscription was transferred to another session." +GoodCompletesAsynchronously,0x002E0000,"The processing will complete asynchronously." +GoodOverload,0x002F0000,"Sampling has slowed down due to resource limitations." +GoodClamped,0x00300000,"The value written was accepted but was clamped." +BadNoCommunication,0x80310000,"Communication with the data source is defined, but not established, and there is no last known value available." +BadWaitingForInitialData,0x80320000,"Waiting for the server to obtain values from the underlying data source." +BadNodeIdInvalid,0x80330000,"The syntax of the node id is not valid." +BadNodeIdUnknown,0x80340000,"The node id refers to a node that does not exist in the server address space." +BadAttributeIdInvalid,0x80350000,"The attribute is not supported for the specified Node." +BadIndexRangeInvalid,0x80360000,"The syntax of the index range parameter is invalid." +BadIndexRangeNoData,0x80370000,"No data exists within the range of indexes specified." +BadDataEncodingInvalid,0x80380000,"The data encoding is invalid." +BadDataEncodingUnsupported,0x80390000,"The server does not support the requested data encoding for the node." +BadNotReadable,0x803A0000,"The access level does not allow reading or subscribing to the Node." +BadNotWritable,0x803B0000,"The access level does not allow writing to the Node." +BadOutOfRange,0x803C0000,"The value was out of range." +BadNotSupported,0x803D0000,"The requested operation is not supported." +BadNotFound,0x803E0000,"A requested item was not found or a search operation ended without success." +BadObjectDeleted,0x803F0000,"The object cannot be used because it has been deleted." +BadNotImplemented,0x80400000,"Requested operation is not implemented." +BadMonitoringModeInvalid,0x80410000,"The monitoring mode is invalid." +BadMonitoredItemIdInvalid,0x80420000,"The monitoring item id does not refer to a valid monitored item." +BadMonitoredItemFilterInvalid,0x80430000,"The monitored item filter parameter is not valid." +BadMonitoredItemFilterUnsupported,0x80440000,"The server does not support the requested monitored item filter." +BadFilterNotAllowed,0x80450000,"A monitoring filter cannot be used in combination with the attribute specified." +BadStructureMissing,0x80460000,"A mandatory structured parameter was missing or null." +BadEventFilterInvalid,0x80470000,"The event filter is not valid." +BadContentFilterInvalid,0x80480000,"The content filter is not valid." +BadFilterOperatorInvalid,0x80C10000,"An unrecognized operator was provided in a filter." +BadFilterOperatorUnsupported,0x80C20000,"A valid operator was provided, but the server does not provide support for this filter operator." +BadFilterOperandCountMismatch,0x80C30000,"The number of operands provided for the filter operator was less then expected for the operand provided." +BadFilterOperandInvalid,0x80490000,"The operand used in a content filter is not valid." +BadFilterElementInvalid,0x80C40000,"The referenced element is not a valid element in the content filter." +BadFilterLiteralInvalid,0x80C50000,"The referenced literal is not a valid value." +BadContinuationPointInvalid,0x804A0000,"The continuation point provide is longer valid." +BadNoContinuationPoints,0x804B0000,"The operation could not be processed because all continuation points have been allocated." +BadReferenceTypeIdInvalid,0x804C0000,"The reference type id does not refer to a valid reference type node." +BadBrowseDirectionInvalid,0x804D0000,"The browse direction is not valid." +BadNodeNotInView,0x804E0000,"The node is not part of the view." +BadNumericOverflow,0x81120000,"The number was not accepted because of a numeric overflow." +BadServerUriInvalid,0x804F0000,"The ServerUri is not a valid URI." +BadServerNameMissing,0x80500000,"No ServerName was specified." +BadDiscoveryUrlMissing,0x80510000,"No DiscoveryUrl was specified." +BadSempahoreFileMissing,0x80520000,"The semaphore file specified by the client is not valid." +BadRequestTypeInvalid,0x80530000,"The security token request type is not valid." +BadSecurityModeRejected,0x80540000,"The security mode does not meet the requirements set by the server." +BadSecurityPolicyRejected,0x80550000,"The security policy does not meet the requirements set by the server." +BadTooManySessions,0x80560000,"The server has reached its maximum number of sessions." +BadUserSignatureInvalid,0x80570000,"The user token signature is missing or invalid." +BadApplicationSignatureInvalid,0x80580000,"The signature generated with the client certificate is missing or invalid." +BadNoValidCertificates,0x80590000,"The client did not provide at least one software certificate that is valid and meets the profile requirements for the server." +BadIdentityChangeNotSupported,0x80C60000,"The server does not support changing the user identity assigned to the session." +BadRequestCancelledByRequest,0x805A0000,"The request was cancelled by the client with the Cancel service." +BadParentNodeIdInvalid,0x805B0000,"The parent node id does not to refer to a valid node." +BadReferenceNotAllowed,0x805C0000,"The reference could not be created because it violates constraints imposed by the data model." +BadNodeIdRejected,0x805D0000,"The requested node id was reject because it was either invalid or server does not allow node ids to be specified by the client." +BadNodeIdExists,0x805E0000,"The requested node id is already used by another node." +BadNodeClassInvalid,0x805F0000,"The node class is not valid." +BadBrowseNameInvalid,0x80600000,"The browse name is invalid." +BadBrowseNameDuplicated,0x80610000,"The browse name is not unique among nodes that share the same relationship with the parent." +BadNodeAttributesInvalid,0x80620000,"The node attributes are not valid for the node class." +BadTypeDefinitionInvalid,0x80630000,"The type definition node id does not reference an appropriate type node." +BadSourceNodeIdInvalid,0x80640000,"The source node id does not reference a valid node." +BadTargetNodeIdInvalid,0x80650000,"The target node id does not reference a valid node." +BadDuplicateReferenceNotAllowed,0x80660000,"The reference type between the nodes is already defined." +BadInvalidSelfReference,0x80670000,"The server does not allow this type of self reference on this node." +BadReferenceLocalOnly,0x80680000,"The reference type is not valid for a reference to a remote server." +BadNoDeleteRights,0x80690000,"The server will not allow the node to be deleted." +UncertainReferenceNotDeleted,0x40BC0000,"The server was not able to delete all target references." +BadServerIndexInvalid,0x806A0000,"The server index is not valid." +BadViewIdUnknown,0x806B0000,"The view id does not refer to a valid view node." +BadViewTimestampInvalid,0x80C90000,"The view timestamp is not available or not supported." +BadViewParameterMismatch,0x80CA0000,"The view parameters are not consistent with each other." +BadViewVersionInvalid,0x80CB0000,"The view version is not available or not supported." +UncertainNotAllNodesAvailable,0x40C00000,"The list of references may not be complete because the underlying system is not available." +GoodResultsMayBeIncomplete,0x00BA0000,"The server should have followed a reference to a node in a remote server but did not. The result set may be incomplete." +BadNotTypeDefinition,0x80C80000,"The provided Nodeid was not a type definition nodeid." +UncertainReferenceOutOfServer,0x406C0000,"One of the references to follow in the relative path references to a node in the address space in another server." +BadTooManyMatches,0x806D0000,"The requested operation has too many matches to return." +BadQueryTooComplex,0x806E0000,"The requested operation requires too many resources in the server." +BadNoMatch,0x806F0000,"The requested operation has no match to return." +BadMaxAgeInvalid,0x80700000,"The max age parameter is invalid." +BadSecurityModeInsufficient,0x80E60000,"The operation is not permitted over the current secure channel." +BadHistoryOperationInvalid,0x80710000,"The history details parameter is not valid." +BadHistoryOperationUnsupported,0x80720000,"The server does not support the requested operation." +BadInvalidTimestampArgument,0x80BD0000,"The defined timestamp to return was invalid." +BadWriteNotSupported,0x80730000,"The server does not support writing the combination of value, status and timestamps provided." +BadTypeMismatch,0x80740000,"The value supplied for the attribute is not of the same type as the attribute's value." +BadMethodInvalid,0x80750000,"The method id does not refer to a method for the specified object." +BadArgumentsMissing,0x80760000,"The client did not specify all of the input arguments for the method." +BadNotExecutable,0x81110000,"The executable attribute does not allow the execution of the method." +BadTooManySubscriptions,0x80770000,"The server has reached its maximum number of subscriptions." +BadTooManyPublishRequests,0x80780000,"The server has reached the maximum number of queued publish requests." +BadNoSubscription,0x80790000,"There is no subscription available for this session." +BadSequenceNumberUnknown,0x807A0000,"The sequence number is unknown to the server." +GoodRetransmissionQueueNotSupported,0x00DF0000,"The Server does not support retransmission queue and acknowledgement of sequence numbers is not available." +BadMessageNotAvailable,0x807B0000,"The requested notification message is no longer available." +BadInsufficientClientProfile,0x807C0000,"The client of the current session does not support one or more Profiles that are necessary for the subscription." +BadStateNotActive,0x80BF0000,"The sub-state machine is not currently active." +BadAlreadyExists,0x81150000,"An equivalent rule already exists." +BadTcpServerTooBusy,0x807D0000,"The server cannot process the request because it is too busy." +BadTcpMessageTypeInvalid,0x807E0000,"The type of the message specified in the header invalid." +BadTcpSecureChannelUnknown,0x807F0000,"The SecureChannelId and/or TokenId are not currently in use." +BadTcpMessageTooLarge,0x80800000,"The size of the message chunk specified in the header is too large." +BadTcpNotEnoughResources,0x80810000,"There are not enough resources to process the request." +BadTcpInternalError,0x80820000,"An internal error occurred." +BadTcpEndpointUrlInvalid,0x80830000,"The server does not recognize the QueryString specified." +BadRequestInterrupted,0x80840000,"The request could not be sent because of a network interruption." +BadRequestTimeout,0x80850000,"Timeout occurred while processing the request." +BadSecureChannelClosed,0x80860000,"The secure channel has been closed." +BadSecureChannelTokenUnknown,0x80870000,"The token has expired or is not recognized." +BadSequenceNumberInvalid,0x80880000,"The sequence number is not valid." +BadProtocolVersionUnsupported,0x80BE0000,"The applications do not have compatible protocol versions." +BadConfigurationError,0x80890000,"There is a problem with the configuration that affects the usefulness of the value." +BadNotConnected,0x808A0000,"The variable should receive its value from another variable, but has never been configured to do so." +BadDeviceFailure,0x808B0000,"There has been a failure in the device/data source that generates the value that has affected the value." +BadSensorFailure,0x808C0000,"There has been a failure in the sensor from which the value is derived by the device/data source." +BadOutOfService,0x808D0000,"The source of the data is not operational." +BadDeadbandFilterInvalid,0x808E0000,"The deadband filter is not valid." +UncertainNoCommunicationLastUsableValue,0x408F0000,"Communication to the data source has failed. The variable value is the last value that had a good quality." +UncertainLastUsableValue,0x40900000,"Whatever was updating this value has stopped doing so." +UncertainSubstituteValue,0x40910000,"The value is an operational value that was manually overwritten." +UncertainInitialValue,0x40920000,"The value is an initial value for a variable that normally receives its value from another variable." +UncertainSensorNotAccurate,0x40930000,"The value is at one of the sensor limits." +UncertainEngineeringUnitsExceeded,0x40940000,"The value is outside of the range of values defined for this parameter." +UncertainSubNormal,0x40950000,"The value is derived from multiple sources and has less than the required number of Good sources." +GoodLocalOverride,0x00960000,"The value has been overridden." +BadRefreshInProgress,0x80970000,"This Condition refresh failed, a Condition refresh operation is already in progress." +BadConditionAlreadyDisabled,0x80980000,"This condition has already been disabled." +BadConditionAlreadyEnabled,0x80CC0000,"This condition has already been enabled." +BadConditionDisabled,0x80990000,"Property not available, this condition is disabled." +BadEventIdUnknown,0x809A0000,"The specified event id is not recognized." +BadEventNotAcknowledgeable,0x80BB0000,"The event cannot be acknowledged." +BadDialogNotActive,0x80CD0000,"The dialog condition is not active." +BadDialogResponseInvalid,0x80CE0000,"The response is not valid for the dialog." +BadConditionBranchAlreadyAcked,0x80CF0000,"The condition branch has already been acknowledged." +BadConditionBranchAlreadyConfirmed,0x80D00000,"The condition branch has already been confirmed." +BadConditionAlreadyShelved,0x80D10000,"The condition has already been shelved." +BadConditionNotShelved,0x80D20000,"The condition is not currently shelved." +BadShelvingTimeOutOfRange,0x80D30000,"The shelving time not within an acceptable range." +BadNoData,0x809B0000,"No data exists for the requested time range or event filter." +BadBoundNotFound,0x80D70000,"No data found to provide upper or lower bound value." +BadBoundNotSupported,0x80D80000,"The server cannot retrieve a bound for the variable." +BadDataLost,0x809D0000,"Data is missing due to collection started/stopped/lost." +BadDataUnavailable,0x809E0000,"Expected data is unavailable for the requested time range due to an un-mounted volume, an off-line archive or tape, or similar reason for temporary unavailability." +BadEntryExists,0x809F0000,"The data or event was not successfully inserted because a matching entry exists." +BadNoEntryExists,0x80A00000,"The data or event was not successfully updated because no matching entry exists." +BadTimestampNotSupported,0x80A10000,"The client requested history using a timestamp format the server does not support (i.e requested ServerTimestamp when server only supports SourceTimestamp)." +GoodEntryInserted,0x00A20000,"The data or event was successfully inserted into the historical database." +GoodEntryReplaced,0x00A30000,"The data or event field was successfully replaced in the historical database." +UncertainDataSubNormal,0x40A40000,"The value is derived from multiple values and has less than the required number of Good values." +GoodNoData,0x00A50000,"No data exists for the requested time range or event filter." +GoodMoreData,0x00A60000,"The data or event field was successfully replaced in the historical database." +BadAggregateListMismatch,0x80D40000,"The requested number of Aggregates does not match the requested number of NodeIds." +BadAggregateNotSupported,0x80D50000,"The requested Aggregate is not support by the server." +BadAggregateInvalidInputs,0x80D60000,"The aggregate value could not be derived due to invalid data inputs." +BadAggregateConfigurationRejected,0x80DA0000,"The aggregate configuration is not valid for specified node." +GoodDataIgnored,0x00D90000,"The request specifies fields which are not valid for the EventType or cannot be saved by the historian." +BadRequestNotAllowed,0x80E40000,"The request was rejected by the server because it did not meet the criteria set by the server." +BadRequestNotComplete,0x81130000,"The request has not been processed by the server yet." +BadTicketRequired,0x811F0000,"The device identity needs a ticket before it can be accepted." +BadTicketInvalid,0x81200000,"The device identity needs a ticket before it can be accepted." +GoodEdited,0x00DC0000,"The value does not come from the real source and has been edited by the server." +GoodPostActionFailed,0x00DD0000,"There was an error in execution of these post-actions." +UncertainDominantValueChanged,0x40DE0000,"The related EngineeringUnit has been changed but the Variable Value is still provided based on the previous unit." +GoodDependentValueChanged,0x00E00000,"A dependent value has been changed but the change has not been applied to the device." +BadDominantValueChanged,0x80E10000,"The related EngineeringUnit has been changed but this change has not been applied to the device. The Variable Value is still dependent on the previous unit but its status is currently Bad." +UncertainDependentValueChanged,0x40E20000,"A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is uncertain." +BadDependentValueChanged,0x80E30000,"A dependent value has been changed but the change has not been applied to the device. The quality of the dominant variable is Bad." +GoodEdited_DependentValueChanged,0x01160000,"It is delivered with a dominant Variable value when a dependent Variable has changed but the change has not been applied." +GoodEdited_DominantValueChanged,0x01170000,"It is delivered with a dependent Variable value when a dominant Variable has changed but the change has not been applied." +GoodEdited_DominantValueChanged_DependentValueChanged,0x01180000,"It is delivered with a dependent Variable value when a dominant or dependent Variable has changed but change has not been applied." +BadEdited_OutOfRange,0x81190000,"It is delivered with a Variable value when Variable has changed but the value is not legal." +BadInitialValue_OutOfRange,0x811A0000,"It is delivered with a Variable value when a source Variable has changed but the value is not legal." +BadOutOfRange_DominantValueChanged,0x811B0000,"It is delivered with a dependent Variable value when a dominant Variable has changed and the value is not legal." +BadEdited_OutOfRange_DominantValueChanged,0x811C0000,"It is delivered with a dependent Variable value when a dominant Variable has changed, the value is not legal and the change has not been applied." +BadOutOfRange_DominantValueChanged_DependentValueChanged,0x811D0000,"It is delivered with a dependent Variable value when a dominant or dependent Variable has changed and the value is not legal." +BadEdited_OutOfRange_DominantValueChanged_DependentValueChanged,0x811E0000,"It is delivered with a dependent Variable value when a dominant or dependent Variable has changed, the value is not legal and the change has not been applied." +GoodCommunicationEvent,0x00A70000,"The communication layer has raised an event." +GoodShutdownEvent,0x00A80000,"The system is shutting down." +GoodCallAgain,0x00A90000,"The operation is not finished and needs to be called again." +GoodNonCriticalTimeout,0x00AA0000,"A non-critical timeout occurred." +BadInvalidArgument,0x80AB0000,"One or more arguments are invalid." +BadConnectionRejected,0x80AC0000,"Could not establish a network connection to remote server." +BadDisconnect,0x80AD0000,"The server has disconnected from the client." +BadConnectionClosed,0x80AE0000,"The network connection has been closed." +BadInvalidState,0x80AF0000,"The operation cannot be completed because the object is closed, uninitialized or in some other invalid state." +BadEndOfStream,0x80B00000,"Cannot move beyond end of the stream." +BadNoDataAvailable,0x80B10000,"No data is currently available for reading from a non-blocking stream." +BadWaitingForResponse,0x80B20000,"The asynchronous operation is waiting for a response." +BadOperationAbandoned,0x80B30000,"The asynchronous operation was abandoned by the caller." +BadExpectedStreamToBlock,0x80B40000,"The stream did not return all data requested (possibly because it is a non-blocking stream)." +BadWouldBlock,0x80B50000,"Non blocking behaviour is required and the operation would block." +BadSyntaxError,0x80B60000,"A value had an invalid syntax." +BadMaxConnectionsReached,0x80B70000,"The operation could not be finished because all available connections are in use." +UncertainTransducerInManual,0x42080000,"The value may not be accurate because the transducer is in manual mode." +UncertainSimulatedValue,0x42090000,"The value is simulated." +UncertainSensorCalibration,0x420A0000,"The value may not be accurate due to a sensor calibration fault." +UncertainConfigurationError,0x420F0000,"The value may not be accurate due to a configuration issue." +GoodCascadeInitializationAcknowledged,0x04010000,"The value source supports cascade handshaking and the value has been Initialized based on an initialization request from a cascade secondary." +GoodCascadeInitializationRequest,0x04020000,"The value source supports cascade handshaking and is requesting initialization of a cascade primary." +GoodCascadeNotInvited,0x04030000,"The value source supports cascade handshaking, however, the source’s current state does not allow for cascade." +GoodCascadeNotSelected,0x04040000,"The value source supports cascade handshaking, however, the source has not selected the corresponding cascade primary for use." +GoodFaultStateActive,0x04070000,"There is a fault state condition active in the value source." +GoodInitiateFaultState,0x04080000,"A fault state condition is being requested of the destination." +GoodCascade,0x04090000,"The value is accurate, and the signal source supports cascade handshaking." \ No newline at end of file diff --git a/protocols/opcua/pom.xml b/protocols/opcua/pom.xml index c1fb9d1dd5a..61fca3c51a0 100644 --- a/protocols/opcua/pom.xml +++ b/protocols/opcua/pom.xml @@ -114,8 +114,9 @@ + - ${project.build.directory}/downloads + ${project.basedir}/downloads Opc.Ua.Types.bsd src/main/xslt/opc-services.xsl ${project.build.outputDirectory}/protocols/opcua @@ -131,7 +132,7 @@ servicesEnum - ${project.build.directory}/downloads/Opc.Ua.NodeIds.Services.csv + ${project.basedir}/downloads/Opc.Ua.NodeIds.Services.csv @@ -142,7 +143,7 @@ - ${project.build.directory}/downloads + ${project.basedir}/downloads Opc.Ua.Types.bsd src/main/xslt/opc-status.xsl ${project.build.outputDirectory}/protocols/opcua @@ -158,7 +159,7 @@ statusCodes - ${project.build.directory}/downloads/StatusCode.csv + ${project.basedir}/downloads/StatusCode.csv @@ -169,7 +170,7 @@ - ${project.build.directory}/downloads + ${project.basedir}/downloads Opc.Ua.Types.bsd src/main/xslt/opc-manual.xsl ${project.build.outputDirectory}/protocols/opcua @@ -185,7 +186,7 @@ services - ${project.build.directory}/downloads/Opc.Ua.NodeSet2.Services.xml + ${project.basedir}/downloads/Opc.Ua.NodeSet2.Services.xml @@ -196,7 +197,7 @@ - ${project.build.directory}/downloads + ${project.basedir}/downloads Opc.Ua.Types.bsd src/main/xslt/opc-types.xsl ${project.build.outputDirectory}/protocols/opcua @@ -219,11 +220,20 @@ net.sf.saxon Saxon-HE - 12.0 + + + org.apache.rat + apache-rat-plugin + + + **/downloads/** + + + diff --git a/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec b/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec index 5bd7641b50e..6f48ecb49c4 100644 --- a/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec +++ b/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec @@ -175,14 +175,12 @@ ['WCHAR' STRING [simple string 16 value encoding='"UTF-16"'] ] - //['STRING' STRING - // [implicit uint 8 stringLength 'STR_LEN(value)' ] - // [simple vstring 'stringLength' value ] - //] - //['WSTRING' STRING - // [implicit uint 8 stringLength 'STR_LEN(value)' ] - // [simple vstring 'stringLength * 2' value encoding='"UTF-16"'] - //] + ['STRING' STRING + [manual vstring value 'STATIC_CALL("parseString", readBuffer, _type.encoding)' 'STATIC_CALL("serializeString", writeBuffer, _value, _type.encoding)' '(STR_LEN(_value) + 1) * 8'] + ] + ['WSTRING' STRING + [manual vstring value 'STATIC_CALL("parseString", readBuffer, _type.encoding)' 'STATIC_CALL("serializeString", writeBuffer, _value, _type.encoding)' '(STR_LEN(_value) + 1) * 16' encoding='"UTF-16"'] + ] // Times and Dates ['TIME' TIME diff --git a/protocols/pom.xml b/protocols/pom.xml index e076a77ff1f..89125235497 100644 --- a/protocols/pom.xml +++ b/protocols/pom.xml @@ -177,6 +177,9 @@ <_removeheaders>Bnd-LastModified + + * + diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec index 7ab1e493d58..74aa05b8a0a 100644 --- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec +++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec @@ -223,7 +223,7 @@ [discriminatedType S7Payload (uint 8 messageType, S7Parameter parameter) [typeSwitch parameter.parameterType, messageType ['0x04','0x03' S7PayloadReadVarResponse - [array S7VarPayloadDataItem('true') items count 'CAST(parameter, "S7ParameterReadVarResponse").numItems'] + [array S7VarPayloadDataItem items count 'CAST(parameter, "S7ParameterReadVarResponse").numItems'] ] ['0x05','0x01' S7PayloadWriteVarRequest [array S7VarPayloadDataItem items count 'COUNT(CAST(parameter, "S7ParameterWriteVarRequest").items)'] @@ -240,17 +240,15 @@ // This is actually not quite correct as depending pon the transportSize the length is either defined in bits or bytes. //@param hasNext In the serialization process, if you have multiple write // requests the last element does not require padding. - -[type S7VarPayloadDataItem(bit 'hasNext') +[type S7VarPayloadDataItem [simple DataTransportErrorCode returnCode] [simple DataTransportSize transportSize] [implicit uint 16 dataLength 'COUNT(data) * ((transportSize == DataTransportSize.BIT) ? 1 : (transportSize.sizeInBits ? 8 : 1))'] [array byte data count 'transportSize.sizeInBits ? CEIL(dataLength / 8.0) : dataLength'] - //[padding uint 8 pad '0x00' '(COUNT(data) % 2)'] - [padding uint 8 pad '0x00' '(PADCOUNT(data, hasNext) % 2)'] + [padding uint 8 pad '0x00' '(COUNT(data) % 2)'] + //[padding uint 8 pad '0x00' '(PADCOUNT(data, hasNext) % 2)'] ] - [type S7VarPayloadStatusItem [simple DataTransportErrorCode returnCode] ] @@ -526,7 +524,7 @@ ] ] -[dataIo DataItem(vstring dataProtocolId, int 32 stringLength) +[dataIo DataItem(vstring dataProtocolId, int 32 stringLength, vstring stringEncoding) [typeSwitch dataProtocolId // ----------------------------------------- // Bit @@ -602,18 +600,18 @@ // Characters & Strings // ----------------------------------------- ['"IEC61131_CHAR"' CHAR - [simple string 8 value encoding='"UTF-8"'] + [manual string 8 value 'STATIC_CALL("parseS7Char", readBuffer, _type.encoding, stringEncoding)' 'STATIC_CALL("serializeS7Char", writeBuffer, _value, _type.encoding, stringEncoding)' '8'] ] ['"IEC61131_WCHAR"' CHAR - [simple string 16 value encoding='"UTF-16"'] + [manual string 16 value 'STATIC_CALL("parseS7Char", readBuffer, _type.encoding, stringEncoding)' 'STATIC_CALL("serializeS7Char", writeBuffer, _value, _type.encoding, stringEncoding)' '16' encoding='"UTF-16"'] ] ['"IEC61131_STRING"' STRING // TODO: Fix this length - [manual vstring value 'STATIC_CALL("parseS7String", readBuffer, stringLength, _type.encoding)' 'STATIC_CALL("serializeS7String", writeBuffer, _value, stringLength, _type.encoding)' 'STR_LEN(_value) + 2' encoding='"UTF-8"'] + [manual vstring value 'STATIC_CALL("parseS7String", readBuffer, stringLength, _type.encoding, stringEncoding)' 'STATIC_CALL("serializeS7String", writeBuffer, _value, stringLength, _type.encoding, stringEncoding)' '(stringLength + 2) * 8'] ] ['"IEC61131_WSTRING"' STRING // TODO: Fix this length - [manual vstring value 'STATIC_CALL("parseS7String", readBuffer, stringLength, _type.encoding)' 'STATIC_CALL("serializeS7String", writeBuffer, _value, stringLength, _type.encoding)' '(STR_LEN(_value) * 2) + 2' encoding='"UTF-16"'] + [manual vstring value 'STATIC_CALL("parseS7String", readBuffer, stringLength, _type.encoding, stringEncoding)' 'STATIC_CALL("serializeS7String", writeBuffer, _value, stringLength, _type.encoding, stringEncoding)' '(stringLength + 2) * 16' encoding='"UTF-16"'] ] // ----------------------------------------- @@ -720,22 +718,22 @@ ['0x09' USINT ['0x02' , 'B' , '1' , 'INT' , 'BYTE_WORD_DWORD' , 'IEC61131_USINT' , 'false' , 'false' , 'true' , 'true' , 'true' ]] ['0x0A' DINT ['0x07' , 'D' , '4' , 'INT' , 'INTEGER' , 'IEC61131_DINT' , 'true' , 'true' , 'true' , 'true' , 'true' ]] ['0x0B' UDINT ['0x07' , 'D' , '4' , 'INT' , 'INTEGER' , 'IEC61131_UDINT' , 'false' , 'false' , 'true' , 'true' , 'true' ]] - ['0x0C' LINT ['0x00' , 'X' , '8' , 'INT' , 'null' , 'IEC61131_LINT' , 'false' , 'false' , 'false' , 'true' , 'false' ]] - ['0x0D' ULINT ['0x00' , 'X' , '16' , 'INT' , 'null' , 'IEC61131_ULINT' , 'false' , 'false' , 'false' , 'true' , 'false' ]] + ['0x0C' LINT ['0x00' , 'X' , '8' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_LINT' , 'false' , 'false' , 'false' , 'true' , 'false' ]] + ['0x0D' ULINT ['0x00' , 'X' , '16' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_ULINT' , 'false' , 'false' , 'false' , 'true' , 'false' ]] // Floating point values - ['0x0E' REAL ['0x08' , 'D' , '4' , 'null' , 'REAL' , 'IEC61131_REAL' , 'true' , 'true' , 'true' , 'true' , 'true' ]] - ['0x0F' LREAL ['0x30' , 'X' , '8' , 'REAL' , 'null' , 'IEC61131_LREAL' , 'false' , 'false' , 'true' , 'true' , 'false' ]] + ['0x0E' REAL ['0x08' , 'D' , '4' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_REAL' , 'true' , 'true' , 'true' , 'true' , 'true' ]] + ['0x0F' LREAL ['0x30' , 'X' , '8' , 'REAL' , 'BYTE_WORD_DWORD' , 'IEC61131_LREAL' , 'false' , 'false' , 'true' , 'true' , 'false' ]] // Characters and Strings ['0x10' CHAR ['0x03' , 'B' , '1' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_CHAR' , 'true' , 'true' , 'true' , 'true' , 'true' ]] - ['0x11' WCHAR ['0x13' , 'X' , '2' , 'null' , 'null' , 'IEC61131_WCHAR' , 'false' , 'false' , 'true' , 'true' , 'true' ]] + ['0x11' WCHAR ['0x13' , 'X' , '2' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_WCHAR' , 'false' , 'false' , 'true' , 'true' , 'true' ]] ['0x12' STRING ['0x03' , 'X' , '1' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_STRING' , 'true' , 'true' , 'true' , 'true' , 'true' ]] - ['0x13' WSTRING ['0x00' , 'X' , '2' , 'null' , 'null' , 'IEC61131_WSTRING' , 'false' , 'false' , 'true' , 'true' , 'true' ]] + ['0x13' WSTRING ['0x00' , 'X' , '2' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_WSTRING' , 'false' , 'false' , 'true' , 'true' , 'true' ]] // Dates and time values (Please note that we seem to have to rewrite queries for these types to reading bytes or we'll get "Data type not supported" errors) - ['0x14' TIME ['0x0B' , 'D' , '4' , 'null' , 'null' , 'IEC61131_TIME' , 'true' , 'true' , 'true' , 'true' , 'true' ]] - //['0x15' S5TIME ['0x0C' , 'X' , '4' , 'null' , 'null' , 'S7_S5TIME' , 'true' , 'true' , 'true' , 'true' , 'true' ]] + ['0x14' TIME ['0x0B' , 'X' , '4' , 'null' , 'null' , 'IEC61131_TIME' , 'true' , 'true' , 'true' , 'true' , 'true' ]] + //['0x15' S5TIME ['0x0C' , 'X' , '4' , 'null' , 'null' , 'S7_S5TIME' , 'true' , 'true' , 'true' , 'true' , 'true' ]] ['0x16' LTIME ['0x00' , 'X' , '8' , 'TIME' , 'null' , 'IEC61131_LTIME' , 'false' , 'false' , 'false' , 'true' , 'false' ]] ['0x17' DATE ['0x09' , 'X' , '2' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_DATE' , 'true' , 'true' , 'true' , 'true' , 'true' ]] ['0x18' TIME_OF_DAY ['0x06' , 'X' , '4' , 'null' , 'BYTE_WORD_DWORD' , 'IEC61131_TIME_OF_DAY' , 'true' , 'true' , 'true' , 'true' , 'true' ]] From fc6b78ebb74883bb8e5ac98df6436a4ba8f5018e Mon Sep 17 00:00:00 2001 From: Christofer Dutz Date: Sat, 4 Feb 2023 17:02:17 +0100 Subject: [PATCH 14/14] chore: Get the Go and C part of the build working again. --- .../drivers/s7/src/driver_s7_encode_decode.c | 2 +- .../generated-sources/plc4x/src/plc4x_value.c | 4 +- plc4c/generated-sources/s7/src/data_item.c | 4 +- .../generated-sources/s7/src/transport_size.c | 3 -- .../testing/protocols/s7/DriverTestsuite.xml | 16 +++---- plc4go/go.mod | 2 +- plc4go/protocols/s7/readwrite/ParserHelper.go | 6 ++- .../protocols/s7/readwrite/XmlParserHelper.go | 4 +- .../protocols/s7/readwrite/model/DataItem.go | 44 +++++++++-------- .../s7/readwrite/model/StaticHelper.go | 34 ++++++++++---- .../s7/readwrite/model/TransportSize.go | 16 +++---- ...p_Block_DevicePropertiesNameOfStation.java | 22 +-------- .../readwrite/PnDcp_Pdu_RealTimeCyclic.java | 12 ----- .../readwrite/PnIoCm_Block_AlarmCrReq.java | 27 ----------- .../readwrite/PnIoCm_Block_AlarmCrRes.java | 27 ----------- .../readwrite/PnIoCm_Block_ArReq.java | 27 ----------- .../readwrite/PnIoCm_Block_ArRes.java | 27 ----------- .../readwrite/PnIoCm_Block_ArServer.java | 47 ------------------- .../PnIoCm_Block_ExpectedSubmoduleReq.java | 27 ----------- .../readwrite/PnIoCm_Block_IoCrReq.java | 27 ----------- .../readwrite/PnIoCm_Block_IoCrRes.java | 27 ----------- .../readwrite/PnIoCm_Block_ModuleDiff.java | 27 ----------- plc4j/drivers/s7/pom.xml | 5 -- .../AlarmMessageObjectQueryType.java | 9 +--- .../plc4x/java/s7/readwrite/COTPPacket.java | 16 ++----- .../COTPPacketConnectionRequest.java | 23 +++------ .../COTPPacketConnectionResponse.java | 23 +++------ .../java/s7/readwrite/COTPPacketData.java | 24 +++------- .../COTPPacketDisconnectRequest.java | 23 +++------ .../COTPPacketDisconnectResponse.java | 22 +++------ .../s7/readwrite/COTPPacketTpduError.java | 21 +++------ .../java/s7/readwrite/COTPParameter.java | 11 ++--- .../s7/readwrite/COTPParameterCalledTsap.java | 19 +++----- .../readwrite/COTPParameterCallingTsap.java | 20 +++----- .../s7/readwrite/COTPParameterChecksum.java | 19 +++----- ...ameterDisconnectAdditionalInformation.java | 19 +++----- .../s7/readwrite/COTPParameterTpduSize.java | 19 +++----- .../plc4x/java/s7/readwrite/S7AddressAny.java | 16 ++----- .../plc4x/java/s7/readwrite/S7Message.java | 21 ++------- .../s7/readwrite/S7MessageObjectRequest.java | 29 ++---------- .../s7/readwrite/S7MessageObjectResponse.java | 15 ++---- .../readwrite/S7ParameterModeTransition.java | 16 ++----- .../S7ParameterSetupCommunication.java | 16 ++----- .../S7ParameterUserDataItemCPUFunctions.java | 14 ++---- .../plc4x/java/s7/readwrite/S7Payload.java | 11 ++--- .../readwrite/S7PayloadReadVarResponse.java | 21 +++------ .../java/s7/readwrite/S7PayloadUserData.java | 19 +++----- ...loadUserDataItemCpuFunctionAlarmQuery.java | 28 ++--------- ...DataItemCpuFunctionAlarmQueryResponse.java | 17 ++----- ...serDataItemCpuFunctionMsgSubscription.java | 22 ++------- .../readwrite/S7PayloadWriteVarRequest.java | 21 +++------ .../readwrite/S7PayloadWriteVarResponse.java | 21 +++------ .../plc4x/java/s7/readwrite/TPKTPacket.java | 6 +-- .../s7/readwrite/optimizer/S7Optimizer.java | 6 +-- .../readwrite/protocol/S7ProtocolLogic.java | 46 +++++++++--------- plc4j/integrations/opcua-server/pom.xml | 2 +- plc4j/pom.xml | 2 +- protocols/open-protocol/pom.xml | 6 --- protocols/pom.xml | 6 +++ .../protocols/s7/DriverTestsuite.xml | 16 +++---- 60 files changed, 255 insertions(+), 827 deletions(-) diff --git a/plc4c/drivers/s7/src/driver_s7_encode_decode.c b/plc4c/drivers/s7/src/driver_s7_encode_decode.c index 161ec53090d..ffce43616a9 100644 --- a/plc4c/drivers/s7/src/driver_s7_encode_decode.c +++ b/plc4c/drivers/s7/src/driver_s7_encode_decode.c @@ -358,7 +358,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(char* address, void** item) { plc4c_s7_read_write_transport_size_DATE_AND_TIME) { any_address->s7_address_any_transport_size = plc4c_s7_read_write_transport_size_BYTE; any_address->s7_address_any_number_of_elements = - plc4c_s7_read_write_transport_size_length_in_bytes(&(any_address->s7_address_any_transport_size)) * + plc4c_s7_read_write_transport_size_length_in_bytes(plc4x_spi_context_background(), &(any_address->s7_address_any_transport_size)) * any_address->s7_address_any_number_of_elements; } else if (any_address->s7_address_any_transport_size == plc4c_s7_read_write_transport_size_STRING) { diff --git a/plc4c/generated-sources/plc4x/src/plc4x_value.c b/plc4c/generated-sources/plc4x/src/plc4x_value.c index e6c144261d9..a1a15c69939 100644 --- a/plc4c/generated-sources/plc4x/src/plc4x_value.c +++ b/plc4c/generated-sources/plc4x/src/plc4x_value.c @@ -240,14 +240,14 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_parse(plc4x_spi_context ctx // Manual Field (value) char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-8")); - *data_item = plc4c_data_create_string_data(strlen(value), value); + *data_item = plc4c_data_create_string_data(strlen(value), value); } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WSTRING) { /* STRING */ // Manual Field (value) char* value = (char*) (plc4c_plc4x_read_write_parse_string(readBuffer, "UTF-16")); - *data_item = plc4c_data_create_string_data(strlen(value), value); + *data_item = plc4c_data_create_string_data(strlen(value), value); } else if(valueType == plc4c_plc4x_read_write_plc4x_value_type_TIME) { /* TIME */ diff --git a/plc4c/generated-sources/s7/src/data_item.c b/plc4c/generated-sources/s7/src/data_item.c index fd94f5a49ed..25a7d3fd49a 100644 --- a/plc4c/generated-sources/s7/src/data_item.c +++ b/plc4c/generated-sources/s7/src/data_item.c @@ -232,14 +232,14 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4x_spi_context ctx, plc // Manual Field (value) char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-8", stringEncoding)); - *data_item = plc4c_data_create_string_data(stringLength, value); + *data_item = plc4c_data_create_string_data(stringLength, value); } else if(strcmp(dataProtocolId, "IEC61131_WSTRING") == 0) { /* STRING */ // Manual Field (value) char* value = (char*) (plc4c_s7_read_write_parse_s7_string(readBuffer, stringLength, "UTF-16", stringEncoding)); - *data_item = plc4c_data_create_string_data(stringLength, value); + *data_item = plc4c_data_create_string_data(stringLength, value); } else if(strcmp(dataProtocolId, "IEC61131_TIME") == 0) { /* TIME */ diff --git a/plc4c/generated-sources/s7/src/transport_size.c b/plc4c/generated-sources/s7/src/transport_size.c index fc76d7d3241..50978d3c977 100644 --- a/plc4c/generated-sources/s7/src/transport_size.c +++ b/plc4c/generated-sources/s7/src/transport_size.c @@ -1154,9 +1154,6 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_ case plc4c_s7_read_write_transport_size_INT: /* '0x06' */{ return plc4c_s7_read_write_transport_size_INT; } - case plc4c_s7_read_write_transport_size_REAL: /* '0x0E' */{ - return plc4c_s7_read_write_transport_size_REAL; - } case plc4c_s7_read_write_transport_size_LWORD: /* '0x05' */{ return plc4c_s7_read_write_transport_size_LWORD; } diff --git a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml index 8d76a5ce141..97aab67eb6d 100644 --- a/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml +++ b/plc4go/assets/testing/protocols/s7/DriverTestsuite.xml @@ -441,7 +441,7 @@ 240 true - 10 + 2 @@ -450,7 +450,7 @@ 50 1 0 - 10 + 2 14 0 @@ -508,7 +508,7 @@ 240 true - 0 + 2 @@ -517,7 +517,7 @@ 50 3 0 - 10 + 2 2 6 @@ -613,7 +613,7 @@ 240 true - 10 + 2 @@ -622,7 +622,7 @@ 50 1 0 - 10 + 2 14 0 @@ -680,7 +680,7 @@ 240 true - 0 + 2 @@ -689,7 +689,7 @@ 50 2 0 - 10 + 2 0 0 diff --git a/plc4go/go.mod b/plc4go/go.mod index 42981266a4f..cb23e942a13 100644 --- a/plc4go/go.mod +++ b/plc4go/go.mod @@ -19,7 +19,7 @@ module github.com/apache/plc4x/plc4go -go 1.19 +go 1.18 require ( github.com/IBM/netaddr v1.5.0 diff --git a/plc4go/protocols/s7/readwrite/ParserHelper.go b/plc4go/protocols/s7/readwrite/ParserHelper.go index 86cb61bb774..fc717c57f92 100644 --- a/plc4go/protocols/s7/readwrite/ParserHelper.go +++ b/plc4go/protocols/s7/readwrite/ParserHelper.go @@ -43,7 +43,11 @@ func (m S7ParserHelper) Parse(typeName string, arguments []string, io utils.Read if err != nil { return nil, errors.Wrap(err, "Error parsing") } - return model.DataItemParseWithBuffer(context.Background(), io, dataProtocolId, stringLength) + stringEncoding, err := utils.StrToString(arguments[2]) + if err != nil { + return nil, errors.Wrap(err, "Error parsing") + } + return model.DataItemParseWithBuffer(context.Background(), io, dataProtocolId, stringLength, stringEncoding) case "SzlId": return model.SzlIdParseWithBuffer(context.Background(), io) case "AlarmMessageObjectAckType": diff --git a/plc4go/protocols/s7/readwrite/XmlParserHelper.go b/plc4go/protocols/s7/readwrite/XmlParserHelper.go index a8374bea380..9d1a8e858be 100644 --- a/plc4go/protocols/s7/readwrite/XmlParserHelper.go +++ b/plc4go/protocols/s7/readwrite/XmlParserHelper.go @@ -52,7 +52,9 @@ func (m S7XmlParserHelper) Parse(typeName string, xmlString string, parserArgume return nil, err } stringLength := int32(parsedInt1) - return model.DataItemParseWithBuffer(context.Background(), utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataProtocolId, stringLength) + // TODO: find a way to parse the sub types + var stringEncoding string + return model.DataItemParseWithBuffer(context.Background(), utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataProtocolId, stringLength, stringEncoding) case "SzlId": return model.SzlIdParseWithBuffer(context.Background(), utils.NewXmlReadBuffer(strings.NewReader(xmlString))) case "AlarmMessageObjectAckType": diff --git a/plc4go/protocols/s7/readwrite/model/DataItem.go b/plc4go/protocols/s7/readwrite/model/DataItem.go index a7879462c14..5aec9ab96c6 100644 --- a/plc4go/protocols/s7/readwrite/model/DataItem.go +++ b/plc4go/protocols/s7/readwrite/model/DataItem.go @@ -29,11 +29,11 @@ import ( // Code generated by code-generation. DO NOT EDIT. -func DataItemParse(ctx context.Context, theBytes []byte, dataProtocolId string, stringLength int32) (api.PlcValue, error) { - return DataItemParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), dataProtocolId, stringLength) +func DataItemParse(ctx context.Context, theBytes []byte, dataProtocolId string, stringLength int32, stringEncoding string) (api.PlcValue, error) { + return DataItemParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), dataProtocolId, stringLength, stringEncoding) } -func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, dataProtocolId string, stringLength int32) (api.PlcValue, error) { +func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, dataProtocolId string, stringLength int32, stringEncoding string) (api.PlcValue, error) { readBuffer.PullContext("DataItem") switch { case dataProtocolId == "IEC61131_BOOL": // BOOL @@ -162,16 +162,16 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, d readBuffer.CloseContext("DataItem") return values.NewPlcLREAL(value), nil case dataProtocolId == "IEC61131_CHAR": // CHAR - // Simple Field (value) - value, _valueErr := readBuffer.ReadString("value", uint32(8), "UTF-8") + // Manual Field (value) + value, _valueErr := ParseS7Char(readBuffer, "UTF-8", stringEncoding) if _valueErr != nil { return nil, errors.Wrap(_valueErr, "Error parsing 'value' field") } readBuffer.CloseContext("DataItem") return values.NewPlcCHAR(value), nil case dataProtocolId == "IEC61131_WCHAR": // CHAR - // Simple Field (value) - value, _valueErr := readBuffer.ReadString("value", uint32(16), "UTF-16") + // Manual Field (value) + value, _valueErr := ParseS7Char(readBuffer, "UTF-16", stringEncoding) if _valueErr != nil { return nil, errors.Wrap(_valueErr, "Error parsing 'value' field") } @@ -179,7 +179,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, d return values.NewPlcCHAR(value), nil case dataProtocolId == "IEC61131_STRING": // STRING // Manual Field (value) - value, _valueErr := ParseS7String(readBuffer, stringLength, "UTF-8") + value, _valueErr := ParseS7String(readBuffer, stringLength, "UTF-8", stringEncoding) if _valueErr != nil { return nil, errors.Wrap(_valueErr, "Error parsing 'value' field") } @@ -187,7 +187,7 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, d return values.NewPlcSTRING(value), nil case dataProtocolId == "IEC61131_WSTRING": // STRING // Manual Field (value) - value, _valueErr := ParseS7String(readBuffer, stringLength, "UTF-16") + value, _valueErr := ParseS7String(readBuffer, stringLength, "UTF-16", stringEncoding) if _valueErr != nil { return nil, errors.Wrap(_valueErr, "Error parsing 'value' field") } @@ -288,21 +288,23 @@ func DataItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, d return nil, errors.New("unsupported type") } -func DataItemSerialize(value api.PlcValue, dataProtocolId string, stringLength int32) ([]byte, error) { +func DataItemSerialize(value api.PlcValue, dataProtocolId string, stringLength int32, stringEncoding string) ([]byte, error) { wb := utils.NewWriteBufferByteBased() - if err := DataItemSerializeWithWriteBuffer(context.Background(), wb, value, dataProtocolId, stringLength); err != nil { + if err := DataItemSerializeWithWriteBuffer(context.Background(), wb, value, dataProtocolId, stringLength, stringEncoding); err != nil { return nil, err } return wb.GetBytes(), nil } -func DataItemSerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer, value api.PlcValue, dataProtocolId string, stringLength int32) error { +func DataItemSerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer, value api.PlcValue, dataProtocolId string, stringLength int32, stringEncoding string) error { m := struct { DataProtocolId string StringLength int32 + StringEncoding string }{ DataProtocolId: dataProtocolId, StringLength: stringLength, + StringEncoding: stringEncoding, } _ = m writeBuffer.PushContext("DataItem") @@ -388,24 +390,26 @@ func DataItemSerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.Wri return errors.Wrap(_err, "Error serializing 'value' field") } case dataProtocolId == "IEC61131_CHAR": // CHAR - // Simple Field (value) - if _err := writeBuffer.WriteString("value", uint32(8), "UTF-8", value.GetString()); _err != nil { - return errors.Wrap(_err, "Error serializing 'value' field") + // Manual Field (value) + _valueErr := SerializeS7Char(writeBuffer, value, "UTF-8", m.StringEncoding) + if _valueErr != nil { + return errors.Wrap(_valueErr, "Error serializing 'value' field") } case dataProtocolId == "IEC61131_WCHAR": // CHAR - // Simple Field (value) - if _err := writeBuffer.WriteString("value", uint32(16), "UTF-16", value.GetString()); _err != nil { - return errors.Wrap(_err, "Error serializing 'value' field") + // Manual Field (value) + _valueErr := SerializeS7Char(writeBuffer, value, "UTF-16", m.StringEncoding) + if _valueErr != nil { + return errors.Wrap(_valueErr, "Error serializing 'value' field") } case dataProtocolId == "IEC61131_STRING": // STRING // Manual Field (value) - _valueErr := SerializeS7String(writeBuffer, value, stringLength, "UTF-8") + _valueErr := SerializeS7String(writeBuffer, value, stringLength, "UTF-8", m.StringEncoding) if _valueErr != nil { return errors.Wrap(_valueErr, "Error serializing 'value' field") } case dataProtocolId == "IEC61131_WSTRING": // STRING // Manual Field (value) - _valueErr := SerializeS7String(writeBuffer, value, stringLength, "UTF-16") + _valueErr := SerializeS7String(writeBuffer, value, stringLength, "UTF-16", m.StringEncoding) if _valueErr != nil { return errors.Wrap(_valueErr, "Error serializing 'value' field") } diff --git a/plc4go/protocols/s7/readwrite/model/StaticHelper.go b/plc4go/protocols/s7/readwrite/model/StaticHelper.go index 0b588648e04..90110b20095 100644 --- a/plc4go/protocols/s7/readwrite/model/StaticHelper.go +++ b/plc4go/protocols/s7/readwrite/model/StaticHelper.go @@ -20,9 +20,10 @@ package model import ( + "time" + "github.com/apache/plc4x/plc4go/pkg/api/values" "github.com/apache/plc4x/plc4go/spi/utils" - "time" ) func ParseTiaTime(io utils.ReadBuffer) (uint32, error) { @@ -122,33 +123,46 @@ func SerializeTiaDateTime(io utils.WriteBuffer, value values.PlcValue) error { return nil } -func ParseS7String(io utils.ReadBuffer, stringLength int32, encoding string) (string, error) { +func ParseS7String(io utils.ReadBuffer, stringLength int32, defaultEncoding string, encoding string) (string, error) { + usedEncoding := defaultEncoding + if len(encoding) > 0 { + usedEncoding = encoding + } var multiplier int32 - switch encoding { + switch usedEncoding { case "UTF-8": multiplier = 8 case "UTF-16": multiplier = 16 } - return io.ReadString("", uint32(stringLength*multiplier), encoding) + return io.ReadString("", uint32(stringLength*multiplier), usedEncoding) } -func SerializeS7String(io utils.WriteBuffer, value values.PlcValue, stringLength int32, encoding string) error { +func SerializeS7String(io utils.WriteBuffer, value values.PlcValue, stringLength int32, defaultEncoding string, encoding string) error { + usedEncoding := defaultEncoding + if len(encoding) > 0 { + usedEncoding = encoding + } var multiplier int32 - switch encoding { + switch usedEncoding { case "UTF-8": multiplier = 8 case "UTF-16": multiplier = 16 } - return io.WriteString("", uint32(stringLength*multiplier), encoding, value.GetString()) + return io.WriteString("", uint32(stringLength*multiplier), usedEncoding, value.GetString()) } -func ParseS7Char(io utils.ReadBuffer, encoding string) (uint8, error) { - return io.ReadUint8("", 8) +func ParseS7Char(io utils.ReadBuffer, defaultEncoding string, encoding string) (string, error) { + usedEncoding := defaultEncoding + if len(encoding) > 0 { + usedEncoding = encoding + } + return io.ReadString("value", uint32(8), usedEncoding) } -func SerializeS7Char(io utils.WriteBuffer, value values.PlcValue, encoding string) error { +func SerializeS7Char(io utils.WriteBuffer, value values.PlcValue, defaultEncoding string, encoding string) error { + // TODO: This sort of looks wrong. return io.WriteUint8("", 8, value.GetUint8()) } diff --git a/plc4go/protocols/s7/readwrite/model/TransportSize.go b/plc4go/protocols/s7/readwrite/model/TransportSize.go index 1d336711ac7..a89861aa229 100644 --- a/plc4go/protocols/s7/readwrite/model/TransportSize.go +++ b/plc4go/protocols/s7/readwrite/model/TransportSize.go @@ -1132,19 +1132,19 @@ func (e TransportSize) DataTransportSize() DataTransportSize { } case 0x0C: { /* '0x0C' */ - return 0 + return DataTransportSize_BYTE_WORD_DWORD } case 0x0D: { /* '0x0D' */ - return 0 + return DataTransportSize_BYTE_WORD_DWORD } case 0x0E: { /* '0x0E' */ - return DataTransportSize_REAL + return DataTransportSize_BYTE_WORD_DWORD } case 0x0F: { /* '0x0F' */ - return 0 + return DataTransportSize_BYTE_WORD_DWORD } case 0x10: { /* '0x10' */ @@ -1152,7 +1152,7 @@ func (e TransportSize) DataTransportSize() DataTransportSize { } case 0x11: { /* '0x11' */ - return 0 + return DataTransportSize_BYTE_WORD_DWORD } case 0x12: { /* '0x12' */ @@ -1160,7 +1160,7 @@ func (e TransportSize) DataTransportSize() DataTransportSize { } case 0x13: { /* '0x13' */ - return 0 + return DataTransportSize_BYTE_WORD_DWORD } case 0x14: { /* '0x14' */ @@ -1376,11 +1376,11 @@ func (e TransportSize) BaseType() TransportSize { } case 0x0C: { /* '0x0C' */ - return TransportSize_INT + return 0 } case 0x0D: { /* '0x0D' */ - return TransportSize_INT + return 0 } case 0x0E: { /* '0x0E' */ diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java index cbd068d825f..91f9c99e385 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java @@ -51,8 +51,6 @@ public Short getSuboption() { // Arguments. protected final Integer blockLength; - // Reserved Fields - private Integer reservedField0; public PnDcp_Block_DevicePropertiesNameOfStation(byte[] nameOfStation, Integer blockLength) { super(); @@ -71,12 +69,6 @@ protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws Seriali int startPos = positionAware.getPos(); writeBuffer.pushContext("PnDcp_Block_DevicePropertiesNameOfStation"); - // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (int) 0x0000, - writeUnsignedInt(writeBuffer, 16)); - // Array Field (nameOfStation) writeByteArrayField("nameOfStation", nameOfStation, writeByteArray(writeBuffer, 8)); @@ -104,9 +96,6 @@ public int getLengthInBits() { PnDcp_Block_DevicePropertiesNameOfStation _value = this; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - // Reserved Field (reserved) - lengthInBits += 16; - // Array field if (nameOfStation != null) { lengthInBits += 8 * nameOfStation.length; @@ -133,9 +122,6 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - Integer reservedField0 = - readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000); - byte[] nameOfStation = readBuffer.readByteArray("nameOfStation", Math.toIntExact((blockLength) - (2))); @@ -148,27 +134,23 @@ public static PnDcp_BlockBuilder staticParsePnDcp_BlockBuilder( readBuffer.closeContext("PnDcp_Block_DevicePropertiesNameOfStation"); // Create the instance - return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( - nameOfStation, blockLength, reservedField0); + return new PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl(nameOfStation, blockLength); } public static class PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl implements PnDcp_Block.PnDcp_BlockBuilder { private final byte[] nameOfStation; private final Integer blockLength; - private final Integer reservedField0; public PnDcp_Block_DevicePropertiesNameOfStationBuilderImpl( - byte[] nameOfStation, Integer blockLength, Integer reservedField0) { + byte[] nameOfStation, Integer blockLength) { this.nameOfStation = nameOfStation; this.blockLength = blockLength; - this.reservedField0 = reservedField0; } public PnDcp_Block_DevicePropertiesNameOfStation build() { PnDcp_Block_DevicePropertiesNameOfStation pnDcp_Block_DevicePropertiesNameOfStation = new PnDcp_Block_DevicePropertiesNameOfStation(nameOfStation, blockLength); - pnDcp_Block_DevicePropertiesNameOfStation.reservedField0 = reservedField0; return pnDcp_Block_DevicePropertiesNameOfStation; } } diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java index d54442408a5..9ed532a12dd 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java @@ -179,9 +179,6 @@ public int getLengthInBits() { // Manual Field (dataUnit) lengthInBits += ((dataUnit.getLengthInBytes())) * (8); - // Manual Field (dataUnit) - lengthInBits += ((dataUnit.getLengthInBytes())) * (8); - // Simple field (cycleCounter) lengthInBits += 16; @@ -223,15 +220,6 @@ public static PnDcp_PduBuilder staticParsePnDcp_PduBuilder(ReadBuffer readBuffer int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - PnIo_CyclicServiceDataUnit dataUnit = - readManualField( - "dataUnit", - readBuffer, - () -> - (PnIo_CyclicServiceDataUnit) - (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.readDataUnit( - readBuffer))); - PnIo_CyclicServiceDataUnit dataUnit = readManualField( "dataUnit", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java index 7078d7d432f..ea08b3e6cca 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrReq.java @@ -269,15 +269,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (alarmType) lengthInBits += 16; @@ -322,24 +313,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java index 1bbe50aca56..b20e3da94fa 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_AlarmCrRes.java @@ -161,15 +161,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (alarmType) lengthInBits += 16; @@ -190,24 +181,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java index 760d7bad26e..6c88f4746fd 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArReq.java @@ -388,15 +388,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (arType) lengthInBits += 16; @@ -468,24 +459,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java index 47fdfe09005..8c14bfcd4e2 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArRes.java @@ -187,15 +187,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (arType) lengthInBits += 16; @@ -222,24 +213,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java index 3b182b394b4..d6c6943859e 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ArServer.java @@ -144,24 +144,6 @@ public int getLengthInBits() { lengthInBits += 8; } - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - - // Simple field (stationName) - lengthInBits += stationName.getLengthInBits(); - - // Padding Field (padding) - int _timesPadding = (int) (((20) - (6)) - ((stationName.getStringLength()))); - while (_timesPadding-- > 0) { - lengthInBits += 8; - } - return lengthInBits; } @@ -173,35 +155,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - PascalString stationName = - readSimpleField( - "stationName", - new DataReaderComplexDefault<>(() -> PascalString.staticParse(readBuffer), readBuffer), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - readPaddingField( - readUnsignedShort(readBuffer, 8), - (int) (((20) - (6)) - ((stationName.getStringLength()))), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java index 46a1790760a..62594866147 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ExpectedSubmoduleReq.java @@ -135,15 +135,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Implicit Field (numberOfApis) lengthInBits += 16; @@ -167,24 +158,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java index 95ae7110f26..47e22bf4bd9 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrReq.java @@ -423,15 +423,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (ioCrType) lengthInBits += 16; @@ -518,24 +509,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java index 73501eeb3e2..44492f5c1ca 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_IoCrRes.java @@ -159,15 +159,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Simple field (ioCrType) lengthInBits += 16; @@ -188,24 +179,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java index 6bee067640a..533dabe3671 100644 --- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java +++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Block_ModuleDiff.java @@ -133,15 +133,6 @@ public int getLengthInBits() { // Simple field (blockVersionLow) lengthInBits += 8; - // Implicit Field (blockLength) - lengthInBits += 16; - - // Simple field (blockVersionHigh) - lengthInBits += 8; - - // Simple field (blockVersionLow) - lengthInBits += 8; - // Implicit Field (numberOfApis) lengthInBits += 16; @@ -165,24 +156,6 @@ public static PnIoCm_BlockBuilder staticParsePnIoCm_BlockBuilder(ReadBuffer read int curPos; boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get(); - int blockLength = - readImplicitField( - "blockLength", - readUnsignedInt(readBuffer, 16), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionHigh = - readSimpleField( - "blockVersionHigh", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - - short blockVersionLow = - readSimpleField( - "blockVersionLow", - readUnsignedShort(readBuffer, 8), - WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); - int blockLength = readImplicitField( "blockLength", diff --git a/plc4j/drivers/s7/pom.xml b/plc4j/drivers/s7/pom.xml index a08655bcece..edec5eb9895 100644 --- a/plc4j/drivers/s7/pom.xml +++ b/plc4j/drivers/s7/pom.xml @@ -48,11 +48,6 @@ java read-write src/main/generated - - true - - true - diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java index c2dabe64fa6..49f8d6f2750 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java @@ -50,9 +50,6 @@ public class AlarmMessageObjectQueryType implements Message { protected final DateAndTime timeGoing; protected final AssociatedValueType valueGoing; - // Reserved Fields - private Integer reservedField0; - public AlarmMessageObjectQueryType( short lengthDataset, State eventState, @@ -119,10 +116,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeSimpleField("lengthDataset", lengthDataset, writeUnsignedShort(writeBuffer, 8)); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (int) 0x0000, - writeUnsignedInt(writeBuffer, 16)); + writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); // Const Field (variableSpec) writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8)); @@ -270,7 +264,6 @@ public static AlarmMessageObjectQueryType staticParse(ReadBuffer readBuffer) valueComing, timeGoing, valueGoing); - _alarmMessageObjectQueryType.reservedField0 = reservedField0; return _alarmMessageObjectQueryType; } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java index ac9c30dad7e..6d4f3cd49ba 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java @@ -44,14 +44,10 @@ public abstract class COTPPacket implements Message { protected final List parameters; protected final S7Message payload; - // Arguments. - protected final Integer cotpLen; - - public COTPPacket(List parameters, S7Message payload, Integer cotpLen) { + public COTPPacket(List parameters, S7Message payload) { super(); this.parameters = parameters; this.payload = payload; - this.cotpLen = cotpLen; } public List getParameters() { @@ -90,11 +86,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeComplexTypeArrayField("parameters", parameters, writeBuffer); // Optional Field (payload) (Can be skipped, if the value is null) - writeOptionalField( - "payload", - payload, - new DataWriterComplexDefault<>(writeBuffer), - ((positionAware.getPos() - startPos)) < (cotpLen)); + writeOptionalField("payload", payload, new DataWriterComplexDefault<>(writeBuffer)); writeBuffer.popContext("COTPPacket"); } @@ -208,12 +200,12 @@ public static COTPPacket staticParse(ReadBuffer readBuffer, Integer cotpLen) readBuffer.closeContext("COTPPacket"); // Create the instance - COTPPacket _cOTPPacket = builder.build(parameters, payload, cotpLen); + COTPPacket _cOTPPacket = builder.build(parameters, payload); return _cOTPPacket; } public interface COTPPacketBuilder { - COTPPacket build(List parameters, S7Message payload, Integer cotpLen); + COTPPacket build(List parameters, S7Message payload); } @Override diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java index ed9c1b56c1e..afe5079f627 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java @@ -47,21 +47,16 @@ public Short getTpduCode() { protected final int sourceReference; protected final COTPProtocolClass protocolClass; - // Arguments. - protected final Integer cotpLen; - public COTPPacketConnectionRequest( List parameters, S7Message payload, int destinationReference, int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { - super(parameters, payload, cotpLen); + COTPProtocolClass protocolClass) { + super(parameters, payload); this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } public int getDestinationReference() { @@ -149,7 +144,7 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketConnectionRequest"); // Create the instance return new COTPPacketConnectionRequestBuilderImpl( - destinationReference, sourceReference, protocolClass, cotpLen); + destinationReference, sourceReference, protocolClass); } public static class COTPPacketConnectionRequestBuilderImpl @@ -157,24 +152,18 @@ public static class COTPPacketConnectionRequestBuilderImpl private final int destinationReference; private final int sourceReference; private final COTPProtocolClass protocolClass; - private final Integer cotpLen; public COTPPacketConnectionRequestBuilderImpl( - int destinationReference, - int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { + int destinationReference, int sourceReference, COTPProtocolClass protocolClass) { this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } - public COTPPacketConnectionRequest build( - List parameters, S7Message payload, Integer cotpLen) { + public COTPPacketConnectionRequest build(List parameters, S7Message payload) { COTPPacketConnectionRequest cOTPPacketConnectionRequest = new COTPPacketConnectionRequest( - parameters, payload, destinationReference, sourceReference, protocolClass, cotpLen); + parameters, payload, destinationReference, sourceReference, protocolClass); return cOTPPacketConnectionRequest; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java index 65a5bd4cdb5..5fb6eb696e3 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java @@ -47,21 +47,16 @@ public Short getTpduCode() { protected final int sourceReference; protected final COTPProtocolClass protocolClass; - // Arguments. - protected final Integer cotpLen; - public COTPPacketConnectionResponse( List parameters, S7Message payload, int destinationReference, int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { - super(parameters, payload, cotpLen); + COTPProtocolClass protocolClass) { + super(parameters, payload); this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } public int getDestinationReference() { @@ -149,7 +144,7 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketConnectionResponse"); // Create the instance return new COTPPacketConnectionResponseBuilderImpl( - destinationReference, sourceReference, protocolClass, cotpLen); + destinationReference, sourceReference, protocolClass); } public static class COTPPacketConnectionResponseBuilderImpl @@ -157,24 +152,18 @@ public static class COTPPacketConnectionResponseBuilderImpl private final int destinationReference; private final int sourceReference; private final COTPProtocolClass protocolClass; - private final Integer cotpLen; public COTPPacketConnectionResponseBuilderImpl( - int destinationReference, - int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { + int destinationReference, int sourceReference, COTPProtocolClass protocolClass) { this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } - public COTPPacketConnectionResponse build( - List parameters, S7Message payload, Integer cotpLen) { + public COTPPacketConnectionResponse build(List parameters, S7Message payload) { COTPPacketConnectionResponse cOTPPacketConnectionResponse = new COTPPacketConnectionResponse( - parameters, payload, destinationReference, sourceReference, protocolClass, cotpLen); + parameters, payload, destinationReference, sourceReference, protocolClass); return cOTPPacketConnectionResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java index d806cf39230..3b56645300b 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java @@ -46,19 +46,11 @@ public Short getTpduCode() { protected final boolean eot; protected final short tpduRef; - // Arguments. - protected final Integer cotpLen; - public COTPPacketData( - List parameters, - S7Message payload, - boolean eot, - short tpduRef, - Integer cotpLen) { - super(parameters, payload, cotpLen); + List parameters, S7Message payload, boolean eot, short tpduRef) { + super(parameters, payload); this.eot = eot; this.tpduRef = tpduRef; - this.cotpLen = cotpLen; } public boolean getEot() { @@ -119,24 +111,20 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketData"); // Create the instance - return new COTPPacketDataBuilderImpl(eot, tpduRef, cotpLen); + return new COTPPacketDataBuilderImpl(eot, tpduRef); } public static class COTPPacketDataBuilderImpl implements COTPPacket.COTPPacketBuilder { private final boolean eot; private final short tpduRef; - private final Integer cotpLen; - public COTPPacketDataBuilderImpl(boolean eot, short tpduRef, Integer cotpLen) { + public COTPPacketDataBuilderImpl(boolean eot, short tpduRef) { this.eot = eot; this.tpduRef = tpduRef; - this.cotpLen = cotpLen; } - public COTPPacketData build( - List parameters, S7Message payload, Integer cotpLen) { - COTPPacketData cOTPPacketData = - new COTPPacketData(parameters, payload, eot, tpduRef, cotpLen); + public COTPPacketData build(List parameters, S7Message payload) { + COTPPacketData cOTPPacketData = new COTPPacketData(parameters, payload, eot, tpduRef); return cOTPPacketData; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java index 398070dac0e..7a30250683d 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java @@ -47,21 +47,16 @@ public Short getTpduCode() { protected final int sourceReference; protected final COTPProtocolClass protocolClass; - // Arguments. - protected final Integer cotpLen; - public COTPPacketDisconnectRequest( List parameters, S7Message payload, int destinationReference, int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { - super(parameters, payload, cotpLen); + COTPProtocolClass protocolClass) { + super(parameters, payload); this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } public int getDestinationReference() { @@ -149,7 +144,7 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketDisconnectRequest"); // Create the instance return new COTPPacketDisconnectRequestBuilderImpl( - destinationReference, sourceReference, protocolClass, cotpLen); + destinationReference, sourceReference, protocolClass); } public static class COTPPacketDisconnectRequestBuilderImpl @@ -157,24 +152,18 @@ public static class COTPPacketDisconnectRequestBuilderImpl private final int destinationReference; private final int sourceReference; private final COTPProtocolClass protocolClass; - private final Integer cotpLen; public COTPPacketDisconnectRequestBuilderImpl( - int destinationReference, - int sourceReference, - COTPProtocolClass protocolClass, - Integer cotpLen) { + int destinationReference, int sourceReference, COTPProtocolClass protocolClass) { this.destinationReference = destinationReference; this.sourceReference = sourceReference; this.protocolClass = protocolClass; - this.cotpLen = cotpLen; } - public COTPPacketDisconnectRequest build( - List parameters, S7Message payload, Integer cotpLen) { + public COTPPacketDisconnectRequest build(List parameters, S7Message payload) { COTPPacketDisconnectRequest cOTPPacketDisconnectRequest = new COTPPacketDisconnectRequest( - parameters, payload, destinationReference, sourceReference, protocolClass, cotpLen); + parameters, payload, destinationReference, sourceReference, protocolClass); return cOTPPacketDisconnectRequest; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java index 7d0a6adac2b..cf4df50c21e 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java @@ -46,19 +46,14 @@ public Short getTpduCode() { protected final int destinationReference; protected final int sourceReference; - // Arguments. - protected final Integer cotpLen; - public COTPPacketDisconnectResponse( List parameters, S7Message payload, int destinationReference, - int sourceReference, - Integer cotpLen) { - super(parameters, payload, cotpLen); + int sourceReference) { + super(parameters, payload); this.destinationReference = destinationReference; this.sourceReference = sourceReference; - this.cotpLen = cotpLen; } public int getDestinationReference() { @@ -121,28 +116,23 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketDisconnectResponse"); // Create the instance - return new COTPPacketDisconnectResponseBuilderImpl( - destinationReference, sourceReference, cotpLen); + return new COTPPacketDisconnectResponseBuilderImpl(destinationReference, sourceReference); } public static class COTPPacketDisconnectResponseBuilderImpl implements COTPPacket.COTPPacketBuilder { private final int destinationReference; private final int sourceReference; - private final Integer cotpLen; - public COTPPacketDisconnectResponseBuilderImpl( - int destinationReference, int sourceReference, Integer cotpLen) { + public COTPPacketDisconnectResponseBuilderImpl(int destinationReference, int sourceReference) { this.destinationReference = destinationReference; this.sourceReference = sourceReference; - this.cotpLen = cotpLen; } - public COTPPacketDisconnectResponse build( - List parameters, S7Message payload, Integer cotpLen) { + public COTPPacketDisconnectResponse build(List parameters, S7Message payload) { COTPPacketDisconnectResponse cOTPPacketDisconnectResponse = new COTPPacketDisconnectResponse( - parameters, payload, destinationReference, sourceReference, cotpLen); + parameters, payload, destinationReference, sourceReference); return cOTPPacketDisconnectResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java index 466731da70b..1cfaf8cf3c8 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java @@ -46,19 +46,14 @@ public Short getTpduCode() { protected final int destinationReference; protected final short rejectCause; - // Arguments. - protected final Integer cotpLen; - public COTPPacketTpduError( List parameters, S7Message payload, int destinationReference, - short rejectCause, - Integer cotpLen) { - super(parameters, payload, cotpLen); + short rejectCause) { + super(parameters, payload); this.destinationReference = destinationReference; this.rejectCause = rejectCause; - this.cotpLen = cotpLen; } public int getDestinationReference() { @@ -121,25 +116,21 @@ public static COTPPacketBuilder staticParseCOTPPacketBuilder( readBuffer.closeContext("COTPPacketTpduError"); // Create the instance - return new COTPPacketTpduErrorBuilderImpl(destinationReference, rejectCause, cotpLen); + return new COTPPacketTpduErrorBuilderImpl(destinationReference, rejectCause); } public static class COTPPacketTpduErrorBuilderImpl implements COTPPacket.COTPPacketBuilder { private final int destinationReference; private final short rejectCause; - private final Integer cotpLen; - public COTPPacketTpduErrorBuilderImpl( - int destinationReference, short rejectCause, Integer cotpLen) { + public COTPPacketTpduErrorBuilderImpl(int destinationReference, short rejectCause) { this.destinationReference = destinationReference; this.rejectCause = rejectCause; - this.cotpLen = cotpLen; } - public COTPPacketTpduError build( - List parameters, S7Message payload, Integer cotpLen) { + public COTPPacketTpduError build(List parameters, S7Message payload) { COTPPacketTpduError cOTPPacketTpduError = - new COTPPacketTpduError(parameters, payload, destinationReference, rejectCause, cotpLen); + new COTPPacketTpduError(parameters, payload, destinationReference, rejectCause); return cOTPPacketTpduError; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java index 7f96389bf1e..76a3a88e1ed 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java @@ -40,12 +40,8 @@ public abstract class COTPParameter implements Message { // Abstract accessors for discriminator values. public abstract Short getParameterType(); - // Arguments. - protected final Short rest; - - public COTPParameter(Short rest) { + public COTPParameter() { super(); - this.rest = rest; } protected abstract void serializeCOTPParameterChild(WriteBuffer writeBuffer) @@ -151,13 +147,12 @@ public static COTPParameter staticParse(ReadBuffer readBuffer, Short rest) throw readBuffer.closeContext("COTPParameter"); // Create the instance - COTPParameter _cOTPParameter = builder.build(rest); - + COTPParameter _cOTPParameter = builder.build(); return _cOTPParameter; } public interface COTPParameterBuilder { - COTPParameter build(Short rest); + COTPParameter build(); } @Override diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java index 66fb19d4804..2a9f41aa980 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java @@ -45,13 +45,9 @@ public Short getParameterType() { // Properties. protected final int tsapId; - // Arguments. - protected final Short rest; - - public COTPParameterCalledTsap(int tsapId, Short rest) { - super(rest); + public COTPParameterCalledTsap(int tsapId) { + super(); this.tsapId = tsapId; - this.rest = rest; } public int getTsapId() { @@ -101,22 +97,19 @@ public static COTPParameterBuilder staticParseCOTPParameterBuilder( readBuffer.closeContext("COTPParameterCalledTsap"); // Create the instance - return new COTPParameterCalledTsapBuilderImpl(tsapId, rest); + return new COTPParameterCalledTsapBuilderImpl(tsapId); } public static class COTPParameterCalledTsapBuilderImpl implements COTPParameter.COTPParameterBuilder { private final int tsapId; - private final Short rest; - public COTPParameterCalledTsapBuilderImpl(int tsapId, Short rest) { + public COTPParameterCalledTsapBuilderImpl(int tsapId) { this.tsapId = tsapId; - this.rest = rest; } - public COTPParameterCalledTsap build(Short rest) { - - COTPParameterCalledTsap cOTPParameterCalledTsap = new COTPParameterCalledTsap(tsapId, rest); + public COTPParameterCalledTsap build() { + COTPParameterCalledTsap cOTPParameterCalledTsap = new COTPParameterCalledTsap(tsapId); return cOTPParameterCalledTsap; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java index f44af131695..bcbaf504572 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java @@ -45,13 +45,9 @@ public Short getParameterType() { // Properties. protected final int tsapId; - // Arguments. - protected final Short rest; - - public COTPParameterCallingTsap(int tsapId, Short rest) { - super(rest); + public COTPParameterCallingTsap(int tsapId) { + super(); this.tsapId = tsapId; - this.rest = rest; } public int getTsapId() { @@ -101,23 +97,19 @@ public static COTPParameterBuilder staticParseCOTPParameterBuilder( readBuffer.closeContext("COTPParameterCallingTsap"); // Create the instance - return new COTPParameterCallingTsapBuilderImpl(tsapId, rest); + return new COTPParameterCallingTsapBuilderImpl(tsapId); } public static class COTPParameterCallingTsapBuilderImpl implements COTPParameter.COTPParameterBuilder { private final int tsapId; - private final Short rest; - public COTPParameterCallingTsapBuilderImpl(int tsapId, Short rest) { + public COTPParameterCallingTsapBuilderImpl(int tsapId) { this.tsapId = tsapId; - this.rest = rest; } - public COTPParameterCallingTsap build(Short rest) { - - COTPParameterCallingTsap cOTPParameterCallingTsap = - new COTPParameterCallingTsap(tsapId, rest); + public COTPParameterCallingTsap build() { + COTPParameterCallingTsap cOTPParameterCallingTsap = new COTPParameterCallingTsap(tsapId); return cOTPParameterCallingTsap; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java index c94215b454b..23e0ceff571 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java @@ -45,13 +45,9 @@ public Short getParameterType() { // Properties. protected final short crc; - // Arguments. - protected final Short rest; - - public COTPParameterChecksum(short crc, Short rest) { - super(rest); + public COTPParameterChecksum(short crc) { + super(); this.crc = crc; - this.rest = rest; } public short getCrc() { @@ -101,22 +97,19 @@ public static COTPParameterBuilder staticParseCOTPParameterBuilder( readBuffer.closeContext("COTPParameterChecksum"); // Create the instance - return new COTPParameterChecksumBuilderImpl(crc, rest); + return new COTPParameterChecksumBuilderImpl(crc); } public static class COTPParameterChecksumBuilderImpl implements COTPParameter.COTPParameterBuilder { private final short crc; - private final Short rest; - public COTPParameterChecksumBuilderImpl(short crc, Short rest) { + public COTPParameterChecksumBuilderImpl(short crc) { this.crc = crc; - this.rest = rest; } - public COTPParameterChecksum build(Short rest) { - - COTPParameterChecksum cOTPParameterChecksum = new COTPParameterChecksum(crc, rest); + public COTPParameterChecksum build() { + COTPParameterChecksum cOTPParameterChecksum = new COTPParameterChecksum(crc); return cOTPParameterChecksum; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java index c1c12ad6b77..b4a61e87748 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java @@ -45,13 +45,9 @@ public Short getParameterType() { // Properties. protected final byte[] data; - // Arguments. - protected final Short rest; - - public COTPParameterDisconnectAdditionalInformation(byte[] data, Short rest) { - super(rest); + public COTPParameterDisconnectAdditionalInformation(byte[] data) { + super(); this.data = data; - this.rest = rest; } public byte[] getData() { @@ -103,23 +99,20 @@ public static COTPParameterBuilder staticParseCOTPParameterBuilder( readBuffer.closeContext("COTPParameterDisconnectAdditionalInformation"); // Create the instance - return new COTPParameterDisconnectAdditionalInformationBuilderImpl(data, rest); + return new COTPParameterDisconnectAdditionalInformationBuilderImpl(data); } public static class COTPParameterDisconnectAdditionalInformationBuilderImpl implements COTPParameter.COTPParameterBuilder { private final byte[] data; - private final Short rest; - public COTPParameterDisconnectAdditionalInformationBuilderImpl(byte[] data, Short rest) { + public COTPParameterDisconnectAdditionalInformationBuilderImpl(byte[] data) { this.data = data; - this.rest = rest; } - public COTPParameterDisconnectAdditionalInformation build(Short rest) { - + public COTPParameterDisconnectAdditionalInformation build() { COTPParameterDisconnectAdditionalInformation cOTPParameterDisconnectAdditionalInformation = - new COTPParameterDisconnectAdditionalInformation(data, rest); + new COTPParameterDisconnectAdditionalInformation(data); return cOTPParameterDisconnectAdditionalInformation; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java index 84c3316873d..4cb45b96b85 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java @@ -45,13 +45,9 @@ public Short getParameterType() { // Properties. protected final COTPTpduSize tpduSize; - // Arguments. - protected final Short rest; - - public COTPParameterTpduSize(COTPTpduSize tpduSize, Short rest) { - super(rest); + public COTPParameterTpduSize(COTPTpduSize tpduSize) { + super(); this.tpduSize = tpduSize; - this.rest = rest; } public COTPTpduSize getTpduSize() { @@ -111,22 +107,19 @@ public static COTPParameterBuilder staticParseCOTPParameterBuilder( readBuffer.closeContext("COTPParameterTpduSize"); // Create the instance - return new COTPParameterTpduSizeBuilderImpl(tpduSize, rest); + return new COTPParameterTpduSizeBuilderImpl(tpduSize); } public static class COTPParameterTpduSizeBuilderImpl implements COTPParameter.COTPParameterBuilder { private final COTPTpduSize tpduSize; - private final Short rest; - public COTPParameterTpduSizeBuilderImpl(COTPTpduSize tpduSize, Short rest) { + public COTPParameterTpduSizeBuilderImpl(COTPTpduSize tpduSize) { this.tpduSize = tpduSize; - this.rest = rest; } - public COTPParameterTpduSize build(Short rest) { - - COTPParameterTpduSize cOTPParameterTpduSize = new COTPParameterTpduSize(tpduSize, rest); + public COTPParameterTpduSize build() { + COTPParameterTpduSize cOTPParameterTpduSize = new COTPParameterTpduSize(tpduSize); return cOTPParameterTpduSize; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java index 59be8930bcb..5fc9b8f1115 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java @@ -50,9 +50,6 @@ public Short getAddressType() { protected final int byteAddress; protected final byte bitAddress; - // Reserved Fields - private Short reservedField0; - public S7AddressAny( TransportSize transportSize, int numberOfElements, @@ -123,10 +120,7 @@ protected void serializeS7AddressChild(WriteBuffer writeBuffer) throws Serializa MemoryArea::getValue, MemoryArea::name, writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 5)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 5)); // Simple Field (byteAddress) writeSimpleField("byteAddress", byteAddress, writeUnsignedInt(writeBuffer, 16)); @@ -207,7 +201,7 @@ public static S7AddressBuilder staticParseS7AddressBuilder(ReadBuffer readBuffer readBuffer.closeContext("S7AddressAny"); // Create the instance return new S7AddressAnyBuilderImpl( - transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress, reservedField0); + transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress); } public static class S7AddressAnyBuilderImpl implements S7Address.S7AddressBuilder { @@ -217,7 +211,6 @@ public static class S7AddressAnyBuilderImpl implements S7Address.S7AddressBuilde private final MemoryArea area; private final int byteAddress; private final byte bitAddress; - private final Short reservedField0; public S7AddressAnyBuilderImpl( TransportSize transportSize, @@ -225,22 +218,19 @@ public S7AddressAnyBuilderImpl( int dbNumber, MemoryArea area, int byteAddress, - byte bitAddress, - Short reservedField0) { + byte bitAddress) { this.transportSize = transportSize; this.numberOfElements = numberOfElements; this.dbNumber = dbNumber; this.area = area; this.byteAddress = byteAddress; this.bitAddress = bitAddress; - this.reservedField0 = reservedField0; } public S7AddressAny build() { S7AddressAny s7AddressAny = new S7AddressAny( transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress); - s7AddressAny.reservedField0 = reservedField0; return s7AddressAny; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java index 961efb9eeb4..4fc347ccb6f 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java @@ -48,9 +48,6 @@ public abstract class S7Message implements Message { protected final S7Parameter parameter; protected final S7Payload payload; - // Reserved Fields - private Integer reservedField0; - public S7Message(int tpduReference, S7Parameter parameter, S7Payload payload) { super(); this.tpduReference = tpduReference; @@ -90,10 +87,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { writeDiscriminatorField("messageType", getMessageType(), writeUnsignedShort(writeBuffer, 8)); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (int) 0x0000, - writeUnsignedInt(writeBuffer, 16)); + writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16)); // Simple Field (tpduReference) writeSimpleField("tpduReference", tpduReference, writeUnsignedInt(writeBuffer, 16)); @@ -113,18 +107,10 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { serializeS7MessageChild(writeBuffer); // Optional Field (parameter) (Can be skipped, if the value is null) - writeOptionalField( - "parameter", - parameter, - new DataWriterComplexDefault<>(writeBuffer), - ((((getParameter()) != (null)) ? getParameter().getLengthInBytes() : 0)) > (0)); + writeOptionalField("parameter", parameter, new DataWriterComplexDefault<>(writeBuffer)); // Optional Field (payload) (Can be skipped, if the value is null) - writeOptionalField( - "payload", - payload, - new DataWriterComplexDefault<>(writeBuffer), - ((((getPayload()) != (null)) ? getPayload().getLengthInBytes() : 0)) > (0)); + writeOptionalField("payload", payload, new DataWriterComplexDefault<>(writeBuffer)); writeBuffer.popContext("S7Message"); } @@ -239,7 +225,6 @@ public static S7Message staticParse(ReadBuffer readBuffer) throws ParseException readBuffer.closeContext("S7Message"); // Create the instance S7Message _s7Message = builder.build(tpduReference, parameter, payload); - _s7Message.reservedField0 = reservedField0; return _s7Message; } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java index 4430acdba39..4c85600d34a 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java @@ -51,10 +51,6 @@ public Byte getCpuFunctionType() { protected final QueryType queryType; protected final AlarmType alarmType; - // Reserved Fields - private Short reservedField0; - private Short reservedField1; - public S7MessageObjectRequest(SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) { super(); this.syntaxId = syntaxId; @@ -105,10 +101,7 @@ protected void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer) SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); // Simple Field (queryType) writeSimpleEnumField( @@ -119,10 +112,7 @@ protected void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer) QueryType::getValue, QueryType::name, writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField1 != null ? reservedField1 : (short) 0x34, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x34, writeUnsignedShort(writeBuffer, 8)); // Simple Field (alarmType) writeSimpleEnumField( @@ -212,8 +202,7 @@ public static S7DataAlarmMessageBuilder staticParseS7DataAlarmMessageBuilder( readBuffer.closeContext("S7MessageObjectRequest"); // Create the instance - return new S7MessageObjectRequestBuilderImpl( - syntaxId, queryType, alarmType, reservedField0, reservedField1); + return new S7MessageObjectRequestBuilderImpl(syntaxId, queryType, alarmType); } public static class S7MessageObjectRequestBuilderImpl @@ -221,27 +210,17 @@ public static class S7MessageObjectRequestBuilderImpl private final SyntaxIdType syntaxId; private final QueryType queryType; private final AlarmType alarmType; - private final Short reservedField0; - private final Short reservedField1; public S7MessageObjectRequestBuilderImpl( - SyntaxIdType syntaxId, - QueryType queryType, - AlarmType alarmType, - Short reservedField0, - Short reservedField1) { + SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) { this.syntaxId = syntaxId; this.queryType = queryType; this.alarmType = alarmType; - this.reservedField0 = reservedField0; - this.reservedField1 = reservedField1; } public S7MessageObjectRequest build() { S7MessageObjectRequest s7MessageObjectRequest = new S7MessageObjectRequest(syntaxId, queryType, alarmType); - s7MessageObjectRequest.reservedField0 = reservedField0; - s7MessageObjectRequest.reservedField1 = reservedField1; return s7MessageObjectRequest; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java index bac089b802b..36bf1cea705 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java @@ -46,9 +46,6 @@ public Byte getCpuFunctionType() { protected final DataTransportErrorCode returnCode; protected final DataTransportSize transportSize; - // Reserved Fields - private Short reservedField0; - public S7MessageObjectResponse( DataTransportErrorCode returnCode, DataTransportSize transportSize) { super(); @@ -93,10 +90,7 @@ protected void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer) writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7MessageObjectResponse"); } @@ -151,26 +145,23 @@ public static S7DataAlarmMessageBuilder staticParseS7DataAlarmMessageBuilder( readBuffer.closeContext("S7MessageObjectResponse"); // Create the instance - return new S7MessageObjectResponseBuilderImpl(returnCode, transportSize, reservedField0); + return new S7MessageObjectResponseBuilderImpl(returnCode, transportSize); } public static class S7MessageObjectResponseBuilderImpl implements S7DataAlarmMessage.S7DataAlarmMessageBuilder { private final DataTransportErrorCode returnCode; private final DataTransportSize transportSize; - private final Short reservedField0; public S7MessageObjectResponseBuilderImpl( - DataTransportErrorCode returnCode, DataTransportSize transportSize, Short reservedField0) { + DataTransportErrorCode returnCode, DataTransportSize transportSize) { this.returnCode = returnCode; this.transportSize = transportSize; - this.reservedField0 = reservedField0; } public S7MessageObjectResponse build() { S7MessageObjectResponse s7MessageObjectResponse = new S7MessageObjectResponse(returnCode, transportSize); - s7MessageObjectResponse.reservedField0 = reservedField0; return s7MessageObjectResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java index 8187bbedaca..b65cb58a2e0 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java @@ -53,9 +53,6 @@ public Short getMessageType() { protected final short currentMode; protected final short sequenceNumber; - // Reserved Fields - private Integer reservedField0; - public S7ParameterModeTransition( short method, byte cpuFunctionType, @@ -98,10 +95,7 @@ protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("S7ParameterModeTransition"); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (int) 0x0010, - writeUnsignedInt(writeBuffer, 16)); + writeReservedField("reserved", (int) 0x0010, writeUnsignedInt(writeBuffer, 16)); // Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly // given by the objects content) @@ -187,7 +181,7 @@ public static S7ParameterBuilder staticParseS7ParameterBuilder( readBuffer.closeContext("S7ParameterModeTransition"); // Create the instance return new S7ParameterModeTransitionBuilderImpl( - method, cpuFunctionType, cpuFunctionGroup, currentMode, sequenceNumber, reservedField0); + method, cpuFunctionType, cpuFunctionGroup, currentMode, sequenceNumber); } public static class S7ParameterModeTransitionBuilderImpl @@ -197,28 +191,24 @@ public static class S7ParameterModeTransitionBuilderImpl private final byte cpuFunctionGroup; private final short currentMode; private final short sequenceNumber; - private final Integer reservedField0; public S7ParameterModeTransitionBuilderImpl( short method, byte cpuFunctionType, byte cpuFunctionGroup, short currentMode, - short sequenceNumber, - Integer reservedField0) { + short sequenceNumber) { this.method = method; this.cpuFunctionType = cpuFunctionType; this.cpuFunctionGroup = cpuFunctionGroup; this.currentMode = currentMode; this.sequenceNumber = sequenceNumber; - this.reservedField0 = reservedField0; } public S7ParameterModeTransition build() { S7ParameterModeTransition s7ParameterModeTransition = new S7ParameterModeTransition( method, cpuFunctionType, cpuFunctionGroup, currentMode, sequenceNumber); - s7ParameterModeTransition.reservedField0 = reservedField0; return s7ParameterModeTransition; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java index 5c72b977ba5..4e12e06c3db 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java @@ -51,9 +51,6 @@ public Short getMessageType() { protected final int maxAmqCallee; protected final int pduLength; - // Reserved Fields - private Short reservedField0; - public S7ParameterSetupCommunication(int maxAmqCaller, int maxAmqCallee, int pduLength) { super(); this.maxAmqCaller = maxAmqCaller; @@ -81,10 +78,7 @@ protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws Seriali writeBuffer.pushContext("S7ParameterSetupCommunication"); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); // Simple Field (maxAmqCaller) writeSimpleField("maxAmqCaller", maxAmqCaller, writeUnsignedInt(writeBuffer, 16)); @@ -143,8 +137,7 @@ public static S7ParameterBuilder staticParseS7ParameterBuilder( readBuffer.closeContext("S7ParameterSetupCommunication"); // Create the instance - return new S7ParameterSetupCommunicationBuilderImpl( - maxAmqCaller, maxAmqCallee, pduLength, reservedField0); + return new S7ParameterSetupCommunicationBuilderImpl(maxAmqCaller, maxAmqCallee, pduLength); } public static class S7ParameterSetupCommunicationBuilderImpl @@ -152,20 +145,17 @@ public static class S7ParameterSetupCommunicationBuilderImpl private final int maxAmqCaller; private final int maxAmqCallee; private final int pduLength; - private final Short reservedField0; public S7ParameterSetupCommunicationBuilderImpl( - int maxAmqCaller, int maxAmqCallee, int pduLength, Short reservedField0) { + int maxAmqCaller, int maxAmqCallee, int pduLength) { this.maxAmqCaller = maxAmqCaller; this.maxAmqCallee = maxAmqCallee; this.pduLength = pduLength; - this.reservedField0 = reservedField0; } public S7ParameterSetupCommunication build() { S7ParameterSetupCommunication s7ParameterSetupCommunication = new S7ParameterSetupCommunication(maxAmqCaller, maxAmqCallee, pduLength); - s7ParameterSetupCommunication.reservedField0 = reservedField0; return s7ParameterSetupCommunication; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java index 521b749e9db..f86c2cde641 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java @@ -135,21 +135,13 @@ protected void serializeS7ParameterUserDataItemChild(WriteBuffer writeBuffer) // Optional Field (dataUnitReferenceNumber) (Can be skipped, if the value is null) writeOptionalField( - "dataUnitReferenceNumber", - dataUnitReferenceNumber, - writeUnsignedShort(writeBuffer, 8), - (getCpuFunctionType()) == (8)); + "dataUnitReferenceNumber", dataUnitReferenceNumber, writeUnsignedShort(writeBuffer, 8)); // Optional Field (lastDataUnit) (Can be skipped, if the value is null) - writeOptionalField( - "lastDataUnit", - lastDataUnit, - writeUnsignedShort(writeBuffer, 8), - (getCpuFunctionType()) == (8)); + writeOptionalField("lastDataUnit", lastDataUnit, writeUnsignedShort(writeBuffer, 8)); // Optional Field (errorCode) (Can be skipped, if the value is null) - writeOptionalField( - "errorCode", errorCode, writeUnsignedInt(writeBuffer, 16), (getCpuFunctionType()) == (8)); + writeOptionalField("errorCode", errorCode, writeUnsignedInt(writeBuffer, 16)); writeBuffer.popContext("S7ParameterUserDataItemCPUFunctions"); } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java index a0e3499b769..8f9b7d1f2a3 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java @@ -42,12 +42,8 @@ public abstract class S7Payload implements Message { public abstract Short getParameterParameterType(); - // Arguments. - protected final S7Parameter parameter; - - public S7Payload(S7Parameter parameter) { + public S7Payload() { super(); - this.parameter = parameter; } protected abstract void serializeS7PayloadChild(WriteBuffer writeBuffer) @@ -148,13 +144,12 @@ public static S7Payload staticParse( readBuffer.closeContext("S7Payload"); // Create the instance - S7Payload _s7Payload = builder.build(parameter); - + S7Payload _s7Payload = builder.build(); return _s7Payload; } public interface S7PayloadBuilder { - S7Payload build(S7Parameter parameter); + S7Payload build(); } @Override diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java index ef4cd20f3c4..ced89add35d 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java @@ -49,13 +49,9 @@ public Short getMessageType() { // Properties. protected final List items; - // Arguments. - protected final S7Parameter parameter; - - public S7PayloadReadVarResponse(List items, S7Parameter parameter) { - super(parameter); + public S7PayloadReadVarResponse(List items) { + super(); this.items = items; - this.parameter = parameter; } public List getItems() { @@ -115,23 +111,18 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readBuffer.closeContext("S7PayloadReadVarResponse"); // Create the instance - return new S7PayloadReadVarResponseBuilderImpl(items, parameter); + return new S7PayloadReadVarResponseBuilderImpl(items); } public static class S7PayloadReadVarResponseBuilderImpl implements S7Payload.S7PayloadBuilder { private final List items; - private final S7Parameter parameter; - public S7PayloadReadVarResponseBuilderImpl( - List items, S7Parameter parameter) { + public S7PayloadReadVarResponseBuilderImpl(List items) { this.items = items; - this.parameter = parameter; } - public S7PayloadReadVarResponse build(S7Parameter parameter) { - - S7PayloadReadVarResponse s7PayloadReadVarResponse = - new S7PayloadReadVarResponse(items, parameter); + public S7PayloadReadVarResponse build() { + S7PayloadReadVarResponse s7PayloadReadVarResponse = new S7PayloadReadVarResponse(items); return s7PayloadReadVarResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java index 05f5c995ad3..ec92892504d 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java @@ -49,13 +49,9 @@ public Short getMessageType() { // Properties. protected final List items; - // Arguments. - protected final S7Parameter parameter; - - public S7PayloadUserData(List items, S7Parameter parameter) { - super(parameter); + public S7PayloadUserData(List items) { + super(); this.items = items; - this.parameter = parameter; } public List getItems() { @@ -128,21 +124,18 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readBuffer.closeContext("S7PayloadUserData"); // Create the instance - return new S7PayloadUserDataBuilderImpl(items, parameter); + return new S7PayloadUserDataBuilderImpl(items); } public static class S7PayloadUserDataBuilderImpl implements S7Payload.S7PayloadBuilder { private final List items; - private final S7Parameter parameter; - public S7PayloadUserDataBuilderImpl(List items, S7Parameter parameter) { + public S7PayloadUserDataBuilderImpl(List items) { this.items = items; - this.parameter = parameter; } - public S7PayloadUserData build(S7Parameter parameter) { - - S7PayloadUserData s7PayloadUserData = new S7PayloadUserData(items, parameter); + public S7PayloadUserData build() { + S7PayloadUserData s7PayloadUserData = new S7PayloadUserData(items); return s7PayloadUserData; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java index d19f1c9cbd3..3e638ac5e11 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java @@ -62,10 +62,6 @@ public Integer getDataLength() { protected final QueryType queryType; protected final AlarmType alarmType; - // Reserved Fields - private Short reservedField0; - private Short reservedField1; - public S7PayloadUserDataItemCpuFunctionAlarmQuery( DataTransportErrorCode returnCode, DataTransportSize transportSize, @@ -135,10 +131,7 @@ protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer) SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); // Simple Field (queryType) writeSimpleEnumField( @@ -149,10 +142,7 @@ protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer) QueryType::getValue, QueryType::name, writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField1 != null ? reservedField1 : (short) 0x34, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x34, writeUnsignedShort(writeBuffer, 8)); // Simple Field (alarmType) writeSimpleEnumField( @@ -266,7 +256,7 @@ public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuild readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmQuery"); // Create the instance return new S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl( - syntaxId, queryType, alarmType, reservedField0, reservedField1); + syntaxId, queryType, alarmType); } public static class S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl @@ -274,20 +264,12 @@ public static class S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl private final SyntaxIdType syntaxId; private final QueryType queryType; private final AlarmType alarmType; - private final Short reservedField0; - private final Short reservedField1; public S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl( - SyntaxIdType syntaxId, - QueryType queryType, - AlarmType alarmType, - Short reservedField0, - Short reservedField1) { + SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) { this.syntaxId = syntaxId; this.queryType = queryType; this.alarmType = alarmType; - this.reservedField0 = reservedField0; - this.reservedField1 = reservedField1; } public S7PayloadUserDataItemCpuFunctionAlarmQuery build( @@ -295,8 +277,6 @@ public S7PayloadUserDataItemCpuFunctionAlarmQuery build( S7PayloadUserDataItemCpuFunctionAlarmQuery s7PayloadUserDataItemCpuFunctionAlarmQuery = new S7PayloadUserDataItemCpuFunctionAlarmQuery( returnCode, transportSize, syntaxId, queryType, alarmType); - s7PayloadUserDataItemCpuFunctionAlarmQuery.reservedField0 = reservedField0; - s7PayloadUserDataItemCpuFunctionAlarmQuery.reservedField1 = reservedField1; return s7PayloadUserDataItemCpuFunctionAlarmQuery; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java index 572a18c7c91..6b1ec43758d 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java @@ -59,9 +59,6 @@ public Integer getDataLength() { protected final DataTransportErrorCode pudicfReturnCode; protected final DataTransportSize pudicftransportSize; - // Reserved Fields - private Short reservedField0; - public S7PayloadUserDataItemCpuFunctionAlarmQueryResponse( DataTransportErrorCode returnCode, DataTransportSize transportSize, @@ -123,10 +120,7 @@ protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer) writeUnsignedShort(writeBuffer, 8))); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse"); } @@ -200,22 +194,18 @@ public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuild readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse"); // Create the instance return new S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl( - pudicfReturnCode, pudicftransportSize, reservedField0); + pudicfReturnCode, pudicftransportSize); } public static class S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder { private final DataTransportErrorCode pudicfReturnCode; private final DataTransportSize pudicftransportSize; - private final Short reservedField0; public S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl( - DataTransportErrorCode pudicfReturnCode, - DataTransportSize pudicftransportSize, - Short reservedField0) { + DataTransportErrorCode pudicfReturnCode, DataTransportSize pudicftransportSize) { this.pudicfReturnCode = pudicfReturnCode; this.pudicftransportSize = pudicftransportSize; - this.reservedField0 = reservedField0; } public S7PayloadUserDataItemCpuFunctionAlarmQueryResponse build( @@ -224,7 +214,6 @@ public S7PayloadUserDataItemCpuFunctionAlarmQueryResponse build( s7PayloadUserDataItemCpuFunctionAlarmQueryResponse = new S7PayloadUserDataItemCpuFunctionAlarmQueryResponse( returnCode, transportSize, pudicfReturnCode, pudicftransportSize); - s7PayloadUserDataItemCpuFunctionAlarmQueryResponse.reservedField0 = reservedField0; return s7PayloadUserDataItemCpuFunctionAlarmQueryResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java index 2ddf9180a76..1ee2f9a6395 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java @@ -57,9 +57,6 @@ public Integer getDataLength() { protected final AlarmStateType Alarmtype; protected final Short Reserve; - // Reserved Fields - private Short reservedField0; - public S7PayloadUserDataItemCpuFunctionMsgSubscription( DataTransportErrorCode returnCode, DataTransportSize transportSize, @@ -102,10 +99,7 @@ protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer) writeSimpleField("Subscription", Subscription, writeUnsignedShort(writeBuffer, 8)); // Reserved Field (reserved) - writeReservedField( - "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, - writeUnsignedShort(writeBuffer, 8)); + writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8)); // Simple Field (magicKey) writeSimpleField("magicKey", magicKey, writeString(writeBuffer, 64)); @@ -120,8 +114,7 @@ protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer) (getSubscription()) >= (128)); // Optional Field (Reserve) (Can be skipped, if the value is null) - writeOptionalField( - "Reserve", Reserve, writeUnsignedShort(writeBuffer, 8), (getSubscription()) >= (128)); + writeOptionalField("Reserve", Reserve, writeUnsignedShort(writeBuffer, 8)); writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscription"); } @@ -187,7 +180,7 @@ public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuild readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscription"); // Create the instance return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl( - Subscription, magicKey, Alarmtype, Reserve, reservedField0); + Subscription, magicKey, Alarmtype, Reserve); } public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl @@ -196,19 +189,13 @@ public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl private final String magicKey; private final AlarmStateType Alarmtype; private final Short Reserve; - private final Short reservedField0; public S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl( - short Subscription, - String magicKey, - AlarmStateType Alarmtype, - Short Reserve, - Short reservedField0) { + short Subscription, String magicKey, AlarmStateType Alarmtype, Short Reserve) { this.Subscription = Subscription; this.magicKey = magicKey; this.Alarmtype = Alarmtype; this.Reserve = Reserve; - this.reservedField0 = reservedField0; } public S7PayloadUserDataItemCpuFunctionMsgSubscription build( @@ -217,7 +204,6 @@ public S7PayloadUserDataItemCpuFunctionMsgSubscription build( s7PayloadUserDataItemCpuFunctionMsgSubscription = new S7PayloadUserDataItemCpuFunctionMsgSubscription( returnCode, transportSize, Subscription, magicKey, Alarmtype, Reserve); - s7PayloadUserDataItemCpuFunctionMsgSubscription.reservedField0 = reservedField0; return s7PayloadUserDataItemCpuFunctionMsgSubscription; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java index d9afe7ea7c1..48d4a5a334e 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java @@ -49,13 +49,9 @@ public Short getMessageType() { // Properties. protected final List items; - // Arguments. - protected final S7Parameter parameter; - - public S7PayloadWriteVarRequest(List items, S7Parameter parameter) { - super(parameter); + public S7PayloadWriteVarRequest(List items) { + super(); this.items = items; - this.parameter = parameter; } public List getItems() { @@ -115,23 +111,18 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readBuffer.closeContext("S7PayloadWriteVarRequest"); // Create the instance - return new S7PayloadWriteVarRequestBuilderImpl(items, parameter); + return new S7PayloadWriteVarRequestBuilderImpl(items); } public static class S7PayloadWriteVarRequestBuilderImpl implements S7Payload.S7PayloadBuilder { private final List items; - private final S7Parameter parameter; - public S7PayloadWriteVarRequestBuilderImpl( - List items, S7Parameter parameter) { + public S7PayloadWriteVarRequestBuilderImpl(List items) { this.items = items; - this.parameter = parameter; } - public S7PayloadWriteVarRequest build(S7Parameter parameter) { - - S7PayloadWriteVarRequest s7PayloadWriteVarRequest = - new S7PayloadWriteVarRequest(items, parameter); + public S7PayloadWriteVarRequest build() { + S7PayloadWriteVarRequest s7PayloadWriteVarRequest = new S7PayloadWriteVarRequest(items); return s7PayloadWriteVarRequest; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java index 32fd6f1b51d..1f6e13cea17 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java @@ -49,13 +49,9 @@ public Short getMessageType() { // Properties. protected final List items; - // Arguments. - protected final S7Parameter parameter; - - public S7PayloadWriteVarResponse(List items, S7Parameter parameter) { - super(parameter); + public S7PayloadWriteVarResponse(List items) { + super(); this.items = items; - this.parameter = parameter; } public List getItems() { @@ -115,23 +111,18 @@ public static S7PayloadBuilder staticParseS7PayloadBuilder( readBuffer.closeContext("S7PayloadWriteVarResponse"); // Create the instance - return new S7PayloadWriteVarResponseBuilderImpl(items, parameter); + return new S7PayloadWriteVarResponseBuilderImpl(items); } public static class S7PayloadWriteVarResponseBuilderImpl implements S7Payload.S7PayloadBuilder { private final List items; - private final S7Parameter parameter; - public S7PayloadWriteVarResponseBuilderImpl( - List items, S7Parameter parameter) { + public S7PayloadWriteVarResponseBuilderImpl(List items) { this.items = items; - this.parameter = parameter; } - public S7PayloadWriteVarResponse build(S7Parameter parameter) { - - S7PayloadWriteVarResponse s7PayloadWriteVarResponse = - new S7PayloadWriteVarResponse(items, parameter); + public S7PayloadWriteVarResponse build() { + S7PayloadWriteVarResponse s7PayloadWriteVarResponse = new S7PayloadWriteVarResponse(items); return s7PayloadWriteVarResponse; } } diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java index 8115570eedc..10351a8a735 100644 --- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java +++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java @@ -43,9 +43,6 @@ public class TPKTPacket implements Message { // Properties. protected final COTPPacket payload; - // Reserved Fields - private Short reservedField0; - public TPKTPacket(COTPPacket payload) { super(); this.payload = payload; @@ -75,7 +72,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException { // Reserved Field (reserved) writeReservedField( "reserved", - reservedField0 != null ? reservedField0 : (short) 0x00, + (short) 0x00, writeUnsignedShort(writeBuffer, 8), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN)); @@ -166,7 +163,6 @@ public static TPKTPacket staticParse(ReadBuffer readBuffer) throws ParseExceptio // Create the instance TPKTPacket _tPKTPacket; _tPKTPacket = new TPKTPacket(payload); - _tPKTPacket.reservedField0 = reservedField0; return _tPKTPacket; } diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java index f5767654cf5..13035eaa8b6 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java @@ -41,11 +41,11 @@ public class S7Optimizer extends BaseOptimizer { public static final int EMPTY_READ_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterReadVarRequest( Collections.emptyList()), null).getLengthInBytes(); public static final int EMPTY_READ_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterReadVarResponse( - (short) 0), new S7PayloadReadVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes(); + (short) 0), new S7PayloadReadVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes(); public static final int EMPTY_WRITE_REQUEST_SIZE = new S7MessageRequest(0, new S7ParameterWriteVarRequest( - Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList(), null)).getLengthInBytes(); + Collections.emptyList()), new S7PayloadWriteVarRequest(Collections.emptyList())).getLengthInBytes(); public static final int EMPTY_WRITE_RESPONSE_SIZE = new S7MessageResponseData(0, new S7ParameterWriteVarResponse( - (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList(), null), (short) 0, (short) 0).getLengthInBytes(); + (short) 0), new S7PayloadWriteVarResponse(Collections.emptyList()), (short) 0, (short) 0).getLengthInBytes(); public static final int S7_ADDRESS_ANY_SIZE = 2 + new S7AddressAny(TransportSize.INT, 1, 1, MemoryArea.DATA_BLOCKS, 1, (byte) 0).getLengthInBytes(); diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java index b8b3a47e358..4c41a61cd19 100644 --- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java +++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java @@ -84,7 +84,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase implements HasConfiguration { private final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class); - private final AtomicInteger tpduGenerator = new AtomicInteger(1); + private final AtomicInteger tpduGenerator = new AtomicInteger(0); private S7Configuration configuration; /* @@ -263,16 +263,7 @@ private CompletableFuture toPlcReadResponse(PlcReadRequest read */ private CompletableFuture readInternal(S7MessageRequest request) { CompletableFuture future = new CompletableFuture<>(); - int thisTpduId = 0; - if (this.s7DriverContext.getControllerType() != S7ControllerType.S7_200) - { - thisTpduId = tpduGenerator.getAndIncrement(); - } - final int tpduId = thisTpduId; - // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 - if(tpduGenerator.get() == 0xFFFF) { - tpduGenerator.set(0); - } + int tpduId = getTpduId(); // Create a new Request with correct tpuId (is not known before) S7MessageRequest s7MessageRequest = new S7MessageRequest(tpduId, request.getParameter(), request.getPayload()); @@ -324,13 +315,7 @@ public CompletableFuture write(PlcWriteRequest writeRequest) { // // } - - - final int tpduId = tpduGenerator.getAndIncrement(); - // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 - if (tpduGenerator.get() == 0xFFFF) { - tpduGenerator.set(1); - } + int tpduId = getTpduId(); TPKTPacket tpktPacket = new TPKTPacket( new COTPPacketData( @@ -404,11 +389,8 @@ public CompletableFuture subscribe(PlcSubscriptionReque //parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag))); //payloadItems.add(serializePlcValue(tag, plcValue)); } - final int tpduId = tpduGenerator.getAndIncrement(); - // If we've reached the max value for a 16 bit transaction identifier, reset back to 1 - if (tpduGenerator.get() == 0xFFFF) { - tpduGenerator.set(1); - } + + int tpduId = getTpduId(); TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, new S7MessageUserData(tpduId, @@ -709,7 +691,7 @@ private void extractControllerTypeAndFireConnected(ConversationContext org.slf4j:slf4j-simple - org.bouncycastle:bcmail-jdk15on + org.bouncycastle:bcmail-jdk18on org.apache.plc4x:plc4j-driver-ab-eth org.apache.plc4x:plc4j-driver-ads org.apache.plc4x:plc4j-driver-canopen diff --git a/plc4j/pom.xml b/plc4j/pom.xml index 4af3e39966b..732394adb1a 100644 --- a/plc4j/pom.xml +++ b/plc4j/pom.xml @@ -224,7 +224,7 @@ We have to slightly increase the heap-size or some tests will fail. Notice the @ instead of the $ as prefix? That's late evaluation. --> - -Xmx256m @{failsafeArgLine} + -Xmx256m **/*IT.java diff --git a/protocols/open-protocol/pom.xml b/protocols/open-protocol/pom.xml index 761a8928ef0..6ba8760a003 100644 --- a/protocols/open-protocol/pom.xml +++ b/protocols/open-protocol/pom.xml @@ -38,12 +38,6 @@ plc4x-code-generation-protocol-base-mspec 0.11.0-SNAPSHOT - - - org.slf4j - slf4j-simple - test - \ No newline at end of file diff --git a/protocols/pom.xml b/protocols/pom.xml index 89125235497..37da46ab99a 100644 --- a/protocols/pom.xml +++ b/protocols/pom.xml @@ -222,6 +222,12 @@ junit-jupiter-api test + + + org.slf4j + slf4j-simple + test + diff --git a/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml b/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml index 8d76a5ce141..97aab67eb6d 100644 --- a/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml +++ b/protocols/s7/src/test/resources/protocols/s7/DriverTestsuite.xml @@ -441,7 +441,7 @@ 240 true - 10 + 2 @@ -450,7 +450,7 @@ 50 1 0 - 10 + 2 14 0 @@ -508,7 +508,7 @@ 240 true - 0 + 2 @@ -517,7 +517,7 @@ 50 3 0 - 10 + 2 2 6 @@ -613,7 +613,7 @@ 240 true - 10 + 2 @@ -622,7 +622,7 @@ 50 1 0 - 10 + 2 14 0 @@ -680,7 +680,7 @@ 240 true - 0 + 2 @@ -689,7 +689,7 @@ 50 2 0 - 10 + 2 0 0