首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【DBC专题】-5-DBC文件格式解析

  • 23-09-21 18:22
  • 3630
  • 13622
blog.csdn.net

目录

0 DBC文件中“符号字符串”命名要求

1 DBC文件的标头

2 Bit Timing波特率定义

3 Node节点定义

4 Value Table值表定义

5 Message消息定义

5.1 标准帧Message定义举例

5.2 扩展帧Message定义举例

6 Signal信号定义

7 Value Table指标的绑定Signal信号

8 Comment注释定义

8.1 Node节点的注释举例

8.2 Message消息的注释举例

8.3 Signal信号的注释举例

9 User Defined Attribute用户定义的属性定义

9.1 Attribute属性定义

9.2 Attribute属性值

10 本文使用的DBC文件内容附录

11 结尾


关键字:

DBC:CANdb network file (Data Base for CAN)

描述CAN网络所需的所有信息都存储在CANdb network file中。CANdb network file的文件扩展名为DBC,可以使用CANdb编辑器(CAN数据库编辑器)或CANdb ++编辑器创建。

 

推荐阅读(单击下方文字即可跳转至对应博文):

1、【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC

2、【DBC专题】-2-CAN Signal信号的Multiplexor多路复用在DBC中实现

3、【DBC专题】-3-利用CANdb++ Editor在DBC文件添加帧CAN_ID和信号CAN_Signal

4、【DBC专题】-4-DBC文件中的Signal信号字节顺序Motorola和Intel介绍

5、【DBC专题】-6-Signal信号字节顺序Motorola_LSB/MSB/Sequential/Backward,Intel_Standard/Sequential等6类格式详解

 

通过前两个【DBC专题】中,我们已经掌握了DBC的创建和制作。在一些高阶应用(如DBC转Excel,DBC转XML,DBC转ARXML等等)中,了解这些显然是不够的,需要熟知其文件格式,毕竟“CANdb++ Editor”是参照某个标准,生成DBC文件的一个工具而已。

 

DBC文件描述单个CAN网络的通信。完成“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文中的第2章节,我们会得到一个Classic CAN的数据库DBC文件空模板(见下图左侧);完成第9章节,我们会得到一个较为完成DBC文件(见下图右侧),二者的差异下图。

 

一眼看去感觉有点“蒙”,下面我们就逐一来介绍这些“关键字”。

 

0 DBC文件中“符号字符串”命名要求

 

DBC文件中除了固定格式的关键字外,还有一些用户自定义的“符号字符串”,像Node,Message,Signal…的命名,其要求为:

  • 以字母字符或下划线开头,并且可能进一步由字母数字字符和下划线组成。
  • 长度最多为128个字符。为了与较旧的工具兼容,长度不得超过32个字符。

 

1 DBC文件的标头

 

关键字:VERSION

关键字:NS_   ,全称:new symbols

 

描述:

DBC文件包含带有版本(关键字:VERSION)和新符号条目(关键字:NS_)的标头。关键字:VERSION后面的双引号中通常是空的,或者是CANdb++编辑器使用的字符串。

 

该部分基本是固定的。

 

2 Bit Timing波特率定义

 

关键字:BS_

 

Bit Timing定义了网络的波特率和BTR寄存器的设置。该部分已过时,不再使用。但是,关键字“BS_”必须出现在DBC文件中。

 

举例:

BS_:

 

3 Node节点定义

 

关键字:BU_

 

格式:

BU_: node_1_name node_2_name…

 

描述:

a)CAN网络汇中所有节点的名称在此处定义,且定义的名称必须唯一;

b)节点与节点之间以“空格”分隔;

c)节点的命名必须满足“符号字符串”要求。

 

举例:

在“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文的第3章节我们定义两个节点:VCU和OBD,其在DBC文件中的描述为:

BU_: VCU OBD

 

4 Value Table值表定义

 

关键字:VAL_TABLE_

 

格式:

VAL_TABLE_ value_table_name value_table_value “value_description” …0 “value_description”;

 

描述:

a)一个value table中以“空格”分隔;

b)value_table_name表示value table的名称, 命名必须满足“符号字符串”要求;

c) value_table_value表示value table的值,十进制表示;

