diff options
313 files changed, 12817 insertions, 10174 deletions
diff --git a/.clang-format b/.clang-format index f7527b8927..1df6c35bfb 100644 --- a/.clang-format +++ b/.clang-format @@ -19,7 +19,7 @@ AllowAllParametersOfDeclarationOnNextLine: false # AllowShortEnumsOnASingleLine: true # AllowShortBlocksOnASingleLine: Never # AllowShortCaseLabelsOnASingleLine: false -AllowShortFunctionsOnASingleLine: Inline +# AllowShortFunctionsOnASingleLine: All # AllowShortLambdasOnASingleLine: All # AllowShortIfStatementsOnASingleLine: Never # AllowShortLoopsOnASingleLine: false diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 2cf6e8a025..56130134a0 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -933,6 +933,7 @@ Dictionary Geometry2D::make_atlas(const Vector<Size2> &p_rects) { void Geometry2D::_bind_methods() { ClassDB::bind_method(D_METHOD("is_point_in_circle", "point", "circle_position", "circle_radius"), &Geometry2D::is_point_in_circle); + ClassDB::bind_method(D_METHOD("segment_intersects_circle", "segment_from", "segment_to", "circle_position", "circle_radius"), &Geometry2D::segment_intersects_circle); ClassDB::bind_method(D_METHOD("segment_intersects_segment", "from_a", "to_a", "from_b", "to_b"), &Geometry2D::segment_intersects_segment); ClassDB::bind_method(D_METHOD("line_intersects_line", "from_a", "dir_a", "from_b", "dir_b"), &Geometry2D::line_intersects_line); diff --git a/core/input/gamecontrollerdb.txt b/core/input/gamecontrollerdb.txt index d751f6c9b8..f5874a3dec 100644 --- a/core/input/gamecontrollerdb.txt +++ b/core/input/gamecontrollerdb.txt @@ -11,7 +11,7 @@ 03000000d0160000600a000000000000,4Play Adapter,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, 03000000c82d00000031000000000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000531000000000000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000951000000000000,8BitDo Dogbone Modkit,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, 03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, @@ -19,14 +19,15 @@ 03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001151000000000000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,guide:b2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000151000000000000,8BitDo M30 Modkit,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a2,rightx:a3,righty:a5,start:b11,platform:Windows, 03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, -03000000c82d00000451000000000000,8BitDo N30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,start:b11,platform:Windows, 03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, @@ -37,7 +38,8 @@ 03000000022000000090000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000203800000900000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00002038000000000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000851000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000361000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000660000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, @@ -45,7 +47,7 @@ 03000000c82d00000231000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000331000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000431000000000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a2,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a5,start:b10,x:b3,y:b4,platform:Windows, 03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000060000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000061000000000000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -54,11 +56,11 @@ 03000000c82d00003028000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 030000003512000020ab000000000000,8BitDo SN30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a2,rightshoulder:b7,rightx:a3,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000351000000000000,8BitDo SN30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -120,6 +122,7 @@ 030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, 030000005b1c00002400000000000000,Capcom Home Arcade Controller,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, @@ -234,14 +237,14 @@ 030000000d0f00005100000000000000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f00000d00000000000000,Hori Fightstick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 030000000d0f00003701000000000000,Hori Fightstick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, 030000000d0f00004000000000000000,Hori Fightstick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008700000000000000,Hori Fightstick Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, -030000000d0f00008800000000000000,Hori Fightstick Mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, 030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, @@ -439,7 +442,7 @@ 03000000d9040000160f000000000000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, 03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, -0300000062060000d570000000000000,PowerA PS3 Contoller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000062060000d570000000000000,PowerA PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000d620000013a7000000000000,PowerA Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, @@ -482,7 +485,6 @@ 03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -03000000120c0000f10e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -538,7 +540,6 @@ 03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -03000000632500008005000000010000,Redgear,a:b2,b:b1,x:b3,y:b0,back:b8,start:b9,guide:b12,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Mac OS X, 03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows, 03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, 03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, @@ -741,11 +742,17 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000008f0e00000300000009010000,2 In 1 Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000c82d00000031000001000000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000531000000020000,8BitDo Adapter 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, 03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001251000000010000,8BitDo Lite 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001151000000020000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000a30c00002400000006020000,8BitDo M30,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,guide:b9,leftshoulder:b6,lefttrigger:b5,rightshoulder:b4,righttrigger:b7,start:b8,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00005106000000010000,8BitDo M30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,lefttrigger:a5,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Mac OS X, 03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 030000003512000012ab000001000000,8BitDo NES30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -754,13 +761,17 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000022000000090000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000190000001000000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000660000000020000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000131000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000231000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000331000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000431000001000000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Mac OS X, 03000000102800000900000000000000,8BitDo SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00001290000001000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -786,6 +797,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, 03000000a306000022f6000001030000,Cyborg V3 Rumble Pad PlayStation Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000791d00000103000009010000,Dual Box Wii Classic Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006e0500000720000010020000,Elecom JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Mac OS X, 030000006f0e00008401000003010000,Faceoff Premiere Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, @@ -804,6 +816,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, 030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -883,6 +897,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, 0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000632500008005000000010000,Redgear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 030000000d0f0000c100000072050000,Retro Bit Sega Genesis 6B Controller,a:b2,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b8,rightshoulder:b6,righttrigger:b7,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000921200004547000000020000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b2,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,lefttrigger:b14,rightshoulder:b10,righttrigger:b4,start:b12,x:b6,y:b8,platform:Mac OS X, 03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -954,11 +969,16 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, # Linux 030000005e0400008e02000020010000,8BitDo Adapter,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c82d00000031000011010000,8BitDo Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000951000000010000,8BitDo Dogbone,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, 03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001151000011010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001151000000010000,8BitDo Lite SE,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Linux, 05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux, 03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -968,12 +988,15 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000190000011010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000203800000900000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00002038000000010000,8BitDo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000431000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00002867000000010000,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b3,y:b4,platform:Linux, 05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000061000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 030000003512000012ab000010010000,8BitDo SFC30,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, @@ -981,6 +1004,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000102800000900000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00003028000000010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000351000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, @@ -1075,9 +1099,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, -030000000d0f00004d00000011010000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, 030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1092,7 +1118,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -050000000d0f0000f600000001000000,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, 030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, 03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1203,8 +1229,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b16,b:b15,back:b4,leftshoulder:b6,leftstick:b12,leftx:a1,lefty:a0~,rightshoulder:b8,start:b9,x:b14,y:b17,platform:Linux, 03000000d620000013a7000011010000,Nintendo Switch PowerA Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000d620000011a7000011010000,Nintendo Switch PowerA Core Plus Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, -050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, 050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, 05000000010000000100000003000000,Nintendo Wii Remote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, @@ -1243,14 +1269,14 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, 03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +03000000d62000000140000001010000,PowerA Fusion Pro 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000d62000000220000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, 03000000d62000000228000001010000,PowerA Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000c62400001a54000001010000,PowerA Xbox One Mini Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +03000000d62000000240000001010000,PowerA Xbox One Spectra Infinity,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1434,6 +1460,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 050000005e040000130b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000120b000007050000,Xbox Series X Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,misc1:b11,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, 050000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, @@ -1449,18 +1476,30 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, 64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, 64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, 34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f2038426974446f204c69,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, +32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, 64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, 66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, 66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, +38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android, 05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android, 38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, @@ -1468,12 +1507,17 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, 61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, 05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, 05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, @@ -1497,6 +1541,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, 32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, 30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, 05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1535,6 +1581,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android, 436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, 65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, +484a5a204d6179666c61736820576969,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android, 31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, 37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, 64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, @@ -1589,10 +1638,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,x:b2,y:b3,leftshoulder:b9,rightshoulder:b10,lefttrigger:a4,righttrigger:a5,guide:b5,start:b6,leftstick:b7,rightstick:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,back:b15,platform:Android, 64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, 36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1669,6 +1718,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, 4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, 4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS, +050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, +050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+rightx:h0.4,+righty:h0.8,-rightx:h0.1,-righty:h0.2,a:b1,b:b0,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b3,y:b2,platform:iOS, +050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, 050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, 050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, 050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, diff --git a/core/input/input.cpp b/core/input/input.cpp index da0c6cb62a..e08647f5ea 100644 --- a/core/input/input.cpp +++ b/core/input/input.cpp @@ -1187,7 +1187,7 @@ Input::JoyEvent Input::_get_mapped_axis_event(const JoyDeviceMapping &mapping, J return event; } -void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat, JoyEvent r_events[]) { +void Input::_get_mapped_hat_events(const JoyDeviceMapping &mapping, HatDir p_hat, JoyEvent r_events[(size_t)HatDir::MAX]) { for (int i = 0; i < mapping.bindings.size(); i++) { const JoyBinding binding = mapping.bindings[i]; if (binding.inputType == TYPE_HAT && binding.input.hat.hat == p_hat) { diff --git a/core/io/dir_access.h b/core/io/dir_access.h index 22017efaa3..d5318dfb45 100644 --- a/core/io/dir_access.h +++ b/core/io/dir_access.h @@ -108,6 +108,8 @@ public: if (da->remove(p_path) != OK) { ERR_FAIL_MSG("Cannot remove file or directory: " + p_path); } + } else { + ERR_FAIL_MSG("Cannot remove non-existent file or directory: " + p_path); } } diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index fc4177004b..3e595557f9 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -819,6 +819,12 @@ String ResourceLoader::_path_remap(const String &p_path, bool *r_translation_rem if (r_translation_remapped) { *r_translation_remapped = true; } + + // Fallback to p_path if new_path does not exist. + if (!FileAccess::exists(new_path)) { + WARN_PRINT(vformat("Translation remap '%s' does not exist. Falling back to '%s'.", new_path, p_path)); + new_path = p_path; + } } if (path_remaps.has(new_path)) { diff --git a/core/math/vector3.h b/core/math/vector3.h index 970416234d..4ce01da60e 100644 --- a/core/math/vector3.h +++ b/core/math/vector3.h @@ -217,16 +217,25 @@ Vector3 Vector3::lerp(const Vector3 &p_to, const real_t p_weight) const { } Vector3 Vector3::slerp(const Vector3 &p_to, const real_t p_weight) const { + // This method seems more complicated than it really is, since we write out + // the internals of some methods for efficiency (mainly, checking length). real_t start_length_sq = length_squared(); real_t end_length_sq = p_to.length_squared(); if (unlikely(start_length_sq == 0.0f || end_length_sq == 0.0f)) { // Zero length vectors have no angle, so the best we can do is either lerp or throw an error. return lerp(p_to, p_weight); } + Vector3 axis = cross(p_to); + real_t axis_length_sq = axis.length_squared(); + if (unlikely(axis_length_sq == 0.0f)) { + // Colinear vectors have no rotation axis or angle between them, so the best we can do is lerp. + return lerp(p_to, p_weight); + } + axis /= Math::sqrt(axis_length_sq); real_t start_length = Math::sqrt(start_length_sq); real_t result_length = Math::lerp(start_length, Math::sqrt(end_length_sq), p_weight); real_t angle = angle_to(p_to); - return rotated(cross(p_to).normalized(), angle * p_weight) * (result_length / start_length); + return rotated(axis, angle * p_weight) * (result_length / start_length); } Vector3 Vector3::cubic_interpolate(const Vector3 &p_b, const Vector3 &p_pre_a, const Vector3 &p_post_b, const real_t p_weight) const { diff --git a/core/os/memory.h b/core/os/memory.h index 42ba9634e2..0e1afe027e 100644 --- a/core/os/memory.h +++ b/core/os/memory.h @@ -36,6 +36,7 @@ #include <stddef.h> #include <new> +#include <type_traits> #ifndef PAD_ALIGN #define PAD_ALIGN 16 //must always be greater than this at much @@ -104,7 +105,7 @@ void memdelete(T *p_class) { if (!predelete_handler(p_class)) { return; // doesn't want to be deleted } - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { p_class->~T(); } @@ -116,7 +117,7 @@ void memdelete_allocator(T *p_class) { if (!predelete_handler(p_class)) { return; // doesn't want to be deleted } - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { p_class->~T(); } @@ -146,7 +147,7 @@ T *memnew_arr_template(size_t p_elements) { ERR_FAIL_COND_V(!mem, failptr); *(mem - 1) = p_elements; - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible<T>::value) { T *elems = (T *)mem; /* call operator new */ @@ -173,7 +174,7 @@ template <typename T> void memdelete_arr(T *p_class) { uint64_t *ptr = (uint64_t *)p_class; - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { uint64_t elem_count = *(ptr - 1); for (uint64_t i = 0; i < elem_count; i++) { diff --git a/core/templates/cowdata.h b/core/templates/cowdata.h index e760fc2176..f98b2308c9 100644 --- a/core/templates/cowdata.h +++ b/core/templates/cowdata.h @@ -36,6 +36,7 @@ #include "core/templates/safe_refcount.h" #include <string.h> +#include <type_traits> template <class T> class Vector; @@ -158,6 +159,7 @@ public: return _ptr[p_index]; } + template <bool p_ensure_zero = false> Error resize(int p_size); _FORCE_INLINE_ void remove_at(int p_index) { @@ -204,7 +206,7 @@ void CowData<T>::_unref(void *p_data) { } // clean up - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { uint32_t *count = _get_size(); T *data = (T *)(count + 1); @@ -239,7 +241,7 @@ uint32_t CowData<T>::_copy_on_write() { T *_data = (T *)(mem_new); // initialize new elements - if (__has_trivial_copy(T)) { + if (std::is_trivially_copyable<T>::value) { memcpy(mem_new, _ptr, current_size * sizeof(T)); } else { @@ -257,6 +259,7 @@ uint32_t CowData<T>::_copy_on_write() { } template <class T> +template <bool p_ensure_zero> Error CowData<T>::resize(int p_size) { ERR_FAIL_COND_V(p_size < 0, ERR_INVALID_PARAMETER); @@ -302,16 +305,18 @@ Error CowData<T>::resize(int p_size) { // construct the newly created elements - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible<T>::value) { for (int i = *_get_size(); i < p_size; i++) { memnew_placement(&_ptr[i], T); } + } else if (p_ensure_zero) { + memset((void *)(_ptr + current_size), 0, (p_size - current_size) * sizeof(T)); } *_get_size() = p_size; } else if (p_size < current_size) { - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { // deinitialize no longer needed elements for (uint32_t i = p_size; i < *_get_size(); i++) { T *t = &_ptr[i]; diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index 8d687effcf..49690f2373 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -37,6 +37,7 @@ #include "core/templates/vector.h" #include <initializer_list> +#include <type_traits> // If tight, it grows strictly as much as needed. // Otherwise, it grows exponentially (the default and what you want in most cases). @@ -67,7 +68,7 @@ public: CRASH_COND_MSG(!data, "Out of memory"); } - if (!__has_trivial_constructor(T) && !force_trivial) { + if (!std::is_trivially_constructible<T>::value && !force_trivial) { memnew_placement(&data[count++], T(p_elem)); } else { data[count++] = p_elem; @@ -80,7 +81,7 @@ public: for (U i = p_index; i < count; i++) { data[i] = data[i + 1]; } - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible<T>::value && !force_trivial) { data[count].~T(); } } @@ -93,7 +94,7 @@ public: if (count > p_index) { data[p_index] = data[count]; } - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible<T>::value && !force_trivial) { data[count].~T(); } } @@ -134,7 +135,7 @@ public: _FORCE_INLINE_ U size() const { return count; } void resize(U p_size) { if (p_size < count) { - if (!__has_trivial_destructor(T) && !force_trivial) { + if (!std::is_trivially_destructible<T>::value && !force_trivial) { for (U i = p_size; i < count; i++) { data[i].~T(); } @@ -151,7 +152,7 @@ public: data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } - if (!__has_trivial_constructor(T) && !force_trivial) { + if (!std::is_trivially_constructible<T>::value && !force_trivial) { for (U i = count; i < p_size; i++) { memnew_placement(&data[i], T); } diff --git a/core/templates/paged_array.h b/core/templates/paged_array.h index 33d2757bec..f1ede556e6 100644 --- a/core/templates/paged_array.h +++ b/core/templates/paged_array.h @@ -35,6 +35,8 @@ #include "core/os/spin_lock.h" #include "core/typedefs.h" +#include <type_traits> + // PagedArray is used mainly for filling a very large array from multiple threads efficiently and without causing major fragmentation // PageArrayPool manages central page allocation in a thread safe matter @@ -197,7 +199,7 @@ public: uint32_t page = count >> page_size_shift; uint32_t offset = count & page_size_mask; - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible<T>::value) { memnew_placement(&page_data[page][offset], T(p_value)); } else { page_data[page][offset] = p_value; @@ -209,7 +211,7 @@ public: _FORCE_INLINE_ void pop_back() { ERR_FAIL_COND(count == 0); - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { uint32_t page = (count - 1) >> page_size_shift; uint32_t offset = (count - 1) & page_size_mask; page_data[page][offset].~T(); @@ -226,7 +228,7 @@ public: void clear() { //destruct if needed - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { for (uint64_t i = 0; i < count; i++) { uint32_t page = i >> page_size_shift; uint32_t offset = i & page_size_mask; @@ -309,13 +311,13 @@ public: uint32_t to_copy = MIN(page_size - new_remainder, remainder); for (uint32_t i = 0; i < to_copy; i++) { - if (!__has_trivial_constructor(T)) { + if (!std::is_trivially_constructible<T>::value) { memnew_placement(&dst_page[i + new_remainder], T(remainder_page[i + remainder - to_copy])); } else { dst_page[i + new_remainder] = remainder_page[i + remainder - to_copy]; } - if (!__has_trivial_destructor(T)) { + if (!std::is_trivially_destructible<T>::value) { remainder_page[i + remainder - to_copy].~T(); } } diff --git a/core/templates/rid_owner.h b/core/templates/rid_owner.h index 9c74b41818..320faebe98 100644 --- a/core/templates/rid_owner.h +++ b/core/templates/rid_owner.h @@ -79,7 +79,7 @@ class RID_Alloc : public RID_AllocBase { const char *description = nullptr; - SpinLock spin_lock; + mutable SpinLock spin_lock; _FORCE_INLINE_ RID _allocate_rid() { if (THREAD_SAFE) { @@ -220,7 +220,7 @@ public: memnew_placement(mem, T(p_value)); } - _FORCE_INLINE_ bool owns(const RID &p_rid) { + _FORCE_INLINE_ bool owns(const RID &p_rid) const { if (THREAD_SAFE) { spin_lock.lock(); } @@ -292,7 +292,7 @@ public: _FORCE_INLINE_ uint32_t get_rid_count() const { return alloc_count; } - void get_owned_list(List<RID> *p_owned) { + void get_owned_list(List<RID> *p_owned) const { if (THREAD_SAFE) { spin_lock.lock(); } @@ -308,7 +308,7 @@ public: } //used for fast iteration in the elements or RIDs - void fill_owned_buffer(RID *p_rid_buffer) { + void fill_owned_buffer(RID *p_rid_buffer) const { if (THREAD_SAFE) { spin_lock.lock(); } @@ -402,7 +402,7 @@ public: *ptr = p_new_ptr; } - _FORCE_INLINE_ bool owns(const RID &p_rid) { + _FORCE_INLINE_ bool owns(const RID &p_rid) const { return alloc.owns(p_rid); } @@ -414,11 +414,11 @@ public: return alloc.get_rid_count(); } - _FORCE_INLINE_ void get_owned_list(List<RID> *p_owned) { + _FORCE_INLINE_ void get_owned_list(List<RID> *p_owned) const { return alloc.get_owned_list(p_owned); } - void fill_owned_buffer(RID *p_rid_buffer) { + void fill_owned_buffer(RID *p_rid_buffer) const { alloc.fill_owned_buffer(p_rid_buffer); } @@ -458,7 +458,7 @@ public: return alloc.get_or_null(p_rid); } - _FORCE_INLINE_ bool owns(const RID &p_rid) { + _FORCE_INLINE_ bool owns(const RID &p_rid) const { return alloc.owns(p_rid); } @@ -470,10 +470,10 @@ public: return alloc.get_rid_count(); } - _FORCE_INLINE_ void get_owned_list(List<RID> *p_owned) { + _FORCE_INLINE_ void get_owned_list(List<RID> *p_owned) const { return alloc.get_owned_list(p_owned); } - void fill_owned_buffer(RID *p_rid_buffer) { + void fill_owned_buffer(RID *p_rid_buffer) const { alloc.fill_owned_buffer(p_rid_buffer); } diff --git a/core/templates/vector.h b/core/templates/vector.h index f3f5ed76a7..51595a75f5 100644 --- a/core/templates/vector.h +++ b/core/templates/vector.h @@ -89,6 +89,7 @@ public: _FORCE_INLINE_ void set(int p_index, const T &p_elem) { _cowdata.set(p_index, p_elem); } _FORCE_INLINE_ int size() const { return _cowdata.size(); } Error resize(int p_size) { return _cowdata.resize(p_size); } + Error resize_zeroed(int p_size) { return _cowdata.template resize<true>(p_size); } _FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata.get(p_index); } Error insert(int p_pos, T p_val) { return _cowdata.insert(p_pos, p_val); } int find(const T &p_val, int p_from = 0) const { return _cowdata.find(p_val, p_from); } diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index a774aac52f..d1f1b83457 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -2060,7 +2060,7 @@ static void _register_variant_builtin_methods() { bind_method(PackedByteArray, remove_at, sarray("index"), varray()); bind_method(PackedByteArray, insert, sarray("at_index", "value"), varray()); bind_method(PackedByteArray, fill, sarray("value"), varray()); - bind_method(PackedByteArray, resize, sarray("new_size"), varray()); + bind_methodv(PackedByteArray, resize, &PackedByteArray::resize_zeroed, sarray("new_size"), varray()); bind_method(PackedByteArray, has, sarray("value"), varray()); bind_method(PackedByteArray, reverse, sarray(), varray()); bind_method(PackedByteArray, slice, sarray("begin", "end"), varray(INT_MAX)); @@ -2124,7 +2124,7 @@ static void _register_variant_builtin_methods() { bind_method(PackedInt32Array, remove_at, sarray("index"), varray()); bind_method(PackedInt32Array, insert, sarray("at_index", "value"), varray()); bind_method(PackedInt32Array, fill, sarray("value"), varray()); - bind_method(PackedInt32Array, resize, sarray("new_size"), varray()); + bind_methodv(PackedInt32Array, resize, &PackedInt32Array::resize_zeroed, sarray("new_size"), varray()); bind_method(PackedInt32Array, has, sarray("value"), varray()); bind_method(PackedInt32Array, reverse, sarray(), varray()); bind_method(PackedInt32Array, slice, sarray("begin", "end"), varray(INT_MAX)); @@ -2147,7 +2147,7 @@ static void _register_variant_builtin_methods() { bind_method(PackedInt64Array, remove_at, sarray("index"), varray()); bind_method(PackedInt64Array, insert, sarray("at_index", "value"), varray()); bind_method(PackedInt64Array, fill, sarray("value"), varray()); - bind_method(PackedInt64Array, resize, sarray("new_size"), varray()); + bind_methodv(PackedInt64Array, resize, &PackedInt64Array::resize_zeroed, sarray("new_size"), varray()); bind_method(PackedInt64Array, has, sarray("value"), varray()); bind_method(PackedInt64Array, reverse, sarray(), varray()); bind_method(PackedInt64Array, slice, sarray("begin", "end"), varray(INT_MAX)); @@ -2170,7 +2170,7 @@ static void _register_variant_builtin_methods() { bind_method(PackedFloat32Array, remove_at, sarray("index"), varray()); bind_method(PackedFloat32Array, insert, sarray("at_index", "value"), varray()); bind_method(PackedFloat32Array, fill, sarray("value"), varray()); - bind_method(PackedFloat32Array, resize, sarray("new_size"), varray()); + bind_methodv(PackedFloat32Array, resize, &PackedFloat32Array::resize_zeroed, sarray("new_size"), varray()); bind_method(PackedFloat32Array, has, sarray("value"), varray()); bind_method(PackedFloat32Array, reverse, sarray(), varray()); bind_method(PackedFloat32Array, slice, sarray("begin", "end"), varray(INT_MAX)); @@ -2193,7 +2193,7 @@ static void _register_variant_builtin_methods() { bind_method(PackedFloat64Array, remove_at, sarray("index"), varray()); bind_method(PackedFloat64Array, insert, sarray("at_index", "value"), varray()); bind_method(PackedFloat64Array, fill, sarray("value"), varray()); - bind_method(PackedFloat64Array, resize, sarray("new_size"), varray()); + bind_methodv(PackedFloat64Array, resize, &PackedFloat64Array::resize_zeroed, sarray("new_size"), varray()); bind_method(PackedFloat64Array, has, sarray("value"), varray()); bind_method(PackedFloat64Array, reverse, sarray(), varray()); bind_method(PackedFloat64Array, slice, sarray("begin", "end"), varray(INT_MAX)); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 709863b70f..4a16244235 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -380,7 +380,7 @@ <argument index="1" name="to" type="float" /> <argument index="2" name="weight" type="float" /> <description> - Returns an interpolation or extrapolation factor considering the range specified in [code]from[/code] and [code]to[/code], and the interpolated value specified in [code]weight[/code]. The returned value will be between [code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between [code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is located outside this range, then an extrapolation factor will be returned (return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). + Returns an interpolation or extrapolation factor considering the range specified in [code]from[/code] and [code]to[/code], and the interpolated value specified in [code]weight[/code]. The returned value will be between [code]0.0[/code] and [code]1.0[/code] if [code]weight[/code] is between [code]from[/code] and [code]to[/code] (inclusive). If [code]weight[/code] is located outside this range, then an extrapolation factor will be returned (return value lower than [code]0.0[/code] or greater than [code]1.0[/code]). Use [method clamp] on the result of [method inverse_lerp] if this is not desired. [codeblock] # The interpolation ratio in the `lerp()` call below is 0.75. var middle = lerp(20, 30, 0.75) @@ -389,7 +389,7 @@ var ratio = inverse_lerp(20, 30, 27.5) # `ratio` is now 0.75. [/codeblock] - See also [method lerp] which performs the reverse of this operation. + See also [method lerp] which performs the reverse of this operation, and [method range_lerp] to map a continuous series of values to another. </description> </method> <method name="is_equal_approx"> @@ -444,11 +444,11 @@ <argument index="1" name="to" type="float" /> <argument index="2" name="weight" type="float" /> <description> - Linearly interpolates between two values by the factor defined in [code]weight[/code]. To perform interpolation, [code]weight[/code] should be between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values outside this range are allowed and can be used to perform [i]extrapolation[/i]. + Linearly interpolates between two values by the factor defined in [code]weight[/code]. To perform interpolation, [code]weight[/code] should be between [code]0.0[/code] and [code]1.0[/code] (inclusive). However, values outside this range are allowed and can be used to perform [i]extrapolation[/i]. Use [method clamp] on the result of [method lerp] if this is not desired. [codeblock] lerp(0, 4, 0.75) # Returns 3.0 [/codeblock] - See also [method inverse_lerp] which performs the reverse of this operation. To perform eased interpolation with [method lerp], combine it with [method ease] or [method smoothstep]. + See also [method inverse_lerp] which performs the reverse of this operation. To perform eased interpolation with [method lerp], combine it with [method ease] or [method smoothstep]. See also [method range_lerp] to map a continuous series of values to another. </description> </method> <method name="lerp_angle"> @@ -807,10 +807,11 @@ <argument index="3" name="ostart" type="float" /> <argument index="4" name="ostop" type="float" /> <description> - Maps a [code]value[/code] from range [code][istart, istop][/code] to [code][ostart, ostop][/code]. + Maps a [code]value[/code] from range [code][istart, istop][/code] to [code][ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If [code]value[/code] is outside [code][istart, istop][/code], then the resulting value will also be outside [code][ostart, ostop][/code]. Use [method clamp] on the result of [method range_lerp] if this is not desired. [codeblock] range_lerp(75, 0, 100, -1, 1) # Returns 0.5 [/codeblock] + For complex use cases where you need multiple ranges, consider using [Curve] or [Gradient] instead. </description> </method> <method name="rid_allocate_id"> @@ -1209,6 +1210,7 @@ The [ResourceSaver] singleton. </member> <member name="ResourceUID" type="ResourceUID" setter="" getter=""> + The [ResourceUID] singleton. </member> <member name="TextServerManager" type="TextServerManager" setter="" getter=""> The [TextServerManager] singleton. diff --git a/doc/classes/BaseMaterial3D.xml b/doc/classes/BaseMaterial3D.xml index 16359108a4..d0290ff5fd 100644 --- a/doc/classes/BaseMaterial3D.xml +++ b/doc/classes/BaseMaterial3D.xml @@ -218,24 +218,38 @@ Grows object vertices in the direction of their normals. </member> <member name="heightmap_deep_parallax" type="bool" setter="set_heightmap_deep_parallax" getter="is_heightmap_deep_parallax_enabled" default="false"> + If [code]true[/code], uses parallax occlusion mapping to represent depth in the material instead of simple offset mapping (see [member heightmap_enabled]). This results in a more convincing depth effect, but is much more expensive on the GPU. Only enable this on materials where it makes a significant visual difference. </member> <member name="heightmap_enabled" type="bool" setter="set_feature" getter="get_feature" default="false"> - If [code]true[/code], height mapping is enabled (also called "parallax mapping" or "depth mapping"). See also [member normal_enabled]. + If [code]true[/code], height mapping is enabled (also called "parallax mapping" or "depth mapping"). See also [member normal_enabled]. Height mapping is a demanding feature on the GPU, so it should only be used on materials where it makes a significant visual difference. [b]Note:[/b] Height mapping is not supported if triplanar mapping is used on the same material. The value of [member heightmap_enabled] will be ignored if [member uv1_triplanar] is enabled. </member> <member name="heightmap_flip_binormal" type="bool" setter="set_heightmap_deep_parallax_flip_binormal" getter="get_heightmap_deep_parallax_flip_binormal" default="false"> + If [code]true[/code], flips the mesh's binormal vectors when interpreting the height map. If the heightmap effect looks strange when the camera moves (even with a reasonable [member heightmap_scale]), try setting this to [code]true[/code]. </member> <member name="heightmap_flip_tangent" type="bool" setter="set_heightmap_deep_parallax_flip_tangent" getter="get_heightmap_deep_parallax_flip_tangent" default="false"> + If [code]true[/code], flips the mesh's tangent vectors when interpreting the height map. If the heightmap effect looks strange when the camera moves (even with a reasonable [member heightmap_scale]), try setting this to [code]true[/code]. </member> <member name="heightmap_flip_texture" type="bool" setter="set_flag" getter="get_flag" default="false"> + If [code]true[/code], interprets the height map texture as a depth map, with brighter values appearing to be "lower" in altitude compared to darker values. + This can be enabled for compatibility with some materials authored for Godot 3.x. This is not necessary if the Invert import option was used to invert the depth map in Godot 3.x, in which case [member heightmap_flip_texture] should remain [code]false[/code]. </member> <member name="heightmap_max_layers" type="int" setter="set_heightmap_deep_parallax_max_layers" getter="get_heightmap_deep_parallax_max_layers"> + The number of layers to use for parallax occlusion mapping when the camera is up close to the material. Higher values result in a more convincing depth effect, especially in materials that have steep height changes. Higher values have a significant cost on the GPU, so it should only be increased on materials where it makes a significant visual difference. + [b]Note:[/b] Only effective if [member heightmap_deep_parallax] is [code]true[/code]. </member> <member name="heightmap_min_layers" type="int" setter="set_heightmap_deep_parallax_min_layers" getter="get_heightmap_deep_parallax_min_layers"> + The number of layers to use for parallax occlusion mapping when the camera is far away from the material. Higher values result in a more convincing depth effect, especially in materials that have steep height changes. Higher values have a significant cost on the GPU, so it should only be increased on materials where it makes a significant visual difference. + [b]Note:[/b] Only effective if [member heightmap_deep_parallax] is [code]true[/code]. </member> - <member name="heightmap_scale" type="float" setter="set_heightmap_scale" getter="get_heightmap_scale" default="0.05"> + <member name="heightmap_scale" type="float" setter="set_heightmap_scale" getter="get_heightmap_scale" default="5.0"> + The heightmap scale to use for the parallax effect (see [member heightmap_enabled]). The default value is tuned so that the highest point (value = 255) appears to be 5 cm higher than the lowest point (value = 0). Higher values result in a deeper appearance, but may result in artifacts appearing when looking at the material from oblique angles, especially when the camera moves. Negative values can be used to invert the parallax effect, but this is different from inverting the texture using [member heightmap_flip_texture] as the material will also appear to be "closer" to the camera. In most cases, [member heightmap_scale] should be kept to a positive value. + [b]Note:[/b] If the height map effect looks strange regardless of this value, try adjusting [member heightmap_flip_binormal] and [member heightmap_flip_tangent]. See also [member heightmap_texture] for recommendations on authoring heightmap textures, as the way the heightmap texture is authored affects how [member heightmap_scale] behaves. </member> <member name="heightmap_texture" type="Texture2D" setter="set_texture" getter="get_texture"> + The texture to use as a height map. See also [member heightmap_enabled]. + For best results, the texture should be normalized (with [member heightmap_scale] reduced to compensate). In [url=https://gimp.org]GIMP[/url], this can be done using [b]Colors > Auto > Equalize[/b]. If the texture only uses a small part of its available range, the parallax effect may look strange, especially when the camera moves. + [b]Note:[/b] To reduce memory usage and improve loading times, you may be able to use a lower-resolution heightmap texture as most heightmaps are only comprised of low-frequency data. </member> <member name="metallic" type="float" setter="set_metallic" getter="get_metallic" default="0.0"> A high value makes the material appear more like a metal. Non-metals use their albedo as the diffuse color and add diffuse to the specular reflection. With non-metals, the reflection appears on top of the albedo color. Metals use their albedo as a multiplier to the specular reflection and set the diffuse color to black resulting in a tinted reflection. Materials work better when fully metal or fully non-metal, values between [code]0[/code] and [code]1[/code] should only be used for blending between metal and non-metal sections. To alter the amount of reflection use [member roughness]. diff --git a/doc/classes/Camera3D.xml b/doc/classes/Camera3D.xml index 5595abc02a..643351efc0 100644 --- a/doc/classes/Camera3D.xml +++ b/doc/classes/Camera3D.xml @@ -144,7 +144,7 @@ # This code block is part of a script that inherits from Node3D. # `control` is a reference to a node inheriting from Control. control.visible = not get_viewport().get_camera_3d().is_position_behind(global_transform.origin) - control.rect_position = get_viewport().get_camera_3d().unproject_position(global_transform.origin) + control.position = get_viewport().get_camera_3d().unproject_position(global_transform.origin) [/codeblock] </description> </method> diff --git a/doc/classes/Curve.xml b/doc/classes/Curve.xml index 383d33532b..179b0344c2 100644 --- a/doc/classes/Curve.xml +++ b/doc/classes/Curve.xml @@ -5,6 +5,7 @@ </brief_description> <description> A curve that can be saved and re-used for other objects. By default, it ranges between [code]0[/code] and [code]1[/code] on the Y axis and positions points relative to the [code]0.5[/code] Y position. + See also [Gradient] which is designed for color interpolation. See also [Curve2D] and [Curve3D]. </description> <tutorials> </tutorials> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index cec504584c..bc6cd88fa5 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -930,7 +930,7 @@ <return type="void" /> <argument index="0" name="existing_text" type="String" /> <argument index="1" name="position" type="Rect2" default="Rect2(0, 0, 0, 0)" /> - <argument index="2" name="multiline" type="bool" default="false" /> + <argument index="2" name="type" type="int" enum="DisplayServer.VirtualKeyboardType" default="0" /> <argument index="3" name="max_length" type="int" default="-1" /> <argument index="4" name="cursor_start" type="int" default="-1" /> <argument index="5" name="cursor_end" type="int" default="-1" /> @@ -938,11 +938,11 @@ Shows the virtual keyboard if the platform has one. [code]existing_text[/code] parameter is useful for implementing your own [LineEdit] or [TextEdit], as it tells the virtual keyboard what text has already been typed (the virtual keyboard uses it for auto-correct and predictions). [code]position[/code] parameter is the screen space [Rect2] of the edited text. - [code]multiline[/code] parameter needs to be set to [code]true[/code] to be able to enter multiple lines of text, as in [TextEdit]. + [code]type[/code] parameter allows configuring which type of virtual keyboard to show. [code]max_length[/code] limits the number of characters that can be entered if different from [code]-1[/code]. [code]cursor_start[/code] can optionally define the current text cursor position if [code]cursor_end[/code] is not set. [code]cursor_start[/code] and [code]cursor_end[/code] can optionally define the current text selection. - [b]Note:[/b] This method is implemented on Android, iOS and UWP. + [b]Note:[/b] This method is implemented on Android, iOS and HTML5. </description> </method> <method name="warp_mouse"> @@ -1049,7 +1049,7 @@ <return type="int" enum="DisplayServer.VSyncMode" /> <argument index="0" name="window_id" type="int" default="0" /> <description> - Returns the VSync mode of the given window. + Returns the V-Sync mode of the given window. </description> </method> <method name="window_move_to_foreground"> @@ -1234,7 +1234,7 @@ <argument index="0" name="vsync_mode" type="int" enum="DisplayServer.VSyncMode" /> <argument index="1" name="window_id" type="int" default="0" /> <description> - Sets the VSync mode of the given window. + Sets the V-Sync mode of the given window. See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application. Depending on the platform and used renderer, the engine will fall back to [constant VSYNC_ENABLED], if the desired mode is not supported. </description> @@ -1323,6 +1323,31 @@ </constant> <constant name="SCREEN_SENSOR" value="6" enum="ScreenOrientation"> </constant> + <constant name="KEYBOARD_TYPE_DEFAULT" value="0" enum="VirtualKeyboardType"> + Default text virtual keyboard. + </constant> + <constant name="KEYBOARD_TYPE_MULTILINE" value="1" enum="VirtualKeyboardType"> + Multiline virtual keyboard. + </constant> + <constant name="KEYBOARD_TYPE_NUMBER" value="2" enum="VirtualKeyboardType"> + Virtual number keypad, useful for PIN entry. + </constant> + <constant name="KEYBOARD_TYPE_NUMBER_DECIMAL" value="3" enum="VirtualKeyboardType"> + Virtual number keypad, useful for entering fractional numbers. + </constant> + <constant name="KEYBOARD_TYPE_PHONE" value="4" enum="VirtualKeyboardType"> + Virtual phone number keypad. + </constant> + <constant name="KEYBOARD_TYPE_EMAIL_ADDRESS" value="5" enum="VirtualKeyboardType"> + Virtual keyboard with additional keys to assist with typing email addresses. + </constant> + <constant name="KEYBOARD_TYPE_PASSWORD" value="6" enum="VirtualKeyboardType"> + Virtual keyboard for entering a password. On most platforms, this should disable autocomplete and autocapitalization. + [b]Note:[/b] This is not supported on HTML5. Instead, this behaves identically to [constant KEYBOARD_TYPE_DEFAULT]. + </constant> + <constant name="KEYBOARD_TYPE_URL" value="7" enum="VirtualKeyboardType"> + Virtual keyboard with additional keys to assist with typing URLs. + </constant> <constant name="CURSOR_ARROW" value="0" enum="CursorShape"> </constant> <constant name="CURSOR_IBEAM" value="1" enum="CursorShape"> diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 687c3d70ca..fea4085019 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -347,7 +347,7 @@ </member> <member name="editors/visual_editors/minimap_opacity" type="float" setter="" getter=""> </member> - <member name="editors/visual_editors/visualshader/port_preview_size" type="int" setter="" getter=""> + <member name="editors/visual_editors/visual_shader/port_preview_size" type="int" setter="" getter=""> </member> <member name="filesystem/directories/autoscan_project_path" type="String" setter="" getter=""> </member> diff --git a/doc/classes/Geometry2D.xml b/doc/classes/Geometry2D.xml index 195c481187..a4cfa1ddff 100644 --- a/doc/classes/Geometry2D.xml +++ b/doc/classes/Geometry2D.xml @@ -188,6 +188,16 @@ Returns if [code]point[/code] is inside the triangle specified by [code]a[/code], [code]b[/code] and [code]c[/code]. </description> </method> + <method name="segment_intersects_circle"> + <return type="float" /> + <argument index="0" name="segment_from" type="Vector2" /> + <argument index="1" name="segment_to" type="Vector2" /> + <argument index="2" name="circle_position" type="Vector2" /> + <argument index="3" name="circle_radius" type="float" /> + <description> + Given the 2D segment ([code]segment_from[/code], [code]segment_to[/code]), returns the position on the segment (as a number between 0 and 1) at which the segment hits the circle that is located at position [code]circle_position[/code] and has radius [code]circle_radius[/code]. If the segment does not intersect the circle, -1 is returned (this is also the case if the line extending the segment would intersect the circle, but the segment does not). + </description> + </method> <method name="segment_intersects_segment"> <return type="Variant" /> <argument index="0" name="from_a" type="Vector2" /> diff --git a/doc/classes/GeometryInstance3D.xml b/doc/classes/GeometryInstance3D.xml index c803f43fb0..365efa6761 100644 --- a/doc/classes/GeometryInstance3D.xml +++ b/doc/classes/GeometryInstance3D.xml @@ -9,7 +9,7 @@ <tutorials> </tutorials> <methods> - <method name="get_shader_instance_uniform" qualifiers="const"> + <method name="get_instance_shader_uniform" qualifiers="const"> <return type="Variant" /> <argument index="0" name="uniform" type="StringName" /> <description> @@ -22,7 +22,7 @@ Overrides the bounding box of this node with a custom one. To remove it, set an [AABB] with all fields set to zero. </description> </method> - <method name="set_shader_instance_uniform"> + <method name="set_instance_shader_uniform"> <return type="void" /> <argument index="0" name="uniform" type="StringName" /> <argument index="1" name="value" type="Variant" /> diff --git a/doc/classes/Gradient.xml b/doc/classes/Gradient.xml index 89c968cc9e..8c5373216a 100644 --- a/doc/classes/Gradient.xml +++ b/doc/classes/Gradient.xml @@ -5,6 +5,7 @@ </brief_description> <description> Given a set of colors, this resource will interpolate them in order. This means that if you have color 1, color 2 and color 3, the gradient will interpolate from color 1 to color 2 and from color 2 to color 3. The gradient will initially have 2 colors (black and white), one (black) at gradient lower offset 0 and the other (white) at the gradient higher offset 1. + See also [Curve] which supports more complex easing methods, but does not support colors. </description> <tutorials> </tutorials> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 15c97b0838..97ee946acd 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -445,7 +445,7 @@ <theme_item name="font_selected_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)"> Text [Color] used when the item is selected. </theme_item> - <theme_item name="guide_color" data_type="color" type="Color" default="Color(0, 0, 0, 0.1)"> + <theme_item name="guide_color" data_type="color" type="Color" default="Color(0.7, 0.7, 0.7, 0.25)"> [Color] of the guideline. The guideline is a line drawn between each row of items. </theme_item> <theme_item name="h_separation" data_type="constant" type="int" default="4"> diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml index 84471bafc0..2ff13a676b 100644 --- a/doc/classes/LineEdit.xml +++ b/doc/classes/LineEdit.xml @@ -246,6 +246,9 @@ <member name="virtual_keyboard_enabled" type="bool" setter="set_virtual_keyboard_enabled" getter="is_virtual_keyboard_enabled" default="true"> If [code]true[/code], the native virtual keyboard is shown when focused on platforms that support it. </member> + <member name="virtual_keyboard_type" type="int" setter="set_virtual_keyboard_type" getter="get_virtual_keyboard_type" enum="LineEdit.VirtualKeyboardType" default="0"> + Specifies the type of virtual keyboard to show. + </member> </members> <signals> <signal name="text_change_rejected"> @@ -356,6 +359,31 @@ <constant name="MENU_MAX" value="28" enum="MenuItems"> Represents the size of the [enum MenuItems] enum. </constant> + <constant name="KEYBOARD_TYPE_DEFAULT" value="0" enum="VirtualKeyboardType"> + Default text virtual keyboard. + </constant> + <constant name="KEYBOARD_TYPE_MULTILINE" value="1" enum="VirtualKeyboardType"> + Multiline virtual keyboard. + </constant> + <constant name="KEYBOARD_TYPE_NUMBER" value="2" enum="VirtualKeyboardType"> + Virtual number keypad, useful for PIN entry. + </constant> + <constant name="KEYBOARD_TYPE_NUMBER_DECIMAL" value="3" enum="VirtualKeyboardType"> + Virtual number keypad, useful for entering fractional numbers. + </constant> + <constant name="KEYBOARD_TYPE_PHONE" value="4" enum="VirtualKeyboardType"> + Virtual phone number keypad. + </constant> + <constant name="KEYBOARD_TYPE_EMAIL_ADDRESS" value="5" enum="VirtualKeyboardType"> + Virtual keyboard with additional keys to assist with typing email addresses. + </constant> + <constant name="KEYBOARD_TYPE_PASSWORD" value="6" enum="VirtualKeyboardType"> + Virtual keyboard for entering a password. On most platforms, this should disable autocomplete and autocapitalization. + [b]Note:[/b] This is not supported on HTML5. Instead, this behaves identically to [constant KEYBOARD_TYPE_DEFAULT]. + </constant> + <constant name="KEYBOARD_TYPE_URL" value="7" enum="VirtualKeyboardType"> + Virtual keyboard with additional keys to assist with typing URLs. + </constant> </constants> <theme_items> <theme_item name="caret_color" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)"> diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index a7b1f0ea33..737662fe69 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -194,6 +194,10 @@ <members> <member name="action_mode" type="int" setter="set_action_mode" getter="get_action_mode" overrides="BaseButton" enum="BaseButton.ActionMode" default="0" /> <member name="alignment" type="int" setter="set_text_alignment" getter="get_text_alignment" overrides="Button" enum="HorizontalAlignment" default="0" /> + <member name="fit_to_longest_item" type="bool" setter="set_fit_to_longest_item" getter="is_fit_to_longest_item" default="true"> + If [code]true[/code], minimum size will be determined by the longest item's text, instead of the currently selected one's. + [b]Note:[/b] For performance reasons, the minimum size doesn't update immediately when adding, removing or modifying items. + </member> <member name="item_count" type="int" setter="set_item_count" getter="get_item_count" default="0"> The number of items to select from. </member> diff --git a/doc/classes/PhysicsRayQueryParameters2D.xml b/doc/classes/PhysicsRayQueryParameters2D.xml index 36933ef9a2..1cfc6caadf 100644 --- a/doc/classes/PhysicsRayQueryParameters2D.xml +++ b/doc/classes/PhysicsRayQueryParameters2D.xml @@ -8,6 +8,22 @@ </description> <tutorials> </tutorials> + <methods> + <method name="create" qualifiers="static"> + <return type="PhysicsRayQueryParameters2D" /> + <argument index="0" name="from" type="Vector2" /> + <argument index="1" name="to" type="Vector2" /> + <argument index="2" name="collision_mask" type="int" default="4294967295" /> + <argument index="3" name="exclude" type="Array" default="[]" /> + <description> + Returns a new, pre-configured [PhysicsRayQueryParameters2D] object. Use it to quickly create query parameters using the most common options. + [codeblock] + var query = PhysicsRayQueryParameters2D.create(global_position, global_position + Vector2(0, 100)) + var collision = get_world_2d().direct_space_state.intersect_ray(query) + [/codeblock] + </description> + </method> + </methods> <members> <member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false"> If [code]true[/code], the query will take [Area2D]s into account. diff --git a/doc/classes/PhysicsRayQueryParameters3D.xml b/doc/classes/PhysicsRayQueryParameters3D.xml index 4244ec785f..e9216a8300 100644 --- a/doc/classes/PhysicsRayQueryParameters3D.xml +++ b/doc/classes/PhysicsRayQueryParameters3D.xml @@ -8,6 +8,22 @@ </description> <tutorials> </tutorials> + <methods> + <method name="create" qualifiers="static"> + <return type="PhysicsRayQueryParameters3D" /> + <argument index="0" name="from" type="Vector3" /> + <argument index="1" name="to" type="Vector3" /> + <argument index="2" name="collision_mask" type="int" default="4294967295" /> + <argument index="3" name="exclude" type="Array" default="[]" /> + <description> + Returns a new, pre-configured [PhysicsRayQueryParameters3D] object. Use it to quickly create query parameters using the most common options. + [codeblock] + var query = PhysicsRayQueryParameters3D.create(position, position + Vector3(0, -10, 0)) + var collision = get_world_3d().direct_space_state.intersect_ray(query) + [/codeblock] + </description> + </method> + </methods> <members> <member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false"> If [code]true[/code], the query will take [Area3D]s into account. diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index ae0ec64c27..40477d27d4 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -588,7 +588,7 @@ [b]Note:[/b] By default, or when set to 0, the initial window width is the viewport [member display/window/size/viewport_width]. This setting is ignored on iOS, Android, and HTML5. </member> <member name="display/window/vsync/vsync_mode" type="int" setter="" getter="" default="1"> - Sets the VSync mode for the main game window. + Sets the V-Sync mode for the main game window. See [enum DisplayServer.VSyncMode] for possible values and how they affect the behavior of your application. Depending on the platform and used renderer, the engine will fall back to [code]Enabled[/code], if the desired mode is not supported. </member> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 6248394b1a..3962f309de 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -305,6 +305,12 @@ <description> </description> </method> + <method name="framebuffer_is_valid" qualifiers="const"> + <return type="bool" /> + <argument index="0" name="framebuffer" type="RID" /> + <description> + </description> + </method> <method name="free_rid"> <return type="void" /> <argument index="0" name="rid" type="RID" /> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 9a398b1f33..1b58b50bc7 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -1391,21 +1391,21 @@ Once finished with your RID, you will want to free the RID using the RenderingServer's [method free_rid] static method. </description> </method> - <method name="instance_geometry_get_shader_parameter" qualifiers="const"> + <method name="instance_geometry_get_shader_uniform" qualifiers="const"> <return type="Variant" /> <argument index="0" name="instance" type="RID" /> <argument index="1" name="parameter" type="StringName" /> <description> </description> </method> - <method name="instance_geometry_get_shader_parameter_default_value" qualifiers="const"> + <method name="instance_geometry_get_shader_uniform_default_value" qualifiers="const"> <return type="Variant" /> <argument index="0" name="instance" type="RID" /> <argument index="1" name="parameter" type="StringName" /> <description> </description> </method> - <method name="instance_geometry_get_shader_parameter_list" qualifiers="const"> + <method name="instance_geometry_get_shader_uniform_list" qualifiers="const"> <return type="Array" /> <argument index="0" name="instance" type="RID" /> <description> @@ -1460,7 +1460,7 @@ Sets a material that will override the material for all surfaces on the mesh associated with this instance. Equivalent to [member GeometryInstance3D.material_override]. </description> </method> - <method name="instance_geometry_set_shader_parameter"> + <method name="instance_geometry_set_shader_uniform"> <return type="void" /> <argument index="0" name="instance" type="RID" /> <argument index="1" name="parameter" type="StringName" /> @@ -2741,7 +2741,7 @@ <description> </description> </method> - <method name="shader_get_param_list" qualifiers="const"> + <method name="shader_get_shader_uniform_list" qualifiers="const"> <return type="Dictionary[]" /> <argument index="0" name="shader" type="RID" /> <description> diff --git a/doc/classes/ResourceUID.xml b/doc/classes/ResourceUID.xml index f91c39b512..782a8a2968 100644 --- a/doc/classes/ResourceUID.xml +++ b/doc/classes/ResourceUID.xml @@ -1,8 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> <class name="ResourceUID" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> + Singleton for managing a cache of resource UIDs within a project. </brief_description> <description> + Resources can not only be referenced using their resource paths [code]res://[/code], but alternatively through a unique identifier specified via [code]uid://[/code]. + Using UIDs allows for the engine to keep references between resources intact, even if the files get renamed or moved. + This singleton is responsible for keeping track of all registered resource UIDs of a project, generating new UIDs and converting between the string and integer representation. </description> <tutorials> </tutorials> @@ -12,35 +16,45 @@ <argument index="0" name="id" type="int" /> <argument index="1" name="path" type="String" /> <description> + Adds a new UID value which is mapped to the given resource path. + Fails with an error if the UID already exists, so be sure to check [method has_id] beforehand, or use [method set_id] instead. </description> </method> <method name="create_id"> <return type="int" /> <description> + Generates a random resource UID which is guaranteed to be unique within the list of currently loaded UIDs. + In order for this UID to be registered, you must call [method add_id] or [method set_id]. </description> </method> <method name="get_id_path" qualifiers="const"> <return type="String" /> <argument index="0" name="id" type="int" /> <description> + Returns the path that the given UID value refers to. + Fails with an error if the UID does not exist, so be sure to check [method has_id] beforehand. </description> </method> <method name="has_id" qualifiers="const"> <return type="bool" /> <argument index="0" name="id" type="int" /> <description> + Returns whether the given UID value is known to the cache. </description> </method> <method name="id_to_text" qualifiers="const"> <return type="String" /> <argument index="0" name="id" type="int" /> <description> + Converts the given UID to a [code]uid://[/code] string value. </description> </method> <method name="remove_id"> <return type="void" /> <argument index="0" name="id" type="int" /> <description> + Removes a loaded UID value from the cache. + Fails with an error if the UID does not exist, so be sure to check [method has_id] beforehand. </description> </method> <method name="set_id"> @@ -48,17 +62,22 @@ <argument index="0" name="id" type="int" /> <argument index="1" name="path" type="String" /> <description> + Updates the resource path of an existing UID. + Fails with an error if the UID does not exist, so be sure to check [method has_id] beforehand, or use [method add_id] instead. </description> </method> <method name="text_to_id" qualifiers="const"> <return type="int" /> <argument index="0" name="text_id" type="String" /> <description> + Extracts the UID value from the given [code]uid://[/code] string. </description> </method> </methods> <constants> <constant name="INVALID_ID" value="-1"> + The value to use for an invalid UID, for example if the resource could not be loaded. + Its text representation is [code]uid://<invalid>[/code]. </constant> </constants> </class> diff --git a/doc/classes/Shader.xml b/doc/classes/Shader.xml index 10deaf1c41..1921c5b91d 100644 --- a/doc/classes/Shader.xml +++ b/doc/classes/Shader.xml @@ -26,7 +26,7 @@ Returns the shader mode for the shader, either [constant MODE_CANVAS_ITEM], [constant MODE_SPATIAL] or [constant MODE_PARTICLES]. </description> </method> - <method name="has_param" qualifiers="const"> + <method name="has_uniform" qualifiers="const"> <return type="bool" /> <argument index="0" name="name" type="StringName" /> <description> diff --git a/doc/classes/ShaderMaterial.xml b/doc/classes/ShaderMaterial.xml index 672b660c34..1208b93a62 100644 --- a/doc/classes/ShaderMaterial.xml +++ b/doc/classes/ShaderMaterial.xml @@ -10,7 +10,7 @@ <link title="Shaders documentation index">$DOCS_URL/tutorials/shaders/index.html</link> </tutorials> <methods> - <method name="get_shader_param" qualifiers="const"> + <method name="get_shader_uniform" qualifiers="const"> <return type="Variant" /> <argument index="0" name="param" type="StringName" /> <description> @@ -31,7 +31,7 @@ Returns the default value of the material property with given [code]name[/code]. </description> </method> - <method name="set_shader_param"> + <method name="set_shader_uniform"> <return type="void" /> <argument index="0" name="param" type="StringName" /> <argument index="1" name="value" type="Variant" /> diff --git a/doc/classes/SpinBox.xml b/doc/classes/SpinBox.xml index e84f9c38ff..8df039794a 100644 --- a/doc/classes/SpinBox.xml +++ b/doc/classes/SpinBox.xml @@ -47,6 +47,9 @@ <members> <member name="alignment" type="int" setter="set_horizontal_alignment" getter="get_horizontal_alignment" enum="HorizontalAlignment" default="0"> </member> + <member name="custom_arrow_step" type="float" setter="set_custom_arrow_step" getter="get_custom_arrow_step" default="0.0"> + If not [code]0[/code], [code]value[/code] will always be rounded to a multiple of [code]custom_arrow_step[/code] when interacting with the arrow buttons of the [SpinBox]. + </member> <member name="editable" type="bool" setter="set_editable" getter="is_editable" default="true"> If [code]true[/code], the [SpinBox] will be editable. Otherwise, it will be read only. </member> diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index 9f35ddc353..b54536f897 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -1679,6 +1679,9 @@ <constant name="GRAPHEME_IS_CONNECTED" value="1024" enum="GraphemeFlag" is_bitfield="true"> Grapheme is connected to the previous grapheme. Breaking line before this grapheme is not safe. </constant> + <constant name="GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL" value="2048" enum="GraphemeFlag" is_bitfield="true"> + It is safe to insert a U+0640 before this grapheme for elongation. + </constant> <constant name="HINTING_NONE" value="0" enum="Hinting"> Disables font hinting (smoother but less crisp). </constant> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index b06be0cf99..f326948e9c 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -461,7 +461,7 @@ <theme_item name="custom_button_font_highlight" data_type="color" type="Color" default="Color(0.95, 0.95, 0.95, 1)"> Text [Color] for a [constant TreeItem.CELL_MODE_CUSTOM] mode cell when it's hovered. </theme_item> - <theme_item name="drop_position_color" data_type="color" type="Color" default="Color(1, 0.3, 0.2, 1)"> + <theme_item name="drop_position_color" data_type="color" type="Color" default="Color(1, 1, 1, 1)"> [Color] used to draw possible drop locations. See [enum DropModeFlags] constants for further description of drop locations. </theme_item> <theme_item name="font_color" data_type="color" type="Color" default="Color(0.7, 0.7, 0.7, 1)"> diff --git a/doc/tools/make_rst.py b/doc/tools/make_rst.py index 469bb4a310..196a26ef77 100755 --- a/doc/tools/make_rst.py +++ b/doc/tools/make_rst.py @@ -9,15 +9,13 @@ import re import sys import xml.etree.ElementTree as ET from collections import OrderedDict +from typing import List, Dict, TextIO, Tuple, Optional, Any, Union # Import hardcoded version information from version.py root_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../") sys.path.append(root_directory) # Include the root directory import version -# Uncomment to do type checks. I have it commented out so it works below Python 3.5 -# from typing import List, Dict, TextIO, Tuple, Iterable, Optional, DefaultDict, Any, Union - # $DOCS_URL/path/to/page.html(#fragment-tag) GODOT_DOCS_PATTERN = re.compile(r"^\$DOCS_URL/(.*)\.html(#.*)?$") @@ -61,126 +59,18 @@ BASE_STRINGS = [ "This method doesn't need an instance to be called, so it can be called directly using the class name.", "This method describes a valid operator to use with this type as left-hand operand.", ] -strings_l10n = {} - -STYLES = {} - - -def print_error(error, state): # type: (str, State) -> None - print("{}{}ERROR:{} {}{}".format(STYLES["red"], STYLES["bold"], STYLES["regular"], error, STYLES["reset"])) - state.num_errors += 1 - - -class TypeName: - def __init__(self, type_name, enum=None): # type: (str, Optional[str]) -> None - self.type_name = type_name - self.enum = enum - - def to_rst(self, state): # type: ("State") -> str - if self.enum is not None: - return make_enum(self.enum, state) - elif self.type_name == "void": - return "void" - else: - return make_type(self.type_name, state) - - @classmethod - def from_element(cls, element): # type: (ET.Element) -> "TypeName" - return cls(element.attrib["type"], element.get("enum")) - - -class PropertyDef: - def __init__( - self, name, type_name, setter, getter, text, default_value, overrides - ): # type: (str, TypeName, Optional[str], Optional[str], Optional[str], Optional[str], Optional[str]) -> None - self.name = name - self.type_name = type_name - self.setter = setter - self.getter = getter - self.text = text - self.default_value = default_value - self.overrides = overrides - - -class ParameterDef: - def __init__(self, name, type_name, default_value): # type: (str, TypeName, Optional[str]) -> None - self.name = name - self.type_name = type_name - self.default_value = default_value - - -class SignalDef: - def __init__(self, name, parameters, description): # type: (str, List[ParameterDef], Optional[str]) -> None - self.name = name - self.parameters = parameters - self.description = description - - -class MethodDef: - def __init__( - self, name, return_type, parameters, description, qualifiers - ): # type: (str, TypeName, List[ParameterDef], Optional[str], Optional[str]) -> None - self.name = name - self.return_type = return_type - self.parameters = parameters - self.description = description - self.qualifiers = qualifiers - +strings_l10n: Dict[str, str] = {} -class ConstantDef: - def __init__(self, name, value, text, bitfield): # type: (str, str, Optional[str], Optional[bool]) -> None - self.name = name - self.value = value - self.text = text - self.is_bitfield = bitfield - - -class EnumDef: - def __init__(self, name, bitfield): # type: (str, Optional[bool]) -> None - self.name = name - self.values = OrderedDict() # type: OrderedDict[str, ConstantDef] - self.is_bitfield = bitfield - - -class ThemeItemDef: - def __init__( - self, name, type_name, data_name, text, default_value - ): # type: (str, TypeName, str, Optional[str], Optional[str]) -> None - self.name = name - self.type_name = type_name - self.data_name = data_name - self.text = text - self.default_value = default_value - - -class ClassDef: - def __init__(self, name): # type: (str) -> None - self.name = name - self.constants = OrderedDict() # type: OrderedDict[str, ConstantDef] - self.enums = OrderedDict() # type: OrderedDict[str, EnumDef] - self.properties = OrderedDict() # type: OrderedDict[str, PropertyDef] - self.constructors = OrderedDict() # type: OrderedDict[str, List[MethodDef]] - self.methods = OrderedDict() # type: OrderedDict[str, List[MethodDef]] - self.operators = OrderedDict() # type: OrderedDict[str, List[MethodDef]] - self.signals = OrderedDict() # type: OrderedDict[str, SignalDef] - self.annotations = OrderedDict() # type: OrderedDict[str, List[MethodDef]] - self.theme_items = OrderedDict() # type: OrderedDict[str, ThemeItemDef] - self.inherits = None # type: Optional[str] - self.brief_description = None # type: Optional[str] - self.description = None # type: Optional[str] - self.tutorials = [] # type: List[Tuple[str, str]] - - # Used to match the class with XML source for output filtering purposes. - self.filepath = "" # type: str +STYLES: Dict[str, str] = {} class State: - def __init__(self): # type: () -> None + def __init__(self) -> None: self.num_errors = 0 - self.classes = OrderedDict() # type: OrderedDict[str, ClassDef] - self.current_class = "" # type: str + self.classes: OrderedDict[str, ClassDef] = OrderedDict() + self.current_class: str = "" - def parse_class(self, class_root, filepath): # type: (ET.Element, str) -> None + def parse_class(self, class_root: ET.Element, filepath: str) -> None: class_name = class_root.attrib["name"] class_def = ClassDef(class_name) @@ -233,7 +123,6 @@ class State: return_element = constructor.find("return") if return_element is not None: return_type = TypeName.from_element(return_element) - else: return_type = TypeName("void") @@ -314,7 +203,7 @@ class State: constant_name = constant.attrib["name"] value = constant.attrib["value"] enum = constant.get("enum") - is_bitfield = constant.get("is_bitfield") or False + is_bitfield = constant.get("is_bitfield") == "true" constant_def = ConstantDef(constant_name, value, constant.text, is_bitfield) if enum is None: if constant_name in class_def.constants: @@ -348,7 +237,7 @@ class State: if desc_element is not None: annotation_desc = desc_element.text - annotation_def = MethodDef(annotation_name, return_type, params, annotation_desc, qualifiers) + annotation_def = AnnotationDef(annotation_name, params, annotation_desc, qualifiers) if annotation_name not in class_def.annotations: class_def.annotations[annotation_name] = [] @@ -413,13 +302,147 @@ class State: if link.text is not None: class_def.tutorials.append((link.text.strip(), link.get("title", ""))) - def sort_classes(self): # type: () -> None + def sort_classes(self) -> None: self.classes = OrderedDict(sorted(self.classes.items(), key=lambda t: t[0])) -def parse_arguments(root): # type: (ET.Element) -> List[ParameterDef] +class TypeName: + def __init__(self, type_name: str, enum: Optional[str] = None) -> None: + self.type_name = type_name + self.enum = enum + + def to_rst(self, state: State) -> str: + if self.enum is not None: + return make_enum(self.enum, state) + elif self.type_name == "void": + return "void" + else: + return make_type(self.type_name, state) + + @classmethod + def from_element(cls, element: ET.Element) -> "TypeName": + return cls(element.attrib["type"], element.get("enum")) + + +class PropertyDef: + def __init__( + self, + name: str, + type_name: TypeName, + setter: Optional[str], + getter: Optional[str], + text: Optional[str], + default_value: Optional[str], + overrides: Optional[str], + ) -> None: + self.name = name + self.type_name = type_name + self.setter = setter + self.getter = getter + self.text = text + self.default_value = default_value + self.overrides = overrides + + +class ParameterDef: + def __init__(self, name: str, type_name: TypeName, default_value: Optional[str]) -> None: + self.name = name + self.type_name = type_name + self.default_value = default_value + + +class SignalDef: + def __init__(self, name: str, parameters: List[ParameterDef], description: Optional[str]) -> None: + self.name = name + self.parameters = parameters + self.description = description + + +class AnnotationDef: + def __init__( + self, + name: str, + parameters: List[ParameterDef], + description: Optional[str], + qualifiers: Optional[str], + ) -> None: + self.name = name + self.parameters = parameters + self.description = description + self.qualifiers = qualifiers + + +class MethodDef: + def __init__( + self, + name: str, + return_type: TypeName, + parameters: List[ParameterDef], + description: Optional[str], + qualifiers: Optional[str], + ) -> None: + self.name = name + self.return_type = return_type + self.parameters = parameters + self.description = description + self.qualifiers = qualifiers + + +class ConstantDef: + def __init__(self, name: str, value: str, text: Optional[str], bitfield: bool) -> None: + self.name = name + self.value = value + self.text = text + self.is_bitfield = bitfield + + +class EnumDef: + def __init__(self, name: str, bitfield: bool) -> None: + self.name = name + self.values: OrderedDict[str, ConstantDef] = OrderedDict() + self.is_bitfield = bitfield + + +class ThemeItemDef: + def __init__( + self, name: str, type_name: TypeName, data_name: str, text: Optional[str], default_value: Optional[str] + ) -> None: + self.name = name + self.type_name = type_name + self.data_name = data_name + self.text = text + self.default_value = default_value + + +class ClassDef: + def __init__(self, name: str) -> None: + self.name = name + self.constants: OrderedDict[str, ConstantDef] = OrderedDict() + self.enums: OrderedDict[str, EnumDef] = OrderedDict() + self.properties: OrderedDict[str, PropertyDef] = OrderedDict() + self.constructors: OrderedDict[str, List[MethodDef]] = OrderedDict() + self.methods: OrderedDict[str, List[MethodDef]] = OrderedDict() + self.operators: OrderedDict[str, List[MethodDef]] = OrderedDict() + self.signals: OrderedDict[str, SignalDef] = OrderedDict() + self.annotations: OrderedDict[str, List[AnnotationDef]] = OrderedDict() + self.theme_items: OrderedDict[str, ThemeItemDef] = OrderedDict() + self.inherits: Optional[str] = None + self.brief_description: Optional[str] = None + self.description: Optional[str] = None + self.tutorials: List[Tuple[str, str]] = [] + + # Used to match the class with XML source for output filtering purposes. + self.filepath: str = "" + + +def print_error(error: str, state: State) -> None: + print("{}{}ERROR:{} {}{}".format(STYLES["red"], STYLES["bold"], STYLES["regular"], error, STYLES["reset"])) + state.num_errors += 1 + + +def parse_arguments(root: ET.Element) -> List[ParameterDef]: param_elements = root.findall("argument") - params = [None] * len(param_elements) # type: Any + params: Any = [None] * len(param_elements) for param_element in param_elements: param_name = param_element.attrib["name"] index = int(param_element.attrib["index"]) @@ -428,16 +451,16 @@ def parse_arguments(root): # type: (ET.Element) -> List[ParameterDef] params[index] = ParameterDef(param_name, type_name, default) - cast = params # type: List[ParameterDef] + cast: List[ParameterDef] = params return cast -def main(): # type: () -> None +def main() -> None: # Enable ANSI escape code support on Windows 10 and later (for colored console output). # <https://bugs.python.org/issue29059> if platform.system().lower() == "windows": - from ctypes import windll, c_int, byref + from ctypes import windll, c_int, byref # type: ignore stdout_handle = windll.kernel32.GetStdHandle(c_int(-11)) mode = c_int(0) @@ -491,7 +514,7 @@ def main(): # type: () -> None print("Checking for errors in the XML class reference...") - file_list = [] # type: List[str] + file_list: List[str] = [] for path in args.path: # Cut off trailing slashes so os.path.basename doesn't choke. @@ -515,7 +538,7 @@ def main(): # type: () -> None file_list.append(path) - classes = {} # type: Dict[str, ET.Element] + classes: Dict[str, Tuple[ET.Element, str]] = {} state = State() for cur_file in file_list: @@ -576,7 +599,7 @@ def main(): # type: () -> None exit(1) -def translate(string): # type: (str) -> str +def translate(string: str) -> str: """Translate a string based on translations sourced from `doc/translations/*.po` for a language if defined via the --lang command line argument. Returns the original string if no translation exists. @@ -584,7 +607,7 @@ def translate(string): # type: (str) -> str return strings_l10n.get(string, string) -def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, State, bool, str) -> None +def make_rst_class(class_def: ClassDef, state: State, dry_run: bool, output_dir: str) -> None: class_name = class_def.name if dry_run: @@ -635,8 +658,8 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S break f.write("\n\n") - # Descendents - inherited = [] + # Descendants + inherited: List[str] = [] for c in state.classes.values(): if c.inherits and c.inherits.strip() == class_name: inherited.append(c.name) @@ -667,7 +690,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S # Properties overview if len(class_def.properties) > 0: f.write(make_heading("Properties", "-")) - ml = [] # type: List[Tuple[str, str, str]] + ml: List[Tuple[Optional[str], ...]] = [] for property_def in class_def.properties.values(): type_rst = property_def.type_name.to_rst(state) default = property_def.default_value @@ -683,7 +706,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S # Constructors, Methods, Operators overview if len(class_def.constructors) > 0: f.write(make_heading("Constructors", "-")) - ml = [] + ml: List[Tuple[Optional[str], ...]] = [] for method_list in class_def.constructors.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "constructor", state)) @@ -691,7 +714,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S if len(class_def.methods) > 0: f.write(make_heading("Methods", "-")) - ml = [] + ml: List[Tuple[Optional[str], ...]] = [] for method_list in class_def.methods.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "method", state)) @@ -699,7 +722,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S if len(class_def.operators) > 0: f.write(make_heading("Operators", "-")) - ml = [] + ml: List[Tuple[Optional[str], ...]] = [] for method_list in class_def.operators.values(): for m in method_list: ml.append(make_method_signature(class_def, m, "operator", state)) @@ -708,7 +731,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S # Theme properties if len(class_def.theme_items) > 0: f.write(make_heading("Theme Properties", "-")) - pl = [] + pl: List[Tuple[Optional[str], ...]] = [] for theme_item_def in class_def.theme_items.values(): ref = ":ref:`{0}<class_{2}_theme_{1}_{0}>`".format( theme_item_def.name, theme_item_def.data_name, class_name @@ -781,6 +804,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S f.write("\n\n") + # Annotations if len(class_def.annotations) > 0: f.write(make_heading("Annotations", "-")) index = 0 @@ -793,8 +817,8 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S if i == 0: f.write(".. _class_{}_annotation_{}:\n\n".format(class_name, m.name.strip("@"))) - ret_type, signature = make_method_signature(class_def, m, "", state) - f.write("- {} {}\n\n".format(ret_type, signature)) + _, signature = make_method_signature(class_def, m, "", state) + f.write("- {}\n\n".format(signature)) if m.description is not None and m.description.strip() != "": f.write(rstize_text(m.description.strip(), state) + "\n\n") @@ -816,7 +840,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S f.write(".. _class_{}_property_{}:\n\n".format(class_name, property_def.name)) f.write("- {} **{}**\n\n".format(property_def.type_name.to_rst(state), property_def.name)) - info = [] + info: List[Tuple[Optional[str], ...]] = [] # Not using translate() for now as it breaks table formatting. if property_def.default_value is not None: info.append(("*" + "Default" + "*", property_def.default_value)) @@ -926,7 +950,7 @@ def make_rst_class(class_def, state, dry_run, output_dir): # type: (ClassDef, S f.write(make_footer()) -def escape_rst(text, until_pos=-1): # type: (str, int) -> str +def escape_rst(text: str, until_pos: int = -1) -> str: # Escape \ character, otherwise it ends up as an escape character in rst pos = 0 while True: @@ -960,7 +984,7 @@ def escape_rst(text, until_pos=-1): # type: (str, int) -> str return text -def format_codeblock(code_type, post_text, indent_level, state): # types: str, str, int, state +def format_codeblock(code_type: str, post_text: str, indent_level: int, state: State) -> Union[Tuple[str, int], None]: end_pos = post_text.find("[/" + code_type + "]") if end_pos == -1: print_error("{}.xml: [" + code_type + "] without a closing tag.".format(state.current_class), state) @@ -994,10 +1018,10 @@ def format_codeblock(code_type, post_text, indent_level, state): # types: str, else: code_text = code_text[:code_pos] + "\n " + code_text[code_pos + to_skip + 1 :] code_pos += 5 - to_skip - return ["\n[" + code_type + "]" + code_text + post_text, len("\n[" + code_type + "]" + code_text)] + return ("\n[" + code_type + "]" + code_text + post_text, len("\n[" + code_type + "]" + code_text)) -def rstize_text(text, state): # type: (str, State) -> str +def rstize_text(text: str, state: State) -> str: # Linebreak + tabs in the XML should become two line breaks unless in a "codeblock" pos = 0 while True: @@ -1037,7 +1061,6 @@ def rstize_text(text, state): # type: (str, State) -> str inside_code = False pos = 0 tag_depth = 0 - previous_pos = 0 while True: pos = text.find("[", pos) if pos == -1: @@ -1204,7 +1227,6 @@ def rstize_text(text, state): # type: (str, State) -> str text = pre_text + tag_text + post_text pos = len(pre_text) + len(tag_text) - previous_pos = pos continue elif cmd == "center": tag_depth += 1 @@ -1310,7 +1332,6 @@ def rstize_text(text, state): # type: (str, State) -> str text = pre_text + tag_text + post_text pos = len(pre_text) + len(tag_text) - previous_pos = pos if tag_depth > 0: print_error( @@ -1320,7 +1341,7 @@ def rstize_text(text, state): # type: (str, State) -> str return text -def format_table(f, data, remove_empty_columns=False): # type: (TextIO, Iterable[Tuple[str, ...]], bool) -> None +def format_table(f: TextIO, data: List[Tuple[Optional[str], ...]], remove_empty_columns: bool = False) -> None: if len(data) == 0: return @@ -1351,7 +1372,7 @@ def format_table(f, data, remove_empty_columns=False): # type: (TextIO, Iterabl f.write("\n") -def make_type(klass, state): # type: (str, State) -> str +def make_type(klass: str, state: State) -> str: if klass.find("*") != -1: # Pointer, ignore return klass link_type = klass @@ -1363,7 +1384,7 @@ def make_type(klass, state): # type: (str, State) -> str return klass -def make_enum(t, state): # type: (str, State) -> str +def make_enum(t: str, state: State) -> str: p = t.find(".") if p >= 0: c = t[0:p] @@ -1389,31 +1410,36 @@ def make_enum(t, state): # type: (str, State) -> str def make_method_signature( - class_def, method_def, ref_type, state -): # type: (ClassDef, Union[MethodDef, SignalDef], str, State) -> Tuple[str, str] - ret_type = " " + class_def: ClassDef, definition: Union[AnnotationDef, MethodDef, SignalDef], ref_type: str, state: State +) -> Tuple[str, str]: + ret_type = "" + + is_method_def = isinstance(definition, MethodDef) + if is_method_def: + ret_type = definition.return_type.to_rst(state) - if isinstance(method_def, MethodDef): - ret_type = method_def.return_type.to_rst(state) + qualifiers = None + if is_method_def or isinstance(definition, AnnotationDef): + qualifiers = definition.qualifiers out = "" - if ref_type != "": + if is_method_def and ref_type != "": if ref_type == "operator": out += ":ref:`{0}<class_{1}_{2}_{3}_{4}>` ".format( - method_def.name.replace("<", "\\<"), # So operator "<" gets correctly displayed. + definition.name.replace("<", "\\<"), # So operator "<" gets correctly displayed. class_def.name, ref_type, - sanitize_operator_name(method_def.name, state), - method_def.return_type.type_name, + sanitize_operator_name(definition.name, state), + definition.return_type.type_name, ) else: - out += ":ref:`{0}<class_{1}_{2}_{0}>` ".format(method_def.name, class_def.name, ref_type) + out += ":ref:`{0}<class_{1}_{2}_{0}>` ".format(definition.name, class_def.name, ref_type) else: - out += "**{}** ".format(method_def.name) + out += "**{}** ".format(definition.name) out += "**(**" - for i, arg in enumerate(method_def.parameters): + for i, arg in enumerate(definition.parameters): if i > 0: out += ", " else: @@ -1424,24 +1450,24 @@ def make_method_signature( if arg.default_value is not None: out += "=" + arg.default_value - if isinstance(method_def, MethodDef) and method_def.qualifiers is not None and "vararg" in method_def.qualifiers: - if len(method_def.parameters) > 0: + if qualifiers is not None and "vararg" in qualifiers: + if len(definition.parameters) > 0: out += ", ..." else: out += " ..." out += " **)**" - if isinstance(method_def, MethodDef) and method_def.qualifiers is not None: + if qualifiers is not None: # Use substitutions for abbreviations. This is used to display tooltips on hover. # See `make_footer()` for descriptions. - for qualifier in method_def.qualifiers.split(): + for qualifier in qualifiers.split(): out += " |" + qualifier + "|" return ret_type, out -def make_heading(title, underline, l10n=True): # type: (str, str, bool) -> str +def make_heading(title: str, underline: str, l10n: bool = True) -> str: if l10n: new_title = translate(title) if new_title != title: @@ -1450,7 +1476,7 @@ def make_heading(title, underline, l10n=True): # type: (str, str, bool) -> str return title + "\n" + (underline * len(title)) + "\n\n" -def make_footer(): # type: () -> str +def make_footer() -> str: # Generate reusable abbreviation substitutions. # This way, we avoid bloating the generated rST with duplicate abbreviations. # fmt: off @@ -1465,7 +1491,7 @@ def make_footer(): # type: () -> str # fmt: on -def make_link(url, title): # type: (str, str) -> str +def make_link(url: str, title: str) -> str: match = GODOT_DOCS_PATTERN.search(url) if match: groups = match.groups() @@ -1482,15 +1508,15 @@ def make_link(url, title): # type: (str, str) -> str if title != "": return ":doc:`" + title + " <../" + groups[0] + ">`" return ":doc:`../" + groups[0] + "`" - else: - # External link, for example: - # `http://enet.bespin.org/usergroup0.html` - if title != "": - return "`" + title + " <" + url + ">`__" - return "`" + url + " <" + url + ">`__" + + # External link, for example: + # `http://enet.bespin.org/usergroup0.html` + if title != "": + return "`" + title + " <" + url + ">`__" + return "`" + url + " <" + url + ">`__" -def sanitize_operator_name(dirty_name, state): # type: (str, State) -> str +def sanitize_operator_name(dirty_name: str, state: State) -> str: clear_name = dirty_name.replace("operator ", "") if clear_name == "!=": @@ -1548,7 +1574,7 @@ def sanitize_operator_name(dirty_name, state): # type: (str, State) -> str return clear_name -def indent_bullets(text): # type: (str) -> str +def indent_bullets(text: str) -> str: # Take the text and check each line for a bullet point represented by "-". # Where found, indent the given line by a further "\t". # Used to properly indent bullet points contained in the description for enum values. diff --git a/doc/translations/fr.po b/doc/translations/fr.po index 2866dc9b70..44d40e1bd5 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -61,7 +61,7 @@ msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-27 05:24+0000\n" +"PO-Revision-Date: 2022-08-04 05:23+0000\n" "Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" @@ -548,7 +548,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -574,15 +573,15 @@ msgstr "" "- Pour [code]null[/code], [code]int[/code], [code]float[/code], " "[code]String[/code], [code]Object[/code] et [code]RID[/code], les résultats " "de [code]deep_equal[/code] et [code]==[/code] sont les mêmes.\n" -"- Pour [code]Dictionary[/code], [code]==[/code] considère que l'égalité est " -"respéctée si et seulement si les deux variables pointent vers le même " -"[code]Dictionary[/code], sans recursion ou connaissance du contenu des " +"- Pour les [code]Dictionary[/code], [code]==[/code] considère que l'égalité " +"est respectée si et seulement si les deux variables pointent vers le même " +"[code]Dictionary[/code], sans récursion ou comparaison du contenu des " "variables.\n" -"- For [code]Array[/code], [code]==[/code] considère que l'égalité est " -"respéctée si et seulement si chaque élement du premier [code]Tableau[/code] " +"- Pour les [code]Array[/code], [code]==[/code] considère que l'égalité est " +"respectée si et seulement si chaque élément du premier [code]Array[/code] " "est égal à l'élément au même index du second [code]Array[/code], évalué par " -"[code]==[/code] lui même. Cela implique que [code]==[/code] recurses dans un " -"[code]Array[/code], mais pas dans un [code]Dictionary[/code].\n" +"[code]==[/code] lui-même. Cela implique un récursion avec [code]==[/code] " +"pour les [code]Array[/code], mais pas les [code]Dictionary[/code].\n" "Rapidement, dès qu'un [code]Dictionary[/code] est potentiellement impliqué, " "si une vraie comparaison du contenu est souhaité, il faut utiliser " "[code]deep_equal[/code]." @@ -608,7 +607,6 @@ msgstr "" "nouveau en une instance. Utile pour la désérialisation." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -634,13 +632,15 @@ msgstr "" "nombre à virgule flottante, avec des valeurs spécifiques conduisant aux " "comportements suivants:\n" "[codeblock]\n" -"- Inférieur à -1.0 (exclusif): Ease in-out\n" -"- 1.0: Linéaire\n" -"- Entre -1.0 et 0.0 (exclusif): Ease out-in\n" -"- 0.0: Constante\n" -"- Entre 0.0 et 1.0 (exclusif): Ease in\n" -"- 1.0: Linéaire\n" -"- Supérieur à 1.0 (exclusif): Ease out\n" +"- Inférieur à -1.0 (exclus) : Plus lent au début et à la fin (\"ease in-out\"" +")\n" +"- 1.0 : Linéaire\n" +"- Entre -1.0 et 0.0 (exclus) : Plus rapide au début et à la fin (\"ease out-" +"in\")\n" +"- 0.0 : Constante\n" +"- Entre 0.0 et 1.0 (exclus) : Plus lent au début (\"ease in\")\n" +"- 1.0 : Linéaire\n" +"- Supérieur à 1.0 (exclus) : Plus lent à la fin (\"ease out\")\n" "[/codeblock]\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" @@ -1423,7 +1423,6 @@ msgstr "" "ou un avertissement est affiché." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1433,11 +1432,12 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Affiche la trace d'appels à l'emplacement du code, ne fonctionne que lorsque " -"le débogueur est activé.\n" +"Comme [method prunt], mais inclus la frame de la pile actuelle quand le " +"débogueur est activé.\n" "La sortie dans la console ressemblerait à ceci :\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1824,7 +1824,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1850,25 +1849,26 @@ msgid "" "-1.6521) return values[/url]" msgstr "" "Retourne le résultat de l'interpolation douce de la valeur [code]s[/code] " -"entre [code]0[/code] et [code]1[/code], basée sur la position de [code]s[/" -"code] entre [code]from[/code] et [code]to[/code].\n" -"La valeur de retour est [code]0[/code] si [code]s <= from[/code], et " +"entre [code]0[/code] et [code]1[/code], basée sur la position de " +"[code]s[/code] entre [code]from[/code] et [code]to[/code].\n" +"La valeur retournée est [code]0[/code] si [code]s <= from[/code], et " "[code]1[/code] si [code]s >= to[/code]. Si [code]s[/code] se trouve entre " "[code]from[/code] et [code]to[/code], la valeur retournée suit une courbe en " -"S qui représente les positions de [code]s[/code] entre[code]0[/code] and " +"S qui représente les positions de [code]s[/code] entre[code]0[/code] et " "[code]1[/code].\n" -"Cette courbe en S est l'interpolateur cubique d'Hermite, obtenu par " -"[code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-from) / (to-from)[/code].\n" -"[codeblock]\n" -"smoothstep(0, 2, -5.0) # Renvoie 0.0\n" -"smoothstep(0, 2, 0.5) # Renvoie 0.15625\n" -"smoothstep(0, 2, 1.0) # Renvoie 0.5\n" -"smoothstep(0, 2, 2.0) # Renvoie 1.0\n" +"Cette courbe en S est l'interpolation cubique d'Hermite, obtenu par la " +"fonction mathématique [code]f(y) = 3*y^2 - 2*y^3[/code] où [code]y = (x-from)" +" / (to-from)[/code].\n" +"[codeblock]\n" +"smoothstep(0, 2, -5.0) # Retourne 0.0\n" +"smoothstep(0, 2, 0.5) # Retourne 0.15625\n" +"smoothstep(0, 2, 1.0) # Retourne 0.5\n" +"smoothstep(0, 2, 2.0) # Retourne 1.0\n" "[/codeblock]\n" -"Comparé à [method ease] avec une valeur de courbe de [code]-1.6521[/code], " -"[method smoothstep] retourne la courbe la plus douce possible sans change " -"brusque dans la dérivée. Si vous avez besoin d'effectuer des transitions " -"plus avancées, utilisez [Tween] ou [AnimationPlayer].\n" +"Comparé à l'utilisateur [method ease] avec une valeur de courbe de [code]-1." +"6521[/code], [method smoothstep] retourne la courbe la plus douce possible, " +"sans changement brusque de dérivée. Si vous avez besoin d'effectuer des " +"transitions plus avancées, utilisez [Tween] ou [AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "smoothstep_ease_comparison.png]Comparaison entre les valeurs retournées par " "smoothstep() et ease(x, -1.6521)[/url]" @@ -4510,13 +4510,12 @@ msgstr "" "les couches de physique 2D optionnellement nommées." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Hints that an integer property is a bitmask using the optionally named 2D " "navigation layers." msgstr "" -"Indique qu'une propriété nombre entier est un masque de bits utilisant les " -"couches de rendu 2D optionnellement nommées." +"Indique qu'une propriété de nombre entier est un masque de bits indiquant " +"des calques de navigation 2D, qui peuvent être nommées." #: doc/classes/@GlobalScope.xml msgid "" @@ -4535,13 +4534,12 @@ msgstr "" "couches de physique 3D optionnellement nommées." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "" "Hints that an integer property is a bitmask using the optionally named 3D " "navigation layers." msgstr "" -"Indique qu'une propriété nombre entier est un masque de bits utilisant les " -"couches de rendu 2D optionnellement nommées." +"Indique qu'une propriété de nombre entier est un masque de bits indiquant " +"des calques de navigation 3D, qui peuvent être nommées." #: doc/classes/@GlobalScope.xml msgid "" @@ -4660,9 +4658,10 @@ msgid "The property is a translatable string." msgstr "La propriété est une chaîne de caractères traduisible." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Used to group properties together in the editor. See [EditorInspector]." -msgstr "Utilisé pour rassembler des propriétés ensemble dans l'éditeur." +msgstr "" +"Utilisé pour rassembler des propriétés ensemble dans l'éditeur. Voir " +"[EditorInspector]." #: doc/classes/@GlobalScope.xml msgid "Used to categorize properties together in the editor." @@ -5443,10 +5442,11 @@ msgid "Maximum value for the mode enum." msgstr "Valeur maximale pour le mode énumeration." #: doc/classes/AnimatedSprite.xml -#, fuzzy msgid "" "Sprite node that contains multiple textures as frames to play for animation." -msgstr "NÅ“ud de sprite qui peut utiliser plusieurs textures pour l'animation." +msgstr "" +"Le nÅ“ud de sprite qui peut utiliser plusieurs textures pour jouer une " +"animation." #: doc/classes/AnimatedSprite.xml msgid "" @@ -7372,7 +7372,7 @@ msgstr "Le type de transition." #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "The time to cross-fade between this state and the next." -msgstr "" +msgstr "La durée du fondu entre cet état et le suivant." #: doc/classes/AnimationNodeStateMachineTransition.xml msgid "Emitted when [member advance_condition] is changed." @@ -7515,9 +7515,8 @@ msgstr "" "processus." #: doc/classes/AnimationPlayer.xml -#, fuzzy msgid "Animation tutorial index" -msgstr "NÅ“ud d'animation." +msgstr "" #: doc/classes/AnimationPlayer.xml msgid "" @@ -8099,9 +8098,8 @@ msgstr "" "connectés à l'emplacement spécifié.." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the blend amount of a Blend2 node given its name." -msgstr "Retourne le nombre de clés d'une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8129,9 +8127,8 @@ msgstr "" "code]. Les enfants modifiés du node's continuent d'être animés." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the blend amount of a Blend3 node given its name." -msgstr "Retourne le nombre de clés d'une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8152,9 +8149,8 @@ msgstr "" "de B+ est à 0. À 1, la sortie est l'entrée B+." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the blend amount of a Blend4 node given its name." -msgstr "Retourne le nombre de clés d'une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8186,9 +8182,8 @@ msgid "Returns a [PoolStringArray] containing the name of all nodes." msgstr "Retourne un [PoolStringArray] contenant le nom de tous les nÅ“uds." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the mix amount of a Mix node given its name." -msgstr "Retourne le nombre de clés d'une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8234,23 +8229,20 @@ msgstr "" "position." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the autostart delay of a OneShot node given its name." -msgstr "Retourne la valeur d'une clé donnée dans une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "Returns the autostart random delay of a OneShot node given its name." msgstr "" #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the fade in time of a OneShot node given its name." -msgstr "Retourne le nom du nÅ“ud d'animation donné." +msgstr "" #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "Returns the fade out time of a OneShot node given its name." -msgstr "Retourne la valeur d'une clé donnée dans une piste donnée." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "Returns whether a OneShot node will auto restart given its name." @@ -8364,13 +8356,10 @@ msgstr "" "transition nommé [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "" "Returns the index of the currently evaluated input for the transition node " "with name [code]id[/code]." msgstr "" -"Retourne la distance la plus courte de l'avion à la position [code]point [/" -"code]." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8382,11 +8371,10 @@ msgstr "" "de transition." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "" "Returns the cross fade time for the transition node with name [code]id[/" "code]." -msgstr "Retourne le nom du nÅ“ud à [code]idx[/code]." +msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8399,13 +8387,10 @@ msgstr "" "vers la prochaine entrée dès que la transition se termine." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "" "The transition node with name [code]id[/code] sets its current input at " "[code]input_idx[/code]." msgstr "" -"Change la position de l'index de la piste [code]idx[/code] à celui définie " -"par [code]to_idx[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -8424,13 +8409,10 @@ msgstr "" "nommé [code]id[/code]." #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "" "The transition node with name [code]id[/code] sets its cross fade time to " "[code]time_sec[/code]." msgstr "" -"Change la position de l'index de la piste [code]idx[/code] à celui définie " -"par [code]to_idx[/code]." #: doc/classes/AnimationTreePlayer.xml msgid "" @@ -9590,7 +9572,7 @@ msgid "" "element, the slower [method pop_at] will be." msgstr "" "Retire et retourne l'élément du tableau à la [code]position[/code]. Si " -"négatif, [code]position[/code] part de la la fin du tableau vers le début. " +"négatif, [code]position[/code] part de la fin du tableau vers le début. " "Laisse le tableau intact et retourne [code]null[/code] si le tableau est " "vide ou s'il la position est en dehors des limites du tableau. Un message " "d'erreur est affiché lorsque la position est en dehors des limites du " @@ -9932,7 +9914,7 @@ msgid "" "(see [method add_surface_from_arrays])." msgstr "" "Retourne la longueur des indices du tableau d'indices pour la surface " -"spécifiée (voir [method add_surface_from_arrays].)" +"spécifiée (voir [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" @@ -9940,7 +9922,7 @@ msgid "" "(see [method add_surface_from_arrays])." msgstr "" "Retourne la longueur des sommets du tableau des sommets dans la surface " -"spécifiée (voir [method add_surface_from_arrays].)" +"spécifiée (voir [method add_surface_from_arrays])." #: doc/classes/ArrayMesh.xml msgid "" @@ -9988,7 +9970,7 @@ msgstr "" #: doc/classes/ArrayMesh.xml msgid "Sets the blend shape mode to one of [enum Mesh.BlendShapeMode]." -msgstr "Définit le mode de forme de mélange avec [enum Mesh.BlendShapeMode]" +msgstr "Définit le mode de forme de mélange avec [enum Mesh.BlendShapeMode]." #: doc/classes/ArrayMesh.xml doc/classes/PrimitiveMesh.xml msgid "" @@ -10001,10 +9983,8 @@ msgstr "" "lors de l'utilisation d'un shader qui décale les sommets." #: doc/classes/ArrayMesh.xml -#, fuzzy msgid "Value used internally when no indices are present." -msgstr "" -"La valeur par défaut utilisée pour index_array_len quand il n'y pas d'indice." +msgstr "La valeur par défaut utilisée en interne quand il n'y pas d'indice." #: doc/classes/ArrayMesh.xml msgid "Amount of weights/bone indices per vertex (always 4)." @@ -10227,7 +10207,6 @@ msgstr "" "constamment mise à jour [code]mesh_updated[/code]." #: doc/classes/ARVRCamera.xml -#, fuzzy msgid "" "A camera node with a few overrules for AR/VR applied, such as location " "tracking." @@ -10384,7 +10363,6 @@ msgstr "" "identifiant inférieur est éteint." #: doc/classes/ARVRController.xml -#, fuzzy msgid "" "The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " "[code]1.0[/code]. If changed, updates [member ARVRPositionalTracker.rumble] " @@ -10393,8 +10371,8 @@ msgid "" "for a limited duration." msgstr "" "L'intensité de vibration du contrôleur. L'intervalle va de [code]0.0[/code] " -"à [code]1.0[/code] avec une précision de [code]0.01[/code]. Si changé, met à " -"jour [membrez ARVRPositionalTracker.rumble] en conséquence.\n" +"à [code]1.0[/code]. Si changé, [member ARVRPositionalTracker.rumble] sera " +"mis à jour en conséquence.\n" "C'est une propriété utile à animer si vous souhaitez que le contrôleur vibre " "pendant une durée limitée." @@ -10564,6 +10542,7 @@ msgstr "Cette interface est compatible avec le rendu stéréoscopique." #: doc/classes/ARVRInterface.xml msgid "This interface supports AR (video background and real world tracking)." msgstr "" +"Cette interface supporte la AR (arrière-plan vidéo et suivi du monde réel)." #: doc/classes/ARVRInterface.xml msgid "" @@ -10640,9 +10619,8 @@ msgstr "" "lumières sont éteintes, etc.)." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml -#, fuzzy msgid "GDNative wrapper for an ARVR interface." -msgstr "Classe de base pour une implémentation d’interface AR / VR." +msgstr "L'encapsulation GDNative pour les interfaces ARVR." #: modules/gdnative/doc_classes/ARVRInterfaceGDNative.xml msgid "" @@ -11074,7 +11052,6 @@ msgstr "" "position du joueur." #: doc/classes/AspectRatioContainer.xml -#, fuzzy msgid "Container that preserves its child controls' aspect ratio." msgstr "Un conteneur qui préserve le ratio d'aspect des contrôles enfants." @@ -11097,19 +11074,16 @@ msgstr "" #: doc/classes/PanelContainer.xml doc/classes/ScrollContainer.xml #: doc/classes/SplitContainer.xml doc/classes/TabContainer.xml #: doc/classes/VBoxContainer.xml doc/classes/VSplitContainer.xml -#, fuzzy msgid "GUI containers" -msgstr "Conteneur à onglets." +msgstr "Conteneurs d'interface" #: doc/classes/AspectRatioContainer.xml -#, fuzzy msgid "Specifies the horizontal relative position of child controls." -msgstr "La séparation horizontale des nÅ“uds enfants." +msgstr "Définit la position horizontale relative des nÅ“uds enfants." #: doc/classes/AspectRatioContainer.xml -#, fuzzy msgid "Specifies the vertical relative position of child controls." -msgstr "La séparation verticale des nÅ“uds enfants." +msgstr "Définit la position verticale relative des nÅ“uds enfants." #: doc/classes/AspectRatioContainer.xml msgid "" @@ -11160,19 +11134,17 @@ msgstr "" "de limiter la visibilité à seulement la taille du conteneur." #: doc/classes/AspectRatioContainer.xml -#, fuzzy msgid "" "Aligns child controls with the beginning (left or top) of the container." -msgstr "Aligne les enfants avec le début du conteneur." +msgstr "Aligne les enfants au début (à gauche ou en haut) du conteneur." #: doc/classes/AspectRatioContainer.xml msgid "Aligns child controls with the center of the container." msgstr "Aligne les contrôles enfants au centre du conteneur." #: doc/classes/AspectRatioContainer.xml -#, fuzzy msgid "Aligns child controls with the end (right or bottom) of the container." -msgstr "Aligne les enfants avec le centre du conteneur." +msgstr "Aligne les enfants à la fin (à droite ou en-bas) du conteneur." #: doc/classes/AStar.xml msgid "" @@ -11657,14 +11629,13 @@ msgstr "" "position et sont facteur de poids seront mis à jour avec la valeur donnée." #: doc/classes/AStar2D.xml -#, fuzzy msgid "" "Returns whether there is a connection/segment between the given points. If " "[code]bidirectional[/code] is [code]false[/code], returns whether movement " "from [code]id[/code] to [code]to_id[/code] is possible through this segment." msgstr "" "Retourne si les deux points donnés sont directement reliés par un segment. " -"Si [code]bidirectionnel[/code] est [code]false[/code], retourne si le " +"Si [code]bidirectional[/code] est [code]false[/code], retourne si le " "mouvement d'identifiant [code]id[/code] vers l'autre identifiant " "[code]to_id[/code] est possible par ce segment." @@ -11852,11 +11823,10 @@ msgstr "" "sont ignorés pour les AtlasTexture." #: doc/classes/AtlasTexture.xml -#, fuzzy msgid "The texture that contains the atlas. Can be any [Texture] subtype." msgstr "" -"La texture qui contient l'atlas. Peut être de n'importe quel sous-type " -"[Texture2D]." +"La texture qui contient l'atlas. Peut être de n'importe quel sous-type de " +"[Texture]." #: doc/classes/AtlasTexture.xml msgid "" @@ -11991,9 +11961,8 @@ msgstr "" "pas assez de données disponibles." #: doc/classes/AudioEffectCapture.xml -#, fuzzy msgid "Returns the total size of the internal ring buffer in frames." -msgstr "Renvoie le reste de deux vecteurs." +msgstr "" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -12004,15 +11973,13 @@ msgstr "" "mémoire est pleine." #: doc/classes/AudioEffectCapture.xml -#, fuzzy msgid "" "Returns the number of frames available to read using [method get_buffer]." -msgstr "Retourne le nombre de formes assignées à une zone." +msgstr "" #: doc/classes/AudioEffectCapture.xml -#, fuzzy msgid "Returns the number of audio frames inserted from the audio bus." -msgstr "Renvoie le nombre de points sur l'axe de mélange." +msgstr "" #: doc/classes/AudioEffectCapture.xml msgid "" @@ -13013,7 +12980,6 @@ msgid "Returns the names of all audio devices detected on the system." msgstr "Retourne les noms de tous les appareils audio détectés sur le système." #: doc/classes/AudioServer.xml -#, fuzzy msgid "Returns the sample rate at the output of the [AudioServer]." msgstr "Retourne le débit de sortie du [AudioServer]." @@ -13298,14 +13264,11 @@ msgstr "" "pour lire l'audio généré en temps réel." #: doc/classes/AudioStreamGeneratorPlayback.xml -#, fuzzy msgid "" "Returns [code]true[/code] if a buffer of the size [code]amount[/code] can be " "pushed to the audio sample data buffer without overflowing it, [code]false[/" "code] otherwise." msgstr "" -"Retourne [code]true[/code] si le paramètre spécifié par [code]name[/code] " -"existe, [code]false[/code] autrement." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "Clears the audio sample data buffer." @@ -13347,9 +13310,8 @@ msgstr "" "[i]moins[/i] efficace avec GDScript." #: modules/minimp3/doc_classes/AudioStreamMP3.xml -#, fuzzy msgid "MP3 audio stream driver." -msgstr "Pilote de flux audio OGG Vorbis." +msgstr "Le pilote de flux audio MP3." #: modules/minimp3/doc_classes/AudioStreamMP3.xml #: modules/stb_vorbis/doc_classes/AudioStreamOGGVorbis.xml @@ -14149,9 +14111,8 @@ msgstr "" "[constant ENVIRONMENT_MODE_CUSTOM_SKY]." #: doc/classes/BakedLightmap.xml -#, fuzzy msgid "The rotation of the baked custom sky." -msgstr "La racine de la scène éditée." +msgstr "" #: doc/classes/BakedLightmap.xml msgid "" @@ -14260,9 +14221,8 @@ msgid "Currently unused." msgstr "Actuellement inutilisé." #: doc/classes/BakedLightmap.xml -#, fuzzy msgid "Returns when the baker cannot save per-mesh textures to file." -msgstr "Renvoie l'arc tangente des paramètres." +msgstr "" #: doc/classes/BakedLightmap.xml msgid "The size of the generated lightmaps is too large." @@ -14363,7 +14323,6 @@ msgstr "" "défini par l'enumération [enum DrawMode]." #: doc/classes/BaseButton.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the mouse has entered the button and has not " "left it yet." @@ -15497,14 +15456,12 @@ msgid "Returns the current pressed button." msgstr "Renvoie le bouton actuellement enfoncé." #: doc/classes/ButtonGroup.xml -#, fuzzy msgid "Emitted when one of the buttons of the group is pressed." -msgstr "Émis lorsqu’un bouton de ce contrôleur est appuyé." +msgstr "Émis lorsqu’un des boutons de ce groupe est appuyé." #: doc/classes/CallbackTweener.xml -#, fuzzy msgid "Calls the specified method after optional delay." -msgstr "Verrouille l'axe linéaire et de rotation spécifié." +msgstr "Appelle la méthode spécifiée après un délai optionnel." #: doc/classes/CallbackTweener.xml msgid "" @@ -16088,7 +16045,7 @@ msgid "" "Left margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"La marge gauche nécessaire pour pour glisser la caméra. Une valeur de " +"La marge gauche nécessaire pour glisser la caméra. Une valeur de " "[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " "l'écran." @@ -16097,7 +16054,7 @@ msgid "" "Right margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"La marge droite nécessaire pour pour glisser la caméra. Une valeur de " +"La marge droite nécessaire pour glisser la caméra. Une valeur de " "[code]1[/code] ne déplace la caméra que lorsqu'elle atteint le bord de " "l'écran." @@ -16106,7 +16063,7 @@ msgid "" "Top margin needed to drag the camera. A value of [code]1[/code] makes the " "camera move only when reaching the edge of the screen." msgstr "" -"La marge supérieure nécessaire pour pour glisser la caméra. Une valeur de " +"La marge supérieure nécessaire pour glisser la caméra. Une valeur de " "[code]1[/code] ne déplacer la caméra que lorsqu'elle atteint le bord de " "l'écran." @@ -16222,9 +16179,8 @@ msgstr "" "La méthode de mise à jour de la camera. Voir [enum Camera2DProcessMode]." #: doc/classes/Camera2D.xml -#, fuzzy msgid "If [code]true[/code], the camera view rotates with the target." -msgstr "Si [code]true[/code], le bouton \"add preset\" est activé." +msgstr "" #: doc/classes/Camera2D.xml msgid "" @@ -16312,9 +16268,8 @@ msgid "Returns the unique ID for this feed." msgstr "Retourne l'identifiant unique de ce flux." #: doc/classes/CameraFeed.xml -#, fuzzy msgid "Returns the camera's name." -msgstr "Renvoie le nom de l'élément." +msgstr "Retourne le nom de la caméra." #: doc/classes/CameraFeed.xml msgid "Returns the position of camera on the device." @@ -16384,20 +16339,18 @@ msgstr "" "iOS. Sur les autres plates-formes, aucun [CameraFeed] ne sera disponible." #: doc/classes/CameraServer.xml -#, fuzzy msgid "Adds the camera [code]feed[/code] to the camera server." -msgstr "Ajoute un [Shape2D] au propriétaire de la forme." +msgstr "" #: doc/classes/CameraServer.xml msgid "Returns an array of [CameraFeed]s." msgstr "Retourne un tableau de [CameraFeed]s." #: doc/classes/CameraServer.xml -#, fuzzy msgid "" "Returns the [CameraFeed] corresponding to the camera with the given " "[code]index[/code]." -msgstr "Retourne la position du point à l'index [code]point[/code]." +msgstr "" #: doc/classes/CameraServer.xml msgid "Returns the number of [CameraFeed]s registered." @@ -16408,14 +16361,12 @@ msgid "Removes the specified camera [code]feed[/code]." msgstr "Supprime le flux de caméra [code]feed[/code] spécifié." #: doc/classes/CameraServer.xml -#, fuzzy msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." -msgstr "Émis lorsqu'une interface est supprimée." +msgstr "" #: doc/classes/CameraServer.xml -#, fuzzy msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." -msgstr "Émis lorsqu'une interface est supprimée." +msgstr "" #: doc/classes/CameraServer.xml msgid "The RGBA camera image." @@ -17451,9 +17402,8 @@ msgstr "" "[CanvasLayer] n'est pas propagée aux calques enfants." #: doc/classes/CanvasLayer.xml -#, fuzzy msgid "Emitted when visibility of the layer is changed. See [member visible]." -msgstr "Émis lorsque le VisibilityNotifier3D quitte la vue d'un [Camera3D]." +msgstr "" #: doc/classes/CanvasModulate.xml msgid "Tint the entire canvas." @@ -17548,13 +17498,12 @@ msgstr "" "contrôler le rendu de caractères individuels dans un [RichTextEffect]." #: doc/classes/CharFXTransform.xml -#, fuzzy msgid "" "The index of the current character (starting from 0) for the " "[RichTextLabel]'s BBCode text. Setting this property won't affect drawing." msgstr "" -"L'index du caractère actuel (commence à 0). Régler cette propriété n'affecte " -"pas l'affichage." +"L'index du caractère actuel (commence à 0) pour le texte BBCode du " +"[RichTextLabel]. Régler cette propriété n'affecte pas l'affichage." #: doc/classes/CharFXTransform.xml msgid "" @@ -17633,13 +17582,12 @@ msgstr "" "pixels)." #: doc/classes/CharFXTransform.xml -#, fuzzy msgid "" "The index of the current character (starting from 0) for this " "[RichTextEffect] custom block. Setting this property won't affect drawing." msgstr "" -"L'index du caractère actuel (commence à 0). Régler cette propriété n'affecte " -"pas l'affichage." +"L'index du caractère actuel (commence à 0) pour le bloc personnalisé du " +"[RichTextEffect]. Régler cette propriété n'affecte pas l'affichage." #: doc/classes/CharFXTransform.xml msgid "" @@ -17757,10 +17705,9 @@ msgid "The check icon to display when the [CheckBox] is unchecked." msgstr "L'icône de la coche à afficher quand la [CheckBox] est décochée." #: doc/classes/CheckBox.xml -#, fuzzy msgid "" "The check icon to display when the [CheckBox] is unchecked and disabled." -msgstr "Icône à afficher lorsque le [CheckButton] est coché et désactivé." +msgstr "L'icône à afficher lorsque le [CheckBox] est décoché et désactivé." #: doc/classes/CheckBox.xml msgid "" @@ -17977,10 +17924,9 @@ msgstr "" "code] de la [code]class[/code] ou de ses parents." #: doc/classes/ClassDB.xml -#, fuzzy msgid "" "Returns an array with all the enums of [code]class[/code] or its ancestry." -msgstr "Retourne si la [code]class[/code] spécifiée est disponible ou non." +msgstr "" #: doc/classes/ClassDB.xml msgid "" @@ -18252,7 +18198,7 @@ msgid "" msgstr "" "CollisionObject est la classe de base pour les objets physiques. Il peut " "contenir n'importe quel nombre de formes [Shape] de collision. Chaque forme " -"doit être assignée à un [i]propriétaire de forme[ /i]. Le CollisionObject " +"doit être assignée à un [i]propriétaire de forme[/i]. Le CollisionObject " "peut avoir n'importe quel nombre de propriétaires de forme. Les " "propriétaires de forme ne sont pas des nÅ“uds et ne apparaissent pas dans " "l'éditeur, mais sont accessibles par le code en utilisant les méthodes " @@ -18361,20 +18307,18 @@ msgid "Returns the parent object of the given shape owner." msgstr "Retourne l'objet parent du propriétaire de la forme spécifié." #: doc/classes/CollisionObject.xml -#, fuzzy msgid "Returns the [Shape] with the given id from the given shape owner." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "Returns the number of shapes the given shape owner contains." msgstr "Retourne le nombre de formes que le propriétaire de forme contient." #: doc/classes/CollisionObject.xml -#, fuzzy msgid "" "Returns the child index of the [Shape] with the given id from the given " "shape owner." -msgstr "Retourne la liste de tous les nÅ“uds du shader avec le type spécifié." +msgstr "" #: doc/classes/CollisionObject.xml msgid "Returns the shape owner's [Transform]." @@ -18839,11 +18783,12 @@ msgid "2D Kinematic Character Demo" msgstr "Démo de caractère cinétique 2D" #: doc/classes/CollisionShape2D.xml -#, fuzzy msgid "" "A disabled collision shape has no effect in the world. This property should " "be changed with [method Object.set_deferred]." -msgstr "Une forme de collision désactivée n’a aucun effet dans le monde." +msgstr "" +"Une forme de collision désactivée n’a aucun effet dans le monde. Cette " +"propriété devrait être modifiée avec [method Object.set_deferred]." #: doc/classes/CollisionShape2D.xml msgid "" @@ -19976,9 +19921,8 @@ msgstr "" "performance)." #: doc/classes/ColorPicker.xml -#, fuzzy msgid "If [code]true[/code], shows an alpha channel slider (opacity)." -msgstr "Si [code]true[/code], le GraphNode est sélectionné." +msgstr "" #: doc/classes/ColorPicker.xml msgid "" @@ -21003,15 +20947,12 @@ msgstr "" "[/codeblock]" #: doc/classes/Control.xml -#, fuzzy msgid "" "Creates a local override for a theme constant with the specified [code]name[/" "code]. Local overrides always take precedence when fetching theme items for " "the control.\n" "See also [method get_constant], [method remove_constant_override]." msgstr "" -"Retourne [code]true[/code] si le paramètre spécifié par [code]name[/code] " -"existe, [code]false[/code] autrement." #: doc/classes/Control.xml msgid "" @@ -21393,9 +21334,8 @@ msgstr "" "Retourne la taille minimale de ce contrôle. Voir [member rect_min_size]." #: doc/classes/Control.xml -#, fuzzy msgid "Returns the width/height occupied in the parent control." -msgstr "Renvoie la largeur / hauteur occupée dans le contrôle du parent." +msgstr "Retourne la largeur / hauteur occupée dans le contrôle du parent." #: doc/classes/Control.xml msgid "Returns the parent control node." @@ -21500,7 +21440,7 @@ msgid "" "See [method get_color] for details." msgstr "" "Retourne [code]true[/code] s'il y a un [Theme] correspondant dans " -"l'arborescence qui a une propriété de constante nommée [/code]name[/code] et " +"l'arborescence qui a une propriété de constante nommée [code]name[/code] et " "du type de thème [code]theme_type[/code].\n" "Voir [method get_color] pour plus de détails." @@ -21644,37 +21584,31 @@ msgstr "" "clavier." #: doc/classes/Control.xml -#, fuzzy msgid "" "Removes a theme override for a [Color] with the given [code]name[/code]." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Removes a theme override for a constant with the given [code]name[/code]." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "Removes a theme override for a [Font] with the given [code]name[/code]." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "Removes a theme override for an icon with the given [code]name[/code]." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "Removes a theme override for a shader with the given [code]name[/code]." -msgstr "Retourne la position du point à l'index [code]point[/code]." +msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Removes a theme override for a [StyleBox] with the given [code]name[/code]." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/Control.xml msgid "" @@ -22627,20 +22561,20 @@ msgstr "" "Affiche le curseur en croix du système quand l'utilisateur survole ce nÅ“ud." #: doc/classes/Control.xml -#, fuzzy msgid "" "Show the system's wait mouse cursor when the user hovers the node. Often an " "hourglass." msgstr "" -"Affiche le curseur en croix du système quand l'utilisateur survole ce nÅ“ud." +"Affiche le curseur d'attente du système quand l'utilisateur survole ce nÅ“ud. " +"Souvent un sablier." #: doc/classes/Control.xml -#, fuzzy msgid "" "Show the system's busy mouse cursor when the user hovers the node. Often an " "arrow with a small hourglass." msgstr "" -"Affiche le curseur en croix du système quand l'utilisateur survole ce nÅ“ud." +"Affiche le curseur d'occupation du système quand l'utilisateur survole ce " +"nÅ“ud. Souvent une flèche avec un petit sablier." #: doc/classes/Control.xml msgid "" @@ -23056,10 +22990,10 @@ msgid "" "variables, like [member anchor_left]. To change all 4 anchors at once, use " "[method set_anchors_preset]." msgstr "" -"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage [code]Rect[/" -"code], en haut à gauche. Utilisez-le avec l'une des variables membres " -"[code]anchor_[* /code], comme [member anchor_left]. Pour modifier les 4 " -"ancres à la fois, utilisez [method set_anchors_preset]." +"Magnétise l'un des 4 côtés d'ancrage à l'origine de l'ancrage " +"[code]Rect[/code], en haut à gauche. Utilisez-le avec l'une des variables " +"membres [code]anchor_*[/code], comme [member anchor_left]. Pour modifier les " +"4 ancres à la fois, utilisez [method set_anchors_preset]." #: doc/classes/Control.xml msgid "" @@ -23070,18 +23004,19 @@ msgid "" msgstr "" "Magnétise l'un des 4 côtés d'ancrage à l'extrémité de l'extrémité " "[code]Rect[/code], en bas à droite. Utilisez-le avec l'une des variables " -"membres [code]anchor_[* /code], comme [member anchor_left]. Pour modifier " -"les 4 ancres à la fois, utilisez [method set_anchors_preset]." +"membres [code]anchor_*[/code], comme [member anchor_left]. Pour modifier les " +"4 ancres à la fois, utilisez [method set_anchors_preset]." #: doc/classes/ConvexPolygonShape.xml msgid "Convex polygon shape for 3D physics." msgstr "Forme de polygone convexe pour la physique 3D." #: doc/classes/ConvexPolygonShape.xml -#, fuzzy msgid "" "Convex polygon shape resource, which can be added to a [PhysicsBody] or area." -msgstr "Ressource de forme de polygone concave 2D pour la physique." +msgstr "" +"Un ressource de forme de polygone convexe, qui peut être ajoutée à un " +"[PhysicsBody] ou une aire." #: doc/classes/ConvexPolygonShape.xml msgid "The list of 3D points forming the convex polygon shape." @@ -24348,7 +24283,6 @@ msgid "" msgstr "" #: modules/csg/doc_classes/CSGCylinder.xml -#, fuzzy msgid "" "If [code]true[/code] a cone is created, the [member radius] will only apply " "to one side." @@ -24551,9 +24485,8 @@ msgstr "" "aucun maillage ne sera généré." #: modules/csg/doc_classes/CSGPolygon.xml -#, fuzzy msgid "If [code]true[/code], applies smooth shading to the extrusions." -msgstr "Si [code]true[/code], l’audio est stéréo." +msgstr "" #: modules/csg/doc_classes/CSGPolygon.xml msgid "" @@ -24785,7 +24718,6 @@ msgid "Only intersecting geometry remains, the rest is removed." msgstr "Il ne reste que la géométrie d'intersection, le reste est supprimé." #: modules/csg/doc_classes/CSGShape.xml -#, fuzzy msgid "" "The second shape is subtracted from the first, leaving a dent with its shape." msgstr "" @@ -24874,13 +24806,12 @@ msgstr "" "le tore aura un aspect de rendu plat." #: modules/mono/doc_classes/CSharpScript.xml -#, fuzzy msgid "" "A script implemented in the C# programming language (Mono-enabled builds " "only)." msgstr "" -"Un script implémenté dans le langage de programmation C# (uniquement des " -"compilations Mono-activé)." +"Un script implémenté en langage C# (uniquement pour les versions où Mono est " +"activé)." #: modules/mono/doc_classes/CSharpScript.xml msgid "" @@ -24909,9 +24840,8 @@ msgid "" msgstr "" #: doc/classes/CubeMap.xml -#, fuzzy msgid "Returns the [CubeMap]'s height." -msgstr "Retourne la hauteur de texture." +msgstr "Retourne la hauteur du [CubeMap]." #: doc/classes/CubeMap.xml msgid "" @@ -24922,9 +24852,8 @@ msgstr "" "constantes [enum Side]." #: doc/classes/CubeMap.xml -#, fuzzy msgid "Returns the [CubeMap]'s width." -msgstr "Renvoie la largeur de texture." +msgstr "Renvoie la largeur du [CubeMap]." #: doc/classes/CubeMap.xml msgid "" @@ -24951,9 +24880,8 @@ msgstr "" "défini à [constant STORAGE_COMPRESS_LOSSY]." #: doc/classes/CubeMap.xml -#, fuzzy msgid "The [CubeMap]'s storage mode. See [enum Storage] constants." -msgstr "Convertit le format de l’image. Voir les constantes [enum Format]." +msgstr "" #: doc/classes/CubeMap.xml msgid "Store the [CubeMap] without any compression." @@ -25370,13 +25298,13 @@ msgid "" "list." msgstr "" "Ajoute un point à une courbe à la [code]position[/code] par rapport à la " -"position de la [Curve2D], avec des points de contrôle d'entrée [code]in[/" -"code] et de sortie [code]out[/code].\n" +"position de la [Curve2D], avec des points de contrôle d'entrée " +"[code]in[/code] et de sortie [code]out[/code].\n" "Si [code]at_position[/code] est spécifié, le point est inséré juste avant ce " "numéro de point [code]at_position[/code], en déplaçant ce point (et tous les " -"autres points qui suivent) après le point inséré. Si [code]at_position[/" -"code] n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/" -"code] ou [code]at_position >= [method get_point_count][/code,) le point sera " +"autres points qui suivent) après le point inséré. Si [code]at_position[/code]" +" n'est pas donné, ou est une valeur invalide ([code]at_position < 0[/code] " +"ou [code]at_position >= [method get_point_count][/code]), le point sera " "ajouté en dernier." #: doc/classes/Curve2D.xml doc/classes/Curve3D.xml @@ -25796,9 +25724,8 @@ msgstr "" "courbes et/ou de les enregistrer dans des fichiers d'image." #: doc/classes/CurveTexture.xml -#, fuzzy msgid "The [Curve] that is rendered onto the texture." -msgstr "La [code]curve[/code] rendue sur la texture." +msgstr "La [Curve] qui est rendue dans la texture." #: doc/classes/CurveTexture.xml msgid "" @@ -25878,9 +25805,8 @@ msgid "The cylinder's radius." msgstr "Le rayon du cylindre." #: doc/classes/DampedSpringJoint2D.xml -#, fuzzy msgid "Damped spring constraint for 2D physics." -msgstr "Contrainte de ressort amortie pour la physique 2D." +msgstr "Une contrainte de ressort avec amortissement pour la physique 2D." #: doc/classes/DampedSpringJoint2D.xml msgid "" @@ -26491,9 +26417,9 @@ msgid "" msgstr "" "Change le dossier actuellement ouvert par celui donné en argument. " "L'argument peut être relatif au répertoire actuel (par exemple " -"[code]nouveau_dossier[/code] ou [code]./dossier[ /code,)] ou être un chemin " +"[code]nouveau_dossier[/code] ou [code]./dossier[/code]), ou être un chemin " "absolu (par exemple [code]/tmp/dossier[/code] ou [code]res://parent/" -"dossier[ /code)].\n" +"dossier[/code]).\n" "Retourne une des constantes de code [enum Error] (et [code]OK[/code] en cas " "de succès)." @@ -27116,9 +27042,8 @@ msgid "Disables font hinting (smoother but less crisp)." msgstr "" #: doc/classes/DynamicFontData.xml -#, fuzzy msgid "Use the light font hinting mode." -msgstr "Utilisez le mode d’allusion de police de lumière." +msgstr "Utilise le mode d'indice de police légère." #: doc/classes/DynamicFontData.xml msgid "Use the default font hinting mode (crisper but less smooth)." @@ -27379,15 +27304,15 @@ msgstr "" "[method save_to_file]." #: doc/classes/EditorFeatureProfile.xml -#, fuzzy msgid "" "Saves the editor feature profile to a file in JSON format. It can then be " "imported using the feature profile manager's [b]Import[/b] button or the " "[method load_from_file] method." msgstr "" "Enregistre le profil de fonctionnalité de l'éditeur dans un fichier au " -"format JSON. Il peut ensuite être importé en utilisant le bouton [b]Import[/" -"b] ou la méthode [method load_from_file]." +"format JSON. Il peut ensuite être importé en utilisant le bouton " +"[b]Importer[/b] du gestionnaire de profils ou via la méthode [method " +"load_from_file]." #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -27546,7 +27471,7 @@ msgid "" "code], [code]user://[/code], and the local file system." msgstr "" "L'emplacement à partir duquel l'utilisateur peut sélectionner un fichier, y " -"compris [code]res://[/code], [code]user://[code], et le système de fichiers " +"compris [code]res://[/code], [code]user://[/code], et le système de fichiers " "local." #: doc/classes/EditorFileDialog.xml @@ -27686,7 +27611,7 @@ msgstr "" "fichiers, leurs types, etc.\n" "[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " "Accédez plutôt à l'instance unique avec [method EditorInterface." -"get_resource_filesystem]" +"get_resource_filesystem]." #: doc/classes/EditorFileSystem.xml msgid "" @@ -27716,7 +27641,6 @@ msgstr "" "en train d'être scanné." #: doc/classes/EditorFileSystem.xml -#, fuzzy msgid "Returns [code]true[/code] if the filesystem is being scanned." msgstr "Retourne [code]true[/code] si le système de fichier a été scanné." @@ -27927,8 +27851,8 @@ msgid "" msgstr "" "Les [EditorImportPlugin] fournissent un moyen d'étendre la fonctionnalité " "d'importation des ressources dans l'éditeur. Utilisez-les pour importer des " -"ressources depuis des formats de de fichier personnalisés ou pour proposer " -"une alternative aux importateurs existants de l'éditeur.\n" +"ressources depuis des formats de fichier personnalisés ou pour proposer une " +"alternative aux importateurs existants de l'éditeur.\n" "Les EditorImportPlugins fonctionnent pas associés certaines extensions de " "fichiers avec un type de ressource. Voir [method get_recognized_extensions] " "et [method get_resource_type]. Ils peuvent aussi spécifier des préréglages " @@ -28122,10 +28046,8 @@ msgstr "" "surcharge de cette méthode." #: doc/classes/EditorInspector.xml -#, fuzzy msgid "A control used to edit properties of an object." -msgstr "" -"Contrôle personnalisé pour modifier les propriétés à ajouter à l’inspecteur." +msgstr "Un contrôle pour modifier les propriétés d'un objet." #: doc/classes/EditorInspector.xml msgid "" @@ -28520,22 +28442,16 @@ msgstr "" "[code]object[/code]." #: doc/classes/EditorInterface.xml -#, fuzzy msgid "" "Returns [code]true[/code] if a scene is currently being played, [code]false[/" "code] otherwise. Paused scenes are considered as being played." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères commence par la chaîne " -"de caractères donnée, ou [code]false[/code] le cas échéant." #: doc/classes/EditorInterface.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the specified [code]plugin[/code] is enabled. " "The plugin name is the same as its directory name." msgstr "" -"Renvoie [code]true[/code] (vrai) si [code]s[/code] vaut zéro ou quasiment " -"zéro." #: doc/classes/EditorInterface.xml msgid "" @@ -29315,29 +29231,25 @@ msgid "Removes a custom type added by [method add_custom_type]." msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]." #: doc/classes/EditorPlugin.xml -#, fuzzy msgid "Removes an export plugin registered by [method add_export_plugin]." -msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]." +msgstr "" #: doc/classes/EditorPlugin.xml -#, fuzzy msgid "Removes an import plugin registered by [method add_import_plugin]." -msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]." +msgstr "" #: doc/classes/EditorPlugin.xml msgid "Removes an inspector plugin registered by [method add_import_plugin]" msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]" #: doc/classes/EditorPlugin.xml -#, fuzzy msgid "" "Removes a scene importer registered by [method add_scene_import_plugin]." -msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]." +msgstr "" #: doc/classes/EditorPlugin.xml -#, fuzzy msgid "Removes a gizmo plugin registered by [method add_spatial_gizmo_plugin]." -msgstr "Supprime un type personnalisé ajouté par [method add_custom_type]." +msgstr "" #: doc/classes/EditorPlugin.xml msgid "Removes a menu [code]name[/code] from [b]Project > Tools[/b]." @@ -29528,7 +29440,7 @@ msgid "" "must be previously added using [method Node.add_child]." msgstr "" "Place le contrôle [code]editor[/code] sous le label de la propriété. Le " -"contrôle doit d'abord être ajouté avec [method Node.add_child]" +"contrôle doit d'abord être ajouté avec [method Node.add_child]." #: doc/classes/EditorProperty.xml msgid "When this virtual function is called, you must update your editor." @@ -29588,9 +29500,9 @@ msgid "" "Emit it if you want multiple properties modified at the same time. Do not " "use if added via [method EditorInspectorPlugin.parse_property]." msgstr "" -"Emettez-le si vous voulez plusieurs propriétés modifiées en même temps. Ne " +"Émettez-le si vous voulez plusieurs propriétés modifiées en même temps. Ne " "pas utiliser s'il a été ajouté avec [method EditorInspectorPlugin." -"parse_property]" +"parse_property]." #: doc/classes/EditorProperty.xml msgid "Used by sub-inspectors. Emit it if what was selected was an Object ID." @@ -29739,9 +29651,8 @@ msgstr "" "set_toggle_pressed] pour définir manuellement cet état." #: doc/classes/EditorResourcePicker.xml -#, fuzzy msgid "Emitted when the value of the edited resource was changed." -msgstr "Émis à chaque fois que la ressource change." +msgstr "Émis quand le valeur d'une ressource modifiée a été changée." #: doc/classes/EditorResourcePicker.xml msgid "" @@ -29767,7 +29678,7 @@ msgstr "" "fichiers.\n" "[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " "Accédez plutôt à l'instance unique en utilisant [method EditorInterface." -"get_resource_previewer]" +"get_resource_previewer]." #: doc/classes/EditorResourcePreview.xml msgid "Create an own, custom preview generator." @@ -30174,7 +30085,7 @@ msgstr "" "Cet objet gère la sélection dans le SceneTree dans l'éditeur.\n" "[b]Note :[/b] Cette classe ne devrait pas être instanciée directement. " "Accédez plutôt à l'instance unique en utilisant [method EditorInterface." -"get_selection]" +"get_selection]." #: doc/classes/EditorSelection.xml msgid "" @@ -30572,12 +30483,11 @@ msgid "" msgstr "" "Retourne le [EditorSpatialGizmoPlugin] qui possède ce manipulateur. Il est " "utile de récupérer les matériaux en utilisant [method " -"EditorSpatialGizmoPlugin.get_material]" +"EditorSpatialGizmoPlugin.get_material]." #: doc/classes/EditorSpatialGizmo.xml -#, fuzzy msgid "Returns the Spatial node associated with this gizmo." -msgstr "Retourne le chemin d’accès au nÅ“ud associé à l’os spécifié." +msgstr "" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -30778,9 +30688,8 @@ msgid "" msgstr "" #: doc/classes/EditorSpinSlider.xml -#, fuzzy msgid "If [code]true[/code], the slider is hidden." -msgstr "Si [code]true[/code], la flèche de réduction est masquée." +msgstr "Si [code]true[/code], le glisseur est masqué." #: doc/classes/EditorVCSInterface.xml msgid "" @@ -30809,10 +30718,8 @@ msgstr "" "hériter de [EditorVCSInterface] et surcharger ces fonctions virtuelles." #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "Checks out a [code]branch_name[/code] in the VCS." msgstr "" -"Supprime un [code]name[/code] de chargement automatique à partir de la liste." #: doc/classes/EditorVCSInterface.xml msgid "" @@ -30821,9 +30728,8 @@ msgid "" msgstr "" #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "Creates a new branch named [code]branch_name[/code] in the VCS." -msgstr "Crée une instance de [code]class[/code]." +msgstr "" #: doc/classes/EditorVCSInterface.xml msgid "" @@ -30854,9 +30760,8 @@ msgid "" msgstr "" #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "Gets the current branch name defined in the VCS." -msgstr "Définit le trame présentement visible de l'animation." +msgstr "" #: doc/classes/EditorVCSInterface.xml msgid "" @@ -30920,9 +30825,8 @@ msgid "" msgstr "" #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "Remove a branch from the local VCS." -msgstr "Supprime un nÅ“ud de la sélection." +msgstr "" #: doc/classes/EditorVCSInterface.xml msgid "Remove a remote from the local VCS." @@ -30944,9 +30848,8 @@ msgid "" msgstr "" #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "Stages the file present at [code]file_path[/code] to the staged area." -msgstr "Ajoute un [Shape2D] au propriétaire de la forme." +msgstr "" #: doc/classes/EditorVCSInterface.xml msgid "" @@ -31056,9 +30959,8 @@ msgid "A commit is encountered from the commit area." msgstr "" #: doc/classes/EditorVCSInterface.xml -#, fuzzy msgid "A file is encountered from the staged area." -msgstr "Statut : Déconnecté du serveur." +msgstr "" #: doc/classes/EditorVCSInterface.xml msgid "A file is encountered from the unstaged area." @@ -31578,14 +31480,12 @@ msgid "The [Sky] resource's rotation expressed as a [Basis]." msgstr "La rotation du [Sky] exprimée par un [Basis]." #: doc/classes/Environment.xml -#, fuzzy msgid "The [Sky] resource's rotation expressed as Euler angles in radians." -msgstr "La rotation de la texture en radians." +msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "The [Sky] resource's rotation expressed as Euler angles in degrees." -msgstr "La rotation de la texture en degrés." +msgstr "" #: doc/classes/Environment.xml msgid "The amount of far blur for the depth-of-field effect." @@ -31599,9 +31499,8 @@ msgstr "" "rendu." #: doc/classes/Environment.xml -#, fuzzy msgid "If [code]true[/code], enables the depth-of-field far blur effect." -msgstr "Si [code]true[/code], active le drapeau spécifié." +msgstr "Si [code]true[/code], active l'effet de flou de profondeur lointain." #: doc/classes/Environment.xml msgid "" @@ -31921,11 +31820,10 @@ msgid "" msgstr "" #: doc/classes/Environment.xml -#, fuzzy msgid "" "The secondary screen-space ambient occlusion intensity. See also [member " "ssao_radius2]." -msgstr "Le rayon d'occlusion ambiante de l'espace de l'écran primaire." +msgstr "" #: doc/classes/Environment.xml msgid "" @@ -33063,7 +32961,7 @@ msgstr "" #: doc/classes/FlowContainer.xml #, fuzzy msgid "Base class for flow containers." -msgstr "Classe de base pour les conteneurs de boîtes." +msgstr "La classe de base pour les conteneurs de flux." #: doc/classes/FlowContainer.xml msgid "" @@ -33074,7 +32972,6 @@ msgid "" msgstr "" #: doc/classes/FlowContainer.xml -#, fuzzy msgid "Returns the current line count." msgstr "Retourne le numéro de la ligne actuelle." @@ -33144,30 +33041,24 @@ msgid "" msgstr "" #: doc/classes/Font.xml -#, fuzzy msgid "Returns resource id of the cache texture containing the char." -msgstr "Retourne l'identifiant OpenGL de l'image de cette texture." +msgstr "" #: doc/classes/Font.xml -#, fuzzy msgid "Returns size of the cache texture containing the char." -msgstr "Retourne la position du contact sur le collisionneur." +msgstr "" #: doc/classes/Font.xml -#, fuzzy msgid "Returns char offset from the baseline." -msgstr "Retourne le décalage de la texture de la tuile." +msgstr "" #: doc/classes/Font.xml -#, fuzzy msgid "Returns size of the char." -msgstr "Renvoie le sinus du paramètre." +msgstr "Retourne la taille du caractère." #: doc/classes/Font.xml -#, fuzzy msgid "Returns rectangle in the cache texture containing the char." msgstr "" -"Retourne un rectangle englobant les tuiles utilisées (non vides) de la carte." #: doc/classes/Font.xml msgid "Returns the font descent (number of pixels below the baseline)." @@ -33203,9 +33094,8 @@ msgid "" msgstr "" #: doc/classes/Font.xml -#, fuzzy msgid "Contour point is on the curve." -msgstr "Supprime tous les points de la courbe." +msgstr "" #: doc/classes/Font.xml msgid "" @@ -34039,18 +33929,17 @@ msgstr "" "fin." #: doc/classes/Geometry.xml -#, fuzzy msgid "" "Given an array of [Vector2]s representing tiles, builds an atlas. The " "returned dictionary has two keys: [code]points[/code] is an array of " "[Vector2] that specifies the positions of each tile, [code]size[/code] " "contains the overall size of the whole atlas as [Vector2]." msgstr "" -"À partir d'un tableau de [Vector2] représentant des tuiles, construit un " +"À partir d'un tableau de [Vector2] représentant des tuiles, ça construit un " "atlas. Le dictionnaire retourné a deux clés : [code]points[/code] est un " "tableau de [Vector2] qui précise les positions de chaque tuile, et " -"[code]size[/code] contient la taille globale de l'atlas entier sous forme de " -"[Vector2]." +"[code]size[/code] contient la taille globale de l'atlas en entier sous forme " +"d'un [Vector2]." #: doc/classes/Geometry.xml msgid "" @@ -34095,19 +33984,20 @@ msgid "" msgstr "" "Gonfle ou dégonfle [code]polygon[/code] par la quantité [code]delta[/code] " "unités (pixels) dans toutes les directions. Si [code]delta[/code] est " -"positif, le polygone décale chaque sommet vers l'extérieur. Si [code]delta[/" -"code] est négatif, décale chaque sommet vers l'intérieur. Retourne une liste " -"des polygones parce que gonflage/dégonflage peut produire plusieurs " -"polygones distinctes. Retourne un tableau vide si [code]delta[/code] est " -"négatif et la valeur absolue de celui-ci dépasse approximativement les " -"dimensions du rectangle minimal englobant du polygone.\n" +"positif, le polygone décale chaque sommet vers l'extérieur. Si " +"[code]delta[/code] est négatif, décale chaque sommet vers l'intérieur. " +"Retourne une liste des polygones parce que gonflage/dégonflage peut produire " +"plusieurs polygones distinctes. Retourne un tableau vide si " +"[code]delta[/code] est négatif et la valeur absolue de celui-ci dépasse " +"approximativement les dimensions du rectangle minimal englobant du polygone." +"\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieure) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " -"distingués en appelant [méthode is_polygon_clockwise].\n" -"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode " -"[méthode Transform2D.xform]:\n" +"distingués en appelant [method is_polygon_clockwise].\n" +"[b]Note :[/b] Pour transformer les sommets en polygone, utilisez la méthode [" +"method Transform2D.xform]:\n" "[codeblock]\n" "var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " "100), Vector2(0, 100)])\n" @@ -34132,15 +34022,16 @@ msgid "" "(hole) produced which could be distinguished by calling [method " "is_polygon_clockwise]." msgstr "" -"par la quantité [code]delta[/code] unités (pixels) dans toutes les " -"directions. Si [code]delta[/code] est positif, le polygone décale chaque " -"sommet vers l'extérieur. Retourne une liste des polygones parce que gonflage/" -"dégonflage peut produire plusieurs polygones distinctes. Si [code]delta[/" -"code] est négatif, retourne un tableau vide.\n" +"Gonfle ou dégonfle [code]polyline[/code] par la quantité [code]delta[/code] " +"d'unités (pixels) dans toutes les directions. Si [code]delta[/code] est " +"positif, le polygone décale chaque sommet vers l'extérieur. Retourne une " +"liste des polygones parce que gonflage/dégonflage peut produire plusieurs " +"polygones distinctes. Si [code]delta[/code] est négatif, retourne un tableau " +"vide.\n" "Les sommets de chaque polygone sont arrondis suivant [code]join_type[/code], " "voir [enum PolyJoinType].\n" -"Chaque point d'extrémité du polygone sera arrondi suivant [code]end_type[/" -"code], voir [enum PolyEndType].\n" +"Chaque point d'extrémité du polygone sera arrondi suivant " +"[code]end_type[/code], voir [enum PolyEndType].\n" "L'opération peut fournir un polygone extérieur (la limite extérieur) et " "plusieurs polygones à intérieur (représentant les trous) qui pourraient être " "distingués en appelant [method is_polygon_clockwise]." @@ -34383,39 +34274,35 @@ msgid "" msgstr "" #: doc/classes/GeometryInstance.xml -#, fuzzy msgid "" "The GeometryInstance's max LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -"La distance min LOD de GeometryInstance3D.\n" +"La distance maximale pour ce LOD de la GeometryInstance.\n" "[b]Remarque :[/b] Cette propriété n’a actuellement aucun effet." #: doc/classes/GeometryInstance.xml -#, fuzzy msgid "" "The GeometryInstance's max LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -"La distance min LOD de GeometryInstance3D.\n" +"La marge maximale pour ce LOD de la GeometryInstance.\n" "[b]Remarque :[/b] Cette propriété n’a actuellement aucun effet." #: doc/classes/GeometryInstance.xml -#, fuzzy msgid "" "The GeometryInstance's min LOD distance.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -"La distance min LOD de GeometryInstance3D.\n" +"La distance minimale pour ce LOD de la GeometryInstance.\n" "[b]Remarque :[/b] Cette propriété n’a actuellement aucun effet." #: doc/classes/GeometryInstance.xml -#, fuzzy msgid "" "The GeometryInstance's min LOD margin.\n" "[b]Note:[/b] This property currently has no effect." msgstr "" -"La distance min LOD de GeometryInstance3D.\n" +"La marge minimale pour ce LOD de la GeometryInstance.\n" "[b]Remarque :[/b] Cette propriété n’a actuellement aucun effet." #: doc/classes/GeometryInstance.xml @@ -34952,13 +34839,10 @@ msgstr "" "[code]false[/code] sinon." #: modules/mono/doc_classes/GodotSharp.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the Mono runtime is shutting down, [code]false[/" "code] otherwise." msgstr "" -"Renvoie [code]true[/code] (vrai) si [code]s[/code] vaut zéro ou quasiment " -"zéro." #: modules/mono/doc_classes/GodotSharp.xml msgid "" @@ -35640,14 +35524,12 @@ msgid "Returns the type of the output connection [code]idx[/code]." msgstr "Retourne le type de connexion pour la sortie [code]idx[/code]." #: doc/classes/GraphNode.xml -#, fuzzy msgid "Returns the left (input) [Color] of the slot [code]idx[/code]." -msgstr "Retourne le type du nÅ“ud à [code]idx[/code]." +msgstr "" #: doc/classes/GraphNode.xml -#, fuzzy msgid "Returns the right (output) [Color] of the slot [code]idx[/code]." -msgstr "Retourne le type du nÅ“ud à [code]idx[/code]." +msgstr "" #: doc/classes/GraphNode.xml msgid "Returns the left (input) type of the slot [code]idx[/code]." @@ -35690,17 +35572,17 @@ msgid "" "methods. You must enable at least one side of the slot to do so." msgstr "" "Définit les propriétés de l'emplacement avec identifiant [code]idx[/code].\n" -"Si [code]enable_left[code]/[code]right[/code], un port apparaîtra et " +"Si [code]enable_left[/code]/[code]right[/code], un port apparaîtra et " "l'emplacement pourra être connectée de ce côté.\n" -"[code]type_left[code]/[code]right[/code] est un type arbitraire du port. " +"[code]type_left[/code]/[code]right[/code] est un type arbitraire du port. " "Seuls les ports avec le même type peuvent être connectés.\n" -"[code]color_left[code]/[code]right[/code] est la teinte de l'icône du port " +"[code]color_left[/code]/[code]right[/code] est la teinte de l'icône du port " "de ce côté.\n" -"[code]custom_left[code]/[code]right[/code] est une texture personnalisée " +"[code]custom_left[/code]/[code]right[/code] est une texture personnalisée " "pour le port de ce côté.\n" "[b]Note :[/b] Cette méthode ne définit que les propriétés de l'emplacement. " -"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au " -"GraphNode.\n" +"Pour créer l'emplacement, ajoutez un enfant dérivé de [Control] au GraphNode." +"\n" "Les propriétés individuelles peuvent être définies en utilisant l'une des " "méthodes [code]set_slot_*[/code]. Vous devez activer au moins un côté de " "l'emplacement pour le faire." @@ -36069,13 +35951,10 @@ msgstr "" "dans la grille." #: modules/gridmap/doc_classes/GridMap.xml -#, fuzzy msgid "" "Returns an array of all cells with the given item index specified in " "[code]item[/code]." msgstr "" -"Renvoie la texture de l’atlas de police de caractères à l’index [code]idx[/" -"code]." #: modules/gridmap/doc_classes/GridMap.xml msgid "" @@ -36112,13 +35991,10 @@ msgid "" msgstr "" #: modules/gridmap/doc_classes/GridMap.xml -#, fuzzy msgid "" "If [code]true[/code], this GridMap uses cell navmesh resources to create " "navigation regions." msgstr "" -"Si [code]true[/code], met à jour les animations en réponse aux notifications " -"liées au processus." #: modules/gridmap/doc_classes/GridMap.xml msgid "If [code]true[/code], grid items are centered on the X axis." @@ -36330,9 +36206,8 @@ msgid "The horizontal space between the [HBoxContainer]'s elements." msgstr "L'espace horizontal entre les éléments du [HBoxContainer]." #: doc/classes/HeightMapShape.xml -#, fuzzy msgid "Height map shape for 3D physics." -msgstr "Forme de polygone convexe pour la physique 3D." +msgstr "La forme de carte de hauteurs pour la physique 3D." #: doc/classes/HeightMapShape.xml msgid "" @@ -36605,14 +36480,13 @@ msgid "Displayed when the decrement button is being pressed." msgstr "Affiché quand le bouton de reduction est appuyé." #: doc/classes/HScrollBar.xml -#, fuzzy msgid "" "Icon used as a button to scroll the [ScrollBar] right. Supports custom step " "using the [member ScrollBar.custom_step] property." msgstr "" -"Icône utilisée comme bouton pour faire défiler la [ScrollBar] correctement. " -"Supporte l'étape personnalisée en utilisant la propriété [member ScrollBar." -"custom_step]." +"L'icône utilisée comme bouton pour faire défiler la [ScrollBar] vers la " +"droite. Supporte une étape personnalisée en utilisant la propriété [member " +"ScrollBar.custom_step]." #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml msgid "Displayed when the mouse cursor hovers over the increment button." @@ -36631,7 +36505,7 @@ msgstr "" #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml #, fuzzy msgid "Used when the mouse hovers over the grabber." -msgstr "Utilisé lorsque la souris survole le grappin." +msgstr "Utilisé lorsque la souris survole le glisseur." #: doc/classes/HScrollBar.xml doc/classes/VScrollBar.xml msgid "Used when the grabber is being dragged." @@ -37722,7 +37596,6 @@ msgid "A node with the ability to send HTTP(S) requests." msgstr "Un nÅ“ud qui permet d'envoyer des requêtes HTTP(S)." #: doc/classes/HTTPRequest.xml -#, fuzzy msgid "" "A node with the ability to send HTTP requests. Uses [HTTPClient] " "internally.\n" @@ -37802,28 +37675,28 @@ msgstr "" "des fichiers ou du contenu web via HTTP.\n" "[b]Avertissement :[/b] Voir les notes et avertissements du [HTTPClient] pour " "les limites, notamment concernant la sécurité SSL.\n" -"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/" -"b]\n" +"[b]Exemple pour contacter une API REST et afficher les champs retournés :[/b]" +"\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " -"complétion.\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." +"\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " "\"_http_request_completed\")\n" "\n" -" # Lancer une requête GET. L'URL en-dessous retourne un JSON au moment de " +" # Lancer une requête GET. L'URL en dessous retourne un JSON au moment de " "l'écriture de ce tutoriel.\n" " var error = http_request.request(\"https://httpbin.org/get\")\n" " if error != OK:\n" " push_error(\"Une erreur est survenue dans la requête HTTP.\")\n" "\n" -" # Lancer une requête POST. L'URL en-dessous retourne un JSON au moment " +" # Lancer une requête POST. L'URL en dessous retourne un JSON au moment " "de l'écriture de ce tutoriel.\n" " # Note : Don't make simultaneous requests using a single HTTPRequest " "node.\n" -" # Le code en-dessous est uniquement donné comme exemple.\n" +" # Le code en dessous est uniquement donné comme exemple.\n" " var body = {\"nom\": \"Godette\"}\n" " error = http_request.request(\"https://httpbin.org/post\", [], true, " "HTTPClient.METHOD_POST, body)\n" @@ -37843,14 +37716,14 @@ msgstr "" "HTTPRequest:[/b]\n" "[codeblock]\n" "func _ready():\n" -" # Créer un nÅ“ud de requête HTTP et le connecter au signal de " -"complétion.\n" +" # Créer un nÅ“ud de requête HTTP et le connecter au signal de complétion." +"\n" " var http_request = HTTPRequest.new()\n" " add_child(http_request)\n" " http_request.connect(\"request_completed\", self, " "\"_http_request_completed\")\n" "\n" -" # Lancer une requête HTTP. L'URL en-dessous retourne une image PNG au " +" # Lancer une requête HTTP. L'URL en dessous retourne une image PNG au " "moment de l'écriture de ce tutoriel.\n" " var error = http_request.request(\"https://via.placeholder.com/512\")\n" " if error != OK:\n" @@ -37957,11 +37830,12 @@ msgid "" msgstr "" #: doc/classes/HTTPRequest.xml -#, fuzzy msgid "" "Maximum number of allowed redirects. This is used to prevent endless " "redirect loops." -msgstr "Nombre maximal de redirections autorisées." +msgstr "" +"Le nombre maximal de redirections autorisées. C'est utilisé pour éviter les " +"redirections infinies." #: doc/classes/HTTPRequest.xml msgid "" @@ -38175,9 +38049,8 @@ msgid "Fills [code]rect[/code] with [code]color[/code]." msgstr "Remplis le [code]rect[/code] avec la [code]color[/code]." #: doc/classes/Image.xml -#, fuzzy msgid "Blends low-alpha pixels with nearby pixels." -msgstr "Mélange les pixels à faible alpha avec les pixels à proximité." +msgstr "Mélange les pixels à faible opacité avec ceux proches." #: doc/classes/Image.xml msgid "Flips the image horizontally." @@ -38959,9 +38832,8 @@ msgid "" msgstr "" #: doc/classes/ImageTexture.xml -#, fuzzy msgid "Returns the format of the texture, one of [enum Image.Format]." -msgstr "Renvoie l'inverse de la racine carrée du paramètre." +msgstr "" #: doc/classes/ImageTexture.xml msgid "" @@ -39206,11 +39078,10 @@ msgid "" msgstr "" #: doc/classes/Input.xml -#, fuzzy msgid "" "Returns the current value of the joypad axis at given index (see [enum " "JoystickList])." -msgstr "Retourne l'état actuel de ce canal, voir [enum ChannelState]." +msgstr "" #: doc/classes/Input.xml msgid "Returns the index of the provided axis name." @@ -39510,10 +39381,9 @@ msgid "" msgstr "" #: doc/classes/Input.xml -#, fuzzy msgid "Controls the mouse mode. See [enum MouseMode] for more information." msgstr "" -"Définit le mode de la souris. Voir les constantes pour plus d'informations." +"Définit le mode de la souris. Voir [enum MouseMode] pour plus d'informations." #: doc/classes/Input.xml msgid "" @@ -39830,9 +39700,8 @@ msgid "" msgstr "" #: doc/classes/InputEventAction.xml -#, fuzzy msgid "InputEvent: Actions" -msgstr "Type d’évènement d’entrée pour les actions." +msgstr "Évènements d’entrée : les actions" #: doc/classes/InputEventAction.xml msgid "The action's name. Actions are accessed via this [String]." @@ -40011,9 +39880,8 @@ msgid "Wikipedia General MIDI Instrument List" msgstr "" #: doc/classes/InputEventMIDI.xml -#, fuzzy msgid "Wikipedia Piano Key Frequencies List" -msgstr "https://en.wikipedia.org/wiki/Piano_key_frequencies#List" +msgstr "La liste des fréquences des touches de piano sur Wikipédia" #: doc/classes/InputEventMIDI.xml msgid "" @@ -40187,12 +40055,12 @@ msgid "Mouse and input coordinates" msgstr "Les coordonnées de la souris" #: doc/classes/InputEventMouseMotion.xml -#, fuzzy msgid "" "Returns [code]true[/code] when using the eraser end of a stylus pen.\n" "[b]Note:[/b] This property is implemented on Linux, macOS and Windows." msgstr "" -"Retourne le nombre de disposition de clavier.\n" +"Retourne [code]true[/code] lors de l'utilisation de la gomme (l'autre " +"extrémité) d'un stylet.\n" "[b]Note :[/b] Cette méthode est implémentée sous Linux, macOS et Windows." #: doc/classes/InputEventMouseMotion.xml @@ -40554,11 +40422,11 @@ msgstr "" "automatiquement." #: doc/classes/InterpolatedCamera.xml -#, fuzzy msgid "" "The camera's process callback. See [enum InterpolatedCameraProcessMode]." msgstr "" -"La méthode de mise à jour de la camera. Voir [enum Camera2DProcessMode]." +"La méthode de mise à jour de la camera. Voir [enum " +"InterpolatedCameraProcessMode]." #: doc/classes/InterpolatedCamera.xml msgid "" @@ -41824,14 +41692,14 @@ msgid "" msgstr "" #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml -#, fuzzy msgid "" "Returns the number of times the body collided and changed direction during " "the last call to [method move_and_slide] or [method " "move_and_slide_with_snap]." msgstr "" -"Renvoie le nombre de fois où le corps est entré en collision et a changé de " -"direction au cours du dernier appel vers [method move_and_slide]." +"Retourne le nombre de fois où le corps est entré en collision et a changé de " +"direction au cours du dernier appel vers [method move_and_slide] ou [method " +"move_and_slide_with_snap]." #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml msgid "" @@ -42433,9 +42301,8 @@ msgid "Background [StyleBox] for the [Label]." msgstr "Le [StyleBox] d'arrière-plan pour le [Label]." #: doc/classes/Label3D.xml -#, fuzzy msgid "Displays plain text in a 3D world." -msgstr "NÅ“ud de sprite en 2D dans un monde en 3D." +msgstr "Affiche du texte dans un monde en 3D." #: doc/classes/Label3D.xml msgid "" @@ -42450,62 +42317,50 @@ msgid "" msgstr "" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "If [code]true[/code], the specified flag will be enabled. See [enum Label3D." "DrawFlags] for a list of flags." msgstr "" -"Si [code]true[/code], active l'option donné. Voir [enum Flags] pour ces " -"options." +"Si [code]true[/code], active le drapeau spécifié. Voir [enum Label3D." +"DrawFlags] pour la liste des drapeaux." #: doc/classes/Label3D.xml -#, fuzzy msgid "" "The alpha cutting mode to use for the sprite. See [enum AlphaCutMode] for " "possible values." msgstr "" -"Le mode d'orientation de la TileMap. Voir [enum Mode] pour les valeurs " -"possibles." #: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml msgid "Threshold at which the alpha scissor will discard values." msgstr "Le seuil à partir duquel le ciseau alpha ignorera les valeurs." #: doc/classes/Label3D.xml -#, fuzzy msgid "If [code]true[/code], wraps the text to the [member width]." -msgstr "Si [code]true[/code], cache la ligne à l'index spécifié." +msgstr "" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "The billboard mode to use for the label. See [enum SpatialMaterial." "BillboardMode] for possible values." msgstr "" -"La direction de remplissage. Voir [enum FillMode] pour les valeurs possibles." #: doc/classes/Label3D.xml -#, fuzzy msgid "" "If [code]true[/code], text can be seen from the back as well, if " "[code]false[/code], it is invisible when looking at it from behind." msgstr "" -"Si [code]true[/code], la ligne sera verticale. Si [code]false[/code], elle " -"sera horizontale." #: doc/classes/Label3D.xml doc/classes/SpriteBase3D.xml -#, fuzzy msgid "" "If [code]true[/code], the label is rendered at the same size regardless of " "distance." msgstr "" -"Si [code]true[/code], l'objet est affiché à la même taille indépendamment de " -"sa distance à la caméra." +"Si [code]true[/code], le label est affiché à la même taille indépendamment " +"de sa distance à la caméra." #: doc/classes/Label3D.xml -#, fuzzy msgid "[Font] used for the [Label3D]'s text." -msgstr "[Font] utilisée pour le texte du [Label]." +msgstr "La [Font] utilisée pour le texte du [Label3D]." #: doc/classes/Label3D.xml msgid "" @@ -42516,14 +42371,13 @@ msgstr "" "droite. Réglez-le à l'une des constantes de [enum Align]." #: doc/classes/Label3D.xml -#, fuzzy msgid "Vertical space between lines in multiline [Label3D]." -msgstr "L'espace vertical entre les lignes en multiligne [Label]." +msgstr "" +"L'espacement vertical entre les lignes en mode multi-ligne d'un [Label3D]." #: doc/classes/Label3D.xml -#, fuzzy msgid "Text [Color] of the [Label3D]." -msgstr "La [Color] par défaut du texte du [Label]." +msgstr "La [Color] du texte du [Label3D]." #: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml #: doc/classes/SpriteBase3D.xml @@ -42535,17 +42389,14 @@ msgstr "" "sera dessiné suivant son ordre de rendu et non suivant sa distance." #: doc/classes/Label3D.xml -#, fuzzy msgid "The text drawing offset (in pixels)." -msgstr "Le décalage du dessin de la texture." +msgstr "" #: doc/classes/Label3D.xml -#, fuzzy msgid "The tint of [Font]'s outline." -msgstr "La hauteur du cylindre." +msgstr "Le teinte du contour de la [Font]." #: doc/classes/Label3D.xml -#, fuzzy msgid "" "Sets the render priority for the text outline. Higher priority objects will " "be sorted in front of lower priority objects.\n" @@ -42556,23 +42407,21 @@ msgid "" "This is because opaque objects are not sorted, while transparent objects are " "sorted from back to front (subject to priority)." msgstr "" -"Définit la priorité de rendu pour la bordure du texte. Des objets plus " -"prioritaires seront affichés par-dessus des objets moins inférieurs.\n" -"[b]Note: [/b] Cela ne s'applique que si [member alpha_cut] est défini à " -"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"Définit la priorité de rendu pour la bordure du texte. Les objets les plus " +"prioritaires seront affichés par-dessus des objets les moins prioritaires.\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" +"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " -"alors que les objets transparents sont triés de l'arrière à l'avant (et " +"alors que les objets transparents sont triés de l'arrière vers l'avant (et " "suivant leur priorité)." #: doc/classes/Label3D.xml -#, fuzzy msgid "The size of one pixel's width on the label to scale it in 3D." -msgstr "La taille d'un des pixels de la sprite pour définir sa taille en 3D." +msgstr "La taille d'un des pixels du label pour définir sa taille en 3D." #: doc/classes/Label3D.xml -#, fuzzy msgid "" "Sets the render priority for the text. Higher priority objects will be " "sorted in front of lower priority objects.\n" @@ -42583,22 +42432,21 @@ msgid "" "This is because opaque objects are not sorted, while transparent objects are " "sorted from back to front (subject to priority)." msgstr "" -"Définit la priorité de rendu pour le texte. Des objets plus prioritaires " -"seront affichés par-dessus des objets moins inférieurs.\n" -"[b]Note: [/b] Cela ne s'applique que si [member alpha_cut] est défini à " -"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"Définit la priorité de rendu pour le texte. Les objets les plus prioritaires " +"seront affichés par-dessus des objets les moins prioritaires.\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" +"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " -"alors que les objets transparents sont triés de l'arrière à l'avant (et " +"alors que les objets transparents sont triés de l'arrière vers l'avant (et " "suivant leur priorité)." #: doc/classes/Label3D.xml -#, fuzzy msgid "" "If [code]true[/code], the [Light] in the [Environment] has effects on the " "label." -msgstr "Si [code]true[/code], ce [HTTPClient] a une réponse disponible." +msgstr "" #: doc/classes/Label3D.xml msgid "" @@ -42615,18 +42463,16 @@ msgstr "" "l'alignement de remplissage." #: doc/classes/Label3D.xml -#, fuzzy msgid "If set, lights in the environment affect the label." -msgstr "Si [code]true[/code], ce [HTTPClient] a une réponse disponible." +msgstr "" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "If set, text can be seen from the back as well. If not, the text is " "invisible when looking at it from behind." msgstr "" -"Si défini, le texte sera aussi visible de derrière. Sinon, le texture n'est " -"invisible que de face." +"Si défini, le texte sera aussi visible de derrière. Sinon, la texture ne " +"sera visible que de face." #: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml #: doc/classes/SpriteBase3D.xml @@ -42738,9 +42584,8 @@ msgid "Returns the offset of the piece with the index [code]idx[/code]." msgstr "Retourne le décalage de la pièce à l'index [code]idx[/code]." #: doc/classes/LargeTexture.xml -#, fuzzy msgid "Returns the [Texture] of the piece with the index [code]idx[/code]." -msgstr "Retourne la position du point à l'index [code]point[/code]." +msgstr "" #: doc/classes/LargeTexture.xml msgid "" @@ -42751,12 +42596,10 @@ msgstr "" "code]." #: doc/classes/LargeTexture.xml -#, fuzzy msgid "" "Sets the [Texture] of the piece with index [code]idx[/code] to " "[code]texture[/code]." msgstr "" -"Déplace l’élément de l’index [code]from_idx[/code] à [code]to_idx[/code]." #: doc/classes/LargeTexture.xml msgid "Sets the size of this [LargeTexture]." @@ -42908,7 +42751,7 @@ msgstr "" "utile lorsque vous avez un maillage plat qui a une lumière derrière elle. Si " "vous avez besoin de lancer une ombre sur les deux côtés du maillage, " "définissez le maillage pour utiliser les deux faces avec [constant " -"GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED]" +"GeometryInstance.SHADOW_CASTING_SETTING_DOUBLE_SIDED]." #: doc/classes/Light.xml msgid "Constant for accessing [member light_energy]." @@ -43109,7 +42952,6 @@ msgstr "" "les Light2D." #: doc/classes/Light2D.xml -#, fuzzy msgid "Shadow buffer size." msgstr "Taille du tampon d'ombre." @@ -43275,7 +43117,7 @@ msgstr "" "polygone à la fois. Pour augmenter cette limite, ouvrez les paramètres du " "projet et augmentez [member ProjectSettings.rendering/limits/buffers/" "canvas_polygon_buffer_size_kb] et [member ProjectSettings.rendering/limits/" -"buffers/canvas_polygon_index_buffer_size_kb]" +"buffers/canvas_polygon_index_buffer_size_kb]." #: doc/classes/Line2D.xml msgid "" @@ -43335,6 +43177,19 @@ msgid "" "perform antialiasing. 2D batching is also still supported with those " "antialiased lines." msgstr "" +"Si [code]true[/code], la bordure de la ligne essayera d'activer " +"anticrénelage en dessinant de fines lignes en OpenGL sur les bords de la " +"ligne.\n" +"[b]Note :[/b] Line2D n'est pas accéléré par lots si [code]antialiased[/code] " +"est [code]true[/code].\n" +"[b]Note :[/b] En raison de son fonctionnement, l'anticrénelage calculé en " +"interne n'est pas correct pour les lignes semi-transparents voire peut ne " +"pas fonctionner sur certaines plateformes. Vous pouvez corriger ce problème " +"en installant le greffon [url=https://github.com/godot-extended-libraries/" +"godot-antialiased-line2d]Antialiased Line2D[/url] puis créez un nÅ“ud " +"\"AntialiasedPolygon2D\". Ce nÅ“ud utilise des texture avec des mipmaps " +"personnalisés pour afficher l'anticrénelage. L'accélération par lot est " +"toujours supporté même avec les lignes avec anticrénelage." #: doc/classes/Line2D.xml msgid "" @@ -43361,6 +43216,8 @@ msgid "" "The gradient is drawn through the whole line from start to finish. The " "default color will not be used if a gradient is set." msgstr "" +"Le dégradé est dessiné par toute la ligne du début à la fin. La couleur par " +"défaut ne sera pas utilisée si un dégradé est défini." #: doc/classes/Line2D.xml msgid "The style for the points between the start and the end." @@ -43371,6 +43228,9 @@ msgid "" "The points that form the lines. The line is drawn between every point set in " "this array. Points are interpreted as local vectors." msgstr "" +"Les points qui forment les lignes. La ligne est tracée entre chaque point " +"défini dans ce tableau. Les points sont interprétés comme des vecteurs " +"locaux." #: doc/classes/Line2D.xml msgid "" @@ -43381,24 +43241,37 @@ msgid "" "width]. For thin lines, this value should be reduced to a number between " "[code]2[/code] and [code]4[/code] to improve performance." msgstr "" +"Le lissage des coins et des bouts. Les valeurs plus élevées affichent des " +"coins plus lisses, mais demandent plus de ressources pour le rendu. Ceci " +"n'est utilisé que si un coin ou un bout est défini comme arrondi.\n" +"[b]Note :[/b] La valeur par défaut est réglée pour les lignes avec la " +"largeur [member width] par défaut. Pour les lignes fines, cette valeur " +"devrait être réduite à entre [code]2[/code] et [code]4[/code] pour améliorer " +"les performances." #: doc/classes/Line2D.xml msgid "" "The direction difference in radians between vector points. This value is " "only used if [member joint_mode] is set to [constant LINE_JOINT_SHARP]." msgstr "" +"La différence de direction entre les points vectoriels. Cette valeur n'est " +"utilisée que si [member joint_mode] est [constant LINE_JOINT_SHARP]." #: doc/classes/Line2D.xml msgid "" "The texture used for the line's texture. Uses [code]texture_mode[/code] for " "drawing style." msgstr "" +"La texture utilisée pour la texture de la ligne. Utilise " +"[code]texture_mode[/code] pour le style de dessin." #: doc/classes/Line2D.xml msgid "" "The style to render the [code]texture[/code] on the line. Use [enum " "LineTextureMode] constants." msgstr "" +"Le style de rendu de la [code]texture[/code] sur la ligne. Utilisez une des " +"constantes [enum LineTextureMode]." #: doc/classes/Line2D.xml msgid "The line's width." @@ -43409,12 +43282,16 @@ msgid "" "The line's width varies with the curve. The original width is simply " "multiply by the value of the Curve." msgstr "" +"La largeur de la ligne dépend selon la courbe. La largeur originale est " +"simplement multipliée par la valeur de la Curve." #: doc/classes/Line2D.xml msgid "" "The line's joints will be pointy. If [code]sharp_limit[/code] is greater " "than the rotation of a joint, it becomes a bevel joint instead." msgstr "" +"Les coins de la ligne sont pointus. Si [code]sharp_limit[/code] est plus " +"grand que l'angle d'un coin, ça devient un biseau." #: doc/classes/Line2D.xml msgid "The line's joints will be bevelled/chamfered." @@ -43422,7 +43299,7 @@ msgstr "" #: doc/classes/Line2D.xml msgid "The line's joints will be rounded." -msgstr "" +msgstr "Les coins de la ligne seront arrondis." #: doc/classes/Line2D.xml msgid "Don't draw a line cap." @@ -43440,6 +43317,7 @@ msgstr "Dessine le bout de la ligne avec un arrondi." msgid "" "Takes the left pixels of the texture and renders it over the whole line." msgstr "" +"Utilise les pixels de gauche de la texture pour le rendu de toute la ligne." #: doc/classes/Line2D.xml msgid "" @@ -43452,10 +43330,12 @@ msgid "" "Stretches the texture across the line. Import the texture with [b]Repeat[/b] " "disabled for best results." msgstr "" +"Étire la texture à travers la ligne. Importez la texture avec la " +"[b]répétition[/b] désactivée pour de meilleurs résultats." #: doc/classes/LineEdit.xml msgid "Control that provides single-line string editing." -msgstr "" +msgstr "Le Control qui fournit l'édition d'un texte d'une seule ligne." #: doc/classes/LineEdit.xml msgid "" @@ -43543,6 +43423,9 @@ msgid "" "[code]from_column[/code] to [code]to_column[/code]. Both parameters should " "be within the text's length." msgstr "" +"Supprime une section du [member text] allant de la position " +"[code]from_column[/code] à [code]to_column[/code]. Les deux paramètres " +"doivent être de la longueur du texte." #: doc/classes/LineEdit.xml doc/classes/RichTextLabel.xml msgid "Clears the current selection." @@ -43556,12 +43439,19 @@ msgid "" "may cause a crash. If you wish to hide it or any of its children, use their " "[member CanvasItem.visible] property." msgstr "" +"Retourne le [PopupMenu] de ce [LineEdit]. Par défaut, ce menu s'affiche " +"lorsque le clic-droit sur le [LineEdit].\n" +"[b]Avertissement :[/b] Il s'agit d'un nÅ“ud interne requis, le retirer et le " +"supprimer peut causer un plantage. Si vous voulez le cacher, lui ou un de " +"ses enfants, utilisez la propriété [member CanvasItem.visible]." #: doc/classes/LineEdit.xml msgid "" "Returns the scroll offset due to [member caret_position], as a number of " "characters." msgstr "" +"Retourne le décalage du défilement suivant [member caret_position], en tant " +"que nombre de caractères." #: doc/classes/LineEdit.xml doc/classes/TextEdit.xml msgid "Returns the selection begin column." @@ -43572,9 +43462,8 @@ msgid "Returns the selection end column." msgstr "Retourne la colonne de fin de sélection." #: doc/classes/LineEdit.xml -#, fuzzy msgid "Returns [code]true[/code] if the user has selected text." -msgstr "Retourne [code]true[/code] si le minuteur est arrêté." +msgstr "Retourne [code]true[/code] si l'utilisateur a sélectionné du texte." #: doc/classes/LineEdit.xml msgid "Executes a given action as defined in the [enum MenuItems] enum." @@ -43642,13 +43531,12 @@ msgstr "Si [code]true[/code], le menu contextuel apparaitra au clic-droit." #: doc/classes/LineEdit.xml doc/classes/RichTextLabel.xml #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "If [code]true[/code], the selected text will be deselected when focus is " "lost." msgstr "" -"Si [code]true[/code], la cellule actuellement sélectionnée peut être " -"sélectionnée à nouveau." +"Si [code]true[/code], le texte actuellement sélectionné sera désélectionné " +"quand le focus sera perdu." #: doc/classes/LineEdit.xml msgid "" @@ -44366,35 +44254,58 @@ msgid "" "add_constant_override(\"margin_right\", margin_value)\n" "[/codeblock]" msgstr "" +"Ajoute une marge supérieure, gauche, inférieure et droite à tous les nÅ“uds " +"[Control] qui sont des enfants directs du conteneur. Pour contrôler la marge " +"du [MarginContainer], utilisez les propriétés [code]margin_*[/code] du " +"thèmes listées ci-dessous.\n" +"[b]Note :[/b] Soyez prudent, les valeurs des marges de [Control] sont " +"différentes des valeurs de marge constante. Si vous souhaitez modifier les " +"valeurs de marge personnalisées du [MarginContainer] par code, vous devez " +"utiliser les exemples suivants :\n" +"[codeblock]\n" +"# Cet exemple suppose que ce script hérite de MarginContainer.\n" +"var margin_value = 100\n" +"add_constant_override(\"margin_top\", margin_value)\n" +"add_constant_override(\"margin_left\", margin_value)\n" +"add_constant_override(\"margin_bottom\", margin_value)\n" +"add_constant_override(\"margin_right\", margin_value)\n" +"[/codeblock]" #: doc/classes/MarginContainer.xml msgid "" "All direct children of [MarginContainer] will have a bottom margin of " "[code]margin_bottom[/code] pixels." msgstr "" +"Tous les enfants directs de [MarginContainer] auront la marge du bas de " +"[code]margin_bottom[/code] pixels." #: doc/classes/MarginContainer.xml msgid "" "All direct children of [MarginContainer] will have a left margin of " "[code]margin_left[/code] pixels." msgstr "" +"Tous les enfants directs de [MarginContainer] auront la marge gauche de " +"[code]margin_left[/code] pixels." #: doc/classes/MarginContainer.xml msgid "" "All direct children of [MarginContainer] will have a right margin of " "[code]margin_right[/code] pixels." msgstr "" +"Tous les enfants directs de [MarginContainer] auront la marge droite de " +"[code]margin_right[/code] pixels." #: doc/classes/MarginContainer.xml msgid "" "All direct children of [MarginContainer] will have a top margin of " "[code]margin_top[/code] pixels." msgstr "" +"Tous les enfants directs de [MarginContainer] auront la marge du haut de " +"[code]margin_top[/code] pixels." #: doc/classes/Marshalls.xml -#, fuzzy msgid "Data transformation (marshalling) and encoding helpers." -msgstr "Transformation de données (marshalling) et assistants d'encodage." +msgstr "Transformation de données (\"marshalling\") et assistants d'encodage." #: doc/classes/Marshalls.xml msgid "Provides data transformation and encoding utility functions." @@ -44403,13 +44314,12 @@ msgstr "" "données." #: doc/classes/Marshalls.xml -#, fuzzy msgid "" "Returns a decoded [PoolByteArray] corresponding to the Base64-encoded string " "[code]base64_str[/code]." msgstr "" -"Renvoie un [PoolByteArray] décodé correspondant à la chaîne de caractères " -"encodée en Base64 [code]base64_str[/code]." +"Retourne un [PoolByteArray] décodé correspondant à la chaîne de caractères " +"[code]base64_str[/code] encodée en Base64." #: doc/classes/Marshalls.xml msgid "" @@ -44981,6 +44891,9 @@ msgid "" "Uses specified surface of given [Mesh] to populate data for MeshDataTool.\n" "Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" +"Utiliser la surface spécifiée de [Mesh] pour construire les données pour le " +"MeshDataTool.\n" +"Nécessite un [Mesh] de type primitif [constant Mesh.PRIMITIVE_TRIANGES]." #: doc/classes/MeshDataTool.xml msgid "Returns the number of edges in this [Mesh]." @@ -45000,6 +44913,9 @@ msgid "" "Vertex argument can only be 0 or 1 because edges are comprised of two " "vertices." msgstr "" +"Retourne l'index des sommet spécifiés reliés au bord donné.\n" +"L'argument du sommet ne peut être que 0 ou 1 car les bords ne sont composés " +"que de deux sommets." #: doc/classes/MeshDataTool.xml msgid "Returns the number of faces in this [Mesh]." @@ -45010,6 +44926,9 @@ msgid "" "Returns specified edge associated with given face.\n" "Edge argument must be either 0, 1, or 2 because a face only has three edges." msgstr "" +"Retourne le bord spécifié associé au face donné.\n" +"L'argument du bord doit être soit 0, 1 ou 2 parce qu'une face n'a que trois " +"bords." #: doc/classes/MeshDataTool.xml msgid "Returns the metadata associated with the given face." @@ -45025,6 +44944,9 @@ msgid "" "Vertex argument must be either 0, 1, or 2 because faces contain three " "vertices." msgstr "" +"Retourne le vertx spécifié du face donné.\n" +"L'argument du sommet doit être soit 0, 1 ou 2 parce que les faces ne " +"contiennent que trois sommets." #: doc/classes/MeshDataTool.xml msgid "" @@ -45035,6 +44957,12 @@ msgid "" "ARRAY_FORMAT_NORMAL] is [code]2[/code].\n" "See [enum ArrayMesh.ArrayFormat] for a list of format flags." msgstr "" +"Retourne le format du [Mesh]. Le format est un entier composé des drapeaux " +"de format du [Mesh]. Par exemple, un maillage contenant à la fois des " +"sommets et des normales retournerait un format de [code]3[/code] parce que [" +"constant ArrayMesh.ARRAY_FORMAT_VERTEX] est [code]1[/code] et [constant " +"ArrayMesh.ARRAY_FORMAT_NORMAL] est [code]2[/code].\n" +"Voir [enum ArrayMesh.ArrayFormat] pour une liste de drapeaux de format." #: doc/classes/MeshDataTool.xml msgid "Returns the material assigned to the [Mesh]." @@ -45149,6 +45077,13 @@ msgid "" "[Mesh] has to be instanced more than thousands of times at close proximity, " "consider using a [MultiMesh] in a [MultiMeshInstance] instead." msgstr "" +"MeshInstance est un nÅ“ud qui prend une ressource [Mesh] et l'ajoute au " +"scénario actuel en créant une instance. C'est la classe la plus souvent " +"utilisée pour obtenir la géométrie 3D pour le rendu et peut être utilisé " +"pour l'instance d'un seul [Mesh] dans de nombreux endroits. Cela permet de " +"réutiliser la géométrie et d'économiser des ressources. Lorsqu'un [Mesh] " +"doit être instancié plusieurs milliers de fois les uns proches des autres, " +"préférez plutôt un [MultiMesh] dans un [MultiMeshInstance]." #: doc/classes/MeshInstance.xml msgid "" @@ -45161,6 +45096,16 @@ msgid "" "If [code]simplify[/code] is [code]true[/code], the geometry can be further " "simplified to reduce the amount of vertices. Disabled by default." msgstr "" +"Cette aide crée un nÅ“ud [StaticBody] enfant avec une forme de collision " +"[ConvexPolygonShape] calculée à partir de la géométrie du maillage. Elle est " +"principalement utilisée pour les essais.\n" +"Si [code]clean[/code] est [code]true[/code] (par défaut), les doublons et " +"les sommets intérieurs sont automatiquement supprimés. Vous pouvez le " +"définir à [code]false[/code] pour rendre le processus de création plus " +"rapide.\n" +"Si [code]simplify[/code] est [code]true[/code], la géométrie pourra être " +"simplifiée pour réduire la quantité de sommets, ce qui est désactivé par " +"défaut." #: doc/classes/MeshInstance.xml msgid "" @@ -45199,11 +45144,15 @@ msgid "" "[method Mesh.surface_get_material] to get materials associated with the " "[Mesh] resource." msgstr "" +"Retourne la surcharge [Material] pour une surface de la ressource [Mesh].\n" +"[b]Note :[/b] Cette fonction ne retourne que les matériaux associés à la " +"[i]surchage[/i] de la [MeshInstance]. Préférez [method get_active_material] " +"ou [method Mesh.surface_get_material] pour obtenir des matériaux associés à " +"la ressource [Mesh]." #: doc/classes/MeshInstance.xml -#, fuzzy msgid "Returns the number of surface override materials." -msgstr "Retourne le nombre de surfaces du matériau." +msgstr "Retourne le nombre de surcharges des surfaces du matériau." #: doc/classes/MeshInstance.xml msgid "" @@ -45213,6 +45162,12 @@ msgid "" "In order to be mergeable, properties of the [MeshInstance] must match, and " "each surface must match, in terms of material, attributes and vertex format." msgstr "" +"Retourne [code]true[/code] si cette [MeshInstance] peut être fusionnée avec " +"l'autre instance [code]other_mesh_instance[/code], en utilisant la fonction [" +"method MeshInstance.merge_meshes].\n" +"Pour pouvoir être fusionnées, les propriétés des [MeshInstance] doivent " +"correspondre, et chaque surface doit correspondre, en termes de matériau, " +"d'attributs et de format des sommets." #: doc/classes/MeshInstance.xml msgid "" @@ -45237,6 +45192,26 @@ msgid "" "Also note that any initial data in the destination [MeshInstance] data will " "be discarded." msgstr "" +"Cette fonction peut fusionner les données de plusieurs [MeshInstance] " +"sources en une seule [MeshInstance] finale (le MeshInstance sur laquel la " +"fonction est appelée). Ceci est principalement utile pour améliorer les " +"performances en réduisant le nombre de appels de dessin et de [Node].\n" +"Le fusions ne doivent être faites que sur des maillages simples et ne " +"contenant pas d'animation.\n" +"Les sommets finaux peuvent soit être retournés dans l'espace global, soit " +"dans l'espace local par rapport à la transformation globale de la " +"[MeshInstance] finale (ce nÅ“ud doit être à l'intérieur du [SceneTree] pour " +"l'espace local pour fonctionner).\n" +"La fonction effectuera un contrôle final de compatibilité entre les " +"[MeshInstance] par défaut, cela devrait toujours être utilisé à moins que " +"vous n'ayez préalablement vérifié la compatibilité avec [method MeshInstance." +"is_mergeable_with]. Si la vérification est ignorée et que les maillages sont " +"fusionnés, vous pouvez voir des erreurs de rendu.\n" +"[b]Note :[/b] Les exigences de similitude entre les maillages sont assez " +"strictes. Elles peuvent être vérifiés avec [method MeshInstance." +"is_mergeable_with], avant d'appeler [method MeshInstance.merge_meshes]\n" +"Notez également que toutes les données initiales dans la [MeshInstance] " +"finale seront supprimées." #: doc/classes/MeshInstance.xml msgid "" @@ -45244,6 +45219,9 @@ msgid "" "resource. This material is associated with this [MeshInstance] rather than " "with the [Mesh] resource." msgstr "" +"Définit la surcharge [Material] pour la surface spécifiée de la ressource " +"[Mesh]. Ce matériel est associé à cette ressource [MeshInstance] plutôt qu'à " +"la ressource [Mesh]." #: doc/classes/MeshInstance.xml msgid "The [Mesh] resource for the instance." @@ -45336,9 +45314,8 @@ msgid "Returns the item's mesh." msgstr "Retourne le maillage de l'élément." #: doc/classes/MeshLibrary.xml -#, fuzzy msgid "Returns the transform applied to the item's mesh." -msgstr "Retourne la matrice de transformation de la toile de cet objet." +msgstr "" #: doc/classes/MeshLibrary.xml msgid "Returns the item's name." @@ -45381,9 +45358,8 @@ msgid "Sets the item's mesh." msgstr "Définit le maillage de l'élément." #: doc/classes/MeshLibrary.xml -#, fuzzy msgid "Sets the transform to apply to the item's mesh." -msgstr "Retourne la matrice de transformation de la toile de cet objet." +msgstr "" #: doc/classes/MeshLibrary.xml msgid "" @@ -45607,6 +45583,18 @@ msgid "" "(4 bytes as is) and [code]COLOR_FLOAT[/code] / [code]CUSTOM_DATA_FLOAT[/" "code] is stored as 4 floats." msgstr "" +"Définit toutes les données relatives aux instances en une seule fois. Ceci " +"est particulièrement utile lors du chargement des données du disque ou de la " +"préparation des données de GDNative.\n" +"Toutes les données sont empaquetées dans un grand tableau flottant. Un " +"tableau peut ressembler à ceci : la Transform pour l'instance 1, les données " +"de couleur pour l'instance 1, des données personnalisées pour l'instance 1, " +"la Transform pour l'instance 2, les données de couleur pour l'instance 2, " +"etc.\n" +"[Transform] est enregistré avec 12 flottants, [Transform2D] avec 8 " +"flottants, [code]COLOR_8BIT[/code] / [code]CUSTOM_DATA_8BIT[/code] avec 1 " +"flottant (4 octets en général) et [code]COLOR_FLOAT[/code] / " +"[code]CUSTOM_DATA_FLOAT[/code] avec 4 flottants." #: doc/classes/MultiMesh.xml msgid "" @@ -45619,6 +45607,16 @@ msgid "" "When the order of instances is coherent, the simpler [method MultiMesh." "set_as_bulk_array] can still be used with interpolation." msgstr "" +"Une version alternative de [method MultiMesh.set_as_bulk_array] qui peut " +"être utilisée avec [i]l'interpolation physique[/i]. Cette méthode prend deux " +"tableaux, et peut définir les données pour la trame actuelle et précédente " +"en une seule fois. Le rendu interpolera automatiquement les données entre " +"ces deux trames.\n" +"Ceci est utile pour les situations où l'ordre des instances peut changer " +"d'une trame physique à l'autre, comme les systèmes de particules.\n" +"Lorsque l'ordre des instances est cohérent, la méthode [method MultiMesh." +"set_as_bulk_array] plus simple peut encore être utilisée avec " +"l'interpolation." #: doc/classes/MultiMesh.xml msgid "" @@ -45628,6 +45626,11 @@ msgid "" "[code]null[/code] on the [MultiMesh] and [member SpatialMaterial." "vertex_color_use_as_albedo] is [code]true[/code] on the material." msgstr "" +"Définit la couleur d'une instance spécifique en [i]multipliant[/i] les " +"couleurs des sommets existants du maillage.\n" +"Pour que la couleur soit modifiée, assurez-vous que [member color_format] " +"n'est pas [code]null[/code] pour le [MultiMesh] et [member SpatialMaterial." +"vertex_color_use_as_albedo] est [code]true[/code] dans le matériau." #: doc/classes/MultiMesh.xml msgid "" @@ -45635,6 +45638,10 @@ msgid "" "just a container for 4 floating point numbers. The format of the number can " "change depending on the [enum CustomDataFormat] used." msgstr "" +"Définit des données personnalisées pour une instance spécifique. Bien que " +"[Color] soit utilisée, ce n'est qu'un conteneur pour 4 flottants qui peut " +"servir à autre chose. Le format du nombre peut changer en fonction du [enum " +"CustomDataFormat] utilisé." #: doc/classes/MultiMesh.xml msgid "Sets the [Transform] for a specific instance." @@ -45646,11 +45653,11 @@ msgstr "Définit la [Transform2D] pour l'instance spécifiée." #: doc/classes/MultiMesh.xml msgid "Format of colors in color array that gets passed to shader." -msgstr "" +msgstr "Le format des couleurs dans le tableau de couleurs passé au shader." #: doc/classes/MultiMesh.xml msgid "Format of custom data in custom data array that gets passed to shader." -msgstr "" +msgstr "Le format des données personnalisées dans ce tableau passé au shader." #: doc/classes/MultiMesh.xml msgid "" @@ -45658,6 +45665,9 @@ msgid "" "buffers. By default, all instances are drawn but you can limit this with " "[member visible_instance_count]." msgstr "" +"Le nombre de cas qui seront affichés. Cela effacera et re-dimensionnera les " +"mémoires tampons. Par défaut, toutes les instantes sont dessinées mais vous " +"pouvez les limiter avec [member visible_instance_count]." #: doc/classes/MultiMesh.xml msgid "Mesh to be drawn." @@ -45672,6 +45682,14 @@ msgid "" "special cases mentioned above, the quality should be comparable to high " "quality." msgstr "" +"Choisis si vous utilisez une méthode d'interpolation qui favorise la vitesse " +"ou la qualité.\n" +"Lors de l'utilisation de faibles taux de trames physiques (généralement " +"inférieur à 20) ou de taux élevés de rotation d'objets, vous pouvez obtenir " +"de meilleurs résultats à partir du réglage de haute qualité.\n" +"[b]Note :[/b] La qualité rapide ne correspond pas à la qualité basse. Sauf " +"dans les cas particuliers mentionnés ci-dessus, la qualité devrait être " +"comparable à la qualité." #: doc/classes/MultiMesh.xml msgid "Format of transform used to transform mesh, either 2D or 3D." @@ -45684,6 +45702,8 @@ msgid "" "Limits the number of instances drawn, -1 draws all instances. Changing this " "does not change the sizes of the buffers." msgstr "" +"Limite le nombre d'instances affichées, et -1 les dessine toutes. Changer " +"cela ne change pas la taille des mémoires tampons." #: doc/classes/MultiMesh.xml msgid "Use this when using 2D transforms." @@ -45702,12 +45722,17 @@ msgid "" "Compress [Color] data into 8 bits when passing to shader. This uses less " "memory and can be faster, but the [Color] loses precision." msgstr "" +"Compresse les données [Color] en 8 bits quand elles seront passées au " +"shader. Cela utilise moins de mémoire et peut être plus rapide, mais les " +"[Color] perdent en précision." #: doc/classes/MultiMesh.xml msgid "" "The [Color] passed into [method set_instance_color] will use 4 floats. Use " "this for highest precision [Color]." msgstr "" +"La [Color] passée dans [method set_instance_color] utilisera 4 flottants. " +"Utilisez ceci pour la plus haute précision [Color]." #: doc/classes/MultiMesh.xml msgid "Use when you are not using per-instance custom data." @@ -45899,12 +45924,16 @@ msgid "" "Emitted when this MultiplayerAPI's [member network_peer] successfully " "connected to a server. Only emitted on clients." msgstr "" +"Émis lorsque le [member network_peer] de ce MultijoueurAPI est connecté avec " +"succès à un serveur. Seulement émis aux clients." #: doc/classes/MultiplayerAPI.xml msgid "" "Emitted when this MultiplayerAPI's [member network_peer] fails to establish " "a connection to a server. Only emitted on clients." msgstr "" +"Émis lorsque le [member network_peer] de ce MultijoueurAPI ne parvient pas à " +"établir une connexion à un serveur. Seulement émis aux clients." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45913,6 +45942,11 @@ msgid "" "clients connect to the same server. Upon connecting to a server, a client " "also receives this signal for the server (with ID being 1)." msgstr "" +"Émis lorsque le [member network_peer] de ce MultiplayerAPI se connecte à un " +"nouveau pair. L'identifiant est celui du nouveau pair. Les clients sont " +"informés lorsque d'autres clients se connectent au même serveur. En se " +"connectant à un serveur, un client reçoit également ce signal pour le " +"serveur (avec identifiant étant à 1)." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45920,6 +45954,9 @@ msgid "" "peer. Clients get notified when other clients disconnect from the same " "server." msgstr "" +"Émis lorsque le [member network_peer] de ce MultiplayerAPI se déconnecte " +"d'un pair. Les clients sont informés lorsque d'autres clients se " +"déconnectent du même serveur." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45927,12 +45964,18 @@ msgid "" "[code]packet[/code] with custom data (see [method send_bytes]). ID is the " "peer ID of the peer that sent the packet." msgstr "" +"Émis lorsque le [member network_peer] de ce MultijoueurAPI reçoit un " +"[code]packet[/code] avec des données personnalisées (voir [method " +"send_bytes)]. L'identifiant est l'identifiant par les pairs de l'équipe qui " +"a envoyé le paquet." #: doc/classes/MultiplayerAPI.xml msgid "" "Emitted when this MultiplayerAPI's [member network_peer] disconnects from " "server. Only emitted on clients." msgstr "" +"Émis lorsque le [member network_peer] de ce MultijoueurAPI se déconnecte du " +"serveur. Seulement émis sur les clients." #: doc/classes/MultiplayerAPI.xml msgid "" @@ -45973,34 +46016,47 @@ msgid "" "[i]Deprecated.[/i] Use [constant RPC_MODE_PUPPET] instead. Analogous to the " "[code]slave[/code] keyword." msgstr "" +"[i]Obsolète.[/i] Utilisez plutôt [constant RPC_MODE_PUPPET]. Similaire au " +"mot-clé [code]slave[/code]." #: doc/classes/MultiplayerAPI.xml msgid "" "Behave like [constant RPC_MODE_REMOTE] but also make the call or property " "change locally. Analogous to the [code]remotesync[/code] keyword." msgstr "" +"Se comporte comme [constant RPC_MODE_REMOTE] mais fait aussi l'appel ou le " +"changement d'un propriété en local. Similaire au mot-clé " +"[code]remotesync[/code]." #: doc/classes/MultiplayerAPI.xml msgid "" "[i]Deprecated.[/i] Use [constant RPC_MODE_REMOTESYNC] instead. Analogous to " "the [code]sync[/code] keyword." msgstr "" +"[i]Obsolète.[/i] Utilisez plutôt [constant RPC_MODE_REMOTESYNC]. Similaire " +"au mot-clé [code]sync[/code]." #: doc/classes/MultiplayerAPI.xml msgid "" "Behave like [constant RPC_MODE_MASTER] but also make the call or property " "change locally. Analogous to the [code]mastersync[/code] keyword." msgstr "" +"Se comporte comme [constant RPC_MODE_MASTER] mais fait aussi l'appel ou le " +"changement d'une propriété en local. Similaire au mot-clé " +"[code]mastersync[/code]." #: doc/classes/MultiplayerAPI.xml msgid "" "Behave like [constant RPC_MODE_PUPPET] but also make the call or property " "change locally. Analogous to the [code]puppetsync[/code] keyword." msgstr "" +"Se comporte comme [constant RPC_MODE_PUPPET] mais fait aussi l'appel ou le " +"changement d'une propriété en local. Similaire au mot-clé " +"[code]puppetsync[/code]." #: doc/classes/Mutex.xml msgid "A synchronization mutex (mutual exclusion)." -msgstr "" +msgstr "Un mutex de synchronisation (exclusion mutuelle)." #: doc/classes/Mutex.xml msgid "" @@ -46117,6 +46173,9 @@ msgid "" "Returns the owner of the [NavigationMesh] which contains the navigation " "point closest to the point given. This is usually a [NavigationMeshInstance]." msgstr "" +"Retourne le propriétaire du [NavigationMesh] qui contient le point de " +"navigation le plus proche du point donné. C'est généralement une " +"[NavigationMeshInstance]." #: doc/classes/Navigation.xml msgid "" @@ -46127,9 +46186,8 @@ msgid "" msgstr "" #: doc/classes/Navigation.xml -#, fuzzy msgid "Returns the [RID] of the navigation map on the [NavigationServer]." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "" #: doc/classes/Navigation.xml msgid "" @@ -46141,6 +46199,13 @@ msgid "" "agent properties associated with each [NavigationMesh] (radius, height, " "etc.) are considered in the path calculation, otherwise they are ignored." msgstr "" +"[i]Obsolète.[/i] Le nÅ“ud [Navigation] la méthode [method get_simple_path] " +"sont obsolètes se seront retiré dans une prochaine version. Utilisez plutôt [" +"method NavigationServer.map_get_path].\n" +"Retourne le chemin entre deux points donnés. Les points sont des coordonées " +"locales. Si [code]optimize[/code] est [code]true[/code] (par défaut), les " +"propriétés de l'agent associées à chaque [NavigationMesh] (rayon, hauteur, " +"etc.) sont considérés dans le calcul du chemin, sinon ils sont ignorés." #: doc/classes/Navigation.xml msgid "The cell height to use for fields." @@ -46166,12 +46231,16 @@ msgid "" "Defines which direction is up. By default, this is [code](0, 1, 0)[/code], " "which is the world's \"up\" direction." msgstr "" +"Définit la direction. Par défaut, il s'agit de [code](0, 1, 0)[/code], qui " +"est la direction du haut (\"up\")." #: doc/classes/Navigation.xml doc/classes/Navigation2DServer.xml #: doc/classes/NavigationServer.xml msgid "" "Emitted when a navigation map is updated, when a region moves or is modified." msgstr "" +"Émis quand une carte de navigation est mise à jour, ou quand une région se " +"déplace ou est modifiée." #: doc/classes/Navigation2D.xml msgid "2D navigation and pathfinding node." @@ -46220,9 +46289,8 @@ msgid "" msgstr "" #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "Server interface for low-level 2D navigation access." -msgstr "Interface de serveur pour l'accès audio de bas niveau." +msgstr "" #: doc/classes/Navigation2DServer.xml #, fuzzy @@ -46260,16 +46328,16 @@ msgstr "" "de navigation. Ensemble, ces cartes définissent les aires navigables dans le " "monde 2D. Pour que deux régions soient connectées entre elles, elles doivent " "avoir une bordure en commun. Une bordure (\"edge\") est considérée connectée " -"à une autre si elles ont deux sommets rapprochés de moins de la distance " -"[member Navigation.edge_connection_margin].\n" +"à une autre si elles ont deux sommets rapprochés de moins de la distance [" +"member Navigation.edge_connection_margin].\n" "Pour utiliser le système d'évitement, vous devez utiliser des agents. Vous " "pouvez définir la vitesse cible d'un agent, puis le serveur émettra une " "méthode de rappel avec la vitesse modifiée.\n" "[b]Note :[/b] Le système d'évitement des collisions ignorent les régions. " "Utiliser la vitesse modifiée telle quelle peut déplacer un agent hors de la " -"surface de navigable. C'est une limite du système d'évitement des collision, " -"et certaines situations plus complexes peuvent nécessiter l'utilisation du " -"moteur physique.\n" +"surface de navigable. C'est une limite du système d'évitement des " +"collisions, et certaines situations plus complexes peuvent nécessiter " +"l'utilisation du moteur physique.\n" "Le serveur garde en mémoire tous les appels et les exécutent durant la phase " "de synchronisation. Cela veut dire que vous pouvez demander n'importe quel " "changement sur l'ensemble des cartes, via n'importe quel fil d'exécution, " @@ -46284,11 +46352,12 @@ msgid "" "Returns the navigation map [RID] the requested [code]agent[/code] is " "currently assigned to." msgstr "" +"Retourne le [RID] de la carte de navigation auquel le [code]agent[/code] " +"spécifié est actuellement assigné." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns [code]true[/code] if the map got changed the previous frame." -msgstr "Renvoie [code]true[/code] si le chemin donné est filtré." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46314,11 +46383,13 @@ msgid "" "navigation. The larger this number, the longer the running time of the " "simulation. If the number is too low, the simulation will not be safe." msgstr "" +"Définit le nombre maximal d'autres agents que cet agent prend en compte dans " +"la navigation. Plus ce nombre est grand, plus la durée de la simulation est " +"longue. Si le nombre est trop bas, la simulation ne sera pas fiable." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the maximum speed of the agent. Must be positive." -msgstr "Obtient le nom d'un entrée par son index." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46326,11 +46397,14 @@ msgid "" "the navigation. The larger this number, the longer the running time of the " "simulation. If the number is too low, the simulation will not be safe." msgstr "" +"Définit la distance maximale avec d'autres agents que cet agent prend en " +"compte dans la navigation. Plus ce nombre est grand, plus la durée de la " +"simulation est longue. Si le nombre est trop bas, la simulation ne sera pas " +"fiable." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the position of the agent in world space." -msgstr "Définit la position du nÅ“ud spécifié." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the radius of the agent." @@ -46348,11 +46422,14 @@ msgid "" "agents, but the less freedom this agent has in choosing its velocities. Must " "be positive." msgstr "" +"La quantité minimale de temps pour laquelle les vitesses de l'agent " +"calculées par la simulation sont fiables pour les autres agents. Plus ce " +"nombre est grand, plus tôt cet agent répondra à la présence d'autres agents, " +"mais moins il aura de liberté pour choisir sa vitesse. Ça doit être positif." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the current velocity of the agent." -msgstr "Définit le trame présentement visible de l'animation." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Destroys the given RID." @@ -46364,6 +46441,9 @@ msgid "" "returns both 2D and 3D created navigation maps as there is technically no " "distinction between them." msgstr "" +"Retourne tous les [RID] des cartes de navigation créées sur le " +"NavigationServer. Cela renvoie les cartes de navigation 2D et aussi 3D car " +"il n'y a techniquement aucune distinction entre eux." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Create a new map." @@ -46397,19 +46477,47 @@ msgid "" "but it can also introduce bugs if used inappropriately without much " "foresight." msgstr "" +"Cette fonction force immédiatement la synchronisation de la navigation " +"spécifiée par le [RID] spécifié par [code]map[/code]. Par défaut, les cartes " +"de navigation ne sont synchronisées qu'à la fin de chaque trame physique. " +"Cette fonction peut être utilisée pour calculer immédiatement tous les " +"maillages de navigation et les connexions entre les régions de la carte de " +"navigation. Cela permet d'interroger un chemin de navigation pour une carte " +"modifiée immédiatement et dans la même trame (plusieurs fois si nécessaire)." +"\n" +"En raison de restrictions techniques, la file de commandes actuelle de " +"NavigationServer sera exécutée aussitôt. Cela signifie que toutes les " +"commandes de mise à jour en attente pour cette trame de physique seront " +"exécutées, même celles destinées à d'autres cartes, régions et agents qui ne " +"font pas partie de la carte spécifiée. Le calcul coûteux des maillages de " +"navigation et des connexions de régions d'une carte ne sera fait que pour la " +"carte spécifiée. D'autres cartes recevront la synchronisation normale à la " +"fin de la trame physique. Si la carte spécifiée reçoit des changements après " +"la mise à jour forcée, elle sera à nouveau mise à jour aussi bien lorsque " +"les autres cartes recevront leur mise à jour.\n" +"Le traitement d'évitement et l'envoi des signaux [code]safe_velocity[/code] " +"ne sont pas affectés par cette fonction et continuent de se produire pour " +"tous les cartes et agents à la fin de la trame physique.\n" +"[b]Note :[/b] Une grande pouvoir implique une grande responsabilité. Cette " +"fonction ne devrait être utilisée que par les utilisateurs qui savent " +"vraiment ce qu'ils font et ont une bonne raison de l'utiliser. Pour " +"effectuer une mise à jour immédiate d'une carte de navigation, il faut " +"verrouiller le NavigationServer et exécuter toute la file de commandes du " +"NavigationServer. Non seulement cela peut affecter sévèrement les " +"performances du jeu, mais il peut également introduire des bugs si ça n'est " +"pas fait avec le plus grand soin." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns all navigation agents [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" +"Retourne tous [RID] des agents de navigation qui sont actuellement affectés " +"à la navigation [code]map[/code] spécifiée." #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." msgstr "" -"Retourne l'actuelle ligne du fichier interprété (actuellement non " -"implémenté)." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Returns the map cell size." @@ -46428,12 +46536,16 @@ msgid "" "Returns the owner region RID for the point returned by [method " "map_get_closest_point]." msgstr "" +"Retourne la région propriétaire du RID pour le point retourné par [method " +"map_get_closest_point]." #: doc/classes/Navigation2DServer.xml msgid "" "Returns the edge connection margin of the map. The edge connection margin is " "a distance used to connect two regions." msgstr "" +"Retourne la marge de raccordement du bord de la carte. La marge de " +"raccordement est une distance utilisée pour relier deux régions." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46441,38 +46553,42 @@ msgid "" "[code]navigation_layers[/code] is a bitmask of all region layers that are " "allowed to be in the path." msgstr "" +"Retourne le chemin de navigation pour atteindre la destination de l'origine. " +"[code]navigation_layers[/code] est un bitmask de toutes les calques de la " +"région qui sont autorisées à être dans le chemin." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns all navigation regions [RID]s that are currently assigned to the " "requested navigation [code]map[/code]." msgstr "" +"Retourne toutes les régions de navigation [RID] qui sont actuellement " +"affectées à la navigation demandée [code]map[/code]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns [code]true[/code] if the map is active." -msgstr "Retourne [code]true[/code] si l'[AABB] est vide." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Sets the map active." msgstr "Définit la carte comme active." #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "" "Set the map cell height used to weld the navigation mesh polygons. [b]Note:[/" "b] Currently not implemented." -msgstr "Définit le polygone de navigation de la tuile." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Set the map cell size used to weld the navigation mesh polygons." -msgstr "Définit le polygone de navigation de la tuile." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Set the map edge connection margin used to weld the compatible region edges." msgstr "" +"Définit la marge de connexion de bord de la carte utilisée pour fusionner " +"les bords compatibles de la région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "Creates a new region." @@ -46484,6 +46600,8 @@ msgid "" "index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" +"Retourne le point de fin d'une porte de connexion. [code]connection[/code] " +"est un indice entre 0 et la valeur de [method region_get_connections_count]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46491,33 +46609,36 @@ msgid "" "an index between 0 and the return value of [method " "region_get_connections_count]." msgstr "" +"Retourne le point de départ d'une porte de connexion. [code]connection[/code]" +" est un indice entre 0 et la valeur de [method region_get_connections_count]." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns how many connections this [code]region[/code] has with other regions " "in the map." msgstr "" +"Retourne le nombre de connexions ce [code]region[/code] a avec les autres " +"régions de la carte." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the [code]enter_cost[/code] of this [code]region[/code]." -msgstr "Retourne [code]true[/code] si le [code]signal[/code] donné existe." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" "Returns the navigation map [RID] the requested [code]region[/code] is " "currently assigned to." msgstr "" +"Retourne le [RID] de la carte de navigation à laquelle la [code]region[/code]" +" spécifiée est actuellement assignée." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the region's navigation layers." -msgstr "Retourne le maillage de navigation de l'élément." +msgstr "Retourne les calques de navigation de la région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the [code]travel_cost[/code] of this [code]region[/code]." -msgstr "Retourne [code]true[/code] si le [code]signal[/code] donné existe." +msgstr "" #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml msgid "" @@ -46551,16 +46672,12 @@ msgstr "" "le résultat peut être inattendu." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the [code]enter_cost[/code] for this [code]region[/code]." msgstr "" -"Définit la [code]position[/code] du point avec l'identifiant [code]id[/code] " -"spécifié." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the map for the region." -msgstr "Retourne la hauteur du contenu." +msgstr "Définit la carte de la région." #: doc/classes/Navigation2DServer.xml msgid "" @@ -46569,24 +46686,19 @@ msgid "" msgstr "" "Définit les calques de navigation de la région. Cela permet de sélectionner " "les régions à partir d'une requête de chemin (en utilisant [method " -"Navigation2DServer.map_get_path])" +"Navigation2DServer.map_get_path])." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the navigation mesh for the region." -msgstr "Définit le polygone de navigation de la tuile." +msgstr "Définit le polygone de navigation de la région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the global transformation for the region." -msgstr "Retourne la matrice de transformation globale de cet élément." +msgstr "Retourne la transformation globale de cette région." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml -#, fuzzy msgid "Sets the [code]travel_cost[/code] for this [code]region[/code]." msgstr "" -"Définit la [code]position[/code] du point avec l'identifiant [code]id[/code] " -"spécifié." #: doc/classes/NavigationAgent.xml msgid "3D agent used in navigation for collision avoidance." @@ -46714,23 +46826,20 @@ msgstr "" "la NavigationAgent." #: doc/classes/NavigationAgent.xml -#, fuzzy msgid "Returns the [RID] of this agent on the [NavigationServer]." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "Retourne le [RID] de cet agent dans le [NavigationServer]." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "" "Returns the user-defined target location (set with [method " "set_target_location])." -msgstr "Renvoie le mode de remplacement de l’espace pour la zone." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the navigation path's final location has been " "reached." -msgstr "Renvoie [code]true[/code] si le chemin donné est filtré." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -46827,14 +46936,12 @@ msgstr "" "déplacer sur un plan horizontal." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "The maximum number of neighbors for the agent to consider." -msgstr "La valeur de luminance maximale pour l'exposition automatique." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "The maximum speed that an agent can move." -msgstr "Rotation maximale à travers la charnière." +msgstr "La vitesse maximale à laquelle un agent peut se déplacer." #: doc/classes/NavigationAgent.xml msgid "" @@ -46848,9 +46955,8 @@ msgstr "" "correspondant." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "The distance to search for other agents." -msgstr "L’instance n’a pas de type." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -46929,9 +47035,8 @@ msgstr "" "doit être positif." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "Notifies when the final location is reached." -msgstr "Avertit quand une animation commence à jouer." +msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -47008,9 +47113,8 @@ msgstr "" "navigation." #: doc/classes/NavigationAgent2D.xml -#, fuzzy msgid "Returns the [RID] of this agent on the [Navigation2DServer]." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "Retourne le [RID] de cet agent dans le [Navigation2DServer]." #: doc/classes/NavigationAgent2D.xml msgid "" @@ -47090,11 +47194,10 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Returns whether the specified [code]bit[/code] of the [member " "geometry_collision_mask] is set." -msgstr "Retourne si la [code]class[/code] spécifiée est disponible ou non." +msgstr "" #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -47105,9 +47208,8 @@ msgstr "" "créé." #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "Returns the number of polygons in the navigation mesh." -msgstr "Renvoie le nombre de points sur l'axe de mélange." +msgstr "" #: doc/classes/NavigationMesh.xml msgid "" @@ -47118,17 +47220,16 @@ msgstr "" "créé." #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" "code] in the [member geometry_collision_mask].\n" "If [code]value[/code] is [code]false[/code], clears the specified [code]bit[/" "code] in the [member geometry_collision_mask]." msgstr "" -"Si [code]value[/code] est [code]true[/code]], définit le [code]bit[/code] " -"spécifié dans le masque [nom collision_mask].\n" -"Si [code]value[/code] est [code]false[/code], rétablit le [code]bit[/code] " -"spécifié dans le masque [nom collision_mask]." +"Si [code]value[/code] est [code]true[/code], définit le [code]bit[/code] " +"spécifié dans le masque [member geometry_collision_mask].\n" +"Si [code]value[/code] est [code]false[/code], efface le [code]bit[/code] " +"spécifié dans le masque [member geometry_collision_mask]." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -47152,9 +47253,8 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "The maximum slope that is considered walkable, in degrees." -msgstr "Rotation maximale à travers la charnière." +msgstr "" #: doc/classes/NavigationMesh.xml msgid "" @@ -47203,9 +47303,8 @@ msgid "The position offset applied to the [member filter_baking_aabb] [AABB]." msgstr "" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "If [code]true[/code], marks spans that are ledges as non-walkable." -msgstr "Si [code]true[/code], les titres des colonnes sont visibles." +msgstr "" #: doc/classes/NavigationMesh.xml msgid "" @@ -47214,13 +47313,10 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "If [code]true[/code], marks walkable spans as not walkable if the clearance " "above the span is less than [member agent_height]." msgstr "" -"Si [code]true[/code], les particules sera émise une seule fois puis " -"arrêtées. Équivalent à [member Particles.one_shot]." #: doc/classes/NavigationMesh.xml msgid "" @@ -47489,18 +47585,16 @@ msgstr "" "geometry_source_geometry_mode] de la ressource [NavigationMesh]." #: doc/classes/NavigationMeshGenerator.xml -#, fuzzy msgid "" "Removes all polygons and vertices from the provided [code]nav_mesh[/code] " "resource." -msgstr "Supprime l’animation avec la touche [code]name[/code]." +msgstr "" #: doc/classes/NavigationMeshInstance.xml msgid "An instance of a [NavigationMesh]." msgstr "Une instance de [NavigationMesh]." #: doc/classes/NavigationMeshInstance.xml -#, fuzzy msgid "" "An instance of a [NavigationMesh]. It tells the [Navigation] node what can " "be navigated and what cannot, based on the [NavigationMesh] resource.\n" @@ -47533,7 +47627,7 @@ msgstr "" "relier deux régions. Ils doivent partager un même bord.\n" "Le coût d'entrée dans cette région d'une autre région peut être contrôlé " "avec la valeur [member enter_cost].\n" -"[b]Note : [/b] Cette valeur n'est pas ajoutée au coût du chemin lorsque la " +"[b]Note :[/b] Cette valeur n'est pas ajoutée au coût du chemin lorsque la " "position de départ est déjà dans cette région.\n" "Le coût des distances de voyage dans cette région peut être contrôlé avec le " "multiplicateur [member travel_cost]." @@ -47550,6 +47644,18 @@ msgid "" "operating systems that cannot use threads (such as HTML5 with threads " "disabled)." msgstr "" +"Pré-calcule le [NavigationMesh]. Si [code]on_thread[/code] est défini à " +"[code]true[/code] (par défaut), le pré-calcul est fait sur un fil " +"d'exécution séparé. Le pré-calcul sur un fil d'exécution séparé est utile " +"parce que la navigation est une opération relativement coûteuse. Lorsqu'il " +"est terminé, il définit automatiquement ce nouveau [NavigationMesh]. " +"Veuillez noter que le pré-calcul sur le fil d'exécution séparé peut être " +"très lent si la géométrie est composée de plein de maillages puisque l'accès " +"asynchrone à chaque maillage nécessite une lourde synchronisation. De plus, " +"veuillez noter que le pré-calculs sur un fil d'exécution séparé est " +"automatiquement désactivée sur les systèmes d'exploitation qui ne peuvent " +"pas utiliser des fils d'exécution (comme HTML5 si cette fonction est " +"désactivée)." #: doc/classes/NavigationMeshInstance.xml msgid "" @@ -47558,6 +47664,10 @@ msgid "" "identify the [NavigationMeshInstance] closest to a point on the merged " "navigation map." msgstr "" +"Retourne le [RID] de cette région sur [NavigationServer]. Combiné avec [" +"method NavigationServer.map_get_closest_point_owner], peut être utilisé pour " +"identifier le [NavigationMeshInstance] le plus proche d'un point d'une carte " +"de navigation fusionnée." #: doc/classes/NavigationMeshInstance.xml msgid "Determines if the [NavigationMeshInstance] is enabled or disabled." @@ -47590,11 +47700,13 @@ msgid "" "are multiplied with [code]travel_cost[/code] for determining the shortest " "path." msgstr "" +"Lorsque le cheminement se déplace à l'intérieur de cette région, les " +"distances parcourues sont multipliées par [code]travel_cost[/code] pour " +"déterminer le chemin le plus court." #: doc/classes/NavigationMeshInstance.xml -#, fuzzy msgid "Notifies when the navigation mesh bake operation is completed." -msgstr "Avertit quand une animation commence à jouer." +msgstr "" #: doc/classes/NavigationMeshInstance.xml msgid "Notifies when the [NavigationMesh] has changed." @@ -47613,12 +47725,22 @@ msgid "" "[b]Note:[/b] Obstacles are intended as a last resort option for constantly " "moving objects that cannot be (re)baked to a navigation mesh efficiently." msgstr "" +"Obstacle 3D utilisé dans la navigation pour éviter les collisions. " +"L'obstacle a besoin de données de navigation pour fonctionner correctement. " +"Cela peut être fait avec l'obstacle comme enfant d'un nÅ“ud [Navigation], ou " +"en utilisant [method set_navigation]. [NavigationObstacle] est sûr lors des " +"trames physiques.\n" +"[b]Note :[/b] Les obstacles sont conçus comme dernière option pour les " +"objets constamment mobiles qui ne peuvent pas être pré-calculés efficacement " +"dans un maillage de navigation." #: doc/classes/NavigationObstacle.xml msgid "" "Returns the [Navigation] node that the obstacle is using for its navigation " "system." msgstr "" +"Retourne le nÅ“ud [Navigation] que l'obstacle utilise pour son système de " +"navigation." #: doc/classes/NavigationObstacle.xml msgid "Returns the [RID] of this obstacle on the [NavigationServer]." @@ -47629,18 +47751,24 @@ msgid "" "Sets the [Navigation] node used by the obstacle. Useful when you don't want " "to make the obstacle a child of a [Navigation] node." msgstr "" +"Définit le nÅ“ud [Navigation] utilisé par l'obstacle. Utile lorsque vous ne " +"voulez pas faire l'obstacle un enfant d'un nÅ“ud [Navigation]." #: doc/classes/NavigationObstacle.xml doc/classes/NavigationObstacle2D.xml msgid "" "Enables radius estimation algorithm which uses parent's collision shapes to " "determine the obstacle radius." msgstr "" +"Active l'algorithme d'estimation de rayon qui utilise les formes de " +"collision des parents pour déterminer le rayon des obstacles." #: doc/classes/NavigationObstacle.xml doc/classes/NavigationObstacle2D.xml msgid "" "The radius of the agent. Used only if [member estimate_radius] is set to " "[code]false[/code]." msgstr "" +"Le rayon de l'agent. Utilisé uniquement si [member estimate_radius] est " +"[code]false[/code]." #: doc/classes/NavigationObstacle2D.xml msgid "2D obstacle used in navigation for collision avoidance." @@ -47655,12 +47783,22 @@ msgid "" "[b]Note:[/b] Obstacles are intended as a last resort option for constantly " "moving objects that cannot be (re)baked to a navigation mesh efficiently." msgstr "" +"L'obstacle 2D utilisé dans la navigation pour éviter les collisions. " +"L'obstacle a besoin de données de navigation pour fonctionner correctement. " +"Cela peut être fait avec l'obstacle comme enfant d'un nÅ“ud [Navigation2D], " +"ou en utilisant [method set_navigation]. [NavigationObstacle2D] est sûr lors " +"des trames physiques.\n" +"[b]Note :[/b] Les obstacles sont conçus comme dernière option pour les " +"objets constamment mobiles qui ne peuvent pas être pré-calculés efficacement " +"dans un maillage de navigation." #: doc/classes/NavigationObstacle2D.xml msgid "" "Returns the [Navigation2D] node that the obstacle is using for its " "navigation system." msgstr "" +"Retourne le nÅ“ud [Navigation2D] que l'obstacle utilise pour son système de " +"navigation." #: doc/classes/NavigationObstacle2D.xml msgid "Returns the [RID] of this obstacle on the [Navigation2DServer]." @@ -47671,12 +47809,16 @@ msgid "" "Sets the [Navigation2D] node used by the obstacle. Useful when you don't " "want to make the obstacle a child of a [Navigation2D] node." msgstr "" +"Définit le nÅ“ud [Navigation2D] utilisé par l'obstacle. Utile lorsque vous ne " +"voulez pas faire l'obstacle un enfant d'un nÅ“ud [Navigation2D]." #: doc/classes/NavigationPolygon.xml msgid "" "A node that has methods to draw outlines or use indices of vertices to " "create navigation polygons." msgstr "" +"Un nÅ“ud qui a des méthodes pour dessiner des contours ou utiliser des " +"indices de sommets pour créer des polygones de navigation." #: doc/classes/NavigationPolygon.xml msgid "" @@ -47702,6 +47844,27 @@ msgid "" "$NavigationPolygonInstance.navpoly = polygon\n" "[/codeblock]" msgstr "" +"Il y a deux façons de créer des polygones. Soit en utilisant la méthode [" +"method add_outline], soit en utilisant la méthode [method add_polygon].\n" +"Avec [method add_outline] :\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var outline = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, " +"50), Vector2(50, 0)])\n" +"polygon.add_outline(outline)\n" +"polygon.make_polygons_from_outlines()\n" +"$NavigationPolygonInstance.navpoly = polygon\n" +"[/codeblock]\n" +"Avec [method add_polygon] et les indices du tableau des sommets :\n" +"[codeblock]\n" +"var polygon = NavigationPolygon.new()\n" +"var vertices = PoolVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, " +"50), Vector2(50, 0)])\n" +"polygon.set_vertices(vertices)\n" +"var indices = PoolIntArray([0, 1, 2, 3])\n" +"polygon.add_polygon(indices)\n" +"$NavigationPolygonInstance.navpoly = polygon\n" +"[/codeblock]" #: doc/classes/NavigationPolygon.xml msgid "" @@ -47710,6 +47873,10 @@ msgid "" "make_polygons_from_outlines] in order for this array to be converted to " "polygons that the engine will use." msgstr "" +"Ajoute un [PoolVector2Array] qui contient les sommets d'un contour au " +"tableau interne qui contient tous les contours. Vous devez appeler [method " +"make_polygons_from_outlines] afin que ce tableau soit converti en polygones " +"que le moteur pourra utiliser." #: doc/classes/NavigationPolygon.xml msgid "" @@ -47718,18 +47885,26 @@ msgid "" "to call [method make_polygons_from_outlines] in order for this array to be " "converted to polygons that the engine will use." msgstr "" +"Ajoute un [PoolVector2Array] qui contient les sommets d'un contour au " +"tableau interne qui contient tous les contours à une position fixe. Vous " +"devez appeler [method make_polygons_from_outlines] afin que ce tableau soit " +"converti en polygones que le pourra utiliser." #: doc/classes/NavigationPolygon.xml msgid "" "Clears the array of the outlines, but it doesn't clear the vertices and the " "polygons that were created by them." msgstr "" +"Efface le tableau des contours, mais ça n'efface pas les sommets et les " +"polygones qui ont été créés par eux." #: doc/classes/NavigationPolygon.xml msgid "" "Clears the array of polygons, but it doesn't clear the array of outlines and " "vertices." msgstr "" +"Efface le tableau des polygones, mais ça n'effacera pas le tableau des " +"contours et des sommets." #: doc/classes/NavigationPolygon.xml msgid "" @@ -47738,17 +47913,25 @@ msgid "" "NavigationServer.region_set_navmesh] API directly (as 2D uses the 3D server " "behind the scene)." msgstr "" +"Retourne le [NavigationMesh] résultant de ce polygone de navigation. Ce " +"navmesh peut être utilisé pour mettre à jour le navmesh d'une région avec " +"l'API [method NavigationServer.region_set_navmesh] directement (comme la 2D " +"utilise le serveur 3D en interne)." #: doc/classes/NavigationPolygon.xml msgid "" "Returns a [PoolVector2Array] containing the vertices of an outline that was " "created in the editor or by script." msgstr "" +"Retourne un [PoolVector2Array] contenant les sommets d'un contour qui a été " +"créé dans l'éditeur ou par un script." #: doc/classes/NavigationPolygon.xml msgid "" "Returns the number of outlines that were created in the editor or by script." msgstr "" +"Retourne le nombre de contours qui ont été créés dans l'éditeur ou par un " +"script." #: doc/classes/NavigationPolygon.xml msgid "Returns the count of all polygons." @@ -47759,30 +47942,35 @@ msgid "" "Returns a [PoolVector2Array] containing all the vertices being used to " "create the polygons." msgstr "" +"Retourne un [PoolVector2Array] contenant tous les sommets utilisés pour " +"créer les polygones." #: doc/classes/NavigationPolygon.xml msgid "Creates polygons from the outlines added in the editor or by script." msgstr "" +"Crée des polygones des contours ajoutés dans l'éditeur ou par un script." #: doc/classes/NavigationPolygon.xml msgid "" "Removes an outline created in the editor or by script. You have to call " "[method make_polygons_from_outlines] for the polygons to update." msgstr "" +"Enlève un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" +"method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygon.xml msgid "" "Changes an outline created in the editor or by script. You have to call " "[method make_polygons_from_outlines] for the polygons to update." msgstr "" +"Change un aperçu créé dans l'éditeur ou par un script. Vous devez appeler [" +"method make_polygons_from_outlines] pour mettre à jour les polygones." #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "A region of the 2D navigation map." -msgstr "Prépare le maillage de navigation." +msgstr "" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "" "A region of the navigation map. It tells the [Navigation2DServer] what can " "be navigated and what cannot, based on its [NavigationPolygon] resource.\n" @@ -47801,24 +47989,24 @@ msgid "" "The pathfinding cost of traveling distances inside this region can be " "controlled with the [member travel_cost] multiplier." msgstr "" -"Une instance de [NavigationMesh]. Il signale au nÅ“ud [Navigation] ce qui " -"peut être navigué et ce qui ne peut pas, basé sur la ressource " -"[NavigationMesh].\n" -"Par défaut ce nÅ“ud s'enregistrera à la carte de navigation du [World] par " -"défaut. Si ce nÅ“ud est un enfant d'un nÅ“ud [Navigation], il s'inscrira à la " -"carte de navigation du nÅ“ud de navigation.\n" -"Deux régions peuvent être reliées l'une à l'autre si elles partagent un même " -"bord. Vous pouvez définir la distance minimale entre deux sommets " -"nécessaires pour connecter deux bords en utilisant [method NavigationServer." -"map_set_edge_connection_margin]\n" -"[b]Note :[/b] Le chevauchement de deux régions n'est pas suffisant pour " -"relier deux régions. Ils doivent partager un même bord.\n" -"Le coût d'entrée dans cette région d'une autre région peut être contrôlé " +"Une région de la carte de navigation. Il indique au [Navigation2DServer] ce " +"qui peut être navigué et ce qui ne peut pas l'être, en fonction de sa " +"ressource [NavigationPolygon].\n" +"Par défaut ce nÅ“ud s'enregistrera à la carte de navigation du [World2D] par " +"défaut. Si ce nÅ“ud est un enfant d'un nÅ“ud [Navigation2D], il s'inscrirea à " +"la carte de navigation du nÅ“ud de navigation.\n" +"Deux régions peuvent être reliées l'une à l'autre si elles partagent un bord " +"similaire. Vous pouvez définir la distance minimale entre deux sommets " +"nécessaires pour connecter deux bords en utilisant [method Navigation2DServer" +".map_set_edge_connection_margin]\n" +"[b]Note :[/b] Embiquer deux régions ne suffit pas pour relier ces deux " +"régions. Elles doivent partager un bord similaire.\n" +"Le coût de cheminement de cette région vers une autre peut être contrôlé " "avec la valeur [member enter_cost].\n" -"[b]Note : [/b] Cette valeur n'est pas ajoutée au coût du chemin lorsque la " +"[b]Note :[/b] Cette valeur n'est pas ajoutée au coût du chemin lorsque la " "position de départ est déjà dans cette région.\n" -"Le coût des distances de voyage dans cette région peut être contrôlé avec le " -"multiplicateur [member travel_cost]." +"Le coût de parcours des distances de cheminement à l'intérieur de cette " +"région peut être contrôlé avec le multiplicateur [member travel_cost]." #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -47827,11 +48015,14 @@ msgid "" "identify the [NavigationPolygonInstance] closest to a point on the merged " "navigation map." msgstr "" +"Retourne le [RID] de cette région sur le [Navigation2DServer]. Combiné avec [" +"method Navigation2DServer.map_get_closest_point_propriétaire] peut permettre " +"d'identifier le [NavigationPolygonInstance] le plus proche d'un point sur la " +"carte de navigation fusionnée." #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "Determines if the [NavigationPolygonInstance] is enabled or disabled." -msgstr "Détermine si le [NavigationMeshInstance] est actif ou non." +msgstr "Détermine si la [NavigationPolygonInstance] est active ou non." #: doc/classes/NavigationPolygonInstance.xml msgid "" @@ -47842,14 +48033,12 @@ msgid "" msgstr "" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "The [NavigationPolygon] resource to use." -msgstr "La ressource [NavigationMesh] à utiliser." +msgstr "La ressource [NavigationPolygon] à utiliser." #: doc/classes/NavigationServer.xml -#, fuzzy msgid "Server interface for low-level 3D navigation access." -msgstr "Interface de serveur pour l'accès audio de bas niveau." +msgstr "" #: doc/classes/NavigationServer.xml #, fuzzy @@ -47899,15 +48088,13 @@ msgstr "" "sans soucis." #: doc/classes/NavigationServer.xml -#, fuzzy msgid "Returns the map cell height." -msgstr "Retourne la taille du tableau." +msgstr "" #: doc/classes/NavigationServer.xml -#, fuzzy msgid "" "Returns the normal for the point returned by [method map_get_closest_point]." -msgstr "Renvoie l'inverse de la racine carrée du paramètre." +msgstr "" #: doc/classes/NavigationServer.xml msgid "" @@ -47921,15 +48108,16 @@ msgid "" "Returns the edge connection margin of the map. This distance is the minimum " "vertex distance needed to connect two edges from different regions." msgstr "" +"Retourne la marge de raccordement du bord de la carte. Cette distance est la " +"distance minimale nécessaire pour relier deux bords de différentes régions." #: doc/classes/NavigationServer.xml msgid "Returns the map's up direction." msgstr "Retourne la direction haut de la carte." #: doc/classes/NavigationServer.xml -#, fuzzy msgid "Set the map cell height used to weld the navigation mesh polygons." -msgstr "Définit le polygone de navigation de la tuile." +msgstr "" #: doc/classes/NavigationServer.xml msgid "Sets the map up direction." @@ -47942,6 +48130,10 @@ msgid "" "called in the main thread.\n" "[b]Note:[/b] This function is not thread safe." msgstr "" +"Traite les agents d'évitement de collision.\n" +"Le résultat de ce processus est nécessaire par le serveur de physique, de " +"sorte que cela doit être appelé dans le fil d'exécution principal.\n" +"[b]Note :[/b] Cette fonction n'est pas sûre entre plusieurs fils d'exécution." #: doc/classes/NavigationServer.xml msgid "Bakes the navigation mesh." @@ -47952,6 +48144,9 @@ msgid "" "Set the region's navigation layers. This allows selecting regions from a " "path request (when using [method NavigationServer.map_get_path])." msgstr "" +"Définir les calques de navigation de la région. Cela permet de sélectionner " +"les régions à partir d'une requête de chemin (en utilisant [method " +"NavigationServer.map_get_path])." #: doc/classes/NavigationServer.xml msgid "Control activation of this server." @@ -47986,16 +48181,16 @@ msgid "" msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." "ConnectionStatus]." -msgstr "Retourne l'état actuel de la connexion. Voir [enum ConnexionStatus]." +msgstr "" +"Retourne l'état actuel de la connexion. Voir [enum NetworkedMultiplayerPeer." +"ConnectionStatus]." #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "Set the max packet size that this peer can handle." -msgstr "Définit la texture de lumière à utiliser pour cette instance." +msgstr "" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -48074,7 +48269,7 @@ msgstr "" "Créer un client qui se connecte au serveur à [code]address[/code] donnée via " "le [code]port[/code]. L'adresse donnée doit être soit un nom de domaine " "entièrement qualifié (ex.: [code]\"www.example.com\"[/code]) ou une adresse " -"IP en format IPv4 ou IPv6 (par exemple [code]\"192.168.1.1\"[/code)]. Le " +"IP en format IPv4 ou IPv6 (par exemple [code]\"192.168.1.1\"[/code]). Le " "[code]port[/code] est le port que le serveur écoute. Les paramètres " "[code]in_bandwidth[/code] et [code]out_bandwidth[/code] peuvent être " "utilisés pour limiter la bande passante entrante et sortante, en octets par " @@ -48087,9 +48282,9 @@ msgstr "" "client a été créé, [constant ERR_ALREADY_IN_USE] si ce " "NetworkedMultiplayerENet a déjà une connexion ouverte (dans quel cas vous " "devez appeler [method close_connection] d'abord) ou [constant " -"ERR_CANT_CREATE] si le client ne peut pas être créé. Si [code]client_port[/" -"code] est spécifié, le client écoutera également le port donné ; ceci est " -"utile pour certaines techniques NAT transversale." +"ERR_CANT_CREATE] si le client ne peut pas être créé. Si " +"[code]client_port[/code] est spécifié, le client écoutera également le port " +"donné ; ceci est utile pour certaines techniques NAT transversale." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -48145,8 +48340,8 @@ msgid "" "Returns the channel of the next packet that will be retrieved via [method " "PacketPeer.get_packet]." msgstr "" -"Retourne le canal du prochain paquet qui sera récupéré via [method " -"PacketPeer.get_packet]" +"Retourne le canal du prochain paquet qui sera récupéré via [method PacketPeer" +".get_packet]." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml #: modules/websocket/doc_classes/WebSocketServer.xml @@ -48288,7 +48483,6 @@ msgstr "" "create_client] est utilisé à la place." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml -#, fuzzy msgid "" "Enable or disable certificate verification when [member use_dtls] is " "[code]true[/code]." @@ -48874,7 +49068,7 @@ msgstr "" "dans un script). Si le nÅ“ud a des enfants, sa méthode [méthod enter_tree] " "sera appelée d'abord, puis ensuite celle de ses enfants.\n" "Correspond à la notification [constant NOTIFICATION_ENTER_TREE] dans [method " -"Object._notification]" +"Object._notification]." #: doc/classes/Node.xml msgid "" @@ -49255,18 +49449,13 @@ msgid "" "[method get_node] instead. To avoid using [method find_parent] too often, " "consider caching the node reference into a variable." msgstr "" -"Trouve un parent de ce nÅ“ud dont le nom correspond à [code]mask[/code] " -"suivant le même fonctionnement que pour [method String.match] (c'est-à -dire " -"sensible à la casse, que [code]\"*\"[/code] correspond à un zéro au un seul " -"caractère, et que [code]\"?\"[/code] correspond à n'importe quel unique " -"caractère sauf [code]\".\"[/code]). Retourne [code]null[/code] si aucun " -"[Node] correspondant n'est trouvée.\n" +"Trouve le premier parent de ce nÅ“ud dont le nom correspond à " +"[code]mask[/code] suivant le même fonctionnement que pour [method String." +"match] (c'est-à -dire sensible à la casse, que [code]\"*\"[/code] correspond " +"à un zéro au un seul caractère, et que [code]\"?\"[/code] correspond à " +"n'importe quel unique caractère sauf [code]\".\"[/code]).\n" "[b]Note :[/b] La correspondance ne se fait pas sur le chemin complet mais " "juste les noms des nÅ“uds.\n" -"Si [code]owned[/code] est [code]true[/code], cette méthode ne trouve que des " -"nÅ“uds dont le propriétaire est ce nÅ“ud. Ceci est particulièrement important " -"pour les scènes instanciée par un script, parce que ces scènes n'ont pas de " -"propriétaire.\n" "[b]Note :[/b] Comme cette méthode liste tous les parents d'un nÅ“ud, c'est le " "moyen le plus lent d'obtenir une référence à un autre nÅ“ud. Dans la mesure " "du possible, essayez plutôt d'utiliser [method get_node]. Pour éviter " @@ -49420,7 +49609,7 @@ msgid "" "[/codeblock]" msgstr "" "Récupère un nÅ“ud et une de ses ressources comme spécifié par le sous-nom de " -"son [NodePath] (ex.: [code]Area2D/CollisionShape2D:shape[/code)]. Si " +"son [NodePath] (ex.: [code]Area2D/CollisionShape2D:shape[/code]). Si " "plusieurs ressources imbriquées sont spécifiées dans le [NodePath], seul le " "dernier sera récupéré.\n" "La valeur de retour est un tableau de 3 éléments : le premier élément est le " @@ -49480,10 +49669,10 @@ msgid "" "processing unless the frames per second is changed via [member Engine." "iterations_per_second]." msgstr "" -"Retourne le temps écoulé (en secondes) depuis la dernière trame physique " -"(voir [method _physics_process]). C'est toujours une valeur constante dans " -"le traitement de la physique à moins que les trames par seconde ne soient " -"changés via [member Engine.iterations_per_second]" +"Retourne le temps écoulé (en secondes) depuis la dernière trame physique (" +"voir [method _physics_process]). C'est toujours une valeur constante dans le " +"traitement de la physique à moins que les trames par seconde ne soient " +"changés via [member Engine.iterations_per_second]." #: doc/classes/Node.xml msgid "" @@ -49601,12 +49790,12 @@ msgid "" "See [member SceneTree.physics_interpolation] and [member ProjectSettings." "physics/common/physics_interpolation]." msgstr "" -"Retourne [code]true[/code] si l'interpolation physique est activée (voir " -"[member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" +"Retourne [code]true[/code] si l'interpolation physique est activée (voir [" +"member physics_interpolation_mode]) [b]et[/b] activée dans [SceneTree].\n" "Il s'agit d'une version pratique de [method is_physics_interpolated] qui " "vérifie également si l'interpolation physique est activée globalement.\n" "Voir [member SceneTree.physics_interpolation] et [member ProjectSettings." -"physics/common/physics_interpolation]" +"physics/common/physics_interpolation]." #: doc/classes/Node.xml msgid "" @@ -49700,7 +49889,7 @@ msgstr "" "Imprime l'arborescence dans la console. Utilisé principalement à des fins de " "débogage. Cette version affiche le chemin par rapport au nÅ“ud actuel, ce qui " "est utile pour le copier/coller dans la fonction [method get_node].\n" -"[ b]Exemple de sortie:[/b]\n" +"[b]Exemple de sortie:[/b]\n" "[codeblock]\n" "TheGame\n" "TheGame/Menu\n" @@ -49729,7 +49918,7 @@ msgstr "" "Cette version affiche une représentation plus graphique semblable à ce qui " "est affiché dans l'inspecteur de scène. C'est utile pour inspecter les " "grands arborescences.\n" -"[ b]Exemple de sortie:[/b]\n" +"[b]Exemple de sortie:[/b]\n" "[codeblock]\n" " â”–â•´TheGame\n" " â” â•´Menu\n" @@ -49851,7 +50040,7 @@ msgstr "" "d'enfants que le nÅ“ud remplacé avait.\n" "[b]Note :[/b] Le nÅ“ud remplacé n'est pas automatiquement libéré, donc vous " "devez le garder dans une variable pour une utilisation ultérieure ou le " -"libérer en utilisant [method Object.free]" +"libérer en utilisant [method Object.free]." #: doc/classes/Node.xml msgid "" @@ -49938,13 +50127,13 @@ msgid "" "By default, methods are not exposed to networking (and RPCs). See also " "[method rset] and [method rset_config] for properties." msgstr "" -"Change le mode RPC pour la [code]method[/code] donné pour le [code]mode[/" -"code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " -"d'annoter les méthodes et les propriétés avec les mots-clés correspondants " -"([code]remote[/code], [code]master[/code], [code]puppet[/code], " -"[code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code)]. " -"Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). Voir " -"aussi [method rset] et [method rset_config] pour les propriétés." +"Change le mode RPC pour la [code]method[/code] donné pour le " +"[code]mode[/code] spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une " +"alternative est d'annoter les méthodes et les propriétés avec les mots-clés " +"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" +", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" +". Par défaut, les méthodes ne sont pas exposées au réseaut (et aux RPC). " +"Voir aussi [method rset] et [method rset_config] pour les propriétés." #: doc/classes/Node.xml msgid "" @@ -49998,10 +50187,10 @@ msgstr "" "Change le mode RPC pour la [code]property[/code] donnée au [code]mode[/code] " "spécifié. Voir [enum MultiplayerAPI.RPCMode]. Une alternative est " "l'annotation des méthodes et des propriétés avec les mots-clés " -"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/" -"code], [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/" -"code)]. Par défaut, les propriétés ne sont pas exposées au réseau (et au " -"RPC). Voir aussi [method rpc] et [method rpc_config] pour les méthodes." +"correspondants ([code]remote[/code], [code]master[/code], [code]puppet[/code]" +", [code]remotesync[/code], [code]mastersync[/code], [code]puppetsync[/code])" +". Par défaut, les propriétés ne sont pas exposées au réseau (et au RPC). " +"Voir aussi [method rpc] et [method rpc_config] pour les méthodes." #: doc/classes/Node.xml msgid "" @@ -50249,11 +50438,13 @@ msgid "" msgstr "" #: doc/classes/Node.xml -#, fuzzy msgid "" "Notification received when the node is about to exit a [SceneTree].\n" "This notification is emitted [i]after[/i] the related [signal tree_exiting]." -msgstr "La notification reçue quand le nÅ“ud va quitter le [SceneTree]." +msgstr "" +"La notification reçue quand le nÅ“ud va quitter le [SceneTree].\n" +"Cette notification est émise [i]après[/i] le signal [signal tree_exiting] " +"correspondant." #: doc/classes/Node.xml msgid "Notification received when the node is moved in the parent." @@ -50547,9 +50738,8 @@ msgid "" msgstr "" #: doc/classes/NodePath.xml -#, fuzzy msgid "Pre-parsed scene tree path." -msgstr "Chemin de l'arborescence des scènes pré-analysé." +msgstr "Le chemin pré-analysé de l'arborescence des scènes." #: doc/classes/NodePath.xml msgid "" @@ -51580,19 +51770,16 @@ msgid "Sets an individual hole point position." msgstr "Définit la position d'un trou simple." #: doc/classes/OccluderShapePolygon.xml -#, fuzzy msgid "Sets an individual polygon point position." -msgstr "Définit la position d'un polygone simple." +msgstr "Définit la position d'un seul point d'un polygone." #: doc/classes/OccluderShapePolygon.xml -#, fuzzy msgid "Allows changing the hole geometry from code." -msgstr "Dessine une géométrie simple à partir du code." +msgstr "" #: doc/classes/OccluderShapePolygon.xml -#, fuzzy msgid "Allows changing the polygon geometry from code." -msgstr "Dessine une géométrie simple à partir du code." +msgstr "" #: doc/classes/OccluderShapePolygon.xml msgid "" @@ -51862,18 +52049,16 @@ msgid "Returns the text of the item at index [code]idx[/code]." msgstr "Retourne le texte de l'élément à l'index [code]idx[/code]." #: doc/classes/OptionButton.xml -#, fuzzy msgid "Returns the tooltip of the item at index [code]idx[/code]." -msgstr "Retourne le texte de l'élément à l'index [code]idx[/code]." +msgstr "Retourne l'infobulle de l'élément à l'index [code]idx[/code]." #: doc/classes/OptionButton.xml -#, fuzzy msgid "" "Returns the ID of the selected item, or [code]-1[/code] if no item is " "selected." msgstr "" -"Retourne la position de l’élément qui a actuellement le focus. Ou retourne " -"[code]-1[/code] si aucun n'a le focus." +"Retourne l'identifiant de l’élément sélectionné, ou [code]-1[/code] si aucun " +"n'est sélectionné." #: doc/classes/OptionButton.xml msgid "" @@ -51926,9 +52111,8 @@ msgid "Sets the text of the item at index [code]idx[/code]." msgstr "Définit le texte pour l'élément à l'index [code]idx[/code]." #: doc/classes/OptionButton.xml -#, fuzzy msgid "Sets the tooltip of the item at index [code]idx[/code]." -msgstr "Définit le texte pour l'élément à l'index [code]idx[/code]." +msgstr "Définit l'infobulle pour l'élément à l'index [code]idx[/code]." #: doc/classes/OptionButton.xml msgid "" @@ -52051,9 +52235,8 @@ msgstr "" "fils d'exécutions." #: doc/classes/OS.xml -#, fuzzy msgid "Centers the window on the screen if in windowed mode." -msgstr "Définit la position du nÅ“ud spécifié." +msgstr "" #: doc/classes/OS.xml msgid "" @@ -52212,18 +52395,16 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "Returns the scancode of the given string (e.g. \"Escape\")." -msgstr "Renvoie le reste de deux vecteurs." +msgstr "" #: doc/classes/OS.xml msgid "Returns the total number of available audio drivers." msgstr "Retourne le nombre total de périphériques audio." #: doc/classes/OS.xml -#, fuzzy msgid "Returns the audio driver name for the given index." -msgstr "Retourne le sommet à l’index donné." +msgstr "" #: doc/classes/OS.xml msgid "" @@ -52642,14 +52823,13 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "Returns the epoch time of the operating system in milliseconds." -msgstr "Retourne le temps epoch du système d'exploitation en millisecondes." +msgstr "" +"Retourne l'heure de l'époque du système d'exploitation en millisecondes." #: doc/classes/OS.xml -#, fuzzy msgid "Returns the epoch time of the operating system in seconds." -msgstr "Retourne le temps epoch du système d'exploitation en secondes." +msgstr "Retourne l'heure de l'époque du système d'exploitation en secondes." #: doc/classes/OS.xml msgid "" @@ -52766,9 +52946,8 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "Returns the number of video drivers supported on the current platform." -msgstr "Renvoie le nombre de points sur l'axe de mélange." +msgstr "" #: doc/classes/OS.xml msgid "" @@ -52816,9 +52995,8 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "Returns [code]true[/code] if there is content on the clipboard." -msgstr "Retourne [code]true[/code] si l'[AABB] est plate ou vide." +msgstr "Retourne [code]true[/code] si le presse-papiers n'est pas vide." #: doc/classes/OS.xml msgid "" @@ -52840,19 +53018,19 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the device has a touchscreen or emulates one." -msgstr "Retourne [code]true[/code] (vrai) si la chaîne de caractères est vide." +msgstr "" +"Retourne [code]true[/code] si le périphérique à un écran tactile ou en " +"simule un." #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the platform has a virtual keyboard, " "[code]false[/code] otherwise." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide, ou " -"[code]false[/code] le cas échéant." +"Retourne [code]true[/code] si la plateforme à un clavier virtuel (non " +"physique), ou [code]false[/code] sinon." #: doc/classes/OS.xml msgid "Hides the virtual keyboard if it is shown, does nothing otherwise." @@ -52887,11 +53065,10 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the input scancode corresponds to a Unicode " "character." -msgstr "Retourne [code]true[/code] si l'[AABB] chevauche une autre." +msgstr "" #: doc/classes/OS.xml msgid "" @@ -53196,7 +53373,6 @@ msgstr "" "Windows." #: doc/classes/OS.xml -#, fuzzy msgid "" "Requests the OS to open a resource with the most appropriate program. For " "example:\n" @@ -53223,12 +53399,12 @@ msgstr "" "d'accueil de Godot dans le navigateur web par défaut.\n" "- [code]OS.shell_open(\"mailto:example@example.com\")[/code] ouvrira le " "client mail par défaut avec le champs destinataire définit à " -"[code]example@example.com[/code]. Voir [url=https://blog.escapecreative.com/" -"customizing-mailto-links/]Personnaliser les liens [code]mailto:[/code][/url] " -"pour la liste des champs qui peuvent être ajoutés.\n" +"[code]example@example.com[/code]. Voir [url=https://datatracker.ietf.org/doc/" +"html/rfc2368]RFC 2368 - The [code]mailto[/code] URL scheme[/url] pour la " +"liste des champs qui peuvent être ajoutés.\n" "Utilisez [method ProjectSettings.globalize_path] pour convertir un chemin " -"[code]res://[/code] ou [code]user://[/code] en chemin système pour utiliser " -"avec cette méthode.\n" +"[code]res://[/code] ou [code]user://[/code] en chemin système qui peut être " +"utilisé avec cette méthode.\n" "[b]Note :[/b] Cette méthode est implémentée sous Android, iOS, HTML5, Linux, " "macOS et Windows." @@ -53272,12 +53448,12 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "" "If [code]true[/code], the engine tries to keep the screen on while the game " "is running. Useful on mobile." msgstr "" -"Si [code]true[/code], le mouvement linéaire à travers l’axe Z est limité." +"Si [code]true[/code], Le moteur tente de garder l'écran allumé quand le jeu " +"est lancé. Utile sur les mobiles." #: doc/classes/OS.xml msgid "" @@ -54335,9 +54511,8 @@ msgid "" msgstr "" #: doc/classes/Particles.xml -#, fuzzy msgid "Maximum number of draw passes supported." -msgstr "Nombre maximal de passes de tirage prises en charge." +msgstr "Le nombre maximal de passes de dessin supporté." #: doc/classes/Particles2D.xml msgid "GPU-based 2D particle emitter." @@ -55015,11 +55190,10 @@ msgstr "" "dans les versions finales." #: doc/classes/Performance.xml -#, fuzzy msgid "Available static memory. Not available in release builds." msgstr "" "La mémoire statique disponible. N'est pas utilisable dans les versions " -"finales." +"exportés sans le mode débogage." #: doc/classes/Performance.xml msgid "Available dynamic memory. Not available in release builds." @@ -55852,9 +56026,8 @@ msgid "" msgstr "" #: doc/classes/Physics2DServer.xml -#, fuzzy msgid "Returns the value of a damped spring joint parameter." -msgstr "Renvoie la valeur opposée du paramètre." +msgstr "" #: doc/classes/Physics2DServer.xml #, fuzzy @@ -55862,8 +56035,8 @@ msgid "" "Sets a damped spring joint parameter. See [enum DampedStringParam] for a " "list of available parameters." msgstr "" -"Définit la valeur d’un paramètre de zone. Voir [enum AreaParameter] pour une " -"liste de paramètres disponibles." +"Définit la valeur d’un paramètre de zone. Voir [enum DampedStringParam] pour " +"une liste de paramètres disponibles." #: doc/classes/Physics2DServer.xml msgid "" @@ -56831,18 +57004,16 @@ msgid "Creates a [SliderJoint]." msgstr "Crée un [SliderJoint]." #: doc/classes/PhysicsServer.xml -#, fuzzy msgid "Gets the priority value of the Joint." -msgstr "Renvoie la valeur opposée du paramètre." +msgstr "" #: doc/classes/PhysicsServer.xml msgid "Returns the type of the Joint." msgstr "Retourne le type de Joint." #: doc/classes/PhysicsServer.xml -#, fuzzy msgid "Sets the priority value of the Joint." -msgstr "Renvoie la valeur opposée du paramètre." +msgstr "Définit la priorité de la valeur du Joint." #: doc/classes/PhysicsServer.xml msgid "" @@ -57123,20 +57294,17 @@ msgid "" msgstr "" #: doc/classes/PhysicsServer.xml -#, fuzzy msgid "If set, linear motion is possible within the given limits." msgstr "" -"Si [code]set[/code] il y a un mouvement linéaire possible dans les limites " -"données." +"Si définit, le mouvement linéaire est possible dans les limites données." #: doc/classes/PhysicsServer.xml msgid "If set, rotational motion is possible." msgstr "Si définit, la rotation est possible." #: doc/classes/PhysicsServer.xml -#, fuzzy msgid "If set, there is a rotational motor across these axes." -msgstr "La vitesse de toutes les rotations à travers l’axe X." +msgstr "" #: doc/classes/PhysicsServer.xml msgid "" @@ -57197,14 +57365,12 @@ msgid "Sets the [Shape] that will be used for collision/intersection queries." msgstr "" #: doc/classes/PhysicsShapeQueryParameters.xml -#, fuzzy msgid "If [code]true[/code], the query will take [Area]s into account." -msgstr "Si [code]true[/code], la texture sera centrée." +msgstr "Si [code]true[/code], le requête prendra les [Area] en compte." #: doc/classes/PhysicsShapeQueryParameters.xml -#, fuzzy msgid "If [code]true[/code], the query will take [PhysicsBody]s into account." -msgstr "Si [code]true[/code], la texture sera centrée." +msgstr "Si [code]true[/code], le requête prendra les [PhysicsBody] en compte." #: doc/classes/PinJoint.xml #, fuzzy @@ -57230,13 +57396,10 @@ msgid "" msgstr "" #: doc/classes/PinJoint.xml -#, fuzzy msgid "" "If above 0, this value is the maximum value for an impulse that this Joint " "produces." msgstr "" -"Retourne quand la mot clé [code]keyword[/code] spécifié a une couleur de " -"défini ou non." #: doc/classes/PinJoint2D.xml #, fuzzy @@ -57275,11 +57438,8 @@ msgid "" msgstr "" #: doc/classes/Plane.xml -#, fuzzy msgid "Creates a plane from the three points, given in clockwise order." -msgstr "" -"Crée un plan à partir des trois points, donné dans le sens des aiguilles " -"d’une montre." +msgstr "Crée un plan à partir de trois points, spécifiés dans le sens horaire." #: doc/classes/Plane.xml msgid "Creates a plane from the normal and the plane's distance to the origin." @@ -57507,9 +57667,8 @@ msgid "Returns the path to the node associated with the specified bone." msgstr "Retourne le chemin d’accès au nÅ“ud associé à l’os spécifié." #: doc/classes/Polygon2D.xml -#, fuzzy msgid "Returns the height values of the specified bone." -msgstr "Retourne la hauteur de l'os spécifié." +msgstr "Retourne les valeurs de hauteur de l'os spécifié." #: doc/classes/Polygon2D.xml msgid "Sets the path to the node associated with the specified bone." @@ -57780,9 +57939,8 @@ msgstr "Change l'octet à la position donnée." #: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml #: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml #: doc/classes/PoolVector3Array.xml -#, fuzzy msgid "Sorts the elements of the array in ascending order." -msgstr "Retire l' élément du tableau à l'index donné." +msgstr "Tris les éléments du tableau dans l'ordre croissant." #: doc/classes/PoolByteArray.xml msgid "" @@ -57794,7 +57952,6 @@ msgstr "" "nouveau [PoolByteArray]. Chaque index négatif partira de la fin du tableau." #: doc/classes/PoolColorArray.xml -#, fuzzy msgid "A pooled array of [Color]s." msgstr "Un tableau compacté de [Color]." @@ -57959,9 +58116,8 @@ msgid "Changes the int at the given index." msgstr "Modifie le [int] à l’index donné." #: doc/classes/PoolRealArray.xml -#, fuzzy msgid "A pooled array of real numbers ([float])." -msgstr "Un tableau compacté de flottants ([float])." +msgstr "Un tableau compacté de nombres réels (des flottants, [float])." #: doc/classes/PoolRealArray.xml msgid "" @@ -58040,7 +58196,6 @@ msgid "Changes the float at the given index." msgstr "Change la flottant à la position donnée." #: doc/classes/PoolStringArray.xml -#, fuzzy msgid "A pooled array of [String]s." msgstr "Un tableau compacté de [String]." @@ -58119,7 +58274,6 @@ msgid "Changes the [String] at the given index." msgstr "Change la [String] à la position donnée." #: doc/classes/PoolVector2Array.xml -#, fuzzy msgid "A pooled array of [Vector2]s." msgstr "Un tableau compacté de [Vector2]." @@ -58201,7 +58355,6 @@ msgid "A pooled array of [Vector3]." msgstr "Un tableau compacté de [Vector3]." #: doc/classes/PoolVector3Array.xml -#, fuzzy msgid "" "An array specifically designed to hold [Vector3]. Optimized for memory " "usage, does not fragment the memory.\n" @@ -58364,9 +58517,8 @@ msgstr "" "[WindowDialog]." #: doc/classes/PopupDialog.xml -#, fuzzy msgid "Sets a custom [StyleBox] for the panel of the [PopupDialog]." -msgstr "[StyleBox] par défaut pour le [Button]." +msgstr "" #: doc/classes/PopupMenu.xml msgid "PopupMenu displays a list of options." @@ -58596,7 +58748,6 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -#, fuzzy msgid "" "Returns the tooltip associated with the specified index [code]idx[/code]." msgstr "Retourne l'infobulle associée avec l'index [code]idx[/code] spécifié." @@ -58659,9 +58810,8 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -#, fuzzy msgid "Sets the currently focused item as the given [code]index[/code]." -msgstr "Retourne la position du point à l'index [code]point[/code]." +msgstr "" #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." @@ -58751,11 +58901,10 @@ msgstr "" "spécifié." #: doc/classes/PopupMenu.xml -#, fuzzy msgid "" "Toggles the check state of the item of the specified index [code]idx[/code]." msgstr "" -"Active l'état de contrôle de l'élément de l'index spécifié [code]idx[/code]." +"Bascule l'état de contrôle de l'élément de l'index [code]idx[/code] spécifié." #: doc/classes/PopupMenu.xml msgid "" @@ -59169,9 +59318,8 @@ msgid "" msgstr "" #: doc/classes/ProceduralSky.xml -#, fuzzy msgid "Amount of energy contribution from the sun." -msgstr "Montant de la contribution énergétique du ciel." +msgstr "La quantité de contribution énergétique du ciel." #: doc/classes/ProceduralSky.xml msgid "The sun's height using polar coordinates." @@ -59423,6 +59571,16 @@ msgid "" "specify the offset in bytes to the start of the resource pack. This is only " "supported for .pck files." msgstr "" +"Charge le contenu du fichier .pck ou .zip spécifié par [code]pack[/code] " +"dans le système de fichiers de ressources ([code]res://[/code]). Retourne " +"[code]true[/code] en cas de succès.\n" +"[b]Note :[/b] Si un fichier de [code]pack[/code] partage le même chemin " +"qu'un fichier déjà dans le système de fichiers de ressources, toute " +"tentative de charger ce fichier utilisera le fichier de [code]pack[/code] " +"sauf si [code]replace_files[/code] est défini à [code]false[/code].\n" +"[b]Note :[/b] Le paramètre optionnel [code]offset[/code] peut être utilisé " +"pour spécifier le décalage en octets au début du pack de ressources. Ceci " +"n'est pris en charge que pour les fichiers .pck." #: doc/classes/ProjectSettings.xml msgid "" @@ -59430,18 +59588,25 @@ msgid "" "to the absolute, native OS [code]path[/code]. See also [method " "globalize_path]." msgstr "" +"Retourne le chemin localisé (démarrant par [code]res://[/code]) " +"correspondant au chemin [code]path[/code] absolu et natif du système " +"d'exploitation. Voir aussi [method globalize_path]." #: doc/classes/ProjectSettings.xml msgid "" "Returns [code]true[/code] if the specified property exists and its initial " "value differs from the current value." msgstr "" +"Retourne [code]true[/code] si la propriété spécifiée existe et sa valeur " +"initiale diffère de la valeur actuelle." #: doc/classes/ProjectSettings.xml msgid "" "Returns the specified property's initial value. Returns [code]null[/code] if " "the property does not exist." msgstr "" +"Retourne la valeur initiale de la propriété spécifiée. Retourne " +"[code]null[/code] si la propriété n'existe pas." #: doc/classes/ProjectSettings.xml msgid "" @@ -59451,6 +59616,12 @@ msgid "" "want to change project settings in exported projects, use [method " "save_custom] to save [code]override.cfg[/code] file." msgstr "" +"Enregistre la configuration du fichier [code]project.godot[/code].\n" +"[b]Note :[/b] Cette méthode est destinée à être utilisée par les greffons de " +"l'éditeur, puisque [ProjectSettings] ne peut pas être modifié puis chargé " +"directement dans une application lancée. Si vous voulez modifier les " +"paramètres de projet depuis un projet exporté, utilisez [method save_custom] " +"pour enregistrer le fichier [code]override.cfg[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -59460,18 +59631,28 @@ msgid "" "code] file, which is also text, but can be used in exported projects unlike " "other formats." msgstr "" +"Enregistre la configuration vers un fichier personnalisé. L'extension de " +"fichier doit être [code].godot[/code] (pour enregistrer dans le format " +"[ConfigFile] au format texte) ou [code].binary[/code] (pour enregistrer au " +"format binaire). Vous pouvez également enregistrer le fichier [code]override." +"cfg[/code], qui est également au format texte, mais peut être utilisé dans " +"des projets exportés contrairement aux autres formats." #: doc/classes/ProjectSettings.xml msgid "" "Sets the specified property's initial value. This is the value the property " "reverts to." msgstr "" +"Définit la valeur initiale de la propriété spécifiée. C'est cette valeur qui " +"sera rétablie pour cette propriété." #: doc/classes/ProjectSettings.xml msgid "" "Sets the order of a configuration value (influences when saved to the config " "file)." msgstr "" +"Définit l'ordre d'une valeur de configuration (qui a une influence quand " +"sauvegardée dans le fichier de configuration)." #: doc/classes/ProjectSettings.xml msgid "" @@ -59483,6 +59664,14 @@ msgid "" "This can also be used to erase custom project settings. To do this change " "the setting value to [code]null[/code]." msgstr "" +"Définit la valeur d'un réglage.\n" +"[b]Exemple :[/b]\n" +"[codeblock]\n" +"ProjectSettings.set_setting(\"application/config/name\", \"Example\")\n" +"/[codeblock]\n" +"Cela peut également être utilisé pour effacer les paramètres de projet " +"personnalisés. Pour ce faire, utilisez la valeur [code]null[/code] pour le " +"réglage." #: doc/classes/ProjectSettings.xml msgid "" @@ -59507,6 +59696,9 @@ msgid "" "(preserving the aspect ratio) when the engine starts. If [code]false[/code], " "the engine will leave it at the default pixel size." msgstr "" +"Si [code]true[/code], étire l'image au lancement du jeu suivant la taille de " +"la fenêtre (et préserve le ratio). Si [code]false[/code], l'image sera " +"affichée par défaut suivant sa taille en pixels." #: doc/classes/ProjectSettings.xml msgid "" @@ -59515,6 +59707,10 @@ msgid "" "[b]Note:[/b] Only effective if [member application/boot_splash/show_image] " "is [code]true[/code]." msgstr "" +"Le chemin vers une image utilisée au lancement du jeu. Si vide, l'image avec " +"le logo de Godot sera affichée à la place.\n" +"[b]Note :[/b] Ne fonctionne que si [member application/boot_splash/" +"show_image] est [code]true[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -59523,6 +59719,10 @@ msgid "" "displays the plain color specified in [member application/boot_splash/" "bg_color]." msgstr "" +"Si [code]true[/code], affiche l'image spécifiée dans [member application/" +"boot_splash/image] lorsque le moteur démarre. Si [code]false[/code], affiche " +"seulement la couleur spécifiée dans [member application/boot_splash/" +"bg_color]." #: doc/classes/ProjectSettings.xml msgid "" @@ -59530,6 +59730,10 @@ msgid "" "(recommended for high-resolution artwork). If [code]false[/code], uses " "nearest-neighbor interpolation (recommended for pixel art)." msgstr "" +"Si [code]true[/code], applique le filtrage linéaire pour l'étirement de " +"l'image (recommandé pour les images à haute résolution.) Si " +"[code]false[/code], utilise l'interpolation la plus proche (recommandée pour " +"le pixel-art)." #: doc/classes/ProjectSettings.xml msgid "" @@ -59543,24 +59747,41 @@ msgid "" "The [member application/config/use_custom_user_dir] setting must be enabled " "for this to take effect." msgstr "" +"Ce dossier utilisateur est utilisé pour stocker des données persistantes (le " +"système de fichiers [code]user://[/code]). Si laissé vide, " +"[code]user://[/code] va pointer vers un dossier spécifique au projet suivant " +"la configuration de Godot (voir [method OS.get_user_data_dir]). Si un nom de " +"dossier personnalisé est défini, ce nom sera utilisé à la place, puis ajouté " +"au dossier de données utilisateur spécifique au système (le même dossier " +"parent que celui configuration Godot documenté dans [method OS." +"get_user_data_dir]).\n" +"Le paramètre [member application/config/use_custom_user_dir] doit être actif " +"pour que cela fonctionne." #: doc/classes/ProjectSettings.xml msgid "" "The project's description, displayed as a tooltip in the Project Manager " "when hovering the project." msgstr "" +"La description du projet, affichée en tant qu'infobulle dans le Gestionnaire " +"de projet quand le projet est survolé." #: doc/classes/ProjectSettings.xml msgid "" "Icon used for the project, set when project loads. Exporters will also use " "this icon when possible." msgstr "" +"L'icône utilisée pour le projet, défini au chargement du projet. Les " +"exportateurs utiliseront également cette icône si possible." #: doc/classes/ProjectSettings.xml msgid "" "Icon set in [code].icns[/code] format used on macOS to set the game's icon. " "This is done automatically on start by calling [method OS.set_native_icon]." msgstr "" +"L'icône définit dans le format [code].icns[/code] utilisé sur macOS pour " +"définir l'icône du jeu. Ceci est fait automatiquement au lancement en " +"appelant [method OS.set_native_icon]." #: doc/classes/ProjectSettings.xml msgid "" @@ -59609,12 +59830,28 @@ msgid "" "default can impact compatibility with some external tools or plugins which " "expect the default [code].import[/code] folder." msgstr "" +"Si [code]true[/code], le projet utilisera un dossier caché ([code]." +"import[/code]) pour stocker des données spécifiques au projet (métadonnées, " +"cache des shaders, etc.)\n" +"Si [code]false[/code], un dossier non caché ([code]import[/code]) sera " +"utilisé à la place.\n" +"[b]Note :[/b] Vous devez redémarrer l'application après avoir modifié ce " +"réglage.\n" +"[b]Note :[/b] Changer cette valeur peut aider sur les plateformes ou avec " +"des outils tiers où les modèles de dossier cachés ne sont pas autorisés. Il " +"suffit de modifier ce paramètre si vous savez que votre environnement " +"l'exige, car le changer par défaut peut impacter la compatibilité avec " +"certains outils ou greffons externes qui s'attendent à ce que le dossier par " +"défaut soit [code].import[/code]." #: doc/classes/ProjectSettings.xml msgid "" "Icon set in [code].ico[/code] format used on Windows to set the game's icon. " "This is done automatically on start by calling [method OS.set_native_icon]." msgstr "" +"L'icône définit dans le format [code].ico[/code] utilisé sur Windows pour " +"définir l'icône du jeu. Ceci est fait automatiquement au lancement en " +"appelant [method OS.set_native_icon]." #: doc/classes/ProjectSettings.xml msgid "" @@ -59844,11 +60081,10 @@ msgstr "" "ne généreront pas d'avertissements." #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "If [code]true[/code], enables warnings when the type of the default value " "set to an exported variable is different than the specified export type." -msgstr "Si [code]true[/code], le filtrage est activé." +msgstr "" #: doc/classes/ProjectSettings.xml msgid "" @@ -60000,17 +60236,14 @@ msgstr "" "qui n'est pas garantie d'exister dans la classe à la compilation." #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "If [code]true[/code], enables warnings when a function parameter is unused." msgstr "" -"Si [code]true[/code], le mouvement linéaire à travers l’axe Z est limité." #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "If [code]true[/code], enables warnings when a member variable is unused." -msgstr "Si [code]true[/code], le filtrage est activé." +msgstr "" #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], enables warnings when a signal is unused." @@ -60100,42 +60333,57 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "Maximum call stack in visual scripting, to avoid infinite recursion." msgstr "" +"Le nombre maximal de la pile d'appels dans le script visuel, pour éviter une " +"récursion infinie." #: doc/classes/ProjectSettings.xml msgid "" "Color of the contact points between collision shapes, visible when \"Visible " "Collision Shapes\" is enabled in the Debug menu." msgstr "" +"La couleur des points de contact entre les formes de collision, visible " +"lorsque \"Formes de collision visibles\" est activé dans le menu Débogage." #: doc/classes/ProjectSettings.xml msgid "" "Sets whether 2D physics will display collision outlines in game when " "\"Visible Collision Shapes\" is enabled in the Debug menu." msgstr "" +"Définit si la physique 2D affichera les contours de collision dans le jeu " +"lorsque \"Formes de collision visibles\" est activé dans le menu Débogage." #: doc/classes/ProjectSettings.xml msgid "" "Maximum number of contact points between collision shapes to display when " "\"Visible Collision Shapes\" is enabled in the Debug menu." msgstr "" +"Le nombre maximal de points de contact entre les formes de collision à " +"afficher lorsque \"Formes de collision visibles\" est activé dans le menu " +"Débogage." #: doc/classes/ProjectSettings.xml msgid "" "Color of the collision shapes, visible when \"Visible Collision Shapes\" is " "enabled in the Debug menu." msgstr "" +"La couleur des formes de collision, visible lorsque \"Formes de collision " +"visibles\" est activé dans le menu Débogage." #: doc/classes/ProjectSettings.xml msgid "" "Color of the disabled navigation geometry, visible when \"Visible " "Navigation\" is enabled in the Debug menu." msgstr "" +"La couleur de la géométrie de navigation désactivée, visible lorsque " +"\"Navigation visible\" est activée dans le menu Débogage." #: doc/classes/ProjectSettings.xml msgid "" "Color of the navigation geometry, visible when \"Visible Navigation\" is " "enabled in the Debug menu." msgstr "" +"La couleur de la géométrie de navigation, visible lorsque \"Navigation " +"visible\" est activée dans le menu Débogage." #: doc/classes/ProjectSettings.xml msgid "Custom image for the mouse cursor (limited to 256×256)." @@ -60332,18 +60580,25 @@ msgid "" "Load the previously opened VCS plugin when the editor starts up. This is set " "to [code]true[/code] whenever a new VCS plugin is initialized." msgstr "" +"Charge le greffon VCS précédemment ouvert dès que l'éditeur démarre. Ceci " +"est défini à [code]true[/code] chaque fois qu'un nouveau greffon VCS est " +"initialisé." #: doc/classes/ProjectSettings.xml msgid "" "Last loaded VCS plugin name. Used to autoload the plugin when the editor " "starts up." msgstr "" +"Le dernier nom de greffon VCS chargé. Utilisé pour recharger le greffon dès " +"que l'éditeur démarre." #: doc/classes/ProjectSettings.xml msgid "" "Default value for [member ScrollContainer.scroll_deadzone], which will be " "used for all [ScrollContainer]s unless overridden." msgstr "" +"La valeur par défaut pour [member ScrollContainer.scroll_deadzone], qui sera " +"utilisé pour tous les [ScrollContainer] à moins d'être surchargé." #: doc/classes/ProjectSettings.xml msgid "" @@ -60363,6 +60618,8 @@ msgid "" "If [code]true[/code], swaps OK and Cancel buttons in dialogs on Windows and " "UWP to follow interface conventions." msgstr "" +"Si [code]true[/code], échange des boutons OK et Annuler dans les dialogues " +"sur Windows et UWP pour suivre les conventions d'interface." #: doc/classes/ProjectSettings.xml msgid "" @@ -60375,6 +60632,8 @@ msgid "" "Path to a custom [Font] resource to use as default for all GUI elements of " "the project." msgstr "" +"Le chemin vers une [Font] personnalisée à utiliser par défaut pour tous les " +"éléments graphiques du projet." #: doc/classes/ProjectSettings.xml msgid "If [code]true[/code], makes sure the theme used works with HiDPI." @@ -60578,208 +60837,278 @@ msgid "" "If [code]true[/code], sends mouse input events when tapping or swiping on " "the touchscreen." msgstr "" +"Si [code]true[/code], envoie des événements d'entrée de la souris lorsque " +"vous tapez ou glissez sur l'écran tactile." #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], sends touch input events when clicking or dragging the " "mouse." msgstr "" +"Si [code]true[/code], envoie des événements d'entrée tactile lorsque vous " +"cliquez ou faites glisser la souris." #: doc/classes/ProjectSettings.xml msgid "Default delay for touch events. This only affects iOS devices." msgstr "" +"Un retard par défaut pour les événements tactiles. Cela n'affecte que les " +"appareils iOS." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 1. If left empty, the layer will " "display as \"Layer 1\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 1. Si vide, le " +"calque s'affichera comme \"Calque 1\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 10. If left empty, the layer will " "display as \"Layer 10\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 10. Si vide, la " +"calque s'affichera comme \"Calque 10\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 11. If left empty, the layer will " "display as \"Layer 11\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 11. Si vide, la " +"calque s'affichera comme \"Calque 11\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 12. If left empty, the layer will " "display as \"Layer 12\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 12. Si vide, la " +"calque s'affichera comme \"Calque 12\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 13. If left empty, the layer will " "display as \"Layer 13\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 13. Si vide, la " +"calque s'affichera comme \"Calque 13\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 14. If left empty, the layer will " "display as \"Layer 14\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 14. Si vide, la " +"calque s'affichera comme \"Calque 14\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 15. If left empty, the layer will " "display as \"Layer 15\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 15. Si vide, la " +"calque s'affichera comme \"Calque 15\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 16. If left empty, the layer will " "display as \"Layer 16\"." msgstr "" +"Nom facultatif pour la calque de navigation 2D numéro 16. Si vide, la calque " +"s'affichera comme \"Calque 16\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 17. If left empty, the layer will " "display as \"Layer 17\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 17. Si vide, la " +"calque s'affichera comme \"Calque 17\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 18. If left empty, the layer will " "display as \"Layer 18\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 18. Si vide, la " +"calque s'affichera comme \"Calque 18\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 19. If left empty, the layer will " "display as \"Layer 19\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 19. Si vide, la " +"calque s'affichera comme \"Calque 19\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 2. If left empty, the layer will " "display as \"Layer 2\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 2. Si vide, la " +"calque affichera comme « calque 2 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 20. If left empty, the layer will " "display as \"Layer 20\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 20. Si vide, la " +"calque s'affichera comme \"Calque 20\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 21. If left empty, the layer will " "display as \"Layer 21\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 21. Si vide, la " +"calque s'affichera comme \"Calque 21\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 22. If left empty, the layer will " "display as \"Layer 22\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 22. Si vide, la " +"calque s'affichera comme \"Calque 22\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 23. If left empty, the layer will " "display as \"Layer 23\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 23. Si vide, la " +"calque s'affichera comme \"Calque 23\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 24. If left empty, the layer will " "display as \"Layer 24\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 24. Si vide, la " +"calque s'affichera comme \"Calque 24\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 25. If left empty, the layer will " "display as \"Layer 25\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 25. Si vide, la " +"calque s'affichera comme \"Calque 25\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 26. If left empty, the layer will " "display as \"Layer 26\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 26. Si vide, la " +"calque s'affichera comme \"Calque 26\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 27. If left empty, the layer will " "display as \"Layer 27\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 27. Si vide, la " +"calque s'affichera comme \"Calque 27\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 28. If left empty, the layer will " "display as \"Layer 28\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 28. Si vide, la " +"calque s'affichera comme \"Calque 28\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 29. If left empty, the layer will " "display as \"Layer 29\"." msgstr "" +"Nom facultatif pour la calque de navigation 2D numéro 29. Si vide, la calque " +"s'affichera comme \"Calque 29\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 3. If left empty, the layer will " "display as \"Layer 3\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 3. Si vide, la " +"calque s'affichera comme « calque 3 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 30. If left empty, the layer will " "display as \"Layer 30\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 30. Si vide, la " +"calque s'affichera comme \"Calque 30\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 31. If left empty, the layer will " "display as \"Layer 31\"." msgstr "" +"Nom facultatif pour la calque de navigation 2D numéro 31. Si vide, la calque " +"s'affichera comme \"Calque 31\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 32. If left empty, the layer will " "display as \"Layer 32\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 32. Si vide, la " +"calque s'affichera comme \"Calque 32\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 4. If left empty, the layer will " "display as \"Layer 4\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 4. Si vide, la " +"calque apparaîtra comme \"Calque 4\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 5. If left empty, the layer will " "display as \"Layer 5\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 5. Si vide, le " +"calque affichera comme \"Calque 5\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 6. If left empty, the layer will " "display as \"Layer 6\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 6. Si vide, la " +"calque apparaîtra comme \"Calque 6\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 7. If left empty, the layer will " "display as \"Layer 7\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 7. Si vide, la " +"calque s'affichera comme « calque 7 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 8. If left empty, the layer will " "display as \"Layer 8\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 8. Si vide, la " +"calque s'affichera comme \"Calque 8\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 2D navigation layer 9. If left empty, the layer will " "display as \"Layer 9\"." msgstr "" +"Le nom optionnel pour la calque de navigation 2D numéro 9. Si vide, la " +"calque s'affichera comme \"Calque 9\"." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 2D physics layer 1." @@ -60994,192 +61323,256 @@ msgid "" "Optional name for the 3D navigation layer 1. If left empty, the layer will " "display as \"Layer 1\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 1. Si vide, le " +"calque s'affichera comme \"Calque 1\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 10. If left empty, the layer will " "display as \"Layer 10\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 10. Si vide, la " +"calque s'affichera comme \"Calque 10\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 11. If left empty, the layer will " "display as \"Layer 11\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 11. Si vide, la " +"calque s'affichera comme \"Calque 11\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 12. If left empty, the layer will " "display as \"Layer 12\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 12. Si vide, la " +"calque s'affichera comme \"Calque 12\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 13. If left empty, the layer will " "display as \"Layer 13\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 13. Si vide, la " +"calque s'affichera comme \"Calque 13\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 14. If left empty, the layer will " "display as \"Layer 14\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 14. Si vide, la " +"calque s'affichera comme \"Calque 14\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 15. If left empty, the layer will " "display as \"Layer 15\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 15. Si vide, la " +"calque s'affichera comme \"Calque 15\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 16. If left empty, the layer will " "display as \"Layer 16\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 16. Si vide, la " +"calque s'affichera comme \"Calque 16\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 17. If left empty, the layer will " "display as \"Layer 17\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 17. Si vide, la " +"calque s'affichera comme \"Calque 17\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 18. If left empty, the layer will " "display as \"Layer 18\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 18. Si vide, la " +"calque s'affichera comme \"Calque 18\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 19. If left empty, the layer will " "display as \"Layer 19\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 19. Si vide, la " +"calque s'affichera comme \"Calque 19\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 2. If left empty, the layer will " "display as \"Layer 2\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 2. Si vide, la " +"calque affichera comme « calque 2 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 20. If left empty, the layer will " "display as \"Layer 20\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 20. Si vide, la " +"calque s'affichera comme \"Calque 20\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 21. If left empty, the layer will " "display as \"Layer 21\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 21. Si vide, la " +"calque s'affichera comme \"Calque 21\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 22. If left empty, the layer will " "display as \"Layer 22\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 22. Si vide, la " +"calque s'affichera comme \"Calque 22\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 23. If left empty, the layer will " "display as \"Layer 23\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 23. Si vide, la " +"calque s'affichera comme \"Calque 23\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 24. If left empty, the layer will " "display as \"Layer 24\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 24. Si vide, la " +"calque s'affichera comme \"Calque 24\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 25. If left empty, the layer will " "display as \"Layer 25\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 25. Si vide, la " +"calque s'affichera comme \"Calque 25\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 26. If left empty, the layer will " "display as \"Layer 26\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 26. Si vide, la " +"calque s'affichera comme \"Calque 26\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 27. If left empty, the layer will " "display as \"Layer 27\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 27. Si vide, la " +"calque s'affichera comme \"Calque 27\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 28. If left empty, the layer will " "display as \"Layer 28\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 28. Si vide, la " +"calque s'affichera comme \"Calque 28\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 29. If left empty, the layer will " "display as \"Layer 29\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 29. Si vide, la " +"calque s'affichera comme \"Calque 29\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 3. If left empty, the layer will " "display as \"Layer 3\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 3. Si vide, la " +"calque s'affichera comme « calque 3 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 30. If left empty, the layer will " "display as \"Layer 30\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 30. Si vide, la " +"calque s'affichera comme \"Calque 30\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 31. If left empty, the layer will " "display as \"Layer 31\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 31. Si vide, la " +"calque s'affichera comme \"Calque 31\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 32. If left empty, the layer will " "display as \"Layer 32\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 32. Si vide, la " +"calque s'affichera comme \"Calque 32\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 4. If left empty, the layer will " "display as \"Layer 4\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 4. Si vide, la " +"calque apparaîtra comme \"Calque 4\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 5. If left empty, the layer will " "display as \"Layer 5\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 5. Si vide, le " +"calque affichera comme \"Calque 5\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 6. If left empty, the layer will " "display as \"Layer 6\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 6. Si vide, la " +"calque apparaîtra comme \"Calque 6\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 7. If left empty, the layer will " "display as \"Layer 7\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 7. Si vide, la " +"calque s'affichera comme « calque 7 »." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 8. If left empty, the layer will " "display as \"Layer 8\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 8. Si vide, la " +"calque s'affichera comme \"Calque 8\"." #: doc/classes/ProjectSettings.xml msgid "" "Optional name for the 3D navigation layer 9. If left empty, the layer will " "display as \"Layer 9\"." msgstr "" +"Le nom optionnel pour la calque de navigation 3D numéro 9. Si vide, la " +"calque s'affichera comme \"Calque 9\"." #: doc/classes/ProjectSettings.xml msgid "Optional name for the 3D physics layer 1." @@ -61394,6 +61787,8 @@ msgid "" "The locale to fall back to if a translation isn't available in a given " "language. If left empty, [code]en[/code] (English) will be used." msgstr "" +"Le langage de repli si une traduction n'est pas disponible dans une langue " +"donnée. Si laissé vide, [code]en[/code] (anglais) sera utilisé." #: doc/classes/ProjectSettings.xml msgid "" @@ -61412,6 +61807,9 @@ msgid "" "Desktop override for [member logging/file_logging/enable_file_logging], as " "log files are not readily accessible on mobile/Web platforms." msgstr "" +"Le surcharge du bureau pour [member logging/file_logging/enable_file_logging]" +", car les fichiers de journaux ne sont pas facilement accessibles sur les " +"plateformes mobiles et web." #: doc/classes/ProjectSettings.xml msgid "" @@ -62212,6 +62610,12 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" +"La valeur par défaut est une surcharge très conservatrice pour [member " +"rendering/gles3/shaders/max_simultaneous_compiles].\n" +"Selon les appareils spécifiques que vous ciblez, vous pouvez vouloir " +"l'augmenter.\n" +"[b]Note :[/b] Ce paramètre n'est utile que si [nomm rendering/gles3/shaders/" +"shader_compilation_mode] n'est [b]pas[/b] à [code]Synchrone[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62222,6 +62626,12 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is [b]not[/b] [code]Synchronous[/code]." msgstr "" +"La valeur par défaut est une surcharge très conservatrice pour [member " +"rendering/gles3/shaders/max_simultaneous_compiles].\n" +"Selon les navigateurs spécifiques que vous ciblez, vous pouvez vouloir " +"l'augmenter.\n" +"[b]Note :[/b] Ce paramètre n'est utile que si [nomm rendering/gles3/shaders/" +"shader_compilation_mode] n'est [b]pas[/b] à [code]Synchrone[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62231,6 +62641,11 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" +"La taille maximale, en mégaoctets, que le cache de ubershader peut " +"atteindre. Au démarrage, les entrées les moins récemment utilisées seront " +"supprimées jusqu'à ce que la taille totale soit dans les limites.\n" +"[b]Note :[/b] Ce paramètre n'est utile que si [nomm rendering/gles3/shaders/" +"shader_compilation_mode] est défini à [code]Synchrone + Cache[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62240,6 +62655,11 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_cache_size_mb], de " +"sorte qu'une taille maximale plus petite peut être configurée pour les " +"plates-formes mobiles, où l'espace de stockage est plus limité.\n" +"[b]Note :[/b] Ce paramètre n'est utile que si [nomm rendering/gles3/shaders/" +"shader_compilation_mode] est défini à [code]Synchrone + Cache[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62251,6 +62671,13 @@ msgid "" "[b]Note:[/b] This setting is only meaningful if [member rendering/gles3/" "shaders/shader_compilation_mode] is set to [code]Asynchronous + Cache[/code]." msgstr "" +"Une surcharge pour [member rendering/gles3/shaders/shader_cache_size_mb], de " +"sorte qu'une taille maximale plus petite peut être configurée pour les " +"plateformes web, où l'espace de stockage est plus limité.\n" +"[b]Note :[/b] Actuellement, le caisson d'ombrage n'est généralement pas " +"disponible sur les plateformes Web.\n" +"[b]Note :[/b] Ce paramètre n'est utile que si [nomm rendering/gles3/shaders/" +"shader_compilation_mode] est défini à [code]Synchrone + Cache[/code]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62300,24 +62727,33 @@ msgid "" "Max buffer size for blend shapes. Any blend shape bigger than this will not " "work." msgstr "" +"La capacité maximale de la mémoire tampon pour les formes de mélange. Toute " +"forme de mélange plus grande que cela ne fonctionnera pas." #: doc/classes/ProjectSettings.xml msgid "" "Max buffer size for drawing polygons. Any polygon bigger than this will not " "work." msgstr "" +"La capacity maximale de la mémoire tampon pour dessiner des polygones. Tout " +"polygone plus grand que cela ne fonctionnera pas." #: doc/classes/ProjectSettings.xml msgid "" "Max index buffer size for drawing polygons. Any polygon bigger than this " "will not work." msgstr "" +"La capacity maximale de la mémoire tampon pour le dessin des polygones. Tout " +"polygone plus grand que cela ne fonctionnera pas." #: doc/classes/ProjectSettings.xml msgid "" "Max buffer size for drawing immediate objects (ImmediateGeometry nodes). " "Nodes using more than this size will not work." msgstr "" +"La capacity maximale de la mémoire tampon pour le dessin d'objets immédiats (" +"les nÅ“uds ImmediateGeometry). Les nÅ“uds utilisant plus que cette taille ne " +"fonctionneront pas." #: doc/classes/ProjectSettings.xml msgid "" @@ -62363,13 +62799,10 @@ msgid "" msgstr "" #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "If [code]true[/code], the texture importer will import lossless textures " "using the PNG format. Otherwise, it will default to using WebP." msgstr "" -"Si [code]true[/code], la [SpinBox] sera modifiable. Sinon, elle sera en " -"lecture seule." #: doc/classes/ProjectSettings.xml msgid "" @@ -62379,6 +62812,12 @@ msgid "" "Note that compression levels above 6 are very slow and offer very little " "savings." msgstr "" +"Le niveau de compression par défaut pour le format WebP sans perte. Des " +"niveaux plus élevés entraînent des fichiers plus petits mais une plus lente " +"vitesse de compression. La vitesse de décompression ne dépend pas du niveau " +"de compression. Les valeurs supportées vont de 0 à 9. Notez que les niveaux " +"de compression supérieurs à 6 sont très lents et offrent une très petite " +"réduction du poids du fichier." #: doc/classes/ProjectSettings.xml msgid "" @@ -62387,6 +62826,11 @@ msgid "" "attributes data. Recommended to be enabled if targeting mobile devices. " "Requires manual reimport of meshes after toggling." msgstr "" +"À l'importation, les données des sommets de maillage seront divisées en deux " +"flux dans une seule mémoire tampon pour les sommets, l'une pour les données " +"de position et l'autre pour les données d'attributs. Recommandé si vous " +"ciblez des appareils mobiles. Nécessite de réimporter manuellement toutes " +"les meshes après l'activation." #: doc/classes/ProjectSettings.xml msgid "" @@ -62398,6 +62842,14 @@ msgid "" "A greater number of polygons can potentially cull more objects, however the " "cost of culling calculations scales with the number of occluders." msgstr "" +"Détermine le nombre maximal d'occulteurs de polygones qui seront utilisés à " +"tout moment.\n" +"Même si vous pouvez avoir de nombreux occulteurs dans une même scène, à " +"chaque trame, le système choisira parmi ces plus pertinents basés sur une " +"métrique de l'espace à l'écran, afin de donner la meilleure performance " +"globale.\n" +"Un plus grand nombre de polygones peut potentiellement masquer plus " +"d'objets, cependant les performances baissent avec le nombre d'occulteurs." #: doc/classes/ProjectSettings.xml msgid "" @@ -62407,6 +62859,12 @@ msgid "" "choose from these the most relevant based on a screen space metric, in order " "to give the best overall performance." msgstr "" +"Détermine le nombre maximal d'occulteurs de sphère qui seront utilisés à " +"tout moment.\n" +"Même si vous pouvez avoir de nombreux occulteurs dans une même scène, à " +"chaque trame, le système choisira parmi ces plus pertinents basés sur une " +"métrique de l'espace à l'écran, afin de donner la meilleure performance " +"globale." #: doc/classes/ProjectSettings.xml msgid "" @@ -62417,6 +62875,12 @@ msgid "" "It will flip named portal meshes (i.e. [code]-portal[/code]) on the initial " "conversion to [Portal] nodes." msgstr "" +"La convention par défaut est de pointer vers l'extérieur (la face vers " +"l'extérieur) de la salle source.\n" +"Si vous construisez accidentellement votre niveau avec des portails faisant " +"face de la mauvaise manière, ce réglage peut corriger le problème.\n" +"Cela va inverser le maillages nommés de portail (c'est-à -dire finissant par " +"[code]-portal[/code]) pour les nÅ“uds [Portal]." #: doc/classes/ProjectSettings.xml msgid "" @@ -62427,14 +62891,11 @@ msgstr "" "[b]Note :[/b] Cela sera automatiquement désactivé dans les exports." #: doc/classes/ProjectSettings.xml -#, fuzzy msgid "" "If [code]true[/code], gameplay callbacks will be sent as [code]signals[/" "code]. If [code]false[/code], they will be sent as [code]notifications[/" "code]." msgstr "" -"Si [code]true[/code], l’état de la clé est pressé. Si [code]false[/code], " -"l’état de la clé est libéré." #: doc/classes/ProjectSettings.xml msgid "" @@ -62450,6 +62911,8 @@ msgid "" "Show logs during PVS generation.\n" "[b]Note:[/b] This will automatically be disabled in exports." msgstr "" +"Afficher les journaux pendant la génération du PVS.\n" +"[b]Note :[/b] Cela sera automatiquement désactivé dans les exportations." #: doc/classes/ProjectSettings.xml msgid "" @@ -62784,6 +63247,9 @@ msgid "" "Lower-end override for [member rendering/quality/shadows/filter_mode] on " "mobile devices, due to performance concerns or driver support." msgstr "" +"Surcharge pour les appareils bas de gamme pour [le rendu de membre/qualité/" +"shadows/filter_mode] sur les appareils mobiles, en raison de performance " +"plus faibles ou du support des pilotes." #: doc/classes/ProjectSettings.xml msgid "" @@ -62944,6 +63410,8 @@ msgid "" "Objects can use this signal to restrict reading of settings only to " "situations where a change has been made." msgstr "" +"Les objets peuvent utiliser ce signal pour restreindre leur lecture aux " +"seuls paramètres modifiés." #: doc/classes/PropertyTweener.xml msgid "Interpolates an [Object]'s property over time." @@ -62957,6 +63425,11 @@ msgid "" "to create [PropertyTweener]. Any [PropertyTweener] created manually will not " "function correctly." msgstr "" +"[PropertyTweener] est utilisé pour interpoler une propriété dans un objet. " +"Voir [method SceneTreeTween.tween_property] pour plus d'informations.\n" +"[b]Note :[/b] [method SceneTreeTween.tween_property] est le seul moyen " +"correct de créer un [PropertyTweener]. Les [PropertyTweener] créés " +"manuellement ne fonctionneront pas correctement." #: doc/classes/PropertyTweener.xml msgid "" @@ -62968,6 +63441,13 @@ msgid "" "as_relative() #the node will move by 100 pixels to the right\n" "[/codeblock]" msgstr "" +"Quand appellé, la valeur finale sera utilisée comme valeur relative. Par " +"exemple :\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property(self, \"position\", Vector2.RIGHT * 100, 1)." +"as_relative() # Le nÅ“ud sera déplacé de 100 pixels sur la droite\n" +"/[codeblock]" #: doc/classes/PropertyTweener.xml msgid "" @@ -62979,6 +63459,14 @@ msgid "" "(200, 100)\n" "[/codeblock]" msgstr "" +"Définit une valeur initiale personnalisée pour le [PropertyTweener]. Par " +"exemple :\n" +"[codeblock]\n" +"var tween = get_tree().create_tween()\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(Vector2(" +"100, 100) # Ça déplacera le nÅ“ud de la position (100, 100) jusqu'à (200, 100)" +"\n" +"/[codeblock]" #: doc/classes/PropertyTweener.xml msgid "" @@ -62993,6 +63481,16 @@ msgid "" "from_current()\n" "[/codeblock]" msgstr "" +"Fait que ce [PropertyTweener] utilisera la valeur de propriété actuelle " +"(c'est-à -dire au moment de créer ce [PropertyTweener]) comme point de " +"départ. Ceci est pareil que [method from] avec la valeur actuelle. Ces deux " +"appels sont identiques :\n" +"[codeblock]\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from(position)" +"\n" +"tween.tween_property(self, \"position\", Vector2(200, 100), 1).from_current()" +"\n" +"/[codeblock]" #: doc/classes/PropertyTweener.xml msgid "" @@ -63003,9 +63501,8 @@ msgstr "" "interpolation. Par défaut, il n'y a pas de délai." #: doc/classes/ProximityGroup.xml -#, fuzzy msgid "General-purpose 3D proximity detection node." -msgstr "NÅ“ud de détection de proximité pour usage général." +msgstr "Un nÅ“ud de détection de proximité 3D pour un usage général." #: doc/classes/ProximityGroup.xml msgid "" @@ -63077,11 +63574,16 @@ msgid "" "If the [member dispatch_mode] is set to [constant MODE_PROXY] (the default), " "all calls are delegated to their respective parent [Node]." msgstr "" +"Appelle la méthode et les paramètres donnés à tous les [ProximityGroup] qui " +"s'intersectent.\n" +"Si le [member dispatch_mode] est [constant MODE_PROXY] (par défaut), tous " +"les appels sont délégués à leur parent [Node] respectif." #: doc/classes/ProximityGroup.xml msgid "" "Specifies which node gets contacted on a call of method [method broadcast]." msgstr "" +"Spécifie quel nÅ“ud est contacté sur un appel de méthode [method broadcast]." #: doc/classes/ProximityGroup.xml msgid "" @@ -63091,6 +63593,11 @@ msgid "" "proximity checks at the cost of performance, since more groups will be " "created." msgstr "" +"La taille de l'espace en unités 3D. Cela définit également la quantité de " +"coordonnées requises pour calculer si deux nÅ“uds [ProximityGroup] sont en " +"intersection ou non. Des valeurs plus petites de [member grid_radius] " +"peuvent être utilisées pour des vérifications de proximité plus précises " +"mais avec de moins bonnes performances, car plus de groupes seront créés." #: doc/classes/ProximityGroup.xml msgid "" @@ -63117,13 +63624,15 @@ msgstr "" #: doc/classes/ProximityGroup.xml msgid "This [ProximityGroup]'s parent will be target of [method broadcast]." -msgstr "" +msgstr "Le parent de ce [ProximityGroup] sera la cible de [method broadcast]." #: doc/classes/ProximityGroup.xml msgid "" "This [ProximityGroup] will emit the [signal broadcast] [i]signal[/i] when " "calling the [method broadcast] [i]method[/i]." msgstr "" +"Ce [ProximityGroup] émettra le [i]signal[/i] [signal broadcast] lors de " +"l'appel de la [i]méthode[/i] [method broadcast]." #: doc/classes/QuadMesh.xml msgid "Class representing a square mesh." @@ -63186,9 +63695,8 @@ msgstr "" "spécifié. L'axe doit être un vecteur normalisé." #: doc/classes/Quat.xml -#, fuzzy msgid "Constructs a quaternion defined by the given values." -msgstr "Construit une nouvelle chaîne de caractères à partir du [Plane] donné." +msgstr "" #: doc/classes/Quat.xml msgid "" @@ -63206,6 +63714,9 @@ msgid "" "code], this vector, [code]b[/code], and [code]post_b[/code], by the given " "amount [code]weight[/code]." msgstr "" +"Exécute une interpolation sphérique cubique entre les quaternions " +"[code]pre_a[/code], ce vecteur, [code]b[/code], et [code]post_b[/code], par " +"la quantité [code]weight[/code] spécifiée." #: doc/classes/Quat.xml msgid "Returns the dot product of two quaternions." @@ -63218,6 +63729,10 @@ msgid "" "quaternion. Returned vector contains the rotation angles in the format (X " "angle, Y angle, Z angle)." msgstr "" +"Retourne les angles d'Euler (selon la convention YXZ : lors de la " +"décomposition, d'abord Z, puis X, et enfin Y) correspondant à la rotation " +"représentée par un quaternion d'unité. Le vecteur retourné contient les " +"angles de rotation dans le format (angle X, angle Y, angle Z)." #: doc/classes/Quat.xml msgid "Returns the inverse of the quaternion." @@ -63254,6 +63769,8 @@ msgid "" "Sets the quaternion to a rotation which rotates around axis by the specified " "angle, in radians. The axis must be a normalized vector." msgstr "" +"Définit le quaternion avec une rotation qui tourne autour de l'axe par " +"l'angle spécifié, en radians. L'axe doit être un vecteur normalisé." #: doc/classes/Quat.xml msgid "" @@ -63261,6 +63778,9 @@ msgid "" "convention: when decomposing, first Z, then X, and Y last), given in the " "vector format as (X angle, Y angle, Z angle)." msgstr "" +"Définit le quaternion avec une rotation spécifiée par les angles d'Euler (" +"selon la convention YXZ : lors de la décomposition, d'abord Z, puis X, et " +"enfin Y), donnée dans le format vectoriel comme (angle X, angle Y, angle Z)." #: doc/classes/Quat.xml msgid "" @@ -63268,6 +63788,10 @@ msgid "" "quaternion and [code]to[/code] by amount [code]weight[/code].\n" "[b]Note:[/b] Both quaternions must be normalized." msgstr "" +"Retourne le résultat de l'interpolation linéaire sphérique entre ce " +"quaternion et [code]to[/code] par la quantité [code]weight[/code] spécifiée." +"\n" +"[b]Note :[/b] Les deux quaternions doivent être normalisés." #: doc/classes/Quat.xml msgid "" @@ -63275,6 +63799,9 @@ msgid "" "quaternion and [code]to[/code] by amount [code]weight[/code], but without " "checking if the rotation path is not bigger than 90 degrees." msgstr "" +"Retourne le résultat de l'interpolation linéaire sphérique entre ce " +"quaternion et [code]to[/code] par la quantité [code]weight[/code] spécifiée, " +"mais sans vérifier si la rotation n'est pas supérieure à 90 degrés." #: doc/classes/Quat.xml msgid "Returns a vector transformed (multiplied) by this quaternion." @@ -63318,6 +63845,9 @@ msgid "" "[Basis] matrix. If a vector is transformed by an identity quaternion, it " "will not change." msgstr "" +"La quaternion d'identité, sans rotation. Équivalent à la matrice [Basis] " +"d'identité. Si un vecteur est transformé par un quaternion d'identité, il ne " +"changera pas." #: doc/classes/RandomNumberGenerator.xml msgid "A class for generating pseudo-random numbers." @@ -63483,22 +64013,21 @@ msgstr "" "avec une valeur personnalisée, utilisez plutôt [member seed]." #: doc/classes/Range.xml -#, fuzzy msgid "Abstract base class for range-based controls." -msgstr "Classe de base abstraite pour les contrôles basés sur la portée." +msgstr "Une classe de base abstraite pour les contrôles basés sur la portée." #: doc/classes/Range.xml -#, fuzzy msgid "" "Range is a base class for [Control] nodes that change a floating-point " "[member value] between a [member min_value] and [member max_value], using a " "configured [member step] and [member page] size. See e.g. [ScrollBar] and " "[Slider] for examples of higher level nodes using Range." msgstr "" -"Range est une classe de base des nÅ“uds [Control] qui change une [code]value[/" -"code] flottante entre le [code]minimum[/code] et le [code]maximum[/code], " -"par étape [code]step[/code] et par [code]page[/code], par exemple un " -"[ScrollBar]." +"Range est une classe de base des nÅ“uds [Control] qui change une " +"[code]value[/code] flottante entre le [code]minimum[/code] et le " +"[code]maximum[/code], par étape [code]step[/code] et par [code]page[/code], " +"par exemple un [ScrollBar]. Voir [ScrollBar] et [Slider] pour des exemples " +"de nÅ“uds de haut niveau utilisant des Range." #: doc/classes/Range.xml msgid "" @@ -63509,7 +64038,7 @@ msgstr "" #: doc/classes/Range.xml msgid "Stops the [Range] from sharing its member variables with any other." -msgstr "" +msgstr "Arrête le [Range] de partager ses variables membres avec les autres." #: doc/classes/Range.xml msgid "" @@ -63530,6 +64059,9 @@ msgid "" "If [code]true[/code], and [code]min_value[/code] is greater than 0, " "[code]value[/code] will be represented exponentially rather than linearly." msgstr "" +"Si [code]true[/code], et [code]min_value[/code] est supérieur à 0, " +"[code]value[/code] sera représenté de façon exponentielle plutôt que " +"linéaire." #: doc/classes/Range.xml msgid "" @@ -63553,6 +64085,9 @@ msgid "" "multiplied by [code]page[/code] over the difference between [code]min_value[/" "code] and [code]max_value[/code]." msgstr "" +"La taille de la page. Utilisé principalement pour [ScrollBar]. La longueur " +"de la barre de défilement est multipliée par [code]page[/code] divisé par la " +"différence entre [code]min_value[/code] et [code]max_value[/code]." #: doc/classes/Range.xml msgid "The value mapped between 0 and 1." @@ -63657,12 +64192,17 @@ msgid "" "[code]0[/code] if no object is intersecting the ray (i.e. [method " "is_colliding] returns [code]false[/code])." msgstr "" +"Retourne l'identifiant de forme du premier objet que le rayon intersecte, ou " +"[code]0[/code] si aucun objet n'intersecte le rayon (c'est-à -dire [method " +"is_colliding] renvoie [code]false[/code])." #: doc/classes/RayCast.xml msgid "" "Returns [code]true[/code] if the bit index passed is turned on.\n" "[b]Note:[/b] Bit indices range from 0-19." msgstr "" +"Retourne [code]true[/code] si l'index de bit est activé.\n" +"[b]Note :[/b] Les indices de bit vont de 0 à 19." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -63674,6 +64214,10 @@ msgid "" "Returns the collision point at which the ray intersects the closest object.\n" "[b]Note:[/b] This point is in the [b]global[/b] coordinate system." msgstr "" +"Retourne le point de collision où le rayon intersecte l'objet le plus proche." +"\n" +"[b]Note :[/b] Ce point se trouve dans le système de coordonnées " +"[b]global[/b]." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -63704,21 +64248,24 @@ msgid "" "Sets the bit index passed to the [code]value[/code] passed.\n" "[b]Note:[/b] Bit indexes range from 0-19." msgstr "" +"Définit l'index de bit transmis à la [code]valeur[/code] passée.\n" +"[b]Note :[/b] Les index de bit vont de 0-19." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" "The ray's destination point, relative to the RayCast's [code]position[/code]." msgstr "" +"Le point de destination du rayon, par rapport à la [code]position[/code] du " +"RayCast." #: doc/classes/RayCast.xml -#, fuzzy msgid "If [code]true[/code], collision with [Area]s will be reported." -msgstr "Si [code]true[/code], les collisions seront signalées." +msgstr "Si [code]true[/code], les collisions avec les [Area] seront signalées." #: doc/classes/RayCast.xml -#, fuzzy msgid "If [code]true[/code], collision with [PhysicsBody]s will be reported." -msgstr "Si [code]true[/code], les collisions seront signalées." +msgstr "" +"Si [code]true[/code], les collisions avec les [PhysicsBody] seront signalées." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -63751,11 +64298,12 @@ msgid "If [code]true[/code], collisions will be reported." msgstr "Si [code]true[/code], les collisions seront signalées." #: doc/classes/RayCast.xml -#, fuzzy msgid "" "If [code]true[/code], collisions will be ignored for this RayCast's " "immediate parent." -msgstr "Si [code]true[/code], les collisions seront signalées." +msgstr "" +"Si [code]true[/code], les collisions seront ignorées avec le parent direct " +"de ce RayCast." #: doc/classes/RayCast2D.xml msgid "" @@ -63781,6 +64329,8 @@ msgid "" "Sets or clears individual bits on the collision mask. This makes selecting " "the areas scanned easier." msgstr "" +"Définit ou efface des bits individuels sur le masque de collision. Cela " +"facilite le choix des aires scannées." #: doc/classes/RayCast2D.xml msgid "If [code]true[/code], collision with [Area2D]s will be reported." @@ -63812,6 +64362,10 @@ msgid "" "itself from whatever is touching its far endpoint. It's often useful for " "characters." msgstr "" +"Une forme en rayon pour les collisions en 3D, qui peuvt être placée dans un " +"[PhysicsBody] ou une [Area]. Un rayon n'est pas vraiment un corps de " +"collision ; il tente plutôt de se séparer de ce qui touche son point " +"d'extrémité lointain. Il est souvent utile pour les caractères." #: doc/classes/RayShape.xml doc/classes/RayShape2D.xml msgid "The ray's length." @@ -63833,11 +64387,13 @@ msgid "" "it tries to separate itself from whatever is touching its far endpoint. It's " "often useful for characters." msgstr "" +"Une forme en rayon pour les collisions 2D. Un rayon n'est pas vraiment un " +"corps de collision ; il tente plutôt de se séparer de ce qui touche son " +"point d'extrémité lointain. Il est souvent utile pour les caractères." #: doc/classes/Rect2.xml -#, fuzzy msgid "2D axis-aligned bounding box." -msgstr "Boîte de délimitation alignée sur l'axe." +msgstr "La boîte de délimitation 2D alignée sur les axes." #: doc/classes/Rect2.xml msgid "" @@ -63865,6 +64421,9 @@ msgid "" "top-left corner is the origin and [code]width[/code] and [code]height[/code] " "are positive." msgstr "" +"Retourne un [Rect2] avec la même position et aire, modifié de sorte que le " +"coin supérieur gauche est l'origine et [code]width[/code] et " +"[code]height[/code] soient positifs." #: doc/classes/Rect2.xml msgid "Returns the intersection of this [Rect2] and b." @@ -63886,11 +64445,19 @@ msgid "" "var rect2 = rect.expand(Vector2(0, -1))\n" "[/codeblock]" msgstr "" +"Retourne une copie de ce [Rect2] élargi pour inclure le point donné.\n" +"[b]Exemple :[/b]\n" +"[codeblock]\n" +"# position (-3, 2), size (1, 1)\n" +"var rect = Rect2(Vector2(-3, 2), Vector2(1, 1))\n" +"# position (-3, -1), size (3, 4), contient donc à la fois `rect` et Vector2(" +"0, -1)\n" +"var rect2 = rect.expand(Vector2(0, -1))\n" +"/[codeblock]" #: doc/classes/Rect2.xml -#, fuzzy msgid "Returns the area of the [Rect2]. See also [method has_no_area]." -msgstr "Retourne la zone du [Rect2]." +msgstr "Retourne l'aire du [Rect2]. Voir aussi [method has_no_area]." #: doc/classes/Rect2.xml msgid "" @@ -63905,12 +64472,16 @@ msgid "" "Returns a copy of the [Rect2] grown a given amount of units towards all the " "sides." msgstr "" +"Retourne une copie du [Rect2] aggrandi par une quantité donnée d'unités vers " +"tous les côtés." #: doc/classes/Rect2.xml msgid "" "Returns a copy of the [Rect2] grown a given amount of units towards each " "direction individually." msgstr "" +"Retourne une copie du [Rect2] aggrandi par une quantité donnée d'unités vers " +"chaque direction individuellement." #: doc/classes/Rect2.xml msgid "" @@ -63927,6 +64498,10 @@ msgid "" "[b]Note:[/b] If the [Rect2] has a negative size and is not flat or empty, " "[method has_no_area] will return [code]true[/code]." msgstr "" +"Retourne [code]true[/code] si le [Rect2] est plat ou vide, ou " +"[code]false[/code] sinon. Voir aussi [method get_area].\n" +"[b]Note :[/b] Si le [Rect2] a une taille négative et n'est pas plat ou vide, " +"[method has_no_area] retournera [code]true[/code]." #: doc/classes/Rect2.xml msgid "" @@ -63945,6 +64520,11 @@ msgid "" "If [code]include_borders[/code] is [code]true[/code], they will also be " "considered overlapping if their borders touch, even without intersection." msgstr "" +"Retourne [code]true[/code] si le [Rect2] se chevauche avec [code]b[/code] " +"(c'est-à -dire qu'ils ont au moins un point en commun).\n" +"Si [code]include_borders[/code] est [code]true[/code], ils seront également " +"considérés comme se chevauchant si leurs bordures touchent, même sans " +"intersection." #: doc/classes/Rect2.xml msgid "" @@ -63952,6 +64532,9 @@ msgid "" "approximately equal, by calling [code]is_equal_approx[/code] on each " "component." msgstr "" +"Retourne [code]true[/code] si ce [Rect2] et [code]rect[/code] sont " +"approximativement égaux, en appelant [code]is_equal_approx[/code] sur chaque " +"composant." #: doc/classes/Rect2.xml msgid "Returns a larger [Rect2] that contains this [Rect2] and [code]b[/code]." @@ -63968,12 +64551,16 @@ msgid "" "Rectangle shape for 2D collisions. This shape is useful for modeling box-" "like 2D objects." msgstr "" +"Une forme rectangulaire pour les collisions 2D. Cette forme est utile pour " +"les objets 2D de type boîte." #: doc/classes/RectangleShape2D.xml msgid "" "The rectangle's half extents. The width and height of this shape is twice " "the half extents." msgstr "" +"La demi-taille du rectangle. La largeur et la hauteur de cette forme sont " +"deux fois plus grandes." #: doc/classes/Reference.xml msgid "Base class for reference-counted objects." @@ -64002,6 +64589,9 @@ msgid "" "what you are doing.\n" "Returns whether the initialization was successful." msgstr "" +"Initialise le compteur de référence interne. Utilisez ceci seulement si vous " +"savez vraiment ce que vous faites.\n" +"Retourne si l'initialisation a été réussie." #: doc/classes/Reference.xml msgid "" @@ -64010,6 +64600,10 @@ msgid "" "Returns [code]true[/code] if the increment was successful, [code]false[/" "code] otherwise." msgstr "" +"Augmente le compteur de référence interne. Utilisez ceci seulement si vous " +"savez vraiment ce que vous faites.\n" +"Retourne [code]true[/code] si l'augmentation a réussi, [code]false[/code] " +"sinon." #: doc/classes/Reference.xml msgid "" @@ -64018,6 +64612,10 @@ msgid "" "Returns [code]true[/code] if the decrement was successful, [code]false[/" "code] otherwise." msgstr "" +"Diminue le compteur de référence interne. Utilisez ceci seulement si vous " +"savez vraiment ce que vous faites.\n" +"Retourne [code]true[/code] si la diminution a réussi, [code]false[/code] " +"sinon." #: doc/classes/ReferenceRect.xml msgid "Reference frame for GUI." @@ -64030,6 +64628,10 @@ msgid "" "display a rectangle filled with a solid color, consider using [ColorRect] " "instead." msgstr "" +"Une boîte rectangulaire qui n'affiche que la couleur [member border_color] " +"sur ses bordures. [ReferenceRect] n'a pas de [Color] de remplissage. Si vous " +"devez afficher un rectangle rempli avec une couleur, utilisez plutôt " +"[ColorRect]." #: doc/classes/ReferenceRect.xml msgid "Sets the border [Color] of the [ReferenceRect]." @@ -64040,19 +64642,24 @@ msgid "" "Sets the border width of the [ReferenceRect]. The border grows both inwards " "and outwards with respect to the rectangle box." msgstr "" +"Définit la largeur de la bordure du [ReferenceRect]. La bordure va à la fois " +"vers l'intérieur et vers l'extérieur par rapport aux limites du rectangle." #: doc/classes/ReferenceRect.xml msgid "" "If set to [code]true[/code], the [ReferenceRect] will only be visible while " "in editor. Otherwise, [ReferenceRect] will be visible in game." msgstr "" +"Si définit à [code]true[/code], le [ReferenceRect] ne sera visible que dans " +"l'éditeur. Sinon, [ReferenceRect] sera aussi visible dans le jeu." #: doc/classes/ReflectionProbe.xml -#, fuzzy msgid "" "Captures its surroundings to create fast, accurate reflections from a given " "point." -msgstr "Capture son environnement pour créer des réflexions." +msgstr "" +"Capture son environnement pour créer des réflexions rapides et précises " +"depuis un point donné." #: doc/classes/ReflectionProbe.xml msgid "" @@ -64128,6 +64735,8 @@ msgid "" "Sets the ambient light color to be used when this probe is set to [member " "interior_enable]." msgstr "" +"Définit la couleur de la lumière ambiante à utiliser lorsque cette sonde est " +"définie à [membrer interior_enable]." #: doc/classes/ReflectionProbe.xml msgid "" @@ -64135,22 +64744,25 @@ msgid "" "light for this reflection probe when set to [member interior_enable]. Useful " "so that ambient light matches the color of the room." msgstr "" +"Définit la valeur de contribution pour la quantité de lumière ambiante " +"affectée par la réflexion pour cette sonde que [member interior_enable] est " +"activé. Utile pour que la lumière ambiante corresponde à la couleur de la " +"pièce." #: doc/classes/ReflectionProbe.xml msgid "" "Sets the energy multiplier for this reflection probe's ambient light " "contribution when set to [member interior_enable]." msgstr "" +"Définit le multiplicateur d'énergie pour cette sonde de réflexion de la " +"lumière ambiante quand défini à [member interior_enable]." #: doc/classes/ReflectionProbe.xml -#, fuzzy msgid "" "If [code]true[/code], reflections will ignore sky contribution. Ambient " "lighting is then controlled by the [code]interior_ambient_*[/code] " "properties." msgstr "" -"Retourne la profondeur de la texture. La profondeur est la 3ème dimension " -"(généralement l'axe Z)." #: doc/classes/ReflectionProbe.xml msgid "" @@ -64698,9 +65310,8 @@ msgid "" msgstr "" #: doc/classes/ResourceImporter.xml -#, fuzzy msgid "Base class for the implementation of core resource importers." -msgstr "Classe de base pour une implémentation d’interface AR / VR." +msgstr "" #: doc/classes/ResourceImporter.xml msgid "" @@ -64714,9 +65325,8 @@ msgid "Import plugins" msgstr "Importer des plugins" #: doc/classes/ResourceImporter.xml -#, fuzzy msgid "The default import order." -msgstr "La police par défaut du thème." +msgstr "" #: doc/classes/ResourceImporter.xml msgid "" @@ -64739,13 +65349,10 @@ msgid "" msgstr "" #: doc/classes/ResourceInteractiveLoader.xml -#, fuzzy msgid "" "Returns the loaded resource if the load operation completed successfully, " "[code]null[/code] otherwise." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères commence par la chaîne " -"de caractères donnée, ou [code]false[/code] le cas échéant." #: doc/classes/ResourceInteractiveLoader.xml msgid "" @@ -65147,9 +65754,8 @@ msgid "" msgstr "" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Returns the current selection text. Does not include BBCodes." -msgstr "Retourne le numéro de la ligne actuelle." +msgstr "" #: doc/classes/RichTextLabel.xml msgid "" @@ -65445,24 +66051,20 @@ msgid "Makes text fill width." msgstr "Rempli le texte en largeur." #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns top of the inline image to the top of the text." -msgstr "La hauteur de la boite mesuré depuis son centre." +msgstr "" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns center of the inline image to the center of the text." -msgstr "Aligne les enfants avec le centre du conteneur." +msgstr "" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns bottom of the inline image to the baseline of the text." -msgstr "La hauteur de la boite mesuré depuis son centre." +msgstr "" #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "Aligns bottom of the inline image to the bottom of the text." -msgstr "Aligne les enfants avec le centre du conteneur." +msgstr "" #: doc/classes/RichTextLabel.xml msgid "Each list item has a number marker." @@ -65543,7 +66145,6 @@ msgid "The default text font." msgstr "La police par défaut du texte." #: doc/classes/RichTextLabel.xml -#, fuzzy msgid "The background used when the [RichTextLabel] is focused." msgstr "L'arrière-plan utilisé quand le [RichTextLabel] a le focus." @@ -65685,16 +66286,15 @@ msgid "Locks the specified linear or rotational axis." msgstr "Verrouille l'axe linéaire et de rotation spécifié." #: doc/classes/RigidBody.xml -#, fuzzy msgid "" "Damps the body's rotational forces. If this value is different from -1.0 it " "will be added to any angular damp derived from the world or areas.\n" "See [member ProjectSettings.physics/3d/default_angular_damp] for more " "details about damping." msgstr "" -"La vitesse à laquelle les objets arrêtent de tourner dans cette zone. " -"Représente la vitesse angulaire perdue par seconde.\n" -"Voir [membre ProjectSettings.physics/2d/default_angular_damp] pour plus de " +"Amortit les forces de rotation du corps. Si cette valeur est différente de -" +"1.0, elle sera ajoutée aux amortissements obtenues du monde et des aires.\n" +"Voir [membre ProjectSettings.physics/3d/default_angular_damp] pour plus de " "détails sur l'amortissement." #: doc/classes/RigidBody.xml @@ -66017,9 +66617,8 @@ msgid "The body's total applied force." msgstr "La force appliquée totale du corps." #: doc/classes/RigidBody2D.xml -#, fuzzy msgid "The body's total applied torque." -msgstr "La force appliquée totale du corps." +msgstr "La force totale appliquée au corps." #: doc/classes/RigidBody2D.xml msgid "" @@ -66581,9 +67180,8 @@ msgid "Path to an [AnimationTree] node to use as a basis for root motion." msgstr "" #: doc/classes/RootMotionView.xml -#, fuzzy msgid "The grid's cell size in 3D units." -msgstr "La taille de cellule du TileMap." +msgstr "La taille de cellule de la grille en unités 3D." #: doc/classes/RootMotionView.xml msgid "The grid's color." @@ -66596,14 +67194,11 @@ msgid "" msgstr "" #: doc/classes/RootMotionView.xml -#, fuzzy msgid "" "If [code]true[/code], the grid's points will all be on the same Y coordinate " "([i]local[/i] Y = 0). If [code]false[/code], the points' original Y " "coordinate is preserved." msgstr "" -"Si [code]true[/code], l’état de la clé est pressé. Si [code]false[/code], " -"l’état de la clé est libéré." #: doc/classes/SceneState.xml msgid "A script interface to a scene file's data." @@ -67000,13 +67595,11 @@ msgid "" msgstr "" #: doc/classes/SceneTree.xml -#, fuzzy msgid "" "If [code]true[/code], the application automatically accepts quitting.\n" "For mobile platforms, see [member quit_on_go_back]." msgstr "" -"Si [code]true[/code], l'application accepte automatiquement de se fermer. " -"Activé par défaut.\n" +"Si [code]true[/code], l'application accepte automatiquement de se fermer.\n" "Pour les plateformes mobiles, voir [method set_quit_on_go_back]." #: doc/classes/SceneTree.xml @@ -67093,9 +67686,8 @@ msgstr "" "les nouvelles connexions entrantes." #: doc/classes/SceneTree.xml -#, fuzzy msgid "The [SceneTree]'s root [Viewport]." -msgstr "La [Window] racine de [SceneTree]." +msgstr "La [Viewport] racine du [SceneTree]." #: doc/classes/SceneTree.xml msgid "" @@ -67133,9 +67725,8 @@ msgid "" msgstr "" #: doc/classes/SceneTree.xml -#, fuzzy msgid "Emitted whenever global menu item is clicked." -msgstr "Émis lorsqu’un élément est sélectionné." +msgstr "Émis quand le menu global est cliqué." #: doc/classes/SceneTree.xml msgid "" @@ -67177,9 +67768,8 @@ msgid "Emitted whenever a node is removed from the [SceneTree]." msgstr "Émit quand un nÅ“ud est retiré du [SceneTree]." #: doc/classes/SceneTree.xml -#, fuzzy msgid "Emitted whenever a node is renamed." -msgstr "Émis chaque fois qu’un nÅ“ud est renommé." +msgstr "Émis quand un nÅ“ud est renommé." #: doc/classes/SceneTree.xml msgid "" @@ -67279,7 +67869,6 @@ msgid "One-shot timer." msgstr "Minuteur à un coup." #: doc/classes/SceneTreeTimer.xml -#, fuzzy msgid "" "A one-shot timer managed by the scene tree, which emits [signal timeout] on " "completion. See also [method SceneTree.create_timer].\n" @@ -67305,16 +67894,16 @@ msgstr "" " yield(get_tree().create_timer(1.0), \"timeout\")\n" " print(\"Minuteur terminé.\")\n" "[/codeblock]\n" -"Le minuteur sera automatiquement une fois terminé." +"Le minuteur sera automatiquement une fois terminé. Pour garder le minuteur, " +"vous pouvez maintenir une référence vers lui. Voir [Reference]." #: doc/classes/SceneTreeTimer.xml msgid "The time remaining (in seconds)." msgstr "Le temps restant (en secondes)." #: doc/classes/SceneTreeTimer.xml doc/classes/Timer.xml -#, fuzzy msgid "Emitted when the timer reaches 0." -msgstr "Émis lorsque la minuterie atteint 0." +msgstr "Émis quand le minuteur atteint 0." #: doc/classes/SceneTreeTween.xml msgid "" @@ -67692,7 +68281,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Creates and appends an [IntervalTweener]. This method can be used to create " "delays in the tween animation, as an alternative to using the delay in other " @@ -67722,7 +68310,7 @@ msgstr "" "délais des autres [Tweener] ou quand il n'y a pas d'animation (dans ce cas " "le [SceneTreeTween] se comportement comme un minuteur). [code]time[/code] " "est le durée du délai, en secondes.\n" -"Exemple : créer un délai de 2s dans l'exécution du code.\n" +"Exemple : créer un délai dans l'exécution du code.\n" "[codeblock]\n" "# ... du code\n" "yield(create_tween().tween_interval(2), \"finished\")\n" @@ -67796,7 +68384,6 @@ msgstr "" "[/codeblock]" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "Creates and appends a [PropertyTweener]. This method tweens a " "[code]property[/code] of an [code]object[/code] between an initial value and " @@ -67838,14 +68425,14 @@ msgstr "" "tween.tween_property($Sprite, \"position\", Vector2(200, 300), 1)\n" "[/codeblock]\n" "déplacera la sprite de sa position actuelle à la position (100, 200) puis " -"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou " -"[method PropertyTweener.from_current], la position de départ sera celle " +"ensuite à (200, 300). Si vous utilisez [method PropertyTweener.from] ou [" +"method PropertyTweener.from_current], la position de départ sera celle " "spécifiée et non l'actuelle. Voir les autres méthodes de [PropertyTweener] " "pour connaitre les possibilités.\n" "[b]Note :[/b] Vous pouvez trouver les noms corrects des propriétés en " "survolant ces propriétés dans l'inspecteur de Godot. Vous pouvez aussi " -"fournir un seul composant de cette propriété directement en utilisant " -"[code]\"property:component\"[/code] (ex. [code]position:x[/code]), alors " +"fournir un seul composant de cette propriété directement en utilisant [code]" +"\"property:component\"[/code] (ex. [code]position:x[/code]), alors " "l'interpolation ne se fera que sur cet unique composant.\n" "Exemple : déplacer un objet deux fois depuis la même position vers " "différentes positions, avec différents types de transition.\n" @@ -67893,11 +68480,10 @@ msgid "If [SceneTree] is paused, the [SceneTreeTween] will also pause." msgstr "Si le [SceneTree] est en pause, le [SceneTreeTween] le sera aussi." #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "The [SceneTreeTween] will process regardless of whether [SceneTree] is " "paused." -msgstr "Arrête la mise à jour quand le [SceneTree] est en pause." +msgstr "" #: doc/classes/Script.xml msgid "A class stored as a resource." @@ -68233,7 +68819,6 @@ msgid "" msgstr "" #: doc/classes/Shader.xml -#, fuzzy msgid "A custom shader program." msgstr "Un programme de shader personnalisé." @@ -68583,9 +69168,8 @@ msgid "" msgstr "" #: doc/classes/Skeleton.xml -#, fuzzy msgid "Sets the pose transform for bone [code]bone_idx[/code]." -msgstr "Définit le décalage à partir de [code]0.5[/code]." +msgstr "" #: doc/classes/Skeleton.xml msgid "Sets the rest transform for bone [code]bone_idx[/code]." @@ -68925,14 +69509,12 @@ msgid "" msgstr "" #: doc/classes/SoftBody.xml -#, fuzzy msgid "Returns local translation of a vertex in the surface array." -msgstr "Renvoie la matrice de transformation d’une forme dans une zone." +msgstr "" #: doc/classes/SoftBody.xml -#, fuzzy msgid "Returns [code]true[/code] if vertex is set to pinned." -msgstr "Retourne [code]true[/code] si l'[AABB] est plate ou vide." +msgstr "" #: doc/classes/SoftBody.xml msgid "" @@ -68968,13 +69550,10 @@ msgid "[NodePath] to a [CollisionObject] this SoftBody should avoid clipping." msgstr "" #: doc/classes/SoftBody.xml -#, fuzzy msgid "" "If [code]true[/code], the [SoftBody] is simulated in physics. Can be set to " "[code]false[/code] to pause the physics simulation." msgstr "" -"Si [code]true[/code], l’état de la clé est pressé. Si [code]false[/code], " -"l’état de la clé est libéré." #: doc/classes/SoftBody.xml msgid "If [code]true[/code], the [SoftBody] will respond to [RayCast]s." @@ -69695,7 +70274,6 @@ msgstr "" "à un point donné." #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "" "Forces a conversion of the [member albedo_texture] from sRGB space to linear " "space." @@ -69887,11 +70465,10 @@ msgid "" msgstr "" #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "" "If [code]true[/code], enables the vertex grow setting. See [member " "params_grow_amount]." -msgstr "Si [code]true[/code], active le drapeau spécifié." +msgstr "" #: doc/classes/SpatialMaterial.xml msgid "Grows object vertices in the direction of their normals." @@ -70178,9 +70755,8 @@ msgid "Texture specifying per-pixel depth." msgstr "La texture spécifiant la profondeur par pixel." #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Texture specifying per-pixel subsurface scattering." -msgstr "La texture spécifiant par pixel de diffusion souterraine." +msgstr "La texture spécifiant la transluminescence par pixel." #: doc/classes/SpatialMaterial.xml msgid "Texture specifying per-pixel transmission color." @@ -70392,10 +70968,9 @@ msgstr "" "emission_texture]." #: doc/classes/SpatialMaterial.xml -#, fuzzy msgid "Use alpha scissor. Set by [member params_use_alpha_scissor]." msgstr "" -"Utilise un ciseau pour l'alpha. Définit par [member " +"Utilise un ciseau pour l'opacité. Définit par [member " "params_use_alpha_scissor]." #: doc/classes/SpatialMaterial.xml @@ -70819,9 +71394,8 @@ msgstr "" "collision." #: doc/classes/SpringArm.xml -#, fuzzy msgid "Returns the spring arm's current length." -msgstr "Retourne la chaîne de caractères convertie en minuscules." +msgstr "" #: doc/classes/SpringArm.xml msgid "" @@ -71046,7 +71620,6 @@ msgid "The size of one pixel's width on the sprite to scale it in 3D." msgstr "La taille d'un des pixels de la sprite pour définir sa taille en 3D." #: doc/classes/SpriteBase3D.xml -#, fuzzy msgid "" "Sets the render priority for the sprite. Higher priority objects will be " "sorted in front of lower priority objects.\n" @@ -71057,22 +71630,21 @@ msgid "" "This is because opaque objects are not sorted, while transparent objects are " "sorted from back to front (subject to priority)." msgstr "" -"Définit la priorité de rendu pour le texte. Des objets plus prioritaires " -"seront affichés par-dessus des objets moins inférieurs.\n" -"[b]Note: [/b] Cela ne s'applique que si [member alpha_cut] est défini à " -"[constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" +"Définit la priorité de rendu pour le texte. Les objets plus prioritaires " +"seront affichés par-dessus les objets les moins prioritaites.\n" +"[b]Note :[/b] Cela ne s'applique que si [member alpha_cut] est défini à [" +"constant ALPHA_CUT_DISABLED] (c'est la valeur par défaut).\n" "[b]Note :[/b] Cela ne s'applique qu'au tri des objets transparents. Cela " "n'affectera pas la façon dont les objets transparents sont triés par rapport " "aux objets opaques. C'est parce que les objets opaques ne sont pas triés, " -"alors que les objets transparents sont triés de l'arrière à l'avant (et " +"alors que les objets transparents sont triés de l'arrière vers l'avant (et " "suivant leur priorité)." #: doc/classes/SpriteBase3D.xml -#, fuzzy msgid "" "If [code]true[/code], the [Light] in the [Environment] has effects on the " "sprite." -msgstr "Si [code]true[/code], ce [HTTPClient] a une réponse disponible." +msgstr "" #: doc/classes/SpriteBase3D.xml msgid "" @@ -71132,13 +71704,10 @@ msgid "Removes all animations. A \"default\" animation will be created." msgstr "Retire toutes les animations. Une animation \"défaut\" sera créée." #: doc/classes/SpriteFrames.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the given animation is configured to loop when " "it finishes playing. Otherwise, returns [code]false[/code]." msgstr "" -"Retourne [code]true[/code] si la piste donnée est importée. Sinon retourne " -"[code]false[/code]." #: doc/classes/SpriteFrames.xml msgid "" @@ -71460,9 +72029,8 @@ msgid "" msgstr "" #: doc/classes/StreamPeerBuffer.xml -#, fuzzy msgid "Data buffer stream peer." -msgstr "Homologue de flux SSL." +msgstr "" #: doc/classes/StreamPeerBuffer.xml msgid "" @@ -72361,22 +72929,20 @@ msgstr "" "répétitions est donné en argument." #: doc/classes/String.xml -#, fuzzy msgid "" "Replaces occurrences of a case-sensitive substring with the given one inside " "the string." msgstr "" -"Remplacer les occurrences d'une sous-chaine sensible à la casse avec l'autre " -"donnée." +"Remplace les occurrences sensibles à la casse à l'intérieur d'une chaine par " +"la sous-chaine donnée." #: doc/classes/String.xml -#, fuzzy msgid "" "Replaces occurrences of a case-insensitive substring with the given one " "inside the string." msgstr "" -"Remplacer les occurrences d'une sous-chaine insensible à la casse avec " -"l'autre donnée." +"Remplace les occurrences insensibles à la casse à l'intérieur d'une chaine " +"par la sous-chaine donnée." #: doc/classes/String.xml msgid "" @@ -72893,7 +73459,6 @@ msgstr "" "[code]corner[/code] spécifié. Voir [enum Corner] pour les valeurs possibles." #: doc/classes/StyleBoxFlat.xml -#, fuzzy msgid "Sets the corner radius to [code]radius[/code] pixels for all corners." msgstr "" "Définit le rayon d’angle sur [code]radius[/code] pixels pour tous les coins." @@ -73629,11 +74194,11 @@ msgstr "" "est désactivé." #: doc/classes/TabContainer.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the tab at index [code]tab_idx[/code] is hidden." msgstr "" -"Retourne [code]true[/code] si la piste à l'index [code]idx[/code] est active." +"Retourne [code]true[/code] si l'onglet à l'index [code]tab_idx[/code] est " +"masqué." #: doc/classes/TabContainer.xml doc/classes/Tabs.xml msgid "" @@ -73701,13 +74266,10 @@ msgid "" msgstr "" #: doc/classes/TabContainer.xml -#, fuzzy msgid "" "If [code]true[/code], all tabs are drawn in front of the panel. If " "[code]false[/code], inactive tabs are drawn behind the panel." msgstr "" -"Si [code]true[/code], l’état de la clé est pressé. Si [code]false[/code], " -"l’état de la clé est libéré." #: doc/classes/TabContainer.xml msgid "" @@ -73858,12 +74420,11 @@ msgid "Tabs control." msgstr "Contrôle des onglets." #: doc/classes/Tabs.xml -#, fuzzy msgid "" "Simple tabs control, similar to [TabContainer] but is only in charge of " "drawing tabs, not interacting with children." msgstr "" -"Contrôle des onglets simples, similaire à [TabContainer] mais il est " +"Un contrôle simple des onglets, similaire à [TabContainer] mais il est " "uniquement chargé du dessin des onglets, et non de l’interaction avec les " "enfants." @@ -73941,12 +74502,10 @@ msgid "Select tab at index [code]tab_idx[/code]." msgstr "Sélectionne l'onglet à l'index [code]tab_idx[/code]." #: doc/classes/Tabs.xml -#, fuzzy msgid "" "if [code]true[/code], the mouse's scroll wheel can be used to navigate the " "scroll view." msgstr "" -"Si [code]true[/code], l’état du bouton de la souris est un double-clic." #: doc/classes/Tabs.xml msgid "The alignment of all tabs. See [enum TabAlign] for details." @@ -74189,9 +74748,8 @@ msgid "Returns the amount of total lines in the text." msgstr "Retourne le nombre total de lignes dans le texte." #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns the height of a largest line." -msgstr "Retourne la hauteur du contenu." +msgstr "" #: doc/classes/TextEdit.xml msgid "" @@ -74202,14 +74760,12 @@ msgstr "" "code]." #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns the number of times the given line is wrapped." -msgstr "Renvoie le nombre de lignes visibles." +msgstr "" #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns an array of [String]s representing each wrapped index." -msgstr "Retourne une représentation [String] de l'évènement." +msgstr "" #: doc/classes/TextEdit.xml msgid "" @@ -74254,19 +74810,16 @@ msgid "Returns the selection end line." msgstr "Retourne la ligne de fin de sélection." #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns the total width of all gutters and internal padding." -msgstr "Retourne le nombre de pistes dans l'animation." +msgstr "" #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns the total amount of lines that could be drawn." -msgstr "Retourne la position du contact sur le collisionneur." +msgstr "" #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns the number of visible lines, including wrapped text." -msgstr "Renvoie le nombre de lignes visibles." +msgstr "" #: doc/classes/TextEdit.xml msgid "" @@ -74309,34 +74862,26 @@ msgstr "" "marque-page." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns [code]true[/code] when the specified [code]line[/code] has a " "breakpoint." msgstr "" -"Retourne [code]true[/code] si la piste à l'index [code]idx[/code] est active." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns [code]true[/code] when the specified [code]line[/code] is marked as " "safe." msgstr "" -"Retourne [code]true[/code] si la piste à l'index [code]idx[/code] est active." #: doc/classes/TextEdit.xml -#, fuzzy msgid "Returns if the given line is wrapped." -msgstr "Renvoie le texte de la colonne donnée." +msgstr "" #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns whether the mouse is over selection. If [code]edges[/code] is " "[code]true[/code], the edges are considered part of the selection." msgstr "" -"Renvoie [code]true[/code] (vrai) si [code]a[/code] et [code]b[/code] sont " -"approximativement égaux l'un à l'autre." #: doc/classes/TextEdit.xml msgid "Returns [code]true[/code] if the selection is active." @@ -74412,15 +74957,14 @@ msgid "Sets the text for a specific line." msgstr "Définit le texte pour la ligne spécifiée." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Bookmarks the [code]line[/code] if [code]bookmark[/code] is [code]true[/" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"Ajoute un marque-page pour la ligne [code]line[/code] si [code]bookmark[/" -"code] est [code]true[/code]. Supprime le marque-page si [code]bookmark[/" -"code] est [code]false[/code].\n" +"Ajoute un marque-page pour la ligne [code]line[/code] si " +"[code]bookmark[/code] est [code]true[/code]. Supprime le marque-page si " +"[code]bookmark[/code] est [code]false[/code].\n" "Les marque-pages sont affichés dans [member breakpoint_gutter]." #: doc/classes/TextEdit.xml @@ -74486,9 +75030,8 @@ msgid "If [code]true[/code], a right-click displays the context menu." msgstr "Si [code]true[/code], un clic droit affiche le menu contextuel." #: doc/classes/TextEdit.xml -#, fuzzy msgid "If [code]true[/code], allow drag and drop of selected text." -msgstr "Si [code]true[/code], la valeur peut être sélectionnée et modifiée." +msgstr "" #: doc/classes/TextEdit.xml msgid "" @@ -74592,13 +75135,10 @@ msgid "" msgstr "" #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "If [code]true[/code], any custom color properties that have been set for " "this [TextEdit] will be visible." msgstr "" -"Si [code]true[/code], les présélections de couleurs enregistrées sont " -"visibles." #: doc/classes/TextEdit.xml msgid "String value of the [TextEdit]." @@ -74748,9 +75288,8 @@ msgstr "" "Définit le [StyleBox] de ce [TextEdit] quand [member readonly] est activé." #: doc/classes/TextMesh.xml -#, fuzzy msgid "Generate an [PrimitiveMesh] from the text." -msgstr "Générer un [TriangleMesh] à partir du maillage." +msgstr "Génère un [PrimitiveMesh] à partir du texte." #: doc/classes/TextMesh.xml msgid "" @@ -74775,9 +75314,8 @@ msgid "" msgstr "" #: doc/classes/TextMesh.xml -#, fuzzy msgid "[Font] used for the [TextMesh]'s text." -msgstr "[Font] utilisée pour le texte du [Label]." +msgstr "La [Font] utilisée pour le texte du [TextMesh]." #: doc/classes/TextMesh.xml msgid "" @@ -74786,14 +75324,12 @@ msgid "" msgstr "" #: doc/classes/TextMesh.xml -#, fuzzy msgid "The size of one pixel's width on the text to scale it in 3D." -msgstr "La taille d'un des pixels de la sprite pour définir sa taille en 3D." +msgstr "La taille d'un des pixels du texte pour définir sa taille en 3D." #: doc/classes/TextMesh.xml -#, fuzzy msgid "The text to generate mesh from." -msgstr "Le type à partir duquel obtenir la constante." +msgstr "" #: doc/classes/Texture.xml msgid "Texture for 2D and 3D." @@ -74851,9 +75387,8 @@ msgid "Returns the texture width." msgstr "Renvoie la largeur de texture." #: doc/classes/Texture.xml -#, fuzzy msgid "Returns [code]true[/code] if this [Texture] has an alpha channel." -msgstr "Retourne [code]true[/code] (vrai) si la chaîne de caractères est vide." +msgstr "" #: doc/classes/Texture.xml msgid "" @@ -74912,9 +75447,8 @@ msgid "Texture is a video surface." msgstr "La texture est une surface vidéo." #: doc/classes/Texture3D.xml -#, fuzzy msgid "Texture with 3 dimensions." -msgstr "Retourne les dimensions de bitmap." +msgstr "" #: doc/classes/Texture3D.xml msgid "" @@ -75498,46 +76032,33 @@ msgid "Clears all values on the theme." msgstr "Efface toutes les valeurs de ce thème." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the [Color] at [code]name[/code] if the theme has [code]node_type[/" "code]." -msgstr "Multiplie le transform [code]a[/code] par le transform [code]b[/code]." +msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the constant at [code]name[/code] if the theme has [code]node_type[/" "code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/" "code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the icon at [code]name[/code] if the theme has [code]node_type[/code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears [StyleBox] at [code]name[/code] if the theme has [code]node_type[/" "code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml msgid "" @@ -75560,13 +76081,10 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "Définit les valeurs du thème à partir d'une copie d'un thème donné." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the [Color] at [code]name[/code] if the theme has [code]node_type[/" "code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml msgid "" @@ -75581,13 +76099,10 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the constant at [code]name[/code] if the theme has [code]node_type[/" "code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml msgid "" @@ -75623,13 +76138,10 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " "[code]node_type[/code]." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml msgid "" @@ -75706,11 +76218,9 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns a list of all type variations for the given [code]base_type[/code]." msgstr "" -"Retourne l'index de l'élément avec l'identifiant [code]id[/code] spécifié." #: doc/classes/Theme.xml msgid "" @@ -75730,13 +76240,10 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if this theme has a valid [member default_font] " "value." msgstr "" -"Retourne [code]true[/code] si la chaîne de caractères est vide (longueur de " -"la chaîne égale à [code]0[/code])." #: doc/classes/Theme.xml msgid "" @@ -75770,13 +76277,10 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [code]theme_type[/code] is marked as a " "variation of [code]base_type[/code]." msgstr "" -"Retourne [code]true[/code] si la piste donnée est importée. Sinon retourne " -"[code]false[/code]." #: doc/classes/Theme.xml msgid "" @@ -75903,9 +76407,8 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "Theme's [Color] item type." -msgstr "Le type [Color] du thème." +msgstr "Le type de l'élément [Color] du thème." #: doc/classes/Theme.xml msgid "Theme's constant item type." @@ -76074,13 +76577,10 @@ msgid "" msgstr "" #: doc/classes/TileMap.xml -#, fuzzy msgid "" "Returns an array of all cells with the given tile index specified in " "[code]id[/code]." msgstr "" -"Renvoie la texture de l’atlas de police de caractères à l’index [code]idx[/" -"code]." #: doc/classes/TileMap.xml msgid "Returns a rectangle enclosing the used (non-empty) tiles of the map." @@ -76195,9 +76695,8 @@ msgid "" msgstr "" #: doc/classes/TileMap.xml -#, fuzzy msgid "If [code]true[/code], this TileMap bakes a navigation region." -msgstr "Si [code]true[/code], l'animation nommée existe." +msgstr "" #: doc/classes/TileMap.xml #, fuzzy @@ -76231,11 +76730,10 @@ msgstr "" "valeurs possibles." #: doc/classes/TileMap.xml -#, fuzzy msgid "" "If [code]true[/code], the TileMap's direct children will be drawn in order " "of their Y coordinate." -msgstr "Si [code]true[/code], la frontière de la ligne sera anti-aliasée." +msgstr "" #: doc/classes/TileMap.xml msgid "" @@ -76391,7 +76889,6 @@ msgid "Tile origin at its bottom-left corner." msgstr "Origine de tuile à son coin inférieur gauche." #: doc/classes/TileSet.xml -#, fuzzy msgid "Tile library for tilemaps." msgstr "La bibliothèque des tuiles pour les cartes." @@ -77233,7 +77730,6 @@ msgstr "" "[InputEventAction]." #: doc/classes/TouchScreenButton.xml -#, fuzzy msgid "The button's bitmask." msgstr "Le masque binaire du bouton." @@ -77644,9 +78140,8 @@ msgid "Clears the server from all translations." msgstr "Efface le serveur de toutes les traductions." #: doc/classes/TranslationServer.xml -#, fuzzy msgid "Returns an array of all loaded locales of the project." -msgstr "Renvoie la valeur absolue du paramètre." +msgstr "" #: doc/classes/TranslationServer.xml msgid "" @@ -77889,9 +78384,8 @@ msgid "" msgstr "" #: doc/classes/Tree.xml -#, fuzzy msgid "Causes the [Tree] to jump to the specified [TreeItem]." -msgstr "Définit la position du nÅ“ud spécifié." +msgstr "" #: doc/classes/Tree.xml msgid "" @@ -78329,13 +78823,10 @@ msgstr "" "[code]column[/code]." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the [Texture] of the button at index [code]button_idx[/code] in " "column [code]column[/code]." msgstr "" -"Rentourne [code]true[/code] (vrai) si le bouton d'index [code]button[/code] " -"est préssé. Voir [enum JoyButtonList]." #: doc/classes/TreeItem.xml msgid "" @@ -78350,13 +78841,10 @@ msgid "Returns the number of buttons in column [code]column[/code]." msgstr "Retourne le nombre de boutons dans la colonne [code]column[/code]." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the id for the button at index [code]button_idx[/code] in column " "[code]column[/code]." msgstr "" -"Rentourne [code]true[/code] (vrai) si le bouton d'index [code]button[/code] " -"est préssé. Voir [enum JoyButtonList]." #: doc/classes/TreeItem.xml msgid "" @@ -78367,9 +78855,8 @@ msgstr "" "[code]button_idx[/code] dans la colonne [code]column[/code]." #: doc/classes/TreeItem.xml -#, fuzzy msgid "Returns the column's cell mode." -msgstr "Retourne le mode de la cellule de la colonne." +msgstr "Retourne le mode des cellules de la colonne." #: doc/classes/TreeItem.xml msgid "" @@ -78391,9 +78878,8 @@ msgid "Returns [code]true[/code] if [code]expand_right[/code] is set." msgstr "Retourne [code]true[/code] si [code]expand_right[/code] est défini." #: doc/classes/TreeItem.xml -#, fuzzy msgid "Returns the given column's icon [Texture]. Error if no icon is set." -msgstr "Retourne l'alignement du texte de la colonne donnée." +msgstr "" #: doc/classes/TreeItem.xml msgid "Returns the column's icon's maximum width." @@ -78414,16 +78900,14 @@ msgid "" msgstr "" #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the next sibling TreeItem in the tree or a null object if there is " "none." msgstr "" -"Retourne le TreeItem précédent dans l'arbre ou un objet nul s'il n'y en a " -"pas." +"Retourne le TreeItem suivant dans l'arborescence, ou l'objet null s'il n'y " +"en a pas." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the next visible sibling TreeItem in the tree or a null object if " "there is none.\n" @@ -78431,7 +78915,8 @@ msgid "" "visible element in the tree when called on the last visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"Retourne le TreeItem suivant visible dans l'arborescence ou null si aucun.\n" +"Retourne le TreeItem voisin suivant visible dans l'arborescence, ou null si " +"aucun.\n" "Si [code]wrap[/code] est activé, la méthode repartira depuis le premier " "élément visible de l'arborescence si elle est appelé sur le dernier élément, " "sinon elle retournera [code]null[/code]." @@ -78441,16 +78926,14 @@ msgid "Returns the parent TreeItem or a null object if there is none." msgstr "Renvoie le TreeItem parent ou un objet nul s’il n’y en a pas." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the previous sibling TreeItem in the tree or a null object if there " "is none." msgstr "" -"Retourne le TreeItem précédent dans l'arbre ou un objet nul s'il n'y en a " -"pas." +"Retourne le TreeItem précédent dans l'arborescence, ou l'objet null s'il n'y " +"en a pas." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the previous visible sibling TreeItem in the tree or a null object " "if there is none.\n" @@ -78458,8 +78941,8 @@ msgid "" "visible element in the tree when called on the first visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"Retourne le TreeItem précédent visible dans l'arborescence ou null si " -"aucun.\n" +"Retourne le TreeItem voisin précédent visible dans l'arborescence, ou null " +"si aucun.\n" "Si [code]wrap[/code] est activé, la méthode repartira depuis le dernier " "élément visible de l'arborescence si elle est appelé sur le premier élément, " "sinon elle retournera [code]null[/code]." @@ -78541,12 +79024,10 @@ msgid "Selects the column [code]column[/code]." msgstr "Sélectionne la colonne [code]column[/code]." #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Sets the given column's button [Texture] at index [code]button_idx[/code] to " "[code]button[/code]." msgstr "" -"Déplace l’élément de l’index [code]from_idx[/code] à [code]to_idx[/code]." #: doc/classes/TreeItem.xml msgid "" @@ -78846,7 +79327,6 @@ msgid "" msgstr "" #: doc/classes/Tween.xml -#, fuzzy msgid "" "Resets all tweens to their initial values (the ones given, not those before " "the tween)." @@ -79960,9 +80440,8 @@ msgid "Vertical box container." msgstr "Conteneur vertical." #: doc/classes/VBoxContainer.xml -#, fuzzy msgid "Vertical box container. See [BoxContainer]." -msgstr "Conteneur vertical. Voir [BoxContainer]." +msgstr "Conteneur de boites vertical. Voir [BoxContainer]." #: doc/classes/VBoxContainer.xml msgid "The vertical space between the [VBoxContainer]'s elements." @@ -80186,9 +80665,8 @@ msgid "" msgstr "" #: doc/classes/Vector2.xml doc/classes/Vector3.xml -#, fuzzy msgid "Returns this vector projected onto the vector [code]b[/code]." -msgstr "Retourne le vecteur projeté sur le vecteur [code]b[/code]." +msgstr "Retourne ce vecteur projeté sur le vecteur [code]b[/code]." #: doc/classes/Vector2.xml msgid "" @@ -80197,13 +80675,12 @@ msgid "" msgstr "" #: doc/classes/Vector2.xml -#, fuzzy msgid "" "Returns the vector rotated by [code]angle[/code] (in radians). See also " "[method @GDScript.deg2rad]." msgstr "" -"Retourne le vecteur pivoté par [code]phi[/code] en radians. Voir aussi " -"[method @GDScript.deg2rad]." +"Retourne le vecteur pivoté par [code]angle[/code] (en radians). Voir aussi [" +"method @GDScript.deg2rad]." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -80805,7 +81282,6 @@ msgid "" msgstr "" #: modules/gdnative/doc_classes/VideoStreamGDNative.xml -#, fuzzy msgid "[VideoStream] resource for video formats implemented via GDNative." msgstr "" "La ressource [VideoStream] pour les formats vidéo implémentés via GDNative." @@ -80961,12 +81437,10 @@ msgid "Returns the topmost modal in the stack." msgstr "Retourne la vue exclusive la plus en avant dans la pile." #: doc/classes/Viewport.xml -#, fuzzy msgid "" "Returns the mouse's position in this [Viewport] using the coordinate system " "of this [Viewport]." msgstr "" -"Retourne la position de la souris par rapport à la position de cet élément." #: doc/classes/Viewport.xml msgid "Returns information about the viewport from the rendering pipeline." @@ -80977,9 +81451,8 @@ msgid "Returns the [enum ShadowAtlasQuadrantSubdiv] of the specified quadrant." msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "Returns the size override set with [method set_size_override]." -msgstr "Renvoie le mode de remplacement de l’espace pour la zone." +msgstr "" #: doc/classes/Viewport.xml msgid "" @@ -81009,9 +81482,8 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "Returns [code]true[/code] if there are visible modals on-screen." -msgstr "Retourne [code]true[/code] si la colonne donnée est cochée." +msgstr "" #: doc/classes/Viewport.xml msgid "Returns [code]true[/code] if the drag operation is successful." @@ -81074,9 +81546,8 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "If [code]true[/code], the viewport will be used in AR/VR process." -msgstr "Si [code]true[/code], la texture sera centrée." +msgstr "" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will process 2D audio streams." @@ -81260,10 +81731,8 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "If [code]true[/code], the size override affects stretch as well." msgstr "" -"Si [code]true[/code], le mouvement linéaire à travers l’axe Z est limité." #: doc/classes/Viewport.xml msgid "" @@ -81294,9 +81763,8 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "The custom [World] which can be used as 3D environment source." -msgstr "Une constante [Transform], qui peut être utilisée comme nÅ“ud d’entrée." +msgstr "" #: doc/classes/Viewport.xml msgid "The custom [World2D] which can be used as 2D environment source." @@ -81397,14 +81865,12 @@ msgid "Amount of surface changes in frame." msgstr "Le nombre de surfaces changées à chaque trame." #: doc/classes/Viewport.xml -#, fuzzy msgid "Amount of draw calls in frame." -msgstr "Le nombre d'appels d'affichage à chaque trame." +msgstr "Le nombre d'appels de dessin à chaque trame." #: doc/classes/Viewport.xml -#, fuzzy msgid "Amount of items or joined items in frame." -msgstr "Quantité d’objets dans le cadre." +msgstr "" #: doc/classes/Viewport.xml msgid "Represents the size of the [enum RenderInfo] enum." @@ -81651,15 +82117,14 @@ msgid "This enabler will stop [Particles2D] nodes." msgstr "Cet activateur arrêtera les nÅ“uds [Particles2D]." #: doc/classes/VisibilityEnabler2D.xml -#, fuzzy msgid "This enabler will stop the parent's [method Node._process] function." -msgstr "Cet activateur arrêtera la fonction _process du parent." +msgstr "Cet activateur arrêtera la fonction [method Node._process] du parent." #: doc/classes/VisibilityEnabler2D.xml -#, fuzzy msgid "" "This enabler will stop the parent's [method Node._physics_process] function." -msgstr "Cet activateur arrêtera la fonction _physics_process du parent." +msgstr "" +"Cet activateur arrêtera la fonction [method Node._physics_process] du parent." #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will stop [AnimatedSprite] nodes animations." @@ -81713,15 +82178,12 @@ msgid "" msgstr "" #: doc/classes/VisibilityNotifier.xml -#, fuzzy msgid "Emitted when the VisibilityNotifier enters a [Camera]'s view." -msgstr "" -"Émis lorsque le VisibilityNotifier3D entre dans la vue d’un [Camera3D]." +msgstr "Émis lorsque le VisibilityNotifier entre dans la vue d’un [Camera]." #: doc/classes/VisibilityNotifier.xml -#, fuzzy msgid "Emitted when the VisibilityNotifier exits a [Camera]'s view." -msgstr "Émis lorsque le VisibilityNotifier3D quitte la vue d'un [Camera3D]." +msgstr "Émis lorsque le VisibilityNotifier quitte la vue d'un [Camera]." #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier enters the screen." @@ -81754,9 +82216,8 @@ msgid "" msgstr "" #: doc/classes/VisibilityNotifier2D.xml -#, fuzzy msgid "The VisibilityNotifier2D's bounding rectangle." -msgstr "Rectangle englobant de VisibilityNotifier2D." +msgstr "Le rectangle englobant du VisibilityNotifier2D." #: doc/classes/VisibilityNotifier2D.xml msgid "Emitted when the VisibilityNotifier2D enters the screen." @@ -81794,6 +82255,8 @@ msgid "" "Returns the [AABB] (also known as the bounding box) for this " "[VisualInstance]. See also [method get_transformed_aabb]." msgstr "" +"Retourne le [AABB] (\"bounding box\") pour cette [VisualInstance]. Voir " +"aussi [method get_transformed_aaabb]." #: doc/classes/VisualInstance.xml msgid "" @@ -81801,6 +82264,8 @@ msgid "" "example, if the Node is a [MeshInstance], this will return the RID of the " "associated [Mesh]." msgstr "" +"Retourne le RID de la ressource associée à cette [VisualInstance]. Par " +"exemple, si le nÅ“ud est une [MeshInstance], cela retournera le RID du [Mesh]." #: doc/classes/VisualInstance.xml msgid "" @@ -81808,12 +82273,18 @@ msgid "" "by [method VisualServer.instance_create]. This RID is needed if you want to " "call [VisualServer] functions directly on this [VisualInstance]." msgstr "" +"Retourne le RID de cette instance. Ce RID est le même que le RID retourné " +"par [method VisualServer.instance_create]. Ce RID est nécessaire si vous " +"voulez appeler les fonctions [VisualServer] directement sur cette " +"[VisualInstance]." #: doc/classes/VisualInstance.xml msgid "" "Returns [code]true[/code] when the specified layer is enabled in [member " "layers] and [code]false[/code] otherwise." msgstr "" +"Retourne [code]true[/code] si le calque spécifié est actif, ou " +"[code]false[/code] sinon." #: doc/classes/VisualInstance.xml msgid "" @@ -81822,6 +82293,11 @@ msgid "" "Transformed in this case means the [AABB] plus the position, rotation, and " "scale of the [Spatial]'s [Transform]. See also [method get_aabb]." msgstr "" +"Retourne la [AABB] (\"bounding box\") transformée pour cette " +"[VisualInstance].\n" +"Transformé dans ce cas veut dire la [AABB] plus sa position, la rotation et " +"la mise à l'échelle de la [Transform] du [Spatial]. Voir aussi [method " +"get_aabb]." #: doc/classes/VisualInstance.xml msgid "" @@ -81829,6 +82305,9 @@ msgid "" "changes how the engine handles the [VisualInstance] under the hood. " "Equivalent to [method VisualServer.instance_set_base]." msgstr "" +"Définit la ressource qui est instanciée par cette [VisualInstance] qui " +"modifie la façon dont le moteur gère la [VisualInstance] en interne. " +"Équivalent à [method VisualServer.instance_set_base]." #: doc/classes/VisualInstance.xml msgid "Enables a particular layer in [member layers]." @@ -81840,10 +82319,14 @@ msgid "" "This object will only be visible for [Camera]s whose cull mask includes the " "render object this [VisualInstance] is set to." msgstr "" +"Le(s) calque(s) de rendu où cette [VisualInstance] est dessinée.\n" +"Cet objet ne sera visible que pour les [Camera] où le masque de cull inclut " +"l'objet de rendu auquel [VisualInstance] est défini." #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" +"Un script implémenté dans l'environnement de programmation Visual Script." #: modules/visual_script/doc_classes/VisualScript.xml msgid "" @@ -81872,6 +82355,8 @@ msgid "" "Add a variable to the VisualScript, optionally giving it a default value or " "marking it as exported." msgstr "" +"Ajouter une variable au VisualScript, en option lui donnant une valeur par " +"défaut ou la marquant comme exporté." #: modules/visual_script/doc_classes/VisualScript.xml msgid "" @@ -81927,7 +82412,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns the id of a function's entry point node." -msgstr "" +msgstr "Retourne l'identifiant d'un nÅ“ud de point d'entrée de la fonction." #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns the position of the center of the screen for a given function." @@ -81954,6 +82439,8 @@ msgid "" "Returns the information for a given variable as a dictionary. The " "information includes its name, type, hint and usage." msgstr "" +"Retourne les informations d'une variable donnée dans un dictionnaire. Les " +"informations comprennent son nom, son type, un indice et son usage." #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns whether a signal exists with the specified name." @@ -82014,16 +82501,23 @@ msgid "" "Unlike [method data_connect], there isn't a [code]to_port[/code], since the " "target node can have only one sequence port." msgstr "" +"Connecte deux ports d'une séquence. L'exécution passera de " +"[code]from_output[/code] de [code]from_node[/code] vers [code]to_node[/code]." +"\n" +"Contrairement à [method data_connect], il n'y a pas ∂e [code]to_port[/code], " +"puisque le nÅ“ud cible ne peut avoir qu'un seul port dans la séquence." #: modules/visual_script/doc_classes/VisualScript.xml msgid "" "Disconnect two sequence ports previously connected with [method " "sequence_connect]." msgstr "" +"Déconnecte deux ports de séquence précédemment connectés avec [method " +"sequence_connect]." #: modules/visual_script/doc_classes/VisualScript.xml msgid "Position the center of the screen for a function." -msgstr "" +msgstr "Positionne le centre de l'écran sur une fonction." #: modules/visual_script/doc_classes/VisualScript.xml msgid "Set the base type of the script." @@ -82054,13 +82548,15 @@ msgstr "Émis quand les ports d'un nÅ“ud ont changés." #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "A Visual Script node representing a constant from the base types." -msgstr "" +msgstr "Un nÅ“ud Visual Script représentant une constante d'un type de base." #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "" "A Visual Script node representing a constant from base types, such as " "[constant Vector3.AXIS_X]." msgstr "" +"Un nÅ“ud Visual Script représentant une constante des types de base, comme [" +"constant Vector3.AXIS_X]." #: modules/visual_script/doc_classes/VisualScriptBasicTypeConstant.xml msgid "The type to get the constant from." @@ -82072,7 +82568,7 @@ msgstr "Le nom de la constante à retourner." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "A Visual Script node used to call built-in functions." -msgstr "" +msgstr "Un nÅ“ud Visual Script utilisé pour appeler des fonctions intégrées." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" @@ -82080,6 +82576,9 @@ msgid "" "function or an utility function.\n" "See also [@GDScript], for the same functions in the GDScript language." msgstr "" +"Une fonction intégrée utilisée dans un [VisualScript]. C'est généralement " +"une fonction de mathématiques ou une fonction utilitaire.\n" +"Voir aussi @[GDScript], pour les mêmes fonctions dans le langage GDScript." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "The function to be executed." @@ -82126,6 +82625,8 @@ msgid "" "Return the arc tangent of the input, using the signs of both parameters to " "determine the exact angle." msgstr "" +"Retourner l'arc tangente de l'entrée, en utilisant les signes des deux " +"paramètres pour déterminer l'angle exact." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return the square root of the input." @@ -82144,6 +82645,8 @@ msgid "" "Return the positive remainder of one input divided by the other, using " "floating-point numbers." msgstr "" +"Retourner le reste positif d'une entrée divisée par l'autre, en utilisant " +"des flottants." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return the input rounded down." @@ -82166,6 +82669,8 @@ msgid "" "Return the sign of the input, turning it into 1, -1, or 0. Useful to " "determine if the input is positive or negative." msgstr "" +"Retourner le signe de l'entrée, le transformant en 1, -1, ou 0. Utile pour " +"déterminer si l'entrée est positive ou négative." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return the input raised to a given power." @@ -82176,18 +82681,26 @@ msgid "" "Return the natural logarithm of the input. Note that this is not the typical " "base-10 logarithm function calculators use." msgstr "" +"Retourner le logarithme népérien de l'entrée. Notez que ce n'est pas " +"l'utilisation typique des calculatrices avec la fonction logarithme en " +"base-10." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" "Return the mathematical constant [b]e[/b] raised to the specified power of " "the input. [b]e[/b] has an approximate value of 2.71828." msgstr "" +"Retourner la constante mathématique [b]e[/b] à la puissance spécifiée par " +"l'entrée. [b]e[/b] a une valeur approximativement égal à 2.71828." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" "Return whether the input is NaN (Not a Number) or not. NaN is usually " "produced by dividing 0 by 0, though other ways exist." msgstr "" +"Retourne si l'entrée la valeur spéciale NaN qui signifie que ce n'est pas un " +"nombre (\"Not a Number\") ou non. NaN est généralement produit en divisant 0 " +"par 0, entre autre." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" @@ -82195,6 +82708,8 @@ msgid "" "Infinity is usually produced by dividing a number by 0, though other ways " "exist." msgstr "" +"Retourne si l'entrée est un nombre flottant infini ou non. L'infini est " +"généralement produit en divisant un nombre par 0, entre autre." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" @@ -82207,7 +82722,6 @@ msgstr "" "progressive." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml -#, fuzzy msgid "" "Return the number of digit places after the decimal that the first non-zero " "digit occurs." @@ -82217,13 +82731,16 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return the input snapped to a given step." -msgstr "" +msgstr "Retourner l'entrée arrondie à l'étape donnée la plus proche." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" "Return a number linearly interpolated between the first two inputs, based on " "the third input. Uses the formula [code]a + (a - b) * t[/code]." msgstr "" +"Retourner un nombre linéairement interpolé entre les deux premières entrées, " +"basé sur la troisième entrée. Utilise la formule [code]a + (a - b) * " +"t[/code]." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Moves the number toward a value, based on the third input." @@ -82250,12 +82767,17 @@ msgid "" "N (where N is smaller than 2^32 - 1), you can use it with the remainder " "function." msgstr "" +"Retourner une entier de 32 bits aléatoire. Pour obtenir une valeur aléatoire " +"entre 0 et N (où N est plus petit que 2^32 - 1), vous pouvez l'utiliser avec " +"la fonction modulo (retournant le reste de la division euclidienne)." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" "Return a random floating-point value between 0 and 1. To obtain a random " "value between 0 to N, you can use it with multiplication." msgstr "" +"Retourner un flottant aléatoire entre 0 et 1. Pour obtenir une valeur " +"aléatoire entre 0 à N, vous pouvez multiplier cette valeur avec N." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return a random floating-point value between the two inputs." @@ -82304,6 +82826,9 @@ msgid "" "never outside it. Equivalent to [code]min(max(input, range_low), range_high)" "[/code]." msgstr "" +"Retourner l'entrée limitée à l'intervalle donné, s'assurant que le résultat " +"n'est jamais en dehors de l'intervalle. Équivalent à [code]min(max(input, " +"minimum), maximum)[/code]." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Return the nearest power of 2 to the input." @@ -82326,6 +82851,8 @@ msgid "" "Return the type of the input as an integer. Check [enum Variant.Type] for " "the integers that might be returned." msgstr "" +"Retourner le type d'entrée en entier. Regardez [enum Variant.Type] pour les " +"valeurs des entiers qui peuvent être retournés." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Checks if a type is registered in the [ClassDB]." @@ -82378,6 +82905,8 @@ msgid "" "Return the [Color] with the given name and alpha ranging from 0 to 1.\n" "[b]Note:[/b] Names are defined in [code]color_names.inc[/code]." msgstr "" +"Retourner la [Color] avec le nom donné et alpha allant de 0 à 1.\n" +"[b]Note :[/b] Les noms sont définis dans [code]color_names.inc[/code]." #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "" @@ -82389,6 +82918,14 @@ msgid "" "return t * t * (3.0 - 2.0 * t)\n" "[/codeblock]" msgstr "" +"Retourner un nombre correctement interpolé entre les deux premières entrées, " +"en fonction de la troisième entrée. Comme [constant MATH_LERP], mais " +"interpole plus rapidement au début et plus lentement à la fin. Utiliser la " +"formule d'interpolation de Hermite:\n" +"[codeblock]\n" +"var t = clamp((weight - from) / (to - from), 0.0, 1.0)\n" +"return t * t * (3.0 - 2.0 * t)\n" +"[/codeblock]" #: modules/visual_script/doc_classes/VisualScriptBuiltinFunc.xml msgid "Represents the size of the [enum BuiltinFunc] enum." @@ -82503,6 +83040,8 @@ msgid "" "A Visual Script node which calls a base type constructor. It can be used for " "type conversion as well." msgstr "" +"Un nÅ“ud Visual Script qui appelle un constructeur de type de base. Il peut " +"également être utilisé pour la conversion de type." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "A scripted Visual Script node." @@ -82511,6 +83050,8 @@ msgstr "Un nÅ“ud Visual Script scripté." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "A custom Visual Script node which can be scripted in powerful ways." msgstr "" +"Un nÅ“ud Visual Script personnalisé qui peut être scripté de plein de " +"manières." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "Return the node's title." @@ -82564,6 +83105,8 @@ msgid "" "Return the specified output port's hint. See the [enum @GlobalScope." "PropertyHint] hints." msgstr "" +"Retourne l'indice du port de sortie spécifié. Voir les indices dans [enum " +"@GlobalScope.PropertyHint]." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "Return the specified output port's hint string." @@ -82574,10 +83117,11 @@ msgid "Return the specified output port's name." msgstr "Retourne le nom du port de sortie spécifié." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml -#, fuzzy msgid "" "Return the specified output port's type. See the [enum Variant.Type] values." -msgstr "Représente la taille de l'énumération [enum Variant.Type]." +msgstr "" +"Retourne le type du port de sortie spécifié. Voir [enum Variant.Type] " +"valeurs." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" @@ -82585,6 +83129,9 @@ msgid "" "[b]sequence[/b] port (if there is none, on the place that is usually taken " "by it)." msgstr "" +"Retourne le texte du nÅ“ud personnalisé, qui est affiché juste à côté du port " +"d'entrée [b]séquence[/b] (s'il n'y en a aucun, à l'emplacement où " +"habituellement pris par lui)." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" @@ -82617,18 +83164,24 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "The start mode used the first time when [method _step] is called." msgstr "" +"Le mode de démarrage a utilisé la première fois que [method _step] est " +"appelée." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" "The start mode used when [method _step] is called after coming back from a " "[constant STEP_PUSH_STACK_BIT]." msgstr "" +"Le mode de démarrage utilisé lorsque [method _step] est appelé après être " +"revenu de [constant STEP_PUSH_STACK_BIT]." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" "The start mode used when [method _step] is called after resuming from " "[constant STEP_YIELD_BIT]." msgstr "" +"Le mode de démarrage utilisé lorsque [method _step] est appelé après être " +"revenu de [constant STEP_YIELD_BIT]." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" @@ -82644,6 +83197,9 @@ msgid "" "Hint used by [method _step] to tell that control should return back, either " "hitting a previous [constant STEP_PUSH_STACK_BIT] or exiting the function." msgstr "" +"L'indice utilisé par [method _step] pour dire que la commande doit revenir, " +"soit en atteignant un précédent [constant STEP_PUSH_STACK_BIT] ou en sortant " +"de la fonction." #: modules/visual_script/doc_classes/VisualScriptCustomNode.xml msgid "" @@ -82659,11 +83215,17 @@ msgid "" "Using this requires you to have at least one working memory slot, which is " "used for the [VisualScriptFunctionState]." msgstr "" +"L'indice utilisé par [method _step] pour dire que la fonction doit être " +"attendue.\n" +"En utilisant cela, vous devez avoir au moins un emplacement de mémoire " +"fonctionnel, qui est utilisé pour [VisualScriptFunctionState]." #: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml msgid "" "A Visual Script node which deconstructs a base type instance into its parts." msgstr "" +"Un nÅ“ud Visual Script qui déconstruit une instance de type de base en ses " +"différentes parties." #: modules/visual_script/doc_classes/VisualScriptDeconstruct.xml msgid "The type to deconstruct." @@ -82674,12 +83236,16 @@ msgid "" "Add a custom Visual Script node to the editor. It'll be placed under " "\"Custom Nodes\" with the [code]category[/code] as the parameter." msgstr "" +"Ajoute un nÅ“ud Visual Script personnalisé à l'éditeur. Il sera placé sous " +"\"NÅ“uds personnalisés\" avec la [code]category[/code] en paramètre." #: modules/visual_script/doc_classes/VisualScriptEditor.xml msgid "" "Remove a custom Visual Script node from the editor. Custom nodes already " "placed on scripts won't be removed." msgstr "" +"Retire un nÅ“ud Visual Script personnalisé de l'éditeur. Les nÅ“uds " +"personnalisés déjà placés sur des scripts ne seront pas supprimés." #: modules/visual_script/doc_classes/VisualScriptEditor.xml msgid "Emitted when a custom Visual Script node is added or removed." @@ -82697,6 +83263,11 @@ msgid "" "[b]Output Ports:[/b]\n" "- Sequence" msgstr "" +"Émet un signal spécifié quand il est exécuté.\n" +"[b]Ports d'entrée :[/b]\n" +"- Séquence : [code]emit[/code]\n" +"[b]Ports de sortie :[/b]\n" +"- Séquence" #: modules/visual_script/doc_classes/VisualScriptEmitSignal.xml msgid "The signal to emit." @@ -82704,16 +83275,15 @@ msgstr "Le signal à émettre." #: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml msgid "A Visual Script node returning a singleton from [@GlobalScope]." -msgstr "" +msgstr "Un nÅ“ud Visual Script retournant un singleton parmi @[GlobalScope]." #: modules/visual_script/doc_classes/VisualScriptEngineSingleton.xml msgid "The singleton's name." msgstr "Le nom du singleton." #: modules/visual_script/doc_classes/VisualScriptExpression.xml -#, fuzzy msgid "A Visual Script node that can execute a custom expression." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script qui peut exécuter une expression personnalisée." #: modules/visual_script/doc_classes/VisualScriptExpression.xml msgid "" @@ -82734,9 +83304,8 @@ msgid "" msgstr "" #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml -#, fuzzy msgid "A Visual Script node for calling a function." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script pour appeler une fonction." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" @@ -82750,6 +83319,8 @@ msgid "" "The script to be used when [member call_mode] is set to [constant " "CALL_MODE_INSTANCE]." msgstr "" +"Le script à utiliser lorsque [member call_mode] est défini à [constant " +"CALL_MODE_INSTANCE]." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml @@ -82757,18 +83328,24 @@ msgid "" "The base type to be used when [member call_mode] is set to [constant " "CALL_MODE_INSTANCE]." msgstr "" +"Le type de base à utiliser lorsque [member call_mode] est défini à [constant " +"CALL_MODE_INSTANCE]." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" "The type to be used when [member call_mode] is set to [constant " "CALL_MODE_BASIC_TYPE]." msgstr "" +"Le type à utiliser lorsque [member call_mode] est défini à [constant " +"CALL_MODE_BASIC_TYPE]." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" "[code]call_mode[/code] determines the target object on which the method will " "be called. See [enum CallMode] for options." msgstr "" +"[code]call_mode[/code] détermine l'objet cible sur lequel la méthode sera " +"appelée. Voir [enum CallMode] pour les options." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "The name of the function to be called." @@ -82780,12 +83357,16 @@ msgid "" "The node path to use when [member call_mode] is set to [constant " "CALL_MODE_NODE_PATH]." msgstr "" +"Le chemin nÅ“ud à utiliser lorsque [member call_mode] est défini à [constant " +"CALL_MODE_NODE_PATH]." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" "The mode for RPC calls. See [method Node.rpc] for more details and [enum " "RPCCallMode] for available options." msgstr "" +"Le mode pour les appels RPC. Voir [method Node.rpc] pour plus de détails et [" +"enum RPCCallMode] pour les options disponibles." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" @@ -82801,12 +83382,17 @@ msgid "" "Can't be higher than the number of available default arguments in the " "method's declaration." msgstr "" +"Le nombre d'arguments par défaut qui seront utilisés lors de l'appel de la " +"fonction. Ne peut être supérieur au nombre d'arguments par défaut " +"disponibles dans la déclaration de la méthode." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" "If [code]false[/code], call errors (e.g. wrong number of arguments) will be " "ignored." msgstr "" +"Si [code]false[/code], les erreurs d'appel (par exemple le nombre erroné " +"d'arguments) seront ignorées." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "The method will be called on this [Object]." @@ -82815,12 +83401,15 @@ msgstr "La méthode sera appelée sur cet [Object]." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "The method will be called on the given [Node] in the scene tree." msgstr "" +"La méthode sera appelée sur le [Node] donné dans l'arborescence de la scène." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "" "The method will be called on an instanced node with the given type and " "script." msgstr "" +"La méthode sera appelée sur un nÅ“ud instancié avec le type et le script " +"donnés." #: modules/visual_script/doc_classes/VisualScriptFunctionCall.xml msgid "The method will be called on a GDScript basic type (e.g. [Vector2])." @@ -82852,6 +83441,8 @@ msgid "" "The method will be called remotely for the given peer, using an unreliable " "protocol." msgstr "" +"La méthode sera appelée à distance pour le pair donné, en utilisant un " +"protocole non fiable." #: modules/visual_script/doc_classes/VisualScriptFunctionState.xml msgid "A Visual Script node representing a function state." @@ -82862,12 +83453,16 @@ msgid "" "[VisualScriptFunctionState] is returned from [VisualScriptYield] and can be " "used to resume a paused function call." msgstr "" +"[VisualScriptFunctionState] est retourné depuis [VisualScriptYield] et peut " +"être utilisé pour reprendre un appel de fonction en pause." #: modules/visual_script/doc_classes/VisualScriptFunctionState.xml msgid "" "Connects this [VisualScriptFunctionState] to a signal in the given object to " "automatically resume when it's emitted." msgstr "" +"Connecte ce [VisualScriptFunctionState] à un signal dans l'objet donné pour " +"reprendre automatiquement lorsqu'il est émis." #: modules/visual_script/doc_classes/VisualScriptFunctionState.xml msgid "Returns whether the function state is valid." @@ -82876,61 +83471,63 @@ msgstr "Retourne si l'état de la fonction est valide." #: modules/visual_script/doc_classes/VisualScriptFunctionState.xml msgid "Resumes the function to run from the point it was yielded." msgstr "" +"Reprend la fonction à exécuter à partir du point où elle a été suspendue." #: modules/visual_script/doc_classes/VisualScriptGlobalConstant.xml -#, fuzzy msgid "A Visual Script node returning a constant from [@GlobalScope]." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script retournant une constante de [@GlobalScope]." #: modules/visual_script/doc_classes/VisualScriptGlobalConstant.xml msgid "The constant to be used." msgstr "La constante à utiliser." #: modules/visual_script/doc_classes/VisualScriptIndexGet.xml -#, fuzzy msgid "A Visual Script node for getting a value from an array or a dictionary." msgstr "" -"NÅ“ud de script visuel utilisé pour créer un tableau à partir d’une liste " -"d’éléments." +"Un nÅ“ud Visual Script pour obtenir une valeur d'un tableau ou d'un " +"dictionnaire." #: modules/visual_script/doc_classes/VisualScriptIndexGet.xml msgid "" "[VisualScriptIndexGet] will return the value stored in an array or a " "dictionary under the given index." msgstr "" +"[VisualScriptIndexGet] retourne la valeur enregistrée dans un tableau ou un " +"dictionnaire à l'index donné." #: modules/visual_script/doc_classes/VisualScriptIndexSet.xml -#, fuzzy msgid "A Visual Script node for setting a value in an array or a dictionary." msgstr "" -"NÅ“ud de script visuel utilisé pour créer un tableau à partir d’une liste " -"d’éléments." +"Un nÅ“ud Visual Script pour définir une valeur dans un tableau ou un " +"dictionnaire." #: modules/visual_script/doc_classes/VisualScriptIndexSet.xml msgid "" "[VisualScriptIndexSet] will set the value stored in an array or a dictionary " "under the given index to the provided new value." msgstr "" +"[VisualScriptIndexSet] définira la valeur enregistrée dans un tableau ou un " +"dictionnaire à l'index donné avec la nouvelle valeur fournie." #: modules/visual_script/doc_classes/VisualScriptInputAction.xml -#, fuzzy msgid "A Visual Script node returning a state of an action." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script retournant l'état de l'action." #: modules/visual_script/doc_classes/VisualScriptInputAction.xml msgid "" "[VisualScriptInputAction] can be used to check if an action is pressed or " "released." msgstr "" +"[VisualScriptInputAction] peut être utilisé pour vérifier si une action est " +"pressée ou relâchée." #: modules/visual_script/doc_classes/VisualScriptInputAction.xml msgid "Name of the action." msgstr "Le nom de l'action." #: modules/visual_script/doc_classes/VisualScriptInputAction.xml -#, fuzzy msgid "State of the action to check. See [enum Mode] for options." -msgstr "La fonction à calculer. Voir [enum Function] pour les options." +msgstr "L'état de l'action à vérifier. Voir [enum Mode] pour les options." #: modules/visual_script/doc_classes/VisualScriptInputAction.xml msgid "[code]True[/code] if action is pressed." @@ -82969,32 +83566,31 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptLists.xml msgid "A Visual Script virtual class for in-graph editable nodes." msgstr "" +"Une classe virtuelle Visual Script pour les nÅ“uds modifiables dans le graphe." #: modules/visual_script/doc_classes/VisualScriptLists.xml msgid "" "A Visual Script virtual class that defines the shape and the default " "behavior of the nodes that have to be in-graph editable nodes." msgstr "" +"Une classe virtuelle Visual Script qui définit la forme et le comportement " +"par défaut des nÅ“uds qui doivent être des nÅ“uds modifiables dans le graphe." #: modules/visual_script/doc_classes/VisualScriptLists.xml -#, fuzzy msgid "Adds an input port to the Visual Script node." -msgstr "Un nÅ“ud Visual Script scripté." +msgstr "Ajoute un port d'entrée au nÅ“ud Visual Script." #: modules/visual_script/doc_classes/VisualScriptLists.xml -#, fuzzy msgid "Adds an output port to the Visual Script node." -msgstr "Un nÅ“ud Visual Script scripté." +msgstr "Ajoute un port de sortie au nÅ“ud Visual Script." #: modules/visual_script/doc_classes/VisualScriptLists.xml -#, fuzzy msgid "Removes an input port from the Visual Script node." -msgstr "Supprime un nÅ“ud de la sélection." +msgstr "Supprime un port d'entrée du nÅ“ud Visual Script." #: modules/visual_script/doc_classes/VisualScriptLists.xml -#, fuzzy msgid "Removes an output port from the Visual Script node." -msgstr "Supprime un nÅ“ud de la sélection." +msgstr "Supprime un port de sortie du nÅ“ud Visual Script." #: modules/visual_script/doc_classes/VisualScriptLists.xml msgid "Sets the name of an input port." @@ -83127,13 +83723,15 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptNode.xml msgid "Returns the [VisualScript] instance the node is bound to." -msgstr "" +msgstr "Retourne l'instance [VisualScript] liée à ce nÅ“ud." #: modules/visual_script/doc_classes/VisualScriptNode.xml msgid "" "Notify that the node's ports have changed. Usually used in conjunction with " "[VisualScriptCustomNode] ." msgstr "" +"Notifie quand les ports de ce nÅ“ud ont changé. Habituellement utilisé avec " +"[VisualScriptCustomNode] ." #: modules/visual_script/doc_classes/VisualScriptNode.xml msgid "Change the default value of a given port." @@ -83144,11 +83742,8 @@ msgid "Emitted when the available input/output ports are changed." msgstr "Émis quand les ports entrants/sortants sont changés." #: modules/visual_script/doc_classes/VisualScriptOperator.xml -#, fuzzy msgid "A Visual Script node that performs an operation on two values." -msgstr "" -"NÅ“ud de script visuel utilisé pour créer un tableau à partir d’une liste " -"d’éléments." +msgstr "Un nÅ“ud Visual Script qui effectue une opération sur deux valeurs." #: modules/visual_script/doc_classes/VisualScriptOperator.xml msgid "" @@ -83160,21 +83755,18 @@ msgid "" msgstr "" #: modules/visual_script/doc_classes/VisualScriptOperator.xml -#, fuzzy msgid "" "The operation to be performed. See [enum Variant.Operator] for available " "options." msgstr "" -"Type de multiplication à effectuer. Voir [enum Operator] pour les options." +"Le type d'opération à effectuer. Voir [enum Variant.Operator] pour les " +"options disponibles." #: modules/visual_script/doc_classes/VisualScriptOperator.xml -#, fuzzy msgid "" "The type of the values for this operation. See [enum Variant.Type] for " "available options." msgstr "" -"Définit la valeur d’un paramètre de zone. Voir [enum AreaParameter] pour une " -"liste de paramètres disponibles." #: modules/visual_script/doc_classes/VisualScriptPreload.xml msgid "Creates a new [Resource] or loads one from the filesystem." @@ -83195,17 +83787,17 @@ msgid "The [Resource] to load." msgstr "La [Resource] à charger." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml -#, fuzzy msgid "A Visual Script node returning a value of a property from an [Object]." msgstr "" -"NÅ“ud de script visuel utilisé pour créer un tableau à partir d’une liste " -"d’éléments." +"Un nÅ“ud Visual Script retournant une valeur d'une propriété d'un [Object]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" "[VisualScriptPropertyGet] can return a value of any property from the " "current object or other objects." msgstr "" +"[VisualScriptPropertyGet] peut renvoyer une valeur de toute propriété de " +"l'objet courant ou d'autres objets." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -83213,6 +83805,8 @@ msgid "" "The script to be used when [member set_mode] is set to [constant " "CALL_MODE_INSTANCE]." msgstr "" +"Le script à utiliser lorsque [member set_mode] est défini à [constant " +"CALL_MODE_INSTANCE]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -83220,6 +83814,8 @@ msgid "" "The base type to be used when [member set_mode] is set to [constant " "CALL_MODE_INSTANCE]." msgstr "" +"Le type de base à utiliser lorsque [member set_mode] est défini à [constant " +"CALL_MODE_INSTANCE]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -83227,12 +83823,16 @@ msgid "" "The type to be used when [member set_mode] is set to [constant " "CALL_MODE_BASIC_TYPE]." msgstr "" +"Le type à utiliser lorsque [member set_mode] est défini à [constant " +"CALL_MODE_BASIC_TYPE]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" "The indexed name of the property to retrieve. See [method Object." "get_indexed] for details." msgstr "" +"Le nom indexé de la propriété à récupérer. Voir [method Object.get_indexed] " +"pour plus de détails." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -83240,34 +83840,40 @@ msgid "" "The node path to use when [member set_mode] is set to [constant " "CALL_MODE_NODE_PATH]." msgstr "" +"Le chemin du nÅ“ud à utiliser lorsque [member set_mode] est défini à [" +"constant CALL_MODE_NODE_PATH]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" "The name of the property to retrieve. Changing this will clear [member " "index]." msgstr "" +"Le nom de la propriété à récupérer. Changer cela effecera [member index]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" "[code]set_mode[/code] determines the target object from which the property " "will be retrieved. See [enum CallMode] for options." msgstr "" +"[code]set_mode[/code] détermine l'objet cible à partir duquel la propriété " +"sera récupérée. Voir [enum CallMode] pour les options." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "The property will be retrieved from this [Object]." msgstr "La propriété sera récupérée depuis cet [Object]." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml -#, fuzzy msgid "The property will be retrieved from the given [Node] in the scene tree." msgstr "" -"Le propriété est sérialisé et sauvegardé dans le fichier de la scène(défaut)." +"La propriété sera récupérée du [Node] donné dans l'arborescence de la scène." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" "The property will be retrieved from an instanced node with the given type " "and script." msgstr "" +"La propriété sera récupérée à partir d'un nÅ“ud instancié avec le type et le " +"script donnés." #: modules/visual_script/doc_classes/VisualScriptPropertyGet.xml msgid "" @@ -83277,23 +83883,23 @@ msgstr "" "[Vector2])." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml -#, fuzzy msgid "A Visual Script node that sets a property of an [Object]." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud de script visuel qui définit une propriété d'un [Object]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "[VisualScriptPropertySet] can set the value of any property from the current " "object or other objects." msgstr "" +"[VisualScriptPropertySet] peut définir la valeur de toute propriété à partir " +"de l'objet courant ou d'autres objets." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml -#, fuzzy msgid "" "The additional operation to perform when assigning. See [enum AssignOp] for " "options." msgstr "" -"L'opérateur additionelle à effectuer lors de l'assignation. Voir [enum " +"L'opérateur d'addition à effectuer lors de l'assignation. Voir [enum " "AssignOp] pour les options." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml @@ -83301,32 +83907,37 @@ msgid "" "The indexed name of the property to set. See [method Object.set_indexed] for " "details." msgstr "" +"Le nom indexé de la propriété à définir. Voir [method Object.set_indexed] " +"pour plus de détails." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The name of the property to set. Changing this will clear [member index]." -msgstr "" +msgstr "Le nom de la propriété à définir. Changer cela effecera [member index]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "[code]set_mode[/code] determines the target object on which the property " "will be set. See [enum CallMode] for options." msgstr "" +"[code]set_mode[/code] détermine l'objet cible sur lequel la propriété sera " +"définie. Voir [enum CallMode] pour les options." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "The property will be set on this [Object]." msgstr "La propriété sera définie dans cet [Object]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml -#, fuzzy msgid "The property will be set on the given [Node] in the scene tree." msgstr "" -"Le propriété est sérialisé et sauvegardé dans le fichier de la scène(défaut)." +"La propriété sera placée sur le [Node] donné dans l'arborescence de la scène." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The property will be set on an instanced node with the given type and script." msgstr "" +"La propriété sera définie sur un nÅ“ud instancié avec le type et le script " +"donnés." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "The property will be set on a GDScript basic type (e.g. [Vector2])." @@ -83372,36 +83983,48 @@ msgid "" "A modulo operation will be performed on the property and the value. " "Equivalent of doing [code]%=[/code]." msgstr "" +"Une opération modulo sera effectuée sur la propriété et la valeur. Revient à " +"écrire [code]%=[/code]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The property will be binarly shifted to the left by the given value. " "Equivalent of doing [code]<<[/code]." msgstr "" +"La propriété sera transférée à gauche par la valeur donnée. Revient de " +"écrire [code]<<[/code]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "The property will be binarly shifted to the right by the given value. " "Equivalent of doing [code]>>[/code]." msgstr "" +"La propriété sera transférée à droite par la valeur donnée. Revient de " +"écrire [code]>>[/code]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "A binary [code]AND[/code] operation will be performed on the property. " "Equivalent of doing [code]&=[/code]." msgstr "" +"Une opération binaire [code]AND[/code] (et) sera effectuée sur la propriété. " +"Revient à écrire [code]&=[/code]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "A binary [code]OR[/code] operation will be performed on the property. " "Equivalent of doing [code]|=[/code]." msgstr "" +"Une opération binaire [code]OR[/code] (ou) sera effectuée sur la propriété. " +"Revient à écrire [code]|=[/code]." #: modules/visual_script/doc_classes/VisualScriptPropertySet.xml msgid "" "A binary [code]XOR[/code] operation will be performed on the property. " "Equivalent of doing [code]^=[/code]." msgstr "" +"Une opération binaire [code]XOR[/code] (ou exclusif) sera effectuée sur la " +"propriété. Revient à écrire [code]^=[/code]." #: modules/visual_script/doc_classes/VisualScriptReturn.xml msgid "Exits a function and returns an optional value." @@ -83536,9 +84159,8 @@ msgid "" msgstr "" #: modules/visual_script/doc_classes/VisualScriptTypeCast.xml -#, fuzzy msgid "A Visual Script node that casts the given value to another type." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "" #: modules/visual_script/doc_classes/VisualScriptTypeCast.xml msgid "" @@ -83606,9 +84228,8 @@ msgid "" msgstr "" #: modules/visual_script/doc_classes/VisualScriptYield.xml -#, fuzzy msgid "A Visual Script node used to pause a function execution." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script pour mettre en pause l'exécution d'une fonction." #: modules/visual_script/doc_classes/VisualScriptYield.xml msgid "" @@ -83617,11 +84238,11 @@ msgid "" msgstr "" #: modules/visual_script/doc_classes/VisualScriptYield.xml -#, fuzzy msgid "" "The mode to use for yielding. See [enum YieldMode] for available options." msgstr "" -"Type de multiplication à effectuer. Voir [enum Operator] pour les options." +"Le mode à utiliser pour suspendre. Voir [enum YieldMode] pour les options " +"disponibles." #: modules/visual_script/doc_classes/VisualScriptYield.xml msgid "The time to wait when [member mode] is set to [constant YIELD_WAIT]." @@ -83640,9 +84261,8 @@ msgid "Yields a function and waits the given time." msgstr "" #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml -#, fuzzy msgid "A Visual Script node yielding for a signal." -msgstr "Un nÅ“ud Visual Script utilisé pour annoter le script." +msgstr "Un nÅ“ud Visual Script pour attendre un signal." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "" @@ -83657,6 +84277,8 @@ msgid "" "[code]call_mode[/code] determines the target object to wait for the signal " "emission. See [enum CallMode] for options." msgstr "" +"[code]call_mode[/code] détermine l'objet cible à attendre avant l'émission " +"du signal. Voir [enum CallMode] pour les options." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "The signal name to be waited for." @@ -83668,11 +84290,11 @@ msgstr "Un signal depuis cet [Object] sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from the given [Node] in the scene tree will be used." -msgstr "" +msgstr "Un signal du [Node] donné dans l'arborescence de la scène sera utilisé." #: modules/visual_script/doc_classes/VisualScriptYieldSignal.xml msgid "A signal from an instanced node with the given type will be used." -msgstr "" +msgstr "Un signal d'un nÅ“ud instancié avec le type donné sera utilisé." #: doc/classes/VisualServer.xml msgid "Server for anything visible." @@ -83711,12 +84333,15 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Sets images to be rendered in the window margin." msgstr "" +"Définit des images dont le rendu sera fait dans les marges de la fenêtre." #: doc/classes/VisualServer.xml msgid "" "Sets margin size, where black bars (or images, if [method " "black_bars_set_images] was used) are rendered." msgstr "" +"Définit la taille de la marge, où des barres noires (ou des images, si [" +"method black_bars_set_images] est utilisé) sont rendues." #: doc/classes/VisualServer.xml msgid "" @@ -83781,6 +84406,10 @@ msgid "" "the vertical aspect ratio which is equivalent to [constant Camera." "KEEP_HEIGHT]." msgstr "" +"Si [code]true[/code], conserve le rapport d'aspect horizontal qui est " +"équivalent à [constant Camera.KEEP_WIDTH]. Si [code]false[/code], conserve " +"le rapport d'aspect vertical qui est équivalent à [constant Camera." +"KEEP_HEIGHT]." #: doc/classes/VisualServer.xml msgid "" @@ -83801,12 +84430,9 @@ msgid "Adds a circle command to the [CanvasItem]'s draw commands." msgstr "Ajouter un cercle aux commandes de dessin du [CanvasItem]." #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If ignore is [code]true[/code], the VisualServer does not perform clipping." msgstr "" -"Si [code]true[/code], le multithreading est utilisé pour améliorer les " -"performances." #: doc/classes/VisualServer.xml msgid "Adds a line command to the [CanvasItem]'s draw commands." @@ -83821,6 +84447,8 @@ msgid "" "Adds a [MultiMesh] to the [CanvasItem]'s draw commands. Only affects its " "aabb at the moment." msgstr "" +"Ajoute un [MultiMesh] aux commandes d'affichage du [CanvasItem]. N'affecte " +"que son aabb pour le moment." #: doc/classes/VisualServer.xml msgid "" @@ -83842,6 +84470,8 @@ msgid "" "Adds a polyline, which is a line from multiple points with a width, to the " "[CanvasItem]'s draw commands." msgstr "" +"Ajoute une suite de lignes, qui est une ligne de plusieurs points avec une " +"largeur, aux commandes d'affichage du [CanvasItem]." #: doc/classes/VisualServer.xml msgid "Adds a primitive to the [CanvasItem]'s draw commands." @@ -83866,6 +84496,8 @@ msgstr "Ajouter un rectangle texturé aux commandes de dessin du [CanvasItem]." msgid "" "Adds a texture rect with region setting to the [CanvasItem]'s draw commands." msgstr "" +"Ajoute un rectangle de texture, avec des réglages de la région à afficher, " +"aux commandes d'affichage du [CanvasItem]." #: doc/classes/VisualServer.xml msgid "Adds a triangle array to the [CanvasItem]'s draw commands." @@ -83874,7 +84506,7 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Clears the [CanvasItem] and removes all commands in it." -msgstr "" +msgstr "Efface le [CanvasItem] et enlève toutes les commandes." #: doc/classes/VisualServer.xml msgid "" @@ -83891,7 +84523,6 @@ msgstr "" "méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets clipping for the [CanvasItem]." msgstr "Définit la coupure pour le [CanvasItem]." @@ -83937,6 +84568,9 @@ msgid "" "Sets the parent for the [CanvasItem]. The parent can be another canvas item, " "or it can be the root canvas that is attached to the viewport." msgstr "" +"Définit le parent du [CanvasItem]. Le parent peut être un autre élément de " +"toile, ou il peut être la toile racine qui est attachée à la fenêtre " +"d'affichage." #: doc/classes/VisualServer.xml msgid "Sets the color that modulates the [CanvasItem] without children." @@ -83958,9 +84592,8 @@ msgid "Sets if the [CanvasItem] uses its parent's material." msgstr "Définit si le [CanvasItem] utilise le même matériau que son parent." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets if the canvas item (including its children) is visible." -msgstr "Masquer le [CanvasItem] s’il est actuellement visible." +msgstr "Définit si la toile (y compris ses enfants) est visible." #: doc/classes/VisualServer.xml msgid "" @@ -84043,9 +84676,8 @@ msgid "Sets a canvas light's energy." msgstr "Définit l'énergie d'une lumière du canevas." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets a canvas light's height." -msgstr "Définit la hauteur d’une toile." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -84059,19 +84691,23 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "The mode of the light, see [enum CanvasLightMode] constants." -msgstr "" +msgstr "Le mode de la lumière, voir les constantes [enum CanvasLightMode]." #: doc/classes/VisualServer.xml msgid "" "Sets the texture's scale factor of the light. Equivalent to [member Light2D." "texture_scale]." msgstr "" +"Définit le facteur d'échelle de la texture de lumière. Équivalent à [member " +"Light2D.texture_scale]" #: doc/classes/VisualServer.xml msgid "" "Sets the width of the shadow buffer, size gets scaled to the next power of " "two for this." msgstr "" +"Définit la largeur du tampon d'ombre, la taille est arrondie à la puissance " +"de deux suivante pour cela." #: doc/classes/VisualServer.xml msgid "Sets the color of the canvas light's shadow." @@ -84143,11 +84779,11 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Sets the shape of the occluder polygon." -msgstr "" +msgstr "Définit la forme du polygone occulteur." #: doc/classes/VisualServer.xml msgid "Sets the shape of the occluder polygon as lines." -msgstr "" +msgstr "Définit la forme du polygone occulteur avec des lignes." #: doc/classes/VisualServer.xml msgid "" @@ -84209,6 +84845,8 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Sets the ambient light parameters. See [Environment] for more details." msgstr "" +"Définit les paramètres de lumière ambiante. Voir [Environnement] pour plus " +"de détails." #: doc/classes/VisualServer.xml msgid "" @@ -84250,18 +84888,24 @@ msgid "" "Sets the variables to be used with the scene fog. See [Environment] for more " "details." msgstr "" +"Définit les variables à utiliser avec le brouillard de scène. Voir " +"[Environnement] pour plus de détails." #: doc/classes/VisualServer.xml msgid "" "Sets the variables to be used with the fog depth effect. See [Environment] " "for more details." msgstr "" +"Définit les variables à utiliser avec l'effet de profondeur du brouillard. " +"Voir [Environnement] pour plus de détails." #: doc/classes/VisualServer.xml msgid "" "Sets the variables to be used with the fog height effect. See [Environment] " "for more details." msgstr "" +"Définit les variables à utiliser avec l'effet de hauteur du brouillard. Voir " +"[Environnement] pour plus de détails." #: doc/classes/VisualServer.xml msgid "" @@ -84280,12 +84924,16 @@ msgid "" "Sets a custom field of view for the background [Sky]. Equivalent to [member " "Environment.background_sky_custom_fov]." msgstr "" +"Définit un angle de vue personnalisé pour le ciel [Sky] en arrière-plan. " +"Équivalent à [member Environnement.background_sky_custom_fov]" #: doc/classes/VisualServer.xml msgid "" "Sets the rotation of the background [Sky] expressed as a [Basis]. Equivalent " "to [member Environment.background_sky_orientation]." msgstr "" +"Définit la rotation du ciel [Sky] en arrière-plan exprimé avec une [Basis]. " +"Équivalent à [member Environnement.background_sky_orientation]" #: doc/classes/VisualServer.xml msgid "" @@ -84329,6 +84977,7 @@ msgstr "Essaye de supprimer un objet dans le VisualServer." #: doc/classes/VisualServer.xml msgid "Returns a certain information, see [enum RenderInfo] for options." msgstr "" +"Retourne une information précise, voir [enum RenderInfo] pour les options." #: doc/classes/VisualServer.xml msgid "Returns the id of the test cube. Creates one if none exists." @@ -84346,6 +84995,10 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" +"Retourne le nom de l'adaptateur vidéo (par exemple \"GeForce GTX 1080/PCIe/" +"SSE2\").\n" +"[b]Note :[/b] Lors de l'exécution d'une version sans graphique ou de " +"serveur, cette fonction retourne une chaîne vide." #: doc/classes/VisualServer.xml msgid "" @@ -84353,6 +85006,10 @@ msgid "" "[b]Note:[/b] When running a headless or server binary, this function returns " "an empty string." msgstr "" +"Retourne le vendeur de l'adaptateur vidéo (par exemple \"NVIDIA Corporation\"" +").\n" +"[b]Note :[/b] Lors de l'exécution d'une version sans graphique ou de " +"serveur, cette fonction retourne une chaîne vide." #: doc/classes/VisualServer.xml msgid "Returns the id of a white texture. Creates one if none exists." @@ -84395,21 +85052,24 @@ msgstr "" "Retourne la taille de la cellule définit par [method gi_probe_set_cell_size]." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the data used by the GI probe." -msgstr "Renvoie l’espace affecté à la zone." +msgstr "Retourne les données utilisées par la sonde GI." #: doc/classes/VisualServer.xml msgid "" "Returns the dynamic range set for this GI probe. Equivalent to [member " "GIProbe.dynamic_range]." msgstr "" +"Retourne la gamme dynamique pour cette sonde GI. Équivalent à [member GIProbe" +".dynamic_range]" #: doc/classes/VisualServer.xml msgid "" "Returns the energy multiplier for this GI probe. Equivalent to [member " "GIProbe.energy]." msgstr "" +"Retourne le multiplicateur d'énergie pour cette sonde GI. Équivalent à [" +"member GIProbe.energy]" #: doc/classes/VisualServer.xml msgid "" @@ -84422,6 +85082,8 @@ msgid "" "Returns the propagation value for this GI probe. Equivalent to [member " "GIProbe.propagation]." msgstr "" +"Retourne la valeur de propagation de cette sonde GI. Équivalent à [member " +"GIProbe.propagation]" #: doc/classes/VisualServer.xml msgid "Returns the Transform set by [method gi_probe_set_to_cell_xform]." @@ -84432,15 +85094,14 @@ msgid "" "Returns [code]true[/code] if the GI probe data associated with this GI probe " "is compressed. Equivalent to [member GIProbe.compress]." msgstr "" +"Retourne [code]true[/code] si les données de cette sonde GI sont " +"compressées. Équivalent à [member GIProbe.compress]" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the GI probe is set to interior, meaning it " "does not account for sky light. Equivalent to [member GIProbe.interior]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml msgid "" @@ -84506,9 +85167,8 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets the to cell [Transform] for this GI probe." -msgstr "Retourne la matrice de transformation globale de cet élément." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -84591,9 +85251,8 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets the material to be used to draw the [ImmediateGeometry]." -msgstr "Retourne le matériel affecté à la [ImmediateGeometry3D]." +msgstr "Définit le matériel utilisé pour afficher le [ImmediateGeometry]." #: doc/classes/VisualServer.xml msgid "" @@ -84875,13 +85534,10 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], light will subtract light instead of adding light. " "Equivalent to [member Light.light_negative]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml msgid "" @@ -84899,13 +85555,10 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], light will cast shadows. Equivalent to [member Light." "shadow_enabled]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml msgid "" @@ -84942,19 +85595,16 @@ msgstr "" "en utilisant la [method instance_set_base] utilisant le RID retourné." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the size of the lightmap capture area." -msgstr "Renvoie le sinus du paramètre." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the energy multiplier used by the lightmap capture." -msgstr "Renvoie le nombre de textures dans l’atlas BitmapFont." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the octree used by the lightmap capture." -msgstr "Renvoie l’espace affecté à la zone." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -84962,9 +85612,8 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the cell transform for this lightmap capture's octree." -msgstr "Retourne la matrice de transformation de la toile de cet objet." +msgstr "" #: doc/classes/VisualServer.xml msgid "Returns [code]true[/code] if capture is in \"interior\" mode." @@ -85032,13 +85681,10 @@ msgid "Returns the value of a certain material's parameter." msgstr "Retourne la valeur du paramètre du matériau." #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Returns the default value for the param if available. Returns [code]null[/" "code] otherwise." msgstr "" -"Retourne la valeur par défaut du paramètre nommé [code]name[/code] du " -"matériau." #: doc/classes/VisualServer.xml msgid "" @@ -85055,9 +85701,8 @@ msgid "Sets an object's next material." msgstr "Définit le prochain matériau d’un objet." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets a material's parameter." -msgstr "Définit le paramètre d’un matériau." +msgstr "Définit le paramètre d'un matériau." #: doc/classes/VisualServer.xml msgid "Sets a material's render priority." @@ -85120,7 +85765,7 @@ msgstr "Supprime la surface d'un maillage." #: doc/classes/VisualServer.xml #, fuzzy msgid "Sets a mesh's blend shape count." -msgstr "Retourne le nombre de formes de mélange d’un maillage." +msgstr "Définit le nombre de formes de mélange d’un maillage." #: doc/classes/VisualServer.xml msgid "Sets a mesh's blend shape mode." @@ -85135,19 +85780,16 @@ msgid "Returns a mesh's surface's aabb." msgstr "Retourne l’aabb de la surface d'un maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's surface's vertex buffer." -msgstr "Retourne l’aabb personnalisé d’un maillage." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's surface's amount of indices." -msgstr "Renvoie le nombre de points de la Ligne2D." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's surface's amount of vertices." -msgstr "Renvoie le nombre de points de la Ligne2D." +msgstr "" #: doc/classes/VisualServer.xml msgid "Returns a mesh's surface's buffer arrays." @@ -85158,32 +85800,28 @@ msgid "Returns a mesh's surface's arrays for blend shapes." msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the format of a mesh's surface." -msgstr "Retourne le nom de la méthode d'une piste de méthode." +msgstr "Retourne le format d'une surface d'un maillage." #: doc/classes/VisualServer.xml msgid "Function is unused in Godot 3.x." msgstr "Cette fonction n'est pas utilisée dans Godot 3.x." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a mesh's surface's index buffer." -msgstr "Retourne le mode de forme de mélange d’un maillage." +msgstr "" #: doc/classes/VisualServer.xml msgid "Returns a mesh's surface's material." msgstr "Retourne le matériau de la surface du maillage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the primitive type of a mesh's surface." -msgstr "Retourne le nom de la méthode d'une piste de méthode." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the aabb of a mesh's surface's skeleton." -msgstr "Retourne la traduction d’un message." +msgstr "" #: doc/classes/VisualServer.xml msgid "Sets a mesh's surface's material." @@ -85457,13 +86095,10 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], uses fractional delta which smooths the movement of " "the particles. Equivalent to [member Particles.fract_delta]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml msgid "" @@ -85533,13 +86168,12 @@ msgstr "" "retourné." #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], reflections will ignore sky contribution. Equivalent " "to [member ReflectionProbe.interior_enable]." msgstr "" "Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." +"Équivalent à [member ReflectionProbe.interior_enable]." #: doc/classes/VisualServer.xml msgid "" @@ -85575,23 +86209,17 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Sets the ambient light color for this reflection probe when set to interior " "mode. Equivalent to [member ReflectionProbe.interior_ambient_color]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Sets the energy multiplier for this reflection probes ambient light " "contribution when set to interior mode. Equivalent to [member " "ReflectionProbe.interior_ambient_energy]." msgstr "" -"Si [code]true[/code], les réflexions ignoreront la contribution du ciel. " -"Équivalent à [member ReflectionProbe.interior]." #: doc/classes/VisualServer.xml msgid "" @@ -85709,9 +86337,8 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Enables or disables occlusion culling." -msgstr "Active ou désactive une lumière du canevas." +msgstr "Active ou désactive le culling de l'occlusion." #: doc/classes/VisualServer.xml msgid "" @@ -85728,7 +86355,6 @@ msgstr "" "méthode statique [method free_rid] du VisualServer." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a shader's code." msgstr "Retourne le code d'un shader." @@ -85741,7 +86367,6 @@ msgid "Returns the parameters of a shader." msgstr "Retourne les paramètres d'un shader." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Sets a shader's code." msgstr "Définit le code d'un shader." @@ -85826,14 +86451,12 @@ msgstr "" "utilisant la [method instance_set_base] utilisant le RID retourné." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Allocates the GPU memory for the texture." -msgstr "La largeur de la texture." +msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "Binds the texture to a texture slot." -msgstr "Alignez le texte à gauche." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -85856,9 +86479,8 @@ msgstr "" "Crée une texture, alloue l'espace pour une image, et remplit avec l'image." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns a list of all the textures and their information." -msgstr "Retourne le nombre de pistes dans l'animation." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -85877,9 +86499,8 @@ msgid "Returns the flags of a texture." msgstr "Retourne les drapeaux de la texture." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Returns the format of the texture's image." -msgstr "Renvoie le reste de deux vecteurs." +msgstr "" #: doc/classes/VisualServer.xml msgid "Returns the texture's height." @@ -85980,13 +86601,10 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], the image will be stored in the texture's images array " "if overwritten." msgstr "" -"Si [code]true[/code], la [SpinBox] sera modifiable. Sinon, elle sera en " -"lecture seule." #: doc/classes/VisualServer.xml msgid "Sets a viewport's camera." @@ -85997,7 +86615,6 @@ msgid "Sets a viewport's canvas." msgstr "Définit le canevas de la fenêtre d'affichage." #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Copies viewport to a region of the screen specified by [code]rect[/code]. If " "[member Viewport.render_direct_to_screen] is [code]true[/code], then " @@ -86034,7 +86651,7 @@ msgstr "" " $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" "[/codeblock]\n" "Utiliser cette méthode peut permettre d'améliorer considérablement les " -"performances, surtout sur les appareils peut puissants. Par contre, cela " +"performances, surtout sur les appareils peu puissants. Par contre, cela " "nécessite de gérer manuellement les fenêtres d'affichage. Pour plus " "d'optimisations, voir [method viewport_set_render_direct_to_screen]." @@ -86212,11 +86829,10 @@ msgid "" msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Sets the viewport's 2D/3D mode. See [enum ViewportUsage] constants for " "options." -msgstr "Convertit le format de l’image. Voir les constantes [enum Format]." +msgstr "" #: doc/classes/VisualServer.xml msgid "" @@ -86290,16 +86906,12 @@ msgid "Number of weights/bones per vertex." msgstr "Nombre de poids / os par sommet." #: doc/classes/VisualServer.xml -#, fuzzy msgid "The minimum Z-layer for canvas items." -msgstr "" -"Le niveau minimal du calque de profondeur pour les éléments de canevas." +msgstr "Le niveau minimal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml -#, fuzzy msgid "The maximum Z-layer for canvas items." -msgstr "" -"Le niveau maximal du calque de profondeur pour les éléments de canevas." +msgstr "Le niveau maximal du calque de profondeur pour les éléments de canevas." #: doc/classes/VisualServer.xml msgid "" @@ -86361,7 +86973,6 @@ msgid "A 3-dimensional texture with width, height, and depth." msgstr "Une texture à 3 dimensions, largeur et hauteur, et profondeur." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Repeats the texture (instead of clamp to edge)." msgstr "Répète la texture (plutôt que de s'arrêter aux bordures)." @@ -86755,9 +87366,8 @@ msgid "Number of draw calls during this frame." msgstr "Nombre d'appels d'affichage pour cette trame." #: doc/classes/VisualServer.xml -#, fuzzy msgid "Number of 2d items drawn this frame." -msgstr "Nombre de changements de surface pendant cette image." +msgstr "Le nombre d'éléments 2D affichés dans cette trame." #: doc/classes/VisualServer.xml msgid "Number of 2d draw calls during this frame." @@ -87432,11 +88042,8 @@ msgstr "Sera traduit en [code]uniform bool[/code] dans le code du shader." #: doc/classes/VisualShaderNodeScalarUniform.xml #: doc/classes/VisualShaderNodeTransformUniform.xml #: doc/classes/VisualShaderNodeVec3Uniform.xml -#, fuzzy msgid "A default value to be assigned within the shader." msgstr "" -"Un opérateur scalaire à virgule flottante à utiliser dans le graphique du " -"nuanceur visuel." #: doc/classes/VisualShaderNodeBooleanUniform.xml #: doc/classes/VisualShaderNodeColorUniform.xml @@ -87729,7 +88336,6 @@ msgid "" msgstr "" #: doc/classes/VisualShaderNodeCompare.xml -#, fuzzy msgid "" "The result will be true if all of component in vector satisfy the comparison " "condition." @@ -87738,7 +88344,6 @@ msgstr "" "condition de comparaison." #: doc/classes/VisualShaderNodeCompare.xml -#, fuzzy msgid "" "The result will be true if any of component in vector satisfy the comparison " "condition." @@ -87747,11 +88352,8 @@ msgstr "" "condition de comparaison." #: doc/classes/VisualShaderNodeCubeMap.xml -#, fuzzy msgid "A [CubeMap] sampling node to be used within the visual shader graph." msgstr "" -"Un opérateur scalaire à virgule flottante à utiliser dans le graphique du " -"nuanceur visuel." #: doc/classes/VisualShaderNodeCubeMap.xml msgid "" @@ -87818,11 +88420,8 @@ msgid "" msgstr "" #: doc/classes/VisualShaderNodeCubeMapUniform.xml -#, fuzzy msgid "A [CubeMap] uniform node to be used within the visual shader graph." msgstr "" -"Un tableau uniforme de texture 2D à utiliser dans le graphique de l'ombrage " -"visuel." #: doc/classes/VisualShaderNodeCubeMapUniform.xml msgid "" @@ -88498,13 +89097,12 @@ msgid "Defaults to black color." msgstr "Par défaut à la couleur noire." #: doc/classes/VisualShaderNodeTextureUniformTriplanar.xml -#, fuzzy msgid "" "Performs a uniform texture lookup with triplanar within the visual shader " "graph." msgstr "" -"Effectue une recherche de texture uniforme avec triplanaire dans le " -"graphique de nuanceur visuel." +"Effectue une projection de texture uniforme en triplanaire dans le graphe du " +"Visual Shader." #: doc/classes/VisualShaderNodeTextureUniformTriplanar.xml msgid "" @@ -88513,12 +89111,11 @@ msgid "" msgstr "" #: doc/classes/VisualShaderNodeTransformCompose.xml -#, fuzzy msgid "" "Composes a [Transform] from four [Vector3]s within the visual shader graph." msgstr "" -"Compose un [Transform] à partir de quatre [Vector3] dans le graphique du " -"nuanceur visuel." +"Compose un [Transform] à partir de quatre [Vector3] dans le graphe du Visual " +"Shader." #: doc/classes/VisualShaderNodeTransformCompose.xml msgid "" @@ -88632,11 +89229,10 @@ msgid "Translated to [code]uniform mat4[/code] in the shader language." msgstr "Sera traduit en [code]uniform mat4[/code] dans le code du shader." #: doc/classes/VisualShaderNodeTransformVecMult.xml -#, fuzzy msgid "" "Multiplies a [Transform] and a [Vector3] within the visual shader graph." msgstr "" -"Multiplie un [Transform] et un [Vector3] dans le graphique de shader visuel." +"Multiplie un [Transform] et un [Vector3] dans le graphe du Visual Shader." #: doc/classes/VisualShaderNodeTransformVecMult.xml msgid "" @@ -88679,7 +89275,7 @@ msgstr "" #: doc/classes/VisualShaderNodeUniform.xml #, fuzzy msgid "A base type for the uniforms within the visual shader graph." -msgstr "Type de base pour les uniformes dans le graphique du nuanceur visuel." +msgstr "Le type de base pour les uniformes dans le graphe du Visual Shader." #: doc/classes/VisualShaderNodeUniform.xml msgid "" @@ -89236,10 +89832,9 @@ msgid "Closes this data channel, notifying the other peer." msgstr "Ferme ce canal de données, en notifiant l’autre homologue." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml -#, fuzzy msgid "" "Returns the number of bytes currently queued to be sent over this channel." -msgstr "Retourne le nombre de traqueurs actuellement enregistrés." +msgstr "" #: modules/webrtc/doc_classes/WebRTCDataChannel.xml msgid "" @@ -89330,7 +89925,6 @@ msgid "The channel was created, but it's still trying to connect." msgstr "Le canal a été créé, mais il essaie toujours de se connecter." #: modules/webrtc/doc_classes/WebRTCDataChannel.xml -#, fuzzy msgid "The channel is currently open, and data can flow over it." msgstr "Le canal est actuellement ouvert, et les données peuvent y circuler." @@ -89439,9 +90033,8 @@ msgid "" msgstr "" #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml -#, fuzzy msgid "Interface to a WebRTC peer connection." -msgstr "Interface vers une connexion homologue WebRTC." +msgstr "L'interface de connexion par pair via WebRTC." #: modules/webrtc/doc_classes/WebRTCPeerConnection.xml msgid "" @@ -90495,14 +91088,12 @@ msgid "" msgstr "" #: doc/classes/WindowDialog.xml -#, fuzzy msgid "The vertical offset of the title text." -msgstr "Décalage vertical du texte du titre." +msgstr "Le décalage vertical du texte du titre." #: doc/classes/WindowDialog.xml -#, fuzzy msgid "The font used to draw the title." -msgstr "La police utilisée pour le texte en gras." +msgstr "" #: doc/classes/WindowDialog.xml msgid "The icon for the close button." @@ -90548,10 +91139,9 @@ msgid "" msgstr "" #: doc/classes/World.xml -#, fuzzy msgid "" "The [RID] of this world's navigation map. Used by the [NavigationServer]." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "" #: doc/classes/World.xml msgid "The World's visual scenario." @@ -90586,10 +91176,9 @@ msgid "" msgstr "" #: doc/classes/World2D.xml -#, fuzzy msgid "" "The [RID] of this world's navigation map. Used by the [Navigation2DServer]." -msgstr "Retourne le [RID] de la énième forme d'une zone." +msgstr "" #: doc/classes/World2D.xml msgid "" diff --git a/doc/translations/it.po b/doc/translations/it.po index 3acfabc091..e07c906b29 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -30,8 +30,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: AndreWharn <andrewharnofficial@gmail.com>\n" +"PO-Revision-Date: 2022-07-31 16:43+0000\n" +"Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/it/>\n" "Language: it\n" @@ -62,6 +62,7 @@ msgid "Theme Properties" msgstr "Proprietà del tema" #: doc/tools/make_rst.py +#, fuzzy msgid "Signals" msgstr "Segnali" @@ -56960,7 +56961,7 @@ msgstr "" #: doc/classes/Spatial.xml msgid "Introduction to 3D" -msgstr "" +msgstr "Introduzione al 3D" #: doc/classes/Spatial.xml doc/classes/Vector3.xml msgid "All 3D Demos" diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index 74758850c7..ea624fdf2c 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -41,12 +41,13 @@ # Fabio Moura de Oliveira <ccmaismais@yahoo.com>, 2022. # Daniel Abrante <danielabrante@protonmail.com>, 2022. # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. +# Felipe Kinoshita <kinofhek@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-06-16 18:58+0000\n" -"Last-Translator: lucas rossy brasil coelho <lucasrossy270@gmail.com>\n" +"PO-Revision-Date: 2022-08-04 06:40+0000\n" +"Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/pt_BR/>\n" "Language: pt_BR\n" @@ -54,7 +55,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -76754,6 +76755,13 @@ msgid "" "the same space as the parent YSort, allowing to better organize a scene or " "divide it in multiple ones, yet keep the unique sorting." msgstr "" +"Classifique todos os nós filhos com base em suas posições Y. O nó filho deve " +"herdar de [CanvasItem] para ser classificado. Os nós que têm uma posição Y " +"mais alta serão desenhados mais tarde, então eles aparecerão no topo dos nós " +"que têm uma posição Y mais baixa. O aninhamento de nós YSort é possÃvel. Os " +"nós YSort filhos serão classificados no mesmo espaço que o YSort pai, " +"permitindo organizar melhor uma cena ou dividi-la em várias outras, mas " +"manter a classificação única." #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/ru.po b/doc/translations/ru.po index 985198198a..b148868ce6 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -49,21 +49,22 @@ # FuzzMix <fmwolfiechad@gmail.com>, 2022. # ÐœÐÐ69К <weblate@mah69k.net>, 2022. # Vadim Mitroshkin <Vadim7540@yandex.ru>, 2022. +# SonicStalker Games <dmitriyusolsev1971@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-03 00:44+0000\n" -"Last-Translator: Bozhko Artyom Dmitrievich <jek_sun@mail.ru>\n" +"PO-Revision-Date: 2022-08-04 06:40+0000\n" +"Last-Translator: SonicStalker Games <dmitriyusolsev1971@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ru/>\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.14-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -620,11 +621,11 @@ msgstr "" "[codeblock]\n" "- Меньше -1,0 (не включаÑ): Облегчение вхождениÑ-выхождениÑ\n" "- 1.0: Линейный\n" -"- От -1,0 до 0,0 (не включаÑ): Облегчение в\n" +"- От -1,0 до 0,0 (не включаÑ): Облегчение выхождениÑ-вхождениÑ\n" "- 0.0: ПоÑтоÑнный\n" -"- От 0,0 до 1,0 (не включаÑ): Облегчение\n" +"- От 0,0 до 1,0 (не включаÑ): Облегчение выхождениÑ(только выход)\n" "- 1.0: Линейный\n" -"- Больше 1,0 (не включаÑ): Облегчение\n" +"- Больше 1,0 (не включаÑ): Облегчение вхождениÑ(только вход)\n" "[/codeblock]\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "ease_cheatsheet.png]ease() Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹ шпаргалка[/url]\n" @@ -1402,7 +1403,6 @@ msgstr "" "траÑÑировка Ñтека при печати ошибки или предупреждениÑ." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1412,10 +1412,12 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Печатает трек Ñтека вызовов, работает только еÑли включён отладчик.\n" +"Как [method print], но включает в ÑÐµÐ±Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¹ кадр Ñтека когда запушен Ñ " +"включенным отладчиком.\n" "Вывод в конÑоли будет выглÑдеть примерно так:\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1830,19 +1832,30 @@ msgstr "" "Возвращает результат плавной интерполÑции Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ [code]s[/code] между " "[code]0[/code] и [code]1[/code], в завиÑимоÑти от того, где находитÑÑ " "[code]s[/code] отноÑительно [code]from[/code] и [code]to[/code].\n" +"\n" "Возвращаемое значение равно [code]0[/code], еÑли [code]s <= from[/code] и " "[code]1[/code], еÑли[code]s >= to[/code]. ЕÑли [code]s[/code] находитÑÑ " "между [code]from[/code] и [code]to[/code], то возвращаемое значение Ñледует " "S-образной кривой, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоответÑтвует значению [code]s[/code] между " "[code]0[/code] и [code]1[/code].\n" +"\n" "S-Ð¾Ð±Ñ€Ð°Ð·Ð½Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ ÑвлÑетÑÑ ÐºÑƒÐ±Ð¸Ñ‡ÐµÑким Ñрмитовым Ñплайном, заданным функцией " "[code]f(s) = 3*s^2 - 2*s^3[/code].\n" +"\n" "[codeblock]\n" "smoothstep(0, 2, -5.0) # Returns 0.0\n" "smoothstep(0, 2, 0.5) # Returns 0.15625\n" "smoothstep(0, 2, 1.0) # Returns 0.5\n" "smoothstep(0, 2, 2.0) # Returns 1.0\n" -"[/codeblock]" +"[/codeblock]\n" +"\n" +"Compared to [method ease] with a curve value of [code]-1.6521[/code], [" +"method smoothstep] returns the smoothest possible curve with no sudden " +"changes in the derivative. If you need to perform more advanced transitions, " +"use [Tween] or [AnimationPlayer].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, -1" +".6521) return values[/url]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index 76ea804df5..7647bf0081 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -62,7 +62,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-26 01:54+0000\n" +"PO-Revision-Date: 2022-07-31 16:43+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -1322,7 +1322,6 @@ msgstr "" "在打å°é”™è¯¯æˆ–è¦å‘Šæ—¶è¿˜ä¼šæ˜¾ç¤ºå †æ ˆè·Ÿè¸ªã€‚" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1332,10 +1331,11 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"在代ç ä½ç½®æ‰“å°å †æ ˆè½¨è¿¹ï¼Œä»…在打开调试器的情况下è¿è¡Œã€‚\n" -"控制å°ä¸çš„输出如下所示:\n" +"与 [method print] 类似,但在打开调试器è¿è¡Œæ—¶è¿˜ä¼šåŒ…å«å½“å‰æ ˆå¸§ã€‚\n" +"控制å°ä¸çš„è¾“å‡ºåº”è¯¥æ˜¯ç±»ä¼¼è¿™æ ·çš„ï¼š\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -9581,7 +9581,6 @@ msgstr "" "制器也将ä¿æŒç›¸åŒçš„ ID。" #: doc/classes/ARVRController.xml -#, fuzzy msgid "" "The degree to which the controller vibrates. Ranges from [code]0.0[/code] to " "[code]1.0[/code]. If changed, updates [member ARVRPositionalTracker.rumble] " @@ -9589,9 +9588,8 @@ msgid "" "This is a useful property to animate if you want the controller to vibrate " "for a limited duration." msgstr "" -"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code],精度 " -"[code].01[/code]。如果更改,会相应地更新 [member ARVRPositionalTracker." -"rumble]。\n" +"控制器振动的程度。范围从 [code]0.0[/code] 到 [code]1.0[/code]。如果更改," +"会相应地更新 [member ARVRPositionalTracker.rumble]。\n" "å¦‚æžœä½ æƒ³è®©æŽ§åˆ¶å™¨åœ¨é™å®šæ—¶é—´å†…振动,这是一个有用的属性,å¯ä»¥å°†å…¶åŠ¨ç”»åŒ–。" #: doc/classes/ARVRController.xml @@ -14589,6 +14587,10 @@ msgid "" "current, setting one camera's [member current] to [code]false[/code] will " "cause the other camera to be made current." msgstr "" +"如果为 [code]true[/code],则祖级 [Viewport] æ£åœ¨ä½¿ç”¨è¿™ä¸ªç›¸æœºã€‚\n" +"如果场景ä¸æœ‰å¤šä¸ªç›¸æœºï¼Œæ€»ä¼šæœ‰ä¸€ä¸ªè¢«è®¾ä¸ºå½“å‰ç›¸æœºã€‚例如,å‡è®¾åœºæ™¯ä¸å˜åœ¨ä¸¤ä¸ª " +"[Camera] 节点并且åªæœ‰ä¸€ä¸ªä¸ºå½“å‰ç›¸æœºï¼Œé‚£ä¹ˆå¦‚果把æŸä¸€ä¸ªç›¸æœºçš„ [member current] " +"设为 [code]false[/code] 就会导致å¦ä¸€ä¸ªç›¸æœºè¢«è®¾ä¸ºå½“å‰ç›¸æœºã€‚" #: doc/classes/Camera.xml msgid "" @@ -17985,7 +17987,7 @@ msgstr "é“奇è“色。" #: doc/classes/Color.xml msgid "Firebrick color." -msgstr "ç«ç –的颜色。" +msgstr "è€ç«ç –红色。" #: doc/classes/Color.xml msgid "Floral white color." @@ -17997,11 +17999,11 @@ msgstr "森林绿色。" #: doc/classes/Color.xml msgid "Fuchsia color." -msgstr "紫红色的颜色。" +msgstr "洋红色。" #: doc/classes/Color.xml msgid "Gainsboro color." -msgstr "庚斯伯勒颜色。" +msgstr "庚斯伯勒ç°è‰²ã€‚" #: doc/classes/Color.xml msgid "Ghost white color." @@ -18013,7 +18015,7 @@ msgstr "金色。" #: doc/classes/Color.xml msgid "Goldenrod color." -msgstr "金黄的颜色。" +msgstr "金èŠè‰²ã€‚" #: doc/classes/Color.xml msgid "Gray color." @@ -18033,7 +18035,7 @@ msgstr "蜜露色。" #: doc/classes/Color.xml msgid "Hot pink color." -msgstr "ç‚™çƒçš„粉红色。" +msgstr "亮粉色。" #: doc/classes/Color.xml msgid "Indian red color." @@ -18057,7 +18059,7 @@ msgstr "è–°è¡£è‰è‰²ã€‚" #: doc/classes/Color.xml msgid "Lavender blush color." -msgstr "è–°è¡£è‰è…®çº¢çš„颜色。" +msgstr "è–°è¡£è‰ç´«çº¢è‰²ã€‚" #: doc/classes/Color.xml msgid "Lawn green color." @@ -18081,7 +18083,7 @@ msgstr "æ·¡é’色。" #: doc/classes/Color.xml msgid "Light goldenrod color." -msgstr "淡淡的金黄色。" +msgstr "亮金èŠé»„色。" #: doc/classes/Color.xml msgid "Light gray color." @@ -22935,7 +22937,7 @@ msgstr "" msgid "" "A script implemented in the C# programming language (Mono-enabled builds " "only)." -msgstr "用C#编程è¯è¨€å®žçŽ°çš„脚本(仅å¯ç”¨Mono的版本)。" +msgstr "用 C# 编程è¯è¨€å®žçŽ°çš„脚本(仅 Mono 版本ä¸å˜åœ¨ï¼‰ã€‚" #: modules/mono/doc_classes/CSharpScript.xml msgid "" @@ -22943,14 +22945,14 @@ msgid "" "class and is only available in Mono-enabled Godot builds.\n" "See also [GodotSharp]." msgstr "" -"æ¤ç±»è¡¨ç¤ºC#脚本。它与[GDScript]类的C#ç‰æ•ˆï¼Œå¹¶ä¸”仅在å¯ç”¨äº†Monoçš„Godot版本ä¸å¯" -"用。\n" -"å¦è¯·å‚阅[GodotSharp]。" +"这个类表示 C# 脚本,是 [GDScript] 类在 C# ä¸çš„对ç‰ä½“,仅在å¯ç”¨äº† Mono çš„ " +"Godot 版本ä¸å¯ç”¨ã€‚\n" +"å¦è¯·å‚阅 [GodotSharp]。" #: modules/mono/doc_classes/CSharpScript.xml #: modules/gdnative/doc_classes/PluginScript.xml msgid "Returns a new instance of the script." -msgstr "返回脚本的新实例。" +msgstr "返回该脚本的新实例。" #: doc/classes/CubeMap.xml msgid "A CubeMap is a 6-sided 3D texture." @@ -23267,7 +23269,7 @@ msgstr "é‡æ–°è®¡ç®—曲线的烘焙点缓å˜ã€‚" msgid "" "Removes points that are closer than [code]CMP_EPSILON[/code] (0.00001) units " "to their neighbor on the curve." -msgstr "移除比曲线上的相邻点近[code]CMP_EPSILON[/code](0.00001)个å•ä½çš„点。" +msgstr "移除比曲线上的相邻点近 [code]CMP_EPSILON[/code](0.00001)个å•ä½çš„点。" #: doc/classes/Curve.xml doc/classes/Curve2D.xml doc/classes/Curve3D.xml msgid "Removes all points from the curve." @@ -23462,9 +23464,9 @@ msgid "" "the index is out of bounds, the function sends an error to the console, and " "returns [code](0, 0)[/code]." msgstr "" -"返回指å‘顶点[code]idx[/code]的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹[code]idx[/" -"code]的。如果索引超出了范围,函数会å‘控制å°å‘é€ä¸€æ¡é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, 0)" -"[/code]。" +"返回指å‘顶点 [code]idx[/code] 的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹ " +"[code]idx[/code] 的。如果索引超出了范围,函数会å‘控制å°å‘é€ä¸€æ¡é”™è¯¯ï¼Œå¹¶è¿”回 " +"[code](0, 0)[/code]。" #: doc/classes/Curve2D.xml msgid "" @@ -23473,9 +23475,9 @@ msgid "" "code]. If the index is out of bounds, the function sends an error to the " "console, and returns [code](0, 0)[/code]." msgstr "" -"返回从顶点[code]idx[/code]引出的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹ " -"[code]idx[/code]。如果索引越界,函数会å‘控制å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, 0)[/" -"code]。" +"返回从顶点 [code]idx[/code] 引出的控制点ä½ç½®ã€‚返回的ä½ç½®æ˜¯ç›¸å¯¹äºŽé¡¶ç‚¹ " +"[code]idx[/code]。如果索引越界,函数会å‘控制å°å‘é€é”™è¯¯ï¼Œå¹¶è¿”回 [code](0, " +"0)[/code]。" #: doc/classes/Curve2D.xml msgid "" @@ -25234,9 +25236,9 @@ msgid "" "appear in the inspector when selecting a node that extends the class " "specified by [code]class_name[/code]." msgstr "" -"如果[code]class_name[/code]指定的类ä¸çš„[code]property[/code]被ç¦ç”¨ï¼Œåˆ™è¿”回 " -"[code]true[/code]。当属性被ç¦ç”¨æ—¶ï¼Œå½“[code]class_name[/code]类被指定为类的(继" -"承)父节点时,它将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"如果 [code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] 属性被ç¦ç”¨ï¼Œ" +"则返回 [code]true[/code]。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œå½“选ä¸ç»§æ‰¿è‡ª " +"[code]class_name[/code] 类的节点时,该属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25252,18 +25254,19 @@ msgid "" "format obtained by using the feature profile manager's [b]Export[/b] button " "or the [method save_to_file] method." msgstr "" -"从文件ä¸åŠ 载一个编辑器功能é…置文件。该文件必须éµå¾ªJSONæ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…ç½®" -"文件管ç†å™¨çš„[b]Export[/b]按钮或[method save_to_file]方法获得。" +"从文件ä¸åŠ 载一个编辑器功能é…置文件。该文件必须éµå¾ª JSON " +"æ ¼å¼ï¼Œé€šè¿‡ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导出[/b]按钮或 [method save_to_file] " +"方法获得。" #: doc/classes/EditorFeatureProfile.xml -#, fuzzy msgid "" "Saves the editor feature profile to a file in JSON format. It can then be " "imported using the feature profile manager's [b]Import[/b] button or the " "[method load_from_file] method." msgstr "" -"将编辑器的功能é…ç½®ä¿å˜åˆ°JSONæ ¼å¼çš„文件ä¸ã€‚然åŽå¯ä»¥ä½¿ç”¨ç‰¹å¾é…置文件管ç†å™¨çš„[b]" -"导入[/b]按钮或[method load_from_file]按钮导入它。" +"将编辑器的功能é…ç½®ä¿å˜åˆ° JSON " +"æ ¼å¼çš„文件ä¸ã€‚然åŽå¯ä»¥ä½¿ç”¨åŠŸèƒ½é…置文件管ç†å™¨çš„[b]导入[/b]按钮或 [method " +"load_from_file] 方法导入它。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25271,8 +25274,9 @@ msgid "" "by [code]class_name[/code]. When disabled, the class won't appear in the " "Create New Node dialog." msgstr "" -"如果 [code]disable[/code] 是 [code]true[/code],则ç¦ç”¨ [code]class_name[/" -"code] 指定的类。被ç¦ç”¨æ—¶ï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " +"[code]class_name[/code] 指定的类。ç¦ç”¨åŽï¼Œè¯¥ç±»ä¸ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " +"Nodeâ€å¯¹è¯æ¡†ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25281,9 +25285,9 @@ msgid "" "appear in the Create New Node dialog but the inspector will be read-only " "when selecting a node that extends the class." msgstr "" -"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ [code]class_name[/" -"code] 指定的类的编辑。ç¦ç”¨æ—¶ï¼Œç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰æ‹©ç»§" -"承的节点时,检查器将åªè¯»ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " +"[code]class_name[/code] 指定的类的编辑。ç¦ç”¨åŽï¼Œè¯¥ç±»ä»ç„¶ä¼šå‡ºçŽ°åœ¨â€œåˆ›å»ºæ–° " +"Nodeâ€å¯¹è¯æ¡†ä¸ï¼Œä½†åœ¨é€‰ä¸ç»§æ‰¿çš„节点时,检查器将åªè¯»ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25292,9 +25296,10 @@ msgid "" "When a property is disabled, it won't appear in the inspector when selecting " "a node that extends the class specified by [code]class_name[/code]." msgstr "" -"如果 [code]disable[/code] 是 [code]true[/code],则ç¦ç”¨ [code]class_name[/" -"code] 指定的类ä¸çš„ [code]property[/code] 的编辑。当属性被ç¦ç”¨æ—¶ï¼Œå½“选择继承 " -"[code]class_name[/code] 指定的类的节点时,它将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" +"如果 [code]disable[/code] 为 [code]true[/code],则ç¦ç”¨ " +"[code]class_name[/code] 指定的类ä¸çš„ [code]property[/code] " +"属性的编辑。ç¦ç”¨æŸä¸€å±žæ€§åŽï¼Œé€‰ä¸ç»§æ‰¿è‡ª [code]class_name[/code] " +"指定的类的节点时,这个属性将ä¸ä¼šå‡ºçŽ°åœ¨æ£€æŸ¥å™¨ä¸ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -25325,7 +25330,7 @@ msgstr "" msgid "" "The AssetLib tab. If this feature is disabled, the AssetLib tab won't " "display." -msgstr "AssetLib选项å¡ã€‚如果ç¦ç”¨æ¤åŠŸèƒ½ï¼Œåˆ™ä¸ä¼šæ˜¾ç¤ºAssetLib选项å¡ã€‚" +msgstr "AssetLib 选项å¡ã€‚如果ç¦ç”¨æ¤åŠŸèƒ½ï¼Œåˆ™ä¸ä¼šæ˜¾ç¤º AssetLib 选项å¡ã€‚" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -29678,14 +29683,13 @@ msgid "The default exposure used for tonemapping." msgstr "ç”¨äºŽè‰²è°ƒæ˜ å°„çš„é»˜è®¤æ›å…‰ã€‚" #: doc/classes/Environment.xml -#, fuzzy msgid "" "The tonemapping mode to use. Tonemapping is the process that \"converts\" " "HDR values to be suitable for rendering on a SDR display. (Godot doesn't " "support rendering on HDR displays yet.)" msgstr "" -"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯â€œè½¬æ¢â€HDR 值以适åˆåœ¨ LDR 显示器上呈现的过程。" -"(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" +"è¦ä½¿ç”¨çš„è‰²è°ƒæ˜ å°„æ¨¡å¼ã€‚è‰²è°ƒæ˜ å°„æ˜¯å°† HDR 值“转æ¢â€ä¸ºé€‚åˆåœ¨ SDR " +"显示器上呈现的值过程。(Godot å°šä¸æ”¯æŒåœ¨ HDR 显示器上进行渲染。)" #: doc/classes/Environment.xml msgid "" @@ -31958,16 +31962,16 @@ msgstr "" "[b]注æ„:[/b]直线是使用方å‘å‘é‡è€Œä¸æ˜¯ç»ˆç‚¹æŒ‡å®šçš„。" #: doc/classes/Geometry.xml -#, fuzzy msgid "" "Given an array of [Vector2]s representing tiles, builds an atlas. The " "returned dictionary has two keys: [code]points[/code] is an array of " "[Vector2] that specifies the positions of each tile, [code]size[/code] " "contains the overall size of the whole atlas as [Vector2]." msgstr "" -"给定表示图å—çš„[Vector2]数组,构建一个地图集。返回的å—典有两个键:" -"[code]points[/code]是[Vector2]çš„å‘é‡ï¼Œç”¨äºŽæŒ‡å®šæ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/" -"code]包å«æ•´ä¸ªå›¾é›†çš„整体大å°ï¼Œä½œä¸º[Vector2]。" +"给定表示图å—çš„ [Vector2] " +"数组,构建一个地图集。返回的å—典有两个键:[code]points[/code] 是 [Vector2] " +"的数组,用于指定æ¯ä¸ªå›¾å—çš„ä½ç½®ï¼Œ[code]size[/code] 包å«æ•´ä¸ªå›¾é›†çš„整体大å°ï¼Œ" +"是一个 [Vector2]。" #: doc/classes/Geometry.xml msgid "" @@ -33247,9 +33251,7 @@ msgstr "å°å›¾çŸ©å½¢çš„大å°ã€‚åœ°å›¾è‡ªèº«åŸºäºŽç½‘æ ¼åŒºåŸŸçš„å¤§å°ï¼Œå¹¶è¢« msgid "" "If [code]true[/code], enables disconnection of existing connections in the " "GraphEdit by dragging the right end." -msgstr "" -"如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–开图形编辑GraphEditä¸çŽ°æœ‰çš„è¿ž" -"接。" +msgstr "如果为 [code]true[/code],通过拖动å³ç«¯ï¼Œå¯ä»¥æ–å¼€ GraphEdit ä¸çŽ°æœ‰çš„连接。" #: doc/classes/GraphEdit.xml msgid "The scroll offset." @@ -33306,9 +33308,9 @@ msgid "" "code] slot of the [code]from[/code] GraphNode and the [code]to_slot[/code] " "slot of the [code]to[/code] GraphNode is attempted to be created." msgstr "" -"当试图创建[code]æ¥è‡ªfrom[/code]图形节点GraphNode1çš„[code]from_slot[/code]槽和" -"[code]to[/code]图形节点GraphNode2çš„[code]to_slot[/code]槽之间的连接时,会å‘图" -"形编辑GraphEditå‘出。" +"å°è¯•åˆ›å»ºä»Ž [code]from[/code] GraphNode çš„ [code]from_slot[/code] 槽到 " +"[code]to[/code] GraphNode çš„ [code]to_slot[/code] 槽之间的连接时,会å‘该 " +"GraphEdit å‘出。" #: doc/classes/GraphEdit.xml msgid "" @@ -33335,9 +33337,9 @@ msgid "" "slot of [code]from[/code] GraphNode and [code]to_slot[/code] slot of " "[code]to[/code] GraphNode is attempted to be removed." msgstr "" -"当试图移除 [code]from[/code] 图形节点GraphNode1çš„ [code]from_slot[/code]槽和" -"[code]to[/code] 图形节点GraphNode çš„[code]to_slot[/code] 槽之间的连接时,会å‘" -"é€åˆ°å›¾å½¢ç¼–辑GraphEdit。" +"å°è¯•ç§»é™¤ä»Ž [code]from[/code] GraphNode çš„ [code]from_slot[/code] 槽到 " +"[code]to[/code] GraphNode çš„ [code]to_slot[/code] 槽之间的连接时,会å‘该 " +"GraphEdit å‘出。" #: doc/classes/GraphEdit.xml msgid "" @@ -33561,9 +33563,8 @@ msgstr "" msgid "" "Sets the [Color] of the right (output) side of the slot [code]idx[/code] to " "[code]color_right[/code]." -msgstr "" -"å°†æ’槽[code]idx[/code]çš„å³ä¾§ï¼ˆè¾“出)的颜色[Color]设置为[code]color_right[/" -"code]。" +msgstr "å°†æ’槽 [code]idx[/code] çš„å³ä¾§ï¼ˆè¾“出)的颜色 [Color] 设置为 " +"[code]color_right[/code]。" #: doc/classes/GraphNode.xml msgid "" @@ -33599,7 +33600,7 @@ msgstr "" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is a comment node." -msgstr "如果为 [code]true[/code],则 GraphNode 是注释节点。" +msgstr "如果为 [code]true[/code],则该 GraphNode 是注释节点。" #: doc/classes/GraphNode.xml msgid "" @@ -33627,7 +33628,7 @@ msgstr "" #: doc/classes/GraphNode.xml msgid "If [code]true[/code], the GraphNode is selected." -msgstr "如果为 [code]true[/code],图形节点GraphNode被选ä¸ã€‚" +msgstr "如果为 [code]true[/code],则该 GraphNode 被选ä¸ã€‚" #: doc/classes/GraphNode.xml msgid "" @@ -41016,7 +41017,6 @@ msgid "The tint of [Font]'s outline." msgstr "对 [Font] 轮廓的染色。" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "Sets the render priority for the text outline. Higher priority objects will " "be sorted in front of lower priority objects.\n" @@ -41028,8 +41028,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本轮廓的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" -"值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " +"ALPHA_CUT_DISABLED](默认值)时适用。\n" "[b]注æ„:[/b]仅适用于é€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“é€æ˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41038,7 +41038,6 @@ msgid "The size of one pixel's width on the label to scale it in 3D." msgstr "æ ‡ç¾ä¸Šä¸€ä¸ªåƒç´ 宽度的大å°ï¼Œä»¥ 3D 缩放。" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "Sets the render priority for the text. Higher priority objects will be " "sorted in front of lower priority objects.\n" @@ -41050,8 +41049,8 @@ msgid "" "sorted from back to front (subject to priority)." msgstr "" "设置文本的渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" -"值)时适用。\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " +"ALPHA_CUT_DISABLED](默认值)时适用。\n" "[b]注æ„:[/b]仅适用于é€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“é€æ˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -41077,11 +41076,10 @@ msgid "If set, lights in the environment affect the label." msgstr "如果打开,环境ä¸çš„ç¯å…‰ä¼šå½±å“è¯¥æ ‡ç¾ã€‚" #: doc/classes/Label3D.xml -#, fuzzy msgid "" "If set, text can be seen from the back as well. If not, the text is " "invisible when looking at it from behind." -msgstr "如果打开,从åŽé¢ä¹Ÿå¯ä»¥çœ‹åˆ°æ–‡æœ¬ï¼Œå¦‚æžœä¸æ‰“开,从åŽé¢çœ‹å®ƒæ˜¯ä¸å¯è§çš„。" +msgstr "如果打开,从åŽé¢ä¹Ÿå¯ä»¥çœ‹åˆ°æ–‡æœ¬ã€‚如果ä¸æ‰“开,从åŽé¢çœ‹è¯¥æ–‡æœ¬æ˜¯ä¸å¯è§çš„。" #: doc/classes/Label3D.xml doc/classes/SpatialMaterial.xml #: doc/classes/SpriteBase3D.xml @@ -46077,7 +46075,6 @@ msgid "An instance of a [NavigationMesh]." msgstr "[NavigationMesh] 的一个实例。" #: doc/classes/NavigationMeshInstance.xml -#, fuzzy msgid "" "An instance of a [NavigationMesh]. It tells the [Navigation] node what can " "be navigated and what cannot, based on the [NavigationMesh] resource.\n" @@ -46096,13 +46093,13 @@ msgid "" "The cost of traveling distances inside this region can be controlled with " "the [member travel_cost] multiplier." msgstr "" -"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] 资æºæ¥ç¡®" -"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"[NavigationMesh] 的实例。[Navigation] èŠ‚ç‚¹æ ¹æ®å®ƒçš„ [NavigationMesh] " +"资æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"NavigationServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€" -"的最å°è·ç¦»ã€‚\n" +"NavigationServer.map_set_edge_connection_margin] " +"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å 并ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46415,7 +46412,6 @@ msgid "A region of the 2D navigation map." msgstr "2D 导航地图上的一个地区。" #: doc/classes/NavigationPolygonInstance.xml -#, fuzzy msgid "" "A region of the navigation map. It tells the [Navigation2DServer] what can " "be navigated and what cannot, based on its [NavigationPolygon] resource.\n" @@ -46434,13 +46430,13 @@ msgid "" "The pathfinding cost of traveling distances inside this region can be " "controlled with the [member travel_cost] multiplier." msgstr "" -"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] 资æºæ¥ç¡®" -"定哪些å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" +"导航地图上的地区。[Navigation2DServer] æ ¹æ®å®ƒçš„ [NavigationPolygon] " +"资æºæ¥ç¡®å®šå“ªäº›å¯ä»¥è¿›è¡Œå¯¼èˆªã€å“ªäº›ä¸èƒ½ã€‚\n" "默认情况下,这个节点会在默认的 [World2D] 导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚如果这个节点是 " "[Navigation2D] 节点的å项,就会在该导航节点的导航地图ä¸è¿›è¡Œæ³¨å†Œã€‚\n" "如果两个地图共享类似的边界,就å¯ä»¥ç›¸äº’è¿žæŽ¥ã€‚ä½ å¯ä»¥é€šè¿‡ [method " -"Navigation2DServer.map_set_edge_connection_margin] 设置两个顶点连接两æ¡è¾¹ç•Œæ‰€" -"需的最å°è·ç¦»ã€‚\n" +"Navigation2DServer.map_set_edge_connection_margin] " +"设置两个顶点连接两æ¡è¾¹ç•Œæ‰€éœ€çš„最å°è·ç¦»ã€‚\n" "[b]注æ„:[/b]å°†ä¸¤ä¸ªåœ°åŒºçš„å¯¼èˆªç½‘æ ¼ç›¸äº’é‡å 并ä¸è¶³ä»¥å°†å…¶ç›¸è¿žã€‚它们必须共享类似的" "边界。\n" "从å¦ä¸€ä¸ªåœ°åŒºè¿›å…¥è¿™ä¸ªåœ°å›¾çš„寻路消耗å¯ä»¥é€šè¿‡ [member enter_cost] 进行控制。\n" @@ -46587,7 +46583,7 @@ msgstr "控制这个æœåŠ¡å™¨æ˜¯å¦æ¿€æ´»ã€‚" msgid "" "A [NetworkedMultiplayerPeer] implementation that can be controlled from a " "script." -msgstr "" +msgstr "对 [NetworkedMultiplayerPeer] 的一ç§å®žçŽ°ï¼Œèƒ½å¤Ÿé€šè¿‡è„šæœ¬æŽ§åˆ¶ã€‚" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -46596,6 +46592,9 @@ msgid "" "Its purpose is to allow adding a new backend for the high-Level multiplayer " "API without needing to use GDNative." msgstr "" +"对 [NetworkedMultiplayerPeer] 的一ç§å®žçŽ°ï¼Œèƒ½å¤Ÿä½œä¸º [member MultiplayerAPI." +"network_peer] 使用并且通过脚本控制。\n" +"其目的是为高级多人 API æ·»åŠ æ–°çš„åŽç«¯ï¼Œä¸å¿…使用 GDNative。" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -46604,24 +46603,26 @@ msgid "" "(originating from the [signal packet_generated] signal on the sending peer), " "passing it to this method will deliver it locally." msgstr "" +"å‘本地 [MultiplayerAPI] ä¼ é€’æ•°æ®åŒ…。\n" +"å½“ä½ çš„è„šæœ¬é€šè¿‡ç½‘ç»œæ”¶åˆ°å…¶ä»–å¯¹ç‰ä½“çš„æ•°æ®åŒ…时(å‘é€æ–¹å‘出 [signal " +"packet_generated] ä¿¡å·ï¼‰ï¼Œå°†å…¶ä¼ é€’ç»™è¿™ä¸ªæ–¹æ³•ä¼šåœ¨æœ¬åœ°è¿›è¡Œä¼ é€’ã€‚" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" "Initialize the peer with the given [code]peer_id[/code] (must be between 1 " "and 2147483647)." -msgstr "" +msgstr "使用给定的 [code]peer_id[/code] åˆå§‹åŒ–该对ç‰ä½“(必须在 1 å’Œ 2147483647 " +"之间)。" #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "" "Set the state of the connection. See [enum NetworkedMultiplayerPeer." "ConnectionStatus]." -msgstr "返回连接的当å‰çŠ¶æ€ã€‚è§ [enum ConnectionStatus]。" +msgstr "设置连接的状æ€ã€‚è§ [enum NetworkedMultiplayerPeer.ConnectionStatus]。" #: doc/classes/NetworkedMultiplayerCustom.xml -#, fuzzy msgid "Set the max packet size that this peer can handle." -msgstr "设置该实例使用的光照图。" +msgstr "设置这个对ç‰ä½“所能够处ç†çš„最大数æ®åŒ…大å°ã€‚" #: doc/classes/NetworkedMultiplayerCustom.xml msgid "" @@ -46630,6 +46631,9 @@ msgid "" "the network (which should call [method deliver_packet] with the data when " "it's received)." msgstr "" +"当本地 [MultiplayerAPI] 生æˆæ•°æ®åŒ…时触å‘。\n" +"ä½ çš„è„šæœ¬åº”å½“èŽ·å–这个数æ®åŒ…并将其通过网络å‘é€ç»™è¯·æ±‚的对ç‰ä½“(" +"对方收到该数æ®æ—¶åº”当调用 [method deliver_packet])。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -50336,6 +50340,10 @@ msgid "" "series don't support cubemap shadows and will fall back to dual paraboloid " "shadows as a result." msgstr "" +"为这个 [OmniLight] 使用的阴影渲染模å¼ã€‚è§ [enum ShadowMode]。\n" +"[b]注æ„:[/b]在 GLES2 ä¸ï¼Œåªæœ‰æ”¯æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU æ‰æ”¯æŒ [constant " +"SHADOW_CUBE]。Radeon HD 4000 系列ç‰è¾ƒè€çš„ GPU " +"ä¸æ”¯æŒç«‹æ–¹ä½“è´´å›¾é˜´å½±ï¼Œå› æ¤ä¼šå›žé€€åˆ°ä½¿ç”¨åŒæŠ›ç‰©é¢é˜´å½±ã€‚" #: doc/classes/OmniLight.xml msgid "" @@ -50345,14 +50353,13 @@ msgstr "" "阴影被渲染到一个åŒæŠ›ç‰©é¢çº¹ç†ã€‚比 [constant SHADOW_CUBE] 更快,但质é‡è¾ƒå·®ã€‚" #: doc/classes/OmniLight.xml -#, fuzzy msgid "" "Shadows are rendered to a cubemap. Slower than [constant " "SHADOW_DUAL_PARABOLOID], but higher-quality. Only supported on GPUs that " "feature support for depth cubemaps." msgstr "" -"阴影被渲染æˆä¸€ä¸ªç«‹æ–¹ä½“贴图。比 [constant SHADOW_DUAL_PARABOLOID] 慢,但质é‡æ›´" -"高。" +"阴影被渲染至一个立方体贴图。比 [constant SHADOW_DUAL_PARABOLOID] " +"慢,但质é‡æ›´é«˜ã€‚仅在支æŒæ·±åº¦ç«‹æ–¹ä½“贴图功能的 GPU 上支æŒã€‚" #: doc/classes/OmniLight.xml msgid "Use more detail vertically when computing the shadow." @@ -72901,7 +72908,6 @@ msgid "The size of one pixel's width on the sprite to scale it in 3D." msgstr "ç²¾çµä¸Šä¸€ä¸ªåƒç´ 宽度的大å°ï¼Œä»¥ 3D 缩放。" #: doc/classes/SpriteBase3D.xml -#, fuzzy msgid "" "Sets the render priority for the sprite. Higher priority objects will be " "sorted in front of lower priority objects.\n" @@ -72912,9 +72918,9 @@ msgid "" "This is because opaque objects are not sorted, while transparent objects are " "sorted from back to front (subject to priority)." msgstr "" -"设置精çµçš„渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" -"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant ALPHA_CUT_DISABLED](默认" -"值)时适用。\n" +"设置该精çµçš„渲染优先级。优先级高的物体将被排åºåœ¨ä¼˜å…ˆçº§ä½Žçš„物体å‰é¢ã€‚\n" +"[b]注æ„:[/b]仅在 [member alpha_cut] 为 [constant " +"ALPHA_CUT_DISABLED](默认值)时适用。\n" "[b]注æ„:[/b]仅适用于é€æ˜Žç‰©ä½“的排åºã€‚è¿™ä¸ä¼šå½±å“é€æ˜Žç‰©ä½“相对于ä¸é€æ˜Žç‰©ä½“的排åº" "æ–¹å¼ã€‚è¿™æ˜¯å› ä¸ºä¸é€æ˜Žå¯¹è±¡ä¸è¢«æŽ’åºï¼Œè€Œé€æ˜Žå¯¹è±¡åˆ™ä»ŽåŽå¾€å‰æŽ’åºï¼ˆå–决于优先级)。" @@ -76499,14 +76505,13 @@ msgid "Sets the text for a specific line." msgstr "设置特定行的文本。" #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Bookmarks the [code]line[/code] if [code]bookmark[/code] is [code]true[/" "code]. Deletes the bookmark if [code]bookmark[/code] is [code]false[/code].\n" "Bookmarks are shown in the [member breakpoint_gutter]." msgstr "" -"如果 [code]bookmark[/code] 为 true,则为行 [code]line[/code] 设置书ç¾ã€‚如果 " -"[code]bookmark[/code] 为 falseï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" +"如果 [code]bookmark[/code] 为 [code]true[/code],则为行 [code]line[/code] " +"设置书ç¾ã€‚如果 [code]bookmark[/code] 为 [code]false[/code]ï¼Œåˆ™åˆ é™¤è¯¥ä¹¦ç¾ã€‚\n" "书ç¾æ˜¾ç¤ºåœ¨ [member breakpoint_gutter] ä¸ã€‚" #: doc/classes/TextEdit.xml @@ -80906,14 +80911,12 @@ msgid "" msgstr "返回使用 [method set_metadata] 为指定列设置的元数æ®ã€‚" #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the next sibling TreeItem in the tree or a null object if there is " "none." -msgstr "è¿”å›žæ ‘ä¸çš„下一个 TreeItem,如果没有,则返回一个空对象。" +msgstr "è¿”å›žæ ‘ä¸çš„下一个兄弟 TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the next visible sibling TreeItem in the tree or a null object if " "there is none.\n" @@ -80921,8 +80924,8 @@ msgid "" "visible element in the tree when called on the last visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"è¿”å›žæ ‘ä¸ä¸‹ä¸€ä¸ªå¯è§çš„ TreeItem,如果没有,则返回空对象。\n" -"如果 [code]wrap[/code] 被å¯ç”¨ï¼Œå½“在最åŽä¸€ä¸ªå¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘" +"è¿”å›žæ ‘ä¸ä¸‹ä¸€ä¸ªå¯è§çš„兄弟 TreeItem,如果没有,则返回空对象。\n" +"如果å¯ç”¨äº† [code]wrap[/code],当在最åŽä¸€ä¸ªå¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘" "ä¸çš„第一个å¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" #: doc/classes/TreeItem.xml @@ -80930,14 +80933,12 @@ msgid "Returns the parent TreeItem or a null object if there is none." msgstr "返回父级 TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the previous sibling TreeItem in the tree or a null object if there " "is none." -msgstr "è¿”å›žæ ‘ä¸çš„å‰ä¸€ä¸ª TreeItem,如果没有,则返回一个空对象。" +msgstr "è¿”å›žæ ‘ä¸çš„å‰ä¸€ä¸ªå…„弟 TreeItem,如果没有,则返回一个空对象。" #: doc/classes/TreeItem.xml -#, fuzzy msgid "" "Returns the previous visible sibling TreeItem in the tree or a null object " "if there is none.\n" @@ -80945,8 +80946,8 @@ msgid "" "visible element in the tree when called on the first visible element, " "otherwise it returns [code]null[/code]." msgstr "" -"è¿”å›žæ ‘ä¸å‰ä¸€ä¸ªå¯è§çš„ TreeItem,如果没有,则返回 null 对象。\n" -"如果 [code]wrap[/code] 被å¯ç”¨ï¼Œå½“在第一个å¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘ä¸" +"è¿”å›žæ ‘ä¸å‰ä¸€ä¸ªå¯è§çš„兄弟 TreeItem,如果没有,则返回 null 对象。\n" +"如果å¯ç”¨äº† [code]wrap[/code],当在第一个å¯è§å…ƒç´ ä¸Šè°ƒç”¨æ—¶ï¼Œè¯¥æ–¹æ³•å°†çŽ¯ç»•åˆ°æ ‘ä¸" "最åŽä¸€ä¸ªå¯è§å…ƒç´ ,å¦åˆ™å®ƒå°†è¿”回 [code]null[/code]。" #: doc/classes/TreeItem.xml @@ -89273,6 +89274,10 @@ msgid "" "viewport_set_use_32_bpc_depth].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" +"如果为 " +"[code]true[/code],该视区会渲染至高动æ€èŒƒå›´ï¼ˆHDR)而ä¸æ˜¯æ ‡å‡†åŠ¨æ€èŒƒå›´ï¼ˆSDR)。" +"å¦è¯·å‚阅 [method viewport_set_use_32_bpc_depth]。\n" +"[b]注æ„:[/b]仅在 GLES3 åŽç«¯å¯ç”¨ã€‚" #: doc/classes/VisualServer.xml msgid "If [code]true[/code], the viewport's canvas is not rendered." @@ -89370,7 +89375,6 @@ msgid "" msgstr "设置视窗的 2D/3D 模å¼ã€‚é€‰é¡¹è§ [enum ViewportUsage] 常é‡ã€‚" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "If [code]true[/code], allocates the viewport's framebuffer with full " "floating-point precision (32-bit) instead of half floating-point precision " @@ -89378,11 +89382,9 @@ msgid "" "on the same [Viewport] to set HDR to [code]true[/code].\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 [code]true[/code],分é…该视窗的帧缓冲时将使用完整浮点数精度(32 ä½ï¼‰è€Œ" -"ä¸æ˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚仅在åŒæ—¶å¯ç”¨ [member hdr] 时有效。\n" -"[b]注æ„:[/b]å¯ç”¨è¿™ä¸ªè®¾ç½®ä¸ä¼šæå‡æ¸²æŸ“è´¨é‡ã€‚使用完整浮点数精度较慢,一般åªæœ‰è¦" -"求更高精度的高级ç€è‰²å™¨éœ€è¦ä½¿ç”¨ã€‚如果是è¦å‡å°‘æ¡å¸¦æ•ˆåº”,请å¯ç”¨ [member " -"debanding]。\n" +"如果为 [code]true[/code],分é…该视区的帧缓冲时将使用完整浮点数精度(32 " +"ä½ï¼‰è€Œä¸æ˜¯åŠæµ®ç‚¹æ•°ç²¾åº¦ï¼ˆ16 ä½ï¼‰ã€‚åªæœ‰åœ¨åŒä¸€ä¸ª [Viewport] 上通过 [method " +"viewport_set_use_32_bpc_depth] å°† HDR 设为 [code]true[/code] 时有效。\n" "[b]注æ„:[/b]仅在 GLES3 åŽç«¯ä¸å¯ç”¨ã€‚" #: doc/classes/VisualServer.xml diff --git a/drivers/gles3/storage/config.cpp b/drivers/gles3/storage/config.cpp index f2809734a9..30b5919526 100644 --- a/drivers/gles3/storage/config.cpp +++ b/drivers/gles3/storage/config.cpp @@ -64,7 +64,14 @@ Config::Config() { #else float_texture_supported = extensions.has("GL_ARB_texture_float") || extensions.has("GL_OES_texture_float"); etc2_supported = true; +#if defined(ANDROID_ENABLED) || defined(IPHONE_ENABLED) + // Some Android devices report support for S3TC but we don't expect that and don't export the textures. + // This could be fixed but so few devices support it that it doesn't seem useful (and makes bigger APKs). + // For good measure we do the same hack for iOS, just in case. + s3tc_supported = false; +#else s3tc_supported = extensions.has("GL_EXT_texture_compression_dxt1") || extensions.has("GL_EXT_texture_compression_s3tc") || extensions.has("WEBGL_compressed_texture_s3tc"); +#endif rgtc_supported = extensions.has("GL_EXT_texture_compression_rgtc") || extensions.has("GL_ARB_texture_compression_rgtc") || extensions.has("EXT_texture_compression_rgtc"); #endif diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 9440a3a0ae..26441fc726 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -2522,11 +2522,11 @@ String MaterialStorage::shader_get_code(RID p_shader) const { return shader->code; } -void MaterialStorage::shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const { +void MaterialStorage::shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const { GLES3::Shader *shader = shader_owner.get_or_null(p_shader); ERR_FAIL_COND(!shader); if (shader->data) { - return shader->data->get_param_list(p_param_list); + return shader->data->get_shader_uniform_list(p_param_list); } } @@ -2758,14 +2758,14 @@ bool MaterialStorage::material_casts_shadows(RID p_material) { return true; //by default everything casts shadows } -void MaterialStorage::material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) { +void MaterialStorage::material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) { GLES3::Material *material = material_owner.get_or_null(p_material); ERR_FAIL_COND(!material); if (material->shader && material->shader->data) { material->shader->data->get_instance_param_list(r_parameters); if (material->next_pass.is_valid()) { - material_get_instance_shader_parameters(material->next_pass, r_parameters); + material_get_instance_shader_uniforms(material->next_pass, r_parameters); } } } @@ -2873,7 +2873,7 @@ void CanvasShaderData::set_default_texture_param(const StringName &p_name, RID p } } -void CanvasShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void CanvasShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { @@ -3110,7 +3110,7 @@ void SkyShaderData::set_default_texture_param(const StringName &p_name, RID p_te } } -void SkyShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void SkyShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { RBMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { @@ -3435,7 +3435,7 @@ void SceneShaderData::set_default_texture_param(const StringName &p_name, RID p_ } } -void SceneShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void SceneShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { RBMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/drivers/gles3/storage/material_storage.h b/drivers/gles3/storage/material_storage.h index 8fc15ddcba..2ca47351a4 100644 --- a/drivers/gles3/storage/material_storage.h +++ b/drivers/gles3/storage/material_storage.h @@ -54,7 +54,7 @@ namespace GLES3 { struct ShaderData { virtual void set_code(const String &p_Code) = 0; virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index) = 0; - virtual void get_param_list(List<PropertyInfo> *p_param_list) const = 0; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const = 0; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const = 0; virtual bool is_param_texture(const StringName &p_param) const = 0; @@ -164,7 +164,7 @@ struct CanvasShaderData : public ShaderData { virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; @@ -215,7 +215,7 @@ struct SkyShaderData : public ShaderData { virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; @@ -335,7 +335,7 @@ struct SceneShaderData : public ShaderData { virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; @@ -545,7 +545,7 @@ public: virtual void shader_set_code(RID p_shader, const String &p_code) override; virtual void shader_set_path_hint(RID p_shader, const String &p_path) override; virtual String shader_get_code(RID p_shader) const override; - virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const override; + virtual void shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const override; virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override; virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const override; @@ -576,7 +576,7 @@ public: virtual bool material_is_animated(RID p_material) override; virtual bool material_casts_shadows(RID p_material) override; - virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override; + virtual void material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) override; virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override; diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp index 2deeb79957..0dc2efedc1 100644 --- a/drivers/unix/ip_unix.cpp +++ b/drivers/unix/ip_unix.cpp @@ -95,12 +95,12 @@ void IPUnix::_resolve_hostname(List<IPAddress> &r_addresses, const String &p_hos int s = getaddrinfo(p_hostname.utf8().get_data(), nullptr, &hints, &result); if (s != 0) { - ERR_PRINT("getaddrinfo failed! Cannot resolve hostname."); + print_verbose("getaddrinfo failed! Cannot resolve hostname."); return; } if (result == nullptr || result->ai_addr == nullptr) { - ERR_PRINT("Invalid response from getaddrinfo"); + print_verbose("Invalid response from getaddrinfo"); if (result) { freeaddrinfo(result); } diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 0979ae9e16..45e114b130 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -3971,7 +3971,7 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_c passes.push_back(pass); return framebuffer_format_create_multipass(p_format, passes, p_view_count); } -RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, Vector<FramebufferPass> &p_passes, uint32_t p_view_count) { +RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, const Vector<FramebufferPass> &p_passes, uint32_t p_view_count) { _THREAD_SAFE_METHOD_ FramebufferFormatKey key; @@ -4110,7 +4110,7 @@ RID RenderingDeviceVulkan::framebuffer_create(const Vector<RID> &p_texture_attac return framebuffer_create_multipass(p_texture_attachments, passes, p_format_check, p_view_count); } -RID RenderingDeviceVulkan::framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check, uint32_t p_view_count) { +RID RenderingDeviceVulkan::framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, const Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check, uint32_t p_view_count) { _THREAD_SAFE_METHOD_ Vector<AttachmentFormat> attachments; @@ -4181,6 +4181,22 @@ RenderingDevice::FramebufferFormatID RenderingDeviceVulkan::framebuffer_get_form return framebuffer->format_id; } +bool RenderingDeviceVulkan::framebuffer_is_valid(RID p_framebuffer) const { + _THREAD_SAFE_METHOD_ + + return framebuffer_owner.owns(p_framebuffer); +} + +void RenderingDeviceVulkan::framebuffer_set_invalidation_callback(RID p_framebuffer, InvalidationCallback p_callback, void *p_userdata) { + _THREAD_SAFE_METHOD_ + + Framebuffer *framebuffer = framebuffer_owner.get_or_null(p_framebuffer); + ERR_FAIL_COND(!framebuffer); + + framebuffer->invalidated_callback = p_callback; + framebuffer->invalidated_callback_userdata = p_userdata; +} + /*****************/ /**** SAMPLER ****/ /*****************/ @@ -6218,7 +6234,7 @@ bool RenderingDeviceVulkan::uniform_set_is_valid(RID p_uniform_set) { return uniform_set_owner.owns(p_uniform_set); } -void RenderingDeviceVulkan::uniform_set_set_invalidation_callback(RID p_uniform_set, UniformSetInvalidatedCallback p_callback, void *p_userdata) { +void RenderingDeviceVulkan::uniform_set_set_invalidation_callback(RID p_uniform_set, InvalidationCallback p_callback, void *p_userdata) { UniformSet *us = uniform_set_owner.get_or_null(p_uniform_set); ERR_FAIL_COND(!us); us->invalidated_callback = p_callback; @@ -8685,6 +8701,11 @@ void RenderingDeviceVulkan::_free_internal(RID p_id) { } else if (framebuffer_owner.owns(p_id)) { Framebuffer *framebuffer = framebuffer_owner.get_or_null(p_id); frames[frame].framebuffers_to_dispose_of.push_back(*framebuffer); + + if (framebuffer->invalidated_callback != nullptr) { + framebuffer->invalidated_callback(framebuffer->invalidated_callback_userdata); + } + framebuffer_owner.free(p_id); } else if (sampler_owner.owns(p_id)) { VkSampler *sampler = sampler_owner.get_or_null(p_id); diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index 7c8021251f..d98ac1114b 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -392,6 +392,8 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t storage_mask = 0; Vector<RID> texture_ids; + InvalidationCallback invalidated_callback = nullptr; + void *invalidated_callback_userdata = nullptr; struct Version { VkFramebuffer framebuffer = VK_NULL_HANDLE; @@ -747,7 +749,7 @@ class RenderingDeviceVulkan : public RenderingDevice { LocalVector<AttachableTexture> attachable_textures; //used for validation Vector<Texture *> mutable_sampled_textures; //used for layout change Vector<Texture *> mutable_storage_textures; //used for layout change - UniformSetInvalidatedCallback invalidated_callback = nullptr; + InvalidationCallback invalidated_callback = nullptr; void *invalidated_callback_userdata = nullptr; }; @@ -1059,13 +1061,15 @@ public: /*********************/ virtual FramebufferFormatID framebuffer_format_create(const Vector<AttachmentFormat> &p_format, uint32_t p_view_count = 1); - virtual FramebufferFormatID framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, Vector<FramebufferPass> &p_passes, uint32_t p_view_count = 1); + virtual FramebufferFormatID framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, const Vector<FramebufferPass> &p_passes, uint32_t p_view_count = 1); virtual FramebufferFormatID framebuffer_format_create_empty(TextureSamples p_samples = TEXTURE_SAMPLES_1); virtual TextureSamples framebuffer_format_get_texture_samples(FramebufferFormatID p_format, uint32_t p_pass = 0); virtual RID framebuffer_create(const Vector<RID> &p_texture_attachments, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1); - virtual RID framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1); + virtual RID framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, const Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1); virtual RID framebuffer_create_empty(const Size2i &p_size, TextureSamples p_samples = TEXTURE_SAMPLES_1, FramebufferFormatID p_format_check = INVALID_ID); + virtual bool framebuffer_is_valid(RID p_framebuffer) const; + virtual void framebuffer_set_invalidation_callback(RID p_framebuffer, InvalidationCallback p_callback, void *p_userdata); virtual FramebufferFormatID framebuffer_get_format(RID p_framebuffer); @@ -1110,7 +1114,7 @@ public: virtual RID uniform_set_create(const Vector<Uniform> &p_uniforms, RID p_shader, uint32_t p_shader_set); virtual bool uniform_set_is_valid(RID p_uniform_set); - virtual void uniform_set_set_invalidation_callback(RID p_uniform_set, UniformSetInvalidatedCallback p_callback, void *p_userdata); + virtual void uniform_set_set_invalidation_callback(RID p_uniform_set, InvalidationCallback p_callback, void *p_userdata); virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, uint32_t p_post_barrier = BARRIER_MASK_ALL); //works for any buffer virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, uint32_t p_post_barrier = BARRIER_MASK_ALL); diff --git a/drivers/vulkan/vulkan_context.cpp b/drivers/vulkan/vulkan_context.cpp index 0d8a3310fd..a9a8ce68ac 100644 --- a/drivers/vulkan/vulkan_context.cpp +++ b/drivers/vulkan/vulkan_context.cpp @@ -1666,7 +1666,22 @@ Error VulkanContext::_update_swap_chain(Window *window) { if (present_mode_available) { window->presentMode = requested_present_mode; } else { - WARN_PRINT("Requested VSync mode is not available!"); + String present_mode_string; + switch (window->vsync_mode) { + case DisplayServer::VSYNC_MAILBOX: + present_mode_string = "Mailbox"; + break; + case DisplayServer::VSYNC_ADAPTIVE: + present_mode_string = "Adaptive"; + break; + case DisplayServer::VSYNC_ENABLED: + present_mode_string = "Enabled"; + break; + case DisplayServer::VSYNC_DISABLED: + present_mode_string = "Disabled"; + break; + } + WARN_PRINT(vformat("The requested V-Sync mode %s is not available. Falling back to V-Sync mode Enabled.", present_mode_string)); window->vsync_mode = DisplayServer::VSYNC_ENABLED; // Set to default. } @@ -2471,12 +2486,12 @@ String VulkanContext::get_device_pipeline_cache_uuid() const { } DisplayServer::VSyncMode VulkanContext::get_vsync_mode(DisplayServer::WindowID p_window) const { - ERR_FAIL_COND_V_MSG(!windows.has(p_window), DisplayServer::VSYNC_ENABLED, "Could not get VSync mode for window with WindowID " + itos(p_window) + " because it does not exist."); + ERR_FAIL_COND_V_MSG(!windows.has(p_window), DisplayServer::VSYNC_ENABLED, "Could not get V-Sync mode for window with WindowID " + itos(p_window) + " because it does not exist."); return windows[p_window].vsync_mode; } void VulkanContext::set_vsync_mode(DisplayServer::WindowID p_window, DisplayServer::VSyncMode p_mode) { - ERR_FAIL_COND_MSG(!windows.has(p_window), "Could not set VSync mode for window with WindowID " + itos(p_window) + " because it does not exist."); + ERR_FAIL_COND_MSG(!windows.has(p_window), "Could not set V-Sync mode for window with WindowID " + itos(p_window) + " because it does not exist."); windows[p_window].vsync_mode = p_mode; _update_swap_chain(&windows[p_window]); } diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp index 5b4da0e32b..43961a7ceb 100644 --- a/editor/dependency_editor.cpp +++ b/editor/dependency_editor.cpp @@ -417,6 +417,45 @@ void DependencyRemoveDialog::_find_all_removed_dependencies(EditorFileSystemDire } } +void DependencyRemoveDialog::_find_localization_remaps_of_removed_files(Vector<RemovedDependency> &p_removed) { + for (KeyValue<String, String> &files : all_remove_files) { + const String &path = files.key; + + // Look for dependencies in the translation remaps. + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + Dictionary remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); + + if (remaps.has(path)) { + RemovedDependency dep; + dep.file = TTR("Localization remap"); + dep.file_type = ""; + dep.dependency = path; + dep.dependency_folder = files.value; + p_removed.push_back(dep); + } + + Array remap_keys = remaps.keys(); + for (int j = 0; j < remap_keys.size(); j++) { + PackedStringArray remapped_files = remaps[remap_keys[j]]; + for (int k = 0; k < remapped_files.size(); k++) { + int splitter_pos = remapped_files[k].rfind(":"); + String res_path = remapped_files[k].substr(0, splitter_pos); + if (res_path == path) { + String locale_name = remapped_files[k].substr(splitter_pos + 1); + + RemovedDependency dep; + dep.file = vformat(TTR("Localization remap for path '%s' and locale '%s'."), remap_keys[j], locale_name); + dep.file_type = ""; + dep.dependency = path; + dep.dependency_folder = files.value; + p_removed.push_back(dep); + } + } + } + } + } +} + void DependencyRemoveDialog::_build_removed_dependency_tree(const Vector<RemovedDependency> &p_removed) { owners->clear(); owners->create_item(); // root @@ -473,6 +512,7 @@ void DependencyRemoveDialog::show(const Vector<String> &p_folders, const Vector< Vector<RemovedDependency> removed_deps; _find_all_removed_dependencies(EditorFileSystem::get_singleton()->get_filesystem(), removed_deps); + _find_localization_remaps_of_removed_files(removed_deps); removed_deps.sort(); if (removed_deps.is_empty()) { owners->hide(); diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h index 96d82d58eb..6e39015ec3 100644 --- a/editor/dependency_editor.h +++ b/editor/dependency_editor.h @@ -119,6 +119,7 @@ class DependencyRemoveDialog : public ConfirmationDialog { void _find_files_in_removed_folder(EditorFileSystemDirectory *efsd, const String &p_folder); void _find_all_removed_dependencies(EditorFileSystemDirectory *efsd, Vector<RemovedDependency> &p_removed); + void _find_localization_remaps_of_removed_files(Vector<RemovedDependency> &p_removed); void _build_removed_dependency_tree(const Vector<RemovedDependency> &p_removed); void ok_pressed() override; diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index ab6dec7eeb..f0bf9fd5b3 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -324,6 +324,11 @@ void EditorFeatureProfileManager::_notification(int p_what) { } _update_profile_list(current_profile); } break; + + case NOTIFICATION_THEME_CHANGED: { + // Make sure that the icons are correctly adjusted if the theme's lightness was switched. + _update_selected_profile(); + } break; } } diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index 9f047c775e..d11c659b98 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -3016,7 +3016,6 @@ void EditorInspector::update_tree() { Vector<String> class_name_components = String(p.class_name).split(","); - array_element_prefix = class_name_components[1]; int page_size = 5; bool movable = true; bool numbered = false; @@ -3052,8 +3051,8 @@ void EditorInspector::update_tree() { editor_inspector_array->set_undo_redo(undo_redo); } else if (p.type == Variant::INT) { // Setup the array to use the count property and built-in functions to create/move/delete elements. - - if (class_name_components.size() > 2) { + if (class_name_components.size() >= 2) { + array_element_prefix = class_name_components[1]; editor_inspector_array = memnew(EditorInspectorArray); int page = per_array_page.has(array_element_prefix) ? per_array_page[array_element_prefix] : 0; @@ -3251,6 +3250,11 @@ void EditorInspector::update_tree() { } if (!hide_metadata) { + // Add 4px of spacing between the "Add Metadata" button and the content above it. + Control *spacer = memnew(Control); + spacer->set_custom_minimum_size(Size2(0, 4) * EDSCALE); + main_vbox->add_child(spacer); + Button *add_md = EditorInspector::create_inspector_action_button(TTR("Add Metadata")); add_md->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); add_md->connect(SNAME("pressed"), callable_mp(this, &EditorInspector::_show_add_meta_dialog)); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 5e00304122..8caa38737c 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -6875,6 +6875,7 @@ EditorNode::EditorNode() { filesystem_dock->connect("inherit", callable_mp(this, &EditorNode::_inherit_request)); filesystem_dock->connect("instance", callable_mp(this, &EditorNode::_instantiate_request)); filesystem_dock->connect("display_mode_changed", callable_mp(this, &EditorNode::_save_docks)); + get_project_settings()->connect_filesystem_dock_signals(filesystem_dock); // Scene: Top left. dock_slot[DOCK_SLOT_LEFT_UR]->add_child(SceneTreeDock::get_singleton()); diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 4846fd6478..80e77a1125 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -685,7 +685,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // Visual editors EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/minimap_opacity", 0.85, "0.0,1.0,0.01") EDITOR_SETTING(Variant::FLOAT, PROPERTY_HINT_RANGE, "editors/visual_editors/lines_curvature", 0.5, "0.0,1.0,0.01") - EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/visual_editors/visualshader/port_preview_size", 160, "100,400,0.01") + EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "editors/visual_editors/visual_shader/port_preview_size", 160, "100,400,0.01") /* Run */ diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 02380c4e39..a3086a2ccf 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -641,6 +641,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Add a highlight line at the top of the selected tab. style_tab_selected->set_border_width_all(0); + style_tab_selected->set_default_margin(SIDE_LEFT, widget_default_margin.x - border_width); style_tab_selected->set_border_width(SIDE_TOP, Math::round(2 * EDSCALE)); // Make the highlight line prominent, but not too prominent as to not be distracting. Color tab_highlight = dark_color_2.lerp(accent_color, 0.75); @@ -653,6 +654,9 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // We can't prevent them with both rounded corners and non-zero border width, though style_tab_selected->set_expand_margin_size(SIDE_BOTTOM, corner_width > 0 ? corner_width : border_width); + // When using a border width greater than 0, visually line up the left of the selected tab with the underlying panel. + style_tab_selected->set_expand_margin_size(SIDE_LEFT, -border_width); + style_tab_selected->set_default_margin(SIDE_LEFT, widget_default_margin.x + 2 * EDSCALE); style_tab_selected->set_default_margin(SIDE_RIGHT, widget_default_margin.x + 2 * EDSCALE); style_tab_selected->set_default_margin(SIDE_BOTTOM, widget_default_margin.y); @@ -830,6 +834,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("pressed", "CheckButton", style_menu); theme->set_stylebox("disabled", "CheckButton", style_menu); theme->set_stylebox("hover", "CheckButton", style_menu); + theme->set_stylebox("hover_pressed", "CheckButton", style_menu); theme->set_icon("on", "CheckButton", theme->get_icon(SNAME("GuiToggleOn"), SNAME("EditorIcons"))); theme->set_icon("on_disabled", "CheckButton", theme->get_icon(SNAME("GuiToggleOnDisabled"), SNAME("EditorIcons"))); @@ -867,6 +872,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("pressed", "CheckBox", sb_checkbox); theme->set_stylebox("disabled", "CheckBox", sb_checkbox); theme->set_stylebox("hover", "CheckBox", sb_checkbox); + theme->set_stylebox("hover_pressed", "CheckBox", sb_checkbox); theme->set_icon("checked", "CheckBox", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); theme->set_icon("unchecked", "CheckBox", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); theme->set_icon("radio_checked", "CheckBox", theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); @@ -895,17 +901,16 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { theme->set_stylebox("panel", "PopupDialog", style_popup); // PopupMenu - const int popup_menu_margin_size = default_margin_size * 1.5 * EDSCALE; Ref<StyleBoxFlat> style_popup_menu = style_popup->duplicate(); // Use 1 pixel for the sides, since if 0 is used, the highlight of hovered items is drawn // on top of the popup border. This causes a 'gap' in the panel border when an item is highlighted, // and it looks weird. 1px solves this. - style_popup_menu->set_default_margin(SIDE_LEFT, 1 * EDSCALE); - style_popup_menu->set_default_margin(SIDE_TOP, popup_menu_margin_size); - style_popup_menu->set_default_margin(SIDE_RIGHT, 1 * EDSCALE); - style_popup_menu->set_default_margin(SIDE_BOTTOM, popup_menu_margin_size); + style_popup_menu->set_default_margin(SIDE_LEFT, EDSCALE); + style_popup_menu->set_default_margin(SIDE_TOP, 2 * EDSCALE); + style_popup_menu->set_default_margin(SIDE_RIGHT, EDSCALE); + style_popup_menu->set_default_margin(SIDE_BOTTOM, 2 * EDSCALE); // Always display a border for PopupMenus so they can be distinguished from their background. - style_popup_menu->set_border_width_all(1 * EDSCALE); + style_popup_menu->set_border_width_all(EDSCALE); style_popup_menu->set_border_color(dark_color_2); theme->set_stylebox("panel", "PopupMenu", style_popup_menu); @@ -939,12 +944,12 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Force the v_separation to be even so that the spacing on top and bottom is even. // If the vsep is odd and cannot be split into 2 even groups (of pixels), then it will be lopsided. - // We add 2 to the vsep to give it some extra spacing which looks a bit more modern (see Windows, for example) - int vsep_base = extra_spacing + default_margin_size + 2; - int force_even_vsep = vsep_base + (vsep_base % 2); + // We add 2 to the vsep to give it some extra spacing which looks a bit more modern (see Windows, for example). + const int vsep_base = extra_spacing + default_margin_size + 6; + const int force_even_vsep = vsep_base + (vsep_base % 2); theme->set_constant("v_separation", "PopupMenu", force_even_vsep * EDSCALE); - theme->set_constant("item_start_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); - theme->set_constant("item_end_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); + theme->set_constant("item_start_padding", "PopupMenu", default_margin_size * 1.5 * EDSCALE); + theme->set_constant("item_end_padding", "PopupMenu", default_margin_size * 1.5 * EDSCALE); // Sub-inspectors for (int i = 0; i < 16; i++) { diff --git a/editor/icons/AudioStream.svg b/editor/icons/AudioStream.svg new file mode 100644 index 0000000000..5d92dc25a5 --- /dev/null +++ b/editor/icons/AudioStream.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff5f5f"/><stop offset=".5" stop-color="#e1da5b"/><stop offset="1" stop-color="#5fff97"/></linearGradient><path d="m12 2a-1 1 0 0 1 1 1-1 1 0 0 1 -1 1c-4.4301 0-8 3.5699-8 8a-1 1 0 0 1 -1 1-1 1 0 0 1 -1-1c0-5.511 4.489-10 10-10zm0 4a-1 1 0 0 1 1 1-1 1 0 0 1 -1 1c-2.221 0-4 1.779-4 4a-1 1 0 0 1 -1 1-1 1 0 0 1 -1-1c0-3.3018 2.6981-6 6-6zm0 4a-2 2 0 0 1 2 2-2 2 0 0 1 -2 2-2 2 0 0 1 -2-2-2 2 0 0 1 2-2z" fill="url(#a)"/></svg> diff --git a/editor/icons/AudioStreamGenerator.svg b/editor/icons/AudioStreamGenerator.svg new file mode 100644 index 0000000000..55b0fb9d92 --- /dev/null +++ b/editor/icons/AudioStreamGenerator.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff5f5f"/><stop offset=".5" stop-color="#e1da5b"/><stop offset="1" stop-color="#5fff97"/></linearGradient><path d="m14 9-3 5-3-12-3 7-3-2" fill="none" stroke="url(#a)" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/editor/icons/AudioStreamMicrophone.svg b/editor/icons/AudioStreamMicrophone.svg new file mode 100644 index 0000000000..51009e9d53 --- /dev/null +++ b/editor/icons/AudioStreamMicrophone.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff5f5f"/><stop offset=".5" stop-color="#e1da5b"/><stop offset="1" stop-color="#5fff97"/></linearGradient><path d="m7 1c-1.108 0-2 .892-2 2h2v1h-2v2h2v1h-2c0 1.108.892 2 2 2v4l-2 2h6l-2-2v-4c1.108 0 2-.892 2-2h-2v-1h2v-2h-2v-1h2c0-1.108-.892-2-2-2z" fill="url(#a)"/></svg> diff --git a/editor/icons/AudioStreamRandomizer.svg b/editor/icons/AudioStreamRandomizer.svg new file mode 100644 index 0000000000..1696dff795 --- /dev/null +++ b/editor/icons/AudioStreamRandomizer.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="8" x2="8" y1="1" y2="15"><stop offset="0" stop-color="#ff5f5f"/><stop offset=".5" stop-color="#e1da5b"/><stop offset="1" stop-color="#5fff97"/></linearGradient><path d="m7.9999997 1c6.6837543 0 7.0000003.3165085 7.0000003 7.0057779 0 6.6877711-.286255 6.9755641-6.9367525 6.9938021-3.0191555.008313-4.4456225-.105997-5.1863245-.415726-1.570375-.65669-1.876923-1.727949-1.876923-6.5780761 0-6.6892694.316247-7.0057779 6.9999997-7.0057779zm3.5299143 1.7638478c-1.5662016 0-2.4379256 1.7724432-1.475213 2.9973439.738933.9401693 2.041543 1.025967 2.876923.1899002 1.183646-1.1846229.303279-3.1872441-1.40171-3.1872441zm-3.5760682 3.2710739c-1.5661974 0-2.4379268 1.7707341-1.4752138 2.9956331.7389365.9401892 2.0415435 1.0276772 2.8769233.191611 1.1836457-1.1846231.3032798-3.1872441-1.4017095-3.1872441zm-3.5538458 3.4729499c-.958537.031867-1.875214.7423284-1.875214 1.8493884 0 1.564955 2.248443 2.516522 3.249573 1.375494.7905175-.900982.8551191-1.664857.208547-2.487522-.416627-.5300879-1.007786-.7565128-1.582906-.7373604z" fill="url(#a)"/></svg> diff --git a/editor/icons/NodeWarnings2.svg b/editor/icons/NodeWarnings2.svg new file mode 100644 index 0000000000..e0385c28d1 --- /dev/null +++ b/editor/icons/NodeWarnings2.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0292969 2.0019531a1.0001 1.0001 0 0 0 -.8867188.484375l-6 9.9999999a1.0001 1.0001 0 0 0 .8574219 1.513672h12a1.0001 1.0001 0 0 0 .857422-1.513672l-2.326172-3.876953c-.89392-.5083134-1.507327-1.4610509-1.529297-2.5488281l-2.1445311-3.5742188a1.0001 1.0001 0 0 0 -.828125-.484375zm-1.0292969 2.9980469h2v5h-2zm0 6h2v2h-2z" fill="#ffdd65"/><g fill="#f95252"><path d="m14 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z"/><path d="m15.447266 4.6210938c-.430501.2402237-.923653.3789062-1.447266.3789062-.522676 0-1.015355-.1375274-1.445312-.3769531a2 2 0 0 0 -.554688 1.3769531 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.3789062z"/></g></svg> diff --git a/editor/icons/NodeWarnings3.svg b/editor/icons/NodeWarnings3.svg new file mode 100644 index 0000000000..53c0e70034 --- /dev/null +++ b/editor/icons/NodeWarnings3.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0292969 2.0019531a1.0001 1.0001 0 0 0 -.8867188.484375l-6 9.9999999a1.0001 1.0001 0 0 0 .8574219 1.513672h12a1.0001 1.0001 0 0 0 .982422-1.171875c-.308689.108606-.638692.171875-.982422.171875-1.645008 0-3-1.354992-3-3a1.0001 1.0001 0 0 0 0-.0019531c.002071-.7569921.302544-1.4803618.818359-2.0332031-.464296-.5178712-.798903-1.1662278-.816406-1.9042969l-2.1445311-3.5742188a1.0001 1.0001 0 0 0 -.828125-.484375zm-1.0292969 2.9980469h2v5h-2zm6.095703 4.7636719c-.02286.0837076-.095296.1479891-.095703.2363281v.001953c.001004.551209.418791.97816.964844.996094l-.712891-1.1875001c-.051505-.0169949-.103183-.0337067-.15625-.046875zm-6.095703 1.2363281h2v2h-2z" fill="#ffdd65"/><path d="m14 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2zm1.447266 4.6210938c-.430501.2402237-.923653.3789062-1.447266.3789062-.522676 0-1.015355-.1375274-1.445312-.3769531a2 2 0 0 0 -.554688 1.3769531 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.3789062zm0 4c-.430501.2402236-.923653.3789062-1.447266.3789062-.522676 0-1.015355-.1375274-1.445312-.3769531a2 2 0 0 0 -.554688 1.3769531 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.3789062z" fill="#f95252" stroke-dashoffset="16.5" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/></svg> diff --git a/editor/icons/NodeWarnings4Plus.svg b/editor/icons/NodeWarnings4Plus.svg new file mode 100644 index 0000000000..64c0a0671d --- /dev/null +++ b/editor/icons/NodeWarnings4Plus.svg @@ -0,0 +1 @@ +<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8.0292969 2.0019531a1.0001 1.0001 0 0 0 -.8867188.484375l-6 9.9999999a1.0001 1.0001 0 0 0 .8574219 1.513672h9a1.0001 1.0001 0 0 0 0-.001953c.002025-.740254.278882-1.453739.773438-2.001953-.478045-.532242-.773438-1.231924-.773438-1.996094a1.0001 1.0001 0 0 0 0-.0019531c.002071-.7569921.302544-1.4803618.818359-2.0332031-.464296-.5178713-.798903-1.1662278-.816406-1.9042969l-2.1445311-3.5742188a1.0001 1.0001 0 0 0 -.828125-.484375zm-1.0292969 2.9980469h2v5h-2zm6.095703 4.7636719c-.02286.0837076-.095296.1479891-.095703.2363281v.001953c.001004.551209.418791.97816.964844.996094l-.712891-1.1875001c-.051505-.0169949-.103183-.0337067-.15625-.046875zm-6.095703 1.2363281h2v2h-2zm6.095703 2.763672c-.02286.083707-.095296.147988-.095703.236328h1c-.326848 0-.598793-.160518-.904297-.236328z" fill="#ffdd65"/><g fill="#f95252" stroke-dashoffset="16.5" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="m14 0a2 2 0 0 0 -2 2 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -2-2z"/><path d="m15.447266 8.6210938c-.430501.2402236-.923653.3789062-1.447266.3789062-.522676 0-1.015355-.1375274-1.445312-.3769531a2 2 0 0 0 -.554688 1.3769531 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.3789062z"/><path d="m15.447266 4.6210938c-.430501.2402237-.923653.3789062-1.447266.3789062-.522676 0-1.015355-.1375274-1.445312-.3769531a2 2 0 0 0 -.554688 1.3769531 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.3789062z"/><path d="m15.447266 12.621094c-.430501.240224-.923653.378906-1.447266.378906-.522676 0-1.015355-.137527-1.445312-.376953a2 2 0 0 0 -.554688 1.376953 2 2 0 0 0 2 2 2 2 0 0 0 2-2 2 2 0 0 0 -.552734-1.378906z"/></g></svg> diff --git a/editor/localization_editor.cpp b/editor/localization_editor.cpp index 0325f4bd5c..e8fb80eb57 100644 --- a/editor/localization_editor.cpp +++ b/editor/localization_editor.cpp @@ -36,6 +36,7 @@ #include "editor/editor_node.h" #include "editor/editor_scale.h" #include "editor/editor_translation_parser.h" +#include "editor/filesystem_dock.h" #include "editor/pot_generator.h" #include "scene/gui/control.h" @@ -379,6 +380,95 @@ void LocalizationEditor::_update_pot_file_extensions() { } } +void LocalizationEditor::connect_filesystem_dock_signals(FileSystemDock *p_fs_dock) { + p_fs_dock->connect("files_moved", callable_mp(this, &LocalizationEditor::_filesystem_files_moved)); + p_fs_dock->connect("file_removed", callable_mp(this, &LocalizationEditor::_filesystem_file_removed)); +} + +void LocalizationEditor::_filesystem_files_moved(const String &p_old_file, const String &p_new_file) { + // Update remaps if the moved file is a part of them. + Dictionary remaps; + bool remaps_changed = false; + + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); + } + + // Check for the keys. + if (remaps.has(p_old_file)) { + PackedStringArray remapped_files = remaps[p_old_file]; + remaps.erase(p_old_file); + remaps[p_new_file] = remapped_files; + remaps_changed = true; + print_verbose(vformat("Changed remap key \"%s\" to \"%s\" due to a moved file.", p_old_file, p_new_file)); + } + + // Check for the Array elements of the values. + Array remap_keys = remaps.keys(); + for (int i = 0; i < remap_keys.size(); i++) { + PackedStringArray remapped_files = remaps[remap_keys[i]]; + bool remapped_files_updated = false; + + for (int j = 0; j < remapped_files.size(); j++) { + int splitter_pos = remapped_files[j].rfind(":"); + String res_path = remapped_files[j].substr(0, splitter_pos); + + if (res_path == p_old_file) { + String locale_name = remapped_files[j].substr(splitter_pos + 1); + // Replace the element at that index. + remapped_files.insert(j, p_new_file + ":" + locale_name); + remapped_files.remove_at(j + 1); + remaps_changed = true; + remapped_files_updated = true; + print_verbose(vformat("Changed remap value \"%s\" to \"%s\" of key \"%s\" due to a moved file.", res_path + ":" + locale_name, remapped_files[j], remap_keys[i])); + } + } + + if (remapped_files_updated) { + remaps[remap_keys[i]] = remapped_files; + } + } + + if (remaps_changed) { + ProjectSettings::get_singleton()->set_setting("internationalization/locale/translation_remaps", remaps); + update_translations(); + emit_signal("localization_changed"); + } +} + +void LocalizationEditor::_filesystem_file_removed(const String &p_file) { + // Check if the remaps are affected. + Dictionary remaps; + + if (ProjectSettings::get_singleton()->has_setting("internationalization/locale/translation_remaps")) { + remaps = ProjectSettings::get_singleton()->get("internationalization/locale/translation_remaps"); + } + + bool remaps_changed = remaps.has(p_file); + + if (!remaps_changed) { + Array remap_keys = remaps.keys(); + for (int i = 0; i < remap_keys.size() && !remaps_changed; i++) { + PackedStringArray remapped_files = remaps[remap_keys[i]]; + for (int j = 0; j < remapped_files.size() && !remaps_changed; j++) { + int splitter_pos = remapped_files[j].rfind(":"); + String res_path = remapped_files[j].substr(0, splitter_pos); + remaps_changed = p_file == res_path; + if (remaps_changed) { + print_verbose(vformat("Remap value \"%s\" of key \"%s\" has been removed from the file system.", remapped_files[j], remap_keys[i])); + } + } + } + } else { + print_verbose(vformat("Remap key \"%s\" has been removed from the file system.", p_file)); + } + + if (remaps_changed) { + update_translations(); + emit_signal("localization_changed"); + } +} + void LocalizationEditor::update_translations() { if (updating_translations) { return; @@ -432,6 +522,13 @@ void LocalizationEditor::update_translations() { t->set_tooltip(0, keys[i]); t->set_metadata(0, keys[i]); t->add_button(0, get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), 0, false, TTR("Remove")); + + // Display that it has been removed if this is the case. + if (!FileAccess::exists(keys[i])) { + t->set_text(0, t->get_text(0) + vformat(" (%s)", TTR("Removed"))); + t->set_tooltip(0, vformat(TTR("%s cannot be found."), t->get_tooltip(0))); + } + if (keys[i] == remap_selected) { t->select(0); translation_res_option_add_button->set_disabled(false); @@ -454,6 +551,12 @@ void LocalizationEditor::update_translations() { t2->set_editable(1, true); t2->set_metadata(1, path); t2->set_tooltip(1, locale); + + // Display that it has been removed if this is the case. + if (!FileAccess::exists(path)) { + t2->set_text(0, t2->get_text(0) + vformat(" (%s)", TTR("Removed"))); + t2->set_tooltip(0, vformat(TTR("%s cannot be found."), t2->get_tooltip(0))); + } } } } diff --git a/editor/localization_editor.h b/editor/localization_editor.h index 4b41a90cc2..10ccdfdc13 100644 --- a/editor/localization_editor.h +++ b/editor/localization_editor.h @@ -36,6 +36,7 @@ #include "scene/gui/tree.h" class EditorFileDialog; +class FileSystemDock; class LocalizationEditor : public VBoxContainer { GDCLASS(LocalizationEditor, VBoxContainer); @@ -81,6 +82,9 @@ class LocalizationEditor : public VBoxContainer { void _pot_generate(const String &p_file); void _update_pot_file_extensions(); + void _filesystem_files_moved(const String &p_old_file, const String &p_new_file); + void _filesystem_file_removed(const String &p_file); + protected: void _notification(int p_what); static void _bind_methods(); @@ -88,6 +92,7 @@ protected: public: void add_translation(const String &p_translation); void update_translations(); + void connect_filesystem_dock_signals(FileSystemDock *p_fs_dock); LocalizationEditor(); }; diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 57203ec147..ebd7525bb8 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -1426,19 +1426,19 @@ void AnimationPlayerEditor::_prepare_onion_layers_2() { // Render every past/future step with the capture shader. RS::get_singleton()->canvas_item_set_material(onion.capture.canvas_item, onion.capture.material->get_rid()); - onion.capture.material->set_shader_param("bkg_color", GLOBAL_GET("rendering/environment/defaults/default_clear_color")); - onion.capture.material->set_shader_param("differences_only", onion.differences_only); - onion.capture.material->set_shader_param("present", onion.differences_only ? RS::get_singleton()->viewport_get_texture(present_rid) : RID()); + onion.capture.material->set_shader_uniform("bkg_color", GLOBAL_GET("rendering/environment/defaults/default_clear_color")); + onion.capture.material->set_shader_uniform("differences_only", onion.differences_only); + onion.capture.material->set_shader_uniform("present", onion.differences_only ? RS::get_singleton()->viewport_get_texture(present_rid) : RID()); int step_off_a = onion.past ? -onion.steps : 0; int step_off_b = onion.future ? onion.steps : 0; int cidx = 0; - onion.capture.material->set_shader_param("dir_color", onion.force_white_modulate ? Color(1, 1, 1) : Color(EDITOR_GET("editors/animation/onion_layers_past_color"))); + onion.capture.material->set_shader_uniform("dir_color", onion.force_white_modulate ? Color(1, 1, 1) : Color(EDITOR_GET("editors/animation/onion_layers_past_color"))); for (int step_off = step_off_a; step_off <= step_off_b; step_off++) { if (step_off == 0) { // Skip present step and switch to the color of future. if (!onion.force_white_modulate) { - onion.capture.material->set_shader_param("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color")); + onion.capture.material->set_shader_uniform("dir_color", EDITOR_GET("editors/animation/onion_layers_future_color")); } continue; } diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 6f8d33532f..ac85eb5e1b 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -4237,13 +4237,13 @@ void CanvasItemEditor::_insert_animation_keys(bool p_location, bool p_rotation, Control *ctrl = Object::cast_to<Control>(canvas_item); if (key_pos) { - te->insert_node_value_key(ctrl, "rect_position", ctrl->get_position(), p_on_existing); + te->insert_node_value_key(ctrl, "position", ctrl->get_position(), p_on_existing); } if (key_rot) { - te->insert_node_value_key(ctrl, "rect_rotation", ctrl->get_rotation(), p_on_existing); + te->insert_node_value_key(ctrl, "rotation", ctrl->get_rotation(), p_on_existing); } if (key_scale) { - te->insert_node_value_key(ctrl, "rect_size", ctrl->get_size(), p_on_existing); + te->insert_node_value_key(ctrl, "size", ctrl->get_size(), p_on_existing); } } } diff --git a/editor/plugins/material_editor_plugin.cpp b/editor/plugins/material_editor_plugin.cpp index 00fc8cc7d6..1b4d98fc3f 100644 --- a/editor/plugins/material_editor_plugin.cpp +++ b/editor/plugins/material_editor_plugin.cpp @@ -340,17 +340,17 @@ Ref<Resource> StandardMaterial3DConversionPlugin::convert(const Ref<Resource> &p smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { // Texture parameter has to be treated specially since StandardMaterial3D saved it // as RID but ShaderMaterial needs Texture itself Ref<Texture2D> texture = mat->get_texture_by_name(E.name); if (texture.is_valid()) { - smat->set_shader_param(E.name, texture); + smat->set_shader_uniform(E.name, texture); } else { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } } @@ -386,17 +386,17 @@ Ref<Resource> ORMMaterial3DConversionPlugin::convert(const Ref<Resource> &p_reso smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { // Texture parameter has to be treated specially since ORMMaterial3D saved it // as RID but ShaderMaterial needs Texture itself Ref<Texture2D> texture = mat->get_texture_by_name(E.name); if (texture.is_valid()) { - smat->set_shader_param(E.name, texture); + smat->set_shader_uniform(E.name, texture); } else { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } } @@ -432,11 +432,11 @@ Ref<Resource> ParticlesMaterialConversionPlugin::convert(const Ref<Resource> &p_ smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); @@ -471,11 +471,11 @@ Ref<Resource> CanvasItemMaterialConversionPlugin::convert(const Ref<Resource> &p smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); @@ -510,11 +510,11 @@ Ref<Resource> ProceduralSkyMaterialConversionPlugin::convert(const Ref<Resource> smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); @@ -549,11 +549,11 @@ Ref<Resource> PanoramaSkyMaterialConversionPlugin::convert(const Ref<Resource> & smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); @@ -588,11 +588,11 @@ Ref<Resource> PhysicalSkyMaterialConversionPlugin::convert(const Ref<Resource> & smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); @@ -627,11 +627,11 @@ Ref<Resource> FogMaterialConversionPlugin::convert(const Ref<Resource> &p_resour smat->set_shader(shader); List<PropertyInfo> params; - RS::get_singleton()->shader_get_param_list(mat->get_shader_rid(), ¶ms); + RS::get_singleton()->shader_get_shader_uniform_list(mat->get_shader_rid(), ¶ms); for (const PropertyInfo &E : params) { Variant value = RS::get_singleton()->material_get_param(mat->get_rid(), E.name); - smat->set_shader_param(E.name, value); + smat->set_shader_uniform(E.name, value); } smat->set_render_priority(mat->get_render_priority()); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index ba505a9abb..005d5fc951 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -6408,7 +6408,7 @@ void fragment() { Ref<ShaderMaterial> rotate_mat = memnew(ShaderMaterial); rotate_mat->set_render_priority(Material::RENDER_PRIORITY_MAX); rotate_mat->set_shader(rotate_shader); - rotate_mat->set_shader_param("albedo", col); + rotate_mat->set_shader_uniform("albedo", col); rotate_gizmo_color[i] = rotate_mat; Array arrays = surftool->commit_to_arrays(); @@ -6416,7 +6416,7 @@ void fragment() { rotate_gizmo[i]->surface_set_material(0, rotate_mat); Ref<ShaderMaterial> rotate_mat_hl = rotate_mat->duplicate(); - rotate_mat_hl->set_shader_param("albedo", albedo); + rotate_mat_hl->set_shader_uniform("albedo", albedo); rotate_gizmo_color_hl[i] = rotate_mat_hl; if (i == 2) { // Rotation white outline @@ -6457,7 +6457,7 @@ void fragment() { )"); border_mat->set_shader(border_shader); - border_mat->set_shader_param("albedo", Color(0.75, 0.75, 0.75, col.a / 3.0)); + border_mat->set_shader_uniform("albedo", Color(0.75, 0.75, 0.75, col.a / 3.0)); rotate_gizmo[3] = Ref<ArrayMesh>(memnew(ArrayMesh)); rotate_gizmo[3]->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, arrays); @@ -6710,8 +6710,8 @@ void Node3DEditor::_init_grid() { fade_size = CLAMP(fade_size, min_fade_size, max_fade_size); real_t grid_fade_size = (grid_size - primary_grid_steps) * fade_size; - grid_mat[c]->set_shader_param("grid_size", grid_fade_size); - grid_mat[c]->set_shader_param("orthogonal", orthogonal); + grid_mat[c]->set_shader_uniform("grid_size", grid_fade_size); + grid_mat[c]->set_shader_uniform("orthogonal", orthogonal); // Cache these so we don't have to re-access memory. Vector<Vector3> &ref_grid = grid_points[c]; @@ -7559,9 +7559,9 @@ void Node3DEditor::_sun_direction_draw() { sun_direction->draw_rect(Rect2(Vector2(), sun_direction->get_size()), Color(1, 1, 1, 1)); Vector3 z_axis = preview_sun->get_transform().basis.get_column(Vector3::AXIS_Z); z_axis = get_editor_viewport(0)->camera->get_camera_transform().basis.xform_inv(z_axis); - sun_direction_material->set_shader_param("sun_direction", Vector3(z_axis.x, -z_axis.y, z_axis.z)); + sun_direction_material->set_shader_uniform("sun_direction", Vector3(z_axis.x, -z_axis.y, z_axis.z)); Color color = sun_color->get_pick_color() * sun_energy->get_value(); - sun_direction_material->set_shader_param("sun_color", Vector3(color.r, color.g, color.b)); + sun_direction_material->set_shader_uniform("sun_color", Vector3(color.r, color.g, color.b)); } void Node3DEditor::_preview_settings_changed() { @@ -8162,8 +8162,8 @@ void fragment() { )"); sun_direction_material.instantiate(); sun_direction_material->set_shader(sun_direction_shader); - sun_direction_material->set_shader_param("sun_direction", Vector3(0, 0, 1)); - sun_direction_material->set_shader_param("sun_color", Vector3(1, 1, 1)); + sun_direction_material->set_shader_uniform("sun_direction", Vector3(0, 0, 1)); + sun_direction_material->set_shader_uniform("sun_color", Vector3(1, 1, 1)); sun_direction->set_material(sun_direction_material); HBoxContainer *sun_angle_hbox = memnew(HBoxContainer); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index ed0d14efb7..c453ed26aa 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -921,8 +921,8 @@ void fragment() { )"); handle_material->set_shader(handle_shader); Ref<Texture2D> handle = EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("EditorBoneHandle"), SNAME("EditorIcons")); - handle_material->set_shader_param("point_size", handle->get_width()); - handle_material->set_shader_param("texture_albedo", handle); + handle_material->set_shader_uniform("point_size", handle->get_width()); + handle_material->set_shader_uniform("texture_albedo", handle); handles_mesh_instance = memnew(MeshInstance3D); handles_mesh_instance->set_cast_shadows_setting(GeometryInstance3D::SHADOW_CASTING_SETTING_OFF); diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 0fc7079a24..64cafa17f3 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -57,8 +57,8 @@ void Texture3DEditor::_texture_changed() { } void Texture3DEditor::_update_material() { - material->set_shader_param("layer", (layer->get_value() + 0.5) / texture->get_depth()); - material->set_shader_param("tex", texture->get_rid()); + material->set_shader_uniform("layer", (layer->get_value() + 0.5) / texture->get_depth()); + material->set_shader_uniform("tex", texture->get_rid()); String format = Image::get_format_name(texture->get_format()); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index cb146fd342..2c6f70463d 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -68,9 +68,9 @@ void TextureLayeredEditor::_texture_changed() { } void TextureLayeredEditor::_update_material() { - materials[0]->set_shader_param("layer", layer->get_value()); - materials[2]->set_shader_param("layer", layer->get_value()); - materials[texture->get_layered_type()]->set_shader_param("tex", texture->get_rid()); + materials[0]->set_shader_uniform("layer", layer->get_value()); + materials[2]->set_shader_uniform("layer", layer->get_value()); + materials[texture->get_layered_type()]->set_shader_uniform("tex", texture->get_rid()); Vector3 v(1, 1, 1); v.normalize(); @@ -79,10 +79,10 @@ void TextureLayeredEditor::_update_material() { b.rotate(Vector3(1, 0, 0), x_rot); b.rotate(Vector3(0, 1, 0), y_rot); - materials[1]->set_shader_param("normal", v); - materials[1]->set_shader_param("rot", b); - materials[2]->set_shader_param("normal", v); - materials[2]->set_shader_param("rot", b); + materials[1]->set_shader_uniform("normal", v); + materials[1]->set_shader_uniform("rot", b); + materials[2]->set_shader_uniform("normal", v); + materials[2]->set_shader_uniform("rot", b); String format = Image::get_format_name(texture->get_format()); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index 2a61ea0baa..bbc22c8622 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -3381,6 +3381,7 @@ ThemeTypeEditor::ThemeTypeEditor() { theme_type_list = memnew(OptionButton); theme_type_list->set_h_size_flags(SIZE_EXPAND_FILL); + theme_type_list->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); type_list_hb->add_child(theme_type_list); theme_type_list->connect("item_selected", callable_mp(this, &ThemeTypeEditor::_list_type_selected)); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 65d684c2a1..1c0e879a0a 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -6228,7 +6228,7 @@ void VisualShaderNodePortPreview::_shader_changed() { } if (src_mat && src_mat->get_shader().is_valid()) { List<PropertyInfo> params; - src_mat->get_shader()->get_param_list(¶ms); + src_mat->get_shader()->get_shader_uniform_list(¶ms); for (const PropertyInfo &E : params) { material->set(E.name, src_mat->get(E.name)); } @@ -6249,7 +6249,7 @@ void VisualShaderNodePortPreview::setup(const Ref<VisualShader> &p_shader, Visua } Size2 VisualShaderNodePortPreview::get_minimum_size() const { - int port_preview_size = EditorSettings::get_singleton()->get("editors/visual_editors/visualshader/port_preview_size"); + int port_preview_size = EditorSettings::get_singleton()->get("editors/visual_editors/visual_shader/port_preview_size"); return Size2(port_preview_size, port_preview_size) * EDSCALE; } diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index b564195911..8de8f94f87 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -42,7 +42,8 @@ const int ERROR_CODE = 77; #include "core/templates/hash_map.h" #include "core/templates/list.h" -const int CONVERSION_MAX_FILE_SIZE = 1024 * 1024 * 4; // 4 MB +const uint64_t CONVERSION_MAX_FILE_SIZE_MB = 4; +const uint64_t CONVERSION_MAX_FILE_SIZE = 1024 * 1024 * CONVERSION_MAX_FILE_SIZE_MB; static const char *enum_renames[][2] = { //// constants @@ -255,6 +256,7 @@ static const char *gdscript_function_renames[][2] = { { "damped_spring_joint_create", "joint_make_damped_spring" }, // PhysicsServer2D { "damped_string_joint_get_param", "damped_spring_joint_get_param" }, // PhysicsServer2D { "damped_string_joint_set_param", "damped_spring_joint_set_param" }, // PhysicsServer2D + { "dectime", "move_toward" }, // GDScript, Math functions { "delete_char_at_cursor", "delete_char_at_caret" }, // LineEdit { "deselect_items", "deselect_all" }, // FileDialog { "disable_plugin", "_disable_plugin" }, // EditorPlugin @@ -427,6 +429,7 @@ static const char *gdscript_function_renames[][2] = { { "joint_create_slider", "joint_make_slider" }, // PhysicsServer3D { "line_intersects_line_2d", "line_intersects_line" }, // Geometry2D { "load_from_globals", "load_from_project_settings" }, // InputMap + { "load_interactive", "load_threaded_request" }, // ResourceLoader - load_threaded_request is alternative, but is used differently { "make_convex_from_brothers", "make_convex_from_siblings" }, // CollisionShape3D { "make_visible", "_make_visible" }, // EditorPlugin { "merge_polygons_2d", "merge_polygons" }, // Geometry2D @@ -484,6 +487,7 @@ static const char *gdscript_function_renames[][2] = { { "set_enabled_focus_mode", "set_focus_mode" }, // BaseButton { "set_endian_swap", "set_big_endian" }, // File { "set_expand_to_text_length", "set_expand_to_text_length_enabled" }, // LineEdit + { "set_filename", "set_scene_file_path" }, // Node, WARNING, this may be used in a lot of other places { "set_focus_neighbour", "set_focus_neighbor" }, // Control { "set_frame_color", "set_color" }, // ColorRect { "set_global_rate_scale", "set_playback_speed_scale" }, // AudioServer @@ -975,6 +979,7 @@ static const char *gdscript_properties_renames[][2] = { // { "wrap_enabled", "wrap_mode" }, // TextEdit // { "zfar", "far" }, // Camera3D // { "znear", "near" }, // Camera3D + // { "filename", "scene_file_path" }, // Node { "as_normalmap", "as_normal_map" }, // NoiseTexture { "bbcode_text", "text" }, // RichTextLabel { "caret_moving_by_right_click", "caret_move_on_right_click" }, // TextEdit @@ -1595,12 +1600,33 @@ static const char *colors_renames[][2] = { { nullptr, nullptr }, }; +class ProjectConverter3To4::RegExContainer { +public: + RegEx reg_is_empty = RegEx("\\bempty\\("); + RegEx reg_super = RegEx("([\t ])\\.([a-zA-Z_])"); + RegEx reg_json_to = RegEx("\\bto_json\\b"); + RegEx reg_json_parse = RegEx("([\t]{0,})([^\n]+)parse_json\\(([^\n]+)"); + RegEx reg_json_non_new = RegEx("([\t]{0,})([^\n]+)JSON\\.parse\\(([^\n]+)"); + RegEx reg_export = RegEx("export\\(([a-zA-Z0-9_]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)"); + RegEx reg_export_advanced = RegEx("export\\(([^)^\n]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)([^\n]+)"); + RegEx reg_setget_setget = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*,[ \t]*([a-zA-Z0-9_]+)"); + RegEx reg_setget_set = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*[,]*[^a-z^A-Z^0-9^_]*$"); + RegEx reg_setget_get = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+,[ \t]*([a-zA-Z0-9_]+)[ \t]*$"); + RegEx reg_join = RegEx("([\\(\\)a-zA-Z0-9_]+)\\.join\\(([^\n^\\)]+)\\)"); + RegEx reg_mixed_tab_space = RegEx("([\t]+)([ ]+)"); + RegEx reg_image_lock = RegEx("([a-zA-Z0-9_\\.]+)\\.lock\\(\\)"); + RegEx reg_image_unlock = RegEx("([a-zA-Z0-9_\\.]+)\\.unlock\\(\\)"); + RegEx reg_os_fullscreen = RegEx("OS.window_fullscreen[= ]+([^#^\n]+)"); +}; + // Function responsible for converting project int ProjectConverter3To4::convert() { print_line("Starting conversion."); + RegExContainer reg_container = RegExContainer(); + ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); - ERR_FAIL_COND_V_MSG(!test_conversion(), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); + ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); // Checking if folder contains valid Godot 3 project. // Project cannot be converted 2 times @@ -1640,7 +1666,7 @@ int ProjectConverter3To4::convert() { uint64_t start_time = Time::get_singleton()->get_ticks_msec(); if (file_name.ends_with(".shader")) { - DirAccess::remove_file_or_error(file_name); + DirAccess::remove_file_or_error(file_name.trim_prefix("res://")); file_name = file_name.replace(".shader", ".gdshader"); } @@ -1653,7 +1679,7 @@ int ProjectConverter3To4::convert() { rename_enums(file_content); // Require to additional rename rename_common(gdscript_function_renames, file_content); - rename_gdscript_functions(file_content); // Require to additional rename + rename_gdscript_functions(file_content, reg_container, false); // Require to additional rename rename_common(project_settings_renames, file_content); rename_gdscript_keywords(file_content); @@ -1671,7 +1697,7 @@ int ProjectConverter3To4::convert() { rename_enums(file_content); // Require to additional rename rename_common(gdscript_function_renames, file_content); - rename_gdscript_functions(file_content); // Require to additional rename + rename_gdscript_functions(file_content, reg_container, true); // Require to additional rename rename_common(project_settings_renames, file_content); rename_gdscript_keywords(file_content); @@ -1708,7 +1734,7 @@ int ProjectConverter3To4::convert() { continue; } } else { - reason.append(" ERROR: File has exceeded the maximum size allowed - 500 KB"); + reason.append(" ERROR: File has exceeded the maximum size allowed - " + itos(CONVERSION_MAX_FILE_SIZE_MB) + " MB"); is_ignored = true; } @@ -1718,7 +1744,7 @@ int ProjectConverter3To4::convert() { uint64_t hash_after = file_content.hash64(); // Don't need to save file without any changes // Save if this is a shader, because it was renamed - if (hash_before != hash_after || file_name.find(".gdshader") != -1) { + if (hash_before != hash_after || file_name.ends_with(".gdshader")) { converted_files++; Ref<FileAccess> file = FileAccess::open(file_name, FileAccess::WRITE); @@ -1742,8 +1768,10 @@ int ProjectConverter3To4::convert() { int ProjectConverter3To4::validate_conversion() { print_line("Starting checking if project conversion can be done."); + RegExContainer reg_container = RegExContainer(); + ERR_FAIL_COND_V_MSG(!test_array_names(), ERROR_CODE, "Cannot start converting due to problems with data in arrays."); - ERR_FAIL_COND_V_MSG(!test_conversion(), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); + ERR_FAIL_COND_V_MSG(!test_conversion(reg_container), ERROR_CODE, "Cannot start converting due to problems with converting arrays."); // Checking if folder contains valid Godot 3 project. // Project cannot be converted 2 times @@ -1784,7 +1812,7 @@ int ProjectConverter3To4::validate_conversion() { bool is_ignored = false; uint64_t start_time = Time::get_singleton()->get_ticks_msec(); - if (file_name.ends_with(".sader")) { + if (file_name.ends_with(".shader")) { reason.append("\tFile extension will be renamed from `shader` to `gdshader`."); } @@ -1796,7 +1824,7 @@ int ProjectConverter3To4::validate_conversion() { changed_elements.append_array(check_for_rename_enums(file_content)); changed_elements.append_array(check_for_rename_common(gdscript_function_renames, file_content)); - changed_elements.append_array(check_for_rename_gdscript_functions(file_content)); + changed_elements.append_array(check_for_rename_gdscript_functions(file_content, reg_container, false)); changed_elements.append_array(check_for_rename_common(project_settings_renames, file_content)); changed_elements.append_array(check_for_rename_gdscript_keywords(file_content)); @@ -1814,7 +1842,7 @@ int ProjectConverter3To4::validate_conversion() { changed_elements.append_array(check_for_rename_enums(file_content)); changed_elements.append_array(check_for_rename_common(gdscript_function_renames, file_content)); - changed_elements.append_array(check_for_rename_gdscript_functions(file_content)); + changed_elements.append_array(check_for_rename_gdscript_functions(file_content, reg_container, true)); changed_elements.append_array(check_for_rename_common(project_settings_renames, file_content)); changed_elements.append_array(check_for_rename_gdscript_keywords(file_content)); @@ -1851,7 +1879,7 @@ int ProjectConverter3To4::validate_conversion() { continue; } } else { - reason.append("\tERROR: File has exceeded the maximum size allowed - 500 KB"); + reason.append("\tERROR: File has exceeded the maximum size allowed - " + itos(CONVERSION_MAX_FILE_SIZE_MB) + " MB"); is_ignored = true; } @@ -1928,6 +1956,17 @@ bool ProjectConverter3To4::test_conversion_single_additional(String name, String return true; } +bool ProjectConverter3To4::test_conversion_single_additional_builtin(String name, String expected, void (ProjectConverter3To4::*func)(String &, const RegExContainer &, bool), String what, const RegExContainer ®_container, bool builtin_script) { + String got = name; + (this->*func)(got, reg_container, builtin_script); + if (expected != got) { + ERR_PRINT("Failed to convert " + what + " `" + name + "` to `" + expected + "`, got instead `" + got + "`"); + return false; + } + + return true; +} + bool ProjectConverter3To4::test_conversion_single_normal(String name, String expected, const char *array[][2], String what) { String got = name; rename_common(array, got); @@ -1939,7 +1978,7 @@ bool ProjectConverter3To4::test_conversion_single_normal(String name, String exp } // Validate if conversions are proper -bool ProjectConverter3To4::test_conversion() { +bool ProjectConverter3To4::test_conversion(const RegExContainer ®_container) { bool valid = true; valid = valid & test_conversion_single_normal("Spatial", "Node3D", class_renames, "class"); @@ -1970,26 +2009,28 @@ bool ProjectConverter3To4::test_conversion() { valid = valid & test_conversion_single_additional("(Disconnect(A,B,C) != OK):", "(Disconnect(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename csharp"); valid = valid & test_conversion_single_additional("(IsConnected(A,B,C) != OK):", "(IsConnected(A,new Callable(B,C)) != OK):", &ProjectConverter3To4::rename_csharp_functions, "custom rename"); - valid = valid & test_conversion_single_additional("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\"display/window/size/fullscreen\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\"display/window/size/fullscreen\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("OS.window_fullscreen = Settings.fullscreen", "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", Settings.fullscreen)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); + valid = valid & test_conversion_single_additional_builtin("OS.get_window_safe_area()", "DisplayServer.get_display_safe_area()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("\tvar aa = roman(r.move_and_slide( a, b, c, d, e, f )) # Roman", "\tr.set_motion_velocity(a)\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tvar aa = roman(r.move_and_slide()) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\tvar aa = roman(r.move_and_slide_with_snap( a, g, b, c, d, e, f )) # Roman", "\tr.set_motion_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tvar aa = roman(r.move_and_slide()) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("\tvar aa = roman(r.move_and_slide( a, b, c, d, e, f )) # Roman", "\tr.set_motion_velocity(a)\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tvar aa = roman(r.move_and_slide()) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\tvar aa = roman(r.move_and_slide_with_snap( a, g, b, c, d, e, f )) # Roman", "\tr.set_motion_velocity(a)\n\t# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `g`\n\tr.set_up_direction(b)\n\tr.set_floor_stop_on_slope_enabled(c)\n\tr.set_max_slides(d)\n\tr.set_floor_max_angle(e)\n\t# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `f`\n\tvar aa = roman(r.move_and_slide()) # Roman", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("list_dir_begin( a , b )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("list_dir_begin( a )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("list_dir_begin( )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("list_dir_begin( a , b )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("list_dir_begin( a )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("list_dir_begin( )", "list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("sort_custom( a , b )", "sort_custom(Callable(a,b))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("sort_custom( a , b )", "sort_custom(Callable(a,b))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("func c(var a, var b)", "func c(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("func c(var a, var b)", "func c(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("draw_line(1, 2, 3, 4, 5)", "draw_line(1,2,3,4)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("draw_line(1, 2, 3, 4, 5)", "draw_line(1,2,3,4)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); - valid = valid & test_conversion_single_additional("\timage.lock()", "\tfalse # image.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\timage.unlock()", "\tfalse # image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\troman.image.unlock()", "\tfalse # roman.image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\tmtx.lock()", "\tmtx.lock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\tmutex.unlock()", "\tmutex.unlock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional_builtin("\timage.lock()", "\tfalse # image.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\timage.unlock()", "\tfalse # image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\troman.image.unlock()", "\tfalse # roman.image.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\tmtx.lock()", "\tmtx.lock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\tmutex.unlock()", "\tmutex.unlock()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid & test_conversion_single_additional("\nonready", "\n@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); valid = valid & test_conversion_single_additional("onready", "@onready", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); @@ -2002,82 +2043,86 @@ bool ProjectConverter3To4::test_conversion() { valid = valid & test_conversion_single_additional("tool", "@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); valid = valid & test_conversion_single_additional("\n tool", "\n tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); valid = valid & test_conversion_single_additional("\n\ntool", "\n\n@tool", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\nmaster func", "\n\n@rpc(any) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\npuppet func", "\n\n@rpc(auth) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\nremote func", "\n\n@rpc(any) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\nremotesync func", "\n\n@rpc(any,sync) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\nsync func", "\n\n@rpc(any,sync) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\npuppetsync func", "\n\n@rpc(auth,sync) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - valid = valid & test_conversion_single_additional("\n\nmastersync func", "\n\n@rpc(any,sync) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); - - valid = valid & test_conversion_single_additional("var size : Vector2 = Vector2() setget set_function , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function\n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("var size : Vector2 = Vector2() setget set_function , ", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("var size : Vector2 = Vector2() setget set_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("var size : Vector2 = Vector2() setget , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function \n set(mod_value):\n mod_value # TODOConverter40 Non existent set function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("get_node(@", "get_node(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("yield(this, \"timeout\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional(" Transform.xform(Vector3(a,b,c)) ", " Transform * Vector3(a,b,c) ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(" Transform.xform_inv(Vector3(a,b,c)) ", " Vector3(a,b,c) * Transform ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("export(float) var lifetime = 3.0", "export var lifetime: float = 3.0", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro'", "export var _font_name = 'AnonymousPro' # (String, 'AnonymousPro', 'CourierPrime')", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); // TODO, this is only a workaround - valid = valid & test_conversion_single_additional("export(PackedScene) var mob_scene", "export var mob_scene: PackedScene", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("var d = parse_json(roman(sfs))", "var test_json_conv = JSON.new()\ntest_json_conv.parse(roman(sfs))\nvar d = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("to_json( AA ) szon", "JSON.new().stringify( AA ) szon", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("s to_json", "s JSON.new().stringify", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("AF to_json2", "AF to_json2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("var rr = JSON.parse(a)", "var test_json_conv = JSON.new()\ntest_json_conv.parse(a)\nvar rr = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("empty()", "is_empty()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(".empty", ".empty", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional(").roman(", ").roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\t.roman(", "\tsuper.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(" .roman(", " super.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(".1", ".1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(" .1", " .1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("'.'", "'.'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("'.a'", "'.a'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\t._input(_event)", "\tsuper._input(_event)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("(start(A,B,C,D,E,F,G) != OK):", "(start(A,Callable(B,C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("(connect(A,B,C,D,E,F,G) != OK):", "(connect(A,Callable(B,C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("(connect(A,B,C) != OK):", "(connect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("disconnect(A,B,C) != OK):", "disconnect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("is_connected(A,B,C) != OK):", "is_connected(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("is_connected(A,B,C))", "is_connected(A,Callable(B,C)))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("func _init(p_x:int)->void:", "func _init(p_x:int):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("q_PackedDataContainer._iter_init(variable1)", "q_PackedDataContainer._iter_init(variable1)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("assert(speed < 20, str(randi()%10))", "assert(speed < 20) #,str(randi()%10))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("assert(speed < 2)", "assert(speed < 2)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("assert(false, \"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", "assert(false) #,\"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("create_from_image(aa, bb)", "create_from_image(aa) #,bb", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("q_ImageTexture.create_from_image(variable1, variable2)", "q_ImageTexture.create_from_image(variable1) #,variable2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("set_cell_item(a, b, c, d ,e) # AA", "set_cell_item( Vector3(a,b,c) ,d,e) # AA", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("set_cell_item(a, b)", "set_cell_item(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("get_cell_item_orientation(a, b,c)", "get_cell_item_orientation(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("get_cell_item(a, b,c)", "get_cell_item(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("map_to_world(a, b,c)", "map_to_world(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("PackedStringArray(req_godot).join('.')", "'.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("=PackedStringArray(req_godot).join('.')", "='.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional(" aa", " aa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\taa", "\taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("\t aa", "\taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional(" \taa", " \taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - - valid = valid & test_conversion_single_additional("apply_force(position, impulse)", "apply_force(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); - valid = valid & test_conversion_single_additional("apply_impulse(position, impulse)", "apply_impulse(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename"); + valid = valid & test_conversion_single_additional("\n\nremote func", "\n\n@rpc(any_peer) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + valid = valid & test_conversion_single_additional("\n\nremotesync func", "\n\n@rpc(any_peer, call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + valid = valid & test_conversion_single_additional("\n\npuppet func", "\n\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + valid = valid & test_conversion_single_additional("\n\npuppetsync func", "\n\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + valid = valid & test_conversion_single_additional("\n\nmaster func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + valid = valid & test_conversion_single_additional("\n\nmastersync func", "\n\nThe master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n@rpc(call_local) func", &ProjectConverter3To4::rename_gdscript_keywords, "gdscript keyword"); + + valid = valid & test_conversion_single_additional_builtin("var size : Vector2 = Vector2() setget set_function , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function\n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("var size : Vector2 = Vector2() setget set_function , ", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("var size : Vector2 = Vector2() setget set_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Non existent get function \n set(mod_value):\n mod_value # TODOConverter40 Copy here content of set_function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("var size : Vector2 = Vector2() setget , get_function", "var size : Vector2 = Vector2() :\n get:\n return size # TODOConverter40 Copy here content of get_function \n set(mod_value):\n mod_value # TODOConverter40 Non existent set function", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("get_node(@", "get_node(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("yield(this, \"timeout\")", "await this.timeout", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("yield(this, \"timeout\")", "await this.\"timeout\"", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, true); + + valid = valid & test_conversion_single_additional_builtin(" Transform.xform(Vector3(a,b,c)) ", " Transform * Vector3(a,b,c) ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(" Transform.xform_inv(Vector3(a,b,c)) ", " Vector3(a,b,c) * Transform ", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("export(float) var lifetime = 3.0", "export var lifetime: float = 3.0", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro'", "export var _font_name = 'AnonymousPro' # (String, 'AnonymousPro', 'CourierPrime')", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); // TODO, this is only a workaround + valid = valid & test_conversion_single_additional_builtin("export(PackedScene) var mob_scene", "export var mob_scene: PackedScene", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("var d = parse_json(roman(sfs))", "var test_json_conv = JSON.new()\ntest_json_conv.parse(roman(sfs))\nvar d = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("to_json( AA ) szon", "JSON.new().stringify( AA ) szon", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("s to_json", "s JSON.new().stringify", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("AF to_json2", "AF to_json2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("var rr = JSON.parse(a)", "var test_json_conv = JSON.new()\ntest_json_conv.parse(a)\nvar rr = test_json_conv.get_data()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("empty()", "is_empty()", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(".empty", ".empty", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin(").roman(", ").roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\t.roman(", "\tsuper.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(" .roman(", " super.roman(", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(".1", ".1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(" .1", " .1", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("'.'", "'.'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("'.a'", "'.a'", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\t._input(_event)", "\tsuper._input(_event)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("(connect(A,B,C) != OK):", "(connect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("(connect(A,B,C,D) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("(connect(A,B,C,[D]) != OK):", "(connect(A,Callable(B,C).bind(D)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("(connect(A,B,C,D,E) != OK):", "(connect(A,Callable(B,C).bind(D),E) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("(start(A,B) != OK):", "(start(Callable(A,B)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("(start(A,B,C,D,E,F,G) != OK):", "(start(Callable(A,B).bind(C),D,E,F,G) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("disconnect(A,B,C) != OK):", "disconnect(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("is_connected(A,B,C) != OK):", "is_connected(A,Callable(B,C)) != OK):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("is_connected(A,B,C))", "is_connected(A,Callable(B,C)))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("func _init(p_x:int)->void:", "func _init(p_x:int):", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("q_PackedDataContainer._iter_init(variable1)", "q_PackedDataContainer._iter_init(variable1)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("assert(speed < 20, str(randi()%10))", "assert(speed < 20) #,str(randi()%10))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("assert(speed < 2)", "assert(speed < 2)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("assert(false, \"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", "assert(false) #,\"Missing type --\" + str(argument.type) + \"--, needs to be added to project\")", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("create_from_image(aa, bb)", "create_from_image(aa) #,bb", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("q_ImageTexture.create_from_image(variable1, variable2)", "q_ImageTexture.create_from_image(variable1) #,variable2", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("set_cell_item(a, b, c, d ,e) # AA", "set_cell_item( Vector3(a,b,c) ,d,e) # AA", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("set_cell_item(a, b)", "set_cell_item(a, b)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("get_cell_item_orientation(a, b,c)", "get_cell_item_orientation(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("get_cell_item(a, b,c)", "get_cell_item(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("map_to_world(a, b,c)", "map_to_world(Vector3i(a,b,c))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("PackedStringArray(req_godot).join('.')", "'.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("=PackedStringArray(req_godot).join('.')", "='.'.join(PackedStringArray(req_godot))", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin(" aa", " aa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\taa", "\taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("\t aa", "\taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin(" \taa", " \taa", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + + valid = valid & test_conversion_single_additional_builtin("apply_force(position, impulse)", "apply_force(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); + valid = valid & test_conversion_single_additional_builtin("apply_impulse(position, impulse)", "apply_impulse(impulse, position)", &ProjectConverter3To4::rename_gdscript_functions, "custom rename", reg_container, false); valid = valid & test_conversion_single_additional("AAA Color.white AF", "AAA Color.WHITE AF", &ProjectConverter3To4::rename_enums, "custom rename"); @@ -2535,7 +2580,7 @@ Vector<String> ProjectConverter3To4::check_for_rename_enums(Vector<String> &file void ProjectConverter3To4::rename_classes(String &file_content) { int current_index = 0; - // TODO Maybe it is better way to not rename gd, tscn and other files which are named are classes + // TODO Maybe it is better way to not rename gd, tscn and other files which are named as classes while (class_renames[current_index][0]) { // Begin renaming workaround `Resource.gd` -> `RefCounter.gd` RegEx reg_before = RegEx(String("\\b") + class_renames[current_index][0] + ".tscn\\b"); @@ -2625,432 +2670,11 @@ Vector<String> ProjectConverter3To4::check_for_rename_classes(Vector<String> &fi return found_things; } -void ProjectConverter3To4::rename_gdscript_functions(String &file_content) { - // Custom renaming, each rule needs to be set manually - // Don't forget to put validate each rule in validate_conversion function +void ProjectConverter3To4::rename_gdscript_functions(String &file_content, const RegExContainer ®_container, bool builtin) { Vector<String> lines = file_content.split("\n"); - RegEx reg_is_empty = RegEx("\\bempty\\("); - RegEx reg_super = RegEx("([\t ])\\.([a-zA-Z_])"); - RegEx reg_json_to = RegEx("\\bto_json\\b"); - RegEx reg_json_parse = RegEx("([\t]{0,})([^\n]+)parse_json\\(([^\n]+)"); - RegEx reg_json_non_new = RegEx("([\t]{0,})([^\n]+)JSON\\.parse\\(([^\n]+)"); - RegEx reg_export = RegEx("export\\(([a-zA-Z0-9_]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)"); - RegEx reg_export_advanced = RegEx("export\\(([^)^\n]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)([^\n]+)"); - RegEx reg_setget_setget = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*,[ \t]*([a-zA-Z0-9_]+)"); - RegEx reg_setget_set = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*[,]*[^a-z^A-Z^0-9^_]*$"); - RegEx reg_setget_get = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+,[ \t]*([a-zA-Z0-9_]+)[ \t]*$"); - RegEx reg_join = RegEx("([\\(\\)a-zA-Z0-9_]+)\\.join\\(([^\n^\\)]+)\\)"); - RegEx reg_mixed_tab_space = RegEx("([\t]+)([ ]+)"); - RegEx reg_image_lock = RegEx("([a-zA-Z0-9_\\.]+)\\.lock\\(\\)"); - RegEx reg_image_unlock = RegEx("([a-zA-Z0-9_\\.]+)\\.unlock\\(\\)"); - RegEx reg_os_fullscreen = RegEx("OS.window_fullscreen[= ]+([^#^\n]+)"); - - CRASH_COND(!reg_is_empty.is_valid()); - CRASH_COND(!reg_super.is_valid()); - CRASH_COND(!reg_json_to.is_valid()); - CRASH_COND(!reg_json_parse.is_valid()); - CRASH_COND(!reg_json_non_new.is_valid()); - CRASH_COND(!reg_export.is_valid()); - CRASH_COND(!reg_export_advanced.is_valid()); - CRASH_COND(!reg_setget_setget.is_valid()); - CRASH_COND(!reg_setget_set.is_valid()); - CRASH_COND(!reg_setget_get.is_valid()); - CRASH_COND(!reg_join.is_valid()); - CRASH_COND(!reg_mixed_tab_space.is_valid()); - CRASH_COND(!reg_image_lock.is_valid()); - CRASH_COND(!reg_image_unlock.is_valid()); - CRASH_COND(!reg_os_fullscreen.is_valid()); - for (String &line : lines) { - if (line.find("mtx") == -1 && line.find("mutex") == -1 && line.find("Mutex") == -1) { - line = reg_image_lock.sub(line, "false # $1.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); - line = reg_image_unlock.sub(line, "false # $1.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); - } - - // Mixed use of spaces and tabs - tabs as first - TODO, this probably is problem problem, but not sure - line = reg_mixed_tab_space.sub(line, "$1", true); - - // PackedStringArray(req_godot).join('.') -> '.'.join(PackedStringArray(req_godot)) PoolStringArray - line = reg_join.sub(line, "$2.join($1)", true); - - // -- empty() -> is_empty() Pool*Array - line = reg_is_empty.sub(line, "is_empty(", true); - - // -- \t.func() -> \tsuper.func() Object - line = reg_super.sub(line, "$1super.$2", true); // TODO, not sure if possible, but for now this brake String text e.g. "Choosen .gitignore" -> "Choosen super.gitignore" - - // -- JSON.parse(a) -> JSON.new().parse(a) etc. JSON - line = reg_json_non_new.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); - - // -- to_json(a) -> JSON.new().stringify(a) Object - line = reg_json_to.sub(line, "JSON.new().stringify", true); - - // -- parse_json(a) -> JSON.get_data() etc. Object - line = reg_json_parse.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); - - // -- get_node(@ -> get_node( Node - line = line.replace("get_node(@", "get_node("); - - // export(float) var lifetime = 3.0 -> export var lifetime: float = 3.0 GDScript - line = reg_export.sub(line, "export var $2: $1"); - - // export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro' -> export var _font_name = 'AnonymousPro' #(String, 'AnonymousPro', 'CourierPrime') GDScript - line = reg_export_advanced.sub(line, "export var $2$3 # ($1)"); - - // Setget Setget - line = reg_setget_setget.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $4\n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); - - // Setget set - line = reg_setget_set.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Non existent get function \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); - - // Setget get - line = reg_setget_get.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $3 \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Non existent set function", true); - - // OS.window_fullscreen = true -> ProjectSettings.set("display/window/size/fullscreen",true) - line = reg_os_fullscreen.sub(line, "ProjectSettings.set(\"display/window/size/fullscreen\", $1)", true); - - // -- r.move_and_slide( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody - if (line.find("move_and_slide(") != -1) { - int start = line.find("move_and_slide("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - String base_obj = get_object_of_execution(line.substr(0, start)); - String starting_space = get_starting_space(line); - - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 1) { - String line_new; - - // motion_velocity - line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; - - // up_direction - if (parts.size() >= 2) { - line_new += starting_space + base_obj + "set_up_direction(" + parts[1] + ")\n"; - } - - // stop_on_slope - if (parts.size() >= 3) { - line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[2] + ")\n"; - } - - // max_slides - if (parts.size() >= 4) { - line_new += starting_space + base_obj + "set_max_slides(" + parts[3] + ")\n"; - } - - // floor_max_angle - if (parts.size() >= 5) { - line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[4] + ")\n"; - } - - // infiinite_interia - if (parts.size() >= 6) { - line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[5] + "`\n"; - } - - line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); - } - } - } - - // -- r.move_and_slide_with_snap( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody - if (line.find("move_and_slide_with_snap(") != -1) { - int start = line.find("move_and_slide_with_snap("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - String base_obj = get_object_of_execution(line.substr(0, start)); - String starting_space = get_starting_space(line); - - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 1) { - String line_new; - - // motion_velocity - line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; - - // snap - if (parts.size() >= 2) { - line_new += starting_space + "# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `" + parts[1] + "`\n"; - } - - // up_direction - if (parts.size() >= 3) { - line_new += starting_space + base_obj + "set_up_direction(" + parts[2] + ")\n"; - } - - // stop_on_slope - if (parts.size() >= 4) { - line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[3] + ")\n"; - } - - // max_slides - if (parts.size() >= 5) { - line_new += starting_space + base_obj + "set_max_slides(" + parts[4] + ")\n"; - } - - // floor_max_angle - if (parts.size() >= 6) { - line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[5] + ")\n"; - } - - // infiinite_interia - if (parts.size() >= 7) { - line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[6] + "`\n"; - } - - line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); - } - } - } - - // -- sort_custom( a , b ) -> sort_custom(Callable( a , b )) Object - if (line.find("sort_custom(") != -1) { - int start = line.find("sort_custom("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "sort_custom(Callable(" + parts[0] + "," + parts[1] + "))" + line.substr(end + start); - } - } - } - - // -- list_dir_begin( ) -> list_dir_begin() Object - if (line.find("list_dir_begin(") != -1) { - int start = line.find("list_dir_begin("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - line = line.substr(0, start) + "list_dir_begin() " + line.substr(end + start) + "# TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547"; - } - } - - // -- draw_line(1,2,3,4,5) -> draw_line(1,2,3,4) CanvasItem - if (line.find("draw_line(") != -1) { - int start = line.find("draw_line("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 5) { - line = line.substr(0, start) + "draw_line(" + parts[0] + "," + parts[1] + "," + parts[2] + "," + parts[3] + ")" + line.substr(end + start); - } - } - } - - // -- func c(var a, var b) -> func c(a, b) - if (line.find("func ") != -1 && line.find("var ") != -1) { - int start = line.find("func "); - start = line.substr(start).find("(") + start; - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - - String start_string = line.substr(0, start) + "("; - for (int i = 0; i < parts.size(); i++) { - start_string += parts[i].strip_edges().trim_prefix("var "); - if (i != parts.size() - 1) { - start_string += ", "; - } - } - line = start_string + ")" + line.substr(end + start); - } - } - - // -- yield(this, \"timeout\") -> await this.timeout GDScript - if (line.find("yield(") != -1) { - int start = line.find("yield("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "await " + parts[0] + "." + parts[1].replace("\"", "").replace("\'", "").replace(" ", "") + line.substr(end + start); - } - } - } - - // -- parse_json( AA ) -> TODO Object - if (line.find("parse_json(") != -1) { - int start = line.find("parse_json("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - line = line.substr(0, start) + "JSON.new().stringify(" + connect_arguments(parts, 0) + ")" + line.substr(end + start); - } - } - - // -- .xform(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform - if (line.find(".xform(") != -1) { - int start = line.find(".xform("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 1) { - line = line.substr(0, start) + " * " + parts[0] + line.substr(end + start); - } - } - } - - // -- .xform_inv(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform - if (line.find(".xform_inv(") != -1) { - int start = line.find(".xform_inv("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - String object_exec = get_object_of_execution(line.substr(0, start)); - if (line.find(object_exec + ".xform") != -1) { - int start2 = line.find(object_exec + ".xform"); - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 1) { - line = line.substr(0, start2) + parts[0] + " * " + object_exec + line.substr(end + start); - } - } - } - } - - // -- connect(,,,things) -> connect(,Callable(,),things) Object - if (line.find("connect(") != -1) { - int start = line.find("connect("); - // Protection from disconnect - if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "connect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - } - // -- disconnect(a,b,c) -> disconnect(a,Callable(b,c)) Object - if (line.find("disconnect(") != -1) { - int start = line.find("disconnect("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "disconnect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - // -- is_connected(a,b,c) -> is_connected(a,Callable(b,c)) Object - if (line.find("is_connected(") != -1) { - int start = line.find("is_connected("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "is_connected(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - // -- start(a,b,c) -> start(a,Callable(b,c)) Thread - if (line.find("start(") != -1) { - int start = line.find("start("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "start(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - // -- func _init(p_x:int)->void: -> func _init(p_x:int): Object # https://github.com/godotengine/godot/issues/50589 - if (line.find(" _init(") != -1) { - int start = line.find(" _init("); - int end = line.rfind(":") + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - line = line.substr(0, start) + " _init(" + connect_arguments(parts, 0) + "):" + line.substr(end + start); - } - } - // assert(speed < 20, str(randi()%10)) -> assert(speed < 20) #,str(randi()%10)) GDScript - GDScript bug constant message - if (line.find("assert(") != -1) { - int start = line.find("assert("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "assert(" + parts[0] + ") " + line.substr(end + start) + "#," + parts[1] + ")"; - } - } - } - // create_from_image(aa, bb) -> create_from_image(aa) #, bb ImageTexture - if (line.find("create_from_image(") != -1) { - int start = line.find("create_from_image("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "create_from_image(" + parts[0] + ") " + "#," + parts[1] + line.substr(end + start); - } - } - } - // set_cell_item(a, b, c, d ,e) -> set_cell_item(Vector3(a, b, c), d ,e) - if (line.find("set_cell_item(") != -1) { - int start = line.find("set_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() > 2) { - line = line.substr(0, start) + "set_cell_item( Vector3(" + parts[0] + "," + parts[1] + "," + parts[2] + ") " + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - // get_cell_item(a, b, c) -> get_cell_item(Vector3i(a, b, c)) - if (line.find("get_cell_item(") != -1) { - int start = line.find("get_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "get_cell_item(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - // get_cell_item_orientation(a, b, c) -> get_cell_item_orientation(Vector3i(a, b, c)) - if (line.find("get_cell_item_orientation(") != -1) { - int start = line.find("get_cell_item_orientation("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "get_cell_item_orientation(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - // apply_impulse(A, B) -> apply_impulse(B, A) - if (line.find("apply_impulse(") != -1) { - int start = line.find("apply_impulse("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "apply_impulse(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); - } - } - } - // apply_force(A, B) -> apply_force(B, A) - if (line.find("apply_force(") != -1) { - int start = line.find("apply_force("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "apply_force(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); - } - } - } - // map_to_world(a, b, c) -> map_to_world(Vector3i(a, b, c)) - if (line.find("map_to_world(") != -1) { - int start = line.find("map_to_world("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "map_to_world(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } + process_gdscript_line(line, reg_container, builtin); } // Collect vector to string @@ -3064,478 +2688,484 @@ void ProjectConverter3To4::rename_gdscript_functions(String &file_content) { } }; -// This is almost 1:1 copy of function which rename gdscript functions -Vector<String> ProjectConverter3To4::check_for_rename_gdscript_functions(Vector<String> &file_content) { +Vector<String> ProjectConverter3To4::check_for_rename_gdscript_functions(Vector<String> &file_content, const RegExContainer ®_container, bool builtin) { int current_line = 1; Vector<String> found_things; - RegEx reg_is_empty = RegEx("\\bempty\\("); - RegEx reg_super = RegEx("([\t ])\\.([a-zA-Z_])"); - RegEx reg_json_to = RegEx("\\bto_json\\b"); - RegEx reg_json_parse = RegEx("([\t]{0,})([^\n]+)parse_json\\(([^\n]+)"); - RegEx reg_json_non_new = RegEx("([\t]{0,})([^\n]+)JSON\\.parse\\(([^\n]+)"); - RegEx reg_export = RegEx("export\\(([a-zA-Z0-9_]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)"); - RegEx reg_export_advanced = RegEx("export\\(([^)^\n]+)\\)[ ]+var[ ]+([a-zA-Z0-9_]+)([^\n]+)"); - RegEx reg_setget_setget = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*,[ \t]*([a-zA-Z0-9_]+)"); - RegEx reg_setget_set = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+([a-zA-Z0-9_]+)[ \t]*[,]*[^a-z^A-Z^0-9^_]*$"); - RegEx reg_setget_get = RegEx("var[ ]+([a-zA-Z0-9_]+)([^\n]+)setget[ \t]+,[ \t]*([a-zA-Z0-9_]+)[ \t]*$"); - RegEx reg_join = RegEx("([\\(\\)a-zA-Z0-9_]+)\\.join\\(([^\n^\\)]+)\\)"); - RegEx reg_mixed_tab_space = RegEx("([\t]+)([ ]+)"); - RegEx reg_image_lock = RegEx("([a-zA-Z0-9_\\.]+)\\.lock\\(\\)"); - RegEx reg_image_unlock = RegEx("([a-zA-Z0-9_\\.]+)\\.unlock\\(\\)"); - RegEx reg_os_fullscreen = RegEx("OS.window_fullscreen[= ]+([^#^\n]+)"); - - CRASH_COND(!reg_is_empty.is_valid()); - CRASH_COND(!reg_super.is_valid()); - CRASH_COND(!reg_json_to.is_valid()); - CRASH_COND(!reg_json_parse.is_valid()); - CRASH_COND(!reg_json_non_new.is_valid()); - CRASH_COND(!reg_export.is_valid()); - CRASH_COND(!reg_export_advanced.is_valid()); - CRASH_COND(!reg_setget_setget.is_valid()); - CRASH_COND(!reg_setget_set.is_valid()); - CRASH_COND(!reg_setget_get.is_valid()); - CRASH_COND(!reg_join.is_valid()); - CRASH_COND(!reg_mixed_tab_space.is_valid()); - CRASH_COND(!reg_image_lock.is_valid()); - CRASH_COND(!reg_image_unlock.is_valid()); - CRASH_COND(!reg_os_fullscreen.is_valid()); - for (String &line : file_content) { String old_line = line; - - if (line.find("mtx") == -1 && line.find("mutex") == -1 && line.find("Mutex") == -1) { - line = reg_image_lock.sub(line, "false # $1.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); - line = reg_image_unlock.sub(line, "false # $1.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); + process_gdscript_line(line, reg_container, builtin); + if (old_line != line) { + found_things.append(simple_line_formatter(current_line, old_line, line)); } + } - // Mixed use of spaces and tabs - tabs as first - TODO, this probably is problem problem, but not sure - line = reg_mixed_tab_space.sub(line, "$1", true); + return found_things; +} +void ProjectConverter3To4::process_gdscript_line(String &line, const RegExContainer ®_container, bool builtin) { + if (line.find("mtx") == -1 && line.find("mutex") == -1 && line.find("Mutex") == -1) { + line = reg_container.reg_image_lock.sub(line, "false # $1.lock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); + line = reg_container.reg_image_unlock.sub(line, "false # $1.unlock() # TODOConverter40, image no longer require locking, `false` helps to not broke one line if/else, so can be freely removed", true); + } - // PackedStringArray(req_godot).join('.') -> '.'.join(PackedStringArray(req_godot)) PoolStringArray - line = reg_join.sub(line, "$2.join($1)", true); + // Mixed use of spaces and tabs - tabs as first - TODO, this probably is problem problem, but not sure + line = reg_container.reg_mixed_tab_space.sub(line, "$1", true); - // -- empty() -> is_empty() Pool*Array - line = reg_is_empty.sub(line, "is_empty(", true); + // PackedStringArray(req_godot).join('.') -> '.'.join(PackedStringArray(req_godot)) PoolStringArray + line = reg_container.reg_join.sub(line, "$2.join($1)", true); - // -- \t.func() -> \tsuper.func() Object - line = reg_super.sub(line, "$1super.$2", true); // TODO, not sure if possible, but for now this brake String text e.g. "Choosen .gitignore" -> "Choosen super.gitignore" + // -- empty() -> is_empty() Pool*Array + line = reg_container.reg_is_empty.sub(line, "is_empty(", true); - // -- JSON.parse(a) -> JSON.new().parse(a) etc. JSON - line = reg_json_non_new.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); + // -- \t.func() -> \tsuper.func() Object + line = reg_container.reg_super.sub(line, "$1super.$2", true); // TODO, not sure if possible, but for now this brake String text e.g. "Choosen .gitignore" -> "Choosen super.gitignore" - // -- to_json(a) -> JSON.new().stringify(a) Object - line = reg_json_to.sub(line, "JSON.new().stringify", true); + // -- JSON.parse(a) -> JSON.new().parse(a) etc. JSON + line = reg_container.reg_json_non_new.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); - // -- parse_json(a) -> JSON.get_data() etc. Object - line = reg_json_parse.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); + // -- to_json(a) -> JSON.new().stringify(a) Object + line = reg_container.reg_json_to.sub(line, "JSON.new().stringify", true); - // -- get_node(@ -> get_node( Node - line = line.replace("get_node(@", "get_node("); + // -- parse_json(a) -> JSON.get_data() etc. Object + line = reg_container.reg_json_parse.sub(line, "$1var test_json_conv = JSON.new()\n$1test_json_conv.parse($3\n$1$2test_json_conv.get_data()", true); - // export(float) var lifetime = 3.0 -> export var lifetime: float = 3.0 GDScript - line = reg_export.sub(line, "export var $2: $1"); + // -- get_node(@ -> get_node( Node + line = line.replace("get_node(@", "get_node("); - // export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro' -> export var _font_name = 'AnonymousPro' #(String, 'AnonymousPro', 'CourierPrime') GDScript - line = reg_export_advanced.sub(line, "export var $2$3 # ($1)"); + // export(float) var lifetime = 3.0 -> export var lifetime: float = 3.0 GDScript + line = reg_container.reg_export.sub(line, "export var $2: $1"); - // Setget Setget - line = reg_setget_setget.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $4\n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); + // export(String, 'AnonymousPro', 'CourierPrime') var _font_name = 'AnonymousPro' -> export var _font_name = 'AnonymousPro' #(String, 'AnonymousPro', 'CourierPrime') GDScript + line = reg_container.reg_export_advanced.sub(line, "export var $2$3 # ($1)"); - // Setget set - line = reg_setget_set.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Non existent get function \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); + // Setget Setget + line = reg_container.reg_setget_setget.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $4\n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); - // Setget get - line = reg_setget_get.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $3 \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Non existent set function", true); + // Setget set + line = reg_container.reg_setget_set.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Non existent get function \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Copy here content of $3", true); - // OS.window_fullscreen = true -> ProjectSettings.set("display/window/size/fullscreen",true) - line = reg_os_fullscreen.sub(line, "ProjectSettings.set(\"display/window/size/fullscreen\", $1)", true); + // Setget get + line = reg_container.reg_setget_get.sub(line, "var $1$2:\n\tget:\n\t\treturn $1 # TODOConverter40 Copy here content of $3 \n\tset(mod_value):\n\t\tmod_value # TODOConverter40 Non existent set function", true); - // -- r.move_and_slide( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody - if (line.find("move_and_slide(") != -1) { - int start = line.find("move_and_slide("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - String base_obj = get_object_of_execution(line.substr(0, start)); - String starting_space = get_starting_space(line); + // OS.window_fullscreen = true -> ProjectSettings.set("display/window/size/fullscreen",true) + if (builtin) { + line = reg_container.reg_os_fullscreen.sub(line, "ProjectSettings.set(\\\"display/window/size/fullscreen\\\", $1)", true); + } else { + line = reg_container.reg_os_fullscreen.sub(line, "ProjectSettings.set(\"display/window/size/fullscreen\", $1)", true); + } - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 1) { - String line_new; + // -- r.move_and_slide( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody + if (line.find("move_and_slide(") != -1) { + int start = line.find("move_and_slide("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + String base_obj = get_object_of_execution(line.substr(0, start)); + String starting_space = get_starting_space(line); - // motion_velocity - line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() >= 1) { + String line_new; - // up_direction - if (parts.size() >= 2) { - line_new += starting_space + base_obj + "set_up_direction(" + parts[1] + ")\n"; - } + // motion_velocity + line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; - // stop_on_slope - if (parts.size() >= 3) { - line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[2] + ")\n"; - } + // up_direction + if (parts.size() >= 2) { + line_new += starting_space + base_obj + "set_up_direction(" + parts[1] + ")\n"; + } - // max_slides - if (parts.size() >= 4) { - line_new += starting_space + base_obj + "set_max_slides(" + parts[3] + ")\n"; - } + // stop_on_slope + if (parts.size() >= 3) { + line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[2] + ")\n"; + } - // floor_max_angle - if (parts.size() >= 5) { - line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[4] + ")\n"; - } + // max_slides + if (parts.size() >= 4) { + line_new += starting_space + base_obj + "set_max_slides(" + parts[3] + ")\n"; + } - // infiinite_interia - if (parts.size() >= 6) { - line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[5] + "`\n"; - } + // floor_max_angle + if (parts.size() >= 5) { + line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[4] + ")\n"; + } - line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); + // infiinite_interia + if (parts.size() >= 6) { + line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[5] + "`\n"; } + + line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); } } + } - // -- r.move_and_slide_with_snap( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody - if (line.find("move_and_slide_with_snap(") != -1) { - int start = line.find("move_and_slide_with_snap("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - String base_obj = get_object_of_execution(line.substr(0, start)); - String starting_space = get_starting_space(line); - - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 1) { - String line_new; + // -- r.move_and_slide_with_snap( a, b, c, d, e ) -> r.set_motion_velocity(a) ... r.move_and_slide() KinematicBody + if (line.find("move_and_slide_with_snap(") != -1) { + int start = line.find("move_and_slide_with_snap("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + String base_obj = get_object_of_execution(line.substr(0, start)); + String starting_space = get_starting_space(line); - // motion_velocity - line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() >= 1) { + String line_new; - // snap - if (parts.size() >= 2) { - line_new += starting_space + "# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `" + parts[1] + "`\n"; - } + // motion_velocity + line_new += starting_space + base_obj + "set_motion_velocity(" + parts[0] + ")\n"; - // up_direction - if (parts.size() >= 3) { - line_new += starting_space + base_obj + "set_up_direction(" + parts[2] + ")\n"; - } + // snap + if (parts.size() >= 2) { + line_new += starting_space + "# TODOConverter40 looks that snap in Godot 4.0 is float, not vector like in Godot 3 - previous value `" + parts[1] + "`\n"; + } - // stop_on_slope - if (parts.size() >= 4) { - line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[3] + ")\n"; - } + // up_direction + if (parts.size() >= 3) { + line_new += starting_space + base_obj + "set_up_direction(" + parts[2] + ")\n"; + } - // max_slides - if (parts.size() >= 5) { - line_new += starting_space + base_obj + "set_max_slides(" + parts[4] + ")\n"; - } + // stop_on_slope + if (parts.size() >= 4) { + line_new += starting_space + base_obj + "set_floor_stop_on_slope_enabled(" + parts[3] + ")\n"; + } - // floor_max_angle - if (parts.size() >= 6) { - line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[5] + ")\n"; - } + // max_slides + if (parts.size() >= 5) { + line_new += starting_space + base_obj + "set_max_slides(" + parts[4] + ")\n"; + } - // infiinite_interia - if (parts.size() >= 7) { - line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[6] + "`\n"; - } + // floor_max_angle + if (parts.size() >= 6) { + line_new += starting_space + base_obj + "set_floor_max_angle(" + parts[5] + ")\n"; + } - line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); + // infiinite_interia + if (parts.size() >= 7) { + line_new += starting_space + "# TODOConverter40 infinite_inertia were removed in Godot 4.0 - previous value `" + parts[6] + "`\n"; } + + line = line_new + line.substr(0, start) + "move_and_slide()" + line.substr(end + start); } } + } - // -- sort_custom( a , b ) -> sort_custom(Callable( a , b )) Object - if (line.find("sort_custom(") != -1) { - int start = line.find("sort_custom("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "sort_custom(Callable(" + parts[0] + "," + parts[1] + "))" + line.substr(end + start); - } + // -- sort_custom( a , b ) -> sort_custom(Callable( a , b )) Object + if (line.find("sort_custom(") != -1) { + int start = line.find("sort_custom("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "sort_custom(Callable(" + parts[0] + "," + parts[1] + "))" + line.substr(end + start); } } + } - // -- draw_line(1,2,3,4,5) -> draw_line(1,2,3,4) CanvasItem - if (line.find("draw_line(") != -1) { - int start = line.find("draw_line("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 5) { - line = line.substr(0, start) + "draw_line(" + parts[0] + "," + parts[1] + "," + parts[2] + "," + parts[3] + ")" + line.substr(end + start); - } - } + // -- list_dir_begin( ) -> list_dir_begin() Object + if (line.find("list_dir_begin(") != -1) { + int start = line.find("list_dir_begin("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + line = line.substr(0, start) + "list_dir_begin() " + line.substr(end + start) + "# TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547"; } + } - // -- func c(var a, var b) -> func c(a, b) - if (line.find("func ") != -1 && line.find("var ") != -1) { - int start = line.find("func "); - start = line.substr(start).find("(") + start; - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); + // -- draw_line(1,2,3,4,5) -> draw_line(1,2,3,4) CanvasItem + if (line.find("draw_line(") != -1) { + int start = line.find("draw_line("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 5) { + line = line.substr(0, start) + "draw_line(" + parts[0] + "," + parts[1] + "," + parts[2] + "," + parts[3] + ")" + line.substr(end + start); + } + } + } - String start_string = line.substr(0, start) + "("; - for (int i = 0; i < parts.size(); i++) { - start_string += parts[i].strip_edges().trim_prefix("var "); - if (i != parts.size() - 1) { - start_string += ", "; - } + // -- func c(var a, var b) -> func c(a, b) + if (line.find("func ") != -1 && line.find("var ") != -1) { + int start = line.find("func "); + start = line.substr(start).find("(") + start; + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + + String start_string = line.substr(0, start) + "("; + for (int i = 0; i < parts.size(); i++) { + start_string += parts[i].strip_edges().trim_prefix("var "); + if (i != parts.size() - 1) { + start_string += ", "; } - line = start_string + ")" + line.substr(end + start); } + line = start_string + ")" + line.substr(end + start); } + } - // -- yield(this, \"timeout\") -> await this.timeout GDScript - if (line.find("yield(") != -1) { - int start = line.find("yield("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { + // -- yield(this, \"timeout\") -> await this.timeout GDScript + if (line.find("yield(") != -1) { + int start = line.find("yield("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + if (builtin) { + line = line.substr(0, start) + "await " + parts[0] + "." + parts[1].replace(" ", "") + line.substr(end + start); + } else { line = line.substr(0, start) + "await " + parts[0] + "." + parts[1].replace("\"", "").replace("\'", "").replace(" ", "") + line.substr(end + start); } } } + } - // -- parse_json( AA ) -> TODO Object - if (line.find("parse_json(") != -1) { - int start = line.find("parse_json("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - line = line.substr(0, start) + "JSON.new().stringify(" + connect_arguments(parts, 0) + ")" + line.substr(end + start); - } + // -- parse_json( AA ) -> TODO Object + if (line.find("parse_json(") != -1) { + int start = line.find("parse_json("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + line = line.substr(0, start) + "JSON.new().stringify(" + connect_arguments(parts, 0) + ")" + line.substr(end + start); } + } - // -- .xform(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform - if (line.find(".xform(") != -1) { - int start = line.find(".xform("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 1) { - line = line.substr(0, start) + " * " + parts[0] + line.substr(end + start); - } + // -- .xform(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform + if (line.find(".xform(") != -1) { + int start = line.find(".xform("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 1) { + line = line.substr(0, start) + " * " + parts[0] + line.substr(end + start); } } + } - // -- .xform_inv(Vector3(a,b,c)) -> / Vector3(a,b,c) Transform - if (line.find(".xform_inv(") != -1) { - int start = line.find(".xform_inv("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { + // -- .xform_inv(Vector3(a,b,c)) -> * Vector3(a,b,c) Transform + if (line.find(".xform_inv(") != -1) { + int start = line.find(".xform_inv("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + String object_exec = get_object_of_execution(line.substr(0, start)); + if (line.find(object_exec + ".xform") != -1) { + int start2 = line.find(object_exec + ".xform"); Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 1) { - line = line.substr(0, start) + " / " + parts[0] + line.substr(end + start); + line = line.substr(0, start2) + parts[0] + " * " + object_exec + line.substr(end + start); } } } + } - // -- connect(,,,things) -> connect(,Callable(,),things) Object - if (line.find("connect(") != -1) { - int start = line.find("connect("); - // Protection from disconnect - if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "connect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - } - // -- disconnect(a,b,c) -> disconnect(a,Callable(b,c)) Object - if (line.find("disconnect(") != -1) { - int start = line.find("disconnect("); + // -- "(connect(A,B,C,D,E) != OK):", "(connect(A,Callable(B,C).bind(D),E) Object + if (line.find("connect(") != -1) { + int start = line.find("connect("); + // Protection from disconnect + if (start == 0 || line.get(start - 1) != 's') { int end = get_end_parenthess(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); if (parts.size() == 3) { - line = line.substr(0, start) + "disconnect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + line = line.substr(0, start) + "connect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + } else if (parts.size() >= 4) { + line = line.substr(0, start) + "connect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + ").bind(" + parts[3].lstrip("[").rstrip("]") + ")" + connect_arguments(parts, 4) + ")" + line.substr(end + start); } } } - // -- is_connected(a,b,c) -> is_connected(a,Callable(b,c)) Object - if (line.find("is_connected(") != -1) { - int start = line.find("is_connected("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "is_connected(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } + } + // -- disconnect(a,b,c) -> disconnect(a,Callable(b,c)) Object + if (line.find("disconnect(") != -1) { + int start = line.find("disconnect("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "disconnect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } - // -- start(a,b,c) -> start(a,Callable(b,c)) Thread - if (line.find("start(") != -1) { - int start = line.find("start("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "start(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } + } + // -- is_connected(a,b,c) -> is_connected(a,Callable(b,c)) Object + if (line.find("is_connected(") != -1) { + int start = line.find("is_connected("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "is_connected(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } - // -- func _init(p_x:int)->void: -> func _init(p_x:int): Object # https://github.com/godotengine/godot/issues/50589 - if (line.find(" _init(") != -1) { - int start = line.find(" _init("); - int end = line.rfind(":") + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - line = line.substr(0, start) + " _init(" + connect_arguments(parts, 0) + "):" + line.substr(end + start); + } + // -- start(a,b) -> start(Callable(a,b)) Thread + // -- start(a,b,c,d) -> start(Callable(a,b).bind(c),d) Thread + if (line.find("start(") != -1) { + int start = line.find("start("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "start(Callable(" + parts[0] + "," + parts[1] + "))" + line.substr(end + start); + } else if (parts.size() >= 3) { + line = line.substr(0, start) + "start(Callable(" + parts[0] + "," + parts[1] + ").bind(" + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); } } - // assert(speed < 20, str(randi()%10)) -> assert(speed < 20) #,str(randi()%10)) GDScript - GDScript bug constant message - if (line.find("assert(") != -1) { - int start = line.find("assert("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "assert(" + parts[0] + ") " + line.substr(end + start) + "#," + parts[1] + ")"; - } + } + // -- func _init(p_x:int)->void: -> func _init(p_x:int): Object # https://github.com/godotengine/godot/issues/50589 + if (line.find(" _init(") != -1) { + int start = line.find(" _init("); + int end = line.rfind(":") + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + line = line.substr(0, start) + " _init(" + connect_arguments(parts, 0) + "):" + line.substr(end + start); + } + } + // assert(speed < 20, str(randi()%10)) -> assert(speed < 20) #,str(randi()%10)) GDScript - GDScript bug constant message + if (line.find("assert(") != -1) { + int start = line.find("assert("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "assert(" + parts[0] + ") " + line.substr(end + start) + "#," + parts[1] + ")"; } } - // create_from_image(aa, bb) -> create_from_image(aa) #, bb ImageTexture - if (line.find("create_from_image(") != -1) { - int start = line.find("create_from_image("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "create_from_image(" + parts[0] + ") " + "#," + parts[1] + line.substr(end + start); - } + } + // create_from_image(aa, bb) -> create_from_image(aa) #, bb ImageTexture + if (line.find("create_from_image(") != -1) { + int start = line.find("create_from_image("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "create_from_image(" + parts[0] + ") " + "#," + parts[1] + line.substr(end + start); } } - // set_cell_item(a, b, c, d ,e) -> set_cell_item(Vector3(a, b, c), d ,e) - if (line.find("set_cell_item(") != -1) { - int start = line.find("set_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() > 2) { - line = line.substr(0, start) + "set_cell_item( Vector3(" + parts[0] + "," + parts[1] + "," + parts[2] + ") " + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } + } + // set_cell_item(a, b, c, d ,e) -> set_cell_item(Vector3(a, b, c), d ,e) + if (line.find("set_cell_item(") != -1) { + int start = line.find("set_cell_item("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() > 2) { + line = line.substr(0, start) + "set_cell_item( Vector3(" + parts[0] + "," + parts[1] + "," + parts[2] + ") " + connect_arguments(parts, 3) + ")" + line.substr(end + start); } } - // get_cell_item(a, b, c) -> get_cell_item(Vector3i(a, b, c)) - if (line.find("get_cell_item(") != -1) { - int start = line.find("get_cell_item("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "get_cell_item(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } + } + // get_cell_item(a, b, c) -> get_cell_item(Vector3i(a, b, c)) + if (line.find("get_cell_item(") != -1) { + int start = line.find("get_cell_item("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "get_cell_item(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } - // get_cell_item_orientation(a, b, c) -> get_cell_item_orientation(Vector3i(a, b, c)) - if (line.find("get_cell_item_orientation(") != -1) { - int start = line.find("get_cell_item_orientation("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "get_cell_item_orientation(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } + } + // get_cell_item_orientation(a, b, c) -> get_cell_item_orientation(Vector3i(a, b, c)) + if (line.find("get_cell_item_orientation(") != -1) { + int start = line.find("get_cell_item_orientation("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "get_cell_item_orientation(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } - - // apply_impulse(A, B) -> apply_impulse(B, A) - if (line.find("apply_impulse(") != -1) { - int start = line.find("apply_impulse("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "apply_impulse(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); - } + } + // apply_impulse(A, B) -> apply_impulse(B, A) + if (line.find("apply_impulse(") != -1) { + int start = line.find("apply_impulse("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_impulse(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); } } - // apply_force(A, B) -> apply_force(B, A) - if (line.find("apply_force(") != -1) { - int start = line.find("apply_force("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 2) { - line = line.substr(0, start) + "apply_force(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); - } + } + // apply_force(A, B) -> apply_force(B, A) + if (line.find("apply_force(") != -1) { + int start = line.find("apply_force("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 2) { + line = line.substr(0, start) + "apply_force(" + parts[1] + ", " + parts[0] + ")" + line.substr(end + start); } } - // map_to_world(a, b, c) -> map_to_world(Vector3i(a, b, c)) - if (line.find("map_to_world(") != -1) { - int start = line.find("get_cell_item_orientation("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "map_to_world(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } + } + // map_to_world(a, b, c) -> map_to_world(Vector3i(a, b, c)) + if (line.find("map_to_world(") != -1) { + int start = line.find("map_to_world("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "map_to_world(Vector3i(" + parts[0] + "," + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } - - if (old_line != line) { - found_things.append(simple_line_formatter(current_line, old_line, line)); + } + // OS.get_window_safe_area() -> DisplayServer.get_display_safe_area() + if (line.find("OS.get_window_safe_area(") != -1) { + int start = line.find("OS.get_window_safe_area("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 0) { + line = line.substr(0, start) + "DisplayServer.get_display_safe_area()" + line.substr(end + start); + } } } - - return found_things; } -void ProjectConverter3To4::rename_csharp_functions(String &file_content) { - // Custom renaming, each rule needs to be set manually - // Don't forget to put validate each rule in validate_conversion function - Vector<String> lines = file_content.split("\n"); +void ProjectConverter3To4::process_csharp_line(String &line) { + // TODO maybe this can be changed to normal rule + line = line.replace("OS.GetWindowSafeArea()", "DisplayServer.ScreenGetUsableRect()"); - for (String &line : lines) { - // TODO maybe this can be changed to normal rule - line = line.replace("OS.GetWindowSafeArea()", "DisplayServer.ScreenGetUsableRect()"); - - // -- Connect(,,,things) -> Connect(,Callable(,),things) Object - if (line.find("Connect(") != -1) { - int start = line.find("Connect("); - // Protection from disconnect - if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "Connect(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - } - // -- Disconnect(a,b,c) -> Disconnect(a,Callable(b,c)) Object - if (line.find("Disconnect(") != -1) { - int start = line.find("Disconnect("); + // -- Connect(,,,things) -> Connect(,Callable(,),things) Object + if (line.find("Connect(") != -1) { + int start = line.find("Connect("); + // Protection from disconnect + if (start == 0 || line.get(start - 1) != 's') { int end = get_end_parenthess(line.substr(start)) + 1; if (end > -1) { Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "Disconnect(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + if (parts.size() >= 3) { + line = line.substr(0, start) + "Connect(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); } } } - // -- IsConnected(a,b,c) -> IsConnected(a,Callable(b,c)) Object - if (line.find("IsConnected(") != -1) { - int start = line.find("IsConnected("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "IsConnected(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } + } + // -- Disconnect(a,b,c) -> Disconnect(a,Callable(b,c)) Object + if (line.find("Disconnect(") != -1) { + int start = line.find("Disconnect("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "Disconnect(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); + } + } + } + // -- IsConnected(a,b,c) -> IsConnected(a,Callable(b,c)) Object + if (line.find("IsConnected(") != -1) { + int start = line.find("IsConnected("); + int end = get_end_parenthess(line.substr(start)) + 1; + if (end > -1) { + Vector<String> parts = parse_arguments(line.substr(start, end)); + if (parts.size() == 3) { + line = line.substr(0, start) + "IsConnected(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); } } } +} + +void ProjectConverter3To4::rename_csharp_functions(String &file_content) { + Vector<String> lines = file_content.split("\n"); + + for (String &line : lines) { + process_csharp_line(line); + } // Collect vector to string file_content = ""; @@ -3556,47 +3186,7 @@ Vector<String> ProjectConverter3To4::check_for_rename_csharp_functions(Vector<St for (String &line : file_content) { String old_line = line; - - // TODO maybe this can be changed to normal rule - line = line.replace("OS.GetWindowSafeArea()", "DisplayServer.ScreenGetUsableRect()"); - - // -- Connect(,,,things) -> connect(,Callable(,),things) Object - if (line.find("Connect(") != -1) { - int start = line.find("Connect("); - // Protection from disconnect - if (start == 0 || line.get(start - 1) != 's') { - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() >= 3) { - line = line.substr(0, start) + "Connect(" + parts[0] + ",new Callable(" + parts[1] + "," + parts[2] + ")" + connect_arguments(parts, 3) + ")" + line.substr(end + start); - } - } - } - } - // -- Disconnect(a,b,c) -> Disconnect(a,Callable(b,c)) Object - if (line.find("Disconnect(") != -1) { - int start = line.find("Disconnect("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "Disconnect(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - // -- IsConnected(a,b,c) -> IsConnected(a,Callable(b,c)) Object - if (line.find("IsConnected(") != -1) { - int start = line.find("IsConnected("); - int end = get_end_parenthess(line.substr(start)) + 1; - if (end > -1) { - Vector<String> parts = parse_arguments(line.substr(start, end)); - if (parts.size() == 3) { - line = line.substr(0, start) + "IsConnected(" + parts[0] + ",Callable(" + parts[1] + "," + parts[2] + "))" + line.substr(end + start); - } - } - } - + process_csharp_line(line); if (old_line != line) { found_things.append(simple_line_formatter(current_line, old_line, line)); } @@ -3605,88 +3195,81 @@ Vector<String> ProjectConverter3To4::check_for_rename_csharp_functions(Vector<St return found_things; } -void ProjectConverter3To4::rename_gdscript_keywords(String &file_content){ - { RegEx reg_tool = RegEx("([\n]+)tool"); -CRASH_COND(!reg_tool.is_valid()); -file_content = reg_tool.sub(file_content, "$1@tool", true); -RegEx reg_tool2 = RegEx("^tool"); -CRASH_COND(!reg_tool2.is_valid()); -file_content = reg_tool2.sub(file_content, "@tool", true); -} -{ - RegEx reg_export = RegEx("([\n\t]+)export\\b"); - CRASH_COND(!reg_export.is_valid()); - file_content = reg_export.sub(file_content, "$1@export", true); - RegEx reg_export2 = RegEx("^export"); - CRASH_COND(!reg_export2.is_valid()); - file_content = reg_export2.sub(file_content, "@export", true); -} -{ - RegEx reg_onready = RegEx("([\n]+)onready"); - CRASH_COND(!reg_onready.is_valid()); - file_content = reg_onready.sub(file_content, "$1@onready", true); - RegEx reg_onready2 = RegEx("^onready"); - CRASH_COND(!reg_onready2.is_valid()); - file_content = reg_onready2.sub(file_content, "@onready", true); -} -{ - RegEx reg_master = RegEx("([\n]+)master func"); - CRASH_COND(!reg_master.is_valid()); - file_content = reg_master.sub(file_content, "$1@rpc(any) func", true); - RegEx reg_master2 = RegEx("^master func"); - CRASH_COND(!reg_master2.is_valid()); - file_content = reg_master2.sub(file_content, "@rpc(any) func", true); -} -{ - RegEx reg_puppet = RegEx("([\n]+)puppet func"); - CRASH_COND(!reg_puppet.is_valid()); - file_content = reg_puppet.sub(file_content, "$1@rpc(auth) func", true); - RegEx reg_puppet2 = RegEx("^puppet func"); - CRASH_COND(!reg_puppet2.is_valid()); - file_content = reg_puppet2.sub(file_content, "@rpc(auth) func", true); -} -{ - RegEx reg_remote = RegEx("([\n]+)remote func"); - CRASH_COND(!reg_remote.is_valid()); - file_content = reg_remote.sub(file_content, "$1@rpc(any) func", true); - RegEx reg_remote2 = RegEx("^remote func"); - CRASH_COND(!reg_remote2.is_valid()); - file_content = reg_remote2.sub(file_content, "@rpc(any) func", true); -} -{ - RegEx reg_remotesync = RegEx("([\n]+)remotesync func"); - CRASH_COND(!reg_remotesync.is_valid()); - file_content = reg_remotesync.sub(file_content, "$1@rpc(any,sync) func", true); - RegEx reg_remotesync2 = RegEx("^remotesync func"); - CRASH_COND(!reg_remotesync2.is_valid()); - file_content = reg_remotesync2.sub(file_content, "@rpc(any,sync) func", true); -} -{ - RegEx reg_sync = RegEx("([\n]+)sync func"); - CRASH_COND(!reg_sync.is_valid()); - file_content = reg_sync.sub(file_content, "$1@rpc(any,sync) func", true); - RegEx reg_sync2 = RegEx("^sync func"); - CRASH_COND(!reg_sync2.is_valid()); - file_content = reg_sync2.sub(file_content, "@rpc(any,sync) func", true); -} -{ - RegEx reg_puppetsync = RegEx("([\n]+)puppetsync func"); - CRASH_COND(!reg_puppetsync.is_valid()); - file_content = reg_puppetsync.sub(file_content, "$1@rpc(auth,sync) func", true); - RegEx reg_puppetsync2 = RegEx("^puppetsync func"); - CRASH_COND(!reg_puppetsync2.is_valid()); - file_content = reg_puppetsync2.sub(file_content, "@rpc(auth,sync) func", true); -} -{ - RegEx reg_mastersync = RegEx("([\n]+)mastersync func"); - CRASH_COND(!reg_mastersync.is_valid()); - file_content = reg_mastersync.sub(file_content, "$1@rpc(any,sync) func", true); - RegEx reg_mastersync2 = RegEx("^mastersync func"); - CRASH_COND(!reg_mastersync2.is_valid()); - file_content = reg_mastersync2.sub(file_content, "@rpc(any,sync) func", true); -} +void ProjectConverter3To4::rename_gdscript_keywords(String &file_content) { + { + RegEx reg_first = RegEx("([\n]+)tool"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@tool", true); + RegEx reg_second = RegEx("^tool"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@tool", true); + } + { + RegEx reg_first = RegEx("([\n\t]+)export\\b"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@export", true); + RegEx reg_second = RegEx("^export"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@export", true); + } + { + RegEx reg_first = RegEx("([\n]+)onready"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@onready", true); + RegEx reg_second = RegEx("^onready"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@onready", true); + } + { + RegEx reg_first = RegEx("([\n]+)remote func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@rpc(any_peer) func", true); + RegEx reg_second = RegEx("^remote func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@rpc(any_peer) func", true); + } + { + RegEx reg_first = RegEx("([\n]+)remotesync func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@rpc(any_peer, call_local) func", true); + RegEx reg_second = RegEx("^remotesync func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@rpc(any_peer, call_local) func", true); + } + { + RegEx reg_first = RegEx("([\n]+)puppet func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@rpc func", true); + RegEx reg_second = RegEx("^puppet func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@rpc func", true); + } + { + RegEx reg_first = RegEx("([\n]+)puppetsync func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1@rpc(call_local) func", true); + RegEx reg_second = RegEx("^puppetsync func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, "@rpc(call_local) func", true); + } + String error_message = "The master and mastersync rpc behavior is not officially supported anymore. Try using another keyword or making custom logic using get_multiplayer().get_remote_sender_id()\n"; + { + RegEx reg_first = RegEx("([\n]+)master func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1" + error_message + "@rpc func", true); + RegEx reg_second = RegEx("^master func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, error_message + "@rpc func", true); + } + { + RegEx reg_first = RegEx("([\n]+)mastersync func"); + CRASH_COND(!reg_first.is_valid()); + file_content = reg_first.sub(file_content, "$1" + error_message + "@rpc(call_local) func", true); + RegEx reg_second = RegEx("^mastersync func"); + CRASH_COND(!reg_second.is_valid()); + file_content = reg_second.sub(file_content, error_message + "@rpc(call_local) func", true); + } } -; Vector<String> ProjectConverter3To4::check_for_rename_gdscript_keywords(Vector<String> &file_content) { Vector<String> found_things; @@ -3697,96 +3280,87 @@ Vector<String> ProjectConverter3To4::check_for_rename_gdscript_keywords(Vector<S String old; old = line; { - RegEx reg_tool2 = RegEx("^tool"); - CRASH_COND(!reg_tool2.is_valid()); - line = reg_tool2.sub(line, "@tool", true); + RegEx reg_first = RegEx("^tool"); + CRASH_COND(!reg_first.is_valid()); + line = reg_first.sub(line, "@tool", true); } if (old != line) { found_things.append(line_formatter(current_line, "tool", "@tool", line)); } old = line; { - RegEx reg_export = RegEx("([\t]+)export\\b"); - CRASH_COND(!reg_export.is_valid()); - line = reg_export.sub(line, "$1@export", true); - RegEx reg_export2 = RegEx("^export"); - CRASH_COND(!reg_export2.is_valid()); - line = reg_export2.sub(line, "@export", true); + RegEx reg_first = RegEx("([\t]+)export\\b"); + CRASH_COND(!reg_first.is_valid()); + line = reg_first.sub(line, "$1@export", true); + RegEx reg_second = RegEx("^export"); + CRASH_COND(!reg_second.is_valid()); + line = reg_second.sub(line, "@export", true); } if (old != line) { found_things.append(line_formatter(current_line, "export", "@export", line)); } old = line; { - RegEx reg_onready2 = RegEx("^onready"); - CRASH_COND(!reg_onready2.is_valid()); - line = reg_onready2.sub(line, "@onready", true); + RegEx reg_first = RegEx("^onready"); + CRASH_COND(!reg_first.is_valid()); + line = reg_first.sub(line, "@onready", true); } if (old != line) { found_things.append(line_formatter(current_line, "onready", "@onready", line)); } old = line; { - RegEx reg_master2 = RegEx("^master func"); - CRASH_COND(!reg_master2.is_valid()); - line = reg_master2.sub(line, "@rpc(any) func", true); - } - if (old != line) { - found_things.append(line_formatter(current_line, "master func", "@rpc(any) func", line)); - } - old = line; - { - RegEx reg_puppet2 = RegEx("^puppet func"); - CRASH_COND(!reg_puppet2.is_valid()); - line = reg_puppet2.sub(line, "@rpc(auth) func", true); + RegEx regex = RegEx("^remote func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc(any_peer) func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "puppet func", "@rpc(auth) func", line)); + found_things.append(line_formatter(current_line, "remote func", "@rpc(any_peer) func", line)); } old = line; { - RegEx reg_remote2 = RegEx("^remote func"); - CRASH_COND(!reg_remote2.is_valid()); - line = reg_remote2.sub(line, "@rpc(any) func", true); + RegEx regex = RegEx("^remotesync func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc(any_peer, call_local)) func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "remote func", "@rpc(any) func", line)); + found_things.append(line_formatter(current_line, "remotesync func", "@rpc(any_peer, call_local)) func", line)); } old = line; { - RegEx reg_remotesync2 = RegEx("^remotesync func"); - CRASH_COND(!reg_remotesync2.is_valid()); - line = reg_remotesync2.sub(line, "@rpc(any,sync) func", true); + RegEx regex = RegEx("^puppet func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "remotesync func", "@rpc(any,sync) func", line)); + found_things.append(line_formatter(current_line, "puppet func", "@rpc func", line)); } old = line; { - RegEx reg_sync2 = RegEx("^sync func"); - CRASH_COND(!reg_sync2.is_valid()); - line = reg_sync2.sub(line, "@rpc(any,sync) func", true); + RegEx regex = RegEx("^puppetsync func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc(call_local) func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "sync func", "@rpc(any,sync) func", line)); + found_things.append(line_formatter(current_line, "puppetsync func", "@rpc(call_local) func", line)); } old = line; { - RegEx reg_puppetsync2 = RegEx("^puppetsync func"); - CRASH_COND(!reg_puppetsync2.is_valid()); - line = reg_puppetsync2.sub(line, "@rpc(auth,sync) func", true); + RegEx regex = RegEx("^master func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "puppetsync func", "@rpc(any,sync) func", line)); + found_things.append(line_formatter(current_line, "master func", "@rpc func", line)); } old = line; { - RegEx reg_mastersync2 = RegEx("^mastersync func"); - CRASH_COND(!reg_mastersync2.is_valid()); - line = reg_mastersync2.sub(line, "@rpc(any,sync) func", true); + RegEx regex = RegEx("^mastersync func"); + CRASH_COND(!regex.is_valid()); + line = regex.sub(line, "@rpc(call_local) func", true); } if (old != line) { - found_things.append(line_formatter(current_line, "mastersync", "@rpc(any,sync) func", line)); + found_things.append(line_formatter(current_line, "mastersync func", "@rpc(call_local) func", line)); } old = line; diff --git a/editor/project_converter_3_to_4.h b/editor/project_converter_3_to_4.h index 95239666e0..a58bb2767a 100644 --- a/editor/project_converter_3_to_4.h +++ b/editor/project_converter_3_to_4.h @@ -37,17 +37,23 @@ #include "core/string/ustring.h" class ProjectConverter3To4 { +public: + class RegExContainer; + +private: void rename_enums(String &file_content); Vector<String> check_for_rename_enums(Vector<String> &file_content); void rename_classes(String &file_content); Vector<String> check_for_rename_classes(Vector<String> &file_content); - void rename_gdscript_functions(String &file_content); - Vector<String> check_for_rename_gdscript_functions(Vector<String> &file_content); + void rename_gdscript_functions(String &file_content, const RegExContainer ®_container, bool builtin); + Vector<String> check_for_rename_gdscript_functions(Vector<String> &file_content, const RegExContainer ®_container, bool builtin); + void process_gdscript_line(String &line, const RegExContainer ®_container, bool builtin); void rename_csharp_functions(String &file_content); Vector<String> check_for_rename_csharp_functions(Vector<String> &file_content); + void process_csharp_line(String &line); void rename_gdscript_keywords(String &file_content); Vector<String> check_for_rename_gdscript_keywords(Vector<String> &file_content); @@ -71,9 +77,10 @@ class ProjectConverter3To4 { bool test_single_array(const char *array[][2], bool ignore_second_check = false); bool test_conversion_single_additional(String name, String expected, void (ProjectConverter3To4::*func)(String &), String what); + bool test_conversion_single_additional_builtin(String name, String expected, void (ProjectConverter3To4::*func)(String &, const RegExContainer &, bool), String what, const RegExContainer ®_container, bool builtin); bool test_conversion_single_normal(String name, String expected, const char *array[][2], String what); bool test_array_names(); - bool test_conversion(); + bool test_conversion(const RegExContainer ®_container); public: int validate_conversion(); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index fba8c5c522..ca5eeaa787 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -39,6 +39,10 @@ ProjectSettingsEditor *ProjectSettingsEditor::singleton = nullptr; +void ProjectSettingsEditor::connect_filesystem_dock_signals(FileSystemDock *p_fs_dock) { + localization_editor->connect_filesystem_dock_signals(p_fs_dock); +} + void ProjectSettingsEditor::popup_project_settings() { // Restore valid window bounds or pop up at default size. Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2()); diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index 849c50b9ba..c2d2c2d8f4 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -43,6 +43,8 @@ #include "editor/shader_globals_editor.h" #include "scene/gui/tab_container.h" +class FileSystemDock; + class ProjectSettingsEditor : public AcceptDialog { GDCLASS(ProjectSettingsEditor, AcceptDialog); @@ -120,6 +122,7 @@ public: TabContainer *get_tabs() { return tab_container; } void queue_save(); + void connect_filesystem_dock_signals(FileSystemDock *p_fs_dock); ProjectSettingsEditor(EditorData *p_data); }; diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index a77687677b..282cfa80e8 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -268,7 +268,17 @@ void SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) { String warning = p_node->get_configuration_warnings_as_string(); if (!warning.is_empty()) { - item->add_button(0, get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons")), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + warning); + const int num_warnings = p_node->get_configuration_warnings().size(); + String warning_icon; + if (num_warnings == 1) { + warning_icon = SNAME("NodeWarning"); + } else if (num_warnings <= 3) { + warning_icon = vformat("NodeWarnings%d", num_warnings); + } else { + warning_icon = SNAME("NodeWarnings4Plus"); + } + + item->add_button(0, get_theme_icon(warning_icon, SNAME("EditorIcons")), BUTTON_WARNING, false, TTR("Node configuration warning:") + "\n" + warning); } if (p_node->is_unique_name_in_owner()) { diff --git a/editor/translations/af.po b/editor/translations/af.po index 55fe58e1b0..f2e389b6f5 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -2856,8 +2856,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Verwyder Seleksie" #: editor/editor_export.cpp #, fuzzy @@ -20423,15 +20424,15 @@ msgstr "Kon nie vouer skep nie." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Moet 'n geldige uitbreiding gebruik." #: platform/windows/export/export.cpp #, fuzzy @@ -20455,15 +20456,15 @@ msgstr "Ongeldige naam." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Moet 'n geldige uitbreiding gebruik." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/ar.po b/editor/translations/ar.po index 36e71f130e..cda76c44c8 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -2820,7 +2820,7 @@ msgstr "تصدير المشروع لمنصة:" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "نسخ مسار العÙقدة" #: editor/editor_export.cpp @@ -20570,15 +20570,15 @@ msgstr "لا يمكن العثور على Ù…ÙØªØ§Ø Ø§Ù„Ù…ØªØ¬Ø±ØŒ لا يمك٠#: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "صيغة غير صالØØ©." #: platform/windows/export/export.cpp #, fuzzy @@ -20602,15 +20602,15 @@ msgstr "اسم غير صالØ." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "صيغة غير صالØØ©." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/az.po b/editor/translations/az.po index 3a59e8aa41..af28a85240 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -5,49 +5,49 @@ # # Jafar Tarverdiyev <cefertarverdiyevv@gmail.com>, 2021. # Lucifer25x <umudyt2006@gmail.com>, 2021. +# Ãœmid Quliyev <lucifer25x@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2021-09-16 14:36+0000\n" -"Last-Translator: Lucifer25x <umudyt2006@gmail.com>\n" +"PO-Revision-Date: 2022-08-05 01:04+0000\n" +"Last-Translator: Ãœmid Quliyev <lucifer25x@protonmail.com>\n" "Language-Team: Azerbaijani <https://hosted.weblate.org/projects/godot-engine/" "godot/az/>\n" "Language: az\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.9-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp +#, fuzzy msgid "Tablet Driver" -msgstr "" +msgstr "PlanÅŸet sürücü" #: core/bind/core_bind.cpp -#, fuzzy msgid "Clipboard" -msgstr "Pano boÅŸdur!" +msgstr "Pano" #: core/bind/core_bind.cpp -#, fuzzy msgid "Current Screen" -msgstr "Animasiya xüsusiyyÉ™tlÉ™ri." +msgstr "Aktiv Ekran" #: core/bind/core_bind.cpp msgid "Exit Code" -msgstr "" +msgstr "Çıxış Kodu" #: core/bind/core_bind.cpp msgid "V-Sync Enabled" -msgstr "" +msgstr "V-Sync Aktivdir" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync Kompozitor VasitÉ™silÉ™" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "Delta hamarlanması" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -59,28 +59,28 @@ msgstr "" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" -msgstr "" +msgstr "Ekranı Açıq Tut" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "" +msgstr "Minimum PÉ™ncÉ™rÉ™ Ölçüsü" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "" +msgstr "Maksimum PÉ™ncÉ™rÉ™ Ölçüsü" #: core/bind/core_bind.cpp msgid "Screen Orientation" -msgstr "" +msgstr "PÉ™ncÉ™rÉ™ NisbÉ™ti" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp msgid "Window" -msgstr "" +msgstr "PÉ™ncÉ™rÉ™" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "" +msgstr "KÉ™narsız" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" @@ -88,29 +88,28 @@ msgstr "" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" -msgstr "" +msgstr "Bütün Ekran" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Böyüdülmüş" #: core/bind/core_bind.cpp msgid "Minimized" -msgstr "" +msgstr "KiçildilmiÅŸ" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "Ölçüsü DÉ™yiÅŸdirilÉ™ BilÉ™r" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/physics_body.cpp scene/3d/remote_transform.cpp #: scene/gui/control.cpp scene/gui/line_edit.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Position" -msgstr "Animasiyanı TÉ™mizlÉ™mÉ™" +msgstr "Pozisiya" #: core/bind/core_bind.cpp core/project_settings.cpp editor/editor_settings.cpp #: main/main.cpp modules/gridmap/grid_map.cpp @@ -122,7 +121,7 @@ msgstr "Animasiyanı TÉ™mizlÉ™mÉ™" #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp msgid "Size" -msgstr "" +msgstr "Ölçü" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -131,25 +130,23 @@ msgstr "" #: core/bind/core_bind.cpp #, fuzzy msgid "Editor Hint" -msgstr "RedaktÉ™ et" +msgstr "Editor Ä°pucu" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "XÉ™ta Mesajlarını Yazdır" #: core/bind/core_bind.cpp -#, fuzzy msgid "Iterations Per Second" -msgstr "Ä°nterpolasiya rejimi" +msgstr "HÉ™r SaniyÉ™dÉ™ Ä°terasiya Sayı" #: core/bind/core_bind.cpp msgid "Target FPS" -msgstr "" +msgstr "HÉ™dÉ™f FPS" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Animasya Açarlarını ÖlçülÉ™" +msgstr "Zaman Ölçəyi" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -157,25 +154,23 @@ msgstr "" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" -msgstr "" +msgstr "XÉ™ta" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "YüklÉ™mÉ™ xÉ™tası:" +msgstr "XÉ™ta Yazısı" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "YüklÉ™mÉ™ xÉ™tası:" +msgstr "XÉ™ta SÉ™tiri" #: core/bind/core_bind.cpp msgid "Result" -msgstr "" +msgstr "NÉ™ticÉ™" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "YaddaÅŸ" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -186,11 +181,11 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "LimitlÉ™r" #: core/command_queue_mt.cpp msgid "Command Queue" -msgstr "" +msgstr "Æmr NövbÉ™si" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -200,14 +195,13 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Function" -msgstr "Funksiyalar:" +msgstr "Funksiya" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "MÉ™lumat" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp @@ -215,16 +209,15 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp msgid "Network" -msgstr "" +msgstr "ŞəbÉ™kÉ™" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Sil" +msgstr "Uzaqdan FS" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "" +msgstr "SÉ™hifÉ™ Ölçüsü" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -232,12 +225,11 @@ msgstr "" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "Bloklama Modu Aktivdir" #: core/io/http_client.cpp -#, fuzzy msgid "Connection" -msgstr "QoÅŸ" +msgstr "ÆlaqÉ™" #: core/io/http_client.cpp msgid "Read Chunk Size" @@ -245,15 +237,15 @@ msgstr "" #: core/io/marshalls.cpp msgid "Object ID" -msgstr "" +msgstr "Obyekt ID" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp msgid "Allow Object Decoding" -msgstr "" +msgstr "Obyekt DeÅŸifrÉ™sinÉ™ Ä°zn Verin" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "Yeni ŞəbÉ™kÉ™ ÆlaqÉ™lÉ™rindÉ™n Ä°mtina Et" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Network Peer" @@ -261,16 +253,15 @@ msgstr "" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp msgid "Root Node" -msgstr "" +msgstr "Kök Düyün" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "QoÅŸ" +msgstr "Yeni ÆlaqÉ™lÉ™rdÉ™n Ä°mtina Et" #: core/io/networked_multiplayer_peer.cpp msgid "Transfer Mode" -msgstr "" +msgstr "Transfer Modu" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" @@ -294,16 +285,15 @@ msgstr "" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "MÉ™lumat Siyahısı" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "Æl Sıxmağın Qarşısının Alınması" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "ÆlaqÉ™ni redaktÉ™ edin:" +msgstr "GözlÉ™nilÉ™n Maksimum ÆlaqÉ™lÉ™r" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -325,7 +315,6 @@ msgstr "" "format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" msgstr "Ä°fadÉ™dÉ™ uyÄŸunsuz giriÅŸ %d (ötürülmÉ™di)" @@ -2810,8 +2799,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Animasiyanı TÉ™mizlÉ™mÉ™" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19641,14 +19631,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19670,14 +19659,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/bg.po b/editor/translations/bg.po index 877823c869..d2d7a56dc3 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -2814,8 +2814,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Копиране на избраното" #: editor/editor_export.cpp msgid "Completed successfully." @@ -20110,15 +20111,15 @@ msgstr "Ðе е намерено хранилище за ключове. ИзнР#: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Ðеправилно разширение." #: platform/windows/export/export.cpp #, fuzzy @@ -20142,15 +20143,15 @@ msgstr "Ðеправилно име." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Ðеправилно разширение." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/bn.po b/editor/translations/bn.po index 8379e2de5b..6f1e8f945d 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -2904,7 +2904,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "পথ পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿/কপি করà§à¦¨" #: editor/editor_export.cpp @@ -21539,15 +21539,15 @@ msgstr "ফোলà§à¦¡à¦¾à¦° তৈরী করা সমà§à¦à¦¬ হয়নঠ#: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨" #: platform/windows/export/export.cpp #, fuzzy @@ -21571,15 +21571,15 @@ msgstr "অগà§à¦°à¦¹à¦¨à¦¯à§‹à¦—à§à¦¯ নাম।" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "অগà§à¦°à¦¹à¦£à¦¯à§‹à¦—à§à¦¯ à¦à¦•à§à¦¸à¦Ÿà§‡à¦¨à¦¶à¦¨" #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/br.po b/editor/translations/br.po index f86b01cc44..823490a280 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -2732,8 +2732,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Tro Fiñvskeudenn" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19433,14 +19434,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19462,14 +19462,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/ca.po b/editor/translations/ca.po index b1ee6245f6..04c9b7761c 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -2790,7 +2790,8 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "Completat amb errors." #: editor/editor_export.cpp @@ -20973,15 +20974,15 @@ msgstr "No es pot obrir la plantilla per exportar." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "L'extensió no és và lida." #: platform/windows/export/export.cpp #, fuzzy @@ -21005,15 +21006,15 @@ msgstr "Nom no và lid." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "L'extensió no és và lida." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/cs.po b/editor/translations/cs.po index c27334b374..1e92a92ae7 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -2882,7 +2882,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "KopÃrovat cestu k uzlu" #: editor/editor_export.cpp @@ -20734,15 +20734,15 @@ msgstr "NepodaÅ™ilo se najÃt úložiÅ¡tÄ› klÃÄů, nelze exportovat." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Neplatná pÅ™Ãpona." #: platform/windows/export/export.cpp #, fuzzy @@ -20766,15 +20766,15 @@ msgstr "Neplatný název." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Neplatná pÅ™Ãpona." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/da.po b/editor/translations/da.po index 3dc6f52da1..1bb05be6f9 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -2895,8 +2895,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Fjern Markering" #: editor/editor_export.cpp #, fuzzy @@ -20911,15 +20912,15 @@ msgstr "Kan ikke Ã¥bne skabelon til eksport:\n" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Du skal bruge en gyldig udvidelse." #: platform/windows/export/export.cpp #, fuzzy @@ -20943,15 +20944,15 @@ msgstr "Ugyldigt navn." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Du skal bruge en gyldig udvidelse." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/de.po b/editor/translations/de.po index 5035a7aa5d..aa92914ada 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -82,13 +82,14 @@ # Christian Packenius <christian@packenius.com>, 2022. # Sajeg <jfx@posteo.de>, 2022. # Tobias Jacobs <tobi@jacobs.rocks>, 2022. +# JeremyStarTM <jeremystartm@tuta.io>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2022-07-31 18:34+0000\n" +"Last-Translator: JeremyStarTM <jeremystartm@tuta.io>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -1632,7 +1633,7 @@ msgstr "Methodenaufrufsspurschlüssel hinzufügen" #: editor/animation_track_editor.cpp msgid "Method not found in object:" -msgstr "Methode nicht in Objekt gefunden:" +msgstr "Methode im Objekt nicht gefunden:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2814,7 +2815,8 @@ msgid "Project export for platform:" msgstr "Projektexport für Plattform:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "Fertiggestellt mit Fehlern." #: editor/editor_export.cpp @@ -5569,7 +5571,7 @@ msgstr "Auswahl ziehen und fallen lassen" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Im Skript Editor bei ausgewähltem Node bleiben" #: editor/editor_settings.cpp msgid "Appearance" @@ -11697,9 +11699,8 @@ msgid "New Animation" msgstr "Neue Animation" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Methoden filtern" +msgstr "Animationen filtern" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -18151,7 +18152,7 @@ msgstr "Ungültiges Argument vom Typ:" #: modules/visual_script/visual_script_nodes.cpp msgid "Invalid arguments:" -msgstr "Ungültige Argumente:" +msgstr "Ungültige Parameter:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -19652,8 +19653,8 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" -"Codesign-Anwendung konnte nicht gestartet werden. Wurden die Xcode-" -"Kommandozeilen-Hilfsprogramme installiert?" +"Codesign-Anwendung konnte nicht gestartet werden, stelle sicher dass die " +"Xcode-Kommandozeilen-Tools installiert sind." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." @@ -20145,17 +20146,18 @@ msgid "Could not find wine executable at \"%s\"." msgstr "Anwendung wine konnte nicht gefunden werden in „%s“." #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "Anwendung rcedit konnte nicht gestartet werden. Bitte rcedit-Pfad in " "Editoreinstellungen festlegen (Export > Windows > Rcedit)." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +#, fuzzy +msgid "rcedit failed to modify executable: %s." msgstr "" "Modifikation der Anwendung durch rcedit fehlgeschlagen:\n" "%s" @@ -20177,17 +20179,18 @@ msgid "Invalid timestamp server." msgstr "Ungültiger Zeitstempelserver." #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "Anwendung signtool konnte nicht gestartet werden. Bitte signtool-Pfad in " "Editoreinstellungen festlegen (Export > Windows > Signtool)." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +#, fuzzy +msgid "Signtool failed to sign executable: %s." msgstr "" "Signieren der Anwendung durch Signtool ist fehlgeschlagen:\n" "%s" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index c207124fcb..23c58c5ffb 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -2684,7 +2684,7 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "" #: editor/editor_export.cpp @@ -19258,14 +19258,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19286,14 +19285,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/el.po b/editor/translations/el.po index 85005d903a..4b71ed8528 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -2841,7 +2841,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "ΑντιγÏαφή διαδÏομής κόμβου" #: editor/editor_export.cpp @@ -20907,15 +20907,15 @@ msgstr "Σφάλμα κατά το άνοιγμα Ï€ÏοτÏπου για εξα #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "ΆκυÏη επÎκταση." #: platform/windows/export/export.cpp #, fuzzy @@ -20939,15 +20939,15 @@ msgstr "Μη ÎγκυÏο όνομα." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "ΆκυÏη επÎκταση." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 45d0549a81..361c10ce1a 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -2707,8 +2707,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "ð‘“ð‘³ð‘™ð‘’ð‘–ð‘©ð‘¯ð‘Ÿ:" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19353,14 +19354,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19382,14 +19382,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 5a251ba489..0139382972 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -2852,8 +2852,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Kopii elektaron" #: editor/editor_export.cpp #, fuzzy @@ -20555,15 +20556,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Nevalida kromprogramo." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20585,15 +20586,15 @@ msgstr "Malvalida nomo." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Nevalida kromprogramo." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/es.po b/editor/translations/es.po index 872fedfdac..173b195cc4 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -81,12 +81,16 @@ # David MartÃnez <goddrinksjava@gmail.com>, 2022. # Nagamine-j <jimmy.kochi@unmsm.edu.pe>, 2022. # Esdras Caleb Oliveira Silva <acheicaleb@gmail.com>, 2022. +# Luis Ortiz <luisortiz66@hotmail.com>, 2022. +# Angel Andrade <aandradeb99@gmail.com>, 2022. +# Juan Felipe Gómez López <juanfgomez0912@gmail.com>, 2022. +# Pineappletooth <yochank003@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-27 13:26+0000\n" +"PO-Revision-Date: 2022-08-05 01:04+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -225,7 +229,7 @@ msgstr "Escala de Tiempo" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" -msgstr "Arreglo de las Fluctuaciones FÃsicas" +msgstr "Corrección de Fluctuaciones de FÃsica" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -2813,7 +2817,8 @@ msgid "Project export for platform:" msgstr "Exportar proyecto para la plataforma:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "Completado con errores." #: editor/editor_export.cpp @@ -5563,7 +5568,7 @@ msgstr "Arrastrar y Soltar la Selección" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Permanecer En Editor de Scripts En Nodo Seleccionado" #: editor/editor_settings.cpp msgid "Appearance" @@ -5693,11 +5698,11 @@ msgstr "Espera de Completado de Código" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "Colocar la Información Sobre la Llamada Debajo de la LÃnea Actual" +msgstr "Colocar Tooltip de Llamada Debajo de la LÃnea Actual" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "Desplazamiento de la Información Sobre la Llamada" +msgstr "Desplazamiento del Tooltip de Llamada" #: editor/editor_settings.cpp msgid "Complete File Paths" @@ -6155,7 +6160,7 @@ msgstr "Color de Número de LÃnea Seguro" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "Color del Caret" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Background Color" @@ -6187,7 +6192,7 @@ msgstr "Color de la Palabra Resaltada" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Número del Color" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Function Color" @@ -6211,7 +6216,7 @@ msgstr "Puntos de Interrupción" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "Color de la lÃnea de ejecución" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" @@ -10144,7 +10149,7 @@ msgid "" "viewport." msgstr "" "El polÃgono 2D tiene vértices internos, por lo que ya no se puede editar en " -"la ventanilla." +"el viewport." #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" @@ -11410,27 +11415,27 @@ msgstr "Dialogo de Transformación..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" -msgstr "1 Ventana" +msgstr "1 Viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports" -msgstr "2 Ventanas" +msgstr "2 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "2 Viewports (Alt)" -msgstr "2 Ventanas (Alt)" +msgstr "2 Viewports (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports" -msgstr "3 Ventanas" +msgstr "3 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "3 Viewports (Alt)" -msgstr "3 Ventanas (Alt)" +msgstr "3 Viewports (Alt)" #: editor/plugins/spatial_editor_plugin.cpp msgid "4 Viewports" -msgstr "4 Ventanas" +msgstr "4 Viewports" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" @@ -11475,7 +11480,7 @@ msgstr "Ajuste de Escala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" -msgstr "Configuración de ventanilla" +msgstr "Configuración del Viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "Perspective FOV (deg.):" @@ -11683,9 +11688,8 @@ msgid "New Animation" msgstr "Nueva Animación" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Filtrar métodos" +msgstr "Filtrar animaciones" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -16430,7 +16434,7 @@ msgstr "" #: main/main.cpp msgid "Tooltip Position Offset" -msgstr "Offset de la Posición del Tooltip" +msgstr "Desplazamiento de Posición del Tooltip" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Debugger Agent" @@ -20127,18 +20131,19 @@ msgid "Could not find wine executable at \"%s\"." msgstr "No se pudo encontrar el ejecutable de wine en \"%s\"." #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "No se ha podido iniciar el ejecutable rcedit, configura la ruta de rcedit en " "la configuración del editor (Exportar > Windows > Rcedit)." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Fallo al abrir el archivo ejecutable \"%s\"." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20157,18 +20162,19 @@ msgid "Invalid timestamp server." msgstr "Servidor de marcas de tiempo inválido." #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "No se ha podido iniciar el ejecutable de signtool, configura la ruta de " "signtool en la configuración del editor (Exportar > Windows > Signtool)." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Fallo al abrir el archivo ejecutable \"%s\"." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -20382,7 +20388,7 @@ msgstr "Zoom" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp msgid "Custom Viewport" -msgstr "Vista Personalizada" +msgstr "Viewport Personalizado" #: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp @@ -22922,9 +22928,8 @@ msgid "Show Margins" msgstr "Mostrar Márgenes" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Debug Sprawl" -msgstr "Depurar Desorden" +msgstr "Depurar Extensión" #: scene/3d/room_manager.cpp msgid "Overlap Warning Threshold" @@ -22939,14 +22944,12 @@ msgid "Portal Depth Limit" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "Asignar Margen" +msgstr "Margen del Portal por Defecto" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Roaming Expansion Margin" -msgstr "Expandir Todo" +msgstr "Margen de Expansión del Roaming" #: scene/3d/room_manager.cpp msgid "" @@ -22999,43 +23002,36 @@ msgstr "" "Asegúrate de que todas las rooms contienen geometrÃa o lÃmites manuales." #: scene/3d/skeleton.cpp scene/resources/skin.cpp -#, fuzzy msgid "Pose" -msgstr "Copiar Pose" +msgstr "Pose" #: scene/3d/skeleton.cpp -#, fuzzy msgid "Bound Children" -msgstr "Hijos Editables" +msgstr "Hijos Vinculados" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Pinned Points" -msgstr "Fijado %s" +msgstr "Puntos de Anclaje" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Attachments" -msgstr "Gizmos" +msgstr "Adjuntos" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Point Index" -msgstr "Obtener Ãndice" +msgstr "Ãndice de Puntos" #: scene/3d/soft_body.cpp msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Fotogramas de FÃsica %" +msgstr "FÃsica Activada" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Parent Collision Ignore" -msgstr "Crear PolÃgono de Colisión" +msgstr "Ignorar Colisión de los Padres" #: scene/3d/soft_body.cpp msgid "Simulation Precision" @@ -23100,9 +23096,8 @@ msgid "Gizmo" msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp -#, fuzzy msgid "Track Physics Step" -msgstr "Fotogramas de FÃsica %" +msgstr "Paso de FÃsica de Pistas" #: scene/3d/spring_arm.cpp msgid "Spring Length" @@ -23113,9 +23108,8 @@ msgid "Opacity" msgstr "" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Transparent" -msgstr "Transponer" +msgstr "Transparente" #: scene/3d/sprite_3d.cpp msgid "" @@ -23134,14 +23128,12 @@ msgstr "" "Por favor, úselo como hijo de un VehicleBody." #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Per-Wheel Motion" -msgstr "Botón Bajar la Rueda" +msgstr "Movimiento por Rueda" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentación Online" +msgstr "Fuerza del Motor" #: scene/3d/vehicle_body.cpp msgid "Brake" @@ -23172,19 +23164,16 @@ msgid "Roll Influence" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Friction Slip" -msgstr "Función" +msgstr "Deslizamiento por Fricción" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expresión" +msgstr "Suspensión" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Max Force" -msgstr "Error" +msgstr "Fuerza Máxima" #: scene/3d/visibility_notifier.cpp msgid "AABB" @@ -23211,14 +23200,12 @@ msgid "Extra Cull Margin" msgstr "Margen de Sacrificio Extra" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Baked Light" -msgstr "Calcular Lightmaps" +msgstr "Bakear Luces" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Generate Lightmap" -msgstr "Generando Lightmaps" +msgstr "Generar Lightmap" #: scene/3d/visual_instance.cpp msgid "Lightmap Scale" @@ -23274,9 +23261,8 @@ msgid "Animation not found: '%s'" msgstr "No se encontró la animación: '%s'" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Mix Mode" -msgstr "Nodo Mix" +msgstr "Modo Mix" #: scene/animation/animation_blend_tree.cpp msgid "Fadein Time" @@ -23303,24 +23289,20 @@ msgid "Random Delay" msgstr "Retraso Aleatorio" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Add Amount" -msgstr "Cantidad" +msgstr "Añadir Cantidad" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Blend Amount" -msgstr "Cantidad de Escala" +msgstr "Cantidad de Mezcla" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Seek Position" -msgstr "Establecer Posición de Entrada de Curva" +msgstr "Buscar Posición" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Input Count" -msgstr "Añadir Puerto de Entrada" +msgstr "Conteo de Entradas" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp @@ -23328,56 +23310,48 @@ msgid "Xfade Time" msgstr "Tiempo de Fundido Cruzado" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Switch Mode" -msgstr "Cambiar" +msgstr "Modo de Conmutación" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Auto Advance" -msgstr "Establecer avance automático" +msgstr "Auto Avance" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Advance Condition" -msgstr "Opciones Avanzadas" +msgstr "Condición de Avance" #: scene/animation/animation_player.cpp msgid "Anim Apply Reset" msgstr "Aplicar Reset de la Animación" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation" -msgstr "Establecer Animación" +msgstr "Animación Actual" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Assigned Animation" -msgstr "Añadir Animación" +msgstr "Animación Asignada" #: scene/animation/animation_player.cpp msgid "Reset On Save" msgstr "" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Length" -msgstr "Cambiar Duración de la Animación" +msgstr "Duración Actual de la Animación" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Current Animation Position" -msgstr "Añadir Punto de Animación" +msgstr "Posición Actual de la Animación" #: scene/animation/animation_player.cpp msgid "Playback Options" msgstr "Opciones de Reproducción" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Default Blend Time" -msgstr "Theme Predeterminado" +msgstr "Tiempo de Mezcla por Defecto" #: scene/animation/animation_player.cpp msgid "Method Call Mode" @@ -23418,67 +23392,56 @@ msgid "Tree Root" msgstr "RaÃz del Ãrbol" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Anim Player" -msgstr "Fijar AnimationPlayer" +msgstr "Reproductor de Animación" #: scene/animation/animation_tree.cpp msgid "Root Motion" msgstr "" #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Track" -msgstr "Agregar Pista" +msgstr "Pista" #: scene/animation/animation_tree_player.cpp msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Este nodo ha quedado obsoleto. Usa AnimationTree en su lugar." #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Playback" msgstr "Reproducir" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Master Player" -msgstr "Pegar Parámetros" +msgstr "Reproductor Principal" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Base Path" -msgstr "Ruta de Exportación" +msgstr "Ruta Base" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Animation Path" -msgstr "Animación" +msgstr "Ruta de la Animación" #: scene/animation/root_motion_view.cpp -#, fuzzy msgid "Zero Y" -msgstr "Cero" +msgstr "Cero Y" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Root Bone" -msgstr "Nombre del nodo raÃz" +msgstr "Hueso RaÃz" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Tip Bone" -msgstr "Huesos" +msgstr "Punta del Hueso" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Interpolation" -msgstr "Modo de Interpolación" +msgstr "Interpolación" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Override Tip Basis" -msgstr "Anulaciones" +msgstr "Anular Base de la Punta" #: scene/animation/skeleton_ik.cpp msgid "Use Magnet" @@ -23489,54 +23452,46 @@ msgid "Magnet" msgstr "" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Target Node" -msgstr "Reemparentar nodo" +msgstr "Nodo Objetivo" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Max Iterations" -msgstr "Crear Función" +msgstr "Iteraciones Máximas" #: scene/animation/tween.cpp msgid "Playback Process Mode" msgstr "" #: scene/animation/tween.cpp -#, fuzzy msgid "Playback Speed" -msgstr "Reproducir Escena" +msgstr "Velocidad de Reproducción" #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Mix Target" -msgstr "Objetivo" +msgstr "Objetivo de la Mezcla" #: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp #: servers/audio/effects/audio_effect_compressor.cpp -#, fuzzy msgid "Ratio" -msgstr "Mantener Proporciones" +msgstr "Proporción" #: scene/gui/aspect_ratio_container.cpp scene/gui/texture_button.cpp #: scene/gui/texture_rect.cpp -#, fuzzy msgid "Stretch Mode" -msgstr "Modo de Selección" +msgstr "Modo de Estiramiento" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" msgstr "" #: scene/gui/base_button.cpp -#, fuzzy msgid "Shortcut In Tooltip" -msgstr "Mostrar Origen" +msgstr "Atajo en el Tooltip" #: scene/gui/base_button.cpp -#, fuzzy msgid "Action Mode" -msgstr "Modo de Icono" +msgstr "Modo de Acción" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" @@ -23547,38 +23502,33 @@ msgid "Keep Pressed Outside" msgstr "" #: scene/gui/base_button.cpp scene/gui/shortcut.cpp -#, fuzzy msgid "Shortcut" -msgstr "Atajos" +msgstr "Atajo" #: scene/gui/base_button.cpp -#, fuzzy msgid "Group" -msgstr "Grupos" +msgstr "Grupo" #: scene/gui/button.cpp scene/gui/label.cpp -#, fuzzy msgid "Clip Text" -msgstr "Copiar Texto" +msgstr "Texto del Clip" #: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp #: scene/gui/spin_box.cpp msgid "Align" -msgstr "" +msgstr "Alinear" #: scene/gui/button.cpp msgid "Icon Align" -msgstr "" +msgstr "Alinear Icono" #: scene/gui/button.cpp -#, fuzzy msgid "Expand Icon" -msgstr "Expandir Todo" +msgstr "Expandir Icono" #: scene/gui/center_container.cpp -#, fuzzy msgid "Use Top Left" -msgstr "Superior Izquierda" +msgstr "Usar Superior Izquierda" #: scene/gui/color_picker.cpp msgid "" @@ -23591,34 +23541,28 @@ msgstr "" "Clic der: Borrar configuración predeterminada" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Edit Alpha" -msgstr "Editar PolÃgono" +msgstr "Editar Alfa" #: scene/gui/color_picker.cpp -#, fuzzy msgid "HSV Mode" -msgstr "Modo de Selección" +msgstr "Modo HSV" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Raw Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo Raw" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Deferred Mode" -msgstr "Diferido" +msgstr "Modo Diferido" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Enabled" -msgstr "Ajustes preestablecidos" +msgstr "Preajustes Activados" #: scene/gui/color_picker.cpp -#, fuzzy msgid "Presets Visible" -msgstr "Act./Desact. Visible" +msgstr "Preajustes Visibles" #: scene/gui/color_picker.cpp msgid "Pick a color from the editor window." @@ -23648,9 +23592,8 @@ msgstr "" "sencillo." #: scene/gui/control.cpp -#, fuzzy msgid "Theme Overrides" -msgstr "Anulaciones" +msgstr "Anulación de Temas" #: scene/gui/control.cpp msgid "" @@ -23662,14 +23605,12 @@ msgstr "" "Filtro del Ratón en \"Stop\" o \"Pass\"." #: scene/gui/control.cpp -#, fuzzy msgid "Anchor" -msgstr "Sólo anclado" +msgstr "Anclaje" #: scene/gui/control.cpp -#, fuzzy msgid "Grow Direction" -msgstr "Direcciones" +msgstr "Dirección de Crecimiento" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp msgid "Min Size" @@ -23680,40 +23621,36 @@ msgid "Pivot Offset" msgstr "Pivote de Desplazamiento" #: scene/gui/control.cpp -#, fuzzy msgid "Clip Content" -msgstr "Constante de Clase" +msgstr "Contenido del Clip" #: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp msgid "Hint" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Tooltip" -msgstr "Herramientas" +msgstr "Tooltip" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Focus" -msgstr "Foco en Ruta" +msgstr "Foco" #: scene/gui/control.cpp msgid "Neighbour Left" -msgstr "" +msgstr "Vecino Izquierda" #: scene/gui/control.cpp msgid "Neighbour Top" -msgstr "" +msgstr "Vecino Superior" #: scene/gui/control.cpp msgid "Neighbour Right" -msgstr "" +msgstr "Vecino Derecha" #: scene/gui/control.cpp -#, fuzzy msgid "Neighbour Bottom" -msgstr "Centro Inferior" +msgstr "Vecino Inferior" #: scene/gui/control.cpp msgid "Next" @@ -23740,23 +23677,20 @@ msgid "Size Flags" msgstr "Tamaño de los Indicadores" #: scene/gui/control.cpp -#, fuzzy msgid "Stretch Ratio" -msgstr "Modo de Selección" +msgstr "Relación de Estiramiento" #: scene/gui/control.cpp -#, fuzzy msgid "Theme Type Variation" -msgstr "Propiedades del Theme" +msgstr "Propiedades del Tema" #: scene/gui/dialogs.cpp msgid "Window Title" msgstr "" #: scene/gui/dialogs.cpp -#, fuzzy msgid "Dialog" -msgstr "Diálogo XForm" +msgstr "Diálogo" #: scene/gui/dialogs.cpp msgid "Hide On OK" @@ -23771,18 +23705,16 @@ msgid "Please Confirm..." msgstr "Por favor, Confirma..." #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Mode Overrides Title" -msgstr "Elemento de Anulación" +msgstr "Sobreescritura" #: scene/gui/file_dialog.cpp msgid "Must use a valid extension." msgstr "Debe tener una extensión válida." #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Right Disconnects" -msgstr "Desconectar" +msgstr "Desconexión Correcta" #: scene/gui/graph_edit.cpp msgid "Scroll Offset" @@ -23793,24 +23725,20 @@ msgid "Snap Distance" msgstr "Ajustar Distancia" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Min" -msgstr "Acercar Zoom" +msgstr "Zoom MÃnimo" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Max" -msgstr "Acercar Zoom" +msgstr "Zoom Máximo" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Step" -msgstr "Alejar Zoom" +msgstr "Paso Zoom" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Show Zoom Label" -msgstr "Mostrar Huesos" +msgstr "Mostrar Etiqueta Zoom" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp @@ -23822,58 +23750,50 @@ msgid "Enable grid minimap." msgstr "Activar minimapa de cuadrÃcula." #: scene/gui/graph_node.cpp -#, fuzzy msgid "Show Close" -msgstr "Mostrar Huesos" +msgstr "Mostrar Cerrar" #: scene/gui/graph_node.cpp scene/gui/option_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected" -msgstr "Seleccionar" +msgstr "Seleccionado" #: scene/gui/graph_node.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Comment" -msgstr "Confirmar" +msgstr "Comentario" #: scene/gui/graph_node.cpp msgid "Overlay" msgstr "" #: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Columns" -msgstr "Volumen" +msgstr "Columnas" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/text_edit.cpp #: scene/gui/tree.cpp scene/main/viewport.cpp -#, fuzzy msgid "Timers" -msgstr "Tiempo" +msgstr "Temporizadores" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/tree.cpp msgid "Incremental Search Max Interval Msec" msgstr "" #: scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Allow Reselect" -msgstr "Aplicar Restablecer" +msgstr "Permitir Volver A Seleccionar" #: scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Allow RMB Select" -msgstr "Rellenar Selección" +msgstr "Permitir Selección Con Botón Derecho Del Ratón" #: scene/gui/item_list.cpp msgid "Max Text Lines" msgstr "" #: scene/gui/item_list.cpp -#, fuzzy msgid "Auto Height" -msgstr "Prueba" +msgstr "Altura Automática" #: scene/gui/item_list.cpp msgid "Max Columns" @@ -23892,23 +23812,20 @@ msgid "Icon Scale" msgstr "Escala de Icono" #: scene/gui/item_list.cpp -#, fuzzy msgid "Fixed Icon Size" -msgstr "Vista Frontal" +msgstr "Tamaño Fijo de Icono" #: scene/gui/label.cpp -#, fuzzy msgid "V Align" -msgstr "Asignar" +msgstr "Alineamiento V" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp msgid "Visible Characters" msgstr "Caracteres Visibles" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Percent Visible" -msgstr "Act./Desact. Visible" +msgstr "Porcentaje Visible" #: scene/gui/label.cpp msgid "Lines Skipped" @@ -23935,34 +23852,28 @@ msgid "Expand To Text Length" msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Context Menu Enabled" -msgstr "Ayuda Contextual" +msgstr "Menú Contextual Activado" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Virtual Keyboard Enabled" -msgstr "Filtrar señales" +msgstr "Teclado Virtual Activado" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Clear Button Enabled" -msgstr "Filtrar señales" +msgstr "Botón de Borrado Activado" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Shortcut Keys Enabled" -msgstr "Atajos" +msgstr "Atajos Activados" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Middle Mouse Paste Enabled" -msgstr "Filtrar señales" +msgstr "Pegar Con Botón Intermedio Ratón Activado" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Selecting Enabled" -msgstr "Sólo selección" +msgstr "Selección Activada" #: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp #: scene/gui/text_edit.cpp @@ -23970,14 +23881,12 @@ msgid "Deselect On Focus Loss Enabled" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Right Icon" -msgstr "Botón Derecho" +msgstr "Icono Derecho" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Placeholder" -msgstr "Cargar Como Placeholder" +msgstr "Marcador" #: scene/gui/line_edit.cpp msgid "Alpha" @@ -24000,24 +23909,20 @@ msgid "Underline" msgstr "" #: scene/gui/menu_button.cpp -#, fuzzy msgid "Switch On Hover" -msgstr "Cambiar" +msgstr "Cambiar Al Pasar Por Encima" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Draw Center" -msgstr "Centro" +msgstr "Dibujar al Centro" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Region Rect" -msgstr "Establecer Region Rect" +msgstr "Región Rectángulo" #: scene/gui/nine_patch_rect.cpp -#, fuzzy msgid "Patch Margin" -msgstr "Asignar Margen" +msgstr "Parche de Margen" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp msgid "Axis Stretch" @@ -24036,14 +23941,12 @@ msgstr "" "como Stretch en su lugar." #: scene/gui/popup.cpp -#, fuzzy msgid "Popup" -msgstr "Rellenar" +msgstr "Popup" #: scene/gui/popup.cpp -#, fuzzy msgid "Exclusive" -msgstr "Inclusivo" +msgstr "Exclusivo" #: scene/gui/popup.cpp msgid "" @@ -24056,28 +23959,24 @@ msgstr "" "edición, pero se esconderán al iniciar." #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On Item Selection" -msgstr "Centrar Selección" +msgstr "Ocultar Al Seleccionar Elemento" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On Checkable Item Selection" -msgstr "Eliminar Selección de GridMap" +msgstr "Ocultar Al Seleccionar Elemento Activable" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Hide On State Item Selection" -msgstr "Eliminar Selección" +msgstr "Ocultar Al Seleccionar Elemento de Estado" #: scene/gui/popup_menu.cpp msgid "Submenu Popup Delay" msgstr "" #: scene/gui/popup_menu.cpp -#, fuzzy msgid "Allow Search" -msgstr "Buscar" +msgstr "Permitir Búsqueda" #: scene/gui/progress_bar.cpp msgid "Percent" @@ -24088,28 +23987,24 @@ msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." msgstr "Si \"Exp Edit\" está activado, \"Min Value\" debe ser mayor que 0." #: scene/gui/range.cpp scene/resources/curve.cpp -#, fuzzy msgid "Min Value" -msgstr "Fijar Valor" +msgstr "Valor MÃnimo" #: scene/gui/range.cpp scene/resources/curve.cpp -#, fuzzy msgid "Max Value" -msgstr "Valor" +msgstr "Valor Máximo" #: scene/gui/range.cpp msgid "Page" msgstr "Página" #: scene/gui/range.cpp -#, fuzzy msgid "Exp Edit" -msgstr "Editar" +msgstr "Editar Exp" #: scene/gui/range.cpp -#, fuzzy msgid "Rounded" -msgstr "Agrupado" +msgstr "Redondeado" #: scene/gui/range.cpp msgid "Allow Greater" @@ -24120,24 +24015,20 @@ msgid "Allow Lesser" msgstr "" #: scene/gui/reference_rect.cpp -#, fuzzy msgid "Border Color" -msgstr "Cambiar Nombre del Elemento Color" +msgstr "Color Del Borde" #: scene/gui/reference_rect.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border Width" -msgstr "PÃxeles del Borde" +msgstr "Anchura Del Borde" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Relative Index" -msgstr "Obtener Ãndice" +msgstr "Ãndice Relativo" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Absolute Index" -msgstr "Auto SangrÃa" +msgstr "Ãndice Absoluto" #: scene/gui/rich_text_effect.cpp msgid "Elapsed Time" @@ -24146,7 +24037,7 @@ msgstr "Tiempo Transcurrido" #: scene/gui/rich_text_effect.cpp #, fuzzy msgid "Env" -msgstr "Fin" +msgstr "Env" #: scene/gui/rich_text_effect.cpp msgid "Character" @@ -24165,9 +24056,8 @@ msgid "Tab Size" msgstr "Tamaño de Tabulación" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Fit Content Height" -msgstr "Pintar Peso de Huesos" +msgstr "Ajustar Altura Del Contenido" #: scene/gui/rich_text_label.cpp msgid "Scroll Active" @@ -24178,23 +24068,20 @@ msgid "Scroll Following" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Selection Enabled" -msgstr "Sólo selección" +msgstr "Selección Activada" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp msgid "Override Selected Font Color" msgstr "Sobrescribir Color de Fuente Seleccionada" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Custom Effects" -msgstr "Mover Efecto de Bus" +msgstr "Efectos Personalizados" #: scene/gui/scroll_bar.cpp -#, fuzzy msgid "Custom Step" -msgstr "CustomNode" +msgstr "Paso Personalizado" #: scene/gui/scroll_container.cpp msgid "" @@ -24207,18 +24094,16 @@ msgstr "" "manualmente el tamaño mÃnimo personalizado." #: scene/gui/scroll_container.cpp -#, fuzzy msgid "Follow Focus" -msgstr "Llenar superficie" +msgstr "Seguir Focus" #: scene/gui/scroll_container.cpp msgid "Horizontal Enabled" msgstr "Horizontal Activado" #: scene/gui/scroll_container.cpp -#, fuzzy msgid "Vertical Enabled" -msgstr "Filtrar señales" +msgstr "Vertical Activada" #: scene/gui/scroll_container.cpp msgid "Default Scroll Deadzone" @@ -24229,9 +24114,8 @@ msgid "Scrollable" msgstr "" #: scene/gui/slider.cpp -#, fuzzy msgid "Tick Count" -msgstr "Seleccionar Color" +msgstr "Cantidad De Marcas" #: scene/gui/slider.cpp msgid "Ticks On Borders" @@ -24250,14 +24134,12 @@ msgid "Split Offset" msgstr "Desplazamiento de División" #: scene/gui/split_container.cpp scene/gui/tree.cpp -#, fuzzy msgid "Collapsed" -msgstr "Colapsar Todo" +msgstr "Colapsado" #: scene/gui/split_container.cpp -#, fuzzy msgid "Dragger Visibility" -msgstr "Cambiar Visibilidad" +msgstr "Visibilidad de los Arrastradores" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Tab Align" @@ -24268,9 +24150,8 @@ msgid "Current Tab" msgstr "Pestaña Actual" #: scene/gui/tab_container.cpp -#, fuzzy msgid "Tabs Visible" -msgstr "Act./Desact. Visible" +msgstr "Pestañas Visibles" #: scene/gui/tab_container.cpp msgid "All Tabs In Front" @@ -24297,18 +24178,16 @@ msgid "Readonly" msgstr "" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Bookmark Gutter" -msgstr "Marcadores" +msgstr "Canalón de Marcadores" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Breakpoint Gutter" -msgstr "Saltar Breakpoints" +msgstr "Canalón de Puntos de Ruptura" #: scene/gui/text_edit.cpp msgid "Fold Gutter" -msgstr "Plegar Gutter" +msgstr "Canalón Plegable" #: scene/gui/text_edit.cpp msgid "Drag And Drop Selection Enabled" @@ -24335,9 +24214,8 @@ msgid "Draw" msgstr "Dibujar" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Block Mode" -msgstr "Desbloquear Nodo" +msgstr "Modo Bloque" #: scene/gui/text_edit.cpp msgid "Moving By Right Click" @@ -24356,34 +24234,29 @@ msgid "Hover" msgstr "" #: scene/gui/texture_button.cpp -#, fuzzy msgid "Focused" -msgstr "Foco en Ruta" +msgstr "Enfocado" #: scene/gui/texture_button.cpp -#, fuzzy msgid "Click Mask" -msgstr "Modo de Colisión" +msgstr "Máscara de Clic" #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp #: scene/gui/video_player.cpp -#, fuzzy msgid "Expand" -msgstr "Expandir Todo" +msgstr "Expandir" #: scene/gui/texture_progress.cpp msgid "Under" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Over" -msgstr "Sobreescribir" +msgstr "Sobre" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Progress" -msgstr "Propiedades del Theme" +msgstr "Progreso" #: scene/gui/texture_progress.cpp msgid "Progress Offset" @@ -24402,43 +24275,36 @@ msgid "Radial Fill" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Initial Angle" -msgstr "Inicializar" +msgstr "Ãngulo Inicial" #: scene/gui/texture_progress.cpp msgid "Fill Degrees" msgstr "Completar Grados" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Center Offset" -msgstr "Centro Izquierda" +msgstr "Desplazamiento Central" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Nine Patch Stretch" -msgstr "Modo de Interpolación" +msgstr "Estiramiento de Nine Patch" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Left" -msgstr "Asignar Margen" +msgstr "Estiramiento de Margen Izquierdo" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Top" -msgstr "Asignar Margen" +msgstr "Estiramiento de Margen Superior" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Right" -msgstr "Asignar Margen" +msgstr "Estiramiento de Margen Derecho" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Stretch Margin Bottom" -msgstr "Modo de Selección" +msgstr "Estiramiento de Margen Inferior" #: scene/gui/tree.cpp msgid "Custom Minimum Height" @@ -24449,14 +24315,12 @@ msgid "(Other)" msgstr "(Otros)" #: scene/gui/tree.cpp -#, fuzzy msgid "Column Titles Visible" -msgstr "Act./Desact. Visible" +msgstr "TÃtulos de Columnas Visibles" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Folding" -msgstr "Botón Desactivado" +msgstr "Plegado de Pieles" #: scene/gui/tree.cpp msgid "Hide Root" @@ -24467,43 +24331,36 @@ msgid "Drop Mode Flags" msgstr "" #: scene/gui/video_player.cpp -#, fuzzy msgid "Audio Track" -msgstr "Agregar Pista" +msgstr "Pista de Audio" #: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp msgid "Paused" -msgstr "" +msgstr "Pausado" #: scene/gui/video_player.cpp -#, fuzzy msgid "Buffering Msec" -msgstr "Vista Trasera" +msgstr "Buffering Msec" #: scene/gui/video_player.cpp -#, fuzzy msgid "Stream Position" -msgstr "Establecer Posición de Entrada de Curva" +msgstr "Posición del Stream" #: scene/gui/viewport_container.cpp -#, fuzzy msgid "Stretch Shrink" -msgstr "Buscar" +msgstr "Encogimiento por Estiramiento" #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Follow Viewport" -msgstr "Mostrar Viewport" +msgstr "Seguir el Viewport" #: scene/main/http_request.cpp -#, fuzzy msgid "Download File" -msgstr "Descargar" +msgstr "Descargar Archivo" #: scene/main/http_request.cpp -#, fuzzy msgid "Download Chunk Size" -msgstr "Descargando" +msgstr "Descargar Tamaño del Fragmento" #: scene/main/http_request.cpp msgid "Body Size Limit" @@ -24524,89 +24381,76 @@ msgid "" msgstr "" #: scene/main/node.cpp -#, fuzzy msgid "Name Num Separator" -msgstr "Separador con nombre" +msgstr "Separador Numérico del Nombre" #: scene/main/node.cpp msgid "Name Casing" msgstr "" #: scene/main/node.cpp -#, fuzzy msgid "Editor Description" -msgstr "Descripción" +msgstr "Descripción del Editor" #: scene/main/node.cpp -#, fuzzy msgid "Pause Mode" -msgstr "Modo desplazamiento lateral" +msgstr "Modo Pausa" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "Modo de Interpolación" +msgstr "Modo de Interpolación FÃsica" #: scene/main/node.cpp -#, fuzzy msgid "Display Folded" -msgstr "Mostrar Sin Sombreado" +msgstr "Vista Plegada" #: scene/main/node.cpp -#, fuzzy msgid "Filename" -msgstr "Renombrar" +msgstr "Nombre del Archivo" #: scene/main/node.cpp msgid "Owner" msgstr "Propietario" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "Multiplicar %s" +msgstr "Multijugador" #: scene/main/node.cpp msgid "Custom Multiplayer" msgstr "Multijugador Personalizado" #: scene/main/node.cpp -#, fuzzy msgid "Process Priority" -msgstr "Activar Prioridad" +msgstr "Prioridad del Proceso" #: scene/main/scene_tree.cpp scene/main/timer.cpp -#, fuzzy msgid "Time Left" -msgstr "Superior Izquierda" +msgstr "Tiempo Restante" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Debug Collisions Hint" -msgstr "Modo de Colisión" +msgstr "Sugerencia de Depuración de Colisiones" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Debug Navigation Hint" -msgstr "Modo de Navegación" +msgstr "Sugerencia de Depuración de Navegación" #: scene/main/scene_tree.cpp msgid "Use Font Oversampling" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Edited Scene Root" -msgstr "Nueva RaÃz de Escena" +msgstr "Escena RaÃz Editada" #: scene/main/scene_tree.cpp msgid "Root" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer Poll" -msgstr "Multiplicar %s" +msgstr "Encuesta Multijugador" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp @@ -24618,32 +24462,28 @@ msgid "Shape Color" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Contact Color" -msgstr "Seleccionar Color" +msgstr "Color de Contacto" #: scene/main/scene_tree.cpp msgid "Geometry Color" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Disabled Geometry Color" -msgstr "Desactivar Elemento" +msgstr "Color de la GeometrÃa Desactivada" #: scene/main/scene_tree.cpp msgid "Max Contacts Displayed" msgstr "" #: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp -#, fuzzy msgid "Draw 2D Outlines" -msgstr "Crear Outline" +msgstr "Dibujar Contornos 2D" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Direcciones" +msgstr "Reflexiones" #: scene/main/scene_tree.cpp msgid "Atlas Size" @@ -24674,9 +24514,8 @@ msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Ver Entorno" +msgstr "Entorno por Defecto" #: scene/main/scene_tree.cpp msgid "" @@ -24687,9 +24526,8 @@ msgstr "" "(Rendering -> Environment -> Default Environment) no se ha podido cargar." #: scene/main/scene_tree.cpp -#, fuzzy msgid "Enable Object Picking" -msgstr "Activar Papel Cebolla" +msgstr "Activar Selección de Objetos" #: scene/main/timer.cpp msgid "" @@ -24709,9 +24547,8 @@ msgid "Autostart" msgstr "Inicio Automático" #: scene/main/viewport.cpp -#, fuzzy msgid "Viewport Path" -msgstr "Ruta de Exportación" +msgstr "Ruta del Viewport" #: scene/main/viewport.cpp msgid "" @@ -24785,9 +24622,8 @@ msgid "Render Direct To Screen" msgstr "Renderización Directa en Pantalla" #: scene/main/viewport.cpp -#, fuzzy msgid "Debug Draw" -msgstr "Depurar" +msgstr "Depurar Dibujo" #: scene/main/viewport.cpp msgid "Render Target" @@ -24798,34 +24634,28 @@ msgid "V Flip" msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "Clear Mode" -msgstr "Modo de Regla" +msgstr "Modo de Limpieza" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 2D" -msgstr "Activar" +msgstr "Activar 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 3D" -msgstr "Activar" +msgstr "Activar 3D" #: scene/main/viewport.cpp -#, fuzzy msgid "Object Picking" -msgstr "Activar Papel Cebolla" +msgstr "Selección de Objetos" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable Input" -msgstr "Desactivar Elemento" +msgstr "Desactivar Entrada" #: scene/main/viewport.cpp servers/visual_server.cpp -#, fuzzy msgid "Shadow Atlas" -msgstr "Nuevo Atlas" +msgstr "Sombra del Atlas" #: scene/main/viewport.cpp msgid "Quad 0" @@ -24844,78 +24674,66 @@ msgid "Quad 3" msgstr "" #: scene/main/viewport.cpp -#, fuzzy msgid "Canvas Transform" -msgstr "Reestablecer Transformación" +msgstr "Transformación del Canvas" #: scene/main/viewport.cpp -#, fuzzy msgid "Global Canvas Transform" -msgstr "Mantener transformación global" +msgstr "Transformación Global del Canvas" #: scene/main/viewport.cpp msgid "Tooltip Delay (sec)" -msgstr "" +msgstr "Retraso del Tooltip (sec)" #: scene/register_scene_types.cpp #, fuzzy msgid "Swap OK Cancel" -msgstr "Cancelar UI" +msgstr "Intercambio OK Cancelar" #: scene/register_scene_types.cpp -#, fuzzy msgid "Layer Names" -msgstr "Nombre" +msgstr "Nombres de las Capas" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Render" -msgstr "Renderización" +msgstr "Renderización 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Render" -msgstr "Renderización" +msgstr "Renderización 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr "FÃsica" +msgstr "FÃsica 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr "FÃsica" +msgstr "FÃsica 3D" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Navigation" -msgstr "Navegación" +msgstr "Navegación 2D" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Navigation" -msgstr "Navegación" +msgstr "Navegación 3D" #: scene/register_scene_types.cpp msgid "Use hiDPI" msgstr "" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom" -msgstr "CustomNode" +msgstr "Personalizado" #: scene/register_scene_types.cpp -#, fuzzy msgid "Custom Font" -msgstr "CustomNode" +msgstr "Fuente Personalizada" #: scene/resources/audio_stream_sample.cpp #: servers/audio/effects/audio_stream_generator.cpp servers/audio_server.cpp -#, fuzzy msgid "Mix Rate" -msgstr "Nodo Mix" +msgstr "Tasa de Mezcla" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" @@ -24926,9 +24744,8 @@ msgid "Segments" msgstr "Segmentos" #: scene/resources/curve.cpp -#, fuzzy msgid "Bake Resolution" -msgstr "Media Resolución" +msgstr "Bakear Resolución" #: scene/resources/curve.cpp msgid "Bake Interval" @@ -24939,77 +24756,64 @@ msgid "Panel" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color" -msgstr "Seleccionar Color" +msgstr "Color de la Fuente" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Pressed" -msgstr "Color Hueso 1" +msgstr "Color de la Fuente Presionada" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Hover" -msgstr "Color Hueso 1" +msgstr "Color de la Fuente por Encima" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Focus" -msgstr "Llenar superficie" +msgstr "Color de la Fuente Enfocada" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Disabled" -msgstr "Clip Deshabilitado" +msgstr "Color de la Fuente Desactivada" #: scene/resources/default_theme/default_theme.cpp msgid "H Separation" msgstr "Separación en H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Underline Spacing" -msgstr "Espaciado de LÃnea" +msgstr "Espaciado del Subrayado" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Arrow Margin" -msgstr "Asignar Margen" +msgstr "Margen de la Flecha" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Hover Pressed" -msgstr "Preset" +msgstr "Presionado por Encima" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked Disabled" -msgstr "Chequeable" +msgstr "Marcado Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked" -msgstr "Chequeado" +msgstr "Sin marcar" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Unchecked Disabled" -msgstr "Desactivar Elemento" +msgstr "Sin marcar Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked" -msgstr "Chequeado" +msgstr "Radio Marcado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Radio Checked Disabled" -msgstr "(Editor Desactivado)" +msgstr "Radio Marcado Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked" @@ -25030,27 +24834,23 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "On Disabled" -msgstr "Desactivar Elemento" +msgstr "Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off" -msgstr "Desplazamiento" +msgstr "Apagado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Off Disabled" -msgstr "Desactivar Elemento" +msgstr "Apagado Desactivado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Shadow" -msgstr "Color Hueso 1" +msgstr "Color de la Sombra de la Fuente" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Outline Modulate" -msgstr "Forzar Modulación en Blanco" +msgstr "Modulación del Contorno de la Fuente" #: scene/resources/default_theme/default_theme.cpp msgid "Shadow Offset X" @@ -25061,59 +24861,50 @@ msgid "Shadow Offset Y" msgstr "Desplazamiento de la Sombra en Y" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow As Outline" -msgstr "Mostrar Contorno Anterior" +msgstr "Sombra como Contorno" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Selected" -msgstr "Desbloquear Seleccionado" +msgstr "Color de Fuente Seleccionada" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Uneditable" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Cursor Color" -msgstr "CustomNode" +msgstr "Color del Cursor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Clear Button Color" -msgstr "Filtrar señales" +msgstr "Limpiar Color del Botón" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Clear Button Color Pressed" -msgstr "Filtrar señales" +msgstr "Limpiar Color del Botón Presionado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Minimum Spaces" -msgstr "Escena Principal" +msgstr "Espacios MÃnimos" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG" -msgstr "B" +msgstr "BG" #: scene/resources/default_theme/default_theme.cpp msgid "FG" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab" -msgstr "Tab 1" +msgstr "Tab" #: scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/world.cpp #: scene/resources/world_2d.cpp -#, fuzzy msgid "Space" -msgstr "Escena Principal" +msgstr "Espacio" #: scene/resources/default_theme/default_theme.cpp msgid "Folded" @@ -25128,9 +24919,8 @@ msgid "Font Color Readonly" msgstr "" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Lines" -msgstr "Completar" +msgstr "Finalización de LÃneas" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26907,7 +26697,7 @@ msgstr "Margen de Conexión de Bordes" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Lienzo" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index b37d9dcfd8..10a562d0b8 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -2800,7 +2800,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Copiar Ruta del Nodo" #: editor/editor_export.cpp @@ -20742,15 +20742,15 @@ msgstr "No se pudo encontrar la keystore, no se puedo exportar." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Archivo ejecutable no válido." #: platform/windows/export/export.cpp #, fuzzy @@ -20774,15 +20774,15 @@ msgstr "Nombre inválido." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Archivo ejecutable no válido." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/et.po b/editor/translations/et.po index 1f3fe075df..3976c9f0bd 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -2789,7 +2789,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Kopeeri sõlme tee" #: editor/editor_export.cpp @@ -20013,15 +20013,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Vigane nimi." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20043,15 +20043,15 @@ msgstr "Vigane nimi." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Vigane nimi." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/eu.po b/editor/translations/eu.po index 2555dfa8d3..3e69f3c4b9 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -2756,8 +2756,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Kargatu animazioa" #: editor/editor_export.cpp #, fuzzy @@ -19815,15 +19816,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Animazio izen baliogabea!" #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -19845,15 +19846,15 @@ msgstr "Animazio izen baliogabea!" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Animazio izen baliogabea!" #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/fa.po b/editor/translations/fa.po index a0202d3254..86b847e530 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -2840,7 +2840,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Ú©Ù¾ÛŒ کردن مسیر node" #: editor/editor_export.cpp @@ -20752,15 +20752,15 @@ msgstr "نمی‌تواند یک پوشه ایجاد شود." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "باید از یک پسوند معتبر استÙاده شود." #: platform/windows/export/export.cpp #, fuzzy @@ -20784,15 +20784,15 @@ msgstr "نام نامعتبر." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "باید از یک پسوند معتبر استÙاده شود." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/fi.po b/editor/translations/fi.po index 28b4581d60..db841ef48a 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -2864,7 +2864,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Kopioi solmun polku" #: editor/editor_export.cpp @@ -20756,17 +20756,17 @@ msgstr "Keystorea ei löytynyt, ei voida viedä." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "rcedit-työkalu täytyy olla konfiguroituna editorin asetuksissa (Export > " "Windows > Rcedit) ikonin tai sovelluksen tietojen muuttamiseksi." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Virheellinen käynnistystiedosto." #: platform/windows/export/export.cpp #, fuzzy @@ -20791,17 +20791,17 @@ msgstr "Virheellinen nimi." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "rcedit-työkalu täytyy olla konfiguroituna editorin asetuksissa (Export > " "Windows > Rcedit) ikonin tai sovelluksen tietojen muuttamiseksi." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Virheellinen käynnistystiedosto." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/fil.po b/editor/translations/fil.po index 4671a2aeaf..0a154fd6ae 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -2712,8 +2712,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Pagulit ng Animation" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19501,14 +19502,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19530,14 +19530,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/fr.po b/editor/translations/fr.po index 85a3e54c1d..88c4966b54 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -101,13 +101,14 @@ # Arnaud Lier <arnaud@ric-rac.org>, 2022. # Jérémie Guegain <mirejai@orange.fr>, 2022. # cwulveryck <cwulveryck@online.fr>, 2022. +# Helix Sir <vincentbarkmann@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-16 06:20+0000\n" -"Last-Translator: cwulveryck <cwulveryck@online.fr>\n" +"PO-Revision-Date: 2022-08-05 01:04+0000\n" +"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -147,11 +148,11 @@ msgstr "Lissage de Delta" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" -msgstr "Mode d'Utilisation Faible du Processeur" +msgstr "Mode d'utilisation faible du processeur" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "Mode d'Utilisation Faible du Processeur (µs)" +msgstr "Mode d'utilisation faible du processeur Veille (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -244,9 +245,8 @@ msgid "Time Scale" msgstr "Echelle de temps" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "Correction de la physique gigue" +msgstr "Correction des sursauts de physique" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" @@ -316,9 +316,8 @@ msgid "Page Size" msgstr "Taille de page" #: core/io/file_access_network.cpp -#, fuzzy msgid "Page Read Ahead" -msgstr "Page lue devant" +msgstr "Pré-lecture de page" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" @@ -329,9 +328,8 @@ msgid "Connection" msgstr "Connexion" #: core/io/http_client.cpp -#, fuzzy msgid "Read Chunk Size" -msgstr "Lire la taille du tronçon" +msgstr "Taile des tronçons de lecture" #: core/io/marshalls.cpp msgid "Object ID" @@ -375,7 +373,7 @@ msgstr "Taille maximale du tampon de sortie" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "Pair de flux" #: core/io/stream_peer.cpp msgid "Big Endian" @@ -488,9 +486,8 @@ msgid "Command" msgstr "Commande" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (physique)" +msgstr "Physique" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -500,7 +497,7 @@ msgstr "Pressé" #: core/os/input_event.cpp msgid "Scancode" -msgstr "Scancode" +msgstr "Code de scan" #: core/os/input_event.cpp msgid "Physical Scancode" @@ -543,9 +540,8 @@ msgid "Pressure" msgstr "Pression" #: core/os/input_event.cpp -#, fuzzy msgid "Pen Inverted" -msgstr "Inverser" +msgstr "Stylo Inversé" #: core/os/input_event.cpp msgid "Relative" @@ -624,7 +620,7 @@ msgstr "Application" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "Config" +msgstr "Configuration" #: core/project_settings.cpp msgid "Project Settings Override" @@ -731,9 +727,8 @@ msgid "Editor" msgstr "Éditeur" #: core/project_settings.cpp -#, fuzzy msgid "Main Run Args" -msgstr "Arguments de la scène principale :" +msgstr "Paramètres d'exécution du programme principal" #: core/project_settings.cpp msgid "Scene Naming" @@ -797,9 +792,8 @@ msgid "UI Down" msgstr "Bas" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "Page Haut" +msgstr "Page Haut (Interface)" #: core/project_settings.cpp msgid "UI Page Down" @@ -835,9 +829,8 @@ msgid "3D" msgstr "3D" #: core/project_settings.cpp -#, fuzzy msgid "Smooth Trimesh Collision" -msgstr "Collision Lisse Trimesh" +msgstr "Lissage de Collision Trimesh" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -918,9 +911,8 @@ msgid "Compression Level" msgstr "Niveau de Compression" #: core/project_settings.cpp -#, fuzzy msgid "Window Log Size" -msgstr "Taille de la fenêtre du journal" +msgstr "Taille du journal de la fenêtre" #: core/project_settings.cpp msgid "Zlib" @@ -948,10 +940,9 @@ msgstr "Délai d'expiration de la connexion en secondes" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "Flux de pair de paquet" #: core/register_core_types.cpp -#, fuzzy msgid "Max Buffer (Power of 2)" msgstr "Tampon Max (puissance de 2)" @@ -993,7 +984,6 @@ msgid "Test" msgstr "Test" #: core/translation.cpp scene/resources/font.cpp -#, fuzzy msgid "Fallback" msgstr "Repli" @@ -1036,12 +1026,12 @@ msgstr "Tampons" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Taille du tampon des polygones du canevas (Ko)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "Taille de l'index des polygones du canevas (Ko)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -1057,15 +1047,13 @@ msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "Magnétisme intelligent" +msgstr "Magnétisme" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Use GPU Pixel Snap" -msgstr "Aligner au pixel près" +msgstr "Arrondissement GPU au pixel le plus proche" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -1074,9 +1062,8 @@ msgstr "Taille du tampon immédiat (Ko)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp -#, fuzzy msgid "Lightmapping" -msgstr "Précalculer les lightmaps" +msgstr "Cartographie des lumières" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -1100,7 +1087,6 @@ msgid "Max Lights Per Object" msgstr "Maximum de lumières par objet" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Subsurface Scattering" msgstr "Transluminescence" @@ -1122,13 +1108,12 @@ msgid "Follow Surface" msgstr "Suivre la surface" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Weight Samples" msgstr "Échantillons de poids" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Voxel Cone Tracing" -msgstr "" +msgstr "Traçage de cone voxel" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" @@ -1136,7 +1121,7 @@ msgstr "Haute Qualité" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" -msgstr "" +msgstr "Taille max du tampon de mélange de formes" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp @@ -1193,7 +1178,7 @@ msgstr "Modifier le temps de l’image-clé" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "Changer la transition de l’animation" +msgstr "Transition de changement de l’animation" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" @@ -1253,14 +1238,12 @@ msgid "Type" msgstr "Type" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "Définir la poignée" +msgstr "Poignée d'entrée" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "Définir la poignée" +msgstr "Poignée de sortie" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1274,7 +1257,6 @@ msgid "Start Offset" msgstr "Décalage du Départ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" msgstr "Décalage à la fin" @@ -1289,9 +1271,8 @@ msgid "Animation" msgstr "Animation" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" -msgstr "Ease in-out" +msgstr "Transition entrée-sortie" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1430,38 +1411,32 @@ msgid "(Invalid, expected type: %s)" msgstr "(Invalide, type attendu : %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "Ease in-out" +msgstr "Transition entrée-sortie :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Définir la poignée" +msgstr "Poignée d'entrée :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Définir la poignée" +msgstr "Poignée de sortie :" #: editor/animation_track_editor.cpp msgid "Stream:" msgstr "Flux :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Redémarrer (s) :" +msgstr "Début (s) :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "Fondu entrant (s) :" +msgstr "Fin (s) :" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animations :" +msgstr "Clip d'animation :" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1549,9 +1524,8 @@ msgid "Editors" msgstr "Éditeurs" #: editor/animation_track_editor.cpp editor/editor_settings.cpp -#, fuzzy msgid "Confirm Insert Track" -msgstr "Insérer une piste et clé d’animation" +msgstr "Confirmer l'ajout de piste" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -2867,8 +2841,8 @@ msgid "Project export for platform:" msgstr "Exportation du projet pour la plateforme :" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "Terminé avec des erreurs." +msgid "Completed with warnings." +msgstr "Terminé avec des avertissements." #: editor/editor_export.cpp msgid "Completed successfully." @@ -2988,9 +2962,8 @@ msgid "64 Bits" msgstr "64 Bits" #: editor/editor_export.cpp -#, fuzzy msgid "Embed PCK" -msgstr "PCK Intégré" +msgstr "Intégrer PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "Texture Format" @@ -3029,9 +3002,8 @@ msgid "Custom release template not found." msgstr "Modèle de version personnalisée introuvable." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "Gérer les modèles" +msgstr "Préparer le modèle type" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "The given export path doesn't exist." @@ -3047,9 +3019,8 @@ msgstr "La copie du modèle d'exportation a échoué." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Intégration du PCK" +msgstr "Intégration PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3270,9 +3241,8 @@ msgid "Manage Editor Feature Profiles" msgstr "Gérer les profils de fonctionnalités de l'éditeur" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Profil des fonctionnalités de Godot" +msgstr "Profil de fonctionalités par défaut" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3383,7 +3353,6 @@ msgid "Show Hidden Files" msgstr "Afficher les fichiers cachés" #: editor/editor_file_dialog.cpp -#, fuzzy msgid "Disable Overwrite Warning" msgstr "Désactiver l'avertissement de réécriture" @@ -3688,25 +3657,21 @@ msgid "Read Only" msgstr "Lecture Seule" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" -msgstr "Item à cocher" +msgstr "Cochable" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "Item coché" +msgstr "Coché" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "Appels de dessin :" +msgstr "Dessiner en rouge" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "Jouer" +msgstr "En train de taper" #: editor/editor_inspector.cpp msgid "Pin value" @@ -4080,10 +4045,8 @@ msgid "Save & Reload" msgstr "Sauvegarder & Recharger" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "" -"Sauvegarder les modifications effectuées dans « %s » avant de recharger ?" +msgstr "Sauvegarder les modifications dans '%s' avant de recharger ?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4202,11 +4165,9 @@ msgid "Open Project Manager?" msgstr "Ouvrir le gestionnaire de projets ?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" msgstr "" -"Sauvegarder les modifications sur la (les) scène(s) suivante(s) avant de " -"quitter ?" +"Sauvegarder les modifications de scène(s) suivante(s) avant de recharger ?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4411,9 +4372,8 @@ msgid "Interface" msgstr "Interface" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "Basculer entre onglets de scène" +msgstr "Onglets de scène" #: editor/editor_node.cpp msgid "Always Show Close Button" @@ -4448,7 +4408,6 @@ msgid "Save On Focus Loss" msgstr "Enregistrer lorsque le focus est perdu" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" msgstr "Enregistrer toutes les scènes à la fermeture" @@ -4470,12 +4429,10 @@ msgid "Update Vital Only" msgstr "Changements de matériau" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "Localisation" +msgstr "Traduction des réglages" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" msgstr "Restaurer les scènes au chargement" @@ -4488,7 +4445,6 @@ msgid "Inspector" msgstr "Inspecteur" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" msgstr "Style par défaut des noms de propriétés" @@ -4497,12 +4453,10 @@ msgid "Default Float Step" msgstr "Pas par défaut des flottant" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "Bouton désactivé" +msgstr "Désactiver le repliage" #: editor/editor_node.cpp -#, fuzzy msgid "Auto Unfold Foreign Scenes" msgstr "Déplier automatiquement les scènes étrangères" @@ -4511,7 +4465,6 @@ msgid "Horizontal Vector2 Editing" msgstr "Édition horizontale de Vector2" #: editor/editor_node.cpp -#, fuzzy msgid "Horizontal Vector Types Editing" msgstr "Édition de Types de Vecteur Horizontal" @@ -4520,12 +4473,10 @@ msgid "Open Resources In Current Inspector" msgstr "Ouvrir les ressources dans l'inspecteur actuel" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" msgstr "Ressources à ouvrir dans un nouvel inspecteur" #: editor/editor_node.cpp -#, fuzzy msgid "Default Color Picker Mode" msgstr "Mode par défaut du sélectionneur de couleur" @@ -5187,14 +5138,12 @@ msgid "Debugger" msgstr "Débogueur" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame History Size" msgstr "Taille de l'historique de la trame du profileur" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "Renommer la fonction" +msgstr "Nombre maximum de fonctions par trame de profileur" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5409,12 +5358,10 @@ msgid "Code Font Size" msgstr "Taille de la police du code" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Antialiased" -msgstr "Anticrénelage appliqué sur la police" +msgstr "Police anticrénelée" #: editor/editor_settings.cpp -#, fuzzy msgid "Font Hinting" msgstr "Indication de police" @@ -5435,18 +5382,16 @@ msgid "Dim Editor On Dialog Popup" msgstr "Assombrir l'éditeur à l'ouverture d'un dialogue" #: editor/editor_settings.cpp main/main.cpp -#, fuzzy msgid "Low Processor Mode Sleep (µsec)" -msgstr "Mode de faible latence Processeur" +msgstr "Veille du Mode faible latence Processeur (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Veille du mode d'utilisation faible du processeur quand inactif (µsec)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "Mode Sans Distraction" +msgstr "Mode distraction séparée" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" @@ -5454,7 +5399,7 @@ msgstr "Ouvrir automatiquement les captures d'écran" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Nombre maximum d'articles tableau de dictionnaire par page" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5475,9 +5420,8 @@ msgid "Base Color" msgstr "Couleur de Base" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Prélever une couleur" +msgstr "Couleur d'accentuation" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" @@ -5485,69 +5429,59 @@ msgstr "Contraste" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" -msgstr "" +msgstr "Opacité des lignes de relation" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "Enregistrement des lightmaps" +msgstr "Surligner les onglets" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "Pixels de bordure" +msgstr "Taille de bordure" #: editor/editor_settings.cpp -#, fuzzy msgid "Use Graph Node Headers" -msgstr "Utiliser les en-tête de noeud Graph" +msgstr "Utiliser les en-têtes de graphes des nÅ“uds" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "Bouclage de l’animation" +msgstr "Espacement supplémentaire" #: editor/editor_settings.cpp msgid "Custom Theme" msgstr "Thème Personnalisé" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Molette bouton droit" +msgstr "Afficher le bouton script" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "Directions" +msgstr "Dossiers" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Chemin du projet :" +msgstr "Scan auto du chemin du projet" #: editor/editor_settings.cpp msgid "Default Project Path" msgstr "Chemin du Projet par Défaut" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "Enregistrer" +msgstr "À l'enregistrement" #: editor/editor_settings.cpp msgid "Compress Binary Resources" msgstr "Compresser les ressources binaires" #: editor/editor_settings.cpp -#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "Sauvegarde sécurisée lors de l'archivage puis renommer" +msgstr "Sauvegarde sécurisée lors de l'archivage avant de renommer" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "Dialogue XForm" +msgstr "Fenêtre de sélection de fichiers" #: editor/editor_settings.cpp msgid "Thumbnail Size" @@ -5555,21 +5489,19 @@ msgstr "Taille de la vignette" #: editor/editor_settings.cpp msgid "Docks" -msgstr "" +msgstr "S'attache" #: editor/editor_settings.cpp msgid "Scene Tree" msgstr "une arborescence, arbre des scènes" #: editor/editor_settings.cpp -#, fuzzy msgid "Start Create Dialog Fully Expanded" -msgstr "Lancer le dialogue de Création totalement expandu" +msgstr "Lancer le dialogue de création complètement déplié" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Toujours afficher la grille" +msgstr "Toujours afficher les dossiers" #: editor/editor_settings.cpp msgid "Property Editor" @@ -5580,29 +5512,24 @@ msgid "Auto Refresh Interval" msgstr "Intervalle d’autorafraîchissement" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Ressources secondaires" +msgstr "Teinte des sous-ressources" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Thème de l'éditeur" +msgstr "Thème de couleurs" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Spacing" msgstr "Espace entre les lignes" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "Éclairage direct" +msgstr "Surlignage" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" msgstr "Coloration syntaxique" @@ -5615,32 +5542,28 @@ msgid "Highlight Current Line" msgstr "Mettre en évidence la ligne actuelle" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Highlight Type Safe Lines" -msgstr "Surligner les lignes Typées" +msgstr "Surligner les lignes à types sûrs" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Indenter vers la gauche" +msgstr "Indenter" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Indentation automatique" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "Convertir indentations en espaces" +msgstr "Convertir les indentations à l'enregistrement" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Draw Tabs" msgstr "Montrer les tabulations" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "Appels de dessin :" +msgstr "Afficher les espaces" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5658,9 +5581,8 @@ msgid "V Scroll Speed" msgstr "Vitesse du défilement vertical" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "Afficher l'origine" +msgstr "Afficher la minimap" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5668,16 +5590,15 @@ msgstr "Largeur de la mini-carte" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "Boutons additionnels de la souris déplacent dans l'historique" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Sélection de la GridMap" +msgstr "Sélection glisser/déposer" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Rester sur l’éditeur de script en sélectionnant un nÅ“ud" #: editor/editor_settings.cpp msgid "Appearance" @@ -5688,21 +5609,18 @@ msgid "Show Line Numbers" msgstr "Afficher les Numéros de Ligne" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "Numéro de ligne :" +msgstr "Numéros de lignes avec remplissage en zéros" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" msgstr "Montrer le bandeau de marque-page" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "Passer les points d'arrêt" +msgstr "Afficher le bandeau de points d’arrêt" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Info Gutter" msgstr "Montrer le bandeau d'information" @@ -5712,26 +5630,25 @@ msgstr "Rétrécir le code" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "Retour à la ligne des mots" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Montrer les guides de longueur de ligne" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Colonne douce des guides de longueur de ligne" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Colonne dure des guides de longueur de ligne" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" msgstr "Liste des Scripts" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Members Overview" msgstr "Montrer l'ensemble des Membres" @@ -5740,19 +5657,16 @@ msgid "Files" msgstr "Fichiers" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "Supprimer les espaces de fin de ligne" +msgstr "Retirer les espaces de fin de ligne à l'enregistrement" #: editor/editor_settings.cpp -#, fuzzy msgid "Autosave Interval Secs" -msgstr "Intervalle entre les auto-sauvegarde (en secondes)" +msgstr "Intervalle entre les sauvegardes automatiques (en secondes)" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Restore Scripts On Load" -msgstr "Restaurer les scripts lors du chargement" +msgstr "Restaurer les scripts au chargement" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" @@ -5761,16 +5675,15 @@ msgstr "" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "Recharger automatiquement les scripts sur changement externe" #: editor/editor_settings.cpp -#, fuzzy msgid "Create Signal Callbacks" -msgstr "Forcer les replis du shader" +msgstr "Créer des rappels de signaux" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "Trier le contour des membres alphabétiquement" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5793,9 +5706,8 @@ msgid "Caret Blink Speed" msgstr "Vitesse du clignotement du caret" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "Clic droit pour ajouter un point" +msgstr "Clic droit déplace le caret" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp @@ -5817,31 +5729,27 @@ msgstr "Délai d'auto-complétion du code" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" -msgstr "" +msgstr "Placer l'info-bulle d'appel sous la ligne actuelle" #: editor/editor_settings.cpp msgid "Callhint Tooltip Offset" -msgstr "" +msgstr "Décalage des info-bulles d'appel" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "Copier le chemin du nÅ“ud" +msgstr "Compléter les chemins de fichiers" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "Ajouter un type" +msgstr "Ajouter des indices de type" #: editor/editor_settings.cpp -#, fuzzy msgid "Use Single Quotes" -msgstr "Nouvelle Simple Tuile" +msgstr "Utiliser des simples guillemets" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Help Index" -msgstr "Afficher les aides" +msgstr "Afficher l'index d'aide" #: editor/editor_settings.cpp msgid "Help Font Size" @@ -5852,7 +5760,6 @@ msgid "Help Source Font Size" msgstr "Taille de la police de l'aide de la source" #: editor/editor_settings.cpp -#, fuzzy msgid "Help Title Font Size" msgstr "Taille de la police du titre Aide" @@ -5861,9 +5768,8 @@ msgid "Grid Map" msgstr "Grille" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "Choisissez distance :" +msgstr "Choisissez la distance" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Preview Size" @@ -5878,32 +5784,27 @@ msgid "Secondary Grid Color" msgstr "Couleur de la grille secondaire" #: editor/editor_settings.cpp -#, fuzzy msgid "Selection Box Color" -msgstr "Sélection uniquement" +msgstr "Couleur de la boîte de sélection" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "3D Gizmos" -msgstr "Gadgets" +msgstr "Manipulateurs 3D" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Gizmo Colors" -msgstr "Couleurs d'émission" +msgstr "Couleurs des manipulateurs" #: editor/editor_settings.cpp -#, fuzzy msgid "Instanced" -msgstr "Instance" +msgstr "Instancié" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "Point" +msgstr "Jointure" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5915,9 +5816,8 @@ msgid "Shape" msgstr "Forme" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Pas de la grille :" +msgstr "Pas de la grille principale" #: editor/editor_settings.cpp msgid "Grid Size" @@ -5933,55 +5833,47 @@ msgstr "Niveau minimal de division de la grille" #: editor/editor_settings.cpp msgid "Grid Division Level Bias" -msgstr "" +msgstr "Niveau de biais de la division de grille" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "Peinture GridMap" +msgstr "Plan XZ de la grille" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "Peinture GridMap" +msgstr "Plan XY de la grille" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "Peinture GridMap" +msgstr "Plan YZ de la grille" #: editor/editor_settings.cpp msgid "Default FOV" msgstr "FOV par défaut" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Near" -msgstr "Thème par défaut" +msgstr "Z proche par défaut" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Far" -msgstr "Défaut" +msgstr "Z distant par défaut" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" msgstr "Nombre de fils CPU pour calculer les cartes de lumières" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "Mode Navigation" +msgstr "Schéma de navigation" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert Y Axis" -msgstr "Modifier l'axe Y" +msgstr "Inverser l'axe Y" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert X Axis" -msgstr "Modifier l'axe X" +msgstr "Inverser l'axe X" #: editor/editor_settings.cpp msgid "Zoom Style" @@ -5996,14 +5888,12 @@ msgid "Emulate 3 Button Mouse" msgstr "Émuler souris à 3 boutons" #: editor/editor_settings.cpp -#, fuzzy msgid "Orbit Modifier" -msgstr "Trier par date de modification (moins récent au plus récent)" +msgstr "Modificateur d'orbite" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "Mode navigation" +msgstr "Modificateur panoramique" #: editor/editor_settings.cpp msgid "Zoom Modifier" @@ -6020,11 +5910,11 @@ msgstr "Mode Navigation" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "Sensibilité de l'orbite" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "Inertie de l'orbite" #: editor/editor_settings.cpp msgid "Translation Inertia" @@ -6035,152 +5925,128 @@ msgid "Zoom Inertia" msgstr "Inertie du Zoom" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "Vue libre haut" +msgstr "Vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "Créer un maillage de navigation" +msgstr "Schéma de navigation en vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "Vue libre gauche" +msgstr "Sensibilité de la vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "Vue libre gauche" +msgstr "Inertie de la vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "Modificateur de vitesse de la vue libre" +msgstr "Vitesse de base de la vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "Ralentissement de la vue libre" +msgstr "Modificateur d'activation de la vue libre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Speed Zoom Link" -msgstr "Modificateur de vitesse de la vue libre" +msgstr "Lien de zoom rapide de la vue libre" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Grid Color" msgstr "Couleur de la Grille" #: editor/editor_settings.cpp -#, fuzzy msgid "Guides Color" -msgstr "Prélever une couleur" +msgstr "Couleur des guides" #: editor/editor_settings.cpp -#, fuzzy msgid "Smart Snapping Line Color" -msgstr "Magnétisme intelligent" +msgstr "Couleur de ligne du magnétisme intelligent" #: editor/editor_settings.cpp msgid "Bone Width" msgstr "Largeur des os" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 1" -msgstr "Renommer l'item de couleur" +msgstr "Couleur d'os 1" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 2" -msgstr "Renommer l'item de couleur" +msgstr "Couleur d'os 2" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Configurer le profil sélectionné :" +msgstr "Couleur de l'os sélectionnée" #: editor/editor_settings.cpp msgid "Bone IK Color" -msgstr "" +msgstr "Couleur de cinématique inverse d'os" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Color" -msgstr "Couleur de bordure de l'Os" +msgstr "Couleur de contour d'os" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Taille du contour :" +msgstr "Taille du contour de l'os" #: editor/editor_settings.cpp -#, fuzzy msgid "Viewport Border Color" msgstr "Couleur de bordure de la fenêtre d'affichage" #: editor/editor_settings.cpp -#, fuzzy msgid "Constrain Editor View" msgstr "Restreindre la fenêtre d'Éditeur" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "Panoramique simple" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "Panoramique au défilement" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Speed" msgstr "Vitesse Panoramique" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Poly Editor" -msgstr "Éditeur UV de polygones 2D" +msgstr "Éditeur de polygones" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "Rayon de saisie par point" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "Plan précédent" +msgstr "Montrer le contour précédent" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Autorename Animation Tracks" -msgstr "Renommer l'animation" +msgstr "Renommer les pistes d'animation automatiquement" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "Créer pistes de Bézier par défaut" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Create Reset Tracks" -msgstr "Créer des pistes RESET" +msgstr "Créer pistes de réinitialisation par défaut" #: editor/editor_settings.cpp -#, fuzzy msgid "Onion Layers Past Color" -msgstr "Couleur de couche Oignon précedente" +msgstr "Couleur des couches d'oignon précedentes" #: editor/editor_settings.cpp -#, fuzzy msgid "Onion Layers Future Color" -msgstr "Couleur de la couche d'Oignon suivante" +msgstr "Couleur des couches d'oignon suivantes" #: editor/editor_settings.cpp -#, fuzzy msgid "Visual Editors" -msgstr "Editeur de groupe" +msgstr "Éditeurs visuels" #: editor/editor_settings.cpp msgid "Minimap Opacity" @@ -6197,18 +6063,16 @@ msgid "Rect" msgstr "Rect" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "Définir la position de sortie de la courbe" +msgstr "Position du Rect personnalisée" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" msgstr "Écran" #: editor/editor_settings.cpp -#, fuzzy msgid "Auto Save" -msgstr "Coupe automatique" +msgstr "Sauvegarde auto" #: editor/editor_settings.cpp msgid "Save Before Running" @@ -6225,14 +6089,12 @@ msgstr "Hôte distant" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "Supprimer un point" +msgstr "Port distant" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "Paramètres de l'éditeur" +msgstr "Certificats SSL de l’éditeur" #: editor/editor_settings.cpp msgid "HTTP Proxy" @@ -6260,7 +6122,7 @@ msgstr "Ordre de Tri" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "Couleur de symbole" #: editor/editor_settings.cpp msgid "Keyword Color" @@ -6268,29 +6130,27 @@ msgstr "Couleur des mots-clés" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "Couleur de mot clé de contrôle de flux" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "Changer le type de base" +msgstr "Couleur de base des types" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "Couleur de type du moteur" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "Couleur de type utilisateur" #: editor/editor_settings.cpp msgid "Comment Color" msgstr "Couleur des commentaires" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Stockage du fichier :" +msgstr "Couleur des chaînes de caractères" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -6299,9 +6159,8 @@ msgid "Background Color" msgstr "Couleur d’Arrière-Plan" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "Couleur de fond invalide." +msgstr "Couleur d'arrière-plan de complétion" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6329,23 +6188,20 @@ msgid "Line Number Color" msgstr "Couleur du Numéro de Ligne" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Numéro de ligne :" +msgstr "Couleur des nombres des lignes sûres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" msgstr "Couleur du caret" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "Couleur de fond invalide." +msgstr "Couleur d'arrière-plan de caret" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "Supprimer la selection" +msgstr "Couleur de texte sélectionné" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Selection Color" @@ -6353,7 +6209,7 @@ msgstr "Couleur de la Sélection" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Couleur des erreur de fermeture d'accolades" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Current Line Color" @@ -6361,26 +6217,23 @@ msgstr "Couleur de la Ligne Actuelle" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Couleur du guide de longueur de ligne" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "Coloration syntaxique" +msgstr "Couleur de surlignage des mots" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" msgstr "Couleur des nombres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Fonction" +msgstr "Couleur des fonctions" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "Renommer la variable" +msgstr "Couleur des variables de membres" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6388,33 +6241,28 @@ msgid "Mark Color" msgstr "Prélever une couleur" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "Signets" +msgstr "Couleur des signets" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "Point d'arrêts" +msgstr "Couleur des point d'arrêts" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Executing Line Color" msgstr "Couleur de la ligne d’exécution" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Couleur du repliage de code" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "Résultats de recherche" +msgstr "Couleur des résultats de recherche" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "Résultats de recherche" +msgstr "Couleur de bordure des résultats de recherche" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." @@ -6427,9 +6275,8 @@ msgid "Flat" msgstr "Plat" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "Mode collision" +msgstr "Cacher la barre de défilement" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6727,7 +6574,6 @@ msgstr "" "téléchargement est terminé." #: editor/fileserver/editor_file_server.cpp -#, fuzzy msgid "File Server" msgstr "Serveur de fichiers" @@ -7106,7 +6952,7 @@ msgstr "Collada" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "Utiliser ambiant" #: editor/import/resource_importer_bitmask.cpp msgid "Create From" @@ -7115,7 +6961,7 @@ msgstr "Créer à Partir de" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "Seuil" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -7127,7 +6973,7 @@ msgstr "Compresser" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "Délimiteur" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -7165,9 +7011,8 @@ msgstr "Mipmaps" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Anisotropic" -msgstr "Anisotropie" +msgstr "Anisotrope" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7175,9 +7020,8 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "Coupures" +msgstr "Tranches" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -7207,7 +7051,6 @@ msgstr "Décalage du maillage" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" msgstr "Compression Octaédrique" @@ -7281,9 +7124,8 @@ msgid "Storage" msgstr "Stockage" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Legacy Names" -msgstr "Utiliser des noms classiques" +msgstr "Utiliser les noms hérités" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" @@ -7303,9 +7145,8 @@ msgid "Ensure Tangents" msgstr "Modifier la tangente de courbes" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Light Baking" -msgstr "Pré-calculer les cartes de lumières" +msgstr "Pré-calculer les lumières" #: editor/import/resource_importer_scene.cpp msgid "Lightmap Texel Size" @@ -7313,24 +7154,21 @@ msgstr "Taille des Texels dans la carte de lumières" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "Enveloppes" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "Utiliser le magnétisme d'échelle" +msgstr "Utiliser les enveloppes nommées" #: editor/import/resource_importer_scene.cpp msgid "External Files" msgstr "Fichiers externes" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Store In Subdir" msgstr "Stocker dans un sous-dossier" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" msgstr "Filtrer les scripts" @@ -7366,17 +7204,14 @@ msgid "Max Angular Error" msgstr "Erreur Angulaire Max" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "Valeur" +msgstr "Angle maximal" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "Supprimer la piste d’animation" +msgstr "Retirer les pistes inutilisées" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" msgstr "Clips d'animation" @@ -7464,7 +7299,7 @@ msgstr "Mode HDR" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp @@ -7482,9 +7317,8 @@ msgid "Fix Alpha Border" msgstr "Corriger la bordure alpha" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Premult Alpha" -msgstr "Modifier le polygone" +msgstr "Alpha pré-multiplié" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" @@ -7528,13 +7362,12 @@ msgid "Import Mode" msgstr "Mode d'Importation" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Crop To Region" -msgstr "Définir la région de la tuile" +msgstr "Rogner vers la région" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "Rogner les bordures alpha de la région" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp msgid "Force" @@ -7559,7 +7392,7 @@ msgstr "Taux maximal en Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "Rogner" #: editor/import/resource_importer_wav.cpp msgid "Normalize" @@ -7667,7 +7500,6 @@ msgid "Raw" msgstr "Brut" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" msgstr "Majuscule à chaque mot" @@ -8481,7 +8313,7 @@ msgstr "Mélange 1 :" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "X-Fade Time (s):" -msgstr "Durée du fondu (s) :" +msgstr "Durée du fondu croisé (s) :" #: editor/plugins/animation_tree_player_editor_plugin.cpp #: editor/plugins/visual_shader_editor_plugin.cpp @@ -9722,7 +9554,6 @@ msgid "Swap GradientTexture2D Fill Points" msgstr "Échanger les points de remplissage du GradientTexture2D" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Swap Gradient Fill Points" msgstr "Échanger les points de remplissage du dégradé" @@ -10020,14 +9851,12 @@ msgid "Update from Scene" msgstr "Mettre à jour depuis la scène" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "Appliquer la transformation du MeshInstance" +msgstr "Appliquer sans transformations" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "Appliquer la transformation du MeshInstance" +msgstr "Appliquer avec transformations" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -10904,9 +10733,8 @@ msgid "Exec Path" msgstr "Chemin d'exécution" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script Temperature Enabled" -msgstr "Sélectionner le fichier de modèles" +msgstr "Température de script activée" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" @@ -10914,16 +10742,15 @@ msgstr "Mettre en évidence le script actuel" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "Taille de l'historique des températures de script" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" msgstr "Couleur d'Arrière-Plan du Script Actuel" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Group Help Pages" -msgstr "Groupe sélectionné" +msgstr "Pages d'aide de groupe" #: editor/plugins/script_editor_plugin.cpp msgid "Sort Scripts By" @@ -11756,11 +11583,11 @@ msgstr "Post" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "Taille des manipulateurs" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "Opacité des manipulateurs" #: editor/plugins/spatial_editor_plugin.cpp msgid "Show Viewport Rotation Gizmo" @@ -11921,9 +11748,8 @@ msgid "New Animation" msgstr "Nouvelle animation" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Filtrer les méthodes" +msgstr "Filtrer les animations" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12395,9 +12221,8 @@ msgid "Select Another Theme Resource:" msgstr "Sélectionnez une autre ressource Theme :" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme Resource" -msgstr "Ressource de Thème" +msgstr "Ressource de thème" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -12453,9 +12278,8 @@ msgid "Add Item Type" msgstr "Ajouter un item de type" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Variation Base Type" -msgstr "Définir type de variable" +msgstr "Définir le type parent de la variation" #: editor/plugins/theme_editor_plugin.cpp msgid "Set Base Type" @@ -12481,15 +12305,16 @@ msgstr "Surcharge tous les items de type par défaut." #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." msgstr "" +"Choisissez le type parent de la variation depuis la liste des types " +"disponibles." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." msgstr "" -"Un type affilié à une classe intégré ne peut pas être marqué comme une " -"variante d'un autre type." +"Un type affilié à une classe intégrée ne peut pas être marqué comme variante " +"d'un autre type." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12756,9 +12581,8 @@ msgid "Sort Tiles By Name" msgstr "Trier les tuiles par nom" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill Preview" -msgstr "Remplissage du seau" +msgstr "Aperçu du remplissage" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp @@ -13152,9 +12976,8 @@ msgid "Texture" msgstr "Texture" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "Décalage d’Octet" +msgstr "Décalage de texture" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -13168,14 +12991,12 @@ msgid "Modulate" msgstr "Moduler" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tile Mode" -msgstr "Basculer le mode" +msgstr "Mode de tuile" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "Mode Bitmask" +msgstr "Mode de masque d'octet de tuile auto" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Size" @@ -13206,28 +13027,24 @@ msgid "Selected Collision" msgstr "Collision sélectionné" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "Sélection uniquement" +msgstr "Collision à sens unique de la sélection" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "Mode collision" +msgstr "Marge de collision à sens unique de la sélection" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Selected Navigation" msgstr "Navigation sélectionnée" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Occlusion" -msgstr "Sélectionner" +msgstr "Occultation de la sélection" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "Filtrer les scripts" +msgstr "Script de palette de tuiles" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" @@ -14450,7 +14267,7 @@ msgstr "Plus d'informations..." #: editor/project_export.cpp msgid "Export PCK/Zip..." -msgstr "Exporter le PCK/ZIP" +msgstr "Exporter le PCK/ZIP..." #: editor/project_export.cpp msgid "Export Project..." @@ -15516,7 +15333,7 @@ msgstr "Supprimer le nÅ“ud \"%s\" et ses enfants ?" #: editor/scene_tree_dock.cpp msgid "Delete node \"%s\"?" -msgstr "Supprimer le noeud \"%s\" ?" +msgstr "Supprimer le nÅ“ud \"%s\" ?" #: editor/scene_tree_dock.cpp msgid "" @@ -15693,7 +15510,7 @@ msgstr "Ressources secondaires" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "Accéder en tant que nom unique de scène" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15793,18 +15610,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "Effacer l'héritage ? (Pas de retour en arrière !)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "Afficher la sélection de la racine de l'arborescence" +msgstr "Afficher la sélection de la racine de la hiérarchie de la scène" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "Dériver les Globals de scripts par nom" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "Encadrer la sélection" +msgstr "Utiliser la sélection racine des favoris" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -16126,7 +15941,7 @@ msgstr "Filtrer les variables de la pile" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "Basculer automatiquement vers l'arborescence de scène distante" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" @@ -16134,7 +15949,7 @@ msgstr "Intervalle de rafraîchissement de l'arborescence distante" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "Intervalle de rafraîchissement d'inspection distante" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -16232,9 +16047,8 @@ msgid "Change Light Radius" msgstr "Changer le rayon d'une lumière" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Stream Player 3D" -msgstr "Émetteur de flux sonore 3D" +msgstr "Émetteur de flux 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -16279,9 +16093,8 @@ msgid "GI Probe" msgstr "Sonde GI" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "Éclairage indirect" +msgstr "Éclairage indirect pré-calculé" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -16320,22 +16133,20 @@ msgid "Navigation Edge Disabled" msgstr "Bord de la Navigation Désactivé" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid" -msgstr "Mode Navigation" +msgstr "Solide de navigation" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid Disabled" -msgstr "Mode Navigation" +msgstr "Solide de navigation désactivé" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "Jointure Corps A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "Jointure Corps B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" @@ -16343,7 +16154,7 @@ msgstr "Bord de la pièce" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "Chevauchement de salle" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" @@ -16359,7 +16170,7 @@ msgstr "Bords du portail" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "Flèche de portail" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -16387,44 +16198,38 @@ msgid "Set Occluder Sphere Position" msgstr "Définir la position de la sphère de l'occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "Définir la position du point du Portal" +msgstr "Définir la position ponctuelle du polygone occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "Définir la position du point de la courbe" +msgstr "Définir la position ponctuelle du trou occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "Créer un polygone occulteur" +msgstr "Avant du polygone occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "Créer un polygone occulteur" +msgstr "Arrière du polygone occulteur" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "Créer un polygone occulteur" +msgstr "Trou occulteur" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "Calculs de physique de Godot" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "Utiliser BVH" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "Mode collision" +msgstr "Marge de collision BVH" #: main/main.cpp msgid "Crash Handler" @@ -16460,7 +16265,7 @@ msgstr "Maximum d'avertissements par secondes" #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "Vider stdout à l'impression" #: main/main.cpp servers/visual_server.cpp msgid "Logging" @@ -16500,11 +16305,11 @@ msgstr "" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "PPP" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "Autoriser PPP élevé" #: main/main.cpp msgid "V-Sync" @@ -16548,7 +16353,7 @@ msgstr "" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "Portable" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -16588,7 +16393,7 @@ msgstr "Sortie Standard" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "Afficher les FPS" #: main/main.cpp msgid "Verbose stdout" @@ -16632,7 +16437,7 @@ msgstr "Pointage" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "Retard d'appui" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" @@ -16643,9 +16448,8 @@ msgid "Shaders" msgstr "Shaders" #: main/main.cpp -#, fuzzy msgid "Debug Shader Fallbacks" -msgstr "Forcer les replis du shader" +msgstr "Valeurs de repli du shader de débogage" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp @@ -16691,7 +16495,7 @@ msgstr "Icône native de Windows" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "Mise en mémoire tampon" #: main/main.cpp msgid "Agile Event Flushing" @@ -16722,9 +16526,8 @@ msgid "Tooltip Position Offset" msgstr "Décalage de la position des info-bulles" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "Débogueur" +msgstr "Agent du débogueur" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait For Debugger" @@ -16736,11 +16539,11 @@ msgstr "Délai d'Attente" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "Exécution" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "Politique d'exceptions non gérées" #: main/main.cpp msgid "Main Loop Type" @@ -16764,14 +16567,12 @@ msgid "Auto Accept Quit" msgstr "Accepter automatiquement la fermeture" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "Retourner" +msgstr "Quitter au retour" #: main/main.cpp scene/main/viewport.cpp -#, fuzzy msgid "Snap Controls To Pixels" -msgstr "Aimanter aux flancs du nÅ“ud" +msgstr "Aimanter les contrôles aux pixels" #: main/main.cpp msgid "Dynamic Fonts" @@ -16779,7 +16580,7 @@ msgstr "Polices Dynamiques" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "Utiliser le suréchantillonnage" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" @@ -16806,35 +16607,30 @@ msgid "Change Torus Outer Radius" msgstr "Changer le rayon extérieur de la tour" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Operation" -msgstr "Options" +msgstr "Opération" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" msgstr "Calculer les Tangentes" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "Collision" +msgstr "Utiliser les collisions" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "Mode collision" +msgstr "Couche des collisions" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "Mode collision" +msgstr "Masque de collisions" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Invert Faces" -msgstr "Modifier la casse" +msgstr "Inverses les faces" #: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp @@ -16852,57 +16648,50 @@ msgid "Radial Segments" msgstr "Segments radiaux" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Rings" -msgstr "Avertissements" +msgstr "Anneaux" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Smooth Faces" -msgstr "Progression douce" +msgstr "Adoucir les faces" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "Afficher les guides" +msgstr "Côtés" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "Cone" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "Changer le rayon intérieur de la tour" +msgstr "Rayon intérieur" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "Changer le rayon extérieur de la tour" +msgstr "Rayon extérieur" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "Côtés de l'anneau" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "Polygon" -msgstr "Polygones" +msgstr "Polygone" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "Degrés de tour" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "Côtés du tour" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Node" -msgstr "Coller les nÅ“uds" +msgstr "Noeud de chemin" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16911,35 +16700,31 @@ msgstr "Créer un vertex interne" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "Intervalle de chemin" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "Simplification d'angle de chemin" #: modules/csg/csg_shape.cpp msgid "Path Rotation" msgstr "Rotation du chemin" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "Rendre local" +msgstr "Chemin local" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Continuous U" -msgstr "Continu" +msgstr "Chemin Continu U" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "Choisissez distance :" +msgstr "Distance du chemin U" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Joined" -msgstr "Rotation aléatoire :" +msgstr "Chemin joint" #: modules/enet/networked_multiplayer_enet.cpp msgid "Compression Mode" @@ -16959,7 +16744,7 @@ msgstr "Toujours ordonnée" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "Relais serveur" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" @@ -16986,9 +16771,8 @@ msgid "Config File" msgstr "Fichier de Configuration" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "Charger une ressource" +msgstr "Charger une fois" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -17208,9 +16992,8 @@ msgid "Sparse Indices Byte Offset" msgstr "" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "Analyse de la géométrie..." +msgstr "Type de composant d'indices épars" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -17284,9 +17067,8 @@ msgid "Blend Weights" msgstr "Précalculer les lightmaps" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Instance Materials" -msgstr "Changements de matériau :" +msgstr "Matériaux d'instances" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp msgid "Parent" @@ -17299,25 +17081,21 @@ msgstr "Plateforme" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "Enveloppe" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Translation" -msgstr "Traductions" +msgstr "Translation" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Children" -msgstr "Enfants modifiables" +msgstr "Enfants" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints" -msgstr "Point" +msgstr "Jointures" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Roots" msgstr "Racines" @@ -17326,48 +17104,42 @@ msgid "Unique Names" msgstr "Noms Uniques" #: modules/gltf/gltf_skeleton.cpp -#, fuzzy msgid "Godot Bone Node" -msgstr "Le nÅ“ud de la scène" +msgstr "NÅ“ud d'os de Godot" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "Nouvelle racine de scène" +msgstr "Racine de l'enveloppe" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints Original" -msgstr "Focaliser l'origine" +msgstr "Jointure à l'original" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Inverser les liens" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Non Joints" -msgstr "Déplacer la jointure" +msgstr "Non jointures" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Jointure I à os I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Jointure I à nom" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Enveloppe Godot" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Diffuse Img" msgstr "Image Diffuse" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Diffuse Factor" msgstr "Facteur de diffusion" @@ -17385,50 +17157,44 @@ msgstr "" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Major Version" -msgstr "Version" +msgstr "Version majeure" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Minor Version" -msgstr "Version" +msgstr "Version mineure" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "GLB Data" -msgstr "Avec données" +msgstr "Données GLB" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" -msgstr "" +msgstr "Utiliser les liens d'enveloppe par nom" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Vue de derrière" +msgstr "Vues tampon" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "Accesseurs" #: modules/gltf/gltf_state.cpp msgid "Scene Name" msgstr "Nom de la Scène" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Root Nodes" -msgstr "Nom de nÅ“ud racine" +msgstr "NÅ“uds racines" #: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp -#, fuzzy msgid "Textures" -msgstr "Fonctionnalités" +msgstr "Textures" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" @@ -17439,42 +17205,36 @@ msgid "Cameras" msgstr "Caméras" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp -#, fuzzy msgid "Lights" -msgstr "Lumière" +msgstr "Lumières" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Unique Animation Names" -msgstr "Nom de la nouvelle animation :" +msgstr "Noms d'animations uniques" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeletons" -msgstr "Squelette" +msgstr "Squelettes" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeleton To Node" -msgstr "Sélectionner un nÅ“ud" +msgstr "Squelette vers nÅ“ud" #: modules/gltf/gltf_state.cpp msgid "Animations" msgstr "Animations" #: modules/gltf/gltf_texture.cpp -#, fuzzy msgid "Src Image" -msgstr "Afficher les os" +msgstr "Image source" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" msgstr "Librairie de maillages" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "Image physique %" +msgstr "Matériau physique" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp #, fuzzy @@ -17486,24 +17246,20 @@ msgid "Cell" msgstr "Cellule" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Octant Size" -msgstr "Vue de devant" +msgstr "Taille d'octant" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center X" -msgstr "Centre" +msgstr "X du centre" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Y" -msgstr "Centre" +msgstr "Y du centre" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Z" -msgstr "Centre" +msgstr "Z du centre" #: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp @@ -17512,17 +17268,15 @@ msgid "Mask" msgstr "Masque" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navigation" +msgstr "Pré-calculer la navigation" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "Mode Navigation" +msgstr "Calques de navigation" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17710,7 +17464,6 @@ msgid "Loop Offset" msgstr "Décalage de Boucle" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Eye Height" msgstr "Hauteur de l’œil" @@ -17729,15 +17482,15 @@ msgstr "Afficher sans ombrage" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "Suréchantillonner" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17824,14 +17577,13 @@ msgstr "C'est fait !" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "Sans bord" #: modules/opensimplex/noise_texture.cpp msgid "As Normal Map" msgstr "En tant que carte de normales" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Bump Strength" msgstr "Force du bossage" @@ -17840,12 +17592,10 @@ msgid "Noise" msgstr "Bruit" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Noise Offset" -msgstr "Décalage de la grille :" +msgstr "Décalage du bruit" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Octaves" msgstr "Octaves" @@ -17854,28 +17604,24 @@ msgid "Period" msgstr "Période" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "Perspective" +msgstr "Persistance" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "Lacunarité" #: modules/regex/regex.cpp -#, fuzzy msgid "Subject" msgstr "Sujet" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" -msgstr "Nom" +msgstr "Noms" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "Paramètres :" +msgstr "Paramètres" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -17883,39 +17629,35 @@ msgstr "" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Révéler le port local" #: modules/upnp/upnp.cpp msgid "Discover IPv6" msgstr "Découvrir IPv6" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Description URL" -msgstr "Description" +msgstr "URL de description" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Service Type" -msgstr "Définir type de variable" +msgstr "Type du service" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "URL de contrôle IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "Définir type de variable" +msgstr "Type de service IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" msgstr "" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "État" +msgstr "État IGD" #: modules/visual_script/visual_script.cpp msgid "" @@ -17956,9 +17698,8 @@ msgid "Stack overflow with stack depth:" msgstr "Débordement de pile avec profondeur de pile :" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Visual Script" -msgstr "Rechercher VisualScript" +msgstr "Script graphique" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18294,9 +18035,8 @@ msgid "Return Enabled" msgstr "Exécutable" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "Retour" +msgstr "Type de retour" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18344,7 +18084,6 @@ msgid "in order:" msgstr "dans l'ordre :" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" msgstr "Pas" @@ -18366,9 +18105,8 @@ msgstr "Est-ce %s ?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Base Script" -msgstr "Nouveau script" +msgstr "Script de base" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" @@ -18380,36 +18118,31 @@ msgstr "On Self" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Call Mode" -msgstr "Mode mise à l'échelle" +msgstr "Mode d'appel" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Type" -msgstr "Changer le type de base" +msgstr "Type simple" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Node Path" -msgstr "Copier le chemin du nÅ“ud" +msgstr "Chemin de nÅ“ud" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Use Default Args" -msgstr "Réinitialiser" +msgstr "Utiliser les valeurs d'arguments par défaut" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Validate" msgstr "Valider" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Mode mise à l'échelle" +msgstr "Mode d'appel RPC" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Subtract %s" @@ -18448,14 +18181,12 @@ msgid "BitXor %s" msgstr "Ou-exclusif par bit %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Set Mode" -msgstr "Mode sélection" +msgstr "Définir le mode" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Assign Op" -msgstr "Assigner" +msgstr "Opérateur d'assignation" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -18472,9 +18203,8 @@ msgid "Base object is not a Node!" msgstr "L'objet de base n'est pas un nÅ“ud !" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead to Node!" -msgstr "Le chemin ne mène pas au nÅ“ud !" +msgstr "Le chemin ne mène pas vers un nÅ“ud !" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." @@ -18490,9 +18220,8 @@ msgstr "Composer le tableau" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Itérateur" +msgstr "Opérateur" #: modules/visual_script/visual_script_nodes.cpp msgid "Invalid argument of type:" @@ -18507,9 +18236,8 @@ msgid "a if cond, else b" msgstr "a if cond, else b" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Var Name" -msgstr "Nom" +msgstr "Nom de variable" #: modules/visual_script/visual_script_nodes.cpp msgid "VariableGet not found in script:" @@ -18634,9 +18362,8 @@ msgid "%s sec(s)" msgstr "%s seconde(s)" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp -#, fuzzy msgid "Wait Time" -msgstr "Peindre la tuile" +msgstr "Temps d'attente" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "WaitSignal" @@ -18651,16 +18378,14 @@ msgid "WaitInstanceSignal" msgstr "WaitInstanceSignal" #: modules/webrtc/webrtc_data_channel.cpp -#, fuzzy msgid "Write Mode" -msgstr "Mode prioritaire" +msgstr "Mode écriture" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" msgstr "WebRTC" #: modules/webrtc/webrtc_data_channel.h -#, fuzzy msgid "Max Channel In Buffer (KB)" msgstr "Maximum de canal dans le tampon (Ko)" @@ -18673,61 +18398,52 @@ msgid "Trusted SSL Certificate" msgstr "Certificat SSL Fiable" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "Profileur réseau" +msgstr "Client WebSocket" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Buffer (KB)" -msgstr "Taille Maximale (KB)" +msgstr "Maximum tampon entrant (KB)" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Packets" -msgstr "Maximum par paquet" +msgstr "Maximum de paquets entrant" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max Out Buffer (KB)" -msgstr "Taille Maximale (KB)" +msgstr "Maximum tampon sortant (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" -msgstr "" +msgstr "Maximum de paquets sortant" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "Profileur réseau" +msgstr "Server WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "Lier IP" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Private Key" -msgstr "Chemin de la clé privée SSH" +msgstr "Clé privée" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" msgstr "Certificat SSL" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "CA Chain" -msgstr "Effacer la chaîne IK" +msgstr "Chaîne d’autorité de certificat (CA)" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Handshake Timeout" -msgstr "Délai dépassé." +msgstr "Délai de poignée de main expiré" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Session Mode" -msgstr "Mode Région" +msgstr "Mode de session" #: modules/webxr/webxr_interface.cpp msgid "Required Features" @@ -18742,18 +18458,17 @@ msgid "Requested Reference Space Types" msgstr "" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Reference Space Type" -msgstr "" +msgstr "Type de référentiel spatial" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Visibility State" -msgstr "Basculer la visibilité" +msgstr "État de la visibilité" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Bounds Geometry" -msgstr "Réessayer" +msgstr "Géométrie des limites" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18779,14 +18494,13 @@ msgstr "" #: platform/android/export/export.cpp msgid "Force System User" -msgstr "" +msgstr "Forcer l'utilisateur système" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Fermer ADB à la sortie" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Launcher Icons" msgstr "Icônes du lanceur" @@ -18861,27 +18575,22 @@ msgid "Keystore" msgstr "Débogueur" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Debug User" -msgstr "Débogueur" +msgstr "Utilisateur de débogage" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Password" -msgstr "Mot de passe" +msgstr "Mot de passe de débogage" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release User" -msgstr "Publication (release)" +msgstr "Utilisateur de publication (release)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release Password" -msgstr "Mot de passe" +msgstr "Mot de passe de publication" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "One Click Deploy" msgstr "Déploiement en un clic" @@ -18894,18 +18603,16 @@ msgid "Code" msgstr "Code" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Empaquetage" +msgstr "Paquetage" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Unique Name" msgstr "Nom unique" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "Signaux" +msgstr "Signé" #: platform/android/export/export_plugin.cpp msgid "Classify As Game" @@ -18916,9 +18623,8 @@ msgid "Retain Data On Uninstall" msgstr "Conserver les données lors de la désinstallation" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exclude From Recents" -msgstr "Supprimer des nÅ“uds" +msgstr "Exclure des récents" #: platform/android/export/export_plugin.cpp msgid "Graphics" @@ -18937,17 +18643,16 @@ msgid "XR Mode" msgstr "Mode XR" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Hand Tracking" -msgstr "Empaquetage" +msgstr "Suivi des mains" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Fréquence de suivi des mains" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "Relais" #: platform/android/export/export_plugin.cpp msgid "Immersive Mode" @@ -18974,9 +18679,8 @@ msgid "Support Xlarge" msgstr "Support" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "Interface utilisateur" +msgstr "Sauvegarde(backup) des données utilisateur" #: platform/android/export/export_plugin.cpp msgid "Allow" @@ -19209,20 +18913,17 @@ msgstr "" #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Signaux" +msgstr "Signature du code" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"Impossible de trouver 'apksigner'.\n" -"Veuillez vérifier que la commande est disponible dans le dossier build-tools " -"du SDK Android.\n" -"Le paquet sortant %s est non signé." +"Impossible de trouver 'apksigner'. Veuillez vérifier que la commande est " +"disponible dans le dossier build-tools du SDK Android. Le %s resultant n'est " +"pas signé." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19237,9 +18938,8 @@ msgid "Could not find keystore, unable to export." msgstr "Impossible de trouver le keystore, impossible d'exporter." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Impossible de démarrer le sous-processus !" +msgstr "Impossible de le programme apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19276,9 +18976,8 @@ msgstr "" "*.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Format d'export non supporté !\n" +msgstr "Format d'export non supporté !" #: platform/android/export/export_plugin.cpp msgid "" @@ -19290,28 +18989,24 @@ msgstr "" "menu 'Projet'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"La version d'Android ne correspond pas :\n" -" Modèle installé : %s\n" -" Version Godot : %s\n" -"Veuillez réinstaller la version d'Android depuis le menu 'Projet'." +"La version compilée d'Android ne correspond pas : Modèle type installé : %s, " +"Version de Godot : %s. Veuillez réinstaller le modèle type de compilation " +"d'Android depuis le menu 'Projet'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "Impossible d'écraser les fichiers res://android/build/res/*.xml avec le nom " -"du projet" +"du projet." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Impossible d'exporter les fichiers du projet vers le projet gradle\n" +msgstr "Impossible d'exporter les fichiers du projet vers le projet gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19322,15 +19017,13 @@ msgid "Building Android Project (gradle)" msgstr "Construire le Project Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" "La construction du projet Android a échoué, vérifiez la sortie pour " -"l'erreur.\n" -"Sinon, visitez docs.godotengine.org pour la documentation de construction " -"Android." +"l'erreur. Sinon, visitez docs.godotengine.org pour la documentation de " +"construction Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19345,41 +19038,38 @@ msgstr "" "du projet gradle pour les journaux." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Paquet non trouvé : %s" +msgstr "Paquet non trouvé : \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Création de l'APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." msgstr "" -"Impossible de trouver le modèle de l'APK à exporter :\n" -"%s" +"La construction du projet Android a échoué, vérifiez la sortie pour " +"l'erreur. Sinon, visitez docs.godotengine.org pour la documentation de " +"construction Android." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Bibliothèques manquantes dans le modèle d'exportation pour les architectures " -"sélectionnées : %s.\n" -"Veuillez construire un modèle avec toutes les bibliothèques requises, ou " -"désélectionner les architectures manquantes dans le préréglage d'exportation." +"sélectionnées : %s. Veuillez construire un modèle avec toutes les " +"bibliothèques requises, ou désélectionner les architectures manquantes dans " +"le préréglage d'exportation." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Ajout de fichiers..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Impossible d'exporter les fichiers du projet" +msgstr "Impossible d'exporter les fichiers du projet." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19419,7 +19109,7 @@ msgstr "iPad 2048 X 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" -msgstr "" +msgstr "Écrans de lancement en mode portrait" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" @@ -19451,38 +19141,35 @@ msgstr "iPhone 1242 X 2208" #: platform/iphone/export/export.cpp msgid "App Store Team ID" -msgstr "" +msgstr "ID de groupe de l'App Store" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Debug" -msgstr "" +msgstr "UUID de provisionnement de profils en débogage" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Debug" -msgstr "" +msgstr "Identité de signature de code en débogage" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Debug" -msgstr "Exporter avec debug" +msgstr "Méthode d'exportation en débogage" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Release" -msgstr "" +msgstr "UUID de provisionnement de profils en publication" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Release" -msgstr "" +msgstr "Identité de signature de code en publication" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "Mode d'exportation :" +msgstr "Méthode d'exportation en publication" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Targeted Device Family" -msgstr "Famille de système cible" +msgstr "Famille de système ciblée" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" @@ -19514,9 +19201,8 @@ msgid "Access Wi-Fi" msgstr "Accès Wi-Fi" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Push Notifications" -msgstr "Rotation aléatoire :" +msgstr "Notifications Push" #: platform/iphone/export/export.cpp msgid "User Data" @@ -19524,33 +19210,29 @@ msgstr "Données Utilisateur" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" -msgstr "" +msgstr "Accessible depuis l'application Files" #: platform/iphone/export/export.cpp msgid "Accessible From iTunes Sharing" -msgstr "" +msgstr "Accessible depuis le partage iTunes" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Privacy" msgstr "Confidentialité" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "Description" +msgstr "Description d'utilisation de la caméra" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "Description des propriétés" +msgstr "Description d'utilisation du microphone" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Photolibrary Usage Description" -msgstr "Description des propriétés" +msgstr "Description d'utilisation de la bibliothèque d'image" #: platform/iphone/export/export.cpp -#, fuzzy msgid "iPhone 120 X 120" msgstr "iPhone 120 X 120" @@ -19568,19 +19250,19 @@ msgstr "iPad 152 X 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "" +msgstr "iPad 167 X 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "App Store 1024 X 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" -msgstr "" +msgstr "Projecteur 40 X 40" #: platform/iphone/export/export.cpp msgid "Spotlight 80 X 80" -msgstr "" +msgstr "Projecteur 80 X 80" #: platform/iphone/export/export.cpp msgid "Storyboard" @@ -19591,19 +19273,16 @@ msgid "Use Launch Screen Storyboard" msgstr "" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Mode mise à l'échelle" +msgstr "Mode de mise à l'échelle d'image" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @2x" -msgstr "NÅ“ud Personnalisé" +msgstr "Image personnalisée @2x" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @3x" -msgstr "NÅ“ud Personnalisé" +msgstr "Image personnalisée @3x" #: platform/iphone/export/export.cpp msgid "Use Custom BG Color" @@ -19704,7 +19383,7 @@ msgstr "" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" -msgstr "" +msgstr "Politique de redimensionnement du canevas" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" @@ -19803,18 +19482,16 @@ msgid "Already signed!" msgstr "Déjà signé !" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to process nested resources." -msgstr "Impossible de charger la ressource." +msgstr "Le traitement des ressources imbriquées a échoué." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." msgstr "Échec lors de la création du sous-dossier _CodeSignature." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to get CodeResources hash." -msgstr "Impossible de charger la ressource." +msgstr "La récupération du hachage de CodeResources a échouée." #: platform/osx/export/codesign.cpp platform/osx/export/export.cpp #, fuzzy @@ -19826,7 +19503,6 @@ msgid "Invalid executable file." msgstr "Fichier exécutable invalide." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Can't resize signature load command." msgstr "Impossible de redimensionner la commande de chargement des signatures." @@ -19847,75 +19523,65 @@ msgid "App Category" msgstr "Catégorie de l'application" #: platform/osx/export/export.cpp -#, fuzzy msgid "High Res" msgstr "Haute Résolution" #: platform/osx/export/export.cpp -#, fuzzy msgid "Location Usage Description" -msgstr "Description" +msgstr "Description d'utilisation de la géolocalisation" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Description d'utilisation du carnet d'adresse" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "Description" +msgstr "Description d'utilisation du calendrier" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library Usage Description" -msgstr "Description des propriétés" +msgstr "Description d'utilisation de la bibliothèque photo" #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "Descriptions des méthodes" +msgstr "Description d'utilisation du dossier Bureau" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "Descriptions des méthodes" +msgstr "Description d'utilisation du dossier Documents" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Description d'utilisation du dossier Téléchargements" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" -msgstr "" +msgstr "Description d'utilisation des disques réseau" #: platform/osx/export/export.cpp msgid "Removable Volumes Usage Description" -msgstr "" +msgstr "Description d'utilisation des disques amovibles" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Codesign" -msgstr "NÅ“ud" +msgstr "Signature du code" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity" -msgstr "Indenter vers la gauche" +msgstr "Identité" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Timestamp" -msgstr "Temps" +msgstr "Horodatage" #: platform/osx/export/export.cpp msgid "Hardened Runtime" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Replace Existing Signature" -msgstr "Remplacer dans les fichiers" +msgstr "Remplacer la signature existante" #: platform/osx/export/export.cpp #, fuzzy @@ -19923,9 +19589,8 @@ msgid "Entitlements" msgstr "Gadgets" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "NÅ“ud Personnalisé" +msgstr "Fichier personnalisé" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" @@ -19960,43 +19625,37 @@ msgid "Photos Library" msgstr "Bibliothèque de photos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Ajouter évènement" +msgstr "Événements Apple" #: platform/osx/export/export.cpp -#, fuzzy msgid "Debugging" msgstr "Débogage" #: platform/osx/export/export.cpp -#, fuzzy msgid "App Sandbox" msgstr "Bac à sable de l'application" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Profileur réseau" +msgstr "Serveur réseau" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Profileur réseau" +msgstr "Client réseau" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "Périphérique" +msgstr "Périphérique USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" -msgstr "" +msgstr "Périphérique Bluetooth" #: platform/osx/export/export.cpp #, fuzzy msgid "Files Downloads" -msgstr "Télécharger" +msgstr "Téléchargement de fichiers" #: platform/osx/export/export.cpp #, fuzzy @@ -20014,9 +19673,8 @@ msgid "Files Movies" msgstr "Filtrer les tuiles" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Options de bus" +msgstr "Options personnalisées" #: platform/osx/export/export.cpp #, fuzzy @@ -20025,31 +19683,27 @@ msgstr "Localisation" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nom Apple ID" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple ID Password" -msgstr "Mot de passe" +msgstr "Mot de passe Apple ID" #: platform/osx/export/export.cpp msgid "Apple Team ID" msgstr "Apple Team ID" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Impossible d'exporter les fichiers du projet" +msgstr "Impossible d'ouvrir le fichier d'icône \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Impossible de démarrer le sous-processus !" +msgstr "Impossible de démarrer le sous-processus." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Localisation" +msgstr "Notarisation échouée." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20082,6 +19736,8 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" msgstr "" +"L'horodatage n'est pas compatible avec la signature ad-hoc et a été " +"désactivé !" #: platform/osx/export/export.cpp msgid "" @@ -20094,7 +19750,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." -msgstr "" +msgstr "CodeSign intégré nécessite le module regex." #: platform/osx/export/export.cpp msgid "" @@ -20109,9 +19765,8 @@ msgid "No identity found." msgstr "Aucune identité trouvée." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Erreur lors de l'enregistrement du fichier : %s" +msgstr "Impossible de signer le fichier %s." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -20120,17 +19775,14 @@ msgstr "" "cassé !" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Directions" +msgstr "Création du DMG" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Impossible de démarrer le sous-processus !" +msgstr "Impossible de démarrer le programme hdiutil." #: platform/osx/export/export.cpp -#, fuzzy msgid "`hdiutil create` failed - file exists." msgstr "`hdiutil create` a échoué - le fichier existe." @@ -20139,19 +19791,16 @@ msgid "`hdiutil create` failed." msgstr "`hdiutil create` a échoué." #: platform/osx/export/export.cpp -#, fuzzy msgid "Creating app bundle" -msgstr "Création de l'aperçu" +msgstr "Création du paquet d'application" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Impossible de trouver le modèle de l'application à exporter :" +msgstr "Impossible de trouver le modèle de l'application à exporter : \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Modèle d'exportation non valide :" +msgstr "Format d'export invalide." #: platform/osx/export/export.cpp msgid "" @@ -20178,10 +19827,13 @@ msgid "" "Ad-hoc signed applications require the 'Disable Library Validation' " "entitlement to load dynamic libraries." msgstr "" +"La signature d'applications ad-hoc nécessite la permission \"Désactiver la " +"validation de bibliothèque\" pour pouvoir charger dynamiquement les " +"bibliothèques." #: platform/osx/export/export.cpp msgid "Code signing bundle" -msgstr "" +msgstr "Paquet de signature du code" #: platform/osx/export/export.cpp msgid "Making DMG" @@ -20189,7 +19841,7 @@ msgstr "Création du DMG" #: platform/osx/export/export.cpp msgid "Code signing DMG" -msgstr "" +msgstr "DMG de signature du code" #: platform/osx/export/export.cpp msgid "Making ZIP" @@ -20208,14 +19860,12 @@ msgid "Sending archive for notarization" msgstr "Envoi de l'archive pour la certification" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Projet" +msgstr "Création ZIP" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Impossible d'exporter les fichiers du projet vers le projet gradle\n" +msgstr "Impossible d'ouvrir le fichier à lire au chemin \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20245,14 +19895,13 @@ msgstr "" "supporté." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Code signing is required for notarization." -msgstr "Certification : signature du code requise." +msgstr "" +"Notarisation : La signature du code est nécessaire pour la notarisation." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Hardened runtime is required for notarization." -msgstr "Certification : exécution renforcée requise." +msgstr "Notarisation : exécution renforcée nécessaire pour la notarisation." #: platform/osx/export/export.cpp #, fuzzy @@ -20294,6 +19943,8 @@ msgstr "" msgid "" "Timestamping is not compatible with ad-hoc signature, and will be disabled!" msgstr "" +"L'horodatage n'est pas compatible avec la signature ad-hoc et a été " +"désactivé !" #: platform/osx/export/export.cpp msgid "" @@ -20356,17 +20007,15 @@ msgstr "macOS" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" -msgstr "" +msgstr "Forcer CodeSign intégré" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Architecture" -msgstr "Ajouter une entrée architecture" +msgstr "Architecture" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Display Name" -msgstr "Tout afficher" +msgstr "Afficher le nom" #: platform/uwp/export/export.cpp msgid "Short Name" @@ -20374,36 +20023,31 @@ msgstr "Nom Abrégé" #: platform/uwp/export/export.cpp msgid "Publisher" -msgstr "" +msgstr "Publicateur" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher Display Name" -msgstr "Nom d'affichage d'éditeur du paquet invalide." +msgstr "Nom d'affichage de l'éditeur du paquet" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Product GUID" -msgstr "GUID produit invalide." +msgstr "GUID du produit" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Publisher GUID" -msgstr "Effacé Guides" +msgstr "GUID du publicateur" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Signing" -msgstr "Signaux" +msgstr "Signature" #: platform/uwp/export/export.cpp msgid "Certificate" msgstr "Certificat" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "Débogueur" +msgstr "Algorithme" #: platform/uwp/export/export.cpp msgid "Major" @@ -20414,23 +20058,20 @@ msgid "Minor" msgstr "Mineur" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Build" -msgstr "Mode Règle" +msgstr "Build" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Revision" -msgstr "Expression" +msgstr "Révision" #: platform/uwp/export/export.cpp msgid "Landscape" msgstr "Paysage" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Portrait" -msgstr "Retourner les Portals" +msgstr "Portrait" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" @@ -20441,9 +20082,8 @@ msgid "Portrait Flipped" msgstr "Portrait Inversé" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Store Logo" -msgstr "Mode mise à l'échelle" +msgstr "Logo du magasin" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" @@ -20466,14 +20106,12 @@ msgid "Wide 310 X 150 Logo" msgstr "Logo 310 X 150 Large" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Splash Screen" -msgstr "Appels de dessin :" +msgstr "Écran de chargement" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Tiles" -msgstr "Fichier" +msgstr "Tuiles" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" @@ -20557,32 +20195,28 @@ msgid "UWP" msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Signtool" -msgstr "Signaux" +msgstr "Signtool" #: platform/uwp/export/export.cpp msgid "Debug Certificate" msgstr "Certificat de Débogage" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Algorithm" -msgstr "Débogueur" +msgstr "Algorithme de débogage" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Impossible de supprimer le fichier temporaire :" +msgstr "Impossible de renommer le fichier temporaire \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity Type" msgstr "Type d'identité" #: platform/windows/export/export.cpp msgid "Timestamp Server URL" -msgstr "" +msgstr "URL du serveur d'horodatage" #: platform/windows/export/export.cpp #, fuzzy @@ -20590,14 +20224,12 @@ msgid "Digest Algorithm" msgstr "Débogueur" #: platform/windows/export/export.cpp -#, fuzzy msgid "Modify Resources" -msgstr "Copier la ressource" +msgstr "Modifier les ressources" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "Version" +msgstr "Version de fichier" #: platform/windows/export/export.cpp msgid "Product Version" @@ -20612,18 +20244,16 @@ msgid "Product Name" msgstr "Nom du produit" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "Description" +msgstr "Description de fichier" #: platform/windows/export/export.cpp msgid "Trademarks" msgstr "Marques Déposées" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Rotation aléatoire :" +msgstr "Modification de ressources" #: platform/windows/export/export.cpp #, fuzzy @@ -20638,61 +20268,52 @@ msgstr "Impossible de trouver le keystore, impossible d'exporter." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "L'outil « rcedit » doit être configuré dans les préférences de l'éditeur " "(Exporter > Windows > Rcedit) for modifier l'icône ou les informations de " "l'application." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" -"rcedit n'a pas réussi à modifier l'exécutable :\n" -"%s" +msgid "rcedit failed to modify executable: %s." +msgstr "rcedit n'a pas réussi à modifier l'exécutable : %s." #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find signtool executable at \"%s\"." -msgstr "Impossible de trouver le keystore, impossible d'exporter." +msgstr "Impossible de trouver l’exécutable signtool à \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "Could not find osslsigncode executable at \"%s\"." -msgstr "Impossible de trouver le keystore, impossible d'exporter." +msgstr "Impossible de trouver l’exécutable osslsigncode à \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Identifiant invalide :" +msgstr "Type d'identité invalide." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid timestamp server." -msgstr "Nom invalide." +msgstr "Server d'horodatage invalide." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "L'outil « rcedit » doit être configuré dans les préférences de l'éditeur " "(Exporter > Windows > Rcedit) for modifier l'icône ou les informations de " "l'application." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +msgid "Signtool failed to sign executable: %s." +msgstr "La signature de l’exécutable avec Signtool a échoué : %s." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Impossible de supprimer le fichier temporaire :" +msgstr "Impossible de supprimer le fichier temporaire \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -20717,7 +20338,7 @@ msgstr "Version du produit invalide :" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Les exécutables Windows ne peuvent pas peser >= 4Gio." #: platform/windows/export/export.cpp platform/x11/export/export.cpp #, fuzzy @@ -20726,38 +20347,37 @@ msgstr "Fichier exécutable invalide." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." -msgstr "" +msgstr "Entête du fichier exécutable corrompue." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "Section \"pck\" de l’exécutable non trouvée." #: platform/windows/export/export.cpp -#, fuzzy msgid "Windows" -msgstr "Nouvelle Fenêtre" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" -msgstr "" +msgstr "Rcedit" #: platform/windows/export/export.cpp msgid "Osslsigncode" -msgstr "" +msgstr "Osslsigncode" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." msgstr "" +"les exécutables 32 bits ne peuvent pas contenir de données pesant >= 4Gio." #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Frames" -msgstr "Image %" +msgstr "Trames" #: scene/2d/animated_sprite.cpp msgid "" @@ -20769,71 +20389,61 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Speed Scale" -msgstr "Mode mise à l'échelle" +msgstr "Échelle de vitesse" #: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp #: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Playing" -msgstr "Jouer" +msgstr "En train de jouer" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Centered" -msgstr "Centre" +msgstr "Centré" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip H" -msgstr "" +msgstr "Miroir H" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip V" -msgstr "" +msgstr "Miroir V" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitoring" -msgstr "Moniteur" +msgstr "Observation" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitorable" -msgstr "Moniteur" +msgstr "Observable" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Physics Overrides" -msgstr "Redéfinition" +msgstr "Redéfinitions de physique" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Space Override" -msgstr "Redéfinition" +msgstr "Redéfinition d'espace" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Point" -msgstr "Générer des points" +msgstr "Gravité ponctuelle" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Distance Scale" -msgstr "WaitInstanceSignal" +msgstr "Échelle de distance de gravité" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Vec" -msgstr "Aperçu par défaut" +msgstr "Vecteur de gravité" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Gravity" -msgstr "" +msgstr "Gravité" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20845,38 +20455,33 @@ msgid "Angular Damp" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Audio Bus" -msgstr "Ajouter un bus audio" +msgstr "Bus audio" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" msgstr "Redéfinition" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp -#, fuzzy msgid "Volume dB" -msgstr "Volume" +msgstr "Volume (dB)" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp #: servers/audio/effects/audio_effect_pitch_shift.cpp -#, fuzzy msgid "Pitch Scale" -msgstr "Mode mise à l'échelle" +msgstr "Échelle de pitch" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "Activer/désactiver la lecture automatique" +msgstr "Lecture automatique" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp msgid "Stream Paused" -msgstr "" +msgstr "Diffusion en pause" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/3d/light.cpp scene/3d/reflection_probe.cpp @@ -20886,34 +20491,29 @@ msgid "Max Distance" msgstr "Distance Maximale" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Attenuation" -msgstr "Animation" +msgstr "Atténuation" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Bus" -msgstr "Ajouter un bus" +msgstr "Bus" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" -msgstr "" +msgstr "Masque de zone" #: scene/2d/back_buffer_copy.cpp -#, fuzzy msgid "Copy Mode" -msgstr "Copier les nÅ“uds" +msgstr "Mode copie" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Anchor Mode" -msgstr "Mode Icône" +msgstr "Mode ancre" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "Pas de la rotation :" +msgstr "En rotation" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp @@ -20921,14 +20521,12 @@ msgid "Current" msgstr "Actuel" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom" msgstr "Zoomer" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Custom Viewport" -msgstr "1 vue" +msgstr "Vue personnalisée" #: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp @@ -20939,26 +20537,23 @@ msgstr "Mode déplacement" #: scene/2d/camera_2d.cpp msgid "Limit" -msgstr "" +msgstr "Limite" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "En haut à gauche" +msgstr "Gauche" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "Lumière" +msgstr "Droite" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "En bas à gauche" +msgstr "Bas" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20966,9 +20561,8 @@ msgid "Smoothed" msgstr "Progression douce" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Margin" -msgstr "Définir la marge" +msgstr "Afficher les marges" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20987,27 +20581,24 @@ msgstr "Progression douce" #: scene/2d/camera_2d.cpp msgid "H" -msgstr "" +msgstr "H" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "V" -msgstr "UV" +msgstr "V" #: scene/2d/camera_2d.cpp #, fuzzy msgid "Drag Margin" -msgstr "Définir la marge" +msgstr "Tirer la marge" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Screen" -msgstr "Appels de dessin :" +msgstr "Afficher l'écran" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Limits" -msgstr "Appels de dessin :" +msgstr "Afficher les limites" #: scene/2d/camera_2d.cpp #, fuzzy @@ -21016,43 +20607,37 @@ msgstr "Définir la marge" #: scene/2d/canvas_item.cpp scene/resources/environment.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Blend Mode" -msgstr "NÅ“ud Blend2" +msgstr "Mode mélange" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Light Mode" -msgstr "Étendu à Droite" +msgstr "Mode de lumière" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Animation" -msgstr "Particules" +msgstr "Animation de particules" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" -msgstr "" +msgstr "Trames d'animation H de particules" #: scene/2d/canvas_item.cpp msgid "Particles Anim V Frames" -msgstr "" +msgstr "Trames d'animation V de particules" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Anim Loop" -msgstr "Particules" +msgstr "Boucle d'animation de particules" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Visibility" -msgstr "Basculer la visibilité" +msgstr "Visibilité" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp #: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Visible" -msgstr "Basculer la visibilité" +msgstr "Visible" #: scene/2d/canvas_item.cpp #, fuzzy @@ -21061,22 +20646,20 @@ msgstr "Peupler" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" -msgstr "" +msgstr "Montrer derrière le parent" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Show On Top" -msgstr "Afficher l'origine" +msgstr "Montrer au dessus" #: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Light Mask" -msgstr "LightMap Bake" +msgstr "Masque de lumières" #: scene/2d/canvas_item.cpp msgid "Use Parent Material" -msgstr "" +msgstr "Utiliser le matériau du parent" #: scene/2d/canvas_modulate.cpp msgid "" @@ -21098,9 +20681,8 @@ msgstr "" "qu'enfant pour définir sa forme." #: scene/2d/collision_object_2d.cpp -#, fuzzy msgid "Pickable" -msgstr "Sélectionner une tuile" +msgstr "Déplaçable" #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -21132,29 +20714,27 @@ msgstr "" msgid "" "The One Way Collision property will be ignored when the parent is an Area2D." msgstr "" +"La propriété Collision à sens unique est ignorée lorsque le parent est un " +"Area2D." #: scene/2d/collision_polygon_2d.cpp -#, fuzzy msgid "Build Mode" -msgstr "Mode Règle" +msgstr "Mode construction" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp #: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Disabled" -msgstr "Item désactivé" +msgstr "Désactivé" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "One Way Collision" -msgstr "Créer le polygone de collision" +msgstr "Collision à sens unique" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp -#, fuzzy msgid "One Way Collision Margin" -msgstr "Créer le polygone de collision" +msgstr "marge de collision à sens unique" #: scene/2d/collision_shape_2d.cpp msgid "" @@ -21193,31 +20773,28 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Emitting" -msgstr "Paramètres :" +msgstr "Émet" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Lifetime" -msgstr "" +msgstr "Durée de vie" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp scene/main/timer.cpp -#, fuzzy msgid "One Shot" -msgstr "NÅ“ud one-shot" +msgstr "Jouer une fois" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Preprocess" -msgstr "Post-traitement" +msgstr "Pré-traitement" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Explosiveness" -msgstr "" +msgstr "Explovisité" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -21227,13 +20804,12 @@ msgstr "Aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Lifetime Randomness" -msgstr "" +msgstr "Aléatoire de durée de vie" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Voir Images par secondes" +msgstr "FPS fixes" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -21247,20 +20823,18 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Local Coords" -msgstr "Projets locaux" +msgstr "Coordonnées locales" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Draw Order" -msgstr "" +msgstr "Ordre de rendu" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Emission Shape" -msgstr "Masque d'émission" +msgstr "Forme d'émission" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21273,63 +20847,55 @@ msgid "Rect Extents" msgstr "Gadgets" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Normals" -msgstr "Format" +msgstr "Normales" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Align Y" -msgstr "Assigner" +msgstr "Aligner axe Y" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Direction" -msgstr "Directions" +msgstr "Direction" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Spread" -msgstr "" +msgstr "Propagation" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Initial Velocity" -msgstr "Initialiser" +msgstr "Vélocité initiale" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "Vue de l'orbite vers la droite" +msgstr "Vélocité aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Angular Velocity" -msgstr "" +msgstr "Vélocité angulaire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "Vue de l'orbite vers la droite" +msgstr "Courbe de vélocité" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Orbit Velocity" -msgstr "Vue de l'orbite vers la droite" +msgstr "Vélocité d'orbite" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Linear Accel" -msgstr "Linéaire" +msgstr "Accélération linéaire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21339,23 +20905,22 @@ msgstr "Accel" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Accélération aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "Scinder la courbe" +msgstr "Courbe d’accélération" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "Accélération radiale" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Tangential Accel" -msgstr "" +msgstr "Accélération tangentielle" #: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp @@ -21363,39 +20928,37 @@ msgstr "" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Damping" -msgstr "" +msgstr "Amortissement" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Damping Random" -msgstr "" +msgstr "Amortissement aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Damping Curve" -msgstr "Scinder la courbe" +msgstr "Courbe d'amortissement" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp msgid "Angle" -msgstr "" +msgstr "Angle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Angle aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Angle Curve" -msgstr "Fermer la courbe" +msgstr "Courbe d'angle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #, fuzzy msgid "Scale Amount" -msgstr "Quantité :" +msgstr "Valeur d'échelle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21408,14 +20971,13 @@ msgstr "Agrandir/Rétrécir à partir du curseur" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Color Ramp" -msgstr "Couleurs" +msgstr "Dégradé de couleurs" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Color Initial Ramp" -msgstr "" +msgstr "Dégradé de couleurs initial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21434,33 +20996,28 @@ msgstr "Variation aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Curve" -msgstr "Séparation :" +msgstr "Courbe de variation" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Random" -msgstr "Mode mise à l'échelle" +msgstr "Vitesse aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de vitesse" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Random" -msgstr "Décalage :" +msgstr "Décalage de l'aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Curve" -msgstr "Fermer la courbe" +msgstr "Courbe de décalage" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -21483,25 +21040,22 @@ msgid "Node A and Node B must be different PhysicsBody2Ds" msgstr "Node A et Node B doivent être des PhysicsBody2D différents" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node A" -msgstr "NÅ“ud" +msgstr "NÅ“ud A" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node B" -msgstr "NÅ“ud" +msgstr "NÅ“ud B" #: scene/2d/joints_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/resources/environment.cpp msgid "Bias" -msgstr "" +msgstr "Biais" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Disable Collision" -msgstr "Bouton désactivé" +msgstr "Désactiver les collisions" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" @@ -21513,9 +21067,8 @@ msgid "Length" msgstr "Longueur" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Initial Offset" -msgstr "Initialiser" +msgstr "Décalage initial" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" @@ -21534,14 +21087,12 @@ msgstr "" "« Texture »." #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp -#, fuzzy msgid "Editor Only" -msgstr "Éditeur" +msgstr "Éditeur seulement" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Texture Scale" -msgstr "RegionDeTexture" +msgstr "Échelle de texture" #: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/resources/environment.cpp @@ -21558,33 +21109,28 @@ msgid "Z Max" msgstr "Maximum Z" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Layer Min" -msgstr "Changer la taille d'une caméra" +msgstr "Calque min" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Layer Max" -msgstr "Calque" +msgstr "Calque max" #: scene/2d/light_2d.cpp msgid "Item Cull Mask" msgstr "" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Shadow" -msgstr "Ombrage" +msgstr "Ombre" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Buffer Size" -msgstr "Vue de derrière" +msgstr "Taille de tampon" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Gradient Length" -msgstr "Dégradé édité" +msgstr "Longueur du dégradé" #: scene/2d/light_2d.cpp #, fuzzy @@ -21592,9 +21138,8 @@ msgid "Filter Smooth" msgstr "Filtrer les méthodes" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "Closed" -msgstr "Fermer" +msgstr "Fermé" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp #, fuzzy @@ -21615,38 +21160,32 @@ msgstr "" "polygone." #: scene/2d/line_2d.cpp -#, fuzzy msgid "Width Curve" -msgstr "Scinder la courbe" +msgstr "Courbe de largeur" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Color" -msgstr "Défaut" +msgstr "Couleur par défaut" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" msgstr "Remplissage" #: scene/2d/line_2d.cpp scene/resources/texture.cpp -#, fuzzy msgid "Gradient" -msgstr "Dégradé édité" +msgstr "Dégradé" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Texture Mode" -msgstr "RegionDeTexture" +msgstr "Mode de texture" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Capping" -msgstr "Recouvrement" +msgstr "Capuchonnement" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Joint Mode" -msgstr "Mode Icône" +msgstr "Mode de jointure" #: scene/2d/line_2d.cpp #, fuzzy @@ -21654,14 +21193,12 @@ msgid "Begin Cap Mode" msgstr "Mode Région" #: scene/2d/line_2d.cpp -#, fuzzy msgid "End Cap Mode" -msgstr "Mode d'aimantation :" +msgstr "Mode du capuchon de fin" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border" -msgstr "dans l'ordre :" +msgstr "Bordure" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21673,9 +21210,8 @@ msgstr "Précision de l’arrondissement" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Antialiased" -msgstr "Initialiser" +msgstr "Anticrénelé" #: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp #, fuzzy @@ -21689,9 +21225,8 @@ msgid "Cell Size" msgstr "Taille des Cellules" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp -#, fuzzy msgid "Edge Connection Margin" -msgstr "Modifier la connexion :" +msgstr "Marge de connexion des bords" #: scene/2d/navigation_2d.cpp msgid "" @@ -21706,31 +21241,27 @@ msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy msgid "Pathfinding" -msgstr "Liaison" +msgstr "Pathfinding" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Desired Distance" -msgstr "Choisissez distance :" +msgstr "Distance souhaitée du chemin" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" msgstr "Distance Désirée de la Cible" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "Choisissez distance :" +msgstr "Distance maximale du chemin" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance" -msgstr "Options avancées" +msgstr "Évitement" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Avoidance Enabled" -msgstr "Activer" +msgstr "Évitement activé" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Neighbor Dist" @@ -21750,10 +21281,11 @@ msgid "Max Speed" msgstr "Vitesse Max" #: scene/2d/navigation_agent_2d.cpp -#, fuzzy msgid "" "The NavigationAgent2D can be used only under a Node2D inheriting parent node." -msgstr "Le NavigationAgent2D ne peut être utilisé que sous un nÅ“ud Node2D." +msgstr "" +"Le NavigationAgent2D ne peut être utilisé que sous un nÅ“ud dont le parent " +"hérite de Node2D." #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp msgid "Estimate Radius" @@ -21778,17 +21310,15 @@ msgstr "" #: scene/2d/navigation_polygon.cpp msgid "Navpoly" -msgstr "" +msgstr "Polygone de navigation" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Enter Cost" -msgstr "Centrée en bas" +msgstr "Coût d’entrée" #: scene/2d/navigation_polygon.cpp scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Travel Cost" -msgstr "Se déplacer" +msgstr "Coût de déplacement" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp @@ -21854,9 +21384,8 @@ msgid "Motion" msgstr "Déplacement" #: scene/2d/parallax_layer.cpp -#, fuzzy msgid "Mirroring" -msgstr "Miroir" +msgstr "Effet de miroir" #: scene/2d/particles_2d.cpp msgid "" @@ -21919,9 +21448,8 @@ msgstr "" "d'un nÅ“ud de type Path2D." #: scene/2d/path_2d.cpp scene/3d/path.cpp -#, fuzzy msgid "Unit Offset" -msgstr "Décalage de la grille :" +msgstr "Décalage d'unité" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp msgid "H Offset" @@ -21937,7 +21465,7 @@ msgstr "Interpolation Cubique" #: scene/2d/path_2d.cpp msgid "Lookahead" -msgstr "" +msgstr "Anticipation" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp msgid "Layers" @@ -21997,14 +21525,12 @@ msgid "Gravity Scale" msgstr "Échelle de la Gravité" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Custom Integrator" -msgstr "NÅ“ud Personnalisé" +msgstr "Intégrateur personnalisé" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Continuous CD" -msgstr "Continu" +msgstr "Détection de collision continue" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Contacts Reported" @@ -22037,7 +21563,7 @@ msgstr "Forces Appliquées" #: scene/2d/physics_body_2d.cpp msgid "Torque" -msgstr "" +msgstr "Torque" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Safe Margin" @@ -22048,9 +21574,8 @@ msgid "Sync To Physics" msgstr "Synchroniser Avec La Physique" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Moving Platform" -msgstr "Déplacement du résultat" +msgstr "Plateforme mobile" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Apply Velocity On Leave" @@ -22064,9 +21589,8 @@ msgid "Normal" msgstr "Normale" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Remainder" -msgstr "Moteur de rendu :" +msgstr "Reste" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Local Shape" @@ -22127,9 +21651,8 @@ msgid "Exclude Parent" msgstr "Exclure Le Parent" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Cast To" -msgstr "Créer un nÅ“ud Shader" +msgstr "Lancer vers" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" @@ -22137,7 +21660,7 @@ msgstr "Collisionne Avec" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" -msgstr "" +msgstr "Zones" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" @@ -22150,24 +21673,20 @@ msgstr "" "fonctionner." #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Remote Path" -msgstr "Supprimer un point" +msgstr "Chemin distant" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Use Global Coordinates" -msgstr "Coordonnée suivante" +msgstr "Utiliser les coordonnées globales" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Rest" -msgstr "Redémarrer" +msgstr "Repos" #: scene/2d/skeleton_2d.cpp -#, fuzzy msgid "Default Length" -msgstr "Thème par défaut" +msgstr "Longueur par défaut" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -22188,16 +21707,15 @@ msgstr "" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Hframes" -msgstr "" +msgstr "Trames H" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Vframes" -msgstr "" +msgstr "Trames V" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Frame Coords" -msgstr "Image %" +msgstr "Coordonnées de trame" #: scene/2d/sprite.cpp scene/resources/texture.cpp #, fuzzy @@ -22215,14 +21733,12 @@ msgstr "" "etc." #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Set" -msgstr "TileSet" +msgstr "Palette de tuiles" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Quadrant Size" -msgstr "Changer la taille d'une caméra" +msgstr "Taille de quadrant" #: scene/2d/tile_map.cpp #, fuzzy @@ -22230,19 +21746,16 @@ msgid "Custom Transform" msgstr "Transformation" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Half Offset" -msgstr "Initialiser" +msgstr "Décalage de moitié" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Origin" -msgstr "Afficher l'origine" +msgstr "Origine de la tuile" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Y Sort" -msgstr "Trier" +msgstr "Trier par Y" #: scene/2d/tile_map.cpp msgid "Show Collision" @@ -22293,23 +21806,20 @@ msgstr "" "nÅ“ud racine de la scène éditée." #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Pause Animations" -msgstr "Coller l'animation" +msgstr "Mettre les animations en pause" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" msgstr "Geler les corps" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Particles" -msgstr "Particules" +msgstr "Mettre les particules en pause" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Animated Sprites" -msgstr "Coller l'animation" +msgstr "Mettre les Sprites animés en pause" #: scene/2d/visibility_notifier_2d.cpp msgid "Process Parent" @@ -22337,7 +21847,7 @@ msgstr "ID Du Contrôleur" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" -msgstr "" +msgstr "Vibration" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -22377,43 +21887,40 @@ msgid "World Scale" msgstr "Échelle du Monde" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Attenuation Model" -msgstr "NÅ“ud d'animation" +msgstr "Modèle d’atténuation" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit dB" -msgstr "" +msgstr "Unité (dB)" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit Size" -msgstr "" +msgstr "Taille d’unité" #: scene/3d/audio_stream_player_3d.cpp msgid "Max dB" -msgstr "" +msgstr "Max (dB)" #: scene/3d/audio_stream_player_3d.cpp msgid "Out Of Range Mode" msgstr "" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Emission Angle" -msgstr "Couleurs d'émission" +msgstr "Angle d’émission" #: scene/3d/audio_stream_player_3d.cpp msgid "Degrees" msgstr "Degrés" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Filter Attenuation dB" -msgstr "Animation" +msgstr "Filtre d’atténuation (dB)" #: scene/3d/audio_stream_player_3d.cpp msgid "Attenuation Filter" -msgstr "" +msgstr "Filtre d’atténuation" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -22423,14 +21930,12 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "dB" -msgstr "o" +msgstr "dB" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Doppler" -msgstr "Activer l'effet Doppler" +msgstr "Doppler" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22440,7 +21945,7 @@ msgstr "Empaquetage" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp msgid "Interior" -msgstr "" +msgstr "Intérieur" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" @@ -22475,69 +21980,59 @@ msgstr "Gadgets" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" -msgstr "" +msgstr "Ajustements" #: scene/3d/baked_lightmap.cpp msgid "Bounces" -msgstr "" +msgstr "Rebonds" #: scene/3d/baked_lightmap.cpp msgid "Bounce Indirect Energy" -msgstr "" +msgstr "Énergie indirecte de rebond" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Denoiser" -msgstr "Filtre :" +msgstr "Utiliser un filtre anti-bruit" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" -msgstr "" +msgstr "Utiliser HDR" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Color" -msgstr "Couleurs" +msgstr "Utiliser la couleur" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Default Texels Per Unit" -msgstr "Thème par défaut" +msgstr "Texels par unité par défaut" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp -#, fuzzy msgid "Atlas" -msgstr "Nouvel Atlas" +msgstr "Atlas" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generate" -msgstr "Général" +msgstr "Générer" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "Taille :" +msgstr "Taille maximale" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky" -msgstr "NÅ“ud Personnalisé" +msgstr "Ciel personnalisé" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky Rotation Degrees" -msgstr "Rotation de %s degrés." +msgstr "Degrés de rotation du ciel personnalisé" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Custom Color" -msgstr "NÅ“ud Personnalisé" +msgstr "Couleur personnalisée" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Energy" -msgstr "Déplacer effet de transport" +msgstr "Énergie personnalisée" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22545,27 +22040,24 @@ msgid "Min Light" msgstr "Indenter vers la droite" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Propagation" -msgstr "Navigation" +msgstr "Propagation" #: scene/3d/baked_lightmap.cpp msgid "Image Path" -msgstr "" +msgstr "Chemin de l'image" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Light Data" -msgstr "Avec données" +msgstr "Données de lumière" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Bone Name" -msgstr "Nom de nÅ“ud :" +msgstr "Nom de l'os" #: scene/3d/camera.cpp msgid "Keep Aspect" -msgstr "" +msgstr "Garder l'aspect" #: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp msgid "Cull Mask" @@ -22577,36 +22069,32 @@ msgid "Doppler Tracking" msgstr "Piste de propriété" #: scene/3d/camera.cpp -#, fuzzy msgid "Projection" -msgstr "Projet" +msgstr "Projection" #: scene/3d/camera.cpp msgid "FOV" -msgstr "" +msgstr "Champ de vision" #: scene/3d/camera.cpp -#, fuzzy msgid "Frustum Offset" -msgstr "Décalage de la grille :" +msgstr "Décalage du Tronc" #: scene/3d/camera.cpp -#, fuzzy msgid "Near" -msgstr "Au plus proche" +msgstr "Plan proche" #: scene/3d/camera.cpp msgid "Far" -msgstr "" +msgstr "Plan éloigné" #: scene/3d/camera.cpp scene/3d/collision_polygon.cpp scene/3d/spring_arm.cpp #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/shape.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Margin" -msgstr "Définir la marge" +msgstr "Marge" #: scene/3d/camera.cpp #, fuzzy @@ -22696,48 +22184,40 @@ msgid "Box Extents" msgstr "Gadgets" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Ring Radius" -msgstr "Masque d'émission" +msgstr "Rayon de l'anneau" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Ring Inner Radius" -msgstr "Changer le rayon intérieur de la tour" +msgstr "Rayon intérieur de l'anneau" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Ring Height" -msgstr "Rotation vers la droite" +msgstr "Hauteur de l'anneau" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Ring Axis" -msgstr "Avertissements" +msgstr "Axe de l'anneau" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Rotate Y" -msgstr "Rotation" +msgstr "Rotation Y" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Disable Z" -msgstr "Item désactivé" +msgstr "Désactiver axe Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" -msgstr "" +msgstr "Platitude" #: scene/3d/cull_instance.cpp servers/visual_server.cpp -#, fuzzy msgid "Portals" -msgstr "Retourner les Portals" +msgstr "Portails" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Portal Mode" -msgstr "Mode prioritaire" +msgstr "Mode portail" #: scene/3d/cull_instance.cpp msgid "Include In Bound" @@ -22748,9 +22228,8 @@ msgid "Allow Merging" msgstr "" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Autoplace Priority" -msgstr "Activer la priorité" +msgstr "Priorité d’auto-placement" #: scene/3d/gi_probe.cpp msgid "Plotting Meshes" @@ -22781,114 +22260,98 @@ msgstr "" #: scene/3d/gi_probe.cpp msgid "Subdiv" -msgstr "" +msgstr "Subdivision" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Dynamic Range" -msgstr "Bibliothèque dynamique" +msgstr "Plage dynamique" #: scene/3d/gi_probe.cpp scene/3d/light.cpp msgid "Normal Bias" -msgstr "" +msgstr "Biais normal" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Pixel Size" -msgstr "Aimanter au pixel" +msgstr "Taille de pixel" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" -msgstr "Billboard" +msgstr "Panneau(Billboard)" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Shaded" -msgstr "Ombrage" +msgstr "Ombré" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Double Sided" -msgstr "" +msgstr "Double face" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "No Depth Test" -msgstr "" +msgstr "Pas de test de profondeur" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Fixed Size" -msgstr "Vue de devant" +msgstr "Taille fixe" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Alpha Cut" -msgstr "" +msgstr "Coupe alpha" #: scene/3d/label_3d.cpp scene/resources/material.cpp msgid "Alpha Scissor Threshold" -msgstr "" +msgstr "Seuil des ciseaux d'alpha" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Render Priority" -msgstr "Activer la priorité" +msgstr "Priorité de rendu" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Outline Render Priority" -msgstr "Activer la priorité" +msgstr "Priorité de rendu du contour" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Outline Modulate" -msgstr "Forcer la modulation blanche" +msgstr "Moduler le contour" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Polices" +msgstr "Police" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "Horizontal Activé" +msgstr "Alignement horizontal" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Vertical Alignment" -msgstr "Filtrer les signaux" +msgstr "Alignement vertical" #: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp -#, fuzzy msgid "Autowrap" -msgstr "AutoLoad" +msgstr "Retour à la ligne automatique" #: scene/3d/light.cpp -#, fuzzy msgid "Indirect Energy" -msgstr "Couleurs d'émission" +msgstr "Énergie indirecte" #: scene/3d/light.cpp -#, fuzzy msgid "Negative" -msgstr "GDNative" +msgstr "Négative" #: scene/3d/light.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Specular" -msgstr "Mode Règle" +msgstr "Spéculaire" #: scene/3d/light.cpp -#, fuzzy msgid "Bake Mode" -msgstr "Mode Bitmask" +msgstr "Mode de pré-calcul" #: scene/3d/light.cpp -#, fuzzy msgid "Contact" -msgstr "Prélever une couleur" +msgstr "Contact" #: scene/3d/light.cpp #, fuzzy @@ -22896,9 +22359,8 @@ msgid "Reverse Cull Face" msgstr "Réinitialiser le volume de bus" #: scene/3d/light.cpp servers/visual_server.cpp -#, fuzzy msgid "Directional Shadow" -msgstr "Directions" +msgstr "Ombre directionnelle" #: scene/3d/light.cpp #, fuzzy @@ -22916,9 +22378,8 @@ msgid "Split 3" msgstr "Divisé" #: scene/3d/light.cpp -#, fuzzy msgid "Blend Splits" -msgstr "Temps de mélange :" +msgstr "Mélanger les écarts" #: scene/3d/light.cpp #, fuzzy @@ -22926,23 +22387,20 @@ msgid "Bias Split Scale" msgstr "Utiliser le magnétisme d'échelle" #: scene/3d/light.cpp -#, fuzzy msgid "Depth Range" -msgstr "Profondeur" +msgstr "Plage de profondeur" #: scene/3d/light.cpp msgid "Omni" -msgstr "" +msgstr "Omnidirectionnelle" #: scene/3d/light.cpp -#, fuzzy msgid "Shadow Mode" -msgstr "Ombrage" +msgstr "Mode ombre" #: scene/3d/light.cpp -#, fuzzy msgid "Shadow Detail" -msgstr "Afficher par défaut" +msgstr "Détails d'ombre" #: scene/3d/light.cpp msgid "A SpotLight with an angle wider than 90 degrees cannot cast shadows." @@ -22952,21 +22410,19 @@ msgstr "" #: scene/3d/light.cpp msgid "Spot" -msgstr "" +msgstr "Spot" #: scene/3d/light.cpp -#, fuzzy msgid "Angle Attenuation" -msgstr "Animation" +msgstr "Atténuation d'angle" #: scene/3d/mesh_instance.cpp msgid "Software Skinning" msgstr "" #: scene/3d/mesh_instance.cpp -#, fuzzy msgid "Transform Normals" -msgstr "Transformation annulée." +msgstr "Transformer les normales" #: scene/3d/navigation.cpp msgid "" @@ -22974,45 +22430,44 @@ msgid "" "be removed in a future version. Use 'NavigationServer.map_get_path()' " "instead." msgstr "" +"Le nÅ“ud \"Navigation\" et \"Navigation.get_simple_path()\" sont obsolètes et " +"seront retires dans une version ultérieure. Utilisez plutôt " +"\"NavigationServer.map_get_path()\"." #: scene/3d/navigation.cpp scene/resources/curve.cpp -#, fuzzy msgid "Up Vector" -msgstr "Vecteur" +msgstr "Vecteur Haut" #: scene/3d/navigation.cpp -#, fuzzy msgid "Cell Height" -msgstr "En période de test" +msgstr "Hauteur de cellule" #: scene/3d/navigation_agent.cpp msgid "Agent Height Offset" -msgstr "" +msgstr "Décalage de hauteur de l'agent" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "Ignore Y" -msgstr "[Ignorer]" +msgstr "Ignorer Y" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "" "The NavigationAgent can be used only under a Spatial inheriting parent node." -msgstr "Le NavigationAgent ne peut être utilisé que sous un nÅ“ud spatial." +msgstr "" +"Le NavigationAgent ne peut être utilisé que sous un nÅ“ud parent héritant de " +"Spatial." #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh" -msgstr "Calculer le NavMesh" +msgstr "NavMesh" #: scene/3d/navigation_obstacle.cpp -#, fuzzy msgid "" "The NavigationObstacle only serves to provide collision avoidance to a " "Spatial inheriting parent object." msgstr "" -"Un NavigationObstacle ne peut éviter les collisions qu'avec les nÅ“uds " -"Spatial." +"Le NavigationObstacle ne sert qu'à fournir l’évitement de collision qu'aux " +"objets dont les parents héritent de Spatial." #: scene/3d/occluder.cpp msgid "No shape is set." @@ -23063,19 +22518,16 @@ msgstr "" "Particles » activé." #: scene/3d/particles.cpp -#, fuzzy msgid "Visibility AABB" -msgstr "Basculer la visibilité" +msgstr "Visibilité AABB" #: scene/3d/particles.cpp -#, fuzzy msgid "Draw Passes" -msgstr "Appels de dessin :" +msgstr "Afficher les passes" #: scene/3d/particles.cpp -#, fuzzy msgid "Passes" -msgstr "Appels de dessin :" +msgstr "Passes" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -23092,7 +22544,6 @@ msgstr "" "Vector » dans la ressource Curve de son parent Path." #: scene/3d/path.cpp -#, fuzzy msgid "Rotation Mode" msgstr "Mode rotation" @@ -23107,223 +22558,189 @@ msgstr "" "Modifiez la taille dans les formes de collision enfant à la place." #: scene/3d/physics_body.cpp -#, fuzzy msgid "Axis Lock" -msgstr "Axe" +msgstr "Verrouiller l'axe" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear X" -msgstr "Linéaire" +msgstr "X linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Y" -msgstr "Linéaire" +msgstr "Y linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Z" -msgstr "Linéaire" +msgstr "Z linéaire" #: scene/3d/physics_body.cpp msgid "Angular X" -msgstr "" +msgstr "X angulaire" #: scene/3d/physics_body.cpp msgid "Angular Y" -msgstr "" +msgstr "Y angulaire" #: scene/3d/physics_body.cpp msgid "Angular Z" -msgstr "" +msgstr "Z angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion X" -msgstr "Action" +msgstr "X mouvement" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Y" -msgstr "Action" +msgstr "Y mouvement" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Z" -msgstr "Action" +msgstr "Z mouvement" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint Constraints" -msgstr "Constantes" +msgstr "Restrictions de jointure" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Impulse Clamp" -msgstr "" +msgstr "Borner l'impulsion" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Swing Span" -msgstr "Enregistrement de la scène" +msgstr "Ampleur de balancement" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Twist Span" -msgstr "" +msgstr "Ampleur de torsion" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Relaxation" -msgstr "Séparation :" +msgstr "Relaxation" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Enabled" -msgstr "Filtrer les signaux" +msgstr "Limite angulaire activée" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Upper" -msgstr "Linéaire" +msgstr "Limite angulaire haute" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Lower" -msgstr "Erreur angulaire max. :" +msgstr "Limite angulaire basse" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Bias" -msgstr "Linéaire" +msgstr "Biais de limite angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Softness" -msgstr "Animation" +msgstr "Douceur de limite angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Relaxation" -msgstr "Animation" +msgstr "Relaxation de limite angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Upper" -msgstr "Linéaire" +msgstr "Limite linéaire haute" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Lower" -msgstr "Linéaire" +msgstr "Limite linéaire basse" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Softness" -msgstr "Linéaire" +msgstr "Douceur de limite linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Restitution" -msgstr "Linéaire" +msgstr "Restitution de limite linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Damping" -msgstr "Linéaire" +msgstr "Amortissement de limite linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Restitution" -msgstr "Animation" +msgstr "Restitution de limite angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Damping" -msgstr "Animation" +msgstr "Amortissement de limite angulaire" #: scene/3d/physics_body.cpp msgid "X" -msgstr "" +msgstr "X" #: scene/3d/physics_body.cpp msgid "Y" -msgstr "" +msgstr "Y" #: scene/3d/physics_body.cpp msgid "Z" -msgstr "" +msgstr "Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Enabled" -msgstr "Linéaire" +msgstr "Limite linéaire active" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Spring Enabled" -msgstr "Linéaire" +msgstr "Ressort linéaire actif" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Spring Stiffness" -msgstr "Linéaire" +msgstr "Raideur du ressort linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Spring Damping" -msgstr "Linéaire" +msgstr "Amortissement de ressort linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Equilibrium Point" -msgstr "Linéaire" +msgstr "Point d’équilibre linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Restitution" -msgstr "Description" +msgstr "Restitution linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Damping" -msgstr "Linéaire" +msgstr "Amortissement linéaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Restitution" -msgstr "Description" +msgstr "Restitution angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Damping" -msgstr "Animation" +msgstr "Amortissement angulaire" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "ERP" msgstr "" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Spring Enabled" -msgstr "Filtrer les signaux" +msgstr "Ressort angulaire actif" #: scene/3d/physics_body.cpp msgid "Angular Spring Stiffness" -msgstr "" +msgstr "Raideur de ressort angulaire" #: scene/3d/physics_body.cpp msgid "Angular Spring Damping" -msgstr "" +msgstr "Amortissement de ressort angulaire" #: scene/3d/physics_body.cpp msgid "Angular Equilibrium Point" -msgstr "" +msgstr "Point d’équilibre angulaire" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Body Offset" -msgstr "Décalage :" +msgstr "Décalage du corps" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -23347,183 +22764,159 @@ msgstr "Node A et Node B doivent être des PhysicsBody différents" #: scene/3d/physics_joint.cpp msgid "Solver" -msgstr "" +msgstr "Résolveur" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Exclude Nodes" -msgstr "Supprimer des nÅ“uds" +msgstr "Exclure les nÅ“uds" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Params" -msgstr "Paramètre modifié :" +msgstr "Paramètres" #: scene/3d/physics_joint.cpp msgid "Angular Limit" -msgstr "" +msgstr "Limite angulaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper" -msgstr "Tout en majuscule" +msgstr "Haute" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower" -msgstr "Tout en minuscule" +msgstr "Basse" #: scene/3d/physics_joint.cpp msgid "Motor" -msgstr "" +msgstr "Moteur" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Target Velocity" -msgstr "Vue de l'orbite vers la droite" +msgstr "Vélocité cible" #: scene/3d/physics_joint.cpp msgid "Max Impulse" msgstr "Impulsion Maximale" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit" -msgstr "Linéaire" +msgstr "Limite linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "Choisissez distance :" +msgstr "Distance haute" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Distance" -msgstr "Choisissez distance :" +msgstr "Distance basse" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Restitution" -msgstr "Description" +msgstr "Restitution" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motion" -msgstr "Initialiser" +msgstr "Mouvement linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Ortho" -msgstr "Orthogonale arrière" +msgstr "Ortho linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Angle" -msgstr "Tout en majuscule" +msgstr "Angle supérieur" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Angle" -msgstr "Tout en minuscule" +msgstr "Angle inférieur" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Angular Motion" -msgstr "Animation" +msgstr "Mouvement angulaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Angular Ortho" -msgstr "Erreur angulaire max. :" +msgstr "Ortho angulaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit X" -msgstr "Linéaire" +msgstr "X de la limite linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor X" -msgstr "Initialiser" +msgstr "X du moteur linéaire" #: scene/3d/physics_joint.cpp msgid "Force Limit" msgstr "Limite de Force" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Spring X" -msgstr "Linéaire" +msgstr "X du ressort linéaire" #: scene/3d/physics_joint.cpp msgid "Equilibrium Point" -msgstr "" +msgstr "Point d’équilibre" #: scene/3d/physics_joint.cpp msgid "Angular Limit X" -msgstr "" +msgstr "X de la limite angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Motor X" -msgstr "" +msgstr "X du moteur angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Spring X" -msgstr "" +msgstr "X du ressort angulaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit Y" -msgstr "Linéaire" +msgstr "Y de la limite linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor Y" -msgstr "Initialiser" +msgstr "Y du moteur linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Spring Y" -msgstr "Linéaire" +msgstr "Y du ressort linéaire" #: scene/3d/physics_joint.cpp msgid "Angular Limit Y" -msgstr "" +msgstr "Y de la limite angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Motor Y" -msgstr "" +msgstr "Y du moteur angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Spring Y" -msgstr "" +msgstr "Y du ressort angulaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit Z" -msgstr "Linéaire" +msgstr "Z de la limite linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Motor Z" -msgstr "Initialiser" +msgstr "Z du moteur linéaire" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Spring Z" -msgstr "Linéaire" +msgstr "Z du ressort linéaire" #: scene/3d/physics_joint.cpp msgid "Angular Limit Z" -msgstr "" +msgstr "Z de la limite angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Motor Z" -msgstr "" +msgstr "Z du moteur angulaire" #: scene/3d/physics_joint.cpp msgid "Angular Spring Z" -msgstr "" +msgstr "Z du ressort angulaire" #: scene/3d/portal.cpp msgid "The RoomManager should not be a child or grandchild of a Portal." @@ -23543,21 +22936,19 @@ msgstr "Portail actif" #: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp msgid "Two Way" -msgstr "" +msgstr "Double sens" #: scene/3d/portal.cpp msgid "Linked Room" msgstr "Salle liée" #: scene/3d/portal.cpp -#, fuzzy msgid "Use Default Margin" -msgstr "Défaut" +msgstr "Utiliser les marges par défaut" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Group Name" -msgstr "Groupé" +msgstr "Nom de groupe" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" @@ -23568,42 +22959,36 @@ msgid "Grid Radius" msgstr "Rayon de la Grille" #: scene/3d/ray_cast.cpp -#, fuzzy msgid "Debug Shape" -msgstr "Débogueur" +msgstr "Forme de débogage" #: scene/3d/ray_cast.cpp scene/resources/style_box.cpp msgid "Thickness" -msgstr "" +msgstr "Épaisseur" #: scene/3d/reflection_probe.cpp scene/main/viewport.cpp -#, fuzzy msgid "Update Mode" -msgstr "Mode rotation" +msgstr "Mode de mise à jour" #: scene/3d/reflection_probe.cpp msgid "Origin Offset" msgstr "Décalage de la Grille" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Box Projection" -msgstr "Projet" +msgstr "Projection boîte" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "Activer l'alignement" +msgstr "Activer les ombres" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Color" -msgstr "Prélever une couleur" +msgstr "Couleur ambiante" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Energy" -msgstr "Couleurs d'émission" +msgstr "Énergie ambiante" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23984,9 +23369,8 @@ msgid "Use As Steering" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Wheel" -msgstr "Molette vers le haut." +msgstr "Molette" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" @@ -24022,9 +23406,8 @@ msgid "Material Override" msgstr "Redéfinition" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Overlay" -msgstr "Changements de matériau :" +msgstr "Superposition de Matériau" #: scene/3d/visual_instance.cpp #, fuzzy @@ -24032,9 +23415,8 @@ msgid "Cast Shadow" msgstr "Créer un nÅ“ud Shader" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Extra Cull Margin" -msgstr "Arguments supplémentaires :" +msgstr "Marge supplémentaire de détermination des faces cachées" #: scene/3d/visual_instance.cpp #, fuzzy @@ -24106,14 +23488,12 @@ msgid "Mix Mode" msgstr "Mélanger le nÅ“ud" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadein Time" -msgstr "Durée du fondu (s) :" +msgstr "Durée du fondu entrant" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadeout Time" -msgstr "Durée du fondu (s) :" +msgstr "Durée du fondu sortant" #: scene/animation/animation_blend_tree.cpp msgid "Auto Restart" @@ -24128,9 +23508,8 @@ msgid "Delay" msgstr "" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Inclinaison aléatoire :" +msgstr "Retard aléatoire" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24138,9 +23517,8 @@ msgid "Add Amount" msgstr "Quantité" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Blend Amount" -msgstr "Quantité :" +msgstr "Quantité de mélange" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24154,9 +23532,8 @@ msgstr "Ajouter un port d'entrée" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Xfade Time" -msgstr "Durée du fondu (s) :" +msgstr "Durée du fondu croisé" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -24568,9 +23945,8 @@ msgid "Pass On Modal Close Click" msgstr "" #: scene/gui/control.cpp -#, fuzzy msgid "Size Flags" -msgstr "Taille :" +msgstr "Drapeaux de Taille" #: scene/gui/control.cpp #, fuzzy @@ -24622,9 +23998,8 @@ msgid "Scroll Offset" msgstr "Décalage du Défilement" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Snap Distance" -msgstr "Choisissez distance :" +msgstr "Distance d'arrondissage" #: scene/gui/graph_edit.cpp #, fuzzy @@ -24761,9 +24136,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "Caractères valides :" +msgstr "Caractère secret" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24820,7 +24194,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Caret" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" @@ -24997,9 +24371,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "Taille :" +msgstr "Taille de tabulation" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -25020,9 +24393,8 @@ msgid "Selection Enabled" msgstr "Sélection uniquement" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Override Selected Font Color" -msgstr "Configurer le profil sélectionné :" +msgstr "Remplacer la couleur de police sélectionnée" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -25073,9 +24445,8 @@ msgid "Tick Count" msgstr "Prélever une couleur" #: scene/gui/slider.cpp -#, fuzzy msgid "Ticks On Borders" -msgstr "dans l'ordre :" +msgstr "Encoches aux bordures" #: scene/gui/spin_box.cpp msgid "Prefix" @@ -25086,9 +24457,8 @@ msgid "Suffix" msgstr "Suffixe" #: scene/gui/split_container.cpp -#, fuzzy msgid "Split Offset" -msgstr "Décalage de la grille :" +msgstr "Décalage des écarts" #: scene/gui/split_container.cpp scene/gui/tree.cpp #, fuzzy @@ -25105,9 +24475,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "Actuel :" +msgstr "Onglet actuel" #: scene/gui/tab_container.cpp #, fuzzy @@ -25149,9 +24518,8 @@ msgid "Breakpoint Gutter" msgstr "Passer les points d'arrêt" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Fold Gutter" -msgstr "Dossier :" +msgstr "Replier le bandeau" #: scene/gui/text_edit.cpp #, fuzzy @@ -25253,9 +24621,8 @@ msgid "Initial Angle" msgstr "Initialiser" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Degrees" -msgstr "Rotation de %s degrés." +msgstr "Degrés remplis" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25361,9 +24728,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "Délai dépassé." +msgstr "Délai dépassé" #: scene/main/node.cpp msgid "" @@ -25636,9 +25002,8 @@ msgid "Debug Draw" msgstr "Débogage" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Target" -msgstr "Moteur de rendu :" +msgstr "Rendre la cible" #: scene/main/viewport.cpp msgid "V Flip" @@ -25811,9 +25176,8 @@ msgid "Font Color Disabled" msgstr "Âgrafe désactivée" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Separation" -msgstr "Séparation :" +msgstr "Séparation H" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25901,14 +25265,12 @@ msgid "Font Outline Modulate" msgstr "Forcer la modulation blanche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset X" -msgstr "Décalage X de la grille :" +msgstr "Décalage X de l'ombre" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset Y" -msgstr "Décalage Y de la grille :" +msgstr "Décalage Y de l'ombre" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25966,14 +25328,12 @@ msgid "Space" msgstr "Scène principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "Dossier :" +msgstr "Replié" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Fold" -msgstr "Dossier :" +msgstr "Replier" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" @@ -26092,14 +25452,12 @@ msgid "Close Highlight" msgstr "Éclairage direct" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close H Offset" -msgstr "Décalage de la grille :" +msgstr "Fermer décalage H" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close V Offset" -msgstr "Décalage de la grille :" +msgstr "Fermer décalage V" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26127,9 +25485,8 @@ msgid "Labeled Separator Right" msgstr "Séparateur nommé" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Separator" -msgstr "Opérateur de couleur." +msgstr "Séparateur de police" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26137,14 +25494,12 @@ msgid "Font Color Accel" msgstr "Renommer l'item de couleur" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Separator" -msgstr "Opérateur de couleur." +msgstr "Séparateur de couleur de police" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "V Separation" -msgstr "Séparation :" +msgstr "Séparation V" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26192,9 +25547,8 @@ msgid "Title Offset" msgstr "Décalage d’Octet" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Close Offset" -msgstr "Décalage de la grille :" +msgstr "Fermer de décalage" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26324,9 +25678,8 @@ msgid "Icon Margin" msgstr "Définir la marge" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Separation" -msgstr "Séparation :" +msgstr "Séparation de line" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26386,9 +25739,8 @@ msgid "Large" msgstr "Cible" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "Dossier :" +msgstr "Dossier" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26426,9 +25778,8 @@ msgid "Label Width" msgstr "Étendu à Gauche" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Screen Picker" -msgstr "Opérateur d'écran." +msgstr "Sélecteur d'écran" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26489,14 +25840,12 @@ msgid "Mono Font" msgstr "Police Principale" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table H Separation" -msgstr "Séparation :" +msgstr "Séparation H de table" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table V Separation" -msgstr "Séparation :" +msgstr "Séparation V de table" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26661,7 +26010,7 @@ msgstr "Condition" #: scene/resources/environment.cpp msgid "Fog" -msgstr "" +msgstr "Brouillard" #: scene/resources/environment.cpp msgid "Sun Color" @@ -26757,14 +26106,12 @@ msgid "Max Steps" msgstr "Pas" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "Fondu entrant (s) :" +msgstr "Fondu entrant" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade Out" -msgstr "Fondu sortant (s) :" +msgstr "Fondu sortant" #: scene/resources/environment.cpp #, fuzzy @@ -26843,54 +26190,52 @@ msgstr "2" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "3" -msgstr "" +msgstr "3" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "4" -msgstr "" +msgstr "4" #: scene/resources/environment.cpp msgid "5" -msgstr "" +msgstr "5" #: scene/resources/environment.cpp msgid "6" -msgstr "" +msgstr "6" #: scene/resources/environment.cpp msgid "7" -msgstr "" +msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "" +msgstr "Flou lumineux" #: scene/resources/environment.cpp msgid "HDR Threshold" -msgstr "" +msgstr "Seuil HDR" #: scene/resources/environment.cpp msgid "HDR Luminance Cap" -msgstr "" +msgstr "Limite de luminance HDR" #: scene/resources/environment.cpp -#, fuzzy msgid "HDR Scale" -msgstr "Mode mise à l'échelle" +msgstr "Échelle HDR" #: scene/resources/environment.cpp msgid "Bicubic Upscale" -msgstr "" +msgstr "Redimensionnement Bicubique" #: scene/resources/environment.cpp msgid "Adjustments" -msgstr "" +msgstr "Ajustements" #: scene/resources/environment.cpp -#, fuzzy msgid "Brightness" -msgstr "Lumière" +msgstr "Luminosité" #: scene/resources/environment.cpp msgid "Saturation" @@ -26898,22 +26243,19 @@ msgstr "Saturation" #: scene/resources/environment.cpp msgid "Color Correction" -msgstr "Correction de Couleur" +msgstr "Correction des couleurs" #: scene/resources/font.cpp -#, fuzzy msgid "Ascent" -msgstr "Récents :" +msgstr "Inclinaison" #: scene/resources/font.cpp -#, fuzzy msgid "Distance Field" -msgstr "Mode Sans Distraction" +msgstr "Champ de distance" #: scene/resources/gradient.cpp -#, fuzzy msgid "Raw Data" -msgstr "Profondeur" +msgstr "Données brutes" #: scene/resources/gradient.cpp msgid "Offsets" @@ -26921,62 +26263,55 @@ msgstr "Décalages" #: scene/resources/height_map_shape.cpp msgid "Map Width" -msgstr "" +msgstr "Largeur de la carte" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Depth" -msgstr "Profondeur" +msgstr "Profondeur de la carte" #: scene/resources/height_map_shape.cpp -#, fuzzy msgid "Map Data" -msgstr "Profondeur" +msgstr "Données de la carte" #: scene/resources/line_shape_2d.cpp msgid "D" -msgstr "" +msgstr "D" #: scene/resources/material.cpp -#, fuzzy msgid "Next Pass" -msgstr "Plan suivant" +msgstr "Passe suivante" #: scene/resources/material.cpp msgid "Use Shadow To Opacity" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Unshaded" -msgstr "Afficher sans ombrage" +msgstr "Sans ombrage" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Lighting" -msgstr "Éclairage direct" +msgstr "Éclairage de sommet" #: scene/resources/material.cpp -#, fuzzy msgid "Use Point Size" -msgstr "Vue de devant" +msgstr "Utiliser la taille de point" #: scene/resources/material.cpp msgid "World Triplanar" -msgstr "" +msgstr "Monde Triplanaire" #: scene/resources/material.cpp msgid "Albedo Tex Force sRGB" -msgstr "" +msgstr "Forcer sRGB dans la texture d'albédo" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "Ne pas recevoir d'ombres" #: scene/resources/material.cpp -#, fuzzy msgid "Disable Ambient Light" -msgstr "Indenter vers la droite" +msgstr "Désactiver la lumière ambiante" #: scene/resources/material.cpp msgid "Ensure Correct Normals" @@ -26984,70 +26319,63 @@ msgstr "Assurer des Normales Correctes" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" -msgstr "" +msgstr "Texture d'albédo MSDF" #: scene/resources/material.cpp -#, fuzzy msgid "Vertex Color" -msgstr "Vertex" +msgstr "Couleur de sommet" #: scene/resources/material.cpp msgid "Use As Albedo" -msgstr "" +msgstr "Utiliser comme albédo" #: scene/resources/material.cpp msgid "Is sRGB" -msgstr "" +msgstr "Est sRGB" #: scene/resources/material.cpp servers/visual_server.cpp msgid "Parameters" msgstr "Paramètres" #: scene/resources/material.cpp -#, fuzzy msgid "Diffuse Mode" -msgstr "Mode navigation" +msgstr "Mode diffus" #: scene/resources/material.cpp -#, fuzzy msgid "Specular Mode" -msgstr "Mode Règle" +msgstr "Mode spéculaire" #: scene/resources/material.cpp -#, fuzzy msgid "Depth Draw Mode" -msgstr "Mode d’interpolation" +msgstr "Mode de dessin en profondeur" #: scene/resources/material.cpp -#, fuzzy msgid "Line Width" -msgstr "Étendu à Gauche" +msgstr "Largeur de ligne" #: scene/resources/material.cpp -#, fuzzy msgid "Point Size" -msgstr "Vue de devant" +msgstr "Taille de point" #: scene/resources/material.cpp msgid "Billboard Mode" -msgstr "Mode billboard" +msgstr "Mode Billboard" #: scene/resources/material.cpp msgid "Billboard Keep Scale" -msgstr "Garder l'échelle du billboard" +msgstr "Garder l'échelle du Billboard" #: scene/resources/material.cpp msgid "Grow" -msgstr "" +msgstr "Croître" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "Quantité :" +msgstr "Quantité de croissance" #: scene/resources/material.cpp msgid "Use Alpha Scissor" -msgstr "" +msgstr "Utiliser la découpe alpha" #: scene/resources/material.cpp #, fuzzy @@ -27066,7 +26394,7 @@ msgstr "Image %" #: scene/resources/material.cpp msgid "Albedo" -msgstr "" +msgstr "Albédo" #: scene/resources/material.cpp msgid "Metallic" @@ -27092,7 +26420,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Rim" -msgstr "Bordure" +msgstr "Bord" #: scene/resources/material.cpp #, fuzzy @@ -27216,9 +26544,8 @@ msgid "Color Format" msgstr "Format de Couleur" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Transform Format" -msgstr "Transformation annulée." +msgstr "Format de transformation" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27234,9 +26561,8 @@ msgid "Visible Instance Count" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "Mise à l'échelle :" +msgstr "Échantillonnage" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27244,9 +26570,8 @@ msgid "Partition Type" msgstr "Définir type de variable" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Parsed Geometry Type" -msgstr "Analyse de la géométrie..." +msgstr "Type de la géométrie analysée" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" @@ -27303,9 +26628,8 @@ msgid "Details" msgstr "Afficher par défaut" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "Choisissez distance :" +msgstr "Échantillonner la distance" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27376,12 +26700,10 @@ msgid "Color Modifier" msgstr "Ralentissement de la vue libre" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "Points d'Émission :" +msgstr "Texture ponctuelle" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Normal Texture" msgstr "Texture Normale" @@ -27413,9 +26735,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "Plan :" +msgstr "Plan" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27489,9 +26810,8 @@ msgid "Bone" msgstr "Os" #: scene/resources/sky.cpp -#, fuzzy msgid "Radiance Size" -msgstr "Taille du contour :" +msgstr "Taille du rayonnement" #: scene/resources/sky.cpp msgid "Panorama" @@ -27783,9 +27103,8 @@ msgid "Default Cell Height" msgstr "En période de test" #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Edge Connection Margin" -msgstr "Modifier la connexion :" +msgstr "Marge de connexion des bords par défaut" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -27939,11 +27258,11 @@ msgstr "Ressource" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" -msgstr "" +msgstr "Plafond de dB" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Threshold dB" -msgstr "" +msgstr "Seuil de dB" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Soft Clip dB" @@ -27955,37 +27274,36 @@ msgstr "" #: servers/audio/effects/audio_effect_phaser.cpp msgid "Range Min Hz" -msgstr "" +msgstr "Borne inférieure de la plage (Hz)" #: servers/audio/effects/audio_effect_phaser.cpp msgid "Range Max Hz" -msgstr "" +msgstr "Borne supérieure de la plage (Hz)" #: servers/audio/effects/audio_effect_pitch_shift.cpp msgid "Oversampling" -msgstr "" +msgstr "Suréchantillonnage" #: servers/audio/effects/audio_effect_pitch_shift.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp msgid "FFT Size" -msgstr "Taille FFT" +msgstr "Taille des FFTs" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" -msgstr "" +msgstr "Pré-retarder" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Msec" -msgstr "" +msgstr "Millisec" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Room Size" -msgstr "" +msgstr "Taille de la salle" #: servers/audio/effects/audio_effect_reverb.cpp -#, fuzzy msgid "High-pass" -msgstr "Contourner" +msgstr "Passe-haut" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp msgid "Tap Back Pos" @@ -27996,27 +27314,24 @@ msgid "Pan Pullout" msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp -#, fuzzy msgid "Time Pullout (ms)" -msgstr "Délai dépassé." +msgstr "Temps de retrait (ms)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" -msgstr "" +msgstr "Surround" #: servers/audio_server.cpp -#, fuzzy msgid "Enable Audio Input" -msgstr "Renommer le bus audio" +msgstr "Activer l’entrée audio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "Sortie" +msgstr "Latence de sortie" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" -msgstr "" +msgstr "Désactiver le seuil de dB du canal" #: servers/audio_server.cpp #, fuzzy @@ -28025,43 +27340,39 @@ msgstr "Changer le temps de mélange" #: servers/audio_server.cpp msgid "Video Delay Compensation (ms)" -msgstr "" +msgstr "Compensation de retard vidéo (ms)" #: servers/audio_server.cpp -#, fuzzy msgid "Bus Count" -msgstr "Ajouter un port d'entrée" +msgstr "Nombre de ports" #: servers/audio_server.cpp -#, fuzzy msgid "Capture Device" -msgstr "Capturer depuis Pixel" +msgstr "Périphérique de capture" #: servers/audio_server.cpp -#, fuzzy msgid "Global Rate Scale" -msgstr "Variable globale" +msgstr "Echelle de débit global" #: servers/camera/camera_feed.cpp msgid "Feed" -msgstr "" +msgstr "Flux" #: servers/camera/camera_feed.cpp -#, fuzzy msgid "Is Active" -msgstr "Perspective" +msgstr "Est active" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" -msgstr "" +msgstr "Seuil linéaire de veille" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Angular" -msgstr "" +msgstr "Seuil angulaire de veille" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "Temps avant veille" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "BP Hash Table Size" @@ -28073,48 +27384,43 @@ msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "Masse inverse" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Vue libre gauche" +msgstr "Inertie inverse" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" -msgstr "" +msgstr "Amortissage angulaire total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Linear Damp" -msgstr "Linéaire" +msgstr "Amortissage linéaire total" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Total Gravity" -msgstr "Aperçu par défaut" +msgstr "Gravité totale" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Linear Velocity" -msgstr "Initialiser" +msgstr "Vélocité linéaire" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "Exclure" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" -msgstr "" +msgstr "RID de forme" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collide With Bodies" -msgstr "Mode collision" +msgstr "Collisions avec les corps" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "Collisions avec les zones" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" @@ -28356,14 +27662,12 @@ msgid "Use Software Skinning" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Ninepatch Mode" -msgstr "Mode d’interpolation" +msgstr "Mode Ninepatch" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Ouvrir" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -28388,12 +27692,11 @@ msgstr "Traitement en lot" #: servers/visual_server.cpp msgid "Use Batching" -msgstr "" +msgstr "Utiliser le traitement en lot" #: servers/visual_server.cpp -#, fuzzy msgid "Use Batching In Editor" -msgstr "Mise à jour de l'éditeur" +msgstr "Utiliser le traitement en lot dans l'éditeur" #: servers/visual_server.cpp msgid "Single Rect Fallback" @@ -28417,7 +27720,7 @@ msgstr "Nombre Maximal d'Éléments Joints" #: servers/visual_server.cpp msgid "Batch Buffer Size" -msgstr "" +msgstr "Taille de tampon des lots" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" @@ -28428,21 +27731,20 @@ msgid "Flash Batching" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Diagnose Frame" -msgstr "Coller une image" +msgstr "Diagnostiquer la trame" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" -msgstr "" +msgstr "Compatibilité" #: servers/visual_server.cpp msgid "Disable Half Float" -msgstr "" +msgstr "Désactiver les demi Float" #: servers/visual_server.cpp #, fuzzy @@ -28450,31 +27752,28 @@ msgid "Enable High Float" msgstr "Activer la priorité" #: servers/visual_server.cpp -#, fuzzy msgid "Precision" -msgstr "Expression" +msgstr "Précision" #: servers/visual_server.cpp msgid "UV Contract" -msgstr "" +msgstr "Contraction UV" #: servers/visual_server.cpp msgid "UV Contract Amount" -msgstr "" +msgstr "Quantité de contraction UV" #: servers/visual_server.cpp -#, fuzzy msgid "Use Simple PVS" -msgstr "Utiliser le magnétisme d'échelle" +msgstr "Utiliser PVS simple" #: servers/visual_server.cpp msgid "PVS Logging" -msgstr "" +msgstr "Journal PVS" #: servers/visual_server.cpp -#, fuzzy msgid "Use Signals" -msgstr "Signaux" +msgstr "Utiliser les signaux" #: servers/visual_server.cpp #, fuzzy @@ -28493,27 +27792,24 @@ msgstr "Voir la suppression de l'occlusion" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "Nombre maximum de sphères actives" #: servers/visual_server.cpp -#, fuzzy msgid "Max Active Polygons" -msgstr "Déplacer le polygone" +msgstr "Nombre maximum de polygones actifs" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Compilation Mode" -msgstr "Mode d’interpolation" +msgstr "Mode de compilation des shaders" #: servers/visual_server.cpp msgid "Max Simultaneous Compiles" -msgstr "" +msgstr "Nombre de compilations simultanées" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Shader Cache Size (MB)" -msgstr "Changer la taille d'une caméra" +msgstr "Taille du cache de shader (Mo)" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 17fc0b03fa..87e005f5f3 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -2720,8 +2720,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "CrannBeochan" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19452,14 +19453,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19480,14 +19480,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 191093a45d..29db0e8063 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -2851,7 +2851,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Copiar Ruta do Nodo" #: editor/editor_export.cpp @@ -20550,15 +20550,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Extensión inválida." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20580,15 +20580,15 @@ msgstr "Nome inválido." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Extensión inválida." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/he.po b/editor/translations/he.po index 2003351f93..abaada7880 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -2807,7 +2807,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "העתקת × ×ª×™×‘ המפרק" #: editor/editor_export.cpp @@ -20707,15 +20707,15 @@ msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ª×‘× ×™×ª לייצו×:" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "סיומת ×œ× ×—×•×§×™×ª." #: platform/windows/export/export.cpp #, fuzzy @@ -20739,15 +20739,15 @@ msgstr "×©× ×©×’×•×™." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "סיומת ×œ× ×—×•×§×™×ª." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 7faa61ab12..e5a41404d0 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -2804,8 +2804,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "खंड कौपी कीजिये" #: editor/editor_export.cpp #, fuzzy @@ -20309,15 +20310,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20339,15 +20340,15 @@ msgstr "अमानà¥à¤¯ नाम." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "गलत फॉणà¥à¤Ÿ का आकार |" #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 6d2b3b07da..e473c6556c 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -2773,8 +2773,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Animacija" #: editor/editor_export.cpp #, fuzzy @@ -19817,15 +19818,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Nevažeće ime." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -19847,15 +19848,15 @@ msgstr "Nevažeće ime." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Nevažeće ime." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/hu.po b/editor/translations/hu.po index cc7024a260..b35be76368 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -2872,7 +2872,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Node Útvonal Másolása" #: editor/editor_export.cpp @@ -20510,15 +20510,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Érvénytelen kiterjesztés." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20540,15 +20540,15 @@ msgstr "Érvénytelen név." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Érvénytelen kiterjesztés." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/id.po b/editor/translations/id.po index 8c447326e3..7d839357cd 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -45,8 +45,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: FellowMustard <rachmawanng33@gmail.com>\n" +"PO-Revision-Date: 2022-07-31 18:34+0000\n" +"Last-Translator: ProgrammerIndonesia 44 <elo.jhy@gmail.com>\n" "Language-Team: Indonesian <https://hosted.weblate.org/projects/godot-engine/" "godot/id/>\n" "Language: id\n" @@ -427,9 +427,8 @@ msgid "Command" msgstr "Perintah" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (Secara fisik)" +msgstr "(Secara fisik)" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -2805,13 +2804,12 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Salin Lokasi Node" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Paket Sukses Terpasang!" +msgstr "Sukses." #: editor/editor_export.cpp #, fuzzy @@ -3290,9 +3288,8 @@ msgid "Save a File" msgstr "Simpan sebuah File" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "Sukses!" +msgstr "Akses" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #, fuzzy @@ -12382,9 +12379,8 @@ msgid "Available Node-based types:" msgstr "Profil yang Tersedia:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "Nama berkas kosong." +msgstr "Nama tipe kosong!" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -19289,9 +19285,8 @@ msgid "Could not find keystore, unable to export." msgstr "Tidak dapat menemukan keystore, tidak bisa ekspor." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Tidak dapat memulai subproses!" +msgstr "Tidak dapat memulai apksigner." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19324,9 +19319,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Nama berkas tidak valid! APK Android memerlukan ekstensi *.apk ." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Format ekspor tidak didukung!\n" +msgstr "Format ekspor tidak didukung!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19337,15 +19331,12 @@ msgstr "" "versinya. Silakan pasang ulang dari menu 'Proyek'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Versi build Android tidak cocok:\n" -" Templat terpasang: %s\n" -" Versi Godot: %s\n" -"Silakan pasang ulang templat build Android dari menu 'Project'." +"Versi build Android tidak cocok: Templat terpasang: %s, Versi Godot: %s. " +"Silakan pasang ulang templat build Android dari menu 'Proyek'." #: platform/android/export/export_plugin.cpp msgid "" @@ -19353,9 +19344,8 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Tidak dapat menyunting proyek gradle dalam lokasi proyek\n" +msgstr "Tidak dapat mengekspor file proyek ke dalam lokasi proyek gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19366,13 +19356,12 @@ msgid "Building Android Project (gradle)" msgstr "Membangun Proyek Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Pembangunan proyek Android gagal, periksa output untuk galatnya.\n" -"Atau kunjungi docs.godotengine.org untuk dokumentasi build Android." +"Pembangunan proyek Android gagal, periksa output untuk galatnya. Atau " +"kunjungi docs.godotengine.org untuk dokumentasi build Android." #: platform/android/export/export_plugin.cpp msgid "Moving output" @@ -19397,11 +19386,8 @@ msgid "Creating APK..." msgstr "Membuat kontur..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Tidak dapat menemukan contoh APK untuk ekspor:\n" -"%s" +msgstr "Tidak dapat menemukan contoh APK untuk ekspor: \"%s\"" #: platform/android/export/export_plugin.cpp msgid "" @@ -19560,9 +19546,8 @@ msgid "Capabilities" msgstr "Kapabilitas" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "Sukses!" +msgstr "Akses Wi-Fi" #: platform/iphone/export/export.cpp #, fuzzy @@ -20110,9 +20095,8 @@ msgid "Could not open icon file \"%s\"." msgstr "Tidak dapat ekspor berkas proyek" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Tidak dapat memulai subproses!" +msgstr "Tidak dapat memulai subproses xcrun." #: platform/osx/export/export.cpp #, fuzzy @@ -20190,9 +20174,8 @@ msgid "DMG Creation" msgstr "Arah" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Tidak dapat memulai subproses!" +msgstr "Tidak dapat memulai subproses hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20274,7 +20257,7 @@ msgstr "Proyeksi" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Tidak dapat menyunting proyek gradle dalam lokasi proyek\n" +msgstr "Tidak dapat membuka file untuk membaca dari jalur \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20659,15 +20642,15 @@ msgstr "Tidak dapat menemukan keystore, tidak bisa ekspor." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Ekstensi tidak valid." #: platform/windows/export/export.cpp #, fuzzy @@ -20691,15 +20674,15 @@ msgstr "Nama tidak sah." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Ekstensi tidak valid." #: platform/windows/export/export.cpp #, fuzzy @@ -25445,9 +25428,8 @@ msgid "Draw 2D Outlines" msgstr "Buat Garis Tepi" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Arah" +msgstr "Refleksi" #: scene/main/scene_tree.cpp #, fuzzy @@ -26803,9 +26785,8 @@ msgstr "" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp -#, fuzzy msgid "2" -msgstr "2D" +msgstr "2" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp diff --git a/editor/translations/is.po b/editor/translations/is.po index 7a990ebd6b..512c660eef 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -2767,8 +2767,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Fjarlægja val" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19724,14 +19725,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19752,14 +19752,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/it.po b/editor/translations/it.po index 1d89d28a99..2c9f7eb6fe 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -76,8 +76,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: ale piccia <picciatialessio2@gmail.com>\n" +"PO-Revision-Date: 2022-07-31 18:34+0000\n" +"Last-Translator: Mirko <miknsop@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -473,6 +473,7 @@ msgid "Physical Scancode" msgstr "Scancode Fisico" #: core/os/input_event.cpp +#, fuzzy msgid "Unicode" msgstr "Unicode" @@ -900,6 +901,7 @@ msgid "Modules" msgstr "Moduli" #: core/register_core_types.cpp +#, fuzzy msgid "TCP" msgstr "TCP" @@ -2113,6 +2115,7 @@ msgid "Are you sure you want to remove all connections from the \"%s\" signal?" msgstr "Sei sicuro di voler rimuovere tutte le connessioni dal segnale \"%s\"?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp +#, fuzzy msgid "Signals" msgstr "Segnali" @@ -2811,7 +2814,7 @@ msgstr "Esportazione del progetto per la piattaforma:" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Completato con errori." #: editor/editor_export.cpp @@ -6995,6 +6998,7 @@ msgstr "Anisotropico" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp +#, fuzzy msgid "sRGB" msgstr "sRGB" @@ -18020,7 +18024,6 @@ msgid "Expression" msgstr "Espressione" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return" msgstr "Ritorno" @@ -18680,7 +18683,6 @@ msgid "Hand Tracking Frequency" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Passthrough" msgstr "Passthrough" @@ -20336,15 +20338,15 @@ msgstr "Non è stato possibile trovare keystore, impossible esportare." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Estensione non valida." #: platform/windows/export/export.cpp #, fuzzy @@ -20368,15 +20370,15 @@ msgstr "Nome non valido." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Estensione non valida." #: platform/windows/export/export.cpp #, fuzzy @@ -20924,9 +20926,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Vedi FPS" +msgstr "FPS fisso" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -26411,7 +26412,6 @@ msgid "Sky Contribution" msgstr "Condizione" #: scene/resources/environment.cpp -#, fuzzy msgid "Fog" msgstr "Nebbia" @@ -26758,7 +26758,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Is sRGB" -msgstr "" +msgstr "È sRGB" #: scene/resources/material.cpp servers/visual_server.cpp #, fuzzy @@ -26876,9 +26876,8 @@ msgid "Flowmap" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Ambient Occlusion" -msgstr "Occlusione" +msgstr "Occlusione ambientale" #: scene/resources/material.cpp msgid "Deep Parallax" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index a40939f777..60458e89df 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -2822,7 +2822,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "ノードã®ãƒ‘スをコピー" #: editor/editor_export.cpp @@ -20462,15 +20462,15 @@ msgstr "ã‚ーストアãŒè¦‹ã¤ã‹ã‚‰ãªã„ãŸã‚ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§ãã¾ #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "無効ãªå®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™ã€‚" #: platform/windows/export/export.cpp #, fuzzy @@ -20494,15 +20494,15 @@ msgstr "無効ãªåå‰ã§ã™ã€‚" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "無効ãªå®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™ã€‚" #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/ka.po b/editor/translations/ka.po index ae98d76c31..2e6e0e70e7 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -2847,8 +2847,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "მáƒáƒœáƒ˜áƒ¨áƒ•áƒœáƒ˜áƒ¡ მáƒáƒ¨áƒáƒ ებáƒ" #: editor/editor_export.cpp #, fuzzy @@ -20194,15 +20195,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20224,15 +20225,15 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ ი ფáƒáƒœáƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/km.po b/editor/translations/km.po index 4141c021e2..522cb30363 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -2695,8 +2695,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Anim ផ្លាស់ប្ážáž¼ážš Transform" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19318,14 +19319,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19347,14 +19347,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/ko.po b/editor/translations/ko.po index af0b7e99a5..a91450dd41 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -2761,7 +2761,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "íŒŒì¼ ê²½ë¡œ 완성" #: editor/editor_export.cpp @@ -20420,15 +20420,15 @@ msgstr "keystore를 ì°¾ì„ ìˆ˜ 없어, 내보낼 수 없었습니다." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "ìž˜ëª»ëœ í™•ìž¥ìž." #: platform/windows/export/export.cpp #, fuzzy @@ -20452,15 +20452,15 @@ msgstr "올바르지 ì•Šì€ ì´ë¦„입니다." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "ìž˜ëª»ëœ í™•ìž¥ìž." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/lt.po b/editor/translations/lt.po index 3b1140192a..66891e3f0e 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -2806,8 +2806,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Panaikinti pasirinkimÄ…" #: editor/editor_export.cpp msgid "Completed successfully." @@ -20215,15 +20216,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Netinkamas Å¡rifto dydis." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20245,15 +20246,15 @@ msgstr "Netinkamas Å¡rifto dydis." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Netinkamas Å¡rifto dydis." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/lv.po b/editor/translations/lv.po index f134fd5b48..c00e8d1a44 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -2819,7 +2819,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "KopÄ“t mezgla ceļu" #: editor/editor_export.cpp @@ -20022,15 +20022,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "NederÄ«gs paplaÅ¡inÄjums." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20052,15 +20052,15 @@ msgstr "NederÄ«gs nosaukums." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "NederÄ«gs paplaÅ¡inÄjums." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/mk.po b/editor/translations/mk.po index a3390bd895..2d183ec609 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -2704,7 +2704,7 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "" #: editor/editor_export.cpp @@ -19363,14 +19363,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19392,14 +19391,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 4cb867c040..7568bc881e 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -2715,8 +2715,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "ചലനം à´šàµà´±àµà´±àµ½" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19402,14 +19403,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19431,14 +19431,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 47b8bd3f86..4bdf5ba4fb 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -2715,8 +2715,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "अâ€à¥…निमेशन टà¥à¤°à¥€" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19403,14 +19404,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19432,14 +19432,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/ms.po b/editor/translations/ms.po index 055e18e0bc..61a60ad8fe 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -2745,8 +2745,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Salin Pilihan" #: editor/editor_export.cpp #, fuzzy @@ -20226,15 +20227,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Nama kumpulan tidak sah." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20256,15 +20257,15 @@ msgstr "Nama tidak sah." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Nama kumpulan tidak sah." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/nb.po b/editor/translations/nb.po index dac373fdc7..542d5987ca 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -2876,7 +2876,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Kopier Node-bane" #: editor/editor_export.cpp @@ -21049,15 +21049,15 @@ msgstr "Kunne ikke opprette mappe." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "MÃ¥ ha en gyldig filutvidelse." #: platform/windows/export/export.cpp #, fuzzy @@ -21081,15 +21081,15 @@ msgstr "Ugyldig navn." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "MÃ¥ ha en gyldig filutvidelse." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 40e0ddfb78..aaa0f38a1d 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -2916,7 +2916,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Knooppad kopiëren" #: editor/editor_export.cpp @@ -20936,15 +20936,15 @@ msgstr "Kon template niet openen voor export:" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Ongeldige extentie." #: platform/windows/export/export.cpp #, fuzzy @@ -20968,15 +20968,15 @@ msgstr "Ongeldige naam." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Ongeldige extentie." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 180abba988..3e4664c317 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -62,13 +62,14 @@ # Pixel Zone - Godot Engine Tutorials <karoltomaszewskimusic@gmail.com>, 2022. # DK0492 <doriankaczmarek28@gmail.com>, 2022. # Dawid Skubij <davidsd@tlen.pl>, 2022. +# kingofsponges <q.patex.q@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-10 14:38+0000\n" -"Last-Translator: Dawid Skubij <davidsd@tlen.pl>\n" +"PO-Revision-Date: 2022-08-04 06:38+0000\n" +"Last-Translator: kingofsponges <q.patex.q@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -77,7 +78,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13.1-dev\n" +"X-Generator: Weblate 4.14-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -338,7 +339,7 @@ msgstr "CzÅ‚onek transmisji" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "Big endian" #: core/io/stream_peer.cpp msgid "Data Array" @@ -368,9 +369,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "NiewystarczajÄ…ca ilość bajtów dla bajtów dekodujÄ…cych lub zÅ‚y format." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "NiewÅ‚aÅ›ciwe dane %i (nie przekazane) w wyrażeniu" +msgstr "NiewÅ‚aÅ›ciwe dane %d (nie przekazane) w wyrażeniu" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -415,14 +415,12 @@ msgid "Max Size (KB)" msgstr "Maks. rozmiar (KB)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "Tryb przesuwania" +msgstr "Tryb myszki" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "UsuÅ„ WejÅ›cie" +msgstr "Użyj skumulowanego wejÅ›cia" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -501,15 +499,15 @@ msgstr "Pochylenie" #: core/os/input_event.cpp msgid "Pressure" -msgstr "CiÅ›nienie" +msgstr "Nacisk" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Odwrócone pióro" #: core/os/input_event.cpp msgid "Relative" -msgstr "Relatywny" +msgstr "WzglÄ™dny" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp @@ -644,9 +642,8 @@ msgstr "WÅ‚asna nazwa katalogu użytkownika" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Pokaż wszystko" +msgstr "WyÅ›wietlanie" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -660,23 +657,20 @@ msgstr "Szerokość" #: scene/resources/capsule_shape_2d.cpp scene/resources/cylinder_shape.cpp #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp -#, fuzzy msgid "Height" -msgstr "ÅšwiatÅ‚o" +msgstr "Wysokość" #: core/project_settings.cpp msgid "Always On Top" msgstr "Zawsze na wierzchu" #: core/project_settings.cpp -#, fuzzy msgid "Test Width" -msgstr "RozciÄ…gnij po lewej" +msgstr "Szerokość testowa" #: core/project_settings.cpp -#, fuzzy msgid "Test Height" -msgstr "Testowanie" +msgstr "Wysokość testowa" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -699,9 +693,8 @@ msgid "Main Run Args" msgstr "Główne argumenty wÅ‚Ä…czania" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Åšcieżka sceny:" +msgstr "Nazywanie scen" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -712,14 +705,12 @@ msgid "Script Templates Search Path" msgstr "Åšcieżka wyszukiwania szablonów skryptów" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Automatyczne Å‚adowanie podczas uruchamiania" +msgstr "Automatyczne Å‚adowanie kontroli wersji podczas uruchamiania" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "Kontrola wersji" +msgstr "Nazwa wtyczki kontroli wersji" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -1204,7 +1195,7 @@ msgstr "IloÅ›c:" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumenty" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1228,7 +1219,7 @@ msgstr "Ustaw uchwyt" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp msgid "Stream" -msgstr "" +msgstr "StrumieÅ„" #: editor/animation_track_editor.cpp #, fuzzy @@ -2254,7 +2245,7 @@ msgstr "Otwórz" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "WÅ‚aÅ›ciciele: %s (Suma: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2814,11 +2805,11 @@ msgstr "Wybierz" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Eksportowanie projektu dla platformy:" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Skopiuj Å›cieżkÄ™ wÄ™zÅ‚a" #: editor/editor_export.cpp @@ -2844,14 +2835,12 @@ msgid "Packing" msgstr "Pakowanie" #: editor/editor_export.cpp -#, fuzzy msgid "Save PCK" -msgstr "Zapisz jako" +msgstr "Zapisz plik PCK" #: editor/editor_export.cpp -#, fuzzy msgid "Cannot create file \"%s\"." -msgstr "Nie można utworzyć katalogu." +msgstr "Nie można utworzyć pliku \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -20698,17 +20687,17 @@ msgstr "Nie udaÅ‚o siÄ™ znaleźć keystore, nie można eksportować." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "NarzÄ™dzie rcedit musi być skonfigurowane w Ustawieniach edytora (Eksport > " "Windows > Rcedit), aby zmienić ikonÄ™ lub dane informacji o aplikacji." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Niepoprawny plik wykonywalny." #: platform/windows/export/export.cpp #, fuzzy @@ -20733,17 +20722,17 @@ msgstr "NiewÅ‚aÅ›ciwa nazwa." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "NarzÄ™dzie rcedit musi być skonfigurowane w Ustawieniach edytora (Eksport > " "Windows > Rcedit), aby zmienić ikonÄ™ lub dane informacji o aplikacji." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Niepoprawny plik wykonywalny." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/pr.po b/editor/translations/pr.po index 337e5af5c0..4c073f8542 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -2799,7 +2799,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Forge yer Node!" #: editor/editor_export.cpp @@ -20263,15 +20263,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Yer Calligraphy be wrongly sized." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20293,15 +20293,15 @@ msgstr "Yer Calligraphy be wrongly sized." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Yer Calligraphy be wrongly sized." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." diff --git a/editor/translations/pt.po b/editor/translations/pt.po index db7171b3c6..f284e0ece8 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -2754,7 +2754,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "ConcluÃdo com erros." #: editor/editor_export.cpp @@ -20408,15 +20409,15 @@ msgstr "Incapaz de encontrar keystore e exportar." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Extensão inválida." #: platform/windows/export/export.cpp #, fuzzy @@ -20440,15 +20441,15 @@ msgstr "Nome inválido." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Extensão inválida." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 5d2b642352..84a5ac45c3 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -149,7 +149,7 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-07-27 13:26+0000\n" +"PO-Revision-Date: 2022-08-04 06:38+0000\n" "Last-Translator: Felipe Kinoshita <kinofhek@gmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" @@ -2868,7 +2868,8 @@ msgid "Project export for platform:" msgstr "Exportação do projeto para plataforma:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "ConcluÃdo com erros." #: editor/editor_export.cpp @@ -5495,7 +5496,7 @@ msgstr "Tamanho da Miniatura" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Docas" +msgstr "Docks" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -16364,7 +16365,7 @@ msgstr "stdout" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "Mostrar FPS" #: main/main.cpp msgid "Verbose stdout" @@ -20360,15 +20361,15 @@ msgstr "O keystore não foi encontrado, não foi possÃvel exportar." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Extensão inválida." #: platform/windows/export/export.cpp #, fuzzy @@ -20391,15 +20392,15 @@ msgstr "Nome Inválido." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Extensão inválida." #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -24458,7 +24459,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Circunflexo" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index aaa6e1cbcb..a78712c6ba 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -2836,8 +2836,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Copiază SelecÈ›ia" #: editor/editor_export.cpp #, fuzzy @@ -20739,15 +20740,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Trebuie să utilizaÅ£i o extensie valida." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20769,15 +20770,15 @@ msgstr "Nume nevalid." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Trebuie să utilizaÅ£i o extensie valida." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/ru.po b/editor/translations/ru.po index c50dce8e01..1df1d87308 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -2852,7 +2852,8 @@ msgid "Project export for platform:" msgstr "ÐкÑпорт проекта Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "Завершено Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸." #: editor/editor_export.cpp @@ -20280,17 +20281,17 @@ msgstr "Ðе удалоÑÑŒ найти хранилище ключей, нево #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "ИнÑтрумент rcedit должен быть наÑтроен в ÐаÑтройках редактора (Export > " "Windows > Rcedit) Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐºÐ° или информационных данных приложениÑ." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "ÐедопуÑтимый иÑполнÑемый файл." #: platform/windows/export/export.cpp #, fuzzy @@ -20315,17 +20316,17 @@ msgstr "ÐедопуÑтимое имÑ." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "ИнÑтрумент rcedit должен быть наÑтроен в ÐаÑтройках редактора (Export > " "Windows > Rcedit) Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐºÐ° или информационных данных приложениÑ." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "ÐедопуÑтимый иÑполнÑемый файл." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/si.po b/editor/translations/si.po index e30d6c27ab..8ce2d1d628 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -2745,8 +2745,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "à·à·Šâ€à¶»à·’à¶:" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19620,14 +19621,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19649,14 +19649,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/sk.po b/editor/translations/sk.po index c3a64ecc2f..7cba3886ba 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -2854,8 +2854,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "SkopÃrovaÅ¥ Výber" #: editor/editor_export.cpp #, fuzzy @@ -20662,15 +20663,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Nesprávna veľkosÅ¥ pÃsma." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20692,15 +20693,15 @@ msgstr "Neplatný Názov." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Nesprávna veľkosÅ¥ pÃsma." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/sl.po b/editor/translations/sl.po index 4f7f11baa3..ceb21aa750 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -2887,8 +2887,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Odstrani izbrano" #: editor/editor_export.cpp #, fuzzy @@ -20961,15 +20962,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Uporabiti moraÅ¡ valjavno razÅ¡iritev." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20991,15 +20992,15 @@ msgstr "Neveljavno ime." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Uporabiti moraÅ¡ valjavno razÅ¡iritev." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/sq.po b/editor/translations/sq.po index d011c34407..af72b686b9 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -2824,8 +2824,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Animacionet:" #: editor/editor_export.cpp #, fuzzy @@ -20432,15 +20433,15 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Duhet të perdorësh një shtesë të lejuar." #: platform/windows/export/export.cpp msgid "Could not find signtool executable at \"%s\"." @@ -20462,15 +20463,15 @@ msgstr "Emër i palejuar." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Duhet të perdorësh një shtesë të lejuar." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index 4a9d933004..4231d62c6b 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -3003,7 +3003,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Копирај Путању Чвора" #: editor/editor_export.cpp @@ -22362,15 +22362,15 @@ msgstr "ÐеуÑпешно отварање нацрта за извоз:" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Мора Ñе кориÑтити важећа екÑтензија." #: platform/windows/export/export.cpp #, fuzzy @@ -22394,15 +22394,15 @@ msgstr "Ðеважеће име." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Мора Ñе кориÑтити важећа екÑтензија." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 41b23339de..b898108402 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -2769,8 +2769,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Kopiraj OznaÄeno" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19709,14 +19710,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19738,14 +19738,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 3baefa6356..9fd6b9bf67 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -2852,7 +2852,7 @@ msgstr "Projektexport för plattformen:" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Kopiera Nod-Sökväg" #: editor/editor_export.cpp @@ -20723,15 +20723,15 @@ msgstr "Det gick inte att hitta nyckellager, det gick inte att exportera." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "MÃ¥ste använda en giltigt filändelse." #: platform/windows/export/export.cpp #, fuzzy @@ -20755,15 +20755,15 @@ msgstr "Ogiltigt namn." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "MÃ¥ste använda en giltigt filändelse." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/te.po b/editor/translations/te.po index 03919233f7..af4c65f062 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -2698,8 +2698,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "సంఘం" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19324,14 +19325,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -19352,14 +19352,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/th.po b/editor/translations/th.po index 1690916a54..f1eb8b716f 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -2875,7 +2875,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "คัดลà¸à¸à¸•à¸³à¹à¸«à¸™à¹ˆà¸‡à¹‚หนด" #: editor/editor_export.cpp @@ -20710,15 +20710,15 @@ msgstr "เปิดเทมเพลตเพื่à¸à¸ªà¹ˆà¸‡à¸à¸à¸à¹„ม #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "นามสà¸à¸¸à¸¥à¹„ม่ถูà¸à¸•à¹‰à¸à¸‡" #: platform/windows/export/export.cpp #, fuzzy @@ -20742,15 +20742,15 @@ msgstr "ชื่à¸à¸œà¸´à¸”พลาด" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "นามสà¸à¸¸à¸¥à¹„ม่ถูà¸à¸•à¹‰à¸à¸‡" #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/tl.po b/editor/translations/tl.po index cc20958dd1..fec7766383 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -2814,8 +2814,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr "Kopyahin Ang Pinagpipilian" #: editor/editor_export.cpp msgid "Completed successfully." @@ -19980,14 +19981,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -20010,14 +20010,13 @@ msgstr "Di-wastong pangalan." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 4980240671..ab58a87c36 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -77,13 +77,14 @@ # Deleted User <noreply+46833@weblate.org>, 2022. # Emre <mr.inkaya@gmail.com>, 2022. # Deleted User <noreply+46858@weblate.org>, 2022. +# Ãœmid Quliyev <lucifer25x@protonmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Deleted User <noreply+46858@weblate.org>\n" +"PO-Revision-Date: 2022-08-05 01:04+0000\n" +"Last-Translator: Ãœmid Quliyev <lucifer25x@protonmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -360,7 +361,7 @@ msgstr "Veri Dizisi" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "TokalaÅŸmayı blokla" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -411,7 +412,6 @@ msgstr "'%s' çaÄŸrıldığında:" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Seed" msgstr "Tohum" @@ -449,7 +449,6 @@ msgid "Shift" msgstr "Shift" #: core/os/input_event.cpp -#, fuzzy msgid "Control" msgstr "Kontrol TuÅŸu" @@ -2833,7 +2832,7 @@ msgstr "Platform için proje dışa aktarımı:" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Hatalarla tamamlandı." #: editor/editor_export.cpp @@ -4459,8 +4458,9 @@ msgid "Restore Scenes On Load" msgstr "Sahne Düğümünü Al" #: editor/editor_node.cpp editor/editor_settings.cpp +#, fuzzy msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "Fareyle üzerine gelindiÄŸinde  küçük resmi göster" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4486,11 +4486,11 @@ msgstr "" #: editor/editor_node.cpp msgid "Horizontal Vector2 Editing" -msgstr "" +msgstr "Yatay Vector2 Düzenleme" #: editor/editor_node.cpp msgid "Horizontal Vector Types Editing" -msgstr "" +msgstr "Yatay Vector tipleri düzenleme" #: editor/editor_node.cpp #, fuzzy @@ -4503,8 +4503,9 @@ msgid "Resources To Open In New Inspector" msgstr "Gözetmen Bölümünde Aç" #: editor/editor_node.cpp +#, fuzzy msgid "Default Color Picker Mode" -msgstr "" +msgstr "Varsayılan renk seçme modu" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -5380,19 +5381,19 @@ msgstr "Hepsini Görüntüle" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Özel Ekran ÖlçeÄŸi" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "" +msgstr "Ana font ölçüsü" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Kod font'u ölçüsü" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "Kenarı yumuÅŸatılmış font" #: editor/editor_settings.cpp msgid "Font Hinting" @@ -5405,7 +5406,7 @@ msgstr "Ana Sahne" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "" +msgstr "Ana font kalınlığı" #: editor/editor_settings.cpp #, fuzzy @@ -5413,8 +5414,9 @@ msgid "Code Font" msgstr "Düğüm Noktası Ekle" #: editor/editor_settings.cpp +#, fuzzy msgid "Dim Editor On Dialog Popup" -msgstr "" +msgstr "Ä°letiÅŸim penceresinde Dim Editörü" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" @@ -5431,11 +5433,12 @@ msgstr "Dikkat Dağıtmayan Kip" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "Otomatik olarak ekran görüntülerini aç" #: editor/editor_settings.cpp +#, fuzzy msgid "Max Array Dictionary Items Per Page" -msgstr "" +msgstr "Her sayfada maks dizi sözlüğü öğesi" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #: editor/plugins/theme_editor_plugin.cpp scene/gui/control.cpp @@ -5449,7 +5452,7 @@ msgstr "Ön ayar" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Simge ve Font rengi" #: editor/editor_settings.cpp #, fuzzy @@ -5463,7 +5466,7 @@ msgstr "Renk Seç" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "Kontrast" #: editor/editor_settings.cpp msgid "Relationship Line Opacity" @@ -5561,8 +5564,9 @@ msgid "Property Editor" msgstr "Grup Düzenleyici" #: editor/editor_settings.cpp +#, fuzzy msgid "Auto Refresh Interval" -msgstr "" +msgstr "Otomatik yenileme intervalı" #: editor/editor_settings.cpp #, fuzzy @@ -5577,7 +5581,7 @@ msgstr "Editör Teması" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Line Spacing" -msgstr "" +msgstr "Satır aralığı" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp @@ -5596,7 +5600,7 @@ msgstr "" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "" +msgstr "Geçerli satırı vurgula" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" @@ -5635,11 +5639,11 @@ msgstr "Gezinim" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "" +msgstr "Pürüzsüz kaydırma" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "V kaydırma hızı" #: editor/editor_settings.cpp #, fuzzy @@ -5648,7 +5652,7 @@ msgstr "BaÅŸlatımı Göster" #: editor/editor_settings.cpp msgid "Minimap Width" -msgstr "" +msgstr "Küçük Harita GeniÅŸliÄŸi" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" @@ -5660,12 +5664,13 @@ msgid "Drag And Drop Selection" msgstr "GridMap Seçimi" #: editor/editor_settings.cpp +#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "SeçilmiÅŸ Düğümde Script Editöründe Kal" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "Dış görünüş" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5691,12 +5696,14 @@ msgid "Show Info Gutter" msgstr "" #: editor/editor_settings.cpp +#, fuzzy msgid "Code Folding" -msgstr "" +msgstr "Kod katlama" #: editor/editor_settings.cpp +#, fuzzy msgid "Word Wrap" -msgstr "" +msgstr "Kelime Paketle" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" @@ -5717,7 +5724,7 @@ msgstr "Kod Düzenleyici" #: editor/editor_settings.cpp msgid "Show Members Overview" -msgstr "" +msgstr "Ãœyelerin Genel Bakışını Göster" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5734,16 +5741,19 @@ msgid "Autosave Interval Secs" msgstr "" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp +#, fuzzy msgid "Restore Scripts On Load" -msgstr "" +msgstr "Script'leri Yüklemede Eski Haline Getir" #: editor/editor_settings.cpp +#, fuzzy msgid "Auto Reload And Parse Scripts On Save" -msgstr "" +msgstr "Kaydederken Script'leri Otomatik Tekrar yükle ve Ayrıştır" #: editor/editor_settings.cpp +#, fuzzy msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "Dış DeÄŸiÅŸiklikte Otomatik Olarak Script'i Geri Yükle" #: editor/editor_settings.cpp #, fuzzy @@ -5756,11 +5766,11 @@ msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" -msgstr "" +msgstr "Ä°mleç" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "Dosyanın Sonunu Kaydır" #: editor/editor_settings.cpp msgid "Block Caret" @@ -5796,7 +5806,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "Kod Tamamlama Gecikme Süresi" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" @@ -5853,12 +5863,14 @@ msgid "Preview Size" msgstr "Önizleme" #: editor/editor_settings.cpp +#, fuzzy msgid "Primary Grid Color" -msgstr "" +msgstr "Birincil Izgara Rengi" #: editor/editor_settings.cpp +#, fuzzy msgid "Secondary Grid Color" -msgstr "" +msgstr "Ä°kincil Izgara Rengi" #: editor/editor_settings.cpp #, fuzzy @@ -5895,7 +5907,7 @@ msgstr "Nokta" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Shape" -msgstr "" +msgstr "Åžekil" #: editor/editor_settings.cpp #, fuzzy @@ -6007,7 +6019,7 @@ msgstr "Gezinim Kipi" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "Yörünge Hassasiyeti" #: editor/editor_settings.cpp msgid "Orbit Inertia" @@ -20660,15 +20672,15 @@ msgstr "Anahtar deposu bulunamadı, dışa aktarılamadı." #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Geçersiz uzantı." #: platform/windows/export/export.cpp #, fuzzy @@ -20692,15 +20704,15 @@ msgstr "Geçersiz ad." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Geçersiz uzantı." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 0feae1a849..d87aa168d7 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -2757,7 +2757,8 @@ msgid "Project export for platform:" msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ”ÐºÑ‚Ñƒ Ð´Ð»Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð¸:" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "Завершено з помилками." #: editor/editor_export.cpp @@ -20123,18 +20124,18 @@ msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñховище ключів. Ðемож #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "Щоб мати змогу змінювати піктограму або дані щодо програми, має бути " "налаштовано інÑтрумент rcedit у параметрах редактора (ЕкÑпорт > Windows > " "Rcedit)." #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Ðекоректний виконуваний файл." #: platform/windows/export/export.cpp #, fuzzy @@ -20159,18 +20160,18 @@ msgstr "Ðекоректна назва." #: platform/windows/export/export.cpp #, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "Щоб мати змогу змінювати піктограму або дані щодо програми, має бути " "налаштовано інÑтрумент rcedit у параметрах редактора (ЕкÑпорт > Windows > " "Rcedit)." #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Ðекоректний виконуваний файл." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index 9cb56f3c21..a428250cc7 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -2764,8 +2764,9 @@ msgid "Project export for platform:" msgstr "" #: editor/editor_export.cpp -msgid "Completed with errors." -msgstr "" +#, fuzzy +msgid "Completed with warnings." +msgstr ".تمام کا انتخاب" #: editor/editor_export.cpp msgid "Completed successfully." @@ -20062,14 +20063,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +msgid "rcedit failed to modify executable: %s." msgstr "" #: platform/windows/export/export.cpp @@ -20091,14 +20091,13 @@ msgstr "" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +msgid "Signtool failed to sign executable: %s." msgstr "" #: platform/windows/export/export.cpp diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 4a6164f7e1..0a6885872f 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -2797,7 +2797,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "Sao chép Ä‘Æ°á»ng dẫn nút" #: editor/editor_export.cpp @@ -20574,15 +20574,15 @@ msgstr "Không thể mở bản mẫu để xuất:" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "Tên Ä‘uôi không hợp lệ." #: platform/windows/export/export.cpp #, fuzzy @@ -20606,15 +20606,15 @@ msgstr "Tên không hợp lệ." #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "Tên Ä‘uôi không hợp lệ." #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index bd012a4c76..f25a372128 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -89,7 +89,7 @@ msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-07-19 16:26+0000\n" +"PO-Revision-Date: 2022-07-29 01:36+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -2791,7 +2791,8 @@ msgid "Project export for platform:" msgstr "针对平å°å¯¼å‡ºé¡¹ç›®ï¼š" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "已完æˆï¼Œå˜åœ¨é”™è¯¯ã€‚" #: editor/editor_export.cpp @@ -5445,7 +5446,7 @@ msgstr "拖放选ä¸å†…容" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "选ä¸èŠ‚点时ä¿æŒè„šæœ¬ç¼–辑器" #: editor/editor_settings.cpp msgid "Appearance" @@ -11470,9 +11471,8 @@ msgid "New Animation" msgstr "新建动画" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "ç›é€‰æ–¹æ³•" +msgstr "ç›é€‰åŠ¨ç”»" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -19681,17 +19681,18 @@ msgid "Could not find wine executable at \"%s\"." msgstr "æ— æ³•åœ¨â€œ%sâ€æ‰¾åˆ° wine å¯æ‰§è¡Œæ–‡ä»¶ã€‚" #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" "æ— æ³•å¯åŠ¨ rcedit å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® rcedit 路径(导出 > Windows " "> Rcedit)。" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" +#, fuzzy +msgid "rcedit failed to modify executable: %s." msgstr "" "rcedit 修改å¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" "%s" @@ -19713,17 +19714,18 @@ msgid "Invalid timestamp server." msgstr "时间戳æœåŠ¡å™¨æ— 效。" #: platform/windows/export/export.cpp +#, fuzzy msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" "æ— æ³•å¯åŠ¨ signtool å¯æ‰§è¡Œæ–‡ä»¶ï¼Œè¯·åœ¨ç¼–辑器设置ä¸é…ç½® signtool 路径(导出 > " "Windows > Signtool)。" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" +#, fuzzy +msgid "Signtool failed to sign executable: %s." msgstr "" "Signtool ç¾åå¯æ‰§è¡Œæ–‡ä»¶å¤±è´¥ï¼š\n" "%s" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index 424752a849..79760d0de7 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -2891,7 +2891,7 @@ msgstr "" #: editor/editor_export.cpp #, fuzzy -msgid "Completed with errors." +msgid "Completed with warnings." msgstr "複製路徑" #: editor/editor_export.cpp @@ -20867,15 +20867,15 @@ msgstr "無法新增資料夾" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "無效副檔å" #: platform/windows/export/export.cpp #, fuzzy @@ -20899,15 +20899,15 @@ msgstr "無效å稱。" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "無效副檔å" #: platform/windows/export/export.cpp #, fuzzy diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index f5568c41b5..8ad86d4b2a 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -23,7 +23,7 @@ # binotaliu <binota@protonmail.ch>, 2020. # Allen H. <w84miracle@gmail.com>, 2020. # BinotaLIU <binota@protonmail.ch>, 2020. -# BinotaLIU <me@binota.org>, 2020, 2021. +# BinotaLIU <me@binota.org>, 2020, 2021, 2022. # MintSoda <lionlxh@qq.com>, 2020. # meowmeowmeowcat <meowmeowcat1211@gmail.com>, 2021. # anthonychen <anton1554970211@126.com>, 2021. @@ -41,8 +41,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: è˜è˜ <rrt467778@gmail.com>\n" +"PO-Revision-Date: 2022-07-31 18:34+0000\n" +"Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -474,7 +474,7 @@ msgstr "壓力" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "å轉ç†è§¸" #: core/os/input_event.cpp msgid "Relative" @@ -1171,14 +1171,12 @@ msgid "Type" msgstr "型別" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "輸入把手" +msgstr "進入控點" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "輸出把手" +msgstr "離開控點" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1350,14 +1348,12 @@ msgid "Easing:" msgstr "緩入緩出:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "進入控點:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "è¨å®šè™•ç†ç¨‹å¼" +msgstr "離開控點:" #: editor/animation_track_editor.cpp msgid "Stream:" @@ -2747,7 +2743,8 @@ msgid "Project export for platform:" msgstr "專案匯出平å°ï¼š" #: editor/editor_export.cpp -msgid "Completed with errors." +#, fuzzy +msgid "Completed with warnings." msgstr "已完æˆï¼Œå˜åœ¨éŒ¯èª¤ã€‚" #: editor/editor_export.cpp @@ -5195,9 +5192,8 @@ msgid "Unfocused Low Processor Mode Sleep (µsec)" msgstr "未èšç„¦ä½Žè™•ç†å™¨ç¡çœ 模å¼ï¼ˆå¾®ç§’)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "專注模å¼" +msgstr "ç¨ç«‹å°ˆæ³¨æ¨¡å¼" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" @@ -5404,7 +5400,7 @@ msgstr "拖移é¸æ“‡çš„檔案" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "é¸æ“‡ç¯€é»žæ™‚ä¿ç•™åœ¨è…³æœ¬ç·¨è¼¯å™¨ä¸" #: editor/editor_settings.cpp msgid "Appearance" @@ -5423,9 +5419,8 @@ msgid "Show Bookmark Gutter" msgstr "顯示書籤欄" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "è·³éŽä¸æ–·é»ž" +msgstr "顯示ä¸æ–·é»žæ¬„" #: editor/editor_settings.cpp msgid "Show Info Gutter" @@ -5464,9 +5459,8 @@ msgid "Files" msgstr "檔案" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "移除後方空白å—å…ƒ" +msgstr "ä¿å˜æ™‚移除後方空白å—å…ƒ" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" @@ -5513,9 +5507,8 @@ msgid "Caret Blink Speed" msgstr "æ’入符閃çˆé€Ÿåº¦" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "å³éµé»žæ“Šä»¥æ–°å¢žæŽ§åˆ¶é»ž" +msgstr "按一下å³éµä¾†ç§»å‹•éŠæ¨™" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp @@ -5544,9 +5537,8 @@ msgid "Callhint Tooltip Offset" msgstr "呼å«æ示工具æ示框å移é‡" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "複製節點路徑" +msgstr "補全檔案路徑" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp msgid "Add Type Hints" @@ -5713,9 +5705,8 @@ msgid "Warped Mouse Panning" msgstr "å½Žæ›²æ»‘é¼ å¹³ç§»" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "導航模å¼" +msgstr "å°Žèˆªé¢¨æ ¼" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -5972,21 +5963,20 @@ msgid "Completion Background Color" msgstr "自動補全背景é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "匯入所é¸" +msgstr "自動補全所é¸é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "完æˆå˜åœ¨ä¸é¡è‰²" +msgstr "自動補全ç¾æœ‰é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "完æˆæ»¾å‹•é¡è‰²" +msgstr "自動補全æ²è»¸é¡è‰²" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "完æˆå—åž‹é¡è‰²" +msgstr "自動補全å—åž‹é¡è‰²" #: editor/editor_settings.cpp msgid "Text Color" @@ -6739,7 +6729,7 @@ msgstr "使用環境通é“" #: editor/import/resource_importer_bitmask.cpp msgid "Create From" -msgstr "從æŸè™•å»ºç«‹" +msgstr "建立自" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp @@ -6751,9 +6741,8 @@ msgstr "臨界值" #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "元件" +msgstr "壓縮" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" @@ -6803,9 +6792,8 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "自動剪è£" +msgstr "切片" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -6822,9 +6810,8 @@ msgid "Vertical" msgstr "åž‚ç›´" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "產生點" +msgstr "產生切線" #: editor/import/resource_importer_obj.cpp msgid "Scale Mesh" @@ -6836,9 +6823,8 @@ msgstr "Mesh å移" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "è¨å®šè¡¨ç¤ºå¼" +msgstr "å…«é¢é«”壓縮" #: editor/import/resource_importer_obj.cpp msgid "Optimize Mesh Flags" @@ -6926,27 +6912,24 @@ msgid "Meshes" msgstr "ç¶²æ ¼" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "修改曲線切線" +msgstr "確ä¿åˆ‡ç·š" #: editor/import/resource_importer_scene.cpp msgid "Light Baking" msgstr "光照烘焙" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "烘焙光照圖" +msgstr "光照圖紋ç†å…ƒç´ 大å°" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" msgstr "Skin" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "使用縮放å¸é™„" +msgstr "使用命å Skin" #: editor/import/resource_importer_scene.cpp msgid "External Files" @@ -6961,9 +6944,8 @@ msgid "Filter Script" msgstr "篩é¸è…³æœ¬" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "變æ›" +msgstr "ä¿ç•™è‡ªå®šè»Œé“" #: editor/import/resource_importer_scene.cpp msgid "Optimizer" @@ -8769,7 +8751,7 @@ msgstr "縮放模å¼" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift:按比例縮放。" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9287,11 +9269,11 @@ msgstr "漸層編輯" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "äº¤æ› GradientTexture2D 的填充點" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "äº¤æ› Gradient 填充點" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Toggle Grid Snap" @@ -10096,7 +10078,7 @@ msgstr "åŒæ¥éª¨éª¼åˆ°å¤šé‚Šå½¢" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "è¨å®š cast_to" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10425,7 +10407,7 @@ msgstr "æœå°‹çµæžœ" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "å ´æ™¯æ›´æ”¹æ™‚é–‹å•Ÿä¸»è…³æœ¬" #: editor/plugins/script_editor_plugin.cpp msgid "External" @@ -10449,7 +10431,7 @@ msgstr "強調顯示目å‰çš„腳本" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "腳本溫度æ·å²å¤§å°" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" @@ -10469,7 +10451,7 @@ msgstr "將腳本å稱列為" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "執行旗標" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -10986,43 +10968,43 @@ msgstr "(ä¸åœ¨GLES2ä¸)" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "Debug draw modes are only available when using the GLES3 renderer, not GLES2." -msgstr "除錯繪製模å¼åƒ…在使用 GLES3 算繪引擎時å¯ç”¨ï¼ŒGLES2 ä¸å¯ç”¨ã€‚" +msgstr "除錯繪製模å¼åƒ…å¯åœ¨ GLES3 算繪引擎下使用,無法在 GLES2 下使用。" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" -msgstr "自由視圖 å·¦" +msgstr "自由觀看 å·¦" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Right" -msgstr "自由視圖 å³" +msgstr "自由觀看 å³" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Forward" -msgstr "自由視圖 å‰" +msgstr "自由觀看 å‰" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Backwards" -msgstr "自由視圖 後" +msgstr "自由觀看 後" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Up" -msgstr "自由視圖 上" +msgstr "自由觀看 上" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Down" -msgstr "自由視圖 下" +msgstr "自由觀看 下" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Speed Modifier" -msgstr "åŠ é€Ÿè‡ªç”±è¦–åœ–é€Ÿåº¦" +msgstr "自由觀看速度調整" #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Slow Modifier" -msgstr "放慢自由視圖速度" +msgstr "自由觀看減速調整" #: editor/plugins/spatial_editor_plugin.cpp msgid "Toggle Camera Preview" -msgstr "切æ›ç›¸æ©Ÿé 覽開關" +msgstr "é–‹å•Ÿï¼é—œé–‰ç›¸æ©Ÿé 覽" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Rotation Locked" @@ -11031,7 +11013,7 @@ msgstr "視圖旋轉已鎖定" #: editor/plugins/spatial_editor_plugin.cpp msgid "" "To zoom further, change the camera's clipping planes (View -> Settings...)" -msgstr "è‹¥è¦å†ç¹¼çºŒæ”¾å¤§ï¼Œè«‹è‡³ 檢視 -> è¨å®š... 修改æ”影機的剪è£å¹³é¢" +msgstr "è‹¥è¦å†ç¹¼çºŒæ”¾å¤§ï¼Œè«‹è‡³ [檢視] -> [è¨å®š...] 修改æ”影機的剪è£å¹³é¢" #: editor/plugins/spatial_editor_plugin.cpp msgid "" @@ -11278,16 +11260,15 @@ msgstr "後置" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "æ“ç¸±å™¨æŽ§åˆ¶é …å¤§å°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "æ“ç¸±å™¨æŽ§åˆ¶é …ä¸é€æ˜Žåº¦" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Show Viewport Rotation Gizmo" -msgstr "鎖定視角旋轉" +msgstr "顯示檢視å€çš„旋轉控制器" #: editor/plugins/spatial_editor_plugin.cpp msgid "Unnamed Gizmo" @@ -11338,9 +11319,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ç„¡æ•ˆçš„å¹¾ä½•åœ–å½¢ï¼Œç„¡æ³•ä»¥ç¶²æ ¼å–代。" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "轉æ›ç‚º Mesh2D" +msgstr "轉æ›ç‚º MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11443,9 +11423,8 @@ msgid "New Animation" msgstr "新增動畫" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "篩é¸æ–¹æ³•" +msgstr "篩é¸å‹•ç•«" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11742,9 +11721,8 @@ msgstr "" "確定è¦é—œé–‰å—Žï¼Ÿ" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "移除圖塊" +msgstr "移除型別" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -11787,14 +11765,12 @@ msgstr "" "æ‰‹å‹•åŠ å…¥æ›´å¤šé …ç›®æ–¼å…¶ä¸æˆ–從å¦ä¸€å€‹ä¸»é¡ŒåŒ¯å…¥ã€‚" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Type" -msgstr "æ–°å¢žé …ç›®é¡žåž‹" +msgstr "新增主題型別" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Theme Type" -msgstr "ç§»é™¤é …ç›®" +msgstr "移除主題型別" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -11909,9 +11885,8 @@ msgid "Select Another Theme Resource:" msgstr "é¸æ“‡å…¶ä»–主題資æºï¼š" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme Resource" -msgstr "é‡æ–°å‘½å資æº" +msgstr "主題資æº" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -11923,21 +11898,19 @@ msgstr "新增類別" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "篩é¸åž‹åˆ¥åˆ—表,或是建立新的自定型別:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "å¯ç”¨è¨å®šæª”:" +msgstr "å¯ç”¨ä¹‹åŸºæ–¼ç¯€é»žçš„型別:" #: editor/plugins/theme_editor_plugin.cpp msgid "Type name is empty!" msgstr "型別å稱為空ï¼" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "確定è¦æ‰“開多個專案嗎?" +msgstr "確定è¦å»ºç«‹ç©ºåž‹åˆ¥å—Žï¼Ÿ" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -11967,14 +11940,12 @@ msgid "Add Item Type" msgstr "æ–°å¢žé …ç›®é¡žåž‹" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Variation Base Type" -msgstr "è¨å®šè®Šæ•¸åž‹åˆ¥" +msgstr "è¨å®šè®ŠåŒ–基礎型別" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Base Type" -msgstr "更改基礎型別" +msgstr "è¨å®šåŸºç¤Žåž‹åˆ¥" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" @@ -11994,13 +11965,13 @@ msgstr "複寫所有é è¨é¡žåˆ¥é …目。" #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "從å¯ç”¨çš„型別列表ä¸é¸æ“‡åŸºç¤Žåž‹åˆ¥çš„變化。" #: editor/plugins/theme_editor_plugin.cpp msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." -msgstr "" +msgstr "與內建型別相關è¯çš„型別無法被標記為å¦ä¸€å€‹åž‹åˆ¥çš„變化。" #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12235,55 +12206,46 @@ msgid "Clear Transform" msgstr "清除變æ›" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Tile Map" -msgstr "繪製圖塊地圖" +msgstr "圖塊地圖" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "調色盤最å°å¯¬åº¦" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "帶å稱的分隔線" +msgstr "èª¿è‰²ç›¤é …ç›®çš„æ°´å¹³åˆ†éš”ç·š" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Names" -msgstr "顯示所有地å€" +msgstr "顯示圖塊å稱" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Ids" -msgstr "顯示尺è¦" +msgstr "顯示圖塊 ID" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Sort Tiles By Name" -msgstr "檔案排åº" +msgstr "以å稱排åºåœ–å¡Š" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill Preview" -msgstr "油漆桶填滿" +msgstr "油漆桶填充é 覽" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editor Side" -msgstr "編輯器" +msgstr "編輯器å´æ¬„" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Display Grid" -msgstr "顯示éŽåº¦ç¹ªåœ–" +msgstr "顯示柵欄" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "é¸æ“‡é¡è‰²" +msgstr "座標軸é¡è‰²" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -12616,7 +12578,6 @@ msgid "This property can't be changed." msgstr "該屬性無法修改。" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" msgstr "å¸é™„é¸é …" @@ -12645,9 +12606,8 @@ msgid "Separation" msgstr "é–“è·" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Tile" -msgstr "é¸æ“‡" +msgstr "所é¸åœ–å¡Š" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp @@ -12656,9 +12616,8 @@ msgstr "é¸æ“‡" #: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp #: scene/resources/material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture" -msgstr "純文å—" +msgstr "ç´‹ç†è²¼åœ–" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tex Offset" @@ -12672,86 +12631,72 @@ msgstr "æ質" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "å¡«å……" +msgstr "調變" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tile Mode" -msgstr "切æ›æ¨¡å¼" +msgstr "圖塊模å¼" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "優先模å¼" +msgstr "自動圖塊的ä½å…ƒé®ç½©æ¨¡å¼" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Size" msgstr "å圖塊大å°" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" -msgstr "行間è·" +msgstr "自圖塊間è·" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "建立é®å…‰å¤šé‚Šå½¢" +msgstr "é®å…‰å移" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" -msgstr "導航模å¼" +msgstr "導航å移" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Shape Offset" msgstr "形狀å移" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "變æ›" +msgstr "形狀變æ›" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "碰撞" +msgstr "所é¸ç¢°æ’ž" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "僅æœå°‹æ‰€é¸å€åŸŸ" +msgstr "所é¸ç¢°æ’žå–®å‘" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "碰撞模å¼" +msgstr "所é¸ç¢°æ’žå–®å‘外邊è·" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Navigation" -msgstr "顯示導航" +msgstr "所é¸å°Žèˆª" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Occlusion" -msgstr "é¸æ“‡" +msgstr "所é¸é®æ“‹" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "篩é¸è…³æœ¬" +msgstr "圖塊集腳本" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" msgstr "圖塊集" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "ç„¡å¯ç”¨çš„版本控制 (VCS) 擴充功能。" +msgstr "ç„¡å¯ç”¨çš„版本控制 (VCS) 外掛。" #: editor/plugins/version_control_editor_plugin.cpp msgid "" @@ -12759,9 +12704,8 @@ msgid "" msgstr "é 端è¨å®šæ˜¯ç©ºçš„。使用網路的VCS功能æ無法é‹ä½œã€‚" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "未æä¾›å稱。" +msgstr "未æä¾›èªå¯ (Commit) 訊æ¯ã€‚" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" @@ -12792,14 +12736,12 @@ msgid "Do you want to remove the %s branch?" msgstr "ä½ ç¢ºå®šè¦ç§»é™¤ %s 分支?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "確定è¦æ‰“開多個專案嗎?" +msgstr "確定è¦ç§»é™¤é 端「%sã€ï¼Ÿ" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "套用é‡è¨" +msgstr "套用" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -12810,9 +12752,8 @@ msgid "Initialize" msgstr "åˆå§‹åŒ–" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Login" -msgstr "移除控制點" +msgstr "é 端登入" #: editor/plugins/version_control_editor_plugin.cpp msgid "Select SSH public key path" @@ -12843,55 +12784,48 @@ msgid "Unstage all changes" msgstr "撤銷暫å˜æ‰€æœ‰è®Šæ›´" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit Message" -msgstr "æ交改動" +msgstr "èªå¯ (Commit) 訊æ¯" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit Changes" msgstr "æ交改動" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Commit List" -msgstr "æ交" +msgstr "èªå¯åˆ—表" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit list size" -msgstr "簽入列表大å°" +msgstr "èªå¯åˆ—表大å°" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branches" msgstr "分支" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Branch" -msgstr "建立新專案" +msgstr "建立分支" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Branch" -msgstr "刪除動畫軌" +msgstr "移除分支" #: editor/plugins/version_control_editor_plugin.cpp msgid "Branch Name" msgstr "分支å稱" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" msgstr "é 端" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Create New Remote" -msgstr "建立新專案" +msgstr "建立é 端" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remove Remote" -msgstr "ç§»é™¤é …ç›®" +msgstr "移除é 端" #: editor/plugins/version_control_editor_plugin.cpp msgid "Remote Name" @@ -12903,15 +12837,15 @@ msgstr "é 端網å€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "æå–" +msgstr "æˆªå– (Fetch)" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "拉é€" +msgstr "æå– (Pull)" #: editor/plugins/version_control_editor_plugin.cpp msgid "Push" -msgstr "推é€" +msgstr "æŽ¨é€ (Push)" #: editor/plugins/version_control_editor_plugin.cpp msgid "Force Push" @@ -12919,7 +12853,7 @@ msgstr "強制推é€" #: editor/plugins/version_control_editor_plugin.cpp msgid "Modified" -msgstr "已修改" +msgstr "修改" #: editor/plugins/version_control_editor_plugin.cpp msgid "Renamed" @@ -12927,11 +12861,11 @@ msgstr "é‡æ–°å‘½å" #: editor/plugins/version_control_editor_plugin.cpp msgid "Deleted" -msgstr "已刪除" +msgstr "刪除" #: editor/plugins/version_control_editor_plugin.cpp msgid "Typechange" -msgstr "æ ¼å¼æ›´æ”¹" +msgstr "更改型別" #: editor/plugins/version_control_editor_plugin.cpp msgid "Unmerged" @@ -12942,14 +12876,12 @@ msgid "View:" msgstr "檢視:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Split" -msgstr "拆分路徑" +msgstr "分割" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unified" -msgstr "已修改" +msgstr "åˆä½µ" #: editor/plugins/visual_shader_editor_plugin.cpp msgid "(GLES3 only)" @@ -13806,11 +13738,11 @@ msgstr "å¯åŸ·è¡Œ" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "使用æ¯å€‹å·²å®šç¾©çš„é è¨è¨å®šä¾†åŒ¯å‡ºè©²å°ˆæ¡ˆã€‚" #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." -msgstr "" +msgstr "所有é è¨è¨å®šéƒ½å¿…é ˆå®šç¾©å¥½åŒ¯å‡ºè·¯å¾‘ï¼Œæ‰å¯ä½¿ç”¨ [匯出全部] 功能。" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -13921,11 +13853,12 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"注æ„ï¼šåŠ å¯†é‡‘é‘°å¿…é ˆä»¥äºŒé€²ä½å½¢å¼ä¿å˜ï¼Œ\n" +"å¿…é ˆå¾žåŽŸå§‹ç¢¼ä¾†ç·¨è¯åŒ¯å‡ºæ¨£æ¿ã€‚" #: editor/project_export.cpp -#, fuzzy msgid "More Info..." -msgstr "移動至..." +msgstr "更多資訊..." #: editor/project_export.cpp msgid "Export PCK/Zip..." @@ -13952,18 +13885,16 @@ msgid "ZIP File" msgstr "ZIP 檔案" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Godot éŠæˆ²åŒ…" +msgstr "Godot 專案包" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "缺少匯出該平å°ç”¨çš„樣æ¿ï¼š" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "專案發起人" +msgstr "專案匯出" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14263,7 +14194,6 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp -#, fuzzy msgctxt "Application" msgid "Project Manager" msgstr "專案管ç†å“¡" @@ -15007,6 +14937,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"無法ä¿å˜åˆ†æ”¯ï¼Œè©²åˆ†æ”¯æ˜¯å·²å¯¦é«”åŒ–å ´æ™¯çš„åé …ç›®ã€‚\n" +"è‹¥è¦å°‡è©²åˆ†æ”¯ä¿å˜é€²ç¨ç«‹çš„å ´æ™¯ä¸ï¼Œè«‹é–‹å•ŸåŽŸå§‹å ´æ™¯ï¼Œä¸¦åœ¨è©²åˆ†æ”¯ä¸Šé»žæ“Šå³éµï¼Œç„¶å¾Œé¸" +"擇 [將分支ä¿å˜ç‚ºå ´æ™¯]。" #: editor/scene_tree_dock.cpp msgid "" @@ -15014,6 +14947,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"無法ä¿å˜åˆ†æ”¯ï¼Œè©²åˆ†æ”¯æ˜¯ç¹¼æ‰¿å ´æ™¯çš„一部分。\n" +"è‹¥è¦å°‡è©²åˆ†æ”¯ä¿å˜ç‚ºç¨ç«‹çš„å ´æ™¯ï¼Œè«‹é–‹å•ŸåŽŸå§‹å ´æ™¯ï¼Œä¸¦åœ¨è©²åˆ†æ”¯ä¸Šé»žæ“Šå³éµï¼Œç„¶å¾Œé¸æ“‡ " +"[將分支ä¿å˜ç‚ºå ´æ™¯]。" #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -15039,7 +14975,7 @@ msgstr "轉為本地" #: editor/scene_tree_dock.cpp editor/scene_tree_editor.cpp msgid "Another node already uses this unique name in the scene." -msgstr "" +msgstr "å¦ä¸€å€‹ç¯€é»žå·²åœ¨è©²å ´æ™¯ä¸ä½¿ç”¨äº†é€™å€‹ä¸å¯é‡è¤‡çš„å稱。" #: editor/scene_tree_dock.cpp msgid "Enable Scene Unique Name" @@ -15121,7 +15057,7 @@ msgstr "å資æº" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "以ä¸é‡è¤‡çš„å ´æ™¯å稱來å˜å–" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15216,18 +15152,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "確定è¦æ¸…除繼承嗎?(無法復原ï¼ï¼‰" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "ç½®ä¸æ‰€é¸" +msgstr "é¡¯ç¤ºå ´æ™¯æ¨¹çš„æ ¹é¸æ“‡" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "ä¾ç…§å稱來推斷腳本的全域變數" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "完整顯示所é¸" +msgstr "ä½¿ç”¨æˆ‘çš„æœ€æ„›æ ¹é¸æ“‡" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -15255,6 +15189,8 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"該節點å¯åœ¨æ¤å ´æ™¯ä¸çš„任何地方通éŽåœ¨ç¯€é»žè·¯å¾‘å‰æ–¹åŠ 上「%sã€å‰ç½®è©žä¾†å˜å–。\n" +"點擊以ç¦ç”¨ã€‚" #: editor/scene_tree_editor.cpp msgid "" @@ -15537,21 +15473,20 @@ msgid "Stack Frames" msgstr "å †ç–Šæ¡†" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "篩é¸åœ–å¡Š" +msgstr "篩é¸å †ç–Šè®Šæ•¸" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "自動切æ›è‡³é ç«¯å ´æ™¯æ¨¹" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "é ç«¯å ´æ™¯æ¨¹é‡æ–°æ•´ç†é–“éš”" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "é 端檢查é‡æ–°æ•´ç†é–“éš”" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -15649,7 +15584,7 @@ msgstr "更改光照åŠå¾‘" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "StreamPlayer3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -15659,7 +15594,7 @@ msgstr "更改 AudioStreamPlayer3D 發射角" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "相機" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -15671,7 +15606,7 @@ msgstr "更改相機尺寸" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "VisibilityNotifier" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -15682,23 +15617,20 @@ msgid "Change Particles AABB" msgstr "更改粒å AABB" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "é¸æ“‡å±¬æ€§" +msgstr "å射探查" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "更改探查範åœ" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "烘焙 GI 探查" +msgstr "GI 探查" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Baked Indirect Light" -msgstr "éžå‘性光照" +msgstr "烘焙間接光照" #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Change Sphere Shape Radius" @@ -15729,14 +15661,12 @@ msgid "Change Ray Shape Length" msgstr "更改射線形長度" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge" -msgstr "導航模å¼" +msgstr "導航邊界" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "導航模å¼" +msgstr "å·²ç¦ç”¨å°Žèˆªé‚Šç•Œ" #: editor/spatial_editor_gizmos.cpp #, fuzzy @@ -19984,15 +19914,15 @@ msgstr "找ä¸åˆ°é‡‘鑰儲å˜å€ï¼Œç„¡æ³•åŒ¯å‡ºã€‚" #: platform/windows/export/export.cpp msgid "" -"Could not start rcedit executable, configure rcedit path in the Editor " -"Settings (Export > Windows > Rcedit)." +"Could not start rcedit executable. Configure rcedit path in the Editor " +"Settings (Export > Windows > Rcedit), or disable \"Application > Modify " +"Resources\" in the export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"rcedit failed to modify executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "rcedit failed to modify executable: %s." +msgstr "無效的副檔å。" #: platform/windows/export/export.cpp #, fuzzy @@ -20015,15 +19945,15 @@ msgstr "無效的å稱。" #: platform/windows/export/export.cpp msgid "" -"Could not start signtool executable, configure signtool path in the Editor " -"Settings (Export > Windows > Signtool)." +"Could not start signtool executable. Configure signtool path in the Editor " +"Settings (Export > Windows > Signtool), or disable \"Codesign\" in the " +"export preset." msgstr "" #: platform/windows/export/export.cpp -msgid "" -"Signtool failed to sign executable:\n" -"%s" -msgstr "" +#, fuzzy +msgid "Signtool failed to sign executable: %s." +msgstr "無效的副檔å。" #: platform/windows/export/export.cpp msgid "Failed to remove temporary file \"%s\"." @@ -26646,9 +26576,8 @@ msgid "Normal Texture" msgstr "法線紋ç†è²¼åœ–" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Color Texture" -msgstr "編輯器主題" +msgstr "é¡è‰²ç´‹ç†è²¼åœ–" #: scene/resources/particles_material.cpp #, fuzzy diff --git a/main/main.cpp b/main/main.cpp index fe510d1c9c..4c4377a174 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -431,6 +431,7 @@ Error Main::test_setup() { /** INITIALIZE SERVERS **/ register_server_types(); + XRServer::set_xr_mode(XRServer::XRMODE_OFF); // Skip in tests. initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS); NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS); diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp index 93533e1690..6b05c146e6 100644 --- a/modules/csg/csg.cpp +++ b/modules/csg/csg.cpp @@ -729,7 +729,7 @@ void CSGBrushOperation::MeshMerge::mark_inside_faces() { } } -void CSGBrushOperation::MeshMerge::add_face(const Vector3 p_points[], const Vector2 p_uvs[], bool p_smooth, bool p_invert, const Ref<Material> &p_material, bool p_from_b) { +void CSGBrushOperation::MeshMerge::add_face(const Vector3 p_points[3], const Vector2 p_uvs[3], bool p_smooth, bool p_invert, const Ref<Material> &p_material, bool p_from_b) { int indices[3]; for (int i = 0; i < 3; i++) { VertexKey vk; diff --git a/modules/lightmapper_rd/lightmapper_rd.h b/modules/lightmapper_rd/lightmapper_rd.h index 88860ad0d4..bf6b4399ca 100644 --- a/modules/lightmapper_rd/lightmapper_rd.h +++ b/modules/lightmapper_rd/lightmapper_rd.h @@ -183,7 +183,7 @@ class LightmapperRD : public Lightmapper { } }; - void _plot_triangle_into_triangle_index_list(int p_size, const Vector3i &p_ofs, const AABB &p_bounds, const Vector3 p_points[], uint32_t p_triangle_index, LocalVector<TriangleSort> &triangles, uint32_t p_grid_size); + void _plot_triangle_into_triangle_index_list(int p_size, const Vector3i &p_ofs, const AABB &p_bounds, const Vector3 p_points[3], uint32_t p_triangle_index, LocalVector<TriangleSort> &triangles, uint32_t p_grid_size); struct RasterPushConstant { float atlas_size[2] = {}; diff --git a/modules/mono/editor/code_completion.cpp b/modules/mono/editor/code_completion.cpp index a1789412f4..7bce6f2c21 100644 --- a/modules/mono/editor/code_completion.cpp +++ b/modules/mono/editor/code_completion.cpp @@ -172,7 +172,7 @@ PackedStringArray get_code_completion(CompletionKind p_kind, const String &p_scr } } break; case CompletionKind::SHADER_PARAMS: { - print_verbose("Shared params completion for C# not implemented."); + print_verbose("Shader uniforms completion for C# is not implemented yet."); } break; case CompletionKind::SIGNALS: { Ref<Script> script = ResourceLoader::load(p_script_file.simplify_path()); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs index b1f1decd72..437878818c 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Basis.cs @@ -828,6 +828,22 @@ namespace Godot } /// <summary> + /// Constructs a pure scale basis matrix with no rotation or shearing. + /// The scale values are set as the main diagonal of the matrix, + /// and all of the other parts of the matrix are zero. + /// </summary> + /// <param name="scale">The scale Vector3.</param> + /// <returns>A pure scale Basis matrix.</returns> + public static Basis FromScale(Vector3 scale) + { + return new Basis( + scale.x, 0, 0, + 0, scale.y, 0, + 0, 0, scale.z + ); + } + + /// <summary> /// Composes these two basis matrices by multiplying them /// together. This has the effect of transforming the second basis /// (the child) by the first basis (the parent). diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs index c00b9d8e9b..9eaf4f3252 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Transform3D.cs @@ -235,7 +235,7 @@ namespace Godot /// <returns>The scaled transformation matrix.</returns> public Transform3D ScaledLocal(Vector3 scale) { - Basis tmpBasis = new Basis(new Vector3(scale.x, 0, 0), new Vector3(0, scale.y, 0), new Vector3(0, 0, scale.z)); + Basis tmpBasis = Basis.FromScale(scale); return new Transform3D(basis * tmpBasis, origin); } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs index ec2e724b10..c3d5fbfdef 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs @@ -620,22 +620,6 @@ namespace Godot ); } - /// <summary> - /// Returns a diagonal matrix with the vector as main diagonal. - /// - /// This is equivalent to a <see cref="Basis"/> with no rotation or shearing and - /// this vector's components set as the scale. - /// </summary> - /// <returns>A <see cref="Basis"/> with the vector as its main diagonal.</returns> - public Basis ToDiagonalMatrix() - { - return new Basis( - x, 0, 0, - 0, y, 0, - 0, 0, z - ); - } - // Constants private static readonly Vector3 _zero = new Vector3(0, 0, 0); private static readonly Vector3 _one = new Vector3(1, 1, 1); diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index bb49fb5248..73dbf2f443 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -4245,7 +4245,7 @@ void TextServerAdvanced::shaped_text_overrun_trim_to_width(const RID &p_shaped_l Glyph *sd_glyphs = sd->glyphs.ptrw(); - if (p_trim_flags.has_flag(OVERRUN_TRIM) || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { + if ((p_trim_flags & OVERRUN_TRIM) == OVERRUN_NO_TRIM || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { sd->overrun_trim_data.trim_pos = -1; sd->overrun_trim_data.ellipsis_pos = -1; return; @@ -4706,7 +4706,7 @@ bool TextServerAdvanced::shaped_text_update_justification_ops(const RID &p_shape for (int i = 0; i < sd_size; i++) { if (sd_glyphs[i].count > 0) { char32_t c = sd->text[sd_glyphs[i].start - sd->start]; - if (c == 0x0640) { + if (c == 0x0640 && sd_glyphs[i].start == sd_glyphs[i].end - 1) { sd_glyphs[i].flags |= GRAPHEME_IS_ELONGATION; } if (sd->jstops.has(sd_glyphs[i].start)) { @@ -4718,6 +4718,11 @@ bool TextServerAdvanced::shaped_text_update_justification_ops(const RID &p_shape if (sd_glyphs[i].font_rid != RID()) { Glyph gl = _shape_single_glyph(sd, 0x0640, HB_SCRIPT_ARABIC, HB_DIRECTION_RTL, sd->glyphs[i].font_rid, sd->glyphs[i].font_size); if ((sd_glyphs[i].flags & GRAPHEME_IS_VALID) == GRAPHEME_IS_VALID) { +#if HB_VERSION_ATLEAST(5, 1, 0) + if ((i > 0) && ((sd_glyphs[i - 1].flags & GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL) != GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL)) { + continue; + } +#endif gl.start = sd_glyphs[i].start; gl.end = sd_glyphs[i].end; gl.repeat = 0; @@ -4908,11 +4913,16 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star hb_buffer_clear_contents(p_sd->hb_buffer); hb_buffer_set_direction(p_sd->hb_buffer, p_direction); + int flags = (p_start == 0 ? HB_BUFFER_FLAG_BOT : 0) | (p_end == p_sd->text.length() ? HB_BUFFER_FLAG_EOT : 0); if (p_sd->preserve_control) { - hb_buffer_set_flags(p_sd->hb_buffer, (hb_buffer_flags_t)(HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES | (p_start == 0 ? HB_BUFFER_FLAG_BOT : 0) | (p_end == p_sd->text.length() ? HB_BUFFER_FLAG_EOT : 0))); + flags |= HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES; } else { - hb_buffer_set_flags(p_sd->hb_buffer, (hb_buffer_flags_t)(HB_BUFFER_FLAG_DEFAULT | (p_start == 0 ? HB_BUFFER_FLAG_BOT : 0) | (p_end == p_sd->text.length() ? HB_BUFFER_FLAG_EOT : 0))); + flags |= HB_BUFFER_FLAG_DEFAULT; } +#if HB_VERSION_ATLEAST(5, 1, 0) + flags |= HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL; +#endif + hb_buffer_set_flags(p_sd->hb_buffer, (hb_buffer_flags_t)flags); hb_buffer_set_script(p_sd->hb_buffer, p_script); if (p_sd->spans[p_span].language.is_empty()) { @@ -4976,10 +4986,16 @@ void TextServerAdvanced::_shape_run(ShapedTextDataAdvanced *p_sd, int64_t p_star gl.font_rid = p_fonts[p_fb_index]; gl.font_size = fs; - if (glyph_info[i].mask & HB_GLYPH_FLAG_DEFINED) { + if (glyph_info[i].mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) { gl.flags |= GRAPHEME_IS_CONNECTED; } +#if HB_VERSION_ATLEAST(5, 1, 0) + if (glyph_info[i].mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL) { + gl.flags |= GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL; + } +#endif + gl.index = glyph_info[i].codepoint; if (gl.index != 0) { _ensure_glyph(fd, fss, gl.index); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 50ea4677b1..55d912a10a 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -3204,7 +3204,7 @@ void TextServerFallback::shaped_text_overrun_trim_to_width(const RID &p_shaped_l Glyph *sd_glyphs = sd->glyphs.ptrw(); - if (p_trim_flags.has_flag(OVERRUN_TRIM) || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { + if ((p_trim_flags & OVERRUN_TRIM) == OVERRUN_NO_TRIM || sd_glyphs == nullptr || p_width <= 0 || !(sd->width > p_width || enforce_ellipsis)) { sd->overrun_trim_data.trim_pos = -1; sd->overrun_trim_data.ellipsis_pos = -1; return; diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp index 86f933d4bc..b51dd18af6 100644 --- a/platform/android/display_server_android.cpp +++ b/platform/android/display_server_android.cpp @@ -221,12 +221,12 @@ bool DisplayServerAndroid::screen_is_touchscreen(int p_screen) const { return true; } -void DisplayServerAndroid::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_length, int p_cursor_start, int p_cursor_end) { +void DisplayServerAndroid::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) { GodotIOJavaWrapper *godot_io_java = OS_Android::get_singleton()->get_godot_io_java(); ERR_FAIL_NULL(godot_io_java); if (godot_io_java->has_vk()) { - godot_io_java->show_vk(p_existing_text, p_multiline, p_max_length, p_cursor_start, p_cursor_end); + godot_io_java->show_vk(p_existing_text, (int)p_type, p_max_length, p_cursor_start, p_cursor_end); } else { ERR_PRINT("Virtual keyboard not available"); } diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h index 65bf2ec1a8..2f30642319 100644 --- a/platform/android/display_server_android.h +++ b/platform/android/display_server_android.h @@ -122,7 +122,7 @@ public: virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; - virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), bool p_multiline = false, int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1) override; + virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), VirtualKeyboardType p_type = KEYBOARD_TYPE_DEFAULT, int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1) override; virtual void virtual_keyboard_hide() override; virtual int virtual_keyboard_get_height() const override; diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java index 0434efdf4c..d283de8ce8 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotIO.java @@ -203,9 +203,10 @@ public class GodotIO { return result; } - public void showKeyboard(String p_existing_text, boolean p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) { - if (edit != null) - edit.showKeyboard(p_existing_text, p_multiline, p_max_input_length, p_cursor_start, p_cursor_end); + public void showKeyboard(String p_existing_text, int p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end) { + if (edit != null) { + edit.showKeyboard(p_existing_text, GodotEditText.VirtualKeyboardType.values()[p_type], p_max_input_length, p_cursor_start, p_cursor_end); + } //InputMethodManager inputMgr = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE); //inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java index ecb2af0a7b..7925b54fc4 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java @@ -52,6 +52,18 @@ public class GodotEditText extends EditText { private final static int HANDLER_OPEN_IME_KEYBOARD = 2; private final static int HANDLER_CLOSE_IME_KEYBOARD = 3; + // Enum must be kept up-to-date with DisplayServer::VirtualKeyboardType + public enum VirtualKeyboardType { + KEYBOARD_TYPE_DEFAULT, + KEYBOARD_TYPE_MULTILINE, + KEYBOARD_TYPE_NUMBER, + KEYBOARD_TYPE_NUMBER_DECIMAL, + KEYBOARD_TYPE_PHONE, + KEYBOARD_TYPE_EMAIL_ADDRESS, + KEYBOARD_TYPE_PASSWORD, + KEYBOARD_TYPE_URL + } + // =========================================================== // Fields // =========================================================== @@ -60,7 +72,7 @@ public class GodotEditText extends EditText { private EditHandler sHandler = new EditHandler(this); private String mOriginText; private int mMaxInputLength = Integer.MAX_VALUE; - private boolean mMultiline = false; + private VirtualKeyboardType mKeyboardType = VirtualKeyboardType.KEYBOARD_TYPE_DEFAULT; private static class EditHandler extends Handler { private final WeakReference<GodotEditText> mEdit; @@ -100,8 +112,8 @@ public class GodotEditText extends EditText { setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE); } - public boolean isMultiline() { - return mMultiline; + public VirtualKeyboardType getKeyboardType() { + return mKeyboardType; } private void handleMessage(final Message msg) { @@ -122,8 +134,31 @@ public class GodotEditText extends EditText { } int inputType = InputType.TYPE_CLASS_TEXT; - if (edit.isMultiline()) { - inputType |= InputType.TYPE_TEXT_FLAG_MULTI_LINE; + switch (edit.getKeyboardType()) { + case KEYBOARD_TYPE_DEFAULT: + inputType = InputType.TYPE_CLASS_TEXT; + break; + case KEYBOARD_TYPE_MULTILINE: + inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_MULTI_LINE; + break; + case KEYBOARD_TYPE_NUMBER: + inputType = InputType.TYPE_CLASS_NUMBER; + break; + case KEYBOARD_TYPE_NUMBER_DECIMAL: + inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; + break; + case KEYBOARD_TYPE_PHONE: + inputType = InputType.TYPE_CLASS_PHONE; + break; + case KEYBOARD_TYPE_EMAIL_ADDRESS: + inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS; + break; + case KEYBOARD_TYPE_PASSWORD: + inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD; + break; + case KEYBOARD_TYPE_URL: + inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI; + break; } edit.setInputType(inputType); @@ -201,7 +236,7 @@ public class GodotEditText extends EditText { // =========================================================== // Methods // =========================================================== - public void showKeyboard(String p_existing_text, boolean p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) { + public void showKeyboard(String p_existing_text, VirtualKeyboardType p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end) { int maxInputLength = (p_max_input_length <= 0) ? Integer.MAX_VALUE : p_max_input_length; if (p_cursor_start == -1) { // cursor position not given this.mOriginText = p_existing_text; @@ -214,7 +249,7 @@ public class GodotEditText extends EditText { this.mMaxInputLength = maxInputLength - (p_existing_text.length() - p_cursor_end); } - this.mMultiline = p_multiline; + this.mKeyboardType = p_type; final Message msg = new Message(); msg.what = HANDLER_OPEN_IME_KEYBOARD; diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java index e940aafa9e..7714703a21 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotTextInputWrapper.java @@ -115,7 +115,7 @@ public class GodotTextInputWrapper implements TextWatcher, OnEditorActionListene } for (int i = 0; i < count; ++i) { int key = newChars[i]; - if ((key == '\n') && !mEdit.isMultiline()) { + if ((key == '\n') && !(mEdit.getKeyboardType() == GodotEditText.VirtualKeyboardType.KEYBOARD_TYPE_MULTILINE)) { // Return keys are handled through action events continue; } diff --git a/platform/android/java_godot_io_wrapper.cpp b/platform/android/java_godot_io_wrapper.cpp index b71c6ef1e6..5877c15114 100644 --- a/platform/android/java_godot_io_wrapper.cpp +++ b/platform/android/java_godot_io_wrapper.cpp @@ -61,7 +61,7 @@ GodotIOJavaWrapper::GodotIOJavaWrapper(JNIEnv *p_env, jobject p_godot_io_instanc _get_scaled_density = p_env->GetMethodID(cls, "getScaledDensity", "()F"); _get_screen_refresh_rate = p_env->GetMethodID(cls, "getScreenRefreshRate", "(D)D"); _get_unique_id = p_env->GetMethodID(cls, "getUniqueID", "()Ljava/lang/String;"); - _show_keyboard = p_env->GetMethodID(cls, "showKeyboard", "(Ljava/lang/String;ZIII)V"); + _show_keyboard = p_env->GetMethodID(cls, "showKeyboard", "(Ljava/lang/String;IIII)V"); _hide_keyboard = p_env->GetMethodID(cls, "hideKeyboard", "()V"); _set_screen_orientation = p_env->GetMethodID(cls, "setScreenOrientation", "(I)V"); _get_screen_orientation = p_env->GetMethodID(cls, "getScreenOrientation", "()I"); @@ -214,12 +214,12 @@ bool GodotIOJavaWrapper::has_vk() { return (_show_keyboard != nullptr) && (_hide_keyboard != nullptr); } -void GodotIOJavaWrapper::show_vk(const String &p_existing, bool p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) { +void GodotIOJavaWrapper::show_vk(const String &p_existing, int p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end) { if (_show_keyboard) { JNIEnv *env = get_jni_env(); ERR_FAIL_NULL(env); jstring jStr = env->NewStringUTF(p_existing.utf8().get_data()); - env->CallVoidMethod(godot_io_instance, _show_keyboard, jStr, p_multiline, p_max_input_length, p_cursor_start, p_cursor_end); + env->CallVoidMethod(godot_io_instance, _show_keyboard, jStr, p_type, p_max_input_length, p_cursor_start, p_cursor_end); } } diff --git a/platform/android/java_godot_io_wrapper.h b/platform/android/java_godot_io_wrapper.h index aec7d1db97..dc68f4d90d 100644 --- a/platform/android/java_godot_io_wrapper.h +++ b/platform/android/java_godot_io_wrapper.h @@ -82,7 +82,7 @@ public: Rect2i get_display_safe_area(); String get_unique_id(); bool has_vk(); - void show_vk(const String &p_existing, bool p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end); + void show_vk(const String &p_existing, int p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end); void hide_vk(); int get_vk_height(); void set_vk_height(int p_height); diff --git a/platform/ios/display_server_ios.h b/platform/ios/display_server_ios.h index 5dd4d177ea..bbb2dd3ab3 100644 --- a/platform/ios/display_server_ios.h +++ b/platform/ios/display_server_ios.h @@ -199,7 +199,7 @@ public: virtual bool screen_is_touchscreen(int p_screen) const override; - virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_length, int p_cursor_start, int p_cursor_end) override; + virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) override; virtual void virtual_keyboard_hide() override; void virtual_keyboard_set_height(int height); diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index 6172940572..080ee5f3ab 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -585,12 +585,44 @@ bool DisplayServerIOS::screen_is_touchscreen(int p_screen) const { return true; } -void DisplayServerIOS::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_length, int p_cursor_start, int p_cursor_end) { +void DisplayServerIOS::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) { NSString *existingString = [[NSString alloc] initWithUTF8String:p_existing_text.utf8().get_data()]; + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeDefault; + AppDelegate.viewController.keyboardView.textContentType = nil; + switch (p_type) { + case KEYBOARD_TYPE_DEFAULT: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeDefault; + } break; + case KEYBOARD_TYPE_MULTILINE: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeDefault; + } break; + case KEYBOARD_TYPE_NUMBER: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeNumberPad; + } break; + case KEYBOARD_TYPE_NUMBER_DECIMAL: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeDecimalPad; + } break; + case KEYBOARD_TYPE_PHONE: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypePhonePad; + AppDelegate.viewController.keyboardView.textContentType = UITextContentTypeTelephoneNumber; + } break; + case KEYBOARD_TYPE_EMAIL_ADDRESS: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeEmailAddress; + AppDelegate.viewController.keyboardView.textContentType = UITextContentTypeEmailAddress; + } break; + case KEYBOARD_TYPE_PASSWORD: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeDefault; + AppDelegate.viewController.keyboardView.textContentType = UITextContentTypePassword; + } break; + case KEYBOARD_TYPE_URL: { + AppDelegate.viewController.keyboardView.keyboardType = UIKeyboardTypeWebSearch; + AppDelegate.viewController.keyboardView.textContentType = UITextContentTypeURL; + } break; + } + [AppDelegate.viewController.keyboardView becomeFirstResponderWithString:existingString - multiline:p_multiline cursorStart:p_cursor_start cursorEnd:p_cursor_end]; } diff --git a/platform/ios/keyboard_input_view.h b/platform/ios/keyboard_input_view.h index 33fa5d571a..fc34e6a11b 100644 --- a/platform/ios/keyboard_input_view.h +++ b/platform/ios/keyboard_input_view.h @@ -32,6 +32,6 @@ @interface GodotKeyboardInputView : UITextView -- (BOOL)becomeFirstResponderWithString:(NSString *)existingString multiline:(BOOL)flag cursorStart:(NSInteger)start cursorEnd:(NSInteger)end; +- (BOOL)becomeFirstResponderWithString:(NSString *)existingString cursorStart:(NSInteger)start cursorEnd:(NSInteger)end; @end diff --git a/platform/ios/keyboard_input_view.mm b/platform/ios/keyboard_input_view.mm index 76e3f23c9d..f031a1de22 100644 --- a/platform/ios/keyboard_input_view.mm +++ b/platform/ios/keyboard_input_view.mm @@ -84,7 +84,7 @@ return YES; } -- (BOOL)becomeFirstResponderWithString:(NSString *)existingString multiline:(BOOL)flag cursorStart:(NSInteger)start cursorEnd:(NSInteger)end { +- (BOOL)becomeFirstResponderWithString:(NSString *)existingString cursorStart:(NSInteger)start cursorEnd:(NSInteger)end { self.text = existingString; self.previousText = existingString; diff --git a/platform/javascript/display_server_javascript.cpp b/platform/javascript/display_server_javascript.cpp index bcff3306d5..48f637fcfe 100644 --- a/platform/javascript/display_server_javascript.cpp +++ b/platform/javascript/display_server_javascript.cpp @@ -604,8 +604,8 @@ void DisplayServerJavaScript::vk_input_text_callback(const char *p_text, int p_c } } -void DisplayServerJavaScript::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) { - godot_js_display_vk_show(p_existing_text.utf8().get_data(), p_multiline, p_cursor_start, p_cursor_end); +void DisplayServerJavaScript::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end) { + godot_js_display_vk_show(p_existing_text.utf8().get_data(), p_type, p_cursor_start, p_cursor_end); } void DisplayServerJavaScript::virtual_keyboard_hide() { diff --git a/platform/javascript/display_server_javascript.h b/platform/javascript/display_server_javascript.h index 79b0fbb652..fb7f5d02a8 100644 --- a/platform/javascript/display_server_javascript.h +++ b/platform/javascript/display_server_javascript.h @@ -157,7 +157,7 @@ public: virtual float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; - virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), bool p_multiline = false, int p_max_input_length = -1, int p_cursor_start = -1, int p_cursor_end = -1) override; + virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), VirtualKeyboardType p_type = KEYBOARD_TYPE_DEFAULT, int p_max_input_length = -1, int p_cursor_start = -1, int p_cursor_end = -1) override; virtual void virtual_keyboard_hide() override; // windows diff --git a/platform/javascript/godot_js.h b/platform/javascript/godot_js.h index 1dce8035a6..a323f2d157 100644 --- a/platform/javascript/godot_js.h +++ b/platform/javascript/godot_js.h @@ -121,7 +121,7 @@ extern void godot_js_display_notification_cb(void (*p_callback)(int p_notificati extern int godot_js_display_vk_available(); extern int godot_js_display_tts_available(); extern void godot_js_display_vk_cb(void (*p_input)(const char *p_text, int p_cursor)); -extern void godot_js_display_vk_show(const char *p_text, int p_multiline, int p_start, int p_end); +extern void godot_js_display_vk_show(const char *p_text, int p_type, int p_start, int p_end); extern void godot_js_display_vk_hide(); #ifdef __cplusplus diff --git a/platform/javascript/js/libs/library_godot_display.js b/platform/javascript/js/libs/library_godot_display.js index 5997631bf8..c7729a8c5b 100644 --- a/platform/javascript/js/libs/library_godot_display.js +++ b/platform/javascript/js/libs/library_godot_display.js @@ -73,7 +73,7 @@ const GodotDisplayVK = { GodotDisplayVK.textarea = create('textarea'); GodotDisplayVK.updateSize(); }, - show: function (text, multiline, start, end) { + show: function (text, type, start, end) { if (!GodotDisplayVK.textinput || !GodotDisplayVK.textarea) { return; } @@ -81,7 +81,46 @@ const GodotDisplayVK = { GodotDisplayVK.hide(); } GodotDisplayVK.updateSize(); - const elem = multiline ? GodotDisplayVK.textarea : GodotDisplayVK.textinput; + + let elem = GodotDisplayVK.textinput; + switch (type) { + case 0: // KEYBOARD_TYPE_DEFAULT + elem.type = 'text'; + elem.inputmode = ''; + break; + case 1: // KEYBOARD_TYPE_MULTILINE + elem = GodotDisplayVK.textarea; + break; + case 2: // KEYBOARD_TYPE_NUMBER + elem.type = 'text'; + elem.inputmode = 'numeric'; + break; + case 3: // KEYBOARD_TYPE_NUMBER_DECIMAL + elem.type = 'text'; + elem.inputmode = 'decimal'; + break; + case 4: // KEYBOARD_TYPE_PHONE + elem.type = 'tel'; + elem.inputmode = ''; + break; + case 5: // KEYBOARD_TYPE_EMAIL_ADDRESS + elem.type = 'email'; + elem.inputmode = ''; + break; + case 6: // KEYBOARD_TYPE_PASSWORD + elem.type = 'password'; + elem.inputmode = ''; + break; + case 7: // KEYBOARD_TYPE_URL + elem.type = 'url'; + elem.inputmode = ''; + break; + default: + elem.type = 'text'; + elem.inputmode = ''; + break; + } + elem.readonly = false; elem.disabled = false; elem.value = text; @@ -694,11 +733,11 @@ const GodotDisplay = { * Virtual Keyboard */ godot_js_display_vk_show__sig: 'viiii', - godot_js_display_vk_show: function (p_text, p_multiline, p_start, p_end) { + godot_js_display_vk_show: function (p_text, p_type, p_start, p_end) { const text = GodotRuntime.parseString(p_text); const start = p_start > 0 ? p_start : 0; const end = p_end > 0 ? p_end : start; - GodotDisplayVK.show(text, p_multiline, start, end); + GodotDisplayVK.show(text, p_type, start, end); }, godot_js_display_vk_hide__sig: 'v', diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 41031ec81b..54c479fc81 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -50,6 +50,7 @@ #import <ApplicationServices/ApplicationServices.h> #import <CoreVideo/CoreVideo.h> #import <Foundation/Foundation.h> +#import <IOKit/pwr_mgt/IOPMLib.h> #undef BitMap #undef CursorShape @@ -171,6 +172,8 @@ private: HashMap<WindowID, WindowData> windows; + IOPMAssertionID screen_keep_on_assertion = kIOPMNullAssertionID; + const NSMenu *_get_menu_root(const String &p_menu_root) const; NSMenu *_get_menu_root(const String &p_menu_root); @@ -299,6 +302,8 @@ public: virtual float screen_get_max_scale() const override; virtual Rect2i screen_get_usable_rect(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; + virtual void screen_set_keep_on(bool p_enable) override; + virtual bool screen_is_kept_on() const override; virtual Vector<int> get_window_list() const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index b9bc182dde..e228007246 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -39,6 +39,7 @@ #include "tts_macos.h" +#include "core/config/project_settings.h" #include "core/io/marshalls.h" #include "core/math/geometry_2d.h" #include "core/os/keyboard.h" @@ -1891,6 +1892,24 @@ float DisplayServerMacOS::screen_get_refresh_rate(int p_screen) const { return SCREEN_REFRESH_RATE_FALLBACK; } +bool DisplayServerMacOS::screen_is_kept_on() const { + return (screen_keep_on_assertion); +} + +void DisplayServerMacOS::screen_set_keep_on(bool p_enable) { + if (screen_keep_on_assertion) { + IOPMAssertionRelease(screen_keep_on_assertion); + screen_keep_on_assertion = kIOPMNullAssertionID; + } + + if (p_enable) { + String app_name_string = ProjectSettings::get_singleton()->get("application/config/name"); + NSString *name = [NSString stringWithUTF8String:(app_name_string.is_empty() ? "Godot Engine" : app_name_string.utf8().get_data())]; + NSString *reason = @"Godot Engine running with display/window/energy_saving/keep_screen_on = true"; + IOPMAssertionCreateWithDescription(kIOPMAssertPreventUserIdleDisplaySleep, (__bridge CFStringRef)name, (__bridge CFStringRef)reason, (__bridge CFStringRef)reason, nullptr, 0, nullptr, &screen_keep_on_assertion); + } +} + Vector<DisplayServer::WindowID> DisplayServerMacOS::get_window_list() const { _THREAD_SAFE_METHOD_ @@ -3266,9 +3285,16 @@ DisplayServerMacOS::DisplayServerMacOS(const String &p_rendering_driver, WindowM RendererCompositorRD::make_current(); } #endif + + screen_set_keep_on(GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true)); } DisplayServerMacOS::~DisplayServerMacOS() { + if (screen_keep_on_assertion) { + IOPMAssertionRelease(screen_keep_on_assertion); + screen_keep_on_assertion = kIOPMNullAssertionID; + } + // Destroy all windows. for (HashMap<WindowID, WindowData>::Iterator E = windows.begin(); E;) { HashMap<WindowID, WindowData>::Iterator F = E; diff --git a/platform/uwp/os_uwp.cpp b/platform/uwp/os_uwp.cpp index f37759c66f..7bc4c6047c 100644 --- a/platform/uwp/os_uwp.cpp +++ b/platform/uwp/os_uwp.cpp @@ -716,7 +716,7 @@ bool OS_UWP::has_virtual_keyboard() const { return UIViewSettings::GetForCurrentView()->UserInteractionMode == UserInteractionMode::Touch; } -void OS_UWP::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_input_length, int p_cursor_start, int p_cursor_end) { +void OS_UWP::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_input_length, int p_cursor_start, int p_cursor_end) { InputPane ^ pane = InputPane::GetForCurrentView(); pane->TryShow(); } diff --git a/platform/uwp/os_uwp.h b/platform/uwp/os_uwp.h index b9d035ff41..fe61f60548 100644 --- a/platform/uwp/os_uwp.h +++ b/platform/uwp/os_uwp.h @@ -231,7 +231,7 @@ public: virtual bool has_touchscreen_ui_hint() const; virtual bool has_virtual_keyboard() const; - virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), bool p_multiline = false, int p_max_input_length = -1, int p_cursor_start = -1, int p_cursor_end = -1); + virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), VirtualKeyboardType p_type = KEYBOARD_TYPE_DEFAULT, int p_max_input_length = -1, int p_cursor_start = -1, int p_cursor_end = -1); virtual void hide_virtual_keyboard(); virtual Error open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr); diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index f6baab1644..a975d09a9d 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -531,10 +531,43 @@ DisplayServer::ScreenOrientation DisplayServerWindows::screen_get_orientation(in } void DisplayServerWindows::screen_set_keep_on(bool p_enable) { + if (keep_screen_on == p_enable) { + return; + } + + if (p_enable) { + const String reason = "Godot Engine running with display/window/energy_saving/keep_screen_on = true"; + Char16String reason_utf16 = reason.utf16(); + + REASON_CONTEXT context; + context.Version = POWER_REQUEST_CONTEXT_VERSION; + context.Flags = POWER_REQUEST_CONTEXT_SIMPLE_STRING; + context.Reason.SimpleReasonString = (LPWSTR)(reason_utf16.ptrw()); + power_request = PowerCreateRequest(&context); + if (power_request == INVALID_HANDLE_VALUE) { + print_error("Failed to enable screen_keep_on."); + return; + } + if (PowerSetRequest(power_request, POWER_REQUEST_TYPE::PowerRequestSystemRequired) == 0) { + print_error("Failed to request system sleep override."); + return; + } + if (PowerSetRequest(power_request, POWER_REQUEST_TYPE::PowerRequestDisplayRequired) == 0) { + print_error("Failed to request display timeout override."); + return; + } + } else { + PowerClearRequest(power_request, POWER_REQUEST_TYPE::PowerRequestSystemRequired); + PowerClearRequest(power_request, POWER_REQUEST_TYPE::PowerRequestDisplayRequired); + CloseHandle(power_request); + power_request = nullptr; + } + + keep_screen_on = p_enable; } bool DisplayServerWindows::screen_is_kept_on() const { - return false; + return keep_screen_on; } Vector<DisplayServer::WindowID> DisplayServerWindows::get_window_list() const { @@ -3619,6 +3652,9 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win // Init TTS tts = memnew(TTS_Windows); + // Enforce default keep screen on value. + screen_set_keep_on(GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true)); + // Note: Wacom WinTab driver API for pen input, for devices incompatible with Windows Ink. HMODULE wintab_lib = LoadLibraryW(L"wintab32.dll"); if (wintab_lib) { @@ -3822,6 +3858,9 @@ DisplayServerWindows::~DisplayServerWindows() { SetWindowLongPtr(windows[MAIN_WINDOW_ID].hWnd, GWLP_WNDPROC, (LONG_PTR)user_proc); } + // Close power request handle. + screen_set_keep_on(false); + #ifdef GLES3_ENABLED // destroy windows .. NYI? // FIXME wglDeleteContext is never called diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index ddbf674c64..db9b589304 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -331,6 +331,8 @@ class DisplayServerWindows : public DisplayServer { HINSTANCE hInstance; // Holds The Instance Of The Application String rendering_driver; bool app_focused = false; + bool keep_screen_on = false; + HANDLE power_request; TTS_Windows *tts = nullptr; diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp index da4a14394d..f654373ee5 100644 --- a/scene/3d/camera_3d.cpp +++ b/scene/3d/camera_3d.cpp @@ -507,7 +507,7 @@ void Camera3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "projection", PROPERTY_HINT_ENUM, "Perspective,Orthogonal,Frustum"), "set_projection", "get_projection"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "current"), "set_current", "is_current"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fov", PROPERTY_HINT_RANGE, "1,179,0.1,degrees"), "set_fov", "get_fov"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size", PROPERTY_HINT_RANGE, "0.001,16384,0.01,suffix:m"), "set_size", "get_size"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size", PROPERTY_HINT_RANGE, "0.001,16384,0.001,suffix:m"), "set_size", "get_size"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "frustum_offset", PROPERTY_HINT_NONE, "suffix:m"), "set_frustum_offset", "get_frustum_offset"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "near", PROPERTY_HINT_RANGE, "0.001,10,0.001,or_greater,exp,suffix:m"), "set_near", "get_near"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "far", PROPERTY_HINT_RANGE, "0.01,4000,0.01,or_greater,exp,suffix:m"), "set_far", "get_far"); diff --git a/scene/3d/soft_dynamic_body_3d.cpp b/scene/3d/soft_dynamic_body_3d.cpp index d68e7fd527..15f050defb 100644 --- a/scene/3d/soft_dynamic_body_3d.cpp +++ b/scene/3d/soft_dynamic_body_3d.cpp @@ -83,7 +83,16 @@ void SoftDynamicBodyRenderingServerHandler::set_vertex(int p_vertex_id, const vo } void SoftDynamicBodyRenderingServerHandler::set_normal(int p_vertex_id, const void *p_vector3) { - memcpy(&write_buffer[p_vertex_id * stride + offset_normal], p_vector3, sizeof(float) * 3); + // Store normal vector in A2B10G10R10 format. + Vector3 n; + memcpy(&n, p_vector3, sizeof(Vector3)); + n *= Vector3(0.5, 0.5, 0.5); + n += Vector3(0.5, 0.5, 0.5); + uint32_t value = 0; + value |= CLAMP(int(n.x * 1023.0), 0, 1023); + value |= CLAMP(int(n.y * 1023.0), 0, 1023) << 10; + value |= CLAMP(int(n.z * 1023.0), 0, 1023) << 20; + memcpy(&write_buffer[p_vertex_id * stride + offset_normal], &value, sizeof(uint32_t)); } void SoftDynamicBodyRenderingServerHandler::set_aabb(const AABB &p_aabb) { diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index e76e85cfef..5af06cff29 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -227,8 +227,8 @@ const StringName *GeometryInstance3D::_instance_uniform_get_remap(const StringNa StringName *r = instance_uniform_property_remap.getptr(p_name); if (!r) { String s = p_name; - if (s.begins_with("shader_params/")) { - StringName name = s.replace("shader_params/", ""); + if (s.begins_with("shader_uniforms/")) { + StringName name = s.replace("shader_uniforms/", ""); instance_uniform_property_remap[p_name] = name; return instance_uniform_property_remap.getptr(p_name); } @@ -242,7 +242,7 @@ const StringName *GeometryInstance3D::_instance_uniform_get_remap(const StringNa bool GeometryInstance3D::_set(const StringName &p_name, const Variant &p_value) { const StringName *r = _instance_uniform_get_remap(p_name); if (r) { - set_shader_instance_uniform(*r, p_value); + set_instance_shader_uniform(*r, p_value); return true; } #ifndef DISABLE_DEPRECATED @@ -262,7 +262,7 @@ bool GeometryInstance3D::_set(const StringName &p_name, const Variant &p_value) bool GeometryInstance3D::_get(const StringName &p_name, Variant &r_ret) const { const StringName *r = _instance_uniform_get_remap(p_name); if (r) { - r_ret = get_shader_instance_uniform(*r); + r_ret = get_instance_shader_uniform(*r); return true; } @@ -271,10 +271,10 @@ bool GeometryInstance3D::_get(const StringName &p_name, Variant &r_ret) const { void GeometryInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { List<PropertyInfo> pinfo; - RS::get_singleton()->instance_geometry_get_shader_parameter_list(get_instance(), &pinfo); + RS::get_singleton()->instance_geometry_get_shader_uniform_list(get_instance(), &pinfo); for (PropertyInfo &pi : pinfo) { bool has_def_value = false; - Variant def_value = RS::get_singleton()->instance_geometry_get_shader_parameter_default_value(get_instance(), pi.name); + Variant def_value = RS::get_singleton()->instance_geometry_get_shader_uniform_default_value(get_instance(), pi.name); if (def_value.get_type() != Variant::NIL) { has_def_value = true; } @@ -284,7 +284,7 @@ void GeometryInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { pi.usage = PROPERTY_USAGE_EDITOR | (has_def_value ? PROPERTY_USAGE_CHECKABLE : PROPERTY_USAGE_NONE); //do not save if not changed } - pi.name = "shader_params/" + pi.name; + pi.name = "shader_uniforms/" + pi.name; p_list->push_back(pi); } } @@ -319,24 +319,24 @@ float GeometryInstance3D::get_lod_bias() const { return lod_bias; } -void GeometryInstance3D::set_shader_instance_uniform(const StringName &p_uniform, const Variant &p_value) { +void GeometryInstance3D::set_instance_shader_uniform(const StringName &p_uniform, const Variant &p_value) { if (p_value.get_type() == Variant::NIL) { - Variant def_value = RS::get_singleton()->instance_geometry_get_shader_parameter_default_value(get_instance(), p_uniform); - RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, def_value); + Variant def_value = RS::get_singleton()->instance_geometry_get_shader_uniform_default_value(get_instance(), p_uniform); + RS::get_singleton()->instance_geometry_set_shader_uniform(get_instance(), p_uniform, def_value); instance_uniforms.erase(p_value); } else { instance_uniforms[p_uniform] = p_value; if (p_value.get_type() == Variant::OBJECT) { RID tex_id = p_value; - RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, tex_id); + RS::get_singleton()->instance_geometry_set_shader_uniform(get_instance(), p_uniform, tex_id); } else { - RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, p_value); + RS::get_singleton()->instance_geometry_set_shader_uniform(get_instance(), p_uniform, p_value); } } } -Variant GeometryInstance3D::get_shader_instance_uniform(const StringName &p_uniform) const { - return RS::get_singleton()->instance_geometry_get_shader_parameter(get_instance(), p_uniform); +Variant GeometryInstance3D::get_instance_shader_uniform(const StringName &p_uniform) const { + return RS::get_singleton()->instance_geometry_get_shader_uniform(get_instance(), p_uniform); } void GeometryInstance3D::set_custom_aabb(AABB aabb) { @@ -434,8 +434,8 @@ void GeometryInstance3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_visibility_range_fade_mode", "mode"), &GeometryInstance3D::set_visibility_range_fade_mode); ClassDB::bind_method(D_METHOD("get_visibility_range_fade_mode"), &GeometryInstance3D::get_visibility_range_fade_mode); - ClassDB::bind_method(D_METHOD("set_shader_instance_uniform", "uniform", "value"), &GeometryInstance3D::set_shader_instance_uniform); - ClassDB::bind_method(D_METHOD("get_shader_instance_uniform", "uniform"), &GeometryInstance3D::get_shader_instance_uniform); + ClassDB::bind_method(D_METHOD("set_instance_shader_uniform", "uniform", "value"), &GeometryInstance3D::set_instance_shader_uniform); + ClassDB::bind_method(D_METHOD("get_instance_shader_uniform", "uniform"), &GeometryInstance3D::get_instance_shader_uniform); ClassDB::bind_method(D_METHOD("set_extra_cull_margin", "margin"), &GeometryInstance3D::set_extra_cull_margin); ClassDB::bind_method(D_METHOD("get_extra_cull_margin"), &GeometryInstance3D::get_extra_cull_margin); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index 159b14613c..f7cdcbf411 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -178,8 +178,8 @@ public: void set_lightmap_scale(LightmapScale p_scale); LightmapScale get_lightmap_scale() const; - void set_shader_instance_uniform(const StringName &p_uniform, const Variant &p_value); - Variant get_shader_instance_uniform(const StringName &p_uniform) const; + void set_instance_shader_uniform(const StringName &p_uniform, const Variant &p_value); + Variant get_instance_shader_uniform(const StringName &p_uniform) const; void set_custom_aabb(AABB aabb); diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp index a67f850a86..0a163b65ff 100644 --- a/scene/gui/button.cpp +++ b/scene/gui/button.cpp @@ -34,39 +34,14 @@ #include "servers/rendering_server.h" Size2 Button::get_minimum_size() const { - Size2 minsize = text_buf->get_size(); - if (clip_text || overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) { - minsize.width = 0; - } - - if (!expand_icon) { - Ref<Texture2D> _icon; - if (icon.is_null() && has_theme_icon(SNAME("icon"))) { - _icon = Control::get_theme_icon(SNAME("icon")); - } else { - _icon = icon; - } - - if (!_icon.is_null()) { - minsize.height = MAX(minsize.height, _icon->get_height()); - - if (icon_alignment != HORIZONTAL_ALIGNMENT_CENTER) { - minsize.width += _icon->get_width(); - if (!xl_text.is_empty()) { - minsize.width += get_theme_constant(SNAME("h_separation")); - } - } else { - minsize.width = MAX(minsize.width, _icon->get_width()); - } - } - } - if (!xl_text.is_empty()) { - Ref<Font> font = get_theme_font(SNAME("font")); - float font_height = font->get_height(get_theme_font_size(SNAME("font_size"))); - minsize.height = MAX(font_height, minsize.height); + Ref<Texture2D> _icon; + if (icon.is_null() && has_theme_icon(SNAME("icon"))) { + _icon = Control::get_theme_icon(SNAME("icon")); + } else { + _icon = icon; } - return get_theme_stylebox(SNAME("normal"))->get_minimum_size() + minsize; + return get_minimum_size_for_text_and_icon("", _icon); } void Button::_set_internal_margin(Side p_side, float p_value) { @@ -283,7 +258,8 @@ void Button::_notification(int p_what) { } if (icon_region.size.width > 0) { - draw_texture_rect_region(_icon, icon_region, Rect2(Point2(), _icon->get_size()), color_icon); + Rect2 icon_region_rounded = Rect2(icon_region.position.round(), icon_region.size.round()); + draw_texture_rect(_icon, icon_region_rounded, false, color_icon); } } @@ -352,18 +328,62 @@ void Button::_notification(int p_what) { } } -void Button::_shape() { +Size2 Button::get_minimum_size_for_text_and_icon(const String &p_text, Ref<Texture2D> p_icon) const { + Ref<TextParagraph> paragraph; + if (p_text.is_empty()) { + paragraph = text_buf; + } else { + paragraph.instantiate(); + const_cast<Button *>(this)->_shape(paragraph, p_text); + } + + Size2 minsize = paragraph->get_size(); + if (clip_text || overrun_behavior != TextServer::OVERRUN_NO_TRIMMING) { + minsize.width = 0; + } + + if (!expand_icon && !p_icon.is_null()) { + minsize.height = MAX(minsize.height, p_icon->get_height()); + + if (icon_alignment != HORIZONTAL_ALIGNMENT_CENTER) { + minsize.width += p_icon->get_width(); + if (!xl_text.is_empty() || !p_text.is_empty()) { + minsize.width += get_theme_constant(SNAME("hseparation")); + } + } else { + minsize.width = MAX(minsize.width, p_icon->get_width()); + } + } + + if (!xl_text.is_empty() || !p_text.is_empty()) { + Ref<Font> font = get_theme_font(SNAME("font")); + float font_height = font->get_height(get_theme_font_size(SNAME("font_size"))); + minsize.height = MAX(font_height, minsize.height); + } + + return get_theme_stylebox(SNAME("normal"))->get_minimum_size() + minsize; +} + +void Button::_shape(Ref<TextParagraph> p_paragraph, String p_text) { + if (p_paragraph.is_null()) { + p_paragraph = text_buf; + } + + if (p_text.is_empty()) { + p_text = xl_text; + } + Ref<Font> font = get_theme_font(SNAME("font")); int font_size = get_theme_font_size(SNAME("font_size")); - text_buf->clear(); + p_paragraph->clear(); if (text_direction == Control::TEXT_DIRECTION_INHERITED) { - text_buf->set_direction(is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR); + p_paragraph->set_direction(is_layout_rtl() ? TextServer::DIRECTION_RTL : TextServer::DIRECTION_LTR); } else { - text_buf->set_direction((TextServer::Direction)text_direction); + p_paragraph->set_direction((TextServer::Direction)text_direction); } - text_buf->add_string(xl_text, font, font_size, language); - text_buf->set_text_overrun_behavior(overrun_behavior); + p_paragraph->add_string(p_text, font, font_size, language); + p_paragraph->set_text_overrun_behavior(overrun_behavior); } void Button::set_text_overrun_behavior(TextServer::OverrunBehavior p_behavior) { diff --git a/scene/gui/button.h b/scene/gui/button.h index 9d8d457f7c..23b5c78166 100644 --- a/scene/gui/button.h +++ b/scene/gui/button.h @@ -54,7 +54,7 @@ private: HorizontalAlignment icon_alignment = HORIZONTAL_ALIGNMENT_LEFT; float _internal_margin[4] = {}; - void _shape(); + void _shape(Ref<TextParagraph> p_paragraph = Ref<TextParagraph>(), String p_text = ""); protected: void _set_internal_margin(Side p_side, float p_value); @@ -64,6 +64,8 @@ protected: public: virtual Size2 get_minimum_size() const override; + Size2 get_minimum_size_for_text_and_icon(const String &p_text, Ref<Texture2D> p_icon) const; + void set_text(const String &p_text); String get_text() const; diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 788feacdd9..8cbe14c492 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -171,6 +171,9 @@ uniform float v = 1.0; void fragment() { float x = UV.x - 0.5; float y = UV.y - 0.5; + float h = atan(y, x) / (2.0 * M_PI); + float s = sqrt(x * x + y * y) * 2.0; + vec3 col = okhsl_to_srgb(vec3(h, s, v)); x += 0.001; y += 0.001; float b = float(sqrt(x * x + y * y) < 0.5); @@ -180,9 +183,6 @@ void fragment() { float b3 = float(sqrt(x * x + y * y) < 0.5); x += 0.002; float b4 = float(sqrt(x * x + y * y) < 0.5); - float s = sqrt(x * x + y * y); - float h = atan(y, x) / (2.0*M_PI); - vec3 col = okhsl_to_srgb(vec3(h, s, v)); COLOR = vec4(col, (b + b2 + b3 + b4) / 4.00); })"); } @@ -847,7 +847,7 @@ void ColorPicker::_hsv_draw(int p_which, Control *c) { } else if (p_which == 2) { c->draw_rect(Rect2(Point2(), c->get_size()), Color(1, 1, 1)); if (actual_shape == SHAPE_VHS_CIRCLE || actual_shape == SHAPE_OKHSL_CIRCLE) { - circle_mat->set_shader_param("v", v); + circle_mat->set_shader_uniform("v", v); } } } diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 42f434f0ac..09efee71a3 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -1823,7 +1823,20 @@ HashMap<int, Vector<StringName>> GraphEdit::_layering(const HashSet<StringName> } if (!selected) { current_layer++; + uint32_t previous_size_z = z.size(); _set_operations(GraphEdit::UNION, z, u); + if (z.size() == previous_size_z) { + WARN_PRINT("Graph contains cycle(s). The cycle(s) will not be rearranged accurately."); + Vector<StringName> t; + if (l.has(0)) { + t.append_array(l[0]); + } + for (const StringName &E : p) { + t.push_back(E); + } + l.insert(0, t); + break; + } } selected = false; } @@ -2138,7 +2151,7 @@ void GraphEdit::arrange_nodes() { HashSet<StringName> s; for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { GraphNode *p_from = Object::cast_to<GraphNode>(node_names[E->get().from]); - if (E->get().to == gn->get_name() && p_from->is_selected()) { + if (E->get().to == gn->get_name() && p_from->is_selected() && E->get().to != E->get().from) { if (!s.has(p_from->get_name())) { s.insert(p_from->get_name()); } diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index c5054525a7..112b8c74af 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -450,7 +450,7 @@ void GraphNode::_validate_property(PropertyInfo &property) const { Control::_validate_property(property); GraphEdit *graph = Object::cast_to<GraphEdit>(get_parent()); if (graph) { - if (property.name == "rect_position") { + if (property.name == "position") { property.usage |= PROPERTY_USAGE_READ_ONLY; } } diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 39f8f23cd8..f315b2bbf1 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -1513,9 +1513,9 @@ void LineEdit::clear() { void LineEdit::show_virtual_keyboard() { if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD) && virtual_keyboard_enabled) { if (selection.enabled) { - DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), false, max_length, selection.begin, selection.end); + DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), DisplayServer::VirtualKeyboardType(virtual_keyboard_type), max_length, selection.begin, selection.end); } else { - DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), false, max_length, caret_column); + DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), DisplayServer::VirtualKeyboardType(virtual_keyboard_type), max_length, caret_column); } } } @@ -2040,6 +2040,14 @@ bool LineEdit::is_virtual_keyboard_enabled() const { return virtual_keyboard_enabled; } +void LineEdit::set_virtual_keyboard_type(VirtualKeyboardType p_type) { + virtual_keyboard_type = p_type; +} + +LineEdit::VirtualKeyboardType LineEdit::get_virtual_keyboard_type() const { + return virtual_keyboard_type; +} + void LineEdit::set_middle_mouse_paste_enabled(bool p_enabled) { middle_mouse_paste_enabled = p_enabled; } @@ -2280,6 +2288,8 @@ void LineEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("is_context_menu_enabled"), &LineEdit::is_context_menu_enabled); ClassDB::bind_method(D_METHOD("set_virtual_keyboard_enabled", "enable"), &LineEdit::set_virtual_keyboard_enabled); ClassDB::bind_method(D_METHOD("is_virtual_keyboard_enabled"), &LineEdit::is_virtual_keyboard_enabled); + ClassDB::bind_method(D_METHOD("set_virtual_keyboard_type", "type"), &LineEdit::set_virtual_keyboard_type); + ClassDB::bind_method(D_METHOD("get_virtual_keyboard_type"), &LineEdit::get_virtual_keyboard_type); ClassDB::bind_method(D_METHOD("set_clear_button_enabled", "enable"), &LineEdit::set_clear_button_enabled); ClassDB::bind_method(D_METHOD("is_clear_button_enabled"), &LineEdit::is_clear_button_enabled); ClassDB::bind_method(D_METHOD("set_shortcut_keys_enabled", "enable"), &LineEdit::set_shortcut_keys_enabled); @@ -2329,6 +2339,15 @@ void LineEdit::_bind_methods() { BIND_ENUM_CONSTANT(MENU_INSERT_SHY); BIND_ENUM_CONSTANT(MENU_MAX); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_DEFAULT); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_MULTILINE); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_NUMBER); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_NUMBER_DECIMAL); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_PHONE); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_EMAIL_ADDRESS); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_PASSWORD); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_URL); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "text"), "set_text", "get_text"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "placeholder_text"), "set_placeholder", "get_placeholder"); ADD_PROPERTY(PropertyInfo(Variant::INT, "alignment", PROPERTY_HINT_ENUM, "Left,Center,Right,Fill"), "set_horizontal_alignment", "get_horizontal_alignment"); @@ -2339,6 +2358,7 @@ void LineEdit::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand_to_text_length"), "set_expand_to_text_length_enabled", "is_expand_to_text_length_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "context_menu_enabled"), "set_context_menu_enabled", "is_context_menu_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "virtual_keyboard_enabled"), "set_virtual_keyboard_enabled", "is_virtual_keyboard_enabled"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "virtual_keyboard_type", PROPERTY_HINT_ENUM, "Default,Multiline,Number,Decimal,Phone,Email,Password,URL"), "set_virtual_keyboard_type", "get_virtual_keyboard_type"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clear_button_enabled"), "set_clear_button_enabled", "is_clear_button_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "shortcut_keys_enabled"), "set_shortcut_keys_enabled", "is_shortcut_keys_enabled"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "middle_mouse_paste_enabled"), "set_middle_mouse_paste_enabled", "is_middle_mouse_paste_enabled"); diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h index 6aa1694f1f..a828479b0c 100644 --- a/scene/gui/line_edit.h +++ b/scene/gui/line_edit.h @@ -70,6 +70,17 @@ public: MENU_MAX }; + enum VirtualKeyboardType { + KEYBOARD_TYPE_DEFAULT, + KEYBOARD_TYPE_MULTILINE, + KEYBOARD_TYPE_NUMBER, + KEYBOARD_TYPE_NUMBER_DECIMAL, + KEYBOARD_TYPE_PHONE, + KEYBOARD_TYPE_EMAIL_ADDRESS, + KEYBOARD_TYPE_PASSWORD, + KEYBOARD_TYPE_URL + }; + private: HorizontalAlignment alignment = HORIZONTAL_ALIGNMENT_LEFT; @@ -120,6 +131,7 @@ private: bool shortcut_keys_enabled = true; bool virtual_keyboard_enabled = true; + VirtualKeyboardType virtual_keyboard_type = KEYBOARD_TYPE_DEFAULT; bool middle_mouse_paste_enabled = true; @@ -311,6 +323,9 @@ public: void set_virtual_keyboard_enabled(bool p_enable); bool is_virtual_keyboard_enabled() const; + void set_virtual_keyboard_type(VirtualKeyboardType p_type); + VirtualKeyboardType get_virtual_keyboard_type() const; + void set_middle_mouse_paste_enabled(bool p_enabled); bool is_middle_mouse_paste_enabled() const; @@ -335,5 +350,6 @@ public: }; VARIANT_ENUM_CAST(LineEdit::MenuItems); +VARIANT_ENUM_CAST(LineEdit::VirtualKeyboardType); #endif // LINE_EDIT_H diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index a10ec1db06..c58513df17 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -35,7 +35,12 @@ static const int NONE_SELECTED = -1; Size2 OptionButton::get_minimum_size() const { - Size2 minsize = Button::get_minimum_size(); + Size2 minsize; + if (fit_to_longest_item) { + minsize = _cached_size; + } else { + minsize = Button::get_minimum_size(); + } if (has_theme_icon(SNAME("arrow"))) { const Size2 padding = get_theme_stylebox(SNAME("normal"))->get_minimum_size(); @@ -107,6 +112,7 @@ void OptionButton::_notification(int p_what) { _set_internal_margin(SIDE_RIGHT, Control::get_theme_icon(SNAME("arrow"))->get_width()); } } + _refresh_size_cache(); } break; case NOTIFICATION_VISIBILITY_CHANGED: { @@ -135,6 +141,10 @@ bool OptionButton::_set(const StringName &p_name, const Variant &p_value) { _select(idx, false); } + if (property == "text" || property == "icon") { + _queue_refresh_cache(); + } + return valid; } return false; @@ -208,6 +218,7 @@ void OptionButton::add_icon_item(const Ref<Texture2D> &p_icon, const String &p_l if (first_selectable) { select(get_item_count() - 1); } + _queue_refresh_cache(); } void OptionButton::add_item(const String &p_label, int p_id) { @@ -216,6 +227,7 @@ void OptionButton::add_item(const String &p_label, int p_id) { if (first_selectable) { select(get_item_count() - 1); } + _queue_refresh_cache(); } void OptionButton::set_item_text(int p_idx, const String &p_text) { @@ -224,6 +236,7 @@ void OptionButton::set_item_text(int p_idx, const String &p_text) { if (current == p_idx) { set_text(p_text); } + _queue_refresh_cache(); } void OptionButton::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { @@ -232,6 +245,7 @@ void OptionButton::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { if (current == p_idx) { set_icon(p_icon); } + _queue_refresh_cache(); } void OptionButton::set_item_id(int p_idx, int p_id) { @@ -301,6 +315,7 @@ void OptionButton::set_item_count(int p_count) { } } + _refresh_size_cache(); notify_property_list_changed(); } @@ -333,6 +348,19 @@ int OptionButton::get_item_count() const { return popup->get_item_count(); } +void OptionButton::set_fit_to_longest_item(bool p_fit) { + if (p_fit == fit_to_longest_item) { + return; + } + fit_to_longest_item = p_fit; + + _refresh_size_cache(); +} + +bool OptionButton::is_fit_to_longest_item() const { + return fit_to_longest_item; +} + void OptionButton::add_separator(const String &p_text) { popup->add_separator(p_text); } @@ -341,6 +369,7 @@ void OptionButton::clear() { popup->clear(); set_text(""); current = NONE_SELECTED; + _refresh_size_cache(); } void OptionButton::_select(int p_which, bool p_emit) { @@ -380,6 +409,29 @@ void OptionButton::_select_int(int p_which) { _select(p_which, false); } +void OptionButton::_refresh_size_cache() { + cache_refresh_pending = false; + + if (!fit_to_longest_item) { + return; + } + + _cached_size = Vector2(); + for (int i = 0; i < get_item_count(); i++) { + _cached_size = _cached_size.max(get_minimum_size_for_text_and_icon(get_item_text(i), get_item_icon(i))); + } + update_minimum_size(); +} + +void OptionButton::_queue_refresh_cache() { + if (cache_refresh_pending) { + return; + } + cache_refresh_pending = true; + + callable_mp(this, &OptionButton::_refresh_size_cache).call_deferredp(nullptr, 0); +} + void OptionButton::select(int p_idx) { _select(p_idx, false); } @@ -405,6 +457,7 @@ void OptionButton::remove_item(int p_idx) { if (current == p_idx) { _select(NONE_SELECTED); } + _queue_refresh_cache(); } PopupMenu *OptionButton::get_popup() const { @@ -453,10 +506,13 @@ void OptionButton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_item_count"), &OptionButton::get_item_count); ClassDB::bind_method(D_METHOD("has_selectable_items"), &OptionButton::has_selectable_items); ClassDB::bind_method(D_METHOD("get_selectable_item", "from_last"), &OptionButton::get_selectable_item, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("set_fit_to_longest_item", "fit"), &OptionButton::set_fit_to_longest_item); + ClassDB::bind_method(D_METHOD("is_fit_to_longest_item"), &OptionButton::is_fit_to_longest_item); // "selected" property must come after "item_count", otherwise GH-10213 occurs. ADD_ARRAY_COUNT("Items", "item_count", "set_item_count", "get_item_count", "popup/item_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "selected"), "_select_int", "get_selected"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fit_to_longest_item"), "set_fit_to_longest_item", "is_fit_to_longest_item"); ADD_SIGNAL(MethodInfo("item_selected", PropertyInfo(Variant::INT, "index"))); ADD_SIGNAL(MethodInfo("item_focused", PropertyInfo(Variant::INT, "index"))); } @@ -482,6 +538,7 @@ OptionButton::OptionButton(const String &p_text) : popup->connect("index_pressed", callable_mp(this, &OptionButton::_selected)); popup->connect("id_focused", callable_mp(this, &OptionButton::_focused)); popup->connect("popup_hide", callable_mp((BaseButton *)this, &BaseButton::set_pressed).bind(false)); + _refresh_size_cache(); } OptionButton::~OptionButton() { diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h index 5665296699..49b5eee910 100644 --- a/scene/gui/option_button.h +++ b/scene/gui/option_button.h @@ -39,11 +39,16 @@ class OptionButton : public Button { PopupMenu *popup = nullptr; int current = -1; + bool fit_to_longest_item = true; + Vector2 _cached_size; + bool cache_refresh_pending = false; void _focused(int p_which); void _selected(int p_which); void _select(int p_which, bool p_emit = false); void _select_int(int p_which); + void _refresh_size_cache(); + void _queue_refresh_cache(); virtual void pressed() override; @@ -85,6 +90,8 @@ public: void set_item_count(int p_count); int get_item_count() const; + void set_fit_to_longest_item(bool p_fit); + bool is_fit_to_longest_item() const; void add_separator(const String &p_text = ""); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 8e424977c4..984f20ee58 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -821,17 +821,18 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o off.y += line_spacing; } - RID rid = l.text_buf->get_line_rid(line); if (p_ofs.y + off.y >= ctrl_size.height) { break; } - if (p_ofs.y + off.y + TS->shaped_text_get_size(rid).y <= 0) { - off.y += TS->shaped_text_get_size(rid).y; + + const Size2 line_size = l.text_buf->get_line_size(line); + if (p_ofs.y + off.y + line_size.y <= 0) { + off.y += line_size.y; continue; } float width = l.text_buf->get_width(); - float length = TS->shaped_text_get_width(rid); + float length = line_size.x; // Draw line. line_count++; @@ -874,6 +875,7 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o } } + RID rid = l.text_buf->get_line_rid(line); //draw_rect(Rect2(p_ofs + off, TS->shaped_text_get_size(rid)), Color(1,0,0), false, 2); //DEBUG_RECTS off.y += TS->shaped_text_get_ascent(rid); diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index 9efab27e3a..8fd547813d 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -37,7 +37,10 @@ Size2 ScrollContainer::get_minimum_size() const { Ref<StyleBox> sb = get_theme_stylebox(SNAME("bg")); Size2 min_size; - Size2 content_min_size; + + // Calculated in this function, as it needs to traverse all child controls once to calculate; + // and needs to be calculated before being used by update_scrollbars(). + largest_child_min_size = Size2(); for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); @@ -50,25 +53,27 @@ Size2 ScrollContainer::get_minimum_size() const { if (c == h_scroll || c == v_scroll) { continue; } - Size2 minsize = c->get_combined_minimum_size(); - content_min_size.x = MAX(content_min_size.x, minsize.x); - content_min_size.y = MAX(content_min_size.y, minsize.y); + Size2 child_min_size = c->get_combined_minimum_size(); + + largest_child_min_size.x = MAX(largest_child_min_size.x, child_min_size.x); + largest_child_min_size.y = MAX(largest_child_min_size.y, child_min_size.y); } if (horizontal_scroll_mode == SCROLL_MODE_DISABLED) { - min_size.x = MAX(min_size.x, content_min_size.x); + min_size.x = MAX(min_size.x, largest_child_min_size.x); } if (vertical_scroll_mode == SCROLL_MODE_DISABLED) { - min_size.y = MAX(min_size.y, content_min_size.y); + min_size.y = MAX(min_size.y, largest_child_min_size.y); } - bool h_scroll_show = horizontal_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (horizontal_scroll_mode == SCROLL_MODE_AUTO && content_min_size.x > min_size.x); - bool v_scroll_show = vertical_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (vertical_scroll_mode == SCROLL_MODE_AUTO && content_min_size.y > min_size.y); - if (h_scroll_show) { + bool h_scroll_show = horizontal_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (horizontal_scroll_mode == SCROLL_MODE_AUTO && largest_child_min_size.x > min_size.x); + bool v_scroll_show = vertical_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (vertical_scroll_mode == SCROLL_MODE_AUTO && largest_child_min_size.y > min_size.y); + + if (h_scroll_show && h_scroll->get_parent() == this) { min_size.y += h_scroll->get_minimum_size().y; } - if (v_scroll_show) { + if (v_scroll_show && v_scroll->get_parent() == this) { min_size.x += v_scroll->get_minimum_size().x; } @@ -261,8 +266,8 @@ void ScrollContainer::ensure_control_visible(Control *p_control) { set_v_scroll(get_v_scroll() + (diff.y - global_rect.position.y)); } -void ScrollContainer::_update_dimensions() { - child_max_size = Size2(0, 0); +void ScrollContainer::_reposition_children() { + update_scrollbars(); Size2 size = get_size(); Point2 ofs; @@ -291,25 +296,13 @@ void ScrollContainer::_update_dimensions() { continue; } Size2 minsize = c->get_combined_minimum_size(); - child_max_size.x = MAX(child_max_size.x, minsize.x); - child_max_size.y = MAX(child_max_size.y, minsize.y); Rect2 r = Rect2(-Size2(get_h_scroll(), get_v_scroll()), minsize); - if (horizontal_scroll_mode == SCROLL_MODE_DISABLED || (!h_scroll->is_visible_in_tree() && c->get_h_size_flags() & SIZE_EXPAND)) { - r.position.x = 0; - if (c->get_h_size_flags() & SIZE_EXPAND) { - r.size.width = MAX(size.width, minsize.width); - } else { - r.size.width = minsize.width; - } + if (c->get_h_size_flags() & SIZE_EXPAND) { + r.size.width = MAX(size.width, minsize.width); } - if (vertical_scroll_mode == SCROLL_MODE_DISABLED || (!v_scroll->is_visible_in_tree() && c->get_v_size_flags() & SIZE_EXPAND)) { - r.position.y = 0; - if (c->get_v_size_flags() & SIZE_EXPAND) { - r.size.height = MAX(size.height, minsize.height); - } else { - r.size.height = minsize.height; - } + if (c->get_v_size_flags() & SIZE_EXPAND) { + r.size.height = MAX(size.height, minsize.height); } r.position += ofs; if (rtl && v_scroll->is_visible_in_tree() && v_scroll->get_parent() == this) { @@ -319,7 +312,6 @@ void ScrollContainer::_update_dimensions() { fit_child_in_rect(c, r); } - update_scrollbars(); update(); } @@ -337,18 +329,16 @@ void ScrollContainer::_notification(int p_what) { Viewport *viewport = get_viewport(); ERR_FAIL_COND(!viewport); viewport->connect("gui_focus_changed", callable_mp(this, &ScrollContainer::_gui_focus_changed)); - _update_dimensions(); + _reposition_children(); } break; case NOTIFICATION_SORT_CHILDREN: { - _update_dimensions(); + _reposition_children(); } break; case NOTIFICATION_DRAW: { Ref<StyleBox> sb = get_theme_stylebox(SNAME("bg")); draw_style_box(sb, Rect2(Vector2(), get_size())); - - update_scrollbars(); } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { @@ -426,36 +416,25 @@ void ScrollContainer::update_scrollbars() { Ref<StyleBox> sb = get_theme_stylebox(SNAME("bg")); size -= sb->get_minimum_size(); - Size2 hmin; - Size2 vmin; - if (horizontal_scroll_mode != SCROLL_MODE_DISABLED) { - hmin = h_scroll->get_combined_minimum_size(); - } - if (vertical_scroll_mode != SCROLL_MODE_DISABLED) { - vmin = v_scroll->get_combined_minimum_size(); - } - - Size2 min = child_max_size; + Size2 hmin = h_scroll->get_combined_minimum_size(); + Size2 vmin = v_scroll->get_combined_minimum_size(); - bool hide_scroll_h = horizontal_scroll_mode != SCROLL_MODE_SHOW_ALWAYS && (horizontal_scroll_mode == SCROLL_MODE_DISABLED || horizontal_scroll_mode == SCROLL_MODE_SHOW_NEVER || (horizontal_scroll_mode == SCROLL_MODE_AUTO && min.width <= size.width)); - bool hide_scroll_v = vertical_scroll_mode != SCROLL_MODE_SHOW_ALWAYS && (vertical_scroll_mode == SCROLL_MODE_DISABLED || vertical_scroll_mode == SCROLL_MODE_SHOW_NEVER || (vertical_scroll_mode == SCROLL_MODE_AUTO && min.height <= size.height)); + h_scroll->set_visible(horizontal_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (horizontal_scroll_mode == SCROLL_MODE_AUTO && largest_child_min_size.width > size.width)); + v_scroll->set_visible(vertical_scroll_mode == SCROLL_MODE_SHOW_ALWAYS || (vertical_scroll_mode == SCROLL_MODE_AUTO && largest_child_min_size.height > size.height)); - h_scroll->set_max(min.width); - h_scroll->set_page(size.width - (hide_scroll_v ? 0 : vmin.width)); - h_scroll->set_visible(!hide_scroll_h); + h_scroll->set_max(largest_child_min_size.width); + h_scroll->set_page((v_scroll->is_visible() && v_scroll->get_parent() == this) ? size.width - vmin.width : size.width); - v_scroll->set_max(min.height); - v_scroll->set_page(size.height - (hide_scroll_h ? 0 : hmin.height)); - v_scroll->set_visible(!hide_scroll_v); + v_scroll->set_max(largest_child_min_size.height); + v_scroll->set_page((h_scroll->is_visible() && h_scroll->get_parent() == this) ? size.height - hmin.height : size.height); // Avoid scrollbar overlapping. - h_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, hide_scroll_v ? 0 : -vmin.width); - v_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, hide_scroll_h ? 0 : -hmin.height); + h_scroll->set_anchor_and_offset(SIDE_RIGHT, ANCHOR_END, (v_scroll->is_visible() && v_scroll->get_parent() == this) ? -vmin.width : 0); + v_scroll->set_anchor_and_offset(SIDE_BOTTOM, ANCHOR_END, (h_scroll->is_visible() && h_scroll->get_parent() == this) ? -hmin.height : 0); } void ScrollContainer::_scroll_moved(float) { queue_sort(); - update(); }; void ScrollContainer::set_h_scroll(int p_pos) { diff --git a/scene/gui/scroll_container.h b/scene/gui/scroll_container.h index 7c8690538d..bfa74cfd0f 100644 --- a/scene/gui/scroll_container.h +++ b/scene/gui/scroll_container.h @@ -50,7 +50,7 @@ private: HScrollBar *h_scroll = nullptr; VScrollBar *v_scroll = nullptr; - Size2 child_max_size; + mutable Size2 largest_child_min_size; // The largest one among the min sizes of all available child controls. void update_scrollbars(); @@ -75,7 +75,7 @@ protected: Size2 get_minimum_size() const override; void _gui_focus_changed(Control *p_control); - void _update_dimensions(); + void _reposition_children(); void _notification(int p_what); void _scroll_moved(float); diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index b7bef37e17..8a7f52b0d9 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -88,7 +88,8 @@ void SpinBox::_line_edit_input(const Ref<InputEvent> &p_event) { void SpinBox::_range_click_timeout() { if (!drag.enabled && Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT)) { bool up = get_local_mouse_position().y < (get_size().height / 2); - set_value(get_value() + (up ? get_step() : -get_step())); + double step = get_custom_arrow_step() != 0.0 ? get_custom_arrow_step() : get_step(); + set_value(get_value() + (up ? step : -step)); if (range_click_timer->is_one_shot()) { range_click_timer->set_wait_time(0.075); @@ -118,6 +119,8 @@ void SpinBox::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; + double step = get_custom_arrow_step() != 0.0 ? get_custom_arrow_step() : get_step(); + if (mb.is_valid() && mb->is_pressed()) { bool up = mb->get_position().y < (get_size().height / 2); @@ -125,7 +128,7 @@ void SpinBox::gui_input(const Ref<InputEvent> &p_event) { case MouseButton::LEFT: { line_edit->grab_focus(); - set_value(get_value() + (up ? get_step() : -get_step())); + set_value(get_value() + (up ? step : -step)); range_click_timer->set_wait_time(0.6); range_click_timer->set_one_shot(true); @@ -140,13 +143,13 @@ void SpinBox::gui_input(const Ref<InputEvent> &p_event) { } break; case MouseButton::WHEEL_UP: { if (line_edit->has_focus()) { - set_value(get_value() + get_step() * mb->get_factor()); + set_value(get_value() + step * mb->get_factor()); accept_event(); } } break; case MouseButton::WHEEL_DOWN: { if (line_edit->has_focus()) { - set_value(get_value() - get_step() * mb->get_factor()); + set_value(get_value() - step * mb->get_factor()); accept_event(); } } break; @@ -168,7 +171,7 @@ void SpinBox::gui_input(const Ref<InputEvent> &p_event) { if (drag.enabled) { drag.diff_y += mm->get_relative().y; double diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8) * SIGN(drag.diff_y); - set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max())); + set_value(CLAMP(drag.base_val + step * diff_y, get_min(), get_max())); } else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) { Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); drag.enabled = true; @@ -294,6 +297,14 @@ void SpinBox::apply() { _text_submitted(line_edit->get_text()); } +void SpinBox::set_custom_arrow_step(double p_custom_arrow_step) { + custom_arrow_step = p_custom_arrow_step; +} + +double SpinBox::get_custom_arrow_step() const { + return custom_arrow_step; +} + void SpinBox::_bind_methods() { ClassDB::bind_method(D_METHOD("set_horizontal_alignment", "alignment"), &SpinBox::set_horizontal_alignment); ClassDB::bind_method(D_METHOD("get_horizontal_alignment"), &SpinBox::get_horizontal_alignment); @@ -302,6 +313,8 @@ void SpinBox::_bind_methods() { ClassDB::bind_method(D_METHOD("set_prefix", "prefix"), &SpinBox::set_prefix); ClassDB::bind_method(D_METHOD("get_prefix"), &SpinBox::get_prefix); ClassDB::bind_method(D_METHOD("set_editable", "enabled"), &SpinBox::set_editable); + ClassDB::bind_method(D_METHOD("set_custom_arrow_step", "arrow_step"), &SpinBox::set_custom_arrow_step); + ClassDB::bind_method(D_METHOD("get_custom_arrow_step"), &SpinBox::get_custom_arrow_step); ClassDB::bind_method(D_METHOD("is_editable"), &SpinBox::is_editable); ClassDB::bind_method(D_METHOD("set_update_on_text_changed", "enabled"), &SpinBox::set_update_on_text_changed); ClassDB::bind_method(D_METHOD("get_update_on_text_changed"), &SpinBox::get_update_on_text_changed); @@ -313,6 +326,7 @@ void SpinBox::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "update_on_text_changed"), "set_update_on_text_changed", "get_update_on_text_changed"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "prefix"), "set_prefix", "get_prefix"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "suffix"), "set_suffix", "get_suffix"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "custom_arrow_step"), "set_custom_arrow_step", "get_custom_arrow_step"); } SpinBox::SpinBox() { diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index 1b1abbcf8e..0aae9efe78 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -52,6 +52,7 @@ class SpinBox : public Range { String prefix; String suffix; + double custom_arrow_step = 0.0; void _line_edit_input(const Ref<InputEvent> &p_event); @@ -95,6 +96,8 @@ public: bool get_update_on_text_changed() const; void apply(); + void set_custom_arrow_step(const double p_custom_arrow_step); + double get_custom_arrow_step() const; SpinBox(); }; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index 4bc8b8e197..c023b06895 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -1466,7 +1466,7 @@ void TextEdit::_notification(int p_what) { caret_end = caret_start + post_text.length(); } - DisplayServer::get_singleton()->virtual_keyboard_show(get_text(), get_global_rect(), true, -1, caret_start, caret_end); + DisplayServer::get_singleton()->virtual_keyboard_show(get_text(), get_global_rect(), DisplayServer::KEYBOARD_TYPE_MULTILINE, -1, caret_start, caret_end); } } break; diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index 520a0a04ed..fa375795c1 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -741,7 +741,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("font_selected_color", "Tree", control_font_pressed_color); theme->set_color("font_outline_color", "Tree", Color(1, 1, 1)); theme->set_color("guide_color", "Tree", Color(0.7, 0.7, 0.7, 0.25)); - theme->set_color("drop_position_color", "Tree", Color(1, 0.3, 0.2)); + theme->set_color("drop_position_color", "Tree", Color(1, 1, 1)); theme->set_color("relationship_line_color", "Tree", Color(0.27, 0.27, 0.27)); theme->set_color("parent_hl_line_color", "Tree", Color(0.27, 0.27, 0.27)); theme->set_color("children_hl_line_color", "Tree", Color(0.27, 0.27, 0.27)); @@ -776,7 +776,7 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const theme->set_color("font_color", "ItemList", control_font_lower_color); theme->set_color("font_selected_color", "ItemList", control_font_pressed_color); theme->set_color("font_outline_color", "ItemList", Color(1, 1, 1)); - theme->set_color("guide_color", "ItemList", Color(0, 0, 0, 0.1)); + theme->set_color("guide_color", "ItemList", Color(0.7, 0.7, 0.7, 0.25)); theme->set_stylebox("selected", "ItemList", make_flat_stylebox(style_selected_color)); theme->set_stylebox("selected_focus", "ItemList", make_flat_stylebox(style_selected_color)); theme->set_stylebox("cursor", "ItemList", focus); diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index 95b0f9e6c0..d361b34da8 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -1337,8 +1337,10 @@ void Environment::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_bounce_feedback", PROPERTY_HINT_RANGE, "0,1.99,0.01"), "set_sdfgi_bounce_feedback", "get_sdfgi_bounce_feedback"); ADD_PROPERTY(PropertyInfo(Variant::INT, "sdfgi_cascades", PROPERTY_HINT_RANGE, "1,8,1"), "set_sdfgi_cascades", "get_sdfgi_cascades"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_min_cell_size", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_sdfgi_min_cell_size", "get_sdfgi_min_cell_size"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_cascade0_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater"), "set_sdfgi_cascade0_distance", "get_sdfgi_cascade0_distance"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_max_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater"), "set_sdfgi_max_distance", "get_sdfgi_max_distance"); + // Don't store the values of `sdfgi_cascade0_distance` and `sdfgi_max_distance` + // as they're derived from `sdfgi_min_cell_size`. + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_cascade0_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater", PROPERTY_USAGE_EDITOR), "set_sdfgi_cascade0_distance", "get_sdfgi_cascade0_distance"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_max_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater", PROPERTY_USAGE_EDITOR), "set_sdfgi_max_distance", "get_sdfgi_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::INT, "sdfgi_y_scale", PROPERTY_HINT_ENUM, "50% (Compact),75% (Balanced),100% (Sparse)"), "set_sdfgi_y_scale", "get_sdfgi_y_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_energy"), "set_sdfgi_energy", "get_sdfgi_energy"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_normal_bias"), "set_sdfgi_normal_bias", "get_sdfgi_normal_bias"); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 1d7e6f6470..55356c2058 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -154,18 +154,18 @@ Material::~Material() { bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); + StringName pr = shader->remap_uniform(p_name); if (!pr) { String n = p_name; if (n.find("param/") == 0) { //backwards compatibility pr = n.substr(6, n.length()); } - if (n.find("shader_param/") == 0) { //backwards compatibility - pr = n.replace_first("shader_param/", ""); + if (n.find("shader_uniform/") == 0) { //backwards compatibility + pr = n.replace_first("shader_uniform/", ""); } } if (pr) { - set_shader_param(pr, p_value); + set_shader_uniform(pr, p_value); return true; } } @@ -175,14 +175,14 @@ bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); + StringName pr = shader->remap_uniform(p_name); if (!pr) { String n = p_name; if (n.find("param/") == 0) { //backwards compatibility pr = n.substr(6, n.length()); } - if (n.find("shader_param/") == 0) { //backwards compatibility - pr = n.replace_first("shader_param/", ""); + if (n.find("shader_uniform/") == 0) { //backwards compatibility + pr = n.replace_first("shader_uniform/", ""); } } @@ -203,7 +203,7 @@ bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { if (!shader.is_null()) { List<PropertyInfo> list; - shader->get_param_list(&list, true); + shader->get_shader_uniform_list(&list, true); HashMap<String, HashMap<String, List<PropertyInfo>>> groups; { @@ -299,7 +299,7 @@ void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { bool ShaderMaterial::property_can_revert(const String &p_name) { if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); + StringName pr = shader->remap_uniform(p_name); if (pr) { Variant default_value = RenderingServer::get_singleton()->shader_get_param_default(shader->get_rid(), pr); Variant current_value; @@ -313,7 +313,7 @@ bool ShaderMaterial::property_can_revert(const String &p_name) { Variant ShaderMaterial::property_get_revert(const String &p_name) { Variant r_ret; if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); + StringName pr = shader->remap_uniform(p_name); if (pr) { r_ret = RenderingServer::get_singleton()->shader_get_param_default(shader->get_rid(), pr); } @@ -349,7 +349,7 @@ Ref<Shader> ShaderMaterial::get_shader() const { return shader; } -void ShaderMaterial::set_shader_param(const StringName &p_param, const Variant &p_value) { +void ShaderMaterial::set_shader_uniform(const StringName &p_param, const Variant &p_value) { if (p_value.get_type() == Variant::NIL) { param_cache.erase(p_param); RS::get_singleton()->material_set_param(_get_material(), p_param, Variant()); @@ -369,7 +369,7 @@ void ShaderMaterial::set_shader_param(const StringName &p_param, const Variant & } } -Variant ShaderMaterial::get_shader_param(const StringName &p_param) const { +Variant ShaderMaterial::get_shader_uniform(const StringName &p_param) const { if (param_cache.has(p_param)) { return param_cache[p_param]; } else { @@ -384,8 +384,8 @@ void ShaderMaterial::_shader_changed() { void ShaderMaterial::_bind_methods() { ClassDB::bind_method(D_METHOD("set_shader", "shader"), &ShaderMaterial::set_shader); ClassDB::bind_method(D_METHOD("get_shader"), &ShaderMaterial::get_shader); - ClassDB::bind_method(D_METHOD("set_shader_param", "param", "value"), &ShaderMaterial::set_shader_param); - ClassDB::bind_method(D_METHOD("get_shader_param", "param"), &ShaderMaterial::get_shader_param); + ClassDB::bind_method(D_METHOD("set_shader_uniform", "param", "value"), &ShaderMaterial::set_shader_uniform); + ClassDB::bind_method(D_METHOD("get_shader_uniform", "param"), &ShaderMaterial::get_shader_uniform); ClassDB::bind_method(D_METHOD("property_can_revert", "name"), &ShaderMaterial::property_can_revert); ClassDB::bind_method(D_METHOD("property_get_revert", "name"), &ShaderMaterial::property_get_revert); @@ -394,12 +394,12 @@ void ShaderMaterial::_bind_methods() { void ShaderMaterial::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { String f = p_function.operator String(); - if ((f == "get_shader_param" || f == "set_shader_param") && p_idx == 0) { + if ((f == "get_shader_uniform" || f == "set_shader_uniform") && p_idx == 0) { if (shader.is_valid()) { List<PropertyInfo> pl; - shader->get_param_list(&pl); + shader->get_shader_uniform_list(&pl); for (const PropertyInfo &E : pl) { - r_options->push_back(E.name.replace_first("shader_param/", "").quote()); + r_options->push_back(E.name.replace_first("shader_uniform/", "").quote()); } } } @@ -1067,7 +1067,8 @@ void BaseMaterial3D::_update_shader() { code += " float num_layers = mix(float(heightmap_max_layers),float(heightmap_min_layers), abs(dot(vec3(0.0, 0.0, 1.0), view_dir)));\n"; code += " float layer_depth = 1.0 / num_layers;\n"; code += " float current_layer_depth = 0.0;\n"; - code += " vec2 P = view_dir.xy * heightmap_scale;\n"; + // Multiply the heightmap scale by 0.01 to improve heightmap scale usability. + code += " vec2 P = view_dir.xy * heightmap_scale * 0.01;\n"; code += " vec2 delta = P / num_layers;\n"; code += " vec2 ofs = base_uv;\n"; if (flags[FLAG_INVERT_HEIGHTMAP]) { @@ -1103,7 +1104,8 @@ void BaseMaterial3D::_update_shader() { } // Use offset limiting to improve the appearance of non-deep parallax. // This reduces the impression of depth, but avoids visible warping in the distance. - code += " vec2 ofs = base_uv - view_dir.xy * depth * heightmap_scale;\n"; + // Multiply the heightmap scale by 0.01 to improve heightmap scale usability. + code += " vec2 ofs = base_uv - view_dir.xy * depth * heightmap_scale * 0.01;\n"; } code += " base_uv=ofs;\n"; @@ -1276,38 +1278,21 @@ void BaseMaterial3D::_update_shader() { if ((distance_fade == DISTANCE_FADE_OBJECT_DITHER || distance_fade == DISTANCE_FADE_PIXEL_DITHER)) { if (!RenderingServer::get_singleton()->is_low_end()) { code += " {\n"; + if (distance_fade == DISTANCE_FADE_OBJECT_DITHER) { code += " float fade_distance = abs((VIEW_MATRIX * MODEL_MATRIX[3]).z);\n"; } else { - code += " float fade_distance=-VERTEX.z;\n"; + code += " float fade_distance = -VERTEX.z;\n"; } + // Use interleaved gradient noise, which is fast but still looks good. + code += " const vec3 magic = vec3(0.06711056f, 0.00583715f, 52.9829189f);"; + code += " float fade = clamp(smoothstep(distance_fade_min, distance_fade_max, fade_distance), 0.0, 1.0);\n"; + // Use a hard cap to prevent a few stray pixels from remaining when past the fade-out distance. + code += " if (fade < 0.001 || fade < fract(magic.z * fract(dot(FRAGCOORD.xy, magic.xy)))) {\n"; + code += " discard;\n"; + code += " }\n"; - code += " float fade=clamp(smoothstep(distance_fade_min,distance_fade_max,fade_distance),0.0,1.0);\n"; - code += " int x = int(FRAGCOORD.x) % 4;\n"; - code += " int y = int(FRAGCOORD.y) % 4;\n"; - code += " int index = x + y * 4;\n"; - code += " float limit = 0.0;\n\n"; - code += " if (x < 8) {\n"; - code += " if (index == 0) limit = 0.0625;\n"; - code += " if (index == 1) limit = 0.5625;\n"; - code += " if (index == 2) limit = 0.1875;\n"; - code += " if (index == 3) limit = 0.6875;\n"; - code += " if (index == 4) limit = 0.8125;\n"; - code += " if (index == 5) limit = 0.3125;\n"; - code += " if (index == 6) limit = 0.9375;\n"; - code += " if (index == 7) limit = 0.4375;\n"; - code += " if (index == 8) limit = 0.25;\n"; - code += " if (index == 9) limit = 0.75;\n"; - code += " if (index == 10) limit = 0.125;\n"; - code += " if (index == 11) limit = 0.625;\n"; - code += " if (index == 12) limit = 1.0;\n"; - code += " if (index == 13) limit = 0.5;\n"; - code += " if (index == 14) limit = 0.875;\n"; - code += " if (index == 15) limit = 0.375;\n"; - code += " }\n\n"; - code += " if (fade < limit)\n"; - code += " discard;\n"; code += " }\n\n"; } @@ -2965,7 +2950,7 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) : set_clearcoat(1); set_clearcoat_roughness(0.5); set_anisotropy(0); - set_heightmap_scale(0.05); + set_heightmap_scale(5.0); set_subsurface_scattering_strength(0); set_backlight(Color(0, 0, 0)); set_transmittance_color(Color(1, 1, 1, 1)); diff --git a/scene/resources/material.h b/scene/resources/material.h index 8c04817c6b..ca5b17dd07 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -115,8 +115,8 @@ public: void set_shader(const Ref<Shader> &p_shader); Ref<Shader> get_shader() const; - void set_shader_param(const StringName &p_param, const Variant &p_value); - Variant get_shader_param(const StringName &p_param) const; + void set_shader_uniform(const StringName &p_param, const Variant &p_value); + Variant get_shader_uniform(const StringName &p_param) const; virtual Shader::Mode get_shader_mode() const override; diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp index 18fd6c8d25..db7b03f2be 100644 --- a/scene/resources/shader.cpp +++ b/scene/resources/shader.cpp @@ -103,11 +103,11 @@ String Shader::get_code() const { return code; } -void Shader::get_param_list(List<PropertyInfo> *p_params, bool p_get_groups) const { +void Shader::get_shader_uniform_list(List<PropertyInfo> *p_params, bool p_get_groups) const { _update_shader(); List<PropertyInfo> local; - RenderingServer::get_singleton()->shader_get_param_list(shader, &local); + RenderingServer::get_singleton()->shader_get_shader_uniform_list(shader, &local); params_cache.clear(); params_cache_dirty = false; @@ -176,8 +176,8 @@ bool Shader::is_text_shader() const { return true; } -bool Shader::has_param(const StringName &p_param) const { - return params_cache.has("shader_param/" + p_param); +bool Shader::has_uniform(const StringName &p_param) const { + return params_cache.has("shader_uniform/" + p_param); } void Shader::_update_shader() const { @@ -192,7 +192,7 @@ void Shader::_bind_methods() { ClassDB::bind_method(D_METHOD("set_default_texture_param", "param", "texture", "index"), &Shader::set_default_texture_param, DEFVAL(0)); ClassDB::bind_method(D_METHOD("get_default_texture_param", "param", "index"), &Shader::get_default_texture_param, DEFVAL(0)); - ClassDB::bind_method(D_METHOD("has_param", "name"), &Shader::has_param); + ClassDB::bind_method(D_METHOD("has_uniform", "name"), &Shader::has_uniform); ADD_PROPERTY(PropertyInfo(Variant::STRING, "code", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR), "set_code", "get_code"); diff --git a/scene/resources/shader.h b/scene/resources/shader.h index 082b37d355..abc953de5f 100644 --- a/scene/resources/shader.h +++ b/scene/resources/shader.h @@ -78,21 +78,21 @@ public: void set_code(const String &p_code); String get_code() const; - void get_param_list(List<PropertyInfo> *p_params, bool p_get_groups = false) const; - bool has_param(const StringName &p_param) const; + void get_shader_uniform_list(List<PropertyInfo> *p_params, bool p_get_groups = false) const; + bool has_uniform(const StringName &p_param) const; - void set_default_texture_param(const StringName &p_param, const Ref<Texture2D> &p_texture, int p_index = 0); - Ref<Texture2D> get_default_texture_param(const StringName &p_param, int p_index = 0) const; + void set_default_texture_param(const StringName &p_uniform, const Ref<Texture2D> &p_texture, int p_index = 0); + Ref<Texture2D> get_default_texture_param(const StringName &p_uniform, int p_index = 0) const; void get_default_texture_param_list(List<StringName> *r_textures) const; virtual bool is_text_shader() const; - _FORCE_INLINE_ StringName remap_param(const StringName &p_param) const { + _FORCE_INLINE_ StringName remap_uniform(const StringName &p_uniform) const { if (params_cache_dirty) { - get_param_list(nullptr); + get_shader_uniform_list(nullptr); } - const HashMap<StringName, StringName>::Iterator E = params_cache.find(p_param); + const HashMap<StringName, StringName>::Iterator E = params_cache.find(p_uniform); if (E) { return E->value; } diff --git a/servers/display_server.cpp b/servers/display_server.cpp index e9bc28873b..4e7db7d0a5 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -400,7 +400,7 @@ String DisplayServer::ime_get_text() const { ERR_FAIL_V_MSG(String(), "IME or NOTIFICATION_WM_IME_UPDATEnot supported by this display server."); } -void DisplayServer::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, bool p_multiline, int p_max_length, int p_cursor_start, int p_cursor_end) { +void DisplayServer::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) { WARN_PRINT("Virtual keyboard not supported by this display server."); } @@ -494,11 +494,11 @@ int64_t DisplayServer::window_get_native_handle(HandleType p_handle_type, Window } void DisplayServer::window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window) { - WARN_PRINT("Changing the VSync mode is not supported by this display server."); + WARN_PRINT("Changing the V-Sync mode is not supported by this display server."); } DisplayServer::VSyncMode DisplayServer::window_get_vsync_mode(WindowID p_window) const { - WARN_PRINT("Changing the VSync mode is not supported by this display server."); + WARN_PRINT("Changing the V-Sync mode is not supported by this display server."); return VSyncMode::VSYNC_ENABLED; } @@ -660,7 +660,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("ime_get_selection"), &DisplayServer::ime_get_selection); ClassDB::bind_method(D_METHOD("ime_get_text"), &DisplayServer::ime_get_text); - ClassDB::bind_method(D_METHOD("virtual_keyboard_show", "existing_text", "position", "multiline", "max_length", "cursor_start", "cursor_end"), &DisplayServer::virtual_keyboard_show, DEFVAL(Rect2()), DEFVAL(false), DEFVAL(-1), DEFVAL(-1), DEFVAL(-1)); + ClassDB::bind_method(D_METHOD("virtual_keyboard_show", "existing_text", "position", "type", "max_length", "cursor_start", "cursor_end"), &DisplayServer::virtual_keyboard_show, DEFVAL(Rect2()), DEFVAL(KEYBOARD_TYPE_DEFAULT), DEFVAL(-1), DEFVAL(-1), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("virtual_keyboard_hide"), &DisplayServer::virtual_keyboard_hide); ClassDB::bind_method(D_METHOD("virtual_keyboard_get_height"), &DisplayServer::virtual_keyboard_get_height); @@ -732,6 +732,15 @@ void DisplayServer::_bind_methods() { BIND_ENUM_CONSTANT(SCREEN_SENSOR_PORTRAIT); BIND_ENUM_CONSTANT(SCREEN_SENSOR); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_DEFAULT); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_MULTILINE); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_NUMBER); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_NUMBER_DECIMAL); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_PHONE); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_EMAIL_ADDRESS); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_PASSWORD); + BIND_ENUM_CONSTANT(KEYBOARD_TYPE_URL); + BIND_ENUM_CONSTANT(CURSOR_ARROW); BIND_ENUM_CONSTANT(CURSOR_IBEAM); BIND_ENUM_CONSTANT(CURSOR_POINTING_HAND); diff --git a/servers/display_server.h b/servers/display_server.h index 7a15df2f92..8632b53f7b 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -382,7 +382,18 @@ public: virtual Point2i ime_get_selection() const; virtual String ime_get_text() const; - virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), bool p_multiline = false, int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1); + enum VirtualKeyboardType { + KEYBOARD_TYPE_DEFAULT, + KEYBOARD_TYPE_MULTILINE, + KEYBOARD_TYPE_NUMBER, + KEYBOARD_TYPE_NUMBER_DECIMAL, + KEYBOARD_TYPE_PHONE, + KEYBOARD_TYPE_EMAIL_ADDRESS, + KEYBOARD_TYPE_PASSWORD, + KEYBOARD_TYPE_URL + }; + + virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), VirtualKeyboardType p_type = KEYBOARD_TYPE_DEFAULT, int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1); virtual void virtual_keyboard_hide(); // returns height of the currently shown virtual keyboard (0 if keyboard is hidden) @@ -467,6 +478,7 @@ VARIANT_ENUM_CAST(DisplayServer::ScreenOrientation) VARIANT_ENUM_CAST(DisplayServer::WindowMode) VARIANT_ENUM_CAST(DisplayServer::WindowFlags) VARIANT_ENUM_CAST(DisplayServer::HandleType) +VARIANT_ENUM_CAST(DisplayServer::VirtualKeyboardType); VARIANT_ENUM_CAST(DisplayServer::CursorShape) VARIANT_ENUM_CAST(DisplayServer::VSyncMode) VARIANT_ENUM_CAST(DisplayServer::TTSUtteranceEvent) diff --git a/servers/physics_server_2d.cpp b/servers/physics_server_2d.cpp index 41aae36785..26768e300c 100644 --- a/servers/physics_server_2d.cpp +++ b/servers/physics_server_2d.cpp @@ -147,6 +147,16 @@ PhysicsDirectBodyState2D::PhysicsDirectBodyState2D() {} /////////////////////////////////////////////////////// +Ref<PhysicsRayQueryParameters2D> PhysicsRayQueryParameters2D::create(Vector2 p_from, Vector2 p_to, uint32_t p_mask, const Vector<RID> &p_exclude) { + Ref<PhysicsRayQueryParameters2D> params; + params.instantiate(); + params->set_from(p_from); + params->set_to(p_to); + params->set_collision_mask(p_mask); + params->set_exclude(p_exclude); + return params; +} + void PhysicsRayQueryParameters2D::set_exclude(const Vector<RID> &p_exclude) { parameters.exclude.clear(); for (int i = 0; i < p_exclude.size(); i++) { @@ -165,6 +175,8 @@ Vector<RID> PhysicsRayQueryParameters2D::get_exclude() const { } void PhysicsRayQueryParameters2D::_bind_methods() { + ClassDB::bind_static_method("PhysicsRayQueryParameters2D", D_METHOD("create", "from", "to", "collision_mask", "exclude"), &PhysicsRayQueryParameters2D::create, DEFVAL(UINT32_MAX), DEFVAL(Vector<RID>())); + ClassDB::bind_method(D_METHOD("set_from", "from"), &PhysicsRayQueryParameters2D::set_from); ClassDB::bind_method(D_METHOD("get_from"), &PhysicsRayQueryParameters2D::get_from); diff --git a/servers/physics_server_2d.h b/servers/physics_server_2d.h index 7a821c64e6..6d95c591c2 100644 --- a/servers/physics_server_2d.h +++ b/servers/physics_server_2d.h @@ -605,6 +605,7 @@ protected: static void _bind_methods(); public: + static Ref<PhysicsRayQueryParameters2D> create(Vector2 p_from, Vector2 p_to, uint32_t p_mask, const Vector<RID> &p_exclude); const PhysicsDirectSpaceState2D::RayParameters &get_parameters() const { return parameters; } void set_from(const Vector2 &p_from) { parameters.from = p_from; } diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp index a606d055f7..f25db22e66 100644 --- a/servers/physics_server_3d.cpp +++ b/servers/physics_server_3d.cpp @@ -184,6 +184,8 @@ Vector<RID> PhysicsRayQueryParameters3D::get_exclude() const { } void PhysicsRayQueryParameters3D::_bind_methods() { + ClassDB::bind_static_method("PhysicsRayQueryParameters3D", D_METHOD("create", "from", "to", "collision_mask", "exclude"), &PhysicsRayQueryParameters3D::create, DEFVAL(UINT32_MAX), DEFVAL(Vector<RID>())); + ClassDB::bind_method(D_METHOD("set_from", "from"), &PhysicsRayQueryParameters3D::set_from); ClassDB::bind_method(D_METHOD("get_from"), &PhysicsRayQueryParameters3D::get_from); @@ -220,6 +222,16 @@ void PhysicsRayQueryParameters3D::_bind_methods() { /////////////////////////////////////////////////////// +Ref<PhysicsRayQueryParameters3D> PhysicsRayQueryParameters3D::create(Vector3 p_from, Vector3 p_to, uint32_t p_mask, const Vector<RID> &p_exclude) { + Ref<PhysicsRayQueryParameters3D> params; + params.instantiate(); + params->set_from(p_from); + params->set_to(p_to); + params->set_collision_mask(p_mask); + params->set_exclude(p_exclude); + return params; +} + void PhysicsPointQueryParameters3D::set_exclude(const Vector<RID> &p_exclude) { parameters.exclude.clear(); for (int i = 0; i < p_exclude.size(); i++) { diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 86a41d96ef..837073409a 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -816,6 +816,7 @@ protected: static void _bind_methods(); public: + static Ref<PhysicsRayQueryParameters3D> create(Vector3 p_from, Vector3 p_to, uint32_t p_mask, const Vector<RID> &p_exclude); const PhysicsDirectSpaceState3D::RayParameters &get_parameters() const { return parameters; } void set_from(const Vector3 &p_from) { parameters.from = p_from; } diff --git a/servers/rendering/dummy/storage/material_storage.h b/servers/rendering/dummy/storage/material_storage.h index 55c42330cf..e25a2ac3a9 100644 --- a/servers/rendering/dummy/storage/material_storage.h +++ b/servers/rendering/dummy/storage/material_storage.h @@ -66,7 +66,7 @@ public: virtual void shader_set_path_hint(RID p_shader, const String &p_code) override {} virtual String shader_get_code(RID p_shader) const override { return ""; } - virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const override {} + virtual void shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const override {} virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override {} virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const override { return RID(); } @@ -89,7 +89,7 @@ public: virtual bool material_is_animated(RID p_material) override { return false; } virtual bool material_casts_shadows(RID p_material) override { return false; } - virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override {} + virtual void material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) override {} virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override {} }; diff --git a/servers/rendering/renderer_geometry_instance.cpp b/servers/rendering/renderer_geometry_instance.cpp index 3a9bab022c..675659f4c8 100644 --- a/servers/rendering/renderer_geometry_instance.cpp +++ b/servers/rendering/renderer_geometry_instance.cpp @@ -117,8 +117,8 @@ void RenderGeometryInstanceBase::set_use_dynamic_gi(bool p_enable) { _mark_dirty(); } -void RenderGeometryInstanceBase::set_instance_shader_parameters_offset(int32_t p_offset) { - shader_parameters_offset = p_offset; +void RenderGeometryInstanceBase::set_instance_shader_uniforms_offset(int32_t p_offset) { + shader_uniforms_offset = p_offset; _mark_dirty(); } diff --git a/servers/rendering/renderer_geometry_instance.h b/servers/rendering/renderer_geometry_instance.h index 279566d5c9..fecb9878c2 100644 --- a/servers/rendering/renderer_geometry_instance.h +++ b/servers/rendering/renderer_geometry_instance.h @@ -59,7 +59,7 @@ public: virtual void set_use_dynamic_gi(bool p_enable) = 0; virtual void set_use_lightmap(RID p_lightmap_instance, const Rect2 &p_lightmap_uv_scale, int p_lightmap_slice_index) = 0; virtual void set_lightmap_capture(const Color *p_sh9) = 0; - virtual void set_instance_shader_parameters_offset(int32_t p_offset) = 0; + virtual void set_instance_shader_uniforms_offset(int32_t p_offset) = 0; virtual void set_cast_double_sided_shadows(bool p_enable) = 0; virtual Transform3D get_transform() = 0; @@ -104,7 +104,7 @@ public: float parent_fade_alpha = 1.0; float force_alpha = 1.0; - int32_t shader_parameters_offset = -1; + int32_t shader_uniforms_offset = -1; struct Data { //data used less often goes into regular heap @@ -140,7 +140,7 @@ public: virtual void set_transparency(float p_transparency) override; virtual void set_use_baked_light(bool p_enable) override; virtual void set_use_dynamic_gi(bool p_enable) override; - virtual void set_instance_shader_parameters_offset(int32_t p_offset) override; + virtual void set_instance_shader_uniforms_offset(int32_t p_offset) override; virtual void set_cast_double_sided_shadows(bool p_enable) override; virtual Transform3D get_transform() override; diff --git a/servers/rendering/renderer_rd/environment/fog.cpp b/servers/rendering/renderer_rd/environment/fog.cpp index a61d1c4d02..58f4c855a4 100644 --- a/servers/rendering/renderer_rd/environment/fog.cpp +++ b/servers/rendering/renderer_rd/environment/fog.cpp @@ -378,7 +378,7 @@ void Fog::FogShaderData::set_default_texture_param(const StringName &p_name, RID } } -void Fog::FogShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void Fog::FogShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { RBMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/environment/fog.h b/servers/rendering/renderer_rd/environment/fog.h index 7002d6c872..171f9f3b88 100644 --- a/servers/rendering/renderer_rd/environment/fog.h +++ b/servers/rendering/renderer_rd/environment/fog.h @@ -200,7 +200,7 @@ private: virtual void set_path_hint(const String &p_hint); virtual void set_code(const String &p_Code); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; diff --git a/servers/rendering/renderer_rd/environment/sky.cpp b/servers/rendering/renderer_rd/environment/sky.cpp index 147658bea9..6433a39863 100644 --- a/servers/rendering/renderer_rd/environment/sky.cpp +++ b/servers/rendering/renderer_rd/environment/sky.cpp @@ -164,7 +164,7 @@ void SkyRD::SkyShaderData::set_default_texture_param(const StringName &p_name, R } } -void SkyRD::SkyShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void SkyRD::SkyShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/environment/sky.h b/servers/rendering/renderer_rd/environment/sky.h index c5a2e2c298..080165c112 100644 --- a/servers/rendering/renderer_rd/environment/sky.h +++ b/servers/rendering/renderer_rd/environment/sky.h @@ -131,7 +131,7 @@ private: virtual void set_code(const String &p_Code); virtual void set_path_hint(const String &p_hint); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index c3af0868e0..8754e90647 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -1076,7 +1076,7 @@ void RenderForwardClustered::_fill_instance_data(RenderListType p_render_list, i instance_data.flags = inst->flags_cache; instance_data.gi_offset = inst->gi_offset_cache; instance_data.layer_mask = inst->layer_mask; - instance_data.instance_uniforms_ofs = uint32_t(inst->shader_parameters_offset); + instance_data.instance_uniforms_ofs = uint32_t(inst->shader_uniforms_offset); instance_data.lightmap_uv_scale[0] = inst->lightmap_uv_scale.position.x; instance_data.lightmap_uv_scale[1] = inst->lightmap_uv_scale.position.y; instance_data.lightmap_uv_scale[2] = inst->lightmap_uv_scale.size.x; diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index 50ac08b57a..556db086b2 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -392,7 +392,7 @@ void SceneShaderForwardClustered::ShaderData::set_default_texture_param(const St } } -void SceneShaderForwardClustered::ShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void SceneShaderForwardClustered::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h index d4fc70cada..fa9ebde1b2 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h @@ -182,7 +182,7 @@ public: virtual void set_code(const String &p_Code); virtual void set_path_hint(const String &p_path); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index f74ad7617d..ffd47cc163 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -1903,7 +1903,7 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr push_constant.flags = inst->flags_cache; push_constant.gi_offset = inst->gi_offset_cache; push_constant.layer_mask = inst->layer_mask; - push_constant.instance_uniforms_ofs = uint32_t(inst->shader_parameters_offset); + push_constant.instance_uniforms_ofs = uint32_t(inst->shader_uniforms_offset); if (p_params->pass_mode == PASS_MODE_DEPTH_MATERIAL) { // abuse lightmap_uv_scale[0] here, should not be needed here diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index ed5399a3af..01b54607bc 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -349,7 +349,7 @@ void SceneShaderForwardMobile::ShaderData::set_default_texture_param(const Strin } } -void SceneShaderForwardMobile::ShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void SceneShaderForwardMobile::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h index 1bb8a08ccf..e208334547 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h @@ -142,7 +142,7 @@ public: virtual void set_path_hint(const String &p_path); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; diff --git a/servers/rendering/renderer_rd/framebuffer_cache_rd.cpp b/servers/rendering/renderer_rd/framebuffer_cache_rd.cpp new file mode 100644 index 0000000000..9baa86a32d --- /dev/null +++ b/servers/rendering/renderer_rd/framebuffer_cache_rd.cpp @@ -0,0 +1,64 @@ +/*************************************************************************/ +/* framebuffer_cache_rd.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "framebuffer_cache_rd.h" + +FramebufferCacheRD *FramebufferCacheRD::singleton = nullptr; + +void FramebufferCacheRD::_invalidate(Cache *p_cache) { + if (p_cache->prev) { + p_cache->prev->next = p_cache->next; + } else { + // At beginning of table + uint32_t table_idx = p_cache->hash % HASH_TABLE_SIZE; + hash_table[table_idx] = p_cache->next; + } + + if (p_cache->next) { + p_cache->next->prev = p_cache->prev; + } + + cache_allocator.free(p_cache); + cache_instances_used--; +} +void FramebufferCacheRD::_framebuffer_invalidation_callback(void *p_userdata) { + singleton->_invalidate(reinterpret_cast<Cache *>(p_userdata)); +} + +FramebufferCacheRD::FramebufferCacheRD() { + ERR_FAIL_COND(singleton != nullptr); + singleton = this; +} + +FramebufferCacheRD::~FramebufferCacheRD() { + if (cache_instances_used > 0) { + ERR_PRINT("At exit: " + itos(cache_instances_used) + " framebuffer cache instance(s) still in use."); + } +} diff --git a/servers/rendering/renderer_rd/framebuffer_cache_rd.h b/servers/rendering/renderer_rd/framebuffer_cache_rd.h new file mode 100644 index 0000000000..f360e0fc6b --- /dev/null +++ b/servers/rendering/renderer_rd/framebuffer_cache_rd.h @@ -0,0 +1,310 @@ +/*************************************************************************/ +/* framebuffer_cache_rd.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef FRAMEBUFFER_CACHE_RD_H +#define FRAMEBUFFER_CACHE_RD_H + +#include "core/templates/local_vector.h" +#include "core/templates/paged_allocator.h" +#include "servers/rendering/rendering_device.h" + +class FramebufferCacheRD : public Object { + GDCLASS(FramebufferCacheRD, Object) + + struct Cache { + Cache *prev = nullptr; + Cache *next = nullptr; + uint32_t hash = 0; + RID cache; + LocalVector<RID> textures; + LocalVector<RD::FramebufferPass> passes; + uint32_t views = 0; + }; + + PagedAllocator<Cache> cache_allocator; + + enum { + HASH_TABLE_SIZE = 16381 // Prime + }; + + Cache *hash_table[HASH_TABLE_SIZE] = {}; + + static _FORCE_INLINE_ uint32_t _hash_pass(const RD::FramebufferPass &p, uint32_t h) { + h = hash_murmur3_one_32(p.depth_attachment, h); + h = hash_murmur3_one_32(p.vrs_attachment, h); + + h = hash_murmur3_one_32(p.color_attachments.size(), h); + for (int i = 0; i < p.color_attachments.size(); i++) { + h = hash_murmur3_one_32(p.color_attachments[i], h); + } + + h = hash_murmur3_one_32(p.resolve_attachments.size(), h); + for (int i = 0; i < p.resolve_attachments.size(); i++) { + h = hash_murmur3_one_32(p.resolve_attachments[i], h); + } + + h = hash_murmur3_one_32(p.preserve_attachments.size(), h); + for (int i = 0; i < p.preserve_attachments.size(); i++) { + h = hash_murmur3_one_32(p.preserve_attachments[i], h); + } + + return h; + } + + static _FORCE_INLINE_ bool _compare_pass(const RD::FramebufferPass &a, const RD::FramebufferPass &b) { + if (a.depth_attachment != b.depth_attachment) { + return false; + } + + if (a.vrs_attachment != b.vrs_attachment) { + return false; + } + + if (a.color_attachments.size() != b.color_attachments.size()) { + return false; + } + + for (int i = 0; i < a.color_attachments.size(); i++) { + if (a.color_attachments[i] != b.color_attachments[i]) { + return false; + } + } + + if (a.resolve_attachments.size() != b.resolve_attachments.size()) { + return false; + } + + for (int i = 0; i < a.resolve_attachments.size(); i++) { + if (a.resolve_attachments[i] != b.resolve_attachments[i]) { + return false; + } + } + + if (a.preserve_attachments.size() != b.preserve_attachments.size()) { + return false; + } + + for (int i = 0; i < a.preserve_attachments.size(); i++) { + if (a.preserve_attachments[i] != b.preserve_attachments[i]) { + return false; + } + } + + return true; + } + + _FORCE_INLINE_ uint32_t _hash_rids(uint32_t h, const RID &arg) { + return hash_murmur3_one_64(arg.get_id(), h); + } + + template <typename... Args> + uint32_t _hash_rids(uint32_t h, const RID &arg, Args... args) { + h = hash_murmur3_one_64(arg.get_id(), h); + return _hash_rids(h, args...); + } + + _FORCE_INLINE_ bool _compare_args(uint32_t idx, const LocalVector<RID> &textures, const RID &arg) { + return textures[idx] == arg; + } + + template <typename... Args> + _FORCE_INLINE_ bool _compare_args(uint32_t idx, const LocalVector<RID> &textures, const RID &arg, Args... args) { + if (textures[idx] != arg) { + return false; + } + return _compare_args(idx + 1, textures, args...); + } + + _FORCE_INLINE_ void _create_args(Vector<RID> &textures, const RID &arg) { + textures.push_back(arg); + } + + template <typename... Args> + _FORCE_INLINE_ void _create_args(Vector<RID> &textures, const RID &arg, Args... args) { + textures.push_back(arg); + _create_args(textures, args...); + } + + static FramebufferCacheRD *singleton; + + uint32_t cache_instances_used = 0; + + void _invalidate(Cache *p_cache); + static void _framebuffer_invalidation_callback(void *p_userdata); + + RID _allocate_from_data(uint32_t p_views, uint32_t p_hash, uint32_t p_table_idx, const Vector<RID> &p_textures, const Vector<RD::FramebufferPass> &p_passes) { + RID rid; + if (p_passes.size()) { + rid = RD::get_singleton()->framebuffer_create_multipass(p_textures, p_passes, RD::INVALID_ID, p_views); + } else { + rid = RD::get_singleton()->framebuffer_create(p_textures, RD::INVALID_ID, p_views); + } + + ERR_FAIL_COND_V(rid.is_null(), rid); + + Cache *c = cache_allocator.alloc(); + c->views = p_views; + c->cache = rid; + c->hash = p_hash; + c->textures.resize(p_textures.size()); + for (uint32_t i = 0; i < c->textures.size(); i++) { + c->textures[i] = p_textures[i]; + } + c->passes.resize(p_passes.size()); + for (uint32_t i = 0; i < c->passes.size(); i++) { + c->passes[i] = p_passes[i]; + } + c->prev = nullptr; + c->next = hash_table[p_table_idx]; + if (hash_table[p_table_idx]) { + hash_table[p_table_idx]->prev = c; + } + hash_table[p_table_idx] = c; + + RD::get_singleton()->framebuffer_set_invalidation_callback(rid, _framebuffer_invalidation_callback, c); + + cache_instances_used++; + + return rid; + } + +public: + template <typename... Args> + RID get_cache(Args... args) { + uint32_t h = hash_murmur3_one_32(1); //1 view + h = hash_murmur3_one_32(sizeof...(Args), h); + h = _hash_args(h, args...); + h = hash_murmur3_one_32(0, h); // 0 passes + h = hash_fmix32(h); + + uint32_t table_idx = h % HASH_TABLE_SIZE; + { + const Cache *c = hash_table[table_idx]; + + while (c) { + if (c->hash == h && c->passes.size() == 0 && c->textures.size() == sizeof...(Args) && c->views == 1 && _compare_args(0, c->textures, args...)) { + return c->cache; + } + c = c->next; + } + } + + // Not in cache, create: + + Vector<RID> textures; + _create_args(textures, args...); + + return _allocate_from_data(1, h, table_idx, textures, Vector<RD::FramebufferPass>()); + } + + template <typename... Args> + RID get_cache_multiview(uint32_t p_views, Args... args) { + uint32_t h = hash_murmur3_one_32(p_views); + h = hash_murmur3_one_32(sizeof...(Args), h); + h = _hash_args(h, args...); + h = hash_murmur3_one_32(0, h); // 0 passes + h = hash_fmix32(h); + + uint32_t table_idx = h % HASH_TABLE_SIZE; + { + const Cache *c = hash_table[table_idx]; + + while (c) { + if (c->hash == h && c->passes.size() == 0 && c->textures.size() == sizeof...(Args) && c->views == p_views && _compare_args(0, c->textures, args...)) { + return c->cache; + } + c = c->next; + } + } + + // Not in cache, create: + + Vector<RID> textures; + _create_args(textures, args...); + + return _allocate_from_data(p_views, h, table_idx, textures, Vector<RD::FramebufferPass>()); + } + + RID get_cache_multipass(const Vector<RID> &p_textures, const Vector<RD::FramebufferPass> &p_passes, uint32_t p_views = 1) { + uint32_t h = hash_murmur3_one_32(p_views); + h = hash_murmur3_one_32(p_textures.size()); + for (int i = 0; i < p_textures.size(); i++) { + h = hash_murmur3_one_64(p_textures[i].get_id(), h); + } + h = hash_murmur3_one_32(p_passes.size()); + for (int i = 0; i < p_passes.size(); i++) { + h = _hash_pass(p_passes[i], h); + } + + h = hash_fmix32(h); + + uint32_t table_idx = h % HASH_TABLE_SIZE; + { + const Cache *c = hash_table[table_idx]; + + while (c) { + if (c->hash == h && c->views == p_views && c->textures.size() == (uint32_t)p_textures.size() && c->passes.size() == (uint32_t)p_passes.size()) { + bool all_ok = true; + + for (int i = 0; i < p_textures.size(); i++) { + if (p_textures[i] != c->textures[i]) { + all_ok = false; + break; + } + } + + if (all_ok) { + for (int i = 0; i < p_passes.size(); i++) { + if (!_compare_pass(p_passes[i], c->passes[i])) { + all_ok = false; + break; + } + } + } + + if (all_ok) { + return c->cache; + } + } + c = c->next; + } + } + + // Not in cache, create: + return _allocate_from_data(p_views, h, table_idx, p_textures, p_passes); + } + + static FramebufferCacheRD *get_singleton() { return singleton; } + + FramebufferCacheRD(); + ~FramebufferCacheRD(); +}; + +#endif // FRAMEBUFFER_CACHE_RD_H diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index 27399298b3..c1b08ee4c9 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -2171,7 +2171,7 @@ void RendererCanvasRenderRD::CanvasShaderData::set_default_texture_param(const S } } -void RendererCanvasRenderRD::CanvasShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void RendererCanvasRenderRD::CanvasShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h index f96d4686ff..5eb4cee4c6 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h @@ -180,7 +180,7 @@ class RendererCanvasRenderRD : public RendererCanvasRender { virtual void set_code(const String &p_Code); virtual void set_path_hint(const String &p_path); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index a61172c8f5..967b725b9e 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -249,6 +249,7 @@ RendererCompositorRD *RendererCompositorRD::singleton = nullptr; RendererCompositorRD::RendererCompositorRD() { uniform_set_cache = memnew(UniformSetCacheRD); + framebuffer_cache = memnew(FramebufferCacheRD); { String shader_cache_dir = Engine::get_singleton()->get_shader_cache_path(); @@ -316,5 +317,6 @@ RendererCompositorRD::RendererCompositorRD() { RendererCompositorRD::~RendererCompositorRD() { memdelete(uniform_set_cache); + memdelete(framebuffer_cache); ShaderRD::set_shader_cache_dir(String()); } diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.h b/servers/rendering/renderer_rd/renderer_compositor_rd.h index 564c26bfe4..a28335f800 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.h +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.h @@ -37,6 +37,7 @@ #include "servers/rendering/renderer_rd/environment/fog.h" #include "servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h" #include "servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h" +#include "servers/rendering/renderer_rd/framebuffer_cache_rd.h" #include "servers/rendering/renderer_rd/renderer_canvas_render_rd.h" #include "servers/rendering/renderer_rd/shaders/blit.glsl.gen.h" #include "servers/rendering/renderer_rd/storage_rd/light_storage.h" @@ -50,6 +51,7 @@ class RendererCompositorRD : public RendererCompositor { protected: UniformSetCacheRD *uniform_set_cache = nullptr; + FramebufferCacheRD *framebuffer_cache = nullptr; RendererCanvasRenderRD *canvas = nullptr; RendererRD::Utilities *utilities = nullptr; RendererRD::LightStorage *light_storage = nullptr; diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index 88ce6c261c..41dd1ccc40 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -2406,11 +2406,11 @@ String MaterialStorage::shader_get_code(RID p_shader) const { return shader->code; } -void MaterialStorage::shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const { +void MaterialStorage::shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const { Shader *shader = shader_owner.get_or_null(p_shader); ERR_FAIL_COND(!shader); if (shader->data) { - return shader->data->get_param_list(p_param_list); + return shader->data->get_shader_uniform_list(p_param_list); } } @@ -2672,14 +2672,14 @@ bool MaterialStorage::material_casts_shadows(RID p_material) { return true; //by default everything casts shadows } -void MaterialStorage::material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) { +void MaterialStorage::material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) { Material *material = material_owner.get_or_null(p_material); ERR_FAIL_COND(!material); if (material->shader && material->shader->data) { material->shader->data->get_instance_param_list(r_parameters); if (material->next_pass.is_valid()) { - material_get_instance_shader_parameters(material->next_pass, r_parameters); + material_get_instance_shader_uniforms(material->next_pass, r_parameters); } } } diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.h b/servers/rendering/renderer_rd/storage_rd/material_storage.h index cb98a78bf8..dbf7a92e23 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.h @@ -57,7 +57,7 @@ public: virtual void set_code(const String &p_Code) = 0; virtual void set_path_hint(const String &p_hint) = 0; virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index) = 0; - virtual void get_param_list(List<PropertyInfo> *p_param_list) const = 0; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const = 0; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const = 0; virtual bool is_param_texture(const StringName &p_param) const = 0; @@ -362,7 +362,7 @@ public: virtual void shader_set_code(RID p_shader, const String &p_code) override; virtual void shader_set_path_hint(RID p_shader, const String &p_path) override; virtual String shader_get_code(RID p_shader) const override; - virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const override; + virtual void shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const override; virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override; virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const override; @@ -394,7 +394,7 @@ public: virtual bool material_is_animated(RID p_material) override; virtual bool material_casts_shadows(RID p_material) override; - virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override; + virtual void material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) override; virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override; diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp index 3ca648b0d0..ba644e7eb9 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp @@ -1603,7 +1603,7 @@ void ParticlesStorage::ParticlesShaderData::set_default_texture_param(const Stri } } -void ParticlesStorage::ParticlesShaderData::get_param_list(List<PropertyInfo> *p_param_list) const { +void ParticlesStorage::ParticlesShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { HashMap<int, StringName> order; for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.h b/servers/rendering/renderer_rd/storage_rd/particles_storage.h index 8a69ee45f9..97d100e2da 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.h @@ -337,7 +337,7 @@ private: virtual void set_code(const String &p_Code); virtual void set_path_hint(const String &p_hint); virtual void set_default_texture_param(const StringName &p_name, RID p_texture, int p_index); - virtual void get_param_list(List<PropertyInfo> *p_param_list) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; virtual bool is_param_texture(const StringName &p_param) const; virtual bool is_animated() const; diff --git a/servers/rendering/renderer_rd/storage_rd/utilities.cpp b/servers/rendering/renderer_rd/storage_rd/utilities.cpp index 5a91046628..ae1f22be3b 100644 --- a/servers/rendering/renderer_rd/storage_rd/utilities.cpp +++ b/servers/rendering/renderer_rd/storage_rd/utilities.cpp @@ -290,9 +290,14 @@ bool Utilities::has_os_feature(const String &p_feature) const { return true; } +#if !defined(ANDROID_ENABLED) && !defined(IPHONE_ENABLED) + // Some Android devices report support for S3TC but we don't expect that and don't export the textures. + // This could be fixed but so few devices support it that it doesn't seem useful (and makes bigger APKs). + // For good measure we do the same hack for iOS, just in case. if (p_feature == "s3tc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC1_RGB_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) { return true; } +#endif if (p_feature == "bptc" && RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_BC7_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT)) { return true; diff --git a/servers/rendering/renderer_rd/uniform_set_cache_rd.h b/servers/rendering/renderer_rd/uniform_set_cache_rd.h index abf110730b..bca8b02178 100644 --- a/servers/rendering/renderer_rd/uniform_set_cache_rd.h +++ b/servers/rendering/renderer_rd/uniform_set_cache_rd.h @@ -163,7 +163,7 @@ public: const Cache *c = hash_table[table_idx]; while (c) { - if (c->hash == h && c->set == p_set && c->shader == p_shader && _compare_args(0, c->uniforms, args...)) { + if (c->hash == h && c->set == p_set && c->shader == p_shader && sizeof...(Args) == c->uniforms.size() && _compare_args(0, c->uniforms, args...)) { return c->cache; } c = c->next; @@ -193,7 +193,7 @@ public: const Cache *c = hash_table[table_idx]; while (c) { - if (c->hash == h && c->set == p_set && c->shader == p_shader) { + if (c->hash == h && c->set == p_set && c->shader == p_shader && (uint32_t)p_uniforms.size() == c->uniforms.size()) { bool all_ok = true; for (int i = 0; i < p_uniforms.size(); i++) { if (!_compare_uniform(p_uniforms[i], c->uniforms[i])) { diff --git a/servers/rendering/renderer_scene.h b/servers/rendering/renderer_scene.h index 852fe89cd0..ba6fb71e67 100644 --- a/servers/rendering/renderer_scene.h +++ b/servers/rendering/renderer_scene.h @@ -100,10 +100,10 @@ public: virtual void instance_geometry_set_visibility_range(RID p_instance, float p_min, float p_max, float p_min_margin, float p_max_margin, RS::VisibilityRangeFadeMode p_fade_mode) = 0; virtual void instance_geometry_set_lightmap(RID p_instance, RID p_lightmap, const Rect2 &p_lightmap_uv_scale, int p_slice_index) = 0; virtual void instance_geometry_set_lod_bias(RID p_instance, float p_lod_bias) = 0; - virtual void instance_geometry_set_shader_parameter(RID p_instance, const StringName &p_parameter, const Variant &p_value) = 0; - virtual void instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const = 0; - virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const = 0; - virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const = 0; + virtual void instance_geometry_set_shader_uniform(RID p_instance, const StringName &p_parameter, const Variant &p_value) = 0; + virtual void instance_geometry_get_shader_uniform_list(RID p_instance, List<PropertyInfo> *p_parameters) const = 0; + virtual Variant instance_geometry_get_shader_uniform(RID p_instance, const StringName &p_parameter) const = 0; + virtual Variant instance_geometry_get_shader_uniform_default_value(RID p_instance, const StringName &p_parameter) const = 0; virtual void directional_shadow_atlas_set_size(int p_size, bool p_16_bits = true) = 0; diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp index 368bbb63f5..0b20bb372a 100644 --- a/servers/rendering/renderer_scene_cull.cpp +++ b/servers/rendering/renderer_scene_cull.cpp @@ -1423,62 +1423,62 @@ void RendererSceneCull::instance_geometry_set_lod_bias(RID p_instance, float p_l } } -void RendererSceneCull::instance_geometry_set_shader_parameter(RID p_instance, const StringName &p_parameter, const Variant &p_value) { +void RendererSceneCull::instance_geometry_set_shader_uniform(RID p_instance, const StringName &p_parameter, const Variant &p_value) { Instance *instance = instance_owner.get_or_null(p_instance); ERR_FAIL_COND(!instance); ERR_FAIL_COND(p_value.get_type() == Variant::OBJECT); - HashMap<StringName, Instance::InstanceShaderParameter>::Iterator E = instance->instance_shader_parameters.find(p_parameter); + HashMap<StringName, Instance::InstanceShaderParameter>::Iterator E = instance->instance_shader_uniforms.find(p_parameter); if (!E) { Instance::InstanceShaderParameter isp; isp.index = -1; isp.info = PropertyInfo(); isp.value = p_value; - instance->instance_shader_parameters[p_parameter] = isp; + instance->instance_shader_uniforms[p_parameter] = isp; } else { E->value.value = p_value; - if (E->value.index >= 0 && instance->instance_allocated_shader_parameters) { + if (E->value.index >= 0 && instance->instance_allocated_shader_uniforms) { //update directly RSG::material_storage->global_shader_uniforms_instance_update(p_instance, E->value.index, p_value); } } } -Variant RendererSceneCull::instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const { +Variant RendererSceneCull::instance_geometry_get_shader_uniform(RID p_instance, const StringName &p_parameter) const { const Instance *instance = const_cast<RendererSceneCull *>(this)->instance_owner.get_or_null(p_instance); ERR_FAIL_COND_V(!instance, Variant()); - if (instance->instance_shader_parameters.has(p_parameter)) { - return instance->instance_shader_parameters[p_parameter].value; + if (instance->instance_shader_uniforms.has(p_parameter)) { + return instance->instance_shader_uniforms[p_parameter].value; } return Variant(); } -Variant RendererSceneCull::instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const { +Variant RendererSceneCull::instance_geometry_get_shader_uniform_default_value(RID p_instance, const StringName &p_parameter) const { const Instance *instance = const_cast<RendererSceneCull *>(this)->instance_owner.get_or_null(p_instance); ERR_FAIL_COND_V(!instance, Variant()); - if (instance->instance_shader_parameters.has(p_parameter)) { - return instance->instance_shader_parameters[p_parameter].default_value; + if (instance->instance_shader_uniforms.has(p_parameter)) { + return instance->instance_shader_uniforms[p_parameter].default_value; } return Variant(); } -void RendererSceneCull::instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const { +void RendererSceneCull::instance_geometry_get_shader_uniform_list(RID p_instance, List<PropertyInfo> *p_parameters) const { const Instance *instance = const_cast<RendererSceneCull *>(this)->instance_owner.get_or_null(p_instance); ERR_FAIL_COND(!instance); const_cast<RendererSceneCull *>(this)->update_dirty_instances(); Vector<StringName> names; - for (const KeyValue<StringName, Instance::InstanceShaderParameter> &E : instance->instance_shader_parameters) { + for (const KeyValue<StringName, Instance::InstanceShaderParameter> &E : instance->instance_shader_uniforms) { names.push_back(E.key); } names.sort_custom<StringName::AlphCompare>(); for (int i = 0; i < names.size(); i++) { - PropertyInfo pinfo = instance->instance_shader_parameters[names[i]].info; + PropertyInfo pinfo = instance->instance_shader_uniforms[names[i]].info; p_parameters->push_back(pinfo); } } @@ -3642,9 +3642,9 @@ void RendererSceneCull::render_particle_colliders() { } } -void RendererSceneCull::_update_instance_shader_parameters_from_material(HashMap<StringName, Instance::InstanceShaderParameter> &isparams, const HashMap<StringName, Instance::InstanceShaderParameter> &existing_isparams, RID p_material) { +void RendererSceneCull::_update_instance_shader_uniforms_from_material(HashMap<StringName, Instance::InstanceShaderParameter> &isparams, const HashMap<StringName, Instance::InstanceShaderParameter> &existing_isparams, RID p_material) { List<RendererMaterialStorage::InstanceShaderParam> plist; - RSG::material_storage->material_get_instance_shader_parameters(p_material, &plist); + RSG::material_storage->material_get_instance_shader_uniforms(p_material, &plist); for (const RendererMaterialStorage::InstanceShaderParam &E : plist) { StringName name = E.info.name; if (isparams.has(name)) { @@ -3724,7 +3724,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { can_cast_shadows = false; } is_animated = RSG::material_storage->material_is_animated(p_instance->material_override); - _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, p_instance->material_override); + _update_instance_shader_uniforms_from_material(isparams, p_instance->instance_shader_uniforms, p_instance->material_override); } else { if (p_instance->base_type == RS::INSTANCE_MESH) { RID mesh = p_instance->base; @@ -3746,7 +3746,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { is_animated = true; } - _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + _update_instance_shader_uniforms_from_material(isparams, p_instance->instance_shader_uniforms, mat); RSG::material_storage->material_update_dependency(mat, &p_instance->dependency_tracker); } @@ -3777,7 +3777,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { is_animated = true; } - _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + _update_instance_shader_uniforms_from_material(isparams, p_instance->instance_shader_uniforms, mat); RSG::material_storage->material_update_dependency(mat, &p_instance->dependency_tracker); } @@ -3815,7 +3815,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { is_animated = true; } - _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, mat); + _update_instance_shader_uniforms_from_material(isparams, p_instance->instance_shader_uniforms, mat); RSG::material_storage->material_update_dependency(mat, &p_instance->dependency_tracker); } @@ -3831,7 +3831,7 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { if (p_instance->material_overlay.is_valid()) { can_cast_shadows = can_cast_shadows || RSG::material_storage->material_casts_shadows(p_instance->material_overlay); is_animated = is_animated || RSG::material_storage->material_is_animated(p_instance->material_overlay); - _update_instance_shader_parameters_from_material(isparams, p_instance->instance_shader_parameters, p_instance->material_overlay); + _update_instance_shader_uniforms_from_material(isparams, p_instance->instance_shader_uniforms, p_instance->material_overlay); } if (can_cast_shadows != geom->can_cast_shadows) { @@ -3845,23 +3845,23 @@ void RendererSceneCull::_update_dirty_instance(Instance *p_instance) { } geom->material_is_animated = is_animated; - p_instance->instance_shader_parameters = isparams; + p_instance->instance_shader_uniforms = isparams; - if (p_instance->instance_allocated_shader_parameters != (p_instance->instance_shader_parameters.size() > 0)) { - p_instance->instance_allocated_shader_parameters = (p_instance->instance_shader_parameters.size() > 0); - if (p_instance->instance_allocated_shader_parameters) { - p_instance->instance_allocated_shader_parameters_offset = RSG::material_storage->global_shader_uniforms_instance_allocate(p_instance->self); - geom->geometry_instance->set_instance_shader_parameters_offset(p_instance->instance_allocated_shader_parameters_offset); + if (p_instance->instance_allocated_shader_uniforms != (p_instance->instance_shader_uniforms.size() > 0)) { + p_instance->instance_allocated_shader_uniforms = (p_instance->instance_shader_uniforms.size() > 0); + if (p_instance->instance_allocated_shader_uniforms) { + p_instance->instance_allocated_shader_uniforms_offset = RSG::material_storage->global_shader_uniforms_instance_allocate(p_instance->self); + geom->geometry_instance->set_instance_shader_uniforms_offset(p_instance->instance_allocated_shader_uniforms_offset); - for (const KeyValue<StringName, Instance::InstanceShaderParameter> &E : p_instance->instance_shader_parameters) { + for (const KeyValue<StringName, Instance::InstanceShaderParameter> &E : p_instance->instance_shader_uniforms) { if (E.value.value.get_type() != Variant::NIL) { RSG::material_storage->global_shader_uniforms_instance_update(p_instance->self, E.value.index, E.value.value); } } } else { RSG::material_storage->global_shader_uniforms_instance_free(p_instance->self); - p_instance->instance_allocated_shader_parameters_offset = -1; - geom->geometry_instance->set_instance_shader_parameters_offset(-1); + p_instance->instance_allocated_shader_uniforms_offset = -1; + geom->geometry_instance->set_instance_shader_uniforms_offset(-1); } } } @@ -3953,7 +3953,7 @@ bool RendererSceneCull::free(RID p_rid) { instance_geometry_set_material_overlay(p_rid, RID()); instance_attach_skeleton(p_rid, RID()); - if (instance->instance_allocated_shader_parameters) { + if (instance->instance_allocated_shader_uniforms) { //free the used shader parameters RSG::material_storage->global_shader_uniforms_instance_free(instance->self); } diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index 3a2b0a0fdf..540fb0e27a 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -426,9 +426,9 @@ public: PropertyInfo info; }; - HashMap<StringName, InstanceShaderParameter> instance_shader_parameters; - bool instance_allocated_shader_parameters = false; - int32_t instance_allocated_shader_parameters_offset = -1; + HashMap<StringName, InstanceShaderParameter> instance_shader_uniforms; + bool instance_allocated_shader_uniforms = false; + int32_t instance_allocated_shader_uniforms_offset = -1; // @@ -967,12 +967,12 @@ public: virtual void instance_geometry_set_lightmap(RID p_instance, RID p_lightmap, const Rect2 &p_lightmap_uv_scale, int p_slice_index); virtual void instance_geometry_set_lod_bias(RID p_instance, float p_lod_bias); - void _update_instance_shader_parameters_from_material(HashMap<StringName, Instance::InstanceShaderParameter> &isparams, const HashMap<StringName, Instance::InstanceShaderParameter> &existing_isparams, RID p_material); + void _update_instance_shader_uniforms_from_material(HashMap<StringName, Instance::InstanceShaderParameter> &isparams, const HashMap<StringName, Instance::InstanceShaderParameter> &existing_isparams, RID p_material); - virtual void instance_geometry_set_shader_parameter(RID p_instance, const StringName &p_parameter, const Variant &p_value); - virtual void instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const; - virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &p_parameter) const; - virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &p_parameter) const; + virtual void instance_geometry_set_shader_uniform(RID p_instance, const StringName &p_parameter, const Variant &p_value); + virtual void instance_geometry_get_shader_uniform_list(RID p_instance, List<PropertyInfo> *p_parameters) const; + virtual Variant instance_geometry_get_shader_uniform(RID p_instance, const StringName &p_parameter) const; + virtual Variant instance_geometry_get_shader_uniform_default_value(RID p_instance, const StringName &p_parameter) const; _FORCE_INLINE_ void _update_instance(Instance *p_instance); _FORCE_INLINE_ void _update_instance_aabb(Instance *p_instance); diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 0b76bb3051..c07a783302 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -387,6 +387,7 @@ void RenderingDevice::_bind_methods() { ClassDB::bind_method(D_METHOD("framebuffer_create_multipass", "textures", "passes", "validate_with_format", "view_count"), &RenderingDevice::_framebuffer_create_multipass, DEFVAL(INVALID_FORMAT_ID), DEFVAL(1)); ClassDB::bind_method(D_METHOD("framebuffer_create_empty", "size", "samples", "validate_with_format"), &RenderingDevice::framebuffer_create_empty, DEFVAL(TEXTURE_SAMPLES_1), DEFVAL(INVALID_FORMAT_ID)); ClassDB::bind_method(D_METHOD("framebuffer_get_format", "framebuffer"), &RenderingDevice::framebuffer_get_format); + ClassDB::bind_method(D_METHOD("framebuffer_is_valid", "framebuffer"), &RenderingDevice::framebuffer_is_valid); ClassDB::bind_method(D_METHOD("sampler_create", "state"), &RenderingDevice::_sampler_create); diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 03aa6f7644..a864cfa74c 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -129,6 +129,8 @@ public: typedef Vector<uint8_t> (*ShaderCompileToSPIRVFunction)(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language, String *r_error, const RenderingDevice *p_render_device); typedef Vector<uint8_t> (*ShaderCacheFunction)(ShaderStage p_stage, const String &p_source_code, ShaderLanguage p_language); + typedef void (*InvalidationCallback)(void *); + private: static ShaderCompileToSPIRVFunction compile_to_spirv_function; static ShaderCacheFunction cache_function; @@ -547,13 +549,15 @@ public: int32_t vrs_attachment = ATTACHMENT_UNUSED; // density map for VRS, only used if supported }; - virtual FramebufferFormatID framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, Vector<FramebufferPass> &p_passes, uint32_t p_view_count = 1) = 0; + virtual FramebufferFormatID framebuffer_format_create_multipass(const Vector<AttachmentFormat> &p_attachments, const Vector<FramebufferPass> &p_passes, uint32_t p_view_count = 1) = 0; virtual FramebufferFormatID framebuffer_format_create_empty(TextureSamples p_samples = TEXTURE_SAMPLES_1) = 0; virtual TextureSamples framebuffer_format_get_texture_samples(FramebufferFormatID p_format, uint32_t p_pass = 0) = 0; virtual RID framebuffer_create(const Vector<RID> &p_texture_attachments, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1) = 0; - virtual RID framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1) = 0; + virtual RID framebuffer_create_multipass(const Vector<RID> &p_texture_attachments, const Vector<FramebufferPass> &p_passes, FramebufferFormatID p_format_check = INVALID_ID, uint32_t p_view_count = 1) = 0; virtual RID framebuffer_create_empty(const Size2i &p_size, TextureSamples p_samples = TEXTURE_SAMPLES_1, FramebufferFormatID p_format_check = INVALID_ID) = 0; + virtual bool framebuffer_is_valid(RID p_framebuffer) const = 0; + virtual void framebuffer_set_invalidation_callback(RID p_framebuffer, InvalidationCallback p_callback, void *p_userdata) = 0; virtual FramebufferFormatID framebuffer_get_format(RID p_framebuffer) = 0; @@ -793,8 +797,7 @@ public: virtual RID uniform_set_create(const Vector<Uniform> &p_uniforms, RID p_shader, uint32_t p_shader_set) = 0; virtual bool uniform_set_is_valid(RID p_uniform_set) = 0; - typedef void (*UniformSetInvalidatedCallback)(void *); - virtual void uniform_set_set_invalidation_callback(RID p_uniform_set, UniformSetInvalidatedCallback p_callback, void *p_userdata) = 0; + virtual void uniform_set_set_invalidation_callback(RID p_uniform_set, InvalidationCallback p_callback, void *p_userdata) = 0; virtual Error buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const void *p_data, uint32_t p_post_barrier = BARRIER_MASK_ALL) = 0; virtual Error buffer_clear(RID p_buffer, uint32_t p_offset, uint32_t p_size, uint32_t p_post_barrier = BARRIER_MASK_ALL) = 0; diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index 21a94b88f2..cc79d09503 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -227,7 +227,7 @@ public: FUNC2(shader_set_path_hint, RID, const String &) FUNC1RC(String, shader_get_code, RID) - FUNC2SC(shader_get_param_list, RID, List<PropertyInfo> *) + FUNC2SC(shader_get_shader_uniform_list, RID, List<PropertyInfo> *) FUNC4(shader_set_default_texture_param, RID, const StringName &, RID, int) FUNC3RC(RID, shader_get_default_texture_param, RID, const StringName &, int) @@ -773,10 +773,10 @@ public: FUNC4(instance_geometry_set_lightmap, RID, RID, const Rect2 &, int) FUNC2(instance_geometry_set_lod_bias, RID, float) FUNC2(instance_geometry_set_transparency, RID, float) - FUNC3(instance_geometry_set_shader_parameter, RID, const StringName &, const Variant &) - FUNC2RC(Variant, instance_geometry_get_shader_parameter, RID, const StringName &) - FUNC2RC(Variant, instance_geometry_get_shader_parameter_default_value, RID, const StringName &) - FUNC2C(instance_geometry_get_shader_parameter_list, RID, List<PropertyInfo> *) + FUNC3(instance_geometry_set_shader_uniform, RID, const StringName &, const Variant &) + FUNC2RC(Variant, instance_geometry_get_shader_uniform, RID, const StringName &) + FUNC2RC(Variant, instance_geometry_get_shader_uniform_default_value, RID, const StringName &) + FUNC2C(instance_geometry_get_shader_uniform_list, RID, List<PropertyInfo> *) FUNC3R(TypedArray<Image>, bake_render_uv2, RID, const Vector<RID> &, const Size2i &) diff --git a/servers/rendering/storage/material_storage.h b/servers/rendering/storage/material_storage.h index 6347b22240..ad8e3e79bf 100644 --- a/servers/rendering/storage/material_storage.h +++ b/servers/rendering/storage/material_storage.h @@ -63,7 +63,7 @@ public: virtual void shader_set_code(RID p_shader, const String &p_code) = 0; virtual void shader_set_path_hint(RID p_shader, const String &p_path) = 0; virtual String shader_get_code(RID p_shader) const = 0; - virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0; + virtual void shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0; virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index) = 0; virtual RID shader_get_default_texture_param(RID p_shader, const StringName &p_name, int p_index) const = 0; @@ -94,7 +94,7 @@ public: Variant default_value; }; - virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) = 0; + virtual void material_get_instance_shader_uniforms(RID p_material, List<InstanceShaderParam> *r_parameters) = 0; virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) = 0; }; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index e02d82fbc3..1ac9b5854d 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -1500,9 +1500,9 @@ TypedArray<Image> RenderingServer::_texture_3d_get(RID p_texture) const { return ret; } -TypedArray<Dictionary> RenderingServer::_shader_get_param_list(RID p_shader) const { +TypedArray<Dictionary> RenderingServer::_shader_get_shader_uniform_list(RID p_shader) const { List<PropertyInfo> l; - shader_get_param_list(p_shader, &l); + shader_get_shader_uniform_list(p_shader, &l); return convert_property_list(&l); } @@ -1625,9 +1625,9 @@ Dictionary RenderingServer::_mesh_get_surface(RID p_mesh, int p_idx) { return d; } -Array RenderingServer::_instance_geometry_get_shader_parameter_list(RID p_instance) const { +Array RenderingServer::_instance_geometry_get_shader_uniform_list(RID p_instance) const { List<PropertyInfo> params; - instance_geometry_get_shader_parameter_list(p_instance, ¶ms); + instance_geometry_get_shader_uniform_list(p_instance, ¶ms); return convert_property_list(¶ms); } @@ -1701,7 +1701,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("shader_set_code", "shader", "code"), &RenderingServer::shader_set_code); ClassDB::bind_method(D_METHOD("shader_set_path_hint", "shader", "path"), &RenderingServer::shader_set_path_hint); ClassDB::bind_method(D_METHOD("shader_get_code", "shader"), &RenderingServer::shader_get_code); - ClassDB::bind_method(D_METHOD("shader_get_param_list", "shader"), &RenderingServer::_shader_get_param_list); + ClassDB::bind_method(D_METHOD("shader_get_shader_uniform_list", "shader"), &RenderingServer::_shader_get_shader_uniform_list); ClassDB::bind_method(D_METHOD("shader_get_param_default", "shader", "param"), &RenderingServer::shader_get_param_default); ClassDB::bind_method(D_METHOD("shader_set_default_texture_param", "shader", "param", "texture", "index"), &RenderingServer::shader_set_default_texture_param, DEFVAL(0)); @@ -2484,10 +2484,10 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("instance_geometry_set_lightmap", "instance", "lightmap", "lightmap_uv_scale", "lightmap_slice"), &RenderingServer::instance_geometry_set_lightmap); ClassDB::bind_method(D_METHOD("instance_geometry_set_lod_bias", "instance", "lod_bias"), &RenderingServer::instance_geometry_set_lod_bias); - ClassDB::bind_method(D_METHOD("instance_geometry_set_shader_parameter", "instance", "parameter", "value"), &RenderingServer::instance_geometry_set_shader_parameter); - ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_parameter", "instance", "parameter"), &RenderingServer::instance_geometry_get_shader_parameter); - ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_parameter_default_value", "instance", "parameter"), &RenderingServer::instance_geometry_get_shader_parameter_default_value); - ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_parameter_list", "instance"), &RenderingServer::_instance_geometry_get_shader_parameter_list); + ClassDB::bind_method(D_METHOD("instance_geometry_set_shader_uniform", "instance", "parameter", "value"), &RenderingServer::instance_geometry_set_shader_uniform); + ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_uniform", "instance", "parameter"), &RenderingServer::instance_geometry_get_shader_uniform); + ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_uniform_default_value", "instance", "parameter"), &RenderingServer::instance_geometry_get_shader_uniform_default_value); + ClassDB::bind_method(D_METHOD("instance_geometry_get_shader_uniform_list", "instance"), &RenderingServer::_instance_geometry_get_shader_uniform_list); ClassDB::bind_method(D_METHOD("instances_cull_aabb", "aabb", "scenario"), &RenderingServer::_instances_cull_aabb_bind, DEFVAL(RID())); ClassDB::bind_method(D_METHOD("instances_cull_ray", "from", "to", "scenario"), &RenderingServer::_instances_cull_ray_bind, DEFVAL(RID())); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 845a4a7a3e..297736aec7 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -170,7 +170,7 @@ public: virtual void shader_set_code(RID p_shader, const String &p_code) = 0; virtual void shader_set_path_hint(RID p_shader, const String &p_path) = 0; virtual String shader_get_code(RID p_shader) const = 0; - virtual void shader_get_param_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0; + virtual void shader_get_shader_uniform_list(RID p_shader, List<PropertyInfo> *p_param_list) const = 0; virtual Variant shader_get_param_default(RID p_shader, const StringName &p_param) const = 0; virtual void shader_set_default_texture_param(RID p_shader, const StringName &p_name, RID p_texture, int p_index = 0) = 0; @@ -1244,10 +1244,10 @@ public: virtual void instance_geometry_set_lod_bias(RID p_instance, float p_lod_bias) = 0; virtual void instance_geometry_set_transparency(RID p_instance, float p_transparency) = 0; - virtual void instance_geometry_set_shader_parameter(RID p_instance, const StringName &, const Variant &p_value) = 0; - virtual Variant instance_geometry_get_shader_parameter(RID p_instance, const StringName &) const = 0; - virtual Variant instance_geometry_get_shader_parameter_default_value(RID p_instance, const StringName &) const = 0; - virtual void instance_geometry_get_shader_parameter_list(RID p_instance, List<PropertyInfo> *p_parameters) const = 0; + virtual void instance_geometry_set_shader_uniform(RID p_instance, const StringName &, const Variant &p_value) = 0; + virtual Variant instance_geometry_get_shader_uniform(RID p_instance, const StringName &) const = 0; + virtual Variant instance_geometry_get_shader_uniform_default_value(RID p_instance, const StringName &) const = 0; + virtual void instance_geometry_get_shader_uniform_list(RID p_instance, List<PropertyInfo> *p_parameters) const = 0; /* Bake 3D objects */ @@ -1571,11 +1571,11 @@ private: RID _texture_3d_create(Image::Format p_format, int p_width, int p_height, int p_depth, bool p_mipmaps, const TypedArray<Image> &p_data); void _texture_3d_update(RID p_texture, const TypedArray<Image> &p_data); TypedArray<Image> _texture_3d_get(RID p_texture) const; - TypedArray<Dictionary> _shader_get_param_list(RID p_shader) const; + TypedArray<Dictionary> _shader_get_shader_uniform_list(RID p_shader) const; RID _mesh_create_from_surfaces(const TypedArray<Dictionary> &p_surfaces, int p_blend_shape_count); void _mesh_add_surface(RID p_mesh, const Dictionary &p_surface); Dictionary _mesh_get_surface(RID p_mesh, int p_idx); - Array _instance_geometry_get_shader_parameter_list(RID p_instance) const; + Array _instance_geometry_get_shader_uniform_list(RID p_instance) const; TypedArray<Image> _bake_render_uv2(RID p_base, const TypedArray<RID> &p_material_overrides, const Size2i &p_image_size); void _particles_set_trail_bind_poses(RID p_particles, const TypedArray<Transform3D> &p_bind_poses); }; diff --git a/servers/text_server.cpp b/servers/text_server.cpp index fd63a7b99d..2bf0837d88 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -521,6 +521,7 @@ void TextServer::_bind_methods() { BIND_BITFIELD_FLAG(GRAPHEME_IS_PUNCTUATION); BIND_BITFIELD_FLAG(GRAPHEME_IS_UNDERSCORE); BIND_BITFIELD_FLAG(GRAPHEME_IS_CONNECTED); + BIND_BITFIELD_FLAG(GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL); /* Hinting */ BIND_ENUM_CONSTANT(HINTING_NONE); diff --git a/servers/text_server.h b/servers/text_server.h index 5874b8f6e8..d45bea3271 100644 --- a/servers/text_server.h +++ b/servers/text_server.h @@ -116,6 +116,7 @@ public: GRAPHEME_IS_PUNCTUATION = 1 << 8, // Punctuation, except underscore (can be used as word break, but not line break or justifiction). GRAPHEME_IS_UNDERSCORE = 1 << 9, // Underscore (can be used as word break). GRAPHEME_IS_CONNECTED = 1 << 10, // Connected to previous grapheme. + GRAPHEME_IS_SAFE_TO_INSERT_TATWEEL = 1 << 11, // It is safe to insert a U+0640 before this grapheme for elongation. }; enum Hinting { diff --git a/tests/core/input/test_input_event_key.h b/tests/core/input/test_input_event_key.h new file mode 100644 index 0000000000..5d4ca55a35 --- /dev/null +++ b/tests/core/input/test_input_event_key.h @@ -0,0 +1,294 @@ +/*************************************************************************/ +/* test_input_event_key.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_INPUT_EVENT_KEY_H +#define TEST_INPUT_EVENT_KEY_H + +#include "core/input/input_event.h" +#include "core/os/keyboard.h" + +#include "tests/test_macros.h" + +namespace TestInputEventKey { + +TEST_CASE("[InputEventKey] Key correctly registers being pressed") { + InputEventKey key; + key.set_pressed(true); + CHECK(key.is_pressed() == true); + + key.set_pressed(false); + CHECK(key.is_pressed() == false); +} + +TEST_CASE("[InputEventKey] Key correctly stores and retrieves keycode") { + InputEventKey key; + + key.set_keycode(Key::ENTER); + CHECK(key.get_keycode() == Key::ENTER); + CHECK(key.get_keycode() != Key::PAUSE); + + key.set_physical_keycode(Key::BACKSPACE); + CHECK(key.get_physical_keycode() == Key::BACKSPACE); + CHECK(key.get_physical_keycode() != Key::PAUSE); +} + +TEST_CASE("[InputEventKey] Key correctly stores and retrieves keycode with modifiers") { + InputEventKey key; + + key.set_keycode(Key::ENTER); + key.set_ctrl_pressed(true); + + CHECK(key.get_keycode_with_modifiers() == (Key::ENTER | KeyModifierMask::CTRL)); + CHECK(key.get_keycode_with_modifiers() != (Key::ENTER | KeyModifierMask::SHIFT)); + CHECK(key.get_keycode_with_modifiers() != Key::ENTER); + + key.set_physical_keycode(Key::SPACE); + key.set_ctrl_pressed(true); + + CHECK(key.get_physical_keycode_with_modifiers() == (Key::SPACE | KeyModifierMask::CTRL)); + CHECK(key.get_physical_keycode_with_modifiers() != (Key::SPACE | KeyModifierMask::SHIFT)); + CHECK(key.get_physical_keycode_with_modifiers() != Key::SPACE); +} + +TEST_CASE("[InputEventKey] Key correctly stores and retrieves unicode") { + InputEventKey key; + + key.set_unicode('x'); + CHECK(key.get_unicode() == 'x'); + CHECK(key.get_unicode() != 'y'); +} + +TEST_CASE("[InputEventKey] Key correctly stores and checks echo") { + InputEventKey key; + + key.set_echo(true); + CHECK(key.is_echo() == true); + + key.set_echo(false); + CHECK(key.is_echo() == false); +} + +TEST_CASE("[InputEventKey] Key correctly converts itself to text") { + InputEventKey none_key; + + // These next three tests test the functionality of getting a key that is set to None + // as text. These cases are a bit weird, since None has no textual representation + // (find_keycode_name(Key::NONE) results in a nullptr). Thus, these tests look weird + // with only (Physical) or a lonely modifier with (Physical) but (as far as I + // understand the code, that is intended behaviour. + + // Key is None without a physical key. + none_key.set_keycode(Key::NONE); + CHECK(none_key.as_text() == " (Physical)"); + + // Key is none and has modifiers. + none_key.set_ctrl_pressed(true); + CHECK(none_key.as_text() == "Ctrl+ (Physical)"); + + // Key is None WITH a physical key AND modifiers. + none_key.set_physical_keycode(Key::ENTER); + CHECK(none_key.as_text() == "Ctrl+Enter (Physical)"); + + InputEventKey none_key2; + + // Key is None without modifers with a physical key. + none_key2.set_keycode(Key::NONE); + none_key2.set_physical_keycode(Key::ENTER); + + CHECK(none_key2.as_text() == "Enter (Physical)"); + + InputEventKey key; + + // Key has keycode. + key.set_keycode(Key::SPACE); + CHECK(key.as_text() != ""); + CHECK(key.as_text() == "Space"); + + // Key has keycode and modifiers. + key.set_ctrl_pressed(true); + CHECK(key.as_text() != "Space"); + CHECK(key.as_text() == "Ctrl+Space"); + + // Since the keycode is set to Key::NONE upon initialization of the + // InputEventKey and you can only update it with another Key, the keycode + // cannot be empty, so the kc.is_empty() case cannot be tested. +} + +TEST_CASE("[InputEventKey] Key correctly converts its state to a string representation") { + InputEventKey none_key; + + // Set physical to true. + CHECK(none_key.to_string() == "InputEventKey: keycode=0 (), mods=none, physical=true, pressed=false, echo=false"); + // Set physical key to Escape. + none_key.set_physical_keycode(Key::ESCAPE); + CHECK(none_key.to_string() == "InputEventKey: keycode=16777217 (Escape), mods=none, physical=true, pressed=false, echo=false"); + + InputEventKey key; + + // Set physical to None, set keycode to Space. + key.set_keycode(Key::SPACE); + CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=none, physical=false, pressed=false, echo=false"); + + // Set pressed to true. + key.set_pressed(true); + CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=none, physical=false, pressed=true, echo=false"); + + // set echo to true. + key.set_echo(true); + CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=none, physical=false, pressed=true, echo=true"); + + // Press Ctrl and Alt. + key.set_ctrl_pressed(true); + key.set_alt_pressed(true); + CHECK(key.to_string() == "InputEventKey: keycode=32 (Space), mods=Ctrl+Alt, physical=false, pressed=true, echo=true"); +} + +TEST_CASE("[InputEventKey] Key is correctly converted to reference") { + InputEventKey base_key; + Ref<InputEventKey> key_ref = base_key.create_reference(Key::ENTER); + + CHECK(key_ref->get_keycode() == Key::ENTER); +} + +TEST_CASE("[InputEventKey] Keys are correctly matched based on action") { + bool pressed = false; + float strength, raw_strength = 0.0; + + InputEventKey key; + + // Nullptr. + CHECK_MESSAGE(key.action_match(nullptr, false, 0.0f, &pressed, &strength, &raw_strength) == false, "nullptr as key reference should result in false"); + + // Match on keycode. + key.set_keycode(Key::SPACE); + Ref<InputEventKey> match = key.create_reference(Key::SPACE); + Ref<InputEventKey> no_match = key.create_reference(Key::ENTER); + + CHECK(key.action_match(match, false, 0.0f, &pressed, &strength, &raw_strength) == true); + CHECK(key.action_match(no_match, false, 0.0f, &pressed, &strength, &raw_strength) == false); + + // Check that values are correctly transferred to the pointers. + CHECK(pressed == false); + CHECK(strength < 0.5); + CHECK(raw_strength < 0.5); + + match->set_pressed(true); + key.action_match(match, false, 0.0f, &pressed, &strength, &raw_strength); + + CHECK(pressed == true); + CHECK(strength > 0.5); + CHECK(raw_strength > 0.5); + + // Tests when keycode is None: Then you rely on physical keycode. + InputEventKey none_key; + none_key.set_physical_keycode(Key::SPACE); + + Ref<InputEventKey> match_none = none_key.create_reference(Key::NONE); + match_none->set_physical_keycode(Key::SPACE); + + Ref<InputEventKey> no_match_none = none_key.create_reference(Key::NONE); + no_match_none->set_physical_keycode(Key::ENTER); + + CHECK(none_key.action_match(match_none, false, 0.0f, &pressed, &strength, &raw_strength) == true); + CHECK(none_key.action_match(no_match_none, false, 0.0f, &pressed, &strength, &raw_strength) == false); + + // Test exact match. + InputEventKey key2, ref_key; + key2.set_keycode(Key::SPACE); + + Ref<InputEventKey> match2 = ref_key.create_reference(Key::SPACE); + + // Now both press Ctrl and Shift. + key2.set_ctrl_pressed(true); + key2.set_shift_pressed(true); + + match2->set_ctrl_pressed(true); + match2->set_shift_pressed(true); + + // Now they should match. + bool exact_match = true; + CHECK(key2.action_match(match2, exact_match, 0.0f, &pressed, &strength, &raw_strength) == true); + + // Modify matching key such that it does no longer match in terms of modifiers: Shift + // is no longer pressed. + match2->set_shift_pressed(false); + CHECK(match2->is_shift_pressed() == false); + CHECK(key2.action_match(match2, exact_match, 0.0f, &pressed, &strength, &raw_strength) == false); +} + +TEST_CASE("[IsMatch] Keys are correctly matched") { + // Key with NONE as keycode. + InputEventKey key; + key.set_keycode(Key::NONE); + key.set_physical_keycode(Key::SPACE); + + // Nullptr. + CHECK(key.is_match(nullptr, false) == false); + + Ref<InputEventKey> none_ref = key.create_reference(Key::NONE); + + none_ref->set_physical_keycode(Key::SPACE); + CHECK(key.is_match(none_ref, false) == true); + + none_ref->set_physical_keycode(Key::ENTER); + CHECK(key.is_match(none_ref, false) == false); + + none_ref->set_physical_keycode(Key::SPACE); + + key.set_ctrl_pressed(true); + none_ref->set_ctrl_pressed(false); + CHECK(key.is_match(none_ref, true) == false); + + none_ref->set_ctrl_pressed(true); + CHECK(key.is_match(none_ref, true) == true); + + // Ref with actual keycode. + InputEventKey key2; + key2.set_keycode(Key::SPACE); + + Ref<InputEventKey> match = key2.create_reference(Key::SPACE); + Ref<InputEventKey> no_match = key2.create_reference(Key::ENTER); + + CHECK(key2.is_match(match, false) == true); + CHECK(key2.is_match(no_match, false) == false); + + // Now the keycode is the same, but the modifiers differ. + no_match->set_keycode(Key::SPACE); + + key2.set_ctrl_pressed(true); + match->set_ctrl_pressed(true); + no_match->set_shift_pressed(true); + + CHECK(key2.is_match(match, true) == true); + CHECK(key2.is_match(no_match, true) == false); +} +} // namespace TestInputEventKey + +#endif // TEST_INPUT_EVENT_KEY_H diff --git a/tests/core/input/test_shortcut.h b/tests/core/input/test_shortcut.h new file mode 100644 index 0000000000..93edc685ad --- /dev/null +++ b/tests/core/input/test_shortcut.h @@ -0,0 +1,235 @@ +/*************************************************************************/ +/* test_shortcut.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_SHORTCUT_H +#define TEST_SHORTCUT_H + +#include "core/input/input_event.h" +#include "core/input/shortcut.h" +#include "core/io/config_file.h" +#include "core/object/ref_counted.h" +#include "core/os/keyboard.h" +#include "core/os/os.h" + +#include "tests/test_macros.h" + +namespace TestShortcut { + +TEST_CASE("[Shortcut] Empty shortcut should have no valid events and text equal to None") { + Shortcut s; + + CHECK(s.get_as_text() == "None"); + CHECK(s.has_valid_event() == false); +} + +TEST_CASE("[Shortcut] Setting and getting an event should result in the same event as the input") { + Ref<InputEventKey> k1; + Ref<InputEventKey> k2; + k1.instantiate(); + k2.instantiate(); + + k1->set_keycode(Key::ENTER); + k2->set_keycode(Key::BACKSPACE); + + // Cast to InputEvent so the internal code recognizes the objects. + Ref<InputEvent> e1 = k1; + Ref<InputEvent> e2 = k2; + + Array input_array; + input_array.append(e1); + input_array.append(e2); + + Shortcut s; + s.set_events(input_array); + + // Get result, read it out, check whether it equals the input. + Array result_array = s.get_events(); + Ref<InputEventKey> result1 = result_array.front(); + Ref<InputEventKey> result2 = result_array.back(); + + CHECK(result1->get_keycode() == k1->get_keycode()); + CHECK(result2->get_keycode() == k2->get_keycode()); +} + +TEST_CASE("[Shortcut] 'set_events_list' should result in the same events as the input") { + Ref<InputEventKey> k1; + Ref<InputEventKey> k2; + k1.instantiate(); + k2.instantiate(); + + k1->set_keycode(Key::ENTER); + k2->set_keycode(Key::BACKSPACE); + + // Cast to InputEvent so the set_events_list() method recognizes the objects. + Ref<InputEvent> e1 = k1; + Ref<InputEvent> e2 = k2; + + List<Ref<InputEvent>> list; + list.push_back(e1); + list.push_back(e2); + + Shortcut s; + s.set_events_list(&list); + + // Get result, read it out, check whether it equals the input. + Array result_array = s.get_events(); + Ref<InputEventKey> result1 = result_array.front(); + Ref<InputEventKey> result2 = result_array.back(); + + CHECK(result1->get_keycode() == k1->get_keycode()); + CHECK(result2->get_keycode() == k2->get_keycode()); +} + +TEST_CASE("[Shortcut] 'matches_event' should correctly match the same event") { + Ref<InputEventKey> original; // The one we compare with. + Ref<InputEventKey> similar_but_not_equal; // Same keycode, different event. + Ref<InputEventKey> different; // Different event, different keycode. + Ref<InputEventKey> copy; // Copy of original event. + + original.instantiate(); + similar_but_not_equal.instantiate(); + different.instantiate(); + copy.instantiate(); + + original->set_keycode(Key::ENTER); + similar_but_not_equal->set_keycode(Key::ENTER); + similar_but_not_equal->set_keycode(Key::ESCAPE); + copy = original; + + // Only the copy is really the same, so only that one should match. + // The rest should not match. + + Ref<InputEvent> e_original = original; + + Ref<InputEvent> e_similar_but_not_equal = similar_but_not_equal; + Ref<InputEvent> e_different = different; + Ref<InputEvent> e_copy = copy; + + Array a; + a.append(e_original); + Shortcut s; + s.set_events(a); + + CHECK(s.matches_event(e_similar_but_not_equal) == false); + CHECK(s.matches_event(e_different) == false); + + CHECK(s.matches_event(e_copy) == true); +} + +TEST_CASE("[Shortcut] 'get_as_text' text representation should be correct") { + Ref<InputEventKey> same; + // k2 will not go into the shortcut but only be used to compare. + Ref<InputEventKey> different; + + same.instantiate(); + different.instantiate(); + + same->set_keycode(Key::ENTER); + different->set_keycode(Key::ESCAPE); + + Ref<InputEvent> key_event1 = same; + + Array a; + a.append(key_event1); + Shortcut s; + s.set_events(a); + + CHECK(s.get_as_text() == same->as_text()); + CHECK(s.get_as_text() != different->as_text()); +} + +TEST_CASE("[Shortcut] Event validity should be correctly checked.") { + Ref<InputEventKey> valid; + // k2 will not go into the shortcut but only be used to compare. + Ref<InputEventKey> invalid = nullptr; + + valid.instantiate(); + valid->set_keycode(Key::ENTER); + + Ref<InputEvent> valid_event = valid; + Ref<InputEvent> invalid_event = invalid; + + Array a; + a.append(invalid_event); + a.append(valid_event); + + Shortcut s; + s.set_events(a); + + CHECK(s.has_valid_event() == true); + + Array b; + b.append(invalid_event); + + Shortcut shortcut_with_invalid_event; + shortcut_with_invalid_event.set_events(b); + + CHECK(shortcut_with_invalid_event.has_valid_event() == false); +} + +TEST_CASE("[Shortcut] Equal arrays should be recognized as such.") { + Ref<InputEventKey> k1; + // k2 will not go into the shortcut but only be used to compare. + Ref<InputEventKey> k2; + + k1.instantiate(); + k2.instantiate(); + + k1->set_keycode(Key::ENTER); + k2->set_keycode(Key::ESCAPE); + + Ref<InputEvent> key_event1 = k1; + Ref<InputEvent> key_event2 = k2; + + Array same; + same.append(key_event1); + + Array same_as_same; + same_as_same.append(key_event1); + + Array different1; + different1.append(key_event2); + + Array different2; + different2.append(key_event1); + different2.append(key_event2); + + Array different3; + + Shortcut s; + + CHECK(s.is_event_array_equal(same, same_as_same) == true); + CHECK(s.is_event_array_equal(same, different1) == false); + CHECK(s.is_event_array_equal(same, different2) == false); + CHECK(s.is_event_array_equal(same, different3) == false); +} +} // namespace TestShortcut + +#endif // TEST_SHORTCUT_H diff --git a/tests/core/io/test_marshalls.h b/tests/core/io/test_marshalls.h index 546a2e9358..7490df2b2c 100644 --- a/tests/core/io/test_marshalls.h +++ b/tests/core/io/test_marshalls.h @@ -254,11 +254,13 @@ TEST_CASE("[Marshalls] Invalid data Variant decoding") { uint8_t some_buffer[1] = { 0x00 }; uint8_t out_of_range_type_buffer[4] = { 0xff }; // Greater than Variant::VARIANT_MAX + ERR_PRINT_OFF; CHECK(decode_variant(variant, some_buffer, /* less than 4 */ 1, &r_len) == ERR_INVALID_DATA); CHECK(r_len == 0); CHECK(decode_variant(variant, out_of_range_type_buffer, 4, &r_len) == ERR_INVALID_DATA); CHECK(r_len == 0); + ERR_PRINT_ON; } TEST_CASE("[Marshalls] NIL Variant decoding") { diff --git a/tests/core/math/test_aabb.h b/tests/core/math/test_aabb.h index 526972a82f..447420fc12 100644 --- a/tests/core/math/test_aabb.h +++ b/tests/core/math/test_aabb.h @@ -299,34 +299,28 @@ TEST_CASE("[AABB] Get longest/shortest axis") { "get_shortest_axis_size() should return the expected value."); } -#ifndef _MSC_VER -#warning Support tests need to be re-done -#endif - -/* Support function was actually broken. As it was fixed, the tests now fail. Tests need to be re-done. - TEST_CASE("[AABB] Get support") { const AABB aabb = AABB(Vector3(-1.5, 2, -2.5), Vector3(4, 5, 6)); CHECK_MESSAGE( - aabb.get_support(Vector3(1, 0, 0)).is_equal_approx(Vector3(-1.5, 7, 3.5)), + aabb.get_support(Vector3(1, 0, 0)).is_equal_approx(Vector3(2.5, 2, -2.5)), "get_support() should return the expected value."); CHECK_MESSAGE( - aabb.get_support(Vector3(0.5, 1, 0)).is_equal_approx(Vector3(-1.5, 2, 3.5)), + aabb.get_support(Vector3(0.5, 1, 0)).is_equal_approx(Vector3(2.5, 7, -2.5)), "get_support() should return the expected value."); CHECK_MESSAGE( - aabb.get_support(Vector3(0.5, 1, -400)).is_equal_approx(Vector3(-1.5, 2, 3.5)), + aabb.get_support(Vector3(0.5, 1, -400)).is_equal_approx(Vector3(2.5, 7, -2.5)), "get_support() should return the expected value."); CHECK_MESSAGE( - aabb.get_support(Vector3(0, -1, 0)).is_equal_approx(Vector3(2.5, 7, 3.5)), + aabb.get_support(Vector3(0, -1, 0)).is_equal_approx(Vector3(-1.5, 2, -2.5)), "get_support() should return the expected value."); CHECK_MESSAGE( - aabb.get_support(Vector3(0, -0.1, 0)).is_equal_approx(Vector3(2.5, 7, 3.5)), + aabb.get_support(Vector3(0, -0.1, 0)).is_equal_approx(Vector3(-1.5, 2, -2.5)), "get_support() should return the expected value."); CHECK_MESSAGE( - aabb.get_support(Vector3()).is_equal_approx(Vector3(2.5, 7, 3.5)), + aabb.get_support(Vector3()).is_equal_approx(Vector3(-1.5, 2, -2.5)), "get_support() should return the expected value with a null vector."); } -*/ + TEST_CASE("[AABB] Grow") { const AABB aabb = AABB(Vector3(-1.5, 2, -2.5), Vector3(4, 5, 6)); CHECK_MESSAGE( diff --git a/tests/core/math/test_quaternion.h b/tests/core/math/test_quaternion.h new file mode 100644 index 0000000000..94eef6c463 --- /dev/null +++ b/tests/core/math/test_quaternion.h @@ -0,0 +1,389 @@ +/*************************************************************************/ +/* test_quaternion.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_QUATERNION_H +#define TEST_QUATERNION_H + +#include "core/math/math_defs.h" +#include "core/math/math_funcs.h" +#include "core/math/quaternion.h" +#include "core/math/vector3.h" + +#include "tests/test_macros.h" + +namespace TestQuaternion { + +Quaternion quat_euler_yxz_deg(Vector3 angle) { + double yaw = Math::deg2rad(angle[1]); + double pitch = Math::deg2rad(angle[0]); + double roll = Math::deg2rad(angle[2]); + + // Generate YXZ (Z-then-X-then-Y) Quaternion using single-axis Euler + // constructor and quaternion product, both tested separately. + Quaternion q_y(Vector3(0.0, yaw, 0.0)); + Quaternion q_p(Vector3(pitch, 0.0, 0.0)); + Quaternion q_r(Vector3(0.0, 0.0, roll)); + // Roll-Z is followed by Pitch-X, then Yaw-Y. + Quaternion q_yxz = q_y * q_p * q_r; + + return q_yxz; +} + +TEST_CASE("[Quaternion] Default Construct") { + Quaternion q; + + CHECK(q[0] == 0.0); + CHECK(q[1] == 0.0); + CHECK(q[2] == 0.0); + CHECK(q[3] == 1.0); +} + +TEST_CASE("[Quaternion] Construct x,y,z,w") { + // Values are taken from actual use in another project & are valid (except roundoff error). + Quaternion q(0.2391, 0.099, 0.3696, 0.8924); + + CHECK(q[0] == doctest::Approx(0.2391)); + CHECK(q[1] == doctest::Approx(0.099)); + CHECK(q[2] == doctest::Approx(0.3696)); + CHECK(q[3] == doctest::Approx(0.8924)); +} + +TEST_CASE("[Quaternion] Construct AxisAngle 1") { + // Easy to visualize: 120 deg about X-axis. + Quaternion q(Vector3(1.0, 0.0, 0.0), Math::deg2rad(120.0)); + + // 0.866 isn't close enough; doctest::Approx doesn't cut much slack! + CHECK(q[0] == doctest::Approx(0.866025)); // Sine of half the angle. + CHECK(q[1] == doctest::Approx(0.0)); + CHECK(q[2] == doctest::Approx(0.0)); + CHECK(q[3] == doctest::Approx(0.5)); // Cosine of half the angle. +} + +TEST_CASE("[Quaternion] Construct AxisAngle 2") { + // Easy to visualize: 30 deg about Y-axis. + Quaternion q(Vector3(0.0, 1.0, 0.0), Math::deg2rad(30.0)); + + CHECK(q[0] == doctest::Approx(0.0)); + CHECK(q[1] == doctest::Approx(0.258819)); // Sine of half the angle. + CHECK(q[2] == doctest::Approx(0.0)); + CHECK(q[3] == doctest::Approx(0.965926)); // Cosine of half the angle. +} + +TEST_CASE("[Quaternion] Construct AxisAngle 3") { + // Easy to visualize: 60 deg about Z-axis. + Quaternion q(Vector3(0.0, 0.0, 1.0), Math::deg2rad(60.0)); + + CHECK(q[0] == doctest::Approx(0.0)); + CHECK(q[1] == doctest::Approx(0.0)); + CHECK(q[2] == doctest::Approx(0.5)); // Sine of half the angle. + CHECK(q[3] == doctest::Approx(0.866025)); // Cosine of half the angle. +} + +TEST_CASE("[Quaternion] Construct AxisAngle 4") { + // More complex & hard to visualize, so test w/ data from online calculator. + Vector3 axis(1.0, 2.0, 0.5); + Quaternion q(axis.normalized(), Math::deg2rad(35.0)); + + CHECK(q[0] == doctest::Approx(0.131239)); + CHECK(q[1] == doctest::Approx(0.262478)); + CHECK(q[2] == doctest::Approx(0.0656194)); + CHECK(q[3] == doctest::Approx(0.953717)); +} + +TEST_CASE("[Quaternion] Construct from Quaternion") { + Vector3 axis(1.0, 2.0, 0.5); + Quaternion q_src(axis.normalized(), Math::deg2rad(35.0)); + Quaternion q(q_src); + + CHECK(q[0] == doctest::Approx(0.131239)); + CHECK(q[1] == doctest::Approx(0.262478)); + CHECK(q[2] == doctest::Approx(0.0656194)); + CHECK(q[3] == doctest::Approx(0.953717)); +} + +TEST_CASE("[Quaternion] Construct Euler SingleAxis") { + double yaw = Math::deg2rad(45.0); + double pitch = Math::deg2rad(30.0); + double roll = Math::deg2rad(10.0); + + Vector3 euler_y(0.0, yaw, 0.0); + Quaternion q_y(euler_y); + CHECK(q_y[0] == doctest::Approx(0.0)); + CHECK(q_y[1] == doctest::Approx(0.382684)); + CHECK(q_y[2] == doctest::Approx(0.0)); + CHECK(q_y[3] == doctest::Approx(0.923879)); + + Vector3 euler_p(pitch, 0.0, 0.0); + Quaternion q_p(euler_p); + CHECK(q_p[0] == doctest::Approx(0.258819)); + CHECK(q_p[1] == doctest::Approx(0.0)); + CHECK(q_p[2] == doctest::Approx(0.0)); + CHECK(q_p[3] == doctest::Approx(0.965926)); + + Vector3 euler_r(0.0, 0.0, roll); + Quaternion q_r(euler_r); + CHECK(q_r[0] == doctest::Approx(0.0)); + CHECK(q_r[1] == doctest::Approx(0.0)); + CHECK(q_r[2] == doctest::Approx(0.0871558)); + CHECK(q_r[3] == doctest::Approx(0.996195)); +} + +TEST_CASE("[Quaternion] Construct Euler YXZ dynamic axes") { + double yaw = Math::deg2rad(45.0); + double pitch = Math::deg2rad(30.0); + double roll = Math::deg2rad(10.0); + + // Generate YXZ comparision data (Z-then-X-then-Y) using single-axis Euler + // constructor and quaternion product, both tested separately. + Vector3 euler_y(0.0, yaw, 0.0); + Quaternion q_y(euler_y); + Vector3 euler_p(pitch, 0.0, 0.0); + Quaternion q_p(euler_p); + Vector3 euler_r(0.0, 0.0, roll); + Quaternion q_r(euler_r); + + // Roll-Z is followed by Pitch-X. + Quaternion check_xz = q_p * q_r; + // Then Yaw-Y follows both. + Quaternion check_yxz = q_y * check_xz; + + // Test construction from YXZ Euler angles. + Vector3 euler_yxz(pitch, yaw, roll); + Quaternion q(euler_yxz); + CHECK(q[0] == doctest::Approx(check_yxz[0])); + CHECK(q[1] == doctest::Approx(check_yxz[1])); + CHECK(q[2] == doctest::Approx(check_yxz[2])); + CHECK(q[3] == doctest::Approx(check_yxz[3])); + + // Sneak in a test of is_equal_approx. + CHECK(q.is_equal_approx(check_yxz)); +} + +TEST_CASE("[Quaternion] Construct Basis Euler") { + double yaw = Math::deg2rad(45.0); + double pitch = Math::deg2rad(30.0); + double roll = Math::deg2rad(10.0); + Vector3 euler_yxz(pitch, yaw, roll); + Quaternion q_yxz(euler_yxz); + Basis basis_axes(euler_yxz); + Quaternion q(basis_axes); + CHECK(q.is_equal_approx(q_yxz)); +} + +TEST_CASE("[Quaternion] Construct Basis Axes") { + // Arbitrary Euler angles. + Vector3 euler_yxz(Math::deg2rad(31.41), Math::deg2rad(-49.16), Math::deg2rad(12.34)); + // Basis vectors from online calculation of rotation matrix. + Vector3 i_unit(0.5545787, 0.1823950, 0.8118957); + Vector3 j_unit(-0.5249245, 0.8337420, 0.1712555); + Vector3 k_unit(-0.6456754, -0.5211586, 0.5581192); + // Quaternion from online calculation. + Quaternion q_calc(0.2016913, -0.4245716, 0.206033, 0.8582598); + // Quaternion from local calculation. + Quaternion q_local = quat_euler_yxz_deg(Vector3(31.41, -49.16, 12.34)); + // Quaternion from Euler angles constructor. + Quaternion q_euler(euler_yxz); + CHECK(q_calc.is_equal_approx(q_local)); + CHECK(q_local.is_equal_approx(q_euler)); + + // Calculate Basis and construct Quaternion. + // When this is written, C++ Basis class does not construct from basis vectors. + // This is by design, but may be subject to change. + // Workaround by constructing Basis from Euler angles. + // basis_axes = Basis(i_unit, j_unit, k_unit); + Basis basis_axes(euler_yxz); + Quaternion q(basis_axes); + + CHECK(basis_axes.get_column(0).is_equal_approx(i_unit)); + CHECK(basis_axes.get_column(1).is_equal_approx(j_unit)); + CHECK(basis_axes.get_column(2).is_equal_approx(k_unit)); + + CHECK(q.is_equal_approx(q_calc)); + CHECK_FALSE(q.inverse().is_equal_approx(q_calc)); + CHECK(q.is_equal_approx(q_local)); + CHECK(q.is_equal_approx(q_euler)); + CHECK(q[0] == doctest::Approx(0.2016913)); + CHECK(q[1] == doctest::Approx(-0.4245716)); + CHECK(q[2] == doctest::Approx(0.206033)); + CHECK(q[3] == doctest::Approx(0.8582598)); +} + +TEST_CASE("[Quaternion] Product (book)") { + // Example from "Quaternions and Rotation Sequences" by Jack Kuipers, p. 108. + Quaternion p(1.0, -2.0, 1.0, 3.0); + Quaternion q(-1.0, 2.0, 3.0, 2.0); + + Quaternion pq = p * q; + CHECK(pq[0] == doctest::Approx(-9.0)); + CHECK(pq[1] == doctest::Approx(-2.0)); + CHECK(pq[2] == doctest::Approx(11.0)); + CHECK(pq[3] == doctest::Approx(8.0)); +} + +TEST_CASE("[Quaternion] Product") { + double yaw = Math::deg2rad(45.0); + double pitch = Math::deg2rad(30.0); + double roll = Math::deg2rad(10.0); + + Vector3 euler_y(0.0, yaw, 0.0); + Quaternion q_y(euler_y); + CHECK(q_y[0] == doctest::Approx(0.0)); + CHECK(q_y[1] == doctest::Approx(0.382684)); + CHECK(q_y[2] == doctest::Approx(0.0)); + CHECK(q_y[3] == doctest::Approx(0.923879)); + + Vector3 euler_p(pitch, 0.0, 0.0); + Quaternion q_p(euler_p); + CHECK(q_p[0] == doctest::Approx(0.258819)); + CHECK(q_p[1] == doctest::Approx(0.0)); + CHECK(q_p[2] == doctest::Approx(0.0)); + CHECK(q_p[3] == doctest::Approx(0.965926)); + + Vector3 euler_r(0.0, 0.0, roll); + Quaternion q_r(euler_r); + CHECK(q_r[0] == doctest::Approx(0.0)); + CHECK(q_r[1] == doctest::Approx(0.0)); + CHECK(q_r[2] == doctest::Approx(0.0871558)); + CHECK(q_r[3] == doctest::Approx(0.996195)); + + // Test ZYX dynamic-axes since test data is available online. + // Rotate first about X axis, then new Y axis, then new Z axis. + // (Godot uses YXZ Yaw-Pitch-Roll order). + Quaternion q_yp = q_y * q_p; + CHECK(q_yp[0] == doctest::Approx(0.239118)); + CHECK(q_yp[1] == doctest::Approx(0.369644)); + CHECK(q_yp[2] == doctest::Approx(-0.099046)); + CHECK(q_yp[3] == doctest::Approx(0.892399)); + + Quaternion q_ryp = q_r * q_yp; + CHECK(q_ryp[0] == doctest::Approx(0.205991)); + CHECK(q_ryp[1] == doctest::Approx(0.389078)); + CHECK(q_ryp[2] == doctest::Approx(-0.0208912)); + CHECK(q_ryp[3] == doctest::Approx(0.897636)); +} + +TEST_CASE("[Quaternion] xform unit vectors") { + // Easy to visualize: 120 deg about X-axis. + // Transform the i, j, & k unit vectors. + Quaternion q(Vector3(1.0, 0.0, 0.0), Math::deg2rad(120.0)); + Vector3 i_t = q.xform(Vector3(1.0, 0.0, 0.0)); + Vector3 j_t = q.xform(Vector3(0.0, 1.0, 0.0)); + Vector3 k_t = q.xform(Vector3(0.0, 0.0, 1.0)); + // + CHECK(i_t.is_equal_approx(Vector3(1.0, 0.0, 0.0))); + CHECK(j_t.is_equal_approx(Vector3(0.0, -0.5, 0.866025))); + CHECK(k_t.is_equal_approx(Vector3(0.0, -0.866025, -0.5))); + CHECK(i_t.length_squared() == doctest::Approx(1.0)); + CHECK(j_t.length_squared() == doctest::Approx(1.0)); + CHECK(k_t.length_squared() == doctest::Approx(1.0)); + + // Easy to visualize: 30 deg about Y-axis. + q = Quaternion(Vector3(0.0, 1.0, 0.0), Math::deg2rad(30.0)); + i_t = q.xform(Vector3(1.0, 0.0, 0.0)); + j_t = q.xform(Vector3(0.0, 1.0, 0.0)); + k_t = q.xform(Vector3(0.0, 0.0, 1.0)); + // + CHECK(i_t.is_equal_approx(Vector3(0.866025, 0.0, -0.5))); + CHECK(j_t.is_equal_approx(Vector3(0.0, 1.0, 0.0))); + CHECK(k_t.is_equal_approx(Vector3(0.5, 0.0, 0.866025))); + CHECK(i_t.length_squared() == doctest::Approx(1.0)); + CHECK(j_t.length_squared() == doctest::Approx(1.0)); + CHECK(k_t.length_squared() == doctest::Approx(1.0)); + + // Easy to visualize: 60 deg about Z-axis. + q = Quaternion(Vector3(0.0, 0.0, 1.0), Math::deg2rad(60.0)); + i_t = q.xform(Vector3(1.0, 0.0, 0.0)); + j_t = q.xform(Vector3(0.0, 1.0, 0.0)); + k_t = q.xform(Vector3(0.0, 0.0, 1.0)); + // + CHECK(i_t.is_equal_approx(Vector3(0.5, 0.866025, 0.0))); + CHECK(j_t.is_equal_approx(Vector3(-0.866025, 0.5, 0.0))); + CHECK(k_t.is_equal_approx(Vector3(0.0, 0.0, 1.0))); + CHECK(i_t.length_squared() == doctest::Approx(1.0)); + CHECK(j_t.length_squared() == doctest::Approx(1.0)); + CHECK(k_t.length_squared() == doctest::Approx(1.0)); +} + +TEST_CASE("[Quaternion] xform vector") { + // Arbitrary quaternion rotates an arbitrary vector. + Vector3 euler_yzx(Math::deg2rad(31.41), Math::deg2rad(-49.16), Math::deg2rad(12.34)); + Basis basis_axes(euler_yzx); + Quaternion q(basis_axes); + + Vector3 v_arb(3.0, 4.0, 5.0); + Vector3 v_rot = q.xform(v_arb); + Vector3 v_compare = basis_axes.xform(v_arb); + + CHECK(v_rot.length_squared() == doctest::Approx(v_arb.length_squared())); + CHECK(v_rot.is_equal_approx(v_compare)); +} + +// Test vector xform for a single combination of Quaternion and Vector. +void test_quat_vec_rotate(Vector3 euler_yzx, Vector3 v_in) { + Basis basis_axes(euler_yzx); + Quaternion q(basis_axes); + + Vector3 v_rot = q.xform(v_in); + Vector3 v_compare = basis_axes.xform(v_in); + + CHECK(v_rot.length_squared() == doctest::Approx(v_in.length_squared())); + CHECK(v_rot.is_equal_approx(v_compare)); +} + +TEST_CASE("[Stress][Quaternion] Many vector xforms") { + // Many arbitrary quaternions rotate many arbitrary vectors. + // For each trial, check that rotation by Quaternion yields same result as + // rotation by Basis. + const int STEPS = 100; // Number of test steps in each dimension + const double delta = 2.0 * Math_PI / STEPS; // Angle increment per step + const double delta_vec = 20.0 / STEPS; // Vector increment per step + Vector3 vec_arb(1.0, 1.0, 1.0); + double x_angle = -Math_PI; + double y_angle = -Math_PI; + double z_angle = -Math_PI; + for (double i = 0; i < STEPS; ++i) { + vec_arb[0] = -10.0 + i * delta_vec; + x_angle = i * delta - Math_PI; + for (double j = 0; j < STEPS; ++j) { + vec_arb[1] = -10.0 + j * delta_vec; + y_angle = j * delta - Math_PI; + for (double k = 0; k < STEPS; ++k) { + vec_arb[2] = -10.0 + k * delta_vec; + z_angle = k * delta - Math_PI; + Vector3 euler_yzx(x_angle, y_angle, z_angle); + test_quat_vec_rotate(euler_yzx, vec_arb); + } + } + } +} + +} // namespace TestQuaternion + +#endif // TEST_QUATERNION_H diff --git a/tests/core/object/test_class_db.h b/tests/core/object/test_class_db.h index c7535426df..fc329ba0eb 100644 --- a/tests/core/object/test_class_db.h +++ b/tests/core/object/test_class_db.h @@ -493,13 +493,13 @@ void add_exposed_classes(Context &r_context) { } if (!ClassDB::is_class_exposed(class_name)) { - MESSAGE(vformat("Ignoring class '%s' because it's not exposed.", class_name).utf8().get_data()); + MESSAGE(vformat("Ignoring class '%s' because it's not exposed.", class_name)); class_list.pop_front(); continue; } if (!ClassDB::is_class_enabled(class_name)) { - MESSAGE(vformat("Ignoring class '%s' because it's not enabled.", class_name).utf8().get_data()); + MESSAGE(vformat("Ignoring class '%s' because it's not enabled.", class_name)); class_list.pop_front(); continue; } diff --git a/tests/core/object/test_method_bind.h b/tests/core/object/test_method_bind.h index 350a08b6e2..2fe0c264a1 100644 --- a/tests/core/object/test_method_bind.h +++ b/tests/core/object/test_method_bind.h @@ -155,7 +155,6 @@ public: TEST_CASE("[MethodBind] check all method binds") { MethodBindTester *mbt = memnew(MethodBindTester); - print_line("testing method bind"); mbt->run_tests(); CHECK(mbt->test_valid[MethodBindTester::TEST_METHOD]); diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index b8b766023a..8914dbfd9a 100644 --- a/tests/core/string/test_string.h +++ b/tests/core/string/test_string.h @@ -697,7 +697,9 @@ TEST_CASE("[String] sprintf") { format = "fish %-05d frog"; args.clear(); args.push_back(-5); + ERR_PRINT_OFF; // Silence warning about 0 ignored. output = format.sprintf(args, &error); + ERR_PRINT_ON; REQUIRE(error == false); CHECK(output == String("fish -5 frog")); @@ -795,7 +797,9 @@ TEST_CASE("[String] sprintf") { format = "fish %-011f frog"; args.clear(); args.push_back(-99.99); + ERR_PRINT_OFF; // Silence warning about 0 ignored. output = format.sprintf(args, &error); + ERR_PRINT_ON; REQUIRE(error == false); CHECK(output == String("fish -99.990000 frog")); diff --git a/tests/core/templates/test_hash_set.h b/tests/core/templates/test_hash_set.h index 3b9a800641..dad149604b 100644 --- a/tests/core/templates/test_hash_set.h +++ b/tests/core/templates/test_hash_set.h @@ -38,7 +38,6 @@ namespace TestHashSet { TEST_CASE("[HashSet] Insert element") { - print_line("SMALL BEGIN MEM: ", Memory::get_mem_usage()); HashSet<int> set; HashSet<int>::Iterator e = set.insert(42); @@ -47,7 +46,6 @@ TEST_CASE("[HashSet] Insert element") { CHECK(set.has(42)); CHECK(set.find(42)); set.reset(); - print_line("SMALL END MEM: ", Memory::get_mem_usage()); } TEST_CASE("[HashSet] Insert existing element") { diff --git a/tests/core/templates/test_rid.h b/tests/core/templates/test_rid.h new file mode 100644 index 0000000000..8d4dd0703b --- /dev/null +++ b/tests/core/templates/test_rid.h @@ -0,0 +1,101 @@ +/*************************************************************************/ +/* test_rid.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_RID_H +#define TEST_RID_H + +#include "core/templates/rid.h" + +#include "tests/test_macros.h" + +namespace TestRID { +TEST_CASE("[RID] Default Constructor") { + RID rid; + + CHECK(rid.get_id() == 0); +} + +TEST_CASE("[RID] Factory method") { + RID rid = RID::from_uint64(1); + + CHECK(rid.get_id() == 1); +} + +TEST_CASE("[RID] Operators") { + RID rid = RID::from_uint64(1); + + RID rid_zero = RID::from_uint64(0); + RID rid_one = RID::from_uint64(1); + RID rid_two = RID::from_uint64(2); + + CHECK_FALSE(rid == rid_zero); + CHECK(rid == rid_one); + CHECK_FALSE(rid == rid_two); + + CHECK_FALSE(rid < rid_zero); + CHECK_FALSE(rid < rid_one); + CHECK(rid < rid_two); + + CHECK_FALSE(rid <= rid_zero); + CHECK(rid <= rid_one); + CHECK(rid <= rid_two); + + CHECK(rid > rid_zero); + CHECK_FALSE(rid > rid_one); + CHECK_FALSE(rid > rid_two); + + CHECK(rid >= rid_zero); + CHECK(rid >= rid_one); + CHECK_FALSE(rid >= rid_two); + + CHECK(rid != rid_zero); + CHECK_FALSE(rid != rid_one); + CHECK(rid != rid_two); +} + +TEST_CASE("[RID] 'is_valid' & 'is_null'") { + RID rid_zero = RID::from_uint64(0); + RID rid_one = RID::from_uint64(1); + + CHECK_FALSE(rid_zero.is_valid()); + CHECK(rid_zero.is_null()); + + CHECK(rid_one.is_valid()); + CHECK_FALSE(rid_one.is_null()); +} + +TEST_CASE("[RID] 'get_local_index'") { + CHECK(RID::from_uint64(1).get_local_index() == 1); + CHECK(RID::from_uint64(4'294'967'295).get_local_index() == 4'294'967'295); + CHECK(RID::from_uint64(4'294'967'297).get_local_index() == 1); +} +} // namespace TestRID + +#endif // TEST_RID_H diff --git a/tests/core/templates/test_vector.h b/tests/core/templates/test_vector.h index f27d6a332e..3fc9264f5a 100644 --- a/tests/core/templates/test_vector.h +++ b/tests/core/templates/test_vector.h @@ -291,8 +291,10 @@ TEST_CASE("[Vector] Slice") { CHECK(slice6[1] == 3); CHECK(slice6[2] == 4); + ERR_PRINT_OFF; Vector<int> slice7 = vector.slice(5, 1); - CHECK(slice7.size() == 0); + CHECK(slice7.size() == 0); // Expected to fail. + ERR_PRINT_ON; } TEST_CASE("[Vector] Find, has") { diff --git a/tests/scene/test_audio_stream_wav.h b/tests/scene/test_audio_stream_wav.h new file mode 100644 index 0000000000..92c524525c --- /dev/null +++ b/tests/scene/test_audio_stream_wav.h @@ -0,0 +1,243 @@ +/*************************************************************************/ +/* test_audio_stream_wav.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_AUDIO_STREAM_WAV_H +#define TEST_AUDIO_STREAM_WAV_H + +#include "core/math/math_defs.h" +#include "core/math/math_funcs.h" +#include "scene/resources/audio_stream_wav.h" + +#include "tests/test_macros.h" + +#ifdef TOOLS_ENABLED +#include "core/io/resource_loader.h" +#include "editor/import/resource_importer_wav.h" +#endif + +namespace TestAudioStreamWAV { + +// Default wav rate for test cases. +constexpr float WAV_RATE = 44100; +/* Default wav count for test cases. 1 second of audio is used so that the file can be listened +to manually if needed. */ +constexpr int WAV_COUNT = WAV_RATE; + +float gen_wav(float frequency, float wav_rate, int wav_number) { + // formula for generating a sin wave with given frequency. + return Math::sin((Math_TAU * frequency / wav_rate) * wav_number); +} + +/* Generates a 440Hz sin wave in channel 0 (mono channel or left stereo channel) + * and a 261.63Hz wave in channel 1 (right stereo channel). + * These waves correspond to the music notes A4 and C4 respectively. + */ +Vector<uint8_t> gen_pcm8_test(float wav_rate, int wav_count, bool stereo) { + Vector<uint8_t> buffer; + buffer.resize(stereo ? wav_count * 2 : wav_count); + + uint8_t *write_ptr = buffer.ptrw(); + for (int i = 0; i < buffer.size(); i++) { + float wav; + if (stereo) { + if (i % 2 == 0) { + wav = gen_wav(440, wav_rate, i / 2); + } else { + wav = gen_wav(261.63, wav_rate, i / 2); + } + } else { + wav = gen_wav(440, wav_rate, i); + } + + // Map sin wave to full range of 8-bit values. + uint8_t wav_8bit = Math::fast_ftoi(((wav + 1) / 2) * UINT8_MAX); + // Unlike the .wav format, AudioStreamWAV expects signed 8-bit wavs. + uint8_t wav_8bit_signed = wav_8bit - (INT8_MAX + 1); + write_ptr[i] = wav_8bit_signed; + } + + return buffer; +} + +// Same as gen_pcm8_test but with 16-bit wavs. +Vector<uint8_t> gen_pcm16_test(float wav_rate, int wav_count, bool stereo) { + Vector<uint8_t> buffer; + buffer.resize(stereo ? wav_count * 4 : wav_count * 2); + + uint8_t *write_ptr = buffer.ptrw(); + for (int i = 0; i < buffer.size() / 2; i++) { + float wav; + if (stereo) { + if (i % 2 == 0) { + wav = gen_wav(440, wav_rate, i / 2); + } else { + wav = gen_wav(261.63, wav_rate, i / 2); + } + } else { + wav = gen_wav(440, wav_rate, i); + } + + // Map sin wave to full range of 16-bit values. + uint16_t wav_16bit = Math::fast_ftoi(((wav + 1) / 2) * UINT16_MAX); + // The .wav format expects wavs larger than 8 bits to be signed. + uint16_t wav_16bit_signed = wav_16bit - (INT16_MAX + 1); + encode_uint16(wav_16bit_signed, write_ptr + (i * 2)); + } + + return buffer; +} + +void run_test(String file_name, AudioStreamWAV::Format data_format, bool stereo, float wav_rate, float wav_count) { + String save_path = OS::get_singleton()->get_cache_path().plus_file(file_name); + + Vector<uint8_t> test_data; + if (data_format == AudioStreamWAV::FORMAT_8_BITS) { + test_data = gen_pcm8_test(wav_rate, wav_count, stereo); + } else { + test_data = gen_pcm16_test(wav_rate, wav_count, stereo); + } + + Ref<AudioStreamWAV> stream = memnew(AudioStreamWAV); + stream->set_mix_rate(wav_rate); + CHECK(stream->get_mix_rate() == wav_rate); + + stream->set_format(data_format); + CHECK(stream->get_format() == data_format); + + stream->set_stereo(stereo); + CHECK(stream->is_stereo() == stereo); + + stream->set_data(test_data); + CHECK(stream->get_data() == test_data); + + SUBCASE("Stream length is computed properly") { + CHECK(Math::is_equal_approx(stream->get_length(), wav_count / wav_rate)); + } + + SUBCASE("Stream can be saved as .wav") { + REQUIRE(stream->save_to_wav(save_path) == OK); + + Error error; + Ref<FileAccess> wav_file = FileAccess::open(save_path, FileAccess::READ, &error); + REQUIRE(error == OK); + +#if TOOLS_ENABLED + // The WAV importer can be used if enabled to check that the saved file is valid. + Ref<ResourceImporterWAV> wav_importer = memnew(ResourceImporterWAV); + + List<ResourceImporter::ImportOption> options_list; + wav_importer->get_import_options("", &options_list); + + HashMap<StringName, Variant> options_map; + for (const ResourceImporter::ImportOption &E : options_list) { + options_map[E.option.name] = E.default_value; + } + + REQUIRE(wav_importer->import(save_path, save_path, options_map, nullptr) == OK); + + String load_path = save_path + "." + wav_importer->get_save_extension(); + Ref<AudioStreamWAV> loaded_stream = ResourceLoader::load(load_path, "AudioStreamWAV", ResourceFormatImporter::CACHE_MODE_IGNORE, &error); + REQUIRE(error == OK); + + CHECK(loaded_stream->get_format() == stream->get_format()); + CHECK(loaded_stream->get_loop_mode() == stream->get_loop_mode()); + CHECK(loaded_stream->get_loop_begin() == stream->get_loop_begin()); + CHECK(loaded_stream->get_loop_end() == stream->get_loop_end()); + CHECK(loaded_stream->get_mix_rate() == stream->get_mix_rate()); + CHECK(loaded_stream->is_stereo() == stream->is_stereo()); + CHECK(loaded_stream->get_length() == stream->get_length()); + CHECK(loaded_stream->is_monophonic() == stream->is_monophonic()); + CHECK(loaded_stream->get_data() == stream->get_data()); +#endif + } +} + +TEST_CASE("[AudioStreamWAV] Mono PCM8 format") { + run_test("test_pcm8_mono.wav", AudioStreamWAV::FORMAT_8_BITS, false, WAV_RATE, WAV_COUNT); +} + +TEST_CASE("[AudioStreamWAV] Mono PCM16 format") { + run_test("test_pcm16_mono.wav", AudioStreamWAV::FORMAT_16_BITS, false, WAV_RATE, WAV_COUNT); +} + +TEST_CASE("[AudioStreamWAV] Stereo PCM8 format") { + run_test("test_pcm8_stereo.wav", AudioStreamWAV::FORMAT_8_BITS, true, WAV_RATE, WAV_COUNT); +} + +TEST_CASE("[AudioStreamWAV] Stereo PCM16 format") { + run_test("test_pcm16_stereo.wav", AudioStreamWAV::FORMAT_16_BITS, true, WAV_RATE, WAV_COUNT); +} + +TEST_CASE("[AudioStreamWAV] Alternate mix rate") { + run_test("test_pcm16_stereo_38000Hz.wav", AudioStreamWAV::FORMAT_16_BITS, true, 38000, 38000); +} + +TEST_CASE("[AudioStreamWAV] save_to_wav() adds '.wav' file extension automatically") { + String save_path = OS::get_singleton()->get_cache_path().plus_file("test_wav_extension"); + Vector<uint8_t> test_data = gen_pcm8_test(WAV_RATE, WAV_COUNT, false); + Ref<AudioStreamWAV> stream = memnew(AudioStreamWAV); + stream->set_data(test_data); + + REQUIRE(stream->save_to_wav(save_path) == OK); + Error error; + Ref<FileAccess> wav_file = FileAccess::open(save_path + ".wav", FileAccess::READ, &error); + CHECK(error == OK); +} + +TEST_CASE("[AudioStreamWAV] Default values") { + Ref<AudioStreamWAV> stream = memnew(AudioStreamWAV); + CHECK(stream->get_format() == AudioStreamWAV::FORMAT_8_BITS); + CHECK(stream->get_loop_mode() == AudioStreamWAV::LOOP_DISABLED); + CHECK(stream->get_loop_begin() == 0); + CHECK(stream->get_loop_end() == 0); + CHECK(stream->get_mix_rate() == 44100); + CHECK(stream->is_stereo() == false); + CHECK(stream->get_length() == 0); + CHECK(stream->is_monophonic() == false); + CHECK(stream->get_data() == Vector<uint8_t>{}); + CHECK(stream->get_stream_name() == ""); +} + +TEST_CASE("[AudioStreamWAV] Save empty file") { + run_test("test_empty.wav", AudioStreamWAV::FORMAT_8_BITS, false, WAV_RATE, 0); +} + +TEST_CASE("[AudioStreamWAV] Saving IMA ADPCM is not supported") { + String save_path = OS::get_singleton()->get_cache_path().plus_file("test_adpcm.wav"); + Ref<AudioStreamWAV> stream = memnew(AudioStreamWAV); + stream->set_format(AudioStreamWAV::FORMAT_IMA_ADPCM); + ERR_PRINT_OFF; + CHECK(stream->save_to_wav(save_path) == ERR_UNAVAILABLE); + ERR_PRINT_ON; +} + +} // namespace TestAudioStreamWAV + +#endif // TEST_AUDIO_STREAM_WAV_H diff --git a/tests/scene/test_sprite_frames.h b/tests/scene/test_sprite_frames.h new file mode 100644 index 0000000000..61bbd16493 --- /dev/null +++ b/tests/scene/test_sprite_frames.h @@ -0,0 +1,247 @@ +/*************************************************************************/ +/* test_sprite_frames.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef TEST_SPRITE_FRAMES_H +#define TEST_SPRITE_FRAMES_H + +#include "scene/resources/sprite_frames.h" + +#include "tests/test_macros.h" + +namespace TestSpriteFrames { +const String test_animation_name = "GodotTest"; + +TEST_CASE("[SpriteFrames] Constructor methods") { + const SpriteFrames frames; + CHECK_MESSAGE( + frames.get_animation_names().size() == 1, + "Should be initialized with 1 entry."); + CHECK_MESSAGE( + frames.get_animation_names().get(0) == "default", + "Should be initialized with default entry."); +} + +TEST_CASE("[SpriteFrames] Animation addition, list getter, renaming, removal, and retrieval") { + SpriteFrames frames; + Vector<String> test_names = { "default", "2", "1", "3" }; + + // "default" is there already + frames.add_animation("2"); + frames.add_animation("1"); + frames.add_animation("3"); + + for (int i = 0; i < test_names.size(); i++) { + CHECK_MESSAGE( + frames.has_animation(test_names[i]), + "Add animation properly worked for each value"); + } + + CHECK_MESSAGE( + !frames.has_animation("999"), + "Return false when checking for animation that does not exist"); + + List<StringName> sname_list; + frames.get_animation_list(&sname_list); + + CHECK_MESSAGE( + sname_list.size() == test_names.size(), + "StringName List getter returned list of expected size"); + + for (int i = 0; i < test_names.size(); i++) { + CHECK_MESSAGE( + sname_list[i] == StringName(test_names[i]), + "StringName List getter returned expected values"); + } + + // get_animation_names() sorts the results. + Vector<String> string_vector = frames.get_animation_names(); + test_names.sort(); + + for (int i = 0; i < test_names.size(); i++) { + CHECK_MESSAGE( + string_vector[i] == test_names[i], + "String Vector getter returned expected values"); + } + + // These error handling cases should not crash. + ERR_PRINT_OFF; + frames.rename_animation("This does not exist", "0"); + ERR_PRINT_ON; + + CHECK_MESSAGE( + !frames.has_animation("0"), + "Correctly handles rename error when entry does not exist"); + + // These error handling cases should not crash. + ERR_PRINT_OFF; + frames.rename_animation("3", "1"); + ERR_PRINT_ON; + + CHECK_MESSAGE( + frames.has_animation("3"), + "Correctly handles rename error when entry exists, but new name already exists"); + + ERR_PRINT_OFF; + frames.add_animation("1"); + ERR_PRINT_ON; + + CHECK_MESSAGE( + frames.get_animation_names().size() == 4, + "Correctly does not add when entry already exists"); + + frames.rename_animation("3", "9"); + + CHECK_MESSAGE( + frames.has_animation("9"), + "Animation renamed correctly"); + + frames.remove_animation("9"); + + CHECK_MESSAGE( + !frames.has_animation("9"), + "Animation removed correctly"); + + frames.clear_all(); + + CHECK_MESSAGE( + frames.get_animation_names().size() == 1, + "Clear all removed all animations and re-added the default animation entry"); +} + +TEST_CASE("[SpriteFrames] Animation Speed getter and setter") { + SpriteFrames frames; + + frames.add_animation(test_animation_name); + + CHECK_MESSAGE( + frames.get_animation_speed(test_animation_name) == 5.0, + "Sets new animation to default speed"); + + frames.set_animation_speed(test_animation_name, 123.0004); + + CHECK_MESSAGE( + frames.get_animation_speed(test_animation_name) == 123.0004, + "Sets animation to positive double"); + + // These error handling cases should not crash. + ERR_PRINT_OFF; + frames.get_animation_speed("This does not exist"); + frames.set_animation_speed("This does not exist", 100); + frames.set_animation_speed(test_animation_name, -999.999); + ERR_PRINT_ON; + + CHECK_MESSAGE( + frames.get_animation_speed(test_animation_name) == 123.0004, + "Prevents speed of animation being set to a negative value"); + + frames.set_animation_speed(test_animation_name, 0.0); + + CHECK_MESSAGE( + frames.get_animation_speed(test_animation_name) == 0.0, + "Sets animation to zero"); +} + +TEST_CASE("[SpriteFrames] Animation Loop getter and setter") { + SpriteFrames frames; + + frames.add_animation(test_animation_name); + + CHECK_MESSAGE( + frames.get_animation_loop(test_animation_name), + "Sets new animation to default loop value."); + + frames.set_animation_loop(test_animation_name, true); + + CHECK_MESSAGE( + frames.get_animation_loop(test_animation_name), + "Sets animation loop to true"); + + frames.set_animation_loop(test_animation_name, false); + + CHECK_MESSAGE( + !frames.get_animation_loop(test_animation_name), + "Sets animation loop to false"); + + // These error handling cases should not crash. + ERR_PRINT_OFF; + frames.get_animation_loop("This does not exist"); + frames.set_animation_loop("This does not exist", false); + ERR_PRINT_ON; +} + +// TODO +TEST_CASE("[SpriteFrames] Frame addition, removal, and retrieval") { + Ref<Texture2D> dummy_frame1; + dummy_frame1.instantiate(); + + SpriteFrames frames; + frames.add_animation(test_animation_name); + frames.add_animation("1"); + frames.add_animation("2"); + + CHECK_MESSAGE( + frames.get_frame_count(test_animation_name) == 0, + "Animation has a default frame count of 0"); + + frames.add_frame(test_animation_name, dummy_frame1, 0); + frames.add_frame(test_animation_name, dummy_frame1, 1); + frames.add_frame(test_animation_name, dummy_frame1, 2); + + CHECK_MESSAGE( + frames.get_frame_count(test_animation_name) == 3, + "Adds multiple frames"); + + frames.remove_frame(test_animation_name, 1); + frames.remove_frame(test_animation_name, 0); + + CHECK_MESSAGE( + frames.get_frame_count(test_animation_name) == 1, + "Removes multiple frames"); + + // These error handling cases should not crash. + ERR_PRINT_OFF; + frames.add_frame("does not exist", dummy_frame1, 0); + frames.remove_frame(test_animation_name, -99); + frames.remove_frame("does not exist", 0); + ERR_PRINT_ON; + + CHECK_MESSAGE( + frames.get_frame_count(test_animation_name) == 1, + "Handles bad values when adding or removing frames."); + + frames.clear(test_animation_name); + + CHECK_MESSAGE( + frames.get_frame_count(test_animation_name) == 0, + "Clears frames."); +} +} // namespace TestSpriteFrames + +#endif // TEST_SPRITE_FRAMES_H diff --git a/tests/scene/test_theme.h b/tests/scene/test_theme.h index f7cfa0fd5b..f5b21eec32 100644 --- a/tests/scene/test_theme.h +++ b/tests/scene/test_theme.h @@ -101,18 +101,24 @@ TEST_CASE_FIXTURE(Fixture, "[Theme] Good theme type names") { SUBCASE("set_type_variation") { for (const StringName &name : names) { + if (name == StringName()) { // Skip empty here, not allowed. + continue; + } Ref<Theme> theme = memnew(Theme); ErrorDetector ed; theme->set_type_variation(valid_type_name, name); - CHECK(ed.has_error == (name == StringName())); + CHECK_FALSE(ed.has_error); } for (const StringName &name : names) { + if (name == StringName()) { // Skip empty here, not allowed. + continue; + } Ref<Theme> theme = memnew(Theme); ErrorDetector ed; theme->set_type_variation(name, valid_type_name); - CHECK(ed.has_error == (name == StringName())); + CHECK_FALSE(ed.has_error); } } } @@ -125,6 +131,8 @@ TEST_CASE_FIXTURE(Fixture, "[Theme] Bad theme type names") { String::utf8("contains_汉å—"), }; + ERR_PRINT_OFF; // All these rightfully print errors. + SUBCASE("add_type") { for (const StringName &name : names) { Ref<Theme> theme = memnew(Theme); @@ -175,6 +183,8 @@ TEST_CASE_FIXTURE(Fixture, "[Theme] Bad theme type names") { CHECK(ed.has_error); } } + + ERR_PRINT_ON; } TEST_CASE_FIXTURE(Fixture, "[Theme] Good theme item names") { @@ -223,6 +233,8 @@ TEST_CASE_FIXTURE(Fixture, "[Theme] Bad theme item names") { String::utf8("contains_汉å—"), }; + ERR_PRINT_OFF; // All these rightfully print errors. + SUBCASE("set_theme_item") { for (const StringName &name : names) { for (const DataEntry &entry : valid_data) { @@ -250,6 +262,8 @@ TEST_CASE_FIXTURE(Fixture, "[Theme] Bad theme item names") { } } } + + ERR_PRINT_ON; } } // namespace TestTheme diff --git a/tests/servers/test_text_server.h b/tests/servers/test_text_server.h index 57a2cae37f..9ebd0f34b4 100644 --- a/tests/servers/test_text_server.h +++ b/tests/servers/test_text_server.h @@ -44,7 +44,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Loading fonts") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC)) { continue; @@ -52,7 +52,7 @@ TEST_SUITE("[TextServer]") { RID font = ts->create_font(); ts->font_set_data_ptr(font, _font_NotoSans_Regular, _font_NotoSans_Regular_size); - TEST_FAIL_COND(font == RID(), "Loading font failed."); + CHECK_FALSE_MESSAGE(font == RID(), "Loading font failed."); ts->free_rid(font); } } @@ -60,7 +60,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Text layout: Font fallback") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) { continue; @@ -79,26 +79,26 @@ TEST_SUITE("[TextServer]") { // 6^ 17^ RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size == 0, "Shaping failed"); + CHECK_FALSE_MESSAGE(gl_size == 0, "Shaping failed"); for (int j = 0; j < gl_size; j++) { if (glyphs[j].start < 6) { - TEST_FAIL_COND(glyphs[j].font_rid != font[1], "Incorrect font selected."); + CHECK_FALSE_MESSAGE(glyphs[j].font_rid != font[1], "Incorrect font selected."); } if ((glyphs[j].start > 6) && (glyphs[j].start < 16)) { - TEST_FAIL_COND(glyphs[j].font_rid != font[0], "Incorrect font selected."); + CHECK_FALSE_MESSAGE(glyphs[j].font_rid != font[0], "Incorrect font selected."); } if (glyphs[j].start > 16) { - TEST_FAIL_COND(glyphs[j].font_rid != RID(), "Incorrect font selected."); - TEST_FAIL_COND(glyphs[j].index != test[glyphs[j].start], "Incorrect glyph index."); + CHECK_FALSE_MESSAGE(glyphs[j].font_rid != RID(), "Incorrect font selected."); + CHECK_FALSE_MESSAGE(glyphs[j].index != test[glyphs[j].start], "Incorrect glyph index."); } - TEST_FAIL_COND((glyphs[j].start < 0 || glyphs[j].end > test.length()), "Incorrect glyph range."); - TEST_FAIL_COND(glyphs[j].font_size != 16, "Incorrect glyph font size."); + CHECK_FALSE_MESSAGE((glyphs[j].start < 0 || glyphs[j].end > test.length()), "Incorrect glyph range."); + CHECK_FALSE_MESSAGE(glyphs[j].font_size != 16, "Incorrect glyph font size."); } ts->free_rid(ctx); @@ -113,7 +113,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Text layout: BiDi") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_BIDI_LAYOUT)) { continue; @@ -132,23 +132,23 @@ TEST_SUITE("[TextServer]") { // 7^ 26^ RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size == 0, "Shaping failed"); + CHECK_FALSE_MESSAGE(gl_size == 0, "Shaping failed"); for (int j = 0; j < gl_size; j++) { if (glyphs[j].count > 0) { if (glyphs[j].start < 7) { - TEST_FAIL_COND(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) == TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); + CHECK_FALSE_MESSAGE(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) == TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); } if ((glyphs[j].start > 8) && (glyphs[j].start < 23)) { - TEST_FAIL_COND(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) != TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); + CHECK_FALSE_MESSAGE(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) != TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); } if (glyphs[j].start > 26) { - TEST_FAIL_COND(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) == TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); + CHECK_FALSE_MESSAGE(((glyphs[j].flags & TextServer::GRAPHEME_IS_RTL) == TextServer::GRAPHEME_IS_RTL), "Incorrect direction."); } } } @@ -165,7 +165,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Text layout: Line break and align points") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) { continue; @@ -186,16 +186,16 @@ TEST_SUITE("[TextServer]") { { String test = U"Test test long text long text\n"; RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); ts->shaped_text_update_breaks(ctx); ts->shaped_text_update_justification_ops(ctx); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 30, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 30, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -203,11 +203,11 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 4 || j == 9 || j == 14 || j == 19 || j == 24) { - TEST_FAIL_COND((!soft || !space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((!soft || !space || hard || virt || elo), "Invalid glyph flags."); } else if (j == 29) { - TEST_FAIL_COND((soft || !space || !hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || !space || !hard || virt || elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } ts->free_rid(ctx); @@ -216,21 +216,63 @@ TEST_SUITE("[TextServer]") { { String test = U"الØمـد"; RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); ts->shaped_text_update_breaks(ctx); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 6, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 6, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; bool space = (glyphs[j].flags & TextServer::GRAPHEME_IS_SPACE) == TextServer::GRAPHEME_IS_SPACE; bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); + } + if (ts->has_feature(TextServer::FEATURE_KASHIDA_JUSTIFICATION)) { + ts->shaped_text_update_justification_ops(ctx); + + glyphs = ts->shaped_text_get_glyphs(ctx); + gl_size = ts->shaped_text_get_glyph_count(ctx); + + CHECK_FALSE_MESSAGE(gl_size != 6, "Invalid glyph count."); + for (int j = 0; j < gl_size; j++) { + bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; + bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; + bool space = (glyphs[j].flags & TextServer::GRAPHEME_IS_SPACE) == TextServer::GRAPHEME_IS_SPACE; + bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; + bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; + if (j == 1) { + CHECK_FALSE_MESSAGE((soft || space || hard || virt || !elo), "Invalid glyph flags."); + } else { + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); + } + } + } + ts->free_rid(ctx); + } + + { + String test = U"الØمد"; + RID ctx = ts->create_shaped_text(); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); + bool ok = ts->shaped_text_add_string(ctx, test, font, 16); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); + ts->shaped_text_update_breaks(ctx); + + const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); + int gl_size = ts->shaped_text_get_glyph_count(ctx); + CHECK_FALSE_MESSAGE(gl_size != 5, "Invalid glyph count."); + for (int j = 0; j < gl_size; j++) { + bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; + bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; + bool space = (glyphs[j].flags & TextServer::GRAPHEME_IS_SPACE) == TextServer::GRAPHEME_IS_SPACE; + bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; + bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } if (ts->has_feature(TextServer::FEATURE_KASHIDA_JUSTIFICATION)) { @@ -239,7 +281,7 @@ TEST_SUITE("[TextServer]") { glyphs = ts->shaped_text_get_glyphs(ctx); gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 6, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 6, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -247,9 +289,9 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 1) { - TEST_FAIL_COND((soft || space || hard || virt || !elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || !virt || !elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } } @@ -259,15 +301,15 @@ TEST_SUITE("[TextServer]") { { String test = U"الØمـد الرياضي العربي"; RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); ts->shaped_text_update_breaks(ctx); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 21, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 21, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -275,9 +317,9 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 6 || j == 14) { - TEST_FAIL_COND((!soft || !space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((!soft || !space || hard || virt || elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } @@ -287,7 +329,7 @@ TEST_SUITE("[TextServer]") { glyphs = ts->shaped_text_get_glyphs(ctx); gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 23, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 23, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -295,13 +337,13 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 7 || j == 16) { - TEST_FAIL_COND((!soft || !space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((!soft || !space || hard || virt || elo), "Invalid glyph flags."); } else if (j == 3 || j == 9) { - TEST_FAIL_COND((soft || space || hard || !virt || !elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || !virt || !elo), "Invalid glyph flags."); } else if (j == 18) { - TEST_FAIL_COND((soft || space || hard || virt || !elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || !elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } } @@ -312,16 +354,16 @@ TEST_SUITE("[TextServer]") { { String test = U"เป็น ภาษา ราชà¸à¸²à¸£ à¹à¸¥à¸° ภาษา"; RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); ts->shaped_text_update_breaks(ctx); ts->shaped_text_update_justification_ops(ctx); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 25, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 25, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -329,9 +371,9 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 4 || j == 9 || j == 16 || j == 20) { - TEST_FAIL_COND((!soft || !space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((!soft || !space || hard || virt || elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } ts->free_rid(ctx); @@ -340,16 +382,16 @@ TEST_SUITE("[TextServer]") { if (ts->has_feature(TextServer::FEATURE_BREAK_ITERATORS)) { String test = U"เป็นภาษาราชà¸à¸²à¸£à¹à¸¥à¸°à¸ าษา"; RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); ts->shaped_text_update_breaks(ctx); ts->shaped_text_update_justification_ops(ctx); const Glyph *glyphs = ts->shaped_text_get_glyphs(ctx); int gl_size = ts->shaped_text_get_glyph_count(ctx); - TEST_FAIL_COND(gl_size != 25, "Invalid glyph count."); + CHECK_FALSE_MESSAGE(gl_size != 25, "Invalid glyph count."); for (int j = 0; j < gl_size; j++) { bool hard = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_HARD) == TextServer::GRAPHEME_IS_BREAK_HARD; bool soft = (glyphs[j].flags & TextServer::GRAPHEME_IS_BREAK_SOFT) == TextServer::GRAPHEME_IS_BREAK_SOFT; @@ -357,9 +399,9 @@ TEST_SUITE("[TextServer]") { bool virt = (glyphs[j].flags & TextServer::GRAPHEME_IS_VIRTUAL) == TextServer::GRAPHEME_IS_VIRTUAL; bool elo = (glyphs[j].flags & TextServer::GRAPHEME_IS_ELONGATION) == TextServer::GRAPHEME_IS_ELONGATION; if (j == 4 || j == 9 || j == 16 || j == 20) { - TEST_FAIL_COND((!soft || !space || hard || !virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((!soft || !space || hard || !virt || elo), "Invalid glyph flags."); } else { - TEST_FAIL_COND((soft || space || hard || virt || elo), "Invalid glyph flags."); + CHECK_FALSE_MESSAGE((soft || space || hard || virt || elo), "Invalid glyph flags."); } } ts->free_rid(ctx); @@ -375,7 +417,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Text layout: Line breaking") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) { continue; @@ -394,21 +436,21 @@ TEST_SUITE("[TextServer]") { font.push_back(font2); RID ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); bool ok = ts->shaped_text_add_string(ctx, test_1, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); PackedInt32Array brks = ts->shaped_text_get_line_breaks(ctx, 1); - TEST_FAIL_COND(brks.size() != 6, "Invalid line breaks number."); + CHECK_FALSE_MESSAGE(brks.size() != 6, "Invalid line breaks number."); if (brks.size() == 6) { - TEST_FAIL_COND(brks[0] != 0, "Invalid line break position."); - TEST_FAIL_COND(brks[1] != 5, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[0] != 0, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[1] != 5, "Invalid line break position."); - TEST_FAIL_COND(brks[2] != 5, "Invalid line break position."); - TEST_FAIL_COND(brks[3] != 10, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[2] != 5, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[3] != 10, "Invalid line break position."); - TEST_FAIL_COND(brks[4] != 10, "Invalid line break position."); - TEST_FAIL_COND(brks[5] != 14, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[4] != 10, "Invalid line break position."); + CHECK_FALSE_MESSAGE(brks[5] != 14, "Invalid line break position."); } ts->free_rid(ctx); @@ -423,7 +465,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Text layout: Justification") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (!ts->has_feature(TextServer::FEATURE_FONT_DYNAMIC) || !ts->has_feature(TextServer::FEATURE_SIMPLE_LAYOUT)) { continue; @@ -448,40 +490,40 @@ TEST_SUITE("[TextServer]") { float width_old, width; if (ts->has_feature(TextServer::FEATURE_KASHIDA_JUSTIFICATION)) { ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); ok = ts->shaped_text_add_string(ctx, test_1, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); width_old = ts->shaped_text_get_width(ctx); width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND); - TEST_FAIL_COND((width != width_old), "Invalid fill width."); + CHECK_FALSE_MESSAGE((width != width_old), "Invalid fill width."); width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA); - TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width."); + CHECK_FALSE_MESSAGE((width <= width_old || width > 100), "Invalid fill width."); ts->free_rid(ctx); ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); ok = ts->shaped_text_add_string(ctx, test_2, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); width_old = ts->shaped_text_get_width(ctx); width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND); - TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width."); + CHECK_FALSE_MESSAGE((width <= width_old || width > 100), "Invalid fill width."); width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND | TextServer::JUSTIFICATION_KASHIDA); - TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width."); + CHECK_FALSE_MESSAGE((width <= width_old || width > 100), "Invalid fill width."); ts->free_rid(ctx); } ctx = ts->create_shaped_text(); - TEST_FAIL_COND(ctx == RID(), "Creating text buffer failed."); + CHECK_FALSE_MESSAGE(ctx == RID(), "Creating text buffer failed."); ok = ts->shaped_text_add_string(ctx, test_3, font, 16); - TEST_FAIL_COND(!ok, "Adding text to the buffer failed."); + CHECK_FALSE_MESSAGE(!ok, "Adding text to the buffer failed."); width_old = ts->shaped_text_get_width(ctx); width = ts->shaped_text_fit_to_width(ctx, 100, TextServer::JUSTIFICATION_WORD_BOUND); - TEST_FAIL_COND((width <= width_old || width > 100), "Invalid fill width."); + CHECK_FALSE_MESSAGE((width <= width_old || width > 100), "Invalid fill width."); ts->free_rid(ctx); @@ -495,7 +537,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Unicode identifiers") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); static const char32_t *data[19] = { U"-30", U"100", U"10.1", U"10,1", U"1e2", U"1e-2", U"1e2e3", U"0xAB", U"AB", U"Test1", U"1Test", U"Test*1", U"test_testeT", U"test_tes teT", U"عَلَيْكÙمْ", U"عَلَيْكÙمْTest", U"Ó’Ó–ÓšÓœ", U"_test", U"ÂÃÄÅĀĂĄÇĆĈĊ" }; static bool isid[19] = { false, false, false, false, false, false, false, false, true, true, false, false, true, false, true, true, true, true, true }; @@ -516,7 +558,7 @@ TEST_SUITE("[TextServer]") { SUBCASE("[TextServer] Strip Diacritics") { for (int i = 0; i < TextServerManager::get_singleton()->get_interface_count(); i++) { Ref<TextServer> ts = TextServerManager::get_singleton()->get_interface(i); - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); if (ts->has_feature(TextServer::FEATURE_SHAPING)) { CHECK(ts->strip_diacritics(U"ٱلسَّلَام٠عَلَيْكÙمْ") == U"ٱلسلام عليكم"); @@ -544,7 +586,7 @@ TEST_SUITE("[TextServer]") { continue; } - TEST_FAIL_COND(ts.is_null(), "Invalid TS interface."); + CHECK_FALSE_MESSAGE(ts.is_null(), "Invalid TS interface."); { String text1 = U"linguistically similar and effectively form"; // 14^ 22^ 26^ 38^ diff --git a/tests/test_main.cpp b/tests/test_main.cpp index d533ce4f63..628b9cbc3c 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -30,6 +30,8 @@ #include "test_main.h" +#include "tests/core/input/test_input_event_key.h" +#include "tests/core/input/test_shortcut.h" #include "tests/core/io/test_config_file.h" #include "tests/core/io/test_file_access.h" #include "tests/core/io/test_image.h" @@ -46,6 +48,7 @@ #include "tests/core/math/test_geometry_2d.h" #include "tests/core/math/test_geometry_3d.h" #include "tests/core/math/test_plane.h" +#include "tests/core/math/test_quaternion.h" #include "tests/core/math/test_random_number_generator.h" #include "tests/core/math/test_rect2.h" #include "tests/core/math/test_rect2i.h" @@ -69,6 +72,7 @@ #include "tests/core/templates/test_local_vector.h" #include "tests/core/templates/test_lru.h" #include "tests/core/templates/test_paged_array.h" +#include "tests/core/templates/test_rid.h" #include "tests/core/templates/test_vector.h" #include "tests/core/test_crypto.h" #include "tests/core/test_hashing_context.h" @@ -78,10 +82,12 @@ #include "tests/core/variant/test_dictionary.h" #include "tests/core/variant/test_variant.h" #include "tests/scene/test_animation.h" +#include "tests/scene/test_audio_stream_wav.h" #include "tests/scene/test_code_edit.h" #include "tests/scene/test_curve.h" #include "tests/scene/test_gradient.h" #include "tests/scene/test_path_3d.h" +#include "tests/scene/test_sprite_frames.h" #include "tests/scene/test_text_edit.h" #include "tests/scene/test_theme.h" #include "tests/servers/test_text_server.h" @@ -215,6 +221,15 @@ struct GodotTestCaseListener : public doctest::IReporter { SceneTree::get_singleton()->initialize(); return; } + + if (name.find("Audio") != -1) { + // The last driver index should always be the dummy driver. + int dummy_idx = AudioDriverManager::get_driver_count() - 1; + AudioDriverManager::initialize(dummy_idx); + AudioServer *audio_server = memnew(AudioServer); + audio_server->init(); + return; + } } void test_case_end(const doctest::CurrentTestCaseStats &) override { @@ -277,6 +292,11 @@ struct GodotTestCaseListener : public doctest::IReporter { MessageQueue::get_singleton()->flush(); memdelete(MessageQueue::get_singleton()); } + + if (AudioServer::get_singleton()) { + AudioServer::get_singleton()->finish(); + memdelete(AudioServer::get_singleton()); + } } void test_run_start() override { diff --git a/thirdparty/README.md b/thirdparty/README.md index 6db011d3c6..009e56be00 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -44,7 +44,7 @@ Files extracted from upstream source: ## certs - Upstream: Mozilla, via https://github.com/bagder/ca-bundle -- Version: git (8b263a18fca98ea371e54227837321c5cdaa1ba7, 2021) +- Version: git (7f33e7eb8472dbcf31fdcf50cd216c89a282825d, 2022) - License: MPL 2.0 @@ -213,7 +213,7 @@ Files extracted from upstream source: ## harfbuzz - Upstream: https://github.com/harfbuzz/harfbuzz -- Version: 5.0.1 (cbccadba8d1e51d6cc03a891b7c3a17f598e774c, 2022) +- Version: 5.1.0 (f1f2be776bcd994fa9262622e1a7098a066e5cf7, 2022) - License: MIT Files extracted from upstream source: diff --git a/thirdparty/certs/ca-certificates.crt b/thirdparty/certs/ca-certificates.crt index e218b024d0..036f630d5b 100644 --- a/thirdparty/certs/ca-certificates.crt +++ b/thirdparty/certs/ca-certificates.crt @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Thu Mar 31 08:10:21 2022 GMT +## Certificate data from Mozilla as of: Tue Jul 19 14:20:01 2022 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. -## SHA256: d59c5c83ce7a7635fa95521d8d245677949b86d5574bfcc6f855b6a48f2d5566 +## SHA256: 9bf3799611fb58197f61d45e71ce3dc19f30e7dd73731915872ce5108a7bb066 ## @@ -993,30 +993,6 @@ tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- @@ -3279,3 +3255,206 @@ PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh 4rsUecrNIdSUtUlD -----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +E-Tugra Global Root CA RSA v3 +============================= +-----BEGIN CERTIFICATE----- +MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQELBQAwgYAxCzAJ +BgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAb +BgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290 +IENBIFJTQSB2MzAeFw0yMDAzMTgwOTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJU +UjEPMA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRF +LVR1Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBSU0Eg +djMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J77gnJY9LTQ91ew6aEOErx +jYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscxuj7X/iWpKo429NEvx7epXTPcMHD4QGxL +sqYxYdE0PD0xesevxKenhOGXpOhL9hd87jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF +/YP9f4RtNGx/ardLAQO/rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8q +QedmCeFLl+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bGwzrw +bMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4znKS4iicvObpCdg6 +04nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBOM/J+JjKsBY04pOZ2PJ8QaQ5tndLB +eSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiM +bIedBi3x7+PmBvrFZhNb/FAHnnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbg +h3cXTJ2w2AmoDVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSytK7mLfcm1ap1 +LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAImocn+M684uGMQQ +gC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN4 +38o2Fi+CiJ+8EUdPdk3ILY7r3y18Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/q +ln0F7psTpURs+APQ3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3s +SdPkvmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn99t2HVhjY +sCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQmhty3QUBjYZgv6Rn7rWl +DdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YAVSgU7NbHEqIbZULpkejLPoeJVF3Zr52X +nGnnCv8PWniLYypMfUeUP95L6VPQMPHF9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFH +IK+WEj5jlB0E5y67hscMmoi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiX +YY60MGo8bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ +-----END CERTIFICATE----- + +E-Tugra Global Root CA ECC v3 +============================= +-----BEGIN CERTIFICATE----- +MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV +BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB +IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP +MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 +Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 +w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 +Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ +zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO +PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W +Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 +-----END CERTIFICATE----- diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/CursivePosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/CursivePosFormat1.hh index 7c34bb3c93..7f58fac8b8 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -140,6 +140,13 @@ struct CursivePosFormat1 unsigned int i = skippy_iter.idx; unsigned int j = buffer->idx; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "cursive attaching glyph at %d to glyph at %d", + i, j); + } + buffer->unsafe_to_break (i, j + 1); float entry_x, entry_y, exit_x, exit_y; (this+prev_record.exitAnchor).get_anchor (c, buffer->info[i].codepoint, &exit_x, &exit_y); @@ -231,6 +238,13 @@ struct CursivePosFormat1 pos[parent].x_offset = 0; } + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "cursive attached glyph at %d to glyph at %d", + i, j); + } + buffer->idx++; return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkArray.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkArray.hh index f8cddd1991..cb5e8b2689 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkArray.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkArray.hh @@ -39,6 +39,13 @@ struct MarkArray : Array16Of<MarkRecord> /* Array of MarkRecords--in Cove mark_anchor.get_anchor (c, buffer->cur().codepoint, &mark_x, &mark_y); glyph_anchor.get_anchor (c, buffer->info[glyph_pos].codepoint, &base_x, &base_y); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "attaching mark glyph at %d to glyph at %d", + c->buffer->idx, glyph_pos); + } + hb_glyph_position_t &o = buffer->cur_pos(); o.x_offset = roundf (base_x - mark_x); o.y_offset = roundf (base_y - mark_y); @@ -46,6 +53,13 @@ struct MarkArray : Array16Of<MarkRecord> /* Array of MarkRecords--in Cove o.attach_chain() = (int) glyph_pos - (int) buffer->idx; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "attached mark glyph at %d to glyph at %d", + c->buffer->idx, glyph_pos); + } + buffer->idx++; return_trace (true); } @@ -83,10 +97,11 @@ struct MarkArray : Array16Of<MarkRecord> /* Array of MarkRecords--in Cove } }; -static void Markclass_closure_and_remap_indexes (const Coverage &mark_coverage, - const MarkArray &mark_array, - const hb_set_t &glyphset, - hb_map_t* klass_mapping /* INOUT */) +HB_INTERNAL inline +void Markclass_closure_and_remap_indexes (const Coverage &mark_coverage, + const MarkArray &mark_array, + const hb_set_t &glyphset, + hb_map_t* klass_mapping /* INOUT */) { hb_set_t orig_classes; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh index f58bcb1b30..a80fe0c226 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -217,10 +217,23 @@ struct PairPosFormat2_4 } bail: + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerning glyphs at %d,%d", + c->buffer->idx, skippy_iter.idx); + } applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos()); applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerned glyphs at %d,%d", + c->buffer->idx, skippy_iter.idx); + } + success: if (applied_first || applied_second) buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh index 58ba4de6c1..4578fbd1d6 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh @@ -109,12 +109,28 @@ struct PairSet record_size); if (record) { + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerning glyphs at %d,%d", + c->buffer->idx, pos); + } + bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerned glyphs at %d,%d", + c->buffer->idx, pos); + } + if (applied_first || applied_second) buffer->unsafe_to_break (buffer->idx, pos + 1); if (len2) pos++; + buffer->idx = pos; return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh index 55de5abebf..bd95abde16 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairValueRecord.hh @@ -1,6 +1,8 @@ #ifndef OT_LAYOUT_GPOS_PAIRVALUERECORD_HH #define OT_LAYOUT_GPOS_PAIRVALUERECORD_HH +#include "ValueFormat.hh" + namespace OT { namespace Layout { namespace GPOS_impl { diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh index c0e7d29cea..7cbdf6dc6c 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat1.hh @@ -39,12 +39,10 @@ struct SinglePosFormat1 { if (!valueFormat.has_device ()) return; - auto it = - + hb_iter (this+coverage) - | hb_filter (c->glyph_set) - ; + hb_set_t intersection; + (this+coverage).intersect_set (*c->glyph_set, intersection); + if (!intersection) return; - if (!it) return; valueFormat.collect_variation_indices (c, this, values.as_array (valueFormat.get_len ())); } @@ -62,8 +60,22 @@ struct SinglePosFormat1 unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return_trace (false); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "positioning glyph at %d", + c->buffer->idx); + } + valueFormat.apply_value (c, this, values, buffer->cur_pos()); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "positioned glyph at %d", + c->buffer->idx); + } + buffer->idx++; return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh index 0d038b4422..518fa9dcb0 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/SinglePosFormat2.hh @@ -70,10 +70,24 @@ struct SinglePosFormat2 if (likely (index >= valueCount)) return_trace (false); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "positioning glyph at %d", + c->buffer->idx); + } + valueFormat.apply_value (c, this, &values[index * valueFormat.get_len ()], buffer->cur_pos()); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "positioned glyph at %d", + c->buffer->idx); + } + buffer->idx++; return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh index a5dcb65359..4a9e9672eb 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh @@ -57,8 +57,23 @@ struct AlternateSet if (unlikely (alt_index > count || alt_index == 0)) return_trace (false); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "replacing glyph at %d (alternate substitution)", + c->buffer->idx); + } + c->replace_glyph (alternates[alt_index - 1]); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (alternate substitution)", + c->buffer->idx - 1); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh index 22ed65f858..f373d921b5 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh @@ -64,7 +64,24 @@ struct Ligature * as a "ligated" substitution. */ if (unlikely (count == 1)) { + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "replacing glyph at %d (ligature substitution)", + c->buffer->idx); + } + c->replace_glyph (ligGlyph); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (ligature substitution)", + c->buffer->idx - 1); + } + return_trace (true); } @@ -85,6 +102,31 @@ struct Ligature return_trace (false); } + unsigned pos = 0; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + unsigned delta = c->buffer->sync_so_far (); + + pos = c->buffer->idx; + + char buf[HB_MAX_CONTEXT_LENGTH * 16] = {0}; + char *p = buf; + + match_end += delta; + for (unsigned i = 0; i < count; i++) + { + match_positions[i] += delta; + if (i) + *p++ = ','; + sprintf (p, "%u", match_positions[i]); + p += strlen(p); + } + + c->buffer->message (c->font, + "ligating glyphs at %s", + buf); + } + ligate_input (c, count, match_positions, @@ -92,6 +134,14 @@ struct Ligature ligGlyph, total_component_count); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "ligated glyph at %d", + pos); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh index 1d27df95dd..a23e92028e 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/ReverseChainSingleSubstFormat1.hh @@ -131,7 +131,23 @@ struct ReverseChainSingleSubstFormat1 c->buffer->idx + 1, &end_index)) { c->buffer->unsafe_to_break_from_outbuffer (start_index, end_index); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replacing glyph at %d (reverse chaining substitution)", + c->buffer->idx); + } + c->replace_glyph_inplace (substitute[index]); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (reverse chaining substitution)", + c->buffer->idx); + } + /* Note: We DON'T decrease buffer->idx. The main loop does it * for us. This is useful for preventing surprises if someone * calls us through a Context lookup. */ diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh index c5cd15bb23..3d84a5e6ea 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh @@ -40,17 +40,58 @@ struct Sequence * as a "multiplied" substitution. */ if (unlikely (count == 1)) { + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "replacing glyph at %d (multiple substitution)", + c->buffer->idx); + } + c->replace_glyph (substitute.arrayZ[0]); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (multiple subtitution)", + c->buffer->idx - 1); + } + return_trace (true); } /* Spec disallows this, but Uniscribe allows it. * https://github.com/harfbuzz/harfbuzz/issues/253 */ else if (unlikely (count == 0)) { + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "deleting glyph at %d (multiple substitution)", + c->buffer->idx); + } + c->buffer->delete_glyph (); + + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "deleted glyph at %d (multiple substitution)", + c->buffer->idx); + } + return_trace (true); } + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "multiplying glyph at %d", + c->buffer->idx); + } + unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0; unsigned lig_id = _hb_glyph_info_get_lig_id (&c->buffer->cur()); @@ -65,6 +106,26 @@ struct Sequence } c->buffer->skip_glyph (); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + + char buf[HB_MAX_CONTEXT_LENGTH * 16] = {0}; + char *p = buf; + + for (unsigned i = c->buffer->idx - count; i < c->buffer->idx; i++) + { + if (buf < p) + *p++ = ','; + sprintf (p, "%u", i); + p += strlen(p); + } + + c->buffer->message (c->font, + "multiplied glyphs at %s", + buf); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh index dd44595741..4b17243d81 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh @@ -45,6 +45,18 @@ struct SingleSubstFormat1_3 hb_set_t intersection; (this+coverage).intersect_set (c->parent_active_glyphs (), intersection); + /* In degenerate fuzzer-found fonts, but not real fonts, + * this table can keep adding new glyphs in each round of closure. + * Refuse to close-over, if it maps glyph range to overlapping range. */ + hb_codepoint_t min_before = intersection.get_min (); + hb_codepoint_t max_before = intersection.get_max (); + hb_codepoint_t min_after = (min_before + d) & mask; + hb_codepoint_t max_after = (max_before + d) & mask; + if ((this+coverage).get_population () >= max_before - min_before && + ((min_before <= min_after && min_after <= max_before) || + (min_before <= max_after && max_after <= max_before))) + return; + + hb_iter (intersection) | hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; }) | hb_sink (c->output) @@ -82,8 +94,23 @@ struct SingleSubstFormat1_3 glyph_id = (glyph_id + d) & mask; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "replacing glyph at %d (single substitution)", + c->buffer->idx); + } + c->replace_glyph (glyph_id); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (single substitution)", + c->buffer->idx - 1); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh index 386419a2a5..fb1e90d03e 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh @@ -68,8 +68,23 @@ struct SingleSubstFormat2_4 if (unlikely (index >= substitute.len)) return_trace (false); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "replacing glyph at %d (single substitution)", + c->buffer->idx); + } + c->replace_glyph (substitute[index]); + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "replaced glyph at %d (single substitution)", + c->buffer->idx - 1); + } + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh index abe4c8330c..98c2ee4e73 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh @@ -26,7 +26,9 @@ struct CompositeGlyphRecord OVERLAP_COMPOUND = 0x0400, SCALED_COMPONENT_OFFSET = 0x0800, UNSCALED_COMPONENT_OFFSET = 0x1000, +#ifndef HB_NO_BEYOND_64K GID_IS_24BIT = 0x2000 +#endif }; public: @@ -34,7 +36,9 @@ struct CompositeGlyphRecord { unsigned int size = min_size; /* glyphIndex is 24bit instead of 16bit */ +#ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) size += HBGlyphID24::static_size - HBGlyphID16::static_size; +#endif /* arg1 and 2 are int16 */ if (flags & ARG_1_AND_2_ARE_WORDS) size += 4; /* arg1 and 2 are int8 */ @@ -64,9 +68,11 @@ struct CompositeGlyphRecord void get_anchor_points (unsigned int &point1, unsigned int &point2) const { const auto *p = &StructAfter<const HBUINT8> (flags); +#ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) p += HBGlyphID24::static_size; else +#endif p += HBGlyphID16::static_size; if (flags & ARG_1_AND_2_ARE_WORDS) { @@ -109,9 +115,11 @@ struct CompositeGlyphRecord matrix[1] = matrix[2] = 0.f; const auto *p = &StructAfter<const HBINT8> (flags); +#ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) p += HBGlyphID24::static_size; else +#endif p += HBGlyphID16::static_size; int tx, ty; if (flags & ARG_1_AND_2_ARE_WORDS) @@ -158,16 +166,20 @@ struct CompositeGlyphRecord public: hb_codepoint_t get_gid () const { +#ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) return StructAfter<const HBGlyphID24> (flags); else +#endif return StructAfter<const HBGlyphID16> (flags); } void set_gid (hb_codepoint_t gid) { +#ifndef HB_NO_BEYOND_64K if (flags & GID_IS_24BIT) StructAfter<HBGlyphID24> (flags) = gid; else +#endif /* TODO assert? */ StructAfter<HBGlyphID16> (flags) = gid; } diff --git a/thirdparty/harfbuzz/src/graph/coverage-graph.hh b/thirdparty/harfbuzz/src/graph/coverage-graph.hh new file mode 100644 index 0000000000..1d9fd0eb5b --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/coverage-graph.hh @@ -0,0 +1,80 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "graph.hh" +#include "../OT/Layout/Common/Coverage.hh" + +#ifndef GRAPH_COVERAGE_GRAPH_HH +#define GRAPH_COVERAGE_GRAPH_HH + +namespace graph { + +struct CoverageFormat1 : public OT::Layout::Common::CoverageFormat1_3<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::Layout::Common::CoverageFormat1_3<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + glyphArray.get_size () - glyphArray.len.get_size (); + } +}; + +struct CoverageFormat2 : public OT::Layout::Common::CoverageFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + constexpr unsigned min_size = OT::Layout::Common::CoverageFormat2_4<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + return vertex_len >= min_size + rangeRecord.get_size () - rangeRecord.len.get_size (); + } +}; + +struct Coverage : public OT::Layout::Common::Coverage +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < OT::Layout::Common::Coverage::min_size) return false; + switch (u.format) + { + case 1: return ((CoverageFormat1*)this)->sanitize (vertex); + case 2: return ((CoverageFormat2*)this)->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + // Not currently supported + case 3: + case 4: +#endif + default: return false; + } + } +}; + + +} + +#endif // GRAPH_COVERAGE_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/graph/graph.hh b/thirdparty/harfbuzz/src/graph/graph.hh index 49638f34a7..b3aef558a2 100644 --- a/thirdparty/harfbuzz/src/graph/graph.hh +++ b/thirdparty/harfbuzz/src/graph/graph.hh @@ -24,6 +24,10 @@ * Google Author(s): Garret Rieger */ +#include "../hb-set.hh" +#include "../hb-priority-queue.hh" +#include "../hb-serialize.hh" + #ifndef GRAPH_GRAPH_HH #define GRAPH_GRAPH_HH @@ -76,6 +80,22 @@ struct graph_t } } + void remove_real_link (unsigned child_index, const void* offset) + { + for (unsigned i = 0; i < obj.real_links.length; i++) + { + auto& link = obj.real_links[i]; + if (link.objidx != child_index) + continue; + + if ((obj.head + link.position) != offset) + continue; + + obj.real_links.remove (i); + return; + } + } + void remap_parents (const hb_vector_t<unsigned>& id_map) { for (unsigned i = 0; i < parents.length; i++) @@ -107,6 +127,10 @@ struct graph_t return priority >= 3; } + size_t table_size () const { + return obj.tail - obj.head; + } + int64_t modified_distance (unsigned order) const { // TODO(garretrieger): once priority is high enough, should try @@ -199,13 +223,24 @@ struct graph_t return vertices_.length - 1; } - const hb_serialize_context_t::object_t& object(unsigned i) const + const hb_serialize_context_t::object_t& object (unsigned i) const { return vertices_[i].obj; } /* * Generates a new topological sorting of graph ordered by the shortest + * distance to each node if positions are marked as invalid. + */ + void sort_shortest_distance_if_needed () + { + if (!positions_invalid) return; + sort_shortest_distance (); + } + + + /* + * Generates a new topological sorting of graph ordered by the shortest * distance to each node. */ void sort_shortest_distance () @@ -256,12 +291,12 @@ struct graph_t check_success (!queue.in_error ()); check_success (!sorted_graph.in_error ()); - if (!check_success (new_id == -1)) - print_orphaned_nodes (); remap_all_obj_indices (id_map, &sorted_graph); - hb_swap (vertices_, sorted_graph); + + if (!check_success (new_id == -1)) + print_orphaned_nodes (); } /* @@ -310,6 +345,22 @@ struct graph_t } } + unsigned index_for_offset(unsigned node_idx, const void* offset) const + { + const auto& node = object (node_idx); + if (offset < node.head || offset >= node.tail) return -1; + + for (const auto& link : node.real_links) + { + if (offset != node.head + link.position) + continue; + return link.objidx; + } + + return -1; + } + + /* * Assign unique space numbers to each connected subgraph of 24 bit and/or 32 bit offset(s). * Currently, this is implemented specifically tailored to the structure of a GPOS/GSUB @@ -317,6 +368,8 @@ struct graph_t */ bool assign_spaces () { + update_parents (); + hb_set_t visited; hb_set_t roots; find_space_roots (visited, roots); @@ -458,6 +511,21 @@ struct graph_t find_subgraph (link.objidx, subgraph); } + size_t find_subgraph_size (unsigned node_idx, hb_set_t& subgraph, unsigned max_depth = -1) + { + if (subgraph.has (node_idx)) return 0; + subgraph.add (node_idx); + + const auto& o = vertices_[node_idx].obj; + size_t size = o.tail - o.head; + if (max_depth == 0) + return size; + + for (const auto& link : o.all_links ()) + size += find_subgraph_size (link.objidx, subgraph, max_depth - 1); + return size; + } + /* * Finds the topmost children of 32bit offsets in the subgraph starting * at node_idx. Found indices are placed into 'found'. @@ -475,6 +543,37 @@ struct graph_t } /* + * Moves the child of old_parent_idx pointed to by old_offset to a new + * vertex at the new_offset. + */ + template<typename O> + void move_child (unsigned old_parent_idx, + const O* old_offset, + unsigned new_parent_idx, + const O* new_offset) + { + distance_invalid = true; + positions_invalid = true; + + auto& old_v = vertices_[old_parent_idx]; + auto& new_v = vertices_[new_parent_idx]; + + unsigned child_id = index_for_offset (old_parent_idx, + old_offset); + + auto* new_link = new_v.obj.real_links.push (); + new_link->width = O::static_size; + new_link->objidx = child_id; + new_link->position = (const char*) new_offset - (const char*) new_v.obj.head; + + auto& child = vertices_[child_id]; + child.parents.push (new_parent_idx); + + old_v.remove_real_link (child_id, old_offset); + child.remove_parent (old_parent_idx); + } + + /* * duplicates all nodes in the subgraph reachable from node_idx. Does not re-assign * links. index_map is updated with mappings from old id to new id. If a duplication has already * been performed for a given index, then it will be skipped. @@ -581,6 +680,39 @@ struct graph_t return true; } + + /* + * Adds a new node to the graph, not connected to anything. + */ + unsigned new_node (char* head, char* tail) + { + positions_invalid = true; + distance_invalid = true; + + auto* clone = vertices_.push (); + if (vertices_.in_error ()) { + return -1; + } + + clone->obj.head = head; + clone->obj.tail = tail; + clone->distance = 0; + clone->space = 0; + + unsigned clone_idx = vertices_.length - 2; + + // The last object is the root of the graph, so swap back the root to the end. + // The root's obj idx does change, however since it's root nothing else refers to it. + // all other obj idx's will be unaffected. + hb_swap (vertices_[vertices_.length - 2], *clone); + + // Since the root moved, update the parents arrays of all children on the root. + for (const auto& l : root ().obj.all_links ()) + vertices_[l.objidx].remap_parent (root_idx () - 1, root_idx ()); + + return clone_idx; + } + /* * Raises the sorting priority of all children. */ diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc new file mode 100644 index 0000000000..e0ff6ff85f --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.cc @@ -0,0 +1,71 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "gsubgpos-graph.hh" + +namespace graph { + +gsubgpos_graph_context_t::gsubgpos_graph_context_t (hb_tag_t table_tag_, + graph_t& graph_) + : table_tag (table_tag_), + graph (graph_), + lookup_list_index (0), + lookups (), + buffers () +{ + if (table_tag_ != HB_OT_TAG_GPOS + && table_tag_ != HB_OT_TAG_GSUB) + return; + + GSTAR* gstar = graph::GSTAR::graph_to_gstar (graph_); + if (gstar) { + gstar->find_lookups (graph, lookups); + lookup_list_index = gstar->get_lookup_list_index (graph_); + } +} + +unsigned gsubgpos_graph_context_t::create_node (unsigned size) +{ + char* buffer = (char*) hb_calloc (1, size); + if (!buffer) + return -1; + + buffers.push (buffer); + + return graph.new_node (buffer, buffer + size); +} + +unsigned gsubgpos_graph_context_t::num_non_ext_subtables () { + unsigned count = 0; + for (auto l : lookups.values ()) + { + if (l->is_extension (table_tag)) continue; + count += l->number_of_subtables (); + } + return count; +} + +} diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh new file mode 100644 index 0000000000..49b24198ff --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-context.hh @@ -0,0 +1,67 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "graph.hh" +#include "../hb-ot-layout-gsubgpos.hh" + +#ifndef GRAPH_GSUBGPOS_CONTEXT_HH +#define GRAPH_GSUBGPOS_CONTEXT_HH + +namespace graph { + +struct Lookup; + +struct gsubgpos_graph_context_t +{ + hb_tag_t table_tag; + graph_t& graph; + unsigned lookup_list_index; + hb_hashmap_t<unsigned, graph::Lookup*> lookups; + hb_vector_t<char*> buffers; + + HB_INTERNAL gsubgpos_graph_context_t (hb_tag_t table_tag_, + graph_t& graph_); + + ~gsubgpos_graph_context_t () + { + for (char* b : buffers) + hb_free (b); + } + + HB_INTERNAL unsigned create_node (unsigned size); + + void add_buffer (char* buffer) + { + buffers.push (buffer); + } + + private: + HB_INTERNAL unsigned num_non_ext_subtables (); +}; + +} + +#endif // GRAPH_GSUBGPOS_CONTEXT diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh new file mode 100644 index 0000000000..afa1152c44 --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh @@ -0,0 +1,351 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#include "graph.hh" +#include "../hb-ot-layout-gsubgpos.hh" +#include "../OT/Layout/GSUB/ExtensionSubst.hh" +#include "gsubgpos-context.hh" +#include "pairpos-graph.hh" + +#ifndef GRAPH_GSUBGPOS_GRAPH_HH +#define GRAPH_GSUBGPOS_GRAPH_HH + +namespace graph { + +struct Lookup; + +template<typename T> +struct ExtensionFormat1 : public OT::ExtensionFormat1<T> +{ + void reset(unsigned type) + { + this->format = 1; + this->extensionLookupType = type; + this->extensionOffset = 0; + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + return vertex_len >= OT::ExtensionFormat1<T>::static_size; + } + + unsigned get_lookup_type () const + { + return this->extensionLookupType; + } + + unsigned get_subtable_index (graph_t& graph, unsigned this_index) const + { + return graph.index_for_offset (this_index, &this->extensionOffset); + } +}; + +struct Lookup : public OT::Lookup +{ + unsigned number_of_subtables () const + { + return subTable.len; + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < OT::Lookup::min_size) return false; + return vertex_len >= this->get_size (); + } + + bool is_extension (hb_tag_t table_tag) const + { + return lookupType == extension_type (table_tag); + } + + bool make_extension (gsubgpos_graph_context_t& c, + unsigned this_index) + { + unsigned type = lookupType; + unsigned ext_type = extension_type (c.table_tag); + if (!ext_type || is_extension (c.table_tag)) + { + // NOOP + return true; + } + + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Promoting lookup type %u (obj %u) to extension.", + type, + this_index); + + for (unsigned i = 0; i < subTable.len; i++) + { + unsigned subtable_index = c.graph.index_for_offset (this_index, &subTable[i]); + if (!make_subtable_extension (c, + this_index, + subtable_index)) + return false; + } + + lookupType = ext_type; + return true; + } + + bool split_subtables_if_needed (gsubgpos_graph_context_t& c, + unsigned this_index) + { + unsigned type = lookupType; + bool is_ext = is_extension (c.table_tag); + + if (c.table_tag != HB_OT_TAG_GPOS) + return true; + + if (!is_ext && type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + return true; + + hb_vector_t<unsigned> all_new_subtables; + for (unsigned i = 0; i < subTable.len; i++) + { + unsigned subtable_index = c.graph.index_for_offset (this_index, &subTable[i]); + if (is_ext) { + unsigned ext_subtable_index = subtable_index; + ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension = + (ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*) + c.graph.object (ext_subtable_index).head; + if (!extension->sanitize (c.graph.vertices_[ext_subtable_index])) + continue; + + subtable_index = extension->get_subtable_index (c.graph, ext_subtable_index); + type = extension->get_lookup_type (); + if (type != OT::Layout::GPOS_impl::PosLookupSubTable::Type::Pair) + continue; + } + + PairPos* pairPos = (PairPos*) c.graph.object (subtable_index).head; + if (!pairPos->sanitize (c.graph.vertices_[subtable_index])) continue; + + hb_vector_t<unsigned> new_sub_tables = pairPos->split_subtables (c, subtable_index); + if (new_sub_tables.in_error ()) return false; + + new_sub_tables.iter() | hb_sink (all_new_subtables); + } + + if (all_new_subtables) + add_sub_tables (c, this_index, type, all_new_subtables); + + return true; + } + + void add_sub_tables (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned type, + hb_vector_t<unsigned>& subtable_indices) + { + bool is_ext = is_extension (c.table_tag); + auto& v = c.graph.vertices_[this_index]; + + size_t new_size = v.table_size () + + subtable_indices.length * OT::Offset16::static_size; + char* buffer = (char*) hb_calloc (1, new_size); + c.add_buffer (buffer); + memcpy (buffer, v.obj.head, v.table_size()); + + v.obj.head = buffer; + v.obj.tail = buffer + new_size; + + Lookup* new_lookup = (Lookup*) buffer; + + new_lookup->subTable.len = subTable.len + subtable_indices.length; + unsigned offset_index = subTable.len; + for (unsigned subtable_id : subtable_indices) + { + if (is_ext) + { + unsigned ext_id = create_extension_subtable (c, subtable_id, type); + c.graph.vertices_[subtable_id].parents.push (ext_id); + subtable_id = ext_id; + } + + auto* link = v.obj.real_links.push (); + link->width = 2; + link->objidx = subtable_id; + link->position = (char*) &new_lookup->subTable[offset_index++] - + (char*) new_lookup; + c.graph.vertices_[subtable_id].parents.push (this_index); + } + + // The head location of the lookup has changed, invalidating the lookups map entry + // in the context. Update the map. + c.lookups.set (this_index, new_lookup); + } + + unsigned create_extension_subtable (gsubgpos_graph_context_t& c, + unsigned subtable_index, + unsigned type) + { + unsigned extension_size = OT::ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>::static_size; + + unsigned ext_index = c.create_node (extension_size); + if (ext_index == (unsigned) -1) + return -1; + + auto& ext_vertex = c.graph.vertices_[ext_index]; + ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>* extension = + (ExtensionFormat1<OT::Layout::GSUB_impl::ExtensionSubst>*) ext_vertex.obj.head; + extension->reset (type); + + // Make extension point at the subtable. + auto* l = ext_vertex.obj.real_links.push (); + + l->width = 4; + l->objidx = subtable_index; + l->position = 4; + + return ext_index; + } + + bool make_subtable_extension (gsubgpos_graph_context_t& c, + unsigned lookup_index, + unsigned subtable_index) + { + unsigned type = lookupType; + + unsigned ext_index = create_extension_subtable(c, subtable_index, type); + if (ext_index == (unsigned) -1) + return false; + + auto& lookup_vertex = c.graph.vertices_[lookup_index]; + for (auto& l : lookup_vertex.obj.real_links.writer ()) + { + if (l.objidx == subtable_index) + // Change lookup to point at the extension. + l.objidx = ext_index; + } + + // Make extension point at the subtable. + auto& ext_vertex = c.graph.vertices_[ext_index]; + auto& subtable_vertex = c.graph.vertices_[subtable_index]; + ext_vertex.parents.push (lookup_index); + subtable_vertex.remap_parent (lookup_index, ext_index); + + return true; + } + + private: + unsigned extension_type (hb_tag_t table_tag) const + { + switch (table_tag) + { + case HB_OT_TAG_GPOS: return 9; + case HB_OT_TAG_GSUB: return 7; + default: return 0; + } + } +}; + +template <typename T> +struct LookupList : public OT::LookupList<T> +{ + bool sanitize (const graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < OT::LookupList<T>::min_size) return false; + return vertex_len >= OT::LookupList<T>::item_size * this->len; + } +}; + +struct GSTAR : public OT::GSUBGPOS +{ + static GSTAR* graph_to_gstar (graph_t& graph) + { + const auto& r = graph.root (); + + GSTAR* gstar = (GSTAR*) r.obj.head; + if (!gstar->sanitize (r)) + return nullptr; + + return gstar; + } + + const void* get_lookup_list_field_offset () const + { + switch (u.version.major) { + case 1: return u.version1.get_lookup_list_offset (); +#ifndef HB_NO_BORING_EXPANSION + case 2: return u.version2.get_lookup_list_offset (); +#endif + default: return 0; + } + } + + bool sanitize (const graph_t::vertex_t& vertex) + { + int64_t len = vertex.obj.tail - vertex.obj.head; + if (len < OT::GSUBGPOS::min_size) return false; + return len >= get_size (); + } + + void find_lookups (graph_t& graph, + hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */) + { + switch (u.version.major) { + case 1: find_lookups<SmallTypes> (graph, lookups); break; +#ifndef HB_NO_BORING_EXPANSION + case 2: find_lookups<MediumTypes> (graph, lookups); break; +#endif + } + } + + unsigned get_lookup_list_index (graph_t& graph) + { + return graph.index_for_offset (graph.root_idx (), + get_lookup_list_field_offset()); + } + + template<typename Types> + void find_lookups (graph_t& graph, + hb_hashmap_t<unsigned, Lookup*>& lookups /* OUT */) + { + unsigned lookup_list_idx = get_lookup_list_index (graph); + + const LookupList<Types>* lookupList = + (const LookupList<Types>*) graph.object (lookup_list_idx).head; + if (!lookupList->sanitize (graph.vertices_[lookup_list_idx])) + return; + + for (unsigned i = 0; i < lookupList->len; i++) + { + unsigned lookup_idx = graph.index_for_offset (lookup_list_idx, &(lookupList->arrayZ[i])); + Lookup* lookup = (Lookup*) graph.object (lookup_idx).head; + if (!lookup->sanitize (graph.vertices_[lookup_idx])) continue; + lookups.set (lookup_idx, lookup); + } + } +}; + + + + +} + +#endif /* GRAPH_GSUBGPOS_GRAPH_HH */ diff --git a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh new file mode 100644 index 0000000000..3ca4fc701c --- /dev/null +++ b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh @@ -0,0 +1,299 @@ +/* + * Copyright © 2022 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger + */ + +#ifndef GRAPH_PAIRPOS_GRAPH_HH +#define GRAPH_PAIRPOS_GRAPH_HH + +#include "coverage-graph.hh" +#include "../OT/Layout/GPOS/PairPos.hh" +#include "../OT/Layout/GPOS/PosLookupSubTable.hh" + +namespace graph { + +struct PairPosFormat1 : public OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + unsigned min_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size; + if (vertex_len < min_size) return false; + + return vertex_len >= + min_size + pairSet.get_size () - pairSet.len.get_size(); + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + hb_set_t visited; + + const unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + const unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); + const unsigned base_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size + + coverage_size; + + unsigned accumulated = base_size; + hb_vector_t<unsigned> split_points; + for (unsigned i = 0; i < pairSet.len; i++) + { + unsigned pair_set_index = pair_set_graph_index (c, this_index, i); + accumulated += c.graph.find_subgraph_size (pair_set_index, visited); + accumulated += SmallTypes::size; // for PairSet offset. + + // TODO(garretrieger): don't count the size of the largest pairset against the limit, since + // it will be packed last in the order and does not contribute to + // the 64kb limit. + + if (accumulated > (1 << 16)) + { + split_points.push (i); + accumulated = base_size; + visited.clear (); // Pretend node sharing isn't allowed between splits. + } + } + + return do_split (c, this_index, split_points); + } + + private: + + // Split this PairPos into two or more PairPos's. split_points defines + // the indices (first index to include in the new table) to split at. + // Returns the object id's of the newly created PairPos subtables. + hb_vector_t<unsigned> do_split (gsubgpos_graph_context_t& c, + unsigned this_index, + const hb_vector_t<unsigned> split_points) + { + hb_vector_t<unsigned> new_objects; + if (!split_points) + return new_objects; + + for (unsigned i = 0; i < split_points.length; i++) + { + unsigned start = split_points[i]; + unsigned end = (i < split_points.length - 1) ? split_points[i + 1] : pairSet.len; + unsigned id = clone_range (c, this_index, start, end); + + if (id == (unsigned) -1) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + return new_objects; + } + new_objects.push (id); + } + + if (!shrink (c, this_index, split_points[0])) + { + new_objects.reset (); + new_objects.allocated = -1; // mark error + } + + return new_objects; + } + + bool shrink (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned count) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Shrinking PairPosFormat1 (%u) to [0, %u).", + this_index, + count); + unsigned old_count = pairSet.len; + if (count >= old_count) + return true; + + pairSet.len = count; + c.graph.vertices_[this_index].obj.tail -= (old_count - count) * SmallTypes::size; + + unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); + auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table->sanitize (coverage_v)) + return false; + + auto new_coverage = + + hb_zip (coverage_table->iter (), hb_range ()) + | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { + return p.second < count; + }) + | hb_map_retains_sorting (hb_first) + ; + + return make_coverage (c, new_coverage, coverage_id, coverage_size); + } + + // Create a new PairPos including PairSet's from start (inclusive) to end (exclusive). + // Returns object id of the new object. + unsigned clone_range (gsubgpos_graph_context_t& c, + unsigned this_index, + unsigned start, unsigned end) const + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + " Cloning PairPosFormat1 (%u) range [%u, %u).", this_index, start, end); + + unsigned num_pair_sets = end - start; + unsigned prime_size = OT::Layout::GPOS_impl::PairPosFormat1_3<SmallTypes>::min_size + + num_pair_sets * SmallTypes::size; + + unsigned pair_pos_prime_id = c.create_node (prime_size); + if (pair_pos_prime_id == (unsigned) -1) return -1; + + PairPosFormat1* pair_pos_prime = (PairPosFormat1*) c.graph.object (pair_pos_prime_id).head; + pair_pos_prime->format = this->format; + pair_pos_prime->valueFormat[0] = this->valueFormat[0]; + pair_pos_prime->valueFormat[1] = this->valueFormat[1]; + pair_pos_prime->pairSet.len = num_pair_sets; + + for (unsigned i = start; i < end; i++) + { + c.graph.move_child<> (this_index, + &pairSet[i], + pair_pos_prime_id, + &pair_pos_prime->pairSet[i - start]); + } + + unsigned coverage_id = c.graph.index_for_offset (this_index, &coverage); + unsigned coverage_size = c.graph.vertices_[coverage_id].table_size (); + auto& coverage_v = c.graph.vertices_[coverage_id]; + Coverage* coverage_table = (Coverage*) coverage_v.obj.head; + if (!coverage_table->sanitize (coverage_v)) + return false; + + auto new_coverage = + + hb_zip (coverage_table->iter (), hb_range ()) + | hb_filter ([&] (hb_pair_t<unsigned, unsigned> p) { + return p.second >= start && p.second < end; + }) + | hb_map_retains_sorting (hb_first) + ; + + unsigned coverage_prime_id = c.graph.new_node (nullptr, nullptr); + auto& coverage_prime_vertex = c.graph.vertices_[coverage_prime_id]; + if (!make_coverage (c, new_coverage, coverage_prime_id, coverage_size)) + return -1; + + auto* coverage_link = c.graph.vertices_[pair_pos_prime_id].obj.real_links.push (); + coverage_link->width = SmallTypes::size; + coverage_link->objidx = coverage_prime_id; + coverage_link->position = 2; + coverage_prime_vertex.parents.push (pair_pos_prime_id); + + return pair_pos_prime_id; + } + + template<typename It> + bool make_coverage (gsubgpos_graph_context_t& c, + It glyphs, + unsigned dest_obj, + unsigned max_size) const + { + char* buffer = (char*) hb_calloc (1, max_size); + hb_serialize_context_t serializer (buffer, max_size); + Coverage_serialize (&serializer, glyphs); + serializer.end_serialize (); + if (serializer.in_error ()) + { + hb_free (buffer); + return false; + } + + hb_bytes_t coverage_copy = serializer.copy_bytes (); + c.add_buffer ((char *) coverage_copy.arrayZ); // Give ownership to the context, it will cleanup the buffer. + + auto& obj = c.graph.vertices_[dest_obj].obj; + obj.head = (char *) coverage_copy.arrayZ; + obj.tail = obj.head + coverage_copy.length; + + hb_free (buffer); + return true; + } + + unsigned pair_set_graph_index (gsubgpos_graph_context_t& c, unsigned this_index, unsigned i) const + { + return c.graph.index_for_offset (this_index, &pairSet[i]); + } +}; + +struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallTypes> +{ + bool sanitize (graph_t::vertex_t& vertex) const + { + // TODO(garretrieger): implement me! + return true; + } + + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + // TODO(garretrieger): implement me! + return hb_vector_t<unsigned> (); + } +}; + +struct PairPos : public OT::Layout::GPOS_impl::PairPos +{ + hb_vector_t<unsigned> split_subtables (gsubgpos_graph_context_t& c, unsigned this_index) + { + switch (u.format) { + case 1: + return ((PairPosFormat1*)(&u.format1))->split_subtables (c, this_index); + case 2: + return ((PairPosFormat2*)(&u.format2))->split_subtables (c, this_index); +#ifndef HB_NO_BORING_EXPANSION + case 3: HB_FALLTHROUGH; + case 4: HB_FALLTHROUGH; + // Don't split 24bit PairPos's. +#endif + default: + return hb_vector_t<unsigned> (); + } + } + + bool sanitize (graph_t::vertex_t& vertex) const + { + int64_t vertex_len = vertex.obj.tail - vertex.obj.head; + if (vertex_len < u.format.get_size ()) return false; + + switch (u.format) { + case 1: + return ((PairPosFormat1*)(&u.format1))->sanitize (vertex); + case 2: + return ((PairPosFormat2*)(&u.format2))->sanitize (vertex); +#ifndef HB_NO_BORING_EXPANSION + case 3: HB_FALLTHROUGH; + case 4: HB_FALLTHROUGH; +#endif + default: + // We don't handle format 3 and 4 here. + return false; + } + } +}; + +} + +#endif // GRAPH_PAIRPOS_GRAPH_HH diff --git a/thirdparty/harfbuzz/src/hb-blob.cc b/thirdparty/harfbuzz/src/hb-blob.cc index 47062eab9a..9bc12ea3fa 100644 --- a/thirdparty/harfbuzz/src/hb-blob.cc +++ b/thirdparty/harfbuzz/src/hb-blob.cc @@ -303,7 +303,7 @@ hb_blob_set_user_data (hb_blob_t *blob, * Since: 0.9.2 **/ void * -hb_blob_get_user_data (hb_blob_t *blob, +hb_blob_get_user_data (const hb_blob_t *blob, hb_user_data_key_t *key) { return hb_object_get_user_data (blob, key); diff --git a/thirdparty/harfbuzz/src/hb-blob.h b/thirdparty/harfbuzz/src/hb-blob.h index 203f9e19dd..4eb42314da 100644 --- a/thirdparty/harfbuzz/src/hb-blob.h +++ b/thirdparty/harfbuzz/src/hb-blob.h @@ -135,7 +135,7 @@ hb_blob_set_user_data (hb_blob_t *blob, HB_EXTERN void * -hb_blob_get_user_data (hb_blob_t *blob, +hb_blob_get_user_data (const hb_blob_t *blob, hb_user_data_key_t *key); diff --git a/thirdparty/harfbuzz/src/hb-buffer.cc b/thirdparty/harfbuzz/src/hb-buffer.cc index fddda23304..57a5ae03ed 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.cc +++ b/thirdparty/harfbuzz/src/hb-buffer.cc @@ -387,9 +387,11 @@ hb_buffer_t::clear_positions () hb_memset (pos, 0, sizeof (pos[0]) * len); } -void +bool hb_buffer_t::sync () { + bool ret = false; + assert (have_output); assert (idx <= len); @@ -403,12 +405,39 @@ hb_buffer_t::sync () info = out_info; } len = out_len; + ret = true; reset: have_output = false; out_len = 0; out_info = info; idx = 0; + + return ret; +} + +int +hb_buffer_t::sync_so_far () +{ + bool had_output = have_output; + unsigned out_i = out_len; + unsigned i = idx; + unsigned old_idx = idx; + + if (sync ()) + idx = out_i; + else + idx = i; + + if (had_output) + { + have_output = true; + out_len = idx; + } + + assert (idx <= len); + + return idx - old_idx; } bool @@ -802,7 +831,7 @@ hb_buffer_set_user_data (hb_buffer_t *buffer, * Since: 0.9.2 **/ void * -hb_buffer_get_user_data (hb_buffer_t *buffer, +hb_buffer_get_user_data (const hb_buffer_t *buffer, hb_user_data_key_t *key) { return hb_object_get_user_data (buffer, key); @@ -2090,8 +2119,16 @@ hb_buffer_set_message_func (hb_buffer_t *buffer, bool hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) { + assert (!have_output || (out_info == info && out_len == idx)); + + message_depth++; + char buf[100]; vsnprintf (buf, sizeof (buf), fmt, ap); - return (bool) this->message_func (this, font, buf, this->message_data); + bool ret = (bool) this->message_func (this, font, buf, this->message_data); + + message_depth--; + + return ret; } #endif diff --git a/thirdparty/harfbuzz/src/hb-buffer.h b/thirdparty/harfbuzz/src/hb-buffer.h index e095c5344c..c6af759fb9 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.h +++ b/thirdparty/harfbuzz/src/hb-buffer.h @@ -142,6 +142,15 @@ typedef struct hb_glyph_info_t { * shaping, otherwise the buffer flag will not be * reliably produced. * Since: 4.0.0 + * @HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL: In scripts that use elongation (Arabic, + Mongolian, Syriac, etc.), this flag signifies + that it is safe to insert a U+0640 TATWEEL + character *before* this cluster for elongation. + This flag does not determine the + script-specific elongation places, but only + when it is safe to do the elongation without + interrupting text shaping. + Since: 5.1.0 * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags. * * Flags for #hb_glyph_info_t. @@ -149,10 +158,11 @@ typedef struct hb_glyph_info_t { * Since: 1.5.0 */ typedef enum { /*< flags >*/ - HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001, - HB_GLYPH_FLAG_UNSAFE_TO_CONCAT = 0x00000002, + HB_GLYPH_FLAG_UNSAFE_TO_BREAK = 0x00000001, + HB_GLYPH_FLAG_UNSAFE_TO_CONCAT = 0x00000002, + HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL = 0x00000004, - HB_GLYPH_FLAG_DEFINED = 0x00000003 /* OR of all defined flags */ + HB_GLYPH_FLAG_DEFINED = 0x00000007 /* OR of all defined flags */ } hb_glyph_flags_t; HB_EXTERN hb_glyph_flags_t @@ -266,7 +276,7 @@ hb_buffer_set_user_data (hb_buffer_t *buffer, hb_bool_t replace); HB_EXTERN void * -hb_buffer_get_user_data (hb_buffer_t *buffer, +hb_buffer_get_user_data (const hb_buffer_t *buffer, hb_user_data_key_t *key); @@ -373,6 +383,10 @@ hb_buffer_guess_segment_properties (hb_buffer_t *buffer); * flag indicating that the @HB_GLYPH_FLAG_UNSAFE_TO_CONCAT * glyph-flag should be produced by the shaper. By default * it will not be produced since it incurs a cost. Since: 4.0.0 + * @HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL: + * flag indicating that the @HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL + * glyph-flag should be produced by the shaper. By default + * it will not be produced. Since: 5.1.0 * @HB_BUFFER_FLAG_DEFINED: All currently defined flags: Since: 4.4.0 * * Flags for #hb_buffer_t. @@ -388,8 +402,9 @@ typedef enum { /*< flags >*/ HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE = 0x00000010u, HB_BUFFER_FLAG_VERIFY = 0x00000020u, HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT = 0x00000040u, + HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL = 0x00000080u, - HB_BUFFER_FLAG_DEFINED = 0x0000007Fu + HB_BUFFER_FLAG_DEFINED = 0x000000FFu } hb_buffer_flags_t; HB_EXTERN void diff --git a/thirdparty/harfbuzz/src/hb-buffer.hh b/thirdparty/harfbuzz/src/hb-buffer.hh index 6ca78f28d4..26c3f0fac8 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.hh +++ b/thirdparty/harfbuzz/src/hb-buffer.hh @@ -288,7 +288,8 @@ struct hb_buffer_t HB_INTERNAL void guess_segment_properties (); - HB_INTERNAL void sync (); + HB_INTERNAL bool sync (); + HB_INTERNAL int sync_so_far (); HB_INTERNAL void clear_output (); HB_INTERNAL void clear_positions (); @@ -461,6 +462,17 @@ struct hb_buffer_t start, end, true); } + void safe_to_insert_tatweel (unsigned int start = 0, unsigned int end = -1) + { + if ((flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL) == 0) + { + unsafe_to_break (start, end); + return; + } + _set_glyph_flags (HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL, + start, end, + true); + } void unsafe_to_concat (unsigned int start = 0, unsigned int end = -1) { if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0)) @@ -555,15 +567,11 @@ struct hb_buffer_t if (likely (!messaging ())) return true; - message_depth++; - va_list ap; va_start (ap, fmt); bool ret = message_impl (font, fmt, ap); va_end (ap); - message_depth--; - return ret; #endif } diff --git a/thirdparty/harfbuzz/src/hb-cplusplus.hh b/thirdparty/harfbuzz/src/hb-cplusplus.hh index f06a32d912..c4d9d29e23 100644 --- a/thirdparty/harfbuzz/src/hb-cplusplus.hh +++ b/thirdparty/harfbuzz/src/hb-cplusplus.hh @@ -130,7 +130,7 @@ template <typename T, void *, hb_destroy_func_t, hb_bool_t), - void * (*_get_user_data) (T *, + void * (*_get_user_data) (const T *, hb_user_data_key_t *)> struct vtable_t { @@ -164,6 +164,27 @@ HB_DEFINE_VTABLE (unicode_funcs); #undef HB_DEFINE_VTABLE +#ifdef HB_SUBSET_H + +#define HB_DEFINE_VTABLE(name) \ + template<> \ + struct vtable<hb_##name##_t> \ + : vtable_t<hb_##name##_t, \ + nullptr, \ + &hb_##name##_reference, \ + &hb_##name##_destroy, \ + &hb_##name##_set_user_data, \ + &hb_##name##_get_user_data> {} + + +HB_DEFINE_VTABLE (subset_input); +HB_DEFINE_VTABLE (subset_plan); + +#undef HB_DEFINE_VTABLE + +#endif + + } // namespace hb /* Workaround for GCC < 7, see: diff --git a/thirdparty/harfbuzz/src/hb-debug.hh b/thirdparty/harfbuzz/src/hb-debug.hh index 3ac7440e80..905a46a087 100644 --- a/thirdparty/harfbuzz/src/hb-debug.hh +++ b/thirdparty/harfbuzz/src/hb-debug.hh @@ -460,4 +460,9 @@ struct hb_no_trace_t { #endif +#ifndef HB_BUFFER_MESSAGE_MORE +#define HB_BUFFER_MESSAGE_MORE (HB_DEBUG+1) +#endif + + #endif /* HB_DEBUG_HH */ diff --git a/thirdparty/harfbuzz/src/hb-face.cc b/thirdparty/harfbuzz/src/hb-face.cc index 8f8b1a6d14..61adbdd503 100644 --- a/thirdparty/harfbuzz/src/hb-face.cc +++ b/thirdparty/harfbuzz/src/hb-face.cc @@ -342,7 +342,7 @@ hb_face_set_user_data (hb_face_t *face, * Since: 0.9.2 **/ void * -hb_face_get_user_data (hb_face_t *face, +hb_face_get_user_data (const hb_face_t *face, hb_user_data_key_t *key) { return hb_object_get_user_data (face, key); diff --git a/thirdparty/harfbuzz/src/hb-face.h b/thirdparty/harfbuzz/src/hb-face.h index 3b7477a76c..6ef2f8b886 100644 --- a/thirdparty/harfbuzz/src/hb-face.h +++ b/thirdparty/harfbuzz/src/hb-face.h @@ -96,7 +96,7 @@ hb_face_set_user_data (hb_face_t *face, hb_bool_t replace); HB_EXTERN void * -hb_face_get_user_data (hb_face_t *face, +hb_face_get_user_data (const hb_face_t *face, hb_user_data_key_t *key); HB_EXTERN void diff --git a/thirdparty/harfbuzz/src/hb-font.cc b/thirdparty/harfbuzz/src/hb-font.cc index fd9073c33e..856bbdda32 100644 --- a/thirdparty/harfbuzz/src/hb-font.cc +++ b/thirdparty/harfbuzz/src/hb-font.cc @@ -781,8 +781,8 @@ hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs, * Since: 0.9.2 **/ void * -hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, - hb_user_data_key_t *key) +hb_font_funcs_get_user_data (const hb_font_funcs_t *ffuncs, + hb_user_data_key_t *key) { return hb_object_get_user_data (ffuncs, key); } @@ -1897,7 +1897,7 @@ hb_font_set_user_data (hb_font_t *font, * Since: 0.9.2 **/ void * -hb_font_get_user_data (hb_font_t *font, +hb_font_get_user_data (const hb_font_t *font, hb_user_data_key_t *key) { return hb_object_get_user_data (font, key); diff --git a/thirdparty/harfbuzz/src/hb-font.h b/thirdparty/harfbuzz/src/hb-font.h index 3f27bca288..e2c3df4a5a 100644 --- a/thirdparty/harfbuzz/src/hb-font.h +++ b/thirdparty/harfbuzz/src/hb-font.h @@ -86,8 +86,8 @@ hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs, HB_EXTERN void * -hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, - hb_user_data_key_t *key); +hb_font_funcs_get_user_data (const hb_font_funcs_t *ffuncs, + hb_user_data_key_t *key); HB_EXTERN void @@ -993,7 +993,7 @@ hb_font_set_user_data (hb_font_t *font, HB_EXTERN void * -hb_font_get_user_data (hb_font_t *font, +hb_font_get_user_data (const hb_font_t *font, hb_user_data_key_t *key); HB_EXTERN void diff --git a/thirdparty/harfbuzz/src/hb-ft.cc b/thirdparty/harfbuzz/src/hb-ft.cc index 5c88a7f3bd..ef073475cb 100644 --- a/thirdparty/harfbuzz/src/hb-ft.cc +++ b/thirdparty/harfbuzz/src/hb-ft.cc @@ -1086,7 +1086,8 @@ hb_ft_font_changed (hb_font_t *font) } #endif - _hb_ft_hb_font_check_changed (font, ft_font); + ft_font->advance_cache.clear (); + ft_font->cached_serial = font->serial; } /** diff --git a/thirdparty/harfbuzz/src/hb-map.cc b/thirdparty/harfbuzz/src/hb-map.cc index a29fa1a313..5c5f5de59e 100644 --- a/thirdparty/harfbuzz/src/hb-map.cc +++ b/thirdparty/harfbuzz/src/hb-map.cc @@ -145,7 +145,7 @@ hb_map_set_user_data (hb_map_t *map, * Since: 1.7.7 **/ void * -hb_map_get_user_data (hb_map_t *map, +hb_map_get_user_data (const hb_map_t *map, hb_user_data_key_t *key) { return hb_object_get_user_data (map, key); diff --git a/thirdparty/harfbuzz/src/hb-map.h b/thirdparty/harfbuzz/src/hb-map.h index 41d877d6a1..3a067c5c73 100644 --- a/thirdparty/harfbuzz/src/hb-map.h +++ b/thirdparty/harfbuzz/src/hb-map.h @@ -74,7 +74,7 @@ hb_map_set_user_data (hb_map_t *map, hb_bool_t replace); HB_EXTERN void * -hb_map_get_user_data (hb_map_t *map, +hb_map_get_user_data (const hb_map_t *map, hb_user_data_key_t *key); diff --git a/thirdparty/harfbuzz/src/hb-number-parser.hh b/thirdparty/harfbuzz/src/hb-number-parser.hh index ec68c3a728..1a9dbba6dd 100644 --- a/thirdparty/harfbuzz/src/hb-number-parser.hh +++ b/thirdparty/harfbuzz/src/hb-number-parser.hh @@ -31,7 +31,7 @@ #include "hb.hh" -#line 32 "hb-number-parser.hh" +#line 35 "hb-number-parser.hh" static const unsigned char _double_parser_trans_keys[] = { 0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 46u, 101u, 0 @@ -135,12 +135,12 @@ strtod_rl (const char *p, const char **end_ptr /* IN/OUT */) int cs; -#line 132 "hb-number-parser.hh" +#line 139 "hb-number-parser.hh" { cs = double_parser_start; } -#line 135 "hb-number-parser.hh" +#line 144 "hb-number-parser.hh" { int _slen; int _trans; @@ -198,7 +198,7 @@ _resume: exp_overflow = true; } break; -#line 187 "hb-number-parser.hh" +#line 202 "hb-number-parser.hh" } _again: diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh index 9a4157b21f..0532039aad 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh @@ -72,10 +72,6 @@ using OT::Layout::MediumTypes; #define HB_MAX_LANGSYS_FEATURE_COUNT 50000 #endif -#ifndef HB_MAX_FEATURES -#define HB_MAX_FEATURES 750 -#endif - #ifndef HB_MAX_FEATURE_INDICES #define HB_MAX_FEATURE_INDICES 1500 #endif @@ -1337,7 +1333,7 @@ struct Lookup return_trace (true); } - private: + protected: HBUINT16 lookupType; /* Different enumerations for GSUB and GPOS */ HBUINT16 lookupFlag; /* Lookup qualifiers */ Array16Of<Offset16> diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh index 5acd228b83..c77ec12fbe 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh @@ -1602,9 +1602,28 @@ static inline void apply_lookup (hb_ot_apply_context_t *c, if (unlikely (buffer->max_ops <= 0)) break; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + if (buffer->have_output) + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "recursing to lookup %u at %d", + (unsigned) lookupRecord[i].lookupListIndex, + buffer->idx); + } + if (!c->recurse (lookupRecord[i].lookupListIndex)) continue; + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + if (buffer->have_output) + c->buffer->sync_so_far (); + c->buffer->message (c->font, + "recursed to lookup %u", + (unsigned) lookupRecord[i].lookupListIndex); + } + unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len (); int delta = new_len - orig_len; @@ -4010,6 +4029,11 @@ struct GSUBGPOSVersion1_2 (version.to_int () >= 0x00010001u ? featureVars.static_size : 0); } + const typename Types::template OffsetTo<LookupList<Types>>* get_lookup_list_offset () const + { + return &lookupList; + } + template <typename TLookup> bool sanitize (hb_sanitize_context_t *c) const { diff --git a/thirdparty/harfbuzz/src/hb-ot-shape.cc b/thirdparty/harfbuzz/src/hb-ot-shape.cc index 2ada84b8a3..7f679cfd39 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shape.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shape.cc @@ -1141,6 +1141,18 @@ hb_propagate_flags (hb_buffer_t *buffer) if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS)) return; + /* If we are producing SAFE_TO_INSERT_TATWEEL, then do two things: + * + * - If the places that the Arabic shaper marked as SAFE_TO_INSERT_TATWEEL, + * are UNSAFE_TO_BREAK, then clear the SAFE_TO_INSERT_TATWEEL, + * - Any place that is SAFE_TO_INSERT_TATWEEL, is also now UNSAFE_TO_BREAK. + * + * We couldn't make this interaction earlier. It has to be done here. + */ + bool flip_tatweel = buffer->flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL; + + bool clear_concat = (buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0; + hb_glyph_info_t *info = buffer->info; foreach_cluster (buffer, start, end) @@ -1148,9 +1160,20 @@ hb_propagate_flags (hb_buffer_t *buffer) unsigned int mask = 0; for (unsigned int i = start; i < end; i++) mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED; - if (mask) - for (unsigned int i = start; i < end; i++) - info[i].mask |= mask; + + if (flip_tatweel) + { + if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) + mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL; + if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL) + mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT; + } + + if (clear_concat) + mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT; + + for (unsigned int i = start; i < end; i++) + info[i].mask = mask; } } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc index b331a048b6..ed2748b828 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc @@ -331,7 +331,7 @@ arabic_joining (hb_buffer_t *buffer) if (entry->prev_action != NONE && prev != UINT_MAX) { info[prev].arabic_shaping_action() = entry->prev_action; - buffer->unsafe_to_break (prev, i + 1); + buffer->safe_to_insert_tatweel (prev, i + 1); } else { @@ -365,7 +365,7 @@ arabic_joining (hb_buffer_t *buffer) if (entry->prev_action != NONE && prev != UINT_MAX) { info[prev].arabic_shaping_action() = entry->prev_action; - buffer->unsafe_to_break (prev, buffer->len); + buffer->safe_to_insert_tatweel (prev, buffer->len); } else if (2 <= state && state <= 5) /* States that have a possible prev_action. */ { diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh index 4f09fa805e..e45ea30e60 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh @@ -90,263 +90,264 @@ #pragma GCC diagnostic pop static const uint8_t -hb_use_u8[1842] = +hb_use_u8[3083] = { - 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 5, - 6, 7, 3, 8, 3, 3, 9, 3, 10, 3, 3, 11, 3, 12, 13, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 14, 0, 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, - 1, 11, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, - 1, 1, 20, 1, 1, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, 22, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 24, 25, 26, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 27, 28, 1, 1, 1, 1, 1, 29, 1, 1, 1, 1, 30, 31, 1, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 1, 46, 47, - 48, 1, 49, 49, 49, 49, 50, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51, 52, 1, 1, - 1, 53, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 49, 54, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 1, - 1, 1, 1, 56, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 57, 58, 1, 1, 1, 1, 1, 1, 59, 1, 1, 1, 1, - 1, 1, 60, 61, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, O, O, O, O, O, GB, O, O, B, B, B, B, B, B, - O, O, GB, O, O, O, O, WJ, O, O, O, O,FMPst,FMPst, O, O, - O, GB, O, O, O, CGJ, B, O, O, O, O, O, B, B, B, B, - B,VMAbv,VMAbv,VMAbv,VMAbv,VMAbv, O, O, B, O, O,VMAbv, O, O, B,CMBlw, - CMBlw,CMBlw,VMAbv,VMAbv,VMAbv,VMPst, B, B, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, - VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VPst, VPst, VPst, VPst, H, VPre, VPst, O,VMAbv, - VMBlw, O, O, VAbv, VBlw, VBlw, B, B, VBlw, VBlw, GB,VMAbv,VMPst,VMPst, O, B, - B, B, B, O, O, B, B, O, B, B, B, O, B, O, VBlw, O, - O, VPre, VPre, O, O, VPre, VPre, H, O, O, O, O, O, VPst, B, B, - O, B, B, O,FMAbv, O, O,VMAbv,VMAbv,VMPst, B, B, B, O, O, O, - O, B, O, B, B, O,CMBlw, O, VPst, VPre, VPst, VBlw, VBlw, O, O, O, - O, VAbv, VAbv, O, O, VAbv, VAbv, H, O, O, O,VMBlw, O, O,VMAbv,CMAbv, - GB, GB, O, MBlw, O, O, VBlw, VAbv, O, VAbv, VAbv, VAbv, O, VPst, VPst, H, - O, O, O, B,VMAbv,VMAbv,VMAbv,CMAbv,CMAbv,CMAbv, O,VMAbv,VMPst,VMPst,CMBlw, B, - VPst, VAbv, O, VAbv, VAbv, VAbv, O, B, O, O, O, O,VMAbv, O, O, O, - VPst, VPst, VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPre, VPre,VMAbv,VMPst, - VMPst,VMPst,VMAbv, B, B, B,CMBlw, B, VAbv, VAbv, VPst, O, VAbv, VAbv, VAbv, O, - VAbv, VAbv, O, VAbv, VBlw, O, B,VMAbv,VMPst,VMPst, O, VPst, VPst, O, O, CS, - CS, O,VMAbv,VMAbv,VMPst,VMPst, B, B, B, VAbv, VAbv, B, VPst, VPst, VPst, VPst, - VPst, VBlw, VBlw, O, VPre, VPre, VPre, H, R, O, O, O, HVM, O, VPst, VPst, - VAbv, VAbv, VBlw, O, VBlw, O, VPst, VPre, VPre, VPre, VPre, VPre, VPre, VPst, VBlw, VBlw, - O, O, O, FBlw, O, FBlw, O,CMAbv, O, O, O, O, VPst, VPre, O,CMBlw, - VBlw, VAbv, VAbv, VBlw, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw,VMAbv, O, VBlw, VAbv, - VMAbv,VMAbv, VBlw, O,VMAbv,VMAbv, B, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, - SUB, SUB, SUB, O, O, O, O, O, FBlw, O, B, B, B, VPst, VPst, VAbv, - VAbv, VBlw, VBlw, VPre, VAbv, VAbv, VAbv, VAbv,VMAbv,VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, - MBlw, B, B, B, O, GB, O, O, GB, O, B, B, VPst, VPst, VBlw, VBlw, - B, B, B, B, MBlw, MBlw, MBlw, B, VPst,VMPst,VMPst, B, B, VPst, VPst,VMPst, - VMPst,VMPst,VMPst,VMPst, B, B, B, VAbv, VAbv, VAbv, VAbv, B, B, B, B, B, - MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMPst,VMPst,VMPst,VMPst,VMBlw, B,VMPst, B, B, - VMPst,VMPst, VPst, VAbv, O, O, B, B, VAbv, VBlw, VBlw, VPst, O, O, VPst, O, - O, O, B, O, VAbv, VBlw, CGJ, CGJ, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, - VPre, VPre, VPre, VPre, VPre, VPre, VPre, VPre,VMAbv,VMPst, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv, - FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, O, O, O, O, B, CGJ, CGJ, CGJ, - WJ, CGJ, GB, GB, GB, GB, GB,CMAbv,CMAbv, B, B,CMBlw, B, O, GB, B, - B, B, VAbv, VAbv, VBlw, VPst, VPst, VAbv, VAbv, VAbv, VAbv, SUB, SUB, SUB, FPst, FPst, - VMBlw, FPst, FPst, FPst, FPst, FPst, FPst, FBlw,VMAbv,FMBlw,VMPst,VMPst, O, O, VAbv, VPre, - VPst, VAbv, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, SUB, SUB, SUB, O, Sk, VPst, - VAbv, VPst, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, VPre, VPre, VPre, VAbv,VMAbv,VMAbv, - VAbv,VMAbv,VMAbv, O, O,VMBlw,VMAbv,VMAbv,VMAbv, FAbv,VMPst, B, B, B,CMAbv, VPst, - VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre, VPre, VPre, VAbv, VAbv, H, B, - B, B, O, O, O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv,SMAbv,SMAbv,SMAbv,SMAbv,VMAbv, FAbv, - VMPst, B, VAbv, VBlw, VPre, VPst, VAbv, VAbv, VPst, IS, SUB, SUB, B, B, B, B, - CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv, FAbv, FAbv,CMBlw,CMBlw, SUB, SUB, - VPst, VPre, VPre, VPre, VPst, VPst, VBlw, FAbv, FAbv, FAbv, FAbv, FAbv, FAbv, FAbv,VMPre,VMPre, - FMAbv,CMBlw,VMAbv,VMAbv,VMAbv, O,VMBlw,VMBlw,VMBlw,VMBlw,VMBlw,VMBlw,VMAbv,VMAbv,VMAbv,VMPst, - VMBlw,VMBlw,VMBlw, O, O, O,VMAbv, CS, CS,VMPst,VMAbv,VMAbv, GB, O, O, O, - O,FMAbv, O, O, O, WJ, ZWNJ, CGJ, WJ, WJ, O, O, WJ, WJ, WJ, WJ, - WJ, O, WJ, WJ, WJ, WJ,FMPst, O, O, O,VMAbv, O, O, O, O, O, - O, H, B, B, VAbv, B, B, B, H, B, VPst, VBlw, VAbv, VPst, VBlw, O, - O, O, MPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, H,VMAbv, O, O,VMAbv,VMAbv, - B, B, O, O, B, VAbv, B, B, VAbv, VAbv, VAbv, VAbv, VAbv,VMBlw,VMBlw,VMBlw, - O, O, B, B, B, VBlw, VBlw, VBlw, VAbv, VBlw, VBlw, VBlw, VBlw, FAbv, FAbv, FAbv, - FPst, VPst,VMAbv,VMAbv, FAbv,VMPst, B, B, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, - O, O, B, VAbv, O, B, B,VMAbv, VAbv, VAbv, VAbv, VBlw, VAbv, VPre, VPre, VAbv, - VBlw, MPst, MPre, MAbv, MBlw, O, B, B, B, FAbv, FAbv, FPst, O, O, GB, GB, - GB, O, O, O, B,VMPst,VMAbv,VMPst, B, B, VAbv, B, VAbv, VAbv, VBlw, B, - B, VAbv, B, B, VAbv,VMAbv, B,VMAbv, B, O, B, B, B, VPre, VBlw, VAbv, - VPre, VPst, O,VMPst, IS, O, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O,VMPst, VBlw, - O, O, CGJ, CGJ, CGJ, CGJ, WJ, O, O, O, B, VBlw, VBlw, VBlw, VPst,VMBlw, - VMBlw,VMAbv,CMBlw,CMBlw,CMBlw, O, O, O, O, IS, B,CMBlw,CMBlw, O,VMAbv,VMAbv, - VMAbv,CMAbv, B, B, O, VAbv, VAbv, O, O, O, B, B,VMBlw,VMBlw,VMBlw, B, - B, B, B, B,CMBlw,CMBlw,CMBlw,CMBlw, O, O,VMPst,VMAbv,VMPst, CS, CS, B, - B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, - N, N, N, N, N, N, N, N, B, B, VAbv, B, B, VAbv, VAbv, B, - O, O, O, O, O, HN,VMAbv,VMAbv,VMPst, B, VPst, VPre, VPst, VBlw, VBlw, VAbv, - VAbv, VPst, VPst, H,CMBlw, O, O, O, VBlw, O,VMAbv,VMAbv,VMAbv, B, VPre, VBlw, - VAbv, VAbv, VBlw, VAbv, VAbv, IS,CMAbv, O, B, B, B, VPst, VPst, B, B, B, - B,CMBlw, VPre, VPst, VBlw, VBlw, H, B, R, R, O,FMBlw,CMBlw, VAbv, VBlw, O, - VPre,VMAbv,VMAbv, H,CMAbv,CMAbv, VAbv,CMBlw, VBlw, O, B, B, O,CMBlw,CMBlw, B, - VPst, VPst, VPst, O, O, VPre, O, O,VMAbv,VMAbv, B, VPst, VPre, VPst, VPst, VPst, - H,VMAbv,VMAbv,VMPst,CMBlw, B, O, O,FMAbv, B, CS, CS, O, O, VBlw, VPre, - VAbv, VPre, VPre, VPst, VPre,VMAbv,VMAbv,VMAbv, H,CMBlw,VMAbv,VMAbv,VMPst, H,CMBlw, O, - O, O, VPst,VMAbv,VMPst, H,VMPst, VAbv, VPre, VPst, VAbv, VAbv, H,CMBlw, O, MBlw, - MPre, MAbv, VBlw, VBlw, VPre, VAbv, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv,VMAbv,VMPst, H, - CMBlw, O, VPst, VPre, O, VPre, VPre, O, O,VMAbv,VMAbv, VPst, IS, R, MPst, R, - MPst,CMBlw, O, O, VAbv, VAbv, VPst, VPst,VMPst,VMPst, H, B, O, O, VPre, O, - O, O, B, VAbv, VBlw, VBlw, VAbv, VAbv, VBlw, B, B, B, B,FMBlw, VBlw,VMAbv, - VMAbv,VMAbv,VMAbv,VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, O, GB, O, IS, VAbv, VAbv, - VAbv, VPst, R, R, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, - VMAbv,VMPst,CMAbv, IS, O, O, VBlw, VBlw, VBlw, O, O, O, SUB, SUB, VBlw, VPre, - VBlw, VAbv, VPst,VMAbv,VMAbv, O, VAbv, VAbv, VBlw, O, O, O, VAbv, O, VAbv, VAbv, - O, VAbv,VMAbv,VMAbv,CMBlw, VAbv, VBlw, IS, R, MBlw, VPst, VPst, VPst, O, VPst,VMAbv, - VMPst, IS, B, B, GB, VAbv, VBlw, VPre, VPst, O, H, H, H, H, H, H, - H, B, O, O, O,CMBlw, O, VBlw, VBlw, VBlw, O, O, O,VMBlw,VMBlw,VMBlw, - VMBlw, O, O,CMBlw,CMBlw, O, B, B,VMAbv, O,CMAbv,CMAbv,CMAbv,CMAbv,CMAbv,CMAbv, - CMAbv, B, + 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 14, 0, 1, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 4, 2, 2, + 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 2, 2, 17, + 18, 19, 20, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 2, 33, 2, 2, 2, + 2, 34, 35, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 37, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 38, 39, 40, 41, 42, 43, 2, 44, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 46, 2, + 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 49, 2, 2, 2, + 2, 2, 2, 2, 2, 50, 51, 2, 52, 2, 2, 53, 2, 2, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 2, 64, 65, 2, 66, 67, 68, 69, + 2, 70, 2, 71, 72, 73, 74, 2, 2, 75, 76, 77, 78, 2, 79, 2, + 2, 80, 80, 80, 80, 80, 80, 80, 80, 81, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 82, 83, 2, 2, 2, 2, 2, 2, 2, 84, + 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 80, 80, 80, 86, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 87, 88, 2, 2, 2, 2, 2, + 2, 2, 2, 89, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 90, 2, 2, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 93, 93, 94, 95, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 9, 0, 0, 0, 7, 10, + 0, 2, 2, 2, 2, 11, 12, 0, 0, 9, 13, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 15, 16, 17, 18, 19, 20, 14, 21, 22, + 23, 10, 24, 25, 18, 2, 2, 2, 2, 2, 18, 0, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 26, 27, 28, 2, 2, 2, 7, + 28, 7, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, + 2, 7, 7, 0, 2, 2, 0, 15, 16, 17, 18, 29, 30, 31, 30, 32, + 0, 0, 0, 0, 33, 0, 0, 2, 28, 2, 0, 0, 0, 0, 0, 7, + 34, 10, 13, 28, 2, 2, 7, 0, 28, 7, 2, 28, 7, 2, 0, 35, + 16, 17, 29, 0, 25, 36, 25, 37, 0, 38, 0, 0, 0, 28, 2, 7, + 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, + 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, + 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, + 0, 0, 0, 0, 0, 28, 9, 39, 42, 10, 27, 28, 2, 2, 2, 7, + 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, + 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, + 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, + 2, 2, 2, 2, 2, 2, 0, 0, 21, 14, 45, 0, 46, 31, 46, 32, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 13, 27, 47, 2, 2, 2, 7, + 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 15, + 20, 14, 21, 45, 20, 36, 20, 37, 0, 0, 0, 25, 29, 2, 7, 0, + 0, 8, 27, 28, 2, 2, 2, 7, 2, 2, 2, 28, 2, 2, 0, 15, + 43, 0, 0, 33, 45, 0, 0, 0, 7, 48, 49, 0, 0, 0, 0, 0, + 0, 9, 27, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 50, 51, + 21, 21, 17, 29, 46, 31, 46, 32, 52, 0, 0, 0, 33, 0, 0, 0, + 28, 10, 27, 28, 2, 2, 2, 2, 2, 2, 2, 2, 7, 0, 2, 2, + 2, 2, 28, 2, 2, 2, 2, 28, 0, 2, 2, 2, 7, 0, 53, 0, + 33, 21, 20, 29, 29, 16, 46, 46, 23, 0, 21, 0, 0, 0, 0, 0, + 0, 2, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 2, 2, 54, 54, 55, 0, 0, 16, 2, 2, 2, 2, 28, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 7, 0, 56, 19, 57, 20, 20, 18, 18, + 44, 19, 9, 29, 9, 2, 2, 58, 59, 59, 59, 59, 59, 60, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 2, 2, 2, 2, 2, 63, 43, + 57, 64, 20, 20, 65, 66, 67, 68, 69, 2, 2, 2, 2, 2, 1, 0, + 3, 2, 2, 2, 21, 18, 2, 2, 70, 69, 71, 72, 63, 71, 27, 27, + 2, 50, 20, 51, 2, 2, 2, 2, 2, 2, 73, 74, 75, 27, 27, 76, + 77, 2, 2, 2, 2, 2, 27, 43, 0, 2, 57, 78, 0, 0, 0, 0, + 28, 2, 57, 45, 0, 0, 0, 0, 0, 2, 57, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 7, 2, 7, 57, 0, 0, 0, 0, 0, + 0, 2, 2, 79, 43, 20, 57, 18, 46, 46, 46, 46, 13, 80, 81, 82, + 83, 84, 85, 0, 0, 0, 0, 86, 0, 7, 0, 0, 28, 0, 87, 79, + 88, 2, 2, 2, 2, 7, 0, 0, 0, 40, 40, 89, 90, 2, 2, 2, + 2, 2, 2, 2, 2, 11, 7, 0, 0, 91, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 20, 78, 43, 20, 92, 59, 0, + 0, 93, 94, 93, 93, 95, 96, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, + 0, 2, 2, 2, 2, 27, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, + 0, 2, 2, 2, 50, 97, 43, 0, 0, 2, 2, 98, 99, 100, 101, 59, + 61, 102, 14, 43, 20, 57, 19, 78, 46, 46, 74, 9, 9, 9, 103, 44, + 38, 9, 104, 72, 2, 2, 2, 2, 2, 2, 2, 105, 20, 18, 18, 20, + 46, 46, 20, 106, 2, 2, 2, 7, 0, 0, 0, 0, 0, 0, 107, 108, + 109, 109, 109, 0, 0, 0, 0, 0, 0, 104, 72, 2, 2, 2, 2, 2, + 2, 58, 59, 57, 23, 20, 110, 59, 2, 2, 2, 2, 105, 20, 21, 43, + 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, + 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, + 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, + 0, 0, 0, 115, 116, 9, 3, 0, 0, 0, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 0, 0, 0, 4, 118, 119, 40, 40, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 119, 120, 119, 119, 119, 119, 119, 119, 119, + 119, 0, 0, 121, 0, 0, 0, 0, 0, 0, 5, 121, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 122, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, + 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 123, 21, 21, 21, 21, 21, 21, 21, 124, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, + 50, 2, 2, 2, 20, 20, 125, 114, 0, 2, 2, 2, 126, 18, 57, 18, + 111, 100, 127, 0, 0, 0, 0, 0, 0, 9, 128, 2, 2, 2, 2, 2, + 2, 2, 129, 21, 20, 18, 46, 130, 131, 132, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, + 97, 74, 133, 134, 135, 0, 0, 0, 0, 2, 136, 2, 2, 2, 2, 137, + 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 138, 50, 51, 2, 2, + 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 139, 19, + 23, 0, 0, 140, 141, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 142, + 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, + 4, 119, 119, 119, 119, 120, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, + 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, + 0, 126, 18, 25, 29, 0, 0, 143, 144, 2, 2, 28, 2, 28, 2, 2, + 2, 2, 2, 2, 0, 12, 35, 0, 145, 2, 2, 11, 35, 0, 28, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, + 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, + 0, 2, 2, 2, 114, 114, 114, 114, 114, 146, 2, 7, 0, 0, 0, 0, + 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, + 2, 28, 2, 7, 0, 28, 2, 0, 0, 147, 148, 149, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 132, 0, 0, 0, + 0, 0, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 2, 2, 2, 2, + 2, 51, 50, 51, 0, 0, 0, 0, 151, 9, 72, 2, 2, 2, 2, 2, + 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 126, 18, 20, 152, + 20, 19, 153, 154, 2, 2, 2, 2, 2, 0, 0, 63, 155, 0, 0, 0, + 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, + 20, 106, 156, 0, 0, 157, 158, 29, 159, 28, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 160, 42, 0, 0, 0, + 44, 2, 2, 2, 7, 7, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, + 28, 2, 2, 2, 2, 2, 2, 2, 8, 16, 17, 19, 20, 161, 29, 0, + 0, 9, 9, 28, 2, 2, 2, 7, 28, 7, 2, 28, 2, 2, 56, 15, + 21, 14, 21, 45, 30, 31, 30, 32, 0, 0, 0, 0, 33, 0, 0, 0, + 2, 2, 21, 0, 9, 9, 9, 44, 0, 9, 9, 44, 0, 0, 0, 0, + 0, 2, 2, 63, 23, 18, 18, 18, 20, 21, 124, 13, 15, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 0, 0, 162, 163, 0, 0, 0, 0, 0, 0, + 0, 16, 17, 18, 18, 64, 97, 23, 159, 9, 164, 7, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 63, 23, 18, 18, 0, 46, 46, 9, + 165, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 18, + 0, 21, 17, 18, 18, 19, 14, 80, 165, 36, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 8, 166, 23, 18, 20, 20, 164, 7, 0, 0, + 0, 2, 2, 2, 2, 2, 7, 41, 134, 21, 20, 18, 74, 19, 20, 0, + 0, 2, 2, 2, 7, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 16, + 17, 18, 19, 20, 103, 165, 35, 0, 0, 2, 2, 2, 7, 28, 0, 2, + 2, 2, 2, 28, 7, 2, 2, 2, 2, 21, 21, 16, 30, 31, 10, 167, + 168, 169, 170, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 2, 2, + 2, 63, 23, 18, 18, 0, 20, 21, 27, 106, 0, 31, 0, 0, 0, 0, + 0, 50, 18, 20, 20, 20, 138, 2, 2, 2, 171, 172, 9, 13, 173, 70, + 174, 0, 0, 1, 145, 0, 0, 0, 0, 50, 18, 20, 14, 17, 18, 2, + 2, 2, 2, 156, 156, 156, 175, 175, 175, 175, 175, 175, 13, 176, 0, 28, + 0, 20, 18, 18, 29, 20, 20, 9, 165, 0, 59, 59, 59, 59, 59, 59, + 59, 64, 19, 80, 44, 0, 0, 0, 0, 2, 2, 2, 7, 2, 28, 2, + 2, 50, 20, 20, 29, 0, 36, 20, 25, 9, 158, 177, 173, 0, 0, 0, + 0, 2, 2, 2, 28, 7, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, + 45, 20, 33, 80, 66, 0, 0, 0, 0, 2, 178, 64, 45, 0, 0, 0, + 0, 179, 179, 179, 106, 7, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 7, 0, 56, 180, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, + 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, + 35, 0, 4, 119, 119, 119, 120, 0, 0, 9, 9, 9, 47, 2, 2, 2, + 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 42, 42, 42, 90, 0, + 0, O, O, O, GB, B, B, GB, O, O, WJ,FMPst,FMPst, O, CGJ, B, + O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B,CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, + B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, + VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst,VMPst, O, B, VBlw, O, O, VPre, VPre, + O, VPre, H, O, VPst,FMAbv, O,CMBlw, O, VAbv, O, VAbv, H, O,VMBlw,VMAbv, + CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, + B, O, CS, CS, O, B, VAbv, VAbv, B, R, O, HVM, O, O, FBlw, O, + CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, SUB, O, SUB, SUB, O, FBlw, O, B, + VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst, + VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv,VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, + CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv,VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, + CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, + FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv, + VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O,SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, + FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, CS, CS,VMPst, O,FMAbv, ZWNJ, CGJ, WJ, + WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H,VMAbv, VAbv,VMBlw, B, VBlw, FPst, + VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, O, VBlw, MPst, MPre, MAbv, MBlw, + O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O,VMPst, IS, O,VMPst, VBlw, VPst, + VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, CS, CS, B, N, N, O, + HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, R, O,FMBlw,CMBlw, VAbv, VPre, + VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, H,VMPst, VAbv,VMAbv, + VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, MBlw, MBlw, GB, FBlw, + FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, H, H, O, VBlw, }; static const uint16_t -hb_use_u16[2056] = +hb_use_u16[768] = { 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 11, - 0, 0, 0, 0, 9, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13, 9, 9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 17, 25, - 26, 20, 21, 27, 28, 29, 30, 31, 32, 33, 21, 34, 35, 0, 17, 36, - 37, 20, 21, 38, 23, 39, 17, 40, 41, 42, 43, 44, 45, 46, 30, 0, - 47, 48, 21, 49, 50, 51, 17, 0, 52, 48, 21, 53, 50, 54, 17, 55, - 56, 48, 9, 57, 58, 59, 17, 0, 60, 61, 9, 62, 63, 64, 30, 65, - 66, 67, 9, 68, 69, 9, 70, 71, 72, 73, 74, 75, 76, 0, 0, 0, - 9, 9, 77, 78, 79, 80, 81, 82, 83, 84, 0, 0, 0, 0, 0, 0, - 9, 85, 9, 86, 9, 87, 88, 89, 9, 9, 9, 90, 91, 92, 2, 0, - 93, 0, 9, 9, 9, 9, 9, 94, 95, 9, 96, 0, 0, 0, 0, 0, - 97, 98, 99,100, 30, 9,101,102, 9, 9,103, 9,104,105, 0, 0, - 9,106, 9, 9, 9,107,108,109, 2, 2, 0, 0, 0, 0, 0, 0, - 110, 9, 9,111,112, 2,113,114,115, 9,116, 9, 9, 9,117,118, - 9, 9,119,120,121, 0, 0, 0, 0, 0, 0, 0, 0,122,123,124, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,125, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, 9, 10, 11, + 0, 0, 0, 0, 9, 12, 0, 0, 13, 9, 9, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 17, 25, 26, 20, 21, 27, 28, 29, 30, 31, + 32, 33, 21, 34, 35, 0, 17, 36, 37, 20, 21, 38, 23, 39, 17, 40, + 41, 42, 43, 44, 45, 46, 30, 0, 47, 48, 21, 49, 50, 51, 17, 0, + 52, 48, 21, 53, 50, 54, 17, 55, 56, 48, 9, 57, 58, 59, 17, 0, + 60, 61, 9, 62, 63, 64, 30, 65, 66, 67, 9, 68, 69, 9, 70, 71, + 72, 73, 74, 75, 76, 0, 0, 0, 9, 9, 77, 78, 79, 80, 81, 82, + 83, 84, 0, 0, 0, 0, 0, 0, 9, 85, 9, 86, 9, 87, 88, 89, + 9, 9, 9, 90, 91, 92, 2, 0, 93, 0, 9, 9, 9, 9, 9, 94, + 95, 9, 96, 0, 0, 0, 0, 0, 97, 98, 99,100, 30, 9,101,102, + 9, 9,103, 9,104,105, 0, 0, 9,106, 9, 9, 9,107,108,109, + 2, 2, 0, 0, 0, 0, 0, 0,110, 9, 9,111,112, 2,113,114, + 115, 9,116, 9, 9, 9,117,118, 9, 9,119,120,121, 0, 0, 0, + 0, 0, 0, 0, 0,122,123,124, 0, 0, 0, 0, 0, 0, 0,125, 126,127,128, 0, 0, 0,129,130,131, 0, 0, 0, 0, 0, 0,132, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133, 0, 0, 0, - 0, 0, 0, 9, 9, 9,134,135, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0,133, 0, 0, 0, 0, 0, 0, 9, 9, 9,134,135, 136, 9,137, 0, 9, 9, 9,138,139, 9, 9,140,141, 2,142,143, 9, 9,144, 9,145,146, 0, 0,147, 9, 9,148,149, 2,150, 98, 9, 9,151,152,153, 2, 9,154, 9, 9, 9,155,156, 0,157,158, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,159, 2, - 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162, + 0, 0, 0, 0, 9, 9,159, 2,160, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,163,163,164, 33,165, 0, 0, 0, 0, 166,167, 9,168, 94, 0, 0, 0, 0, 0, 0, 0, 69, 9,169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9,170,171, 0, 0, 0, 0, 0, - 9, 9,172, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,173,170, 0, 0, 0, 0, - 0, 0, 0, 9,174,175, 0, 9,176, 0, 0,177,178, 0, 0, 0, - 179, 9, 9,180,181,182,183,184,185, 9, 9,186,187, 0, 0, 0, - 188, 9,189,190,191, 9, 9,192,185, 9, 9,193,194,105,195,102, - 9, 33,196,197, 0, 0, 0, 0,198,199, 94, 9, 9,200,201, 2, - 202, 20, 21,203,204,205,206,207, 0, 0, 0, 0, 0, 0, 0, 0, + 9,170,171, 0, 0, 0, 0, 0, 9, 9,172, 2, 0, 0, 0, 0, + 9, 9,173,170, 0, 0, 0, 0, 0, 0, 0, 9,174,175, 0, 9, + 176, 0, 0,177,178, 0, 0, 0,179, 9, 9,180,181,182,183,184, + 185, 9, 9,186,187, 0, 0, 0,188, 9,189,190,191, 9, 9,192, + 185, 9, 9,193,194,105,195,102, 9, 33,196,197, 0, 0, 0, 0, + 198,199, 94, 9, 9,200,201, 2,202, 20, 21,203,204,205,206,207, 9, 9, 9,208,209,210,211, 0,195, 9, 9,212,213, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9,214,215,216,217, 0, 0, - 9, 9, 9,218,219, 2, 0, 0, 9, 9,220,221, 2, 0, 0, 0, - 9,222,223,103,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9,225,226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 227,228, 9,229,230, 2, 0, 0, 0, 0,231, 9, 9,232,233, 0, - 234, 9, 9,235,236,237, 9, 9,238,239, 0, 0, 0, 0, 0, 0, - 21, 9,214,240, 7, 9, 70, 18, 9,241, 73,242, 0, 0, 0, 0, - 243, 9, 9,244,245, 2,246, 9,247,248, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,249, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 98,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 9, 9, 9,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9,214,215,216,217, 0, 0, 9, 9, 9,218,219, 2, 0, 0, + 9, 9,220,221, 2, 0, 0, 0, 9,222,223,103,224, 0, 0, 0, + 9, 9,225,226, 0, 0, 0, 0,227,228, 9,229,230, 2, 0, 0, + 0, 0,231, 9, 9,232,233, 0,234, 9, 9,235,236,237, 9, 9, + 238,239, 0, 0, 0, 0, 0, 0, 21, 9,214,240, 7, 9, 70, 18, + 9,241, 73,242, 0, 0, 0, 0,243, 9, 9,244,245, 2,246, 9, + 247,248, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,249, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 98,250, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, 9, 9, 9,251, 0, 0, 0, 0, 9, 9, 9, 9,252,253,254,254,255,256, 0, 0, 0, 0,257, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,258, 0, 0, - 9, 9, 9, 9, 9, 9,105, 70, 94,259, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,260, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 70,261,262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,263, 0, 9, 9,264, 2, - 9, 9, 9, 9,265, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 9, 9, 9, 9, 9,258, 0, 0, 9, 9, 9, 9, 9, 9,105, 70, + 94,259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,260, + 9, 9, 70,261,262, 0, 0, 0, 0, 9,263, 0, 9, 9,264, 2, + 9, 9, 9, 9,265, 2, 0, 0,129,129,129,129,129,129,129,129, 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,129, - 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 4, 0, 0, 5, - 6, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, - 0, 0, 10, 2, 2, 2, 2, 2, 2, 2, 11, 12, 12, 0, 13, 14, - 2, 2, 15, 0, 16, 2, 2, 2, 2, 2, 17, 18, 19, 20, 21, 22, - 23, 24, 2, 2, 25, 10, 2, 2, 10, 2, 2, 2, 26, 27, 2, 28, - 28, 2, 2, 2, 2, 2, 29, 2, 30, 10, 3, 18, 19, 31, 32, 33, - 0, 34, 0, 35, 3, 0, 0, 36, 37, 27, 38, 39, 29, 40, 3, 41, - 42, 43, 44, 45, 46, 0, 27, 30, 0, 10, 2, 2, 47, 48, 0, 0, - 37, 27, 2, 35, 35, 2, 2, 2, 29, 27, 3, 18, 19, 49, 50, 51, - 0, 0, 52, 53, 54, 27, 2, 28, 29, 27, 3, 55, 0, 56, 0, 35, - 57, 0, 0, 0, 58, 27, 38, 10, 29, 3, 40, 29, 39, 9, 38, 10, - 2, 2, 3, 59, 60, 61, 62, 33, 0, 34, 0, 0, 63, 64, 2, 29, - 29, 2, 2, 2, 2, 2, 3, 65, 21, 66, 67, 45, 0, 68, 38, 0, - 69, 27, 2, 29, 2, 27, 3, 55, 0, 70, 0, 13, 71, 0, 0, 0, - 72, 2, 2, 29, 2, 2, 73, 74, 75, 76, 62, 77, 0, 34, 0, 39, - 54, 27, 2, 2, 2, 38, 10, 2, 35, 2, 2, 57, 2, 38, 78, 34, - 79, 80, 81, 82, 59, 0, 0, 0, 3, 38, 0, 0, 0, 0, 83, 0, - 2, 84, 85, 86, 2, 2, 27, 2, 2, 2, 2, 9, 87, 88, 89, 90, - 91, 92, 2, 93, 94, 94, 95, 94, 94, 94, 94, 94, 94, 94, 94, 96, - 0, 97, 0, 0, 2, 2, 98, 99,100,101,102,103, 2, 2,104,105, - 2,106,107,108,109,110,111,112,113,114, 2, 2,115,116,117,118, - 2, 2,119,120,121,122, 0, 39,121,123, 0, 0,121, 0, 0, 0, - 2, 2, 2, 29,124, 0, 0, 0, 2,125,126,127,128,129,130,131, - 132, 0, 0,133, 9, 39,134,135, 2, 2, 9, 0,136,137, 2, 2, - 2, 2,138, 0,139, 2, 2, 2, 2, 2, 2, 38,140,141,142, 0, - 143,144,145, 0, 2, 2, 2, 3, 2, 9, 0, 0, 2, 2, 2, 0, - 2, 2,146, 0, 2, 2, 38, 0, 2, 73,147, 0, 2,148,149,150, - 151,141,152,153,154, 12,155,156,157,158, 2, 2, 2,159,160,161, - 162,163, 2, 9, 0, 0,164,165,166, 0, 0, 0,167, 2, 2, 2, - 93,168,169,170, 2,171,172,173,174, 0, 0, 0, 2,175,176,177, - 178,179, 0, 0, 2, 2, 3, 27,180,181,182,181,183,181,184, 46, - 0,185,186, 0, 0, 0,187, 0, 0, 0,188,189,136, 4, 0, 0, - 0, 0,190,191,192,192,192,192, 0,193, 0, 0, 6,193, 0, 0, - 194, 0, 0, 0, 0, 0, 0, 9, 2, 2, 0, 39, 0, 0, 0,195, - 196,197, 11, 2, 98,198, 0,199, 2, 0, 0, 0,112, 2, 2, 2, - 2,200,201,201,201,202, 0, 0, 12, 12, 12, 12,203, 0, 0,204, - 2,205,206,207, 2,208,209,210,211, 0, 0, 0,212, 2, 2, 2, - 213, 79,127,214,215, 0, 0, 0, 2,216, 2, 2, 2, 2,217,218, - 219,220, 0, 0,221, 2, 2,222, 27,223,224,225,226,227,114,228, - 229, 0, 0, 0, 2, 2,230,231, 0,232, 0, 0, 98,233,234,235, - 236,236,236,236, 0, 0, 0,188,192,192,237, 0, 2, 2, 38, 2, - 38, 35, 2, 2, 35, 2, 35, 9,238, 68, 0,239, 2, 27, 27, 2, - 2, 3,240,241, 2,242, 39, 2, 3, 0, 0, 0, 0, 0, 27, 38, - 2,243, 0, 0, 2, 2,244,245, 2,246,181,181,247, 9, 0, 0, - 248,249, 0, 0, 29, 38, 2, 2, 27, 9, 27, 0,250,251, 2, 2, - 2, 2,252,160,253,254, 0, 0,255,256,256,256,256,257, 2, 2, - 258,259, 0,260,261, 2, 2, 2,262,263,264, 0,265, 0, 0, 0, - 266, 2, 2, 2, 2,208,253,267,268,269, 2, 2, 0,270, 0, 0, - 271, 0, 0, 0, 98,272,160,252,273, 0,274,275, 27, 2, 2, 2, - 2, 2, 2, 75,252,276, 0, 58, 2, 38, 29, 35, 2, 2, 2, 35, - 2, 2, 2, 11,262, 20,277, 0, 12, 27, 2, 28, 29, 27,278,279, - 21,280, 32, 33, 0, 34, 0, 10,106,281, 12,194, 12,194, 0, 0, - 2,282,160,253,283,284, 0, 0, 2, 2, 3,285,286, 0, 0, 0, - 262,160,287,288,289, 9, 0, 0, 2, 2, 2, 98,272, 83,128,290, - 291, 0, 0, 0, 0, 0, 2, 83, 75,160,263,292,245, 0, 0, 0, - 2, 2, 11,293,253,294, 9, 0, 2, 2, 38,295, 79,296, 20, 0, - 2, 38, 0, 0, 2, 2, 2,262,297,298,299, 0, 2, 38, 57, 2, - 2, 40, 2, 2,201,300,301,302,303, 0, 0, 0, 2, 2, 10, 2, - 282,160,304,305,306,307, 0, 0,308,252,309, 2,310,311,312,313, - 0,314, 0, 0,308,315, 19, 2, 2,316,317,318,318,319,320, 57, - 89,321,252,290,322, 94, 94, 94,323,324, 0, 0, 2, 38, 35, 2, - 113,325,326,327,328,329, 0, 0, 2, 35, 29, 2, 2, 2,106,330, - 50,331, 0, 0,332,333, 0, 0,334,335, 9, 0, 12,180, 0, 0, - 2, 2, 38,336,337,160,160,160,160,160,160,160,160,160, 0,338, - 339, 0, 0, 0, 0, 9, 0, 0, 2, 3, 0, 0, 2, 2, 3,340, - 188,192,191, 0, 12,266, 2, 3, 2, 2, 3, 10, 2, 2, 2,341, - 2, 2, 2, 12, 2,342,343, 0, }; +static inline unsigned +hb_use_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} static inline uint_fast8_t hb_use_get_category (unsigned u) { - return u<921600u?hb_use_u8[466+(((hb_use_u16[992+(((hb_use_u16[((hb_use_u8[226+(((hb_use_u8[u>>2>>2>>4>>4])<<4)+((u>>2>>2>>4)&15u))])<<4)+((u>>2>>2)&15u)])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:O; + return u<921600u?hb_use_u8[2721+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } #undef B @@ -392,5 +393,26 @@ hb_use_get_category (unsigned u) #undef VMPre +#ifdef HB_USE_TABLE_MAIN +int main (int argc, char **argv) +{ + if (argc != 2) + { + for (unsigned u = 0; u < 0x10FFFFu; u++) + printf ("U+%04X %d\n", u, hb_use_get_category (u)); + return 0; + } + + hb_codepoint_t u; + sscanf (argv[1], "%x", &u); + + printf ("%d\n", hb_use_get_category (u)); + + return 0; +} + +#endif + + #endif /* HB_OT_SHAPER_USE_TABLE_HH */ /* == End of generated table == */ diff --git a/thirdparty/harfbuzz/src/hb-repacker.hh b/thirdparty/harfbuzz/src/hb-repacker.hh index 173fe4a2fb..61b142238e 100644 --- a/thirdparty/harfbuzz/src/hb-repacker.hh +++ b/thirdparty/harfbuzz/src/hb-repacker.hh @@ -29,10 +29,9 @@ #include "hb-open-type.hh" #include "hb-map.hh" -#include "hb-priority-queue.hh" -#include "hb-serialize.hh" #include "hb-vector.hh" #include "graph/graph.hh" +#include "graph/gsubgpos-graph.hh" #include "graph/serialize.hh" using graph::graph_t; @@ -42,6 +41,143 @@ using graph::graph_t; * docs/repacker.md */ +struct lookup_size_t +{ + unsigned lookup_index; + size_t size; + unsigned num_subtables; + + static int cmp (const void* a, const void* b) + { + return cmp ((const lookup_size_t*) a, + (const lookup_size_t*) b); + } + + static int cmp (const lookup_size_t* a, const lookup_size_t* b) + { + double subtables_per_byte_a = (double) a->num_subtables / (double) a->size; + double subtables_per_byte_b = (double) b->num_subtables / (double) b->size; + if (subtables_per_byte_a == subtables_per_byte_b) { + return b->lookup_index - a->lookup_index; + } + + double cmp = subtables_per_byte_b - subtables_per_byte_a; + if (cmp < 0) return -1; + if (cmp > 0) return 1; + return 0; + } +}; + +static inline +bool _presplit_subtables_if_needed (graph::gsubgpos_graph_context_t& ext_context) +{ + // For each lookup this will check the size of subtables and split them as needed + // so that no subtable is at risk of overflowing. (where we support splitting for + // that subtable type). + // + // TODO(grieger): de-dup newly added nodes as necessary. Probably just want a full de-dup + // pass after this processing is done. Not super necessary as splits are + // only done where overflow is likely, so de-dup probably will get undone + // later anyways. + for (unsigned lookup_index : ext_context.lookups.keys ()) + { + graph::Lookup* lookup = ext_context.lookups.get(lookup_index); + if (!lookup->split_subtables_if_needed (ext_context, lookup_index)) + return false; + } + + return true; +} + +/* + * Analyze the lookups in a GSUB/GPOS table and decide if any should be promoted + * to extension lookups. + */ +static inline +bool _promote_extensions_if_needed (graph::gsubgpos_graph_context_t& ext_context) +{ + // Simple Algorithm (v1, current): + // 1. Calculate how many bytes each non-extension lookup consumes. + // 2. Select up to 64k of those to remain as non-extension (greedy, highest subtables per byte first) + // 3. Promote the rest. + // + // Advanced Algorithm (v2, not implemented): + // 1. Perform connected component analysis using lookups as roots. + // 2. Compute size of each connected component. + // 3. Select up to 64k worth of connected components to remain as non-extensions. + // (greedy, highest subtables per byte first) + // 4. Promote the rest. + + // TODO(garretrieger): support extension demotion, then consider all lookups. Requires advanced algo. + // TODO(garretrieger): also support extension promotion during iterative resolution phase, then + // we can use a less conservative threshold here. + // TODO(grieger): skip this for the 24 bit case. + if (!ext_context.lookups) return true; + + hb_vector_t<lookup_size_t> lookup_sizes; + lookup_sizes.alloc (ext_context.lookups.get_population ()); + + for (unsigned lookup_index : ext_context.lookups.keys ()) + { + const graph::Lookup* lookup = ext_context.lookups.get(lookup_index); + hb_set_t visited; + lookup_sizes.push (lookup_size_t { + lookup_index, + ext_context.graph.find_subgraph_size (lookup_index, visited), + lookup->number_of_subtables (), + }); + } + + lookup_sizes.qsort (); + + size_t lookup_list_size = ext_context.graph.vertices_[ext_context.lookup_list_index].table_size (); + size_t l2_l3_size = lookup_list_size; // Lookup List + Lookups + size_t l3_l4_size = 0; // Lookups + SubTables + size_t l4_plus_size = 0; // SubTables + their descendants + + // Start by assuming all lookups are using extension subtables, this size will be removed later + // if it's decided to not make a lookup extension. + for (auto p : lookup_sizes) + { + unsigned subtables_size = p.num_subtables * 8; + l3_l4_size += subtables_size; + l4_plus_size += subtables_size; + } + + bool layers_full = false; + for (auto p : lookup_sizes) + { + const graph::Lookup* lookup = ext_context.lookups.get(p.lookup_index); + if (lookup->is_extension (ext_context.table_tag)) + // already an extension so size is counted by the loop above. + continue; + + if (!layers_full) + { + size_t lookup_size = ext_context.graph.vertices_[p.lookup_index].table_size (); + hb_set_t visited; + size_t subtables_size = ext_context.graph.find_subgraph_size (p.lookup_index, visited, 1) - lookup_size; + size_t remaining_size = p.size - subtables_size - lookup_size; + + l2_l3_size += lookup_size; + l3_l4_size += lookup_size + subtables_size; + l3_l4_size -= p.num_subtables * 8; + l4_plus_size += subtables_size + remaining_size; + + if (l2_l3_size < (1 << 16) + && l3_l4_size < (1 << 16) + && l4_plus_size < (1 << 16)) continue; // this lookup fits within all layers groups + + layers_full = true; + } + + if (!ext_context.lookups.get(p.lookup_index)->make_extension (ext_context, p.lookup_index)) + return false; + } + + return true; +} + static inline bool _try_isolating_subgraphs (const hb_vector_t<graph::overflow_record_t>& overflows, graph_t& sorted_graph) @@ -157,7 +293,8 @@ template<typename T> inline hb_blob_t* hb_resolve_overflows (const T& packed, hb_tag_t table_tag, - unsigned max_rounds = 20) { + unsigned max_rounds = 20, + bool recalculate_extensions = false) { graph_t sorted_graph (packed); sorted_graph.sort_shortest_distance (); @@ -167,13 +304,31 @@ hb_resolve_overflows (const T& packed, return graph::serialize (sorted_graph); } + graph::gsubgpos_graph_context_t ext_context (table_tag, sorted_graph); if ((table_tag == HB_OT_TAG_GPOS || table_tag == HB_OT_TAG_GSUB) && will_overflow) { + if (recalculate_extensions) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, "Splitting subtables if needed."); + if (!_presplit_subtables_if_needed (ext_context)) { + DEBUG_MSG (SUBSET_REPACK, nullptr, "Subtable splitting failed."); + return nullptr; + } + + DEBUG_MSG (SUBSET_REPACK, nullptr, "Promoting lookups to extensions if needed."); + if (!_promote_extensions_if_needed (ext_context)) { + DEBUG_MSG (SUBSET_REPACK, nullptr, "Extensions promotion failed."); + return nullptr; + } + } + DEBUG_MSG (SUBSET_REPACK, nullptr, "Assigning spaces to 32 bit subgraphs."); if (sorted_graph.assign_spaces ()) sorted_graph.sort_shortest_distance (); + else + sorted_graph.sort_shortest_distance_if_needed (); } unsigned round = 0; diff --git a/thirdparty/harfbuzz/src/hb-set.cc b/thirdparty/harfbuzz/src/hb-set.cc index 5bf9d7c8cd..0270b21998 100644 --- a/thirdparty/harfbuzz/src/hb-set.cc +++ b/thirdparty/harfbuzz/src/hb-set.cc @@ -145,7 +145,7 @@ hb_set_set_user_data (hb_set_t *set, * Since: 0.9.2 **/ void * -hb_set_get_user_data (hb_set_t *set, +hb_set_get_user_data (const hb_set_t *set, hb_user_data_key_t *key) { return hb_object_get_user_data (set, key); diff --git a/thirdparty/harfbuzz/src/hb-set.h b/thirdparty/harfbuzz/src/hb-set.h index 56902c267e..93636ab5d7 100644 --- a/thirdparty/harfbuzz/src/hb-set.h +++ b/thirdparty/harfbuzz/src/hb-set.h @@ -77,7 +77,7 @@ hb_set_set_user_data (hb_set_t *set, hb_bool_t replace); HB_EXTERN void * -hb_set_get_user_data (hb_set_t *set, +hb_set_get_user_data (const hb_set_t *set, hb_user_data_key_t *key); diff --git a/thirdparty/harfbuzz/src/hb-shape-plan.cc b/thirdparty/harfbuzz/src/hb-shape-plan.cc index 8dbb661cd2..9e513c0458 100644 --- a/thirdparty/harfbuzz/src/hb-shape-plan.cc +++ b/thirdparty/harfbuzz/src/hb-shape-plan.cc @@ -358,8 +358,8 @@ hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan, * Since: 0.9.7 **/ void * -hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan, - hb_user_data_key_t *key) +hb_shape_plan_get_user_data (const hb_shape_plan_t *shape_plan, + hb_user_data_key_t *key) { return hb_object_get_user_data (shape_plan, key); } diff --git a/thirdparty/harfbuzz/src/hb-shape-plan.h b/thirdparty/harfbuzz/src/hb-shape-plan.h index fc7c041899..aaf5cf9c45 100644 --- a/thirdparty/harfbuzz/src/hb-shape-plan.h +++ b/thirdparty/harfbuzz/src/hb-shape-plan.h @@ -102,8 +102,8 @@ hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan, hb_bool_t replace); HB_EXTERN void * -hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan, - hb_user_data_key_t *key); +hb_shape_plan_get_user_data (const hb_shape_plan_t *shape_plan, + hb_user_data_key_t *key); HB_EXTERN hb_bool_t diff --git a/thirdparty/harfbuzz/src/hb-subset-repacker.cc b/thirdparty/harfbuzz/src/hb-subset-repacker.cc index 03e3feb1f6..55ca48d709 100644 --- a/thirdparty/harfbuzz/src/hb-subset-repacker.cc +++ b/thirdparty/harfbuzz/src/hb-subset-repacker.cc @@ -25,18 +25,24 @@ #include "hb-repacker.hh" #ifdef HB_EXPERIMENTAL_API + /** * hb_subset_repack_or_fail: + * @table_tag: tag of the table being packed, needed to allow table specific optimizations. * @hb_objects: raw array of struct hb_object_t, which provides * object graph info * @num_hb_objs: number of hb_object_t in the hb_objects array. * * Given the input object graph info, repack a table to eliminate * offset overflows. A nullptr is returned if the repacking attempt fails. + * Table specific optimizations (eg. extension promotion in GSUB/GPOS) may be performed. + * Passing HB_TAG_NONE will disable table specific optimizations. * * Since: EXPERIMENTAL **/ -hb_blob_t* hb_subset_repack_or_fail (hb_object_t* hb_objects, unsigned num_hb_objs) +hb_blob_t* hb_subset_repack_or_fail (hb_tag_t table_tag, + hb_object_t* hb_objects, + unsigned num_hb_objs) { hb_vector_t<const hb_object_t *> packed; packed.alloc (num_hb_objs + 1); @@ -44,6 +50,9 @@ hb_blob_t* hb_subset_repack_or_fail (hb_object_t* hb_objects, unsigned num_hb_ob for (unsigned i = 0 ; i < num_hb_objs ; i++) packed.push (&(hb_objects[i])); - return hb_resolve_overflows (packed, HB_OT_TAG_GSUB); + return hb_resolve_overflows (packed, + table_tag, + 20, + true); } #endif diff --git a/thirdparty/harfbuzz/src/hb-subset-repacker.h b/thirdparty/harfbuzz/src/hb-subset-repacker.h index e28f879362..245cf60765 100644 --- a/thirdparty/harfbuzz/src/hb-subset-repacker.h +++ b/thirdparty/harfbuzz/src/hb-subset-repacker.h @@ -70,7 +70,8 @@ struct hb_object_t typedef struct hb_object_t hb_object_t; HB_EXTERN hb_blob_t* -hb_subset_repack_or_fail (hb_object_t* hb_objects, +hb_subset_repack_or_fail (hb_tag_t table_tag, + hb_object_t* hb_objects, unsigned num_hb_objs); #endif diff --git a/thirdparty/harfbuzz/src/hb-ucd-table.hh b/thirdparty/harfbuzz/src/hb-ucd-table.hh index 9e76ca460b..14734c91ea 100644 --- a/thirdparty/harfbuzz/src/hb-ucd-table.hh +++ b/thirdparty/harfbuzz/src/hb-ucd-table.hh @@ -1068,2860 +1068,6 @@ _hb_ucd_dm2_u64_map[388] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[33120] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 28, 26, 29, 30, 31, 32, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 33, 34, 34, 34, 34, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 26, 56, 57, 58, 58, 58, 58, 59, 26, 26, 60, 58, 58, 58, 58, 58, - 58, 58, 26, 61, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 26, 62, 58, 63, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 64, 26, 26, 65, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 66, 67, 68, 58, 58, 58, 58, 69, 58, - 58, 58, 58, 58, 58, 58, 58, 70, 71, 72, 73, 74, 75, 76, 58, 77, - 78, 79, 58, 80, 81, 58, 82, 83, 84, 85, 75, 86, 87, 88, 58, 58, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 89, 26, 26, 26, 26, 26, 26, 26, 90, 91, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 92, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 93, 58, 58, 58, 58, 58, 58, 26, 94, 58, 58, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 95, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 96, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 97, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 98, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 29, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 25, 25, 25, 21, - 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 21, 18, 24, 16, - 24, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 0, - 29, 21, 23, 23, 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, - 26, 25, 15, 15, 24, 5, 21, 21, 24, 15, 7, 19, 15, 15, 15, 21, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 25, 9, 9, 9, 9, 9, 9, 9, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 5, 5, - 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, - 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 9, 5, 5, - 5, 9, 9, 5, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 9, 9, - 9, 9, 5, 9, 9, 5, 9, 9, 9, 5, 5, 5, 9, 9, 5, 9, - 9, 5, 9, 5, 9, 5, 9, 9, 5, 9, 5, 5, 9, 5, 9, 9, - 5, 9, 9, 9, 5, 9, 5, 9, 9, 5, 5, 7, 9, 5, 5, 5, - 7, 7, 7, 7, 9, 8, 5, 9, 8, 5, 9, 8, 5, 9, 5, 9, - 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, - 5, 9, 8, 5, 9, 5, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 9, 9, 5, 9, 9, 5, - 5, 9, 5, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 6, 6, 6, 6, 6, 24, 24, 24, 24, 24, 24, 24, 6, 24, 6, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 9, 5, 9, 5, 6, 24, 9, 5, 2, 2, 6, 5, 5, 5, 21, 9, - 2, 2, 2, 2, 24, 24, 9, 21, 9, 9, 9, 2, 9, 2, 9, 9, - 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, - 5, 5, 9, 9, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 5, 5, 5, 5, 9, 5, 25, 9, 5, 9, 9, 5, 5, 9, 9, 9, - 9, 5, 26, 12, 12, 12, 12, 12, 11, 11, 9, 5, 9, 5, 9, 5, - 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, - 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 2, 2, 6, 21, 21, 21, 21, 21, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 17, 2, 2, 26, 26, 23, - 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 17, 12, - 21, 12, 12, 21, 12, 12, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, - 7, 7, 7, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 25, 25, 25, 21, 21, 23, 21, 21, 26, 26, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 1, 21, 21, 21, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 7, 7, - 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 21, 7, 12, 12, 12, 12, 12, 12, 12, 1, 26, 12, - 12, 12, 12, 12, 12, 6, 6, 12, 12, 26, 12, 12, 12, 12, 7, 7, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 26, 26, 7, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 1, - 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 6, 6, 26, 21, 21, 21, 6, 2, 2, 12, 23, 23, - 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 6, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 6, 12, 12, 12, 6, 12, 12, 12, 12, 12, 2, 2, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 2, 2, 21, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 24, 7, 7, 7, 7, 7, 7, 2, - 1, 1, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 12, 12, 12, 12, 12, 12, - 12, 12, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 7, 10, 10, - 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 12, 10, 10, - 7, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 12, 12, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 21, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, - 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, - 7, 2, 7, 2, 2, 2, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, - 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 7, 2, - 2, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 7, 7, 2, 7, - 7, 7, 12, 12, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 7, 7, 23, 23, 15, 15, 15, 15, 15, 15, 26, 23, 7, 21, 12, 2, - 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, - 7, 2, 7, 7, 2, 7, 7, 2, 7, 7, 2, 2, 12, 2, 10, 10, - 10, 12, 12, 2, 2, 2, 2, 12, 12, 2, 2, 12, 12, 12, 2, 2, - 2, 12, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, 7, 2, 7, 2, - 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 12, 12, 7, 7, 7, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 12, 12, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, - 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 10, - 10, 12, 12, 12, 12, 12, 2, 12, 12, 10, 2, 10, 10, 12, 2, 2, - 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 21, 23, 2, 2, 2, 2, 2, 2, 2, 7, 12, 12, 12, 12, 12, 12, - 2, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, - 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, - 10, 12, 12, 12, 12, 2, 2, 10, 10, 2, 2, 10, 10, 12, 2, 2, - 2, 2, 2, 2, 2, 12, 12, 10, 2, 2, 2, 2, 7, 7, 2, 7, - 26, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 12, 7, 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, - 7, 2, 7, 7, 7, 7, 2, 2, 2, 7, 7, 2, 7, 2, 7, 7, - 2, 2, 2, 7, 7, 2, 2, 2, 7, 7, 7, 2, 2, 2, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 10, 10, - 12, 10, 10, 2, 2, 2, 10, 10, 10, 2, 10, 10, 10, 12, 2, 2, - 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 26, 26, 26, 26, 26, 26, 23, 26, 2, 2, 2, 2, 2, - 12, 10, 10, 10, 12, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, - 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 7, 12, 12, - 12, 10, 10, 10, 10, 2, 12, 12, 12, 2, 12, 12, 12, 12, 2, 2, - 2, 2, 2, 2, 2, 12, 12, 2, 7, 7, 7, 2, 2, 7, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 15, 15, 15, 15, 15, 15, 15, 26, - 7, 12, 10, 10, 21, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, - 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 2, 12, 7, 10, 12, - 10, 10, 10, 10, 10, 2, 12, 10, 10, 2, 10, 10, 12, 12, 2, 2, - 2, 2, 2, 2, 2, 10, 10, 2, 2, 2, 2, 2, 2, 7, 7, 2, - 2, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 7, 10, 10, - 10, 12, 12, 12, 12, 2, 10, 10, 10, 2, 10, 10, 10, 12, 7, 26, - 2, 2, 2, 2, 7, 7, 7, 10, 15, 15, 15, 15, 15, 15, 15, 7, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 7, 7, 7, 7, 7, 7, - 2, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 7, 7, 7, 7, 7, 7, - 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 12, 2, 2, 2, 2, 10, - 10, 10, 12, 12, 12, 2, 12, 2, 10, 10, 10, 10, 10, 10, 10, 10, - 2, 2, 10, 10, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 23, - 7, 7, 7, 7, 7, 7, 6, 12, 12, 12, 12, 12, 12, 12, 12, 21, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, - 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 12, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 2, 2, - 7, 7, 7, 7, 7, 2, 6, 2, 12, 12, 12, 12, 12, 12, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 7, 7, 7, 7, - 7, 26, 26, 26, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 26, 21, 26, 26, 26, 12, 12, 26, 26, 26, 26, 26, 26, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 26, 12, 26, 12, 26, 12, 22, 18, 22, 18, 10, 10, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, - 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, - 12, 12, 12, 12, 12, 21, 12, 12, 7, 7, 7, 7, 7, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 26, 26, - 26, 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 2, 26, 26, - 21, 21, 21, 21, 21, 26, 26, 26, 26, 21, 21, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 12, - 12, 10, 12, 12, 12, 12, 12, 12, 10, 12, 12, 10, 10, 12, 12, 7, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 21, 21, 21, 21, - 7, 7, 7, 7, 7, 7, 10, 10, 12, 12, 7, 7, 7, 7, 12, 12, - 12, 7, 10, 10, 10, 7, 7, 10, 10, 10, 10, 10, 10, 10, 7, 7, - 7, 12, 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 12, 10, 10, 12, 12, 10, 10, 10, 10, 10, 10, 12, 7, 10, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 10, 10, 10, 12, 26, 26, - 9, 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 2, 2, 9, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 21, 6, 5, 5, 5, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 2, - 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 2, - 7, 2, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, - 9, 9, 9, 9, 9, 9, 2, 2, 5, 5, 5, 5, 5, 5, 2, 2, - 17, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 26, 21, 7, - 29, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 22, 18, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 21, 21, 14, 14, - 14, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 12, 12, 12, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, - 7, 7, 12, 12, 10, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, - 7, 2, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 12, 12, 10, 12, 12, 12, 12, 12, 12, 12, 10, 10, - 10, 10, 10, 10, 10, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 21, 21, 21, 6, 21, 21, 21, 23, 7, 12, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, - 21, 21, 21, 21, 21, 21, 17, 21, 21, 21, 21, 12, 12, 12, 1, 12, - 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 7, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, - 12, 12, 12, 10, 10, 10, 10, 12, 12, 10, 10, 10, 2, 2, 2, 2, - 10, 10, 12, 10, 10, 10, 10, 10, 10, 12, 12, 12, 2, 2, 2, 2, - 26, 2, 2, 2, 21, 21, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, - 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 2, 2, 2, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 7, 7, 7, 7, 7, 7, 7, 12, 12, 10, 10, 12, 2, 2, 21, 21, - 7, 7, 7, 7, 7, 10, 12, 10, 12, 12, 12, 12, 12, 12, 12, 2, - 12, 10, 12, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, - 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, - 21, 21, 21, 21, 21, 21, 21, 6, 21, 21, 21, 21, 21, 21, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, - 12, 12, 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 12, 10, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, - 10, 10, 12, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, - 21, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 21, 21, 2, - 12, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 12, 12, 12, 7, 7, - 7, 7, 7, 7, 7, 7, 12, 10, 12, 12, 10, 10, 10, 12, 10, 12, - 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, - 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 12, 12, 12, 12, - 12, 12, 12, 12, 10, 10, 12, 12, 2, 2, 2, 21, 21, 21, 21, 21, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 21, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, - 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 10, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 12, 7, 7, - 7, 7, 7, 7, 12, 7, 7, 10, 12, 12, 7, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, - 9, 5, 9, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, - 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 2, 9, 2, 9, 2, 9, 2, 9, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 8, 8, 8, 8, 8, 8, 8, 8, - 5, 5, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 5, 24, - 24, 24, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 24, - 5, 5, 5, 5, 2, 2, 5, 5, 9, 9, 9, 9, 2, 24, 24, 24, - 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 24, 24, 24, - 2, 2, 5, 5, 5, 2, 5, 5, 9, 9, 9, 9, 8, 24, 24, 2, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 1, 1, 1, 1, 1, - 17, 17, 17, 17, 17, 17, 21, 21, 20, 19, 22, 20, 20, 19, 22, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 27, 28, 1, 1, 1, 1, 1, 29, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 21, 21, 21, 21, 16, - 16, 21, 21, 21, 25, 22, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 25, 21, 16, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 29, - 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 15, 6, 2, 2, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 6, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 25, 25, 25, 22, 18, 2, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, - 11, 12, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 9, 26, 26, 26, 26, 9, 26, 26, 5, 9, 9, 9, 5, 5, - 9, 9, 9, 5, 26, 9, 26, 26, 25, 9, 9, 9, 9, 9, 26, 26, - 26, 26, 26, 26, 9, 26, 9, 26, 9, 26, 9, 9, 9, 9, 26, 5, - 9, 9, 9, 9, 5, 7, 7, 7, 7, 5, 26, 26, 5, 5, 9, 9, - 25, 25, 25, 25, 25, 9, 5, 5, 5, 5, 26, 25, 26, 26, 5, 26, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 9, 5, 14, 14, 14, 14, 15, 26, 26, 2, 2, 2, 2, - 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 25, 25, 26, 26, 26, 26, - 25, 26, 26, 25, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 25, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, - 26, 26, 25, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 26, 26, 26, 26, - 25, 25, 26, 26, 26, 26, 26, 26, 26, 22, 18, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, - 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, - 26, 26, 26, 26, 26, 26, 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, - 22, 18, 22, 18, 22, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 25, 25, 25, 25, 25, 22, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, - 25, 25, 25, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, - 18, 22, 18, 22, 18, 22, 18, 22, 18, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 22, 18, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 22, 18, 25, 25, - 25, 25, 25, 25, 25, 26, 26, 25, 25, 25, 25, 25, 25, 26, 26, 26, - 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 9, 5, 9, 9, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, - 9, 5, 9, 5, 5, 9, 5, 5, 5, 5, 5, 5, 6, 6, 9, 9, - 9, 5, 9, 5, 5, 26, 26, 26, 26, 26, 26, 9, 5, 9, 5, 12, - 12, 12, 9, 5, 2, 2, 2, 2, 2, 21, 21, 21, 21, 15, 21, 21, - 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 6, - 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 2, - 21, 21, 20, 19, 20, 19, 21, 21, 21, 20, 19, 21, 20, 19, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 17, 21, 21, 17, 21, 20, 19, 21, 21, - 20, 19, 22, 18, 22, 18, 22, 18, 22, 18, 21, 21, 21, 21, 21, 6, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 17, 17, 21, 21, 21, 21, - 17, 21, 22, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 26, 26, 21, 21, 21, 22, 18, 22, 18, 22, 18, 22, 18, 17, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, - 29, 21, 21, 21, 26, 6, 7, 14, 22, 18, 22, 18, 22, 18, 22, 18, - 22, 18, 26, 26, 22, 18, 22, 18, 22, 18, 22, 18, 17, 22, 18, 18, - 26, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 10, 10, - 17, 6, 6, 6, 6, 6, 26, 26, 14, 14, 14, 6, 7, 21, 26, 26, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 24, 24, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 6, 6, 6, 7, - 2, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 26, 26, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 15, 15, 15, 15, 15, 15, - 26, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 21, 21, 21, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 2, 2, 2, 2, - 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 7, 12, - 11, 11, 11, 21, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 21, 6, - 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6, 6, 12, 12, - 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 12, 12, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, - 24, 24, 24, 24, 24, 24, 24, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 24, 24, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 6, 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 9, 5, 9, 9, 5, - 9, 5, 9, 5, 9, 5, 9, 5, 6, 24, 24, 9, 5, 9, 5, 7, - 9, 5, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 9, 9, 9, 9, 5, - 9, 9, 9, 9, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 5, 9, 9, 9, 9, 5, 9, 5, 2, 2, 2, 2, 2, - 9, 5, 2, 5, 2, 5, 9, 5, 9, 5, 2, 2, 2, 2, 2, 2, - 2, 2, 6, 6, 6, 9, 5, 7, 6, 6, 5, 7, 7, 7, 7, 7, - 7, 7, 12, 7, 7, 7, 12, 7, 7, 7, 7, 12, 7, 7, 7, 7, - 7, 7, 7, 10, 10, 12, 12, 10, 26, 26, 26, 26, 12, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 26, 26, 23, 26, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, - 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, - 12, 12, 7, 7, 7, 7, 7, 7, 21, 21, 21, 7, 21, 7, 7, 12, - 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 21, 21, - 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, - 7, 7, 7, 12, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 10, 10, - 10, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 6, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 21, 21, - 7, 7, 7, 7, 7, 12, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 7, 7, 7, 7, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, - 10, 12, 12, 10, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 12, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 21, 21, 21, 21, - 6, 7, 7, 7, 7, 7, 7, 26, 26, 26, 7, 10, 12, 10, 7, 7, - 12, 7, 12, 12, 12, 7, 7, 12, 12, 7, 7, 7, 7, 7, 12, 12, - 7, 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 6, 21, 21, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 12, 12, 10, 10, - 21, 21, 7, 6, 6, 10, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, 2, - 2, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 24, 6, 6, 6, 6, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 24, 24, 2, 2, 2, 2, - 7, 7, 7, 10, 10, 12, 10, 10, 12, 10, 10, 21, 10, 12, 2, 2, - 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 7, 12, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 25, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 2, - 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 18, 22, - 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 26, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 23, 26, 26, 26, - 21, 21, 21, 21, 21, 21, 21, 22, 18, 21, 2, 2, 2, 2, 2, 2, - 21, 17, 17, 16, 16, 22, 18, 22, 18, 22, 18, 22, 18, 22, 18, 22, - 18, 22, 18, 22, 18, 21, 21, 22, 18, 21, 21, 21, 21, 16, 16, 16, - 21, 21, 21, 2, 21, 21, 21, 21, 17, 22, 18, 22, 18, 22, 18, 21, - 21, 21, 25, 17, 25, 25, 25, 2, 21, 23, 21, 21, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 1, - 2, 21, 21, 21, 23, 21, 21, 21, 22, 18, 21, 25, 21, 17, 21, 21, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 22, 25, 18, 25, 22, - 18, 21, 22, 18, 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, - 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, - 2, 2, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 2, 2, 2, - 23, 23, 25, 24, 26, 23, 23, 2, 26, 25, 25, 25, 25, 26, 26, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 26, 26, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, - 21, 21, 21, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 14, 14, 14, 14, 14, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 15, 15, 26, 26, 26, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, - 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 2, 2, - 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, - 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 7, 7, - 7, 14, 7, 7, 7, 7, 7, 7, 7, 7, 14, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 21, - 7, 7, 7, 7, 2, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 7, - 21, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, - 9, 9, 9, 9, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 2, 9, 9, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, - 6, 6, 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 2, 2, 7, 2, 2, 7, - 7, 7, 7, 7, 7, 7, 2, 21, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 7, 7, 7, 7, 26, 26, 15, 15, 15, 15, 15, 15, 15, - 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 2, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, - 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 2, 2, 2, 21, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 21, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 15, 15, 7, 7, - 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 12, 12, 12, 2, 12, 12, 2, 2, 2, 2, 2, 12, 12, 12, 12, - 7, 7, 7, 7, 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 2, 2, 12, 12, 12, 2, 2, 2, 2, 12, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 21, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15, 15, - 7, 7, 7, 7, 7, 7, 7, 7, 26, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 12, 12, 2, 2, 2, 2, 15, 15, 15, 15, 15, - 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 2, 2, 2, 21, 21, 21, 21, 21, 21, 21, - 7, 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, - 7, 7, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, 15, - 9, 9, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 15, 15, 15, 15, 15, 15, - 7, 7, 7, 7, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 12, 12, 17, 2, 2, - 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 7, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 15, 15, 15, 15, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, - 7, 7, 12, 12, 12, 12, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 2, 2, 2, 2, - 10, 12, 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 21, 21, 2, 2, - 15, 15, 15, 15, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 12, 7, 7, 12, 12, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, - 10, 10, 10, 12, 12, 12, 12, 10, 10, 12, 12, 21, 21, 1, 21, 21, - 21, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, - 12, 12, 12, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 10, 12, 12, 12, - 12, 12, 12, 12, 12, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 21, 21, 21, 21, 7, 10, 10, 7, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 12, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 10, - 10, 7, 7, 7, 7, 21, 21, 21, 21, 12, 12, 12, 12, 21, 10, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 7, 21, 7, 21, 21, 21, - 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 12, - 12, 12, 10, 10, 12, 10, 12, 12, 21, 21, 21, 21, 21, 21, 12, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 2, 7, 7, 7, 7, 2, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 21, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, - 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, - 12, 12, 10, 10, 2, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, - 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 2, 12, 12, 7, 10, 10, - 12, 10, 10, 10, 10, 2, 2, 10, 10, 2, 2, 10, 10, 10, 2, 2, - 7, 2, 2, 2, 2, 2, 2, 10, 2, 2, 2, 2, 2, 7, 7, 7, - 7, 7, 10, 10, 2, 2, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, - 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, - 10, 10, 12, 12, 12, 10, 12, 7, 7, 7, 7, 21, 21, 21, 21, 21, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 21, 21, 2, 21, 12, 7, - 10, 10, 10, 12, 12, 12, 12, 12, 12, 10, 12, 10, 10, 10, 10, 12, - 12, 10, 12, 12, 7, 7, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, - 10, 10, 12, 12, 12, 12, 2, 2, 10, 10, 10, 10, 12, 12, 10, 12, - 12, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 7, 7, 7, 7, 12, 12, 2, 2, - 10, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 12, 10, 12, - 12, 21, 21, 21, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 10, 12, 10, 10, - 12, 12, 12, 12, 12, 12, 10, 12, 7, 21, 2, 2, 2, 2, 2, 2, - 10, 10, 12, 12, 12, 12, 10, 12, 12, 12, 12, 12, 2, 2, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 21, 21, 21, 26, - 12, 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 2, 2, 2, 2, - 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, - 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 2, 7, 7, 7, 7, - 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, - 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 2, 12, 12, 10, 12, 7, - 10, 7, 10, 12, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 7, 7, 7, 7, 7, - 7, 10, 10, 10, 12, 12, 12, 12, 2, 2, 12, 12, 10, 10, 10, 10, - 12, 7, 21, 7, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 7, 7, 7, 7, - 7, 7, 7, 12, 12, 12, 12, 12, 12, 10, 7, 12, 12, 12, 12, 21, - 21, 21, 21, 21, 21, 21, 21, 12, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 12, 12, 12, 12, 12, 12, 10, 10, 12, 12, 12, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 10, 12, 12, 21, 21, 21, 7, 21, 21, - 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 10, 12, - 7, 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 21, 21, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 2, 10, 12, 12, 12, 12, 12, 12, - 12, 10, 12, 12, 10, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, - 7, 12, 12, 12, 12, 12, 12, 2, 2, 2, 12, 2, 12, 12, 2, 12, - 12, 12, 12, 12, 12, 12, 7, 12, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 2, 7, 7, 2, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 2, - 12, 12, 2, 10, 10, 12, 10, 12, 7, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 12, 12, 10, 10, 21, 21, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 26, 26, 26, 26, 26, 26, 26, 26, 23, 23, 23, - 23, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, - 21, 21, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 21, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 21, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 21, 21, 21, 21, 21, 26, 26, 26, 26, - 6, 6, 6, 6, 21, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 15, 15, 15, 15, 15, - 15, 15, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 2, 7, 7, 7, - 15, 15, 15, 15, 15, 15, 15, 21, 21, 21, 21, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 2, 2, 12, - 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 12, - 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 21, 6, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 10, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 2, - 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 7, 7, 7, 7, 2, 2, 2, 2, 2, 2, 2, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 2, 26, 12, 12, 21, - 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 2, 2, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 10, 10, 12, 12, 12, 26, 26, 26, 10, 10, 10, - 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 12, 12, 12, 12, 12, - 12, 12, 12, 26, 26, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 12, 12, 12, 12, 26, 26, - 26, 26, 12, 12, 12, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 5, - 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 2, 9, 9, - 2, 2, 9, 2, 2, 9, 9, 2, 2, 9, 9, 9, 9, 2, 9, 9, - 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 2, 5, 2, 5, 5, 5, - 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, 2, 9, 9, 9, - 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 2, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 2, 9, 9, 9, 9, 2, - 9, 9, 9, 9, 9, 2, 9, 2, 2, 2, 9, 9, 9, 9, 9, 9, - 9, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, - 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, - 5, 5, 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 25, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 25, 5, 5, 5, 5, 5, 5, 9, 5, 2, 2, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, 26, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 26, 26, 26, - 26, 26, 26, 26, 26, 12, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 12, 26, 26, 21, 21, 21, 21, 21, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, - 12, 12, 2, 12, 12, 2, 12, 12, 12, 12, 12, 2, 2, 2, 2, 2, - 12, 12, 12, 12, 12, 12, 12, 6, 6, 6, 6, 6, 6, 6, 2, 2, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 7, 26, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 12, 12, 12, 12, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 23, - 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 7, 2, - 7, 7, 7, 7, 7, 2, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 5, 5, 5, 5, 12, 12, 12, 12, 12, 12, 12, 6, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, 15, 15, - 23, 15, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, - 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, 7, 2, 2, 2, 2, - 2, 2, 7, 2, 2, 2, 2, 7, 2, 7, 2, 7, 2, 7, 7, 7, - 2, 7, 7, 2, 7, 2, 2, 7, 2, 7, 2, 7, 2, 7, 2, 7, - 2, 7, 7, 2, 7, 2, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, - 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 7, 7, 7, 2, 7, 2, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, - 2, 7, 7, 7, 2, 7, 7, 7, 7, 7, 2, 7, 7, 7, 7, 7, - 25, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, - 2, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 24, 24, 24, 24, 24, - 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 2, 2, 2, 2, 2, - 26, 26, 26, 26, 26, 2, 2, 2, 26, 26, 26, 26, 26, 2, 2, 2, - 26, 26, 26, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 12, 12, 13, 14, 12, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 24, 25, - 0, 26, 27, 0, 28, 29, 30, 31, 32, 33, 0, 34, 0, 0, 0, 0, - 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 38, 0, 0, 0, 0, - 39, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, - 43, 44, 45, 46, 0, 47, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 50, 0, 0, 0, - 0, 0, 0, 51, 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 55, 0, 0, 0, 0, 56, 0, 0, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 0, 67, 68, 0, 69, 70, 71, 72, 0, - 61, 0, 73, 74, 75, 76, 0, 0, 70, 0, 77, 78, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 79, 80, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 83, 84, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 0, 80, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 1, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 18, 19, 20, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 21, 0, 0, 0, 0, 0, 22, 23, 24, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, - 28, 29, 0, 0, 0, 0, 30, 0, 0, 0, 31, 32, 33, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 35, 36, 0, 0, 26, 37, 38, 39, 0, 0, 0, 0, 0, 40, - 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 42, 43, 1, - 44, 45, 46, 47, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, - 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 49, 52, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 49, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 60, 61, 0, 0, 0, 0, - 0, 0, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 67, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, - 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 74, 75, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 0, 68, 77, 0, 0, 0, 0, 0, 0, 78, 79, 80, 81, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 70, 0, 0, 0, - 0, 82, 83, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, - 85, 0, 84, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 87, - 88, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, 1, - 1, 1, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, - 99,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 74, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 0,103, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 74,105,106, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 91, 0,107, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, - 1, 1, 91, 0, 0, 0, 0, 0, 0,108, 0, 0, 0, 0,109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 0, 76, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,112,113, 0, 0, 0, - 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,115,116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26,117, 0,118, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,121, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122,123, 75, 0, - 0, 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0, 0, 0, - 0, 0, 76,102, 0, 0, 0, 0, 0, 0, 0,125, 0, 0, 0, 0, - 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,126, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 0, 49, 0, 0, - 26,130,130, 0, 0, 0, 0, 0, 0, 0, 0, 0,131, 0, 0, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,133, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,110, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0,102, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137, 0, 0, 0, - 0, 0, 0, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,138, 0, 0, 0, 0, 0, 0, 0,139, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,140, 0, 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 142,143,144,145,146,147, 0, 0, 0,148, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 0, 0, 0, - 0, 0, 0, 0,139, 1, 1,150,151,117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, - 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,153, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230, - 230,230,230,230,230,230,230,230,230,232,220,220,220,220,232,216, - 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, - 220,220,220,220,220,220,220,220, 1, 1, 1, 1, 1,220,220,220, - 220,230,230,230,230,230,230,230,230,240,230,220,220,220,230,230, - 230,220,220, 0,230,230,230,220,220,220,220,230,232,220,220,230, - 233,234,234,233,234,234,233,230,230,230,230,230, 0, 0, 0,230, - 230,230,230,230, 0,220,230,230,230,230,220,230,230,230,222,220, - 230,230,230,230,230,230,220,220,220,220,220,220,230,230,220,230, - 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, - 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, - 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230, - 230,220,220,230,230,230,230,230,220,230,230,220, 35, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230,230,230,230, - 230, 0, 0,230,230,230,230,220,230, 0, 0,230,230, 0,220,230, - 230,220, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0,230,220,230,230, - 220,230,230,220,220,220,230,220,220,230,220,230,230,230,220,230, - 220,230,220,230,220,230,230, 0, 0, 0, 0, 0,230,230,220,230, - 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0,230,230, 0,230, - 230,230,230,230,230,230,230,230, 0,230,230,230, 0,230,230,230, - 230,230, 0, 0, 0,220,220,220, 0, 0, 0, 0,230,220,220,220, - 230,230,230,230, 0, 0,230,230,230,230,230,220,220,220,220,220, - 230,230,230,230,230,230, 0,220,230,230,220,230,230,220,230,230, - 230,220,220,220, 27, 28, 29,230,230,230,220,230,230,220,220,230, - 230,230,230,230, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0, 0, 0, - 0, 0,230, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,103,103, 9, 0, - 0, 0, 0, 0,107,107,107,107, 0, 0, 0, 0,118,118, 9, 0, - 0, 0, 0, 0,122,122,122,122, 0, 0, 0, 0,220,220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,220, 0,216, 0, 0, - 0, 0, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, - 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0, 0, 0, - 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,230,230,230, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0,230, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0,222,230,220, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,220, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0,230,230,230,230, - 230, 0, 0,220,230,230,230,230,230,220,220,220,220,220,220,230, - 230,220, 0,220,220,230,230,220,220,230,230,230,230,230,220,230, - 230,230,230, 0, 0, 0, 0,230,220,230,230,230,230,230,230,230, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0,230,230,230, 0, 1,220,220,220,220,220,230,230, - 220,220,220,220,230, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0,220, 0, 0, 0, 0, 0, 0,230, 0, 0, 0,230,230, 0, 0, - 0, 0, 0, 0,230,230,220,230,230,230,230,230,230,230,220,230, - 230,234,214,220,202,230,230,230,230,230,230,230,230,230,230,230, - 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, - 230,230,230,230, 1, 1, 1,230,230, 0, 0, 0, 0,230, 0, 0, - 0, 1, 1,230,220,230, 1, 1,220,220,220,220,230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0,218,228, - 232,222,224,224, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230,230,230,230,230,230,230,230,230,230, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0,220,220,220, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0,230, 0,230,230, - 220, 0, 0,230,230, 0, 0, 0, 0, 0,230,230, 0,230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,230,230,230,230, - 230,230,230,220,220,220,220,220,220,220,230,230,230,230,230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,230,230, 1,220, 0, - 0, 0, 0, 9, 0, 0, 0, 0, 0,230,220, 0, 0, 0, 0,230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,220,230,230,230,220, - 230,220,220,220, 0, 0,230,220,230,220, 0, 0, 0, 9, 7, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 0, 0, 0,230,230,230,230,230, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 7, 0, 0, 0, 9, 7, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, - 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, - 9, 9, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,230,230,230,230, - 230,230,230, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0,216,216, 1, 1, 1, 0, 0, - 0,226,216,216,216,216,216, 0, 0, 0, 0, 0, 0, 0, 0,220, - 220,220,220,220,220,220,220, 0, 0,230,230,230,230,230,220,220, - 0, 0, 0, 0, 0, 0,230,230,230,230, 0, 0, 0, 0,230,230, - 230, 0, 0, 0,230, 0, 0,230,230,230,230,230,230,230, 0,230, - 230, 0,230,230,220,220,220,220,220,220,220, 0,230,230, 7, 0, - 0, 0, 0, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, - 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, - 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, - 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, - 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, - 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, - 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, - 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, - 0, 40, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 21, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, - 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 17, 19, 20, 21, 22, 23, 24, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 27, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 34, 34, 34, 34, 58, 59, 59, 60, 34, - 34, 34, 34, 34, 34, 34, 61, 62, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 63, 64, 34, 65, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 67, 66, 68, 69, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 70, 71, 72, 34, 34, - 34, 34, 73, 34, 34, 34, 34, 34, 34, 34, 34, 74, 75, 76, 77, 78, - 79, 80, 34, 81, 82, 83, 34, 84, 85, 34, 86, 87, 88, 89, 17, 90, - 91, 92, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 93, 25, 25, 25, 25, 25, 25, 25, 94, - 95, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 96, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 97, 34, 34, 34, 34, 34, 34, - 25, 98, 34, 34, 25, 25, 25, 25, 25, 25, 25, 25, 25, 99, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, - 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, - 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, - 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 0, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 2, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 2, 2, 95, 2, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, - 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, - 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, - 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, - 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, - 2, 2, 11, 2, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, - 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, - 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, - 2, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, - 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, - 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, - 2, 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, - 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, - 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, - 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, - 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, - 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, - 22, 22, 22, 22, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, - 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, - 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, - 2, 2, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, - 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 2, 2, - 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 2, 16, 16, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, - 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 2, 36, 2, 2, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, - 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 36, 36, - 36, 36, 36, 36, 36, 36, 2, 2, 2, 2, 2, 2, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, - 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, - 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 2, 2, 2, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, - 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, - 2, 2, 2, 8, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, - 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 2, - 30, 30, 30, 30, 2, 2, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, - 30, 30, 30, 30, 30, 2, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 2, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 29, 29, - 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 2, - 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 2, - 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 2, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 2, 2, 2, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 2, 2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, - 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, - 2, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, - 2, 2, 2, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 2, 2, 8, 8, 8, 76, 76, 76, 76, 76, 76, 76, 76, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, - 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, - 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, - 9, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 6, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, - 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, - 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, - 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, - 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, - 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, - 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 61, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, - 30, 30, 30, 30, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 1, 1, 1, 1, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, - 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, - 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, - 0, 0, 0, 0, 0, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 2, 2, 2, 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, - 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 2, 2, - 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, - 2, 2, 2, 2, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 2, 0, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 2, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 2, 2, 30, - 30, 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, - 0, 0, 2, 2, 2, 2, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 2, 2, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 12, 12, 2, 2, 2, - 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, - 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, - 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, - 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, - 12, 12, 12, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, - 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118, - 118,118,118,118,118,118,118,118,118,118,118,118,118,118,118,118, - 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 2, 2, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135, - 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,135,135, - 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, - 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,106,106, - 106,106,106,106,106,106,106,106,106,106,106,106,106,106, 2, 2, - 2, 2, 2, 2, 2, 2,104,104,104,104,104,104,104,104,104,104, - 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161, - 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161, - 161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161,161, - 161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161,161, - 2,161,161, 2, 2, 2,110,110,110,110,110,110,110,110,110,110, - 110,110,110,110,110,110,110,110,110,110,110,110,110, 2, 2, 2, - 2, 2, 2, 2, 2, 2,110,110,110,110,110,110, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,110,110,110,110,110,110,110,110, 2, 2, - 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 2, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 2, 2, 2, 2, 2, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, - 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81, 81, 81, - 81, 81, 81, 81, 81, 81,120,120,120,120,120,120,120,120,120,120, - 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, - 116,116,116,116,116,116,116,116,116,116,116,116,116,116,116,116, - 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,116,116, - 116,116,116,116,116,116,128,128,128,128,128,128,128,128,128,128, - 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, - 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, - 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, - 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, - 57, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, - 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,117,117, - 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, - 112,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2, - 2,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, - 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 83, 83, - 83, 83, 83, 83, 83, 83, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, 2, 2, 2, 2, 82, 82, - 82, 82, 82, 82, 82, 82,122,122,122,122,122,122,122,122,122,122, - 122,122,122,122,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122, - 122,122,122, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,122, - 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, - 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, - 130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,130,130,130, 2, 2, 2, 2, 2, 2, 2, - 130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144, - 144,144,144,144,144,144,144,144,144,144,144,144,144,144, 2, 2, - 2, 2, 2, 2, 2, 2,144,144,144,144,144,144,144,144,144,144, - 2, 2, 2, 2, 2, 2,156,156,156,156,156,156,156,156,156,156, - 156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156, - 2,156,156,156, 2, 2,156,156, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,147,147,147,147,147,147,147,147,147,147, - 147,147,147,147,147,147,147,147,147,147,147,147,147,147, 2, 2, - 2, 2, 2, 2, 2, 2,148,148,148,148,148,148,148,148,148,148, - 148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148, - 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158, - 158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158, - 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153, - 153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153, - 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149, - 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101,101, - 101,101,101,101,101,101,101,101,101,101,101,101,101,101,101, 2, - 2, 2, 2, 2, 2, 2,101,101,101,101,101,101,101,101,101,101, - 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 2, - 2, 2, 2, 2, 2, 2,111,111,111,111,111,111,111,111,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111, 2, 2, 2, - 2, 2, 2, 2, 2, 2,100,100,100,100,100,100,100,100,100,100, - 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, - 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, - 108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108, - 108,108,108,108,108, 2,129,129,129,129,129,129,129, 2,129, 2, - 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, - 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, - 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, - 109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109, - 109, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, - 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, - 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, - 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, - 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, - 2, 1,107,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, - 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, - 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, - 107,107,107, 2, 2, 2,107,107,107,107,107, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, - 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137, - 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, - 124,124,124,124,124,124,124,124,124,124,124,124,124,124, 2, 2, - 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, - 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,123,123, - 123,123,123,123,123,123,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, - 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,114,114,114,114,114,114,114,114,114,114, - 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, - 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, - 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, - 126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, - 126, 2, 2,126,126,126,126,126,126,126,126,126,126,126,126,126, - 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, - 2, 2, 2, 2, 2, 2,142,142,142,142,142,142,142,142,142,142, - 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, - 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, - 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154, - 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154, - 154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154, - 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2, - 2,154,154,154,154,154,154,154,154,154,154,154,154, 2, 2, 2, - 2, 2, 2, 2, 2, 2,154,154,154,154,154,154,154,154,154,154, - 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, - 150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150, - 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,141,141,141,141,141,141,141,141,141,141, - 141,141,141,141,141,141,141,141,141,141,141,141,141,141, 2, 2, - 2, 2, 2, 2, 2, 2,140,140,140,140,140,140,140,140,140,140, - 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121,121, - 121,121,121,121,121,121,121,121,121,121,121,121,121,121,121, 2, - 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, - 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133, - 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, - 133,133,133,133,133,133,133,133,133,133,133,133, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133,133, - 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134,134,134, - 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134,134,134, - 134,134,134,134,134,134,134,134,134,134,134,134,134,134, 2,134, - 134,134,134,134,134,134,134,134,134,134,134,134,134, 2, 2, 2, - 2, 2, 2, 2, 2, 2,138,138,138,138,138,138,138, 2,138,138, - 2,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138, - 138,138,138,138,138,138,138,138,138,138,138,138,138, 2, 2, 2, - 138, 2,138,138, 2,138,138,138,138,138,138,138,138,138, 2, 2, - 2, 2, 2, 2, 2, 2,138,138,138,138,138,138,138,138,138,138, - 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2, - 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, - 2, 2, 2, 2, 2, 2,143,143,143,143,143,143,143,143,143,143, - 2, 2, 2, 2, 2, 2,145,145,145,145,145,145,145,145,145,145, - 145,145,145,145,145,145,145,145,145,145,145,145,145,145,145, 2, - 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,157,157,157,157,157,157,157,157,157,157, - 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, - 2, 2, 2, 2, 2, 2,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 79, 2, - 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, - 115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115, - 115,115,115,115,115, 2,115,115,115,115,115,115,115,115,115,115, - 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, - 159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159, - 159,159,159,159,159, 2,159,159,159,159,159,159,159,159,159,159, - 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103, - 103,103,103,103,103,103,103,103,103,103,103,103,103,103,103,103, - 103,103,103,103, 2, 2,103,103,103,103,103,103, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,119,119,119,119,119,119,119,119,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,119,119,119,119,119,119,119,119,119,119, - 2,119,119,119,119,119,119,119, 2,119,119,119,119,119,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119,119,119, 2, 2, - 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146, - 146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146, - 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, - 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 13, 13, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,136,136,136,136,136,136,136,136,136,136, - 136,136,136,136,136,136,136,136,136,136,136,136,136,136, 2, 2, - 2, 2, 2, 2, 2, 2,155,155,155,155,155,155,155,155,155,155, - 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2,136,136,136,136,136,136,136,136,136, 2, - 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, - 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 15, 15, 15, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 2, - 2, 2, 2, 2, 2, 2,139,139,139,139,139,139,139,139,139,139, - 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, - 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, - 105,105,105,105,105,105,105,105,105,105,105,105,105,105,105,105, - 105, 2, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, - 105,105,105, 2, 2, 2,105,105,105,105,105,105,105,105,105, 2, - 2, 2, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, - 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 9, 9, 9, 9, 9, 9, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 0, 0,131,131,131,131,131,131,131,131,131,131, - 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, - 131,131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2,131,131,131,131,131, 2,131,131,131,131,131,131,131,131,131, - 131,131,131,131,131,131, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 2, - 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, - 56, 2, 2, 2, 2, 2,151,151,151,151,151,151,151,151,151,151, - 151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151, - 151,151,151, 2, 2, 2,151,151,151,151,151,151,151,151,151,151, - 151,151,151,151, 2, 2,151,151,151,151,151,151,151,151,151,151, - 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, - 152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152, - 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, - 30, 30, 2, 30, 30, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 2,113,113,113,113,113,113,113,113,113,113, - 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, - 113,113,113,113,113,113,113,113,113,113,113,113,113, 2, 2, 2, - 2, 2, 2, 2, 2, 2,132,132,132,132,132,132,132,132,132,132, - 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, - 132,132, 2, 2, 2, 2,132,132,132,132,132,132,132,132,132,132, - 2, 2, 2, 2,132,132, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 3, 3, 2, 3, 2, 2, 3, 3, 3, - 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, - 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, - 0, 0, 0, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, - 2, 2, 2, 2, 2, 2, 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, - 0, 0, 0, 7, 8, 9, 10, 11, 0, 12, 0, 0, 0, 0, 13, 0, - 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 17, 18, 19, - 0, 0, 0, 20, 21, 22, 0, 23, 0, 24, 0, 25, 0, 26, 0, 0, - 0, 0, 0, 27, 28, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 0, 0, 0, 41, 0, 42, 43, 44, 45, - 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 65, 0, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 72, 73, 74, 75, 76, 77, 78, 79, 80, 0, -}; -static const uint16_t -_hb_ucd_u16[11584] = -{ - 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, - 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, - 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, - 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, - 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, - 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, - 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, - 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, - 48, 67, 68, 69, 48, 70, 71, 48, 72, 73, 48, 48, 74, 32, 75, 32, - 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, - 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, - 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, - 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, - 136, 48, 48, 137, 138, 139, 140, 140, 141, 48, 142, 143, 144, 145, 140, 140, - 146, 147, 148, 149, 150, 48, 151, 152, 153, 154, 32, 155, 156, 157, 140, 140, - 48, 48, 158, 159, 160, 161, 162, 163, 164, 165, 9, 9, 166, 11, 11, 167, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 168, 169, 48, 48, 168, 48, 48, 170, 171, 172, 48, 48, - 48, 171, 48, 48, 48, 173, 174, 175, 48, 176, 9, 9, 9, 9, 9, 177, - 178, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 179, 48, 180, 181, 48, 48, 48, 48, 182, 183, - 48, 184, 48, 185, 48, 186, 187, 188, 48, 48, 48, 189, 190, 191, 192, 193, - 194, 192, 48, 48, 195, 48, 48, 196, 197, 48, 198, 48, 48, 48, 48, 199, - 48, 200, 201, 202, 203, 48, 204, 205, 48, 48, 206, 48, 207, 208, 209, 209, - 48, 210, 48, 48, 48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140, - 217, 48, 48, 218, 219, 160, 220, 221, 222, 48, 223, 64, 48, 48, 224, 225, - 48, 48, 226, 227, 228, 64, 48, 229, 230, 9, 9, 231, 232, 233, 234, 235, - 11, 11, 236, 27, 27, 27, 237, 238, 11, 239, 27, 27, 32, 32, 32, 32, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 240, 13, 13, 13, 13, 13, 13, - 241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 280, 209, 281, 209, 209, 209, 209, 282, 209, 283, 279, 284, 209, 285, 286, 209, - 209, 209, 287, 140, 288, 140, 271, 271, 271, 289, 209, 209, 209, 209, 290, 271, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 291, 292, 209, 209, 293, - 209, 209, 209, 209, 209, 209, 294, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 295, 296, 271, 297, 209, 209, 298, 279, 299, 279, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 279, 279, 279, 279, 279, 279, 279, 279, 300, 301, 279, 279, 279, 302, 279, 303, - 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, - 209, 209, 209, 279, 304, 209, 209, 305, 209, 306, 209, 209, 209, 209, 209, 209, - 9, 9, 9, 11, 11, 11, 307, 308, 13, 13, 13, 13, 13, 13, 309, 310, - 11, 11, 311, 48, 48, 48, 312, 313, 48, 314, 315, 315, 315, 315, 32, 32, - 316, 317, 318, 319, 320, 321, 140, 140, 209, 322, 209, 209, 209, 209, 209, 323, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 324, 140, 325, - 326, 327, 328, 329, 136, 48, 48, 48, 48, 330, 178, 48, 48, 48, 48, 331, - 332, 48, 48, 136, 48, 48, 48, 48, 200, 333, 48, 48, 209, 209, 323, 48, - 209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 209, 209, 209, 209, - 48, 338, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 151, 209, 209, 209, 287, 48, 48, 229, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 339, 48, 340, 140, 13, 13, 341, 342, 13, 343, 48, 48, 48, 48, 344, 345, - 31, 346, 347, 348, 13, 13, 13, 349, 350, 351, 352, 353, 354, 355, 140, 356, - 357, 48, 358, 359, 48, 48, 48, 360, 361, 48, 48, 362, 363, 192, 32, 364, - 64, 48, 365, 48, 366, 367, 48, 151, 76, 48, 48, 368, 369, 370, 371, 372, - 48, 48, 373, 374, 375, 376, 48, 377, 48, 48, 48, 378, 379, 380, 381, 382, - 383, 384, 315, 11, 11, 385, 386, 11, 11, 11, 11, 11, 48, 48, 387, 192, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 388, 48, 389, 48, 48, 206, - 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, - 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 207, 140, 140, - 392, 393, 394, 395, 396, 48, 48, 48, 48, 48, 48, 397, 398, 399, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 400, 209, 48, 48, 48, 48, 401, 48, 48, 402, 140, 140, 403, - 32, 404, 32, 405, 406, 407, 408, 409, 48, 48, 48, 48, 48, 48, 48, 410, - 411, 2, 3, 4, 5, 412, 413, 414, 48, 415, 48, 200, 416, 417, 418, 419, - 420, 48, 172, 421, 204, 204, 140, 140, 48, 48, 48, 48, 48, 48, 48, 71, - 422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428, - 140, 140, 140, 140, 140, 140, 140, 140, 48, 151, 48, 48, 48, 100, 429, 430, - 48, 48, 431, 48, 432, 48, 48, 433, 48, 434, 48, 48, 435, 436, 140, 140, - 9, 9, 437, 11, 11, 48, 48, 48, 48, 204, 192, 9, 9, 438, 11, 439, - 48, 48, 440, 48, 48, 48, 441, 442, 442, 443, 444, 445, 140, 140, 140, 140, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 314, 48, 199, 440, 140, 446, 27, 27, 447, 140, 140, 140, 140, - 448, 48, 48, 449, 48, 450, 48, 451, 48, 200, 452, 140, 140, 140, 48, 453, - 48, 454, 48, 455, 140, 140, 140, 140, 48, 48, 48, 456, 271, 457, 271, 271, - 458, 459, 48, 460, 461, 462, 48, 463, 48, 464, 140, 140, 465, 48, 466, 467, - 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, - 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 271, 476, 48, 48, 477, 478, 140, 140, 140, 140, - 48, 464, 479, 48, 62, 480, 140, 48, 481, 140, 140, 48, 482, 140, 48, 314, - 483, 48, 48, 484, 485, 457, 486, 487, 222, 48, 48, 488, 489, 48, 196, 192, - 490, 48, 491, 492, 493, 48, 48, 494, 222, 48, 48, 495, 496, 497, 498, 499, - 48, 97, 500, 501, 140, 140, 140, 140, 502, 503, 504, 48, 48, 505, 506, 192, - 507, 83, 84, 508, 509, 510, 511, 512, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 48, 48, 518, 519, 520, 521, 140, 140, - 48, 48, 48, 522, 523, 192, 524, 140, 48, 48, 525, 526, 192, 140, 140, 140, - 48, 173, 527, 528, 314, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, - 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, - 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, - 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 557, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 100, 271, 558, 559, 560, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 207, 140, 140, 140, 140, 140, 140, - 272, 272, 272, 272, 272, 272, 561, 562, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 388, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, - 48, 48, 200, 564, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 314, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, - 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 440, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 199, 140, 140, - 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 206, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 324, - 209, 209, 586, 209, 209, 209, 587, 588, 589, 209, 590, 209, 209, 209, 288, 140, - 209, 209, 209, 209, 591, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 592, - 209, 209, 209, 209, 209, 287, 271, 461, 140, 140, 140, 140, 140, 140, 140, 140, - 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, - 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, - 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, - 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 628, 629, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 630, 631, 632, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 151, 633, 634, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 638, 200, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 639, 585, 140, 140, - 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 498, 271, 271, 641, 642, 140, 140, 140, 140, - 498, 271, 643, 644, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, - 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, - 659, 209, 209, 325, 660, 661, 324, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 662, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 663, 426, 426, - 209, 209, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 660, 325, 427, - 325, 209, 209, 209, 664, 176, 209, 209, 664, 209, 657, 661, 140, 140, 140, 140, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 323, 657, 665, 287, 209, 426, 288, 324, 176, 664, 287, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 666, 209, 209, 288, 140, 140, 192, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 140, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 196, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 100, 140, - 48, 204, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 71, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 667, 140, 668, 668, 668, 668, 668, 668, 140, 140, 140, 140, 140, 140, 140, 140, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 669, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 670, - 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, 4, 5, 4, 5, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, - 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 11, 11, 11, 13, 11, - 14, 14, 14, 14, 14, 14, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 16, 17, 18, 17, 17, 19, 20, 21, 21, 22, 21, 23, 24, - 25, 26, 27, 27, 28, 29, 27, 30, 27, 27, 27, 27, 27, 31, 27, 27, - 32, 33, 33, 33, 34, 27, 27, 27, 35, 35, 35, 36, 37, 37, 37, 38, - 39, 39, 40, 41, 42, 43, 44, 27, 45, 46, 27, 27, 27, 27, 47, 27, - 48, 48, 48, 48, 48, 49, 50, 48, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 109, 110, 111, 112, 109, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 122, 123, 122, 124, 125, 125, 126, 127, 128, 129, 130, 131, 125, 125, - 132, 132, 132, 132, 133, 132, 134, 135, 132, 133, 132, 136, 136, 137, 125, 125, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 140, 139, 139, 141, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143, - 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170, - 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176, - 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168, - 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 8, 195, 125, 125, 125, - 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201, - 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211, - 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 8, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 11, 217, 11, 11, 217, 218, 11, 219, 11, 11, 11, 220, 220, 221, 11, 222, - 223, 0, 0, 0, 0, 0, 224, 225, 226, 227, 0, 0, 228, 8, 8, 229, - 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 234, 125, 235, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, 0, - 239, 239, 239, 239, 239, 239, 4, 4, 240, 240, 240, 240, 240, 240, 240, 241, - 139, 139, 140, 242, 242, 242, 243, 244, 143, 245, 246, 246, 246, 246, 14, 14, - 0, 0, 0, 0, 0, 247, 125, 125, 248, 249, 248, 248, 248, 248, 248, 250, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 251, 125, 252, - 253, 0, 254, 255, 256, 257, 257, 257, 257, 258, 259, 260, 260, 260, 260, 261, - 262, 263, 263, 264, 142, 142, 142, 142, 265, 0, 263, 263, 0, 0, 266, 260, - 142, 265, 0, 0, 0, 0, 142, 267, 0, 0, 0, 0, 0, 260, 260, 268, - 260, 260, 260, 260, 260, 269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 0, 0, 0, 0, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 271, 270, 270, 270, 272, 273, 273, 273, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 275, 125, 14, 14, 14, 14, 14, 14, 276, 276, 276, 276, 276, 277, - 0, 0, 278, 4, 4, 4, 4, 4, 279, 4, 4, 4, 280, 281, 125, 282, - 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 48, 48, - 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299, - 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308, - 309, 310, 246, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 315, 142, 316, 142, 142, 317, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125, - 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 325, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 326, 27, 27, 27, 27, 27, 327, 27, 27, 328, 125, 125, 27, - 8, 285, 329, 0, 0, 330, 331, 332, 27, 27, 27, 27, 27, 27, 27, 333, - 334, 0, 1, 2, 1, 2, 335, 259, 260, 336, 142, 265, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 345, 125, 125, 342, 342, 342, 342, 342, 342, 342, 346, - 347, 0, 0, 348, 11, 11, 11, 11, 349, 350, 351, 125, 125, 0, 0, 352, - 125, 125, 125, 125, 125, 125, 125, 125, 353, 354, 355, 355, 355, 356, 357, 252, - 358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125, - 369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376, - 377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125, - 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, - 385, 385, 385, 386, 385, 387, 388, 125, 389, 4, 4, 390, 125, 125, 125, 125, - 391, 392, 392, 393, 394, 395, 396, 396, 397, 398, 399, 125, 125, 125, 400, 401, - 402, 403, 404, 405, 125, 125, 125, 125, 406, 406, 407, 408, 407, 409, 407, 407, - 410, 411, 412, 413, 414, 414, 415, 415, 416, 416, 125, 125, 417, 417, 418, 419, - 420, 420, 420, 421, 422, 423, 424, 425, 426, 427, 428, 125, 125, 125, 125, 125, - 429, 429, 429, 429, 430, 125, 125, 125, 431, 431, 431, 432, 431, 431, 431, 433, - 434, 434, 435, 436, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 27, 45, 437, 437, 438, 439, 125, 125, 125, 125, - 440, 440, 441, 442, 442, 443, 125, 444, 445, 125, 125, 446, 447, 125, 448, 449, - 450, 450, 450, 450, 451, 452, 450, 453, 454, 454, 454, 454, 455, 456, 457, 458, - 459, 459, 459, 460, 461, 462, 462, 463, 464, 464, 464, 464, 464, 464, 465, 466, - 467, 468, 467, 469, 125, 125, 125, 125, 470, 471, 472, 473, 473, 473, 474, 475, - 476, 477, 478, 479, 480, 481, 482, 483, 125, 125, 125, 125, 125, 125, 125, 125, - 484, 484, 484, 484, 484, 485, 486, 125, 487, 487, 487, 487, 488, 489, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 490, 490, 490, 491, 490, 492, 125, 125, - 493, 493, 493, 493, 494, 495, 496, 125, 497, 497, 497, 498, 498, 125, 125, 125, - 499, 500, 501, 499, 502, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 503, 503, 503, 504, 125, 125, 125, 125, 125, 125, 505, 505, 505, 505, 505, 506, - 507, 508, 509, 510, 511, 512, 125, 125, 125, 125, 513, 514, 514, 513, 515, 125, - 516, 516, 516, 516, 517, 518, 518, 518, 518, 518, 519, 154, 520, 520, 520, 521, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 522, 523, 523, 524, 525, 523, 526, 527, 527, 528, 529, 530, 125, 125, 125, 125, - 531, 532, 532, 533, 534, 535, 536, 537, 538, 539, 540, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 541, 542, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 543, 544, 544, 544, 545, - 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, - 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, - 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, - 546, 546, 546, 546, 546, 546, 546, 546, 546, 547, 125, 125, 125, 125, 125, 125, - 546, 546, 546, 546, 546, 546, 548, 549, 546, 546, 546, 546, 546, 546, 546, 546, - 546, 546, 546, 546, 550, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 551, 551, 551, 551, 551, 551, 552, - 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, - 553, 553, 554, 555, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, - 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, - 556, 556, 556, 556, 557, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, - 276, 276, 276, 558, 559, 560, 561, 562, 562, 562, 562, 563, 564, 565, 566, 567, - 568, 568, 568, 568, 569, 570, 571, 572, 568, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 573, 573, 573, 573, 573, 574, 125, 125, 125, 125, 125, 125, - 575, 575, 575, 575, 576, 575, 575, 575, 577, 575, 125, 125, 125, 125, 578, 579, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 581, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, - 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, - 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 583, 125, 125, - 584, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 585, - 586, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 257, 257, 587, 125, 125, 588, 589, 590, 590, 590, 590, 590, 590, 590, 590, 590, - 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 592, 592, 592, 592, 592, 592, 593, 594, 595, 596, 266, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 8, 8, 597, 8, 598, 0, 0, 0, 0, 0, 0, 0, 266, 125, 125, 125, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, - 0, 0, 600, 0, 0, 0, 601, 602, 603, 0, 604, 0, 0, 0, 235, 125, - 11, 11, 11, 11, 605, 125, 125, 125, 125, 125, 125, 125, 125, 125, 0, 266, - 0, 0, 0, 0, 0, 234, 0, 606, 125, 125, 125, 125, 125, 125, 125, 125, - 0, 0, 0, 0, 0, 224, 0, 0, 0, 607, 608, 609, 610, 0, 0, 0, - 611, 612, 0, 613, 614, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, - 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 618, 618, 618, 618, 618, 618, 618, 619, 620, 621, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 4, 622, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 623, 624, 625, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 626, 626, 627, 628, 629, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 630, 631, 125, 632, 632, 632, 633, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 634, 635, - 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 637, 638, 125, 125, - 639, 639, 639, 639, 640, 641, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 334, 0, 0, 0, 642, 125, 125, 125, 125, - 334, 0, 0, 247, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 643, 27, 644, 645, 646, 647, 648, 649, 650, 651, 652, 651, 125, 125, 125, 653, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 0, 0, 252, 0, 0, 0, 0, 0, 0, 266, 226, 334, 334, 334, 0, 599, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 125, 125, 125, 654, 0, - 655, 0, 0, 252, 606, 656, 599, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 350, 350, - 0, 0, 0, 0, 0, 0, 0, 266, 0, 0, 0, 0, 0, 606, 252, 228, - 252, 0, 0, 0, 658, 285, 0, 0, 658, 0, 247, 656, 125, 125, 125, 125, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 266, 247, 659, 234, 0, 350, 235, 599, 285, 658, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, 235, 125, 125, 285, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 125, 125, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 660, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 579, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 661, 125, - 248, 318, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 662, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, - 663, 125, 0, 0, 0, 0, 0, 0, 125, 125, 125, 125, 125, 125, 125, 125, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, - 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, - 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, - 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, - 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, - 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, - 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, - 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, - 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, - 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, - 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, - 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, - 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, - 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, - 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, - 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, - 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, - 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, - 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, - 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, - 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, - 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, - 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, - 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, - 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, - 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, - 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, - 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, - 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, - 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, - 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, - 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, - 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, - 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, - 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, - 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, - 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, - 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, - 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, - 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, - 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, - 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, - 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, - 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, - 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, - 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, - 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, - 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, - 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, - 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, - 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, - 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, - 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, - 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, - 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, - 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, - 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, - 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, - 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, - 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, - 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, - 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, - 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, - 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, - 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, - 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, - 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, - 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, - 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, - 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, - 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, - 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, - 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, - 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, - 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, - 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, - 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, - 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, - 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, - 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, - 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, - 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, - 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, - 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, - 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, - 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, - 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, - 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, - 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, - 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, - 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, - 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, - 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, - 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, - 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, - 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, - 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, - 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, - 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, - 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, - 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, - 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, - 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, - 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, - 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, - 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, - 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, - 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, - 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, - 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, - 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, - 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, - 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, - 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, - 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, - 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, - 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, - 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, - 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, - 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, - 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, - 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, - 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, - 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, - 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, - 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, - 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, - 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, - 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, - 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, - 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, - 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, - 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, - 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, - 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, - 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, - 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, - 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; -static const int16_t -_hb_ucd_i16[196] = -{ - 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, - 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, - 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, - -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, - 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, - 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, - 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, - 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, - 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, - -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, - 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, - -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, - -1, 0, 1, -1, -}; - -static inline uint_fast8_t -_hb_ucd_gc (unsigned u) -{ - return u<1114110u?_hb_ucd_u8[2176+(((_hb_ucd_u16[((_hb_ucd_u8[u>>4>>5])<<5)+((u>>4)&31u)])<<4)+((u)&15u))]:2; -} -static inline uint_fast8_t -_hb_ucd_ccc (unsigned u) -{ - return u<125259u?_hb_ucd_u8[15332+(((_hb_ucd_u8[13892+(((_hb_ucd_u8[12912+(u>>3>>4)])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:0; -} -static inline unsigned -_hb_ucd_b4 (const uint8_t* a, unsigned i) -{ - return (a[i>>1]>>((i&1u)<<2))&15u; -} -static inline int_fast16_t -_hb_ucd_bmg (unsigned u) -{ - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[16692+(((_hb_ucd_b4(16564+_hb_ucd_u8,u>>2>>6))<<6)+((u>>2)&63u))])<<2)+((u)&3u)]:0; -} -static inline uint_fast8_t -_hb_ucd_sc (unsigned u) -{ - return u<918000u?_hb_ucd_u8[19446+(((_hb_ucd_u16[3168+(((_hb_ucd_u8[17652+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:2; -} -static inline uint_fast16_t -_hb_ucd_dm (unsigned u) -{ - return u<195102u?_hb_ucd_u16[6400+(((_hb_ucd_u8[30070+(u>>6)])<<6)+((u)&63u))]:0; -} - - -#elif !defined(HB_NO_UCD_UNASSIGNED) - -static const uint8_t _hb_ucd_u8[17936] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, @@ -5675,10 +2821,1743 @@ _hb_ucd_dm (unsigned u) } +#elif !defined(HB_NO_UCD_UNASSIGNED) + +static const uint8_t +_hb_ucd_u8[17564] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 22, 22, 22, 22, 24, 7, 7, + 25, 26, 22, 22, 22, 27, 28, 29, 22, 30, 31, 32, 33, 34, 35, 36, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 22, 42, + 7, 7, 43, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 44, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 46, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 34, 35, 36, 37, 38, 39, 34, 34, 34, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 69, 72, 73, + 69, 69, 64, 74, 64, 64, 75, 76, 77, 78, 79, 80, 81, 82, 69, 83, + 84, 85, 86, 87, 88, 89, 69, 69, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 90, 34, 34, 34, 34, + 91, 34, 34, 34, 34, 34, 34, 34, 34, 92, 34, 34, 93, 94, 95, 96, + 97, 98, 99,100,101,102,103,104, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,105, + 106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, + 107,107, 34, 34,108,109,110,111, 34, 34,112,113,114,115,116,117, + 118,119,120,121,122,123,124,125,126,127,128,129, 34, 34,130,131, + 132,133,134,135,136,137,138,139,140,141,142,122,143,144,145,146, + 147,148,149,150,151,152,153,122,154,155,122,156,157,158,159,122, + 160,161,162,163,164,165,122,122,166,167,168,169,122,170,122,171, + 34, 34, 34, 34, 34, 34, 34,172,173, 34,174,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,175, + 34, 34, 34, 34, 34, 34, 34, 34,176,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122, 34, 34, 34, 34,177,122,122,122, + 34, 34, 34, 34,178,179,180,181,122,122,122,122,182,183,184,185, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,186, + 34, 34, 34, 34, 34, 34, 34, 34, 34,187,188,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,122,189, + 34, 34,190, 34, 34,191,122,122,122,122,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,192,193,122,122,122,122,122,122, + 122,122,122,122,122,122,122,122,122,122,122,122,122,122,194,195, + 69,196,197,198,199,200,201,122,202,203,204,205,206,207,208,209, + 69, 69, 69, 69,210,211,122,122,122,122,122,122,122,122,212,122, + 213,122,214,122,122,215,122,122,122,122,122,122,122,122,122,216, + 34,217,218,122,122,122,122,122,219,220,221,122,222,223,122,122, + 224,225,226,227,228,122, 69,229, 69, 69, 69, 69, 69,230,231,232, + 233,234, 69, 69,235,236, 69,237,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,238, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,239, 34, + 240, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,241, 34, 34, + 34, 34, 34, 34, 34, 34, 34,242,122,122,122,122,122,122,122,122, + 34, 34, 34, 34,243,122,122,122,122,122,122,122,122,122,122,122, + 34, 34, 34, 34, 34, 34,244,122,122,122,122,122,122,122,122,122, + 245,122,246,247,122,122,122,122,122,122,122,122,122,122,122,122, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,248, + 107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,249, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 5, 6, 2, + 7, 7, 7, 7, 7, 2, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 17, 18, 19, 1, 20, 20, 21, 22, 23, 24, 25, + 26, 27, 15, 2, 28, 29, 27, 30, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 31, 11, 11, 11, 32, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 33, 16, 16, 16, 16, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 34, 34, 34, 34, 34, 34, 34, 34, 16, 32, 32, 32, + 32, 32, 32, 32, 11, 34, 34, 16, 34, 32, 32, 11, 34, 11, 16, 11, + 11, 34, 32, 11, 32, 16, 11, 34, 32, 32, 32, 11, 34, 16, 32, 11, + 34, 11, 34, 34, 32, 35, 32, 16, 36, 36, 37, 34, 38, 37, 34, 34, + 34, 34, 34, 34, 34, 34, 16, 32, 34, 38, 32, 11, 32, 32, 32, 32, + 32, 32, 16, 16, 16, 11, 34, 32, 34, 34, 11, 32, 32, 32, 32, 32, + 16, 16, 39, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, + 40, 40, 42, 41, 41, 41, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, + 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 42, 32, 44, 45, 16, 10, + 44, 44, 41, 46, 11, 47, 47, 11, 34, 11, 11, 11, 11, 11, 11, 11, + 11, 48, 11, 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 16, 34, + 16, 11, 32, 16, 32, 32, 32, 32, 16, 16, 32, 49, 34, 32, 34, 11, + 32, 50, 43, 43, 51, 32, 32, 32, 11, 34, 34, 34, 34, 34, 34, 16, + 48, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 47, 52, 2, 2, 2, + 16, 16, 16, 16, 53, 54, 55, 56, 57, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 58, 59, 60, 43, 59, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 62, + 36, 63, 64, 44, 44, 44, 44, 44, 65, 65, 65, 8, 9, 66, 2, 67, + 43, 43, 43, 43, 43, 60, 68, 2, 69, 36, 36, 36, 36, 70, 43, 43, + 7, 7, 7, 7, 7, 2, 2, 36, 71, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 72, 43, 43, 43, 73, 50, 43, 43, 74, 75, 76, 43, 43, 36, + 7, 7, 7, 7, 7, 36, 77, 78, 2, 2, 2, 2, 2, 2, 2, 79, + 70, 36, 36, 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 80, 62, 36, + 36, 36, 36, 43, 43, 43, 43, 43, 71, 44, 44, 44, 44, 44, 44, 44, + 7, 7, 7, 7, 7, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, + 43, 43, 40, 21, 2, 81, 57, 20, 36, 36, 36, 43, 43, 75, 43, 43, + 43, 43, 75, 43, 75, 43, 43, 44, 2, 2, 2, 2, 2, 2, 2, 64, + 36, 36, 36, 36, 70, 43, 44, 64, 36, 36, 36, 36, 36, 61, 44, 44, + 36, 36, 36, 36, 82, 36, 36, 61, 65, 44, 44, 44, 43, 43, 43, 43, + 36, 36, 36, 36, 83, 43, 43, 43, 43, 84, 43, 43, 43, 43, 43, 43, + 43, 85, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 85, 71, 86, + 87, 43, 43, 43, 85, 86, 87, 86, 70, 43, 43, 43, 36, 36, 36, 36, + 36, 43, 2, 7, 7, 7, 7, 7, 88, 36, 36, 36, 36, 36, 36, 36, + 70, 86, 62, 36, 36, 36, 61, 62, 61, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 61, 36, 36, 36, 61, 61, 44, 36, 36, 44, 71, 86, + 87, 43, 80, 89, 90, 89, 87, 61, 44, 44, 44, 89, 44, 44, 36, 62, + 36, 43, 44, 7, 7, 7, 7, 7, 36, 20, 27, 27, 27, 56, 63, 80, + 57, 85, 62, 36, 36, 61, 44, 62, 61, 36, 62, 61, 36, 44, 80, 86, + 87, 80, 44, 57, 80, 57, 43, 44, 57, 44, 44, 44, 62, 36, 61, 61, + 44, 44, 44, 7, 7, 7, 7, 7, 43, 36, 70, 64, 44, 44, 44, 44, + 57, 85, 62, 36, 36, 36, 36, 62, 36, 62, 36, 36, 36, 36, 36, 36, + 61, 36, 62, 36, 36, 44, 71, 86, 87, 43, 43, 57, 85, 89, 87, 44, + 61, 44, 44, 44, 44, 44, 44, 44, 66, 44, 44, 44, 62, 43, 43, 43, + 57, 86, 62, 36, 36, 36, 61, 62, 61, 36, 62, 36, 36, 44, 71, 87, + 87, 43, 80, 89, 90, 89, 87, 44, 44, 44, 57, 85, 44, 44, 36, 62, + 78, 27, 27, 27, 44, 44, 44, 44, 44, 71, 62, 36, 36, 61, 44, 36, + 61, 36, 36, 44, 62, 61, 61, 36, 44, 62, 61, 44, 36, 61, 44, 36, + 36, 36, 36, 36, 36, 44, 44, 86, 85, 90, 44, 86, 90, 86, 87, 44, + 61, 44, 44, 89, 44, 44, 44, 44, 27, 91, 67, 67, 56, 92, 44, 44, + 85, 86, 71, 36, 36, 36, 61, 36, 61, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 44, 71, 43, 85, 86, 90, 43, 80, 43, 43, 44, + 44, 44, 57, 80, 36, 61, 62, 44, 44, 44, 44, 93, 27, 27, 27, 91, + 70, 86, 72, 36, 36, 36, 61, 36, 36, 36, 62, 36, 36, 44, 71, 87, + 86, 86, 90, 85, 90, 86, 43, 44, 44, 44, 89, 90, 44, 44, 62, 61, + 62, 61, 44, 44, 44, 44, 44, 44, 43, 86, 36, 36, 36, 36, 61, 36, + 36, 36, 36, 36, 36, 70, 71, 86, 87, 43, 80, 86, 90, 86, 87, 77, + 44, 44, 36, 94, 27, 27, 27, 95, 27, 27, 27, 27, 91, 36, 36, 36, + 57, 86, 62, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, 36, 36, 36, + 36, 62, 36, 36, 36, 36, 62, 44, 36, 36, 36, 61, 44, 80, 44, 89, + 86, 43, 80, 80, 86, 86, 86, 86, 44, 86, 64, 44, 44, 44, 44, 44, + 62, 36, 36, 36, 36, 36, 36, 36, 70, 36, 43, 43, 43, 80, 44, 96, + 36, 36, 36, 75, 43, 43, 43, 60, 7, 7, 7, 7, 7, 2, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 62, 61, 61, 36, 36, 61, 36, 36, + 36, 36, 62, 62, 36, 36, 36, 36, 70, 36, 43, 43, 43, 43, 71, 44, + 36, 36, 61, 81, 43, 43, 43, 44, 7, 7, 7, 7, 7, 44, 36, 36, + 77, 67, 2, 2, 2, 2, 2, 2, 2, 97, 97, 67, 43, 67, 67, 67, + 7, 7, 7, 7, 7, 27, 27, 27, 27, 27, 50, 50, 50, 4, 4, 86, + 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 44, + 57, 43, 43, 43, 43, 43, 43, 85, 43, 43, 60, 43, 36, 36, 70, 43, + 43, 43, 43, 43, 57, 43, 43, 43, 43, 43, 43, 43, 43, 43, 80, 67, + 67, 67, 67, 76, 67, 67, 92, 67, 2, 2, 97, 67, 21, 64, 44, 44, + 36, 36, 36, 36, 36, 94, 87, 43, 85, 43, 43, 43, 87, 85, 87, 71, + 7, 7, 7, 7, 7, 2, 2, 2, 36, 36, 36, 86, 43, 36, 36, 43, + 71, 86, 98, 94, 86, 86, 86, 36, 70, 43, 71, 36, 36, 36, 36, 36, + 36, 85, 87, 85, 86, 86, 87, 94, 7, 7, 7, 7, 7, 86, 87, 67, + 11, 11, 11, 48, 44, 44, 48, 44, 16, 16, 16, 16, 16, 53, 45, 16, + 36, 36, 36, 36, 61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44, + 61, 36, 36, 44, 36, 36, 36, 61, 61, 36, 36, 44, 36, 36, 36, 36, + 36, 36, 36, 61, 36, 36, 36, 36, 36, 36, 36, 36, 36, 61, 57, 43, + 2, 2, 2, 2, 99, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, + 67, 67, 67, 67, 67, 44, 44, 44, 11, 11, 11, 44, 16, 16, 16, 44, + 101, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 77, 72, + 102, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,103,104, 44, + 36, 36, 36, 36, 36, 63, 2,105,106, 36, 36, 36, 61, 44, 44, 44, + 36, 43, 85, 44, 44, 44, 44, 62, 36, 43,107, 64, 44, 44, 44, 44, + 36, 43, 44, 44, 44, 44, 44, 44, 36, 36, 36, 36, 36, 36, 61, 36, + 61, 43, 44, 44, 44, 44, 44, 44, 36, 36, 43, 87, 43, 43, 43, 86, + 86, 86, 86, 85, 87, 43, 43, 43, 43, 43, 2, 88, 2, 66, 70, 44, + 7, 7, 7, 7, 7, 44, 44, 44, 27, 27, 27, 27, 27, 44, 44, 44, + 2, 2, 2,108, 2, 59, 43, 84, 36, 83, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 61, 44, 44, 44, 36, 36, 70, 71, 36, 36, 36, 36, + 36, 36, 36, 36, 70, 61, 44, 44, 36, 36, 36, 44, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 61, 43, 85, 86, 87, 85, 86, 44, 44, + 86, 85, 86, 86, 87, 43, 44, 44, 92, 44, 2, 7, 7, 7, 7, 7, + 36, 36, 36, 36, 36, 36, 36, 44, 36, 36, 61, 44, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 44, 44, 36, 36, 36, 36, 36, 44, 44, 44, + 7, 7, 7, 7, 7,100, 44, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 36, 36, 36, 70, 85, 87, 44, 2, 36, 36, 94, 85, 43, 43, 43, 80, + 85, 85, 87, 43, 43, 43, 85, 86, 86, 87, 43, 43, 43, 43, 80, 57, + 2, 2, 2, 88, 2, 2, 2, 44, 43, 43, 43, 43, 43, 43, 43,109, + 43, 43, 43, 43, 43, 43, 43, 80, 43, 43, 98, 36, 36, 36, 36, 36, + 36, 36, 85, 43, 43, 85, 85, 86, 86, 85, 98, 36, 36, 36, 61, 44, + 97, 67, 67, 67, 67, 50, 43, 43, 43, 43, 67, 67, 67, 67, 21, 64, + 43, 98, 36, 36, 36, 36, 36, 36, 94, 43, 43, 86, 43, 87, 43, 36, + 36, 36, 36, 85, 43, 86, 87, 87, 43, 86, 44, 44, 44, 44, 2, 2, + 36, 36, 86, 86, 86, 86, 43, 43, 43, 43, 86, 43, 44, 93, 2, 2, + 7, 7, 7, 7, 7, 44, 62, 36, 36, 36, 36, 36, 40, 40, 40, 2, + 16, 16, 16, 16,110, 44, 44, 44, 11, 11, 11, 11, 11, 47, 48, 11, + 2, 2, 2, 2, 44, 44, 44, 44, 43, 60, 43, 43, 43, 43, 43, 43, + 85, 43, 43, 43, 71, 36, 70, 36, 36, 36, 71, 94, 43, 61, 44, 44, + 16, 16, 16, 16, 16, 16, 40, 40, 40, 40, 40, 40, 40, 45, 16, 16, + 16, 16, 16, 16, 45, 16, 16, 16, 16, 16, 16, 16, 16,111, 40, 40, + 32, 32, 32, 16, 16, 16, 16, 32, 16, 16, 16, 16, 11, 11, 11, 11, + 16, 16, 16, 44, 11, 11, 11, 44, 16, 16, 16, 16, 48, 48, 48, 48, + 16, 16, 16, 16, 16, 16, 16, 44, 16, 16, 16, 16,112,112,112,112, + 16, 16,110, 16, 11, 11,113,114, 41, 16,110, 16, 11, 11,113, 41, + 16, 16, 44, 16, 11, 11,115, 41, 16, 16, 16, 16, 11, 11,116, 41, + 44, 16,110, 16, 11, 11,113,117,118,118,118,118,118,119, 65, 65, + 120,120,120, 2,121,122,121,122, 2, 2, 2, 2,123, 65, 65,124, + 2, 2, 2, 2,125,126, 2,127,128, 2,129,130, 2, 2, 2, 2, + 2, 9,128, 2, 2, 2, 2,131, 65, 65,132, 65, 65, 65, 65, 65, + 133, 44, 27, 27, 27, 8,129,134, 27, 27, 27, 27, 27, 8,129,104, + 40, 40, 40, 40, 40, 40, 81, 44, 20, 20, 20, 20, 20, 20, 20, 20, + 135, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 43, 43, 43,136, 51, + 109, 51,109, 43, 43, 43, 43, 43, 80, 44, 44, 44, 44, 44, 44, 44, + 67,137, 67,138, 67, 34, 11, 16, 11, 32,138, 67, 49, 11, 11, 67, + 67, 67,137,137,137, 11, 11,139, 11, 11, 35, 36, 39, 67, 16, 11, + 8, 8, 49, 16, 16, 26, 67,140, 27, 27, 27, 27, 27, 27, 27, 27, + 105,105,105,105,105,105,105,105,105,141,142,105,143, 67, 44, 44, + 8, 8,144, 67, 67, 8, 67, 67,144, 26, 67,144, 67, 67, 67,144, + 67, 67, 67, 67, 67, 67, 67, 8, 67,144,144, 67, 67, 67, 67, 67, + 67, 67, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 67, 67, 67, 67, 4, 4, 67, 67, 8, 67, 67, 67,145,146, 67, 67, + 67, 67, 67, 67, 67, 67,144, 67, 67, 67, 67, 67, 67, 26, 8, 8, + 8, 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, + 8, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 92, 44, 44, 27, 27, 27, 27, 27, 27, 67, 67, + 67, 67, 67, 67, 67, 27, 27, 27, 67, 67, 67, 26, 67, 67, 67, 67, + 26, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 8, 8, 8, 8, + 67, 67, 67, 67, 67, 67, 67, 26, 67, 67, 67, 67, 4, 4, 4, 4, + 4, 4, 4, 27, 27, 27, 27, 27, 27, 27, 67, 67, 67, 67, 67, 67, + 8, 8,129,147, 8, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, + 8,129,148,148,148,148,148,148,148,148,148,148,147, 8, 8, 8, + 8, 8, 8, 8, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 4, 8, + 8, 8,144, 26, 8, 8,144, 67, 67, 67, 44, 67, 67, 67, 67, 67, + 67, 67, 67, 55, 67, 67, 67, 67, 32, 11, 32, 34, 34, 34, 34, 11, + 32, 32, 34, 16, 16, 16, 40, 11, 32, 32,140, 67, 67,138, 34,149, + 43, 32, 44, 44, 93, 2, 99, 2, 16, 16, 16,150, 44, 44,150, 44, + 36, 36, 36, 36, 44, 44, 44, 52, 64, 44, 44, 44, 44, 44, 44, 57, + 36, 36, 36, 61, 44, 44, 44, 44, 36, 36, 36, 61, 36, 36, 36, 61, + 2,121,121, 2,125,126,121, 2, 2, 2, 2, 6, 2,108,121, 2, + 121, 4, 4, 4, 4, 2, 2, 88, 2, 2, 2, 2, 2,120, 2, 2, + 108,151, 2, 2, 2, 2, 2, 2, 67, 2,152,148,148,148,153, 44, + 67, 67, 67, 67, 67, 55, 67, 67, 67, 67, 44, 44, 44, 44, 44, 44, + 67, 67, 67, 44, 44, 44, 44, 44, 67, 67, 67, 67, 67, 67, 44, 44, + 1, 2,154,155, 4, 4, 4, 4, 4, 67, 4, 4, 4, 4,156,157, + 158,105,105,105,105, 43, 43, 86,159, 40, 40, 67,105,160, 63, 67, + 36, 36, 36, 61, 57,161,162, 69, 36, 36, 36, 36, 36, 63, 40, 69, + 44, 44, 62, 36, 36, 36, 36, 36, 67, 27, 27, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 92, 27, 27, 27, 27, 27, 67, 67, 67, + 67, 67, 67, 67, 27, 27, 27, 27,163, 27, 27, 27, 27, 27, 27, 27, + 36, 36, 83, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,164, 2, + 7, 7, 7, 7, 7, 36, 44, 44, 32, 32, 32, 32, 32, 32, 32, 70, + 51,165, 43, 43, 43, 43, 43, 88, 32, 32, 32, 32, 32, 32, 40, 43, + 36, 36, 36,105,105,105,105,105, 43, 2, 2, 2, 44, 44, 44, 44, + 41, 41, 41,162, 40, 40, 40, 40, 41, 32, 32, 32, 32, 32, 32, 32, + 16, 32, 32, 32, 32, 32, 32, 32, 45, 16, 16, 16, 34, 34, 34, 32, + 32, 32, 32, 32, 42,166, 34, 35, 32, 32, 16, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 11, 11, 32, 11, 11, 32, 32, 32, 32, 32, 32, + 32, 32, 11, 11, 34,110, 44, 44, 32,150,150, 32, 32, 44, 44, 44, + 44, 40,167, 35, 40, 35, 36, 36, 36, 71, 36, 71, 36, 70, 36, 36, + 36, 94, 87, 85, 67, 67, 80, 44, 27, 27, 27, 67,168, 44, 44, 44, + 36, 36, 2, 2, 44, 44, 44, 44, 86, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 86, 86, 86, 86, 86, 86, 86, 86, 43, 44, 44, 44, 44, 2, + 43, 36, 36, 36, 2, 72, 72, 70, 36, 36, 36, 43, 43, 43, 43, 2, + 36, 36, 36, 70, 43, 43, 43, 43, 43, 86, 44, 44, 44, 44, 44, 93, + 36, 70, 86, 43, 43, 86, 43, 86,107, 2, 2, 2, 2, 2, 2, 52, + 7, 7, 7, 7, 7, 44, 44, 2, 36, 36, 70, 69, 36, 36, 36, 36, + 7, 7, 7, 7, 7, 36, 36, 61, 36, 36, 36, 36, 70, 43, 43, 85, + 87, 85, 87, 80, 44, 44, 44, 44, 36, 70, 36, 36, 36, 36, 85, 44, + 7, 7, 7, 7, 7, 44, 2, 2, 69, 36, 36, 77, 67, 94, 85, 36, + 71, 43, 71, 70, 71, 36, 36, 43, 70, 61, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 62, 83, 2, 36, 36, 36, 36, 36, 94, 43, 86, + 2, 83,169, 80, 44, 44, 44, 44, 62, 36, 36, 61, 62, 36, 36, 61, + 62, 36, 36, 61, 44, 44, 44, 44, 16, 16, 16, 16, 16,114, 40, 40, + 16, 16, 16, 16,111, 41, 44, 44, 36, 94, 87, 86, 85,107, 87, 44, + 36, 36, 44, 44, 44, 44, 44, 44, 36, 36, 36, 61, 44, 62, 36, 36, + 170,170,170,170,170,170,170,170,171,171,171,171,171,171,171,171, + 16, 16, 16,110, 44, 44, 44, 44, 44,150, 16, 16, 44, 44, 62, 71, + 36, 36, 36, 36,172, 36, 36, 36, 36, 36, 36, 61, 36, 36, 61, 61, + 36, 62, 61, 36, 36, 36, 36, 36, 36, 41, 41, 41, 41, 41, 41, 41, + 41,117, 44, 44, 44, 44, 44, 44, 44, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36,148, 44, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 44, 44, 44, 55, 36, 36, 36, 36, 36, 36,168, 67, + 2, 2, 2,152,130, 44, 44, 44, 6,173,174,148,148,148,148,148, + 148,148,130,152,130, 2,127,175, 2, 64, 2, 2,156,148,148,130, + 2,176, 8,177, 66, 2, 44, 44, 36, 36, 61, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 61, 79, 93, 2, 3, 2, 4, 5, 6, 2, + 16, 16, 16, 16, 16, 17, 18,129,130, 4, 2, 36, 36, 36, 36, 36, + 69, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 40, + 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 36, 36, 44, 36, 61, 44, + 20,178, 56,135, 26, 8,144, 92, 44, 44, 44, 44, 79, 65, 67, 44, + 36, 36, 36, 36, 36, 36, 62, 36, 36, 36, 36, 36, 36, 61, 36, 62, + 2, 64, 44,179, 27, 27, 27, 27, 27, 27, 44, 55, 67, 67, 67, 67, + 105,105,143, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 27, 67, 92, + 67, 67, 67, 67, 67, 67, 92, 44, 92, 44, 44, 44, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 67, 50, 44,180, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 44, 44, 27, 27, 44, 44, 44, 44, 62, 36, + 155, 36, 36, 36, 36,181, 44, 44, 36, 36, 36, 43, 43, 80, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 93, 36, 36, 44, 44, 36, 36, 36, 36, + 182,105,105, 44, 44, 44, 44, 44, 11, 11, 11, 11, 16, 16, 16, 16, + 11, 11, 44, 44, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 44, 44, + 36, 36, 36, 36, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, 44, 93, + 11, 11, 11, 11, 11, 47, 11, 11, 11, 47, 11,150, 16, 16, 16, 16, + 16,150, 16, 16, 16, 16, 16, 16, 16,150, 16, 16, 16,150,110, 44, + 40, 40, 40, 52, 40, 40, 40, 40, 81, 40, 40, 40, 40, 81, 44, 44, + 36, 36, 36, 44, 61, 36, 36, 36, 36, 36, 36, 62, 61, 44, 61, 62, + 36, 36, 36, 93, 27, 27, 27, 27, 36, 36, 36, 77,163, 27, 27, 27, + 44, 44, 44,179, 27, 27, 27, 27, 36, 61, 36, 44, 44,179, 27, 27, + 36, 36, 36, 27, 27, 27, 44, 93, 36, 36, 36, 36, 36, 44, 44, 93, + 36, 36, 36, 36, 44, 44, 27, 36, 44, 27, 27, 27, 27, 27, 27, 27, + 70, 43, 57, 80, 44, 44, 43, 43, 36, 36, 62, 36, 62, 36, 36, 36, + 36, 36, 36, 44, 43, 80, 44, 57, 27, 27, 27, 27,100, 44, 44, 44, + 2, 2, 2, 2, 64, 44, 44, 44, 36, 36, 36, 36, 36, 36,183, 30, + 36, 36, 36, 36, 36, 36,183, 27, 36, 36, 36, 36, 78, 36, 36, 36, + 36, 36, 70, 80, 44,179, 27, 27, 2, 2, 2, 64, 44, 44, 44, 44, + 36, 36, 36, 44, 93, 2, 2, 2, 36, 36, 36, 44, 27, 27, 27, 27, + 36, 61, 44, 44, 27, 27, 27, 27, 36, 44, 44, 44, 93, 2, 64, 44, + 44, 44, 44, 44,179, 27, 27, 27, 11, 47, 44, 44, 44, 44, 44, 44, + 16,110, 44, 44, 44, 27, 27, 27, 36, 36, 43, 43, 44, 44, 44, 44, + 27, 27, 27, 27, 27, 27, 27,100, 36, 36, 36, 36, 36, 57,184, 44, + 36, 44, 44, 44, 44, 44, 44, 44, 27, 27, 27, 95, 44, 44, 44, 44, + 180, 27, 30, 2, 2, 44, 44, 44, 36, 43, 43, 2, 2, 44, 44, 44, + 36, 36,183, 27, 27, 27, 44, 44, 87, 98, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 43, 60, 2, 2, 2, 44, + 27, 27, 27, 7, 7, 7, 7, 7, 71, 70, 71, 44, 44, 44, 44, 57, + 86, 87, 43, 85, 87, 60,185, 2, 2, 80, 44, 44, 44, 44, 79, 44, + 43, 71, 36, 36, 36, 36, 36, 36, 36, 36, 36, 70, 43, 43, 87, 43, + 43, 43, 80, 7, 7, 7, 7, 7, 2, 2, 94, 98, 44, 44, 44, 44, + 36, 70, 2, 61, 44, 44, 44, 44, 36, 94, 86, 43, 43, 43, 43, 85, + 98, 36, 63, 2, 59, 43, 60, 87, 7, 7, 7, 7, 7, 63, 63, 2, + 179, 27, 27, 27, 27, 27, 27, 27, 27, 27,100, 44, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 86, 87, 43, 86, 85, 43, 2, 2, 2, 80, + 36, 36, 36, 61, 61, 36, 36, 62, 36, 36, 36, 36, 36, 36, 36, 62, + 36, 36, 36, 36, 63, 44, 44, 44, 36, 36, 36, 36, 36, 36, 36, 70, + 86, 87, 43, 43, 43, 80, 44, 44, 43, 86, 62, 36, 36, 36, 61, 62, + 61, 36, 62, 36, 36, 57, 71, 86, 85, 86, 90, 89, 90, 89, 86, 44, + 61, 44, 44, 89, 44, 44, 62, 36, 36, 86, 44, 43, 43, 43, 80, 44, + 43, 43, 80, 44, 44, 44, 44, 44, 36, 36, 94, 86, 43, 43, 43, 43, + 86, 43, 85, 71, 36, 63, 2, 2, 7, 7, 7, 7, 7, 2, 93, 71, + 86, 87, 43, 43, 85, 85, 86, 87, 85, 43, 36, 72, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 36, 36, 94, 86, 43, 43, 44, 86, 86, 43, 87, + 60, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 36, 36, 43, 44, + 86, 87, 43, 43, 43, 85, 87, 87, 60, 2, 61, 44, 44, 44, 44, 44, + 2, 2, 2, 2, 2, 2, 64, 44, 36, 36, 36, 36, 36, 70, 87, 86, + 43, 43, 43, 87, 63, 44, 44, 44, 86, 43, 43, 87, 43, 43, 44, 44, + 7, 7, 7, 7, 7, 27, 2, 97, 43, 43, 43, 43, 87, 60, 44, 44, + 27,100, 44, 44, 44, 44, 44, 62, 36, 36, 36, 61, 62, 44, 36, 36, + 36, 36, 62, 61, 36, 36, 36, 36, 86, 86, 86, 89, 90, 57, 85, 71, + 98, 87, 2, 64, 44, 44, 44, 44, 36, 36, 36, 36, 44, 36, 36, 36, + 94, 86, 43, 43, 44, 43, 86, 86, 71, 72, 90, 44, 44, 44, 44, 44, + 70, 43, 43, 43, 43, 71, 36, 36, 36, 70, 43, 43, 85, 70, 43, 60, + 2, 2, 2, 59, 44, 44, 44, 44, 70, 43, 43, 85, 87, 43, 36, 36, + 36, 36, 36, 36, 36, 43, 43, 43, 43, 43, 43, 85, 43, 2, 72, 2, + 2, 64, 44, 44, 44, 44, 44, 44, 43, 43, 43, 80, 43, 43, 43, 87, + 63, 2, 2, 44, 44, 44, 44, 44, 2, 36, 36, 36, 36, 36, 36, 36, + 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 89, 43, 43, 43, + 85, 43, 87, 80, 44, 44, 44, 44, 36, 36, 36, 61, 36, 62, 36, 36, + 70, 43, 43, 80, 44, 80, 43, 57, 43, 43, 43, 70, 44, 44, 44, 44, + 36, 36, 36, 62, 61, 36, 36, 36, 36, 36, 36, 36, 36, 86, 86, 90, + 43, 89, 87, 87, 61, 44, 44, 44, 36, 70, 85,107, 64, 44, 44, 44, + 27, 27, 91, 67, 67, 67, 56, 20,168, 67, 67, 67, 67, 67, 67, 67, + 67, 44, 44, 44, 44, 44, 44, 93,105,105,105,105,105,105,105,181, + 2, 2, 64, 44, 44, 44, 44, 44, 63, 64, 44, 44, 44, 44, 44, 44, + 65, 65, 65, 65,132, 44, 44, 44, 43, 43, 60, 44, 44, 44, 44, 44, + 43, 43, 43, 60, 2, 2, 67, 67, 40, 40, 97, 44, 44, 44, 44, 44, + 7, 7, 7, 7, 7,179, 27, 27, 27, 62, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 44, 44, 62, 36, 27, 27, 27, 30, 2, 64, 44, 44, + 36, 36, 36, 36, 36, 61, 44, 57, 94, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 44, 44, 44, 57, + 43, 74, 40, 40, 40, 40, 40, 40, 40, 88, 80, 44, 44, 44, 44, 44, + 86, 44, 44, 44, 44, 44, 44, 44, 40, 40, 52, 40, 40, 40, 52, 81, + 36, 61, 44, 44, 44, 44, 44, 44, 44, 44, 36, 36, 44, 44, 44, 44, + 36, 36, 36, 36, 36, 44, 50, 60, 65, 65, 44, 44, 44, 44, 44, 44, + 43, 43, 43, 43, 43, 43, 43, 44, 43, 43, 43, 80, 44, 44, 44, 44, + 67, 67, 67, 92, 55, 67, 67, 67, 67, 67,186, 87, 43, 67,186, 86, + 86,187, 65, 65, 65, 84, 43, 43, 43, 76, 50, 43, 43, 43, 67, 67, + 67, 67, 67, 67, 67, 43, 43, 67, 67, 43, 76, 44, 44, 44, 44, 44, + 27, 27, 44, 44, 44, 44, 44, 44, 11, 11, 11, 11, 11, 16, 16, 16, + 16, 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, + 16, 16,110, 16, 16, 16, 16, 16, 11, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 47, 11, 44, 47, 48, 47, 48, 11, 47, 11, + 11, 11, 11, 16, 16,150,150, 16, 16, 16,150, 16, 16, 16, 16, 16, + 16, 16, 11, 48, 11, 47, 48, 11, 11, 11, 47, 11, 11, 11, 47, 16, + 16, 16, 16, 16, 11, 48, 11, 47, 11, 11, 47, 47, 44, 11, 11, 11, + 47, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 11, 11, + 11, 11, 11, 16, 16, 16, 16, 16, 16, 16, 16, 44, 11, 11, 11, 11, + 31, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, + 16, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, + 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 31, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 33, 16, 16, 16, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, + 11, 11, 11, 11, 31, 16, 16, 16, 16, 33, 16, 16, 16, 32, 44, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 43, 43, 43, 76, 67, 50, 43, 43, + 43, 43, 43, 43, 43, 43, 76, 67, 67, 67, 50, 67, 67, 67, 67, 67, + 67, 67, 76, 21, 2, 2, 44, 44, 44, 44, 44, 44, 44, 57, 43, 43, + 16, 16, 16, 16, 16, 39, 16, 16, 16, 16, 16, 16, 16, 16, 16,110, + 43, 43, 43, 80, 43, 43, 43, 43, 43, 43, 43, 43, 80, 57, 43, 43, + 43, 57, 80, 43, 43, 80, 44, 44, 43, 43, 43, 74, 40, 40, 40, 44, + 7, 7, 7, 7, 7, 44, 44, 77, 36, 36, 36, 36, 36, 36, 36, 80, + 36, 36, 36, 36, 36, 36, 43, 43, 7, 7, 7, 7, 7, 44, 44, 96, + 36, 36, 36, 61, 36, 36, 62, 61, 36, 36, 61,179, 27, 27, 27, 27, + 16, 16, 43, 43, 43, 74, 44, 44, 27, 27, 27, 27, 27, 27,163, 27, + 188, 27,100, 44, 44, 44, 44, 44, 27, 27, 27, 27, 27, 27, 27,163, + 27, 27, 27, 27, 27, 27, 27, 44, 36, 36, 62, 36, 36, 36, 36, 36, + 62, 61, 61, 62, 62, 36, 36, 36, 36, 61, 36, 36, 62, 62, 44, 44, + 44, 61, 44, 62, 62, 62, 62, 36, 62, 61, 61, 62, 62, 62, 62, 62, + 62, 61, 61, 62, 36, 61, 36, 36, 36, 61, 36, 36, 62, 36, 61, 61, + 36, 36, 36, 36, 36, 62, 36, 36, 62, 36, 62, 36, 36, 62, 36, 36, + 8, 44, 44, 44, 44, 44, 44, 44, 55, 67, 67, 67, 67, 67, 67, 67, + 27, 27, 27, 27, 27, 27, 91, 67, 67, 67, 67, 67, 67, 67, 67, 44, + 44, 44, 44, 67, 67, 67, 67, 67, 67, 92, 44, 44, 44, 44, 44, 44, + 67, 67, 67, 67, 92, 44, 44, 44, 67, 44, 44, 44, 44, 44, 44, 44, + 67, 67, 67, 67, 67, 25, 41, 41, 67, 67, 67, 67, 44, 44, 55, 67, + 67, 67, 67, 67, 44, 44, 44, 44, 67, 67, 92, 44, 67, 67, 92, 44, + 67, 92, 67, 67, 67, 67, 67, 67, 79, 44, 44, 44, 44, 44, 44, 44, + 65, 65, 65, 65, 65, 65, 65, 65,171,171,171,171,171,171,171, 44, + 171,171,171,171,171,171,171, 0, 0, 0, 29, 21, 21, 21, 23, 21, + 22, 18, 21, 25, 21, 17, 13, 13, 25, 25, 25, 21, 21, 9, 9, 9, + 9, 22, 21, 18, 24, 16, 24, 5, 5, 5, 5, 22, 25, 18, 25, 0, + 23, 23, 26, 21, 24, 26, 7, 20, 25, 1, 26, 24, 26, 25, 15, 15, + 24, 15, 7, 19, 15, 21, 9, 25, 9, 5, 5, 25, 5, 9, 5, 7, + 7, 7, 9, 8, 8, 5, 7, 5, 6, 6, 24, 24, 6, 24, 12, 12, + 2, 2, 6, 5, 9, 21, 9, 2, 2, 9, 25, 9, 26, 12, 11, 11, + 2, 6, 5, 21, 17, 2, 2, 26, 26, 23, 2, 12, 17, 12, 21, 12, + 12, 21, 7, 2, 2, 7, 7, 21, 21, 2, 1, 1, 21, 23, 26, 26, + 1, 21, 6, 7, 7, 12, 12, 7, 21, 7, 12, 1, 12, 6, 6, 12, + 12, 26, 7, 26, 26, 7, 2, 1, 12, 2, 6, 2, 24, 7, 7, 6, + 1, 12, 12, 10, 10, 10, 10, 12, 21, 6, 2, 10, 10, 2, 15, 26, + 26, 2, 2, 21, 7, 10, 15, 7, 2, 23, 21, 26, 10, 7, 21, 15, + 15, 2, 17, 7, 29, 7, 7, 22, 18, 2, 14, 14, 14, 7, 10, 21, + 17, 21, 11, 12, 5, 2, 5, 6, 8, 8, 8, 24, 5, 24, 2, 24, + 9, 24, 24, 2, 29, 29, 29, 1, 17, 17, 20, 19, 22, 20, 27, 28, + 1, 29, 21, 20, 19, 21, 21, 16, 16, 21, 25, 22, 18, 21, 21, 29, + 1, 2, 15, 6, 18, 6, 23, 2, 12, 11, 9, 26, 26, 9, 26, 5, + 5, 26, 14, 9, 5, 14, 14, 15, 25, 26, 26, 22, 18, 26, 18, 25, + 18, 22, 5, 12, 2, 5, 22, 21, 21, 22, 18, 17, 26, 6, 7, 14, + 17, 22, 18, 18, 26, 14, 17, 6, 14, 6, 12, 24, 24, 6, 26, 15, + 6, 21, 11, 21, 24, 9, 6, 9, 23, 26, 6, 10, 4, 4, 3, 3, + 7, 25, 17, 16, 16, 22, 16, 16, 25, 17, 25, 2, 25, 24, 2, 15, + 12, 15, 14, 2, 21, 14, 7, 15, 12, 17, 21, 1, 26, 10, 10, 1, + 23, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, + 13, 0, 14, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, + 0, 0, 39, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4, 5, + 6, 7, 0, 8, 9, 10, 0, 11, 12, 13, 14, 15, 16, 17, 16, 18, + 16, 19, 16, 19, 16, 19, 0, 19, 16, 20, 16, 19, 21, 19, 0, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 0, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, 0, 35, + 0, 0, 36, 0, 37, 0, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, + 0, 0, 0, 50, 0, 51, 0, 52, 53, 0, 54, 0, 0, 0, 0, 0, + 0, 55, 56, 57, 0, 0, 0, 0, 58, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 64, 65, 0, 0, 0, 66, 0, 0, 0, 0, 67, 0, 0, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 0, 0, 0, 70, 0, 71, 0, 0, 72, 0, 0, 73, 0, 0, 0, 0, + 0, 0, 0, 0, 74, 0, 0, 0, 0, 0, 75, 0, 0, 76, 77, 0, + 0, 78, 79, 0, 80, 62, 0, 81, 82, 0, 0, 83, 84, 85, 0, 0, + 0, 86, 0, 87, 0, 0, 51, 88, 51, 0, 89, 0, 90, 0, 0, 0, + 79, 0, 0, 0, 91, 92, 0, 93, 94, 95, 96, 0, 0, 0, 0, 0, + 51, 0, 0, 0, 0, 97, 98, 0, 0, 0, 0, 99,100, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,101, 0, 0,102, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,103,104, 0, 0,105, 0, 0, 0, 0, 0, 0, + 106, 0, 0, 0,100, 0, 0, 0, 0, 0,107,108, 0, 0, 0, 0, + 0, 0, 0,109, 0,110, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 5, 6, 7, 0, 8, 0, 0, 0, 0, 9, 10, 11, 12, 0, 0, 0, + 0, 13, 0, 0, 14, 15, 0, 16, 0, 17, 18, 0, 0, 19, 0, 20, + 21, 0, 0, 0, 0, 0, 22, 23, 0, 24, 25, 0, 0, 26, 0, 0, + 0, 27, 0, 0, 28, 29, 30, 31, 0, 0, 0, 32, 33, 34, 0, 0, + 33, 0, 0, 35, 33, 0, 0, 0, 33, 36, 0, 0, 0, 0, 0, 37, + 38, 0, 0, 0, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 41, + 42, 0, 0, 0, 0, 43, 0, 44, 0, 0, 0, 45, 46, 0, 0, 0, + 47, 0, 0, 0, 0, 0, 0, 48, 49, 0, 0, 0, 0, 50, 0, 0, + 0, 51, 0, 52, 0, 53, 0, 0, 0, 0, 54, 0, 0, 0, 0, 55, + 0, 56, 0, 0, 0, 0, 57, 58, 0, 0, 0, 59, 60, 0, 0, 0, + 0, 0, 0, 61, 52, 0, 62, 63, 0, 0, 64, 0, 0, 0, 65, 66, + 0, 0, 0, 67, 0, 68, 69, 70, 71, 72, 1, 73, 0, 74, 75, 76, + 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 1, 1, 0, 0, 80, 0, + 0, 81, 0, 0, 0, 0, 77, 82, 0, 83, 0, 0, 0, 0, 0, 78, + 84, 0, 85, 0, 52, 0, 1, 78, 0, 0, 86, 0, 0, 87, 0, 0, + 0, 0, 0, 88, 57, 0, 0, 0, 0, 0, 0, 89, 90, 0, 0, 84, + 0, 0, 33, 0, 0, 91, 0, 0, 0, 0, 92, 0, 0, 0, 0, 49, + 0, 0, 93, 0, 0, 0, 0, 94, 95, 0, 0, 96, 0, 0, 97, 0, + 0, 0, 98, 0, 0, 0, 99, 0,100, 93, 0, 0,101, 0, 0, 0, + 84, 0, 0,102, 0, 0, 0,103,104, 0, 0,105,106, 0, 0, 0, + 0, 0, 0,107, 0, 0,108, 0, 0, 0, 0,109, 33, 0,110,111, + 112, 35, 0, 0,113, 0, 0, 0,114, 0, 0, 0, 0, 0, 0,115, + 0, 0,116, 0, 0, 0, 0,117, 88, 0, 0, 0, 0, 0, 57, 0, + 0, 0, 0, 52,118, 0, 0, 0, 0,119, 0, 0,120, 0, 0, 0, + 0,118, 0, 0, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, + 0,124, 0, 0, 0, 0,125,126,127, 0,128, 0,129, 0, 0, 0, + 130,131,132, 0, 0, 0, 35, 0, 0, 0,133, 0, 0,134, 0, 0, + 135, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, + 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, + 18, 1, 1, 1, 19, 1, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 1, 1, 31, 0, 0, 0, 32, 33, + 34, 35, 1, 36, 37, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, + 42, 0, 0, 0, 43, 36, 44, 45, 21, 45, 46, 0, 0, 0, 19, 1, + 21, 0, 0, 47, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 51, 0, + 0, 0, 52, 1, 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, + 54, 21, 35, 1, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 0, 0, 0, 59, 0, 60, 0, 0, 0, 0, 61, 62, 0, 0, 63, 0, + 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, + 0, 0, 68, 0, 0, 69, 70, 0, 71, 72, 73, 74, 75, 76, 0, 0, + 0, 77, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 49, + 0, 80, 0, 0, 0, 62, 0, 0, 63, 0, 0, 81, 0, 0, 82, 0, + 0, 0, 83, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, + 1, 52, 15, 86, 36, 10, 21, 87, 0, 55, 0, 0, 0, 0, 19, 10, + 1, 0, 0, 0, 0, 0, 88, 0, 0, 89, 0, 0, 88, 0, 0, 0, + 0, 78, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, + 21, 1, 21, 92, 93, 1, 1, 1, 1, 94, 95, 96, 97, 1, 98, 58, + 81, 99,100, 4, 58, 0, 0, 0, 0, 0, 0, 19, 50, 0, 0, 0, + 0, 0, 0, 61, 0, 0,101,102, 0, 0,103, 0, 0, 1, 1, 50, + 0, 0, 0, 38, 0, 63, 0, 0, 0, 0, 0, 62, 0, 0,104, 68, + 61, 0, 0, 0, 78, 0, 0, 0,105,106, 58, 38, 81, 0, 0, 0, + 0, 0, 0,107, 1, 14, 4, 12, 84, 0, 0, 0, 0, 38, 87, 0, + 0, 0, 0,108, 0, 0,109, 61, 0,110, 0, 0, 0, 1, 0, 0, + 0, 0, 19, 58, 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, + 0, 0,113, 0, 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, + 0,113, 0, 0, 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, + 1, 58, 0, 0, 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, + 0,115, 0, 0, 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, + 0, 0, 56, 0, 89, 80, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, + 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, + 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, + 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 4,122, 0, 0, + 0, 1,123, 0, 0, 0, 0, 0,230,230,230,230,230,232,220,220, + 220,220,232,216,220,220,220,220,220,202,202,220,220,220,220,202, + 202,220,220,220, 1, 1, 1, 1, 1,220,220,220,220,230,230,230, + 230,240,230,220,220,220,230,230,230,220,220, 0,230,230,230,220, + 220,220,220,230,232,220,220,230,233,234,234,233,234,234,233,230, + 0, 0, 0,230, 0,220,230,230,230,230,220,230,230,230,222,220, + 230,230,220,220,230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, + 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230, + 230,220,220,230,220,230,230,220, 35, 0, 0, 0, 0, 0,230,230, + 230, 0, 0,230,230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0, + 230,220,230,230,220,220,230,220,220,230,220,230,220,230,230, 0, + 0,220, 0, 0,230,230, 0,230, 0,230,230,230,230,230, 0, 0, + 0,220,220,220,230,220,220,220,230,230, 0,220, 27, 28, 29,230, + 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, + 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, + 0, 0, 9, 0,103,103, 9, 0,107,107,107,107,118,118, 9, 0, + 122,122,122,122,220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, + 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0, + 130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, + 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, + 0,222,230,220,220, 0, 0, 0,230, 0, 0,220,230,220, 0,220, + 230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, + 1, 0, 0, 0,230,234,214,220,202,230,230,230,230,230,232,228, + 228,220,218,230,233,220,230,220,230,230, 1, 1, 1, 1, 1,230, + 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228,232,222,224,224, + 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, + 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, + 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, + 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, + 1, 1, 0, 0, 0,226,216,216,216,216,216, 0,220,220,220, 0, + 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, + 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, + 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, + 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, + 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, + 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, + 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, + 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, + 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, + 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, + 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, + 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, + 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, + 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, + 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, + 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, + 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, + 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 44, 0, 0, 1, + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, + 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, + 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, + 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, + 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, + 152,153,154,155, 96, 96,156,157,158,159, 96,160, 96,161,162,162, + 162,162,162,162,162,163,164,162,165, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,166,167,167, + 167,167,167,167,167,167,168, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,169,169,169,169,170, 96, 96, 96,171,171, + 171,171,172,173,174,175, 96, 96, 96, 96,176,177,178,179,180,180, + 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, + 180,180,180,180,180,180,180,180,180,180,180,180,180,181,180,180, + 180,180,180,180,182,182,182,183,184, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,185,186,187, + 188,189,189,190, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,191,192, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, 59,195, + 196,197,198,199,200, 96,201,202,203, 59, 59,204, 59,205,206,206, + 206,206,206,207, 96, 96, 96, 96, 96, 96, 96, 96,208, 96,209, 96, + 210, 96, 96,211, 96, 96, 96, 96, 96, 96, 96, 96, 96,212,213,214, + 215, 96, 96, 96, 96, 96,216,217,218, 96,219,220, 96, 96,221,222, + 59,223,224, 96, 59, 59, 59, 59, 59, 59, 59,225,226,227,228,229, + 59, 59,230,231, 59,232, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,233, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,234, 70,235, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,236, 70, 70, 70, 70, + 70, 70, 70, 70, 70,237, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70,238, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70,239, 96, 96, 96, 96, 96, 96, 96, 96, 96,240, 96, + 241,242, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, + 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, + 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, + 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, + 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, + 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, + 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, + 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, + 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, + 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, + 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, + 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, + 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, + 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, + 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, + 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, + 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, + 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, + 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, + 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, + 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, + 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, + 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, + 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, + 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, + 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, + 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, + 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, + 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, + 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, + 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, + 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, + 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, + 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, + 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, + 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, + 16, 2, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, + 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, + 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, + 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, + 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, + 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, + 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, + 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, + 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, + 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, + 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, + 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, + 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, + 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, + 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, + 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, + 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, + 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, + 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, + 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, + 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76, + 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, + 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, + 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2, + 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, + 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, + 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, + 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13, + 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, + 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, + 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, + 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, + 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 19, 19, + 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, + 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, + 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, + 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, + 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30, + 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 87, 87, + 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, + 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 13, 13, + 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, + 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, + 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 3, 3, + 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, + 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, + 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118, + 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40, + 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, + 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135, + 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,104,104, + 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161, + 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161, + 2,161,161,161,161,161,161,161, 2,161,161, 2, 2, 2,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110, + 110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 2, + 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120, + 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128, + 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, + 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, + 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, + 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, + 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117, + 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, + 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, + 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122, + 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, + 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, + 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, + 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156, + 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156, + 2, 2, 2, 2, 2, 2,147,147,147,147,147,147,147,147,148,148, + 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, + 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, + 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, + 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, + 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, + 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, + 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, + 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, + 2,108,108,108,108,108,108,108,108,108,108,108,108, 2,129,129, + 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, + 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, + 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, + 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, + 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, + 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, + 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, + 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, + 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, + 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, + 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, + 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, + 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, + 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, + 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, + 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, + 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, + 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, + 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, + 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, + 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, + 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, + 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, + 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, + 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, + 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, + 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, + 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, + 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, + 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, + 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134, + 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138, + 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138, + 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138, + 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, + 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, + 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, + 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2, 86, 2, + 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, + 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157, + 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 80, 2, + 2, 2, 2, 2, 2, 2,127,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, + 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, + 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, + 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, + 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, + 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, + 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, + 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, + 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, + 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, + 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, + 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, + 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 15, 15, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, + 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, + 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, + 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2, + 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, + 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, + 131,131,131,131,131,131, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, + 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, + 56, 2, 2, 2, 2, 2,151,151,151,151,151,151,151,151,151,151, + 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, + 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, + 2, 2, 2, 2, 2,152, 30, 30, 30, 30, 2, 30, 30, 2,113,113, + 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, + 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, + 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, + 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, + 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, + 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, + 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, + 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, + 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, + 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, + 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, + 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, + 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0, + 110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131, + 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147, + 148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160, + 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176, + 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, + 193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, +}; +static const uint16_t +_hb_ucd_u16[9200] = +{ + 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, + 13, 13, 13, 24, 25, 11, 11, 11, 11, 26, 11, 27, 28, 29, 30, 31, + 32, 32, 32, 32, 32, 32, 32, 33, 34, 35, 36, 11, 37, 38, 13, 39, + 9, 9, 9, 11, 11, 11, 13, 13, 40, 13, 13, 13, 41, 13, 13, 13, + 13, 13, 13, 42, 9, 43, 11, 11, 44, 45, 32, 46, 47, 48, 49, 50, + 51, 52, 48, 48, 53, 32, 54, 55, 48, 48, 48, 48, 48, 56, 57, 58, + 59, 60, 48, 32, 61, 48, 48, 48, 48, 48, 62, 63, 64, 48, 65, 66, + 48, 67, 68, 69, 48, 70, 71, 48, 72, 73, 48, 48, 74, 32, 75, 32, + 76, 48, 48, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 83, 84, 91, 92, 93, 94, 95, 96, 97, 84, 98, 99, 100, 88, 101, + 102, 83, 84, 103, 104, 105, 88, 106, 107, 108, 109, 110, 111, 112, 94, 113, + 114, 115, 84, 116, 117, 118, 88, 119, 120, 115, 84, 121, 122, 123, 88, 124, + 125, 115, 48, 126, 127, 128, 88, 129, 130, 131, 48, 132, 133, 134, 94, 135, + 136, 48, 48, 137, 138, 139, 140, 140, 141, 48, 142, 143, 144, 145, 140, 140, + 146, 147, 148, 149, 150, 48, 151, 152, 153, 154, 32, 155, 156, 157, 140, 140, + 48, 48, 158, 159, 160, 161, 162, 163, 164, 165, 9, 9, 166, 11, 11, 167, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 168, 169, 48, 48, + 168, 48, 48, 170, 171, 172, 48, 48, 48, 171, 48, 48, 48, 173, 174, 175, + 48, 176, 9, 9, 9, 9, 9, 177, 178, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 179, 48, 180, 181, 48, 48, 48, 48, 182, 183, + 48, 184, 48, 185, 48, 186, 187, 188, 48, 48, 48, 189, 190, 191, 192, 193, + 194, 192, 48, 48, 195, 48, 48, 196, 197, 48, 198, 48, 48, 48, 48, 199, + 48, 200, 201, 202, 203, 48, 204, 205, 48, 48, 206, 48, 207, 208, 209, 209, + 48, 210, 48, 48, 48, 211, 212, 213, 192, 192, 214, 215, 216, 140, 140, 140, + 217, 48, 48, 218, 219, 160, 220, 221, 222, 48, 223, 64, 48, 48, 224, 225, + 48, 48, 226, 227, 228, 64, 48, 229, 230, 9, 9, 231, 232, 233, 234, 235, + 11, 11, 236, 27, 27, 27, 237, 238, 11, 239, 27, 27, 32, 32, 32, 32, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 240, 13, 13, 13, 13, 13, 13, + 241, 242, 241, 241, 242, 243, 241, 244, 245, 245, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 272, 273, 274, 275, 209, 276, 277, 209, 278, + 279, 279, 279, 279, 279, 279, 279, 279, 280, 209, 281, 209, 209, 209, 209, 282, + 209, 283, 279, 284, 209, 285, 286, 209, 209, 209, 287, 140, 288, 140, 271, 271, + 271, 289, 209, 209, 209, 209, 290, 271, 209, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 291, 292, 209, 209, 293, 209, 209, 209, 209, 209, 209, 294, 209, + 209, 209, 209, 209, 209, 209, 295, 296, 271, 297, 209, 209, 298, 279, 299, 279, + 300, 301, 279, 279, 279, 302, 279, 303, 209, 209, 209, 279, 304, 209, 209, 305, + 209, 306, 209, 209, 209, 209, 209, 209, 9, 9, 9, 11, 11, 11, 307, 308, + 13, 13, 13, 13, 13, 13, 309, 310, 11, 11, 311, 48, 48, 48, 312, 313, + 48, 314, 315, 315, 315, 315, 32, 32, 316, 317, 318, 319, 320, 321, 140, 140, + 209, 322, 209, 209, 209, 209, 209, 323, 209, 209, 209, 209, 209, 324, 140, 325, + 326, 327, 328, 329, 136, 48, 48, 48, 48, 330, 178, 48, 48, 48, 48, 331, + 332, 48, 48, 136, 48, 48, 48, 48, 200, 333, 48, 48, 209, 209, 323, 48, + 209, 334, 335, 209, 336, 337, 209, 209, 335, 209, 209, 337, 209, 209, 209, 209, + 48, 48, 48, 48, 209, 209, 209, 209, 48, 338, 48, 48, 48, 48, 48, 48, + 151, 209, 209, 209, 287, 48, 48, 229, 339, 48, 340, 140, 13, 13, 341, 342, + 13, 343, 48, 48, 48, 48, 344, 345, 31, 346, 347, 348, 13, 13, 13, 349, + 350, 351, 352, 353, 354, 355, 140, 356, 357, 48, 358, 359, 48, 48, 48, 360, + 361, 48, 48, 362, 363, 192, 32, 364, 64, 48, 365, 48, 366, 367, 48, 151, + 76, 48, 48, 368, 369, 370, 371, 372, 48, 48, 373, 374, 375, 376, 48, 377, + 48, 48, 48, 378, 379, 380, 381, 382, 383, 384, 315, 11, 11, 385, 386, 11, + 11, 11, 11, 11, 48, 48, 387, 192, 48, 48, 388, 48, 389, 48, 48, 206, + 390, 390, 390, 390, 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, + 48, 48, 48, 48, 48, 48, 204, 48, 48, 48, 48, 48, 48, 207, 140, 140, + 392, 393, 394, 395, 396, 48, 48, 48, 48, 48, 48, 397, 398, 399, 48, 48, + 48, 48, 48, 400, 209, 48, 48, 48, 48, 401, 48, 48, 402, 140, 140, 403, + 32, 404, 32, 405, 406, 407, 408, 409, 48, 48, 48, 48, 48, 48, 48, 410, + 411, 2, 3, 4, 5, 412, 413, 414, 48, 415, 48, 200, 416, 417, 418, 419, + 420, 48, 172, 421, 204, 204, 140, 140, 48, 48, 48, 48, 48, 48, 48, 71, + 422, 271, 271, 423, 272, 272, 272, 424, 425, 426, 427, 140, 140, 209, 209, 428, + 140, 140, 140, 140, 140, 140, 140, 140, 48, 151, 48, 48, 48, 100, 429, 430, + 48, 48, 431, 48, 432, 48, 48, 433, 48, 434, 48, 48, 435, 436, 140, 140, + 9, 9, 437, 11, 11, 48, 48, 48, 48, 204, 192, 9, 9, 438, 11, 439, + 48, 48, 440, 48, 48, 48, 441, 442, 442, 443, 444, 445, 140, 140, 140, 140, + 48, 48, 48, 314, 48, 199, 440, 140, 446, 27, 27, 447, 140, 140, 140, 140, + 448, 48, 48, 449, 48, 450, 48, 451, 48, 200, 452, 140, 140, 140, 48, 453, + 48, 454, 48, 455, 140, 140, 140, 140, 48, 48, 48, 456, 271, 457, 271, 271, + 458, 459, 48, 460, 461, 462, 48, 463, 48, 464, 140, 140, 465, 48, 466, 467, + 48, 48, 48, 468, 48, 469, 48, 470, 48, 471, 472, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 196, 140, 140, 140, 9, 9, 9, 473, 11, 11, 11, 474, + 48, 48, 475, 192, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 271, 476, + 48, 48, 477, 478, 140, 140, 140, 140, 48, 464, 479, 48, 62, 480, 140, 48, + 481, 140, 140, 48, 482, 140, 48, 314, 483, 48, 48, 484, 485, 457, 486, 487, + 222, 48, 48, 488, 489, 48, 196, 192, 490, 48, 491, 492, 493, 48, 48, 494, + 222, 48, 48, 495, 496, 497, 498, 499, 48, 97, 500, 501, 140, 140, 140, 140, + 502, 503, 504, 48, 48, 505, 506, 192, 507, 83, 84, 508, 509, 510, 511, 512, + 48, 48, 48, 513, 514, 515, 478, 140, 48, 48, 48, 516, 517, 192, 140, 140, + 48, 48, 518, 519, 520, 521, 140, 140, 48, 48, 48, 522, 523, 192, 524, 140, + 48, 48, 525, 526, 192, 140, 140, 140, 48, 173, 527, 528, 314, 140, 140, 140, + 48, 48, 500, 529, 140, 140, 140, 140, 140, 140, 9, 9, 11, 11, 148, 530, + 531, 532, 48, 533, 534, 192, 140, 140, 140, 140, 535, 48, 48, 536, 537, 140, + 538, 48, 48, 539, 540, 541, 48, 48, 542, 543, 544, 48, 48, 48, 48, 196, + 84, 48, 518, 545, 546, 148, 175, 547, 48, 548, 549, 550, 140, 140, 140, 140, + 551, 48, 48, 552, 553, 192, 554, 48, 555, 556, 192, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 48, 557, 140, 140, 140, 100, 271, 558, 559, 560, + 48, 207, 140, 140, 140, 140, 140, 140, 272, 272, 272, 272, 272, 272, 561, 562, + 48, 48, 48, 48, 388, 140, 140, 140, 140, 48, 48, 48, 48, 48, 48, 563, + 48, 48, 200, 564, 140, 140, 140, 140, 48, 48, 48, 48, 314, 140, 140, 140, + 48, 48, 48, 196, 48, 200, 370, 48, 48, 48, 48, 200, 192, 48, 204, 565, + 48, 48, 48, 566, 567, 568, 569, 570, 48, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 9, 9, 11, 11, 271, 571, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 572, 573, 574, 574, 575, 576, 140, 140, 140, 140, 577, 578, + 48, 48, 48, 48, 48, 48, 48, 440, 48, 48, 48, 48, 48, 199, 140, 140, + 196, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 579, + 48, 48, 580, 140, 140, 580, 581, 48, 48, 48, 48, 48, 48, 48, 48, 206, + 48, 48, 48, 48, 48, 48, 71, 151, 196, 582, 583, 140, 140, 140, 140, 140, + 32, 32, 584, 32, 585, 209, 209, 209, 209, 209, 209, 209, 323, 140, 140, 140, + 209, 209, 209, 209, 209, 209, 209, 324, 209, 209, 586, 209, 209, 209, 587, 588, + 589, 209, 590, 209, 209, 209, 288, 140, 209, 209, 209, 209, 591, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 271, 592, 209, 209, 209, 209, 209, 287, 271, 461, + 9, 593, 11, 594, 595, 596, 241, 9, 597, 598, 599, 600, 601, 9, 593, 11, + 602, 603, 11, 604, 605, 606, 607, 9, 608, 11, 9, 593, 11, 594, 595, 11, + 241, 9, 597, 607, 9, 608, 11, 9, 593, 11, 609, 9, 610, 611, 612, 613, + 11, 614, 9, 615, 616, 617, 618, 11, 619, 9, 620, 11, 621, 622, 622, 622, + 32, 32, 32, 623, 32, 32, 624, 625, 626, 627, 45, 140, 140, 140, 140, 140, + 628, 629, 140, 140, 140, 140, 140, 140, 630, 631, 632, 140, 140, 140, 140, 140, + 48, 48, 151, 633, 634, 140, 140, 140, 140, 48, 635, 140, 48, 48, 636, 637, + 140, 140, 140, 140, 140, 140, 638, 200, 48, 48, 48, 48, 639, 585, 140, 140, + 9, 9, 597, 11, 640, 370, 140, 140, 140, 140, 140, 140, 140, 140, 140, 498, + 271, 271, 641, 642, 140, 140, 140, 140, 498, 271, 643, 644, 140, 140, 140, 140, + 645, 48, 646, 647, 648, 649, 650, 651, 652, 206, 653, 206, 140, 140, 140, 654, + 209, 209, 325, 209, 209, 209, 209, 209, 209, 323, 334, 655, 655, 655, 209, 324, + 656, 209, 209, 209, 209, 209, 209, 209, 209, 209, 657, 140, 140, 140, 658, 209, + 659, 209, 209, 325, 660, 661, 324, 140, 209, 209, 209, 209, 209, 209, 209, 662, + 209, 209, 209, 209, 209, 663, 426, 426, 209, 209, 209, 209, 209, 209, 209, 323, + 209, 209, 209, 209, 209, 660, 325, 427, 325, 209, 209, 209, 664, 176, 209, 209, + 664, 209, 657, 661, 140, 140, 140, 140, 209, 209, 209, 209, 209, 323, 657, 665, + 287, 209, 426, 288, 324, 176, 664, 287, 209, 666, 209, 209, 288, 140, 140, 192, + 48, 48, 48, 48, 48, 48, 140, 140, 48, 48, 48, 196, 48, 48, 48, 48, + 48, 204, 48, 48, 48, 48, 48, 48, 48, 48, 478, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 100, 140, 48, 204, 140, 140, 140, 140, 140, 140, + 48, 48, 48, 48, 71, 140, 140, 140, 667, 140, 668, 668, 668, 668, 668, 668, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, + 391, 391, 391, 391, 391, 391, 391, 669, 391, 391, 391, 391, 391, 391, 391, 670, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, + 0, 0, 0, 0, 0, 4, 0, 4, 2, 2, 5, 2, 2, 2, 5, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 0, 0, 0, 0, 7, 8, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 11, + 12, 13, 14, 14, 15, 14, 14, 14, 14, 14, 14, 14, 16, 17, 14, 14, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 20, 21, 21, 21, 22, 20, 21, 21, 21, 21, + 21, 23, 24, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, 27, 28, 26, + 29, 30, 31, 32, 31, 31, 31, 31, 33, 34, 35, 31, 31, 31, 36, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 29, 31, 31, 31, 31, + 37, 38, 37, 37, 37, 37, 37, 37, 37, 39, 31, 31, 31, 31, 31, 31, + 40, 40, 40, 40, 40, 40, 41, 26, 42, 42, 42, 42, 42, 42, 42, 43, + 44, 44, 44, 44, 44, 45, 44, 46, 47, 47, 47, 48, 37, 49, 31, 31, + 31, 50, 51, 31, 31, 31, 31, 31, 31, 31, 31, 31, 52, 31, 31, 31, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 55, 53, 53, 53, + 56, 57, 58, 59, 59, 60, 61, 62, 57, 63, 64, 65, 66, 59, 59, 67, + 68, 69, 70, 71, 71, 72, 73, 74, 69, 75, 76, 77, 78, 71, 79, 26, + 80, 81, 82, 83, 83, 84, 85, 86, 81, 87, 88, 26, 89, 83, 90, 91, + 92, 93, 94, 95, 95, 96, 97, 98, 93, 99, 100, 101, 102, 95, 95, 26, + 103, 104, 105, 106, 107, 104, 108, 109, 104, 105, 110, 26, 111, 108, 108, 112, + 113, 114, 115, 113, 113, 115, 113, 116, 114, 117, 118, 119, 120, 113, 121, 113, + 122, 123, 124, 122, 122, 124, 125, 126, 123, 127, 128, 128, 129, 122, 130, 26, + 131, 132, 133, 131, 131, 131, 131, 131, 132, 133, 134, 131, 135, 131, 131, 131, + 136, 137, 138, 139, 137, 137, 140, 141, 138, 142, 143, 137, 144, 137, 145, 26, + 146, 147, 147, 147, 147, 147, 147, 148, 147, 147, 147, 149, 26, 26, 26, 26, + 150, 151, 152, 152, 153, 152, 152, 154, 155, 154, 152, 156, 26, 26, 26, 26, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 157, 157, 157, 159, 158, 157, + 157, 157, 157, 158, 157, 157, 157, 160, 157, 160, 161, 162, 26, 26, 26, 26, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 164, 164, 164, 164, 165, 166, 164, 164, 164, 164, 164, 167, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 171, 170, 169, 169, 169, 169, + 169, 170, 169, 169, 169, 169, 170, 171, 170, 169, 171, 169, 169, 169, 169, 169, + 169, 169, 170, 169, 169, 169, 169, 169, 169, 169, 169, 172, 169, 169, 169, 173, + 169, 169, 169, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, + 178, 178, 178, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 180, 182, + 183, 183, 184, 185, 186, 186, 187, 26, 188, 188, 189, 26, 190, 191, 192, 26, + 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 193, 195, 193, 195, + 196, 197, 197, 198, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 199, + 197, 197, 197, 197, 197, 200, 177, 177, 177, 177, 177, 177, 177, 177, 201, 26, + 202, 202, 202, 203, 202, 204, 202, 204, 205, 202, 206, 206, 206, 207, 208, 26, + 209, 209, 209, 209, 209, 210, 209, 209, 209, 211, 209, 212, 193, 193, 193, 193, + 213, 213, 213, 214, 215, 215, 215, 215, 215, 215, 215, 216, 215, 215, 215, 217, + 215, 218, 215, 218, 215, 219, 9, 9, 9, 220, 26, 26, 26, 26, 26, 26, + 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 221, 221, 221, 221, 221, 223, + 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 226, 227, + 228, 228, 228, 228, 228, 228, 228, 229, 228, 230, 231, 231, 231, 231, 231, 231, + 18, 232, 164, 164, 164, 164, 164, 233, 224, 26, 234, 9, 235, 236, 237, 238, + 2, 2, 2, 2, 239, 240, 2, 2, 2, 2, 2, 241, 242, 243, 2, 244, + 2, 2, 2, 2, 2, 2, 2, 245, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 246, 246, 14, 14, 14, 14, 246, 246, 14, 247, 14, 14, 14, 246, + 14, 14, 14, 14, 14, 14, 248, 14, 248, 14, 249, 250, 14, 14, 251, 252, + 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 256, + 0, 257, 2, 258, 0, 0, 0, 0, 259, 26, 9, 9, 9, 9, 260, 26, + 0, 0, 0, 0, 261, 262, 4, 0, 0, 263, 0, 0, 2, 2, 2, 2, + 2, 264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 257, 26, 26, 26, 0, 265, 26, 26, 0, 0, 0, 0, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, + 0, 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 2, 2, 2, 2, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 270, 271, + 164, 164, 164, 164, 165, 166, 272, 272, 272, 272, 272, 272, 272, 273, 274, 273, + 169, 169, 171, 26, 171, 171, 171, 171, 171, 171, 171, 171, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, + 276, 276, 276, 277, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 278, 26, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 26, 26, 26, 0, 280, + 281, 0, 0, 0, 282, 283, 0, 284, 285, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 287, 288, 289, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 291, + 292, 293, 293, 293, 293, 293, 294, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 295, 0, 0, 293, 293, 293, 293, 0, 0, 0, 0, 280, 26, 290, 290, + 168, 168, 168, 295, 0, 0, 0, 0, 0, 0, 0, 0, 168, 168, 168, 296, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 290, 290, 290, 290, 297, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 0, 0, 0, 0, 0, + 276, 276, 276, 276, 276, 276, 276, 276, 0, 0, 0, 0, 0, 0, 0, 0, + 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, + 298, 299, 298, 298, 298, 298, 298, 298, 300, 26, 301, 301, 301, 301, 301, 301, + 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, 302, + 302, 302, 302, 302, 302, 303, 26, 26, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 26, + 0, 0, 0, 0, 305, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 306, 2, 2, 2, 2, 2, 2, 2, 307, 308, 309, 26, 26, 310, 2, + 311, 311, 311, 311, 311, 312, 0, 313, 314, 314, 314, 314, 314, 314, 314, 26, + 315, 315, 315, 315, 315, 315, 315, 315, 316, 317, 315, 318, 53, 53, 53, 53, + 319, 319, 319, 319, 319, 320, 321, 321, 321, 321, 322, 323, 168, 168, 168, 324, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 326, 325, 327, 163, 163, 163, 328, + 329, 329, 329, 329, 329, 329, 330, 26, 329, 331, 329, 332, 163, 163, 163, 163, + 333, 333, 333, 333, 333, 333, 333, 333, 334, 26, 26, 335, 336, 336, 337, 26, + 338, 338, 338, 26, 171, 171, 2, 2, 2, 2, 2, 339, 340, 341, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 336, 336, 336, 336, 336, 342, 336, 343, + 168, 168, 168, 168, 344, 26, 168, 168, 295, 345, 168, 168, 168, 168, 168, 344, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 346, 26, 26, 26, 26, + 347, 26, 348, 349, 25, 25, 350, 351, 352, 25, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 353, 26, 354, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 355, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 356, 31, 31, 31, 31, 31, 31, 357, 26, 26, 26, 26, 31, 31, + 9, 9, 0, 313, 9, 358, 0, 0, 0, 0, 359, 0, 257, 280, 360, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 361, + 362, 0, 0, 0, 1, 2, 2, 3, 1, 2, 2, 3, 363, 290, 289, 290, + 290, 290, 290, 364, 168, 168, 168, 295, 365, 365, 365, 366, 257, 257, 26, 367, + 368, 369, 368, 368, 370, 368, 368, 371, 368, 372, 368, 372, 26, 26, 26, 26, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 373, + 374, 0, 0, 0, 0, 0, 375, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 252, 0, 376, 377, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 378, + 379, 379, 379, 380, 381, 381, 381, 381, 381, 381, 382, 26, 383, 0, 0, 280, + 384, 384, 384, 384, 385, 386, 387, 387, 387, 388, 389, 389, 389, 389, 389, 390, + 391, 391, 391, 392, 393, 393, 393, 393, 394, 393, 395, 26, 26, 26, 26, 26, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, + 398, 398, 398, 399, 398, 400, 401, 401, 401, 401, 402, 401, 401, 401, 401, 402, + 403, 403, 403, 403, 403, 26, 404, 404, 404, 404, 404, 404, 405, 406, 407, 408, + 407, 408, 409, 407, 410, 407, 410, 411, 26, 26, 26, 26, 26, 26, 26, 26, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 413, 26, 412, 412, 414, 26, 412, 26, 26, 26, + 415, 2, 2, 2, 2, 2, 416, 307, 26, 26, 26, 26, 26, 26, 26, 26, + 417, 418, 419, 419, 419, 419, 420, 421, 422, 422, 423, 422, 424, 424, 424, 424, + 425, 425, 425, 426, 427, 425, 26, 26, 26, 26, 26, 26, 428, 428, 429, 430, + 431, 431, 431, 432, 433, 433, 433, 434, 26, 26, 26, 26, 26, 26, 26, 26, + 435, 435, 435, 435, 436, 436, 436, 437, 436, 436, 438, 436, 436, 436, 436, 436, + 439, 440, 441, 442, 443, 443, 444, 445, 443, 446, 443, 446, 447, 447, 447, 447, + 448, 448, 448, 448, 26, 26, 26, 26, 449, 449, 449, 449, 450, 451, 450, 26, + 452, 452, 452, 452, 452, 452, 453, 454, 455, 455, 456, 455, 457, 457, 458, 457, + 459, 459, 460, 461, 26, 462, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 464, 26, 26, 26, 26, 26, 26, + 465, 465, 465, 465, 465, 465, 466, 26, 465, 465, 465, 465, 465, 465, 466, 467, + 468, 468, 468, 468, 468, 26, 468, 469, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 31, 31, 31, 50, + 470, 470, 470, 470, 470, 471, 472, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 473, 473, 473, 473, 473, 26, 474, 474, 474, 474, 474, 475, 26, 26, 476, 476, + 476, 477, 26, 26, 26, 26, 478, 478, 478, 479, 26, 26, 480, 480, 481, 26, + 482, 482, 482, 482, 482, 482, 482, 482, 482, 483, 484, 482, 482, 482, 483, 485, + 486, 486, 486, 486, 486, 486, 486, 486, 487, 488, 489, 489, 489, 490, 489, 491, + 492, 492, 492, 492, 492, 492, 493, 492, 492, 26, 494, 494, 494, 494, 495, 26, + 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 497, 137, 498, 26, + 499, 499, 500, 499, 499, 499, 499, 501, 26, 26, 26, 26, 26, 26, 26, 26, + 502, 503, 504, 505, 504, 506, 507, 507, 507, 507, 507, 507, 507, 508, 507, 509, + 510, 511, 512, 513, 513, 514, 515, 516, 511, 517, 518, 519, 520, 521, 521, 26, + 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 524, 26, 26, 26, + 525, 525, 525, 525, 525, 525, 525, 525, 525, 26, 525, 526, 26, 26, 26, 26, + 527, 527, 527, 527, 527, 527, 528, 527, 527, 527, 527, 528, 26, 26, 26, 26, + 529, 529, 529, 529, 529, 529, 529, 529, 530, 26, 529, 531, 197, 532, 26, 26, + 533, 533, 533, 533, 533, 533, 533, 534, 533, 534, 26, 26, 26, 26, 26, 26, + 535, 535, 535, 536, 535, 537, 535, 535, 538, 26, 26, 26, 26, 26, 26, 26, + 539, 539, 539, 539, 539, 539, 539, 540, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 542, 543, + 544, 545, 546, 547, 547, 547, 548, 549, 544, 26, 547, 550, 26, 26, 26, 26, + 26, 26, 26, 26, 551, 552, 551, 551, 551, 551, 551, 552, 553, 26, 26, 26, + 554, 554, 554, 554, 554, 554, 554, 554, 554, 26, 555, 555, 555, 555, 555, 555, + 555, 555, 555, 555, 556, 26, 177, 177, 557, 557, 557, 557, 557, 557, 557, 558, + 559, 560, 559, 559, 559, 559, 561, 559, 562, 26, 559, 559, 559, 563, 564, 564, + 564, 564, 565, 564, 564, 566, 567, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 568, 569, 570, 570, 570, 570, 568, 571, 570, 26, 570, 572, 573, 574, 575, 575, + 575, 576, 577, 578, 575, 579, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 580, 580, 580, 581, + 26, 26, 26, 26, 26, 26, 582, 26, 108, 108, 108, 108, 108, 108, 583, 584, + 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, 585, 586, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 587, 588, 26, + 585, 585, 585, 585, 585, 585, 585, 585, 589, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 591, 26, + 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 593, 592, 594, 26, 26, 26, 26, 26, 26, 26, 26, + 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, + 595, 595, 595, 595, 595, 595, 595, 595, 596, 26, 26, 26, 26, 26, 26, 26, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 597, 598, 598, 598, 599, 598, 600, 601, 601, + 601, 601, 601, 601, 601, 601, 601, 602, 601, 603, 604, 604, 604, 605, 605, 26, + 606, 606, 606, 606, 606, 606, 606, 606, 607, 26, 606, 608, 608, 606, 606, 609, + 606, 606, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 610, 610, 610, 610, 610, 610, 610, 610, + 610, 610, 610, 611, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 612, 612, 612, 612, 612, 612, 612, 612, 612, 613, 612, 612, 612, 612, 612, 612, + 612, 614, 612, 612, 26, 26, 26, 26, 26, 26, 26, 26, 615, 26, 346, 26, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, + 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 26, + 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, + 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 618, 26, 26, 26, 26, 26, + 616, 619, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 620, 621, + 622, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 623, 26, 26, 26, 26, 26, 624, 26, 625, 26, 626, 626, + 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, + 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 627, + 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 629, 628, 630, + 628, 631, 628, 632, 280, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 9, 9, 9, 9, 9, 633, 9, 9, 220, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 26, + 0, 0, 0, 0, 257, 362, 0, 0, 0, 0, 0, 0, 634, 635, 0, 636, + 637, 638, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, 0, 265, 26, 26, + 14, 14, 14, 14, 14, 14, 14, 14, 246, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 280, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 26, 0, 0, 0, 259, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 254, 640, 641, 0, 642, 643, 0, 0, 0, 0, 0, 0, 0, + 268, 644, 254, 254, 0, 0, 0, 645, 646, 647, 648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, 0, 0, 0, 0, 0, 0, + 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, + 649, 650, 26, 651, 652, 649, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 2, 2, 2, 347, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 653, 269, 269, 654, 655, 656, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 657, 657, 657, 657, 657, 658, 657, 659, 657, 660, 26, 26, 26, 26, 26, 26, + 26, 26, 661, 661, 661, 662, 26, 26, 663, 663, 663, 663, 663, 663, 663, 664, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 171, 665, 169, 171, + 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, + 666, 666, 666, 666, 666, 666, 666, 666, 667, 666, 668, 26, 26, 26, 26, 26, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 670, 669, 671, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 362, 0, + 0, 0, 0, 0, 0, 0, 376, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 362, 0, 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 26, 26, + 672, 31, 31, 31, 673, 674, 675, 676, 677, 678, 673, 679, 673, 675, 675, 680, + 31, 681, 31, 682, 683, 681, 31, 682, 26, 26, 26, 26, 26, 26, 51, 26, + 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 280, 26, 0, 257, 362, 0, 362, 0, 362, 0, 0, 0, 275, 26, + 0, 0, 0, 0, 0, 275, 26, 26, 26, 26, 26, 26, 684, 0, 0, 0, + 685, 26, 0, 0, 0, 0, 0, 280, 0, 259, 313, 26, 275, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 376, 0, 376, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 0, 280, 259, 26, + 0, 280, 0, 0, 0, 0, 0, 0, 0, 26, 0, 313, 0, 0, 0, 0, + 0, 26, 0, 0, 0, 275, 313, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 280, 26, 0, 275, 376, 376, + 257, 26, 0, 0, 0, 376, 0, 265, 275, 26, 0, 313, 0, 26, 257, 26, + 0, 0, 359, 0, 0, 0, 0, 0, 0, 265, 26, 26, 26, 26, 0, 313, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 26, 26, 26, 26, + 276, 276, 276, 276, 276, 276, 276, 687, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 279, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 346, 26, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 687, 26, 26, 26, + 276, 276, 276, 279, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 688, 26, 26, 26, 26, 26, 26, + 689, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, + 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0, + 1124,1125,1126,1127,1131,1133, 0,1147,1154,1155,1156,1161,1187,1188,1189,1193, + 0,1219,1226,1227,1228,1229,1233, 0, 0,1267,1268,1269,1273,1298, 0,1303, + 943,1128, 944,1129, 954,1139, 958,1143, 959,1144, 960,1145, 961,1146, 964,1149, + 0, 0, 973,1158, 974,1159, 975,1160, 983,1168, 978,1163, 988,1173, 990,1175, + 991,1176, 993,1178, 994,1179, 0, 0,1004,1190,1005,1191,1006,1192,1014,1199, + 1007, 0, 0, 0,1016,1201,1020,1206, 0,1022,1208,1025,1211,1023,1209, 0, + 0, 0, 0,1032,1218,1037,1223,1035,1221, 0, 0, 0,1044,1230,1045,1231, + 1049,1235, 0, 0,1058,1244,1064,1250,1060,1246,1066,1252,1067,1253,1072,1258, + 1069,1255,1077,1264,1074,1261, 0, 0,1083,1270,1084,1271,1085,1272,1088,1275, + 1089,1276,1096,1283,1103,1290,1111,1299,1115,1118,1307,1120,1309,1121,1310, 0, + 1053,1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1093, + 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 949,1134,1010, + 1195,1050,1236,1090,1277,1341,1368,1340,1367,1342,1369,1339,1366, 0,1320,1347, + 1418,1419,1323,1350, 0, 0, 992,1177,1018,1204,1055,1241,1416,1417,1415,1424, + 1202, 0, 0, 0, 987,1172, 0, 0,1031,1217,1321,1348,1322,1349,1338,1365, + 950,1135, 951,1136, 979,1164, 980,1165,1011,1196,1012,1197,1051,1237,1052,1238, + 1061,1247,1062,1248,1091,1278,1092,1279,1071,1257,1076,1263, 0, 0, 997,1182, + 0, 0, 0, 0, 0, 0, 945,1130, 982,1167,1337,1364,1335,1362,1046,1232, + 1422,1423,1113,1301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 10,1425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0,1314,1427, 5,1434,1438,1443, 0,1450, 0,1455,1461, + 1514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1446,1458,1468,1476,1480,1486, + 1517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1489,1503,1494,1500,1508, 0, + 0, 0, 0,1520,1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1526,1528, 0,1525, 0, 0, 0,1522, 0, 0, 0, 0,1536,1532,1539, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1534, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1556, 0, 0, 0, 0, 0, 0, + 1548,1550, 0,1547, 0, 0, 0,1567, 0, 0, 0, 0,1558,1554,1561, 0, + 0, 0, 0, 0, 0, 0,1568,1569, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1529,1551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1523,1545,1524,1546, 0, 0,1527,1549, 0, 0,1570,1571,1530,1552,1531,1553, + 0, 0,1533,1555,1535,1557,1537,1559, 0, 0,1572,1573,1544,1566,1538,1560, + 1540,1562,1541,1563,1542,1564, 0, 0,1543,1565, 0, 0, 0, 0, 0, 0, + 0, 0,1606,1607,1609,1608,1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1613, 0,1611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1620, 0, 0, 0, 0, 0, 0, + 0,1623, 0, 0,1624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1614,1615,1616,1617,1618,1619,1621,1622, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1628,1629, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1625,1626, 0,1627, + 0, 0, 0,1634, 0, 0,1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1630,1631,1632, 0, 0,1633, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1639, 0, 0,1638,1640, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1636,1637, 0, 0, + 0, 0, 0, 0,1641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1642,1644,1643, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1645, 0, 0, 0, 0, 0, 0, 0, + 1646, 0, 0, 0, 0, 0, 0,1648,1649, 0,1647,1650, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1651,1653,1652, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1654, 0,1655,1657,1656, 0, + 0, 0, 0,1659, 0, 0, 0, 0, 0, 0, 0, 0, 0,1660, 0, 0, + 0, 0,1661, 0, 0, 0, 0,1662, 0, 0, 0, 0,1663, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1658, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1664, 0,1665,1673, 0,1674, 0, 0, 0, 0, 0, 0, 0, + 0,1666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,1668, 0, 0, 0, 0, 0, 0, 0, 0, 0,1669, 0, 0, + 0, 0,1670, 0, 0, 0, 0,1671, 0, 0, 0, 0,1672, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,1667, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1675, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0,1676, 0,1677, 0,1678, 0,1679, 0,1680, 0, + 0, 0,1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1682, 0,1683, 0, 0, + 1684,1685, 0,1686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 953,1138, 955,1140, 956,1141, 957,1142,1324,1351, 963,1148, 965,1150, 968,1153, + 966,1151, 967,1152,1378,1380,1379,1381, 984,1169, 985,1170,1420,1421, 986,1171, + 989,1174, 995,1180, 998,1183, 996,1181, 999,1184,1000,1185,1015,1200,1329,1356, + 1017,1203,1019,1205,1021,1207,1024,1210,1687,1688,1027,1213,1026,1212,1028,1214, + 1029,1215,1030,1216,1034,1220,1036,1222,1039,1225,1038,1224,1334,1361,1336,1363, + 1382,1384,1383,1385,1056,1242,1057,1243,1059,1245,1063,1249,1689,1690,1065,1251, + 1068,1254,1070,1256,1386,1387,1388,1389,1691,1692,1073,1259,1075,1262,1079,1266, + 1078,1265,1095,1282,1098,1285,1097,1284,1390,1391,1392,1393,1099,1286,1100,1287, + 1101,1288,1102,1289,1105,1292,1104,1291,1106,1294,1107,1295,1108,1296,1114,1302, + 1119,1308,1122,1311,1123,1312,1186,1260,1293,1305, 0,1394, 0, 0, 0, 0, + 952,1137, 947,1132,1317,1344,1316,1343,1319,1346,1318,1345,1693,1695,1371,1375, + 1370,1374,1373,1377,1372,1376,1694,1696, 981,1166, 977,1162, 972,1157,1326,1353, + 1325,1352,1328,1355,1327,1354,1697,1698,1009,1194,1013,1198,1054,1240,1048,1234, + 1331,1358,1330,1357,1333,1360,1332,1359,1699,1700,1396,1401,1395,1400,1398,1403, + 1397,1402,1399,1404,1094,1281,1087,1274,1406,1411,1405,1410,1408,1413,1407,1412, + 1409,1414,1109,1297,1117,1306,1116,1304,1112,1300, 0, 0, 0, 0, 0, 0, + 1471,1472,1701,1705,1702,1706,1703,1707,1430,1431,1715,1719,1716,1720,1717,1721, + 1477,1478,1729,1731,1730,1732, 0, 0,1435,1436,1733,1735,1734,1736, 0, 0, + 1481,1482,1737,1741,1738,1742,1739,1743,1439,1440,1751,1755,1752,1756,1753,1757, + 1490,1491,1765,1768,1766,1769,1767,1770,1447,1448,1771,1774,1772,1775,1773,1776, + 1495,1496,1777,1779,1778,1780, 0, 0,1451,1452,1781,1783,1782,1784, 0, 0, + 1504,1505,1785,1788,1786,1789,1787,1790, 0,1459, 0,1791, 0,1792, 0,1793, + 1509,1510,1794,1798,1795,1799,1796,1800,1462,1463,1808,1812,1809,1813,1810,1814, + 1467, 21,1475, 22,1479, 23,1485, 24,1493, 27,1499, 28,1507, 29, 0, 0, + 1704,1708,1709,1710,1711,1712,1713,1714,1718,1722,1723,1724,1725,1726,1727,1728, + 1740,1744,1745,1746,1747,1748,1749,1750,1754,1758,1759,1760,1761,1762,1763,1764, + 1797,1801,1802,1803,1804,1805,1806,1807,1811,1815,1816,1817,1818,1819,1820,1821, + 1470,1469,1822,1474,1465, 0,1473,1825,1429,1428,1426, 12,1432, 0, 26, 0, + 0,1315,1823,1484,1466, 0,1483,1829,1433, 13,1437, 14,1441,1826,1827,1828, + 1488,1487,1513, 19, 0, 0,1492,1515,1445,1444,1442, 15, 0,1831,1832,1833, + 1502,1501,1516, 25,1497,1498,1506,1518,1457,1456,1454, 17,1453,1313, 11, 3, + 0, 0,1824,1512,1519, 0,1511,1830,1449, 16,1460, 18,1464, 4, 0, 0, + 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1834,1835, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1836, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1837,1839,1838, + 0, 0, 0, 0,1840, 0, 0, 0, 0,1841, 0, 0,1842, 0, 0, 0, + 0, 0, 0, 0,1843, 0,1844, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,1845, 0, 0,1846, 0, 0,1847, 0,1848, 0, 0, 0, 0, 0, 0, + 937, 0,1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1849, 936, 938, + 1851,1852, 0, 0,1853,1854, 0, 0,1855,1856, 0, 0, 0, 0, 0, 0, + 1857,1858, 0, 0,1861,1862, 0, 0,1863,1864, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1867,1868,1869,1870, + 1859,1860,1865,1866, 0, 0, 0, 0, 0, 0,1871,1872,1873,1874, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1875, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1877, 0,1878, 0, + 1879, 0,1880, 0,1881, 0,1882, 0,1883, 0,1884, 0,1885, 0,1886, 0, + 1887, 0,1888, 0, 0,1889, 0,1890, 0,1891, 0, 0, 0, 0, 0, 0, + 1892,1893, 0,1894,1895, 0,1896,1897, 0,1898,1899, 0,1900,1901, 0, 0, + 0, 0, 0, 0,1876, 0, 0, 0, 0, 0, 0, 0, 0, 0,1902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1904, 0,1905, 0, + 1906, 0,1907, 0,1908, 0,1909, 0,1910, 0,1911, 0,1912, 0,1913, 0, + 1914, 0,1915, 0, 0,1916, 0,1917, 0,1918, 0, 0, 0, 0, 0, 0, + 1919,1920, 0,1921,1922, 0,1923,1924, 0,1925,1926, 0,1927,1928, 0, 0, + 0, 0, 0, 0,1903, 0, 0,1929,1930,1931,1932, 0, 0, 0,1933, 0, + 710, 385, 724, 715, 455, 103, 186, 825, 825, 242, 751, 205, 241, 336, 524, 601, + 663, 676, 688, 738, 411, 434, 474, 500, 649, 746, 799, 108, 180, 416, 482, 662, + 810, 275, 462, 658, 692, 344, 618, 679, 293, 388, 440, 492, 740, 116, 146, 168, + 368, 414, 481, 527, 606, 660, 665, 722, 781, 803, 809, 538, 553, 588, 642, 758, + 811, 701, 233, 299, 573, 612, 487, 540, 714, 779, 232, 267, 412, 445, 457, 585, + 594, 766, 167, 613, 149, 148, 560, 589, 648, 768, 708, 345, 411, 704, 105, 259, + 313, 496, 518, 174, 542, 120, 307, 101, 430, 372, 584, 183, 228, 529, 650, 697, + 424, 732, 428, 349, 632, 355, 517, 110, 135, 147, 403, 580, 624, 700, 750, 170, + 193, 245, 297, 374, 463, 543, 763, 801, 812, 815, 162, 384, 420, 730, 287, 330, + 337, 366, 459, 476, 509, 558, 591, 610, 726, 652, 734, 759, 154, 163, 198, 473, + 683, 697, 292, 311, 353, 423, 572, 494, 113, 217, 259, 280, 314, 499, 506, 603, + 608, 752, 778, 782, 788, 117, 557, 748, 774, 320, 109, 126, 260, 265, 373, 411, + 479, 523, 655, 737, 823, 380, 765, 161, 395, 398, 438, 451, 502, 516, 537, 583, + 791, 136, 340, 769, 122, 273, 446, 727, 305, 322, 400, 496, 771, 155, 190, 269, + 377, 391, 406, 432, 501, 519, 599, 684, 687, 749, 776, 175, 452, 191, 480, 510, + 659, 772, 805, 813, 397, 444, 619, 566, 568, 575, 491, 471, 707, 111, 636, 156, + 153, 288, 346, 578, 256, 435, 383, 729, 680, 767, 694, 295, 128, 210, 0, 0, + 227, 0, 379, 0, 0, 150, 493, 525, 544, 551, 552, 556, 783, 576, 604, 0, + 661, 0, 703, 0, 0, 735, 743, 0, 0, 0, 793, 794, 795, 808, 741, 773, + 118, 127, 130, 166, 169, 177, 207, 213, 215, 226, 229, 268, 270, 317, 327, 329, + 335, 369, 375, 381, 404, 441, 448, 458, 477, 484, 503, 539, 545, 547, 546, 548, + 549, 550, 554, 555, 561, 564, 569, 591, 593, 595, 598, 607, 620, 625, 625, 651, + 690, 695, 705, 706, 716, 717, 733, 735, 777, 786, 790, 315, 869, 623, 0, 0, + 102, 145, 134, 115, 129, 138, 165, 171, 207, 202, 206, 212, 227, 231, 240, 243, + 250, 254, 294, 296, 303, 308, 319, 325, 321, 329, 326, 335, 341, 357, 360, 362, + 370, 379, 388, 389, 393, 421, 424, 438, 456, 454, 458, 465, 477, 535, 485, 490, + 493, 507, 512, 514, 521, 522, 525, 526, 528, 533, 532, 541, 565, 569, 574, 586, + 591, 597, 607, 637, 647, 674, 691, 693, 695, 698, 703, 699, 705, 704, 702, 706, + 709, 717, 728, 736, 747, 754, 770, 777, 783, 784, 786, 787, 790, 802, 825, 848, + 847, 857, 55, 65, 66, 883, 892, 916, 822, 824, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1586, 0,1605, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1602,1603,1934,1935,1574,1575, + 1576,1577,1579,1580,1581,1583,1584, 0,1585,1587,1588,1589,1591, 0,1592, 0, + 1593,1594, 0,1595,1596, 0,1598,1599,1600,1601,1604,1582,1578,1590,1597, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1936, 0,1937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1938, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1939,1940, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1941,1942, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1944,1943, 0,1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1946,1947, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0,1948, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1949,1950, + 1951,1952,1953,1954,1955, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,1956,1957,1958,1960,1959, + 1961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 106, 104, 107, 826, 114, 118, 119, 121, 123, 124, 127, 125, 34, 830, 130, 131, + 132, 137, 827, 35, 133, 139, 829, 142, 143, 112, 144, 145, 924, 151, 152, 37, + 157, 158, 159, 160, 38, 165, 166, 169, 171, 172, 173, 174, 176, 177, 178, 179, + 181, 182, 182, 182, 833, 468, 184, 185, 834, 187, 188, 189, 196, 192, 194, 195, + 197, 199, 200, 201, 203, 204, 204, 206, 208, 209, 211, 218, 213, 219, 214, 216, + 153, 234, 221, 222, 223, 220, 225, 224, 230, 835, 235, 236, 237, 238, 239, 244, + 836, 837, 247, 248, 249, 246, 251, 39, 40, 253, 255, 255, 838, 257, 258, 259, + 261, 839, 262, 263, 301, 264, 41, 266, 270, 272, 271, 841, 274, 842, 277, 276, + 278, 281, 282, 42, 283, 284, 285, 286, 43, 843, 44, 289, 290, 291, 293, 934, + 298, 845, 845, 621, 300, 300, 45, 852, 894, 302, 304, 46, 306, 309, 310, 312, + 316, 48, 47, 317, 846, 318, 323, 324, 325, 324, 328, 329, 333, 331, 332, 334, + 335, 336, 338, 339, 342, 343, 347, 351, 849, 350, 348, 352, 354, 359, 850, 361, + 358, 356, 49, 363, 365, 367, 364, 50, 369, 371, 851, 376, 386, 378, 53, 381, + 52, 51, 140, 141, 387, 382, 614, 78, 388, 389, 390, 394, 392, 856, 54, 399, + 396, 402, 404, 858, 405, 401, 407, 55, 408, 409, 410, 413, 859, 415, 56, 417, + 860, 418, 57, 419, 422, 424, 425, 861, 840, 862, 426, 863, 429, 431, 427, 433, + 437, 441, 438, 439, 442, 443, 864, 436, 449, 450, 58, 454, 453, 865, 447, 460, + 866, 867, 461, 466, 465, 464, 59, 467, 470, 469, 472, 828, 475, 868, 478, 870, + 483, 485, 486, 871, 488, 489, 872, 873, 495, 497, 60, 498, 61, 61, 504, 505, + 507, 508, 511, 62, 513, 874, 515, 875, 518, 844, 520, 876, 877, 878, 63, 64, + 528, 880, 879, 881, 882, 530, 531, 531, 533, 66, 534, 67, 68, 884, 536, 538, + 541, 69, 885, 549, 886, 887, 556, 559, 70, 561, 562, 563, 888, 889, 889, 567, + 71, 890, 570, 571, 72, 891, 577, 73, 581, 579, 582, 893, 587, 74, 590, 592, + 596, 75, 895, 896, 76, 897, 600, 898, 602, 605, 607, 899, 900, 609, 901, 611, + 853, 77, 615, 616, 79, 617, 252, 902, 903, 854, 855, 621, 622, 731, 80, 627, + 626, 628, 164, 629, 630, 631, 633, 904, 632, 634, 639, 640, 635, 641, 646, 651, + 638, 643, 644, 645, 905, 907, 906, 81, 653, 654, 656, 911, 657, 908, 82, 83, + 909, 910, 84, 664, 665, 666, 667, 669, 668, 671, 670, 674, 672, 673, 675, 85, + 677, 678, 86, 681, 682, 912, 685, 686, 87, 689, 36, 913, 914, 88, 89, 696, + 702, 709, 711, 915, 712, 713, 718, 719, 917, 831, 721, 720, 723, 832, 725, 728, + 918, 919, 739, 742, 744, 920, 745, 753, 756, 757, 755, 760, 761, 921, 762, 90, + 764, 922, 91, 775, 279, 780, 923, 925, 92, 93, 785, 926, 94, 927, 787, 787, + 789, 928, 792, 95, 796, 797, 798, 800, 96, 929, 802, 804, 806, 97, 98, 807, + 930, 99, 931, 932, 933, 814, 100, 816, 817, 818, 819, 820, 821, 935, 0, 0, +}; +static const int16_t +_hb_ucd_i16[196] = +{ + 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, + 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, + 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, + -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, + 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, + 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, + 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, + 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, + -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, + 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, + -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, + -1, 0, 1, -1, +}; + +static inline uint_fast8_t +_hb_ucd_gc (unsigned u) +{ + return u<1114110u?_hb_ucd_u8[6664+(((_hb_ucd_u8[1296+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2; +} +static inline uint_fast8_t +_hb_ucd_ccc (unsigned u) +{ + return u<125259u?_hb_ucd_u8[8612+(((_hb_ucd_u8[8068+(((_hb_ucd_u8[7624+(((_hb_ucd_u8[7288+(((_hb_ucd_u8[7042+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; +} +static inline unsigned +_hb_ucd_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline int_fast16_t +_hb_ucd_bmg (unsigned u) +{ + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9356+(((_hb_ucd_u8[9236+(((_hb_ucd_b4(9108+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; +} +static inline uint_fast8_t +_hb_ucd_sc (unsigned u) +{ + return u<918000u?_hb_ucd_u8[10862+(((_hb_ucd_u16[2000+(((_hb_ucd_u8[10142+(((_hb_ucd_u8[9692+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; +} +static inline uint_fast16_t +_hb_ucd_dm (unsigned u) +{ + return u<195102u?_hb_ucd_u16[5888+(((_hb_ucd_u8[16764+(((_hb_ucd_u8[16382+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; +} + + #else static const uint8_t -_hb_ucd_u8[13602] = +_hb_ucd_u8[13246] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 7, 11, 12, 12, 12, 13, @@ -6146,331 +5025,309 @@ _hb_ucd_u8[13602] = 220, 0, 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216, - 216, 0,220,220,220, 0,230,230, 7, 0, 16, 17, 17, 17, 17, 17, - 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113,129,169, - 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 216, 0,220,220,220, 0,230,230, 7, 0, 16, 17, 17, 33, 17, 49, + 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17,177, 0, 1, 2, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, + 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, 3, 3, + 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3, 3, 14, + 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21, 3, 3, + 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3, 3, 3, + 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0, 17, 18, + 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19, 19, 28, + 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 19, + 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39, 40, 19, + 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0, 0, 32, + 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47, 48, 49, + 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0, 0, 0, + 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57, 0, 0, + 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59, 14, 0, + 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60, 61, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, 0, 4, + 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, 0, 8, + 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, 0, 0, + 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, 0, 18, + 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, 0, 1, + 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, 1, 0, + 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, 1, 1, + 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, 0, 1, + 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, 9, 36, + 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, 21, 21, + 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, 0, 0, + 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, 8, 9, + 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1, 8, 21, + 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 3, 3, 3, 3, 3, 3, + 3, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, 0, 3, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, - 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, - 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, - 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, - 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, - 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, - 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, - 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, - 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, - 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, - 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, - 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, - 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, - 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 11, 12, 12, 12, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 12, 21, 12, 12, 12, 12, 22, - 23, 23, 23, 24, 12, 12, 12, 25, 26, 27, 12, 28, 29, 30, 31, 32, - 33, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, - 12, 36, 7, 7, 37, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 38, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 32, 33, 33, 33, 34, 35, 35, 35, 35, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 2, 2, 51, 51, 52, 53, 54, 55, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 57, 57, 56, 56, 56, 56, 56, 56, 58, 59, 60, 61, - 56, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 56, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, - 62, 62, 62, 62, 72, 72, 72, 72, 72, 72, 72, 72, 72, 73, 74, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 62, 62, 62, 62, 88, 89, 89, 89, 90, 89, - 91, 92, 93, 94, 95, 95, 96, 97, 87, 98, 99,100,101,102,103,104, - 105,105,105, 2,106,107,108,109,110,111,112,113,114,115,116, 87, - 89,117,118,119,120,121,122,123,124,125,126, 87,127,128, 87,129, - 130,131,132, 87,133,134,135,136,137,138, 87, 87,139,140,141,142, - 87,143, 87,144,145,145,145,145,145,145,145,145,145,145,145, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87,146,147,147,147,147,147,147,147,147,147, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,148,148,148,148, - 148, 87, 87, 87,149,149,149,149,150,151,152,152, 87, 87, 87, 87, - 153,153,154,155,156,156,156,156,156,156,156,156,156,156,156,156, - 156,156,156,156,156,156,156,156,156,156,157,157,157,157,156, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87,158,159,160,161,162,162,162, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,163,164, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87,165, 56, 56, 56,166,167, 51, 56, 56, 87, 56, 56, 56, 56, - 56, 56, 56, 56,168,168,168,168,168,168, 87, 87, 87, 87, 87, 87, - 87, 87, 2, 87,169, 87,170, 87, 87,171, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 33,172,172,173, 87, 87, 87, 87, 87, 56, 56, 56, 87, - 89, 89, 87, 87, 56, 56, 56, 56,174, 87, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 87, 87, 87, 87, - 87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87, - 87, 87, 87, 87, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 62, 62, 62, 62, 62, 62, 62, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 56, 87,175,175, 0, 1, 2, 2, 0, 1, 2, 2, - 2, 3, 4, 5, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, - 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, - 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, - 11, 11, 12, 11, 13, 13, 13, 13, 13, 13, 13, 13, 14, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, 16, 17, 18, 18, - 18, 18, 18, 18, 19, 20, 21, 21, 22, 23, 21, 24, 21, 21, 21, 21, - 21, 25, 21, 21, 26, 26, 26, 26, 26, 21, 21, 21, 27, 27, 27, 27, - 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 21, 21, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, + 18, 17, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 24, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 25, 25, 26, 27, + 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 31, + 31, 31, 31, 54, 55, 55, 56, 31, 31, 31, 31, 31, 31, 31, 57, 58, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 59, 60, 31, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 63, 64, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 65, 66, 67, 31, 31, 31, 31, 68, 31, 31, 31, 31, 31, + 31, 31, 31, 69, 70, 71, 17, 17, 72, 73, 31, 74, 75, 76, 31, 77, + 78, 31, 79, 80, 17, 81, 17, 17, 17, 17, 31, 31, 23, 23, 23, 23, + 23, 23, 31, 31, 31, 31, 31, 31, 23, 82, 31, 31, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 83, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 84, 0, 0, 1, + 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, + 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 11, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 19, 27, + 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, + 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 42, 43, 44, 44, 45, 46, + 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 49, 50, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 51, + 60, 61, 62, 63, 64, 65, 66, 7, 67, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 7, 4, 4, 4, 4, 77, 77, 77, 77, 78, 79, 80, 81, + 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 85, 85, 85, + 0, 0, 0, 0, 86, 87, 88, 88, 89, 90, 48, 91, 0, 0, 92, 92, + 92, 92, 92, 93, 94, 95, 96, 97, 98, 47, 99,100,101,102, 0,103, + 104,105, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 0,106,106,106,106,106,106,106,106,106,106,106,107, + 108,108,108,108,108, 11,109,110,111, 4,112, 4,113,114,115,116, + 117,118,119,120,121,122,123,124,125,126, 50,127, 47, 47, 47, 47, + 47, 47, 47, 47,128,128,128,128,128,128,128,128,128,128,128,128, + 92, 92, 92, 92, 92, 92, 92, 92,129,130, 19, 19, 19, 19, 19, 19, + 131, 19, 19, 19,132,133, 19,134,135,136,137,101,138,138,138,138, + 0, 77,139,140,128,128,141,142,143,144,145,146,147,148,149,150, + 151,152,153,153,154,154,154,154,154,154, 4, 4,155,156,157,158, + 159,160,161,162,163,164,165,166,167,168,169,169,170,170,171,171, + 172,172,128,128, 19, 19,173,173,174,175,176,177,178,178,179,180, + 181,182,183,184,185,185,186,187,188,189,128,128,190,190,191,191, + 128,128,192,192,193,194,195,195,196,196,128,128,197,197,198,198, + 199,199,200,200,201,202,203,204,128,128,128,128,205,206,207,207, + 208,209,210,210,128,128,211,211,128,128,212, 34,213,213,213,213, + 213,213,213,213,213,213,213,213,213,213,128,128,128,128,128,128, + 128,128,214,214,215,215,215,215,215,215,215,215,215,215,128,128, + 128,128,128,128,216,216,216,216,216,216,216,216,216,216,128,128, + 128,128,128,128,110,110,110,110,110,110,110,110,110,217,218,219, + 220,220,220,220,221,221,221,221,222,222,222,223,224,224,224,224, + 224,224,224,224,224,224,224,224,225,225,225,225,225,225,225,225, + 224,224,128,128,128,128,128,128,128,128,104,104,226,227,227,227, + 228,229,230,230,230,230,230,230,128,128,128,128,231,231,232, 0, + 128,128,128,128,128,128,128,128, 7,233, 0, 0, 0, 0, 0, 0, + 0,234,235, 0, 77, 77, 0, 0, 0, 0,128,128,236,236,236,236, + 236,236,236,236,236,236,236,236,128,128,128,128,128,128,128,128, + 4, 4,128,128, 86, 86,128,128,237,237,128,128,128,128,238,239, + 128,128,128,128,128,128,128,128,128,128, 48, 48,240,240,240,240, + 241,241,128,128, 0, 0, 0, 0, 0, 0,128,128, 19, 19, 19, 19, + 128,128,128,128,242, 0,128,128, 0, 0, 0, 0, 92, 92,128,128, + 128,128,128,128, 92, 92, 92, 92, 92, 92,128,128, 0, 0,128,128, + 7, 7, 7, 7, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 3, 3, + 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 6, 0, 0, 7, 0, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 11, 11, 11, 11, 12, 11, + 13, 13, 13, 13, 14, 13, 13, 13, 13, 13, 13, 15, 16, 16, 16, 16, + 16, 17, 18, 18, 18, 18, 18, 18, 19, 20, 21, 21, 22, 23, 21, 24, + 21, 21, 21, 21, 21, 25, 21, 21, 26, 26, 26, 26, 26, 21, 21, 21, + 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 26, 21, 21, 21, 31, 21, 32, 32, 32, 32, 32, 33, 34, 32, 35, 35, 35, 35, - 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, - 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, - 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, - 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, - 43, 43, 43, 43, 44, 44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46, - 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 48, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, - 50, 50, 50, 51, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, + 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 45, 44, 44, 44, 44, 46, 46, 46, 46, 47, 47, 47, 47, + 47, 48, 47, 47, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, + 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 57, 57, 57, 57, 58, 57, 59, 59, 60, 61, - 62, 62, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 65, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 55, 55, 55, 55, 55, 67, 67, 67, 67, - 67, 68, 68, 68, 69, 69, 69, 69, 69, 69, 64, 64, 70, 70, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 8, 8, 8, 8, 8, 72, 72, 72, 72, + 62, 62, 63, 63, 64, 64, 64, 64, 65, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 55, 67, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, + 69, 69, 64, 64, 70, 70, 71, 71, 71, 71, 71, 71, 71, 71, 71, 8, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 13, 50, 50, 50, 73, 77, 78, 79, 4, 4, 80, 4, - 4, 81, 82, 83, 4, 4, 4, 84, 8, 8, 8, 8, 11, 11, 11, 11, - 11, 11, 11, 11, 85, 0, 0, 0, 0, 0, 0, 86, 0, 4, 0, 0, - 0, 8, 8, 8, 0, 0, 87, 88, 89, 0, 4, 4, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 4, 4, 92, 92, 92, 92, - 92, 92, 92, 92, 50, 50, 50, 93, 93, 93, 93, 93, 53, 53, 53, 53, - 53, 53, 13, 13, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 0, 95, 0, 96, 97, 98, 99, 99, 99, 99,100,101,102, - 102,102,102,103,104,104,104,105, 52, 52, 52, 52, 52, 0,104,104, - 0, 0, 0,102, 52, 52, 0, 0, 0, 0, 52,106, 0, 0, 0, 0, - 0,102,102,107,102,102,102,102,102,108, 0, 0, 94, 94, 94, 94, - 0, 0, 0, 0,109,109,109,109,109,109,109,109,109,109,109,109, - 109,110,110,110,111,111,111,111,111,111,111,111,111,111,111,111, - 13, 13, 13, 13, 13, 13,112,112,112,112,112,112, 0, 0,113, 4, - 4, 4, 4, 4,114, 4, 4, 4, 4, 4, 4, 4,115,115,115, 0, - 116,116,116,116,117,117,117,117,117,117, 32, 32,118,118,119,120, - 120,120, 52, 52,121,121,121,121,122,121, 49, 49,123,123,123,123, - 123,123, 49, 49,124,124,124,124,124,124,125,125, 53, 53, 53, 4, - 4,126,127, 54, 54, 54, 54, 54,125,125,125,125,128,128,128,128, - 128,128,128,128, 4,129, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21,130, 21, 21, 21, 21, 8, 0,131, 0, - 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21,132, 0, 0, 1, 2, - 1, 2,133,101,102,134, 52, 52, 52, 52, 0, 0,135,135,135,135, - 135,135,135,135, 0, 0, 0, 0, 11, 11, 11, 11, 11, 0, 11, 11, - 11, 0, 0,136,137,137,138,138,138,138,139, 0,140,140,140,141, - 141,142,142,142,143,143,144,144,144,144,144,144,145,145,145,145, - 145,146,146,146,147,147,147,148,148,148,148,148,149,149,149,150, - 150,150,150,151,151,151,151,151,151,151,151,151,152,152,152,152, - 152,152,152,152,153,153,153,153,154,154,155,155,156,156,156,156, - 156,156,157,157,158,158,159,159,159,159,159,159,160,160,161,161, - 161,161,161,161,162,162,162,162,162,162,163,163,164,164,164,164, - 165,165,165,165,166,166,166,166,167,167,168,168,169,169,169,169, - 169,169,169,169,170,170,170,170,170,170,170,170,171,171,171,171, - 171,171,171,171,172,172,172,172,172,172,172,172,173,173,173,173, - 173,173,173,173,174,174,174,175,175,175,175,176,176,176,176,177, - 177,177,178,178,179,179,179,179,179,179,179,179,180,180,180,180, - 180,181,181,181,182,182,182,182,182,183,183,183,184,184,184,184, - 184,184,185, 43,186,186,186,186,186,186,186,186,187,187,187,188, + 4, 81, 82, 83, 4, 4, 4, 84, 11, 11, 11, 11, 85, 0, 0, 0, + 0, 0, 0, 86, 0, 4, 0, 0, 0, 8, 8, 8, 0, 0, 87, 88, + 89, 0, 4, 4, 6, 0, 0, 0, 90, 90, 90, 90, 91, 91, 91, 91, + 91, 91, 4, 4, 92, 92, 92, 92, 50, 50, 50, 93, 93, 93, 93, 93, + 53, 53, 13, 13, 94, 94, 94, 94, 94, 94, 94, 0, 95, 0, 96, 97, + 98, 99, 99, 99, 99,100,101,102,102,102,102,103,104,104,104,105, + 52, 0,104,104, 0, 0, 0,102, 52, 52, 0, 0, 0, 0, 52,106, + 0,102,102,107,102,102,102,102,102,108, 0, 0,109,109,109,109, + 109,110,110,110,111,111,111,111, 13, 13,112,112,112,112,112,112, + 0, 0,113, 4,114, 4, 4, 4,115,115,115, 0,116,116,116,116, + 117,117,117,117,117,117, 32, 32,118,118,119,120,120,120, 52, 52, + 121,121,121,121,122,121, 49, 49,123,123,123,123,123,123, 49, 49, + 124,124,124,124,124,124,125,125, 53, 53, 53, 4, 4,126,127, 54, + 125,125,125,125,128,128,128,128, 4,129, 18, 18, 18, 21, 21, 21, + 21, 21, 21,130, 8, 0,131, 0, 0, 0, 0, 21, 21, 21, 21,132, + 0, 0, 1, 2, 1, 2,133,101,102,134, 52, 52,135,135,135,135, + 11, 0, 11, 11, 11, 0, 0,136,137,137,138,138,138,138,139, 0, + 140,140,140,141,141,142,142,142,143,143,144,144,144,144,144,144, + 145,145,145,145,145,146,146,146,147,147,147,148,148,148,148,148, + 149,149,149,150,150,150,150,151,151,151,151,151,152,152,152,152, + 153,153,153,153,154,154,155,155,156,156,156,156,156,156,157,157, + 158,158,159,159,159,159,159,159,160,160,161,161,161,161,161,161, + 162,162,162,162,162,162,163,163,164,164,164,164,165,165,165,165, + 166,166,166,166,167,167,168,168,169,169,169,169,170,170,170,170, + 171,171,171,171,172,172,172,172,173,173,173,173,174,174,174,175, + 175,175,175,176,176,176,176,177,177,177,178,178,179,179,179,179, + 180,180,180,180,180,181,181,181,182,182,182,182,182,183,183,183, + 184,184,184,184,184,184,185, 43,186,186,186,186,187,187,187,188, 188,188,188,188,189,189,189,190,189,189,189,189,191,191,191,191, - 191,191,191,191,192,192,192,192,192,192,192,192,193,193,193,193, - 193,193,193,193,194,194,194,194,194,194, 66, 66,195,195,195,195, - 195,195,195,195,196,196,196,196,196,196,196,196,197,197,197,197, - 197,197,197,197,198,198,198,198,198,198,198,198,199,199,199,199, - 199,199,199,199,200,200,200,200,200,200,200,200,201,201,201,201, - 201,202,202,202,202,202,202, 55,203,203,203,203,204,204,204,204, - 204,204,204,205,205,205,205,205,205,205,205,205,206,206,206,206, - 206,206,207,207,207,207,207,207,207,207,207,207,208,208,208,208, - 208,208,208,208,110,110,110,110, 39, 39, 39, 39,209,209,209,209, - 209,209,209,209,210,210,210,210,210,210,210,210,211,211,211,211, - 211,211,211,211,212,212,212,212,212,212,212,212,112,112,112,112, - 112,112,112,112,112,112,112,112,213,213,213,214,214,214,214,214, - 214,215,215,215,216,216,216,216,216,216,216,216,217,217,217,217, - 217,217,217,217,218,218,218,218,218,218,218,218,218,218,218,218, - 218,218,219, 94,220,220,220,220,220,220,220,220,221,221,221,221, - 221,221,221,221,102,102,102,102,102,102,102,102,222, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99,102,102, - 102, 99,223,224,224,224,224,224,224,224,224,224,225,225,225,225, - 225,225,225,225,225,225, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,226,227,228, 0,229, 0, - 0, 0, 0, 0,230,230,230,230,230,230,230,230, 91, 91, 91, 91, - 91, 91, 91, 91,231,231,231,231,231,231,231,231,232,232,232,232, - 233,233,233,233,234,234,234,234,234,234,234,234,235,235,235,235, - 235,235,235,235,236, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, - 8, 8, 8, 8, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, - 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, - 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, - 8, 8, 8, 8, 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14, - 16, 17, 17, 17, 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19, - 20, 21, 20, 22, 20, 20, 23, 23, 20, 20, 20, 20, 22, 20, 24, 7, - 7, 25, 20, 20, 26, 20, 20, 20, 20, 20, 20, 21, 27, 27, 27, 27, - 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, - 32, 20, 20, 20, 33, 33, 33, 33, 34, 35, 33, 33, 33, 36, 33, 33, - 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, - 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, - 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 48, 48, 48, 48, - 49, 49, 49, 49, 49, 50, 51, 49, 52, 52, 52, 52, 53, 53, 53, 53, - 53, 53, 54, 53, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, - 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 62, - 63, 63, 63, 63, 64, 64, 64, 64, 64, 65, 0, 0, 66, 66, 66, 66, - 67, 67, 67, 67, 68, 68, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71, - 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, - 76, 76, 76, 76, 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, - 80, 80, 80, 80, 81, 81, 81, 81, 82, 7, 7, 7, 83, 7, 84, 85, - 0, 84, 86, 0, 2, 87, 88, 2, 2, 2, 2, 89, 90, 87, 91, 2, - 2, 2, 92, 2, 2, 2, 2, 93, 0, 0, 0, 86, 1, 0, 0, 94, - 0, 95, 96, 0, 4, 0, 0, 0, 0, 0, 0, 4, 97, 97, 97, 97, - 98, 98, 98, 98, 13, 13, 13, 13, 99, 99, 99, 99,100,100,100,100, - 0,101, 0, 0,102,100,103,104, 0, 0,100, 0,105,106,106,106, - 106,106,106,106,106,106,107,105,108,109,109,109,109,109,109,109, - 109,109,110,108,111,111,111,111,112, 55, 55, 55, 55, 55, 55,113, - 109,109,109,110,109,109, 0, 0,114,114,114,114,115,115,115,115, - 116,116,116,116,117,117,117,117, 96, 2, 2, 2, 2, 2, 94, 2, - 118,118,118,118,119,119,119,119,120,120,120,120,121,121,121,121, - 121,121,121,122,123,123,123,123,124,124,124,124,124,124,124,125, - 126,126,126,126,127,127,127,127,128,128,128,128, 2, 2, 3, 2, - 2,129,130, 0,131,131,131,131,132, 17, 17, 18, 20, 20, 20,133, - 7, 7, 7,134, 20, 20, 20, 23, 0,135,109,109,109,109,109,136, - 137,137,137,137, 0, 0, 0,138,139,139,139,139,140,140,140,140, - 84, 0, 0, 0,141,141,141,141,142,142,142,142,143,143,143,143, - 144,144,144,144,145,145,145,145,146,146,146,146,147,147,147,147, - 148,148,148,148,149,149,149,149,150,150,150,150,151,151,151,151, - 152,152,152,152,153,153,153,153,154,154,154,154,155,155,155,155, - 156,156,156,156,157,157,157,157,158,158,158,158,159,159,159,159, - 160,160,160,160,161,161,161,161,162,162,162,162,163,163,163,163, - 164,164,164,164,165,165,165,165,166,166,166,166,167,167,167,167, - 168,168,168,168,169,169,169,169,170,170,170,170,171,171,171,171, - 172,172,172,172,173,173,173,173,174,174,174,174,175,175,175,175, - 176,176,176,176,177,177,177,177,178,178,178,178,179,179,179,179, - 180,180,180,180,181,181,181,181,182,182,182,182,183,183,183,183, - 184,184,184,184,185,185,185,185,186, 45, 45, 45,187,187,187,187, - 188,188,188,188,189,189,189,189,190,190,190,190,190,190,191,190, - 192,192,192,192,193,193,193,193,194,194,194,194,195,195,195,195, - 196,196,196,196,197,197,197,197,198,198,198,198,199,199,199,199, - 200,200,200,200,201,201,201,201,202,202,202,202,203,203,203,203, - 204,204,204,204,205,205,205,205,206,206,206,206,207,207,207,207, - 208,208,208,208,209,209,209,209,210,210,210,210,211,211,211,211, - 212,212,212,212,213,213,213,213,214,214,214,214,215,215,215,215, - 216,216,216,216,217,217,217,217,218,218,218,218,219,219,219,219, - 220,221,221,221,222,222,222,222,221,221,221,221,223,106,106,106, - 106,109,109,109,224,224,224,224,225,225,225,225, 0,226, 86, 0, - 0, 0,226, 7, 82,138, 7, 0, 0, 0,227, 86,228,228,228,228, - 229,229,229,229,230,230,230,230,231,231,231,231,232,232,232,232, - 233,233,233,233,234, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, - 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 0, 9, 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55, - 6, 6, 6, 6, 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4, - 4, 14, 14, 14, 14, 14, 14, 14, 3, 3, 3, 3, 3, 0, 3, 3, - 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, - 1, 3, 3, 3, 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64, - 90, 90, 90, 90, 95, 95, 95, 95, 3, 3, 0, 3, 7, 7, 7, 7, - 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, - 11, 11, 11, 11, 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22, - 23, 23, 23, 23, 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36, - 24, 24, 24, 24, 24, 24, 24, 0, 18, 18, 18, 18, 25, 25, 25, 25, - 25, 0, 0, 0, 0, 25, 25, 25, 33, 33, 33, 33, 8, 8, 8, 8, - 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29, - 28, 28, 28, 28, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 0, - 0, 0, 35, 35, 45, 45, 45, 45, 44, 44, 44, 44, 44, 0, 0, 0, - 43, 43, 43, 43, 46, 46, 46, 46, 31, 31, 31, 31, 32, 32, 0, 0, - 32, 0, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52, - 58, 58, 58, 58, 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62, - 76, 76, 76, 76, 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73, - 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, - 1, 1, 0, 0, 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, 9, 9, - 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, 19, 9, - 0, 0, 0, 19, 0, 0, 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, - 56, 56, 56, 56, 61, 61, 61, 61, 13, 13, 13, 13, 0, 13, 0, 13, - 0, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 0, 15, 15, 15, - 15, 15, 15, 15, 15, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 0, 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12, 0, - 39, 39, 39, 39, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, - 60, 60, 60, 60, 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69, - 69, 69, 0, 69, 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84, 0, - 68, 68, 68, 68, 92, 92, 92, 92, 87, 87, 87, 87, 19, 9, 19, 19, - 19, 19, 0, 0, 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0, - 1, 1, 6, 6, 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49, - 0, 1, 1, 1, 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, - 41, 41, 41, 41,118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, - 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135, - 106,106,106,106,104,104,104,104,161,161,161,161,110,110,110,110, - 47, 47, 47, 47, 81, 81, 81, 81,120,120,120,120,116,116,116,116, - 128,128,128,128, 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, - 97, 97, 97, 97, 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117, - 112,112,112,112, 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82, - 122,122,122,122, 89, 89, 89, 89,130,130,130,130,144,144,144,144, - 156,156,156,156,147,147,147,147,148,148,148,148,158,158,158,158, - 153,153,153,153,149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85, - 101,101,101,101, 96, 96, 96, 96,111,111,111,111,100,100,100,100, - 100, 36, 36, 36,108,108,108,108,129,129,129,129,109,109,109,109, - 107,107,107,107,107,107,107, 1,137,137,137,137,124,124,124,124, - 123,123,123,123,114,114,114,114,102,102,102,102,126,126,126,126, - 142,142,142,142,125,125,125,125,154,154,154,154,150,150,150,150, - 141,141,141,141,140,140,140,140,121,121,121,121,133,133,133,133, - 134,134,134,134,138,138,138,138,143,143,143,143,145,145,145,145, - 63, 63, 63, 63,157,157,157,157, 80, 80, 80, 80,127,127,127,127, - 115,115,115,115,159,159,159,159,103,103,103,103,119,119,119,119, - 146,146,146,146, 99, 99, 99, 99,136,139, 13, 13,155,155,155,155, - 136,136,136,136, 17, 15, 15, 15,139,139,139,139,105,105,105,105, - 0, 0, 0, 1, 0, 0, 1, 1,131,131,131,131,151,151,151,151, - 160,160,160,160,152,152,152,152,113,113,113,113,132,132,132,132, - 15, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, - 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, + 192,192,192,192,193,193,193,193,194,194,194,194,194,194, 66, 66, + 195,195,195,195,196,196,196,196,197,197,197,197,198,198,198,198, + 199,199,199,199,200,200,200,200,201,201,201,201,201,202,202,202, + 202,202,202, 55,203,203,203,203,204,204,204,204,204,204,204,205, + 205,205,205,205,206,206,206,206,206,206,207,207,207,207,207,207, + 208,208,208,208,110,110,110,110,209,209,209,209,210,210,210,210, + 211,211,211,211,212,212,212,212,213,213,213,214,214,214,214,214, + 214,215,215,215,216,216,216,216,217,217,217,217,218,218,218,218, + 218,218,219, 94,220,220,220,220,221,221,221,221,222, 99, 99, 99, + 99, 99, 99, 99, 99, 99,102,102,102, 99,223,224,224,224,224,224, + 225,225,225,225,225,225, 0, 0, 8, 0, 0, 0, 0, 0,226,227, + 228, 0,229, 0,230,230,230,230,231,231,231,231,232,232,232,232, + 233,233,233,233,234,234,234,234,235,235,235,235,236, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 3, 0, 0, 0, 4, 0, + 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 5, 0, 2, 5, 6, 0, + 7, 7, 7, 7, 8, 9, 8, 10, 8, 11, 8, 8, 8, 8, 8, 8, + 12, 13, 13, 13, 14, 14, 14, 14, 14, 15, 14, 14, 16, 17, 17, 17, + 17, 17, 17, 17, 18, 19, 19, 19, 19, 19, 19, 19, 20, 21, 20, 22, + 20, 20, 23, 23, 20, 20, 20, 20, 22, 20, 24, 7, 7, 25, 20, 20, + 26, 20, 20, 20, 20, 20, 20, 21, 27, 27, 27, 27, 28, 28, 28, 28, + 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 20, 20, 20, + 33, 33, 33, 33, 34, 35, 33, 33, 33, 36, 33, 33, 37, 37, 37, 37, + 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, + 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 46, 46, 47, 48, 48, 48, 48, 49, 49, 49, 49, + 49, 50, 51, 49, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 54, 53, + 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, + 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 62, 63, 63, 63, 63, + 64, 64, 64, 64, 64, 65, 0, 0, 66, 66, 66, 66, 67, 67, 67, 67, + 68, 68, 68, 68, 69, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, + 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 76, 76, 76, 76, + 77, 77, 77, 77, 78, 78, 78, 78, 79, 79, 79, 79, 80, 80, 80, 80, + 81, 81, 81, 81, 82, 7, 7, 7, 83, 7, 84, 85, 0, 84, 86, 0, + 2, 87, 88, 2, 2, 2, 2, 89, 90, 87, 91, 2, 2, 2, 92, 2, + 2, 2, 2, 93, 0, 0, 0, 86, 1, 0, 0, 94, 0, 95, 96, 0, + 4, 0, 0, 0, 0, 0, 0, 4, 97, 97, 97, 97, 98, 98, 98, 98, + 13, 13, 13, 13, 99, 99, 99, 99,100,100,100,100, 0,101, 0, 0, + 102,100,103,104, 0, 0,100, 0,105,106,106,106,106,106,106,106, + 106,106,107,105,108,109,109,109,109,109,109,109,109,109,110,108, + 111,111,111,111,112, 55, 55, 55, 55, 55, 55,113,109,109,109,110, + 109,109, 0, 0,114,114,114,114,115,115,115,115,116,116,116,116, + 117,117,117,117, 96, 2, 2, 2, 2, 2, 94, 2,118,118,118,118, + 119,119,119,119,120,120,120,120,121,121,121,121,121,121,121,122, + 123,123,123,123,124,124,124,124,124,124,124,125,126,126,126,126, + 127,127,127,127,128,128,128,128, 2, 2, 3, 2, 2,129,130, 0, + 131,131,131,131,132, 17, 17, 18, 20, 20, 20,133, 7, 7, 7,134, + 20, 20, 20, 23, 0,135,109,109,109,109,109,136,137,137,137,137, + 0, 0, 0,138,139,139,139,139,140,140,140,140, 84, 0, 0, 0, + 141,141,141,141,142,142,142,142,143,143,143,143,144,144,144,144, + 145,145,145,145,146,146,146,146,147,147,147,147,148,148,148,148, + 149,149,149,149,150,150,150,150,151,151,151,151,152,152,152,152, + 153,153,153,153,154,154,154,154,155,155,155,155,156,156,156,156, + 157,157,157,157,158,158,158,158,159,159,159,159,160,160,160,160, + 161,161,161,161,162,162,162,162,163,163,163,163,164,164,164,164, + 165,165,165,165,166,166,166,166,167,167,167,167,168,168,168,168, + 169,169,169,169,170,170,170,170,171,171,171,171,172,172,172,172, + 173,173,173,173,174,174,174,174,175,175,175,175,176,176,176,176, + 177,177,177,177,178,178,178,178,179,179,179,179,180,180,180,180, + 181,181,181,181,182,182,182,182,183,183,183,183,184,184,184,184, + 185,185,185,185,186, 45, 45, 45,187,187,187,187,188,188,188,188, + 189,189,189,189,190,190,190,190,190,190,191,190,192,192,192,192, + 193,193,193,193,194,194,194,194,195,195,195,195,196,196,196,196, + 197,197,197,197,198,198,198,198,199,199,199,199,200,200,200,200, + 201,201,201,201,202,202,202,202,203,203,203,203,204,204,204,204, + 205,205,205,205,206,206,206,206,207,207,207,207,208,208,208,208, + 209,209,209,209,210,210,210,210,211,211,211,211,212,212,212,212, + 213,213,213,213,214,214,214,214,215,215,215,215,216,216,216,216, + 217,217,217,217,218,218,218,218,219,219,219,219,220,221,221,221, + 222,222,222,222,221,221,221,221,223,106,106,106,106,109,109,109, + 224,224,224,224,225,225,225,225, 0,226, 86, 0, 0, 0,226, 7, + 82,138, 7, 0, 0, 0,227, 86,228,228,228,228,229,229,229,229, + 230,230,230,230,231,231,231,231,232,232,232,232,233,233,233,233, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, + 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, + 9, 0, 9, 0, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, + 6, 1, 1, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, 14, 14, 14, + 14, 14, 14, 14, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, + 37, 37, 37, 37, 38, 38, 38, 38, 64, 64, 64, 64, 90, 90, 90, 90, + 95, 95, 95, 95, 3, 3, 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, + 1, 7, 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 11, 11, 11, 11, + 10, 10, 10, 10, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, + 16, 16, 16, 16, 20, 20, 20, 20, 36, 36, 36, 36, 24, 24, 24, 24, + 24, 24, 24, 0, 18, 18, 18, 18, 25, 25, 25, 25, 25, 0, 0, 0, + 0, 25, 25, 25, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 0, + 12, 12, 12, 12, 30, 30, 30, 30, 29, 29, 29, 29, 28, 28, 28, 28, + 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, + 45, 45, 45, 45, 44, 44, 44, 44, 44, 0, 0, 0, 43, 43, 43, 43, + 46, 46, 46, 46, 31, 31, 31, 31, 32, 32, 0, 0, 32, 0, 32, 32, + 32, 32, 32, 32, 48, 48, 48, 48, 52, 52, 52, 52, 58, 58, 58, 58, + 54, 54, 54, 54, 91, 91, 91, 91, 62, 62, 62, 62, 76, 76, 76, 76, + 93, 93, 93, 93, 70, 70, 70, 70, 73, 73, 73, 73, 1, 1, 1, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, + 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, 9, 9, 9, 9, 19, 19, + 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, 19, 9, 0, 0, 0, 19, + 0, 0, 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 56, 56, 56, 56, + 61, 61, 61, 61, 13, 13, 13, 13, 0, 13, 0, 13, 0, 13, 13, 13, + 13, 13, 1, 1, 1, 1, 12, 12, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 1, 1, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, + 26, 26, 26, 26, 26, 12, 12, 12, 12, 12, 12, 0, 39, 39, 39, 39, + 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, 79, 79, 60, 60, 60, 60, + 65, 65, 65, 65, 75, 75, 75, 75, 69, 69, 69, 69, 69, 69, 0, 69, + 74, 74, 74, 74, 84, 84, 84, 84, 84, 84, 84, 0, 68, 68, 68, 68, + 92, 92, 92, 92, 87, 87, 87, 87, 19, 9, 19, 19, 19, 19, 0, 0, + 2, 2, 2, 2, 19, 19, 19, 4, 3, 3, 0, 0, 1, 1, 6, 6, + 0, 0, 17, 17, 17, 17, 0, 0, 49, 49, 49, 49, 0, 1, 1, 1, + 71, 71, 71, 71, 67, 67, 67, 67, 42, 42, 42, 42, 41, 41, 41, 41, + 118,118,118,118, 53, 53, 53, 53, 59, 59, 59, 59, 40, 40, 40, 40, + 51, 51, 51, 51, 50, 50, 50, 50,135,135,135,135,106,106,106,106, + 104,104,104,104,161,161,161,161,110,110,110,110, 47, 47, 47, 47, + 81, 81, 81, 81,120,120,120,120,116,116,116,116,128,128,128,128, + 66, 66, 66, 66, 72, 72, 72, 72, 98, 98, 98, 98, 97, 97, 97, 97, + 57, 57, 57, 57, 88, 88, 88, 88,117,117,117,117,112,112,112,112, + 78, 78, 78, 78, 83, 83, 83, 83, 82, 82, 82, 82,122,122,122,122, + 89, 89, 89, 89,130,130,130,130,144,144,144,144,156,156,156,156, + 147,147,147,147,148,148,148,148,158,158,158,158,153,153,153,153, + 149,149,149,149, 94, 94, 94, 94, 85, 85, 85, 85,101,101,101,101, + 96, 96, 96, 96,111,111,111,111,100,100,100,100,100, 36, 36, 36, + 108,108,108,108,129,129,129,129,109,109,109,109,107,107,107,107, + 107,107,107, 1,137,137,137,137,124,124,124,124,123,123,123,123, + 114,114,114,114,102,102,102,102,126,126,126,126,142,142,142,142, + 125,125,125,125,154,154,154,154,150,150,150,150,141,141,141,141, + 140,140,140,140,121,121,121,121,133,133,133,133,134,134,134,134, + 138,138,138,138,143,143,143,143,145,145,145,145, 63, 63, 63, 63, + 157,157,157,157, 80, 80, 80, 80,127,127,127,127,115,115,115,115, + 159,159,159,159,103,103,103,103,119,119,119,119,146,146,146,146, + 99, 99, 99, 99,136,139, 13, 13,155,155,155,155,136,136,136,136, + 17, 15, 15, 15,139,139,139,139,105,105,105,105, 0, 0, 0, 1, + 0, 0, 1, 1,131,131,131,131,151,151,151,151,160,160,160,160, + 152,152,152,152,113,113,113,113,132,132,132,132, 15, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, + 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, - 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -6479,58 +5336,57 @@ _hb_ucd_u8[13602] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, - 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, - 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, - 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, + 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, + 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, - 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, + 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, - 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, + 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0, + 109, 0,110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0, + 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100, - 101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0,107, 0, - 0, 0,108, 0,109, 0,110, 0,111,112,113, 0,114, 0, 0, 0, - 115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, + 0, 0,118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122,123,124,125,126, - 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129, + 130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145, + 146,147,148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158, + 159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0, + 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,128,129,130,131,132,133,134,135,136,137,138,139,140,141, - 142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157, - 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, 0, 0, - 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 0, 0, + 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174, + 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, + 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171,172, 0, - 0, 0,173,174,175,176,177,178,179,180,181,182,183,184,185,186, - 187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202, - 203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, - 3, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t _hb_ucd_u16[4888] = @@ -6843,21 +5699,14 @@ _hb_ucd_u16[4888] = 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t -_hb_ucd_i16[196] = +_hb_ucd_i16[92] = { - 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, - 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, - 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, - -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, - 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, - 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, - 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, - 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, - 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, - -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, - 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, - -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, - -1, 0, 1, -1, + 0, 0, 1, -1, 2, 0, -2, 0, 0, 2, 0, -2, 0, 16, 0, -16, + 0, 1, -1, 0, 3, 3, 3, -3, -3, -3, 0, 2016, 0, 2527, 1923, 1914, + 1918, 0, 2250, 0, 0, 138, 0, 7, -7, 0, -1, 1, 1824, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, -1, -138, 8, 8, 8, 0, 7, 7, -8, -8, + -8, -7,-1316, 1, -1, 3, -3, 1, 0,-1914,-1918, 0, 0,-1923,-1824, 0, + 0,-2016,-2104, 0, 0,-2106,-2108,-2106,-2250, 0,-2527, 0, }; static inline uint_fast8_t @@ -6878,17 +5727,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7714+(((_hb_ucd_u8[7594+(((_hb_ucd_b4(7466+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[7858+(((_hb_ucd_u8[7626+(((_hb_ucd_u8[7530+(((_hb_ucd_b4(7466+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918016u?_hb_ucd_u8[11480+(((_hb_ucd_u8[10532+(((_hb_ucd_u8[9124+(((_hb_ucd_u8[8500+(((_hb_ucd_u8[8050+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; + return u<918016u?_hb_ucd_u8[11124+(((_hb_ucd_u8[10176+(((_hb_ucd_u8[9204+(((_hb_ucd_u8[8524+(((_hb_ucd_u8[8220+(((_hb_ucd_u8[8106+(u>>2>>2>>2>>3>>4)])<<4)+((u>>2>>2>>2>>3)&15u))])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[1576+(((_hb_ucd_u8[12802+(((_hb_ucd_u8[12420+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[1576+(((_hb_ucd_u8[12446+(((_hb_ucd_u8[12064+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #endif diff --git a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh index c216379201..036c71a424 100644 --- a/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh +++ b/thirdparty/harfbuzz/src/hb-unicode-emoji-table.hh @@ -24,42 +24,37 @@ #include "hb-unicode.hh" static const uint8_t -_hb_emoji_u8[544] = +_hb_emoji_u8[464] = { 16, 17, 17, 17, 50, 20, 21, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,118,152, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 3, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 6, 0, 7, 8, - 0, 0, 0, 9, 0, 0, 10, 11, 12, 13, 14, 13, 15, 16, 17, 0, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 19, 20, 0, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, - 13, 13, 13, 13, 23, 24, 25, 26, 27, 28, 13, 13, 13, 13, 13, 29, - 13, 13, 13, 13, 30, 31, 13, 13, 13, 32, 13, 13, 0, 33, 0, 34, - 35, 36, 37, 13, 38, 39, 13, 13, 13, 13, 13, 13, 0, 0, 0, 0, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 30, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 2, 0, 0,240, 3, 0, 6, 0, 0, - 0, 0, 0, 12, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, - 0,128, 0, 0, 0,254, 15, 7, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, 0, 0, 0,120, - 191,255,247,255,255,255,255,255,255,255,255,255,255,255,255,255, - 63, 0,255,255,255,255,255,255, 63,255, 87, 32, 2, 1, 24, 0, - 144, 80,184, 0,248, 0, 0, 0, 0, 0,224, 0, 2, 0, 1,128, - 0, 0, 0, 0, 0, 0, 48, 0,224, 0, 0, 24, 0, 0, 0, 0, - 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, - 0, 0,128, 2, 0, 0, 0, 0, 0,224, 0, 0, 0,128, 0, 0, - 0, 0, 0, 0, 0,240, 3,192, 0, 64,254, 7, 0,224,255,255, - 255,255,255,255, 63, 0, 0, 0,254,255, 0, 4, 0,128,252,247, - 0,254,255,255,255,255,255,255,255,255,255,255,255,255,255, 7, - 255,255,255,255,255,255,255, 63,192,255,255,255,255,255,255,255, - 255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,255, - 0, 0,224,255,255,255,255,255, 0,240, 0, 0, 0, 0, 0, 0, - 0,255, 0,252, 0, 0, 0, 0, 0,255, 0, 0, 0,192,255,255, - 0,240,255,255,255,255,255,247,191,255,255,255,255,255,255,255, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 3, 4, 0, 0, 5, 6, 0, 7, 0, 8, 9, 10, 11, 12, + 0, 0, 13, 0, 0, 0, 14, 0, 15, 0, 0, 0, 0, 16, 0, 0, + 17, 17, 18, 19, 20, 17, 17, 21, 17, 17, 22, 17, 23, 17, 24, 25, + 26, 27, 28, 17, 17, 17, 0, 0, 17, 17, 17, 17, 17, 17, 17, 29, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 3, 0, 0, 4, 0, 0, + 5, 6, 0, 0, 7, 8, 0, 0, 8, 0, 9, 10, 0, 0, 11, 0, + 0, 12, 13, 14, 15, 16, 16, 16, 17, 16, 16, 16, 18, 19, 20, 21, + 22, 23, 0, 0, 0, 24, 0, 0, 25, 0, 26, 0, 0, 27, 0, 0, + 28, 0, 0, 0, 16, 16, 16, 16, 29, 9, 0, 30, 31, 32, 16, 33, + 34, 35, 36, 16, 16, 16, 16, 37, 16, 38, 39, 16, 16, 16, 40, 0, + 0, 0, 0, 41, 0, 0, 42, 16, 43, 0, 44, 0, 45, 46, 16, 16, + 47, 48, 49, 16, 16, 16, 16, 38, 0, 0, 0, 0, 0, 66, 0, 0, + 0, 0, 0, 16, 0, 2, 0, 0, 4, 0, 0, 2, 0, 0,240, 3, + 0, 6, 0, 0, 0, 0, 0, 12, 0, 1, 0, 0, 0,128, 0, 0, + 0,254, 15, 7, 4, 0, 0, 0, 0, 12, 64, 0, 1, 0, 0, 0, + 0, 0, 0,120,191,255,247,255,255,255,255,255, 63, 0,255,255, + 63,255, 87, 32, 2, 1, 24, 0,144, 80,184, 0,248, 0, 0, 0, + 0, 0,224, 0, 2, 0, 1,128, 0, 0, 48, 0,224, 0, 0, 24, + 0, 0, 33, 0, 0, 0, 1, 32, 0, 0,128, 2, 0,224, 0, 0, + 0,240, 3,192, 0, 64,254, 7, 0,224,255,255, 63, 0, 0, 0, + 254,255, 0, 4, 0,128,252,247, 0,254,255,255,255,255,255, 7, + 255,255,255, 63,192,255,255,255,255,255, 0, 0, 0, 0,240,255, + 0, 0,224,255, 0,240, 0, 0, 0,255, 0,252, 0,255, 0, 0, + 0,192,255,255, 0,240,255,255,255,255,255,247,191,255,255,255, }; static inline unsigned @@ -75,7 +70,7 @@ _hb_emoji_b1 (const uint8_t* a, unsigned i) static inline uint_fast8_t _hb_emoji_is_Extended_Pictographic (unsigned u) { - return u<131070u?_hb_emoji_b1(224+_hb_emoji_u8,((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>6>>4))<<4)+((u>>6)&15u))])<<6)+((u)&63u)):0; + return u<131070u?_hb_emoji_b1(264+_hb_emoji_u8,((_hb_emoji_u8[144+(((_hb_emoji_u8[64+(((_hb_emoji_b4(_hb_emoji_u8,u>>5>>2>>3))<<3)+((u>>5>>2)&7u))])<<2)+((u>>5)&3u))])<<5)+((u)&31u)):0; } diff --git a/thirdparty/harfbuzz/src/hb-unicode.cc b/thirdparty/harfbuzz/src/hb-unicode.cc index 9899e01a41..c1795dc7f2 100644 --- a/thirdparty/harfbuzz/src/hb-unicode.cc +++ b/thirdparty/harfbuzz/src/hb-unicode.cc @@ -308,8 +308,8 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, * Since: 0.9.2 **/ void * -hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, - hb_user_data_key_t *key) +hb_unicode_funcs_get_user_data (const hb_unicode_funcs_t *ufuncs, + hb_user_data_key_t *key) { return hb_object_get_user_data (ufuncs, key); } diff --git a/thirdparty/harfbuzz/src/hb-unicode.h b/thirdparty/harfbuzz/src/hb-unicode.h index a500384575..faa8d67924 100644 --- a/thirdparty/harfbuzz/src/hb-unicode.h +++ b/thirdparty/harfbuzz/src/hb-unicode.h @@ -317,8 +317,8 @@ hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, HB_EXTERN void * -hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, - hb_user_data_key_t *key); +hb_unicode_funcs_get_user_data (const hb_unicode_funcs_t *ufuncs, + hb_user_data_key_t *key); HB_EXTERN void diff --git a/thirdparty/harfbuzz/src/hb-version.h b/thirdparty/harfbuzz/src/hb-version.h index 40ea3eb017..a1586a58b6 100644 --- a/thirdparty/harfbuzz/src/hb-version.h +++ b/thirdparty/harfbuzz/src/hb-version.h @@ -47,20 +47,20 @@ HB_BEGIN_DECLS * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 0 +#define HB_VERSION_MINOR 1 /** * HB_VERSION_MICRO: * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 0 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "5.0.1" +#define HB_VERSION_STRING "5.1.0" /** * HB_VERSION_ATLEAST: |