From bf514f2f71afcb1c96c7c03122d708362d0f045c Mon Sep 17 00:00:00 2001 From: Irene-Maxine <114802521+Irene-Maxine@users.noreply.github.com> Date: Sun, 25 May 2025 16:36:12 +0800 Subject: [PATCH] =?UTF-8?q?AI=5Flocal=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micropython/blocks/ai_local.js | 2 +- .../micropython/generators/display_onboard.js | 26 +++++++++--------- .../micropython_esp32s3/template.xml | 7 +++-- common/media/mark/AIvoice.png | Bin 1356 -> 1362 bytes common/msg/blockly/en.js | 24 ++++++++++++++++ common/msg/blockly/zh-hans.js | 2 +- common/msg/blockly/zh-hant.js | 24 ++++++++++++++++ 7 files changed, 67 insertions(+), 18 deletions(-) diff --git a/boards/default_src/micropython/blocks/ai_local.js b/boards/default_src/micropython/blocks/ai_local.js index 31ae19a8..9232fe18 100644 --- a/boards/default_src/micropython/blocks/ai_local.js +++ b/boards/default_src/micropython/blocks/ai_local.js @@ -1,5 +1,5 @@ import * as Blockly from 'blockly/core'; -const AI_LOCAL_VOICE_HUE = '#D1D431'; +const AI_LOCAL_VOICE_HUE = '#2FAD7A'; const AI_LOCAL_GRAPH_HUE = '#90A244'; //voice part diff --git a/boards/default_src/micropython/generators/display_onboard.js b/boards/default_src/micropython/generators/display_onboard.js index bb1d031a..be97c333 100644 --- a/boards/default_src/micropython/generators/display_onboard.js +++ b/boards/default_src/micropython/generators/display_onboard.js @@ -43,8 +43,8 @@ export const display_show_frame_string = function (_, generator) { if (version == 'mpython' || version == 'educore') { generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled"; var code = "onboard_oled.frame(" + data + ")\n"; - } else if (version == 'mixgo_nova') { - generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_tft"; + } else if (version == 'mixgo_nova'||'mixgo_sant') { + generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT); var code = "onboard_tft.frame(" + data + ", color=0xffff)\n"; } else { @@ -62,7 +62,7 @@ export const display_show_frame_string_delay = function (_, generator) { generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled"; var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT); var code = "onboard_oled.frame(" + data + ', delay=' + time + ")\n"; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var code = "onboard_tft.frame(" + data + ', size=5 , delay=' + time + ', color=0xffff)\n'; } else { @@ -78,7 +78,7 @@ export const display_scroll_string = function (_, generator) { generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled"; var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT); var code = "onboard_oled.scroll(" + data + ")\n"; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var data = generator.valueToCode(this, 'data', generator.ORDER_ASSIGNMENT); var code = "onboard_tft.scroll(" + data + ", color=0xffff)\n"; @@ -98,7 +98,7 @@ export const display_scroll_string_delay = function (_, generator) { if (version == 'mpython' || version == 'educore') { generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled"; var code = "onboard_oled.scroll(" + data + ', speed=' + time + ', space=' + space + ")\n"; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var code = "onboard_tft.scroll(" + data + ', y=0, size=5, speed=' + time + ', space=' + space + ', color=0xffff)\n'; } else { @@ -141,7 +141,7 @@ export const display_image_builtins = function (block, generator) { export const display_image_builtins_all = function (block, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - if (version == 'mixgo_nova') { + if (version == 'mixgo_nova'||'mixgo_sant') { const PIN_VALUE = block.getFieldValue('image'); const data = PIN_VALUE.split('.'); if (data.length !== 2) { @@ -253,7 +253,7 @@ export const display_clear = function (block, generator) { if (version == 'mpython') { generator.definitions_['import_' + version + '_onboard_oled'] = "from " + version + " import onboard_oled"; var code = 'onboard_oled.fill(0)\n' + 'onboard_oled.show()\n'; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var code = 'onboard_tft.fill(0)\n' + 'onboard_tft.show()\n'; } else { @@ -288,7 +288,7 @@ export const display_shift = function (a, generator) { var op = a.getFieldValue("OP"); var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC); var code = 'onboard_oled.' + op + '(' + value + ')\n'; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var op = a.getFieldValue("OP"); var value = generator.valueToCode(a, 'val', generator.ORDER_ATOMIC); @@ -315,7 +315,7 @@ export const display_get_pixel = function (block, generator) { var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC); var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC); var code = 'onboard_oled.pixel(int(' + value_x + '), int(' + value_y + '))'; - } else if (version == 'mixgo_nova') { + } else if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var value_x = generator.valueToCode(block, 'x', generator.ORDER_ATOMIC); var value_y = generator.valueToCode(block, 'y', generator.ORDER_ATOMIC); @@ -332,7 +332,7 @@ export const display_get_pixel = function (block, generator) { export const display_bright_point = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - if (version == 'mixgo_nova') { + if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT); var y = generator.valueToCode(this, 'y', generator.ORDER_ASSIGNMENT); @@ -349,7 +349,7 @@ export const display_bright_point = function (_, generator) { export const display_get_screen_pixel = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - if (version == 'mixgo_nova') { + if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var code = 'onboard_tft.get_brightness()'; } else { @@ -361,7 +361,7 @@ export const display_get_screen_pixel = function (_, generator) { export const display_bright_screen = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2]; - if (version == 'mixgo_nova') { + if (version == 'mixgo_nova'||'mixgo_sant') { generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var x = generator.valueToCode(this, 'x', generator.ORDER_ASSIGNMENT); var code = 'onboard_tft.set_brightness(' + x + ')\n'; @@ -1101,7 +1101,7 @@ export const onboard_tft_display_shape_circle = function (block, generator) { export const draw_pointer = function (_, generator) { var version = Boards.getSelectedBoardKey().split(':')[2] - if (version == 'mixgo_nova'){ + if (version == 'mixgo_nova'||'mixgo_sant'){ generator.definitions_['import_' + version + '_onboard_tft'] = "from " + version + " import onboard_tft"; var angle = generator.valueToCode(this, 'angle', generator.ORDER_ASSIGNMENT); var code = "onboard_tft.pointern(angle=" + angle + ")\n"; diff --git a/boards/default_src/micropython_esp32s3/template.xml b/boards/default_src/micropython_esp32s3/template.xml index 092aa5fd..bfc2a90f 100644 --- a/boards/default_src/micropython_esp32s3/template.xml +++ b/boards/default_src/micropython_esp32s3/template.xml @@ -2333,7 +2333,7 @@ - + @@ -5116,7 +5116,7 @@ - + @@ -5133,7 +5133,8 @@ - > + + diff --git a/common/media/mark/AIvoice.png b/common/media/mark/AIvoice.png index e93fbdf6dd0cc7bef91a6c3c99a6e85d301b78c9..395a9acf756a63afddfeb835e2f9d12e4634dc2f 100644 GIT binary patch delta 1323 zcmV+`1=RY?3epOYIDZ8MNkl)69yfiUVd$=^uG@9bxpi-iG6X*uhQBqzFMoz{pJw<<6TEF0pECq^ z4TR5JsLBA%_`P9l9_!Ks-)P1ch6q-u;~AH4f9%w12p0@S{<2B~ZmKrC`wiiXn&Bfu zcrZ1J@Lx^vUWM^$RW{r_6P#2f|5iirrY86^ULnS#hGBhei@I?eE7;&SkT3W5_cIDy{gI# z!#G}gL(C*rMSdmO8jidhR9Rsd$83_dNtGGZ$RDw8_0x*TJ8!`QHPsTS;2450<+oal zoL)2Tuv?YMg^n{g>0j)M9E(=1NhSfm+S1X(3mKzI-tB4mDZ+=;VnIi6x0H(v;a>|W z7a4-JnSZj=*8a?LzLQ~mIhhFTm5ASC-z}M<;DJTqiNin`oT3T8wk{U-(pMAgaz((d zJZY*WhTs#q`fg~I>Q@-XS-Uc~%vUfB!yzje)7^Mt8uh{dPY_}m#doYB&*$&MjAs0_ z{c8?K^{bqO8^Y0UJdv_f-vvQ8#)f5!VhF!=E`L&u@J{z!R;Sz7Ok)w_w2r(hyYa*j zZtJ@sNFZyy1ol=M{=GRv88^4coKM2yBaGzPc-&T2rp;hUrE>-KehGphc*Sm2HjacN zCuW~Xeb_Mk(d}y*Le8cEhGC-JeRSmC=#DsCg|ja_(UG^ZTc#)zv_|Z+li8o^%dki8 z4}UlC8ryyjPh8n4{$PY#3+0Ik@gmdkZqo!$8^VTt(at$W5`LB#;yvixrV`ed%d^^4 zuvB)>a@D4SrE*W6wYyKc4I*461{A`R3VD~g3FR(12x|LEI`l8Kv0>J_*hH2mvI^EE z_vDR-{my-^eJeOiGai;pe#^Z=cp`c(gMV5#`CSvfAz5OT$4u8sB;)3s+b~Sz+>Vgj z`lURPRj_01NCRV0JgG81;-at^(q7lfsaPgBI(d~9&1RRPTqjKVg#3&cZC6=fRvOKX$)fDAQ$0&*?xu{I|TQB)Y$`is-$A2{$ zN43EjY}+2pmSqd$N%}Iz_cJehbe@L9Zj+Xg7!JvPOSQMN?qkQ^mU~zvPZC35Ch>Xy zsrmLv-6rK2?CR9cIG%Jl-Yb+Rn&2f%=6a9)T5iL*rBj=smishCDd&t)Bu@Q|klEO+fmk7N4-8E-Q+|UfW z9dUayB;z)culLfoW96k2G{I|gqV}==tHQ9m*HhiB+eq<36%Fm8X!3WBan1Ow1U&g; zK&gW delta 1317 zcmV+=1={-33d{caZ!FVB> zs4F$oGuJoSjW@@voB3eiZhO0@tE;~H>op|sJu&`i8Ga^#oqr_wB{9Bk8J~#a;6{<9 zXPG*H7{0TDokKk&&?bSWqA0w`9L|`WJpZ_f2{@BETxjFQl~&+35`3B%KO}}dxj>Bn zSiyH~J8YP`VSIe~(NPRnli({>U~eiE{AC%|HJjlvrjBTS6P`f~>#e{6r=@X`p%YDA zL2-DQ75u?z=YRc9#~f+u3g&PjG3-u+VYuJa8LcR|&Y9RxTen_*f~hlzVVm=4D@>hX z8P=udg=&RN>a}V9MD|M)EQQAEPo|^aJ#89D1!Ua=nl`DI>R!q zt-T;E2|(Si7F$t-SD3mY5`5Stjjx(IBZ^_At4VgX+e=TM?>e21IYK))mf;Ki+YF+n zw}M-oR^FNKI?N;IWKE8Nb!&7J#Q2LN{N3|eBZ}eLyjv6DU1m@q#+$TVM2vsTr(I+j zSI_j)V1JVtBuMaCSDWn6h+k%|6?ko?e+Ih;!jlXlL&sXduN_}T%gnWmEw2gKl_x5k zW%yX1z6&}L!v$7wI?0GRxN5ErgBbQXjg0l;Nh=N(|8EY#o!T3&j(>92=Yr!_@RQGe@y$s z#Q1x!)3gF_`(*$zZY-J)Nw_S(;&2_#zVL*&aec2!Q8(x|vD0zk$64cylj+8AME~!` zlYgx3lpYvts+1?KR&aKUgKJ3OL1KK=AN^ZDtAr=1Ki7p5Gx?1eUw_srkr{%Xok+$FzS*cizS${HjDG+gPgD!; zu(srxa#cLB4EJPFSOqEewR|t;2gl64sz&|lQazXP4@+=WW*bMY??_a^{mbi#S+((7UVTiRIuSXCCWI z&GXHMado%vbX@&G3?FslK`yBCfPY;PMUBuhKB6v9NtvV|?XaQITqE%I?Tb#*xM3M3 zBW@W%e6!Jdz0BNhofp#$B=|xxY9I1pl(M(FzS(H=!c+~)qbTgvU_}CtX~5GT2Bbf( zNnLIFGY*_mj`-_9# bS6TcEVC8YvvE?t%00000NkvXXu0mjfnlF=Y diff --git a/common/msg/blockly/en.js b/common/msg/blockly/en.js index 48c504c3..ea1995ce 100644 --- a/common/msg/blockly/en.js +++ b/common/msg/blockly/en.js @@ -40,6 +40,8 @@ En.MSG = { catAIOT:"Intelligent IOT", catAIsensor:"MixGoAI Sensor", catAIsensor2:"MixGoAI image identification", + catAIgraphsensor:"Image processing", + catAIvoicesensor:"Speech processing", catSensor: "Sensor", catActuator: "Actuator", catExternSensor: "External Sensor", @@ -64,6 +66,7 @@ En.MSG = { catTurtle: "Turtle", catTuple: "Tuple", catIot: "IOT", + catAIonboard:"On-board intelligence", catSet: "Set", catData: "Data", catAlgorithm: "Algorithm", @@ -3926,4 +3929,25 @@ En.MIXLY_SET_DEGREE = 'convert angles'; En.MIXLY_TRANS_TO_RADIAN = 'to radians'; En.MIXLY_REF_TO_PRESSURE = 'Reference pressure'; En.MIXLY_CAL_TO_ALTITUDE = 'Calculate the altitude'; +En.MIXLY_SHOOTING_SIZE = 'Capture Size'; +En.MIXLY_SHOOT_AND_SAVE_PICTURE = 'Capture and Save Photo'; +En.MIXLY_GET_PICTURE_DATA = 'Get Image Data'; +En.MIXlY_SCREEN_SHOW_CAM_SHOOT = 'Display Camera Capture on Screen'; +En.MIXlY_STOP_SCREEN_DISPLAY = 'Turn Off Real-Time LCD Display of Camera Capture'; +En.MIXLY_RECOGNITION = 'Detection'; +En.MIXLY_GET_QR_CODE_RECOGNITION_RESULT = 'Get QR Code Detection Result'; +En.MIXLY_GET_QR_CODE_RECOGNITION_RESULT_TOOLTIP = 'Returns None if no result is detected. If detected, a green square appears in the top-left corner, and the QR code information is returned.'; +En.COLOUR_RGB_GREY = "Gray"; +En.MIXLY_CUSTOM_STUDY = "Custom Learning"; +En.MIXLY_GET_COLOR_DETECTION_RESULT = 'Get Color Detection Result'; +En.MIXLY_GET_COLOR_DETECTION_RESULT_TOOLTIP = 'Get color detection results, returning the number of rectangular regions and their top-left and bottom-right coordinates (4 values).'; +En.MIXLY_CAT_FACE = 'Cat Face'; +En.MIXLY_GET_CAT_FACE_DETECTION_RESULT = 'Get Cat Face Detection Result'; +En.MIXLY_GET_CAT_FACE_DETECTION_RESULT_TOOLTIP = 'Get cat face detection results, returning the number of rectangular regions and their top-left and bottom-right coordinates (4 values).'; +En.MIXLY_GET_PEOPLE_FACE_DETECTION_RESULT = 'Get Face Detection Result'; +En.MIXLY_GET_PEOPLE_FACE_DETECTION_RESULT_TOOLTIP = 'Get face detection results, returning the number of rectangular regions, their bounding box coordinates, and five key facial landmarks. Explanation: v[0]: number of faces; v[1-4]: top-left and bottom-right coordinates; v[5-14]: left eye, right eye, nose, left mouth corner, right mouth corner coordinates.'; +En.MIXLY_GET_PEOPLE_FACE_RECOGNITION_RESULT = 'Get Face Recognition Result'; +En.MIXLY_GET_PEOPLE_FACE_RECOGNITION_RESULT_TOOLTIP = 'Get face recognition results, returning face ID (starting from 1), rectangular regions, and corresponding 5-point coordinates. Explanation: v[0]: number of faces; v[1-4]: top-left and bottom-right coordinates; v[5-14]: left eye, right eye, nose, left mouth corner, right mouth corner coordinates.'; +En.FACE_ENROLL = 'Enroll Face'; +En.MIXLY_DELETE_PEOPLE_FACE_ID = 'Delete Face ID Information'; })(); diff --git a/common/msg/blockly/zh-hans.js b/common/msg/blockly/zh-hans.js index cb54a56e..064fc412 100644 --- a/common/msg/blockly/zh-hans.js +++ b/common/msg/blockly/zh-hans.js @@ -3649,7 +3649,7 @@ ZhHans.MIXLY_MIXBOT_LINE_SENSOR_CALIBRATE_BLACK = '校正黑色'; ZhHans.MIXLY_MIXBOT_LINE_SENSOR_CALIBRATE_RESET = '恢复出厂'; ZhHans.MIXLY_MIXBOT_BUZZER = '喇叭'; ZhHans.MIXLY_AI_SENSOR_ASR_RECOGNISE_CORPUS = '拼音语料库'; -ZhHans.MIXLY_AI_SENSOR_ASR_RECOGNISE_TOOLTIP = '返回一个元组,分别为x出的语料内容和置信度'; +ZhHans.MIXLY_AI_SENSOR_ASR_RECOGNISE_TOOLTIP = '返回一个元组,分别为语音识别出的语料内容和置信度'; ZhHans.MIXLY_IR_STRENGTH = '红外光强'; ZhHans.MIXLY_LIGHT_STRENGTH = '自然光强'; ZhHans.MIXLY_MIXBOT_MOTOR_EXTERN_TOOLTIP = '速度百分比范围-100~100%,负号代表反转'; diff --git a/common/msg/blockly/zh-hant.js b/common/msg/blockly/zh-hant.js index 5e139cd1..d15aa2dc 100644 --- a/common/msg/blockly/zh-hant.js +++ b/common/msg/blockly/zh-hant.js @@ -39,6 +39,8 @@ ZhHant.MSG = { catAIOT:"智能物聯", catAIsensor:"MixGoAI智能感測", catAIsensor2:"MixGoAI圖像識別", + catAIgraphsensor:"圖像處理", + catAIvoicesensor:"語音處理", catSensor: "感測器", catActuator: "執行器", catExternSensor: "外接感測器", @@ -65,6 +67,7 @@ ZhHant.MSG = { catTurtle: "海龜畫圖", catTuple: "元組", catIot: "物聯網", + catAIonboard:"板載智能", catSet: "集合", catData: "數據分析", catAlgorithm: "算法", @@ -4080,4 +4083,25 @@ ZhHant.MIXLY_SET_DEGREE = '將角度'; ZhHant.MIXLY_TRANS_TO_RADIAN = '轉換為弧度'; ZhHant.MIXLY_REF_TO_PRESSURE = '參考氣壓'; ZhHant.MIXLY_CAL_TO_ALTITUDE = '計算獲取海拔'; +ZhHant.MIXLY_SHOOTING_SIZE = '拍攝尺寸'; +ZhHant.MIXLY_SHOOT_AND_SAVE_PICTURE = '拍攝照片並保存'; +ZhHant.MIXLY_GET_PICTURE_DATA = '獲取圖像數據'; +ZhHant.MIXlY_SCREEN_SHOW_CAM_SHOOT = '屏幕顯示攝像頭採集圖像'; +ZhHant.MIXlY_STOP_SCREEN_DISPLAY = '關閉攝像頭採集圖像LCD實時顯示'; +ZhHant.MIXLY_RECOGNITION = '檢測'; +ZhHant.MIXLY_GET_QR_CODE_RECOGNITION_RESULT = '獲取二維碼檢測結果'; +ZhHant.MIXLY_GET_QR_CODE_RECOGNITION_RESULT_TOOLTIP = '無檢測結果返回None,有結果左上角出現綠色小方塊,並返回二維碼信息。' +ZhHant.COLOUR_RGB_GREY = "灰色"; +ZhHant.MIXLY_CUSTOM_STUDY = "自定義學習"; +ZhHant.MIXLY_GET_COLOR_DETECTION_RESULT = '獲取顏色檢測結果'; +ZhHant.MIXLY_GET_COLOR_DETECTION_RESULT_TOOLTIP ='獲取顏色採集結果,返回矩形區域數量和對應的左上角和右下角坐標(4個值)。'; +ZhHant.MIXLY_CAT_FACE = '貓臉'; +ZhHant.MIXLY_GET_CAT_FACE_DETECTION_RESULT = '獲取貓臉檢測結果'; +ZhHant.MIXLY_GET_CAT_FACE_DETECTION_RESULT_TOOLTIP = '獲取貓臉檢測結果,返回矩形區域數量和對應的左上角和右下角坐標(4個值)。'; +ZhHant.MIXLY_GET_PEOPLE_FACE_DETECTION_RESULT = '獲取人臉檢測結果'; +ZhHant.MIXLY_GET_PEOPLE_FACE_DETECTION_RESULT_TOOLTIP = '獲取人臉檢測結果,返回矩形區域數量、對應的矩形框左邊以及五點關鍵特徵值。說明:v[0]:人臉數量;v[1-4]:矩形左上角和右下角坐標;v[5-14]:左眼、右眼、鼻子、左嘴角、右嘴角坐標。'; +ZhHant.MIXLY_GET_PEOPLE_FACE_RECOGNITION_RESULT = '獲取人臉識別結果'; +ZhHant.MIXLY_GET_PEOPLE_FACE_RECOGNITION_RESULT_TOOLTIP = '獲取人臉識別結果,獲取人識別結果,返回人臉ID(ID從1開始)、矩形區域和和對應的5點坐標。說明:v[0]:人臉數量;v[1-4]:矩形左上角和右下角坐標;v[5-14]:左眼、右眼、鼻子、左嘴角、右嘴角坐標。'; +ZhHant.FACE_ENROLL = '錄入人臉'; +ZhHant.MIXLY_DELETE_PEOPLE_FACE_ID = '刪除人臉ID信息'; })(); \ No newline at end of file