d) value_description表示value table的值描述;

e)当一个value table存在多个值描述时,以(value_table_value “value_description”)的形式接着追加,value table内的两个值描述以“空格”分隔;

f)完成一个value table定义,需以“分号;”结尾;

g)多个value table需要换行。

 

举例:

在“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文的第7章节我们定义两个value table:Voltage_state和OBD_status_description,其在DBC文件中的描述为:

VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;

 

5 Message消息定义

 

关键字:BO_

 

格式:

BO_ message_id message_name: message_size transmitter

 

描述:

a)message_id表示CAN_ID,以十进制表示。在DBC文件中,CAN-ID必须唯一。如果CAN_ID的类型是“CAN Extended”,则在DBC文件中表示是“0x8000 0000 + 十六进制CAN_ID”的十进制转换;

b)message_name表示CAN_ID的消息名称,在在Message中必须是唯一, 命名必须满足“符号字符串”要求;

c) “: ” 冒号不能少;

d)message_size表示Message消息的长度,以字节为单位,十进制表示;

e)transmitter表示该Message的发送节点, 如果Message没有定义发送节点,则必须在此处输入字符串“Vector__XXX”;

 

5.1 标准帧Message定义举例

 

在“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文的第4章节我们定义一个Message:Test_ID_211,其在DBC文件中的描述为:

BO_ 530 Test_ID_212: 8 OBD

 

 

5.2 扩展帧Message定义举例

 

与4.1章节的差异是Type中选择了CAN Extended,注意在DBC文件中CAN_ID描述:

 

BO_ 2147484177 Test_ID_211: 8 OBD

 

 

6 Signal信号定义

 

关键字:SG_

 

格式:

SG_ signal_name multiplexer_indicator : start_bit|signal_size@byte_order+value_type (factor,offset) [minimum|maximum] “unit” receiver

 

描述:

a) signal_name表示信号的名称。一个Message消息中的信号名称必须唯一。多个Message消息之间可以存在相同名称信号。命名必须满足“符号字符串”要求;

b) multiplexer_indicator含义:

  1. “ M”(大写)将信号定义为Multiplexor Signal。一个消息中只有一个信号可以是Multiplexor Signal;
  2. “m”(小写)后跟无符号整数,将信号定义为Multiplexed Signal;
  3. “空格”将信号定义为普通的Signal,表示没有复用。

c)“:”冒号不能少;

d)start_bit值指定信号在帧的数据域内的位置:Intel(小端)模式这里表示信号的LSB;Motorola(大端)模式这里表示信号的MSB;

e)signal_size表示信号的长度,以位为单位,十进制表示;

f)“@”不能少;

g)byte_order表示字节顺序。如果信号的字节顺序为Intel(小端),则byte_order为1;如果字节顺序为Motorola(大端),则byte_order为0;

h)value_type表示值类型。“+”表示无符号;“-”表示有符号;

i)(factor,offset)表示分辨率(不能为0)和偏移量,这两个值于该信号的原始值与物理值之间的转换。转换如下:物理值=原始值* factor + offset;

j)[minimum|maximum]表示最小值和最大值,定义了信号的有效物理值的范围;

k) unit表示信号的单位,为字符串类型;

l) receiver表示信号的接收方,信号的接收方可以是多个节点,接收方节点名称必须在关键字BU_中定义。如果信号没有定义接收方,则必须在此处输入字符串“Vector__XXX”。

 

举例:

在“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文的第6章节我们定义三个信号:OBD_status、Current_value和Voltage_value,其在DBC文件中的描述为:

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 

其在第5章生成的DBC文件效果如下:

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-" Vector__XXX

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A" Vector__XXX

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V" Vector__XXX

 

以第6章为基础,拓展一下,新定义一个DCDC节点,同时DCDC也接收者三个信号:OBD_status、Current_value和Voltage_value,其在DBC文件效果如下:当信号被多个节点接收时,在DBC中的描述,节点与节点之间用“逗号,”隔开。

BU_: DCDC VCU OBD

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  DCDC,VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  DCDC,VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  DCDC,VCU

 

在“【DBC专题】-2-CAN Signal信号的Multiplexor多路复用在DBC中实现”多路复用信号在DBC文件中的描述如下:

