diff --git a/pydbc/buildGrammars.cmd b/pydbc/buildGrammars.cmd index 5ecb0bc..2cdad2b 100644 --- a/pydbc/buildGrammars.cmd +++ b/pydbc/buildGrammars.cmd @@ -1 +1,3 @@ java org.antlr.v4.Tool -Dlanguage=Python3 -long-messages -visitor dbc.g4 -o ./py3/ +java org.antlr.v4.Tool -Dlanguage=Python3 -long-messages -visitor ncf.g4 -o ./py3/ +java org.antlr.v4.Tool -Dlanguage=Python3 -long-messages -visitor ldf.g4 -o ./py3/ diff --git a/pydbc/db/load/ldf.py b/pydbc/db/load/ldf.py index 831af55..398723d 100644 --- a/pydbc/db/load/ldf.py +++ b/pydbc/db/load/ldf.py @@ -27,6 +27,7 @@ __author__ = 'Christoph Schueler' __version__ = '0.1.0' + import itertools from pydbc.types import AttributeType, ValueType, CategoryType @@ -34,11 +35,255 @@ from pprint import pprint + +""" +LIN-Attributes +============== + +Network +------- + LIN_protocol_version stringValue + LIN_language_version stringValue + LIN_speed number + LIN_channel_name stringValue + +Node +---- + ismaster number + isslave number + time_base [MASTER] number + jitter [MASTER] number + LIN_protocol stringValue + configured_NAD intValue + initial_NAD intValue + (product_id) + supplier_id intValue + function_id intValue + variant intValue + response_error identifierValue [SIGNAL] + fault_state_signals* identifierValue [SIGNAL] + P2_min number + ST_min number + N_As_timeout number + N_Cr_timeout number + +Signal +------ + +""" + +# fbxFrame_Triggering +# fbxSchedule_Table +# fbxSchedule_Table_Entry + +class AttributeContainer: + + def __init__(self, name, objType, valueType, minimum = None, maximum = None): + self.name = name + self.objType = objType + self.valueType = valueType + self.minimum = minimum + self.maximum = maximum + + +LDF_ATTRS = { + # Network + "LIN_protocol_version": AttributeContainer("LIN_protocol_version", AttributeType.NETWORK, ValueType.STRING), + "LIN_language_version": AttributeContainer("LIN_language_version", AttributeType.NETWORK, ValueType.STRING), + "LIN_file_revision": AttributeContainer("LIN_file_revision", AttributeType.NETWORK, ValueType.STRING), + "LIN_speed": AttributeContainer("LIN_speed", AttributeType.NETWORK, ValueType.FLOAT), + "LIN_channel_name": AttributeContainer("LIN_channel_name", AttributeType.NETWORK, ValueType.STRING), + "LIN_include_diag": AttributeContainer("LIN_channel_name", AttributeType.NETWORK, ValueType.INT), + # Nodes + "LIN_is_master": AttributeContainer("LIN_is_master", AttributeType.NODE, ValueType.INT), + "LIN_is_slave": AttributeContainer("LIN_is_slave", AttributeType.NODE, ValueType.INT), + "LIN_time_base": AttributeContainer("LIN_time_base", AttributeType.NODE, ValueType.FLOAT), + "LIN_jitter": AttributeContainer("LIN_jitter", AttributeType.NODE, ValueType.FLOAT), + "LIN_protocol": AttributeContainer("LIN_protocol", AttributeType.NODE, ValueType.STRING), + "LIN_configured_NAD": AttributeContainer("LIN_configured_NAD", AttributeType.NODE, ValueType.INT), + "LIN_initial_NAD": AttributeContainer("LIN_initial_NAD", AttributeType.NODE, ValueType.INT), + "LIN_supplier_id": AttributeContainer("LIN_supplier_id", AttributeType.NODE, ValueType.INT), + "LIN_function_id": AttributeContainer("LIN_function_id", AttributeType.NODE, ValueType.INT), + "LIN_variant": AttributeContainer("LIN_variant", AttributeType.NODE, ValueType.INT), + "LIN_response_error": AttributeContainer("LIN_response_error", AttributeType.NODE, ValueType.STRING), + #fault_state_signals* identifierValue [SIGNAL] + "LIN_P2_min": AttributeContainer("LIN_P2_min", AttributeType.NODE, ValueType.FLOAT), + "LIN_ST_min": AttributeContainer("LIN_ST_min", AttributeType.NODE, ValueType.FLOAT), + "LIN_N_As_timeout": AttributeContainer("LIN_N_As_timeout", AttributeType.NODE, ValueType.FLOAT), + "LIN_N_Cr_timeout": AttributeContainer("LIN_N_Cr_timeout", AttributeType.NODE, ValueType.FLOAT), +} + class LdfLoader(BaseLoader): def __init__(self, db, queryClass): super(LdfLoader, self).__init__(db, queryClass) + self.nodes = {} + self.signals = {} + self.frames = {} def _insertValues(self, cur, tree): pprint(tree) + pprint(tree.keys()) + self.insertAttributeDefinitions(cur) + self.insertNetworkAttributes(cur, tree) + """ + dict_keys([ + 'diagnosticSignals', + + 'signals', + + 'sporadicFrames', + 'nodeAttributes', + 'channelName', + 'nodes', + 'eventTriggeredFrames', + 'signalGroups', + 'signalRepresentations', + 'nodeCompositions', + 'scheduleTables', + 'signalEncodings', + 'diagnosticFrames', + + 'frames']) + """ + self.insertNetwork(cur) + self.insertNodes(cur, tree['nodes']) + self.insertNodeAttributes(cur, tree['nodeAttributes']) + self.insertSignals(cur, tree['signals']) + self.insertFrames(cur, tree['frames']) + self.insertFrameSignalRelationships(cur) + + def insertAttributeDefinitions(self, cur): + for key, attr in LDF_ATTRS.items(): + self.db.insertStatement( + cur, "linAttribute_Definition", "Name, Objecttype, Valuetype", attr.name, attr.objType, attr.valueType + ) + rid = cur.lastrowid + attr.attrDef = rid + + def insertNetworkAttributes(self, cur, tree): + KEY_MAP = { + 'languageVersion': "LIN_language_version", + 'protocolVersion': "LIN_protocol_version", + 'fileRevision': "LIN_file_revision", + 'speed': "LIN_speed", + 'channelName': 'LIN_channel_name', + } + objID = 0 + for key, mappedKey in KEY_MAP.items(): + value = tree[key] + self.setAttributeValue(cur, objID, mappedKey, value) + + def insertNetwork(self, cur): + self.db.insertStatement(cur, "Network", "Name", self.db.name) + + def insertNodes(self, cur, nodes): + nodeIDs = {} + masterNode = nodes['master'] + self.db.insertStatement(cur, "Node", "Name", masterNode) + mrid = cur.lastrowid + self.nodes[masterNode] = mrid + self.master = masterNode + self.setAttributeValue(cur, mrid, "LIN_is_master", 1) + self.setAttributeValue(cur, mrid, "LIN_time_base", nodes['timeBase']) + self.setAttributeValue(cur, mrid, "LIN_jitter", nodes['jitter']) + for name in nodes['slaves']: + self.db.insertStatement(cur, "Node", "Name", name) + srid = cur.lastrowid + self.setAttributeValue(cur, srid, "LIN_is_slave", 1) + self.nodes[name] = srid + print("SlaveNode:", name, srid) + + def insertNodeAttributes(self, cur, attrs): + KEY_MAP = { + 'initialNAD': "LIN_initial_NAD", + 'configuredNAD': "LIN_configured_NAD", + 'version': "LIN_protocol", + 'nAs': "LIN_N_As_timeout", + 'supplierID': "LIN_supplier_id", + 'functionID': "LIN_function_id", + 'variant': "LIN_variant", + 'p2Min': "LIN_P2_min", + 'nCr': "LIN_N_Cr_timeout", + 'stMin': "LIN_ST_min", + 'responseErrorSignal': 'LIN_response_error', + #'faultStateSignals': "" + } + for attr in attrs: + name = attr['name'] + nid = self.nodes.get(name) + for key, mappedKey in KEY_MAP.items(): + value = attr[key] + self.setAttributeValue(cur, nid, mappedKey, value) + + def insertSignals(self, cur, signals): + """ + {'initValue': {'array': None, 'scalar': 0}, + 'name': 'LockingSystem', + 'publishedBy': 'Gateway', + 'size': 1, + 'subscribedBy': ['Motor_back', 'Motor_head', 'Motor_horizontal', 'Motor_vertical'] + }, + """ + for signal in signals: + initValue = signal['initValue'] + name = signal['name'] + size = signal['size'] + publishedBy = signal['publishedBy'] + subscribedBy = signal['subscribedBy'] + self.db.insertStatement(cur, "Signal", "Name, Bitsize", name, size) + signal['rid'] = cur.lastrowid + self.signals[name] = signal + + def insertFrames(self, cur, frames): + """ + {'frameID': 21, + 'frameName': 'Seatheating', + 'frameSize': 1, + 'publishedBy': 'Gateway', + 'signals': [{'signalName': 'Heating', 'signalOffset': 0}]}, + """ + for frame in frames: + frid = frame['frameID'] + name = frame['frameName'] + size = frame['frameSize'] + publishedBy = frame['publishedBy'] + sender = self.nodes.get(publishedBy) + self.db.insertStatement(cur, "Message", "Name, Message_ID, DLC, Sender", name, frid, size, sender) + frame['rid'] = cur.lastrowid + self.frames[name] = frame + + def insertFrameSignalRelationships(self, cur): + for sigName, signal in self.signals.items(): + sgrid = signal['rid'] + for frameName in self.sendingFrameNames(sigName): + frame = self.frames.get(frameName) + frid = frame['rid'] + for nodeName in signal['subscribedBy']: + nid = self.nodes.get(nodeName) + self.db.insertStatement(cur, "Node_RxSignal", "Message, Signal, Node", frid, sgrid, nid) + + def setAttributeValue(self, cur, objID, attribute, value): + attr = LDF_ATTRS.get(attribute) + if attr is None: + raise KeyError("Invalid attribute '{}'".format(attribute)) + numValue = None + stringValue = None + if attr.valueType in (ValueType.FLOAT, ValueType.INT): + numValue = value + elif attr.valueType == ValueType.STRING: + stringValue = value + + self.db.insertStatement( + cur, "linAttribute_Value", "Object_ID, Attribute_Definition, Num_Value, String_Value", + objID, attr.attrDef, numValue, stringValue + ) + def sendingFrameNames(self, signal): + result = [] + for _, frame in self.frames.items(): + frameSignals = (s['signalName'] for s in frame['signals']) + frameName = frame['frameName'] + if signal in frameSignals: + result.append(frameName) + return result diff --git a/pydbc/dbcListener.py b/pydbc/dbcListener.py index 75632e7..cfd05e1 100644 --- a/pydbc/dbcListener.py +++ b/pydbc/dbcListener.py @@ -44,12 +44,18 @@ DIGITS = re.compile(r'(\d+)') +CO_MPX = re.compile(r"^m(\d+)M$") + def validateMultiplexerIndicatior(value): if value == "M" or (value[0] == 'm' and value[1 : ].isdigit()): return True else: - print("Invalid multiplex indicator: '{}'".format(value)) - return False + match = CO_MPX.match(value) + if not match: + print("Invalid multiplex indicator: '{}'".format(value)) + return False + else: + return True def extractAccessType(value): @@ -102,21 +108,28 @@ def exitSignalExtendedValueTypeList(self, ctx): def exitSignalExtendedValueType(self, ctx): messageID = ctx.messageID.value signalName = ctx.signalName.value - valType = ctx.valType.value # TODO: Validate ('0' | '1' | '2' | '3') + valType = ctx.valType.value + if not valType in (0, 1, 2, 3): + pass + #self.logger.error("ValueType must be in range [0..3]") ctx.value = dict(messageID = messageID, signalName = signalName, valueType = valType) def exitMessages(self, ctx): ctx.value = [x.value for x in ctx.items] def exitMessage(self, ctx): + # TODO: Check signals for multiple multiplexors! ctx.value = dict(messageID = ctx.messageID.value, name = ctx.messageName.value, dlc = ctx.messageSize.value, transmitter = ctx.transmt.text if ctx.transmt else None, signals = [x.value for x in ctx.sgs] ) def exitSignal(self, ctx): - # TODO: Check signals for multiple multiplexors! + byteOrder = ctx.byteOrder.value + if not byteOrder in (0, 1): + pass + #self.logger.error("Byteorder must be either 0 or 1") ctx.value = dict(name = ctx.signalName.value, startBit = ctx.startBit.value, signalSize = ctx.signalSize.value, - byteOrder = ctx.byteOrder.value, sign = -1 if ctx.sign.text == '-' else +1, factor = ctx.factor.value, offset = ctx.offset.value, + byteOrder = byteOrder, sign = -1 if ctx.sign.text == '-' else +1, factor = ctx.factor.value, offset = ctx.offset.value, minimum = ctx.minimum.value, maximum = ctx.maximum.value, unit = ctx.unit.value, receiver = ctx.rcv.value, multiplexerIndicator = ctx.mind.value if ctx.mind else None ) diff --git a/pydbc/ldfListener.py b/pydbc/ldfListener.py index ccbe5e7..ea2cc59 100644 --- a/pydbc/ldfListener.py +++ b/pydbc/ldfListener.py @@ -60,13 +60,13 @@ def exitLin_protocol_version_def(self, ctx): def exitLin_language_version_def(self, ctx): ctx.value = ctx.s.value - print("Language-Ver:", ctx.value) def exitLin_file_revision_def(self, ctx): ctx.value = ctx.s.value - print("File_Revision:", ctx.value) def exitLin_speed_def(self, ctx): + #print("SPEED:", dir(ctx.n)) + print("SPEED:", ctx.n.start.line, ctx.n.start.column) ctx.value = ctx.n.value if ctx.n else None def exitChannel_name_def(self, ctx): diff --git a/pydbc/py3/dbc.tokens b/pydbc/py3/dbc.tokens index e4a4b8e..61b89b8 100644 --- a/pydbc/py3/dbc.tokens +++ b/pydbc/py3/dbc.tokens @@ -47,14 +47,13 @@ T__45=46 T__46=47 T__47=48 T__48=49 -T__49=50 -DUMMY_NODE_VECTOR=51 -C_IDENTIFIER=52 -FLOAT=53 -INT=54 -WS=55 -STRING=56 -SIGN=57 +DUMMY_NODE_VECTOR=50 +C_IDENTIFIER=51 +FLOAT=52 +INT=53 +WS=54 +STRING=55 +SIGN=56 'BO_TX_BU_'=1 ':'=2 ';'=3 @@ -104,4 +103,3 @@ SIGN=57 'FLOAT'=47 'STRING'=48 'ENUM'=49 -'BA_REL'=50 diff --git a/pydbc/py3/dbcLexer.py b/pydbc/py3/dbcLexer.py index 551c2f9..9ba3c6e 100644 --- a/pydbc/py3/dbcLexer.py +++ b/pydbc/py3/dbcLexer.py @@ -1,11 +1,10 @@ -# Generated from dbc.g4 by ANTLR 4.7.2 +# Generated from dbc.g4 by ANTLR 4.7 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2:") @@ -356,7 +355,7 @@ class dbcLexer(Lexer): def __init__(self, input=None, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) self._actions = None self._predicates = None diff --git a/pydbc/py3/dbcLexer.tokens b/pydbc/py3/dbcLexer.tokens index e4a4b8e..61b89b8 100644 --- a/pydbc/py3/dbcLexer.tokens +++ b/pydbc/py3/dbcLexer.tokens @@ -47,14 +47,13 @@ T__45=46 T__46=47 T__47=48 T__48=49 -T__49=50 -DUMMY_NODE_VECTOR=51 -C_IDENTIFIER=52 -FLOAT=53 -INT=54 -WS=55 -STRING=56 -SIGN=57 +DUMMY_NODE_VECTOR=50 +C_IDENTIFIER=51 +FLOAT=52 +INT=53 +WS=54 +STRING=55 +SIGN=56 'BO_TX_BU_'=1 ':'=2 ';'=3 @@ -104,4 +103,3 @@ SIGN=57 'FLOAT'=47 'STRING'=48 'ENUM'=49 -'BA_REL'=50 diff --git a/pydbc/py3/dbcListener.py b/pydbc/py3/dbcListener.py index a7f390a..9a3abb3 100644 --- a/pydbc/py3/dbcListener.py +++ b/pydbc/py3/dbcListener.py @@ -1,4 +1,4 @@ -# Generated from dbc.g4 by ANTLR 4.7.2 +# Generated from dbc.g4 by ANTLR 4.7 from antlr4 import * if __name__ is not None and "." in __name__: from .dbcParser import dbcParser diff --git a/pydbc/py3/dbcParser.py b/pydbc/py3/dbcParser.py index bd41c45..7dcacaa 100644 --- a/pydbc/py3/dbcParser.py +++ b/pydbc/py3/dbcParser.py @@ -1,11 +1,10 @@ -# Generated from dbc.g4 by ANTLR 4.7.2 +# Generated from dbc.g4 by ANTLR 4.7 # encoding: utf-8 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3:") @@ -445,13 +444,12 @@ class dbcParser ( Parser ): def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None - class DbcfileContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -624,7 +622,6 @@ def dbcfile(self): self.exitRule() return localctx - class MessageTransmittersContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -686,7 +683,6 @@ def messageTransmitters(self): self.exitRule() return localctx - class MessageTransmitterContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -747,7 +743,6 @@ def messageTransmitter(self): self.exitRule() return localctx - class SignalExtendedValueTypeListContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -809,7 +804,6 @@ def signalExtendedValueTypeList(self): self.exitRule() return localctx - class SignalExtendedValueTypeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -876,7 +870,6 @@ def signalExtendedValueType(self): self.exitRule() return localctx - class MessagesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -938,7 +931,6 @@ def messages(self): self.exitRule() return localctx - class MessageContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1031,7 +1023,6 @@ def message(self): self.exitRule() return localctx - class SignalContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1169,7 +1160,6 @@ def signal(self): self.exitRule() return localctx - class ReceiverContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1239,7 +1229,6 @@ def receiver(self): self.exitRule() return localctx - class TransmitterContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1306,7 +1295,6 @@ def transmitter(self): self.exitRule() return localctx - class MultiplexerIndicatorContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1354,7 +1342,6 @@ def multiplexerIndicator(self): self.exitRule() return localctx - class ValueTablesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1416,7 +1403,6 @@ def valueTables(self): self.exitRule() return localctx - class ValueTableContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1489,7 +1475,6 @@ def valueTable(self): self.exitRule() return localctx - class ValueDescriptionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1544,7 +1529,6 @@ def valueDescription(self): self.exitRule() return localctx - class NodesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1610,7 +1594,6 @@ def nodes(self): self.exitRule() return localctx - class BitTimingContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1682,7 +1665,6 @@ def bitTiming(self): self.exitRule() return localctx - class NewSymbolsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1776,7 +1758,6 @@ def newSymbols(self): self.exitRule() return localctx - class VersionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1826,7 +1807,6 @@ def version(self): self.exitRule() return localctx - class ValueDescriptionsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1888,7 +1868,6 @@ def valueDescriptions(self): self.exitRule() return localctx - class SpecializedValueDescriptionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1992,7 +1971,6 @@ def specializedValueDescription(self): self.exitRule() return localctx - class EnvironmentVariablesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2054,7 +2032,6 @@ def environmentVariables(self): self.exitRule() return localctx - class EnvironmentVariableContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2162,7 +2139,6 @@ def environmentVariable(self): self.exitRule() return localctx - class AccessNodesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2229,7 +2205,6 @@ def accessNodes(self): self.exitRule() return localctx - class EnvironmentVariablesDataContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2291,7 +2266,6 @@ def environmentVariablesData(self): self.exitRule() return localctx - class EnvironmentVariableDataContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2352,7 +2326,6 @@ def environmentVariableData(self): self.exitRule() return localctx - class SignalTypesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2414,7 +2387,6 @@ def signalTypes(self): self.exitRule() return localctx - class SignalTypeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2535,7 +2507,6 @@ def signalType(self): self.exitRule() return localctx - class CommentsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2597,7 +2568,6 @@ def comments(self): self.exitRule() return localctx - class CommentContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2695,7 +2665,6 @@ def comment(self): self.exitRule() return localctx - class AttributeDefinitionsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2757,7 +2726,6 @@ def attributeDefinitions(self): self.exitRule() return localctx - class AttributeDefinitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2832,7 +2800,6 @@ def attributeDefinition(self): self.exitRule() return localctx - class RelativeAttributeDefinitionsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2894,7 +2861,6 @@ def relativeAttributeDefinitions(self): self.exitRule() return localctx - class RelativeAttributeDefinitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2969,7 +2935,6 @@ def relativeAttributeDefinition(self): self.exitRule() return localctx - class AttributeValueTypeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3099,7 +3064,6 @@ def attributeValueType(self): self.exitRule() return localctx - class AttributeDefaultsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3161,7 +3125,6 @@ def attributeDefaults(self): self.exitRule() return localctx - class AttributeDefaultContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3220,7 +3183,6 @@ def attributeDefault(self): self.exitRule() return localctx - class RelativeAttributeDefaultsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3282,7 +3244,6 @@ def relativeAttributeDefaults(self): self.exitRule() return localctx - class RelativeAttributeDefaultContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3341,7 +3302,6 @@ def relativeAttributeDefault(self): self.exitRule() return localctx - class AttributeValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3407,7 +3367,6 @@ def attributeValue(self): self.exitRule() return localctx - class AttributeValuesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3469,7 +3428,6 @@ def attributeValues(self): self.exitRule() return localctx - class AttributeValueForObjectContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3587,7 +3545,6 @@ def attributeValueForObject(self): self.exitRule() return localctx - class RelativeAttributeValuesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3649,7 +3606,6 @@ def relativeAttributeValues(self): self.exitRule() return localctx - class RelativeAttributeValueForObjectContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3764,7 +3720,6 @@ def relativeAttributeValueForObject(self): self.exitRule() return localctx - class SignalGroupsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3826,7 +3781,6 @@ def signalGroups(self): self.exitRule() return localctx - class SignalGroupContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3910,7 +3864,6 @@ def signalGroup(self): self.exitRule() return localctx - class CategoryDefinitionsContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3972,7 +3925,6 @@ def categoryDefinitions(self): self.exitRule() return localctx - class CategoryDefinitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4037,7 +3989,6 @@ def categoryDefinition(self): self.exitRule() return localctx - class CategoriesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4099,7 +4050,6 @@ def categories(self): self.exitRule() return localctx - class CategoryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4185,7 +4135,6 @@ def category(self): self.exitRule() return localctx - class IntValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4232,7 +4181,6 @@ def intValue(self): self.exitRule() return localctx - class FloatValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4279,7 +4227,6 @@ def floatValue(self): self.exitRule() return localctx - class NumberContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4345,7 +4292,6 @@ def number(self): self.exitRule() return localctx - class StringValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4392,7 +4338,6 @@ def stringValue(self): self.exitRule() return localctx - class IdentifierValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): diff --git a/pydbc/py3/dbcVisitor.py b/pydbc/py3/dbcVisitor.py index a3bb850..8b40fcb 100644 --- a/pydbc/py3/dbcVisitor.py +++ b/pydbc/py3/dbcVisitor.py @@ -1,4 +1,4 @@ -# Generated from dbc.g4 by ANTLR 4.7.2 +# Generated from dbc.g4 by ANTLR 4.7 from antlr4 import * if __name__ is not None and "." in __name__: from .dbcParser import dbcParser diff --git a/pydbc/py3/ldf.tokens b/pydbc/py3/ldf.tokens index e69de29..775bbe7 100644 --- a/pydbc/py3/ldf.tokens +++ b/pydbc/py3/ldf.tokens @@ -0,0 +1,118 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +C_IDENTIFIER=56 +FLOAT=57 +INT=58 +HEX=59 +WS=60 +COMMENT=61 +STRING=62 +SIGN=63 +'LIN_description_file'=1 +';'=2 +'LIN_protocol_version'=3 +'='=4 +'LIN_language_version'=5 +'LDF_file_revision'=6 +'LIN_speed'=7 +'kbps'=8 +'Channel_name'=9 +'Nodes'=10 +'{'=11 +'Master'=12 +':'=13 +','=14 +'ms'=15 +'Slaves'=16 +'}'=17 +'Node_attributes'=18 +'LIN_protocol'=19 +'configured_NAD'=20 +'initial_NAD'=21 +'product_id'=22 +'response_error'=23 +'fault_state_signals'=24 +'P2_min'=25 +'ST_min'=26 +'N_As_timeout'=27 +'N_Cr_timeout'=28 +'configurable_frames'=29 +'composite'=30 +'configuration'=31 +'Signals'=32 +'Diagnostic_signals'=33 +'Signal_groups'=34 +'Frames'=35 +'Sporadic_frames'=36 +'Event_triggered_frames'=37 +'Diagnostic_frames'=38 +'MasterReq'=39 +'SlaveResp'=40 +'Schedule_tables'=41 +'delay'=42 +'AssignNAD'=43 +'ConditionalChangeNAD'=44 +'DataDump'=45 +'SaveConfiguration'=46 +'AssignFrameIdRange'=47 +'FreeFormat'=48 +'AssignFrameId'=49 +'Signal_encoding_types'=50 +'logical_value'=51 +'physical_value'=52 +'bcd_value'=53 +'ascii_value'=54 +'Signal_representation'=55 diff --git a/pydbc/py3/ldfLexer.py b/pydbc/py3/ldfLexer.py index 68c243f..2d255c0 100644 --- a/pydbc/py3/ldfLexer.py +++ b/pydbc/py3/ldfLexer.py @@ -1,15 +1,14 @@ -# Generated from ldf.g4 by ANTLR 4.7.2 +# Generated from ldf.g4 by ANTLR 4.7 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2@") - buf.write("\u0392\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2A") + buf.write("\u039f\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7") buf.write("\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r") buf.write("\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23") buf.write("\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30") @@ -18,381 +17,387 @@ def serializedATN(): buf.write("\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.") buf.write("\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64") buf.write("\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:") - buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\3\2\3\2\3\2") - buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3") - buf.write("\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4") - buf.write("\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3") - buf.write("\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6") - buf.write("\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3") - buf.write("\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7") - buf.write("\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3") - buf.write("\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n") - buf.write("\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\r\3\r") - buf.write("\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20") - buf.write("\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23") - buf.write("\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") - buf.write("\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24") - buf.write("\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25") - buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26") - buf.write("\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27") - buf.write("\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30") - buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30") - buf.write("\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31") + buf.write("\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\t") + buf.write("C\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2") + buf.write("\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3") + buf.write("\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4") + buf.write("\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3") + buf.write("\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6") + buf.write("\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3") + buf.write("\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b") + buf.write("\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3") + buf.write("\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3") + buf.write("\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17") + buf.write("\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22") + buf.write("\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23") + buf.write("\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24") + buf.write("\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25") + buf.write("\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25") + buf.write("\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26") + buf.write("\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27") + buf.write("\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30") + buf.write("\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31") buf.write("\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31") - buf.write("\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33") - buf.write("\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34") - buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35") - buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36") + buf.write("\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32") + buf.write("\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34") + buf.write("\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35") + buf.write("\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35") buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36") - buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37") - buf.write("\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3") - buf.write(" \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"") - buf.write("\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3") - buf.write("\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3$\3") - buf.write("$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3") - buf.write("%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3") - buf.write("&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'") - buf.write("\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(") - buf.write("\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\3") - buf.write("*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3+\3+\3") - buf.write("+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3") - buf.write("-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3.\3") - buf.write(".\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3") - buf.write("/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3") - buf.write("\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") - buf.write("\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61") - buf.write("\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62") - buf.write("\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63") + buf.write("\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37") + buf.write("\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3") + buf.write(" \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3") + buf.write("\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"") + buf.write("\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#") + buf.write("\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3%\3%\3") + buf.write("%\3%\3%\3%\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3") + buf.write("&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3") + buf.write("\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'") + buf.write("\3\'\3(\3(\3(\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\3") + buf.write(")\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3*\3") + buf.write("*\3*\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3") + buf.write("-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3-\3") + buf.write("-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3") + buf.write("/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60") + buf.write("\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61") + buf.write("\3\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62") + buf.write("\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63") buf.write("\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63") - buf.write("\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64") - buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65") + buf.write("\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64") + buf.write("\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65") buf.write("\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65") - buf.write("\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66") - buf.write("\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67") - buf.write("\3\67\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38\38") - buf.write("\38\38\38\38\38\38\39\39\79\u0328\n9\f9\169\u032b\139") - buf.write("\3:\3:\5:\u032f\n:\3:\6:\u0332\n:\r:\16:\u0333\3;\5;\u0337") - buf.write("\n;\3;\6;\u033a\n;\r;\16;\u033b\3;\3;\7;\u0340\n;\f;\16") - buf.write(";\u0343\13;\3;\5;\u0346\n;\3;\3;\6;\u034a\n;\r;\16;\u034b") - buf.write("\3;\5;\u034f\n;\3;\6;\u0352\n;\r;\16;\u0353\3;\5;\u0357") - buf.write("\n;\3<\5<\u035a\n<\3<\6<\u035d\n<\r<\16<\u035e\3=\3=\3") - buf.write("=\3>\3>\3>\3>\3?\3?\3?\3?\7?\u036c\n?\f?\16?\u036f\13") - buf.write("?\3?\7?\u0372\n?\f?\16?\u0375\13?\3?\3?\3?\3?\3?\7?\u037c") - buf.write("\n?\f?\16?\u037f\13?\3?\3?\5?\u0383\n?\3?\3?\3@\3@\3@") - buf.write("\7@\u038a\n@\f@\16@\u038d\13@\3@\3@\3A\3A\3\u037d\2B\3") - buf.write("\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16") + buf.write("\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66") + buf.write("\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67") + buf.write("\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\38\38\3") + buf.write("8\38\38\38\38\38\38\38\38\38\39\39\79\u032c\n9\f9\169") + buf.write("\u032f\139\3:\3:\5:\u0333\n:\3:\6:\u0336\n:\r:\16:\u0337") + buf.write("\3;\5;\u033b\n;\3;\6;\u033e\n;\r;\16;\u033f\3;\3;\7;\u0344") + buf.write("\n;\f;\16;\u0347\13;\3;\5;\u034a\n;\3;\3;\6;\u034e\n;") + buf.write("\r;\16;\u034f\3;\5;\u0353\n;\3;\6;\u0356\n;\r;\16;\u0357") + buf.write("\3;\5;\u035b\n;\3<\5<\u035e\n<\3<\6<\u0361\n<\r<\16<\u0362") + buf.write("\3=\3=\3=\6=\u0368\n=\r=\16=\u0369\3>\3>\3?\3?\3?\3@\3") + buf.write("@\3@\3@\3A\3A\3A\3A\7A\u0379\nA\fA\16A\u037c\13A\3A\7") + buf.write("A\u037f\nA\fA\16A\u0382\13A\3A\3A\3A\3A\3A\7A\u0389\n") + buf.write("A\fA\16A\u038c\13A\3A\3A\5A\u0390\nA\3A\3A\3B\3B\3B\7") + buf.write("B\u0397\nB\fB\16B\u039a\13B\3B\3B\3C\3C\3\u038a\2D\3\3") + buf.write("\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16") buf.write("\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61") buf.write("\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*") buf.write("S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s\2u;") - buf.write("w\177?\u0081@\3\2\n\5\2C\\aac|\6\2\62;C\\aac|") - buf.write("\4\2GGgg\4\2--//\n\2$$))^^ddhhppttvv\5\2\13\f\17\17\"") - buf.write("\"\4\2\f\f\17\17\4\2$$^^\2\u03a3\2\3\3\2\2\2\2\5\3\2\2") - buf.write("\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2") - buf.write("\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27") - buf.write("\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3") - buf.write("\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2") - buf.write(")\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2") - buf.write("\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2") - buf.write(";\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2") - buf.write("\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2") - buf.write("\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2") - buf.write("\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3") - buf.write("\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k") - buf.write("\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2u\3\2\2\2\2") - buf.write("w\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081") - buf.write("\3\2\2\2\3\u0083\3\2\2\2\5\u0098\3\2\2\2\7\u009a\3\2\2") - buf.write("\2\t\u00af\3\2\2\2\13\u00b1\3\2\2\2\r\u00c6\3\2\2\2\17") - buf.write("\u00d8\3\2\2\2\21\u00e2\3\2\2\2\23\u00e7\3\2\2\2\25\u00f4") - buf.write("\3\2\2\2\27\u00fa\3\2\2\2\31\u00fc\3\2\2\2\33\u0103\3") - buf.write("\2\2\2\35\u0105\3\2\2\2\37\u0107\3\2\2\2!\u010a\3\2\2") - buf.write("\2#\u0111\3\2\2\2%\u0113\3\2\2\2\'\u0123\3\2\2\2)\u0130") - buf.write("\3\2\2\2+\u013f\3\2\2\2-\u014b\3\2\2\2/\u0156\3\2\2\2") - buf.write("\61\u0165\3\2\2\2\63\u0179\3\2\2\2\65\u0180\3\2\2\2\67") - buf.write("\u0187\3\2\2\29\u0194\3\2\2\2;\u01a1\3\2\2\2=\u01b5\3") - buf.write("\2\2\2?\u01bf\3\2\2\2A\u01cd\3\2\2\2C\u01d5\3\2\2\2E\u01e8") - buf.write("\3\2\2\2G\u01f6\3\2\2\2I\u01fd\3\2\2\2K\u020d\3\2\2\2") - buf.write("M\u0224\3\2\2\2O\u0236\3\2\2\2Q\u0240\3\2\2\2S\u024a\3") - buf.write("\2\2\2U\u025a\3\2\2\2W\u0260\3\2\2\2Y\u026a\3\2\2\2[\u027f") - buf.write("\3\2\2\2]\u0288\3\2\2\2_\u029a\3\2\2\2a\u02ad\3\2\2\2") - buf.write("c\u02b8\3\2\2\2e\u02c6\3\2\2\2g\u02dc\3\2\2\2i\u02ea\3") - buf.write("\2\2\2k\u02f9\3\2\2\2m\u0303\3\2\2\2o\u030f\3\2\2\2q\u0325") - buf.write("\3\2\2\2s\u032c\3\2\2\2u\u0336\3\2\2\2w\u0359\3\2\2\2") - buf.write("y\u0360\3\2\2\2{\u0363\3\2\2\2}\u0382\3\2\2\2\177\u0386") - buf.write("\3\2\2\2\u0081\u0390\3\2\2\2\u0083\u0084\7N\2\2\u0084") - buf.write("\u0085\7K\2\2\u0085\u0086\7P\2\2\u0086\u0087\7a\2\2\u0087") - buf.write("\u0088\7f\2\2\u0088\u0089\7g\2\2\u0089\u008a\7u\2\2\u008a") - buf.write("\u008b\7e\2\2\u008b\u008c\7t\2\2\u008c\u008d\7k\2\2\u008d") - buf.write("\u008e\7r\2\2\u008e\u008f\7v\2\2\u008f\u0090\7k\2\2\u0090") - buf.write("\u0091\7q\2\2\u0091\u0092\7p\2\2\u0092\u0093\7a\2\2\u0093") - buf.write("\u0094\7h\2\2\u0094\u0095\7k\2\2\u0095\u0096\7n\2\2\u0096") - buf.write("\u0097\7g\2\2\u0097\4\3\2\2\2\u0098\u0099\7=\2\2\u0099") - buf.write("\6\3\2\2\2\u009a\u009b\7N\2\2\u009b\u009c\7K\2\2\u009c") - buf.write("\u009d\7P\2\2\u009d\u009e\7a\2\2\u009e\u009f\7r\2\2\u009f") - buf.write("\u00a0\7t\2\2\u00a0\u00a1\7q\2\2\u00a1\u00a2\7v\2\2\u00a2") - buf.write("\u00a3\7q\2\2\u00a3\u00a4\7e\2\2\u00a4\u00a5\7q\2\2\u00a5") - buf.write("\u00a6\7n\2\2\u00a6\u00a7\7a\2\2\u00a7\u00a8\7x\2\2\u00a8") - buf.write("\u00a9\7g\2\2\u00a9\u00aa\7t\2\2\u00aa\u00ab\7u\2\2\u00ab") - buf.write("\u00ac\7k\2\2\u00ac\u00ad\7q\2\2\u00ad\u00ae\7p\2\2\u00ae") - buf.write("\b\3\2\2\2\u00af\u00b0\7?\2\2\u00b0\n\3\2\2\2\u00b1\u00b2") - buf.write("\7N\2\2\u00b2\u00b3\7K\2\2\u00b3\u00b4\7P\2\2\u00b4\u00b5") - buf.write("\7a\2\2\u00b5\u00b6\7n\2\2\u00b6\u00b7\7c\2\2\u00b7\u00b8") - buf.write("\7p\2\2\u00b8\u00b9\7i\2\2\u00b9\u00ba\7w\2\2\u00ba\u00bb") - buf.write("\7c\2\2\u00bb\u00bc\7i\2\2\u00bc\u00bd\7g\2\2\u00bd\u00be") - buf.write("\7a\2\2\u00be\u00bf\7x\2\2\u00bf\u00c0\7g\2\2\u00c0\u00c1") - buf.write("\7t\2\2\u00c1\u00c2\7u\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4") - buf.write("\7q\2\2\u00c4\u00c5\7p\2\2\u00c5\f\3\2\2\2\u00c6\u00c7") - buf.write("\7N\2\2\u00c7\u00c8\7F\2\2\u00c8\u00c9\7H\2\2\u00c9\u00ca") - buf.write("\7a\2\2\u00ca\u00cb\7h\2\2\u00cb\u00cc\7k\2\2\u00cc\u00cd") - buf.write("\7n\2\2\u00cd\u00ce\7g\2\2\u00ce\u00cf\7a\2\2\u00cf\u00d0") - buf.write("\7t\2\2\u00d0\u00d1\7g\2\2\u00d1\u00d2\7x\2\2\u00d2\u00d3") - buf.write("\7k\2\2\u00d3\u00d4\7u\2\2\u00d4\u00d5\7k\2\2\u00d5\u00d6") - buf.write("\7q\2\2\u00d6\u00d7\7p\2\2\u00d7\16\3\2\2\2\u00d8\u00d9") - buf.write("\7N\2\2\u00d9\u00da\7K\2\2\u00da\u00db\7P\2\2\u00db\u00dc") - buf.write("\7a\2\2\u00dc\u00dd\7u\2\2\u00dd\u00de\7r\2\2\u00de\u00df") - buf.write("\7g\2\2\u00df\u00e0\7g\2\2\u00e0\u00e1\7f\2\2\u00e1\20") - buf.write("\3\2\2\2\u00e2\u00e3\7m\2\2\u00e3\u00e4\7d\2\2\u00e4\u00e5") - buf.write("\7r\2\2\u00e5\u00e6\7u\2\2\u00e6\22\3\2\2\2\u00e7\u00e8") - buf.write("\7E\2\2\u00e8\u00e9\7j\2\2\u00e9\u00ea\7c\2\2\u00ea\u00eb") - buf.write("\7p\2\2\u00eb\u00ec\7p\2\2\u00ec\u00ed\7g\2\2\u00ed\u00ee") - buf.write("\7n\2\2\u00ee\u00ef\7a\2\2\u00ef\u00f0\7p\2\2\u00f0\u00f1") - buf.write("\7c\2\2\u00f1\u00f2\7o\2\2\u00f2\u00f3\7g\2\2\u00f3\24") - buf.write("\3\2\2\2\u00f4\u00f5\7P\2\2\u00f5\u00f6\7q\2\2\u00f6\u00f7") - buf.write("\7f\2\2\u00f7\u00f8\7g\2\2\u00f8\u00f9\7u\2\2\u00f9\26") - buf.write("\3\2\2\2\u00fa\u00fb\7}\2\2\u00fb\30\3\2\2\2\u00fc\u00fd") - buf.write("\7O\2\2\u00fd\u00fe\7c\2\2\u00fe\u00ff\7u\2\2\u00ff\u0100") - buf.write("\7v\2\2\u0100\u0101\7g\2\2\u0101\u0102\7t\2\2\u0102\32") - buf.write("\3\2\2\2\u0103\u0104\7<\2\2\u0104\34\3\2\2\2\u0105\u0106") - buf.write("\7.\2\2\u0106\36\3\2\2\2\u0107\u0108\7o\2\2\u0108\u0109") - buf.write("\7u\2\2\u0109 \3\2\2\2\u010a\u010b\7U\2\2\u010b\u010c") - buf.write("\7n\2\2\u010c\u010d\7c\2\2\u010d\u010e\7x\2\2\u010e\u010f") - buf.write("\7g\2\2\u010f\u0110\7u\2\2\u0110\"\3\2\2\2\u0111\u0112") - buf.write("\7\177\2\2\u0112$\3\2\2\2\u0113\u0114\7P\2\2\u0114\u0115") - buf.write("\7q\2\2\u0115\u0116\7f\2\2\u0116\u0117\7g\2\2\u0117\u0118") - buf.write("\7a\2\2\u0118\u0119\7c\2\2\u0119\u011a\7v\2\2\u011a\u011b") - buf.write("\7v\2\2\u011b\u011c\7t\2\2\u011c\u011d\7k\2\2\u011d\u011e") - buf.write("\7d\2\2\u011e\u011f\7w\2\2\u011f\u0120\7v\2\2\u0120\u0121") - buf.write("\7g\2\2\u0121\u0122\7u\2\2\u0122&\3\2\2\2\u0123\u0124") - buf.write("\7N\2\2\u0124\u0125\7K\2\2\u0125\u0126\7P\2\2\u0126\u0127") - buf.write("\7a\2\2\u0127\u0128\7r\2\2\u0128\u0129\7t\2\2\u0129\u012a") - buf.write("\7q\2\2\u012a\u012b\7v\2\2\u012b\u012c\7q\2\2\u012c\u012d") - buf.write("\7e\2\2\u012d\u012e\7q\2\2\u012e\u012f\7n\2\2\u012f(\3") - buf.write("\2\2\2\u0130\u0131\7e\2\2\u0131\u0132\7q\2\2\u0132\u0133") - buf.write("\7p\2\2\u0133\u0134\7h\2\2\u0134\u0135\7k\2\2\u0135\u0136") - buf.write("\7i\2\2\u0136\u0137\7w\2\2\u0137\u0138\7t\2\2\u0138\u0139") - buf.write("\7g\2\2\u0139\u013a\7f\2\2\u013a\u013b\7a\2\2\u013b\u013c") - buf.write("\7P\2\2\u013c\u013d\7C\2\2\u013d\u013e\7F\2\2\u013e*\3") - buf.write("\2\2\2\u013f\u0140\7k\2\2\u0140\u0141\7p\2\2\u0141\u0142") - buf.write("\7k\2\2\u0142\u0143\7v\2\2\u0143\u0144\7k\2\2\u0144\u0145") - buf.write("\7c\2\2\u0145\u0146\7n\2\2\u0146\u0147\7a\2\2\u0147\u0148") - buf.write("\7P\2\2\u0148\u0149\7C\2\2\u0149\u014a\7F\2\2\u014a,\3") - buf.write("\2\2\2\u014b\u014c\7r\2\2\u014c\u014d\7t\2\2\u014d\u014e") - buf.write("\7q\2\2\u014e\u014f\7f\2\2\u014f\u0150\7w\2\2\u0150\u0151") - buf.write("\7e\2\2\u0151\u0152\7v\2\2\u0152\u0153\7a\2\2\u0153\u0154") - buf.write("\7k\2\2\u0154\u0155\7f\2\2\u0155.\3\2\2\2\u0156\u0157") - buf.write("\7t\2\2\u0157\u0158\7g\2\2\u0158\u0159\7u\2\2\u0159\u015a") - buf.write("\7r\2\2\u015a\u015b\7q\2\2\u015b\u015c\7p\2\2\u015c\u015d") - buf.write("\7u\2\2\u015d\u015e\7g\2\2\u015e\u015f\7a\2\2\u015f\u0160") - buf.write("\7g\2\2\u0160\u0161\7t\2\2\u0161\u0162\7t\2\2\u0162\u0163") - buf.write("\7q\2\2\u0163\u0164\7t\2\2\u0164\60\3\2\2\2\u0165\u0166") - buf.write("\7h\2\2\u0166\u0167\7c\2\2\u0167\u0168\7w\2\2\u0168\u0169") - buf.write("\7n\2\2\u0169\u016a\7v\2\2\u016a\u016b\7a\2\2\u016b\u016c") - buf.write("\7u\2\2\u016c\u016d\7v\2\2\u016d\u016e\7c\2\2\u016e\u016f") - buf.write("\7v\2\2\u016f\u0170\7g\2\2\u0170\u0171\7a\2\2\u0171\u0172") - buf.write("\7u\2\2\u0172\u0173\7k\2\2\u0173\u0174\7i\2\2\u0174\u0175") - buf.write("\7p\2\2\u0175\u0176\7c\2\2\u0176\u0177\7n\2\2\u0177\u0178") - buf.write("\7u\2\2\u0178\62\3\2\2\2\u0179\u017a\7R\2\2\u017a\u017b") - buf.write("\7\64\2\2\u017b\u017c\7a\2\2\u017c\u017d\7o\2\2\u017d") - buf.write("\u017e\7k\2\2\u017e\u017f\7p\2\2\u017f\64\3\2\2\2\u0180") - buf.write("\u0181\7U\2\2\u0181\u0182\7V\2\2\u0182\u0183\7a\2\2\u0183") - buf.write("\u0184\7o\2\2\u0184\u0185\7k\2\2\u0185\u0186\7p\2\2\u0186") - buf.write("\66\3\2\2\2\u0187\u0188\7P\2\2\u0188\u0189\7a\2\2\u0189") - buf.write("\u018a\7C\2\2\u018a\u018b\7u\2\2\u018b\u018c\7a\2\2\u018c") - buf.write("\u018d\7v\2\2\u018d\u018e\7k\2\2\u018e\u018f\7o\2\2\u018f") - buf.write("\u0190\7g\2\2\u0190\u0191\7q\2\2\u0191\u0192\7w\2\2\u0192") - buf.write("\u0193\7v\2\2\u01938\3\2\2\2\u0194\u0195\7P\2\2\u0195") - buf.write("\u0196\7a\2\2\u0196\u0197\7E\2\2\u0197\u0198\7t\2\2\u0198") - buf.write("\u0199\7a\2\2\u0199\u019a\7v\2\2\u019a\u019b\7k\2\2\u019b") - buf.write("\u019c\7o\2\2\u019c\u019d\7g\2\2\u019d\u019e\7q\2\2\u019e") - buf.write("\u019f\7w\2\2\u019f\u01a0\7v\2\2\u01a0:\3\2\2\2\u01a1") - buf.write("\u01a2\7e\2\2\u01a2\u01a3\7q\2\2\u01a3\u01a4\7p\2\2\u01a4") - buf.write("\u01a5\7h\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7\7i\2\2\u01a7") - buf.write("\u01a8\7w\2\2\u01a8\u01a9\7t\2\2\u01a9\u01aa\7c\2\2\u01aa") - buf.write("\u01ab\7d\2\2\u01ab\u01ac\7n\2\2\u01ac\u01ad\7g\2\2\u01ad") - buf.write("\u01ae\7a\2\2\u01ae\u01af\7h\2\2\u01af\u01b0\7t\2\2\u01b0") - buf.write("\u01b1\7c\2\2\u01b1\u01b2\7o\2\2\u01b2\u01b3\7g\2\2\u01b3") - buf.write("\u01b4\7u\2\2\u01b4<\3\2\2\2\u01b5\u01b6\7e\2\2\u01b6") - buf.write("\u01b7\7q\2\2\u01b7\u01b8\7o\2\2\u01b8\u01b9\7r\2\2\u01b9") - buf.write("\u01ba\7q\2\2\u01ba\u01bb\7u\2\2\u01bb\u01bc\7k\2\2\u01bc") - buf.write("\u01bd\7v\2\2\u01bd\u01be\7g\2\2\u01be>\3\2\2\2\u01bf") - buf.write("\u01c0\7e\2\2\u01c0\u01c1\7q\2\2\u01c1\u01c2\7p\2\2\u01c2") - buf.write("\u01c3\7h\2\2\u01c3\u01c4\7k\2\2\u01c4\u01c5\7i\2\2\u01c5") - buf.write("\u01c6\7w\2\2\u01c6\u01c7\7t\2\2\u01c7\u01c8\7c\2\2\u01c8") - buf.write("\u01c9\7v\2\2\u01c9\u01ca\7k\2\2\u01ca\u01cb\7q\2\2\u01cb") - buf.write("\u01cc\7p\2\2\u01cc@\3\2\2\2\u01cd\u01ce\7U\2\2\u01ce") - buf.write("\u01cf\7k\2\2\u01cf\u01d0\7i\2\2\u01d0\u01d1\7p\2\2\u01d1") - buf.write("\u01d2\7c\2\2\u01d2\u01d3\7n\2\2\u01d3\u01d4\7u\2\2\u01d4") - buf.write("B\3\2\2\2\u01d5\u01d6\7F\2\2\u01d6\u01d7\7k\2\2\u01d7") - buf.write("\u01d8\7c\2\2\u01d8\u01d9\7i\2\2\u01d9\u01da\7p\2\2\u01da") - buf.write("\u01db\7q\2\2\u01db\u01dc\7u\2\2\u01dc\u01dd\7v\2\2\u01dd") - buf.write("\u01de\7k\2\2\u01de\u01df\7e\2\2\u01df\u01e0\7a\2\2\u01e0") - buf.write("\u01e1\7u\2\2\u01e1\u01e2\7k\2\2\u01e2\u01e3\7i\2\2\u01e3") - buf.write("\u01e4\7p\2\2\u01e4\u01e5\7c\2\2\u01e5\u01e6\7n\2\2\u01e6") - buf.write("\u01e7\7u\2\2\u01e7D\3\2\2\2\u01e8\u01e9\7U\2\2\u01e9") - buf.write("\u01ea\7k\2\2\u01ea\u01eb\7i\2\2\u01eb\u01ec\7p\2\2\u01ec") - buf.write("\u01ed\7c\2\2\u01ed\u01ee\7n\2\2\u01ee\u01ef\7a\2\2\u01ef") - buf.write("\u01f0\7i\2\2\u01f0\u01f1\7t\2\2\u01f1\u01f2\7q\2\2\u01f2") - buf.write("\u01f3\7w\2\2\u01f3\u01f4\7r\2\2\u01f4\u01f5\7u\2\2\u01f5") - buf.write("F\3\2\2\2\u01f6\u01f7\7H\2\2\u01f7\u01f8\7t\2\2\u01f8") - buf.write("\u01f9\7c\2\2\u01f9\u01fa\7o\2\2\u01fa\u01fb\7g\2\2\u01fb") - buf.write("\u01fc\7u\2\2\u01fcH\3\2\2\2\u01fd\u01fe\7U\2\2\u01fe") - buf.write("\u01ff\7r\2\2\u01ff\u0200\7q\2\2\u0200\u0201\7t\2\2\u0201") - buf.write("\u0202\7c\2\2\u0202\u0203\7f\2\2\u0203\u0204\7k\2\2\u0204") - buf.write("\u0205\7e\2\2\u0205\u0206\7a\2\2\u0206\u0207\7h\2\2\u0207") - buf.write("\u0208\7t\2\2\u0208\u0209\7c\2\2\u0209\u020a\7o\2\2\u020a") - buf.write("\u020b\7g\2\2\u020b\u020c\7u\2\2\u020cJ\3\2\2\2\u020d") - buf.write("\u020e\7G\2\2\u020e\u020f\7x\2\2\u020f\u0210\7g\2\2\u0210") - buf.write("\u0211\7p\2\2\u0211\u0212\7v\2\2\u0212\u0213\7a\2\2\u0213") - buf.write("\u0214\7v\2\2\u0214\u0215\7t\2\2\u0215\u0216\7k\2\2\u0216") - buf.write("\u0217\7i\2\2\u0217\u0218\7i\2\2\u0218\u0219\7g\2\2\u0219") - buf.write("\u021a\7t\2\2\u021a\u021b\7g\2\2\u021b\u021c\7f\2\2\u021c") - buf.write("\u021d\7a\2\2\u021d\u021e\7h\2\2\u021e\u021f\7t\2\2\u021f") - buf.write("\u0220\7c\2\2\u0220\u0221\7o\2\2\u0221\u0222\7g\2\2\u0222") - buf.write("\u0223\7u\2\2\u0223L\3\2\2\2\u0224\u0225\7F\2\2\u0225") - buf.write("\u0226\7k\2\2\u0226\u0227\7c\2\2\u0227\u0228\7i\2\2\u0228") - buf.write("\u0229\7p\2\2\u0229\u022a\7q\2\2\u022a\u022b\7u\2\2\u022b") - buf.write("\u022c\7v\2\2\u022c\u022d\7k\2\2\u022d\u022e\7e\2\2\u022e") - buf.write("\u022f\7a\2\2\u022f\u0230\7h\2\2\u0230\u0231\7t\2\2\u0231") - buf.write("\u0232\7c\2\2\u0232\u0233\7o\2\2\u0233\u0234\7g\2\2\u0234") - buf.write("\u0235\7u\2\2\u0235N\3\2\2\2\u0236\u0237\7O\2\2\u0237") - buf.write("\u0238\7c\2\2\u0238\u0239\7u\2\2\u0239\u023a\7v\2\2\u023a") - buf.write("\u023b\7g\2\2\u023b\u023c\7t\2\2\u023c\u023d\7T\2\2\u023d") - buf.write("\u023e\7g\2\2\u023e\u023f\7s\2\2\u023fP\3\2\2\2\u0240") - buf.write("\u0241\7U\2\2\u0241\u0242\7n\2\2\u0242\u0243\7c\2\2\u0243") - buf.write("\u0244\7x\2\2\u0244\u0245\7g\2\2\u0245\u0246\7T\2\2\u0246") - buf.write("\u0247\7g\2\2\u0247\u0248\7u\2\2\u0248\u0249\7r\2\2\u0249") - buf.write("R\3\2\2\2\u024a\u024b\7U\2\2\u024b\u024c\7e\2\2\u024c") - buf.write("\u024d\7j\2\2\u024d\u024e\7g\2\2\u024e\u024f\7f\2\2\u024f") - buf.write("\u0250\7w\2\2\u0250\u0251\7n\2\2\u0251\u0252\7g\2\2\u0252") - buf.write("\u0253\7a\2\2\u0253\u0254\7v\2\2\u0254\u0255\7c\2\2\u0255") - buf.write("\u0256\7d\2\2\u0256\u0257\7n\2\2\u0257\u0258\7g\2\2\u0258") - buf.write("\u0259\7u\2\2\u0259T\3\2\2\2\u025a\u025b\7f\2\2\u025b") - buf.write("\u025c\7g\2\2\u025c\u025d\7n\2\2\u025d\u025e\7c\2\2\u025e") - buf.write("\u025f\7{\2\2\u025fV\3\2\2\2\u0260\u0261\7C\2\2\u0261") - buf.write("\u0262\7u\2\2\u0262\u0263\7u\2\2\u0263\u0264\7k\2\2\u0264") - buf.write("\u0265\7i\2\2\u0265\u0266\7p\2\2\u0266\u0267\7P\2\2\u0267") - buf.write("\u0268\7C\2\2\u0268\u0269\7F\2\2\u0269X\3\2\2\2\u026a") - buf.write("\u026b\7E\2\2\u026b\u026c\7q\2\2\u026c\u026d\7p\2\2\u026d") - buf.write("\u026e\7f\2\2\u026e\u026f\7k\2\2\u026f\u0270\7v\2\2\u0270") - buf.write("\u0271\7k\2\2\u0271\u0272\7q\2\2\u0272\u0273\7p\2\2\u0273") - buf.write("\u0274\7c\2\2\u0274\u0275\7n\2\2\u0275\u0276\7E\2\2\u0276") - buf.write("\u0277\7j\2\2\u0277\u0278\7c\2\2\u0278\u0279\7p\2\2\u0279") - buf.write("\u027a\7i\2\2\u027a\u027b\7g\2\2\u027b\u027c\7P\2\2\u027c") - buf.write("\u027d\7C\2\2\u027d\u027e\7F\2\2\u027eZ\3\2\2\2\u027f") - buf.write("\u0280\7F\2\2\u0280\u0281\7c\2\2\u0281\u0282\7v\2\2\u0282") - buf.write("\u0283\7c\2\2\u0283\u0284\7F\2\2\u0284\u0285\7w\2\2\u0285") - buf.write("\u0286\7o\2\2\u0286\u0287\7r\2\2\u0287\\\3\2\2\2\u0288") - buf.write("\u0289\7U\2\2\u0289\u028a\7c\2\2\u028a\u028b\7x\2\2\u028b") - buf.write("\u028c\7g\2\2\u028c\u028d\7E\2\2\u028d\u028e\7q\2\2\u028e") - buf.write("\u028f\7p\2\2\u028f\u0290\7h\2\2\u0290\u0291\7k\2\2\u0291") - buf.write("\u0292\7i\2\2\u0292\u0293\7w\2\2\u0293\u0294\7t\2\2\u0294") - buf.write("\u0295\7c\2\2\u0295\u0296\7v\2\2\u0296\u0297\7k\2\2\u0297") - buf.write("\u0298\7q\2\2\u0298\u0299\7p\2\2\u0299^\3\2\2\2\u029a") - buf.write("\u029b\7C\2\2\u029b\u029c\7u\2\2\u029c\u029d\7u\2\2\u029d") - buf.write("\u029e\7k\2\2\u029e\u029f\7i\2\2\u029f\u02a0\7p\2\2\u02a0") - buf.write("\u02a1\7H\2\2\u02a1\u02a2\7t\2\2\u02a2\u02a3\7c\2\2\u02a3") - buf.write("\u02a4\7o\2\2\u02a4\u02a5\7g\2\2\u02a5\u02a6\7K\2\2\u02a6") - buf.write("\u02a7\7f\2\2\u02a7\u02a8\7T\2\2\u02a8\u02a9\7c\2\2\u02a9") - buf.write("\u02aa\7p\2\2\u02aa\u02ab\7i\2\2\u02ab\u02ac\7g\2\2\u02ac") - buf.write("`\3\2\2\2\u02ad\u02ae\7H\2\2\u02ae\u02af\7t\2\2\u02af") - buf.write("\u02b0\7g\2\2\u02b0\u02b1\7g\2\2\u02b1\u02b2\7H\2\2\u02b2") - buf.write("\u02b3\7q\2\2\u02b3\u02b4\7t\2\2\u02b4\u02b5\7o\2\2\u02b5") - buf.write("\u02b6\7c\2\2\u02b6\u02b7\7v\2\2\u02b7b\3\2\2\2\u02b8") - buf.write("\u02b9\7C\2\2\u02b9\u02ba\7u\2\2\u02ba\u02bb\7u\2\2\u02bb") - buf.write("\u02bc\7k\2\2\u02bc\u02bd\7i\2\2\u02bd\u02be\7p\2\2\u02be") - buf.write("\u02bf\7H\2\2\u02bf\u02c0\7t\2\2\u02c0\u02c1\7c\2\2\u02c1") - buf.write("\u02c2\7o\2\2\u02c2\u02c3\7g\2\2\u02c3\u02c4\7K\2\2\u02c4") - buf.write("\u02c5\7f\2\2\u02c5d\3\2\2\2\u02c6\u02c7\7U\2\2\u02c7") - buf.write("\u02c8\7k\2\2\u02c8\u02c9\7i\2\2\u02c9\u02ca\7p\2\2\u02ca") - buf.write("\u02cb\7c\2\2\u02cb\u02cc\7n\2\2\u02cc\u02cd\7a\2\2\u02cd") - buf.write("\u02ce\7g\2\2\u02ce\u02cf\7p\2\2\u02cf\u02d0\7e\2\2\u02d0") - buf.write("\u02d1\7q\2\2\u02d1\u02d2\7f\2\2\u02d2\u02d3\7k\2\2\u02d3") - buf.write("\u02d4\7p\2\2\u02d4\u02d5\7i\2\2\u02d5\u02d6\7a\2\2\u02d6") - buf.write("\u02d7\7v\2\2\u02d7\u02d8\7{\2\2\u02d8\u02d9\7r\2\2\u02d9") - buf.write("\u02da\7g\2\2\u02da\u02db\7u\2\2\u02dbf\3\2\2\2\u02dc") - buf.write("\u02dd\7n\2\2\u02dd\u02de\7q\2\2\u02de\u02df\7i\2\2\u02df") - buf.write("\u02e0\7k\2\2\u02e0\u02e1\7e\2\2\u02e1\u02e2\7c\2\2\u02e2") - buf.write("\u02e3\7n\2\2\u02e3\u02e4\7a\2\2\u02e4\u02e5\7x\2\2\u02e5") - buf.write("\u02e6\7c\2\2\u02e6\u02e7\7n\2\2\u02e7\u02e8\7w\2\2\u02e8") - buf.write("\u02e9\7g\2\2\u02e9h\3\2\2\2\u02ea\u02eb\7r\2\2\u02eb") - buf.write("\u02ec\7j\2\2\u02ec\u02ed\7{\2\2\u02ed\u02ee\7u\2\2\u02ee") - buf.write("\u02ef\7k\2\2\u02ef\u02f0\7e\2\2\u02f0\u02f1\7c\2\2\u02f1") - buf.write("\u02f2\7n\2\2\u02f2\u02f3\7a\2\2\u02f3\u02f4\7x\2\2\u02f4") - buf.write("\u02f5\7c\2\2\u02f5\u02f6\7n\2\2\u02f6\u02f7\7w\2\2\u02f7") - buf.write("\u02f8\7g\2\2\u02f8j\3\2\2\2\u02f9\u02fa\7d\2\2\u02fa") - buf.write("\u02fb\7e\2\2\u02fb\u02fc\7f\2\2\u02fc\u02fd\7a\2\2\u02fd") - buf.write("\u02fe\7x\2\2\u02fe\u02ff\7c\2\2\u02ff\u0300\7n\2\2\u0300") - buf.write("\u0301\7w\2\2\u0301\u0302\7g\2\2\u0302l\3\2\2\2\u0303") - buf.write("\u0304\7c\2\2\u0304\u0305\7u\2\2\u0305\u0306\7e\2\2\u0306") - buf.write("\u0307\7k\2\2\u0307\u0308\7k\2\2\u0308\u0309\7a\2\2\u0309") - buf.write("\u030a\7x\2\2\u030a\u030b\7c\2\2\u030b\u030c\7n\2\2\u030c") - buf.write("\u030d\7w\2\2\u030d\u030e\7g\2\2\u030en\3\2\2\2\u030f") - buf.write("\u0310\7U\2\2\u0310\u0311\7k\2\2\u0311\u0312\7i\2\2\u0312") - buf.write("\u0313\7p\2\2\u0313\u0314\7c\2\2\u0314\u0315\7n\2\2\u0315") - buf.write("\u0316\7a\2\2\u0316\u0317\7t\2\2\u0317\u0318\7g\2\2\u0318") - buf.write("\u0319\7r\2\2\u0319\u031a\7t\2\2\u031a\u031b\7g\2\2\u031b") - buf.write("\u031c\7u\2\2\u031c\u031d\7g\2\2\u031d\u031e\7p\2\2\u031e") - buf.write("\u031f\7v\2\2\u031f\u0320\7c\2\2\u0320\u0321\7v\2\2\u0321") - buf.write("\u0322\7k\2\2\u0322\u0323\7q\2\2\u0323\u0324\7p\2\2\u0324") - buf.write("p\3\2\2\2\u0325\u0329\t\2\2\2\u0326\u0328\t\3\2\2\u0327") - buf.write("\u0326\3\2\2\2\u0328\u032b\3\2\2\2\u0329\u0327\3\2\2\2") - buf.write("\u0329\u032a\3\2\2\2\u032ar\3\2\2\2\u032b\u0329\3\2\2") - buf.write("\2\u032c\u032e\t\4\2\2\u032d\u032f\t\5\2\2\u032e\u032d") - buf.write("\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u0331\3\2\2\2\u0330") - buf.write("\u0332\4\62;\2\u0331\u0330\3\2\2\2\u0332\u0333\3\2\2\2") - buf.write("\u0333\u0331\3\2\2\2\u0333\u0334\3\2\2\2\u0334t\3\2\2") - buf.write("\2\u0335\u0337\5\u0081A\2\u0336\u0335\3\2\2\2\u0336\u0337") - buf.write("\3\2\2\2\u0337\u0356\3\2\2\2\u0338\u033a\4\62;\2\u0339") - buf.write("\u0338\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u0339\3\2\2\2") - buf.write("\u033b\u033c\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u0341\7") - buf.write("\60\2\2\u033e\u0340\4\62;\2\u033f\u033e\3\2\2\2\u0340") - buf.write("\u0343\3\2\2\2\u0341\u033f\3\2\2\2\u0341\u0342\3\2\2\2") - buf.write("\u0342\u0345\3\2\2\2\u0343\u0341\3\2\2\2\u0344\u0346\5") - buf.write("s:\2\u0345\u0344\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0357") - buf.write("\3\2\2\2\u0347\u0349\7\60\2\2\u0348\u034a\4\62;\2\u0349") - buf.write("\u0348\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u0349\3\2\2\2") - buf.write("\u034b\u034c\3\2\2\2\u034c\u034e\3\2\2\2\u034d\u034f\5") - buf.write("s:\2\u034e\u034d\3\2\2\2\u034e\u034f\3\2\2\2\u034f\u0357") - buf.write("\3\2\2\2\u0350\u0352\4\62;\2\u0351\u0350\3\2\2\2\u0352") - buf.write("\u0353\3\2\2\2\u0353\u0351\3\2\2\2\u0353\u0354\3\2\2\2") - buf.write("\u0354\u0355\3\2\2\2\u0355\u0357\5s:\2\u0356\u0339\3\2") - buf.write("\2\2\u0356\u0347\3\2\2\2\u0356\u0351\3\2\2\2\u0357v\3") - buf.write("\2\2\2\u0358\u035a\5\u0081A\2\u0359\u0358\3\2\2\2\u0359") - buf.write("\u035a\3\2\2\2\u035a\u035c\3\2\2\2\u035b\u035d\4\62;\2") - buf.write("\u035c\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035e\u035c\3") - buf.write("\2\2\2\u035e\u035f\3\2\2\2\u035fx\3\2\2\2\u0360\u0361") - buf.write("\7^\2\2\u0361\u0362\t\6\2\2\u0362z\3\2\2\2\u0363\u0364") - buf.write("\t\7\2\2\u0364\u0365\3\2\2\2\u0365\u0366\b>\2\2\u0366") - buf.write("|\3\2\2\2\u0367\u0368\7\61\2\2\u0368\u0369\7\61\2\2\u0369") - buf.write("\u036d\3\2\2\2\u036a\u036c\n\b\2\2\u036b\u036a\3\2\2\2") - buf.write("\u036c\u036f\3\2\2\2\u036d\u036b\3\2\2\2\u036d\u036e\3") - buf.write("\2\2\2\u036e\u0373\3\2\2\2\u036f\u036d\3\2\2\2\u0370\u0372") - buf.write("\7\17\2\2\u0371\u0370\3\2\2\2\u0372\u0375\3\2\2\2\u0373") - buf.write("\u0371\3\2\2\2\u0373\u0374\3\2\2\2\u0374\u0376\3\2\2\2") - buf.write("\u0375\u0373\3\2\2\2\u0376\u0383\7\f\2\2\u0377\u0378\7") - buf.write("\61\2\2\u0378\u0379\7,\2\2\u0379\u037d\3\2\2\2\u037a\u037c") - buf.write("\13\2\2\2\u037b\u037a\3\2\2\2\u037c\u037f\3\2\2\2\u037d") - buf.write("\u037e\3\2\2\2\u037d\u037b\3\2\2\2\u037e\u0380\3\2\2\2") - buf.write("\u037f\u037d\3\2\2\2\u0380\u0381\7,\2\2\u0381\u0383\7") - buf.write("\61\2\2\u0382\u0367\3\2\2\2\u0382\u0377\3\2\2\2\u0383") - buf.write("\u0384\3\2\2\2\u0384\u0385\b?\2\2\u0385~\3\2\2\2\u0386") - buf.write("\u038b\7$\2\2\u0387\u038a\5y=\2\u0388\u038a\n\t\2\2\u0389") - buf.write("\u0387\3\2\2\2\u0389\u0388\3\2\2\2\u038a\u038d\3\2\2\2") - buf.write("\u038b\u0389\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038e\3") - buf.write("\2\2\2\u038d\u038b\3\2\2\2\u038e\u038f\7$\2\2\u038f\u0080") - buf.write("\3\2\2\2\u0390\u0391\t\5\2\2\u0391\u0082\3\2\2\2\26\2") - buf.write("\u0329\u032e\u0333\u0336\u033b\u0341\u0345\u034b\u034e") - buf.write("\u0353\u0356\u0359\u035e\u036d\u0373\u037d\u0382\u0389") - buf.write("\u038b\3\2\3\2") + buf.write("w\u0081?\u0083@\u0085A\3\2\f\5\2C\\aac|") + buf.write("\6\2\62;C\\aac|\4\2GGgg\4\2--//\4\2ZZzz\5\2\62;CHch\n") + buf.write("\2$$))^^ddhhppttvv\5\2\13\f\17\17\"\"\4\2\f\f\17\17\4") + buf.write("\2$$^^\2\u03b0\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t") + buf.write("\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3") + buf.write("\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2") + buf.write("\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2") + buf.write("\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2") + buf.write("\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65") + buf.write("\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2") + buf.write("\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2") + buf.write("\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2") + buf.write("\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3") + buf.write("\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e") + buf.write("\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2") + buf.write("o\3\2\2\2\2q\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2") + buf.write("\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085") + buf.write("\3\2\2\2\3\u0087\3\2\2\2\5\u009c\3\2\2\2\7\u009e\3\2\2") + buf.write("\2\t\u00b3\3\2\2\2\13\u00b5\3\2\2\2\r\u00ca\3\2\2\2\17") + buf.write("\u00dc\3\2\2\2\21\u00e6\3\2\2\2\23\u00eb\3\2\2\2\25\u00f8") + buf.write("\3\2\2\2\27\u00fe\3\2\2\2\31\u0100\3\2\2\2\33\u0107\3") + buf.write("\2\2\2\35\u0109\3\2\2\2\37\u010b\3\2\2\2!\u010e\3\2\2") + buf.write("\2#\u0115\3\2\2\2%\u0117\3\2\2\2\'\u0127\3\2\2\2)\u0134") + buf.write("\3\2\2\2+\u0143\3\2\2\2-\u014f\3\2\2\2/\u015a\3\2\2\2") + buf.write("\61\u0169\3\2\2\2\63\u017d\3\2\2\2\65\u0184\3\2\2\2\67") + buf.write("\u018b\3\2\2\29\u0198\3\2\2\2;\u01a5\3\2\2\2=\u01b9\3") + buf.write("\2\2\2?\u01c3\3\2\2\2A\u01d1\3\2\2\2C\u01d9\3\2\2\2E\u01ec") + buf.write("\3\2\2\2G\u01fa\3\2\2\2I\u0201\3\2\2\2K\u0211\3\2\2\2") + buf.write("M\u0228\3\2\2\2O\u023a\3\2\2\2Q\u0244\3\2\2\2S\u024e\3") + buf.write("\2\2\2U\u025e\3\2\2\2W\u0264\3\2\2\2Y\u026e\3\2\2\2[\u0283") + buf.write("\3\2\2\2]\u028c\3\2\2\2_\u029e\3\2\2\2a\u02b1\3\2\2\2") + buf.write("c\u02bc\3\2\2\2e\u02ca\3\2\2\2g\u02e0\3\2\2\2i\u02ee\3") + buf.write("\2\2\2k\u02fd\3\2\2\2m\u0307\3\2\2\2o\u0313\3\2\2\2q\u0329") + buf.write("\3\2\2\2s\u0330\3\2\2\2u\u033a\3\2\2\2w\u035d\3\2\2\2") + buf.write("y\u0364\3\2\2\2{\u036b\3\2\2\2}\u036d\3\2\2\2\177\u0370") + buf.write("\3\2\2\2\u0081\u038f\3\2\2\2\u0083\u0393\3\2\2\2\u0085") + buf.write("\u039d\3\2\2\2\u0087\u0088\7N\2\2\u0088\u0089\7K\2\2\u0089") + buf.write("\u008a\7P\2\2\u008a\u008b\7a\2\2\u008b\u008c\7f\2\2\u008c") + buf.write("\u008d\7g\2\2\u008d\u008e\7u\2\2\u008e\u008f\7e\2\2\u008f") + buf.write("\u0090\7t\2\2\u0090\u0091\7k\2\2\u0091\u0092\7r\2\2\u0092") + buf.write("\u0093\7v\2\2\u0093\u0094\7k\2\2\u0094\u0095\7q\2\2\u0095") + buf.write("\u0096\7p\2\2\u0096\u0097\7a\2\2\u0097\u0098\7h\2\2\u0098") + buf.write("\u0099\7k\2\2\u0099\u009a\7n\2\2\u009a\u009b\7g\2\2\u009b") + buf.write("\4\3\2\2\2\u009c\u009d\7=\2\2\u009d\6\3\2\2\2\u009e\u009f") + buf.write("\7N\2\2\u009f\u00a0\7K\2\2\u00a0\u00a1\7P\2\2\u00a1\u00a2") + buf.write("\7a\2\2\u00a2\u00a3\7r\2\2\u00a3\u00a4\7t\2\2\u00a4\u00a5") + buf.write("\7q\2\2\u00a5\u00a6\7v\2\2\u00a6\u00a7\7q\2\2\u00a7\u00a8") + buf.write("\7e\2\2\u00a8\u00a9\7q\2\2\u00a9\u00aa\7n\2\2\u00aa\u00ab") + buf.write("\7a\2\2\u00ab\u00ac\7x\2\2\u00ac\u00ad\7g\2\2\u00ad\u00ae") + buf.write("\7t\2\2\u00ae\u00af\7u\2\2\u00af\u00b0\7k\2\2\u00b0\u00b1") + buf.write("\7q\2\2\u00b1\u00b2\7p\2\2\u00b2\b\3\2\2\2\u00b3\u00b4") + buf.write("\7?\2\2\u00b4\n\3\2\2\2\u00b5\u00b6\7N\2\2\u00b6\u00b7") + buf.write("\7K\2\2\u00b7\u00b8\7P\2\2\u00b8\u00b9\7a\2\2\u00b9\u00ba") + buf.write("\7n\2\2\u00ba\u00bb\7c\2\2\u00bb\u00bc\7p\2\2\u00bc\u00bd") + buf.write("\7i\2\2\u00bd\u00be\7w\2\2\u00be\u00bf\7c\2\2\u00bf\u00c0") + buf.write("\7i\2\2\u00c0\u00c1\7g\2\2\u00c1\u00c2\7a\2\2\u00c2\u00c3") + buf.write("\7x\2\2\u00c3\u00c4\7g\2\2\u00c4\u00c5\7t\2\2\u00c5\u00c6") + buf.write("\7u\2\2\u00c6\u00c7\7k\2\2\u00c7\u00c8\7q\2\2\u00c8\u00c9") + buf.write("\7p\2\2\u00c9\f\3\2\2\2\u00ca\u00cb\7N\2\2\u00cb\u00cc") + buf.write("\7F\2\2\u00cc\u00cd\7H\2\2\u00cd\u00ce\7a\2\2\u00ce\u00cf") + buf.write("\7h\2\2\u00cf\u00d0\7k\2\2\u00d0\u00d1\7n\2\2\u00d1\u00d2") + buf.write("\7g\2\2\u00d2\u00d3\7a\2\2\u00d3\u00d4\7t\2\2\u00d4\u00d5") + buf.write("\7g\2\2\u00d5\u00d6\7x\2\2\u00d6\u00d7\7k\2\2\u00d7\u00d8") + buf.write("\7u\2\2\u00d8\u00d9\7k\2\2\u00d9\u00da\7q\2\2\u00da\u00db") + buf.write("\7p\2\2\u00db\16\3\2\2\2\u00dc\u00dd\7N\2\2\u00dd\u00de") + buf.write("\7K\2\2\u00de\u00df\7P\2\2\u00df\u00e0\7a\2\2\u00e0\u00e1") + buf.write("\7u\2\2\u00e1\u00e2\7r\2\2\u00e2\u00e3\7g\2\2\u00e3\u00e4") + buf.write("\7g\2\2\u00e4\u00e5\7f\2\2\u00e5\20\3\2\2\2\u00e6\u00e7") + buf.write("\7m\2\2\u00e7\u00e8\7d\2\2\u00e8\u00e9\7r\2\2\u00e9\u00ea") + buf.write("\7u\2\2\u00ea\22\3\2\2\2\u00eb\u00ec\7E\2\2\u00ec\u00ed") + buf.write("\7j\2\2\u00ed\u00ee\7c\2\2\u00ee\u00ef\7p\2\2\u00ef\u00f0") + buf.write("\7p\2\2\u00f0\u00f1\7g\2\2\u00f1\u00f2\7n\2\2\u00f2\u00f3") + buf.write("\7a\2\2\u00f3\u00f4\7p\2\2\u00f4\u00f5\7c\2\2\u00f5\u00f6") + buf.write("\7o\2\2\u00f6\u00f7\7g\2\2\u00f7\24\3\2\2\2\u00f8\u00f9") + buf.write("\7P\2\2\u00f9\u00fa\7q\2\2\u00fa\u00fb\7f\2\2\u00fb\u00fc") + buf.write("\7g\2\2\u00fc\u00fd\7u\2\2\u00fd\26\3\2\2\2\u00fe\u00ff") + buf.write("\7}\2\2\u00ff\30\3\2\2\2\u0100\u0101\7O\2\2\u0101\u0102") + buf.write("\7c\2\2\u0102\u0103\7u\2\2\u0103\u0104\7v\2\2\u0104\u0105") + buf.write("\7g\2\2\u0105\u0106\7t\2\2\u0106\32\3\2\2\2\u0107\u0108") + buf.write("\7<\2\2\u0108\34\3\2\2\2\u0109\u010a\7.\2\2\u010a\36\3") + buf.write("\2\2\2\u010b\u010c\7o\2\2\u010c\u010d\7u\2\2\u010d \3") + buf.write("\2\2\2\u010e\u010f\7U\2\2\u010f\u0110\7n\2\2\u0110\u0111") + buf.write("\7c\2\2\u0111\u0112\7x\2\2\u0112\u0113\7g\2\2\u0113\u0114") + buf.write("\7u\2\2\u0114\"\3\2\2\2\u0115\u0116\7\177\2\2\u0116$\3") + buf.write("\2\2\2\u0117\u0118\7P\2\2\u0118\u0119\7q\2\2\u0119\u011a") + buf.write("\7f\2\2\u011a\u011b\7g\2\2\u011b\u011c\7a\2\2\u011c\u011d") + buf.write("\7c\2\2\u011d\u011e\7v\2\2\u011e\u011f\7v\2\2\u011f\u0120") + buf.write("\7t\2\2\u0120\u0121\7k\2\2\u0121\u0122\7d\2\2\u0122\u0123") + buf.write("\7w\2\2\u0123\u0124\7v\2\2\u0124\u0125\7g\2\2\u0125\u0126") + buf.write("\7u\2\2\u0126&\3\2\2\2\u0127\u0128\7N\2\2\u0128\u0129") + buf.write("\7K\2\2\u0129\u012a\7P\2\2\u012a\u012b\7a\2\2\u012b\u012c") + buf.write("\7r\2\2\u012c\u012d\7t\2\2\u012d\u012e\7q\2\2\u012e\u012f") + buf.write("\7v\2\2\u012f\u0130\7q\2\2\u0130\u0131\7e\2\2\u0131\u0132") + buf.write("\7q\2\2\u0132\u0133\7n\2\2\u0133(\3\2\2\2\u0134\u0135") + buf.write("\7e\2\2\u0135\u0136\7q\2\2\u0136\u0137\7p\2\2\u0137\u0138") + buf.write("\7h\2\2\u0138\u0139\7k\2\2\u0139\u013a\7i\2\2\u013a\u013b") + buf.write("\7w\2\2\u013b\u013c\7t\2\2\u013c\u013d\7g\2\2\u013d\u013e") + buf.write("\7f\2\2\u013e\u013f\7a\2\2\u013f\u0140\7P\2\2\u0140\u0141") + buf.write("\7C\2\2\u0141\u0142\7F\2\2\u0142*\3\2\2\2\u0143\u0144") + buf.write("\7k\2\2\u0144\u0145\7p\2\2\u0145\u0146\7k\2\2\u0146\u0147") + buf.write("\7v\2\2\u0147\u0148\7k\2\2\u0148\u0149\7c\2\2\u0149\u014a") + buf.write("\7n\2\2\u014a\u014b\7a\2\2\u014b\u014c\7P\2\2\u014c\u014d") + buf.write("\7C\2\2\u014d\u014e\7F\2\2\u014e,\3\2\2\2\u014f\u0150") + buf.write("\7r\2\2\u0150\u0151\7t\2\2\u0151\u0152\7q\2\2\u0152\u0153") + buf.write("\7f\2\2\u0153\u0154\7w\2\2\u0154\u0155\7e\2\2\u0155\u0156") + buf.write("\7v\2\2\u0156\u0157\7a\2\2\u0157\u0158\7k\2\2\u0158\u0159") + buf.write("\7f\2\2\u0159.\3\2\2\2\u015a\u015b\7t\2\2\u015b\u015c") + buf.write("\7g\2\2\u015c\u015d\7u\2\2\u015d\u015e\7r\2\2\u015e\u015f") + buf.write("\7q\2\2\u015f\u0160\7p\2\2\u0160\u0161\7u\2\2\u0161\u0162") + buf.write("\7g\2\2\u0162\u0163\7a\2\2\u0163\u0164\7g\2\2\u0164\u0165") + buf.write("\7t\2\2\u0165\u0166\7t\2\2\u0166\u0167\7q\2\2\u0167\u0168") + buf.write("\7t\2\2\u0168\60\3\2\2\2\u0169\u016a\7h\2\2\u016a\u016b") + buf.write("\7c\2\2\u016b\u016c\7w\2\2\u016c\u016d\7n\2\2\u016d\u016e") + buf.write("\7v\2\2\u016e\u016f\7a\2\2\u016f\u0170\7u\2\2\u0170\u0171") + buf.write("\7v\2\2\u0171\u0172\7c\2\2\u0172\u0173\7v\2\2\u0173\u0174") + buf.write("\7g\2\2\u0174\u0175\7a\2\2\u0175\u0176\7u\2\2\u0176\u0177") + buf.write("\7k\2\2\u0177\u0178\7i\2\2\u0178\u0179\7p\2\2\u0179\u017a") + buf.write("\7c\2\2\u017a\u017b\7n\2\2\u017b\u017c\7u\2\2\u017c\62") + buf.write("\3\2\2\2\u017d\u017e\7R\2\2\u017e\u017f\7\64\2\2\u017f") + buf.write("\u0180\7a\2\2\u0180\u0181\7o\2\2\u0181\u0182\7k\2\2\u0182") + buf.write("\u0183\7p\2\2\u0183\64\3\2\2\2\u0184\u0185\7U\2\2\u0185") + buf.write("\u0186\7V\2\2\u0186\u0187\7a\2\2\u0187\u0188\7o\2\2\u0188") + buf.write("\u0189\7k\2\2\u0189\u018a\7p\2\2\u018a\66\3\2\2\2\u018b") + buf.write("\u018c\7P\2\2\u018c\u018d\7a\2\2\u018d\u018e\7C\2\2\u018e") + buf.write("\u018f\7u\2\2\u018f\u0190\7a\2\2\u0190\u0191\7v\2\2\u0191") + buf.write("\u0192\7k\2\2\u0192\u0193\7o\2\2\u0193\u0194\7g\2\2\u0194") + buf.write("\u0195\7q\2\2\u0195\u0196\7w\2\2\u0196\u0197\7v\2\2\u0197") + buf.write("8\3\2\2\2\u0198\u0199\7P\2\2\u0199\u019a\7a\2\2\u019a") + buf.write("\u019b\7E\2\2\u019b\u019c\7t\2\2\u019c\u019d\7a\2\2\u019d") + buf.write("\u019e\7v\2\2\u019e\u019f\7k\2\2\u019f\u01a0\7o\2\2\u01a0") + buf.write("\u01a1\7g\2\2\u01a1\u01a2\7q\2\2\u01a2\u01a3\7w\2\2\u01a3") + buf.write("\u01a4\7v\2\2\u01a4:\3\2\2\2\u01a5\u01a6\7e\2\2\u01a6") + buf.write("\u01a7\7q\2\2\u01a7\u01a8\7p\2\2\u01a8\u01a9\7h\2\2\u01a9") + buf.write("\u01aa\7k\2\2\u01aa\u01ab\7i\2\2\u01ab\u01ac\7w\2\2\u01ac") + buf.write("\u01ad\7t\2\2\u01ad\u01ae\7c\2\2\u01ae\u01af\7d\2\2\u01af") + buf.write("\u01b0\7n\2\2\u01b0\u01b1\7g\2\2\u01b1\u01b2\7a\2\2\u01b2") + buf.write("\u01b3\7h\2\2\u01b3\u01b4\7t\2\2\u01b4\u01b5\7c\2\2\u01b5") + buf.write("\u01b6\7o\2\2\u01b6\u01b7\7g\2\2\u01b7\u01b8\7u\2\2\u01b8") + buf.write("<\3\2\2\2\u01b9\u01ba\7e\2\2\u01ba\u01bb\7q\2\2\u01bb") + buf.write("\u01bc\7o\2\2\u01bc\u01bd\7r\2\2\u01bd\u01be\7q\2\2\u01be") + buf.write("\u01bf\7u\2\2\u01bf\u01c0\7k\2\2\u01c0\u01c1\7v\2\2\u01c1") + buf.write("\u01c2\7g\2\2\u01c2>\3\2\2\2\u01c3\u01c4\7e\2\2\u01c4") + buf.write("\u01c5\7q\2\2\u01c5\u01c6\7p\2\2\u01c6\u01c7\7h\2\2\u01c7") + buf.write("\u01c8\7k\2\2\u01c8\u01c9\7i\2\2\u01c9\u01ca\7w\2\2\u01ca") + buf.write("\u01cb\7t\2\2\u01cb\u01cc\7c\2\2\u01cc\u01cd\7v\2\2\u01cd") + buf.write("\u01ce\7k\2\2\u01ce\u01cf\7q\2\2\u01cf\u01d0\7p\2\2\u01d0") + buf.write("@\3\2\2\2\u01d1\u01d2\7U\2\2\u01d2\u01d3\7k\2\2\u01d3") + buf.write("\u01d4\7i\2\2\u01d4\u01d5\7p\2\2\u01d5\u01d6\7c\2\2\u01d6") + buf.write("\u01d7\7n\2\2\u01d7\u01d8\7u\2\2\u01d8B\3\2\2\2\u01d9") + buf.write("\u01da\7F\2\2\u01da\u01db\7k\2\2\u01db\u01dc\7c\2\2\u01dc") + buf.write("\u01dd\7i\2\2\u01dd\u01de\7p\2\2\u01de\u01df\7q\2\2\u01df") + buf.write("\u01e0\7u\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7k\2\2\u01e2") + buf.write("\u01e3\7e\2\2\u01e3\u01e4\7a\2\2\u01e4\u01e5\7u\2\2\u01e5") + buf.write("\u01e6\7k\2\2\u01e6\u01e7\7i\2\2\u01e7\u01e8\7p\2\2\u01e8") + buf.write("\u01e9\7c\2\2\u01e9\u01ea\7n\2\2\u01ea\u01eb\7u\2\2\u01eb") + buf.write("D\3\2\2\2\u01ec\u01ed\7U\2\2\u01ed\u01ee\7k\2\2\u01ee") + buf.write("\u01ef\7i\2\2\u01ef\u01f0\7p\2\2\u01f0\u01f1\7c\2\2\u01f1") + buf.write("\u01f2\7n\2\2\u01f2\u01f3\7a\2\2\u01f3\u01f4\7i\2\2\u01f4") + buf.write("\u01f5\7t\2\2\u01f5\u01f6\7q\2\2\u01f6\u01f7\7w\2\2\u01f7") + buf.write("\u01f8\7r\2\2\u01f8\u01f9\7u\2\2\u01f9F\3\2\2\2\u01fa") + buf.write("\u01fb\7H\2\2\u01fb\u01fc\7t\2\2\u01fc\u01fd\7c\2\2\u01fd") + buf.write("\u01fe\7o\2\2\u01fe\u01ff\7g\2\2\u01ff\u0200\7u\2\2\u0200") + buf.write("H\3\2\2\2\u0201\u0202\7U\2\2\u0202\u0203\7r\2\2\u0203") + buf.write("\u0204\7q\2\2\u0204\u0205\7t\2\2\u0205\u0206\7c\2\2\u0206") + buf.write("\u0207\7f\2\2\u0207\u0208\7k\2\2\u0208\u0209\7e\2\2\u0209") + buf.write("\u020a\7a\2\2\u020a\u020b\7h\2\2\u020b\u020c\7t\2\2\u020c") + buf.write("\u020d\7c\2\2\u020d\u020e\7o\2\2\u020e\u020f\7g\2\2\u020f") + buf.write("\u0210\7u\2\2\u0210J\3\2\2\2\u0211\u0212\7G\2\2\u0212") + buf.write("\u0213\7x\2\2\u0213\u0214\7g\2\2\u0214\u0215\7p\2\2\u0215") + buf.write("\u0216\7v\2\2\u0216\u0217\7a\2\2\u0217\u0218\7v\2\2\u0218") + buf.write("\u0219\7t\2\2\u0219\u021a\7k\2\2\u021a\u021b\7i\2\2\u021b") + buf.write("\u021c\7i\2\2\u021c\u021d\7g\2\2\u021d\u021e\7t\2\2\u021e") + buf.write("\u021f\7g\2\2\u021f\u0220\7f\2\2\u0220\u0221\7a\2\2\u0221") + buf.write("\u0222\7h\2\2\u0222\u0223\7t\2\2\u0223\u0224\7c\2\2\u0224") + buf.write("\u0225\7o\2\2\u0225\u0226\7g\2\2\u0226\u0227\7u\2\2\u0227") + buf.write("L\3\2\2\2\u0228\u0229\7F\2\2\u0229\u022a\7k\2\2\u022a") + buf.write("\u022b\7c\2\2\u022b\u022c\7i\2\2\u022c\u022d\7p\2\2\u022d") + buf.write("\u022e\7q\2\2\u022e\u022f\7u\2\2\u022f\u0230\7v\2\2\u0230") + buf.write("\u0231\7k\2\2\u0231\u0232\7e\2\2\u0232\u0233\7a\2\2\u0233") + buf.write("\u0234\7h\2\2\u0234\u0235\7t\2\2\u0235\u0236\7c\2\2\u0236") + buf.write("\u0237\7o\2\2\u0237\u0238\7g\2\2\u0238\u0239\7u\2\2\u0239") + buf.write("N\3\2\2\2\u023a\u023b\7O\2\2\u023b\u023c\7c\2\2\u023c") + buf.write("\u023d\7u\2\2\u023d\u023e\7v\2\2\u023e\u023f\7g\2\2\u023f") + buf.write("\u0240\7t\2\2\u0240\u0241\7T\2\2\u0241\u0242\7g\2\2\u0242") + buf.write("\u0243\7s\2\2\u0243P\3\2\2\2\u0244\u0245\7U\2\2\u0245") + buf.write("\u0246\7n\2\2\u0246\u0247\7c\2\2\u0247\u0248\7x\2\2\u0248") + buf.write("\u0249\7g\2\2\u0249\u024a\7T\2\2\u024a\u024b\7g\2\2\u024b") + buf.write("\u024c\7u\2\2\u024c\u024d\7r\2\2\u024dR\3\2\2\2\u024e") + buf.write("\u024f\7U\2\2\u024f\u0250\7e\2\2\u0250\u0251\7j\2\2\u0251") + buf.write("\u0252\7g\2\2\u0252\u0253\7f\2\2\u0253\u0254\7w\2\2\u0254") + buf.write("\u0255\7n\2\2\u0255\u0256\7g\2\2\u0256\u0257\7a\2\2\u0257") + buf.write("\u0258\7v\2\2\u0258\u0259\7c\2\2\u0259\u025a\7d\2\2\u025a") + buf.write("\u025b\7n\2\2\u025b\u025c\7g\2\2\u025c\u025d\7u\2\2\u025d") + buf.write("T\3\2\2\2\u025e\u025f\7f\2\2\u025f\u0260\7g\2\2\u0260") + buf.write("\u0261\7n\2\2\u0261\u0262\7c\2\2\u0262\u0263\7{\2\2\u0263") + buf.write("V\3\2\2\2\u0264\u0265\7C\2\2\u0265\u0266\7u\2\2\u0266") + buf.write("\u0267\7u\2\2\u0267\u0268\7k\2\2\u0268\u0269\7i\2\2\u0269") + buf.write("\u026a\7p\2\2\u026a\u026b\7P\2\2\u026b\u026c\7C\2\2\u026c") + buf.write("\u026d\7F\2\2\u026dX\3\2\2\2\u026e\u026f\7E\2\2\u026f") + buf.write("\u0270\7q\2\2\u0270\u0271\7p\2\2\u0271\u0272\7f\2\2\u0272") + buf.write("\u0273\7k\2\2\u0273\u0274\7v\2\2\u0274\u0275\7k\2\2\u0275") + buf.write("\u0276\7q\2\2\u0276\u0277\7p\2\2\u0277\u0278\7c\2\2\u0278") + buf.write("\u0279\7n\2\2\u0279\u027a\7E\2\2\u027a\u027b\7j\2\2\u027b") + buf.write("\u027c\7c\2\2\u027c\u027d\7p\2\2\u027d\u027e\7i\2\2\u027e") + buf.write("\u027f\7g\2\2\u027f\u0280\7P\2\2\u0280\u0281\7C\2\2\u0281") + buf.write("\u0282\7F\2\2\u0282Z\3\2\2\2\u0283\u0284\7F\2\2\u0284") + buf.write("\u0285\7c\2\2\u0285\u0286\7v\2\2\u0286\u0287\7c\2\2\u0287") + buf.write("\u0288\7F\2\2\u0288\u0289\7w\2\2\u0289\u028a\7o\2\2\u028a") + buf.write("\u028b\7r\2\2\u028b\\\3\2\2\2\u028c\u028d\7U\2\2\u028d") + buf.write("\u028e\7c\2\2\u028e\u028f\7x\2\2\u028f\u0290\7g\2\2\u0290") + buf.write("\u0291\7E\2\2\u0291\u0292\7q\2\2\u0292\u0293\7p\2\2\u0293") + buf.write("\u0294\7h\2\2\u0294\u0295\7k\2\2\u0295\u0296\7i\2\2\u0296") + buf.write("\u0297\7w\2\2\u0297\u0298\7t\2\2\u0298\u0299\7c\2\2\u0299") + buf.write("\u029a\7v\2\2\u029a\u029b\7k\2\2\u029b\u029c\7q\2\2\u029c") + buf.write("\u029d\7p\2\2\u029d^\3\2\2\2\u029e\u029f\7C\2\2\u029f") + buf.write("\u02a0\7u\2\2\u02a0\u02a1\7u\2\2\u02a1\u02a2\7k\2\2\u02a2") + buf.write("\u02a3\7i\2\2\u02a3\u02a4\7p\2\2\u02a4\u02a5\7H\2\2\u02a5") + buf.write("\u02a6\7t\2\2\u02a6\u02a7\7c\2\2\u02a7\u02a8\7o\2\2\u02a8") + buf.write("\u02a9\7g\2\2\u02a9\u02aa\7K\2\2\u02aa\u02ab\7f\2\2\u02ab") + buf.write("\u02ac\7T\2\2\u02ac\u02ad\7c\2\2\u02ad\u02ae\7p\2\2\u02ae") + buf.write("\u02af\7i\2\2\u02af\u02b0\7g\2\2\u02b0`\3\2\2\2\u02b1") + buf.write("\u02b2\7H\2\2\u02b2\u02b3\7t\2\2\u02b3\u02b4\7g\2\2\u02b4") + buf.write("\u02b5\7g\2\2\u02b5\u02b6\7H\2\2\u02b6\u02b7\7q\2\2\u02b7") + buf.write("\u02b8\7t\2\2\u02b8\u02b9\7o\2\2\u02b9\u02ba\7c\2\2\u02ba") + buf.write("\u02bb\7v\2\2\u02bbb\3\2\2\2\u02bc\u02bd\7C\2\2\u02bd") + buf.write("\u02be\7u\2\2\u02be\u02bf\7u\2\2\u02bf\u02c0\7k\2\2\u02c0") + buf.write("\u02c1\7i\2\2\u02c1\u02c2\7p\2\2\u02c2\u02c3\7H\2\2\u02c3") + buf.write("\u02c4\7t\2\2\u02c4\u02c5\7c\2\2\u02c5\u02c6\7o\2\2\u02c6") + buf.write("\u02c7\7g\2\2\u02c7\u02c8\7K\2\2\u02c8\u02c9\7f\2\2\u02c9") + buf.write("d\3\2\2\2\u02ca\u02cb\7U\2\2\u02cb\u02cc\7k\2\2\u02cc") + buf.write("\u02cd\7i\2\2\u02cd\u02ce\7p\2\2\u02ce\u02cf\7c\2\2\u02cf") + buf.write("\u02d0\7n\2\2\u02d0\u02d1\7a\2\2\u02d1\u02d2\7g\2\2\u02d2") + buf.write("\u02d3\7p\2\2\u02d3\u02d4\7e\2\2\u02d4\u02d5\7q\2\2\u02d5") + buf.write("\u02d6\7f\2\2\u02d6\u02d7\7k\2\2\u02d7\u02d8\7p\2\2\u02d8") + buf.write("\u02d9\7i\2\2\u02d9\u02da\7a\2\2\u02da\u02db\7v\2\2\u02db") + buf.write("\u02dc\7{\2\2\u02dc\u02dd\7r\2\2\u02dd\u02de\7g\2\2\u02de") + buf.write("\u02df\7u\2\2\u02dff\3\2\2\2\u02e0\u02e1\7n\2\2\u02e1") + buf.write("\u02e2\7q\2\2\u02e2\u02e3\7i\2\2\u02e3\u02e4\7k\2\2\u02e4") + buf.write("\u02e5\7e\2\2\u02e5\u02e6\7c\2\2\u02e6\u02e7\7n\2\2\u02e7") + buf.write("\u02e8\7a\2\2\u02e8\u02e9\7x\2\2\u02e9\u02ea\7c\2\2\u02ea") + buf.write("\u02eb\7n\2\2\u02eb\u02ec\7w\2\2\u02ec\u02ed\7g\2\2\u02ed") + buf.write("h\3\2\2\2\u02ee\u02ef\7r\2\2\u02ef\u02f0\7j\2\2\u02f0") + buf.write("\u02f1\7{\2\2\u02f1\u02f2\7u\2\2\u02f2\u02f3\7k\2\2\u02f3") + buf.write("\u02f4\7e\2\2\u02f4\u02f5\7c\2\2\u02f5\u02f6\7n\2\2\u02f6") + buf.write("\u02f7\7a\2\2\u02f7\u02f8\7x\2\2\u02f8\u02f9\7c\2\2\u02f9") + buf.write("\u02fa\7n\2\2\u02fa\u02fb\7w\2\2\u02fb\u02fc\7g\2\2\u02fc") + buf.write("j\3\2\2\2\u02fd\u02fe\7d\2\2\u02fe\u02ff\7e\2\2\u02ff") + buf.write("\u0300\7f\2\2\u0300\u0301\7a\2\2\u0301\u0302\7x\2\2\u0302") + buf.write("\u0303\7c\2\2\u0303\u0304\7n\2\2\u0304\u0305\7w\2\2\u0305") + buf.write("\u0306\7g\2\2\u0306l\3\2\2\2\u0307\u0308\7c\2\2\u0308") + buf.write("\u0309\7u\2\2\u0309\u030a\7e\2\2\u030a\u030b\7k\2\2\u030b") + buf.write("\u030c\7k\2\2\u030c\u030d\7a\2\2\u030d\u030e\7x\2\2\u030e") + buf.write("\u030f\7c\2\2\u030f\u0310\7n\2\2\u0310\u0311\7w\2\2\u0311") + buf.write("\u0312\7g\2\2\u0312n\3\2\2\2\u0313\u0314\7U\2\2\u0314") + buf.write("\u0315\7k\2\2\u0315\u0316\7i\2\2\u0316\u0317\7p\2\2\u0317") + buf.write("\u0318\7c\2\2\u0318\u0319\7n\2\2\u0319\u031a\7a\2\2\u031a") + buf.write("\u031b\7t\2\2\u031b\u031c\7g\2\2\u031c\u031d\7r\2\2\u031d") + buf.write("\u031e\7t\2\2\u031e\u031f\7g\2\2\u031f\u0320\7u\2\2\u0320") + buf.write("\u0321\7g\2\2\u0321\u0322\7p\2\2\u0322\u0323\7v\2\2\u0323") + buf.write("\u0324\7c\2\2\u0324\u0325\7v\2\2\u0325\u0326\7k\2\2\u0326") + buf.write("\u0327\7q\2\2\u0327\u0328\7p\2\2\u0328p\3\2\2\2\u0329") + buf.write("\u032d\t\2\2\2\u032a\u032c\t\3\2\2\u032b\u032a\3\2\2\2") + buf.write("\u032c\u032f\3\2\2\2\u032d\u032b\3\2\2\2\u032d\u032e\3") + buf.write("\2\2\2\u032er\3\2\2\2\u032f\u032d\3\2\2\2\u0330\u0332") + buf.write("\t\4\2\2\u0331\u0333\t\5\2\2\u0332\u0331\3\2\2\2\u0332") + buf.write("\u0333\3\2\2\2\u0333\u0335\3\2\2\2\u0334\u0336\4\62;\2") + buf.write("\u0335\u0334\3\2\2\2\u0336\u0337\3\2\2\2\u0337\u0335\3") + buf.write("\2\2\2\u0337\u0338\3\2\2\2\u0338t\3\2\2\2\u0339\u033b") + buf.write("\5\u0085C\2\u033a\u0339\3\2\2\2\u033a\u033b\3\2\2\2\u033b") + buf.write("\u035a\3\2\2\2\u033c\u033e\4\62;\2\u033d\u033c\3\2\2\2") + buf.write("\u033e\u033f\3\2\2\2\u033f\u033d\3\2\2\2\u033f\u0340\3") + buf.write("\2\2\2\u0340\u0341\3\2\2\2\u0341\u0345\7\60\2\2\u0342") + buf.write("\u0344\4\62;\2\u0343\u0342\3\2\2\2\u0344\u0347\3\2\2\2") + buf.write("\u0345\u0343\3\2\2\2\u0345\u0346\3\2\2\2\u0346\u0349\3") + buf.write("\2\2\2\u0347\u0345\3\2\2\2\u0348\u034a\5s:\2\u0349\u0348") + buf.write("\3\2\2\2\u0349\u034a\3\2\2\2\u034a\u035b\3\2\2\2\u034b") + buf.write("\u034d\7\60\2\2\u034c\u034e\4\62;\2\u034d\u034c\3\2\2") + buf.write("\2\u034e\u034f\3\2\2\2\u034f\u034d\3\2\2\2\u034f\u0350") + buf.write("\3\2\2\2\u0350\u0352\3\2\2\2\u0351\u0353\5s:\2\u0352\u0351") + buf.write("\3\2\2\2\u0352\u0353\3\2\2\2\u0353\u035b\3\2\2\2\u0354") + buf.write("\u0356\4\62;\2\u0355\u0354\3\2\2\2\u0356\u0357\3\2\2\2") + buf.write("\u0357\u0355\3\2\2\2\u0357\u0358\3\2\2\2\u0358\u0359\3") + buf.write("\2\2\2\u0359\u035b\5s:\2\u035a\u033d\3\2\2\2\u035a\u034b") + buf.write("\3\2\2\2\u035a\u0355\3\2\2\2\u035bv\3\2\2\2\u035c\u035e") + buf.write("\5\u0085C\2\u035d\u035c\3\2\2\2\u035d\u035e\3\2\2\2\u035e") + buf.write("\u0360\3\2\2\2\u035f\u0361\4\62;\2\u0360\u035f\3\2\2\2") + buf.write("\u0361\u0362\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3") + buf.write("\2\2\2\u0363x\3\2\2\2\u0364\u0365\7\62\2\2\u0365\u0367") + buf.write("\t\6\2\2\u0366\u0368\5{>\2\u0367\u0366\3\2\2\2\u0368\u0369") + buf.write("\3\2\2\2\u0369\u0367\3\2\2\2\u0369\u036a\3\2\2\2\u036a") + buf.write("z\3\2\2\2\u036b\u036c\t\7\2\2\u036c|\3\2\2\2\u036d\u036e") + buf.write("\7^\2\2\u036e\u036f\t\b\2\2\u036f~\3\2\2\2\u0370\u0371") + buf.write("\t\t\2\2\u0371\u0372\3\2\2\2\u0372\u0373\b@\2\2\u0373") + buf.write("\u0080\3\2\2\2\u0374\u0375\7\61\2\2\u0375\u0376\7\61\2") + buf.write("\2\u0376\u037a\3\2\2\2\u0377\u0379\n\n\2\2\u0378\u0377") + buf.write("\3\2\2\2\u0379\u037c\3\2\2\2\u037a\u0378\3\2\2\2\u037a") + buf.write("\u037b\3\2\2\2\u037b\u0380\3\2\2\2\u037c\u037a\3\2\2\2") + buf.write("\u037d\u037f\7\17\2\2\u037e\u037d\3\2\2\2\u037f\u0382") + buf.write("\3\2\2\2\u0380\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381") + buf.write("\u0383\3\2\2\2\u0382\u0380\3\2\2\2\u0383\u0390\7\f\2\2") + buf.write("\u0384\u0385\7\61\2\2\u0385\u0386\7,\2\2\u0386\u038a\3") + buf.write("\2\2\2\u0387\u0389\13\2\2\2\u0388\u0387\3\2\2\2\u0389") + buf.write("\u038c\3\2\2\2\u038a\u038b\3\2\2\2\u038a\u0388\3\2\2\2") + buf.write("\u038b\u038d\3\2\2\2\u038c\u038a\3\2\2\2\u038d\u038e\7") + buf.write(",\2\2\u038e\u0390\7\61\2\2\u038f\u0374\3\2\2\2\u038f\u0384") + buf.write("\3\2\2\2\u0390\u0391\3\2\2\2\u0391\u0392\bA\2\2\u0392") + buf.write("\u0082\3\2\2\2\u0393\u0398\7$\2\2\u0394\u0397\5}?\2\u0395") + buf.write("\u0397\n\13\2\2\u0396\u0394\3\2\2\2\u0396\u0395\3\2\2") + buf.write("\2\u0397\u039a\3\2\2\2\u0398\u0396\3\2\2\2\u0398\u0399") + buf.write("\3\2\2\2\u0399\u039b\3\2\2\2\u039a\u0398\3\2\2\2\u039b") + buf.write("\u039c\7$\2\2\u039c\u0084\3\2\2\2\u039d\u039e\t\5\2\2") + buf.write("\u039e\u0086\3\2\2\2\27\2\u032d\u0332\u0337\u033a\u033f") + buf.write("\u0345\u0349\u034f\u0352\u0357\u035a\u035d\u0362\u0369") + buf.write("\u037a\u0380\u038a\u038f\u0396\u0398\3\2\3\2") return buf.getvalue() @@ -460,10 +465,11 @@ class ldfLexer(Lexer): C_IDENTIFIER = 56 FLOAT = 57 INT = 58 - WS = 59 - COMMENT = 60 - STRING = 61 - SIGN = 62 + HEX = 59 + WS = 60 + COMMENT = 61 + STRING = 62 + SIGN = 63 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -486,7 +492,8 @@ class ldfLexer(Lexer): "'Signal_representation'" ] symbolicNames = [ "", - "C_IDENTIFIER", "FLOAT", "INT", "WS", "COMMENT", "STRING", "SIGN" ] + "C_IDENTIFIER", "FLOAT", "INT", "HEX", "WS", "COMMENT", "STRING", + "SIGN" ] ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", "T__13", @@ -497,14 +504,14 @@ class ldfLexer(Lexer): "T__38", "T__39", "T__40", "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "C_IDENTIFIER", - "EXPONENT", "FLOAT", "INT", "ESC_SEQ", "WS", "COMMENT", - "STRING", "SIGN" ] + "EXPONENT", "FLOAT", "INT", "HEX", "HEX_DIGIT", "ESC_SEQ", + "WS", "COMMENT", "STRING", "SIGN" ] grammarFileName = "ldf.g4" def __init__(self, input=None, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) self._actions = None self._predicates = None diff --git a/pydbc/py3/ldfLexer.tokens b/pydbc/py3/ldfLexer.tokens index e69de29..775bbe7 100644 --- a/pydbc/py3/ldfLexer.tokens +++ b/pydbc/py3/ldfLexer.tokens @@ -0,0 +1,118 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +C_IDENTIFIER=56 +FLOAT=57 +INT=58 +HEX=59 +WS=60 +COMMENT=61 +STRING=62 +SIGN=63 +'LIN_description_file'=1 +';'=2 +'LIN_protocol_version'=3 +'='=4 +'LIN_language_version'=5 +'LDF_file_revision'=6 +'LIN_speed'=7 +'kbps'=8 +'Channel_name'=9 +'Nodes'=10 +'{'=11 +'Master'=12 +':'=13 +','=14 +'ms'=15 +'Slaves'=16 +'}'=17 +'Node_attributes'=18 +'LIN_protocol'=19 +'configured_NAD'=20 +'initial_NAD'=21 +'product_id'=22 +'response_error'=23 +'fault_state_signals'=24 +'P2_min'=25 +'ST_min'=26 +'N_As_timeout'=27 +'N_Cr_timeout'=28 +'configurable_frames'=29 +'composite'=30 +'configuration'=31 +'Signals'=32 +'Diagnostic_signals'=33 +'Signal_groups'=34 +'Frames'=35 +'Sporadic_frames'=36 +'Event_triggered_frames'=37 +'Diagnostic_frames'=38 +'MasterReq'=39 +'SlaveResp'=40 +'Schedule_tables'=41 +'delay'=42 +'AssignNAD'=43 +'ConditionalChangeNAD'=44 +'DataDump'=45 +'SaveConfiguration'=46 +'AssignFrameIdRange'=47 +'FreeFormat'=48 +'AssignFrameId'=49 +'Signal_encoding_types'=50 +'logical_value'=51 +'physical_value'=52 +'bcd_value'=53 +'ascii_value'=54 +'Signal_representation'=55 diff --git a/pydbc/py3/ldfParser.py b/pydbc/py3/ldfParser.py index 6e0e321..9cb0319 100644 --- a/pydbc/py3/ldfParser.py +++ b/pydbc/py3/ldfParser.py @@ -1,15 +1,14 @@ -# Generated from ldf.g4 by ANTLR 4.7.2 +# Generated from ldf.g4 by ANTLR 4.7 # encoding: utf-8 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: - buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3@") - buf.write("\u02e5\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") + buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3A") + buf.write("\u02e7\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7") buf.write("\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16") buf.write("\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4\23\t\23") buf.write("\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31") @@ -75,81 +74,81 @@ def serializedATN(): buf.write(",\3,\3,\5,\u02b9\n,\3,\3,\3-\3-\3-\3.\3.\3.\3/\3/\3/\7") buf.write("/\u02c6\n/\f/\16/\u02c9\13/\3/\3/\3\60\3\60\3\60\3\60") buf.write("\3\60\7\60\u02d2\n\60\f\60\16\60\u02d5\13\60\3\60\3\60") - buf.write("\3\61\3\61\3\62\3\62\3\63\3\63\5\63\u02df\n\63\3\64\3") - buf.write("\64\3\65\3\65\3\65\2\2\66\2\4\6\b\n\f\16\20\22\24\26\30") - buf.write("\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`b") - buf.write("dfh\2\2\2\u02ef\2j\3\2\2\2\4\u0092\3\2\2\2\6\u0097\3\2") - buf.write("\2\2\b\u009c\3\2\2\2\n\u00a1\3\2\2\2\f\u00a7\3\2\2\2\16") - buf.write("\u00ac\3\2\2\2\20\u00c5\3\2\2\2\22\u00cf\3\2\2\2\24\u00e3") - buf.write("\3\2\2\2\26\u0122\3\2\2\2\30\u012c\3\2\2\2\32\u0133\3") - buf.write("\2\2\2\34\u013d\3\2\2\2\36\u0148\3\2\2\2 \u0154\3\2\2") - buf.write("\2\"\u015e\3\2\2\2$\u0170\3\2\2\2&\u0172\3\2\2\2(\u0174") - buf.write("\3\2\2\2*\u017f\3\2\2\2,\u0189\3\2\2\2.\u0190\3\2\2\2") - buf.write("\60\u019a\3\2\2\2\62\u01a6\3\2\2\2\64\u01ab\3\2\2\2\66") - buf.write("\u01b5\3\2\2\28\u01c5\3\2\2\2:\u01ca\3\2\2\2<\u01d4\3") - buf.write("\2\2\2>\u01e0\3\2\2\2@\u01ea\3\2\2\2B\u01f8\3\2\2\2D\u0212") - buf.write("\3\2\2\2F\u0217\3\2\2\2H\u0221\3\2\2\2J\u022b\3\2\2\2") - buf.write("L\u0288\3\2\2\2N\u028a\3\2\2\2P\u0294\3\2\2\2R\u02a2\3") - buf.write("\2\2\2T\u02a4\3\2\2\2V\u02ad\3\2\2\2X\u02bc\3\2\2\2Z\u02bf") - buf.write("\3\2\2\2\\\u02c2\3\2\2\2^\u02cc\3\2\2\2`\u02d8\3\2\2\2") - buf.write("b\u02da\3\2\2\2d\u02de\3\2\2\2f\u02e0\3\2\2\2h\u02e2\3") - buf.write("\2\2\2jk\7\3\2\2kl\7\4\2\2lm\5\4\3\2mo\5\6\4\2np\5\b\5") - buf.write("\2on\3\2\2\2op\3\2\2\2pq\3\2\2\2qs\5\n\6\2rt\5\f\7\2s") - buf.write("r\3\2\2\2st\3\2\2\2tu\3\2\2\2uw\5\16\b\2vx\5\32\16\2w") - buf.write("v\3\2\2\2wx\3\2\2\2xy\3\2\2\2y{\5 \21\2z|\5*\26\2{z\3") - buf.write("\2\2\2{|\3\2\2\2|}\3\2\2\2}\177\5\64\33\2~\u0080\5:\36") - buf.write("\2\177~\3\2\2\2\177\u0080\3\2\2\2\u0080\u0082\3\2\2\2") - buf.write("\u0081\u0083\5> \2\u0082\u0081\3\2\2\2\u0082\u0083\3\2") - buf.write("\2\2\u0083\u0085\3\2\2\2\u0084\u0086\5B\"\2\u0085\u0084") - buf.write("\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u0087\3\2\2\2\u0087") - buf.write("\u0088\5\20\t\2\u0088\u008a\5F$\2\u0089\u008b\5.\30\2") - buf.write("\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u008d\3") - buf.write("\2\2\2\u008c\u008e\5N(\2\u008d\u008c\3\2\2\2\u008d\u008e") - buf.write("\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u0091\5\\/\2\u0090") - buf.write("\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\3\3\2\2\2\u0092") - buf.write("\u0093\7\5\2\2\u0093\u0094\7\6\2\2\u0094\u0095\5f\64\2") - buf.write("\u0095\u0096\7\4\2\2\u0096\5\3\2\2\2\u0097\u0098\7\7\2") - buf.write("\2\u0098\u0099\7\6\2\2\u0099\u009a\5f\64\2\u009a\u009b") - buf.write("\7\4\2\2\u009b\7\3\2\2\2\u009c\u009d\7\b\2\2\u009d\u009e") - buf.write("\7\6\2\2\u009e\u009f\5f\64\2\u009f\u00a0\7\4\2\2\u00a0") - buf.write("\t\3\2\2\2\u00a1\u00a2\7\t\2\2\u00a2\u00a3\7\6\2\2\u00a3") - buf.write("\u00a4\5d\63\2\u00a4\u00a5\7\n\2\2\u00a5\u00a6\7\4\2\2") - buf.write("\u00a6\13\3\2\2\2\u00a7\u00a8\7\13\2\2\u00a8\u00a9\7\6") - buf.write("\2\2\u00a9\u00aa\5h\65\2\u00aa\u00ab\7\4\2\2\u00ab\r\3") - buf.write("\2\2\2\u00ac\u00ad\7\f\2\2\u00ad\u00ae\7\r\2\2\u00ae\u00af") - buf.write("\7\16\2\2\u00af\u00b0\7\17\2\2\u00b0\u00b1\5h\65\2\u00b1") - buf.write("\u00b2\7\20\2\2\u00b2\u00b3\5d\63\2\u00b3\u00b4\7\21\2") - buf.write("\2\u00b4\u00b5\7\20\2\2\u00b5\u00b6\5d\63\2\u00b6\u00b7") - buf.write("\7\21\2\2\u00b7\u00b8\7\4\2\2\u00b8\u00b9\7\22\2\2\u00b9") - buf.write("\u00ba\7\17\2\2\u00ba\u00bf\5h\65\2\u00bb\u00bc\7\20\2") - buf.write("\2\u00bc\u00be\5h\65\2\u00bd\u00bb\3\2\2\2\u00be\u00c1") - buf.write("\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0") - buf.write("\u00c2\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c2\u00c3\7\4\2\2") - buf.write("\u00c3\u00c4\7\23\2\2\u00c4\17\3\2\2\2\u00c5\u00c6\7\24") - buf.write("\2\2\u00c6\u00ca\7\r\2\2\u00c7\u00c9\5\22\n\2\u00c8\u00c7") - buf.write("\3\2\2\2\u00c9\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca") - buf.write("\u00cb\3\2\2\2\u00cb\u00cd\3\2\2\2\u00cc\u00ca\3\2\2\2") - buf.write("\u00cd\u00ce\7\23\2\2\u00ce\21\3\2\2\2\u00cf\u00d0\5h") - buf.write("\65\2\u00d0\u00d1\7\r\2\2\u00d1\u00d2\7\25\2\2\u00d2\u00d3") - buf.write("\7\6\2\2\u00d3\u00d4\5f\64\2\u00d4\u00d5\7\4\2\2\u00d5") - buf.write("\u00d6\7\26\2\2\u00d6\u00d7\7\6\2\2\u00d7\u00d8\5`\61") - buf.write("\2\u00d8\u00de\7\4\2\2\u00d9\u00da\7\27\2\2\u00da\u00db") - buf.write("\7\6\2\2\u00db\u00dc\5`\61\2\u00dc\u00dd\7\4\2\2\u00dd") - buf.write("\u00df\3\2\2\2\u00de\u00d9\3\2\2\2\u00de\u00df\3\2\2\2") - buf.write("\u00df\u00e0\3\2\2\2\u00e0\u00e1\5\24\13\2\u00e1\u00e2") - buf.write("\7\23\2\2\u00e2\23\3\2\2\2\u00e3\u00e4\7\30\2\2\u00e4") - buf.write("\u00e5\7\6\2\2\u00e5\u00e6\5`\61\2\u00e6\u00e7\7\20\2") - buf.write("\2\u00e7\u00ea\5`\61\2\u00e8\u00e9\7\20\2\2\u00e9\u00eb") - buf.write("\5`\61\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb") - buf.write("\u00ec\3\2\2\2\u00ec\u00ed\7\4\2\2\u00ed\u00ee\7\31\2") - buf.write("\2\u00ee\u00ef\7\6\2\2\u00ef\u00f0\5h\65\2\u00f0\u00fd") - buf.write("\7\4\2\2\u00f1\u00f2\7\32\2\2\u00f2\u00f3\7\6\2\2\u00f3") - buf.write("\u00f8\5h\65\2\u00f4\u00f5\7\20\2\2\u00f5\u00f7\5h\65") - buf.write("\2\u00f6\u00f4\3\2\2\2\u00f7\u00fa\3\2\2\2\u00f8\u00f6") - buf.write("\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\3\2\2\2\u00fa") - buf.write("\u00f8\3\2\2\2\u00fb\u00fc\7\4\2\2\u00fc\u00fe\3\2\2\2") - buf.write("\u00fd\u00f1\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe\u0105\3") - buf.write("\2\2\2\u00ff\u0100\7\33\2\2\u0100\u0101\7\6\2\2\u0101") + buf.write("\3\61\3\61\5\61\u02db\n\61\3\62\3\62\3\63\3\63\5\63\u02e1") + buf.write("\n\63\3\64\3\64\3\65\3\65\3\65\2\2\66\2\4\6\b\n\f\16\20") + buf.write("\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJL") + buf.write("NPRTVXZ\\^`bdfh\2\2\2\u02f2\2j\3\2\2\2\4\u0092\3\2\2\2") + buf.write("\6\u0097\3\2\2\2\b\u009c\3\2\2\2\n\u00a1\3\2\2\2\f\u00a7") + buf.write("\3\2\2\2\16\u00ac\3\2\2\2\20\u00c5\3\2\2\2\22\u00cf\3") + buf.write("\2\2\2\24\u00e3\3\2\2\2\26\u0122\3\2\2\2\30\u012c\3\2") + buf.write("\2\2\32\u0133\3\2\2\2\34\u013d\3\2\2\2\36\u0148\3\2\2") + buf.write("\2 \u0154\3\2\2\2\"\u015e\3\2\2\2$\u0170\3\2\2\2&\u0172") + buf.write("\3\2\2\2(\u0174\3\2\2\2*\u017f\3\2\2\2,\u0189\3\2\2\2") + buf.write(".\u0190\3\2\2\2\60\u019a\3\2\2\2\62\u01a6\3\2\2\2\64\u01ab") + buf.write("\3\2\2\2\66\u01b5\3\2\2\28\u01c5\3\2\2\2:\u01ca\3\2\2") + buf.write("\2<\u01d4\3\2\2\2>\u01e0\3\2\2\2@\u01ea\3\2\2\2B\u01f8") + buf.write("\3\2\2\2D\u0212\3\2\2\2F\u0217\3\2\2\2H\u0221\3\2\2\2") + buf.write("J\u022b\3\2\2\2L\u0288\3\2\2\2N\u028a\3\2\2\2P\u0294\3") + buf.write("\2\2\2R\u02a2\3\2\2\2T\u02a4\3\2\2\2V\u02ad\3\2\2\2X\u02bc") + buf.write("\3\2\2\2Z\u02bf\3\2\2\2\\\u02c2\3\2\2\2^\u02cc\3\2\2\2") + buf.write("`\u02da\3\2\2\2b\u02dc\3\2\2\2d\u02e0\3\2\2\2f\u02e2\3") + buf.write("\2\2\2h\u02e4\3\2\2\2jk\7\3\2\2kl\7\4\2\2lm\5\4\3\2mo") + buf.write("\5\6\4\2np\5\b\5\2on\3\2\2\2op\3\2\2\2pq\3\2\2\2qs\5\n") + buf.write("\6\2rt\5\f\7\2sr\3\2\2\2st\3\2\2\2tu\3\2\2\2uw\5\16\b") + buf.write("\2vx\5\32\16\2wv\3\2\2\2wx\3\2\2\2xy\3\2\2\2y{\5 \21\2") + buf.write("z|\5*\26\2{z\3\2\2\2{|\3\2\2\2|}\3\2\2\2}\177\5\64\33") + buf.write("\2~\u0080\5:\36\2\177~\3\2\2\2\177\u0080\3\2\2\2\u0080") + buf.write("\u0082\3\2\2\2\u0081\u0083\5> \2\u0082\u0081\3\2\2\2\u0082") + buf.write("\u0083\3\2\2\2\u0083\u0085\3\2\2\2\u0084\u0086\5B\"\2") + buf.write("\u0085\u0084\3\2\2\2\u0085\u0086\3\2\2\2\u0086\u0087\3") + buf.write("\2\2\2\u0087\u0088\5\20\t\2\u0088\u008a\5F$\2\u0089\u008b") + buf.write("\5.\30\2\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2\2\u008b") + buf.write("\u008d\3\2\2\2\u008c\u008e\5N(\2\u008d\u008c\3\2\2\2\u008d") + buf.write("\u008e\3\2\2\2\u008e\u0090\3\2\2\2\u008f\u0091\5\\/\2") + buf.write("\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\3\3\2\2") + buf.write("\2\u0092\u0093\7\5\2\2\u0093\u0094\7\6\2\2\u0094\u0095") + buf.write("\5f\64\2\u0095\u0096\7\4\2\2\u0096\5\3\2\2\2\u0097\u0098") + buf.write("\7\7\2\2\u0098\u0099\7\6\2\2\u0099\u009a\5f\64\2\u009a") + buf.write("\u009b\7\4\2\2\u009b\7\3\2\2\2\u009c\u009d\7\b\2\2\u009d") + buf.write("\u009e\7\6\2\2\u009e\u009f\5f\64\2\u009f\u00a0\7\4\2\2") + buf.write("\u00a0\t\3\2\2\2\u00a1\u00a2\7\t\2\2\u00a2\u00a3\7\6\2") + buf.write("\2\u00a3\u00a4\5d\63\2\u00a4\u00a5\7\n\2\2\u00a5\u00a6") + buf.write("\7\4\2\2\u00a6\13\3\2\2\2\u00a7\u00a8\7\13\2\2\u00a8\u00a9") + buf.write("\7\6\2\2\u00a9\u00aa\5h\65\2\u00aa\u00ab\7\4\2\2\u00ab") + buf.write("\r\3\2\2\2\u00ac\u00ad\7\f\2\2\u00ad\u00ae\7\r\2\2\u00ae") + buf.write("\u00af\7\16\2\2\u00af\u00b0\7\17\2\2\u00b0\u00b1\5h\65") + buf.write("\2\u00b1\u00b2\7\20\2\2\u00b2\u00b3\5d\63\2\u00b3\u00b4") + buf.write("\7\21\2\2\u00b4\u00b5\7\20\2\2\u00b5\u00b6\5d\63\2\u00b6") + buf.write("\u00b7\7\21\2\2\u00b7\u00b8\7\4\2\2\u00b8\u00b9\7\22\2") + buf.write("\2\u00b9\u00ba\7\17\2\2\u00ba\u00bf\5h\65\2\u00bb\u00bc") + buf.write("\7\20\2\2\u00bc\u00be\5h\65\2\u00bd\u00bb\3\2\2\2\u00be") + buf.write("\u00c1\3\2\2\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2") + buf.write("\u00c0\u00c2\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c2\u00c3\7") + buf.write("\4\2\2\u00c3\u00c4\7\23\2\2\u00c4\17\3\2\2\2\u00c5\u00c6") + buf.write("\7\24\2\2\u00c6\u00ca\7\r\2\2\u00c7\u00c9\5\22\n\2\u00c8") + buf.write("\u00c7\3\2\2\2\u00c9\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2") + buf.write("\u00ca\u00cb\3\2\2\2\u00cb\u00cd\3\2\2\2\u00cc\u00ca\3") + buf.write("\2\2\2\u00cd\u00ce\7\23\2\2\u00ce\21\3\2\2\2\u00cf\u00d0") + buf.write("\5h\65\2\u00d0\u00d1\7\r\2\2\u00d1\u00d2\7\25\2\2\u00d2") + buf.write("\u00d3\7\6\2\2\u00d3\u00d4\5f\64\2\u00d4\u00d5\7\4\2\2") + buf.write("\u00d5\u00d6\7\26\2\2\u00d6\u00d7\7\6\2\2\u00d7\u00d8") + buf.write("\5`\61\2\u00d8\u00de\7\4\2\2\u00d9\u00da\7\27\2\2\u00da") + buf.write("\u00db\7\6\2\2\u00db\u00dc\5`\61\2\u00dc\u00dd\7\4\2\2") + buf.write("\u00dd\u00df\3\2\2\2\u00de\u00d9\3\2\2\2\u00de\u00df\3") + buf.write("\2\2\2\u00df\u00e0\3\2\2\2\u00e0\u00e1\5\24\13\2\u00e1") + buf.write("\u00e2\7\23\2\2\u00e2\23\3\2\2\2\u00e3\u00e4\7\30\2\2") + buf.write("\u00e4\u00e5\7\6\2\2\u00e5\u00e6\5`\61\2\u00e6\u00e7\7") + buf.write("\20\2\2\u00e7\u00ea\5`\61\2\u00e8\u00e9\7\20\2\2\u00e9") + buf.write("\u00eb\5`\61\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2") + buf.write("\u00eb\u00ec\3\2\2\2\u00ec\u00ed\7\4\2\2\u00ed\u00ee\7") + buf.write("\31\2\2\u00ee\u00ef\7\6\2\2\u00ef\u00f0\5h\65\2\u00f0") + buf.write("\u00fd\7\4\2\2\u00f1\u00f2\7\32\2\2\u00f2\u00f3\7\6\2") + buf.write("\2\u00f3\u00f8\5h\65\2\u00f4\u00f5\7\20\2\2\u00f5\u00f7") + buf.write("\5h\65\2\u00f6\u00f4\3\2\2\2\u00f7\u00fa\3\2\2\2\u00f8") + buf.write("\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\3\2\2\2") + buf.write("\u00fa\u00f8\3\2\2\2\u00fb\u00fc\7\4\2\2\u00fc\u00fe\3") + buf.write("\2\2\2\u00fd\u00f1\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe\u0105") + buf.write("\3\2\2\2\u00ff\u0100\7\33\2\2\u0100\u0101\7\6\2\2\u0101") buf.write("\u0102\5d\63\2\u0102\u0103\7\21\2\2\u0103\u0104\7\4\2") buf.write("\2\u0104\u0106\3\2\2\2\u0105\u00ff\3\2\2\2\u0105\u0106") buf.write("\3\2\2\2\u0106\u010d\3\2\2\2\u0107\u0108\7\34\2\2\u0108") @@ -338,16 +337,17 @@ def serializedATN(): buf.write("\5h\65\2\u02d1\u02cf\3\2\2\2\u02d2\u02d5\3\2\2\2\u02d3") buf.write("\u02d1\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d6\3\2\2\2") buf.write("\u02d5\u02d3\3\2\2\2\u02d6\u02d7\7\4\2\2\u02d7_\3\2\2") - buf.write("\2\u02d8\u02d9\7<\2\2\u02d9a\3\2\2\2\u02da\u02db\7;\2") - buf.write("\2\u02dbc\3\2\2\2\u02dc\u02df\5`\61\2\u02dd\u02df\5b\62") - buf.write("\2\u02de\u02dc\3\2\2\2\u02de\u02dd\3\2\2\2\u02dfe\3\2") - buf.write("\2\2\u02e0\u02e1\7?\2\2\u02e1g\3\2\2\2\u02e2\u02e3\7:") - buf.write("\2\2\u02e3i\3\2\2\2\67osw{\177\u0082\u0085\u008a\u008d") + buf.write("\2\u02d8\u02db\7<\2\2\u02d9\u02db\7=\2\2\u02da\u02d8\3") + buf.write("\2\2\2\u02da\u02d9\3\2\2\2\u02dba\3\2\2\2\u02dc\u02dd") + buf.write("\7;\2\2\u02ddc\3\2\2\2\u02de\u02e1\5`\61\2\u02df\u02e1") + buf.write("\5b\62\2\u02e0\u02de\3\2\2\2\u02e0\u02df\3\2\2\2\u02e1") + buf.write("e\3\2\2\2\u02e2\u02e3\7@\2\2\u02e3g\3\2\2\2\u02e4\u02e5") + buf.write("\7:\2\2\u02e5i\3\2\2\28osw{\177\u0082\u0085\u008a\u008d") buf.write("\u0090\u00bf\u00ca\u00de\u00ea\u00f8\u00fd\u0105\u010d") buf.write("\u0115\u011d\u0120\u0127\u012f\u0138\u0143\u014f\u0159") buf.write("\u0169\u0170\u017a\u0184\u0195\u01a1\u01b0\u01c0\u01cf") buf.write("\u01db\u01e5\u01f3\u0201\u020c\u021c\u0226\u026a\u0288") - buf.write("\u028f\u0299\u02a2\u02a9\u02b8\u02c7\u02d3\u02de") + buf.write("\u028f\u0299\u02a2\u02a9\u02b8\u02c7\u02d3\u02da\u02e0") return buf.getvalue() @@ -393,8 +393,8 @@ class ldfParser ( Parser ): "", "", "", "", "", "", "", "", "", "", "", "", - "C_IDENTIFIER", "FLOAT", "INT", "WS", "COMMENT", "STRING", - "SIGN" ] + "C_IDENTIFIER", "FLOAT", "INT", "HEX", "WS", "COMMENT", + "STRING", "SIGN" ] RULE_lin_description_file = 0 RULE_lin_protocol_version_def = 1 @@ -526,20 +526,20 @@ class ldfParser ( Parser ): C_IDENTIFIER=56 FLOAT=57 INT=58 - WS=59 - COMMENT=60 - STRING=61 - SIGN=62 + HEX=59 + WS=60 + COMMENT=61 + STRING=62 + SIGN=63 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None - class Lin_description_fileContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -771,7 +771,6 @@ def lin_description_file(self): self.exitRule() return localctx - class Lin_protocol_version_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -825,7 +824,6 @@ def lin_protocol_version_def(self): self.exitRule() return localctx - class Lin_language_version_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -879,7 +877,6 @@ def lin_language_version_def(self): self.exitRule() return localctx - class Lin_file_revision_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -933,7 +930,6 @@ def lin_file_revision_def(self): self.exitRule() return localctx - class Lin_speed_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -989,7 +985,6 @@ def lin_speed_def(self): self.exitRule() return localctx - class Channel_name_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1043,7 +1038,6 @@ def channel_name_def(self): self.exitRule() return localctx - class Node_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1152,7 +1146,6 @@ def node_def(self): self.exitRule() return localctx - class Node_attributes_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1220,7 +1213,6 @@ def node_attributes_def(self): self.exitRule() return localctx - class Node_attributeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1324,7 +1316,6 @@ def node_attribute(self): self.exitRule() return localctx - class Attributes_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1532,7 +1523,6 @@ def attributes_def(self): self.exitRule() return localctx - class Configurable_framesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1600,7 +1590,6 @@ def configurable_frames(self): self.exitRule() return localctx - class Configurable_frameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1666,7 +1655,6 @@ def configurable_frame(self): self.exitRule() return localctx - class Node_composition_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1734,7 +1722,6 @@ def node_composition_def(self): self.exitRule() return localctx - class ConfigurationContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1809,7 +1796,6 @@ def configuration(self): self.exitRule() return localctx - class Configuration_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1883,7 +1869,6 @@ def configuration_item(self): self.exitRule() return localctx - class Signal_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1951,7 +1936,6 @@ def signal_def(self): self.exitRule() return localctx - class Signal_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2043,7 +2027,6 @@ def signal_item(self): self.exitRule() return localctx - class Init_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2088,7 +2071,7 @@ def init_value(self): self.state = 366 self._errHandler.sync(self) token = self._input.LA(1) - if token in [ldfParser.INT]: + if token in [ldfParser.INT, ldfParser.HEX]: self.enterOuterAlt(localctx, 1) self.state = 364 localctx.s = self.init_value_scalar() @@ -2109,7 +2092,6 @@ def init_value(self): self.exitRule() return localctx - class Init_value_scalarContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2157,7 +2139,6 @@ def init_value_scalar(self): self.exitRule() return localctx - class Init_value_arrayContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2228,7 +2209,6 @@ def init_value_array(self): self.exitRule() return localctx - class Diagnostic_signal_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2296,7 +2276,6 @@ def diagnostic_signal_def(self): self.exitRule() return localctx - class Diagnostic_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2363,7 +2342,6 @@ def diagnostic_item(self): self.exitRule() return localctx - class Signal_groups_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2431,7 +2409,6 @@ def signal_groups_def(self): self.exitRule() return localctx - class Signal_groupContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2513,7 +2490,6 @@ def signal_group(self): self.exitRule() return localctx - class Signal_group_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2572,7 +2548,6 @@ def signal_group_item(self): self.exitRule() return localctx - class Frame_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2640,7 +2615,6 @@ def frame_def(self): self.exitRule() return localctx - class Frame_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2738,7 +2712,6 @@ def frame_item(self): self.exitRule() return localctx - class Frame_signalContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2797,7 +2770,6 @@ def frame_signal(self): self.exitRule() return localctx - class Sporadic_frame_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2865,7 +2837,6 @@ def sporadic_frame_def(self): self.exitRule() return localctx - class Sporadic_frame_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2939,7 +2910,6 @@ def sporadic_frame_item(self): self.exitRule() return localctx - class Event_triggered_frame_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3007,7 +2977,6 @@ def event_triggered_frame_def(self): self.exitRule() return localctx - class Event_triggered_frame_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3090,7 +3059,6 @@ def event_triggered_frame_item(self): self.exitRule() return localctx - class Diag_frame_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3199,7 +3167,6 @@ def diag_frame_def(self): self.exitRule() return localctx - class Diag_frame_itemContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3258,7 +3225,6 @@ def diag_frame_item(self): self.exitRule() return localctx - class Schedule_table_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3326,7 +3292,6 @@ def schedule_table_def(self): self.exitRule() return localctx - class Schedule_table_entryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3399,7 +3364,6 @@ def schedule_table_entry(self): self.exitRule() return localctx - class Schedule_table_commandContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3460,7 +3424,6 @@ def schedule_table_command(self): self.exitRule() return localctx - class CommandContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3735,7 +3698,6 @@ def command(self): self.exitRule() return localctx - class Signal_encoding_type_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3803,7 +3765,6 @@ def signal_encoding_type_def(self): self.exitRule() return localctx - class Signal_encoding_entryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3876,7 +3837,6 @@ def signal_encoding_entry(self): self.exitRule() return localctx - class Signal_encoding_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3962,7 +3922,6 @@ def signal_encoding_value(self): self.exitRule() return localctx - class Logical_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4032,7 +3991,6 @@ def logical_value(self): self.exitRule() return localctx - class Physical_rangeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4127,7 +4085,6 @@ def physical_range(self): self.exitRule() return localctx - class Bcd_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4173,7 +4130,6 @@ def bcd_value(self): self.exitRule() return localctx - class Ascii_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4219,7 +4175,6 @@ def ascii_value(self): self.exitRule() return localctx - class Signal_representation_defContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4287,7 +4242,6 @@ def signal_representation_def(self): self.exitRule() return localctx - class Signal_representation_entryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4361,17 +4315,20 @@ def signal_representation_entry(self): self.exitRule() return localctx - class IntValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser self.i = None # Token + self.h = None # Token def INT(self): return self.getToken(ldfParser.INT, 0) + def HEX(self): + return self.getToken(ldfParser.HEX, 0) + def getRuleIndex(self): return ldfParser.RULE_intValue @@ -4397,9 +4354,22 @@ def intValue(self): localctx = ldfParser.IntValueContext(self, self._ctx, self.state) self.enterRule(localctx, 94, self.RULE_intValue) try: - self.enterOuterAlt(localctx, 1) - self.state = 726 - localctx.i = self.match(ldfParser.INT) + self.state = 728 + self._errHandler.sync(self) + token = self._input.LA(1) + if token in [ldfParser.INT]: + self.enterOuterAlt(localctx, 1) + self.state = 726 + localctx.i = self.match(ldfParser.INT) + pass + elif token in [ldfParser.HEX]: + self.enterOuterAlt(localctx, 2) + self.state = 727 + localctx.h = self.match(ldfParser.HEX) + pass + else: + raise NoViableAltException(self) + except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) @@ -4408,7 +4378,6 @@ def intValue(self): self.exitRule() return localctx - class FloatValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4445,7 +4414,7 @@ def floatValue(self): self.enterRule(localctx, 96, self.RULE_floatValue) try: self.enterOuterAlt(localctx, 1) - self.state = 728 + self.state = 730 localctx.f = self.match(ldfParser.FLOAT) except RecognitionException as re: localctx.exception = re @@ -4455,7 +4424,6 @@ def floatValue(self): self.exitRule() return localctx - class NumberContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4497,17 +4465,17 @@ def number(self): localctx = ldfParser.NumberContext(self, self._ctx, self.state) self.enterRule(localctx, 98, self.RULE_number) try: - self.state = 732 + self.state = 734 self._errHandler.sync(self) token = self._input.LA(1) - if token in [ldfParser.INT]: + if token in [ldfParser.INT, ldfParser.HEX]: self.enterOuterAlt(localctx, 1) - self.state = 730 + self.state = 732 localctx.i = self.intValue() pass elif token in [ldfParser.FLOAT]: self.enterOuterAlt(localctx, 2) - self.state = 731 + self.state = 733 localctx.f = self.floatValue() pass else: @@ -4521,7 +4489,6 @@ def number(self): self.exitRule() return localctx - class StringValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4558,7 +4525,7 @@ def stringValue(self): self.enterRule(localctx, 100, self.RULE_stringValue) try: self.enterOuterAlt(localctx, 1) - self.state = 734 + self.state = 736 localctx.s = self.match(ldfParser.STRING) except RecognitionException as re: localctx.exception = re @@ -4568,7 +4535,6 @@ def stringValue(self): self.exitRule() return localctx - class IdentifierValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -4605,7 +4571,7 @@ def identifierValue(self): self.enterRule(localctx, 102, self.RULE_identifierValue) try: self.enterOuterAlt(localctx, 1) - self.state = 736 + self.state = 738 localctx.i = self.match(ldfParser.C_IDENTIFIER) except RecognitionException as re: localctx.exception = re diff --git a/pydbc/py3/ldfVisitor.py b/pydbc/py3/ldfVisitor.py index 87c8624..8537092 100644 --- a/pydbc/py3/ldfVisitor.py +++ b/pydbc/py3/ldfVisitor.py @@ -1,4 +1,4 @@ -# Generated from ldf.g4 by ANTLR 4.7.2 +# Generated from ldf.g4 by ANTLR 4.7 from antlr4 import * if __name__ is not None and "." in __name__: from .ldfParser import ldfParser diff --git a/pydbc/py3/ncf.tokens b/pydbc/py3/ncf.tokens index e69de29..4b7fc07 100644 --- a/pydbc/py3/ncf.tokens +++ b/pydbc/py3/ncf.tokens @@ -0,0 +1,120 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +T__55=56 +C_IDENTIFIER=57 +FLOAT=58 +INT=59 +HEX=60 +WS=61 +COMMENT=62 +STRING=63 +SIGN=64 +'node_capability_file'=1 +';'=2 +'LIN_language_version'=3 +'='=4 +'node'=5 +'{'=6 +'}'=7 +'general'=8 +'LIN_protocol_version'=9 +'supplier'=10 +'function'=11 +'variant'=12 +'bitrate'=13 +'sends_wake_up_signal'=14 +'yes'=15 +'no'=16 +'volt_range'=17 +','=18 +'temp_range'=19 +'conformance'=20 +'automatic'=21 +'min'=22 +'max'=23 +'select'=24 +'kbps'=25 +'diagnostic'=26 +'NAD'=27 +'to'=28 +'diagnostic_class'=29 +'P2_min'=30 +'ms'=31 +'ST_min'=32 +'N_As_timeout'=33 +'N_Cr_timeout'=34 +'support_sid'=35 +'max_message_length'=36 +'frames'=37 +'publish'=38 +'subscribe'=39 +'length'=40 +'min_period'=41 +'max_period'=42 +'event_triggered_frame'=43 +'signals'=44 +'size'=45 +'offset'=46 +'init_value'=47 +'encoding'=48 +'logical_value'=49 +'physical_value'=50 +'bcd_value'=51 +'ascii_value'=52 +'status_management'=53 +'response_error'=54 +'fault_state_signals'=55 +'free_text'=56 diff --git a/pydbc/py3/ncfLexer.py b/pydbc/py3/ncfLexer.py index 3d2a0c4..12d80aa 100644 --- a/pydbc/py3/ncfLexer.py +++ b/pydbc/py3/ncfLexer.py @@ -1,11 +1,10 @@ -# Generated from ncf.g4 by ANTLR 4.7.2 +# Generated from ncf.g4 by ANTLR 4.7 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2B") @@ -461,7 +460,7 @@ class ncfLexer(Lexer): def __init__(self, input=None, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache()) self._actions = None self._predicates = None diff --git a/pydbc/py3/ncfLexer.tokens b/pydbc/py3/ncfLexer.tokens index e69de29..4b7fc07 100644 --- a/pydbc/py3/ncfLexer.tokens +++ b/pydbc/py3/ncfLexer.tokens @@ -0,0 +1,120 @@ +T__0=1 +T__1=2 +T__2=3 +T__3=4 +T__4=5 +T__5=6 +T__6=7 +T__7=8 +T__8=9 +T__9=10 +T__10=11 +T__11=12 +T__12=13 +T__13=14 +T__14=15 +T__15=16 +T__16=17 +T__17=18 +T__18=19 +T__19=20 +T__20=21 +T__21=22 +T__22=23 +T__23=24 +T__24=25 +T__25=26 +T__26=27 +T__27=28 +T__28=29 +T__29=30 +T__30=31 +T__31=32 +T__32=33 +T__33=34 +T__34=35 +T__35=36 +T__36=37 +T__37=38 +T__38=39 +T__39=40 +T__40=41 +T__41=42 +T__42=43 +T__43=44 +T__44=45 +T__45=46 +T__46=47 +T__47=48 +T__48=49 +T__49=50 +T__50=51 +T__51=52 +T__52=53 +T__53=54 +T__54=55 +T__55=56 +C_IDENTIFIER=57 +FLOAT=58 +INT=59 +HEX=60 +WS=61 +COMMENT=62 +STRING=63 +SIGN=64 +'node_capability_file'=1 +';'=2 +'LIN_language_version'=3 +'='=4 +'node'=5 +'{'=6 +'}'=7 +'general'=8 +'LIN_protocol_version'=9 +'supplier'=10 +'function'=11 +'variant'=12 +'bitrate'=13 +'sends_wake_up_signal'=14 +'yes'=15 +'no'=16 +'volt_range'=17 +','=18 +'temp_range'=19 +'conformance'=20 +'automatic'=21 +'min'=22 +'max'=23 +'select'=24 +'kbps'=25 +'diagnostic'=26 +'NAD'=27 +'to'=28 +'diagnostic_class'=29 +'P2_min'=30 +'ms'=31 +'ST_min'=32 +'N_As_timeout'=33 +'N_Cr_timeout'=34 +'support_sid'=35 +'max_message_length'=36 +'frames'=37 +'publish'=38 +'subscribe'=39 +'length'=40 +'min_period'=41 +'max_period'=42 +'event_triggered_frame'=43 +'signals'=44 +'size'=45 +'offset'=46 +'init_value'=47 +'encoding'=48 +'logical_value'=49 +'physical_value'=50 +'bcd_value'=51 +'ascii_value'=52 +'status_management'=53 +'response_error'=54 +'fault_state_signals'=55 +'free_text'=56 diff --git a/pydbc/py3/ncfParser.py b/pydbc/py3/ncfParser.py index 90b5755..e7453db 100644 --- a/pydbc/py3/ncfParser.py +++ b/pydbc/py3/ncfParser.py @@ -1,11 +1,10 @@ -# Generated from ncf.g4 by ANTLR 4.7.2 +# Generated from ncf.g4 by ANTLR 4.7 # encoding: utf-8 from antlr4 import * from io import StringIO from typing.io import TextIO import sys - def serializedATN(): with StringIO() as buf: buf.write("\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3B") @@ -405,13 +404,12 @@ class ncfParser ( Parser ): def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) - self.checkVersion("4.7.2") + self.checkVersion("4.7") self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache) self._predicates = None - class ToplevelContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -484,7 +482,6 @@ def toplevel(self): self.exitRule() return localctx - class Language_versionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -536,7 +533,6 @@ def language_version(self): self.exitRule() return localctx - class Node_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -645,7 +641,6 @@ def node_definition(self): self.exitRule() return localctx - class Node_nameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -693,7 +688,6 @@ def node_name(self): self.exitRule() return localctx - class General_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -893,7 +887,6 @@ def general_definition(self): self.exitRule() return localctx - class Protocol_versionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -941,7 +934,6 @@ def protocol_version(self): self.exitRule() return localctx - class Supplier_idContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -989,7 +981,6 @@ def supplier_id(self): self.exitRule() return localctx - class Function_idContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1037,7 +1028,6 @@ def function_id(self): self.exitRule() return localctx - class Variant_idContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1085,7 +1075,6 @@ def variant_id(self): self.exitRule() return localctx - class Bitrate_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1199,7 +1188,6 @@ def bitrate_definition(self): self.exitRule() return localctx - class BitrateContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1249,7 +1237,6 @@ def bitrate(self): self.exitRule() return localctx - class Diagnostic_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1479,7 +1466,6 @@ def diagnostic_definition(self): self.exitRule() return localctx - class Frame_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1547,7 +1533,6 @@ def frame_definition(self): self.exitRule() return localctx - class Single_frameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1626,7 +1611,6 @@ def single_frame(self): self.exitRule() return localctx - class Frame_kindContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1678,7 +1662,6 @@ def frame_kind(self): self.exitRule() return localctx - class Frame_nameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1726,7 +1709,6 @@ def frame_name(self): self.exitRule() return localctx - class Frame_propertiesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1835,7 +1817,6 @@ def frame_properties(self): self.exitRule() return localctx - class Signal_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1903,7 +1884,6 @@ def signal_definition(self): self.exitRule() return localctx - class Signal_definition_entryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -1962,7 +1942,6 @@ def signal_definition_entry(self): self.exitRule() return localctx - class Signal_nameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2010,7 +1989,6 @@ def signal_name(self): self.exitRule() return localctx - class Signal_propertiesContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2101,7 +2079,6 @@ def signal_properties(self): self.exitRule() return localctx - class Init_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2167,7 +2144,6 @@ def init_value(self): self.exitRule() return localctx - class Init_value_scalarContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2219,7 +2195,6 @@ def init_value_scalar(self): self.exitRule() return localctx - class Init_value_arrayContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2294,7 +2269,6 @@ def init_value_array(self): self.exitRule() return localctx - class Encoding_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2362,7 +2336,6 @@ def encoding_definition(self): self.exitRule() return localctx - class Encoding_definition_entryContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2435,7 +2408,6 @@ def encoding_definition_entry(self): self.exitRule() return localctx - class Encoding_definition_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2521,7 +2493,6 @@ def encoding_definition_value(self): self.exitRule() return localctx - class Encoding_nameContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2569,7 +2540,6 @@ def encoding_name(self): self.exitRule() return localctx - class Logical_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2639,7 +2609,6 @@ def logical_value(self): self.exitRule() return localctx - class Physical_rangeContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2736,7 +2705,6 @@ def physical_range(self): self.exitRule() return localctx - class Bcd_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2782,7 +2750,6 @@ def bcd_value(self): self.exitRule() return localctx - class Ascii_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2828,7 +2795,6 @@ def ascii_value(self): self.exitRule() return localctx - class Signal_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2876,7 +2842,6 @@ def signal_value(self): self.exitRule() return localctx - class Min_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2924,7 +2889,6 @@ def min_value(self): self.exitRule() return localctx - class Max_valueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -2972,7 +2936,6 @@ def max_value(self): self.exitRule() return localctx - class ScaleContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3020,7 +2983,6 @@ def scale(self): self.exitRule() return localctx - class OffsetContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3068,7 +3030,6 @@ def offset(self): self.exitRule() return localctx - class Text_infoContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3116,7 +3077,6 @@ def text_info(self): self.exitRule() return localctx - class Status_managementContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3210,7 +3170,6 @@ def status_management(self): self.exitRule() return localctx - class Published_signalContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3258,7 +3217,6 @@ def published_signal(self): self.exitRule() return localctx - class Free_text_definitionContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3312,7 +3270,6 @@ def free_text_definition(self): self.exitRule() return localctx - class IntValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3376,7 +3333,6 @@ def intValue(self): self.exitRule() return localctx - class FloatValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3423,7 +3379,6 @@ def floatValue(self): self.exitRule() return localctx - class NumberContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3489,7 +3444,6 @@ def number(self): self.exitRule() return localctx - class StringValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): @@ -3536,7 +3490,6 @@ def stringValue(self): self.exitRule() return localctx - class IdentifierValueContext(ParserRuleContext): def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): diff --git a/pydbc/py3/ncfVisitor.py b/pydbc/py3/ncfVisitor.py index d17ed89..2ad8e3d 100644 --- a/pydbc/py3/ncfVisitor.py +++ b/pydbc/py3/ncfVisitor.py @@ -1,4 +1,4 @@ -# Generated from ncf.g4 by ANTLR 4.7.2 +# Generated from ncf.g4 by ANTLR 4.7 from antlr4 import * if __name__ is not None and "." in __name__: from .ncfParser import ncfParser