Diff of /branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Device/FB_Device_1/onDCMDMessage/svnobj [r824] .. [r825]  Maximize  Restore

Switch to side-by-side view

--- a/branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Device/FB_Device_1/onDCMDMessage/svnobj
+++ b/branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Device/FB_Device_1/onDCMDMessage/svnobj
@@ -1,277 +1,144 @@
-Gx_lüa!0…jüoÜGž,‹!øc ¦÷System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
-longTagText
.onDCMDMessage := FALSE;&//get first messageXpMessage.GetFirstMetric( name => MetricName,\                         datatype => datatype,f                         timestamp =>, //don't caret                         valueString => MetricValueString,p                         valueLreal => MetricValueLreal,l                         valueReal => MetricValueReal,t                         valueVarInt => MetricValueVarInt,h                         MetricValid => MetricValid,\                         HasNext => HasNext );ĖREPEAT //process the metric and grab the next metric until there are no more metrics (hasnext = FALSE).    IF MetricValid THEN0        CASE datatype OF@            MetricDataType.Int8:x                FOR i := LOWER_BOUND( THIS^.arSparkplugInt8,                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugInt8,€                                                          1 ) DO €                    IF MetricName = arSparkplugInt8[i].Name THEN!–                        arSparkplugInt8[i].Value := MetricValueVarInt.Int8;"4                    END_IF#0                END_FOR;$B            MetricDataType.Int16:%z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt16,&Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt16,'‚                    IF MetricName = arSparkplugInt16[i].Name THEN(š                        arSparkplugInt16[i].Value := MetricValueVarInt.Int16;)Ō                // because cirrus Link MQTT Engine returns the ignition data type not the NBIRTH datatype*z                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt8,+Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt8,,‚                    IF MetricName = arSparkplugUInt8[i].Name THEN-š                        arSparkplugUInt8[i].Value := MetricValueVarInt.UInt8;.B            MetricDataType.Int32:/z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt32,0Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt32,1‚                    IF MetricName = arSparkplugInt32[i].Name THEN2š                        arSparkplugInt32[i].Value := MetricValueVarInt.Int32;3|                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt16,4Ī                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt16,5„                    IF MetricName = arSparkplugUInt16[i].Name THEN6ž                        arSparkplugUInt16[i].Value := MetricValueVarInt.UInt16;7B            MetricDataType.Int64:8z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt64,9Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt64,:‚                    IF MetricName = arSparkplugInt64[i].Name THEN;š                        arSparkplugInt64[i].Value := MetricValueVarInt.Int64;<|                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt32,=Ī                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt32,>„                    IF MetricName = arSparkplugUInt32[i].Name THEN?ž                        arSparkplugUInt32[i].Value := MetricValueVarInt.UInt32;@|                FOR i := LOWER_BOUND( THIS^.arSparkplugUint64,AĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUint64,B„                    IF MetricName = arSparkplugUint64[i].Name THENCž                        arSparkplugUint64[i].Value := MetricValueVarInt.Uint64;DB            MetricDataType.UInt8:ED            MetricDataType.UInt16:FD            MetricDataType.UInt32:GD            MetricDataType.UInt64:HB            MetricDataType.Float:Iz                FOR i := LOWER_BOUND( THIS^.arSparkplugFloat,JĒ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugFloat,K‚                    IF MetricName = arSparkplugFloat[i].Name THENLŠ                        arSparkplugFloat[i].Value := MetricValueReal;MD            MetricDataType.Double:N|                FOR i := LOWER_BOUND( THIS^.arSparkplugDouble,OĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugDouble,P„                    IF MetricName = arSparkplugDouble[i].Name THENQŽ                        arSparkplugDouble[i].Value := MetricValueLreal;RF            MetricDataType.Boolean:Sd                //normal place for normal booleansT~                FOR i := LOWER_BOUND( THIS^.arSparkplugBoolean,UĶ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugBoolean,V†                    IF MetricName = arSparkplugBoolean[i].Name THENWĒ                        arSparkplugBoolean[i].Value := MetricValueVarInt.Boolean;XF            MetricDataType.String_:Y|                FOR i := LOWER_BOUND( THIS^.arSparkplugString,ZĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugString,[„                    IF MetricName = arSparkplugString[i].Name THEN\                        arSparkplugString[i].Value := MetricValueString;]x                FOR i := LOWER_BOUND( THIS^.arSparkplugText,^                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugText,_€                    IF MetricName = arSparkplugText[i].Name THEN`Œ                        arSparkplugText[i].Value := MetricValueString;ax                FOR i := LOWER_BOUND( THIS^.arSparkplugUUID,b                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugUUID,c€                    IF MetricName = arSparkplugUUID[i].Name THENdŒ                        arSparkplugUUID[i].Value := MetricValueString;eH            MetricDataType.DateTime:f€                FOR i := LOWER_BOUND( THIS^.arSparkplugDateTime,gĻ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugDateTime,hˆ                    IF MetricName = arSparkplugDateTime[i].Name THENiŽ                        arSparkplugDateTime[i].Value := MetricValueVarInt.uliDateTime;j@            MetricDataType.Text:k@            MetricDataType.UUID:lĖ            MetricDataType.Unknown, MetricDataType.DataSet, MetricDataType.Bytes, MetricDataType.File,mP                MetricDataType.Template:n†                ; //maybe a log message? in any case, do nothing.  oĘ        //It might be posible that someone sends a DCMD without a datatype but that would be so weirdp        ELSEq            ;r         END_CASEs    END_IFt2    //get the next metricu^    pMessage.GetNextMetric( name => MetricName,vb                            datatype => datatype,wl                            timestamp =>, //don't carexz                            valueString => MetricValueString,yv                            valueLreal => MetricValueLreal,zr                            valueReal => MetricValueReal,{z                            valueVarInt => MetricValueVarInt,|n                            MetricValid => MetricValid,}b                            HasNext => HasNext );~*UNTIL HasNext = FALSEEND_REPEAT;€R//pMessage.GetNextMetric don't care todayD//pMessage.GetSeq don't care today‚P//pMessage.GetTimestamp don't care todayƒvWriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),„\                'EoN DCMD Received Topic: %s',…^                WSTRING_TO_STRING( pTopic^ ) );†,onDCMDMessage := TRUE;‡InterfaceˆL{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}‰///Š4///  Device Command (DCMD)‹
-///  ŒÞ///  DCMD messages are used by backend applications to write to device outputs and send Device Control commands–///  to devices. Multiple metrics can be supplied in a single DCMD message.Žš///  The following is a representation of a simple DCMD message on the topic:€///      spBv1.0/Sparkplug"! B Devices/DCMD/Raspberry Pi/Pibrella†///      "    The  Group ID  of this device is: Sparkplug"! B Devices‘†///      "    The host  EoN node ID  of this device is: Raspberry Pi’R///      "    The  Device ID  is: Pibrella“h///      "    This is an DCMD message from the device”¢///  Consider the following Sparkplug"! B payload in the DCMD message shown above:•///  {–H///      "timestamp": 1486144502122,—,///      "metrics": [{˜\///              "name": "Outputs/LEDs/Green",™X///              "timestamp": 1486144502122,šN///              "dataType": "Boolean",›<///              "value": trueœ///      }, {^///              "name": "Outputs/LEDs/Yellow",ž///      }]Ÿ///  } æ///  The DCMD payload tells the EoN node to write true to the attached device s green and yellow LEDs. As a result,¡ä///  the LEDs should turn on and result in a DDATA message back to the MQTT Server after the LEDs are successfully¢///  turned on.£${attribute 'hide'}¤6METHOD onDCMDMessage : BOOL¥VAR_INPUT¦‚    pTopic : POINTER TO WSTRING(GC_Sparkplug.supported_string_lengths); // resembles the topic under which the message is posted §END_VAR¨VAR_IN_OUT©†    pMessage : FB_PayloadSimpleDecoder; //should already be decodedªVAR«Ž    MetricName        : WSTRING(GC_Sparkplug.supported_string_lengths);¬:    MetricValid       : BOOL;­L    MetricValueVarInt : DecodedVarInt;®@    MetricValueString : WSTRING;¯<    MetricValueLreal  : LREAL;°:    MetricValueReal   : REAL;±:    HasNext           : BOOL;²N    datatype          : MetricDataType;³:    i                 : DINT;ÐÐÐEÜÐÐ	
-­ñÚÐ-
ÐÐ	
-­òÚÐ-ÐÐ	
-­óÚÐ-ÐÐ	
-­ôÚÐ-ÐÐ	
-­õÚÐ-ÐÐ	
-­öÚÐ-ÐÐ	
-­÷ÚÐ-ÐÐ	
-­øÚÐ-ÐÐ	
-­ùÚÐ-ÐÐ	
-­úÚÐ-ÐÐ	
-­ûÚÐ-ÐÐ	
-­üÚÐ-ÐÐ	
-­ýÚÐ-ÐÐ	
-­þÚÐ-ÐÐ	
-­ÿÚÐ-ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ- ÐÐ	
-­ÚÐ-!ÐÐ	
-­ÚÐ-"ÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-$ÐÐ	
-­	ÚÐ-%ÐÐ	
+Gx_lY5!0…jüoü'÷Çk‘5
¢EÓ}System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
+longTagText
F//note: pMessage is already decoded.onDCMDMessage := FALSE;&//get first messageRpMessage.GetFirstMetric( name => newName,\	                     datatype => newdatatype,B						 timestamp => newtimestamp,@						 valueString => newString,<						 valueLreal => newLreal,8						 valueReal => newreal,@						 valueVarInt => newVarInt,J						 MetricValid => newMetricValid,<						 HasNext => newHasNext);						 ZTHIS^.GetMetricbyName( MetricName:= newName, f                       Metric=> itfExistingMetric, N                       GetTimestamp=> ,f                       xError=> MetricNotExisting, D                       eError=> ); 4IF NOT newMetricValid THEN!j	; // There are no metrics, so we needn't do anything"8ELSIF MetricNotExisting THEN#~    WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),$º                    'Someone sent an DCMD with metric %s not in our DBIRTH.  It was ignored',%R                    TO_STRING(newName) );&ELSE'J	// update one as it allready excists(P    Update( Metric := itfExistingMetric,)8            Name := newName,*H            DataType := newdatatype,+Z            Status := MetricStatus.ONLINE_OK,,L            Timestamp := newtimestamp,-B            String_ := newString,.@            LReal_ :=  newLreal,/:            Real_ := newreal,0F            VarInt :=  newVarInt );1END_IF2&WHILE newHasNext DO3R	pMessage.GetNextMetric( name => newName,4h                            datatype => newdatatype,5l                            timestamp => newtimestamp,6j                            valueString => newString,7f                            valueLreal => newLreal,8b                            valueReal => newreal,9j                            valueVarInt => newVarInt,:t                            MetricValid => newMetricValid,;f                            HasNext => newHasNext);<8                            =^	THIS^.GetMetricbyName( MetricName := newName, >p                           Metric => itfExistingMetric, ?V                           GetTimestamp=> ,@`						   xError=> MetricNotExisting, eError=> );A6                           B4	IF MetricNotExisting THENCz		WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),Dž						'Someone sent an DCMD with metric %s not in our DBIRTH.  It was ignored',E6						TO_STRING(newName) );F
+	ELSEG		//update oneHX        Update( Metric := itfExistingMetric,I@                Name := newName,JP                DataType := newdatatype,Kb                Status := MetricStatus.ONLINE_OK,LT                Timestamp := newtimestamp,MJ                String_ := newString,NH                LReal_ :=  newLreal,OB                Real_ := newreal,PN                VarInt :=  newVarInt );Q                 R	END_IFSEND_WHILETvWriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),U\                'EoN DCMD Received Topic: %s',V^                WSTRING_TO_STRING( pTopic^ ) );W,onDCMDMessage := TRUE;XInterfaceYL{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}Z///[4///  Device Command (DCMD)\
+///  ]Þ///  DCMD messages are used by backend applications to write to device outputs and send Device Control commands^–///  to devices. Multiple metrics can be supplied in a single DCMD message._š///  The following is a representation of a simple DCMD message on the topic:`€///      spBv1.0/Sparkplug"! B Devices/DCMD/Raspberry Pi/Pibrellaa†///      "    The  Group ID  of this device is: Sparkplug"! B Devicesb†///      "    The host  EoN node ID  of this device is: Raspberry PicR///      "    The  Device ID  is: Pibrelladh///      "    This is an DCMD message from the devicee¢///  Consider the following Sparkplug"! B payload in the DCMD message shown above:f///  {gH///      "timestamp": 1486144502122,h,///      "metrics": [{i\///              "name": "Outputs/LEDs/Green",jX///              "timestamp": 1486144502122,kN///              "dataType": "Boolean",l<///              "value": truem///      }, {n^///              "name": "Outputs/LEDs/Yellow",o///      }]p///  }qæ///  The DCMD payload tells the EoN node to write true to the attached device s green and yellow LEDs. As a result,rä///  the LEDs should turn on and result in a DDATA message back to the MQTT Server after the LEDs are successfullys///  turned on.t${attribute 'hide'}u6METHOD onDCMDMessage : BOOLvVAR_INPUTw‚    pTopic : POINTER TO WSTRING(GC_Sparkplug.supported_string_lengths); // resembles the topic under which the message is posted xEND_VARyVAR_IN_OUTz†    pMessage : FB_PayloadSimpleDecoder; //should already be decoded{VAR_OUTPUT| 	xError  : BOOL;}"	eError  : ERROR;~VARŽ    newName           : WSTRING(GC_Sparkplug.supported_string_lengths);€@    newMetricValid       : BOOL;<    newVarInt : DecodedVarInt;‚0    newString : WSTRING;ƒ,    newLreal  : LREAL;„*    newreal   : REAL;…@    newHasNext           : BOOL;†T    newdatatype          : MetricDataType;‡F	newtimestamp         : T_DateTime;ˆ:    i                 : DINT;‰	ŠF	itfExistingMetric : IRemoteMetric;‹4	MetricNotExisting : BOOL;ÐÐÐENÐÐ	
+­ÌÚÐ-
ÐÐ	
+­ñÚÐ-ÐÐ	
+­òÚÐ-ÐÐ	
+­àÚÐ-ÐÐ	
+­áÚÐ-ÐÐ	
+­âÚÐ-ÐÐ	
+­ãÚÐ-ÐÐ	
+­äÚÐ-ÐÐ	
+­åÚÐ-ÐÐ	
+­æÚÐ-ÐÐ	
+­çÚÐ-ÐÐ	
+­ûÚÐ-ÐÐ	
+­ÙÚÐ-ÐÐ	
+­ÛÚÐ-ÐÐ	
+­ÝÚÐ-ÐÐ	
+­ÞÚÐ-ÐÐ	
+­ßÚÐ-ÐÐ	
+­ÚÚÐ-ÐÐ	
+­íÚÐ-ÐÐ	
+­4ÚÐ- ÐÐ	
+­3ÚÐ-!ÐÐ	
+­îÚÐ-"ÐÐ	
+­5ÚÐ-#ÐÐ	
+­6ÚÐ-$ÐÐ	
+­üÚÐ-%ÐÐ	
+­ôÚÐ-&ÐÐ	
+­øÚÐ-'ÐÐ	
+­ùÚÐ-(ÐÐ	
+­úÚÐ-)ÐÐ	
+­ûÚÐ-*ÐÐ	
+­üÚÐ-+ÐÐ	
+­ýÚÐ-,ÐÐ	
+­þÚÐ--ÐÐ	
+­ÿÚÐ-.ÐÐ	
+­ÚÐ-/ÐÐ	
+­öÚÐ-0ÐÐ	
+­÷ÚÐ-1ÐÐ	
+­ÚÐ-ÐÐ	
+­ÚÐ-2ÐÐ	
+­ÚÐ-3ÐÐ	
+­ÚÐ-4ÐÐ	
+­ÚÐ-5ÐÐ	
+­ÚÐ-6ÐÐ	
+­ÚÐ-7ÐÐ	
+­ÚÐ-8ÐÐ	
+­	ÚÐ-9ÐÐ	
 ­