VAL_TABLE_ Package_Num_Value 1 "No.2" 0 "N0.1" ;

 

BO_ 530 Test_ID_212: 8 OBD

 SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-"  VCU

 

7 Value Table指标的绑定Signal信号

 

关键字:VAL_

 

格式:

VAL_ message_id signal_name  value_table_value “value_description” …… 0 “value_description”;

 

描述:

a) message_id同Message中的关键字描述;

b) signal_name同Signal中的关键字描述;

c) value_table_value “value_description” …… 0 “value_description”同Value Table中的关键字描述。

d)完成一个value table与信号绑定,需以“分号;”结尾;

f)多个value table与信号绑定需要换行。

 

举例:

在“【DBC专题】-1-如何使用CANdb++ Editor创建并制作一个DBC”一文的第8章节我们将Value Table绑定了信号,其在DBC文件中的描述为:

 

VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;

 

BO_ 529 Test_ID_211: 8 OBD

 SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-"  VCU

 SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A"  VCU

 SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V"  VCU

 

VAL_ 529 OBD_status 2 "Shutdown" 1 "Run" 0 "Initialization" ;

VAL_ 529 Voltage_value 65535 "Invalid voltage" ;

8 Comment注释定义

 

关键字:CM_

 

8.1 Node节点的注释举例

 

格式:

CM_ BU_ node_name “Comment”;

 

举例:

CM_ BU_ VCU "VCU node in can network";

CM_ BU_ OBD "OBD node in CAN network";

 

 

 

8.2 Message消息的注释举例

 

格式:

CM_ BO_ message_id “Comment”;

 

举例:

CM_ BO_ 529 "The CAN_ID of the test message is 0x211.";

 

 

8.3 Signal信号的注释举例

 

格式:

CM_ SG_ message_id signal_name “Comment”;

 

举例:

CM_ SG_ 529 OBD_status "OBD working status signal";

CM_ SG_ 529 Current_value "OBD current signal.";

CM_ SG_ 529 Voltage_value "OBD voltage signal.";

 

9 User Defined Attribute用户定义的属性定义

 

User defined attributes是扩展DBC文件的对象属性的一种方法。这些附加属性必须使用具有属性默认值的属性定义来定义。对于具有为属性定义的值的每个对象,必须定义一个属性值。 如果未对对象定义属性值,则该对象的属性值为该属性的默认值。

 

9.1 Attribute属性定义

 

关键字:BA_DEF_

关键字:BA_DEF_DEF_

 

格式:

BA_DEF_ object_type “attribute_name”attribute_value_type ;

BA_DEF_DEF_ attribute_name attribute_value ;

 

描述:

a) object_type表示BU_、BO_、SG_、EV_等关键字;

b) attribute_name表示属性的名称,一般比较固定,参照相应的标准;

c) attribute_value_type表示INT、FLOAT、STRING、ENUM、HEX等类型,各自的表示发如下:

  1. INT signed_integer signed_integer;
  2. HEX signed_integer signed_integer;
  3. FLOAT double double;
  4. STRING ;
  5. ENUM “char_1_string ”, “char_2_string”, “char_3_string”;

d) attribute_name同b);

e) attribute_value表示unsigned_integer 、 signed_integer、double |char_string

f)完成一个Attribute,需以“分号;”结尾;

g)多个Attribute与信号绑定需要换行。

 

举例:

BA_DEF_ SG_  "ProjectSignalRequirementNb" STRING ;

BA_DEF_ SG_  "GenSigStartValue" HEX 0 0;

BA_DEF_ SG_  "GenericSignalRequirementNb" STRING ;

BA_DEF_  "Manufacturer" STRING ;

BA_DEF_ BO_  "ProjectFrameRequirementNb" STRING ;

BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","OnEvent","Cyclic_And_OnEvent";

BA_DEF_ BO_  "GenMsgCycleTime" INT 0 65535;

BA_DEF_ BO_  "GenericFrameRequirementNb" STRING ;

BA_DEF_DEF_  "ProjectSignalRequirementNb" "";

BA_DEF_DEF_  "GenSigStartValue" 0;