-ÚÐ-&ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-'ÐÐ	

ÚÐ-(ÐÐ	
-­ÚÐ-"ÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-)ÐÐ	
-­ÚÐ-*ÐÐ	
-­ÚÐ-+ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-,ÐÐ	
-­ÚÐ--ÐÐ	
-­ÚÐ-"ÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-.ÐÐ	
-­ÚÐ-/ÐÐ	
-­ÚÐ-0ÐÐ	
-­ÚÐ-ÐÐ	
-­ÚÐ-1ÐÐ	
-­ÚÐ-2ÐÐ	
-­ÚÐ-"ÐÐ	
-­ ÚÐ-#ÐÐ	
-­!ÚÐ-ÐÐ	
-­"ÚÐ-)ÐÐ	
-­#ÚÐ-3ÐÐ	
-­$ÚÐ-4ÐÐ	
-­%ÚÐ-ÐÐ	
-­&ÚÐ-5ÐÐ	
-­'ÚÐ-6ÐÐ	
-­(ÚÐ-"ÐÐ	
-­)ÚÐ-#ÐÐ	
-­*ÚÐ-7ÐÐ	
-­+ÚÐ-8ÐÐ	
-­,ÚÐ-9ÐÐ	
-­-ÚÐ-ÐÐ	
-­.ÚÐ-:ÐÐ	
-­/ÚÐ-;ÐÐ	
-­0ÚÐ-"ÐÐ	
-­1ÚÐ-#ÐÐ	
-­2ÚÐ-ÐÐ	
-­3ÚÐ-)ÐÐ	
-­4ÚÐ-<ÐÐ	
-­5ÚÐ-=ÐÐ	
-­6ÚÐ-ÐÐ	
-­7ÚÐ->ÐÐ	
-­8ÚÐ-?ÐÐ	
-­9ÚÐ-"ÐÐ	
-­:ÚÐ-#ÐÐ	
-­;ÚÐ-ÐÐ	
-­<ÚÐ-)ÐÐ	
-­=ÚÐ-@ÐÐ	
-­>ÚÐ-AÐÐ	
-­?ÚÐ-ÐÐ	
-­@ÚÐ-BÐÐ	
-­AÚÐ-CÐÐ	
-­BÚÐ-"ÐÐ	
-­CÚÐ-#ÐÐ	
-­DÚÐ-DÐÐ	
-­EÚÐ-*ÐÐ	
-­FÚÐ-+ÐÐ	
-­GÚÐ-ÐÐ	
-­HÚÐ-,ÐÐ	
-­IÚÐ--ÐÐ	
-­JÚÐ-"ÐÐ	
-­KÚÐ-#ÐÐ	
-­LÚÐ-EÐÐ	
-­MÚÐ-3ÐÐ	
-­NÚÐ-4ÐÐ	
-­OÚÐ-ÐÐ	
-­PÚÐ-5ÐÐ	
-­QÚÐ-6ÐÐ	
-­RÚÐ-"ÐÐ	
-­SÚÐ-#ÐÐ	
-­TÚÐ-FÐÐ	
-­UÚÐ-<ÐÐ	
-­VÚÐ-=ÐÐ	
-­WÚÐ-ÐÐ	
-­XÚÐ->ÐÐ	
-­YÚÐ-?ÐÐ	
-­ZÚÐ-"ÐÐ	
-­[ÚÐ-#ÐÐ	
-­\ÚÐ-GÐÐ	
-­]ÚÐ-@ÐÐ	
-­^ÚÐ-AÐÐ	
-­_ÚÐ-ÐÐ	
-­`ÚÐ-BÐÐ	
-­aÚÐ-CÐÐ	
-­bÚÐ-"ÐÐ	
-­cÚÐ-#ÐÐ	
-­dÚÐ-HÐÐ	
-­eÚÐ-IÐÐ	
-­fÚÐ-JÐÐ	
-­gÚÐ-ÐÐ	
-­hÚÐ-KÐÐ	
-­iÚÐ-LÐÐ	
-­jÚÐ-"ÐÐ	
-­kÚÐ-#ÐÐ	
-­lÚÐ-MÐÐ	
-­mÚÐ-NÐÐ	
-­nÚÐ-OÐÐ	
-­oÚÐ-ÐÐ	
-­pÚÐ-PÐÐ	
-­qÚÐ-QÐÐ	
-­rÚÐ-"ÐÐ	
-­sÚÐ-#ÐÐ	
-­tÚÐ-RÐÐ	
-­uÚÐ-SÐÐ	
-­vÚÐ-TÐÐ	
-­wÚÐ-UÐÐ	
-­xÚÐ-ÐÐ	
-­yÚÐ-VÐÐ	
-­zÚÐ-WÐÐ	
-­{ÚÐ-"ÐÐ	
-­|ÚÐ-#ÐÐ	
-­}ÚÐ-XÐÐ	
-­~ÚÐ-YÐÐ	
-­ÚÐ-ZÐÐ	
-­€ÚÐ-ÐÐ	
-­ÚÐ-[ÐÐ	
-­‚ÚÐ-\ÐÐ	
-­ƒÚÐ-"ÐÐ	
-­„ÚÐ-#ÐÐ	
-­…ÚÐ-ÐÐ	
-­†ÚÐ-)ÐÐ	
-­‡ÚÐ-]ÐÐ	
-­ˆÚÐ-^ÐÐ	
-­‰ÚÐ-ÐÐ	
-­ŠÚÐ-_ÐÐ	
-­‹ÚÐ-`ÐÐ	
-­ŒÚÐ-"ÐÐ	
-­ÚÐ-#ÐÐ	
-­ŽÚÐ-ÐÐ	
-­ÚÐ-)ÐÐ	
-­ÚÐ-aÐÐ	
-­‘ÚÐ-bÐÐ	
-­’ÚÐ-ÐÐ	
-­“ÚÐ-cÐÐ	
-­”ÚÐ-dÐÐ	
-­•ÚÐ-"ÐÐ	
-­–ÚÐ-#ÐÐ	
-­—ÚÐ-eÐÐ	
-­˜ÚÐ-fÐÐ	
-­™ÚÐ-gÐÐ	
-­šÚÐ-ÐÐ	
-­›ÚÐ-hÐÐ	
-­œÚÐ-iÐÐ	
-­ÚÐ-"ÐÐ	
-­žÚÐ-#ÐÐ	
-­ŸÚÐ-jÐÐ	
-­ ÚÐ-]ÐÐ	
-­¡ÚÐ-^ÐÐ	
-­¢ÚÐ-ÐÐ	
-­£ÚÐ-_ÐÐ	
-­¤ÚÐ-`ÐÐ	
-­¥ÚÐ-"ÐÐ	
-­¦ÚÐ-#ÐÐ	
-­§ÚÐ-kÐÐ	
-­¨ÚÐ-aÐÐ	
-­©ÚÐ-bÐÐ	
-­ªÚÐ-ÐÐ	
-­«ÚÐ-cÐÐ	
-­¬ÚÐ-dÐÐ	
-­­ÚÐ-"ÐÐ	
-­®ÚÐ-#ÐÐ	
-­¯ÚÐ-lÐÐ	
-­°ÚÐ-mÐÐ	
-­±ÚÐ-nÐÐ	
-­²ÚÐ-oÐÐ	
-­³ÚÐ-pÐÐ	
-­´ÚÐ-qÐÐ	
-­µÚÐ-rÐÐ	
-­¶ÚÐ-sÐÐ	
-­·ÚÐ-ÐÐ	
-­¸ÚÐ-tÐÐ	
-­¹ÚÐ-uÐÐ	
-­ºÚÐ-vÐÐ	
-­»ÚÐ-wÐÐ	
-­¼ÚÐ-xÐÐ	
-­½ÚÐ-yÐÐ	
-­¾ÚÐ-zÐÐ	
-­¿ÚÐ-{ÐÐ	
-­ÀÚÐ-|ÐÐ	
-­ÁÚÐ-}ÐÐ	
-­ÂÚÐ-~ÐÐ	
-­ÃÚÐ-ÐÐ	
-­ÄÚÐ-ÐÐ	
-­ÅÚÐ-€ÐÐ	
-­ÆÚÐ-ÐÐ	
-­ÇÚÐ-‚ÐÐ	
-­ÈÚÐ-ƒÐÐ	
-­ÉÚÐ-„ÐÐ	
-­ÊÚÐ-…ÐÐ	
-­ËÚÐ-ÐÐ	
-­ÚÐ-†ЇˆÐE5ÐÐ	
-­½ÚÐ-‰ÐÐ	
-­¾ÚÐ-ŠÐÐ	
-­¿ÚÐ-‹ÐÐ	
-­ÀÚÐ-ŒÐÐ	
-­ÁÚÐ-ÐÐ	
-­ÂÚÐ-ŽÐÐ	
-­ÃÚÐ-‹ÐÐ	
-­ÄÚÐ-ÐÐ	
-­ÅÚÐ-‹ÐÐ	
-­ÆÚÐ-ÐÐ	
-­ÇÚÐ-‘ÐÐ	
-­ÈÚÐ-’ÐÐ	
-­ÉÚÐ-“ÐÐ	
-­ÊÚÐ-‰ÐÐ	
-­ËÚÐ-”ÐÐ	
-­ÌÚÐ-•ÐÐ	
-­ÍÚÐ-–ÐÐ	
-­ÎÚÐ-—ÐÐ	
-­ÏÚÐ-˜ÐÐ	
-­ÐÚÐ-™ÐÐ	
-­ÑÚÐ-šÐÐ	
-­ÒÚÐ-›ÐÐ	
-­ÓÚÐ-œÐÐ	
-­ÔÚÐ-ÐÐ	
-­ÕÚÐ-™ÐÐ	
-­ÖÚÐ-šÐÐ	
-­×ÚÐ-›ÐÐ	
-­ØÚÐ-žÐÐ	
-­ÙÚÐ-ŸÐÐ	
-­ÚÚÐ-‹ÐÐ	
-­ÛÚÐ- ÐÐ	
-­ÜÚÐ-¡ÐÐ	
-­ÝÚÐ-¢ÐÐ	
-­ÞÚÐ-‹ÐÐ	
-­ßÚÐ-£ÐÐ	
-­àÚÐ-¤ÐÐ	
-­áÚÐ-¥ÐÐ	
-­âÚÐ-¦ÐÐ	
-­ãÚÐ-§ÐÐ	
-­äÚÐ-¨ÐÐ	
-­åÚÐ-©ÐÐ	
-­æÚÐ-§ÐÐ	
-­çÚÐ-ªÐÐ	
-­èÚÐ-«ÐÐ	
-­éÚÐ-¬ÐÐ	
-­êÚÐ-­ÐÐ	
-­ëÚÐ-®ÐÐ	
-­ìÚÐ-¯ÐÐ	
-­íÚÐ-°ÐÐ	
-­îÚÐ-±ÐÐ	
-­ïÚÐ-²ÐÐ	
-­ðÚÐ-³ÐÐ	
-­ÚÐ-§
\ No newline at end of file
+ÚÐ-:ÐÐ	
+­ÚÐ-;ÐÐ	
+­ÚÐ-<ÐÐ	

ÚÐ-=ÐÐ	
+­ÚÐ->ÐÐ	
+­ÚÐ-?ÐÐ	
+­ÚÐ-@ÐÐ	
+­ÚÐ-AÐÐ	
+­7ÚÐ-BÐÐ	
+­8ÚÐ-CÐÐ	
+­9ÚÐ-DÐÐ	
+­:ÚÐ-EÐÐ	
+­ÚÐ-FÐÐ	
+­ÚÐ-GÐÐ	
+­ÚÐ-HÐÐ	
+­ÚÐ-IÐÐ	
+­ÚÐ-JÐÐ	
+­ÚÐ-KÐÐ	
+­ÚÐ-LÐÐ	
+­ ÚÐ-MÐÐ	
+­!ÚÐ-NÐÐ	
+­"ÚÐ-OÐÐ	
+­#ÚÐ-PÐÐ	
+­$ÚÐ-QÐÐ	
+­%ÚÐ-RÐÐ	
+­&ÚÐ-SÐÐ	
+­'ÚÐ-ÐÐ	
+­(ÚÐ-TÐÐ	
+­)ÚÐ-UÐÐ	
+­*ÚÐ-VÐÐ	
+­+ÚÐ-ÐÐ	
+­õÚÐ-WÐXYÐE=ÐÐ	
+­½ÚÐ-ZÐÐ	
+­¾ÚÐ-[ÐÐ	
+­¿ÚÐ-\ÐÐ	
+­ÀÚÐ-]ÐÐ	
+­ÁÚÐ-^ÐÐ	
+­ÂÚÐ-_ÐÐ	
+­ÃÚÐ-\ÐÐ	
+­ÄÚÐ-`ÐÐ	
+­ÅÚÐ-\ÐÐ	
+­ÆÚÐ-aÐÐ	
+­ÇÚÐ-bÐÐ	
+­ÈÚÐ-cÐÐ	
+­ÉÚÐ-dÐÐ	
+­ÊÚÐ-ZÐÐ	
+­ËÚÐ-eÐÐ	
+­ÌÚÐ-fÐÐ	
+­ÍÚÐ-gÐÐ	
+­ÎÚÐ-hÐÐ	
+­ÏÚÐ-iÐÐ	
+­ÐÚÐ-jÐÐ	
+­ÑÚÐ-kÐÐ	
+­ÒÚÐ-lÐÐ	
+­ÓÚÐ-mÐÐ	
+­ÔÚÐ-nÐÐ	
+­ÕÚÐ-jÐÐ	
+­ÖÚÐ-kÐÐ	
+­×ÚÐ-lÐÐ	
+­ØÚÐ-oÐÐ	
+­ÙÚÐ-pÐÐ	
+­ÚÚÐ-\ÐÐ	
+­ÛÚÐ-qÐÐ	
+­ÜÚÐ-rÐÐ	
+­ÝÚÐ-sÐÐ	
+­ÞÚÐ-\ÐÐ	
+­ßÚÐ-tÐÐ	
+­àÚÐ-uÐÐ	
+­áÚÐ-vÐÐ	
+­âÚÐ-wÐÐ	
+­ãÚÐ-xÐÐ	
+­äÚÐ-yÐÐ	
+­åÚÐ-zÐÐ	
+­æÚÐ-xÐÐ	
+­éÚÐ-{ÐÐ	
+­ëÚÐ-|ÐÐ	
+­ìÚÐ-}ÐÐ	
+­èÚÐ-xÐÐ	
+­çÚÐ-~ÐÐ	
+­ÍÚÐ-ÐÐ	
+­ÎÚÐ-€ÐÐ	
+­ÏÚÐ-ÐÐ	
+­ÐÚÐ-‚ÐÐ	
+­ÑÚÐ-ƒÐÐ	
+­ÒÚÐ-„ÐÐ	
+­ÓÚÐ-…ÐÐ	
+­ÔÚÐ-†ÐÐ	
+­ÕÚÐ-‡ÐÐ	
+­ðÚÐ-ˆÐÐ	
+­ÖÚÐ-‰ÐÐ	
+­ØÚÐ-ŠÐÐ	
+­×ÚÐ-‹ÐÐ	
+­ÚÐ-x
\ No newline at end of file