BA_DEF_DEF_  "GenericSignalRequirementNb" "";

BA_DEF_DEF_  "Manufacturer" "BMW";

BA_DEF_DEF_  "ProjectFrameRequirementNb" "";

BA_DEF_DEF_  "GenMsgSendType" "Cyclic";

BA_DEF_DEF_  "GenMsgCycleTime" 0;

BA_DEF_DEF_  "GenericFrameRequirementNb" "";

 

9.2 Attribute属性值

 

关键字:BA_

 

格式:

BA_ attribute_name BU_ node_name attribute_value;

BA_ attribute_name BO_ message_id attribute_value;

BA_ attribute_name SG_ message_id signal_name attribute_value;

BA_ attribute_name EV_ env_var_name attribute_value;

 

举例:

BA_ "GenMsgSendType" BO_ 530 2;

BA_ "GenMsgCycleTime" BO_ 530 1000;

BA_ "GenMsgSendType" BO_ 529 1;

BA_ "GenMsgCycleTime" BO_ 529 100;

BA_ "GenSigStartValue" SG_ 530 Voltage_6_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_5_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_4_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_3_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_2_Value 3000;

BA_ "GenSigStartValue" SG_ 530 Voltage_1_Value 3000;

BA_ "GenSigStartValue" SG_ 529 OBD_status 2;

BA_ "GenSigStartValue" SG_ 529 Current_value 0;

BA_ "GenSigStartValue" SG_ 529 Voltage_value 768;

 

10 本文使用的DBC文件内容附录

  1. VERSION ""
  2. NS_ :
  3. NS_DESC_
  4. CM_
  5. BA_DEF_
  6. BA_
  7. VAL_
  8. CAT_DEF_
  9. CAT_
  10. FILTER
  11. BA_DEF_DEF_
  12. EV_DATA_
  13. ENVVAR_DATA_
  14. SGTYPE_
  15. SGTYPE_VAL_
  16. BA_DEF_SGTYPE_
  17. BA_SGTYPE_
  18. SIG_TYPE_REF_
  19. VAL_TABLE_
  20. SIG_GROUP_
  21. SIG_VALTYPE_
  22. SIGTYPE_VALTYPE_
  23. BO_TX_BU_
  24. BA_DEF_REL_
  25. BA_REL_
  26. BA_DEF_DEF_REL_
  27. BU_SG_REL_
  28. BU_EV_REL_
  29. BU_BO_REL_
  30. SG_MUL_VAL_
  31. BS_:
  32. BU_: DCDC VCU OBD
  33. VAL_TABLE_ Package_Num_Value 1 "No.2" 0 "N0.1" ;
  34. VAL_TABLE_ OBD_status_description 2 "Shutdown" 1 "Run" 0 "Initialization" ;
  35. VAL_TABLE_ Voltage_state 65535 "Invalid voltage" ;
  36. BO_ 530 Test_ID_212: 8 OBD
  37. SG_ Voltage_6_Value m1 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU
  38. SG_ Voltage_5_Value m1 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU
  39. SG_ Voltage_4_Value m1 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU
  40. SG_ Voltage_3_Value m0 : 55|16@0+ (0.1,0) [0|6553.5] "V" VCU
  41. SG_ Voltage_2_Value m0 : 39|16@0+ (0.1,0) [0|6553.5] "V" VCU
  42. SG_ Voltage_1_Value m0 : 23|16@0+ (0.1,0) [0|6553.5] "V" VCU
  43. SG_ Package_Num M : 7|8@0+ (1,0) [0|1] "-" VCU
  44. BO_ 529 Test_ID_211: 8 OBD
  45. SG_ OBD_status : 39|8@0+ (1,0) [0|255] "-" DCDC,VCU
  46. SG_ Current_value : 23|16@0- (0.1,0) [-300|300] "A" DCDC,VCU
  47. SG_ Voltage_value : 7|16@0+ (0.1,0) [0|6553.5] "V" DCDC,VCU
  48. CM_ BU_ DCDC "DCDC node in CAN network";
  49. CM_ BU_ VCU "VCU node in can network";
  50. CM_ BU_ OBD "OBD node in CAN network";
  51. CM_ BO_ 530 "The CAN_ID of the test message is 0x212.";
  52. CM_ SG_ 530 Voltage_6_Value "Value of Voltage_6.";
  53. CM_ SG_ 530 Voltage_5_Value "Value of Voltage_5.";
  54. CM_ SG_ 530 Voltage_4_Value "Value of Voltage_4.";
  55. CM_ SG_ 530 Voltage_3_Value "Value of Voltage_3.";
  56. CM_ SG_ 530 Voltage_2_Value "Value of Voltage_2.";
  57. CM_ SG_ 530 Voltage_1_Value "Value of Voltage_1.";
  58. CM_ SG_ 530 Package_Num "Number of Voltage.";
  59. CM_ BO_ 529 "The CAN_ID of the test message is 0x211.";
  60. CM_ SG_ 529 OBD_status "OBD working status signal.";
  61. CM_ SG_ 529 Current_value "OBD current signal.";
  62. CM_ SG_ 529 Voltage_value "OBD voltage signal.";
  63. BA_DEF_ SG_ "ProjectSignalRequirementNb" STRING ;
  64. BA_DEF_ SG_ "GenSigStartValue" HEX 0 0;
  65. BA_DEF_ SG_ "GenericSignalRequirementNb" STRING ;
  66. BA_DEF_ "Manufacturer" STRING ;
  67. BA_DEF_ BO_ "ProjectFrameRequirementNb" STRING ;
  68. BA_DEF_ BO_ "GenMsgSendType" ENUM "Cyclic","OnEvent","Cyclic_And_OnEvent";
  69. BA_DEF_ BO_ "GenMsgCycleTime" INT 0 65535;
  70. BA_DEF_ BO_ "GenericFrameRequirementNb" STRING ;
  71. BA_DEF_ "BusType" STRING ;
  72. BA_DEF_DEF_ "ProjectSignalRequirementNb" "";
  73. BA_DEF_DEF_ "GenSigStartValue" 0;
  74. BA_DEF_DEF_ "GenericSignalRequirementNb" "";
  75. BA_DEF_DEF_ "Manufacturer" "BMW";
  76. BA_DEF_DEF_ "ProjectFrameRequirementNb" "";
  77. BA_DEF_DEF_ "GenMsgSendType" "Cyclic";
  78. BA_DEF_DEF_ "GenMsgCycleTime" 0;
  79. BA_DEF_DEF_ "GenericFrameRequirementNb" "";
  80. BA_DEF_DEF_ "BusType" "CAN";
  81. BA_ "GenMsgSendType" BO_ 530 2;
  82. BA_ "GenMsgCycleTime" BO_ 530 1000;
  83. BA_ "GenMsgSendType" BO_ 529 1;
  84. BA_ "GenMsgCycleTime" BO_ 529 100;
  85. BA_ "GenSigStartValue" SG_ 530 Voltage_6_Value 3000;
  86. BA_ "GenSigStartValue" SG_ 530 Voltage_5_Value 3000;
  87. BA_ "GenSigStartValue" SG_ 530 Voltage_4_Value 3000;
  88. BA_ "GenSigStartValue" SG_ 530 Voltage_3_Value 3000;
  89. BA_ "GenSigStartValue" SG_ 530 Voltage_2_Value 3000;
  90. BA_ "GenSigStartValue" SG_ 530 Voltage_1_Value 3000;
  91. BA_ "GenSigStartValue" SG_ 529 OBD_status 2;
  92. BA_ "GenSigStartValue" SG_ 529 Current_value 0;
  93. BA_ "GenSigStartValue" SG_ 529 Voltage_value 768;
  94. VAL_ 530 Package_Num 1 "No.2" 0 "N0.1" ;
  95. VAL_ 529 OBD_status 2 "Shutdown" 1 "Run" 0 "Initialization" ;
  96. VAL_ 529 Voltage_value 65535 "Invalid voltage" ;

 

11 结尾

汽车电子助手
微信公众号
“汽车电子软件与Autosar”领域优秀创作平台
注:本文转载自blog.csdn.net的汽车电子助手的文章"https://blog.csdn.net/qfmzhu/article/details/111598606"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top