diff --git a/README.md b/README.md index 94aae8f..5134052 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ # LinuxCNC Web/WASM +五轴 GLB / URDF 机床导入(AC / BC、底座双分支)的工作入口: +[`子项目文档、任务矩阵与模型交付`](docs/glb-machine/README.md)。 + +机床预览区的部件级三维机床管理器(GLB 部件、层级、原点、姿态、RTCP 标定和物理零点)入口: +[`三维机床管理器文档、任务矩阵与验收证据`](docs/glb-machine-manager/README.md)。 + 当前配置驱动改造的重启接续入口:[`nextTask-hardcoding.md`](nextTask-hardcoding.md)。 五轴机床 INI 参数化设计(XYZAC / XYZBC)的当前工作入口: diff --git a/coverage/glb-machine-manager/browser-production.report.json b/coverage/glb-machine-manager/browser-production.report.json new file mode 100644 index 0000000..4764258 --- /dev/null +++ b/coverage/glb-machine-manager/browser-production.report.json @@ -0,0 +1,21 @@ +{ + "schema": "machine-manager-browser.v1", + "report_id": "GLB-MGR-E02", + "mode": "production-preview", + "status": "verified", + "checks": [ + "eight GLB parts imported and rendered in the Three.js editor", + "origin visibility, numeric translation/rotation and TransformControls mode update", + "validated assembly exports a self-contained managed GLB", + "validated hierarchy applied through LOAD_WORKSPACE with geometry and physical zero in userData", + "same component assembly switches to BC hierarchy and applies BC geometry", + "BC five-axis program drives managed model from authoritative WASM joints", + "production bundle exercised through AC/BC UI apply and WASM program motion" + ], + "browser_errors": [], + "final": { + "program": "aborted", + "machine": "ON", + "path": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc" + } +} diff --git a/coverage/glb-machine-manager/browser.report.json b/coverage/glb-machine-manager/browser.report.json new file mode 100644 index 0000000..593710b --- /dev/null +++ b/coverage/glb-machine-manager/browser.report.json @@ -0,0 +1,21 @@ +{ + "schema": "machine-manager-browser.v1", + "report_id": "GLB-MGR-E01", + "mode": "development-source", + "status": "verified", + "checks": [ + "eight GLB parts imported and rendered in the Three.js editor", + "origin visibility, numeric translation/rotation and TransformControls mode update", + "validated assembly exports a self-contained managed GLB", + "validated hierarchy applied through LOAD_WORKSPACE with geometry and physical zero in userData", + "same component assembly switches to BC hierarchy and applies BC geometry", + "BC five-axis program drives managed model from authoritative WASM joints", + "AC/BC WASM joint projection subtracts physical zero, preserves userData and rejects invalid hierarchy" + ], + "browser_errors": [], + "final": { + "program": "aborted", + "machine": "ON", + "path": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc" + } +} diff --git a/coverage/glb-machine-manager/managed-bc-running.png b/coverage/glb-machine-manager/managed-bc-running.png new file mode 100644 index 0000000..e3cd2dc Binary files /dev/null and b/coverage/glb-machine-manager/managed-bc-running.png differ diff --git a/coverage/glb-machine-manager/manager-ac-config.png b/coverage/glb-machine-manager/manager-ac-config.png new file mode 100644 index 0000000..2c1548d Binary files /dev/null and b/coverage/glb-machine-manager/manager-ac-config.png differ diff --git a/coverage/glb-machine-manager/regression-motion/motion.report.json b/coverage/glb-machine-manager/regression-motion/motion.report.json new file mode 100644 index 0000000..f199a69 --- /dev/null +++ b/coverage/glb-machine-manager/regression-motion/motion.report.json @@ -0,0 +1,2544 @@ +{ + "report_id": "glb-machine-five-axis-motion-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 A0 C0\nM428\nG1 X35 Y24 Z32 A25 C40 F900\nG1 X24 Y16 Z24 A-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.2591401799415137e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0.22968749999999996, + "b": 0, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.99595803736646, + 9.874421474017172, + 20.12624077439751, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 1.3545395528575301, + "b": 0, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.95434701862283, + 9.257647365906834, + 20.743322191952068, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 2.9321764100262997, + "b": 0, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.833124292093828, + 8.384734865389902, + 21.60616083887203, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 4.50981326719507, + "b": 0, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.635609460598403, + 7.49750341711335, + 22.46657440661184, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 6.087450124363804, + "b": 0, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.358888206816445, + 6.590046034574037, + 23.324707443401806, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 7.6650869815325375, + "b": 0, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.000370067347152, + 5.656262521201651, + 24.180057881811884, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 9.24272383870132, + "b": 0, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.55779952899828, + 4.689923242944772, + 25.031455090743655, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 10.820360695870146, + "b": 0, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.029266133103974, + 3.684734977856124, + 25.87704364402046, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 12.397997553038973, + "b": 0, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.413213557148122, + 2.6344083490822943, + 26.714272981080555, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 13.9756344102078, + "b": 0, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 16.70844764564024, + 1.5327263336594292, + 27.539893093834166, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 15.553271267376624, + "b": 0, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.914143364935367, + 0.3736133289244634, + 28.349956331230942, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 17.130908124545453, + "b": 0, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.029850659501848, + -0.8487957487481985, + 29.139825369774186, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 18.70854498171428, + "b": 0, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.055499190014691, + -2.1400868617254467, + 29.904187354395702, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 20.286181838883106, + "b": 0, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.991401936579638, + -3.5054992742176942, + 30.63707417005608, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 21.86381869605193, + "b": 0, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.838257653368174, + -4.94985952588366, + 31.331888760448635, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 23.441455553220756, + "b": 0, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.597152163957437, + -6.4775174739041965, + 31.981437366549414, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 24.321021033301516, + "b": 0, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 9.87102928781642, + -7.245549872434104, + 32.49414794112097, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 23.33197857142857, + "b": 0, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.726007873637807, + -5.788403985078261, + 32.73730577435077, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 21.412857142857153, + "b": 0, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.36203653051712, + -3.231075744959096, + 32.8109269608977, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 19.484285714285733, + "b": 0, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.980580242285733, + -0.7404921771841426, + 32.766464373464416, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 17.555714285714313, + "b": 0, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.570237107614947, + 1.6675534613501029, + 32.61200452902207, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 15.627142857142896, + "b": 0, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.127951943791736, + 3.9908139847170325, + 32.35623658379197, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 13.698571428571476, + "b": 0, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.650908000145666, + 6.227777163216452, + 32.00772085126978, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 11.769999999999937, + "b": 0, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.136530696440413, + 8.377631103821685, + 31.574829328143053, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 9.841428571428393, + "b": 0, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 21.58249029485251, + 10.440225044744565, + 31.065690883131552, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 7.912857142856847, + "b": 0, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.98670351023294, + 12.416026099775472, + 30.488141447935618, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 5.984285714285303, + "b": 0, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.347334067326027, + 14.306072511605354, + 29.849679492514724, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 4.0557142857137585, + "b": 0, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 25.662792217542528, + 16.11192399109913, + 29.157427008482472, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 2.1271428571422213, + "b": 0, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.931733231731258, + 17.835609731385446, + 28.418096165068704, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0.19857142857092924, + "b": 0, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.153054889154856, + 19.479574691642114, + 27.637961742435337, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": -1.7300000000003664, + "b": 0, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 29.325893986537977, + 21.046624745627106, + 26.822839387706722, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": -3.658571428571655, + "b": 0, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.449621894603986, + 22.539871284416392, + 25.978069680451114, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": -5.587142857142947, + "b": 0, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.523839192945253, + 23.962675851616893, + 25.10850793706433, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": -7.515714285714239, + "b": 0, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.54836941735962, + 25.318595372704934, + 24.218519628094157, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": -9.444285714285535, + "b": 0, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.52325195693044, + 26.611328518350824, + 23.3119812294998, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": -11.372857142856823, + "b": 0, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.44873414111287, + 27.844663714910965, + 22.392286278641734, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": -13.301428571428119, + "b": 0, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.32526255990824, + 29.022429284032476, + 21.462356358884456, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": -15.229999999999407, + "b": 0, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.153473662849684, + 30.14844615789012, + 20.52465669347393, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": -17.158571428570703, + "b": 0, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.93418368497938, + 31.226483577368235, + 19.581215990188582, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": -18.953399243412633, + "b": 0, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.61894079573156, + 32.189885304600296, + 18.699467974539928, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": -19.89197603358788, + "b": 0, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.961283259435376, + 32.679365598067484, + 18.237296989685753, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": -20.000000000000007, + "b": 0, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38, + 32.735096646501916, + 18.184064731473775, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + } + ] + }, + { + "coordinates": "XYZBC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 B0 C0\nM428\nG1 X35 Y24 Z32 B25 C40 F900\nG1 X24 Y16 Z24 B-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.482534153247273e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0, + "b": 0.22968749999999996, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.354593296251238, + 10.373322128693975, + 20.04507388460101, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 0, + "b": 1.3545395528575301, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.052857860352518, + 12.228636167480964, + 20.236907267739767, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 0, + "b": 2.9321764100262997, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.32300426056765, + 14.901846411100632, + 20.43125264026292, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 0, + "b": 4.50981326719507, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.4556677943976, + 17.65004041307935, + 20.54933931906639, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 0, + "b": 6.087450124363804, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.44416333968364, + 20.46409437567004, + 20.603831134243293, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 0, + "b": 7.6650869815325375, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.283044229288166, + 23.33461513801611, + 20.607876567489022, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 0, + "b": 9.24272383870132, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.968141666787204, + 26.251966035450025, + 20.575002547782745, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 0, + "b": 10.820360695870146, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.496595270790735, + 29.206293491231953, + 20.519005173143277, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 0, + "b": 12.397997553038973, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.86687451233006, + 32.18755427381161, + 20.45383808115305, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 0, + "b": 13.9756344102078, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.07879086779993, + 35.18554335093002, + 20.39349920852434, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 0, + "b": 15.553271267376624, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.13350056927484, + 38.18992227027549, + 20.35191669295199, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 0, + "b": 17.130908124545453, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.033497894267676, + 41.19024799497426, + 20.342834678764525, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 0, + "b": 18.70854498171428, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.7825989977975, + 44.17600212093312, + 20.37969979138822, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 0, + "b": 20.286181838883106, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.385916350607296, + 47.13662040196324, + 20.475549044342685, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 0, + "b": 21.86381869605193, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.84982390814674, + 50.06152250770351, + 20.642899936386165, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 0, + "b": 23.441455553220756, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.181913195134186, + 52.94014193863117, + 20.893643485548907, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 0, + "b": 24.321021033301516, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.359027118648974, + 54.71638449110792, + 21.171283315559123, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 0, + "b": 23.33197857142857, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.39352693812648, + 53.655161123103774, + 21.32286759551807, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 0, + "b": 21.412857142857153, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.29340512609428, + 51.18596799153211, + 21.531014416050347, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 0, + "b": 19.484285714285733, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.066824879865536, + 48.623328042265186, + 21.843804803184312, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 0, + "b": 17.555714285714313, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.702027680804335, + 45.98918929530564, + 22.24800635763215, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 0, + "b": 15.627142857142896, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.18844703636083, + 43.293688769804604, + 22.730020690488914, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 0, + "b": 13.698571428571476, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.517006338406276, + 40.54705953647175, + 23.27527337004404, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 0, + "b": 11.769999999999937, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.68019795514522, + 37.759594871790796, + 23.868362835349203, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 0, + "b": 9.841428571428393, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.672147779171034, + 34.941612466310545, + 24.493215363781708, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 0, + "b": 7.912857142856847, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.4886647961429, + 32.10341880588485, + 25.13324470418288, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 0, + "b": 5.984285714285303, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.12727536916033, + 29.25527384360638, + 25.77151495819203, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 0, + "b": 4.0557142857137585, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.5872420661815, + 26.407356078667487, + 26.39090527557495, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 0, + "b": 2.1271428571422213, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.869566990660203, + 23.569728156501203, + 26.974274924730324, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0, + "b": 0.19857142857092924, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.976979707844983, + 20.75230310230978, + 27.504627307111022, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": 0, + "b": -1.7300000000003664, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.913909989787918, + 17.96481129748483, + 27.965271503886584, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": 0, + "b": -3.658571428571655, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.68644572996891, + 15.216768305479345, + 28.339979974559384, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": 0, + "b": -5.587142857142947, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.302276502486365, + 12.51744365040088, + 28.613141070102174, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": 0, + "b": -7.515714285714239, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.770623359991134, + 9.8758306479915, + 28.769905077077162, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": 0, + "b": -9.444285714285535, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.1021555779621, + 7.300617384737354, + 28.79632257361365, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": 0, + "b": -11.372857142856823, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.308895159624548, + 4.800158936632201, + 28.67947395245912, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": 0, + "b": -13.301428571428119, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.404110014932954, + 2.3824509146169426, + 28.40758904989635, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": 0, + "b": -15.229999999999407, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.402196817788763, + 0.055104418946017475, + 27.970155911380544, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": 0, + "b": -17.158571428570703, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 5.318554627320388, + -2.1746775202911444, + 27.358017824473237, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": 0, + "b": -18.953399243412633, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 2.3895993001225477, + -4.156226276164592, + 26.624583591622006, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": 0, + "b": -19.89197603358788, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.8399315400023468, + -5.154734948504778, + 26.176389399747194, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": 0, + "b": -20.000000000000007, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.6609101272348354, + -5.267949192431118, + 26.12191484552119, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ] + } + ] +} diff --git a/coverage/glb-machine/ac-imported.png b/coverage/glb-machine/ac-imported.png new file mode 100644 index 0000000..31bd2fb Binary files /dev/null and b/coverage/glb-machine/ac-imported.png differ diff --git a/coverage/glb-machine/acceptance.report.json b/coverage/glb-machine/acceptance.report.json new file mode 100644 index 0000000..f0ffc13 --- /dev/null +++ b/coverage/glb-machine/acceptance.report.json @@ -0,0 +1,212 @@ +{ + "report_id": "glb-machine-acceptance-v1", + "status": "verified", + "tasks": [ + "GLB-01", + "GLB-02", + "GLB-03", + "GLB-04", + "GLB-05", + "GLB-06" + ], + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "reports": [ + { + "report_id": "glb-machine-browser-v1", + "path": "coverage/glb-machine/browser.report.json", + "sha256": "5386309453c8b595b70a3f7c4285a57caa5affc986272915bd083a0b8a920308" + }, + { + "report_id": "glb-machine-five-axis-motion-v1", + "path": "coverage/glb-machine/motion.report.json", + "sha256": "91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626" + }, + { + "report_id": "glb-machine-khronos-validation-v1", + "path": "coverage/glb-machine/gltf-validation.report.json", + "sha256": "4eba70b5ab5597d36bd0ade01920e80ad41453c0f34a29ad0bd8e2b199825adc" + }, + { + "report_id": "glb-machine-reproducibility-v1", + "path": "coverage/glb-machine/reproducibility.report.json", + "sha256": "bce59c1ac891da57a417a99a2e5350e659aeb2cecdf8f29e30af1f83bb6cf5a2" + }, + { + "report_id": "trt-parametric-browser-v1", + "path": "coverage/glb-machine/regression-parametric/browser.report.json", + "sha256": "3a61994a249419528692a23a9a73d3af8c47477eaad9d5e3134f7e365d2279e8" + }, + { + "report_id": "trt-rtcp-jog-browser-v1", + "path": "coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json", + "sha256": "f79f137e061d33e665817170c52eb33189608e2bbed8d182854a8b39d9353e47" + } + ], + "models": [ + { + "id": "ac", + "filename": "demo-ac-xyz-head.glb", + "urdf": "demo-ac-xyz-head.urdf", + "bytes": 530848, + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + { + "id": "bc", + "filename": "demo-bc-xyz-head.glb", + "urdf": "demo-bc-xyz-head.urdf", + "bytes": 530532, + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + } + ], + "rejected_inputs": 42, + "static_pose_and_tool_length_samples": 36, + "imported_rotary_jogs": 8, + "simultaneous_five_axis_intervals": 82, + "executed_program_projection_samples": 84, + "max_program_projection_error_view_units": 2.482534153247273e-16, + "boundaries": [ + "Only the versioned orthogonal XYZ-head / AC-or-BC table TRT profile is supported", + "Runtime INI supplies homing, acceleration, periods and validated travel/speed settings", + "Imported GLB assets are kept in page memory; reload requires importing again", + "Original illustrative assets; no manufacturer calibration, collision or generic URDF solver claim", + "No native/WASM source modification; no whole-repository or release parity claim" + ], + "evidence": [ + { + "path": "coverage/glb-machine/ac-imported.png", + "sha256": "8e1e67a7ad7275d8697944b74f77bb111be9ef22d5cccab5961a0d472225dc96" + }, + { + "path": "coverage/glb-machine/bc-imported.png", + "sha256": "b7257f6aba3b513bb6c1494aaf9a1879f977884094fdc55cdf46150c25c65470" + }, + { + "path": "coverage/glb-machine/browser.log", + "sha256": "f8308922ef1d78fc82ab21081a16b8c369808e662c1ac85ceef03558c2706410" + }, + { + "path": "coverage/glb-machine/browser.report.json", + "sha256": "5386309453c8b595b70a3f7c4285a57caa5affc986272915bd083a0b8a920308" + }, + { + "path": "coverage/glb-machine/build.log", + "sha256": "61535b778ec1ab991507ca2454c1e11ddadedbe3f921b530ddc6f13bd7207073" + }, + { + "path": "coverage/glb-machine/generation.log", + "sha256": "a9222f10610e68cfda0e59a759c1fffa5a743e01f079f086bc743b260796afdd" + }, + { + "path": "coverage/glb-machine/gltf-validation.log", + "sha256": "5bc225291eb5fceeface7225db1ef98833c3bcc258ce03e16dbe32d1170d9649" + }, + { + "path": "coverage/glb-machine/gltf-validation.report.json", + "sha256": "4eba70b5ab5597d36bd0ade01920e80ad41453c0f34a29ad0bd8e2b199825adc" + }, + { + "path": "coverage/glb-machine/motion.log", + "sha256": "57ed59ba66d43ff00784733a3ddb7a0c3936c33aae0e03ab3c4fd4c2eacca361" + }, + { + "path": "coverage/glb-machine/motion.report.json", + "sha256": "91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626" + }, + { + "path": "coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json", + "sha256": "f79f137e061d33e665817170c52eb33189608e2bbed8d182854a8b39d9353e47" + }, + { + "path": "coverage/glb-machine/regression-jog/rtcp-jog-xyzac.png", + "sha256": "d528ae818b88650b0786273c8a57e7997d4a1a0484bf2dd13597cc2de3807f9f" + }, + { + "path": "coverage/glb-machine/regression-jog/rtcp-jog-xyzbc.png", + "sha256": "6be23d67f0a92259b717feb828f3c63bac4fa725e2a852c51ba83918b5aeee1a" + }, + { + "path": "coverage/glb-machine/regression-jog.log", + "sha256": "b12b994ebfd6a7dac5b079ec4781af0559f6ec623cd1548b3b9d78b50ef4f962" + }, + { + "path": "coverage/glb-machine/regression-parametric/browser.report.json", + "sha256": "3a61994a249419528692a23a9a73d3af8c47477eaad9d5e3134f7e365d2279e8" + }, + { + "path": "coverage/glb-machine/regression-parametric/layout-1440.png", + "sha256": "12f92632fa3c367e4a64a963e2246f10b58f574468b2429a5c1dd51e303ac6a3" + }, + { + "path": "coverage/glb-machine/regression-parametric/layout-390.png", + "sha256": "e17530ed4a069b06820f11036c20a1643f064fa8d3f48de7ddd1cd6fdecfc939" + }, + { + "path": "coverage/glb-machine/regression-parametric/xyzac-trt-model.png", + "sha256": "170a4c61a183cc0bf589a361d3b14a0c0f11d401eec85e8d0ec0e0c8174b0072" + }, + { + "path": "coverage/glb-machine/regression-parametric/xyzbc-trt-model.png", + "sha256": "9ef3b87c169568ecd47ff2ad76209017f41f2c84deca45e421168c42cc6efb8d" + }, + { + "path": "coverage/glb-machine/regression-parametric.log", + "sha256": "5a2d232459aeb6c054fe255d3354cdf5a71268e81dea50a0602ee761445823fa" + }, + { + "path": "coverage/glb-machine/reproducibility.report.json", + "sha256": "bce59c1ac891da57a417a99a2e5350e659aeb2cecdf8f29e30af1f83bb6cf5a2" + }, + { + "path": "coverage/glb-machine/viewport-1440.png", + "sha256": "89814a506f727b45d80e7109c6370e86d784d16e2a5c9e69f3a3681eb3590c06" + }, + { + "path": "coverage/glb-machine/viewport-390.png", + "sha256": "7ef7acd38fc1e383c8dc32bb606b8b91e91449e5c05fc9d5b5c489a9fe7eeb74" + } + ] +} diff --git a/coverage/glb-machine/bc-imported.png b/coverage/glb-machine/bc-imported.png new file mode 100644 index 0000000..45fe028 Binary files /dev/null and b/coverage/glb-machine/bc-imported.png differ diff --git a/coverage/glb-machine/browser.report.json b/coverage/glb-machine/browser.report.json new file mode 100644 index 0000000..e366ffa --- /dev/null +++ b/coverage/glb-machine/browser.report.json @@ -0,0 +1,972 @@ +{ + "report_id": "glb-machine-browser-v1", + "status": "verified", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "parser": [ + { + "id": "ac", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + }, + { + "id": "bc", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + } + ], + "machines": [ + { + "id": "ac", + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "offsets": { + "x_rot_point": 24, + "x_offset": 0, + "y_rot_point": -12, + "y_offset": 18, + "z_rot_point": 8, + "z_offset": -45 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.1933397187179203e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.1599919653272043e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 2.486410087150353e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.709648974837069e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.3472894910096233e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.1354490689426183e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 2.036065864674698e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 2.482534153247273e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3877787807814457e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 9.508199615517185e-17 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 1.9141791241147513e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 2.2591401799415137e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1857187100668868e-16 + } + ], + "jogs": [ + { + "axis": "a", + "before": { + "joints": [ + 4.066650000000003, + 3.0666500000000028, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04066650000000002, + 6.809330876933479e-18, + 0.030666500000000027 + ], + "tick": 54, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 4.066650000000003, + -0.019142531975200328, + -0.3752206095071884, + 4.799999999999997, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04066650000000002, + -0.0037522060950718836, + -0.00019142531975200244 + ], + "tick": 85, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 7.567484573835504e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 4.066650000000003, + -0.019142531975200328, + -0.3752206095071884, + 4.799999999999997, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04066650000000002, + -0.0037522060950718836, + -0.00019142531975200244 + ], + "tick": 85, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 3.0167271826648197, + -1.514225061260488, + -0.5007661972082786, + 4.799999999999997, + 4.199999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.030167271826648197, + -0.005007661972082789, + -0.015142250612604878 + ], + "tick": 114, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 1.0507972009713376e-16, + "render_error": 0 + }, + { + "axis": "a", + "before": { + "joints": [ + 3.0167271826648197, + -1.514225061260488, + -0.5007661972082786, + 4.799999999999997, + 4.199999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.030167271826648197, + -0.005007661972082789, + -0.015142250612604878 + ], + "tick": 114, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 3.0167271826648197, + -4.3547580920686855, + -1.2028404574208267, + 9.299999999999992, + 4.199999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.030167271826648197, + -0.012028404574208278, + -0.043547580920686856 + ], + "tick": 144, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 1.602813148773208e-16, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 3.0167271826648197, + -4.3547580920686855, + -1.2028404574208267, + 9.299999999999992, + 4.199999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.030167271826648197, + -0.012028404574208278, + -0.043547580920686856 + ], + "tick": 144, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 1.773075434767975, + -6.477614069157218, + -1.550471455393577, + 9.299999999999992, + 9.899999999999997 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.017730754347679747, + -0.015504714553935782, + -0.06477614069157217 + ], + "tick": 178, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 1.193812447098184e-16, + "render_error": 0 + } + ], + "pixels": { + "colors": 855, + "width": 472, + "height": 353 + }, + "worker_derived_offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "id": "bc", + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "offsets": { + "x_rot_point": -18, + "x_offset": 22, + "y_rot_point": 14, + "y_offset": 0, + "z_rot_point": 12, + "z_offset": -40 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.1188630228279524e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.3672438525262642e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.3714374201337736e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 1.0007415106216802e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.1443916996305594e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.3951318755036565e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 1.5700924586837752e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 0 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 1.4756369957997185e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 2.7755575615628914e-17 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1102230246251565e-16 + } + ], + "jogs": [ + { + "axis": "b", + "before": { + "joints": [ + 4.066650000000003, + 3.0666500000000028, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.04066650000000002, + 6.809330876933479e-18, + 0.030666500000000027 + ], + "tick": 232, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 6.117140529480697, + 3.0666500000000028, + -0.08007596355373181, + 4.199999999999992, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06117140529480696, + -0.0008007596355373112, + 0.030666500000000027 + ], + "tick": 261, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 1.571008573810619e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 6.117140529480697, + 3.0666500000000028, + -0.08007596355373181, + 4.199999999999992, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06117140529480696, + -0.0008007596355373112, + 0.030666500000000027 + ], + "tick": 261, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 7.1363588812500645, + 5.433137049240459, + -0.15492268068023662, + 4.199999999999992, + 6.000000000000007 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.07136358881250066, + -0.001549226806802354, + 0.05433137049240459 + ], + "tick": 296, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 5.575456304969596e-17, + "render_error": 0 + }, + { + "axis": "b", + "before": { + "joints": [ + 7.1363588812500645, + 5.433137049240459, + -0.15492268068023662, + 4.199999999999992, + 6.000000000000007 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.07136358881250066, + -0.001549226806802354, + 0.05433137049240459 + ], + "tick": 296, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 9.167259379788678, + 5.433137049240459, + -0.4594025400159829, + 8.399999999999984, + 6.000000000000007 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09167259379788678, + -0.004594025400159817, + 0.05433137049240459 + ], + "tick": 325, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 5.91080137522821e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 9.167259379788678, + 5.433137049240459, + -0.4594025400159829, + 8.399999999999984, + 6.000000000000007 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09167259379788678, + -0.004594025400159817, + 0.05433137049240459 + ], + "tick": 325, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 9.506048116603463, + 6.419769843383257, + -0.5094305081170489, + 8.399999999999984, + 8.430000000000007 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09506048116603463, + -0.005094305081170475, + 0.06419769843383256 + ], + "tick": 348, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 5.56803001126317e-17, + "render_error": 0 + } + ], + "pixels": { + "colors": 829, + "width": 472, + "height": 353 + }, + "worker_derived_offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1100, + "bounds": [ + { + "x": 964.671875, + "right": 1021, + "width": 56.328125 + }, + { + "x": 1028.796875, + "right": 1078.953125, + "width": 50.15625 + }, + { + "x": 1083.5, + "right": 1120.65625, + "width": 37.15625 + }, + { + "x": 1128.453125, + "right": 1178.609375, + "width": 50.15625 + }, + { + "x": 1183.15625, + "right": 1220.3125, + "width": 37.15625 + } + ] + }, + { + "width": 390, + "height": 844, + "bounds": [ + { + "x": 19.09375, + "right": 75.421875, + "width": 56.328125 + }, + { + "x": 83.21875, + "right": 133.375, + "width": 50.15625 + }, + { + "x": 137.921875, + "right": 175.078125, + "width": 37.15625 + }, + { + "x": 182.875, + "right": 233.03125, + "width": 50.15625 + }, + { + "x": 237.578125, + "right": 274.734375, + "width": 37.15625 + } + ] + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/dialogs/acceptance.report.json b/coverage/glb-machine/dialogs/acceptance.report.json new file mode 100644 index 0000000..34f2638 --- /dev/null +++ b/coverage/glb-machine/dialogs/acceptance.report.json @@ -0,0 +1,106 @@ +{ + "report_id": "glb-machine-dialog-acceptance-v1", + "status": "verified", + "tasks": [ + "GLB-UI01" + ], + "reports": [ + "machine-dialog-browser-v1", + "trt-parametric-browser-v1", + "glb-machine-browser-v1" + ], + "evidence": [ + { + "path": "coverage/glb-machine/dialogs/build.log", + "sha256": "5883edc912a8ceb1e0608166a4b6ec16cfb158eafaeee0d284dce3467699f142" + }, + { + "path": "coverage/glb-machine/dialogs/dialog.log", + "sha256": "9c2ab6a4f4152d3e0c440420ee3477509f4d843a70d126e7972220df1c01107b" + }, + { + "path": "coverage/glb-machine/dialogs/dialog.report.json", + "sha256": "811f5cb6bed5a05bd823f77b27c1901f74246a1e078884936962f0adee1b190b" + }, + { + "path": "coverage/glb-machine/dialogs/geometry-settings-dragged.png", + "sha256": "f82d790dd2ac4bb7da6b3979e2c5a346e5ae63d13bb4c258283f3b1faa50a809" + }, + { + "path": "coverage/glb-machine/dialogs/import/ac-imported.png", + "sha256": "2a5a8bb90b04f4f851cb34384f20a46447e7143e76f9f55d043d0ad114e0c892" + }, + { + "path": "coverage/glb-machine/dialogs/import/bc-imported.png", + "sha256": "cb5af89c38368ca852a4631e9f6c0b0bdfb752974097ac66eaa730bf7eb150ef" + }, + { + "path": "coverage/glb-machine/dialogs/import/browser.report.json", + "sha256": "9309b944fca8ac81e816cf8e5494348db0ca2dd12417763479d78ce5d29df71e" + }, + { + "path": "coverage/glb-machine/dialogs/import/viewport-1440.png", + "sha256": "41a5ac98442141dd498d2c4a50a089d9742d6c3860f48ac609312f0e255d72d9" + }, + { + "path": "coverage/glb-machine/dialogs/import/viewport-390.png", + "sha256": "3522159e686804af938e9f41ffde6bb47ef88444f20a21699bd259db3ce05b0d" + }, + { + "path": "coverage/glb-machine/dialogs/import.log", + "sha256": "f8308922ef1d78fc82ab21081a16b8c369808e662c1ac85ceef03558c2706410" + }, + { + "path": "coverage/glb-machine/dialogs/machine-glb-settings-dragged.png", + "sha256": "22647b7ef24b08d3a3f740b5676c46b00b2bbd4cfa4ec1c035fea0d0c5aaa638" + }, + { + "path": "coverage/glb-machine/dialogs/parameters-1440.png", + "sha256": "d25dbeaf8c77be2227760b9380ea07b4f5f6602cd31e390023a81594e7f97af8" + }, + { + "path": "coverage/glb-machine/dialogs/parameters-2048.png", + "sha256": "12c790e77602658ffa6c9958c3b20aa5fd11b4836026854637e5d883cbfce7e8" + }, + { + "path": "coverage/glb-machine/dialogs/parameters-390.png", + "sha256": "96059425dec8ca423506edff4f88698a9c1579118f8f873626557b9b13d56a0a" + }, + { + "path": "coverage/glb-machine/dialogs/parametric/browser.report.json", + "sha256": "28eb780b7bcbfc94a43226c267868444287069f4a3c4c6ffab256759d439b00b" + }, + { + "path": "coverage/glb-machine/dialogs/parametric/layout-1440.png", + "sha256": "484c683de962a67a3816653568b1abe15930ad060b7778435d8a8c178e7c88d2" + }, + { + "path": "coverage/glb-machine/dialogs/parametric/layout-390.png", + "sha256": "a8e4f79db95aeae82c08d7bbd41db017d96eb863fac20b0de6df455a7ee07a25" + }, + { + "path": "coverage/glb-machine/dialogs/parametric/xyzac-trt-model.png", + "sha256": "6b0f89a3d9f7345a2ac12ff1beb82115e6f957b9b3f0f61766d62f47b8f072fb" + }, + { + "path": "coverage/glb-machine/dialogs/parametric/xyzbc-trt-model.png", + "sha256": "38ed4ba88c7e72d6f30705ef48732ca3d0d9152ee6f17ce8cb8bc86ad3dcfce6" + }, + { + "path": "coverage/glb-machine/dialogs/parametric.log", + "sha256": "6aa0af350b31f8b04e220da964cc0eb62357ef0dddb51390152d5ca0b93a7cf7" + }, + { + "path": "coverage/glb-machine/dialogs/preview-1440.png", + "sha256": "09cdf18a7348a045e153ff7c741ed98cc7eb8a0b492f7c4b4d5953ac3c92b8cb" + }, + { + "path": "coverage/glb-machine/dialogs/preview-2048.png", + "sha256": "ca653f12dafb7b198c58ad3d42bb9531d921adf00fa0fc9dd73cb51d18e42a6e" + }, + { + "path": "coverage/glb-machine/dialogs/preview-390.png", + "sha256": "cf4c4565feaf947cb84dad0d5e3c229d069c5301fed374011cfaf8f388ac72b3" + } + ] +} diff --git a/coverage/glb-machine/dialogs/dialog.report.json b/coverage/glb-machine/dialogs/dialog.report.json new file mode 100644 index 0000000..6918928 --- /dev/null +++ b/coverage/glb-machine/dialogs/dialog.report.json @@ -0,0 +1,125 @@ +{ + "report_id": "machine-dialog-browser-v1", + "status": "verified", + "layouts": [ + { + "width": 2048, + "height": 859, + "machine": { + "x": 1358.171875, + "y": 489.5, + "width": 679.828125, + "height": 351.5 + }, + "path": { + "x": 674.34375, + "y": 449.5, + "width": 679.828125, + "height": 391.5 + }, + "pane": { + "x": 1358.171875, + "y": 449.5, + "width": 679.828125, + "height": 391.5 + } + }, + { + "width": 1440, + "height": 900, + "machine": { + "x": 955.578125, + "y": 489.5, + "width": 474.421875, + "height": 392.5 + }, + "path": { + "x": 477.15625, + "y": 449.5, + "width": 474.421875, + "height": 432.5 + }, + "pane": { + "x": 955.578125, + "y": 449.5, + "width": 474.421875, + "height": 432.5 + } + }, + { + "width": 390, + "height": 844, + "machine": { + "x": 10, + "y": 231.5, + "width": 370, + "height": 380 + }, + "path": { + "x": 10, + "y": -172.5, + "width": 370, + "height": 360 + }, + "pane": { + "x": 10, + "y": 191.5, + "width": 370, + "height": 420 + } + } + ], + "dialogs": [ + { + "button": "machine-glb-settings", + "before": { + "x": 430, + "y": 357.296875, + "width": 580, + "height": 185.40625 + }, + "after": { + "x": 540, + "y": 417.296875, + "width": 580, + "height": 185.40625 + }, + "focus_contained": true, + "keyboard_ignored": true, + "edge_clamped": true + }, + { + "button": "geometry-settings", + "before": { + "x": 430, + "y": 300.25, + "width": 580, + "height": 299.5 + }, + "after": { + "x": 540, + "y": 360.25, + "width": 580, + "height": 299.5 + }, + "focus_contained": true, + "keyboard_ignored": true, + "edge_clamped": true + } + ], + "touch_drag": { + "before": { + "x": 8, + "y": 329.296875, + "width": 374, + "height": 185.40625 + }, + "after": { + "x": 8, + "y": 379.296875, + "width": 374, + "height": 185.40625 + } + }, + "browser_errors": [] +} diff --git a/coverage/glb-machine/dialogs/geometry-settings-dragged.png b/coverage/glb-machine/dialogs/geometry-settings-dragged.png new file mode 100644 index 0000000..ef55f99 Binary files /dev/null and b/coverage/glb-machine/dialogs/geometry-settings-dragged.png differ diff --git a/coverage/glb-machine/dialogs/import/ac-imported.png b/coverage/glb-machine/dialogs/import/ac-imported.png new file mode 100644 index 0000000..77a6ad2 Binary files /dev/null and b/coverage/glb-machine/dialogs/import/ac-imported.png differ diff --git a/coverage/glb-machine/dialogs/import/bc-imported.png b/coverage/glb-machine/dialogs/import/bc-imported.png new file mode 100644 index 0000000..13be3ad Binary files /dev/null and b/coverage/glb-machine/dialogs/import/bc-imported.png differ diff --git a/coverage/glb-machine/dialogs/import/browser.report.json b/coverage/glb-machine/dialogs/import/browser.report.json new file mode 100644 index 0000000..0cb5230 --- /dev/null +++ b/coverage/glb-machine/dialogs/import/browser.report.json @@ -0,0 +1,982 @@ +{ + "report_id": "glb-machine-browser-v1", + "status": "verified", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "parser": [ + { + "id": "ac", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + }, + { + "id": "bc", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + } + ], + "machines": [ + { + "id": "ac", + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "offsets": { + "x_rot_point": 24, + "x_offset": 0, + "y_rot_point": -12, + "y_offset": 18, + "z_rot_point": 8, + "z_offset": -45 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.1933397187179203e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.1599919653272043e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 2.486410087150353e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.709648974837069e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.3472894910096233e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.1354490689426183e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 2.036065864674698e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 2.482534153247273e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3877787807814457e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 9.508199615517185e-17 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 1.9141791241147513e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 2.2591401799415137e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1857187100668868e-16 + } + ], + "jogs": [ + { + "axis": "a", + "before": { + "joints": [ + 4.466649999999994, + 4.066650000000003, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04466649999999994, + 9.02977692618379e-18, + 0.04066650000000002 + ], + "tick": 61, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 4.466649999999994, + 0.20968795268657026, + -0.40477997583241176, + 6.000000000000007, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04466649999999994, + -0.0040477997583241165, + 0.0020968795268657033 + ], + "tick": 96, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 1.0148132334464322e-16, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 4.466649999999994, + 0.20968795268657026, + -0.40477997583241176, + 6.000000000000007, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.04466649999999994, + -0.0040477997583241165, + 0.0020968795268657033 + ], + "tick": 96, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 2.7494471200932686, + -2.1290148625374243, + -0.650587546740212, + 6.000000000000007, + 6.600000000000012 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.027494471200932687, + -0.006505875467402124, + -0.021290148625374247 + ], + "tick": 133, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 7.666221752544845e-17, + "render_error": 0 + }, + { + "axis": "a", + "before": { + "joints": [ + 2.7494471200932686, + -2.1290148625374243, + -0.650587546740212, + 6.000000000000007, + 6.600000000000012 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.027494471200932687, + -0.006505875467402124, + -0.021290148625374247 + ], + "tick": 133, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 2.7494471200932686, + -4.955897853959007, + -1.4004358096033798, + 10.500000000000002, + 6.600000000000012 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.027494471200932687, + -0.014004358096033807, + -0.04955897853959007 + ], + "tick": 163, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 6.938893903907228e-18, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 2.7494471200932686, + -4.955897853959007, + -1.4004358096033798, + 10.500000000000002, + 6.600000000000012 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.027494471200932687, + -0.014004358096033807, + -0.04955897853959007 + ], + "tick": 163, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 1.3727669510375335, + -7.330203467035044, + -1.8404873443064815, + 10.500000000000002, + 12.900000000000022 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.013727669510375335, + -0.018404873443064833, + -0.07330203467035044 + ], + "tick": 199, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 8.464668479171608e-17, + "render_error": 0 + } + ], + "pixels": { + "colors": 1415, + "width": 472, + "height": 586 + }, + "worker_derived_offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "id": "bc", + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "offsets": { + "x_rot_point": -18, + "x_offset": 22, + "y_rot_point": 14, + "y_offset": 0, + "z_rot_point": 12, + "z_offset": -40 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.1188630228279524e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.3672438525262642e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.3714374201337736e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 1.0007415106216802e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.1443916996305594e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.3951318755036565e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 1.5700924586837752e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 0 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 1.4756369957997185e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 2.7755575615628914e-17 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1102230246251565e-16 + } + ], + "jogs": [ + { + "axis": "b", + "before": { + "joints": [ + 4.2666499999999985, + 3.0666500000000028, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.04266649999999998, + 6.809330876933479e-18, + 0.030666500000000027 + ], + "tick": 254, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 6.316603424925585, + 3.0666500000000028, + -0.09472360297925775, + 4.199999999999992, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06316603424925585, + -0.0009472360297925706, + 0.030666500000000027 + ], + "tick": 283, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 1.909704485889413e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 6.316603424925585, + 3.0666500000000028, + -0.09472360297925775, + 4.199999999999992, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06316603424925585, + -0.0009472360297925706, + 0.030666500000000027 + ], + "tick": 283, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 7.151143087525739, + 4.968220047559935, + -0.15600836492358994, + 4.199999999999992, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.07151143087525738, + -0.0015600836492358884, + 0.04968220047559935 + ], + "tick": 314, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 4.4565853017184997e-17, + "render_error": 0 + }, + { + "axis": "b", + "before": { + "joints": [ + 7.151143087525739, + 4.968220047559935, + -0.15600836492358994, + 4.199999999999992, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.07151143087525738, + -0.0015600836492358884, + 0.04968220047559935 + ], + "tick": 314, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 9.32604357016951, + 4.968220047559935, + -0.4890779358284192, + 8.699999999999987, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.0932604357016951, + -0.004890779358284181, + 0.04968220047559935 + ], + "tick": 344, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 1.187272171697316e-16, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 9.32604357016951, + 4.968220047559935, + -0.4890779358284192, + 8.699999999999987, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.0932604357016951, + -0.004890779358284181, + 0.04968220047559935 + ], + "tick": 344, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 9.993012880413737, + 6.933141542161293, + -0.5911385821243442, + 8.699999999999987, + 9.599999999999994 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09993012880413737, + -0.0059113858212434265, + 0.06933141542161293 + ], + "tick": 380, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 1.0318688768540417e-16, + "render_error": 0 + } + ], + "pixels": { + "colors": 1365, + "width": 472, + "height": 586 + }, + "worker_derived_offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1100, + "bounds": [ + { + "x": 969, + "right": 999, + "width": 30 + }, + { + "x": 445, + "right": 513.625, + "width": 68.625 + }, + { + "x": 521.421875, + "right": 582.109375, + "width": 60.6875 + }, + { + "x": 586.65625, + "right": 634.34375, + "width": 47.6875 + }, + { + "x": 642.140625, + "right": 702.828125, + "width": 60.6875 + }, + { + "x": 707.375, + "right": 755.0625, + "width": 47.6875 + } + ] + }, + { + "width": 390, + "height": 844, + "bounds": [ + { + "x": 341, + "right": 371, + "width": 30 + }, + { + "x": 23, + "right": 91.625, + "width": 68.625 + }, + { + "x": 99.421875, + "right": 160.109375, + "width": 60.6875 + }, + { + "x": 164.65625, + "right": 212.34375, + "width": 47.6875 + }, + { + "x": 220.140625, + "right": 280.828125, + "width": 60.6875 + }, + { + "x": 285.375, + "right": 333.0625, + "width": 47.6875 + } + ] + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/dialogs/import/viewport-1440.png b/coverage/glb-machine/dialogs/import/viewport-1440.png new file mode 100644 index 0000000..144ee07 Binary files /dev/null and b/coverage/glb-machine/dialogs/import/viewport-1440.png differ diff --git a/coverage/glb-machine/dialogs/import/viewport-390.png b/coverage/glb-machine/dialogs/import/viewport-390.png new file mode 100644 index 0000000..73eea76 Binary files /dev/null and b/coverage/glb-machine/dialogs/import/viewport-390.png differ diff --git a/coverage/glb-machine/dialogs/machine-glb-settings-dragged.png b/coverage/glb-machine/dialogs/machine-glb-settings-dragged.png new file mode 100644 index 0000000..42ff7d1 Binary files /dev/null and b/coverage/glb-machine/dialogs/machine-glb-settings-dragged.png differ diff --git a/coverage/glb-machine/dialogs/parameters-1440.png b/coverage/glb-machine/dialogs/parameters-1440.png new file mode 100644 index 0000000..9a52124 Binary files /dev/null and b/coverage/glb-machine/dialogs/parameters-1440.png differ diff --git a/coverage/glb-machine/dialogs/parameters-2048.png b/coverage/glb-machine/dialogs/parameters-2048.png new file mode 100644 index 0000000..83d98c7 Binary files /dev/null and b/coverage/glb-machine/dialogs/parameters-2048.png differ diff --git a/coverage/glb-machine/dialogs/parameters-390.png b/coverage/glb-machine/dialogs/parameters-390.png new file mode 100644 index 0000000..f8d436c Binary files /dev/null and b/coverage/glb-machine/dialogs/parameters-390.png differ diff --git a/coverage/glb-machine/dialogs/parametric/browser.report.json b/coverage/glb-machine/dialogs/parametric/browser.report.json new file mode 100644 index 0000000..12ef9f5 --- /dev/null +++ b/coverage/glb-machine/dialogs/parametric/browser.report.json @@ -0,0 +1,73 @@ +{ + "report_id": "trt-parametric-browser-v1", + "status": "verified", + "machines": [ + { + "id": "xyzac-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "export_bytes": 4867, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "canvas": { + "hash": 3797953256, + "colors": 2383, + "width": 472, + "height": 491 + } + }, + { + "id": "xyzbc-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "export_bytes": 4875, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc", + "canvas": { + "hash": 1876807854, + "colors": 2446, + "width": 472, + "height": 491 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1000, + "canvas": { + "hash": 518020959, + "colors": 2516, + "width": 472, + "height": 491 + }, + "controls_fit": true, + "interactive": true + }, + { + "width": 390, + "height": 844, + "canvas": { + "hash": 287810572, + "colors": 1808, + "width": 368, + "height": 378 + }, + "controls_fit": true, + "interactive": true + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/dialogs/parametric/layout-1440.png b/coverage/glb-machine/dialogs/parametric/layout-1440.png new file mode 100644 index 0000000..478fb87 Binary files /dev/null and b/coverage/glb-machine/dialogs/parametric/layout-1440.png differ diff --git a/coverage/glb-machine/dialogs/parametric/layout-390.png b/coverage/glb-machine/dialogs/parametric/layout-390.png new file mode 100644 index 0000000..ad8aa54 Binary files /dev/null and b/coverage/glb-machine/dialogs/parametric/layout-390.png differ diff --git a/coverage/glb-machine/dialogs/parametric/xyzac-trt-model.png b/coverage/glb-machine/dialogs/parametric/xyzac-trt-model.png new file mode 100644 index 0000000..b6bef21 Binary files /dev/null and b/coverage/glb-machine/dialogs/parametric/xyzac-trt-model.png differ diff --git a/coverage/glb-machine/dialogs/parametric/xyzbc-trt-model.png b/coverage/glb-machine/dialogs/parametric/xyzbc-trt-model.png new file mode 100644 index 0000000..38baa91 Binary files /dev/null and b/coverage/glb-machine/dialogs/parametric/xyzbc-trt-model.png differ diff --git a/coverage/glb-machine/dialogs/preview-1440.png b/coverage/glb-machine/dialogs/preview-1440.png new file mode 100644 index 0000000..edd9a5e Binary files /dev/null and b/coverage/glb-machine/dialogs/preview-1440.png differ diff --git a/coverage/glb-machine/dialogs/preview-2048.png b/coverage/glb-machine/dialogs/preview-2048.png new file mode 100644 index 0000000..4e1238e Binary files /dev/null and b/coverage/glb-machine/dialogs/preview-2048.png differ diff --git a/coverage/glb-machine/dialogs/preview-390.png b/coverage/glb-machine/dialogs/preview-390.png new file mode 100644 index 0000000..1fc4c7f Binary files /dev/null and b/coverage/glb-machine/dialogs/preview-390.png differ diff --git a/coverage/glb-machine/gantry/ac-gantry.png b/coverage/glb-machine/gantry/ac-gantry.png new file mode 100644 index 0000000..ed7555d Binary files /dev/null and b/coverage/glb-machine/gantry/ac-gantry.png differ diff --git a/coverage/glb-machine/gantry/ac.png b/coverage/glb-machine/gantry/ac.png new file mode 100644 index 0000000..d22df23 Binary files /dev/null and b/coverage/glb-machine/gantry/ac.png differ diff --git a/coverage/glb-machine/gantry/acceptance.report.json b/coverage/glb-machine/gantry/acceptance.report.json new file mode 100644 index 0000000..0593ab0 --- /dev/null +++ b/coverage/glb-machine/gantry/acceptance.report.json @@ -0,0 +1,210 @@ +{ + "report_id": "gantry-machine-acceptance-v1", + "status": "verified", + "tasks": [ + "GLB-GAN01" + ], + "models": [ + { + "id": "ac", + "label": "AC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-ac-xyz-head.glb", + "urdf": "demo-ac-xyz-head.urdf", + "bytes": 530848, + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + { + "id": "bc", + "label": "BC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-bc-xyz-head.glb", + "urdf": "demo-bc-xyz-head.urdf", + "bytes": 530532, + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + { + "id": "ac-gantry", + "label": "AC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-ac-gantry.glb", + "urdf": "demo-ac-gantry.urdf", + "bytes": 526004, + "sha256": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + }, + { + "id": "bc-gantry", + "label": "BC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-bc-gantry.glb", + "urdf": "demo-bc-gantry.urdf", + "bytes": 525688, + "sha256": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + } + ], + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "evidence": [ + { + "path": "coverage/glb-machine/gantry/ac-gantry.png", + "sha256": "0c424b5b09d312a58146f5da9c6b75a307e9e680dcff873bf3757b677c923526" + }, + { + "path": "coverage/glb-machine/gantry/ac.png", + "sha256": "2267e76cde1bb9db038cfee59992d0c06cedb8a9879b0b6b04b66c5c56d576c7" + }, + { + "path": "coverage/glb-machine/gantry/bc-gantry.png", + "sha256": "90235681b06b7c647c3a2b85c564f5ce2218e2d74ae14429de16d3f07a9b6fee" + }, + { + "path": "coverage/glb-machine/gantry/bc.png", + "sha256": "f8c60fb173f8cc22dcb1f44da3c214a00ee2c401100e5536fabccc8d0d1904c3" + }, + { + "path": "coverage/glb-machine/gantry/build.log", + "sha256": "efaa9a77221bdf4dd1a94be96cf9095a5e92ae9d0da7c1644888bd4d2b8a35aa" + }, + { + "path": "coverage/glb-machine/gantry/catalog.log", + "sha256": "0381047251d0782a32175f9498e8a2c8edaf3697f3b6ae3c50585a4fd79df0ba" + }, + { + "path": "coverage/glb-machine/gantry/catalog.report.json", + "sha256": "1af2d3449aaff6e62d452f7a8b1b81fde664175d4102ab0119709aeec9fd8124" + }, + { + "path": "coverage/glb-machine/gantry/dialog-1440.png", + "sha256": "579704e84be183da2b6086ec706dbcbbb27bff7075b25730c1932e4aa84d40a5" + }, + { + "path": "coverage/glb-machine/gantry/dialog-390.png", + "sha256": "6b95d18157a075e7b2cb17f167c9900df0cf1a09715ba15ec8de30a1b160a36b" + }, + { + "path": "coverage/glb-machine/gantry/generation.log", + "sha256": "7d18176ee974965d1fbe0a3c27f57e340d996eb476b8b5d81e5378b7ff5709e9" + }, + { + "path": "coverage/glb-machine/gantry/geometry/ac-edited.png", + "sha256": "ccaca95b9a9074011a06177e87ca1aaff5b49385f3851873e3d218126cf5d532" + }, + { + "path": "coverage/glb-machine/gantry/geometry/bc-edited.png", + "sha256": "9393dde053559491535f43338de29eac2eb0b6379395f491fc4ef027537dd808" + }, + { + "path": "coverage/glb-machine/gantry/geometry/browser.report.json", + "sha256": "fd68f0041ad8ed904be3cb85ca2f9b5a01c0928043c9d3104012c109193ba50d" + }, + { + "path": "coverage/glb-machine/gantry/geometry.log", + "sha256": "cae26be9c602ce9e81837e59f73aa7d42cafdd7dbfc10c3c1fff567ee0df607b" + }, + { + "path": "coverage/glb-machine/gantry/gltf-validation.report.json", + "sha256": "d0ac233f7aafe1f92073410fa6744a8640fbbbd9a8d9c8875edf37b5b4cf0772" + }, + { + "path": "coverage/glb-machine/gantry/motion.log", + "sha256": "57ed59ba66d43ff00784733a3ddb7a0c3936c33aae0e03ab3c4fd4c2eacca361" + }, + { + "path": "coverage/glb-machine/gantry/motion.report.json", + "sha256": "91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626" + }, + { + "path": "coverage/glb-machine/gantry/reproducibility.report.json", + "sha256": "02d19f1ac767467e1f6871c40d2ed1ba1ee54bcee6781b5b984b1fbfcc9084e9" + }, + { + "path": "coverage/glb-machine/gantry/validation.log", + "sha256": "e50555ddaccc33857eefa72a06cd3846f92fb00a9e05170d457169e4201e3852" + } + ] +} diff --git a/coverage/glb-machine/gantry/bc-gantry.png b/coverage/glb-machine/gantry/bc-gantry.png new file mode 100644 index 0000000..a291c6c Binary files /dev/null and b/coverage/glb-machine/gantry/bc-gantry.png differ diff --git a/coverage/glb-machine/gantry/bc.png b/coverage/glb-machine/gantry/bc.png new file mode 100644 index 0000000..db2eeca Binary files /dev/null and b/coverage/glb-machine/gantry/bc.png differ diff --git a/coverage/glb-machine/gantry/catalog.report.json b/coverage/glb-machine/gantry/catalog.report.json new file mode 100644 index 0000000..0b6ecc5 --- /dev/null +++ b/coverage/glb-machine/gantry/catalog.report.json @@ -0,0 +1,507 @@ +{ + "report_id": "gantry-machine-browser-v1", + "status": "verified", + "examples": [ + { + "entry": { + "id": "ac", + "label": "AC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-ac-xyz-head.glb", + "urdf": "demo-ac-xyz-head.urdf", + "bytes": 530848, + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + "profile": "trt-xyz-head/1", + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "tool": "spindle_head", + "initial": [], + "moved": [], + "rejections": [] + }, + { + "entry": { + "id": "bc", + "label": "BC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-bc-xyz-head.glb", + "urdf": "demo-bc-xyz-head.urdf", + "bytes": 530532, + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + "profile": "trt-xyz-head/1", + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "tool": "spindle_head", + "initial": [], + "moved": [], + "rejections": [] + }, + { + "entry": { + "id": "ac-gantry", + "label": "AC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-ac-gantry.glb", + "urdf": "demo-ac-gantry.urdf", + "bytes": 526004, + "sha256": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + }, + "profile": "trt-xyz-gantry/1", + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "tool": "z_slide", + "initial": [ + { + "name": "gantry_z_ram_59", + "parent": "z_slide", + "position": [ + 0, + 3.65, + 0.1999999999999992 + ] + }, + { + "name": "gantry_y_carriage_55", + "parent": "y_slide", + "position": [ + 0, + 5, + -1.1102230246251565e-15 + ] + }, + { + "name": "moving_bridge_chord_45", + "parent": "x_slide", + "position": [ + 0, + 5.5, + -1.2212453270876722e-15 + ] + }, + { + "name": "moving_bridge_chord_46", + "parent": "x_slide", + "position": [ + 0, + 6.5, + -1.4432899320127035e-15 + ] + }, + { + "name": "gantry_post_11", + "parent": "base", + "position": [ + -3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_13", + "parent": "base", + "position": [ + -3.8, + 0.5000000000000007, + 3.2 + ] + }, + { + "name": "gantry_post_15", + "parent": "base", + "position": [ + 3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_17", + "parent": "base", + "position": [ + 3.8, + 0.5000000000000007, + 3.2 + ] + } + ], + "moved": [ + { + "name": "gantry_z_ram_59", + "parent": "z_slide", + "position": [ + 0.2, + 3.6999999999999997, + 0.2999999999999992 + ] + }, + { + "name": "gantry_y_carriage_55", + "parent": "y_slide", + "position": [ + 0.2, + 5, + 0.0999999999999989 + ] + }, + { + "name": "moving_bridge_chord_45", + "parent": "x_slide", + "position": [ + 0.2, + 5.5, + -1.2212453270876722e-15 + ] + }, + { + "name": "moving_bridge_chord_46", + "parent": "x_slide", + "position": [ + 0.2, + 6.5, + -1.4432899320127035e-15 + ] + }, + { + "name": "gantry_post_11", + "parent": "base", + "position": [ + -3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_13", + "parent": "base", + "position": [ + -3.8, + 0.5000000000000007, + 3.2 + ] + }, + { + "name": "gantry_post_15", + "parent": "base", + "position": [ + 3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_17", + "parent": "base", + "position": [ + 3.8, + 0.5000000000000007, + 3.2 + ] + } + ], + "rejections": [ + "wrong-tool", + "wrong-profile", + "rotary-on-xyz" + ] + }, + { + "entry": { + "id": "bc-gantry", + "label": "BC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-bc-gantry.glb", + "urdf": "demo-bc-gantry.urdf", + "bytes": 525688, + "sha256": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + }, + "profile": "trt-xyz-gantry/1", + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "tool": "z_slide", + "initial": [ + { + "name": "gantry_z_ram_59", + "parent": "z_slide", + "position": [ + 0, + 3.65, + 0.1999999999999992 + ] + }, + { + "name": "gantry_y_carriage_55", + "parent": "y_slide", + "position": [ + 0, + 5, + -1.1102230246251565e-15 + ] + }, + { + "name": "moving_bridge_chord_45", + "parent": "x_slide", + "position": [ + 0, + 5.5, + -1.2212453270876722e-15 + ] + }, + { + "name": "moving_bridge_chord_46", + "parent": "x_slide", + "position": [ + 0, + 6.5, + -1.4432899320127035e-15 + ] + }, + { + "name": "gantry_post_11", + "parent": "base", + "position": [ + -3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_13", + "parent": "base", + "position": [ + -3.8, + 0.5000000000000007, + 3.2 + ] + }, + { + "name": "gantry_post_15", + "parent": "base", + "position": [ + 3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_17", + "parent": "base", + "position": [ + 3.8, + 0.5000000000000007, + 3.2 + ] + } + ], + "moved": [ + { + "name": "gantry_z_ram_59", + "parent": "z_slide", + "position": [ + 0.2, + 3.6999999999999997, + 0.2999999999999992 + ] + }, + { + "name": "gantry_y_carriage_55", + "parent": "y_slide", + "position": [ + 0.2, + 5, + 0.0999999999999989 + ] + }, + { + "name": "moving_bridge_chord_45", + "parent": "x_slide", + "position": [ + 0.2, + 5.5, + -1.2212453270876722e-15 + ] + }, + { + "name": "moving_bridge_chord_46", + "parent": "x_slide", + "position": [ + 0.2, + 6.5, + -1.4432899320127035e-15 + ] + }, + { + "name": "gantry_post_11", + "parent": "base", + "position": [ + -3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_13", + "parent": "base", + "position": [ + -3.8, + 0.5000000000000007, + 3.2 + ] + }, + { + "name": "gantry_post_15", + "parent": "base", + "position": [ + 3.8, + 0.4999999999999993, + -3.2 + ] + }, + { + "name": "gantry_post_17", + "parent": "base", + "position": [ + 3.8, + 0.5000000000000007, + 3.2 + ] + } + ], + "rejections": [ + "wrong-tool", + "wrong-profile", + "rotary-on-xyz" + ] + } + ], + "layouts": [ + { + "width": 1440, + "height": 1000, + "controls": 10 + }, + { + "width": 390, + "height": 844, + "controls": 10 + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/gantry/dialog-1440.png b/coverage/glb-machine/gantry/dialog-1440.png new file mode 100644 index 0000000..6656caf Binary files /dev/null and b/coverage/glb-machine/gantry/dialog-1440.png differ diff --git a/coverage/glb-machine/gantry/dialog-390.png b/coverage/glb-machine/gantry/dialog-390.png new file mode 100644 index 0000000..f682d92 Binary files /dev/null and b/coverage/glb-machine/gantry/dialog-390.png differ diff --git a/coverage/glb-machine/gantry/geometry/ac-edited.png b/coverage/glb-machine/gantry/geometry/ac-edited.png new file mode 100644 index 0000000..4134b55 Binary files /dev/null and b/coverage/glb-machine/gantry/geometry/ac-edited.png differ diff --git a/coverage/glb-machine/gantry/geometry/bc-edited.png b/coverage/glb-machine/gantry/geometry/bc-edited.png new file mode 100644 index 0000000..8be2b11 Binary files /dev/null and b/coverage/glb-machine/gantry/geometry/bc-edited.png differ diff --git a/coverage/glb-machine/gantry/geometry/browser.report.json b/coverage/glb-machine/gantry/geometry/browser.report.json new file mode 100644 index 0000000..86e998b --- /dev/null +++ b/coverage/glb-machine/gantry/geometry/browser.report.json @@ -0,0 +1,191 @@ +{ + "report_id": "imported-geometry-browser-v1", + "status": "verified", + "machines": [ + { + "id": "ac", + "original": { + "hash": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "filename": "demo-ac-gantry.glb", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "applied": { + "hash": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "filename": "demo-ac-gantry.glb", + "offsets": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 0, + "y_offset": 23, + "z_offset": -34, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "edits": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 0, + "y_offset": 23, + "z_offset": -34 + }, + "projection": { + "checks": [ + 2.7755575615628914e-17, + 3.2959746043559335e-17, + 2.1942709178604383e-17, + 2.3263411494723067e-16, + 1.716587549445839e-16, + 1.3877787807814457e-16, + 3.925231146709438e-17, + 7.473417450352271e-17, + 3.7367087251761353e-17, + 1.979582157258511e-16, + 1.6711069443220838e-16, + 6.206335383118183e-17, + 2.7755575615628914e-17, + 6.369057972232327e-17, + 2.0816681711721685e-17, + 3.194906681775283e-16, + 6.206335383118183e-17, + 5.551115123125783e-17 + ], + "mesh_count": 90, + "source_preserved": true, + "renamed_joint_supported": true, + "incompatible_rejected": true + }, + "tcpError": { + "error": 1.939479807224432e-17, + "rendered": 0 + }, + "model_retained_on_reload_and_ini_import": true + }, + { + "id": "bc", + "original": { + "hash": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "filename": "demo-bc-gantry.glb", + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "applied": { + "hash": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "filename": "demo-bc-gantry.glb", + "offsets": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 27, + "y_offset": 0, + "z_offset": -34, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "edits": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 27, + "y_offset": 0, + "z_offset": -34 + }, + "projection": { + "checks": [ + 5.551115123125783e-17, + 0, + 1.1123893155135927e-16, + 9.205483015737869e-17, + 1.2118257228641695e-16, + 1.2719202621569003e-16, + 6.798699777552591e-17, + 1.1443916996305594e-16, + 1.2177709378935645e-16, + 1.55941895632402e-16, + 3.469446951953614e-17, + 5.551115123125783e-17, + 5.551115123125783e-17, + 0, + 1.1102230246251565e-16, + 1.4703252574089423e-16, + 1.1857187100668868e-16, + 5.003707553108401e-17 + ], + "mesh_count": 90, + "source_preserved": true, + "renamed_joint_supported": true, + "incompatible_rejected": true + }, + "tcpError": { + "error": 6.636893469679434e-17, + "rendered": 0 + }, + "model_retained_on_reload_and_ini_import": true + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/gantry/gltf-validation.report.json b/coverage/glb-machine/gantry/gltf-validation.report.json new file mode 100644 index 0000000..6a0aef0 --- /dev/null +++ b/coverage/glb-machine/gantry/gltf-validation.report.json @@ -0,0 +1,2091 @@ +{ + "report_id": "glb-machine-khronos-validation-v1", + "validator": "2.0.0-dev.3.10", + "status": "verified", + "reports": [ + { + "id": "ac", + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "uri": "demo-ac-xyz-head.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T03:56:36.759Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 71, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 455536 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 71, + "totalVertexCount": 12692, + "totalTriangleCount": 8232, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + }, + { + "id": "bc", + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "uri": "demo-bc-xyz-head.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T03:56:36.779Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 71, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 455536 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 71, + "totalVertexCount": 12692, + "totalTriangleCount": 8232, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + }, + { + "id": "ac-gantry", + "sha256": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "uri": "demo-ac-gantry.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T03:56:36.802Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 89, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/71/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/72/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/73/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/74/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/75/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/76/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/77/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/78/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/79/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/80/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/81/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/82/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/83/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/84/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/85/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/86/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/87/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/88/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 432032 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 89, + "totalVertexCount": 12052, + "totalTriangleCount": 7728, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + }, + { + "id": "bc-gantry", + "sha256": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "uri": "demo-bc-gantry.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T03:56:36.822Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 89, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/71/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/72/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/73/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/74/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/75/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/76/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/77/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/78/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/79/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/80/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/81/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/82/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/83/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/84/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/85/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/86/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/87/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/88/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 432032 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 89, + "totalVertexCount": 12052, + "totalTriangleCount": 7728, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + } + ] +} diff --git a/coverage/glb-machine/gantry/motion.report.json b/coverage/glb-machine/gantry/motion.report.json new file mode 100644 index 0000000..f199a69 --- /dev/null +++ b/coverage/glb-machine/gantry/motion.report.json @@ -0,0 +1,2544 @@ +{ + "report_id": "glb-machine-five-axis-motion-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 A0 C0\nM428\nG1 X35 Y24 Z32 A25 C40 F900\nG1 X24 Y16 Z24 A-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.2591401799415137e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0.22968749999999996, + "b": 0, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.99595803736646, + 9.874421474017172, + 20.12624077439751, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 1.3545395528575301, + "b": 0, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.95434701862283, + 9.257647365906834, + 20.743322191952068, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 2.9321764100262997, + "b": 0, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.833124292093828, + 8.384734865389902, + 21.60616083887203, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 4.50981326719507, + "b": 0, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.635609460598403, + 7.49750341711335, + 22.46657440661184, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 6.087450124363804, + "b": 0, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.358888206816445, + 6.590046034574037, + 23.324707443401806, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 7.6650869815325375, + "b": 0, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.000370067347152, + 5.656262521201651, + 24.180057881811884, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 9.24272383870132, + "b": 0, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.55779952899828, + 4.689923242944772, + 25.031455090743655, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 10.820360695870146, + "b": 0, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.029266133103974, + 3.684734977856124, + 25.87704364402046, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 12.397997553038973, + "b": 0, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.413213557148122, + 2.6344083490822943, + 26.714272981080555, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 13.9756344102078, + "b": 0, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 16.70844764564024, + 1.5327263336594292, + 27.539893093834166, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 15.553271267376624, + "b": 0, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.914143364935367, + 0.3736133289244634, + 28.349956331230942, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 17.130908124545453, + "b": 0, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.029850659501848, + -0.8487957487481985, + 29.139825369774186, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 18.70854498171428, + "b": 0, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.055499190014691, + -2.1400868617254467, + 29.904187354395702, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 20.286181838883106, + "b": 0, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.991401936579638, + -3.5054992742176942, + 30.63707417005608, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 21.86381869605193, + "b": 0, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.838257653368174, + -4.94985952588366, + 31.331888760448635, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 23.441455553220756, + "b": 0, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.597152163957437, + -6.4775174739041965, + 31.981437366549414, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 24.321021033301516, + "b": 0, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 9.87102928781642, + -7.245549872434104, + 32.49414794112097, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 23.33197857142857, + "b": 0, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.726007873637807, + -5.788403985078261, + 32.73730577435077, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 21.412857142857153, + "b": 0, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.36203653051712, + -3.231075744959096, + 32.8109269608977, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 19.484285714285733, + "b": 0, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.980580242285733, + -0.7404921771841426, + 32.766464373464416, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 17.555714285714313, + "b": 0, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.570237107614947, + 1.6675534613501029, + 32.61200452902207, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 15.627142857142896, + "b": 0, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.127951943791736, + 3.9908139847170325, + 32.35623658379197, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 13.698571428571476, + "b": 0, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.650908000145666, + 6.227777163216452, + 32.00772085126978, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 11.769999999999937, + "b": 0, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.136530696440413, + 8.377631103821685, + 31.574829328143053, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 9.841428571428393, + "b": 0, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 21.58249029485251, + 10.440225044744565, + 31.065690883131552, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 7.912857142856847, + "b": 0, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.98670351023294, + 12.416026099775472, + 30.488141447935618, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 5.984285714285303, + "b": 0, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.347334067326027, + 14.306072511605354, + 29.849679492514724, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 4.0557142857137585, + "b": 0, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 25.662792217542528, + 16.11192399109913, + 29.157427008482472, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 2.1271428571422213, + "b": 0, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.931733231731258, + 17.835609731385446, + 28.418096165068704, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0.19857142857092924, + "b": 0, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.153054889154856, + 19.479574691642114, + 27.637961742435337, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": -1.7300000000003664, + "b": 0, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 29.325893986537977, + 21.046624745627106, + 26.822839387706722, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": -3.658571428571655, + "b": 0, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.449621894603986, + 22.539871284416392, + 25.978069680451114, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": -5.587142857142947, + "b": 0, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.523839192945253, + 23.962675851616893, + 25.10850793706433, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": -7.515714285714239, + "b": 0, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.54836941735962, + 25.318595372704934, + 24.218519628094157, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": -9.444285714285535, + "b": 0, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.52325195693044, + 26.611328518350824, + 23.3119812294998, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": -11.372857142856823, + "b": 0, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.44873414111287, + 27.844663714910965, + 22.392286278641734, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": -13.301428571428119, + "b": 0, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.32526255990824, + 29.022429284032476, + 21.462356358884456, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": -15.229999999999407, + "b": 0, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.153473662849684, + 30.14844615789012, + 20.52465669347393, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": -17.158571428570703, + "b": 0, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.93418368497938, + 31.226483577368235, + 19.581215990188582, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": -18.953399243412633, + "b": 0, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.61894079573156, + 32.189885304600296, + 18.699467974539928, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": -19.89197603358788, + "b": 0, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.961283259435376, + 32.679365598067484, + 18.237296989685753, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": -20.000000000000007, + "b": 0, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38, + 32.735096646501916, + 18.184064731473775, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + } + ] + }, + { + "coordinates": "XYZBC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 B0 C0\nM428\nG1 X35 Y24 Z32 B25 C40 F900\nG1 X24 Y16 Z24 B-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.482534153247273e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0, + "b": 0.22968749999999996, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.354593296251238, + 10.373322128693975, + 20.04507388460101, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 0, + "b": 1.3545395528575301, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.052857860352518, + 12.228636167480964, + 20.236907267739767, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 0, + "b": 2.9321764100262997, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.32300426056765, + 14.901846411100632, + 20.43125264026292, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 0, + "b": 4.50981326719507, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.4556677943976, + 17.65004041307935, + 20.54933931906639, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 0, + "b": 6.087450124363804, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.44416333968364, + 20.46409437567004, + 20.603831134243293, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 0, + "b": 7.6650869815325375, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.283044229288166, + 23.33461513801611, + 20.607876567489022, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 0, + "b": 9.24272383870132, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.968141666787204, + 26.251966035450025, + 20.575002547782745, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 0, + "b": 10.820360695870146, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.496595270790735, + 29.206293491231953, + 20.519005173143277, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 0, + "b": 12.397997553038973, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.86687451233006, + 32.18755427381161, + 20.45383808115305, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 0, + "b": 13.9756344102078, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.07879086779993, + 35.18554335093002, + 20.39349920852434, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 0, + "b": 15.553271267376624, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.13350056927484, + 38.18992227027549, + 20.35191669295199, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 0, + "b": 17.130908124545453, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.033497894267676, + 41.19024799497426, + 20.342834678764525, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 0, + "b": 18.70854498171428, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.7825989977975, + 44.17600212093312, + 20.37969979138822, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 0, + "b": 20.286181838883106, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.385916350607296, + 47.13662040196324, + 20.475549044342685, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 0, + "b": 21.86381869605193, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.84982390814674, + 50.06152250770351, + 20.642899936386165, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 0, + "b": 23.441455553220756, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.181913195134186, + 52.94014193863117, + 20.893643485548907, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 0, + "b": 24.321021033301516, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.359027118648974, + 54.71638449110792, + 21.171283315559123, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 0, + "b": 23.33197857142857, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.39352693812648, + 53.655161123103774, + 21.32286759551807, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 0, + "b": 21.412857142857153, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.29340512609428, + 51.18596799153211, + 21.531014416050347, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 0, + "b": 19.484285714285733, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.066824879865536, + 48.623328042265186, + 21.843804803184312, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 0, + "b": 17.555714285714313, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.702027680804335, + 45.98918929530564, + 22.24800635763215, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 0, + "b": 15.627142857142896, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.18844703636083, + 43.293688769804604, + 22.730020690488914, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 0, + "b": 13.698571428571476, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.517006338406276, + 40.54705953647175, + 23.27527337004404, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 0, + "b": 11.769999999999937, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.68019795514522, + 37.759594871790796, + 23.868362835349203, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 0, + "b": 9.841428571428393, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.672147779171034, + 34.941612466310545, + 24.493215363781708, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 0, + "b": 7.912857142856847, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.4886647961429, + 32.10341880588485, + 25.13324470418288, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 0, + "b": 5.984285714285303, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.12727536916033, + 29.25527384360638, + 25.77151495819203, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 0, + "b": 4.0557142857137585, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.5872420661815, + 26.407356078667487, + 26.39090527557495, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 0, + "b": 2.1271428571422213, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.869566990660203, + 23.569728156501203, + 26.974274924730324, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0, + "b": 0.19857142857092924, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.976979707844983, + 20.75230310230978, + 27.504627307111022, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": 0, + "b": -1.7300000000003664, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.913909989787918, + 17.96481129748483, + 27.965271503886584, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": 0, + "b": -3.658571428571655, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.68644572996891, + 15.216768305479345, + 28.339979974559384, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": 0, + "b": -5.587142857142947, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.302276502486365, + 12.51744365040088, + 28.613141070102174, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": 0, + "b": -7.515714285714239, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.770623359991134, + 9.8758306479915, + 28.769905077077162, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": 0, + "b": -9.444285714285535, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.1021555779621, + 7.300617384737354, + 28.79632257361365, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": 0, + "b": -11.372857142856823, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.308895159624548, + 4.800158936632201, + 28.67947395245912, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": 0, + "b": -13.301428571428119, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.404110014932954, + 2.3824509146169426, + 28.40758904989635, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": 0, + "b": -15.229999999999407, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.402196817788763, + 0.055104418946017475, + 27.970155911380544, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": 0, + "b": -17.158571428570703, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 5.318554627320388, + -2.1746775202911444, + 27.358017824473237, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": 0, + "b": -18.953399243412633, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 2.3895993001225477, + -4.156226276164592, + 26.624583591622006, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": 0, + "b": -19.89197603358788, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.8399315400023468, + -5.154734948504778, + 26.176389399747194, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": 0, + "b": -20.000000000000007, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.6609101272348354, + -5.267949192431118, + 26.12191484552119, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ] + } + ] +} diff --git a/coverage/glb-machine/gantry/reproducibility.report.json b/coverage/glb-machine/gantry/reproducibility.report.json new file mode 100644 index 0000000..fc42906 --- /dev/null +++ b/coverage/glb-machine/gantry/reproducibility.report.json @@ -0,0 +1,19 @@ +{ + "report_id": "gantry-machine-reproducibility-v1", + "status": "verified", + "source_matches_production": true, + "standard_glbs_unchanged": true, + "generated_files_identical": true, + "sha256": { + "demo-ac-xyz-head.urdf": "558ce184a083a9ad5070ac2555bd05f18bdbdd8e537882c0a0443ebdb30abce6", + "demo-ac-xyz-head.glb": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "demo-ac-gantry.glb": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "demo-bc-gantry.glb": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "LICENSE.txt": "e08dd9a67a260e10205ed953751b46cc9fb4b764fa9b87ee2a239654aaabb4b0", + "demo-bc-xyz-head.glb": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "manifest.json": "7d18176ee974965d1fbe0a3c27f57e340d996eb476b8b5d81e5378b7ff5709e9", + "demo-ac-gantry.urdf": "af71651b0c475fa6d8b09c9e9ed507a78c593d6f2d7d64bccc0642a63f354089", + "demo-bc-gantry.urdf": "b3cca14fa0230283c6eed28b8c28fa1867b80c158a7d896d90a44c96cf420c21", + "demo-bc-xyz-head.urdf": "6f08b6d3f534b6930d50b73b38a4db103246929f59ccdc09d4423bc1e6632f5b" + } +} diff --git a/coverage/glb-machine/geometry-edit/ac-edited.png b/coverage/glb-machine/geometry-edit/ac-edited.png new file mode 100644 index 0000000..f855d9f Binary files /dev/null and b/coverage/glb-machine/geometry-edit/ac-edited.png differ diff --git a/coverage/glb-machine/geometry-edit/acceptance.report.json b/coverage/glb-machine/geometry-edit/acceptance.report.json new file mode 100644 index 0000000..c2ea9b3 --- /dev/null +++ b/coverage/glb-machine/geometry-edit/acceptance.report.json @@ -0,0 +1,82 @@ +{ + "report_id": "imported-geometry-acceptance-v1", + "status": "verified", + "tasks": [ + "GLB-GEO01" + ], + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "evidence": [ + { + "path": "coverage/glb-machine/geometry-edit/ac-edited.png", + "sha256": "8e7e7c679d3ba7a910a12b86f3451561474d16d6d16301d1ffca05ddb1a69c52" + }, + { + "path": "coverage/glb-machine/geometry-edit/bc-edited.png", + "sha256": "ad7a24ddbe3f00bd707826016f2daf96a8fa9993a9b1d7a1cffbe403851bc135" + }, + { + "path": "coverage/glb-machine/geometry-edit/before.log", + "sha256": "5d5ac459a427184211b31bd6548a9527c5aa5beb3b26a24fb41c8cd34f29249a" + }, + { + "path": "coverage/glb-machine/geometry-edit/browser.log", + "sha256": "3500e18f74431e094d35b115cd6cd0144447a3312374cd04a1ddac7b2bd1a210" + }, + { + "path": "coverage/glb-machine/geometry-edit/browser.report.json", + "sha256": "3d246fe3a2e7da6dcab0d7903d0d5cffbc1ce84d4e4ce2db061598c1a139dfad" + }, + { + "path": "coverage/glb-machine/geometry-edit/build.log", + "sha256": "3b11fb8e419c158beeb9614650f31020cc87b2a482d01a3db99f0f8948517901" + }, + { + "path": "coverage/glb-machine/geometry-edit/import/ac-imported.png", + "sha256": "697c2aed197333bda523d44173798723c245a1f35002644992ee8b727ed22a8f" + }, + { + "path": "coverage/glb-machine/geometry-edit/import/bc-imported.png", + "sha256": "6869be7b19fe844aaf50b202912f275f497b979452e0532f65c317175abdf73f" + }, + { + "path": "coverage/glb-machine/geometry-edit/import/browser.report.json", + "sha256": "4bdbba0522cfe0c42624841da88b1c57e649a1261bae6711011c406128c74118" + }, + { + "path": "coverage/glb-machine/geometry-edit/import/viewport-1440.png", + "sha256": "d8be53a6e5e6cf1d5359b6aba94fe6319ff33decdb0af4a0b3307ede6f60ab33" + }, + { + "path": "coverage/glb-machine/geometry-edit/import/viewport-390.png", + "sha256": "7d0f0ccaf187b62573ebb38d5bb033c79dd81e9b06eb32bf935457a6c8e82e91" + }, + { + "path": "coverage/glb-machine/geometry-edit/import.log", + "sha256": "f8308922ef1d78fc82ab21081a16b8c369808e662c1ac85ceef03558c2706410" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric/browser.report.json", + "sha256": "28eb780b7bcbfc94a43226c267868444287069f4a3c4c6ffab256759d439b00b" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric/layout-1440.png", + "sha256": "aba2d351796a2c04ba8d49cd164509502ebbe2e8aa4bfbd17288b2931dfd497e" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric/layout-390.png", + "sha256": "23b7804ccfefdb3bcc05b754d5fedb76db52da4d2e840ce25b2f0c7487a86fba" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric/xyzac-trt-model.png", + "sha256": "6b0f89a3d9f7345a2ac12ff1beb82115e6f957b9b3f0f61766d62f47b8f072fb" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric/xyzbc-trt-model.png", + "sha256": "38ed4ba88c7e72d6f30705ef48732ca3d0d9152ee6f17ce8cb8bc86ad3dcfce6" + }, + { + "path": "coverage/glb-machine/geometry-edit/parametric.log", + "sha256": "6aa0af350b31f8b04e220da964cc0eb62357ef0dddb51390152d5ca0b93a7cf7" + } + ] +} diff --git a/coverage/glb-machine/geometry-edit/bc-edited.png b/coverage/glb-machine/geometry-edit/bc-edited.png new file mode 100644 index 0000000..45478ba Binary files /dev/null and b/coverage/glb-machine/geometry-edit/bc-edited.png differ diff --git a/coverage/glb-machine/geometry-edit/browser.report.json b/coverage/glb-machine/geometry-edit/browser.report.json new file mode 100644 index 0000000..20289e2 --- /dev/null +++ b/coverage/glb-machine/geometry-edit/browser.report.json @@ -0,0 +1,191 @@ +{ + "report_id": "imported-geometry-browser-v1", + "status": "verified", + "machines": [ + { + "id": "ac", + "original": { + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "filename": "demo-ac-xyz-head.glb", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "applied": { + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "filename": "demo-ac-xyz-head.glb", + "offsets": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 0, + "y_offset": 23, + "z_offset": -34, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "edits": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 0, + "y_offset": 23, + "z_offset": -34 + }, + "projection": { + "checks": [ + 2.7755575615628914e-17, + 3.2959746043559335e-17, + 2.1942709178604383e-17, + 2.3263411494723067e-16, + 1.716587549445839e-16, + 1.3877787807814457e-16, + 3.925231146709438e-17, + 7.473417450352271e-17, + 3.7367087251761353e-17, + 1.979582157258511e-16, + 1.6711069443220838e-16, + 6.206335383118183e-17, + 2.7755575615628914e-17, + 6.369057972232327e-17, + 2.0816681711721685e-17, + 3.194906681775283e-16, + 6.206335383118183e-17, + 5.551115123125783e-17 + ], + "mesh_count": 72, + "source_preserved": true, + "renamed_joint_supported": true, + "incompatible_rejected": true + }, + "tcpError": { + "error": 1.9778890766513102e-17, + "rendered": 0 + }, + "model_retained_on_reload_and_ini_import": true + }, + { + "id": "bc", + "original": { + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "filename": "demo-bc-xyz-head.glb", + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "applied": { + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "filename": "demo-bc-xyz-head.glb", + "offsets": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 27, + "y_offset": 0, + "z_offset": -34, + "tool_offset": 0 + }, + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "tip": [ + 0, + 0, + 0 + ] + }, + "edits": { + "x_rot_point": 31, + "y_rot_point": -9, + "z_rot_point": 15, + "x_offset": 27, + "y_offset": 0, + "z_offset": -34 + }, + "projection": { + "checks": [ + 5.551115123125783e-17, + 0, + 1.1123893155135927e-16, + 9.205483015737869e-17, + 1.2118257228641695e-16, + 1.2719202621569003e-16, + 6.798699777552591e-17, + 1.1443916996305594e-16, + 1.2177709378935645e-16, + 1.55941895632402e-16, + 3.469446951953614e-17, + 5.551115123125783e-17, + 5.551115123125783e-17, + 0, + 1.1102230246251565e-16, + 1.4703252574089423e-16, + 1.1857187100668868e-16, + 5.003707553108401e-17 + ], + "mesh_count": 72, + "source_preserved": true, + "renamed_joint_supported": true, + "incompatible_rejected": true + }, + "tcpError": { + "error": 6.636893469679434e-17, + "rendered": 0 + }, + "model_retained_on_reload_and_ini_import": true + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/geometry-edit/import/ac-imported.png b/coverage/glb-machine/geometry-edit/import/ac-imported.png new file mode 100644 index 0000000..13cb4bf Binary files /dev/null and b/coverage/glb-machine/geometry-edit/import/ac-imported.png differ diff --git a/coverage/glb-machine/geometry-edit/import/bc-imported.png b/coverage/glb-machine/geometry-edit/import/bc-imported.png new file mode 100644 index 0000000..4d6f2b5 Binary files /dev/null and b/coverage/glb-machine/geometry-edit/import/bc-imported.png differ diff --git a/coverage/glb-machine/geometry-edit/import/browser.report.json b/coverage/glb-machine/geometry-edit/import/browser.report.json new file mode 100644 index 0000000..c93e230 --- /dev/null +++ b/coverage/glb-machine/geometry-edit/import/browser.report.json @@ -0,0 +1,982 @@ +{ + "report_id": "glb-machine-browser-v1", + "status": "verified", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "parser": [ + { + "id": "ac", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + }, + { + "id": "bc", + "rejected": [ + { + "name": "truncated", + "error": "机床模型无效:GLB 头部或长度错误" + }, + { + "name": "missing-schema", + "error": "机床模型无效:缺少 linuxcnc.machine/1 内嵌 URDF" + }, + { + "name": "external-buffer", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "external-texture", + "error": "机床模型无效:GLB 必须自包含,禁止外部 buffer/图片" + }, + { + "name": "animation", + "error": "机床模型无效:运动节点不能由动画、蒙皮或压缩扩展驱动" + }, + { + "name": "node-cycle", + "error": "机床模型无效:GLB 节点环、重复父节点或索引无效" + }, + { + "name": "wrong-hierarchy", + "error": "机床模型无效:GLB 层级与 URDF 不同:c_table" + }, + { + "name": "node-offset-mismatch", + "error": "机床模型无效:GLB 节点 c_table 零位与 URDF 不同" + }, + { + "name": "duplicate-link", + "error": "机床模型无效:GLB link base 缺失或重名" + }, + { + "name": "matrix-origin-mismatch", + "error": "机床模型无效:GLB 节点 c_table 矩阵与 URDF 不同" + }, + { + "name": "xml-syntax", + "error": "机床模型无效:URDF XML 语法错误" + }, + { + "name": "doctype", + "error": "机床模型无效:URDF 长度或 XML 声明不支持" + }, + { + "name": "duplicate-coordinate", + "error": "机床模型无效:需要 XYZAC 或 XYZBC 五个唯一运动轴" + }, + { + "name": "negative-axis", + "error": "机床模型无效:要求底座 → X → Y → Z 正交刀具链,零位 origin=0" + }, + { + "name": "nonzero-rpy", + "error": "机床模型无效:v1 不支持旋转的关节零位 rpy" + }, + { + "name": "nan-limit", + "error": "机床模型无效:需要有限数值" + }, + { + "name": "mimic", + "error": "机床模型无效:不支持 mimic" + }, + { + "name": "unknown-profile", + "error": "机床模型无效:不支持的运动学 profile" + }, + { + "name": "broken-tree", + "error": "机床模型无效:存在断开的结构或环" + }, + { + "name": "runtime-range-outside-model", + "error": "X:INI 行程超出 URDF,先调整运行配置" + }, + { + "name": "runtime-speed-outside-model", + "error": "X:INI 速度超出 URDF" + } + ] + } + ], + "machines": [ + { + "id": "ac", + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "offsets": { + "x_rot_point": 24, + "x_offset": 0, + "y_rot_point": -12, + "y_offset": 18, + "z_rot_point": 8, + "z_offset": -45 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.1933397187179203e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.1599919653272043e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 2.486410087150353e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.709648974837069e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.3472894910096233e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.1354490689426183e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 2.036065864674698e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 2.482534153247273e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3877787807814457e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 1.2412670766236366e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 9.508199615517185e-17 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 1.9141791241147513e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 2.2591401799415137e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1857187100668868e-16 + } + ], + "jogs": [ + { + "axis": "a", + "before": { + "joints": [ + 4.66664999999999, + 3.466650000000003, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.0466664999999999, + 7.697509296633605e-18, + 0.03466650000000003 + ], + "tick": 59, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 4.66664999999999, + -0.578220496871058, + -0.5014400651608497, + 6.300000000000009, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.0466664999999999, + -0.005014400651608498, + -0.00578220496871058 + ], + "tick": 95, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 4.192148702340308e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 4.66664999999999, + -0.578220496871058, + -0.5014400651608497, + 6.300000000000009, + 0 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.0466664999999999, + -0.005014400651608498, + -0.00578220496871058 + ], + "tick": 95, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 3.5127488929315476, + -2.1333277540415505, + -0.6731255047163103, + 6.300000000000009, + 4.499999999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.03512748892931548, + -0.006731255047163108, + -0.021333277540415505 + ], + "tick": 125, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 4.772854504744019e-17, + "render_error": 0 + }, + { + "axis": "a", + "before": { + "joints": [ + 3.5127488929315476, + -2.1333277540415505, + -0.6731255047163103, + 6.300000000000009, + 4.499999999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.03512748892931548, + -0.006731255047163108, + -0.021333277540415505 + ], + "tick": 125, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 3.5127488929315476, + -4.772000312433438, + -1.3663524148917787, + 10.5, + 4.499999999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.03512748892931548, + -0.013663524148917796, + -0.04772000312433438 + ], + "tick": 154, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 5.006713685883697e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 3.5127488929315476, + -4.772000312433438, + -1.3663524148917787, + 10.5, + 4.499999999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.03512748892931548, + -0.013663524148917796, + -0.04772000312433438 + ], + "tick": 154, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "after": { + "joints": [ + 2.4851585016404982, + -6.394633156793212, + -1.6670896365399557, + 10.5, + 8.99999999999999 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + }, + "tip": [ + 0.02485158501640498, + -0.01667089636539957, + -0.06394633156793213 + ], + "tick": 184, + "hash": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1" + }, + "tcp_error": 4.415885040048117e-17, + "render_error": 0 + } + ], + "pixels": { + "colors": 1405, + "width": 472, + "height": 586 + }, + "worker_derived_offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "id": "bc", + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "offsets": { + "x_rot_point": -18, + "x_offset": 22, + "y_rot_point": 14, + "y_offset": 0, + "z_rot_point": 12, + "z_offset": -40 + }, + "program_preserved": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "geometry": [ + { + "tilt": 0, + "c": 0, + "tool_offset": 0, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 0, + "error": 1.1188630228279524e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 0, + "error": 1.3672438525262642e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 0, + "error": 2.3714374201337736e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 0, + "error": 1.0007415106216802e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 0, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": 17, + "error": 6.206335383118183e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": 17, + "error": 1.1443916996305594e-16 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": 17, + "error": 1.3951318755036565e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": 17, + "error": 1.5700924586837752e-16 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": 17, + "error": 1.3597399555105182e-16 + }, + { + "tilt": 0, + "c": 0, + "tool_offset": -4, + "error": 7.850462293418876e-17 + }, + { + "tilt": 25, + "c": 0, + "tool_offset": -4, + "error": 0 + }, + { + "tilt": 0, + "c": 65, + "tool_offset": -4, + "error": 1.4756369957997185e-16 + }, + { + "tilt": -35, + "c": 125, + "tool_offset": -4, + "error": 2.7755575615628914e-17 + }, + { + "tilt": 42, + "c": -80, + "tool_offset": -4, + "error": 1.3597399555105182e-16 + }, + { + "tilt": -80, + "c": 270, + "tool_offset": -4, + "error": 1.1102230246251565e-16 + } + ], + "jogs": [ + { + "axis": "b", + "before": { + "joints": [ + 4.66664999999999, + 3.266650000000002, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.0466664999999999, + 7.25342008678354e-18, + 0.03266650000000002 + ], + "tick": 242, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 5.988547549895522, + 3.266650000000002, + -0.06274707734662499, + 2.7074999999999982, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.05988547549895522, + -0.0006274707734662427, + 0.03266650000000002 + ], + "tick": 266, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 5.2237508757293676e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 5.988547549895522, + 3.266650000000002, + -0.06274707734662499, + 2.7074999999999982, + 0 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.05988547549895522, + -0.0006274707734662427, + 0.03266650000000002 + ], + "tick": 266, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 6.806282140622642, + 5.2009897567427625, + -0.10141774164188178, + 2.7074999999999982, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06806282140622642, + -0.0010141774164188061, + 0.052009897567427625 + ], + "tick": 302, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 7.251197301982682e-17, + "render_error": 0 + }, + { + "axis": "b", + "before": { + "joints": [ + 6.806282140622642, + 5.2009897567427625, + -0.10141774164188178, + 2.7074999999999982, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.06806282140622642, + -0.0010141774164188061, + 0.052009897567427625 + ], + "tick": 302, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 9.850766582307877, + 5.2009897567427625, + -0.577843960065767, + 9.007500000000007, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09850766582307877, + -0.005778439600657659, + 0.052009897567427625 + ], + "tick": 338, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 4.5534426050565124e-17, + "render_error": 0 + }, + { + "axis": "c", + "before": { + "joints": [ + 9.850766582307877, + 5.2009897567427625, + -0.577843960065767, + 9.007500000000007, + 4.799999999999997 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.09850766582307877, + -0.005778439600657659, + 0.052009897567427625 + ], + "tick": 338, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "after": { + "joints": [ + 10.273803322125342, + 6.4421740463938555, + -0.6449031630217803, + 9.007500000000007, + 7.7999999999999945 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "tip": [ + 0.10273803322125341, + -0.006449031630217789, + 0.06442174046393855 + ], + "tick": 363, + "hash": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b" + }, + "tcp_error": 7.523581911015265e-17, + "render_error": 0 + } + ], + "pixels": { + "colors": 1360, + "width": 472, + "height": 586 + }, + "worker_derived_offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1100, + "bounds": [ + { + "x": 969, + "right": 999, + "width": 30 + }, + { + "x": 445, + "right": 513.625, + "width": 68.625 + }, + { + "x": 521.421875, + "right": 582.109375, + "width": 60.6875 + }, + { + "x": 586.65625, + "right": 634.34375, + "width": 47.6875 + }, + { + "x": 642.140625, + "right": 702.828125, + "width": 60.6875 + }, + { + "x": 707.375, + "right": 755.0625, + "width": 47.6875 + } + ] + }, + { + "width": 390, + "height": 844, + "bounds": [ + { + "x": 341, + "right": 371, + "width": 30 + }, + { + "x": 23, + "right": 91.625, + "width": 68.625 + }, + { + "x": 99.421875, + "right": 160.109375, + "width": 60.6875 + }, + { + "x": 164.65625, + "right": 212.34375, + "width": 47.6875 + }, + { + "x": 220.140625, + "right": 280.828125, + "width": 60.6875 + }, + { + "x": 285.375, + "right": 333.0625, + "width": 47.6875 + } + ] + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/geometry-edit/import/viewport-1440.png b/coverage/glb-machine/geometry-edit/import/viewport-1440.png new file mode 100644 index 0000000..da0f2ee Binary files /dev/null and b/coverage/glb-machine/geometry-edit/import/viewport-1440.png differ diff --git a/coverage/glb-machine/geometry-edit/import/viewport-390.png b/coverage/glb-machine/geometry-edit/import/viewport-390.png new file mode 100644 index 0000000..9cf1a9e Binary files /dev/null and b/coverage/glb-machine/geometry-edit/import/viewport-390.png differ diff --git a/coverage/glb-machine/geometry-edit/parametric/browser.report.json b/coverage/glb-machine/geometry-edit/parametric/browser.report.json new file mode 100644 index 0000000..12ef9f5 --- /dev/null +++ b/coverage/glb-machine/geometry-edit/parametric/browser.report.json @@ -0,0 +1,73 @@ +{ + "report_id": "trt-parametric-browser-v1", + "status": "verified", + "machines": [ + { + "id": "xyzac-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "export_bytes": 4867, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "canvas": { + "hash": 3797953256, + "colors": 2383, + "width": 472, + "height": 491 + } + }, + { + "id": "xyzbc-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "export_bytes": 4875, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc", + "canvas": { + "hash": 1876807854, + "colors": 2446, + "width": 472, + "height": 491 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1000, + "canvas": { + "hash": 518020959, + "colors": 2516, + "width": 472, + "height": 491 + }, + "controls_fit": true, + "interactive": true + }, + { + "width": 390, + "height": 844, + "canvas": { + "hash": 287810572, + "colors": 1808, + "width": 368, + "height": 378 + }, + "controls_fit": true, + "interactive": true + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/geometry-edit/parametric/layout-1440.png b/coverage/glb-machine/geometry-edit/parametric/layout-1440.png new file mode 100644 index 0000000..95fe21f Binary files /dev/null and b/coverage/glb-machine/geometry-edit/parametric/layout-1440.png differ diff --git a/coverage/glb-machine/geometry-edit/parametric/layout-390.png b/coverage/glb-machine/geometry-edit/parametric/layout-390.png new file mode 100644 index 0000000..fa2547b Binary files /dev/null and b/coverage/glb-machine/geometry-edit/parametric/layout-390.png differ diff --git a/coverage/glb-machine/geometry-edit/parametric/xyzac-trt-model.png b/coverage/glb-machine/geometry-edit/parametric/xyzac-trt-model.png new file mode 100644 index 0000000..b6bef21 Binary files /dev/null and b/coverage/glb-machine/geometry-edit/parametric/xyzac-trt-model.png differ diff --git a/coverage/glb-machine/geometry-edit/parametric/xyzbc-trt-model.png b/coverage/glb-machine/geometry-edit/parametric/xyzbc-trt-model.png new file mode 100644 index 0000000..38baa91 Binary files /dev/null and b/coverage/glb-machine/geometry-edit/parametric/xyzbc-trt-model.png differ diff --git a/coverage/glb-machine/gltf-validation.report.json b/coverage/glb-machine/gltf-validation.report.json new file mode 100644 index 0000000..8ca9b16 --- /dev/null +++ b/coverage/glb-machine/gltf-validation.report.json @@ -0,0 +1,941 @@ +{ + "report_id": "glb-machine-khronos-validation-v1", + "validator": "2.0.0-dev.3.10", + "status": "verified", + "reports": [ + { + "id": "ac", + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "uri": "demo-ac-xyz-head.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T02:12:47.525Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 71, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 455536 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 71, + "totalVertexCount": 12692, + "totalTriangleCount": 8232, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + }, + { + "id": "bc", + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "uri": "demo-bc-xyz-head.glb", + "mimeType": "model/gltf-binary", + "validatorVersion": "2.0.0-dev.3.10", + "validatedAt": "2026-09-18T02:12:47.543Z", + "issues": { + "numErrors": 0, + "numWarnings": 0, + "numInfos": 71, + "numHints": 0, + "messages": [ + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/0/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/1/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/2/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/3/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/4/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/5/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/6/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/7/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/8/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/9/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/10/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/11/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/12/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/13/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/14/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/15/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/16/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/17/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/18/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/19/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/20/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/21/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/22/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/23/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/24/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/25/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/26/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/27/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/28/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/29/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/30/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/31/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/32/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/33/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/34/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/35/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/36/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/37/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/38/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/39/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/40/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/41/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/42/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/43/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/44/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/45/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/46/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/47/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/48/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/49/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/50/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/51/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/52/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/53/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/54/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/55/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/56/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/57/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/58/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/59/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/60/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/61/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/62/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/63/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/64/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/65/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/66/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/67/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/68/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/69/primitives/0/attributes/TEXCOORD_0" + }, + { + "code": "UNUSED_OBJECT", + "message": "This object may be unused.", + "severity": 2, + "pointer": "/meshes/70/primitives/0/attributes/TEXCOORD_0" + } + ], + "truncated": false + }, + "info": { + "version": "2.0", + "generator": "THREE.GLTFExporter r185", + "resources": [ + { + "pointer": "/buffers/0", + "mimeType": "application/gltf-buffer", + "storage": "glb", + "byteLength": 455536 + } + ], + "animationCount": 0, + "materialCount": 7, + "hasMorphTargets": false, + "hasSkins": false, + "hasTextures": false, + "hasDefaultScene": true, + "drawCallCount": 71, + "totalVertexCount": 12692, + "totalTriangleCount": 8232, + "maxUVs": 1, + "maxInfluences": 0, + "maxAttributes": 3 + } + } + ] +} diff --git a/coverage/glb-machine/jog-limits/ac-recovered.png b/coverage/glb-machine/jog-limits/ac-recovered.png new file mode 100644 index 0000000..e7a5708 Binary files /dev/null and b/coverage/glb-machine/jog-limits/ac-recovered.png differ diff --git a/coverage/glb-machine/jog-limits/acceptance.report.json b/coverage/glb-machine/jog-limits/acceptance.report.json new file mode 100644 index 0000000..8f87f26 --- /dev/null +++ b/coverage/glb-machine/jog-limits/acceptance.report.json @@ -0,0 +1,105 @@ +{ + "report_id": "jog-limit-acceptance-v1", + "status": "verified", + "tasks": [ + "TRT-JOG02", + "GLB-UI02" + ], + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "known_baseline_failures": [ + { + "test": "test_xyzac_manual_control.mjs", + "failure": "synchronous homing mask 0 != 1; identical with HEAD modules" + }, + { + "test": "test_xyzac_button_constraints.mjs", + "failure": "unhomed versus machine-off gate priority; identical with HEAD modules" + } + ], + "boundaries": [ + "RTCP limit stops at last valid servo sample; no predictive hardware deceleration claim", + "Previously broken transport sessions require page reload" + ], + "evidence": [ + { + "path": "coverage/glb-machine/jog-limits/ac-recovered.png", + "sha256": "c02719451fdb3a7ba9d83235e81310c4897cb469f42911cd7ec14af5f6688dc7" + }, + { + "path": "coverage/glb-machine/jog-limits/bc-recovered.png", + "sha256": "6bbaa58ccdcab209c8ce354d3fec9b9bc83f437be5386c0aff0fc02136a366f8" + }, + { + "path": "coverage/glb-machine/jog-limits/before.log", + "sha256": "bdb05ff556524c0780412115b3d3798107eb2ac79b54477a59fd93004704524a" + }, + { + "path": "coverage/glb-machine/jog-limits/browser.log", + "sha256": "25151979cfb56821cf2e6f82b128745f348cca6ac5ae7214b611d5204eb856d8" + }, + { + "path": "coverage/glb-machine/jog-limits/browser.report.json", + "sha256": "305fd429b308099c209da8c460932521d009909ede89c019247ee2c794c322da" + }, + { + "path": "coverage/glb-machine/jog-limits/build.log", + "sha256": "e53b7da801576efd224cc73eee896ca46b050fc6ed73b32645f9bb86adc517fe" + }, + { + "path": "coverage/glb-machine/jog-limits/buttons-baseline.log", + "sha256": "445f0d3ab7af7c51457c735be03e474e7b8cf1315caf0df5601fc8c67d211386" + }, + { + "path": "coverage/glb-machine/jog-limits/buttons.log", + "sha256": "b126107f6f7b0b468934cac4f4778df4cfd6f99ea50670668e54b15945085bca" + }, + { + "path": "coverage/glb-machine/jog-limits/checkpoint.log", + "sha256": "c92e75901b4f8a2a6ec54f8fddf5c41fafdbf8729e76c2f9d22d2a68fbd8ea3c" + }, + { + "path": "coverage/glb-machine/jog-limits/exact-checkpoint.report.json", + "sha256": "bda234634bcfbaef24dfa7291cf8650c67d33805a3ceefe96e251fdb2a64059e" + }, + { + "path": "coverage/glb-machine/jog-limits/manual-baseline.log", + "sha256": "1bbaa532fe461967f677a8c045a3af0c84e9052aeaa6ab5d143e90ae89928af5" + }, + { + "path": "coverage/glb-machine/jog-limits/manual.log", + "sha256": "1a3e27bdf66ef7c6f020da595181282b99bd74ea1c058583ba929c3466e80ada" + }, + { + "path": "coverage/glb-machine/jog-limits/motion.log", + "sha256": "57ed59ba66d43ff00784733a3ddb7a0c3936c33aae0e03ab3c4fd4c2eacca361" + }, + { + "path": "coverage/glb-machine/jog-limits/motion.report.json", + "sha256": "91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626" + }, + { + "path": "coverage/glb-machine/jog-limits/recovery.log", + "sha256": "12b7792cd312e327154d4b66a13d869906a4c53a9143dd0d04493f687452da3b" + }, + { + "path": "coverage/glb-machine/jog-limits/shadow.png", + "sha256": "f8c60fb173f8cc22dcb1f44da3c214a00ee2c401100e5536fabccc8d0d1904c3" + }, + { + "path": "coverage/glb-machine/jog-limits/shadow.report.json", + "sha256": "b33cc89335b8cc32e2493b0199d5690eafaa14d84a7bdf4a5e19d71b05f22237" + }, + { + "path": "coverage/glb-machine/jog-limits/step.log", + "sha256": "897d2f0bbd0c40e64ae9fc311206cf89bb4fa220b2662bf33bf4b87aac406321" + }, + { + "path": "coverage/glb-machine/jog-limits/worker.log", + "sha256": "2f71069076125e38f1b313f5c4b397df1bf324879e8492fdb8599655a7772893" + }, + { + "path": "coverage/glb-machine/jog-limits/worker.report.json", + "sha256": "e599aa05ca175ccd59dc36c783b9aa0a62e149e91b37aa065580b2ec58d88d6c" + } + ] +} diff --git a/coverage/glb-machine/jog-limits/bc-recovered.png b/coverage/glb-machine/jog-limits/bc-recovered.png new file mode 100644 index 0000000..267c167 Binary files /dev/null and b/coverage/glb-machine/jog-limits/bc-recovered.png differ diff --git a/coverage/glb-machine/jog-limits/browser.report.json b/coverage/glb-machine/jog-limits/browser.report.json new file mode 100644 index 0000000..f90a586 --- /dev/null +++ b/coverage/glb-machine/jog-limits/browser.report.json @@ -0,0 +1,143 @@ +{ + "report_id": "jog-limit-browser-v1", + "status": "verified", + "machines": [ + { + "id": "ac", + "atLimit": { + "joints": [ + 0, + 0, + 30, + 50, + 20 + ], + "tip": [ + 0, + 0.3, + -6.661338147750939e-17 + ], + "tick": 207 + }, + "retreat": { + "joints": [ + 0, + 0, + 30, + 48.7325, + 20 + ], + "tip": [ + 0, + 0.3, + -6.661338147750939e-17 + ], + "tick": 220 + }, + "stopped": { + "joints": [ + 147.16819064437152, + 99.93568159167009, + 30, + 0, + 38.13000000000069 + ], + "tip": [ + 1.4716819064437154, + 0.3000000000000002, + 0.9993568159167008 + ], + "tick": 1329 + }, + "resumed": { + "joints": [ + 152.31822671868903, + 93.99260677882737, + 30, + 0, + 35.422500000000696 + ], + "tip": [ + 1.5231822671868902, + 0.3000000000000002, + 0.9399260677882736 + ], + "tick": 1353 + }, + "fault": { + "code": "motion_limit", + "reason": "motion_joint_limit" + }, + "pixels": 1135 + }, + { + "id": "bc", + "atLimit": { + "joints": [ + 0, + 0, + 30, + 50, + 20 + ], + "tip": [ + 0, + 0.3, + -6.661338147750939e-17 + ], + "tick": 1640 + }, + "retreat": { + "joints": [ + 0, + 0, + 30, + 48.92, + 20 + ], + "tip": [ + 0, + 0.3, + -6.661338147750939e-17 + ], + "tick": 1652 + }, + "stopped": { + "joints": [ + 171.92682873768467, + 99.95231076385438, + 30, + -7.105427357601002e-15, + 28.200000000000312 + ], + "tip": [ + 1.7192682873768468, + 0.3000000000000002, + 0.9995231076385437 + ], + "tick": 2727 + }, + "resumed": { + "joints": [ + 174.0693024962762, + 95.05173063293552, + 30, + -7.105427357601002e-15, + 26.73000000000031 + ], + "tip": [ + 1.740693024962762, + 0.3000000000000002, + 0.9505173063293549 + ], + "tick": 2746 + }, + "fault": { + "code": "motion_limit", + "reason": "motion_joint_limit" + }, + "pixels": 1109 + } + ], + "page_errors": [] +} diff --git a/coverage/glb-machine/jog-limits/exact-checkpoint.report.json b/coverage/glb-machine/jog-limits/exact-checkpoint.report.json new file mode 100644 index 0000000..a77fd3c --- /dev/null +++ b/coverage/glb-machine/jog-limits/exact-checkpoint.report.json @@ -0,0 +1,131 @@ +{ + "report_id": "trt-checkpoint-exact-v1", + "status": "verified", + "safeguards": { + "corrupt_native_rejected": true, + "foreign_build_rejected": true, + "frozen_subroutines": true, + "heap_relocation_checked": true, + "receipts_nonrecursive": true, + "backward_transport_restore_rejected": true + }, + "rows": [ + { + "machine": "xyzac-trt", + "phase": "subroutine", + "checkpoint_tick": 6, + "continuation_tick": 18, + "state_hash": "fnv1a64:113cda82a07e692a", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "paused-resumed", + "checkpoint_tick": 18, + "continuation_tick": 30, + "state_hash": "fnv1a64:e380c733d2e27194", + "samples": 12, + "new_transport_recovery": true, + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "line", + "checkpoint_tick": 35, + "continuation_tick": 47, + "state_hash": "fnv1a64:8e128e04aca13b45", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "arc", + "checkpoint_tick": 72, + "continuation_tick": 84, + "state_hash": "fnv1a64:16fef8e7095d1cc7", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "completed", + "checkpoint_tick": 684, + "continuation_tick": 696, + "state_hash": "fnv1a64:571fff3045139a9b", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "trace-and-transport", + "state_hash": "fnv1a64:50c207f5409d5062", + "first_divergent_tick": null + }, + { + "machine": "xyzac-trt", + "phase": "post-recovery-jog", + "samples": 6, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "subroutine", + "checkpoint_tick": 6, + "continuation_tick": 18, + "state_hash": "fnv1a64:94587fdc5ce1e3b1", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "paused-resumed", + "checkpoint_tick": 18, + "continuation_tick": 30, + "state_hash": "fnv1a64:5f0adc4aa9f2a037", + "samples": 12, + "new_transport_recovery": true, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "line", + "checkpoint_tick": 35, + "continuation_tick": 47, + "state_hash": "fnv1a64:74b83ca0c127a6c1", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "arc", + "checkpoint_tick": 72, + "continuation_tick": 84, + "state_hash": "fnv1a64:89a768be32ed9eda", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "completed", + "checkpoint_tick": 704, + "continuation_tick": 716, + "state_hash": "fnv1a64:d0cf609cae7c894b", + "samples": 12, + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "trace-and-transport", + "state_hash": "fnv1a64:4e6307e65d801db6", + "first_divergent_tick": null + }, + { + "machine": "xyzbc-trt", + "phase": "post-recovery-jog", + "samples": 6, + "first_divergent_tick": null + } + ], + "state_hash": "fnv1a64:d7f8b093cb3e4510" +} diff --git a/coverage/glb-machine/jog-limits/motion.report.json b/coverage/glb-machine/jog-limits/motion.report.json new file mode 100644 index 0000000..f199a69 --- /dev/null +++ b/coverage/glb-machine/jog-limits/motion.report.json @@ -0,0 +1,2544 @@ +{ + "report_id": "glb-machine-five-axis-motion-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 A0 C0\nM428\nG1 X35 Y24 Z32 A25 C40 F900\nG1 X24 Y16 Z24 A-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.2591401799415137e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0.22968749999999996, + "b": 0, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.99595803736646, + 9.874421474017172, + 20.12624077439751, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 1.3545395528575301, + "b": 0, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.95434701862283, + 9.257647365906834, + 20.743322191952068, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 2.9321764100262997, + "b": 0, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.833124292093828, + 8.384734865389902, + 21.60616083887203, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 4.50981326719507, + "b": 0, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.635609460598403, + 7.49750341711335, + 22.46657440661184, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 6.087450124363804, + "b": 0, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.358888206816445, + 6.590046034574037, + 23.324707443401806, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 7.6650869815325375, + "b": 0, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.000370067347152, + 5.656262521201651, + 24.180057881811884, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 9.24272383870132, + "b": 0, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.55779952899828, + 4.689923242944772, + 25.031455090743655, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 10.820360695870146, + "b": 0, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.029266133103974, + 3.684734977856124, + 25.87704364402046, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 12.397997553038973, + "b": 0, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.413213557148122, + 2.6344083490822943, + 26.714272981080555, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 13.9756344102078, + "b": 0, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 16.70844764564024, + 1.5327263336594292, + 27.539893093834166, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 15.553271267376624, + "b": 0, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.914143364935367, + 0.3736133289244634, + 28.349956331230942, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 17.130908124545453, + "b": 0, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.029850659501848, + -0.8487957487481985, + 29.139825369774186, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 18.70854498171428, + "b": 0, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.055499190014691, + -2.1400868617254467, + 29.904187354395702, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 20.286181838883106, + "b": 0, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.991401936579638, + -3.5054992742176942, + 30.63707417005608, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 21.86381869605193, + "b": 0, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.838257653368174, + -4.94985952588366, + 31.331888760448635, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 23.441455553220756, + "b": 0, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.597152163957437, + -6.4775174739041965, + 31.981437366549414, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 24.321021033301516, + "b": 0, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 9.87102928781642, + -7.245549872434104, + 32.49414794112097, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 23.33197857142857, + "b": 0, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.726007873637807, + -5.788403985078261, + 32.73730577435077, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 21.412857142857153, + "b": 0, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.36203653051712, + -3.231075744959096, + 32.8109269608977, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 19.484285714285733, + "b": 0, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.980580242285733, + -0.7404921771841426, + 32.766464373464416, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 17.555714285714313, + "b": 0, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.570237107614947, + 1.6675534613501029, + 32.61200452902207, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 15.627142857142896, + "b": 0, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.127951943791736, + 3.9908139847170325, + 32.35623658379197, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 13.698571428571476, + "b": 0, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.650908000145666, + 6.227777163216452, + 32.00772085126978, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 11.769999999999937, + "b": 0, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.136530696440413, + 8.377631103821685, + 31.574829328143053, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 9.841428571428393, + "b": 0, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 21.58249029485251, + 10.440225044744565, + 31.065690883131552, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 7.912857142856847, + "b": 0, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.98670351023294, + 12.416026099775472, + 30.488141447935618, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 5.984285714285303, + "b": 0, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.347334067326027, + 14.306072511605354, + 29.849679492514724, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 4.0557142857137585, + "b": 0, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 25.662792217542528, + 16.11192399109913, + 29.157427008482472, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 2.1271428571422213, + "b": 0, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.931733231731258, + 17.835609731385446, + 28.418096165068704, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0.19857142857092924, + "b": 0, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.153054889154856, + 19.479574691642114, + 27.637961742435337, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": -1.7300000000003664, + "b": 0, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 29.325893986537977, + 21.046624745627106, + 26.822839387706722, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": -3.658571428571655, + "b": 0, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.449621894603986, + 22.539871284416392, + 25.978069680451114, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": -5.587142857142947, + "b": 0, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.523839192945253, + 23.962675851616893, + 25.10850793706433, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": -7.515714285714239, + "b": 0, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.54836941735962, + 25.318595372704934, + 24.218519628094157, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": -9.444285714285535, + "b": 0, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.52325195693044, + 26.611328518350824, + 23.3119812294998, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": -11.372857142856823, + "b": 0, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.44873414111287, + 27.844663714910965, + 22.392286278641734, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": -13.301428571428119, + "b": 0, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.32526255990824, + 29.022429284032476, + 21.462356358884456, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": -15.229999999999407, + "b": 0, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.153473662849684, + 30.14844615789012, + 20.52465669347393, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": -17.158571428570703, + "b": 0, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.93418368497938, + 31.226483577368235, + 19.581215990188582, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": -18.953399243412633, + "b": 0, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.61894079573156, + 32.189885304600296, + 18.699467974539928, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": -19.89197603358788, + "b": 0, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.961283259435376, + 32.679365598067484, + 18.237296989685753, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": -20.000000000000007, + "b": 0, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38, + 32.735096646501916, + 18.184064731473775, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + } + ] + }, + { + "coordinates": "XYZBC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 B0 C0\nM428\nG1 X35 Y24 Z32 B25 C40 F900\nG1 X24 Y16 Z24 B-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.482534153247273e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0, + "b": 0.22968749999999996, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.354593296251238, + 10.373322128693975, + 20.04507388460101, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 0, + "b": 1.3545395528575301, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.052857860352518, + 12.228636167480964, + 20.236907267739767, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 0, + "b": 2.9321764100262997, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.32300426056765, + 14.901846411100632, + 20.43125264026292, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 0, + "b": 4.50981326719507, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.4556677943976, + 17.65004041307935, + 20.54933931906639, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 0, + "b": 6.087450124363804, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.44416333968364, + 20.46409437567004, + 20.603831134243293, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 0, + "b": 7.6650869815325375, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.283044229288166, + 23.33461513801611, + 20.607876567489022, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 0, + "b": 9.24272383870132, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.968141666787204, + 26.251966035450025, + 20.575002547782745, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 0, + "b": 10.820360695870146, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.496595270790735, + 29.206293491231953, + 20.519005173143277, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 0, + "b": 12.397997553038973, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.86687451233006, + 32.18755427381161, + 20.45383808115305, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 0, + "b": 13.9756344102078, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.07879086779993, + 35.18554335093002, + 20.39349920852434, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 0, + "b": 15.553271267376624, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.13350056927484, + 38.18992227027549, + 20.35191669295199, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 0, + "b": 17.130908124545453, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.033497894267676, + 41.19024799497426, + 20.342834678764525, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 0, + "b": 18.70854498171428, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.7825989977975, + 44.17600212093312, + 20.37969979138822, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 0, + "b": 20.286181838883106, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.385916350607296, + 47.13662040196324, + 20.475549044342685, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 0, + "b": 21.86381869605193, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.84982390814674, + 50.06152250770351, + 20.642899936386165, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 0, + "b": 23.441455553220756, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.181913195134186, + 52.94014193863117, + 20.893643485548907, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 0, + "b": 24.321021033301516, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.359027118648974, + 54.71638449110792, + 21.171283315559123, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 0, + "b": 23.33197857142857, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.39352693812648, + 53.655161123103774, + 21.32286759551807, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 0, + "b": 21.412857142857153, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.29340512609428, + 51.18596799153211, + 21.531014416050347, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 0, + "b": 19.484285714285733, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.066824879865536, + 48.623328042265186, + 21.843804803184312, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 0, + "b": 17.555714285714313, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.702027680804335, + 45.98918929530564, + 22.24800635763215, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 0, + "b": 15.627142857142896, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.18844703636083, + 43.293688769804604, + 22.730020690488914, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 0, + "b": 13.698571428571476, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.517006338406276, + 40.54705953647175, + 23.27527337004404, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 0, + "b": 11.769999999999937, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.68019795514522, + 37.759594871790796, + 23.868362835349203, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 0, + "b": 9.841428571428393, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.672147779171034, + 34.941612466310545, + 24.493215363781708, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 0, + "b": 7.912857142856847, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.4886647961429, + 32.10341880588485, + 25.13324470418288, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 0, + "b": 5.984285714285303, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.12727536916033, + 29.25527384360638, + 25.77151495819203, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 0, + "b": 4.0557142857137585, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.5872420661815, + 26.407356078667487, + 26.39090527557495, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 0, + "b": 2.1271428571422213, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.869566990660203, + 23.569728156501203, + 26.974274924730324, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0, + "b": 0.19857142857092924, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.976979707844983, + 20.75230310230978, + 27.504627307111022, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": 0, + "b": -1.7300000000003664, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.913909989787918, + 17.96481129748483, + 27.965271503886584, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": 0, + "b": -3.658571428571655, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.68644572996891, + 15.216768305479345, + 28.339979974559384, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": 0, + "b": -5.587142857142947, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.302276502486365, + 12.51744365040088, + 28.613141070102174, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": 0, + "b": -7.515714285714239, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.770623359991134, + 9.8758306479915, + 28.769905077077162, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": 0, + "b": -9.444285714285535, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.1021555779621, + 7.300617384737354, + 28.79632257361365, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": 0, + "b": -11.372857142856823, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.308895159624548, + 4.800158936632201, + 28.67947395245912, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": 0, + "b": -13.301428571428119, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.404110014932954, + 2.3824509146169426, + 28.40758904989635, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": 0, + "b": -15.229999999999407, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.402196817788763, + 0.055104418946017475, + 27.970155911380544, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": 0, + "b": -17.158571428570703, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 5.318554627320388, + -2.1746775202911444, + 27.358017824473237, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": 0, + "b": -18.953399243412633, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 2.3895993001225477, + -4.156226276164592, + 26.624583591622006, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": 0, + "b": -19.89197603358788, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.8399315400023468, + -5.154734948504778, + 26.176389399747194, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": 0, + "b": -20.000000000000007, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.6609101272348354, + -5.267949192431118, + 26.12191484552119, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ] + } + ] +} diff --git a/coverage/glb-machine/jog-limits/shadow.png b/coverage/glb-machine/jog-limits/shadow.png new file mode 100644 index 0000000..db2eeca Binary files /dev/null and b/coverage/glb-machine/jog-limits/shadow.png differ diff --git a/coverage/glb-machine/jog-limits/shadow.report.json b/coverage/glb-machine/jog-limits/shadow.report.json new file mode 100644 index 0000000..627a986 --- /dev/null +++ b/coverage/glb-machine/jog-limits/shadow.report.json @@ -0,0 +1,5 @@ +{ + "report_id": "shadow-warning-v1", + "status": "verified", + "warnings": [] +} diff --git a/coverage/glb-machine/jog-limits/worker.report.json b/coverage/glb-machine/jog-limits/worker.report.json new file mode 100644 index 0000000..d34c824 --- /dev/null +++ b/coverage/glb-machine/jog-limits/worker.report.json @@ -0,0 +1,60 @@ +{ + "report_id": "jog-limit-recovery-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "limit": [ + 0, + 0, + 30, + 50, + 20 + ], + "recovered": [ + 0, + 0, + 30, + 49, + 20 + ], + "rtcp_limit": [ + 161.584370202784, + 99.95244522356447, + 30, + 0, + 31.740000000000453 + ], + "stopped_tick": 1307, + "completed_cycles": 1, + "seq": 291 + }, + { + "coordinates": "XYZBC", + "limit": [ + 0, + 0, + 30, + 50, + 20 + ], + "recovered": [ + 0, + 0, + 30, + 49, + 20 + ], + "rtcp_limit": [ + 161.584370202784, + 99.95244522356447, + 30, + 0, + 31.740000000000453 + ], + "stopped_tick": 1307, + "completed_cycles": 1, + "seq": 291 + } + ] +} diff --git a/coverage/glb-machine/motion.report.json b/coverage/glb-machine/motion.report.json new file mode 100644 index 0000000..f199a69 --- /dev/null +++ b/coverage/glb-machine/motion.report.json @@ -0,0 +1,2544 @@ +{ + "report_id": "glb-machine-five-axis-motion-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 A0 C0\nM428\nG1 X35 Y24 Z32 A25 C40 F900\nG1 X24 Y16 Z24 A-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.2591401799415137e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0.22968749999999996, + "b": 0, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.99595803736646, + 9.874421474017172, + 20.12624077439751, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 1.3545395528575301, + "b": 0, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.95434701862283, + 9.257647365906834, + 20.743322191952068, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 2.9321764100262997, + "b": 0, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.833124292093828, + 8.384734865389902, + 21.60616083887203, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 4.50981326719507, + "b": 0, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.635609460598403, + 7.49750341711335, + 22.46657440661184, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 6.087450124363804, + "b": 0, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.358888206816445, + 6.590046034574037, + 23.324707443401806, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 7.6650869815325375, + "b": 0, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.000370067347152, + 5.656262521201651, + 24.180057881811884, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 9.24272383870132, + "b": 0, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.55779952899828, + 4.689923242944772, + 25.031455090743655, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 10.820360695870146, + "b": 0, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.029266133103974, + 3.684734977856124, + 25.87704364402046, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 12.397997553038973, + "b": 0, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.413213557148122, + 2.6344083490822943, + 26.714272981080555, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 13.9756344102078, + "b": 0, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 16.70844764564024, + 1.5327263336594292, + 27.539893093834166, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 15.553271267376624, + "b": 0, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.914143364935367, + 0.3736133289244634, + 28.349956331230942, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 17.130908124545453, + "b": 0, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.029850659501848, + -0.8487957487481985, + 29.139825369774186, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 18.70854498171428, + "b": 0, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.055499190014691, + -2.1400868617254467, + 29.904187354395702, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 20.286181838883106, + "b": 0, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.991401936579638, + -3.5054992742176942, + 30.63707417005608, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 21.86381869605193, + "b": 0, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.838257653368174, + -4.94985952588366, + 31.331888760448635, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 23.441455553220756, + "b": 0, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.597152163957437, + -6.4775174739041965, + 31.981437366549414, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 24.321021033301516, + "b": 0, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 9.87102928781642, + -7.245549872434104, + 32.49414794112097, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 23.33197857142857, + "b": 0, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.726007873637807, + -5.788403985078261, + 32.73730577435077, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 21.412857142857153, + "b": 0, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 12.36203653051712, + -3.231075744959096, + 32.8109269608977, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 19.484285714285733, + "b": 0, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.980580242285733, + -0.7404921771841426, + 32.766464373464416, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 17.555714285714313, + "b": 0, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 15.570237107614947, + 1.6675534613501029, + 32.61200452902207, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 15.627142857142896, + "b": 0, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.127951943791736, + 3.9908139847170325, + 32.35623658379197, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 13.698571428571476, + "b": 0, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 18.650908000145666, + 6.227777163216452, + 32.00772085126978, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 11.769999999999937, + "b": 0, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.136530696440413, + 8.377631103821685, + 31.574829328143053, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 9.841428571428393, + "b": 0, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 21.58249029485251, + 10.440225044744565, + 31.065690883131552, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 7.912857142856847, + "b": 0, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.98670351023294, + 12.416026099775472, + 30.488141447935618, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 5.984285714285303, + "b": 0, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.347334067326027, + 14.306072511605354, + 29.849679492514724, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 4.0557142857137585, + "b": 0, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 25.662792217542528, + 16.11192399109913, + 29.157427008482472, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 2.1271428571422213, + "b": 0, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.931733231731258, + 17.835609731385446, + 28.418096165068704, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0.19857142857092924, + "b": 0, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.153054889154856, + 19.479574691642114, + 27.637961742435337, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": -1.7300000000003664, + "b": 0, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 29.325893986537977, + 21.046624745627106, + 26.822839387706722, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": -3.658571428571655, + "b": 0, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.449621894603986, + 22.539871284416392, + 25.978069680451114, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": -5.587142857142947, + "b": 0, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.523839192945253, + 23.962675851616893, + 25.10850793706433, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": -7.515714285714239, + "b": 0, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.54836941735962, + 25.318595372704934, + 24.218519628094157, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": -9.444285714285535, + "b": 0, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.52325195693044, + 26.611328518350824, + 23.3119812294998, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": -11.372857142856823, + "b": 0, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.44873414111287, + 27.844663714910965, + 22.392286278641734, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": -13.301428571428119, + "b": 0, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.32526255990824, + 29.022429284032476, + 21.462356358884456, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": -15.229999999999407, + "b": 0, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.153473662849684, + 30.14844615789012, + 20.52465669347393, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": -17.158571428570703, + "b": 0, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.93418368497938, + 31.226483577368235, + 19.581215990188582, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": -18.953399243412633, + "b": 0, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.61894079573156, + 32.189885304600296, + 18.699467974539928, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": -19.89197603358788, + "b": 0, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.961283259435376, + 32.679365598067484, + 18.237296989685753, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": -20.000000000000007, + "b": 0, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38, + 32.735096646501916, + 18.184064731473775, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 18, + "z_offset": -45, + "tool_offset": 0 + } + } + ] + }, + { + "coordinates": "XYZBC", + "source": "G21 G90 G94\nG0 X20 Y10 Z20 B0 C0\nM428\nG1 X35 Y24 Z32 B25 C40 F900\nG1 X24 Y16 Z24 B-20 C-30 F900\nM2\n", + "simultaneous_ticks": 41, + "samples": 42, + "max_error_view_units": 2.482534153247273e-16, + "trajectory": [ + { + "tick": 131, + "pose": { + "x": 20.1378125, + "y": 10.128625, + "z": 20.11025, + "a": 0, + "b": 0.22968749999999996, + "c": 0.3675, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 20.354593296251238, + 10.373322128693975, + 20.04507388460101, + 0.22968749999999996, + 0.3675 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 141, + "pose": { + "x": 20.812723731714517, + "y": 10.758542149600217, + "z": 20.650178985371614, + "a": 0, + "b": 1.3545395528575301, + "c": 2.1672632845720483, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.052857860352518, + 12.228636167480964, + 20.236907267739767, + 1.3545395528575301, + 2.1672632845720483 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 151, + "pose": { + "x": 21.75930584601578, + "y": 11.642018789614728, + "z": 21.407444676812624, + "a": 0, + "b": 2.9321764100262997, + "c": 4.69148225604208, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.32300426056765, + 14.901846411100632, + 20.43125264026292, + 2.9321764100262997, + 4.69148225604208 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 161, + "pose": { + "x": 22.705887960317042, + "y": 12.52549542962924, + "z": 22.164710368253633, + "a": 0, + "b": 4.50981326719507, + "c": 7.215701227512112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.4556677943976, + 17.65004041307935, + 20.54933931906639, + 4.50981326719507, + 7.215701227512112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 171, + "pose": { + "x": 23.652470074618282, + "y": 13.408972069643731, + "z": 22.921976059694625, + "a": 0, + "b": 6.087450124363804, + "c": 9.739920198982086, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.44416333968364, + 20.46409437567004, + 20.603831134243293, + 6.087450124363804, + 9.739920198982086 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 181, + "pose": { + "x": 24.599052188919522, + "y": 14.29244870965822, + "z": 23.679241751135617, + "a": 0, + "b": 7.6650869815325375, + "c": 12.26413917045206, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.283044229288166, + 23.33461513801611, + 20.607876567489022, + 7.6650869815325375, + 12.26413917045206 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 191, + "pose": { + "x": 25.54563430322079, + "y": 15.175925349672738, + "z": 24.436507442576634, + "a": 0, + "b": 9.24272383870132, + "c": 14.788358141922112, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.968141666787204, + 26.251966035450025, + 20.575002547782745, + 9.24272383870132, + 14.788358141922112 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 201, + "pose": { + "x": 26.492216417522087, + "y": 16.05940198968728, + "z": 25.19377313401767, + "a": 0, + "b": 10.820360695870146, + "c": 17.312577113392237, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.496595270790735, + 29.206293491231953, + 20.519005173143277, + 10.820360695870146, + 17.312577113392237 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 211, + "pose": { + "x": 27.438798531823384, + "y": 16.942878629701827, + "z": 25.95103882545871, + "a": 0, + "b": 12.397997553038973, + "c": 19.836796084862357, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.86687451233006, + 32.18755427381161, + 20.45383808115305, + 12.397997553038973, + 19.836796084862357 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 221, + "pose": { + "x": 28.38538064612468, + "y": 17.82635526971637, + "z": 26.708304516899744, + "a": 0, + "b": 13.9756344102078, + "c": 22.36101505633248, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.07879086779993, + 35.18554335093002, + 20.39349920852434, + 13.9756344102078, + 22.36101505633248 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 231, + "pose": { + "x": 29.331962760425974, + "y": 18.709831909730912, + "z": 27.465570208340782, + "a": 0, + "b": 15.553271267376624, + "c": 24.8852340278026, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.13350056927484, + 38.18992227027549, + 20.35191669295199, + 15.553271267376624, + 24.8852340278026 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 241, + "pose": { + "x": 30.27854487472727, + "y": 19.59330854974545, + "z": 28.222835899781817, + "a": 0, + "b": 17.130908124545453, + "c": 27.409452999272727, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.033497894267676, + 41.19024799497426, + 20.342834678764525, + 17.130908124545453, + 27.409452999272727 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 251, + "pose": { + "x": 31.225126989028567, + "y": 20.476785189759998, + "z": 28.980101591222855, + "a": 0, + "b": 18.70854498171428, + "c": 29.933671970742846, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.7825989977975, + 44.17600212093312, + 20.37969979138822, + 18.70854498171428, + 29.933671970742846 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 261, + "pose": { + "x": 32.17170910332986, + "y": 21.36026182977454, + "z": 29.73736728266389, + "a": 0, + "b": 20.286181838883106, + "c": 32.45789094221297, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.385916350607296, + 47.13662040196324, + 20.475549044342685, + 20.286181838883106, + 32.45789094221297 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 271, + "pose": { + "x": 33.11829121763116, + "y": 22.243738469789083, + "z": 30.494632974104928, + "a": 0, + "b": 21.86381869605193, + "c": 34.98210991368309, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.84982390814674, + 50.06152250770351, + 20.642899936386165, + 21.86381869605193, + 34.98210991368309 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 281, + "pose": { + "x": 34.06487333193245, + "y": 23.12721510980363, + "z": 31.251898665545966, + "a": 0, + "b": 23.441455553220756, + "c": 37.50632888515321, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.181913195134186, + 52.94014193863117, + 20.893643485548907, + 23.441455553220756, + 37.50632888515321 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 291, + "pose": { + "x": 34.71940119140948, + "y": 23.756069492934564, + "z": 31.781860381699016, + "a": 0, + "b": 24.321021033301516, + "c": 38.929482224711, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.359027118648974, + 54.71638449110792, + 21.171283315559123, + 24.321021033301516, + 38.929482224711 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 301, + "pose": { + "x": 34.592261428571426, + "y": 23.703462857142856, + "z": 31.703462857142856, + "a": 0, + "b": 23.33197857142857, + "c": 37.4053, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.39352693812648, + 53.655161123103774, + 21.32286759551807, + 23.33197857142857, + 37.4053 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 311, + "pose": { + "x": 34.12314285714286, + "y": 23.362285714285715, + "z": 31.362285714285715, + "a": 0, + "b": 21.412857142857153, + "c": 34.420000000000016, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.29340512609428, + 51.18596799153211, + 21.531014416050347, + 21.412857142857153, + 34.420000000000016 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 321, + "pose": { + "x": 33.65171428571429, + "y": 23.019428571428573, + "z": 31.019428571428573, + "a": 0, + "b": 19.484285714285733, + "c": 31.42000000000003, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.066824879865536, + 48.623328042265186, + 21.843804803184312, + 19.484285714285733, + 31.42000000000003 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 331, + "pose": { + "x": 33.18028571428572, + "y": 22.676571428571435, + "z": 30.676571428571435, + "a": 0, + "b": 17.555714285714313, + "c": 28.420000000000044, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.702027680804335, + 45.98918929530564, + 22.24800635763215, + 17.555714285714313, + 28.420000000000044 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 341, + "pose": { + "x": 32.708857142857156, + "y": 22.333714285714294, + "z": 30.333714285714294, + "a": 0, + "b": 15.627142857142896, + "c": 25.420000000000062, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 39.18844703636083, + 43.293688769804604, + 22.730020690488914, + 15.627142857142896, + 25.420000000000062 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 351, + "pose": { + "x": 32.23742857142858, + "y": 21.990857142857152, + "z": 29.990857142857152, + "a": 0, + "b": 13.698571428571476, + "c": 22.420000000000076, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 38.517006338406276, + 40.54705953647175, + 23.27527337004404, + 13.698571428571476, + 22.420000000000076 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 361, + "pose": { + "x": 31.765999999999984, + "y": 21.64799999999999, + "z": 29.64799999999999, + "a": 0, + "b": 11.769999999999937, + "c": 19.419999999999902, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.68019795514522, + 37.759594871790796, + 23.868362835349203, + 11.769999999999937, + 19.419999999999902 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 371, + "pose": { + "x": 31.294571428571384, + "y": 21.305142857142826, + "z": 29.305142857142826, + "a": 0, + "b": 9.841428571428393, + "c": 16.419999999999725, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 36.672147779171034, + 34.941612466310545, + 24.493215363781708, + 9.841428571428393, + 16.419999999999725 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 381, + "pose": { + "x": 30.823142857142784, + "y": 20.962285714285663, + "z": 28.962285714285663, + "a": 0, + "b": 7.912857142856847, + "c": 13.419999999999543, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.4886647961429, + 32.10341880588485, + 25.13324470418288, + 7.912857142856847, + 13.419999999999543 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 391, + "pose": { + "x": 30.351714285714184, + "y": 20.6194285714285, + "z": 28.6194285714285, + "a": 0, + "b": 5.984285714285303, + "c": 10.419999999999362, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 34.12727536916033, + 29.25527384360638, + 25.77151495819203, + 5.984285714285303, + 10.419999999999362 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 401, + "pose": { + "x": 29.880285714285584, + "y": 20.276571428571334, + "z": 28.276571428571334, + "a": 0, + "b": 4.0557142857137585, + "c": 7.4199999999991775, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 32.5872420661815, + 26.407356078667487, + 26.39090527557495, + 4.0557142857137585, + 7.4199999999991775 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 411, + "pose": { + "x": 29.408857142856988, + "y": 19.933714285714174, + "z": 27.933714285714174, + "a": 0, + "b": 2.1271428571422213, + "c": 4.419999999999014, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.869566990660203, + 23.569728156501203, + 26.974274924730324, + 2.1271428571422213, + 4.419999999999014 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 421, + "pose": { + "x": 28.93742857142845, + "y": 19.590857142857054, + "z": 27.590857142857054, + "a": 0, + "b": 0.19857142857092924, + "c": 1.4199999999992272, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 28.976979707844983, + 20.75230310230978, + 27.504627307111022, + 0.19857142857092924, + 1.4199999999992272 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 431, + "pose": { + "x": 28.465999999999912, + "y": 19.247999999999937, + "z": 27.247999999999937, + "a": 0, + "b": -1.7300000000003664, + "c": -1.5800000000005667, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.913909989787918, + 17.96481129748483, + 27.965271503886584, + -1.7300000000003664, + -1.5800000000005667 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 441, + "pose": { + "x": 27.994571428571373, + "y": 18.905142857142817, + "z": 26.905142857142817, + "a": 0, + "b": -3.658571428571655, + "c": -4.5800000000003465, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 24.68644572996891, + 15.216768305479345, + 28.339979974559384, + -3.658571428571655, + -4.5800000000003465 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 451, + "pose": { + "x": 27.523142857142837, + "y": 18.5622857142857, + "z": 26.5622857142857, + "a": 0, + "b": -5.587142857142947, + "c": -7.580000000000133, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.302276502486365, + 12.51744365040088, + 28.613141070102174, + -5.587142857142947, + -7.580000000000133 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 461, + "pose": { + "x": 27.051714285714297, + "y": 18.21942857142858, + "z": 26.21942857142858, + "a": 0, + "b": -7.515714285714239, + "c": -10.57999999999992, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 19.770623359991134, + 9.8758306479915, + 28.769905077077162, + -7.515714285714239, + -10.57999999999992 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 471, + "pose": { + "x": 26.580285714285758, + "y": 17.876571428571463, + "z": 25.876571428571463, + "a": 0, + "b": -9.444285714285535, + "c": -13.579999999999707, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.1021555779621, + 7.300617384737354, + 28.79632257361365, + -9.444285714285535, + -13.579999999999707 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 481, + "pose": { + "x": 26.10885714285722, + "y": 17.533714285714343, + "z": 25.533714285714343, + "a": 0, + "b": -11.372857142856823, + "c": -16.5799999999995, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 14.308895159624548, + 4.800158936632201, + 28.67947395245912, + -11.372857142856823, + -16.5799999999995 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 491, + "pose": { + "x": 25.637428571428686, + "y": 17.190857142857226, + "z": 25.190857142857226, + "a": 0, + "b": -13.301428571428119, + "c": -19.579999999999288, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 11.404110014932954, + 2.3824509146169426, + 28.40758904989635, + -13.301428571428119, + -19.579999999999288 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 501, + "pose": { + "x": 25.166000000000146, + "y": 16.848000000000106, + "z": 24.848000000000106, + "a": 0, + "b": -15.229999999999407, + "c": -22.579999999999075, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.402196817788763, + 0.055104418946017475, + 27.970155911380544, + -15.229999999999407, + -22.579999999999075 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 511, + "pose": { + "x": 24.694571428571606, + "y": 16.50514285714299, + "z": 24.50514285714299, + "a": 0, + "b": -17.158571428570703, + "c": -25.57999999999886, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 5.318554627320388, + -2.1746775202911444, + 27.358017824473237, + -17.158571428570703, + -25.57999999999886 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 521, + "pose": { + "x": 24.255835740499133, + "y": 16.186062356726644, + "z": 24.186062356726644, + "a": 0, + "b": -18.953399243412633, + "c": -28.371954378641874, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 2.3895993001225477, + -4.156226276164592, + 26.624583591622006, + -18.953399243412633, + -28.371954378641874 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 531, + "pose": { + "x": 24.026405858456297, + "y": 16.01920426069549, + "z": 24.01920426069549, + "a": 0, + "b": -19.89197603358788, + "c": -29.83196271891447, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.8399315400023468, + -5.154734948504778, + 26.176389399747194, + -19.89197603358788, + -29.83196271891447 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + }, + { + "tick": 541, + "pose": { + "x": 24, + "y": 16, + "z": 24, + "a": 0, + "b": -20.000000000000007, + "c": -30, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.6609101272348354, + -5.267949192431118, + 26.12191484552119, + -20.000000000000007, + -30 + ], + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + } + } + ] + } + ] +} diff --git a/coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json b/coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json new file mode 100644 index 0000000..aa0b8f1 --- /dev/null +++ b/coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json @@ -0,0 +1,657 @@ +{ + "report_id": "trt-rtcp-jog-browser-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "rows": [ + { + "axis": "a", + "before": { + "joints": [ + 4.666649999999989, + 4.466649999999994, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 64, + "rendered_tick": 64, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 4.666649999999989, + 6.351865924731886, + -2.4504376825076157, + 9.599999999999989, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 106, + "rendered_tick": 100, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 0 + }, + "stopped": { + "joints": [ + 4.666649999999989, + 6.749678153480922, + -2.8729923943953075, + 11.39999999999995, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 117, + "rendered_tick": 117, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 3.469446951953614e-17 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 4.666649999999989, + 6.749678153480922, + -2.8729923943953075, + 11.39999999999995, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 117, + "rendered_tick": 117, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 4.3018149555329135, + 7.095098216652044, + -2.803343492369457, + 11.39999999999995, + 4.499999999999995 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 142, + "rendered_tick": 142, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 1.962615573354719e-17 + }, + "stopped": { + "joints": [ + 4.148323132140086, + 7.22522468303406, + -2.7771053942555053, + 11.39999999999995, + 6.30000000000001 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 148, + "rendered_tick": 148, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 2.237726045655905e-16 + } + }, + { + "axis": "a", + "before": { + "joints": [ + 4.148323132140086, + 7.22522468303406, + -2.7771053942555053, + 11.39999999999995, + 6.30000000000001 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 148, + "rendered_tick": 148, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 4.148323132140086, + 9.152980104837122, + -4.449618197337122, + 19.49999999999997, + 6.30000000000001 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 185, + "rendered_tick": 173, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 2.7755575615628914e-17 + }, + "stopped": { + "joints": [ + 4.148323132140086, + 9.612205930334579, + -4.783201311661127, + 21.299999999999933, + 6.30000000000001 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 196, + "rendered_tick": 196, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 2.2473876566261383e-16 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 4.148323132140086, + 9.612205930334579, + -4.783201311661127, + 21.299999999999933, + 6.30000000000001 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 196, + "rendered_tick": 196, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 3.551689196192138, + 10.025858124581516, + -4.621925060367616, + 21.299999999999933, + 12.900000000000022 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 228, + "rendered_tick": 222, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 2.8609792490763984e-17 + }, + "stopped": { + "joints": [ + 3.3804521353118124, + 10.127318160847281, + -4.582367445219857, + 21.299999999999933, + 14.700000000000024 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 239, + "rendered_tick": 239, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 3.469446951953614e-17 + } + } + ] + }, + { + "coordinates": "XYZBC", + "rows": [ + { + "axis": "b", + "before": { + "joints": [ + 4.66664999999999, + 3.266650000000003, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 297, + "rendered_tick": 297, + "tool_tip": [ + 0, + 1.5, + 0 + ] + }, + "moving": { + "joints": [ + 5.767497386045921, + 3.266650000000003, + -1.981563047638323, + 4.499999999999995, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 322, + "rendered_tick": 322, + "tool_tip": [ + 0, + 1.4801843695236168, + 0 + ], + "tcp_error": 2.2215299868541707e-16 + }, + "stopped": { + "joints": [ + 6.16370166824418, + 3.266650000000003, + -2.797363512846239, + 6.30000000000001, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 333, + "rendered_tick": 328, + "tool_tip": [ + 0, + 1.4720263648715377, + 0 + ], + "tcp_error": 2.0816681711721685e-17 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 6.16370166824418, + 3.266650000000003, + -2.797363512846239, + 6.30000000000001, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 333, + "rendered_tick": 333, + "tool_tip": [ + 0, + 1.4720263648715377, + 0 + ] + }, + "moving": { + "joints": [ + 5.536391282129575, + 4.0203403161023985, + -2.7281078014596485, + 6.30000000000001, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 376, + "rendered_tick": 369, + "tool_tip": [ + 0, + 1.4725602353149239, + 0 + ], + "tcp_error": 6.938893903907228e-18 + }, + "stopped": { + "joints": [ + 5.408892699222715, + 4.145115526193058, + -2.714031826861671, + 6.30000000000001, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 387, + "rendered_tick": 387, + "tool_tip": [ + 0, + 1.4728596817313833, + 0 + ], + "tcp_error": 9.813077866773595e-18 + } + }, + { + "axis": "b", + "before": { + "joints": [ + 5.408892699222715, + 4.145115526193058, + -2.714031826861671, + 6.30000000000001, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 387, + "rendered_tick": 387, + "tool_tip": [ + 0, + 1.4728596817313833, + 0 + ] + }, + "moving": { + "joints": [ + 6.294511515825764, + 4.145115526193058, + -4.745464111131721, + 10.800000000000004, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 412, + "rendered_tick": 412, + "tool_tip": [ + 0, + 1.4525453588886827, + 0 + ], + "tcp_error": 2.260205560892005e-16 + }, + "stopped": { + "joints": [ + 6.603639517943392, + 4.145115526193058, + -5.576454671870996, + 12.60000000000002, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 423, + "rendered_tick": 418, + "tool_tip": [ + 0, + 1.44423545328129, + 0 + ], + "tcp_error": 2.225860458774576e-16 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 6.603639517943392, + 4.145115526193058, + -5.576454671870996, + 12.60000000000002, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 423, + "rendered_tick": 423, + "tool_tip": [ + 0, + 1.44423545328129, + 0 + ] + }, + "moving": { + "joints": [ + 5.553928059363571, + 4.94271622192026, + -5.341816361477811, + 12.60000000000002, + 25.19999999999985 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 478, + "rendered_tick": 477, + "tool_tip": [ + 0, + 1.4465254658419693, + 0 + ], + "tcp_error": 1.3877787807814457e-17 + }, + "stopped": { + "joints": [ + 5.401049028353562, + 5.029221227849476, + -5.30764384936742, + 12.60000000000002, + 26.999999999999808 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 489, + "rendered_tick": 489, + "tool_tip": [ + 0, + 1.4469235615063258, + 0 + ], + "tcp_error": 6.938893903907228e-18 + } + } + ] + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/regression-jog/rtcp-jog-xyzac.png b/coverage/glb-machine/regression-jog/rtcp-jog-xyzac.png new file mode 100644 index 0000000..45d1f31 Binary files /dev/null and b/coverage/glb-machine/regression-jog/rtcp-jog-xyzac.png differ diff --git a/coverage/glb-machine/regression-jog/rtcp-jog-xyzbc.png b/coverage/glb-machine/regression-jog/rtcp-jog-xyzbc.png new file mode 100644 index 0000000..6b34125 Binary files /dev/null and b/coverage/glb-machine/regression-jog/rtcp-jog-xyzbc.png differ diff --git a/coverage/glb-machine/regression-parametric/browser.report.json b/coverage/glb-machine/regression-parametric/browser.report.json new file mode 100644 index 0000000..ce26296 --- /dev/null +++ b/coverage/glb-machine/regression-parametric/browser.report.json @@ -0,0 +1,73 @@ +{ + "report_id": "trt-parametric-browser-v1", + "status": "verified", + "machines": [ + { + "id": "xyzac-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "export_bytes": 4867, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc", + "canvas": { + "hash": 785034247, + "colors": 1181, + "width": 472, + "height": 281 + } + }, + { + "id": "xyzbc-trt", + "offsets": { + "x_rot_point": 24, + "y_rot_point": -12, + "z_rot_point": 8, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "export_bytes": 4875, + "preserved_program": "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc", + "canvas": { + "hash": 3432713434, + "colors": 1259, + "width": 472, + "height": 281 + } + } + ], + "viewports": [ + { + "width": 1440, + "height": 1000, + "canvas": { + "hash": 430737702, + "colors": 1278, + "width": 472, + "height": 281 + }, + "controls_fit": true, + "interactive": true + }, + { + "width": 390, + "height": 844, + "canvas": { + "hash": 1968984145, + "colors": 1421, + "width": 368, + "height": 299 + }, + "controls_fit": true, + "interactive": true + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/regression-parametric/layout-1440.png b/coverage/glb-machine/regression-parametric/layout-1440.png new file mode 100644 index 0000000..6a73b75 Binary files /dev/null and b/coverage/glb-machine/regression-parametric/layout-1440.png differ diff --git a/coverage/glb-machine/regression-parametric/layout-390.png b/coverage/glb-machine/regression-parametric/layout-390.png new file mode 100644 index 0000000..fffa183 Binary files /dev/null and b/coverage/glb-machine/regression-parametric/layout-390.png differ diff --git a/coverage/glb-machine/regression-parametric/xyzac-trt-model.png b/coverage/glb-machine/regression-parametric/xyzac-trt-model.png new file mode 100644 index 0000000..91d3e1a Binary files /dev/null and b/coverage/glb-machine/regression-parametric/xyzac-trt-model.png differ diff --git a/coverage/glb-machine/regression-parametric/xyzbc-trt-model.png b/coverage/glb-machine/regression-parametric/xyzbc-trt-model.png new file mode 100644 index 0000000..5b5e93c Binary files /dev/null and b/coverage/glb-machine/regression-parametric/xyzbc-trt-model.png differ diff --git a/coverage/glb-machine/reproducibility.report.json b/coverage/glb-machine/reproducibility.report.json new file mode 100644 index 0000000..1fca7b0 --- /dev/null +++ b/coverage/glb-machine/reproducibility.report.json @@ -0,0 +1,14 @@ +{ + "report_id": "glb-machine-reproducibility-v1", + "status": "verified", + "generated_files_identical": true, + "production_glb_identical": true, + "sha256": { + "LICENSE.txt": "e08dd9a67a260e10205ed953751b46cc9fb4b764fa9b87ee2a239654aaabb4b0", + "demo-ac-xyz-head.glb": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "demo-ac-xyz-head.urdf": "558ce184a083a9ad5070ac2555bd05f18bdbdd8e537882c0a0443ebdb30abce6", + "demo-bc-xyz-head.glb": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "demo-bc-xyz-head.urdf": "6f08b6d3f534b6930d50b73b38a4db103246929f59ccdc09d4423bc1e6632f5b", + "manifest.json": "a9222f10610e68cfda0e59a759c1fffa5a743e01f079f086bc743b260796afdd" + } +} diff --git a/coverage/glb-machine/switching/ac-identity.png b/coverage/glb-machine/switching/ac-identity.png new file mode 100644 index 0000000..2954f2c Binary files /dev/null and b/coverage/glb-machine/switching/ac-identity.png differ diff --git a/coverage/glb-machine/switching/ac-tcp.png b/coverage/glb-machine/switching/ac-tcp.png new file mode 100644 index 0000000..2954f2c Binary files /dev/null and b/coverage/glb-machine/switching/ac-tcp.png differ diff --git a/coverage/glb-machine/switching/acceptance.report.json b/coverage/glb-machine/switching/acceptance.report.json new file mode 100644 index 0000000..f3e4299 --- /dev/null +++ b/coverage/glb-machine/switching/acceptance.report.json @@ -0,0 +1,80 @@ +{ + "report_id": "trt-stationary-switch-acceptance-v1", + "status": "verified", + "tasks": [ + "TRT-SW01" + ], + "worker_switches": 64, + "browser_switches": 22, + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "evidence": [ + { + "path": "coverage/glb-machine/switching/ac-identity.png", + "sha256": "25fa37dbd4f797632c90e389e5623125d9ca7d4ca798bd8685fe62c0b0a43a8c" + }, + { + "path": "coverage/glb-machine/switching/ac-tcp.png", + "sha256": "25fa37dbd4f797632c90e389e5623125d9ca7d4ca798bd8685fe62c0b0a43a8c" + }, + { + "path": "coverage/glb-machine/switching/bc-identity.png", + "sha256": "19b4bc52305dd95da2eaade3e020e3aed95dcbfe25717f4d3b8d25f71e7738d6" + }, + { + "path": "coverage/glb-machine/switching/bc-tcp.png", + "sha256": "19b4bc52305dd95da2eaade3e020e3aed95dcbfe25717f4d3b8d25f71e7738d6" + }, + { + "path": "coverage/glb-machine/switching/before.log", + "sha256": "60f5c62ca3ca2ace4a835ca050991e2816ffb246f2c8019ae600818690201571" + }, + { + "path": "coverage/glb-machine/switching/browser.log", + "sha256": "22ca4ed02fdba98a5db00d0c03ae811275c75d12398794317704c3d249a3e0b4" + }, + { + "path": "coverage/glb-machine/switching/browser.report.json", + "sha256": "c8d11754aae53c5f925566a408a083aa385fe2f772e7a05d793846385466f2d5" + }, + { + "path": "coverage/glb-machine/switching/build.log", + "sha256": "c613842ac193eeaab2e62ad8f4c577850c4f253a5a02811a191c2fe462165364" + }, + { + "path": "coverage/glb-machine/switching/rtcp-jog/rtcp-jog-browser.report.json", + "sha256": "50f9b2eb75fcbf9c5e32798fb6f4acaa31bd6a6e0925372f7deb965515c1dbf3" + }, + { + "path": "coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzac.png", + "sha256": "341085263c16dfc8a34519d0ea196f3ee3a753d6f817aa5f598d0ba61372c9cc" + }, + { + "path": "coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzbc.png", + "sha256": "f58186f1a905837ba3b74043e9f8f677c2bfdde849faa651e269f9943f5932fe" + }, + { + "path": "coverage/glb-machine/switching/rtcp-jog.log", + "sha256": "ba3a14b05c5192abf55f59e8f054df5cc53e3845180d90b009596c3af0533bd1" + }, + { + "path": "coverage/glb-machine/switching/runtime-followups.log", + "sha256": "d0f18fbe4749d2a89fac242e99596c125ad8aa056067d18b59589519d83c6b46" + }, + { + "path": "coverage/glb-machine/switching/step-flow.log", + "sha256": "897d2f0bbd0c40e64ae9fc311206cf89bb4fa220b2662bf33bf4b87aac406321" + }, + { + "path": "coverage/glb-machine/switching/trt-case.log", + "sha256": "801631666fa3854d136b8931b345ec2d929978b7b71ba9cbf4ea1f6a472934c1" + }, + { + "path": "coverage/glb-machine/switching/worker.log", + "sha256": "900bae7be8a9bf9d1a77b2e6255adceb0c054fe29224f13c96d02e1f2b36ee1c" + }, + { + "path": "coverage/glb-machine/switching/worker.report.json", + "sha256": "c1afd5ea8d12774b4cf2a241ccf5fb81ade2969ff219d71b57584715ec9944ef" + } + ] +} diff --git a/coverage/glb-machine/switching/bc-identity.png b/coverage/glb-machine/switching/bc-identity.png new file mode 100644 index 0000000..bed7fa8 Binary files /dev/null and b/coverage/glb-machine/switching/bc-identity.png differ diff --git a/coverage/glb-machine/switching/bc-tcp.png b/coverage/glb-machine/switching/bc-tcp.png new file mode 100644 index 0000000..bed7fa8 Binary files /dev/null and b/coverage/glb-machine/switching/bc-tcp.png differ diff --git a/coverage/glb-machine/switching/browser.report.json b/coverage/glb-machine/switching/browser.report.json new file mode 100644 index 0000000..2c76514 --- /dev/null +++ b/coverage/glb-machine/switching/browser.report.json @@ -0,0 +1,445 @@ +{ + "report_id": "trt-stationary-switch-browser-v1", + "status": "verified", + "machines": [ + { + "id": "ac", + "initial": { + "joints": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.44585800000000003, + -9.900036346266462e-17 + ], + "tick": 625 + }, + "rows": [ + { + "type": 1, + "after": { + "joints": [ + -3.552713678800501e-15, + -3.552713678800501e-15, + 44.585800000000035, + 4.8675, + 179.88 + ], + "tip": [ + -3.552713678800501e-17, + 0.44585800000000037, + -1.345275002506697e-16 + ], + "tick": 625 + } + }, + { + "type": 0, + "after": { + "joints": [ + -3.552713678800501e-15, + -3.552713678800501e-15, + 44.585800000000035, + 4.8675, + 179.88 + ], + "tip": [ + -3.552713678800501e-17, + 0.44585800000000037, + -1.345275002506697e-16 + ], + "tick": 625 + } + }, + { + "type": 1, + "after": { + "joints": [ + -1.0658141036401503e-14, + -7.105427357601002e-15, + 44.58580000000006, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.44585800000000064, + -1.7005463703867476e-16 + ], + "tick": 625 + } + }, + { + "type": 0, + "after": { + "joints": [ + -1.0658141036401503e-14, + -7.105427357601002e-15, + 44.58580000000006, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.44585800000000064, + -1.7005463703867476e-16 + ], + "tick": 625 + } + }, + { + "type": 2, + "after": { + "joints": [ + -1.0658141036401503e-14, + -7.105427357601002e-15, + 44.58580000000006, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.44585800000000064, + -1.7005463703867476e-16 + ], + "tick": 625 + } + }, + { + "type": 1, + "after": { + "joints": [ + -1.0658141036401503e-14, + -1.2434497875801753e-14, + 44.58580000000009, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.4458580000000009, + -2.2334534222068237e-16 + ], + "tick": 625 + } + }, + { + "type": 0, + "after": { + "joints": [ + -1.0658141036401503e-14, + -1.2434497875801753e-14, + 44.58580000000009, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.4458580000000009, + -2.2334534222068237e-16 + ], + "tick": 625 + } + }, + { + "mdi": true, + "type": 1, + "after": { + "joints": [ + -1.0658141036401503e-14, + -1.7763568394002505e-14, + 44.58580000000012, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.4458580000000012, + -2.7663604740268993e-16 + ], + "tick": 625 + } + }, + { + "mdi": true, + "type": 0, + "after": { + "joints": [ + -1.0658141036401503e-14, + -1.7763568394002505e-14, + 44.58580000000012, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.4458580000000012, + -2.7663604740268993e-16 + ], + "tick": 625 + } + }, + { + "mdi": true, + "type": 1, + "after": { + "joints": [ + -1.0658141036401503e-14, + -2.1316282072803006e-14, + 44.58580000000015, + 4.8675, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.4458580000000015, + -3.1216318419069497e-16 + ], + "tick": 625 + } + } + ], + "afterJog": { + "joints": [ + -1.0658141036401503e-14, + -1.8032297033992322, + 44.43311591629053, + 6.135000000000001, + 179.88 + ], + "tip": [ + -1.0658141036401502e-16, + 0.44433115916290533, + -0.01803229703399242 + ], + "tick": 638 + }, + "tcp_jog_error": 1.8215615495386383e-16 + }, + { + "id": "bc", + "initial": { + "joints": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.44585800000000003, + -9.900036346266462e-17 + ], + "tick": 1263 + }, + "rows": [ + { + "type": 1, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 0, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 1, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 0, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 2, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 1, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "type": 0, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "mdi": true, + "type": 1, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "mdi": true, + "type": 0, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + }, + { + "mdi": true, + "type": 1, + "after": { + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "tip": [ + 0, + 0.4458580000000001, + -1.1676393185666712e-16 + ], + "tick": 1263 + } + } + ], + "afterJog": { + "joints": [ + 1.606594333188152, + -1.7763568394002505e-15, + 44.65652049853526, + 6.135000000000001, + 179.88 + ], + "tip": [ + 0.01606594333188152, + 0.44656520498535257, + -1.1692096290824073e-16 + ], + "tick": 1276 + }, + "tcp_jog_error": 9.692650329883268e-17 + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-browser.report.json b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-browser.report.json new file mode 100644 index 0000000..4ffa447 --- /dev/null +++ b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-browser.report.json @@ -0,0 +1,657 @@ +{ + "report_id": "trt-rtcp-jog-browser-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "rows": [ + { + "axis": "a", + "before": { + "joints": [ + 4.266649999999998, + 3.8666500000000035, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 59, + "rendered_tick": 59, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 4.266649999999998, + 5.373074052273088, + -2.0970252352474255, + 7.800000000000022, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 95, + "rendered_tick": 95, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 2.2247786310271853e-16 + }, + "stopped": { + "joints": [ + 4.266649999999998, + 5.760268302489592, + -2.550498930537275, + 9.599999999999989, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 106, + "rendered_tick": 106, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 6.938893903907228e-18 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 4.266649999999998, + 5.760268302489592, + -2.550498930537275, + 9.599999999999989, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 106, + "rendered_tick": 106, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 3.6792686907248924, + 6.314990873253862, + -2.456674630617826, + 9.599999999999989, + 8.100000000000021 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 143, + "rendered_tick": 142, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 3.1031676915590914e-17 + }, + "stopped": { + "joints": [ + 3.5383270508428857, + 6.426786115491513, + -2.4377658807488203, + 9.599999999999989, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 154, + "rendered_tick": 154, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 4.449557262054371e-16 + } + }, + { + "axis": "a", + "before": { + "joints": [ + 3.5383270508428857, + 6.426786115491513, + -2.4377658807488203, + 9.599999999999989, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 154, + "rendered_tick": 154, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 3.5383270508428857, + 8.7673143138403, + -4.586189616718839, + 19.49999999999997, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 197, + "rendered_tick": 192, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 3.469446951953614e-17 + }, + "stopped": { + "joints": [ + 3.5383270508428857, + 8.843841049987784, + -4.644803608823022, + 19.799999999999965, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 203, + "rendered_tick": 203, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 4.449557262054371e-16 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 3.5383270508428857, + 8.843841049987784, + -4.644803608823022, + 19.799999999999965, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 203, + "rendered_tick": 203, + "tool_tip": [ + 0, + 2, + 0 + ] + }, + "moving": { + "joints": [ + 2.5165393432010794, + 9.442610140256845, + -4.429233471737167, + 19.799999999999965, + 21.89999999999992 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 253, + "rendered_tick": 253, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 4.220764384040162e-17 + }, + "stopped": { + "joints": [ + 2.352620433265477, + 9.514578932735887, + -4.403323112113162, + 19.799999999999965, + 23.699999999999882 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": 0, + "y_offset": 20, + "z_offset": 10, + "tool_offset": 0 + }, + "tick": 264, + "rendered_tick": 264, + "tool_tip": [ + 0, + 2, + 0 + ], + "tcp_error": 4.4565853017185e-16 + } + } + ] + }, + { + "coordinates": "XYZBC", + "rows": [ + { + "axis": "b", + "before": { + "joints": [ + 4.66664999999999, + 3.466650000000003, + 0, + 0, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 323, + "rendered_tick": 323, + "tool_tip": [ + 0, + 1.5, + 0 + ] + }, + "moving": { + "joints": [ + 7.440193096216049, + 3.466650000000003, + -6.028967447117559, + 13.199999999999912, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 377, + "rendered_tick": 377, + "tool_tip": [ + 0, + 1.4397103255288244, + 0 + ], + "tcp_error": 2.0816681711721685e-17 + }, + "stopped": { + "joints": [ + 7.708439959571031, + 3.466650000000003, + -6.8953114045420065, + 14.999999999999874, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 388, + "rendered_tick": 388, + "tool_tip": [ + 0, + 1.43104688595458, + 0 + ], + "tcp_error": 2.7755575615628914e-17 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 7.708439959571031, + 3.466650000000003, + -6.8953114045420065, + 14.999999999999874, + 0 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 388, + "rendered_tick": 388, + "tool_tip": [ + 0, + 1.43104688595458, + 0 + ] + }, + "moving": { + "joints": [ + 7.065609001826186, + 4.217362181333353, + -6.72306536854455, + 14.999999999999874, + 9.899999999999983 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 431, + "rendered_tick": 431, + "tool_tip": [ + 0, + 1.4327693463145545, + 0 + ], + "tcp_error": 1.3877787807814457e-17 + }, + "stopped": { + "joints": [ + 6.935745229993923, + 4.340960088317411, + -6.688268475756038, + 14.999999999999874, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 442, + "rendered_tick": 442, + "tool_tip": [ + 0, + 1.4331173152424395, + 0 + ], + "tcp_error": 2.2484586062492886e-16 + } + }, + { + "axis": "b", + "before": { + "joints": [ + 6.935745229993923, + 4.340960088317411, + -6.688268475756038, + 14.999999999999874, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 442, + "rendered_tick": 442, + "tool_tip": [ + 0, + 1.4331173152424395, + 0 + ] + }, + "moving": { + "joints": [ + 7.5048422561251655, + 4.340960088317411, + -8.827244983646052, + 19.49999999999987, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 467, + "rendered_tick": 461, + "tool_tip": [ + 0, + 1.4203008382911364, + 0 + ], + "tcp_error": 1.5515838457795457e-17 + }, + "stopped": { + "joints": [ + 7.685161197488696, + 4.340960088317411, + -9.694238839212831, + 21.299999999999883, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 478, + "rendered_tick": 478, + "tool_tip": [ + 0, + 1.4030576116078717, + 0 + ], + "tcp_error": 2.1942709178604383e-17 + } + }, + { + "axis": "c", + "before": { + "joints": [ + 7.685161197488696, + 4.340960088317411, + -9.694238839212831, + 21.299999999999883, + 11.699999999999944 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 478, + "rendered_tick": 478, + "tool_tip": [ + 0, + 1.4030576116078717, + 0 + ] + }, + "moving": { + "joints": [ + 6.765551237557826, + 5.050031321132119, + -9.335697898169764, + 21.299999999999883, + 23.699999999999882 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 528, + "rendered_tick": 522, + "tool_tip": [ + 0, + 1.4060719741862095, + 0 + ], + "tcp_error": 2.237726045655905e-16 + }, + "stopped": { + "joints": [ + 6.641467483723151, + 5.123681632413464, + -9.287319664128686, + 21.299999999999883, + 25.19999999999985 + ], + "offsets": { + "x_rot_point": 0, + "y_rot_point": 0, + "z_rot_point": 0, + "x_offset": -20, + "y_offset": 0, + "z_offset": -15, + "tool_offset": 0 + }, + "tick": 538, + "rendered_tick": 538, + "tool_tip": [ + 0, + 1.4071268033587132, + 0 + ], + "tcp_error": 4.163336342344337e-17 + } + } + ] + } + ], + "browser_errors": [] +} diff --git a/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzac.png b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzac.png new file mode 100644 index 0000000..3f197e0 Binary files /dev/null and b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzac.png differ diff --git a/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzbc.png b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzbc.png new file mode 100644 index 0000000..c0a34f5 Binary files /dev/null and b/coverage/glb-machine/switching/rtcp-jog/rtcp-jog-xyzbc.png differ diff --git a/coverage/glb-machine/switching/worker.report.json b/coverage/glb-machine/switching/worker.report.json new file mode 100644 index 0000000..8e960eb --- /dev/null +++ b/coverage/glb-machine/switching/worker.report.json @@ -0,0 +1,2622 @@ +{ + "report_id": "trt-stationary-switch-worker-v1", + "status": "verified", + "machines": [ + { + "coordinates": "XYZAC", + "rows": [ + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -3.552713678800501e-15, + -3.552713678800501e-15, + 44.585800000000035, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": 0, + "z": 44.5858, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854231, + "y": -30.89402942670417, + "z": 44.800678422383086, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -3.552713678800501e-15, + -3.552713678800501e-15, + 44.585800000000035, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854231, + "y": -30.89402942670417, + "z": 44.800678422383086, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -3.552713678800501e-15, + "y": -3.552713678800501e-15, + "z": 44.585800000000035, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -7.105427357601002e-15, + 44.58580000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -3.552713678800501e-15, + "y": -3.552713678800501e-15, + "z": 44.585800000000035, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.89402942670417, + "z": 44.800678422383115, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -1.2434497875801753e-14, + 44.58580000000009, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.89402942670417, + "z": 44.800678422383115, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.894029426704165, + "z": 44.80067842238314, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -1.2434497875801753e-14, + 44.58580000000009, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.894029426704165, + "z": 44.80067842238314, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -1.2434497875801753e-14, + "z": 44.58580000000009, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 2, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -1.2434497875801753e-14, + 44.58580000000009, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -1.2434497875801753e-14, + "z": 44.58580000000009, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -1.2434497875801753e-14, + "z": 44.58580000000009, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -1.7763568394002505e-14, + 44.58580000000012, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -1.2434497875801753e-14, + "z": 44.58580000000009, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.89402942670416, + "z": 44.80067842238317, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -1.7763568394002505e-14, + 44.58580000000012, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.89402942670416, + "z": 44.80067842238317, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -1.7763568394002505e-14, + "z": 44.58580000000012, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -2.1316282072803006e-14, + 44.58580000000015, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -1.7763568394002505e-14, + "z": 44.58580000000012, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.89402942670416, + "z": 44.8006784223832, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -2.1316282072803006e-14, + 44.58580000000015, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.89402942670416, + "z": 44.8006784223832, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -2.1316282072803006e-14, + "z": 44.58580000000015, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -2.6645352591003757e-14, + 44.58580000000018, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -2.1316282072803006e-14, + "z": 44.58580000000015, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.894029426704158, + "z": 44.80067842238323, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -3.197442310920451e-14, + 44.58580000000019, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.894029426704158, + "z": 44.80067842238323, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.894029426704154, + "z": 44.80067842238326, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -3.197442310920451e-14, + 44.58580000000019, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.894029426704154, + "z": 44.80067842238326, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -3.197442310920451e-14, + "z": 44.58580000000019, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 2, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -3.197442310920451e-14, + 44.58580000000019, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -3.197442310920451e-14, + "z": 44.58580000000019, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -3.197442310920451e-14, + "z": 44.58580000000019, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -3.730349362740526e-14, + 44.585800000000205, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -1.0658141036401503e-14, + "y": -3.197442310920451e-14, + "z": 44.58580000000019, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 48.03962425854232, + "y": -30.89402942670415, + "z": 44.80067842238327, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + -1.0658141036401503e-14, + -3.730349362740526e-14, + 44.585800000000205, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 48.03962425854232, + "y": -30.89402942670415, + "z": 44.80067842238327, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -1.0658141036401503e-14, + "y": -3.730349362740526e-14, + "z": 44.585800000000205, + "a": 4.8675, + "b": 0, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000003, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.3074720899351, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000003, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.3074720899351, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.00000000000003, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000006, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.00000000000003, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.30747208993512, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000009, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.30747208993512, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.30747208993515, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000009, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.30747208993515, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.00000000000009, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 2, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000009, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.00000000000009, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.00000000000009, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.0000000000001, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.00000000000009, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.30747208993517, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.0000000000001, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.30747208993517, + "y": -61.45350366426106, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.0000000000001, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000014, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.0000000000001, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.3074720899352, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000014, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.3074720899352, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.00000000000014, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000017, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.00000000000014, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.30747208993523, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.0000000000002, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.30747208993523, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.30747208993526, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.0000000000002, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.30747208993526, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.0000000000002, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 2, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.0000000000002, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.0000000000002, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.0000000000002, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000023, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": 190.0000000000002, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -138.3074720899353, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 190.00000000000023, + -95, + 110, + 40, + 175 + ], + "previous_pose": { + "x": -138.3074720899353, + "y": -61.45350366426108, + "z": 140.53008171683024, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 190.00000000000023, + "y": -95, + "z": 110, + "a": 40, + "b": 0, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + } + ], + "beforeIncrement": { + "x": 48.65795315215388, + "y": 18.402083427370748, + "z": 16.90449952812245, + "a": 20, + "b": 0, + "c": 60, + "u": 0, + "v": 0, + "w": 0 + }, + "afterIncrement": { + "x": 49.65795315215388, + "y": 18.402083427370748, + "z": 16.90449952812245, + "a": 20, + "b": 0, + "c": 60, + "u": 0, + "v": 0, + "w": 0 + }, + "busy_and_invalid_rejected": true + }, + { + "coordinates": "XYZBC", + "rows": [ + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": 0, + "z": 44.5858, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 2, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 2, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "joints": [ + 0, + -1.7763568394002505e-15, + 44.585800000000006, + 4.8675, + 179.88 + ], + "previous_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 0, + "y": -1.7763568394002505e-15, + "z": 44.585800000000006, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999997, + -95, + 109.99999999999997, + 40, + 175 + ], + "previous_pose": { + "x": 190, + "y": -95, + "z": 110, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664435, + "y": 115.9805968359188, + "z": 197.27262855211526, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999997, + -95, + 109.99999999999997, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664435, + "y": 115.9805968359188, + "z": 197.27262855211526, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.99999999999997, + "y": -95, + "z": 109.99999999999997, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999997, + -95, + 109.99999999999994, + 40, + 175 + ], + "previous_pose": { + "x": 189.99999999999997, + "y": -95, + "z": 109.99999999999997, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664438, + "y": 115.9805968359188, + "z": 197.27262855211524, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999994, + -95, + 109.99999999999989, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664438, + "y": 115.9805968359188, + "z": 197.27262855211524, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664439, + "y": 115.9805968359188, + "z": 197.27262855211518, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999994, + -95, + 109.99999999999989, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664439, + "y": 115.9805968359188, + "z": 197.27262855211518, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.99999999999994, + "y": -95, + "z": 109.99999999999989, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 2, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999994, + -95, + 109.99999999999989, + 40, + 175 + ], + "previous_pose": { + "x": 189.99999999999994, + "y": -95, + "z": 109.99999999999989, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.99999999999994, + "y": -95, + "z": 109.99999999999989, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999991, + -95, + 109.99999999999983, + 40, + 175 + ], + "previous_pose": { + "x": 189.99999999999994, + "y": -95, + "z": 109.99999999999989, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664439, + "y": 115.9805968359188, + "z": 197.27262855211512, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "KINEMATICS_SELECT", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999991, + -95, + 109.99999999999983, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664439, + "y": 115.9805968359188, + "z": 197.27262855211512, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.99999999999991, + "y": -95, + "z": 109.99999999999983, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.9999999999999, + -95, + 109.9999999999998, + 40, + 175 + ], + "previous_pose": { + "x": 189.99999999999991, + "y": -95, + "z": 109.99999999999983, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.9911880766444, + "y": 115.98059683591879, + "z": 197.27262855211507, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.9999999999999, + -95, + 109.9999999999998, + 40, + 175 + ], + "previous_pose": { + "x": -102.9911880766444, + "y": 115.98059683591879, + "z": 197.27262855211507, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.9999999999999, + "y": -95, + "z": 109.9999999999998, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999986, + -95, + 109.9999999999998, + 40, + 175 + ], + "previous_pose": { + "x": 189.9999999999999, + "y": -95, + "z": 109.9999999999998, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664439, + "y": 115.98059683591879, + "z": 197.27262855211507, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.9999999999998, + -94.99999999999999, + 109.99999999999977, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664439, + "y": 115.98059683591879, + "z": 197.27262855211507, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664436, + "y": 115.98059683591879, + "z": 197.272628552115, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.9999999999998, + -94.99999999999999, + 109.99999999999977, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664436, + "y": 115.98059683591879, + "z": 197.272628552115, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.9999999999998, + "y": -94.99999999999999, + "z": 109.99999999999977, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 2, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.9999999999998, + -94.99999999999999, + 109.99999999999977, + 40, + 175 + ], + "previous_pose": { + "x": 189.9999999999998, + "y": -94.99999999999999, + "z": 109.99999999999977, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.9999999999998, + "y": -94.99999999999999, + "z": 109.99999999999977, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 1, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999977, + -94.99999999999997, + 109.99999999999972, + 40, + 175 + ], + "previous_pose": { + "x": 189.9999999999998, + "y": -94.99999999999999, + "z": 109.99999999999977, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": -102.99118807664436, + "y": 115.98059683591877, + "z": 197.27262855211495, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "kind": "MDI_EXECUTE", + "type": 0, + "baseline": [ + 190, + -95, + 110, + 40, + 175 + ], + "joints": [ + 189.99999999999977, + -94.99999999999997, + 109.99999999999972, + 40, + 175 + ], + "previous_pose": { + "x": -102.99118807664436, + "y": 115.98059683591877, + "z": 197.27262855211495, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + }, + "pose": { + "x": 189.99999999999977, + "y": -94.99999999999997, + "z": 109.99999999999972, + "a": 0, + "b": 40, + "c": 175, + "u": 0, + "v": 0, + "w": 0 + } + } + ], + "beforeIncrement": { + "x": -20.183634211518267, + "y": -0.21783460050472314, + "z": 19.157366657677592, + "a": 0, + "b": 20, + "c": 60, + "u": 0, + "v": 0, + "w": 0 + }, + "afterIncrement": { + "x": -19.183634211518267, + "y": -0.21783460050472314, + "z": 19.157366657677592, + "a": 0, + "b": 20, + "c": 60, + "u": 0, + "v": 0, + "w": 0 + }, + "busy_and_invalid_rejected": true + } + ] +} diff --git a/coverage/glb-machine/viewport-1440.png b/coverage/glb-machine/viewport-1440.png new file mode 100644 index 0000000..37604a1 Binary files /dev/null and b/coverage/glb-machine/viewport-1440.png differ diff --git a/coverage/glb-machine/viewport-390.png b/coverage/glb-machine/viewport-390.png new file mode 100644 index 0000000..cbf48f1 Binary files /dev/null and b/coverage/glb-machine/viewport-390.png differ diff --git a/docs/glb-machine-manager/01-项目功能内容.md b/docs/glb-machine-manager/01-项目功能内容.md new file mode 100644 index 0000000..af7644e --- /dev/null +++ b/docs/glb-machine-manager/01-项目功能内容.md @@ -0,0 +1,45 @@ +# 项目功能内容 + +## 目标 + +在 Web LinuxCNC 控制面板的机床预览区增加“三维机床管理”按钮。对话框内完成机床部件装配和坐标标定,最终生成可由现有 XYZAC/XYZBC TRT 运行链使用的机床模型。 + +## 功能范围 + +1. 对话框包含独立的 Three.js 三维预览,实时显示正在配置的机床。 +2. 支持逐个导入自包含 `.glb` 机床部件,不允许依赖外部纹理或网格文件。 +3. 每个部件可绑定 `底座、X、Y、Z、刀具、A/B、C、工件` 角色,并编辑父级关系。可运行结构必须满足: + - 刀具链:底座 → X → Y → Z → 刀具。 + - 转台链:底座 → A/B → C → 工件。 +4. 每个部件可定义局部坐标原点。模型网格相对该原点偏移,运动关节围绕该原点运动。 +5. 每个部件可独立显示或隐藏原点坐标轴辅助线。 +6. 每个部件可用数值和 Three.js 操纵器平移、旋转;变换只修改装配配置,不修改原 GLB 字节。 +7. 可定义 C 轴原点位置和 A/B 到 C 的运动学偏置。应用时写入底座场景节点及整机场景的 `userData.linuxcncMachineGeometry`,同时生成 URDF: + - `C 原点 P = (x-rot-point, y-rot-point, z-rot-point)`。 + - `A/B 偏置 D = (x-offset, y-offset, z-offset)`。 + - 倾转关节原点 `T=P+D`,C 关节原点 `U=-D`,工件固定原点 `-P`。 +8. 可定义 X/Y/Z/A或B/C 的物理零点。模型运动量为 LinuxCNC 实际关节值减去配置的物理零点。 +9. 应用后,控制面板程序执行、Jog、RTCP 切换和刀长变化继续以 Worker/WASM 快照为唯一运动输入;模型不得在 React 中重新计算刀尖逆解。 + +## 数据和单位 + +- UI 中平移、局部原点、C 原点和偏置使用毫米;旋转和物理旋转轴零点使用度。 +- GLB 遵循 glTF 米制、Y-up;生成的 URDF 使用米和弧度、Z-up。 +- 部件源文件、哈希和原始场景保持不变;运行装配使用深复制后的几何与材质。显式“导出组合 GLB”会生成新文件,并将标定数据同时写入整机场景和底座节点 `userData`。 +- 底座 `userData` 至少保存 schema、机型、C 原点、A/B 偏置、物理零点和部件装配摘要。 + +## 安全边界 + +- 当前只生成项目已有求解器支持的 XYZAC 或 XYZBC 双分支 TRT 结构。 +- 层级编辑器允许建立关系,但“应用到控制器”前必须严格验证两条受支持机械链、角色唯一性和无环结构。 +- 未完成八个角色时允许预览和保存草稿,不允许应用到控制器。 +- 模型外观变换不能代替 INI/运动学参数;C 原点和 A/B 偏置必须通过现有配置重载进入 WASM。 +- 不做碰撞、质量、刚体动力学或任意 URDF 求解。 + +## 验收结果 + +- AC 与 BC 均能由八个独立部件建立结构并应用。 +- 对话框预览、原点辅助、平移/旋转和层级变化实时可见。 +- 底座 `userData` 含完整几何及物理零点字段。 +- 运行控制面板后,X/Y/Z/A或B/C Jog 和五轴程序驱动对应部件;工件路径继续附着 C 轴,刀具长度来自 WASM。 +- 非法层级、重复角色、缺失部件、错误机型和外部资源 GLB 明确拒绝,已生效模型不改变。 diff --git a/docs/glb-machine-manager/02-项目程序开发详细步骤.md b/docs/glb-machine-manager/02-项目程序开发详细步骤.md new file mode 100644 index 0000000..2f8f404 --- /dev/null +++ b/docs/glb-machine-manager/02-项目程序开发详细步骤.md @@ -0,0 +1,13 @@ +# 项目程序开发详细步骤 + +1. `MGR-01`:建立本专项 01–06 与 README,冻结数据字段、坐标单位、机械链和验收边界。 +2. `MGR-02`:实现部件 GLB 加载、哈希、外部资源拒绝、装配草稿类型和生命周期清理。 +3. `MGR-03`:实现角色/父级编辑、唯一性和无环校验,生成 XYZAC/XYZBC 严格 URDF 与运行场景。 +4. `MGR-04`:实现对话框 Three.js 预览、部件选择、显示/隐藏和原点坐标轴辅助。 +5. `MGR-05`:实现部件局部原点、数值平移/旋转和 Three.js TransformControls 操纵器。 +6. `MGR-06`:实现 C 原点、A/B 偏置、物理零点,写入底座及整机 `userData`,并映射到 URDF/INI。 +7. `MGR-07`:接入控制面板“应用机床”,复用现有 `LOAD_WORKSPACE`、`PROGRAM_LOAD`、回零失效和 GLB 资源清理事务。 +8. `MGR-08`:验证 WASM 关节值到部件链的映射、刀具/工件/路径坐标一致性及 AC/BC 五轴程序。 +9. `MGR-09`:浏览器交互、错误边界、类型检查、生产构建、截图和报告收口。 + +每轮只推进任务矩阵中依赖已满足的任务。代码完成后必须同步更新 03、04、05;若改变数据契约或坐标定义,先更新 06。 diff --git a/docs/glb-machine-manager/03-推进台账.md b/docs/glb-machine-manager/03-推进台账.md new file mode 100644 index 0000000..1a8f7f2 --- /dev/null +++ b/docs/glb-machine-manager/03-推进台账.md @@ -0,0 +1,22 @@ +# 推进台账 + +## R02 / 2026-09-20 / 部件装配、标定、应用与验收完成 + +- 新增 `machine-manager.ts`:通用自包含 GLB 部件加载、SHA-256、深复制、八角色和两条机械链校验、AC/BC URDF 生成、组合场景、底座/整机 userData、组合哈希。 +- 新增 `MachineManagerPanel.tsx`:机床预览区“三维机床管理”按钮、可拖动大对话框、独立 Three.js 预览、批量部件导入、角色/父级、显隐、原点辅助、数值平移/旋转、TransformControls、C 原点、A/B 偏置和物理零点编辑。 +- 新增“导出组合 GLB”;导出的新文件包含 `linuxcnc.machine/1` URDF,以及整机场景和底座节点上的 `linuxcnc.machine-manager/1` 标定 userData。 +- 接入 App 原有 `LOAD_WORKSPACE` + `PROGRAM_LOAD` 事务。配置和程序应用成功后替换机床;失败候选被释放。关机且空闲门控、程序重解析和回零要求保持。 +- `buildImportedMachine` 按 `WASM joint - physicalZero` 驱动 X/Y/Z/A或B/C,刀长、路径和 RTCP 仍来自 Worker/WASM;有效 INI 参数同步回运行克隆的底座 userData。 +- 浏览器 E01/E02 覆盖 8 个独立 GLB、原点/变换、导出、AC 应用、同一部件切 BC、BC 五轴程序、物理零点、非法层级和生产包。无浏览器错误。 +- 旧五轴整机回归重新通过:AC/BC 各 41 个五轴同时变化 tick、42 个样本,坐标误差低于 `2.5e-16` 视图单位。 +- `gltf-validator` 当前未安装,因此没有重跑旧 Khronos 校验器;旧四个示例 GLB 未修改,历史 `coverage/glb-machine/gltf-validation.report.json` 仍为 verified。本专项生成并下载的组合 GLB 已由浏览器 GLTFExporter 完成往返导出。 +- MGR-01 至 MGR-09 全部完成。下一步按用户体验反馈扩展草稿持久化、部件库或任意新运动学 profile;不自动扩大到碰撞/动力学。 + +## R01 / 2026-09-20 / 专项建立与实现启动 + +- 用户要求在机床预览区新增“三维机床管理”对话框,覆盖部件级 GLB 导入、层级、原点、姿态、RTCP 几何参数、物理零点和控制坐标对应。 +- 核对现有 `docs/glb-machine`、`MachineImportPanel`、严格 URDF 解析、`buildImportedMachine` 和 WASM 关节投影。现有能力只支持已经包含完整层级与 URDF 的整机 GLB,本轮扩展为部件装配编辑器。 +- 建立本目录 01–06 和 README;新增 MGR-01 至 MGR-09 任务链。 +- 决定复用 `linuxcnc.machine/1` 结构:管理器生成合法场景和 URDF,现有 INI/Worker/WASM 继续作为运动和 RTCP 权威。 +- 当前任务:已完成。 +- 下一步:按新需求继续;本专项不重复执行。 diff --git a/docs/glb-machine-manager/04-任务矩阵.md b/docs/glb-machine-manager/04-任务矩阵.md new file mode 100644 index 0000000..ab66e5f --- /dev/null +++ b/docs/glb-machine-manager/04-任务矩阵.md @@ -0,0 +1,13 @@ +# 任务矩阵 + +|任务|状态|依赖|交付与验收标准| +|---|---|---|---| +|MGR-01 文档与契约|verified|-|01–06 与 README 存在;字段、单位、机械链、权威边界明确| +|MGR-02 部件 GLB 加载|verified|MGR-01|多文件导入、SHA-256、外部资源拒绝、资源释放测试通过| +|MGR-03 层级与 URDF|verified|MGR-02|八角色、父级编辑、无环/唯一性、AC/BC URDF 生成与严格解析通过| +|MGR-04 管理器预览|verified|MGR-03|对话框 Three.js 预览、选择、显隐和相机控制可用| +|MGR-05 原点与部件变换|verified|MGR-04|原点辅助显示;数值和操纵器平移/旋转同步| +|MGR-06 RTCP 几何与物理零点|verified|MGR-03|C 原点、A/B 偏置、物理零点写入底座 userData,并正确生成 URDF| +|MGR-07 控制面板接入|verified|MGR-03,MGR-06|“三维机床管理”入口;应用复用 LOAD_WORKSPACE/PROGRAM_LOAD,失败不改旧模型| +|MGR-08 坐标一致性|verified|MGR-07|AC/BC 的 X/Y/Z/A或B/C、刀长、工件和路径由 WASM 状态正确驱动| +|MGR-09 浏览器验收收口|verified|MGR-04,MGR-05,MGR-08|交互/错误/构建/浏览器截图报告通过,03–05 完整更新| diff --git a/docs/glb-machine-manager/05-验收证据.md b/docs/glb-machine-manager/05-验收证据.md new file mode 100644 index 0000000..0b3c535 --- /dev/null +++ b/docs/glb-machine-manager/05-验收证据.md @@ -0,0 +1,39 @@ +# 验收证据 + +## E01 / R01 / 文档与基线 + +- 状态:verified。 +- 文档目录:`docs/glb-machine-manager/`。 +- 基线能力:现有整机 GLB 导入、严格 URDF、几何参数重载和 WASM 关节投影保留。 +- 实现和运行证据见 E02–E04。 + +## E02 / R02 / 开发源浏览器闭环 + +- 命令:`PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_machine_manager_browser.mjs` +- report_id:`GLB-MGR-E01` +- 报告:`coverage/glb-machine-manager/browser.report.json` +- SHA-256:`d3d15da19d3e8a8c958935a0e9c3840b70fb646d5bc8ffb72805dc744df078a3` +- 状态:verified;浏览器错误 0。 +- 覆盖:8 部件导入和预览、原点显隐、数值/TransformControls 变换、组合 GLB 导出、AC/BC 应用、底座 userData、物理零点、非法层级拒绝、BC 五轴程序。 +- 截图: + - `coverage/glb-machine-manager/manager-ac-config.png`,SHA-256 `5ca01d26cb83da726319be107aa90069ce96c3197f4297a26e1f836d171a1501` + - `coverage/glb-machine-manager/managed-bc-running.png`,SHA-256 `6e14ff6bc4e493f57e55bb601ded84319ce86f064f7a811595c1e4498b1827a0` + +## E03 / R02 / 生产构建浏览器闭环 + +- 构建:`npm --prefix web/react run build`,通过;只有既有大 chunk 提示。 +- 命令:`MACHINE_MANAGER_SOURCE_MODULES=0 ... node scripts/test_machine_manager_browser.mjs` +- report_id:`GLB-MGR-E02` +- 报告:`coverage/glb-machine-manager/browser-production.report.json` +- SHA-256:`5ba840aa92c37a06e2f19bce7c57234871b085e27951fb44623af74253215388` +- 状态:verified;生产资产执行 AC/BC UI 应用和 BC WASM 程序运动,浏览器错误 0。 + +## E04 / R02 / 回归与静态契约 + +- `node scripts/test_axis_control_inventory.mjs`:verified,99 个文档化控件。 +- `node web/react/src/test_dual_canvas_contract.mjs`:verified。 +- `node web/react/src/test_xyzac_threejs.mjs`:verified。 +- `npm --prefix web/react run typecheck`:通过。 +- `node scripts/test_glb_machine_motion.mjs`:verified;报告 `coverage/glb-machine-manager/regression-motion/motion.report.json`,SHA-256 `91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626`。AC/BC 各 41 个同时五轴变化 tick、42 个样本,最大误差分别约 `2.26e-16`、`2.48e-16`。 +- `git diff --check`:通过。 +- `scripts/validate_glb_machines.mjs` 未重跑:本地缺少 `gltf-validator` 包;旧示例 GLB 未修改,历史 Khronos 校验报告仍为 verified。该依赖边界不影响新管理器的浏览器导入、导出和运行证据。 diff --git a/docs/glb-machine-manager/06-决策记录.md b/docs/glb-machine-manager/06-决策记录.md new file mode 100644 index 0000000..e709eca --- /dev/null +++ b/docs/glb-machine-manager/06-决策记录.md @@ -0,0 +1,29 @@ +# 决策记录 + +## D01 / 继续使用 LinuxCNC WASM 作为运动权威 + +部件编辑器只生成模型结构和标定参数。程序执行、Jog、刀长、运动学类型和关节位置仍来自 Worker/WASM 快照。Three.js 不实现第二套 RTCP 或逆运动学。 + +## D02 / 运行结构保持 `linuxcnc.machine/1` + +现有严格 URDF 校验、配置写入和运行投影已经验收。部件管理器输出同一结构,可复用所有运行能力并避免引入并行格式。编辑草稿使用独立 schema,只有验证成功后才转换成运行结构。 + +## D03 / 编辑层级自由,应用层级受求解器限制 + +UI 允许用户选择父级以建立层级和发现错误;应用时只接受底座→X→Y→Z→刀具及底座→A/B→C→工件。当前 WASM 只支持这两类 TRT,不能把任意树伪装成可执行机床。 + +## D04 / 原 GLB 不原地改写 + +导入部件的源字节和场景保持不变。局部原点和平移/旋转存在装配配置中,应用时创建深复制运行场景。标定数据写入运行装配中底座节点及整机场景的 userData;“导出组合 GLB”将该装配序列化为新的自包含 GLB,原部件文件不被覆盖。 + +## D05 / C 原点与 A/B 偏置的唯一映射 + +沿用 `trtfuncs.c` 和既有参数契约:C 原点 P 对应 rot-point,A/B 偏置 D 对应 offset;URDF 使用 T=P+D、U=-D、work=-P。该公式是控制模型坐标对应的唯一来源。 + +## D06 / 物理零点是模型校准,不改控制器关节值 + +物理零点保存为每轴的模型零姿态标定值。渲染位移/转角使用 `WASM joint - physicalZero`,但不修改 Worker、INI 的回零位置或程序坐标。改变真实回零参数仍应通过机床配置完成。 + +## D07 / 组合 GLB 只通过显式导出生成 + +普通编辑和“应用到 Web LinuxCNC”不触碰用户原文件。只有用户点击“导出组合 GLB”时才用 GLTFExporter 生成新文件。导出包含部件层级、URDF、底座标定 userData 和整机场景标定 userData。 diff --git a/docs/glb-machine-manager/README.md b/docs/glb-machine-manager/README.md new file mode 100644 index 0000000..d0190a4 --- /dev/null +++ b/docs/glb-machine-manager/README.md @@ -0,0 +1,25 @@ +# Web LinuxCNC 三维机床管理器 + +本目录是“三维机床管理器”专项的唯一接续入口。工作顺序固定为: + +1. 阅读 [04-任务矩阵](04-任务矩阵.md),选择首个未完成且依赖满足的任务。 +2. 阅读 [03-推进台账](03-推进台账.md) 最新一轮和 [06-决策记录](06-决策记录.md)。 +3. 按 [02-项目程序开发详细步骤](02-项目程序开发详细步骤.md) 实施。 +4. 验收后把命令、报告、截图写入 [05-验收证据](05-验收证据.md),同步任务状态和推进台账。 + +专项目标是在 Web LinuxCNC 机床预览区提供“三维机床管理”对话框,支持 GLB 部件导入、AC/BC 两条机械链装配、部件原点和姿态编辑、原点辅助显示、RTCP 几何参数及物理零点定义,并保证模型运动与 LinuxCNC WASM 的实际关节坐标一致。 + +现有整机 GLB + 内嵌 URDF 导入能力继续保留。新管理器生成与现有 `linuxcnc.machine/1` 相同的严格结构,再通过已有配置、Worker、WASM 和 Three.js 投影链运行。 + +当前状态:MGR-01 至 MGR-09 全部 verified。最新台账 R02,浏览器证据 `GLB-MGR-E01/E02`,截图和报告位于 `coverage/glb-machine-manager/`。 + +文档: + +- [01-项目功能内容](01-项目功能内容.md) +- [02-项目程序开发详细步骤](02-项目程序开发详细步骤.md) +- [03-推进台账](03-推进台账.md) +- [04-任务矩阵](04-任务矩阵.md) +- [05-验收证据](05-验收证据.md) +- [06-决策记录](06-决策记录.md) + +相关旧专项:[GLB / URDF 五轴机床子项目](../glb-machine/README.md)。旧专项已完成整机导入、AC/BC 识别、几何参数同步和实际关节驱动,本专项不重复这些底层能力。 diff --git a/docs/glb-machine/01-子项目功能内容.md b/docs/glb-machine/01-子项目功能内容.md new file mode 100644 index 0000000..c33e282 --- /dev/null +++ b/docs/glb-machine/01-子项目功能内容.md @@ -0,0 +1,103 @@ +# 子项目功能内容 + +## 需求与边界 + +用户指定两条机械链:底座 → X → Y → Z → 主轴箱;底座 → A → C。BC 将 A 替换为 B。线性轴移动刀具侧,转台固定在底座的另一分支。提供原创 AC 和 BC 标准型、AC 和 BC 桁架型四个完整 GLB,均包含几何、材质、节点和 URDF,不依赖外部模型文件。 + +预览区提供 GLB 导入、AC/BC 示例加载及下载,显示识别的机型、层级、摇篮中心和 RTCP 参数。关机且空闲时应用;验证完成才重载配置;保留程序并重新解析、失效原回零/不兼容恢复记录。普通 GLB 缺少结构描述时不能猜测机床参数。 + +## URDF 数据契约 v1 + +GLB 默认场景 `extras.linuxcncMachine = { schema: "linuxcnc.machine/1", urdf: "..." }`,Three.js 加载后位于 `scene.userData.linuxcncMachine`。XML 使用标准 URDF link/joint/origin/axis/limit,增加命名空间 `xmlns:cnc="urn:linuxcnc:web:machine:1"` 的 `cnc:machine` 和 `cnc:axis`,标准 URDF 与应用绑定分开。 + +- SI:origin.xyz 米,rpy/关节角弧度;机床坐标右手 Z 向上。GLB 最外层 `urdf_frame` 绕 X -π/2,将 Z-up 转到 glTF Y-up;不得将毫米直接作为 glTF 米。 +- 每个 link 对应唯一 GLB 节点同名,节点局部静止位姿必须与父 joint.origin 相同,视觉网格放在 link 的子节点,不能把轴心烘焙进顶点后伪造节点层级。 +- `cnc:machine` 显式绑定 base/tool/work 三个 link;每个运动 joint 的 `cnc:axis coordinate="X|Y|Z|A|B|C"` 绑定 LinuxCNC 坐标。不相信机型字符串:根据拓扑、joint.type 和 axis 推断 AC/BC。 +- v1 接受正交 XYZ 刀具链、正向 X(A) 或 Y(B) 倾转轴以及其子 Z(C) 轴;局部 rpy=0。任意斜轴、头头/头台结构、mimic 或额外运动轴明确拒绝,后续扩展需新增求解器。 +- 限位、速度和 effort 必须有限且合法;URDF limit 用作导入运动范围校验,运行加速度、回零、伺服周期仍由对应 INI 提供,结构模型不能推断这些参数。 +- 摇篮 joint.origin 为 T,C joint.origin 为 U;零位 C 原点 P=T+U。映射 `rot_point=P*1000`,`offset=-U*1000`。AC 要求 U.x=0;BC 要求 U.y=0。work 固定 joint.origin=-P,保证零角下程序坐标原点与机床原点相同。 +- 主轴箱零基准位于线性链原点;刀长来自 LinuxCNC 工具状态,不从外观网格猜测。遵循 trtfuncs.c 的 master-tool 约定处理工具长度与程序路径参考。 + +## 验收 + +两文件可独立导入;AC/BC 自动识别;结构与 GLB 节点一致;非零中心/偏置进入 WASM;多姿态与非零刀长时刀尖和工件程序点吻合;错误文件不更改已生效配置;浏览器导入、切换、门控、渲染及相关回归通过。 + +## 字段示例与制模约定 + +```json +{ + "extras": { + "linuxcncMachine": { + "schema": "linuxcnc.machine/1", + "urdf": "..." + } + } +} +``` + +```xml + + + + + + + + + + + + + + + + +``` + +|数据|AC 示例(mm)|BC 示例(mm)|提取方法| +|---|---|---|---| +|倾转轴中心 T|24, 6, -37|4, 14, -28|A/B joint.origin| +|C 相对倾转轴 U|0, -18, 45|-22, 0, 40|C joint.origin| +|原生 rot-point P|24, -12, 8|-18, 14, 12|T + U| +|原生 offset D|0, 18, -45|22, 0, -40|-U| + +```mermaid +flowchart TD + root[urdf_frame: Z-up → glTF Y-up] --> base[base 底座] + base --> x[x_slide / X] + x --> y[y_slide / Y] + y --> z[z_slide / Z] + z --> tool[spindle_head 主轴箱/刀具基准] + base --> tilt[tilt_table / A 或 B] + tilt --> c[c_table / C] + c --> work[work_frame 程序参考] +``` + +八个 link 名可以自定义,但必须唯一并通过 URDF 引用;link 节点直接父子关系保持上述两条链,网格作为 link 的子节点。不依赖网格的名称或数量。关节静止变换可以写 glTF TRS 或等价 matrix,禁止额外缩放/旋转而不反映到结构数据。外观尺寸、颜色不进入 RTCP 参数。 + +完整示例:[AC URDF](../../web/react/public/machines/demo-ac-xyz-head.urdf)、[BC URDF](../../web/react/public/machines/demo-bc-xyz-head.urdf)。GLB 是唯一必需输入;旁边的 XML 和 manifest 只用于阅读与核验。 + +## 当前实现边界 + +导入资产保存在当前页面内存;刷新后须重新导入。不会向原 INI 或宿主磁盘自动写入,仍可通过现有“保存 INI”导出。修改/重新读取同机型 INI 时保留导入 GLB,同步更新有效 URDF 的轴心、偏置和工件参考系;手工切换机型才回到内置模型。跨 AC/BC 保留原程序,若原程序无法在新机型解析,明确提示“机床已应用,但程序解析失败”。 + +GLB 不提供完整工业机床控制配置、不做碰撞检测、质量/动力学仿真或任意 URDF 求解。示例 effort 为 URDF 结构字段,本仿真不据此宣称力矩控制。URDF 角度行程以匹配已有 LinuxCNC 示例配置为目的,不代表实际摇篮无碰撞范围。 + +2026-09-18 界面更新:导入/示例/结构信息和几何参数均在按钮打开的可拖动对话框中,预览顶部只保留“导入机床模型”“机床参数”两个入口,详见 D09 / GLB-UI01 / E07。 + + +## 参数化桁架型(2026-09-18 新增) + +|示例|URDF profile|刀具侧|工作台侧|结构节点| +|---|---|---|---|---| +|AC / BC 示例|trt-xyz-head/1|底座→X→Y→Z→主轴箱|底座→A或B→C|8 link / 7 joint| +|AC / BC 示例桁架型|trt-xyz-gantry/1|底座→X→Y→Z|底座→A或B→C|7 link / 6 joint| + +两类均为五个运动轴。桁架型的 `cnc:machine tool="z_slide"` 直接绑定 Z;另有固定 work_frame 挂 C,作为程序参考坐标,并非第六运动轴。四柱/纵向轨道固定在底座,移动横梁属于 X,横梁滑座属于 Y,滑枕及主轴网格属于 Z。 + +参数修改继续使用旋转中心与轴间偏置入口;实际导入模型保留,当前有效 URDF 和 WASM 同步。桁架与标准型共用相同的 AC/BC 原生参数含义,SI 单位、根坐标转换、刀长和几何编辑规则不变。示例外观尺寸在生成器中定义,不由编辑旋转中心自动重建 CAD 网格。 + +交付:[AC 桁架 GLB](../../web/react/public/machines/demo-ac-gantry.glb)、[AC 桁架 URDF](../../web/react/public/machines/demo-ac-gantry.urdf)、[BC 桁架 GLB](../../web/react/public/machines/demo-bc-gantry.glb)、[BC 桁架 URDF](../../web/react/public/machines/demo-bc-gantry.urdf)。 diff --git a/docs/glb-machine/02-子项目程序开发详细步骤.md b/docs/glb-machine/02-子项目程序开发详细步骤.md new file mode 100644 index 0000000..fde6402 --- /dev/null +++ b/docs/glb-machine/02-子项目程序开发详细步骤.md @@ -0,0 +1,16 @@ +# 子项目程序开发详细步骤 + +1. GLB-01:记录规范、网络资源与方案;明确节点关系、单位和原生参数映射。 +2. GLB-02:实现 GLB 容器预检与 URDF 严格解析、拓扑/绑定/位姿校验;生成独立结构描述。 +3. GLB-03:可复现生成 AC/BC 模型、内嵌 URDF、单独导出可阅读 XML 和资源清单;节点名与 XML 一致。 +4. GLB-04:预览区导入及示例;先完成验证再重载匹配 INI,写入解析参数,Worker 仍二次解析 INI;显示成功或失败与参数来源。同机型配置改动后保留 GLB,更新有效 URDF 和运行参数;显式更换机型才卸载。 +5. GLB-05:URDF link 按真实 WASM 关节做刚体位姿投影,路径附着 C 轴,刀长取运行状态;不在 JS 重写逆解。 +6. GLB-06:解析拒绝用例、非零参数/刀长与 WASM 几何交叉验证、浏览器导入/门控/截图、类型检查及构建;整理 SHA 和证据、任务状态、接续入口。 + +原有本地改动不加入本专项。只运行相关测试,不重跑全仓验收、不修改上游或历史 release gate。 + +7. GLB-UI01(后续需求):共享可拖动对话框、预览布局和快捷键隔离,适配导入/参数原流程;验证鼠标/触摸、视口边界、焦点和画布尺寸,证据独立保存在 dialogs 子目录。 + +8. GLB-GEO01:几何参数写入有效 URDF,源 GLB/共享网格保留;校验应用、INI 重读/导入、重复编辑、失败和机型切换边界,以及改参数后的 WASM/模型和真实 RTCP Jog。 + +9. GLB-GAN01:独立桁架 profile、参数化生成两模型、四例注册入口;验证正确分支运动、导入/下载/几何编辑、真实 WASM/五轴程序及原 profile 兼容,证据 gantry 子目录。 diff --git a/docs/glb-machine/03-推进台账.md b/docs/glb-machine/03-推进台账.md new file mode 100644 index 0000000..1a111c1 --- /dev/null +++ b/docs/glb-machine/03-推进台账.md @@ -0,0 +1,103 @@ +# 推进台账 + +## R09 / 2026-09-18 / 初学者工件坐标与 G 代码完整讲义 + +- 用户要求在RTCP课件基础上系统扩充工件坐标:坐标含义、原点和方向确定、G代码逐值解析与运动,整个讲义面向初学者。 +- 新增 `docs/teaching/rtcp-beginners/`,72页A4完整教材,约2.6万正文字符;保留原31页投影概要。新书以坐标尺子入门,区分M/W/J/K/T,再讲工件原点测量、初始方向、G54配准和动态RTCP,最后进入完整程序与实验/答案。 +- 核心细化:物理固连工件架与G54偏置表不同;本课G54是零位配准输入,动态方向与原点由运动学继续变换。解释G10 L2/L20、G90/G91、单位、F与其他字的上下文,明确普通坐标旋转和完整刀补不等于自动RTCP。 +- 新增六个生成/验证脚本:`generate_rtcp_beginner_data.mjs`、`generate_rtcp_beginner_figures.py`、`generate_rtcp_beginner_html.py`、`subset_rtcp_beginner_fonts.py`、`render_rtcp_beginner_pdf.mjs`、`verify_rtcp_beginner_pdf.py`。 +- 数值实测:o=(40,20,10)、BC、P=D=L=0。11个主段、11个额外单位/G54-G55/L20段核对;N10–N90加M2通过实际解释器/TP/WASM执行完成,53个采样,终点与逐行结果一致。M429/M428另按保持物理关节接口核对。 +- 图像:9张新增原创坐标图,复用11张旧原创图;72页逐页边界/图片/标题检查和Poppler独立渲染检查。字体同形部首导致复制字符不符的问题,通过按实际字符制作Noto SC子集解决;保留字体许可,严格检查所有72页标题可正确提取。 +- 记录能力边界:本项目解释器是功能切片,完整G43/H刀表、G52/G92、任意方向和所有进给模式不在本次全面验收范围;以官方语义讲解时明确区分,未把“解析接受”当成完整实现。 +- 验证见E13,文件含目录/书签、HTML源稿、测试数据、教学NGC与复现步骤。未修改运行功能,原本地改动、旧PDF和历史证据保留;未提交/推送。 +- 下一步:教材已完整交付,按后续教学内容修订需求推进。 + +## R08 / 2026-09-18 / 五轴与 RTCP 教学 PDF + +- 用户要求完善“非RTCP各轴独立”和“RTCP坐标随转台变换、刀尖跟随”的理解,提供图文教学课件。 +- 新增 `docs/teaching/rtcp-five-axis/`:31页16:9中文PDF、可编辑HTML、9张原创原理图、2张无界面控件的桁架模型图、数值报告、目录与逐页验证。 +- 明确范围:XYZ加AC或BC;独立驱动不等于不能协调插补;程序坐标须经过单位/增量/零点/刀补;RTCP不仅改变方向,还处理中心/偏置/刀长;模式切换应固定物理关节。加入非RTCP后置计算、TCP/倾斜平面差异、限位与版本化M码说明。 +- 生成脚本:`generate_rtcp_teaching_data.mjs`、`generate_rtcp_teaching_figures.py`、`capture_rtcp_teaching_models.mjs`、`generate_rtcp_teaching_html.py`、`render_rtcp_teaching_pdf.mjs`、`verify_rtcp_teaching_pdf.py`。 +- 验证 E12:真实WASM十二个姿态正逆解、方向增量/切换算例;31页DOM边界和图片加载检查;Poppler独立渲染所有PDF页并目视检查;PyPDF核验31页、16:9、中文文本、字体自包含、39个书签。 +- 中间排版修正:两页接近/越过页脚,调整公式和图形间距后严格边界检查通过;字体检查增加对Chrome嵌入Type3字形程序的正确识别,pdffonts也确认emb=yes。没有改应用功能或覆盖前轮证据。 +- 下一步:课件可直接教学,按后续内容修订需求更新。原有本地改动保留,本轮未提交/推送。 + +## R07 / 2026-09-18 / Jog 限位与序列恢复、阴影警告 + +- 用户截图:XYZBC B=50.2275°,Connection: ERROR / event_sequence_gap。配置 AXIS_B 范围大,但 JOINT_3 上限=50°;连续 Jog 只以坐标限位作为目标,越过关节限位后原生 FK 返回 -702。首次 Worker 复现得到 `SIM_STEP: wasm_xyzac_forward_-702`。 +- 第二层根因:SIM_STEP 执行前把请求的未来 tick 写入事件日志,实际在较早 tick 失败;下一命令发生 tick 回退,未写事件而协议已消费序号,再下一命令出现 sequence_gap。 +- `wasm-linuxcnc-tp.mjs`:对于能直接映射关节的坐标,Jog 临时采用 AXIS/JOINT 限位交集,原生 TP 计算目标和减速,随后恢复正常坐标限位。RTCP 耦合的 XYZ 关节由真实 WASM IK/FK 在每个伺服样本检查;越界则取消剩余轨迹并回到上一个有效样本,发布限位停止而不是继续越界。 +- `sim-session.mjs`:SIM_STEP 完成/失败后写入实际 tick;成功时仍在 checkpoint 前完成事件记录。调度异常时停止运动,并同步协议/任务时钟。`sim-scheduler.mjs` 中异常保留已尝试 tick,同步 native scheduler,未执行的未来周期不再占用时钟。 +- UI 将限位拒绝标为 blocked,与 Worker 连接故障区分;Jog 采样出错显示具体原因。到限位后 JOG_STOP、反向 Jog、SNAPSHOT_REQUEST、checkpoint/恢复均可继续。 +- 用户补充控制台截图仅为 PCFSoftShadowMap 弃用提示,与事件故障无关;XyzacMachineView 改为 PCFShadowMap,Chrome 再测 warnings=[]。 +- 验证 E11:两机型直接旋转轴50°限位/反向退出、RTCP引发Y接近100mm限位/反向退出、失败后序号及原生事件游标一致、部分tick、无效cycles、checkpoint恢复通过。真实浏览器两机型反复Jog、松开停止、限位后再次运动/画面非空通过;120个精确恢复续跑样本、五轴程序、单步、基础session/scheduler/replay及生产构建通过。 +- 旧 `test_xyzac_manual_control.mjs` 在回零尚未完成时期待 homed_mask=1,旧 `test_xyzac_button_constraints.mjs` 期待关机优先而得到 not_all_homed;使用只读 HEAD 模块加载器复核也在相同断言失败,保留日志,未修改门控或放宽断言。 +- 证据归入 coverage/glb-machine/jog-limits/,不改此前证据、上游、本地trace/图片/临时文件。无 C/WASM 变更,无需重建原生核心。本轮及前轮变更仍未提交/推送。 +- 下一步:专项收口;已进入旧序号错误的浏览器会话需刷新,重新导入模型并回零,不能伪造缺失事件来修补旧会话。 + +## R06 / 2026-09-18 / AC、BC 参数化桁架示例 + +- 用户要求保留 AC/BC 示例,新增 AC/BC 桁架型,结构为底座→X→Y→Z、底座→A/B→C。 +- 原 AC/BC 导入示例已经采用双链,但存在 Z→主轴箱固定 link。本轮桁架型独立 profile `trt-xyz-gantry/1`,七 link、六 joint、五运动轴,tool 直接绑定 Z。原 profile `trt-xyz-head/1` 与原模型保持。 +- `generate_glb_machines.mjs` 新增四柱桁架、固定纵向 X 轨、属于 X 的整根桁架横梁、属于 Y 的横梁滑座、属于 Z 的滑枕/主轴外形。转台仍独立挂到底座;生成两个新单文件 GLB 及 XML。 +- `machine-urdf.ts` 只对新 profile 放行对应 link/joint 数量和 Z 工具绑定;保留树/单位/轴向/运动学校验。MachineImportPanel 从 manifest 读取四个例子的按钮名和路径,结构文字根据 profile 显示。 +- 新增 `test_gantry_machine_browser.mjs`;原参数编辑测试和五轴程序测试增加可选 GLB_MACHINE_VARIANT/GLB_EVIDENCE_DIR,复用完整原断言。标准校验脚本支持独立证据目录。 +- 验证 E10:四个入口和下载、标准 profile 兼容;新模型各分支父子关系、X/Y/Z 分别带动对应外形、底座/转台独立;三类错误新 profile 拒绝;参数应用/INI 保存导入重读保持模型、各18个WASM姿态/刀长、实际 RTCP Jog;每机型41个五轴同时变化采样间隔、42个轨迹投影。四个 GLB 均0错误/警告;重复生成和生产资产一致,原AC/BC字节SHA未变。桌面/手机与类型检查/构建通过。 +- 原有本地改动及此前证据保留;本轮独立 `coverage/glb-machine/gantry/`。无 native C/WASM 变更、无外部模型资产。 +- 下一步:任务已验收,无待办;按新目标继续。所有功能改动仍未提交/推送。 + +## R05 / 2026-09-18 / 几何编辑保留导入机床 + +- 用户发现导入 GLB 后“应用参数”会切回内置机床。根因是 App.applyGeometry 在非导入调用时执行 setImportedMachine(null),属于 R02 为防止参数脱节制定的旧策略。用户新需求覆盖此策略,新增 GLB-GEO01。 +- 修复前 `scripts/test_imported_geometry_browser.mjs` 明确复现:应用后 GLB hash 从源文件 SHA 变成空串;before.log 保留。 +- `imported-machine.ts` 新增 updateImportedMachineGeometry:验证机型、运行限位/速度及 INI 参数,按节点绑定更新当前有效 URDF 的 A/B、C、work origin,并重新解析校验;支持用户自定义 joint 名称。源 scene、网格、材质、文件名与 SHA 不变。 +- buildImportedMachine 的运行克隆使用有效 URDF 设置所有 link 的零位,包括固定 work frame;运动继续采用真实 WASM 关节。App 在 Worker 成功加载配置后提交候选结构;参数预检失败保持旧模型,程序重解析失败则明确报告已应用配置。 +- App 资源清理依赖 source scene 是否更换,避免几何对象变更时误释放共享网格。导入详情显示当前参数,并说明源 GLB 未改写。显式机型选择仍卸载旧 GLB。 +- 同机型“应用参数”“重新读取 INI”“导入 INI 后应用”均保留模型;重复相同参数不累加位移。对应更新原 GLB 浏览器脚本的 INI 重载预期,保留所有其他断言。 +- 验证 E09:AC/BC 的真实 UI 原路径复现、保存/导入/重读、非法输入保留状态、开机门控、机型切换,以及各 18 个不同角度/刀长的 WASM 交叉验证和改参数后实际 RTCP Jog 均通过。原 GLB 全专项、内置参数编辑回归及类型检查/构建通过。 +- 测试修正:details 展开状态在 AC→BC 切换时会保留,最初无条件点击反而折叠导致文本断言失败;改为仅在折叠时点击,未放宽内容断言。 +- 证据独立在 coverage/glb-machine/geometry-edit/;旧报告保持,不修改源 GLB 或上游/原有本地改动。 +- 下一步:本专项已验收,按新需求推进。当前所有本地功能变更仍未提交/推送。 + +## R04 / 2026-09-18 / 空闲 M429/M428 切换刀尖跳动 + +- 用户截图中 XYZ 坐标保持不变,而 J0/J1/J2 随按钮切换改变,模型真实反映了错误关节值,并非 GLB 层级或显示坐标 bug。新增 TRT-SW01。 +- 复现:新增 `web/worker/test_trt_switch_stationary.mjs`,修复前在 AC、A=4.8675° / C=179.88° 下 M428 将 J0 从 0 改为 47.97481463927447 mm,强断言失败;保留 before.log。 +- 根因:`SimSession.switchXyzacKinematics()` 使用保持旧 pose 并逆解的 select()。改为已有 WASM selectPhysical(),输入当前规划器关节,计算新模式下坐标。随后同步 TP 和解释器。 +- `wasm-linuxcnc-tp.mjs` 的 setPosition 增加可选模式参数,坐标和模式一起更新后才 read,避免中间态把旧坐标交给新模式逆解,尤其接近行程边界时错误越限。默认调用行为保持。 +- `test_xyzac_trt_case.mjs` 保留原坐标同步断言并补充关节不变断言;新增实际浏览器按钮/MDI/后续 Jog 专项。 +- 验证 E08:两机型 64 次 Worker 切换、22 次浏览器切换;截图姿态、非零中心/偏置、接近边界、重复模式、M430、空闲 tick、增量/坐标偏置、运行中/非法模式拒绝;实际渲染刀尖不动。原 RTCP Jog、TRT case、单步流程、运行后续和生产构建通过。 +- 浏览器测试先等待 MDI 到位,再切回 Manual 刷新控件状态后选择切换按钮;第一次直接等待按钮门控刷新超时,未作为通过证据。 +- 证据独立保存 `coverage/glb-machine/switching/`,未覆盖前轮验收;未修改 native C/WASM 或上游 LinuxCNC。 +- 下一步:任务已验收,刷新页面载入新 Worker 后重新导入 GLB 即可体验;本轮及前轮改动均未提交/推送,原有本地保留项不变。 + +## R03 / 2026-09-18 / 预览放大与可拖动设置对话框 + +- 用户截图显示导入说明和参数表占据预览高度,机床仅剩很小显示区域;新增 GLB-UI01。 +- `App.tsx` 把两个入口合为机床预览顶部紧凑工具条;`MachineImportPanel.tsx` 与 `TrtGeometryPanel.tsx` 的表单移入共享 `DraggableDialog.tsx`。模型画布占据其余高度,不改变左右预览比例。 +- 原生 dialog 提供模态隔离;标题栏支持鼠标和触摸拖动、视口边界限制、窗口缩小后回到屏幕内;Esc 关闭、Tab/Shift-Tab 循环、焦点返回。关闭保留参数草稿;应用过程中保留结果显示。开机可打开查看,实际导入/参数编辑仍受原门控限制。 +- App 快捷键在对话框打开时跳过机床操作,F1 急停保留,防止 Esc 误触 PROGRAM_ABORT 或 F2 误开机。 +- 原有 GLB/参数浏览器脚本只适配打开/关闭对话框步骤;新增 `scripts/test_machine_dialog_browser.mjs`。证据独立写入 `coverage/glb-machine/dialogs/`,保留 E02–E06 原报告。 +- 验证 E07:2048×859、1440×900、390×844 下机床画布高度分别 351.5、392.5、380 px;占机床面板高度超过 85%;打开对话框画布尺寸不变。拖动、极端边界、触摸、缩屏、焦点、快捷键、草稿、运行门控通过;原参数保存/导入、两机型 GLB 导入和 RTCP Jog 回归通过;类型检查/生产构建通过。 +- 中间问题:浏览器原生 Tab 可转到浏览器工具栏,专项断言捕获;补充弹窗内 Tab/Shift-Tab 循环后通过,没有放宽断言。 +- 下一步:当前专项所有任务已验收,按新需求推进。所有改动仍未提交/推送,原有本地改动继续保留。 + +## R02 / 2026-09-18 / 实现与验收收口 + +- 完成解析器 `web/react/src/machine-urdf.ts`:XML 命名空间、两分支拓扑、正交轴、单位/限位、GLB 自包含/节点绑定/位姿、版本和异常输入校验;推导 AC/BC、rot-point 和 offset。 +- 完成模型 `scripts/generate_glb_machines.mjs` 及 `web/react/public/machines/` 的 AC/BC GLB、XML、manifest、许可;底座-XYZ-主轴箱、底座-A/B-C,与原移动工作台模型区分。 +- 完成 `imported-machine.ts`、`MachineImportPanel.tsx` 和 App/Viewer/styles 接入:文件导入、示例与下载,应用前验证,参数通过 INI/Worker 进入 WASM;真实关节驱动、刀长与程序路径参考、旧资产卸载和资源释放。 +- 新增 `test_glb_machine_browser.mjs`、`test_glb_machine_motion.mjs`、`validate_glb_machines.mjs`;原两个浏览器测试只增加可选证据输出目录,不删除断言。 +- 验证 E02–E06:42 项拒绝用例、36 个姿态/刀长样本、8 次导入模型 RTCP Jog、两机型各 41 个五轴同时变化的执行间隔、84 个程序执行投影采样;两 GLB 标准校验 0 错误/警告;旧参数编辑与 Jog 回归、桌面/手机、类型检查及构建通过。 +- 中间问题:生成器默认导出 matrix,首次被 TRS 校验拒绝;改为导出 TRS,同时解析器接受与 URDF 等价的 matrix。运动程序抽样过疏导致样本数断言失败,改为全量采样,未放宽断言。测试损坏文件时模型保持不变,后续重新加载成功示例后截图。重复生成 public 资产触发 Vite 自动刷新,曾打断一次进行中的浏览器测试;停止资产写入后独立重跑。 +- 证据统一在 `coverage/glb-machine/`;旧 `coverage/trt-parametric/` 未改。原有 trace、子模块、临时文件和图片完整保留。 +- 边界:本轮 v1 仅支持已声明的 AC/BC TRT 正交双链;运行 INI 仍负责回零/周期等;GLB 当前页面内存保存,刷新重新导入;不宣称任意机床 URDF、碰撞检测或制造商尺寸标定。 +- 下一步:本专项矩阵无待办,按新目标扩展或按用户要求保存;未提交/推送本轮新功能。 + +## R01 / 2026-09-18 / 需求与契约 + +- 按用户最新指令确定两分支结构,建立本目录七份文档。 +- 已读取原专项索引/矩阵、现有预览、参数写入和 WASM 运动学链路;保留原有工作区改动。 +- 已查阅 glTF、URDF、Three.js 和 LinuxCNC 官方资料,检索网络模型资源;尚未找到可确认满足本契约的可再分发完整 GLB。 +- 验证:此阶段仅源码和规范核对,未运行新功能测试。 +- 下一步:GLB-02 严格结构解析,随后生成两种模型并接入 UI。 diff --git a/docs/glb-machine/04-任务矩阵.md b/docs/glb-machine/04-任务矩阵.md new file mode 100644 index 0000000..6d384bd --- /dev/null +++ b/docs/glb-machine/04-任务矩阵.md @@ -0,0 +1,20 @@ +# 任务矩阵 + +状态:待办、进行中、已验收、阻塞;已验收必须引用证据。 + +|编号|内容|依赖|状态|验收标准|证据| +|---|---|---|---|---|---| +|GLB-01|方案、规范与资料|无|已验收|七份文档,明确两分支、单位、原生参数映射和来源|E01| +|GLB-02|URDF / GLB 解析校验|01|已验收|树、轴、单位、绑定、格式错误拒绝;提取 AC/BC 与参数|E02| +|GLB-03|原创 AC/BC 示例|02|已验收|独立可用 GLB,层级与内嵌 XML 一致,可复现生成|E03| +|GLB-04|导入与配置联动|02,03|已验收|预览入口、示例下载、识别与重载、保留程序、门控|E02| +|GLB-05|真实关节驱动模型|02,03|已验收|XYZ 刀具侧、A/B-C 工件侧;多姿态及刀长吻合 WASM|E02,E04| +|GLB-06|回归与接续收口|04,05|已验收|自动测试、浏览器截图、构建、SHA 证据和文档一致|E05,E06| +|GLB-UI01|预览区域与可拖动对话框|04|已验收|导入/参数弹窗、拖动与边界、键盘/触摸、画布尺寸、原流程回归|E07| +|TRT-SW01|M429/M428 空闲切换保持机床关节|05|已验收|按钮/MDI 无关节或刀尖跳变;规划器与解释器同步;切换后 Jog/增量及门控通过|E08| +|GLB-GEO01|编辑几何参数保留导入模型|04,05|已验收|应用/INI重读/导入保留GLB;有效URDF/显示与WASM一致;重复编辑与失败不替换模型|E09| +|GLB-GAN01|AC/BC 参数化桁架示例|GEO01|已验收|四个独立入口;桁架XYZ刀具链/独立A或B-C工作台;导入、参数编辑、WASM/联动校验|E10| +|TRT-JOG02|Jog 限位后事件序列与反向恢复|SW01|已验收|关节限位不越界;故障不产生序列缺口;停止/反向Jog/快照可用;原运动和恢复回归|E11| +|GLB-UI02|Three.js 阴影弃用警告|UI01|已验收|使用 PCFShadowMap,真实浏览器无 PCFSoftShadowMap 警告|E11| +|TRT-DOC01|五轴与RTCP中文教学课件|SW01,GAN01|已验收|原理图/数值/程序对照/实验/练习答案;中文PDF可读、分页和算例核验|E12| +|TRT-DOC02|工件坐标与G代码初学者完整讲义|DOC01|已验收|原点/方向/各参考系、G54与RTCP分层、逐字逐行实算、完整A4图文PDF及中文提取核验|E13| diff --git a/docs/glb-machine/05-验收证据.md b/docs/glb-machine/05-验收证据.md new file mode 100644 index 0000000..3039b47 --- /dev/null +++ b/docs/glb-machine/05-验收证据.md @@ -0,0 +1,190 @@ +# 验收证据 + +## E13 / 工件坐标与G代码初学者完整讲义 + +- [完整PDF](../teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf):72页A4,约2.1MB,中文可选择/搜索,含可点击目录及书签;原31页课件保留。 +- [内容/命令索引](../teaching/rtcp-beginners/README.md)、[逐页目录](../teaching/rtcp-beginners/outline.json)、[编辑源稿](../teaching/rtcp-beginners/handbook.html)。 +- [数值证据](../teaching/rtcp-beginners/gcode-evidence.json),report_id=`rtcp-beginners-gcode-v1`:11主段+11附加段;程序W→偏置K→BC逆解关节值;单位、G54/G55、L20、模式切换;完整N10–N90程序通过实际Session/解释器/TP,状态completed、53个样本、终点(-18.480762,40,27.990381,30,90)。 +- [版面报告](../teaching/rtcp-beginners/verification/layout.json):72页无越界/缺图;新增图形无缺字警告。独立PDF渲染总览:[1–24页](../teaching/rtcp-beginners/verification/pdf-contact-1.png)、[25–48页](../teaching/rtcp-beginners/verification/pdf-contact-2.png)、[49–72页](../teaching/rtcp-beginners/verification/pdf-contact-3.png)。 +- [PDF汇总](../teaching/rtcp-beginners/verification/acceptance.json),report_id=`rtcp-beginners-pdf-v1`:严格匹配72页标题与提取文字、A4页尺寸、字体自包含、书签、PDF/HTML/数值/图形/字体/渲染总览SHA。 +- 生成命令在教材README;主要为`generate_rtcp_beginner_data.mjs`、`generate_rtcp_beginner_figures.py`、`generate_rtcp_beginner_html.py`、`subset_rtcp_beginner_fonts.py`、`render_rtcp_beginner_pdf.mjs`、`verify_rtcp_beginner_pdf.py`。Matplotlib/PyPDF/fontTools来自临时目录,未增加应用依赖。`pdfinfo`确认72页,`pdftoppm`独立渲染全部页且非空。 +- 本轮只产出教学资料,无应用功能改动、无远程job_id。官方资料链接列在PDF末页,通用功能与Web切片实测范围分开说明。 + +## E12 / 五轴与 RTCP 教学课件 + +- [PDF成品](../teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf):31页,16:9,约1.9MB,中文可选择,字体嵌入,39个目录书签。 +- [编辑源稿及复现命令](../teaching/rtcp-five-axis/README.md)、[各页目录](../teaching/rtcp-five-axis/outline.json)、[原生数值](../teaching/rtcp-five-axis/numeric-evidence.json)。 +- [排版检查](../teaching/rtcp-five-axis/verification/layout.json):31页无图文越界/缺图/页面错误。[独立PDF渲染总览](../teaching/rtcp-five-axis/verification/pdf-contact-sheet.png):Poppler渲染实际PDF,不仅检查HTML截图。 +- [汇总](../teaching/rtcp-five-axis/verification/acceptance.json),report_id=`rtcp-teaching-pdf-v1`,包含PDF/源稿/数据/图像SHA,逐页尺寸和文本量、字体、书签及WASM指纹。主数值例子12个姿态正逆解回代通过。 +- 主要命令:`node scripts/generate_rtcp_teaching_data.mjs`;`PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/generate_rtcp_teaching_figures.py`;`python3 scripts/generate_rtcp_teaching_html.py`;带PLAYWRIGHT_MODULE运行`render_rtcp_teaching_pdf.mjs`;带PYTHONPATH运行`verify_rtcp_teaching_pdf.py`。PDF还经`pdfinfo`/`pdffonts`与`pdftoppm`核验。 +- 查阅官方5-axis-kinematics/switchkins/machining-center文档及本地原生源码,正文脚注与末页列出来源。示意图原创,机床资产沿用项目原创GLB;无远程job_id,无新增应用依赖。 + +## E11 / Jog 限位和序列恢复、阴影警告 + +```bash +node web/worker/test_jog_limit_recovery.mjs +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_jog_limit_browser.mjs +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/jog-limits node web/worker/test_trt_checkpoint_exact.mjs +GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/jog-limits PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs +node web/worker/test_sim_scheduler.mjs +node web/worker/test_sim_session.mjs +node web/worker/test_replay.mjs +node web/worker/test_xyzac_step_flow.mjs +node web/worker/test_xyzac_recovery.mjs +node web/react/src/test_store_visual_clear.mjs +npm --prefix web/react run build +python3 scripts/generate_jog_limit_acceptance.py +``` + +- [Worker 专项](../../coverage/glb-machine/jog-limits/worker.report.json),report_id=`jog-limit-recovery-v1`,两机型直接轴到50°停止并退回49°;RTCP转C触发Y关节边界,在Y=99.952445mm有效样本停止,队列为空/速度零;反向退出、JOG_STOP、快照和checkpoint恢复通过。失败时只完成请求5个tick中的1个,事件、native游标、任务与scheduler一致;非法cycles后仍可继续。 +- [浏览器专项](../../coverage/glb-machine/jog-limits/browser.report.json),report_id=`jog-limit-browser-v1`:AC/BC真实按钮按住→到限位→松开→反向→多次Jog全部通过,画面恢复运动且WebGL像素非空,无sequence_gap、无pageerror。[AC恢复画面](../../coverage/glb-machine/jog-limits/ac-recovered.png)、[BC恢复画面](../../coverage/glb-machine/jog-limits/bc-recovered.png)。 +- [精确恢复](../../coverage/glb-machine/jog-limits/exact-checkpoint.report.json):120个续跑状态hash完全一致,12个恢复后Jog样本、trace/new-session/幂等测试通过。[五轴程序](../../coverage/glb-machine/jog-limits/motion.report.json)两机型均通过。基础scheduler新增部分失败后下一个tick断言,session/replay、单步、旧checkpoint恢复和store保留预览测试均通过。 +- [阴影警告报告](../../coverage/glb-machine/jog-limits/shadow.report.json):原模型和导入BC均加载,Chrome console warnings=[],不再出现PCFSoftShadowMap弃用警告;[截图](../../coverage/glb-machine/jog-limits/shadow.png)。页面 http://127.0.0.1:5174/,Google Chrome / SwiftShader。 +- [HEAD复现日志](../../coverage/glb-machine/jog-limits/before.log)保留RTCP越界时旧错误响应也因inverse_mode_-702失败。初始现有工作区复现直接B轴越界报forward_-702,随后采用直接轴限位交集修复。 +- 额外运行的旧manual_control和button_constraints测试未通过,分别是同步回零假定、前置门控优先级差异;通过Node只读loader从git HEAD加载session/scheduler/tp模块,对比相同失败。日志 `manual.log` / `manual-baseline.log`、`buttons.log` / `buttons-baseline.log` 位于本目录。它们不是本轮回归通过声明,不改生产门控迎合旧断言。 +- [构建日志](../../coverage/glb-machine/jog-limits/build.log)通过,已有大chunk提示;无C/WASM或上游修改。没有硬件减速/碰撞安全声明,RTCP限位为仿真在最后有效伺服样本停止。 +- [汇总](../../coverage/glb-machine/jog-limits/acceptance.report.json),report_id=`jog-limit-acceptance-v1`,保留证据SHA和已知旧测试失败,无远程job_id。之前验收报告未覆盖。 + +## E01 / 规范与源码核对 / 2026-09-18 + +- glTF 2.0: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html (extras、节点树、米、Y-up)。 +- URDF: https://docs.ros.org/en/humble/Tutorials/URDF/Building-a-Movable-Robot-Model-with-URDF.html (joint parent/child/origin/axis、限位、弧度)。 +- Three.js: https://threejs.org/docs/pages/GLTFLoader.html (GLB 解析);本地 GLTFLoader 源码核对 extras → userData。 +- LinuxCNC: https://www.linuxcnc.org/docs/html/motion/5-axis-kinematics.html ;本地 `linuxcnc/src/emc/kinematics/trtfuncs.c` 核对 AC/BC 旋转中心、轴间偏置和 tool-offset。 +- 网络模型候选: https://www.cgtrader.com/3d-models/industrial/industrial-machine/5-axis-machine-194cb656-8e44-4695-81cd-7e2a951bd92d 、 https://www.turbosquid.com/3d-models/milling-machine-cnc-tool-3d-model-2148325 。仅检索到资源页,未下载/购买/确认内嵌 URDF 或再分发许可;不作为交付资产。 +- 本轮采用自行程序化创建模型;不宣称网上现成模型已符合要求。 +- job_id / PDF:不适用。新功能测试与截图待后续条目记录。 + +## E02 / 严格解析与浏览器导入 + +命令(仓库根目录): + +```bash +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs +``` + +- 页面:`http://127.0.0.1:5174/`,真实 Google Chrome / Playwright / SwiftShader。 +- 报告:[`browser.report.json`](../../coverage/glb-machine/browser.report.json),report_id=`glb-machine-browser-v1`;日志 [`browser.log`](../../coverage/glb-machine/browser.log)。 +- 两机型共 42 项错误输入/越界配置拒绝:损坏 GLB、外部资源、动画、环、错误父子关系、重复节点、节点位姿、XML、轴绑定/方向、rpy、NaN、mimic、不支持 profile、运行行程/速度。等价 glTF matrix 正常接受,错误矩阵拒绝。 +- 两机型各 18 个真实 WASM 逆解样本:六种角度 × 刀长差 0/17/-4 mm;非零 rot-point/offset;刀尖和工件程序点误差小于 1e-8 显示单位。额外验证 XYZ 移动不带动摇篮。 +- 文件导入、示例按钮、机型识别、参数进入 Worker、程序路径保持、下载哈希、错误导入不更改模型/配置、开机禁用导入、回零后四次 A/B-C Jog、INI 重读卸载模型均验证。 +- Worker 测试故意篡改配置投影值为 999,再确认实际 INI 参数胜出。 +- 截图:[AC](../../coverage/glb-machine/ac-imported.png)、[BC](../../coverage/glb-machine/bc-imported.png)、[桌面](../../coverage/glb-machine/viewport-1440.png)、[手机](../../coverage/glb-machine/viewport-390.png)。真实 WebGL 颜色采样非空,控件无横向溢出,browser_errors=[]。 + +## E03 / 原创模型、格式与可复现性 + +```bash +node scripts/generate_glb_machines.mjs +npm install --prefix /tmp/linuxcnc-glb-validation --no-package-lock --ignore-scripts gltf-validator@2.0.0-dev.3.10 +GLTF_VALIDATOR_MODULE=/tmp/linuxcnc-glb-validation/node_modules/gltf-validator/index.js node scripts/validate_glb_machines.mjs +``` + +- 交付:`web/react/public/machines/demo-ac-xyz-head.glb`、`demo-bc-xyz-head.glb`;各 71 个原创几何网格,八个结构 link,五个运动轴。 +- Khronos glTF Validator 2.0.0-dev.3.10:两文件均 0 errors / 0 warnings;71 条信息为网格存在未用纹理坐标,不影响有效性。报告 [`gltf-validation.report.json`](../../coverage/glb-machine/gltf-validation.report.json),report_id=`glb-machine-khronos-validation-v1`。 +- [`manifest.json`](../../web/react/public/machines/manifest.json) 包含文件长度、SHA256、原生参数和来源;[`LICENSE.txt`](../../web/react/public/machines/LICENSE.txt) 为原创模型 CC0-1.0 说明。 +- 实际重复运行生成脚本并逐文件 SHA256 比较,通过;生产构建 GLB 与源 GLB 字节相同。报告 [`reproducibility.report.json`](../../coverage/glb-machine/reproducibility.report.json),report_id=`glb-machine-reproducibility-v1`。 +- 标准验证器仅临时安装在 /tmp,未向项目新增依赖。 + +## E04 / 真实解释器和规划器五轴联动 + +```bash +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs +``` + +- 报告 [`motion.report.json`](../../coverage/glb-machine/motion.report.json),report_id=`glb-machine-five-axis-motion-v1`;包含实际 G-code 和采样轨迹;日志 [`motion.log`](../../coverage/glb-machine/motion.log)。 +- 两机型分别 LOAD_WORKSPACE、PROGRAM_LOAD、开机/回零、PROGRAM_RUN,通过真实 WASM 执行 M428 后同时改变 XYZ 与 A/B、C 的两段 G1,均正常完成。 +- 每机型有 41 个五轴关节同时改变的采样间隔;42 个姿态投影采样。最大误差:AC `2.2591401799415137e-16`,BC `2.482534153247273e-16` 显示单位(当前 1 单位=100 mm)。 +- 首次测试按每七个采样间隔抽样,程序较短导致样本数量不足;改为记录全部 RTCP 采样,保持原数量与误差强断言。 + +## E05 / 原有功能回归与构建 + +```bash +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/regression-parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/regression-jog PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_rtcp_jog_browser.mjs +npm --prefix web/react run typecheck +npm --prefix web/react run build +``` + +- 原参数编辑/导入/保存/重新读取/门控/桌面手机交互回归通过;report_id=`trt-parametric-browser-v1`,证据目录 [`regression-parametric`](../../coverage/glb-machine/regression-parametric/)。 +- 原内置 AC/BC 各四次 RTCP Jog 回归通过,report_id=`trt-rtcp-jog-browser-v1`,证据 [`rtcp-jog-browser.report.json`](../../coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json)。 +- 类型检查及生产构建通过;[`build.log`](../../coverage/glb-machine/build.log)。已有大 chunk 提示保留,不作为失败。 +- 未改动 C/WASM,无需重建 native;未重跑全仓测试,未覆盖 `coverage/trt-parametric/` 旧证据。 +- job_id / PDF:本地执行,无远程 job,无 PDF;以日志、报告、截图及汇总哈希为证据。 + +## E06 / 最终汇总 + +命令:`python3 scripts/generate_glb_machine_acceptance.py`;只汇集已执行证据,不重新跑测试。 + +[`acceptance.report.json`](../../coverage/glb-machine/acceptance.report.json) 汇集实际报告状态、模型与 WASM SHA256、证据文件 SHA256。接续时先核对此文件,再按任务矩阵决定下一步;不要因历史台账中曾写“待办”而重复执行已验收任务。 + +## E07 / 模型显示区域与可拖动对话框 + +```bash +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_machine_dialog_browser.mjs +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/dialogs/parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs +GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/dialogs/import PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs +npm --prefix web/react run build +``` + +- 页面 `http://127.0.0.1:5174/`;Chrome / Playwright / SwiftShader;本地执行,无远程 job_id。 +- [专项报告](../../coverage/glb-machine/dialogs/dialog.report.json),report_id=`machine-dialog-browser-v1`,status=verified。桌面/手机画布高度 351.5 / 392.5 / 380 px,超过机床面板高度 85%,弹窗不改变 canvas 尺寸。 +- 两弹窗验证:鼠标移动位移、四边限制、Tab 焦点循环、Esc 关闭/焦点返回、F2 不触发开机、草稿保留;触摸拖动和窗口缩小后不越界;开机编辑门控。 +- [参数编辑回归](../../coverage/glb-machine/dialogs/parametric/browser.report.json) 与 [GLB 导入回归](../../coverage/glb-machine/dialogs/import/browser.report.json) 均 verified,包含文件导入/下载、参数保存/重读、错误拒绝、两机型运动与手机交互;无页面错误。 +- [构建日志](../../coverage/glb-machine/dialogs/build.log):类型检查及生产构建通过,大 chunk 提示保留。 +- 截图:[宽屏机床区域](../../coverage/glb-machine/dialogs/preview-2048.png)、[参数对话框](../../coverage/glb-machine/dialogs/parameters-1440.png)、[手机参数](../../coverage/glb-machine/dialogs/parameters-390.png)、[拖动后的模型对话框](../../coverage/glb-machine/dialogs/machine-glb-settings-dragged.png)。 +- [本轮验收汇总](../../coverage/glb-machine/dialogs/acceptance.report.json),report_id=`glb-machine-dialog-acceptance-v1`,列出实际证据 SHA256。之前 E02–E06 报告保留,本轮不重跑 native/五轴轨迹专项。 + +## E08 / M429/M428 保持物理位置 + +```bash +node web/worker/test_trt_switch_stationary.mjs +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_switch_stationary_browser.mjs +node web/worker/test_xyzac_trt_case.mjs +node web/worker/test_xyzac_step_flow.mjs +node web/worker/test_xyzac_runtime_followups.mjs +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/switching/rtcp-jog PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_rtcp_jog_browser.mjs +npm --prefix web/react run build +``` + +- [修复前失败日志](../../coverage/glb-machine/switching/before.log):`KINEMATICS_SELECT mode=1 J0: 47.97481463927447 != 0`。 +- [Worker 报告](../../coverage/glb-machine/switching/worker.report.json):report_id=`trt-stationary-switch-worker-v1`,64 次按钮/MDI/重复模式切换,两机型关节及可视投影在 1e-8 mm/deg 容差内保持;规划器/解释器同步,后续 3 个 idle tick、G54 偏置后的增量移动、忙碌/非法模式拒绝通过。 +- [浏览器报告](../../coverage/glb-machine/switching/browser.report.json):report_id=`trt-stationary-switch-browser-v1`,22 次切换,AC/BC GLB 实际渲染刀尖保持;最大关节误差约 1.50e-13、最大显示坐标误差约 1.45e-15;之后旋转 Jog XYZ 补偿仍有效。 +- 截图:[BC Identity](../../coverage/glb-machine/switching/bc-identity.png)、[BC TCP](../../coverage/glb-machine/switching/bc-tcp.png)、[AC Identity](../../coverage/glb-machine/switching/ac-identity.png)、[AC TCP](../../coverage/glb-machine/switching/ac-tcp.png)。页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader;browser_errors=[]。 +- 原 TRT case(新增关节不变强断言)、单步、runtime followups、两机型 RTCP Jog、类型检查及生产构建通过;日志在同目录,大 chunk 提示保留。无 C 修改,无需 native 重建,不扩展为全仓 parity 验收。 +- [本轮验收汇总](../../coverage/glb-machine/switching/acceptance.report.json),report_id=`trt-stationary-switch-acceptance-v1`,包含 WASM 和所有证据 SHA256。无远程 job_id。 + +## E09 / 修改几何参数保留 GLB + +```bash +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_imported_geometry_browser.mjs +GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/geometry-edit/import PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs +TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/geometry-edit/parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs +npm --prefix web/react run build +``` + +- [修复前失败](../../coverage/glb-machine/geometry-edit/before.log):`applying geometry must retain imported GLB`,源 hash 变为空。 +- [新专项报告](../../coverage/glb-machine/geometry-edit/browser.report.json):report_id=`imported-geometry-browser-v1`,AC/BC 均 verified。UI 应用、INI 保存→重读→导入→再应用、非法数值拒绝、开机不可编辑、显式跨机型卸载;原 GLB hash/文件名和程序路径保持。 +- 每机型 18 个新几何姿态(6 个角度 × 0/17/-4 mm 刀长)与真实 WASM 逆解一致;源场景/原 XML 未修改、mesh 保留、自定义 joint 名支持、不匹配机型拒绝、相同参数复用。 +- 实际浏览器 RTCP Jog 误差:AC `1.9778890766513102e-17`、BC `6.636893469679434e-17` 显示单位,模型计算与画面刀尖投影误差均为 0。 +- [原 GLB 回归](../../coverage/glb-machine/geometry-edit/import/browser.report.json)(含42项拒绝、36个姿态、8次Jog)和 [内置参数编辑回归](../../coverage/glb-machine/geometry-edit/parametric/browser.report.json)(含桌面手机、保存/导入/重读)通过。 +- [AC 修改后截图](../../coverage/glb-machine/geometry-edit/ac-edited.png)、[BC 修改后截图](../../coverage/glb-machine/geometry-edit/bc-edited.png);页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader,无 pageerror。 +- [构建日志](../../coverage/glb-machine/geometry-edit/build.log):类型检查/生产构建通过,大 chunk 提示保留。无 C/WASM 修改,不重复 native 验收。 +- [本轮汇总](../../coverage/glb-machine/geometry-edit/acceptance.report.json),report_id=`imported-geometry-acceptance-v1`,包含所有证据及 WASM SHA256。E02/E07 中“INI 重读卸载模型”为历史验证,当前行为由 D11/E09 替代。无远程 job_id。 + +## E10 / AC、BC 参数化桁架型 + +```bash +node scripts/generate_glb_machines.mjs +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_gantry_machine_browser.mjs +GLB_MACHINE_VARIANT=gantry GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry/geometry PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_imported_geometry_browser.mjs +GLB_MACHINE_VARIANT=gantry GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs +GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry GLTF_VALIDATOR_MODULE=/tmp/linuxcnc-glb-validation/node_modules/gltf-validator/index.js node scripts/validate_glb_machines.mjs +npm --prefix web/react run build +``` + +- [四例入口和结构报告](../../coverage/glb-machine/gantry/catalog.report.json),report_id=`gantry-machine-browser-v1`:四个按钮及下载 hash;新 profile 七 link/Z 工具绑定;XYZ 零位及逐支外形运动,转台和底座不随 XYZ 移动;每新机型3类不合法结构拒绝;桌面/手机控件不溢出,无页面错误。 +- [几何编辑回归](../../coverage/glb-machine/gantry/geometry/browser.report.json),report_id=`imported-geometry-browser-v1`,gantry 环境运行:两机型共36个姿态/刀长、编辑和INI导入/重读保留桁架、非法输入/运行门控、自定义joint名称、真实RTCP Jog 均通过。 +- [五轴程序报告](../../coverage/glb-machine/gantry/motion.report.json),report_id=`glb-machine-five-axis-motion-v1`:真实解释器/TP,两桁架各41个五轴同时改变的采样间隔、42个投影样本,最大显示误差小于2.5e-16。 +- [Khronos 校验](../../coverage/glb-machine/gantry/gltf-validation.report.json):四文件均0错误/0警告。[重复生成报告](../../coverage/glb-machine/gantry/reproducibility.report.json):所有生成文件可复现、生产GLB字节相同、原AC/BC文件SHA不变。 +- [AC 桁架截图](../../coverage/glb-machine/gantry/ac-gantry.png)、[BC 桁架截图](../../coverage/glb-machine/gantry/bc-gantry.png)、[手机入口](../../coverage/glb-machine/gantry/dialog-390.png);页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader。 +- [构建日志](../../coverage/glb-machine/gantry/build.log):类型/构建通过,已有大chunk提示保留。[验收汇总](../../coverage/glb-machine/gantry/acceptance.report.json),report_id=`gantry-machine-acceptance-v1`,含模型、WASM与证据SHA。无远程job_id,无上游或native改动。 diff --git a/docs/glb-machine/06-决策记录.md b/docs/glb-machine/06-决策记录.md new file mode 100644 index 0000000..cc7f9de --- /dev/null +++ b/docs/glb-machine/06-决策记录.md @@ -0,0 +1,69 @@ +# 决策记录 + +## D13 / Jog 限位失败不破坏传输历史 + +AXIS 限位是坐标范围,JOINT 限位是物理约束,XYZBC 的两者可以不同。Identity 的 XYZ 和各模式的旋转轴直接对应关节,Jog 目标由原生 TP 按两者交集约束;RTCP XYZ 不可用坐标限位替代关节限位,逐伺服样本调用已有 WASM 求解器验证。 + +RTCP 到达耦合关节边界时在最后有效样本停止,队列取消并报告限位,可反向退出。本次不声明具备预测未来 RTCP 路径并提前减速的硬件级软限位功能,仍是浏览器仿真边界。 + +SIM_STEP 事件的 tick 必须是实际完成/停止时间;不预写未执行的未来时刻,不通过跳过序号或删除历史“修复”会话。部分执行失败时统一 native/JS scheduler、task、protocol 的停止 tick,新的停止和撤退命令正常按顺序执行。限位是 motion blocked,不是 Worker transport ERROR。已经损坏的旧会话需刷新重建。 + +## D01 / 两条链与唯一结构来源 + +严格采用用户要求的底座-XYZ-主轴箱和底座-A/B-C。URDF 是结构来源;GLB 节点必须匹配,不从视觉网格尺寸猜测运动学。v1 限定现有 WASM 能精确支持的 AC/BC TRT,不将任意 URDF 强行归入该求解器。 + +## D02 / 单文件与版本化 + +URDF XML 放入默认场景 extras.linuxcncMachine,经 GLTFLoader 成为 userData。schema 必须匹配版本;glb 几何、材质和纹理须内嵌,无外部依赖。额外导出 XML 供阅读,不是运行必需文件。 + +## D03 / SI 和坐标转换 + +URDF 米/弧度与右手 Z-up;根节点显式转为 glTF Y-up。运行参数转毫米/度;旧查看器坐标转换仅在显示外层执行。姿态投影从关节计算刚体变换,逆解仍由 WASM 执行。 + +## D04 / 几何与运行配置 + +结构解析得到机型、摇篮位置/偏置,通过现有 INI 参数入口进入 Worker。URDF 不能提供回零接线、加速度或伺服周期,所以沿用已识别机型的运行配置;限位差异显式校验,不默默宣称完整工业控制配置已生成。 + +## D05 / 原创资产与可验证性 + +现有网上候选未确认所需层级与许可,交付原创可复现程序化资产,记录来源和许可。不复制未知许可证模型。模型是仿真示例,不是制造商尺寸标定数据。 + +## D06 / GLB 与 INI 冲突及失败处理 + +导入完成格式、树、轴和运动范围校验后才提交 LOAD_WORKSPACE。保留当前程序,不按机型偷偷替换 G-code;配置成功而原程序解析失败属于分阶段结果,必须显式报告。后续 INI 修改或手工切换机型会卸载 GLB,避免旧结构驱动新参数。损坏 GLB 不改变已生效模型及参数。 + +## D07 / 刀长与现有原生坐标约定 + +`trtfuncs.c` 在逆解中使用 dz + tool-offset。物理摇篮中心不随刀长改变;主轴箱刀尖沿本地 Z 减去 tool-offset,程序参考沿 C 的本地 Z 同样减去该值。多姿态、正负刀长必须用真实 WASM 逆解验证,不能只验证零角姿态。姿态矩阵只用于显示,不替代运动学求解。 + +## D08 / 保存与发布范围 + +本轮交付文件、导入和当前页面运行。没有将大型 GLB 塞进现有 1 MiB OPFS checkpoint,也不改变其恢复边界;页面明确提示刷新后需重新导入。证据全部归入 coverage/glb-machine;原测试增加可选 TRT_EVIDENCE_DIR,默认行为不变,防止新回归覆写历史验收文件。 + +## D09 / 预览优先与对话框交互 + +用户要求释放机床显示面积,导入和参数表改为按钮打开的可拖动对话框。保留两个入口在一行,不常驻占用模型高度;不改变左右两类预览比例。采用共享原生 dialog,标题栏拖动并限制在视口内,窗口缩小时重新约束位置。关闭不丢失草稿,不因异步导入开始而自动隐藏结果。打开查看与执行编辑分开,编辑仍由既有 Worker/前端门控控制。 + +弹窗内 Esc 专用于关闭,F2/Jog 等全局机床快捷键不执行;F1 急停继续有效。Tab 在弹窗内循环,关闭返回触发按钮。 + +## D10 / 空闲运动学切换保持物理关节 + +只选择 M429/M428/M430 不构成运动指令。应固定当前实际关节,由新模式正解得到坐标,再同步 TP 与解释器;坐标数值允许改变,三维刀尖不能改变。依据本地 LinuxCNC `control.c::handle_kinematicsSwitch()`:复制 joint.pos_cmd → kinematicsSwitch → kinematicsForward → tpSetPos,以及 [官方 switchkins 同步说明](https://linuxcnc.org/docs/html/motion/switchkins.html)。 + +Web 按钮/MDI 原来使用 select() 保持 pose 的策略不符合上述物理约束,改为调用已有 selectPhysical()。不在 Three.js 中补偿错误关节,也不冻结模型掩盖跳变。规划器 pose/tag 必须一起切换,避免中间态逆解;随后解释器同步确保下一条增量命令使用新坐标参考。运行中切换门控保持。 + +## D11 / 同机型几何编辑保留导入资产(替代 D06/D08 的卸载策略) + +用户确认:导入 GLB 后修改几何参数不应替换成内置模型。导入资产的网格/材质、文件名和源文件 SHA 保持;当前有效 URDF 是独立的会话参数覆盖,A/B origin=P+D、C origin=-D、work origin=-P。修改、重读或导入同机型 INI 都使用这一路径。 + +在 LOAD_WORKSPACE 前构造并校验候选有效 URDF;成功后提交模型参数和界面配置。源场景不原地修改,渲染克隆采用有效 URDF,包括固定工件坐标节点;程序重解析失败时保留已提交模型并明确报告分阶段结果。资源释放依赖源 scene 是否更换,不因结构参数对象变化释放共享网格。 + +结构详情显示已应用参数。源 GLB 文件不会被静默改写,示例下载仍是原始示例;可以保存 INI 记录参数。网格外形不自动缩放或重新生成,固定在底座的外观网格仍属于底座;此功能校正结构节点和运动学参数,不宣称对任意导入网格完成 CAD 尺寸重建。显式选择机型配置仍视为更换整机,切换后返回该机型内置模型。 + +## D12 / 独立的桁架型 profile 与示例注册 + +用户新增桁架型层级到 Z 结束,因此 tool 直接绑定 Z link,主轴作为 Z 下的外观网格,不另设固定主轴箱 link。新 profile `trt-xyz-gantry/1` 为七 link/六 joint;原 `trt-xyz-head/1` 保留八 link/七 joint。模型类型 AC/BC 仍由实际轴向与两条机械链推断,不靠文件名。 + +桁架固定四柱与纵轨挂底座,移动横梁挂 X、横梁滑座挂 Y、滑枕/主轴挂 Z;A/B→C 为独立工作台分支。复用原生 TRT 求解器和已有参数映射,不新增 JS 逆解。参数化范围沿用几何中心/轴间偏置及真实关节运动,不增加无实际控制依据的外观尺寸表单。 + +四个示例共用 manifest 注册名称和文件路径;旧 AC/BC GLB 字节不变。新例子为原创程序化模型,许可证沿用 CC0,单文件含几何与 URDF。 diff --git a/docs/glb-machine/README.md b/docs/glb-machine/README.md new file mode 100644 index 0000000..cb6ed31 --- /dev/null +++ b/docs/glb-machine/README.md @@ -0,0 +1,35 @@ +# GLB / URDF 五轴机床子项目 + +接续顺序:本索引 → [04-任务矩阵](04-任务矩阵.md) → [03-推进台账](03-推进台账.md) 最新轮 → 当前任务相关方案和代码;实施前核对 [06-决策记录](06-决策记录.md),验收后更新 [05-验收证据](05-验收证据.md)。 + +最新交付:[工件坐标与RTCP初学者完整PDF](../teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf),72页A4,详解原点/方向/G54/G代码逐字逐行和关节运动;源稿、数据、复现见[完整教材索引](../teaching/rtcp-beginners/README.md)。任务TRT-DOC02,台账R09,证据E13。原[31页投影课件](../teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf)保留为概要;既有功能状态仍见下文R07。 + +- [01-子项目功能内容](01-子项目功能内容.md) +- [02-子项目程序开发详细步骤](02-子项目程序开发详细步骤.md) +- 原专项 [TRT 参数化](../trt-parametric/README.md) 已验收,不重复实现。 +- 工作区原有 trace、LinuxCNC 子模块、临时脚本和图片全部保留。 +- 示例交付目录:`web/react/public/machines/`;证据:`coverage/glb-machine/`。 + +目标:导入一个含层级网格和 URDF XML 的 GLB,识别 AC/BC 结构、提取几何参数,经 INI/Worker 进入真实 WASM;预览由实际关节驱动。 + +Jog 限位与事件序列修复见 R07/E11:限位后可停止和反向退出,旧的 event_sequence_gap 会话需刷新并重新导入/回零。用户补充的 PCFSoftShadowMap 弃用警告也已消除。 + +## 当前状态与交付 + +GLB-01 至 GLB-06、GLB-UI01/02、TRT-SW01、GLB-GEO01、GLB-GAN01、TRT-JOG02 全部已专项验收,最新台账 R07,最新证据 E11(两项既有旧测试失败单独记录)。新功能尚未提交/推送;开发服务 `http://127.0.0.1:5174/` 已启动,重启环境后应重新检查。 + +- [AC 单文件机床模型](../../web/react/public/machines/demo-ac-xyz-head.glb) / [可阅读 URDF](../../web/react/public/machines/demo-ac-xyz-head.urdf) +- [BC 单文件机床模型](../../web/react/public/machines/demo-bc-xyz-head.glb) / [可阅读 URDF](../../web/react/public/machines/demo-bc-xyz-head.urdf) +- [AC 桁架模型](../../web/react/public/machines/demo-ac-gantry.glb) / [URDF](../../web/react/public/machines/demo-ac-gantry.urdf) +- [BC 桁架模型](../../web/react/public/machines/demo-bc-gantry.glb) / [URDF](../../web/react/public/machines/demo-bc-gantry.urdf) +- [模型 manifest](../../web/react/public/machines/manifest.json) / [验收汇总](../../coverage/glb-machine/acceptance.report.json) + +使用:打开页面 → 关机且空闲 → 机床预览顶部“导入机床模型” → 对话框中“AC 示例”“BC 示例”“AC 示例桁架型”“BC 示例桁架型”或“导入 GLB” → 确认显示的机型与参数 → 开机、重新回零 → Jog 或运行匹配的五轴程序。可展开结构详情,并通过“下载 AC/BC”保存完整 GLB。页面刷新后需重新导入。 + +后续制模先读 01 的契约和完整 XML 示例;软件位置在 03 台账。当前无待办任务,不自动认领旧发布轨道,也不重复已通过测试。若新增任意轴向/头头机型、持久化 GLB 或碰撞检查,应先新增任务和对应决策。 + +参数入口为机床预览顶部“机床参数”;两个对话框均可拖动标题栏、Esc 关闭,关闭保留未应用草稿。最新 UI 验收见 [E07 汇总](../../coverage/glb-machine/dialogs/acceptance.report.json)。 + +空闲 M429/M428 切换已改为保持关节和刀尖位置,XYZ 数值按新运动学坐标重新计算;证据见 [E08 汇总](../../coverage/glb-machine/switching/acceptance.report.json)。 + +导入模型后应用/重读/导入同机型 INI 参数会保留 GLB,并同步有效 URDF 与 WASM;原始 GLB 文件不改写,可通过保存 INI 记录参数。只在显式更换机型时卸载旧模型,见 [E09 汇总](../../coverage/glb-machine/geometry-edit/acceptance.report.json)。 diff --git a/docs/linuxcnc-axis-web-control-panel-source-logic.md b/docs/linuxcnc-axis-web-control-panel-source-logic.md index 2b9b40c..0dd98d8 100644 --- a/docs/linuxcnc-axis-web-control-panel-source-logic.md +++ b/docs/linuxcnc-axis-web-control-panel-source-logic.md @@ -131,7 +131,7 @@ replaced by a different action. | View menu | Five preset views, inches/mm, program/rapid/alpha/live/tool/extents/offset/limit/velocity/DTG layers, grid, large DRO font, PyVCP, commanded/actual, machine/relative, joint/world and Clear Live Plot | The menu has five views; the toolbar additionally has inverted-front `Y2`, for six toolbar presets. Supported projections are `SOURCE_ADAPTER`; every omitted view action is recorded below. | | Toolbar | E-stop, Power, Open, Reload, Run, Step, Pause/Resume, Stop, Block Delete, Optional Stop, zoom, six views, rotate, Clear Plot | Same source order and icon assets are retained for supported controls; unsupported controls are disabled with a source/ABI reason. | | Manual notebook | Axis/joint selector, continuous/increment jog, Home Axis, Touch Off, Tool Touch Off, Override Limits, spindle direction/stop/speed/brake and coolant | XYZAC axis selector, jog, Home Axis, Touch Off, spindle and coolant are represented. Joint selection, Tool Touch Off and Override Limits are explicitly bounded by the selected configuration/ABI. Tool and probe state is read-only; Prepare/Change/Arm/Disarm are IO/HAL operations, not AXIS main-panel controls. | -| Web case strip | no AXIS equivalent | `Load exact XYZAC TRT case` is a Web workspace/bootstrap control, not an AXIS source button. It may only call the same documented `LOAD_WORKSPACE` + `PROGRAM_LOAD` transaction and must not introduce a second Run/Power/Home flow. | +| Web case strip | no AXIS equivalent | Exact TRT case loading and the 32-entry RTCP source library are Web workspace controls. Compatible main programs may only call the documented `PROGRAM_LOAD` transaction; support files and other kinematics remain source-view/download entries and must not introduce a second Run/Power/Home flow. | | MDI notebook | MDI entry, Go, history selection/double-click, Up/Down history, Ctrl-M/H/Shift-H clipboard operations | Entry, Go and local history are represented; clipboard/file history operations are host/UI-only and are not sent as machine commands. | | Help menu/dialogs | About AXIS, Quick Reference, dialog close buttons and website link | About is `SOURCE_ADAPTER`. Quick Reference and the external website link are not rendered; neither is mapped to a machine action. | | Bottom controls | Linear jog speed, angular jog speed, max velocity, spindle override, feed override and rapid override | Linear jog, max velocity, spindle and feed are adapters. Angular jog and rapid override are `SOURCE_BLOCKED`; one must never stand in for the other. | @@ -173,7 +173,7 @@ families because their cardinality comes from the selected INI. | MDI entry, Go, Enter, history activation | `send_mdi`, `send_mdi_command` | `SOURCE_ADAPTER`; source trim, mode and adjacent-history de-duplication apply | | Linear/angular jog speed, max velocity, spindle/feed/rapid override | `update_*slider_vel`, `set_maxvel`, `set_spindlerate`, `set_feedrate`, `set_rapidrate` | Linear jog/max velocity/spindle/feed: `SOURCE_ADAPTER`; angular jog/rapid: `SOURCE_BLOCKED` | | About, Quick Reference, clear notifications | About/keys dialogs and `Ctrl-Space` binding | About: local adapter; Quick Reference and notification-clear are not rendered | -| Case selector/load, packaged 3D Chips, Diagnostics, pan/reset buttons, source editor | no AXIS widget equivalent | `WEB_EXTENSION`; may not be counted as AXIS parity | +| Case selector/load, packaged programs, RTCP program catalog, Diagnostics, pan/reset buttons, source editor | no AXIS widget equivalent | `WEB_EXTENSION`; may not be counted as AXIS parity | ## Source Keyboard Contract @@ -446,8 +446,10 @@ history rows intentionally share the family ID `mdi-history-select`. | `toolbar-view-z`, `toolbar-view-z2`, `toolbar-view-x`, `toolbar-view-y`, `toolbar-view-y2`, `toolbar-view-p` | `set_view_z/z2/x/y/y2/p` | Local source view selection | Exactly one pressed view; opens Preview tab; machine state unchanged | | `toolbar-rotate` | `.toolbar.rotate` | Local drag/rotate projection | Toggles pressed state and viewer interaction only | | `toolbar-clear-live-plot` | `clear_live_plot` -> `positionlogger.clear()` | Worker `VISUAL_CLEAR`; always visual-only | Advances `live_path_epoch`, clears Live Plot only and retains static preview | -| `workspace-case-select` | Web selection of the INI/configuration input | Local selection; selected catalog is restricted to supported XYZAC case | Does not load or change machine state until `toolbar-load-case` | +| `workspace-case-select` | Web selection of the INI/configuration input | Local selection; selected catalog is restricted to supported XYZAC/XYZBC cases | Does not load or change machine state until `toolbar-load-case` | | `workspace-load-3d-chips` | Web packaged-file equivalent of `open_file_guts` | Fetch published `3D_Chips.ngc`, then `PROGRAM_LOAD`; IDLE only | Same replacement path as Open; retains Live Plot, no automatic Run/Home | +| `workspace-rtcp-programs`, `rtcp-program-scope`, `rtcp-program-select`, `rtcp-program-source`, `rtcp-program-load`, `rtcp-program-download` | Web RTCP source-program catalog backed by the locked LinuxCNC tree | The default scope follows the active machine: AC=`XYZAC`, BC=`XYZBC`; catalog/source/download are local file operations, while compatible main programs use the same `PROGRAM_LOAD` transaction and IDLE gate as Open | AC and BC programs are separated by kinematics. The optional all-source scope retains all 32 files for inspection; remap/subroutine/reference and mismatched kinematics cannot be sent as an executable main program | +| `machine-manager-settings`, `machine-manager-import`, `machine-manager-files`, `machine-manager-translate`, `machine-manager-rotate`, `machine-manager-role`, `machine-manager-parent`, `machine-manager-show-origin`, `machine-manager-apply`, `machine-manager-export` | Web component-level machine assembly extension | Draft import/edit/preview is local. Apply validates the supported AC/BC hierarchy, generates `linuxcnc.machine/1`, then uses the existing `LOAD_WORKSPACE` + `PROGRAM_LOAD` transaction while OFF and IDLE; Export serializes the validated scene and userData to a self-contained GLB | Three.js edits appearance/assembly metadata only; runtime joint motion, tool offset and RTCP remain Worker/WASM authoritative | | `manual-home-all` | `home_all_joints` | `HOME {all:true}`; ON+IDLE, no concurrent homing/jog | Native homemod selects the configured sequences. No artificial coordinated return-to-zero motion. | | `switchkins-0`, `switchkins-1`, `switchkins-2` | `M429`, `M428`, `M430` remaps and `motion.switchkins-type` | `KINEMATICS_SELECT`; ON, homed, IDLE, empty TP | Identity/XYZAC/User K canonical type, or stable gate reason | | `tab-manual`, `tab-mdi` | `ensure_manual` / `ensure_mdi` | `SET_MODE`; manual_ok and motion exclusion | Task mode acknowledgement and WASM motion mode are monitored separately; no local tab is mode authority. | diff --git a/docs/teaching/rtcp-beginners/README.md b/docs/teaching/rtcp-beginners/README.md new file mode 100644 index 0000000..27fa83b --- /dev/null +++ b/docs/teaching/rtcp-beginners/README.md @@ -0,0 +1,70 @@ +# 五轴 RTCP 与工件坐标:初学者完整讲义 + +[打开完整 PDF](五轴RTCP与工件坐标-初学者完整讲义.pdf) · [可编辑 HTML](handbook.html) · [逐页目录](outline.json) + +本版是面向初学者重新组织的 **72 页 A4 完整讲义**,不是只在原投影片后附几页补充。原 [31 页投影课件](../rtcp-five-axis/五轴机床与RTCP-教学课件.pdf) 保留为概要。本讲义适合独立阅读、打印及分 4–6 次授课。 + +## 新增重点 + +- 从原点、方向、单位、右手规则、点与增量讲起;区分物理机床参考 M、工件 W、关节 J、运动学输入 K 和刀具 T。 +- 工件原点如何选择、测量;为什么一个点不能确定方向;机械找正与初始坐标旋转分别解决什么。 +- 分开说明“固连零件的物理坐标架”“G54偏置表”“动态RTCP变换”;G54不是独立完成五轴跟随的开关。 +- 详细解释G54/G55、G10 L2/L20、G90/G91、G20/G21、省略轴与模态;说明G52/G92/G53、圆弧字、进给方式、刀补索引的边界。 +- 对同一份BC程序逐字、逐行计算工件XYZ、K输入XYZ、角度、实际关节位置,给出完整对照表和连续轨迹图。 +- 实验、排错、限位、术语、练习和答案;把数学推导放在附录,不要求初学者先会矩阵。 + +## 章节与 PDF 页码 + +| PDF 页码 | 内容 | +| --- | --- | +| 1–3 | 封面、阅读方法、可点击目录 | +| 4–9 | 坐标基础、点与增量、五轴结构、关节与反馈 | +| 10–14 | 各参考系、回零、工件坐标、随动原点、G54表与物理坐标架 | +| 15–20 | 零位参考、原点选择与测量、方向确定、完整点变换 | +| 21–26 | G54/G55、偏置、G10 L2/L20、G52/G92/G53 | +| 27–33 | 非RTCP/RTCP、方向合成、AC/BC、结构参数与刀长 | +| 34–43 | 地址字、模态、单位、G90/G91、G0/G1、圆弧、F及其他字的解析 | +| 44–53 | 完整程序、N10–N110逐行实算、结果表与模式切换 | +| 54–57 | 连续轨迹、姿态、模型显示与分层准备 | +| 58–62 | 三个实验、排错、行程/动力学/碰撞边界 | +| 63–67 | 常见问答、两组练习与答案 | +| 68–72 | 术语、公式、软件实验范围、资料来源与复现 | + +正文编号01–69为“节号”,与PDF页码相差封面/导读/目录三页;内部引用按节号,目录按PDF页码。 + +## 核心实算 + +主例:XYZBC,零旋转中心/轴间偏置/刀长差,G54零位偏置 `(40,20,10)` mm,初始方向对齐。 + +| 程序段 | 工件 XYZ | K 输入 XYZ | B/C | 关节 XYZ | +| --- | --- | --- | --- | --- | +| `N50 G1 X10 Y0 Z5 B0 C0 F600` | 10,0,5 | 50,20,15 | 0/0 | 50,20,15 | +| `N60 C90` | 10,0,5 | 50,20,15 | 0/90 | -20,50,15 | +| `N70 G91 X10` | 20,0,5 | 60,20,15 | 0/90 | -20,60,15 | +| `N80 G90 X20 Y0 Z5 B30 C90 F300` | 20,0,5 | 60,20,15 | 30/90 | -9.821,60,22.990 | +| `N90 X0 Y10` | 0,10,5 | 40,30,15 | 30/90 | -18.481,40,27.990 | + +这些数值来自 [实际 WASM 验证](gcode-evidence.json),包括11个主程序段、11个额外单位/坐标设置段;N10–N90加M2通过真实Session/解释器/TP完整执行,记录53个轨迹样本,并核对最终关节。下载模型自带非零参数,不能不改条件就要求得到这张表的相同数值。 + +## 验证与范围 + +- [版面报告](verification/layout.json):72页图文边界、图片加载、标题和正文检查。 +- [PDF核验](verification/acceptance.json):页数、A4尺寸、逐页中文文本、内嵌字体、书签、文件与资产SHA256。 +- `verification/` 保留逐页截图及实际PDF的独立渲染总览。 +- 9张新增原创坐标示意图,复用此前11张原创原理图/模型图;不是许可不明的网络插画。 +- 依据LinuxCNC官方坐标/G代码/五轴/切换资料和当前仓库代码;最后一页有直接链接。 +- 当前WASM解释器属于功能切片。通用G52/G92、任意坐标方向变换、完整G43/H刀表、所有进给模式并未在本次全面验收;正文明确标出,不能把“解析接受”当作完整功能正确性。 +- 本讲义不修改应用功能,不宣称真实机床的探测/碰撞/硬件安全流程已被验证。 + +## 重新生成 + +```bash +node scripts/generate_rtcp_beginner_data.mjs +PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/generate_rtcp_beginner_figures.py +python3 scripts/generate_rtcp_beginner_html.py +PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/subset_rtcp_beginner_fonts.py +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/render_rtcp_beginner_pdf.mjs +PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/verify_rtcp_beginner_pdf.py +``` + +生成工具依赖临时安装的Matplotlib/PyPDF/fontTools、Chrome、Playwright和Noto CJK字体;PDF成品不需要这些工具,可以离线阅读。HTML需与同目录assets一起保留。中文字体按本书实际字符制作子集,避免同形部首导致复制/搜索文字不同;字体许可证在assets/font-license.txt。 diff --git a/docs/teaching/rtcp-beginners/assets/absolute-incremental.png b/docs/teaching/rtcp-beginners/assets/absolute-incremental.png new file mode 100644 index 0000000..a518324 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/absolute-incremental.png differ diff --git a/docs/teaching/rtcp-beginners/assets/arc-chord.png b/docs/teaching/rtcp-beginners/assets/arc-chord.png new file mode 100644 index 0000000..ca4cb30 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/arc-chord.png differ diff --git a/docs/teaching/rtcp-beginners/assets/arc-words.png b/docs/teaching/rtcp-beginners/assets/arc-words.png new file mode 100644 index 0000000..1ad61df Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/arc-words.png differ diff --git a/docs/teaching/rtcp-beginners/assets/bc-frame.png b/docs/teaching/rtcp-beginners/assets/bc-frame.png new file mode 100644 index 0000000..fdc0c08 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/bc-frame.png differ diff --git a/docs/teaching/rtcp-beginners/assets/continuous-joints.png b/docs/teaching/rtcp-beginners/assets/continuous-joints.png new file mode 100644 index 0000000..ab083f4 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/continuous-joints.png differ diff --git a/docs/teaching/rtcp-beginners/assets/coordinate-grid.png b/docs/teaching/rtcp-beginners/assets/coordinate-grid.png new file mode 100644 index 0000000..069dfb6 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/coordinate-grid.png differ diff --git a/docs/teaching/rtcp-beginners/assets/datum-choice.png b/docs/teaching/rtcp-beginners/assets/datum-choice.png new file mode 100644 index 0000000..b78dd46 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/datum-choice.png differ diff --git a/docs/teaching/rtcp-beginners/assets/font-license.txt b/docs/teaching/rtcp-beginners/assets/font-license.txt new file mode 100644 index 0000000..420b420 --- /dev/null +++ b/docs/teaching/rtcp-beginners/assets/font-license.txt @@ -0,0 +1,327 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: noto-cjk +Upstream-Contact: https://github.com/notofonts/noto-cjk/issues +Source: https://github.com/notofonts/noto-cjk +Files-Excluded: + .gitattributes + .gitignore + Sans/Mono/NotoSansMonoCJKhk-Bold.otf + Sans/Mono/NotoSansMonoCJKhk-Regular.otf + Sans/Mono/NotoSansMonoCJKjp-Bold.otf + Sans/Mono/NotoSansMonoCJKjp-Regular.otf + Sans/Mono/NotoSansMonoCJKkr-Bold.otf + Sans/Mono/NotoSansMonoCJKkr-Regular.otf + Sans/Mono/NotoSansMonoCJKsc-Bold.otf + Sans/Mono/NotoSansMonoCJKsc-Regular.otf + Sans/Mono/NotoSansMonoCJKtc-Bold.otf + Sans/Mono/NotoSansMonoCJKtc-Regular.otf + Sans/OTF/Japanese/NotoSansCJKjp-Black.otf + Sans/OTF/Japanese/NotoSansCJKjp-Bold.otf + Sans/OTF/Japanese/NotoSansCJKjp-DemiLight.otf + Sans/OTF/Japanese/NotoSansCJKjp-Light.otf + Sans/OTF/Japanese/NotoSansCJKjp-Medium.otf + Sans/OTF/Japanese/NotoSansCJKjp-Regular.otf + Sans/OTF/Japanese/NotoSansCJKjp-Thin.otf + Sans/OTF/Korean/NotoSansCJKkr-Black.otf + Sans/OTF/Korean/NotoSansCJKkr-Bold.otf + Sans/OTF/Korean/NotoSansCJKkr-DemiLight.otf + Sans/OTF/Korean/NotoSansCJKkr-Light.otf + Sans/OTF/Korean/NotoSansCJKkr-Medium.otf + Sans/OTF/Korean/NotoSansCJKkr-Regular.otf + Sans/OTF/Korean/NotoSansCJKkr-Thin.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Black.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Bold.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-DemiLight.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Light.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Medium.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Regular.otf + Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Thin.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Black.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Bold.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-DemiLight.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Light.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Medium.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Regular.otf + Sans/OTF/TraditionalChinese/NotoSansCJKtc-Thin.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Black.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Bold.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-DemiLight.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Light.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Medium.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Regular.otf + Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Thin.otf + Sans/SubsetOTF/HK/NotoSansHK-Black.otf + Sans/SubsetOTF/HK/NotoSansHK-Bold.otf + Sans/SubsetOTF/HK/NotoSansHK-DemiLight.otf + Sans/SubsetOTF/HK/NotoSansHK-Light.otf + Sans/SubsetOTF/HK/NotoSansHK-Medium.otf + Sans/SubsetOTF/HK/NotoSansHK-Regular.otf + Sans/SubsetOTF/HK/NotoSansHK-Thin.otf + Sans/SubsetOTF/JP/NotoSansJP-Black.otf + Sans/SubsetOTF/JP/NotoSansJP-Bold.otf + Sans/SubsetOTF/JP/NotoSansJP-DemiLight.otf + Sans/SubsetOTF/JP/NotoSansJP-Light.otf + Sans/SubsetOTF/JP/NotoSansJP-Medium.otf + Sans/SubsetOTF/JP/NotoSansJP-Regular.otf + Sans/SubsetOTF/JP/NotoSansJP-Thin.otf + Sans/SubsetOTF/KR/NotoSansKR-Black.otf + Sans/SubsetOTF/KR/NotoSansKR-Bold.otf + Sans/SubsetOTF/KR/NotoSansKR-DemiLight.otf + Sans/SubsetOTF/KR/NotoSansKR-Light.otf + Sans/SubsetOTF/KR/NotoSansKR-Medium.otf + Sans/SubsetOTF/KR/NotoSansKR-Regular.otf + Sans/SubsetOTF/KR/NotoSansKR-Thin.otf + Sans/SubsetOTF/SC/NotoSansSC-Black.otf + Sans/SubsetOTF/SC/NotoSansSC-Bold.otf + Sans/SubsetOTF/SC/NotoSansSC-DemiLight.otf + Sans/SubsetOTF/SC/NotoSansSC-Light.otf + Sans/SubsetOTF/SC/NotoSansSC-Medium.otf + Sans/SubsetOTF/SC/NotoSansSC-Regular.otf + Sans/SubsetOTF/SC/NotoSansSC-Thin.otf + Sans/SubsetOTF/TC/NotoSansTC-Black.otf + Sans/SubsetOTF/TC/NotoSansTC-Bold.otf + Sans/SubsetOTF/TC/NotoSansTC-DemiLight.otf + Sans/SubsetOTF/TC/NotoSansTC-Light.otf + Sans/SubsetOTF/TC/NotoSansTC-Medium.otf + Sans/SubsetOTF/TC/NotoSansTC-Regular.otf + Sans/SubsetOTF/TC/NotoSansTC-Thin.otf + Sans/SuperOTC/NotoSansCJK.ttc.zip + Sans/Variable/OTC/NotoSansCJK-VF.ttf.ttc + Sans/Variable/OTC/NotoSansMonoCJK-VF.ttf.ttc + Sans/Variable/OTF/Mono/NotoSansMonoCJKhk-VF.otf + Sans/Variable/OTF/Mono/NotoSansMonoCJKjp-VF.otf + Sans/Variable/OTF/Mono/NotoSansMonoCJKkr-VF.otf + Sans/Variable/OTF/Mono/NotoSansMonoCJKsc-VF.otf + Sans/Variable/OTF/Mono/NotoSansMonoCJKtc-VF.otf + Sans/Variable/OTF/NotoSansCJKhk-VF.otf + Sans/Variable/OTF/NotoSansCJKjp-VF.otf + Sans/Variable/OTF/NotoSansCJKkr-VF.otf + Sans/Variable/OTF/NotoSansCJKsc-VF.otf + Sans/Variable/OTF/NotoSansCJKtc-VF.otf + Sans/Variable/OTF/Subset/NotoSansHK-VF.otf + Sans/Variable/OTF/Subset/NotoSansJP-VF.otf + Sans/Variable/OTF/Subset/NotoSansKR-VF.otf + Sans/Variable/OTF/Subset/NotoSansSC-VF.otf + Sans/Variable/OTF/Subset/NotoSansTC-VF.otf + Sans/Variable/TTF/Mono/NotoSansMonoCJKhk-VF.ttf + Sans/Variable/TTF/Mono/NotoSansMonoCJKjp-VF.ttf + Sans/Variable/TTF/Mono/NotoSansMonoCJKkr-VF.ttf + Sans/Variable/TTF/Mono/NotoSansMonoCJKsc-VF.ttf + Sans/Variable/TTF/Mono/NotoSansMonoCJKtc-VF.ttf + Sans/Variable/TTF/NotoSansCJKhk-VF.ttf + Sans/Variable/TTF/NotoSansCJKjp-VF.ttf + Sans/Variable/TTF/NotoSansCJKkr-VF.ttf + Sans/Variable/TTF/NotoSansCJKsc-VF.ttf + Sans/Variable/TTF/NotoSansCJKtc-VF.ttf + Sans/Variable/TTF/Subset/NotoSansHK-VF.ttf + Sans/Variable/TTF/Subset/NotoSansJP-VF.ttf + Sans/Variable/TTF/Subset/NotoSansKR-VF.ttf + Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf + Sans/Variable/TTF/Subset/NotoSansTC-VF.ttf + Serif/OTF/Japanese/NotoSerifCJKjp-Black.otf + Serif/OTF/Japanese/NotoSerifCJKjp-Bold.otf + Serif/OTF/Japanese/NotoSerifCJKjp-ExtraLight.otf + Serif/OTF/Japanese/NotoSerifCJKjp-Light.otf + Serif/OTF/Japanese/NotoSerifCJKjp-Medium.otf + Serif/OTF/Japanese/NotoSerifCJKjp-Regular.otf + Serif/OTF/Japanese/NotoSerifCJKjp-SemiBold.otf + Serif/OTF/Korean/NotoSerifCJKkr-Black.otf + Serif/OTF/Korean/NotoSerifCJKkr-Bold.otf + Serif/OTF/Korean/NotoSerifCJKkr-ExtraLight.otf + Serif/OTF/Korean/NotoSerifCJKkr-Light.otf + Serif/OTF/Korean/NotoSerifCJKkr-Medium.otf + Serif/OTF/Korean/NotoSerifCJKkr-Regular.otf + Serif/OTF/Korean/NotoSerifCJKkr-SemiBold.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Black.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Bold.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-ExtraLight.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Light.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Medium.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Regular.otf + Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-SemiBold.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Black.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Bold.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-ExtraLight.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Light.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Medium.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Regular.otf + Serif/OTF/TraditionalChinese/NotoSerifCJKtc-SemiBold.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Black.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Bold.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-ExtraLight.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Light.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Medium.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Regular.otf + Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-SemiBold.otf + Serif/SubsetOTF/HK/NotoSerifHK-Black.otf + Serif/SubsetOTF/HK/NotoSerifHK-Bold.otf + Serif/SubsetOTF/HK/NotoSerifHK-ExtraLight.otf + Serif/SubsetOTF/HK/NotoSerifHK-Light.otf + Serif/SubsetOTF/HK/NotoSerifHK-Medium.otf + Serif/SubsetOTF/HK/NotoSerifHK-Regular.otf + Serif/SubsetOTF/HK/NotoSerifHK-SemiBold.otf + Serif/SubsetOTF/JP/NotoSerifJP-Black.otf + Serif/SubsetOTF/JP/NotoSerifJP-Bold.otf + Serif/SubsetOTF/JP/NotoSerifJP-ExtraLight.otf + Serif/SubsetOTF/JP/NotoSerifJP-Light.otf + Serif/SubsetOTF/JP/NotoSerifJP-Medium.otf + Serif/SubsetOTF/JP/NotoSerifJP-Regular.otf + Serif/SubsetOTF/JP/NotoSerifJP-SemiBold.otf + Serif/SubsetOTF/KR/NotoSerifKR-Black.otf + Serif/SubsetOTF/KR/NotoSerifKR-Bold.otf + Serif/SubsetOTF/KR/NotoSerifKR-ExtraLight.otf + Serif/SubsetOTF/KR/NotoSerifKR-Light.otf + Serif/SubsetOTF/KR/NotoSerifKR-Medium.otf + Serif/SubsetOTF/KR/NotoSerifKR-Regular.otf + Serif/SubsetOTF/KR/NotoSerifKR-SemiBold.otf + Serif/SubsetOTF/SC/NotoSerifSC-Black.otf + Serif/SubsetOTF/SC/NotoSerifSC-Bold.otf + Serif/SubsetOTF/SC/NotoSerifSC-ExtraLight.otf + Serif/SubsetOTF/SC/NotoSerifSC-Light.otf + Serif/SubsetOTF/SC/NotoSerifSC-Medium.otf + Serif/SubsetOTF/SC/NotoSerifSC-Regular.otf + Serif/SubsetOTF/SC/NotoSerifSC-SemiBold.otf + Serif/SubsetOTF/TC/NotoSerifTC-Black.otf + Serif/SubsetOTF/TC/NotoSerifTC-Bold.otf + Serif/SubsetOTF/TC/NotoSerifTC-ExtraLight.otf + Serif/SubsetOTF/TC/NotoSerifTC-Light.otf + Serif/SubsetOTF/TC/NotoSerifTC-Medium.otf + Serif/SubsetOTF/TC/NotoSerifTC-Regular.otf + Serif/SubsetOTF/TC/NotoSerifTC-SemiBold.otf + Serif/Variable/OTC/NotoSerifCJK-VF.ttf.ttc + Serif/Variable/OTF/NotoSerifCJKhk-VF.otf + Serif/Variable/OTF/NotoSerifCJKjp-VF.otf + Serif/Variable/OTF/NotoSerifCJKkr-VF.otf + Serif/Variable/OTF/NotoSerifCJKsc-VF.otf + Serif/Variable/OTF/NotoSerifCJKtc-VF.otf + Serif/Variable/OTF/Subset/NotoSerifHK-VF.otf + Serif/Variable/OTF/Subset/NotoSerifJP-VF.otf + Serif/Variable/OTF/Subset/NotoSerifKR-VF.otf + Serif/Variable/OTF/Subset/NotoSerifSC-VF.otf + Serif/Variable/OTF/Subset/NotoSerifTC-VF.otf + Serif/Variable/TTF/NotoSerifCJKhk-VF.ttf + Serif/Variable/TTF/NotoSerifCJKjp-VF.ttf + Serif/Variable/TTF/NotoSerifCJKkr-VF.ttf + Serif/Variable/TTF/NotoSerifCJKsc-VF.ttf + Serif/Variable/TTF/NotoSerifCJKtc-VF.ttf + Serif/Variable/TTF/Subset/NotoSerifHK-VF.ttf + Serif/Variable/TTF/Subset/NotoSerifJP-VF.ttf + Serif/Variable/TTF/Subset/NotoSerifKR-VF.ttf + Serif/Variable/TTF/Subset/NotoSerifSC-VF.ttf + Serif/Variable/TTF/Subset/NotoSerifTC-VF.ttf + +Files: * +Copyright: 2010-2012, Google Corporation +License: SIL-1.1 + +Files: debian/* +Copyright: 2013, Vasudev Kamath + 2013-2015, Jonas Smedegaard + 2015-2022, ChangZhuo Chen (陳昌倬) +License: GPL-3+ + +License: SIL-1.1 + ----------------------------------------------------------- + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + ----------------------------------------------------------- + . + PREAMBLE + . + The goals of the Open Font License (OFL) are to stimulate worldwide + development of collaborative font projects, to support the font + creation efforts of academic and linguistic communities, and to provide + a free and open framework in which fonts may be shared and improved in + partnership with others. + . + The OFL allows the licensed fonts to be used, studied, modified and + redistributed freely as long as they are not sold by themselves. The + fonts, including any derivative works, can be bundled, embedded, + redistributed and/or sold with any software provided that any reserved + names are not used by derivative works. The fonts and derivatives, + however, cannot be released under any other type of license. The + requirement for fonts to remain under this license does not apply to + any document created using the fonts or their derivatives. + . + DEFINITIONS + . + "Font Software" refers to the set of files released by the Copyright + Holder(s) under this license and clearly marked as such. This may + include source files, build scripts and documentation. + . + "Reserved Font Name" refers to any names specified as such after the + copyright statement(s). + . + "Original Version" refers to the collection of Font Software components + as distributed by the Copyright Holder(s). + . + "Modified Version" refers to any derivative made by adding to, + deleting, or substituting -- in part or in whole -- any of the + components of the Original Version, by changing formats or by porting + the Font Software to a new environment. + . + "Author" refers to any designer, engineer, programmer, technical writer + or other person who contributed to the Font Software. + . + PERMISSION & CONDITIONS + . + Permission is hereby granted, free of charge, to any person obtaining a + copy of the Font Software, to use, study, copy, merge, embed, modify, + redistribute, and sell modified and unmodified copies of the Font + Software, subject to the following conditions: + . + 1) Neither the Font Software nor any of its individual components, in + Original or Modified Versions, may be sold by itself. + . + 2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + . + 3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the + corresponding Copyright Holder. This restriction only applies to the + primary font name as presented to the users. + . + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + . + 5) The Font Software, modified or unmodified, in part or in whole, must + be distributed entirely under this license, and must not be distributed + under any other license. The requirement for fonts to remain under this + license does not apply to any document created using the Font Software. + . + TERMINATION + . + This license becomes null and void if any of the above conditions are + not met. + . + DISCLAIMER + . + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. + +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/docs/teaching/rtcp-beginners/assets/handbook-bold.otf b/docs/teaching/rtcp-beginners/assets/handbook-bold.otf new file mode 100644 index 0000000..86fb558 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/handbook-bold.otf differ diff --git a/docs/teaching/rtcp-beginners/assets/handbook-regular.otf b/docs/teaching/rtcp-beginners/assets/handbook-regular.otf new file mode 100644 index 0000000..7bedaef Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/handbook-regular.otf differ diff --git a/docs/teaching/rtcp-beginners/assets/hierarchy.png b/docs/teaching/rtcp-beginners/assets/hierarchy.png new file mode 100644 index 0000000..3569c48 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/hierarchy.png differ diff --git a/docs/teaching/rtcp-beginners/assets/identity-no-follow.png b/docs/teaching/rtcp-beginners/assets/identity-no-follow.png new file mode 100644 index 0000000..75cc74e Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/identity-no-follow.png differ diff --git a/docs/teaching/rtcp-beginners/assets/machine-ac.png b/docs/teaching/rtcp-beginners/assets/machine-ac.png new file mode 100644 index 0000000..23adc00 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/machine-ac.png differ diff --git a/docs/teaching/rtcp-beginners/assets/machine-bc.png b/docs/teaching/rtcp-beginners/assets/machine-bc.png new file mode 100644 index 0000000..9be77ce Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/machine-bc.png differ diff --git a/docs/teaching/rtcp-beginners/assets/moving-origin.png b/docs/teaching/rtcp-beginners/assets/moving-origin.png new file mode 100644 index 0000000..f91e9ce Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/moving-origin.png differ diff --git a/docs/teaching/rtcp-beginners/assets/offset-pipeline.png b/docs/teaching/rtcp-beginners/assets/offset-pipeline.png new file mode 100644 index 0000000..3f1614d Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/offset-pipeline.png differ diff --git a/docs/teaching/rtcp-beginners/assets/orientation-measure.png b/docs/teaching/rtcp-beginners/assets/orientation-measure.png new file mode 100644 index 0000000..32274ee Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/orientation-measure.png differ diff --git a/docs/teaching/rtcp-beginners/assets/orientation.png b/docs/teaching/rtcp-beginners/assets/orientation.png new file mode 100644 index 0000000..c69dec9 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/orientation.png differ diff --git a/docs/teaching/rtcp-beginners/assets/pivot-offset.png b/docs/teaching/rtcp-beginners/assets/pivot-offset.png new file mode 100644 index 0000000..f57d4f7 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/pivot-offset.png differ diff --git a/docs/teaching/rtcp-beginners/assets/rotated-direction.png b/docs/teaching/rtcp-beginners/assets/rotated-direction.png new file mode 100644 index 0000000..920d8da Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/rotated-direction.png differ diff --git a/docs/teaching/rtcp-beginners/assets/same-point.png b/docs/teaching/rtcp-beginners/assets/same-point.png new file mode 100644 index 0000000..c9a6f44 Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/same-point.png differ diff --git a/docs/teaching/rtcp-beginners/assets/tcp-follow.png b/docs/teaching/rtcp-beginners/assets/tcp-follow.png new file mode 100644 index 0000000..3ef099c Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/tcp-follow.png differ diff --git a/docs/teaching/rtcp-beginners/assets/tool-length.png b/docs/teaching/rtcp-beginners/assets/tool-length.png new file mode 100644 index 0000000..44bfa9e Binary files /dev/null and b/docs/teaching/rtcp-beginners/assets/tool-length.png differ diff --git a/docs/teaching/rtcp-beginners/examples/beginner-g54-rtcp.ngc b/docs/teaching/rtcp-beginners/examples/beginner-g54-rtcp.ngc new file mode 100644 index 0000000..6b7e93e --- /dev/null +++ b/docs/teaching/rtcp-beginners/examples/beginner-g54-rtcp.ngc @@ -0,0 +1,12 @@ +; Teaching fixture only: XYZBC, P=D=tool-offset=0, known initial state. +; Work origin (40,20,10) mm; this is not a production machining program. +N10 G21 G90 G94 G17 +N20 G10 L2 P1 X40 Y20 Z10 +N30 G54 +N40 M428 +N50 G1 X10 Y0 Z5 B0 C0 F600 +N60 C90 +N70 G91 X10 +N80 G90 X20 Y0 Z5 B30 C90 F300 +N90 X0 Y10 +M2 diff --git a/docs/teaching/rtcp-beginners/gcode-evidence.json b/docs/teaching/rtcp-beginners/gcode-evidence.json new file mode 100644 index 0000000..5ca165d --- /dev/null +++ b/docs/teaching/rtcp-beginners/gcode-evidence.json @@ -0,0 +1,3635 @@ +{ + "report_id": "rtcp-beginners-gcode-v1", + "status": "verified", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "assumptions": { + "coordinates": "XYZBC", + "rot_point": [ + 0, + 0, + 0 + ], + "offsets": [ + 0, + 0, + 0 + ], + "tool_offset": 0, + "work_origin": [ + 40, + 20, + 10 + ], + "rotation": "Ry(B)*Rz(C)", + "work_rotation": 0 + }, + "rows": [ + { + "block": "N10 G21 G90 G94 G17", + "has_motion": false, + "mode": 0, + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 0, + 0, + 0 + ], + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "origin": [ + 0, + 0, + 0 + ], + "units": 21, + "distance_mode": 90, + "feed": 0, + "motion": null + }, + { + "block": "N20 G10 L2 P1 X40 Y20 Z10", + "has_motion": false, + "mode": 0, + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + -40, + -20, + -10 + ], + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 0, + "motion": null + }, + { + "block": "N30 G54", + "has_motion": false, + "mode": 0, + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + -40, + -20, + -10 + ], + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 0, + "motion": null + }, + { + "block": "N40 M428", + "has_motion": false, + "mode": 1, + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + -40, + -20, + -10 + ], + "joints": [ + 0, + 0, + 0, + 0, + 0 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 0, + "motion": null + }, + { + "block": "N50 G1 X10 Y0 Z5 B0 C0 F600", + "has_motion": true, + "mode": 1, + "canonical": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 10, + 0, + 5 + ], + "joints": [ + 50, + 20, + 15, + 0, + 0 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 600, + "motion": { + "start": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "N60 C90", + "has_motion": true, + "mode": 1, + "canonical": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 10, + 0, + 5 + ], + "joints": [ + -19.999999999999996, + 50, + 15, + 0, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 600, + "motion": { + "start": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 50, + "y": 20, + "z": 15 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "N70 G91 X10", + "has_motion": true, + "mode": 1, + "canonical": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 20, + 0, + 5 + ], + "joints": [ + -19.999999999999996, + 60, + 15, + 0, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 91, + "feed": 600, + "motion": { + "start": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 50, + "y": 20, + "z": 15 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "N80 G90 X20 Y0 Z5 B30 C90 F300", + "has_motion": true, + "mode": 1, + "canonical": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 20, + 0, + 5 + ], + "joints": [ + -9.820508075688771, + 60, + 22.990381056766577, + 30, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 300, + "motion": { + "start": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 60, + "y": 20, + "z": 15 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 5, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "N90 X0 Y10", + "has_motion": true, + "mode": 1, + "canonical": { + "x": 40, + "y": 30, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 0, + 10, + 5 + ], + "joints": [ + -18.480762113533157, + 40, + 27.990381056766577, + 30, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 300, + "motion": { + "start": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 40, + "y": 30, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 60, + "y": 20, + "z": 15 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 5, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 40, + "y": 30, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "N100 M429", + "has_motion": false, + "mode": 0, + "canonical": { + "x": -18.480762113533157, + "y": 40, + "z": 27.990381056766577, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + -58.48076211353316, + 20, + 17.990381056766577 + ], + "joints": [ + -18.480762113533157, + 40, + 27.990381056766577, + 30, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 300, + "motion": null + }, + { + "block": "N110 M428", + "has_motion": false, + "mode": 1, + "canonical": { + "x": 40, + "y": 30, + "z": 15.000000000000004, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "work_xyz": [ + 0, + 10, + 5.0000000000000036 + ], + "joints": [ + -18.480762113533157, + 40, + 27.990381056766577, + 30, + 90 + ], + "origin": [ + 40, + 20, + 10 + ], + "units": 21, + "distance_mode": 90, + "feed": 300, + "motion": null + } + ], + "units": [ + { + "block": "G21 G90 G1 X0 Y0 Z0 F600", + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 1, + "offsets": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "motion": null + }, + { + "block": "G20 G91 X1 F2", + "canonical": { + "x": 25.4, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 20, + "distance_mode": 91, + "feed": 50.8, + "coordinates": { + "system": 1, + "offsets": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "motion": { + "start": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 25.4, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 0.8466666666666666, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 25.4, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "G21 G90 X30", + "canonical": { + "x": 30, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 50.8, + "coordinates": { + "system": 1, + "offsets": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "motion": { + "start": { + "x": 25.4, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 30, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 25.4, + "y": 0, + "z": 0 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 0.8466666666666666, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 25.4, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 30, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + } + ], + "touch": [ + { + "block": "G21 G90 G1 X70 Y30 Z20 F600", + "canonical": { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 1, + "offsets": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ] + }, + "motion": { + "start": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "G10 L20 P1 X0 Y0 Z0", + "canonical": { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 1, + "offsets": [ + [ + 70, + 30, + 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 + ] + ] + }, + "motion": null + }, + { + "block": "G54 X10", + "canonical": { + "x": 80, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 1, + "offsets": [ + [ + 70, + 30, + 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 + ] + ] + }, + "motion": { + "start": { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 80, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 70, + "y": 30, + "z": 20 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 70, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 80, + "y": 30, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + } + ], + "switching": [ + { + "block": "G21 G90 G10 L2 P1 X40 Y20 Z10", + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 0, + "coordinates": { + "system": 1, + "offsets": [ + [ + 40, + 20, + 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 + ] + ] + }, + "motion": null + }, + { + "block": "G10 L2 P2 X80 Y-10 Z10", + "canonical": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 0, + "coordinates": { + "system": 1, + "offsets": [ + [ + 40, + 20, + 10, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 80, + -10, + 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 + ] + ] + }, + "motion": null + }, + { + "block": "G54 G1 X10 Y0 Z5 F600", + "canonical": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 1, + "offsets": [ + [ + 40, + 20, + 10, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 80, + -10, + 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 + ] + ] + }, + "motion": { + "start": { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 0, + "y": 0, + "z": 0 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 0, + "y": 0, + "z": 0, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + }, + { + "block": "G55", + "canonical": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 2, + "offsets": [ + [ + 40, + 20, + 10, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 80, + -10, + 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 + ] + ] + }, + "motion": null + }, + { + "block": "X10", + "canonical": { + "x": 90, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "units": 21, + "distance_mode": 90, + "feed": 600, + "coordinates": { + "system": 2, + "offsets": [ + [ + 40, + 20, + 10, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 80, + -10, + 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 + ] + ] + }, + "motion": { + "start": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "end": { + "x": 90, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "center": { + "x": 50, + "y": 20, + "z": 15 + }, + "normal": { + "x": 0, + "y": 0, + "z": 1 + }, + "velocity": 10, + "acceleration": 0, + "motion_type": 1, + "turn": 1, + "samples": [ + { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + { + "x": 90, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + ], + "samples_source": "linuxcnc-wasm-sim_posemath_segment_point", + "canonical_motion_mode": 1, + "kind": "feed", + "source_line": 0 + } + } + ], + "executed_program": { + "source": "N10 G21 G90 G94 G17\nN20 G10 L2 P1 X40 Y20 Z10\nN30 G54\nN40 M428\nN50 G1 X10 Y0 Z5 B0 C0 F600\nN60 C90\nN70 G91 X10\nN80 G90 X20 Y0 Z5 B30 C90 F300\nN90 X0 Y10\nM2\n", + "status": "completed", + "final_pose": { + "x": 40, + "y": 30, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "final_joints": [ + -18.480762113533157, + 40, + 27.990381056766577, + 30, + 90 + ], + "samples": [ + { + "tick": 6, + "pose": { + "x": 0.06037383539249431, + "y": 0.024149534156997724, + "z": 0.018112150617748294, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 0.06037383539249431, + 0.024149534156997724, + 0.018112150617748294, + 0, + 0 + ] + }, + { + "tick": 56, + "pose": { + "x": 4.442306808179677, + "y": 1.7769227232718707, + "z": 1.3326920424539033, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 4.442306808179677, + 1.7769227232718707, + 1.3326920424539033, + 0, + 0 + ] + }, + { + "tick": 106, + "pose": { + "x": 8.914442763179162, + "y": 3.565777105271665, + "z": 2.674332828953749, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.914442763179162, + 3.565777105271665, + 2.674332828953749, + 0, + 0 + ] + }, + { + "tick": 156, + "pose": { + "x": 13.386578718178646, + "y": 5.354631487271458, + "z": 4.015973615453594, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.386578718178646, + 5.354631487271458, + 4.015973615453594, + 0, + 0 + ] + }, + { + "tick": 206, + "pose": { + "x": 17.85871467317876, + "y": 7.143485869271505, + "z": 5.3576144019536285, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.85871467317876, + 7.143485869271505, + 5.3576144019536285, + 0, + 0 + ] + }, + { + "tick": 256, + "pose": { + "x": 22.33085062817904, + "y": 8.932340251271615, + "z": 6.699255188453712, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.33085062817904, + 8.932340251271615, + 6.699255188453712, + 0, + 0 + ] + }, + { + "tick": 306, + "pose": { + "x": 26.802986583179315, + "y": 10.721194633271727, + "z": 8.040895974953795, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.802986583179315, + 10.721194633271727, + 8.040895974953795, + 0, + 0 + ] + }, + { + "tick": 356, + "pose": { + "x": 31.275122538178653, + "y": 12.510049015271461, + "z": 9.382536761453597, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 31.275122538178653, + 12.510049015271461, + 9.382536761453597, + 0, + 0 + ] + }, + { + "tick": 406, + "pose": { + "x": 35.747258493177334, + "y": 14.298903397270934, + "z": 10.724177547953202, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 35.747258493177334, + 14.298903397270934, + 10.724177547953202, + 0, + 0 + ] + }, + { + "tick": 456, + "pose": { + "x": 40.21939444817603, + "y": 16.08775777927041, + "z": 12.06581833445281, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.21939444817603, + 16.08775777927041, + 12.06581833445281, + 0, + 0 + ] + }, + { + "tick": 506, + "pose": { + "x": 44.69153040317472, + "y": 17.87661216126989, + "z": 13.407459120952417, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 44.69153040317472, + 17.87661216126989, + 13.407459120952417, + 0, + 0 + ] + }, + { + "tick": 556, + "pose": { + "x": 49.16366635817341, + "y": 19.665466543269364, + "z": 14.749099907452024, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 49.16366635817341, + 19.665466543269364, + 14.749099907452024, + 0, + 0 + ] + }, + { + "tick": 606, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 4.0666499999999575, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 48.45577442259152, + 23.495487334952777, + 15, + 0, + 4.0666499999999575 + ] + }, + { + "tick": 656, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 9.066649999999852, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 46.22361892181932, + 27.62927892237557, + 15, + 0, + 9.066649999999852 + ] + }, + { + "tick": 706, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 14.066649999999743, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 43.6396737704679, + 31.552795014184344, + 15, + 0, + 14.066649999999743 + ] + }, + { + "tick": 756, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 19.066650000000184, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 40.72360435136742, + 35.23617528383704, + 15, + 0, + 19.066650000000184 + ] + }, + { + "tick": 806, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 24.066650000000966, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 37.49760371356814, + 38.651386983395575, + 15, + 0, + 24.066650000000966 + ] + }, + { + "tick": 856, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 29.066650000001744, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 33.986223669836356, + 41.77243828966481, + 15, + 0, + 29.066650000001744 + ] + }, + { + "tick": 906, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 34.06665000000179, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 30.216187942534674, + 44.57557611766137, + 15, + 0, + 34.06665000000179 + ] + }, + { + "tick": 956, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 39.0666500000008, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 26.21618877995804, + 47.03946689593327, + 15, + 0, + 39.0666500000008 + ] + }, + { + "tick": 1006, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 44.066649999999804, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 22.016668590998414, + 49.14535892792059, + 15, + 0, + 44.066649999999804 + ] + }, + { + "tick": 1056, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 49.0666499999988, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 17.649588260033397, + 50.87722510368752, + 15, + 0, + 49.0666499999988 + ] + }, + { + "tick": 1106, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 54.066649999997814, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 13.148183905296797, + 52.221884875907094, + 15, + 0, + 54.066649999997814 + ] + }, + { + "tick": 1156, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 59.06664999999683, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 8.546713931950425, + 53.169104571784956, + 15, + 0, + 59.06664999999683 + ] + }, + { + "tick": 1206, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 64.06664999999587, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 3.880198304934943, + 53.711675277488595, + 15, + 0, + 64.06664999999587 + ] + }, + { + "tick": 1256, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 69.06664999999843, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -0.815847974112188, + 53.845467702334396, + 15, + 0, + 69.06664999999843 + ] + }, + { + "tick": 1306, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 74.06665000000099, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -5.505685157453833, + 53.56946360518269, + 15, + 0, + 74.06665000000099 + ] + }, + { + "tick": 1356, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 79.06665000000355, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -10.153620752323631, + 52.88576354386861, + 15, + 0, + 79.06665000000355 + ] + }, + { + "tick": 1406, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 84.0666500000061, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -14.724281162344322, + 51.79957088868818, + 15, + 0, + 84.0666500000061 + ] + }, + { + "tick": 1456, + "pose": { + "x": 50, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 89.06665000000866, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -19.182880901955418, + 50.31915222160836, + 15, + 0, + 89.06665000000866 + ] + }, + { + "tick": 1506, + "pose": { + "x": 54.06664999999996, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -19.999999999999996, + 54.06664999999996, + 15, + 0, + 90 + ] + }, + { + "tick": 1556, + "pose": { + "x": 59.06664999999985, + "y": 20, + "z": 15, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -19.999999999999996, + 59.06664999999985, + 15, + 0, + 90 + ] + }, + { + "tick": 1606, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 2.1166499999999773, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -19.432342420772983, + 60, + 15.728447731477718, + 2.1166499999999773, + 90 + ] + }, + { + "tick": 1656, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 4.616649999999924, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -18.727781882388193, + 60, + 16.561104605843553, + 4.616649999999924, + 90 + ] + }, + { + "tick": 1706, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 7.116649999999871, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -17.987571946772736, + 60, + 17.362236476320508, + 7.116649999999871, + 90 + ] + }, + { + "tick": 1756, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 9.616650000000105, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -17.21312164560975, + 60, + 18.130318342859866, + 9.616650000000105, + 90 + ] + }, + { + "tick": 1806, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 12.116650000000496, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -16.405905189064413, + 60, + 18.863888117973698, + 12.116650000000496, + 90 + ] + }, + { + "tick": 1856, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 14.616650000000886, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -15.567459159540986, + 60, + 19.56154940990164, + 14.616650000000886, + 90 + ] + }, + { + "tick": 1906, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 17.11665000000088, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -14.699379586710966, + 60, + 20.221974180721944, + 17.11665000000088, + 90 + ] + }, + { + "tick": 1956, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 19.616650000000384, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -13.803318909379703, + 60, + 20.843905274347236, + 19.616650000000384, + 90 + ] + }, + { + "tick": 2006, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 22.116649999999886, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -12.880982829975085, + 60, + 21.4261588095927, + 22.116649999999886, + 90 + ] + }, + { + "tick": 2056, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 24.61664999999939, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -11.93412706764641, + 60, + 21.967626433760863, + 24.61664999999939, + 90 + ] + }, + { + "tick": 2106, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 27.11664999999889, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -10.964554016153045, + 60, + 22.467277432454118, + 27.11664999999889, + 90 + ] + }, + { + "tick": 2156, + "pose": { + "x": 60, + "y": 20, + "z": 15, + "a": 0, + "b": 29.616649999998394, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -9.974109312905426, + 60, + 22.92416069159814, + 29.616649999998394, + 90 + ] + }, + { + "tick": 2206, + "pose": { + "x": 58.10681068617005, + "y": 20.946594656914975, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -10.640283095663754, + 58.10681068617005, + 23.463678385224064, + 30, + 90 + ] + }, + { + "tick": 2256, + "pose": { + "x": 55.870742708670306, + "y": 22.064628645664847, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -11.608528932215588, + 55.870742708670306, + 24.022695379599, + 30, + 90 + ] + }, + { + "tick": 2306, + "pose": { + "x": 53.63467473117056, + "y": 23.18266263441472, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -12.576774768767422, + 53.63467473117056, + 24.581712373973936, + 30, + 90 + ] + }, + { + "tick": 2356, + "pose": { + "x": 51.39860675367056, + "y": 24.30069662316472, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -13.545020605319369, + 51.39860675367056, + 25.140729368348936, + 30, + 90 + ] + }, + { + "tick": 2406, + "pose": { + "x": 49.16253877617042, + "y": 25.41873061191479, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -14.513266441871373, + 49.16253877617042, + 25.69974636272397, + 30, + 90 + ] + }, + { + "tick": 2456, + "pose": { + "x": 46.92647079867029, + "y": 26.536764600664856, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -15.481512278423377, + 46.92647079867029, + 26.258763357099006, + 30, + 90 + ] + }, + { + "tick": 2506, + "pose": { + "x": 44.6904028211705, + "y": 27.65479858941475, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -16.449758114975232, + 44.6904028211705, + 26.81778035147395, + 30, + 90 + ] + }, + { + "tick": 2556, + "pose": { + "x": 42.45433484367116, + "y": 28.77283257816442, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -17.418003951526888, + 42.45433484367116, + 27.376797345848786, + 30, + 90 + ] + }, + { + "tick": 2606, + "pose": { + "x": 40.21826686617182, + "y": 29.89086656691409, + "z": 15, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + -18.38624978807855, + 40.21826686617182, + 27.935814340223622, + 30, + 90 + ] + } + ] + } +} diff --git a/docs/teaching/rtcp-beginners/handbook.html b/docs/teaching/rtcp-beginners/handbook.html new file mode 100644 index 0000000..d3a6967 --- /dev/null +++ b/docs/teaching/rtcp-beginners/handbook.html @@ -0,0 +1,65 @@ +五轴RTCP与工件坐标:初学者完整讲义
封面 · 完整讲义 / 2026.09

五轴 RTCP 与工件坐标

从坐标零点到 G 代码,再到每根轴的运动

面向初学者的完整学习路径:先认识“相对谁量位置”,再理解“角度改变后,控制器如何保持刀尖相对工件的目标关系”。

本项目原创 XYZBC 桁架模型:刀具侧 XYZ,工件侧 B→C。
本项目原创 XYZBC 桁架模型:刀具侧 XYZ,工件侧 B→C。

包含:基础概念、图解、逐字解析、逐行数值演算、实验步骤、排错方法、练习和答案。
建议分 4–6 次授课,也可按目录自学。

读完后,应能把“程序写的数值”和“电机实际要到的位置”分开解释。
原创讲解;以本讲义所声明的双转台结构为限。01 / 72
导读

怎样使用这份讲义

不要求你先会矩阵或五轴编程。先把坐标看成贴在物体上的尺子,再把RTCP看成依据机床结构换算位置的计算过程。公式附录可以最后再读。

三种标签,避免把不同层次混在一起

层次在讲义中怎样使用
通用概念坐标、相对位置、程序段、绝对/增量、物理关节等基础知识。
本课模型XYZ移动刀具;A/C或B/C转动工件;按本项目正方向和父子层级计算。
已实测算例通过本项目WASM解释器、运动学和规划器验证的数值;不是手工猜测。

推荐阅读顺序

  1. 第1–3章:先弄清坐标系、原点、方向及工件偏置。
  2. 第4–6章:理解RTCP,再学习G代码各地址字与模式。
  3. 第7章:跟着一份完整程序逐行计算,自己复算。
  4. 第8–10章:操作实验、排错、练习;最后查数学附录。

本项目仿真只覆盖LinuxCNC的一部分能力。讲到G52/G92、坐标旋转、完整刀补等功能时,会区分官方控制器语义和项目已验证的范围。

不要把某个控制器或示例的约定,当作所有机床都必须遵循的规则。
原创讲解;以本讲义所声明的双转台结构为限。02 / 72
学习地图

内容索引

本书从基础坐标开始,逐步建立程序与关节之间的计算链。PDF目录书签可直接跳转章节。节号不是PDF页码;前面另有封面和导读。

章节PDF起始页
第1章 坐标与机床基础4
第2章 机床、工件与中间参考10
第3章 原点和方向如何确定15
第4章 G54、G10与其他偏置21
第5章 RTCP的点、方向与标定27
第6章 G代码逐字与模态解析34
第7章 完整程序逐行实算44
第8章 连续轨迹、刀轴与显示54
第9章 课堂实验、限位与排错58
第10章 问答、练习与答案63
附录A 术语表68
附录B 可选数学推导69
附录C 软件验证范围71
附录D 资料来源与复现72

建议每次学习1–2章,完成相应小实验后再继续。数值实算章建议边读边写出W、K、角度、J四列。

先学概念,后读代码;遇到陌生词可跳到附录术语表。
原创讲解;以本讲义所声明的双转台结构为限。03 / 72
第1章 · 坐标基础

01 坐标是“按照约定量出来的位置”

想象一张方格纸。先指定一个交点为原点O,再规定向右是+X、向上是+Y,每格代表10mm。这样你就能用两个数告诉别人某个孔的位置,而不必每次都画整张图。

P=(30,20)mm:从原点沿+X量30mm,再沿+Y量20mm。
P=(30,20)mm:从原点沿+X量30mm,再沿+Y量20mm。

这里的30和20不是电机编号,也不是速度。它们是点P相对于这套尺子的两个坐标分量。换一个原点,或者把尺子的方向转动,同一个点的坐标数字就会改变。

坐标数字必须和“原点、方向、单位”一起理解。
原创讲解;以本讲义所声明的双转台结构为限。04 / 72
第1章 · 坐标基础

02 一套坐标系至少要规定什么?

要素初学者理解不说明会怎样
原点从哪里开始量。相同数值落在不同位置。
方向X、Y、Z分别朝哪边。相同增量可能走向不同方向。
单位例如长度mm、旋转角度°。X1可能是1mm,也可能是25.4mm。
正负号与手性三轴之间的正向约定。模型可能镜像、旋转方向可能相反。

三维直角坐标系有三条互相垂直的轴。一般按右手规则建立:+X和+Y确定后,+Z的方向也随之确定。不能任意把其中一根轴反向,同时还声称保持同一套右手坐标。

坐标系在图上常画成三根箭头;在控制器中,它由参数和变换关系表示。屏幕上的箭头只是它的可视化,拖动摄像机不会改变机床的真实坐标约定。

三个方向不是三条新导轨,而是描述位置的三个基准方向。
原创讲解;以本讲义所声明的双转台结构为限。05 / 72
第1章 · 坐标基础

03 同一个点,可以有两套不同的坐标

工件原点在机床中为(40,20)。同一P点:机床坐标(50,35),工件坐标(10,15)。
工件原点在机床中为(40,20)。同一P点:机床坐标(50,35),工件坐标(10,15)。

假设两套坐标的方向相同,只是原点平移。绿色工件原点比蓝色机床原点多了X40、Y20。于是工件上的P=(10,15),在机床坐标中就是(50,35)。

机床中的位置 = 工件原点的位置 + 工件内的坐标

反过来,若已知机床中的点位置,需要减去工件原点,才能得到工件内的读数。这就是最简单的“工件偏置”直觉。

点没有动,坐标数字也可以变;改变的是量它的尺子。
原创讲解;以本讲义所声明的双转台结构为限。06 / 72
第1章 · 坐标基础

04 点坐标与移动增量不是一回事

“去X20”描述一个目的地;“向+X再走20”描述一段位移。当前位置不同,这两句话会产生不同结果。

当前位置X=10:绝对目标X20移动10;增量X20移动20,终点到X30。
当前位置X=10:绝对目标X20移动10;增量X20移动20,终点到X30。

点坐标需要一个原点。位移向量描述从一个点到另一个点的差,原点平移不会改变这段差值;但是坐标方向转动,会改变它在另一套坐标中的分量。

写法意思
p=(10,5,2)一个目标点的位置。
Δp=(10,0,0)沿当前编程+X方向增加10。
X轴方向向量只说明方向;不能直接当作某个目标点。

后面会反复用到:p表示点,Δp表示增量。不要因为都含X/Y/Z三个数就把它们混用。

“目标在哪里”和“这一步走多远”是两个问题。
原创讲解;以本讲义所声明的双转台结构为限。07 / 72
第1章 · 机床结构

05 五轴机床里,到底是哪五根轴?

本课选择双转台桁架结构:三根直线轴X、Y、Z让刀具移动;两根旋转轴让工件转动。AC型使用A和C,BC型使用B和C。它们不是XYZABC六根独立轴都同时存在。

坐标字母典型含义本课执行部件
X/Y/Z直线位置横梁、滑座、滑枕/刀具
A绕X方向的轴线转动AC外层倾转台
B绕Y方向的轴线转动BC外层倾转台
C绕本地Z方向轴线转动安装在倾转台上的内层转台
两条独立分支:刀具侧XYZ;工件侧A/B→C。
两条独立分支:刀具侧XYZ;工件侧A/B→C。

C的轴线装在A/B上,所以A/B倾转会连C的轴线一起带走。这不是软件的小细节,而是决定运动学计算次序的机械事实。

先查结构图,确认谁安装在谁上面,再讨论坐标如何变换。
[S1][S3];本项目桁架模型。08 / 72
第1章 · 机床结构

06 关节位置,不等于工件坐标

把“关节”理解为一个执行机构及它的位置。在本项目里,J0/J1/J2对应XYZ直线轴,J3是A或B,J4是C。每个关节位置属于机构自身的运动参数。

对象回答什么问题
程序点刀尖相对于选定编程参考系要到哪里?
关节指令各执行轴应该到哪里?
实际反馈编码器报告机械轴实际上在哪里?
三维模型刀尖将关节位置代入结构模型后,画面上的刀尖在哪里?

简单三轴、没有偏置时,这几类数字可能很相近,容易造成“它们本来就是同一回事”的错觉。五轴RTCP会把这种差别明显表现出来:程序XYZ不变,关节XYZ却需要变化。

程序描述加工目标;关节是执行这个目标的机构参数。
原创讲解;以本讲义所声明的双转台结构为限。09 / 72
第2章 · 参考系

07 先认识 M、W、J,再引入 K 和 T

符号在本讲义中的含义在哪里看
M固连机床底座的物理笛卡尔参考系。观察真实空间位置与方向。
W设计给零件编程用的工件坐标系。图纸、CAD/CAM、G54编程。
J / q各机械关节的位置集合。J0…J4、编码器/关节显示。
K已经解释偏置、尚未经过RTCP逆解的坐标输入。本项目解释器输出到运动学的接口。
T刀具参考系或刀具受控点的定义。主轴参考点、刀长标定、TCP。

初学者先记住M、W、J三个概念。K是在复杂机床中避免混淆的“中间层”:控制器界面叫作Machine的XYZ,有时是运动学坐标,不能不看定义就认定它一定等于物理直线关节。

本讲义用K做教学记号,不是要求控制器界面必须新增一个叫K的按钮。它也不是G代码中的圆弧中心地址K;同一个字母处在不同上下文中,意义不同。

本讲义的符号是为讲清层次而定义的,不是所有控制器统一的界面名称。
原创讲解;以本讲义所声明的双转台结构为限。10 / 72
第2章 · 机床参考

08 回零解决什么?工件对刀又解决什么?

回零建立机器执行机构的参考,使控制器知道关节位置相对于设定基准如何计量。它解决“机床自己在哪里”的问题。工件可能每次装在不同位置,回零并不会自动知道零件角点或孔中心在哪里。

工件对刀、测头找正和设置工件偏置,解决“这次装夹的零件参考在哪里”的问题。这两类基准相互有关,但不能互相替代。

操作主要作用不会自动完成
回零/HOME建立关节或机床参考。不会自动测得G54零点。
选G54选择已保存的编程参考。不会自动重新测量工件。
设置工件零点更新零件与基础参考的配准。不会重新标定转台中心。
测刀/刀长标定建立主轴参考与刀尖的关系。不会确定所有工件方向。
回零、找工件零点、测刀,是不同的准备步骤。
[S2][S4];实际回零方法取决于机床配置。11 / 72
第2章 · 工件参考

09 工件坐标 W 代表什么?

工件坐标是一套为零件几何与加工意图服务的参考。设计人员可能把顶面角点定义为(0,0,0),把孔中心写成(30,20,−5)。CAM和操作者必须采用兼容的约定,程序中的点才会落在预期部位。

原点可以选角点、中心、基准面交点等;不一定是转台中心。
原点可以选角点、中心、基准面交点等;不一定是转台中心。

零件本身并没有天然写着“这里必须是X0”。原点是根据图纸、工艺、装夹和测量便利性选定的。选好以后,需测量或标定出它与机床结构的关系。

原点是工艺约定,控制器必须得到该约定与实际装夹之间的对应关系。
原创讲解;以本讲义所声明的双转台结构为限。12 / 72
第2章 · 工件随动

10 工件转了,原点与方向一起转

零位工件原点o=(40,20,10)mm;只看XY俯视,Z另计。
零位工件原点o=(40,20,10)mm;只看XY俯视,Z另计。

设工件原点在零位参考中是(40,20,10)。当C=0°时,它在机床空间仍在(40,20,10)。当C=90°、旋转中心为零时,它移到(−20,40,10)。

此时工件+X方向也转成机床+Y方向。工件上的P=(10,0,5)始终是“从工件原点沿工件X走10,再沿工件Z走5”,但它在机床空间从(50,20,15)变到(−20,50,15)。

随工件固连的坐标架是一个整体:原点和三根方向箭头一起变换。
原创讲解;以本讲义所声明的双转台结构为限。13 / 72
第2章 · 最重要的区分

11 “物理工件坐标架”和“G54表”不是同一对象

物理上,你可以想象把一套坐标箭头画在工件上。转台转动时,这套箭头会随工件一起转。软件里,G54则是用于选取一套工件坐标设置的指令,其数据保存在控制器的偏置表中。

在本课RTCP模型中,G54主要给出零位配准偏置;姿态改变时的空间变换由另一层运动学完成。因此,偏置表中的数字可以保持不变,但它所对应的物理工件原点会在机床空间移动。

层次本课中的作用
零件上的W坐标架描述固定在零件上的位置和方向。
G54等偏置数据告诉解释器如何把编程坐标换算到基础输入K。
RTCP运动学利用当前A/B、C及几何参数把K换算成物理关节目标。

如果只打开G54而没有正确的五轴运动学,控制器并不会因此自动追踪物理工件架的旋转。非RTCP时,软件的直接坐标解释与转动后的零件局部方向可能不一致。

G54负责选参考数据,RTCP负责根据结构和姿态换算运动。
[S1][S2][S4];后半为本课模型与项目实测数据链。14 / 72
第3章 · 原点与方向的确定

12 先约定机床零姿态,再谈工件装在哪里

要描述工件装夹位置,必须先有一套明确的基础参考:旋转轴的零角度是什么姿态?倾转轴中心在哪里?C轴中心在哪里?直线轴与刀具基准怎样关联?这些由机床配置与几何标定决定。

把转台放到定义的A/B=0、C=0姿态,可以建立零位配准参考K。零件的工件原点相对于这套参考的偏置,记作o。若工件方向也存在初始夹角,还需要初始方向变换R₀。

编程点 p_W → 零位配准 → p_K → 当前姿态变换 → 关节 q
要确定的量谁来提供
轴的零角度、正方向回零/编码器基准与机床配置。
旋转中心、轴间偏置机床结构数据、测量与标定。
零件原点及初始方向工艺定义、装夹、测头或找正。
刀具长度与参考点刀具测量、刀表与补偿设置。

这些数据不是点击“开启RTCP”时凭空生成的。RTCP只会使用已有数据计算,不能自动猜出实际工件的全部装夹关系。

RTCP能正确跟随的前提,是机床几何与工件配准都已经正确。
原创讲解;以本讲义所声明的双转台结构为限。15 / 72
第3章 · 原点选择

13 工件原点放在哪里比较合适?

常见选择有:毛坯顶面角点、工件中心、定位孔中心、某个基准面与两条基准边的交点。没有一种位置对所有零件都最优。应与图纸和CAM编程基准一致,并且能够稳定测量。

  1. 先看图纸和CAM:尺寸从哪里标起,程序预期哪个位置为零?
  2. 再看装夹:该基准在机床上是否可接近、可找正、可重复?
  3. 确认方向:+X沿哪条边,+Y朝哪边,+Z朝工件外侧还是另一约定方向?
  4. 记录采用的是毛坯面、成品基准面还是夹具基准,避免同名不同面。

换一次装夹,零点位置可能变化。程序里零件局部几何可以保持不变,只更新该次装夹的配准数据。这正是工件坐标的价值。

转台中心可以作为机床标定基准,却不必与零件编程原点重合。把两者强行设成同一点,会让工艺选择受到不必要限制。

方便编程、方便测量、装夹可重复,比“零点看起来居中”更重要。
原创讲解;以本讲义所声明的双转台结构为限。16 / 72
第3章 · 原点测量

14 怎样把选好的原点告诉控制器?

首先必须让刀尖或测头与已知基准建立真实关系。可以使用测头、寻边器、对刀棒或其他已标定的测量方法。测量工具本身的半径、长度及接触位置要考虑进去;刀具中心碰到边,不等于刀尖已经位于所选坐标原点。

一种便于理解的零位流程

  1. 完成机床回零和刀具/测头标定。
  2. 把转台置于已知参考角度,按工艺要求找正工件。
  3. 测得原点相对于基础参考的位置,写入目标工件坐标表。
  4. 选择该坐标系,用已知的另一个点检查读数和方向。
  5. 用小幅、空载的受控运动验证,再进入实际加工。

本讲义的数字测量例仅解释偏置计算,不构成真实机床的探测轨迹。设备现场必须遵循该机床和控制系统的操作流程。

找零点不是把三个显示框都随意清零,而是建立可验证的几何关系。
原创讲解;以本讲义所声明的双转台结构为限。17 / 72
第3章 · 方向测量

15 一个原点不能确定三维方向

平面内示意:O给出位置,O→Pₓ确定+X,再用不共线点确定平面及+Y。
平面内示意:O给出位置,O→Pₓ确定+X,再用不共线点确定平面及+Y。

你把一个孔中心设为零,只确定了原点位置。围绕这个点,坐标架仍可以转动。要确定方向,还需要已知的边、面或更多测量点。

常见做法是让工件基准边与预定方向对齐,并用基准面确定法向。若需要软件方向补偿,应由控制器支持的工件坐标旋转或倾斜平面功能来表达,不能只修改X/Y/Z三个平移偏置。

原点回答“从哪里量”,方向回答“朝哪里量”;它们需要不同信息。
原创讲解;以本讲义所声明的双转台结构为限。18 / 72
第3章 · 初始方向与动态方向

16 装夹方向和转台姿态,要分开处理

假设工件在C=0时,长边已经相对基础X方向偏转了20°。这20°是装夹的初始方向关系;后来C又旋转30°,属于机床当前姿态。两者来源不同,但都影响最终空间方向。

量何时确定通常何时变化
初始工件方向R₀装夹/找正/CAM配准时。重新装夹或修改坐标设置时。
转台角度A/B、C回零基准与每条运动指令。程序或Jog执行过程中。
几何中心P、偏置D机床结构测量和标定时。结构调整或重新标定时。

LinuxCNC可用特定工件坐标设置表达XY平面内旋转,例如G10 L2的R参数;它不是一个任意三维倾斜平面描述。摆头/转台结构、倾斜平面和TCP功能的组合仍要按具体控制器核对。

没有声明初始装夹方向时,不能擅自认为工件边一定平行于机床导轨。
[S4] G10 L2;项目实验边界见后文。19 / 72
第3章 · 原点和方向合起来

17 一个点怎样从工件坐标换算到机床空间?

先不看公式。把工件原点在机床空间的位置标出来;再把工件+X、+Y、+Z三个方向换算到机床空间。最后,沿这些方向分别走程序给定的距离。

空间目标 = 当前工件原点 + X·工件X方向 + Y·工件Y方向 + Z·工件Z方向

用数学记号写为 r_M = O_M + E_MW·p_W。O_M是工件原点在机床中的位置,E_MW的三列是工件三个单位方向在机床中的分量。矩阵只是把“三个方向加权相加”缩写起来。

转台改变姿态时,O_M和E_MW一般都变化;工件点p_W可以保持。
转台改变姿态时,O_M和E_MW一般都变化;工件点p_W可以保持。
固定姿态时可以只变换增量;姿态在变时必须处理完整的点变换。
原创讲解;以本讲义所声明的双转台结构为限。20 / 72
第4章 · G54与偏置

18 G54究竟做了什么?

G54选择第一套工件坐标设置。LinuxCNC中还有G55、G56、G57、G58、G59、G59.1、G59.2、G59.3,合计九套。你可以给不同工件、不同装夹或不同夹具保存不同偏置。

选择指令G10中的P编号本页教学含义
G54P1第一套坐标设置
G55P2第二套坐标设置
G56…G59P3…P6第三至第六套
G59.1…G59.3P7…P9第七至第九套

G54具有模态性:选中后,后续适用的运动指令继续使用它,直到选了同组的另一个坐标系。单独执行G54没有轴目标时,不会自动让刀具移动到工件零点。

选择参考,不等于走到参考原点。
[S2][S4] 坐标选择;实测G54/G55见gcode-evidence.json。21 / 72
第4章 · 偏置的物理含义

19 G54的40、20、10代表什么?

本课统一例子:在零角度、零几何偏置且方向对齐的教学模型里,设工件原点相对于K参考为o=(40,20,10)mm。意思是先沿K的X方向40、Y方向20、Z方向10,才到工件原点。

G21 G90
+G10 L2 P1 X40 Y20 Z10
+G54

当程序要求工件点X10 Y0 Z5时,解释器得到K输入(50,20,15)。到这一步还没有完成五轴运动学计算;随后还要依据B/C或A/C及几何参数得到关节目标。

同一例子继续取C=90°,RTCP最终关节XYZ为(−20,50,15)。
同一例子继续取C=90°,RTCP最终关节XYZ为(−20,50,15)。

因此,G54偏置中的40不能理解成“无论转台怎么转,工件原点都固定在机床X=40”。它是零位配准数据,动态空间位置由RTCP继续换算。

工件偏置先进入编程坐标解释,转台姿态随后进入运动学。
本项目WASM解释器与运动学实测;o=(40,20,10)、P=D=L=0。22 / 72
第4章 · 设置方法一

20 G10 L2:把已知偏置写入坐标表

G21
+G10 L2 P1 X40 Y20 Z10
地址字本行含义
G10设置某类数据,具体对象由L等参数决定。
L2本例为直接设置工件坐标偏置。
P1第一套工件坐标设置,即G54。
X40 Y20 Z10在本课约定下,直接写入三项长度偏置。
G21当前长度单位是mm;不要把单位上下文省略。

G10 L2适合“已经知道偏置是多少”的情况。它不是“把当前位置显示成某个值”的自动计算命令。若误把L20的用法套在L2上,偏置会被设置到完全不同的值。

这条指令设置参考数据,不是命令XYZ运动到(40,20,10)。
[S4];同程序实际执行未产生运动段。23 / 72
第4章 · 设置方法二

21 G10 L20:让当前位置具有指定工件坐标

假设刀尖已处在本课K位置(70,30,20),你确认它就是工件原点。想让此时工件读数变为(0,0,0),控制器需要把G54偏置设置为(70,30,20)。

G10 L20 P1 X0 Y0 Z0
偏置 o = 当前位置 p_K − 希望此刻显示的工件坐标 p_W

若当前位置仍为(70,30,20),但希望此点显示为工件X10 Y0 Z0,则偏置变成(60,30,20)。改变的是坐标设置,不是机床执行轴的位置。

动作K中的XG54工件X
刀尖保持当前位置70取决于原偏置
L20 P1 X0700
之后G54 G90 G1 X108010
L2写“偏置是多少”;L20给“当前位置应读成多少”,由控制器算偏置。
[S4];零旋转实测L20偏置与后续X10运动。24 / 72
第4章 · 两个坐标系

22 换G54/G55为什么可能只改数字、不动机床?

给G54设置o₁=(40,20,10),给G55设置o₂=(80,−10,10)。刀尖已在K=(50,20,15)。选择不同坐标系时,同一位置会产生不同局部读数。

状态关节/刀尖是否立即移动读数或下一步目标
当前G54否W₁=(10,0,5)
单独选择G55否W₂=(−30,30,5)
再执行G90 G1 X10是K的X变为90;未写的Y/Z保持原位置

同一个X10在G54和G55中指向不同目的地。若程序意图是加工两个不同装夹位置的相同零件,这正是需要的行为;若是无意中选错坐标系,就会整段偏移。

下方数值使用方向对齐的参考K来展示偏置。转台已倾斜时,物理空间关系还要经过RTCP变换。

换尺子可以只改变读数;按新尺子再给目标,才可能让机床运动。
[S2][S4];G54/G55选择及省略轴实测。25 / 72
第4章 · 附加偏置与基础坐标

23 G52、G92、G53:先学会不混用

指令/功能通用理解初学者要点
G52在已有工件参考下使用局部偏置。不是自动测得新的装夹原点。
G92通过坐标重新定义产生附加偏置。可能与持久化设置有关,不能假设程序结束就完全清掉。
G53本段使用控制器定义的机床坐标方式。非模态;不等同于HOME,也不保证直接控制电机关节。

多层偏置叠加后,程序点到基础参考的换算不再只有一个G54。排错时必须查看当前有效的所有层,不能只盯着G54表里的三个数字。

尤其在非平凡运动学机床上,控制器的“机床坐标”仍可能是运动学输入空间。G53不意味着跳过所有运动学,G53 Z0也不能被当作通用安全退刀动作。

只在理解所有有效偏置后再组合使用;初学实验先保持参考层次简单。
[S2][S4];对G53关节语义需按具体运动学核对。26 / 72
第5章 · 非RTCP与RTCP

24 非RTCP:“独立”的准确含义

对于本课直接映射模式,经过单位/偏置解释后,X/Y/Z对应直线关节,A/C或B/C对应旋转关节。只命令C转动,不会自动追加保持刀尖相对工件点的XYZ补偿。

只转C:工件标记点被带走,刀尖留在机床原位置。
只转C:工件标记点被带走,刀尖留在机床原位置。

这不表示各轴不能同时运动。例如一行同时给X、Y、B、C目标,控制器仍可协调插补。也不表示零件与刀具之间“完全没有关联”:物理工件转了,二者的相对位置当然会变。

独立是“没有自动的姿态几何补偿”,不是“没有同步插补或相对运动”。
原创讲解;以本讲义所声明的双转台结构为限。27 / 72
第5章 · 非RTCP与RTCP

25 RTCP控制的是相对目标关系

RTCP可理解为旋转姿态变化时的刀尖位置补偿。给定目标工件点以及A/B、C角度,控制器结合机床几何计算所需关节位置,让刀尖实现规定的相对工件轨迹。

保持同一工件点,角度改变时XYZ按需跟随。图为零偏置简化模型。
保持同一工件点,角度改变时XYZ按需跟随。图为零偏置简化模型。

“刀尖保持”有两种不同说法:保持在机床空间同一点;保持相对工件的同一点。本课RTCP讲的是后者。工件转动时,该点在机床空间可能沿弧线移动,所以刀尖也需要移动。

RTCP不要求刀尖在世界里绝对不动,而要求它满足指定的相对工件关系。
[S1] 五轴运动学;本项目原生AC/BC正逆解。28 / 72
第5章 · RTCP工件原点

26 用G54例子看“原点随动”

现在使用贯穿后续章节的例子:BC结构,B=0;几何中心P=0、偏置D=0、刀长差L=0;G54零位偏置o=(40,20,10)。程序目标始终为W=(10,0,5)。

C角度工件原点的机床位置O_M刀尖目标/关节XYZ程序W
0°(40,20,10)(50,20,15)(10,0,5)
90°(−20,40,10)(−20,50,15)(10,0,5)
两种姿态下,刀尖相对工件原点的局部分量始终相同。
两种姿态下,刀尖相对工件原点的局部分量始终相同。

注意:G54表仍是40、20、10,没有每次改写成−20、40、10。后一个值是由当前姿态算出来的空间位置,不是要求操作者实时改G54。

固定的是工件内的定义与零位配准数据,变化的是它们在机床空间的表达。
本课WASM逐字解析和逆解核验;详细行表见第7章。29 / 72
第5章 · RTCP方向

27 沿工件X前进,哪些电机会动?

在C=45°、倾转角为0°时,工件+X方向斜着指向机床+X和+Y。沿工件X增加10mm,必须由两根固定导轨合成:机床X约增加7.071mm,机床Y约增加7.071mm。

绿色方向随工件,蓝色机床导轨方向不转。
绿色方向随工件,蓝色机床导轨方向不转。
姿态固定:Δq_X = 10 cos45°;Δq_Y = 10 sin45°

XYZ导轨并没有在机械上旋转。变的是工件方向在机床中的表达。编程沿一根工件轴走,实际可以由两根或三根直线关节一起完成。

一个X字,不一定只驱动X电机;先问它属于哪套参考系。
原创讲解;以本讲义所声明的双转台结构为限。30 / 72
第5章 · 倾转与结构顺序

28 加入B或A后,方向可以进入三个维度

BC结构中,B倾转带着C轴一起倾斜。采用本项目约定,零偏置变换为R=R_Y(B)R_Z(C)。当B=30°、C=45°时,工件+X的机床方向分量约为(0.6124,0.7071,−0.3536)。

保持B=30°、C=45°时,沿工件X前进10mm,会同时改变三个直线轴。
保持B=30°、C=45°时,沿工件X前进10mm,会同时改变三个直线轴。
Δq ≈ (6.124, 7.071, −3.536) mm

AC则使用R_X(A)R_Z(C)。同样写30°、45°,AC与BC的刀尖空间位置一般不同。矩阵从右向左作用,表达父子结构的坐标转换顺序,并不是要求先完成C动作再单独执行A/B。

这里的正方向采用本项目原生计算约定;实际机械正转、工件视角和摄像机视角可能使视觉直觉相反,必须用正确标定核对。

RTCP用的是完整机构链,不能只把A字母改成B就期待相同空间姿态。
原创讲解;以本讲义所声明的双转台结构为限。31 / 72
第5章 · 三类偏置

29 G54、旋转中心、轴间偏置各管什么?

参数属于什么关系不能拿来替代
G54偏置o零件编程原点与基础参考K的配准。不是转台的物理轴心标定。
rot-point P本项目原生TRT的旋转参考位置。不是每次装夹都应随便改的零件零点。
axis offset D倾转轴与C轴之间的结构偏置。不是普通工件坐标平移。
tool-offset L刀具参考与受控点的标定量。不是看到网格长度后直接填的任意长度。

这些量都可能以mm显示,但含义和进入公式的位置不同。如果刀尖偏差源于转台中心错误,单靠修改G54可能只在某个角度碰巧对齐,换一个姿态就再次偏离。

起点相同、角度相同,绕不同中心会产生不同目标位置。
起点相同、角度相同,绕不同中心会产生不同目标位置。
看到“偏移多少毫米”时,还必须问:是哪个参考系之间的偏移?
原创讲解;以本讲义所声明的双转台结构为限。32 / 72
第5章 · 刀具参考

30 为什么必须知道刀尖究竟在哪里?

电机驱动的通常是滑台和主轴箱,程序关注的却是刀尖。主轴参考点与刀尖之间相隔一段刀具长度。如果更换刀具后长度不同,保持同一主轴位置并不能保持同一刀尖位置。

相同刀尖目标:刀更长时,主轴参考位置需要按正确约定调整。
相同刀尖目标:刀更长时,主轴参考位置需要按正确约定调整。

在LinuxCNC的完整刀补语义中,G43 H3表示使用指定刀具长度偏置条目;H3不是“刀长等于3mm”。T表示工具选择,M6表示换刀流程,S表示主轴速度,也不能与刀长混用。

RTCP、刀长补偿、倾斜工作平面是相互配合的功能,不是一个开关的三个名字。

先标定刀具参考点,再讨论刀尖目标;网格看起来像刀具,并不代表它已正确标定。
[S4] G43;本项目sim_interpreter.c的能力范围与本课测试边界。33 / 72
第6章 · 读懂G代码

31 一行G代码由“地址字”组成

N50 G1 X10 Y0 Z5 B0 C0 F600

一个地址字通常由字母和数值组成,例如X10。字母说明这个数属于什么类别;当前G/M代码和模态状态进一步决定它的具体作用。空格用于阅读,不是每个空格后就执行一次运动。

字本行解释
N50程序段编号,便于识别,不是运动距离。
G1按进给方式生成直线类型的运动段。
X10 Y0 Z5在当前绝对/增量和坐标设置下给出XYZ。
B0 C0给出旋转轴角度目标;本课为BC结构。
F600设置进给值,含义受进给模式和单位影响。

控制器应先读完整个程序段,检查语法与模态组,再求出整体目标。不能把它理解成先走X10、走完再走Y0、再走Z5、再转B和C。

本课旋转轴的工件偏置为零,所以B/C字直接成为相应关节角度目标;若启用了角度偏置,也要先换算,不能只看字面角度。

地址字是数据;程序段和当前模式共同决定数据的含义。
[S5] G-code Overview;N50为项目实测程序段。34 / 72
第6章 · 模态状态

32 没有写出来的内容,可能沿用上一行

模态可以理解为控制器记住的当前设置。G1、G90/G91、G20/G21、G54等在不同模态组中生效。后续行省略这些字时,常会沿用之前的设置。

G21 G90 G54 G1 X10 Y0 Z5 F600
+C90
+G91 X10
+G90 X20

第二行只有C90,但它仍处于G1、G90、G21、G54环境,F仍为600。第三行把距离模式切换成G91,X10变成增量。第四行恢复G90,X20又变成绝对目标。

省略什么通常怎样理解
省略G1沿用有效运动模式;不是自动停止解析。
省略F在允许沿用的进给模式下保留原值;G93另有要求。
省略XYZ某一轴通常保持该坐标分量的当前目标,不自动归零。
省略角度字保持当前角度目标,不自动回零角度。
读一行程序时,要带着“当前状态表”一起读。
[S4][S5] 模态与程序段;本文只涵盖常用运动模式。35 / 72
第6章 · 单位

33 G20/G21改变长度单位,不把角度变成长度

数值类别G21示例G20示例
X/Y/Z长度X1为1mmX1为1inch=25.4mm
A/B/C角度本课以度计仍按控制器旋转角约定,不把1°换成25.4°
G94直线进给FF600通常为600mm/minF2通常为2inch/min=50.8mm/min
G93的F逆时间,见进给专页不是长度值,不能机械乘25.4

本课WASM已实测:G20 G91 X1产生25.4mm的直线增量,G94下F2换算为50.8mm/min。然后换回G21时,后续长度又按mm解释。

变量、刀表、测量结果以及URDF还可能使用各自定义的单位。教学数据进入某一接口前应先统一,不要因为屏幕只显示一个数字就忽略单位。

长度、角度、转速、时间、索引号是不同量纲;不能用一个换算规则处理所有数字。
[S4] G20/G21/G93/G94;长度/直线进给转换已实测。36 / 72
第6章 · 绝对目标

34 G90 X10:去当前编程系的X=10

在G90中,X10通常表示当前有效编程参考系中的绝对目标X值为10。它不是“再走10”,也不是“无论有什么偏置,电机都去10”。

本课条件:G54的o=(40,20,10),方向对齐,B=0、C=90°,RTCP开启,当前目标W=(20,0,5)。执行G90 G1 X10,新的W目标变为(10,0,5)。

计算层新目标
工件坐标W(10,0,5)
加G54得到K(50,20,15)
C=90°后关节XYZ(−20,50,15)

原来W=(20,0,5)对应关节(−20,60,15),所以这一动作让机床Y减少10mm。虽然程序只写X10,实际发生变化的是本例的Y关节。

“绝对”必须说明是相对于哪套当前有效参考,而不是自动等于机床电机绝对位置。
原创讲解;以本讲义所声明的双转台结构为限。37 / 72
第6章 · 相对增量

35 G91 X10:在当前编程方向增加10

仍用G54 o=(40,20,10)、B=0、C=90°、RTCP开启。当前位置W=(10,0,5)。执行G91 G1 X10后,W变为(20,0,5),K从(50,20,15)变为(60,20,15)。

新目标W = 旧目标W + (10,0,0)

角度保持C=90°,因此该增量在机床空间沿+Y方向,关节从(−20,50,15)变为(−20,60,15)。偏置不应被重复加两次。

G91 G1 X10
+G90

如果同一段还有B10或C20,它们在G91下通常也表示角度增量。控制器先形成新的整体坐标/角度目标,再插补并求解;不能把变化的姿态当成整段保持不变,只旋转一次XYZ增量就结束。

旋转轴还可能有展开角度或回绕设置。C=0与360的空间方向可以相同,但关节位置、行程和运动路径未必相同;本课不假设控制器自动选择最短转动路径。

G91改变目标的形成方式,不取消工件方向和RTCP计算。
原创讲解;以本讲义所声明的双转台结构为限。38 / 72
第6章 · 运动方式

36 G0/G1分别如何产生运动?

G0用于快速定位类运动,G1用于按进给规则执行直线类型运动。给出的通常是该段目标,而不是每个伺服时刻的位置。控制器的规划器决定加减速、插补进度及与相邻段的衔接。

层次G1 XYZBC在本课中的处理
编程空间定义XYZ与角度的起点/终点以及运动类型。
插补逐步得到中间位置和中间角度。
运动学每个采样按该时刻姿态和结构求解关节。
执行输出连续的关节位置/速度,并检查限制。

G1说的“直线”属于控制器定义的编程空间运动,不意味着所有机械部件在世界中都走一条直线。保持同一工件点、转动C时,刀尖可以在机床空间走弧线。

G0的具体协调方式、G64圆滑和G61精确路径等规则因控制系统而定。初学者不应把快速定位当作任何场景下的安全路径。

程序给段目标,规划器给连续过程,运动学给各轴实现方式。
[S4] G0/G1;项目规划器与运动学实测。39 / 72
第6章 · 圆弧地址

37 G2/G3里的I、J、K不是三根新电机轴

G17通常选XY圆弧平面;G18、G19选择其他主要平面。G2/G3给出圆弧方向,圆心可以由I/J/K等地址表达。圆心方式有独立的绝对/增量规则,不能仅看G90/G91就猜圆心如何解释。

(教学条件:G17,圆心增量方式)
+(起点 X10 Y0,圆心 X0 Y0)
+G3 X0 Y10 I-10 J0 F300
圆心增量从圆弧起点量:I=-10、J=0;不是从工件原点量两个绝对坐标。
圆心增量从圆弧起点量:I=-10、J=0;不是从工件原点量两个绝对坐标。

本例圆心增量等于“圆心−起点”。R有时也可表示圆弧半径,但它在其他指令中又可能表示不同参数。姿态固定时,工件平面中的圆弧映射到机床中的相应倾斜平面。

同一个字母的含义由当前指令规定;I/J/K经常是圆心参数,不是位置轴。
[S4] G2/G3、G17–G19、G90.1/G91.1。40 / 72
第6章 · 进给

38 F到底是速度、时间,还是每转进给?

模式F的基本含义例子
G94每分钟进给;线性、纯旋转或混合段需按控制器规则。直线段F600mm/min≈10mm/s。
G93逆时间进给,F的单位为1/min。F2对应理想段时间1/2分钟=30秒。
G95每主轴转一圈的进给量。F0.1mm/rev,配合实际主轴转速。

RTCP下,仅仅保持编程XYZ、改变角度,也可能引发XYZ关节移动。F不等于“每根电机都以这个数值运动”。各关节速度是插补过程和运动学变化共同作用的结果。

LinuxCNC对G94纯旋转段和含直线分量的运动有具体规则;G93可用于表达段时间,但仍受速度、加速度等限制。G93下G1/G2/G3通常每段需要F,不能直接照搬G94省略F的习惯。

当前Web切片的全部进给模式并非本课程验收对象;主算例采用G94,额外模式依据官方语义讲解。

看到F,先查进给模式;判断轴运动,还要查规划器和机器约束。
[S3][S4] G93/G94/G95。41 / 72
第6章 · 其他常见字

39 不是每个数字都代表位置

字/指令常见含义容易误解的地方
S12000主轴转速请求。不是刀具线速度或XYZ距离。
T3 / M6选择工具号 / 执行换刀流程。不等于自动设定工件原点。
G43 H3使用指定刀长偏置条目。H3不是刀长3mm。
D常见为刀具半径补偿索引。不是通用“深度”字。
G10 L2 P1L指定设置类别,P选目标坐标表。P1不是转台转1°。
G4 P…停留参数,按控制器定义。同一P在G10里却是编号。
R / Q圆弧/循环/设置中的上下文参数。不能固定解释为半径或角度。
M3/M5/M8等主轴/冷却等辅助动作。不是每个M码都有跨品牌同义。

本项目M428/M429是重映射到运动学切换和同步的命令。其他控制器可能采用完全不同的代码组合;把本项目的编号直接复制到真实机床上没有通用性。

字母相同不保证意义相同;上下文比数字本身更重要。
[S4][S5];M428/M429为本地INI重映射。42 / 72
第6章 · 从文本到运动

40 控制器不是从左到右逐个字移动

  1. 读取程序段:识别注释、地址字、数值和参数表达式。
  2. 检查语法与模式:单位、距离方式、坐标系、运动类型是否有效且无冲突。
  3. 形成整体目标:G90写绝对值,G91加增量;处理省略轴和当前状态。
  4. 应用坐标设置:工件偏置、允许的坐标旋转/补偿,得到规范输入。
  5. 规划轨迹:速度、加速度、路径衔接和同步屏障。
  6. 逐采样计算运动学:根据该时刻位置、角度、中心/偏置/刀具数据求关节。
  7. 执行与反馈:伺服驱动/仿真推进;界面再显示实际状态与轨迹。

同一行中的X和B是一个联合目标,不是先走X再转B。控制系统有规定的执行顺序与模态语义;文本排列不能代替这些规则。变量和表达式也先按解释器规则求值,再成为数值输入。

每一层都应有可观察的输出,不能把程序文本直接当成模型关节值。
[S5] 程序段规则;本项目解释器→TP→WASM→模型链路。43 / 72
第7章 · 完整实算程序

41 统一实验条件与完整程序

以下每一行都用相同数据核验:BC双转台;旋转中心P=0、轴间偏置D=0、刀长差L=0;工件方向与零位K对齐;G54偏置o=(40,20,10)mm;初始物理关节均为0。

N10 G21 G90 G94 G17
+N20 G10 L2 P1 X40 Y20 Z10
+N30 G54
+N40 M428
+N50 G1 X10 Y0 Z5 B0 C0 F600
+N60 C90
+N70 G91 X10
+N80 G90 X20 Y0 Z5 B30 C90 F300
+N90 X0 Y10
+N100 M429
+N110 M428
+M2

N10–N90加M2已通过真实项目解释器、LinuxCNC TP和WASM运动学完整执行;N100/N110另用保持物理关节的切换接口逐段验证。每条运动的关键终点都与解析+逆解结果对照。

本章的数字是固定条件下的可复算例子;改变条件,结果也会改变。
gcode-evidence.json:rtcp-beginners-gcode-v1;完整程序状态completed。44 / 72
第7章 · 第一步

42 N10–N30:设置模式与工件参考

N10 G21 G90 G94 G17
+N20 G10 L2 P1 X40 Y20 Z10
+N30 G54
程序段改变什么是否生成运动
N10单位mm、绝对方式、每分钟进给、XY平面。没有目标轴,不运动。
N20把G54偏置设为(40,20,10)。设置数据,不运动。
N30选择G54为有效坐标系。单独选择,不运动。

初始物理关节仍是0。G54偏置设定后,原来的空间位置在这套编程坐标中可显示为(−40,−20,−10)。不是刀具突然往负方向跑了,而是这套尺子的原点不在刀具当前位置。

N10的G17目前只是声明圆弧平面。本程序只有直线类型段,不会因为写了G17就产生一段圆弧。

程序准备阶段可能只改解释状态,还没有开始移动。
原创讲解;以本讲义所声明的双转台结构为限。45 / 72
第7章 · 第二步

43 N40 M428:先切模式,不凭空移动

N40 M428

本项目中,M428选择RTCP运动学并同步解释器与运动状态。切换时要先读取当前物理关节,再用新模式正解出对应的坐标。它不是“保持旧XYZ数字,再反算出一组新的关节”。

在本章初始姿态下,关节为0、角度为0、几何偏置为0。Identity和RTCP在这个姿态碰巧给出相同的基础位置K=(0,0,0),因此G54相对读数仍为(−40,−20,−10)。

量N40之后
关节XYZ/B/C全部保持0。
基础输入/同步坐标K(0,0,0)。
G54相对XYZ(−40,−20,−10)。
运动学模式从Identity改为本项目TCP。
模式切换准备新的坐标解释;有明确运动段时才产生后续轨迹。
原创讲解;以本讲义所声明的双转台结构为限。46 / 72
第7章 · 第三步

44 N50:把第一个工件点送到刀尖

N50 G1 X10 Y0 Z5 B0 C0 F600
  1. G90生效:新的工件XYZ目标为(10,0,5),不是在旧位置上增加。
  2. B0/C0给出零角度;F600更新G94进给请求。
  3. 加G54偏置:(10,0,5)+(40,20,10)=(50,20,15)。
  4. 旋转角度为零、几何P/D/L均为零,逆解XYZ与K相同。
  5. 关节目标得到(50,20,15,0°,0°),随后由规划器从当前位置插补到此。
层次数值
程序工件点W(10,0,5)mm
运动学输入K(50,20,15)mm
XYZ关节目标(50,20,15)mm
B/C关节目标0° / 0°
先算工件参考里的目标,再算偏置和运动学,不跳过中间层。
原创讲解;以本讲义所声明的双转台结构为限。47 / 72
第7章 · 第四步

45 N60 C90:XYZ字没出现,XYZ关节却动了

N60 C90

G1、G90、G21、G54、F600仍然有效。只更新C的绝对目标为90°,工件XYZ仍保持(10,0,5),B仍为0。运动学输入的XYZ继续为(50,20,15)。

q_X = 50cos90° − 20sin90° = −20
q_Y = 50sin90° + 20cos90° = 50
q_Z = 15
比较N50末端N60末端
工件XYZ(10,0,5)(10,0,5)
基础K的XYZ(50,20,15)(50,20,15)
关节XYZ(50,20,15)(−20,50,15)
B/C0° / 0°0° / 90°

工件原点本身也从(40,20,10)移动到(−20,40,10)。在新姿态下,再沿工件X走10、Z走5,就到刀尖目标(−20,50,15)。

程序量保持与关节量保持,是两个完全不同的约束。
原创讲解;以本讲义所声明的双转台结构为限。48 / 72
第7章 · 第五步

46 N70 G91 X10:沿转后的工件方向走

N70 G91 X10

这一行把距离模式改为增量。原工件点W=(10,0,5),现在沿工件+X增加10,得到W=(20,0,5)。B/C没有写,保持0°/90°。

步骤结果
形成工件终点(10,0,5)+(10,0,0)=(20,0,5)
转换到K(20,0,5)+(40,20,10)=(60,20,15)
C=90°的逆解关节XYZ=(−20,60,15)
相对上一步的关节变化Δq=(0,+10,0)mm

所以程序写了X10,机床Y关节却增加10mm。这不是轴接错,而是“工件+X”当前指向机床+Y。图形上刀尖沿转动后的工件方向移动。

N70之后G91仍有效。下一行如果继续写X20而不恢复G90,就又是增加20,而不是去X=20。

每次出现G90/G91,都应更新你的“当前模式表”。
原创讲解;以本讲义所声明的双转台结构为限。49 / 72
第7章 · 第六步

47 N80:工件点不变,B倾转带来X/Z补偿

N80 G90 X20 Y0 Z5 B30 C90 F300

先恢复G90,工件XYZ绝对目标仍为(20,0,5),与N70末端相同。C保持90°,B从0°变为30°,F改为300。K的XYZ保持(60,20,15)。

先按C=90°换算,得到(−20,60,15);再按B=30°绕Y方向倾转:

q_X = (−20)cos30° + 15sin30° ≈ −9.821
q_Y = 60
q_Z = −(−20)sin30° + 15cos30° ≈ 22.990

此时工件原点的空间位置约为(−12.321,40,18.660)。工件X方向当前沿机床+Y;工件Z方向则含机床X和Z两个分量。把W=(20,0,5)按这些方向加到原点上,也得到同一个关节XYZ。

倾转只改变B字,也可能要求直线轴联动;这正是补偿的任务。
原创讲解;以本讲义所声明的双转台结构为限。50 / 72
第7章 · 第七步

48 N90:省略的Z、B、C保持当前目标

N90 X0 Y10

因为N80恢复了G90,这里的X0/Y10是工件绝对目标,而不是增量。Z没有写,保持5;B保持30°,C保持90°;G1、G54、G21、F300继续有效。

量新的目标
完整工件XYZ(0,10,5)
完整角度B/C30° / 90°
K的XYZ(40,30,15)
C旋转后的中间点(−30,40,15)
B倾转后的XYZ关节(−18.481,40,27.990)

完整程序在这一段后执行M2。真实WASM规划器跑到程序完成时,关节终点与上述逐字解析、逆解计算一致;不是只在纸上进行了三角函数演算。

程序短,不代表有效状态少;把沿用状态补全后再计算。
gcode-evidence.json:最终joint=(-18.480762,40,27.990381,30,90)。51 / 72
第7章 · 全过程汇总

49 把五组数字同时放在一张表里

段号工件XYZK输入XYZB/C(°)关节XYZ
N50(10.000, 0.000, 5.000)(50.000, 20.000, 15.000)0 / 0(50.000, 20.000, 15.000)
N60(10.000, 0.000, 5.000)(50.000, 20.000, 15.000)0 / 90(-20.000, 50.000, 15.000)
N70(20.000, 0.000, 5.000)(60.000, 20.000, 15.000)0 / 90(-20.000, 60.000, 15.000)
N80(20.000, 0.000, 5.000)(60.000, 20.000, 15.000)30 / 90(-9.821, 60.000, 22.990)
N90(0.000, 10.000, 5.000)(40.000, 30.000, 15.000)30 / 90(-18.481, 40.000, 27.990)

比较N50与N60:工件XYZ和K的XYZ都不变,关节随C改变。比较N60与N70:在C=90°时沿工件X增加10,反映为机床Y增加10。比较N70与N80:工件点相同,只倾转B,X/Z关节补偿。

N60整段C从0到90°:图中是XYZ关节变化,不是程序工件XYZ变化。
N60整段C从0到90°:图中是XYZ关节变化,不是程序工件XYZ变化。

图中的横轴是C角度,不是时间。实际时间还受进给、加减速和机床约束影响,不能用图上每一度的等距刻度推断匀速运行。

一张正确的记录表,应区分程序坐标、运动学输入、角度和物理关节。
原创讲解;以本讲义所声明的双转台结构为限。52 / 72
第7章 · 再切回直接模式

50 N100/N110:同一刀尖位置,坐标解释改变

N100 M429
+N110 M428

N90末端关节固定为(−18.481,40,27.990,30°,90°)。M429把解释切到Identity,不能因此让这些关节无目标地跳动。新模式下基础XYZ与直线关节直接对应。

量M429后再M428后
物理XYZ关节(−18.481,40,27.990)保持相同
基础K的XYZ(−18.481,40,27.990)(40,30,15)
当前G54相对XYZ显示(−58.481,20,17.990)(0,10,5)
实际刀尖位置不动不动

在Identity下,当前软件坐标不再通过RTCP映射到转动后的零件局部坐标架。因此该模式的相对XYZ读数不能继续当作刚才物理工件架W中的同一点坐标来解释。

切换时固定关节、重新解释坐标;不要为了保持旧XYZ数字而挪动机床。
WASM selectPhysical与解释器同步逐段实测。53 / 72
第8章 · 中间轨迹

51 RTCP要在运动过程中持续计算

图为半径100mm的零偏置例:两种方法终点相同,中途却相差29.289mm。
图为半径100mm的零偏置例:两种方法终点相同,中途却相差29.289mm。

假设工件点绕C轴转90°。正确跟随时,刀尖走该点在机床空间里的圆弧。若只求首末关节位置,然后不顾几何地把X/Y用直线连接,可能走成弦线。

所以控制器不能只在段末才补偿。它需要在连续采样中使用当前插补出的XYZ和角度,得到相应关节值。各关节的变化不一定是线性的,也不必在每个时刻都非零。

只看“最后有没有对上”不足以检验RTCP。
原创讲解;以本讲义所声明的双转台结构为限。54 / 72
第8章 · 姿态与刀轴

52 RTCP不自动决定刀轴该朝哪里

双转台中主轴在机床里可保持竖直,但相对于工件的刀轴方向会改变。
双转台中主轴在机床里可保持竖直,但相对于工件的刀轴方向会改变。

本课机床不摆动主轴头。A/B、C带动工件后,主轴方向相对于工件发生变化。程序或CAM负责给出希望的角度/姿态,RTCP负责按这些角度保持所需刀尖位置关系。

RTCP不会仅凭一个曲面网格就自动知道应当以什么刀轴角加工,也不会自动保证刀轴始终垂直曲面。后者还涉及刀位规划、刀具几何、工艺策略和碰撞检查。

给定条件仍需解决的问题
知道一个刀尖点刀轴方向可能有多种选择。
知道点和A/B、C还需用正确机床几何求关节。
关节在限位内还不能证明刀具/夹具/机床无碰撞。

工件坐标方向、刀具方向、表面法向是三个概念。某些工艺要求它们满足特定关系,但它们不会天然全部重合。

RTCP执行指定的几何关系,不能替代CAM工艺与碰撞规划。
原创讲解;以本讲义所声明的双转台结构为限。55 / 72
第8章 · 三维显示

53 预览画面中的三个对象要分开看

显示对象代表什么常见误判
机床网格结构外形及由关节驱动的部件位姿。把网格缩放误当成运动学标定。
工件/程序路径表达程序几何,通常附着在工件分支。把摄像机转动当作工件坐标改变。
刀尖/实时轨迹显示当前采样的受控点或路径。只看路径颜色,不核对实际关节/参考系。

正确结构中,X/Y/Z移动刀具侧,A/B→C移动工件侧。路径必须与其定义的参考系一致。如果C错误地挂到Z下面,XYZ就会把工件也带走;再正确的RTCP数字也无法弥补错误的显示树。

导入GLB后修改中心/偏置,应保留模型并同步有效URDF与WASM。参数改变可以使部件相对位置改变,但不应该悄悄替换成另一台内置机床。

外观网格中的铸件、支架形状不一定随参数自动重建,模型校正也不等于通过了真实碰撞/刚度/制造尺寸验收。

验证要同时看程序参考、关节数据和场景层级,不能只凭视觉效果。
原创讲解;以本讲义所声明的双转台结构为限。56 / 72
第8章 · 参数准备

54 准备数据时,按三层顺序核对

第一层:机床自身

确认结构是AC还是BC、每个节点的父级、各轴正方向、回零基准、倾转中心与轴间偏置。轴向或结构类型错误时,先修复模型/配置,不用G54去“抵消”它。

第二层:刀具与受控点

确认主轴参考点、刀尖节点、刀长定义和补偿状态。把换刀之后的受控点映射建立正确,再判断实际加工位置。

第三层:零件装夹与编程

确认CAD/CAM原点、工件方向、G54等偏置、当前单位、绝对/增量方式和进给模式。用多个已知点、多个姿态核对,避免只在零角度看起来对。

检查方法能发现的问题
零角度检查已知点基本零点/长度/单位错误。
小角度分别转A/B和C轴向、正负号、父子顺序问题。
不同角度反复定位同一点旋转中心、偏置与刀尖标定问题。
重复换模式但不发运动坐标同步错误导致的无故跳变。
先机床,再刀具,最后工件;分层定位错误比同时改所有参数可靠。
原创讲解;以本讲义所声明的双转台结构为限。57 / 72
第9章 · 课堂实验

55 实验一:观察“转动后的坐标方向”

  1. 进入仿真,关机且空闲时导入AC或BC桁架示例,查看当前几何参数。
  2. 完成开机和回零,在Identity下把刀尖放到离C轴线有一定距离的位置,避免特殊点导致XYZ补偿不明显。
  3. 停止运动,选择M428。记录关节与物理刀尖没有瞬移,同时记录当前XYZ显示可能变化。
  4. 旋转C一个小角度并停止。保持当前姿态,再做一个小的编程X增量,观察实际哪几根直线关节变化。
  5. 比较工件方向与机床导轨方向:导轨没转,XYZ合成了工件方向。
  6. 先停止,再切回M429,重复小幅直接轴Jog作为对照。

项目默认示例有非零中心/偏置,所以不要拿本章零偏置算例的目标关节值逐项硬比。对默认机床,正确比较的是“同一配置下的运动学与模型是否一致”。

实验目标是理解参考系关系,不是让学生背住某一组关节数字。
原创讲解;以本讲义所声明的双转台结构为限。58 / 72
第9章 · 课堂实验

56 实验二:G54与G90/G91的逐行记录

本实验适合教师准备的专用仿真配置:零中心、零轴间偏置、零刀长差,BC结构,回零后从已知状态开始。不得直接在真实机床套用。

  1. 设置G21/G90/G94,写入G54偏置(40,20,10),选择G54。
  2. 执行M428,记录此时关节不变。
  3. 执行N50到N90,每段等待运动结束,再记录工件坐标、K输入、关节。
  4. 把结果与第49节表格对照,重点检查N60和N70。
  5. 尝试只选择G55,不发轴字;观察读数变化但关节保持。
  6. 恢复已知模式与偏置后再重复,检查结果是否一致。
测试点应该看到
只选择/设置参考没有自动的定位运动。
N60 C90程序XYZ保持,关节XYZ变化。
N70 G91 X10W的X加10;本例关节Y加10。
N80恢复G90X20是绝对目标,不能再加20。

本讲义提供完整验证数据而非截图推测。如果现场结果不同,先核对几何与模态条件,不要立刻断言某根轴接错。

逐行记录让隐含模态变成看得见的数据。
原创讲解;以本讲义所声明的双转台结构为限。59 / 72
第9章 · 课堂实验

57 实验三:原点移动,程序几何不改

目标:理解同一段零件程序如何适应不同装夹位置。先保持角度固定,避免初学者同时处理太多变量;再在RTCP下加入姿态对照。

  1. 为G54设置第一套零位偏置,为G55设置第二套偏置,保持初始方向相同。
  2. 选G54运行一条很短、经过检查的定位段,记录目标。
  3. 只选G55,不发运动字,确认执行轴不会自动移动。
  4. 再给同样的工件XYZ目标,观察物理目标随配准变化。
  5. 停止后在适当角度下重复;说明原点和方向怎样一起进入RTCP。

若工件不仅平移,还在夹具上旋转,需要另外确定初始方向。仅改变G54的XYZ平移不会自动把一条斜边校正成你期望的+X方向。

作业:让学生画出两套工件原点和同一局部点,先预测实际目标变化,再用仿真核对。解释预测为何成立比得到一次正确数字更重要。

工件坐标把零件几何与装夹位置分开,但方向配准仍不可省略。
原创讲解;以本讲义所声明的双转台结构为限。60 / 72
第9章 · 排错

58 位置不对时,从哪一层开始查?

现象优先检查不要马上做什么
全程序平移一块G54/G55、附加偏置、装夹原点。先别改所有转台参数。
距离约差25.4倍G20/G21和数据单位。别靠缩放模型掩盖。
小动作不断累加G90/G91是否残留。别把每次误差当随机漂移。
零角度对,倾转就偏中心/偏置、刀长、正方向、结构链。别只在一个角度改G54。
只开RTCP却不跟点实际运动模式、目标参考、父子关系。别只看按钮颜色。
切模式机床瞬移是否固定关节并同步坐标。别冻结画面掩盖。
Connection ERROR首个Worker/协议/运动错误。别把后续sequence_gap当成唯一根因。

查看第一个失败原因通常比反复点击更有效。显示错误可能是运动计算错误的后果,也可能是模型投影错误;两类问题应通过关节数据与物理结构分别判断。

先找最早的因果点,不要只处理最后出现的提示。
原创讲解;以本讲义所声明的双转台结构为限。61 / 72
第9章 · 限位与边界

59 RTCP跟得上,还必须到得了

工件XYZ看起来没有变化,不等于机械关节没有运动。转台角度改变时,为保持同一工件点,某根XYZ直线关节可能需要大幅补偿,最终触及行程或速度限制。

约束检查对象
编程/坐标限位控制器定义的坐标允许范围。
关节限位各机械轴实际能够达到的范围。
速度/加速度每个执行轴的动态能力。
碰撞刀具、工件、夹具、转台和机床实体间的空间关系。

本项目曾出现BC坐标范围较大,但B关节上限只有50°的情况。连续Jog越过该物理约束后,运动计算失败,又触发事件时钟错误。现已区分限位阻止与连接故障,并允许停止后反向退出。

课堂先用小位移、小角度、低速度、空载模型理解概念;实际机床的操作与保护必须使用其正式流程。

RTCP正确解决几何映射,不自动取消行程、动力学和碰撞约束。
原创讲解;以本讲义所声明的双转台结构为限。62 / 72
第10章 · 常见问答

60 初学者最容易问错的八个问题

问题简明回答
工件坐标原点一定是转台中心吗?不是。零件原点由工艺选,转台中心是结构标定。
工件坐标的零点会变化吗?自身读数恒为0;在机床空间的位置可随角度变化。
只选G54能让刀尖跟着转台吗?不能。还需要正确结构、姿态与RTCP运动学。
写X10为什么Y轴动?X可能是工件方向,需由固定导轨合成。
没写XYZ为什么XYZ动?程序点保持,但转台姿态变化需要补偿。
RTCP时所有轴必须一直动吗?不必,取决于轨迹和当前几何。
H3就是3mm刀长吗?不是,完整LinuxCNC里H是刀补条目索引。
界面“Machine XYZ”就是J0–J2吗?不能默认;非线性运动学中需核对显示定义。

再遇到一个看似矛盾的说法,先问它说的是哪个参考系、哪个受控点和哪个控制模式。许多矛盾只是省略了这些条件。

补全条件后再下结论,是理解五轴的基本方法。
原创讲解;以本讲义所声明的双转台结构为限。63 / 72
第10章 · 练习

61 练习A:原点、模式和地址字

  1. 工件原点在零位K中为(40,20,10),方向对齐。W=(10,0,5)对应的K是多少?
  2. 当前位置W的X=10。分别执行G90 X20和G91 X20,各得到什么W终点?
  3. 单独执行G54会不会自动走到工件零点?若同一行是G54 G1 X0呢?
  4. 当前位置K=(70,30,20),希望此刻W=(5,0,0)。在无附加旋转/补偿的教学条件下,L20算出的偏置o是多少?
  5. T3、H3、S12000、F600分别属于哪种数据?哪些数字不能被直接当作毫米距离?
  6. 工件原点测对了,但长边相对机床X倾斜20°。只改G54的X/Y/Z平移,是否足以纠正方向?
这些题不需要矩阵,关键是把词语和参考对象对应起来。
原创讲解;以本讲义所声明的双转台结构为限。64 / 72
第10章 · 练习

62 练习B:从工件点推到物理关节

  1. 零中心/偏置/刀长差,B=0、C=90°,o=(40,20,10),W=(10,0,5)。求XYZ关节和工件原点的空间位置。
  2. 保持上题姿态,执行G91 X10。哪根直线关节增加多少?
  3. 从N70末端执行G90 X20 Y0 Z5 B30 C90,工件点是否变化?为什么X/Z关节仍会变?
  4. M429后XYZ读数变化,关节和刀尖却不动,是正常还是故障?如果反过来XYZ不变、关节跳动呢?
  5. 程序只改C,但XYZ没有动,一定说明RTCP坏了吗?给出一个可以正确不动的几何例子。
  6. C轴错误挂在Z滑枕下,会造成什么显示/结构错误?能否通过开启RTCP修复?
  7. 为什么只校验首末关节位置,不足以证明整段RTCP正确?

扩展题:用你自己的一个工件原点和目标点,手算C=0°与90°的物理位置;再说明旋转中心改成非零后,哪一步需要修改。

把中间层K写出来,可以明显减少漏加偏置和重复加偏置。
原创讲解;以本讲义所声明的双转台结构为限。65 / 72
第10章 · 参考答案

63 练习A答案

  1. K=(50,20,15)。方向对齐、仅平移时,p_K=p_W+o。
  2. G90终点X=20;G91终点X=30。前者是绝对目标,后者在当前10基础上加20。
  3. 单独G54不定位。G54 G1 X0同时含有运动目标,会结合当前坐标与模式形成轨迹。
  4. o=(65,30,20)。当前位置K减去希望的W:(70,30,20)−(5,0,0)。
  5. T3为工具选择号,H3为刀补条目索引,S12000为主轴速度请求,F600由进给模式解释。不能将这些数全当作mm。
  6. 不够。三个平移参数只改变原点,不能补偿初始方向旋转。需机械找正或使用受支持的坐标旋转/方向配准。
答案的条件是答案的一部分,不能省略。
原创讲解;以本讲义所声明的双转台结构为限。66 / 72
第10章 · 参考答案

64 练习B答案

  1. XYZ关节=(−20,50,15),工件原点O_M=(−20,40,10)。先求K=(50,20,15),再绕C90°。
  2. 机床Y增加10mm。当前工件+X就是机床+Y,新的关节为(−20,60,15)。
  3. 工件点不变,仍是(20,0,5)。B姿态改变,新的XYZ关节约为(−9.821,60,22.990)。
  4. 坐标重新解释、关节保持是正常。单纯切换却改变物理关节,一般说明同步/切换逻辑有问题。
  5. 不一定。点在C旋转轴线上且其他条件不变时,只转C可以不改变该点的机床空间位置。
  6. 工件会错误地随XYZ链移动。必须修复结构父子关系,开关RTCP不能替代正确拓扑。
  7. 端点相同,中间路径仍可能不同。例如圆弧与弦线;必须检查连续采样和相对工件轨迹。
每个答案都可以画成“原点 + 方向 + 点”的几何关系。
原创讲解;以本讲义所声明的双转台结构为限。67 / 72
附录A · 术语

65 把常见名词翻译成容易理解的话

术语初学者解释
坐标系/参考系放在某处、有指定方向和单位的一套尺子。
原点/零点这套尺子的起点,不一定是电机回零位置。
工件偏置/WCS offset让零件程序与当前装夹参考对齐的数据。
关节/joint被控制的机械自由度及其位置。
正运动学/FK由关节与结构计算对应坐标/受控点。
逆运动学/IK由目标点、姿态和结构计算关节目标。
姿态/orientation方向关系;本课由A/B、C指定。
TCP/RTCP与刀尖目标、姿态变化补偿相关的功能;需核对控制器定义。
插补/interpolation在段起点和终点间连续生成中间目标。
模态/modal指令生效后持续保留,直到被同组设置替换。
配准/registration建立设计坐标与实际装夹之间的对应关系。
同步/synchronization让解释器、规划器和运动状态使用一致的当前参考。
看到新术语,先找它属于“几何、程序、机械、执行”哪一层。
原创讲解;以本讲义所声明的双转台结构为限。68 / 72
附录B · 可选数学

66 用最少公式描述完整坐标链

以下公式供进阶阅读,不是初学者读前面章节的前提。向量用列向量,R表示正交旋转矩阵;长度统一为mm。

1. 初始工件配准

p_K = R₀ p_W + o

o给出工件原点在零位参考中的位置;R₀给出初始工件方向。本章实算R₀=I,因此只做平移相加。

2. 当前双转台姿态与几何,L=0

r_M = P + D + R_tilt [ R_C (p_K − P) − D ]

AC取R_tilt=R_X(A),BC取R_tilt=R_Y(B)。因此可写为r_M=O_M+E_MW p_W,其中:

E_MW = R_tilt R_C R₀
O_M = P + D + R_tilt [ R_C(o − P) − D ]

这里r_M是本课零刀长差模型的目标空间位置,并对应直线关节目标。加入刀具标定后还需从刀尖求主轴/执行参考;任意机床结构不能直接套用这一特定式子。

原点项O_M与方向项E_MW同时随姿态变化,分开写有助于理解。
原创讲解;以本讲义所声明的双转台结构为限。69 / 72
附录B · 可选数学

67 反过来:从当前物理位置求工件坐标

在姿态与几何已知、没有奇异歧义且标定一致时,前页r_M=O_M+E_MW p_W可以反算:

p_W = E_MWᵀ (r_M − O_M)

先从当前空间位置减去当前工件原点,得到相对位移;再用逆旋转,把这个位移投回工件三个方向。正交旋转矩阵的逆等于转置,所以这里写上标T。

这正是“坐标数值可以变,而物理点不变”的数学基础。同一r_M在不同O/E下有不同p_W。模式切换、工件系选择或重新设置参考时,必须明确变了哪一层。

本项目刀长差的特殊约定

D_L = D + L·e_z
q_XYZ = P + D_L + R_tilt [ R_C(p_K − P) − D_L ]

本项目原生TRT的L是master-tool刀长差约定。这个式子返回关节目标,不是任意GLB刀尖网格的世界位置。完整工具标定、工件架与刀尖显示须遵循同一个约定;其他控制器应按其文档重新建立链路。

先减原点、再投影方向;关节到刀尖之间还可能存在刀具参考变换。
本地trtfuncs.c、imported-machine.ts;主实验L=0。70 / 72
附录C · 软件实验范围

68 这份讲义验证了什么,没有声称什么?

内容本次证据
G10 L2、G54/G55平移、G90/G91实际项目WASM逐段解析,核对规范目标。
G20长度/G94直线进给换算X1→25.4mm,F2→50.8mm/min实测。
G10 L20位置重定义偏置计算及后续目标实测。
RTCP BC例子的目标关节真实WASM逆解计算;关键数值强断言。
N10–N90完整运动真实Session/解释器/TP执行完成,终点与逐行结果一致。
M429/M428保持物理关节原生切换接口+坐标同步逐段验证。
G52/G92、任意方向变换、完整刀表与所有F模式依据官方语义讲解,不冒充Web切片已全面实现。

项目调用实际WASM并不能自动证明它覆盖了完整LinuxCNC。特别是本地解释器适配层属于功能切片,不能把接受某个字母或设置内部字段当作完整语义和工艺正确性证据。

严谨的教学需要同时给出结果和结果成立的范围。
原创讲解;以本讲义所声明的双转台结构为限。71 / 72
附录D · 来源与复现

69 官方资料、验证数据与自学路径

[S1] LinuxCNC · 5-Axis Kinematics
用于核对AC/BC机构、前后向变换、旋转中心、偏置与刀具参考。

[S2] LinuxCNC · Coordinate Systems
用于核对机床/工件坐标、G54–G59.3及附加偏置。

[S3] LinuxCNC · CNC Machine Overview
轴命名、受控点、单位、旋转与协调运动。

[S4] LinuxCNC · G-Codes
G10、G20/G21、G43、G53、G90/G91、圆弧/进给等指令语义。

[S5] LinuxCNC · G-code Overview
程序段、地址字、表达式、模态组及执行顺序。

[S6] LinuxCNC · Switchable Kinematics
切换模式及解释器/运动同步。

本地依据:sim_interpreter.c、sim_program.c、trtfuncs.c、sim-session.mjs,以及428remap.ngc/429remap.ngc。图示为原创教学图和项目原创GLB渲染。官方页面核对日期:2026-09-18。

最后记住:先定义原点和方向,再解释程序数值,最后由运动学求出各轴运动。
原创讲解;以本讲义所声明的双转台结构为限。72 / 72
\ No newline at end of file diff --git a/docs/teaching/rtcp-beginners/outline.json b/docs/teaching/rtcp-beginners/outline.json new file mode 100644 index 0000000..6f49f38 --- /dev/null +++ b/docs/teaching/rtcp-beginners/outline.json @@ -0,0 +1,362 @@ +[ + { + "page": 1, + "chapter": "封面 · 完整讲义 / 2026.09", + "title": "五轴 RTCP 与工件坐标" + }, + { + "page": 2, + "chapter": "导读", + "title": "怎样使用这份讲义" + }, + { + "page": 3, + "chapter": "学习地图", + "title": "内容索引" + }, + { + "page": 4, + "chapter": "第1章 · 坐标基础", + "title": "01 坐标是“按照约定量出来的位置”" + }, + { + "page": 5, + "chapter": "第1章 · 坐标基础", + "title": "02 一套坐标系至少要规定什么?" + }, + { + "page": 6, + "chapter": "第1章 · 坐标基础", + "title": "03 同一个点,可以有两套不同的坐标" + }, + { + "page": 7, + "chapter": "第1章 · 坐标基础", + "title": "04 点坐标与移动增量不是一回事" + }, + { + "page": 8, + "chapter": "第1章 · 机床结构", + "title": "05 五轴机床里,到底是哪五根轴?" + }, + { + "page": 9, + "chapter": "第1章 · 机床结构", + "title": "06 关节位置,不等于工件坐标" + }, + { + "page": 10, + "chapter": "第2章 · 参考系", + "title": "07 先认识 M、W、J,再引入 K 和 T" + }, + { + "page": 11, + "chapter": "第2章 · 机床参考", + "title": "08 回零解决什么?工件对刀又解决什么?" + }, + { + "page": 12, + "chapter": "第2章 · 工件参考", + "title": "09 工件坐标 W 代表什么?" + }, + { + "page": 13, + "chapter": "第2章 · 工件随动", + "title": "10 工件转了,原点与方向一起转" + }, + { + "page": 14, + "chapter": "第2章 · 最重要的区分", + "title": "11 “物理工件坐标架”和“G54表”不是同一对象" + }, + { + "page": 15, + "chapter": "第3章 · 原点与方向的确定", + "title": "12 先约定机床零姿态,再谈工件装在哪里" + }, + { + "page": 16, + "chapter": "第3章 · 原点选择", + "title": "13 工件原点放在哪里比较合适?" + }, + { + "page": 17, + "chapter": "第3章 · 原点测量", + "title": "14 怎样把选好的原点告诉控制器?" + }, + { + "page": 18, + "chapter": "第3章 · 方向测量", + "title": "15 一个原点不能确定三维方向" + }, + { + "page": 19, + "chapter": "第3章 · 初始方向与动态方向", + "title": "16 装夹方向和转台姿态,要分开处理" + }, + { + "page": 20, + "chapter": "第3章 · 原点和方向合起来", + "title": "17 一个点怎样从工件坐标换算到机床空间?" + }, + { + "page": 21, + "chapter": "第4章 · G54与偏置", + "title": "18 G54究竟做了什么?" + }, + { + "page": 22, + "chapter": "第4章 · 偏置的物理含义", + "title": "19 G54的40、20、10代表什么?" + }, + { + "page": 23, + "chapter": "第4章 · 设置方法一", + "title": "20 G10 L2:把已知偏置写入坐标表" + }, + { + "page": 24, + "chapter": "第4章 · 设置方法二", + "title": "21 G10 L20:让当前位置具有指定工件坐标" + }, + { + "page": 25, + "chapter": "第4章 · 两个坐标系", + "title": "22 换G54/G55为什么可能只改数字、不动机床?" + }, + { + "page": 26, + "chapter": "第4章 · 附加偏置与基础坐标", + "title": "23 G52、G92、G53:先学会不混用" + }, + { + "page": 27, + "chapter": "第5章 · 非RTCP与RTCP", + "title": "24 非RTCP:“独立”的准确含义" + }, + { + "page": 28, + "chapter": "第5章 · 非RTCP与RTCP", + "title": "25 RTCP控制的是相对目标关系" + }, + { + "page": 29, + "chapter": "第5章 · RTCP工件原点", + "title": "26 用G54例子看“原点随动”" + }, + { + "page": 30, + "chapter": "第5章 · RTCP方向", + "title": "27 沿工件X前进,哪些电机会动?" + }, + { + "page": 31, + "chapter": "第5章 · 倾转与结构顺序", + "title": "28 加入B或A后,方向可以进入三个维度" + }, + { + "page": 32, + "chapter": "第5章 · 三类偏置", + "title": "29 G54、旋转中心、轴间偏置各管什么?" + }, + { + "page": 33, + "chapter": "第5章 · 刀具参考", + "title": "30 为什么必须知道刀尖究竟在哪里?" + }, + { + "page": 34, + "chapter": "第6章 · 读懂G代码", + "title": "31 一行G代码由“地址字”组成" + }, + { + "page": 35, + "chapter": "第6章 · 模态状态", + "title": "32 没有写出来的内容,可能沿用上一行" + }, + { + "page": 36, + "chapter": "第6章 · 单位", + "title": "33 G20/G21改变长度单位,不把角度变成长度" + }, + { + "page": 37, + "chapter": "第6章 · 绝对目标", + "title": "34 G90 X10:去当前编程系的X=10" + }, + { + "page": 38, + "chapter": "第6章 · 相对增量", + "title": "35 G91 X10:在当前编程方向增加10" + }, + { + "page": 39, + "chapter": "第6章 · 运动方式", + "title": "36 G0/G1分别如何产生运动?" + }, + { + "page": 40, + "chapter": "第6章 · 圆弧地址", + "title": "37 G2/G3里的I、J、K不是三根新电机轴" + }, + { + "page": 41, + "chapter": "第6章 · 进给", + "title": "38 F到底是速度、时间,还是每转进给?" + }, + { + "page": 42, + "chapter": "第6章 · 其他常见字", + "title": "39 不是每个数字都代表位置" + }, + { + "page": 43, + "chapter": "第6章 · 从文本到运动", + "title": "40 控制器不是从左到右逐个字移动" + }, + { + "page": 44, + "chapter": "第7章 · 完整实算程序", + "title": "41 统一实验条件与完整程序" + }, + { + "page": 45, + "chapter": "第7章 · 第一步", + "title": "42 N10–N30:设置模式与工件参考" + }, + { + "page": 46, + "chapter": "第7章 · 第二步", + "title": "43 N40 M428:先切模式,不凭空移动" + }, + { + "page": 47, + "chapter": "第7章 · 第三步", + "title": "44 N50:把第一个工件点送到刀尖" + }, + { + "page": 48, + "chapter": "第7章 · 第四步", + "title": "45 N60 C90:XYZ字没出现,XYZ关节却动了" + }, + { + "page": 49, + "chapter": "第7章 · 第五步", + "title": "46 N70 G91 X10:沿转后的工件方向走" + }, + { + "page": 50, + "chapter": "第7章 · 第六步", + "title": "47 N80:工件点不变,B倾转带来X/Z补偿" + }, + { + "page": 51, + "chapter": "第7章 · 第七步", + "title": "48 N90:省略的Z、B、C保持当前目标" + }, + { + "page": 52, + "chapter": "第7章 · 全过程汇总", + "title": "49 把五组数字同时放在一张表里" + }, + { + "page": 53, + "chapter": "第7章 · 再切回直接模式", + "title": "50 N100/N110:同一刀尖位置,坐标解释改变" + }, + { + "page": 54, + "chapter": "第8章 · 中间轨迹", + "title": "51 RTCP要在运动过程中持续计算" + }, + { + "page": 55, + "chapter": "第8章 · 姿态与刀轴", + "title": "52 RTCP不自动决定刀轴该朝哪里" + }, + { + "page": 56, + "chapter": "第8章 · 三维显示", + "title": "53 预览画面中的三个对象要分开看" + }, + { + "page": 57, + "chapter": "第8章 · 参数准备", + "title": "54 准备数据时,按三层顺序核对" + }, + { + "page": 58, + "chapter": "第9章 · 课堂实验", + "title": "55 实验一:观察“转动后的坐标方向”" + }, + { + "page": 59, + "chapter": "第9章 · 课堂实验", + "title": "56 实验二:G54与G90/G91的逐行记录" + }, + { + "page": 60, + "chapter": "第9章 · 课堂实验", + "title": "57 实验三:原点移动,程序几何不改" + }, + { + "page": 61, + "chapter": "第9章 · 排错", + "title": "58 位置不对时,从哪一层开始查?" + }, + { + "page": 62, + "chapter": "第9章 · 限位与边界", + "title": "59 RTCP跟得上,还必须到得了" + }, + { + "page": 63, + "chapter": "第10章 · 常见问答", + "title": "60 初学者最容易问错的八个问题" + }, + { + "page": 64, + "chapter": "第10章 · 练习", + "title": "61 练习A:原点、模式和地址字" + }, + { + "page": 65, + "chapter": "第10章 · 练习", + "title": "62 练习B:从工件点推到物理关节" + }, + { + "page": 66, + "chapter": "第10章 · 参考答案", + "title": "63 练习A答案" + }, + { + "page": 67, + "chapter": "第10章 · 参考答案", + "title": "64 练习B答案" + }, + { + "page": 68, + "chapter": "附录A · 术语", + "title": "65 把常见名词翻译成容易理解的话" + }, + { + "page": 69, + "chapter": "附录B · 可选数学", + "title": "66 用最少公式描述完整坐标链" + }, + { + "page": 70, + "chapter": "附录B · 可选数学", + "title": "67 反过来:从当前物理位置求工件坐标" + }, + { + "page": 71, + "chapter": "附录C · 软件实验范围", + "title": "68 这份讲义验证了什么,没有声称什么?" + }, + { + "page": 72, + "chapter": "附录D · 来源与复现", + "title": "69 官方资料、验证数据与自学路径" + } +] diff --git a/docs/teaching/rtcp-beginners/verification/acceptance.json b/docs/teaching/rtcp-beginners/verification/acceptance.json new file mode 100644 index 0000000..52715dc --- /dev/null +++ b/docs/teaching/rtcp-beginners/verification/acceptance.json @@ -0,0 +1,502 @@ +{ + "report_id": "rtcp-beginners-pdf-v1", + "status": "verified", + "page_count": 72, + "pdf": "五轴RTCP与工件坐标-初学者完整讲义.pdf", + "bytes": 2187858, + "sha256": "e88f1a796b15c3e0c4af59f6bab5dcfd3c5ee19a80343147ee4edc57068981e7", + "pages": [ + { + "page": 1, + "characters": 350, + "title": "五轴 RTCP 与工件坐标" + }, + { + "page": 2, + "characters": 473, + "title": "怎样使用这份讲义" + }, + { + "page": 3, + "characters": 414, + "title": "内容索引" + }, + { + "page": 4, + "characters": 332, + "title": "01 坐标是“按照约定量出来的位置”" + }, + { + "page": 5, + "characters": 444, + "title": "02 一套坐标系至少要规定什么?" + }, + { + "page": 6, + "characters": 357, + "title": "03 同一个点,可以有两套不同的坐标" + }, + { + "page": 7, + "characters": 359, + "title": "04 点坐标与移动增量不是一回事" + }, + { + "page": 8, + "characters": 349, + "title": "05 五轴机床里,到底是哪五根轴?" + }, + { + "page": 9, + "characters": 416, + "title": "06 关节位置,不等于工件坐标" + }, + { + "page": 10, + "characters": 500, + "title": "07 先认识 M、W、J,再引入 K 和 T" + }, + { + "page": 11, + "characters": 453, + "title": "08 回零解决什么?工件对刀又解决什么?" + }, + { + "page": 12, + "characters": 350, + "title": "09 工件坐标 W 代表什么?" + }, + { + "page": 13, + "characters": 354, + "title": "10 工件转了,原点与方向一起转" + }, + { + "page": 14, + "characters": 528, + "title": "11 “物理工件坐标架”和“G54表”不是同一对象" + }, + { + "page": 15, + "characters": 465, + "title": "12 先约定机床零姿态,再谈工件装在哪里" + }, + { + "page": 16, + "characters": 484, + "title": "13 工件原点放在哪里比较合适?" + }, + { + "page": 17, + "characters": 479, + "title": "14 怎样把选好的原点告诉控制器?" + }, + { + "page": 18, + "characters": 336, + "title": "15 一个原点不能确定三维方向" + }, + { + "page": 19, + "characters": 478, + "title": "16 装夹方向和转台姿态,要分开处理" + }, + { + "page": 20, + "characters": 415, + "title": "17 一个点怎样从工件坐标换算到机床空间?" + }, + { + "page": 21, + "characters": 447, + "title": "18 G54究竟做了什么?" + }, + { + "page": 22, + "characters": 421, + "title": "19 G54的40、20、10代表什么?" + }, + { + "page": 23, + "characters": 404, + "title": "20 G10 L2:把已知偏置写入坐标表" + }, + { + "page": 24, + "characters": 483, + "title": "21 G10 L20:让当前位置具有指定工件坐标" + }, + { + "page": 25, + "characters": 505, + "title": "22 换G54/G55为什么可能只改数字、不动机床?" + }, + { + "page": 26, + "characters": 471, + "title": "23 G52、G92、G53:先学会不混用" + }, + { + "page": 27, + "characters": 374, + "title": "24 非RTCP:“独立”的准确含义" + }, + { + "page": 28, + "characters": 372, + "title": "25 RTCP控制的是相对目标关系" + }, + { + "page": 29, + "characters": 381, + "title": "26 用G54例子看“原点随动”" + }, + { + "page": 30, + "characters": 370, + "title": "27 沿工件X前进,哪些电机会动?" + }, + { + "page": 31, + "characters": 415, + "title": "28 加入B或A后,方向可以进入三个维度" + }, + { + "page": 32, + "characters": 457, + "title": "29 G54、旋转中心、轴间偏置各管什么?" + }, + { + "page": 33, + "characters": 465, + "title": "30 为什么必须知道刀尖究竟在哪里?" + }, + { + "page": 34, + "characters": 521, + "title": "31 一行G代码由“地址字”组成" + }, + { + "page": 35, + "characters": 473, + "title": "32 没有写出来的内容,可能沿用上一行" + }, + { + "page": 36, + "characters": 501, + "title": "33 G20/G21改变长度单位,不把角度变成长度" + }, + { + "page": 37, + "characters": 456, + "title": "34 G90 X10:去当前编程系的X=10" + }, + { + "page": 38, + "characters": 541, + "title": "35 G91 X10:在当前编程方向增加10" + }, + { + "page": 39, + "characters": 485, + "title": "36 G0/G1分别如何产生运动?" + }, + { + "page": 40, + "characters": 466, + "title": "37 G2/G3里的I、J、K不是三根新电机轴" + }, + { + "page": 41, + "characters": 528, + "title": "38 F到底是速度、时间,还是每转进给?" + }, + { + "page": 42, + "characters": 509, + "title": "39 不是每个数字都代表位置" + }, + { + "page": 43, + "characters": 491, + "title": "40 控制器不是从左到右逐个字移动" + }, + { + "page": 44, + "characters": 569, + "title": "41 统一实验条件与完整程序" + }, + { + "page": 45, + "characters": 456, + "title": "42 N10–N30:设置模式与工件参考" + }, + { + "page": 46, + "characters": 449, + "title": "43 N40 M428:先切模式,不凭空移动" + }, + { + "page": 47, + "characters": 450, + "title": "44 N50:把第一个工件点送到刀尖" + }, + { + "page": 48, + "characters": 513, + "title": "45 N60 C90:XYZ字没出现,XYZ关节却动了" + }, + { + "page": 49, + "characters": 498, + "title": "46 N70 G91 X10:沿转后的工件方向走" + }, + { + "page": 50, + "characters": 507, + "title": "47 N80:工件点不变,B倾转带来X/Z补偿" + }, + { + "page": 51, + "characters": 477, + "title": "48 N90:省略的Z、B、C保持当前目标" + }, + { + "page": 52, + "characters": 737, + "title": "49 把五组数字同时放在一张表里" + }, + { + "page": 53, + "characters": 511, + "title": "50 N100/N110:同一刀尖位置,坐标解释改变" + }, + { + "page": 54, + "characters": 336, + "title": "51 RTCP要在运动过程中持续计算" + }, + { + "page": 55, + "characters": 408, + "title": "52 RTCP不自动决定刀轴该朝哪里" + }, + { + "page": 56, + "characters": 514, + "title": "53 预览画面中的三个对象要分开看" + }, + { + "page": 57, + "characters": 497, + "title": "54 准备数据时,按三层顺序核对" + }, + { + "page": 58, + "characters": 478, + "title": "55 实验一:观察“转动后的坐标方向”" + }, + { + "page": 59, + "characters": 491, + "title": "56 实验二:G54与G90/G91的逐行记录" + }, + { + "page": 60, + "characters": 505, + "title": "57 实验三:原点移动,程序几何不改" + }, + { + "page": 61, + "characters": 497, + "title": "58 位置不对时,从哪一层开始查?" + }, + { + "page": 62, + "characters": 473, + "title": "59 RTCP跟得上,还必须到得了" + }, + { + "page": 63, + "characters": 434, + "title": "60 初学者最容易问错的八个问题" + }, + { + "page": 64, + "characters": 429, + "title": "61 练习A:原点、模式和地址字" + }, + { + "page": 65, + "characters": 466, + "title": "62 练习B:从工件点推到物理关节" + }, + { + "page": 66, + "characters": 434, + "title": "63 练习A答案" + }, + { + "page": 67, + "characters": 419, + "title": "64 练习B答案" + }, + { + "page": 68, + "characters": 472, + "title": "65 把常见名词翻译成容易理解的话" + }, + { + "page": 69, + "characters": 477, + "title": "66 用最少公式描述完整坐标链" + }, + { + "page": 70, + "characters": 500, + "title": "67 反过来:从当前物理位置求工件坐标" + }, + { + "page": 71, + "characters": 525, + "title": "68 这份讲义验证了什么,没有声称什么?" + }, + { + "page": 72, + "characters": 731, + "title": "69 官方资料、验证数据与自学路径" + } + ], + "embedded_fonts": { + "/AAAAAA+RtcpHandbookCJK-Bold": true, + "/BAAAAA+RtcpHandbookCJK-Regular": true, + "/CAAAAA+NotoSans-Regular": true, + "/DAAAAA+DejaVuSansMono": true + }, + "bookmarks": 81, + "numeric_report": "rtcp-beginners-gcode-v1", + "executed_program_status": "completed", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "evidence": [ + { + "path": "handbook.html", + "sha256": "525cddf7836d4da6464595fa606d4292dcd14028d24a5686dfff343c00b836d5" + }, + { + "path": "outline.json", + "sha256": "a2d61e7fb27f5876be867d95fcd4049cd1dde279813228375e037da508d2ae08" + }, + { + "path": "gcode-evidence.json", + "sha256": "57b65da107b22cbfa70bdda6659217d2f854317be3f8e54a9e150b4762f82114" + }, + { + "path": "verification/layout.json", + "sha256": "e9345f5594854e9f52168cb7b0bfbe65303e6c3b7c75124ab8fb4004ef9d11f4" + }, + { + "path": "assets/absolute-incremental.png", + "sha256": "36099f3c97af8e0d84fb6223bf1a14ed9c45608266aa87314fd7c4d4c9038777" + }, + { + "path": "assets/arc-chord.png", + "sha256": "947bfc50ca994ae58b63ed0b198048854690c402a8a2b48d72e306920bf5a93b" + }, + { + "path": "assets/arc-words.png", + "sha256": "38c4caf5f8d61b1de510a1946aec58768a468f27bd897a596270605a91e66bdb" + }, + { + "path": "assets/bc-frame.png", + "sha256": "b6c467d33eff25e4e02bd04b601388ee4beca460c47426cb906c2ce628dd1eb0" + }, + { + "path": "assets/continuous-joints.png", + "sha256": "2aaaa964d93e6e25e654eb239b2baca25f5be43c839f64c8ac37285cf5ede6c0" + }, + { + "path": "assets/coordinate-grid.png", + "sha256": "587bbd6ba95422cb96fb07b447bfae0b7c3cd82ca4b96b65b1504909c8cd1e7f" + }, + { + "path": "assets/datum-choice.png", + "sha256": "22bcd771e42fbacd5f142a8810670195e760dc9a7722af5daf210c5a16f517e6" + }, + { + "path": "assets/font-license.txt", + "sha256": "849f4ea9c214fa4ac3593b770c699f387534b11ce671264c1b10d85bdcb5997b" + }, + { + "path": "assets/handbook-bold.otf", + "sha256": "e891f0e63d907ab6b15052fc9a31914bc024b59cf00f55eb4a9dad5920eb5379" + }, + { + "path": "assets/handbook-regular.otf", + "sha256": "3a6330ebd1c859e95c3afa190e2845a9826c5c42c33f63ef815cb0365df25dd4" + }, + { + "path": "assets/hierarchy.png", + "sha256": "cf76f72ffd315ad17567bf6de507d16c283d3a1882c6f70a9398a04434ccc989" + }, + { + "path": "assets/identity-no-follow.png", + "sha256": "1ecb07bdeb7a5015b6c17b32fb3611bec78d8067fb93057d39d5f408eb166f80" + }, + { + "path": "assets/machine-ac.png", + "sha256": "ec538e0c0ebe016a1f464ce519875b3338dd60867627ffad2e0a7cdfc425a0ab" + }, + { + "path": "assets/machine-bc.png", + "sha256": "46c37c21ef8dbaad203d2aa930796cc96278d9371d28584ac7aade5064b39308" + }, + { + "path": "assets/moving-origin.png", + "sha256": "687d10f564f5c7da5c9f8385d6eb536038e3d0c2258441f3e658160d6a517c7b" + }, + { + "path": "assets/offset-pipeline.png", + "sha256": "75a7ad25ce9f5f1c677589d824ce607f1b36c7ee379599fa0aa0ead9bd4afb7c" + }, + { + "path": "assets/orientation-measure.png", + "sha256": "3b89e366c8d4f058c3758b310735f55608c74215fe22b99fc6dadc4412512c1a" + }, + { + "path": "assets/orientation.png", + "sha256": "56e9a6df913e805e07bd00a350f8da9eab4def2cfedaa3ce0cf1b191e65def74" + }, + { + "path": "assets/pivot-offset.png", + "sha256": "fc378a8bf7aaf6b8969889bbd4a8f763bc71b01505d063402c0ea4251f06abcd" + }, + { + "path": "assets/rotated-direction.png", + "sha256": "9fe171e5e6c95c5f81dd0b395a24351972da7e5d18a37d33e19a6ed9d0a0f645" + }, + { + "path": "assets/same-point.png", + "sha256": "79df6b907d4582f82fb45cf03effdf41f2040fe0382e7ee043d34a3e15ec2460" + }, + { + "path": "assets/tcp-follow.png", + "sha256": "875eba48ea1cb7b9f990ddc556d38cb4e855af77a3c29130f8c6c249fd3817c8" + }, + { + "path": "assets/tool-length.png", + "sha256": "168941e33624f883b09c1cdf54b36ed6e31ba260c7f1abdc495fee3b54cc834a" + }, + { + "path": "verification/pdf-contact-1.png", + "sha256": "5434a7798a6d4384d0fc2ff4dacbbc4c93888674e8935d2499569e1e77ec8d46" + }, + { + "path": "verification/pdf-contact-2.png", + "sha256": "388a72f9a4ef62fe48e786ca6bbc40aee9ad42fb7a63263be755174b902f01cf" + }, + { + "path": "verification/pdf-contact-3.png", + "sha256": "d37d45aba09f2080a43306c31193216011fab37115210f9acf40f7106d2aad92" + } + ] +} diff --git a/docs/teaching/rtcp-beginners/verification/layout.json b/docs/teaching/rtcp-beginners/verification/layout.json new file mode 100644 index 0000000..788c6d1 --- /dev/null +++ b/docs/teaching/rtcp-beginners/verification/layout.json @@ -0,0 +1,759 @@ +{ + "report_id": "rtcp-beginners-layout-v1", + "pages": [ + { + "page": 1, + "title": "五轴 RTCP 与工件坐标", + "violations": [], + "overflow": false, + "title_right": 316.921875, + "images": [ + { + "src": "assets/machine-bc.png", + "loaded": true + } + ], + "characters": 255 + }, + { + "page": 2, + "title": "怎样使用这份讲义", + "violations": [], + "overflow": false, + "title_right": 262, + "images": [], + "characters": 388 + }, + { + "page": 3, + "title": "内容索引", + "violations": [], + "overflow": false, + "title_right": 154, + "images": [], + "characters": 350 + }, + { + "page": 4, + "title": "01 坐标是“按照约定量出来的位置”", + "violations": [], + "overflow": false, + "title_right": 509.859375, + "images": [ + { + "src": "assets/coordinate-grid.png", + "loaded": true + } + ], + "characters": 250 + }, + { + "page": 5, + "title": "02 一套坐标系至少要规定什么?", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [], + "characters": 360 + }, + { + "page": 6, + "title": "03 同一个点,可以有两套不同的坐标", + "violations": [], + "overflow": false, + "title_right": 509.859375, + "images": [ + { + "src": "assets/same-point.png", + "loaded": true + } + ], + "characters": 274 + }, + { + "page": 7, + "title": "04 点坐标与移动增量不是一回事", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [ + { + "src": "assets/absolute-incremental.png", + "loaded": true + } + ], + "characters": 280 + }, + { + "page": 8, + "title": "05 五轴机床里,到底是哪五根轴?", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [ + { + "src": "assets/hierarchy.png", + "loaded": true + } + ], + "characters": 267 + }, + { + "page": 9, + "title": "06 关节位置,不等于工件坐标", + "violations": [], + "overflow": false, + "title_right": 428.859375, + "images": [], + "characters": 335 + }, + { + "page": 10, + "title": "07 先认识 M、W、J,再引入 K 和 T", + "violations": [], + "overflow": false, + "title_right": 497.859375, + "images": [], + "characters": 405 + }, + { + "page": 11, + "title": "08 回零解决什么?工件对刀又解决什么?", + "violations": [], + "overflow": false, + "title_right": 563.859375, + "images": [], + "characters": 366 + }, + { + "page": 12, + "title": "09 工件坐标 W 代表什么?", + "violations": [], + "overflow": false, + "title_right": 384.828125, + "images": [ + { + "src": "assets/datum-choice.png", + "loaded": true + } + ], + "characters": 261 + }, + { + "page": 13, + "title": "10 工件转了,原点与方向一起转", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [ + { + "src": "assets/moving-origin.png", + "loaded": true + } + ], + "characters": 267 + }, + { + "page": 14, + "title": "11 “物理工件坐标架”和“G54表”不是同一对象", + "violations": [], + "overflow": false, + "title_right": 655.578125, + "images": [], + "characters": 422 + }, + { + "page": 15, + "title": "12 先约定机床零姿态,再谈工件装在哪里", + "violations": [], + "overflow": false, + "title_right": 563.859375, + "images": [], + "characters": 367 + }, + { + "page": 16, + "title": "13 工件原点放在哪里比较合适?", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [], + "characters": 383 + }, + { + "page": 17, + "title": "14 怎样把选好的原点告诉控制器?", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 373 + }, + { + "page": 18, + "title": "15 一个原点不能确定三维方向", + "violations": [], + "overflow": false, + "title_right": 428.859375, + "images": [ + { + "src": "assets/orientation-measure.png", + "loaded": true + } + ], + "characters": 246 + }, + { + "page": 19, + "title": "16 装夹方向和转台姿态,要分开处理", + "violations": [], + "overflow": false, + "title_right": 509.859375, + "images": [], + "characters": 378 + }, + { + "page": 20, + "title": "17 一个点怎样从工件坐标换算到机床空间?", + "violations": [], + "overflow": false, + "title_right": 590.859375, + "images": [ + { + "src": "assets/moving-origin.png", + "loaded": true + } + ], + "characters": 319 + }, + { + "page": 21, + "title": "18 G54究竟做了什么?", + "violations": [], + "overflow": false, + "title_right": 345.09375, + "images": [], + "characters": 352 + }, + { + "page": 22, + "title": "19 G54的40、20、10代表什么?", + "violations": [], + "overflow": false, + "title_right": 467.671875, + "images": [ + { + "src": "assets/offset-pipeline.png", + "loaded": true + } + ], + "characters": 313 + }, + { + "page": 23, + "title": "20 G10 L2:把已知偏置写入坐标表", + "violations": [], + "overflow": false, + "title_right": 490.75, + "images": [], + "characters": 311 + }, + { + "page": 24, + "title": "21 G10 L20:让当前位置具有指定工件坐标", + "violations": [], + "overflow": false, + "title_right": 587.6875, + "images": [], + "characters": 378 + }, + { + "page": 25, + "title": "22 换G54/G55为什么可能只改数字、不动机床?", + "violations": [], + "overflow": false, + "title_right": 649.4375, + "images": [], + "characters": 396 + }, + { + "page": 26, + "title": "23 G52、G92、G53:先学会不混用", + "violations": [], + "overflow": false, + "title_right": 501.53125, + "images": [], + "characters": 362 + }, + { + "page": 27, + "title": "24 非RTCP:“独立”的准确含义", + "violations": [], + "overflow": false, + "title_right": 458.03125, + "images": [ + { + "src": "assets/identity-no-follow.png", + "loaded": true + } + ], + "characters": 275 + }, + { + "page": 28, + "title": "25 RTCP控制的是相对目标关系", + "violations": [], + "overflow": false, + "title_right": 444.53125, + "images": [ + { + "src": "assets/tcp-follow.png", + "loaded": true + } + ], + "characters": 269 + }, + { + "page": 29, + "title": "26 用G54例子看“原点随动”", + "violations": [], + "overflow": false, + "title_right": 426.09375, + "images": [ + { + "src": "assets/moving-origin.png", + "loaded": true + } + ], + "characters": 281 + }, + { + "page": 30, + "title": "27 沿工件X前进,哪些电机会动?", + "violations": [], + "overflow": false, + "title_right": 472.796875, + "images": [ + { + "src": "assets/rotated-direction.png", + "loaded": true + } + ], + "characters": 283 + }, + { + "page": 31, + "title": "28 加入B或A后,方向可以进入三个维度", + "violations": [], + "overflow": false, + "title_right": 545.5625, + "images": [ + { + "src": "assets/bc-frame.png", + "loaded": true + } + ], + "characters": 316 + }, + { + "page": 32, + "title": "29 G54、旋转中心、轴间偏置各管什么?", + "violations": [], + "overflow": false, + "title_right": 561.078125, + "images": [ + { + "src": "assets/pivot-offset.png", + "loaded": true + } + ], + "characters": 365 + }, + { + "page": 33, + "title": "30 为什么必须知道刀尖究竟在哪里?", + "violations": [], + "overflow": false, + "title_right": 509.859375, + "images": [ + { + "src": "assets/tool-length.png", + "loaded": true + } + ], + "characters": 347 + }, + { + "page": 34, + "title": "31 一行G代码由“地址字”组成", + "violations": [], + "overflow": false, + "title_right": 448.21875, + "images": [], + "characters": 426 + }, + { + "page": 35, + "title": "32 没有写出来的内容,可能沿用上一行", + "violations": [], + "overflow": false, + "title_right": 536.859375, + "images": [], + "characters": 384 + }, + { + "page": 36, + "title": "33 G20/G21改变长度单位,不把角度变成长度", + "violations": [], + "overflow": false, + "title_right": 622.4375, + "images": [], + "characters": 386 + }, + { + "page": 37, + "title": "34 G90 X10:去当前编程系的X=10", + "violations": [], + "overflow": false, + "title_right": 491.71875, + "images": [], + "characters": 355 + }, + { + "page": 38, + "title": "35 G91 X10:在当前编程方向增加10", + "violations": [], + "overflow": false, + "title_right": 512.859375, + "images": [], + "characters": 449 + }, + { + "page": 39, + "title": "36 G0/G1分别如何产生运动?", + "violations": [], + "overflow": false, + "title_right": 428.5625, + "images": [], + "characters": 397 + }, + { + "page": 40, + "title": "37 G2/G3里的I、J、K不是三根新电机轴", + "violations": [], + "overflow": false, + "title_right": 552.34375, + "images": [ + { + "src": "assets/arc-words.png", + "loaded": true + } + ], + "characters": 348 + }, + { + "page": 41, + "title": "38 F到底是速度、时间,还是每转进给?", + "violations": [], + "overflow": false, + "title_right": 552.65625, + "images": [], + "characters": 440 + }, + { + "page": 42, + "title": "39 不是每个数字都代表位置", + "violations": [], + "overflow": false, + "title_right": 401.875, + "images": [], + "characters": 421 + }, + { + "page": 43, + "title": "40 控制器不是从左到右逐个字移动", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 369 + }, + { + "page": 44, + "title": "41 统一实验条件与完整程序", + "violations": [], + "overflow": false, + "title_right": 401.875, + "images": [], + "characters": 442 + }, + { + "page": 45, + "title": "42 N10–N30:设置模式与工件参考", + "violations": [], + "overflow": false, + "title_right": 493.71875, + "images": [], + "characters": 372 + }, + { + "page": 46, + "title": "43 N40 M428:先切模式,不凭空移动", + "violations": [], + "overflow": false, + "title_right": 530.90625, + "images": [], + "characters": 358 + }, + { + "page": 47, + "title": "44 N50:把第一个工件点送到刀尖", + "violations": [], + "overflow": false, + "title_right": 480.953125, + "images": [], + "characters": 348 + }, + { + "page": 48, + "title": "45 N60 C90:XYZ字没出现,XYZ关节却动了", + "violations": [], + "overflow": false, + "title_right": 606.53125, + "images": [], + "characters": 423 + }, + { + "page": 49, + "title": "46 N70 G91 X10:沿转后的工件方向走", + "violations": [], + "overflow": false, + "title_right": 539.21875, + "images": [], + "characters": 409 + }, + { + "page": 50, + "title": "47 N80:工件点不变,B倾转带来X/Z补偿", + "violations": [], + "overflow": false, + "title_right": 570.265625, + "images": [], + "characters": 417 + }, + { + "page": 51, + "title": "48 N90:省略的Z、B、C保持当前目标", + "violations": [], + "overflow": false, + "title_right": 533.59375, + "images": [], + "characters": 352 + }, + { + "page": 52, + "title": "49 把五组数字同时放在一张表里", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [ + { + "src": "assets/continuous-joints.png", + "loaded": true + } + ], + "characters": 647 + }, + { + "page": 53, + "title": "50 N100/N110:同一刀尖位置,坐标解释改变", + "violations": [], + "overflow": false, + "title_right": 629.34375, + "images": [], + "characters": 399 + }, + { + "page": 54, + "title": "51 RTCP要在运动过程中持续计算", + "violations": [], + "overflow": false, + "title_right": 471.53125, + "images": [ + { + "src": "assets/arc-chord.png", + "loaded": true + } + ], + "characters": 255 + }, + { + "page": 55, + "title": "52 RTCP不自动决定刀轴该朝哪里", + "violations": [], + "overflow": false, + "title_right": 471.53125, + "images": [ + { + "src": "assets/orientation.png", + "loaded": true + } + ], + "characters": 318 + }, + { + "page": 56, + "title": "53 预览画面中的三个对象要分开看", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 426 + }, + { + "page": 57, + "title": "54 准备数据时,按三层顺序核对", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [], + "characters": 411 + }, + { + "page": 58, + "title": "55 实验一:观察“转动后的坐标方向”", + "violations": [], + "overflow": false, + "title_right": 536.859375, + "images": [], + "characters": 369 + }, + { + "page": 59, + "title": "56 实验二:G54与G90/G91的逐行记录", + "violations": [], + "overflow": false, + "title_right": 538.65625, + "images": [], + "characters": 390 + }, + { + "page": 60, + "title": "57 实验三:原点移动,程序几何不改", + "violations": [], + "overflow": false, + "title_right": 509.859375, + "images": [], + "characters": 401 + }, + { + "page": 61, + "title": "58 位置不对时,从哪一层开始查?", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 418 + }, + { + "page": 62, + "title": "59 RTCP跟得上,还必须到得了", + "violations": [], + "overflow": false, + "title_right": 444.53125, + "images": [], + "characters": 384 + }, + { + "page": 63, + "title": "60 初学者最容易问错的八个问题", + "violations": [], + "overflow": false, + "title_right": 455.859375, + "images": [], + "characters": 353 + }, + { + "page": 64, + "title": "61 练习A:原点、模式和地址字", + "violations": [], + "overflow": false, + "title_right": 446.171875, + "images": [], + "characters": 327 + }, + { + "page": 65, + "title": "62 练习B:从工件点推到物理关节", + "violations": [], + "overflow": false, + "title_right": 474.25, + "images": [], + "characters": 358 + }, + { + "page": 66, + "title": "63 练习A答案", + "violations": [], + "overflow": false, + "title_right": 230.171875, + "images": [], + "characters": 344 + }, + { + "page": 67, + "title": "64 练习B答案", + "violations": [], + "overflow": false, + "title_right": 231.25, + "images": [], + "characters": 317 + }, + { + "page": 68, + "title": "65 把常见名词翻译成容易理解的话", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 386 + }, + { + "page": 69, + "title": "66 用最少公式描述完整坐标链", + "violations": [], + "overflow": false, + "title_right": 428.859375, + "images": [], + "characters": 384 + }, + { + "page": 70, + "title": "67 反过来:从当前物理位置求工件坐标", + "violations": [], + "overflow": false, + "title_right": 536.859375, + "images": [], + "characters": 389 + }, + { + "page": 71, + "title": "68 这份讲义验证了什么,没有声称什么?", + "violations": [], + "overflow": false, + "title_right": 563.859375, + "images": [], + "characters": 439 + }, + { + "page": 72, + "title": "69 官方资料、验证数据与自学路径", + "violations": [], + "overflow": false, + "title_right": 482.859375, + "images": [], + "characters": 626 + } + ], + "errors": [] +} diff --git a/docs/teaching/rtcp-beginners/verification/page-01.png b/docs/teaching/rtcp-beginners/verification/page-01.png new file mode 100644 index 0000000..2253b19 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-01.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-02.png b/docs/teaching/rtcp-beginners/verification/page-02.png new file mode 100644 index 0000000..811b38b Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-02.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-03.png b/docs/teaching/rtcp-beginners/verification/page-03.png new file mode 100644 index 0000000..e206d97 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-03.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-04.png b/docs/teaching/rtcp-beginners/verification/page-04.png new file mode 100644 index 0000000..c14c26e Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-04.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-05.png b/docs/teaching/rtcp-beginners/verification/page-05.png new file mode 100644 index 0000000..7fe6c23 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-05.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-06.png b/docs/teaching/rtcp-beginners/verification/page-06.png new file mode 100644 index 0000000..5d064d1 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-06.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-07.png b/docs/teaching/rtcp-beginners/verification/page-07.png new file mode 100644 index 0000000..8e962d9 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-07.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-08.png b/docs/teaching/rtcp-beginners/verification/page-08.png new file mode 100644 index 0000000..6bb2bae Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-08.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-09.png b/docs/teaching/rtcp-beginners/verification/page-09.png new file mode 100644 index 0000000..35f08ac Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-09.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-10.png b/docs/teaching/rtcp-beginners/verification/page-10.png new file mode 100644 index 0000000..d5e426d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-10.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-11.png b/docs/teaching/rtcp-beginners/verification/page-11.png new file mode 100644 index 0000000..6850b55 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-11.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-12.png b/docs/teaching/rtcp-beginners/verification/page-12.png new file mode 100644 index 0000000..dbe74ce Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-12.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-13.png b/docs/teaching/rtcp-beginners/verification/page-13.png new file mode 100644 index 0000000..596cc8f Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-13.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-14.png b/docs/teaching/rtcp-beginners/verification/page-14.png new file mode 100644 index 0000000..5765917 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-14.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-15.png b/docs/teaching/rtcp-beginners/verification/page-15.png new file mode 100644 index 0000000..47f65ab Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-15.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-16.png b/docs/teaching/rtcp-beginners/verification/page-16.png new file mode 100644 index 0000000..2b517b7 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-16.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-17.png b/docs/teaching/rtcp-beginners/verification/page-17.png new file mode 100644 index 0000000..d5bb375 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-17.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-18.png b/docs/teaching/rtcp-beginners/verification/page-18.png new file mode 100644 index 0000000..d856d5a Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-18.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-19.png b/docs/teaching/rtcp-beginners/verification/page-19.png new file mode 100644 index 0000000..9fa2a4d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-19.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-20.png b/docs/teaching/rtcp-beginners/verification/page-20.png new file mode 100644 index 0000000..33bfed0 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-20.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-21.png b/docs/teaching/rtcp-beginners/verification/page-21.png new file mode 100644 index 0000000..0dbd4ec Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-21.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-22.png b/docs/teaching/rtcp-beginners/verification/page-22.png new file mode 100644 index 0000000..4df19b4 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-22.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-23.png b/docs/teaching/rtcp-beginners/verification/page-23.png new file mode 100644 index 0000000..f9a937c Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-23.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-24.png b/docs/teaching/rtcp-beginners/verification/page-24.png new file mode 100644 index 0000000..8e23b36 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-24.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-25.png b/docs/teaching/rtcp-beginners/verification/page-25.png new file mode 100644 index 0000000..3e307bc Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-25.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-26.png b/docs/teaching/rtcp-beginners/verification/page-26.png new file mode 100644 index 0000000..db205b4 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-26.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-27.png b/docs/teaching/rtcp-beginners/verification/page-27.png new file mode 100644 index 0000000..fe12d3f Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-27.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-28.png b/docs/teaching/rtcp-beginners/verification/page-28.png new file mode 100644 index 0000000..a060f44 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-28.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-29.png b/docs/teaching/rtcp-beginners/verification/page-29.png new file mode 100644 index 0000000..8148744 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-29.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-30.png b/docs/teaching/rtcp-beginners/verification/page-30.png new file mode 100644 index 0000000..3276ba5 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-30.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-31.png b/docs/teaching/rtcp-beginners/verification/page-31.png new file mode 100644 index 0000000..07d94c8 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-31.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-32.png b/docs/teaching/rtcp-beginners/verification/page-32.png new file mode 100644 index 0000000..e2d498d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-32.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-33.png b/docs/teaching/rtcp-beginners/verification/page-33.png new file mode 100644 index 0000000..be06dc4 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-33.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-34.png b/docs/teaching/rtcp-beginners/verification/page-34.png new file mode 100644 index 0000000..4632fb7 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-34.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-35.png b/docs/teaching/rtcp-beginners/verification/page-35.png new file mode 100644 index 0000000..f86a17d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-35.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-36.png b/docs/teaching/rtcp-beginners/verification/page-36.png new file mode 100644 index 0000000..a634ac3 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-36.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-37.png b/docs/teaching/rtcp-beginners/verification/page-37.png new file mode 100644 index 0000000..0a5928a Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-37.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-38.png b/docs/teaching/rtcp-beginners/verification/page-38.png new file mode 100644 index 0000000..31175e8 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-38.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-39.png b/docs/teaching/rtcp-beginners/verification/page-39.png new file mode 100644 index 0000000..2244790 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-39.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-40.png b/docs/teaching/rtcp-beginners/verification/page-40.png new file mode 100644 index 0000000..55d0621 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-40.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-41.png b/docs/teaching/rtcp-beginners/verification/page-41.png new file mode 100644 index 0000000..c944f94 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-41.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-42.png b/docs/teaching/rtcp-beginners/verification/page-42.png new file mode 100644 index 0000000..b40b375 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-42.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-43.png b/docs/teaching/rtcp-beginners/verification/page-43.png new file mode 100644 index 0000000..6cc6be1 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-43.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-44.png b/docs/teaching/rtcp-beginners/verification/page-44.png new file mode 100644 index 0000000..75b35a8 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-44.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-45.png b/docs/teaching/rtcp-beginners/verification/page-45.png new file mode 100644 index 0000000..d3a6a6a Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-45.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-46.png b/docs/teaching/rtcp-beginners/verification/page-46.png new file mode 100644 index 0000000..41511c5 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-46.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-47.png b/docs/teaching/rtcp-beginners/verification/page-47.png new file mode 100644 index 0000000..bc6f901 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-47.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-48.png b/docs/teaching/rtcp-beginners/verification/page-48.png new file mode 100644 index 0000000..552eb2d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-48.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-49.png b/docs/teaching/rtcp-beginners/verification/page-49.png new file mode 100644 index 0000000..7c96ecf Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-49.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-50.png b/docs/teaching/rtcp-beginners/verification/page-50.png new file mode 100644 index 0000000..a798251 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-50.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-51.png b/docs/teaching/rtcp-beginners/verification/page-51.png new file mode 100644 index 0000000..ec6cb43 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-51.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-52.png b/docs/teaching/rtcp-beginners/verification/page-52.png new file mode 100644 index 0000000..4295779 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-52.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-53.png b/docs/teaching/rtcp-beginners/verification/page-53.png new file mode 100644 index 0000000..c7c103c Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-53.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-54.png b/docs/teaching/rtcp-beginners/verification/page-54.png new file mode 100644 index 0000000..ebb20bd Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-54.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-55.png b/docs/teaching/rtcp-beginners/verification/page-55.png new file mode 100644 index 0000000..765f820 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-55.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-56.png b/docs/teaching/rtcp-beginners/verification/page-56.png new file mode 100644 index 0000000..adb42c5 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-56.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-57.png b/docs/teaching/rtcp-beginners/verification/page-57.png new file mode 100644 index 0000000..13f442f Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-57.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-58.png b/docs/teaching/rtcp-beginners/verification/page-58.png new file mode 100644 index 0000000..182fc1c Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-58.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-59.png b/docs/teaching/rtcp-beginners/verification/page-59.png new file mode 100644 index 0000000..ab90018 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-59.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-60.png b/docs/teaching/rtcp-beginners/verification/page-60.png new file mode 100644 index 0000000..d5d79d8 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-60.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-61.png b/docs/teaching/rtcp-beginners/verification/page-61.png new file mode 100644 index 0000000..551712b Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-61.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-62.png b/docs/teaching/rtcp-beginners/verification/page-62.png new file mode 100644 index 0000000..a80b968 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-62.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-63.png b/docs/teaching/rtcp-beginners/verification/page-63.png new file mode 100644 index 0000000..4aeaef7 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-63.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-64.png b/docs/teaching/rtcp-beginners/verification/page-64.png new file mode 100644 index 0000000..12bca81 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-64.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-65.png b/docs/teaching/rtcp-beginners/verification/page-65.png new file mode 100644 index 0000000..d481440 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-65.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-66.png b/docs/teaching/rtcp-beginners/verification/page-66.png new file mode 100644 index 0000000..f4ef1a5 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-66.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-67.png b/docs/teaching/rtcp-beginners/verification/page-67.png new file mode 100644 index 0000000..99e073e Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-67.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-68.png b/docs/teaching/rtcp-beginners/verification/page-68.png new file mode 100644 index 0000000..54b5f6d Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-68.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-69.png b/docs/teaching/rtcp-beginners/verification/page-69.png new file mode 100644 index 0000000..608451a Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-69.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-70.png b/docs/teaching/rtcp-beginners/verification/page-70.png new file mode 100644 index 0000000..d024444 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-70.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-71.png b/docs/teaching/rtcp-beginners/verification/page-71.png new file mode 100644 index 0000000..9998eaf Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-71.png differ diff --git a/docs/teaching/rtcp-beginners/verification/page-72.png b/docs/teaching/rtcp-beginners/verification/page-72.png new file mode 100644 index 0000000..4bbf739 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/page-72.png differ diff --git a/docs/teaching/rtcp-beginners/verification/pdf-contact-1.png b/docs/teaching/rtcp-beginners/verification/pdf-contact-1.png new file mode 100644 index 0000000..ddc6f6c Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/pdf-contact-1.png differ diff --git a/docs/teaching/rtcp-beginners/verification/pdf-contact-2.png b/docs/teaching/rtcp-beginners/verification/pdf-contact-2.png new file mode 100644 index 0000000..97437ed Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/pdf-contact-2.png differ diff --git a/docs/teaching/rtcp-beginners/verification/pdf-contact-3.png b/docs/teaching/rtcp-beginners/verification/pdf-contact-3.png new file mode 100644 index 0000000..e5cf526 Binary files /dev/null and b/docs/teaching/rtcp-beginners/verification/pdf-contact-3.png differ diff --git a/docs/teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf b/docs/teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf new file mode 100644 index 0000000..1290be5 Binary files /dev/null and b/docs/teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf differ diff --git a/docs/teaching/rtcp-five-axis/README.md b/docs/teaching/rtcp-five-axis/README.md new file mode 100644 index 0000000..c68dc44 --- /dev/null +++ b/docs/teaching/rtcp-five-axis/README.md @@ -0,0 +1,54 @@ +# 五轴机床与 RTCP 教学课件 + +新增完整教材:[五轴RTCP与工件坐标:初学者完整讲义(72页A4)](../rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf)。系统补充原点/方向、G54配准、G代码逐字/逐行和真实关节计算。下方31页文件保留作投影概要;详细学习优先使用[完整版索引](../rtcp-beginners/README.md)。 + +已交付:[五轴机床与RTCP-教学课件.pdf](五轴机床与RTCP-教学课件.pdf),31 页、16:9 横向、中文可选择文本、目录书签。建议 60–90 分钟,适合投影或分两次授课。 + +可编辑/离线阅读源稿:[course.html](course.html)。原理图和机床截图在 `assets/`,各页目录在 [outline.json](outline.json)。整个目录可离线使用;PDF 内的官方资料链接需要联网。 + +## 核心理解 + +- 五轴通常是 XYZ 加 AC 或 BC,本课以刀具侧 XYZ、工件侧 A/B→C 的双转台桁架为例,不把六个字母都当成五个轴。 +- 非 RTCP 的“独立”指不自动做旋转姿态引起的 XYZ 几何补偿,不代表不能同步插补,也不代表刀具与工件的相对位置不会改变。 +- G 代码的数值需要经过单位、绝对/增量、工件偏置、刀具补偿等解释;不能不加条件地等同于真实编码器反馈。 +- RTCP 根据目标位置、角度和机床几何换算关节位置。工件坐标方向随转台改变,但导轨方向并未旋转;旋转中心、轴间偏置及刀长也参与计算。 +- “刀尖跟随”是相对工件的目标关系。保持同一编程点时,刀尖可在机床空间移动;切换模式时则应保持物理关节,允许坐标数值重新解释。 + +## 课程组织 + +| 页码 | 内容 | +| --- | --- | +| 1–5 | 对原始表述的修正、轴名、两条机械链、AC/BC 桁架模型 | +| 6–7 | 编程点、关节指令、实际反馈;G54/G90/G91 等影响 | +| 8–13 | 非RTCP/RTCP点追踪、C轴算例、工件方向与AC/BC倾转 | +| 14–17 | 旋转中心、偏置、父子顺序、刀长、相对刀轴方向 | +| 18–21 | 联动情形、中间轨迹、模式切换、TCP/倾斜平面/刀补区别 | +| 22–26 | G代码对照、浏览器实验、参数编辑、限位与常见误解 | +| 27–28 | 五道课堂练习及答案 | +| 29–31 | 公式推导、本项目完整参数式、课时安排和资料依据 | + +## 验证与来源 + +- [numeric-evidence.json](numeric-evidence.json):实际加载仓库 WASM,12 个姿态逆解及正解回代、方向增量、切换模式、圆弧与弦线比较;附 WASM SHA256。 +- [verification/layout.json](verification/layout.json):31 页逐页边界、图片加载与页面错误检查。 +- [verification/acceptance.json](verification/acceptance.json):PDF 页数、文本/字体、书签、文件哈希及数值验证汇总。 +- 原理示意图由 Matplotlib 绘制;机床图片来自本项目原创 GLB 渲染,没有使用许可不明的网络机床图片。 +- 已核对 [LinuxCNC 五轴运动学](https://linuxcnc.org/docs/html/motion/5-axis-kinematics.html)、[Switchkins](https://linuxcnc.org/docs/html/motion/switchkins.html)、[CNC Machine Overview](https://linuxcnc.org/docs/html/gcode/machining-center.html),以及本地 `trtfuncs.c`、`control.c`、`428remap.ngc` 和 `429remap.ngc`。 + +本课主要数值例子使用零旋转中心/偏置/刀长差,以分离概念;第20页模式切换使用真实BC示例参数。图的正向变换采用本项目原生AC/BC约定,不据此决定真实电机接线正负。M428/M429 是本项目重映射,不是跨控制器通用标准。内容为仿真教学,不替代真实机床标定与操作规程。 + +## 重新生成 + +不修改应用源码、上游或已有本地改动。Matplotlib/PyPDF 仅安装在临时目录,没有新增项目依赖。 + +```bash +node scripts/generate_rtcp_teaching_data.mjs +PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/generate_rtcp_teaching_figures.py +# 仅重新截图模型时需要 http://127.0.0.1:5174/ 开发服务;已有资产可直接复用。 +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/capture_rtcp_teaching_models.mjs +python3 scripts/generate_rtcp_teaching_html.py +PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/render_rtcp_teaching_pdf.mjs +PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/verify_rtcp_teaching_pdf.py +``` + +换环境需准备 Python Matplotlib/PyPDF、Chrome、Playwright 及 Noto Sans CJK 字体;已交付的 PDF 不依赖这些工具。 diff --git a/docs/teaching/rtcp-five-axis/assets/arc-chord.png b/docs/teaching/rtcp-five-axis/assets/arc-chord.png new file mode 100644 index 0000000..ca4cb30 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/arc-chord.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/bc-frame.png b/docs/teaching/rtcp-five-axis/assets/bc-frame.png new file mode 100644 index 0000000..fdc0c08 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/bc-frame.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/hierarchy.png b/docs/teaching/rtcp-five-axis/assets/hierarchy.png new file mode 100644 index 0000000..3569c48 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/hierarchy.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/identity-no-follow.png b/docs/teaching/rtcp-five-axis/assets/identity-no-follow.png new file mode 100644 index 0000000..75cc74e Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/identity-no-follow.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/machine-ac.png b/docs/teaching/rtcp-five-axis/assets/machine-ac.png new file mode 100644 index 0000000..23adc00 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/machine-ac.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/machine-bc.png b/docs/teaching/rtcp-five-axis/assets/machine-bc.png new file mode 100644 index 0000000..9be77ce Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/machine-bc.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/orientation.png b/docs/teaching/rtcp-five-axis/assets/orientation.png new file mode 100644 index 0000000..c69dec9 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/orientation.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/pivot-offset.png b/docs/teaching/rtcp-five-axis/assets/pivot-offset.png new file mode 100644 index 0000000..f57d4f7 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/pivot-offset.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/rotated-direction.png b/docs/teaching/rtcp-five-axis/assets/rotated-direction.png new file mode 100644 index 0000000..920d8da Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/rotated-direction.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/tcp-follow.png b/docs/teaching/rtcp-five-axis/assets/tcp-follow.png new file mode 100644 index 0000000..3ef099c Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/tcp-follow.png differ diff --git a/docs/teaching/rtcp-five-axis/assets/tool-length.png b/docs/teaching/rtcp-five-axis/assets/tool-length.png new file mode 100644 index 0000000..44bfa9e Binary files /dev/null and b/docs/teaching/rtcp-five-axis/assets/tool-length.png differ diff --git a/docs/teaching/rtcp-five-axis/course.html b/docs/teaching/rtcp-five-axis/course.html new file mode 100644 index 0000000..99e0834 --- /dev/null +++ b/docs/teaching/rtcp-five-axis/course.html @@ -0,0 +1,240 @@ +五轴机床与 RTCP:从各轴独立到刀尖跟随
+
教学课件 · 2026.09

五轴机床与 RTCP

+

从“各轴独立”到“刀尖跟随”

看懂两个坐标系、一棵结构树、
一条运动学计算链。

适用对象:数控入门、五轴调试与仿真教学
主线机型:XYZAC / XYZBC 双转台桁架机床
建议课时:60–90 分钟,可拆成两讲

原理图解 + 数值演算 + 浏览器实验 + 练习答案

原创 BC 桁架模型:XYZ 移动刀具,B–C 转动工件
原创 BC 桁架模型:XYZ 移动刀具,B–C 转动工件
+
核心问题:程序中的 XYZ,究竟是在告诉谁“去哪里”?
+
图:本项目原创 GLB 模型;数值:LinuxCNC WASM 实算。01 / 31
+
+
01 · 先统一理解

你的两点理解,怎样说得更准确?

+

① 非 RTCP:直接轴映射

在本课的双转台结构中,XYZ 带动刀具,A/C 或 B/C 带动工件。

只改变旋转轴指令,不自动触发 XYZ 的刀尖保持补偿。但多个轴仍可在同一段 G 代码中协调插补。

“独立”描述几何映射,不是运动时间完全无关。

② RTCP:保持刀尖相对工件的轨迹

控制器根据编程点、转台角度、旋转中心和标定参数,计算实际关节位置。

工件坐标方向随转台变换,XYZ 关节按需联动。计算还包括平移与偏置,不能只旋转方向箭头。

“跟随”是相对工件满足目标关系,不是世界坐标中的刀尖永远不动。

+
课程约定:先用零工件偏置、零刀长差的简化模型讲清原理,再加入实际参数。
+
[S1][S2];结合本项目 AC/BC 模型。02 / 31
+
+
01 · 结构与轴名

五轴 = 三个直线轴 + 两个旋转轴

+
名称通常的轴线含义本课中的执行机构
X / Y / Z沿三个正交方向平移刀具侧的直线滑台、滑枕
A绕 X 方向的轴线转动AC 机床的外层倾转轴
B绕 Y 方向的轴线转动BC 机床的外层倾转轴
C绕 Z 方向的轴线转动装在倾转台上的内层旋转轴

AC 型:X、Y、Z、A、C

BC 型:X、Y、Z、B、C

XYZABC 六个独立轴同时配置,通常应称六轴。A/B/C 是旋转轴的通用名称,本课不是三只转台轴同时工作。C 的轴线会被父级 A/B 倾转,倾转后不再固定平行于机床 Z。

+
从正方向看懂箭头前,先确认观察视角、父级坐标系和机床正负号约定。
+
[S3] 轴命名;图中数值采用本项目原生变换约定。03 / 31
+
+
01 · 机械拓扑

两条运动链,共用一个底座

+
本课桁架结构:X 带动整个横梁,Y 带动滑座,Z 带动滑枕与刀具。
本课桁架结构:X 带动整个横梁,Y 带动滑座,Z 带动滑枕与刀具。

刀具分支
底座 → X → Y → Z
运动从父节点传给所有子节点。

工件分支
底座 → A/B → C → 工件
A/B 转动时,C 的轴线也随之倾斜。

+
这是一种五轴结构,不是所有五轴机床的通用拓扑;摆头、头台混合型需要不同模型。
+
本项目 trt-xyz-gantry/1;旧标准型在 Z 下另有固定主轴箱节点。04 / 31
+
+
01 · 真实模型

AC 与 BC:外层倾转轴不同

+
AC 桁架:A 绕 X,内层 C 随 A 倾转
AC 桁架:A 绕 X,内层 C 随 A 倾转
BC 桁架:B 绕 Y,内层 C 随 B 倾转
BC 桁架:B 绕 Y,内层 C 随 B 倾转

两者都能实现刀尖相对工件的五轴轨迹,但同一角度数值对应的空间姿态不同;不能只把程序里的 A 字母换成 B,就认为加工姿态完全相同。

+
先识别“哪根轴装在哪根轴上”,再选择运动学模型。
+
图:原创可下载 GLB;不是制造商的标定尺寸图。05 / 31
+
+
02 · 三种位置

不要把“程序点、关节位置、实际反馈”混为一谈

+
量回答的问题典型表示
编程位置 p刀尖相对所用编程参考系要到哪里?(X, Y, Z),加 A/C 或 B/C
关节指令 q各执行轴需要到哪个位置?(J0, J1, J2, J3, J4)
实际反馈 q_actual编码器报告电机/机械轴在哪里?真实设备中可能存在跟随误差
三维刀尖位置 r把关节和模型组合后,刀尖在场景哪里?显示坐标,不是独立运动控制源

理想仿真中“关节指令 = 关节反馈”常成立,但真实机床两者仍须区分。RTCP 的运动学把 p 转成 q;模型再把 q 投影成画面。

+
“实际位置”一词要说明是在说编程坐标、关节指令,还是编码器反馈。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限06 / 31
+
+
02 · G 代码含义

非 RTCP 时,G 代码也不总等于机械绝对位置

+
程序字值→单位 / G90–G91→工件零点 / 补偿→运动学→关节指令
因素为什么不能直接等同
G90 与 G91G90 通常给绝对目标;G91 给相对增量,X10 不一定是到 X=10。
G54 等工件坐标系工件零点可能偏离机床零点;程序 X10 可能对应机床 X30。
G92、刀长等补偿控制器还需处理偏置和刀具参考点。
Identity 直接映射在完成以上处理后,所选坐标与关节才按配置直接对应。

简化例:G54 原点位于机床 (20,30,0),无其他偏置/补偿,程序点 (10,0,5) 对应机床点 (30,30,5)。

+
只有把偏置、单位、增量方式、刀具基准都约定好,才能说“程序值直接对应轴位置”。
+
[S2][S3];本页示例为无旋转的 Identity 情形。07 / 31
+
+
03 · 非 RTCP

只转 C,工件点会离开刀尖

+
俯视图:蓝色为固定机床坐标;绿色为工件;红色为刀尖。Z 保持 20 mm。
俯视图:蓝色为固定机床坐标;绿色为工件;红色为刀尖。Z 保持 20 mm。

起点刀尖对准转台上半径 100 mm 的标记点。只命令 C 从 0° 转到 90°,XYZ 关节不补偿,标记点转到另一处,刀尖仍在原来的机床位置。

+
轴可以独立驱动,不代表“刀具与工件的相对位置”不受其他轴影响。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限08 / 31
+
+
03 · RTCP

同样只改变角度,刀尖跟住工件点

+
同一个工件局部点 p=(100,0,20),C=0° 与 C=90°;旋转中心和偏置取零。
同一个工件局部点 p=(100,0,20),C=0° 与 C=90°;旋转中心和偏置取零。

保持编程点 p 不变,只改变 C。控制器计算所需 XYZ 关节,让刀尖到达标记点的新机床位置。点在工件坐标中不变,在机床坐标中沿圆弧移动。

+
判断“跟随”的参考系是工件,而不是屏幕或机床底座。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限09 / 31
+
+
03 · 数值算例 1

C 转 90°:同一编程点,不同关节位置

+

零偏置、零刀长差,p = (100, 0, 20) mm;A/B = 0°。

C 角度RTCP 编程 XYZRTCP 所需关节 XYZ非 RTCP:只转 C 的关节 XYZ
0°(100, 0, 20)(100.000, 0.000, 20.000)(100, 0, 20)
45°(100, 0, 20)(70.711, 70.711, 20.000)(100, 0, 20)
90°(100, 0, 20)(0.000, 100.000, 20.000)(100, 0, 20)
qx = 100 cos C  qy = 100 sin C  qz = 20

C=90° 时,XYZ 关节目标是 (0,100,20)。这不是控制器偷偷修改了程序点,而是同一点在另一参考系中的正确位置。

+
RTCP:程序坐标可以不变,执行轴位置必须按姿态变化。
+
numeric-evidence.json;原生 WASM IK/FK 双向核对,显示保留3位小数。10 / 31
+
+
04 · 坐标方向

C = 45° 时,“沿工件 X 走”意味着什么?

+

蓝色 XM、YM 是机床固定方向;绿色 XW、YW 随工件转动。

姿态保持 C=45°,编程增量:

ΔpW = (10, 0, 0)

对应的机床直线轴增量:

Δq = (7.071, 7.071, 0)

不是机床 X 导轨真的旋转了,而是 X、Y 导轨合成出所需空间运动方向。

图中工件原点为便于观看作了平移;增量不受原点平移影响。
图中工件原点为便于观看作了平移;增量不受原点平移影响。
+
你的“XYZ 方向随旋转改变”可理解为工件基向量在机床坐标中的方向改变。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限11 / 31
+
+
04 · 数值算例 2

BC 倾转后,沿工件 X 会同时改变机床 X、Y、Z

+

采用本课的正向变换约定:

R = RY(B) · RZ(C)

当 B=30°、C=45° 时:

XW 在 M 中的方向
(0.6124, 0.7071, −0.3536)

所以沿 XW 前进 10 mm:

Δq ≈ (6.124, 7.071, −3.536) mm

倾斜后的坐标方向并不与任何一根直线导轨重合,需要三根直线轴合成。

B=30°、C=45°;红点为工件点 p=(100,0,20) 的机床位置。
B=30°、C=45°;红点为工件点 p=(100,0,20) 的机床位置。
+
RTCP 中“沿工件 X”不是“只让 X 电机动”。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限12 / 31
+
+
04 · AC 与 BC 对照

同样的 30° / 45°,不是同一个姿态

+

仍取 p=(100,0,20) mm,所有旋转中心、偏置和刀长差为零。

结构父级倾转 × 子级旋转倾转30°、C45°时的关节XYZ
ACRX(A) · RZ(C)(70.711, 51.237, 52.676)
BCRY(B) · RZ(C)(71.237, 70.711, -18.035)

AC:绕 X 倾转

C 先改变平面位置,A 再把局部 Y/Z 方向倾斜。

BC:绕 Y 倾转

C 先改变平面位置,B 再把局部 X/Z 方向倾斜。

矩阵从右向左作用于列向量;这是坐标转换次序,不是要求 G 代码先运动 C 再运动 A/B。插补时两轴可以同时运动。

+
运动学类型选错,即使每个轴都会动,刀尖也不会沿正确的相对轨迹走。
+
numeric-evidence.json;零偏置原生 WASM 结果。13 / 31
+
+
05 · 为什么还需要几何参数

同样转 90°,绕不同的中心会到不同的位置

+
二维俯视例:起点相同,旋转角度相同,仅旋转中心不同。
二维俯视例:起点相同,旋转角度相同,仅旋转中心不同。
pM = O + R · (p − O)

计算顺序:先减去旋转中心 → 旋转 → 再加回中心。不能只计算 R·p,否则相当于错误地绕坐标零点转。

+
RTCP 不只是“方向变换”,还包括“绕哪里转”的平移关系。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限14 / 31
+
+
05 · 轴间偏置与变换顺序

C 轴装在倾转轴上:父子关系不能交换

+

先看几何,再写方程

P:C 轴零位参考点。
D:倾转轴与 C 轴之间的偏置。
T=P+D:倾转轴参考位置。

C 旋转后的点还要随 A/B 倾转;偏置也必须放在正确的父子层级中。

URDF / GLB 里的对应关系

节点本项目零位 origin
A/B,父节点为底座P + D
C,父节点为 A/B−D
work,父节点为 C−P
qXYZ = P + D + Rtilt [ RC (p − P) − D ] (刀长差为零)

这是本项目 AC/BC TRT 约定。更一般的机床使用完整的刚体变换链;不能把这三个参数关系硬套到摆头机床。长度在运行配置中为 mm,URDF 为 m。

+
RtiltRC 通常不等于 RCRtilt;机械安装顺序决定计算顺序。
+
本地 trtfuncs.c;本项目 URDF profile / D11 / D12。15 / 31
+
+
05 · 刀长与受控点

控制的是刀尖,不只是主轴箱

+
侧视示意:同一主轴参考位置,刀长不同会产生不同刀尖位置。
侧视示意:同一主轴参考位置,刀长不同会产生不同刀尖位置。

刀长改变时,为保持同一个刀尖目标,需要重新计算主轴参考点的位置。必须明确刀具长度的测量基准、正负号、刀补状态,以及模型上“tool”节点代表哪里。

教学主算例采用刀长差为零。本项目原生 TRT 使用相对于 master tool 的 tool-offset 约定,不能把它直接当作任意模型网格的总长度。

+
同一组关节位置 + 不同刀具标定,不一定得到同一个刀尖位置。
+
[S1][S3];实际使用以机床和控制器的刀具标定约定为准。16 / 31
+
+
06 · 姿态的物理意义

双转台没有转动主轴,却改变了相对刀轴方向

+
侧视:主轴在机床中保持竖直,工件随转台倾斜,二者的相对夹角改变。
侧视:主轴在机床中保持竖直,工件随转台倾斜,二者的相对夹角改变。

在本课双转台机床中,刀轴在机床坐标里的方向固定;工件转动后,刀轴在工件坐标里的方向改变。RTCP 根据指定角度协调刀尖位置,不会自动推断曲面法向。

+
RTCP 不是“自动让刀轴垂直于任意曲面”;姿态仍由程序、CAM 或操作者给定。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限17 / 31
+
+
06 · 三种常见联动情形

分清“保持点”“沿方向走”“同时改变位置和姿态”

+
输入变化RTCP 应做什么观察重点
XYZ 不变;A/B、C 改变让刀尖保持同一工件编程点;XYZ关节可能联动。刀尖与工件标记点不分离。
角度不变;XYZ 改变沿当前工件参考系定义的方向移动。机床多轴合成编程方向。
XYZ 与角度同时改变执行变化的编程轨迹,同时维持角度对应的几何关系。全过程相对轨迹正确,不只看终点。
XYZ 不变;点恰在 C 轴线上;只转 C该点机床位置可以不变。XYZ 不动不一定是故障。

“五轴联动”不要求每个时刻五轴速度都非零。非 RTCP 也能多轴同步加工:CAM/后置可以预先按指定机床几何计算轴目标,但这不等于控制器开启了实时刀尖补偿。

+
每次解释一个动作,先说清哪些程序量保持不变、哪些程序量在改变。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限18 / 31
+
+
06 · 全过程的重要性

终点都正确,不代表中间轨迹正确

+

同一个工件点绕 C 转动,理想半径为 100 mm。

RTCP:刀尖跟随圆弧。
不做 RTCP:若只让 X/Y 线性插补到相同终点,刀尖可能走弦线。

中间位置X / Y
圆弧,C=45°70.711 / 70.711
弦线,50%进度50.000 / 50.000

图示采用共同线性进度比较几何路径,不是断言所有控制器的加减速过程相同。

中途差距 29.289 mm;起点和终点却完全相同。
中途差距 29.289 mm;起点和终点却完全相同。
+
验收 RTCP 要看连续采样、刀尖相对轨迹和关节约束,不能只比首末坐标。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限19 / 31
+
+
07 · 模式切换

M429 ↔ M428:坐标可以变,机床不能无故跳动

+

本项目 BC 示例:保持同一组物理关节,切换坐标解释。

量M429 / IdentityM428 / TCP
物理关节 XYZ(0.000, 0.000, 44.586)(0.000, 0.000, 44.586)
物理关节 B / C4.8675° / 179.88°4.8675° / 179.88°
显示/解释的 XYZ(0.000, 0.000, 44.586)(-29.885, 27.975, 43.985)
三维刀尖同一空间位置同一空间位置
取当前关节 q→切换运动学→新模式正解 p→同步 TP / 解释器

本例使用真实 BC 模型参数 P=(−18,14,12)、D=(22,0,−40) mm,刀长差0。切换之后再给运动指令,才产生运动。

+
若切换时强行保持旧 XYZ 数字并重新逆解,就可能错误地改变物理关节。
+
[S2] 同步原则;本地 control.c::handle_kinematicsSwitch;WASM实算。20 / 31
+
+
07 · 控制器功能边界

RTCP、旋转工作平面、刀补,不是同一个开关

+
功能主要解决的问题不要误认为
RTCP / TCP 运动学姿态变化时,按机床结构实现目标刀尖相对轨迹。所有控制器都会以完全相同方式解释XYZ。
工件坐标系 / 倾斜工作平面选择编程参考原点或定义编程方向。只旋转工作平面就自动具备完整五轴RTCP。
刀长补偿把刀具参考点换算到实际受控刀尖。更换刀具后只更新网格外观就够了。
机床标定确定中心、偏置、轴向、正负号和长度。只要支持RTCP,错误几何参数也会自动纠正。

不同控制器可能分别使用 TCP、TCPM、RTCP 等名称,并把倾斜平面/刀补组合进不同指令。本课明确讲本项目的 AC/BC 双转台语义,不推定所有品牌一致。

+
换控制器时先核对“参考系、受控点、角度定义、指令组合”,不要只对照功能名称。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限21 / 31
+
+
08 · 程序对照

同样写 C90,开关状态决定 XYZ 是否补偿

+

M429:直接映射

G21 G90 G94
+M429
+G1 X100 Y0 Z20 A0 C0 F300
+G1 C90 F60

后一段只改变 C。
XYZ 关节保持 (100,0,20),
工件标记点会离开刀尖。

M428:RTCP

G21 G90 G94
+M428
+G1 X100 Y0 Z20 A0 C0 F300
+G1 C90 F60

后一段保持编程 XYZ。
XYZ 关节变到 (0,100,20),
刀尖仍对准同一个工件点。

仅为零偏置/零刀长差 AC 教学片段,起始角度和当前模态需已知;BC 用 B0。现有下载模型参数非零,不能期待相同数字。M428/M429 为本项目重映射,不是通用标准M码;F值只作插补示意,实际需按机床的旋转/混合进给规则设定。

+
程序字值相同,不代表开关前后表达的是同一个机械目标。
+
本项目 xyzac/xyzbc-trt.ini,428remap.ngc / 429remap.ngc。22 / 31
+
+
08 · 浏览器课堂实验

用 AC/BC 桁架模型验证,而不是只看公式

+
  1. 加载:打开“导入机床模型”,选 AC 或 BC 桁架示例;记录旋转中心与偏置。
  2. 准备:确认空闲,开机并回零;选一个离 C 轴线有一定距离的刀尖位置。
  3. Identity:选择 M429,只 Jog A/B 或 C;观察 XYZ 关节是否保持。
  4. 切换:停止后选择 M428;观察关节/刀尖不跳,XYZ 坐标可能变化。
  5. TCP:再次 Jog 旋转轴;观察 XYZ 关节按需补偿、刀尖相对工件点保持。
  6. 对照:先停止,再切回 M429;重复方向相同的小幅 Jog,比较两种行为。

实验先用小幅角度并远离限位。记录的是“每次试验起点相对工件的同一点”;切换或重新定位后,不要把两个不同起点混作同一个目标。

+
同时观察三项:程序XYZ、J0…J4、刀尖与工件的相对关系。
+
页面 http://127.0.0.1:5174/;浏览器仿真教学,不是机床现场操作规程。23 / 31
+
+
08 · 参数化实验

改几何参数后,为什么仍应保留同一个模型?

+

正确的数据流

参数表:中心 / 偏置↓有效 URDF:节点零位关系↓INI → Worker → WASM↓关节 → 原导入模型

课堂观察

  • 同一 GLB 的网格、材质和文件身份保持。
  • 新的轴心与偏置应进入运行结构和运动学。
  • 相同程序点和角度,可能得到不同的 XYZ 关节值。
  • 参数改变后需重新回零并重新解析程序。

源GLB不自动改写;可保存INI记录参数。改变轴心不等于自动重建支架、铸件等CAD外形,也不提供碰撞检测。

+
模型保留和参数生效必须同时成立;只改外观或只改计算都会造成误导。
+
本项目 D11 / E09:AC、BC各18个姿态/刀长样本验证。24 / 31
+
+
09 · 约束与故障

“工件点可达”不等于“每个关节都没到限位”

+

两层约束

约束检查什么
坐标限位编程轴/坐标允许的范围
关节限位实际执行机构的物理行程
动力学约束速度、加速度等能力

RTCP 旋转时,即使编程 XYZ 不变,补偿出来的 X/Y/Z 关节仍可能触及边界。

本项目排障实例

BC 配置允许较大的 B 坐标范围,但对应 JOINT_3 上限为 50°。

旧问题:越界 → 运动计算失败 → 事件时钟不同步 → Connection ERROR。

修复后:按关节约束停止,保留正确时钟,可松开并反向 Jog。

本仿真对 RTCP 越界采用最后有效伺服样本停止,不等同于工业控制器的全路径限位预测与减速保护。范围和行为必须分别验证。

+
正常限位阻止是一条运动诊断;序号缺口或连接错误是软件故障,不是RTCP原理。
+
本项目 R07 / E11;不据此宣称硬件安全或碰撞防护。25 / 31
+
+
09 · 常见误解

六个问题,快速判断是否真正理解

+
说法准确解释
“非RTCP时各轴互相没有影响。”没有自动补偿;但工件转动当然会改变它与刀具的相对位置。
“RTCP把X/Y/Z导轨转了。”导轨不转,是工件基方向改变,由固定导轨合成空间运动。
“RTCP时XYZ永远不变。”只在保持同一编程点时程序XYZ不变;关节XYZ通常变化。
“只要开RTCP,刀尖在空间就不动。”刀尖可在机床空间移动,以保持它相对工件的目标关系。
“C转了但XYZ没动,一定坏了。”目标点恰在C轴线上时可能正确,应先检查几何。
“切换模式时XYZ数字跳,必须修好。”要检查关节和物理刀尖是否跳;新参考系里的数值改变可能正确。
+
先说参考系,再说位置;先看结构,再说联动。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限26 / 31
+
+
10 · 课堂练习

请先画箭头,再写结论

+
  1. 点追踪:零偏置,C=0°,工件点 p=(80,0,10)。只转 C 到90°,分别写出 Identity 和 RTCP 的 XYZ 关节目标。
  2. 方向合成:C=30°且倾转角为0°,沿工件 +X 方向走20mm,机床 X/Y 各应增加多少?
  3. 模式切换:M429切到M428时,XYZ显示值变化、J0…J4不变、刀尖不动,是否正常?为什么?
  4. 偏置识别:BC模型 C 的局部 origin=(-0.022,0,0.040)m,倾转轴 origin=(0.004,0.014,-0.028)m。求本项目 P、D,单位mm。
  5. 结构判断:C节点错误地挂在Z滑枕下。只Jog X时会发生什么?为什么不能靠RTCP开关解决?
+
建议分组讨论 8–10 分钟;答案在下一页。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限27 / 31
+
+
10 · 参考答案

用“相对谁”检查每一步

+
  1. Identity:(80,0,10);RTCP:(0,80,10)。前者刀尖留在机床原位置,后者继续对准同一工件点。
  2. ΔX=20cos30°=17.321mm;ΔY=20sin30°=10.000mm。方向向量长度仍为20mm,机床Z不变。
  3. 正常。运动学切换重新解释当前物理状态。坐标可以变,关节和刀尖应保持。
  4. P=T+U=(-18,14,12)mm;D=−U=(22,0,−40)mm。先统一单位,再按父子关系相加,不能直接拿URDF的米当毫米。
  5. C及工件会错误地随XYZ移动。这是结构树错误,不是开关模式能修复的;需把A/B→C分支正确挂回底座。
+
检查顺序:轴数 → 层级 → 单位/正负号 → 几何参数 → 运动学 → 程序与状态。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限28 / 31
+
+
附录 A · 数学推导

从一根 C 轴,推到两根旋转轴

+

绕 C 的平面变换

x′ = x cos C − y sin C
+y′ = x sin C + y cos C
+z′ = z

AC:再绕 X 倾转 A

q_x = x′
+q_y = y′ cos A − z′ sin A
+q_z = y′ sin A + z′ cos A

BC:再绕 Y 倾转 B

q_x = x′ cos B + z′ sin B
+q_y = y′
+q_z = −x′ sin B + z′ cos B

这里所有旋转中心、轴间偏置及刀长差为零,列向量采用右手正向变换。

式中的 q 是关节目标;若导入的是其他结构、符号约定或参考点,必须重新建立变换链。

+
先学会解释“这一步在谁的坐标系中发生”,再记忆公式。
+
与本地 trtfuncs.c 零偏置逆解一致;三角函数实际以弧度计算。29 / 31
+
+
附录 B · 本项目完整参数式

加入旋转中心、偏置与 master-tool 刀长差

+
DL = D + L ez
qXYZ = P + DL + Rtilt [ RC (p − P) − DL ]
符号ACBC
RtiltRX(A)RY(B)
D(0, Dy, Dz)(Dx, 0, Dz)
旋转关节qA=A,qC=CqB=B,qC=C

P为原生rot-point;L为本项目/原生TRT的tool-offset标定量;ez=(0,0,1)。本式返回关节XYZ,不是未经处理的网格刀尖世界坐标。G54等解释器偏置在输入p形成前已按控制器规则处理。

这一刀长表达是本项目约定,不能替代任意控制器的通用刀补说明。主课例子L=0;实际机床应以标定模型及其完整前后向验证为准。

+
工程实现不在画面中“补一个偏移”;应让同一组结构数据贯穿解释器、运动学和模型。
+
原生源码:linuxcnc/src/emc/kinematics/trtfuncs.c,xyzac/xyzbcKinematicsInverse。30 / 31
+
+
附录 C · 教学安排与依据

怎样讲、怎样验证、怎样继续学习

+

建议授课节奏

10分钟:结构、轴名与三种位置。
20分钟:C轴点跟踪、方向合成、AC/BC倾转。
15分钟:旋转中心、偏置、刀长与模式切换。
15分钟:浏览器实验与错误诊断。
10分钟:练习、答案和模型参数核对。

本课验算

12个姿态由真实WASM逆解计算,并通过正解回代;另核对C45°方向增量、BC切换示例及弧弦差。详见同目录 numeric-evidence.json。

图形为原创教学示意及本项目GLB截图,不用于制造尺寸标定。

官方资料与本地实现

[S1] LinuxCNC · 5-Axis Kinematics
AC/BC结构、运动学及偏置。

[S2] LinuxCNC · Switchable Kinematics
模式切换、identityfirst、同步要求。

[S3] LinuxCNC · CNC Machine Overview
轴名、坐标、受控点与协调运动。

本地:trtfuncs.c;control.c;428remap.ngc / 429remap.ngc;docs/glb-machine/。M428=TCP、M429=Identity仅适用于本项目配置。

资料核对日期:2026-09-18。不同版本/品牌的指令与坐标约定应另行核查。

+
一句话记忆:程序描述相对工件的目标,运动学把目标换算成各关节应该怎样动。
+
五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限31 / 31
+
\ No newline at end of file diff --git a/docs/teaching/rtcp-five-axis/numeric-evidence.json b/docs/teaching/rtcp-five-axis/numeric-evidence.json new file mode 100644 index 0000000..75eebf0 --- /dev/null +++ b/docs/teaching/rtcp-five-axis/numeric-evidence.json @@ -0,0 +1,481 @@ +{ + "report_id": "rtcp-teaching-numerics-v1", + "status": "verified", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "convention": "Native AC: Rx(A) Rz(C); BC: Ry(B) Rz(C). Main teaching examples P=D=tool_offset=0, mm/deg.", + "cases": [ + { + "coordinates": "XYZAC", + "samples": [ + { + "tilt": 0, + "c": 0, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 100, + 0, + 20, + 0, + 0 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 0, + "c": 45, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 70.71067811865476, + 70.71067811865474, + 20, + 0, + 45 + ], + "forward": { + "x": 100, + "y": -7.105427357601002e-15, + "z": 20, + "a": 0, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 0, + "c": 90, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 6.123233995736766e-15, + 100, + 20, + 0, + 90 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 0, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 30, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 100, + -9.999999999999998, + 17.320508075688775, + 30, + 0 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 30, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 45, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 30, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 70.71067811865476, + 51.23724356957945, + 52.67584713501614, + 30, + 45 + ], + "forward": { + "x": 99.99999999999999, + "y": -3.552713678800501e-15, + "z": 20.000000000000004, + "a": 30, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 90, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 30, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 6.123233995736766e-15, + 76.60254037844388, + 67.32050807568876, + 30, + 90 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 30, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + } + ], + "xw_increment_10_at_c45": [ + 7.0710678118654755, + 7.0710678118654755, + 0, + 0, + 0 + ] + }, + { + "coordinates": "XYZBC", + "samples": [ + { + "tilt": 0, + "c": 0, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 100, + 0, + 20, + 0, + 0 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 0, + "c": 45, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 70.71067811865476, + 70.71067811865474, + 20, + 0, + 45 + ], + "forward": { + "x": 100, + "y": -7.105427357601002e-15, + "z": 20, + "a": 0, + "b": 0, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 0, + "c": 90, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 6.123233995736766e-15, + 100, + 20, + 0, + 90 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 0, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 0, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 30, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 96.60254037844388, + 0, + -32.67949192431122, + 30, + 0 + ], + "forward": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 30, + "c": 0, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 45, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 30, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 71.23724356957945, + 70.71067811865474, + -18.034830983638596, + 30, + 45 + ], + "forward": { + "x": 99.99999999999997, + "y": 6.217248937900877e-15, + "z": 19.999999999999996, + "a": 0, + "b": 30, + "c": 45, + "u": 0, + "v": 0, + "w": 0 + } + }, + { + "tilt": 30, + "c": 90, + "programmed": { + "x": 100, + "y": 0, + "z": 20, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + }, + "joints": [ + 10.000000000000004, + 100, + 17.32050807568877, + 30, + 90 + ], + "forward": { + "x": 100, + "y": -1.7763568394002505e-15, + "z": 20, + "a": 0, + "b": 30, + "c": 90, + "u": 0, + "v": 0, + "w": 0 + } + } + ], + "xw_increment_10_at_c45": [ + 7.0710678118654755, + 7.0710678118654755, + 0, + 0, + 0 + ] + } + ], + "switch_example": { + "offsets": { + "x_rot_point": -18, + "y_rot_point": 14, + "z_rot_point": 12, + "x_offset": 22, + "y_offset": 0, + "z_offset": -40, + "tool_offset": 0 + }, + "physical": [ + 0, + 0, + 44.5858, + 4.8675, + 179.88 + ], + "tcp_pose": { + "x": -29.88468896947041, + "y": 27.97513943472579, + "z": 43.984618633524605, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + }, + "identity_pose": { + "x": 0, + "y": 0, + "z": 44.5858, + "a": 0, + "b": 4.8675, + "c": 179.88, + "u": 0, + "v": 0, + "w": 0 + } + }, + "chord_midpoint": { + "compensated": [ + 70.71067811865474, + 70.71067811865474, + 20 + ], + "uncompensated_joint_interpolation": [ + 50, + 50, + 20 + ], + "distance": 29.289321881345245 + } +} diff --git a/docs/teaching/rtcp-five-axis/outline.json b/docs/teaching/rtcp-five-axis/outline.json new file mode 100644 index 0000000..30e79a5 --- /dev/null +++ b/docs/teaching/rtcp-five-axis/outline.json @@ -0,0 +1,157 @@ +[ + { + "page": 1, + "chapter": "教学课件 · 2026.09", + "title": "五轴机床与 RTCP" + }, + { + "page": 2, + "chapter": "01 · 先统一理解", + "title": "你的两点理解,怎样说得更准确?" + }, + { + "page": 3, + "chapter": "01 · 结构与轴名", + "title": "五轴 = 三个直线轴 + 两个旋转轴" + }, + { + "page": 4, + "chapter": "01 · 机械拓扑", + "title": "两条运动链,共用一个底座" + }, + { + "page": 5, + "chapter": "01 · 真实模型", + "title": "AC 与 BC:外层倾转轴不同" + }, + { + "page": 6, + "chapter": "02 · 三种位置", + "title": "不要把“程序点、关节位置、实际反馈”混为一谈" + }, + { + "page": 7, + "chapter": "02 · G 代码含义", + "title": "非 RTCP 时,G 代码也不总等于机械绝对位置" + }, + { + "page": 8, + "chapter": "03 · 非 RTCP", + "title": "只转 C,工件点会离开刀尖" + }, + { + "page": 9, + "chapter": "03 · RTCP", + "title": "同样只改变角度,刀尖跟住工件点" + }, + { + "page": 10, + "chapter": "03 · 数值算例 1", + "title": "C 转 90°:同一编程点,不同关节位置" + }, + { + "page": 11, + "chapter": "04 · 坐标方向", + "title": "C = 45° 时,“沿工件 X 走”意味着什么?" + }, + { + "page": 12, + "chapter": "04 · 数值算例 2", + "title": "BC 倾转后,沿工件 X 会同时改变机床 X、Y、Z" + }, + { + "page": 13, + "chapter": "04 · AC 与 BC 对照", + "title": "同样的 30° / 45°,不是同一个姿态" + }, + { + "page": 14, + "chapter": "05 · 为什么还需要几何参数", + "title": "同样转 90°,绕不同的中心会到不同的位置" + }, + { + "page": 15, + "chapter": "05 · 轴间偏置与变换顺序", + "title": "C 轴装在倾转轴上:父子关系不能交换" + }, + { + "page": 16, + "chapter": "05 · 刀长与受控点", + "title": "控制的是刀尖,不只是主轴箱" + }, + { + "page": 17, + "chapter": "06 · 姿态的物理意义", + "title": "双转台没有转动主轴,却改变了相对刀轴方向" + }, + { + "page": 18, + "chapter": "06 · 三种常见联动情形", + "title": "分清“保持点”“沿方向走”“同时改变位置和姿态”" + }, + { + "page": 19, + "chapter": "06 · 全过程的重要性", + "title": "终点都正确,不代表中间轨迹正确" + }, + { + "page": 20, + "chapter": "07 · 模式切换", + "title": "M429 ↔ M428:坐标可以变,机床不能无故跳动" + }, + { + "page": 21, + "chapter": "07 · 控制器功能边界", + "title": "RTCP、旋转工作平面、刀补,不是同一个开关" + }, + { + "page": 22, + "chapter": "08 · 程序对照", + "title": "同样写 C90,开关状态决定 XYZ 是否补偿" + }, + { + "page": 23, + "chapter": "08 · 浏览器课堂实验", + "title": "用 AC/BC 桁架模型验证,而不是只看公式" + }, + { + "page": 24, + "chapter": "08 · 参数化实验", + "title": "改几何参数后,为什么仍应保留同一个模型?" + }, + { + "page": 25, + "chapter": "09 · 约束与故障", + "title": "“工件点可达”不等于“每个关节都没到限位”" + }, + { + "page": 26, + "chapter": "09 · 常见误解", + "title": "六个问题,快速判断是否真正理解" + }, + { + "page": 27, + "chapter": "10 · 课堂练习", + "title": "请先画箭头,再写结论" + }, + { + "page": 28, + "chapter": "10 · 参考答案", + "title": "用“相对谁”检查每一步" + }, + { + "page": 29, + "chapter": "附录 A · 数学推导", + "title": "从一根 C 轴,推到两根旋转轴" + }, + { + "page": 30, + "chapter": "附录 B · 本项目完整参数式", + "title": "加入旋转中心、偏置与 master-tool 刀长差" + }, + { + "page": 31, + "chapter": "附录 C · 教学安排与依据", + "title": "怎样讲、怎样验证、怎样继续学习" + } +] diff --git a/docs/teaching/rtcp-five-axis/verification/acceptance.json b/docs/teaching/rtcp-five-axis/verification/acceptance.json new file mode 100644 index 0000000..46a9a46 --- /dev/null +++ b/docs/teaching/rtcp-five-axis/verification/acceptance.json @@ -0,0 +1,268 @@ +{ + "report_id": "rtcp-teaching-pdf-v1", + "status": "verified", + "pages": [ + { + "page": 1, + "characters": 260, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 2, + "characters": 352, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 3, + "characters": 345, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 4, + "characters": 222, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 5, + "characters": 198, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 6, + "characters": 359, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 7, + "characters": 396, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 8, + "characters": 211, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 9, + "characters": 209, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 10, + "characters": 476, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 11, + "characters": 282, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 12, + "characters": 313, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 13, + "characters": 401, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 14, + "characters": 209, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 15, + "characters": 416, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 16, + "characters": 277, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 17, + "characters": 223, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 18, + "characters": 407, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 19, + "characters": 307, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 20, + "characters": 482, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 21, + "characters": 412, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 22, + "characters": 456, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 23, + "characters": 437, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 24, + "characters": 324, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 25, + "characters": 402, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 26, + "characters": 369, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 27, + "characters": 407, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 28, + "characters": 398, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 29, + "characters": 387, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 30, + "characters": 465, + "width_pt": 960.0, + "height_pt": 540.0 + }, + { + "page": 31, + "characters": 650, + "width_pt": 960.0, + "height_pt": 540.0 + } + ], + "pdf": "五轴机床与RTCP-教学课件.pdf", + "bytes": 1949318, + "sha256": "61f7c6923b63ba687b1cb85eeca8688f66d2ee87abccfdc314babf799786e365", + "bookmarks": 39, + "embedded_fonts": { + "/AAAAAA+NotoSansCJKsc-Bold": true, + "/BAAAAA+NotoSansCJKsc-Bold": true, + "/CAAAAA+NotoSansCJKsc-Regular": true, + "/DAAAAA+DejaVuSansMono": true, + "/EAAAAA+DejaVuSansMono": true + }, + "numeric_report_id": "rtcp-teaching-numerics-v1", + "wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6", + "layout_report": "verification/layout.json", + "evidence": [ + { + "path": "course.html", + "sha256": "1ff8f4aa3797e83421d0c23b380ef0cb267cd46b965dd98b37d055c7b908019f" + }, + { + "path": "numeric-evidence.json", + "sha256": "ebfc8b3d579c144f29943aefa7565ca919027c733d4262e7e0f3c51a211ecf63" + }, + { + "path": "outline.json", + "sha256": "48d31c947eb18b96c17ee7bc9345ffa671a88290e35e7bfaed8d271331feaa38" + }, + { + "path": "verification/layout.json", + "sha256": "968f33a16651ca340697f348d4c680541fb114b316131140362b81d6a2a409cf" + }, + { + "path": "assets/arc-chord.png", + "sha256": "947bfc50ca994ae58b63ed0b198048854690c402a8a2b48d72e306920bf5a93b" + }, + { + "path": "assets/bc-frame.png", + "sha256": "b6c467d33eff25e4e02bd04b601388ee4beca460c47426cb906c2ce628dd1eb0" + }, + { + "path": "assets/hierarchy.png", + "sha256": "cf76f72ffd315ad17567bf6de507d16c283d3a1882c6f70a9398a04434ccc989" + }, + { + "path": "assets/identity-no-follow.png", + "sha256": "1ecb07bdeb7a5015b6c17b32fb3611bec78d8067fb93057d39d5f408eb166f80" + }, + { + "path": "assets/machine-ac.png", + "sha256": "ec538e0c0ebe016a1f464ce519875b3338dd60867627ffad2e0a7cdfc425a0ab" + }, + { + "path": "assets/machine-bc.png", + "sha256": "46c37c21ef8dbaad203d2aa930796cc96278d9371d28584ac7aade5064b39308" + }, + { + "path": "assets/orientation.png", + "sha256": "56e9a6df913e805e07bd00a350f8da9eab4def2cfedaa3ce0cf1b191e65def74" + }, + { + "path": "assets/pivot-offset.png", + "sha256": "fc378a8bf7aaf6b8969889bbd4a8f763bc71b01505d063402c0ea4251f06abcd" + }, + { + "path": "assets/rotated-direction.png", + "sha256": "9fe171e5e6c95c5f81dd0b395a24351972da7e5d18a37d33e19a6ed9d0a0f645" + }, + { + "path": "assets/tcp-follow.png", + "sha256": "875eba48ea1cb7b9f990ddc556d38cb4e855af77a3c29130f8c6c249fd3817c8" + }, + { + "path": "assets/tool-length.png", + "sha256": "168941e33624f883b09c1cdf54b36ed6e31ba260c7f1abdc495fee3b54cc834a" + } + ] +} diff --git a/docs/teaching/rtcp-five-axis/verification/layout.json b/docs/teaching/rtcp-five-axis/verification/layout.json new file mode 100644 index 0000000..06c9a2f --- /dev/null +++ b/docs/teaching/rtcp-five-axis/verification/layout.json @@ -0,0 +1,312 @@ +{ + "pages": [ + { + "page": 1, + "title": "五轴机床与 RTCP", + "clipped": [], + "content_overflow": false, + "title_right": 428.75, + "images": [ + { + "src": "assets/machine-bc.png", + "complete": true + } + ] + }, + { + "page": 2, + "title": "你的两点理解,怎样说得更准确?", + "clipped": [], + "content_overflow": false, + "title_right": 594.015625, + "images": [] + }, + { + "page": 3, + "title": "五轴 = 三个直线轴 + 两个旋转轴", + "clipped": [], + "content_overflow": false, + "title_right": 561.171875, + "images": [] + }, + { + "page": 4, + "title": "两条运动链,共用一个底座", + "clipped": [], + "content_overflow": false, + "title_right": 486.015625, + "images": [ + { + "src": "assets/hierarchy.png", + "complete": true + } + ] + }, + { + "page": 5, + "title": "AC 与 BC:外层倾转轴不同", + "clipped": [], + "content_overflow": false, + "title_right": 488.75, + "images": [ + { + "src": "assets/machine-ac.png", + "complete": true + }, + { + "src": "assets/machine-bc.png", + "complete": true + } + ] + }, + { + "page": 6, + "title": "不要把“程序点、关节位置、实际反馈”混为一谈", + "clipped": [], + "content_overflow": false, + "title_right": 846.015625, + "images": [] + }, + { + "page": 7, + "title": "非 RTCP 时,G 代码也不总等于机械绝对位置", + "clipped": [], + "content_overflow": false, + "title_right": 773.21875, + "images": [] + }, + { + "page": 8, + "title": "只转 C,工件点会离开刀尖", + "clipped": [], + "content_overflow": false, + "title_right": 481.796875, + "images": [ + { + "src": "assets/identity-no-follow.png", + "complete": true + } + ] + }, + { + "page": 9, + "title": "同样只改变角度,刀尖跟住工件点", + "clipped": [], + "content_overflow": false, + "title_right": 594.015625, + "images": [ + { + "src": "assets/tcp-follow.png", + "complete": true + } + ] + }, + { + "page": 10, + "title": "C 转 90°:同一编程点,不同关节位置", + "clipped": [], + "content_overflow": false, + "title_right": 654.984375, + "images": [] + }, + { + "page": 11, + "title": "C = 45° 时,“沿工件 X 走”意味着什么?", + "clipped": [], + "content_overflow": false, + "title_right": 705.3125, + "images": [ + { + "src": "assets/rotated-direction.png", + "complete": true + } + ] + }, + { + "page": 12, + "title": "BC 倾转后,沿工件 X 会同时改变机床 X、Y、Z", + "clipped": [], + "content_overflow": false, + "title_right": 798.921875, + "images": [ + { + "src": "assets/bc-frame.png", + "complete": true + } + ] + }, + { + "page": 13, + "title": "同样的 30° / 45°,不是同一个姿态", + "clipped": [], + "content_overflow": false, + "title_right": 602.5, + "images": [] + }, + { + "page": 14, + "title": "同样转 90°,绕不同的中心会到不同的位置", + "clipped": [], + "content_overflow": false, + "title_right": 731.203125, + "images": [ + { + "src": "assets/pivot-offset.png", + "complete": true + } + ] + }, + { + "page": 15, + "title": "C 轴装在倾转轴上:父子关系不能交换", + "clipped": [], + "content_overflow": false, + "title_right": 661.796875, + "images": [] + }, + { + "page": 16, + "title": "控制的是刀尖,不只是主轴箱", + "clipped": [], + "content_overflow": false, + "title_right": 522.015625, + "images": [ + { + "src": "assets/tool-length.png", + "complete": true + } + ] + }, + { + "page": 17, + "title": "双转台没有转动主轴,却改变了相对刀轴方向", + "clipped": [], + "content_overflow": false, + "title_right": 774.015625, + "images": [ + { + "src": "assets/orientation.png", + "complete": true + } + ] + }, + { + "page": 18, + "title": "分清“保持点”“沿方向走”“同时改变位置和姿态”", + "clipped": [], + "content_overflow": false, + "title_right": 882.015625, + "images": [] + }, + { + "page": 19, + "title": "终点都正确,不代表中间轨迹正确", + "clipped": [], + "content_overflow": false, + "title_right": 594.015625, + "images": [ + { + "src": "assets/arc-chord.png", + "complete": true + } + ] + }, + { + "page": 20, + "title": "M429 ↔ M428:坐标可以变,机床不能无故跳动", + "clipped": [], + "content_overflow": false, + "title_right": 835.203125, + "images": [] + }, + { + "page": 21, + "title": "RTCP、旋转工作平面、刀补,不是同一个开关", + "clipped": [], + "content_overflow": false, + "title_right": 794.890625, + "images": [] + }, + { + "page": 22, + "title": "同样写 C90,开关状态决定 XYZ 是否补偿", + "clipped": [], + "content_overflow": false, + "title_right": 713.203125, + "images": [] + }, + { + "page": 23, + "title": "用 AC/BC 桁架模型验证,而不是只看公式", + "clipped": [], + "content_overflow": false, + "title_right": 718.671875, + "images": [] + }, + { + "page": 24, + "title": "改几何参数后,为什么仍应保留同一个模型?", + "clipped": [], + "content_overflow": false, + "title_right": 774.015625, + "images": [] + }, + { + "page": 25, + "title": "“工件点可达”不等于“每个关节都没到限位”", + "clipped": [], + "content_overflow": false, + "title_right": 810.015625, + "images": [] + }, + { + "page": 26, + "title": "六个问题,快速判断是否真正理解", + "clipped": [], + "content_overflow": false, + "title_right": 594.015625, + "images": [] + }, + { + "page": 27, + "title": "请先画箭头,再写结论", + "clipped": [], + "content_overflow": false, + "title_right": 414.015625, + "images": [] + }, + { + "page": 28, + "title": "用“相对谁”检查每一步", + "clipped": [], + "content_overflow": false, + "title_right": 450.015625, + "images": [] + }, + { + "page": 29, + "title": "从一根 C 轴,推到两根旋转轴", + "clipped": [], + "content_overflow": false, + "title_right": 525.96875, + "images": [] + }, + { + "page": 30, + "title": "加入旋转中心、偏置与 master-tool 刀长差", + "clipped": [], + "content_overflow": false, + "title_right": 744.5625, + "images": [] + }, + { + "page": 31, + "title": "怎样讲、怎样验证、怎样继续学习", + "clipped": [], + "content_overflow": false, + "title_right": 594.015625, + "images": [] + } + ], + "errors": [] +} diff --git a/docs/teaching/rtcp-five-axis/verification/page-01.png b/docs/teaching/rtcp-five-axis/verification/page-01.png new file mode 100644 index 0000000..8cd81e5 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-01.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-02.png b/docs/teaching/rtcp-five-axis/verification/page-02.png new file mode 100644 index 0000000..217dcf4 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-02.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-03.png b/docs/teaching/rtcp-five-axis/verification/page-03.png new file mode 100644 index 0000000..4c814e0 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-03.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-04.png b/docs/teaching/rtcp-five-axis/verification/page-04.png new file mode 100644 index 0000000..0414529 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-04.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-05.png b/docs/teaching/rtcp-five-axis/verification/page-05.png new file mode 100644 index 0000000..65a431f Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-05.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-06.png b/docs/teaching/rtcp-five-axis/verification/page-06.png new file mode 100644 index 0000000..0a0ae8e Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-06.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-07.png b/docs/teaching/rtcp-five-axis/verification/page-07.png new file mode 100644 index 0000000..8d6fc35 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-07.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-08.png b/docs/teaching/rtcp-five-axis/verification/page-08.png new file mode 100644 index 0000000..9b9e3be Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-08.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-09.png b/docs/teaching/rtcp-five-axis/verification/page-09.png new file mode 100644 index 0000000..7a725d8 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-09.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-10.png b/docs/teaching/rtcp-five-axis/verification/page-10.png new file mode 100644 index 0000000..3a52aef Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-10.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-11.png b/docs/teaching/rtcp-five-axis/verification/page-11.png new file mode 100644 index 0000000..2f2db30 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-11.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-12.png b/docs/teaching/rtcp-five-axis/verification/page-12.png new file mode 100644 index 0000000..42d549d Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-12.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-13.png b/docs/teaching/rtcp-five-axis/verification/page-13.png new file mode 100644 index 0000000..303c646 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-13.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-14.png b/docs/teaching/rtcp-five-axis/verification/page-14.png new file mode 100644 index 0000000..d2b7c97 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-14.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-15.png b/docs/teaching/rtcp-five-axis/verification/page-15.png new file mode 100644 index 0000000..59911d0 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-15.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-16.png b/docs/teaching/rtcp-five-axis/verification/page-16.png new file mode 100644 index 0000000..3cb6de6 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-16.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-17.png b/docs/teaching/rtcp-five-axis/verification/page-17.png new file mode 100644 index 0000000..d6d4661 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-17.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-18.png b/docs/teaching/rtcp-five-axis/verification/page-18.png new file mode 100644 index 0000000..7db9ecd Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-18.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-19.png b/docs/teaching/rtcp-five-axis/verification/page-19.png new file mode 100644 index 0000000..192efa3 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-19.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-20.png b/docs/teaching/rtcp-five-axis/verification/page-20.png new file mode 100644 index 0000000..d7332b1 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-20.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-21.png b/docs/teaching/rtcp-five-axis/verification/page-21.png new file mode 100644 index 0000000..15eb998 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-21.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-22.png b/docs/teaching/rtcp-five-axis/verification/page-22.png new file mode 100644 index 0000000..4ab079b Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-22.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-23.png b/docs/teaching/rtcp-five-axis/verification/page-23.png new file mode 100644 index 0000000..aee0f8a Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-23.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-24.png b/docs/teaching/rtcp-five-axis/verification/page-24.png new file mode 100644 index 0000000..4420715 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-24.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-25.png b/docs/teaching/rtcp-five-axis/verification/page-25.png new file mode 100644 index 0000000..9d4e430 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-25.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-26.png b/docs/teaching/rtcp-five-axis/verification/page-26.png new file mode 100644 index 0000000..1c08e85 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-26.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-27.png b/docs/teaching/rtcp-five-axis/verification/page-27.png new file mode 100644 index 0000000..22acd96 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-27.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-28.png b/docs/teaching/rtcp-five-axis/verification/page-28.png new file mode 100644 index 0000000..74e945a Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-28.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-29.png b/docs/teaching/rtcp-five-axis/verification/page-29.png new file mode 100644 index 0000000..8048780 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-29.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-30.png b/docs/teaching/rtcp-five-axis/verification/page-30.png new file mode 100644 index 0000000..dcd4075 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-30.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/page-31.png b/docs/teaching/rtcp-five-axis/verification/page-31.png new file mode 100644 index 0000000..d0bacfa Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/page-31.png differ diff --git a/docs/teaching/rtcp-five-axis/verification/pdf-contact-sheet.png b/docs/teaching/rtcp-five-axis/verification/pdf-contact-sheet.png new file mode 100644 index 0000000..7b0bc22 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/verification/pdf-contact-sheet.png differ diff --git a/docs/teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf b/docs/teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf new file mode 100644 index 0000000..95eb425 Binary files /dev/null and b/docs/teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf differ diff --git a/nextTask-hardcoding.md b/nextTask-hardcoding.md index f767331..9ebb977 100644 --- a/nextTask-hardcoding.md +++ b/nextTask-hardcoding.md @@ -1,5 +1,9 @@ # 配置驱动与恢复改造接续入口 +最新教学交付(R09/E13):[工件坐标与RTCP初学者完整PDF](docs/teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf),72页A4,详解原点/方向/G54/G代码逐字逐行和关节运动;源稿、数据及复现命令见[教材索引](docs/teaching/rtcp-beginners/README.md)。原31页投影片保留。最近两轮仅新增教学资料和生成脚本,未改应用功能。 + +2026-09-18 新需求接续:AC/BC 单文件 GLB + URDF 机床导入已在独立子项目实现并专项验收。新入口为 [`docs/glb-machine/README.md`](docs/glb-machine/README.md),最新台账 R07(Jog 限位后的事件序列和反向恢复、阴影警告;R06 桁架示例,R05 参数编辑保留GLB,R04 切换不跳动);两项已复核的旧测试失败见 E11,本轮改动尚未提交/推送。旧 event_sequence_gap 浏览器会话需刷新重建。下文为原配置/恢复专项历史接续状态,原有本地改动继续保留。 + 更新时间:2026-09-18。用户已确认清理自有代码的机床参数、轴配置、路径、可调界面设置硬编码,保留数学/协议常量和上游 LinuxCNC;之后要求接续 CFG-R01、TRT-R01。以上专项均已收口。 ## 当前状态 diff --git a/scripts/capture_rtcp_teaching_models.mjs b/scripts/capture_rtcp_teaching_models.mjs new file mode 100644 index 0000000..9c8c0e5 --- /dev/null +++ b/scripts/capture_rtcp_teaching_models.mjs @@ -0,0 +1,17 @@ +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const output = new URL('../docs/teaching/rtcp-five-axis/assets/', import.meta.url); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +try { + const page = await browser.newPage({ viewport: { width: 1440, height: 1000 }, deviceScaleFactor: 2 }); + await page.goto(process.env.XYZAC_PANEL_URL ?? 'http://127.0.0.1:5174/'); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + await page.addStyleTag({ content: '.xyzac-machine-controller { display: none !important; }' }); + for (const id of ['ac', 'bc']) { + await page.locator('[data-axis-control="machine-glb-settings"]').click(); + await page.locator(`[data-axis-control="machine-glb-${id}-gantry"]`).click(); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + await page.keyboard.press('Escape'); + await page.locator('.xyzac-machine-view').screenshot({ path: new URL(`machine-${id}.png`, output).pathname }); + } +} finally { await browser.close(); } diff --git a/scripts/generate_glb_machine_acceptance.py b/scripts/generate_glb_machine_acceptance.py new file mode 100644 index 0000000..7f06f3b --- /dev/null +++ b/scripts/generate_glb_machine_acceptance.py @@ -0,0 +1,59 @@ +"""Collect the already executed GLB subproject checks without rerunning them.""" +import hashlib +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +OUTPUT = ROOT / 'coverage/glb-machine' + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + +reports = [ + 'browser.report.json', 'motion.report.json', 'gltf-validation.report.json', + 'reproducibility.report.json', 'regression-parametric/browser.report.json', + 'regression-jog/rtcp-jog-browser.report.json', +] +results = [] +for name in reports: + path = OUTPUT / name + data = json.loads(path.read_text()) + assert data['status'] == 'verified', f'{name}: {data["status"]}' + results.append({'report_id': data['report_id'], 'path': str(path.relative_to(ROOT)), 'sha256': sha(path)}) +browser = json.loads((OUTPUT / 'browser.report.json').read_text()) +motion = json.loads((OUTPUT / 'motion.report.json').read_text()) +manifest_path = ROOT / 'web/react/public/machines/manifest.json' +manifest = json.loads(manifest_path.read_text()) +for entry in manifest['machines']: + assert sha(manifest_path.parent / entry['filename']) == entry['sha256'] +assert 'built in' in (OUTPUT / 'build.log').read_text() +assert not browser['browser_errors'] +assert len(browser['machines']) == len(motion['machines']) == 2 +report = { + 'report_id': 'glb-machine-acceptance-v1', 'status': 'verified', + 'tasks': [f'GLB-{i:02}' for i in range(1, 7)], + 'wasm_sha256': sha(ROOT / 'build-wasm/linuxcnc-sim-core.wasm'), + 'reports': results, + 'models': manifest['machines'], + 'rejected_inputs': sum(len(p['rejected']) for p in browser['parser']), + 'static_pose_and_tool_length_samples': sum(len(m['geometry']) for m in browser['machines']), + 'imported_rotary_jogs': sum(len(m['jogs']) for m in browser['machines']), + 'simultaneous_five_axis_intervals': sum(m['simultaneous_ticks'] for m in motion['machines']), + 'executed_program_projection_samples': sum(m['samples'] for m in motion['machines']), + 'max_program_projection_error_view_units': max(m['max_error_view_units'] for m in motion['machines']), + 'boundaries': [ + 'Only the versioned orthogonal XYZ-head / AC-or-BC table TRT profile is supported', + 'Runtime INI supplies homing, acceleration, periods and validated travel/speed settings', + 'Imported GLB assets are kept in page memory; reload requires importing again', + 'Original illustrative assets; no manufacturer calibration, collision or generic URDF solver claim', + 'No native/WASM source modification; no whole-repository or release parity claim', + ], + 'evidence': [ + {'path': str(p.relative_to(ROOT)), 'sha256': sha(p)} + for p in sorted(OUTPUT.rglob('*')) + if p.is_file() and p.name != 'acceptance.report.json' + ], +} +assert report['wasm_sha256'] == browser['wasm_sha256'] +(OUTPUT / 'acceptance.report.json').write_text(json.dumps(report, indent=2, ensure_ascii=False) + '\n') +print(json.dumps({k: report[k] for k in ['report_id', 'status', 'rejected_inputs', 'static_pose_and_tool_length_samples', 'imported_rotary_jogs', 'simultaneous_five_axis_intervals', 'executed_program_projection_samples']}, ensure_ascii=False)) diff --git a/scripts/generate_glb_machines.mjs b/scripts/generate_glb_machines.mjs new file mode 100644 index 0000000..4d0339a --- /dev/null +++ b/scripts/generate_glb_machines.mjs @@ -0,0 +1,140 @@ +import { mkdir, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import * as THREE from '../web/react/node_modules/three/build/three.module.js'; +import { GLTFExporter } from '../web/react/node_modules/three/examples/jsm/exporters/GLTFExporter.js'; +// GLTFExporter uses the browser FileReader interface for embedded binary buffers. +globalThis.FileReader = class { + readAsArrayBuffer(blob) { blob.arrayBuffer().then((result) => { this.result = result; this.onloadend?.(); }); } + readAsDataURL(blob) { blob.arrayBuffer().then((result) => { this.result = `data:${blob.type};base64,${Buffer.from(result).toString('base64')}`; this.onloadend?.(); }); } +}; +const output = new URL('../web/react/public/machines/', import.meta.url); +await mkdir(output, { recursive: true }); +const manifest = { schema: 'linuxcnc.machine.examples/1', generator: 'scripts/generate_glb_machines.mjs', provenance: 'Original procedural demonstration machines; no third-party mesh assets', license: 'CC0-1.0', machines: [] }; +for (const variant of ['standard', 'gantry']) for (const type of ['ac', 'bc']) { + const gantry = variant === 'gantry'; + const profile = gantry ? 'trt-xyz-gantry/1' : 'trt-xyz-head/1'; + const toolLink = gantry ? 'z_slide' : 'spindle_head'; + const stem = gantry ? `demo-${type}-gantry` : `demo-${type}-xyz-head`; + const tiltAxis = type[0].toUpperCase(); + // Non-zero fixtures intentionally exercise rotation points and skewed cradle offsets. + const p = type === 'ac' ? [.024, -.012, .008] : [-.018, .014, .012]; + const d = type === 'ac' ? [0, .018, -.045] : [.022, 0, -.040]; + const t = p.map((v, i) => v + d[i]); + const radians = (degrees) => degrees * Math.PI / 180; + const joints = [ + { name: 'x_joint', parent: 'base', child: 'x_slide', type: 'prismatic', xyz: [0, 0, 0], axis: [1, 0, 0], c: 'X', limits: [-.2, .2, .02] }, + { name: 'y_joint', parent: 'x_slide', child: 'y_slide', type: 'prismatic', xyz: [0, 0, 0], axis: [0, 1, 0], c: 'Y', limits: [-.1, .1, .02] }, + { name: 'z_joint', parent: 'y_slide', child: 'z_slide', type: 'prismatic', xyz: [0, 0, 0], axis: [0, 0, 1], c: 'Z', limits: [-.12, .12, .02] }, + { name: 'spindle_mount', parent: 'z_slide', child: 'spindle_head', type: 'fixed', xyz: [0, 0, 0] }, + { name: 'tilt_joint', parent: 'base', child: 'tilt_table', type: 'revolute', xyz: t, axis: type === 'ac' ? [1, 0, 0] : [0, 1, 0], c: tiltAxis, limits: [radians(type === 'ac' ? -100 : -36000), radians(type === 'ac' ? 50 : 36000), radians(30)] }, + { name: 'c_joint', parent: 'tilt_table', child: 'c_table', type: 'revolute', xyz: d.map((v) => -v), axis: [0, 0, 1], c: 'C', limits: [radians(-36000), radians(36000), radians(30)] }, + { name: 'work_mount', parent: 'c_table', child: 'work_frame', type: 'fixed', xyz: p.map((v) => -v) }, + ]; + if (gantry) joints.splice(joints.findIndex((j) => j.name === 'spindle_mount'), 1); + const links = ['base', ...joints.map((j) => j.child)]; + const urdf = `\n\n \n${links.map((n) => ` `).join('\n')}\n${joints.map((j) => ` \n \n ${j.c ? `\n \n ` : ''}\n `).join('\n')}\n\n`; + const scene = new THREE.Scene(); scene.name = `CNC_${type.toUpperCase()}${gantry ? "_GANTRY" : ""}`; + scene.userData.linuxcncMachine = { schema: 'linuxcnc.machine/1', urdf }; + scene.userData.assetLicense = 'CC0-1.0'; + const frame = new THREE.Group(); frame.name = 'urdf_frame'; frame.rotation.x = -Math.PI / 2; scene.add(frame); + const nodes = Object.fromEntries(links.map((n) => { const g = new THREE.Group(); g.name = n; g.userData.link = n; return [n, g]; })); + frame.add(nodes.base); + for (const j of joints) { nodes[j.child].position.fromArray(j.xyz); nodes[j.parent].add(nodes[j.child]); } + const materials = Object.fromEntries(Object.entries({ enamel: [0xd8e4e3, .25, .32], teal: [0x167f83, .4, .27], dark: [0x253640, .35, .43], steel: [0x8a9faa, .85, .23], polished: [0xdce8ee, .9, .16], gold: [0xe4b34e, .7, .25], black: [0x122026, .2, .62] }).map(([n, [color, metalness, roughness]]) => [n, new THREE.MeshStandardMaterial({ color, metalness, roughness })])); + let counter = 0; + function mesh(parent, label, shape, position, material) { const m = new THREE.Mesh(shape, materials[material]); m.name = `${label}_${++counter}`; m.position.fromArray(position); m.castShadow = true; m.receiveShadow = true; parent.add(m); return m; } + const box = (parent, label, size, position, mat = 'enamel') => mesh(parent, label, new THREE.BoxGeometry(...size), position, mat); + const cyl = (parent, label, radius, length, position, mat = 'steel', axis = 'z') => { const m = mesh(parent, label, new THREE.CylinderGeometry(radius, radius, length, 48), position, mat); if (axis === 'z') m.rotation.x = Math.PI / 2; if (axis === 'x') m.rotation.z = Math.PI / 2; return m; }; + const base = nodes.base; + box(base, 'bed', [.60, .52, .14], [0, .03, -.25]); + box(base, 'plinth', [.63, .55, .045], [0, .03, -.337], 'dark'); + box(base, 'chip_tray', [.60, .46, .025], [0, -.015, -.169], 'steel'); + for (const x of [-.275, .275]) box(base, 'tray_lip', [.018, .46, .04], [x, -.015, -.14], 'teal'); + for (const x of [-.25, .25]) for (const y of [-.18, .22]) cyl(base, 'levelling_foot', .031, .025, [x, y, -.37], 'black'); + if (gantry) { + // Four fixed posts carry X rails. The complete bridge belongs to X, + // its cross-carriage to Y, and the ram/spindle to Z. + box(base, 'gantry_foundation', [.88, .78, .045], [0, 0, -.355], 'dark'); + for (const x of [-.38, .38]) for (const y of [-.32, .32]) { + box(base, 'gantry_post', [.055, .055, .82], [x, y, .05]); + box(base, 'post_foot', [.09, .09, .02], [x, y, -.35], 'teal'); + } + const beam = (parent, label, start, end, thickness, mat) => { + const a = new THREE.Vector3(...start), b = new THREE.Vector3(...end); + const bar = box(parent, label, [thickness, thickness, a.distanceTo(b)], a.clone().add(b).multiplyScalar(.5).toArray(), mat); + bar.quaternion.setFromUnitVectors(new THREE.Vector3(0, 0, 1), b.sub(a).normalize()); + }; + for (const y of [-.32, .32]) { + box(base, 'gantry_longitudinal_beam', [.82, .06, .065], [0, y, .475], 'teal'); + box(base, 'gantry_x_rail', [.78, .018, .012], [0, y, .517], 'polished'); + for (let x = -.3; x < .31; x += .1) cyl(base, 'gantry_rail_bolt', .003, .004, [x, y, .526], 'black'); + for (const sign of [-1, 1]) beam(base, 'corner_brace', [sign * .38, y, .30], [sign * .22, y, .45], .02, 'steel'); + box(nodes.x_slide, 'gantry_x_bearing', [.12, .05, .025], [0, y, .54], 'dark'); + } + for (const x of [-.38, .38]) { + box(base, 'fixed_end_tie', [.04, .69, .045], [x, 0, .46], 'steel'); + } + for (const z of [.55, .65]) box(nodes.x_slide, 'moving_bridge_chord', [.06, .73, .035], [0, 0, z], 'teal'); + for (let i = 0; i < 6; i++) { + const y = -.33 + i * .11; + beam(nodes.x_slide, 'bridge_diagonal', [0, y, i % 2 ? .65 : .55], [0, y + .11, i % 2 ? .55 : .65], .018, 'enamel'); + } + for (const x of [-.043, .043]) box(nodes.x_slide, 'gantry_y_rail', [.014, .65, .016], [x, 0, .53], 'polished'); + box(nodes.y_slide, 'gantry_y_carriage', [.13, .12, .035], [0, 0, .50], 'dark'); + box(nodes.y_slide, 'gantry_ram_guide', [.145, .085, .14], [0, .036, .40], 'enamel'); + for (const x of [-.045, .045]) box(nodes.z_slide, 'gantry_z_rail', [.012, .015, .29], [x, .065, .35], 'steel'); + box(nodes.z_slide, 'gantry_z_ram', [.09, .07, .25], [0, .02, .365], 'teal'); + } else { + for (const x of [-.245, .245]) { + box(base, 'portal_column', [.09, .12, .62], [x, .19, .11]); + box(base, 'column_inlay', [.095, .008, .48], [x, .126, .12], 'teal'); + } + box(base, 'portal_crossbeam', [.58, .115, .10], [0, .19, .40]); + for (const z of [.365, .427]) { + box(base, 'x_rail', [.49, .013, .017], [0, .124, z], 'steel'); + for (let x = -.22; x < .23; x += .055) cyl(base, 'rail_bolt', .003, .004, [x, .115, z], 'black', 'y'); + } + box(nodes.x_slide, 'x_carriage', [.15, .035, .12], [0, .10, .394], 'teal'); + for (const x of [-.045, .045]) box(nodes.x_slide, 'y_rail', [.014, .285, .016], [x, -.02, .365], 'steel'); + box(nodes.y_slide, 'y_saddle', [.15, .13, .065], [0, 0, .327], 'dark'); + for (const x of [-.055, .055]) box(nodes.y_slide, 'z_rail', [.014, .012, .23], [x, .055, .205], 'steel'); + box(nodes.z_slide, 'z_carriage', [.135, .035, .18], [0, .055, .19], 'teal'); + } + box(nodes[toolLink], 'head_casting', [.12, .13, .15], [0, -.018, .175]); + box(nodes[toolLink], 'head_face', [.108, .007, .10], [0, -.087, .185], 'teal'); + cyl(nodes[toolLink], 'spindle_motor', .039, .095, [0, 0, .295], 'dark'); + cyl(nodes[toolLink], 'spindle_housing', .037, .083, [0, 0, .088], 'steel'); + cyl(nodes[toolLink], 'collet', .017, .03, [0, 0, .032], 'dark'); + cyl(nodes[toolLink], 'master_tool', .004, .017, [0, 0, .0085], 'gold'); + // AC bearings along X; BC bearings along Y. Both visual and joint axes agree. + for (const side of [-1, 1]) { + const pos = [...t]; pos[type === 'ac' ? 0 : 1] += side * .122; + const support = [...pos]; support[2] = -.111; + box(base, 'trunnion_pedestal', type === 'ac' ? [.055, .11, .116] : [.11, .055, .116], support); + cyl(base, 'tilt_bearing', .05, .06, pos, 'teal', type === 'ac' ? 'x' : 'y'); + const shaft = [0, 0, 0]; shaft[type === 'ac' ? 0 : 1] = side * .084; + cyl(nodes.tilt_table, 'tilt_shaft', .022, .072, shaft, 'steel', type === 'ac' ? 'x' : 'y'); + const arm = [...shaft]; arm[2] = -.025; + box(nodes.tilt_table, 'cradle_arm', type === 'ac' ? [.017, .10, .074] : [.10, .017, .074], arm, 'teal'); + } + box(nodes.tilt_table, 'cradle', [.17, .16, .018], [0, 0, -.056], 'teal'); + const rotaryHousing = new THREE.Group(); rotaryHousing.position.fromArray(d.map((v) => -v)); nodes.tilt_table.add(rotaryHousing); + cyl(rotaryHousing, 'c_drive', .075, .072, [0, 0, -.038], 'dark'); + cyl(nodes.c_table, 'c_platter', .080, .019, [0, 0, -.0095], 'steel'); + cyl(nodes.c_table, 'table_surface', .077, .001, [0, 0, .0005], 'polished'); + for (let n = 0; n < 8; n++) { + const angle = n * Math.PI / 4; + cyl(nodes.c_table, 'fixture_hole', .003, .001, [.057 * Math.cos(angle), .057 * Math.sin(angle), .0012], 'black'); + } + for (const y of [-.035, 0, .035]) box(nodes.c_table, 'table_t_slot', [.125, .003, .001], [0, y, .0015], 'black'); + box(nodes.c_table, 'c_index', [.008, .014, .004], [.073, 0, .002], 'gold'); + const glb = await new GLTFExporter().parseAsync(scene, { binary: true, trs: true, onlyVisible: false }); + const filename = `${stem}.glb`; + await writeFile(new URL(filename, output), Buffer.from(glb)); + await writeFile(new URL(`${stem}.urdf`, output), urdf); + manifest.machines.push({ id: gantry ? `${type}-gantry` : type, label: `${type.toUpperCase()} 示例${gantry ? '桁架型' : ''}`, profile, filename, urdf: `${stem}.urdf`, bytes: glb.byteLength, sha256: createHash('sha256').update(Buffer.from(glb)).digest('hex'), coordinates: `XYZ${tiltAxis}C`, rotation_point_mm: p.map((v) => v * 1000), offsets_mm: d.map((v) => v * 1000), links, meshes: counter }); + scene.traverse((obj) => { obj.geometry?.dispose(); }); Object.values(materials).forEach((m) => m.dispose()); +} +await writeFile(new URL('manifest.json', output), JSON.stringify(manifest, null, 2) + '\n'); +await writeFile(new URL('LICENSE.txt', output), 'Original procedural AC/BC machine demonstration assets generated for linuxcncWebWASM.\nDedicated to the public domain under CC0 1.0 Universal.\nhttps://creativecommons.org/publicdomain/zero/1.0/\nNo manufacturer affiliation or dimensional calibration is implied.\n'); +console.log(JSON.stringify(manifest, null, 2)); diff --git a/scripts/generate_jog_limit_acceptance.py b/scripts/generate_jog_limit_acceptance.py new file mode 100644 index 0000000..1efb1b5 --- /dev/null +++ b/scripts/generate_jog_limit_acceptance.py @@ -0,0 +1,28 @@ +import hashlib +import json +import shutil +from pathlib import Path + +root = Path(__file__).resolve().parents[1] +output = root / 'coverage/glb-machine/jog-limits' +for name in ['worker', 'browser', 'checkpoint', 'motion', 'step', 'recovery', 'build', 'manual', 'buttons', 'manual-baseline', 'buttons-baseline', 'before']: + shutil.copyfile(Path('/tmp') / f'jog-limits-{name}.log', output / f'{name}.log') +for name in ['worker.report.json', 'browser.report.json', 'motion.report.json', 'exact-checkpoint.report.json', 'shadow.report.json']: + assert json.loads((output / name).read_text())['status'] == 'verified', name +assert 'built in' in (output / 'build.log').read_text() +report = { + 'report_id': 'jog-limit-acceptance-v1', 'status': 'verified', + 'tasks': ['TRT-JOG02', 'GLB-UI02'], + 'wasm_sha256': hashlib.sha256((root / 'build-wasm/linuxcnc-sim-core.wasm').read_bytes()).hexdigest(), + 'known_baseline_failures': [ + {'test': 'test_xyzac_manual_control.mjs', 'failure': 'synchronous homing mask 0 != 1; identical with HEAD modules'}, + {'test': 'test_xyzac_button_constraints.mjs', 'failure': 'unhomed versus machine-off gate priority; identical with HEAD modules'}, + ], + 'boundaries': ['RTCP limit stops at last valid servo sample; no predictive hardware deceleration claim', 'Previously broken transport sessions require page reload'], + 'evidence': [ + {'path': str(path.relative_to(root)), 'sha256': hashlib.sha256(path.read_bytes()).hexdigest()} + for path in sorted(output.rglob('*')) if path.is_file() and path.name != 'acceptance.report.json' + ], +} +(output / 'acceptance.report.json').write_text(json.dumps(report, indent=2) + '\n') +print(json.dumps({'report_id': report['report_id'], 'status': report['status'], 'evidence_count': len(report['evidence'])})) diff --git a/scripts/generate_rtcp_beginner_data.mjs b/scripts/generate_rtcp_beginner_data.mjs new file mode 100644 index 0000000..86cd569 --- /dev/null +++ b/scripts/generate_rtcp_beginner_data.mjs @@ -0,0 +1,110 @@ +import assert from 'node:assert/strict'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import createModule from '../build-wasm/linuxcnc-sim-core.js'; +import { WasmProgramRuntime } from '../web/worker/wasm-program-runtime.mjs'; +import { WasmXyzacKinematics } from '../web/worker/wasm-xyzac-kinematics.mjs'; +import { SimSession, CONTEXT_ID } from '../web/worker/sim-session.mjs'; +import { loadSimulationCase, toWorkerConfiguration } from '../web/workspace/sim-case-loader.mjs'; +import { writeTrtGeometry } from '../web/workspace/trt-geometry.mjs'; +import { MACHINE_DEFINITIONS } from '../web/workspace/machine-definitions.mjs'; + +const root = new URL('../', import.meta.url), out = new URL('docs/teaching/rtcp-beginners/', root); +await mkdir(new URL('assets/', out), { recursive: true }); +await mkdir(new URL('verification/', out), { recursive: true }); +const wasm = await readFile(new URL('build-wasm/linuxcnc-sim-core.wasm', root)); +const core = await createModule({ wasmBinary: wasm }); +const limits = Object.fromEntries(['x','y','z','a','b','c'].map((a) => [a,[-100000,100000]])); +const k = new WasmXyzacKinematics(core, { coordinates: 'XYZBC', limits }); +const interpreter = new WasmProgramRuntime(core); +interpreter.load('M2\n', 'beginner-reference.ngc'); +const blocks = [ + 'N10 G21 G90 G94 G17', + 'N20 G10 L2 P1 X40 Y20 Z10', + 'N30 G54', + 'N40 M428', + 'N50 G1 X10 Y0 Z5 B0 C0 F600', + 'N60 C90', + 'N70 G91 X10', + 'N80 G90 X20 Y0 Z5 B30 C90 F300', + 'N90 X0 Y10', + 'N100 M429', + 'N110 M428', +]; +const rows = []; +const axes = ['x','y','z','a','b','c','u','v','w']; +let joints = [0,0,0,0,0], mode = 0; +const poseOf = (state) => Object.fromEntries(axes.map((a) => [a, state[a] ?? 0])); +let canonical = poseOf({}); +for (const block of blocks) { + const result = interpreter.executeBlock(block); + assert.equal(result.status, 'verified', JSON.stringify(result)); + const code = result.program.control_code; + if ([428,429].includes(code)) { + mode = code === 428 ? 1 : 0; + const selected = k.selectPhysical(mode, joints); + assert.equal(selected.status, 'verified'); + interpreter.synchronizePosition(selected.pose); + canonical = { ...selected.pose }; + } else if (result.motion) { + const inverse = k.inverseMode(mode, result.motion.end); + assert.equal(inverse.status, 'verified'); joints = inverse.joints; + canonical = { ...result.motion.end }; + } + const state = interpreter.snapshot(), origin = state.coordinate_context.offsets[state.coordinate_context.system-1]; + rows.push({ block, has_motion: Boolean(result.motion), mode, canonical: { ...canonical }, work_xyz: ['x','y','z'].map((a,i)=>canonical[a]-origin[i]), joints: [...joints], origin: origin.slice(0,3), units: state.units, distance_mode: state.distance_mode, feed: state.feed, motion: result.motion }); +} +const near = (actual, expected) => actual.forEach((v,i) => assert.ok(Math.abs(v-expected[i])<1e-8, `${v} != ${expected[i]}`)); +near(rows[4].joints,[50,20,15,0,0]); +near(rows[5].joints,[-20,50,15,0,90]); +near(rows[6].joints,[-20,60,15,0,90]); +near(rows[7].joints,[-9.820508075688775,60,22.99038105676658,30,90]); +near(rows[9].joints,rows[8].joints); near(rows[10].joints,rows[8].joints); + +function probe(blocks) { + const p = new WasmProgramRuntime(core); p.load('M2\n','probe.ngc'); + let canonical = poseOf({}); + const rows = blocks.map((block) => { + const result=p.executeBlock(block); assert.equal(result.status,'verified',block); + const state=p.snapshot(); + if (result.motion) canonical = { ...result.motion.end }; + return { block, canonical: { ...canonical }, units:state.units,distance_mode:state.distance_mode,feed:state.feed, coordinates:state.coordinate_context,motion:result.motion }; + }); + p.destroy(); return rows; +} +const units = probe(['G21 G90 G1 X0 Y0 Z0 F600','G20 G91 X1 F2','G21 G90 X30']); +near([units[1].canonical.x,units[1].feed],[25.4,50.8]); +const touch = probe(['G21 G90 G1 X70 Y30 Z20 F600','G10 L20 P1 X0 Y0 Z0','G54 X10']); +near(touch[1].coordinates.offsets[0].slice(0,3),[70,30,20]); near([touch[2].canonical.x],[80]); +const switching = probe(['G21 G90 G10 L2 P1 X40 Y20 Z10','G10 L2 P2 X80 Y-10 Z10','G54 G1 X10 Y0 Z5 F600','G55','X10']); +near([switching[2].canonical.x,switching[3].canonical.x,switching[4].canonical.x],[50,50,90]); +interpreter.destroy(); k.destroy(); + +const fetchImpl = async (url) => { try { const text=await readFile(new URL(String(url).replace(/^\//,''),root),'utf8'); return {ok:true,text:async()=>text}; } catch {return {ok:false};} }; +const definition=MACHINE_DEFINITIONS.find((m)=>m.coordinates==='XYZBC'); +const sessionCore=await createModule({wasmBinary:wasm}); +const session=new SimSession(sessionCore,{sessionId:'rtcp-beginner-teaching',planner:'linuxcnc-tp'});let seq=0; +const send=(kind,payload={})=>{ + const response=session.accept({schema_version:1,context_id:CONTEXT_ID,session_id:session.sessionId,kind,seq:++seq,operation_id:`lesson-${seq}`,payload}); + assert.notEqual(response.kind,'ERROR',JSON.stringify(response.payload));return response; +}; +send('HELLO');send('SESSION_ATTACH'); +const bundle=writeTrtGeometry(await loadSimulationCase({path:definition.entrypoint,fetchImpl}),{x_rot_point:0,y_rot_point:0,z_rot_point:0,x_offset:0,y_offset:0,z_offset:0}); +send('LOAD_WORKSPACE',{root_path:'/workspace',configuration:toWorkerConfiguration(bundle)}); +const program=blocks.slice(0,9).join('\n')+'\nM2\n'; +send('PROGRAM_LOAD',{source:program,path:'beginner-g54-rtcp.ngc'});send('POWER',{active:true});send('HOME',{all:true}); +for(let i=0;i<500&&!session.wasmHomeLimit.read().state.homed;i++)send('SIM_STEP',{cycles:1}); +assert.ok(session.wasmHomeLimit.read().state.homed);send('PROGRAM_RUN'); +let final;const trajectory=[]; +for(let i=0;i<6000;i++){ + final=send('SIM_STEP',{cycles:5,response:'motion_delta'}); + const state=session.wasmMotion.read().state; + if(i%10===0)trajectory.push({tick:session.tick,pose:state.position,joints:state.joint_commanded}); + if(final.payload.program?.program_status==='completed'&&state.queue_depth===0)break; +} +assert.equal(final.payload.program.program_status,'completed'); +const end=session.wasmMotion.read().state; +near(end.joint_commanded,rows[8].joints); +const report={report_id:'rtcp-beginners-gcode-v1',status:'verified',wasm_sha256:createHash('sha256').update(wasm).digest('hex'),assumptions:{coordinates:'XYZBC',rot_point:[0,0,0],offsets:[0,0,0],tool_offset:0,work_origin:[40,20,10],rotation:'Ry(B)*Rz(C)',work_rotation:0},rows,units,touch,switching,executed_program:{source:program,status:final.payload.program.program_status,final_pose:end.position,final_joints:end.joint_commanded,samples:trajectory}}; +await writeFile(new URL('gcode-evidence.json',out),JSON.stringify(report,null,2)+'\n'); +console.log(JSON.stringify({report_id:report.report_id,status:report.status,blocks:rows.length,extra_blocks:units.length+touch.length+switching.length,trajectory_samples:trajectory.length,final:end.joint_commanded})); diff --git a/scripts/generate_rtcp_beginner_figures.py b/scripts/generate_rtcp_beginner_figures.py new file mode 100644 index 0000000..9df8811 --- /dev/null +++ b/scripts/generate_rtcp_beginner_figures.py @@ -0,0 +1,103 @@ +"""Original diagrams for the beginner's work-coordinate handbook.""" +import shutil +from pathlib import Path +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import font_manager +from matplotlib.patches import Rectangle, Polygon +import numpy as np + +ROOT=Path(__file__).resolve().parents[1] +OUT=ROOT/'docs/teaching/rtcp-beginners/assets';OUT.mkdir(parents=True,exist_ok=True) +font_manager.fontManager.addfont('/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc') +plt.rcParams.update({'font.family':'Noto Sans CJK JP','font.size':14,'axes.unicode_minus':False}) +BLUE,TEAL,RED,GRAY,INK='#2563b8','#00877b','#d45549','#8a969f','#23303a' +for name in ['machine-ac','machine-bc','hierarchy','identity-no-follow','tcp-follow','rotated-direction','bc-frame','pivot-offset','arc-chord','tool-length','orientation']: + shutil.copyfile(ROOT/f'docs/teaching/rtcp-five-axis/assets/{name}.png',OUT/f'{name}.png') +def save(fig,name): + fig.savefig(OUT/f'{name}.png',dpi=190,facecolor='white',bbox_inches='tight',pad_inches=.18);plt.close(fig) +def arrow(ax,start,end,color,label='',dx=0,dy=0): + ax.annotate('',end,start,arrowprops={'arrowstyle':'-|>','lw':2,'color':color}) + if label:ax.text(end[0]+dx,end[1]+dy,label,color=color,fontsize=14) + +fig,ax=plt.subplots(figsize=(8,4.2));ax.set(xlim=(-8,55),ylim=(-8,38),aspect='equal');ax.axis('off') +for x in range(0,51,10):ax.plot([x,x],[0,30],c='#dce6ec',lw=1);ax.text(x,-4,str(x),ha='center',fontsize=12,color=GRAY) +for y in range(0,31,10):ax.plot([0,50],[y,y],c='#dce6ec',lw=1);ax.text(-4,y,str(y),va='center',fontsize=12,color=GRAY) +arrow(ax,(0,0),(54,0),BLUE,'X',-1,-5);arrow(ax,(0,0),(0,36),BLUE,'Y',-5,-1) +ax.scatter([30],[20],s=90,color=RED);ax.plot([30,30,0],[0,20,20],ls='--',color=RED,lw=1.5) +ax.text(32,22,'P = (30, 20) mm',color=RED);ax.text(2,32,'先选原点,再沿指定方向量距离',fontsize=14,color=INK) +save(fig,'coordinate-grid') + +fig,ax=plt.subplots(figsize=(8,4.4));ax.set(xlim=(-10,95),ylim=(-10,60),aspect='equal');ax.axis('off') +arrow(ax,(0,0),(90,0),BLUE,'X_M',-8,-7);arrow(ax,(0,0),(0,56),BLUE,'Y_M',-8,-2) +arrow(ax,(40,20),(79,20),TEAL,'X_W',0,-2);arrow(ax,(40,20),(40,54),TEAL,'Y_W',2,0) +ax.scatter([50],[35],s=95,color=RED);ax.text(54,38,'同一个点 P',color=RED) +ax.plot([50,50,40],[20,35,35],ls='--',color=TEAL);ax.text(43,24,'10',color=TEAL);ax.text(32,27,'15',color=TEAL) +ax.annotate('O_W 在 M 中为 (40,20)',(40,20),xytext=(23,6),fontsize=12,arrowprops={'arrowstyle':'->','color':GRAY}) +ax.text(3,46,'P_M=(50,35)\nP_W=(10,15)',fontsize=15,color=INK) +save(fig,'same-point') + +fig,axes=plt.subplots(1,2,figsize=(10,5)) +for ax,c in zip(axes,[0,90]): + ax.set(xlim=(-55,85),ylim=(-28,95),aspect='equal');ax.axis('off') + arrow(ax,(0,0),(78,0),BLUE,'X_M',-5,-12);arrow(ax,(0,0),(0,85),BLUE,'Y_M',-18,-1) + rad=np.deg2rad(c);r=np.array([[np.cos(rad),-np.sin(rad)],[np.sin(rad),np.cos(rad)]]) + o=r@np.array([40,20]);point=r@np.array([50,20]);x=r@np.array([25,0]);y=r@np.array([0,25]) + poly=np.array([o+r@np.array(v) for v in [[-5,-5],[30,-5],[30,20],[-5,20]]]);ax.add_patch(Polygon(poly,fc='#e1f2ee',ec=TEAL,alpha=.65)) + arrow(ax,o,o+x,TEAL,'X_W',2,0);arrow(ax,o,o+y,TEAL,'Y_W',2,0) + ax.scatter(*o,color=TEAL,s=70);ax.scatter(*point,color=RED,s=100,marker='*') + ax.text(-48,89,f'C = {c}°',color=INK,fontsize=17) + ax.text(-48,-23,f'O_M=({o[0]:.0f},{o[1]:.0f})\nP_M=({point[0]:.0f},{point[1]:.0f})',color=INK,fontsize=13) + label_position=(12,57) if c else (-45,67) + ax.annotate('P:X10,Y0',point,xytext=label_position,arrowprops={'arrowstyle':'->','color':RED},color=RED,fontsize=12) +fig.subplots_adjust(wspace=.15) +save(fig,'moving-origin') + +fig,ax=plt.subplots(figsize=(8,4.5));ax.axis('off');ax.set(xlim=(-10,120),ylim=(-15,80),aspect='equal') +front=np.array([[10,15],[85,15],[85,38],[10,38]]);side=np.array([[85,15],[108,37],[108,60],[85,38]]);top=np.array([[10,38],[85,38],[108,60],[33,60]]) +for poly,color in [(front,'#d4e3e8'),(side,'#b9cdd3'),(top,'#e5f2ef')]:ax.add_patch(Polygon(poly,fc=color,ec=GRAY)) +origin=(10,38);arrow(ax,origin,(66,38),TEAL,'+X',0,-7);arrow(ax,origin,(33,60),TEAL,'+Y',-4,7);arrow(ax,origin,(10,72),TEAL,'+Z',2,0) +ax.scatter(*origin,color=RED,s=70);ax.annotate('示例:顶面左前角为零点',origin,xytext=(5,2),arrowprops={'arrowstyle':'->','color':RED},color=RED,fontsize=14) +ax.scatter([65],[48],color=BLUE,s=130,facecolors='none');ax.annotate('也可选孔中心\n必须与CAD/CAM约定一致',(65,48),xytext=(75,74),arrowprops={'arrowstyle':'->','color':BLUE},color=BLUE,fontsize=12) +save(fig,'datum-choice') + +fig,ax=plt.subplots(figsize=(8,4.5));ax.axis('off');ax.set(xlim=(-20,110),ylim=(-20,85),aspect='equal') +o=np.array([15,8]);a=np.deg2rad(20);u=np.array([np.cos(a),np.sin(a)]);v=np.array([-np.sin(a),np.cos(a)]) +pts=[o,o+u*75,o+v*45] +ax.plot([pts[1][0],o[0],pts[2][0]],[pts[1][1],o[1],pts[2][1]],color=TEAL,lw=2) +for p,label,dx,dy in zip(pts,['O:所选原点','P_x:确定 +X','P_y:确定 XY 面'],[-12,2,-10],[-12,0,6]):ax.scatter(*p,s=80,color=RED);ax.text(p[0]+dx,p[1]+dy,label,fontsize=13,color=INK) +arrow(ax,o,o+u*93,TEAL,'+X',0,0);arrow(ax,o,o+v*62,TEAL,'+Y',-5,3) +arrow(ax,(-8,-9),(100,-9),BLUE,'机床 X',-25,-8) +ax.text(48,64,'工件不能只靠“一个点”\n确定全部方向',color=INK,fontsize=15,ha='center') +save(fig,'orientation-measure') + +fig,axes=plt.subplots(2,1,figsize=(8,3.6)) +for ax,title,target in zip(axes,['当前位置 X=10,G90 X20','当前位置 X=10,G91 X20'],[20,30]): + ax.set(xlim=(-3,39),ylim=(-1,6));ax.axis('off');arrow(ax,(0,1),(37,1),BLUE) + for x in [0,10,20,30]:ax.plot([x,x],[.8,1.2],color=GRAY);ax.text(x,-.2,str(x),ha='center',fontsize=13) + ax.text(0,4,title,fontsize=15,color=INK);ax.scatter([10],[1],color=GRAY,s=70);ax.scatter([target],[1],color=RED,s=90) + arrow(ax,(10,2),(target,2),RED);ax.text((10+target)/2,2.8,f'实际移动 {target-10}',ha='center',color=RED,fontsize=12) +fig.subplots_adjust(hspace=.35);save(fig,'absolute-incremental') + +fig,ax=plt.subplots(figsize=(8,4));ax.axis('off');ax.set(xlim=(0,10),ylim=(0,5)) +rows=[('① 程序工件点 W','(10, 0, 5)',TEAL),('② 加 G54 零位偏置','+(40, 20, 10)',GRAY),('③ 运动学输入 K','(50, 20, 15)',BLUE),('④ C=90°,RTCP变换','(-20, 50, 15)',RED)] +for i,(label,value,color) in enumerate(rows): + y=4.15-i*1.06;ax.add_patch(Rectangle((.3,y-.34),9.3,.74,fc='#eef4f6',ec='none')) + ax.text(.55,y,label,color=color,fontsize=15,va='center');ax.text(6.1,y,value,color=color,fontsize=16,va='center') + if i<3:ax.text(5,y-.58,'↓',ha='center',va='center',color=GRAY) +save(fig,'offset-pipeline') + +c=np.linspace(0,90,181);r=np.deg2rad(c);qx=50*np.cos(r)-20*np.sin(r);qy=50*np.sin(r)+20*np.cos(r) +fig,ax=plt.subplots(figsize=(8,4));ax.plot(c,qx,color=BLUE,lw=2.4,label='关节 X');ax.plot(c,qy,color=TEAL,lw=2.4,label='关节 Y');ax.plot(c,np.full_like(c,15),color=RED,lw=2.4,label='关节 Z') +ax.set(xlabel='C 角度(°)',ylabel='关节位置(mm)',xlim=(0,90));ax.grid(alpha=.2);ax.legend(loc='lower left',ncol=3,fontsize=12);ax.set_title('程序 X10 Y0 Z5 保持;关节由RTCP连续计算',fontsize=15,color=INK) +fig.tight_layout();save(fig,'continuous-joints') + +fig,ax=plt.subplots(figsize=(6.7,4.1));ax.set(aspect='equal',xlim=(-3,14),ylim=(-3,14));ax.axis('off') +arrow(ax,(0,0),(13,0),BLUE,'X',0,-1);arrow(ax,(0,0),(0,13),BLUE,'Y',-1,0) +t=np.linspace(0,np.pi/2,100);ax.plot(10*np.cos(t),10*np.sin(t),color=TEAL,lw=3) +arrow(ax,(8.5,5.27),(7.8,6.25),TEAL);ax.scatter([10,0,0],[0,10,0],color=[RED,TEAL,GRAY],s=80) +ax.text(6.8,-1.8,'起点 (10,0)',color=RED,fontsize=13);ax.text(.8,10.5,'终点 (0,10)',color=TEAL,fontsize=13) +ax.text(2.8,3.5,'圆心 (0,0)\nI=-10,J=0',color=INK,fontsize=14) +ax.plot([10,0],[0,0],ls=':',color=GRAY,lw=2);save(fig,'arc-words') +print('Created 9 new diagrams and reused 11 verified original assets:',OUT) diff --git a/scripts/generate_rtcp_beginner_html.py b/scripts/generate_rtcp_beginner_html.py new file mode 100644 index 0000000..21871db --- /dev/null +++ b/scripts/generate_rtcp_beginner_html.py @@ -0,0 +1,621 @@ +"""Self-contained A4 handbook: beginner-first explanations and verified examples.""" +import html +import json +from pathlib import Path + +ROOT=Path(__file__).resolve().parents[1] +OUT=ROOT/'docs/teaching/rtcp-beginners' +DATA=json.loads((OUT/'gcode-evidence.json').read_text()) +PAGES=[] +def p(text,cls=''):return f'

{text}

' +def h(text):return f'

{text}

' +def ul(*items):return '
    '+''.join(f'
  • {x}
  • ' for x in items)+'
' +def ol(*items):return '
    '+''.join(f'
  1. {x}
  2. ' for x in items)+'
' +def box(title,text):return f'' +def eq(text):return f'
{text}
' +def code(text):return '
'+html.escape(text)+'
' +def fig(name,caption,height=260):return f'
{html.escape(caption)}
{caption}
' +def table(heads,rows,cls=''):return ''+''.join('' for x in heads)+''+''.join(''+''.join('' for x in row)+'' for row in rows)+'
'+x+'
'+str(x)+'
' +def page(chapter,title,body,key,refs='原创讲解;以本讲义所声明的双转台结构为限。'): + PAGES.append({'chapter':chapter,'title':title,'body':body,'key':key,'refs':refs}) +def xyz(values):return '('+', '.join(f'{0 if abs(v)<.0005 else v:.3f}' for v in values[:3])+')' + +page('封面 · 完整讲义 / 2026.09','五轴 RTCP 与工件坐标', + p('从坐标零点到 G 代码,再到每根轴的运动','subtitle')+ + p('面向初学者的完整学习路径:先认识“相对谁量位置”,再理解“角度改变后,控制器如何保持刀尖相对工件的目标关系”。')+ + fig('machine-bc','本项目原创 XYZBC 桁架模型:刀具侧 XYZ,工件侧 B→C。',340)+ + box('你将学会回答','工件原点放在哪里?X/Y/Z方向由谁确定?G54有没有让坐标跟着转台转?为什么一个X10有时会让多根轴运动?为什么只改C角度也会引起XYZ联动?')+ + p('包含:基础概念、图解、逐字解析、逐行数值演算、实验步骤、排错方法、练习和答案。
建议分 4–6 次授课,也可按目录自学。','small'), + '读完后,应能把“程序写的数值”和“电机实际要到的位置”分开解释。') + +page('导读','怎样使用这份讲义', + p('不要求你先会矩阵或五轴编程。先把坐标看成贴在物体上的尺子,再把RTCP看成依据机床结构换算位置的计算过程。公式附录可以最后再读。')+ + h('三种标签,避免把不同层次混在一起')+ + table(['层次','在讲义中怎样使用'],[ + ['通用概念','坐标、相对位置、程序段、绝对/增量、物理关节等基础知识。'], + ['本课模型','XYZ移动刀具;A/C或B/C转动工件;按本项目正方向和父子层级计算。'], + ['已实测算例','通过本项目WASM解释器、运动学和规划器验证的数值;不是手工猜测。'], + ])+ + h('推荐阅读顺序')+ol('第1–3章:先弄清坐标系、原点、方向及工件偏置。','第4–6章:理解RTCP,再学习G代码各地址字与模式。','第7章:跟着一份完整程序逐行计算,自己复算。','第8–10章:操作实验、排错、练习;最后查数学附录。')+ + p('本项目仿真只覆盖LinuxCNC的一部分能力。讲到G52/G92、坐标旋转、完整刀补等功能时,会区分官方控制器语义和项目已验证的范围。','small'), + '不要把某个控制器或示例的约定,当作所有机床都必须遵循的规则。') + +page('学习地图','内容索引', + '
', + '先学概念,后读代码;遇到陌生词可跳到附录术语表。') + +page('第1章 · 坐标基础','01 坐标是“按照约定量出来的位置”', + p('想象一张方格纸。先指定一个交点为原点O,再规定向右是+X、向上是+Y,每格代表10mm。这样你就能用两个数告诉别人某个孔的位置,而不必每次都画整张图。')+ + fig('coordinate-grid','P=(30,20)mm:从原点沿+X量30mm,再沿+Y量20mm。',280)+ + p('这里的30和20不是电机编号,也不是速度。它们是点P相对于这套尺子的两个坐标分量。换一个原点,或者把尺子的方向转动,同一个点的坐标数字就会改变。')+ + box('最重要的习惯','说“X等于30”之前,先补一句:相对于哪一个坐标系?单位是什么?如果这两点没说明,数字还不能唯一描述空间位置。'), + '坐标数字必须和“原点、方向、单位”一起理解。') + +page('第1章 · 坐标基础','02 一套坐标系至少要规定什么?', + table(['要素','初学者理解','不说明会怎样'],[ + ['原点','从哪里开始量。','相同数值落在不同位置。'],['方向','X、Y、Z分别朝哪边。','相同增量可能走向不同方向。'],['单位','例如长度mm、旋转角度°。','X1可能是1mm,也可能是25.4mm。'],['正负号与手性','三轴之间的正向约定。','模型可能镜像、旋转方向可能相反。'], + ])+ + p('三维直角坐标系有三条互相垂直的轴。一般按右手规则建立:+X和+Y确定后,+Z的方向也随之确定。不能任意把其中一根轴反向,同时还声称保持同一套右手坐标。')+ + p('坐标系在图上常画成三根箭头;在控制器中,它由参数和变换关系表示。屏幕上的箭头只是它的可视化,拖动摄像机不会改变机床的真实坐标约定。')+ + box('单位提醒','机床运行示例使用mm和度;GLB/URDF采用米与弧度。1m=1000mm,180°=πrad。软件应显式转换,不能只把数值原样传过去。'), + '三个方向不是三条新导轨,而是描述位置的三个基准方向。') + +page('第1章 · 坐标基础','03 同一个点,可以有两套不同的坐标', + fig('same-point','工件原点在机床中为(40,20)。同一P点:机床坐标(50,35),工件坐标(10,15)。',290)+ + p('假设两套坐标的方向相同,只是原点平移。绿色工件原点比蓝色机床原点多了X40、Y20。于是工件上的P=(10,15),在机床坐标中就是(50,35)。')+ + eq('机床中的位置 = 工件原点的位置 + 工件内的坐标')+ + p('反过来,若已知机床中的点位置,需要减去工件原点,才能得到工件内的读数。这就是最简单的“工件偏置”直觉。')+ + box('注意适用条件','这一页只有平移,方向没有转动,也没有刀长补偿。后面工件发生旋转时,还必须先把工件方向换算到机床方向,不能始终只做三个数相加。'), + '点没有动,坐标数字也可以变;改变的是量它的尺子。') + +page('第1章 · 坐标基础','04 点坐标与移动增量不是一回事', + p('“去X20”描述一个目的地;“向+X再走20”描述一段位移。当前位置不同,这两句话会产生不同结果。')+ + fig('absolute-incremental','当前位置X=10:绝对目标X20移动10;增量X20移动20,终点到X30。',250)+ + p('点坐标需要一个原点。位移向量描述从一个点到另一个点的差,原点平移不会改变这段差值;但是坐标方向转动,会改变它在另一套坐标中的分量。')+ + table(['写法','意思'],[['p=(10,5,2)','一个目标点的位置。'],['Δp=(10,0,0)','沿当前编程+X方向增加10。'],['X轴方向向量','只说明方向;不能直接当作某个目标点。']])+ + p('后面会反复用到:p表示点,Δp表示增量。不要因为都含X/Y/Z三个数就把它们混用。'), + '“目标在哪里”和“这一步走多远”是两个问题。') + +page('第1章 · 机床结构','05 五轴机床里,到底是哪五根轴?', + p('本课选择双转台桁架结构:三根直线轴X、Y、Z让刀具移动;两根旋转轴让工件转动。AC型使用A和C,BC型使用B和C。它们不是XYZABC六根独立轴都同时存在。')+ + table(['坐标字母','典型含义','本课执行部件'],[['X/Y/Z','直线位置','横梁、滑座、滑枕/刀具'],['A','绕X方向的轴线转动','AC外层倾转台'],['B','绕Y方向的轴线转动','BC外层倾转台'],['C','绕本地Z方向轴线转动','安装在倾转台上的内层转台']])+ + fig('hierarchy','两条独立分支:刀具侧XYZ;工件侧A/B→C。',220)+ + p('C的轴线装在A/B上,所以A/B倾转会连C的轴线一起带走。这不是软件的小细节,而是决定运动学计算次序的机械事实。','small'), + '先查结构图,确认谁安装在谁上面,再讨论坐标如何变换。','[S1][S3];本项目桁架模型。') + +page('第1章 · 机床结构','06 关节位置,不等于工件坐标', + p('把“关节”理解为一个执行机构及它的位置。在本项目里,J0/J1/J2对应XYZ直线轴,J3是A或B,J4是C。每个关节位置属于机构自身的运动参数。')+ + table(['对象','回答什么问题'],[['程序点','刀尖相对于选定编程参考系要到哪里?'],['关节指令','各执行轴应该到哪里?'],['实际反馈','编码器报告机械轴实际上在哪里?'],['三维模型刀尖','将关节位置代入结构模型后,画面上的刀尖在哪里?']])+ + p('简单三轴、没有偏置时,这几类数字可能很相近,容易造成“它们本来就是同一回事”的错觉。五轴RTCP会把这种差别明显表现出来:程序XYZ不变,关节XYZ却需要变化。')+ + box('理想仿真与真实机床','本项目通常把关节指令和理想反馈看成相同。真实机床还存在跟随误差、伺服滞后、机械误差和测量误差,不能仅凭指令就断言真实刀尖已精确到位。'), + '程序描述加工目标;关节是执行这个目标的机构参数。') + +page('第2章 · 参考系','07 先认识 M、W、J,再引入 K 和 T', + table(['符号','在本讲义中的含义','在哪里看'],[['M','固连机床底座的物理笛卡尔参考系。','观察真实空间位置与方向。'],['W','设计给零件编程用的工件坐标系。','图纸、CAD/CAM、G54编程。'],['J / q','各机械关节的位置集合。','J0…J4、编码器/关节显示。'],['K','已经解释偏置、尚未经过RTCP逆解的坐标输入。','本项目解释器输出到运动学的接口。'],['T','刀具参考系或刀具受控点的定义。','主轴参考点、刀长标定、TCP。']])+ + p('初学者先记住M、W、J三个概念。K是在复杂机床中避免混淆的“中间层”:控制器界面叫作Machine的XYZ,有时是运动学坐标,不能不看定义就认定它一定等于物理直线关节。')+ + p('本讲义用K做教学记号,不是要求控制器界面必须新增一个叫K的按钮。它也不是G代码中的圆弧中心地址K;同一个字母处在不同上下文中,意义不同。')+ + box('读图颜色','蓝色:机床/基础参考;绿色:工件参考;红色:目标点或刀尖。颜色帮助区分对象,不代表电气接线。'), + '本讲义的符号是为讲清层次而定义的,不是所有控制器统一的界面名称。') + +page('第2章 · 机床参考','08 回零解决什么?工件对刀又解决什么?', + p('回零建立机器执行机构的参考,使控制器知道关节位置相对于设定基准如何计量。它解决“机床自己在哪里”的问题。工件可能每次装在不同位置,回零并不会自动知道零件角点或孔中心在哪里。')+ + p('工件对刀、测头找正和设置工件偏置,解决“这次装夹的零件参考在哪里”的问题。这两类基准相互有关,但不能互相替代。')+ + table(['操作','主要作用','不会自动完成'],[['回零/HOME','建立关节或机床参考。','不会自动测得G54零点。'],['选G54','选择已保存的编程参考。','不会自动重新测量工件。'],['设置工件零点','更新零件与基础参考的配准。','不会重新标定转台中心。'],['测刀/刀长标定','建立主轴参考与刀尖的关系。','不会确定所有工件方向。']])+ + box('G28不等于点击HOME','在LinuxCNC中,G28涉及预定义返回位置;它不是本项目回零按钮的同义词。初学阶段不要仅凭“回原点”的中文说法混用两种动作。'), + '回零、找工件零点、测刀,是不同的准备步骤。','[S2][S4];实际回零方法取决于机床配置。') + +page('第2章 · 工件参考','09 工件坐标 W 代表什么?', + p('工件坐标是一套为零件几何与加工意图服务的参考。设计人员可能把顶面角点定义为(0,0,0),把孔中心写成(30,20,−5)。CAM和操作者必须采用兼容的约定,程序中的点才会落在预期部位。')+ + fig('datum-choice','原点可以选角点、中心、基准面交点等;不一定是转台中心。',260)+ + p('零件本身并没有天然写着“这里必须是X0”。原点是根据图纸、工艺、装夹和测量便利性选定的。选好以后,需测量或标定出它与机床结构的关系。')+ + box('原点自己的坐标永远为零','工件原点在工件坐标中一直是(0,0,0)。但它在机床空间的位置可能随转台转动。两个说法并不矛盾,因为参考系不同。'), + '原点是工艺约定,控制器必须得到该约定与实际装夹之间的对应关系。') + +page('第2章 · 工件随动','10 工件转了,原点与方向一起转', + fig('moving-origin','零位工件原点o=(40,20,10)mm;只看XY俯视,Z另计。',310)+ + p('设工件原点在零位参考中是(40,20,10)。当C=0°时,它在机床空间仍在(40,20,10)。当C=90°、旋转中心为零时,它移到(−20,40,10)。')+ + p('此时工件+X方向也转成机床+Y方向。工件上的P=(10,0,5)始终是“从工件原点沿工件X走10,再沿工件Z走5”,但它在机床空间从(50,20,15)变到(−20,50,15)。')+ + box('两个都要算','仅改变坐标方向、却让原点一直留在原地,一般不正确。只有原点恰好位于所转轴线上等特殊情形,原点才可能不移动。'), + '随工件固连的坐标架是一个整体:原点和三根方向箭头一起变换。') + +page('第2章 · 最重要的区分','11 “物理工件坐标架”和“G54表”不是同一对象', + p('物理上,你可以想象把一套坐标箭头画在工件上。转台转动时,这套箭头会随工件一起转。软件里,G54则是用于选取一套工件坐标设置的指令,其数据保存在控制器的偏置表中。')+ + p('在本课RTCP模型中,G54主要给出零位配准偏置;姿态改变时的空间变换由另一层运动学完成。因此,偏置表中的数字可以保持不变,但它所对应的物理工件原点会在机床空间移动。')+ + table(['层次','本课中的作用'],[['零件上的W坐标架','描述固定在零件上的位置和方向。'],['G54等偏置数据','告诉解释器如何把编程坐标换算到基础输入K。'],['RTCP运动学','利用当前A/B、C及几何参数把K换算成物理关节目标。']])+ + p('如果只打开G54而没有正确的五轴运动学,控制器并不会因此自动追踪物理工件架的旋转。非RTCP时,软件的直接坐标解释与转动后的零件局部方向可能不一致。')+ + box('不要过度推广','不同控制器可能把工件旋转、倾斜工作平面、TCP功能组合成不同指令。本课展示一条明确的数据链,不能把普通三轴G54直接称为完整五轴随动变换。'), + 'G54负责选参考数据,RTCP负责根据结构和姿态换算运动。','[S1][S2][S4];后半为本课模型与项目实测数据链。') + +page('第3章 · 原点与方向的确定','12 先约定机床零姿态,再谈工件装在哪里', + p('要描述工件装夹位置,必须先有一套明确的基础参考:旋转轴的零角度是什么姿态?倾转轴中心在哪里?C轴中心在哪里?直线轴与刀具基准怎样关联?这些由机床配置与几何标定决定。')+ + p('把转台放到定义的A/B=0、C=0姿态,可以建立零位配准参考K。零件的工件原点相对于这套参考的偏置,记作o。若工件方向也存在初始夹角,还需要初始方向变换R₀。')+ + eq('编程点 p_W → 零位配准 → p_K → 当前姿态变换 → 关节 q')+ + table(['要确定的量','谁来提供'],[['轴的零角度、正方向','回零/编码器基准与机床配置。'],['旋转中心、轴间偏置','机床结构数据、测量与标定。'],['零件原点及初始方向','工艺定义、装夹、测头或找正。'],['刀具长度与参考点','刀具测量、刀表与补偿设置。']])+ + p('这些数据不是点击“开启RTCP”时凭空生成的。RTCP只会使用已有数据计算,不能自动猜出实际工件的全部装夹关系。'), + 'RTCP能正确跟随的前提,是机床几何与工件配准都已经正确。') + +page('第3章 · 原点选择','13 工件原点放在哪里比较合适?', + p('常见选择有:毛坯顶面角点、工件中心、定位孔中心、某个基准面与两条基准边的交点。没有一种位置对所有零件都最优。应与图纸和CAM编程基准一致,并且能够稳定测量。')+ + ol('先看图纸和CAM:尺寸从哪里标起,程序预期哪个位置为零?','再看装夹:该基准在机床上是否可接近、可找正、可重复?','确认方向:+X沿哪条边,+Y朝哪边,+Z朝工件外侧还是另一约定方向?','记录采用的是毛坯面、成品基准面还是夹具基准,避免同名不同面。')+ + box('例子:顶面角点','若顶面定义为Z0,向材料内部加工的深度通常写成负Z;但这取决于你建立的+Z方向。不能看到“钻深5”就不加判断地写Z+5。')+ + p('换一次装夹,零点位置可能变化。程序里零件局部几何可以保持不变,只更新该次装夹的配准数据。这正是工件坐标的价值。')+ + p('转台中心可以作为机床标定基准,却不必与零件编程原点重合。把两者强行设成同一点,会让工艺选择受到不必要限制。'), + '方便编程、方便测量、装夹可重复,比“零点看起来居中”更重要。') + +page('第3章 · 原点测量','14 怎样把选好的原点告诉控制器?', + p('首先必须让刀尖或测头与已知基准建立真实关系。可以使用测头、寻边器、对刀棒或其他已标定的测量方法。测量工具本身的半径、长度及接触位置要考虑进去;刀具中心碰到边,不等于刀尖已经位于所选坐标原点。')+ + h('一种便于理解的零位流程')+ol('完成机床回零和刀具/测头标定。','把转台置于已知参考角度,按工艺要求找正工件。','测得原点相对于基础参考的位置,写入目标工件坐标表。','选择该坐标系,用已知的另一个点检查读数和方向。','用小幅、空载的受控运动验证,再进入实际加工。')+ + box('在倾斜姿态下对刀更要谨慎','当前关节XYZ、RTCP输入K和工件局部坐标W可能不同。不能直接把屏幕上的J0/J1/J2当作G54偏置写入。应使用控制器提供的、与当前运动学兼容的坐标设置/测量流程。')+ + p('本讲义的数字测量例仅解释偏置计算,不构成真实机床的探测轨迹。设备现场必须遵循该机床和控制系统的操作流程。','small'), + '找零点不是把三个显示框都随意清零,而是建立可验证的几何关系。') + +page('第3章 · 方向测量','15 一个原点不能确定三维方向', + fig('orientation-measure','平面内示意:O给出位置,O→Pₓ确定+X,再用不共线点确定平面及+Y。',280)+ + p('你把一个孔中心设为零,只确定了原点位置。围绕这个点,坐标架仍可以转动。要确定方向,还需要已知的边、面或更多测量点。')+ + p('常见做法是让工件基准边与预定方向对齐,并用基准面确定法向。若需要软件方向补偿,应由控制器支持的工件坐标旋转或倾斜平面功能来表达,不能只修改X/Y/Z三个平移偏置。')+ + box('完整三维配准','三个不共线的点可帮助确定一个平面及平面内方向,但仍须明确点的对应关系、顺序、正负号和右手规则。共线点无法唯一确定平面。'), + '原点回答“从哪里量”,方向回答“朝哪里量”;它们需要不同信息。') + +page('第3章 · 初始方向与动态方向','16 装夹方向和转台姿态,要分开处理', + p('假设工件在C=0时,长边已经相对基础X方向偏转了20°。这20°是装夹的初始方向关系;后来C又旋转30°,属于机床当前姿态。两者来源不同,但都影响最终空间方向。')+ + table(['量','何时确定','通常何时变化'],[['初始工件方向R₀','装夹/找正/CAM配准时。','重新装夹或修改坐标设置时。'],['转台角度A/B、C','回零基准与每条运动指令。','程序或Jog执行过程中。'],['几何中心P、偏置D','机床结构测量和标定时。','结构调整或重新标定时。']])+ + p('LinuxCNC可用特定工件坐标设置表达XY平面内旋转,例如G10 L2的R参数;它不是一个任意三维倾斜平面描述。摆头/转台结构、倾斜平面和TCP功能的组合仍要按具体控制器核对。')+ + box('本项目的数值实验范围','下面逐行实算只使用平移G54,即R₀为单位变换。讲义会解释一般方向关系,但不宣称当前Web示例已完整实现任意三维坐标旋转或所有厂商TCP指令。'), + '没有声明初始装夹方向时,不能擅自认为工件边一定平行于机床导轨。','[S4] G10 L2;项目实验边界见后文。') + +page('第3章 · 原点和方向合起来','17 一个点怎样从工件坐标换算到机床空间?', + p('先不看公式。把工件原点在机床空间的位置标出来;再把工件+X、+Y、+Z三个方向换算到机床空间。最后,沿这些方向分别走程序给定的距离。')+ + eq('空间目标 = 当前工件原点 + X·工件X方向 + Y·工件Y方向 + Z·工件Z方向')+ + p('用数学记号写为 r_M = O_M + E_MW·p_W。O_M是工件原点在机床中的位置,E_MW的三列是工件三个单位方向在机床中的分量。矩阵只是把“三个方向加权相加”缩写起来。')+ + fig('moving-origin','转台改变姿态时,O_M和E_MW一般都变化;工件点p_W可以保持。',270)+ + box('方向与位置的不同','增量只用方向关系:Δr_M = E_MW·Δp_W,前提是这一增量过程中姿态保持不变。若角度也在变化,原点和方向同时变,必须计算完整运动过程。'), + '固定姿态时可以只变换增量;姿态在变时必须处理完整的点变换。') + +page('第4章 · G54与偏置','18 G54究竟做了什么?', + p('G54选择第一套工件坐标设置。LinuxCNC中还有G55、G56、G57、G58、G59、G59.1、G59.2、G59.3,合计九套。你可以给不同工件、不同装夹或不同夹具保存不同偏置。')+ + table(['选择指令','G10中的P编号','本页教学含义'],[['G54','P1','第一套坐标设置'],['G55','P2','第二套坐标设置'],['G56…G59','P3…P6','第三至第六套'],['G59.1…G59.3','P7…P9','第七至第九套']])+ + p('G54具有模态性:选中后,后续适用的运动指令继续使用它,直到选了同组的另一个坐标系。单独执行G54没有轴目标时,不会自动让刀具移动到工件零点。')+ + box('注意同一行可能同时有运动','“G54”只选择坐标系;但“G54 G1 X10”还包含运动目标,后者会按该坐标系及当前模式解释X10。不能只看到行里有G54就认定不会运动。'), + '选择参考,不等于走到参考原点。','[S2][S4] 坐标选择;实测G54/G55见gcode-evidence.json。') + +page('第4章 · 偏置的物理含义','19 G54的40、20、10代表什么?', + p('本课统一例子:在零角度、零几何偏置且方向对齐的教学模型里,设工件原点相对于K参考为o=(40,20,10)mm。意思是先沿K的X方向40、Y方向20、Z方向10,才到工件原点。')+ + code('G21 G90\nG10 L2 P1 X40 Y20 Z10\nG54')+ + p('当程序要求工件点X10 Y0 Z5时,解释器得到K输入(50,20,15)。到这一步还没有完成五轴运动学计算;随后还要依据B/C或A/C及几何参数得到关节目标。')+ + fig('offset-pipeline','同一例子继续取C=90°,RTCP最终关节XYZ为(−20,50,15)。',265)+ + p('因此,G54偏置中的40不能理解成“无论转台怎么转,工件原点都固定在机床X=40”。它是零位配准数据,动态空间位置由RTCP继续换算。','small'), + '工件偏置先进入编程坐标解释,转台姿态随后进入运动学。','本项目WASM解释器与运动学实测;o=(40,20,10)、P=D=L=0。') + +page('第4章 · 设置方法一','20 G10 L2:把已知偏置写入坐标表', + code('G21\nG10 L2 P1 X40 Y20 Z10'), + '这条指令设置参考数据,不是命令XYZ运动到(40,20,10)。','[S4];同程序实际执行未产生运动段。') +# Fill the page separately to keep the address-word explanation readable. +PAGES[-1]['body']+=table(['地址字','本行含义'],[['G10','设置某类数据,具体对象由L等参数决定。'],['L2','本例为直接设置工件坐标偏置。'],['P1','第一套工件坐标设置,即G54。'],['X40 Y20 Z10','在本课约定下,直接写入三项长度偏置。'],['G21','当前长度单位是mm;不要把单位上下文省略。']])+p('G10 L2适合“已经知道偏置是多少”的情况。它不是“把当前位置显示成某个值”的自动计算命令。若误把L20的用法套在L2上,偏置会被设置到完全不同的值。')+box('G10里的X不一定是运动目标','同一个地址X,在运动段里可以表示目标;在G10设置段里表示配置参数。一个数到底有什么作用,必须结合该行的G代码和L/P上下文。') + +page('第4章 · 设置方法二','21 G10 L20:让当前位置具有指定工件坐标', + p('假设刀尖已处在本课K位置(70,30,20),你确认它就是工件原点。想让此时工件读数变为(0,0,0),控制器需要把G54偏置设置为(70,30,20)。')+ + code('G10 L20 P1 X0 Y0 Z0')+ + eq('偏置 o = 当前位置 p_K − 希望此刻显示的工件坐标 p_W')+ + p('若当前位置仍为(70,30,20),但希望此点显示为工件X10 Y0 Z0,则偏置变成(60,30,20)。改变的是坐标设置,不是机床执行轴的位置。')+ + table(['动作','K中的X','G54工件X'],[['刀尖保持当前位置','70','取决于原偏置'],['L20 P1 X0','70','0'],['之后G54 G90 G1 X10','80','10']])+ + box('倾斜时不能随意代入关节','公式中的当前位置必须是该控制器用于工件坐标设置的参考位置。本课RTCP下它是经正解/同步的K,通常不是J0/J1/J2。实际使用前应按控制器的TCP兼容测量流程确认。'), + 'L2写“偏置是多少”;L20给“当前位置应读成多少”,由控制器算偏置。','[S4];零旋转实测L20偏置与后续X10运动。') + +page('第4章 · 两个坐标系','22 换G54/G55为什么可能只改数字、不动机床?', + p('给G54设置o₁=(40,20,10),给G55设置o₂=(80,−10,10)。刀尖已在K=(50,20,15)。选择不同坐标系时,同一位置会产生不同局部读数。')+ + table(['状态','关节/刀尖是否立即移动','读数或下一步目标'],[['当前G54','否','W₁=(10,0,5)'],['单独选择G55','否','W₂=(−30,30,5)'],['再执行G90 G1 X10','是','K的X变为90;未写的Y/Z保持原位置']])+ + p('同一个X10在G54和G55中指向不同目的地。若程序意图是加工两个不同装夹位置的相同零件,这正是需要的行为;若是无意中选错坐标系,就会整段偏移。')+ + box('工件坐标切换与RTCP切换不是一回事','G54→G55更换配准数据;M429→M428更换运动学解释。两类切换本身都不应作为“无目标的移动指令”,但它们改变后续运动字值的含义。')+ + p('下方数值使用方向对齐的参考K来展示偏置。转台已倾斜时,物理空间关系还要经过RTCP变换。','small'), + '换尺子可以只改变读数;按新尺子再给目标,才可能让机床运动。','[S2][S4];G54/G55选择及省略轴实测。') + +page('第4章 · 附加偏置与基础坐标','23 G52、G92、G53:先学会不混用', + table(['指令/功能','通用理解','初学者要点'],[['G52','在已有工件参考下使用局部偏置。','不是自动测得新的装夹原点。'],['G92','通过坐标重新定义产生附加偏置。','可能与持久化设置有关,不能假设程序结束就完全清掉。'],['G53','本段使用控制器定义的机床坐标方式。','非模态;不等同于HOME,也不保证直接控制电机关节。']])+ + p('多层偏置叠加后,程序点到基础参考的换算不再只有一个G54。排错时必须查看当前有效的所有层,不能只盯着G54表里的三个数字。')+ + p('尤其在非平凡运动学机床上,控制器的“机床坐标”仍可能是运动学输入空间。G53不意味着跳过所有运动学,G53 Z0也不能被当作通用安全退刀动作。')+ + box('本讲义的实验边界','主程序刻意不用G52/G92,也不依靠G53绕过RTCP。这一页讲官方语义与排错意识;当前Web切片没有在本课中完成这些功能的全行为验收。'), + '只在理解所有有效偏置后再组合使用;初学实验先保持参考层次简单。','[S2][S4];对G53关节语义需按具体运动学核对。') + +page('第5章 · 非RTCP与RTCP','24 非RTCP:“独立”的准确含义', + p('对于本课直接映射模式,经过单位/偏置解释后,X/Y/Z对应直线关节,A/C或B/C对应旋转关节。只命令C转动,不会自动追加保持刀尖相对工件点的XYZ补偿。')+ + fig('identity-no-follow','只转C:工件标记点被带走,刀尖留在机床原位置。',255)+ + p('这不表示各轴不能同时运动。例如一行同时给X、Y、B、C目标,控制器仍可协调插补。也不表示零件与刀具之间“完全没有关联”:物理工件转了,二者的相对位置当然会变。')+ + box('没有RTCP也可以五轴加工','CAM/后置可以事先针对指定机床结构计算各轴轨迹,交给控制器执行。但换机床几何、刀长或装夹后可能需要重新计算;它与控制器实时进行RTCP不是同一机制。'), + '独立是“没有自动的姿态几何补偿”,不是“没有同步插补或相对运动”。') + +page('第5章 · 非RTCP与RTCP','25 RTCP控制的是相对目标关系', + p('RTCP可理解为旋转姿态变化时的刀尖位置补偿。给定目标工件点以及A/B、C角度,控制器结合机床几何计算所需关节位置,让刀尖实现规定的相对工件轨迹。')+ + fig('tcp-follow','保持同一工件点,角度改变时XYZ按需跟随。图为零偏置简化模型。',255)+ + p('“刀尖保持”有两种不同说法:保持在机床空间同一点;保持相对工件的同一点。本课RTCP讲的是后者。工件转动时,该点在机床空间可能沿弧线移动,所以刀尖也需要移动。')+ + box('正确的观察方式','在工件上选一个离旋转轴有距离的标记点,先让刀尖对准它,再保持编程XYZ、改变角度。应看刀尖与标记点是否继续对齐,而不只是看屏幕XYZ有没有变。'), + 'RTCP不要求刀尖在世界里绝对不动,而要求它满足指定的相对工件关系。','[S1] 五轴运动学;本项目原生AC/BC正逆解。') + +page('第5章 · RTCP工件原点','26 用G54例子看“原点随动”', + p('现在使用贯穿后续章节的例子:BC结构,B=0;几何中心P=0、偏置D=0、刀长差L=0;G54零位偏置o=(40,20,10)。程序目标始终为W=(10,0,5)。')+ + table(['C角度','工件原点的机床位置O_M','刀尖目标/关节XYZ','程序W'],[['0°','(40,20,10)','(50,20,15)','(10,0,5)'],['90°','(−20,40,10)','(−20,50,15)','(10,0,5)']])+ + fig('moving-origin','两种姿态下,刀尖相对工件原点的局部分量始终相同。',270)+ + p('注意:G54表仍是40、20、10,没有每次改写成−20、40、10。后一个值是由当前姿态算出来的空间位置,不是要求操作者实时改G54。','small'), + '固定的是工件内的定义与零位配准数据,变化的是它们在机床空间的表达。','本课WASM逐字解析和逆解核验;详细行表见第7章。') + +page('第5章 · RTCP方向','27 沿工件X前进,哪些电机会动?', + p('在C=45°、倾转角为0°时,工件+X方向斜着指向机床+X和+Y。沿工件X增加10mm,必须由两根固定导轨合成:机床X约增加7.071mm,机床Y约增加7.071mm。')+ + fig('rotated-direction','绿色方向随工件,蓝色机床导轨方向不转。',295)+ + eq('姿态固定:Δq_X = 10 cos45°;Δq_Y = 10 sin45°')+ + p('XYZ导轨并没有在机械上旋转。变的是工件方向在机床中的表达。编程沿一根工件轴走,实际可以由两根或三根直线关节一起完成。')+ + box('原点为何没有出现在增量式里?','因为这一页姿态固定,比较的是两个目标点的差,平移项相减后消失。若B/C也在同一过程中变化,就不能只用这条固定方向增量式。'), + '一个X字,不一定只驱动X电机;先问它属于哪套参考系。') + +page('第5章 · 倾转与结构顺序','28 加入B或A后,方向可以进入三个维度', + p('BC结构中,B倾转带着C轴一起倾斜。采用本项目约定,零偏置变换为R=R_Y(B)R_Z(C)。当B=30°、C=45°时,工件+X的机床方向分量约为(0.6124,0.7071,−0.3536)。')+ + fig('bc-frame','保持B=30°、C=45°时,沿工件X前进10mm,会同时改变三个直线轴。',300)+ + eq('Δq ≈ (6.124, 7.071, −3.536) mm')+ + p('AC则使用R_X(A)R_Z(C)。同样写30°、45°,AC与BC的刀尖空间位置一般不同。矩阵从右向左作用,表达父子结构的坐标转换顺序,并不是要求先完成C动作再单独执行A/B。')+ + p('这里的正方向采用本项目原生计算约定;实际机械正转、工件视角和摄像机视角可能使视觉直觉相反,必须用正确标定核对。','small'), + 'RTCP用的是完整机构链,不能只把A字母改成B就期待相同空间姿态。') + +page('第5章 · 三类偏置','29 G54、旋转中心、轴间偏置各管什么?', + table(['参数','属于什么关系','不能拿来替代'],[['G54偏置o','零件编程原点与基础参考K的配准。','不是转台的物理轴心标定。'],['rot-point P','本项目原生TRT的旋转参考位置。','不是每次装夹都应随便改的零件零点。'],['axis offset D','倾转轴与C轴之间的结构偏置。','不是普通工件坐标平移。'],['tool-offset L','刀具参考与受控点的标定量。','不是看到网格长度后直接填的任意长度。']])+ + p('这些量都可能以mm显示,但含义和进入公式的位置不同。如果刀尖偏差源于转台中心错误,单靠修改G54可能只在某个角度碰巧对齐,换一个姿态就再次偏离。')+ + fig('pivot-offset','起点相同、角度相同,绕不同中心会产生不同目标位置。',235)+ + box('标定与装夹分开','机床结构参数应通过结构测量和标定确定;工件偏置用于表达该次装夹。教学可以故意改参数做对照,但真实设备不能把结构标定当成随手找零工具。'), + '看到“偏移多少毫米”时,还必须问:是哪个参考系之间的偏移?') + +page('第5章 · 刀具参考','30 为什么必须知道刀尖究竟在哪里?', + p('电机驱动的通常是滑台和主轴箱,程序关注的却是刀尖。主轴参考点与刀尖之间相隔一段刀具长度。如果更换刀具后长度不同,保持同一主轴位置并不能保持同一刀尖位置。')+ + fig('tool-length','相同刀尖目标:刀更长时,主轴参考位置需要按正确约定调整。',250)+ + p('在LinuxCNC的完整刀补语义中,G43 H3表示使用指定刀具长度偏置条目;H3不是“刀长等于3mm”。T表示工具选择,M6表示换刀流程,S表示主轴速度,也不能与刀长混用。')+ + box('本项目边界特别说明','主数值实验统一L=0。当前Web解释器切片的H/G43处理不能当作完整LinuxCNC刀表语义的验收依据,因此讲义不把“程序成功解析”冒充“完整刀补行为正确”。真实应用须使用经过验证的刀表和测刀链路。')+ + p('RTCP、刀长补偿、倾斜工作平面是相互配合的功能,不是一个开关的三个名字。','small'), + '先标定刀具参考点,再讨论刀尖目标;网格看起来像刀具,并不代表它已正确标定。','[S4] G43;本项目sim_interpreter.c的能力范围与本课测试边界。') + +# Remaining chapters are appended below, then rendered as fixed A4 pages. +page('第6章 · 读懂G代码','31 一行G代码由“地址字”组成', + code('N50 G1 X10 Y0 Z5 B0 C0 F600')+ + p('一个地址字通常由字母和数值组成,例如X10。字母说明这个数属于什么类别;当前G/M代码和模态状态进一步决定它的具体作用。空格用于阅读,不是每个空格后就执行一次运动。')+ + table(['字','本行解释'],[['N50','程序段编号,便于识别,不是运动距离。'],['G1','按进给方式生成直线类型的运动段。'],['X10 Y0 Z5','在当前绝对/增量和坐标设置下给出XYZ。'],['B0 C0','给出旋转轴角度目标;本课为BC结构。'],['F600','设置进给值,含义受进给模式和单位影响。']])+ + p('控制器应先读完整个程序段,检查语法与模态组,再求出整体目标。不能把它理解成先走X10、走完再走Y0、再走Z5、再转B和C。')+ + p('本课旋转轴的工件偏置为零,所以B/C字直接成为相应关节角度目标;若启用了角度偏置,也要先换算,不能只看字面角度。','small')+ + box('先问三个问题','当前在用哪套坐标?G90还是G91?RTCP是否已开启?这三项不清楚,仅看X10这个字不能确定电机终点。'), + '地址字是数据;程序段和当前模式共同决定数据的含义。','[S5] G-code Overview;N50为项目实测程序段。') + +page('第6章 · 模态状态','32 没有写出来的内容,可能沿用上一行', + p('模态可以理解为控制器记住的当前设置。G1、G90/G91、G20/G21、G54等在不同模态组中生效。后续行省略这些字时,常会沿用之前的设置。')+ + code('G21 G90 G54 G1 X10 Y0 Z5 F600\nC90\nG91 X10\nG90 X20')+ + p('第二行只有C90,但它仍处于G1、G90、G21、G54环境,F仍为600。第三行把距离模式切换成G91,X10变成增量。第四行恢复G90,X20又变成绝对目标。')+ + table(['省略什么','通常怎样理解'],[['省略G1','沿用有效运动模式;不是自动停止解析。'],['省略F','在允许沿用的进给模式下保留原值;G93另有要求。'],['省略XYZ某一轴','通常保持该坐标分量的当前目标,不自动归零。'],['省略角度字','保持当前角度目标,不自动回零角度。']])+ + box('同组冲突','不要在同一段同时写互相矛盾的同组模式,例如G90和G91。合法的执行顺序不等于可以把冲突指令堆到一行。'), + '读一行程序时,要带着“当前状态表”一起读。','[S4][S5] 模态与程序段;本文只涵盖常用运动模式。') + +page('第6章 · 单位','33 G20/G21改变长度单位,不把角度变成长度', + table(['数值类别','G21示例','G20示例'],[['X/Y/Z长度','X1为1mm','X1为1inch=25.4mm'],['A/B/C角度','本课以度计','仍按控制器旋转角约定,不把1°换成25.4°'],['G94直线进给F','F600通常为600mm/min','F2通常为2inch/min=50.8mm/min'],['G93的F','逆时间,见进给专页','不是长度值,不能机械乘25.4']])+ + p('本课WASM已实测:G20 G91 X1产生25.4mm的直线增量,G94下F2换算为50.8mm/min。然后换回G21时,后续长度又按mm解释。')+ + p('变量、刀表、测量结果以及URDF还可能使用各自定义的单位。教学数据进入某一接口前应先统一,不要因为屏幕只显示一个数字就忽略单位。')+ + box('一个常见大错误','把毫米程序放在英寸模式下运行,会让每个长度字放大25.4倍。反过来也不正确。程序头明确声明单位,通常比依赖上次运行残留状态更可靠。'), + '长度、角度、转速、时间、索引号是不同量纲;不能用一个换算规则处理所有数字。','[S4] G20/G21/G93/G94;长度/直线进给转换已实测。') + +page('第6章 · 绝对目标','34 G90 X10:去当前编程系的X=10', + p('在G90中,X10通常表示当前有效编程参考系中的绝对目标X值为10。它不是“再走10”,也不是“无论有什么偏置,电机都去10”。')+ + p('本课条件:G54的o=(40,20,10),方向对齐,B=0、C=90°,RTCP开启,当前目标W=(20,0,5)。执行G90 G1 X10,新的W目标变为(10,0,5)。')+ + table(['计算层','新目标'],[['工件坐标W','(10,0,5)'],['加G54得到K','(50,20,15)'],['C=90°后关节XYZ','(−20,50,15)']])+ + p('原来W=(20,0,5)对应关节(−20,60,15),所以这一动作让机床Y减少10mm。虽然程序只写X10,实际发生变化的是本例的Y关节。')+ + box('不要把G90看成“机床坐标开关”','G90只是绝对距离模式。它仍与G54等坐标设置共同起作用,并没有替代工件坐标系选择。'), + '“绝对”必须说明是相对于哪套当前有效参考,而不是自动等于机床电机绝对位置。') + +page('第6章 · 相对增量','35 G91 X10:在当前编程方向增加10', + p('仍用G54 o=(40,20,10)、B=0、C=90°、RTCP开启。当前位置W=(10,0,5)。执行G91 G1 X10后,W变为(20,0,5),K从(50,20,15)变为(60,20,15)。')+ + eq('新目标W = 旧目标W + (10,0,0)')+ + p('角度保持C=90°,因此该增量在机床空间沿+Y方向,关节从(−20,50,15)变为(−20,60,15)。偏置不应被重复加两次。')+ + code('G91 G1 X10\nG90')+ + p('如果同一段还有B10或C20,它们在G91下通常也表示角度增量。控制器先形成新的整体坐标/角度目标,再插补并求解;不能把变化的姿态当成整段保持不变,只旋转一次XYZ增量就结束。')+ + box('省略轴的正确理解','G91只写X10时,未写的轴不增加数值;在RTCP中,为实现这个编程增量,多个物理关节仍可能同时变化。记得之后是否需要恢复G90。')+ + p('旋转轴还可能有展开角度或回绕设置。C=0与360的空间方向可以相同,但关节位置、行程和运动路径未必相同;本课不假设控制器自动选择最短转动路径。','small'), + 'G91改变目标的形成方式,不取消工件方向和RTCP计算。') + +page('第6章 · 运动方式','36 G0/G1分别如何产生运动?', + p('G0用于快速定位类运动,G1用于按进给规则执行直线类型运动。给出的通常是该段目标,而不是每个伺服时刻的位置。控制器的规划器决定加减速、插补进度及与相邻段的衔接。')+ + table(['层次','G1 XYZBC在本课中的处理'],[['编程空间','定义XYZ与角度的起点/终点以及运动类型。'],['插补','逐步得到中间位置和中间角度。'],['运动学','每个采样按该时刻姿态和结构求解关节。'],['执行','输出连续的关节位置/速度,并检查限制。']])+ + p('G1说的“直线”属于控制器定义的编程空间运动,不意味着所有机械部件在世界中都走一条直线。保持同一工件点、转动C时,刀尖可以在机床空间走弧线。')+ + box('不要只检查终点','如果在两个端点做了正确逆解,却在关节之间用不相符的方式连线,中途可能偏离工件轨迹。正确RTCP必须在整个运动过程中维持目标关系。')+ + p('G0的具体协调方式、G64圆滑和G61精确路径等规则因控制系统而定。初学者不应把快速定位当作任何场景下的安全路径。','small'), + '程序给段目标,规划器给连续过程,运动学给各轴实现方式。','[S4] G0/G1;项目规划器与运动学实测。') + +page('第6章 · 圆弧地址','37 G2/G3里的I、J、K不是三根新电机轴', + p('G17通常选XY圆弧平面;G18、G19选择其他主要平面。G2/G3给出圆弧方向,圆心可以由I/J/K等地址表达。圆心方式有独立的绝对/增量规则,不能仅看G90/G91就猜圆心如何解释。')+ + code('(教学条件:G17,圆心增量方式)\n(起点 X10 Y0,圆心 X0 Y0)\nG3 X0 Y10 I-10 J0 F300')+ + fig('arc-words','圆心增量从圆弧起点量:I=-10、J=0;不是从工件原点量两个绝对坐标。',245)+ + p('本例圆心增量等于“圆心−起点”。R有时也可表示圆弧半径,但它在其他指令中又可能表示不同参数。姿态固定时,工件平面中的圆弧映射到机床中的相应倾斜平面。')+ + box('本课不混合演示','圆心模式、整圆/多圈、R长短弧以及圆弧期间同时转台运动,需要按控制器文档逐项确认。不要把一段已知平面圆弧随意扩展成未验证的复杂五轴程序。'), + '同一个字母的含义由当前指令规定;I/J/K经常是圆心参数,不是位置轴。','[S4] G2/G3、G17–G19、G90.1/G91.1。') + +page('第6章 · 进给','38 F到底是速度、时间,还是每转进给?', + table(['模式','F的基本含义','例子'],[['G94','每分钟进给;线性、纯旋转或混合段需按控制器规则。','直线段F600mm/min≈10mm/s。'],['G93','逆时间进给,F的单位为1/min。','F2对应理想段时间1/2分钟=30秒。'],['G95','每主轴转一圈的进给量。','F0.1mm/rev,配合实际主轴转速。']])+ + p('RTCP下,仅仅保持编程XYZ、改变角度,也可能引发XYZ关节移动。F不等于“每根电机都以这个数值运动”。各关节速度是插补过程和运动学变化共同作用的结果。')+ + p('LinuxCNC对G94纯旋转段和含直线分量的运动有具体规则;G93可用于表达段时间,但仍受速度、加速度等限制。G93下G1/G2/G3通常每段需要F,不能直接照搬G94省略F的习惯。')+ + box('单位计算只说明请求,不保证实际达成','F600=10mm/s是单位换算。实际运动可能因加减速、限位和机床能力更慢。控制器不应为了追求F而越过能力约束。')+ + p('当前Web切片的全部进给模式并非本课程验收对象;主算例采用G94,额外模式依据官方语义讲解。','small'), + '看到F,先查进给模式;判断轴运动,还要查规划器和机器约束。','[S3][S4] G93/G94/G95。') + +page('第6章 · 其他常见字','39 不是每个数字都代表位置', + table(['字/指令','常见含义','容易误解的地方'],[['S12000','主轴转速请求。','不是刀具线速度或XYZ距离。'],['T3 / M6','选择工具号 / 执行换刀流程。','不等于自动设定工件原点。'],['G43 H3','使用指定刀长偏置条目。','H3不是刀长3mm。'],['D','常见为刀具半径补偿索引。','不是通用“深度”字。'],['G10 L2 P1','L指定设置类别,P选目标坐标表。','P1不是转台转1°。'],['G4 P…','停留参数,按控制器定义。','同一P在G10里却是编号。'],['R / Q','圆弧/循环/设置中的上下文参数。','不能固定解释为半径或角度。'],['M3/M5/M8等','主轴/冷却等辅助动作。','不是每个M码都有跨品牌同义。']],'compact')+ + p('本项目M428/M429是重映射到运动学切换和同步的命令。其他控制器可能采用完全不同的代码组合;把本项目的编号直接复制到真实机床上没有通用性。')+ + box('逐字阅读的方法','先识别G/M指令和当前模式,再给每个地址字标注“长度、角度、速度、时间、编号或设置值”,最后再计算目标。'), + '字母相同不保证意义相同;上下文比数字本身更重要。','[S4][S5];M428/M429为本地INI重映射。') + +page('第6章 · 从文本到运动','40 控制器不是从左到右逐个字移动', + ol('读取程序段:识别注释、地址字、数值和参数表达式。','检查语法与模式:单位、距离方式、坐标系、运动类型是否有效且无冲突。','形成整体目标:G90写绝对值,G91加增量;处理省略轴和当前状态。','应用坐标设置:工件偏置、允许的坐标旋转/补偿,得到规范输入。','规划轨迹:速度、加速度、路径衔接和同步屏障。','逐采样计算运动学:根据该时刻位置、角度、中心/偏置/刀具数据求关节。','执行与反馈:伺服驱动/仿真推进;界面再显示实际状态与轨迹。')+ + p('同一行中的X和B是一个联合目标,不是先走X再转B。控制系统有规定的执行顺序与模态语义;文本排列不能代替这些规则。变量和表达式也先按解释器规则求值,再成为数值输入。')+ + box('“解析成功”不等于“可以安全运动”','后面还可能发生缺少回零、越限、刀补不完整、速度约束或几何错误。教学验证至少要看解释结果、规划结果和实际采样。'), + '每一层都应有可观察的输出,不能把程序文本直接当成模型关节值。','[S5] 程序段规则;本项目解释器→TP→WASM→模型链路。') + +page('第7章 · 完整实算程序','41 统一实验条件与完整程序', + p('以下每一行都用相同数据核验:BC双转台;旋转中心P=0、轴间偏置D=0、刀长差L=0;工件方向与零位K对齐;G54偏置o=(40,20,10)mm;初始物理关节均为0。')+ + code('\n'.join(DATA['rows'][i]['block'] for i in range(len(DATA['rows'])))+'\nM2')+ + p('N10–N90加M2已通过真实项目解释器、LinuxCNC TP和WASM运动学完整执行;N100/N110另用保持物理关节的切换接口逐段验证。每条运动的关键终点都与解析+逆解结果对照。','small')+ + box('下载示例与教学参数不同','本项目下载GLB自带非零中心/偏置。这里为讲清G54与RTCP分层,使用独立零几何测试配置;不是在任意当前机床状态下粘贴代码就应得到同样数字。'), + '本章的数字是固定条件下的可复算例子;改变条件,结果也会改变。','gcode-evidence.json:rtcp-beginners-gcode-v1;完整程序状态completed。') + +page('第7章 · 第一步','42 N10–N30:设置模式与工件参考', + code('N10 G21 G90 G94 G17\nN20 G10 L2 P1 X40 Y20 Z10\nN30 G54')+ + table(['程序段','改变什么','是否生成运动'],[['N10','单位mm、绝对方式、每分钟进给、XY平面。','没有目标轴,不运动。'],['N20','把G54偏置设为(40,20,10)。','设置数据,不运动。'],['N30','选择G54为有效坐标系。','单独选择,不运动。']])+ + p('初始物理关节仍是0。G54偏置设定后,原来的空间位置在这套编程坐标中可显示为(−40,−20,−10)。不是刀具突然往负方向跑了,而是这套尺子的原点不在刀具当前位置。')+ + box('读数变化的第一种原因','修改偏置表就可能改变当前相对读数。验证有没有运动,要检查关节/反馈和刀尖物理位置,不能仅凭屏幕上相对XYZ变化判断。')+ + p('N10的G17目前只是声明圆弧平面。本程序只有直线类型段,不会因为写了G17就产生一段圆弧。'), + '程序准备阶段可能只改解释状态,还没有开始移动。') + +page('第7章 · 第二步','43 N40 M428:先切模式,不凭空移动', + code('N40 M428')+ + p('本项目中,M428选择RTCP运动学并同步解释器与运动状态。切换时要先读取当前物理关节,再用新模式正解出对应的坐标。它不是“保持旧XYZ数字,再反算出一组新的关节”。')+ + p('在本章初始姿态下,关节为0、角度为0、几何偏置为0。Identity和RTCP在这个姿态碰巧给出相同的基础位置K=(0,0,0),因此G54相对读数仍为(−40,−20,−10)。')+ + table(['量','N40之后'],[['关节XYZ/B/C','全部保持0。'],['基础输入/同步坐标K','(0,0,0)。'],['G54相对XYZ','(−40,−20,−10)。'],['运动学模式','从Identity改为本项目TCP。']])+ + box('不能由这个特例推广','角度不为零或中心/偏置不为零时,切换后的坐标数值一般可能改变。但关节与物理刀尖仍应保持。后面N100/N110会看到明显的数字差异。'), + '模式切换准备新的坐标解释;有明确运动段时才产生后续轨迹。') + +page('第7章 · 第三步','44 N50:把第一个工件点送到刀尖', + code('N50 G1 X10 Y0 Z5 B0 C0 F600')+ + ol('G90生效:新的工件XYZ目标为(10,0,5),不是在旧位置上增加。','B0/C0给出零角度;F600更新G94进给请求。','加G54偏置:(10,0,5)+(40,20,10)=(50,20,15)。','旋转角度为零、几何P/D/L均为零,逆解XYZ与K相同。','关节目标得到(50,20,15,0°,0°),随后由规划器从当前位置插补到此。')+ + table(['层次','数值'],[['程序工件点W','(10,0,5)mm'],['运动学输入K','(50,20,15)mm'],['XYZ关节目标','(50,20,15)mm'],['B/C关节目标','0° / 0°']])+ + box('Y0和Z5的读法','Y0指向工件Y=0,不是把机床Y归零;本例机床Y目标实际是20。Z5是工件基准面上方5mm,前提是本课+Z方向朝该侧。'), + '先算工件参考里的目标,再算偏置和运动学,不跳过中间层。') + +page('第7章 · 第四步','45 N60 C90:XYZ字没出现,XYZ关节却动了', + code('N60 C90')+ + p('G1、G90、G21、G54、F600仍然有效。只更新C的绝对目标为90°,工件XYZ仍保持(10,0,5),B仍为0。运动学输入的XYZ继续为(50,20,15)。')+ + eq('q_X = 50cos90° − 20sin90° = −20
q_Y = 50sin90° + 20cos90° = 50
q_Z = 15')+ + table(['比较','N50末端','N60末端'],[['工件XYZ','(10,0,5)','(10,0,5)'],['基础K的XYZ','(50,20,15)','(50,20,15)'],['关节XYZ','(50,20,15)','(−20,50,15)'],['B/C','0° / 0°','0° / 90°']])+ + p('工件原点本身也从(40,20,10)移动到(−20,40,10)。在新姿态下,再沿工件X走10、Z走5,就到刀尖目标(−20,50,15)。')+ + box('这就是RTCP跟随','省略XYZ不表示禁止XYZ电机动作;它表示程序点不变。为了维持这个点相对工件的位置,XYZ关节可以需要运动。'), + '程序量保持与关节量保持,是两个完全不同的约束。') + +page('第7章 · 第五步','46 N70 G91 X10:沿转后的工件方向走', + code('N70 G91 X10')+ + p('这一行把距离模式改为增量。原工件点W=(10,0,5),现在沿工件+X增加10,得到W=(20,0,5)。B/C没有写,保持0°/90°。')+ + table(['步骤','结果'],[['形成工件终点','(10,0,5)+(10,0,0)=(20,0,5)'],['转换到K','(20,0,5)+(40,20,10)=(60,20,15)'],['C=90°的逆解','关节XYZ=(−20,60,15)'],['相对上一步的关节变化','Δq=(0,+10,0)mm']])+ + p('所以程序写了X10,机床Y关节却增加10mm。这不是轴接错,而是“工件+X”当前指向机床+Y。图形上刀尖沿转动后的工件方向移动。')+ + box('偏置不要重复累加','G91是在当前编程位置上增加位移。错误地把旧K位置再加一遍G54偏置,会让目标多出(40,20,10)。本课解析实测验证没有这种重复偏置。')+ + p('N70之后G91仍有效。下一行如果继续写X20而不恢复G90,就又是增加20,而不是去X=20。'), + '每次出现G90/G91,都应更新你的“当前模式表”。') + +page('第7章 · 第六步','47 N80:工件点不变,B倾转带来X/Z补偿', + code('N80 G90 X20 Y0 Z5 B30 C90 F300')+ + p('先恢复G90,工件XYZ绝对目标仍为(20,0,5),与N70末端相同。C保持90°,B从0°变为30°,F改为300。K的XYZ保持(60,20,15)。')+ + p('先按C=90°换算,得到(−20,60,15);再按B=30°绕Y方向倾转:')+ + eq('q_X = (−20)cos30° + 15sin30° ≈ −9.821
q_Y = 60
q_Z = −(−20)sin30° + 15cos30° ≈ 22.990')+ + p('此时工件原点的空间位置约为(−12.321,40,18.660)。工件X方向当前沿机床+Y;工件Z方向则含机床X和Z两个分量。把W=(20,0,5)按这些方向加到原点上,也得到同一个关节XYZ。')+ + box('两种计算方式,结果相同','可以“先形成K,再按转台链变换”;也可以“求当前工件原点与基方向,再组合W点”。它们是同一几何关系的两种表达,不应产生两套不同答案。'), + '倾转只改变B字,也可能要求直线轴联动;这正是补偿的任务。') + +page('第7章 · 第七步','48 N90:省略的Z、B、C保持当前目标', + code('N90 X0 Y10')+ + p('因为N80恢复了G90,这里的X0/Y10是工件绝对目标,而不是增量。Z没有写,保持5;B保持30°,C保持90°;G1、G54、G21、F300继续有效。')+ + table(['量','新的目标'],[['完整工件XYZ','(0,10,5)'],['完整角度B/C','30° / 90°'],['K的XYZ','(40,30,15)'],['C旋转后的中间点','(−30,40,15)'],['B倾转后的XYZ关节','(−18.481,40,27.990)']])+ + p('完整程序在这一段后执行M2。真实WASM规划器跑到程序完成时,关节终点与上述逐字解析、逆解计算一致;不是只在纸上进行了三角函数演算。')+ + box('省略不代表零','如果你把省略的Z读成0,会得到不同的点。把省略的B/C读成0更会改变整套空间方向。初学时可以把每行补成“完整目标表”,即使程序文本只写了两个字。'), + '程序短,不代表有效状态少;把沿用状态补全后再计算。','gcode-evidence.json:最终joint=(-18.480762,40,27.990381,30,90)。') + +rows=[] +for row in DATA['rows'][4:9]: + rows.append([row['block'].split()[0],xyz(row['work_xyz']),xyz([row['canonical'][a] for a in 'xyz']),f"{row['joints'][3]:g} / {row['joints'][4]:g}",xyz(row['joints'])]) +page('第7章 · 全过程汇总','49 把五组数字同时放在一张表里', + table(['段号','工件XYZ','K输入XYZ','B/C(°)','关节XYZ'],rows,'compact')+ + p('比较N50与N60:工件XYZ和K的XYZ都不变,关节随C改变。比较N60与N70:在C=90°时沿工件X增加10,反映为机床Y增加10。比较N70与N80:工件点相同,只倾转B,X/Z关节补偿。')+ + fig('continuous-joints','N60整段C从0到90°:图中是XYZ关节变化,不是程序工件XYZ变化。',275)+ + p('图中的横轴是C角度,不是时间。实际时间还受进给、加减速和机床约束影响,不能用图上每一度的等距刻度推断匀速运行。','small'), + '一张正确的记录表,应区分程序坐标、运动学输入、角度和物理关节。') + +page('第7章 · 再切回直接模式','50 N100/N110:同一刀尖位置,坐标解释改变', + code('N100 M429\nN110 M428')+ + p('N90末端关节固定为(−18.481,40,27.990,30°,90°)。M429把解释切到Identity,不能因此让这些关节无目标地跳动。新模式下基础XYZ与直线关节直接对应。')+ + table(['量','M429后','再M428后'],[['物理XYZ关节','(−18.481,40,27.990)','保持相同'],['基础K的XYZ','(−18.481,40,27.990)','(40,30,15)'],['当前G54相对XYZ显示','(−58.481,20,17.990)','(0,10,5)'],['实际刀尖位置','不动','不动']],'compact')+ + p('在Identity下,当前软件坐标不再通过RTCP映射到转动后的零件局部坐标架。因此该模式的相对XYZ读数不能继续当作刚才物理工件架W中的同一点坐标来解释。')+ + box('后续指令必须按新模式读','切换本身不动,不代表切换后再发“X0”也不动。相同字值在不同解释模式中可能指向完全不同的机械目标。'), + '切换时固定关节、重新解释坐标;不要为了保持旧XYZ数字而挪动机床。','WASM selectPhysical与解释器同步逐段实测。') + +page('第8章 · 中间轨迹','51 RTCP要在运动过程中持续计算', + fig('arc-chord','图为半径100mm的零偏置例:两种方法终点相同,中途却相差29.289mm。',280)+ + p('假设工件点绕C轴转90°。正确跟随时,刀尖走该点在机床空间里的圆弧。若只求首末关节位置,然后不顾几何地把X/Y用直线连接,可能走成弦线。')+ + p('所以控制器不能只在段末才补偿。它需要在连续采样中使用当前插补出的XYZ和角度,得到相应关节值。各关节的变化不一定是线性的,也不必在每个时刻都非零。')+ + box('五轴联动的正确含义','系统具备同时协调五个自由度的能力,不意味着每条指令、每个时刻五根轴都必须运动。特殊几何下某些轴不动,可能正是正确答案。'), + '只看“最后有没有对上”不足以检验RTCP。') + +page('第8章 · 姿态与刀轴','52 RTCP不自动决定刀轴该朝哪里', + fig('orientation','双转台中主轴在机床里可保持竖直,但相对于工件的刀轴方向会改变。',250)+ + p('本课机床不摆动主轴头。A/B、C带动工件后,主轴方向相对于工件发生变化。程序或CAM负责给出希望的角度/姿态,RTCP负责按这些角度保持所需刀尖位置关系。')+ + p('RTCP不会仅凭一个曲面网格就自动知道应当以什么刀轴角加工,也不会自动保证刀轴始终垂直曲面。后者还涉及刀位规划、刀具几何、工艺策略和碰撞检查。')+ + table(['给定条件','仍需解决的问题'],[['知道一个刀尖点','刀轴方向可能有多种选择。'],['知道点和A/B、C','还需用正确机床几何求关节。'],['关节在限位内','还不能证明刀具/夹具/机床无碰撞。']])+ + p('工件坐标方向、刀具方向、表面法向是三个概念。某些工艺要求它们满足特定关系,但它们不会天然全部重合。'), + 'RTCP执行指定的几何关系,不能替代CAM工艺与碰撞规划。') + +page('第8章 · 三维显示','53 预览画面中的三个对象要分开看', + table(['显示对象','代表什么','常见误判'],[['机床网格','结构外形及由关节驱动的部件位姿。','把网格缩放误当成运动学标定。'],['工件/程序路径','表达程序几何,通常附着在工件分支。','把摄像机转动当作工件坐标改变。'],['刀尖/实时轨迹','显示当前采样的受控点或路径。','只看路径颜色,不核对实际关节/参考系。']])+ + p('正确结构中,X/Y/Z移动刀具侧,A/B→C移动工件侧。路径必须与其定义的参考系一致。如果C错误地挂到Z下面,XYZ就会把工件也带走;再正确的RTCP数字也无法弥补错误的显示树。')+ + p('导入GLB后修改中心/偏置,应保留模型并同步有效URDF与WASM。参数改变可以使部件相对位置改变,但不应该悄悄替换成另一台内置机床。')+ + box('显示不是第二套控制器','不要在Three.js里编写另一套补偿公式把刀尖“画到看起来正确的位置”。关节应由真实运动学算出,图形只按同一结构进行刚体投影。')+ + p('外观网格中的铸件、支架形状不一定随参数自动重建,模型校正也不等于通过了真实碰撞/刚度/制造尺寸验收。','small'), + '验证要同时看程序参考、关节数据和场景层级,不能只凭视觉效果。') + +page('第8章 · 参数准备','54 准备数据时,按三层顺序核对', + h('第一层:机床自身')+p('确认结构是AC还是BC、每个节点的父级、各轴正方向、回零基准、倾转中心与轴间偏置。轴向或结构类型错误时,先修复模型/配置,不用G54去“抵消”它。')+ + h('第二层:刀具与受控点')+p('确认主轴参考点、刀尖节点、刀长定义和补偿状态。把换刀之后的受控点映射建立正确,再判断实际加工位置。')+ + h('第三层:零件装夹与编程')+p('确认CAD/CAM原点、工件方向、G54等偏置、当前单位、绝对/增量方式和进给模式。用多个已知点、多个姿态核对,避免只在零角度看起来对。')+ + table(['检查方法','能发现的问题'],[['零角度检查已知点','基本零点/长度/单位错误。'],['小角度分别转A/B和C','轴向、正负号、父子顺序问题。'],['不同角度反复定位同一点','旋转中心、偏置与刀尖标定问题。'],['重复换模式但不发运动','坐标同步错误导致的无故跳变。']])+ + box('不要用单点验证全部参数','错误的结构参数可以在某一点被工件偏置抵消,却在其他点或其他角度暴露。标定必须覆盖足够的空间位置与姿态。'), + '先机床,再刀具,最后工件;分层定位错误比同时改所有参数可靠。') + +page('第9章 · 课堂实验','55 实验一:观察“转动后的坐标方向”', + ol('进入仿真,关机且空闲时导入AC或BC桁架示例,查看当前几何参数。','完成开机和回零,在Identity下把刀尖放到离C轴线有一定距离的位置,避免特殊点导致XYZ补偿不明显。','停止运动,选择M428。记录关节与物理刀尖没有瞬移,同时记录当前XYZ显示可能变化。','旋转C一个小角度并停止。保持当前姿态,再做一个小的编程X增量,观察实际哪几根直线关节变化。','比较工件方向与机床导轨方向:导轨没转,XYZ合成了工件方向。','先停止,再切回M429,重复小幅直接轴Jog作为对照。')+ + p('项目默认示例有非零中心/偏置,所以不要拿本章零偏置算例的目标关节值逐项硬比。对默认机床,正确比较的是“同一配置下的运动学与模型是否一致”。')+ + box('每组记录四列','当前模式;编程/显示XYZ与角度;J0…J4;刀尖相对工件标记点是否保持。只截图一个角度,不足以说明全部行为。'), + '实验目标是理解参考系关系,不是让学生背住某一组关节数字。') + +page('第9章 · 课堂实验','56 实验二:G54与G90/G91的逐行记录', + p('本实验适合教师准备的专用仿真配置:零中心、零轴间偏置、零刀长差,BC结构,回零后从已知状态开始。不得直接在真实机床套用。')+ + ol('设置G21/G90/G94,写入G54偏置(40,20,10),选择G54。','执行M428,记录此时关节不变。','执行N50到N90,每段等待运动结束,再记录工件坐标、K输入、关节。','把结果与第49节表格对照,重点检查N60和N70。','尝试只选择G55,不发轴字;观察读数变化但关节保持。','恢复已知模式与偏置后再重复,检查结果是否一致。')+ + table(['测试点','应该看到'],[['只选择/设置参考','没有自动的定位运动。'],['N60 C90','程序XYZ保持,关节XYZ变化。'],['N70 G91 X10','W的X加10;本例关节Y加10。'],['N80恢复G90','X20是绝对目标,不能再加20。']])+ + p('本讲义提供完整验证数据而非截图推测。如果现场结果不同,先核对几何与模态条件,不要立刻断言某根轴接错。','small'), + '逐行记录让隐含模态变成看得见的数据。') + +page('第9章 · 课堂实验','57 实验三:原点移动,程序几何不改', + p('目标:理解同一段零件程序如何适应不同装夹位置。先保持角度固定,避免初学者同时处理太多变量;再在RTCP下加入姿态对照。')+ + ol('为G54设置第一套零位偏置,为G55设置第二套偏置,保持初始方向相同。','选G54运行一条很短、经过检查的定位段,记录目标。','只选G55,不发运动字,确认执行轴不会自动移动。','再给同样的工件XYZ目标,观察物理目标随配准变化。','停止后在适当角度下重复;说明原点和方向怎样一起进入RTCP。')+ + box('配准变化不是机床标定变化','移动工件装夹时通常更新工件设置;不要为了让两个工件都能加工而随意改动倾转轴物理中心。机床结构没有变,工件放置关系变了。')+ + p('若工件不仅平移,还在夹具上旋转,需要另外确定初始方向。仅改变G54的XYZ平移不会自动把一条斜边校正成你期望的+X方向。')+ + p('作业:让学生画出两套工件原点和同一局部点,先预测实际目标变化,再用仿真核对。解释预测为何成立比得到一次正确数字更重要。'), + '工件坐标把零件几何与装夹位置分开,但方向配准仍不可省略。') + +page('第9章 · 排错','58 位置不对时,从哪一层开始查?', + table(['现象','优先检查','不要马上做什么'],[['全程序平移一块','G54/G55、附加偏置、装夹原点。','先别改所有转台参数。'],['距离约差25.4倍','G20/G21和数据单位。','别靠缩放模型掩盖。'],['小动作不断累加','G90/G91是否残留。','别把每次误差当随机漂移。'],['零角度对,倾转就偏','中心/偏置、刀长、正方向、结构链。','别只在一个角度改G54。'],['只开RTCP却不跟点','实际运动模式、目标参考、父子关系。','别只看按钮颜色。'],['切模式机床瞬移','是否固定关节并同步坐标。','别冻结画面掩盖。'],['Connection ERROR','首个Worker/协议/运动错误。','别把后续sequence_gap当成唯一根因。']],'compact')+ + p('查看第一个失败原因通常比反复点击更有效。显示错误可能是运动计算错误的后果,也可能是模型投影错误;两类问题应通过关节数据与物理结构分别判断。')+ + box('一条诊断原则','保持一层已知正确,只改变一个待验证因素。否则多个错误可能暂时互相抵消,无法解释修复是否真正有效。'), + '先找最早的因果点,不要只处理最后出现的提示。') + +page('第9章 · 限位与边界','59 RTCP跟得上,还必须到得了', + p('工件XYZ看起来没有变化,不等于机械关节没有运动。转台角度改变时,为保持同一工件点,某根XYZ直线关节可能需要大幅补偿,最终触及行程或速度限制。')+ + table(['约束','检查对象'],[['编程/坐标限位','控制器定义的坐标允许范围。'],['关节限位','各机械轴实际能够达到的范围。'],['速度/加速度','每个执行轴的动态能力。'],['碰撞','刀具、工件、夹具、转台和机床实体间的空间关系。']])+ + p('本项目曾出现BC坐标范围较大,但B关节上限只有50°的情况。连续Jog越过该物理约束后,运动计算失败,又触发事件时钟错误。现已区分限位阻止与连接故障,并允许停止后反向退出。')+ + box('不要把仿真边界扩大成硬件声明','项目对RTCP耦合关节越界采用最后有效伺服样本停止。它不等同于真实设备的全路径预测减速、安全PLC、碰撞检测或硬件急停系统。')+ + p('课堂先用小位移、小角度、低速度、空载模型理解概念;实际机床的操作与保护必须使用其正式流程。','small'), + 'RTCP正确解决几何映射,不自动取消行程、动力学和碰撞约束。') + +page('第10章 · 常见问答','60 初学者最容易问错的八个问题', + table(['问题','简明回答'],[['工件坐标原点一定是转台中心吗?','不是。零件原点由工艺选,转台中心是结构标定。'],['工件坐标的零点会变化吗?','自身读数恒为0;在机床空间的位置可随角度变化。'],['只选G54能让刀尖跟着转台吗?','不能。还需要正确结构、姿态与RTCP运动学。'],['写X10为什么Y轴动?','X可能是工件方向,需由固定导轨合成。'],['没写XYZ为什么XYZ动?','程序点保持,但转台姿态变化需要补偿。'],['RTCP时所有轴必须一直动吗?','不必,取决于轨迹和当前几何。'],['H3就是3mm刀长吗?','不是,完整LinuxCNC里H是刀补条目索引。'],['界面“Machine XYZ”就是J0–J2吗?','不能默认;非线性运动学中需核对显示定义。']],'compact')+ + p('再遇到一个看似矛盾的说法,先问它说的是哪个参考系、哪个受控点和哪个控制模式。许多矛盾只是省略了这些条件。'), + '补全条件后再下结论,是理解五轴的基本方法。') + +page('第10章 · 练习','61 练习A:原点、模式和地址字', + ol('工件原点在零位K中为(40,20,10),方向对齐。W=(10,0,5)对应的K是多少?','当前位置W的X=10。分别执行G90 X20和G91 X20,各得到什么W终点?','单独执行G54会不会自动走到工件零点?若同一行是G54 G1 X0呢?','当前位置K=(70,30,20),希望此刻W=(5,0,0)。在无附加旋转/补偿的教学条件下,L20算出的偏置o是多少?','T3、H3、S12000、F600分别属于哪种数据?哪些数字不能被直接当作毫米距离?','工件原点测对了,但长边相对机床X倾斜20°。只改G54的X/Y/Z平移,是否足以纠正方向?')+ + box('答题要求','每题至少写一句解释。不要只交三个数字;需说明参考系、模式和假设条件。可以画原点与方向箭头辅助推理。'), + '这些题不需要矩阵,关键是把词语和参考对象对应起来。') + +page('第10章 · 练习','62 练习B:从工件点推到物理关节', + ol('零中心/偏置/刀长差,B=0、C=90°,o=(40,20,10),W=(10,0,5)。求XYZ关节和工件原点的空间位置。','保持上题姿态,执行G91 X10。哪根直线关节增加多少?','从N70末端执行G90 X20 Y0 Z5 B30 C90,工件点是否变化?为什么X/Z关节仍会变?','M429后XYZ读数变化,关节和刀尖却不动,是正常还是故障?如果反过来XYZ不变、关节跳动呢?','程序只改C,但XYZ没有动,一定说明RTCP坏了吗?给出一个可以正确不动的几何例子。','C轴错误挂在Z滑枕下,会造成什么显示/结构错误?能否通过开启RTCP修复?','为什么只校验首末关节位置,不足以证明整段RTCP正确?')+ + p('扩展题:用你自己的一个工件原点和目标点,手算C=0°与90°的物理位置;再说明旋转中心改成非零后,哪一步需要修改。','small'), + '把中间层K写出来,可以明显减少漏加偏置和重复加偏置。') + +page('第10章 · 参考答案','63 练习A答案', + ol('K=(50,20,15)。方向对齐、仅平移时,p_K=p_W+o。','G90终点X=20;G91终点X=30。前者是绝对目标,后者在当前10基础上加20。','单独G54不定位。G54 G1 X0同时含有运动目标,会结合当前坐标与模式形成轨迹。','o=(65,30,20)。当前位置K减去希望的W:(70,30,20)−(5,0,0)。','T3为工具选择号,H3为刀补条目索引,S12000为主轴速度请求,F600由进给模式解释。不能将这些数全当作mm。','不够。三个平移参数只改变原点,不能补偿初始方向旋转。需机械找正或使用受支持的坐标旋转/方向配准。')+ + box('进一步检查','第4题的公式只在声明的简单条件下使用。存在旋转、刀补或非平凡运动学时,必须使用相应参考下的当前位置,而不是直接拿原始关节读数代入。'), + '答案的条件是答案的一部分,不能省略。') + +page('第10章 · 参考答案','64 练习B答案', + ol('XYZ关节=(−20,50,15),工件原点O_M=(−20,40,10)。先求K=(50,20,15),再绕C90°。','机床Y增加10mm。当前工件+X就是机床+Y,新的关节为(−20,60,15)。','工件点不变,仍是(20,0,5)。B姿态改变,新的XYZ关节约为(−9.821,60,22.990)。','坐标重新解释、关节保持是正常。单纯切换却改变物理关节,一般说明同步/切换逻辑有问题。','不一定。点在C旋转轴线上且其他条件不变时,只转C可以不改变该点的机床空间位置。','工件会错误地随XYZ链移动。必须修复结构父子关系,开关RTCP不能替代正确拓扑。','端点相同,中间路径仍可能不同。例如圆弧与弦线;必须检查连续采样和相对工件轨迹。'), + '每个答案都可以画成“原点 + 方向 + 点”的几何关系。') + +page('附录A · 术语','65 把常见名词翻译成容易理解的话', + table(['术语','初学者解释'],[['坐标系/参考系','放在某处、有指定方向和单位的一套尺子。'],['原点/零点','这套尺子的起点,不一定是电机回零位置。'],['工件偏置/WCS offset','让零件程序与当前装夹参考对齐的数据。'],['关节/joint','被控制的机械自由度及其位置。'],['正运动学/FK','由关节与结构计算对应坐标/受控点。'],['逆运动学/IK','由目标点、姿态和结构计算关节目标。'],['姿态/orientation','方向关系;本课由A/B、C指定。'],['TCP/RTCP','与刀尖目标、姿态变化补偿相关的功能;需核对控制器定义。'],['插补/interpolation','在段起点和终点间连续生成中间目标。'],['模态/modal','指令生效后持续保留,直到被同组设置替换。'],['配准/registration','建立设计坐标与实际装夹之间的对应关系。'],['同步/synchronization','让解释器、规划器和运动状态使用一致的当前参考。']],'compact'), + '看到新术语,先找它属于“几何、程序、机械、执行”哪一层。') + +page('附录B · 可选数学','66 用最少公式描述完整坐标链', + p('以下公式供进阶阅读,不是初学者读前面章节的前提。向量用列向量,R表示正交旋转矩阵;长度统一为mm。')+ + h('1. 初始工件配准')+eq('p_K = R₀ p_W + o')+ + p('o给出工件原点在零位参考中的位置;R₀给出初始工件方向。本章实算R₀=I,因此只做平移相加。')+ + h('2. 当前双转台姿态与几何,L=0')+eq('r_M = P + D + R_tilt [ R_C (p_K − P) − D ]')+ + p('AC取R_tilt=R_X(A),BC取R_tilt=R_Y(B)。因此可写为r_M=O_M+E_MW p_W,其中:')+ + eq('E_MW = R_tilt R_C R₀
O_M = P + D + R_tilt [ R_C(o − P) − D ]')+ + p('这里r_M是本课零刀长差模型的目标空间位置,并对应直线关节目标。加入刀具标定后还需从刀尖求主轴/执行参考;任意机床结构不能直接套用这一特定式子。','small'), + '原点项O_M与方向项E_MW同时随姿态变化,分开写有助于理解。') + +page('附录B · 可选数学','67 反过来:从当前物理位置求工件坐标', + p('在姿态与几何已知、没有奇异歧义且标定一致时,前页r_M=O_M+E_MW p_W可以反算:')+ + eq('p_W = E_MWᵀ (r_M − O_M)')+ + p('先从当前空间位置减去当前工件原点,得到相对位移;再用逆旋转,把这个位移投回工件三个方向。正交旋转矩阵的逆等于转置,所以这里写上标T。')+ + p('这正是“坐标数值可以变,而物理点不变”的数学基础。同一r_M在不同O/E下有不同p_W。模式切换、工件系选择或重新设置参考时,必须明确变了哪一层。')+ + h('本项目刀长差的特殊约定')+eq('D_L = D + L·e_z
q_XYZ = P + D_L + R_tilt [ R_C(p_K − P) − D_L ]')+ + p('本项目原生TRT的L是master-tool刀长差约定。这个式子返回关节目标,不是任意GLB刀尖网格的世界位置。完整工具标定、工件架与刀尖显示须遵循同一个约定;其他控制器应按其文档重新建立链路。','small'), + '先减原点、再投影方向;关节到刀尖之间还可能存在刀具参考变换。','本地trtfuncs.c、imported-machine.ts;主实验L=0。') + +page('附录C · 软件实验范围','68 这份讲义验证了什么,没有声称什么?', + table(['内容','本次证据'],[['G10 L2、G54/G55平移、G90/G91','实际项目WASM逐段解析,核对规范目标。'],['G20长度/G94直线进给换算','X1→25.4mm,F2→50.8mm/min实测。'],['G10 L20位置重定义','偏置计算及后续目标实测。'],['RTCP BC例子的目标关节','真实WASM逆解计算;关键数值强断言。'],['N10–N90完整运动','真实Session/解释器/TP执行完成,终点与逐行结果一致。'],['M429/M428保持物理关节','原生切换接口+坐标同步逐段验证。'],['G52/G92、任意方向变换、完整刀表与所有F模式','依据官方语义讲解,不冒充Web切片已全面实现。']],'compact')+ + p('项目调用实际WASM并不能自动证明它覆盖了完整LinuxCNC。特别是本地解释器适配层属于功能切片,不能把接受某个字母或设置内部字段当作完整语义和工艺正确性证据。')+ + box('对照两层资料','学习通用指令时查官方文档;复现本课数字时查同目录gcode-evidence.json和具体测试条件。两者各自解决不同问题。'), + '严谨的教学需要同时给出结果和结果成立的范围。') + +page('附录D · 来源与复现','69 官方资料、验证数据与自学路径', + '
'+ + p('[S1] LinuxCNC · 5-Axis Kinematics
用于核对AC/BC机构、前后向变换、旋转中心、偏置与刀具参考。')+ + p('[S2] LinuxCNC · Coordinate Systems
用于核对机床/工件坐标、G54–G59.3及附加偏置。')+ + p('[S3] LinuxCNC · CNC Machine Overview
轴命名、受控点、单位、旋转与协调运动。')+ + p('[S4] LinuxCNC · G-Codes
G10、G20/G21、G43、G53、G90/G91、圆弧/进给等指令语义。')+ + p('[S5] LinuxCNC · G-code Overview
程序段、地址字、表达式、模态组及执行顺序。')+ + p('[S6] LinuxCNC · Switchable Kinematics
切换模式及解释器/运动同步。')+'
'+ + p('本地依据:sim_interpreter.c、sim_program.c、trtfuncs.c、sim-session.mjs,以及428remap.ngc/429remap.ngc。图示为原创教学图和项目原创GLB渲染。官方页面核对日期:2026-09-18。','small')+ + box('随讲义提供','handbook.html为可编辑源稿,outline.json为逐页目录,gcode-evidence.json保存逐字结果与完整轨迹,verification/保存版面/PDF核验。原31页投影片保留作课堂概要,本讲义作为可独立阅读的完整版。'), + '最后记住:先定义原点和方向,再解释程序数值,最后由运动学求出各轴运动。') + +chapter_starts=[] +for i,item in enumerate(PAGES): + group=item['chapter'].split(' · ')[0] + if not chapter_starts or chapter_starts[-1][0]!=group: + chapter_starts.append((group,i+1)) +chapter_names={'第1章':'坐标与机床基础','第2章':'机床、工件与中间参考','第3章':'原点和方向如何确定','第4章':'G54、G10与其他偏置','第5章':'RTCP的点、方向与标定','第6章':'G代码逐字与模态解析','第7章':'完整程序逐行实算','第8章':'连续轨迹、刀轴与显示','第9章':'课堂实验、限位与排错','第10章':'问答、练习与答案','附录A':'术语表','附录B':'可选数学推导','附录C':'软件验证范围','附录D':'资料来源与复现'} +toc_rows=[[f'{name} {chapter_names[name]}',str(number)] for name,number in chapter_starts if name in chapter_names] +PAGES[2]['body']=p('本书从基础坐标开始,逐步建立程序与关节之间的计算链。PDF目录书签可直接跳转章节。节号不是PDF页码;前面另有封面和导读。')+table(['章节','PDF起始页'],toc_rows,'compact')+p('建议每次学习1–2章,完成相应小实验后再继续。数值实算章建议边读边写出W、K、角度、J四列。','small') + +CSS=r''' +@font-face { font-family:HandbookCJK; src:url("assets/handbook-regular.otf") format("opentype"); font-weight:400; } +@font-face { font-family:HandbookCJK; src:url("assets/handbook-bold.otf") format("opentype"); font-weight:700; } +@page { size:A4; margin:0; } +* { box-sizing:border-box; } +html,body { margin:0; padding:0; background:#e1e7ea; color:#24313a; font-family:HandbookCJK,"Noto Sans CJK SC",sans-serif; } +.sheet { width:793.7px; height:1122.52px; padding:38px 46px 26px; position:relative; background:#fff; overflow:hidden; break-after:page; page-break-after:always; } +.sheet:last-child { break-after:auto; page-break-after:auto; } +.chapter { font-size:13px; line-height:1.5; color:#00877b; margin-bottom:10px; font-weight:600; } +h1 { font-size:27px; line-height:1.4; margin:0 0 21px; letter-spacing:0; } +h2 { font-size:19px; line-height:1.5; color:#00877b; margin:18px 0 10px; } +.body { height:863px; overflow:hidden; } +p,li { font-size:17px; line-height:1.85; } +p { margin:0 0 16px; text-align:justify; } +ul,ol { margin:8px 0 18px; padding-left:26px; } +li { margin-bottom:11px; padding-left:3px; } +b { font-weight:700; } +.subtitle { font-size:25px; color:#00877b; margin-bottom:24px; text-align:left; } +.small { font-size:14px; line-height:1.8; color:#5e6c75; } +figure { margin:15px 0 20px; } +figure img { width:100%; display:block; object-fit:contain; } +figcaption { font-size:12px; line-height:1.7; color:#61717b; text-align:center; margin-top:6px; } +table { width:100%; border-collapse:collapse; font-size:15px; line-height:1.7; margin:14px 0 20px; } +th { padding:10px 11px; text-align:left; background:#eaf1f4; color:#254956; border-bottom:2px solid #9cb9c5; font-weight:600; } +td { padding:10px 11px; vertical-align:top; border-bottom:1px solid #dbe5e9; } +td:first-child { color:#2563b8; font-weight:600; } +.compact { font-size:14px; line-height:1.65; } +.compact th,.compact td { padding:8px 9px; } +.equation { font-size:20px; line-height:1.8; padding:14px 16px; background:#f0f5f7; text-align:center; margin:16px 0 22px; overflow-wrap:anywhere; } +pre { font-family:"DejaVu Sans Mono",HandbookCJK,monospace; font-size:15px; line-height:1.85; white-space:pre-wrap; overflow-wrap:anywhere; background:#f0f4f6; border-left:4px solid #2563b8; padding:15px 18px; margin:15px 0 21px; } +aside { margin:17px 0 20px; padding:13px 16px; border-left:4px solid #d45549; background:#f7f4f2; } +aside>b { display:block; font-size:16px; color:#a84840; margin-bottom:7px; } +aside p { font-size:15px; line-height:1.8; margin:0; } +.key { position:absolute; left:46px; right:46px; bottom:61px; padding:10px 13px; border-left:4px solid #00877b; background:#eaf5f2; font-size:15px; line-height:1.65; } +footer { position:absolute; left:46px; right:46px; bottom:22px; display:flex; gap:15px; justify-content:space-between; border-top:1px solid #dbe5e9; padding-top:8px; color:#68777f; font-size:10px; line-height:1.6; } +footer span:first-child { max-width:620px; } +.folio { color:#00877b; white-space:nowrap; font-size:13px; } +a { color:#176da5; text-decoration:none; } +.references p { font-size:15px; line-height:1.8; margin-bottom:17px; } +@media screen { .sheet { margin:20px auto; box-shadow:0 2px 14px #0002; } } +@media print { html,body { background:#fff; } .sheet { margin:0; box-shadow:none; } * { print-color-adjust:exact; -webkit-print-color-adjust:exact; } } +''' +sections=[] +for index,item in enumerate(PAGES,1): + sections.append(f'
{item["chapter"]}

{item["title"]}

{item["body"]}
{item["key"]}
{item["refs"]}{index:02d} / {len(PAGES):02d}
') +doc='五轴RTCP与工件坐标:初学者完整讲义'+''.join(sections)+'' +(OUT/'handbook.html').write_text(doc) +(OUT/'outline.json').write_text(json.dumps([{'page':i+1,'chapter':x['chapter'],'title':x['title']} for i,x in enumerate(PAGES)],ensure_ascii=False,indent=2)+'\n') +print('Generated',len(PAGES),'A4 pages:',OUT/'handbook.html') diff --git a/scripts/generate_rtcp_teaching_data.mjs b/scripts/generate_rtcp_teaching_data.mjs new file mode 100644 index 0000000..b9bddf3 --- /dev/null +++ b/scripts/generate_rtcp_teaching_data.mjs @@ -0,0 +1,47 @@ +import assert from 'node:assert/strict'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import createModule from '../build-wasm/linuxcnc-sim-core.js'; +import { WasmXyzacKinematics } from '../web/worker/wasm-xyzac-kinematics.mjs'; + +const out = new URL('../docs/teaching/rtcp-five-axis/', import.meta.url); +await mkdir(new URL('assets/', out), { recursive: true }); +const wasm = await readFile(new URL('../build-wasm/linuxcnc-sim-core.wasm', import.meta.url)); +const core = await createModule({ wasmBinary: wasm }); +const basePose = { x: 100, y: 0, z: 20, a: 0, b: 0, c: 0, u: 0, v: 0, w: 0 }; +const cases = []; +const close = (a, b) => assert.ok(Math.abs(a - b) < 1e-9, `${a} != ${b}`); +for (const coordinates of ['XYZAC', 'XYZBC']) { + const k = new WasmXyzacKinematics(core, { coordinates, limits: Object.fromEntries([...coordinates.toLowerCase()].map((a) => [a, [-100000, 100000]])) }); + const samples = []; + for (const [tilt, c] of [[0, 0], [0, 45], [0, 90], [30, 0], [30, 45], [30, 90]]) { + const p = { ...basePose, c, [coordinates[3].toLowerCase()]: tilt }; + const ik = k.inverseMode(1, p); assert.equal(ik.status, 'verified'); + k.selectPhysical(1, ik.joints); + const fk = k.forward(ik.joints); assert.equal(fk.status, 'verified'); + for (const axis of ['x', 'y', 'z']) close(fk.pose[axis], p[axis]); + samples.push({ tilt, c, programmed: p, joints: ik.joints, forward: fk.pose }); + } + close(samples[2].joints[0], 0); close(samples[2].joints[1], 100); close(samples[2].joints[2], 20); + const direction = k.inverseMode(1, { ...basePose, c: 45, x: 110 }).joints.map((v, i) => v - samples[1].joints[i]); + close(direction[0], 10 / Math.sqrt(2)); close(direction[1], 10 / Math.sqrt(2)); + cases.push({ coordinates, samples, xw_increment_10_at_c45: direction }); + k.destroy(); +} +const offsets = { x_rot_point: -18, y_rot_point: 14, z_rot_point: 12, x_offset: 22, y_offset: 0, z_offset: -40, tool_offset: 0 }; +const k = new WasmXyzacKinematics(core, { coordinates: 'XYZBC', ...offsets, limits: Object.fromEntries(['x', 'y', 'z', 'b', 'c'].map((a) => [a, [-100000, 100000]])) }); +const physical = [0, 0, 44.5858, 4.8675, 179.88]; +const tcp = k.selectPhysical(1, physical); const tcpPose = { ...tcp.pose }; +const identity = k.selectPhysical(0, physical); +physical.forEach((value, i) => { close(tcp.joints[i], value); close(identity.joints[i], value); }); +const report = { + report_id: 'rtcp-teaching-numerics-v1', status: 'verified', + wasm_sha256: createHash('sha256').update(wasm).digest('hex'), + convention: 'Native AC: Rx(A) Rz(C); BC: Ry(B) Rz(C). Main teaching examples P=D=tool_offset=0, mm/deg.', + cases, + switch_example: { offsets, physical, tcp_pose: tcpPose, identity_pose: identity.pose }, + chord_midpoint: { compensated: [100 / Math.sqrt(2), 100 / Math.sqrt(2), 20], uncompensated_joint_interpolation: [50, 50, 20], distance: 100 - 50 * Math.sqrt(2) }, +}; +k.destroy(); +await writeFile(new URL('numeric-evidence.json', out), JSON.stringify(report, null, 2) + '\n'); +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, poses: 12, fk_ik_roundtrips: 12, source: report.wasm_sha256 })); diff --git a/scripts/generate_rtcp_teaching_figures.py b/scripts/generate_rtcp_teaching_figures.py new file mode 100644 index 0000000..b22ff93 --- /dev/null +++ b/scripts/generate_rtcp_teaching_figures.py @@ -0,0 +1,167 @@ +"""Original teaching diagrams. Requires matplotlib; no application code changes.""" +import math +from pathlib import Path + +import matplotlib +matplotlib.use('Agg') +import matplotlib.pyplot as plt +from matplotlib import font_manager +from matplotlib.patches import Circle, FancyArrowPatch, Rectangle +import numpy as np +from PIL import Image, ImageChops + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / 'docs/teaching/rtcp-five-axis/assets' +OUT.mkdir(parents=True, exist_ok=True) +font_manager.fontManager.addfont('/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc') +plt.rcParams.update({'font.family': 'Noto Sans CJK JP', 'font.size': 15, 'axes.unicode_minus': False}) +BLUE, TEAL, RED, GRAY, INK = '#2563b8', '#00877b', '#d45549', '#8a969f', '#23303a' + +def save(fig, name): + path = OUT / f'{name}.png' + fig.savefig(path, dpi=190, facecolor='white', bbox_inches='tight', pad_inches=.18) + plt.close(fig) + if name == 'bc-frame': + image = Image.open(path).convert('RGB') + ink = ImageChops.difference(image, Image.new('RGB', image.size, 'white')).convert('L').point(lambda v: 255 if v > 8 else 0) + left, top, right, bottom = ink.getbbox() + image.crop((max(0,left-25),max(0,top-25),min(image.width,right+25),min(image.height,bottom+25))).save(path) + +def axis2(ax, limit=125): + ax.set(xlim=(-30, limit), ylim=(-30, limit), aspect='equal') + ax.axis('off') + ax.annotate('', (limit-5, 0), (-22, 0), arrowprops={'arrowstyle': '-|>', 'color': BLUE, 'lw': 2}) + ax.annotate('', (0, limit-5), (0, -22), arrowprops={'arrowstyle': '-|>', 'color': BLUE, 'lw': 2}) + ax.text(limit-8, -12, '$X_M$', color=BLUE, ha='right') + ax.text(-12, limit-9, '$Y_M$', color=BLUE, va='top') + ax.text(-10, -13, 'O', color=INK) + +def point(ax, x, y, label, color, offset=(7, 7), marker='o'): + ax.scatter([x], [y], s=150, c=color, marker=marker, zorder=5) + ax.annotate(label, (x, y), xytext=offset, textcoords='offset points', color=color, fontsize=14) + +def arc(ax, radius, end=90): + angles = np.linspace(0, np.deg2rad(end), 101) + ax.plot(radius*np.cos(angles), radius*np.sin(angles), color=TEAL, lw=2, ls='--') + +# The same marked workpiece point, before and after turning the C table. +for follow in [False, True]: + fig, axes = plt.subplots(1, 2, figsize=(10, 4.3)) + for ax in axes: axis2(ax); ax.add_patch(Circle((0, 0), 100, fill=False, ec='#d8e1e6', lw=2)) + axes[0].set_title('起点:C = 0°', pad=10, color=INK) + point(axes[0], 100, 0, '工件标记点 + 刀尖', RED, (-138, 17), '*') + axes[0].plot([0, 100], [0, 0], color=TEAL, lw=4) + axes[1].set_title('终点:C = 90°', pad=10, color=INK) + arc(axes[1], 100) + axes[1].plot([0, 0], [0, 100], color=TEAL, lw=4) + point(axes[1], 0, 100, '同一个工件点', TEAL, (12, -3), '*') + if follow: + axes[1].scatter([0], [100], s=380, facecolors='none', edgecolors=RED, linewidths=3) + axes[1].text(40, 45, '刀尖由 XYZ 移到这里\n相对工件仍是同一点', color=RED, ha='center') + else: + point(axes[1], 100, 0, '刀尖留在原位置', RED, (-125, -22)) + axes[1].plot([0, 100], [100, 0], color=RED, lw=1.6, ls=':') + axes[1].text(43, 52, '相对位置改变', color=RED, rotation=-45, ha='center') + fig.subplots_adjust(wspace=.22) + save(fig, 'tcp-follow' if follow else 'identity-no-follow') + +# Rotated workpiece axes while the machine axes stay fixed. +fig, ax = plt.subplots(figsize=(6.2, 5.5)); axis2(ax, 150) +origin = np.array([60., 45.]); theta = math.pi/4 +u, v = np.array([math.cos(theta), math.sin(theta)]), np.array([-math.sin(theta), math.cos(theta)]) +corners = [origin+u*a+v*b for a,b in [(-22,-22),(32,-22),(32,32),(-22,32),(-22,-22)]] +ax.fill(*np.array(corners).T, color='#e3f3ef', zorder=0) +for direction, label, offset in [(u, '$X_W$', (3,0)), (v, '$Y_W$', (-12,0))]: + end = origin+direction*70 + ax.annotate('', end, origin, arrowprops={'arrowstyle':'-|>', 'color':TEAL,'lw':3}) + ax.annotate(label,end,xytext=offset,textcoords='offset points',color=TEAL) +start = origin+u*13; end = start+u*40 +ax.annotate('',end,start,arrowprops={'arrowstyle':'-|>','color':RED,'lw':4}) +ax.plot([start[0],end[0],end[0]],[start[1],start[1],end[1]],ls=':',color=RED,lw=2) +ax.text(78,49,'+7.071',color=RED,fontsize=13) +ax.text(107,75,'+7.071',color=RED,fontsize=13) +ax.text(22,126,'C = 45°:工件 +X 方向倾斜',color=INK,fontsize=14) +ax.text(42,21,'W 原点',color=TEAL,fontsize=13) +save(fig,'rotated-direction') + +# A point on a tilting BC trunnion; explicit right-hand matrix convention. +fig = plt.figure(figsize=(7.8,5.9)); ax=fig.add_subplot(111,projection='3d') +b,c=np.deg2rad([30,45]); ry=np.array([[np.cos(b),0,np.sin(b)],[0,1,0],[-np.sin(b),0,np.cos(b)]]) +rz=np.array([[np.cos(c),-np.sin(c),0],[np.sin(c),np.cos(c),0],[0,0,1]]) +r=ry@rz; p=np.array([100,0,20]); q=r@p +for idx,label in enumerate(['$X_M$','$Y_M$','$Z_M$']): + e=np.eye(3)[idx]*110;ax.quiver(0,0,0,*e,color=BLUE,arrow_length_ratio=.07,lw=1.5);ax.text(*e,label,color=BLUE,fontsize=13) +for idx,label in enumerate(['$X_W$','$Y_W$','$Z_W$']): + e=r[:,idx]*75;ax.quiver(0,0,0,*e,color=TEAL,arrow_length_ratio=.09,lw=2.5);ax.text(*(e*1.13),label,color=TEAL,fontsize=15) +phi=np.linspace(0,2*np.pi,150);ring=r@np.array([100*np.cos(phi),100*np.sin(phi),np.zeros(len(phi))]);ax.plot(*ring,color=TEAL,alpha=.45) +ax.scatter(*q,color=RED,s=65);ax.plot([0,q[0]],[0,q[1]],[0,q[2]],color=RED,lw=2) +ax.text(*(q+np.array([0,0,9])),'刀尖目标',color=RED,fontsize=14) +ax.set(xlim=(-110,130),ylim=(-110,130),zlim=(-65,120));ax.set_box_aspect((1,1,.8));ax.view_init(elev=23,azim=-62);ax.set_axis_off() +save(fig,'bc-frame') + +# Parent-child hierarchy, two separate mechanical branches. +fig,ax=plt.subplots(figsize=(11.2,4.5));ax.set(xlim=(0,11.2),ylim=(0,4.5));ax.axis('off') +def node(x,y,label,color=BLUE,w=1.6): + ax.add_patch(Rectangle((x,y),w,.65,fc='#f1f6f8',ec=color,lw=1.8)) + ax.text(x+w/2,y+.325,label,ha='center',va='center',color=color,fontsize=15) +def link(a,b,color=GRAY): + style = 'arc3,rad=0' if abs(a[1]-b[1]) < 1e-9 else 'angle,angleA=0,angleB=90,rad=8' + ax.annotate('',b,a,arrowprops={'arrowstyle':'-|>','color':color,'lw':2,'connectionstyle':style}) +node(.3,1.9,'机床底座',INK,1.8) +for x,label in [(3,'X 轴'),(5.5,'Y 轴'),(8,'Z 轴 + 刀具')]:node(x,3,label,BLUE,2.4 if x==8 else 1.6) +for x,label in [(3,'A 或 B 轴'),(6,'C 轴 + 工件')]:node(x,.8,label,TEAL,2.2) +link((2.1,2.2),(3,3.325),BLUE);link((4.6,3.325),(5.5,3.325),BLUE);link((7.1,3.325),(8,3.325),BLUE) +link((2.1,2.2),(3,1.125),TEAL);link((5.2,1.125),(6,1.125),TEAL) +ax.text(5.8,4.08,'刀具侧:直线运动链',ha='center',color=BLUE,fontsize=17) +ax.text(6,.22,'工件侧:倾转轴带着 C 转台一起运动',ha='center',color=TEAL,fontsize=16) +save(fig,'hierarchy') + +# Offset pivot: the same 90-degree rotation produces different positions. +fig,axes=plt.subplots(1,2,figsize=(10.2,4.3)) +for ax in axes: axis2(ax,145) +for ax, o, title in [(axes[0],np.array([0,0]),'旋转中心 O = (0, 0)'),(axes[1],np.array([30,20]),'旋转中心 O = (30, 20)')]: + point(ax,*o,'O',TEAL,(-12,-20));start=np.array([100,20]);end=o+np.array([-(start-o)[1],(start-o)[0]]) + ax.plot([o[0],start[0]],[o[1],start[1]],color=GRAY,ls='--');ax.plot([o[0],end[0]],[o[1],end[1]],color=TEAL,lw=2) + point(ax,*start,'起点 (100, 20)',GRAY,(-94,-22));point(ax,*end,f'终点 ({end[0]}, {end[1]})',RED,(8,4)) + ax.set_title(title,color=INK,pad=14,fontsize=16) +save(fig,'pivot-offset') + +# Correct TCP arc versus independently interpolated joint chord. +fig,ax=plt.subplots(figsize=(6.5,5.2));axis2(ax,125) +t=np.linspace(0,np.pi/2,121);ax.plot(100*np.cos(t),100*np.sin(t),color=TEAL,lw=3) +ax.plot([100,0],[0,100],color=RED,lw=2.5) +q=100/np.sqrt(2);ax.scatter([q,50],[q,50],color=[TEAL,RED],s=95) +ax.plot([50,q],[50,q],color=INK,ls=':',lw=2) +ax.text(67,84,'RTCP:跟随工件点的圆弧',color=TEAL,ha='center',fontsize=14) +ax.text(35,33,'非 RTCP:独立轴线性插补',color=RED,ha='center',fontsize=14) +ax.annotate('中途偏离 29.289 mm',(61,61),xytext=(4,113),arrowprops={'arrowstyle':'->','color':INK},fontsize=14) +save(fig,'arc-chord') + +# Tilted table and fixed vertical spindle: tool vector relative to workpiece changes. +fig,axes=plt.subplots(1,2,figsize=(10.2,4.1)) +for ax,angle in zip(axes,[0,30]): + ax.set(xlim=(-70,70),ylim=(-40,105),aspect='equal');ax.axis('off') + phi=np.deg2rad(angle);u=np.array([np.cos(phi),-np.sin(phi)]);v=np.array([np.sin(phi),np.cos(phi)]) + ends=np.array([-60*u,60*u]);ax.plot(*ends.T,color=TEAL,lw=7) + ax.add_patch(Rectangle((-9,58),18,35,fc='#b5c1c9',ec=INK,lw=1.5)) + ax.plot([0,0],[6,58],color=RED,lw=5);ax.scatter([0],[6],color=RED,s=45) + ax.annotate('',(0,32),(0,78),arrowprops={'arrowstyle':'-|>','lw':2,'color':BLUE}) + ax.annotate('',tuple(v*57),(0,0),arrowprops={'arrowstyle':'-|>','lw':2,'color':TEAL}) + ax.text(18,80,'主轴方向固定',color=BLUE,fontsize=14);ax.text(*(v*62),'工件法向',color=TEAL,fontsize=14) + ax.set_title(f'B = {angle}°',color=INK,pad=10) +save(fig,'orientation') + +# Tool length: preserving spindle reference alone does not preserve the tip. +fig,ax=plt.subplots(figsize=(8.2,4));ax.set(xlim=(0,10),ylim=(0,5));ax.axis('off') +for x,length,label in [(1.7,1.1,'短刀'),(5,2.0,'长刀,主轴未补偿'),(8.3,2.0,'长刀,主轴上移')]: + gauge=3.7 if x<7 else 4.6 + ax.add_patch(Rectangle((x-.45,gauge),.9,.3,fc='#bac8ce',ec=INK)) + ax.plot([x,x],[gauge-length,gauge],color=RED,lw=8) + ax.scatter([x],[gauge-length],color=RED,s=70) + ax.text(x,.28,label,ha='center',fontsize=14,color=INK) + ax.text(x+.24,gauge-length/2,'L',color=RED,fontsize=17) +ax.axhline(2.6,color=TEAL,ls='--',lw=2);ax.text(.1,2.77,'目标刀尖高度',color=TEAL,fontsize=13) +ax.annotate('',(8.9,4.6),(8.9,3.7),arrowprops={'arrowstyle':'-|>','color':BLUE,'lw':2});ax.text(9.05,4.1,'ΔL',color=BLUE) +save(fig,'tool-length') + +print('Created 9 original diagrams in',OUT) diff --git a/scripts/generate_rtcp_teaching_html.py b/scripts/generate_rtcp_teaching_html.py new file mode 100644 index 0000000..780cb57 --- /dev/null +++ b/scripts/generate_rtcp_teaching_html.py @@ -0,0 +1,290 @@ +"""Build the printable, editable Chinese RTCP teaching deck from verified data.""" +import html +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / 'docs/teaching/rtcp-five-axis' +data = json.loads((OUT / 'numeric-evidence.json').read_text()) +slides = [] + +def fig(name, caption='', cls=''): + return f'
{html.escape(caption)}
{caption}
' + +def page(chapter, title, body, takeaway='', sources='', cls=''): + slides.append({'chapter': chapter, 'title': title, 'body': body, 'takeaway': takeaway, 'sources': sources, 'cls': cls}) + +def table(headers, rows, cls=''): + return ''+''.join('' for h in headers)+''+''.join(''+''.join('' for x in row)+'' for row in rows)+'
'+h+'
'+str(x)+'
' + +def fmt(x): + return f'{0 if abs(x)<0.0005 else x:.3f}' + +def xyz(values): return '('+', '.join(fmt(v) for v in values[:3])+')' + +page('教学课件 · 2026.09', '五轴机床与 RTCP', + '

从“各轴独立”到“刀尖跟随”

看懂两个坐标系、一棵结构树、
一条运动学计算链。

适用对象:数控入门、五轴调试与仿真教学
主线机型:XYZAC / XYZBC 双转台桁架机床
建议课时:60–90 分钟,可拆成两讲

原理图解 + 数值演算 + 浏览器实验 + 练习答案

'+fig('machine-bc','原创 BC 桁架模型:XYZ 移动刀具,B–C 转动工件','cover-model')+'
', + '核心问题:程序中的 XYZ,究竟是在告诉谁“去哪里”?', '图:本项目原创 GLB 模型;数值:LinuxCNC WASM 实算。', 'cover') + +page('01 · 先统一理解', '你的两点理解,怎样说得更准确?', + '

① 非 RTCP:直接轴映射

在本课的双转台结构中,XYZ 带动刀具,A/C 或 B/C 带动工件。

只改变旋转轴指令,不自动触发 XYZ 的刀尖保持补偿。但多个轴仍可在同一段 G 代码中协调插补。

“独立”描述几何映射,不是运动时间完全无关。

② RTCP:保持刀尖相对工件的轨迹

控制器根据编程点、转台角度、旋转中心和标定参数,计算实际关节位置。

工件坐标方向随转台变换,XYZ 关节按需联动。计算还包括平移与偏置,不能只旋转方向箭头。

“跟随”是相对工件满足目标关系,不是世界坐标中的刀尖永远不动。

', + '课程约定:先用零工件偏置、零刀长差的简化模型讲清原理,再加入实际参数。', '[S1][S2];结合本项目 AC/BC 模型。') + +page('01 · 结构与轴名', '五轴 = 三个直线轴 + 两个旋转轴', + table(['名称','通常的轴线含义','本课中的执行机构'],[ + ['X / Y / Z','沿三个正交方向平移','刀具侧的直线滑台、滑枕'], + ['A','绕 X 方向的轴线转动','AC 机床的外层倾转轴'], + ['B','绕 Y 方向的轴线转动','BC 机床的外层倾转轴'], + ['C','绕 Z 方向的轴线转动','装在倾转台上的内层旋转轴'], + ])+'

AC 型:X、Y、Z、A、C

BC 型:X、Y、Z、B、C

XYZABC 六个独立轴同时配置,通常应称六轴。A/B/C 是旋转轴的通用名称,本课不是三只转台轴同时工作。C 的轴线会被父级 A/B 倾转,倾转后不再固定平行于机床 Z。

', + '从正方向看懂箭头前,先确认观察视角、父级坐标系和机床正负号约定。', '[S3] 轴命名;图中数值采用本项目原生变换约定。') + +page('01 · 机械拓扑', '两条运动链,共用一个底座', + fig('hierarchy','本课桁架结构:X 带动整个横梁,Y 带动滑座,Z 带动滑枕与刀具。','wide-diagram')+ + '

刀具分支
底座 → X → Y → Z
运动从父节点传给所有子节点。

工件分支
底座 → A/B → C → 工件
A/B 转动时,C 的轴线也随之倾斜。

', + '这是一种五轴结构,不是所有五轴机床的通用拓扑;摆头、头台混合型需要不同模型。', '本项目 trt-xyz-gantry/1;旧标准型在 Z 下另有固定主轴箱节点。') + +page('01 · 真实模型', 'AC 与 BC:外层倾转轴不同', + '
'+fig('machine-ac','AC 桁架:A 绕 X,内层 C 随 A 倾转')+fig('machine-bc','BC 桁架:B 绕 Y,内层 C 随 B 倾转')+'

两者都能实现刀尖相对工件的五轴轨迹,但同一角度数值对应的空间姿态不同;不能只把程序里的 A 字母换成 B,就认为加工姿态完全相同。

', + '先识别“哪根轴装在哪根轴上”,再选择运动学模型。', '图:原创可下载 GLB;不是制造商的标定尺寸图。') + +page('02 · 三种位置', '不要把“程序点、关节位置、实际反馈”混为一谈', + table(['量','回答的问题','典型表示'],[ + ['编程位置 p','刀尖相对所用编程参考系要到哪里?','(X, Y, Z),加 A/C 或 B/C'], + ['关节指令 q','各执行轴需要到哪个位置?','(J0, J1, J2, J3, J4)'], + ['实际反馈 q_actual','编码器报告电机/机械轴在哪里?','真实设备中可能存在跟随误差'], + ['三维刀尖位置 r','把关节和模型组合后,刀尖在场景哪里?','显示坐标,不是独立运动控制源'], + ])+'

理想仿真中“关节指令 = 关节反馈”常成立,但真实机床两者仍须区分。RTCP 的运动学把 p 转成 q;模型再把 q 投影成画面。

', + '“实际位置”一词要说明是在说编程坐标、关节指令,还是编码器反馈。') + +page('02 · G 代码含义', '非 RTCP 时,G 代码也不总等于机械绝对位置', + '
程序字值→单位 / G90–G91→工件零点 / 补偿→运动学→关节指令
'+table(['因素','为什么不能直接等同'],[ + ['G90 与 G91','G90 通常给绝对目标;G91 给相对增量,X10 不一定是到 X=10。'], + ['G54 等工件坐标系','工件零点可能偏离机床零点;程序 X10 可能对应机床 X30。'], + ['G92、刀长等补偿','控制器还需处理偏置和刀具参考点。'], + ['Identity 直接映射','在完成以上处理后,所选坐标与关节才按配置直接对应。'], + ])+'

简化例:G54 原点位于机床 (20,30,0),无其他偏置/补偿,程序点 (10,0,5) 对应机床点 (30,30,5)。

', + '只有把偏置、单位、增量方式、刀具基准都约定好,才能说“程序值直接对应轴位置”。', '[S2][S3];本页示例为无旋转的 Identity 情形。') + +page('03 · 非 RTCP', '只转 C,工件点会离开刀尖', + fig('identity-no-follow','俯视图:蓝色为固定机床坐标;绿色为工件;红色为刀尖。Z 保持 20 mm。','large-diagram')+ + '

起点刀尖对准转台上半径 100 mm 的标记点。只命令 C 从 0° 转到 90°,XYZ 关节不补偿,标记点转到另一处,刀尖仍在原来的机床位置。

', + '轴可以独立驱动,不代表“刀具与工件的相对位置”不受其他轴影响。') + +page('03 · RTCP', '同样只改变角度,刀尖跟住工件点', + fig('tcp-follow','同一个工件局部点 p=(100,0,20),C=0° 与 C=90°;旋转中心和偏置取零。','large-diagram')+ + '

保持编程点 p 不变,只改变 C。控制器计算所需 XYZ 关节,让刀尖到达标记点的新机床位置。点在工件坐标中不变,在机床坐标中沿圆弧移动。

', + '判断“跟随”的参考系是工件,而不是屏幕或机床底座。') + +page('03 · 数值算例 1', 'C 转 90°:同一编程点,不同关节位置', + '

零偏置、零刀长差,p = (100, 0, 20) mm;A/B = 0°。

'+table(['C 角度','RTCP 编程 XYZ','RTCP 所需关节 XYZ','非 RTCP:只转 C 的关节 XYZ'],[ + [f'{s["c"]}°','(100, 0, 20)',xyz(s['joints']),'(100, 0, 20)'] for s in data['cases'][0]['samples'][:3] + ])+'
qx = 100 cos C  qy = 100 sin C  qz = 20

C=90° 时,XYZ 关节目标是 (0,100,20)。这不是控制器偷偷修改了程序点,而是同一点在另一参考系中的正确位置。

', + 'RTCP:程序坐标可以不变,执行轴位置必须按姿态变化。', 'numeric-evidence.json;原生 WASM IK/FK 双向核对,显示保留3位小数。') + +page('04 · 坐标方向', 'C = 45° 时,“沿工件 X 走”意味着什么?', + '

蓝色 XM、YM 是机床固定方向;绿色 XW、YW 随工件转动。

姿态保持 C=45°,编程增量:

ΔpW = (10, 0, 0)

对应的机床直线轴增量:

Δq = (7.071, 7.071, 0)

不是机床 X 导轨真的旋转了,而是 X、Y 导轨合成出所需空间运动方向。

'+fig('rotated-direction','图中工件原点为便于观看作了平移;增量不受原点平移影响。')+'
', + '你的“XYZ 方向随旋转改变”可理解为工件基向量在机床坐标中的方向改变。') + +bc = data['cases'][1]['samples'][4] +page('04 · 数值算例 2', 'BC 倾转后,沿工件 X 会同时改变机床 X、Y、Z', + '

采用本课的正向变换约定:

R = RY(B) · RZ(C)

当 B=30°、C=45° 时:

XW 在 M 中的方向
(0.6124, 0.7071, −0.3536)

所以沿 XW 前进 10 mm:

Δq ≈ (6.124, 7.071, −3.536) mm

倾斜后的坐标方向并不与任何一根直线导轨重合,需要三根直线轴合成。

'+fig('bc-frame','B=30°、C=45°;红点为工件点 p=(100,0,20) 的机床位置。')+'
', + 'RTCP 中“沿工件 X”不是“只让 X 电机动”。') + +ac = data['cases'][0]['samples'][4] +page('04 · AC 与 BC 对照', '同样的 30° / 45°,不是同一个姿态', + '

仍取 p=(100,0,20) mm,所有旋转中心、偏置和刀长差为零。

'+table(['结构','父级倾转 × 子级旋转','倾转30°、C45°时的关节XYZ'],[ + ['AC','RX(A) · RZ(C)',xyz(ac['joints'])], + ['BC','RY(B) · RZ(C)',xyz(bc['joints'])], + ])+'

AC:绕 X 倾转

C 先改变平面位置,A 再把局部 Y/Z 方向倾斜。

BC:绕 Y 倾转

C 先改变平面位置,B 再把局部 X/Z 方向倾斜。

矩阵从右向左作用于列向量;这是坐标转换次序,不是要求 G 代码先运动 C 再运动 A/B。插补时两轴可以同时运动。

', + '运动学类型选错,即使每个轴都会动,刀尖也不会沿正确的相对轨迹走。', 'numeric-evidence.json;零偏置原生 WASM 结果。') + +page('05 · 为什么还需要几何参数', '同样转 90°,绕不同的中心会到不同的位置', + fig('pivot-offset','二维俯视例:起点相同,旋转角度相同,仅旋转中心不同。','large-diagram')+ + '
pM = O + R · (p − O)

计算顺序:先减去旋转中心 → 旋转 → 再加回中心。不能只计算 R·p,否则相当于错误地绕坐标零点转。

', + 'RTCP 不只是“方向变换”,还包括“绕哪里转”的平移关系。') + +page('05 · 轴间偏置与变换顺序', 'C 轴装在倾转轴上:父子关系不能交换', + '

先看几何,再写方程

P:C 轴零位参考点。
D:倾转轴与 C 轴之间的偏置。
T=P+D:倾转轴参考位置。

C 旋转后的点还要随 A/B 倾转;偏置也必须放在正确的父子层级中。

URDF / GLB 里的对应关系

'+table(['节点','本项目零位 origin'],[ + ['A/B,父节点为底座','P + D'],['C,父节点为 A/B','−D'],['work,父节点为 C','−P'], + ],'compact')+'
qXYZ = P + D + Rtilt [ RC (p − P) − D ] (刀长差为零)

这是本项目 AC/BC TRT 约定。更一般的机床使用完整的刚体变换链;不能把这三个参数关系硬套到摆头机床。长度在运行配置中为 mm,URDF 为 m。

', + 'RtiltRC 通常不等于 RCRtilt;机械安装顺序决定计算顺序。', '本地 trtfuncs.c;本项目 URDF profile / D11 / D12。') + +page('05 · 刀长与受控点', '控制的是刀尖,不只是主轴箱', + fig('tool-length','侧视示意:同一主轴参考位置,刀长不同会产生不同刀尖位置。','large-diagram')+ + '

刀长改变时,为保持同一个刀尖目标,需要重新计算主轴参考点的位置。必须明确刀具长度的测量基准、正负号、刀补状态,以及模型上“tool”节点代表哪里。

教学主算例采用刀长差为零。本项目原生 TRT 使用相对于 master tool 的 tool-offset 约定,不能把它直接当作任意模型网格的总长度。

', + '同一组关节位置 + 不同刀具标定,不一定得到同一个刀尖位置。', '[S1][S3];实际使用以机床和控制器的刀具标定约定为准。') + +page('06 · 姿态的物理意义', '双转台没有转动主轴,却改变了相对刀轴方向', + fig('orientation','侧视:主轴在机床中保持竖直,工件随转台倾斜,二者的相对夹角改变。','large-diagram')+ + '

在本课双转台机床中,刀轴在机床坐标里的方向固定;工件转动后,刀轴在工件坐标里的方向改变。RTCP 根据指定角度协调刀尖位置,不会自动推断曲面法向。

', + 'RTCP 不是“自动让刀轴垂直于任意曲面”;姿态仍由程序、CAM 或操作者给定。') + +page('06 · 三种常见联动情形', '分清“保持点”“沿方向走”“同时改变位置和姿态”', + table(['输入变化','RTCP 应做什么','观察重点'],[ + ['XYZ 不变;A/B、C 改变','让刀尖保持同一工件编程点;XYZ关节可能联动。','刀尖与工件标记点不分离。'], + ['角度不变;XYZ 改变','沿当前工件参考系定义的方向移动。','机床多轴合成编程方向。'], + ['XYZ 与角度同时改变','执行变化的编程轨迹,同时维持角度对应的几何关系。','全过程相对轨迹正确,不只看终点。'], + ['XYZ 不变;点恰在 C 轴线上;只转 C','该点机床位置可以不变。','XYZ 不动不一定是故障。'], + ])+'

“五轴联动”不要求每个时刻五轴速度都非零。非 RTCP 也能多轴同步加工:CAM/后置可以预先按指定机床几何计算轴目标,但这不等于控制器开启了实时刀尖补偿。

', + '每次解释一个动作,先说清哪些程序量保持不变、哪些程序量在改变。') + +page('06 · 全过程的重要性', '终点都正确,不代表中间轨迹正确', + '

同一个工件点绕 C 转动,理想半径为 100 mm。

RTCP:刀尖跟随圆弧。
不做 RTCP:若只让 X/Y 线性插补到相同终点,刀尖可能走弦线。

'+table(['中间位置','X / Y'],[['圆弧,C=45°','70.711 / 70.711'],['弦线,50%进度','50.000 / 50.000']],'compact')+'

图示采用共同线性进度比较几何路径,不是断言所有控制器的加减速过程相同。

'+fig('arc-chord','中途差距 29.289 mm;起点和终点却完全相同。')+'
', + '验收 RTCP 要看连续采样、刀尖相对轨迹和关节约束,不能只比首末坐标。') + +switch = data['switch_example'] +page('07 · 模式切换', 'M429 ↔ M428:坐标可以变,机床不能无故跳动', + '

本项目 BC 示例:保持同一组物理关节,切换坐标解释。

'+table(['量','M429 / Identity','M428 / TCP'],[ + ['物理关节 XYZ',xyz(switch['physical']),xyz(switch['physical'])], + ['物理关节 B / C','4.8675° / 179.88°','4.8675° / 179.88°'], + ['显示/解释的 XYZ',xyz([switch['identity_pose'][a] for a in 'xyz']),xyz([switch['tcp_pose'][a] for a in 'xyz'])], + ['三维刀尖','同一空间位置','同一空间位置'], + ])+'
取当前关节 q→切换运动学→新模式正解 p→同步 TP / 解释器

本例使用真实 BC 模型参数 P=(−18,14,12)、D=(22,0,−40) mm,刀长差0。切换之后再给运动指令,才产生运动。

', + '若切换时强行保持旧 XYZ 数字并重新逆解,就可能错误地改变物理关节。', '[S2] 同步原则;本地 control.c::handle_kinematicsSwitch;WASM实算。') + +page('07 · 控制器功能边界', 'RTCP、旋转工作平面、刀补,不是同一个开关', + table(['功能','主要解决的问题','不要误认为'],[ + ['RTCP / TCP 运动学','姿态变化时,按机床结构实现目标刀尖相对轨迹。','所有控制器都会以完全相同方式解释XYZ。'], + ['工件坐标系 / 倾斜工作平面','选择编程参考原点或定义编程方向。','只旋转工作平面就自动具备完整五轴RTCP。'], + ['刀长补偿','把刀具参考点换算到实际受控刀尖。','更换刀具后只更新网格外观就够了。'], + ['机床标定','确定中心、偏置、轴向、正负号和长度。','只要支持RTCP,错误几何参数也会自动纠正。'], + ])+'

不同控制器可能分别使用 TCP、TCPM、RTCP 等名称,并把倾斜平面/刀补组合进不同指令。本课明确讲本项目的 AC/BC 双转台语义,不推定所有品牌一致。

', + '换控制器时先核对“参考系、受控点、角度定义、指令组合”,不要只对照功能名称。') + +page('08 · 程序对照', '同样写 C90,开关状态决定 XYZ 是否补偿', + '

M429:直接映射

G21 G90 G94\nM429\nG1 X100 Y0 Z20 A0 C0 F300\nG1 C90 F60

后一段只改变 C。
XYZ 关节保持 (100,0,20),
工件标记点会离开刀尖。

M428:RTCP

G21 G90 G94\nM428\nG1 X100 Y0 Z20 A0 C0 F300\nG1 C90 F60

后一段保持编程 XYZ。
XYZ 关节变到 (0,100,20),
刀尖仍对准同一个工件点。

仅为零偏置/零刀长差 AC 教学片段,起始角度和当前模态需已知;BC 用 B0。现有下载模型参数非零,不能期待相同数字。M428/M429 为本项目重映射,不是通用标准M码;F值只作插补示意,实际需按机床的旋转/混合进给规则设定。

', + '程序字值相同,不代表开关前后表达的是同一个机械目标。', '本项目 xyzac/xyzbc-trt.ini,428remap.ngc / 429remap.ngc。') + +page('08 · 浏览器课堂实验', '用 AC/BC 桁架模型验证,而不是只看公式', + '
  1. 加载:打开“导入机床模型”,选 AC 或 BC 桁架示例;记录旋转中心与偏置。
  2. 准备:确认空闲,开机并回零;选一个离 C 轴线有一定距离的刀尖位置。
  3. Identity:选择 M429,只 Jog A/B 或 C;观察 XYZ 关节是否保持。
  4. 切换:停止后选择 M428;观察关节/刀尖不跳,XYZ 坐标可能变化。
  5. TCP:再次 Jog 旋转轴;观察 XYZ 关节按需补偿、刀尖相对工件点保持。
  6. 对照:先停止,再切回 M429;重复方向相同的小幅 Jog,比较两种行为。

实验先用小幅角度并远离限位。记录的是“每次试验起点相对工件的同一点”;切换或重新定位后,不要把两个不同起点混作同一个目标。

', + '同时观察三项:程序XYZ、J0…J4、刀尖与工件的相对关系。', '页面 http://127.0.0.1:5174/;浏览器仿真教学,不是机床现场操作规程。') + +page('08 · 参数化实验', '改几何参数后,为什么仍应保留同一个模型?', + '

正确的数据流

参数表:中心 / 偏置↓有效 URDF:节点零位关系↓INI → Worker → WASM↓关节 → 原导入模型

课堂观察

  • 同一 GLB 的网格、材质和文件身份保持。
  • 新的轴心与偏置应进入运行结构和运动学。
  • 相同程序点和角度,可能得到不同的 XYZ 关节值。
  • 参数改变后需重新回零并重新解析程序。

源GLB不自动改写;可保存INI记录参数。改变轴心不等于自动重建支架、铸件等CAD外形,也不提供碰撞检测。

', + '模型保留和参数生效必须同时成立;只改外观或只改计算都会造成误导。', '本项目 D11 / E09:AC、BC各18个姿态/刀长样本验证。') + +page('09 · 约束与故障', '“工件点可达”不等于“每个关节都没到限位”', + '

两层约束

'+table(['约束','检查什么'],[['坐标限位','编程轴/坐标允许的范围'],['关节限位','实际执行机构的物理行程'],['动力学约束','速度、加速度等能力']],'compact')+'

RTCP 旋转时,即使编程 XYZ 不变,补偿出来的 X/Y/Z 关节仍可能触及边界。

本项目排障实例

BC 配置允许较大的 B 坐标范围,但对应 JOINT_3 上限为 50°。

旧问题:越界 → 运动计算失败 → 事件时钟不同步 → Connection ERROR。

修复后:按关节约束停止,保留正确时钟,可松开并反向 Jog。

本仿真对 RTCP 越界采用最后有效伺服样本停止,不等同于工业控制器的全路径限位预测与减速保护。范围和行为必须分别验证。

', + '正常限位阻止是一条运动诊断;序号缺口或连接错误是软件故障,不是RTCP原理。', '本项目 R07 / E11;不据此宣称硬件安全或碰撞防护。') + +page('09 · 常见误解', '六个问题,快速判断是否真正理解', + table(['说法','准确解释'],[ + ['“非RTCP时各轴互相没有影响。”','没有自动补偿;但工件转动当然会改变它与刀具的相对位置。'], + ['“RTCP把X/Y/Z导轨转了。”','导轨不转,是工件基方向改变,由固定导轨合成空间运动。'], + ['“RTCP时XYZ永远不变。”','只在保持同一编程点时程序XYZ不变;关节XYZ通常变化。'], + ['“只要开RTCP,刀尖在空间就不动。”','刀尖可在机床空间移动,以保持它相对工件的目标关系。'], + ['“C转了但XYZ没动,一定坏了。”','目标点恰在C轴线上时可能正确,应先检查几何。'], + ['“切换模式时XYZ数字跳,必须修好。”','要检查关节和物理刀尖是否跳;新参考系里的数值改变可能正确。'], + ],'compact'), + '先说参考系,再说位置;先看结构,再说联动。') + +page('10 · 课堂练习', '请先画箭头,再写结论', + '
  1. 点追踪:零偏置,C=0°,工件点 p=(80,0,10)。只转 C 到90°,分别写出 Identity 和 RTCP 的 XYZ 关节目标。
  2. 方向合成:C=30°且倾转角为0°,沿工件 +X 方向走20mm,机床 X/Y 各应增加多少?
  3. 模式切换:M429切到M428时,XYZ显示值变化、J0…J4不变、刀尖不动,是否正常?为什么?
  4. 偏置识别:BC模型 C 的局部 origin=(-0.022,0,0.040)m,倾转轴 origin=(0.004,0.014,-0.028)m。求本项目 P、D,单位mm。
  5. 结构判断:C节点错误地挂在Z滑枕下。只Jog X时会发生什么?为什么不能靠RTCP开关解决?
', + '建议分组讨论 8–10 分钟;答案在下一页。') + +page('10 · 参考答案', '用“相对谁”检查每一步', + '
  1. Identity:(80,0,10);RTCP:(0,80,10)。前者刀尖留在机床原位置,后者继续对准同一工件点。
  2. ΔX=20cos30°=17.321mm;ΔY=20sin30°=10.000mm。方向向量长度仍为20mm,机床Z不变。
  3. 正常。运动学切换重新解释当前物理状态。坐标可以变,关节和刀尖应保持。
  4. P=T+U=(-18,14,12)mm;D=−U=(22,0,−40)mm。先统一单位,再按父子关系相加,不能直接拿URDF的米当毫米。
  5. C及工件会错误地随XYZ移动。这是结构树错误,不是开关模式能修复的;需把A/B→C分支正确挂回底座。
', + '检查顺序:轴数 → 层级 → 单位/正负号 → 几何参数 → 运动学 → 程序与状态。') + +page('附录 A · 数学推导', '从一根 C 轴,推到两根旋转轴', + '

绕 C 的平面变换

x′ = x cos C − y sin C\ny′ = x sin C + y cos C\nz′ = z

AC:再绕 X 倾转 A

qₓ = x′\nqᵧ = y′ cos A − z′ sin A\nq𝓏 = y′ sin A + z′ cos A

BC:再绕 Y 倾转 B

qₓ = x′ cos B + z′ sin B\nqᵧ = y′\nq𝓏 = −x′ sin B + z′ cos B

这里所有旋转中心、轴间偏置及刀长差为零,列向量采用右手正向变换。

式中的 q 是关节目标;若导入的是其他结构、符号约定或参考点,必须重新建立变换链。

', + '先学会解释“这一步在谁的坐标系中发生”,再记忆公式。', '与本地 trtfuncs.c 零偏置逆解一致;三角函数实际以弧度计算。') + +page('附录 B · 本项目完整参数式', '加入旋转中心、偏置与 master-tool 刀长差', + '
DL = D + L ez
qXYZ = P + DL + Rtilt [ RC (p − P) − DL ]
'+table(['符号','AC','BC'],[ + ['Rtilt','RX(A)','RY(B)'],['D','(0, Dy, Dz)','(Dx, 0, Dz)'],['旋转关节','qA=A,qC=C','qB=B,qC=C'], + ],'compact')+'

P为原生rot-point;L为本项目/原生TRT的tool-offset标定量;ez=(0,0,1)。本式返回关节XYZ,不是未经处理的网格刀尖世界坐标。G54等解释器偏置在输入p形成前已按控制器规则处理。

这一刀长表达是本项目约定,不能替代任意控制器的通用刀补说明。主课例子L=0;实际机床应以标定模型及其完整前后向验证为准。

', + '工程实现不在画面中“补一个偏移”;应让同一组结构数据贯穿解释器、运动学和模型。', '原生源码:linuxcnc/src/emc/kinematics/trtfuncs.c,xyzac/xyzbcKinematicsInverse。') + +page('附录 C · 教学安排与依据', '怎样讲、怎样验证、怎样继续学习', + '

建议授课节奏

10分钟:结构、轴名与三种位置。
20分钟:C轴点跟踪、方向合成、AC/BC倾转。
15分钟:旋转中心、偏置、刀长与模式切换。
15分钟:浏览器实验与错误诊断。
10分钟:练习、答案和模型参数核对。

本课验算

12个姿态由真实WASM逆解计算,并通过正解回代;另核对C45°方向增量、BC切换示例及弧弦差。详见同目录 numeric-evidence.json。

图形为原创教学示意及本项目GLB截图,不用于制造尺寸标定。

官方资料与本地实现

[S1] LinuxCNC · 5-Axis Kinematics
AC/BC结构、运动学及偏置。

[S2] LinuxCNC · Switchable Kinematics
模式切换、identityfirst、同步要求。

[S3] LinuxCNC · CNC Machine Overview
轴名、坐标、受控点与协调运动。

本地:trtfuncs.c;control.c;428remap.ngc / 429remap.ngc;docs/glb-machine/。M428=TCP、M429=Identity仅适用于本项目配置。

资料核对日期:2026-09-18。不同版本/品牌的指令与坐标约定应另行核查。

', + '一句话记忆:程序描述相对工件的目标,运动学把目标换算成各关节应该怎样动。') + +css = r''' +@page { size: 338.6667mm 190.5mm; margin: 0; } +* { box-sizing: border-box; } +html,body { margin:0; padding:0; background:#dce3e7; color:#23303a; font-family:"Noto Sans CJK SC","Noto Sans CJK JP",sans-serif; } +.slide { width:1280px; height:720px; padding:34px 54px 28px; background:#fff; position:relative; overflow:hidden; break-after:page; page-break-after:always; } +.slide:last-child { break-after:auto; page-break-after:auto; } +.chapter { color:#00877b; font-size:15px; margin:0 0 10px; font-weight:600; } +h1 { font-size:36px; font-weight:700; line-height:1.3; margin:0 0 24px; letter-spacing:0; } +h3 { font-size:23px; line-height:1.4; margin:0 0 14px; color:#00877b; } +p { font-size:22px; line-height:1.55; margin:0 0 17px; } +.body { height:498px; overflow:hidden; } +.cols { display:grid; grid-template-columns:1fr 1fr; gap:36px; } +.image-right { grid-template-columns: .95fr 1.1fr; gap:24px; } +.tight p { margin-bottom:0; font-size:20px; } +.small { font-size:17px; line-height:1.6; color:#53636d; } +.intro { font-size:22px; padding-bottom:8px; } +.takeaway { position:absolute; left:54px; right:54px; bottom:62px; background:#eaf5f2; border-left:5px solid #00877b; padding:10px 15px; font-size:19px; line-height:1.5; } +.footer { position:absolute; bottom:20px; left:54px; right:54px; display:flex; align-items:flex-end; justify-content:space-between; gap:20px; color:#6b7880; font-size:12px; line-height:1.5; border-top:1px solid #d8e1e6; padding-top:8px; } +.footer .source { max-width:1030px; } +.page-number { font-size:16px; color:#00877b; white-space:nowrap; } +figure { margin:0; min-width:0; } +figure img { width:100%; height:380px; object-fit:contain; display:block; } +figcaption { font-size:14px; line-height:1.5; margin-top:5px; color:#617079; text-align:center; } +.large-diagram img { height:306px; } +.large-diagram { margin-bottom:15px; } +.wide-diagram img { height:280px; } +.model-pair img { height:373px; } +.model-pair { margin-bottom:18px; } +table { border-collapse:collapse; width:100%; margin:8px 0 24px; font-size:19px; line-height:1.55; } +th { background:#eaf0f3; font-weight:600; text-align:left; border-bottom:2px solid #a5b8c1; padding:12px 14px; } +td { padding:13px 14px; border-bottom:1px solid #d8e1e6; vertical-align:top; } +td:first-child { font-weight:600; color:#2563b8; } +.compact { font-size:18px; } +.compact td,.compact th { padding:9px 12px; } +.equation { text-align:center; background:#f1f5f7; padding:14px 18px; font-size:26px; line-height:1.5; margin:14px 0 20px; } +.small-eq { font-size:23px; } +.flow { display:flex; gap:12px; align-items:center; margin:8px 0 25px; font-size:18px; } +.flow span { flex:1; background:#edf4f5; padding:13px 8px; text-align:center; } +.flow i { color:#00877b; font-size:25px; font-style:normal; } +.pair { display:flex; justify-content:space-around; } +.pair p { color:#00877b; } +.number { font-size:23px; color:#d45549; } +.blue { color:#2563b8; } .teal { color:#00877b; } .red { color:#d45549; } +pre { font-family:"DejaVu Sans Mono","Noto Sans Mono CJK SC",monospace; white-space:pre-wrap; background:#edf2f5; border-left:4px solid #2563b8; padding:18px; font-size:21px; line-height:1.8; margin:12px 0 20px; } +.math { font-family:"Noto Sans CJK SC",sans-serif; font-size:23px; line-height:1.65; } +ul,ol { margin:8px 0 14px; padding-left:29px; font-size:22px; line-height:1.6; } +li { margin-bottom:12px; } +.steps { font-size:21px; line-height:1.6; } +.steps li { padding-left:6px; margin-bottom:15px; } +.exercises,.answers { font-size:22px; line-height:1.65; } +.exercises li,.answers li { margin-bottom:19px; padding-left:7px; } +.vertical-flow { display:flex; flex-direction:column; align-items:center; gap:4px; font-size:22px; } +.vertical-flow span { padding:12px 16px; background:#f0f5f7; width:100%; text-align:center; } +.vertical-flow b { color:#00877b; } +.references p { font-size:18px; line-height:1.6; margin-bottom:13px; } +.references h3 { margin-bottom:10px; } +a { color:#136fb0; text-decoration:none; } +sub { font-size:.7em; } +.cover h1 { font-size:48px; margin-top:8px; margin-bottom:18px; } +.cover-grid { display:grid; grid-template-columns:1.12fr .88fr; gap:55px; } +.cover .subtitle { font-size:30px; color:#00877b; line-height:1.4; margin-bottom:22px; } +.cover-model img { height:402px; background:#242a2a; } +.rule { width:85px; height:5px; background:#d45549; margin:25px 0; } +.badge { color:#2563b8; font-size:17px; margin-top:21px; } +.slide[data-page="12"] figure img { height:345px; } +.slide[data-page="12"] .cols p { margin-bottom:12px; } +.slide[data-page="12"] .equation { margin:10px 0 14px; padding:10px 14px; } +.slide[data-page="30"] .equation { margin:8px 0; padding:8px 14px; font-size:24px; } +.slide[data-page="30"] table { margin-bottom:14px; } +.slide[data-page="30"] p { margin-bottom:10px; } +@media screen { .slide { margin:24px auto; box-shadow:0 3px 14px #0002; } } +@media print { html,body { background:#fff; } .slide { margin:0; box-shadow:none; } * { -webkit-print-color-adjust:exact; print-color-adjust:exact; } } +''' +# Avoid exotic script glyphs in equations so CJK PDF fonts remain reliable. +parts = [] +for index, slide in enumerate(slides, 1): + body = slide['body'].replace('q𝓏','q_z').replace('qₓ','q_x').replace('qᵧ','q_y') + parts.append(f'''
+
{slide['chapter']}

{slide['title']}

+
{body}
+
{slide['takeaway']}
+
{slide['sources'] or '五轴机床与 RTCP · 原创教学示意 · 以本课双转台结构为限'}{index:02d} / {len(slides):02d}
+
''') +document = '五轴机床与 RTCP:从各轴独立到刀尖跟随'+''.join(parts)+'' +(OUT / 'course.html').write_text(document) +(OUT / 'outline.json').write_text(json.dumps([{'page':i+1,'chapter':s['chapter'],'title':s['title']} for i,s in enumerate(slides)], ensure_ascii=False,indent=2)+'\n') +print(f'Built {len(slides)} teaching pages:', OUT / 'course.html') diff --git a/scripts/render_rtcp_beginner_pdf.mjs b/scripts/render_rtcp_beginner_pdf.mjs new file mode 100644 index 0000000..3733ea5 --- /dev/null +++ b/scripts/render_rtcp_beginner_pdf.mjs @@ -0,0 +1,27 @@ +import assert from 'node:assert/strict'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { fileURLToPath, pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const directory = new URL('../docs/teaching/rtcp-beginners/', import.meta.url); +await mkdir(new URL('verification/',directory),{recursive:true}); +const browser = await chromium.launch({executablePath:'/usr/bin/google-chrome',headless:true,args:['--no-sandbox']}); +try { + const page = await browser.newPage({viewport:{width:794,height:1123}}); + const errors=[];page.on('pageerror',(e)=>errors.push(e.message)); + await page.goto(new URL('handbook.html',directory).href);await page.emulateMedia({media:'print'}); + await page.evaluate(async()=>{await document.fonts.ready;await Promise.all([...document.images].map((im)=>im.decode()));}); + const checks=await page.locator('.sheet').evaluateAll((pages)=>pages.map((sheet)=>{ + const outer=sheet.getBoundingClientRect(),body=sheet.querySelector('.body'),key=sheet.querySelector('.key').getBoundingClientRect(); + const violations=[...body.querySelectorAll('p,li,table,figure,pre,.equation,aside,h2')].filter((e)=>{ + const r=e.getBoundingClientRect();return r.bottom>key.top-6||r.right>outer.right-32||r.left({tag:e.tagName,text:e.textContent.slice(0,70),bottom:e.getBoundingClientRect().bottom-outer.top})); + const title=sheet.querySelector('h1');const range=document.createRange();range.selectNodeContents(title); + return {page:Number(sheet.dataset.page),title:title.textContent,violations,overflow:body.scrollHeight>body.clientHeight+1,title_right:range.getBoundingClientRect().right-outer.left,images:[...sheet.querySelectorAll('img')].map((im)=>({src:im.getAttribute('src'),loaded:im.complete&&im.naturalWidth>0})),characters:body.innerText.length}; + })); + await writeFile(new URL('verification/layout.json',directory),JSON.stringify({report_id:'rtcp-beginners-layout-v1',pages:checks,errors},null,2)+'\n'); + for(const check of checks) await page.locator(`.sheet[data-page="${check.page}"]`).screenshot({path:fileURLToPath(new URL(`verification/page-${String(check.page).padStart(2,'0')}.png`,directory))}); + const bad=checks.filter((c)=>c.violations.length||c.overflow||c.title_right>760||c.images.some((im)=>!im.loaded)); + assert.deepEqual(errors,[]);assert.deepEqual(bad,[],'Handbook page overflow'); + await page.pdf({path:fileURLToPath(new URL('五轴RTCP与工件坐标-初学者完整讲义.pdf',directory)),preferCSSPageSize:true,printBackground:true,tagged:true,outline:true}); + console.log(JSON.stringify({report_id:'rtcp-beginners-layout-v1',status:'verified',pages:checks.length})); +} finally {await browser.close();} diff --git a/scripts/render_rtcp_teaching_pdf.mjs b/scripts/render_rtcp_teaching_pdf.mjs new file mode 100644 index 0000000..3172de7 --- /dev/null +++ b/scripts/render_rtcp_teaching_pdf.mjs @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { pathToFileURL, fileURLToPath } from 'node:url'; + +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const directory = new URL('../docs/teaching/rtcp-five-axis/', import.meta.url); +await mkdir(new URL('verification/', directory), { recursive: true }); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox'] }); +try { + const page = await browser.newPage({ viewport: { width: 1280, height: 720 }, deviceScaleFactor: 1 }); + const errors = []; page.on('pageerror', (e) => errors.push(e.message)); + await page.goto(new URL('course.html', directory).href); + await page.emulateMedia({ media: 'print' }); + await page.evaluate(async () => { await document.fonts.ready; await Promise.all([...document.images].map((im) => im.decode())); }); + const checks = await page.locator('.slide').evaluateAll((slides) => slides.map((slide) => { + const rect = slide.getBoundingClientRect(), body = slide.querySelector('.body'), takeaway = slide.querySelector('.takeaway').getBoundingClientRect(); + const clipped = [...body.querySelectorAll('p,li,table,figure,pre,.equation,.flow,h3')].filter((element) => { + const r = element.getBoundingClientRect(); + return r.bottom > takeaway.top - 5 || r.right > rect.right - 35 || r.left < rect.left + 30; + }).map((element) => ({ tag: element.tagName, text: element.textContent.slice(0, 80), bottom: element.getBoundingClientRect().bottom - rect.top })); + const title = slide.querySelector('h1'); + const range = document.createRange(); range.selectNodeContents(title); + const titleBounds = range.getBoundingClientRect(); + return { page: Number(slide.dataset.page), title: title.textContent, clipped, content_overflow: body.scrollHeight > body.clientHeight + 1, title_right: titleBounds.right - rect.left, images: [...slide.querySelectorAll('img')].map((im) => ({ src: im.getAttribute('src'), complete: im.complete && im.naturalWidth > 0 })) }; + })); + await writeFile(new URL('verification/layout.json', directory), JSON.stringify({ pages: checks, errors }, null, 2) + '\n'); + for (const check of checks) { + await page.locator(`.slide[data-page="${check.page}"]`).screenshot({ path: new URL(`verification/page-${String(check.page).padStart(2, '0')}.png`, directory).pathname }); + } + const bad = checks.filter((c) => c.clipped.length || c.content_overflow || c.title_right > 1230 || c.images.some((im) => !im.complete)); + assert.deepEqual(errors, []); + assert.deepEqual(bad, [], 'PDF slide overflow or missing assets'); + await page.pdf({ path: fileURLToPath(new URL('五轴机床与RTCP-教学课件.pdf', directory)), preferCSSPageSize: true, printBackground: true, tagged: true, outline: true }); + console.log(JSON.stringify({ report_id: 'rtcp-teaching-layout-v1', pages: checks.length, status: 'verified', pdf: '五轴机床与RTCP-教学课件.pdf' })); +} finally { await browser.close(); } diff --git a/scripts/subset_rtcp_beginner_fonts.py b/scripts/subset_rtcp_beginner_fonts.py new file mode 100644 index 0000000..0a47511 --- /dev/null +++ b/scripts/subset_rtcp_beginner_fonts.py @@ -0,0 +1,28 @@ +"""Embed only the authored Unicode codepoints, avoiding CJK radical aliases.""" +import html +import shutil +from pathlib import Path +from fontTools import subset +from fontTools.ttLib import TTFont + +ROOT=Path(__file__).resolve().parents[1] +OUT=ROOT/'docs/teaching/rtcp-beginners' +characters=set(html.unescape((OUT/'handbook.html').read_text())) +for style in ['Regular','Bold']: + font=TTFont(f'/usr/share/fonts/opentype/noto/NotoSansCJK-{style}.ttc',fontNumber=2) + options=subset.Options() + options.name_IDs=['*'];options.name_legacy=True;options.name_languages=['*'] + tool=subset.Subsetter(options=options);tool.populate(unicodes={ord(c) for c in characters});tool.subset(font) + for record in font['name'].names: + replacement={1:'RtcpHandbookCJK',2:style,3:f'RtcpHandbookCJK-{style}',4:f'RtcpHandbookCJK {style}',6:f'RtcpHandbookCJK-{style}'}.get(record.nameID) + if replacement: + record.string=replacement.encode(record.getEncoding()) + if 'CFF ' in font: + cff=font['CFF '].cff + cff.fontNames=[f'RtcpHandbookCJK-{style}'] + cff.topDictIndex[0].FamilyName='RtcpHandbookCJK' + cff.topDictIndex[0].FullName=f'RtcpHandbookCJK {style}' + font.save(OUT/f'assets/handbook-{style.lower()}.otf') + font.close() +shutil.copyfile('/usr/share/doc/fonts-noto-cjk/copyright',OUT/'assets/font-license.txt') +print('Embedded SC fonts subset to',len(characters),'authored characters') diff --git a/scripts/test_axis_control_inventory.mjs b/scripts/test_axis_control_inventory.mjs index fc40bc1..0ef0c15 100644 --- a/scripts/test_axis_control_inventory.mjs +++ b/scripts/test_axis_control_inventory.mjs @@ -13,7 +13,7 @@ const [contract, app, panel, preview] = await Promise.all([ const controlIds = [ "menu-file", "menu-file-edit-tool-data", "menu-file-quit", "menu-help", "menu-help-about", "about-close", "toolbar-estop", "toolbar-power", "toolbar-open", "toolbar-load-case", "toolbar-reload", "toolbar-run", "toolbar-step", "toolbar-pause-resume", "toolbar-stop", "toolbar-block-delete", "toolbar-optional-pause", "toolbar-zoom-in", "toolbar-zoom-out", "toolbar-view-z", "toolbar-view-z2", "toolbar-view-x", "toolbar-view-y", "toolbar-view-y2", "toolbar-view-p", "toolbar-rotate", "toolbar-clear-live-plot", - "workspace-case-select", "workspace-load-3d-chips", "manual-home-all", "manual-home-joint-select", + "workspace-case-select", "workspace-load-3d-chips", "workspace-rtcp-programs", "rtcp-program-scope", "rtcp-program-select", "rtcp-program-source", "rtcp-program-load", "rtcp-program-download", "machine-manager-settings", "machine-manager-import", "machine-manager-files", "machine-manager-translate", "machine-manager-rotate", "machine-manager-role", "machine-manager-parent", "machine-manager-show-origin", "machine-manager-apply", "machine-manager-export", "manual-home-all", "manual-home-joint-select", "switchkins-0", "switchkins-1", "switchkins-2", "tab-manual", "tab-mdi", "tab-diagnostics", "tab-preview", "tab-dro", "manual-axis-x", "manual-axis-y", "manual-axis-z", "manual-axis-a", "manual-axis-c", @@ -28,7 +28,8 @@ const controlIds = [ ]; for (const id of controlIds) assert.ok(contract.includes(`\`${id}\``), `control missing from source contract: ${id}`); -const source = `${app}\n${panel}\n${preview}`; +const [library, manager] = await Promise.all([read("web/react/src/RtcpProgramLibrary.tsx"), read("web/react/src/MachineManagerPanel.tsx")]); +const source = `${app}\n${panel}\n${preview}\n${library}\n${manager}`; for (const term of ["data-axis-control", "manual-axis-${axis}", "switchkins-${item.type}", "preview-${action}", "preview-layer-${layer}"]) assert.ok(source.includes(term), `control marker missing: ${term}`); for (const forbidden of ["Prepare T1", ">Change", "Arm Probe", ">Disarm", "Reload editor", "program-actions\">', '']) assert.equal(source.includes(forbidden), false, `non-source or duplicate control rendered: ${forbidden}`); diff --git a/scripts/test_gantry_machine_browser.mjs b/scripts/test_gantry_machine_browser.mjs new file mode 100644 index 0000000..9190aa2 --- /dev/null +++ b/scripts/test_gantry_machine_browser.mjs @@ -0,0 +1,68 @@ +import assert from 'node:assert/strict'; +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import { createHash } from 'node:crypto'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const output = new URL('../coverage/glb-machine/gantry/', import.meta.url); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const settled = () => page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); +const report = { report_id: 'gantry-machine-browser-v1', status: 'running', examples: [], layouts: [] }; +try { + await page.goto('http://127.0.0.1:5174/'); await settled(); + for (const id of ['ac', 'bc', 'ac-gantry', 'bc-gantry']) { + await control('machine-glb-settings').click(); await control(`machine-glb-${id}`).click(); await settled(); + const s = await page.evaluate(async (id) => { + const api = await import('/src/imported-machine.ts'), parser = await import('/src/machine-urdf.ts'); + const catalog = await (await fetch('/machines/manifest.json')).json(), entry = catalog.machines.find((e) => e.id === id); + const buffer = await (await fetch(`/machines/${entry.filename}`)).arrayBuffer(); + const asset = await api.loadImportedMachine(buffer, entry.filename), structure = asset.structure; + if (asset.hash !== document.querySelector('.xyzac-machine-view').dataset.machineGlb) throw new Error('UI example differs from file'); + const model = api.buildImportedMachine(asset); + const gantry = id.endsWith('gantry'); + if (structure.profile !== (gantry ? 'trt-xyz-gantry/1' : 'trt-xyz-head/1')) throw new Error('wrong profile'); + const find = (c) => structure.joints.find((j) => j.coordinate === c); + if (find('X').parent !== structure.base || find('Y').parent !== find('X').child || find('Z').parent !== find('Y').child) throw new Error('bad XYZ chain'); + if (find(structure.coordinates[3]).parent !== structure.base || find('C').parent !== find(structure.coordinates[3]).child) throw new Error('bad rotary chain'); + if (gantry && (structure.tool !== find('Z').child || structure.links.length !== 7)) throw new Error('tool must be Z link'); + const rejections = []; + if (gantry) for (const [name, xml] of [ + ['wrong-tool', structure.urdf.replace('tool="z_slide"', 'tool="y_slide"')], + ['wrong-profile', structure.urdf.replace('trt-xyz-gantry/1', 'trt-xyz-head/1')], + ['rotary-on-xyz', structure.urdf.replace('', '')], + ]) { let rejected = false; try { parser.parseMachineUrdf(xml); } catch { rejected = true; } if (!rejected) throw new Error(`accepted ${name}`); rejections.push(name); } + const nodes = []; + if (gantry) model.machine.traverse((n) => { if (n.name.startsWith('moving_bridge_chord_') || n.name.startsWith('gantry_y_carriage_') || n.name.startsWith('gantry_z_ram_') || n.name.startsWith('gantry_post_')) nodes.push(n); }); + const state = { offsets: { ...structure.offsets, tool_offset: 0 }, joints: [0, 0, 0, 0, 0] }; + const capture = () => nodes.map((n) => ({ name: n.name, parent: n.parent.name, position: n.getWorldPosition(model.toolTip.position.clone()).toArray() })); + model.update(state); const initial = capture(); + model.update({ ...state, joints: [20, 10, 5, 0, 0] }); const moved = capture(); + for (let i = 0; i < nodes.length; i++) { + const name = nodes[i].name; + const expected = name.startsWith('gantry_post_') ? [0, 0, 0] : name.startsWith('moving_bridge_chord_') ? [.2, 0, 0] : name.startsWith('gantry_y_carriage_') ? [.2, 0, .1] : [.2, .05, .1]; + moved[i].position.forEach((v, k) => { if (Math.abs(v - initial[i].position[k] - expected[k]) > 1e-8) throw new Error(`wrong branch motion ${name}`); }); + } + const tableBefore = model.joints.rotate.getWorldPosition(model.toolTip.position.clone()).toArray(); + model.update(state); const tableAfter = model.joints.rotate.getWorldPosition(model.toolTip.position.clone()).toArray(); + if (tableBefore.some((v, k) => Math.abs(v - tableAfter[k]) > 1e-8)) throw new Error('table moved with XYZ'); + model.dispose(); api.disposeMachineScene(asset.scene); + return { entry, profile: structure.profile, links: structure.links, tool: structure.tool, initial, moved, rejections }; + }, id); + const name = id.endsWith('gantry') ? `下载 ${id.slice(0, 2).toUpperCase()}桁架型` : `下载 ${id.toUpperCase()}`; + const downloadEvent = page.waitForEvent('download'); await page.getByRole('link', { name, exact: true }).click(); + const download = await downloadEvent; assert.equal(createHash('sha256').update(await readFile(await download.path())).digest('hex'), s.entry.sha256); + await page.keyboard.press('Escape'); await page.locator('.axis-preview-machine').screenshot({ path: new URL(`${id}.png`, output).pathname }); + report.examples.push(s); + } + for (const [width, height] of [[1440, 1000], [390, 844]]) { + await page.setViewportSize({ width, height }); await control('machine-glb-settings').click(); + const b = await page.locator('.model-dialog button, .model-dialog a').evaluateAll((es) => es.map((e) => { const r = e.getBoundingClientRect(); return { x: r.x, right: r.right, y: r.y, bottom: r.bottom }; })); + assert.ok(b.every((r) => r.x >= 0 && r.right <= width && r.y >= 0 && r.bottom <= height)); + await page.screenshot({ path: new URL(`dialog-${width}.png`, output).pathname }); await page.keyboard.press('Escape'); report.layouts.push({ width, height, controls: b.length }); + } + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (e) { report.status = 'failed'; report.error = String(e.stack ?? e); await page.screenshot({ path: new URL('failure.png', output).pathname }); throw e; } +finally { report.browser_errors = errors; await writeFile(new URL('catalog.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, examples: report.examples.map((e) => e.entry.id) })); diff --git a/scripts/test_glb_machine_browser.mjs b/scripts/test_glb_machine_browser.mjs new file mode 100644 index 0000000..e0649f9 --- /dev/null +++ b/scripts/test_glb_machine_browser.mjs @@ -0,0 +1,201 @@ +import assert from 'node:assert/strict'; +import { readFile, writeFile, mkdir } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import { createHash } from 'node:crypto'; +import createModule from '../build-wasm/linuxcnc-sim-core.js'; +import { WasmXyzacKinematics } from '../web/worker/wasm-xyzac-kinematics.mjs'; +import { SimSession, CONTEXT_ID } from '../web/worker/sim-session.mjs'; +import { loadSimulationCase, toWorkerConfiguration } from '../web/workspace/sim-case-loader.mjs'; +import { writeTrtGeometry } from '../web/workspace/trt-geometry.mjs'; +import { MACHINE_DEFINITIONS } from '../web/workspace/machine-definitions.mjs'; +const root = new URL('../', import.meta.url), output = process.env.GLB_EVIDENCE_DIR ? pathToFileURL(`${process.env.GLB_EVIDENCE_DIR.replace(/\/$/, '')}/`) : new URL('coverage/glb-machine/', root); +await mkdir(output, { recursive: true }); +const wasmBinary = await readFile(new URL('build-wasm/linuxcnc-sim-core.wasm', root)); +const core = await createModule({ wasmBinary }); +const fetchImpl = async (url) => { try { const body = await readFile(new URL(String(url).replace(/^\//, ''), root), 'utf8'); return { ok: true, text: async () => body }; } catch { return { ok: false }; } }; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1100 } }); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const report = { report_id: 'glb-machine-browser-v1', status: 'running', wasm_sha256: createHash('sha256').update(wasmBinary).digest('hex'), parser: [], machines: [], viewports: [] }; +const control = (id) => page.locator(`[data-axis-control="${id}"]`), machine = page.locator('.xyzac-machine-view'); +const settled = async () => { await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); }; +const rendered = async () => { await page.waitForFunction(() => { const e = document.querySelector('.xyzac-machine-view'); return e?.dataset.xyzacTick === e?.dataset.xyzacRenderedTick; }); }; +const sample = () => machine.evaluate((e) => ({ joints: JSON.parse(e.dataset.xyzacJoints), offsets: JSON.parse(e.dataset.xyzacOffsets), tip: JSON.parse(e.dataset.xyzacToolTip), tick: Number(e.dataset.xyzacTick), hash: e.dataset.machineGlb })); +const jog = async (axis, index, delta) => { + await control(`manual-axis-${axis}`).check(); const before = await sample(); + const box = await control('manual-jog-positive').boundingBox(); + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); await page.mouse.down(); + try { await page.waitForFunction(({ index, target }) => JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[index] >= target, { index, target: before.joints[index] + delta }); } + finally { await page.mouse.up(); } + await page.waitForFunction(() => document.querySelector('.command-status')?.textContent.includes('JOG_STOP acknowledged') || [...document.querySelectorAll('span')].some((s) => s.textContent === 'JOG_STOP acknowledged')); + await rendered(); return { axis, before, after: await sample() }; +}; +try { + await page.goto(process.env.XYZAC_PANEL_URL ?? 'http://127.0.0.1:5174/'); await settled(); + // Exercise the browser's actual XML/GLB parser and GLTFLoader before touching the live machine. + for (const id of ['ac', 'bc']) { + const descriptor = await page.evaluate(async (id) => { + const api = await import('/src/imported-machine.ts'); + const parser = await import('/src/machine-urdf.ts'); + const bytes = await (await fetch(`/machines/demo-${id}-xyz-head.glb`)).arrayBuffer(); + const { json, structure } = parser.inspectMachineGlb(bytes); + const results = []; + const reject = (name, action) => { let error = ''; try { action(); } catch (e) { error = e.message; } if (!error) throw new Error(`must reject ${name}`); results.push({ name, error }); }; + const mutate = (change) => { + const next = structuredClone(json); change(next); + const view = new DataView(bytes), oldJsonLength = view.getUint32(12, true); + const bin = new Uint8Array(bytes, 20 + oldJsonLength); + const text = new TextEncoder().encode(JSON.stringify(next)); const length = Math.ceil(text.length / 4) * 4; + const data = new Uint8Array(20 + length + bin.length); const header = new DataView(data.buffer); + header.setUint32(0, 0x46546c67, true); header.setUint32(4, 2, true); header.setUint32(8, data.length, true); + header.setUint32(12, length, true); header.setUint32(16, 0x4e4f534a, true); data.fill(32, 20, 20 + length); data.set(text, 20); data.set(bin, 20 + length); + return () => parser.inspectMachineGlb(data.buffer); + }; + reject('truncated', () => parser.inspectMachineGlb(bytes.slice(0, bytes.byteLength - 1))); + reject('missing-schema', mutate((j) => { delete j.scenes[0].extras; })); + reject('external-buffer', mutate((j) => { j.buffers[0].uri = 'https://invalid.example/data.bin'; })); + reject('external-texture', mutate((j) => { j.images = [{ uri: 'file:///etc/passwd' }]; })); + reject('animation', mutate((j) => { j.animations = [{}]; })); + reject('node-cycle', mutate((j) => { j.nodes[0].children = [0]; })); + reject('wrong-hierarchy', mutate((j) => { const i = j.nodes.findIndex((n) => n.name === 'c_table'); j.nodes.find((n) => n.name === 'tilt_table').children = j.nodes.find((n) => n.name === 'tilt_table').children.filter((n) => n !== i); j.nodes.find((n) => n.name === 'base').children.push(i); })); + reject('node-offset-mismatch', mutate((j) => { j.nodes.find((n) => n.name === 'c_table').translation[2] += .01; })); + reject('duplicate-link', mutate((j) => { j.nodes.find((n) => n.name?.startsWith('bed_')).name = 'base'; })); + const matrixCompatible = mutate((j) => { + const node = j.nodes.find((n) => n.name === 'c_table'), v = node.translation; + delete node.translation; delete node.rotation; delete node.scale; + node.matrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ...v, 1]; + }); + if (matrixCompatible().structure.coordinates !== structure.coordinates) throw new Error('equivalent matrix rejected'); + reject('matrix-origin-mismatch', mutate((j) => { + const node = j.nodes.find((n) => n.name === 'c_table'); delete node.translation; delete node.rotation; delete node.scale; + node.matrix = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 4, 5, 6, 1]; + })); + const xml = structure.urdf; + reject('xml-syntax', () => parser.parseMachineUrdf(xml.slice(0, -15))); + reject('doctype', () => parser.parseMachineUrdf('' + xml)); + reject('duplicate-coordinate', () => parser.parseMachineUrdf(xml.replace('coordinate="Y"', 'coordinate="X"'))); + reject('negative-axis', () => parser.parseMachineUrdf(xml.replace('axis xyz="1 0 0"', 'axis xyz="-1 0 0"'))); + reject('nonzero-rpy', () => parser.parseMachineUrdf(xml.replace('rpy="0 0 0"', 'rpy="0 0 0.1"'))); + reject('nan-limit', () => parser.parseMachineUrdf(xml.replace('velocity="0.02"', 'velocity="NaN"'))); + reject('mimic', () => parser.parseMachineUrdf(xml.replace('', ''))); + reject('unknown-profile', () => parser.parseMachineUrdf(xml.replace('trt-xyz-head/1', 'generic/1'))); + reject('broken-tree', () => parser.parseMachineUrdf(xml.replace('parent link="base"', 'parent link="spindle_head"'))); + const bundle = await (await import('/workspace/sim-case-loader.mjs')).loadSimulationCase({ path: `linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyz${id}-trt.ini`, baseUrl: '.' }); + const tight = structuredClone(structure); tight.joints.find((j) => j.coordinate === 'X').limit.upper = .01; + reject('runtime-range-outside-model', () => api.configureImportedMachine(bundle, tight)); + const slow = structuredClone(structure); slow.joints.find((j) => j.coordinate === 'X').limit.velocity = .001; + reject('runtime-speed-outside-model', () => api.configureImportedMachine(bundle, slow)); + const changed = api.configureImportedMachine(bundle, structure); + const parsed = (await import('/workspace/trt-geometry.mjs')).readTrtGeometry(changed); + window.glbTestAsset && api.disposeMachineScene(window.glbTestAsset.scene); + window.glbTestAsset = await api.loadImportedMachine(bytes, `demo-${id}.glb`); + return { structure, hash: window.glbTestAsset.hash, results, writtenOffsets: parsed.offsets }; + }, id); + report.parser.push({ id, rejected: descriptor.results }); + for (const [key, value] of Object.entries(descriptor.structure.offsets)) assert.ok(Math.abs(descriptor.writtenOffsets[key] - value) < 1e-8); + const coordinates = descriptor.structure.coordinates; + // The real native inverse supplies the reference, not a duplicate JS RTCP formula. + const samples = []; + for (const tool_offset of [0, 17, -4]) { + const offsets = { ...descriptor.structure.offsets, tool_offset }; + const native = new WasmXyzacKinematics(core, { coordinates, ...offsets, limits: Object.fromEntries([...coordinates.toLowerCase()].map((c) => [c, [-100000, 100000]])) }); + for (const [tilt, c] of [[0, 0], [25, 0], [0, 65], [-35, 125], [42, -80], [-80, 270]]) { + const pose = { x: 32, y: 19, z: 28, a: 0, b: 0, c, u: 0, v: 0, w: 0, [coordinates[3].toLowerCase()]: tilt }; + const inverse = native.inverseMode(1, pose); assert.equal(inverse.status, 'verified'); + samples.push({ pose, offsets, joints: inverse.joints }); + } + native.destroy(); + } + const geometry = await page.evaluate(async (samples) => { + const api = await import('/src/imported-machine.ts'); + const model = api.buildImportedMachine(window.glbTestAsset), rows = []; + for (const state of samples) { + model.update(state); + const point = model.workOrigin.position.clone().set(state.pose.x / 1000, state.pose.y / 1000, state.pose.z / 1000); + model.workOrigin.localToWorld(point); + const tip = model.toolTip.getWorldPosition(point.clone()); + const error = point.distanceTo(tip); + if (error > 1e-8) throw new Error(`WASM / GLB mismatch: ${JSON.stringify({ state, point, tip, error })}`); + rows.push({ tilt: state.joints[3], c: state.joints[4], tool_offset: state.offsets.tool_offset, error }); + } + // The two branches are independent: X moves the head but never the cradle. + model.update({ joints: [0, 0, 0, 0, 0], offsets: { tool_offset: 0 } }); + const before = model.joints.rotate.getWorldPosition(model.toolTip.position.clone()); + model.update({ joints: [50, 20, 10, 0, 0], offsets: { tool_offset: 0 } }); + const after = model.joints.rotate.getWorldPosition(before.clone()); + if (before.distanceTo(after) > 1e-10) throw new Error('table moved with XYZ'); + model.dispose(); return rows; + }, samples); + // Confirm the Worker reparses the updated INI and receives every derived geometry value. + const definition = MACHINE_DEFINITIONS.find((m) => m.coordinates === coordinates); + const original = await loadSimulationCase({ path: definition.entrypoint, fetchImpl }); + const config = toWorkerConfiguration(writeTrtGeometry(original, descriptor.structure.offsets)); + config.kinematics.offsets.x_rot_point = 999; + const session = new SimSession(core, { sessionId: `glb-${id}` }); let seq = 0; + const send = (kind, payload = {}) => session.accept({ schema_version: 1, context_id: CONTEXT_ID, session_id: session.sessionId, kind, seq: ++seq, operation_id: `glb-${seq}`, payload }); + send('HELLO'); send('SESSION_ATTACH'); + const loaded = send('LOAD_WORKSPACE', { root_path: '/workspace', configuration: config }); assert.equal(loaded.kind, 'COMMAND_RESULT'); + for (const [key, value] of Object.entries(descriptor.structure.offsets)) assert.ok(Math.abs(loaded.payload.panel_snapshot.kinematics.offsets[key] - value) < 1e-8); + const beforePath = await page.locator('main').getAttribute('data-axis-program-path'); + await control('machine-glb-settings').click(); + await control('machine-glb-file').setInputFiles(new URL(`web/react/public/machines/demo-${id}-xyz-head.glb`, root).pathname); + await settled(); + assert.equal(await machine.getAttribute('data-machine-glb'), descriptor.hash, await page.locator('.machine-import').innerText()); + assert.equal(await machine.getAttribute('data-xyzac-model-id'), `xyz${id}-trt`); + assert.equal(await page.locator('main').getAttribute('data-axis-program-path'), beforePath); + const imported = await sample(); + for (const [key, value] of Object.entries(descriptor.structure.offsets)) assert.ok(Math.abs(imported.offsets[key] - value) < 1e-8); + // Rejected import must leave the live machine and its configuration untouched. + await control('machine-glb-file').setInputFiles({ name: 'broken.glb', mimeType: 'model/gltf-binary', buffer: Buffer.from('not a glb') }); await settled(); + assert.match(await page.locator('.machine-import output').innerText(), /无效/); + assert.equal((await sample()).hash, descriptor.hash); assert.deepEqual((await sample()).offsets, imported.offsets); + await control(`machine-glb-${id}`).click(); await settled(); + assert.equal((await sample()).hash, descriptor.hash); + assert.match(await page.locator('.machine-import output').innerText(), /模型及参数已应用/); + const downloadEvent = page.waitForEvent('download'); await page.getByRole('link', { name: `下载 ${id.toUpperCase()}` }).click(); const download = await downloadEvent; + assert.equal(createHash('sha256').update(await readFile(await download.path())).digest('hex'), descriptor.hash); + await page.locator('.model-dialog .machine-dialog-titlebar button').click(); + await control('toolbar-power').click(); + await page.waitForFunction(() => document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + assert.equal(await control('machine-glb-ac').isDisabled(), true); assert.equal(await control('machine-glb-bc').isDisabled(), true); + await control('manual-home-all').click(); await page.waitForFunction(() => !document.querySelector('[data-axis-control="switchkins-1"]').disabled); + await jog('x', 0, 4); await jog('y', 1, 3); + await control('switchkins-1').click(); await page.waitForFunction(() => document.querySelector('[data-axis-control="switchkins-1"]').getAttribute('aria-pressed') === 'true'); + await rendered(); const start = await sample(); + const target = await page.evaluate(async (state) => { const m = (await import('/src/imported-machine.ts')).buildImportedMachine(window.glbTestAsset); m.update(state); const p = m.workOrigin.worldToLocal(m.toolTip.getWorldPosition(m.toolTip.position.clone())).toArray(); m.dispose(); return p; }, start); + const jogs = []; + for (const axis of [coordinates[3].toLowerCase(), 'c', coordinates[3].toLowerCase(), 'c']) { + const row = await jog(axis, axis === 'c' ? 4 : 3, 2); + assert.ok(row.after.joints.slice(0, 3).some((v, i) => Math.abs(v - row.before.joints[i]) > 1e-6)); + const check = await page.evaluate(async ({ state, target }) => { + const m = (await import('/src/imported-machine.ts')).buildImportedMachine(window.glbTestAsset); m.update(state); + const p = m.workOrigin.localToWorld(m.toolTip.position.clone().fromArray(target)), tip = m.toolTip.getWorldPosition(p.clone()); + const result = { tcp_error: p.distanceTo(tip), render_error: tip.distanceTo(p.fromArray(state.tip)) }; m.dispose(); return result; + }, { state: row.after, target }); + assert.ok(check.tcp_error < 1e-7); assert.ok(check.render_error < 1e-7); + jogs.push({ ...row, ...check }); + } + const pixels = await machine.locator('canvas[data-engine]').evaluate((canvas) => { const gl = canvas.getContext('webgl2'), data = new Uint8Array(canvas.width * canvas.height * 4); gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, data); const colors = new Set(); for (let i = 0; i < data.length; i += 32) colors.add(`${data[i]},${data[i + 1]},${data[i + 2]}`); return { colors: colors.size, width: canvas.width, height: canvas.height }; }); + assert.ok(pixels.colors > 100); + await page.locator('.axis-preview-machine').screenshot({ path: new URL(`${id}-imported.png`, output).pathname }); + await control('toolbar-power').click(); await page.waitForFunction(() => !document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + report.machines.push({ id, hash: descriptor.hash, coordinates, offsets: descriptor.structure.offsets, program_preserved: beforePath, geometry, jogs, pixels, worker_derived_offsets: loaded.payload.panel_snapshot.kinematics.offsets }); + } + for (const [width, height] of [[1440, 1100], [390, 844]]) { + await page.setViewportSize({ width, height }); await page.locator('.machine-import').scrollIntoViewIfNeeded(); + await control('machine-glb-settings').click(); + const bounds = await page.locator('.model-dialog button, .model-dialog a').evaluateAll((nodes) => nodes.map((n) => { const r = n.getBoundingClientRect(); return { x: r.x, right: r.right, width: r.width }; })); + assert.ok(bounds.every((r) => r.width > 0 && r.x >= -1 && r.right <= width + 1)); + await page.screenshot({ path: new URL(`viewport-${width}.png`, output).pathname, fullPage: true }); + report.viewports.push({ width, height, bounds }); + await page.keyboard.press('Escape'); + } + // Reloading a compatible INI updates the effective structure while preserving the imported asset. + const importedHash = await machine.getAttribute('data-machine-glb'); + await control('geometry-settings').click(); + await control('geometry-reload').click(); await settled(); assert.equal(await machine.getAttribute('data-machine-glb'), importedHash); + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (error) { report.status = 'failed'; report.error = String(error.stack ?? error); await page.screenshot({ path: new URL('failure.png', output).pathname, fullPage: true }); throw error; } +finally { report.browser_errors = errors; await writeFile(new URL('browser.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, machines: report.machines.map((m) => ({ id: m.id, geometry_samples: m.geometry.length, jogs: m.jogs.length })), rejected: report.parser.reduce((sum, p) => sum + p.rejected.length, 0) })); diff --git a/scripts/test_glb_machine_motion.mjs b/scripts/test_glb_machine_motion.mjs new file mode 100644 index 0000000..99ca524 --- /dev/null +++ b/scripts/test_glb_machine_motion.mjs @@ -0,0 +1,74 @@ +import assert from 'node:assert/strict'; +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import createModule from '../build-wasm/linuxcnc-sim-core.js'; +import { SimSession, CONTEXT_ID } from '../web/worker/sim-session.mjs'; +import { loadSimulationCase, toWorkerConfiguration } from '../web/workspace/sim-case-loader.mjs'; +import { writeTrtGeometry } from '../web/workspace/trt-geometry.mjs'; +import { MACHINE_DEFINITIONS } from '../web/workspace/machine-definitions.mjs'; +const root = new URL('../', import.meta.url), output = process.env.GLB_EVIDENCE_DIR ? pathToFileURL(`${process.env.GLB_EVIDENCE_DIR.replace(/\/$/, '')}/`) : new URL('coverage/glb-machine/', root); +const gantry = process.env.GLB_MACHINE_VARIANT === 'gantry'; +const fetchImpl = async (url) => { try { const body = await readFile(new URL(String(url).replace(/^\//, ''), root), 'utf8'); return { ok: true, text: async () => body }; } catch { return { ok: false }; } }; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage(); +const report = { report_id: 'glb-machine-five-axis-motion-v1', status: 'running', machines: [] }; +try { + await page.goto(process.env.XYZAC_PANEL_URL ?? 'http://127.0.0.1:5174/'); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + for (const definition of MACHINE_DEFINITIONS) { + const id = definition.coordinates.slice(3).toLowerCase(); + const structure = await page.evaluate(async ({ id, gantry }) => { + const api = await import('/src/imported-machine.ts'); + if (window.motionAsset) api.disposeMachineScene(window.motionAsset.scene); + window.motionAsset = await api.loadImportedMachine(await (await fetch(`/machines/demo-${id}-${gantry ? 'gantry' : 'xyz-head'}.glb`)).arrayBuffer(), `${id}.glb`); + return window.motionAsset.structure; + }, { id, gantry }); + const core = await createModule({ wasmBinary: await readFile(new URL('build-wasm/linuxcnc-sim-core.wasm', root)) }); + const session = new SimSession(core, { sessionId: `glb-motion-${id}` }); let seq = 0; + const send = (kind, payload = {}) => { + const result = session.accept({ schema_version: 1, context_id: CONTEXT_ID, session_id: session.sessionId, kind, seq: ++seq, operation_id: `motion-${seq}`, payload }); + assert.notEqual(result.kind, 'ERROR', `${kind}: ${JSON.stringify(result.payload)}`); return result; + }; + send('HELLO'); send('SESSION_ATTACH'); + const bundle = writeTrtGeometry(await loadSimulationCase({ path: definition.entrypoint, fetchImpl }), structure.offsets); + send('LOAD_WORKSPACE', { root_path: '/workspace', configuration: toWorkerConfiguration(bundle) }); + const tilt = definition.coordinates[3]; + const source = `G21 G90 G94\nG0 X20 Y10 Z20 ${tilt}0 C0\nM428\nG1 X35 Y24 Z32 ${tilt}25 C40 F900\nG1 X24 Y16 Z24 ${tilt}-20 C-30 F900\nM2\n`; + send('PROGRAM_LOAD', { source, path: `five-axis-${id}.ngc` }); + send('POWER', { active: true }); send('HOME', { all: true }); + for (let tick = 0; tick < 500 && !session.wasmHomeLimit.read().state.homed; tick++) send('SIM_STEP', { cycles: 1 }); + assert.equal(session.wasmHomeLimit.read().state.homed, true); + send('PROGRAM_RUN'); + const samples = []; let simultaneousTicks = 0, previous, result; + for (let tick = 0; tick < 3000; tick++) { + result = send('SIM_STEP', { cycles: 10 }); + const panel = result.payload.panel_snapshot; + const joints = panel.visual.joints; + if (panel.kinematics.active_type === 1 && joints?.length === 5) { + if (previous && joints.every((v, i) => Math.abs(v - previous[i]) > 1e-8)) simultaneousTicks++; + samples.push({ tick: result.simulation_tick, pose: panel.visual.pose, joints, offsets: panel.kinematics.offsets }); + previous = joints; + } + if (result.payload.program.program_status === 'completed' && result.payload.wasm_motion.state.queue_depth === 0) break; + } + assert.equal(result.payload.program.program_status, 'completed'); + assert.ok(simultaneousTicks > 10, `only ${simultaneousTicks} simultaneously moving ticks`); + assert.ok(samples.length > 10); + const projection = await page.evaluate(async (samples) => { + const model = (await import('/src/imported-machine.ts')).buildImportedMachine(window.motionAsset); + let maxError = 0; + for (const sample of samples) { + model.update(sample); + const point = model.workOrigin.localToWorld(model.toolTip.position.clone().set(sample.pose.x / 1000, sample.pose.y / 1000, sample.pose.z / 1000)); + const tip = model.toolTip.getWorldPosition(point.clone()); maxError = Math.max(maxError, point.distanceTo(tip)); + } + model.dispose(); return { samples: samples.length, max_error_view_units: maxError }; + }, samples); + assert.ok(projection.max_error_view_units < 1e-7, JSON.stringify(projection)); + report.machines.push({ coordinates: structure.coordinates, source, simultaneous_ticks: simultaneousTicks, ...projection, trajectory: samples }); + } + report.status = 'verified'; +} catch (error) { report.status = 'failed'; report.error = String(error.stack ?? error); throw error; } +finally { await writeFile(new URL('motion.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, machines: report.machines.map(({ coordinates, simultaneous_ticks, samples, max_error_view_units }) => ({ coordinates, simultaneous_ticks, samples, max_error_view_units })) })); diff --git a/scripts/test_imported_geometry_browser.mjs b/scripts/test_imported_geometry_browser.mjs new file mode 100644 index 0000000..88ffc0a --- /dev/null +++ b/scripts/test_imported_geometry_browser.mjs @@ -0,0 +1,132 @@ +import assert from 'node:assert/strict'; +import { readFile, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +import createModule from '../build-wasm/linuxcnc-sim-core.js'; +import { WasmXyzacKinematics } from '../web/worker/wasm-xyzac-kinematics.mjs'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const root = new URL('../', import.meta.url), output = process.env.GLB_EVIDENCE_DIR ? pathToFileURL(`${process.env.GLB_EVIDENCE_DIR.replace(/\/$/, '')}/`) : new URL('coverage/glb-machine/geometry-edit/', root); +const gantry = process.env.GLB_MACHINE_VARIANT === 'gantry'; +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +await page.addInitScript(() => { window.showSaveFilePicker = undefined; }); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const settled = () => page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false' && document.querySelector('.trt-geometry')?.getAttribute('aria-busy') === 'false'); +const machine = page.locator('.xyzac-machine-view'); +const snapshot = () => machine.evaluate((e) => ({ hash: e.dataset.machineGlb, filename: e.dataset.xyzacModelSourcePath, offsets: JSON.parse(e.dataset.xyzacOffsets), joints: JSON.parse(e.dataset.xyzacJoints), tip: JSON.parse(e.dataset.xyzacToolTip) })); +const report = { report_id: 'imported-geometry-browser-v1', status: 'running', machines: [] }; +try { + await page.goto('http://127.0.0.1:5174/'); await settled(); + for (const id of ['ac', 'bc']) { + await control('machine-glb-settings').click(); await control('machine-glb-file').setInputFiles(new URL(`web/react/public/machines/demo-${id}-${gantry ? 'gantry' : 'xyz-head'}.glb`, root).pathname); await settled(); + await page.keyboard.press('Escape'); + const original = await snapshot(), beforePath = await page.locator('main').getAttribute('data-axis-program-path'); + assert.ok(original.hash); + await control('geometry-settings').click(); + const edits = { x_rot_point: 31, y_rot_point: -9, z_rot_point: 15, x_offset: id === 'bc' ? 27 : 0, y_offset: id === 'ac' ? 23 : 0, z_offset: -34 }; + for (const [key, value] of Object.entries(edits)) if (key !== (id === 'ac' ? 'x_offset' : 'y_offset')) await page.getByLabel(key.replaceAll('_', '-'), { exact: true }).fill(String(value)); + await control('geometry-apply').click(); await settled(); + const applied = await snapshot(); + assert.equal(applied.hash, original.hash, 'applying geometry must retain imported GLB'); + assert.equal(applied.filename, original.filename); + for (const [key, value] of Object.entries(edits)) assert.ok(Math.abs(applied.offsets[key] - value) < 1e-8); + assert.equal(await page.locator('main').getAttribute('data-axis-program-path'), beforePath); + const downloadEvent = page.waitForEvent('download'); await control('geometry-save').click(); const exported = await readFile(await (await downloadEvent).path(), 'utf8'); + assert.match(exported, /x-rot-point\s+31/); + await page.keyboard.press('Escape'); + await control('machine-glb-settings').click(); + if (!(await page.locator('[data-machine-structure]').evaluate((e) => e.open))) await page.locator('[data-machine-structure] summary').click(); + const details = await page.locator('[data-machine-structure]').innerText(); assert.match(details, /31\.000 \/ -9\.000 \/ 15\.000/); assert.match(details, /-34\.000/); + await page.keyboard.press('Escape'); + await page.locator('.axis-preview-machine').screenshot({ path: new URL(`${id}-edited.png`, output).pathname }); + // Exercise the actual imported hierarchy with native IK at the edited offsets. + const core = await createModule({ wasmBinary: await readFile(new URL('build-wasm/linuxcnc-sim-core.wasm', root)) }); + const samples = [], coordinates = `XYZ${id.toUpperCase()}`; + for (const tool_offset of [0, 17, -4]) { + const offsets = { ...edits, tool_offset }; + const native = new WasmXyzacKinematics(core, { coordinates, ...offsets, limits: Object.fromEntries([...coordinates.toLowerCase()].map((a) => [a, [-100000, 100000]])) }); + for (const [tilt, c] of [[0, 0], [25, 0], [0, 65], [-35, 125], [42, -80], [-80, 270]]) { + const pose = { x: 32, y: 19, z: 28, a: 0, b: 0, c, u: 0, v: 0, w: 0, [id[0]]: tilt }; + const inverse = native.inverseMode(1, pose); assert.equal(inverse.status, 'verified'); samples.push({ pose, joints: inverse.joints, offsets }); + } + native.destroy(); + } + const projection = await page.evaluate(async ({ id, edits, samples, gantry }) => { + const api = await import('/src/imported-machine.ts'); + const geometry = await import('/workspace/trt-geometry.mjs'); + const loader = await import('/workspace/sim-case-loader.mjs'); + const parser = await import('/src/machine-urdf.ts'); + const asset = await api.loadImportedMachine(await (await fetch(`/machines/demo-${id}-${gantry ? 'gantry' : 'xyz-head'}.glb`)).arrayBuffer(), `${id}.glb`); + const originalUrdf = asset.structure.urdf; + const bundle = await loader.loadSimulationCase({ path: `linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyz${id}-trt.ini`, baseUrl: '.' }); + const adjusted = api.updateImportedMachineGeometry(asset, geometry.writeTrtGeometry(bundle, edits)); + if (asset.scene !== adjusted.scene || asset.hash !== adjusted.hash || asset.structure.urdf !== originalUrdf) throw new Error('source asset changed'); + const parsed = parser.parseMachineUrdf(adjusted.structure.urdf); + for (const [key, value] of Object.entries(edits)) if (Math.abs(parsed.offsets[key] - value) > 1e-8) throw new Error(`URDF drift ${key}`); + const model = api.buildImportedMachine(adjusted); + const meshes = []; model.machine.traverse((n) => { if (n.isMesh) meshes.push(n.name); }); + if (!meshes.some((name) => name.startsWith(gantry ? 'gantry_post_' : 'portal_column_'))) throw new Error('original mesh lost'); + const checks = []; + for (const state of samples) { + model.update(state); + const point = model.workOrigin.localToWorld(model.toolTip.position.clone().set(state.pose.x / 1000, state.pose.y / 1000, state.pose.z / 1000)); + const tip = model.toolTip.getWorldPosition(point.clone()); const error = tip.distanceTo(point); + if (error > 1e-8) throw new Error(`IK/model mismatch ${error}`); checks.push(error); + } + const renamed = structuredClone(asset.structure); + renamed.urdf = renamed.urdf.replaceAll('tilt_joint', 'custom_tilt').replaceAll('c_joint', 'custom_spin').replaceAll('work_mount', 'custom_work'); + renamed.joints = parser.parseMachineUrdf(renamed.urdf).joints; + const custom = api.updateImportedMachineGeometry({ ...asset, structure: renamed }, geometry.writeTrtGeometry(bundle, edits)); + if (!custom.structure.joints.some((j) => j.name === 'custom_tilt')) throw new Error('relies on fixture joint names'); + let mismatch = false; + const other = await loader.loadSimulationCase({ path: `linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyz${id === 'ac' ? 'bc' : 'ac'}-trt.ini`, baseUrl: '.' }); + try { api.updateImportedMachineGeometry(asset, other); } catch { mismatch = true; } + if (!mismatch) throw new Error('incompatible machine not rejected'); + const repeat = api.updateImportedMachineGeometry(adjusted, geometry.writeTrtGeometry(bundle, edits)); + if (repeat !== adjusted) throw new Error('unchanged geometry should reuse asset'); + model.dispose(); api.disposeMachineScene(asset.scene); + return { checks, mesh_count: meshes.length, source_preserved: true, renamed_joint_supported: true, incompatible_rejected: true }; + }, { id, edits, samples, gantry }); + await control('geometry-settings').click(); + // Bad numeric input must leave the successfully applied model and parameters intact. + await page.getByLabel('x-rot-point', { exact: true }).fill(''); await control('geometry-apply').click(); await settled(); + assert.match(await page.locator('.trt-geometry footer output').innerText(), /trt_geometry_number/); + assert.equal((await snapshot()).hash, original.hash); assert.deepEqual((await snapshot()).offsets, applied.offsets); + // Reload the INI, then re-import the saved INI: both preserve the model. + await control('geometry-reload').click(); await settled(); assert.equal((await snapshot()).hash, original.hash); + await page.locator('.trt-geometry input[type="file"]').setInputFiles({ name: `xyz${id}-trt.ini`, mimeType: 'text/plain', buffer: Buffer.from(exported) }); + await page.waitForFunction(() => document.querySelector('input[aria-label="x-rot-point"]').value === '31'); + await control('geometry-apply').click(); await settled(); assert.equal((await snapshot()).hash, original.hash); + assert.deepEqual((await snapshot()).offsets, applied.offsets); + await page.keyboard.press('Escape'); + await control('toolbar-power').click(); await control('manual-home-all').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="switchkins-1"]').disabled); + await control('switchkins-1').click(); + await control('tab-manual').click(); await control(`manual-axis-${id[0]}`).check(); + const beforeJog = await snapshot(), b = await control('manual-jog-positive').boundingBox(); + await page.mouse.move(b.x + b.width / 2, b.y + b.height / 2); await page.mouse.down(); + try { await page.waitForFunction((initial) => JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[3] > initial + 2, beforeJog.joints[3]); } finally { await page.mouse.up(); } + await page.waitForFunction(() => document.querySelector('.command-status')?.textContent?.includes('JOG_STOP acknowledged')); + await page.waitForFunction(() => { const e = document.querySelector('.xyzac-machine-view'); return e.dataset.xyzacTick === e.dataset.xyzacRenderedTick; }); + const afterJog = await snapshot(); assert.ok(afterJog.joints.slice(0, 3).some((v, i) => Math.abs(v - beforeJog.joints[i]) > 1e-5)); + const tcpError = await page.evaluate(async ({ id, edits, beforeJog, afterJog, gantry }) => { + const api = await import('/src/imported-machine.ts'), loader = await import('/workspace/sim-case-loader.mjs'), geometry = await import('/workspace/trt-geometry.mjs'); + const asset = await api.loadImportedMachine(await (await fetch(`/machines/demo-${id}-${gantry ? 'gantry' : 'xyz-head'}.glb`)).arrayBuffer(), id); + const bundle = await loader.loadSimulationCase({ path: `linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyz${id}-trt.ini`, baseUrl: '.' }); + const model = api.buildImportedMachine(api.updateImportedMachineGeometry(asset, geometry.writeTrtGeometry(bundle, edits))); + model.update(beforeJog); const target = model.workOrigin.worldToLocal(model.toolTip.getWorldPosition(model.toolTip.position.clone())); + model.update(afterJog); const tip = model.toolTip.getWorldPosition(target.clone()), point = model.workOrigin.localToWorld(target.clone()); + const error = tip.distanceTo(point), rendered = tip.distanceTo(point.fromArray(afterJog.tip)); + model.dispose(); api.disposeMachineScene(asset.scene); return { error, rendered }; + }, { id, edits, beforeJog, afterJog, gantry }); + assert.ok(tcpError.error < 1e-8 && tcpError.rendered < 1e-8); + await control('geometry-settings').click(); assert.ok(await page.getByLabel('x-rot-point', { exact: true }).isDisabled()); await page.keyboard.press('Escape'); + await control('toolbar-power').click(); await page.waitForFunction(() => !document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + report.machines.push({ id, original, applied, edits, projection, tcpError, model_retained_on_reload_and_ini_import: true }); + } + // Deliberately selecting a different machine still discards an incompatible GLB. + await control('machine-type-select').selectOption({ label: 'XYZAC TRT' }); await settled(); assert.equal((await snapshot()).hash, ''); + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (e) { report.status = 'failed'; report.error = String(e.stack ?? e); await page.screenshot({ path: new URL('failure.png', output).pathname }); throw e; } +finally { report.browser_errors = errors; await writeFile(new URL('browser.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, machines: report.machines.map((m) => ({ id: m.id, pose_samples: m.projection.checks.length, tcpError: m.tcpError })) })); diff --git a/scripts/test_jog_limit_browser.mjs b/scripts/test_jog_limit_browser.mjs new file mode 100644 index 0000000..527a061 --- /dev/null +++ b/scripts/test_jog_limit_browser.mjs @@ -0,0 +1,89 @@ +import assert from 'node:assert/strict'; +import { writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const output = new URL('../coverage/glb-machine/jog-limits/', import.meta.url); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +await page.addInitScript(() => { + window.jogErrors = []; + const OriginalWorker = window.Worker; + window.Worker = class extends OriginalWorker { + constructor(...args) { + super(...args); + this.addEventListener('message', ({ data }) => { + if (data.kind === 'ERROR') window.jogErrors.push({ seq: data.seq, ...data.payload }); + window.jogLastResponse = data; + }); + } + }; +}); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const sample = () => page.locator('.xyzac-machine-view').evaluate((e) => ({ joints: JSON.parse(e.dataset.xyzacJoints), tip: JSON.parse(e.dataset.xyzacToolTip), tick: Number(e.dataset.xyzacTick) })); +const queueEmpty = () => page.waitForFunction(() => window.jogLastResponse?.payload?.wasm_motion?.state?.queue_depth === 0 || window.jogLastResponse?.payload?.panel_snapshot?.wasm_motion?.state?.queue_depth === 0); +async function seed(block, angle) { + await control('tab-mdi').click(); await control('mdi-command').fill(block); await control('mdi-submit').click(); + await page.waitForFunction((angle) => Math.abs(JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[3] - angle) < 1e-7, angle); + await queueEmpty(); await control('tab-manual').click(); +} +async function hold(axis, direction, until) { + await control(`manual-axis-${axis}`).check(); + const box = await control(direction > 0 ? 'manual-jog-positive' : 'manual-jog-negative').boundingBox(); + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); await page.mouse.down(); + try { await until(); } + finally { await page.mouse.up(); } + await page.waitForFunction(() => document.querySelector('.command-status')?.textContent?.includes('JOG_STOP acknowledged')); +} +const report = { report_id: 'jog-limit-browser-v1', status: 'running', machines: [] }; +try { + await page.goto('http://127.0.0.1:5174/'); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + for (const id of ['ac', 'bc']) { + await control('machine-glb-settings').click(); await control(`machine-glb-${id}`).click(); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); await page.keyboard.press('Escape'); + await control('toolbar-power').click(); await control('manual-home-all').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="switchkins-1"]').disabled); + const axis = id[0]; + await seed(`G21 G90 G0 X0 Y0 Z30 ${axis.toUpperCase()}49 C20`, 49); + await hold(axis, 1, async () => { + await page.waitForFunction(() => Math.abs(JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[3] - 50) < 1e-7); + await queueEmpty(); + }); + const atLimit = await sample(); assert.ok(atLimit.joints[3] <= 50 + 1e-8); + await hold(axis, -1, () => page.waitForFunction(() => JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[3] < 49)); + const retreat = await sample(); assert.ok(retreat.joints[3] < atLimit.joints[3]); + await seed(`G90 G0 X190 Y0 Z30 ${axis.toUpperCase()}0 C0`, 0); + await control('switchkins-1').click(); + const count = await page.evaluate(() => window.jogErrors.length); + await hold('c', 1, () => page.waitForFunction((count) => window.jogErrors.length > count, count)); + const fault = await page.evaluate((count) => window.jogErrors[count], count); + assert.equal(fault.code, 'motion_limit'); assert.equal(fault.reason, 'motion_joint_limit'); + await queueEmpty(); const stopped = await sample(); + assert.ok(stopped.joints[1] <= 100 + 1e-7); + await page.waitForTimeout(150); assert.deepEqual((await sample()).joints, stopped.joints); + await hold('c', -1, () => page.waitForFunction((c) => JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[4] < c - 1, stopped.joints[4])); + const resumed = await sample(); assert.ok(resumed.joints[4] < stopped.joints[4]); + for (let i = 0; i < 4; i++) { + const before = await sample(), dir = i % 2 ? -1 : 1; + await hold('c', dir, () => page.waitForFunction(({ c, dir }) => (JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[4] - c) * dir > .2, { c: before.joints[4], dir })); + } + assert.doesNotMatch(await page.locator('.axis-window-header').innerText(), /ERROR/); + const pixels = await page.locator('.xyzac-machine-view canvas').evaluate((canvas) => { + const gl = canvas.getContext('webgl2'), bytes = new Uint8Array(canvas.width * canvas.height * 4), colors = new Set(); + gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, bytes); + for (let i = 0; i < bytes.length; i += 32) colors.add(`${bytes[i]},${bytes[i + 1]},${bytes[i + 2]}`); + return colors.size; + }); + assert.ok(pixels > 100); assert.notDeepEqual(resumed.tip, stopped.tip); + await page.screenshot({ path: new URL(`${id}-recovered.png`, output).pathname }); + await control('toolbar-power').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + report.machines.push({ id, atLimit, retreat, stopped, resumed, fault: { code: fault.code, reason: fault.reason }, pixels }); + } + const faults = await page.evaluate(() => window.jogErrors.map((e) => ({ code: e.code, reason: e.reason }))); + assert.ok(faults.every((e) => e.code === 'motion_limit'), JSON.stringify(faults)); + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (e) { report.status = 'failed'; report.error = String(e.stack ?? e); await page.screenshot({ path: new URL('failure.png', output).pathname }); throw e; } +finally { report.page_errors = errors; await writeFile(new URL('browser.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, machines: report.machines.map((m) => m.id) })); diff --git a/scripts/test_machine_dialog_browser.mjs b/scripts/test_machine_dialog_browser.mjs new file mode 100644 index 0000000..2857aae --- /dev/null +++ b/scripts/test_machine_dialog_browser.mjs @@ -0,0 +1,91 @@ +import assert from 'node:assert/strict'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const output = new URL('../coverage/glb-machine/dialogs/', import.meta.url); await mkdir(output, { recursive: true }); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 900 } }); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const settled = () => page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); +const report = { report_id: 'machine-dialog-browser-v1', status: 'running', layouts: [], dialogs: [] }; +const bounds = (selector) => page.locator(selector).boundingBox(); +async function drag(dialog, dx, dy) { + const title = await page.locator(`${dialog} .machine-dialog-titlebar strong`).boundingBox(); + await page.mouse.move(title.x + 15, title.y + title.height / 2); await page.mouse.down(); + await page.mouse.move(title.x + 15 + dx, title.y + title.height / 2 + dy, { steps: 8 }); await page.mouse.up(); +} +async function within(selector) { + const b = await bounds(selector); const viewport = page.viewportSize(); + assert.ok(b.x >= 7 && b.y >= 7 && b.x + b.width <= viewport.width - 7 && b.y + b.height <= viewport.height - 7, JSON.stringify({ b, viewport })); + return b; +} +try { + await page.goto('http://127.0.0.1:5174/'); await settled(); + assert.equal(await page.locator('dialog[open]').count(), 0); + await control('machine-glb-settings').click(); + await control('machine-glb-bc').click(); await settled(); + assert.ok(await page.locator('.xyzac-machine-view').getAttribute('data-machine-glb')); + await page.keyboard.press('Escape'); + assert.equal(await page.locator('dialog[open]').count(), 0); + assert.equal(await control('machine-glb-settings').evaluate((e) => e === document.activeElement), true); + for (const [button, selector] of [['machine-glb-settings', '.model-dialog'], ['geometry-settings', '.geometry-dialog']]) { + const canvasBefore = await bounds('.xyzac-machine-view canvas'); + await control(button).click(); + const before = await within(selector); + await drag(selector, 110, 60); const after = await within(selector); + assert.ok(Math.abs(after.x - before.x - 110) < 2 && Math.abs(after.y - before.y - 60) < 2); + assert.deepEqual(await bounds('.xyzac-machine-view canvas'), canvasBefore); + await page.keyboard.press('F2'); + assert.equal(await control('machine-glb-import').isDisabled(), false, 'dialog key must not power on the machine'); + for (let i = 0; i < 12; i++) { await page.keyboard.press('Tab'); assert.ok(await page.locator(selector).evaluate((e) => e.contains(document.activeElement))); } + await drag(selector, -2000, -2000); await within(selector); + await drag(selector, 4000, 4000); await within(selector); + await page.screenshot({ path: new URL(`${button}-dragged.png`, output).pathname }); + await page.keyboard.press('Escape'); assert.equal(await page.locator('dialog[open]').count(), 0); + assert.equal(await control(button).evaluate((e) => e === document.activeElement), true); + report.dialogs.push({ button, before, after, focus_contained: true, keyboard_ignored: true, edge_clamped: true }); + } + await control('geometry-settings').click(); await page.getByLabel('x-rot-point', { exact: true }).fill('31'); + await page.keyboard.press('Escape'); await control('geometry-settings').click(); + assert.equal(await page.getByLabel('x-rot-point', { exact: true }).inputValue(), '31'); + await page.keyboard.press('Escape'); + await control('toolbar-power').click(); + await page.waitForFunction(() => document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + await control('geometry-settings').click(); assert.ok(await page.getByLabel('x-rot-point', { exact: true }).isDisabled()); await page.keyboard.press('Escape'); + await control('toolbar-power').click(); + for (const [width, height] of [[2048, 859], [1440, 900], [390, 844]]) { + await page.setViewportSize({ width, height }); + await page.locator('.xyzac-machine-view').scrollIntoViewIfNeeded(); + await page.waitForTimeout(150); + const machine = await bounds('.xyzac-machine-view'), path = await bounds('.axis-preview-toolpath'), pane = await bounds('.axis-preview-machine'); + assert.ok(machine.height >= 250, JSON.stringify(machine)); + assert.ok(machine.height / pane.height > .85, JSON.stringify({ machine, pane })); + if (width > 900) assert.ok(path.height - machine.height < 50, JSON.stringify({ machine, path })); + await page.locator('.axis-preview-machine').screenshot({ path: new URL(`preview-${width}.png`, output).pathname }); + await control('geometry-settings').click(); await within('.geometry-dialog'); + await page.screenshot({ path: new URL(`parameters-${width}.png`, output).pathname }); + const fields = await page.locator('.geometry-dialog input:not([hidden])').evaluateAll((nodes) => nodes.map((e) => { const r = e.getBoundingClientRect(); return { x: r.x, right: r.right }; })); + assert.ok(fields.every((r) => r.x >= 0 && r.right <= width)); + await page.keyboard.press('Escape'); + await control('machine-glb-settings').click(); await within('.model-dialog'); + if (width === 390) { + const cdp = await page.context().newCDPSession(page); + const b = await bounds('.model-dialog .machine-dialog-titlebar strong'); + const before = await bounds('.model-dialog'); + await cdp.send('Input.dispatchTouchEvent', { type: 'touchStart', touchPoints: [{ x: b.x + 10, y: b.y + 8 }] }); + await cdp.send('Input.dispatchTouchEvent', { type: 'touchMove', touchPoints: [{ x: b.x + 10, y: b.y + 58 }] }); + await cdp.send('Input.dispatchTouchEvent', { type: 'touchEnd', touchPoints: [] }); + const after = await within('.model-dialog'); assert.ok(after.y - before.y > 30); + report.touch_drag = { before, after }; + } + await page.keyboard.press('Escape'); + report.layouts.push({ width, height, machine, path, pane }); + } + await page.setViewportSize({ width: 1440, height: 900 }); await control('geometry-settings').click(); await drag('.geometry-dialog', 150, 160); + await page.setViewportSize({ width: 390, height: 500 }); await page.waitForTimeout(150); await within('.geometry-dialog'); + await page.keyboard.press('Escape'); + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (e) { report.status = 'failed'; report.error = String(e.stack ?? e); await page.screenshot({ path: new URL('failure.png', output).pathname }); throw e; } +finally { report.browser_errors = errors; await writeFile(new URL('dialog.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, layouts: report.layouts.map(({ width, machine }) => ({ width, canvas_height: machine.height })) })); diff --git a/scripts/test_machine_manager_browser.mjs b/scripts/test_machine_manager_browser.mjs new file mode 100644 index 0000000..cafe710 --- /dev/null +++ b/scripts/test_machine_manager_browser.mjs @@ -0,0 +1,98 @@ +import assert from "node:assert/strict"; +import { pathToFileURL } from "node:url"; +import { mkdir, writeFile } from "node:fs/promises"; +import * as THREE from "../web/react/node_modules/three/build/three.module.js"; +import { GLTFExporter } from "../web/react/node_modules/three/examples/jsm/exporters/GLTFExporter.js"; + +globalThis.FileReader = class { + readAsArrayBuffer(blob) { blob.arrayBuffer().then((result) => { this.result = result; this.onloadend?.(); }); } + readAsDataURL(blob) { blob.arrayBuffer().then((result) => { this.result = `data:${blob.type};base64,${Buffer.from(result).toString("base64")}`; this.onloadend?.(); }); } +}; +const partGlb = async (index) => { + const scene = new THREE.Scene(); scene.name = `part_${index}`; + const mesh = new THREE.Mesh(new THREE.BoxGeometry(.08 + index * .004, .06, .05), new THREE.MeshStandardMaterial({ color: new THREE.Color().setHSL(index / 8, .55, .5) })); mesh.name = `mesh_${index}`; scene.add(mesh); + const bytes = await new GLTFExporter().parseAsync(scene, { binary: true, trs: true, onlyVisible: false }); mesh.geometry.dispose(); mesh.material.dispose(); return Buffer.from(bytes); +}; +const fixtures = await Promise.all(Array.from({ length: 8 }, async (_, index) => ({ name: `${String(index + 1).padStart(2, "0")}-part.glb`, mimeType: "model/gltf-binary", buffer: await partGlb(index) }))); +const modulePath = process.env.PLAYWRIGHT_MODULE; +if (!modulePath) { console.log(JSON.stringify({ schema: "machine-manager-browser.v1", status: "blocked", code: "playwright_unavailable" })); process.exit(0); } +const imported = await import(pathToFileURL(modulePath).href); const playwright = imported.default ?? imported; +const output = new URL("../coverage/glb-machine-manager/", import.meta.url); await mkdir(output, { recursive: true }); +const browser = await playwright.chromium.launch({ headless: true, executablePath: process.env.BROWSER_EXECUTABLE_PATH ?? "/usr/bin/google-chrome", args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader"] }); +const page = await browser.newPage({ viewport: { width: 1600, height: 1050 } }); const errors = []; +page.on("pageerror", (error) => errors.push(`pageerror:${error.message}`)); page.on("console", (message) => { if (message.type() === "error") errors.push(`console:${message.text()}`); }); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); const main = page.locator("main.axis-app"); +const production = process.env.MACHINE_MANAGER_SOURCE_MODULES === "0"; +const report = { schema: "machine-manager-browser.v1", report_id: production ? "GLB-MGR-E02" : "GLB-MGR-E01", mode: production ? "production-preview" : "development-source", status: "running", checks: [] }; +try { + await page.goto(process.env.MACHINE_MANAGER_URL ?? "http://127.0.0.1:5174/", { waitUntil: "domcontentloaded", timeout: 30000 }); + await page.waitForFunction(() => document.querySelector("main.axis-app")?.dataset.axisProgramLoading === "false" && document.querySelector("main.axis-app")?.dataset.axisStateSource === "linuxcnc-wasm", null, { timeout: 45000 }); + await control("machine-manager-settings").click(); assert.equal(await page.locator(".machine-manager-dialog[open]").count(), 1); assert.equal(await page.locator("[data-machine-manager-preview] canvas").count(), 1); + await control("machine-manager-files").setInputFiles(fixtures); + await page.waitForFunction(() => document.querySelector("[data-machine-manager-preview]")?.dataset.machineManagerPartCount === "8"); + assert.equal(await page.locator(".machine-part-list > div").count(), 8); assert.equal(await page.locator("[data-machine-manager-preview]").getAttribute("data-machine-manager-origin-count"), "8"); + report.checks.push("eight GLB parts imported and rendered in the Three.js editor"); + + await control("machine-manager-show-origin").uncheck(); assert.equal(await page.locator("[data-machine-manager-preview]").getAttribute("data-machine-manager-origin-count"), "7"); + const translation = page.locator("fieldset.machine-vector").filter({ hasText: "部件平移" }); await translation.getByLabel("X", { exact: true }).fill("10"); + const rotation = page.locator("fieldset.machine-vector").filter({ hasText: "部件旋转" }); await rotation.getByLabel("Z", { exact: true }).fill("15"); + await control("machine-manager-rotate").click(); assert.equal(await page.locator("[data-machine-manager-preview]").getAttribute("data-transform-mode"), "rotate"); + await page.locator(".machine-manager-dialog").screenshot({ path: new URL("manager-ac-config.png", output).pathname }); + report.checks.push("origin visibility, numeric translation/rotation and TransformControls mode update"); + + const calibrations = page.locator(".machine-manager-calibration fieldset.machine-vector"); + const cOrigin = calibrations.filter({ hasText: "C 轴原点" }); await cOrigin.getByLabel("X", { exact: true }).fill("24"); await cOrigin.getByLabel("Y", { exact: true }).fill("-12"); await cOrigin.getByLabel("Z", { exact: true }).fill("8"); + const offset = calibrations.filter({ hasText: "A 到 C 轴偏置" }); await offset.getByLabel("X", { exact: true }).fill("0"); await offset.getByLabel("Y", { exact: true }).fill("18"); await offset.getByLabel("Z", { exact: true }).fill("-45"); + const zeros = page.locator("fieldset.machine-zero"); await zeros.getByLabel("X", { exact: true }).fill("5"); await zeros.getByLabel("A", { exact: true }).fill("10"); await zeros.getByLabel("C", { exact: true }).fill("20"); + assert.equal(await control("machine-manager-export").isDisabled(), false); const downloadPromise = page.waitForEvent("download"); await control("machine-manager-export").click(); const download = await downloadPromise; assert.equal(download.suggestedFilename(), "managed-xyzac.glb"); + report.checks.push("validated assembly exports a self-contained managed GLB"); + assert.equal(await control("machine-manager-apply").isDisabled(), false); await control("machine-manager-apply").click(); + await page.waitForFunction(() => document.querySelector(".xyzac-machine-view")?.dataset.machineManagerSchema === "linuxcnc.machine-manager/1" && document.querySelector("main.axis-app")?.dataset.axisProgramLoading === "false", null, { timeout: 45000 }); + const geometry = JSON.parse(await page.locator(".xyzac-machine-view").getAttribute("data-machine-manager-geometry")); + assert.deepEqual(geometry.cOriginMm, [24, -12, 8]); assert.deepEqual(geometry.tiltOffsetMm, [0, 18, -45]); assert.equal(geometry.physicalZero.x, 5); assert.equal(geometry.physicalZero.a, 10); assert.equal(geometry.physicalZero.c, 20); assert.equal(geometry.parts.length, 8); assert.equal(geometry.parts[0].translationMm[0], 10); + assert.match(await page.locator(".xyzac-machine-view").getAttribute("data-xyzac-model-source-path"), /^managed-xyzac\.glb$/); + report.checks.push("validated hierarchy applied through LOAD_WORKSPACE with geometry and physical zero in userData"); + + await page.keyboard.press("Escape"); + const xyzbcCase = "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini"; await control("workspace-case-select").selectOption(xyzbcCase); + await page.waitForFunction((path) => document.querySelector('[data-axis-control="workspace-case-select"]')?.value === path && document.querySelector("main.axis-app")?.dataset.axisProgramLoading === "false", xyzbcCase, { timeout: 45000 }); + await control("machine-manager-settings").click(); assert.match(await page.locator(".machine-manager-dialog .machine-dialog-titlebar").textContent(), /XYZBC/); + const bcCalibrations = page.locator(".machine-manager-calibration fieldset.machine-vector"); const bcOrigin = bcCalibrations.filter({ hasText: "C 轴原点" }); await bcOrigin.getByLabel("X", { exact: true }).fill("-18"); await bcOrigin.getByLabel("Y", { exact: true }).fill("14"); await bcOrigin.getByLabel("Z", { exact: true }).fill("12"); + const bcOffset = bcCalibrations.filter({ hasText: "B 到 C 轴偏置" }); await bcOffset.getByLabel("X", { exact: true }).fill("22"); await bcOffset.getByLabel("Y", { exact: true }).fill("0"); await bcOffset.getByLabel("Z", { exact: true }).fill("-40"); + const bcZeros = page.locator("fieldset.machine-zero"); await bcZeros.getByLabel("B", { exact: true }).fill("12"); await bcZeros.getByLabel("C", { exact: true }).fill("5"); await control("machine-manager-apply").click(); + await page.waitForFunction(() => { const view = document.querySelector(".xyzac-machine-view"); if (view?.dataset.machineManagerSchema !== "linuxcnc.machine-manager/1") return false; try { return JSON.parse(view.dataset.machineManagerGeometry).coordinates === "XYZBC" && document.querySelector("main.axis-app")?.dataset.axisProgramLoading === "false"; } catch { return false; } }, null, { timeout: 45000 }); + const bcGeometry = JSON.parse(await page.locator(".xyzac-machine-view").getAttribute("data-machine-manager-geometry")); assert.deepEqual(bcGeometry.cOriginMm, [-18, 14, 12]); assert.deepEqual(bcGeometry.tiltOffsetMm, [22, 0, -40]); assert.equal(bcGeometry.physicalZero.b, 12); + report.checks.push("same component assembly switches to BC hierarchy and applies BC geometry"); + + await page.keyboard.press("Escape"); await control("toolbar-power").click(); await page.waitForFunction(() => document.querySelector("main.axis-app")?.dataset.axisStateMachine === "ON"); await control("manual-home-all").click(); + await page.waitForFunction(() => document.querySelector("main.axis-app")?.dataset.axisHomed === "[true,true,true,true,true]", null, { timeout: 45000 }); await control("toolbar-run").click(); + await page.waitForFunction(() => { const main = document.querySelector("main.axis-app"); const joints = JSON.parse(document.querySelector(".xyzac-machine-view")?.dataset.xyzacJoints || "[0,0,0,0,0]"); return Number(main?.dataset.axisCurrentLine || 0) > 0 && joints.some((value) => Math.abs(value) > 1e-6); }, null, { timeout: 45000 }); + const runningJoints = JSON.parse(await page.locator(".xyzac-machine-view").getAttribute("data-xyzac-joints")); assert.equal(runningJoints.length, 5); await page.locator(".axis-preview-machine").screenshot({ path: new URL("managed-bc-running.png", output).pathname }); await control("toolbar-stop").click(); + report.checks.push("BC five-axis program drives managed model from authoritative WASM joints"); + + if (!production) { + const projection = await page.evaluate(async () => { + const manager = await import("/src/machine-manager.ts"); const importedMachine = await import("/src/imported-machine.ts"); + const sources = await Promise.all(Array.from({ length: 8 }, async (_, index) => manager.loadMachinePart(await (await fetch("/machines/demo-ac-xyz-head.glb")).arrayBuffer(), `source-${index}.glb`))); + const roles = manager.MACHINE_PART_ROLES; const drafts = sources.map((source, index) => { const role = roles[index]; const parentRole = manager.expectedParentRole(role); return { ...source, role, parentId: parentRole ? sources[roles.indexOf(parentRole)].id : null, visible: true, showOrigin: true, originMm: [0, 0, 0], translationMm: [0, 0, 0], rotationDeg: [0, 0, 0] }; }); + const run = async (coordinates, cOriginMm, tiltOffsetMm, physicalZero, joints) => { + const asset = await manager.buildManagedMachine({ coordinates, parts: drafts, cOriginMm, tiltOffsetMm, physicalZero }); const built = importedMachine.buildImportedMachine(asset); + built.update({ joints, offsets: { x_rot_point: cOriginMm[0], y_rot_point: cOriginMm[1], z_rot_point: cOriginMm[2], x_offset: tiltOffsetMm[0], y_offset: tiltOffsetMm[1], z_offset: tiltOffsetMm[2], tool_offset: 0 } }); + const link = (name) => { let found = null; built.machine.traverse((node) => { if (!found && node.userData.link === name) found = node; }); return found; }; + const result = { xMetres: link("x").position.x, tiltQuaternion: link("tilt").quaternion.toArray(), cQuaternion: link("c").quaternion.toArray(), baseData: link("base").userData.linuxcncMachineGeometry }; + built.dispose(); importedMachine.disposeMachineScene(asset.scene); return result; + }; + let invalid = ""; try { manager.validateMachineAssembly("XYZAC", drafts.map((part, index) => index === 1 ? { ...part, parentId: null } : part)); } catch (error) { invalid = error.message; } + const ac = await run("XYZAC", [24, -12, 8], [0, 18, -45], { x: 5, y: 0, z: 0, a: 10, b: 0, c: 20 }, [15, 0, 0, 30, 50]); + const bc = await run("XYZBC", [-18, 14, 12], [22, 0, -40], { x: 2, y: 0, z: 0, a: 0, b: 12, c: 5 }, [7, 0, 0, 32, 35]); + sources.forEach((source) => importedMachine.disposeMachineScene(source.scene)); return { ac, bc, invalid }; + }); + const angle = (quaternion) => 2 * Math.acos(Math.min(1, Math.abs(quaternion[3]))); + assert.ok(Math.abs(projection.ac.xMetres - .01) < 1e-9); assert.ok(Math.abs(angle(projection.ac.tiltQuaternion) - 20 * Math.PI / 180) < 1e-9); assert.ok(Math.abs(angle(projection.ac.cQuaternion) - 30 * Math.PI / 180) < 1e-9); assert.deepEqual(projection.ac.baseData.cOriginMm, [24, -12, 8]); + assert.ok(Math.abs(projection.bc.xMetres - .005) < 1e-9); assert.ok(Math.abs(angle(projection.bc.tiltQuaternion) - 20 * Math.PI / 180) < 1e-9); assert.ok(Math.abs(angle(projection.bc.cQuaternion) - 30 * Math.PI / 180) < 1e-9); assert.deepEqual(projection.bc.baseData.tiltOffsetMm, [22, 0, -40]); assert.match(projection.invalid, /必须挂到/); + report.checks.push("AC/BC WASM joint projection subtracts physical zero, preserves userData and rejects invalid hierarchy"); + } else report.checks.push("production bundle exercised through AC/BC UI apply and WASM program motion"); + assert.deepEqual(errors, []); report.status = "verified"; +} catch (error) { report.status = "failed"; report.error = error instanceof Error ? error.stack : String(error); await page.screenshot({ path: "/tmp/machine-manager-failure.png", fullPage: true }); throw error; } +finally { report.browser_errors = errors; report.final = await main.evaluate((element) => ({ program: element.dataset.axisProgramStatus, machine: element.dataset.axisStateMachine, path: element.dataset.axisProgramPath })).catch(() => null); await writeFile(new URL(production ? "browser-production.report.json" : "browser.report.json", output), JSON.stringify(report, null, 2) + "\n"); await browser.close(); } +console.log(JSON.stringify(report)); diff --git a/scripts/test_rtcp_program_library_browser.mjs b/scripts/test_rtcp_program_library_browser.mjs new file mode 100644 index 0000000..e0b514e --- /dev/null +++ b/scripts/test_rtcp_program_library_browser.mjs @@ -0,0 +1,101 @@ +import assert from "node:assert/strict"; +import { pathToFileURL } from "node:url"; + +const modulePath = process.env.PLAYWRIGHT_MODULE; +if (!modulePath) { + console.log(JSON.stringify({ schema: "rtcp-program-library-browser.v1", status: "blocked", code: "playwright_unavailable" })); + process.exit(0); +} +const imported = await import(pathToFileURL(modulePath).href); +const playwright = imported.default ?? imported; +const browser = await playwright.chromium.launch({ headless: true, executablePath: process.env.BROWSER_EXECUTABLE_PATH ?? "/usr/bin/google-chrome", args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader"] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +const errors = []; +page.on("pageerror", (error) => errors.push(`pageerror:${error.message}`)); +page.on("console", (message) => { if (message.type() === "error") errors.push(`console:${message.text()}`); }); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const main = page.locator("main.axis-app"); +const waitReady = () => page.waitForFunction(() => { + const element = document.querySelector("main.axis-app"); + return element?.dataset.axisStateSource === "linuxcnc-wasm" && element?.dataset.axisProgramLoading === "false"; +}, null, { timeout: 45000 }); +const waitPath = (path) => page.waitForFunction((expected) => { + const element = document.querySelector("main.axis-app"); + return element?.dataset.axisProgramLoading === "false" && element?.dataset.axisProgramPath === expected && element?.dataset.axisProgramStatus === "loaded"; +}, path, { timeout: 45000 }); + +const report = { schema: "rtcp-program-library-browser.v1", status: "running", checks: [] }; +try { + await page.goto(process.env.RTCP_LIBRARY_URL ?? "http://127.0.0.1:5174/", { waitUntil: "domcontentloaded", timeout: 30000 }); + await waitReady(); + assert.match(await control("workspace-rtcp-programs").textContent(), /AC(XYZAC) RTCP 程序 \(15\)/); + await control("workspace-rtcp-programs").click(); + assert.equal(await control("rtcp-program-scope").inputValue(), "machine"); + assert.equal(await control("rtcp-program-select").locator("option").count(), 15); + assert.deepEqual(await control("rtcp-program-select").locator("optgroup").evaluateAll((nodes) => nodes.map((node) => ({ label: node.label, count: node.querySelectorAll("option").length }))), [ + { label: "TRT 旋转倾斜台 XYZAC/XYZBC (12)", count: 12 }, + { label: "gmoccapy TRT 示例 (3)", count: 3 }, + ]); + report.checks.push("AC machine defaults to 15 XYZAC/common programs"); + + await control("rtcp-program-scope").selectOption("all"); + assert.equal(await control("rtcp-program-select").locator("option").count(), 32); + assert.deepEqual(await control("rtcp-program-select").locator("optgroup").evaluateAll((nodes) => nodes.map((node) => ({ label: node.label, count: node.querySelectorAll("option").length }))), [ + { label: "TRT 旋转倾斜台 XYZAC/XYZBC (16)", count: 16 }, + { label: "gmoccapy TRT 示例 (5)", count: 5 }, + { label: "XYZAB 双旋转台 (3)", count: 3 }, + { label: "Bridge Mill / 5axiskins (4)", count: 4 }, + { label: "Hexapod genhexkins RTCP (3)", count: 3 }, + { label: "独立五轴动态刀长示例 (1)", count: 1 }, + ]); + report.checks.push("all-source scope retains 32 programs and 6 source groups"); + + await control("rtcp-program-select").selectOption("trt-remap-m428"); + assert.equal(await control("rtcp-program-load").isDisabled(), true); + await control("rtcp-program-source").click(); + await page.waitForFunction(() => document.querySelector(".rtcp-program-source")?.value.includes("motion.switchkins-type")); + report.checks.push("support remap is source-readable and execution-disabled"); + + await control("rtcp-program-select").selectOption("xyzab-tdr-demo"); + assert.equal(await control("rtcp-program-load").isDisabled(), true); + assert.match(await page.locator(".rtcp-incompatible").textContent(), /需要 XYZAB/); + report.checks.push("mismatched XYZAB program is visible and execution-disabled"); + + const xyzacPath = "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc"; + await control("rtcp-program-select").selectOption("trt-xyzac-switchkins-test-3"); + assert.equal(await control("rtcp-program-load").isDisabled(), false); + await control("rtcp-program-load").click(); + await waitPath(xyzacPath); + assert.match(await main.getAttribute("data-axis-program-source-hash"), /^fnv1a64:/); + assert.ok(Number(await page.locator(".xyzac-tool-preview").getAttribute("data-xyzac-toolpath-count")) > 0); + report.checks.push("XYZAC switchkins test loaded through WASM with canonical source hash and preview"); + + await page.keyboard.press("Escape"); + const xyzbcCase = "linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini"; + await control("workspace-case-select").selectOption(xyzbcCase); + await page.waitForFunction((expected) => document.querySelector('[data-axis-control="workspace-case-select"]')?.value === expected && document.querySelector("main.axis-app")?.dataset.axisProgramLoading === "false", xyzbcCase, { timeout: 45000 }); + assert.match(await control("workspace-rtcp-programs").textContent(), /BC(XYZBC) RTCP 程序 \(9\)/); + await control("workspace-rtcp-programs").click(); + assert.equal(await control("rtcp-program-scope").inputValue(), "machine"); + assert.equal(await control("rtcp-program-select").locator("option").count(), 9); + const xyzbcPath = "linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc"; + await control("rtcp-program-select").selectOption("gmoccapy-boat-xyzbc"); + assert.equal(await control("rtcp-program-load").isDisabled(), false); + await control("rtcp-program-load").click(); + await waitPath(xyzbcPath); + assert.ok(Number(await page.locator(".xyzac-tool-preview").getAttribute("data-xyzac-toolpath-count")) > 0); + report.checks.push("BC machine defaults to 9 XYZBC/common programs and loads gmoccapy XYZBC through WASM"); + + assert.deepEqual(errors, []); + report.status = "verified"; +} catch (error) { + report.status = "failed"; + report.error = error instanceof Error ? error.stack : String(error); + await page.screenshot({ path: "/tmp/rtcp-program-library-failure.png", fullPage: true }); + throw error; +} finally { + report.browser_errors = errors; + report.final = await main.evaluate((element) => ({ coordinates: element.querySelector('[data-axis-control="workspace-case-select"]')?.value, program_path: element.dataset.axisProgramPath, program_status: element.dataset.axisProgramStatus, source_hash: element.dataset.axisProgramSourceHash })).catch(() => null); + await browser.close(); +} +console.log(JSON.stringify(report)); diff --git a/scripts/test_trt_parametric_browser.mjs b/scripts/test_trt_parametric_browser.mjs index 007df55..382c63c 100644 --- a/scripts/test_trt_parametric_browser.mjs +++ b/scripts/test_trt_parametric_browser.mjs @@ -3,7 +3,7 @@ import { mkdir, readFile, writeFile } from "node:fs/promises"; import { pathToFileURL } from "node:url"; const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); -const output = new URL("../coverage/trt-parametric/", import.meta.url); +const output = process.env.TRT_EVIDENCE_DIR ? pathToFileURL(`${process.env.TRT_EVIDENCE_DIR.replace(/\/$/, "")}/`) : new URL("../coverage/trt-parametric/", import.meta.url); await mkdir(output, { recursive: true }); const browser = await chromium.launch({ executablePath: "/usr/bin/google-chrome", headless: true, args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader"] }); const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); @@ -13,6 +13,12 @@ page.on("pageerror", (error) => errors.push(error.message)); const control = (id) => page.locator(`[data-axis-control="${id}"]`); const machine = page.locator(".xyzac-machine-view"); const panel = page.locator(".trt-geometry"); +const openGeometry = async () => { + if (!(await page.locator(".geometry-dialog[open]").count())) await control("geometry-settings").click(); +}; +const closeGeometry = async () => { + if (await page.locator(".geometry-dialog[open]").count()) await page.locator(".geometry-dialog [aria-label=\"关闭机床几何参数\"]").click(); +}; const settled = async () => { await page.waitForFunction(() => document.querySelector("main")?.dataset.axisProgramLoading === "false" && document.querySelector(".trt-geometry")?.getAttribute("aria-busy") === "false"); await page.waitForTimeout(350); @@ -30,6 +36,7 @@ try { for (const [id, unsupported] of [["xyzac-trt", "x-offset"], ["xyzbc-trt", "y-offset"]]) { if (id === "xyzbc-trt") { await control("machine-type-select").selectOption({ label: "XYZBC TRT" }); await settled(); } assert.equal(await machine.getAttribute("data-xyzac-model-id"), id); + await openGeometry(); assert.equal(await panel.getByLabel(unsupported, { exact: true }).isDisabled(), true); const beforePath = await page.locator("main").getAttribute("data-axis-program-path"); const original = JSON.parse(await machine.getAttribute("data-xyzac-offsets")); @@ -38,11 +45,13 @@ try { await panel.getByLabel("y-rot-point", { exact: true }).fill("-12"); await panel.getByLabel("z-rot-point", { exact: true }).fill("8"); await control("geometry-apply").click(); await settled(); + await closeGeometry(); const offsets = JSON.parse(await machine.getAttribute("data-xyzac-offsets")); assert.equal(offsets.x_rot_point, 24); assert.equal(offsets.y_rot_point, -12); assert.equal(offsets.z_rot_point, 8); assert.equal(await page.locator("main").getAttribute("data-axis-program-path"), beforePath); assert.notEqual((await pixels()).hash, before.hash); await machine.screenshot({ path: new URL(`${id}-model.png`, output).pathname }); + await openGeometry(); const downloading = page.waitForEvent("download"); await control("geometry-save").click(); const download = await downloading; assert.equal(download.suggestedFilename(), `${id}.ini`); @@ -50,11 +59,13 @@ try { assert.match(exported, /x-rot-point\s+24/); assert.match(exported, /LIB:basic_sim.tcl/); assert.doesNotMatch(exported, /HALFILE = .*_cmds.hal/); await control("geometry-reload").click(); await settled(); + await openGeometry(); assert.deepEqual(JSON.parse(await machine.getAttribute("data-xyzac-offsets")), original); await panel.locator('input[type="file"]').setInputFiles({ name: `${id}.ini`, mimeType: "text/plain", buffer: Buffer.from(exported) }); await page.waitForFunction(() => document.querySelector('.trt-geometry input[aria-label="x-rot-point"]')?.value === "24"); await control("geometry-apply").click(); await settled(); assert.equal(JSON.parse(await machine.getAttribute("data-xyzac-offsets")).x_rot_point, 24); + await closeGeometry(); await control("toolbar-power").click(); await page.waitForFunction(() => document.querySelector('.trt-geometry input[aria-label="x-rot-point"]')?.disabled === true); assert.equal(await panel.getByLabel("x-rot-point", { exact: true }).isDisabled(), true); @@ -66,11 +77,13 @@ try { for (const [width, height] of [[1440, 1000], [390, 844]]) { await page.setViewportSize({ width, height }); await panel.scrollIntoViewIfNeeded(); await page.waitForTimeout(400); const canvas = await pixels(); assert.ok(canvas.colors > 100 && canvas.width > 100 && canvas.height >= 220); - const boxes = await panel.locator("label, input:not([hidden]), button").evaluateAll((elements) => elements.map((element) => { + await openGeometry(); + const boxes = await page.locator(".geometry-dialog").locator("label, input:not([hidden]), button").evaluateAll((elements) => elements.map((element) => { const r = element.getBoundingClientRect(); return { x: r.x, right: r.right, width: r.width }; })); assert.ok(boxes.every((r) => r.width > 0 && r.x >= 0 && r.right <= width), JSON.stringify(boxes)); assert.ok(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth)); + await closeGeometry(); const before = await pixels(); await control("machine-rotateLeft").click(); await page.waitForTimeout(400); assert.notEqual((await pixels()).hash, before.hash); diff --git a/scripts/test_trt_rtcp_jog_browser.mjs b/scripts/test_trt_rtcp_jog_browser.mjs index 453f41d..e9c7f68 100644 --- a/scripts/test_trt_rtcp_jog_browser.mjs +++ b/scripts/test_trt_rtcp_jog_browser.mjs @@ -4,7 +4,7 @@ import { pathToFileURL } from "node:url"; import { buildXyzacMachine, buildXyzbcMachine } from "../web/react/src/xyzac-machine-model.ts"; const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); -const output = new URL("../coverage/trt-parametric/", import.meta.url); +const output = process.env.TRT_EVIDENCE_DIR ? pathToFileURL(`${process.env.TRT_EVIDENCE_DIR.replace(/\/$/, "")}/`) : new URL("../coverage/trt-parametric/", import.meta.url); await mkdir(output, { recursive: true }); const browser = await chromium.launch({ executablePath: "/usr/bin/google-chrome", headless: true, args: ["--no-sandbox", "--use-angle=swiftshader", "--enable-unsafe-swiftshader"] }); const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); diff --git a/scripts/test_trt_switch_stationary_browser.mjs b/scripts/test_trt_switch_stationary_browser.mjs new file mode 100644 index 0000000..e906f92 --- /dev/null +++ b/scripts/test_trt_switch_stationary_browser.mjs @@ -0,0 +1,76 @@ +import assert from 'node:assert/strict'; +import { writeFile } from 'node:fs/promises'; +import { pathToFileURL } from 'node:url'; +const { chromium } = await import(pathToFileURL(process.env.PLAYWRIGHT_MODULE).href); +const output = new URL('../coverage/glb-machine/switching/', import.meta.url); +const browser = await chromium.launch({ executablePath: '/usr/bin/google-chrome', headless: true, args: ['--no-sandbox', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] }); +const page = await browser.newPage({ viewport: { width: 1440, height: 1000 } }); +const errors = []; page.on('pageerror', (e) => errors.push(e.message)); +const control = (id) => page.locator(`[data-axis-control="${id}"]`); +const rendered = () => page.waitForFunction(() => { const e = document.querySelector('.xyzac-machine-view'); return e?.dataset.xyzacTick === e?.dataset.xyzacRenderedTick; }); +const sample = () => page.locator('.xyzac-machine-view').evaluate((e) => ({ joints: JSON.parse(e.dataset.xyzacJoints), tip: JSON.parse(e.dataset.xyzacToolTip), tick: Number(e.dataset.xyzacTick) })); +const close = (a, b, label) => a.forEach((v, i) => assert.ok(Math.abs(v - b[i]) < 1e-8, `${label}[${i}] ${v} != ${b[i]}`)); +async function mdi(block) { + await control('tab-mdi').click(); await control('mdi-command').fill(block); await control('mdi-submit').click(); + await page.waitForFunction(() => document.querySelector('.command-status')?.textContent?.includes('MDI_EXECUTE acknowledged')); +} +const report = { report_id: 'trt-stationary-switch-browser-v1', status: 'running', machines: [] }; +try { + await page.goto('http://127.0.0.1:5174/'); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + for (const id of ['ac', 'bc']) { + await control('machine-glb-settings').click(); await control(`machine-glb-${id}`).click(); + await page.waitForFunction(() => document.querySelector('main')?.dataset.axisProgramLoading === 'false'); + await page.keyboard.press('Escape'); + await control('toolbar-power').click(); await control('tab-manual').click(); await control('manual-home-all').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="switchkins-1"]').disabled); + const tilt = id[0].toUpperCase(); + await mdi(`G21 G90 G0 X0 Y0 Z44.5858 ${tilt}4.8675 C179.88`); + await page.waitForFunction(() => Math.abs(JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[4] - 179.88) < 1e-7); + await control('tab-manual').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="switchkins-1"]').disabled); + await rendered(); + const initial = await sample(), rows = []; + await page.locator('.axis-preview-machine').screenshot({ path: new URL(`${id}-identity.png`, output).pathname }); + for (const type of [1, 0, 1, 0, 2, 1, 0]) { + await control(`switchkins-${type}`).click(); + await page.waitForFunction((type) => document.querySelector(`[data-axis-control="switchkins-${type}"]`)?.getAttribute('aria-pressed') === 'true', type); + await rendered(); const after = await sample(); close(after.joints, initial.joints, `${id} button joints`); close(after.tip, initial.tip, `${id} button tip`); + await page.waitForTimeout(100); const idle = await sample(); close(idle.tip, initial.tip, `${id} idle tip`); + rows.push({ type, after }); + if (type === 1) await page.locator('.axis-preview-machine').screenshot({ path: new URL(`${id}-tcp.png`, output).pathname }); + } + for (const type of [1, 0, 1]) { + await mdi(type === 1 ? 'M428' : 'M429'); await rendered(); + const after = await sample(); close(after.joints, initial.joints, `${id} MDI joints`); close(after.tip, initial.tip, `${id} MDI tip`); + rows.push({ mdi: true, type, after }); + } + // A subsequent rotary jog must still produce actual XYZ compensation. + await control('tab-manual').click(); await control(`manual-axis-${id[0]}`).check(); + const beforeJog = await sample(), box = await control('manual-jog-positive').boundingBox(); + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); await page.mouse.down(); + try { await page.waitForFunction((angle) => JSON.parse(document.querySelector('.xyzac-machine-view').dataset.xyzacJoints)[3] > angle + 1, beforeJog.joints[3]); } + finally { await page.mouse.up(); } + await page.waitForFunction(() => document.querySelector('.command-status')?.textContent?.includes('JOG_STOP acknowledged')); + await rendered(); const afterJog = await sample(); + assert.ok(afterJog.joints.slice(0, 3).some((v, i) => Math.abs(v - beforeJog.joints[i]) > 1e-5)); + const compensation = await page.evaluate(async ({ id, beforeJog, afterJog }) => { + const api = await import('/src/imported-machine.ts'); + const asset = await api.loadImportedMachine(await (await fetch(`/machines/demo-${id}-xyz-head.glb`)).arrayBuffer(), `${id}.glb`); + const model = api.buildImportedMachine(asset), offsets = { ...asset.structure.offsets, tool_offset: 0 }; + model.update({ ...beforeJog, offsets }); + const target = model.workOrigin.worldToLocal(model.toolTip.getWorldPosition(model.toolTip.position.clone())); + model.update({ ...afterJog, offsets }); + const tip = model.toolTip.getWorldPosition(target.clone()), point = model.workOrigin.localToWorld(target.clone()); + const error = point.distanceTo(tip); model.dispose(); api.disposeMachineScene(asset.scene); return error; + }, { id, beforeJog, afterJog }); + assert.ok(compensation < 1e-8); + await control('switchkins-0').click(); await rendered(); close((await sample()).joints, afterJog.joints, 'switch after jog'); + await control('toolbar-power').click(); + await page.waitForFunction(() => !document.querySelector('[data-axis-control="machine-glb-import"]').disabled); + report.machines.push({ id, initial, rows, afterJog, tcp_jog_error: compensation }); + } + assert.deepEqual(errors, []); report.status = 'verified'; +} catch (error) { report.status = 'failed'; report.error = String(error.stack ?? error); await page.screenshot({ path: new URL('failure.png', output).pathname }); throw error; } +finally { report.browser_errors = errors; await writeFile(new URL('browser.report.json', output), JSON.stringify(report, null, 2) + '\n'); await browser.close(); } +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, switches: report.machines.reduce((n, m) => n + m.rows.length + 1, 0) })); diff --git a/scripts/validate_glb_machines.mjs b/scripts/validate_glb_machines.mjs new file mode 100644 index 0000000..016fc57 --- /dev/null +++ b/scripts/validate_glb_machines.mjs @@ -0,0 +1,18 @@ +import assert from 'node:assert/strict'; +import { readFile, writeFile } from 'node:fs/promises'; +import { createHash } from 'node:crypto'; +import { pathToFileURL } from 'node:url'; +const validator = (await import(process.env.GLTF_VALIDATOR_MODULE ? pathToFileURL(process.env.GLTF_VALIDATOR_MODULE).href : 'gltf-validator')).default; +const root = new URL('../', import.meta.url), output = process.env.GLB_EVIDENCE_DIR ? pathToFileURL(`${process.env.GLB_EVIDENCE_DIR.replace(/\/$/, '')}/`) : new URL('coverage/glb-machine/', root); +const manifest = JSON.parse(await readFile(new URL('web/react/public/machines/manifest.json', root), 'utf8')); +const report = { report_id: 'glb-machine-khronos-validation-v1', validator: validator.version(), status: 'verified', reports: [] }; +for (const machine of manifest.machines) { + const bytes = await readFile(new URL(`web/react/public/machines/${machine.filename}`, root)); + const sha256 = createHash('sha256').update(bytes).digest('hex'); assert.equal(sha256, machine.sha256); + const result = await validator.validateBytes(new Uint8Array(bytes), { uri: machine.filename }); + report.reports.push({ id: machine.id, sha256, ...result }); + if (result.issues.numErrors || result.issues.numWarnings) report.status = 'failed'; +} +await writeFile(new URL('gltf-validation.report.json', output), JSON.stringify(report, null, 2) + '\n'); +assert.equal(report.status, 'verified'); +console.log(JSON.stringify({ report_id: report.report_id, status: report.status, reports: report.reports.map(({ id, issues }) => ({ id, errors: issues.numErrors, warnings: issues.numWarnings })) })); diff --git a/scripts/verify_rtcp_beginner_pdf.py b/scripts/verify_rtcp_beginner_pdf.py new file mode 100644 index 0000000..2c2d575 --- /dev/null +++ b/scripts/verify_rtcp_beginner_pdf.py @@ -0,0 +1,41 @@ +"""Verify A4 page count, CJK text, embedded glyphs, bookmarks and source evidence.""" +import hashlib +import json +import unicodedata +from pathlib import Path +from pypdf import PdfReader + +ROOT=Path(__file__).resolve().parents[1] +OUT=ROOT/'docs/teaching/rtcp-beginners' +pdf=OUT/'五轴RTCP与工件坐标-初学者完整讲义.pdf' +r=PdfReader(pdf) +outline=json.loads((OUT/'outline.json').read_text()) +layout=json.loads((OUT/'verification/layout.json').read_text()) +numeric=json.loads((OUT/'gcode-evidence.json').read_text()) +assert len(r.pages)==len(outline)==72 +assert numeric['status']=='verified' and numeric['executed_program']['status']=='completed' +assert not layout['errors'] and all(not p['violations'] and not p['overflow'] for p in layout['pages']) +pages=[];fonts={} +normalize=lambda s:''.join(unicodedata.normalize('NFKC',s).split()) +for i,page in enumerate(r.pages): + text=page.extract_text();assert len(text)>120,(i,len(text)) + assert normalize(outline[i]['title']) in normalize(text),(i,outline[i]['title']) + assert abs(float(page.mediabox.width)-595.28)<1 and abs(float(page.mediabox.height)-841.89)<1 + assert '\ufffd' not in text + for entry in page['/Resources'].get('/Font',{}).values(): + font=entry.get_object() + for item in font.get('/DescendantFonts',[font]): + value=item.get_object();desc=value.get('/FontDescriptor') + if desc: + desc=desc.get_object();name=str(desc.get('/FontName')) + embedded=bool(value.get('/Subtype')=='/Type3' and value.get('/CharProcs')) or any(k in desc for k in ['/FontFile','/FontFile2','/FontFile3']) + fonts[name]=embedded + pages.append({'page':i+1,'characters':len(text),'title':outline[i]['title']}) +assert fonts and all(fonts.values()) and any('CJK' in k for k in fonts) +def count_bookmarks(items): + return sum(count_bookmarks(item) if isinstance(item,list) else 1 for item in items) +bookmarks=count_bookmarks(r.outline) +assert bookmarks>=72 +report={'report_id':'rtcp-beginners-pdf-v1','status':'verified','page_count':len(r.pages),'pdf':pdf.name,'bytes':pdf.stat().st_size,'sha256':hashlib.sha256(pdf.read_bytes()).hexdigest(),'pages':pages,'embedded_fonts':fonts,'bookmarks':bookmarks,'numeric_report':numeric['report_id'],'executed_program_status':numeric['executed_program']['status'],'wasm_sha256':numeric['wasm_sha256'],'evidence':[{'path':str(p.relative_to(OUT)),'sha256':hashlib.sha256(p.read_bytes()).hexdigest()} for p in [OUT/'handbook.html',OUT/'outline.json',OUT/'gcode-evidence.json',OUT/'verification/layout.json',*sorted((OUT/'assets').iterdir()),*sorted((OUT/'verification').glob('pdf-contact-*.png'))]]} +(OUT/'verification/acceptance.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n') +print(json.dumps({k:report[k] for k in ['report_id','status','page_count','bytes','bookmarks']},ensure_ascii=False)) diff --git a/scripts/verify_rtcp_teaching_pdf.py b/scripts/verify_rtcp_teaching_pdf.py new file mode 100644 index 0000000..dfcbf11 --- /dev/null +++ b/scripts/verify_rtcp_teaching_pdf.py @@ -0,0 +1,54 @@ +"""Verify the standalone PDF, embedded fonts, text, page dimensions and evidence.""" +import hashlib +import json +import unicodedata +from pathlib import Path +from pypdf import PdfReader + +root = Path(__file__).resolve().parents[1] +output = root / 'docs/teaching/rtcp-five-axis' +pdf = output / '五轴机床与RTCP-教学课件.pdf' +reader = PdfReader(pdf) +outline = json.loads((output / 'outline.json').read_text()) +layout = json.loads((output / 'verification/layout.json').read_text()) +numerics = json.loads((output / 'numeric-evidence.json').read_text()) +assert len(reader.pages) == len(outline) == 31 +assert numerics['status'] == 'verified' and not layout['errors'] +assert all(not p['clipped'] and not p['content_overflow'] for p in layout['pages']) +pages = [] +fonts = {} +for index, page in enumerate(reader.pages): + text = unicodedata.normalize('NFKC', page.extract_text()) + assert len(text) > 100, (index, len(text)) + assert abs(float(page.mediabox.width) / float(page.mediabox.height) - 16/9) < .001 + assert str(index+1).zfill(2) in text + assert '\ufffd' not in text + for font in page['/Resources'].get('/Font', {}).values(): + value = font.get_object() + descendants = value.get('/DescendantFonts', [value]) + for item in descendants: + descriptor = item.get_object().get('/FontDescriptor') + if descriptor: + descriptor = descriptor.get_object() + # Chrome embeds CFF CJK glyphs as Type 3 CharProcs instead of + # a FontFile stream; both forms are self-contained PDF fonts. + type3 = item.get_object().get('/Subtype') == '/Type3' and bool(item.get_object().get('/CharProcs')) + embedded = type3 or any(key in descriptor for key in ['/FontFile', '/FontFile2', '/FontFile3']) + name = str(descriptor.get('/FontName')) + fonts[name] = embedded + pages.append({'page': index+1, 'characters': len(text), 'width_pt': float(page.mediabox.width), 'height_pt': float(page.mediabox.height)}) +assert fonts and all(fonts.values()), fonts +assert any('CJK' in font for font in fonts), fonts +assert len(reader.outline) >= 31 +report = { + 'report_id': 'rtcp-teaching-pdf-v1', 'status': 'verified', 'pages': pages, + 'pdf': pdf.name, 'bytes': pdf.stat().st_size, + 'sha256': hashlib.sha256(pdf.read_bytes()).hexdigest(), + 'bookmarks': len(reader.outline), 'embedded_fonts': fonts, + 'numeric_report_id': numerics['report_id'], 'wasm_sha256': numerics['wasm_sha256'], + 'layout_report': 'verification/layout.json', + 'evidence': [{'path': str(p.relative_to(output)), 'sha256': hashlib.sha256(p.read_bytes()).hexdigest()} + for p in [output/'course.html', output/'numeric-evidence.json', output/'outline.json', output/'verification/layout.json', *sorted((output/'assets').glob('*.png'))]], +} +(output / 'verification/acceptance.json').write_text(json.dumps(report, ensure_ascii=False, indent=2)+'\n') +print(json.dumps({'report_id':report['report_id'], 'status':report['status'], 'pages':len(pages), 'bytes':report['bytes'], 'fonts':len(fonts), 'bookmarks':report['bookmarks']},ensure_ascii=False)) diff --git a/test_Rtcp/MANIFEST.md b/test_Rtcp/MANIFEST.md new file mode 100644 index 0000000..7a09972 --- /dev/null +++ b/test_Rtcp/MANIFEST.md @@ -0,0 +1,70 @@ +# RTCP G-code 文件清单 + +下面的路径均相对于 `test_Rtcp/programs/`。括号中的路径是对应的 LinuxCNC 源码相对路径。 + +## 1. TRT table rotary/tilting 主程序与测试:16 个 + +这些程序对应 `xyzac-trt-kins` 或 `xyzbc-trt-kins`。在 switchkins 配置中,`M428` 选择 TCP 运动学,`M429` 选择 identity 运动学。 + +### 主程序和运动学测试 + +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc` + +### remap 与可调用子程序 + +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc` + +## 2. gmoccapy TRT 示例:5 个 + +该配置直接加载 `xyzac-trt-kins`,所以示例中不一定显式写 `M428`。 + +- `configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc` +- `configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc` +- `configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc` +- `configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc` +- `configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc` + +## 3. XYZAB table dual rotary:3 个 + +- `configs/sim/axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc` +- `configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc` +- `configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc` + +`xyzab-tdr-demo.ngc` 使用 HAL 运动学变量建立 G54,加载刀长补偿后进入 TCP 模式,并同时改变 A/B 姿态。 + +## 4. XYZBCW Bridge Mill / 5axiskins:4 个 + +- `configs/sim/axis/vismach/5axis/bridgemill/5axisgui.ngc` +- `configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc` +- `configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc` +- `configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc` + +`5axisgui.ngc` 是参数化的球面/钻孔演示,使用 `W` 轴沿刀具方向进给;对应的 `5axiskins` 通过 pivot length 和当前刀长实现 TCP。 + +## 5. Hexapod RTCP 支持 remap:3 个 + +- `configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc` +- `configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc` +- `configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc` + +该目录在当前源码中没有额外的 RTCP 主加工程序,但 `genhexkins.c` 明确说明 `genhexkins.tool-offset` 连接到 `motion.tooloffset.Z` 时实现 RTCP,因此保留其运动学切换 remap 作为支持性 G 代码。 + +## 6. 独立五轴动态刀长示例:1 个 + +- `nc_files/cone.ngc` + +该程序标注为 simulated 5 axis machine,先在旋转轴回零状态下使用 `G43.1` 修改动态刀长,然后执行 B/C 旋转和 W 轴钻削。它没有绑定到当前某个五轴 INI,因此应作为算法参考程序使用。 diff --git a/test_Rtcp/README.md b/test_Rtcp/README.md new file mode 100644 index 0000000..1d3cf38 --- /dev/null +++ b/test_Rtcp/README.md @@ -0,0 +1,60 @@ +# LinuxCNC RTCP G-code collection + +本目录收集了当前仓库 `linuxcnc/` 源码树中与 RTCP/TCP 五轴运动学直接相关的 G 代码程序。 + +源码版本: + +- LinuxCNC 子仓库:`239dcf4`(`git -C linuxcnc log -1 --oneline`) +- 原始文件根目录:`linuxcnc/` +- 复制目录:`test_Rtcp/programs/` +- 文件数量:32 个 `.ngc` +- 复制方式:保留相对于 `linuxcnc/` 的原始路径;已用 `cmp` 检查复制文件与源码文件一致 + +## 目录 + +`programs/` 下的路径去掉了源码根目录前缀。例如: + +```text +programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc +``` + +对应源码: + +```text +linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc +``` + +完整清单见 [`MANIFEST.md`](MANIFEST.md),分析见 [`rtcp_analysis.md`](rtcp_analysis.md)。 + +## Web 控制面板适配 + +这 32 个文件现已接入 Web AXIS 控制面板的“RTCP 程序库”入口: + +- 程序清单与兼容性元数据:`web/react/src/rtcp-program-manifest.json` +- 程序库界面:`web/react/src/RtcpProgramLibrary.tsx` +- 控制面板按机床配置自动分为 AC(XYZAC)和 BC(XYZBC):AC 默认显示 15 个相关文件、可直接加载 8 个主程序;BC 默认显示 9 个相关文件、可直接加载 3 个主程序。 +- “全部 32 个源程序”范围保留跨机型查阅能力,但另一类机床程序不会作为当前机型可执行项。 +- remap、O-code 子程序、Hexapod 支持文件及当前未移植机型的主程序可查看和下载,但不会被误当作当前机型的独立主程序执行。 +- 所有可执行项仍通过统一的 `PROGRAM_LOAD` 事务进入 LinuxCNC WASM 解释器、运动学和刀路预览,没有在 React 中增加第二套 G-code 或 RTCP 实现。 + +适配过程中补齐了 LinuxCNC 兼容语义:`G93` 模式下的 `G0` 快移不要求 F 值,`M1` 在当前“可选停止关闭”边界下可被解释器接受。11 个 AC/BC 主程序均通过 WASM 预解析测试。 + +## 运行前提 + +这些程序多数不是脱离配置即可运行的独立 G 代码。RTCP 由 LinuxCNC 的 kinematics 组件执行,G 代码需要匹配的 INI、HAL 和 remap 子程序: + +- TRT 配置:`configs/sim/axis/vismach/5axis/table-rotary-tilting/` +- 双旋转台配置:`configs/sim/axis/vismach/5axis/table-dual-rotary/` +- Bridge Mill 配置:`configs/sim/axis/vismach/5axis/bridgemill/` +- gmoccapy TRT 配置:`configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/` +- Hexapod RTCP remap 配置:`configs/sim/axis/vismach/hexapod-sim/` + +LinuxCNC 这一源码版本没有找到使用标准 `G43.4` 或 `G43.5` 字样的 RTCP 示例。主要实现路径是: + +```text +G-code -> M428/M429 remap 或直接加载非平凡 kinematics + -> inverse kinematics + -> joint XYZ + rotary axes +``` + +`TCP` 在这些示例中表示 Tool Center Point;不要与网络通信中的 TCP 混淆。 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/5axisgui.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/5axisgui.ngc new file mode 100644 index 0000000..7b2c5a8 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/5axisgui.ngc @@ -0,0 +1,53 @@ + # = 60 ; sphere radius + # = 5 ; safe distance +# = -5 + # = 0 + # = 8 + # = 16 + # = 100 + # = 1000 + +# = 0 +# = 0 +# = [360/#] +# = [90/#] + +g49 +t#m6g43 + +g53 g0 x0y0z#b0c0 w0 +g10l20 p0 x0 y0 z[#+#] b0 c0 w0 +g0 z0 +f# +o100 while [# lt #] + # = [#*#] + # = [[#+#]*[cos[#]]] + # = [#] + # = 0 + # = [-#] + g0 x# y# + m66e0l0 ; force sync + g0 z# + g0b[-90+#] + # = 0 +o200 while [# lt #] +o210 if [[# mod 2] eq 0] + # = [# * #] +o210 else + # = [360 - [1+ #] * #] +o210 endif + # = [#*[cos[#]]] + # = [#*[sin[#]]] + g0 x# y# z# c# + f# + g1 w[ # - #] + g0 w0 + m66e0l0 ;force sync + # = [#+1] +o200 endwhile + # = [#+1] +o100 endwhile + +g0x0y0z0b0c0w0 +g53 g0 x0y0z0 +m2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc new file mode 100644 index 0000000..4ab3aaf --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc @@ -0,0 +1,24 @@ +;M428 by remap: select kinstype=0 genhexkins +o<428remap>sub + # = 0 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M428: Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<428remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc new file mode 100644 index 0000000..54726d3 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc @@ -0,0 +1,24 @@ +;M429 by remap: select kinstype==1 Identity kinematics +o<429remap>sub + # = 1 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M429:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<429remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc new file mode 100644 index 0000000..7586236 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc @@ -0,0 +1,24 @@ +;M430 by remap: select kinstype==2 userk kins +o<430remap>sub + # = 2 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M30:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M430:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<430remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc new file mode 100644 index 0000000..76b2f4c --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc @@ -0,0 +1,49 @@ +; -- RELOAD GCODE FOR PROPER TOOL-PATH PREVIEW -- +g21 g90 g49 g54 +; switch to identity mode +m429 +; clear g54 +g10 l2 p0 x0 y0 z0 a0 b0 +; go to machine origin +g53 g0 x0 y0 z0 a0 b0 +; set g54 for face center of rotary +g10 l20 p0 x-[#<_hal[xyzab_tdr_kins.x-rot-point]>+#<_hal[xyzab_tdr_kins.x-offset]>] y-#<_hal[xyzab_tdr_kins.x-rot-point]> z-[#<_hal[xyzab_tdr_kins.z-rot-point]>+#<_hal[xyzab_tdr_kins.z-offset]>] a0 b0 +; load a tool +M61 Q2 G43 H2 +; switch to tcp mode +m428 +g0 b30 +; go to face center of rotary a +g0 x0 y0 z0 +; show basic tcp functionality +g0 x30 a180 +g0 x0 a0 +g0 b100 +g0 y-50 +g0 a90 +g0 b120 +g0 y0 +g0 a0 b30 +g0 x1 +; start with square +f1000 +g0 y-30 z-30 +g1 z30 +g1 a45 +g1 y30 +g1 a90 b45 +g1 z-30 +g1 a180 b100 +g1 y30 +g1 a90 b120 +g1 y-30 +g1 a0 b30 +g0 x5 +g1 y-30 z-30 a90 +g1 z30 a45 b60 +g1 y30 a90 b90 +g1 z-30 a135 b120 +g1 y-30 a0 b30 +; go to machine origin +g53 g0 x0 y0 z0 a0 b0 +m2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc new file mode 100644 index 0000000..46e2d01 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc @@ -0,0 +1,24 @@ +;M428 by remap: kinstype==1 (xyzac,xyzbc) (note: sparm=identityfirst) +o<428remap>sub + # = 1 ; xyzac,xyzbc + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M428: Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<428remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc new file mode 100644 index 0000000..3fa610c --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc @@ -0,0 +1,24 @@ +;M429 by remap: kinstype==0 Identity kinematics +o<429remap>sub + # = 0 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M429:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<429remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc new file mode 100644 index 0000000..77eeaea --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc @@ -0,0 +1,1881 @@ +% +M428 ;TCP:xyzac +(!!! Touch Off: Table = -13.25 == Z max neg extent !!!) +(BOAT-XYZAC) +( 11/20/2011 19:50:48 ) +( FC HERMLE 5 AXIS MILLING ) + +( OPERATION= ROUGH7 Z LEVEL SRF_MILL1 ) +( TOOL: T1 = 10.0 dia. ENDMILLM1000:REG ) +G00 G17 G40 G90 G94 +Z5 +T1 M6 +G54 X-49.65 Y-23.015 A0. C0. S630 M03 +G00 Z5.0 M08 +Z3.0 +G01 Z-6.625 F300.0 +X-49.375 F600.0 +X-15.268 +X-16.626 Y-22.711 +X-20.108 Y-21.7 +X-22.255 Y-20.925 +X-25.036 Y-19.685 +X-49.662 +Y-16.355 +X-31.172 +X-34.919 Y-13.877 +X-36.057 Y-13.025 +X-49.662 +Y-9.695 +X-40.427 +X-44.365 Y-6.498 +X-49.662 +Y3.492 +X-43.134 +X-39.14 Y6.724 +X-38.83 Y6.955 +X-49.662 +Y10.285 +X-34.295 +X-30.697 Y12.666 +X-29.005 Y13.615 +X-49.662 +Y16.945 +X-22.119 +X-20.848 Y17.446 +X-16.626 Y18.719 +X-13.812 Y19.346 +X-9.591 Y20.015 +X-6.955 Y20.275 +X-48.713 +G02 X-44.662 Y22.345 I4.051 J-2.931 +G01 X40.959 +G02 X45.01 Y20.275 I0. J-5.0 +G01 X5.29 +X10.109 Y19.934 +X15.737 Y19.258 +X22.773 Y18.136 +X28.999 Y16.945 +X45.959 +Y13.615 +X39.599 +X39.658 Y13.571 +X40.983 Y12.071 +X41.833 Y10.664 +X42.003 Y10.285 +X45.959 +Y6.955 +X43.169 +X43.63 Y5.036 +X43.87 Y3.492 +X45.959 +Y0.162 +X44.111 +X44.158 Y-2.0 +X44.132 Y-3.168 +X45.959 +Y-6.498 +X44.022 +X43.634 Y-9.036 +X43.475 Y-9.695 +X45.959 +Y-13.025 +X42.547 +X42.467 Y-13.257 +X41.833 Y-14.664 +X41.065 Y-15.952 +X40.717 Y-16.355 +X45.959 +Y-19.685 +X35.537 +X35.437 Y-19.714 +X25.587 Y-21.634 +X17.321 Y-23.015 +X45.672 +G00 Z5.0 +X-15.268 +Z3.0 +G01 Z-6.625 F300.0 +X-16.626 Y-22.711 F600.0 +X-20.108 Y-21.7 +X-22.255 Y-20.925 +X-26.476 Y-19.043 +X-30.697 Y-16.668 +X-34.919 Y-13.877 +X-39.506 Y-10.443 +X-44.769 Y-6.171 +X-46.064 Y-4.814 +X-46.714 Y-3.407 +X-46.912 Y-2.0 +X-46.714 Y-0.593 +X-46.176 Y0.637 +X-44.769 Y2.169 +X-39.14 Y6.724 +X-34.919 Y9.873 +X-30.697 Y12.666 +X-26.476 Y15.034 +X-23.779 Y16.292 +X-20.848 Y17.446 +X-16.626 Y18.719 +X-13.812 Y19.346 +X-9.591 Y20.015 +X-6.777 Y20.293 +X-2.555 Y20.492 +X3.073 Y20.432 +X10.109 Y19.934 +X15.737 Y19.258 +X22.773 Y18.136 +X35.437 Y15.715 +X36.844 Y15.297 +X38.251 Y14.618 +X39.658 Y13.571 +X40.983 Y12.071 +X41.833 Y10.664 +X42.472 Y9.238 +X42.954 Y7.85 +X43.63 Y5.036 +X44.067 Y2.221 +X44.158 Y-2.0 +X44.064 Y-6.221 +X43.634 Y-9.036 +X42.954 Y-11.85 +X42.467 Y-13.257 +X41.833 Y-14.664 +X41.065 Y-15.952 +X39.747 Y-17.478 +X38.251 Y-18.62 +X36.844 Y-19.297 +X35.437 Y-19.714 +X25.587 Y-21.634 +X16.77 Y-23.107 +X12.923 Y-23.626 +X5.887 Y-24.282 +X0.259 Y-24.505 +X-5.369 Y-24.384 +X-9.591 Y-24.014 +X-13.812 Y-23.34 +X-15.268 Y-23.015 +G00 Z5.0 +X-49.65 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.375 F600.0 +X-21.669 +X-22.255 Y-22.828 +X-26.476 Y-21.015 +X-29.045 Y-19.685 +X-49.662 +Y-16.355 +X-34.394 +X-36.326 Y-15.058 +X-39.029 Y-13.025 +X-49.662 +Y-9.828 +X-43.064 +G00 Z5.0 +X46.234 Y-6.537 +Z-3.625 +G01 Z-13.25 F300.0 +X45.959 F600.0 +X45.432 Y-10.443 +X44.691 Y-13.257 +X43.879 Y-15.339 +X42.594 Y-17.478 +X41.412 Y-18.885 +X39.68 Y-20.292 +X38.251 Y-21.072 +X36.844 Y-21.582 +X35.437 Y-21.936 +X29.361 Y-23.015 +X45.672 +X45.886 Y-22.192 +X45.959 Y-21.345 +Y-19.685 +X40.428 +X41.412 Y-18.885 +X42.594 Y-17.478 +X43.269 Y-16.355 +X45.959 +Y-13.025 +X44.752 +X45.432 Y-10.443 +X45.515 Y-9.828 +X45.959 +G00 Z5.0 +X-49.969 Y-1.968 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.942 Y-1.964 F600.0 +X-49.758 Y-2.012 +X-49.662 Y-2.175 +X-49.489 Y-3.407 +X-48.839 Y-4.814 +X-47.583 Y-6.139 +X-40.547 Y-11.883 +X-36.326 Y-15.058 +X-32.105 Y-17.892 +X-29.29 Y-19.558 +X-26.476 Y-21.015 +X-22.255 Y-22.828 +X-18.033 Y-24.175 +X-13.812 Y-25.143 +X-9.591 Y-25.805 +X-6.777 Y-26.09 +X-1.148 Y-26.323 +X4.48 Y-26.217 +X8.811 Y-25.921 +X15.737 Y-25.184 +X24.18 Y-23.935 +X35.437 Y-21.936 +X36.844 Y-21.582 +X38.251 Y-21.072 +X39.68 Y-20.292 +X41.412 Y-18.885 +X42.594 Y-17.478 +X43.879 Y-15.339 +X44.691 Y-13.257 +X45.432 Y-10.443 +X45.959 Y-6.537 +G00 Z5.0 +X-49.937 Y4.702 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.662 F600.0 +X-44.469 +X-42.354 Y6.443 +X-40.136 Y8.165 +X-49.662 +Y11.495 +X-35.643 +X-33.512 Y12.987 +X-30.494 Y14.825 +X-49.662 +Y17.345 +X-49.646 Y17.751 +X-49.596 Y18.155 +X-23.822 +X-22.255 Y18.828 +X-19.441 Y19.769 +X-15.219 Y20.868 +X-11.776 Y21.485 +X-47.465 +G02 X-44.662 Y22.345 I2.803 J-4.14 +G01 X40.959 +G02 X43.762 Y21.485 I0. J-5.0 +G01 X13.062 +X18.551 Y20.804 +X24.18 Y19.935 +X31.215 Y18.712 +X34.095 Y18.155 +X45.893 +X45.942 Y17.751 +X45.959 Y17.345 +Y14.825 +X41.418 +X42.611 Y13.478 +X43.782 Y11.495 +X45.959 +Y8.165 +X44.989 +X45.432 Y6.443 +X45.667 Y4.702 +X45.959 +X46.264 Y2.328 +X46.237 Y2.324 +X46.054 Y2.373 +X45.959 Y2.537 +X45.432 Y6.443 +X44.708 Y9.257 +X43.879 Y11.329 +X42.611 Y13.478 +X41.065 Y15.223 +X39.658 Y16.305 +X38.251 Y17.073 +X36.451 Y17.7 +X31.215 Y18.712 +X24.18 Y19.935 +X18.551 Y20.804 +X11.516 Y21.677 +X5.887 Y22.142 +X0.259 Y22.33 +X-5.369 Y22.185 +X-8.184 Y21.963 +X-10.998 Y21.624 +X-15.219 Y20.868 +X-19.441 Y19.769 +X-22.255 Y18.828 +X-26.476 Y17.015 +X-29.29 Y15.558 +X-33.512 Y12.987 +X-37.733 Y10.031 +X-42.354 Y6.443 +X-47.583 Y2.139 +X-48.839 Y0.814 +X-49.489 Y-0.593 +X-49.662 Y-1.825 +G00 Z5.0 + +( FINISH1 FLOWLINE SRF_MILL1 ) +G00 Z5. +G54 X-34.78 Y-2.436 A-5.546 C-25.602 S600 +G00 Z5 +Z3.573 +X-34.804 Y-2.386 +Z3.0 +G93 +G01 X-34.988 Y-2.0 Z-1.404 F67.8035 +X-35.008 Z-1.403 F30070.6535 +X-31.554 Y-4.825 Z-1.795 F133.9458 +X35.679 Y-4.58 Z-4.595 F8.9164 +X35.585 Y-7.418 Z-4.839 F210.5057 +X-27.8 Y-7.65 Z-2.2 F9.4576 + +G01 X-23.387 Y-10.471 Z-2.632 F53.014 +X35.058 Y-10.258 Z-5.066 F10.2571 + +G01 X27.974 Y-13.122 Z-5.019 F37.2338 +X-17.388 Y-13.287 Z-3.131 F13.2157 + +G01 X0.76 Y-16.059 Z-4.135 F41.8503 +X0.776 Z-4.136 F37454.9529 +G94 +G00 Z0.841 +X0.985 Y-16.495 +Z5.0 +A0. +A-5.545 C-154.392 +X-34.799 Y-1.564 +Z3.574 +X-34.823 Y-1.614 +Z3.0 +G93 +G01 X-35.008 Y-2.0 Z-1.403 F67.8163 +X-34.988 Z-1.404 F29423.1803 +G94 +G00 Z5.0 +X-34.719 Y-1.439 +X36.081 Y1.42 +X35.997 Y1.245 +Z3.0 +G93 +G01 X35.679 Y0.58 Z-4.595 F39.3161 +X-31.555 Y0.825 Z-1.795 F8.9163 +X-27.795 Y3.65 Z-2.2 F127.1152 +X35.584 Y3.419 Z-4.839 F9.4587 +X35.055 Y6.259 Z-5.066 F207.0704 +X-23.392 Y6.472 Z-2.632 F10.2568 + +G01 X-17.387 Y9.288 Z-3.13 F48.707 +X27.971 Y9.122 Z-5.019 F13.2164 + +G01 X0.946 Y12.059 Z-4.142 F41.8071 +X0.933 F48595.8783 +G94 +G00 Z0.835 +X1.142 Y12.494 +Z5.0 +A0. +A-5.546 C-25.605 +X35.967 Y-5.826 +Z3.0 +G93 +G01 Z0.308 F111.4225 +X35.758 Y-5.39 Z-4.669 F60.0 +X35.617 Y-7.15 Z-4.817 F338.6289 +X35.559 Y-7.666 Z-4.86 F1150.293 +X35.426 Y-8.596 Z-4.936 F636.7141 +X35.248 Y-9.519 Z-5.009 C-25.604 F636.0963 +X35.083 Y-10.172 Z-5.059 F889.3249 +X34.778 Y-11.055 Z-5.124 F640.1841 +X34.311 Y-11.886 Z-5.177 C-25.603 F628.3941 +X34.092 Y-12.023 Z-5.18 C-25.601 F2310.4624 +X33.443 Y-12.17 Z-5.166 F900.64 +X29.029 Y-12.939 Z-5.048 F133.8926 +X29.022 Y-12.94 F80597.2105 +X26.511 Y-13.368 Z-4.98 F235.4094 +X26.503 Y-13.37 Z-4.979 F80314.8345 +X21.506 Y-14.178 Z-4.841 F118.4711 +X21.403 Y-14.194 Z-4.838 F5763.6607 +X21.395 Y-14.195 Z-4.837 F80667.8203 +X17.508 Y-14.759 Z-4.724 F152.693 +X14.104 Y-15.192 Z-4.619 F174.7719 +X11.26 Y-15.499 Z-4.526 F209.6045 +X9.011 Y-15.702 Z-4.45 F265.5785 +X6.177 Y-15.898 Z-4.348 C-25.6 F211.0995 +X3.794 Y-16.007 Z-4.258 F251.3505 +X1.432 Y-16.056 Z-4.163 F253.7363 +X-0.929 Y-16.041 Z-4.062 F253.8307 +X-2.816 Y-15.977 Z-3.978 F317.4711 +X-4.897 Y-15.847 Z-3.879 F287.4156 +X-6.745 Y-15.673 Z-3.786 F322.8495 +X-8.428 Y-15.463 Z-3.697 F353.292 +X-10.269 Y-15.171 Z-3.594 F321.5199 +X-11.664 Y-14.903 Z-3.512 F421.6314 +X-12.624 Y-14.693 Z-3.454 F609.4926 +X-13.544 Y-14.471 Z-3.396 F632.3344 +X-14.916 Y-14.101 Z-3.306 C-25.599 F421.4835 +X-16.397 Y-13.643 Z-3.203 F386.2678 +X-17.701 Y-13.182 Z-3.108 F432.6008 +X-18.576 Y-12.84 Z-3.042 F637.0792 +X-19.443 Y-12.475 Z-2.973 F636.1843 +X-20.302 Y-12.088 Z-2.903 F635.2963 +X-21.152 Y-11.68 Z-2.832 F634.4447 +X-21.993 Y-11.251 Z-2.759 F633.5443 +X-23.237 Y-10.571 Z-2.647 F421.7136 +X-24.234 Y-9.988 Z-2.555 F518.1409 +X-25.841 Y-8.981 Z-2.399 F315.2712 +X-27.336 Y-7.975 Z-2.248 F331.8372 +X-28.942 Y-6.827 Z-2.08 F302.8928 +X-30.774 Y-5.444 Z-1.882 F260.388 +X-32.98 Y-3.687 Z-1.636 F211.9425 +X-35.249 Y-1.797 Z-1.375 F202.3508 +X-38.446 Y0.955 Z-1.0 F141.7066 +X-38.78 Y0.578 Z-1.054 A-10.74 C13.027 F22.4123 +X-39.112 Y0.213 Z-1.17 A-17.477 C24.615 F70.0852 +X-36.906 Y-1.699 Z-1.427 A-17.503 C24.226 F188.4925 +X-34.471 Y-3.751 Z-1.708 A-17.558 C23.477 F164.2929 +X-33.011 Y-4.942 Z-1.874 A-17.603 C22.852 F265.6893 +X-33.005 Y-4.947 Z-1.875 C22.849 F70394.9107 +X-31.476 Y-6.157 Z-2.045 A-17.66 C22.041 F248.7184 +X-31.47 Y-6.161 Z-2.046 C22.038 F68631.4436 +X-29.554 Y-7.611 Z-2.253 A-17.746 C20.797 F195.1411 +X-29.348 Y-7.761 Z-2.275 A-17.756 C20.649 F1797.9113 +X-29.343 Y-7.765 Z-2.276 C20.645 F66543.0969 +X-27.769 Y-8.882 Z-2.438 A-17.839 C19.409 F233.7633 +X-27.166 Y-9.292 Z-2.5 A-17.873 C18.889 F604.4541 +X-27.161 Y-9.296 Z-2.501 C18.884 F64698.6016 +X-25.595 Y-10.311 Z-2.654 A-17.969 C17.418 F232.4524 +X-24.895 Y-10.74 Z-2.722 A-18.015 C16.71 F517.268 +X-24.89 Y-10.743 C16.704 F63054.1704 +X-23.728 Y-11.421 Z-2.827 A-18.095 C15.461 F311.5076 +X-22.607 Y-12.035 Z-2.928 A-18.175 C14.184 F322.1328 +X-21.184 Y-12.756 Z-3.05 A-18.279 C12.46 F254.0947 +X-19.76 Y-13.405 Z-3.167 A-18.385 C10.636 F254.7588 +X-18.663 Y-13.854 Z-3.251 A-18.466 C9.205 F334.7184 +X-17.139 Y-14.413 Z-3.363 A-18.569 C7.313 F249.9056 +X-16.286 Y-14.695 Z-3.426 A-18.62 C6.324 F462.6702 +X-16.277 Y-14.699 Z-3.427 C6.314 F41918.854 +X-14.993 Y-15.085 Z-3.514 A-18.692 C4.898 F316.6501 +X-14.98 Y-15.088 Z-3.515 C4.884 F31927.926 +X-13.554 Y-15.465 Z-3.607 A-18.764 C3.41 F295.3307 +X-12.372 Y-15.739 Z-3.681 A-18.817 C2.261 F367.2112 +X-12.359 Y-15.742 Z-3.682 A-18.818 C2.249 F33117.6934 +X-11.055 Y-16.007 Z-3.759 A-18.872 C1.054 F342.4252 +X-11.041 Y-16.01 Z-3.76 C1.042 F33642.7638 +X-9.727 Y-16.24 Z-3.835 A-18.921 C-0.087 F349.1604 +X-9.713 Y-16.242 Z-3.836 C-0.098 F34275.5479 +X-7.901 Y-16.504 Z-3.932 A-18.98 C-1.537 F261.3182 +X-5.885 Y-16.723 Z-4.037 A-19.038 C-2.994 F242.609 +X-4.339 Y-16.846 Z-4.113 A-19.077 C-4.02 F323.8458 +X-4.332 Y-16.847 C-4.025 F72716.2564 +X-2.56 Y-16.944 Z-4.195 A-19.116 C-5.112 F288.1646 +X-1.652 Y-16.976 Z-4.236 A-19.134 C-5.635 F569.5493 +X-1.645 Y-16.977 C-5.638 F74204.6496 +X-0.308 Y-17.005 Z-4.295 A-19.159 C-6.369 F390.5046 +X-0.294 C-6.376 F37412.3791 +X1.028 Y-17.011 Z-4.351 A-19.181 C-7.053 F399.1501 +X1.042 Z-4.352 C-7.06 F37617.142 +X1.902 Y-17.005 Z-4.387 A-19.194 C-7.478 F617.9736 +X1.916 Y-17.004 C-7.485 F37761.9311 +X3.696 Y-16.964 Z-4.457 A-19.218 C-8.296 F300.3514 +X3.71 Z-4.458 C-8.302 F37938.0079 +X5.043 Y-16.912 Z-4.509 A-19.234 C-8.864 F404.0498 +X5.057 Y-16.911 Z-4.51 C-8.87 F38040.7452 +X6.381 Y-16.842 Z-4.559 A-19.248 C-9.392 F408.3066 +X6.388 Z-4.56 C-9.394 F81945.7876 +X8.387 Y-16.707 Z-4.631 A-19.268 C-10.121 F271.2688 +X9.706 Y-16.599 Z-4.679 A-19.279 C-10.562 F413.01 +X9.713 C-10.564 F76540.6667 +X10.605 Y-16.518 Z-4.71 A-19.287 C-10.846 F611.8709 +X10.612 Y-16.517 C-10.848 F76595.176 +X12.957 Y-16.278 Z-4.787 A-19.304 C-11.523 F232.954 +X14.167 Y-16.141 Z-4.826 A-19.311 C-11.837 F453.3627 +X14.174 Y-16.14 C-11.839 F76892.5923 +X16.404 Y-15.864 Z-4.896 A-19.323 C-12.356 F246.3963 +X16.412 Y-15.863 C-12.358 F77033.003 +X16.419 Y-15.862 A-19.324 C-12.359 F76846.0857 +X19.076 Y-15.501 Z-4.977 A-19.335 C-12.889 F207.4732 +X19.083 Y-15.5 C-12.891 F79166.5689 +X21.643 Y-15.122 Z-5.051 A-19.345 C-13.328 F216.1386 +X21.65 Y-15.12 Z-5.052 C-13.329 F78853.9112 +X21.657 Y-15.119 C-13.33 F78871.9501 +X24.185 Y-14.717 Z-5.121 A-19.352 C-13.676 F220.4484 +X24.192 Y-14.716 Z-5.122 C-13.677 F78607.9704 +X25.587 Y-14.484 Z-5.158 A-19.355 C-13.828 F403.3325 +X25.594 Y-14.483 C-13.829 F79100.6761 +X29.561 Y-13.802 Z-5.262 A-19.36 C-14.107 F143.5946 +X29.568 Y-13.801 C-14.108 F78752.201 +X29.59 Y-13.797 C-14.109 F26249.5019 +X29.597 Y-13.796 Z-5.263 F78750.763 +X29.605 Y-13.794 F78733.9557 +X33.166 Y-13.186 Z-5.363 A-19.364 C-14.299 F160.9131 +X33.187 Y-13.182 Z-5.364 A-19.365 C-14.316 F18657.1196 +X33.194 Y-13.181 C-14.322 F56001.4861 +X33.705 Y-13.086 Z-5.376 A-19.381 C-15.203 F566.6445 +X34.257 Y-12.957 Z-5.391 A-19.427 C-18.127 F252.9034 +X34.513 Y-12.876 Z-5.396 A-19.464 C-21.985 F226.0768 +X34.613 Y-12.831 A-19.476 C-25.884 F238.1518 +X34.71 Y-12.78 Z-5.393 A-19.458 C-30.0 F225.2867 +X34.805 Y-12.719 Z-5.39 A-19.412 C-34.115 F223.3174 +X34.908 Y-12.632 Z-5.387 A-19.337 C-38.238 F218.9419 +X35.03 Y-12.505 Z-5.381 A-19.232 C-42.379 F212.3012 +X35.168 Y-12.338 Z-5.373 A-19.112 C-46.185 F223.5377 +X35.327 Y-12.109 Z-5.361 A-18.976 C-49.799 F226.436 +X35.449 Y-11.902 Z-5.349 A-18.873 C-52.236 F323.7952 +X35.577 Y-11.649 Z-5.333 A-18.766 C-54.58 F325.2287 +X35.694 Y-11.383 Z-5.315 A-18.669 C-56.567 F370.2163 +X35.815 Y-11.071 Z-5.293 A-18.571 C-58.477 F371.372 +X35.923 Y-10.757 Z-5.27 A-18.484 C-60.088 F423.853 +X36.081 Y-10.223 Z-5.231 A-18.359 C-62.321 F291.259 +X36.229 Y-9.623 Z-5.185 A-18.242 C-64.299 F308.1906 +X36.392 Y-8.784 Z-5.119 A-18.109 C-66.447 F261.3735 +X36.519 Y-7.934 Z-5.051 A-18.002 C-68.128 F302.5985 +X36.66 Y-6.629 Z-4.943 A-17.877 C-70.05 F231.4025 +X36.719 Y-5.862 Z-4.879 A-17.82 C-70.9 F449.6525 +X36.748 Y-5.442 Z-4.843 F1419.3659 +X37.219 Y-5.458 Z-5.021 A-24.839 C-75.625 F132.422 +X37.664 Y-5.468 Z-5.256 A-31.944 C-78.356 F185.0503 +X37.636 Y-5.889 Z-5.292 F1419.3661 + + + +X37.544 Y-6.965 Z-5.386 A-32.011 C-76.967 F298.9435 +X37.543 Y-6.973 A-32.012 C-76.954 F34171.1882 +X37.452 Y-7.793 Z-5.453 A-32.075 C-75.61 F349.0912 +X37.362 Y-8.45 Z-5.505 A-32.136 C-74.304 F392.1525 +X37.259 Y-9.073 Z-5.553 A-32.204 C-72.825 F372.5773 +X37.143 Y-9.66 Z-5.598 A-32.279 C-71.16 F353.9565 +X37.013 Y-10.209 Z-5.638 A-32.361 C-69.3 F336.1891 +X36.875 Y-10.705 Z-5.673 A-32.445 C-67.295 F329.053 +X36.792 Y-10.971 Z-5.691 A-32.495 C-66.054 F551.7757 +X36.626 Y-11.444 Z-5.724 A-32.596 C-63.47 F275.5648 +X36.464 Y-11.839 Z-5.75 A-32.694 C-60.806 F279.2561 +X36.297 Y-12.186 Z-5.771 A-32.794 C-57.89 F264.893 +X36.127 Y-12.486 Z-5.787 A-32.895 C-54.721 F251.7287 +X35.958 Y-12.741 Z-5.799 A-32.993 C-51.301 F239.5728 +X35.793 Y-12.955 Z-5.806 A-33.085 C-47.642 F228.7055 +X35.7 Y-13.064 Z-5.809 A-33.135 C-45.405 F379.4568 +X35.592 Y-13.178 Z-5.815 A-33.19 C-42.664 F312.5313 +X35.491 Y-13.276 Z-5.818 A-33.236 C-39.931 F316.0508 +X35.374 Y-13.374 Z-5.821 A-33.281 C-36.653 F265.6458 +X35.259 Y-13.457 Z-5.822 A-33.314 C-33.379 F267.6536 +X35.144 Y-13.528 A-33.336 C-30.104 F268.8529 +X35.023 Y-13.593 Z-5.821 A-33.347 C-26.824 F269.2969 +X34.912 Y-13.647 Z-5.822 A-33.345 C-23.714 F285.9558 +X34.784 Y-13.699 Z-5.823 A-33.334 C-20.721 F294.9847 +X34.583 Y-13.764 Z-5.82 A-33.314 C-17.856 F297.6716 +X34.253 Y-13.853 Z-5.814 A-33.288 C-15.132 F294.0354 +X33.915 Y-13.927 Z-5.808 A-33.271 C-13.6 F463.8183 +X33.307 Y-14.043 Z-5.793 A-33.25 C-12.32 F429.7466 +X33.298 Y-14.044 Z-5.792 A-33.249 C-12.313 F44917.8843 +X33.003 Y-14.097 Z-5.783 A-33.25 C-12.218 F1680.6359 +X29.665 Y-14.68 Z-5.695 A-33.247 C-12.104 F173.8324 +X29.658 Y-14.682 F79064.6725 +X25.324 Y-15.411 Z-5.58 A-33.241 C-11.713 F130.9513 +X25.317 Y-15.412 C-11.712 F78232.0091 +X24.423 Y-15.557 Z-5.556 A-33.24 C-11.597 F625.8063 +X24.416 Y-15.558 C-11.596 F78126.8077 +X21.781 Y-15.973 Z-5.482 A-33.235 C-11.189 F211.4375 +X21.774 Y-15.974 Z-5.481 C-11.188 F77993.3993 +X21.767 Y-15.975 C-11.187 F77992.6442 +X19.135 Y-16.364 Z-5.405 A-33.227 C-10.675 F210.2805 +X19.128 Y-16.365 C-10.674 F78064.6272 +X19.121 Y-16.366 Z-5.404 C-10.672 F78042.9192 +X16.478 Y-16.727 Z-5.326 A-33.217 C-10.05 F208.6363 +X16.471 Y-16.728 C-10.048 F78333.0313 +X14.27 Y-17.002 Z-5.257 A-33.206 C-9.443 F250.0814 +X14.263 Y-17.003 C-9.441 F78879.4143 +X11.458 Y-17.31 Z-5.166 A-33.189 C-8.55 F196.6204 +X10.691 Y-17.383 Z-5.142 A-33.184 C-8.282 F717.7179 +X10.684 Y-17.384 C-8.279 F79956.958 +X10.118 Y-17.437 Z-5.122 A-33.18 C-8.074 F972.0319 +X10.111 C-8.071 F79881.3134 +X7.77 Y-17.628 Z-5.037 A-33.162 C-7.156 F236.7256 +X7.763 C-7.153 F80864.0428 +X6.419 Y-17.715 Z-4.988 A-33.151 C-6.577 F412.8991 +X6.412 C-6.574 F81633.3529 +X5.073 Y-17.784 Z-4.937 A-33.139 C-5.96 F415.6555 +X5.065 C-5.956 F72554.7822 +X3.726 Y-17.836 Z-4.885 A-33.125 C-5.301 F416.8307 +X3.712 Y-17.837 Z-4.884 C-5.294 F41306.2946 +X1.68 Y-17.879 Z-4.806 A-33.101 C-4.215 F275.9724 +X1.674 C-4.211 F83867.1749 +X1.026 Y-17.884 Z-4.781 A-33.093 C-3.845 F865.5121 +X1.02 C-3.842 F83752.362 +X-0.329 Y-17.879 Z-4.725 A-33.073 C-3.043 F415.7648 +X-0.335 Z-4.724 C-3.039 F84821.141 +X-1.689 Y-17.852 Z-4.667 A-33.052 C-2.186 F413.0057 +X-1.696 Z-4.666 A-33.051 C-2.181 F85106.5934 +X-3.732 Y-17.766 Z-4.575 A-33.015 C-0.794 F272.181 +X-4.42 Y-17.723 Z-4.544 A-33.002 C-0.295 F799.0507 +X-4.426 A-33.001 C-0.29 F85128.9864 +X-5.786 Y-17.617 Z-4.479 A-32.973 C0.744 F399.1059 +X-5.792 Y-17.616 C0.749 F84590.4528 +X-7.02 Y-17.495 Z-4.416 A-32.946 C1.742 F434.2244 +X-8.628 Y-17.293 Z-4.329 A-32.907 C3.135 F323.2627 +X-9.863 Y-17.102 Z-4.259 A-32.874 C4.282 F409.6405 +X-9.873 Y-17.1 C4.292 F50122.4057 +X-11.223 Y-16.862 Z-4.181 A-32.833 C5.617 F364.0343 +X-11.235 Y-16.86 Z-4.18 A-32.832 C5.629 F41166.2767 +X-12.576 Y-16.59 Z-4.103 A-32.786 C7.025 F355.005 +X-12.587 Y-16.588 Z-4.102 A-32.785 C7.037 F40521.3382 +X-13.914 Y-16.284 Z-4.024 A-32.733 C8.505 F345.9229 +X-13.925 Y-16.281 Z-4.023 C8.519 F39407.9805 +X-15.249 Y-15.936 Z-3.942 A-32.675 C10.079 F332.7357 +X-15.26 Y-15.933 Z-3.941 C10.093 F38254.0218 +X-16.564 Y-15.548 Z-3.857 A-32.613 C11.73 F323.2848 +X-16.575 Y-15.544 Z-3.856 A-32.612 C11.744 F37056.9146 +X-17.627 Y-15.2 Z-3.778 A-32.559 C13.14 F384.7473 +X-18.323 Y-14.951 Z-3.727 A-32.521 C14.098 F564.8027 +X-19.418 Y-14.52 Z-3.647 A-32.46 C15.66 F345.3703 +X-19.424 Y-14.518 C15.667 F71772.9301 +X-20.252 Y-14.166 Z-3.58 A-32.412 C16.877 F443.3001 +X-20.257 Y-14.163 Z-3.579 C16.884 F70343.8706 +X-21.031 Y-13.815 Z-3.51 A-32.366 C18.021 F464.2404 +X-22.66 Y-13.019 Z-3.373 A-32.266 C20.329 F215.3243 +X-22.954 Y-12.869 Z-3.352 A-32.247 C20.715 F1209.5244 +X-22.959 Y-12.866 C20.721 F74883.8135 +X-23.638 Y-12.513 Z-3.295 A-32.206 C21.584 F523.6539 +X-24.343 Y-12.124 Z-3.235 A-32.164 C22.462 F498.5599 +X-25.389 Y-11.508 Z-3.145 A-32.106 C23.719 F332.2491 +X-25.394 Y-11.505 A-32.105 C23.725 F63651.5752 +X-26.552 Y-10.783 Z-3.032 A-32.045 C25.033 F298.9598 +X-26.557 Y-10.78 C25.039 F64113.5367 +X-27.686 Y-10.037 Z-2.918 A-31.99 C26.218 F307.2558 +X-27.697 Y-10.029 Z-2.917 C26.228 F31931.9339 +X-28.806 Y-9.268 Z-2.804 A-31.939 C27.283 F315.3517 +X-28.816 Y-9.26 Z-2.803 C27.293 F32281.1645 +X-29.911 Y-8.481 Z-2.691 A-31.891 C28.233 F323.063 +X-29.917 Y-8.478 C28.237 F70516.0537 +X-30.995 Y-7.682 Z-2.578 A-31.848 C29.075 F331.1271 +X-31.0 Y-7.678 Z-2.577 C29.079 F66937.9958 +X-32.066 Y-6.864 Z-2.462 A-31.811 C29.821 F338.6774 +X-32.071 Y-6.859 C29.824 F67492.5695 +X-33.358 Y-5.845 Z-2.319 A-31.771 C30.606 F284.4992 +X-33.364 Y-5.84 Z-2.318 C30.609 F68393.3007 +X-35.204 Y-4.34 Z-2.106 A-31.725 C31.511 F203.7369 +X-36.211 Y-3.498 Z-1.99 A-31.705 C31.902 F382.8171 +X-36.217 Y-3.493 Z-1.989 C31.904 F71251.9807 +X-37.675 Y-2.253 Z-1.821 A-31.681 C32.348 F270.8197 +X-37.68 Y-2.248 Z-1.82 C32.349 F73604.9519 +X-39.747 Y-0.46 Z-1.58 A-31.661 C32.752 F198.4906 +X-40.04 Y-0.758 Z-1.868 A-38.849 C34.709 F281.8183 +X-40.31 Y-1.021 Z-2.208 A-46.062 C36.136 F329.8521 +X-38.322 Y-2.741 Z-2.441 A-46.074 C35.738 F206.3467 +X-38.311 Y-2.75 Z-2.442 A-46.075 C35.735 F38244.0083 +X-36.775 Y-4.058 Z-2.618 A-46.091 C35.255 F256.786 +X-36.77 Y-4.062 Z-2.619 C35.253 F73871.0274 +X-35.75 Y-4.914 Z-2.735 A-46.104 C34.845 F376.8494 +X-35.745 Y-4.918 C34.843 F73212.7266 +X-34.127 Y-6.236 Z-2.92 A-46.131 C34.04 F232.3329 +X-34.122 Y-6.24 C34.037 F71366.4999 +X-32.61 Y-7.434 Z-3.087 A-46.161 C33.104 F241.8259 +X-32.605 Y-7.438 Z-3.088 C33.1 F70524.3015 +X-31.216 Y-8.496 Z-3.235 A-46.194 C32.082 F257.6789 +X-30.454 Y-9.057 Z-3.316 A-46.215 C31.458 F462.8026 +X-30.447 Y-9.062 Z-3.317 C31.452 F49965.7061 +X-29.344 Y-9.849 Z-3.429 A-46.246 C30.47 F317.2802 +X-29.334 Y-9.856 Z-3.43 A-46.247 C30.46 F34291.2369 +X-28.21 Y-10.626 Z-3.542 A-46.28 C29.363 F308.4366 +X-28.2 Y-10.633 Z-3.543 A-46.281 C29.353 F34050.2974 +X-27.04 Y-11.392 Z-3.656 A-46.318 C28.12 F296.5991 +X-27.029 Y-11.398 C28.109 F33791.9849 +X-25.851 Y-12.128 Z-3.767 A-46.359 C26.753 F290.2231 +X-25.841 Y-12.134 Z-3.768 C26.741 F33588.3321 +X-24.784 Y-12.76 Z-3.858 A-46.398 C25.434 F320.8149 +X-23.417 Y-13.506 Z-3.979 A-46.45 C23.631 F248.0707 +X-23.376 Y-13.527 Z-3.983 A-46.452 C23.576 F8360.5583 +X-23.366 Y-13.532 Z-3.984 C23.562 F33453.0827 +X-22.213 Y-14.117 Z-4.077 A-46.499 C21.935 F292.4422 +X-20.928 Y-14.709 Z-4.179 A-46.552 C20.025 F262.735 +X-19.369 Y-15.359 Z-4.295 A-46.614 C17.681 F220.1932 +X-18.023 Y-15.862 Z-4.391 A-46.662 C15.748 F264.1725 +X-16.858 Y-16.245 Z-4.478 A-46.701 C14.153 F315.8536 +X-16.847 Y-16.248 Z-4.479 C14.138 F34071.0353 +X-15.518 Y-16.647 Z-4.567 A-46.742 C12.404 F285.3752 +X-15.507 Y-16.65 Z-4.568 C12.39 F34461.9988 +X-14.171 Y-17.004 Z-4.651 A-46.779 C10.744 F293.4447 +X-14.16 Y-17.006 Z-4.652 A-46.78 C10.731 F34896.7757 +X-12.806 Y-17.32 Z-4.732 A-46.814 C9.16 F298.9093 +X-12.794 Y-17.323 Z-4.733 A-46.815 C9.147 F35359.3946 +X-11.437 Y-17.596 Z-4.81 A-46.846 C7.667 F307.2577 +X-11.425 Y-17.599 C7.655 F35849.3548 +X-10.055 Y-17.836 Z-4.885 A-46.875 C6.252 F313.0608 +X-10.043 Y-17.838 A-46.876 C6.24 F35861.5855 +X-8.485 Y-18.067 Z-4.966 A-46.905 C4.748 F282.7262 +X-6.857 Y-18.26 Z-5.05 A-46.931 C3.298 F277.9791 +X-5.9 Y-18.352 Z-5.099 A-46.945 C2.493 F481.4692 +X-5.894 Y-18.353 Z-5.1 A-46.946 C2.488 F74542.5454 +X-4.516 Y-18.461 Z-5.166 A-46.964 C1.386 F339.6698 +X-4.51 Y-18.462 C1.381 F75020.8113 +X-3.139 Y-18.542 Z-5.23 A-46.982 C0.351 F347.1537 +X-3.133 C0.346 F75668.6339 +X-1.761 Y-18.595 Z-5.291 A-46.997 C-0.624 F352.0233 +X-1.748 Y-18.596 C-0.633 F37805.1592 +X-0.399 Y-18.624 Z-5.349 A-47.011 C-1.53 F362.5173 +X-0.386 A-47.012 C-1.538 F37980.4391 +X0.979 Y-18.63 Z-5.406 A-47.025 C-2.391 F362.5842 +X0.992 C-2.399 F38241.5389 +X1.857 Y-18.623 Z-5.44 A-47.032 C-2.912 F577.5032 +X1.87 C-2.919 F38388.1065 +X3.713 Y-18.582 Z-5.51 A-47.047 C-3.946 F273.1492 +X3.727 Y-18.581 C-3.953 F38257.4062 +X5.07 Y-18.528 Z-5.561 A-47.057 C-4.647 F378.5099 +X5.084 Y-18.527 C-4.653 F38130.9038 +X6.431 Y-18.456 Z-5.61 A-47.066 C-5.305 F380.1106 +X6.444 Y-18.455 Z-5.611 C-5.312 F38225.0163 +X7.789 Y-18.368 Z-5.659 A-47.074 C-5.921 F383.0874 +X7.803 Y-18.367 C-5.927 F38430.6926 +X9.849 Y-18.202 Z-5.733 A-47.084 C-6.78 F253.2541 +X9.863 Y-18.201 C-6.786 F38254.6718 +X10.721 Y-18.122 Z-5.764 A-47.088 C-7.118 F608.1683 +X10.735 Y-18.121 C-7.123 F38422.352 +X13.779 Y-17.806 Z-5.863 A-47.1 C-8.188 F172.0994 +X14.312 Y-17.743 Z-5.881 A-47.102 C-8.357 F991.0708 +X14.318 Y-17.742 C-8.359 F84792.1044 +X16.538 Y-17.466 Z-5.95 A-47.109 C-9.005 F238.8988 +X16.545 Y-17.465 C-9.007 F76865.0311 +X19.208 Y-17.101 Z-6.029 A-47.117 C-9.672 F200.626 +X19.215 Y-17.1 C-9.673 F77471.3088 +X21.858 Y-16.709 Z-6.105 A-47.122 C-10.22 F204.3025 +X21.866 Y-16.707 C-10.221 F66660.709 +X24.513 Y-16.29 Z-6.179 A-47.126 C-10.656 F206.5565 +X24.52 Y-16.288 C-10.657 F77751.151 +X25.89 Y-16.065 Z-6.216 A-47.128 C-10.84 F403.5117 +X25.897 Y-16.064 C-10.841 F78240.0807 +X29.725 Y-15.418 Z-6.316 A-47.132 C-11.198 F146.6173 +X29.732 Y-15.417 Z-6.317 F79299.3869 +X33.28 Y-14.799 Z-6.412 A-47.133 C-11.349 F162.229 +X33.363 Y-14.783 Z-6.415 A-47.134 C-11.389 F5400.0917 +X33.374 Y-14.781 C-11.397 F38938.8101 +X33.604 Y-14.74 Z-6.421 A-47.136 C-11.658 F1493.1865 +X33.805 Y-14.703 Z-6.426 A-47.139 C-12.035 F1341.3573 +X34.143 Y-14.634 Z-6.433 A-47.152 C-13.173 F552.5815 +X34.418 Y-14.572 Z-6.438 A-47.162 C-14.545 F509.7675 +X34.736 Y-14.488 Z-6.443 A-47.176 C-16.909 F319.2313 +X34.809 Y-14.466 A-47.179 C-17.636 F1082.5698 +X34.998 Y-14.404 Z-6.445 A-47.189 C-19.954 F347.7844 +X35.137 Y-14.351 Z-6.446 A-47.195 C-22.271 F357.3932 +X35.251 Y-14.301 A-47.199 C-24.59 F362.3073 +X35.361 Y-14.248 C-26.909 F361.9779 +X35.531 Y-14.155 A-47.191 C-30.476 F233.8107 +X35.693 Y-14.052 Z-6.445 A-47.176 C-34.044 F232.8385 +X35.808 Y-13.969 Z-6.444 A-47.16 C-36.611 F321.7058 +X35.924 Y-13.877 Z-6.443 A-47.14 C-39.177 F319.88 +X36.008 Y-13.805 Z-6.441 A-47.122 C-41.032 F439.7085 +X36.093 Y-13.725 Z-6.44 A-47.102 C-42.888 F436.8033 +X36.179 Y-13.639 Z-6.437 A-47.08 C-44.745 F433.438 +X36.268 Y-13.545 Z-6.433 A-47.056 C-46.603 F429.6249 +X36.419 Y-13.364 Z-6.429 A-47.011 C-49.699 F254.7345 +X36.574 Y-13.162 Z-6.423 A-46.963 C-52.682 F260.1673 +X36.726 Y-12.94 Z-6.415 A-46.914 C-55.464 F273.9237 +X36.88 Y-12.687 Z-6.405 A-46.861 C-58.157 F277.6352 +X37.034 Y-12.401 Z-6.392 A-46.807 C-60.748 F282.354 +X37.187 Y-12.08 Z-6.375 A-46.751 C-63.226 F288.1607 +X37.337 Y-11.72 Z-6.354 A-46.695 C-65.582 F295.1341 +X37.483 Y-11.32 Z-6.329 A-46.64 C-67.806 F303.319 +X37.623 Y-10.881 Z-6.3 A-46.587 C-69.892 F312.7244 +X37.756 Y-10.4 Z-6.267 A-46.535 C-71.835 F323.3383 +X37.882 Y-9.88 Z-6.23 A-46.485 C-73.633 F335.1347 +X37.997 Y-9.319 Z-6.19 A-46.438 C-75.284 F348.089 +X38.072 Y-8.908 Z-6.16 A-46.407 C-76.344 F518.6323 +X38.165 Y-8.322 Z-6.117 A-46.367 C-77.674 F394.9053 +X38.257 Y-7.616 Z-6.063 A-46.326 C-79.033 F361.9939 +X38.335 Y-6.878 Z-6.004 A-46.29 C-80.214 F384.1981 +X38.42 Y-5.888 Z-5.92 A-46.251 C-81.508 F317.4246 +X38.449 Y-5.468 Z-5.885 F1419.3659 +X38.775 Y-5.457 Z-6.268 A-53.428 C-82.554 F265.5738 +X39.053 Y-5.441 Z-6.688 A-60.613 C-83.421 F275.6536 +X39.025 Y-5.861 Z-6.723 F1419.3645 +X38.98 Y-6.442 Z-6.769 A-60.623 C-82.693 F554.6493 +X38.931 Y-6.98 Z-6.812 A-60.634 C-81.928 F564.1821 +X38.866 Y-7.593 Z-6.859 A-60.648 C-80.932 F462.4696 +X38.792 Y-8.174 Z-6.902 A-60.663 C-79.842 F451.778 +X38.711 Y-8.724 Z-6.942 A-60.68 C-78.654 F439.7143 +X38.621 Y-9.244 Z-6.979 A-60.698 C-77.366 F428.2316 +X38.524 Y-9.735 Z-7.012 A-60.718 C-75.98 F417.5249 +X38.45 Y-10.07 Z-7.033 A-60.732 C-74.929 F569.7774 +X38.378 Y-10.371 Z-7.053 A-60.745 C-73.906 F601.5943 +X38.303 Y-10.655 Z-7.071 A-60.758 C-72.854 F599.0325 +X38.227 Y-10.925 Z-7.088 A-60.772 C-71.771 F596.5131 +X38.15 Y-11.179 Z-7.103 A-60.785 C-70.66 F594.0105 +X38.023 Y-11.561 Z-7.126 A-60.807 C-68.812 F366.8843 +X37.891 Y-11.913 Z-7.145 A-60.829 C-66.873 F360.4892 +X37.757 Y-12.236 Z-7.162 A-60.851 C-64.842 F353.7602 +X37.619 Y-12.533 Z-7.176 A-60.874 C-62.723 F347.5899 +X37.48 Y-12.804 Z-7.187 A-60.896 C-60.519 F341.9823 +X37.34 Y-13.051 Z-7.196 A-60.918 C-58.236 F336.9492 +X37.198 Y-13.276 Z-7.203 A-60.939 C-55.881 F332.4828 +X37.057 Y-13.481 Z-7.208 A-60.959 C-53.458 F328.5806 +X36.916 Y-13.668 Z-7.213 A-60.977 C-50.975 F325.2193 +X36.825 Y-13.779 Z-7.216 A-60.989 C-49.349 F501.7713 +X36.72 Y-13.898 Z-7.219 A-61.002 C-47.449 F433.2007 +X36.618 Y-14.009 Z-7.222 A-61.013 C-45.551 F437.2673 +X36.518 Y-14.11 Z-7.224 A-61.024 C-43.654 F440.8412 +X36.417 Y-14.204 Z-7.225 A-61.033 C-41.758 F443.9005 +X36.279 Y-14.322 Z-7.226 A-61.045 C-39.145 F324.4146 +X36.008 Y-14.52 A-61.061 C-34.169 F171.9665 +X35.872 Y-14.606 Z-7.227 A-61.066 C-31.688 F347.5214 +X35.746 Y-14.68 Z-7.229 A-61.07 C-29.309 F365.4819 +X35.563 Y-14.777 Z-7.231 A-61.072 C-25.839 F252.2788 +X35.471 Y-14.82 C-24.197 F533.3626 +X35.377 Y-14.861 A-61.071 C-22.62 F553.5195 +X35.206 Y-14.928 Z-7.23 A-61.067 C-20.106 F344.6814 +X35.001 Y-14.996 Z-7.228 A-61.063 C-17.71 F354.7837 +X34.745 Y-15.07 Z-7.224 A-61.056 C-15.462 F365.8149 +X34.524 Y-15.129 Z-7.221 A-61.051 C-13.985 F532.6662 +X34.275 Y-15.188 Z-7.216 A-61.047 C-12.737 F595.2022 +X33.893 Y-15.265 Z-7.209 A-61.042 C-11.5 F532.4306 +X33.506 Y-15.333 Z-7.201 A-61.039 C-10.885 F793.5411 +X33.498 Y-15.334 C-10.879 F50154.4319 +X33.195 Y-15.391 Z-7.191 C-10.755 F1575.4196 +X29.913 Y-15.962 Z-7.103 A-61.038 C-10.63 F176.5994 +X29.9 Y-15.965 C-10.629 F42542.5036 +X26.779 Y-16.495 Z-7.02 A-61.037 C-10.365 F182.3113 +X26.773 Y-16.496 C-10.364 F83459.4164 +X24.608 Y-16.852 Z-6.961 A-61.036 C-10.067 F258.2763 +X24.599 Y-16.853 C-10.066 F58724.4659 +X21.931 Y-17.274 Z-6.887 A-61.034 C-9.616 F208.5698 +X21.924 Y-17.275 C-9.614 F79934.3571 +X19.269 Y-17.669 Z-6.811 A-61.031 C-9.046 F208.4431 +X19.262 Y-17.67 C-9.045 F80443.8234 +X16.601 Y-18.033 Z-6.732 A-61.027 C-8.355 F207.653 +X16.595 C-8.353 F81313.7713 +X16.588 Y-18.034 C-8.351 F81309.7105 +X14.369 Y-18.311 Z-6.663 A-61.024 C-7.684 F249.2252 +X14.362 Y-18.312 C-7.682 F82284.8343 +X12.561 Y-18.513 Z-6.606 A-61.021 C-7.072 F307.6436 +X12.554 Y-18.514 C-7.07 F83314.7047 +X10.754 Y-18.694 Z-6.547 A-61.017 C-6.397 F309.3992 +X10.747 C-6.395 F84593.3407 +X9.368 Y-18.818 Z-6.5 A-61.014 C-5.834 F405.2861 +X9.361 C-5.831 F85979.0803 +X7.819 Y-18.938 Z-6.446 A-61.01 C-5.158 F365.2702 +X7.812 Z-6.445 C-5.155 F80923.8551 +X6.448 Y-19.027 Z-6.397 A-61.006 C-4.517 F415.7981 +X6.441 C-4.514 F88407.8337 +X3.92 Y-19.148 Z-6.304 A-60.998 C-3.223 F228.9295 +X3.705 Y-19.154 Z-6.297 A-60.997 C-3.105 F2691.2956 +X3.699 Z-6.296 C-3.102 F91855.7495 +X2.197 Y-19.191 Z-6.238 A-60.991 C-2.245 F389.3566 +X2.188 C-2.24 F69988.6976 +X0.963 Y-19.203 Z-6.189 A-60.986 C-1.495 F482.298 +X0.951 Z-6.188 C-1.487 F47710.8042 +X-0.411 Y-19.197 Z-6.132 A-60.98 C-0.61 F436.0987 +X-0.423 Z-6.131 C-0.602 F48270.9867 +X-1.794 Y-19.168 Z-6.073 A-60.973 C0.335 F427.1476 +X-1.806 Y-19.167 C0.344 F47928.5588 +X-3.186 Y-19.113 Z-6.012 A-60.965 C1.346 F416.3592 +X-3.198 C1.355 F47810.6549 +X-4.578 Y-19.033 Z-5.95 A-60.957 C2.419 F407.797 +X-4.59 Y-19.032 Z-5.949 C2.428 F47360.0821 +X-6.256 Y-18.9 Z-5.87 A-60.945 C3.802 F328.4067 +X-7.746 Y-18.745 Z-5.797 A-60.934 C5.116 F356.7463 +X-9.21 Y-18.556 Z-5.723 A-60.922 C6.494 F351.9355 +X-10.181 Y-18.404 Z-5.674 A-60.913 C7.457 F517.8373 +X-10.192 Y-18.402 Z-5.673 C7.469 F44555.8611 +X-11.574 Y-18.161 Z-5.599 A-60.9 C8.911 F352.6112 +X-11.579 Y-18.16 Z-5.598 C8.917 F87718.0257 +X-12.964 Y-17.88 Z-5.52 A-60.885 C10.453 F339.122 +X-12.969 Y-17.879 C10.459 F85782.7641 +X-14.317 Y-17.565 Z-5.44 A-60.869 C12.047 F335.0615 +X-14.349 Y-17.557 Z-5.438 A-60.868 C12.086 F13999.6022 +X-14.354 Y-17.556 C12.093 F84011.1176 +X-15.551 Y-17.243 Z-5.364 A-60.852 C13.588 F362.7829 +X-15.713 Y-17.196 Z-5.355 A-60.85 C13.796 F2646.4588 +X-15.724 Y-17.193 Z-5.354 C13.81 F39758.9785 +X-16.398 Y-17.002 Z-5.31 A-60.84 C14.692 F625.0047 +X-17.084 Y-16.786 Z-5.268 A-60.83 C15.604 F601.5538 +X-17.09 Y-16.784 Z-5.267 C15.613 F63001.1076 +X-17.895 Y-16.524 Z-5.211 A-60.817 C16.715 F500.565 +X-19.154 Y-16.075 Z-5.125 A-60.796 C18.545 F305.6184 +X-20.397 Y-15.582 Z-5.037 A-60.773 C20.431 F296.2847 +X-21.643 Y-15.039 Z-4.943 A-60.749 C22.324 F286.9399 +X-22.777 Y-14.498 Z-4.854 A-60.727 C23.99 F310.3359 +X-23.756 Y-14.0 Z-4.775 A-60.709 C25.372 F356.1222 +X-25.023 Y-13.309 Z-4.668 A-60.686 C27.073 F272.4831 +X-26.205 Y-12.613 Z-4.566 A-60.665 C28.562 F290.2371 +X-26.216 Y-12.607 Z-4.565 C28.574 F34291.239 +X-27.411 Y-11.866 Z-4.455 A-60.645 C29.971 F287.4056 +X-27.421 Y-11.86 Z-4.454 C29.982 F34155.536 +X-28.583 Y-11.101 Z-4.344 A-60.627 C31.237 F296.1973 +X-28.593 Y-11.094 Z-4.343 C31.248 F34188.6906 +X-29.721 Y-10.321 Z-4.233 A-60.61 C32.375 F305.6994 +X-29.727 Y-10.318 C32.38 F63053.7417 +X-30.852 Y-9.513 Z-4.117 A-60.596 C33.388 F310.1096 +X-30.862 Y-9.505 Z-4.116 A-60.595 C33.397 F34020.9984 +X-31.946 Y-8.704 Z-4.006 A-60.581 C34.284 F324.0524 +X-31.951 Y-8.7 Z-4.005 C34.288 F72978.8395 +X-33.034 Y-7.872 Z-3.89 A-60.569 C35.073 F329.1088 +X-33.04 Y-7.868 C35.077 F62222.4015 +X-34.098 Y-7.036 Z-3.774 A-60.559 C35.76 F341.0577 +X-34.108 Y-7.027 Z-3.773 C35.766 F34696.11 +X-34.977 Y-6.33 Z-3.677 A-60.552 C36.267 F421.1409 +X-34.987 Y-6.322 Z-3.676 C36.273 F36367.7857 +X-36.184 Y-5.342 Z-3.542 A-60.542 C36.857 F311.9864 +X-36.189 Y-5.337 C36.86 F70301.6143 +X-37.217 Y-4.479 Z-3.425 A-60.535 C37.276 F371.4975 +X-37.222 Y-4.474 Z-3.424 C37.278 F73322.6335 +X-38.421 Y-3.456 Z-3.287 A-60.528 C37.673 F325.3826 +X-38.431 Y-3.447 Z-3.286 C37.676 F37274.5034 +X-38.956 Y-2.998 Z-3.225 A-60.526 C37.818 F759.0196 +X-38.967 Y-2.989 Z-3.224 C37.821 F37187.3679 +X-40.764 Y-1.433 Z-3.013 A-60.522 C38.176 F227.3148 +X-40.941 Y-1.574 Z-3.468 A-67.759 C38.975 F384.1471 +X-41.08 Y-1.669 Z-3.946 A-74.999 C39.696 F382.9626 +X-39.153 Y-3.337 Z-4.171 A-74.998 C39.303 F212.0877 +X-38.684 Y-3.738 Z-4.225 C39.172 F846.417 +X-38.676 Y-3.746 Z-4.226 C39.169 F46747.9732 +X-37.581 Y-4.674 Z-4.351 C38.804 F356.4558 +X-37.576 Y-4.678 C38.802 F76055.0756 +X-36.499 Y-5.579 Z-4.473 C38.36 F353.799 +X-36.494 Y-5.583 Z-4.474 C38.357 F74736.3311 +X-35.438 Y-6.451 Z-4.591 A-74.999 C37.839 F352.9047 +X-35.433 Y-6.455 C37.837 F74796.8751 +X-34.127 Y-7.505 Z-4.733 A-75.0 C37.077 F279.1998 +X-32.874 Y-8.483 Z-4.866 C36.222 F284.8366 +X-31.645 Y-9.41 Z-4.994 A-74.999 C35.265 F285.301 +X-30.435 Y-10.289 Z-5.116 C34.207 F285.7355 +X-29.349 Y-11.047 Z-5.221 A-75.0 C33.159 F314.0017 +X-28.288 Y-11.758 Z-5.322 A-74.999 C32.048 F318.4122 +X-27.103 Y-12.515 Z-5.432 C30.704 F282.7635 +X-25.92 Y-13.23 Z-5.538 C29.254 F280.9217 +X-24.742 Y-13.899 Z-5.638 C27.708 F280.4628 +X-23.308 Y-14.655 Z-5.749 A-75.0 C25.71 F230.2239 +X-22.062 Y-15.259 Z-5.842 A-75.001 C23.868 F264.2997 +X-20.825 Y-15.809 Z-5.936 A-75.0 C21.975 F267.544 +X-19.571 Y-16.317 Z-6.027 A-74.999 C20.064 F269.1347 +X-18.291 Y-16.784 Z-6.116 C18.176 F271.772 +X-16.983 Y-17.215 Z-6.2 C16.334 F274.9918 +X-15.644 Y-17.608 Z-6.281 C14.553 F278.467 +X-14.282 Y-17.962 Z-6.359 C12.846 F283.2289 +X-12.885 Y-18.278 Z-6.437 A-75.0 C11.199 F285.3867 +X-11.468 Y-18.561 Z-6.513 C9.625 F289.7023 +X-10.022 Y-18.807 Z-6.591 C8.108 F291.4419 +X-8.134 Y-19.072 Z-6.691 A-74.999 C6.249 F229.3717 +X-6.275 Y-19.272 Z-6.783 C4.562 F240.0092 +X-4.708 Y-19.398 Z-6.855 C3.244 F291.4717 +X-2.694 Y-19.508 Z-6.943 C1.679 F231.824 +X-0.34 Y-19.568 Z-7.04 C0.016 F202.7256 +X1.716 Y-19.567 Z-7.122 A-75.0 C-1.304 F236.3394 +X4.177 Y-19.505 Z-7.218 A-74.999 C-2.739 F200.3446 +X6.45 Y-19.395 Z-7.302 C-3.923 F220.1145 +X8.969 Y-19.219 Z-7.388 C-5.094 F200.967 +X11.081 Y-19.032 Z-7.458 C-5.973 F242.1594 +X11.088 Y-19.031 Z-7.459 C-5.976 F78141.9126 +X14.161 Y-18.706 Z-7.557 A-75.0 C-7.095 F167.8722 +X17.009 Y-18.352 Z-7.644 A-74.999 C-7.97 F183.4418 +X20.007 Y-17.935 Z-7.731 A-75.0 C-8.735 F176.4276 +X23.297 Y-17.434 Z-7.824 C-9.403 F163.0077 +X25.081 Y-17.146 Z-7.874 C-9.687 F305.5378 +X25.089 Y-17.145 C-9.688 F72101.8178 +X27.578 Y-16.731 Z-7.941 C-10.003 F221.7181 +X27.584 Y-16.73 Z-7.942 F84684.4643 +X30.286 Y-16.268 Z-8.014 C-10.223 F208.4944 +X30.294 Y-16.267 C-10.224 F79538.8213 +X33.398 Y-15.726 Z-8.097 C-10.358 F185.1401 +X33.937 Y-15.628 Z-8.109 C-11.091 F578.7385 +X34.241 Y-15.568 Z-8.116 C-12.013 F646.305 +X34.477 Y-15.517 Z-8.12 A-74.999 C-13.02 F651.2559 +X34.798 Y-15.438 Z-8.123 A-75.0 C-14.992 F359.455 +X34.97 Y-15.39 C-16.367 F538.2319 +X35.123 Y-15.344 Z-8.124 C-17.787 F530.5652 +X35.261 Y-15.298 Z-8.125 C-19.262 F518.7803 +X35.387 Y-15.252 Z-8.126 C-20.781 F510.1392 +X35.501 Y-15.207 C-22.342 F500.9868 +X35.608 Y-15.161 Z-8.127 C-23.944 F491.2967 +X35.76 Y-15.09 C-26.43 F317.9103 +X35.906 Y-15.013 Z-8.126 C-28.96 F312.6826 +X36.052 Y-14.928 Z-8.125 C-31.499 F310.2788 +X36.224 Y-14.817 Z-8.126 C-34.374 F271.7344 +X36.552 Y-14.569 Z-8.127 C-39.914 F139.7904 +X36.657 Y-14.478 Z-8.126 C-41.76 F418.3777 +X36.793 Y-14.351 C-44.152 F321.2767 +X36.929 Y-14.212 Z-8.124 C-46.531 F320.9285 +X37.081 Y-14.044 Z-8.121 C-49.145 F289.6916 +X37.176 Y-13.93 Z-8.119 C-50.756 F466.542 +X37.27 Y-13.811 Z-8.117 C-52.339 F472.0897 +X37.363 Y-13.686 Z-8.115 C-53.894 F477.4384 +X37.455 Y-13.555 Z-8.113 C-55.423 F482.5865 +X37.589 Y-13.351 Z-8.108 C-57.601 F335.4037 +X37.722 Y-13.129 Z-8.103 C-59.736 F338.0641 +X37.855 Y-12.887 Z-8.095 C-61.825 F340.8092 +X37.987 Y-12.625 Z-8.086 A-74.999 C-63.863 F344.0682 +X38.117 Y-12.339 Z-8.075 C-65.843 F347.9037 +X38.247 Y-12.028 Z-8.061 C-67.762 F352.3241 +X38.373 Y-11.691 Z-8.044 A-75.0 C-69.613 F357.3551 +X38.496 Y-11.327 Z-8.025 C-71.394 F363.0153 +X38.616 Y-10.935 Z-8.004 C-73.099 F369.3103 +X38.73 Y-10.515 Z-7.979 C-74.725 F376.2405 +X38.834 Y-10.084 Z-7.954 C-76.208 F400.3268 +X38.901 Y-9.779 Z-7.935 C-77.163 F605.0677 +X38.967 Y-9.454 Z-7.915 C-78.107 F598.6443 +X39.062 Y-8.925 Z-7.88 A-74.999 C-79.489 F394.9278 +X39.15 Y-8.357 Z-7.841 C-80.783 F401.8132 +X39.23 Y-7.753 Z-7.798 C-81.975 F412.7602 +X39.301 Y-7.115 Z-7.75 A-75.0 C-83.062 F424.7376 +X39.363 Y-6.445 Z-7.7 C-84.044 F439.1416 +X39.411 Y-5.808 Z-7.651 C-84.852 F496.7039 +X39.439 Y-5.388 Z-7.615 F1419.3661 +G94 +G00 Z-6.321 +X44.25 Y-5.821 +Z5.0 +(A0.) +A-75.0 C33.636 +X-32.508 Y-14.734 +Z3.0 +G93 +G01 Z-3.879 F43.6112 +X-29.833 Y-10.713 Z-5.173 F60.0 +X-31.523 Y-9.555 C35.141 F205.2094 +X-33.178 Y-8.362 C36.405 F214.0752 +X-34.818 Y-7.128 C37.447 F221.8038 +X-36.446 Y-5.861 C38.283 F230.2922 +X-38.274 Y-4.399 A-74.999 C38.996 F212.5441 +X-40.091 Y-2.915 C39.485 F223.0257 +X-41.192 Y-2.004 C39.682 F381.7118 +X-41.685 Y-2.006 Z-6.356 A-75.0 C39.723 F457.7142 +X-39.572 Y-3.751 A-74.999 C39.317 F198.4183 +X-37.756 Y-5.223 C38.744 F220.4338 +X-35.929 Y-6.669 C37.942 F210.7372 +X-34.386 Y-7.854 Z-6.355 C37.071 F241.0763 +X-32.831 Y-9.008 A-75.0 C36.023 F233.6614 +X-31.076 Y-10.252 Z-6.356 C34.607 F201.7165 +X-29.327 Y-11.424 C32.968 F198.4627 +X-27.938 Y-12.299 C31.499 F245.8469 +X-26.54 Y-13.131 Z-6.355 C29.879 F241.681 +X-25.13 Y-13.911 Z-6.353 C28.117 F238.4846 +X-23.517 Y-14.734 Z-6.355 C25.915 F206.4954 +X-21.905 Y-15.478 Z-6.356 C23.546 F205.8788 +X-20.274 Y-16.148 C21.06 F205.3838 +X-18.611 Y-16.746 Z-6.355 C18.598 F208.5799 +X-16.913 Y-17.279 C16.231 F213.3269 +X-15.123 Y-17.76 Z-6.356 C13.896 F211.4096 +X-14.396 Y-17.934 C12.995 F534.7924 +G94 +G00 Z5.0 +Y-20 +C-6.898 +X19.203 Y-20 +Z3.0 +G93 +G01 X13.583 Y-18.772 Z-7.538 F7.3683 +X11.093 Y-19.053 C-5.977 F208.3118 +X8.604 Y-19.291 C-4.932 F206.1827 +X5.936 Y-19.492 A-74.999 C-3.663 F190.1235 +X3.284 Y-19.629 C-2.234 F188.2511 +X0.974 Y-19.692 A-75.0 C-0.844 F212.6307 +X-1.326 Y-19.695 C0.691 F209.32 +X-3.535 Y-19.638 C2.316 F213.1496 +X-5.73 Y-19.516 C4.089 F209.1129 +X-7.815 Y-19.334 C5.929 F213.9369 +X-9.941 Y-19.075 Z-7.539 C7.98 F202.8802 +X-11.685 Y-18.802 C9.804 F239.1094 +X-13.342 Y-18.489 Z-7.538 C11.661 F243.4332 +X-14.976 Y-18.122 Z-7.537 C13.615 F238.3678 +X-16.586 Y-17.702 C15.661 F233.4122 +X-18.021 Y-17.273 Z-7.538 C17.611 F251.4655 +X-19.429 Y-16.799 Z-7.539 C19.652 F245.9507 +X-21.176 Y-16.13 Z-7.538 C22.273 F191.3954 +X-22.799 Y-15.424 Z-7.537 C24.676 F202.2516 +X-24.411 Y-14.644 Z-7.538 C26.942 F203.1084 +X-26.003 Y-13.798 C29.028 F206.3128 +X-27.615 Y-12.866 C30.953 F205.8612 +X-29.244 Y-11.854 C32.707 F206.3186 +X-30.964 Y-10.714 C34.35 F198.4035 +X-32.706 Y-9.49 C35.789 F199.8529 +X-34.474 Y-8.185 A-74.999 C37.01 F202.378 +X-36.327 Y-6.76 C38.041 F199.2237 +X-38.26 Y-5.225 C38.855 F198.5385 +X-40.278 Y-3.581 C39.438 F198.7734 +X-42.179 Y-2.008 A-75.0 C39.759 F221.8151 +G94 +G00 Z-6.244 +X-45.268 Y-5.721 +Z5.0 +A0. +A-5.545 C205.605 +X-38.238 Y-4.52 +Z3.977 +X-38.279 Y-4.606 +Z3.0 +G93 +G01 X-38.446 Y-4.956 Z-1.0 F74.6491 +X-35.486 Y-2.406 Z-1.347 F152.9543 +X-32.897 Y-0.251 Z-1.645 F177.4494 +X-30.802 Y1.417 Z-1.879 F223.1905 +X-28.947 Y2.82 Z-2.079 F257.0682 +X-27.436 Y3.902 Z-2.237 F321.5996 +X-25.892 Y4.942 Z-2.393 F321.1755 +X-24.308 Y5.934 Z-2.546 F320.0125 +X-23.095 Y6.639 Z-2.659 F426.1099 +X-21.857 Y7.308 Z-2.77 C205.606 F425.2881 +X-20.595 Y7.936 Z-2.878 F424.1475 +X-19.306 Y8.52 Z-2.983 F423.0305 +X-18.433 Y8.884 Z-3.051 F632.6563 +X-17.55 Y9.226 Z-3.118 F631.5498 +X-16.205 Y9.699 Z-3.216 F420.0529 +X-14.84 Y10.121 Z-3.31 F418.8696 +X-13.274 Y10.539 Z-3.413 F369.4575 +X-12.319 Y10.762 Z-3.472 F610.8156 +X-10.929 Y11.049 Z-3.556 F421.988 +X-9.063 Y11.37 Z-3.662 F316.3566 +X-7.185 Y11.624 Z-3.763 F316.2414 +X-6.884 Y11.659 Z-3.779 F1974.1809 +X-6.877 F80937.4994 +X-5.772 Y11.773 Z-3.835 C205.607 F539.5825 +X-3.882 Y11.919 Z-3.928 F316.1178 +X-1.785 Y12.018 Z-4.024 F285.492 +X0.215 Y12.056 Z-4.111 F299.7148 +X2.585 Y12.037 Z-4.209 F252.9507 +X5.214 Y11.947 Z-4.312 F227.9148 +X6.223 Y11.894 Z-4.349 F593.4067 +X6.23 Y11.893 Z-4.35 F80810.615 +X9.008 Y11.701 Z-4.449 F215.3559 +X12.082 Y11.415 Z-4.553 F194.2249 +X14.678 Y11.123 Z-4.637 F229.6195 +X18.207 Y10.663 Z-4.744 F168.4914 +X18.405 Y10.635 Z-4.75 F2994.8533 +X18.413 Y10.634 F80856.7982 +X21.661 Y10.155 Z-4.845 F182.6715 +X21.668 Y10.154 F80931.518 +X24.653 Y9.679 Z-4.929 F198.4514 +X24.66 Y9.678 F81004.2725 +X26.384 Y9.392 Z-4.976 F343.2213 +X26.391 Y9.39 F81034.5562 +X26.559 Y9.362 Z-4.981 F3523.4578 +X26.566 Y9.361 F81049.9485 +X28.267 Y9.072 Z-5.027 F347.7632 +X28.274 Y9.071 F81053.3655 +X28.74 Y8.991 Z-5.04 F1267.2415 +X28.748 Y8.99 F80979.4797 +X33.53 Y8.153 Z-5.167 F123.5382 +X34.152 Y8.002 Z-5.18 C205.608 F937.8168 +X34.288 Y7.908 Z-5.178 C205.61 F3581.3821 +X34.478 Y7.653 Z-5.164 F1889.8763 +X34.828 Y6.939 Z-5.116 C205.611 F752.401 +X35.09 Y6.154 Z-5.058 F723.4097 +X35.215 Y5.671 Z-5.021 F1199.4981 +X35.323 Y5.171 Z-4.982 F1168.9283 +X35.452 Y4.442 Z-4.923 F807.7564 +X35.579 Y3.505 Z-4.847 F632.4613 +X35.703 Y2.191 Z-4.737 F453.0358 +X35.76 Y1.371 Z-4.667 F727.0279 +X36.26 Y1.4 Z-4.723 A-11.048 C240.498 F25.8226 +X36.749 Y1.423 Z-4.841 A-17.818 C250.903 F76.8969 +X36.719 Y1.865 Z-4.878 A-17.819 C250.901 F1345.97 +X36.64 Y2.844 Z-4.961 A-17.893 C249.779 F350.2036 +X36.581 Y3.426 Z-5.009 A-17.947 C248.964 F538.9295 +X36.439 Y4.483 Z-5.094 A-18.069 C247.089 F263.486 +X36.33 Y5.111 Z-5.143 A-18.159 C245.664 F386.1601 +X36.219 Y5.657 Z-5.186 A-18.248 C244.183 F397.7446 +X36.07 Y6.269 Z-5.234 A-18.366 C242.149 F310.3206 +X35.906 Y6.822 Z-5.276 A-18.496 C239.799 F288.1807 +X35.725 Y7.312 Z-5.31 A-18.642 C237.049 F262.5177 +X35.578 Y7.643 Z-5.332 A-18.762 C234.62 F312.2341 +X35.441 Y7.912 Z-5.349 A-18.876 C232.118 F314.369 +X35.315 Y8.13 Z-5.363 A-18.985 C229.523 F312.7383 +X35.093 Y8.442 Z-5.38 A-19.179 C224.079 F154.7611 +X34.914 Y8.626 Z-5.387 A-19.33 C218.477 F156.3022 +X34.758 Y8.749 Z-5.39 A-19.436 C212.174 F142.696 +X34.631 Y8.823 Z-5.396 A-19.473 C206.645 F164.8108 +X34.528 Y8.87 A-19.464 C202.386 F214.7329 +X34.255 Y8.957 Z-5.389 A-19.425 C198.14 F203.5677 +X34.036 Y9.014 Z-5.384 A-19.402 C196.519 F484.6195 +X33.62 Y9.102 Z-5.374 A-19.376 C194.982 F436.0172 +X33.32 Y9.159 Z-5.366 A-19.365 C194.45 F950.0847 +X33.029 Y9.21 Z-5.359 A-19.361 C194.238 F1410.0097 +X33.014 Y9.213 Z-5.358 C194.232 F32607.1321 +X29.486 Y9.828 Z-5.264 A-19.358 C194.099 F164.0871 +X29.479 Y9.829 Z-5.263 F79525.0226 +X25.55 Y10.493 Z-5.158 A-19.353 C193.813 F145.3802 +X25.542 Y10.495 F77957.4673 +X24.089 Y10.732 Z-5.118 A-19.35 C193.654 F387.5176 +X24.082 Y10.733 C193.653 F77696.9582 +X21.469 Y11.144 Z-5.045 A-19.342 C193.3 F214.3086 +X21.462 Y11.145 C193.299 F77275.9644 +X18.841 Y11.532 Z-4.969 A-19.332 C192.858 F212.3032 +X18.834 Y11.533 Z-4.968 C192.856 F80517.4355 +X16.198 Y11.89 Z-4.889 A-19.321 C192.32 F209.9905 +X16.191 Y11.891 C192.319 F76437.4862 +X14.011 Y12.158 Z-4.82 A-19.309 C191.799 F252.7908 +X14.004 Y12.159 C191.797 F76387.8551 +X12.248 Y12.354 Z-4.764 A-19.297 C191.327 F312.8073 +X12.241 Y12.355 C191.325 F76513.3606 +X10.483 Y12.529 Z-4.705 A-19.283 C190.806 F311.7151 +X10.476 Y12.53 C190.804 F76496.3759 +X9.591 Y12.609 Z-4.674 A-19.276 C190.524 F617.9886 +X9.584 Y12.61 C190.521 F76558.2889 +X7.457 Y12.775 Z-4.598 A-19.256 C189.793 F256.879 +X6.266 Y12.85 Z-4.555 A-19.244 C189.349 F456.6689 +X6.259 A-19.243 C189.346 F76654.7593 +X4.929 Y12.918 Z-4.505 A-19.229 C188.819 F408.3834 +X4.922 C188.816 F76717.6753 +X3.591 Y12.968 Z-4.453 A-19.213 C188.252 F406.4194 +X3.584 C188.249 F73751.0904 +X2.257 Y12.999 Z-4.4 A-19.196 C187.649 F406.003 +X2.25 Y13.0 Z-4.399 A-19.195 C187.645 F76310.7528 +X-0.265 Y13.007 Z-4.295 A-19.157 C186.394 F212.3122 +X-1.77 Y12.974 Z-4.231 A-19.129 C185.571 F350.7215 +X-1.777 C185.567 F75706.4915 +X-3.109 Y12.921 Z-4.171 A-19.102 C184.787 F392.0598 +X-3.116 Y12.92 Z-4.17 C184.783 F75136.9818 +X-4.936 Y12.807 Z-4.083 A-19.06 C183.636 F282.9445 +X-6.249 Y12.692 Z-4.018 A-19.026 C182.743 F385.7236 +X-7.14 Y12.597 Z-3.975 A-19.0 C182.106 F561.5247 +X-7.147 Z-3.974 C182.101 F73265.626 +X-8.473 Y12.429 Z-3.904 A-18.96 C181.099 F371.4498 +X-8.48 Y12.428 C181.093 F72572.4249 +X-9.794 Y12.228 Z-3.83 A-18.916 C180.032 F366.8757 +X-9.801 Y12.226 C180.026 F71614.2905 +X-11.112 Y11.989 Z-3.753 A-18.868 C178.895 F359.6814 +X-11.121 Y11.987 Z-3.752 C178.886 F48500.9919 +X-12.415 Y11.72 Z-3.674 A-18.816 C177.697 F355.5183 +X-12.428 Y11.717 A-18.815 C177.685 F35718.8712 +X-13.716 Y11.417 Z-3.594 A-18.756 C176.425 F347.9655 +X-13.728 Y11.414 Z-3.593 A-18.755 C176.412 F35916.8385 +X-15.011 Y11.077 Z-3.512 A-18.689 C175.077 F339.6205 +X-15.023 Y11.074 Z-3.511 C175.064 F35178.0441 +X-16.302 Y10.695 Z-3.426 A-18.615 C173.646 F329.8279 +X-16.314 Y10.691 Z-3.425 C173.632 F34081.8409 +X-17.417 Y10.326 Z-3.346 A-18.546 C172.339 F370.6739 +X-18.179 Y10.049 Z-3.29 A-18.496 C171.409 F523.3589 +X-19.303 Y9.604 Z-3.204 A-18.417 C169.991 F345.4496 +X-20.158 Y9.233 Z-3.135 A-18.355 C168.886 F442.987 +X-21.616 Y8.538 Z-3.012 A-18.246 C167.001 F253.196 +X-22.51 Y8.076 Z-2.935 A-18.18 C165.893 F410.0931 +X-22.516 Y8.073 A-18.179 C165.886 F64672.1216 +X-23.714 Y7.424 Z-2.829 A-18.094 C164.53 F308.3987 +X-23.719 Y7.422 A-18.093 C164.525 F76074.285 +X-24.894 Y6.741 Z-2.722 A-18.013 C163.286 F313.5523 +X-24.9 Y6.737 Z-2.721 C163.28 F63021.921 +X-26.042 Y6.031 Z-2.612 A-17.939 C162.152 F320.8878 +X-26.048 Y6.027 C162.146 F63570.5597 +X-27.165 Y5.296 Z-2.501 A-17.872 C161.123 F327.5309 +X-27.171 Y5.292 A-17.871 C161.117 F63763.9211 +X-28.267 Y4.539 Z-2.389 A-17.81 C160.193 F333.9356 +X-28.273 Y4.535 Z-2.388 A-17.809 C160.188 F64543.6067 +X-29.347 Y3.765 Z-2.276 A-17.754 C159.362 F342.0457 +X-29.353 Y3.76 Z-2.275 C159.358 F64984.3912 +X-30.414 Y2.971 Z-2.161 A-17.703 C158.62 F348.3829 +X-30.42 Y2.967 C158.616 F66086.3141 +X-31.049 Y2.487 Z-2.091 A-17.676 C158.216 F591.9057 +X-31.055 Y2.482 A-17.675 C158.213 F65598.9339 +X-32.509 Y1.343 Z-1.929 A-17.618 C157.394 F258.3936 +X-32.515 Y1.338 Z-1.928 C157.391 F66892.0269 +X-33.535 Y0.516 Z-1.813 A-17.584 C156.903 F374.6835 +X-33.54 Y0.512 A-17.583 C156.901 F68661.5347 +X-35.565 Y-1.166 Z-1.581 A-17.528 C156.134 F192.4322 +X-35.57 Y-1.171 C156.132 F70823.675 +X-37.85 Y-3.116 Z-1.316 A-17.488 C155.57 F177.3676 +X-39.113 Y-4.213 Z-1.17 A-17.475 C155.384 F331.8296 +X-39.222 Y-4.098 Z-1.223 A-19.863 C153.22 F328.3129 +X-39.224 Y-4.096 Z-1.224 A-19.891 C153.198 F31769.3374 +X-39.431 Y-3.877 Z-1.339 A-24.517 C150.206 F220.2944 +X-39.598 Y-3.7 Z-1.457 A-28.286 C148.47 F345.4016 +X-39.748 Y-3.54 Z-1.58 A-31.66 C147.247 F450.9061 +X-37.682 Y-1.75 Z-1.822 A-31.68 C147.649 F199.3368 +X-37.672 Y-1.741 Z-1.823 C147.652 F37860.9518 +X-36.22 Y-0.507 Z-1.99 A-31.703 C148.095 F273.6072 +X-36.21 Y-0.498 Z-1.991 C148.099 F37052.3751 +X-34.212 Y1.156 Z-2.218 A-31.747 C148.945 F192.8209 +X-34.164 Y1.194 Z-2.223 A-31.749 C148.968 F7957.3479 +X-34.159 Y1.199 Z-2.224 C148.971 F71607.7233 +X-33.119 Y2.036 Z-2.34 A-31.778 C149.529 F360.2722 +X-33.113 Y2.04 Z-2.341 C149.532 F70356.5285 +X-31.437 Y3.345 Z-2.528 A-31.832 C150.602 F219.8655 +X-31.431 Y3.349 C150.606 F69488.4715 +X-30.985 Y3.687 Z-2.577 A-31.848 C150.928 F811.2782 +X-30.979 Y3.691 Z-2.578 C150.932 F68221.6548 +X-29.906 Y4.487 Z-2.692 A-31.89 C151.77 F335.3622 +X-29.901 Y4.49 Z-2.693 C151.774 F67520.1716 +X-28.809 Y5.271 Z-2.806 A-31.936 C152.72 F326.5762 +X-28.804 Y5.275 Z-2.807 A-31.937 C152.724 F67227.7581 +X-27.696 Y6.035 Z-2.919 A-31.988 C153.779 F319.437 +X-27.69 Y6.038 Z-2.92 C153.784 F66505.7084 +X-26.561 Y6.777 Z-3.031 A-32.044 C154.957 F311.6913 +X-26.555 Y6.78 C154.962 F65726.5876 +X-25.395 Y7.497 Z-3.14 A-32.106 C156.264 F302.9554 +X-25.388 Y7.502 Z-3.141 C156.272 F50555.1678 +X-24.211 Y8.189 Z-3.249 A-32.172 C157.691 F298.3106 +X-24.2 Y8.195 Z-3.25 A-32.173 C157.704 F33450.4194 +X-23.003 Y8.85 Z-3.357 A-32.242 C159.247 F294.1183 +X-22.993 Y8.855 Z-3.358 A-32.243 C159.261 F33297.1058 +X-22.015 Y9.355 Z-3.44 A-32.302 C160.589 F361.7046 +X-20.644 Y9.998 Z-3.551 A-32.385 C162.531 F261.8103 +X-19.433 Y10.509 Z-3.643 A-32.458 C164.292 F302.6164 +X-19.422 Y10.514 Z-3.644 A-32.459 C164.308 F33472.871 +X-18.448 Y10.893 Z-3.71 A-32.516 C165.717 F385.716 +X-17.724 Y11.154 Z-3.763 A-32.555 C166.725 F534.2567 +X-16.607 Y11.523 Z-3.847 A-32.612 C168.212 F359.7356 +X-16.601 Y11.525 C168.22 F69906.5559 +X-15.294 Y11.919 Z-3.936 A-32.673 C169.865 F321.0738 +X-15.288 Y11.92 C169.872 F71764.9384 +X-13.974 Y12.272 Z-4.021 A-32.729 C171.429 F333.1557 +X-13.967 Y12.273 Z-4.022 C171.436 F73199.5341 +X-12.642 Y12.584 Z-4.104 A-32.78 C172.911 F344.3091 +X-12.636 Y12.586 C172.918 F75190.8617 +X-11.31 Y12.857 Z-4.183 A-32.825 C174.305 F357.3009 +X-11.297 Y12.86 Z-4.184 A-32.826 C174.318 F38470.7965 +X-9.969 Y13.094 Z-4.259 A-32.867 C175.625 F369.3867 +X-9.956 Y13.096 Z-4.26 A-32.868 C175.637 F39071.3422 +X-8.613 Y13.297 Z-4.333 A-32.905 C176.878 F377.4746 +X-8.6 Y13.299 Z-4.334 A-32.906 C176.889 F39841.538 +X-7.264 Y13.465 Z-4.403 A-32.94 C178.048 F390.8909 +X-7.251 Y13.467 Z-4.404 C178.059 F40704.7077 +X-5.743 Y13.618 Z-4.478 A-32.975 C179.285 F356.12 +X-4.316 Y13.727 Z-4.546 A-33.004 C180.369 F385.691 +X-3.189 Y13.792 Z-4.599 A-33.025 C181.175 F496.763 +X-3.176 C181.185 F42222.294 +X-1.827 Y13.846 Z-4.659 A-33.048 C182.096 F421.471 +X-1.814 Y13.847 Z-4.66 A-33.049 C182.105 F42338.6191 +X0.188 Y13.883 Z-4.745 A-33.079 C183.356 F287.4528 +X0.198 C183.362 F60477.9516 +X2.243 Y13.873 Z-4.826 A-33.106 C184.525 F281.4668 +X2.256 C184.532 F41925.4396 +X3.593 Y13.84 Z-4.879 A-33.122 C185.233 F428.8698 +X3.607 Z-4.88 C185.24 F41773.4261 +X4.941 Y13.789 Z-4.931 A-33.136 C185.897 F426.8853 +X4.955 Y13.788 C185.904 F41594.8871 +X6.294 Y13.72 Z-4.982 A-33.149 C186.521 F422.8033 +X6.308 Y13.719 C186.527 F41006.8996 +X7.63 Y13.636 Z-5.031 A-33.16 C187.098 F426.1075 +X7.641 Y13.635 A-33.161 C187.102 F50438.892 +X9.97 Y13.45 Z-5.117 A-33.178 C188.02 F239.3913 +X9.976 C188.022 F80619.563 +X10.538 Y13.398 Z-5.137 A-33.182 C188.227 F992.7795 +X10.545 Y13.397 C188.23 F80591.7884 +X12.32 Y13.221 Z-5.195 A-33.193 C188.839 F312.3849 +X12.327 Y13.22 Z-5.196 C188.842 F79799.3454 +X14.095 Y13.024 Z-5.252 A-33.203 C189.392 F312.6215 +X14.102 Y13.023 C189.395 F79298.05 +X16.296 Y12.751 Z-5.32 A-33.214 C190.004 F251.0614 +X16.303 C190.006 F78799.9187 +X18.943 Y12.392 Z-5.399 A-33.224 C190.635 F208.5635 +X18.95 Y12.391 C190.636 F78562.9533 +X21.576 Y12.005 Z-5.476 A-33.232 C191.153 F210.2896 +X21.583 Y12.004 C191.155 F78220.9395 +X24.181 Y11.595 Z-5.549 A-33.239 C191.569 F213.6446 +X24.188 Y11.594 C191.57 F78389.0336 +X25.095 Y11.447 Z-5.573 A-33.241 C191.691 F616.8974 +X25.102 Y11.446 C191.692 F78511.2594 +X29.36 Y10.732 Z-5.686 A-33.247 C192.09 F132.6062 +X29.372 Y10.73 C192.091 F45639.4927 +X33.215 Y10.059 Z-5.789 A-33.249 C192.27 F149.7575 +X33.28 Y10.047 Z-5.792 C192.309 F6733.4799 +X33.29 Y10.045 A-33.25 C192.316 F40639.1055 +X33.6 Y9.989 Z-5.8 A-33.255 C192.719 F1084.4342 +X34.181 Y9.87 Z-5.813 A-33.28 C194.705 F335.797 +X34.479 Y9.794 Z-5.818 A-33.305 C196.834 F375.6675 +X34.684 Y9.733 Z-5.821 A-33.323 C199.12 F374.102 +X34.817 Y9.686 Z-5.822 A-33.336 C201.409 F390.2963 +X34.911 Y9.647 A-33.344 C203.698 F399.7295 +X35.028 Y9.592 A-33.345 C206.828 F293.2512 +X35.144 Y9.529 A-33.335 C210.075 F281.7351 +X35.254 Y9.457 Z-5.82 A-33.313 C213.324 F280.381 +X35.345 Y9.389 Z-5.817 A-33.285 C216.038 F333.5277 +X35.439 Y9.314 Z-5.816 A-33.252 C218.675 F340.1926 +X35.535 Y9.231 Z-5.814 A-33.213 C221.24 F346.2377 +X35.633 Y9.138 Z-5.813 A-33.169 C223.735 F351.6621 +X35.796 Y8.96 Z-5.809 A-33.086 C227.609 F222.2676 +X35.965 Y8.74 Z-5.802 A-32.991 C231.333 F225.3839 +X36.139 Y8.471 Z-5.788 A-32.889 C234.879 F229.6868 +X36.315 Y8.148 Z-5.768 A-32.782 C238.214 F235.9254 +X36.491 Y7.768 Z-5.743 A-32.675 C241.311 F244.379 +X36.664 Y7.33 Z-5.713 A-32.57 C244.151 F255.1639 +X36.831 Y6.834 Z-5.679 A-32.469 C246.725 F268.3068 +X36.955 Y6.416 Z-5.65 A-32.395 C248.517 F367.6158 +X37.093 Y5.889 Z-5.61 A-32.311 C250.434 F328.1261 +X37.231 Y5.242 Z-5.562 A-32.224 C252.381 F305.1291 +X37.349 Y4.556 Z-5.51 A-32.146 C254.073 F327.7726 +X37.45 Y3.815 Z-5.455 A-32.076 C255.572 F342.5201 +X37.555 Y2.855 Z-5.375 A-32.003 C257.128 F298.9628 +X37.636 Y1.886 Z-5.292 A-31.943 C258.358 F334.2934 +X37.665 Y1.449 Z-5.255 F1365.7334 +X38.078 Y1.452 Z-5.544 A-39.086 C260.177 F245.8804 +X38.45 Y1.449 Z-5.883 A-46.25 C261.509 F277.9297 +X38.42 Y1.891 Z-5.92 C261.506 F1344.891 +X38.376 Y2.443 Z-5.967 A-46.272 C260.82 F588.4048 +X38.328 Y2.952 Z-6.01 A-46.293 C260.106 F603.6486 +X38.274 Y3.472 Z-6.051 A-46.318 C259.282 F556.4813 +X38.198 Y4.083 Z-6.099 A-46.351 C258.165 F438.941 +X38.117 Y4.658 Z-6.14 A-46.388 C256.942 F428.2726 +X38.064 Y4.984 Z-6.163 A-46.412 C256.161 F703.0869 +X37.964 Y5.513 Z-6.201 A-46.455 C254.734 F402.2414 +X37.838 Y6.082 Z-6.242 A-46.505 C252.959 F340.0717 +X37.766 Y6.364 Z-6.264 A-46.532 C251.964 F629.8855 +X37.622 Y6.882 Z-6.299 A-46.587 C249.885 F312.9834 +X37.487 Y7.308 Z-6.328 A-46.638 C247.878 F338.1065 +X37.346 Y7.695 Z-6.352 A-46.691 C245.743 F329.0695 +X37.2 Y8.047 Z-6.372 A-46.745 C243.469 F318.9478 +X37.051 Y8.365 Z-6.389 A-46.799 C241.061 F309.5444 +X36.9 Y8.65 Z-6.403 A-46.853 C238.523 F300.8907 +X36.748 Y8.905 Z-6.413 A-46.905 C235.861 F293.0452 +X36.596 Y9.131 Z-6.421 A-46.955 C233.083 F286.0516 +X36.411 Y9.375 Z-6.43 A-47.014 C229.507 F226.0972 +X36.315 Y9.493 Z-6.432 A-47.043 C227.545 F417.3967 +X36.22 Y9.597 Z-6.436 A-47.069 C225.586 F421.1565 +X36.127 Y9.691 Z-6.44 A-47.093 C223.629 F424.5073 +X36.037 Y9.779 Z-6.441 A-47.115 C221.673 F427.395 +X35.896 Y9.899 Z-6.443 A-47.144 C218.588 F272.9874 +X35.756 Y10.007 Z-6.444 A-47.167 C215.463 F271.3153 +X35.605 Y10.11 Z-6.445 A-47.185 C212.112 F254.622 +X35.445 Y10.204 Z-6.446 A-47.195 C208.646 F247.2172 +X35.273 Y10.29 Z-6.445 A-47.198 C205.068 F240.4354 +X35.188 Y10.329 A-47.197 C203.28 F482.8776 +X35.098 Y10.367 Z-6.446 A-47.193 C201.55 F496.9245 +X34.995 Y10.405 Z-6.445 A-47.187 C199.878 F508.8672 +X34.748 Y10.484 Z-6.442 A-47.174 C196.972 F284.6292 +X34.586 Y10.528 Z-6.439 A-47.166 C195.629 F588.6068 +X34.389 Y10.578 Z-6.436 A-47.157 C194.341 F591.1108 +X34.297 Y10.6 Z-6.435 A-47.153 C193.831 F1445.9415 +X34.076 Y10.649 Z-6.432 A-47.145 C192.831 F704.0402 +X33.718 Y10.719 Z-6.423 A-47.137 C191.848 F615.9399 +X33.341 Y10.787 Z-6.414 A-47.132 C191.385 F899.1196 +X33.333 Y10.789 C191.38 F52157.8257 +X32.664 Y10.904 Z-6.391 C191.309 F831.6365 +X29.55 Y11.45 Z-6.314 A-47.13 C191.184 F185.6055 +X29.543 Y11.452 Z-6.313 F79464.9457 +X25.667 Y12.107 Z-6.215 A-47.126 C190.817 F145.8358 +X25.66 Y12.109 C190.816 F78629.9406 +X24.267 Y12.334 Z-6.177 A-47.125 C190.627 F399.359 +X24.26 Y12.336 C190.626 F78530.272 +X21.641 Y12.745 Z-6.101 A-47.121 C190.185 F210.8204 +X21.634 Y12.746 C190.184 F78431.0671 +X19.01 Y13.129 Z-6.023 A-47.117 C189.631 F208.6147 +X19.003 Y13.13 C189.629 F78508.9813 +X16.363 Y13.486 Z-5.941 A-47.11 C188.957 F205.848 +X16.357 Y13.487 C188.955 F78751.4785 +X14.17 Y13.755 Z-5.871 A-47.103 C188.308 F247.161 +X14.164 Y13.756 C188.306 F79268.3542 +X12.385 Y13.953 Z-5.814 A-47.096 C187.717 F302.6052 +X12.378 Y13.954 C187.715 F79180.9484 +X9.729 Y14.21 Z-5.726 A-47.083 C186.727 F202.7035 +X9.722 Y14.211 Z-5.725 C186.725 F79614.7011 +X7.683 Y14.374 Z-5.654 A-47.072 C185.87 F262.1036 +X7.676 Y14.375 C185.867 F80442.208 +X6.327 Y14.463 Z-5.607 A-47.063 C185.253 F394.5942 +X6.32 C185.25 F80494.559 +X4.961 Y14.535 Z-5.559 A-47.054 C184.591 F390.4014 +X4.954 C184.587 F81053.6061 +X3.603 Y14.589 Z-5.509 A-47.044 C183.888 F391.1432 +X3.596 C183.884 F81245.8802 +X2.232 Y14.624 Z-5.456 A-47.033 C183.131 F385.5544 +X2.225 C183.127 F81190.2958 +X0.374 Y14.633 Z-5.382 A-47.018 C182.024 F282.1354 +X0.367 C182.02 F81510.3115 +X-1.872 Y14.589 Z-5.283 A-46.997 C180.548 F230.2439 +X-1.885 Z-5.282 A-46.996 C180.54 F40794.4346 +X-3.255 Y14.532 Z-5.22 A-46.981 C179.565 F371.4512 +X-3.267 Y14.531 Z-5.219 C179.556 F40665.7363 +X-5.187 Y14.41 Z-5.129 A-46.956 C178.087 F260.9777 +X-7.122 Y14.231 Z-5.036 A-46.926 C176.474 F253.1432 +X-7.387 Y14.201 Z-5.024 A-46.922 C176.242 F1829.8458 +X-7.399 Y14.199 C176.232 F40358.7946 +X-8.767 Y14.03 Z-4.955 A-46.898 C174.988 F348.9808 +X-8.779 Y14.028 Z-4.954 A-46.897 C174.977 F39965.6829 +X-10.129 Y13.828 Z-4.884 A-46.871 C173.672 F346.1003 +X-10.14 Y13.826 Z-4.883 C173.66 F39944.3833 +X-11.497 Y13.588 Z-4.809 A-46.843 C172.265 F335.7864 +X-11.509 Y13.586 Z-4.808 A-46.842 C172.252 F39571.2974 +X-12.855 Y13.311 Z-4.731 A-46.811 C170.781 F329.3353 +X-12.866 Y13.309 Z-4.73 C170.768 F39012.7462 +X-14.2 Y12.996 Z-4.649 A-46.777 C169.219 F322.494 +X-14.211 Y12.993 Z-4.648 C169.206 F38414.8567 +X-15.549 Y12.636 Z-4.563 A-46.74 C167.558 F311.2568 +X-15.555 Y12.635 C167.551 F75583.6147 +X-16.888 Y12.233 Z-4.473 A-46.7 C165.813 F301.4608 +X-16.894 Y12.231 A-46.699 C165.806 F74275.9101 +X-17.978 Y11.875 Z-4.392 A-46.664 C164.324 F359.6812 +X-19.311 Y11.381 Z-4.297 A-46.616 C162.41 F281.5177 +X-20.857 Y10.741 Z-4.187 A-46.553 C160.071 F232.1128 +X-21.573 Y10.418 Z-4.133 A-46.523 C158.983 F491.7121 +X-22.897 Y9.773 Z-4.024 A-46.469 C157.081 F264.7184 +X-23.412 Y9.503 Z-3.982 A-46.449 C156.373 F679.965 +X-23.423 Y9.497 Z-3.981 C156.359 F33846.3569 +X-24.652 Y8.827 Z-3.875 A-46.403 C154.741 F283.3158 +X-24.657 Y8.825 Z-3.874 A-46.402 C154.734 F70485.8645 +X-25.86 Y8.124 Z-3.767 A-46.358 C153.243 F288.1737 +X-25.866 Y8.121 Z-3.766 C153.236 F66014.7517 +X-27.036 Y7.395 Z-3.657 A-46.317 C151.884 F295.8784 +X-27.041 Y7.392 Z-3.656 C151.878 F66115.6372 +X-28.188 Y6.641 Z-3.544 A-46.279 C150.653 F302.3619 +X-28.199 Y6.634 Z-3.543 C150.642 F33448.5965 +X-29.32 Y5.866 Z-3.431 A-46.245 C149.545 F311.0078 +X-29.33 Y5.859 Z-3.43 C149.536 F33878.5995 +X-30.43 Y5.073 Z-3.318 A-46.214 C148.557 F319.3324 +X-30.44 Y5.066 Z-3.316 C148.548 F33718.1214 +X-31.521 Y4.266 Z-3.204 A-46.186 C147.681 F328.1568 +X-31.526 Y4.262 Z-3.203 C147.678 F71991.5901 +X-32.141 Y3.797 Z-3.137 A-46.171 C147.225 F583.136 +X-32.146 Y3.793 Z-3.136 C147.222 F69511.8975 +X-33.648 Y2.623 Z-2.97 A-46.139 C146.24 F240.8845 +X-33.653 Y2.619 C146.236 F70024.5504 +X-34.699 Y1.778 Z-2.854 A-46.12 C145.655 F352.9132 +X-34.704 Y1.773 Z-2.853 C145.653 F70975.487 +X-35.736 Y0.926 Z-2.737 A-46.103 C145.16 F363.9172 +X-35.741 Y0.921 Z-2.736 C145.158 F71544.6133 +X-36.758 Y0.072 Z-2.62 A-46.09 C144.749 F376.512 +X-36.764 Y0.067 Z-2.619 C144.747 F72650.7532 +X-38.313 Y-1.252 Z-2.442 A-46.073 C144.262 F253.3219 +X-38.318 Y-1.256 Z-2.441 C144.261 F73973.1969 +X-40.311 Y-2.98 Z-2.208 A-46.061 C143.863 F205.0502 +X-40.554 Y-2.753 Z-2.591 A-53.286 C142.747 F337.7579 +X-40.765 Y-2.567 Z-3.013 A-60.521 C141.824 F360.5817 +X-38.974 Y-1.018 Z-3.223 A-60.525 C142.176 F229.1808 +X-38.964 Y-1.009 Z-3.224 C142.179 F38526.4788 +X-38.413 Y-0.537 Z-3.288 A-60.528 C142.329 F723.7095 +X-38.408 Y-0.532 Z-3.289 C142.33 F75892.983 +X-37.215 Y0.48 Z-3.425 A-60.534 C142.725 F328.2598 +X-37.21 Y0.485 Z-3.426 C142.726 F74903.9836 +X-36.184 Y1.342 Z-3.542 A-60.54 C143.145 F373.1418 +X-36.179 Y1.346 Z-3.543 C143.148 F74672.3865 +X-35.14 Y2.199 Z-3.659 A-60.549 C143.651 F361.1554 +X-35.135 Y2.204 Z-3.66 C143.654 F73739.827 +X-34.084 Y3.048 Z-3.775 A-60.558 C144.246 F351.0434 +X-34.08 Y3.052 Z-3.776 C144.249 F73822.4296 +X-32.892 Y3.982 Z-3.903 A-60.571 C145.022 F305.2698 +X-32.885 Y3.987 Z-3.904 C145.026 F55073.9812 +X-31.941 Y4.706 Z-4.004 A-60.581 C145.721 F378.2527 +X-31.931 Y4.714 Z-4.005 C145.729 F35840.2071 +X-30.847 Y5.517 Z-4.118 A-60.594 C146.615 F325.4342 +X-30.837 Y5.524 Z-4.119 C146.623 F35751.1146 +X-29.727 Y6.318 Z-4.233 A-60.609 C147.625 F314.7652 +X-29.717 Y6.325 Z-4.234 C147.635 F35625.7885 +X-28.581 Y7.104 Z-4.346 A-60.625 C148.761 F305.081 +X-28.571 Y7.11 Z-4.347 C148.771 F35578.8451 +X-27.419 Y7.862 Z-4.455 A-60.644 C150.017 F299.2281 +X-27.41 Y7.868 Z-4.456 C150.028 F36629.9515 +X-26.222 Y8.601 Z-4.561 A-60.664 C151.419 F289.317 +X-26.213 Y8.606 Z-4.562 C151.429 F41163.1041 +X-25.002 Y9.313 Z-4.669 A-60.685 C152.948 F283.7283 +X-24.993 Y9.319 Z-4.67 C152.96 F36797.3695 +X-23.849 Y9.947 Z-4.77 A-60.705 C154.489 F300.6448 +X-23.747 Y10.0 Z-4.779 A-60.707 C154.63 F3357.4396 +X-23.738 Y10.005 Z-4.78 C154.643 F37032.2406 +X-22.494 Y10.641 Z-4.882 A-60.73 C156.415 F277.586 +X-21.287 Y11.202 Z-4.976 A-60.754 C158.207 F289.5 +X-20.065 Y11.721 Z-5.064 A-60.777 C160.06 F291.1855 +X-18.814 Y12.2 Z-5.148 A-60.801 C161.94 F293.1804 +X-17.525 Y12.644 Z-5.231 A-60.823 C163.804 F295.6139 +X-17.144 Y12.763 Z-5.257 A-60.829 C164.333 F1024.7131 +X-17.133 Y12.766 C164.347 F37774.673 +X-16.068 Y13.094 Z-5.325 A-60.845 C165.768 F376.9428 +X-15.777 Y13.175 Z-5.345 A-60.849 C166.142 F1408.5743 +X-15.771 Y13.176 Z-5.346 C166.15 F68986.4301 +X-14.498 Y13.519 Z-5.425 A-60.866 C167.74 F330.1143 +X-14.412 Y13.54 Z-5.431 A-60.867 C167.844 F4940.6595 +X-14.401 Y13.543 Z-5.432 C167.857 F39518.9678 +X-13.11 Y13.848 Z-5.51 A-60.882 C169.379 F338.0827 +X-13.033 Y13.864 Z-5.515 A-60.883 C169.467 F5734.1616 +X-13.022 Y13.867 C169.48 F40134.0067 +X-11.693 Y14.14 Z-5.592 A-60.897 C170.956 F340.3672 +X-11.649 Y14.148 Z-5.595 A-60.898 C171.005 F10177.8471 +X-11.637 Y14.15 C171.017 F40705.6166 +X-10.273 Y14.391 Z-5.671 A-60.911 C172.446 F342.1541 +X-10.261 Y14.392 C172.458 F41239.1098 +X-8.884 Y14.599 Z-5.744 A-60.924 C173.818 F348.8913 +X-8.873 Y14.601 Z-5.745 C173.829 F41723.0662 +X-7.497 Y14.773 Z-5.815 A-60.935 C175.11 F358.1758 +X-7.485 Y14.774 C175.12 F42148.8992 +X-6.337 Y14.897 Z-5.869 A-60.944 C176.131 F437.9131 +X-4.801 Y15.023 Z-5.941 A-60.954 C177.409 F333.7601 +X-3.332 Y15.108 Z-6.009 A-60.963 C178.552 F355.1416 +X-3.319 Y15.109 C178.561 F42888.7846 +X-1.94 Y15.164 Z-6.069 A-60.971 C179.569 F383.1985 +X-1.928 Y15.165 C179.578 F42708.0329 +X-0.322 Y15.201 Z-6.135 A-60.98 C180.676 F332.6144 +X2.062 Y15.194 Z-6.23 A-60.99 C182.168 F225.8552 +X2.202 Y15.191 Z-6.236 A-60.991 C182.25 F3865.9296 +X2.215 Y15.19 C182.258 F42522.0492 +X3.573 Y15.157 Z-6.289 A-60.996 C183.033 F398.5801 +X3.586 Y15.156 C183.04 F42331.6224 +X4.943 Y15.104 Z-6.34 A-61.001 C183.766 F399.4642 +X4.956 Y15.103 C183.773 F41862.5904 +X6.309 Y15.034 Z-6.39 A-61.005 C184.452 F401.0002 +X6.322 Y15.033 C184.458 F41596.6946 +X7.674 Y14.947 Z-6.439 A-61.009 C185.095 F400.7972 +X7.687 Y14.946 C185.101 F41436.8109 +X9.221 Y14.829 Z-6.493 A-61.013 C185.774 F353.0696 +X9.234 Y14.828 C185.779 F40850.9293 +X10.603 Y14.707 Z-6.541 A-61.016 C186.337 F395.4485 +X10.617 Y14.706 Z-6.542 C186.343 F40607.166 +X12.401 Y14.53 Z-6.601 A-61.019 C187.014 F302.9033 +X12.415 Y14.529 C187.018 F40220.5475 +X14.196 Y14.332 Z-6.659 A-61.022 C187.627 F303.4928 +X14.202 C187.629 F87285.1144 +X16.413 Y14.058 Z-6.728 A-61.026 C188.302 F244.3968 +X16.42 Y14.057 C188.304 F79412.075 +X19.077 Y13.696 Z-6.805 A-61.03 C189.0 F203.8027 +X19.084 Y13.695 C189.002 F79203.788 +X21.726 Y13.305 Z-6.88 A-61.033 C189.576 F206.1617 +X21.732 Y13.304 C189.577 F79176.1261 +X24.39 Y12.887 Z-6.955 A-61.035 C190.036 F206.7829 +X24.398 Y12.886 C190.037 F69450.0197 +X26.61 Y12.523 Z-7.016 A-61.036 C190.34 F250.7484 +X26.617 Y12.522 C190.341 F88264.1161 +X29.692 Y12.0 Z-7.097 A-61.037 C190.615 F183.4786 +X29.7 Y11.999 C190.616 F75084.6118 +X32.915 Y11.44 Z-7.183 A-61.038 C190.75 F179.3849 +X32.923 Y11.439 Z-7.184 F69322.8421 +X33.198 Y11.391 Z-7.191 C190.757 F2115.0018 +X33.448 Y11.347 Z-7.197 C190.839 F1977.3334 +X33.802 Y11.282 Z-7.206 A-61.04 C191.305 F928.9593 +X34.172 Y11.21 Z-7.214 A-61.044 C192.329 F592.8677 +X34.407 Y11.159 Z-7.218 A-61.048 C193.365 F677.5084 +X34.614 Y11.107 Z-7.221 A-61.052 C194.548 F628.277 +X34.796 Y11.056 Z-7.224 A-61.057 C195.847 F595.9761 +X34.956 Y11.01 Z-7.227 A-61.061 C197.249 F570.0894 +X35.098 Y10.965 Z-7.229 A-61.064 C198.756 F543.2306 +X35.226 Y10.921 Z-7.23 A-61.067 C200.364 F518.3965 +X35.343 Y10.876 Z-7.231 A-61.069 C202.068 F495.2269 +X35.508 Y10.804 A-61.071 C204.849 F305.9622 +X35.662 Y10.726 Z-7.229 A-61.07 C207.71 F298.5051 +X35.81 Y10.643 Z-7.227 A-61.067 C210.537 F300.8498 +X35.963 Y10.547 Z-7.226 A-61.062 C213.385 F296.0914 +X36.231 Y10.361 A-61.047 C218.243 F171.4144 +X36.339 Y10.272 Z-7.225 A-61.039 C220.274 F407.8612 +X36.446 Y10.177 A-61.03 C222.304 F405.6932 +X36.586 Y10.043 Z-7.222 A-61.016 C224.929 F311.2162 +X36.725 Y9.894 Z-7.219 A-61.0 C227.534 F310.4867 +X36.885 Y9.706 Z-7.214 A-60.98 C230.433 F275.3065 +X37.044 Y9.498 Z-7.208 A-60.959 C233.246 F279.544 +X37.203 Y9.269 Z-7.202 A-60.937 C235.963 F284.6971 +X37.343 Y9.044 Z-7.195 A-60.916 C238.3 F325.1869 +X37.484 Y8.796 Z-7.186 A-60.895 C240.575 F328.2401 +X37.624 Y8.523 Z-7.175 A-60.873 C242.783 F331.442 +X37.762 Y8.223 Z-7.161 A-60.85 C244.919 F335.3325 +X37.899 Y7.895 Z-7.145 A-60.827 C246.974 F339.9707 +X38.032 Y7.536 Z-7.125 A-60.804 C248.944 F345.4086 +X38.161 Y7.145 Z-7.102 A-60.782 C250.822 F351.6797 +X38.286 Y6.722 Z-7.076 A-60.76 C252.605 F358.8086 +X38.404 Y6.266 Z-7.046 A-60.738 C254.288 F366.8104 +X38.516 Y5.776 Z-7.013 A-60.718 C255.867 F375.696 +X38.619 Y5.252 Z-6.978 A-60.698 C257.341 F385.4829 +X38.703 Y4.77 Z-6.944 A-60.681 C258.537 F454.749 +X38.795 Y4.149 Z-6.9 A-60.662 C259.89 F382.5793 +X38.877 Y3.493 Z-6.851 A-60.644 C261.105 F398.5656 +X38.949 Y2.796 Z-6.797 A-60.629 C262.199 F410.8658 +X39.025 Y1.858 Z-6.723 A-60.612 C263.421 F335.2173 +X39.054 Y1.421 Z-6.686 F1365.7332 +X39.277 Y1.398 Z-7.138 A-67.804 C264.173 F309.3139 +X39.441 Y1.369 Z-7.613 A-75.0 C264.852 F308.8122 +X39.411 Y1.811 Z-7.651 C264.85 F1344.5028 +X39.364 Y2.433 Z-7.699 C264.06 F513.6483 +X39.312 Y2.999 Z-7.742 C263.241 F530.0768 +X39.25 Y3.582 Z-7.785 A-74.999 C262.282 F481.9433 +X39.181 Y4.133 Z-7.825 C261.244 F473.8498 +X39.106 Y4.653 Z-7.861 A-75.0 C260.128 F465.4769 +X39.024 Y5.143 Z-7.894 C258.938 F458.2381 +X38.967 Y5.453 Z-7.914 C258.108 F680.8811 +X38.905 Y5.76 Z-7.934 C257.226 F656.4655 +X38.841 Y6.053 Z-7.952 C256.318 F653.8057 +X38.776 Y6.333 Z-7.969 C255.384 F651.1543 +X38.708 Y6.6 Z-7.985 C254.425 F648.4947 +X38.595 Y7.007 Z-8.009 C252.814 F396.5634 +X38.477 Y7.387 Z-8.029 C251.126 F390.3512 +X38.355 Y7.741 Z-8.047 C249.359 F383.7793 +X38.23 Y8.069 Z-8.062 C247.517 F377.6907 +X38.102 Y8.374 Z-8.075 C245.603 F372.0839 +X37.971 Y8.655 Z-8.086 C243.621 F366.9667 +X37.839 Y8.915 Z-8.095 C241.574 F362.338 +X37.706 Y9.156 Z-8.102 C239.467 F358.209 +X37.571 Y9.378 Z-8.108 C237.305 F354.5611 +X37.397 Y9.638 Z-8.114 C234.454 F273.2516 +X37.216 Y9.88 Z-8.119 C231.438 F262.4658 +X37.047 Y10.083 Z-8.122 C228.559 F278.759 +X36.963 Y10.176 Z-8.124 C227.119 F562.3895 +X36.829 Y10.315 Z-8.125 C224.793 F350.7823 +X36.695 Y10.444 C222.444 F350.1485 +X36.559 Y10.563 Z-8.126 C220.071 F349.0501 +X36.34 Y10.735 C216.257 F219.0662 +X36.114 Y10.89 Z-8.127 C212.362 F216.2956 +X35.699 Y11.119 C205.54 F124.8252 +X35.508 Y11.205 Z-8.126 C202.572 F287.5718 +X35.383 Y11.254 Z-8.127 C200.746 F467.0742 +X35.234 Y11.307 Z-8.126 C198.922 F460.2464 +X35.05 Y11.367 Z-8.125 A-74.999 C196.964 F423.163 +X34.797 Y11.438 Z-8.123 A-75.0 C195.009 F406.2949 +X34.655 Y11.475 Z-8.121 A-74.999 C194.046 F808.0484 +X34.425 Y11.528 Z-8.118 C192.746 F579.3545 +X34.178 Y11.581 Z-8.114 A-75.0 C191.776 F710.0217 +X33.846 Y11.645 Z-8.107 A-75.001 C190.921 F701.2549 +X33.528 Y11.703 Z-8.1 A-74.999 C190.428 F968.4667 +X33.158 Y11.768 Z-8.09 A-75.0 C190.324 F1367.9207 +X30.19 Y12.285 Z-8.011 C190.217 F195.3413 +X30.183 Y12.286 F81430.9406 +X27.776 Y12.698 Z-7.946 C190.021 F235.9525 +X27.769 Y12.7 C190.02 F83992.113 +X26.286 Y12.949 Z-7.906 C189.852 F378.2167 +X26.278 Y12.95 C189.851 F79446.7231 +X25.018 Y13.157 Z-7.871 C189.678 F441.7268 +X25.011 Y13.158 C189.677 F79383.7872 +X21.611 Y13.695 Z-7.777 C189.084 F162.6661 +X21.604 Y13.696 C189.082 F77797.5395 +X18.741 Y14.116 Z-7.694 C188.431 F191.3165 +X15.731 Y14.516 Z-7.604 A-74.999 C187.595 F181.0986 +X13.884 Y14.737 Z-7.548 C187.001 F293.8768 +X13.878 C186.999 F81756.21 +X12.396 Y14.9 Z-7.501 C186.476 F365.4099 +X12.389 Y14.901 C186.473 F82912.4063 +X9.407 Y15.183 Z-7.403 A-75.0 C185.284 F181.8632 +X6.964 Y15.363 Z-7.318 C184.172 F221.4697 +X4.558 Y15.49 Z-7.231 A-74.999 C182.944 F224.2577 +X2.56 Y15.553 Z-7.156 C181.816 F268.6913 +X0.226 Y15.573 Z-7.064 A-75.0 C180.362 F228.0926 +X-2.065 Y15.531 Z-6.969 C178.78 F229.0858 +X-4.185 Y15.431 Z-6.875 C177.168 F242.8358 +X-6.338 Y15.265 Z-6.777 C175.376 F233.4061 +X-7.78 Y15.114 Z-6.708 A-74.999 C174.082 F340.6289 +X-9.161 Y14.936 Z-6.64 C172.764 F347.3472 +X-10.557 Y14.722 Z-6.568 C171.35 F335.0745 +X-11.93 Y14.475 Z-6.493 C169.876 F331.3969 +X-13.278 Y14.196 Z-6.417 A-75.0 C168.344 F327.239 +X-14.602 Y13.882 Z-6.339 C166.755 F322.6751 +X-15.921 Y13.528 Z-6.259 C165.093 F313.5776 +X-17.432 Y13.07 Z-6.165 C163.059 F262.0338 +X-18.658 Y12.655 Z-6.087 C161.298 F309.8491 +X-19.861 Y12.204 Z-6.007 C159.492 F303.8541 +X-21.058 Y11.711 Z-5.922 C157.66 F296.6095 +X-22.257 Y11.169 Z-5.832 C155.837 F289.5986 +X-23.467 Y10.574 Z-5.737 C154.057 F283.3863 +X-24.695 Y9.925 Z-5.638 C152.353 F278.3803 +X-25.97 Y9.2 Z-5.532 C150.695 F267.3768 +X-27.208 Y8.449 Z-5.421 A-74.999 C149.18 F274.3226 +X-28.271 Y7.769 Z-5.324 A-75.0 C147.977 F321.0379 +X-29.567 Y6.898 Z-5.201 C146.63 F264.4639 +X-30.236 Y6.429 Z-5.136 C145.981 F514.9372 +X-30.246 Y6.422 Z-5.135 C145.971 F35234.7868 +X-31.476 Y5.535 Z-5.011 C144.875 F282.0796 +X-32.905 Y4.459 Z-4.863 A-74.999 C143.755 F245.8605 +X-34.156 Y3.483 Z-4.73 C142.905 F285.8323 +X-35.451 Y2.442 Z-4.589 C142.154 F281.4308 +X-36.786 Y1.342 Z-4.441 A-74.998 C141.515 F279.5591 +X-37.553 Y0.698 Z-4.354 C141.207 F496.7187 +X-37.564 Y0.689 Z-4.353 C141.203 F36706.8356 +X-38.656 Y-0.237 Z-4.228 C140.837 F356.1736 +X-38.666 Y-0.246 Z-4.227 C140.833 F36891.8074 +X-40.363 Y-1.707 Z-4.03 A-74.999 C140.423 F236.4921 +X-41.081 Y-2.332 Z-3.946 C140.304 F576.1819 +G94 +G00 Z-2.652 +X-44.166 Y1.385 +Z5.0 + +( FINISH2 FLOWLINE SRF_MILL1 ) +G00 G54 X-44.166 Y1.385 Z5 +A-74.999 C140.318 +X-44.276 Y1.721 +Z5.0 +Z3.0 +G93 +G01 Z-3.879 F43.6109 +X-41.192 Y-1.996 Z-5.173 F60.0 +X-39.443 Y-0.553 C140.665 F239.2965 +X-38.827 Y-0.051 C140.833 F660.8334 +X-38.817 Y-0.042 C140.836 F38401.9993 +X-37.419 Y1.088 C141.309 F284.8036 +X-36.093 Y2.139 A-75.0 C141.882 F292.2789 +X-35.416 Y2.667 C142.223 F560.8805 +X-35.411 Y2.671 C142.226 F73481.7568 +X-33.833 Y3.874 C143.155 F236.8506 +X-32.509 Y4.85 C144.081 F276.2794 +X-31.246 Y5.749 C145.09 F285.2372 +X-29.831 Y6.714 C146.365 F251.7539 +G94 +G00 Z5.0 +C167.016 +X-22.232 Y15 +G93 +G01 X-14.387 Y13.936 Z-6.356 F8.2994 +X-15.962 Y13.543 Z-6.352 A-75.001 C165.048 F264.2742 +X-17.208 Y13.191 C163.377 F320.7355 +X-18.446 Y12.802 Z-6.355 A-75.0 C161.625 F310.7344 +X-19.648 Y12.383 Z-6.357 C159.855 F309.4002 +X-20.861 Y11.917 Z-6.359 C158.033 F297.6285 +X-22.072 Y11.406 Z-6.36 A-74.999 C156.214 F291.1603 +X-23.29 Y10.845 Z-6.358 C154.43 F285.2535 +X-24.521 Y10.231 Z-6.356 A-75.0 C152.709 F280.2509 +X-25.647 Y9.631 Z-6.354 C151.227 F306.2213 +X-26.907 Y8.917 C149.679 F273.6937 +X-28.198 Y8.14 Z-6.356 C148.216 F268.0342 +X-29.512 Y7.304 Z-6.357 C146.847 F264.4308 +X-30.902 Y6.373 Z-6.356 C145.542 F252.0067 + +X-32.215 Y5.452 Z-6.355 C144.448 F270.1283 +X-33.539 Y4.488 Z-6.354 C143.479 F272.0425 +X-35.053 Y3.347 Z-6.355 A-74.999 C142.53 F242.1947 +X-36.652 Y2.103 Z-6.356 C141.713 F235.455 +X-38.368 Y0.731 A-74.998 C141.039 F226.4362 +X-39.017 Y0.203 C140.835 F615.4534 +X-39.028 Y0.194 C140.832 F36786.427 +X-40.817 Y-1.274 A-74.999 C140.412 F229.4334 +X-41.685 Y-1.994 A-75.0 C140.277 F489.5297 +X-42.179 Y-1.992 Z-7.538 C140.241 F458.6764 +X-40.409 Y-0.526 A-74.999 C140.533 F239.5497 +X-39.222 Y0.445 C140.834 F344.7203 +X-39.213 Y0.453 C140.837 F45215.76 +X-37.812 Y1.585 C141.31 F283.8543 +X-36.496 Y2.629 C141.877 F293.8736 +X-35.13 Y3.687 C142.597 F276.5878 +X-33.625 Y4.819 A-75.0 C143.548 F245.6896 +X-32.361 Y5.737 C144.477 F287.4411 +X-31.119 Y6.607 C145.509 F288.4373 +X-30.125 Y7.279 C146.419 F356.7246 +X-28.843 Y8.11 C147.708 F274.5385 +X-27.868 Y8.713 C148.766 F359.5899 +X-26.66 Y9.427 C150.167 F289.7662 +X-25.46 Y10.094 C151.659 F291.703 +X-24.269 Y10.716 C153.241 F294.0552 +X-23.081 Y11.294 C154.915 F295.5095 +X-21.601 Y11.953 C157.112 F239.6348 +X-20.576 Y12.37 C158.651 F351.8859 +X-19.347 Y12.828 Z-7.539 C160.468 F302.0284 +X-18.089 Y13.252 C162.273 F304.9225 +X-16.8 Y13.642 Z-7.538 C164.045 F308.2609 +X-15.473 Y13.999 Z-7.537 C165.77 F311.082 +X-14.215 Y14.3 C167.313 F339.8312 +X-12.84 Y14.589 Z-7.538 C168.916 F320.8951 +X-11.436 Y14.845 C170.466 F323.9409 +X-9.644 Y15.116 C172.319 F262.5548 +X-8.005 Y15.314 C173.896 F295.6124 +X-6.513 Y15.456 C175.239 F332.5351 +X-4.999 Y15.564 C176.52 F333.815 +X-2.768 Y15.665 C178.266 F231.2478 +X-0.488 Y15.702 C179.886 F230.1937 +X1.913 Y15.673 C181.426 F220.9166 +X4.332 Y15.583 C182.82 F220.7979 +X6.807 Y15.433 C184.095 F216.3191 +X8.998 Y15.257 C185.106 F244.818 +X11.532 Y15.007 C186.148 F211.601 +X12.385 Y14.911 C186.47 F631.5369 +X12.398 Y14.91 C186.475 F40663.7361 +X13.593 Y14.77 C186.901 F450.6244 +G94 +G00 Z-6.244 +X14.173 Y19.565 +Z5.0 +A0. +A-75.0 C270.0 +X44.466 Y-5.887 +Z5.0 +Z3.0 +G93 +G01 Z-7.056 F29.8332 +X39.636 Z-8.35 F60.0 +Y-3.578 F259.8332 +X39.638 Y-3.57 F78989.2007 +Y1.887 F109.9529 +G94 +G00 Z-7.055 +X44.468 +Z5.0 +A0. +Z5.0 + +G00 Z10 M09 +G00 X0. Y0. A0 C0 +M429 ;Restore Trivkins +M30 +% diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc new file mode 100644 index 0000000..f4b9cc2 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc @@ -0,0 +1,1867 @@ +% +M428 ;TCP:xyzbc +(!!! Touch Off: Table = -8.3 == Z max neg extent !!!) +(BOAT-5X) +( FC HERMLE 5 AXIS XYZBC MILLING ) + +( OPERATION= FINISH1 FLOWLINE SRF_MILL1 ) +( TOOL: T1 = 10.0 dia. ENDMILLM1000:REG ) +G00 G17 G40 G90 G94 +T1 M6 +G54 X-34.78 Y-2.436 B-5.546 C64.398 S600 M03 +G43 H1 Z5.0 M08 +Z3.573 +X-34.804 Y-2.386 +Z3.0 +G93 +G01 X-34.988 Y-2.0 Z-1.404 F67.8035 +X-35.008 Z-1.403 F30070.6535 +X-31.554 Y-4.825 Z-1.795 F133.9458 +X35.679 Y-4.58 Z-4.595 F8.9164 +X35.585 Y-7.418 Z-4.839 F210.5057 +X-27.8 Y-7.65 Z-2.2 F9.4576 +G94 +G00 Z5.0 +X-27.498 Y-8.28 +X-23.067 Y-11.14 +X-23.151 Y-10.965 +Z3.0 +G93 +G01 X-23.387 Y-10.471 Z-2.632 F53.014 +X35.058 Y-10.258 Z-5.066 F10.2571 +G94 +G00 Z5.0 +X35.48 Y-11.14 +X28.394 Y-13.999 +X28.31 Y-13.824 +Z3.0 +G93 +G01 X27.974 Y-13.122 Z-5.019 F37.2338 +X-17.388 Y-13.287 Z-3.131 F13.2157 +G94 +G00 Z5.0 +X-17.046 Y-13.999 +X1.143 Y-16.859 +X1.059 Y-16.684 +Z3.0 +G93 +G01 X0.76 Y-16.059 Z-4.135 F41.8503 +X0.776 Z-4.136 F37454.9529 +G94 +G00 Z0.841 +X0.985 Y-16.495 +Z5.0 +B0. +B-5.545 C-64.392 +X-34.799 Y-1.564 +Z3.574 +X-34.823 Y-1.614 +Z3.0 +G93 +G01 X-35.008 Y-2.0 Z-1.403 F67.8163 +X-34.988 Z-1.404 F29423.1803 +G94 +G00 Z5.0 +X-34.719 Y-1.439 +X36.081 Y1.42 +X35.997 Y1.245 +Z3.0 +G93 +G01 X35.679 Y0.58 Z-4.595 F39.3161 +X-31.555 Y0.825 Z-1.795 F8.9163 +X-27.795 Y3.65 Z-2.2 F127.1152 +X35.584 Y3.419 Z-4.839 F9.4587 +X35.055 Y6.259 Z-5.066 F207.0704 +X-23.392 Y6.472 Z-2.632 F10.2568 +G94 +G00 Z5.0 +X-23.072 Y7.14 +X-17.046 Y9.999 +X-17.13 Y9.824 +Z3.0 +G93 +G01 X-17.387 Y9.288 Z-3.13 F48.707 +X27.971 Y9.122 Z-5.019 F13.2164 +G94 +G00 Z5.0 +X28.392 Y9.999 +X1.329 Y12.859 +X1.245 Y12.684 +Z3.0 +G93 +G01 X0.946 Y12.059 Z-4.142 F41.8071 +X0.933 F48595.8783 +G94 +G00 Z0.835 +X1.142 Y12.494 +Z5.0 +B0. +B-5.546 C64.395 +X35.967 Y-5.826 +Z3.0 +G93 +G01 Z0.308 F111.4225 +X35.758 Y-5.39 Z-4.669 F60.0 +X35.617 Y-7.15 Z-4.817 F338.6289 +X35.559 Y-7.666 Z-4.86 F1150.2967 +X35.426 Y-8.596 Z-4.936 F636.7153 +X35.248 Y-9.519 Z-5.009 C64.396 F636.0981 +X35.083 Y-10.172 Z-5.059 F889.3286 +X34.778 Y-11.055 Z-5.124 F640.1209 +X34.311 Y-11.886 Z-5.177 C64.397 F628.4034 +X34.092 Y-12.023 Z-5.18 C64.399 F2309.9884 +X33.443 Y-12.17 Z-5.166 F900.6464 +X29.029 Y-12.939 Z-5.048 F133.8927 +X29.022 Y-12.94 F80597.2105 +X26.511 Y-13.368 Z-4.98 F235.4094 +X26.503 Y-13.37 Z-4.979 F80314.8345 +X21.506 Y-14.178 Z-4.841 F118.4711 +X21.403 Y-14.194 Z-4.838 F5763.6607 +X21.395 Y-14.195 Z-4.837 F80667.8203 +X17.508 Y-14.759 Z-4.724 F152.693 +X14.104 Y-15.192 Z-4.619 F174.7719 +X11.26 Y-15.499 Z-4.526 F209.6044 +X9.011 Y-15.702 Z-4.45 F265.5785 +X6.177 Y-15.898 Z-4.348 C64.4 F211.0993 +X3.794 Y-16.007 Z-4.258 F251.3503 +X1.432 Y-16.056 Z-4.163 F253.7361 +X-0.929 Y-16.041 Z-4.062 F253.8305 +X-2.816 Y-15.977 Z-3.978 F317.4707 +X-4.897 Y-15.847 Z-3.879 F287.4153 +X-6.745 Y-15.673 Z-3.786 F322.8491 +X-8.428 Y-15.463 Z-3.697 F353.2915 +X-10.269 Y-15.171 Z-3.594 F321.5195 +X-11.664 Y-14.903 Z-3.512 F421.6251 +X-12.624 Y-14.693 Z-3.454 F609.4916 +X-13.544 Y-14.471 Z-3.396 F632.3334 +X-14.916 Y-14.101 Z-3.306 C64.401 F421.4829 +X-16.397 Y-13.643 Z-3.203 F386.2672 +X-17.701 Y-13.182 Z-3.108 F432.6002 +X-18.576 Y-12.84 Z-3.042 F637.0784 +X-19.443 Y-12.475 Z-2.973 F636.1837 +X-20.302 Y-12.088 Z-2.903 F635.2956 +X-21.152 Y-11.68 Z-2.832 F634.4447 +X-21.993 Y-11.251 Z-2.759 F633.5349 +X-23.237 Y-10.571 Z-2.647 F421.7133 +X-24.234 Y-9.988 Z-2.555 F518.1409 +X-25.841 Y-8.981 Z-2.399 F315.271 +X-27.336 Y-7.975 Z-2.248 F331.8372 +X-28.942 Y-6.827 Z-2.08 F302.8928 +X-30.774 Y-5.444 Z-1.882 F260.3879 +X-32.98 Y-3.687 Z-1.636 F211.9425 +X-35.249 Y-1.797 Z-1.375 F202.3503 +X-38.446 Y0.955 Z-1.0 F141.7066 +X-38.78 Y0.578 Z-1.054 B-10.74 C103.027 F21.8732 +X-39.112 Y0.213 Z-1.17 B-17.477 C114.615 F64.8649 +X-36.906 Y-1.699 Z-1.427 B-17.503 C114.226 F188.0075 +X-34.471 Y-3.751 Z-1.708 B-17.558 C113.477 F163.3722 +X-33.011 Y-4.942 Z-1.874 B-17.603 C112.852 F263.3878 +X-33.005 Y-4.947 Z-1.875 C112.849 F69725.5443 +X-31.476 Y-6.157 Z-2.045 B-17.66 C112.041 F245.7564 +X-31.47 Y-6.161 Z-2.046 C112.038 F67746.3956 +X-29.554 Y-7.611 Z-2.253 B-17.746 C110.797 F191.9295 +X-29.348 Y-7.761 Z-2.275 B-17.756 C110.649 F1765.0968 +X-29.343 Y-7.765 Z-2.276 C110.645 F65318.3527 +X-27.769 Y-8.882 Z-2.438 B-17.839 C109.409 F228.7221 +X-27.166 Y-9.292 Z-2.5 B-17.873 C108.889 F589.97 +X-27.161 Y-9.296 Z-2.501 C108.884 F63117.3546 +X-25.595 Y-10.311 Z-2.654 B-17.969 C107.418 F226.1371 +X-24.895 Y-10.74 Z-2.722 B-18.015 C106.71 F502.066 +X-24.89 Y-10.743 C106.704 F61165.0282 +X-23.728 Y-11.421 Z-2.827 B-18.095 C105.461 F301.7958 +X-22.607 Y-12.035 Z-2.928 B-18.175 C104.184 F311.6249 +X-21.184 Y-12.756 Z-3.05 B-18.279 C102.46 F245.5812 +X-19.76 Y-13.405 Z-3.167 B-18.385 C100.636 F246.0964 +X-18.663 Y-13.854 Z-3.251 B-18.466 C99.205 F323.3404 +X-17.139 Y-14.413 Z-3.363 B-18.569 C97.313 F241.7135 +X-16.286 Y-14.695 Z-3.426 B-18.62 C96.324 F448.1027 +X-16.277 Y-14.699 Z-3.427 C96.314 F40618.0691 +X-14.993 Y-15.085 Z-3.514 B-18.692 C94.898 F306.7712 +X-14.98 Y-15.088 Z-3.515 C94.884 F30954.2186 +X-13.554 Y-15.465 Z-3.607 B-18.764 C93.41 F286.1249 +X-12.372 Y-15.739 Z-3.681 B-18.817 C92.261 F355.7557 +X-12.359 Y-15.742 Z-3.682 B-18.818 C92.249 F32106.6554 +X-11.055 Y-16.007 Z-3.759 B-18.872 C91.054 F331.6067 +X-11.041 Y-16.01 Z-3.76 C91.042 F32608.2546 +X-9.727 Y-16.24 Z-3.835 B-18.921 C89.913 F338.0129 +X-9.713 Y-16.242 Z-3.836 C89.902 F33212.1548 +X-7.901 Y-16.504 Z-3.932 B-18.98 C88.463 F252.8284 +X-5.885 Y-16.723 Z-4.037 B-19.038 C87.006 F234.6814 +X-4.339 Y-16.846 Z-4.113 B-19.077 C85.98 F313.4839 +X-4.332 Y-16.847 C85.975 F70468.1519 +X-2.56 Y-16.944 Z-4.195 B-19.116 C84.888 F279.1964 +X-1.652 Y-16.976 Z-4.236 B-19.134 C84.365 F552.6298 +X-1.645 Y-16.977 C84.362 F72045.6652 +X-0.308 Y-17.005 Z-4.295 B-19.159 C83.631 F379.3834 +X-0.294 C83.624 F36380.3175 +X1.028 Y-17.011 Z-4.351 B-19.181 C82.947 F388.5447 +X1.042 Z-4.352 C82.94 F36649.3378 +X1.902 Y-17.005 Z-4.387 B-19.194 C82.522 F602.6139 +X1.916 Y-17.004 C82.515 F36844.9425 +X3.696 Y-16.964 Z-4.457 B-19.218 C81.704 F293.6968 +X3.71 Z-4.458 C81.698 F37135.6166 +X5.043 Y-16.912 Z-4.509 B-19.234 C81.136 F396.2651 +X5.057 Y-16.911 Z-4.51 C81.13 F37332.7933 +X6.381 Y-16.842 Z-4.559 B-19.248 C80.608 F401.5133 +X6.388 Z-4.56 C80.606 F80626.0415 +X8.387 Y-16.707 Z-4.631 B-19.268 C79.879 F267.6974 +X9.706 Y-16.599 Z-4.679 B-19.279 C79.438 F408.6363 +X9.713 C79.436 F75759.3537 +X10.605 Y-16.518 Z-4.71 B-19.287 C79.154 F606.4113 +X10.612 Y-16.517 C79.152 F75924.561 +X12.957 Y-16.278 Z-4.787 B-19.304 C78.477 F231.6748 +X14.167 Y-16.141 Z-4.826 B-19.311 C78.163 F451.7349 +X14.174 Y-16.14 C78.161 F76943.11 +X16.404 Y-15.864 Z-4.896 B-19.323 C77.644 F246.1308 +X16.412 Y-15.863 C77.642 F77236.9594 +X16.419 Y-15.862 B-19.324 C77.641 F76516.9062 +X19.076 Y-15.501 Z-4.977 B-19.335 C77.111 F207.7195 +X19.083 Y-15.5 C77.109 F79512.4316 +X21.643 Y-15.122 Z-5.051 B-19.345 C76.672 F216.7053 +X21.65 Y-15.12 Z-5.052 C76.671 F79264.8359 +X21.657 Y-15.119 C76.67 F79282.912 +X24.185 Y-14.717 Z-5.121 B-19.352 C76.324 F221.2064 +X24.192 Y-14.716 Z-5.122 C76.323 F79012.6102 +X25.587 Y-14.484 Z-5.158 B-19.355 C76.172 F404.7049 +X25.594 Y-14.483 C76.171 F79475.6252 +X29.561 Y-13.802 Z-5.262 B-19.36 C75.893 F144.0448 +X29.568 Y-13.801 C75.892 F78973.1829 +X29.59 Y-13.797 C75.891 F26323.236 +X29.597 Y-13.796 Z-5.263 F78971.2159 +X29.605 Y-13.794 F78953.5537 +X33.166 Y-13.186 Z-5.363 B-19.364 C75.701 F161.2962 +X33.187 Y-13.182 Z-5.364 B-19.365 C75.684 F19203.8715 +X33.194 Y-13.181 C75.678 F57753.8859 +X33.705 Y-13.086 Z-5.376 B-19.381 C74.797 F593.7168 +X34.257 Y-12.957 Z-5.391 B-19.427 C71.873 F272.4494 +X34.513 Y-12.876 Z-5.396 B-19.464 C68.015 F249.4536 +X34.613 Y-12.831 B-19.476 C64.116 F268.0342 +X34.71 Y-12.78 Z-5.393 B-19.458 C60.0 F253.3516 +X34.805 Y-12.719 Z-5.39 B-19.412 C55.885 F248.2241 +X34.908 Y-12.632 Z-5.387 B-19.337 C51.762 F240.8843 +X35.03 Y-12.505 Z-5.381 B-19.232 C47.621 F231.5409 +X35.168 Y-12.338 Z-5.373 B-19.112 C43.815 F241.9904 +X35.327 Y-12.109 Z-5.361 B-18.976 C40.201 F243.5104 +X35.449 Y-11.902 Z-5.349 B-18.873 C37.764 F345.9178 +X35.577 Y-11.649 Z-5.333 B-18.766 C35.42 F345.6564 +X35.694 Y-11.383 Z-5.315 B-18.669 C33.433 F391.346 +X35.815 Y-11.071 Z-5.293 B-18.571 C31.523 F390.4509 +X35.923 Y-10.757 Z-5.27 B-18.484 C29.912 F443.2283 +X36.081 Y-10.223 Z-5.231 B-18.359 C27.679 F302.5144 +X36.229 Y-9.623 Z-5.185 B-18.242 C25.701 F317.421 +X36.392 Y-8.784 Z-5.119 B-18.109 C23.553 F267.0663 +X36.519 Y-7.934 Z-5.051 B-18.002 C21.872 F307.4231 +X36.66 Y-6.629 Z-4.943 B-17.877 C19.95 F233.8258 +X36.719 Y-5.862 Z-4.879 B-17.82 C19.1 F452.611 +X36.748 Y-5.442 Z-4.843 F1419.3659 +X37.219 Y-5.458 Z-5.021 B-24.839 C14.375 F46.4846 +X37.664 Y-5.468 Z-5.256 B-31.944 C11.644 F50.5354 +X37.636 Y-5.889 Z-5.292 F1419.3661 +X37.544 Y-6.965 Z-5.386 B-32.011 C13.033 F344.0992 +X37.543 Y-6.973 B-32.012 C13.046 F39793.6287 +X37.452 Y-7.793 Z-5.453 B-32.075 C14.39 F409.331 +X37.362 Y-8.45 Z-5.505 B-32.136 C15.696 F466.4419 +X37.259 Y-9.073 Z-5.553 B-32.204 C17.175 F448.6206 +X37.143 Y-9.66 Z-5.598 B-32.279 C18.84 F431.2424 +X37.013 Y-10.209 Z-5.638 B-32.361 C20.7 F414.3782 +X36.875 Y-10.705 Z-5.673 B-32.445 C22.705 F410.3976 +X36.792 Y-10.971 Z-5.691 B-32.495 C23.946 F694.9742 +X36.626 Y-11.444 Z-5.724 B-32.596 C26.53 F350.3813 +X36.464 Y-11.839 Z-5.75 B-32.694 C29.194 F360.0582 +X36.297 Y-12.186 Z-5.771 B-32.794 C32.11 F346.6796 +X36.127 Y-12.486 Z-5.787 B-32.895 C35.279 F335.0213 +X35.958 Y-12.741 Z-5.799 B-32.993 C38.699 F324.8029 +X35.793 Y-12.955 Z-5.806 B-33.085 C42.358 F316.2265 +X35.7 Y-13.064 Z-5.809 B-33.135 C44.595 F532.5187 +X35.592 Y-13.178 Z-5.815 B-33.19 C47.336 F444.3448 +X35.491 Y-13.276 Z-5.818 B-33.236 C50.069 F455.5174 +X35.374 Y-13.374 Z-5.821 B-33.281 C53.347 F388.3394 +X35.259 Y-13.457 Z-5.822 B-33.314 C56.621 F396.6235 +X35.144 Y-13.528 B-33.336 C59.896 F403.0416 +X35.023 Y-13.593 Z-5.821 B-33.347 C63.176 F407.5184 +X34.912 Y-13.647 Z-5.822 B-33.345 C66.286 F436.2698 +X34.784 Y-13.699 Z-5.823 B-33.334 C69.279 F442.7407 +X34.583 Y-13.764 Z-5.82 B-33.314 C72.144 F433.6833 +X34.253 Y-13.853 Z-5.814 B-33.288 C74.868 F411.0258 +X33.915 Y-13.927 Z-5.808 B-33.271 C76.4 F614.7876 +X33.307 Y-14.043 Z-5.793 B-33.25 C77.68 F523.8826 +X33.298 Y-14.044 Z-5.792 B-33.249 C77.687 F49438.7077 +X33.003 Y-14.097 Z-5.783 B-33.25 C77.782 F1779.0487 +X29.665 Y-14.68 Z-5.695 B-33.247 C77.896 F174.7313 +X29.658 Y-14.682 F79891.5766 +X25.324 Y-15.411 Z-5.58 B-33.241 C78.287 F132.4253 +X25.317 Y-15.412 C78.288 F79522.4954 +X24.423 Y-15.557 Z-5.556 B-33.24 C78.403 F635.0562 +X24.416 Y-15.558 C78.404 F79455.9674 +X21.781 Y-15.973 Z-5.482 B-33.235 C78.811 F214.2281 +X21.774 Y-15.974 Z-5.481 C78.812 F79294.3804 +X21.767 Y-15.975 C78.813 F79294.1225 +X19.135 Y-16.364 Z-5.405 B-33.227 C79.325 F212.3933 +X19.128 Y-16.365 C79.326 F79118.5271 +X19.121 Y-16.366 Z-5.404 C79.328 F79095.2778 +X16.478 Y-16.727 Z-5.326 B-33.217 C79.95 F209.3822 +X16.471 Y-16.728 C79.952 F78874.8442 +X14.27 Y-17.002 Z-5.257 B-33.206 C80.557 F248.9171 +X14.263 Y-17.003 C80.559 F78763.0876 +X11.458 Y-17.31 Z-5.166 B-33.189 C81.45 F192.9134 +X10.691 Y-17.383 Z-5.142 B-33.184 C81.718 F699.9404 +X10.684 Y-17.384 C81.721 F78252.47 +X10.118 Y-17.437 Z-5.122 B-33.18 C81.926 F943.9872 +X10.111 C81.929 F77864.011 +X7.77 Y-17.628 Z-5.037 B-33.162 C82.844 F226.0529 +X7.763 C82.847 F77342.8873 +X6.419 Y-17.715 Z-4.988 B-33.151 C83.423 F389.0612 +X6.412 C83.426 F77096.2068 +X5.073 Y-17.784 Z-4.937 B-33.139 C84.04 F386.4437 +X5.065 C84.044 F67298.6104 +X3.726 Y-17.836 Z-4.885 B-33.125 C84.699 F381.8279 +X3.712 Y-17.837 Z-4.884 C84.706 F37731.2562 +X1.68 Y-17.879 Z-4.806 B-33.101 C85.785 F247.247 +X1.674 C85.789 F74757.2255 +X1.026 Y-17.884 Z-4.781 B-33.093 C86.155 F766.8597 +X1.02 C86.158 F74085.2021 +X-0.329 Y-17.879 Z-4.725 B-33.073 C86.957 F363.3423 +X-0.335 Z-4.724 C86.961 F73836.9249 +X-1.689 Y-17.852 Z-4.667 B-33.052 C87.814 F355.8091 +X-1.696 Z-4.666 B-33.051 C87.819 F73014.8939 +X-3.732 Y-17.766 Z-4.575 B-33.015 C89.206 F230.934 +X-4.42 Y-17.723 Z-4.544 B-33.002 C89.705 F671.9303 +X-4.426 B-33.001 C89.71 F71421.9144 +X-5.786 Y-17.617 Z-4.479 B-32.973 C90.744 F333.9523 +X-5.792 Y-17.616 C90.749 F70455.1006 +X-7.02 Y-17.495 Z-4.416 B-32.946 C91.742 F361.554 +X-8.628 Y-17.293 Z-4.329 B-32.907 C93.135 F268.6144 +X-9.863 Y-17.102 Z-4.259 B-32.874 C94.282 F339.7118 +X-9.873 Y-17.1 C94.292 F41409.6627 +X-11.223 Y-16.862 Z-4.181 B-32.833 C95.617 F302.4578 +X-11.235 Y-16.86 Z-4.18 B-32.832 C95.629 F34068.2663 +X-12.576 Y-16.59 Z-4.103 B-32.786 C97.025 F295.8251 +X-12.587 Y-16.588 Z-4.102 B-32.785 C97.037 F33638.0783 +X-13.914 Y-16.284 Z-4.024 B-32.733 C98.505 F289.4959 +X-13.925 Y-16.281 Z-4.023 C98.519 F32862.1067 +X-15.249 Y-15.936 Z-3.942 B-32.675 C100.079 F280.0842 +X-15.26 Y-15.933 Z-3.941 C100.093 F32095.9954 +X-16.564 Y-15.548 Z-3.857 B-32.613 C101.73 F274.1195 +X-16.575 Y-15.544 Z-3.856 B-32.612 C101.744 F31333.1454 +X-17.627 Y-15.2 Z-3.778 B-32.559 C103.14 F328.4449 +X-18.323 Y-14.951 Z-3.727 B-32.521 C104.098 F484.5071 +X-19.418 Y-14.52 Z-3.647 B-32.46 C105.66 F299.3285 +X-19.424 Y-14.518 C105.667 F62151.3012 +X-20.252 Y-14.166 Z-3.58 B-32.412 C106.877 F387.3783 +X-20.257 Y-14.163 Z-3.579 C106.884 F61471.6301 +X-21.031 Y-13.815 Z-3.51 B-32.366 C108.021 F409.2952 +X-22.66 Y-13.019 Z-3.373 B-32.266 C110.329 F193.6638 +X-22.954 Y-12.869 Z-3.352 B-32.247 C110.715 F1096.3644 +X-22.959 Y-12.866 C110.721 F67961.3785 +X-23.638 Y-12.513 Z-3.295 B-32.206 C111.584 F478.3879 +X-24.343 Y-12.124 Z-3.235 B-32.164 C112.462 F458.8213 +X-25.389 Y-11.508 Z-3.145 B-32.106 C113.719 F308.7928 +X-25.394 Y-11.505 B-32.105 C113.725 F59260.3262 +X-26.552 Y-10.783 Z-3.032 B-32.045 C115.033 F280.7638 +X-26.557 Y-10.78 C115.039 F60327.773 +X-27.686 Y-10.037 Z-2.918 B-31.99 C116.218 F291.256 +X-27.697 Y-10.029 Z-2.917 C116.228 F30325.9475 +X-28.806 Y-9.268 Z-2.804 B-31.939 C117.283 F301.3724 +X-28.816 Y-9.26 Z-2.803 C117.293 F30903.6616 +X-29.911 Y-8.481 Z-2.691 B-31.891 C118.233 F310.9208 +X-29.917 Y-8.478 C118.237 F67967.0496 +X-30.995 Y-7.682 Z-2.578 B-31.848 C119.075 F320.6015 +X-31.0 Y-7.678 Z-2.577 C119.079 F64901.2709 +X-32.066 Y-6.864 Z-2.462 B-31.811 C119.821 F329.6481 +X-32.071 Y-6.859 C119.824 F65777.5217 +X-33.358 Y-5.845 Z-2.319 B-31.771 C120.606 F278.401 +X-33.364 Y-5.84 Z-2.318 C120.609 F67026.0734 +X-35.204 Y-4.34 Z-2.106 B-31.725 C121.511 F200.6143 +X-36.211 Y-3.498 Z-1.99 B-31.705 C121.902 F378.4222 +X-36.217 Y-3.493 Z-1.989 C121.904 F70496.3728 +X-37.675 Y-2.253 Z-1.821 B-31.681 C122.348 F268.6407 +X-37.68 Y-2.248 Z-1.82 C122.349 F73096.2871 +X-39.747 Y-0.46 Z-1.58 B-31.661 C122.752 F197.6597 +X-40.04 Y-0.758 Z-1.868 B-38.849 C124.709 F229.188 +X-40.31 Y-1.021 Z-2.208 B-46.062 C126.136 F267.9567 +X-38.322 Y-2.741 Z-2.441 B-46.074 C125.738 F204.4673 +X-38.311 Y-2.75 Z-2.442 B-46.075 C125.735 F37799.5261 +X-36.775 Y-4.058 Z-2.618 B-46.091 C125.255 F252.7272 +X-36.77 Y-4.062 Z-2.619 C125.253 F72536.4597 +X-35.75 Y-4.914 Z-2.735 B-46.104 C124.845 F368.7612 +X-35.745 Y-4.918 C124.843 F71519.1111 +X-34.127 Y-6.236 Z-2.92 B-46.131 C124.04 F225.5091 +X-34.122 Y-6.24 C124.037 F69060.8975 +X-32.61 Y-7.434 Z-3.087 B-46.161 C123.104 F232.3656 +X-32.605 Y-7.438 Z-3.088 C123.1 F67554.2622 +X-31.216 Y-8.496 Z-3.235 B-46.194 C122.082 F245.0433 +X-30.454 Y-9.057 Z-3.316 B-46.215 C121.458 F436.9278 +X-30.447 Y-9.062 Z-3.317 C121.452 F47093.2174 +X-29.344 Y-9.849 Z-3.429 B-46.246 C120.47 F297.1943 +X-29.334 Y-9.856 Z-3.43 B-46.247 C120.46 F32042.3278 +X-28.21 Y-10.626 Z-3.542 B-46.28 C119.363 F286.335 +X-28.2 Y-10.633 Z-3.543 B-46.281 C119.353 F31529.7125 +X-27.04 Y-11.392 Z-3.656 B-46.318 C118.12 F272.7735 +X-27.029 Y-11.398 C118.109 F30993.4909 +X-25.851 Y-12.128 Z-3.767 B-46.359 C116.753 F264.3635 +X-25.841 Y-12.134 Z-3.768 C116.741 F30511.0733 +X-24.784 Y-12.76 Z-3.858 B-46.398 C115.434 F289.6793 +X-23.417 Y-13.506 Z-3.979 B-46.45 C113.631 F221.8106 +X-23.376 Y-13.527 Z-3.983 B-46.452 C113.576 F7451.226 +X-23.366 Y-13.532 Z-3.984 C113.562 F29810.6647 +X-22.213 Y-14.117 Z-4.077 B-46.499 C111.935 F259.0972 +X-20.928 Y-14.709 Z-4.179 B-46.552 C110.025 F230.8429 +X-19.369 Y-15.359 Z-4.295 B-46.614 C107.681 F192.4139 +X-18.023 Y-15.862 Z-4.391 B-46.662 C105.748 F230.8319 +X-16.858 Y-16.245 Z-4.478 B-46.701 C104.153 F276.2273 +X-16.847 Y-16.248 Z-4.479 C104.138 F29840.3549 +X-15.518 Y-16.647 Z-4.567 B-46.742 C102.404 F249.9493 +X-15.507 Y-16.65 Z-4.568 C102.39 F30242.5279 +X-14.171 Y-17.004 Z-4.651 B-46.779 C100.744 F257.6918 +X-14.16 Y-17.006 Z-4.652 B-46.78 C100.731 F30710.8664 +X-12.806 Y-17.32 Z-4.732 B-46.814 C99.16 F263.4005 +X-12.794 Y-17.323 Z-4.733 B-46.815 C99.147 F31230.7365 +X-11.437 Y-17.596 Z-4.81 B-46.846 C97.667 F271.9055 +X-11.425 Y-17.599 C97.655 F31799.9516 +X-10.055 Y-17.836 Z-4.885 B-46.875 C96.252 F278.4086 +X-10.043 Y-17.838 B-46.876 C96.24 F31970.2466 +X-8.485 Y-18.067 Z-4.966 B-46.905 C94.748 F252.9559 +X-6.857 Y-18.26 Z-5.05 B-46.931 C93.298 F250.5134 +X-5.9 Y-18.352 Z-5.099 B-46.945 C92.493 F436.3454 +X-5.894 Y-18.353 Z-5.1 B-46.946 C92.488 F67661.2523 +X-4.516 Y-18.461 Z-5.166 B-46.964 C91.386 F309.7748 +X-4.51 Y-18.462 C91.381 F68563.1232 +X-3.139 Y-18.542 Z-5.23 B-46.982 C90.351 F318.9491 +X-3.133 C90.346 F69662.1502 +X-1.761 Y-18.595 Z-5.291 B-46.997 C89.376 F325.9507 +X-1.748 Y-18.596 C89.367 F35072.6317 +X-0.399 Y-18.624 Z-5.349 B-47.011 C88.47 F338.3776 +X-0.386 B-47.012 C88.462 F35516.5365 +X0.979 Y-18.63 Z-5.406 B-47.025 C87.609 F341.2654 +X0.992 C87.601 F36052.12 +X1.857 Y-18.623 Z-5.44 B-47.032 C87.088 F546.7798 +X1.87 C87.081 F36380.0491 +X3.713 Y-18.582 Z-5.51 B-47.047 C86.054 F261.3516 +X3.727 Y-18.581 C86.047 F36666.737 +X5.07 Y-18.528 Z-5.561 B-47.057 C85.353 F365.3503 +X5.084 Y-18.527 C85.347 F36842.4997 +X6.431 Y-18.456 Z-5.61 B-47.066 C84.695 F369.9123 +X6.444 Y-18.455 Z-5.611 C84.688 F37229.736 +X7.789 Y-18.368 Z-5.659 B-47.074 C84.079 F375.78 +X7.803 Y-18.367 C84.073 F37720.428 +X9.849 Y-18.202 Z-5.733 B-47.084 C83.22 F251.227 +X9.863 Y-18.201 C83.214 F37967.7264 +X10.721 Y-18.122 Z-5.764 B-47.088 C82.882 F606.1587 +X10.735 Y-18.121 C82.877 F38301.0447 +X13.779 Y-17.806 Z-5.863 B-47.1 C81.812 F174.0375 +X14.312 Y-17.743 Z-5.881 B-47.102 C81.643 F1003.7554 +X14.318 Y-17.742 C81.641 F86046.2459 +X16.538 Y-17.466 Z-5.95 B-47.109 C80.995 F243.9846 +X16.545 Y-17.465 C80.993 F78561.5632 +X19.208 Y-17.101 Z-6.029 B-47.117 C80.328 F206.3914 +X19.215 Y-17.1 C80.327 F79673.093 +X21.858 Y-16.709 Z-6.105 B-47.122 C79.78 F211.0407 +X21.866 Y-16.707 C79.779 F68746.9073 +X24.513 Y-16.29 Z-6.179 B-47.126 C79.344 F213.5127 +X24.52 Y-16.288 C79.343 F80160.2445 +X25.89 Y-16.065 Z-6.216 B-47.128 C79.16 F415.842 +X25.897 Y-16.064 C79.159 F80539.0228 +X29.725 Y-15.418 Z-6.316 B-47.132 C78.802 F150.623 +X29.732 Y-15.417 Z-6.317 F80881.8344 +X33.28 Y-14.799 Z-6.412 B-47.133 C78.651 F164.6274 +X33.363 Y-14.783 Z-6.415 B-47.134 C78.611 F6203.83 +X33.374 Y-14.781 C78.603 F47056.4975 +X33.604 Y-14.74 Z-6.421 B-47.136 C78.342 F1961.1804 +X33.805 Y-14.703 Z-6.426 B-47.139 C77.965 F1940.1383 +X34.143 Y-14.634 Z-6.433 B-47.152 C76.827 F901.563 +X34.418 Y-14.572 Z-6.438 B-47.162 C75.455 F910.9058 +X34.736 Y-14.488 Z-6.443 B-47.176 C73.091 F616.2395 +X34.809 Y-14.466 B-47.179 C72.364 F2187.5487 +X34.998 Y-14.404 Z-6.445 B-47.189 C70.046 F728.4727 +X35.137 Y-14.351 Z-6.446 B-47.195 C67.729 F779.7703 +X35.251 Y-14.301 B-47.199 C65.41 F812.0031 +X35.361 Y-14.248 C63.091 F819.9683 +X35.531 Y-14.155 B-47.191 C59.524 F527.0449 +X35.693 Y-14.052 Z-6.445 B-47.176 C55.956 F523.8861 +X35.808 Y-13.969 Z-6.444 B-47.16 C53.389 F719.9349 +X35.924 Y-13.877 Z-6.443 B-47.14 C50.823 F712.7763 +X36.008 Y-13.805 Z-6.441 B-47.122 C48.968 F974.3499 +X36.093 Y-13.725 Z-6.44 B-47.102 C47.112 F963.3275 +X36.179 Y-13.639 Z-6.437 B-47.08 C45.255 F950.7065 +X36.268 Y-13.545 Z-6.433 B-47.056 C43.397 F936.608 +X36.419 Y-13.364 Z-6.429 B-47.011 C40.301 F551.9925 +X36.574 Y-13.162 Z-6.423 B-46.963 C37.318 F557.5944 +X36.726 Y-12.94 Z-6.415 B-46.914 C34.536 F579.4335 +X36.88 Y-12.687 Z-6.405 B-46.861 C31.843 F578.803 +X37.034 Y-12.401 Z-6.392 B-46.807 C29.252 F579.1417 +X37.187 Y-12.08 Z-6.375 B-46.751 C26.774 F580.5482 +X37.337 Y-11.72 Z-6.354 B-46.695 C24.418 F583.0631 +X37.483 Y-11.32 Z-6.329 B-46.64 C22.194 F586.5844 +X37.623 Y-10.881 Z-6.3 B-46.587 C20.108 F590.9148 +X37.756 Y-10.4 Z-6.267 B-46.535 C18.165 F595.7704 +X37.882 Y-9.88 Z-6.23 B-46.485 C16.367 F600.8546 +X37.997 Y-9.319 Z-6.19 B-46.438 C14.716 F605.8605 +X38.072 Y-8.908 Z-6.16 B-46.407 C13.656 F877.4915 +X38.165 Y-8.322 Z-6.117 B-46.367 C12.326 F652.1219 +X38.257 Y-7.616 Z-6.063 B-46.326 C10.967 F577.9221 +X38.335 Y-6.878 Z-6.004 B-46.29 C9.786 F589.4789 +X38.42 Y-5.888 Z-5.92 B-46.251 C8.492 F466.3294 +X38.449 Y-5.468 Z-5.885 F1419.3659 +X38.775 Y-5.457 Z-6.268 B-53.428 C7.446 F53.9239 +X39.053 Y-5.441 Z-6.688 B-60.613 C6.579 F53.3629 +X39.025 Y-5.861 Z-6.723 F1419.3645 +X38.98 Y-6.442 Z-6.769 B-60.623 C7.307 F802.2979 +X38.931 Y-6.98 Z-6.812 B-60.634 C8.072 F835.8538 +X38.866 Y-7.593 Z-6.859 B-60.648 C9.068 F701.3953 +X38.792 Y-8.174 Z-6.902 B-60.663 C10.158 F702.0273 +X38.711 Y-8.724 Z-6.942 B-60.68 C11.346 F698.4889 +X38.621 Y-9.244 Z-6.979 B-60.698 C12.634 F693.7353 +X38.524 Y-9.735 Z-7.012 B-60.718 C14.02 F688.0831 +X38.45 Y-10.07 Z-7.033 B-60.732 C15.071 F952.8916 +X38.378 Y-10.371 Z-7.053 B-60.745 C16.094 F1015.8505 +X38.303 Y-10.655 Z-7.071 B-60.758 C17.146 F1019.8245 +X38.227 Y-10.925 Z-7.088 B-60.772 C18.229 F1022.9332 +X38.15 Y-11.179 Z-7.103 B-60.785 C19.34 F1025.2163 +X38.023 Y-11.561 Z-7.126 B-60.807 C21.188 F636.1066 +X37.891 Y-11.913 Z-7.145 B-60.829 C23.127 F629.6581 +X37.757 Y-12.236 Z-7.162 B-60.851 C25.158 F621.5828 +X37.619 Y-12.533 Z-7.176 B-60.874 C27.277 F613.5975 +X37.48 Y-12.804 Z-7.187 B-60.896 C29.481 F605.8316 +X37.34 Y-13.051 Z-7.196 B-60.918 C31.764 F598.4008 +X37.198 Y-13.276 Z-7.203 B-60.939 C34.119 F591.3571 +X37.057 Y-13.481 Z-7.208 B-60.959 C36.542 F584.7243 +X36.916 Y-13.668 Z-7.213 B-60.977 C39.025 F578.4687 +X36.825 Y-13.779 Z-7.216 B-60.989 C40.651 F893.1714 +X36.72 Y-13.898 Z-7.219 B-61.002 C42.551 F769.8755 +X36.618 Y-14.009 Z-7.222 B-61.013 C44.449 F776.3497 +X36.518 Y-14.11 Z-7.224 B-61.024 C46.346 F781.6227 +X36.417 Y-14.204 Z-7.225 B-61.033 C48.242 F785.593 +X36.279 Y-14.322 Z-7.226 B-61.045 C50.855 F571.7403 +X36.008 Y-14.52 B-61.061 C55.831 F299.7546 +X35.872 Y-14.606 Z-7.227 B-61.066 C58.312 F604.5102 +X35.746 Y-14.68 Z-7.229 B-61.07 C60.691 F634.8442 +X35.563 Y-14.777 Z-7.231 B-61.072 C64.161 F435.5411 +X35.471 Y-14.82 C65.803 F915.8547 +X35.377 Y-14.861 B-61.071 C67.38 F940.8292 +X35.206 Y-14.928 Z-7.23 B-61.067 C69.894 F574.9639 +X35.001 Y-14.996 Z-7.228 B-61.063 C72.29 F575.5892 +X34.745 Y-15.07 Z-7.224 B-61.056 C74.538 F572.0885 +X34.524 Y-15.129 Z-7.221 B-61.051 C76.015 F802.5657 +X34.275 Y-15.188 Z-7.216 B-61.047 C77.263 F861.7188 +X33.893 Y-15.265 Z-7.209 B-61.042 C78.5 F722.5693 +X33.506 Y-15.333 Z-7.201 B-61.039 C79.115 F975.3862 +X33.498 Y-15.334 C79.121 F57402.8893 +X33.195 Y-15.391 Z-7.191 C79.245 F1698.4022 +X29.913 Y-15.962 Z-7.103 B-61.038 C79.37 F177.5095 +X29.9 Y-15.965 C79.371 F42903.9955 +X26.779 Y-16.495 Z-7.02 B-61.037 C79.635 F183.2093 +X26.773 Y-16.496 C79.636 F84056.4116 +X24.608 Y-16.852 Z-6.961 B-61.036 C79.933 F258.4661 +X24.599 Y-16.853 C79.934 F58805.9918 +X21.931 Y-17.274 Z-6.887 B-61.034 C80.384 F206.5895 +X21.924 Y-17.275 C80.386 F79134.0487 +X19.269 Y-17.669 Z-6.811 B-61.031 C80.954 F203.3013 +X19.262 Y-17.67 C80.955 F78331.6853 +X16.601 Y-18.033 Z-6.732 B-61.027 C81.645 F198.4244 +X16.595 C81.647 F77486.8518 +X16.588 Y-18.034 C81.649 F77478.8564 +X14.369 Y-18.311 Z-6.663 B-61.024 C82.316 F233.0471 +X14.362 Y-18.312 C82.318 F76699.2291 +X12.561 Y-18.513 Z-6.606 B-61.021 C82.928 F281.6598 +X12.554 Y-18.514 C82.93 F76036.2408 +X10.754 Y-18.694 Z-6.547 B-61.017 C83.603 F276.7602 +X10.747 C83.605 F75380.0302 +X9.368 Y-18.818 Z-6.5 B-61.014 C84.166 F354.9834 +X9.361 C84.169 F75074.2271 +X7.819 Y-18.938 Z-6.446 B-61.01 C84.842 F312.4391 +X7.812 Z-6.445 C84.845 F68948.1669 +X6.448 Y-19.027 Z-6.397 B-61.006 C85.483 F347.3647 +X6.441 C85.486 F73568.2523 +X3.92 Y-19.148 Z-6.304 B-60.998 C86.777 F183.1696 +X3.705 Y-19.154 Z-6.297 B-60.997 C86.895 F2120.1861 +X3.699 Z-6.296 C86.898 F72355.6332 +X2.197 Y-19.191 Z-6.238 B-60.991 C87.755 F298.406 +X2.188 C87.76 F53245.2809 +X0.963 Y-19.203 Z-6.189 B-60.986 C88.505 F358.5909 +X0.951 Z-6.188 C88.513 F35259.1052 +X-0.411 Y-19.197 Z-6.132 B-60.98 C89.39 F316.3663 +X-0.423 Z-6.131 C89.398 F34733.705 +X-1.794 Y-19.168 Z-6.073 B-60.973 C90.335 F307.557 +X-1.806 Y-19.167 C90.344 F34230.7262 +X-3.186 Y-19.113 Z-6.012 B-60.965 C91.346 F298.516 +X-3.198 C91.355 F34004.7334 +X-4.578 Y-19.033 Z-5.95 B-60.957 C92.419 F291.4976 +X-4.59 Y-19.032 Z-5.949 C92.428 F33589.3685 +X-6.256 Y-18.9 Z-5.87 B-60.945 C93.802 F234.6183 +X-7.746 Y-18.745 Z-5.797 B-60.934 C95.116 F254.4929 +X-9.21 Y-18.556 Z-5.723 B-60.922 C96.494 F251.2348 +X-10.181 Y-18.404 Z-5.674 B-60.913 C97.457 F369.2441 +X-10.192 Y-18.402 Z-5.673 C97.469 F31620.4581 +X-11.574 Y-18.161 Z-5.599 B-60.9 C98.911 F252.6724 +X-11.579 Y-18.16 Z-5.598 C98.917 F62500.4468 +X-12.964 Y-17.88 Z-5.52 B-60.885 C100.453 F244.0342 +X-12.969 Y-17.879 C100.459 F61357.0911 +X-14.317 Y-17.565 Z-5.44 B-60.869 C102.047 F242.3728 +X-14.349 Y-17.557 Z-5.438 B-60.868 C102.086 F10073.4945 +X-14.354 Y-17.556 C102.093 F60446.3537 +X-15.551 Y-17.243 Z-5.364 B-60.852 C103.588 F263.8053 +X-15.713 Y-17.196 Z-5.355 B-60.85 C103.796 F1917.7209 +X-15.724 Y-17.193 Z-5.354 C103.81 F28796.7965 +X-16.398 Y-17.002 Z-5.31 B-60.84 C104.692 F455.9449 +X-17.084 Y-16.786 Z-5.268 B-60.83 C105.604 F442.0397 +X-17.09 Y-16.784 Z-5.267 C105.613 F46288.3501 +X-17.895 Y-16.524 Z-5.211 B-60.817 C106.715 F370.0679 +X-19.154 Y-16.075 Z-5.125 B-60.796 C108.545 F227.8068 +X-20.397 Y-15.582 Z-5.037 B-60.773 C110.431 F223.5646 +X-21.643 Y-15.039 Z-4.943 B-60.749 C112.324 F220.647 +X-22.777 Y-14.498 Z-4.854 B-60.727 C113.99 F243.9038 +X-23.756 Y-14.0 Z-4.775 B-60.709 C115.372 F285.3105 +X-25.023 Y-13.309 Z-4.668 B-60.686 C117.073 F223.3288 +X-26.205 Y-12.613 Z-4.566 B-60.665 C118.562 F243.1785 +X-26.216 Y-12.607 Z-4.565 C118.574 F28869.107 +X-27.411 Y-11.866 Z-4.455 B-60.645 C119.971 F245.9214 +X-27.421 Y-11.86 Z-4.454 C119.982 F29361.2518 +X-28.583 Y-11.101 Z-4.344 B-60.627 C121.237 F258.3482 +X-28.593 Y-11.094 Z-4.343 C121.248 F29945.0194 +X-29.721 Y-10.321 Z-4.233 B-60.61 C122.375 F271.2503 +X-29.727 Y-10.318 C122.38 F56198.2551 +X-30.852 Y-9.513 Z-4.117 B-60.596 C123.388 F280.0485 +X-30.862 Y-9.505 Z-4.116 B-60.595 C123.397 F30849.292 +X-31.946 Y-8.704 Z-4.006 B-60.581 C124.284 F296.7432 +X-31.951 Y-8.7 Z-4.005 C124.288 F67059.6587 +X-33.034 Y-7.872 Z-3.89 B-60.569 C125.073 F305.6852 +X-33.04 Y-7.868 C125.077 F58020.4028 +X-34.098 Y-7.036 Z-3.774 B-60.559 C125.76 F320.6153 +X-34.108 Y-7.027 Z-3.773 C125.766 F32710.825 +X-34.977 Y-6.33 Z-3.677 B-60.552 C126.267 F399.6095 +X-34.987 Y-6.322 Z-3.676 C126.273 F34597.5041 +X-36.184 Y-5.342 Z-3.542 B-60.542 C126.857 F299.3849 +X-36.189 Y-5.337 C126.86 F67707.9405 +X-37.217 Y-4.479 Z-3.425 B-60.535 C127.276 F359.825 +X-37.222 Y-4.474 Z-3.424 C127.278 F71204.2409 +X-38.421 Y-3.456 Z-3.287 B-60.528 C127.673 F317.8066 +X-38.431 Y-3.447 Z-3.286 C127.676 F36504.5585 +X-38.956 Y-2.998 Z-3.225 B-60.526 C127.818 F744.9287 +X-38.967 Y-2.989 Z-3.224 C127.821 F36540.2718 +X-40.764 Y-1.433 Z-3.013 B-60.522 C128.176 F224.7811 +X-40.941 Y-1.574 Z-3.468 B-67.759 C128.975 F327.2978 +X-41.08 Y-1.669 Z-3.946 B-74.999 C129.696 F331.2074 +X-39.153 Y-3.337 Z-4.171 B-74.998 C129.303 F207.9586 +X-38.684 Y-3.738 Z-4.225 C129.172 F823.5637 +X-38.676 Y-3.746 Z-4.226 C129.169 F45423.6663 +X-37.581 Y-4.674 Z-4.351 C128.804 F344.1268 +X-37.576 Y-4.678 C128.802 F73170.9452 +X-36.499 Y-5.579 Z-4.473 C128.36 F337.931 +X-36.494 Y-5.583 Z-4.474 C128.357 F71120.9147 +X-35.438 Y-6.451 Z-4.591 B-74.999 C127.839 F333.1849 +X-35.433 Y-6.455 C127.837 F70345.2211 +X-34.127 Y-7.505 Z-4.733 B-75.0 C127.077 F259.7551 +X-32.874 Y-8.483 Z-4.866 C126.222 F260.733 +X-31.645 Y-9.41 Z-4.994 B-74.999 C125.265 F256.8601 +X-30.435 Y-10.289 Z-5.116 C124.207 F252.8946 +X-29.349 Y-11.047 Z-5.221 B-75.0 C123.159 F273.3706 +X-28.288 Y-11.758 Z-5.322 B-74.999 C122.048 F272.8927 +X-27.103 Y-12.515 Z-5.432 C120.704 F238.1431 +X-25.92 Y-13.23 Z-5.538 C119.254 F232.2781 +X-24.742 Y-13.899 Z-5.638 C117.708 F227.7205 +X-23.308 Y-14.655 Z-5.749 B-75.0 C115.71 F183.2693 +X-22.062 Y-15.259 Z-5.842 B-75.001 C113.868 F206.4421 +X-20.825 Y-15.809 Z-5.936 B-75.0 C111.975 F205.7057 +X-19.571 Y-16.317 Z-6.027 B-74.999 C110.064 F204.8407 +X-18.291 Y-16.784 Z-6.116 C108.176 F205.6431 +X-16.983 Y-17.215 Z-6.2 C106.334 F207.5408 +X-15.644 Y-17.608 Z-6.281 C104.553 F210.1103 +X-14.282 Y-17.962 Z-6.359 C102.846 F214.0191 +X-12.885 Y-18.278 Z-6.437 B-75.0 C101.199 F216.233 +X-11.468 Y-18.561 Z-6.513 C99.625 F220.3226 +X-10.022 Y-18.807 Z-6.591 C98.108 F222.6403 +X-8.134 Y-19.072 Z-6.691 B-74.999 C96.249 F176.2272 +X-6.275 Y-19.272 Z-6.783 C94.562 F186.3394 +X-4.708 Y-19.398 Z-6.855 C93.244 F228.9034 +X-2.694 Y-19.508 Z-6.943 C91.679 F184.4491 +X-0.34 Y-19.568 Z-7.04 C90.016 F164.1242 +X1.716 Y-19.567 Z-7.122 B-75.0 C88.696 F194.8155 +X4.177 Y-19.505 Z-7.218 B-74.999 C87.261 F168.4565 +X6.45 Y-19.395 Z-7.302 C86.077 F189.0916 +X8.969 Y-19.219 Z-7.388 C84.906 F176.4565 +X11.081 Y-19.032 Z-7.458 C84.027 F216.6899 +X11.088 Y-19.031 Z-7.459 C84.024 F70262.3356 +X14.161 Y-18.706 Z-7.557 B-75.0 C82.905 F153.7403 +X17.009 Y-18.352 Z-7.644 B-74.999 C82.03 F171.7671 +X20.007 Y-17.935 Z-7.731 B-75.0 C81.265 F168.5138 +X23.297 Y-17.434 Z-7.824 C80.597 F158.5507 +X25.081 Y-17.146 Z-7.874 C80.313 F300.1145 +X25.089 Y-17.145 C80.312 F70947.5225 +X27.578 Y-16.731 Z-7.941 C79.997 F219.6646 +X27.584 Y-16.73 Z-7.942 F84014.5721 +X30.286 Y-16.268 Z-8.014 C79.777 F207.9992 +X30.294 Y-16.267 C79.776 F79392.2926 +X33.398 Y-15.726 Z-8.097 C79.642 F185.3541 +X33.937 Y-15.628 Z-8.109 C78.909 F595.1254 +X34.241 Y-15.568 Z-8.116 C77.987 F676.4416 +X34.477 Y-15.517 Z-8.12 B-74.999 C76.98 F688.2285 +X34.798 Y-15.438 Z-8.123 B-75.0 C75.008 F384.6033 +X34.97 Y-15.39 C73.633 F580.519 +X35.123 Y-15.344 Z-8.124 C72.213 F575.4289 +X35.261 Y-15.298 Z-8.125 C70.738 F565.534 +X35.387 Y-15.252 Z-8.126 C69.219 F558.7127 +X35.501 Y-15.207 C67.658 F551.0357 +X35.608 Y-15.161 Z-8.127 C66.056 F542.4096 +X35.76 Y-15.09 C63.57 F352.7002 +X35.906 Y-15.013 Z-8.126 C61.04 F348.3943 +X36.052 Y-14.928 Z-8.125 C58.501 F347.0626 +X36.224 Y-14.817 Z-8.126 C55.626 F305.1871 +X36.552 Y-14.569 Z-8.127 C50.086 F158.3742 +X36.657 Y-14.478 Z-8.126 C48.24 F475.3159 +X36.793 Y-14.351 C45.848 F366.2424 +X36.929 Y-14.212 Z-8.124 C43.469 F367.0293 +X37.081 Y-14.044 Z-8.121 C40.855 F332.4347 +X37.176 Y-13.93 Z-8.119 C39.244 F536.3842 +X37.27 Y-13.811 Z-8.117 C37.661 F543.9049 +X37.363 Y-13.686 Z-8.115 C36.106 F551.1026 +X37.455 Y-13.555 Z-8.113 C34.577 F557.9923 +X37.589 Y-13.351 Z-8.108 C32.399 F388.8621 +X37.722 Y-13.129 Z-8.103 C30.264 F392.7982 +X37.855 Y-12.887 Z-8.095 C28.175 F396.7375 +X37.987 Y-12.625 Z-8.086 B-74.999 C26.137 F401.1251 +X38.117 Y-12.339 Z-8.075 C24.157 F406.1318 +X38.247 Y-12.028 Z-8.061 C22.238 F411.6313 +X38.373 Y-11.691 Z-8.044 B-75.0 C20.387 F417.6424 +X38.496 Y-11.327 Z-8.025 C18.606 F424.1664 +X38.616 Y-10.935 Z-8.004 C16.901 F431.2255 +X38.73 Y-10.515 Z-7.979 C15.275 F438.7898 +X38.834 Y-10.084 Z-7.954 C13.792 F466.0636 +X38.901 Y-9.779 Z-7.935 C12.837 F702.794 +X38.967 Y-9.454 Z-7.915 C11.893 F693.9853 +X39.062 Y-8.925 Z-7.88 B-74.999 C10.511 F456.6914 +X39.15 Y-8.357 Z-7.841 C9.217 F462.5521 +X39.23 Y-7.753 Z-7.798 C8.025 F472.43 +X39.301 Y-7.115 Z-7.75 B-75.0 C6.938 F482.822 +X39.363 Y-6.445 Z-7.7 C5.956 F495.5549 +X39.411 Y-5.808 Z-7.651 C5.148 F556.2817 +X39.439 Y-5.388 Z-7.615 F1419.3661 +G94 +G00 Z-6.321 +X44.25 Y-5.821 +Z5.0 +B0. +B-75.0 C123.636 +X-32.508 Y-14.734 +Z3.0 +G93 +G01 Z-3.879 F43.6112 +X-29.833 Y-10.713 Z-5.173 F60.0 +X-30.089 Y-10.541 C123.878 F1180.5569 +X-30.351 Y-10.365 C124.12 F1163.0988 +X-30.618 Y-10.182 C124.362 F1145.2228 +X-30.892 Y-9.994 C124.605 F1126.8818 +X-31.172 Y-9.8 C124.847 F1107.9838 +X-31.46 Y-9.599 C125.089 F1088.394 +X-31.755 Y-9.391 C125.331 F1068.1098 +X-32.058 Y-9.175 C125.573 F1046.8904 +X-32.37 Y-8.951 C125.815 F1024.5975 +X-32.693 Y-8.717 C126.057 F1000.9989 +X-33.027 Y-8.473 C126.298 F975.8947 +X-33.374 Y-8.216 C126.54 F947.7155 +X-33.737 Y-7.946 C126.782 F917.6999 +X-34.115 Y-7.662 C127.024 F888.7615 +X-34.51 Y-7.362 C127.266 F859.7299 +X-34.925 Y-7.046 C127.508 F829.0027 +X-35.363 Y-6.708 C127.75 F794.3037 +X-35.832 Y-6.343 C127.992 F752.9144 +X-36.337 Y-5.947 C128.233 F709.5073 +X-36.885 Y-5.513 C128.475 F664.6605 +X-37.487 Y-5.033 B-74.999 C128.717 F616.5209 +X-38.159 Y-4.492 C128.958 F562.2998 +X-38.939 Y-3.859 C129.2 F496.3652 +X-39.891 Y-3.079 C129.441 F417.5755 +X-41.192 Y-2.004 C129.682 F316.8149 +X-41.685 Y-2.006 Z-6.356 B-75.0 C129.723 F455.6355 +X-40.235 Y-3.206 B-74.999 C129.473 F285.6982 +X-39.219 Y-4.039 C129.223 F391.9291 +X-38.401 Y-4.704 C128.973 F472.0929 +X-37.701 Y-5.267 C128.723 F538.262 +X-37.078 Y-5.765 C128.473 F592.1264 +X-36.511 Y-6.213 C128.223 F639.7752 +X-35.99 Y-6.622 C127.973 F684.1693 +X-35.509 Y-6.996 Z-6.355 C127.723 F727.797 +X-35.061 Y-7.341 C127.473 F769.6805 +X-34.636 Y-7.665 C127.223 F801.5175 +X-34.229 Y-7.972 B-75.0 C126.973 F828.685 +X-33.838 Y-8.266 C126.723 F854.7232 +X-33.464 Y-8.544 C126.473 F882.1685 +X-33.106 Y-8.807 C126.223 F912.932 +X-32.763 Y-9.057 C125.973 F941.141 +X-32.433 Y-9.296 Z-6.356 C125.723 F966.7132 +X-32.113 Y-9.525 C125.473 F990.5381 +X-31.803 Y-9.745 C125.223 F1012.9539 +X-31.502 Y-9.956 C124.973 F1033.988 +X-31.209 Y-10.16 C124.723 F1053.933 +X-30.923 Y-10.357 C124.473 F1072.793 +X-30.644 Y-10.548 C124.223 F1090.6743 +X-30.371 Y-10.733 C123.973 F1107.7821 +X-30.104 Y-10.913 C123.723 F1124.0724 +X-29.842 Y-11.087 C123.473 F1139.6481 +X-29.584 Y-11.256 C123.223 F1154.5724 +X-29.331 Y-11.421 C122.973 F1168.8884 +X-29.083 Y-11.582 C122.723 F1182.646 +X-28.839 Y-11.738 C122.473 F1199.6102 +X-28.602 Y-11.888 C122.223 F1219.3922 +X-28.369 Y-12.033 C121.973 F1235.856 +X-28.141 Y-12.175 C121.723 F1250.031 +X-27.915 Y-12.314 C121.473 F1262.5378 +X-27.693 Y-12.449 C121.223 F1273.9817 +X-27.473 Y-12.581 C120.973 F1284.5292 +X-27.256 Y-12.711 Z-6.355 C120.723 F1294.4707 +X-27.041 Y-12.839 C120.473 F1304.0175 +X-26.829 Y-12.963 C120.223 F1313.3469 +X-26.618 Y-13.085 C119.973 F1322.6232 +X-26.41 Y-13.205 Z-6.354 C119.723 F1331.9971 +X-26.204 Y-13.322 C119.473 F1341.6735 +X-26.0 Y-13.436 C119.223 F1352.646 +X-25.799 Y-13.548 Z-6.353 C118.973 F1364.3391 +X-25.601 Y-13.657 C118.723 F1375.5932 +X-25.405 Y-13.763 C118.473 F1386.4414 +X-25.211 Y-13.867 C118.223 F1396.9156 +X-25.02 Y-13.969 C117.973 F1407.0365 +X-24.831 Y-14.069 Z-6.354 C117.723 F1416.8168 +X-24.643 Y-14.167 C117.473 F1426.2697 +X-24.458 Y-14.263 C117.223 F1435.3602 +X-24.275 Y-14.357 C116.973 F1444.3041 +X-24.093 Y-14.449 Z-6.355 C116.723 F1452.911 +X-23.913 Y-14.539 C116.473 F1461.2556 +X-23.734 Y-14.627 C116.223 F1469.3571 +X-23.557 Y-14.714 C115.973 F1477.2218 +X-23.382 Y-14.799 Z-6.356 C115.723 F1484.8632 +X-23.208 Y-14.883 C115.473 F1492.2944 +X-23.035 Y-14.965 C115.223 F1500.6606 +X-22.863 Y-15.045 C114.973 F1507.7172 +X-22.693 Y-15.124 C114.723 F1514.5928 +X-22.524 Y-15.202 C114.474 F1521.2871 +X-22.356 Y-15.278 C114.224 F1527.8144 +X-22.189 Y-15.353 C113.974 F1533.8475 +X-22.023 Y-15.427 C113.724 F1539.4857 +X-21.858 Y-15.499 C113.474 F1544.3957 +X-21.693 Y-15.57 C113.225 F1548.752 +X-21.529 Y-15.64 C112.975 F1552.5126 +X-21.365 Y-15.709 C112.725 F1555.7518 +X-21.202 Y-15.777 C112.475 F1558.4593 +X-21.038 Y-15.845 C112.226 F1560.645 +X-20.875 Y-15.911 C111.976 F1562.3566 +X-20.711 Y-15.977 C111.726 F1563.5537 +X-20.548 Y-16.042 C111.477 F1564.2974 +X-20.384 Y-16.106 C111.227 F1564.566 +X-20.219 Y-16.169 C110.977 F1564.3597 +X-20.054 Y-16.232 C110.727 F1563.7123 +X-19.889 Y-16.294 C110.478 F1562.6002 +X-19.722 Y-16.356 C110.228 F1561.0526 +X-19.555 Y-16.417 C109.978 F1559.0528 +X-19.387 Y-16.477 Z-6.355 C109.729 F1556.6052 +X-19.218 Y-16.537 C109.479 F1553.7125 +X-19.048 Y-16.597 C109.229 F1550.3792 +X-18.876 Y-16.656 C108.98 F1546.5945 +X-18.703 Y-16.715 C108.73 F1542.3516 +X-18.529 Y-16.773 C108.481 F1537.9425 +X-18.354 Y-16.831 C108.231 F1535.2798 +X-18.178 Y-16.889 C107.981 F1532.8621 +X-18.001 Y-16.946 C107.732 F1530.2673 +X-17.822 Y-17.003 C107.482 F1527.5246 +X-17.643 Y-17.059 C107.233 F1524.6146 +X-17.463 Y-17.115 C106.983 F1521.545 +X-17.282 Y-17.17 C106.734 F1518.3206 +X-17.099 Y-17.224 C106.484 F1514.9307 +X-16.915 Y-17.279 C106.235 F1511.4099 +X-16.73 Y-17.332 C105.985 F1507.7361 +X-16.543 Y-17.385 C105.736 F1503.9296 +X-16.356 Y-17.438 C105.486 F1500.005 +X-16.166 Y-17.49 C105.237 F1495.9749 +X-15.976 Y-17.541 C104.987 F1491.8348 +X-15.783 Y-17.592 C104.738 F1487.6334 +X-15.59 Y-17.643 C104.489 F1483.3596 +X-15.395 Y-17.692 C104.24 F1479.0533 +X-15.198 Y-17.742 Z-6.356 C103.99 F1474.7372 +X-15.0 Y-17.791 C103.741 F1470.4548 +X-14.8 Y-17.839 C103.492 F1466.266 +X-14.599 Y-17.887 C103.243 F1462.3157 +X-14.396 Y-17.934 C102.995 F1460.5585 +G94 +G00 Z5.0 +C83.102 +X19.203 Y-25.225 +Z3.0 +G93 +G01 X13.583 Y-18.772 Z-7.538 F7.3683 +X12.874 Y-18.856 C83.352 F668.7382 +X12.193 Y-18.933 C83.602 F691.1865 +X11.534 Y-19.006 C83.852 F708.0968 +X10.893 Y-19.074 C84.102 F723.3837 +X10.274 Y-19.136 C84.352 F742.8125 +X9.675 Y-19.194 C84.602 F761.6768 +X9.094 Y-19.248 C84.852 F778.8842 +X8.529 Y-19.297 C85.102 F794.8697 +X7.979 Y-19.343 C85.352 F810.0365 +X7.442 Y-19.386 C85.602 F824.6808 +X6.918 Y-19.425 B-74.999 C85.852 F839.035 +X6.406 Y-19.461 C86.102 F853.3086 +X5.906 Y-19.494 C86.352 F867.7401 +X5.418 Y-19.524 C86.602 F882.273 +X4.942 Y-19.551 C86.852 F897.4364 +X4.477 Y-19.576 C87.102 F911.0538 +X4.02 Y-19.598 C87.352 F923.5564 +X3.573 Y-19.618 C87.602 F935.9191 +X3.134 Y-19.635 C87.852 F948.1363 +X2.704 Y-19.65 C88.102 F960.2057 +X2.281 Y-19.663 C88.352 F972.1238 +X1.867 Y-19.674 C88.602 F983.7571 +X1.46 Y-19.683 C88.852 F995.42 +X1.06 Y-19.691 B-75.0 C89.102 F1006.8628 +X0.667 Y-19.696 C89.352 F1018.5373 +X0.282 Y-19.699 C89.602 F1030.2257 +X-0.097 Y-19.701 C89.852 F1041.1953 +X-0.47 C90.102 F1051.6588 +X-0.837 Y-19.7 C90.352 F1061.7852 +X-1.199 Y-19.697 C90.602 F1071.7177 +X-1.555 Y-19.692 C90.852 F1081.582 +X-1.906 Y-19.686 C91.102 F1091.4913 +X-2.251 Y-19.679 C91.352 F1101.5559 +X-2.591 Y-19.67 C91.602 F1111.9611 +X-2.925 Y-19.66 C91.852 F1122.1765 +X-3.255 Y-19.648 C92.102 F1130.6126 +X-3.581 Y-19.636 C92.352 F1138.8313 +X-3.903 Y-19.622 C92.602 F1147.389 +X-4.221 Y-19.607 C92.852 F1156.1735 +X-4.534 Y-19.591 C93.102 F1165.0615 +X-4.843 Y-19.574 C93.352 F1173.8124 +X-5.147 Y-19.555 C93.602 F1182.6688 +X-5.448 Y-19.536 C93.852 F1191.017 +X-5.745 Y-19.515 C94.102 F1199.3495 +X-6.039 Y-19.493 C94.352 F1206.9629 +X-6.329 Y-19.47 C94.602 F1214.4824 +X-6.616 Y-19.447 C94.852 F1221.1756 +X-6.899 Y-19.422 C95.102 F1228.4427 +X-7.18 Y-19.396 C95.352 F1236.1434 +X-7.457 Y-19.37 C95.602 F1244.0111 +X-7.731 Y-19.343 C95.852 F1251.4196 +X-8.001 Y-19.314 C96.102 F1258.978 +X-8.269 Y-19.285 C96.352 F1266.1353 +X-8.533 Y-19.255 C96.602 F1273.4067 +X-8.795 Y-19.224 C96.852 F1280.4391 +X-9.054 Y-19.193 Z-7.539 C97.102 F1287.2176 +X-9.31 Y-19.16 C97.352 F1294.1663 +X-9.563 Y-19.127 C97.602 F1300.8745 +X-9.813 Y-19.093 C97.852 F1307.4846 +X-10.061 Y-19.058 C98.102 F1314.0111 +X-10.307 Y-19.023 C98.352 F1320.4443 +X-10.55 Y-18.986 C98.602 F1326.7989 +X-10.79 Y-18.949 C98.852 F1333.0724 +X-11.028 Y-18.911 C99.102 F1339.2737 +X-11.264 Y-18.873 C99.352 F1345.4039 +X-11.498 Y-18.833 C99.602 F1351.4693 +X-11.729 Y-18.794 C99.852 F1356.609 +X-11.959 Y-18.754 C100.102 F1361.7168 +X-12.186 Y-18.713 C100.352 F1367.9589 +X-12.411 Y-18.672 C100.602 F1373.968 +X-12.634 Y-18.63 C100.852 F1379.4913 +X-12.855 Y-18.588 Z-7.538 C101.102 F1383.6086 +X-13.074 Y-18.544 C101.352 F1388.3088 +X-13.292 Y-18.5 C101.602 F1394.8505 +X-13.507 Y-18.455 C101.852 F1400.8281 +X-13.72 Y-18.409 C102.102 F1405.8609 +X-13.931 Y-18.363 C102.352 F1410.6661 +X-14.141 Y-18.316 C102.602 F1414.9859 +X-14.349 Y-18.269 C102.852 F1418.8992 +X-14.556 Y-18.221 C103.102 F1422.9329 +X-14.761 Y-18.173 Z-7.537 C103.352 F1426.7304 +X-14.965 Y-18.124 C103.602 F1430.501 +X-15.168 Y-18.075 C103.852 F1434.3148 +X-15.369 Y-18.025 C104.102 F1438.12 +X-15.569 Y-17.975 C104.352 F1442.2604 +X-15.767 Y-17.924 C104.602 F1446.6566 +X-15.963 Y-17.872 Z-7.536 C104.852 F1451.6127 +X-16.157 Y-17.82 C105.102 F1456.9256 +X-16.35 Y-17.767 C105.352 F1461.8621 +X-16.541 Y-17.714 C105.602 F1467.0001 +X-16.731 Y-17.661 C105.852 F1471.9078 +X-16.919 Y-17.607 Z-7.537 C106.102 F1476.7505 +X-17.105 Y-17.553 C106.352 F1481.3551 +X-17.289 Y-17.498 C106.602 F1486.1937 +X-17.473 Y-17.443 C106.852 F1490.6172 +X-17.654 Y-17.387 C107.102 F1495.3571 +X-17.834 Y-17.331 Z-7.538 C107.352 F1499.6187 +X-18.013 Y-17.275 C107.602 F1504.2418 +X-18.19 Y-17.218 C107.852 F1508.4187 +X-18.366 Y-17.161 C108.102 F1512.8765 +X-18.541 Y-17.104 C108.352 F1516.9912 +X-18.714 Y-17.046 Z-7.539 C108.602 F1521.2783 +X-18.886 Y-16.988 C108.852 F1525.076 +X-19.056 Y-16.93 C109.102 F1527.8743 +X-19.226 Y-16.871 C109.352 F1530.2115 +X-19.396 Y-16.811 C109.602 F1532.1559 +X-19.564 Y-16.751 C109.852 F1533.6802 +X-19.732 Y-16.69 C110.102 F1534.7168 +X-19.899 Y-16.628 C110.352 F1535.5891 +X-20.066 Y-16.566 C110.602 F1535.9619 +X-20.232 Y-16.503 C110.852 F1535.8045 +X-20.398 Y-16.439 C111.102 F1535.555 +X-20.564 Y-16.375 C111.352 F1534.6751 +X-20.73 Y-16.31 C111.602 F1533.6266 +X-20.896 Y-16.244 Z-7.538 C111.852 F1531.9829 +X-21.062 Y-16.177 C112.102 F1530.1564 +X-21.228 Y-16.109 C112.352 F1527.7216 +X-21.395 Y-16.04 C112.602 F1525.1169 +X-21.561 Y-15.97 C112.852 F1521.8869 +X-21.729 Y-15.899 C113.102 F1518.4506 +X-21.897 Y-15.827 Z-7.537 C113.352 F1514.4781 +X-22.065 Y-15.754 C113.602 F1509.9669 +X-22.234 Y-15.679 C113.852 F1505.2263 +X-22.405 Y-15.603 C114.102 F1499.8984 +X-22.576 Y-15.526 C114.352 F1494.1015 +X-22.748 Y-15.448 C114.602 F1488.0596 +X-22.921 Y-15.368 C114.852 F1482.6837 +X-23.095 Y-15.287 C115.102 F1477.2218 +X-23.27 Y-15.204 C115.352 F1471.615 +X-23.447 Y-15.12 C115.602 F1465.8138 +X-23.624 Y-15.034 C115.852 F1459.7202 +X-23.802 Y-14.948 C116.102 F1453.661 +X-23.982 Y-14.859 C116.352 F1447.1577 +X-24.163 Y-14.769 Z-7.538 C116.602 F1440.6108 +X-24.345 Y-14.677 C116.852 F1433.5945 +X-24.528 Y-14.584 C117.102 F1426.4671 +X-24.713 Y-14.489 C117.352 F1418.9423 +X-24.899 Y-14.392 C117.6 F1420.1702 +X-25.086 Y-14.294 C117.849 F1411.9889 +X-25.275 Y-14.194 C118.097 F1403.3193 +X-25.466 Y-14.091 C118.345 F1394.0316 +X-25.659 Y-13.987 C118.594 F1384.2472 +X-25.855 Y-13.88 C118.842 F1374.3443 +X-26.052 Y-13.77 C119.09 F1364.2358 +X-26.252 Y-13.658 C119.339 F1354.1178 +X-26.455 Y-13.544 C119.587 F1343.7762 +X-26.66 Y-13.427 C119.835 F1333.2721 +X-26.867 Y-13.307 C120.084 F1322.5935 +X-27.077 Y-13.185 C120.332 F1311.7216 +X-27.29 Y-13.06 C120.58 F1300.6075 +X-27.506 Y-12.932 C120.829 F1289.3788 +X-27.725 Y-12.801 C121.077 F1277.859 +X-27.946 Y-12.666 C121.325 F1266.0531 +X-28.171 Y-12.529 C121.574 F1254.0792 +X-28.4 Y-12.388 C121.822 F1241.754 +X-28.632 Y-12.243 C122.07 F1229.1302 +X-28.867 Y-12.095 C122.318 F1216.1241 +X-29.107 Y-11.942 C122.567 F1202.8301 +X-29.35 Y-11.786 C122.815 F1189.117 +X-29.598 Y-11.625 C123.063 F1175.096 +X-29.851 Y-11.46 C123.311 F1160.637 +X-30.108 Y-11.29 C123.56 F1145.6508 +X-30.37 Y-11.115 C123.808 F1130.0731 +X-30.638 Y-10.935 C124.056 F1113.9819 +X-30.912 Y-10.749 C124.304 F1097.1494 +X-31.193 Y-10.557 C124.552 F1079.7305 +X-31.48 Y-10.358 C124.801 F1061.424 +X-31.775 Y-10.152 C125.049 F1042.3949 +X-32.077 Y-9.939 C125.297 F1022.3321 +X-32.389 Y-9.717 C125.545 F1001.3532 +X-32.711 Y-9.486 C125.793 F979.1354 +X-33.044 Y-9.245 C126.041 F955.726 +X-33.389 Y-8.993 C126.289 F930.8337 +X-33.748 Y-8.728 C126.537 F904.7878 +X-34.122 Y-8.449 C126.785 F878.2101 +X-34.512 Y-8.156 B-74.999 C127.033 F850.3012 +X-34.921 Y-7.846 C127.281 F820.7473 +X-35.352 Y-7.516 C127.529 F789.2752 +X-35.808 Y-7.164 C127.777 F755.4718 +X-36.294 Y-6.786 C128.025 F718.8176 +X-36.818 Y-6.375 C128.273 F678.5538 +X-37.388 Y-5.923 C128.521 F633.5766 +X-38.022 Y-5.416 C128.769 F582.1292 +X-38.737 Y-4.839 C129.017 F526.6719 +X-39.573 Y-4.159 C129.264 F462.102 +X-40.62 Y-3.3 C129.512 F380.6863 +X-42.179 Y-2.008 B-75.0 C129.759 F267.0365 +G94 +G00 Z-6.244 +X-45.268 Y-5.721 +Z5.0 +B0. +B-5.545 C295.605 +X-38.238 Y-4.52 +Z3.977 +X-38.279 Y-4.606 +Z3.0 +G93 +G01 X-38.446 Y-4.956 Z-1.0 F74.6491 +X-35.486 Y-2.406 Z-1.347 F152.9543 +X-32.897 Y-0.251 Z-1.645 F177.4494 +X-30.802 Y1.417 Z-1.879 F223.1904 +X-28.947 Y2.82 Z-2.079 F257.0682 +X-27.436 Y3.902 Z-2.237 F321.5994 +X-25.892 Y4.942 Z-2.393 F321.1754 +X-24.308 Y5.934 Z-2.546 F320.0123 +X-23.095 Y6.639 Z-2.659 F426.1044 +X-21.857 Y7.308 Z-2.77 C295.606 F425.2876 +X-20.595 Y7.936 Z-2.878 F424.1469 +X-19.306 Y8.52 Z-2.983 F423.0298 +X-18.433 Y8.884 Z-3.051 F632.6563 +X-17.55 Y9.226 Z-3.118 F631.5472 +X-16.205 Y9.699 Z-3.216 F420.0519 +X-14.84 Y10.121 Z-3.31 F418.8683 +X-13.274 Y10.539 Z-3.413 F369.4562 +X-12.319 Y10.762 Z-3.472 F610.7992 +X-10.929 Y11.049 Z-3.556 F421.9864 +X-9.063 Y11.37 Z-3.662 F316.3553 +X-7.185 Y11.624 Z-3.763 F316.2401 +X-6.884 Y11.659 Z-3.779 F1974.1809 +X-6.877 F80937.4994 +X-5.772 Y11.773 Z-3.835 C295.607 F539.5796 +X-3.882 Y11.919 Z-3.928 F316.1164 +X-1.785 Y12.018 Z-4.024 F285.4908 +X0.215 Y12.056 Z-4.111 F299.7136 +X2.585 Y12.037 Z-4.209 F252.9498 +X5.214 Y11.947 Z-4.312 F227.9141 +X6.223 Y11.894 Z-4.349 F593.4067 +X6.23 Y11.893 Z-4.35 F80810.615 +X9.008 Y11.701 Z-4.449 F215.3553 +X12.082 Y11.415 Z-4.553 F194.2247 +X14.678 Y11.123 Z-4.637 F229.6195 +X18.207 Y10.663 Z-4.744 F168.4912 +X18.405 Y10.635 Z-4.75 F2994.8533 +X18.413 Y10.634 F80856.7982 +X21.661 Y10.155 Z-4.845 F182.6715 +X21.668 Y10.154 F80931.518 +X24.653 Y9.679 Z-4.929 F198.4514 +X24.66 Y9.678 F81004.2725 +X26.384 Y9.392 Z-4.976 F343.2213 +X26.391 Y9.39 F81034.5562 +X26.559 Y9.362 Z-4.981 F3523.4578 +X26.566 Y9.361 F81049.9485 +X28.267 Y9.072 Z-5.027 F347.7632 +X28.274 Y9.071 F81053.3655 +X28.74 Y8.991 Z-5.04 F1267.2415 +X28.748 Y8.99 F80979.4797 +X33.53 Y8.153 Z-5.167 F123.5382 +X34.152 Y8.002 Z-5.18 C295.608 F937.7009 +X34.288 Y7.908 Z-5.178 C295.61 F3581.4027 +X34.478 Y7.653 Z-5.164 F1889.8795 +X34.828 Y6.939 Z-5.116 C295.611 F752.3068 +X35.09 Y6.154 Z-5.058 F723.4108 +X35.215 Y5.671 Z-5.021 F1199.4997 +X35.323 Y5.171 Z-4.982 F1168.9299 +X35.452 Y4.442 Z-4.923 F807.7575 +X35.579 Y3.505 Z-4.847 F632.4046 +X35.703 Y2.191 Z-4.737 F453.0362 +X35.76 Y1.371 Z-4.667 F727.0279 +X36.26 Y1.4 Z-4.723 B-11.048 C330.498 F20.7254 +X36.749 Y1.423 Z-4.841 B-17.818 C340.903 F37.786 +X36.719 Y1.865 Z-4.878 B-17.819 C340.901 F1346.0015 +X36.64 Y2.844 Z-4.961 B-17.893 C339.779 F351.6821 +X36.581 Y3.426 Z-5.009 B-17.947 C338.964 F541.7247 +X36.439 Y4.483 Z-5.094 B-18.069 C337.089 F265.0356 +X36.33 Y5.111 Z-5.143 B-18.159 C335.664 F389.5788 +X36.219 Y5.657 Z-5.186 B-18.248 C334.183 F403.1438 +X36.07 Y6.269 Z-5.234 B-18.366 C332.149 F316.3557 +X35.906 Y6.822 Z-5.276 B-18.496 C329.799 F296.0736 +X35.725 Y7.312 Z-5.31 B-18.642 C327.049 F272.5643 +X35.578 Y7.643 Z-5.332 B-18.762 C324.62 F328.1436 +X35.441 Y7.912 Z-5.349 B-18.876 C322.118 F334.8327 +X35.315 Y8.13 Z-5.363 B-18.985 C319.523 F337.5923 +X35.093 Y8.442 Z-5.38 B-19.179 C314.079 F170.7355 +X34.914 Y8.626 Z-5.387 B-19.33 C308.477 F176.9345 +X34.758 Y8.749 Z-5.39 B-19.436 C302.174 F165.859 +X34.631 Y8.823 Z-5.396 B-19.473 C296.645 F196.2962 +X34.528 Y8.87 B-19.464 C292.386 F258.5202 +X34.255 Y8.957 Z-5.389 B-19.425 C288.14 F238.4766 +X34.036 Y9.014 Z-5.384 B-19.402 C286.519 F553.3283 +X33.62 Y9.102 Z-5.374 B-19.376 C284.982 F485.515 +X33.32 Y9.159 Z-5.366 B-19.365 C284.45 F1026.389 +X33.029 Y9.21 Z-5.359 B-19.361 C284.238 F1474.54 +X33.014 Y9.213 Z-5.358 C284.232 F33428.9029 +X29.486 Y9.828 Z-5.264 B-19.358 C284.099 F164.5819 +X29.479 Y9.829 Z-5.263 F79853.0038 +X25.55 Y10.493 Z-5.158 B-19.353 C283.813 F146.1768 +X25.542 Y10.495 F78684.0154 +X24.089 Y10.732 Z-5.118 B-19.35 C283.654 F390.477 +X24.082 Y10.733 C283.653 F78528.1632 +X21.469 Y11.144 Z-5.045 B-19.342 C283.3 F216.1909 +X21.462 Y11.145 C283.299 F78268.6198 +X18.841 Y11.532 Z-4.969 B-19.332 C282.858 F214.4649 +X18.834 Y11.533 Z-4.968 C282.856 F81684.4704 +X16.198 Y11.89 Z-4.889 B-19.321 C282.32 F212.3099 +X16.191 Y11.891 C282.319 F77644.3542 +X14.011 Y12.158 Z-4.82 B-19.309 C281.799 F255.5912 +X14.004 Y12.159 C281.797 F77634.0784 +X12.248 Y12.354 Z-4.764 B-19.297 C281.327 F316.1441 +X12.241 Y12.355 C281.325 F77760.1636 +X10.483 Y12.529 Z-4.705 B-19.283 C280.806 F314.7494 +X10.476 Y12.53 C280.804 F77262.9628 +X9.591 Y12.609 Z-4.674 B-19.276 C280.524 F623.7109 +X9.584 Y12.61 C280.521 F77271.1958 +X7.457 Y12.775 Z-4.598 B-19.256 C279.793 F258.6744 +X6.266 Y12.85 Z-4.555 B-19.244 C279.349 F459.2351 +X6.259 B-19.243 C279.346 F77090.4613 +X4.929 Y12.918 Z-4.505 B-19.229 C278.819 F409.8753 +X4.922 C278.816 F77008.305 +X3.591 Y12.968 Z-4.453 B-19.213 C278.252 F406.9836 +X3.584 C278.249 F73846.4474 +X2.257 Y12.999 Z-4.4 B-19.196 C277.649 F405.4405 +X2.25 Y13.0 Z-4.399 B-19.195 C277.645 F76191.0129 +X-0.265 Y13.007 Z-4.295 B-19.157 C276.394 F210.8106 +X-1.77 Y12.974 Z-4.231 B-19.129 C275.571 F346.7971 +X-1.777 C275.567 F74820.0144 +X-3.109 Y12.921 Z-4.171 B-19.102 C274.787 F386.2807 +X-3.116 Y12.92 Z-4.17 C274.783 F73988.7148 +X-4.936 Y12.807 Z-4.083 B-19.06 C273.636 F277.4991 +X-6.249 Y12.692 Z-4.018 B-19.026 C272.743 F376.9021 +X-7.14 Y12.597 Z-3.975 B-19.0 C272.106 F547.2768 +X-7.147 Z-3.974 C272.101 F71364.0271 +X-8.473 Y12.429 Z-3.904 B-18.96 C271.099 F360.8863 +X-8.48 Y12.428 C271.093 F70446.7604 +X-9.794 Y12.228 Z-3.83 B-18.916 C270.032 F355.258 +X-9.801 Y12.226 C270.026 F69282.4317 +X-11.112 Y11.989 Z-3.753 B-18.868 C268.895 F347.1623 +X-11.121 Y11.987 Z-3.752 C268.886 F46764.0042 +X-12.415 Y11.72 Z-3.674 B-18.816 C267.697 F341.9406 +X-12.428 Y11.717 B-18.815 C267.685 F34312.6747 +X-13.716 Y11.417 Z-3.594 B-18.756 C266.425 F333.4722 +X-13.728 Y11.414 Z-3.593 B-18.755 C266.412 F34378.574 +X-15.011 Y11.077 Z-3.512 B-18.689 C265.077 F324.3563 +X-15.023 Y11.074 Z-3.511 C265.064 F33557.1927 +X-16.302 Y10.695 Z-3.426 B-18.615 C263.646 F314.0155 +X-16.314 Y10.691 Z-3.425 C263.632 F32413.0602 +X-17.417 Y10.326 Z-3.346 B-18.546 C262.339 F352.0554 +X-18.179 Y10.049 Z-3.29 B-18.496 C261.409 F496.3687 +X-19.303 Y9.604 Z-3.204 B-18.417 C259.991 F327.3913 +X-20.158 Y9.233 Z-3.135 B-18.355 C258.886 F419.8371 +X-21.616 Y8.538 Z-3.012 B-18.246 C257.001 F240.5038 +X-22.51 Y8.076 Z-2.935 B-18.18 C255.893 F390.8079 +X-22.516 Y8.073 B-18.179 C255.886 F61693.4874 +X-23.714 Y7.424 Z-2.829 B-18.094 C254.53 F295.4973 +X-23.719 Y7.422 B-18.093 C254.525 F72984.8573 +X-24.894 Y6.741 Z-2.722 B-18.013 C253.286 F302.0164 +X-24.9 Y6.737 Z-2.721 C253.28 F60766.152 +X-26.042 Y6.031 Z-2.612 B-17.939 C252.152 F310.6152 +X-26.048 Y6.027 C252.146 F61596.6798 +X-27.165 Y5.296 Z-2.501 B-17.872 C251.123 F318.5311 +X-27.171 Y5.292 B-17.871 C251.117 F62070.5272 +X-28.267 Y4.539 Z-2.389 B-17.81 C250.193 F326.1476 +X-28.273 Y4.535 Z-2.388 B-17.809 C250.188 F63093.2551 +X-29.347 Y3.765 Z-2.276 B-17.754 C249.362 F335.3321 +X-29.353 Y3.76 Z-2.275 C249.358 F63758.6359 +X-30.414 Y2.971 Z-2.161 B-17.703 C248.62 F342.6697 +X-30.42 Y2.967 C248.616 F65051.256 +X-31.049 Y2.487 Z-2.091 B-17.676 C248.216 F583.3806 +X-31.055 Y2.482 B-17.675 C248.213 F64680.7161 +X-32.509 Y1.343 Z-1.929 B-17.618 C247.394 F255.4325 +X-32.515 Y1.338 Z-1.928 C247.391 F66179.6871 +X-33.535 Y0.516 Z-1.813 B-17.584 C246.903 F371.2537 +X-33.54 Y0.512 B-17.583 C246.901 F68071.2105 +X-35.565 Y-1.166 Z-1.581 B-17.528 C246.134 F191.2568 +X-35.57 Y-1.171 C246.132 F70454.6328 +X-37.85 Y-3.116 Z-1.316 B-17.488 C245.57 F176.812 +X-39.113 Y-4.213 Z-1.17 B-17.475 C245.384 F331.2891 +X-39.222 Y-4.098 Z-1.223 B-19.863 C243.22 F310.6544 +X-39.224 Y-4.096 Z-1.224 B-19.891 C243.198 F29956.3675 +X-39.431 Y-3.877 Z-1.339 B-24.517 C240.206 F206.2133 +X-39.598 Y-3.7 Z-1.457 B-28.286 C238.47 F318.4788 +X-39.748 Y-3.54 Z-1.58 B-31.66 C237.247 F410.8414 +X-37.682 Y-1.75 Z-1.822 B-31.68 C237.649 F198.2673 +X-37.672 Y-1.741 Z-1.823 C237.652 F37596.5444 +X-36.22 Y-0.507 Z-1.99 B-31.703 C238.095 F271.0022 +X-36.21 Y-0.498 Z-1.991 C238.099 F36650.4402 +X-34.212 Y1.156 Z-2.218 B-31.747 C238.945 F189.9409 +X-34.164 Y1.194 Z-2.223 B-31.749 C238.968 F7821.1115 +X-34.159 Y1.199 Z-2.224 C238.971 F70377.3058 +X-33.119 Y2.036 Z-2.34 B-31.778 C239.529 F353.2067 +X-33.113 Y2.04 Z-2.341 C239.532 F68895.8317 +X-31.437 Y3.345 Z-2.528 B-31.832 C240.602 F214.3547 +X-31.431 Y3.349 C240.606 F67607.9178 +X-30.985 Y3.687 Z-2.577 B-31.848 C240.928 F788.2881 +X-30.979 Y3.691 Z-2.578 C240.932 F66250.6148 +X-29.906 Y4.487 Z-2.692 B-31.89 C241.77 F324.6218 +X-29.901 Y4.49 Z-2.693 C241.774 F65263.8788 +X-28.809 Y5.271 Z-2.806 B-31.936 C242.72 F314.5489 +X-28.804 Y5.275 Z-2.807 B-31.937 C242.724 F64657.1053 +X-27.696 Y6.035 Z-2.919 B-31.988 C243.779 F306.01 +X-27.69 Y6.038 Z-2.92 C243.784 F63609.8972 +X-26.561 Y6.777 Z-3.031 B-32.044 C244.957 F296.8189 +X-26.555 Y6.78 C244.962 F62492.0477 +X-25.395 Y7.497 Z-3.14 B-32.106 C246.264 F286.5959 +X-25.388 Y7.502 Z-3.141 C246.272 F47745.7468 +X-24.211 Y8.189 Z-3.249 B-32.172 C247.691 F280.1201 +X-24.2 Y8.195 Z-3.25 B-32.173 C247.704 F31356.7842 +X-23.003 Y8.85 Z-3.357 B-32.242 C249.247 F273.8444 +X-22.993 Y8.855 Z-3.358 B-32.243 C249.261 F30946.966 +X-22.015 Y9.355 Z-3.44 B-32.302 C250.589 F334.077 +X-20.644 Y9.998 Z-3.551 B-32.385 C252.531 F239.1373 +X-19.433 Y10.509 Z-3.643 B-32.458 C254.292 F273.3943 +X-19.422 Y10.514 Z-3.644 B-32.459 C254.308 F30215.2688 +X-18.448 Y10.893 Z-3.71 B-32.516 C255.717 F345.7404 +X-17.724 Y11.154 Z-3.763 B-32.555 C256.725 F477.1751 +X-16.607 Y11.523 Z-3.847 B-32.612 C258.212 F319.2321 +X-16.601 Y11.525 C258.22 F62148.6619 +X-15.294 Y11.919 Z-3.936 B-32.673 C259.865 F282.9438 +X-15.288 Y11.92 C259.872 F63395.2384 +X-13.974 Y12.272 Z-4.021 B-32.729 C261.429 F291.7644 +X-13.967 Y12.273 Z-4.022 C261.436 F64276.2948 +X-12.642 Y12.584 Z-4.104 B-32.78 C262.911 F299.8223 +X-12.636 Y12.586 C262.918 F65657.4621 +X-11.31 Y12.857 Z-4.183 B-32.825 C264.305 F309.5964 +X-11.297 Y12.86 Z-4.184 B-32.826 C264.318 F33437.6567 +X-9.969 Y13.094 Z-4.259 B-32.867 C265.625 F318.7286 +X-9.956 Y13.096 Z-4.26 B-32.868 C265.637 F33825.2045 +X-8.613 Y13.297 Z-4.333 B-32.905 C266.878 F324.6057 +X-8.6 Y13.299 Z-4.334 B-32.906 C266.889 F34383.4721 +X-7.264 Y13.465 Z-4.403 B-32.94 C268.048 F335.3516 +X-7.251 Y13.467 Z-4.404 C268.059 F35051.9091 +X-5.743 Y13.618 Z-4.478 B-32.975 C269.285 F304.9292 +X-4.316 Y13.727 Z-4.546 B-33.004 C270.369 F330.3696 +X-3.189 Y13.792 Z-4.599 B-33.025 C271.175 F426.4969 +X-3.176 C271.185 F36373.2644 +X-1.827 Y13.846 Z-4.659 B-33.048 C272.096 F362.9783 +X-1.814 Y13.847 Z-4.66 B-33.049 C272.105 F36615.5389 +X0.188 Y13.883 Z-4.745 B-33.079 C273.356 F250.1464 +X0.198 C273.362 F52942.2217 +X2.243 Y13.873 Z-4.826 B-33.106 C274.525 F250.5828 +X2.256 C274.532 F37524.9532 +X3.593 Y13.84 Z-4.879 B-33.122 C275.233 F389.3896 +X3.607 Z-4.88 C275.24 F38041.7201 +X4.941 Y13.789 Z-4.931 B-33.136 C275.897 F394.5309 +X4.955 Y13.788 C275.904 F38540.3172 +X6.294 Y13.72 Z-4.982 B-33.149 C276.521 F397.3321 +X6.308 Y13.719 C276.527 F38614.1237 +X7.63 Y13.636 Z-5.031 B-33.16 C277.098 F406.4694 +X7.641 Y13.635 B-33.161 C277.102 F48189.2754 +X9.97 Y13.45 Z-5.117 B-33.178 C278.02 F233.3037 +X9.976 C278.022 F79047.3957 +X10.538 Y13.398 Z-5.137 B-33.182 C278.227 F972.9464 +X10.545 Y13.397 C278.23 F79365.5126 +X12.32 Y13.221 Z-5.195 B-33.193 C278.839 F309.845 +X12.327 Y13.22 Z-5.196 C278.842 F79517.8561 +X14.095 Y13.024 Z-5.252 B-33.203 C279.392 F313.1819 +X14.102 Y13.023 C279.395 F79746.2723 +X16.296 Y12.751 Z-5.32 B-33.214 C280.004 F253.8329 +X16.303 C280.006 F79894.2296 +X18.943 Y12.392 Z-5.399 B-33.224 C280.635 F212.3566 +X18.95 Y12.391 C280.636 F80109.6935 +X21.576 Y12.005 Z-5.476 B-33.232 C281.153 F214.7644 +X21.583 Y12.004 C281.155 F79938.2888 +X24.181 Y11.595 Z-5.549 B-33.239 C281.569 F218.2719 +X24.188 Y11.594 C281.57 F80054.3027 +X25.095 Y11.447 Z-5.573 B-33.241 C281.691 F628.8446 +X25.102 Y11.446 C281.692 F80100.2155 +X29.36 Y10.732 Z-5.686 B-33.247 C282.09 F134.8581 +X29.372 Y10.73 C282.091 F46298.7717 +X33.215 Y10.059 Z-5.789 B-33.249 C282.27 F151.2317 +X33.28 Y10.047 Z-5.792 C282.309 F7444.2129 +X33.29 Y10.045 B-33.25 C282.316 F45573.2821 +X33.6 Y9.989 Z-5.8 B-33.255 C282.719 F1290.5704 +X34.181 Y9.87 Z-5.813 B-33.28 C284.705 F447.8888 +X34.479 Y9.794 Z-5.818 B-33.305 C286.834 F539.7039 +X34.684 Y9.733 Z-5.821 B-33.323 C289.12 F561.9617 +X34.817 Y9.686 Z-5.822 B-33.336 C291.409 F604.1866 +X34.911 Y9.647 B-33.344 C293.698 F632.4456 +X35.028 Y9.592 B-33.345 C296.828 F469.9827 +X35.144 Y9.529 B-33.335 C300.075 F448.3535 +X35.254 Y9.457 Z-5.82 B-33.313 C303.324 F441.1247 +X35.345 Y9.389 Z-5.817 B-33.285 C306.038 F519.2526 +X35.439 Y9.314 Z-5.816 B-33.252 C308.675 F524.6673 +X35.535 Y9.231 Z-5.814 B-33.213 C311.24 F528.6034 +X35.633 Y9.138 Z-5.813 B-33.169 C313.735 F531.2854 +X35.796 Y8.96 Z-5.809 B-33.086 C317.609 F331.3806 +X35.965 Y8.74 Z-5.802 B-32.991 C321.333 F330.5507 +X36.139 Y8.471 Z-5.788 B-32.889 C324.879 F331.5044 +X36.315 Y8.148 Z-5.768 B-32.782 C328.214 F335.138 +X36.491 Y7.768 Z-5.743 B-32.675 C331.311 F341.5038 +X36.664 Y7.33 Z-5.713 B-32.57 C334.151 F350.3606 +X36.831 Y6.834 Z-5.679 B-32.469 C336.725 F361.3269 +X36.955 Y6.416 Z-5.65 B-32.395 C338.517 F485.7177 +X37.093 Y5.889 Z-5.61 B-32.311 C340.434 F425.8766 +X37.231 Y5.242 Z-5.562 B-32.224 C342.381 F388.4876 +X37.349 Y4.556 Z-5.51 B-32.146 C344.073 F408.8862 +X37.45 Y3.815 Z-5.455 B-32.076 C345.572 F418.5299 +X37.555 Y2.855 Z-5.375 B-32.003 C347.128 F356.786 +X37.636 Y1.886 Z-5.292 B-31.943 C348.358 F388.8995 +X37.665 Y1.449 Z-5.255 F1365.7334 +X38.078 Y1.452 Z-5.544 B-39.086 C350.177 F52.6613 +X38.45 Y1.449 Z-5.883 B-46.25 C351.509 F53.7496 +X38.42 Y1.891 Z-5.92 C351.506 F1348.0345 +X38.376 Y2.443 Z-5.967 B-46.272 C350.82 F867.6284 +X38.328 Y2.952 Z-6.01 B-46.293 C350.106 F918.4307 +X38.274 Y3.472 Z-6.051 B-46.318 C349.282 F873.2265 +X38.198 Y4.083 Z-6.099 B-46.351 C348.165 F712.8357 +X38.117 Y4.658 Z-6.14 B-46.388 C346.942 F721.6649 +X38.064 Y4.984 Z-6.163 B-46.412 C346.161 F1220.2127 +X37.964 Y5.513 Z-6.201 B-46.455 C344.734 F716.7812 +X37.838 Y6.082 Z-6.242 B-46.505 C342.959 F628.1239 +X37.766 Y6.364 Z-6.264 B-46.532 C341.964 F1199.6724 +X37.622 Y6.882 Z-6.299 B-46.587 C339.885 F611.8848 +X37.487 Y7.308 Z-6.328 B-46.638 C337.878 F684.2958 +X37.346 Y7.695 Z-6.352 B-46.691 C335.743 F687.0505 +X37.2 Y8.047 Z-6.372 B-46.745 C333.469 F686.241 +X37.051 Y8.365 Z-6.389 B-46.799 C331.061 F685.6864 +X36.9 Y8.65 Z-6.403 B-46.853 C328.523 F685.5006 +X36.748 Y8.905 Z-6.413 B-46.905 C325.861 F685.7993 +X36.596 Y9.131 Z-6.421 B-46.955 C323.083 F686.5871 +X36.411 Y9.375 Z-6.43 B-47.014 C319.507 F556.5898 +X36.315 Y9.493 Z-6.432 B-47.043 C317.545 F1049.519 +X36.22 Y9.597 Z-6.436 B-47.069 C315.586 F1073.2523 +X36.127 Y9.691 Z-6.44 B-47.093 C313.629 F1095.6048 +X36.037 Y9.779 Z-6.441 B-47.115 C311.673 F1115.9547 +X35.896 Y9.899 Z-6.443 B-47.144 C308.588 F721.9909 +X35.756 Y10.007 Z-6.444 B-47.167 C305.463 F727.7654 +X35.605 Y10.11 Z-6.445 B-47.185 C302.112 F690.9919 +X35.445 Y10.204 Z-6.446 B-47.195 C298.646 F676.7545 +X35.273 Y10.29 Z-6.445 B-47.198 C295.068 F661.9916 +X35.188 Y10.329 B-47.197 C293.28 F1329.7822 +X35.098 Y10.367 Z-6.446 B-47.193 C291.55 F1343.597 +X34.995 Y10.405 Z-6.445 B-47.187 C289.878 F1335.1958 +X34.748 Y10.484 Z-6.442 B-47.174 C286.972 F700.1299 +X34.586 Y10.528 Z-6.439 B-47.166 C285.629 F1342.9031 +X34.389 Y10.578 Z-6.436 B-47.157 C284.341 F1271.4672 +X34.297 Y10.6 Z-6.435 B-47.153 C283.831 F2981.0689 +X34.076 Y10.649 Z-6.432 B-47.145 C282.831 F1373.9236 +X33.718 Y10.719 Z-6.423 B-47.137 C281.848 F1049.3401 +X33.341 Y10.787 Z-6.414 B-47.132 C281.385 F1248.9188 +X33.333 Y10.789 C281.38 F62183.5684 +X32.664 Y10.904 Z-6.391 C281.309 F866.1672 +X29.55 Y11.45 Z-6.314 B-47.13 C281.184 F188.0019 +X29.543 Y11.452 Z-6.313 F81204.019 +X25.667 Y12.107 Z-6.215 B-47.126 C280.817 F149.4618 +X25.66 Y12.109 C280.816 F81301.7747 +X24.267 Y12.334 Z-6.177 B-47.125 C280.627 F412.2999 +X24.26 Y12.336 C280.626 F81361.4266 +X21.641 Y12.745 Z-6.101 B-47.121 C280.185 F217.466 +X21.634 Y12.746 C280.184 F81302.409 +X19.01 Y13.129 Z-6.023 B-47.117 C279.631 F214.5683 +X19.003 Y13.13 C279.629 F81099.6008 +X16.363 Y13.486 Z-5.941 B-47.11 C278.957 F210.2538 +X16.357 Y13.487 C278.955 F80742.5689 +X14.17 Y13.755 Z-5.871 B-47.103 C278.308 F250.3215 +X14.164 Y13.756 C278.306 F80539.452 +X12.385 Y13.953 Z-5.814 B-47.096 C277.717 F303.7742 +X12.378 Y13.954 C277.715 F79718.6781 +X9.729 Y14.21 Z-5.726 B-47.083 C276.727 F200.3264 +X9.722 Y14.211 Z-5.725 C276.725 F78863.019 +X7.683 Y14.374 Z-5.654 B-47.072 C275.87 F255.3848 +X7.676 Y14.375 C275.867 F78544.8972 +X6.327 Y14.463 Z-5.607 B-47.063 C275.253 F380.4592 +X6.32 C275.25 F77792.722 +X4.961 Y14.535 Z-5.559 B-47.054 C274.591 F372.4438 +X4.954 C274.587 F77489.533 +X3.603 Y14.589 Z-5.509 B-47.044 C273.888 F369.1091 +X3.596 C273.884 F76813.7032 +X2.232 Y14.624 Z-5.456 B-47.033 C273.131 F359.7869 +X2.225 C273.127 F75884.2417 +X0.374 Y14.633 Z-5.382 B-47.018 C272.024 F259.482 +X0.367 C272.02 F74719.4369 +X-1.872 Y14.589 Z-5.283 B-46.997 C270.548 F208.1157 +X-1.885 Z-5.282 B-46.996 C270.54 F36713.6052 +X-3.255 Y14.532 Z-5.22 B-46.981 C269.565 F331.6596 +X-3.267 Y14.531 Z-5.219 C269.556 F36204.2865 +X-5.187 Y14.41 Z-5.129 B-46.956 C268.087 F230.0754 +X-7.122 Y14.231 Z-5.036 B-46.926 C266.474 F220.3745 +X-7.387 Y14.201 Z-5.024 B-46.922 C266.242 F1584.0953 +X-7.399 Y14.199 C266.232 F34912.5051 +X-8.767 Y14.03 Z-4.955 B-46.898 C264.988 F300.4979 +X-8.779 Y14.028 Z-4.954 B-46.897 C264.977 F34298.9779 +X-10.129 Y13.828 Z-4.884 B-46.871 C263.672 F295.9267 +X-10.14 Y13.826 Z-4.883 C263.66 F34039.7562 +X-11.497 Y13.588 Z-4.809 B-46.843 C262.265 F285.3808 +X-11.509 Y13.586 Z-4.808 B-46.842 C262.252 F33519.4292 +X-12.855 Y13.311 Z-4.731 B-46.811 C260.781 F278.5171 +X-12.866 Y13.309 Z-4.73 C260.768 F32887.7837 +X-14.2 Y12.996 Z-4.649 B-46.777 C259.219 F271.716 +X-14.211 Y12.993 Z-4.648 C259.206 F32266.9315 +X-15.549 Y12.636 Z-4.563 B-46.74 C257.558 F261.6144 +X-15.555 Y12.635 C257.551 F63350.8616 +X-16.888 Y12.233 Z-4.473 B-46.7 C255.813 F253.1177 +X-16.894 Y12.231 B-46.699 C255.806 F62202.4905 +X-17.978 Y11.875 Z-4.392 B-46.664 C254.324 F301.9667 +X-19.311 Y11.381 Z-4.297 B-46.616 C252.41 F236.8422 +X-20.857 Y10.741 Z-4.187 B-46.553 C250.071 F196.0762 +X-21.573 Y10.418 Z-4.133 B-46.523 C248.983 F417.4483 +X-22.897 Y9.773 Z-4.024 B-46.469 C247.081 F228.1219 +X-23.412 Y9.503 Z-3.982 B-46.449 C246.373 F590.9343 +X-23.423 Y9.497 Z-3.981 C246.359 F29457.6154 +X-24.652 Y8.827 Z-3.875 B-46.403 C244.741 F249.277 +X-24.657 Y8.825 Z-3.874 B-46.402 C244.734 F62197.117 +X-25.86 Y8.124 Z-3.767 B-46.358 C243.243 F256.977 +X-25.866 Y8.121 Z-3.766 C243.236 F59045.4407 +X-27.036 Y7.395 Z-3.657 B-46.317 C241.884 F267.3592 +X-27.041 Y7.392 Z-3.656 C241.878 F59926.5588 +X-28.188 Y6.641 Z-3.544 B-46.279 C240.653 F276.7075 +X-28.199 Y6.634 Z-3.543 C240.642 F30703.6573 +X-29.32 Y5.866 Z-3.431 B-46.245 C239.545 F288.0194 +X-29.33 Y5.859 Z-3.43 C239.536 F31463.2298 +X-30.43 Y5.073 Z-3.318 B-46.214 C238.557 F298.9587 +X-30.44 Y5.066 Z-3.316 C238.548 F31649.5393 +X-31.521 Y4.266 Z-3.204 B-46.186 C237.681 F310.2516 +X-31.526 Y4.262 Z-3.203 C237.678 F68223.093 +X-32.141 Y3.797 Z-3.137 B-46.171 C237.225 F554.7299 +X-32.146 Y3.793 Z-3.136 C237.222 F66211.8197 +X-33.648 Y2.623 Z-2.97 B-46.139 C236.24 F231.4058 +X-33.653 Y2.619 C236.236 F67469.7409 +X-34.699 Y1.778 Z-2.854 B-46.12 C235.655 F341.7678 +X-34.704 Y1.773 Z-2.853 C235.653 F68866.9361 +X-35.736 Y0.926 Z-2.737 B-46.103 C235.16 F354.6726 +X-35.741 Y0.921 Z-2.736 C235.158 F69850.9816 +X-36.758 Y0.072 Z-2.62 B-46.09 C234.749 F368.9935 +X-36.764 Y0.067 Z-2.619 C234.747 F71311.2967 +X-38.313 Y-1.252 Z-2.442 B-46.073 C234.262 F249.8612 +X-38.318 Y-1.256 Z-2.441 C234.261 F73144.0091 +X-40.311 Y-2.98 Z-2.208 B-46.061 C233.863 F203.5865 +X-40.554 Y-2.753 Z-2.591 B-53.286 C232.747 F296.5346 +X-40.765 Y-2.567 Z-3.013 B-60.521 C231.824 F316.0536 +X-38.974 Y-1.018 Z-3.223 B-60.525 C232.176 F226.0533 +X-38.964 Y-1.009 Z-3.224 C232.179 F37871.5671 +X-38.413 Y-0.537 Z-3.288 B-60.528 C232.329 F709.801 +X-38.408 Y-0.532 Z-3.289 C232.33 F74361.8537 +X-37.215 Y0.48 Z-3.425 B-60.534 C232.725 F319.937 +X-37.21 Y0.485 Z-3.426 C232.726 F72825.2116 +X-36.184 Y1.342 Z-3.542 B-60.54 C233.145 F360.8298 +X-36.179 Y1.346 Z-3.543 C233.148 F72052.5863 +X-35.14 Y2.199 Z-3.659 B-60.549 C233.651 F346.3151 +X-35.135 Y2.204 Z-3.66 C233.654 F70546.049 +X-34.084 Y3.048 Z-3.775 B-60.558 C234.246 F333.4819 +X-34.08 Y3.052 Z-3.776 C234.249 F69960.3217 +X-32.892 Y3.982 Z-3.903 B-60.571 C235.022 F286.7666 +X-32.885 Y3.987 Z-3.904 C235.026 F51550.1838 +X-31.941 Y4.706 Z-4.004 B-60.581 C235.721 F351.5514 +X-31.931 Y4.714 Z-4.005 C235.729 F33212.2844 +X-30.847 Y5.517 Z-4.118 B-60.594 C236.615 F298.9594 +X-30.837 Y5.524 Z-4.119 C236.623 F32728.7448 +X-29.727 Y6.318 Z-4.233 B-60.609 C237.625 F285.4132 +X-29.717 Y6.325 Z-4.234 C237.635 F32185.0029 +X-28.581 Y7.104 Z-4.346 B-60.625 C238.761 F272.7263 +X-28.571 Y7.11 Z-4.347 C238.771 F31680.2604 +X-27.419 Y7.862 Z-4.455 B-60.644 C240.017 F263.3842 +X-27.41 Y7.868 Z-4.456 C240.028 F32105.4451 +X-26.222 Y8.601 Z-4.561 B-60.664 C241.419 F250.5001 +X-26.213 Y8.606 Z-4.562 C241.429 F35506.3416 +X-25.002 Y9.313 Z-4.669 B-60.685 C242.948 F241.5327 +X-24.993 Y9.319 Z-4.67 C242.96 F31195.0905 +X-23.849 Y9.947 Z-4.77 B-60.705 C244.489 F251.5056 +X-23.747 Y10.0 Z-4.779 B-60.707 C244.63 F2794.3152 +X-23.738 Y10.005 Z-4.78 C244.643 F30806.167 +X-22.494 Y10.641 Z-4.882 B-60.73 C246.415 F227.4654 +X-21.287 Y11.202 Z-4.976 B-60.754 C248.207 F232.8878 +X-20.065 Y11.721 Z-5.064 B-60.777 C250.06 F230.3678 +X-18.814 Y12.2 Z-5.148 B-60.801 C251.94 F228.8286 +X-17.525 Y12.644 Z-5.231 B-60.823 C253.804 F228.6546 +X-17.144 Y12.763 Z-5.257 B-60.829 C254.333 F793.695 +X-17.133 Y12.766 C254.347 F29298.4505 +X-16.068 Y13.094 Z-5.325 B-60.845 C255.768 F290.7024 +X-15.777 Y13.175 Z-5.345 B-60.849 C256.142 F1088.4005 +X-15.771 Y13.176 Z-5.346 C256.15 F53346.7462 +X-14.498 Y13.519 Z-5.425 B-60.866 C257.74 F253.3281 +X-14.412 Y13.54 Z-5.431 B-60.867 C257.844 F3804.3334 +X-14.401 Y13.543 Z-5.432 C257.857 F30435.6909 +X-13.11 Y13.848 Z-5.51 B-60.882 C259.379 F258.6362 +X-13.033 Y13.864 Z-5.515 B-60.883 C259.467 F4403.6859 +X-13.022 Y13.867 C259.48 F30827.8978 +X-11.693 Y14.14 Z-5.592 B-60.897 C260.956 F259.9579 +X-11.649 Y14.148 Z-5.595 B-60.898 C261.005 F7808.318 +X-11.637 Y14.15 C261.017 F31231.5074 +X-10.273 Y14.391 Z-5.671 B-60.911 C262.446 F261.3423 +X-10.261 Y14.392 C262.458 F31656.9675 +X-8.884 Y14.599 Z-5.744 B-60.924 C263.818 F266.9961 +X-8.873 Y14.601 Z-5.745 C263.829 F32097.7192 +X-7.497 Y14.773 Z-5.815 B-60.935 C265.11 F275.1332 +X-7.485 Y14.774 C265.12 F32552.0814 +X-6.337 Y14.897 Z-5.869 B-60.944 C266.131 F338.2356 +X-4.801 Y15.023 Z-5.941 B-60.954 C267.409 F259.4851 +X-3.332 Y15.108 Z-6.009 B-60.963 C268.552 F278.9641 +X-3.319 Y15.109 C268.561 F33889.9477 +X-1.94 Y15.164 Z-6.069 B-60.971 C269.569 F304.5848 +X-1.928 Y15.165 C269.578 F34133.5626 +X-0.322 Y15.201 Z-6.135 B-60.98 C270.676 F268.3018 +X2.062 Y15.194 Z-6.23 B-60.99 C272.168 F186.5981 +X2.202 Y15.191 Z-6.236 B-60.991 C272.25 F3224.6653 +X2.215 Y15.19 C272.258 F35542.704 +X3.573 Y15.157 Z-6.289 B-60.996 C273.033 F336.6313 +X3.586 Y15.156 C273.04 F35967.8421 +X4.943 Y15.104 Z-6.34 B-61.001 C273.766 F343.2037 +X4.956 Y15.103 C273.773 F36169.3985 +X6.309 Y15.034 Z-6.39 B-61.005 C274.452 F350.4662 +X6.322 Y15.033 C274.458 F36544.5556 +X7.674 Y14.947 Z-6.439 B-61.009 C275.095 F356.2204 +X7.687 Y14.946 C275.101 F37004.8247 +X9.221 Y14.829 Z-6.493 B-61.013 C275.774 F319.4795 +X9.234 Y14.828 C275.779 F37137.7621 +X10.603 Y14.707 Z-6.541 B-61.016 C276.337 F363.5588 +X10.617 Y14.706 Z-6.542 C276.343 F37477.1621 +X12.401 Y14.53 Z-6.601 B-61.019 C277.014 F283.5738 +X12.415 Y14.529 C277.018 F37802.0097 +X14.196 Y14.332 Z-6.659 B-61.022 C277.627 F289.0293 +X14.202 C277.629 F83396.2845 +X16.413 Y14.058 Z-6.728 B-61.026 C278.302 F237.0327 +X16.42 Y14.057 C278.304 F77240.8248 +X19.077 Y13.696 Z-6.805 B-61.03 C279.0 F201.3043 +X19.084 Y13.695 C279.002 F78390.2213 +X21.726 Y13.305 Z-6.88 B-61.033 C279.576 F206.5627 +X21.732 Y13.304 C279.577 F79387.6531 +X24.39 Y12.887 Z-6.955 B-61.035 C280.036 F209.2549 +X24.398 Y12.886 C280.037 F70229.821 +X26.61 Y12.523 Z-7.016 B-61.036 C280.34 F254.8939 +X26.617 Y12.522 C280.341 F89580.5894 +X29.692 Y12.0 Z-7.097 B-61.037 C280.615 F186.6645 +X29.7 Y11.999 C280.616 F76080.4181 +X32.915 Y11.44 Z-7.183 B-61.038 C280.75 F181.4541 +X32.923 Y11.439 Z-7.184 F69759.7242 +X33.198 Y11.391 Z-7.191 C280.757 F2130.3496 +X33.448 Y11.347 Z-7.197 C280.839 F2149.233 +X33.802 Y11.282 Z-7.206 B-61.04 C281.305 F1191.9857 +X34.172 Y11.21 Z-7.214 B-61.044 C282.329 F870.0243 +X34.407 Y11.159 Z-7.218 B-61.048 C283.365 F1084.7911 +X34.614 Y11.107 Z-7.221 B-61.052 C284.548 F1053.6611 +X34.796 Y11.056 Z-7.224 B-61.057 C285.847 F1040.2992 +X34.956 Y11.01 Z-7.227 B-61.061 C287.249 F1030.6203 +X35.098 Y10.965 Z-7.229 B-61.064 C288.756 F1012.1992 +X35.226 Y10.921 Z-7.23 B-61.067 C290.364 F991.1011 +X35.343 Y10.876 Z-7.231 B-61.069 C292.068 F967.4179 +X35.508 Y10.804 B-61.071 C294.849 F611.7274 +X35.662 Y10.726 Z-7.229 B-61.07 C297.71 F607.1854 +X35.81 Y10.643 Z-7.227 B-61.067 C300.537 F615.7453 +X35.963 Y10.547 Z-7.226 B-61.062 C303.385 F607.4773 +X36.231 Y10.361 B-61.047 C308.243 F354.7907 +X36.339 Y10.272 Z-7.225 B-61.039 C310.274 F845.8101 +X36.446 Y10.177 B-61.03 C312.304 F844.0491 +X36.586 Y10.043 Z-7.222 B-61.016 C314.929 F650.0926 +X36.725 Y9.894 Z-7.219 B-61.0 C317.534 F649.8193 +X36.885 Y9.706 Z-7.214 B-60.98 C320.433 F577.1494 +X37.044 Y9.498 Z-7.208 B-60.959 C323.246 F586.1405 +X37.203 Y9.269 Z-7.202 B-60.937 C325.963 F596.2641 +X37.343 Y9.044 Z-7.195 B-60.916 C328.3 F678.4769 +X37.484 Y8.796 Z-7.186 B-60.895 C330.575 F681.8165 +X37.624 Y8.523 Z-7.175 B-60.873 C332.783 F684.2589 +X37.762 Y8.223 Z-7.161 B-60.85 C334.919 F686.8114 +X37.899 Y7.895 Z-7.145 B-60.827 C336.974 F689.4232 +X38.032 Y7.536 Z-7.125 B-60.804 C338.944 F692.0275 +X38.161 Y7.145 Z-7.102 B-60.782 C340.822 F694.4649 +X38.286 Y6.722 Z-7.076 B-60.76 C342.605 F696.5652 +X38.404 Y6.266 Z-7.046 B-60.738 C344.288 F698.1273 +X38.516 Y5.776 Z-7.013 B-60.718 C345.867 F698.9667 +X38.619 Y5.252 Z-6.978 B-60.698 C347.341 F698.8899 +X38.703 Y4.77 Z-6.944 B-60.681 C348.537 F802.8294 +X38.795 Y4.149 Z-6.9 B-60.662 C349.89 F657.2091 +X38.877 Y3.493 Z-6.851 B-60.644 C351.105 F659.2881 +X38.949 Y2.796 Z-6.797 B-60.629 C352.199 F652.8435 +X39.025 Y1.858 Z-6.723 B-60.612 C353.421 F509.225 +X39.054 Y1.421 Z-6.686 F1365.7332 +X39.277 Y1.398 Z-7.138 B-67.804 C354.173 F52.7173 +X39.441 Y1.369 Z-7.613 B-75.0 C354.852 F52.1148 +X39.411 Y1.811 Z-7.651 C354.85 F1345.5538 +X39.364 Y2.433 Z-7.699 C354.06 F572.0885 +X39.312 Y2.999 Z-7.742 C353.241 F593.7335 +X39.25 Y3.582 Z-7.785 B-74.999 C352.282 F542.6193 +X39.181 Y4.133 Z-7.825 C351.244 F536.3072 +X39.106 Y4.653 Z-7.861 B-75.0 C350.128 F528.9123 +X39.024 Y5.143 Z-7.894 C348.938 F522.2697 +X38.967 Y5.453 Z-7.914 C348.108 F778.22 +X38.905 Y5.76 Z-7.934 C347.226 F751.1826 +X38.841 Y6.053 Z-7.952 C346.318 F748.8457 +X38.776 Y6.333 Z-7.969 C345.384 F746.3243 +X38.708 Y6.6 Z-7.985 C344.425 F743.6188 +X38.595 Y7.007 Z-8.009 C342.814 F454.4602 +X38.477 Y7.387 Z-8.029 C341.126 F447.2511 +X38.355 Y7.741 Z-8.047 C339.359 F439.409 +X38.23 Y8.069 Z-8.062 C337.517 F431.8851 +X38.102 Y8.374 Z-8.075 C335.603 F424.7397 +X37.971 Y8.655 Z-8.086 C333.621 F418.0078 +X37.839 Y8.915 Z-8.095 C331.574 F411.6854 +X37.706 Y9.156 Z-8.102 C329.467 F405.8708 +X37.571 Y9.378 Z-8.108 C327.305 F400.4652 +X37.397 Y9.638 Z-8.114 C324.454 F307.2381 +X37.216 Y9.88 Z-8.119 C321.438 F293.6622 +X37.047 Y10.083 Z-8.122 C318.559 F310.4373 +X36.963 Y10.176 Z-8.124 C317.119 F624.9603 +X36.829 Y10.315 Z-8.125 C314.793 F388.2288 +X36.695 Y10.444 C312.444 F385.9715 +X36.559 Y10.563 Z-8.126 C310.071 F383.1777 +X36.34 Y10.735 C306.257 F238.7935 +X36.114 Y10.89 Z-8.127 C302.362 F234.0536 +X35.699 Y11.119 C295.54 F133.2539 +X35.508 Y11.205 Z-8.126 C292.572 F305.0253 +X35.383 Y11.254 Z-8.127 C290.746 F493.3197 +X35.234 Y11.307 Z-8.126 C288.922 F483.3455 +X35.05 Y11.367 Z-8.125 B-74.999 C286.964 F441.334 +X34.797 Y11.438 Z-8.123 B-75.0 C285.009 F419.6441 +X34.655 Y11.475 Z-8.121 B-74.999 C284.046 F830.2073 +X34.425 Y11.528 Z-8.118 C282.746 F591.1789 +X34.178 Y11.581 Z-8.114 B-75.0 C281.776 F718.2837 +X33.846 Y11.645 Z-8.107 B-75.001 C280.921 F703.5145 +X33.528 Y11.703 Z-8.1 B-74.999 C280.428 F963.4447 +X33.158 Y11.768 Z-8.09 B-75.0 C280.324 F1361.0686 +X30.19 Y12.285 Z-8.011 C280.217 F194.8405 +X30.183 Y12.286 F81083.5478 +X27.776 Y12.698 Z-7.946 C280.021 F233.7338 +X27.769 Y12.7 C280.02 F83018.2242 +X26.286 Y12.949 Z-7.906 C279.852 F372.1054 +X26.278 Y12.95 C279.851 F78036.094 +X25.018 Y13.157 Z-7.871 C279.678 F431.8839 +X25.011 Y13.158 C279.677 F77487.7157 +X21.611 Y13.695 Z-7.777 C279.084 F156.4304 +X21.604 Y13.696 C279.082 F74389.2434 +X18.741 Y14.116 Z-7.694 C278.431 F179.9995 +X15.731 Y14.516 Z-7.604 B-74.999 C277.595 F166.0693 +X13.884 Y14.737 Z-7.548 C277.001 F263.9258 +X13.878 C276.999 F73054.5347 +X12.396 Y14.9 Z-7.501 C276.476 F322.7 +X12.389 Y14.901 C276.473 F72890.7397 +X9.407 Y15.183 Z-7.403 B-75.0 C275.284 F155.9397 +X6.964 Y15.363 Z-7.318 C274.172 F184.1523 +X4.558 Y15.49 Z-7.231 B-74.999 C272.944 F181.076 +X2.56 Y15.553 Z-7.156 C271.816 F211.4404 +X0.226 Y15.573 Z-7.064 B-75.0 C270.362 F175.0341 +X-2.065 Y15.531 Z-6.969 C268.78 F171.7019 +X-4.185 Y15.431 Z-6.875 C267.168 F178.5776 +X-6.338 Y15.265 Z-6.777 C265.376 F169.227 +X-7.78 Y15.114 Z-6.708 B-74.999 C264.082 F244.2709 +X-9.161 Y14.936 Z-6.64 C262.764 F247.5917 +X-10.557 Y14.722 Z-6.568 C261.35 F237.8757 +X-11.93 Y14.475 Z-6.493 C259.876 F234.7003 +X-13.278 Y14.196 Z-6.417 B-75.0 C258.344 F231.6425 +X-14.602 Y13.882 Z-6.339 C256.755 F228.7456 +X-15.921 Y13.528 Z-6.259 C255.093 F223.0826 +X-17.432 Y13.07 Z-6.165 C253.059 F187.1668 +X-18.658 Y12.655 Z-6.087 C251.298 F221.8509 +X-19.861 Y12.204 Z-6.007 C249.492 F219.2315 +X-21.058 Y11.711 Z-5.922 C247.66 F216.7079 +X-22.257 Y11.169 Z-5.832 C245.837 F215.3224 +X-23.467 Y10.574 Z-5.737 C244.057 F215.3179 +X-24.695 Y9.925 Z-5.638 C242.353 F216.7215 +X-25.97 Y9.2 Z-5.532 C240.695 F213.423 +X-27.208 Y8.449 Z-5.421 B-74.999 C239.18 F223.9084 +X-28.271 Y7.769 Z-5.324 B-75.0 C237.977 F267.7079 +X-29.567 Y6.898 Z-5.201 C236.63 F225.5195 +X-30.236 Y6.429 Z-5.136 C235.981 F445.2455 +X-30.246 Y6.422 Z-5.135 C235.971 F30561.4858 +X-31.476 Y5.535 Z-5.011 C234.875 F248.4638 +X-32.905 Y4.459 Z-4.863 B-74.999 C233.755 F221.3797 +X-34.156 Y3.483 Z-4.73 C232.905 F262.276 +X-35.451 Y2.442 Z-4.589 C232.154 F262.7475 +X-36.786 Y1.342 Z-4.441 B-74.998 C231.515 F265.2297 +X-37.553 Y0.698 Z-4.354 C231.207 F476.1052 +X-37.564 Y0.689 Z-4.353 C231.203 F35272.7164 +X-38.656 Y-0.237 Z-4.228 C230.837 F344.7398 +X-38.666 Y-0.246 Z-4.227 C230.833 F35823.702 +X-40.363 Y-1.707 Z-4.03 B-74.999 C230.423 F231.7572 +X-41.081 Y-2.332 Z-3.946 C230.304 F568.6766 +G94 +G00 Z-2.652 +X-44.166 Y1.385 +Z5.0 +B0. +Z10.0 +Z10.818 + +( FINISH2 FLOWLINE SRF_MILL1 ) +G00 G54 X-44.166 Y1.385 Z10.818 +B-74.999 C230.318 +X-44.276 Y1.721 +Z10.0 +Z3.0 +G93 +G01 Z-3.879 F43.6109 +X-41.192 Y-1.996 Z-5.173 F60.0 +X-39.443 Y-0.553 C230.665 F234.1759 +X-38.827 Y-0.051 C230.833 F641.2242 +X-38.817 Y-0.042 C230.836 F37189.8454 +X-37.419 Y1.088 C231.309 F273.4246 +X-36.093 Y2.139 B-75.0 C231.882 F276.5858 +X-35.416 Y2.667 C232.223 F525.2646 +X-35.411 Y2.671 C232.226 F68633.2928 +X-33.833 Y3.874 C233.155 F218.1489 +X-32.509 Y4.85 C234.081 F249.5157 +X-31.246 Y5.749 C235.09 F252.7008 +X-29.831 Y6.714 C236.365 F218.262 +G94 +G00 Z10.0 +C257.016 +X-28.102 Y23.416 +Z3.0 +G93 +G01 X-14.387 Y13.936 Z-6.356 F8.2994 +X-15.962 Y13.543 Z-6.352 B-75.001 C255.048 F187.9741 +X-17.208 Y13.191 C253.377 F227.9221 +X-18.446 Y12.802 Z-6.355 B-75.0 C251.625 F221.5628 +X-19.648 Y12.383 Z-6.357 C249.855 F222.1155 +X-20.861 Y11.917 Z-6.359 C248.033 F216.0646 +X-22.072 Y11.406 Z-6.36 B-74.999 C246.214 F214.6647 +X-23.29 Y10.845 Z-6.358 C244.43 F214.4118 +X-24.521 Y10.231 Z-6.356 B-75.0 C242.709 F215.3624 +X-25.647 Y9.631 Z-6.354 C241.227 F240.5196 +X-26.907 Y8.917 C239.679 F220.0416 +X-28.198 Y8.14 Z-6.356 C238.216 F220.5877 +X-29.512 Y7.304 Z-6.357 C236.847 F222.5519 +X-30.902 Y6.373 Z-6.356 C235.542 F217.0683 +X-32.215 Y5.452 Z-6.355 C234.448 F237.7782 +X-33.539 Y4.488 Z-6.354 C233.479 F244.3166 +X-35.053 Y3.347 Z-6.355 B-74.999 C232.53 F221.9638 +X-36.652 Y2.103 Z-6.356 C231.713 F220.2137 +X-38.368 Y0.731 B-74.998 C231.039 F215.8718 +X-39.017 Y0.203 C230.835 F592.7917 +X-39.028 Y0.194 C230.832 F35513.1376 +X-40.817 Y-1.274 B-74.999 C230.412 F223.7249 +X-41.685 Y-1.994 B-75.0 C230.277 F481.7573 +X-42.179 Y-1.992 Z-7.538 C230.241 F456.6723 +X-40.409 Y-0.526 B-74.999 C230.533 F234.526 +X-39.222 Y0.445 C230.834 F333.1572 +X-39.213 Y0.453 C230.837 F43506.9431 +X-37.812 Y1.585 C231.31 F270.5211 +X-36.496 Y2.629 C231.877 F275.6321 +X-35.13 Y3.687 C232.597 F254.8458 +X-33.625 Y4.819 B-75.0 C233.548 F221.7031 +X-32.361 Y5.737 C234.477 F254.0994 +X-31.119 Y6.607 C235.509 F249.8268 +X-30.125 Y7.279 C236.419 F303.3609 +X-28.843 Y8.11 C237.708 F228.4967 +X-27.868 Y8.713 C238.766 F293.645 +X-26.66 Y9.427 C240.167 F231.7753 +X-25.46 Y10.094 C241.659 F228.0501 +X-24.269 Y10.716 C243.241 F224.5436 +X-23.081 Y11.294 C244.915 F220.3655 +X-21.601 Y11.953 C247.112 F173.9163 +X-20.576 Y12.37 C248.651 F251.4893 +X-19.347 Y12.828 Z-7.539 C250.468 F213.1699 +X-18.089 Y13.252 C252.273 F213.1813 +X-16.8 Y13.642 Z-7.538 C254.045 F214.2141 +X-15.473 Y13.999 Z-7.537 C255.77 F215.5862 +X-14.215 Y14.3 C257.313 F235.5284 +X-12.84 Y14.589 Z-7.538 C258.916 F222.1266 +X-11.436 Y14.845 C260.466 F224.4422 +X-9.644 Y15.116 C262.319 F182.3842 +X-8.005 Y15.314 C263.896 F206.9033 +X-6.513 Y15.456 C265.239 F234.8764 +X-4.999 Y15.564 C266.52 F238.233 +X-2.768 Y15.665 C268.266 F167.5537 +X-0.488 Y15.702 C269.886 F170.7014 +X1.913 Y15.673 C271.426 F168.5031 +X4.332 Y15.583 C272.82 F173.765 +X6.807 Y15.433 C274.095 F175.8975 +X8.998 Y15.257 C275.106 F205.0622 +X11.532 Y15.007 C276.148 F182.6972 +X12.385 Y14.911 C276.47 F553.5682 +X12.398 Y14.91 C276.475 F35736.4591 +X13.593 Y14.77 C276.901 F399.9158 +G94 +G00 Z-6.244 +X14.173 Y19.565 +Z10.0 +B0. +B-75.0 C360.0 +X44.466 Y-5.887 +Z5.0 +Z3.0 +G93 +G01 Z-7.056 F29.8332 +X39.636 Z-8.35 F60.0 +Y-3.578 F259.8332 +X39.638 Y-3.57 F78989.2007 +Y1.887 F109.9529 +G94 +G00 Z-7.055 +X44.468 +Z5.0 +B0. +Z10.0 + +G53 G49 Z30 M09 +G53 Y0. B0 C0 +M429 ;Restore Trivkins +M30 +% diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc new file mode 100644 index 0000000..b9f6969 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc @@ -0,0 +1,4510 @@ +( Impeller 5-axis 12/24/2011) +( This is preceded by cutting the external "conical" shape on a lathe) +( This is only a demo - roughing out in soft non-metal material) +M428 ;TCP:xyzac +G93 +S600 M3 +( --- Operation 1 ) +G0 X 16.339 Y -25.409 Z 33.353 A -71.841 C -35.930 +G0 X 7.417 Y -13.098 Z 28.366 A -71.841 C -35.930 +G1 X 6.302 Y -11.560 Z 27.743 A -71.841 C -35.930 F 318 +G1 X 6.358 Y -12.418 Z 26.178 A -71.266 C -32.919 F 159 +G1 X 6.346 Y -12.607 Z 25.858 A -71.158 C -32.304 F 159 +G1 X 6.307 Y -12.804 Z 25.552 A -71.093 C -31.715 F 159 +G1 X 6.238 Y -13.009 Z 25.262 A -71.073 C -31.151 F 159 +G1 X 6.140 Y -13.221 Z 24.986 A -71.096 C -30.614 F 159 +G1 X 6.014 Y -13.434 Z 24.729 A -71.164 C -30.107 F 159 +G1 X 5.891 Y -13.609 Z 24.534 A -71.252 C -29.718 F 159 +G1 X 5.476 Y -14.121 Z 23.987 A -71.566 C -28.632 F 159 +G1 X 4.815 Y -14.881 Z 23.162 A -71.965 C -27.052 F 159 +G1 X 4.310 Y -15.426 Z 22.558 A -72.202 C -25.935 F 159 +G1 X 3.785 Y -15.960 Z 21.956 A -72.387 C -24.870 F 159 +G1 X 3.244 Y -16.483 Z 21.354 A -72.522 C -23.855 F 159 +G1 X 2.429 Y -17.222 Z 20.484 A -72.638 C -22.463 F 159 +G1 X 1.632 Y -17.898 Z 19.669 A -72.669 C -21.233 F 159 +G1 X 0.727 Y -18.615 Z 18.778 A -72.625 C -19.964 F 159 +G1 X -0.210 Y -19.310 Z 17.890 A -72.500 C -18.780 F 159 +G1 X -0.850 Y -19.760 Z 17.302 A -72.381 C -18.024 F 159 +G1 X -1.872 Y -20.439 Z 16.396 A -71.935 C -17.384 F 159 +G1 X -2.911 Y -21.087 Z 15.512 A -71.371 C -17.097 F 159 +G1 X -3.972 Y -21.712 Z 14.638 A -70.844 C -16.828 F 159 +G1 X -5.028 Y -22.302 Z 13.797 A -70.367 C -16.583 F 159 +G1 X -6.121 Y -22.881 Z 12.954 A -69.921 C -16.352 F 159 +G1 X -7.239 Y -23.445 Z 12.117 A -69.512 C -16.140 F 159 +G1 X -8.443 Y -24.025 Z 11.258 A -68.408 C -17.485 F 159 +G1 X -9.087 Y -24.329 Z 10.817 A -67.494 C -19.003 F 159 +G1 X -9.731 Y -24.634 Z 10.377 A -66.596 C -20.528 F 159 +G1 X -10.381 Y -24.933 Z 9.946 A -65.737 C -22.068 F 159 +G1 X -11.029 Y -25.234 Z 9.515 A -64.898 C -23.611 F 159 +G1 X -11.683 Y -25.529 Z 9.094 A -64.103 C -25.160 F 159 +G1 X -12.335 Y -25.825 Z 8.674 A -63.332 C -26.705 F 159 +G1 X -13.018 Y -26.127 Z 8.248 A -62.581 C -28.312 F 159 +G1 X -13.699 Y -26.430 Z 7.823 A -61.858 C -29.909 F 159 +G1 X -15.018 Y -27.002 Z 7.027 A -60.593 C -32.959 F 159 +G1 X -16.370 Y -27.574 Z 6.238 A -59.462 C -36.012 F 159 +G1 X -17.703 Y -28.124 Z 5.489 A -58.507 C -38.930 F 159 +G1 X -18.590 Y -28.488 Z 5.002 A -57.948 C -40.822 F 159 +G1 X -19.456 Y -28.875 Z 4.516 A -57.404 C -42.675 F 159 +G1 X -20.304 Y -29.295 Z 4.026 A -56.865 C -44.507 F 159 +G1 X -20.997 Y -29.667 Z 3.618 A -56.426 C -46.020 F 159 +G1 X -21.811 Y -30.137 Z 3.134 A -55.918 C -47.811 F 159 +G1 X -23.728 Y -31.352 Z 1.937 A -54.730 C -52.054 F 159 +G1 X -23.882 Y -31.459 Z 1.837 A -54.607 C -51.977 F 636 +G1 X -24.010 Y -31.567 Z 1.743 A -54.496 C -51.906 F 636 +G1 X -24.113 Y -31.676 Z 1.655 A -54.395 C -51.842 F 636 +G1 X -24.192 Y -31.786 Z 1.574 A -54.304 C -51.784 F 636 +G1 X -24.245 Y -31.897 Z 1.500 A -54.220 C -51.731 F 636 +G1 X -24.275 Y -32.008 Z 1.432 A -54.143 C -51.682 F 636 +G1 X -24.281 Y -32.118 Z 1.371 A -54.070 C -51.635 F 636 +G1 X -24.263 Y -32.228 Z 1.317 A -53.998 C -51.590 F 636 +G1 X -24.223 Y -32.337 Z 1.270 A -53.925 C -51.543 F 636 +G1 X -24.159 Y -32.445 Z 1.230 A -53.850 C -51.494 F 636 +G1 X -24.073 Y -32.550 Z 1.198 A -53.769 C -51.442 F 636 +G1 X -23.965 Y -32.654 Z 1.172 A -53.681 C -51.385 F 636 +G1 X -23.835 Y -32.755 Z 1.154 A -53.585 C -51.323 F 636 +G1 X -23.683 Y -32.853 Z 1.143 A -53.480 C -51.255 F 636 +G1 X -23.510 Y -32.947 Z 1.139 A -53.366 C -51.181 F 636 +G1 X -23.317 Y -33.038 Z 1.143 A -53.243 C -51.100 F 636 +G1 X -23.113 Y -33.121 Z 1.153 A -53.142 C -51.034 F 636 +G1 X -22.912 Y -33.193 Z 1.170 A -53.043 C -50.969 F 636 +G1 X -22.712 Y -33.252 Z 1.192 A -52.947 C -50.905 F 636 +G1 X -22.515 Y -33.299 Z 1.221 A -52.853 C -50.843 F 636 +G1 X -22.320 Y -33.334 Z 1.256 A -52.761 C -50.782 F 636 +G1 X -22.129 Y -33.355 Z 1.297 A -52.671 C -50.722 F 636 +G1 X -21.941 Y -33.363 Z 1.344 A -52.582 C -50.662 F 636 +G1 X -21.756 Y -33.357 Z 1.398 A -52.494 C -50.603 F 636 +G1 X -21.576 Y -33.338 Z 1.457 A -52.407 C -50.545 F 636 +G1 X -21.401 Y -33.303 Z 1.524 A -52.319 C -50.486 F 636 +G1 X -21.230 Y -33.254 Z 1.596 A -52.231 C -50.427 F 636 +G1 X -21.065 Y -33.190 Z 1.676 A -52.142 C -50.367 F 636 +G1 X -20.905 Y -33.109 Z 1.761 A -52.052 C -50.305 F 636 +G1 X -20.751 Y -33.014 Z 1.853 A -51.959 C -50.242 F 636 +G1 X -20.604 Y -32.901 Z 1.952 A -51.863 C -50.176 F 636 +G1 X -20.463 Y -32.772 Z 2.058 A -51.763 C -50.108 F 636 +G1 X -19.254 Y -31.563 Z 3.017 A -53.155 C -46.358 F 159 +G1 X -18.880 Y -31.212 Z 3.301 A -53.584 C -45.229 F 159 +G1 X -18.484 Y -30.874 Z 3.589 A -54.009 C -44.087 F 159 +G1 X -18.115 Y -30.588 Z 3.846 A -54.380 C -43.061 F 159 +G1 X -17.727 Y -30.313 Z 4.104 A -54.744 C -42.018 F 159 +G1 X -17.134 Y -29.941 Z 4.476 A -55.254 C -40.486 F 159 +G1 X -16.074 Y -29.370 Z 5.099 A -56.092 C -37.843 F 159 +G1 X -14.797 Y -28.688 Z 5.868 A -57.235 C -34.613 F 159 +G1 X -14.162 Y -28.344 Z 6.265 A -57.877 C -32.986 F 159 +G1 X -13.525 Y -28.001 Z 6.663 A -58.550 C -31.347 F 159 +G1 X -12.893 Y -27.655 Z 7.073 A -59.277 C -29.710 F 159 +G1 X -12.258 Y -27.310 Z 7.484 A -60.034 C -28.067 F 159 +G1 X -11.674 Y -26.988 Z 7.876 A -60.782 C -26.551 F 159 +G1 X -11.089 Y -26.666 Z 8.268 A -61.554 C -25.036 F 159 +G1 X -10.508 Y -26.342 Z 8.669 A -62.366 C -23.534 F 159 +G1 X -9.926 Y -26.020 Z 9.072 A -63.200 C -22.038 F 159 +G1 X -9.304 Y -25.671 Z 9.514 A -64.138 C -20.448 F 159 +G1 X -8.682 Y -25.323 Z 9.958 A -65.096 C -18.869 F 159 +G1 X -8.065 Y -24.973 Z 10.410 A -66.091 C -17.318 F 159 +G1 X -7.448 Y -24.626 Z 10.864 A -67.099 C -15.784 F 159 +G1 X -6.340 Y -23.980 Z 11.727 A -67.941 C -15.314 F 159 +G1 X -5.281 Y -23.339 Z 12.587 A -68.469 C -15.593 F 159 +G1 X -4.239 Y -22.684 Z 13.460 A -69.036 C -15.890 F 159 +G1 X -3.191 Y -21.997 Z 14.369 A -69.656 C -16.214 F 159 +G1 X -2.187 Y -21.309 Z 15.269 A -70.298 C -16.546 F 159 +G1 X -1.310 Y -20.681 Z 16.081 A -70.898 C -16.861 F 159 +G1 X -0.467 Y -20.047 Z 16.893 A -71.355 C -17.515 F 159 +G1 X 0.439 Y -19.327 Z 17.800 A -71.634 C -18.679 F 159 +G1 X 1.320 Y -18.588 Z 18.715 A -71.841 C -19.915 F 159 +G1 X 2.169 Y -17.832 Z 19.633 A -71.964 C -21.235 F 159 +G1 X 2.887 Y -17.153 Z 20.443 A -72.003 C -22.463 F 159 +G1 X 3.675 Y -16.358 Z 21.371 A -71.958 C -23.956 F 159 +G1 X 4.424 Y -15.546 Z 22.302 A -71.807 C -25.554 F 159 +G1 X 4.903 Y -14.993 Z 22.925 A -71.639 C -26.685 F 159 +G1 X 5.365 Y -14.432 Z 23.549 A -71.425 C -27.853 F 159 +G1 X 5.952 Y -13.669 Z 24.385 A -71.059 C -29.475 F 159 +G1 X 6.126 Y -13.414 Z 24.670 A -70.942 C -30.040 F 159 +G1 X 6.292 Y -13.128 Z 25.013 A -70.850 C -30.717 F 159 +G1 X 6.424 Y -12.845 Z 25.376 A -70.803 C -31.434 F 159 +G1 X 6.521 Y -12.569 Z 25.758 A -70.799 C -32.188 F 159 +G1 X 6.587 Y -12.302 Z 26.157 A -70.837 C -32.977 F 159 +G1 X 6.719 Y -11.084 Z 28.149 A -71.108 C -36.914 F 159 +G1 X 6.718 Y -11.024 Z 28.255 A -71.228 C -36.831 F 636 +G1 X 6.700 Y -10.985 Z 28.343 A -71.325 C -36.765 F 636 +G1 X 6.666 Y -10.965 Z 28.411 A -71.403 C -36.711 F 636 +G1 X 6.643 Y -10.962 Z 28.438 A -71.438 C -36.687 F 636 +G1 X 6.617 Y -10.965 Z 28.461 A -71.472 C -36.664 F 636 +G1 X 6.555 Y -10.983 Z 28.490 A -71.542 C -36.616 F 636 +G1 X 6.481 Y -11.021 Z 28.500 A -71.625 C -36.559 F 636 +G1 X 6.396 Y -11.076 Z 28.490 A -71.726 C -36.490 F 636 +G1 X 6.300 Y -11.148 Z 28.459 A -71.849 C -36.406 F 636 +G1 X 6.205 Y -11.229 Z 28.413 A -71.947 C -36.339 F 636 +G1 X 6.121 Y -11.308 Z 28.358 A -72.042 C -36.274 F 636 +G1 X 6.050 Y -11.386 Z 28.293 A -72.134 C -36.212 F 636 +G1 X 5.992 Y -11.462 Z 28.219 A -72.224 C -36.151 F 636 +G1 X 5.948 Y -11.535 Z 28.134 A -72.312 C -36.091 F 636 +G1 X 5.921 Y -11.605 Z 28.040 A -72.402 C -36.030 F 636 +G1 X 5.910 Y -11.671 Z 27.935 A -72.494 C -35.968 F 636 +G1 X 5.917 Y -11.732 Z 27.820 A -72.591 C -35.902 F 636 +G1 X 6.139 Y -12.524 Z 26.198 A -71.673 C -32.860 F 159 +G1 X 6.161 Y -12.641 Z 25.971 A -71.541 C -32.438 F 159 +G1 X 6.163 Y -12.765 Z 25.751 A -71.439 C -32.028 F 159 +G1 X 6.132 Y -12.961 Z 25.439 A -71.345 C -31.436 F 159 +G1 X 6.059 Y -13.167 Z 25.146 A -71.320 C -30.873 F 159 +G1 X 5.947 Y -13.380 Z 24.877 A -71.361 C -30.348 F 159 +G1 X 5.798 Y -13.593 Z 24.635 A -71.467 C -29.864 F 159 +G1 X 5.388 Y -14.068 Z 24.140 A -71.812 C -28.867 F 159 +G1 X 4.731 Y -14.775 Z 23.390 A -72.274 C -27.404 F 159 +G1 X 4.197 Y -15.311 Z 22.807 A -72.583 C -26.305 F 159 +G1 X 3.645 Y -15.834 Z 22.224 A -72.840 C -25.254 F 159 +G1 X 3.074 Y -16.344 Z 21.643 A -73.047 C -24.254 F 159 +G1 X 2.486 Y -16.841 Z 21.063 A -73.208 C -23.301 F 159 +G1 X 1.882 Y -17.324 Z 20.484 A -73.327 C -22.390 F 159 +G1 X 1.044 Y -17.954 Z 19.707 A -73.428 C -21.225 F 159 +G1 X 0.081 Y -18.626 Z 18.846 A -73.476 C -19.985 F 159 +G1 X -0.916 Y -19.271 Z 17.988 A -73.424 C -18.876 F 159 +G1 X -1.885 Y -19.853 Z 17.182 A -73.237 C -18.065 F 159 +G1 X -2.966 Y -20.457 Z 16.321 A -72.769 C -17.807 F 159 +G1 X -4.072 Y -21.031 Z 15.468 A -72.330 C -17.585 F 159 +G1 X -5.197 Y -21.577 Z 14.628 A -71.930 C -17.383 F 159 +G1 X -6.112 Y -21.993 Z 13.965 A -71.638 C -17.235 F 159 +G1 X -7.039 Y -22.392 Z 13.308 A -71.373 C -17.100 F 159 +G1 X -8.215 Y -22.869 Z 12.499 A -71.076 C -16.948 F 159 +G1 X -9.511 Y -23.377 Z 11.647 A -69.689 C -19.191 F 159 +G1 X -10.182 Y -23.630 Z 11.219 A -68.867 C -20.673 F 159 +G1 X -10.851 Y -23.885 Z 10.793 A -68.063 C -22.154 F 159 +G1 X -11.524 Y -24.131 Z 10.375 A -67.299 C -23.635 F 159 +G1 X -12.197 Y -24.377 Z 9.958 A -66.555 C -25.109 F 159 +G1 X -12.874 Y -24.615 Z 9.550 A -65.855 C -26.578 F 159 +G1 X -13.550 Y -24.854 Z 9.142 A -65.177 C -28.035 F 159 +G1 X -14.856 Y -25.296 Z 8.377 A -63.981 C -30.799 F 159 +G1 X -15.956 Y -25.655 Z 7.749 A -63.077 C -33.068 F 159 +G1 X -16.746 Y -25.901 Z 7.312 A -62.494 C -34.656 F 159 +G1 X -17.533 Y -26.147 Z 6.876 A -61.941 C -36.212 F 159 +G1 X -18.906 Y -26.555 Z 6.142 A -61.101 C -38.833 F 159 +G1 X -20.051 Y -26.885 Z 5.550 A -60.502 C -40.933 F 159 +G1 X -21.192 Y -27.213 Z 4.960 A -59.956 C -42.956 F 159 +G1 X -23.005 Y -27.766 Z 4.036 A -59.193 C -46.067 F 159 +G1 X -24.574 Y -28.263 Z 3.254 A -58.640 C -48.642 F 159 +G1 X -26.697 Y -29.042 Z 2.140 A -57.888 C -52.060 F 159 +G1 X -26.957 Y -29.146 Z 1.999 A -57.699 C -51.996 F 636 +G1 X -27.196 Y -29.258 Z 1.860 A -57.519 C -51.935 F 636 +G1 X -27.413 Y -29.379 Z 1.725 A -57.348 C -51.876 F 636 +G1 X -27.608 Y -29.507 Z 1.592 A -57.185 C -51.820 F 636 +G1 X -27.783 Y -29.642 Z 1.463 A -57.030 C -51.767 F 636 +G1 X -27.937 Y -29.784 Z 1.336 A -56.883 C -51.716 F 636 +G1 X -28.071 Y -29.932 Z 1.213 A -56.741 C -51.666 F 636 +G1 X -28.185 Y -30.086 Z 1.093 A -56.604 C -51.619 F 636 +G1 X -28.279 Y -30.245 Z 0.976 A -56.472 C -51.573 F 636 +G1 X -28.354 Y -30.410 Z 0.863 A -56.344 C -51.528 F 636 +G1 X -28.410 Y -30.578 Z 0.754 A -56.217 C -51.483 F 636 +G1 X -28.447 Y -30.751 Z 0.648 A -56.093 C -51.439 F 636 +G1 X -28.465 Y -30.928 Z 0.547 A -55.970 C -51.396 F 636 +G1 X -28.465 Y -31.107 Z 0.449 A -55.846 C -51.352 F 636 +G1 X -28.448 Y -31.290 Z 0.355 A -55.722 C -51.307 F 636 +G1 X -28.413 Y -31.475 Z 0.265 A -55.596 C -51.263 F 636 +G1 X -28.361 Y -31.661 Z 0.179 A -55.468 C -51.217 F 636 +G1 X -28.291 Y -31.849 Z 0.098 A -55.338 C -51.170 F 636 +G1 X -28.206 Y -32.038 Z 0.021 A -55.204 C -51.122 F 636 +G1 X -28.104 Y -32.228 Z -0.051 A -55.067 C -51.072 F 636 +G1 X -27.985 Y -32.417 Z -0.119 A -54.926 C -51.021 F 636 +G1 X -27.852 Y -32.607 Z -0.182 A -54.781 C -50.968 F 636 +G1 X -27.703 Y -32.795 Z -0.241 A -54.632 C -50.913 F 636 +G1 X -27.538 Y -32.983 Z -0.294 A -54.479 C -50.857 F 636 +G1 X -27.359 Y -33.168 Z -0.342 A -54.321 C -50.799 F 636 +G1 X -27.166 Y -33.352 Z -0.386 A -54.158 C -50.738 F 636 +G1 X -26.958 Y -33.533 Z -0.424 A -53.990 C -50.676 F 636 +G1 X -26.737 Y -33.711 Z -0.457 A -53.818 C -50.612 F 636 +G1 X -26.502 Y -33.885 Z -0.484 A -53.641 C -50.545 F 636 +G1 X -26.253 Y -34.056 Z -0.506 A -53.459 C -50.476 F 636 +G1 X -25.992 Y -34.223 Z -0.522 A -53.272 C -50.406 F 636 +G1 X -25.718 Y -34.384 Z -0.533 A -53.081 C -50.333 F 636 +G1 X -25.437 Y -34.540 Z -0.538 A -52.916 C -50.269 F 636 +G1 X -25.154 Y -34.689 Z -0.538 A -52.751 C -50.206 F 636 +G1 X -24.869 Y -34.830 Z -0.533 A -52.588 C -50.143 F 636 +G1 X -24.583 Y -34.964 Z -0.523 A -52.425 C -50.080 F 636 +G1 X -24.296 Y -35.090 Z -0.508 A -52.264 C -50.017 F 636 +G1 X -24.008 Y -35.207 Z -0.488 A -52.104 C -49.954 F 636 +G1 X -23.721 Y -35.315 Z -0.463 A -51.946 C -49.892 F 636 +G1 X -23.433 Y -35.415 Z -0.433 A -51.789 C -49.830 F 636 +G1 X -23.147 Y -35.504 Z -0.397 A -51.634 C -49.768 F 636 +G1 X -22.862 Y -35.584 Z -0.356 A -51.481 C -49.707 F 636 +G1 X -22.578 Y -35.654 Z -0.310 A -51.329 C -49.647 F 636 +G1 X -22.297 Y -35.713 Z -0.259 A -51.179 C -49.586 F 636 +G1 X -22.018 Y -35.762 Z -0.203 A -51.031 C -49.526 F 636 +G1 X -21.742 Y -35.799 Z -0.141 A -50.885 C -49.467 F 636 +G1 X -21.469 Y -35.824 Z -0.074 A -50.741 C -49.408 F 636 +G1 X -21.200 Y -35.838 Z -0.002 A -50.598 C -49.349 F 636 +G1 X -20.935 Y -35.839 Z 0.075 A -50.456 C -49.291 F 636 +G1 X -20.675 Y -35.827 Z 0.158 A -50.316 C -49.233 F 636 +G1 X -20.419 Y -35.803 Z 0.247 A -50.177 C -49.176 F 636 +G1 X -20.169 Y -35.765 Z 0.340 A -50.039 C -49.118 F 636 +G1 X -19.925 Y -35.713 Z 0.440 A -49.901 C -49.061 F 636 +G1 X -19.687 Y -35.647 Z 0.544 A -49.764 C -49.003 F 636 +G1 X -19.455 Y -35.567 Z 0.654 A -49.627 C -48.945 F 636 +G1 X -19.231 Y -35.472 Z 0.770 A -49.489 C -48.886 F 636 +G1 X -19.013 Y -35.362 Z 0.891 A -49.350 C -48.827 F 636 +G1 X -18.804 Y -35.236 Z 1.017 A -49.209 C -48.767 F 636 +G1 X -18.603 Y -35.094 Z 1.149 A -49.066 C -48.706 F 636 +G1 X -18.411 Y -34.937 Z 1.287 A -48.921 C -48.643 F 636 +G1 X -18.228 Y -34.762 Z 1.430 A -48.772 C -48.579 F 636 +G1 X -18.054 Y -34.571 Z 1.579 A -48.620 C -48.512 F 636 +G1 X -17.891 Y -34.362 Z 1.733 A -48.463 C -48.444 F 636 +G1 X -17.737 Y -34.136 Z 1.893 A -48.302 C -48.373 F 636 +G1 X -16.823 Y -32.682 Z 2.900 A -50.315 C -44.245 F 159 +G1 X -16.704 Y -32.501 Z 3.027 A -50.578 C -43.729 F 159 +G1 X -16.441 Y -32.150 Z 3.283 A -51.085 C -42.682 F 159 +G1 X -16.143 Y -31.818 Z 3.540 A -51.565 C -41.608 F 159 +G1 X -15.809 Y -31.504 Z 3.797 A -52.016 C -40.501 F 159 +G1 X -15.439 Y -31.212 Z 4.051 A -52.433 C -39.363 F 159 +G1 X -14.327 Y -30.471 Z 4.755 A -53.548 C -36.134 F 159 +G1 X -13.615 Y -30.002 Z 5.209 A -54.325 C -34.064 F 159 +G1 X -13.010 Y -29.600 Z 5.611 A -55.055 C -32.299 F 159 +G1 X -12.403 Y -29.198 Z 6.015 A -55.820 C -30.533 F 159 +G1 X -11.801 Y -28.797 Z 6.431 A -56.642 C -28.785 F 159 +G1 X -11.197 Y -28.398 Z 6.849 A -57.496 C -27.043 F 159 +G1 X -10.599 Y -27.998 Z 7.277 A -58.403 C -25.325 F 159 +G1 X -9.999 Y -27.600 Z 7.708 A -59.339 C -23.620 F 159 +G1 X -9.385 Y -27.190 Z 8.164 A -60.355 C -21.890 F 159 +G1 X -8.770 Y -26.782 Z 8.621 A -61.395 C -20.181 F 159 +G1 X -8.179 Y -26.387 Z 9.075 A -62.445 C -18.561 F 159 +G1 X -7.588 Y -25.994 Z 9.530 A -63.512 C -16.964 F 159 +G1 X -7.003 Y -25.602 Z 9.994 A -64.611 C -15.409 F 159 +G1 X -6.425 Y -25.216 Z 10.454 A -65.628 C -14.069 F 159 +G1 X -5.415 Y -24.506 Z 11.322 A -66.256 C -14.411 F 159 +G1 X -4.420 Y -23.790 Z 12.204 A -66.919 C -14.768 F 159 +G1 X -3.442 Y -23.066 Z 13.101 A -67.618 C -15.141 F 159 +G1 X -2.472 Y -22.323 Z 14.021 A -68.358 C -15.533 F 159 +G1 X -1.538 Y -21.584 Z 14.937 A -69.116 C -15.931 F 159 +G1 X -0.645 Y -20.851 Z 15.844 A -69.871 C -16.363 F 159 +G1 X 0.233 Y -20.093 Z 16.777 A -70.391 C -17.361 F 159 +G1 X 1.080 Y -19.327 Z 17.712 A -70.779 C -18.545 F 159 +G1 X 1.898 Y -18.548 Z 18.653 A -71.062 C -19.860 F 159 +G1 X 2.688 Y -17.755 Z 19.599 A -71.271 C -21.233 F 159 +G1 X 3.377 Y -17.024 Z 20.462 A -71.384 C -22.554 F 159 +G1 X 4.082 Y -16.232 Z 21.386 A -71.415 C -24.051 F 159 +G1 X 4.776 Y -15.396 Z 22.348 A -71.336 C -25.712 F 159 +G1 X 5.431 Y -14.549 Z 23.312 A -71.142 C -27.471 F 159 +G1 X 5.906 Y -13.891 Z 24.051 A -70.918 C -28.876 F 159 +G1 X 6.200 Y -13.456 Z 24.540 A -70.740 C -29.831 F 159 +G1 X 6.374 Y -13.167 Z 24.876 A -70.634 C -30.497 F 159 +G1 X 6.530 Y -12.878 Z 25.223 A -70.542 C -31.191 F 159 +G1 X 6.666 Y -12.592 Z 25.580 A -70.462 C -31.912 F 159 +G1 X 6.838 Y -12.169 Z 26.133 A -70.362 C -33.037 F 159 +G1 X 7.180 Y -10.880 Z 28.012 A -70.183 C -36.819 F 159 +G1 X 7.193 Y -10.818 Z 28.107 A -70.304 C -36.780 F 636 +G1 X 7.194 Y -10.765 Z 28.197 A -70.414 C -36.744 F 636 +G1 X 7.185 Y -10.721 Z 28.282 A -70.515 C -36.712 F 636 +G1 X 7.165 Y -10.687 Z 28.360 A -70.607 C -36.682 F 636 +G1 X 7.137 Y -10.661 Z 28.433 A -70.694 C -36.654 F 636 +G1 X 7.099 Y -10.645 Z 28.499 A -70.776 C -36.628 F 636 +G1 X 7.053 Y -10.637 Z 28.559 A -70.856 C -36.602 F 636 +G1 X 6.999 Y -10.638 Z 28.613 A -70.936 C -36.576 F 636 +G1 X 6.937 Y -10.646 Z 28.659 A -71.019 C -36.550 F 636 +G1 X 6.868 Y -10.663 Z 28.699 A -71.104 C -36.523 F 636 +G1 X 6.793 Y -10.688 Z 28.732 A -71.194 C -36.494 F 636 +G1 X 6.712 Y -10.720 Z 28.758 A -71.290 C -36.463 F 636 +G1 X 6.625 Y -10.759 Z 28.777 A -71.393 C -36.430 F 636 +G1 X 6.533 Y -10.806 Z 28.787 A -71.502 C -36.396 F 636 +G1 X 6.437 Y -10.860 Z 28.791 A -71.618 C -36.359 F 636 +G1 X 6.337 Y -10.920 Z 28.786 A -71.741 C -36.319 F 636 +G1 X 6.141 Y -11.049 Z 28.758 A -71.955 C -36.252 F 636 +G1 X 6.050 Y -11.115 Z 28.735 A -72.058 C -36.219 F 636 +G1 X 5.965 Y -11.180 Z 28.706 A -72.159 C -36.187 F 636 +G1 X 5.886 Y -11.246 Z 28.671 A -72.258 C -36.156 F 636 +G1 X 5.813 Y -11.312 Z 28.630 A -72.354 C -36.126 F 636 +G1 X 5.747 Y -11.377 Z 28.583 A -72.448 C -36.096 F 636 +G1 X 5.688 Y -11.441 Z 28.530 A -72.541 C -36.067 F 636 +G1 X 5.638 Y -11.505 Z 28.471 A -72.632 C -36.038 F 636 +G1 X 5.595 Y -11.567 Z 28.405 A -72.722 C -36.010 F 636 +G1 X 5.562 Y -11.628 Z 28.333 A -72.812 C -35.981 F 636 +G1 X 5.538 Y -11.686 Z 28.254 A -72.904 C -35.953 F 636 +G1 X 5.524 Y -11.743 Z 28.170 A -72.997 C -35.923 F 636 +G1 X 5.521 Y -11.798 Z 28.078 A -73.094 C -35.893 F 636 +G1 X 5.528 Y -11.849 Z 27.980 A -73.194 C -35.862 F 636 +G1 X 5.547 Y -11.898 Z 27.875 A -73.300 C -35.829 F 636 +G1 X 5.922 Y -12.627 Z 26.218 A -72.073 C -32.800 F 159 +G1 X 5.972 Y -12.735 Z 25.979 A -71.881 C -32.372 F 159 +G1 X 5.995 Y -12.854 Z 25.747 A -71.735 C -31.951 F 159 +G1 X 5.991 Y -12.982 Z 25.526 A -71.634 C -31.541 F 159 +G1 X 5.962 Y -13.117 Z 25.317 A -71.579 C -31.148 F 159 +G1 X 5.914 Y -13.242 Z 25.140 A -71.566 C -30.809 F 159 +G1 X 5.847 Y -13.370 Z 24.976 A -71.587 C -30.488 F 159 +G1 X 5.714 Y -13.563 Z 24.753 A -71.678 C -30.044 F 159 +G1 X 5.661 Y -13.627 Z 24.685 A -71.725 C -29.906 F 159 +G1 X 5.190 Y -14.129 Z 24.177 A -72.152 C -28.867 F 159 +G1 X 4.646 Y -14.672 Z 23.617 A -72.581 C -27.755 F 159 +G1 X 4.082 Y -15.198 Z 23.057 A -72.966 C -26.676 F 159 +G1 X 3.498 Y -15.708 Z 22.499 A -73.302 C -25.644 F 159 +G1 X 2.895 Y -16.203 Z 21.942 A -73.588 C -24.663 F 159 +G1 X 2.274 Y -16.682 Z 21.386 A -73.829 C -23.729 F 159 +G1 X 1.636 Y -17.144 Z 20.831 A -74.029 C -22.838 F 159 +G1 X 1.000 Y -17.578 Z 20.293 A -74.187 C -22.009 F 159 +G1 X 0.342 Y -18.000 Z 19.751 A -74.313 C -21.208 F 159 +G1 X -0.341 Y -18.414 Z 19.202 A -74.415 C -20.415 F 159 +G1 X -1.040 Y -18.811 Z 18.654 A -74.467 C -19.691 F 159 +G1 X -1.903 Y -19.271 Z 17.993 A -74.490 C -18.861 F 159 +G1 X -2.648 Y -19.641 Z 17.442 A -74.310 C -18.580 F 159 +G1 X -3.794 Y -20.169 Z 16.618 A -73.959 C -18.405 F 159 +G1 X -4.964 Y -20.661 Z 15.803 A -73.645 C -18.248 F 159 +G1 X -6.153 Y -21.115 Z 15.000 A -73.369 C -18.110 F 159 +G1 X -7.362 Y -21.535 Z 14.208 A -73.131 C -17.991 F 159 +G1 X -8.636 Y -21.934 Z 13.397 A -72.921 C -17.886 F 159 +G1 X -9.947 Y -22.321 Z 12.591 A -72.031 C -19.319 F 159 +G1 X -10.639 Y -22.518 Z 12.178 A -71.279 C -20.743 F 159 +G1 X -11.330 Y -22.715 Z 11.765 A -70.545 C -22.160 F 159 +G1 X -12.719 Y -23.085 Z 10.956 A -69.169 C -24.960 F 159 +G1 X -13.891 Y -23.377 Z 10.288 A -68.103 C -27.269 F 159 +G1 X -15.213 Y -23.685 Z 9.550 A -67.007 C -29.802 F 159 +G1 X -16.612 Y -23.985 Z 8.788 A -65.970 C -32.384 F 159 +G1 X -18.158 Y -24.288 Z 7.968 A -64.967 C -35.110 F 159 +G1 X -19.561 Y -24.536 Z 7.245 A -64.181 C -37.458 F 159 +G1 X -20.966 Y -24.760 Z 6.540 A -63.504 C -39.685 F 159 +G1 X -22.372 Y -24.960 Z 5.854 A -62.929 C -41.788 F 159 +G1 X -23.780 Y -25.138 Z 5.185 A -62.447 C -43.771 F 159 +G1 X -25.192 Y -25.295 Z 4.536 A -62.049 C -45.634 F 159 +G1 X -26.606 Y -25.431 Z 3.905 A -61.729 C -47.382 F 159 +G1 X -27.806 Y -25.531 Z 3.385 A -61.511 C -48.776 F 159 +G1 X -30.046 Y -25.823 Z 2.363 A -61.061 C -51.336 F 159 +G1 X -30.293 Y -25.859 Z 2.248 A -60.899 C -51.289 F 636 +G1 X -30.530 Y -25.903 Z 2.133 A -60.743 C -51.244 F 636 +G1 X -30.756 Y -25.953 Z 2.018 A -60.591 C -51.200 F 636 +G1 X -30.972 Y -26.010 Z 1.904 A -60.444 C -51.157 F 636 +G1 X -31.178 Y -26.073 Z 1.790 A -60.301 C -51.115 F 636 +G1 X -31.374 Y -26.142 Z 1.676 A -60.162 C -51.074 F 636 +G1 X -31.559 Y -26.218 Z 1.563 A -60.027 C -51.034 F 636 +G1 X -31.734 Y -26.299 Z 1.451 A -59.896 C -50.996 F 636 +G1 X -31.900 Y -26.386 Z 1.339 A -59.768 C -50.958 F 636 +G1 X -32.056 Y -26.479 Z 1.227 A -59.644 C -50.921 F 636 +G1 X -32.202 Y -26.577 Z 1.116 A -59.522 C -50.885 F 636 +G1 X -32.338 Y -26.680 Z 1.006 A -59.402 C -50.849 F 636 +G1 X -32.465 Y -26.788 Z 0.897 A -59.286 C -50.814 F 636 +G1 X -32.583 Y -26.902 Z 0.788 A -59.171 C -50.779 F 636 +G1 X -32.691 Y -27.020 Z 0.681 A -59.058 C -50.745 F 636 +G1 X -32.790 Y -27.142 Z 0.574 A -58.946 C -50.712 F 636 +G1 X -32.879 Y -27.269 Z 0.468 A -58.836 C -50.679 F 636 +G1 X -32.960 Y -27.401 Z 0.363 A -58.727 C -50.645 F 636 +G1 X -33.032 Y -27.536 Z 0.259 A -58.618 C -50.612 F 636 +G1 X -33.094 Y -27.676 Z 0.156 A -58.510 C -50.580 F 636 +G1 X -33.148 Y -27.819 Z 0.054 A -58.402 C -50.547 F 636 +G1 X -33.194 Y -27.965 Z -0.046 A -58.295 C -50.514 F 636 +G1 X -33.230 Y -28.116 Z -0.146 A -58.187 C -50.481 F 636 +G1 X -33.259 Y -28.269 Z -0.244 A -58.079 C -50.448 F 636 +G1 X -33.278 Y -28.426 Z -0.341 A -57.971 C -50.414 F 636 +G1 X -33.290 Y -28.585 Z -0.436 A -57.862 C -50.381 F 636 +G1 X -33.293 Y -28.747 Z -0.531 A -57.752 C -50.347 F 636 +G1 X -33.288 Y -28.912 Z -0.623 A -57.641 C -50.312 F 636 +G1 X -33.276 Y -29.080 Z -0.715 A -57.529 C -50.277 F 636 +G1 X -33.255 Y -29.249 Z -0.805 A -57.416 C -50.242 F 636 +G1 X -33.226 Y -29.421 Z -0.893 A -57.302 C -50.206 F 636 +G1 X -33.190 Y -29.595 Z -0.980 A -57.186 C -50.170 F 636 +G1 X -33.146 Y -29.770 Z -1.065 A -57.069 C -50.133 F 636 +G1 X -33.094 Y -29.947 Z -1.148 A -56.951 C -50.096 F 636 +G1 X -32.968 Y -30.306 Z -1.309 A -56.709 C -50.020 F 636 +G1 X -32.814 Y -30.669 Z -1.463 A -56.462 C -49.941 F 636 +G1 X -32.631 Y -31.035 Z -1.610 A -56.207 C -49.859 F 636 +G1 X -32.420 Y -31.403 Z -1.748 A -55.946 C -49.775 F 636 +G1 X -32.182 Y -31.772 Z -1.878 A -55.679 C -49.688 F 636 +G1 X -31.918 Y -32.139 Z -1.999 A -55.405 C -49.599 F 636 +G1 X -31.629 Y -32.505 Z -2.111 A -55.125 C -49.507 F 636 +G1 X -31.315 Y -32.868 Z -2.213 A -54.838 C -49.412 F 636 +G1 X -30.978 Y -33.225 Z -2.306 A -54.546 C -49.314 F 636 +G1 X -30.617 Y -33.577 Z -2.388 A -54.248 C -49.214 F 636 +G1 X -30.233 Y -33.922 Z -2.460 A -53.944 C -49.111 F 636 +G1 X -29.828 Y -34.257 Z -2.521 A -53.635 C -49.005 F 636 +G1 X -29.402 Y -34.583 Z -2.570 A -53.321 C -48.897 F 636 +G1 X -28.956 Y -34.897 Z -2.608 A -53.002 C -48.786 F 636 +G1 X -28.491 Y -35.199 Z -2.634 A -52.678 C -48.673 F 636 +G1 X -28.011 Y -35.490 Z -2.649 A -52.394 C -48.572 F 636 +G1 X -27.522 Y -35.771 Z -2.653 A -52.107 C -48.470 F 636 +G1 X -27.026 Y -36.043 Z -2.648 A -51.821 C -48.367 F 636 +G1 X -26.522 Y -36.303 Z -2.633 A -51.533 C -48.263 F 636 +G1 X -26.014 Y -36.551 Z -2.607 A -51.246 C -48.158 F 636 +G1 X -25.501 Y -36.786 Z -2.572 A -50.960 C -48.053 F 636 +G1 X -24.986 Y -37.007 Z -2.527 A -50.675 C -47.947 F 636 +G1 X -24.469 Y -37.213 Z -2.473 A -50.392 C -47.841 F 636 +G1 X -23.952 Y -37.403 Z -2.408 A -50.111 C -47.735 F 636 +G1 X -23.436 Y -37.576 Z -2.333 A -49.833 C -47.629 F 636 +G1 X -22.922 Y -37.732 Z -2.249 A -49.558 C -47.523 F 636 +G1 X -22.411 Y -37.869 Z -2.155 A -49.287 C -47.418 F 636 +G1 X -21.905 Y -37.987 Z -2.052 A -49.019 C -47.313 F 636 +G1 X -21.406 Y -38.084 Z -1.938 A -48.756 C -47.209 F 636 +G1 X -20.913 Y -38.160 Z -1.815 A -48.496 C -47.106 F 636 +G1 X -20.429 Y -38.213 Z -1.682 A -48.241 C -47.004 F 636 +G1 X -19.954 Y -38.243 Z -1.540 A -47.991 C -46.903 F 636 +G1 X -19.490 Y -38.249 Z -1.388 A -47.745 C -46.803 F 636 +G1 X -19.039 Y -38.230 Z -1.226 A -47.503 C -46.703 F 636 +G1 X -18.818 Y -38.210 Z -1.142 A -47.383 C -46.654 F 636 +G1 X -18.601 Y -38.184 Z -1.055 A -47.265 C -46.605 F 636 +G1 X -18.387 Y -38.152 Z -0.966 A -47.147 C -46.556 F 636 +G1 X -18.178 Y -38.112 Z -0.875 A -47.030 C -46.507 F 636 +G1 X -17.972 Y -38.065 Z -0.781 A -46.913 C -46.458 F 636 +G1 X -17.770 Y -38.012 Z -0.684 A -46.798 C -46.409 F 636 +G1 X -17.573 Y -37.951 Z -0.586 A -46.682 C -46.360 F 636 +G1 X -17.380 Y -37.882 Z -0.485 A -46.567 C -46.312 F 636 +G1 X -17.192 Y -37.807 Z -0.381 A -46.453 C -46.263 F 636 +G1 X -17.009 Y -37.723 Z -0.276 A -46.338 C -46.214 F 636 +G1 X -16.830 Y -37.632 Z -0.168 A -46.224 C -46.164 F 636 +G1 X -16.656 Y -37.534 Z -0.057 A -46.109 C -46.115 F 636 +G1 X -16.488 Y -37.427 Z 0.056 A -45.994 C -46.065 F 636 +G1 X -16.325 Y -37.312 Z 0.171 A -45.878 C -46.014 F 636 +G1 X -16.168 Y -37.189 Z 0.288 A -45.761 C -45.963 F 636 +G1 X -16.016 Y -37.058 Z 0.408 A -45.644 C -45.912 F 636 +G1 X -15.871 Y -36.918 Z 0.530 A -45.525 C -45.860 F 636 +G1 X -15.731 Y -36.770 Z 0.655 A -45.405 C -45.807 F 636 +G1 X -15.597 Y -36.614 Z 0.782 A -45.284 C -45.753 F 636 +G1 X -15.470 Y -36.448 Z 0.911 A -45.161 C -45.698 F 636 +G1 X -15.349 Y -36.274 Z 1.043 A -45.035 C -45.641 F 636 +G1 X -15.235 Y -36.091 Z 1.176 A -44.908 C -45.584 F 636 +G1 X -15.128 Y -35.898 Z 1.313 A -44.778 C -45.525 F 636 +G1 X -15.028 Y -35.697 Z 1.451 A -44.645 C -45.465 F 636 +G1 X -14.934 Y -35.486 Z 1.592 A -44.509 C -45.403 F 636 +G1 X -14.848 Y -35.266 Z 1.735 A -44.371 C -45.339 F 636 +G1 X -14.255 Y -33.645 Z 2.774 A -47.126 C -41.069 F 159 +G1 X -14.186 Y -33.458 Z 2.895 A -47.454 C -40.597 F 159 +G1 X -14.049 Y -33.191 Z 3.076 A -47.910 C -39.848 F 159 +G1 X -13.872 Y -32.939 Z 3.255 A -48.321 C -39.052 F 159 +G1 X -13.653 Y -32.705 Z 3.433 A -48.684 C -38.202 F 159 +G1 X -12.741 Y -31.949 Z 4.058 A -49.856 C -35.042 F 159 +G1 X -12.083 Y -31.411 Z 4.511 A -50.764 C -32.788 F 159 +G1 X -11.517 Y -30.947 Z 4.919 A -51.623 C -30.865 F 159 +G1 X -10.949 Y -30.483 Z 5.329 A -52.522 C -28.957 F 159 +G1 X -10.387 Y -30.023 Z 5.752 A -53.481 C -27.088 F 159 +G1 X -9.823 Y -29.564 Z 6.177 A -54.475 C -25.242 F 159 +G1 X -9.264 Y -29.108 Z 6.614 A -55.523 C -23.440 F 159 +G1 X -8.703 Y -28.654 Z 7.053 A -56.599 C -21.668 F 159 +G1 X -8.092 Y -28.159 Z 7.550 A -57.837 C -19.775 F 159 +G1 X -7.480 Y -27.666 Z 8.049 A -59.100 C -17.923 F 159 +G1 X -6.874 Y -27.178 Z 8.561 A -60.408 C -16.135 F 159 +G1 X -6.268 Y -26.692 Z 9.074 A -61.731 C -14.392 F 159 +G1 X -5.244 Y -25.851 Z 9.993 A -63.458 C -12.864 F 159 +G1 X -4.317 Y -25.055 Z 10.886 A -64.269 C -13.319 F 159 +G1 X -3.404 Y -24.257 Z 11.793 A -65.108 C -13.783 F 159 +G1 X -2.507 Y -23.458 Z 12.716 A -65.974 C -14.257 F 159 +G1 X -1.425 Y -22.468 Z 13.872 A -67.078 C -14.852 F 159 +G1 X -0.654 Y -21.744 Z 14.725 A -67.904 C -15.293 F 159 +G1 X 0.184 Y -20.931 Z 15.687 A -68.762 C -15.966 F 159 +G1 X 0.980 Y -20.124 Z 16.647 A -69.338 C -17.166 F 159 +G1 X 1.754 Y -19.311 Z 17.612 A -69.829 C -18.439 F 159 +G1 X 2.503 Y -18.491 Z 18.585 A -70.233 C -19.793 F 159 +G1 X 3.223 Y -17.663 Z 19.563 A -70.546 C -21.227 F 159 +G1 X 3.811 Y -16.955 Z 20.396 A -70.737 C -22.511 F 159 +G1 X 4.258 Y -16.393 Z 21.055 A -70.835 C -23.570 F 159 +G1 X 4.901 Y -15.542 Z 22.047 A -70.885 C -25.253 F 159 +G1 X 5.508 Y -14.683 Z 23.041 A -70.814 C -27.037 F 159 +G1 X 5.965 Y -13.997 Z 23.833 A -70.677 C -28.513 F 159 +G1 X 6.469 Y -13.185 Z 24.763 A -70.411 C -30.325 F 159 +G1 X 6.809 Y -12.598 Z 25.433 A -70.140 C -31.692 F 159 +G1 X 7.131 Y -12.008 Z 26.106 A -69.806 C -33.100 F 159 +G1 X 7.679 Y -10.655 Z 27.850 A -69.177 C -36.669 F 159 +G1 X 12.967 Y -2.280 Z 27.743 A -71.841 C -87.360 F 636 +G1 X 13.673 Y -2.771 Z 26.178 A -71.266 C -84.349 F 159 +G1 X 13.813 Y -2.898 Z 25.858 A -71.158 C -83.734 F 159 +G1 X 13.943 Y -3.052 Z 25.552 A -71.093 C -83.145 F 159 +G1 X 14.060 Y -3.234 Z 25.262 A -71.073 C -82.581 F 159 +G1 X 14.164 Y -3.442 Z 24.986 A -71.096 C -82.044 F 159 +G1 X 14.253 Y -3.674 Z 24.729 A -71.164 C -81.537 F 159 +G1 X 14.313 Y -3.879 Z 24.534 A -71.252 C -81.148 F 159 +G1 X 14.455 Y -4.523 Z 23.987 A -71.566 C -80.062 F 159 +G1 X 14.637 Y -5.513 Z 23.162 A -71.965 C -78.482 F 159 +G1 X 14.747 Y -6.248 Z 22.558 A -72.202 C -77.365 F 159 +G1 X 14.838 Y -6.991 Z 21.956 A -72.387 C -76.300 F 159 +G1 X 14.910 Y -7.740 Z 21.354 A -72.522 C -75.285 F 159 +G1 X 14.980 Y -8.839 Z 20.484 A -72.638 C -73.893 F 159 +G1 X 15.011 Y -9.882 Z 19.669 A -72.669 C -72.663 F 159 +G1 X 15.007 Y -11.037 Z 18.778 A -72.625 C -71.394 F 159 +G1 X 14.966 Y -12.203 Z 17.890 A -72.500 C -70.210 F 159 +G1 X 14.919 Y -12.984 Z 17.302 A -72.381 C -69.454 F 159 +G1 X 14.813 Y -14.206 Z 16.396 A -71.935 C -68.814 F 159 +G1 X 14.672 Y -15.423 Z 15.512 A -71.371 C -68.527 F 159 +G1 X 14.499 Y -16.643 Z 14.638 A -70.844 C -68.258 F 159 +G1 X 14.302 Y -17.836 Z 13.797 A -70.367 C -68.013 F 159 +G1 X 14.073 Y -19.051 Z 12.954 A -69.921 C -67.782 F 159 +G1 X 13.817 Y -20.277 Z 12.117 A -69.512 C -67.570 F 159 +G1 X 13.520 Y -21.580 Z 11.258 A -68.408 C -68.915 F 159 +G1 X 13.355 Y -22.273 Z 10.817 A -67.494 C -70.433 F 159 +G1 X 13.193 Y -22.966 Z 10.377 A -66.596 C -71.958 F 159 +G1 X 13.022 Y -23.661 Z 9.946 A -65.737 C -73.498 F 159 +G1 X 12.853 Y -24.356 Z 9.515 A -64.898 C -75.041 F 159 +G1 X 12.676 Y -25.051 Z 9.094 A -64.103 C -76.590 F 159 +G1 X 12.501 Y -25.745 Z 8.674 A -63.332 C -78.135 F 159 +G1 X 12.311 Y -26.467 Z 8.248 A -62.581 C -79.742 F 159 +G1 X 12.124 Y -27.189 Z 7.823 A -61.858 C -81.339 F 159 +G1 X 11.748 Y -28.577 Z 7.027 A -60.593 C -84.389 F 159 +G1 X 11.352 Y -29.991 Z 6.238 A -59.462 C -87.442 F 159 +G1 X 10.952 Y -31.376 Z 5.489 A -58.507 C -90.360 F 159 +G1 X 10.682 Y -32.296 Z 5.002 A -57.948 C -92.252 F 159 +G1 X 10.445 Y -33.215 Z 4.516 A -57.404 C -94.105 F 159 +G1 X 10.245 Y -34.139 Z 4.026 A -56.865 C -95.937 F 159 +G1 X 10.104 Y -34.913 Z 3.618 A -56.426 C -97.450 F 159 +G1 X 9.964 Y -35.842 Z 3.134 A -55.918 C -99.241 F 159 +G1 X 9.719 Y -38.099 Z 1.937 A -54.730 C -103.484 F 159 +G1 X 9.706 Y -38.286 Z 1.837 A -54.607 C -103.407 F 636 +G1 X 9.711 Y -38.453 Z 1.743 A -54.496 C -103.336 F 636 +G1 X 9.732 Y -38.602 Z 1.655 A -54.395 C -103.272 F 636 +G1 X 9.769 Y -38.732 Z 1.574 A -54.304 C -103.215 F 636 +G1 X 9.822 Y -38.843 Z 1.500 A -54.220 C -103.161 F 636 +G1 X 9.890 Y -38.935 Z 1.432 A -54.143 C -103.112 F 636 +G1 X 9.973 Y -39.009 Z 1.371 A -54.070 C -103.065 F 636 +G1 X 10.070 Y -39.064 Z 1.317 A -53.998 C -103.020 F 636 +G1 X 10.181 Y -39.100 Z 1.270 A -53.926 C -102.973 F 636 +G1 X 10.304 Y -39.117 Z 1.230 A -53.850 C -102.924 F 636 +G1 X 10.441 Y -39.116 Z 1.198 A -53.769 C -102.872 F 636 +G1 X 10.589 Y -39.096 Z 1.172 A -53.681 C -102.815 F 636 +G1 X 10.749 Y -39.057 Z 1.154 A -53.585 C -102.753 F 636 +G1 X 10.920 Y -38.999 Z 1.143 A -53.480 C -102.685 F 636 +G1 X 11.102 Y -38.923 Z 1.139 A -53.366 C -102.611 F 636 +G1 X 11.293 Y -38.828 Z 1.143 A -53.243 C -102.530 F 636 +G1 X 11.485 Y -38.721 Z 1.153 A -53.142 C -102.464 F 636 +G1 X 11.667 Y -38.608 Z 1.170 A -53.043 C -102.399 F 636 +G1 X 11.838 Y -38.489 Z 1.192 A -52.947 C -102.335 F 636 +G1 X 11.998 Y -38.364 Z 1.221 A -52.853 C -102.273 F 636 +G1 X 12.146 Y -38.233 Z 1.256 A -52.761 C -102.212 F 636 +G1 X 12.282 Y -38.097 Z 1.297 A -52.671 C -102.152 F 636 +G1 X 12.406 Y -37.955 Z 1.344 A -52.582 C -102.092 F 636 +G1 X 12.516 Y -37.808 Z 1.398 A -52.494 C -102.033 F 636 +G1 X 12.613 Y -37.654 Z 1.457 A -52.407 C -101.975 F 636 +G1 X 12.695 Y -37.496 Z 1.524 A -52.319 C -101.916 F 636 +G1 X 12.763 Y -37.332 Z 1.596 A -52.231 C -101.857 F 636 +G1 X 12.816 Y -37.162 Z 1.676 A -52.142 C -101.797 F 636 +G1 X 12.853 Y -36.988 Z 1.761 A -52.052 C -101.735 F 636 +G1 X 12.874 Y -36.807 Z 1.853 A -51.959 C -101.672 F 636 +G1 X 12.878 Y -36.622 Z 1.952 A -51.863 C -101.606 F 636 +G1 X 12.865 Y -36.432 Z 2.058 A -51.763 C -101.538 F 636 +G1 X 12.673 Y -34.732 Z 3.017 A -53.155 C -97.788 F 159 +G1 X 12.632 Y -34.221 Z 3.301 A -53.584 C -96.659 F 159 +G1 X 12.615 Y -33.701 Z 3.589 A -54.009 C -95.517 F 159 +G1 X 12.621 Y -33.234 Z 3.846 A -54.380 C -94.491 F 159 +G1 X 12.648 Y -32.759 Z 4.104 A -54.744 C -93.448 F 159 +G1 X 12.727 Y -32.064 Z 4.476 A -55.254 C -91.916 F 159 +G1 X 12.941 Y -30.879 Z 5.099 A -56.092 C -89.273 F 159 +G1 X 13.204 Y -29.455 Z 5.868 A -57.235 C -86.043 F 159 +G1 X 13.331 Y -28.744 Z 6.265 A -57.877 C -84.416 F 159 +G1 X 13.460 Y -28.032 Z 6.663 A -58.550 C -82.777 F 159 +G1 X 13.584 Y -27.322 Z 7.073 A -59.277 C -81.140 F 159 +G1 X 13.710 Y -26.611 Z 7.484 A -60.034 C -79.497 F 159 +G1 X 13.822 Y -25.953 Z 7.876 A -60.782 C -77.981 F 159 +G1 X 13.935 Y -25.295 Z 8.268 A -61.554 C -76.466 F 159 +G1 X 14.044 Y -24.639 Z 8.669 A -62.366 C -74.964 F 159 +G1 X 14.155 Y -23.983 Z 9.072 A -63.200 C -73.468 F 159 +G1 X 14.270 Y -23.280 Z 9.514 A -64.138 C -71.878 F 159 +G1 X 14.386 Y -22.576 Z 9.958 A -65.096 C -70.299 F 159 +G1 X 14.497 Y -21.876 Z 10.410 A -66.091 C -68.748 F 159 +G1 X 14.610 Y -21.176 Z 10.864 A -67.099 C -67.214 F 159 +G1 X 14.796 Y -19.908 Z 11.727 A -67.941 C -66.744 F 159 +G1 X 14.955 Y -18.679 Z 12.587 A -68.469 C -67.023 F 159 +G1 X 15.092 Y -17.457 Z 13.460 A -69.036 C -67.320 F 159 +G1 X 15.209 Y -16.209 Z 14.369 A -69.656 C -67.644 F 159 +G1 X 15.297 Y -14.996 Z 15.269 A -70.298 C -67.976 F 159 +G1 X 15.352 Y -13.918 Z 16.081 A -70.898 C -68.291 F 159 +G1 X 15.383 Y -12.864 Z 16.893 A -71.355 C -68.945 F 159 +G1 X 15.385 Y -11.706 Z 17.800 A -71.634 C -70.109 F 159 +G1 X 15.356 Y -10.558 Z 18.715 A -71.841 C -71.345 F 159 +G1 X 15.294 Y -9.422 Z 19.633 A -71.964 C -72.665 F 159 +G1 X 15.211 Y -8.437 Z 20.443 A -72.003 C -73.893 F 159 +G1 X 15.081 Y -7.326 Z 21.371 A -71.958 C -75.386 F 159 +G1 X 14.913 Y -6.233 Z 22.302 A -71.807 C -76.984 F 159 +G1 X 14.779 Y -5.514 Z 22.925 A -71.639 C -78.115 F 159 +G1 X 14.628 Y -4.803 Z 23.549 A -71.425 C -79.283 F 159 +G1 X 14.398 Y -3.869 Z 24.385 A -71.059 C -80.905 F 159 +G1 X 14.307 Y -3.574 Z 24.670 A -70.942 C -81.470 F 159 +G1 X 14.187 Y -3.266 Z 25.013 A -70.850 C -82.147 F 159 +G1 X 14.047 Y -2.986 Z 25.376 A -70.803 C -82.864 F 159 +G1 X 13.893 Y -2.738 Z 25.758 A -70.799 C -83.618 F 159 +G1 X 13.725 Y -2.520 Z 26.157 A -70.837 C -84.407 F 159 +G1 X 12.855 Y -1.658 Z 28.149 A -71.108 C -88.344 F 159 +G1 X 12.807 Y -1.621 Z 28.255 A -71.228 C -88.261 F 636 +G1 X 12.765 Y -1.610 Z 28.343 A -71.325 C -88.195 F 636 +G1 X 12.729 Y -1.625 Z 28.411 A -71.403 C -88.141 F 636 +G1 X 12.713 Y -1.641 Z 28.438 A -71.438 C -88.117 F 636 +G1 X 12.698 Y -1.662 Z 28.461 A -71.472 C -88.094 F 636 +G1 X 12.674 Y -1.723 Z 28.490 A -71.542 C -88.046 F 636 +G1 X 12.657 Y -1.804 Z 28.500 A -71.625 C -87.989 F 636 +G1 X 12.647 Y -1.905 Z 28.490 A -71.726 C -87.920 F 636 +G1 X 12.644 Y -2.025 Z 28.459 A -71.849 C -87.836 F 636 +G1 X 12.648 Y -2.150 Z 28.413 A -71.947 C -87.769 F 636 +G1 X 12.658 Y -2.265 Z 28.358 A -72.042 C -87.704 F 636 +G1 X 12.674 Y -2.369 Z 28.293 A -72.134 C -87.642 F 636 +G1 X 12.697 Y -2.462 Z 28.219 A -72.224 C -87.581 F 636 +G1 X 12.727 Y -2.541 Z 28.134 A -72.312 C -87.521 F 636 +G1 X 12.765 Y -2.606 Z 28.040 A -72.402 C -87.460 F 636 +G1 X 12.809 Y -2.656 Z 27.935 A -72.494 C -87.398 F 636 +G1 X 12.862 Y -2.689 Z 27.820 A -72.591 C -87.332 F 636 +G1 X 13.620 Y -3.009 Z 26.198 A -71.673 C -84.290 F 159 +G1 X 13.724 Y -3.065 Z 25.971 A -71.541 C -83.868 F 159 +G1 X 13.823 Y -3.140 Z 25.751 A -71.439 C -83.458 F 159 +G1 X 13.957 Y -3.287 Z 25.439 A -71.345 C -82.866 F 159 +G1 X 14.073 Y -3.472 Z 25.146 A -71.320 C -82.303 F 159 +G1 X 14.169 Y -3.692 Z 24.877 A -71.361 C -81.778 F 159 +G1 X 14.243 Y -3.941 Z 24.635 A -71.467 C -81.294 F 159 +G1 X 14.358 Y -4.558 Z 24.140 A -71.812 C -80.297 F 159 +G1 X 14.502 Y -5.513 Z 23.390 A -72.274 C -78.834 F 159 +G1 X 14.588 Y -6.264 Z 22.807 A -72.583 C -77.735 F 159 +G1 X 14.652 Y -7.022 Z 22.224 A -72.840 C -76.684 F 159 +G1 X 14.695 Y -7.787 Z 21.643 A -73.047 C -75.684 F 159 +G1 X 14.717 Y -8.556 Z 21.063 A -73.208 C -74.731 F 159 +G1 X 14.718 Y -9.329 Z 20.484 A -73.327 C -73.820 F 159 +G1 X 14.688 Y -10.378 Z 19.707 A -73.428 C -72.655 F 159 +G1 X 14.613 Y -11.549 Z 18.846 A -73.476 C -71.415 F 159 +G1 X 14.496 Y -12.731 Z 17.988 A -73.424 C -70.306 F 159 +G1 X 14.347 Y -13.852 Z 17.182 A -73.237 C -69.495 F 159 +G1 X 14.145 Y -15.073 Z 16.321 A -72.769 C -69.237 F 159 +G1 X 13.905 Y -16.296 Z 15.468 A -72.330 C -69.015 F 159 +G1 X 13.629 Y -17.516 Z 14.628 A -71.930 C -68.813 F 159 +G1 X 13.385 Y -18.490 Z 13.965 A -71.638 C -68.665 F 159 +G1 X 13.119 Y -19.465 Z 13.308 A -71.373 C -68.530 F 159 +G1 X 12.758 Y -20.681 Z 12.499 A -71.076 C -68.378 F 159 +G1 X 12.347 Y -22.011 Z 11.647 A -69.689 C -70.621 F 159 +G1 X 12.127 Y -22.693 Z 11.219 A -68.867 C -72.103 F 159 +G1 X 11.909 Y -23.375 Z 10.793 A -68.063 C -73.584 F 159 +G1 X 11.681 Y -24.055 Z 10.375 A -67.299 C -75.065 F 159 +G1 X 11.455 Y -24.735 Z 9.958 A -66.555 C -76.539 F 159 +G1 X 11.219 Y -25.413 Z 9.550 A -65.855 C -78.008 F 159 +G1 X 10.984 Y -26.090 Z 9.142 A -65.177 C -79.465 F 159 +G1 X 10.515 Y -27.387 Z 8.377 A -63.981 C -82.229 F 159 +G1 X 10.110 Y -28.470 Z 7.749 A -63.077 C -84.498 F 159 +G1 X 9.810 Y -29.241 Z 7.312 A -62.494 C -86.086 F 159 +G1 X 9.512 Y -30.010 Z 6.876 A -61.941 C -87.642 F 159 +G1 X 8.975 Y -31.338 Z 6.142 A -61.101 C -90.263 F 159 +G1 X 8.519 Y -32.439 Z 5.550 A -60.502 C -92.363 F 159 +G1 X 8.064 Y -33.535 Z 4.960 A -59.956 C -94.386 F 159 +G1 X 7.366 Y -35.297 Z 4.036 A -59.193 C -97.497 F 159 +G1 X 6.776 Y -36.834 Z 3.254 A -58.640 C -100.072 F 159 +G1 X 6.061 Y -38.980 Z 2.140 A -57.888 C -103.490 F 159 +G1 X 5.980 Y -39.248 Z 1.999 A -57.699 C -103.426 F 636 +G1 X 5.920 Y -39.505 Z 1.860 A -57.519 C -103.365 F 636 +G1 X 5.879 Y -39.749 Z 1.725 A -57.348 C -103.306 F 636 +G1 X 5.857 Y -39.982 Z 1.592 A -57.185 C -103.250 F 636 +G1 X 5.853 Y -40.203 Z 1.463 A -57.030 C -103.197 F 636 +G1 X 5.868 Y -40.412 Z 1.336 A -56.883 C -103.146 F 636 +G1 X 5.901 Y -40.609 Z 1.213 A -56.741 C -103.096 F 636 +G1 X 5.950 Y -40.794 Z 1.093 A -56.604 C -103.049 F 636 +G1 X 6.016 Y -40.967 Z 0.976 A -56.472 C -103.003 F 636 +G1 X 6.098 Y -41.128 Z 0.863 A -56.344 C -102.958 F 636 +G1 X 6.195 Y -41.277 Z 0.754 A -56.217 C -102.913 F 636 +G1 X 6.307 Y -41.413 Z 0.648 A -56.093 C -102.869 F 636 +G1 X 6.434 Y -41.538 Z 0.547 A -55.970 C -102.826 F 636 +G1 X 6.574 Y -41.650 Z 0.449 A -55.846 C -102.782 F 636 +G1 X 6.727 Y -41.750 Z 0.355 A -55.722 C -102.737 F 636 +G1 X 6.894 Y -41.838 Z 0.265 A -55.596 C -102.692 F 636 +G1 X 7.072 Y -41.914 Z 0.179 A -55.468 C -102.647 F 636 +G1 X 7.262 Y -41.977 Z 0.098 A -55.338 C -102.600 F 636 +G1 X 7.464 Y -42.027 Z 0.021 A -55.204 C -102.552 F 636 +G1 X 7.675 Y -42.066 Z -0.051 A -55.067 C -102.502 F 636 +G1 X 7.897 Y -42.092 Z -0.119 A -54.926 C -102.451 F 636 +G1 X 8.129 Y -42.105 Z -0.182 A -54.781 C -102.398 F 636 +G1 X 8.369 Y -42.106 Z -0.241 A -54.632 C -102.343 F 636 +G1 X 8.618 Y -42.094 Z -0.294 A -54.479 C -102.287 F 636 +G1 X 8.875 Y -42.070 Z -0.342 A -54.321 C -102.229 F 636 +G1 X 9.139 Y -42.033 Z -0.386 A -54.158 C -102.168 F 636 +G1 X 9.410 Y -41.984 Z -0.424 A -53.990 C -102.106 F 636 +G1 X 9.687 Y -41.922 Z -0.457 A -53.818 C -102.042 F 636 +G1 X 9.970 Y -41.847 Z -0.484 A -53.641 C -101.975 F 636 +G1 X 10.258 Y -41.759 Z -0.506 A -53.459 C -101.906 F 636 +G1 X 10.551 Y -41.659 Z -0.522 A -53.272 C -101.836 F 636 +G1 X 10.849 Y -41.545 Z -0.533 A -53.081 C -101.763 F 636 +G1 X 11.146 Y -41.423 Z -0.538 A -52.916 C -101.699 F 636 +G1 X 11.439 Y -41.294 Z -0.538 A -52.751 C -101.636 F 636 +G1 X 11.727 Y -41.159 Z -0.533 A -52.588 C -101.573 F 636 +G1 X 12.010 Y -41.019 Z -0.523 A -52.425 C -101.510 F 636 +G1 X 12.287 Y -40.873 Z -0.508 A -52.264 C -101.447 F 636 +G1 X 12.558 Y -40.721 Z -0.488 A -52.104 C -101.384 F 636 +G1 X 12.822 Y -40.564 Z -0.463 A -51.946 C -101.322 F 636 +G1 X 13.079 Y -40.401 Z -0.433 A -51.789 C -101.260 F 636 +G1 X 13.328 Y -40.233 Z -0.397 A -51.634 C -101.199 F 636 +G1 X 13.568 Y -40.060 Z -0.356 A -51.481 C -101.137 F 636 +G1 X 13.799 Y -39.882 Z -0.310 A -51.329 C -101.077 F 636 +G1 X 14.021 Y -39.699 Z -0.259 A -51.179 C -101.016 F 636 +G1 X 14.233 Y -39.511 Z -0.203 A -51.031 C -100.956 F 636 +G1 X 14.434 Y -39.318 Z -0.141 A -50.885 C -100.897 F 636 +G1 X 14.624 Y -39.121 Z -0.074 A -50.741 C -100.838 F 636 +G1 X 14.802 Y -38.919 Z -0.002 A -50.598 C -100.779 F 636 +G1 X 14.968 Y -38.712 Z 0.075 A -50.456 C -100.721 F 636 +G1 X 15.122 Y -38.502 Z 0.158 A -50.316 C -100.663 F 636 +G1 X 15.262 Y -38.287 Z 0.247 A -50.177 C -100.606 F 636 +G1 X 15.388 Y -38.067 Z 0.340 A -50.039 C -100.548 F 636 +G1 X 15.500 Y -37.844 Z 0.440 A -49.901 C -100.491 F 636 +G1 X 15.597 Y -37.617 Z 0.544 A -49.764 C -100.433 F 636 +G1 X 15.678 Y -37.386 Z 0.654 A -49.627 C -100.375 F 636 +G1 X 15.744 Y -37.151 Z 0.770 A -49.489 C -100.316 F 636 +G1 X 15.793 Y -36.913 Z 0.891 A -49.350 C -100.257 F 636 +G1 X 15.825 Y -36.671 Z 1.017 A -49.209 C -100.197 F 636 +G1 X 15.840 Y -36.425 Z 1.149 A -49.066 C -100.136 F 636 +G1 X 15.836 Y -36.177 Z 1.287 A -48.921 C -100.073 F 636 +G1 X 15.814 Y -35.925 Z 1.430 A -48.772 C -100.009 F 636 +G1 X 15.773 Y -35.670 Z 1.579 A -48.620 C -99.942 F 636 +G1 X 15.712 Y -35.412 Z 1.733 A -48.463 C -99.874 F 636 +G1 X 15.630 Y -35.151 Z 1.893 A -48.302 C -99.803 F 636 +G1 X 15.064 Y -33.529 Z 2.900 A -50.315 C -95.675 F 159 +G1 X 14.996 Y -33.323 Z 3.027 A -50.578 C -95.160 F 159 +G1 X 14.886 Y -32.899 Z 3.283 A -51.085 C -94.112 F 159 +G1 X 14.812 Y -32.459 Z 3.540 A -51.565 C -93.038 F 159 +G1 X 14.775 Y -32.002 Z 3.797 A -52.016 C -91.931 F 159 +G1 X 14.778 Y -31.531 Z 4.051 A -52.433 C -90.793 F 159 +G1 X 14.892 Y -30.199 Z 4.755 A -53.548 C -87.564 F 159 +G1 X 14.969 Y -29.350 Z 5.209 A -54.325 C -85.493 F 159 +G1 X 15.031 Y -28.626 Z 5.611 A -55.055 C -83.729 F 159 +G1 X 15.096 Y -27.901 Z 6.015 A -55.820 C -81.963 F 159 +G1 X 15.158 Y -27.181 Z 6.431 A -56.642 C -80.215 F 159 +G1 X 15.221 Y -26.460 Z 6.849 A -57.496 C -78.473 F 159 +G1 X 15.282 Y -25.743 Z 7.277 A -58.403 C -76.755 F 159 +G1 X 15.345 Y -25.026 Z 7.708 A -59.339 C -75.050 F 159 +G1 X 15.407 Y -24.290 Z 8.164 A -60.355 C -73.320 F 159 +G1 X 15.472 Y -23.554 Z 8.621 A -61.395 C -71.611 F 159 +G1 X 15.531 Y -22.846 Z 9.075 A -62.445 C -69.991 F 159 +G1 X 15.593 Y -22.139 Z 9.530 A -63.512 C -68.394 F 159 +G1 X 15.651 Y -21.437 Z 9.994 A -64.611 C -66.839 F 159 +G1 X 15.709 Y -20.745 Z 10.454 A -65.628 C -65.499 F 159 +G1 X 15.784 Y -19.512 Z 11.322 A -66.256 C -65.841 F 159 +G1 X 15.844 Y -18.288 Z 12.204 A -66.919 C -66.198 F 159 +G1 X 15.888 Y -17.072 Z 13.101 A -67.618 C -66.571 F 159 +G1 X 15.913 Y -15.850 Z 14.021 A -68.358 C -66.963 F 159 +G1 X 15.917 Y -14.660 Z 14.937 A -69.116 C -67.361 F 159 +G1 X 15.900 Y -13.504 Z 15.844 A -69.871 C -67.793 F 159 +G1 X 15.854 Y -12.345 Z 16.777 A -70.391 C -68.791 F 159 +G1 X 15.783 Y -11.205 Z 17.712 A -70.779 C -69.975 F 159 +G1 X 15.685 Y -10.080 Z 18.653 A -71.062 C -71.290 F 159 +G1 X 15.558 Y -8.968 Z 19.599 A -71.271 C -72.663 F 159 +G1 X 15.416 Y -7.973 Z 20.462 A -71.384 C -73.984 F 159 +G1 X 15.235 Y -6.929 Z 21.386 A -71.415 C -75.481 F 159 +G1 X 15.015 Y -5.865 Z 22.348 A -71.336 C -77.142 F 159 +G1 X 14.761 Y -4.824 Z 23.312 A -71.142 C -78.901 F 159 +G1 X 14.543 Y -4.042 Z 24.051 A -70.918 C -80.306 F 159 +G1 X 14.386 Y -3.542 Z 24.540 A -70.740 C -81.261 F 159 +G1 X 14.268 Y -3.225 Z 24.876 A -70.634 C -81.927 F 159 +G1 X 14.140 Y -2.924 Z 25.223 A -70.542 C -82.621 F 159 +G1 X 14.001 Y -2.639 Z 25.580 A -70.462 C -83.342 F 159 +G1 X 13.778 Y -2.241 Z 26.133 A -70.362 C -84.467 F 159 +G1 X 12.983 Y -1.169 Z 28.012 A -70.183 C -88.249 F 159 +G1 X 12.942 Y -1.121 Z 28.107 A -70.304 C -88.210 F 636 +G1 X 12.901 Y -1.087 Z 28.197 A -70.414 C -88.174 F 636 +G1 X 12.862 Y -1.067 Z 28.282 A -70.515 C -88.142 F 636 +G1 X 12.823 Y -1.061 Z 28.360 A -70.607 C -88.112 F 636 +G1 X 12.785 Y -1.067 Z 28.433 A -70.694 C -88.084 F 636 +G1 X 12.749 Y -1.087 Z 28.499 A -70.776 C -88.058 F 636 +G1 X 12.714 Y -1.118 Z 28.559 A -70.856 C -88.032 F 636 +G1 X 12.680 Y -1.161 Z 28.613 A -70.936 C -88.006 F 636 +G1 X 12.649 Y -1.214 Z 28.659 A -71.019 C -87.980 F 636 +G1 X 12.619 Y -1.278 Z 28.699 A -71.104 C -87.953 F 636 +G1 X 12.591 Y -1.353 Z 28.732 A -71.194 C -87.924 F 636 +G1 X 12.566 Y -1.436 Z 28.758 A -71.290 C -87.893 F 636 +G1 X 12.543 Y -1.528 Z 28.777 A -71.393 C -87.860 F 636 +G1 X 12.522 Y -1.629 Z 28.787 A -71.502 C -87.826 F 636 +G1 X 12.504 Y -1.738 Z 28.791 A -71.618 C -87.789 F 636 +G1 X 12.488 Y -1.854 Z 28.786 A -71.741 C -87.749 F 636 +G1 X 12.467 Y -2.087 Z 28.758 A -71.955 C -87.682 F 636 +G1 X 12.462 Y -2.199 Z 28.735 A -72.058 C -87.649 F 636 +G1 X 12.460 Y -2.307 Z 28.706 A -72.159 C -87.617 F 636 +G1 X 12.462 Y -2.410 Z 28.671 A -72.258 C -87.586 F 636 +G1 X 12.468 Y -2.508 Z 28.630 A -72.354 C -87.556 F 636 +G1 X 12.478 Y -2.600 Z 28.583 A -72.448 C -87.526 F 636 +G1 X 12.492 Y -2.686 Z 28.530 A -72.541 C -87.497 F 636 +G1 X 12.510 Y -2.765 Z 28.471 A -72.632 C -87.468 F 636 +G1 X 12.532 Y -2.837 Z 28.405 A -72.722 C -87.440 F 636 +G1 X 12.559 Y -2.901 Z 28.333 A -72.812 C -87.411 F 636 +G1 X 12.590 Y -2.956 Z 28.254 A -72.904 C -87.383 F 636 +G1 X 12.626 Y -3.002 Z 28.170 A -72.997 C -87.353 F 636 +G1 X 12.666 Y -3.039 Z 28.078 A -73.094 C -87.323 F 636 +G1 X 12.711 Y -3.066 Z 27.980 A -73.194 C -87.292 F 636 +G1 X 12.761 Y -3.082 Z 27.875 A -73.300 C -87.259 F 636 +G1 X 13.564 Y -3.242 Z 26.218 A -72.073 C -84.230 F 159 +G1 X 13.680 Y -3.271 Z 25.979 A -71.881 C -83.802 F 159 +G1 X 13.787 Y -3.327 Z 25.747 A -71.735 C -83.381 F 159 +G1 X 13.885 Y -3.410 Z 25.526 A -71.634 C -82.971 F 159 +G1 X 13.972 Y -3.517 Z 25.317 A -71.579 C -82.578 F 159 +G1 X 14.041 Y -3.633 Z 25.140 A -71.566 C -82.239 F 159 +G1 X 14.099 Y -3.764 Z 24.976 A -71.587 C -81.918 F 159 +G1 X 14.167 Y -3.989 Z 24.753 A -71.678 C -81.474 F 159 +G1 X 14.184 Y -4.070 Z 24.685 A -71.725 C -81.336 F 159 +G1 X 14.283 Y -4.752 Z 24.177 A -72.152 C -80.297 F 159 +G1 X 14.368 Y -5.515 Z 23.617 A -72.581 C -79.185 F 159 +G1 X 14.428 Y -6.284 Z 23.057 A -72.966 C -78.106 F 159 +G1 X 14.463 Y -7.059 Z 22.499 A -73.302 C -77.074 F 159 +G1 X 14.474 Y -7.838 Z 21.942 A -73.588 C -76.093 F 159 +G1 X 14.461 Y -8.622 Z 21.386 A -73.829 C -75.159 F 159 +G1 X 14.424 Y -9.410 Z 20.831 A -74.029 C -74.268 F 159 +G1 X 14.367 Y -10.177 Z 20.293 A -74.187 C -73.439 F 159 +G1 X 14.287 Y -10.955 Z 19.751 A -74.313 C -72.638 F 159 +G1 X 14.184 Y -11.747 Z 19.202 A -74.415 C -71.845 F 159 +G1 X 14.059 Y -12.542 Z 18.654 A -74.467 C -71.121 F 159 +G1 X 13.880 Y -13.503 Z 17.993 A -74.490 C -70.291 F 159 +G1 X 13.706 Y -14.316 Z 17.442 A -74.310 C -70.010 F 159 +G1 X 13.404 Y -15.541 Z 16.618 A -73.959 C -69.835 F 159 +G1 X 13.059 Y -16.762 Z 15.803 A -73.645 C -69.678 F 159 +G1 X 12.673 Y -17.975 Z 15.000 A -73.369 C -69.540 F 159 +G1 X 12.247 Y -19.182 Z 14.208 A -73.131 C -69.421 F 159 +G1 X 11.765 Y -20.427 Z 13.397 A -72.921 C -69.316 F 159 +G1 X 11.250 Y -21.694 Z 12.591 A -72.031 C -70.749 F 159 +G1 X 10.972 Y -22.357 Z 12.178 A -71.279 C -72.173 F 159 +G1 X 10.696 Y -23.021 Z 11.765 A -70.545 C -73.590 F 159 +G1 X 10.119 Y -24.337 Z 10.956 A -69.169 C -76.390 F 159 +G1 X 9.617 Y -25.435 Z 10.288 A -68.103 C -78.699 F 159 +G1 X 9.033 Y -26.661 Z 9.550 A -67.007 C -81.232 F 159 +G1 X 8.396 Y -27.942 Z 8.788 A -65.970 C -83.814 F 159 +G1 X 7.668 Y -29.340 Z 7.968 A -64.967 C -86.540 F 159 +G1 X 6.988 Y -30.592 Z 7.245 A -64.181 C -88.888 F 159 +G1 X 6.287 Y -31.829 Z 6.540 A -63.504 C -91.115 F 159 +G1 X 5.567 Y -33.053 Z 5.854 A -62.929 C -93.218 F 159 +G1 X 4.828 Y -34.266 Z 5.185 A -62.447 C -95.201 F 159 +G1 X 4.070 Y -35.467 Z 4.536 A -62.049 C -97.064 F 159 +G1 X 3.295 Y -36.657 Z 3.905 A -61.729 C -98.812 F 159 +G1 X 2.625 Y -37.658 Z 3.385 A -61.511 C -100.206 F 159 +G1 X 1.457 Y -39.591 Z 2.363 A -61.061 C -102.766 F 159 +G1 X 1.331 Y -39.807 Z 2.248 A -60.899 C -102.719 F 636 +G1 X 1.218 Y -40.019 Z 2.133 A -60.743 C -102.674 F 636 +G1 X 1.116 Y -40.228 Z 2.018 A -60.591 C -102.630 F 636 +G1 X 1.025 Y -40.432 Z 1.904 A -60.444 C -102.587 F 636 +G1 X 0.946 Y -40.632 Z 1.790 A -60.301 C -102.545 F 636 +G1 X 0.879 Y -40.828 Z 1.676 A -60.162 C -102.504 F 636 +G1 X 0.822 Y -41.020 Z 1.563 A -60.027 C -102.464 F 636 +G1 X 0.776 Y -41.208 Z 1.451 A -59.896 C -102.426 F 636 +G1 X 0.741 Y -41.392 Z 1.339 A -59.768 C -102.388 F 636 +G1 X 0.716 Y -41.571 Z 1.227 A -59.644 C -102.351 F 636 +G1 X 0.702 Y -41.747 Z 1.116 A -59.522 C -102.315 F 636 +G1 X 0.698 Y -41.918 Z 1.006 A -59.402 C -102.279 F 636 +G1 X 0.703 Y -42.084 Z 0.897 A -59.286 C -102.244 F 636 +G1 X 0.719 Y -42.247 Z 0.788 A -59.171 C -102.209 F 636 +G1 X 0.744 Y -42.405 Z 0.681 A -59.058 C -102.175 F 636 +G1 X 0.778 Y -42.559 Z 0.574 A -58.946 C -102.142 F 636 +G1 X 0.821 Y -42.708 Z 0.468 A -58.836 C -102.108 F 636 +G1 X 0.874 Y -42.853 Z 0.363 A -58.726 C -102.075 F 636 +G1 X 0.935 Y -42.994 Z 0.259 A -58.618 C -102.042 F 636 +G1 X 1.005 Y -43.130 Z 0.156 A -58.510 C -102.010 F 636 +G1 X 1.083 Y -43.261 Z 0.054 A -58.402 C -101.977 F 636 +G1 X 1.169 Y -43.388 Z -0.046 A -58.295 C -101.944 F 636 +G1 X 1.264 Y -43.510 Z -0.146 A -58.187 C -101.911 F 636 +G1 X 1.366 Y -43.628 Z -0.244 A -58.079 C -101.878 F 636 +G1 X 1.476 Y -43.741 Z -0.341 A -57.971 C -101.844 F 636 +G1 X 1.594 Y -43.850 Z -0.436 A -57.862 C -101.811 F 636 +G1 X 1.719 Y -43.953 Z -0.531 A -57.752 C -101.777 F 636 +G1 X 1.851 Y -44.052 Z -0.623 A -57.641 C -101.742 F 636 +G1 X 1.989 Y -44.147 Z -0.715 A -57.529 C -101.707 F 636 +G1 X 2.135 Y -44.236 Z -0.805 A -57.416 C -101.672 F 636 +G1 X 2.287 Y -44.321 Z -0.893 A -57.302 C -101.636 F 636 +G1 X 2.446 Y -44.401 Z -0.980 A -57.186 C -101.600 F 636 +G1 X 2.610 Y -44.476 Z -1.065 A -57.069 C -101.563 F 636 +G1 X 2.781 Y -44.546 Z -1.148 A -56.951 C -101.526 F 636 +G1 X 3.140 Y -44.671 Z -1.309 A -56.709 C -101.450 F 636 +G1 X 3.520 Y -44.776 Z -1.463 A -56.462 C -101.371 F 636 +G1 X 3.920 Y -44.861 Z -1.610 A -56.207 C -101.289 F 636 +G1 X 4.340 Y -44.926 Z -1.748 A -55.946 C -101.205 F 636 +G1 X 4.776 Y -44.970 Z -1.878 A -55.679 C -101.118 F 636 +G1 X 5.228 Y -44.993 Z -1.999 A -55.405 C -101.029 F 636 +G1 X 5.694 Y -44.995 Z -2.111 A -55.125 C -100.937 F 636 +G1 X 6.173 Y -44.976 Z -2.213 A -54.838 C -100.842 F 636 +G1 X 6.664 Y -44.935 Z -2.306 A -54.546 C -100.744 F 636 +G1 X 7.164 Y -44.872 Z -2.388 A -54.248 C -100.644 F 636 +G1 X 7.672 Y -44.787 Z -2.460 A -53.944 C -100.541 F 636 +G1 X 8.187 Y -44.680 Z -2.521 A -53.635 C -100.435 F 636 +G1 X 8.707 Y -44.550 Z -2.570 A -53.321 C -100.327 F 636 +G1 X 9.231 Y -44.397 Z -2.608 A -53.002 C -100.216 F 636 +G1 X 9.757 Y -44.221 Z -2.634 A -52.678 C -100.103 F 636 +G1 X 10.284 Y -44.027 Z -2.649 A -52.394 C -100.002 F 636 +G1 X 10.808 Y -43.821 Z -2.653 A -52.107 C -99.900 F 636 +G1 X 11.330 Y -43.601 Z -2.648 A -51.820 C -99.797 F 636 +G1 X 11.847 Y -43.370 Z -2.633 A -51.533 C -99.693 F 636 +G1 X 12.358 Y -43.127 Z -2.607 A -51.246 C -99.588 F 636 +G1 X 12.861 Y -42.873 Z -2.572 A -50.960 C -99.483 F 636 +G1 X 13.355 Y -42.608 Z -2.527 A -50.675 C -99.377 F 636 +G1 X 13.839 Y -42.332 Z -2.473 A -50.392 C -99.271 F 636 +G1 X 14.310 Y -42.046 Z -2.408 A -50.111 C -99.165 F 636 +G1 X 14.767 Y -41.751 Z -2.333 A -49.833 C -99.059 F 636 +G1 X 15.210 Y -41.446 Z -2.249 A -49.558 C -98.953 F 636 +G1 X 15.635 Y -41.133 Z -2.155 A -49.287 C -98.848 F 636 +G1 X 16.043 Y -40.810 Z -2.052 A -49.019 C -98.743 F 636 +G1 X 16.430 Y -40.480 Z -1.938 A -48.756 C -98.639 F 636 +G1 X 16.797 Y -40.142 Z -1.815 A -48.496 C -98.536 F 636 +G1 X 17.140 Y -39.797 Z -1.682 A -48.241 C -98.434 F 636 +G1 X 17.460 Y -39.445 Z -1.540 A -47.991 C -98.333 F 636 +G1 X 17.753 Y -39.086 Z -1.388 A -47.745 C -98.233 F 636 +G1 X 18.020 Y -38.721 Z -1.226 A -47.503 C -98.133 F 636 +G1 X 18.142 Y -38.536 Z -1.142 A -47.383 C -98.084 F 636 +G1 X 18.257 Y -38.350 Z -1.055 A -47.265 C -98.035 F 636 +G1 X 18.365 Y -38.163 Z -0.966 A -47.147 C -97.986 F 636 +G1 X 18.464 Y -37.974 Z -0.875 A -47.030 C -97.937 F 636 +G1 X 18.556 Y -37.784 Z -0.781 A -46.913 C -97.888 F 636 +G1 X 18.640 Y -37.593 Z -0.684 A -46.798 C -97.839 F 636 +G1 X 18.715 Y -37.401 Z -0.586 A -46.682 C -97.790 F 636 +G1 X 18.782 Y -37.207 Z -0.485 A -46.567 C -97.742 F 636 +G1 X 18.840 Y -37.013 Z -0.381 A -46.453 C -97.693 F 636 +G1 X 18.890 Y -36.817 Z -0.276 A -46.338 C -97.644 F 636 +G1 X 18.930 Y -36.621 Z -0.168 A -46.224 C -97.594 F 636 +G1 X 18.961 Y -36.424 Z -0.057 A -46.109 C -97.545 F 636 +G1 X 18.982 Y -36.226 Z 0.056 A -45.994 C -97.495 F 636 +G1 X 18.994 Y -36.027 Z 0.171 A -45.878 C -97.445 F 636 +G1 X 18.996 Y -35.827 Z 0.288 A -45.761 C -97.393 F 636 +G1 X 18.988 Y -35.627 Z 0.408 A -45.644 C -97.342 F 636 +G1 X 18.970 Y -35.426 Z 0.530 A -45.525 C -97.290 F 636 +G1 X 18.941 Y -35.224 Z 0.655 A -45.405 C -97.237 F 636 +G1 X 18.902 Y -35.022 Z 0.782 A -45.284 C -97.183 F 636 +G1 X 18.852 Y -34.820 Z 0.911 A -45.161 C -97.128 F 636 +G1 X 18.791 Y -34.617 Z 1.043 A -45.035 C -97.071 F 636 +G1 X 18.719 Y -34.413 Z 1.176 A -44.908 C -97.014 F 636 +G1 X 18.635 Y -34.209 Z 1.313 A -44.778 C -96.955 F 636 +G1 X 18.540 Y -34.005 Z 1.451 A -44.645 C -96.895 F 636 +G1 X 18.433 Y -33.801 Z 1.592 A -44.509 C -96.833 F 636 +G1 X 18.315 Y -33.596 Z 1.735 A -44.371 C -96.769 F 636 +G1 X 17.417 Y -32.122 Z 2.774 A -47.126 C -92.499 F 159 +G1 X 17.315 Y -31.952 Z 2.895 A -47.454 C -92.027 F 159 +G1 X 17.191 Y -31.678 Z 3.076 A -47.910 C -91.279 F 159 +G1 X 17.104 Y -31.383 Z 3.255 A -48.321 C -90.482 F 159 +G1 X 17.058 Y -31.065 Z 3.433 A -48.684 C -89.632 F 159 +G1 X 17.036 Y -29.881 Z 4.058 A -49.856 C -86.472 F 159 +G1 X 17.025 Y -29.031 Z 4.511 A -50.764 C -84.218 F 159 +G1 X 17.015 Y -28.299 Z 4.919 A -51.623 C -82.295 F 159 +G1 X 17.006 Y -27.566 Z 5.329 A -52.522 C -80.387 F 159 +G1 X 16.997 Y -26.839 Z 5.752 A -53.481 C -78.518 F 159 +G1 X 16.990 Y -26.112 Z 6.177 A -54.475 C -76.672 F 159 +G1 X 16.983 Y -25.391 Z 6.614 A -55.523 C -74.870 F 159 +G1 X 16.977 Y -24.670 Z 7.053 A -56.599 C -73.098 F 159 +G1 X 16.971 Y -23.883 Z 7.550 A -57.837 C -71.205 F 159 +G1 X 16.968 Y -23.097 Z 8.049 A -59.100 C -69.353 F 159 +G1 X 16.963 Y -22.319 Z 8.561 A -60.408 C -67.565 F 159 +G1 X 16.961 Y -21.542 Z 9.074 A -61.731 C -65.822 F 159 +G1 X 16.942 Y -20.218 Z 9.993 A -63.458 C -64.294 F 159 +G1 X 16.897 Y -18.996 Z 10.886 A -64.269 C -64.749 F 159 +G1 X 16.843 Y -17.785 Z 11.793 A -65.108 C -65.213 F 159 +G1 X 16.777 Y -16.585 Z 12.716 A -65.974 C -65.687 F 159 +G1 X 16.678 Y -15.122 Z 13.872 A -67.078 C -66.282 F 159 +G1 X 16.592 Y -14.068 Z 14.725 A -67.904 C -66.723 F 159 +G1 X 16.480 Y -12.907 Z 15.687 A -68.762 C -67.396 F 159 +G1 X 16.345 Y -11.780 Z 16.647 A -69.338 C -68.596 F 159 +G1 X 16.192 Y -10.669 Z 17.612 A -69.829 C -69.869 F 159 +G1 X 16.017 Y -9.572 Z 18.585 A -70.233 C -71.223 F 159 +G1 X 15.819 Y -8.492 Z 19.563 A -70.546 C -72.657 F 159 +G1 X 15.632 Y -7.591 Z 20.396 A -70.737 C -73.941 F 159 +G1 X 15.471 Y -6.891 Z 21.055 A -70.835 C -75.000 F 159 +G1 X 15.207 Y -5.858 Z 22.047 A -70.885 C -76.683 F 159 +G1 X 14.914 Y -4.848 Z 23.041 A -70.814 C -78.467 F 159 +G1 X 14.662 Y -4.063 Z 23.833 A -70.677 C -79.943 F 159 +G1 X 14.342 Y -3.163 Z 24.763 A -70.411 C -81.755 F 159 +G1 X 14.095 Y -2.531 Z 25.433 A -70.140 C -83.122 F 159 +G1 X 13.835 Y -1.912 Z 26.106 A -69.806 C -84.530 F 159 +G1 X 13.118 Y -0.639 Z 27.850 A -69.177 C -88.099 F 159 +G1 X 9.867 Y 8.717 Z 27.743 A -71.841 C -138.790 F 636 +G1 X 10.691 Y 8.962 Z 26.178 A -71.266 C -135.779 F 159 +G1 X 10.878 Y 8.993 Z 25.858 A -71.158 C -135.164 F 159 +G1 X 11.080 Y 8.998 Z 25.552 A -71.093 C -134.575 F 159 +G1 X 11.295 Y 8.977 Z 25.262 A -71.073 C -134.011 F 159 +G1 X 11.523 Y 8.928 Z 24.986 A -71.096 C -133.474 F 159 +G1 X 11.759 Y 8.853 Z 24.729 A -71.164 C -132.967 F 159 +G1 X 11.956 Y 8.772 Z 24.534 A -71.252 C -132.578 F 159 +G1 X 12.548 Y 8.482 Z 23.987 A -71.566 C -131.492 F 159 +G1 X 13.436 Y 8.007 Z 23.162 A -71.965 C -129.912 F 159 +G1 X 14.080 Y 7.635 Z 22.558 A -72.202 C -128.795 F 159 +G1 X 14.717 Y 7.242 Z 21.956 A -72.387 C -127.730 F 159 +G1 X 15.347 Y 6.831 Z 21.354 A -72.522 C -126.715 F 159 +G1 X 16.250 Y 6.201 Z 20.484 A -72.638 C -125.323 F 159 +G1 X 17.085 Y 5.575 Z 19.669 A -72.669 C -124.093 F 159 +G1 X 17.986 Y 4.852 Z 18.778 A -72.625 C -122.824 F 159 +G1 X 18.872 Y 4.093 Z 17.890 A -72.500 C -121.640 F 159 +G1 X 19.453 Y 3.569 Z 17.302 A -72.381 C -120.884 F 159 +G1 X 20.343 Y 2.724 Z 16.396 A -71.935 C -120.244 F 159 +G1 X 21.206 Y 1.856 Z 15.512 A -71.371 C -119.957 F 159 +G1 X 22.052 Y 0.960 Z 14.638 A -70.844 C -119.688 F 159 +G1 X 22.861 Y 0.062 Z 13.797 A -70.367 C -119.443 F 159 +G1 X 23.669 Y -0.875 Z 12.954 A -69.921 C -119.212 F 159 +G1 X 24.468 Y -1.839 Z 12.117 A -69.512 C -119.000 F 159 +G1 X 25.302 Y -2.884 Z 11.258 A -68.408 C -120.345 F 159 +G1 X 25.741 Y -3.445 Z 10.817 A -67.494 C -121.863 F 159 +G1 X 26.181 Y -4.004 Z 10.377 A -66.596 C -123.388 F 159 +G1 X 26.618 Y -4.571 Z 9.946 A -65.737 C -124.928 F 159 +G1 X 27.056 Y -5.136 Z 9.515 A -64.898 C -126.471 F 159 +G1 X 27.489 Y -5.708 Z 9.094 A -64.103 C -128.020 F 159 +G1 X 27.923 Y -6.277 Z 8.674 A -63.332 C -129.565 F 159 +G1 X 28.369 Y -6.876 Z 8.248 A -62.581 C -131.172 F 159 +G1 X 28.816 Y -7.472 Z 7.823 A -61.858 C -132.769 F 159 +G1 X 29.667 Y -8.632 Z 7.027 A -60.593 C -135.819 F 159 +G1 X 30.526 Y -9.823 Z 6.238 A -59.462 C -138.872 F 159 +G1 X 31.359 Y -10.999 Z 5.489 A -58.507 C -141.790 F 159 +G1 X 31.911 Y -11.784 Z 5.002 A -57.948 C -143.682 F 159 +G1 X 32.481 Y -12.542 Z 4.516 A -57.404 C -145.535 F 159 +G1 X 33.079 Y -13.275 Z 4.026 A -56.865 C -147.367 F 159 +G1 X 33.596 Y -13.868 Z 3.618 A -56.426 C -148.880 F 159 +G1 X 34.236 Y -14.556 Z 3.134 A -55.918 C -150.671 F 159 +G1 X 35.847 Y -16.155 Z 1.937 A -54.730 C -154.914 F 159 +G1 X 35.985 Y -16.281 Z 1.837 A -54.607 C -154.837 F 636 +G1 X 36.119 Y -16.382 Z 1.743 A -54.496 C -154.766 F 636 +G1 X 36.248 Y -16.458 Z 1.655 A -54.395 C -154.702 F 636 +G1 X 36.373 Y -16.510 Z 1.574 A -54.304 C -154.644 F 636 +G1 X 36.493 Y -16.538 Z 1.500 A -54.220 C -154.591 F 636 +G1 X 36.608 Y -16.542 Z 1.432 A -54.143 C -154.542 F 636 +G1 X 36.717 Y -16.523 Z 1.371 A -54.070 C -154.495 F 636 +G1 X 36.820 Y -16.482 Z 1.317 A -53.998 C -154.449 F 636 +G1 X 36.917 Y -16.418 Z 1.270 A -53.926 C -154.403 F 636 +G1 X 37.008 Y -16.332 Z 1.230 A -53.850 C -154.354 F 636 +G1 X 37.092 Y -16.225 Z 1.198 A -53.769 C -154.302 F 636 +G1 X 37.169 Y -16.096 Z 1.172 A -53.681 C -154.245 F 636 +G1 X 37.238 Y -15.947 Z 1.154 A -53.585 C -154.183 F 636 +G1 X 37.300 Y -15.777 Z 1.143 A -53.480 C -154.115 F 636 +G1 X 37.353 Y -15.588 Z 1.139 A -53.366 C -154.041 F 636 +G1 X 37.399 Y -15.379 Z 1.143 A -53.243 C -153.960 F 636 +G1 X 37.435 Y -15.162 Z 1.153 A -53.142 C -153.894 F 636 +G1 X 37.459 Y -14.949 Z 1.170 A -53.043 C -153.829 F 636 +G1 X 37.473 Y -14.741 Z 1.192 A -52.947 C -153.765 F 636 +G1 X 37.475 Y -14.538 Z 1.221 A -52.853 C -153.703 F 636 +G1 X 37.465 Y -14.341 Z 1.256 A -52.761 C -153.642 F 636 +G1 X 37.444 Y -14.150 Z 1.297 A -52.671 C -153.582 F 636 +G1 X 37.410 Y -13.965 Z 1.344 A -52.582 C -153.522 F 636 +G1 X 37.363 Y -13.786 Z 1.398 A -52.494 C -153.463 F 636 +G1 X 37.304 Y -13.615 Z 1.457 A -52.407 C -153.405 F 636 +G1 X 37.231 Y -13.452 Z 1.524 A -52.319 C -153.346 F 636 +G1 X 37.145 Y -13.297 Z 1.596 A -52.231 C -153.287 F 636 +G1 X 37.045 Y -13.150 Z 1.676 A -52.142 C -153.227 F 636 +G1 X 36.932 Y -13.012 Z 1.761 A -52.052 C -153.165 F 636 +G1 X 36.804 Y -12.883 Z 1.853 A -51.959 C -153.102 F 636 +G1 X 36.662 Y -12.764 Z 1.952 A -51.863 C -153.036 F 636 +G1 X 36.505 Y -12.656 Z 2.058 A -51.763 C -152.968 F 636 +G1 X 35.057 Y -11.746 Z 3.017 A -53.155 C -149.218 F 159 +G1 X 34.631 Y -11.459 Z 3.301 A -53.584 C -148.089 F 159 +G1 X 34.214 Y -11.149 Z 3.589 A -54.009 C -146.947 F 159 +G1 X 33.852 Y -10.853 Z 3.846 A -54.380 C -145.921 F 159 +G1 X 33.498 Y -10.536 Z 4.104 A -54.744 C -144.878 F 159 +G1 X 33.004 Y -10.041 Z 4.476 A -55.254 C -143.346 F 159 +G1 X 32.211 Y -9.134 Z 5.099 A -56.092 C -140.703 F 159 +G1 X 31.262 Y -8.040 Z 5.868 A -57.235 C -137.473 F 159 +G1 X 30.785 Y -7.498 Z 6.265 A -57.877 C -135.846 F 159 +G1 X 30.309 Y -6.953 Z 6.663 A -58.550 C -134.207 F 159 +G1 X 29.831 Y -6.414 Z 7.073 A -59.277 C -132.570 F 159 +G1 X 29.353 Y -5.872 Z 7.484 A -60.034 C -130.927 F 159 +G1 X 28.909 Y -5.375 Z 7.876 A -60.782 C -129.411 F 159 +G1 X 28.465 Y -4.876 Z 8.268 A -61.554 C -127.896 F 159 +G1 X 28.020 Y -4.381 Z 8.669 A -62.366 C -126.394 F 159 +G1 X 27.577 Y -3.886 Z 9.072 A -63.200 C -124.898 F 159 +G1 X 27.098 Y -3.358 Z 9.514 A -64.138 C -123.308 F 159 +G1 X 26.620 Y -2.828 Z 9.958 A -65.096 C -121.729 F 159 +G1 X 26.142 Y -2.305 Z 10.410 A -66.091 C -120.178 F 159 +G1 X 25.666 Y -1.780 Z 10.864 A -67.099 C -118.644 F 159 +G1 X 24.790 Y -0.844 Z 11.727 A -67.941 C -118.174 F 159 +G1 X 23.928 Y 0.046 Z 12.587 A -68.469 C -118.453 F 159 +G1 X 23.058 Y 0.916 Z 13.460 A -69.036 C -118.750 F 159 +G1 X 22.155 Y 1.785 Z 14.369 A -69.656 C -119.074 F 159 +G1 X 21.261 Y 2.610 Z 15.269 A -70.298 C -119.406 F 159 +G1 X 20.454 Y 3.326 Z 16.081 A -70.898 C -119.721 F 159 +G1 X 19.648 Y 4.007 Z 16.893 A -71.355 C -120.375 F 159 +G1 X 18.745 Y 4.730 Z 17.800 A -71.634 C -121.539 F 159 +G1 X 17.828 Y 5.424 Z 18.715 A -71.841 C -122.775 F 159 +G1 X 16.902 Y 6.083 Z 19.633 A -71.964 C -124.095 F 159 +G1 X 16.080 Y 6.632 Z 20.443 A -72.003 C -125.323 F 159 +G1 X 15.130 Y 7.223 Z 21.371 A -71.958 C -126.816 F 159 +G1 X 14.171 Y 7.774 Z 22.302 A -71.807 C -128.414 F 159 +G1 X 13.526 Y 8.117 Z 22.925 A -71.639 C -129.545 F 159 +G1 X 12.876 Y 8.442 Z 23.549 A -71.425 C -130.713 F 159 +G1 X 12.001 Y 8.845 Z 24.385 A -71.059 C -132.335 F 159 +G1 X 11.715 Y 8.958 Z 24.670 A -70.942 C -132.900 F 159 +G1 X 11.398 Y 9.056 Z 25.013 A -70.850 C -133.577 F 159 +G1 X 11.093 Y 9.121 Z 25.376 A -70.803 C -134.294 F 159 +G1 X 10.802 Y 9.155 Z 25.758 A -70.799 C -135.048 F 159 +G1 X 10.527 Y 9.160 Z 26.157 A -70.837 C -135.837 F 159 +G1 X 9.311 Y 9.017 Z 28.149 A -71.108 C -139.774 F 159 +G1 X 9.252 Y 9.003 Z 28.255 A -71.228 C -139.691 F 636 +G1 X 9.218 Y 8.976 Z 28.343 A -71.325 C -139.625 F 636 +G1 X 9.206 Y 8.939 Z 28.411 A -71.403 C -139.571 F 636 +G1 X 9.209 Y 8.917 Z 28.438 A -71.438 C -139.547 F 636 +G1 X 9.217 Y 8.892 Z 28.461 A -71.472 C -139.524 F 636 +G1 X 9.249 Y 8.835 Z 28.490 A -71.542 C -139.476 F 636 +G1 X 9.302 Y 8.771 Z 28.500 A -71.625 C -139.419 F 636 +G1 X 9.374 Y 8.700 Z 28.490 A -71.726 C -139.350 F 636 +G1 X 9.466 Y 8.623 Z 28.459 A -71.849 C -139.266 F 636 +G1 X 9.566 Y 8.548 Z 28.413 A -71.947 C -139.199 F 636 +G1 X 9.662 Y 8.484 Z 28.358 A -72.042 C -139.134 F 636 +G1 X 9.754 Y 8.432 Z 28.293 A -72.134 C -139.072 F 636 +G1 X 9.841 Y 8.392 Z 28.219 A -72.224 C -139.011 F 636 +G1 X 9.922 Y 8.366 Z 28.134 A -72.312 C -138.951 F 636 +G1 X 9.996 Y 8.355 Z 28.040 A -72.402 C -138.890 F 636 +G1 X 10.063 Y 8.359 Z 27.935 A -72.494 C -138.828 F 636 +G1 X 10.121 Y 8.380 Z 27.820 A -72.591 C -138.762 F 636 +G1 X 10.844 Y 8.773 Z 26.198 A -71.673 C -135.720 F 159 +G1 X 10.953 Y 8.820 Z 25.971 A -71.541 C -135.298 F 159 +G1 X 11.073 Y 8.850 Z 25.751 A -71.439 C -134.888 F 159 +G1 X 11.271 Y 8.863 Z 25.439 A -71.345 C -134.296 F 159 +G1 X 11.488 Y 8.838 Z 25.146 A -71.320 C -133.733 F 159 +G1 X 11.720 Y 8.776 Z 24.877 A -71.361 C -133.208 F 159 +G1 X 11.961 Y 8.678 Z 24.635 A -71.467 C -132.724 F 159 +G1 X 12.516 Y 8.384 Z 24.140 A -71.812 C -131.727 F 159 +G1 X 13.352 Y 7.901 Z 23.390 A -72.274 C -130.264 F 159 +G1 X 13.993 Y 7.500 Z 22.807 A -72.583 C -129.165 F 159 +G1 X 14.626 Y 7.078 Z 22.224 A -72.840 C -128.114 F 159 +G1 X 15.250 Y 6.635 Z 21.643 A -73.047 C -127.114 F 159 +G1 X 15.865 Y 6.172 Z 21.063 A -73.208 C -126.161 F 159 +G1 X 16.470 Y 5.691 Z 20.484 A -73.327 C -125.250 F 159 +G1 X 17.271 Y 5.014 Z 19.707 A -73.428 C -124.085 F 159 +G1 X 18.141 Y 4.225 Z 18.846 A -73.476 C -122.845 F 159 +G1 X 18.991 Y 3.396 Z 17.988 A -73.424 C -121.736 F 159 +G1 X 19.775 Y 2.581 Z 17.182 A -73.237 C -120.925 F 159 +G1 X 20.604 Y 1.662 Z 16.321 A -72.769 C -120.667 F 159 +G1 X 21.410 Y 0.711 Z 15.468 A -72.330 C -120.445 F 159 +G1 X 22.192 Y -0.264 Z 14.628 A -71.930 C -120.243 F 159 +G1 X 22.802 Y -1.063 Z 13.965 A -71.638 C -120.095 F 159 +G1 X 23.397 Y -1.879 Z 13.308 A -71.373 C -119.960 F 159 +G1 X 24.124 Y -2.919 Z 12.499 A -71.076 C -119.808 F 159 +G1 X 24.907 Y -4.070 Z 11.647 A -69.689 C -122.051 F 159 +G1 X 25.303 Y -4.667 Z 11.219 A -68.867 C -123.533 F 159 +G1 X 25.701 Y -5.262 Z 10.793 A -68.063 C -125.014 F 159 +G1 X 26.090 Y -5.865 Z 10.375 A -67.299 C -126.495 F 159 +G1 X 26.481 Y -6.465 Z 9.958 A -66.555 C -127.969 F 159 +G1 X 26.863 Y -7.073 Z 9.550 A -65.855 C -129.438 F 159 +G1 X 27.246 Y -7.678 Z 9.142 A -65.177 C -130.895 F 159 +G1 X 27.968 Y -8.854 Z 8.377 A -63.981 C -133.659 F 159 +G1 X 28.563 Y -9.846 Z 7.749 A -63.077 C -135.928 F 159 +G1 X 28.978 Y -10.561 Z 7.312 A -62.494 C -137.516 F 159 +G1 X 29.394 Y -11.274 Z 6.876 A -61.941 C -139.072 F 159 +G1 X 30.097 Y -12.521 Z 6.142 A -61.101 C -141.693 F 159 +G1 X 30.674 Y -13.565 Z 5.550 A -60.502 C -143.793 F 159 +G1 X 31.247 Y -14.603 Z 4.960 A -59.956 C -145.816 F 159 +G1 X 32.190 Y -16.248 Z 4.036 A -59.193 C -148.927 F 159 +G1 X 33.023 Y -17.667 Z 3.254 A -58.640 C -151.502 F 159 +G1 X 34.255 Y -19.564 Z 2.140 A -57.888 C -154.920 F 159 +G1 X 34.415 Y -19.794 Z 1.999 A -57.699 C -154.856 F 636 +G1 X 34.577 Y -20.002 Z 1.860 A -57.519 C -154.795 F 636 +G1 X 34.743 Y -20.186 Z 1.725 A -57.348 C -154.736 F 636 +G1 X 34.911 Y -20.349 Z 1.592 A -57.185 C -154.680 F 636 +G1 X 35.082 Y -20.489 Z 1.463 A -57.030 C -154.627 F 636 +G1 X 35.255 Y -20.608 Z 1.336 A -56.883 C -154.576 F 636 +G1 X 35.429 Y -20.705 Z 1.213 A -56.741 C -154.526 F 636 +G1 X 35.604 Y -20.782 Z 1.093 A -56.604 C -154.479 F 636 +G1 X 35.781 Y -20.838 Z 0.976 A -56.472 C -154.433 F 636 +G1 X 35.957 Y -20.875 Z 0.863 A -56.344 C -154.388 F 636 +G1 X 36.134 Y -20.891 Z 0.754 A -56.218 C -154.343 F 636 +G1 X 36.311 Y -20.889 Z 0.648 A -56.093 C -154.299 F 636 +G1 X 36.487 Y -20.868 Z 0.547 A -55.970 C -154.256 F 636 +G1 X 36.663 Y -20.828 Z 0.449 A -55.846 C -154.212 F 636 +G1 X 36.837 Y -20.770 Z 0.355 A -55.722 C -154.167 F 636 +G1 X 37.009 Y -20.695 Z 0.265 A -55.596 C -154.122 F 636 +G1 X 37.179 Y -20.602 Z 0.179 A -55.468 C -154.077 F 636 +G1 X 37.347 Y -20.493 Z 0.098 A -55.338 C -154.030 F 636 +G1 X 37.512 Y -20.367 Z 0.021 A -55.204 C -153.982 F 636 +G1 X 37.674 Y -20.226 Z -0.051 A -55.067 C -153.932 F 636 +G1 X 37.833 Y -20.068 Z -0.119 A -54.926 C -153.881 F 636 +G1 X 37.988 Y -19.896 Z -0.182 A -54.781 C -153.828 F 636 +G1 X 38.138 Y -19.708 Z -0.241 A -54.632 C -153.773 F 636 +G1 X 38.284 Y -19.507 Z -0.294 A -54.479 C -153.717 F 636 +G1 X 38.426 Y -19.291 Z -0.342 A -54.321 C -153.659 F 636 +G1 X 38.561 Y -19.061 Z -0.386 A -54.158 C -153.598 F 636 +G1 X 38.692 Y -18.819 Z -0.424 A -53.990 C -153.536 F 636 +G1 X 38.816 Y -18.563 Z -0.457 A -53.818 C -153.472 F 636 +G1 X 38.934 Y -18.295 Z -0.484 A -53.641 C -153.405 F 636 +G1 X 39.045 Y -18.015 Z -0.506 A -53.459 C -153.336 F 636 +G1 X 39.149 Y -17.723 Z -0.522 A -53.272 C -153.266 F 636 +G1 X 39.246 Y -17.420 Z -0.533 A -53.081 C -153.193 F 636 +G1 X 39.335 Y -17.112 Z -0.538 A -52.916 C -153.129 F 636 +G1 X 39.417 Y -16.802 Z -0.538 A -52.751 C -153.066 F 636 +G1 X 39.492 Y -16.493 Z -0.533 A -52.588 C -153.003 F 636 +G1 X 39.558 Y -16.184 Z -0.523 A -52.425 C -152.940 F 636 +G1 X 39.617 Y -15.876 Z -0.508 A -52.264 C -152.877 F 636 +G1 X 39.667 Y -15.570 Z -0.488 A -52.104 C -152.814 F 636 +G1 X 39.709 Y -15.265 Z -0.463 A -51.946 C -152.752 F 636 +G1 X 39.742 Y -14.963 Z -0.433 A -51.789 C -152.690 F 636 +G1 X 39.766 Y -14.664 Z -0.397 A -51.634 C -152.628 F 636 +G1 X 39.780 Y -14.368 Z -0.356 A -51.481 C -152.567 F 636 +G1 X 39.785 Y -14.077 Z -0.310 A -51.329 C -152.506 F 636 +G1 X 39.780 Y -13.789 Z -0.259 A -51.179 C -152.446 F 636 +G1 X 39.765 Y -13.506 Z -0.203 A -51.031 C -152.386 F 636 +G1 X 39.740 Y -13.229 Z -0.141 A -50.885 C -152.327 F 636 +G1 X 39.704 Y -12.957 Z -0.074 A -50.741 C -152.268 F 636 +G1 X 39.657 Y -12.692 Z -0.002 A -50.598 C -152.209 F 636 +G1 X 39.599 Y -12.433 Z 0.075 A -50.456 C -152.151 F 636 +G1 X 39.530 Y -12.182 Z 0.158 A -50.316 C -152.093 F 636 +G1 X 39.449 Y -11.938 Z 0.247 A -50.177 C -152.036 F 636 +G1 X 39.357 Y -11.703 Z 0.340 A -50.039 C -151.978 F 636 +G1 X 39.252 Y -11.476 Z 0.440 A -49.901 C -151.921 F 636 +G1 X 39.135 Y -11.259 Z 0.544 A -49.764 C -151.863 F 636 +G1 X 39.005 Y -11.051 Z 0.654 A -49.627 C -151.805 F 636 +G1 X 38.862 Y -10.853 Z 0.770 A -49.489 C -151.746 F 636 +G1 X 38.707 Y -10.666 Z 0.891 A -49.350 C -151.687 F 636 +G1 X 38.537 Y -10.490 Z 1.017 A -49.209 C -151.627 F 636 +G1 X 38.355 Y -10.326 Z 1.149 A -49.066 C -151.566 F 636 +G1 X 38.158 Y -10.174 Z 1.287 A -48.921 C -151.503 F 636 +G1 X 37.947 Y -10.034 Z 1.430 A -48.772 C -151.439 F 636 +G1 X 37.722 Y -9.907 Z 1.579 A -48.620 C -151.372 F 636 +G1 X 37.482 Y -9.794 Z 1.733 A -48.463 C -151.304 F 636 +G1 X 37.227 Y -9.695 Z 1.893 A -48.302 C -151.233 F 636 +G1 X 35.607 Y -9.127 Z 2.900 A -50.315 C -147.105 F 159 +G1 X 35.403 Y -9.051 Z 3.027 A -50.578 C -146.589 F 159 +G1 X 35.003 Y -8.873 Z 3.283 A -51.085 C -145.542 F 159 +G1 X 34.612 Y -8.657 Z 3.540 A -51.565 C -144.468 F 159 +G1 X 34.232 Y -8.401 Z 3.797 A -52.016 C -143.361 F 159 +G1 X 33.866 Y -8.105 Z 4.051 A -52.433 C -142.223 F 159 +G1 X 32.896 Y -7.185 Z 4.755 A -53.548 C -138.994 F 159 +G1 X 32.280 Y -6.596 Z 5.209 A -54.325 C -136.924 F 159 +G1 X 31.753 Y -6.095 Z 5.611 A -55.055 C -135.159 F 159 +G1 X 31.226 Y -5.593 Z 6.015 A -55.820 C -133.393 F 159 +G1 X 30.702 Y -5.096 Z 6.431 A -56.642 C -131.645 F 159 +G1 X 30.178 Y -4.596 Z 6.849 A -57.496 C -129.903 F 159 +G1 X 29.655 Y -4.102 Z 7.277 A -58.403 C -128.185 F 159 +G1 X 29.134 Y -3.605 Z 7.708 A -59.339 C -126.480 F 159 +G1 X 28.597 Y -3.098 Z 8.164 A -60.355 C -124.750 F 159 +G1 X 28.062 Y -2.589 Z 8.621 A -61.395 C -123.041 F 159 +G1 X 27.545 Y -2.101 Z 9.075 A -62.445 C -121.421 F 159 +G1 X 27.031 Y -1.612 Z 9.530 A -63.511 C -119.824 F 159 +G1 X 26.518 Y -1.129 Z 9.994 A -64.611 C -118.269 F 159 +G1 X 26.013 Y -0.652 Z 10.454 A -65.628 C -116.929 F 159 +G1 X 25.097 Y 0.175 Z 11.322 A -66.256 C -117.271 F 159 +G1 X 24.177 Y 0.986 Z 12.204 A -66.919 C -117.628 F 159 +G1 X 23.253 Y 1.778 Z 13.101 A -67.618 C -118.001 F 159 +G1 X 22.314 Y 2.559 Z 14.021 A -68.358 C -118.393 F 159 +G1 X 21.385 Y 3.305 Z 14.937 A -69.116 C -118.791 F 159 +G1 X 20.471 Y 4.012 Z 15.844 A -69.871 C -119.223 F 159 +G1 X 19.537 Y 4.699 Z 16.777 A -70.391 C -120.221 F 159 +G1 X 18.601 Y 5.354 Z 17.712 A -70.779 C -121.405 F 159 +G1 X 17.660 Y 5.979 Z 18.653 A -71.062 C -122.720 F 159 +G1 X 16.712 Y 6.572 Z 19.599 A -71.271 C -124.093 F 159 +G1 X 15.845 Y 7.082 Z 20.462 A -71.384 C -125.414 F 159 +G1 X 14.916 Y 7.592 Z 21.386 A -71.415 C -126.911 F 159 +G1 X 13.947 Y 8.083 Z 22.348 A -71.336 C -128.572 F 159 +G1 X 12.975 Y 8.533 Z 23.312 A -71.142 C -130.331 F 159 +G1 X 12.228 Y 8.850 Z 24.051 A -70.918 C -131.736 F 159 +G1 X 11.739 Y 9.039 Z 24.540 A -70.740 C -132.691 F 159 +G1 X 11.418 Y 9.145 Z 24.876 A -70.634 C -133.357 F 159 +G1 X 11.102 Y 9.232 Z 25.223 A -70.542 C -134.051 F 159 +G1 X 10.793 Y 9.302 Z 25.580 A -70.462 C -134.772 F 159 +G1 X 10.342 Y 9.375 Z 26.133 A -70.362 C -135.897 F 159 +G1 X 9.009 Y 9.422 Z 28.012 A -70.183 C -139.679 F 159 +G1 X 8.945 Y 9.420 Z 28.107 A -70.304 C -139.640 F 636 +G1 X 8.893 Y 9.409 Z 28.197 A -70.414 C -139.604 F 636 +G1 X 8.853 Y 9.391 Z 28.282 A -70.515 C -139.572 F 636 +G1 X 8.824 Y 9.364 Z 28.360 A -70.607 C -139.542 F 636 +G1 X 8.806 Y 9.331 Z 28.433 A -70.694 C -139.514 F 636 +G1 X 8.798 Y 9.290 Z 28.499 A -70.776 C -139.488 F 636 +G1 X 8.801 Y 9.243 Z 28.559 A -70.856 C -139.462 F 636 +G1 X 8.813 Y 9.191 Z 28.613 A -70.936 C -139.436 F 636 +G1 X 8.836 Y 9.132 Z 28.659 A -71.019 C -139.410 F 636 +G1 X 8.867 Y 9.069 Z 28.699 A -71.104 C -139.383 F 636 +G1 X 8.908 Y 9.001 Z 28.732 A -71.194 C -139.354 F 636 +G1 X 8.957 Y 8.929 Z 28.758 A -71.290 C -139.323 F 636 +G1 X 9.015 Y 8.853 Z 28.777 A -71.393 C -139.290 F 636 +G1 X 9.081 Y 8.774 Z 28.787 A -71.502 C -139.256 F 636 +G1 X 9.155 Y 8.692 Z 28.791 A -71.618 C -139.219 F 636 +G1 X 9.236 Y 8.608 Z 28.786 A -71.741 C -139.179 F 636 +G1 X 9.405 Y 8.446 Z 28.758 A -71.955 C -139.112 F 636 +G1 X 9.489 Y 8.372 Z 28.735 A -72.058 C -139.079 F 636 +G1 X 9.572 Y 8.304 Z 28.706 A -72.159 C -139.047 F 636 +G1 X 9.654 Y 8.241 Z 28.671 A -72.258 C -139.016 F 636 +G1 X 9.734 Y 8.185 Z 28.630 A -72.354 C -138.986 F 636 +G1 X 9.813 Y 8.135 Z 28.583 A -72.448 C -138.956 F 636 +G1 X 9.888 Y 8.092 Z 28.530 A -72.541 C -138.927 F 636 +G1 X 9.961 Y 8.057 Z 28.471 A -72.632 C -138.898 F 636 +G1 X 10.031 Y 8.030 Z 28.405 A -72.722 C -138.870 F 636 +G1 X 10.098 Y 8.011 Z 28.333 A -72.812 C -138.841 F 636 +G1 X 10.161 Y 8.000 Z 28.254 A -72.904 C -138.813 F 636 +G1 X 10.219 Y 7.999 Z 28.170 A -72.997 C -138.783 F 636 +G1 X 10.273 Y 8.008 Z 28.078 A -73.094 C -138.753 F 636 +G1 X 10.322 Y 8.027 Z 27.980 A -73.194 C -138.722 F 636 +G1 X 10.366 Y 8.056 Z 27.875 A -73.300 C -138.689 F 636 +G1 X 10.992 Y 8.584 Z 26.218 A -72.073 C -135.660 F 159 +G1 X 11.086 Y 8.656 Z 25.979 A -71.881 C -135.232 F 159 +G1 X 11.198 Y 8.705 Z 25.747 A -71.735 C -134.810 F 159 +G1 X 11.323 Y 8.730 Z 25.526 A -71.634 C -134.401 F 159 +G1 X 11.461 Y 8.731 Z 25.317 A -71.579 C -134.008 F 159 +G1 X 11.594 Y 8.713 Z 25.140 A -71.566 C -133.669 F 159 +G1 X 11.734 Y 8.676 Z 24.976 A -71.587 C -133.348 F 159 +G1 X 11.951 Y 8.589 Z 24.753 A -71.678 C -132.904 F 159 +G1 X 12.025 Y 8.552 Z 24.685 A -71.725 C -132.766 F 159 +G1 X 12.620 Y 8.204 Z 24.177 A -72.152 C -131.727 F 159 +G1 X 13.269 Y 7.795 Z 23.617 A -72.581 C -130.615 F 159 +G1 X 13.908 Y 7.362 Z 23.057 A -72.966 C -129.536 F 159 +G1 X 14.536 Y 6.907 Z 22.499 A -73.302 C -128.504 F 159 +G1 X 15.152 Y 6.429 Z 21.942 A -73.588 C -127.523 F 159 +G1 X 15.757 Y 5.930 Z 21.386 A -73.829 C -126.589 F 159 +G1 X 16.350 Y 5.411 Z 20.831 A -74.029 C -125.698 F 159 +G1 X 16.914 Y 4.887 Z 20.293 A -74.187 C -124.869 F 159 +G1 X 17.473 Y 4.340 Z 19.751 A -74.313 C -124.068 F 159 +G1 X 18.028 Y 3.766 Z 19.202 A -74.415 C -123.275 F 159 +G1 X 18.571 Y 3.173 Z 18.654 A -74.467 C -122.551 F 159 +G1 X 19.211 Y 2.433 Z 17.993 A -74.490 C -121.721 F 159 +G1 X 19.738 Y 1.790 Z 17.442 A -74.310 C -121.440 F 159 +G1 X 20.508 Y 0.791 Z 16.618 A -73.959 C -121.265 F 159 +G1 X 21.247 Y -0.241 Z 15.803 A -73.645 C -121.108 F 159 +G1 X 21.955 Y -1.299 Z 15.000 A -73.369 C -120.970 F 159 +G1 X 22.633 Y -2.385 Z 14.208 A -73.131 C -120.851 F 159 +G1 X 23.306 Y -3.537 Z 13.397 A -72.921 C -120.746 F 159 +G1 X 23.975 Y -4.729 Z 12.591 A -72.031 C -122.179 F 159 +G1 X 24.321 Y -5.361 Z 12.178 A -71.279 C -123.603 F 159 +G1 X 24.667 Y -5.990 Z 11.765 A -70.545 C -125.020 F 159 +G1 X 25.337 Y -7.262 Z 10.956 A -69.169 C -127.820 F 159 +G1 X 25.883 Y -8.339 Z 10.288 A -68.103 C -130.129 F 159 +G1 X 26.477 Y -9.560 Z 9.550 A -67.007 C -132.662 F 159 +G1 X 27.081 Y -10.857 Z 8.788 A -65.970 C -135.244 F 159 +G1 X 27.720 Y -12.297 Z 7.968 A -64.967 C -137.970 F 159 +G1 X 28.275 Y -13.610 Z 7.245 A -64.181 C -140.318 F 159 +G1 X 28.805 Y -14.929 Z 6.540 A -63.504 C -142.545 F 159 +G1 X 29.314 Y -16.255 Z 5.854 A -62.929 C -144.648 F 159 +G1 X 29.801 Y -17.589 Z 5.185 A -62.447 C -146.631 F 159 +G1 X 30.267 Y -18.930 Z 4.536 A -62.049 C -148.494 F 159 +G1 X 30.714 Y -20.278 Z 3.905 A -61.729 C -150.242 F 159 +G1 X 31.079 Y -21.426 Z 3.385 A -61.511 C -151.636 F 159 +G1 X 31.862 Y -23.545 Z 2.363 A -61.061 C -154.196 F 159 +G1 X 31.953 Y -23.778 Z 2.248 A -60.899 C -154.149 F 636 +G1 X 32.048 Y -23.999 Z 2.133 A -60.743 C -154.104 F 636 +G1 X 32.147 Y -24.208 Z 2.018 A -60.591 C -154.060 F 636 +G1 X 32.251 Y -24.406 Z 1.904 A -60.444 C -154.017 F 636 +G1 X 32.358 Y -24.593 Z 1.790 A -60.301 C -153.975 F 636 +G1 X 32.469 Y -24.768 Z 1.676 A -60.162 C -153.934 F 636 +G1 X 32.584 Y -24.932 Z 1.563 A -60.027 C -153.894 F 636 +G1 X 32.702 Y -25.085 Z 1.451 A -59.896 C -153.856 F 636 +G1 X 32.824 Y -25.227 Z 1.339 A -59.768 C -153.818 F 636 +G1 X 32.949 Y -25.358 Z 1.227 A -59.644 C -153.781 F 636 +G1 X 33.077 Y -25.479 Z 1.116 A -59.522 C -153.745 F 636 +G1 X 33.208 Y -25.589 Z 1.006 A -59.403 C -153.709 F 636 +G1 X 33.342 Y -25.689 Z 0.897 A -59.286 C -153.674 F 636 +G1 X 33.479 Y -25.778 Z 0.788 A -59.171 C -153.639 F 636 +G1 X 33.618 Y -25.857 Z 0.681 A -59.058 C -153.605 F 636 +G1 X 33.759 Y -25.926 Z 0.574 A -58.946 C -153.572 F 636 +G1 X 33.903 Y -25.985 Z 0.468 A -58.836 C -153.539 F 636 +G1 X 34.049 Y -26.035 Z 0.363 A -58.726 C -153.505 F 636 +G1 X 34.197 Y -26.074 Z 0.259 A -58.618 C -153.473 F 636 +G1 X 34.347 Y -26.105 Z 0.156 A -58.510 C -153.440 F 636 +G1 X 34.499 Y -26.125 Z 0.054 A -58.402 C -153.407 F 636 +G1 X 34.652 Y -26.137 Z -0.046 A -58.295 C -153.374 F 636 +G1 X 34.806 Y -26.139 Z -0.146 A -58.187 C -153.341 F 636 +G1 X 34.962 Y -26.133 Z -0.244 A -58.079 C -153.308 F 636 +G1 X 35.119 Y -26.117 Z -0.341 A -57.971 C -153.274 F 636 +G1 X 35.277 Y -26.093 Z -0.436 A -57.862 C -153.241 F 636 +G1 X 35.436 Y -26.060 Z -0.531 A -57.752 C -153.207 F 636 +G1 X 35.596 Y -26.018 Z -0.623 A -57.641 C -153.172 F 636 +G1 X 35.756 Y -25.969 Z -0.715 A -57.529 C -153.137 F 636 +G1 X 35.917 Y -25.911 Z -0.805 A -57.416 C -153.102 F 636 +G1 X 36.078 Y -25.844 Z -0.893 A -57.302 C -153.066 F 636 +G1 X 36.239 Y -25.770 Z -0.980 A -57.186 C -153.030 F 636 +G1 X 36.401 Y -25.688 Z -1.065 A -57.069 C -152.993 F 636 +G1 X 36.562 Y -25.599 Z -1.148 A -56.951 C -152.956 F 636 +G1 X 36.883 Y -25.396 Z -1.309 A -56.709 C -152.880 F 636 +G1 X 37.203 Y -25.165 Z -1.463 A -56.462 C -152.801 F 636 +G1 X 37.519 Y -24.905 Z -1.610 A -56.207 C -152.719 F 636 +G1 X 37.831 Y -24.617 Z -1.748 A -55.946 C -152.635 F 636 +G1 X 38.137 Y -24.304 Z -1.878 A -55.679 C -152.548 F 636 +G1 X 38.437 Y -23.964 Z -1.999 A -55.405 C -152.459 F 636 +G1 X 38.730 Y -23.601 Z -2.111 A -55.125 C -152.367 F 636 +G1 X 39.013 Y -23.214 Z -2.213 A -54.838 C -152.272 F 636 +G1 X 39.287 Y -22.806 Z -2.306 A -54.546 C -152.174 F 636 +G1 X 39.549 Y -22.375 Z -2.388 A -54.248 C -152.074 F 636 +G1 X 39.800 Y -21.925 Z -2.460 A -53.944 C -151.971 F 636 +G1 X 40.037 Y -21.456 Z -2.521 A -53.635 C -151.865 F 636 +G1 X 40.260 Y -20.968 Z -2.570 A -53.321 C -151.757 F 636 +G1 X 40.467 Y -20.463 Z -2.608 A -53.002 C -151.646 F 636 +G1 X 40.658 Y -19.942 Z -2.634 A -52.678 C -151.533 F 636 +G1 X 40.834 Y -19.410 Z -2.649 A -52.394 C -151.432 F 636 +G1 X 41.000 Y -18.870 Z -2.653 A -52.107 C -151.330 F 636 +G1 X 41.154 Y -18.326 Z -2.648 A -51.821 C -151.227 F 636 +G1 X 41.295 Y -17.777 Z -2.633 A -51.533 C -151.123 F 636 +G1 X 41.424 Y -17.226 Z -2.607 A -51.246 C -151.018 F 636 +G1 X 41.539 Y -16.674 Z -2.572 A -50.960 C -150.913 F 636 +G1 X 41.639 Y -16.123 Z -2.527 A -50.675 C -150.807 F 636 +G1 X 41.725 Y -15.573 Z -2.473 A -50.392 C -150.701 F 636 +G1 X 41.796 Y -15.026 Z -2.408 A -50.111 C -150.595 F 636 +G1 X 41.850 Y -14.485 Z -2.333 A -49.833 C -150.489 F 636 +G1 X 41.887 Y -13.949 Z -2.249 A -49.558 C -150.383 F 636 +G1 X 41.908 Y -13.421 Z -2.155 A -49.287 C -150.278 F 636 +G1 X 41.910 Y -12.901 Z -2.052 A -49.019 C -150.173 F 636 +G1 X 41.893 Y -12.392 Z -1.938 A -48.756 C -150.069 F 636 +G1 X 41.857 Y -11.895 Z -1.815 A -48.496 C -149.966 F 636 +G1 X 41.801 Y -11.411 Z -1.682 A -48.241 C -149.864 F 636 +G1 X 41.725 Y -10.942 Z -1.540 A -47.991 C -149.763 F 636 +G1 X 41.628 Y -10.488 Z -1.388 A -47.745 C -149.663 F 636 +G1 X 41.508 Y -10.053 Z -1.226 A -47.503 C -149.563 F 636 +G1 X 41.440 Y -9.842 Z -1.142 A -47.383 C -149.514 F 636 +G1 X 41.367 Y -9.636 Z -1.055 A -47.265 C -149.465 F 636 +G1 X 41.287 Y -9.435 Z -0.966 A -47.147 C -149.416 F 636 +G1 X 41.202 Y -9.239 Z -0.875 A -47.030 C -149.367 F 636 +G1 X 41.111 Y -9.049 Z -0.781 A -46.913 C -149.318 F 636 +G1 X 41.013 Y -8.864 Z -0.684 A -46.798 C -149.269 F 636 +G1 X 40.910 Y -8.686 Z -0.586 A -46.682 C -149.220 F 636 +G1 X 40.800 Y -8.513 Z -0.485 A -46.567 C -149.171 F 636 +G1 X 40.685 Y -8.346 Z -0.381 A -46.453 C -149.123 F 636 +G1 X 40.563 Y -8.186 Z -0.276 A -46.338 C -149.074 F 636 +G1 X 40.434 Y -8.032 Z -0.168 A -46.224 C -149.024 F 636 +G1 X 40.299 Y -7.885 Z -0.057 A -46.109 C -148.975 F 636 +G1 X 40.158 Y -7.745 Z 0.056 A -45.994 C -148.925 F 636 +G1 X 40.010 Y -7.611 Z 0.171 A -45.878 C -148.874 F 636 +G1 X 39.855 Y -7.485 Z 0.288 A -45.761 C -148.824 F 636 +G1 X 39.693 Y -7.367 Z 0.408 A -45.644 C -148.772 F 636 +G1 X 39.525 Y -7.256 Z 0.530 A -45.525 C -148.720 F 636 +G1 X 39.349 Y -7.152 Z 0.655 A -45.405 C -148.667 F 636 +G1 X 39.167 Y -7.057 Z 0.782 A -45.284 C -148.613 F 636 +G1 X 38.977 Y -6.970 Z 0.911 A -45.161 C -148.557 F 636 +G1 X 38.780 Y -6.891 Z 1.043 A -45.035 C -148.501 F 636 +G1 X 38.576 Y -6.820 Z 1.176 A -44.908 C -148.444 F 636 +G1 X 38.365 Y -6.759 Z 1.313 A -44.778 C -148.385 F 636 +G1 X 38.146 Y -6.706 Z 1.451 A -44.645 C -148.325 F 636 +G1 X 37.920 Y -6.662 Z 1.592 A -44.509 C -148.263 F 636 +G1 X 37.686 Y -6.627 Z 1.735 A -44.371 C -148.199 F 636 +G1 X 35.974 Y -6.409 Z 2.774 A -47.126 C -143.929 F 159 +G1 X 35.777 Y -6.383 Z 2.895 A -47.454 C -143.457 F 159 +G1 X 35.485 Y -6.310 Z 3.076 A -47.910 C -142.709 F 159 +G1 X 35.201 Y -6.193 Z 3.255 A -48.321 C -141.912 F 159 +G1 X 34.924 Y -6.031 Z 3.433 A -48.684 C -141.062 F 159 +G1 X 33.984 Y -5.310 Z 4.058 A -49.856 C -137.902 F 159 +G1 X 33.312 Y -4.788 Z 4.511 A -50.764 C -135.648 F 159 +G1 X 32.734 Y -4.340 Z 4.919 A -51.623 C -133.725 F 159 +G1 X 32.155 Y -3.890 Z 5.329 A -52.522 C -131.817 F 159 +G1 X 31.581 Y -3.444 Z 5.752 A -53.481 C -129.948 F 159 +G1 X 31.009 Y -2.996 Z 6.177 A -54.475 C -128.102 F 159 +G1 X 30.440 Y -2.553 Z 6.614 A -55.523 C -126.300 F 159 +G1 X 29.873 Y -2.107 Z 7.053 A -56.599 C -124.528 F 159 +G1 X 29.254 Y -1.622 Z 7.550 A -57.837 C -122.635 F 159 +G1 X 28.637 Y -1.134 Z 8.049 A -59.100 C -120.783 F 159 +G1 X 28.026 Y -0.653 Z 8.561 A -60.408 C -118.995 F 159 +G1 X 27.418 Y -0.170 Z 9.074 A -61.731 C -117.252 F 159 +G1 X 26.370 Y 0.641 Z 9.993 A -63.458 C -115.724 F 159 +G1 X 25.387 Y 1.368 Z 10.886 A -64.269 C -116.179 F 159 +G1 X 24.406 Y 2.080 Z 11.793 A -65.108 C -116.643 F 159 +G1 X 23.427 Y 2.777 Z 12.716 A -65.974 C -117.117 F 159 +G1 X 22.222 Y 3.611 Z 13.872 A -67.078 C -117.712 F 159 +G1 X 21.344 Y 4.202 Z 14.725 A -67.904 C -118.153 F 159 +G1 X 20.366 Y 4.838 Z 15.687 A -68.762 C -118.826 F 159 +G1 X 19.401 Y 5.435 Z 16.647 A -69.338 C -120.026 F 159 +G1 X 18.437 Y 6.008 Z 17.612 A -69.829 C -121.299 F 159 +G1 X 17.470 Y 6.556 Z 18.585 A -70.233 C -122.653 F 159 +G1 X 16.503 Y 7.074 Z 19.563 A -70.546 C -124.087 F 159 +G1 X 15.681 Y 7.489 Z 20.396 A -70.737 C -125.371 F 159 +G1 X 15.034 Y 7.799 Z 21.055 A -70.835 C -126.430 F 159 +G1 X 14.061 Y 8.237 Z 22.047 A -70.885 C -128.113 F 159 +G1 X 13.089 Y 8.638 Z 23.041 A -70.814 C -129.897 F 159 +G1 X 12.318 Y 8.930 Z 23.833 A -70.677 C -131.373 F 159 +G1 X 11.415 Y 9.241 Z 24.763 A -70.411 C -133.185 F 159 +G1 X 10.767 Y 9.442 Z 25.433 A -70.140 C -134.552 F 159 +G1 X 10.120 Y 9.625 Z 26.106 A -69.806 C -135.960 F 159 +G1 X 8.679 Y 9.858 Z 27.850 A -69.177 C -139.529 F 159 +G1 X -0.663 Y 13.149 Z 27.743 A -71.841 C -190.220 F 636 +G1 X -0.341 Y 13.947 Z 26.178 A -71.266 C -187.209 F 159 +G1 X -0.249 Y 14.112 Z 25.858 A -71.158 C -186.594 F 159 +G1 X -0.127 Y 14.273 Z 25.552 A -71.093 C -186.005 F 159 +G1 X 0.024 Y 14.428 Z 25.262 A -71.073 C -185.441 F 159 +G1 X 0.203 Y 14.575 Z 24.986 A -71.096 C -184.904 F 159 +G1 X 0.410 Y 14.713 Z 24.729 A -71.164 C -184.397 F 159 +G1 X 0.596 Y 14.817 Z 24.534 A -71.252 C -184.008 F 159 +G1 X 1.192 Y 15.099 Z 23.987 A -71.566 C -182.922 F 159 +G1 X 2.117 Y 15.497 Z 23.162 A -71.965 C -181.342 F 159 +G1 X 2.809 Y 15.768 Z 22.558 A -72.202 C -180.225 F 159 +G1 X 3.513 Y 16.022 Z 21.956 A -72.387 C -179.160 F 159 +G1 X 4.228 Y 16.258 Z 21.354 A -72.522 C -178.145 F 159 +G1 X 5.283 Y 16.571 Z 20.484 A -72.638 C -176.753 F 159 +G1 X 6.293 Y 16.834 Z 19.669 A -72.669 C -175.523 F 159 +G1 X 7.420 Y 17.088 Z 18.778 A -72.625 C -174.254 F 159 +G1 X 8.566 Y 17.307 Z 17.890 A -72.500 C -173.070 F 159 +G1 X 9.338 Y 17.435 Z 17.302 A -72.381 C -172.314 F 159 +G1 X 10.553 Y 17.603 Z 16.396 A -71.935 C -171.674 F 159 +G1 X 11.770 Y 17.737 Z 15.512 A -71.371 C -171.387 F 159 +G1 X 12.998 Y 17.840 Z 14.638 A -70.844 C -171.118 F 159 +G1 X 14.205 Y 17.913 Z 13.797 A -70.367 C -170.873 F 159 +G1 X 15.441 Y 17.960 Z 12.954 A -69.921 C -170.642 F 159 +G1 X 16.693 Y 17.983 Z 12.117 A -69.512 C -170.430 F 159 +G1 X 18.029 Y 17.984 Z 11.258 A -68.408 C -171.775 F 159 +G1 X 18.742 Y 17.978 Z 10.817 A -67.494 C -173.293 F 159 +G1 X 19.454 Y 17.974 Z 10.377 A -66.596 C -174.818 F 159 +G1 X 20.170 Y 17.961 Z 9.946 A -65.737 C -176.358 F 159 +G1 X 20.884 Y 17.951 Z 9.515 A -64.898 C -177.901 F 159 +G1 X 21.601 Y 17.933 Z 9.094 A -64.103 C -179.450 F 159 +G1 X 22.317 Y 17.918 Z 8.674 A -63.332 C -180.995 F 159 +G1 X 23.063 Y 17.893 Z 8.248 A -62.581 C -182.602 F 159 +G1 X 23.808 Y 17.871 Z 7.823 A -61.858 C -184.199 F 159 +G1 X 25.245 Y 17.814 Z 7.027 A -60.593 C -187.249 F 159 +G1 X 26.712 Y 17.743 Z 6.238 A -59.462 C -190.302 F 159 +G1 X 28.151 Y 17.660 Z 5.489 A -58.507 C -193.220 F 159 +G1 X 29.108 Y 17.603 Z 5.002 A -57.948 C -195.112 F 159 +G1 X 30.057 Y 17.576 Z 4.516 A -57.404 C -196.965 F 159 +G1 X 31.003 Y 17.586 Z 4.026 A -56.865 C -198.797 F 159 +G1 X 31.789 Y 17.621 Z 3.618 A -56.426 C -200.310 F 159 +G1 X 32.725 Y 17.692 Z 3.134 A -55.918 C -202.101 F 159 +G1 X 34.980 Y 17.955 Z 1.937 A -54.730 C -206.344 F 159 +G1 X 35.165 Y 17.984 Z 1.837 A -54.607 C -206.267 F 636 +G1 X 35.327 Y 18.026 Z 1.743 A -54.496 C -206.196 F 636 +G1 X 35.468 Y 18.079 Z 1.655 A -54.395 C -206.132 F 636 +G1 X 35.586 Y 18.145 Z 1.574 A -54.304 C -206.075 F 636 +G1 X 35.683 Y 18.221 Z 1.500 A -54.220 C -206.021 F 636 +G1 X 35.757 Y 18.308 Z 1.432 A -54.143 C -205.972 F 636 +G1 X 35.811 Y 18.405 Z 1.371 A -54.070 C -205.925 F 636 +G1 X 35.843 Y 18.512 Z 1.317 A -53.998 C -205.880 F 636 +G1 X 35.853 Y 18.628 Z 1.270 A -53.926 C -205.833 F 636 +G1 X 35.843 Y 18.752 Z 1.230 A -53.850 C -205.784 F 636 +G1 X 35.811 Y 18.885 Z 1.198 A -53.769 C -205.732 F 636 +G1 X 35.758 Y 19.025 Z 1.172 A -53.681 C -205.675 F 636 +G1 X 35.685 Y 19.172 Z 1.154 A -53.585 C -205.613 F 636 +G1 X 35.591 Y 19.326 Z 1.143 A -53.480 C -205.545 F 636 +G1 X 35.476 Y 19.486 Z 1.139 A -53.366 C -205.471 F 636 +G1 X 35.341 Y 19.652 Z 1.143 A -53.243 C -205.390 F 636 +G1 X 35.194 Y 19.815 Z 1.153 A -53.142 C -205.324 F 636 +G1 X 35.043 Y 19.967 Z 1.170 A -53.043 C -205.259 F 636 +G1 X 34.889 Y 20.107 Z 1.192 A -52.947 C -205.195 F 636 +G1 X 34.731 Y 20.235 Z 1.221 A -52.853 C -205.133 F 636 +G1 X 34.571 Y 20.351 Z 1.256 A -52.761 C -205.072 F 636 +G1 X 34.408 Y 20.453 Z 1.297 A -52.671 C -205.012 F 636 +G1 X 34.242 Y 20.542 Z 1.344 A -52.582 C -204.952 F 636 +G1 X 34.074 Y 20.617 Z 1.398 A -52.494 C -204.893 F 636 +G1 X 33.903 Y 20.677 Z 1.457 A -52.407 C -204.835 F 636 +G1 X 33.730 Y 20.722 Z 1.524 A -52.319 C -204.776 F 636 +G1 X 33.555 Y 20.752 Z 1.596 A -52.231 C -204.717 F 636 +G1 X 33.378 Y 20.765 Z 1.676 A -52.142 C -204.657 F 636 +G1 X 33.199 Y 20.763 Z 1.761 A -52.052 C -204.595 F 636 +G1 X 33.019 Y 20.743 Z 1.853 A -51.959 C -204.532 F 636 +G1 X 32.837 Y 20.706 Z 1.952 A -51.863 C -204.466 F 636 +G1 X 32.655 Y 20.651 Z 2.058 A -51.763 C -204.398 F 636 +G1 X 31.040 Y 20.086 Z 3.017 A -53.155 C -200.648 F 159 +G1 X 30.551 Y 19.932 Z 3.301 A -53.584 C -199.519 F 159 +G1 X 30.048 Y 19.799 Z 3.589 A -54.009 C -198.377 F 159 +G1 X 29.591 Y 19.701 Z 3.846 A -54.380 C -197.351 F 159 +G1 X 29.122 Y 19.622 Z 4.104 A -54.744 C -196.308 F 159 +G1 X 28.427 Y 19.544 Z 4.476 A -55.254 C -194.776 F 159 +G1 X 27.224 Y 19.489 Z 5.099 A -56.092 C -192.133 F 159 +G1 X 25.777 Y 19.429 Z 5.868 A -57.235 C -188.903 F 159 +G1 X 25.056 Y 19.395 Z 6.265 A -57.877 C -187.276 F 159 +G1 X 24.333 Y 19.362 Z 6.663 A -58.550 C -185.637 F 159 +G1 X 23.613 Y 19.324 Z 7.073 A -59.277 C -184.000 F 159 +G1 X 22.892 Y 19.289 Z 7.484 A -60.034 C -182.357 F 159 +G1 X 22.226 Y 19.251 Z 7.876 A -60.782 C -180.841 F 159 +G1 X 21.559 Y 19.216 Z 8.268 A -61.554 C -179.326 F 159 +G1 X 20.896 Y 19.176 Z 8.669 A -62.366 C -177.824 F 159 +G1 X 20.231 Y 19.138 Z 9.072 A -63.200 C -176.328 F 159 +G1 X 19.520 Y 19.093 Z 9.514 A -64.138 C -174.738 F 159 +G1 X 18.808 Y 19.050 Z 9.958 A -65.096 C -173.159 F 159 +G1 X 18.101 Y 19.002 Z 10.410 A -66.091 C -171.608 F 159 +G1 X 17.394 Y 18.957 Z 10.864 A -67.099 C -170.074 F 159 +G1 X 16.115 Y 18.856 Z 11.727 A -67.941 C -169.604 F 159 +G1 X 14.882 Y 18.737 Z 12.587 A -68.469 C -169.883 F 159 +G1 X 13.660 Y 18.599 Z 13.460 A -69.036 C -170.180 F 159 +G1 X 12.417 Y 18.435 Z 14.369 A -69.656 C -170.504 F 159 +G1 X 11.215 Y 18.251 Z 15.269 A -70.298 C -170.836 F 159 +G1 X 10.152 Y 18.065 Z 16.081 A -70.898 C -171.151 F 159 +G1 X 9.117 Y 17.860 Z 16.893 A -71.355 C -171.805 F 159 +G1 X 7.989 Y 17.604 Z 17.800 A -71.634 C -172.969 F 159 +G1 X 6.875 Y 17.321 Z 18.715 A -71.841 C -174.205 F 159 +G1 X 5.782 Y 17.007 Z 19.633 A -71.964 C -175.525 F 159 +G1 X 4.840 Y 16.707 Z 20.443 A -72.003 C -176.753 F 159 +G1 X 3.786 Y 16.333 Z 21.371 A -71.958 C -178.246 F 159 +G1 X 2.758 Y 15.926 Z 22.302 A -71.807 C -179.844 F 159 +G1 X 2.086 Y 15.636 Z 22.925 A -71.639 C -180.975 F 159 +G1 X 1.427 Y 15.330 Z 23.549 A -71.425 C -182.143 F 159 +G1 X 0.567 Y 14.897 Z 24.385 A -71.059 C -183.765 F 159 +G1 X 0.300 Y 14.744 Z 24.670 A -70.942 C -184.330 F 159 +G1 X 0.026 Y 14.558 Z 25.013 A -70.850 C -185.007 F 159 +G1 X -0.215 Y 14.360 Z 25.376 A -70.803 C -185.724 F 159 +G1 X -0.423 Y 14.154 Z 25.758 A -70.799 C -186.478 F 159 +G1 X -0.598 Y 13.941 Z 26.157 A -70.837 C -187.267 F 159 +G1 X -1.245 Y 12.902 Z 28.149 A -71.108 C -191.204 F 159 +G1 X -1.270 Y 12.847 Z 28.255 A -71.228 C -191.121 F 636 +G1 X -1.271 Y 12.803 Z 28.343 A -71.325 C -191.055 F 636 +G1 X -1.249 Y 12.771 Z 28.411 A -71.403 C -191.001 F 636 +G1 X -1.230 Y 12.759 Z 28.438 A -71.438 C -190.977 F 636 +G1 X -1.206 Y 12.750 Z 28.461 A -71.472 C -190.954 F 636 +G1 X -1.142 Y 12.740 Z 28.490 A -71.542 C -190.906 F 636 +G1 X -1.059 Y 12.741 Z 28.500 A -71.625 C -190.849 F 636 +G1 X -0.958 Y 12.754 Z 28.490 A -71.726 C -190.780 F 636 +G1 X -0.840 Y 12.777 Z 28.459 A -71.849 C -190.696 F 636 +G1 X -0.719 Y 12.809 Z 28.413 A -71.947 C -190.629 F 636 +G1 X -0.609 Y 12.844 Z 28.358 A -72.042 C -190.564 F 636 +G1 X -0.511 Y 12.884 Z 28.293 A -72.134 C -190.502 F 636 +G1 X -0.426 Y 12.927 Z 28.219 A -72.224 C -190.441 F 636 +G1 X -0.355 Y 12.974 Z 28.134 A -72.312 C -190.381 F 636 +G1 X -0.300 Y 13.025 Z 28.040 A -72.402 C -190.320 F 636 +G1 X -0.262 Y 13.079 Z 27.935 A -72.494 C -190.258 F 636 +G1 X -0.241 Y 13.138 Z 27.820 A -72.591 C -190.192 F 636 +G1 X -0.098 Y 13.948 Z 26.198 A -71.673 C -187.150 F 159 +G1 X -0.067 Y 14.062 Z 25.971 A -71.541 C -186.728 F 159 +G1 X -0.015 Y 14.175 Z 25.751 A -71.439 C -186.318 F 159 +G1 X 0.098 Y 14.338 Z 25.439 A -71.345 C -185.726 F 159 +G1 X 0.253 Y 14.493 Z 25.146 A -71.320 C -185.163 F 159 +G1 X 0.446 Y 14.635 Z 24.877 A -71.361 C -184.638 F 159 +G1 X 0.672 Y 14.763 Z 24.635 A -71.467 C -184.154 F 159 +G1 X 1.248 Y 15.013 Z 24.140 A -71.812 C -183.157 F 159 +G1 X 2.147 Y 15.365 Z 23.390 A -72.274 C -181.694 F 159 +G1 X 2.861 Y 15.616 Z 22.807 A -72.583 C -180.595 F 159 +G1 X 3.585 Y 15.848 Z 22.224 A -72.840 C -179.544 F 159 +G1 X 4.321 Y 16.060 Z 21.643 A -73.047 C -178.544 F 159 +G1 X 5.066 Y 16.252 Z 21.063 A -73.208 C -177.591 F 159 +G1 X 5.819 Y 16.425 Z 20.484 A -73.327 C -176.680 F 159 +G1 X 6.848 Y 16.629 Z 19.707 A -73.428 C -175.515 F 159 +G1 X 8.007 Y 16.817 Z 18.846 A -73.476 C -174.275 F 159 +G1 X 9.185 Y 16.966 Z 17.988 A -73.424 C -173.166 F 159 +G1 X 10.311 Y 17.070 Z 17.182 A -73.237 C -172.355 F 159 +G1 X 11.547 Y 17.145 Z 16.321 A -72.769 C -172.097 F 159 +G1 X 12.792 Y 17.183 Z 15.468 A -72.330 C -171.875 F 159 +G1 X 14.043 Y 17.186 Z 14.628 A -71.930 C -171.673 F 159 +G1 X 15.048 Y 17.164 Z 13.965 A -71.638 C -171.525 F 159 +G1 X 16.057 Y 17.122 Z 13.308 A -71.373 C -171.390 F 159 +G1 X 17.322 Y 17.041 Z 12.499 A -71.076 C -171.238 F 159 +G1 X 18.711 Y 16.936 Z 11.647 A -69.689 C -173.481 F 159 +G1 X 19.425 Y 16.874 Z 11.219 A -68.867 C -174.963 F 159 +G1 X 20.138 Y 16.813 Z 10.793 A -68.063 C -176.444 F 159 +G1 X 20.852 Y 16.742 Z 10.375 A -67.299 C -177.925 F 159 +G1 X 21.565 Y 16.673 Z 9.958 A -66.555 C -179.399 F 159 +G1 X 22.278 Y 16.593 Z 9.550 A -65.855 C -180.868 F 159 +G1 X 22.991 Y 16.515 Z 9.142 A -65.177 C -182.325 F 159 +G1 X 24.360 Y 16.347 Z 8.377 A -63.981 C -185.089 F 159 +G1 X 25.506 Y 16.193 Z 7.749 A -63.077 C -187.358 F 159 +G1 X 26.324 Y 16.072 Z 7.312 A -62.494 C -188.946 F 159 +G1 X 27.140 Y 15.953 Z 6.876 A -61.941 C -190.502 F 159 +G1 X 28.555 Y 15.725 Z 6.142 A -61.101 C -193.123 F 159 +G1 X 29.729 Y 15.525 Z 5.550 A -60.502 C -195.223 F 159 +G1 X 30.899 Y 15.326 Z 4.960 A -59.956 C -197.246 F 159 +G1 X 32.773 Y 15.038 Z 4.036 A -59.193 C -200.357 F 159 +G1 X 34.402 Y 14.804 Z 3.254 A -58.640 C -202.932 F 159 +G1 X 36.653 Y 14.585 Z 2.140 A -57.888 C -206.350 F 159 +G1 X 36.933 Y 14.566 Z 1.999 A -57.699 C -206.286 F 636 +G1 X 37.196 Y 14.564 Z 1.860 A -57.519 C -206.225 F 636 +G1 X 37.444 Y 14.578 Z 1.725 A -57.348 C -206.166 F 636 +G1 X 37.676 Y 14.609 Z 1.592 A -57.185 C -206.110 F 636 +G1 X 37.892 Y 14.655 Z 1.463 A -57.030 C -206.057 F 636 +G1 X 38.092 Y 14.715 Z 1.336 A -56.883 C -206.006 F 636 +G1 X 38.277 Y 14.791 Z 1.213 A -56.741 C -205.956 F 636 +G1 X 38.447 Y 14.880 Z 1.093 A -56.604 C -205.909 F 636 +G1 X 38.600 Y 14.983 Z 0.976 A -56.472 C -205.863 F 636 +G1 X 38.739 Y 15.099 Z 0.863 A -56.344 C -205.818 F 636 +G1 X 38.863 Y 15.227 Z 0.754 A -56.218 C -205.773 F 636 +G1 X 38.971 Y 15.366 Z 0.648 A -56.093 C -205.729 F 636 +G1 X 39.064 Y 15.517 Z 0.547 A -55.970 C -205.686 F 636 +G1 X 39.142 Y 15.679 Z 0.449 A -55.846 C -205.642 F 636 +G1 X 39.206 Y 15.851 Z 0.355 A -55.722 C -205.597 F 636 +G1 X 39.254 Y 16.033 Z 0.265 A -55.596 C -205.552 F 636 +G1 X 39.288 Y 16.223 Z 0.179 A -55.468 C -205.507 F 636 +G1 X 39.307 Y 16.423 Z 0.098 A -55.338 C -205.460 F 636 +G1 X 39.312 Y 16.630 Z 0.021 A -55.204 C -205.412 F 636 +G1 X 39.302 Y 16.845 Z -0.051 A -55.067 C -205.362 F 636 +G1 X 39.278 Y 17.068 Z -0.119 A -54.926 C -205.311 F 636 +G1 X 39.240 Y 17.296 Z -0.182 A -54.781 C -205.258 F 636 +G1 X 39.187 Y 17.531 Z -0.241 A -54.632 C -205.203 F 636 +G1 X 39.120 Y 17.771 Z -0.294 A -54.479 C -205.147 F 636 +G1 X 39.040 Y 18.016 Z -0.342 A -54.321 C -205.089 F 636 +G1 X 38.945 Y 18.265 Z -0.386 A -54.158 C -205.028 F 636 +G1 X 38.836 Y 18.518 Z -0.424 A -53.990 C -204.966 F 636 +G1 X 38.714 Y 18.775 Z -0.457 A -53.818 C -204.902 F 636 +G1 X 38.578 Y 19.034 Z -0.484 A -53.641 C -204.835 F 636 +G1 X 38.428 Y 19.295 Z -0.506 A -53.459 C -204.767 F 636 +G1 X 38.265 Y 19.559 Z -0.522 A -53.272 C -204.696 F 636 +G1 X 38.089 Y 19.823 Z -0.533 A -53.081 C -204.623 F 636 +G1 X 37.903 Y 20.086 Z -0.538 A -52.916 C -204.559 F 636 +G1 X 37.712 Y 20.343 Z -0.538 A -52.751 C -204.496 F 636 +G1 X 37.517 Y 20.594 Z -0.533 A -52.588 C -204.433 F 636 +G1 X 37.317 Y 20.838 Z -0.523 A -52.425 C -204.370 F 636 +G1 X 37.113 Y 21.076 Z -0.508 A -52.264 C -204.307 F 636 +G1 X 36.905 Y 21.306 Z -0.488 A -52.104 C -204.244 F 636 +G1 X 36.693 Y 21.529 Z -0.463 A -51.946 C -204.182 F 636 +G1 X 36.477 Y 21.743 Z -0.433 A -51.789 C -204.120 F 636 +G1 X 36.258 Y 21.948 Z -0.397 A -51.634 C -204.058 F 636 +G1 X 36.036 Y 22.144 Z -0.356 A -51.481 C -203.997 F 636 +G1 X 35.811 Y 22.330 Z -0.310 A -51.329 C -203.937 F 636 +G1 X 35.583 Y 22.505 Z -0.259 A -51.179 C -203.876 F 636 +G1 X 35.352 Y 22.670 Z -0.203 A -51.031 C -203.816 F 636 +G1 X 35.120 Y 22.823 Z -0.141 A -50.885 C -203.757 F 636 +G1 X 34.885 Y 22.964 Z -0.074 A -50.741 C -203.698 F 636 +G1 X 34.648 Y 23.093 Z -0.002 A -50.598 C -203.639 F 636 +G1 X 34.410 Y 23.209 Z 0.075 A -50.456 C -203.581 F 636 +G1 X 34.170 Y 23.312 Z 0.158 A -50.316 C -203.523 F 636 +G1 X 33.929 Y 23.400 Z 0.247 A -50.177 C -203.466 F 636 +G1 X 33.688 Y 23.475 Z 0.340 A -50.039 C -203.408 F 636 +G1 X 33.445 Y 23.534 Z 0.440 A -49.901 C -203.351 F 636 +G1 X 33.202 Y 23.578 Z 0.544 A -49.764 C -203.293 F 636 +G1 X 32.959 Y 23.606 Z 0.654 A -49.627 C -203.235 F 636 +G1 X 32.715 Y 23.618 Z 0.770 A -49.489 C -203.176 F 636 +G1 X 32.472 Y 23.613 Z 0.891 A -49.350 C -203.117 F 636 +G1 X 32.229 Y 23.590 Z 1.017 A -49.209 C -203.057 F 636 +G1 X 31.986 Y 23.550 Z 1.149 A -49.066 C -202.996 F 636 +G1 X 31.744 Y 23.491 Z 1.287 A -48.921 C -202.933 F 636 +G1 X 31.504 Y 23.413 Z 1.430 A -48.772 C -202.869 F 636 +G1 X 31.264 Y 23.316 Z 1.579 A -48.620 C -202.802 F 636 +G1 X 31.026 Y 23.199 Z 1.733 A -48.463 C -202.734 F 636 +G1 X 30.790 Y 23.062 Z 1.893 A -48.302 C -202.663 F 636 +G1 X 29.336 Y 22.149 Z 2.900 A -50.315 C -198.535 F 159 +G1 X 29.150 Y 22.037 Z 3.027 A -50.578 C -198.020 F 159 +G1 X 28.760 Y 21.835 Z 3.283 A -51.085 C -196.972 F 159 +G1 X 28.348 Y 21.664 Z 3.540 A -51.565 C -195.898 F 159 +G1 X 27.911 Y 21.527 Z 3.797 A -52.016 C -194.791 F 159 +G1 X 27.451 Y 21.425 Z 4.051 A -52.433 C -193.653 F 159 +G1 X 26.127 Y 21.239 Z 4.755 A -53.548 C -190.424 F 159 +G1 X 25.282 Y 21.125 Z 5.209 A -54.325 C -188.354 F 159 +G1 X 24.563 Y 21.026 Z 5.611 A -55.055 C -186.589 F 159 +G1 X 23.842 Y 20.927 Z 6.015 A -55.820 C -184.823 F 159 +G1 X 23.126 Y 20.827 Z 6.431 A -56.642 C -183.075 F 159 +G1 X 22.408 Y 20.729 Z 6.849 A -57.496 C -181.333 F 159 +G1 X 21.696 Y 20.628 Z 7.277 A -58.403 C -179.615 F 159 +G1 X 20.983 Y 20.530 Z 7.708 A -59.339 C -177.910 F 159 +G1 X 20.252 Y 20.427 Z 8.164 A -60.355 C -176.180 F 159 +G1 X 19.520 Y 20.326 Z 8.621 A -61.395 C -174.471 F 159 +G1 X 18.817 Y 20.226 Z 9.075 A -62.445 C -172.851 F 159 +G1 X 18.113 Y 20.129 Z 9.530 A -63.511 C -171.254 F 159 +G1 X 17.416 Y 20.029 Z 9.994 A -64.611 C -169.699 F 159 +G1 X 16.728 Y 19.932 Z 10.454 A -65.628 C -168.359 F 159 +G1 X 15.510 Y 19.731 Z 11.322 A -66.256 C -168.701 F 159 +G1 X 14.303 Y 19.517 Z 12.204 A -66.919 C -169.058 F 159 +G1 X 13.108 Y 19.289 Z 13.101 A -67.618 C -169.431 F 159 +G1 X 11.911 Y 19.041 Z 14.021 A -68.358 C -169.823 F 159 +G1 X 10.749 Y 18.780 Z 14.937 A -69.116 C -170.221 F 159 +G1 X 9.626 Y 18.507 Z 15.844 A -69.871 C -170.653 F 159 +G1 X 8.507 Y 18.204 Z 16.777 A -70.391 C -171.651 F 159 +G1 X 7.412 Y 17.882 Z 17.712 A -70.779 C -172.835 F 159 +G1 X 6.336 Y 17.535 Z 18.653 A -71.062 C -174.150 F 159 +G1 X 5.281 Y 17.164 Z 19.599 A -71.271 C -175.523 F 159 +G1 X 4.342 Y 16.804 Z 20.462 A -71.384 C -176.844 F 159 +G1 X 3.364 Y 16.395 Z 21.386 A -71.415 C -178.341 F 159 +G1 X 2.376 Y 15.944 Z 22.348 A -71.336 C -180.002 F 159 +G1 X 1.418 Y 15.464 Z 23.312 A -71.142 C -181.761 F 159 +G1 X 0.704 Y 15.078 Z 24.051 A -70.918 C -183.166 F 159 +G1 X 0.251 Y 14.814 Z 24.540 A -70.740 C -184.121 F 159 +G1 X -0.031 Y 14.628 Z 24.876 A -70.634 C -184.787 F 159 +G1 X -0.296 Y 14.436 Z 25.223 A -70.542 C -185.481 F 159 +G1 X -0.544 Y 14.237 Z 25.580 A -70.462 C -186.202 F 159 +G1 X -0.882 Y 13.931 Z 26.133 A -70.362 C -187.327 F 159 +G1 X -1.750 Y 12.918 Z 28.012 A -70.183 C -191.109 F 159 +G1 X -1.788 Y 12.867 Z 28.107 A -70.304 C -191.070 F 636 +G1 X -1.812 Y 12.820 Z 28.197 A -70.414 C -191.034 F 636 +G1 X -1.822 Y 12.777 Z 28.282 A -70.515 C -191.002 F 636 +G1 X -1.820 Y 12.737 Z 28.360 A -70.607 C -190.972 F 636 +G1 X -1.805 Y 12.702 Z 28.433 A -70.694 C -190.944 F 636 +G1 X -1.778 Y 12.671 Z 28.499 A -70.776 C -190.918 F 636 +G1 X -1.740 Y 12.644 Z 28.559 A -70.856 C -190.892 F 636 +G1 X -1.691 Y 12.621 Z 28.613 A -70.936 C -190.866 F 636 +G1 X -1.631 Y 12.602 Z 28.659 A -71.019 C -190.840 F 636 +G1 X -1.562 Y 12.587 Z 28.699 A -71.104 C -190.813 F 636 +G1 X -1.484 Y 12.577 Z 28.732 A -71.194 C -190.784 F 636 +G1 X -1.397 Y 12.570 Z 28.758 A -71.290 C -190.753 F 636 +G1 X -1.301 Y 12.568 Z 28.777 A -71.393 C -190.720 F 636 +G1 X -1.199 Y 12.570 Z 28.787 A -71.502 C -190.686 F 636 +G1 X -1.089 Y 12.577 Z 28.791 A -71.618 C -190.649 F 636 +G1 X -0.972 Y 12.588 Z 28.786 A -71.741 C -190.609 F 636 +G1 X -0.740 Y 12.619 Z 28.758 A -71.955 C -190.542 F 636 +G1 X -0.630 Y 12.639 Z 28.735 A -72.058 C -190.509 F 636 +G1 X -0.524 Y 12.661 Z 28.706 A -72.159 C -190.477 F 636 +G1 X -0.424 Y 12.686 Z 28.671 A -72.258 C -190.446 F 636 +G1 X -0.330 Y 12.714 Z 28.630 A -72.354 C -190.416 F 636 +G1 X -0.242 Y 12.744 Z 28.583 A -72.448 C -190.386 F 636 +G1 X -0.162 Y 12.776 Z 28.530 A -72.541 C -190.357 F 636 +G1 X -0.089 Y 12.812 Z 28.471 A -72.632 C -190.328 F 636 +G1 X -0.024 Y 12.849 Z 28.405 A -72.722 C -190.300 F 636 +G1 X 0.033 Y 12.889 Z 28.333 A -72.812 C -190.271 F 636 +G1 X 0.080 Y 12.932 Z 28.254 A -72.904 C -190.243 F 636 +G1 X 0.117 Y 12.977 Z 28.170 A -72.997 C -190.213 F 636 +G1 X 0.144 Y 13.025 Z 28.078 A -73.094 C -190.183 F 636 +G1 X 0.160 Y 13.074 Z 27.980 A -73.194 C -190.152 F 636 +G1 X 0.164 Y 13.127 Z 27.875 A -73.300 C -190.119 F 636 +G1 X 0.142 Y 13.946 Z 26.218 A -72.073 C -187.090 F 159 +G1 X 0.144 Y 14.065 Z 25.979 A -71.881 C -186.662 F 159 +G1 X 0.175 Y 14.182 Z 25.747 A -71.735 C -186.241 F 159 +G1 X 0.234 Y 14.296 Z 25.526 A -71.634 C -185.831 F 159 +G1 X 0.319 Y 14.404 Z 25.317 A -71.579 C -185.438 F 159 +G1 X 0.416 Y 14.497 Z 25.140 A -71.566 C -185.099 F 159 +G1 X 0.532 Y 14.583 Z 24.976 A -71.587 C -184.778 F 159 +G1 X 0.736 Y 14.699 Z 24.753 A -71.678 C -184.334 F 159 +G1 X 0.811 Y 14.734 Z 24.685 A -71.725 C -184.196 F 159 +G1 X 1.454 Y 14.982 Z 24.177 A -72.152 C -183.157 F 159 +G1 X 2.179 Y 15.235 Z 23.617 A -72.581 C -182.045 F 159 +G1 X 2.915 Y 15.464 Z 23.057 A -72.966 C -180.966 F 159 +G1 X 3.663 Y 15.671 Z 22.499 A -73.302 C -179.934 F 159 +G1 X 4.420 Y 15.855 Z 21.942 A -73.588 C -178.953 F 159 +G1 X 5.188 Y 16.017 Z 21.386 A -73.829 C -178.019 F 159 +G1 X 5.963 Y 16.157 Z 20.831 A -74.029 C -177.128 F 159 +G1 X 6.725 Y 16.271 Z 20.293 A -74.187 C -176.299 F 159 +G1 X 7.501 Y 16.367 Z 19.751 A -74.313 C -175.498 F 159 +G1 X 8.295 Y 16.443 Z 19.202 A -74.415 C -174.705 F 159 +G1 X 9.098 Y 16.498 Z 18.654 A -74.467 C -173.981 F 159 +G1 X 10.075 Y 16.537 Z 17.993 A -74.490 C -173.151 F 159 +G1 X 10.906 Y 16.548 Z 17.442 A -74.310 C -172.870 F 159 +G1 X 12.168 Y 16.527 Z 16.618 A -73.959 C -172.695 F 159 +G1 X 13.435 Y 16.462 Z 15.803 A -73.645 C -172.538 F 159 +G1 X 14.703 Y 16.356 Z 15.000 A -73.369 C -172.400 F 159 +G1 X 15.975 Y 16.209 Z 14.208 A -73.131 C -172.281 F 159 +G1 X 17.296 Y 16.016 Z 13.397 A -72.921 C -172.176 F 159 +G1 X 18.645 Y 15.797 Z 12.591 A -72.031 C -173.609 F 159 +G1 X 19.354 Y 15.673 Z 12.178 A -71.279 C -175.033 F 159 +G1 X 20.063 Y 15.552 Z 11.765 A -70.545 C -176.450 F 159 +G1 X 21.474 Y 15.282 Z 10.956 A -69.169 C -179.250 F 159 +G1 X 22.657 Y 15.037 Z 10.288 A -68.103 C -181.559 F 159 +G1 X 23.982 Y 14.741 Z 9.550 A -67.007 C -184.092 F 159 +G1 X 25.373 Y 14.404 Z 8.788 A -65.970 C -186.674 F 159 +G1 X 26.897 Y 14.006 Z 7.968 A -64.967 C -189.400 F 159 +G1 X 28.269 Y 13.621 Z 7.245 A -64.181 C -191.748 F 159 +G1 X 29.631 Y 13.214 Z 6.540 A -63.504 C -193.975 F 159 +G1 X 30.985 Y 12.784 Z 5.854 A -62.929 C -196.078 F 159 +G1 X 32.332 Y 12.333 Z 5.185 A -62.447 C -198.060 F 159 +G1 X 33.671 Y 11.862 Z 4.536 A -62.049 C -199.924 F 159 +G1 X 35.004 Y 11.371 Z 3.905 A -61.729 C -201.672 F 159 +G1 X 36.129 Y 10.940 Z 3.385 A -61.511 C -203.066 F 159 +G1 X 38.274 Y 10.232 Z 2.363 A -61.061 C -205.626 F 159 +G1 X 38.512 Y 10.158 Z 2.248 A -60.899 C -205.579 F 636 +G1 X 38.745 Y 10.094 Z 2.133 A -60.743 C -205.534 F 636 +G1 X 38.970 Y 10.041 Z 2.018 A -60.591 C -205.490 F 636 +G1 X 39.189 Y 9.998 Z 1.904 A -60.444 C -205.447 F 636 +G1 X 39.402 Y 9.966 Z 1.790 A -60.301 C -205.405 F 636 +G1 X 39.609 Y 9.944 Z 1.676 A -60.162 C -205.364 F 636 +G1 X 39.808 Y 9.931 Z 1.563 A -60.027 C -205.324 F 636 +G1 X 40.002 Y 9.928 Z 1.451 A -59.896 C -205.286 F 636 +G1 X 40.189 Y 9.935 Z 1.339 A -59.768 C -205.248 F 636 +G1 X 40.369 Y 9.951 Z 1.227 A -59.644 C -205.211 F 636 +G1 X 40.543 Y 9.976 Z 1.116 A -59.522 C -205.175 F 636 +G1 X 40.711 Y 10.010 Z 1.006 A -59.402 C -205.139 F 636 +G1 X 40.872 Y 10.052 Z 0.897 A -59.286 C -205.104 F 636 +G1 X 41.027 Y 10.104 Z 0.788 A -59.171 C -205.069 F 636 +G1 X 41.176 Y 10.163 Z 0.681 A -59.058 C -205.035 F 636 +G1 X 41.318 Y 10.231 Z 0.574 A -58.946 C -205.002 F 636 +G1 X 41.454 Y 10.306 Z 0.468 A -58.836 C -204.969 F 636 +G1 X 41.584 Y 10.390 Z 0.363 A -58.726 C -204.935 F 636 +G1 X 41.707 Y 10.481 Z 0.259 A -58.618 C -204.902 F 636 +G1 X 41.824 Y 10.579 Z 0.156 A -58.510 C -204.870 F 636 +G1 X 41.935 Y 10.684 Z 0.054 A -58.402 C -204.837 F 636 +G1 X 42.039 Y 10.797 Z -0.046 A -58.295 C -204.804 F 636 +G1 X 42.138 Y 10.916 Z -0.146 A -58.187 C -204.771 F 636 +G1 X 42.230 Y 11.042 Z -0.244 A -58.079 C -204.738 F 636 +G1 X 42.315 Y 11.175 Z -0.341 A -57.971 C -204.704 F 636 +G1 X 42.395 Y 11.314 Z -0.436 A -57.862 C -204.671 F 636 +G1 X 42.468 Y 11.458 Z -0.531 A -57.752 C -204.637 F 636 +G1 X 42.536 Y 11.609 Z -0.623 A -57.641 C -204.602 F 636 +G1 X 42.597 Y 11.765 Z -0.715 A -57.529 C -204.567 F 636 +G1 X 42.651 Y 11.927 Z -0.805 A -57.416 C -204.532 F 636 +G1 X 42.700 Y 12.094 Z -0.893 A -57.302 C -204.496 F 636 +G1 X 42.743 Y 12.267 Z -0.980 A -57.186 C -204.460 F 636 +G1 X 42.779 Y 12.444 Z -1.065 A -57.069 C -204.423 F 636 +G1 X 42.809 Y 12.626 Z -1.148 A -56.951 C -204.386 F 636 +G1 X 42.852 Y 13.003 Z -1.309 A -56.709 C -204.310 F 636 +G1 X 42.870 Y 13.397 Z -1.463 A -56.462 C -204.231 F 636 +G1 X 42.864 Y 13.807 Z -1.610 A -56.207 C -204.149 F 636 +G1 X 42.833 Y 14.230 Z -1.748 A -55.946 C -204.065 F 636 +G1 X 42.779 Y 14.665 Z -1.878 A -55.679 C -203.978 F 636 +G1 X 42.701 Y 15.111 Z -1.999 A -55.405 C -203.889 F 636 +G1 X 42.599 Y 15.566 Z -2.111 A -55.125 C -203.797 F 636 +G1 X 42.474 Y 16.029 Z -2.213 A -54.838 C -203.702 F 636 +G1 X 42.325 Y 16.498 Z -2.306 A -54.546 C -203.604 F 636 +G1 X 42.152 Y 16.971 Z -2.388 A -54.248 C -203.504 F 636 +G1 X 41.956 Y 17.448 Z -2.460 A -53.944 C -203.401 F 636 +G1 X 41.737 Y 17.926 Z -2.521 A -53.635 C -203.295 F 636 +G1 X 41.494 Y 18.404 Z -2.570 A -53.321 C -203.187 F 636 +G1 X 41.229 Y 18.881 Z -2.608 A -53.002 C -203.076 F 636 +G1 X 40.940 Y 19.355 Z -2.634 A -52.678 C -202.963 F 636 +G1 X 40.634 Y 19.825 Z -2.649 A -52.394 C -202.862 F 636 +G1 X 40.316 Y 20.291 Z -2.653 A -52.107 C -202.760 F 636 +G1 X 39.986 Y 20.750 Z -2.648 A -51.821 C -202.657 F 636 +G1 X 39.645 Y 21.203 Z -2.633 A -51.533 C -202.553 F 636 +G1 X 39.295 Y 21.647 Z -2.607 A -51.246 C -202.448 F 636 +G1 X 38.935 Y 22.081 Z -2.572 A -50.960 C -202.343 F 636 +G1 X 38.566 Y 22.504 Z -2.527 A -50.675 C -202.237 F 636 +G1 X 38.190 Y 22.914 Z -2.473 A -50.392 C -202.131 F 636 +G1 X 37.807 Y 23.309 Z -2.408 A -50.111 C -202.025 F 636 +G1 X 37.417 Y 23.690 Z -2.333 A -49.833 C -201.919 F 636 +G1 X 37.021 Y 24.053 Z -2.249 A -49.558 C -201.813 F 636 +G1 X 36.621 Y 24.398 Z -2.155 A -49.287 C -201.708 F 636 +G1 X 36.216 Y 24.723 Z -2.052 A -49.019 C -201.603 F 636 +G1 X 35.808 Y 25.028 Z -1.938 A -48.756 C -201.499 F 636 +G1 X 35.397 Y 25.310 Z -1.815 A -48.496 C -201.396 F 636 +G1 X 34.984 Y 25.568 Z -1.682 A -48.241 C -201.294 F 636 +G1 X 34.569 Y 25.801 Z -1.540 A -47.991 C -201.193 F 636 +G1 X 34.154 Y 26.007 Z -1.388 A -47.745 C -201.093 F 636 +G1 X 33.739 Y 26.186 Z -1.226 A -47.503 C -200.993 F 636 +G1 X 33.532 Y 26.264 Z -1.142 A -47.383 C -200.944 F 636 +G1 X 33.325 Y 26.335 Z -1.055 A -47.265 C -200.895 F 636 +G1 X 33.118 Y 26.398 Z -0.966 A -47.147 C -200.846 F 636 +G1 X 32.912 Y 26.453 Z -0.875 A -47.030 C -200.797 F 636 +G1 X 32.706 Y 26.500 Z -0.781 A -46.913 C -200.748 F 636 +G1 X 32.501 Y 26.539 Z -0.684 A -46.798 C -200.699 F 636 +G1 X 32.297 Y 26.570 Z -0.586 A -46.682 C -200.650 F 636 +G1 X 32.094 Y 26.592 Z -0.485 A -46.567 C -200.602 F 636 +G1 X 31.891 Y 26.606 Z -0.381 A -46.453 C -200.553 F 636 +G1 X 31.690 Y 26.610 Z -0.276 A -46.338 C -200.504 F 636 +G1 X 31.489 Y 26.606 Z -0.168 A -46.224 C -200.454 F 636 +G1 X 31.290 Y 26.592 Z -0.057 A -46.109 C -200.405 F 636 +G1 X 31.092 Y 26.569 Z 0.056 A -45.994 C -200.355 F 636 +G1 X 30.896 Y 26.536 Z 0.171 A -45.878 C -200.304 F 636 +G1 X 30.701 Y 26.493 Z 0.288 A -45.761 C -200.254 F 636 +G1 X 30.507 Y 26.441 Z 0.408 A -45.644 C -200.202 F 636 +G1 X 30.315 Y 26.379 Z 0.530 A -45.525 C -200.150 F 636 +G1 X 30.125 Y 26.306 Z 0.655 A -45.405 C -200.097 F 636 +G1 X 29.937 Y 26.223 Z 0.782 A -45.284 C -200.043 F 636 +G1 X 29.750 Y 26.129 Z 0.911 A -45.161 C -199.988 F 636 +G1 X 29.566 Y 26.024 Z 1.043 A -45.035 C -199.931 F 636 +G1 X 29.384 Y 25.908 Z 1.176 A -44.908 C -199.874 F 636 +G1 X 29.204 Y 25.782 Z 1.313 A -44.778 C -199.815 F 636 +G1 X 29.026 Y 25.644 Z 1.451 A -44.645 C -199.755 F 636 +G1 X 28.850 Y 25.494 Z 1.592 A -44.509 C -199.693 F 636 +G1 X 28.677 Y 25.333 Z 1.735 A -44.371 C -199.629 F 636 +G1 X 27.440 Y 24.130 Z 2.774 A -47.126 C -195.359 F 159 +G1 X 27.297 Y 23.992 Z 2.895 A -47.454 C -194.887 F 159 +G1 X 27.057 Y 23.810 Z 3.076 A -47.910 C -194.139 F 159 +G1 X 26.788 Y 23.660 Z 3.255 A -48.321 C -193.342 F 159 +G1 X 26.489 Y 23.545 Z 3.433 A -48.684 C -192.492 F 159 +G1 X 25.340 Y 23.259 Z 4.058 A -49.856 C -189.332 F 159 +G1 X 24.513 Y 23.060 Z 4.511 A -50.764 C -187.078 F 159 +G1 X 23.802 Y 22.887 Z 4.919 A -51.623 C -185.155 F 159 +G1 X 23.089 Y 22.715 Z 5.329 A -52.522 C -183.247 F 159 +G1 X 22.383 Y 22.544 Z 5.752 A -53.481 C -181.378 F 159 +G1 X 21.676 Y 22.376 Z 6.177 A -54.475 C -179.532 F 159 +G1 X 20.974 Y 22.208 Z 6.614 A -55.523 C -177.730 F 159 +G1 X 20.272 Y 22.042 Z 7.053 A -56.599 C -175.958 F 159 +G1 X 19.507 Y 21.861 Z 7.550 A -57.837 C -174.065 F 159 +G1 X 18.741 Y 21.683 Z 8.049 A -59.100 C -172.213 F 159 +G1 X 17.984 Y 21.505 Z 8.561 A -60.408 C -170.425 F 159 +G1 X 17.227 Y 21.330 Z 9.074 A -61.731 C -168.682 F 159 +G1 X 15.940 Y 21.017 Z 9.993 A -63.458 C -167.154 F 159 +G1 X 14.759 Y 20.702 Z 10.886 A -64.269 C -167.609 F 159 +G1 X 13.590 Y 20.379 Z 11.793 A -65.108 C -168.073 F 159 +G1 X 12.435 Y 20.048 Z 12.716 A -65.974 C -168.547 F 159 +G1 X 11.031 Y 19.625 Z 13.872 A -67.078 C -169.142 F 159 +G1 X 10.022 Y 19.307 Z 14.725 A -67.904 C -169.583 F 159 +G1 X 8.915 Y 18.939 Z 15.687 A -68.762 C -170.256 F 159 +G1 X 7.847 Y 18.557 Z 16.647 A -69.338 C -171.456 F 159 +G1 X 6.797 Y 18.160 Z 17.612 A -69.829 C -172.729 F 159 +G1 X 5.766 Y 17.746 Z 18.585 A -70.233 C -174.083 F 159 +G1 X 4.758 Y 17.313 Z 19.563 A -70.546 C -175.517 F 159 +G1 X 3.921 Y 16.929 Z 20.396 A -70.737 C -176.801 F 159 +G1 X 3.275 Y 16.617 Z 21.055 A -70.835 C -177.860 F 159 +G1 X 2.327 Y 16.129 Z 22.047 A -70.885 C -179.543 F 159 +G1 X 1.407 Y 15.619 Z 23.041 A -70.814 C -181.327 F 159 +G1 X 0.698 Y 15.198 Z 23.833 A -70.677 C -182.803 F 159 +G1 X -0.108 Y 14.686 Z 24.763 A -70.411 C -184.615 F 159 +G1 X -0.670 Y 14.305 Z 25.433 A -70.140 C -185.982 F 159 +G1 X -1.216 Y 13.913 Z 26.106 A -69.806 C -187.390 F 159 +G1 X -2.297 Y 12.932 Z 27.850 A -69.177 C -190.959 F 159 +G1 X -10.694 Y 7.679 Z 27.743 A -71.841 C -241.650 F 636 +G1 X -11.117 Y 8.428 Z 26.178 A -71.266 C -238.639 F 159 +G1 X -11.189 Y 8.604 Z 25.858 A -71.158 C -238.024 F 159 +G1 X -11.238 Y 8.799 Z 25.552 A -71.093 C -237.435 F 159 +G1 X -11.265 Y 9.014 Z 25.262 A -71.073 C -236.871 F 159 +G1 X -11.269 Y 9.246 Z 24.986 A -71.096 C -236.334 F 159 +G1 X -11.248 Y 9.494 Z 24.729 A -71.164 C -235.827 F 159 +G1 X -11.213 Y 9.704 Z 24.534 A -71.252 C -235.438 F 159 +G1 X -11.062 Y 10.346 Z 23.987 A -71.566 C -234.352 F 159 +G1 X -10.796 Y 11.317 Z 23.162 A -71.965 C -232.772 F 159 +G1 X -10.577 Y 12.027 Z 22.558 A -72.202 C -231.655 F 159 +G1 X -10.336 Y 12.736 Z 21.956 A -72.387 C -230.590 F 159 +G1 X -10.076 Y 13.442 Z 21.354 A -72.522 C -229.575 F 159 +G1 X -9.662 Y 14.462 Z 20.484 A -72.638 C -228.183 F 159 +G1 X -9.238 Y 15.416 Z 19.669 A -72.669 C -226.953 F 159 +G1 X -8.733 Y 16.455 Z 18.778 A -72.625 C -225.684 F 159 +G1 X -8.191 Y 17.488 Z 17.890 A -72.500 C -224.500 F 159 +G1 X -7.810 Y 18.171 Z 17.302 A -72.381 C -223.744 F 159 +G1 X -7.183 Y 19.226 Z 16.396 A -71.935 C -223.104 F 159 +G1 X -6.529 Y 20.261 Z 15.512 A -71.371 C -222.817 F 159 +G1 X -5.844 Y 21.285 Z 14.638 A -70.844 C -222.548 F 159 +G1 X -5.148 Y 22.274 Z 13.797 A -70.367 C -222.303 F 159 +G1 X -4.415 Y 23.270 Z 12.954 A -69.921 C -222.072 F 159 +G1 X -3.652 Y 24.263 Z 12.117 A -69.512 C -221.860 F 159 +G1 X -2.820 Y 25.309 Z 11.258 A -68.408 C -223.205 F 159 +G1 X -2.371 Y 25.862 Z 10.817 A -67.494 C -224.723 F 159 +G1 X -1.924 Y 26.416 Z 10.377 A -66.596 C -226.248 F 159 +G1 X -1.468 Y 26.968 Z 9.946 A -65.737 C -227.788 F 159 +G1 X -1.014 Y 27.520 Z 9.515 A -64.898 C -229.331 F 159 +G1 X -0.553 Y 28.070 Z 9.094 A -64.103 C -230.880 F 159 +G1 X -0.095 Y 28.620 Z 8.674 A -63.332 C -232.425 F 159 +G1 X 0.390 Y 29.188 Z 8.248 A -62.581 C -234.032 F 159 +G1 X 0.871 Y 29.756 Z 7.823 A -61.858 C -235.629 F 159 +G1 X 1.812 Y 30.844 Z 7.027 A -60.593 C -238.679 F 159 +G1 X 2.782 Y 31.947 Z 6.238 A -59.462 C -241.732 F 159 +G1 X 3.744 Y 33.021 Z 5.489 A -58.507 C -244.650 F 159 +G1 X 4.386 Y 33.733 Z 5.002 A -57.948 C -246.542 F 159 +G1 X 4.998 Y 34.458 Z 4.516 A -57.404 C -248.395 F 159 +G1 X 5.579 Y 35.204 Z 4.026 A -56.865 C -250.227 F 159 +G1 X 6.042 Y 35.840 Z 3.618 A -56.426 C -251.740 F 159 +G1 X 6.571 Y 36.616 Z 3.134 A -55.918 C -253.531 F 159 +G1 X 7.772 Y 38.543 Z 1.937 A -54.730 C -257.774 F 159 +G1 X 7.864 Y 38.706 Z 1.837 A -54.607 C -257.697 F 636 +G1 X 7.932 Y 38.859 Z 1.743 A -54.496 C -257.626 F 636 +G1 X 7.978 Y 39.002 Z 1.655 A -54.395 C -257.563 F 636 +G1 X 8.000 Y 39.135 Z 1.574 A -54.304 C -257.504 F 636 +G1 X 8.001 Y 39.259 Z 1.500 A -54.220 C -257.451 F 636 +G1 X 7.980 Y 39.371 Z 1.432 A -54.143 C -257.402 F 636 +G1 X 7.937 Y 39.474 Z 1.371 A -54.070 C -257.355 F 636 +G1 X 7.873 Y 39.565 Z 1.317 A -53.998 C -257.310 F 636 +G1 X 7.789 Y 39.646 Z 1.270 A -53.926 C -257.263 F 636 +G1 X 7.685 Y 39.715 Z 1.230 A -53.850 C -257.214 F 636 +G1 X 7.562 Y 39.773 Z 1.198 A -53.769 C -257.162 F 636 +G1 X 7.420 Y 39.819 Z 1.172 A -53.681 C -257.105 F 636 +G1 X 7.259 Y 39.853 Z 1.154 A -53.585 C -257.043 F 636 +G1 X 7.080 Y 39.876 Z 1.143 A -53.480 C -256.975 F 636 +G1 X 6.883 Y 39.886 Z 1.139 A -53.366 C -256.901 F 636 +G1 X 6.669 Y 39.884 Z 1.143 A -53.243 C -256.820 F 636 +G1 X 6.450 Y 39.870 Z 1.153 A -53.142 C -256.754 F 636 +G1 X 6.237 Y 39.847 Z 1.170 A -53.043 C -256.689 F 636 +G1 X 6.031 Y 39.814 Z 1.192 A -52.947 C -256.625 F 636 +G1 X 5.833 Y 39.771 Z 1.221 A -52.853 C -256.563 F 636 +G1 X 5.643 Y 39.718 Z 1.256 A -52.761 C -256.502 F 636 +G1 X 5.461 Y 39.654 Z 1.297 A -52.671 C -256.442 F 636 +G1 X 5.288 Y 39.579 Z 1.344 A -52.582 C -256.382 F 636 +G1 X 5.125 Y 39.494 Z 1.398 A -52.494 C -256.323 F 636 +G1 X 4.971 Y 39.398 Z 1.457 A -52.407 C -256.265 F 636 +G1 X 4.828 Y 39.291 Z 1.524 A -52.319 C -256.206 F 636 +G1 X 4.696 Y 39.173 Z 1.596 A -52.231 C -256.147 F 636 +G1 X 4.575 Y 39.043 Z 1.676 A -52.142 C -256.087 F 636 +G1 X 4.465 Y 38.902 Z 1.761 A -52.052 C -256.025 F 636 +G1 X 4.369 Y 38.748 Z 1.853 A -51.959 C -255.962 F 636 +G1 X 4.284 Y 38.583 Z 1.952 A -51.863 C -255.896 F 636 +G1 X 4.213 Y 38.406 Z 2.058 A -51.763 C -255.828 F 636 +G1 X 3.649 Y 36.792 Z 3.017 A -53.155 C -252.078 F 159 +G1 X 3.464 Y 36.313 Z 3.301 A -53.584 C -250.949 F 159 +G1 X 3.254 Y 35.837 Z 3.589 A -54.009 C -249.807 F 159 +G1 X 3.046 Y 35.419 Z 3.846 A -54.380 C -248.781 F 159 +G1 X 2.816 Y 35.003 Z 4.104 A -54.744 C -247.738 F 159 +G1 X 2.443 Y 34.411 Z 4.476 A -55.254 C -246.206 F 159 +G1 X 1.736 Y 33.436 Z 5.099 A -56.092 C -243.563 F 159 +G1 X 0.881 Y 32.267 Z 5.868 A -57.235 C -240.333 F 159 +G1 X 0.458 Y 31.682 Z 6.265 A -57.877 C -238.706 F 159 +G1 X 0.033 Y 31.096 Z 6.663 A -58.550 C -237.067 F 159 +G1 X -0.386 Y 30.510 Z 7.073 A -59.277 C -235.430 F 159 +G1 X -0.808 Y 29.924 Z 7.484 A -60.034 C -233.787 F 159 +G1 X -1.194 Y 29.380 Z 7.876 A -60.782 C -232.271 F 159 +G1 X -1.582 Y 28.836 Z 8.268 A -61.554 C -230.756 F 159 +G1 X -1.965 Y 28.293 Z 8.669 A -62.366 C -229.254 F 159 +G1 X -2.350 Y 27.750 Z 9.072 A -63.200 C -227.758 F 159 +G1 X -2.758 Y 27.165 Z 9.514 A -64.138 C -226.168 F 159 +G1 X -3.168 Y 26.582 Z 9.958 A -65.096 C -224.589 F 159 +G1 X -3.571 Y 25.999 Z 10.410 A -66.091 C -223.038 F 159 +G1 X -3.977 Y 25.418 Z 10.864 A -67.099 C -221.504 F 159 +G1 X -4.695 Y 24.356 Z 11.727 A -67.941 C -221.034 F 159 +G1 X -5.371 Y 23.318 Z 12.587 A -68.469 C -221.313 F 159 +G1 X -6.025 Y 22.276 Z 13.460 A -69.036 C -221.610 F 159 +G1 X -6.671 Y 21.202 Z 14.369 A -69.656 C -221.934 F 159 +G1 X -7.277 Y 20.147 Z 15.269 A -70.298 C -222.266 F 159 +G1 X -7.795 Y 19.201 Z 16.081 A -70.898 C -222.581 F 159 +G1 X -8.279 Y 18.263 Z 16.893 A -71.355 C -223.235 F 159 +G1 X -8.783 Y 17.222 Z 17.800 A -71.634 C -224.399 F 159 +G1 X -9.256 Y 16.174 Z 18.715 A -71.841 C -225.635 F 159 +G1 X -9.692 Y 15.124 Z 19.633 A -71.964 C -226.955 F 159 +G1 X -10.044 Y 14.201 Z 20.443 A -72.003 C -228.183 F 159 +G1 X -10.410 Y 13.143 Z 21.371 A -71.958 C -229.676 F 159 +G1 X -10.733 Y 12.086 Z 22.302 A -71.807 C -231.274 F 159 +G1 X -10.924 Y 11.380 Z 22.925 A -71.639 C -232.405 F 159 +G1 X -11.096 Y 10.674 Z 23.549 A -71.425 C -233.573 F 159 +G1 X -11.294 Y 9.732 Z 24.385 A -71.059 C -235.195 F 159 +G1 X -11.341 Y 9.427 Z 24.670 A -70.942 C -235.760 F 159 +G1 X -11.365 Y 9.097 Z 25.013 A -70.850 C -236.437 F 159 +G1 X -11.361 Y 8.784 Z 25.376 A -70.803 C -237.154 F 159 +G1 X -11.330 Y 8.494 Z 25.758 A -70.799 C -237.908 F 159 +G1 X -11.273 Y 8.224 Z 26.157 A -70.837 C -238.697 F 159 +G1 X -10.863 Y 7.070 Z 28.149 A -71.108 C -242.634 F 159 +G1 X -10.836 Y 7.017 Z 28.255 A -71.228 C -242.551 F 636 +G1 X -10.803 Y 6.989 Z 28.343 A -71.325 C -242.485 F 636 +G1 X -10.764 Y 6.986 Z 28.411 A -71.403 C -242.431 F 636 +G1 X -10.742 Y 6.993 Z 28.438 A -71.438 C -242.407 F 636 +G1 X -10.720 Y 7.007 Z 28.461 A -71.472 C -242.384 F 636 +G1 X -10.672 Y 7.050 Z 28.490 A -71.542 C -242.336 F 636 +G1 X -10.622 Y 7.116 Z 28.500 A -71.625 C -242.279 F 636 +G1 X -10.568 Y 7.203 Z 28.490 A -71.726 C -242.210 F 636 +G1 X -10.514 Y 7.310 Z 28.459 A -71.849 C -242.126 F 636 +G1 X -10.463 Y 7.424 Z 28.413 A -71.947 C -242.059 F 636 +G1 X -10.422 Y 7.532 Z 28.358 A -72.042 C -241.994 F 636 +G1 X -10.392 Y 7.633 Z 28.293 A -72.134 C -241.932 F 636 +G1 X -10.372 Y 7.726 Z 28.219 A -72.224 C -241.871 F 636 +G1 X -10.365 Y 7.811 Z 28.134 A -72.312 C -241.811 F 636 +G1 X -10.370 Y 7.886 Z 28.040 A -72.402 C -241.750 F 636 +G1 X -10.389 Y 7.950 Z 27.935 A -72.494 C -241.688 F 636 +G1 X -10.422 Y 8.002 Z 27.820 A -72.591 C -241.622 F 636 +G1 X -10.966 Y 8.619 Z 26.198 A -71.673 C -238.580 F 159 +G1 X -11.036 Y 8.715 Z 25.971 A -71.541 C -238.158 F 159 +G1 X -11.092 Y 8.826 Z 25.751 A -71.439 C -237.748 F 159 +G1 X -11.149 Y 9.016 Z 25.439 A -71.345 C -237.156 F 159 +G1 X -11.173 Y 9.233 Z 25.146 A -71.320 C -236.593 F 159 +G1 X -11.165 Y 9.473 Z 24.877 A -71.361 C -236.068 F 159 +G1 X -11.123 Y 9.730 Z 24.635 A -71.467 C -235.584 F 159 +G1 X -10.959 Y 10.336 Z 24.140 A -71.812 C -234.587 F 159 +G1 X -10.674 Y 11.258 Z 23.390 A -72.274 C -233.124 F 159 +G1 X -10.426 Y 11.973 Z 22.807 A -72.583 C -232.025 F 159 +G1 X -10.155 Y 12.684 Z 22.224 A -72.840 C -230.974 F 159 +G1 X -9.862 Y 13.391 Z 21.643 A -73.047 C -229.974 F 159 +G1 X -9.548 Y 14.093 Z 21.063 A -73.208 C -229.021 F 159 +G1 X -9.214 Y 14.791 Z 20.484 A -73.327 C -228.110 F 159 +G1 X -8.732 Y 15.722 Z 19.707 A -73.428 C -226.945 F 159 +G1 X -8.156 Y 16.745 Z 18.846 A -73.476 C -225.705 F 159 +G1 X -7.538 Y 17.759 Z 17.988 A -73.424 C -224.596 F 159 +G1 X -6.917 Y 18.704 Z 17.182 A -73.237 C -223.785 F 159 +G1 X -6.206 Y 19.717 Z 16.321 A -72.769 C -223.527 F 159 +G1 X -5.459 Y 20.715 Z 15.468 A -72.330 C -223.305 F 159 +G1 X -4.681 Y 21.694 Z 14.628 A -71.930 C -223.103 F 159 +G1 X -4.038 Y 22.466 Z 13.965 A -71.638 C -222.955 F 159 +G1 X -3.376 Y 23.229 Z 13.308 A -71.373 C -222.820 F 159 +G1 X -2.524 Y 24.168 Z 12.499 A -71.076 C -222.668 F 159 +G1 X -1.576 Y 25.188 Z 11.647 A -69.689 C -224.911 F 159 +G1 X -1.082 Y 25.707 Z 11.219 A -68.867 C -226.393 F 159 +G1 X -0.590 Y 26.227 Z 10.793 A -68.063 C -227.874 F 159 +G1 X -0.089 Y 26.741 Z 10.375 A -67.299 C -229.355 F 159 +G1 X 0.409 Y 27.255 Z 9.958 A -66.555 C -230.829 F 159 +G1 X 0.916 Y 27.764 Z 9.550 A -65.855 C -232.298 F 159 +G1 X 1.422 Y 28.272 Z 9.142 A -65.177 C -233.755 F 159 +G1 X 2.407 Y 29.237 Z 8.377 A -63.981 C -236.519 F 159 +G1 X 3.242 Y 30.038 Z 7.749 A -63.077 C -238.788 F 159 +G1 X 3.846 Y 30.602 Z 7.312 A -62.494 C -240.376 F 159 +G1 X 4.449 Y 31.166 Z 6.876 A -61.941 C -241.932 F 159 +G1 X 5.509 Y 32.129 Z 6.142 A -61.101 C -244.553 F 159 +G1 X 6.397 Y 32.923 Z 5.550 A -60.502 C -246.653 F 159 +G1 X 7.282 Y 33.714 Z 4.960 A -59.956 C -248.676 F 159 +G1 X 8.676 Y 34.999 Z 4.036 A -59.193 C -251.787 F 159 +G1 X 9.874 Y 36.127 Z 3.254 A -58.640 C -254.362 F 159 +G1 X 11.449 Y 37.750 Z 2.140 A -57.888 C -257.780 F 159 +G1 X 11.638 Y 37.957 Z 1.999 A -57.699 C -257.716 F 636 +G1 X 11.804 Y 38.162 Z 1.860 A -57.519 C -257.655 F 636 +G1 X 11.947 Y 38.364 Z 1.725 A -57.348 C -257.596 F 636 +G1 X 12.068 Y 38.565 Z 1.592 A -57.185 C -257.540 F 636 +G1 X 12.167 Y 38.762 Z 1.463 A -57.030 C -257.487 F 636 +G1 X 12.244 Y 38.957 Z 1.336 A -56.883 C -257.436 F 636 +G1 X 12.300 Y 39.149 Z 1.213 A -56.741 C -257.386 F 636 +G1 X 12.336 Y 39.337 Z 1.093 A -56.604 C -257.339 F 636 +G1 X 12.352 Y 39.521 Z 0.976 A -56.472 C -257.293 F 636 +G1 X 12.348 Y 39.702 Z 0.863 A -56.344 C -257.247 F 636 +G1 X 12.325 Y 39.878 Z 0.754 A -56.217 C -257.203 F 636 +G1 X 12.283 Y 40.050 Z 0.648 A -56.093 C -257.159 F 636 +G1 X 12.223 Y 40.217 Z 0.547 A -55.970 C -257.116 F 636 +G1 X 12.146 Y 40.379 Z 0.449 A -55.846 C -257.072 F 636 +G1 X 12.051 Y 40.535 Z 0.355 A -55.722 C -257.027 F 636 +G1 X 11.939 Y 40.687 Z 0.265 A -55.596 C -256.982 F 636 +G1 X 11.811 Y 40.832 Z 0.179 A -55.468 C -256.937 F 636 +G1 X 11.667 Y 40.972 Z 0.098 A -55.338 C -256.890 F 636 +G1 X 11.508 Y 41.105 Z 0.021 A -55.204 C -256.842 F 636 +G1 X 11.333 Y 41.231 Z -0.051 A -55.067 C -256.792 F 636 +G1 X 11.145 Y 41.351 Z -0.119 A -54.926 C -256.741 F 636 +G1 X 10.942 Y 41.463 Z -0.182 A -54.781 C -256.688 F 636 +G1 X 10.726 Y 41.568 Z -0.241 A -54.632 C -256.633 F 636 +G1 X 10.496 Y 41.666 Z -0.294 A -54.479 C -256.577 F 636 +G1 X 10.255 Y 41.755 Z -0.342 A -54.321 C -256.519 F 636 +G1 X 10.001 Y 41.837 Z -0.386 A -54.158 C -256.458 F 636 +G1 X 9.735 Y 41.910 Z -0.424 A -53.990 C -256.396 F 636 +G1 X 9.458 Y 41.974 Z -0.457 A -53.818 C -256.332 F 636 +G1 X 9.171 Y 42.029 Z -0.484 A -53.641 C -256.265 F 636 +G1 X 8.873 Y 42.075 Z -0.506 A -53.459 C -256.196 F 636 +G1 X 8.565 Y 42.112 Z -0.522 A -53.272 C -256.126 F 636 +G1 X 8.249 Y 42.139 Z -0.533 A -53.081 C -256.053 F 636 +G1 X 7.928 Y 42.157 Z -0.538 A -52.916 C -255.989 F 636 +G1 X 7.608 Y 42.168 Z -0.538 A -52.751 C -255.926 F 636 +G1 X 7.290 Y 42.172 Z -0.533 A -52.588 C -255.863 F 636 +G1 X 6.974 Y 42.168 Z -0.523 A -52.425 C -255.800 F 636 +G1 X 6.661 Y 42.157 Z -0.508 A -52.264 C -255.737 F 636 +G1 X 6.351 Y 42.138 Z -0.488 A -52.104 C -255.674 F 636 +G1 X 6.045 Y 42.111 Z -0.463 A -51.946 C -255.612 F 636 +G1 X 5.743 Y 42.075 Z -0.433 A -51.789 C -255.550 F 636 +G1 X 5.446 Y 42.032 Z -0.397 A -51.634 C -255.488 F 636 +G1 X 5.154 Y 41.980 Z -0.356 A -51.481 C -255.427 F 636 +G1 X 4.869 Y 41.920 Z -0.310 A -51.329 C -255.367 F 636 +G1 X 4.589 Y 41.851 Z -0.259 A -51.179 C -255.306 F 636 +G1 X 4.317 Y 41.774 Z -0.203 A -51.031 C -255.246 F 636 +G1 X 4.052 Y 41.688 Z -0.141 A -50.885 C -255.187 F 636 +G1 X 3.795 Y 41.592 Z -0.074 A -50.741 C -255.128 F 636 +G1 X 3.547 Y 41.487 Z -0.002 A -50.598 C -255.069 F 636 +G1 X 3.308 Y 41.373 Z 0.075 A -50.456 C -255.011 F 636 +G1 X 3.078 Y 41.250 Z 0.158 A -50.316 C -254.953 F 636 +G1 X 2.859 Y 41.117 Z 0.247 A -50.177 C -254.896 F 636 +G1 X 2.650 Y 40.974 Z 0.340 A -50.039 C -254.838 F 636 +G1 X 2.452 Y 40.822 Z 0.440 A -49.901 C -254.781 F 636 +G1 X 2.266 Y 40.659 Z 0.544 A -49.764 C -254.723 F 636 +G1 X 2.092 Y 40.486 Z 0.654 A -49.627 C -254.665 F 636 +G1 X 1.931 Y 40.303 Z 0.770 A -49.489 C -254.606 F 636 +G1 X 1.784 Y 40.110 Z 0.891 A -49.350 C -254.547 F 636 +G1 X 1.650 Y 39.906 Z 1.017 A -49.209 C -254.487 F 636 +G1 X 1.530 Y 39.691 Z 1.149 A -49.066 C -254.426 F 636 +G1 X 1.426 Y 39.465 Z 1.287 A -48.921 C -254.363 F 636 +G1 X 1.336 Y 39.229 Z 1.430 A -48.772 C -254.299 F 636 +G1 X 1.263 Y 38.981 Z 1.579 A -48.620 C -254.232 F 636 +G1 X 1.206 Y 38.722 Z 1.733 A -48.463 C -254.164 F 636 +G1 X 1.166 Y 38.451 Z 1.893 A -48.302 C -254.093 F 636 +G1 X 0.973 Y 36.745 Z 2.900 A -50.315 C -249.965 F 159 +G1 X 0.945 Y 36.530 Z 3.027 A -50.578 C -249.449 F 159 +G1 X 0.860 Y 36.100 Z 3.283 A -51.085 C -248.402 F 159 +G1 X 0.736 Y 35.671 Z 3.540 A -51.565 C -247.328 F 159 +G1 X 0.571 Y 35.243 Z 3.797 A -52.016 C -246.221 F 159 +G1 X 0.364 Y 34.820 Z 4.051 A -52.433 C -245.083 F 159 +G1 X -0.316 Y 33.670 Z 4.755 A -53.548 C -241.854 F 159 +G1 X -0.754 Y 32.938 Z 5.209 A -54.325 C -239.783 F 159 +G1 X -1.125 Y 32.313 Z 5.611 A -55.055 C -238.019 F 159 +G1 X -1.497 Y 31.688 Z 6.015 A -55.820 C -236.253 F 159 +G1 X -1.865 Y 31.066 Z 6.431 A -56.642 C -234.505 F 159 +G1 X -2.236 Y 30.444 Z 6.849 A -57.496 C -232.763 F 159 +G1 X -2.602 Y 29.824 Z 7.277 A -58.403 C -231.045 F 159 +G1 X -2.969 Y 29.205 Z 7.708 A -59.339 C -229.340 F 159 +G1 X -3.344 Y 28.569 Z 8.164 A -60.355 C -227.610 F 159 +G1 X -3.722 Y 27.934 Z 8.621 A -61.395 C -225.901 F 159 +G1 X -4.082 Y 27.322 Z 9.075 A -62.445 C -224.281 F 159 +G1 X -4.445 Y 26.712 Z 9.530 A -63.512 C -222.684 F 159 +G1 X -4.801 Y 26.104 Z 9.994 A -64.611 C -221.129 F 159 +G1 X -5.154 Y 25.506 Z 10.454 A -65.628 C -219.789 F 159 +G1 X -5.757 Y 24.428 Z 11.322 A -66.256 C -220.131 F 159 +G1 X -6.342 Y 23.351 Z 12.204 A -66.919 C -220.488 F 159 +G1 X -6.909 Y 22.274 Z 13.101 A -67.618 C -220.861 F 159 +G1 X -7.461 Y 21.184 Z 14.021 A -68.358 C -221.253 F 159 +G1 X -7.982 Y 20.113 Z 14.937 A -69.116 C -221.651 F 159 +G1 X -8.468 Y 19.065 Z 15.844 A -69.871 C -222.083 F 159 +G1 X -8.929 Y 18.001 Z 16.777 A -70.391 C -223.081 F 159 +G1 X -9.360 Y 16.943 Z 17.712 A -70.779 C -224.265 F 159 +G1 X -9.759 Y 15.886 Z 18.653 A -71.062 C -225.580 F 159 +G1 X -10.127 Y 14.830 Z 19.599 A -71.271 C -226.953 F 159 +G1 X -10.431 Y 13.872 Z 20.462 A -71.384 C -228.274 F 159 +G1 X -10.721 Y 12.852 Z 21.386 A -71.415 C -229.771 F 159 +G1 X -10.984 Y 11.798 Z 22.348 A -71.336 C -231.432 F 159 +G1 X -11.207 Y 10.750 Z 23.312 A -71.142 C -233.191 F 159 +G1 X -11.349 Y 9.951 Z 24.051 A -70.918 C -234.596 F 159 +G1 X -11.425 Y 9.432 Z 24.540 A -70.740 C -235.551 F 159 +G1 X -11.457 Y 9.096 Z 24.876 A -70.634 C -236.217 F 159 +G1 X -11.471 Y 8.769 Z 25.223 A -70.542 C -236.911 F 159 +G1 X -11.470 Y 8.452 Z 25.580 A -70.462 C -237.632 F 159 +G1 X -11.442 Y 7.996 Z 26.133 A -70.362 C -238.757 F 159 +G1 X -11.191 Y 6.686 Z 28.012 A -70.183 C -242.539 F 159 +G1 X -11.175 Y 6.624 Z 28.107 A -70.304 C -242.500 F 636 +G1 X -11.153 Y 6.576 Z 28.197 A -70.414 C -242.464 F 636 +G1 X -11.126 Y 6.541 Z 28.282 A -70.515 C -242.432 F 636 +G1 X -11.093 Y 6.518 Z 28.360 A -70.607 C -242.402 F 636 +G1 X -11.056 Y 6.508 Z 28.433 A -70.694 C -242.374 F 636 +G1 X -11.015 Y 6.510 Z 28.499 A -70.776 C -242.348 F 636 +G1 X -10.970 Y 6.523 Z 28.559 A -70.856 C -242.322 F 636 +G1 X -10.922 Y 6.547 Z 28.613 A -70.936 C -242.296 F 636 +G1 X -10.870 Y 6.581 Z 28.659 A -71.019 C -242.270 F 636 +G1 X -10.815 Y 6.626 Z 28.699 A -71.104 C -242.243 F 636 +G1 X -10.758 Y 6.681 Z 28.732 A -71.194 C -242.214 F 636 +G1 X -10.699 Y 6.745 Z 28.758 A -71.290 C -242.183 F 636 +G1 X -10.638 Y 6.818 Z 28.777 A -71.393 C -242.150 F 636 +G1 X -10.575 Y 6.900 Z 28.787 A -71.502 C -242.116 F 636 +G1 X -10.512 Y 6.990 Z 28.791 A -71.618 C -242.079 F 636 +G1 X -10.448 Y 7.088 Z 28.786 A -71.741 C -242.039 F 636 +G1 X -10.327 Y 7.289 Z 28.758 A -71.955 C -241.972 F 636 +G1 X -10.274 Y 7.388 Z 28.735 A -72.058 C -241.939 F 636 +G1 X -10.226 Y 7.484 Z 28.706 A -72.159 C -241.907 F 636 +G1 X -10.183 Y 7.578 Z 28.671 A -72.258 C -241.876 F 636 +G1 X -10.146 Y 7.669 Z 28.630 A -72.354 C -241.845 F 636 +G1 X -10.115 Y 7.756 Z 28.583 A -72.448 C -241.816 F 636 +G1 X -10.090 Y 7.839 Z 28.530 A -72.541 C -241.787 F 636 +G1 X -10.072 Y 7.918 Z 28.471 A -72.632 C -241.758 F 636 +G1 X -10.061 Y 7.993 Z 28.405 A -72.722 C -241.730 F 636 +G1 X -10.057 Y 8.062 Z 28.333 A -72.812 C -241.701 F 636 +G1 X -10.061 Y 8.125 Z 28.254 A -72.904 C -241.673 F 636 +G1 X -10.073 Y 8.182 Z 28.170 A -72.997 C -241.643 F 636 +G1 X -10.094 Y 8.233 Z 28.078 A -73.094 C -241.613 F 636 +G1 X -10.123 Y 8.276 Z 27.980 A -73.194 C -241.582 F 636 +G1 X -10.161 Y 8.313 Z 27.875 A -73.300 C -241.549 F 636 +G1 X -10.815 Y 8.806 Z 26.218 A -72.073 C -238.520 F 159 +G1 X -10.907 Y 8.882 Z 25.979 A -71.881 C -238.092 F 159 +G1 X -10.979 Y 8.979 Z 25.747 A -71.735 C -237.671 F 159 +G1 X -11.031 Y 9.096 Z 25.526 A -71.634 C -237.261 F 159 +G1 X -11.063 Y 9.230 Z 25.317 A -71.579 C -236.868 F 159 +G1 X -11.075 Y 9.364 Z 25.140 A -71.566 C -236.529 F 159 +G1 X -11.070 Y 9.508 Z 24.976 A -71.587 C -236.208 F 159 +G1 X -11.034 Y 9.740 Z 24.753 A -71.678 C -235.764 F 159 +G1 X -11.014 Y 9.820 Z 24.685 A -71.725 C -235.626 F 159 +G1 X -10.807 Y 10.477 Z 24.177 A -72.152 C -234.587 F 159 +G1 X -10.553 Y 11.202 Z 23.617 A -72.581 C -233.475 F 159 +G1 X -10.273 Y 11.921 Z 23.057 A -72.966 C -232.396 F 159 +G1 X -9.969 Y 12.634 Z 22.499 A -73.302 C -231.364 F 159 +G1 X -9.640 Y 13.341 Z 21.942 A -73.588 C -230.383 F 159 +G1 X -9.288 Y 14.042 Z 21.386 A -73.829 C -229.449 F 159 +G1 X -8.914 Y 14.735 Z 20.831 A -74.029 C -228.558 F 159 +G1 X -8.529 Y 15.402 Z 20.293 A -74.187 C -227.729 F 159 +G1 X -8.120 Y 16.069 Z 19.751 A -74.313 C -226.928 F 159 +G1 X -7.684 Y 16.737 Z 19.202 A -74.415 C -226.135 F 159 +G1 X -7.227 Y 17.399 Z 18.654 A -74.467 C -225.411 F 159 +G1 X -6.648 Y 18.188 Z 17.993 A -74.490 C -224.581 F 159 +G1 X -6.138 Y 18.844 Z 17.442 A -74.310 C -224.300 F 159 +G1 X -5.335 Y 19.817 Z 16.618 A -73.959 C -224.125 F 159 +G1 X -4.494 Y 20.768 Z 15.803 A -73.645 C -223.968 F 159 +G1 X -3.620 Y 21.693 Z 15.000 A -73.369 C -223.830 F 159 +G1 X -2.713 Y 22.596 Z 14.208 A -73.131 C -223.711 F 159 +G1 X -1.739 Y 23.509 Z 13.397 A -72.921 C -223.606 F 159 +G1 X -0.726 Y 24.427 Z 12.591 A -72.031 C -225.039 F 159 +G1 X -0.187 Y 24.904 Z 12.178 A -71.279 C -226.463 F 159 +G1 X 0.350 Y 25.382 Z 11.765 A -70.545 C -227.880 F 159 +G1 X 1.440 Y 26.318 Z 10.956 A -69.169 C -230.680 F 159 +G1 X 2.369 Y 27.089 Z 10.288 A -68.103 C -232.989 F 159 +G1 X 3.427 Y 27.940 Z 9.550 A -67.007 C -235.522 F 159 +G1 X 4.557 Y 28.818 Z 8.788 A -65.970 C -238.104 F 159 +G1 X 5.819 Y 29.762 Z 7.968 A -64.967 C -240.830 F 159 +G1 X 6.975 Y 30.594 Z 7.245 A -64.181 C -243.178 F 159 +G1 X 8.143 Y 31.406 Z 6.540 A -63.504 C -245.405 F 159 +G1 X 9.323 Y 32.196 Z 5.854 A -62.929 C -247.508 F 159 +G1 X 10.515 Y 32.968 Z 5.185 A -62.447 C -249.491 F 159 +G1 X 11.719 Y 33.721 Z 4.536 A -62.049 C -251.354 F 159 +G1 X 12.933 Y 34.457 Z 3.905 A -61.729 C -253.102 F 159 +G1 X 13.972 Y 35.068 Z 3.385 A -61.511 C -254.496 F 159 +G1 X 15.862 Y 36.304 Z 2.363 A -61.061 C -257.056 F 159 +G1 X 16.069 Y 36.444 Z 2.248 A -60.899 C -257.009 F 636 +G1 X 16.264 Y 36.586 Z 2.133 A -60.743 C -256.964 F 636 +G1 X 16.446 Y 36.729 Z 2.018 A -60.591 C -256.920 F 636 +G1 X 16.616 Y 36.874 Z 1.904 A -60.444 C -256.877 F 636 +G1 X 16.774 Y 37.020 Z 1.790 A -60.301 C -256.835 F 636 +G1 X 16.920 Y 37.167 Z 1.676 A -60.162 C -256.794 F 636 +G1 X 17.055 Y 37.316 Z 1.563 A -60.027 C -256.755 F 636 +G1 X 17.177 Y 37.465 Z 1.451 A -59.896 C -256.716 F 636 +G1 X 17.289 Y 37.616 Z 1.339 A -59.768 C -256.678 F 636 +G1 X 17.389 Y 37.767 Z 1.227 A -59.644 C -256.641 F 636 +G1 X 17.478 Y 37.918 Z 1.116 A -59.522 C -256.605 F 636 +G1 X 17.556 Y 38.071 Z 1.006 A -59.402 C -256.569 F 636 +G1 X 17.623 Y 38.223 Z 0.897 A -59.286 C -256.534 F 636 +G1 X 17.680 Y 38.376 Z 0.788 A -59.171 C -256.500 F 636 +G1 X 17.726 Y 38.530 Z 0.681 A -59.058 C -256.466 F 636 +G1 X 17.762 Y 38.683 Z 0.574 A -58.946 C -256.432 F 636 +G1 X 17.788 Y 38.836 Z 0.468 A -58.836 C -256.399 F 636 +G1 X 17.803 Y 38.990 Z 0.363 A -58.726 C -256.365 F 636 +G1 X 17.809 Y 39.143 Z 0.259 A -58.618 C -256.333 F 636 +G1 X 17.805 Y 39.296 Z 0.156 A -58.510 C -256.300 F 636 +G1 X 17.792 Y 39.448 Z 0.054 A -58.402 C -256.267 F 636 +G1 X 17.769 Y 39.600 Z -0.046 A -58.295 C -256.234 F 636 +G1 X 17.737 Y 39.751 Z -0.146 A -58.187 C -256.201 F 636 +G1 X 17.696 Y 39.902 Z -0.244 A -58.079 C -256.168 F 636 +G1 X 17.645 Y 40.051 Z -0.341 A -57.971 C -256.134 F 636 +G1 X 17.587 Y 40.200 Z -0.436 A -57.862 C -256.101 F 636 +G1 X 17.519 Y 40.348 Z -0.531 A -57.752 C -256.067 F 636 +G1 X 17.443 Y 40.494 Z -0.623 A -57.641 C -256.032 F 636 +G1 X 17.359 Y 40.639 Z -0.715 A -57.529 C -255.997 F 636 +G1 X 17.267 Y 40.783 Z -0.805 A -57.416 C -255.962 F 636 +G1 X 17.166 Y 40.925 Z -0.893 A -57.302 C -255.926 F 636 +G1 X 17.058 Y 41.066 Z -0.980 A -57.186 C -255.890 F 636 +G1 X 16.942 Y 41.205 Z -1.065 A -57.069 C -255.853 F 636 +G1 X 16.819 Y 41.342 Z -1.148 A -56.951 C -255.816 F 636 +G1 X 16.550 Y 41.611 Z -1.309 A -56.709 C -255.740 F 636 +G1 X 16.253 Y 41.871 Z -1.463 A -56.462 C -255.661 F 636 +G1 X 15.929 Y 42.121 Z -1.610 A -56.207 C -255.579 F 636 +G1 X 15.580 Y 42.361 Z -1.748 A -55.946 C -255.495 F 636 +G1 X 15.206 Y 42.590 Z -1.878 A -55.679 C -255.408 F 636 +G1 X 14.808 Y 42.807 Z -1.999 A -55.405 C -255.319 F 636 +G1 X 14.389 Y 43.011 Z -2.111 A -55.125 C -255.227 F 636 +G1 X 13.949 Y 43.201 Z -2.213 A -54.838 C -255.132 F 636 +G1 X 13.489 Y 43.377 Z -2.306 A -54.546 C -255.034 F 636 +G1 X 13.012 Y 43.537 Z -2.388 A -54.248 C -254.934 F 636 +G1 X 12.517 Y 43.681 Z -2.460 A -53.944 C -254.831 F 636 +G1 X 12.006 Y 43.808 Z -2.521 A -53.635 C -254.725 F 636 +G1 X 11.481 Y 43.917 Z -2.570 A -53.321 C -254.617 F 636 +G1 X 10.943 Y 44.006 Z -2.608 A -53.002 C -254.506 F 636 +G1 X 10.393 Y 44.076 Z -2.634 A -52.678 C -254.393 F 636 +G1 X 9.834 Y 44.130 Z -2.649 A -52.394 C -254.292 F 636 +G1 X 9.272 Y 44.171 Z -2.653 A -52.107 C -254.190 F 636 +G1 X 8.706 Y 44.200 Z -2.648 A -51.821 C -254.087 F 636 +G1 X 8.140 Y 44.216 Z -2.633 A -51.533 C -253.983 F 636 +G1 X 7.575 Y 44.219 Z -2.607 A -51.246 C -253.878 F 636 +G1 X 7.011 Y 44.208 Z -2.572 A -50.960 C -253.773 F 636 +G1 X 6.451 Y 44.183 Z -2.527 A -50.675 C -253.667 F 636 +G1 X 5.896 Y 44.145 Z -2.473 A -50.392 C -253.561 F 636 +G1 X 5.347 Y 44.092 Z -2.408 A -50.111 C -253.455 F 636 +G1 X 4.807 Y 44.024 Z -2.333 A -49.833 C -253.349 F 636 +G1 X 4.276 Y 43.941 Z -2.249 A -49.558 C -253.243 F 636 +G1 X 3.757 Y 43.843 Z -2.155 A -49.287 C -253.138 F 636 +G1 X 3.250 Y 43.730 Z -2.052 A -49.019 C -253.033 F 636 +G1 X 2.757 Y 43.600 Z -1.938 A -48.756 C -252.929 F 636 +G1 X 2.281 Y 43.455 Z -1.815 A -48.496 C -252.826 F 636 +G1 X 1.821 Y 43.293 Z -1.682 A -48.241 C -252.724 F 636 +G1 X 1.381 Y 43.114 Z -1.540 A -47.991 C -252.623 F 636 +G1 X 0.960 Y 42.918 Z -1.388 A -47.745 C -252.523 F 636 +G1 X 0.562 Y 42.705 Z -1.226 A -47.503 C -252.423 F 636 +G1 X 0.372 Y 42.591 Z -1.142 A -47.383 C -252.374 F 636 +G1 X 0.187 Y 42.474 Z -1.055 A -47.265 C -252.325 F 636 +G1 X 0.009 Y 42.351 Z -0.966 A -47.147 C -252.276 F 636 +G1 X -0.163 Y 42.225 Z -0.875 A -47.030 C -252.227 F 636 +G1 X -0.328 Y 42.093 Z -0.781 A -46.913 C -252.178 F 636 +G1 X -0.486 Y 41.958 Z -0.684 A -46.798 C -252.129 F 636 +G1 X -0.638 Y 41.817 Z -0.586 A -46.682 C -252.080 F 636 +G1 X -0.782 Y 41.672 Z -0.485 A -46.567 C -252.032 F 636 +G1 X -0.918 Y 41.522 Z -0.381 A -46.453 C -251.983 F 636 +G1 X -1.048 Y 41.367 Z -0.276 A -46.338 C -251.934 F 636 +G1 X -1.169 Y 41.208 Z -0.168 A -46.224 C -251.884 F 636 +G1 X -1.282 Y 41.043 Z -0.057 A -46.109 C -251.835 F 636 +G1 X -1.388 Y 40.874 Z 0.056 A -45.994 C -251.785 F 636 +G1 X -1.484 Y 40.700 Z 0.171 A -45.878 C -251.734 F 636 +G1 X -1.573 Y 40.521 Z 0.288 A -45.761 C -251.684 F 636 +G1 X -1.653 Y 40.337 Z 0.408 A -45.644 C -251.632 F 636 +G1 X -1.723 Y 40.148 Z 0.530 A -45.525 C -251.580 F 636 +G1 X -1.785 Y 39.954 Z 0.655 A -45.405 C -251.527 F 636 +G1 X -1.837 Y 39.755 Z 0.782 A -45.284 C -251.473 F 636 +G1 X -1.880 Y 39.551 Z 0.911 A -45.161 C -251.418 F 636 +G1 X -1.913 Y 39.341 Z 1.043 A -45.035 C -251.361 F 636 +G1 X -1.937 Y 39.127 Z 1.176 A -44.908 C -251.304 F 636 +G1 X -1.950 Y 38.907 Z 1.313 A -44.778 C -251.245 F 636 +G1 X -1.953 Y 38.682 Z 1.451 A -44.645 C -251.185 F 636 +G1 X -1.945 Y 38.451 Z 1.592 A -44.509 C -251.123 F 636 +G1 X -1.927 Y 38.215 Z 1.735 A -44.371 C -251.059 F 636 +G1 X -1.758 Y 36.498 Z 2.774 A -47.126 C -246.789 F 159 +G1 X -1.739 Y 36.300 Z 2.895 A -47.454 C -246.317 F 159 +G1 X -1.747 Y 36.000 Z 3.076 A -47.910 C -245.568 F 159 +G1 X -1.797 Y 35.696 Z 3.255 A -48.321 C -244.772 F 159 +G1 X -1.893 Y 35.390 Z 3.433 A -48.684 C -243.922 F 159 +G1 X -2.387 Y 34.313 Z 4.058 A -49.856 C -240.762 F 159 +G1 X -2.746 Y 33.543 Z 4.511 A -50.764 C -238.508 F 159 +G1 X -3.054 Y 32.879 Z 4.919 A -51.623 C -236.585 F 159 +G1 X -3.364 Y 32.215 Z 5.329 A -52.522 C -234.677 F 159 +G1 X -3.671 Y 31.556 Z 5.752 A -53.481 C -232.807 F 159 +G1 X -3.980 Y 30.898 Z 6.177 A -54.475 C -230.962 F 159 +G1 X -4.286 Y 30.244 Z 6.614 A -55.523 C -229.160 F 159 +G1 X -4.595 Y 29.592 Z 7.053 A -56.599 C -227.388 F 159 +G1 X -4.930 Y 28.881 Z 7.550 A -57.837 C -225.495 F 159 +G1 X -5.268 Y 28.171 Z 8.049 A -59.100 C -223.643 F 159 +G1 X -5.601 Y 27.468 Z 8.561 A -60.408 C -221.855 F 159 +G1 X -5.936 Y 26.768 Z 9.074 A -61.731 C -220.112 F 159 +G1 X -6.494 Y 25.566 Z 9.993 A -63.458 C -218.584 F 159 +G1 X -6.984 Y 24.446 Z 10.886 A -64.269 C -219.039 F 159 +G1 X -7.460 Y 23.331 Z 11.793 A -65.108 C -219.503 F 159 +G1 X -7.921 Y 22.221 Z 12.716 A -65.974 C -219.977 F 159 +G1 X -8.467 Y 20.861 Z 13.872 A -67.078 C -220.572 F 159 +G1 X -8.847 Y 19.873 Z 14.725 A -67.904 C -221.013 F 159 +G1 X -9.249 Y 18.778 Z 15.687 A -68.762 C -221.686 F 159 +G1 X -9.616 Y 17.705 Z 16.647 A -69.338 C -222.886 F 159 +G1 X -9.961 Y 16.637 Z 17.612 A -69.829 C -224.159 F 159 +G1 X -10.279 Y 15.573 Z 18.585 A -70.233 C -225.513 F 159 +G1 X -10.569 Y 14.514 Z 19.563 A -70.546 C -226.947 F 159 +G1 X -10.791 Y 13.621 Z 20.396 A -70.737 C -228.231 F 159 +G1 X -10.950 Y 12.921 Z 21.055 A -70.835 C -229.290 F 159 +G1 X -11.160 Y 11.875 Z 22.047 A -70.885 C -230.973 F 159 +G1 X -11.335 Y 10.838 Z 23.041 A -70.814 C -232.757 F 159 +G1 X -11.448 Y 10.021 Z 23.833 A -70.677 C -234.233 F 159 +G1 X -11.550 Y 9.072 Z 24.763 A -70.411 C -236.045 F 159 +G1 X -11.602 Y 8.395 Z 25.433 A -70.140 C -237.412 F 159 +G1 X -11.636 Y 7.724 Z 26.106 A -69.806 C -238.820 F 159 +G1 X -11.542 Y 6.267 Z 27.850 A -69.177 C -242.389 F 159 +G1 X -12.672 Y -3.573 Z 27.743 A -71.841 C -293.080 F 636 +G1 X -13.521 Y -3.437 Z 26.178 A -71.266 C -290.069 F 159 +G1 X -13.702 Y -3.384 Z 25.858 A -71.158 C -289.454 F 159 +G1 X -13.886 Y -3.301 Z 25.552 A -71.093 C -288.865 F 159 +G1 X -14.071 Y -3.188 Z 25.262 A -71.073 C -288.301 F 159 +G1 X -14.255 Y -3.046 Z 24.986 A -71.096 C -287.764 F 159 +G1 X -14.435 Y -2.875 Z 24.729 A -71.164 C -287.257 F 159 +G1 X -14.578 Y -2.717 Z 24.534 A -71.252 C -286.868 F 159 +G1 X -14.985 Y -2.198 Z 23.987 A -71.566 C -285.782 F 159 +G1 X -15.579 Y -1.385 Z 23.162 A -71.965 C -284.202 F 159 +G1 X -15.998 Y -0.771 Z 22.558 A -72.202 C -283.085 F 159 +G1 X -16.402 Y -0.141 Z 21.956 A -72.387 C -282.020 F 159 +G1 X -16.792 Y 0.503 Z 21.354 A -72.522 C -281.005 F 159 +G1 X -17.331 Y 1.462 Z 20.484 A -72.638 C -279.613 F 159 +G1 X -17.812 Y 2.389 Z 19.669 A -72.669 C -278.383 F 159 +G1 X -18.311 Y 3.431 Z 18.778 A -72.625 C -277.114 F 159 +G1 X -18.780 Y 4.499 Z 17.890 A -72.500 C -275.930 F 159 +G1 X -19.076 Y 5.223 Z 17.302 A -72.381 C -275.174 F 159 +G1 X -19.511 Y 6.371 Z 16.396 A -71.935 C -274.534 F 159 +G1 X -19.911 Y 7.528 Z 15.512 A -71.371 C -274.247 F 159 +G1 X -20.285 Y 8.702 Z 14.638 A -70.844 C -273.978 F 159 +G1 X -20.625 Y 9.862 Z 13.797 A -70.367 C -273.733 F 159 +G1 X -20.947 Y 11.056 Z 12.954 A -69.921 C -273.502 F 159 +G1 X -21.247 Y 12.272 Z 12.117 A -69.512 C -273.290 F 159 +G1 X -21.546 Y 13.574 Z 11.258 A -68.408 C -274.635 F 159 +G1 X -21.698 Y 14.270 Z 10.817 A -67.494 C -276.153 F 159 +G1 X -21.853 Y 14.966 Z 10.377 A -66.596 C -277.678 F 159 +G1 X -22.000 Y 15.666 Z 9.946 A -65.737 C -279.218 F 159 +G1 X -22.149 Y 16.365 Z 9.515 A -64.898 C -280.761 F 159 +G1 X -22.291 Y 17.068 Z 9.094 A -64.103 C -282.310 F 159 +G1 X -22.435 Y 17.769 Z 8.674 A -63.332 C -283.855 F 159 +G1 X -22.578 Y 18.502 Z 8.248 A -62.581 C -285.462 F 159 +G1 X -22.722 Y 19.234 Z 7.823 A -61.858 C -287.059 F 159 +G1 X -22.986 Y 20.647 Z 7.027 A -60.593 C -290.109 F 159 +G1 X -23.243 Y 22.093 Z 6.238 A -59.462 C -293.162 F 159 +G1 X -23.483 Y 23.514 Z 5.489 A -58.507 C -296.080 F 159 +G1 X -23.640 Y 24.460 Z 5.002 A -57.948 C -297.972 F 159 +G1 X -23.825 Y 25.391 Z 4.516 A -57.404 C -299.825 F 159 +G1 X -24.045 Y 26.311 Z 4.026 A -56.865 C -301.657 F 159 +G1 X -24.254 Y 27.069 Z 3.618 A -56.426 C -303.170 F 159 +G1 X -24.532 Y 27.967 Z 3.134 A -55.918 C -304.961 F 159 +G1 X -25.290 Y 30.107 Z 1.937 A -54.730 C -309.204 F 159 +G1 X -25.359 Y 30.280 Z 1.837 A -54.607 C -309.127 F 636 +G1 X -25.436 Y 30.429 Z 1.743 A -54.496 C -309.056 F 636 +G1 X -25.520 Y 30.554 Z 1.655 A -54.395 C -308.992 F 636 +G1 X -25.610 Y 30.655 Z 1.574 A -54.304 C -308.935 F 636 +G1 X -25.706 Y 30.732 Z 1.500 A -54.220 C -308.881 F 636 +G1 X -25.807 Y 30.786 Z 1.432 A -54.143 C -308.832 F 636 +G1 X -25.914 Y 30.816 Z 1.371 A -54.070 C -308.785 F 636 +G1 X -26.025 Y 30.823 Z 1.317 A -53.998 C -308.740 F 636 +G1 X -26.140 Y 30.808 Z 1.270 A -53.926 C -308.693 F 636 +G1 X -26.259 Y 30.770 Z 1.230 A -53.850 C -308.644 F 636 +G1 X -26.381 Y 30.709 Z 1.198 A -53.769 C -308.592 F 636 +G1 X -26.506 Y 30.627 Z 1.172 A -53.681 C -308.535 F 636 +G1 X -26.634 Y 30.523 Z 1.154 A -53.585 C -308.473 F 636 +G1 X -26.763 Y 30.396 Z 1.143 A -53.480 C -308.405 F 636 +G1 X -26.893 Y 30.249 Z 1.139 A -53.366 C -308.331 F 636 +G1 X -27.025 Y 30.080 Z 1.143 A -53.243 C -308.250 F 636 +G1 X -27.151 Y 29.901 Z 1.153 A -53.142 C -308.184 F 636 +G1 X -27.266 Y 29.720 Z 1.170 A -53.043 C -308.119 F 636 +G1 X -27.368 Y 29.538 Z 1.192 A -52.947 C -308.055 F 636 +G1 X -27.458 Y 29.356 Z 1.221 A -52.853 C -307.993 F 636 +G1 X -27.535 Y 29.174 Z 1.256 A -52.761 C -307.932 F 636 +G1 X -27.598 Y 28.993 Z 1.297 A -52.671 C -307.872 F 636 +G1 X -27.648 Y 28.811 Z 1.344 A -52.582 C -307.812 F 636 +G1 X -27.683 Y 28.630 Z 1.398 A -52.494 C -307.753 F 636 +G1 X -27.704 Y 28.450 Z 1.457 A -52.407 C -307.695 F 636 +G1 X -27.710 Y 28.272 Z 1.524 A -52.319 C -307.636 F 636 +G1 X -27.699 Y 28.094 Z 1.596 A -52.231 C -307.577 F 636 +G1 X -27.673 Y 27.919 Z 1.676 A -52.142 C -307.517 F 636 +G1 X -27.631 Y 27.745 Z 1.761 A -52.052 C -307.455 F 636 +G1 X -27.572 Y 27.574 Z 1.853 A -51.959 C -307.392 F 636 +G1 X -27.495 Y 27.405 Z 1.952 A -51.863 C -307.326 F 636 +G1 X -27.401 Y 27.239 Z 2.058 A -51.763 C -307.258 F 636 +G1 X -26.491 Y 25.791 Z 3.017 A -53.155 C -303.508 F 159 +G1 X -26.231 Y 25.348 Z 3.301 A -53.584 C -302.379 F 159 +G1 X -25.990 Y 24.888 Z 3.589 A -54.009 C -301.237 F 159 +G1 X -25.793 Y 24.464 Z 3.846 A -54.380 C -300.211 F 159 +G1 X -25.612 Y 24.025 Z 4.104 A -54.744 C -299.168 F 159 +G1 X -25.381 Y 23.364 Z 4.476 A -55.254 C -297.636 F 159 +G1 X -25.060 Y 22.203 Z 5.099 A -56.092 C -294.993 F 159 +G1 X -24.679 Y 20.806 Z 5.868 A -57.235 C -291.763 F 159 +G1 X -24.485 Y 20.111 Z 6.265 A -57.877 C -290.136 F 159 +G1 X -24.292 Y 19.414 Z 6.663 A -58.550 C -288.497 F 159 +G1 X -24.095 Y 18.720 Z 7.073 A -59.277 C -286.860 F 159 +G1 X -23.900 Y 18.025 Z 7.484 A -60.034 C -285.217 F 159 +G1 X -23.715 Y 17.384 Z 7.876 A -60.782 C -283.701 F 159 +G1 X -23.532 Y 16.742 Z 8.268 A -61.554 C -282.186 F 159 +G1 X -23.346 Y 16.103 Z 8.669 A -62.366 C -280.684 F 159 +G1 X -23.161 Y 15.464 Z 9.072 A -63.200 C -279.188 F 159 +G1 X -22.959 Y 14.781 Z 9.514 A -64.138 C -277.598 F 159 +G1 X -22.758 Y 14.096 Z 9.958 A -65.096 C -276.019 F 159 +G1 X -22.554 Y 13.417 Z 10.410 A -66.091 C -274.468 F 159 +G1 X -22.352 Y 12.738 Z 10.864 A -67.099 C -272.934 F 159 +G1 X -21.970 Y 11.514 Z 11.727 A -67.941 C -272.464 F 159 +G1 X -21.580 Y 10.339 Z 12.587 A -68.469 C -272.743 F 159 +G1 X -21.173 Y 9.178 Z 13.460 A -69.036 C -273.040 F 159 +G1 X -20.736 Y 8.003 Z 14.369 A -69.656 C -273.364 F 159 +G1 X -20.289 Y 6.872 Z 15.269 A -70.298 C -273.696 F 159 +G1 X -19.872 Y 5.877 Z 16.081 A -70.898 C -274.011 F 159 +G1 X -19.441 Y 4.914 Z 16.893 A -71.355 C -274.665 F 159 +G1 X -18.941 Y 3.870 Z 17.800 A -71.634 C -275.829 F 159 +G1 X -18.416 Y 2.847 Z 18.715 A -71.841 C -277.065 F 159 +G1 X -17.868 Y 1.851 Z 19.633 A -71.964 C -278.385 F 159 +G1 X -17.365 Y 1.000 Z 20.443 A -72.003 C -279.613 F 159 +G1 X -16.766 Y 0.055 Z 21.371 A -71.958 C -281.106 F 159 +G1 X -16.140 Y -0.856 Z 22.302 A -71.807 C -282.704 F 159 +G1 X -15.708 Y -1.446 Z 22.925 A -71.639 C -283.835 F 159 +G1 X -15.263 Y -2.021 Z 23.549 A -71.425 C -285.003 F 159 +G1 X -14.650 Y -2.763 Z 24.385 A -71.059 C -286.625 F 159 +G1 X -14.441 Y -2.989 Z 24.670 A -70.942 C -287.190 F 159 +G1 X -14.198 Y -3.215 Z 25.013 A -70.850 C -287.867 F 159 +G1 X -13.952 Y -3.406 Z 25.376 A -70.803 C -288.584 F 159 +G1 X -13.705 Y -3.563 Z 25.758 A -70.799 C -289.338 F 159 +G1 X -13.459 Y -3.686 Z 26.157 A -70.837 C -290.127 F 159 +G1 X -12.301 Y -4.085 Z 28.149 A -71.108 C -294.064 F 159 +G1 X -12.242 Y -4.098 Z 28.255 A -71.228 C -293.981 F 636 +G1 X -12.199 Y -4.089 Z 28.343 A -71.325 C -293.915 F 636 +G1 X -12.173 Y -4.060 Z 28.411 A -71.403 C -293.861 F 636 +G1 X -12.165 Y -4.039 Z 28.438 A -71.438 C -293.837 F 636 +G1 X -12.162 Y -4.013 Z 28.461 A -71.472 C -293.814 F 636 +G1 X -12.166 Y -3.948 Z 28.490 A -71.542 C -293.766 F 636 +G1 X -12.186 Y -3.868 Z 28.500 A -71.625 C -293.709 F 636 +G1 X -12.221 Y -3.772 Z 28.490 A -71.726 C -293.640 F 636 +G1 X -12.270 Y -3.663 Z 28.459 A -71.849 C -293.556 F 636 +G1 X -12.328 Y -3.552 Z 28.413 A -71.947 C -293.489 F 636 +G1 X -12.387 Y -3.453 Z 28.358 A -72.042 C -293.424 F 636 +G1 X -12.447 Y -3.366 Z 28.293 A -72.134 C -293.362 F 636 +G1 X -12.508 Y -3.292 Z 28.219 A -72.224 C -293.301 F 636 +G1 X -12.569 Y -3.234 Z 28.134 A -72.312 C -293.241 F 636 +G1 X -12.631 Y -3.191 Z 28.040 A -72.402 C -293.180 F 636 +G1 X -12.693 Y -3.166 Z 27.935 A -72.494 C -293.118 F 636 +G1 X -12.754 Y -3.159 Z 27.820 A -72.591 C -293.052 F 636 +G1 X -13.576 Y -3.200 Z 26.198 A -71.673 C -290.010 F 159 +G1 X -13.695 Y -3.195 Z 25.971 A -71.541 C -289.589 F 159 +G1 X -13.816 Y -3.170 Z 25.751 A -71.439 C -289.178 F 159 +G1 X -14.000 Y -3.096 Z 25.439 A -71.345 C -288.586 F 159 +G1 X -14.185 Y -2.979 Z 25.146 A -71.320 C -288.023 F 159 +G1 X -14.367 Y -2.823 Z 24.877 A -71.361 C -287.498 F 159 +G1 X -14.542 Y -2.630 Z 24.635 A -71.467 C -287.014 F 159 +G1 X -14.914 Y -2.124 Z 24.140 A -71.812 C -286.017 F 159 +G1 X -15.457 Y -1.327 Z 23.390 A -72.274 C -284.554 F 159 +G1 X -15.861 Y -0.687 Z 22.807 A -72.583 C -283.455 F 159 +G1 X -16.248 Y -0.032 Z 22.224 A -72.840 C -282.404 F 159 +G1 X -16.618 Y 0.638 Z 21.643 A -73.047 C -281.404 F 159 +G1 X -16.972 Y 1.321 Z 21.063 A -73.208 C -280.451 F 159 +G1 X -17.309 Y 2.018 Z 20.484 A -73.327 C -279.540 F 159 +G1 X -17.737 Y 2.975 Z 19.707 A -73.428 C -278.375 F 159 +G1 X -18.178 Y 4.063 Z 18.846 A -73.476 C -277.135 F 159 +G1 X -18.584 Y 5.178 Z 17.988 A -73.424 C -276.026 F 159 +G1 X -18.937 Y 6.253 Z 17.182 A -73.237 C -275.215 F 159 +G1 X -19.285 Y 7.441 Z 16.321 A -72.769 C -274.957 F 159 +G1 X -19.599 Y 8.647 Z 15.468 A -72.330 C -274.735 F 159 +G1 X -19.880 Y 9.866 Z 14.628 A -71.930 C -274.533 F 159 +G1 X -20.083 Y 10.850 Z 13.965 A -71.638 C -274.385 F 159 +G1 X -20.266 Y 11.843 Z 13.308 A -71.373 C -274.250 F 159 +G1 X -20.469 Y 13.095 Z 12.499 A -71.076 C -274.098 F 159 +G1 X -20.676 Y 14.472 Z 11.647 A -69.689 C -276.341 F 159 +G1 X -20.774 Y 15.182 Z 11.219 A -68.867 C -277.823 F 159 +G1 X -20.874 Y 15.891 Z 10.793 A -68.063 C -279.304 F 159 +G1 X -20.963 Y 16.602 Z 10.375 A -67.299 C -280.785 F 159 +G1 X -21.054 Y 17.313 Z 9.958 A -66.555 C -282.259 F 159 +G1 X -21.136 Y 18.026 Z 9.550 A -65.855 C -283.728 F 159 +G1 X -21.218 Y 18.738 Z 9.142 A -65.177 C -285.185 F 159 +G1 X -21.359 Y 20.110 Z 8.377 A -63.981 C -287.949 F 159 +G1 X -21.464 Y 21.262 Z 7.749 A -63.077 C -290.218 F 159 +G1 X -21.528 Y 22.087 Z 7.312 A -62.494 C -291.806 F 159 +G1 X -21.593 Y 22.909 Z 6.876 A -61.941 C -293.362 F 159 +G1 X -21.686 Y 24.339 Z 6.142 A -61.101 C -295.983 F 159 +G1 X -21.752 Y 25.528 Z 5.550 A -60.502 C -298.083 F 159 +G1 X -21.819 Y 26.713 Z 4.960 A -59.956 C -300.106 F 159 +G1 X -21.955 Y 28.604 Z 4.036 A -59.193 C -303.217 F 159 +G1 X -22.090 Y 30.244 Z 3.254 A -58.640 C -305.792 F 159 +G1 X -22.377 Y 32.487 Z 2.140 A -57.888 C -309.210 F 159 +G1 X -22.421 Y 32.764 Z 1.999 A -57.699 C -309.146 F 636 +G1 X -22.477 Y 33.022 Z 1.860 A -57.519 C -309.085 F 636 +G1 X -22.546 Y 33.260 Z 1.725 A -57.348 C -309.026 F 636 +G1 X -22.628 Y 33.479 Z 1.592 A -57.185 C -308.970 F 636 +G1 X -22.721 Y 33.680 Z 1.463 A -57.030 C -308.917 F 636 +G1 X -22.825 Y 33.862 Z 1.336 A -56.883 C -308.866 F 636 +G1 X -22.939 Y 34.025 Z 1.213 A -56.741 C -308.816 F 636 +G1 X -23.064 Y 34.170 Z 1.093 A -56.604 C -308.769 F 636 +G1 X -23.198 Y 34.298 Z 0.976 A -56.472 C -308.723 F 636 +G1 X -23.342 Y 34.407 Z 0.863 A -56.344 C -308.678 F 636 +G1 X -23.494 Y 34.499 Z 0.754 A -56.218 C -308.633 F 636 +G1 X -23.655 Y 34.573 Z 0.648 A -56.093 C -308.589 F 636 +G1 X -23.823 Y 34.631 Z 0.547 A -55.970 C -308.546 F 636 +G1 X -23.998 Y 34.671 Z 0.449 A -55.846 C -308.502 F 636 +G1 X -24.179 Y 34.694 Z 0.355 A -55.722 C -308.457 F 636 +G1 X -24.367 Y 34.701 Z 0.265 A -55.596 C -308.413 F 636 +G1 X -24.561 Y 34.692 Z 0.179 A -55.468 C -308.367 F 636 +G1 X -24.760 Y 34.666 Z 0.098 A -55.338 C -308.320 F 636 +G1 X -24.963 Y 34.625 Z 0.021 A -55.204 C -308.272 F 636 +G1 X -25.170 Y 34.567 Z -0.051 A -55.067 C -308.222 F 636 +G1 X -25.382 Y 34.494 Z -0.119 A -54.926 C -308.171 F 636 +G1 X -25.596 Y 34.406 Z -0.182 A -54.781 C -308.118 F 636 +G1 X -25.813 Y 34.302 Z -0.241 A -54.632 C -308.063 F 636 +G1 X -26.032 Y 34.184 Z -0.294 A -54.479 C -308.007 F 636 +G1 X -26.253 Y 34.051 Z -0.342 A -54.321 C -307.949 F 636 +G1 X -26.475 Y 33.903 Z -0.386 A -54.158 C -307.888 F 636 +G1 X -26.697 Y 33.741 Z -0.424 A -53.990 C -307.826 F 636 +G1 X -26.920 Y 33.564 Z -0.457 A -53.818 C -307.762 F 636 +G1 X -27.143 Y 33.374 Z -0.484 A -53.641 C -307.695 F 636 +G1 X -27.364 Y 33.170 Z -0.506 A -53.459 C -307.626 F 636 +G1 X -27.585 Y 32.952 Z -0.522 A -53.272 C -307.556 F 636 +G1 X -27.803 Y 32.721 Z -0.533 A -53.081 C -307.483 F 636 +G1 X -28.018 Y 32.482 Z -0.538 A -52.916 C -307.419 F 636 +G1 X -28.226 Y 32.239 Z -0.538 A -52.751 C -307.356 F 636 +G1 X -28.427 Y 31.992 Z -0.533 A -52.588 C -307.293 F 636 +G1 X -28.621 Y 31.743 Z -0.523 A -52.425 C -307.230 F 636 +G1 X -28.808 Y 31.491 Z -0.508 A -52.264 C -307.167 F 636 +G1 X -28.986 Y 31.237 Z -0.488 A -52.104 C -307.104 F 636 +G1 X -29.155 Y 30.981 Z -0.463 A -51.946 C -307.042 F 636 +G1 X -29.316 Y 30.723 Z -0.433 A -51.789 C -306.980 F 636 +G1 X -29.467 Y 30.464 Z -0.397 A -51.634 C -306.918 F 636 +G1 X -29.609 Y 30.203 Z -0.356 A -51.481 C -306.857 F 636 +G1 X -29.740 Y 29.942 Z -0.310 A -51.329 C -306.797 F 636 +G1 X -29.860 Y 29.681 Z -0.259 A -51.179 C -306.736 F 636 +G1 X -29.969 Y 29.420 Z -0.203 A -51.031 C -306.676 F 636 +G1 X -30.067 Y 29.159 Z -0.141 A -50.885 C -306.617 F 636 +G1 X -30.152 Y 28.899 Z -0.074 A -50.741 C -306.558 F 636 +G1 X -30.225 Y 28.639 Z -0.002 A -50.598 C -306.499 F 636 +G1 X -30.285 Y 28.381 Z 0.075 A -50.456 C -306.441 F 636 +G1 X -30.332 Y 28.125 Z 0.158 A -50.316 C -306.383 F 636 +G1 X -30.365 Y 27.870 Z 0.247 A -50.177 C -306.326 F 636 +G1 X -30.384 Y 27.618 Z 0.340 A -50.039 C -306.268 F 636 +G1 X -30.387 Y 27.368 Z 0.440 A -49.901 C -306.211 F 636 +G1 X -30.376 Y 27.121 Z 0.544 A -49.764 C -306.153 F 636 +G1 X -30.349 Y 26.878 Z 0.654 A -49.627 C -306.095 F 636 +G1 X -30.307 Y 26.638 Z 0.770 A -49.489 C -306.036 F 636 +G1 X -30.248 Y 26.402 Z 0.891 A -49.350 C -305.977 F 636 +G1 X -30.171 Y 26.170 Z 1.017 A -49.209 C -305.917 F 636 +G1 X -30.078 Y 25.942 Z 1.149 A -49.066 C -305.856 F 636 +G1 X -29.967 Y 25.720 Z 1.287 A -48.921 C -305.793 F 636 +G1 X -29.838 Y 25.503 Z 1.430 A -48.772 C -305.729 F 636 +G1 X -29.690 Y 25.291 Z 1.579 A -48.620 C -305.662 F 636 +G1 X -29.523 Y 25.085 Z 1.733 A -48.463 C -305.594 F 636 +G1 X -29.336 Y 24.885 Z 1.893 A -48.302 C -305.523 F 636 +G1 X -28.122 Y 23.670 Z 2.900 A -50.315 C -301.395 F 159 +G1 X -27.972 Y 23.514 Z 3.027 A -50.578 C -300.880 F 159 +G1 X -27.689 Y 23.179 Z 3.283 A -51.085 C -299.832 F 159 +G1 X -27.430 Y 22.815 Z 3.540 A -51.565 C -298.758 F 159 +G1 X -27.199 Y 22.420 Z 3.797 A -52.016 C -297.651 F 159 +G1 X -26.997 Y 21.994 Z 4.051 A -52.433 C -296.513 F 159 +G1 X -26.522 Y 20.745 Z 4.755 A -53.548 C -293.284 F 159 +G1 X -26.223 Y 19.946 Z 5.209 A -54.325 C -291.214 F 159 +G1 X -25.965 Y 19.267 Z 5.611 A -55.055 C -289.449 F 159 +G1 X -25.709 Y 18.586 Z 6.015 A -55.820 C -287.683 F 159 +G1 X -25.452 Y 17.910 Z 6.431 A -56.642 C -285.935 F 159 +G1 X -25.196 Y 17.233 Z 6.849 A -57.496 C -284.193 F 159 +G1 X -24.940 Y 16.560 Z 7.277 A -58.403 C -282.475 F 159 +G1 X -24.685 Y 15.887 Z 7.708 A -59.339 C -280.770 F 159 +G1 X -24.422 Y 15.197 Z 8.164 A -60.355 C -279.040 F 159 +G1 X -24.161 Y 14.506 Z 8.621 A -61.395 C -277.331 F 159 +G1 X -23.907 Y 13.843 Z 9.075 A -62.445 C -275.711 F 159 +G1 X -23.655 Y 13.179 Z 9.530 A -63.512 C -274.114 F 159 +G1 X -23.403 Y 12.521 Z 9.994 A -64.611 C -272.559 F 159 +G1 X -23.155 Y 11.872 Z 10.454 A -65.628 C -271.219 F 159 +G1 X -22.688 Y 10.729 Z 11.322 A -66.256 C -271.561 F 159 +G1 X -22.211 Y 9.600 Z 12.204 A -66.919 C -271.918 F 159 +G1 X -21.722 Y 8.486 Z 13.101 A -67.618 C -272.291 F 159 +G1 X -21.215 Y 7.374 Z 14.021 A -68.358 C -272.683 F 159 +G1 X -20.702 Y 6.300 Z 14.937 A -69.116 C -273.081 F 159 +G1 X -20.185 Y 5.266 Z 15.844 A -69.871 C -273.513 F 159 +G1 X -19.641 Y 4.242 Z 16.777 A -70.391 C -274.511 F 159 +G1 X -19.083 Y 3.246 Z 17.712 A -70.779 C -275.695 F 159 +G1 X -18.505 Y 2.274 Z 18.653 A -71.062 C -277.010 F 159 +G1 X -17.909 Y 1.328 Z 19.599 A -71.271 C -278.383 F 159 +G1 X -17.349 Y 0.493 Z 20.462 A -71.384 C -279.704 F 159 +G1 X -16.733 Y -0.370 Z 21.386 A -71.415 C -281.201 F 159 +G1 X -16.073 Y -1.232 Z 22.348 A -71.336 C -282.862 F 159 +G1 X -15.392 Y -2.060 Z 23.312 A -71.142 C -284.621 F 159 +G1 X -14.856 Y -2.669 Z 24.051 A -70.918 C -286.026 F 159 +G1 X -14.498 Y -3.052 Z 24.540 A -70.740 C -286.981 F 159 +G1 X -14.254 Y -3.286 Z 24.876 A -70.634 C -287.647 F 159 +G1 X -14.008 Y -3.502 Z 25.223 A -70.542 C -288.341 F 159 +G1 X -13.759 Y -3.699 Z 25.580 A -70.462 C -289.062 F 159 +G1 X -13.385 Y -3.960 Z 26.133 A -70.362 C -290.187 F 159 +G1 X -12.205 Y -4.581 Z 28.012 A -70.183 C -293.969 F 159 +G1 X -12.146 Y -4.607 Z 28.107 A -70.304 C -293.930 F 636 +G1 X -12.095 Y -4.620 Z 28.197 A -70.414 C -293.894 F 636 +G1 X -12.050 Y -4.620 Z 28.282 A -70.515 C -293.862 F 636 +G1 X -12.013 Y -4.609 Z 28.360 A -70.607 C -293.832 F 636 +G1 X -11.982 Y -4.587 Z 28.433 A -70.694 C -293.804 F 636 +G1 X -11.957 Y -4.554 Z 28.499 A -70.776 C -293.778 F 636 +G1 X -11.939 Y -4.510 Z 28.559 A -70.856 C -293.752 F 636 +G1 X -11.928 Y -4.457 Z 28.613 A -70.936 C -293.726 F 636 +G1 X -11.923 Y -4.395 Z 28.659 A -71.019 C -293.700 F 636 +G1 X -11.924 Y -4.325 Z 28.699 A -71.104 C -293.673 F 636 +G1 X -11.931 Y -4.246 Z 28.732 A -71.194 C -293.644 F 636 +G1 X -11.944 Y -4.159 Z 28.758 A -71.290 C -293.613 F 636 +G1 X -11.963 Y -4.066 Z 28.777 A -71.393 C -293.580 F 636 +G1 X -11.988 Y -3.966 Z 28.787 A -71.502 C -293.546 F 636 +G1 X -12.019 Y -3.860 Z 28.791 A -71.618 C -293.509 F 636 +G1 X -12.056 Y -3.749 Z 28.786 A -71.741 C -293.469 F 636 +G1 X -12.138 Y -3.530 Z 28.758 A -71.955 C -293.402 F 636 +G1 X -12.182 Y -3.427 Z 28.735 A -72.058 C -293.369 F 636 +G1 X -12.227 Y -3.329 Z 28.706 A -72.159 C -293.337 F 636 +G1 X -12.274 Y -3.237 Z 28.671 A -72.258 C -293.306 F 636 +G1 X -12.321 Y -3.151 Z 28.630 A -72.354 C -293.276 F 636 +G1 X -12.370 Y -3.073 Z 28.583 A -72.448 C -293.246 F 636 +G1 X -12.420 Y -3.001 Z 28.530 A -72.541 C -293.217 F 636 +G1 X -12.471 Y -2.938 Z 28.471 A -72.632 C -293.188 F 636 +G1 X -12.522 Y -2.883 Z 28.405 A -72.722 C -293.160 F 636 +G1 X -12.573 Y -2.837 Z 28.333 A -72.812 C -293.131 F 636 +G1 X -12.625 Y -2.801 Z 28.254 A -72.904 C -293.103 F 636 +G1 X -12.678 Y -2.774 Z 28.170 A -72.997 C -293.073 F 636 +G1 X -12.730 Y -2.759 Z 28.078 A -73.094 C -293.043 F 636 +G1 X -12.782 Y -2.754 Z 27.980 A -73.194 C -293.012 F 636 +G1 X -12.834 Y -2.761 Z 27.875 A -73.300 C -292.979 F 636 +G1 X -13.628 Y -2.966 Z 26.218 A -72.073 C -289.950 F 159 +G1 X -13.744 Y -2.990 Z 25.979 A -71.881 C -289.522 F 159 +G1 X -13.865 Y -2.986 Z 25.747 A -71.735 C -289.100 F 159 +G1 X -13.989 Y -2.954 Z 25.526 A -71.634 C -288.691 F 159 +G1 X -14.114 Y -2.895 Z 25.317 A -71.579 C -288.298 F 159 +G1 X -14.226 Y -2.821 Z 25.140 A -71.566 C -287.959 F 159 +G1 X -14.336 Y -2.727 Z 24.976 A -71.587 C -287.638 F 159 +G1 X -14.494 Y -2.554 Z 24.753 A -71.678 C -287.194 F 159 +G1 X -14.545 Y -2.488 Z 24.685 A -71.725 C -287.056 F 159 +G1 X -14.930 Y -1.917 Z 24.177 A -72.152 C -286.017 F 159 +G1 X -15.337 Y -1.267 Z 23.617 A -72.581 C -284.905 F 159 +G1 X -15.725 Y -0.600 Z 23.057 A -72.966 C -283.826 F 159 +G1 X -16.093 Y 0.083 Z 22.499 A -73.302 C -282.794 F 159 +G1 X -16.441 Y 0.781 Z 21.942 A -73.588 C -281.813 F 159 +G1 X -16.770 Y 1.493 Z 21.386 A -73.829 C -280.879 F 159 +G1 X -17.079 Y 2.218 Z 20.831 A -74.029 C -279.988 F 159 +G1 X -17.360 Y 2.934 Z 20.293 A -74.187 C -279.159 F 159 +G1 X -17.626 Y 3.670 Z 19.751 A -74.313 C -278.358 F 159 +G1 X -17.877 Y 4.428 Z 19.202 A -74.415 C -277.565 F 159 +G1 X -18.109 Y 5.198 Z 18.654 A -74.467 C -276.841 F 159 +G1 X -18.365 Y 6.142 Z 17.993 A -74.490 C -276.011 F 159 +G1 X -18.560 Y 6.950 Z 17.442 A -74.310 C -275.730 F 159 +G1 X -18.820 Y 8.184 Z 16.618 A -73.959 C -275.555 F 159 +G1 X -19.039 Y 9.434 Z 15.803 A -73.645 C -275.398 F 159 +G1 X -19.218 Y 10.694 Z 15.000 A -73.369 C -275.260 F 159 +G1 X -19.358 Y 11.967 Z 14.208 A -73.131 C -275.141 F 159 +G1 X -19.464 Y 13.298 Z 13.397 A -72.921 C -275.036 F 159 +G1 X -19.550 Y 14.662 Z 12.591 A -72.031 C -276.469 F 159 +G1 X -19.588 Y 15.381 Z 12.178 A -71.279 C -277.893 F 159 +G1 X -19.627 Y 16.098 Z 11.765 A -70.545 C -279.310 F 159 +G1 X -19.678 Y 17.534 Z 10.956 A -69.169 C -282.110 F 159 +G1 X -19.702 Y 18.742 Z 10.288 A -68.103 C -284.419 F 159 +G1 X -19.708 Y 20.100 Z 9.550 A -67.007 C -286.952 F 159 +G1 X -19.690 Y 21.530 Z 8.788 A -65.970 C -289.534 F 159 +G1 X -19.641 Y 23.105 Z 7.968 A -64.967 C -292.260 F 159 +G1 X -19.571 Y 24.528 Z 7.245 A -64.181 C -294.608 F 159 +G1 X -19.477 Y 25.947 Z 6.540 A -63.504 C -296.835 F 159 +G1 X -19.360 Y 27.363 Z 5.854 A -62.929 C -298.938 F 159 +G1 X -19.220 Y 28.776 Z 5.185 A -62.447 C -300.921 F 159 +G1 X -19.059 Y 30.186 Z 4.536 A -62.049 C -302.784 F 159 +G1 X -18.877 Y 31.595 Z 3.905 A -61.729 C -304.532 F 159 +G1 X -18.707 Y 32.788 Z 3.385 A -61.511 C -305.926 F 159 +G1 X -18.494 Y 35.036 Z 2.363 A -61.061 C -308.486 F 159 +G1 X -18.475 Y 35.285 Z 2.248 A -60.899 C -308.439 F 636 +G1 X -18.464 Y 35.526 Z 2.133 A -60.743 C -308.394 F 636 +G1 X -18.463 Y 35.758 Z 2.018 A -60.591 C -308.350 F 636 +G1 X -18.470 Y 35.981 Z 1.904 A -60.444 C -308.307 F 636 +G1 X -18.486 Y 36.196 Z 1.790 A -60.301 C -308.265 F 636 +G1 X -18.510 Y 36.402 Z 1.676 A -60.162 C -308.224 F 636 +G1 X -18.542 Y 36.599 Z 1.563 A -60.027 C -308.185 F 636 +G1 X -18.582 Y 36.789 Z 1.451 A -59.896 C -308.146 F 636 +G1 X -18.631 Y 36.969 Z 1.339 A -59.768 C -308.108 F 636 +G1 X -18.686 Y 37.142 Z 1.227 A -59.644 C -308.071 F 636 +G1 X -18.749 Y 37.306 Z 1.116 A -59.522 C -308.035 F 636 +G1 X -18.820 Y 37.462 Z 1.006 A -59.403 C -307.999 F 636 +G1 X -18.897 Y 37.610 Z 0.897 A -59.286 C -307.964 F 636 +G1 X -18.982 Y 37.749 Z 0.788 A -59.171 C -307.929 F 636 +G1 X -19.073 Y 37.881 Z 0.681 A -59.058 C -307.896 F 636 +G1 X -19.170 Y 38.005 Z 0.574 A -58.946 C -307.862 F 636 +G1 X -19.274 Y 38.121 Z 0.468 A -58.836 C -307.828 F 636 +G1 X -19.384 Y 38.228 Z 0.363 A -58.726 C -307.795 F 636 +G1 X -19.500 Y 38.328 Z 0.259 A -58.618 C -307.762 F 636 +G1 X -19.622 Y 38.421 Z 0.156 A -58.510 C -307.730 F 636 +G1 X -19.750 Y 38.505 Z 0.054 A -58.402 C -307.697 F 636 +G1 X -19.883 Y 38.582 Z -0.046 A -58.295 C -307.664 F 636 +G1 X -20.021 Y 38.651 Z -0.146 A -58.187 C -307.631 F 636 +G1 X -20.164 Y 38.713 Z -0.244 A -58.079 C -307.598 F 636 +G1 X -20.313 Y 38.767 Z -0.341 A -57.971 C -307.564 F 636 +G1 X -20.466 Y 38.814 Z -0.436 A -57.862 C -307.531 F 636 +G1 X -20.623 Y 38.853 Z -0.531 A -57.752 C -307.497 F 636 +G1 X -20.785 Y 38.885 Z -0.623 A -57.641 C -307.462 F 636 +G1 X -20.951 Y 38.910 Z -0.715 A -57.529 C -307.427 F 636 +G1 X -21.121 Y 38.927 Z -0.805 A -57.416 C -307.392 F 636 +G1 X -21.295 Y 38.937 Z -0.893 A -57.302 C -307.356 F 636 +G1 X -21.472 Y 38.940 Z -0.980 A -57.186 C -307.320 F 636 +G1 X -21.653 Y 38.936 Z -1.065 A -57.069 C -307.283 F 636 +G1 X -21.837 Y 38.925 Z -1.148 A -56.951 C -307.246 F 636 +G1 X -22.215 Y 38.883 Z -1.309 A -56.709 C -307.170 F 636 +G1 X -22.603 Y 38.813 Z -1.463 A -56.462 C -307.091 F 636 +G1 X -23.001 Y 38.716 Z -1.610 A -56.207 C -307.009 F 636 +G1 X -23.406 Y 38.592 Z -1.748 A -55.946 C -306.925 F 636 +G1 X -23.819 Y 38.442 Z -1.878 A -55.679 C -306.838 F 636 +G1 X -24.236 Y 38.267 Z -1.999 A -55.405 C -306.749 F 636 +G1 X -24.657 Y 38.066 Z -2.111 A -55.125 C -306.657 F 636 +G1 X -25.080 Y 37.841 Z -2.213 A -54.838 C -306.562 F 636 +G1 X -25.504 Y 37.591 Z -2.306 A -54.546 C -306.464 F 636 +G1 X -25.927 Y 37.317 Z -2.388 A -54.248 C -306.364 F 636 +G1 X -26.348 Y 37.020 Z -2.460 A -53.944 C -306.261 F 636 +G1 X -26.765 Y 36.700 Z -2.521 A -53.635 C -306.155 F 636 +G1 X -27.178 Y 36.357 Z -2.570 A -53.321 C -306.047 F 636 +G1 X -27.584 Y 35.992 Z -2.608 A -53.002 C -305.936 F 636 +G1 X -27.981 Y 35.606 Z -2.634 A -52.678 C -305.823 F 636 +G1 X -28.371 Y 35.203 Z -2.649 A -52.394 C -305.722 F 636 +G1 X -28.755 Y 34.788 Z -2.653 A -52.107 C -305.620 F 636 +G1 X -29.129 Y 34.365 Z -2.648 A -51.820 C -305.517 F 636 +G1 X -29.495 Y 33.932 Z -2.633 A -51.533 C -305.413 F 636 +G1 X -29.850 Y 33.491 Z -2.607 A -51.246 C -305.308 F 636 +G1 X -30.193 Y 33.044 Z -2.572 A -50.960 C -305.203 F 636 +G1 X -30.523 Y 32.590 Z -2.527 A -50.675 C -305.097 F 636 +G1 X -30.839 Y 32.132 Z -2.473 A -50.392 C -304.991 F 636 +G1 X -31.139 Y 31.670 Z -2.408 A -50.111 C -304.885 F 636 +G1 X -31.423 Y 31.206 Z -2.333 A -49.833 C -304.779 F 636 +G1 X -31.689 Y 30.739 Z -2.249 A -49.558 C -304.673 F 636 +G1 X -31.937 Y 30.272 Z -2.155 A -49.287 C -304.568 F 636 +G1 X -32.164 Y 29.805 Z -2.052 A -49.019 C -304.463 F 636 +G1 X -32.370 Y 29.339 Z -1.938 A -48.756 C -304.359 F 636 +G1 X -32.553 Y 28.876 Z -1.815 A -48.496 C -304.256 F 636 +G1 X -32.713 Y 28.416 Z -1.682 A -48.241 C -304.154 F 636 +G1 X -32.848 Y 27.960 Z -1.540 A -47.991 C -304.053 F 636 +G1 X -32.957 Y 27.509 Z -1.388 A -47.745 C -303.953 F 636 +G1 X -33.038 Y 27.064 Z -1.226 A -47.503 C -303.853 F 636 +G1 X -33.068 Y 26.845 Z -1.142 A -47.383 C -303.804 F 636 +G1 X -33.091 Y 26.627 Z -1.055 A -47.265 C -303.755 F 636 +G1 X -33.107 Y 26.412 Z -0.966 A -47.147 C -303.706 F 636 +G1 X -33.115 Y 26.199 Z -0.875 A -47.030 C -303.657 F 636 +G1 X -33.115 Y 25.988 Z -0.781 A -46.913 C -303.608 F 636 +G1 X -33.108 Y 25.779 Z -0.684 A -46.798 C -303.559 F 636 +G1 X -33.092 Y 25.573 Z -0.586 A -46.682 C -303.510 F 636 +G1 X -33.068 Y 25.370 Z -0.485 A -46.567 C -303.462 F 636 +G1 X -33.036 Y 25.170 Z -0.381 A -46.453 C -303.413 F 636 +G1 X -32.996 Y 24.972 Z -0.276 A -46.338 C -303.364 F 636 +G1 X -32.947 Y 24.778 Z -0.168 A -46.224 C -303.314 F 636 +G1 X -32.889 Y 24.587 Z -0.057 A -46.109 C -303.265 F 636 +G1 X -32.823 Y 24.399 Z 0.056 A -45.994 C -303.215 F 636 +G1 X -32.747 Y 24.215 Z 0.171 A -45.878 C -303.164 F 636 +G1 X -32.662 Y 24.034 Z 0.288 A -45.761 C -303.113 F 636 +G1 X -32.568 Y 23.857 Z 0.408 A -45.644 C -303.062 F 636 +G1 X -32.464 Y 23.684 Z 0.530 A -45.525 C -303.010 F 636 +G1 X -32.351 Y 23.515 Z 0.655 A -45.405 C -302.957 F 636 +G1 X -32.228 Y 23.350 Z 0.782 A -45.284 C -302.903 F 636 +G1 X -32.095 Y 23.189 Z 0.911 A -45.161 C -302.848 F 636 +G1 X -31.952 Y 23.032 Z 1.043 A -45.035 C -302.791 F 636 +G1 X -31.798 Y 22.880 Z 1.176 A -44.908 C -302.734 F 636 +G1 X -31.635 Y 22.733 Z 1.313 A -44.778 C -302.675 F 636 +G1 X -31.461 Y 22.590 Z 1.451 A -44.645 C -302.615 F 636 +G1 X -31.276 Y 22.452 Z 1.592 A -44.509 C -302.553 F 636 +G1 X -31.080 Y 22.319 Z 1.735 A -44.371 C -302.489 F 636 +G1 X -29.632 Y 21.381 Z 2.774 A -47.126 C -298.219 F 159 +G1 X -29.466 Y 21.272 Z 2.895 A -47.454 C -297.747 F 159 +G1 X -29.235 Y 21.079 Z 3.076 A -47.910 C -296.999 F 159 +G1 X -29.029 Y 20.851 Z 3.255 A -48.321 C -296.202 F 159 +G1 X -28.850 Y 20.585 Z 3.433 A -48.684 C -295.352 F 159 +G1 X -28.316 Y 19.527 Z 4.058 A -49.856 C -292.192 F 159 +G1 X -27.937 Y 18.766 Z 4.511 A -50.764 C -289.938 F 159 +G1 X -27.610 Y 18.111 Z 4.919 A -51.623 C -288.015 F 159 +G1 X -27.284 Y 17.455 Z 5.329 A -52.522 C -286.107 F 159 +G1 X -26.961 Y 16.804 Z 5.752 A -53.481 C -284.238 F 159 +G1 X -26.639 Y 16.152 Z 6.177 A -54.475 C -282.392 F 159 +G1 X -26.319 Y 15.505 Z 6.614 A -55.523 C -280.590 F 159 +G1 X -26.001 Y 14.858 Z 7.053 A -56.599 C -278.818 F 159 +G1 X -25.654 Y 14.152 Z 7.550 A -57.837 C -276.925 F 159 +G1 X -25.310 Y 13.445 Z 8.049 A -59.100 C -275.073 F 159 +G1 X -24.968 Y 12.747 Z 8.561 A -60.408 C -273.285 F 159 +G1 X -24.630 Y 12.048 Z 9.074 A -61.731 C -271.542 F 159 +G1 X -24.038 Y 10.862 Z 9.993 A -63.458 C -270.014 F 159 +G1 X -23.467 Y 9.781 Z 10.886 A -64.269 C -270.469 F 159 +G1 X -22.893 Y 8.714 Z 11.793 A -65.108 C -270.933 F 159 +G1 X -22.313 Y 7.661 Z 12.716 A -65.974 C -271.407 F 159 +G1 X -21.588 Y 6.386 Z 13.872 A -67.078 C -272.002 F 159 +G1 X -21.054 Y 5.473 Z 14.725 A -67.904 C -272.443 F 159 +G1 X -20.448 Y 4.476 Z 15.687 A -68.762 C -273.116 F 159 +G1 X -19.838 Y 3.520 Z 16.647 A -69.338 C -274.316 F 159 +G1 X -19.218 Y 2.585 Z 17.612 A -69.829 C -275.589 F 159 +G1 X -18.584 Y 1.672 Z 18.585 A -70.233 C -276.943 F 159 +G1 X -17.938 Y 0.786 Z 19.563 A -70.546 C -278.377 F 159 +G1 X -17.378 Y 0.055 Z 20.396 A -70.737 C -279.661 F 159 +G1 X -16.929 Y -0.505 Z 21.055 A -70.835 C -280.720 F 159 +G1 X -16.242 Y -1.322 Z 22.047 A -70.885 C -282.403 F 159 +G1 X -15.541 Y -2.105 Z 23.041 A -70.814 C -284.187 F 159 +G1 X -14.973 Y -2.702 Z 23.833 A -70.677 C -285.663 F 159 +G1 X -14.294 Y -3.374 Z 24.763 A -70.411 C -287.475 F 159 +G1 X -13.797 Y -3.837 Z 25.433 A -70.140 C -288.842 F 159 +G1 X -13.294 Y -4.282 Z 26.106 A -69.806 C -290.250 F 159 +G1 X -12.096 Y -5.117 Z 27.850 A -69.177 C -293.819 F 159 +G1 X -5.107 Y -12.135 Z 27.743 A -71.841 C -344.510 F 636 +G1 X -5.743 Y -12.714 Z 26.178 A -71.266 C -341.499 F 159 +G1 X -5.897 Y -12.823 Z 25.858 A -71.158 C -340.884 F 159 +G1 X -6.077 Y -12.915 Z 25.552 A -71.093 C -340.295 F 159 +G1 X -6.280 Y -12.989 Z 25.262 A -71.073 C -339.731 F 159 +G1 X -6.506 Y -13.044 Z 24.986 A -71.096 C -339.194 F 159 +G1 X -6.752 Y -13.079 Z 24.729 A -71.164 C -338.687 F 159 +G1 X -6.965 Y -13.092 Z 24.534 A -71.252 C -338.298 F 159 +G1 X -7.624 Y -13.087 Z 23.987 A -71.566 C -337.212 F 159 +G1 X -8.630 Y -13.044 Z 23.162 A -71.965 C -335.632 F 159 +G1 X -9.371 Y -12.989 Z 22.558 A -72.202 C -334.515 F 159 +G1 X -10.116 Y -12.912 Z 21.956 A -72.387 C -333.450 F 159 +G1 X -10.862 Y -12.815 Z 21.354 A -72.522 C -332.435 F 159 +G1 X -11.949 Y -12.639 Z 20.484 A -72.638 C -331.043 F 159 +G1 X -12.973 Y -12.437 Z 19.669 A -72.669 C -329.813 F 159 +G1 X -14.099 Y -12.177 Z 18.778 A -72.625 C -328.544 F 159 +G1 X -15.226 Y -11.878 Z 17.890 A -72.500 C -327.360 F 159 +G1 X -15.977 Y -11.658 Z 17.302 A -72.381 C -326.604 F 159 +G1 X -17.145 Y -11.282 Z 16.396 A -71.935 C -325.964 F 159 +G1 X -18.300 Y -10.875 Z 15.512 A -71.371 C -325.677 F 159 +G1 X -19.451 Y -10.435 Z 14.638 A -70.844 C -325.408 F 159 +G1 X -20.570 Y -9.977 Z 13.797 A -70.367 C -325.163 F 159 +G1 X -21.704 Y -9.484 Z 12.954 A -69.921 C -324.932 F 159 +G1 X -22.842 Y -8.961 Z 12.117 A -69.512 C -324.720 F 159 +G1 X -24.046 Y -8.382 Z 11.258 A -68.408 C -326.065 F 159 +G1 X -24.685 Y -8.067 Z 10.817 A -67.494 C -327.583 F 159 +G1 X -25.325 Y -7.755 Z 10.377 A -66.596 C -329.108 F 159 +G1 X -25.965 Y -7.433 Z 9.946 A -65.737 C -330.648 F 159 +G1 X -26.604 Y -7.114 Z 9.515 A -64.898 C -332.191 F 159 +G1 X -27.243 Y -6.787 Z 9.094 A -64.103 C -333.740 F 159 +G1 X -27.881 Y -6.462 Z 8.674 A -63.332 C -335.285 F 159 +G1 X -28.543 Y -6.117 Z 8.248 A -62.581 C -336.892 F 159 +G1 X -29.204 Y -5.773 Z 7.823 A -61.858 C -338.489 F 159 +G1 X -30.474 Y -5.098 Z 7.027 A -60.593 C -341.539 F 159 +G1 X -31.765 Y -4.398 Z 6.238 A -59.462 C -344.592 F 159 +G1 X -33.026 Y -3.700 Z 5.489 A -58.507 C -347.510 F 159 +G1 X -33.863 Y -3.232 Z 5.002 A -57.948 C -349.402 F 159 +G1 X -34.706 Y -2.797 Z 4.516 A -57.404 C -351.255 F 159 +G1 X -35.563 Y -2.396 Z 4.026 A -56.865 C -353.087 F 159 +G1 X -36.286 Y -2.086 Z 3.618 A -56.426 C -354.600 F 159 +G1 X -37.160 Y -1.744 Z 3.134 A -55.918 C -356.391 F 159 +G1 X -39.306 Y -1.002 Z 1.937 A -54.730 C -360.634 F 159 +G1 X -39.485 Y -0.948 Z 1.837 A -54.607 C -360.557 F 636 +G1 X -39.650 Y -0.915 Z 1.743 A -54.496 C -360.486 F 636 +G1 X -39.799 Y -0.903 Z 1.655 A -54.395 C -360.423 F 636 +G1 X -39.934 Y -0.911 Z 1.574 A -54.304 C -360.365 F 636 +G1 X -40.055 Y -0.938 Z 1.500 A -54.220 C -360.311 F 636 +G1 X -40.160 Y -0.984 Z 1.432 A -54.143 C -360.262 F 636 +G1 X -40.250 Y -1.048 Z 1.371 A -54.070 C -360.215 F 636 +G1 X -40.325 Y -1.130 Z 1.317 A -53.998 C -360.170 F 636 +G1 X -40.385 Y -1.230 Z 1.270 A -53.926 C -360.123 F 636 +G1 X -40.429 Y -1.347 Z 1.230 A -53.850 C -360.074 F 636 +G1 X -40.458 Y -1.480 Z 1.198 A -53.769 C -360.022 F 636 +G1 X -40.472 Y -1.629 Z 1.172 A -53.681 C -359.965 F 636 +G1 X -40.469 Y -1.794 Z 1.154 A -53.585 C -359.903 F 636 +G1 X -40.451 Y -1.973 Z 1.143 A -53.480 C -359.835 F 636 +G1 X -40.417 Y -2.167 Z 1.139 A -53.366 C -359.761 F 636 +G1 X -40.367 Y -2.375 Z 1.143 A -53.243 C -359.680 F 636 +G1 X -40.306 Y -2.586 Z 1.153 A -53.142 C -359.614 F 636 +G1 X -40.236 Y -2.788 Z 1.170 A -53.043 C -359.549 F 636 +G1 X -40.158 Y -2.981 Z 1.192 A -52.947 C -359.485 F 636 +G1 X -40.072 Y -3.165 Z 1.221 A -52.853 C -359.423 F 636 +G1 X -39.977 Y -3.339 Z 1.256 A -52.761 C -359.362 F 636 +G1 X -39.875 Y -3.502 Z 1.297 A -52.671 C -359.302 F 636 +G1 X -39.764 Y -3.654 Z 1.344 A -52.582 C -359.242 F 636 +G1 X -39.644 Y -3.794 Z 1.398 A -52.494 C -359.184 F 636 +G1 X -39.516 Y -3.922 Z 1.457 A -52.407 C -359.125 F 636 +G1 X -39.380 Y -4.038 Z 1.524 A -52.319 C -359.066 F 636 +G1 X -39.235 Y -4.141 Z 1.596 A -52.231 C -359.007 F 636 +G1 X -39.082 Y -4.230 Z 1.676 A -52.142 C -358.947 F 636 +G1 X -38.920 Y -4.305 Z 1.761 A -52.052 C -358.885 F 636 +G1 X -38.749 Y -4.365 Z 1.853 A -51.959 C -358.822 F 636 +G1 X -38.569 Y -4.411 Z 1.952 A -51.863 C -358.756 F 636 +G1 X -38.380 Y -4.440 Z 2.058 A -51.763 C -358.688 F 636 +G1 X -36.681 Y -4.632 Z 3.017 A -53.155 C -354.938 F 159 +G1 X -36.173 Y -4.705 Z 3.301 A -53.584 C -353.809 F 159 +G1 X -35.663 Y -4.804 Z 3.589 A -54.009 C -352.667 F 159 +G1 X -35.208 Y -4.914 Z 3.846 A -54.380 C -351.641 F 159 +G1 X -34.752 Y -5.046 Z 4.104 A -54.744 C -350.598 F 159 +G1 X -34.092 Y -5.277 Z 4.476 A -55.254 C -349.066 F 159 +G1 X -32.984 Y -5.750 Z 5.099 A -56.092 C -346.423 F 159 +G1 X -31.654 Y -6.323 Z 5.868 A -57.235 C -343.193 F 159 +G1 X -30.989 Y -6.605 Z 6.265 A -57.877 C -341.566 F 159 +G1 X -30.324 Y -6.889 Z 6.663 A -58.550 C -339.927 F 159 +G1 X -29.659 Y -7.167 Z 7.073 A -59.277 C -338.290 F 159 +G1 X -28.994 Y -7.448 Z 7.484 A -60.034 C -336.647 F 159 +G1 X -28.377 Y -7.703 Z 7.876 A -60.782 C -335.131 F 159 +G1 X -27.761 Y -7.961 Z 8.268 A -61.554 C -333.616 F 159 +G1 X -27.146 Y -8.213 Z 8.669 A -62.366 C -332.114 F 159 +G1 X -26.531 Y -8.467 Z 9.072 A -63.200 C -330.618 F 159 +G1 X -25.870 Y -8.735 Z 9.514 A -64.138 C -329.028 F 159 +G1 X -25.210 Y -9.005 Z 9.958 A -65.096 C -327.449 F 159 +G1 X -24.552 Y -9.269 Z 10.410 A -66.091 C -325.898 F 159 +G1 X -23.895 Y -9.534 Z 10.864 A -67.099 C -324.364 F 159 +G1 X -22.700 Y -9.998 Z 11.727 A -67.941 C -323.894 F 159 +G1 X -21.538 Y -10.426 Z 12.587 A -68.469 C -324.173 F 159 +G1 X -20.376 Y -10.832 Z 13.460 A -69.036 C -324.470 F 159 +G1 X -19.185 Y -11.223 Z 14.369 A -69.656 C -324.794 F 159 +G1 X -18.022 Y -11.579 Z 15.269 A -70.298 C -325.126 F 159 +G1 X -16.984 Y -11.873 Z 16.081 A -70.898 C -325.441 F 159 +G1 X -15.962 Y -12.136 Z 16.893 A -71.355 C -326.095 F 159 +G1 X -14.835 Y -12.396 Z 17.800 A -71.634 C -327.259 F 159 +G1 X -13.708 Y -12.624 Z 18.715 A -71.841 C -328.495 F 159 +G1 X -12.587 Y -12.815 Z 19.633 A -71.964 C -329.815 F 159 +G1 X -11.609 Y -12.953 Z 20.443 A -72.003 C -331.043 F 159 +G1 X -10.496 Y -13.074 Z 21.371 A -71.958 C -332.536 F 159 +G1 X -9.394 Y -13.153 Z 22.302 A -71.807 C -334.134 F 159 +G1 X -8.663 Y -13.183 Z 22.925 A -71.639 C -335.265 F 159 +G1 X -7.936 Y -13.193 Z 23.549 A -71.425 C -336.433 F 159 +G1 X -6.974 Y -13.177 Z 24.385 A -71.059 C -338.055 F 159 +G1 X -6.666 Y -13.154 Z 24.670 A -70.942 C -338.620 F 159 +G1 X -6.339 Y -13.105 Z 25.013 A -70.850 C -339.297 F 159 +G1 X -6.035 Y -13.032 Z 25.376 A -70.803 C -340.014 F 159 +G1 X -5.759 Y -12.936 Z 25.758 A -70.799 C -340.768 F 159 +G1 X -5.509 Y -12.821 Z 26.157 A -70.837 C -341.557 F 159 +G1 X -4.475 Y -12.165 Z 28.149 A -71.108 C -345.494 F 159 +G1 X -4.429 Y -12.126 Z 28.255 A -71.228 C -345.411 F 636 +G1 X -4.409 Y -12.087 Z 28.343 A -71.325 C -345.345 F 636 +G1 X -4.415 Y -12.049 Z 28.411 A -71.403 C -345.291 F 636 +G1 X -4.427 Y -12.030 Z 28.438 A -71.438 C -345.267 F 636 +G1 X -4.445 Y -12.011 Z 28.461 A -71.472 C -345.244 F 636 +G1 X -4.498 Y -11.974 Z 28.490 A -71.542 C -345.196 F 636 +G1 X -4.574 Y -11.939 Z 28.500 A -71.625 C -345.139 F 636 +G1 X -4.670 Y -11.906 Z 28.490 A -71.726 C -345.070 F 636 +G1 X -4.786 Y -11.877 Z 28.459 A -71.849 C -344.986 F 636 +G1 X -4.909 Y -11.853 Z 28.413 A -71.947 C -344.919 F 636 +G1 X -5.023 Y -11.837 Z 28.358 A -72.042 C -344.854 F 636 +G1 X -5.129 Y -11.830 Z 28.293 A -72.134 C -344.792 F 636 +G1 X -5.224 Y -11.832 Z 28.219 A -72.224 C -344.731 F 636 +G1 X -5.308 Y -11.843 Z 28.134 A -72.312 C -344.671 F 636 +G1 X -5.380 Y -11.865 Z 28.040 A -72.402 C -344.610 F 636 +G1 X -5.438 Y -11.898 Z 27.935 A -72.494 C -344.548 F 636 +G1 X -5.482 Y -11.942 Z 27.820 A -72.591 C -344.482 F 636 +G1 X -5.962 Y -12.610 Z 26.198 A -71.673 C -341.440 F 159 +G1 X -6.040 Y -12.699 Z 25.971 A -71.541 C -341.018 F 159 +G1 X -6.136 Y -12.778 Z 25.751 A -71.439 C -340.608 F 159 +G1 X -6.308 Y -12.876 Z 25.439 A -71.345 C -340.016 F 159 +G1 X -6.515 Y -12.948 Z 25.146 A -71.320 C -339.453 F 159 +G1 X -6.750 Y -12.993 Z 24.877 A -71.361 C -338.928 F 159 +G1 X -7.010 Y -13.009 Z 24.635 A -71.467 C -338.444 F 159 +G1 X -7.638 Y -12.985 Z 24.140 A -71.812 C -337.447 F 159 +G1 X -8.600 Y -12.912 Z 23.390 A -72.274 C -335.984 F 159 +G1 X -9.352 Y -12.829 Z 22.807 A -72.583 C -334.885 F 159 +G1 X -10.105 Y -12.724 Z 22.224 A -72.840 C -333.834 F 159 +G1 X -10.860 Y -12.595 Z 21.643 A -73.047 C -332.834 F 159 +G1 X -11.615 Y -12.446 Z 21.063 A -73.208 C -331.881 F 159 +G1 X -12.369 Y -12.275 Z 20.484 A -73.327 C -330.970 F 159 +G1 X -13.385 Y -12.012 Z 19.707 A -73.428 C -329.805 F 159 +G1 X -14.510 Y -11.679 Z 18.846 A -73.476 C -328.565 F 159 +G1 X -15.636 Y -11.301 Z 17.988 A -73.424 C -327.456 F 159 +G1 X -16.696 Y -10.907 Z 17.182 A -73.237 C -326.645 F 159 +G1 X -17.841 Y -10.438 Z 16.321 A -72.769 C -326.387 F 159 +G1 X -18.980 Y -9.932 Z 15.468 A -72.330 C -326.165 F 159 +G1 X -20.108 Y -9.393 Z 14.628 A -71.930 C -325.963 F 159 +G1 X -21.004 Y -8.937 Z 13.965 A -71.638 C -325.815 F 159 +G1 X -21.895 Y -8.461 Z 13.308 A -71.373 C -325.680 F 159 +G1 X -23.000 Y -7.839 Z 12.499 A -71.076 C -325.528 F 159 +G1 X -24.206 Y -7.142 Z 11.647 A -69.689 C -327.771 F 159 +G1 X -24.822 Y -6.776 Z 11.219 A -68.867 C -329.253 F 159 +G1 X -25.438 Y -6.413 Z 10.793 A -68.063 C -330.734 F 159 +G1 X -26.051 Y -6.039 Z 10.375 A -67.299 C -332.215 F 159 +G1 X -26.663 Y -5.667 Z 9.958 A -66.555 C -333.689 F 159 +G1 X -27.271 Y -5.286 Z 9.550 A -65.855 C -335.158 F 159 +G1 X -27.879 Y -4.907 Z 9.142 A -65.177 C -336.615 F 159 +G1 X -29.040 Y -4.161 Z 8.377 A -63.981 C -339.379 F 159 +G1 X -30.006 Y -3.525 Z 7.749 A -63.077 C -341.648 F 159 +G1 X -30.691 Y -3.061 Z 7.312 A -62.494 C -343.236 F 159 +G1 X -31.374 Y -2.599 Z 6.876 A -61.941 C -344.792 F 159 +G1 X -32.549 Y -1.781 Z 6.142 A -61.101 C -347.413 F 159 +G1 X -33.521 Y -1.091 Z 5.550 A -60.502 C -349.513 F 159 +G1 X -34.489 Y -0.404 Z 4.960 A -59.956 C -351.536 F 159 +G1 X -36.052 Y 0.668 Z 4.036 A -59.193 C -354.647 F 159 +G1 X -37.418 Y 1.585 Z 3.254 A -58.640 C -357.222 F 159 +G1 X -39.352 Y 2.759 Z 2.140 A -57.888 C -360.640 F 159 +G1 X -39.595 Y 2.898 Z 1.999 A -57.699 C -360.576 F 636 +G1 X -39.832 Y 3.014 Z 1.860 A -57.519 C -360.515 F 636 +G1 X -40.061 Y 3.109 Z 1.725 A -57.348 C -360.456 F 636 +G1 X -40.283 Y 3.182 Z 1.592 A -57.185 C -360.400 F 636 +G1 X -40.498 Y 3.234 Z 1.463 A -57.030 C -360.347 F 636 +G1 X -40.705 Y 3.266 Z 1.336 A -56.883 C -360.296 F 636 +G1 X -40.904 Y 3.279 Z 1.213 A -56.741 C -360.246 F 636 +G1 X -41.096 Y 3.272 Z 1.093 A -56.604 C -360.199 F 636 +G1 X -41.279 Y 3.246 Z 0.976 A -56.472 C -360.153 F 636 +G1 X -41.454 Y 3.202 Z 0.863 A -56.344 C -360.108 F 636 +G1 X -41.621 Y 3.140 Z 0.754 A -56.218 C -360.063 F 636 +G1 X -41.779 Y 3.061 Z 0.648 A -56.093 C -360.019 F 636 +G1 X -41.928 Y 2.966 Z 0.547 A -55.970 C -359.976 F 636 +G1 X -42.069 Y 2.854 Z 0.449 A -55.846 C -359.932 F 636 +G1 X -42.201 Y 2.726 Z 0.355 A -55.722 C -359.887 F 636 +G1 X -42.323 Y 2.584 Z 0.265 A -55.596 C -359.842 F 636 +G1 X -42.437 Y 2.427 Z 0.179 A -55.468 C -359.797 F 636 +G1 X -42.540 Y 2.255 Z 0.098 A -55.338 C -359.750 F 636 +G1 X -42.635 Y 2.070 Z 0.021 A -55.204 C -359.702 F 636 +G1 X -42.719 Y 1.872 Z -0.051 A -55.067 C -359.652 F 636 +G1 X -42.794 Y 1.662 Z -0.119 A -54.926 C -359.601 F 636 +G1 X -42.858 Y 1.439 Z -0.182 A -54.781 C -359.548 F 636 +G1 X -42.913 Y 1.205 Z -0.241 A -54.632 C -359.493 F 636 +G1 X -42.957 Y 0.960 Z -0.294 A -54.479 C -359.437 F 636 +G1 X -42.990 Y 0.704 Z -0.342 A -54.321 C -359.379 F 636 +G1 X -43.013 Y 0.438 Z -0.386 A -54.158 C -359.318 F 636 +G1 X -43.025 Y 0.163 Z -0.424 A -53.990 C -359.256 F 636 +G1 X -43.026 Y -0.121 Z -0.457 A -53.818 C -359.192 F 636 +G1 X -43.016 Y -0.414 Z -0.484 A -53.641 C -359.125 F 636 +G1 X -42.995 Y -0.714 Z -0.506 A -53.459 C -359.056 F 636 +G1 X -42.962 Y -1.022 Z -0.522 A -53.272 C -358.986 F 636 +G1 X -42.918 Y -1.337 Z -0.533 A -53.081 C -358.913 F 636 +G1 X -42.864 Y -1.654 Z -0.538 A -52.916 C -358.849 F 636 +G1 X -42.804 Y -1.968 Z -0.538 A -52.751 C -358.786 F 636 +G1 X -42.737 Y -2.279 Z -0.533 A -52.588 C -358.723 F 636 +G1 X -42.663 Y -2.587 Z -0.523 A -52.425 C -358.660 F 636 +G1 X -42.582 Y -2.889 Z -0.508 A -52.264 C -358.597 F 636 +G1 X -42.494 Y -3.187 Z -0.488 A -52.104 C -358.534 F 636 +G1 X -42.400 Y -3.480 Z -0.463 A -51.946 C -358.472 F 636 +G1 X -42.298 Y -3.766 Z -0.433 A -51.789 C -358.410 F 636 +G1 X -42.190 Y -4.046 Z -0.397 A -51.634 C -358.348 F 636 +G1 X -42.075 Y -4.319 Z -0.356 A -51.481 C -358.287 F 636 +G1 X -41.952 Y -4.584 Z -0.310 A -51.329 C -358.227 F 636 +G1 X -41.823 Y -4.841 Z -0.259 A -51.179 C -358.166 F 636 +G1 X -41.687 Y -5.089 Z -0.203 A -51.031 C -358.106 F 636 +G1 X -41.544 Y -5.328 Z -0.141 A -50.885 C -358.047 F 636 +G1 X -41.393 Y -5.557 Z -0.074 A -50.741 C -357.988 F 636 +G1 X -41.236 Y -5.776 Z -0.002 A -50.598 C -357.929 F 636 +G1 X -41.072 Y -5.984 Z 0.075 A -50.456 C -357.871 F 636 +G1 X -40.900 Y -6.180 Z 0.158 A -50.316 C -357.813 F 636 +G1 X -40.722 Y -6.364 Z 0.247 A -50.177 C -357.756 F 636 +G1 X -40.536 Y -6.536 Z 0.340 A -50.039 C -357.698 F 636 +G1 X -40.343 Y -6.695 Z 0.440 A -49.901 C -357.641 F 636 +G1 X -40.144 Y -6.840 Z 0.544 A -49.764 C -357.583 F 636 +G1 X -39.936 Y -6.971 Z 0.654 A -49.627 C -357.525 F 636 +G1 X -39.722 Y -7.087 Z 0.770 A -49.489 C -357.466 F 636 +G1 X -39.501 Y -7.188 Z 0.891 A -49.350 C -357.407 F 636 +G1 X -39.272 Y -7.273 Z 1.017 A -49.209 C -357.347 F 636 +G1 X -39.036 Y -7.342 Z 1.149 A -49.066 C -357.286 F 636 +G1 X -38.793 Y -7.394 Z 1.287 A -48.921 C -357.223 F 636 +G1 X -38.542 Y -7.428 Z 1.430 A -48.772 C -357.159 F 636 +G1 X -38.284 Y -7.445 Z 1.579 A -48.620 C -357.092 F 636 +G1 X -38.019 Y -7.443 Z 1.733 A -48.463 C -357.024 F 636 +G1 X -37.746 Y -7.421 Z 1.893 A -48.302 C -356.953 F 636 +G1 X -36.040 Y -7.230 Z 2.900 A -50.315 C -352.825 F 159 +G1 X -35.824 Y -7.210 Z 3.027 A -50.578 C -352.309 F 159 +G1 X -35.386 Y -7.197 Z 3.283 A -51.085 C -351.262 F 159 +G1 X -34.940 Y -7.222 Z 3.540 A -51.565 C -350.188 F 159 +G1 X -34.487 Y -7.287 Z 3.797 A -52.016 C -349.081 F 159 +G1 X -34.028 Y -7.395 Z 4.051 A -52.433 C -347.943 F 159 +G1 X -32.755 Y -7.802 Z 4.755 A -53.548 C -344.714 F 159 +G1 X -31.944 Y -8.066 Z 5.209 A -54.325 C -342.643 F 159 +G1 X -31.252 Y -8.288 Z 5.611 A -55.055 C -340.879 F 159 +G1 X -30.560 Y -8.513 Z 6.015 A -55.820 C -339.113 F 159 +G1 X -29.871 Y -8.733 Z 6.431 A -56.642 C -337.365 F 159 +G1 X -29.182 Y -8.956 Z 6.849 A -57.496 C -335.623 F 159 +G1 X -28.497 Y -9.174 Z 7.277 A -58.403 C -333.905 F 159 +G1 X -27.812 Y -9.395 Z 7.708 A -59.339 C -332.200 F 159 +G1 X -27.108 Y -9.619 Z 8.164 A -60.355 C -330.470 F 159 +G1 X -26.405 Y -9.846 Z 8.621 A -61.395 C -328.761 F 159 +G1 X -25.728 Y -10.061 Z 9.075 A -62.445 C -327.141 F 159 +G1 X -25.052 Y -10.278 Z 9.530 A -63.512 C -325.544 F 159 +G1 X -24.381 Y -10.491 Z 9.994 A -64.611 C -323.989 F 159 +G1 X -23.719 Y -10.702 Z 10.454 A -65.628 C -322.649 F 159 +G1 X -22.534 Y -11.049 Z 11.322 A -66.256 C -322.991 F 159 +G1 X -21.354 Y -11.380 Z 12.204 A -66.919 C -323.348 F 159 +G1 X -20.178 Y -11.693 Z 13.101 A -67.618 C -323.721 F 159 +G1 X -18.992 Y -11.989 Z 14.021 A -68.358 C -324.113 F 159 +G1 X -17.832 Y -12.258 Z 14.937 A -69.116 C -324.511 F 159 +G1 X -16.702 Y -12.499 Z 15.844 A -69.871 C -324.943 F 159 +G1 X -15.562 Y -12.712 Z 16.777 A -70.391 C -325.941 F 159 +G1 X -14.435 Y -12.896 Z 17.712 A -70.779 C -327.125 F 159 +G1 X -13.316 Y -13.050 Z 18.653 A -71.062 C -328.440 F 159 +G1 X -12.204 Y -13.174 Z 19.599 A -71.271 C -329.813 F 159 +G1 X -11.202 Y -13.257 Z 20.462 A -71.384 C -331.134 F 159 +G1 X -10.144 Y -13.313 Z 21.386 A -71.415 C -332.631 F 159 +G1 X -9.058 Y -13.335 Z 22.348 A -71.336 C -334.292 F 159 +G1 X -7.986 Y -13.319 Z 23.312 A -71.142 C -336.051 F 159 +G1 X -7.176 Y -13.280 Z 24.051 A -70.918 C -337.456 F 159 +G1 X -6.653 Y -13.238 Z 24.540 A -70.740 C -338.411 F 159 +G1 X -6.318 Y -13.194 Z 24.876 A -70.634 C -339.077 F 159 +G1 X -5.995 Y -13.135 Z 25.223 A -70.542 C -339.771 F 159 +G1 X -5.687 Y -13.064 Z 25.580 A -70.462 C -340.492 F 159 +G1 X -5.249 Y -12.935 Z 26.133 A -70.362 C -341.617 F 159 +G1 X -4.028 Y -12.398 Z 28.012 A -70.183 C -345.399 F 159 +G1 X -3.971 Y -12.369 Z 28.107 A -70.304 C -345.360 F 636 +G1 X -3.929 Y -12.337 Z 28.197 A -70.414 C -345.324 F 636 +G1 X -3.901 Y -12.302 Z 28.282 A -70.515 C -345.292 F 636 +G1 X -3.886 Y -12.266 Z 28.360 A -70.607 C -345.262 F 636 +G1 X -3.884 Y -12.228 Z 28.433 A -70.694 C -345.234 F 636 +G1 X -3.895 Y -12.188 Z 28.499 A -70.776 C -345.208 F 636 +G1 X -3.917 Y -12.147 Z 28.559 A -70.856 C -345.182 F 636 +G1 X -3.952 Y -12.105 Z 28.613 A -70.936 C -345.156 F 636 +G1 X -3.997 Y -12.062 Z 28.659 A -71.019 C -345.130 F 636 +G1 X -4.053 Y -12.019 Z 28.699 A -71.104 C -345.103 F 636 +G1 X -4.119 Y -11.975 Z 28.732 A -71.194 C -345.074 F 636 +G1 X -4.195 Y -11.932 Z 28.758 A -71.290 C -345.043 F 636 +G1 X -4.280 Y -11.889 Z 28.777 A -71.393 C -345.010 F 636 +G1 X -4.373 Y -11.846 Z 28.787 A -71.502 C -344.976 F 636 +G1 X -4.475 Y -11.804 Z 28.791 A -71.618 C -344.939 F 636 +G1 X -4.585 Y -11.763 Z 28.786 A -71.741 C -344.899 F 636 +G1 X -4.808 Y -11.691 Z 28.758 A -71.955 C -344.832 F 636 +G1 X -4.916 Y -11.661 Z 28.735 A -72.058 C -344.799 F 636 +G1 X -5.020 Y -11.635 Z 28.706 A -72.159 C -344.767 F 636 +G1 X -5.121 Y -11.614 Z 28.671 A -72.258 C -344.736 F 636 +G1 X -5.218 Y -11.598 Z 28.630 A -72.354 C -344.706 F 636 +G1 X -5.310 Y -11.587 Z 28.583 A -72.448 C -344.676 F 636 +G1 X -5.397 Y -11.582 Z 28.530 A -72.541 C -344.647 F 636 +G1 X -5.478 Y -11.582 Z 28.471 A -72.632 C -344.618 F 636 +G1 X -5.553 Y -11.587 Z 28.405 A -72.722 C -344.590 F 636 +G1 X -5.621 Y -11.599 Z 28.333 A -72.812 C -344.561 F 636 +G1 X -5.682 Y -11.617 Z 28.254 A -72.904 C -344.533 F 636 +G1 X -5.735 Y -11.642 Z 28.170 A -72.997 C -344.503 F 636 +G1 X -5.780 Y -11.673 Z 28.078 A -73.094 C -344.473 F 636 +G1 X -5.816 Y -11.711 Z 27.980 A -73.194 C -344.442 F 636 +G1 X -5.843 Y -11.756 Z 27.875 A -73.300 C -344.409 F 636 +G1 X -6.178 Y -12.504 Z 26.218 A -72.073 C -341.380 F 159 +G1 X -6.231 Y -12.610 Z 25.979 A -71.881 C -340.952 F 159 +G1 X -6.310 Y -12.702 Z 25.747 A -71.735 C -340.530 F 159 +G1 X -6.413 Y -12.779 Z 25.526 A -71.634 C -340.121 F 159 +G1 X -6.536 Y -12.840 Z 25.317 A -71.579 C -339.728 F 159 +G1 X -6.664 Y -12.881 Z 25.140 A -71.566 C -339.389 F 159 +G1 X -6.806 Y -12.909 Z 24.976 A -71.587 C -339.068 F 159 +G1 X -7.040 Y -12.925 Z 24.753 A -71.678 C -338.624 F 159 +G1 X -7.123 Y -12.923 Z 24.685 A -71.725 C -338.486 F 159 +G1 X -7.809 Y -12.868 Z 24.177 A -72.152 C -337.447 F 159 +G1 X -8.572 Y -12.781 Z 23.617 A -72.581 C -336.335 F 159 +G1 X -9.335 Y -12.669 Z 23.057 A -72.966 C -335.256 F 159 +G1 X -10.098 Y -12.531 Z 22.499 A -73.302 C -334.224 F 159 +G1 X -10.861 Y -12.368 Z 21.942 A -73.588 C -333.243 F 159 +G1 X -11.622 Y -12.181 Z 21.386 A -73.829 C -332.309 F 159 +G1 X -12.382 Y -11.970 Z 20.831 A -74.029 C -331.418 F 159 +G1 X -13.118 Y -11.743 Z 20.293 A -74.187 C -330.589 F 159 +G1 X -13.858 Y -11.493 Z 19.751 A -74.313 C -329.788 F 159 +G1 X -14.607 Y -11.216 Z 19.202 A -74.415 C -328.995 F 159 +G1 X -15.354 Y -10.918 Z 18.654 A -74.467 C -328.271 F 159 +G1 X -16.252 Y -10.530 Z 17.993 A -74.490 C -327.441 F 159 +G1 X -17.006 Y -10.178 Z 17.442 A -74.310 C -327.160 F 159 +G1 X -18.133 Y -9.612 Z 16.618 A -73.959 C -326.985 F 159 +G1 X -19.247 Y -9.004 Z 15.803 A -73.645 C -326.828 F 159 +G1 X -20.343 Y -8.358 Z 15.000 A -73.369 C -326.690 F 159 +G1 X -21.425 Y -7.674 Z 14.208 A -73.131 C -326.571 F 159 +G1 X -22.532 Y -6.928 Z 13.397 A -72.921 C -326.466 F 159 +G1 X -23.652 Y -6.144 Z 12.591 A -72.031 C -327.899 F 159 +G1 X -24.238 Y -5.725 Z 12.178 A -71.279 C -329.323 F 159 +G1 X -24.823 Y -5.308 Z 11.765 A -70.545 C -330.740 F 159 +G1 X -25.978 Y -4.453 Z 10.956 A -69.169 C -333.540 F 159 +G1 X -26.937 Y -3.719 Z 10.288 A -68.103 C -335.849 F 159 +G1 X -28.002 Y -2.878 Z 9.550 A -67.007 C -338.382 F 159 +G1 X -29.110 Y -1.971 Z 8.788 A -65.970 C -340.964 F 159 +G1 X -30.311 Y -0.951 Z 7.968 A -64.967 C -343.690 F 159 +G1 X -31.379 Y -0.009 Z 7.245 A -64.181 C -346.038 F 159 +G1 X -32.430 Y 0.949 Z 6.540 A -63.504 C -348.265 F 159 +G1 X -33.464 Y 1.923 Z 5.854 A -62.929 C -350.368 F 159 +G1 X -34.481 Y 2.914 Z 5.185 A -62.447 C -352.351 F 159 +G1 X -35.484 Y 3.919 Z 4.536 A -62.049 C -354.214 F 159 +G1 X -36.472 Y 4.940 Z 3.905 A -61.729 C -355.962 F 159 +G1 X -37.298 Y 5.816 Z 3.385 A -61.511 C -357.356 F 159 +G1 X -38.923 Y 7.384 Z 2.363 A -61.061 C -359.916 F 159 +G1 X -39.106 Y 7.555 Z 2.248 A -60.899 C -359.869 F 636 +G1 X -39.288 Y 7.713 Z 2.133 A -60.743 C -359.824 F 636 +G1 X -39.468 Y 7.859 Z 2.018 A -60.591 C -359.780 F 636 +G1 X -39.647 Y 7.992 Z 1.904 A -60.444 C -359.737 F 636 +G1 X -39.825 Y 8.114 Z 1.790 A -60.301 C -359.695 F 636 +G1 X -40.001 Y 8.223 Z 1.676 A -60.162 C -359.654 F 636 +G1 X -40.176 Y 8.321 Z 1.563 A -60.027 C -359.615 F 636 +G1 X -40.349 Y 8.408 Z 1.451 A -59.896 C -359.576 F 636 +G1 X -40.520 Y 8.483 Z 1.339 A -59.768 C -359.538 F 636 +G1 X -40.690 Y 8.547 Z 1.227 A -59.644 C -359.501 F 636 +G1 X -40.857 Y 8.600 Z 1.116 A -59.522 C -359.465 F 636 +G1 X -41.023 Y 8.642 Z 1.006 A -59.402 C -359.429 F 636 +G1 X -41.187 Y 8.674 Z 0.897 A -59.286 C -359.394 F 636 +G1 X -41.349 Y 8.695 Z 0.788 A -59.171 C -359.359 F 636 +G1 X -41.508 Y 8.706 Z 0.681 A -59.058 C -359.326 F 636 +G1 X -41.666 Y 8.707 Z 0.574 A -58.946 C -359.292 F 636 +G1 X -41.821 Y 8.698 Z 0.468 A -58.836 C -359.258 F 636 +G1 X -41.974 Y 8.679 Z 0.363 A -58.726 C -359.225 F 636 +G1 X -42.125 Y 8.650 Z 0.259 A -58.618 C -359.193 F 636 +G1 X -42.273 Y 8.612 Z 0.156 A -58.510 C -359.160 F 636 +G1 X -42.419 Y 8.565 Z 0.054 A -58.402 C -359.127 F 636 +G1 X -42.561 Y 8.509 Z -0.046 A -58.295 C -359.094 F 636 +G1 X -42.702 Y 8.444 Z -0.146 A -58.187 C -359.061 F 636 +G1 X -42.839 Y 8.371 Z -0.244 A -58.079 C -359.028 F 636 +G1 X -42.974 Y 8.289 Z -0.341 A -57.971 C -358.994 F 636 +G1 X -43.106 Y 8.198 Z -0.436 A -57.862 C -358.961 F 636 +G1 X -43.235 Y 8.100 Z -0.531 A -57.752 C -358.927 F 636 +G1 X -43.361 Y 7.993 Z -0.623 A -57.641 C -358.892 F 636 +G1 X -43.484 Y 7.879 Z -0.715 A -57.529 C -358.857 F 636 +G1 X -43.603 Y 7.756 Z -0.805 A -57.416 C -358.822 F 636 +G1 X -43.720 Y 7.627 Z -0.893 A -57.302 C -358.786 F 636 +G1 X -43.833 Y 7.490 Z -0.980 A -57.186 C -358.750 F 636 +G1 X -43.942 Y 7.346 Z -1.065 A -57.069 C -358.713 F 636 +G1 X -44.049 Y 7.195 Z -1.148 A -56.951 C -358.676 F 636 +G1 X -44.251 Y 6.874 Z -1.309 A -56.709 C -358.600 F 636 +G1 X -44.438 Y 6.526 Z -1.463 A -56.462 C -358.521 F 636 +G1 X -44.610 Y 6.155 Z -1.610 A -56.207 C -358.439 F 636 +G1 X -44.766 Y 5.761 Z -1.748 A -55.946 C -358.355 F 636 +G1 X -44.906 Y 5.345 Z -1.878 A -55.679 C -358.268 F 636 +G1 X -45.029 Y 4.909 Z -1.999 A -55.405 C -358.179 F 636 +G1 X -45.135 Y 4.455 Z -2.111 A -55.125 C -358.087 F 636 +G1 X -45.222 Y 3.984 Z -2.213 A -54.838 C -357.992 F 636 +G1 X -45.291 Y 3.497 Z -2.306 A -54.546 C -357.894 F 636 +G1 X -45.341 Y 2.995 Z -2.388 A -54.248 C -357.794 F 636 +G1 X -45.371 Y 2.481 Z -2.460 A -53.944 C -357.691 F 636 +G1 X -45.381 Y 1.955 Z -2.521 A -53.635 C -357.585 F 636 +G1 X -45.370 Y 1.419 Z -2.570 A -53.321 C -357.477 F 636 +G1 X -45.338 Y 0.874 Z -2.608 A -53.002 C -357.366 F 636 +G1 X -45.284 Y 0.322 Z -2.634 A -52.678 C -357.253 F 636 +G1 X -45.212 Y -0.234 Z -2.649 A -52.394 C -357.152 F 636 +G1 X -45.127 Y -0.792 Z -2.653 A -52.107 C -357.050 F 636 +G1 X -45.029 Y -1.350 Z -2.648 A -51.821 C -356.947 F 636 +G1 X -44.919 Y -1.905 Z -2.633 A -51.533 C -356.843 F 636 +G1 X -44.795 Y -2.457 Z -2.607 A -51.246 C -356.738 F 636 +G1 X -44.659 Y -3.004 Z -2.572 A -50.960 C -356.633 F 636 +G1 X -44.511 Y -3.545 Z -2.527 A -50.675 C -356.527 F 636 +G1 X -44.350 Y -4.078 Z -2.473 A -50.392 C -356.421 F 636 +G1 X -44.176 Y -4.601 Z -2.408 A -50.111 C -356.315 F 636 +G1 X -43.990 Y -5.112 Z -2.333 A -49.833 C -356.209 F 636 +G1 X -43.791 Y -5.611 Z -2.249 A -49.558 C -356.103 F 636 +G1 X -43.580 Y -6.096 Z -2.155 A -49.287 C -355.998 F 636 +G1 X -43.356 Y -6.565 Z -2.052 A -49.019 C -355.893 F 636 +G1 X -43.120 Y -7.016 Z -1.938 A -48.756 C -355.789 F 636 +G1 X -42.872 Y -7.448 Z -1.815 A -48.496 C -355.686 F 636 +G1 X -42.612 Y -7.860 Z -1.682 A -48.241 C -355.584 F 636 +G1 X -42.340 Y -8.250 Z -1.540 A -47.991 C -355.483 F 636 +G1 X -42.055 Y -8.616 Z -1.388 A -47.745 C -355.383 F 636 +G1 X -41.759 Y -8.957 Z -1.226 A -47.503 C -355.283 F 636 +G1 X -41.606 Y -9.117 Z -1.142 A -47.383 C -355.234 F 636 +G1 X -41.450 Y -9.271 Z -1.055 A -47.265 C -355.185 F 636 +G1 X -41.291 Y -9.417 Z -0.966 A -47.147 C -355.136 F 636 +G1 X -41.129 Y -9.557 Z -0.875 A -47.030 C -355.087 F 636 +G1 X -40.965 Y -9.688 Z -0.781 A -46.913 C -355.038 F 636 +G1 X -40.797 Y -9.813 Z -0.684 A -46.798 C -354.989 F 636 +G1 X -40.626 Y -9.929 Z -0.586 A -46.682 C -354.940 F 636 +G1 X -40.453 Y -10.037 Z -0.485 A -46.567 C -354.892 F 636 +G1 X -40.276 Y -10.137 Z -0.381 A -46.453 C -354.843 F 636 +G1 X -40.096 Y -10.228 Z -0.276 A -46.338 C -354.794 F 636 +G1 X -39.914 Y -10.311 Z -0.168 A -46.224 C -354.744 F 636 +G1 X -39.728 Y -10.385 Z -0.057 A -46.109 C -354.695 F 636 +G1 X -39.540 Y -10.450 Z 0.056 A -45.994 C -354.645 F 636 +G1 X -39.349 Y -10.506 Z 0.171 A -45.878 C -354.594 F 636 +G1 X -39.155 Y -10.552 Z 0.288 A -45.761 C -354.544 F 636 +G1 X -38.958 Y -10.589 Z 0.408 A -45.644 C -354.492 F 636 +G1 X -38.758 Y -10.616 Z 0.530 A -45.525 C -354.440 F 636 +G1 X -38.555 Y -10.633 Z 0.655 A -45.405 C -354.387 F 636 +G1 X -38.349 Y -10.639 Z 0.782 A -45.284 C -354.333 F 636 +G1 X -38.140 Y -10.636 Z 0.911 A -45.161 C -354.278 F 636 +G1 X -37.929 Y -10.621 Z 1.043 A -45.035 C -354.221 F 636 +G1 X -37.714 Y -10.596 Z 1.176 A -44.908 C -354.164 F 636 +G1 X -37.497 Y -10.560 Z 1.313 A -44.778 C -354.105 F 636 +G1 X -37.277 Y -10.513 Z 1.451 A -44.645 C -354.045 F 636 +G1 X -37.054 Y -10.455 Z 1.592 A -44.509 C -353.983 F 636 +G1 X -36.828 Y -10.384 Z 1.735 A -44.371 C -353.919 F 636 +G1 X -35.191 Y -9.837 Z 2.774 A -47.126 C -349.649 F 159 +G1 X -35.002 Y -9.775 Z 2.895 A -47.454 C -349.177 F 159 +G1 X -34.708 Y -9.715 Z 3.076 A -47.910 C -348.428 F 159 +G1 X -34.401 Y -9.697 Z 3.255 A -48.321 C -347.632 F 159 +G1 X -34.081 Y -9.722 Z 3.433 A -48.684 C -346.782 F 159 +G1 X -32.921 Y -9.964 Z 4.058 A -49.856 C -343.622 F 159 +G1 X -32.090 Y -10.143 Z 4.511 A -50.764 C -341.368 F 159 +G1 X -31.374 Y -10.295 Z 4.919 A -51.623 C -339.445 F 159 +G1 X -30.658 Y -10.450 Z 5.329 A -52.522 C -337.537 F 159 +G1 X -29.947 Y -10.602 Z 5.752 A -53.481 C -335.668 F 159 +G1 X -29.237 Y -10.757 Z 6.177 A -54.475 C -333.822 F 159 +G1 X -28.532 Y -10.910 Z 6.614 A -55.523 C -332.020 F 159 +G1 X -27.827 Y -11.066 Z 7.053 A -56.599 C -330.248 F 159 +G1 X -27.059 Y -11.234 Z 7.550 A -57.837 C -328.355 F 159 +G1 X -26.292 Y -11.406 Z 8.049 A -59.100 C -326.503 F 159 +G1 X -25.533 Y -11.574 Z 8.561 A -60.408 C -324.715 F 159 +G1 X -24.775 Y -11.745 Z 9.074 A -61.731 C -322.972 F 159 +G1 X -23.479 Y -12.021 Z 9.993 A -63.458 C -321.444 F 159 +G1 X -22.278 Y -12.249 Z 10.886 A -64.269 C -321.899 F 159 +G1 X -21.086 Y -12.466 Z 11.793 A -65.108 C -322.363 F 159 +G1 X -19.901 Y -12.669 Z 12.716 A -65.974 C -322.837 F 159 +G1 X -18.453 Y -12.897 Z 13.872 A -67.078 C -323.432 F 159 +G1 X -17.406 Y -13.048 Z 14.725 A -67.904 C -323.873 F 159 +G1 X -16.248 Y -13.196 Z 15.687 A -68.762 C -324.546 F 159 +G1 X -15.120 Y -13.316 Z 16.647 A -69.338 C -325.746 F 159 +G1 X -14.003 Y -13.414 Z 17.612 A -69.829 C -327.019 F 159 +G1 X -12.894 Y -13.487 Z 18.585 A -70.233 C -328.373 F 159 +G1 X -11.798 Y -13.535 Z 19.563 A -70.546 C -329.807 F 159 +G1 X -10.877 Y -13.552 Z 20.396 A -70.737 C -331.091 F 159 +G1 X -10.160 Y -13.551 Z 21.055 A -70.835 C -332.150 F 159 +G1 X -9.093 Y -13.523 Z 22.047 A -70.885 C -333.833 F 159 +G1 X -8.044 Y -13.463 Z 23.041 A -70.814 C -335.617 F 159 +G1 X -7.222 Y -13.391 Z 23.833 A -70.677 C -337.093 F 159 +G1 X -6.273 Y -13.279 Z 24.763 A -70.411 C -338.905 F 159 +G1 X -5.602 Y -13.179 Z 25.433 A -70.140 C -340.272 F 159 +G1 X -4.941 Y -13.063 Z 26.106 A -69.806 C -341.680 F 159 +G1 X -3.541 Y -12.648 Z 27.850 A -69.177 C -345.249 F 159 +G1 X -4.017 Y -14.455 Z 28.561 A -69.177 C -345.249 F 318 +G0 X -7.689 Y -28.403 Z 34.047 A -69.177 C -345.249 +( --- Operation 2 ) +G0 X 13.646 Y -21.890 Z 36.873 A -43.236 C -43.723 +G0 X 8.468 Y -16.476 Z 28.905 A -43.236 C -43.723 +G1 X 7.522 Y -15.486 Z 27.448 A -43.236 C -43.723 F 318 +G1 X 5.444 Y -17.383 Z 25.201 A -43.236 C -43.723 F 159 +G1 X 5.218 Y -17.603 Z 24.960 A -43.228 C -43.744 F 159 +G1 X 4.518 Y -18.257 Z 24.237 A -43.206 C -43.810 F 159 +G1 X 3.914 Y -18.787 Z 23.640 A -43.188 C -43.866 F 159 +G1 X 3.295 Y -19.301 Z 23.052 A -43.171 C -43.921 F 159 +G1 X 2.659 Y -19.801 Z 22.468 A -43.155 C -43.976 F 159 +G1 X 2.005 Y -20.290 Z 21.889 A -43.139 C -44.032 F 159 +G1 X 1.336 Y -20.759 Z 21.315 A -43.125 C -44.087 F 159 +G1 X 0.620 Y -21.239 Z 20.720 A -43.112 C -44.146 F 159 +G1 X -0.324 Y -21.830 Z 19.965 A -43.095 C -44.221 F 159 +G1 X -1.405 Y -22.455 Z 19.135 A -43.079 C -44.304 F 159 +G1 X -2.513 Y -23.046 Z 18.317 A -43.065 C -44.387 F 159 +G1 X -3.264 Y -23.420 Z 17.781 A -43.057 C -44.442 F 159 +G1 X -4.414 Y -23.953 Z 16.985 A -43.046 C -44.523 F 159 +G1 X -5.193 Y -24.289 Z 16.460 A -43.040 C -44.578 F 159 +G1 X -6.446 Y -24.791 Z 15.642 A -43.031 C -44.663 F 159 +G1 X -7.658 Y -25.233 Z 14.875 A -43.025 C -44.744 F 159 +G1 X -8.884 Y -25.643 Z 14.125 A -43.021 C -44.823 F 159 +G1 X -10.128 Y -26.020 Z 13.385 A -43.018 C -44.901 F 159 +G1 X -11.387 Y -26.366 Z 12.658 A -43.017 C -44.979 F 159 +G1 X -12.662 Y -26.683 Z 11.943 A -43.017 C -45.056 F 159 +G1 X -14.058 Y -26.993 Z 11.181 A -43.019 C -45.138 F 159 +G1 X -15.372 Y -27.253 Z 10.485 A -43.023 C -45.214 F 159 +G1 X -16.692 Y -27.485 Z 9.805 A -43.028 C -45.289 F 159 +G1 X -18.020 Y -27.689 Z 9.139 A -43.034 C -45.362 F 159 +G1 X -19.358 Y -27.869 Z 8.487 A -43.041 C -45.435 F 159 +G1 X -20.708 Y -28.025 Z 7.849 A -43.050 C -45.507 F 159 +G1 X -22.066 Y -28.158 Z 7.224 A -43.060 C -45.578 F 159 +G1 X -23.437 Y -28.269 Z 6.613 A -43.071 C -45.648 F 159 +G1 X -27.224 Y -28.455 Z 4.806 A -43.071 C -45.648 F 159 +G1 X -27.467 Y -28.463 Z 4.686 A -43.071 C -45.649 F 636 +G1 X -27.701 Y -28.460 Z 4.560 A -43.071 C -45.649 F 636 +G1 X -27.927 Y -28.448 Z 4.429 A -43.071 C -45.649 F 636 +G1 X -28.145 Y -28.425 Z 4.293 A -43.071 C -45.649 F 636 +G1 X -28.356 Y -28.393 Z 4.151 A -43.071 C -45.650 F 636 +G1 X -28.558 Y -28.352 Z 4.004 A -43.071 C -45.650 F 636 +G1 X -28.752 Y -28.300 Z 3.851 A -43.071 C -45.650 F 636 +G1 X -28.938 Y -28.239 Z 3.694 A -43.071 C -45.650 F 636 +G1 X -29.116 Y -28.168 Z 3.531 A -43.071 C -45.651 F 636 +G1 X -29.286 Y -28.088 Z 3.363 A -43.071 C -45.651 F 636 +G1 X -29.448 Y -27.998 Z 3.189 A -43.071 C -45.651 F 636 +G1 X -29.602 Y -27.899 Z 3.011 A -43.071 C -45.651 F 636 +G1 X -29.748 Y -27.790 Z 2.827 A -43.071 C -45.652 F 636 +G1 X -29.885 Y -27.672 Z 2.638 A -43.072 C -45.652 F 636 +G1 X -30.015 Y -27.544 Z 2.444 A -43.072 C -45.652 F 636 +G1 X -30.137 Y -27.407 Z 2.245 A -43.072 C -45.653 F 636 +G1 X -30.244 Y -27.269 Z 2.053 A -43.072 C -45.653 F 636 +G1 X -30.328 Y -27.140 Z 1.881 A -43.072 C -45.653 F 636 +G1 X -30.389 Y -27.018 Z 1.729 A -43.072 C -45.654 F 636 +G1 X -30.427 Y -26.904 Z 1.597 A -43.072 C -45.654 F 636 +G1 X -30.442 Y -26.799 Z 1.485 A -43.072 C -45.654 F 636 +G1 X -30.435 Y -26.702 Z 1.393 A -43.072 C -45.654 F 636 +G1 X -30.405 Y -26.613 Z 1.321 A -43.072 C -45.654 F 636 +G1 X -30.381 Y -26.571 Z 1.293 A -43.072 C -45.655 F 636 +G1 X -30.352 Y -26.532 Z 1.269 A -43.072 C -45.655 F 636 +G1 X -30.317 Y -26.495 Z 1.251 A -43.072 C -45.655 F 636 +G1 X -30.277 Y -26.459 Z 1.237 A -43.072 C -45.655 F 636 +G1 X -30.178 Y -26.395 Z 1.225 A -43.072 C -45.655 F 636 +G1 X -30.057 Y -26.339 Z 1.234 A -43.072 C -45.655 F 636 +G1 X -29.913 Y -26.292 Z 1.262 A -43.072 C -45.655 F 636 +G1 X -29.747 Y -26.253 Z 1.311 A -43.072 C -45.656 F 636 +G1 X -29.558 Y -26.222 Z 1.379 A -43.072 C -45.656 F 636 +G1 X -29.346 Y -26.200 Z 1.468 A -43.072 C -45.656 F 636 +G1 X -29.111 Y -26.187 Z 1.577 A -43.072 C -45.657 F 636 +G1 X -25.874 Y -26.064 Z 3.146 A -43.072 C -45.657 F 159 +G1 X -24.501 Y -25.968 Z 3.768 A -43.061 C -45.587 F 159 +G1 X -23.145 Y -25.855 Z 4.405 A -43.051 C -45.518 F 159 +G1 X -21.800 Y -25.722 Z 5.056 A -43.042 C -45.447 F 159 +G1 X -20.461 Y -25.567 Z 5.723 A -43.035 C -45.376 F 159 +G1 X -19.135 Y -25.391 Z 6.404 A -43.029 C -45.304 F 159 +G1 X -17.815 Y -25.192 Z 7.102 A -43.024 C -45.232 F 159 +G1 X -16.570 Y -24.979 Z 7.778 A -43.020 C -45.162 F 159 +G1 X -15.297 Y -24.737 Z 8.489 A -43.018 C -45.089 F 159 +G1 X -14.020 Y -24.466 Z 9.222 A -43.017 C -45.015 F 159 +G1 X -12.762 Y -24.170 Z 9.964 A -43.018 C -44.940 F 159 +G1 X -11.512 Y -23.845 Z 10.723 A -43.019 C -44.864 F 159 +G1 X -10.440 Y -23.540 Z 11.390 A -43.022 C -44.797 F 159 +G1 X -9.382 Y -23.214 Z 12.067 A -43.026 C -44.730 F 159 +G1 X -8.217 Y -22.821 Z 12.831 A -43.032 C -44.655 F 159 +G1 X -7.072 Y -22.401 Z 13.605 A -43.040 C -44.579 F 159 +G1 X -5.908 Y -21.935 Z 14.417 A -43.049 C -44.500 F 159 +G1 X -4.759 Y -21.432 Z 15.245 A -43.060 C -44.419 F 159 +G1 X -3.642 Y -20.899 Z 16.077 A -43.073 C -44.339 F 159 +G1 X -2.909 Y -20.524 Z 16.641 A -43.083 C -44.285 F 159 +G1 X -1.830 Y -19.931 Z 17.497 A -43.099 C -44.204 F 159 +G1 X -0.905 Y -19.379 Z 18.259 A -43.115 C -44.132 F 159 +G1 X -0.007 Y -18.802 Z 19.028 A -43.132 C -44.060 F 159 +G1 X 0.658 Y -18.346 Z 19.616 A -43.146 C -44.006 F 159 +G1 X 1.307 Y -17.876 Z 20.210 A -43.162 C -43.951 F 159 +G1 X 1.941 Y -17.390 Z 20.809 A -43.178 C -43.897 F 159 +G1 X 2.557 Y -16.886 Z 21.410 A -43.195 C -43.842 F 159 +G1 X 3.157 Y -16.371 Z 22.020 A -43.213 C -43.788 F 159 +G1 X 3.734 Y -15.843 Z 22.627 A -43.232 C -43.735 F 159 +G1 X 4.553 Y -15.037 Z 23.533 A -43.262 C -43.656 F 159 +G1 X 6.936 Y -12.838 Z 26.203 A -43.262 C -43.656 F 159 +G1 X 7.883 Y -13.830 Z 27.659 A -43.262 C -43.656 F 318 +G0 X 14.241 Y -20.494 Z 37.446 A -43.262 C -43.656 +G0 X 15.891 Y -18.475 Z 37.831 A -41.984 C -49.766 +G0 X 17.486 Y -16.392 Z 38.086 A -41.045 C -56.144 +G0 X 19.022 Y -14.254 Z 38.210 A -40.470 C -62.719 +G0 X 20.492 Y -12.066 Z 38.203 A -40.274 C -69.398 +G0 X 21.892 Y -9.837 Z 38.065 A -40.463 C -76.077 +G0 X 23.217 Y -7.574 Z 37.797 A -41.032 C -82.655 +G0 X 24.462 Y -5.286 Z 37.399 A -41.964 C -89.037 +G0 X 25.623 Y -2.979 Z 36.873 A -43.236 C -95.153 +G0 X 18.162 Y -3.651 Z 28.905 A -43.236 C -95.153 +G1 X 16.797 Y -3.775 Z 27.448 A -43.236 C -95.153 F 318 +G1 X 16.985 Y -6.581 Z 25.201 A -43.236 C -95.153 F 159 +G1 X 17.016 Y -6.895 Z 24.960 A -43.228 C -95.174 F 159 +G1 X 17.091 Y -7.851 Z 24.237 A -43.206 C -95.240 F 159 +G1 X 17.128 Y -8.653 Z 23.640 A -43.188 C -95.296 F 159 +G1 X 17.145 Y -9.457 Z 23.052 A -43.171 C -95.351 F 159 +G1 X 17.140 Y -10.266 Z 22.468 A -43.155 C -95.406 F 159 +G1 X 17.113 Y -11.082 Z 21.889 A -43.139 C -95.462 F 159 +G1 X 17.064 Y -11.898 Z 21.315 A -43.125 C -95.517 F 159 +G1 X 16.992 Y -12.757 Z 20.720 A -43.112 C -95.576 F 159 +G1 X 16.865 Y -13.863 Z 19.965 A -43.095 C -95.651 F 159 +G1 X 16.681 Y -15.099 Z 19.135 A -43.079 C -95.734 F 159 +G1 X 16.452 Y -16.334 Z 18.317 A -43.065 C -95.817 F 159 +G1 X 16.276 Y -17.154 Z 17.781 A -43.057 C -95.872 F 159 +G1 X 15.976 Y -18.385 Z 16.985 A -43.046 C -95.953 F 159 +G1 X 15.752 Y -19.204 Z 16.460 A -43.040 C -96.008 F 159 +G1 X 15.364 Y -20.496 Z 15.642 A -43.031 C -96.093 F 159 +G1 X 14.954 Y -21.719 Z 14.875 A -43.025 C -96.173 F 159 +G1 X 14.510 Y -22.934 Z 14.125 A -43.021 C -96.253 F 159 +G1 X 14.029 Y -24.141 Z 13.385 A -43.018 C -96.331 F 159 +G1 X 13.515 Y -25.341 Z 12.658 A -43.017 C -96.409 F 159 +G1 X 12.968 Y -26.535 Z 11.943 A -43.017 C -96.486 F 159 +G1 X 12.340 Y -27.821 Z 11.181 A -43.019 C -96.568 F 159 +G1 X 11.724 Y -29.010 Z 10.485 A -43.023 C -96.644 F 159 +G1 X 11.082 Y -30.187 Z 9.805 A -43.028 C -96.719 F 159 +G1 X 10.413 Y -31.352 Z 9.139 A -43.034 C -96.792 F 159 +G1 X 9.720 Y -32.510 Z 8.487 A -43.041 C -96.865 F 159 +G1 X 9.001 Y -33.663 Z 7.849 A -43.050 C -96.937 F 159 +G1 X 8.258 Y -34.807 Z 7.224 A -43.060 C -97.008 F 159 +G1 X 7.489 Y -35.949 Z 6.613 A -43.071 C -97.078 F 159 +G1 X 5.274 Y -39.026 Z 4.806 A -43.071 C -97.078 F 159 +G1 X 5.129 Y -39.220 Z 4.686 A -43.071 C -97.079 F 636 +G1 X 4.981 Y -39.402 Z 4.560 A -43.071 C -97.079 F 636 +G1 X 4.830 Y -39.571 Z 4.429 A -43.071 C -97.079 F 636 +G1 X 4.676 Y -39.728 Z 4.293 A -43.071 C -97.079 F 636 +G1 X 4.520 Y -39.872 Z 4.151 A -43.071 C -97.080 F 636 +G1 X 4.362 Y -40.004 Z 4.004 A -43.071 C -97.080 F 636 +G1 X 4.201 Y -40.124 Z 3.851 A -43.071 C -97.080 F 636 +G1 X 4.037 Y -40.231 Z 3.694 A -43.071 C -97.080 F 636 +G1 X 3.871 Y -40.326 Z 3.531 A -43.071 C -97.081 F 636 +G1 X 3.702 Y -40.409 Z 3.363 A -43.071 C -97.081 F 636 +G1 X 3.531 Y -40.480 Z 3.189 A -43.071 C -97.081 F 636 +G1 X 3.357 Y -40.538 Z 3.011 A -43.071 C -97.081 F 636 +G1 X 3.181 Y -40.584 Z 2.827 A -43.071 C -97.082 F 636 +G1 X 3.002 Y -40.618 Z 2.638 A -43.072 C -97.082 F 636 +G1 X 2.822 Y -40.640 Z 2.444 A -43.072 C -97.082 F 636 +G1 X 2.638 Y -40.650 Z 2.245 A -43.072 C -97.082 F 636 +G1 X 2.464 Y -40.648 Z 2.053 A -43.072 C -97.083 F 636 +G1 X 2.311 Y -40.632 Z 1.881 A -43.072 C -97.083 F 636 +G1 X 2.177 Y -40.604 Z 1.729 A -43.072 C -97.084 F 636 +G1 X 2.065 Y -40.563 Z 1.597 A -43.072 C -97.084 F 636 +G1 X 1.973 Y -40.510 Z 1.485 A -43.072 C -97.084 F 636 +G1 X 1.901 Y -40.443 Z 1.393 A -43.072 C -97.084 F 636 +G1 X 1.851 Y -40.364 Z 1.321 A -43.072 C -97.084 F 636 +G1 X 1.833 Y -40.320 Z 1.293 A -43.072 C -97.085 F 636 +G1 X 1.820 Y -40.273 Z 1.269 A -43.072 C -97.085 F 636 +G1 X 1.813 Y -40.222 Z 1.251 A -43.072 C -97.085 F 636 +G1 X 1.811 Y -40.168 Z 1.237 A -43.072 C -97.085 F 636 +G1 X 1.822 Y -40.051 Z 1.225 A -43.072 C -97.085 F 636 +G1 X 1.854 Y -39.922 Z 1.234 A -43.072 C -97.085 F 636 + +G1 X 1.906 Y -39.780 Z 1.262 A -43.072 C -97.085 F 636 +G1 X 1.979 Y -39.626 Z 1.311 A -43.072 C -97.086 F 636 +G1 X 2.073 Y -39.459 Z 1.379 A -43.072 C -97.086 F 636 +G1 X 2.188 Y -39.279 Z 1.468 A -43.072 C -97.086 F 636 +G1 X 2.324 Y -39.087 Z 1.577 A -43.072 C -97.087 F 636 +G1 X 4.246 Y -36.479 Z 3.146 A -43.072 C -97.087 F 159 +G1 X 5.027 Y -35.346 Z 3.768 A -43.061 C -97.017 F 159 +G1 X 5.785 Y -34.216 Z 4.405 A -43.051 C -96.948 F 159 +G1 X 6.519 Y -33.082 Z 5.056 A -43.042 C -96.877 F 159 +G1 X 7.233 Y -31.937 Z 5.723 A -43.035 C -96.806 F 159 +G1 X 7.921 Y -30.791 Z 6.404 A -43.029 C -96.734 F 159 +G1 X 8.589 Y -29.635 Z 7.102 A -43.024 C -96.662 F 159 +G1 X 9.199 Y -28.529 Z 7.778 A -43.020 C -96.592 F 159 +G1 X 9.803 Y -27.383 Z 8.489 A -43.018 C -96.519 F 159 +G1 X 10.388 Y -26.216 Z 9.222 A -43.017 C -96.445 F 159 +G1 X 10.941 Y -25.047 Z 9.964 A -43.017 C -96.370 F 159 +G1 X 11.466 Y -23.867 Z 10.723 A -43.019 C -96.294 F 159 +G1 X 11.896 Y -22.839 Z 11.390 A -43.022 C -96.227 F 159 +G1 X 12.300 Y -21.809 Z 12.067 A -43.026 C -96.160 F 159 +G1 X 12.720 Y -20.653 Z 12.831 A -43.032 C -96.085 F 159 +G1 X 13.105 Y -19.496 Z 13.605 A -43.040 C -96.009 F 159 +G1 X 13.466 Y -18.294 Z 14.417 A -43.049 C -95.930 F 159 +G1 X 13.790 Y -17.083 Z 15.245 A -43.060 C -95.849 F 159 +G1 X 14.069 Y -15.877 Z 16.077 A -43.073 C -95.769 F 159 +G1 X 14.233 Y -15.071 Z 16.641 A -43.083 C -95.715 F 159 +G1 X 14.442 Y -13.857 Z 17.497 A -43.099 C -95.634 F 159 +G1 X 14.587 Y -12.790 Z 18.259 A -43.115 C -95.562 F 159 +G1 X 14.696 Y -11.728 Z 19.028 A -43.132 C -95.490 F 159 +G1 X 14.754 Y -10.924 Z 19.616 A -43.146 C -95.436 F 159 +G1 X 14.791 Y -10.123 Z 20.210 A -43.162 C -95.381 F 159 +G1 X 14.807 Y -9.325 Z 20.809 A -43.178 C -95.327 F 159 +G1 X 14.797 Y -8.529 Z 21.410 A -43.195 C -95.272 F 159 +G1 X 14.768 Y -7.738 Z 22.020 A -43.213 C -95.218 F 159 +G1 X 14.715 Y -6.958 Z 22.627 A -43.232 C -95.165 F 159 +G1 X 14.596 Y -5.816 Z 23.533 A -43.262 C -95.086 F 159 +G1 X 14.362 Y -2.581 Z 26.203 A -43.262 C -95.086 F 159 +G1 X 15.728 Y -2.460 Z 27.659 A -43.262 C -95.086 F 318 +G0 X 24.902 Y -1.643 Z 37.446 A -43.262 C -95.086 +G0 X 24.352 Y 0.906 Z 37.831 A -41.984 C -101.196 +G0 X 23.718 Y 3.451 Z 38.086 A -41.045 C -107.574 +G0 X 23.004 Y 5.985 Z 38.210 A -40.470 C -114.149 +G0 X 22.210 Y 8.499 Z 38.203 A -40.274 C -120.828 +G0 X 21.340 Y 10.983 Z 38.065 A -40.463 C -127.507 +G0 X 20.397 Y 13.430 Z 37.797 A -41.032 C -134.085 +G0 X 19.384 Y 15.830 Z 37.399 A -41.964 C -140.467 +G0 X 18.304 Y 18.176 Z 36.873 A -43.236 C -146.583 +G0 X 14.178 Y 11.923 Z 28.905 A -43.236 C -146.583 +G1 X 13.424 Y 10.780 Z 27.448 A -43.236 C -146.583 F 318 +G1 X 15.735 Y 9.177 Z 25.201 A -43.236 C -146.583 F 159 +G1 X 16.000 Y 9.005 Z 24.960 A -43.228 C -146.604 F 159 +G1 X 16.794 Y 8.468 Z 24.237 A -43.206 C -146.670 F 159 +G1 X 17.444 Y 7.997 Z 23.640 A -43.188 C -146.726 F 159 +G1 X 18.083 Y 7.508 Z 23.052 A -43.171 C -146.781 F 159 +G1 X 18.713 Y 7.000 Z 22.468 A -43.155 C -146.836 F 159 +G1 X 19.334 Y 6.470 Z 21.889 A -43.139 C -146.892 F 159 +G1 X 19.941 Y 5.923 Z 21.315 A -43.125 C -146.948 F 159 +G1 X 20.568 Y 5.332 Z 20.720 A -43.112 C -147.006 F 159 +G1 X 21.354 Y 4.543 Z 19.965 A -43.095 C -147.081 F 159 +G1 X 22.205 Y 3.628 Z 19.135 A -43.079 C -147.164 F 159 +G1 X 23.028 Y 2.679 Z 18.317 A -43.065 C -147.247 F 159 +G1 X 23.559 Y 2.030 Z 17.781 A -43.057 C -147.302 F 159 +G1 X 24.334 Y 1.028 Z 16.985 A -43.046 C -147.383 F 159 +G1 X 24.836 Y 0.343 Z 16.460 A -43.040 C -147.438 F 159 +G1 X 25.604 Y -0.767 Z 15.642 A -43.031 C -147.523 F 159 +G1 X 26.304 Y -1.850 Z 14.875 A -43.025 C -147.604 F 159 +G1 X 26.977 Y -2.954 Z 14.125 A -43.021 C -147.683 F 159 +G1 X 27.621 Y -4.083 Z 13.385 A -43.018 C -147.761 F 159 +G1 X 28.239 Y -5.233 Z 12.658 A -43.017 C -147.839 F 159 +G1 X 28.832 Y -6.405 Z 11.943 A -43.017 C -147.916 F 159 +G1 X 29.445 Y -7.698 Z 11.181 A -43.019 C -147.998 F 159 +G1 X 29.991 Y -8.920 Z 10.485 A -43.023 C -148.074 F 159 +G1 X 30.511 Y -10.156 Z 9.805 A -43.028 C -148.149 F 159 +G1 X 31.005 Y -11.406 Z 9.139 A -43.034 C -148.222 F 159 +G1 X 31.478 Y -12.669 Z 8.487 A -43.041 C -148.295 F 159 +G1 X 31.931 Y -13.951 Z 7.849 A -43.050 C -148.367 F 159 +G1 X 32.362 Y -15.245 Z 7.224 A -43.060 C -148.438 F 159 +G1 X 32.776 Y -16.558 Z 6.613 A -43.071 C -148.508 F 159 +G1 X 33.801 Y -20.208 Z 4.806 A -43.071 C -148.508 F 159 +G1 X 33.862 Y -20.443 Z 4.686 A -43.071 C -148.508 F 636 +G1 X 33.912 Y -20.672 Z 4.560 A -43.071 C -148.509 F 636 +G1 X 33.950 Y -20.895 Z 4.429 A -43.071 C -148.509 F 636 +G1 X 33.977 Y -21.113 Z 4.293 A -43.071 C -148.509 F 636 +G1 X 33.992 Y -21.325 Z 4.151 A -43.071 C -148.510 F 636 +G1 X 33.997 Y -21.531 Z 4.004 A -43.071 C -148.510 F 636 +G1 X 33.990 Y -21.732 Z 3.851 A -43.071 C -148.510 F 636 +G1 X 33.972 Y -21.927 Z 3.694 A -43.071 C -148.510 F 636 +G1 X 33.942 Y -22.116 Z 3.531 A -43.071 C -148.511 F 636 +G1 X 33.902 Y -22.300 Z 3.363 A -43.071 C -148.511 F 636 +G1 X 33.850 Y -22.477 Z 3.189 A -43.071 C -148.511 F 636 +G1 X 33.788 Y -22.650 Z 3.011 A -43.071 C -148.511 F 636 +G1 X 33.714 Y -22.816 Z 2.827 A -43.071 C -148.512 F 636 +G1 X 33.629 Y -22.977 Z 2.638 A -43.072 C -148.512 F 636 +G1 X 33.534 Y -23.132 Z 2.444 A -43.072 C -148.512 F 636 +G1 X 33.427 Y -23.281 Z 2.245 A -43.072 C -148.513 F 636 +G1 X 33.317 Y -23.416 Z 2.053 A -43.072 C -148.513 F 636 +G1 X 33.209 Y -23.527 Z 1.881 A -43.072 C -148.513 F 636 +G1 X 33.104 Y -23.613 Z 1.729 A -43.072 C -148.514 F 636 +G1 X 33.002 Y -23.676 Z 1.597 A -43.072 C -148.514 F 636 +G1 X 32.902 Y -23.714 Z 1.485 A -43.072 C -148.514 F 636 +G1 X 32.806 Y -23.729 Z 1.393 A -43.072 C -148.514 F 636 +G1 X 32.712 Y -23.719 Z 1.321 A -43.072 C -148.514 F 636 +G1 X 32.667 Y -23.705 Z 1.293 A -43.072 C -148.515 F 636 +G1 X 32.622 Y -23.686 Z 1.269 A -43.072 C -148.515 F 636 +G1 X 32.578 Y -23.660 Z 1.251 A -43.072 C -148.515 F 636 +G1 X 32.534 Y -23.628 Z 1.237 A -43.072 C -148.515 F 636 +G1 X 32.450 Y -23.546 Z 1.225 A -43.072 C -148.515 F 636 +G1 X 32.369 Y -23.441 Z 1.234 A -43.072 C -148.515 F 636 +G1 X 32.290 Y -23.311 Z 1.262 A -43.072 C -148.515 F 636 +G1 X 32.215 Y -23.158 Z 1.311 A -43.072 C -148.516 F 636 +G1 X 32.143 Y -22.980 Z 1.379 A -43.072 C -148.516 F 636 +G1 X 32.075 Y -22.779 Z 1.468 A -43.072 C -148.516 F 636 +G1 X 32.009 Y -22.553 Z 1.577 A -43.072 C -148.517 F 636 +G1 X 31.169 Y -19.424 Z 3.146 A -43.072 C -148.517 F 159 +G1 X 30.770 Y -18.107 Z 3.768 A -43.061 C -148.447 F 159 +G1 X 30.358 Y -16.810 Z 4.405 A -43.051 C -148.378 F 159 +G1 X 29.929 Y -15.528 Z 5.056 A -43.042 C -148.307 F 159 +G1 X 29.479 Y -14.257 Z 5.723 A -43.035 C -148.236 F 159 +G1 X 29.013 Y -13.004 Z 6.404 A -43.029 C -148.164 F 159 +G1 X 28.525 Y -11.761 Z 7.102 A -43.024 C -148.092 F 159 +G1 X 28.041 Y -10.595 Z 7.778 A -43.020 C -148.022 F 159 +G1 X 27.521 Y -9.408 Z 8.489 A -43.018 C -147.949 F 159 +G1 X 26.973 Y -8.223 Z 9.222 A -43.017 C -147.875 F 159 +G1 X 26.404 Y -7.062 Z 9.964 A -43.018 C -147.800 F 159 +G1 X 25.809 Y -5.916 Z 10.723 A -43.019 C -147.724 F 159 +G1 X 25.273 Y -4.939 Z 11.390 A -43.022 C -147.657 F 159 +G1 X 24.720 Y -3.980 Z 12.067 A -43.026 C -147.590 F 159 +G1 X 24.078 Y -2.931 Z 12.831 A -43.032 C -147.515 F 159 +G1 X 23.413 Y -1.909 Z 13.605 A -43.040 C -147.439 F 159 +G1 X 22.699 Y -0.877 Z 14.417 A -43.049 C -147.360 F 159 +G1 X 21.954 Y 0.131 Z 15.245 A -43.060 C -147.279 F 159 +G1 X 21.185 Y 1.101 Z 16.077 A -43.073 C -147.199 F 159 +G1 X 20.657 Y 1.732 Z 16.641 A -43.083 C -147.145 F 159 +G1 X 19.838 Y 2.652 Z 17.497 A -43.099 C -147.064 F 159 +G1 X 19.095 Y 3.431 Z 18.259 A -43.115 C -146.992 F 159 +G1 X 18.332 Y 4.178 Z 19.028 A -43.132 C -146.920 F 159 +G1 X 17.740 Y 4.725 Z 19.616 A -43.146 C -146.866 F 159 +G1 X 17.137 Y 5.253 Z 20.210 A -43.162 C -146.811 F 159 +G1 X 16.522 Y 5.763 Z 20.809 A -43.178 C -146.757 F 159 +G1 X 15.893 Y 6.251 Z 21.410 A -43.195 C -146.702 F 159 +G1 X 15.258 Y 6.722 Z 22.020 A -43.213 C -146.648 F 159 +G1 X 14.615 Y 7.167 Z 22.627 A -43.232 C -146.595 F 159 +G1 X 13.647 Y 7.786 Z 23.533 A -43.262 C -146.516 F 159 +G1 X 10.973 Y 9.620 Z 26.203 A -43.262 C -146.516 F 159 +G1 X 11.729 Y 10.763 Z 27.659 A -43.262 C -146.516 F 318 +G0 X 16.810 Y 18.445 Z 37.446 A -43.262 C -146.516 +G0 X 14.475 Y 19.604 Z 37.831 A -41.984 C -152.626 +G0 X 12.089 Y 20.696 Z 38.086 A -41.045 C -159.004 +G0 X 9.662 Y 21.717 Z 38.210 A -40.470 C -165.579 +G0 X 7.202 Y 22.663 Z 38.203 A -40.274 C -172.258 +G0 X 4.718 Y 23.532 Z 38.065 A -40.463 C -178.937 +G0 X 2.217 Y 24.320 Z 37.797 A -41.032 C -185.515 +G0 X -0.291 Y 25.025 Z 37.399 A -41.964 C -191.897 +G0 X -2.799 Y 25.643 Z 36.873 A -43.236 C -198.013 +G0 X -0.482 Y 18.519 Z 28.905 A -43.236 C -198.013 +G1 X -0.059 Y 17.216 Z 27.448 A -43.236 C -198.013 F 318 +G1 X 2.636 Y 18.024 Z 25.201 A -43.236 C -198.013 F 159 +G1 X 2.935 Y 18.124 Z 24.960 A -43.228 C -198.034 F 159 +G1 X 3.850 Y 18.410 Z 24.237 A -43.206 C -198.100 F 159 +G1 X 4.624 Y 18.625 Z 23.640 A -43.188 C -198.156 F 159 +G1 X 5.404 Y 18.820 Z 23.052 A -43.171 C -198.211 F 159 +G1 X 6.194 Y 18.995 Z 22.468 A -43.155 C -198.266 F 159 +G1 X 6.996 Y 19.151 Z 21.889 A -43.140 C -198.322 F 159 +G1 X 7.802 Y 19.284 Z 21.315 A -43.125 C -198.377 F 159 +G1 X 8.655 Y 19.405 Z 20.720 A -43.112 C -198.436 F 159 +G1 X 9.762 Y 19.528 Z 19.965 A -43.095 C -198.511 F 159 +G1 X 11.007 Y 19.623 Z 19.135 A -43.079 C -198.594 F 159 +G1 X 12.262 Y 19.674 Z 18.317 A -43.065 C -198.677 F 159 +G1 X 13.101 Y 19.685 Z 17.781 A -43.057 C -198.732 F 159 +G1 X 14.368 Y 19.667 Z 16.985 A -43.046 C -198.813 F 159 +G1 X 15.216 Y 19.631 Z 16.460 A -43.040 C -198.868 F 159 +G1 X 16.563 Y 19.540 Z 15.642 A -43.031 C -198.953 F 159 +G1 X 17.846 Y 19.413 Z 14.875 A -43.025 C -199.034 F 159 +G1 X 19.129 Y 19.250 Z 14.125 A -43.021 C -199.113 F 159 +G1 X 20.413 Y 19.050 Z 13.385 A -43.018 C -199.191 F 159 +G1 X 21.698 Y 18.816 Z 12.658 A -43.017 C -199.269 F 159 +G1 X 22.984 Y 18.549 Z 11.943 A -43.017 C -199.346 F 159 +G1 X 24.377 Y 18.223 Z 11.181 A -43.019 C -199.428 F 159 +G1 X 25.673 Y 17.887 Z 10.485 A -43.023 C -199.504 F 159 +G1 X 26.963 Y 17.523 Z 9.805 A -43.028 C -199.579 F 159 +G1 X 28.248 Y 17.130 Z 9.139 A -43.034 C -199.652 F 159 +G1 X 29.531 Y 16.712 Z 8.487 A -43.041 C -199.725 F 159 +G1 X 30.816 Y 16.267 Z 7.849 A -43.050 C -199.797 F 159 +G1 X 32.096 Y 15.798 Z 7.224 A -43.060 C -199.868 F 159 +G1 X 33.380 Y 15.303 Z 6.613 A -43.071 C -199.938 F 159 +G1 X 36.873 Y 13.828 Z 4.806 A -43.071 C -199.938 F 159 +G1 X 37.095 Y 13.729 Z 4.686 A -43.071 C -199.939 F 636 +G1 X 37.305 Y 13.625 Z 4.560 A -43.071 C -199.939 F 636 +G1 X 37.504 Y 13.516 Z 4.429 A -43.071 C -199.939 F 636 +G1 X 37.690 Y 13.401 Z 4.293 A -43.071 C -199.939 F 636 +G1 X 37.866 Y 13.281 Z 4.151 A -43.071 C -199.940 F 636 +G1 X 38.030 Y 13.156 Z 4.004 A -43.071 C -199.940 F 636 +G1 X 38.183 Y 13.026 Z 3.851 A -43.071 C -199.940 F 636 +G1 X 38.324 Y 12.890 Z 3.694 A -43.071 C -199.940 F 636 +G1 X 38.453 Y 12.749 Z 3.531 A -43.071 C -199.941 F 636 +G1 X 38.572 Y 12.603 Z 3.363 A -43.071 C -199.941 F 636 +G1 X 38.679 Y 12.452 Z 3.189 A -43.071 C -199.941 F 636 +G1 X 38.774 Y 12.295 Z 3.011 A -43.071 C -199.941 F 636 +G1 X 38.858 Y 12.134 Z 2.827 A -43.071 C -199.942 F 636 +G1 X 38.931 Y 11.968 Z 2.638 A -43.072 C -199.942 F 636 +G1 X 38.993 Y 11.796 Z 2.444 A -43.072 C -199.942 F 636 +G1 X 39.043 Y 11.620 Z 2.245 A -43.072 C -199.943 F 636 +G1 X 39.080 Y 11.449 Z 2.053 A -43.072 C -199.943 F 636 +G1 X 39.099 Y 11.296 Z 1.881 A -43.072 C -199.943 F 636 +G1 X 39.101 Y 11.160 Z 1.729 A -43.072 C -199.944 F 636 +G1 X 39.086 Y 11.041 Z 1.597 A -43.072 C -199.944 F 636 +G1 X 39.054 Y 10.940 Z 1.485 A -43.072 C -199.944 F 636 +G1 X 39.006 Y 10.855 Z 1.393 A -43.072 C -199.944 F 636 +G1 X 38.940 Y 10.788 Z 1.321 A -43.072 C -199.945 F 636 +G1 X 38.901 Y 10.761 Z 1.293 A -43.072 C -199.945 F 636 +G1 X 38.857 Y 10.738 Z 1.269 A -43.072 C -199.945 F 636 +G1 X 38.810 Y 10.720 Z 1.251 A -43.072 C -199.945 F 636 +G1 X 38.758 Y 10.706 Z 1.237 A -43.072 C -199.945 F 636 +G1 X 38.641 Y 10.690 Z 1.225 A -43.072 C -199.945 F 636 +G1 X 38.508 Y 10.693 Z 1.234 A -43.072 C -199.945 F 636 +G1 X 38.358 Y 10.712 Z 1.262 A -43.072 C -199.945 F 636 +G1 X 38.191 Y 10.749 Z 1.311 A -43.072 C -199.946 F 636 +G1 X 38.007 Y 10.804 Z 1.379 A -43.072 C -199.946 F 636 +G1 X 37.807 Y 10.876 Z 1.468 A -43.072 C -199.946 F 636 +G1 X 37.590 Y 10.965 Z 1.577 A -43.072 C -199.947 F 636 +G1 X 34.619 Y 12.259 Z 3.146 A -43.072 C -199.947 F 159 +G1 X 33.341 Y 12.768 Z 3.768 A -43.061 C -199.877 F 159 +G1 X 32.070 Y 13.255 Z 4.405 A -43.051 C -199.808 F 159 +G1 X 30.801 Y 13.719 Z 5.056 A -43.042 C -199.737 F 159 +G1 X 29.526 Y 14.160 Z 5.723 A -43.035 C -199.666 F 159 +G1 X 28.256 Y 14.576 Z 6.404 A -43.029 C -199.594 F 159 +G1 X 26.980 Y 14.969 Z 7.102 A -43.024 C -199.522 F 159 +G1 X 25.766 Y 15.318 Z 7.778 A -43.020 C -199.452 F 159 +G1 X 24.514 Y 15.652 Z 8.489 A -43.018 C -199.379 F 159 +G1 X 23.246 Y 15.962 Z 9.222 A -43.017 C -199.305 F 159 +G1 X 21.984 Y 16.241 Z 9.964 A -43.018 C -199.230 F 159 +G1 X 20.716 Y 16.490 Z 10.723 A -43.019 C -199.154 F 159 +G1 X 19.619 Y 16.681 Z 11.390 A -43.022 C -199.087 F 159 +G1 X 18.524 Y 16.846 Z 12.067 A -43.026 C -199.020 F 159 +G1 X 17.303 Y 16.997 Z 12.831 A -43.032 C -198.945 F 159 +G1 X 16.090 Y 17.115 Z 13.605 A -43.040 C -198.869 F 159 +G1 X 14.838 Y 17.200 Z 14.417 A -43.049 C -198.790 F 159 +G1 X 13.585 Y 17.246 Z 15.245 A -43.060 C -198.709 F 159 +G1 X 12.347 Y 17.250 Z 16.077 A -43.073 C -198.629 F 159 +G1 X 11.525 Y 17.230 Z 16.641 A -43.083 C -198.575 F 159 +G1 X 10.295 Y 17.164 Z 17.497 A -43.099 C -198.494 F 159 +G1 X 9.223 Y 17.068 Z 18.259 A -43.115 C -198.422 F 159 +G1 X 8.162 Y 16.938 Z 19.028 A -43.132 C -198.350 F 159 +G1 X 7.366 Y 16.816 Z 19.616 A -43.146 C -198.296 F 159 +G1 X 6.577 Y 16.674 Z 20.210 A -43.162 C -198.241 F 159 +G1 X 5.795 Y 16.511 Z 20.809 A -43.178 C -198.187 F 159 +G1 X 5.022 Y 16.324 Z 21.410 A -43.195 C -198.132 F 159 +G1 X 4.257 Y 16.120 Z 22.020 A -43.213 C -198.078 F 159 +G1 X 3.509 Y 15.895 Z 22.627 A -43.232 C -198.025 F 159 +G1 X 2.421 Y 15.524 Z 23.533 A -43.262 C -197.946 F 159 +G1 X -0.680 Y 14.577 Z 26.203 A -43.262 C -197.946 F 159 +G1 X -1.103 Y 15.881 Z 27.659 A -43.262 C -197.946 F 318 +G0 X -3.940 Y 24.643 Z 37.446 A -43.262 C -197.946 +G0 X -6.303 Y 23.540 Z 37.831 A -41.984 C -204.056 +G0 X -8.644 Y 22.355 Z 38.086 A -41.045 C -210.434 +G0 X -10.955 Y 21.094 Z 38.210 A -40.470 C -217.009 +G0 X -13.229 Y 19.761 Z 38.203 A -40.274 C -223.688 +G0 X -15.457 Y 18.360 Z 38.065 A -40.463 C -230.367 +G0 X -17.632 Y 16.896 Z 37.797 A -41.032 C -236.945 +G0 X -19.747 Y 15.374 Z 37.399 A -41.964 C -243.327 +G0 X -21.794 Y 13.799 Z 36.873 A -43.236 C -249.443 +G0 X -14.780 Y 11.169 Z 28.905 A -43.236 C -249.443 +G1 X -13.497 Y 10.688 Z 27.448 A -43.236 C -249.443 F 318 +G1 X -12.449 Y 13.298 Z 25.201 A -43.236 C -249.443 F 159 +G1 X -12.340 Y 13.594 Z 24.960 A -43.228 C -249.464 F 159 +G1 X -11.993 Y 14.488 Z 24.237 A -43.206 C -249.530 F 159 +G1 X -11.679 Y 15.227 Z 23.640 A -43.188 C -249.586 F 159 +G1 X -11.345 Y 15.959 Z 23.052 A -43.171 C -249.641 F 159 +G1 X -10.989 Y 16.685 Z 22.468 A -43.155 C -249.696 F 159 +G1 X -10.611 Y 17.409 Z 21.889 A -43.140 C -249.752 F 159 +G1 X -10.213 Y 18.123 Z 21.315 A -43.125 C -249.807 F 159 +G1 X -9.776 Y 18.865 Z 20.720 A -43.112 C -249.866 F 159 +G1 X -9.181 Y 19.807 Z 19.965 A -43.095 C -249.941 F 159 +G1 X -8.479 Y 20.840 Z 19.135 A -43.079 C -250.024 F 159 +G1 X -7.737 Y 21.854 Z 18.317 A -43.065 C -250.107 F 159 +G1 X -7.223 Y 22.516 Z 17.781 A -43.057 C -250.162 F 159 +G1 X -6.419 Y 23.495 Z 16.985 A -43.046 C -250.244 F 159 +G1 X -5.862 Y 24.136 Z 16.460 A -43.040 C -250.298 F 159 +G1 X -4.951 Y 25.132 Z 15.642 A -43.031 C -250.383 F 159 +G1 X -4.051 Y 26.056 Z 14.875 A -43.025 C -250.464 F 159 +G1 X -3.124 Y 26.958 Z 14.125 A -43.021 C -250.543 F 159 +G1 X -2.167 Y 27.837 Z 13.385 A -43.018 C -250.621 F 159 +G1 X -1.184 Y 28.696 Z 12.658 A -43.017 C -250.699 F 159 +G1 X -0.173 Y 29.534 Z 11.943 A -43.017 C -250.776 F 159 +G1 X 0.951 Y 30.420 Z 11.181 A -43.019 C -250.858 F 159 +G1 X 2.022 Y 31.224 Z 10.485 A -43.023 C -250.934 F 159 +G1 X 3.111 Y 32.006 Z 9.805 A -43.028 C -251.009 F 159 +G1 X 4.219 Y 32.766 Z 9.139 A -43.034 C -251.082 F 159 +G1 X 5.346 Y 33.508 Z 8.487 A -43.041 C -251.155 F 159 +G1 X 6.494 Y 34.235 Z 7.849 A -43.050 C -251.227 F 159 +G1 X 7.660 Y 34.944 Z 7.224 A -43.060 C -251.298 F 159 +G1 X 8.847 Y 35.639 Z 6.613 A -43.071 C -251.368 F 159 +G1 X 12.178 Y 37.451 Z 4.806 A -43.071 C -251.368 F 159 +G1 X 12.393 Y 37.562 Z 4.686 A -43.071 C -251.369 F 636 +G1 X 12.606 Y 37.662 Z 4.560 A -43.071 C -251.369 F 636 +G1 X 12.815 Y 37.749 Z 4.429 A -43.071 C -251.369 F 636 +G1 X 13.021 Y 37.823 Z 4.293 A -43.071 C -251.369 F 636 +G1 X 13.224 Y 37.886 Z 4.151 A -43.071 C -251.370 F 636 +G1 X 13.425 Y 37.936 Z 4.004 A -43.071 C -251.370 F 636 +G1 X 13.622 Y 37.974 Z 3.851 A -43.071 C -251.370 F 636 +G1 X 13.816 Y 38.000 Z 3.694 A -43.071 C -251.370 F 636 +G1 X 14.007 Y 38.013 Z 3.531 A -43.071 C -251.371 F 636 +G1 X 14.195 Y 38.015 Z 3.363 A -43.071 C -251.371 F 636 +G1 X 14.380 Y 38.004 Z 3.189 A -43.071 C -251.371 F 636 +G1 X 14.561 Y 37.981 Z 3.011 A -43.071 C -251.371 F 636 +G1 X 14.740 Y 37.947 Z 2.827 A -43.071 C -251.372 F 636 +G1 X 14.916 Y 37.900 Z 2.638 A -43.072 C -251.372 F 636 +G1 X 15.088 Y 37.841 Z 2.444 A -43.072 C -251.372 F 636 +G1 X 15.258 Y 37.771 Z 2.245 A -43.072 C -251.372 F 636 +G1 X 15.413 Y 37.693 Z 2.053 A -43.072 C -251.373 F 636 +G1 X 15.545 Y 37.612 Z 1.881 A -43.072 C -251.373 F 636 +G1 X 15.653 Y 37.529 Z 1.729 A -43.072 C -251.374 F 636 +G1 X 15.737 Y 37.443 Z 1.597 A -43.072 C -251.374 F 636 +G1 X 15.796 Y 37.355 Z 1.485 A -43.072 C -251.374 F 636 +G1 X 15.832 Y 37.264 Z 1.393 A -43.072 C -251.374 F 636 +G1 X 15.843 Y 37.171 Z 1.321 A -43.072 C -251.375 F 636 +G1 X 15.840 Y 37.123 Z 1.293 A -43.072 C -251.375 F 636 +G1 X 15.831 Y 37.075 Z 1.269 A -43.072 C -251.375 F 636 +G1 X 15.816 Y 37.027 Z 1.251 A -43.072 C -251.375 F 636 +G1 X 15.794 Y 36.977 Z 1.237 A -43.072 C -251.375 F 636 +G1 X 15.733 Y 36.877 Z 1.225 A -43.072 C -251.375 F 636 +G1 X 15.649 Y 36.774 Z 1.234 A -43.072 C -251.375 F 636 +G1 X 15.540 Y 36.669 Z 1.262 A -43.072 C -251.375 F 636 +G1 X 15.407 Y 36.561 Z 1.311 A -43.072 C -251.376 F 636 +G1 X 15.250 Y 36.452 Z 1.379 A -43.072 C -251.376 F 636 +G1 X 15.068 Y 36.340 Z 1.468 A -43.072 C -251.376 F 636 +G1 X 14.863 Y 36.226 Z 1.577 A -43.072 C -251.377 F 636 +G1 X 11.999 Y 34.710 Z 3.146 A -43.072 C -251.377 F 159 +G1 X 10.804 Y 34.028 Z 3.768 A -43.061 C -251.307 F 159 +G1 X 9.631 Y 33.338 Z 4.405 A -43.051 C -251.238 F 159 +G1 X 8.477 Y 32.635 Z 5.056 A -43.042 C -251.167 F 159 +G1 X 7.338 Y 31.913 Z 5.723 A -43.035 C -251.096 F 159 +G1 X 6.220 Y 31.179 Z 6.404 A -43.029 C -251.024 F 159 +G1 X 5.118 Y 30.427 Z 7.102 A -43.024 C -250.952 F 159 +G1 X 4.088 Y 29.695 Z 7.778 A -43.020 C -250.882 F 159 +G1 X 3.046 Y 28.925 Z 8.489 A -43.018 C -250.809 F 159 +G1 X 2.014 Y 28.127 Z 9.222 A -43.017 C -250.735 F 159 +G1 X 1.008 Y 27.314 Z 9.964 A -43.018 C -250.660 F 159 +G1 X 0.023 Y 26.478 Z 10.723 A -43.019 C -250.584 F 159 +G1 X -0.810 Y 25.739 Z 11.390 A -43.022 C -250.517 F 159 +G1 X -1.622 Y 24.986 Z 12.067 A -43.026 C -250.450 F 159 +G1 X -2.501 Y 24.126 Z 12.831 A -43.032 C -250.375 F 159 +G1 X -3.350 Y 23.251 Z 13.605 A -43.040 C -250.299 F 159 +G1 X -4.197 Y 22.325 Z 14.417 A -43.049 C -250.219 F 159 +G1 X -5.014 Y 21.374 Z 15.245 A -43.060 C -250.139 F 159 +G1 X -5.788 Y 20.408 Z 16.077 A -43.073 C -250.059 F 159 +G1 X -6.286 Y 19.753 Z 16.641 A -43.083 C -250.005 F 159 +G1 X -7.001 Y 18.751 Z 17.497 A -43.099 C -249.924 F 159 +G1 X -7.595 Y 17.852 Z 18.259 A -43.115 C -249.852 F 159 +G1 X -8.154 Y 16.942 Z 19.028 A -43.132 C -249.780 F 159 +G1 X -8.555 Y 16.243 Z 19.616 A -43.146 C -249.726 F 159 +G1 X -8.935 Y 15.538 Z 20.210 A -43.162 C -249.671 F 159 +G1 X -9.296 Y 14.825 Z 20.809 A -43.178 C -249.617 F 159 +G1 X -9.632 Y 14.103 Z 21.410 A -43.195 C -249.562 F 159 +G1 X -9.949 Y 13.379 Z 22.020 A -43.213 C -249.508 F 159 +G1 X -10.240 Y 12.653 Z 22.627 A -43.232 C -249.455 F 159 +G1 X -10.628 Y 11.572 Z 23.533 A -43.262 C -249.376 F 159 +G1 X -11.821 Y 8.556 Z 26.203 A -43.262 C -249.376 F 159 +G1 X -13.104 Y 9.039 Z 27.659 A -43.262 C -249.376 F 318 +G0 X -21.724 Y 12.283 Z 37.446 A -43.262 C -249.376 +G0 X -22.334 Y 9.748 Z 37.831 A -41.984 C -255.486 +G0 X -22.868 Y 7.180 Z 38.086 A -41.045 C -261.864 +G0 X -23.323 Y 4.587 Z 38.210 A -40.470 C -268.439 +G0 X -23.698 Y 1.978 Z 38.203 A -40.274 C -275.118 +G0 X -23.992 Y -0.638 Z 38.065 A -40.463 C -281.797 +G0 X -24.203 Y -3.252 Z 37.797 A -41.032 C -288.375 +G0 X -24.332 Y -5.854 Z 37.399 A -41.964 C -294.757 +G0 X -24.377 Y -8.436 Z 36.873 A -43.236 C -300.873 +G0 X -17.947 Y -4.592 Z 28.905 A -43.236 C -300.873 +G1 X -16.771 Y -3.889 Z 27.448 A -43.236 C -300.873 F 318 +G1 X -18.158 Y -1.442 Z 25.201 A -43.236 C -300.873 F 159 +G1 X -18.323 Y -1.172 Z 24.960 A -43.228 C -300.894 F 159 + +G1 X -18.805 Y -0.344 Z 24.237 A -43.206 C -300.960 F 159 +G1 X -19.187 Y 0.363 Z 23.640 A -43.188 C -301.016 F 159 +G1 X -19.550 Y 1.080 Z 23.052 A -43.171 C -301.071 F 159 +G1 X -19.897 Y 1.811 Z 22.468 A -43.155 C -301.126 F 159 +G1 X -20.227 Y 2.558 Z 21.889 A -43.140 C -301.182 F 159 +G1 X -20.537 Y 3.314 Z 21.315 A -43.125 C -301.237 F 159 +G1 X -20.845 Y 4.119 Z 20.720 A -43.112 C -301.296 F 159 +G1 X -21.211 Y 5.171 Z 19.965 A -43.095 C -301.371 F 159 +G1 X -21.581 Y 6.364 Z 19.135 A -43.079 C -301.454 F 159 +G1 X -21.910 Y 7.576 Z 18.317 A -43.065 C -301.537 F 159 +G1 X -22.107 Y 8.391 Z 17.781 A -43.057 C -301.592 F 159 +G1 X -22.372 Y 9.630 Z 16.985 A -43.046 C -301.674 F 159 +G1 X -22.526 Y 10.465 Z 16.460 A -43.040 C -301.728 F 159 +G1 X -22.736 Y 11.798 Z 15.642 A -43.031 C -301.813 F 159 +G1 X -22.898 Y 13.078 Z 14.875 A -43.025 C -301.893 F 159 +G1 X -23.025 Y 14.365 Z 14.125 A -43.021 C -301.973 F 159 +G1 X -23.115 Y 15.661 Z 13.385 A -43.018 C -302.051 F 159 +G1 X -23.174 Y 16.966 Z 12.658 A -43.017 C -302.129 F 159 +G1 X -23.199 Y 18.279 Z 11.943 A -43.017 C -302.206 F 159 +G1 X -23.191 Y 19.709 Z 11.181 A -43.019 C -302.288 F 159 +G1 X -23.152 Y 21.048 Z 10.485 A -43.023 C -302.364 F 159 +G1 X -23.084 Y 22.387 Z 9.805 A -43.028 C -302.439 F 159 +G1 X -22.988 Y 23.727 Z 9.139 A -43.034 C -302.512 F 159 +G1 X -22.866 Y 25.071 Z 8.487 A -43.041 C -302.585 F 159 +G1 X -22.718 Y 26.422 Z 7.849 A -43.050 C -302.657 F 159 +G1 X -22.545 Y 27.775 Z 7.224 A -43.060 C -302.728 F 159 +G1 X -22.348 Y 29.137 Z 6.613 A -43.071 C -302.798 F 159 +G1 X -21.688 Y 32.871 Z 4.806 A -43.071 C -302.798 F 159 +G1 X -21.641 Y 33.109 Z 4.686 A -43.071 C -302.799 F 636 +G1 X -21.587 Y 33.337 Z 4.560 A -43.071 C -302.799 F 636 +G1 X -21.524 Y 33.555 Z 4.429 A -43.071 C -302.799 F 636 +G1 X -21.454 Y 33.762 Z 4.293 A -43.071 C -302.799 F 636 +G1 X -21.376 Y 33.960 Z 4.151 A -43.071 C -302.800 F 636 +G1 X -21.290 Y 34.148 Z 4.004 A -43.071 C -302.800 F 636 +G1 X -21.197 Y 34.326 Z 3.851 A -43.071 C -302.800 F 636 +G1 X -21.096 Y 34.493 Z 3.694 A -43.071 C -302.800 F 636 +G1 X -20.988 Y 34.651 Z 3.531 A -43.071 C -302.801 F 636 +G1 X -20.872 Y 34.799 Z 3.363 A -43.071 C -302.801 F 636 +G1 X -20.748 Y 34.937 Z 3.189 A -43.071 C -302.801 F 636 +G1 X -20.617 Y 35.065 Z 3.011 A -43.071 C -302.801 F 636 +G1 X -20.478 Y 35.183 Z 2.827 A -43.072 C -302.802 F 636 +G1 X -20.332 Y 35.291 Z 2.638 A -43.072 C -302.802 F 636 +G1 X -20.179 Y 35.390 Z 2.444 A -43.072 C -302.802 F 636 +G1 X -20.018 Y 35.478 Z 2.245 A -43.072 C -302.803 F 636 +G1 X -19.860 Y 35.551 Z 2.053 A -43.072 C -302.803 F 636 +G1 X -19.715 Y 35.604 Z 1.881 A -43.072 C -302.803 F 636 +G1 X -19.583 Y 35.636 Z 1.729 A -43.072 C -302.804 F 636 +G1 X -19.464 Y 35.648 Z 1.597 A -43.072 C -302.804 F 636 +G1 X -19.357 Y 35.640 Z 1.485 A -43.072 C -302.804 F 636 +G1 X -19.264 Y 35.611 Z 1.393 A -43.072 C -302.804 F 636 +G1 X -19.184 Y 35.562 Z 1.321 A -43.072 C -302.805 F 636 +G1 X -19.149 Y 35.530 Z 1.293 A -43.072 C -302.805 F 636 +G1 X -19.117 Y 35.493 Z 1.269 A -43.072 C -302.805 F 636 +G1 X -19.089 Y 35.450 Z 1.251 A -43.072 C -302.805 F 636 +G1 X -19.063 Y 35.403 Z 1.237 A -43.072 C -302.805 F 636 +G1 X -19.023 Y 35.293 Z 1.225 A -43.072 C -302.805 F 636 +G1 X -18.995 Y 35.162 Z 1.234 A -43.072 C -302.805 F 636 +G1 X -18.981 Y 35.012 Z 1.262 A -43.072 C -302.805 F 636 +G1 X -18.980 Y 34.841 Z 1.311 A -43.072 C -302.806 F 636 +G1 X -18.992 Y 34.649 Z 1.379 A -43.072 C -302.806 F 636 +G1 X -19.018 Y 34.438 Z 1.468 A -43.072 C -302.806 F 636 +G1 X -19.056 Y 34.206 Z 1.577 A -43.072 C -302.807 F 636 +G1 X -19.657 Y 31.022 Z 3.146 A -43.072 C -302.807 F 159 +G1 X -19.869 Y 29.663 Z 3.768 A -43.061 C -302.737 F 159 +G1 X -20.060 Y 28.315 Z 4.405 A -43.051 C -302.668 F 159 +G1 X -20.230 Y 26.975 Z 5.056 A -43.042 C -302.597 F 159 +G1 X -20.376 Y 25.634 Z 5.723 A -43.035 C -302.526 F 159 +G1 X -20.499 Y 24.303 Z 6.404 A -43.029 C -302.454 F 159 +G1 X -20.599 Y 22.972 Z 7.102 A -43.024 C -302.382 F 159 +G1 X -20.668 Y 21.711 Z 7.778 A -43.020 C -302.312 F 159 +G1 X -20.715 Y 20.416 Z 8.489 A -43.018 C -302.239 F 159 +G1 X -20.735 Y 19.110 Z 9.222 A -43.017 C -302.165 F 159 +G1 X -20.727 Y 17.817 Z 9.964 A -43.018 C -302.090 F 159 +G1 X -20.687 Y 16.526 Z 10.723 A -43.019 C -302.014 F 159 +G1 X -20.629 Y 15.414 Z 11.390 A -43.022 C -301.947 F 159 +G1 X -20.546 Y 14.310 Z 12.067 A -43.026 C -301.880 F 159 +G1 X -20.422 Y 13.086 Z 12.831 A -43.032 C -301.805 F 159 +G1 X -20.267 Y 11.877 Z 13.605 A -43.040 C -301.729 F 159 +G1 X -20.071 Y 10.638 Z 14.417 A -43.049 C -301.650 F 159 +G1 X -19.837 Y 9.406 Z 15.245 A -43.060 C -301.569 F 159 +G1 X -19.565 Y 8.198 Z 16.077 A -43.073 C -301.489 F 159 +G1 X -19.363 Y 7.401 Z 16.641 A -43.083 C -301.435 F 159 +G1 X -19.025 Y 6.217 Z 17.497 A -43.099 C -301.354 F 159 +G1 X -18.693 Y 5.192 Z 18.259 A -43.115 C -301.282 F 159 +G1 X -18.330 Y 4.188 Z 19.028 A -43.132 C -301.210 F 159 +G1 X -18.033 Y 3.439 Z 19.616 A -43.146 C -301.156 F 159 +G1 X -17.719 Y 2.701 Z 20.210 A -43.162 C -301.101 F 159 +G1 X -17.386 Y 1.975 Z 20.809 A -43.178 C -301.047 F 159 +G1 X -17.032 Y 1.262 Z 21.410 A -43.195 C -300.992 F 159 +G1 X -16.663 Y 0.563 Z 22.020 A -43.213 C -300.938 F 159 +G1 X -16.277 Y -0.117 Z 22.627 A -43.232 C -300.885 F 159 +G1 X -15.673 Y -1.095 Z 23.533 A -43.262 C -300.806 F 159 +G1 X -14.060 Y -3.907 Z 26.203 A -43.262 C -300.806 F 159 +G1 X -15.237 Y -4.609 Z 27.659 A -43.262 C -300.806 F 318 +G0 X -23.148 Y -9.326 Z 37.446 A -43.262 C -300.806 +G0 X -21.546 Y -11.384 Z 37.831 A -41.984 C -306.916 +G0 X -19.871 Y -13.403 Z 38.086 A -41.045 C -313.294 +G0 X -18.127 Y -15.375 Z 38.210 A -40.470 C -319.869 +G0 X -16.321 Y -17.295 Z 38.203 A -40.274 C -326.548 +G0 X -14.459 Y -19.156 Z 38.065 A -40.463 C -333.227 +G0 X -12.548 Y -20.951 Z 37.797 A -41.032 C -339.805 +G0 X -10.593 Y -22.674 Z 37.399 A -41.964 C -346.187 +G0 X -8.603 Y -24.319 Z 36.873 A -43.236 C -352.303 +G0 X -7.599 Y -16.895 Z 28.905 A -43.236 C -352.303 +G1 X -7.416 Y -15.537 Z 27.448 A -43.236 C -352.303 F 318 +G1 X -10.194 Y -15.096 Z 25.201 A -43.236 C -352.303 F 159 +G1 X -10.507 Y -15.056 Z 24.960 A -43.228 C -352.324 F 159 +G1 X -11.455 Y -14.917 Z 24.237 A -43.206 C -352.390 F 159 +G1 X -12.246 Y -14.775 Z 23.640 A -43.188 C -352.446 F 159 +G1 X -13.033 Y -14.612 Z 23.052 A -43.171 C -352.501 F 159 +G1 X -13.821 Y -14.427 Z 22.468 A -43.155 C -352.556 F 159 +G1 X -14.611 Y -14.220 Z 21.889 A -43.140 C -352.612 F 159 +G1 X -15.395 Y -13.990 Z 21.315 A -43.125 C -352.667 F 159 +G1 X -16.216 Y -13.729 Z 20.720 A -43.112 C -352.726 F 159 +G1 X -17.267 Y -13.360 Z 19.965 A -43.095 C -352.801 F 159 +G1 X -18.430 Y -12.905 Z 19.135 A -43.079 C -352.884 F 159 +G1 X -19.584 Y -12.407 Z 18.317 A -43.065 C -352.967 F 159 +G1 X -20.344 Y -12.053 Z 17.781 A -43.057 C -353.022 F 159 +G1 X -21.477 Y -11.487 Z 16.985 A -43.046 C -353.104 F 159 +G1 X -22.226 Y -11.087 Z 16.460 A -43.040 C -353.158 F 159 +G1 X -23.400 Y -10.420 Z 15.642 A -43.031 C -353.243 F 159 +G1 X -24.501 Y -9.749 Z 14.875 A -43.025 C -353.324 F 159 +G1 X -25.586 Y -9.046 Z 14.125 A -43.021 C -353.403 F 159 +G1 X -26.656 Y -8.308 Z 13.385 A -43.018 C -353.481 F 159 +G1 X -27.712 Y -7.541 Z 12.658 A -43.017 C -353.559 F 159 +G1 X -28.755 Y -6.742 Z 11.943 A -43.017 C -353.636 F 159 +G1 X -29.869 Y -5.844 Z 11.181 A -43.019 C -353.718 F 159 +G1 X -30.891 Y -4.979 Z 10.485 A -43.023 C -353.794 F 159 +G1 X -31.895 Y -4.091 Z 9.805 A -43.028 C -353.869 F 159 +G1 X -32.883 Y -3.180 Z 9.139 A -43.034 C -353.942 F 159 +G1 X -33.858 Y -2.247 Z 8.487 A -43.041 C -354.015 F 159 +G1 X -34.822 Y -1.289 Z 7.849 A -43.050 C -354.087 F 159 +G1 X -35.772 Y -0.310 Z 7.224 A -43.060 C -354.158 F 159 +G1 X -36.714 Y 0.693 Z 6.613 A -43.071 C -354.228 F 159 +G1 X -39.222 Y 3.537 Z 4.806 A -43.071 C -354.228 F 159 +G1 X -39.379 Y 3.722 Z 4.686 A -43.071 C -354.229 F 636 +G1 X -39.523 Y 3.907 Z 4.560 A -43.071 C -354.229 F 636 +G1 X -39.654 Y 4.092 Z 4.429 A -43.071 C -354.229 F 636 +G1 X -39.773 Y 4.276 Z 4.293 A -43.071 C -354.229 F 636 +G1 X -39.879 Y 4.460 Z 4.151 A -43.071 C -354.230 F 636 +G1 X -39.972 Y 4.644 Z 4.004 A -43.071 C -354.230 F 636 +G1 X -40.053 Y 4.828 Z 3.851 A -43.071 C -354.230 F 636 +G1 X -40.121 Y 5.012 Z 3.694 A -43.071 C -354.230 F 636 +G1 X -40.177 Y 5.195 Z 3.531 A -43.071 C -354.231 F 636 +G1 X -40.220 Y 5.378 Z 3.363 A -43.071 C -354.231 F 636 +G1 X -40.251 Y 5.560 Z 3.189 A -43.071 C -354.231 F 636 +G1 X -40.270 Y 5.743 Z 3.011 A -43.071 C -354.231 F 636 +G1 X -40.275 Y 5.925 Z 2.827 A -43.071 C -354.232 F 636 +G1 X -40.269 Y 6.106 Z 2.638 A -43.072 C -354.232 F 636 +G1 X -40.250 Y 6.287 Z 2.444 A -43.072 C -354.232 F 636 +G1 X -40.219 Y 6.468 Z 2.245 A -43.072 C -354.233 F 636 +G1 X -40.178 Y 6.638 Z 2.053 A -43.072 C -354.233 F 636 +G1 X -40.129 Y 6.784 Z 1.881 A -43.072 C -354.233 F 636 +G1 X -40.072 Y 6.907 Z 1.729 A -43.072 C -354.234 F 636 +G1 X -40.007 Y 7.008 Z 1.597 A -43.072 C -354.234 F 636 +G1 X -39.934 Y 7.086 Z 1.485 A -43.072 C -354.234 F 636 +G1 X -39.853 Y 7.141 Z 1.393 A -43.072 C -354.234 F 636 +G1 X -39.765 Y 7.173 Z 1.321 A -43.072 C -354.235 F 636 +G1 X -39.718 Y 7.180 Z 1.293 A -43.072 C -354.235 F 636 +G1 X -39.669 Y 7.182 Z 1.269 A -43.072 C -354.235 F 636 +G1 X -39.618 Y 7.178 Z 1.251 A -43.072 C -354.235 F 636 +G1 X -39.565 Y 7.168 Z 1.237 A -43.072 C -354.235 F 636 +G1 X -39.454 Y 7.131 Z 1.225 A -43.072 C -354.235 F 636 +G1 X -39.334 Y 7.071 Z 1.234 A -43.072 C -354.235 F 636 +G1 X -39.208 Y 6.989 Z 1.262 A -43.072 C -354.235 F 636 +G1 X -39.073 Y 6.883 Z 1.311 A -43.072 C -354.236 F 636 +G1 X -38.932 Y 6.754 Z 1.379 A -43.072 C -354.236 F 636 +G1 X -38.782 Y 6.602 Z 1.468 A -43.072 C -354.236 F 636 +G1 X -38.625 Y 6.427 Z 1.577 A -43.072 C -354.237 F 636 +G1 X -36.510 Y 3.973 Z 3.146 A -43.072 C -354.237 F 159 +G1 X -35.579 Y 2.959 Z 3.768 A -43.061 C -354.167 F 159 +G1 X -34.645 Y 1.970 Z 4.405 A -43.051 C -354.098 F 159 +G1 X -33.703 Y 1.001 Z 5.056 A -43.042 C -354.027 F 159 +G1 X -32.746 Y 0.051 Z 5.723 A -43.035 C -353.956 F 159 +G1 X -31.782 Y -0.875 Z 6.404 A -43.029 C -353.884 F 159 +G1 X -30.803 Y -1.783 Z 7.102 A -43.024 C -353.812 F 159 +G1 X -29.860 Y -2.623 Z 7.778 A -43.020 C -353.742 F 159 +G1 X -28.877 Y -3.468 Z 8.489 A -43.018 C -353.669 F 159 +G1 X -27.869 Y -4.297 Z 9.222 A -43.017 C -353.595 F 159 +G1 X -26.853 Y -5.096 Z 9.964 A -43.018 C -353.520 F 159 +G1 X -25.819 Y -5.871 Z 10.723 A -43.019 C -353.444 F 159 +G1 X -24.913 Y -6.518 Z 11.390 A -43.022 C -353.377 F 159 +G1 X -23.998 Y -7.142 Z 12.067 A -43.026 C -353.310 F 159 +G1 X -22.964 Y -7.808 Z 12.831 A -43.032 C -353.235 F 159 +G1 X -21.922 Y -8.441 Z 13.605 A -43.040 C -353.159 F 159 +G1 X -20.831 Y -9.060 Z 14.417 A -43.049 C -353.080 F 159 +G1 X -19.722 Y -9.645 Z 15.245 A -43.060 C -352.999 F 159 +G1 X -18.608 Y -10.186 Z 16.077 A -43.073 C -352.919 F 159 +G1 X -17.859 Y -10.525 Z 16.641 A -43.083 C -352.865 F 159 +G1 X -16.722 Y -10.998 Z 17.497 A -43.099 C -352.784 F 159 +G1 X -15.714 Y -11.377 Z 18.259 A -43.115 C -352.712 F 159 +G1 X -14.702 Y -11.720 Z 19.028 A -43.132 C -352.640 F 159 +G1 X -13.932 Y -11.955 Z 19.616 A -43.146 C -352.586 F 159 +G1 X -13.160 Y -12.169 Z 20.210 A -43.162 C -352.531 F 159 +G1 X -12.384 Y -12.362 Z 20.809 A -43.178 C -352.477 F 159 +G1 X -11.606 Y -12.529 Z 21.410 A -43.195 C -352.422 F 159 +G1 X -10.829 Y -12.678 Z 22.020 A -43.213 C -352.368 F 159 +G1 X -10.057 Y -12.799 Z 22.627 A -43.232 C -352.315 F 159 +G1 X -8.916 Y -12.937 Z 23.533 A -43.262 C -352.236 F 159 +G1 X -5.711 Y -13.429 Z 26.203 A -43.262 C -352.236 F 159 +G1 X -5.896 Y -14.787 Z 27.659 A -43.262 C -352.236 F 318 +G0 X -7.140 Y -23.913 Z 37.446 A -43.262 C -352.236 +( --- Operation 3 ) +G0 X -0.023 Y -41.436 Z 17.550 A -46.785 C -89.392 +G0 X -0.021 Y -37.057 Z 15.695 A -46.785 C -89.392 +G0 X -13.138 Y -36.917 Z 3.370 A -46.785 C -89.392 +G1 X -14.596 Y -36.902 Z 2.001 A -46.785 C -89.392 F 318 +G1 X -11.756 Y -34.467 Z 3.910 A -46.785 C -89.392 F 159 +G1 X -10.723 Y -33.651 Z 4.625 A -46.795 C -89.459 F 159 +G1 X -9.693 Y -32.827 Z 5.368 A -46.805 C -89.527 F 159 +G1 X -8.685 Y -32.010 Z 6.121 A -46.813 C -89.594 F 159 +G1 X -7.694 Y -31.195 Z 6.890 A -46.820 C -89.660 F 159 +G1 X -6.715 Y -30.384 Z 7.676 A -46.825 C -89.726 F 159 +G1 X -5.861 Y -29.664 Z 8.385 A -46.829 C -89.785 F 159 +G1 X -4.698 Y -28.665 Z 9.383 A -46.833 C -89.866 F 159 +G1 X -3.758 Y -27.837 Z 10.221 A -46.835 C -89.933 F 159 +G1 X -2.843 Y -27.014 Z 11.065 A -46.835 C -89.999 F 159 +G1 X -1.946 Y -26.189 Z 11.920 A -46.835 C -90.065 F 159 +G1 X -1.063 Y -25.350 Z 12.791 A -46.833 C -90.132 F 159 +G1 X -0.203 Y -24.509 Z 13.671 A -46.830 C -90.200 F 159 +G1 X 0.637 Y -23.653 Z 14.564 A -46.826 C -90.268 F 159 +G1 X 1.487 Y -22.753 Z 15.505 A -46.820 C -90.340 F 159 +G1 X 2.246 Y -21.915 Z 16.382 A -46.813 C -90.406 F 159 +G1 X 2.761 Y -21.325 Z 16.998 A -46.807 C -90.453 F 159 +G1 X 3.511 Y -20.424 Z 17.936 A -46.798 C -90.524 F 159 +G1 X 3.992 Y -19.821 Z 18.562 A -46.791 C -90.572 F 159 +G1 X 4.684 Y -18.907 Z 19.509 A -46.779 C -90.644 F 159 +G1 X 5.347 Y -17.972 Z 20.474 A -46.765 C -90.718 F 159 +G1 X 5.825 Y -17.257 Z 21.212 A -46.753 C -90.774 F 159 +G1 X 6.278 Y -16.537 Z 21.952 A -46.740 C -90.831 F 159 +G1 X 6.659 Y -15.898 Z 22.610 A -46.728 C -90.881 F 159 +G1 X 7.020 Y -15.252 Z 23.273 A -46.715 C -90.932 F 159 +G1 X 7.365 Y -14.605 Z 23.942 A -46.700 C -90.983 F 159 +G1 X 7.688 Y -13.953 Z 24.614 A -46.686 C -91.034 F 159 +G1 X 7.987 Y -13.297 Z 25.289 A -46.670 C -91.086 F 159 +G1 X 8.264 Y -12.634 Z 25.970 A -46.652 C -91.138 F 159 +G1 X 8.528 Y -11.909 Z 26.706 A -46.633 C -91.195 F 159 +G1 X 8.654 Y -11.520 Z 27.099 A -46.622 C -91.225 F 159 +G1 X 9.562 Y -8.114 Z 30.357 A -46.622 C -91.225 F 159 +G1 X 11.015 Y -8.083 Z 31.731 A -46.622 C -91.225 F 318 +G0 X 19.520 Y -7.901 Z 39.769 A -46.622 C -91.225 +G0 X 20.698 Y -9.246 Z 38.873 A -45.997 C -94.174 +G0 X 21.836 Y -10.572 Z 37.900 A -45.450 C -97.182 +G0 X 22.930 Y -11.877 Z 36.853 A -44.983 C -100.243 +G0 X 23.979 Y -13.159 Z 35.733 A -44.600 C -103.349 +G0 X 24.981 Y -14.415 Z 34.542 A -44.301 C -106.493 +G0 X 25.933 Y -15.643 Z 33.283 A -44.090 C -109.666 +G0 X 26.834 Y -16.839 Z 31.959 A -43.967 C -112.858 +G0 X 27.682 Y -18.003 Z 30.571 A -43.933 C -116.059 +G0 X 28.476 Y -19.131 Z 29.123 A -43.989 C -119.259 +G0 X 29.213 Y -20.221 Z 27.618 A -44.133 C -122.447 +G0 X 29.893 Y -21.271 Z 26.058 A -44.366 C -125.614 +G0 X 30.513 Y -22.279 Z 24.446 A -44.685 C -128.749 +G0 X 31.073 Y -23.243 Z 22.786 A -45.089 C -131.845 +G0 X 31.572 Y -24.161 Z 21.081 A -45.576 C -134.894 +G0 X 32.009 Y -25.032 Z 19.335 A -46.142 C -137.888 +G0 X 32.382 Y -25.853 Z 17.550 A -46.785 C -140.822 +G0 X 28.960 Y -23.120 Z 15.695 A -46.785 C -140.822 +G0 X 20.672 Y -33.289 Z 3.370 A -46.785 C -140.822 +G1 X 19.752 Y -34.419 Z 2.001 A -46.785 C -140.822 F 318 +G1 X 19.619 Y -30.681 Z 3.910 A -46.785 C -140.822 F 159 +G1 X 19.624 Y -29.364 Z 4.625 A -46.795 C -140.889 F 159 +G1 X 19.622 Y -28.045 Z 5.368 A -46.805 C -140.957 F 159 +G1 X 19.612 Y -26.747 Z 6.121 A -46.813 C -141.024 F 159 +G1 X 19.593 Y -25.465 Z 6.890 A -46.820 C -141.090 F 159 +G1 X 19.569 Y -24.193 Z 7.676 A -46.825 C -141.156 F 159 +G1 X 19.539 Y -23.077 Z 8.385 A -46.829 C -141.215 F 159 +G1 X 19.482 Y -21.545 Z 9.383 A -46.833 C -141.296 F 159 +G1 X 19.421 Y -20.293 Z 10.221 A -46.835 C -141.363 F 159 +G1 X 19.349 Y -19.065 Z 11.065 A -46.835 C -141.429 F 159 +G1 X 19.263 Y -17.849 Z 11.920 A -46.835 C -141.495 F 159 +G1 X 19.157 Y -16.636 Z 12.791 A -46.833 C -141.562 F 159 +G1 X 19.036 Y -15.439 Z 13.671 A -46.830 C -141.630 F 159 +G1 X 18.891 Y -14.249 Z 14.564 A -46.826 C -141.698 F 159 +G1 X 18.717 Y -13.023 Z 15.505 A -46.820 C -141.770 F 159 +G1 X 18.534 Y -11.907 Z 16.382 A -46.813 C -141.836 F 159 +G1 X 18.394 Y -11.137 Z 16.998 A -46.807 C -141.883 F 159 +G1 X 18.158 Y -9.988 Z 17.936 A -46.798 C -141.954 F 159 +G1 X 17.986 Y -9.237 Z 18.562 A -46.791 C -142.002 F 159 +G1 X 17.703 Y -8.126 Z 19.509 A -46.779 C -142.074 F 159 +G1 X 17.385 Y -7.025 Z 20.474 A -46.765 C -142.148 F 159 +G1 X 17.124 Y -6.205 Z 21.212 A -46.753 C -142.204 F 159 +G1 X 16.844 Y -5.402 Z 21.952 A -46.740 C -142.261 F 159 +G1 X 16.582 Y -4.706 Z 22.610 A -46.728 C -142.311 F 159 +G1 X 16.302 Y -4.021 Z 23.273 A -46.715 C -142.362 F 159 +G1 X 16.010 Y -3.347 Z 23.942 A -46.700 C -142.413 F 159 +G1 X 15.702 Y -2.689 Z 24.614 A -46.686 C -142.464 F 159 +G1 X 15.376 Y -2.046 Z 25.289 A -46.670 C -142.516 F 159 +G1 X 15.030 Y -1.416 Z 25.970 A -46.652 C -142.568 F 159 +G1 X 14.628 Y -0.758 Z 26.706 A -46.633 C -142.625 F 159 +G1 X 14.403 Y -0.417 Z 27.099 A -46.622 C -142.655 F 159 +G1 X 12.306 Y 2.417 Z 30.357 A -46.622 C -142.655 F 159 +G1 X 13.188 Y 3.573 Z 31.731 A -46.622 C -142.655 F 318 +G0 X 18.348 Y 10.335 Z 39.769 A -46.622 C -142.655 +G0 X 20.134 Y 10.418 Z 38.873 A -45.997 C -145.604 +G0 X 21.880 Y 10.481 Z 37.900 A -45.450 C -148.612 +G0 X 23.582 Y 10.522 Z 36.853 A -44.983 C -151.673 +G0 X 25.239 Y 10.543 Z 35.733 A -44.600 C -154.779 +G0 X 26.845 Y 10.543 Z 34.542 A -44.301 C -157.923 +G0 X 28.399 Y 10.523 Z 33.283 A -44.090 C -161.096 +G0 X 29.896 Y 10.481 Z 31.959 A -43.967 C -164.288 +G0 X 31.334 Y 10.419 Z 30.571 A -43.933 C -167.489 +G0 X 32.711 Y 10.336 Z 29.123 A -43.989 C -170.689 +G0 X 34.023 Y 10.233 Z 27.618 A -44.133 C -173.877 +G0 X 35.268 Y 10.110 Z 26.058 A -44.366 C -177.044 +G0 X 36.443 Y 9.966 Z 24.446 A -44.685 C -180.180 +G0 X 37.546 Y 9.803 Z 22.786 A -45.089 C -183.275 +G0 X 38.575 Y 9.621 Z 21.081 A -45.576 C -186.324 +G0 X 39.528 Y 9.420 Z 19.335 A -46.142 C -189.318 +G0 X 40.402 Y 9.200 Z 17.550 A -46.785 C -192.252 +G0 X 36.132 Y 8.227 Z 15.695 A -46.785 C -192.252 +G0 X 38.916 Y -4.592 Z 3.370 A -46.785 C -192.252 +G1 X 39.225 Y -6.016 Z 2.001 A -46.785 C -192.252 F 318 +G1 X 36.219 Y -3.789 Z 3.910 A -46.785 C -192.252 F 159 +G1 X 35.194 Y -2.965 Z 4.625 A -46.795 C -192.319 F 159 +G1 X 34.161 Y -2.144 Z 5.368 A -46.805 C -192.387 F 159 +G1 X 33.140 Y -1.343 Z 6.121 A -46.813 C -192.454 F 159 +G1 X 32.125 Y -0.558 Z 6.890 A -46.820 C -192.520 F 159 +G1 X 31.116 Y 0.216 Z 7.676 A -46.825 C -192.586 F 159 +G1 X 30.224 Y 0.889 Z 8.385 A -46.829 C -192.645 F 159 +G1 X 28.992 Y 1.799 Z 9.383 A -46.833 C -192.726 F 159 +G1 X 27.975 Y 2.532 Z 10.221 A -46.835 C -192.793 F 159 +G1 X 26.969 Y 3.241 Z 11.065 A -46.835 C -192.859 F 159 +G1 X 25.965 Y 3.932 Z 11.920 A -46.835 C -192.925 F 159 +G1 X 24.951 Y 4.606 Z 12.791 A -46.833 C -192.992 F 159 +G1 X 23.939 Y 5.257 Z 13.671 A -46.830 C -193.060 F 159 +G1 X 22.918 Y 5.886 Z 14.564 A -46.826 C -193.128 F 159 +G1 X 21.851 Y 6.514 Z 15.505 A -46.820 C -193.200 F 159 +G1 X 20.865 Y 7.067 Z 16.382 A -46.813 C -193.266 F 159 +G1 X 20.176 Y 7.438 Z 16.998 A -46.807 C -193.313 F 159 +G1 X 19.130 Y 7.969 Z 17.936 A -46.798 C -193.384 F 159 +G1 X 18.436 Y 8.303 Z 18.562 A -46.791 C -193.432 F 159 +G1 X 17.390 Y 8.775 Z 19.509 A -46.779 C -193.504 F 159 +G1 X 16.332 Y 9.213 Z 20.474 A -46.765 C -193.578 F 159 +G1 X 15.527 Y 9.520 Z 21.212 A -46.753 C -193.634 F 159 +G1 X 14.725 Y 9.802 Z 21.952 A -46.740 C -193.691 F 159 +G1 X 14.017 Y 10.030 Z 22.610 A -46.728 C -193.741 F 159 +G1 X 13.307 Y 10.239 Z 23.273 A -46.715 C -193.792 F 159 +G1 X 12.599 Y 10.431 Z 23.942 A -46.701 C -193.843 F 159 +G1 X 11.892 Y 10.600 Z 24.614 A -46.686 C -193.894 F 159 +G1 X 11.186 Y 10.747 Z 25.289 A -46.670 C -193.946 F 159 +G1 X 10.478 Y 10.868 Z 25.970 A -46.652 C -193.998 F 159 +G1 X 9.713 Y 10.964 Z 26.706 A -46.633 C -194.055 F 159 +G1 X 9.305 Y 11.001 Z 27.099 A -46.622 C -194.085 F 159 +G1 X 5.783 Y 11.128 Z 30.357 A -46.622 C -194.085 F 159 +G1 X 5.429 Y 12.538 Z 31.731 A -46.622 C -194.085 F 318 +G0 X 3.359 Y 20.789 Z 39.769 A -46.622 C -194.085 +G0 X 4.407 Y 22.237 Z 38.873 A -45.997 C -197.034 +G0 X 5.447 Y 23.641 Z 37.900 A -45.450 C -200.042 +G0 X 6.476 Y 24.998 Z 36.853 A -44.983 C -203.103 +G0 X 7.492 Y 26.306 Z 35.733 A -44.600 C -206.209 +G0 X 8.494 Y 27.562 Z 34.542 A -44.301 C -209.353 +G0 X 9.479 Y 28.764 Z 33.283 A -44.090 C -212.526 +G0 X 10.445 Y 29.909 Z 31.959 A -43.967 C -215.718 +G0 X 11.390 Y 30.995 Z 30.571 A -43.933 C -218.919 +G0 X 12.313 Y 32.019 Z 29.123 A -43.989 C -222.119 +G0 X 13.211 Y 32.981 Z 27.618 A -44.133 C -225.307 +G0 X 14.084 Y 33.877 Z 26.058 A -44.366 C -228.474 +G0 X 14.929 Y 34.706 Z 24.446 A -44.685 C -231.609 +G0 X 15.744 Y 35.467 Z 22.786 A -45.089 C -234.705 +G0 X 16.528 Y 36.158 Z 21.081 A -45.576 C -237.754 +G0 X 17.280 Y 36.777 Z 19.335 A -46.142 C -240.748 +G0 X 17.997 Y 37.324 Z 17.550 A -46.785 C -243.682 +G0 X 16.095 Y 33.379 Z 15.695 A -46.785 C -243.682 +G0 X 27.853 Y 27.563 Z 3.370 A -46.785 C -243.682 +G1 X 29.160 Y 26.917 Z 2.001 A -46.785 C -243.682 F 318 +G1 X 25.544 Y 25.955 Z 3.910 A -46.785 C -243.682 F 159 +G1 X 24.260 Y 25.668 Z 4.625 A -46.795 C -243.749 F 159 +G1 X 22.974 Y 25.372 Z 5.368 A -46.805 C -243.817 F 159 +G1 X 21.711 Y 25.073 Z 6.121 A -46.813 C -243.884 F 159 +G1 X 20.465 Y 24.769 Z 6.890 A -46.820 C -243.950 F 159 +G1 X 19.231 Y 24.463 Z 7.676 A -46.825 C -244.016 F 159 +G1 X 18.149 Y 24.185 Z 8.385 A -46.829 C -244.075 F 159 +G1 X 16.669 Y 23.789 Z 9.383 A -46.833 C -244.156 F 159 +G1 X 15.462 Y 23.451 Z 10.221 A -46.835 C -244.223 F 159 +G1 X 14.280 Y 23.107 Z 11.065 A -46.835 C -244.289 F 159 + +G1 X 13.115 Y 22.752 Z 11.920 A -46.835 C -244.355 F 159 +G1 X 11.955 Y 22.380 Z 12.791 A -46.833 C -244.422 F 159 +G1 X 10.815 Y 21.995 Z 13.671 A -46.830 C -244.490 F 159 +G1 X 9.687 Y 21.588 Z 14.564 A -46.826 C -244.558 F 159 +G1 X 8.531 Y 21.146 Z 15.505 A -46.820 C -244.630 F 159 +G1 X 7.483 Y 20.719 Z 16.382 A -46.813 C -244.696 F 159 +G1 X 6.764 Y 20.412 Z 16.998 A -46.807 C -244.743 F 159 +G1 X 5.696 Y 19.925 Z 17.936 A -46.798 C -244.814 F 159 +G1 X 5.002 Y 19.591 Z 18.562 A -46.791 C -244.862 F 159 +G1 X 3.982 Y 19.067 Z 19.509 A -46.779 C -244.934 F 159 +G1 X 2.979 Y 18.513 Z 20.474 A -46.765 C -245.008 F 159 +G1 X 2.238 Y 18.075 Z 21.212 A -46.753 C -245.064 F 159 +G1 X 1.517 Y 17.624 Z 21.952 A -46.740 C -245.121 F 159 +G1 X 0.897 Y 17.213 Z 22.610 A -46.728 C -245.171 F 159 +G1 X 0.292 Y 16.788 Z 23.273 A -46.715 C -245.222 F 159 +G1 X -0.300 Y 16.354 Z 23.942 A -46.701 C -245.273 F 159 +G1 X -0.873 Y 15.907 Z 24.614 A -46.686 C -245.324 F 159 +G1 X -1.428 Y 15.446 Z 25.289 A -46.670 C -245.376 F 159 +G1 X -1.965 Y 14.968 Z 25.970 A -46.652 C -245.428 F 159 +G1 X -2.517 Y 14.430 Z 26.706 A -46.633 C -245.485 F 159 +G1 X -2.800 Y 14.134 Z 27.099 A -46.622 C -245.515 F 159 +G1 X -5.095 Y 11.459 Z 30.357 A -46.622 C -245.515 F 159 +G1 X -6.418 Y 12.062 Z 31.731 A -46.622 C -245.515 F 318 +G0 X -14.160 Y 15.587 Z 39.769 A -46.622 C -245.515 +G0 X -14.638 Y 17.310 Z 38.873 A -45.997 C -248.464 +G0 X -15.088 Y 18.998 Z 37.900 A -45.450 C -251.472 +G0 X -15.507 Y 20.649 Z 36.853 A -44.983 C -254.533 +G0 X -15.896 Y 22.259 Z 35.733 A -44.600 C -257.639 +G0 X -16.254 Y 23.825 Z 34.542 A -44.301 C -260.783 +G0 X -16.579 Y 25.344 Z 33.283 A -44.090 C -263.956 +G0 X -16.872 Y 26.813 Z 31.959 A -43.967 C -267.148 +G0 X -17.132 Y 28.229 Z 30.571 A -43.933 C -270.349 +G0 X -17.357 Y 29.590 Z 29.123 A -43.989 C -273.549 +G0 X -17.549 Y 30.892 Z 27.618 A -44.133 C -276.737 +G0 X -17.706 Y 32.133 Z 26.058 A -44.366 C -279.904 +G0 X -17.827 Y 33.310 Z 24.446 A -44.685 C -283.040 +G0 X -17.914 Y 34.422 Z 22.786 A -45.089 C -286.135 +G0 X -17.965 Y 35.466 Z 21.081 A -45.576 C -289.184 +G0 X -17.981 Y 36.440 Z 19.335 A -46.142 C -292.178 +G0 X -17.961 Y 37.341 Z 17.550 A -46.785 C -295.112 +G0 X -16.063 Y 33.394 Z 15.695 A -46.785 C -295.112 +G0 X -4.185 Y 38.962 Z 3.370 A -46.785 C -295.112 +G1 X -2.865 Y 39.580 Z 2.001 A -46.785 C -295.112 F 318 +G1 X -4.367 Y 36.154 Z 3.910 A -46.785 C -295.112 F 159 +G1 X -4.943 Y 34.971 Z 4.625 A -46.795 C -295.179 F 159 +G1 X -5.513 Y 33.781 Z 5.368 A -46.805 C -295.247 F 159 +G1 X -6.067 Y 32.607 Z 6.121 A -46.813 C -295.314 F 159 +G1 X -6.607 Y 31.443 Z 6.890 A -46.820 C -295.380 F 159 +G1 X -7.136 Y 30.288 Z 7.676 A -46.825 C -295.446 F 159 +G1 X -7.593 Y 29.268 Z 8.385 A -46.829 C -295.505 F 159 +G1 X -8.207 Y 27.864 Z 9.383 A -46.833 C -295.586 F 159 +G1 X -8.695 Y 26.710 Z 10.221 A -46.835 C -295.653 F 159 +G1 X -9.163 Y 25.571 Z 11.065 A -46.835 C -295.719 F 159 +G1 X -9.612 Y 24.439 Z 11.920 A -46.835 C -295.785 F 159 +G1 X -10.044 Y 23.300 Z 12.791 A -46.833 C -295.852 F 159 +G1 X -10.454 Y 22.169 Z 13.671 A -46.830 C -295.920 F 159 +G1 X -10.839 Y 21.033 Z 14.564 A -46.826 C -295.988 F 159 +G1 X -11.214 Y 19.853 Z 15.505 A -46.820 C -296.060 F 159 +G1 X -11.534 Y 18.769 Z 16.382 A -46.813 C -296.126 F 159 +G1 X -11.742 Y 18.014 Z 16.998 A -46.807 C -296.173 F 159 +G1 X -12.027 Y 16.876 Z 17.936 A -46.798 C -296.244 F 159 +G1 X -12.198 Y 16.125 Z 18.562 A -46.791 C -296.292 F 159 +G1 X -12.425 Y 15.001 Z 19.509 A -46.779 C -296.364 F 159 +G1 X -12.617 Y 13.871 Z 20.474 A -46.765 C -296.438 F 159 +G1 X -12.737 Y 13.019 Z 21.212 A -46.753 C -296.494 F 159 +G1 X -12.833 Y 12.174 Z 21.952 A -46.740 C -296.551 F 159 +G1 X -12.899 Y 11.433 Z 22.610 A -46.728 C -296.601 F 159 +G1 X -12.944 Y 10.695 Z 23.273 A -46.715 C -296.652 F 159 +G1 X -12.973 Y 9.962 Z 23.942 A -46.701 C -296.703 F 159 +G1 X -12.981 Y 9.235 Z 24.614 A -46.686 C -296.754 F 159 +G1 X -12.967 Y 8.514 Z 25.289 A -46.670 C -296.806 F 159 +G1 X -12.927 Y 7.796 Z 25.970 A -46.652 C -296.858 F 159 +G1 X -12.851 Y 7.029 Z 26.706 A -46.633 C -296.915 F 159 +G1 X -12.796 Y 6.623 Z 27.099 A -46.622 C -296.945 F 159 +G1 X -12.136 Y 3.161 Z 30.357 A -46.622 C -296.945 F 159 +G1 X -13.432 Y 2.502 Z 31.731 A -46.622 C -296.945 F 318 +G0 X -21.015 Y -1.353 Z 39.769 A -46.622 C -296.945 +G0 X -22.660 Y -0.653 Z 38.873 A -45.997 C -299.894 +G0 X -24.260 Y 0.049 Z 37.900 A -45.450 C -302.902 +G0 X -25.813 Y 0.750 Z 36.853 A -44.983 C -305.963 +G0 X -27.314 Y 1.449 Z 35.733 A -44.600 C -309.069 +G0 X -28.762 Y 2.146 Z 34.542 A -44.301 C -312.213 +G0 X -30.152 Y 2.839 Z 33.283 A -44.090 C -315.386 +G0 X -31.483 Y 3.526 Z 31.959 A -43.967 C -318.578 +G0 X -32.752 Y 4.206 Z 30.571 A -43.933 C -321.779 +G0 X -33.957 Y 4.877 Z 29.123 A -43.988 C -324.979 +G0 X -35.094 Y 5.540 Z 27.618 A -44.133 C -328.167 +G0 X -36.162 Y 6.191 Z 26.058 A -44.366 C -331.334 +G0 X -37.158 Y 6.830 Z 24.446 A -44.685 C -334.470 +G0 X -38.082 Y 7.455 Z 22.786 A -45.089 C -337.565 +G0 X -38.930 Y 8.066 Z 21.081 A -45.576 C -340.614 +G0 X -39.701 Y 8.661 Z 19.335 A -46.142 C -343.608 +G0 X -40.394 Y 9.238 Z 17.550 A -46.785 C -346.542 +G0 X -36.124 Y 8.262 Z 15.695 A -46.785 C -346.542 +G0 X -33.071 Y 21.020 Z 3.370 A -46.785 C -346.542 +G1 X -32.732 Y 22.437 Z 2.001 A -46.785 C -346.542 F 318 +G1 X -30.990 Y 19.127 Z 3.910 A -46.785 C -346.542 F 159 +G1 X -30.424 Y 17.939 Z 4.625 A -46.795 C -346.609 F 159 +G1 X -29.849 Y 16.751 Z 5.368 A -46.805 C -346.677 F 159 +G1 X -29.276 Y 15.586 Z 6.121 A -46.813 C -346.744 F 159 +G1 X -28.703 Y 14.439 Z 6.890 A -46.820 C -346.810 F 159 +G1 X -28.130 Y 13.304 Z 7.676 A -46.825 C -346.876 F 159 +G1 X -27.617 Y 12.311 Z 8.385 A -46.829 C -346.935 F 159 +G1 X -26.902 Y 10.956 Z 9.383 A -46.833 C -347.016 F 159 +G1 X -26.304 Y 9.855 Z 10.221 A -46.835 C -347.083 F 159 +G1 X -25.706 Y 8.779 Z 11.065 A -46.835 C -347.149 F 159 +G1 X -25.100 Y 7.722 Z 11.920 A -46.835 C -347.215 F 159 +G1 X -24.479 Y 6.674 Z 12.791 A -46.833 C -347.282 F 159 +G1 X -23.850 Y 5.648 Z 13.671 A -46.830 C -347.350 F 159 +G1 X -23.203 Y 4.639 Z 14.564 A -46.826 C -347.418 F 159 +G1 X -22.514 Y 3.610 Z 15.505 A -46.820 C -347.490 F 159 +G1 X -21.865 Y 2.684 Z 16.382 A -46.813 C -347.556 F 159 +G1 X -21.405 Y 2.051 Z 16.998 A -46.807 C -347.603 F 159 +G1 X -20.693 Y 1.119 Z 17.936 A -46.798 C -347.674 F 159 +G1 X -20.213 Y 0.517 Z 18.562 A -46.791 C -347.722 F 159 +G1 X -19.475 Y -0.362 Z 19.509 A -46.779 C -347.794 F 159 +G1 X -18.711 Y -1.216 Z 20.474 A -46.765 C -347.868 F 159 +G1 X -18.120 Y -1.841 Z 21.212 A -46.753 C -347.924 F 159 +G1 X -17.519 Y -2.443 Z 21.952 A -46.740 C -347.981 F 159 +G1 X -16.981 Y -2.956 Z 22.610 A -46.728 C -348.031 F 159 +G1 X -16.432 Y -3.452 Z 23.273 A -46.715 C -348.082 F 159 +G1 X -15.877 Y -3.932 Z 23.942 A -46.700 C -348.133 F 159 +G1 X -15.314 Y -4.392 Z 24.614 A -46.686 C -348.184 F 159 +G1 X -14.741 Y -4.830 Z 25.289 A -46.670 C -348.236 F 159 +G1 X -14.155 Y -5.247 Z 25.970 A -46.652 C -348.288 F 159 +G1 X -13.508 Y -5.665 Z 26.706 A -46.633 C -348.345 F 159 +G1 X -13.157 Y -5.875 Z 27.099 A -46.622 C -348.375 F 159 +G1 X -10.038 Y -7.518 Z 30.357 A -46.622 C -348.375 F 159 +G1 X -10.331 Y -8.942 Z 31.731 A -46.621 C -348.375 F 318 +G0 X -12.045 Y -17.274 Z 39.769 A -46.622 C -348.375 +G0 X -13.618 Y -18.124 Z 38.873 A -45.997 C -351.324 +G0 X -15.164 Y -18.938 Z 37.900 A -45.450 C -354.332 +G0 X -16.680 Y -19.714 Z 36.853 A -44.983 C -357.393 +G0 X -18.163 Y -20.452 Z 35.733 A -44.600 C -360.499 +G0 X -19.610 Y -21.149 Z 34.542 A -44.301 C -363.643 +G0 X -21.019 Y -21.804 Z 33.283 A -44.090 C -366.816 +G0 X -22.386 Y -22.417 Z 31.959 A -43.967 C -370.008 +G0 X -23.708 Y -22.985 Z 30.571 A -43.933 C -373.209 +G0 X -24.984 Y -23.508 Z 29.123 A -43.989 C -376.409 +G0 X -26.211 Y -23.984 Z 27.618 A -44.133 C -379.597 +G0 X -27.386 Y -24.413 Z 26.058 A -44.366 C -382.764 +G0 X -28.507 Y -24.794 Z 24.446 A -44.685 C -385.900 +G0 X -29.571 Y -25.126 Z 22.786 A -45.089 C -388.995 +G0 X -30.578 Y -25.408 Z 21.081 A -45.576 C -392.044 +G0 X -31.523 Y -25.640 Z 19.335 A -46.142 C -395.038 +G0 X -32.407 Y -25.822 Z 17.550 A -46.785 C -397.972 +G0 X -28.982 Y -23.092 Z 15.695 A -46.785 C -397.972 +G0 X -37.053 Y -12.751 Z 3.370 A -46.785 C -397.972 +G1 X -37.950 Y -11.602 Z 2.001 A -46.785 C -397.972 F 318 +G1 X -34.275 Y -12.304 Z 3.910 A -46.785 C -397.972 F 159 +G1 X -32.993 Y -12.602 Z 4.625 A -46.795 C -398.039 F 159 +G1 X -31.706 Y -12.894 Z 5.368 A -46.805 C -398.107 F 159 +G1 X -30.439 Y -13.172 Z 6.121 A -46.813 C -398.174 F 159 +G1 X -29.184 Y -13.439 Z 6.890 A -46.820 C -398.240 F 159 +G1 X -27.940 Y -13.698 Z 7.676 A -46.825 C -398.306 F 159 +G1 X -26.844 Y -13.917 Z 8.385 A -46.829 C -398.365 F 159 +G1 X -25.339 Y -14.203 Z 9.383 A -46.833 C -398.446 F 159 +G1 X -24.104 Y -14.421 Z 10.221 A -46.835 C -398.513 F 159 +G1 X -22.891 Y -14.624 Z 11.065 A -46.835 C -398.579 F 159 +G1 X -21.686 Y -14.810 Z 11.920 A -46.835 C -398.645 F 159 +G1 X -20.480 Y -14.978 Z 12.791 A -46.833 C -398.712 F 159 +G1 X -19.286 Y -15.126 Z 13.671 A -46.830 C -398.780 F 159 +G1 X -18.093 Y -15.249 Z 14.564 A -46.826 C -398.848 F 159 +G1 X -16.859 Y -15.352 Z 15.505 A -46.820 C -398.920 F 159 +G1 X -15.731 Y -15.422 Z 16.382 A -46.813 C -398.986 F 159 +G1 X -14.949 Y -15.457 Z 16.998 A -46.807 C -399.033 F 159 +G1 X -13.776 Y -15.481 Z 17.936 A -46.798 C -399.104 F 159 +G1 X -13.006 Y -15.481 Z 18.562 A -46.791 C -399.152 F 159 +G1 X -11.859 Y -15.452 Z 19.509 A -46.779 C -399.224 F 159 +G1 X -10.715 Y -15.388 Z 20.474 A -46.765 C -399.298 F 159 +G1 X -9.858 Y -15.315 Z 21.212 A -46.753 C -399.354 F 159 +G1 X -9.013 Y -15.221 Z 21.952 A -46.740 C -399.411 F 159 +G1 X -8.276 Y -15.120 Z 22.610 A -46.728 C -399.461 F 159 +G1 X -7.546 Y -14.999 Z 23.273 A -46.715 C -399.512 F 159 +G1 X -6.824 Y -14.865 Z 23.942 A -46.700 C -399.563 F 159 +G1 X -6.114 Y -14.711 Z 24.614 A -46.686 C -399.614 F 159 +G1 X -5.414 Y -14.536 Z 25.289 A -46.670 C -399.666 F 159 +G1 X -4.723 Y -14.338 Z 25.970 A -46.652 C -399.718 F 159 +G1 X -3.992 Y -14.093 Z 26.706 A -46.633 C -399.775 F 159 +G1 X -3.609 Y -13.949 Z 27.099 A -46.622 C -399.805 F 159 +G1 X -0.380 Y -12.535 Z 30.357 A -46.622 C -399.805 F 159 +G1 X 0.550 Y -13.652 Z 31.731 A -46.622 C -399.805 F 318 +G0 X 5.996 Y -20.187 Z 39.769 A -46.622 C -399.805 +M5 +G0 A 0 C 0 +G0 X 0 Y 0 Z40 +( Rmax 45.44 Zmin -2.65 Zmax 39.77 ) +( Amin -74.49 Amax 0.00 ) +( Cmin -399.81 Cmax 0.00 ) +M429 ;Restore Trivkins +M30 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc new file mode 100644 index 0000000..e17dea4 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc @@ -0,0 +1,3 @@ +; zmax zmin r frate n a b c dist +o call [10] [5] [10][1000][3][20][0][45][20] +m2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc new file mode 100644 index 0000000..3b43fd3 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc @@ -0,0 +1,39 @@ +; for debugging, use mdi to set global #<_switchkins_debug>=1 + +#=1000 +M429 +G0 X0 Y0 Z0 A0 C0 +G0 C90 X10 Y0 +G1 F# Z2 + +M428 +G1 F# Z0 + +M429 +G1 F# Z2 +G0 C90 X0 Y10 +G1 F# Z0 + +M428 +G1 F# Z2 + +M429 +G1 F# Z0 +G0 C90 X10 Y30 +G1 F# Z2 + +M428 +G1 F# Z0 + +M429 +G1 F# Z2 +G0 C90 X30 Y10 +G1 F# Z0 + +M428 +G1 F# Z2 +M429 +G1 F# Z0 + +G0 X0 Y0 Z0 A0 C0 +M2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc new file mode 100644 index 0000000..934934f --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc @@ -0,0 +1,49 @@ +; for debugging, use mdi to set global #<_switchkins_debug>=1 + +#=1000 +M429 ;Trivkins +G64 P0.01 +S1500 M3 +G0 X0 Y0 Z5 A0 C0 +G1 F# Z0 +G1 X20 Y0 F# + +M428 ;XYZAC +G1 C90 +G1 X20 +G1 Y20 +G1 X0 +G1 Y0 +G1 A20 +G1 X-20 +G1 Y-20 +G1 X0 +G1 Y0 + +(-------) +G1 C45 +G1 X-15 +G1 Y15 +G1 X0 +G1 Y0 +G1 Y-15 +G1 X15 +G1 Y0 +G1 X0 + +(-------) +G1 C90 X15 +G1 C180 Y15 +G1 C270 X0 +G1 C360 Y0 +G1 C0 +G1 C-90 X-15 +G1 C-180 Y-15 +G1 C-270 X0 +G1 C-360 Y0 +G1 Z5 + +M429 ;Trivkins + +G1 X0 Y0 Z1 A0 C0 +M2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc new file mode 100644 index 0000000..a5c8005 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc @@ -0,0 +1,15 @@ +;# enable optional stop for m1 +m429 ;trivkins +G0 X0 Y0 Z0 A0 C0 +G0 C90 X10 Y0 +G1 F1000 Z2 +(debug,A expect: 10 0 2) m1 +(debug,B expect: 10 0 2) m1 +m428 ;tcp +(debug,C expect: 0 -10 2) m1 +g1f1000 z0 +(debug,D expect: 0 -10 0) m1 +(debug,E expect: 0 -10 0) m1 +m429 ;trivkins +(debug,F expect: 10 0 0) +m2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc new file mode 100644 index 0000000..f3c77f0 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc @@ -0,0 +1,3 @@ +; zmax zmin r frate n a b c dist +o call [10] [5] [10][1000][3][0][20][45][20] +m2 diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc new file mode 100644 index 0000000..46e2d01 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc @@ -0,0 +1,24 @@ +;M428 by remap: kinstype==1 (xyzac,xyzbc) (note: sparm=identityfirst) +o<428remap>sub + # = 1 ; xyzac,xyzbc + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M428: Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<428remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc new file mode 100644 index 0000000..3fa610c --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc @@ -0,0 +1,24 @@ +;M429 by remap: kinstype==0 Identity kinematics +o<429remap>sub + # = 0 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M429:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<429remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc new file mode 100644 index 0000000..65a8222 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc @@ -0,0 +1,24 @@ +;M430 by remap: kinstype==2 userk kins +o<430remap>sub + # = 2 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M430:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M430:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<430remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc new file mode 100644 index 0000000..3607c27 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc @@ -0,0 +1,42 @@ +(info: tests for values of [xyz]-rot-point) +osub +# = #1 (=-2.5) +# = #2 (=-2.5) + # = #3 (= 5) + # = #4 (= 5) +# = #5 (=60) + # = #6 (=12) + # = #7 (=1000 feed) +# = 0 +# = [360/#] + +o1 if [exists [#<_hal[xyzac-trt-kins.x-rot-point]>]] + (debug,x-rot-point=#<_hal[xyzac-trt-kins.x-rot-point]>) + (debug,y-rot-point=#<_hal[xyzac-trt-kins.y-rot-point]>) + (debug,z-rot-point=#<_hal[xyzac-trt-kins.z-rot-point]>) +o1 endif +o2 if [exists [#<_hal[xyzbc-trt-kins.x-rot-point]>]] + (debug,x-rot-point=#<_hal[xyzbc-trt-kins.x-rot-point]>) + (debug,y-rot-point=#<_hal[xyzbc-trt-kins.y-rot-point]>) + (debug,z-rot-point=#<_hal[xyzac-trt-kins.z-rot-point]>) +o2 endif + +M429 ;Identity kinematics +g0 x# y# z0 c0 +M428 ;tcp + +g61 +o10 while [# le 360] + g1 f# + # = [# + #] + g0 c# + g1 x[# + #] + g1 y[# + #] + g1 x[# + 0 ] + g1 y[# + 0 ] +o10 endwhile + + +M429 ;Identity kinematics +g0 x0 y0 z# c0 +oendsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc new file mode 100644 index 0000000..3f47084 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc @@ -0,0 +1,22 @@ +; helix using switchkins (xyzac) a,c angles +osub + # = #1 (=10) + # = #2 (= 5) + # = #3 (=10) + # = #4 (=1000) + # = #5 (=3) + # = #6 (=45) + # = #7 (=0 NA) + # = #8 (=20) + + M429 ;Identity kinematics + g0 x[#<_x> - #] ;adjust for radius + g10l20p0 x0y0 z# a0 c0 ;new g54 + M428 ;XYZAC + g0a#c# ;exercise a,c + f# g2i#z# p# ;helix + M429 ;Identity kinematics + g0 x0 y0 z# a0 c0 ;return to start + g0 x[#<_x> + #] ;adjust restore + M428 ;XYZAC +oendsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc new file mode 100644 index 0000000..6e9261d --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc @@ -0,0 +1,22 @@ +; helix using switchkins (xyzbc) b,c angles +osub + # = #1 (=10) + # = #2 (= 5) + # = #3 (=10) + # = #4 (=1000) + # = #5 (=3) + # = #6 (=0 NA) + # = #7 (=45) + # = #8 (=20) + + M429 ;Identity kinematics + g0 x[#<_x> - #] ;adjust for radius + g10l20p0 x0y0 z# b0 c0 ;new g54 + M428 ;XYZBC + g0b#c# ;exercise b,c + f# g2i#z# p# ;helix + M429 ;Identity kinematics + g0 x0 y0 z# b0 c0 ;return to start + g0 x[#<_x> + #] ;adjust restore + M428 ;XYZBC +oendsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc new file mode 100644 index 0000000..771fedb --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzac_switchkins_sub.ngc @@ -0,0 +1,47 @@ +; ngcgui-compatible subroutine +(info: helix in each quadrant at angles A,C) +osub + # = #1 (=10) + # = #2 (= 5) + # = #3 (=10 radius) + # = #4 (=1000 feedrate) + # = #5 (=3 n circles) + # = #6 (=30 A angle) + # = #7 (=0 B angle NA) + # = #8 (=45 C angle) + # = #9 (=20 distance) + +; quadrant I +M429 ;Identity kinematics +g53 g0 x0y0 z# a0 c0 ;MACHINE coordinates +g10l20p0 x0y0 z# a0 c0 ;new g54 +g0 x+# y+# z# ;move to pattern center position +o call [#][#][#][#][#][#][#][#] + +; quadrant II +M429 ;Identity kinematics +g53 g0 x0y0 z# a0 c0 +g10l20p0 x0y0 z# a0 c0 +g0 x-# y+# z# +o call [#][#][#][#][#][#][#][#] + +; quadrant III +M429 ;Identity kinematics +g53 g0 x0y0 z# a0 c0 +g10l20p0 x0y0 z# a0 c0 +g0 x-# y-# z# +o call [#][#][#][#][#][#][#][#] + +; quadrant IV +M429 ;Identity kinematics +g53 g0 x0y0 z# a0 c0 +g10l20p0 x0y0 z# a0 c0 +g0 x+# y-# z# +o call [#][#][#][#][#][#][#][#] + +;final position +M429 ;Identity kinematics +g53 g0 x0y0 z# ;MACHINE coordinates +g10l20p0 x0y0 z# ;new g54 + +oendsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc new file mode 100644 index 0000000..3e92c5f --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc @@ -0,0 +1,47 @@ +; ngcgui-compatible subroutine +(info: helix in each quadrant at angles B,C) +osub + # = #1 (=10) + # = #2 (= 5) + # = #3 (=10 radius) + # = #4 (=1000 feedrate) + # = #5 (=3 n circles) + # = #6 (=0 A angle NA) + # = #7 (=30 B angle) + # = #8 (=45 C angle) + # = #9 (=20 distance) + +; quadrant I +M429 ;Identity kinematics +g53 g0 x0y0 z# b0 c0 ;MACHINE coordinates +g10l20p0 x0y0 z# b0 c0 ;new g54 +g0 x+# y+# z# ;move to pattern center position +o call [#][#][#][#][#][#][#][#] + +; quadrant II +M429 ;Identity kinematics +g53 g0 x0y0 z# b0 c0 +g10l20p0 x0y0 z# b0 c0 +g0 x-# y+# z# +o call [#][#][#][#][#][#][#][#] + +; quadrant III +M429 ;Identity kinematics +g53 g0 x0y0 z# b0 c0 +g10l20p0 x0y0 z# b0 c0 +g0 x-# y-# z# +o call [#][#][#][#][#][#][#][#] + +; quadrant IV +M429 ;Identity kinematics +g53 g0 x0y0 z# b0 c0 +g10l20p0 x0y0 z# b0 c0 +g0 x+# y-# z# +o call [#][#][#][#][#][#][#][#] + +;final position +M429 ;Identity kinematics +g53 g0 x0y0 z# ;MACHINE coordinates +g10l20p0 x0y0 z# ;new g54 + +oendsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc new file mode 100644 index 0000000..4ab3aaf --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc @@ -0,0 +1,24 @@ +;M428 by remap: select kinstype=0 genhexkins +o<428remap>sub + # = 0 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M428:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M428: Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<428remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc new file mode 100644 index 0000000..54726d3 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc @@ -0,0 +1,24 @@ +;M429 by remap: select kinstype==1 Identity kinematics +o<429remap>sub + # = 1 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M429:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M429:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<429remap>endsub diff --git a/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc new file mode 100644 index 0000000..7586236 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc @@ -0,0 +1,24 @@ +;M430 by remap: select kinstype==2 userk kins +o<430remap>sub + # = 2 + # = 3 ; set N as required: motion.analog-out-0N + +o1 if [exists [#<_hal[motion.switchkins-type]>]] +o1 else + (debug,M30:Missing [RS274NGC]HAL_PIN_VARS=1) + (debug,STOP) + M2 +o1 endif + + M68 E# Q# ; set kinstype value + M66 E0 L0 ; force synch + +o2 if [[#<_task> EQ 1] AND [#<_hal[motion.switchkins-type]> NE #]] + (debug,M430:Wrong motion.switchkins-type) + (debug,or missing hal net to analog-out-0x) + (debug,STOP) + M2 +o2 else +o2 endif + +o<430remap>endsub diff --git a/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc new file mode 100644 index 0000000..66e8cd6 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc @@ -0,0 +1,1879 @@ +% +(!!! Touch Off: Table = -13.25 == Z max neg extent !!!) +(BOAT-XYZAC) +( 11/20/2011 19:50:48 ) +( FC HERMLE 5 AXIS MILLING ) + +( OPERATION= ROUGH7 Z LEVEL SRF_MILL1 ) +( TOOL: T1 = 10.0 dia. ENDMILLM1000:REG ) +G00 G17 G40 G90 G94 +Z5 +T1 M6 +G54 X-49.65 Y-23.015 A0. C0. S630 M03 +G00 Z5.0 M08 +Z3.0 +G01 Z-6.625 F300.0 +X-49.375 F600.0 +X-15.268 +X-16.626 Y-22.711 +X-20.108 Y-21.7 +X-22.255 Y-20.925 +X-25.036 Y-19.685 +X-49.662 +Y-16.355 +X-31.172 +X-34.919 Y-13.877 +X-36.057 Y-13.025 +X-49.662 +Y-9.695 +X-40.427 +X-44.365 Y-6.498 +X-49.662 +Y3.492 +X-43.134 +X-39.14 Y6.724 +X-38.83 Y6.955 +X-49.662 +Y10.285 +X-34.295 +X-30.697 Y12.666 +X-29.005 Y13.615 +X-49.662 +Y16.945 +X-22.119 +X-20.848 Y17.446 +X-16.626 Y18.719 +X-13.812 Y19.346 +X-9.591 Y20.015 +X-6.955 Y20.275 +X-48.713 +G02 X-44.662 Y22.345 I4.051 J-2.931 +G01 X40.959 +G02 X45.01 Y20.275 I0. J-5.0 +G01 X5.29 +X10.109 Y19.934 +X15.737 Y19.258 +X22.773 Y18.136 +X28.999 Y16.945 +X45.959 +Y13.615 +X39.599 +X39.658 Y13.571 +X40.983 Y12.071 +X41.833 Y10.664 +X42.003 Y10.285 +X45.959 +Y6.955 +X43.169 +X43.63 Y5.036 +X43.87 Y3.492 +X45.959 +Y0.162 +X44.111 +X44.158 Y-2.0 +X44.132 Y-3.168 +X45.959 +Y-6.498 +X44.022 +X43.634 Y-9.036 +X43.475 Y-9.695 +X45.959 +Y-13.025 +X42.547 +X42.467 Y-13.257 +X41.833 Y-14.664 +X41.065 Y-15.952 +X40.717 Y-16.355 +X45.959 +Y-19.685 +X35.537 +X35.437 Y-19.714 +X25.587 Y-21.634 +X17.321 Y-23.015 +X45.672 +G00 Z5.0 +X-15.268 +Z3.0 +G01 Z-6.625 F300.0 +X-16.626 Y-22.711 F600.0 +X-20.108 Y-21.7 +X-22.255 Y-20.925 +X-26.476 Y-19.043 +X-30.697 Y-16.668 +X-34.919 Y-13.877 +X-39.506 Y-10.443 +X-44.769 Y-6.171 +X-46.064 Y-4.814 +X-46.714 Y-3.407 +X-46.912 Y-2.0 +X-46.714 Y-0.593 +X-46.176 Y0.637 +X-44.769 Y2.169 +X-39.14 Y6.724 +X-34.919 Y9.873 +X-30.697 Y12.666 +X-26.476 Y15.034 +X-23.779 Y16.292 +X-20.848 Y17.446 +X-16.626 Y18.719 +X-13.812 Y19.346 +X-9.591 Y20.015 +X-6.777 Y20.293 +X-2.555 Y20.492 +X3.073 Y20.432 +X10.109 Y19.934 +X15.737 Y19.258 +X22.773 Y18.136 +X35.437 Y15.715 +X36.844 Y15.297 +X38.251 Y14.618 +X39.658 Y13.571 +X40.983 Y12.071 +X41.833 Y10.664 +X42.472 Y9.238 +X42.954 Y7.85 +X43.63 Y5.036 +X44.067 Y2.221 +X44.158 Y-2.0 +X44.064 Y-6.221 +X43.634 Y-9.036 +X42.954 Y-11.85 +X42.467 Y-13.257 +X41.833 Y-14.664 +X41.065 Y-15.952 +X39.747 Y-17.478 +X38.251 Y-18.62 +X36.844 Y-19.297 +X35.437 Y-19.714 +X25.587 Y-21.634 +X16.77 Y-23.107 +X12.923 Y-23.626 +X5.887 Y-24.282 +X0.259 Y-24.505 +X-5.369 Y-24.384 +X-9.591 Y-24.014 +X-13.812 Y-23.34 +X-15.268 Y-23.015 +G00 Z5.0 +X-49.65 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.375 F600.0 +X-21.669 +X-22.255 Y-22.828 +X-26.476 Y-21.015 +X-29.045 Y-19.685 +X-49.662 +Y-16.355 +X-34.394 +X-36.326 Y-15.058 +X-39.029 Y-13.025 +X-49.662 +Y-9.828 +X-43.064 +G00 Z5.0 +X46.234 Y-6.537 +Z-3.625 +G01 Z-13.25 F300.0 +X45.959 F600.0 +X45.432 Y-10.443 +X44.691 Y-13.257 +X43.879 Y-15.339 +X42.594 Y-17.478 +X41.412 Y-18.885 +X39.68 Y-20.292 +X38.251 Y-21.072 +X36.844 Y-21.582 +X35.437 Y-21.936 +X29.361 Y-23.015 +X45.672 +X45.886 Y-22.192 +X45.959 Y-21.345 +Y-19.685 +X40.428 +X41.412 Y-18.885 +X42.594 Y-17.478 +X43.269 Y-16.355 +X45.959 +Y-13.025 +X44.752 +X45.432 Y-10.443 +X45.515 Y-9.828 +X45.959 +G00 Z5.0 +X-49.969 Y-1.968 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.942 Y-1.964 F600.0 +X-49.758 Y-2.012 +X-49.662 Y-2.175 +X-49.489 Y-3.407 +X-48.839 Y-4.814 +X-47.583 Y-6.139 +X-40.547 Y-11.883 +X-36.326 Y-15.058 +X-32.105 Y-17.892 +X-29.29 Y-19.558 +X-26.476 Y-21.015 +X-22.255 Y-22.828 +X-18.033 Y-24.175 +X-13.812 Y-25.143 +X-9.591 Y-25.805 +X-6.777 Y-26.09 +X-1.148 Y-26.323 +X4.48 Y-26.217 +X8.811 Y-25.921 +X15.737 Y-25.184 +X24.18 Y-23.935 +X35.437 Y-21.936 +X36.844 Y-21.582 +X38.251 Y-21.072 +X39.68 Y-20.292 +X41.412 Y-18.885 +X42.594 Y-17.478 +X43.879 Y-15.339 +X44.691 Y-13.257 +X45.432 Y-10.443 +X45.959 Y-6.537 +G00 Z5.0 +X-49.937 Y4.702 +Z-3.625 +G01 Z-13.25 F300.0 +X-49.662 F600.0 +X-44.469 +X-42.354 Y6.443 +X-40.136 Y8.165 +X-49.662 +Y11.495 +X-35.643 +X-33.512 Y12.987 +X-30.494 Y14.825 +X-49.662 +Y17.345 +X-49.646 Y17.751 +X-49.596 Y18.155 +X-23.822 +X-22.255 Y18.828 +X-19.441 Y19.769 +X-15.219 Y20.868 +X-11.776 Y21.485 +X-47.465 +G02 X-44.662 Y22.345 I2.803 J-4.14 +G01 X40.959 +G02 X43.762 Y21.485 I0. J-5.0 +G01 X13.062 +X18.551 Y20.804 +X24.18 Y19.935 +X31.215 Y18.712 +X34.095 Y18.155 +X45.893 +X45.942 Y17.751 +X45.959 Y17.345 +Y14.825 +X41.418 +X42.611 Y13.478 +X43.782 Y11.495 +X45.959 +Y8.165 +X44.989 +X45.432 Y6.443 +X45.667 Y4.702 +X45.959 +X46.264 Y2.328 +X46.237 Y2.324 +X46.054 Y2.373 +X45.959 Y2.537 +X45.432 Y6.443 +X44.708 Y9.257 +X43.879 Y11.329 +X42.611 Y13.478 +X41.065 Y15.223 +X39.658 Y16.305 +X38.251 Y17.073 +X36.451 Y17.7 +X31.215 Y18.712 +X24.18 Y19.935 +X18.551 Y20.804 +X11.516 Y21.677 +X5.887 Y22.142 +X0.259 Y22.33 +X-5.369 Y22.185 +X-8.184 Y21.963 +X-10.998 Y21.624 +X-15.219 Y20.868 +X-19.441 Y19.769 +X-22.255 Y18.828 +X-26.476 Y17.015 +X-29.29 Y15.558 +X-33.512 Y12.987 +X-37.733 Y10.031 +X-42.354 Y6.443 +X-47.583 Y2.139 +X-48.839 Y0.814 +X-49.489 Y-0.593 +X-49.662 Y-1.825 +G00 Z5.0 + +( FINISH1 FLOWLINE SRF_MILL1 ) +G00 Z5. +G54 X-34.78 Y-2.436 A-5.546 C-25.602 S600 +G00 Z5 +Z3.573 +X-34.804 Y-2.386 +Z3.0 +G93 +G01 X-34.988 Y-2.0 Z-1.404 F67.8035 +X-35.008 Z-1.403 F30070.6535 +X-31.554 Y-4.825 Z-1.795 F133.9458 +X35.679 Y-4.58 Z-4.595 F8.9164 +X35.585 Y-7.418 Z-4.839 F210.5057 +X-27.8 Y-7.65 Z-2.2 F9.4576 + +G01 X-23.387 Y-10.471 Z-2.632 F53.014 +X35.058 Y-10.258 Z-5.066 F10.2571 + +G01 X27.974 Y-13.122 Z-5.019 F37.2338 +X-17.388 Y-13.287 Z-3.131 F13.2157 + +G01 X0.76 Y-16.059 Z-4.135 F41.8503 +X0.776 Z-4.136 F37454.9529 +G94 +G00 Z0.841 +X0.985 Y-16.495 +Z5.0 +A0. +A-5.545 C-154.392 +X-34.799 Y-1.564 +Z3.574 +X-34.823 Y-1.614 +Z3.0 +G93 +G01 X-35.008 Y-2.0 Z-1.403 F67.8163 +X-34.988 Z-1.404 F29423.1803 +G94 +G00 Z5.0 +X-34.719 Y-1.439 +X36.081 Y1.42 +X35.997 Y1.245 +Z3.0 +G93 +G01 X35.679 Y0.58 Z-4.595 F39.3161 +X-31.555 Y0.825 Z-1.795 F8.9163 +X-27.795 Y3.65 Z-2.2 F127.1152 +X35.584 Y3.419 Z-4.839 F9.4587 +X35.055 Y6.259 Z-5.066 F207.0704 +X-23.392 Y6.472 Z-2.632 F10.2568 + +G01 X-17.387 Y9.288 Z-3.13 F48.707 +X27.971 Y9.122 Z-5.019 F13.2164 + +G01 X0.946 Y12.059 Z-4.142 F41.8071 +X0.933 F48595.8783 +G94 +G00 Z0.835 +X1.142 Y12.494 +Z5.0 +A0. +A-5.546 C-25.605 +X35.967 Y-5.826 +Z3.0 +G93 +G01 Z0.308 F111.4225 +X35.758 Y-5.39 Z-4.669 F60.0 +X35.617 Y-7.15 Z-4.817 F338.6289 +X35.559 Y-7.666 Z-4.86 F1150.293 +X35.426 Y-8.596 Z-4.936 F636.7141 +X35.248 Y-9.519 Z-5.009 C-25.604 F636.0963 +X35.083 Y-10.172 Z-5.059 F889.3249 +X34.778 Y-11.055 Z-5.124 F640.1841 +X34.311 Y-11.886 Z-5.177 C-25.603 F628.3941 +X34.092 Y-12.023 Z-5.18 C-25.601 F2310.4624 +X33.443 Y-12.17 Z-5.166 F900.64 +X29.029 Y-12.939 Z-5.048 F133.8926 +X29.022 Y-12.94 F80597.2105 +X26.511 Y-13.368 Z-4.98 F235.4094 +X26.503 Y-13.37 Z-4.979 F80314.8345 +X21.506 Y-14.178 Z-4.841 F118.4711 +X21.403 Y-14.194 Z-4.838 F5763.6607 +X21.395 Y-14.195 Z-4.837 F80667.8203 +X17.508 Y-14.759 Z-4.724 F152.693 +X14.104 Y-15.192 Z-4.619 F174.7719 +X11.26 Y-15.499 Z-4.526 F209.6045 +X9.011 Y-15.702 Z-4.45 F265.5785 +X6.177 Y-15.898 Z-4.348 C-25.6 F211.0995 +X3.794 Y-16.007 Z-4.258 F251.3505 +X1.432 Y-16.056 Z-4.163 F253.7363 +X-0.929 Y-16.041 Z-4.062 F253.8307 +X-2.816 Y-15.977 Z-3.978 F317.4711 +X-4.897 Y-15.847 Z-3.879 F287.4156 +X-6.745 Y-15.673 Z-3.786 F322.8495 +X-8.428 Y-15.463 Z-3.697 F353.292 +X-10.269 Y-15.171 Z-3.594 F321.5199 +X-11.664 Y-14.903 Z-3.512 F421.6314 +X-12.624 Y-14.693 Z-3.454 F609.4926 +X-13.544 Y-14.471 Z-3.396 F632.3344 +X-14.916 Y-14.101 Z-3.306 C-25.599 F421.4835 +X-16.397 Y-13.643 Z-3.203 F386.2678 +X-17.701 Y-13.182 Z-3.108 F432.6008 +X-18.576 Y-12.84 Z-3.042 F637.0792 +X-19.443 Y-12.475 Z-2.973 F636.1843 +X-20.302 Y-12.088 Z-2.903 F635.2963 +X-21.152 Y-11.68 Z-2.832 F634.4447 +X-21.993 Y-11.251 Z-2.759 F633.5443 +X-23.237 Y-10.571 Z-2.647 F421.7136 +X-24.234 Y-9.988 Z-2.555 F518.1409 +X-25.841 Y-8.981 Z-2.399 F315.2712 +X-27.336 Y-7.975 Z-2.248 F331.8372 +X-28.942 Y-6.827 Z-2.08 F302.8928 +X-30.774 Y-5.444 Z-1.882 F260.388 +X-32.98 Y-3.687 Z-1.636 F211.9425 +X-35.249 Y-1.797 Z-1.375 F202.3508 +X-38.446 Y0.955 Z-1.0 F141.7066 +X-38.78 Y0.578 Z-1.054 A-10.74 C13.027 F22.4123 +X-39.112 Y0.213 Z-1.17 A-17.477 C24.615 F70.0852 +X-36.906 Y-1.699 Z-1.427 A-17.503 C24.226 F188.4925 +X-34.471 Y-3.751 Z-1.708 A-17.558 C23.477 F164.2929 +X-33.011 Y-4.942 Z-1.874 A-17.603 C22.852 F265.6893 +X-33.005 Y-4.947 Z-1.875 C22.849 F70394.9107 +X-31.476 Y-6.157 Z-2.045 A-17.66 C22.041 F248.7184 +X-31.47 Y-6.161 Z-2.046 C22.038 F68631.4436 +X-29.554 Y-7.611 Z-2.253 A-17.746 C20.797 F195.1411 +X-29.348 Y-7.761 Z-2.275 A-17.756 C20.649 F1797.9113 +X-29.343 Y-7.765 Z-2.276 C20.645 F66543.0969 +X-27.769 Y-8.882 Z-2.438 A-17.839 C19.409 F233.7633 +X-27.166 Y-9.292 Z-2.5 A-17.873 C18.889 F604.4541 +X-27.161 Y-9.296 Z-2.501 C18.884 F64698.6016 +X-25.595 Y-10.311 Z-2.654 A-17.969 C17.418 F232.4524 +X-24.895 Y-10.74 Z-2.722 A-18.015 C16.71 F517.268 +X-24.89 Y-10.743 C16.704 F63054.1704 +X-23.728 Y-11.421 Z-2.827 A-18.095 C15.461 F311.5076 +X-22.607 Y-12.035 Z-2.928 A-18.175 C14.184 F322.1328 +X-21.184 Y-12.756 Z-3.05 A-18.279 C12.46 F254.0947 +X-19.76 Y-13.405 Z-3.167 A-18.385 C10.636 F254.7588 +X-18.663 Y-13.854 Z-3.251 A-18.466 C9.205 F334.7184 +X-17.139 Y-14.413 Z-3.363 A-18.569 C7.313 F249.9056 +X-16.286 Y-14.695 Z-3.426 A-18.62 C6.324 F462.6702 +X-16.277 Y-14.699 Z-3.427 C6.314 F41918.854 +X-14.993 Y-15.085 Z-3.514 A-18.692 C4.898 F316.6501 +X-14.98 Y-15.088 Z-3.515 C4.884 F31927.926 +X-13.554 Y-15.465 Z-3.607 A-18.764 C3.41 F295.3307 +X-12.372 Y-15.739 Z-3.681 A-18.817 C2.261 F367.2112 +X-12.359 Y-15.742 Z-3.682 A-18.818 C2.249 F33117.6934 +X-11.055 Y-16.007 Z-3.759 A-18.872 C1.054 F342.4252 +X-11.041 Y-16.01 Z-3.76 C1.042 F33642.7638 +X-9.727 Y-16.24 Z-3.835 A-18.921 C-0.087 F349.1604 +X-9.713 Y-16.242 Z-3.836 C-0.098 F34275.5479 +X-7.901 Y-16.504 Z-3.932 A-18.98 C-1.537 F261.3182 +X-5.885 Y-16.723 Z-4.037 A-19.038 C-2.994 F242.609 +X-4.339 Y-16.846 Z-4.113 A-19.077 C-4.02 F323.8458 +X-4.332 Y-16.847 C-4.025 F72716.2564 +X-2.56 Y-16.944 Z-4.195 A-19.116 C-5.112 F288.1646 +X-1.652 Y-16.976 Z-4.236 A-19.134 C-5.635 F569.5493 +X-1.645 Y-16.977 C-5.638 F74204.6496 +X-0.308 Y-17.005 Z-4.295 A-19.159 C-6.369 F390.5046 +X-0.294 C-6.376 F37412.3791 +X1.028 Y-17.011 Z-4.351 A-19.181 C-7.053 F399.1501 +X1.042 Z-4.352 C-7.06 F37617.142 +X1.902 Y-17.005 Z-4.387 A-19.194 C-7.478 F617.9736 +X1.916 Y-17.004 C-7.485 F37761.9311 +X3.696 Y-16.964 Z-4.457 A-19.218 C-8.296 F300.3514 +X3.71 Z-4.458 C-8.302 F37938.0079 +X5.043 Y-16.912 Z-4.509 A-19.234 C-8.864 F404.0498 +X5.057 Y-16.911 Z-4.51 C-8.87 F38040.7452 +X6.381 Y-16.842 Z-4.559 A-19.248 C-9.392 F408.3066 +X6.388 Z-4.56 C-9.394 F81945.7876 +X8.387 Y-16.707 Z-4.631 A-19.268 C-10.121 F271.2688 +X9.706 Y-16.599 Z-4.679 A-19.279 C-10.562 F413.01 +X9.713 C-10.564 F76540.6667 +X10.605 Y-16.518 Z-4.71 A-19.287 C-10.846 F611.8709 +X10.612 Y-16.517 C-10.848 F76595.176 +X12.957 Y-16.278 Z-4.787 A-19.304 C-11.523 F232.954 +X14.167 Y-16.141 Z-4.826 A-19.311 C-11.837 F453.3627 +X14.174 Y-16.14 C-11.839 F76892.5923 +X16.404 Y-15.864 Z-4.896 A-19.323 C-12.356 F246.3963 +X16.412 Y-15.863 C-12.358 F77033.003 +X16.419 Y-15.862 A-19.324 C-12.359 F76846.0857 +X19.076 Y-15.501 Z-4.977 A-19.335 C-12.889 F207.4732 +X19.083 Y-15.5 C-12.891 F79166.5689 +X21.643 Y-15.122 Z-5.051 A-19.345 C-13.328 F216.1386 +X21.65 Y-15.12 Z-5.052 C-13.329 F78853.9112 +X21.657 Y-15.119 C-13.33 F78871.9501 +X24.185 Y-14.717 Z-5.121 A-19.352 C-13.676 F220.4484 +X24.192 Y-14.716 Z-5.122 C-13.677 F78607.9704 +X25.587 Y-14.484 Z-5.158 A-19.355 C-13.828 F403.3325 +X25.594 Y-14.483 C-13.829 F79100.6761 +X29.561 Y-13.802 Z-5.262 A-19.36 C-14.107 F143.5946 +X29.568 Y-13.801 C-14.108 F78752.201 +X29.59 Y-13.797 C-14.109 F26249.5019 +X29.597 Y-13.796 Z-5.263 F78750.763 +X29.605 Y-13.794 F78733.9557 +X33.166 Y-13.186 Z-5.363 A-19.364 C-14.299 F160.9131 +X33.187 Y-13.182 Z-5.364 A-19.365 C-14.316 F18657.1196 +X33.194 Y-13.181 C-14.322 F56001.4861 +X33.705 Y-13.086 Z-5.376 A-19.381 C-15.203 F566.6445 +X34.257 Y-12.957 Z-5.391 A-19.427 C-18.127 F252.9034 +X34.513 Y-12.876 Z-5.396 A-19.464 C-21.985 F226.0768 +X34.613 Y-12.831 A-19.476 C-25.884 F238.1518 +X34.71 Y-12.78 Z-5.393 A-19.458 C-30.0 F225.2867 +X34.805 Y-12.719 Z-5.39 A-19.412 C-34.115 F223.3174 +X34.908 Y-12.632 Z-5.387 A-19.337 C-38.238 F218.9419 +X35.03 Y-12.505 Z-5.381 A-19.232 C-42.379 F212.3012 +X35.168 Y-12.338 Z-5.373 A-19.112 C-46.185 F223.5377 +X35.327 Y-12.109 Z-5.361 A-18.976 C-49.799 F226.436 +X35.449 Y-11.902 Z-5.349 A-18.873 C-52.236 F323.7952 +X35.577 Y-11.649 Z-5.333 A-18.766 C-54.58 F325.2287 +X35.694 Y-11.383 Z-5.315 A-18.669 C-56.567 F370.2163 +X35.815 Y-11.071 Z-5.293 A-18.571 C-58.477 F371.372 +X35.923 Y-10.757 Z-5.27 A-18.484 C-60.088 F423.853 +X36.081 Y-10.223 Z-5.231 A-18.359 C-62.321 F291.259 +X36.229 Y-9.623 Z-5.185 A-18.242 C-64.299 F308.1906 +X36.392 Y-8.784 Z-5.119 A-18.109 C-66.447 F261.3735 +X36.519 Y-7.934 Z-5.051 A-18.002 C-68.128 F302.5985 +X36.66 Y-6.629 Z-4.943 A-17.877 C-70.05 F231.4025 +X36.719 Y-5.862 Z-4.879 A-17.82 C-70.9 F449.6525 +X36.748 Y-5.442 Z-4.843 F1419.3659 +X37.219 Y-5.458 Z-5.021 A-24.839 C-75.625 F132.422 +X37.664 Y-5.468 Z-5.256 A-31.944 C-78.356 F185.0503 +X37.636 Y-5.889 Z-5.292 F1419.3661 + + + +X37.544 Y-6.965 Z-5.386 A-32.011 C-76.967 F298.9435 +X37.543 Y-6.973 A-32.012 C-76.954 F34171.1882 +X37.452 Y-7.793 Z-5.453 A-32.075 C-75.61 F349.0912 +X37.362 Y-8.45 Z-5.505 A-32.136 C-74.304 F392.1525 +X37.259 Y-9.073 Z-5.553 A-32.204 C-72.825 F372.5773 +X37.143 Y-9.66 Z-5.598 A-32.279 C-71.16 F353.9565 +X37.013 Y-10.209 Z-5.638 A-32.361 C-69.3 F336.1891 +X36.875 Y-10.705 Z-5.673 A-32.445 C-67.295 F329.053 +X36.792 Y-10.971 Z-5.691 A-32.495 C-66.054 F551.7757 +X36.626 Y-11.444 Z-5.724 A-32.596 C-63.47 F275.5648 +X36.464 Y-11.839 Z-5.75 A-32.694 C-60.806 F279.2561 +X36.297 Y-12.186 Z-5.771 A-32.794 C-57.89 F264.893 +X36.127 Y-12.486 Z-5.787 A-32.895 C-54.721 F251.7287 +X35.958 Y-12.741 Z-5.799 A-32.993 C-51.301 F239.5728 +X35.793 Y-12.955 Z-5.806 A-33.085 C-47.642 F228.7055 +X35.7 Y-13.064 Z-5.809 A-33.135 C-45.405 F379.4568 +X35.592 Y-13.178 Z-5.815 A-33.19 C-42.664 F312.5313 +X35.491 Y-13.276 Z-5.818 A-33.236 C-39.931 F316.0508 +X35.374 Y-13.374 Z-5.821 A-33.281 C-36.653 F265.6458 +X35.259 Y-13.457 Z-5.822 A-33.314 C-33.379 F267.6536 +X35.144 Y-13.528 A-33.336 C-30.104 F268.8529 +X35.023 Y-13.593 Z-5.821 A-33.347 C-26.824 F269.2969 +X34.912 Y-13.647 Z-5.822 A-33.345 C-23.714 F285.9558 +X34.784 Y-13.699 Z-5.823 A-33.334 C-20.721 F294.9847 +X34.583 Y-13.764 Z-5.82 A-33.314 C-17.856 F297.6716 +X34.253 Y-13.853 Z-5.814 A-33.288 C-15.132 F294.0354 +X33.915 Y-13.927 Z-5.808 A-33.271 C-13.6 F463.8183 +X33.307 Y-14.043 Z-5.793 A-33.25 C-12.32 F429.7466 +X33.298 Y-14.044 Z-5.792 A-33.249 C-12.313 F44917.8843 +X33.003 Y-14.097 Z-5.783 A-33.25 C-12.218 F1680.6359 +X29.665 Y-14.68 Z-5.695 A-33.247 C-12.104 F173.8324 +X29.658 Y-14.682 F79064.6725 +X25.324 Y-15.411 Z-5.58 A-33.241 C-11.713 F130.9513 +X25.317 Y-15.412 C-11.712 F78232.0091 +X24.423 Y-15.557 Z-5.556 A-33.24 C-11.597 F625.8063 +X24.416 Y-15.558 C-11.596 F78126.8077 +X21.781 Y-15.973 Z-5.482 A-33.235 C-11.189 F211.4375 +X21.774 Y-15.974 Z-5.481 C-11.188 F77993.3993 +X21.767 Y-15.975 C-11.187 F77992.6442 +X19.135 Y-16.364 Z-5.405 A-33.227 C-10.675 F210.2805 +X19.128 Y-16.365 C-10.674 F78064.6272 +X19.121 Y-16.366 Z-5.404 C-10.672 F78042.9192 +X16.478 Y-16.727 Z-5.326 A-33.217 C-10.05 F208.6363 +X16.471 Y-16.728 C-10.048 F78333.0313 +X14.27 Y-17.002 Z-5.257 A-33.206 C-9.443 F250.0814 +X14.263 Y-17.003 C-9.441 F78879.4143 +X11.458 Y-17.31 Z-5.166 A-33.189 C-8.55 F196.6204 +X10.691 Y-17.383 Z-5.142 A-33.184 C-8.282 F717.7179 +X10.684 Y-17.384 C-8.279 F79956.958 +X10.118 Y-17.437 Z-5.122 A-33.18 C-8.074 F972.0319 +X10.111 C-8.071 F79881.3134 +X7.77 Y-17.628 Z-5.037 A-33.162 C-7.156 F236.7256 +X7.763 C-7.153 F80864.0428 +X6.419 Y-17.715 Z-4.988 A-33.151 C-6.577 F412.8991 +X6.412 C-6.574 F81633.3529 +X5.073 Y-17.784 Z-4.937 A-33.139 C-5.96 F415.6555 +X5.065 C-5.956 F72554.7822 +X3.726 Y-17.836 Z-4.885 A-33.125 C-5.301 F416.8307 +X3.712 Y-17.837 Z-4.884 C-5.294 F41306.2946 +X1.68 Y-17.879 Z-4.806 A-33.101 C-4.215 F275.9724 +X1.674 C-4.211 F83867.1749 +X1.026 Y-17.884 Z-4.781 A-33.093 C-3.845 F865.5121 +X1.02 C-3.842 F83752.362 +X-0.329 Y-17.879 Z-4.725 A-33.073 C-3.043 F415.7648 +X-0.335 Z-4.724 C-3.039 F84821.141 +X-1.689 Y-17.852 Z-4.667 A-33.052 C-2.186 F413.0057 +X-1.696 Z-4.666 A-33.051 C-2.181 F85106.5934 +X-3.732 Y-17.766 Z-4.575 A-33.015 C-0.794 F272.181 +X-4.42 Y-17.723 Z-4.544 A-33.002 C-0.295 F799.0507 +X-4.426 A-33.001 C-0.29 F85128.9864 +X-5.786 Y-17.617 Z-4.479 A-32.973 C0.744 F399.1059 +X-5.792 Y-17.616 C0.749 F84590.4528 +X-7.02 Y-17.495 Z-4.416 A-32.946 C1.742 F434.2244 +X-8.628 Y-17.293 Z-4.329 A-32.907 C3.135 F323.2627 +X-9.863 Y-17.102 Z-4.259 A-32.874 C4.282 F409.6405 +X-9.873 Y-17.1 C4.292 F50122.4057 +X-11.223 Y-16.862 Z-4.181 A-32.833 C5.617 F364.0343 +X-11.235 Y-16.86 Z-4.18 A-32.832 C5.629 F41166.2767 +X-12.576 Y-16.59 Z-4.103 A-32.786 C7.025 F355.005 +X-12.587 Y-16.588 Z-4.102 A-32.785 C7.037 F40521.3382 +X-13.914 Y-16.284 Z-4.024 A-32.733 C8.505 F345.9229 +X-13.925 Y-16.281 Z-4.023 C8.519 F39407.9805 +X-15.249 Y-15.936 Z-3.942 A-32.675 C10.079 F332.7357 +X-15.26 Y-15.933 Z-3.941 C10.093 F38254.0218 +X-16.564 Y-15.548 Z-3.857 A-32.613 C11.73 F323.2848 +X-16.575 Y-15.544 Z-3.856 A-32.612 C11.744 F37056.9146 +X-17.627 Y-15.2 Z-3.778 A-32.559 C13.14 F384.7473 +X-18.323 Y-14.951 Z-3.727 A-32.521 C14.098 F564.8027 +X-19.418 Y-14.52 Z-3.647 A-32.46 C15.66 F345.3703 +X-19.424 Y-14.518 C15.667 F71772.9301 +X-20.252 Y-14.166 Z-3.58 A-32.412 C16.877 F443.3001 +X-20.257 Y-14.163 Z-3.579 C16.884 F70343.8706 +X-21.031 Y-13.815 Z-3.51 A-32.366 C18.021 F464.2404 +X-22.66 Y-13.019 Z-3.373 A-32.266 C20.329 F215.3243 +X-22.954 Y-12.869 Z-3.352 A-32.247 C20.715 F1209.5244 +X-22.959 Y-12.866 C20.721 F74883.8135 +X-23.638 Y-12.513 Z-3.295 A-32.206 C21.584 F523.6539 +X-24.343 Y-12.124 Z-3.235 A-32.164 C22.462 F498.5599 +X-25.389 Y-11.508 Z-3.145 A-32.106 C23.719 F332.2491 +X-25.394 Y-11.505 A-32.105 C23.725 F63651.5752 +X-26.552 Y-10.783 Z-3.032 A-32.045 C25.033 F298.9598 +X-26.557 Y-10.78 C25.039 F64113.5367 +X-27.686 Y-10.037 Z-2.918 A-31.99 C26.218 F307.2558 +X-27.697 Y-10.029 Z-2.917 C26.228 F31931.9339 +X-28.806 Y-9.268 Z-2.804 A-31.939 C27.283 F315.3517 +X-28.816 Y-9.26 Z-2.803 C27.293 F32281.1645 +X-29.911 Y-8.481 Z-2.691 A-31.891 C28.233 F323.063 +X-29.917 Y-8.478 C28.237 F70516.0537 +X-30.995 Y-7.682 Z-2.578 A-31.848 C29.075 F331.1271 +X-31.0 Y-7.678 Z-2.577 C29.079 F66937.9958 +X-32.066 Y-6.864 Z-2.462 A-31.811 C29.821 F338.6774 +X-32.071 Y-6.859 C29.824 F67492.5695 +X-33.358 Y-5.845 Z-2.319 A-31.771 C30.606 F284.4992 +X-33.364 Y-5.84 Z-2.318 C30.609 F68393.3007 +X-35.204 Y-4.34 Z-2.106 A-31.725 C31.511 F203.7369 +X-36.211 Y-3.498 Z-1.99 A-31.705 C31.902 F382.8171 +X-36.217 Y-3.493 Z-1.989 C31.904 F71251.9807 +X-37.675 Y-2.253 Z-1.821 A-31.681 C32.348 F270.8197 +X-37.68 Y-2.248 Z-1.82 C32.349 F73604.9519 +X-39.747 Y-0.46 Z-1.58 A-31.661 C32.752 F198.4906 +X-40.04 Y-0.758 Z-1.868 A-38.849 C34.709 F281.8183 +X-40.31 Y-1.021 Z-2.208 A-46.062 C36.136 F329.8521 +X-38.322 Y-2.741 Z-2.441 A-46.074 C35.738 F206.3467 +X-38.311 Y-2.75 Z-2.442 A-46.075 C35.735 F38244.0083 +X-36.775 Y-4.058 Z-2.618 A-46.091 C35.255 F256.786 +X-36.77 Y-4.062 Z-2.619 C35.253 F73871.0274 +X-35.75 Y-4.914 Z-2.735 A-46.104 C34.845 F376.8494 +X-35.745 Y-4.918 C34.843 F73212.7266 +X-34.127 Y-6.236 Z-2.92 A-46.131 C34.04 F232.3329 +X-34.122 Y-6.24 C34.037 F71366.4999 +X-32.61 Y-7.434 Z-3.087 A-46.161 C33.104 F241.8259 +X-32.605 Y-7.438 Z-3.088 C33.1 F70524.3015 +X-31.216 Y-8.496 Z-3.235 A-46.194 C32.082 F257.6789 +X-30.454 Y-9.057 Z-3.316 A-46.215 C31.458 F462.8026 +X-30.447 Y-9.062 Z-3.317 C31.452 F49965.7061 +X-29.344 Y-9.849 Z-3.429 A-46.246 C30.47 F317.2802 +X-29.334 Y-9.856 Z-3.43 A-46.247 C30.46 F34291.2369 +X-28.21 Y-10.626 Z-3.542 A-46.28 C29.363 F308.4366 +X-28.2 Y-10.633 Z-3.543 A-46.281 C29.353 F34050.2974 +X-27.04 Y-11.392 Z-3.656 A-46.318 C28.12 F296.5991 +X-27.029 Y-11.398 C28.109 F33791.9849 +X-25.851 Y-12.128 Z-3.767 A-46.359 C26.753 F290.2231 +X-25.841 Y-12.134 Z-3.768 C26.741 F33588.3321 +X-24.784 Y-12.76 Z-3.858 A-46.398 C25.434 F320.8149 +X-23.417 Y-13.506 Z-3.979 A-46.45 C23.631 F248.0707 +X-23.376 Y-13.527 Z-3.983 A-46.452 C23.576 F8360.5583 +X-23.366 Y-13.532 Z-3.984 C23.562 F33453.0827 +X-22.213 Y-14.117 Z-4.077 A-46.499 C21.935 F292.4422 +X-20.928 Y-14.709 Z-4.179 A-46.552 C20.025 F262.735 +X-19.369 Y-15.359 Z-4.295 A-46.614 C17.681 F220.1932 +X-18.023 Y-15.862 Z-4.391 A-46.662 C15.748 F264.1725 +X-16.858 Y-16.245 Z-4.478 A-46.701 C14.153 F315.8536 +X-16.847 Y-16.248 Z-4.479 C14.138 F34071.0353 +X-15.518 Y-16.647 Z-4.567 A-46.742 C12.404 F285.3752 +X-15.507 Y-16.65 Z-4.568 C12.39 F34461.9988 +X-14.171 Y-17.004 Z-4.651 A-46.779 C10.744 F293.4447 +X-14.16 Y-17.006 Z-4.652 A-46.78 C10.731 F34896.7757 +X-12.806 Y-17.32 Z-4.732 A-46.814 C9.16 F298.9093 +X-12.794 Y-17.323 Z-4.733 A-46.815 C9.147 F35359.3946 +X-11.437 Y-17.596 Z-4.81 A-46.846 C7.667 F307.2577 +X-11.425 Y-17.599 C7.655 F35849.3548 +X-10.055 Y-17.836 Z-4.885 A-46.875 C6.252 F313.0608 +X-10.043 Y-17.838 A-46.876 C6.24 F35861.5855 +X-8.485 Y-18.067 Z-4.966 A-46.905 C4.748 F282.7262 +X-6.857 Y-18.26 Z-5.05 A-46.931 C3.298 F277.9791 +X-5.9 Y-18.352 Z-5.099 A-46.945 C2.493 F481.4692 +X-5.894 Y-18.353 Z-5.1 A-46.946 C2.488 F74542.5454 +X-4.516 Y-18.461 Z-5.166 A-46.964 C1.386 F339.6698 +X-4.51 Y-18.462 C1.381 F75020.8113 +X-3.139 Y-18.542 Z-5.23 A-46.982 C0.351 F347.1537 +X-3.133 C0.346 F75668.6339 +X-1.761 Y-18.595 Z-5.291 A-46.997 C-0.624 F352.0233 +X-1.748 Y-18.596 C-0.633 F37805.1592 +X-0.399 Y-18.624 Z-5.349 A-47.011 C-1.53 F362.5173 +X-0.386 A-47.012 C-1.538 F37980.4391 +X0.979 Y-18.63 Z-5.406 A-47.025 C-2.391 F362.5842 +X0.992 C-2.399 F38241.5389 +X1.857 Y-18.623 Z-5.44 A-47.032 C-2.912 F577.5032 +X1.87 C-2.919 F38388.1065 +X3.713 Y-18.582 Z-5.51 A-47.047 C-3.946 F273.1492 +X3.727 Y-18.581 C-3.953 F38257.4062 +X5.07 Y-18.528 Z-5.561 A-47.057 C-4.647 F378.5099 +X5.084 Y-18.527 C-4.653 F38130.9038 +X6.431 Y-18.456 Z-5.61 A-47.066 C-5.305 F380.1106 +X6.444 Y-18.455 Z-5.611 C-5.312 F38225.0163 +X7.789 Y-18.368 Z-5.659 A-47.074 C-5.921 F383.0874 +X7.803 Y-18.367 C-5.927 F38430.6926 +X9.849 Y-18.202 Z-5.733 A-47.084 C-6.78 F253.2541 +X9.863 Y-18.201 C-6.786 F38254.6718 +X10.721 Y-18.122 Z-5.764 A-47.088 C-7.118 F608.1683 +X10.735 Y-18.121 C-7.123 F38422.352 +X13.779 Y-17.806 Z-5.863 A-47.1 C-8.188 F172.0994 +X14.312 Y-17.743 Z-5.881 A-47.102 C-8.357 F991.0708 +X14.318 Y-17.742 C-8.359 F84792.1044 +X16.538 Y-17.466 Z-5.95 A-47.109 C-9.005 F238.8988 +X16.545 Y-17.465 C-9.007 F76865.0311 +X19.208 Y-17.101 Z-6.029 A-47.117 C-9.672 F200.626 +X19.215 Y-17.1 C-9.673 F77471.3088 +X21.858 Y-16.709 Z-6.105 A-47.122 C-10.22 F204.3025 +X21.866 Y-16.707 C-10.221 F66660.709 +X24.513 Y-16.29 Z-6.179 A-47.126 C-10.656 F206.5565 +X24.52 Y-16.288 C-10.657 F77751.151 +X25.89 Y-16.065 Z-6.216 A-47.128 C-10.84 F403.5117 +X25.897 Y-16.064 C-10.841 F78240.0807 +X29.725 Y-15.418 Z-6.316 A-47.132 C-11.198 F146.6173 +X29.732 Y-15.417 Z-6.317 F79299.3869 +X33.28 Y-14.799 Z-6.412 A-47.133 C-11.349 F162.229 +X33.363 Y-14.783 Z-6.415 A-47.134 C-11.389 F5400.0917 +X33.374 Y-14.781 C-11.397 F38938.8101 +X33.604 Y-14.74 Z-6.421 A-47.136 C-11.658 F1493.1865 +X33.805 Y-14.703 Z-6.426 A-47.139 C-12.035 F1341.3573 +X34.143 Y-14.634 Z-6.433 A-47.152 C-13.173 F552.5815 +X34.418 Y-14.572 Z-6.438 A-47.162 C-14.545 F509.7675 +X34.736 Y-14.488 Z-6.443 A-47.176 C-16.909 F319.2313 +X34.809 Y-14.466 A-47.179 C-17.636 F1082.5698 +X34.998 Y-14.404 Z-6.445 A-47.189 C-19.954 F347.7844 +X35.137 Y-14.351 Z-6.446 A-47.195 C-22.271 F357.3932 +X35.251 Y-14.301 A-47.199 C-24.59 F362.3073 +X35.361 Y-14.248 C-26.909 F361.9779 +X35.531 Y-14.155 A-47.191 C-30.476 F233.8107 +X35.693 Y-14.052 Z-6.445 A-47.176 C-34.044 F232.8385 +X35.808 Y-13.969 Z-6.444 A-47.16 C-36.611 F321.7058 +X35.924 Y-13.877 Z-6.443 A-47.14 C-39.177 F319.88 +X36.008 Y-13.805 Z-6.441 A-47.122 C-41.032 F439.7085 +X36.093 Y-13.725 Z-6.44 A-47.102 C-42.888 F436.8033 +X36.179 Y-13.639 Z-6.437 A-47.08 C-44.745 F433.438 +X36.268 Y-13.545 Z-6.433 A-47.056 C-46.603 F429.6249 +X36.419 Y-13.364 Z-6.429 A-47.011 C-49.699 F254.7345 +X36.574 Y-13.162 Z-6.423 A-46.963 C-52.682 F260.1673 +X36.726 Y-12.94 Z-6.415 A-46.914 C-55.464 F273.9237 +X36.88 Y-12.687 Z-6.405 A-46.861 C-58.157 F277.6352 +X37.034 Y-12.401 Z-6.392 A-46.807 C-60.748 F282.354 +X37.187 Y-12.08 Z-6.375 A-46.751 C-63.226 F288.1607 +X37.337 Y-11.72 Z-6.354 A-46.695 C-65.582 F295.1341 +X37.483 Y-11.32 Z-6.329 A-46.64 C-67.806 F303.319 +X37.623 Y-10.881 Z-6.3 A-46.587 C-69.892 F312.7244 +X37.756 Y-10.4 Z-6.267 A-46.535 C-71.835 F323.3383 +X37.882 Y-9.88 Z-6.23 A-46.485 C-73.633 F335.1347 +X37.997 Y-9.319 Z-6.19 A-46.438 C-75.284 F348.089 +X38.072 Y-8.908 Z-6.16 A-46.407 C-76.344 F518.6323 +X38.165 Y-8.322 Z-6.117 A-46.367 C-77.674 F394.9053 +X38.257 Y-7.616 Z-6.063 A-46.326 C-79.033 F361.9939 +X38.335 Y-6.878 Z-6.004 A-46.29 C-80.214 F384.1981 +X38.42 Y-5.888 Z-5.92 A-46.251 C-81.508 F317.4246 +X38.449 Y-5.468 Z-5.885 F1419.3659 +X38.775 Y-5.457 Z-6.268 A-53.428 C-82.554 F265.5738 +X39.053 Y-5.441 Z-6.688 A-60.613 C-83.421 F275.6536 +X39.025 Y-5.861 Z-6.723 F1419.3645 +X38.98 Y-6.442 Z-6.769 A-60.623 C-82.693 F554.6493 +X38.931 Y-6.98 Z-6.812 A-60.634 C-81.928 F564.1821 +X38.866 Y-7.593 Z-6.859 A-60.648 C-80.932 F462.4696 +X38.792 Y-8.174 Z-6.902 A-60.663 C-79.842 F451.778 +X38.711 Y-8.724 Z-6.942 A-60.68 C-78.654 F439.7143 +X38.621 Y-9.244 Z-6.979 A-60.698 C-77.366 F428.2316 +X38.524 Y-9.735 Z-7.012 A-60.718 C-75.98 F417.5249 +X38.45 Y-10.07 Z-7.033 A-60.732 C-74.929 F569.7774 +X38.378 Y-10.371 Z-7.053 A-60.745 C-73.906 F601.5943 +X38.303 Y-10.655 Z-7.071 A-60.758 C-72.854 F599.0325 +X38.227 Y-10.925 Z-7.088 A-60.772 C-71.771 F596.5131 +X38.15 Y-11.179 Z-7.103 A-60.785 C-70.66 F594.0105 +X38.023 Y-11.561 Z-7.126 A-60.807 C-68.812 F366.8843 +X37.891 Y-11.913 Z-7.145 A-60.829 C-66.873 F360.4892 +X37.757 Y-12.236 Z-7.162 A-60.851 C-64.842 F353.7602 +X37.619 Y-12.533 Z-7.176 A-60.874 C-62.723 F347.5899 +X37.48 Y-12.804 Z-7.187 A-60.896 C-60.519 F341.9823 +X37.34 Y-13.051 Z-7.196 A-60.918 C-58.236 F336.9492 +X37.198 Y-13.276 Z-7.203 A-60.939 C-55.881 F332.4828 +X37.057 Y-13.481 Z-7.208 A-60.959 C-53.458 F328.5806 +X36.916 Y-13.668 Z-7.213 A-60.977 C-50.975 F325.2193 +X36.825 Y-13.779 Z-7.216 A-60.989 C-49.349 F501.7713 +X36.72 Y-13.898 Z-7.219 A-61.002 C-47.449 F433.2007 +X36.618 Y-14.009 Z-7.222 A-61.013 C-45.551 F437.2673 +X36.518 Y-14.11 Z-7.224 A-61.024 C-43.654 F440.8412 +X36.417 Y-14.204 Z-7.225 A-61.033 C-41.758 F443.9005 +X36.279 Y-14.322 Z-7.226 A-61.045 C-39.145 F324.4146 +X36.008 Y-14.52 A-61.061 C-34.169 F171.9665 +X35.872 Y-14.606 Z-7.227 A-61.066 C-31.688 F347.5214 +X35.746 Y-14.68 Z-7.229 A-61.07 C-29.309 F365.4819 +X35.563 Y-14.777 Z-7.231 A-61.072 C-25.839 F252.2788 +X35.471 Y-14.82 C-24.197 F533.3626 +X35.377 Y-14.861 A-61.071 C-22.62 F553.5195 +X35.206 Y-14.928 Z-7.23 A-61.067 C-20.106 F344.6814 +X35.001 Y-14.996 Z-7.228 A-61.063 C-17.71 F354.7837 +X34.745 Y-15.07 Z-7.224 A-61.056 C-15.462 F365.8149 +X34.524 Y-15.129 Z-7.221 A-61.051 C-13.985 F532.6662 +X34.275 Y-15.188 Z-7.216 A-61.047 C-12.737 F595.2022 +X33.893 Y-15.265 Z-7.209 A-61.042 C-11.5 F532.4306 +X33.506 Y-15.333 Z-7.201 A-61.039 C-10.885 F793.5411 +X33.498 Y-15.334 C-10.879 F50154.4319 +X33.195 Y-15.391 Z-7.191 C-10.755 F1575.4196 +X29.913 Y-15.962 Z-7.103 A-61.038 C-10.63 F176.5994 +X29.9 Y-15.965 C-10.629 F42542.5036 +X26.779 Y-16.495 Z-7.02 A-61.037 C-10.365 F182.3113 +X26.773 Y-16.496 C-10.364 F83459.4164 +X24.608 Y-16.852 Z-6.961 A-61.036 C-10.067 F258.2763 +X24.599 Y-16.853 C-10.066 F58724.4659 +X21.931 Y-17.274 Z-6.887 A-61.034 C-9.616 F208.5698 +X21.924 Y-17.275 C-9.614 F79934.3571 +X19.269 Y-17.669 Z-6.811 A-61.031 C-9.046 F208.4431 +X19.262 Y-17.67 C-9.045 F80443.8234 +X16.601 Y-18.033 Z-6.732 A-61.027 C-8.355 F207.653 +X16.595 C-8.353 F81313.7713 +X16.588 Y-18.034 C-8.351 F81309.7105 +X14.369 Y-18.311 Z-6.663 A-61.024 C-7.684 F249.2252 +X14.362 Y-18.312 C-7.682 F82284.8343 +X12.561 Y-18.513 Z-6.606 A-61.021 C-7.072 F307.6436 +X12.554 Y-18.514 C-7.07 F83314.7047 +X10.754 Y-18.694 Z-6.547 A-61.017 C-6.397 F309.3992 +X10.747 C-6.395 F84593.3407 +X9.368 Y-18.818 Z-6.5 A-61.014 C-5.834 F405.2861 +X9.361 C-5.831 F85979.0803 +X7.819 Y-18.938 Z-6.446 A-61.01 C-5.158 F365.2702 +X7.812 Z-6.445 C-5.155 F80923.8551 +X6.448 Y-19.027 Z-6.397 A-61.006 C-4.517 F415.7981 +X6.441 C-4.514 F88407.8337 +X3.92 Y-19.148 Z-6.304 A-60.998 C-3.223 F228.9295 +X3.705 Y-19.154 Z-6.297 A-60.997 C-3.105 F2691.2956 +X3.699 Z-6.296 C-3.102 F91855.7495 +X2.197 Y-19.191 Z-6.238 A-60.991 C-2.245 F389.3566 +X2.188 C-2.24 F69988.6976 +X0.963 Y-19.203 Z-6.189 A-60.986 C-1.495 F482.298 +X0.951 Z-6.188 C-1.487 F47710.8042 +X-0.411 Y-19.197 Z-6.132 A-60.98 C-0.61 F436.0987 +X-0.423 Z-6.131 C-0.602 F48270.9867 +X-1.794 Y-19.168 Z-6.073 A-60.973 C0.335 F427.1476 +X-1.806 Y-19.167 C0.344 F47928.5588 +X-3.186 Y-19.113 Z-6.012 A-60.965 C1.346 F416.3592 +X-3.198 C1.355 F47810.6549 +X-4.578 Y-19.033 Z-5.95 A-60.957 C2.419 F407.797 +X-4.59 Y-19.032 Z-5.949 C2.428 F47360.0821 +X-6.256 Y-18.9 Z-5.87 A-60.945 C3.802 F328.4067 +X-7.746 Y-18.745 Z-5.797 A-60.934 C5.116 F356.7463 +X-9.21 Y-18.556 Z-5.723 A-60.922 C6.494 F351.9355 +X-10.181 Y-18.404 Z-5.674 A-60.913 C7.457 F517.8373 +X-10.192 Y-18.402 Z-5.673 C7.469 F44555.8611 +X-11.574 Y-18.161 Z-5.599 A-60.9 C8.911 F352.6112 +X-11.579 Y-18.16 Z-5.598 C8.917 F87718.0257 +X-12.964 Y-17.88 Z-5.52 A-60.885 C10.453 F339.122 +X-12.969 Y-17.879 C10.459 F85782.7641 +X-14.317 Y-17.565 Z-5.44 A-60.869 C12.047 F335.0615 +X-14.349 Y-17.557 Z-5.438 A-60.868 C12.086 F13999.6022 +X-14.354 Y-17.556 C12.093 F84011.1176 +X-15.551 Y-17.243 Z-5.364 A-60.852 C13.588 F362.7829 +X-15.713 Y-17.196 Z-5.355 A-60.85 C13.796 F2646.4588 +X-15.724 Y-17.193 Z-5.354 C13.81 F39758.9785 +X-16.398 Y-17.002 Z-5.31 A-60.84 C14.692 F625.0047 +X-17.084 Y-16.786 Z-5.268 A-60.83 C15.604 F601.5538 +X-17.09 Y-16.784 Z-5.267 C15.613 F63001.1076 +X-17.895 Y-16.524 Z-5.211 A-60.817 C16.715 F500.565 +X-19.154 Y-16.075 Z-5.125 A-60.796 C18.545 F305.6184 +X-20.397 Y-15.582 Z-5.037 A-60.773 C20.431 F296.2847 +X-21.643 Y-15.039 Z-4.943 A-60.749 C22.324 F286.9399 +X-22.777 Y-14.498 Z-4.854 A-60.727 C23.99 F310.3359 +X-23.756 Y-14.0 Z-4.775 A-60.709 C25.372 F356.1222 +X-25.023 Y-13.309 Z-4.668 A-60.686 C27.073 F272.4831 +X-26.205 Y-12.613 Z-4.566 A-60.665 C28.562 F290.2371 +X-26.216 Y-12.607 Z-4.565 C28.574 F34291.239 +X-27.411 Y-11.866 Z-4.455 A-60.645 C29.971 F287.4056 +X-27.421 Y-11.86 Z-4.454 C29.982 F34155.536 +X-28.583 Y-11.101 Z-4.344 A-60.627 C31.237 F296.1973 +X-28.593 Y-11.094 Z-4.343 C31.248 F34188.6906 +X-29.721 Y-10.321 Z-4.233 A-60.61 C32.375 F305.6994 +X-29.727 Y-10.318 C32.38 F63053.7417 +X-30.852 Y-9.513 Z-4.117 A-60.596 C33.388 F310.1096 +X-30.862 Y-9.505 Z-4.116 A-60.595 C33.397 F34020.9984 +X-31.946 Y-8.704 Z-4.006 A-60.581 C34.284 F324.0524 +X-31.951 Y-8.7 Z-4.005 C34.288 F72978.8395 +X-33.034 Y-7.872 Z-3.89 A-60.569 C35.073 F329.1088 +X-33.04 Y-7.868 C35.077 F62222.4015 +X-34.098 Y-7.036 Z-3.774 A-60.559 C35.76 F341.0577 +X-34.108 Y-7.027 Z-3.773 C35.766 F34696.11 +X-34.977 Y-6.33 Z-3.677 A-60.552 C36.267 F421.1409 +X-34.987 Y-6.322 Z-3.676 C36.273 F36367.7857 +X-36.184 Y-5.342 Z-3.542 A-60.542 C36.857 F311.9864 +X-36.189 Y-5.337 C36.86 F70301.6143 +X-37.217 Y-4.479 Z-3.425 A-60.535 C37.276 F371.4975 +X-37.222 Y-4.474 Z-3.424 C37.278 F73322.6335 +X-38.421 Y-3.456 Z-3.287 A-60.528 C37.673 F325.3826 +X-38.431 Y-3.447 Z-3.286 C37.676 F37274.5034 +X-38.956 Y-2.998 Z-3.225 A-60.526 C37.818 F759.0196 +X-38.967 Y-2.989 Z-3.224 C37.821 F37187.3679 +X-40.764 Y-1.433 Z-3.013 A-60.522 C38.176 F227.3148 +X-40.941 Y-1.574 Z-3.468 A-67.759 C38.975 F384.1471 +X-41.08 Y-1.669 Z-3.946 A-74.999 C39.696 F382.9626 +X-39.153 Y-3.337 Z-4.171 A-74.998 C39.303 F212.0877 +X-38.684 Y-3.738 Z-4.225 C39.172 F846.417 +X-38.676 Y-3.746 Z-4.226 C39.169 F46747.9732 +X-37.581 Y-4.674 Z-4.351 C38.804 F356.4558 +X-37.576 Y-4.678 C38.802 F76055.0756 +X-36.499 Y-5.579 Z-4.473 C38.36 F353.799 +X-36.494 Y-5.583 Z-4.474 C38.357 F74736.3311 +X-35.438 Y-6.451 Z-4.591 A-74.999 C37.839 F352.9047 +X-35.433 Y-6.455 C37.837 F74796.8751 +X-34.127 Y-7.505 Z-4.733 A-75.0 C37.077 F279.1998 +X-32.874 Y-8.483 Z-4.866 C36.222 F284.8366 +X-31.645 Y-9.41 Z-4.994 A-74.999 C35.265 F285.301 +X-30.435 Y-10.289 Z-5.116 C34.207 F285.7355 +X-29.349 Y-11.047 Z-5.221 A-75.0 C33.159 F314.0017 +X-28.288 Y-11.758 Z-5.322 A-74.999 C32.048 F318.4122 +X-27.103 Y-12.515 Z-5.432 C30.704 F282.7635 +X-25.92 Y-13.23 Z-5.538 C29.254 F280.9217 +X-24.742 Y-13.899 Z-5.638 C27.708 F280.4628 +X-23.308 Y-14.655 Z-5.749 A-75.0 C25.71 F230.2239 +X-22.062 Y-15.259 Z-5.842 A-75.001 C23.868 F264.2997 +X-20.825 Y-15.809 Z-5.936 A-75.0 C21.975 F267.544 +X-19.571 Y-16.317 Z-6.027 A-74.999 C20.064 F269.1347 +X-18.291 Y-16.784 Z-6.116 C18.176 F271.772 +X-16.983 Y-17.215 Z-6.2 C16.334 F274.9918 +X-15.644 Y-17.608 Z-6.281 C14.553 F278.467 +X-14.282 Y-17.962 Z-6.359 C12.846 F283.2289 +X-12.885 Y-18.278 Z-6.437 A-75.0 C11.199 F285.3867 +X-11.468 Y-18.561 Z-6.513 C9.625 F289.7023 +X-10.022 Y-18.807 Z-6.591 C8.108 F291.4419 +X-8.134 Y-19.072 Z-6.691 A-74.999 C6.249 F229.3717 +X-6.275 Y-19.272 Z-6.783 C4.562 F240.0092 +X-4.708 Y-19.398 Z-6.855 C3.244 F291.4717 +X-2.694 Y-19.508 Z-6.943 C1.679 F231.824 +X-0.34 Y-19.568 Z-7.04 C0.016 F202.7256 +X1.716 Y-19.567 Z-7.122 A-75.0 C-1.304 F236.3394 +X4.177 Y-19.505 Z-7.218 A-74.999 C-2.739 F200.3446 +X6.45 Y-19.395 Z-7.302 C-3.923 F220.1145 +X8.969 Y-19.219 Z-7.388 C-5.094 F200.967 +X11.081 Y-19.032 Z-7.458 C-5.973 F242.1594 +X11.088 Y-19.031 Z-7.459 C-5.976 F78141.9126 +X14.161 Y-18.706 Z-7.557 A-75.0 C-7.095 F167.8722 +X17.009 Y-18.352 Z-7.644 A-74.999 C-7.97 F183.4418 +X20.007 Y-17.935 Z-7.731 A-75.0 C-8.735 F176.4276 +X23.297 Y-17.434 Z-7.824 C-9.403 F163.0077 +X25.081 Y-17.146 Z-7.874 C-9.687 F305.5378 +X25.089 Y-17.145 C-9.688 F72101.8178 +X27.578 Y-16.731 Z-7.941 C-10.003 F221.7181 +X27.584 Y-16.73 Z-7.942 F84684.4643 +X30.286 Y-16.268 Z-8.014 C-10.223 F208.4944 +X30.294 Y-16.267 C-10.224 F79538.8213 +X33.398 Y-15.726 Z-8.097 C-10.358 F185.1401 +X33.937 Y-15.628 Z-8.109 C-11.091 F578.7385 +X34.241 Y-15.568 Z-8.116 C-12.013 F646.305 +X34.477 Y-15.517 Z-8.12 A-74.999 C-13.02 F651.2559 +X34.798 Y-15.438 Z-8.123 A-75.0 C-14.992 F359.455 +X34.97 Y-15.39 C-16.367 F538.2319 +X35.123 Y-15.344 Z-8.124 C-17.787 F530.5652 +X35.261 Y-15.298 Z-8.125 C-19.262 F518.7803 +X35.387 Y-15.252 Z-8.126 C-20.781 F510.1392 +X35.501 Y-15.207 C-22.342 F500.9868 +X35.608 Y-15.161 Z-8.127 C-23.944 F491.2967 +X35.76 Y-15.09 C-26.43 F317.9103 +X35.906 Y-15.013 Z-8.126 C-28.96 F312.6826 +X36.052 Y-14.928 Z-8.125 C-31.499 F310.2788 +X36.224 Y-14.817 Z-8.126 C-34.374 F271.7344 +X36.552 Y-14.569 Z-8.127 C-39.914 F139.7904 +X36.657 Y-14.478 Z-8.126 C-41.76 F418.3777 +X36.793 Y-14.351 C-44.152 F321.2767 +X36.929 Y-14.212 Z-8.124 C-46.531 F320.9285 +X37.081 Y-14.044 Z-8.121 C-49.145 F289.6916 +X37.176 Y-13.93 Z-8.119 C-50.756 F466.542 +X37.27 Y-13.811 Z-8.117 C-52.339 F472.0897 +X37.363 Y-13.686 Z-8.115 C-53.894 F477.4384 +X37.455 Y-13.555 Z-8.113 C-55.423 F482.5865 +X37.589 Y-13.351 Z-8.108 C-57.601 F335.4037 +X37.722 Y-13.129 Z-8.103 C-59.736 F338.0641 +X37.855 Y-12.887 Z-8.095 C-61.825 F340.8092 +X37.987 Y-12.625 Z-8.086 A-74.999 C-63.863 F344.0682 +X38.117 Y-12.339 Z-8.075 C-65.843 F347.9037 +X38.247 Y-12.028 Z-8.061 C-67.762 F352.3241 +X38.373 Y-11.691 Z-8.044 A-75.0 C-69.613 F357.3551 +X38.496 Y-11.327 Z-8.025 C-71.394 F363.0153 +X38.616 Y-10.935 Z-8.004 C-73.099 F369.3103 +X38.73 Y-10.515 Z-7.979 C-74.725 F376.2405 +X38.834 Y-10.084 Z-7.954 C-76.208 F400.3268 +X38.901 Y-9.779 Z-7.935 C-77.163 F605.0677 +X38.967 Y-9.454 Z-7.915 C-78.107 F598.6443 +X39.062 Y-8.925 Z-7.88 A-74.999 C-79.489 F394.9278 +X39.15 Y-8.357 Z-7.841 C-80.783 F401.8132 +X39.23 Y-7.753 Z-7.798 C-81.975 F412.7602 +X39.301 Y-7.115 Z-7.75 A-75.0 C-83.062 F424.7376 +X39.363 Y-6.445 Z-7.7 C-84.044 F439.1416 +X39.411 Y-5.808 Z-7.651 C-84.852 F496.7039 +X39.439 Y-5.388 Z-7.615 F1419.3661 +G94 +G00 Z-6.321 +X44.25 Y-5.821 +Z5.0 +(A0.) +A-75.0 C33.636 +X-32.508 Y-14.734 +Z3.0 +G93 +G01 Z-3.879 F43.6112 +X-29.833 Y-10.713 Z-5.173 F60.0 +X-31.523 Y-9.555 C35.141 F205.2094 +X-33.178 Y-8.362 C36.405 F214.0752 +X-34.818 Y-7.128 C37.447 F221.8038 +X-36.446 Y-5.861 C38.283 F230.2922 +X-38.274 Y-4.399 A-74.999 C38.996 F212.5441 +X-40.091 Y-2.915 C39.485 F223.0257 +X-41.192 Y-2.004 C39.682 F381.7118 +X-41.685 Y-2.006 Z-6.356 A-75.0 C39.723 F457.7142 +X-39.572 Y-3.751 A-74.999 C39.317 F198.4183 +X-37.756 Y-5.223 C38.744 F220.4338 +X-35.929 Y-6.669 C37.942 F210.7372 +X-34.386 Y-7.854 Z-6.355 C37.071 F241.0763 +X-32.831 Y-9.008 A-75.0 C36.023 F233.6614 +X-31.076 Y-10.252 Z-6.356 C34.607 F201.7165 +X-29.327 Y-11.424 C32.968 F198.4627 +X-27.938 Y-12.299 C31.499 F245.8469 +X-26.54 Y-13.131 Z-6.355 C29.879 F241.681 +X-25.13 Y-13.911 Z-6.353 C28.117 F238.4846 +X-23.517 Y-14.734 Z-6.355 C25.915 F206.4954 +X-21.905 Y-15.478 Z-6.356 C23.546 F205.8788 +X-20.274 Y-16.148 C21.06 F205.3838 +X-18.611 Y-16.746 Z-6.355 C18.598 F208.5799 +X-16.913 Y-17.279 C16.231 F213.3269 +X-15.123 Y-17.76 Z-6.356 C13.896 F211.4096 +X-14.396 Y-17.934 C12.995 F534.7924 +G94 +G00 Z5.0 +Y-20 +C-6.898 +X19.203 Y-20 +Z3.0 +G93 +G01 X13.583 Y-18.772 Z-7.538 F7.3683 +X11.093 Y-19.053 C-5.977 F208.3118 +X8.604 Y-19.291 C-4.932 F206.1827 +X5.936 Y-19.492 A-74.999 C-3.663 F190.1235 +X3.284 Y-19.629 C-2.234 F188.2511 +X0.974 Y-19.692 A-75.0 C-0.844 F212.6307 +X-1.326 Y-19.695 C0.691 F209.32 +X-3.535 Y-19.638 C2.316 F213.1496 +X-5.73 Y-19.516 C4.089 F209.1129 +X-7.815 Y-19.334 C5.929 F213.9369 +X-9.941 Y-19.075 Z-7.539 C7.98 F202.8802 +X-11.685 Y-18.802 C9.804 F239.1094 +X-13.342 Y-18.489 Z-7.538 C11.661 F243.4332 +X-14.976 Y-18.122 Z-7.537 C13.615 F238.3678 +X-16.586 Y-17.702 C15.661 F233.4122 +X-18.021 Y-17.273 Z-7.538 C17.611 F251.4655 +X-19.429 Y-16.799 Z-7.539 C19.652 F245.9507 +X-21.176 Y-16.13 Z-7.538 C22.273 F191.3954 +X-22.799 Y-15.424 Z-7.537 C24.676 F202.2516 +X-24.411 Y-14.644 Z-7.538 C26.942 F203.1084 +X-26.003 Y-13.798 C29.028 F206.3128 +X-27.615 Y-12.866 C30.953 F205.8612 +X-29.244 Y-11.854 C32.707 F206.3186 +X-30.964 Y-10.714 C34.35 F198.4035 +X-32.706 Y-9.49 C35.789 F199.8529 +X-34.474 Y-8.185 A-74.999 C37.01 F202.378 +X-36.327 Y-6.76 C38.041 F199.2237 +X-38.26 Y-5.225 C38.855 F198.5385 +X-40.278 Y-3.581 C39.438 F198.7734 +X-42.179 Y-2.008 A-75.0 C39.759 F221.8151 +G94 +G00 Z-6.244 +X-45.268 Y-5.721 +Z5.0 +A0. +A-5.545 C205.605 +X-38.238 Y-4.52 +Z3.977 +X-38.279 Y-4.606 +Z3.0 +G93 +G01 X-38.446 Y-4.956 Z-1.0 F74.6491 +X-35.486 Y-2.406 Z-1.347 F152.9543 +X-32.897 Y-0.251 Z-1.645 F177.4494 +X-30.802 Y1.417 Z-1.879 F223.1905 +X-28.947 Y2.82 Z-2.079 F257.0682 +X-27.436 Y3.902 Z-2.237 F321.5996 +X-25.892 Y4.942 Z-2.393 F321.1755 +X-24.308 Y5.934 Z-2.546 F320.0125 +X-23.095 Y6.639 Z-2.659 F426.1099 +X-21.857 Y7.308 Z-2.77 C205.606 F425.2881 +X-20.595 Y7.936 Z-2.878 F424.1475 +X-19.306 Y8.52 Z-2.983 F423.0305 +X-18.433 Y8.884 Z-3.051 F632.6563 +X-17.55 Y9.226 Z-3.118 F631.5498 +X-16.205 Y9.699 Z-3.216 F420.0529 +X-14.84 Y10.121 Z-3.31 F418.8696 +X-13.274 Y10.539 Z-3.413 F369.4575 +X-12.319 Y10.762 Z-3.472 F610.8156 +X-10.929 Y11.049 Z-3.556 F421.988 +X-9.063 Y11.37 Z-3.662 F316.3566 +X-7.185 Y11.624 Z-3.763 F316.2414 +X-6.884 Y11.659 Z-3.779 F1974.1809 +X-6.877 F80937.4994 +X-5.772 Y11.773 Z-3.835 C205.607 F539.5825 +X-3.882 Y11.919 Z-3.928 F316.1178 +X-1.785 Y12.018 Z-4.024 F285.492 +X0.215 Y12.056 Z-4.111 F299.7148 +X2.585 Y12.037 Z-4.209 F252.9507 +X5.214 Y11.947 Z-4.312 F227.9148 +X6.223 Y11.894 Z-4.349 F593.4067 +X6.23 Y11.893 Z-4.35 F80810.615 +X9.008 Y11.701 Z-4.449 F215.3559 +X12.082 Y11.415 Z-4.553 F194.2249 +X14.678 Y11.123 Z-4.637 F229.6195 +X18.207 Y10.663 Z-4.744 F168.4914 +X18.405 Y10.635 Z-4.75 F2994.8533 +X18.413 Y10.634 F80856.7982 +X21.661 Y10.155 Z-4.845 F182.6715 +X21.668 Y10.154 F80931.518 +X24.653 Y9.679 Z-4.929 F198.4514 +X24.66 Y9.678 F81004.2725 +X26.384 Y9.392 Z-4.976 F343.2213 +X26.391 Y9.39 F81034.5562 +X26.559 Y9.362 Z-4.981 F3523.4578 +X26.566 Y9.361 F81049.9485 +X28.267 Y9.072 Z-5.027 F347.7632 +X28.274 Y9.071 F81053.3655 +X28.74 Y8.991 Z-5.04 F1267.2415 +X28.748 Y8.99 F80979.4797 +X33.53 Y8.153 Z-5.167 F123.5382 +X34.152 Y8.002 Z-5.18 C205.608 F937.8168 +X34.288 Y7.908 Z-5.178 C205.61 F3581.3821 +X34.478 Y7.653 Z-5.164 F1889.8763 +X34.828 Y6.939 Z-5.116 C205.611 F752.401 +X35.09 Y6.154 Z-5.058 F723.4097 +X35.215 Y5.671 Z-5.021 F1199.4981 +X35.323 Y5.171 Z-4.982 F1168.9283 +X35.452 Y4.442 Z-4.923 F807.7564 +X35.579 Y3.505 Z-4.847 F632.4613 +X35.703 Y2.191 Z-4.737 F453.0358 +X35.76 Y1.371 Z-4.667 F727.0279 +X36.26 Y1.4 Z-4.723 A-11.048 C240.498 F25.8226 +X36.749 Y1.423 Z-4.841 A-17.818 C250.903 F76.8969 +X36.719 Y1.865 Z-4.878 A-17.819 C250.901 F1345.97 +X36.64 Y2.844 Z-4.961 A-17.893 C249.779 F350.2036 +X36.581 Y3.426 Z-5.009 A-17.947 C248.964 F538.9295 +X36.439 Y4.483 Z-5.094 A-18.069 C247.089 F263.486 +X36.33 Y5.111 Z-5.143 A-18.159 C245.664 F386.1601 +X36.219 Y5.657 Z-5.186 A-18.248 C244.183 F397.7446 +X36.07 Y6.269 Z-5.234 A-18.366 C242.149 F310.3206 +X35.906 Y6.822 Z-5.276 A-18.496 C239.799 F288.1807 +X35.725 Y7.312 Z-5.31 A-18.642 C237.049 F262.5177 +X35.578 Y7.643 Z-5.332 A-18.762 C234.62 F312.2341 +X35.441 Y7.912 Z-5.349 A-18.876 C232.118 F314.369 +X35.315 Y8.13 Z-5.363 A-18.985 C229.523 F312.7383 +X35.093 Y8.442 Z-5.38 A-19.179 C224.079 F154.7611 +X34.914 Y8.626 Z-5.387 A-19.33 C218.477 F156.3022 +X34.758 Y8.749 Z-5.39 A-19.436 C212.174 F142.696 +X34.631 Y8.823 Z-5.396 A-19.473 C206.645 F164.8108 +X34.528 Y8.87 A-19.464 C202.386 F214.7329 +X34.255 Y8.957 Z-5.389 A-19.425 C198.14 F203.5677 +X34.036 Y9.014 Z-5.384 A-19.402 C196.519 F484.6195 +X33.62 Y9.102 Z-5.374 A-19.376 C194.982 F436.0172 +X33.32 Y9.159 Z-5.366 A-19.365 C194.45 F950.0847 +X33.029 Y9.21 Z-5.359 A-19.361 C194.238 F1410.0097 +X33.014 Y9.213 Z-5.358 C194.232 F32607.1321 +X29.486 Y9.828 Z-5.264 A-19.358 C194.099 F164.0871 +X29.479 Y9.829 Z-5.263 F79525.0226 +X25.55 Y10.493 Z-5.158 A-19.353 C193.813 F145.3802 +X25.542 Y10.495 F77957.4673 +X24.089 Y10.732 Z-5.118 A-19.35 C193.654 F387.5176 +X24.082 Y10.733 C193.653 F77696.9582 +X21.469 Y11.144 Z-5.045 A-19.342 C193.3 F214.3086 +X21.462 Y11.145 C193.299 F77275.9644 +X18.841 Y11.532 Z-4.969 A-19.332 C192.858 F212.3032 +X18.834 Y11.533 Z-4.968 C192.856 F80517.4355 +X16.198 Y11.89 Z-4.889 A-19.321 C192.32 F209.9905 +X16.191 Y11.891 C192.319 F76437.4862 +X14.011 Y12.158 Z-4.82 A-19.309 C191.799 F252.7908 +X14.004 Y12.159 C191.797 F76387.8551 +X12.248 Y12.354 Z-4.764 A-19.297 C191.327 F312.8073 +X12.241 Y12.355 C191.325 F76513.3606 +X10.483 Y12.529 Z-4.705 A-19.283 C190.806 F311.7151 +X10.476 Y12.53 C190.804 F76496.3759 +X9.591 Y12.609 Z-4.674 A-19.276 C190.524 F617.9886 +X9.584 Y12.61 C190.521 F76558.2889 +X7.457 Y12.775 Z-4.598 A-19.256 C189.793 F256.879 +X6.266 Y12.85 Z-4.555 A-19.244 C189.349 F456.6689 +X6.259 A-19.243 C189.346 F76654.7593 +X4.929 Y12.918 Z-4.505 A-19.229 C188.819 F408.3834 +X4.922 C188.816 F76717.6753 +X3.591 Y12.968 Z-4.453 A-19.213 C188.252 F406.4194 +X3.584 C188.249 F73751.0904 +X2.257 Y12.999 Z-4.4 A-19.196 C187.649 F406.003 +X2.25 Y13.0 Z-4.399 A-19.195 C187.645 F76310.7528 +X-0.265 Y13.007 Z-4.295 A-19.157 C186.394 F212.3122 +X-1.77 Y12.974 Z-4.231 A-19.129 C185.571 F350.7215 +X-1.777 C185.567 F75706.4915 +X-3.109 Y12.921 Z-4.171 A-19.102 C184.787 F392.0598 +X-3.116 Y12.92 Z-4.17 C184.783 F75136.9818 +X-4.936 Y12.807 Z-4.083 A-19.06 C183.636 F282.9445 +X-6.249 Y12.692 Z-4.018 A-19.026 C182.743 F385.7236 +X-7.14 Y12.597 Z-3.975 A-19.0 C182.106 F561.5247 +X-7.147 Z-3.974 C182.101 F73265.626 +X-8.473 Y12.429 Z-3.904 A-18.96 C181.099 F371.4498 +X-8.48 Y12.428 C181.093 F72572.4249 +X-9.794 Y12.228 Z-3.83 A-18.916 C180.032 F366.8757 +X-9.801 Y12.226 C180.026 F71614.2905 +X-11.112 Y11.989 Z-3.753 A-18.868 C178.895 F359.6814 +X-11.121 Y11.987 Z-3.752 C178.886 F48500.9919 +X-12.415 Y11.72 Z-3.674 A-18.816 C177.697 F355.5183 +X-12.428 Y11.717 A-18.815 C177.685 F35718.8712 +X-13.716 Y11.417 Z-3.594 A-18.756 C176.425 F347.9655 +X-13.728 Y11.414 Z-3.593 A-18.755 C176.412 F35916.8385 +X-15.011 Y11.077 Z-3.512 A-18.689 C175.077 F339.6205 +X-15.023 Y11.074 Z-3.511 C175.064 F35178.0441 +X-16.302 Y10.695 Z-3.426 A-18.615 C173.646 F329.8279 +X-16.314 Y10.691 Z-3.425 C173.632 F34081.8409 +X-17.417 Y10.326 Z-3.346 A-18.546 C172.339 F370.6739 +X-18.179 Y10.049 Z-3.29 A-18.496 C171.409 F523.3589 +X-19.303 Y9.604 Z-3.204 A-18.417 C169.991 F345.4496 +X-20.158 Y9.233 Z-3.135 A-18.355 C168.886 F442.987 +X-21.616 Y8.538 Z-3.012 A-18.246 C167.001 F253.196 +X-22.51 Y8.076 Z-2.935 A-18.18 C165.893 F410.0931 +X-22.516 Y8.073 A-18.179 C165.886 F64672.1216 +X-23.714 Y7.424 Z-2.829 A-18.094 C164.53 F308.3987 +X-23.719 Y7.422 A-18.093 C164.525 F76074.285 +X-24.894 Y6.741 Z-2.722 A-18.013 C163.286 F313.5523 +X-24.9 Y6.737 Z-2.721 C163.28 F63021.921 +X-26.042 Y6.031 Z-2.612 A-17.939 C162.152 F320.8878 +X-26.048 Y6.027 C162.146 F63570.5597 +X-27.165 Y5.296 Z-2.501 A-17.872 C161.123 F327.5309 +X-27.171 Y5.292 A-17.871 C161.117 F63763.9211 +X-28.267 Y4.539 Z-2.389 A-17.81 C160.193 F333.9356 +X-28.273 Y4.535 Z-2.388 A-17.809 C160.188 F64543.6067 +X-29.347 Y3.765 Z-2.276 A-17.754 C159.362 F342.0457 +X-29.353 Y3.76 Z-2.275 C159.358 F64984.3912 +X-30.414 Y2.971 Z-2.161 A-17.703 C158.62 F348.3829 +X-30.42 Y2.967 C158.616 F66086.3141 +X-31.049 Y2.487 Z-2.091 A-17.676 C158.216 F591.9057 +X-31.055 Y2.482 A-17.675 C158.213 F65598.9339 +X-32.509 Y1.343 Z-1.929 A-17.618 C157.394 F258.3936 +X-32.515 Y1.338 Z-1.928 C157.391 F66892.0269 +X-33.535 Y0.516 Z-1.813 A-17.584 C156.903 F374.6835 +X-33.54 Y0.512 A-17.583 C156.901 F68661.5347 +X-35.565 Y-1.166 Z-1.581 A-17.528 C156.134 F192.4322 +X-35.57 Y-1.171 C156.132 F70823.675 +X-37.85 Y-3.116 Z-1.316 A-17.488 C155.57 F177.3676 +X-39.113 Y-4.213 Z-1.17 A-17.475 C155.384 F331.8296 +X-39.222 Y-4.098 Z-1.223 A-19.863 C153.22 F328.3129 +X-39.224 Y-4.096 Z-1.224 A-19.891 C153.198 F31769.3374 +X-39.431 Y-3.877 Z-1.339 A-24.517 C150.206 F220.2944 +X-39.598 Y-3.7 Z-1.457 A-28.286 C148.47 F345.4016 +X-39.748 Y-3.54 Z-1.58 A-31.66 C147.247 F450.9061 +X-37.682 Y-1.75 Z-1.822 A-31.68 C147.649 F199.3368 +X-37.672 Y-1.741 Z-1.823 C147.652 F37860.9518 +X-36.22 Y-0.507 Z-1.99 A-31.703 C148.095 F273.6072 +X-36.21 Y-0.498 Z-1.991 C148.099 F37052.3751 +X-34.212 Y1.156 Z-2.218 A-31.747 C148.945 F192.8209 +X-34.164 Y1.194 Z-2.223 A-31.749 C148.968 F7957.3479 +X-34.159 Y1.199 Z-2.224 C148.971 F71607.7233 +X-33.119 Y2.036 Z-2.34 A-31.778 C149.529 F360.2722 +X-33.113 Y2.04 Z-2.341 C149.532 F70356.5285 +X-31.437 Y3.345 Z-2.528 A-31.832 C150.602 F219.8655 +X-31.431 Y3.349 C150.606 F69488.4715 +X-30.985 Y3.687 Z-2.577 A-31.848 C150.928 F811.2782 +X-30.979 Y3.691 Z-2.578 C150.932 F68221.6548 +X-29.906 Y4.487 Z-2.692 A-31.89 C151.77 F335.3622 +X-29.901 Y4.49 Z-2.693 C151.774 F67520.1716 +X-28.809 Y5.271 Z-2.806 A-31.936 C152.72 F326.5762 +X-28.804 Y5.275 Z-2.807 A-31.937 C152.724 F67227.7581 +X-27.696 Y6.035 Z-2.919 A-31.988 C153.779 F319.437 +X-27.69 Y6.038 Z-2.92 C153.784 F66505.7084 +X-26.561 Y6.777 Z-3.031 A-32.044 C154.957 F311.6913 +X-26.555 Y6.78 C154.962 F65726.5876 +X-25.395 Y7.497 Z-3.14 A-32.106 C156.264 F302.9554 +X-25.388 Y7.502 Z-3.141 C156.272 F50555.1678 +X-24.211 Y8.189 Z-3.249 A-32.172 C157.691 F298.3106 +X-24.2 Y8.195 Z-3.25 A-32.173 C157.704 F33450.4194 +X-23.003 Y8.85 Z-3.357 A-32.242 C159.247 F294.1183 +X-22.993 Y8.855 Z-3.358 A-32.243 C159.261 F33297.1058 +X-22.015 Y9.355 Z-3.44 A-32.302 C160.589 F361.7046 +X-20.644 Y9.998 Z-3.551 A-32.385 C162.531 F261.8103 +X-19.433 Y10.509 Z-3.643 A-32.458 C164.292 F302.6164 +X-19.422 Y10.514 Z-3.644 A-32.459 C164.308 F33472.871 +X-18.448 Y10.893 Z-3.71 A-32.516 C165.717 F385.716 +X-17.724 Y11.154 Z-3.763 A-32.555 C166.725 F534.2567 +X-16.607 Y11.523 Z-3.847 A-32.612 C168.212 F359.7356 +X-16.601 Y11.525 C168.22 F69906.5559 +X-15.294 Y11.919 Z-3.936 A-32.673 C169.865 F321.0738 +X-15.288 Y11.92 C169.872 F71764.9384 +X-13.974 Y12.272 Z-4.021 A-32.729 C171.429 F333.1557 +X-13.967 Y12.273 Z-4.022 C171.436 F73199.5341 +X-12.642 Y12.584 Z-4.104 A-32.78 C172.911 F344.3091 +X-12.636 Y12.586 C172.918 F75190.8617 +X-11.31 Y12.857 Z-4.183 A-32.825 C174.305 F357.3009 +X-11.297 Y12.86 Z-4.184 A-32.826 C174.318 F38470.7965 +X-9.969 Y13.094 Z-4.259 A-32.867 C175.625 F369.3867 +X-9.956 Y13.096 Z-4.26 A-32.868 C175.637 F39071.3422 +X-8.613 Y13.297 Z-4.333 A-32.905 C176.878 F377.4746 +X-8.6 Y13.299 Z-4.334 A-32.906 C176.889 F39841.538 +X-7.264 Y13.465 Z-4.403 A-32.94 C178.048 F390.8909 +X-7.251 Y13.467 Z-4.404 C178.059 F40704.7077 +X-5.743 Y13.618 Z-4.478 A-32.975 C179.285 F356.12 +X-4.316 Y13.727 Z-4.546 A-33.004 C180.369 F385.691 +X-3.189 Y13.792 Z-4.599 A-33.025 C181.175 F496.763 +X-3.176 C181.185 F42222.294 +X-1.827 Y13.846 Z-4.659 A-33.048 C182.096 F421.471 +X-1.814 Y13.847 Z-4.66 A-33.049 C182.105 F42338.6191 +X0.188 Y13.883 Z-4.745 A-33.079 C183.356 F287.4528 +X0.198 C183.362 F60477.9516 +X2.243 Y13.873 Z-4.826 A-33.106 C184.525 F281.4668 +X2.256 C184.532 F41925.4396 +X3.593 Y13.84 Z-4.879 A-33.122 C185.233 F428.8698 +X3.607 Z-4.88 C185.24 F41773.4261 +X4.941 Y13.789 Z-4.931 A-33.136 C185.897 F426.8853 +X4.955 Y13.788 C185.904 F41594.8871 +X6.294 Y13.72 Z-4.982 A-33.149 C186.521 F422.8033 +X6.308 Y13.719 C186.527 F41006.8996 +X7.63 Y13.636 Z-5.031 A-33.16 C187.098 F426.1075 +X7.641 Y13.635 A-33.161 C187.102 F50438.892 +X9.97 Y13.45 Z-5.117 A-33.178 C188.02 F239.3913 +X9.976 C188.022 F80619.563 +X10.538 Y13.398 Z-5.137 A-33.182 C188.227 F992.7795 +X10.545 Y13.397 C188.23 F80591.7884 +X12.32 Y13.221 Z-5.195 A-33.193 C188.839 F312.3849 +X12.327 Y13.22 Z-5.196 C188.842 F79799.3454 +X14.095 Y13.024 Z-5.252 A-33.203 C189.392 F312.6215 +X14.102 Y13.023 C189.395 F79298.05 +X16.296 Y12.751 Z-5.32 A-33.214 C190.004 F251.0614 +X16.303 C190.006 F78799.9187 +X18.943 Y12.392 Z-5.399 A-33.224 C190.635 F208.5635 +X18.95 Y12.391 C190.636 F78562.9533 +X21.576 Y12.005 Z-5.476 A-33.232 C191.153 F210.2896 +X21.583 Y12.004 C191.155 F78220.9395 +X24.181 Y11.595 Z-5.549 A-33.239 C191.569 F213.6446 +X24.188 Y11.594 C191.57 F78389.0336 +X25.095 Y11.447 Z-5.573 A-33.241 C191.691 F616.8974 +X25.102 Y11.446 C191.692 F78511.2594 +X29.36 Y10.732 Z-5.686 A-33.247 C192.09 F132.6062 +X29.372 Y10.73 C192.091 F45639.4927 +X33.215 Y10.059 Z-5.789 A-33.249 C192.27 F149.7575 +X33.28 Y10.047 Z-5.792 C192.309 F6733.4799 +X33.29 Y10.045 A-33.25 C192.316 F40639.1055 +X33.6 Y9.989 Z-5.8 A-33.255 C192.719 F1084.4342 +X34.181 Y9.87 Z-5.813 A-33.28 C194.705 F335.797 +X34.479 Y9.794 Z-5.818 A-33.305 C196.834 F375.6675 +X34.684 Y9.733 Z-5.821 A-33.323 C199.12 F374.102 +X34.817 Y9.686 Z-5.822 A-33.336 C201.409 F390.2963 +X34.911 Y9.647 A-33.344 C203.698 F399.7295 +X35.028 Y9.592 A-33.345 C206.828 F293.2512 +X35.144 Y9.529 A-33.335 C210.075 F281.7351 +X35.254 Y9.457 Z-5.82 A-33.313 C213.324 F280.381 +X35.345 Y9.389 Z-5.817 A-33.285 C216.038 F333.5277 +X35.439 Y9.314 Z-5.816 A-33.252 C218.675 F340.1926 +X35.535 Y9.231 Z-5.814 A-33.213 C221.24 F346.2377 +X35.633 Y9.138 Z-5.813 A-33.169 C223.735 F351.6621 +X35.796 Y8.96 Z-5.809 A-33.086 C227.609 F222.2676 +X35.965 Y8.74 Z-5.802 A-32.991 C231.333 F225.3839 +X36.139 Y8.471 Z-5.788 A-32.889 C234.879 F229.6868 +X36.315 Y8.148 Z-5.768 A-32.782 C238.214 F235.9254 +X36.491 Y7.768 Z-5.743 A-32.675 C241.311 F244.379 +X36.664 Y7.33 Z-5.713 A-32.57 C244.151 F255.1639 +X36.831 Y6.834 Z-5.679 A-32.469 C246.725 F268.3068 +X36.955 Y6.416 Z-5.65 A-32.395 C248.517 F367.6158 +X37.093 Y5.889 Z-5.61 A-32.311 C250.434 F328.1261 +X37.231 Y5.242 Z-5.562 A-32.224 C252.381 F305.1291 +X37.349 Y4.556 Z-5.51 A-32.146 C254.073 F327.7726 +X37.45 Y3.815 Z-5.455 A-32.076 C255.572 F342.5201 +X37.555 Y2.855 Z-5.375 A-32.003 C257.128 F298.9628 +X37.636 Y1.886 Z-5.292 A-31.943 C258.358 F334.2934 +X37.665 Y1.449 Z-5.255 F1365.7334 +X38.078 Y1.452 Z-5.544 A-39.086 C260.177 F245.8804 +X38.45 Y1.449 Z-5.883 A-46.25 C261.509 F277.9297 +X38.42 Y1.891 Z-5.92 C261.506 F1344.891 +X38.376 Y2.443 Z-5.967 A-46.272 C260.82 F588.4048 +X38.328 Y2.952 Z-6.01 A-46.293 C260.106 F603.6486 +X38.274 Y3.472 Z-6.051 A-46.318 C259.282 F556.4813 +X38.198 Y4.083 Z-6.099 A-46.351 C258.165 F438.941 +X38.117 Y4.658 Z-6.14 A-46.388 C256.942 F428.2726 +X38.064 Y4.984 Z-6.163 A-46.412 C256.161 F703.0869 +X37.964 Y5.513 Z-6.201 A-46.455 C254.734 F402.2414 +X37.838 Y6.082 Z-6.242 A-46.505 C252.959 F340.0717 +X37.766 Y6.364 Z-6.264 A-46.532 C251.964 F629.8855 +X37.622 Y6.882 Z-6.299 A-46.587 C249.885 F312.9834 +X37.487 Y7.308 Z-6.328 A-46.638 C247.878 F338.1065 +X37.346 Y7.695 Z-6.352 A-46.691 C245.743 F329.0695 +X37.2 Y8.047 Z-6.372 A-46.745 C243.469 F318.9478 +X37.051 Y8.365 Z-6.389 A-46.799 C241.061 F309.5444 +X36.9 Y8.65 Z-6.403 A-46.853 C238.523 F300.8907 +X36.748 Y8.905 Z-6.413 A-46.905 C235.861 F293.0452 +X36.596 Y9.131 Z-6.421 A-46.955 C233.083 F286.0516 +X36.411 Y9.375 Z-6.43 A-47.014 C229.507 F226.0972 +X36.315 Y9.493 Z-6.432 A-47.043 C227.545 F417.3967 +X36.22 Y9.597 Z-6.436 A-47.069 C225.586 F421.1565 +X36.127 Y9.691 Z-6.44 A-47.093 C223.629 F424.5073 +X36.037 Y9.779 Z-6.441 A-47.115 C221.673 F427.395 +X35.896 Y9.899 Z-6.443 A-47.144 C218.588 F272.9874 +X35.756 Y10.007 Z-6.444 A-47.167 C215.463 F271.3153 +X35.605 Y10.11 Z-6.445 A-47.185 C212.112 F254.622 +X35.445 Y10.204 Z-6.446 A-47.195 C208.646 F247.2172 +X35.273 Y10.29 Z-6.445 A-47.198 C205.068 F240.4354 +X35.188 Y10.329 A-47.197 C203.28 F482.8776 +X35.098 Y10.367 Z-6.446 A-47.193 C201.55 F496.9245 +X34.995 Y10.405 Z-6.445 A-47.187 C199.878 F508.8672 +X34.748 Y10.484 Z-6.442 A-47.174 C196.972 F284.6292 +X34.586 Y10.528 Z-6.439 A-47.166 C195.629 F588.6068 +X34.389 Y10.578 Z-6.436 A-47.157 C194.341 F591.1108 +X34.297 Y10.6 Z-6.435 A-47.153 C193.831 F1445.9415 +X34.076 Y10.649 Z-6.432 A-47.145 C192.831 F704.0402 +X33.718 Y10.719 Z-6.423 A-47.137 C191.848 F615.9399 +X33.341 Y10.787 Z-6.414 A-47.132 C191.385 F899.1196 +X33.333 Y10.789 C191.38 F52157.8257 +X32.664 Y10.904 Z-6.391 C191.309 F831.6365 +X29.55 Y11.45 Z-6.314 A-47.13 C191.184 F185.6055 +X29.543 Y11.452 Z-6.313 F79464.9457 +X25.667 Y12.107 Z-6.215 A-47.126 C190.817 F145.8358 +X25.66 Y12.109 C190.816 F78629.9406 +X24.267 Y12.334 Z-6.177 A-47.125 C190.627 F399.359 +X24.26 Y12.336 C190.626 F78530.272 +X21.641 Y12.745 Z-6.101 A-47.121 C190.185 F210.8204 +X21.634 Y12.746 C190.184 F78431.0671 +X19.01 Y13.129 Z-6.023 A-47.117 C189.631 F208.6147 +X19.003 Y13.13 C189.629 F78508.9813 +X16.363 Y13.486 Z-5.941 A-47.11 C188.957 F205.848 +X16.357 Y13.487 C188.955 F78751.4785 +X14.17 Y13.755 Z-5.871 A-47.103 C188.308 F247.161 +X14.164 Y13.756 C188.306 F79268.3542 +X12.385 Y13.953 Z-5.814 A-47.096 C187.717 F302.6052 +X12.378 Y13.954 C187.715 F79180.9484 +X9.729 Y14.21 Z-5.726 A-47.083 C186.727 F202.7035 +X9.722 Y14.211 Z-5.725 C186.725 F79614.7011 +X7.683 Y14.374 Z-5.654 A-47.072 C185.87 F262.1036 +X7.676 Y14.375 C185.867 F80442.208 +X6.327 Y14.463 Z-5.607 A-47.063 C185.253 F394.5942 +X6.32 C185.25 F80494.559 +X4.961 Y14.535 Z-5.559 A-47.054 C184.591 F390.4014 +X4.954 C184.587 F81053.6061 +X3.603 Y14.589 Z-5.509 A-47.044 C183.888 F391.1432 +X3.596 C183.884 F81245.8802 +X2.232 Y14.624 Z-5.456 A-47.033 C183.131 F385.5544 +X2.225 C183.127 F81190.2958 +X0.374 Y14.633 Z-5.382 A-47.018 C182.024 F282.1354 +X0.367 C182.02 F81510.3115 +X-1.872 Y14.589 Z-5.283 A-46.997 C180.548 F230.2439 +X-1.885 Z-5.282 A-46.996 C180.54 F40794.4346 +X-3.255 Y14.532 Z-5.22 A-46.981 C179.565 F371.4512 +X-3.267 Y14.531 Z-5.219 C179.556 F40665.7363 +X-5.187 Y14.41 Z-5.129 A-46.956 C178.087 F260.9777 +X-7.122 Y14.231 Z-5.036 A-46.926 C176.474 F253.1432 +X-7.387 Y14.201 Z-5.024 A-46.922 C176.242 F1829.8458 +X-7.399 Y14.199 C176.232 F40358.7946 +X-8.767 Y14.03 Z-4.955 A-46.898 C174.988 F348.9808 +X-8.779 Y14.028 Z-4.954 A-46.897 C174.977 F39965.6829 +X-10.129 Y13.828 Z-4.884 A-46.871 C173.672 F346.1003 +X-10.14 Y13.826 Z-4.883 C173.66 F39944.3833 +X-11.497 Y13.588 Z-4.809 A-46.843 C172.265 F335.7864 +X-11.509 Y13.586 Z-4.808 A-46.842 C172.252 F39571.2974 +X-12.855 Y13.311 Z-4.731 A-46.811 C170.781 F329.3353 +X-12.866 Y13.309 Z-4.73 C170.768 F39012.7462 +X-14.2 Y12.996 Z-4.649 A-46.777 C169.219 F322.494 +X-14.211 Y12.993 Z-4.648 C169.206 F38414.8567 +X-15.549 Y12.636 Z-4.563 A-46.74 C167.558 F311.2568 +X-15.555 Y12.635 C167.551 F75583.6147 +X-16.888 Y12.233 Z-4.473 A-46.7 C165.813 F301.4608 +X-16.894 Y12.231 A-46.699 C165.806 F74275.9101 +X-17.978 Y11.875 Z-4.392 A-46.664 C164.324 F359.6812 +X-19.311 Y11.381 Z-4.297 A-46.616 C162.41 F281.5177 +X-20.857 Y10.741 Z-4.187 A-46.553 C160.071 F232.1128 +X-21.573 Y10.418 Z-4.133 A-46.523 C158.983 F491.7121 +X-22.897 Y9.773 Z-4.024 A-46.469 C157.081 F264.7184 +X-23.412 Y9.503 Z-3.982 A-46.449 C156.373 F679.965 +X-23.423 Y9.497 Z-3.981 C156.359 F33846.3569 +X-24.652 Y8.827 Z-3.875 A-46.403 C154.741 F283.3158 +X-24.657 Y8.825 Z-3.874 A-46.402 C154.734 F70485.8645 +X-25.86 Y8.124 Z-3.767 A-46.358 C153.243 F288.1737 +X-25.866 Y8.121 Z-3.766 C153.236 F66014.7517 +X-27.036 Y7.395 Z-3.657 A-46.317 C151.884 F295.8784 +X-27.041 Y7.392 Z-3.656 C151.878 F66115.6372 +X-28.188 Y6.641 Z-3.544 A-46.279 C150.653 F302.3619 +X-28.199 Y6.634 Z-3.543 C150.642 F33448.5965 +X-29.32 Y5.866 Z-3.431 A-46.245 C149.545 F311.0078 +X-29.33 Y5.859 Z-3.43 C149.536 F33878.5995 +X-30.43 Y5.073 Z-3.318 A-46.214 C148.557 F319.3324 +X-30.44 Y5.066 Z-3.316 C148.548 F33718.1214 +X-31.521 Y4.266 Z-3.204 A-46.186 C147.681 F328.1568 +X-31.526 Y4.262 Z-3.203 C147.678 F71991.5901 +X-32.141 Y3.797 Z-3.137 A-46.171 C147.225 F583.136 +X-32.146 Y3.793 Z-3.136 C147.222 F69511.8975 +X-33.648 Y2.623 Z-2.97 A-46.139 C146.24 F240.8845 +X-33.653 Y2.619 C146.236 F70024.5504 +X-34.699 Y1.778 Z-2.854 A-46.12 C145.655 F352.9132 +X-34.704 Y1.773 Z-2.853 C145.653 F70975.487 +X-35.736 Y0.926 Z-2.737 A-46.103 C145.16 F363.9172 +X-35.741 Y0.921 Z-2.736 C145.158 F71544.6133 +X-36.758 Y0.072 Z-2.62 A-46.09 C144.749 F376.512 +X-36.764 Y0.067 Z-2.619 C144.747 F72650.7532 +X-38.313 Y-1.252 Z-2.442 A-46.073 C144.262 F253.3219 +X-38.318 Y-1.256 Z-2.441 C144.261 F73973.1969 +X-40.311 Y-2.98 Z-2.208 A-46.061 C143.863 F205.0502 +X-40.554 Y-2.753 Z-2.591 A-53.286 C142.747 F337.7579 +X-40.765 Y-2.567 Z-3.013 A-60.521 C141.824 F360.5817 +X-38.974 Y-1.018 Z-3.223 A-60.525 C142.176 F229.1808 +X-38.964 Y-1.009 Z-3.224 C142.179 F38526.4788 +X-38.413 Y-0.537 Z-3.288 A-60.528 C142.329 F723.7095 +X-38.408 Y-0.532 Z-3.289 C142.33 F75892.983 +X-37.215 Y0.48 Z-3.425 A-60.534 C142.725 F328.2598 +X-37.21 Y0.485 Z-3.426 C142.726 F74903.9836 +X-36.184 Y1.342 Z-3.542 A-60.54 C143.145 F373.1418 +X-36.179 Y1.346 Z-3.543 C143.148 F74672.3865 +X-35.14 Y2.199 Z-3.659 A-60.549 C143.651 F361.1554 +X-35.135 Y2.204 Z-3.66 C143.654 F73739.827 +X-34.084 Y3.048 Z-3.775 A-60.558 C144.246 F351.0434 +X-34.08 Y3.052 Z-3.776 C144.249 F73822.4296 +X-32.892 Y3.982 Z-3.903 A-60.571 C145.022 F305.2698 +X-32.885 Y3.987 Z-3.904 C145.026 F55073.9812 +X-31.941 Y4.706 Z-4.004 A-60.581 C145.721 F378.2527 +X-31.931 Y4.714 Z-4.005 C145.729 F35840.2071 +X-30.847 Y5.517 Z-4.118 A-60.594 C146.615 F325.4342 +X-30.837 Y5.524 Z-4.119 C146.623 F35751.1146 +X-29.727 Y6.318 Z-4.233 A-60.609 C147.625 F314.7652 +X-29.717 Y6.325 Z-4.234 C147.635 F35625.7885 +X-28.581 Y7.104 Z-4.346 A-60.625 C148.761 F305.081 +X-28.571 Y7.11 Z-4.347 C148.771 F35578.8451 +X-27.419 Y7.862 Z-4.455 A-60.644 C150.017 F299.2281 +X-27.41 Y7.868 Z-4.456 C150.028 F36629.9515 +X-26.222 Y8.601 Z-4.561 A-60.664 C151.419 F289.317 +X-26.213 Y8.606 Z-4.562 C151.429 F41163.1041 +X-25.002 Y9.313 Z-4.669 A-60.685 C152.948 F283.7283 +X-24.993 Y9.319 Z-4.67 C152.96 F36797.3695 +X-23.849 Y9.947 Z-4.77 A-60.705 C154.489 F300.6448 +X-23.747 Y10.0 Z-4.779 A-60.707 C154.63 F3357.4396 +X-23.738 Y10.005 Z-4.78 C154.643 F37032.2406 +X-22.494 Y10.641 Z-4.882 A-60.73 C156.415 F277.586 +X-21.287 Y11.202 Z-4.976 A-60.754 C158.207 F289.5 +X-20.065 Y11.721 Z-5.064 A-60.777 C160.06 F291.1855 +X-18.814 Y12.2 Z-5.148 A-60.801 C161.94 F293.1804 +X-17.525 Y12.644 Z-5.231 A-60.823 C163.804 F295.6139 +X-17.144 Y12.763 Z-5.257 A-60.829 C164.333 F1024.7131 +X-17.133 Y12.766 C164.347 F37774.673 +X-16.068 Y13.094 Z-5.325 A-60.845 C165.768 F376.9428 +X-15.777 Y13.175 Z-5.345 A-60.849 C166.142 F1408.5743 +X-15.771 Y13.176 Z-5.346 C166.15 F68986.4301 +X-14.498 Y13.519 Z-5.425 A-60.866 C167.74 F330.1143 +X-14.412 Y13.54 Z-5.431 A-60.867 C167.844 F4940.6595 +X-14.401 Y13.543 Z-5.432 C167.857 F39518.9678 +X-13.11 Y13.848 Z-5.51 A-60.882 C169.379 F338.0827 +X-13.033 Y13.864 Z-5.515 A-60.883 C169.467 F5734.1616 +X-13.022 Y13.867 C169.48 F40134.0067 +X-11.693 Y14.14 Z-5.592 A-60.897 C170.956 F340.3672 +X-11.649 Y14.148 Z-5.595 A-60.898 C171.005 F10177.8471 +X-11.637 Y14.15 C171.017 F40705.6166 +X-10.273 Y14.391 Z-5.671 A-60.911 C172.446 F342.1541 +X-10.261 Y14.392 C172.458 F41239.1098 +X-8.884 Y14.599 Z-5.744 A-60.924 C173.818 F348.8913 +X-8.873 Y14.601 Z-5.745 C173.829 F41723.0662 +X-7.497 Y14.773 Z-5.815 A-60.935 C175.11 F358.1758 +X-7.485 Y14.774 C175.12 F42148.8992 +X-6.337 Y14.897 Z-5.869 A-60.944 C176.131 F437.9131 +X-4.801 Y15.023 Z-5.941 A-60.954 C177.409 F333.7601 +X-3.332 Y15.108 Z-6.009 A-60.963 C178.552 F355.1416 +X-3.319 Y15.109 C178.561 F42888.7846 +X-1.94 Y15.164 Z-6.069 A-60.971 C179.569 F383.1985 +X-1.928 Y15.165 C179.578 F42708.0329 +X-0.322 Y15.201 Z-6.135 A-60.98 C180.676 F332.6144 +X2.062 Y15.194 Z-6.23 A-60.99 C182.168 F225.8552 +X2.202 Y15.191 Z-6.236 A-60.991 C182.25 F3865.9296 +X2.215 Y15.19 C182.258 F42522.0492 +X3.573 Y15.157 Z-6.289 A-60.996 C183.033 F398.5801 +X3.586 Y15.156 C183.04 F42331.6224 +X4.943 Y15.104 Z-6.34 A-61.001 C183.766 F399.4642 +X4.956 Y15.103 C183.773 F41862.5904 +X6.309 Y15.034 Z-6.39 A-61.005 C184.452 F401.0002 +X6.322 Y15.033 C184.458 F41596.6946 +X7.674 Y14.947 Z-6.439 A-61.009 C185.095 F400.7972 +X7.687 Y14.946 C185.101 F41436.8109 +X9.221 Y14.829 Z-6.493 A-61.013 C185.774 F353.0696 +X9.234 Y14.828 C185.779 F40850.9293 +X10.603 Y14.707 Z-6.541 A-61.016 C186.337 F395.4485 +X10.617 Y14.706 Z-6.542 C186.343 F40607.166 +X12.401 Y14.53 Z-6.601 A-61.019 C187.014 F302.9033 +X12.415 Y14.529 C187.018 F40220.5475 +X14.196 Y14.332 Z-6.659 A-61.022 C187.627 F303.4928 +X14.202 C187.629 F87285.1144 +X16.413 Y14.058 Z-6.728 A-61.026 C188.302 F244.3968 +X16.42 Y14.057 C188.304 F79412.075 +X19.077 Y13.696 Z-6.805 A-61.03 C189.0 F203.8027 +X19.084 Y13.695 C189.002 F79203.788 +X21.726 Y13.305 Z-6.88 A-61.033 C189.576 F206.1617 +X21.732 Y13.304 C189.577 F79176.1261 +X24.39 Y12.887 Z-6.955 A-61.035 C190.036 F206.7829 +X24.398 Y12.886 C190.037 F69450.0197 +X26.61 Y12.523 Z-7.016 A-61.036 C190.34 F250.7484 +X26.617 Y12.522 C190.341 F88264.1161 +X29.692 Y12.0 Z-7.097 A-61.037 C190.615 F183.4786 +X29.7 Y11.999 C190.616 F75084.6118 +X32.915 Y11.44 Z-7.183 A-61.038 C190.75 F179.3849 +X32.923 Y11.439 Z-7.184 F69322.8421 +X33.198 Y11.391 Z-7.191 C190.757 F2115.0018 +X33.448 Y11.347 Z-7.197 C190.839 F1977.3334 +X33.802 Y11.282 Z-7.206 A-61.04 C191.305 F928.9593 +X34.172 Y11.21 Z-7.214 A-61.044 C192.329 F592.8677 +X34.407 Y11.159 Z-7.218 A-61.048 C193.365 F677.5084 +X34.614 Y11.107 Z-7.221 A-61.052 C194.548 F628.277 +X34.796 Y11.056 Z-7.224 A-61.057 C195.847 F595.9761 +X34.956 Y11.01 Z-7.227 A-61.061 C197.249 F570.0894 +X35.098 Y10.965 Z-7.229 A-61.064 C198.756 F543.2306 +X35.226 Y10.921 Z-7.23 A-61.067 C200.364 F518.3965 +X35.343 Y10.876 Z-7.231 A-61.069 C202.068 F495.2269 +X35.508 Y10.804 A-61.071 C204.849 F305.9622 +X35.662 Y10.726 Z-7.229 A-61.07 C207.71 F298.5051 +X35.81 Y10.643 Z-7.227 A-61.067 C210.537 F300.8498 +X35.963 Y10.547 Z-7.226 A-61.062 C213.385 F296.0914 +X36.231 Y10.361 A-61.047 C218.243 F171.4144 +X36.339 Y10.272 Z-7.225 A-61.039 C220.274 F407.8612 +X36.446 Y10.177 A-61.03 C222.304 F405.6932 +X36.586 Y10.043 Z-7.222 A-61.016 C224.929 F311.2162 +X36.725 Y9.894 Z-7.219 A-61.0 C227.534 F310.4867 +X36.885 Y9.706 Z-7.214 A-60.98 C230.433 F275.3065 +X37.044 Y9.498 Z-7.208 A-60.959 C233.246 F279.544 +X37.203 Y9.269 Z-7.202 A-60.937 C235.963 F284.6971 +X37.343 Y9.044 Z-7.195 A-60.916 C238.3 F325.1869 +X37.484 Y8.796 Z-7.186 A-60.895 C240.575 F328.2401 +X37.624 Y8.523 Z-7.175 A-60.873 C242.783 F331.442 +X37.762 Y8.223 Z-7.161 A-60.85 C244.919 F335.3325 +X37.899 Y7.895 Z-7.145 A-60.827 C246.974 F339.9707 +X38.032 Y7.536 Z-7.125 A-60.804 C248.944 F345.4086 +X38.161 Y7.145 Z-7.102 A-60.782 C250.822 F351.6797 +X38.286 Y6.722 Z-7.076 A-60.76 C252.605 F358.8086 +X38.404 Y6.266 Z-7.046 A-60.738 C254.288 F366.8104 +X38.516 Y5.776 Z-7.013 A-60.718 C255.867 F375.696 +X38.619 Y5.252 Z-6.978 A-60.698 C257.341 F385.4829 +X38.703 Y4.77 Z-6.944 A-60.681 C258.537 F454.749 +X38.795 Y4.149 Z-6.9 A-60.662 C259.89 F382.5793 +X38.877 Y3.493 Z-6.851 A-60.644 C261.105 F398.5656 +X38.949 Y2.796 Z-6.797 A-60.629 C262.199 F410.8658 +X39.025 Y1.858 Z-6.723 A-60.612 C263.421 F335.2173 +X39.054 Y1.421 Z-6.686 F1365.7332 +X39.277 Y1.398 Z-7.138 A-67.804 C264.173 F309.3139 +X39.441 Y1.369 Z-7.613 A-75.0 C264.852 F308.8122 +X39.411 Y1.811 Z-7.651 C264.85 F1344.5028 +X39.364 Y2.433 Z-7.699 C264.06 F513.6483 +X39.312 Y2.999 Z-7.742 C263.241 F530.0768 +X39.25 Y3.582 Z-7.785 A-74.999 C262.282 F481.9433 +X39.181 Y4.133 Z-7.825 C261.244 F473.8498 +X39.106 Y4.653 Z-7.861 A-75.0 C260.128 F465.4769 +X39.024 Y5.143 Z-7.894 C258.938 F458.2381 +X38.967 Y5.453 Z-7.914 C258.108 F680.8811 +X38.905 Y5.76 Z-7.934 C257.226 F656.4655 +X38.841 Y6.053 Z-7.952 C256.318 F653.8057 +X38.776 Y6.333 Z-7.969 C255.384 F651.1543 +X38.708 Y6.6 Z-7.985 C254.425 F648.4947 +X38.595 Y7.007 Z-8.009 C252.814 F396.5634 +X38.477 Y7.387 Z-8.029 C251.126 F390.3512 +X38.355 Y7.741 Z-8.047 C249.359 F383.7793 +X38.23 Y8.069 Z-8.062 C247.517 F377.6907 +X38.102 Y8.374 Z-8.075 C245.603 F372.0839 +X37.971 Y8.655 Z-8.086 C243.621 F366.9667 +X37.839 Y8.915 Z-8.095 C241.574 F362.338 +X37.706 Y9.156 Z-8.102 C239.467 F358.209 +X37.571 Y9.378 Z-8.108 C237.305 F354.5611 +X37.397 Y9.638 Z-8.114 C234.454 F273.2516 +X37.216 Y9.88 Z-8.119 C231.438 F262.4658 +X37.047 Y10.083 Z-8.122 C228.559 F278.759 +X36.963 Y10.176 Z-8.124 C227.119 F562.3895 +X36.829 Y10.315 Z-8.125 C224.793 F350.7823 +X36.695 Y10.444 C222.444 F350.1485 +X36.559 Y10.563 Z-8.126 C220.071 F349.0501 +X36.34 Y10.735 C216.257 F219.0662 +X36.114 Y10.89 Z-8.127 C212.362 F216.2956 +X35.699 Y11.119 C205.54 F124.8252 +X35.508 Y11.205 Z-8.126 C202.572 F287.5718 +X35.383 Y11.254 Z-8.127 C200.746 F467.0742 +X35.234 Y11.307 Z-8.126 C198.922 F460.2464 +X35.05 Y11.367 Z-8.125 A-74.999 C196.964 F423.163 +X34.797 Y11.438 Z-8.123 A-75.0 C195.009 F406.2949 +X34.655 Y11.475 Z-8.121 A-74.999 C194.046 F808.0484 +X34.425 Y11.528 Z-8.118 C192.746 F579.3545 +X34.178 Y11.581 Z-8.114 A-75.0 C191.776 F710.0217 +X33.846 Y11.645 Z-8.107 A-75.001 C190.921 F701.2549 +X33.528 Y11.703 Z-8.1 A-74.999 C190.428 F968.4667 +X33.158 Y11.768 Z-8.09 A-75.0 C190.324 F1367.9207 +X30.19 Y12.285 Z-8.011 C190.217 F195.3413 +X30.183 Y12.286 F81430.9406 +X27.776 Y12.698 Z-7.946 C190.021 F235.9525 +X27.769 Y12.7 C190.02 F83992.113 +X26.286 Y12.949 Z-7.906 C189.852 F378.2167 +X26.278 Y12.95 C189.851 F79446.7231 +X25.018 Y13.157 Z-7.871 C189.678 F441.7268 +X25.011 Y13.158 C189.677 F79383.7872 +X21.611 Y13.695 Z-7.777 C189.084 F162.6661 +X21.604 Y13.696 C189.082 F77797.5395 +X18.741 Y14.116 Z-7.694 C188.431 F191.3165 +X15.731 Y14.516 Z-7.604 A-74.999 C187.595 F181.0986 +X13.884 Y14.737 Z-7.548 C187.001 F293.8768 +X13.878 C186.999 F81756.21 +X12.396 Y14.9 Z-7.501 C186.476 F365.4099 +X12.389 Y14.901 C186.473 F82912.4063 +X9.407 Y15.183 Z-7.403 A-75.0 C185.284 F181.8632 +X6.964 Y15.363 Z-7.318 C184.172 F221.4697 +X4.558 Y15.49 Z-7.231 A-74.999 C182.944 F224.2577 +X2.56 Y15.553 Z-7.156 C181.816 F268.6913 +X0.226 Y15.573 Z-7.064 A-75.0 C180.362 F228.0926 +X-2.065 Y15.531 Z-6.969 C178.78 F229.0858 +X-4.185 Y15.431 Z-6.875 C177.168 F242.8358 +X-6.338 Y15.265 Z-6.777 C175.376 F233.4061 +X-7.78 Y15.114 Z-6.708 A-74.999 C174.082 F340.6289 +X-9.161 Y14.936 Z-6.64 C172.764 F347.3472 +X-10.557 Y14.722 Z-6.568 C171.35 F335.0745 +X-11.93 Y14.475 Z-6.493 C169.876 F331.3969 +X-13.278 Y14.196 Z-6.417 A-75.0 C168.344 F327.239 +X-14.602 Y13.882 Z-6.339 C166.755 F322.6751 +X-15.921 Y13.528 Z-6.259 C165.093 F313.5776 +X-17.432 Y13.07 Z-6.165 C163.059 F262.0338 +X-18.658 Y12.655 Z-6.087 C161.298 F309.8491 +X-19.861 Y12.204 Z-6.007 C159.492 F303.8541 +X-21.058 Y11.711 Z-5.922 C157.66 F296.6095 +X-22.257 Y11.169 Z-5.832 C155.837 F289.5986 +X-23.467 Y10.574 Z-5.737 C154.057 F283.3863 +X-24.695 Y9.925 Z-5.638 C152.353 F278.3803 +X-25.97 Y9.2 Z-5.532 C150.695 F267.3768 +X-27.208 Y8.449 Z-5.421 A-74.999 C149.18 F274.3226 +X-28.271 Y7.769 Z-5.324 A-75.0 C147.977 F321.0379 +X-29.567 Y6.898 Z-5.201 C146.63 F264.4639 +X-30.236 Y6.429 Z-5.136 C145.981 F514.9372 +X-30.246 Y6.422 Z-5.135 C145.971 F35234.7868 +X-31.476 Y5.535 Z-5.011 C144.875 F282.0796 +X-32.905 Y4.459 Z-4.863 A-74.999 C143.755 F245.8605 +X-34.156 Y3.483 Z-4.73 C142.905 F285.8323 +X-35.451 Y2.442 Z-4.589 C142.154 F281.4308 +X-36.786 Y1.342 Z-4.441 A-74.998 C141.515 F279.5591 +X-37.553 Y0.698 Z-4.354 C141.207 F496.7187 +X-37.564 Y0.689 Z-4.353 C141.203 F36706.8356 +X-38.656 Y-0.237 Z-4.228 C140.837 F356.1736 +X-38.666 Y-0.246 Z-4.227 C140.833 F36891.8074 +X-40.363 Y-1.707 Z-4.03 A-74.999 C140.423 F236.4921 +X-41.081 Y-2.332 Z-3.946 C140.304 F576.1819 +G94 +G00 Z-2.652 +X-44.166 Y1.385 +Z5.0 + +( FINISH2 FLOWLINE SRF_MILL1 ) +G00 G54 X-44.166 Y1.385 Z5 +A-74.999 C140.318 +X-44.276 Y1.721 +Z5.0 +Z3.0 +G93 +G01 Z-3.879 F43.6109 +X-41.192 Y-1.996 Z-5.173 F60.0 +X-39.443 Y-0.553 C140.665 F239.2965 +X-38.827 Y-0.051 C140.833 F660.8334 +X-38.817 Y-0.042 C140.836 F38401.9993 +X-37.419 Y1.088 C141.309 F284.8036 +X-36.093 Y2.139 A-75.0 C141.882 F292.2789 +X-35.416 Y2.667 C142.223 F560.8805 +X-35.411 Y2.671 C142.226 F73481.7568 +X-33.833 Y3.874 C143.155 F236.8506 +X-32.509 Y4.85 C144.081 F276.2794 +X-31.246 Y5.749 C145.09 F285.2372 +X-29.831 Y6.714 C146.365 F251.7539 +G94 +G00 Z5.0 +C167.016 +X-22.232 Y15 +G93 +G01 X-14.387 Y13.936 Z-6.356 F8.2994 +X-15.962 Y13.543 Z-6.352 A-75.001 C165.048 F264.2742 +X-17.208 Y13.191 C163.377 F320.7355 +X-18.446 Y12.802 Z-6.355 A-75.0 C161.625 F310.7344 +X-19.648 Y12.383 Z-6.357 C159.855 F309.4002 +X-20.861 Y11.917 Z-6.359 C158.033 F297.6285 +X-22.072 Y11.406 Z-6.36 A-74.999 C156.214 F291.1603 +X-23.29 Y10.845 Z-6.358 C154.43 F285.2535 +X-24.521 Y10.231 Z-6.356 A-75.0 C152.709 F280.2509 +X-25.647 Y9.631 Z-6.354 C151.227 F306.2213 +X-26.907 Y8.917 C149.679 F273.6937 +X-28.198 Y8.14 Z-6.356 C148.216 F268.0342 +X-29.512 Y7.304 Z-6.357 C146.847 F264.4308 +X-30.902 Y6.373 Z-6.356 C145.542 F252.0067 + +X-32.215 Y5.452 Z-6.355 C144.448 F270.1283 +X-33.539 Y4.488 Z-6.354 C143.479 F272.0425 +X-35.053 Y3.347 Z-6.355 A-74.999 C142.53 F242.1947 +X-36.652 Y2.103 Z-6.356 C141.713 F235.455 +X-38.368 Y0.731 A-74.998 C141.039 F226.4362 +X-39.017 Y0.203 C140.835 F615.4534 +X-39.028 Y0.194 C140.832 F36786.427 +X-40.817 Y-1.274 A-74.999 C140.412 F229.4334 +X-41.685 Y-1.994 A-75.0 C140.277 F489.5297 +X-42.179 Y-1.992 Z-7.538 C140.241 F458.6764 +X-40.409 Y-0.526 A-74.999 C140.533 F239.5497 +X-39.222 Y0.445 C140.834 F344.7203 +X-39.213 Y0.453 C140.837 F45215.76 +X-37.812 Y1.585 C141.31 F283.8543 +X-36.496 Y2.629 C141.877 F293.8736 +X-35.13 Y3.687 C142.597 F276.5878 +X-33.625 Y4.819 A-75.0 C143.548 F245.6896 +X-32.361 Y5.737 C144.477 F287.4411 +X-31.119 Y6.607 C145.509 F288.4373 +X-30.125 Y7.279 C146.419 F356.7246 +X-28.843 Y8.11 C147.708 F274.5385 +X-27.868 Y8.713 C148.766 F359.5899 +X-26.66 Y9.427 C150.167 F289.7662 +X-25.46 Y10.094 C151.659 F291.703 +X-24.269 Y10.716 C153.241 F294.0552 +X-23.081 Y11.294 C154.915 F295.5095 +X-21.601 Y11.953 C157.112 F239.6348 +X-20.576 Y12.37 C158.651 F351.8859 +X-19.347 Y12.828 Z-7.539 C160.468 F302.0284 +X-18.089 Y13.252 C162.273 F304.9225 +X-16.8 Y13.642 Z-7.538 C164.045 F308.2609 +X-15.473 Y13.999 Z-7.537 C165.77 F311.082 +X-14.215 Y14.3 C167.313 F339.8312 +X-12.84 Y14.589 Z-7.538 C168.916 F320.8951 +X-11.436 Y14.845 C170.466 F323.9409 +X-9.644 Y15.116 C172.319 F262.5548 +X-8.005 Y15.314 C173.896 F295.6124 +X-6.513 Y15.456 C175.239 F332.5351 +X-4.999 Y15.564 C176.52 F333.815 +X-2.768 Y15.665 C178.266 F231.2478 +X-0.488 Y15.702 C179.886 F230.1937 +X1.913 Y15.673 C181.426 F220.9166 +X4.332 Y15.583 C182.82 F220.7979 +X6.807 Y15.433 C184.095 F216.3191 +X8.998 Y15.257 C185.106 F244.818 +X11.532 Y15.007 C186.148 F211.601 +X12.385 Y14.911 C186.47 F631.5369 +X12.398 Y14.91 C186.475 F40663.7361 +X13.593 Y14.77 C186.901 F450.6244 +G94 +G00 Z-6.244 +X14.173 Y19.565 +Z5.0 +A0. +A-75.0 C270.0 +X44.466 Y-5.887 +Z5.0 +Z3.0 +G93 +G01 Z-7.056 F29.8332 +X39.636 Z-8.35 F60.0 +Y-3.578 F259.8332 +X39.638 Y-3.57 F78989.2007 +Y1.887 F109.9529 +G94 +G00 Z-7.055 +X44.468 +Z5.0 +A0. +Z5.0 + +G00 Z10 M09 +G00 X0. Y0. A0 C0 +M30 +% diff --git a/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc new file mode 100644 index 0000000..c806179 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc @@ -0,0 +1,1865 @@ +% +(!!! Touch Off: Table = -8.3 == Z max neg extent !!!) +(BOAT-5X) +( FC HERMLE 5 AXIS XYZBC MILLING ) + +( OPERATION= FINISH1 FLOWLINE SRF_MILL1 ) +( TOOL: T1 = 10.0 dia. ENDMILLM1000:REG ) +G00 G17 G40 G90 G94 +T1 M6 +G54 X-34.78 Y-2.436 B-5.546 C64.398 S600 M03 +G43 H1 Z5.0 M08 +Z3.573 +X-34.804 Y-2.386 +Z3.0 +G93 +G01 X-34.988 Y-2.0 Z-1.404 F67.8035 +X-35.008 Z-1.403 F30070.6535 +X-31.554 Y-4.825 Z-1.795 F133.9458 +X35.679 Y-4.58 Z-4.595 F8.9164 +X35.585 Y-7.418 Z-4.839 F210.5057 +X-27.8 Y-7.65 Z-2.2 F9.4576 +G94 +G00 Z5.0 +X-27.498 Y-8.28 +X-23.067 Y-11.14 +X-23.151 Y-10.965 +Z3.0 +G93 +G01 X-23.387 Y-10.471 Z-2.632 F53.014 +X35.058 Y-10.258 Z-5.066 F10.2571 +G94 +G00 Z5.0 +X35.48 Y-11.14 +X28.394 Y-13.999 +X28.31 Y-13.824 +Z3.0 +G93 +G01 X27.974 Y-13.122 Z-5.019 F37.2338 +X-17.388 Y-13.287 Z-3.131 F13.2157 +G94 +G00 Z5.0 +X-17.046 Y-13.999 +X1.143 Y-16.859 +X1.059 Y-16.684 +Z3.0 +G93 +G01 X0.76 Y-16.059 Z-4.135 F41.8503 +X0.776 Z-4.136 F37454.9529 +G94 +G00 Z0.841 +X0.985 Y-16.495 +Z5.0 +B0. +B-5.545 C-64.392 +X-34.799 Y-1.564 +Z3.574 +X-34.823 Y-1.614 +Z3.0 +G93 +G01 X-35.008 Y-2.0 Z-1.403 F67.8163 +X-34.988 Z-1.404 F29423.1803 +G94 +G00 Z5.0 +X-34.719 Y-1.439 +X36.081 Y1.42 +X35.997 Y1.245 +Z3.0 +G93 +G01 X35.679 Y0.58 Z-4.595 F39.3161 +X-31.555 Y0.825 Z-1.795 F8.9163 +X-27.795 Y3.65 Z-2.2 F127.1152 +X35.584 Y3.419 Z-4.839 F9.4587 +X35.055 Y6.259 Z-5.066 F207.0704 +X-23.392 Y6.472 Z-2.632 F10.2568 +G94 +G00 Z5.0 +X-23.072 Y7.14 +X-17.046 Y9.999 +X-17.13 Y9.824 +Z3.0 +G93 +G01 X-17.387 Y9.288 Z-3.13 F48.707 +X27.971 Y9.122 Z-5.019 F13.2164 +G94 +G00 Z5.0 +X28.392 Y9.999 +X1.329 Y12.859 +X1.245 Y12.684 +Z3.0 +G93 +G01 X0.946 Y12.059 Z-4.142 F41.8071 +X0.933 F48595.8783 +G94 +G00 Z0.835 +X1.142 Y12.494 +Z5.0 +B0. +B-5.546 C64.395 +X35.967 Y-5.826 +Z3.0 +G93 +G01 Z0.308 F111.4225 +X35.758 Y-5.39 Z-4.669 F60.0 +X35.617 Y-7.15 Z-4.817 F338.6289 +X35.559 Y-7.666 Z-4.86 F1150.2967 +X35.426 Y-8.596 Z-4.936 F636.7153 +X35.248 Y-9.519 Z-5.009 C64.396 F636.0981 +X35.083 Y-10.172 Z-5.059 F889.3286 +X34.778 Y-11.055 Z-5.124 F640.1209 +X34.311 Y-11.886 Z-5.177 C64.397 F628.4034 +X34.092 Y-12.023 Z-5.18 C64.399 F2309.9884 +X33.443 Y-12.17 Z-5.166 F900.6464 +X29.029 Y-12.939 Z-5.048 F133.8927 +X29.022 Y-12.94 F80597.2105 +X26.511 Y-13.368 Z-4.98 F235.4094 +X26.503 Y-13.37 Z-4.979 F80314.8345 +X21.506 Y-14.178 Z-4.841 F118.4711 +X21.403 Y-14.194 Z-4.838 F5763.6607 +X21.395 Y-14.195 Z-4.837 F80667.8203 +X17.508 Y-14.759 Z-4.724 F152.693 +X14.104 Y-15.192 Z-4.619 F174.7719 +X11.26 Y-15.499 Z-4.526 F209.6044 +X9.011 Y-15.702 Z-4.45 F265.5785 +X6.177 Y-15.898 Z-4.348 C64.4 F211.0993 +X3.794 Y-16.007 Z-4.258 F251.3503 +X1.432 Y-16.056 Z-4.163 F253.7361 +X-0.929 Y-16.041 Z-4.062 F253.8305 +X-2.816 Y-15.977 Z-3.978 F317.4707 +X-4.897 Y-15.847 Z-3.879 F287.4153 +X-6.745 Y-15.673 Z-3.786 F322.8491 +X-8.428 Y-15.463 Z-3.697 F353.2915 +X-10.269 Y-15.171 Z-3.594 F321.5195 +X-11.664 Y-14.903 Z-3.512 F421.6251 +X-12.624 Y-14.693 Z-3.454 F609.4916 +X-13.544 Y-14.471 Z-3.396 F632.3334 +X-14.916 Y-14.101 Z-3.306 C64.401 F421.4829 +X-16.397 Y-13.643 Z-3.203 F386.2672 +X-17.701 Y-13.182 Z-3.108 F432.6002 +X-18.576 Y-12.84 Z-3.042 F637.0784 +X-19.443 Y-12.475 Z-2.973 F636.1837 +X-20.302 Y-12.088 Z-2.903 F635.2956 +X-21.152 Y-11.68 Z-2.832 F634.4447 +X-21.993 Y-11.251 Z-2.759 F633.5349 +X-23.237 Y-10.571 Z-2.647 F421.7133 +X-24.234 Y-9.988 Z-2.555 F518.1409 +X-25.841 Y-8.981 Z-2.399 F315.271 +X-27.336 Y-7.975 Z-2.248 F331.8372 +X-28.942 Y-6.827 Z-2.08 F302.8928 +X-30.774 Y-5.444 Z-1.882 F260.3879 +X-32.98 Y-3.687 Z-1.636 F211.9425 +X-35.249 Y-1.797 Z-1.375 F202.3503 +X-38.446 Y0.955 Z-1.0 F141.7066 +X-38.78 Y0.578 Z-1.054 B-10.74 C103.027 F21.8732 +X-39.112 Y0.213 Z-1.17 B-17.477 C114.615 F64.8649 +X-36.906 Y-1.699 Z-1.427 B-17.503 C114.226 F188.0075 +X-34.471 Y-3.751 Z-1.708 B-17.558 C113.477 F163.3722 +X-33.011 Y-4.942 Z-1.874 B-17.603 C112.852 F263.3878 +X-33.005 Y-4.947 Z-1.875 C112.849 F69725.5443 +X-31.476 Y-6.157 Z-2.045 B-17.66 C112.041 F245.7564 +X-31.47 Y-6.161 Z-2.046 C112.038 F67746.3956 +X-29.554 Y-7.611 Z-2.253 B-17.746 C110.797 F191.9295 +X-29.348 Y-7.761 Z-2.275 B-17.756 C110.649 F1765.0968 +X-29.343 Y-7.765 Z-2.276 C110.645 F65318.3527 +X-27.769 Y-8.882 Z-2.438 B-17.839 C109.409 F228.7221 +X-27.166 Y-9.292 Z-2.5 B-17.873 C108.889 F589.97 +X-27.161 Y-9.296 Z-2.501 C108.884 F63117.3546 +X-25.595 Y-10.311 Z-2.654 B-17.969 C107.418 F226.1371 +X-24.895 Y-10.74 Z-2.722 B-18.015 C106.71 F502.066 +X-24.89 Y-10.743 C106.704 F61165.0282 +X-23.728 Y-11.421 Z-2.827 B-18.095 C105.461 F301.7958 +X-22.607 Y-12.035 Z-2.928 B-18.175 C104.184 F311.6249 +X-21.184 Y-12.756 Z-3.05 B-18.279 C102.46 F245.5812 +X-19.76 Y-13.405 Z-3.167 B-18.385 C100.636 F246.0964 +X-18.663 Y-13.854 Z-3.251 B-18.466 C99.205 F323.3404 +X-17.139 Y-14.413 Z-3.363 B-18.569 C97.313 F241.7135 +X-16.286 Y-14.695 Z-3.426 B-18.62 C96.324 F448.1027 +X-16.277 Y-14.699 Z-3.427 C96.314 F40618.0691 +X-14.993 Y-15.085 Z-3.514 B-18.692 C94.898 F306.7712 +X-14.98 Y-15.088 Z-3.515 C94.884 F30954.2186 +X-13.554 Y-15.465 Z-3.607 B-18.764 C93.41 F286.1249 +X-12.372 Y-15.739 Z-3.681 B-18.817 C92.261 F355.7557 +X-12.359 Y-15.742 Z-3.682 B-18.818 C92.249 F32106.6554 +X-11.055 Y-16.007 Z-3.759 B-18.872 C91.054 F331.6067 +X-11.041 Y-16.01 Z-3.76 C91.042 F32608.2546 +X-9.727 Y-16.24 Z-3.835 B-18.921 C89.913 F338.0129 +X-9.713 Y-16.242 Z-3.836 C89.902 F33212.1548 +X-7.901 Y-16.504 Z-3.932 B-18.98 C88.463 F252.8284 +X-5.885 Y-16.723 Z-4.037 B-19.038 C87.006 F234.6814 +X-4.339 Y-16.846 Z-4.113 B-19.077 C85.98 F313.4839 +X-4.332 Y-16.847 C85.975 F70468.1519 +X-2.56 Y-16.944 Z-4.195 B-19.116 C84.888 F279.1964 +X-1.652 Y-16.976 Z-4.236 B-19.134 C84.365 F552.6298 +X-1.645 Y-16.977 C84.362 F72045.6652 +X-0.308 Y-17.005 Z-4.295 B-19.159 C83.631 F379.3834 +X-0.294 C83.624 F36380.3175 +X1.028 Y-17.011 Z-4.351 B-19.181 C82.947 F388.5447 +X1.042 Z-4.352 C82.94 F36649.3378 +X1.902 Y-17.005 Z-4.387 B-19.194 C82.522 F602.6139 +X1.916 Y-17.004 C82.515 F36844.9425 +X3.696 Y-16.964 Z-4.457 B-19.218 C81.704 F293.6968 +X3.71 Z-4.458 C81.698 F37135.6166 +X5.043 Y-16.912 Z-4.509 B-19.234 C81.136 F396.2651 +X5.057 Y-16.911 Z-4.51 C81.13 F37332.7933 +X6.381 Y-16.842 Z-4.559 B-19.248 C80.608 F401.5133 +X6.388 Z-4.56 C80.606 F80626.0415 +X8.387 Y-16.707 Z-4.631 B-19.268 C79.879 F267.6974 +X9.706 Y-16.599 Z-4.679 B-19.279 C79.438 F408.6363 +X9.713 C79.436 F75759.3537 +X10.605 Y-16.518 Z-4.71 B-19.287 C79.154 F606.4113 +X10.612 Y-16.517 C79.152 F75924.561 +X12.957 Y-16.278 Z-4.787 B-19.304 C78.477 F231.6748 +X14.167 Y-16.141 Z-4.826 B-19.311 C78.163 F451.7349 +X14.174 Y-16.14 C78.161 F76943.11 +X16.404 Y-15.864 Z-4.896 B-19.323 C77.644 F246.1308 +X16.412 Y-15.863 C77.642 F77236.9594 +X16.419 Y-15.862 B-19.324 C77.641 F76516.9062 +X19.076 Y-15.501 Z-4.977 B-19.335 C77.111 F207.7195 +X19.083 Y-15.5 C77.109 F79512.4316 +X21.643 Y-15.122 Z-5.051 B-19.345 C76.672 F216.7053 +X21.65 Y-15.12 Z-5.052 C76.671 F79264.8359 +X21.657 Y-15.119 C76.67 F79282.912 +X24.185 Y-14.717 Z-5.121 B-19.352 C76.324 F221.2064 +X24.192 Y-14.716 Z-5.122 C76.323 F79012.6102 +X25.587 Y-14.484 Z-5.158 B-19.355 C76.172 F404.7049 +X25.594 Y-14.483 C76.171 F79475.6252 +X29.561 Y-13.802 Z-5.262 B-19.36 C75.893 F144.0448 +X29.568 Y-13.801 C75.892 F78973.1829 +X29.59 Y-13.797 C75.891 F26323.236 +X29.597 Y-13.796 Z-5.263 F78971.2159 +X29.605 Y-13.794 F78953.5537 +X33.166 Y-13.186 Z-5.363 B-19.364 C75.701 F161.2962 +X33.187 Y-13.182 Z-5.364 B-19.365 C75.684 F19203.8715 +X33.194 Y-13.181 C75.678 F57753.8859 +X33.705 Y-13.086 Z-5.376 B-19.381 C74.797 F593.7168 +X34.257 Y-12.957 Z-5.391 B-19.427 C71.873 F272.4494 +X34.513 Y-12.876 Z-5.396 B-19.464 C68.015 F249.4536 +X34.613 Y-12.831 B-19.476 C64.116 F268.0342 +X34.71 Y-12.78 Z-5.393 B-19.458 C60.0 F253.3516 +X34.805 Y-12.719 Z-5.39 B-19.412 C55.885 F248.2241 +X34.908 Y-12.632 Z-5.387 B-19.337 C51.762 F240.8843 +X35.03 Y-12.505 Z-5.381 B-19.232 C47.621 F231.5409 +X35.168 Y-12.338 Z-5.373 B-19.112 C43.815 F241.9904 +X35.327 Y-12.109 Z-5.361 B-18.976 C40.201 F243.5104 +X35.449 Y-11.902 Z-5.349 B-18.873 C37.764 F345.9178 +X35.577 Y-11.649 Z-5.333 B-18.766 C35.42 F345.6564 +X35.694 Y-11.383 Z-5.315 B-18.669 C33.433 F391.346 +X35.815 Y-11.071 Z-5.293 B-18.571 C31.523 F390.4509 +X35.923 Y-10.757 Z-5.27 B-18.484 C29.912 F443.2283 +X36.081 Y-10.223 Z-5.231 B-18.359 C27.679 F302.5144 +X36.229 Y-9.623 Z-5.185 B-18.242 C25.701 F317.421 +X36.392 Y-8.784 Z-5.119 B-18.109 C23.553 F267.0663 +X36.519 Y-7.934 Z-5.051 B-18.002 C21.872 F307.4231 +X36.66 Y-6.629 Z-4.943 B-17.877 C19.95 F233.8258 +X36.719 Y-5.862 Z-4.879 B-17.82 C19.1 F452.611 +X36.748 Y-5.442 Z-4.843 F1419.3659 +X37.219 Y-5.458 Z-5.021 B-24.839 C14.375 F46.4846 +X37.664 Y-5.468 Z-5.256 B-31.944 C11.644 F50.5354 +X37.636 Y-5.889 Z-5.292 F1419.3661 +X37.544 Y-6.965 Z-5.386 B-32.011 C13.033 F344.0992 +X37.543 Y-6.973 B-32.012 C13.046 F39793.6287 +X37.452 Y-7.793 Z-5.453 B-32.075 C14.39 F409.331 +X37.362 Y-8.45 Z-5.505 B-32.136 C15.696 F466.4419 +X37.259 Y-9.073 Z-5.553 B-32.204 C17.175 F448.6206 +X37.143 Y-9.66 Z-5.598 B-32.279 C18.84 F431.2424 +X37.013 Y-10.209 Z-5.638 B-32.361 C20.7 F414.3782 +X36.875 Y-10.705 Z-5.673 B-32.445 C22.705 F410.3976 +X36.792 Y-10.971 Z-5.691 B-32.495 C23.946 F694.9742 +X36.626 Y-11.444 Z-5.724 B-32.596 C26.53 F350.3813 +X36.464 Y-11.839 Z-5.75 B-32.694 C29.194 F360.0582 +X36.297 Y-12.186 Z-5.771 B-32.794 C32.11 F346.6796 +X36.127 Y-12.486 Z-5.787 B-32.895 C35.279 F335.0213 +X35.958 Y-12.741 Z-5.799 B-32.993 C38.699 F324.8029 +X35.793 Y-12.955 Z-5.806 B-33.085 C42.358 F316.2265 +X35.7 Y-13.064 Z-5.809 B-33.135 C44.595 F532.5187 +X35.592 Y-13.178 Z-5.815 B-33.19 C47.336 F444.3448 +X35.491 Y-13.276 Z-5.818 B-33.236 C50.069 F455.5174 +X35.374 Y-13.374 Z-5.821 B-33.281 C53.347 F388.3394 +X35.259 Y-13.457 Z-5.822 B-33.314 C56.621 F396.6235 +X35.144 Y-13.528 B-33.336 C59.896 F403.0416 +X35.023 Y-13.593 Z-5.821 B-33.347 C63.176 F407.5184 +X34.912 Y-13.647 Z-5.822 B-33.345 C66.286 F436.2698 +X34.784 Y-13.699 Z-5.823 B-33.334 C69.279 F442.7407 +X34.583 Y-13.764 Z-5.82 B-33.314 C72.144 F433.6833 +X34.253 Y-13.853 Z-5.814 B-33.288 C74.868 F411.0258 +X33.915 Y-13.927 Z-5.808 B-33.271 C76.4 F614.7876 +X33.307 Y-14.043 Z-5.793 B-33.25 C77.68 F523.8826 +X33.298 Y-14.044 Z-5.792 B-33.249 C77.687 F49438.7077 +X33.003 Y-14.097 Z-5.783 B-33.25 C77.782 F1779.0487 +X29.665 Y-14.68 Z-5.695 B-33.247 C77.896 F174.7313 +X29.658 Y-14.682 F79891.5766 +X25.324 Y-15.411 Z-5.58 B-33.241 C78.287 F132.4253 +X25.317 Y-15.412 C78.288 F79522.4954 +X24.423 Y-15.557 Z-5.556 B-33.24 C78.403 F635.0562 +X24.416 Y-15.558 C78.404 F79455.9674 +X21.781 Y-15.973 Z-5.482 B-33.235 C78.811 F214.2281 +X21.774 Y-15.974 Z-5.481 C78.812 F79294.3804 +X21.767 Y-15.975 C78.813 F79294.1225 +X19.135 Y-16.364 Z-5.405 B-33.227 C79.325 F212.3933 +X19.128 Y-16.365 C79.326 F79118.5271 +X19.121 Y-16.366 Z-5.404 C79.328 F79095.2778 +X16.478 Y-16.727 Z-5.326 B-33.217 C79.95 F209.3822 +X16.471 Y-16.728 C79.952 F78874.8442 +X14.27 Y-17.002 Z-5.257 B-33.206 C80.557 F248.9171 +X14.263 Y-17.003 C80.559 F78763.0876 +X11.458 Y-17.31 Z-5.166 B-33.189 C81.45 F192.9134 +X10.691 Y-17.383 Z-5.142 B-33.184 C81.718 F699.9404 +X10.684 Y-17.384 C81.721 F78252.47 +X10.118 Y-17.437 Z-5.122 B-33.18 C81.926 F943.9872 +X10.111 C81.929 F77864.011 +X7.77 Y-17.628 Z-5.037 B-33.162 C82.844 F226.0529 +X7.763 C82.847 F77342.8873 +X6.419 Y-17.715 Z-4.988 B-33.151 C83.423 F389.0612 +X6.412 C83.426 F77096.2068 +X5.073 Y-17.784 Z-4.937 B-33.139 C84.04 F386.4437 +X5.065 C84.044 F67298.6104 +X3.726 Y-17.836 Z-4.885 B-33.125 C84.699 F381.8279 +X3.712 Y-17.837 Z-4.884 C84.706 F37731.2562 +X1.68 Y-17.879 Z-4.806 B-33.101 C85.785 F247.247 +X1.674 C85.789 F74757.2255 +X1.026 Y-17.884 Z-4.781 B-33.093 C86.155 F766.8597 +X1.02 C86.158 F74085.2021 +X-0.329 Y-17.879 Z-4.725 B-33.073 C86.957 F363.3423 +X-0.335 Z-4.724 C86.961 F73836.9249 +X-1.689 Y-17.852 Z-4.667 B-33.052 C87.814 F355.8091 +X-1.696 Z-4.666 B-33.051 C87.819 F73014.8939 +X-3.732 Y-17.766 Z-4.575 B-33.015 C89.206 F230.934 +X-4.42 Y-17.723 Z-4.544 B-33.002 C89.705 F671.9303 +X-4.426 B-33.001 C89.71 F71421.9144 +X-5.786 Y-17.617 Z-4.479 B-32.973 C90.744 F333.9523 +X-5.792 Y-17.616 C90.749 F70455.1006 +X-7.02 Y-17.495 Z-4.416 B-32.946 C91.742 F361.554 +X-8.628 Y-17.293 Z-4.329 B-32.907 C93.135 F268.6144 +X-9.863 Y-17.102 Z-4.259 B-32.874 C94.282 F339.7118 +X-9.873 Y-17.1 C94.292 F41409.6627 +X-11.223 Y-16.862 Z-4.181 B-32.833 C95.617 F302.4578 +X-11.235 Y-16.86 Z-4.18 B-32.832 C95.629 F34068.2663 +X-12.576 Y-16.59 Z-4.103 B-32.786 C97.025 F295.8251 +X-12.587 Y-16.588 Z-4.102 B-32.785 C97.037 F33638.0783 +X-13.914 Y-16.284 Z-4.024 B-32.733 C98.505 F289.4959 +X-13.925 Y-16.281 Z-4.023 C98.519 F32862.1067 +X-15.249 Y-15.936 Z-3.942 B-32.675 C100.079 F280.0842 +X-15.26 Y-15.933 Z-3.941 C100.093 F32095.9954 +X-16.564 Y-15.548 Z-3.857 B-32.613 C101.73 F274.1195 +X-16.575 Y-15.544 Z-3.856 B-32.612 C101.744 F31333.1454 +X-17.627 Y-15.2 Z-3.778 B-32.559 C103.14 F328.4449 +X-18.323 Y-14.951 Z-3.727 B-32.521 C104.098 F484.5071 +X-19.418 Y-14.52 Z-3.647 B-32.46 C105.66 F299.3285 +X-19.424 Y-14.518 C105.667 F62151.3012 +X-20.252 Y-14.166 Z-3.58 B-32.412 C106.877 F387.3783 +X-20.257 Y-14.163 Z-3.579 C106.884 F61471.6301 +X-21.031 Y-13.815 Z-3.51 B-32.366 C108.021 F409.2952 +X-22.66 Y-13.019 Z-3.373 B-32.266 C110.329 F193.6638 +X-22.954 Y-12.869 Z-3.352 B-32.247 C110.715 F1096.3644 +X-22.959 Y-12.866 C110.721 F67961.3785 +X-23.638 Y-12.513 Z-3.295 B-32.206 C111.584 F478.3879 +X-24.343 Y-12.124 Z-3.235 B-32.164 C112.462 F458.8213 +X-25.389 Y-11.508 Z-3.145 B-32.106 C113.719 F308.7928 +X-25.394 Y-11.505 B-32.105 C113.725 F59260.3262 +X-26.552 Y-10.783 Z-3.032 B-32.045 C115.033 F280.7638 +X-26.557 Y-10.78 C115.039 F60327.773 +X-27.686 Y-10.037 Z-2.918 B-31.99 C116.218 F291.256 +X-27.697 Y-10.029 Z-2.917 C116.228 F30325.9475 +X-28.806 Y-9.268 Z-2.804 B-31.939 C117.283 F301.3724 +X-28.816 Y-9.26 Z-2.803 C117.293 F30903.6616 +X-29.911 Y-8.481 Z-2.691 B-31.891 C118.233 F310.9208 +X-29.917 Y-8.478 C118.237 F67967.0496 +X-30.995 Y-7.682 Z-2.578 B-31.848 C119.075 F320.6015 +X-31.0 Y-7.678 Z-2.577 C119.079 F64901.2709 +X-32.066 Y-6.864 Z-2.462 B-31.811 C119.821 F329.6481 +X-32.071 Y-6.859 C119.824 F65777.5217 +X-33.358 Y-5.845 Z-2.319 B-31.771 C120.606 F278.401 +X-33.364 Y-5.84 Z-2.318 C120.609 F67026.0734 +X-35.204 Y-4.34 Z-2.106 B-31.725 C121.511 F200.6143 +X-36.211 Y-3.498 Z-1.99 B-31.705 C121.902 F378.4222 +X-36.217 Y-3.493 Z-1.989 C121.904 F70496.3728 +X-37.675 Y-2.253 Z-1.821 B-31.681 C122.348 F268.6407 +X-37.68 Y-2.248 Z-1.82 C122.349 F73096.2871 +X-39.747 Y-0.46 Z-1.58 B-31.661 C122.752 F197.6597 +X-40.04 Y-0.758 Z-1.868 B-38.849 C124.709 F229.188 +X-40.31 Y-1.021 Z-2.208 B-46.062 C126.136 F267.9567 +X-38.322 Y-2.741 Z-2.441 B-46.074 C125.738 F204.4673 +X-38.311 Y-2.75 Z-2.442 B-46.075 C125.735 F37799.5261 +X-36.775 Y-4.058 Z-2.618 B-46.091 C125.255 F252.7272 +X-36.77 Y-4.062 Z-2.619 C125.253 F72536.4597 +X-35.75 Y-4.914 Z-2.735 B-46.104 C124.845 F368.7612 +X-35.745 Y-4.918 C124.843 F71519.1111 +X-34.127 Y-6.236 Z-2.92 B-46.131 C124.04 F225.5091 +X-34.122 Y-6.24 C124.037 F69060.8975 +X-32.61 Y-7.434 Z-3.087 B-46.161 C123.104 F232.3656 +X-32.605 Y-7.438 Z-3.088 C123.1 F67554.2622 +X-31.216 Y-8.496 Z-3.235 B-46.194 C122.082 F245.0433 +X-30.454 Y-9.057 Z-3.316 B-46.215 C121.458 F436.9278 +X-30.447 Y-9.062 Z-3.317 C121.452 F47093.2174 +X-29.344 Y-9.849 Z-3.429 B-46.246 C120.47 F297.1943 +X-29.334 Y-9.856 Z-3.43 B-46.247 C120.46 F32042.3278 +X-28.21 Y-10.626 Z-3.542 B-46.28 C119.363 F286.335 +X-28.2 Y-10.633 Z-3.543 B-46.281 C119.353 F31529.7125 +X-27.04 Y-11.392 Z-3.656 B-46.318 C118.12 F272.7735 +X-27.029 Y-11.398 C118.109 F30993.4909 +X-25.851 Y-12.128 Z-3.767 B-46.359 C116.753 F264.3635 +X-25.841 Y-12.134 Z-3.768 C116.741 F30511.0733 +X-24.784 Y-12.76 Z-3.858 B-46.398 C115.434 F289.6793 +X-23.417 Y-13.506 Z-3.979 B-46.45 C113.631 F221.8106 +X-23.376 Y-13.527 Z-3.983 B-46.452 C113.576 F7451.226 +X-23.366 Y-13.532 Z-3.984 C113.562 F29810.6647 +X-22.213 Y-14.117 Z-4.077 B-46.499 C111.935 F259.0972 +X-20.928 Y-14.709 Z-4.179 B-46.552 C110.025 F230.8429 +X-19.369 Y-15.359 Z-4.295 B-46.614 C107.681 F192.4139 +X-18.023 Y-15.862 Z-4.391 B-46.662 C105.748 F230.8319 +X-16.858 Y-16.245 Z-4.478 B-46.701 C104.153 F276.2273 +X-16.847 Y-16.248 Z-4.479 C104.138 F29840.3549 +X-15.518 Y-16.647 Z-4.567 B-46.742 C102.404 F249.9493 +X-15.507 Y-16.65 Z-4.568 C102.39 F30242.5279 +X-14.171 Y-17.004 Z-4.651 B-46.779 C100.744 F257.6918 +X-14.16 Y-17.006 Z-4.652 B-46.78 C100.731 F30710.8664 +X-12.806 Y-17.32 Z-4.732 B-46.814 C99.16 F263.4005 +X-12.794 Y-17.323 Z-4.733 B-46.815 C99.147 F31230.7365 +X-11.437 Y-17.596 Z-4.81 B-46.846 C97.667 F271.9055 +X-11.425 Y-17.599 C97.655 F31799.9516 +X-10.055 Y-17.836 Z-4.885 B-46.875 C96.252 F278.4086 +X-10.043 Y-17.838 B-46.876 C96.24 F31970.2466 +X-8.485 Y-18.067 Z-4.966 B-46.905 C94.748 F252.9559 +X-6.857 Y-18.26 Z-5.05 B-46.931 C93.298 F250.5134 +X-5.9 Y-18.352 Z-5.099 B-46.945 C92.493 F436.3454 +X-5.894 Y-18.353 Z-5.1 B-46.946 C92.488 F67661.2523 +X-4.516 Y-18.461 Z-5.166 B-46.964 C91.386 F309.7748 +X-4.51 Y-18.462 C91.381 F68563.1232 +X-3.139 Y-18.542 Z-5.23 B-46.982 C90.351 F318.9491 +X-3.133 C90.346 F69662.1502 +X-1.761 Y-18.595 Z-5.291 B-46.997 C89.376 F325.9507 +X-1.748 Y-18.596 C89.367 F35072.6317 +X-0.399 Y-18.624 Z-5.349 B-47.011 C88.47 F338.3776 +X-0.386 B-47.012 C88.462 F35516.5365 +X0.979 Y-18.63 Z-5.406 B-47.025 C87.609 F341.2654 +X0.992 C87.601 F36052.12 +X1.857 Y-18.623 Z-5.44 B-47.032 C87.088 F546.7798 +X1.87 C87.081 F36380.0491 +X3.713 Y-18.582 Z-5.51 B-47.047 C86.054 F261.3516 +X3.727 Y-18.581 C86.047 F36666.737 +X5.07 Y-18.528 Z-5.561 B-47.057 C85.353 F365.3503 +X5.084 Y-18.527 C85.347 F36842.4997 +X6.431 Y-18.456 Z-5.61 B-47.066 C84.695 F369.9123 +X6.444 Y-18.455 Z-5.611 C84.688 F37229.736 +X7.789 Y-18.368 Z-5.659 B-47.074 C84.079 F375.78 +X7.803 Y-18.367 C84.073 F37720.428 +X9.849 Y-18.202 Z-5.733 B-47.084 C83.22 F251.227 +X9.863 Y-18.201 C83.214 F37967.7264 +X10.721 Y-18.122 Z-5.764 B-47.088 C82.882 F606.1587 +X10.735 Y-18.121 C82.877 F38301.0447 +X13.779 Y-17.806 Z-5.863 B-47.1 C81.812 F174.0375 +X14.312 Y-17.743 Z-5.881 B-47.102 C81.643 F1003.7554 +X14.318 Y-17.742 C81.641 F86046.2459 +X16.538 Y-17.466 Z-5.95 B-47.109 C80.995 F243.9846 +X16.545 Y-17.465 C80.993 F78561.5632 +X19.208 Y-17.101 Z-6.029 B-47.117 C80.328 F206.3914 +X19.215 Y-17.1 C80.327 F79673.093 +X21.858 Y-16.709 Z-6.105 B-47.122 C79.78 F211.0407 +X21.866 Y-16.707 C79.779 F68746.9073 +X24.513 Y-16.29 Z-6.179 B-47.126 C79.344 F213.5127 +X24.52 Y-16.288 C79.343 F80160.2445 +X25.89 Y-16.065 Z-6.216 B-47.128 C79.16 F415.842 +X25.897 Y-16.064 C79.159 F80539.0228 +X29.725 Y-15.418 Z-6.316 B-47.132 C78.802 F150.623 +X29.732 Y-15.417 Z-6.317 F80881.8344 +X33.28 Y-14.799 Z-6.412 B-47.133 C78.651 F164.6274 +X33.363 Y-14.783 Z-6.415 B-47.134 C78.611 F6203.83 +X33.374 Y-14.781 C78.603 F47056.4975 +X33.604 Y-14.74 Z-6.421 B-47.136 C78.342 F1961.1804 +X33.805 Y-14.703 Z-6.426 B-47.139 C77.965 F1940.1383 +X34.143 Y-14.634 Z-6.433 B-47.152 C76.827 F901.563 +X34.418 Y-14.572 Z-6.438 B-47.162 C75.455 F910.9058 +X34.736 Y-14.488 Z-6.443 B-47.176 C73.091 F616.2395 +X34.809 Y-14.466 B-47.179 C72.364 F2187.5487 +X34.998 Y-14.404 Z-6.445 B-47.189 C70.046 F728.4727 +X35.137 Y-14.351 Z-6.446 B-47.195 C67.729 F779.7703 +X35.251 Y-14.301 B-47.199 C65.41 F812.0031 +X35.361 Y-14.248 C63.091 F819.9683 +X35.531 Y-14.155 B-47.191 C59.524 F527.0449 +X35.693 Y-14.052 Z-6.445 B-47.176 C55.956 F523.8861 +X35.808 Y-13.969 Z-6.444 B-47.16 C53.389 F719.9349 +X35.924 Y-13.877 Z-6.443 B-47.14 C50.823 F712.7763 +X36.008 Y-13.805 Z-6.441 B-47.122 C48.968 F974.3499 +X36.093 Y-13.725 Z-6.44 B-47.102 C47.112 F963.3275 +X36.179 Y-13.639 Z-6.437 B-47.08 C45.255 F950.7065 +X36.268 Y-13.545 Z-6.433 B-47.056 C43.397 F936.608 +X36.419 Y-13.364 Z-6.429 B-47.011 C40.301 F551.9925 +X36.574 Y-13.162 Z-6.423 B-46.963 C37.318 F557.5944 +X36.726 Y-12.94 Z-6.415 B-46.914 C34.536 F579.4335 +X36.88 Y-12.687 Z-6.405 B-46.861 C31.843 F578.803 +X37.034 Y-12.401 Z-6.392 B-46.807 C29.252 F579.1417 +X37.187 Y-12.08 Z-6.375 B-46.751 C26.774 F580.5482 +X37.337 Y-11.72 Z-6.354 B-46.695 C24.418 F583.0631 +X37.483 Y-11.32 Z-6.329 B-46.64 C22.194 F586.5844 +X37.623 Y-10.881 Z-6.3 B-46.587 C20.108 F590.9148 +X37.756 Y-10.4 Z-6.267 B-46.535 C18.165 F595.7704 +X37.882 Y-9.88 Z-6.23 B-46.485 C16.367 F600.8546 +X37.997 Y-9.319 Z-6.19 B-46.438 C14.716 F605.8605 +X38.072 Y-8.908 Z-6.16 B-46.407 C13.656 F877.4915 +X38.165 Y-8.322 Z-6.117 B-46.367 C12.326 F652.1219 +X38.257 Y-7.616 Z-6.063 B-46.326 C10.967 F577.9221 +X38.335 Y-6.878 Z-6.004 B-46.29 C9.786 F589.4789 +X38.42 Y-5.888 Z-5.92 B-46.251 C8.492 F466.3294 +X38.449 Y-5.468 Z-5.885 F1419.3659 +X38.775 Y-5.457 Z-6.268 B-53.428 C7.446 F53.9239 +X39.053 Y-5.441 Z-6.688 B-60.613 C6.579 F53.3629 +X39.025 Y-5.861 Z-6.723 F1419.3645 +X38.98 Y-6.442 Z-6.769 B-60.623 C7.307 F802.2979 +X38.931 Y-6.98 Z-6.812 B-60.634 C8.072 F835.8538 +X38.866 Y-7.593 Z-6.859 B-60.648 C9.068 F701.3953 +X38.792 Y-8.174 Z-6.902 B-60.663 C10.158 F702.0273 +X38.711 Y-8.724 Z-6.942 B-60.68 C11.346 F698.4889 +X38.621 Y-9.244 Z-6.979 B-60.698 C12.634 F693.7353 +X38.524 Y-9.735 Z-7.012 B-60.718 C14.02 F688.0831 +X38.45 Y-10.07 Z-7.033 B-60.732 C15.071 F952.8916 +X38.378 Y-10.371 Z-7.053 B-60.745 C16.094 F1015.8505 +X38.303 Y-10.655 Z-7.071 B-60.758 C17.146 F1019.8245 +X38.227 Y-10.925 Z-7.088 B-60.772 C18.229 F1022.9332 +X38.15 Y-11.179 Z-7.103 B-60.785 C19.34 F1025.2163 +X38.023 Y-11.561 Z-7.126 B-60.807 C21.188 F636.1066 +X37.891 Y-11.913 Z-7.145 B-60.829 C23.127 F629.6581 +X37.757 Y-12.236 Z-7.162 B-60.851 C25.158 F621.5828 +X37.619 Y-12.533 Z-7.176 B-60.874 C27.277 F613.5975 +X37.48 Y-12.804 Z-7.187 B-60.896 C29.481 F605.8316 +X37.34 Y-13.051 Z-7.196 B-60.918 C31.764 F598.4008 +X37.198 Y-13.276 Z-7.203 B-60.939 C34.119 F591.3571 +X37.057 Y-13.481 Z-7.208 B-60.959 C36.542 F584.7243 +X36.916 Y-13.668 Z-7.213 B-60.977 C39.025 F578.4687 +X36.825 Y-13.779 Z-7.216 B-60.989 C40.651 F893.1714 +X36.72 Y-13.898 Z-7.219 B-61.002 C42.551 F769.8755 +X36.618 Y-14.009 Z-7.222 B-61.013 C44.449 F776.3497 +X36.518 Y-14.11 Z-7.224 B-61.024 C46.346 F781.6227 +X36.417 Y-14.204 Z-7.225 B-61.033 C48.242 F785.593 +X36.279 Y-14.322 Z-7.226 B-61.045 C50.855 F571.7403 +X36.008 Y-14.52 B-61.061 C55.831 F299.7546 +X35.872 Y-14.606 Z-7.227 B-61.066 C58.312 F604.5102 +X35.746 Y-14.68 Z-7.229 B-61.07 C60.691 F634.8442 +X35.563 Y-14.777 Z-7.231 B-61.072 C64.161 F435.5411 +X35.471 Y-14.82 C65.803 F915.8547 +X35.377 Y-14.861 B-61.071 C67.38 F940.8292 +X35.206 Y-14.928 Z-7.23 B-61.067 C69.894 F574.9639 +X35.001 Y-14.996 Z-7.228 B-61.063 C72.29 F575.5892 +X34.745 Y-15.07 Z-7.224 B-61.056 C74.538 F572.0885 +X34.524 Y-15.129 Z-7.221 B-61.051 C76.015 F802.5657 +X34.275 Y-15.188 Z-7.216 B-61.047 C77.263 F861.7188 +X33.893 Y-15.265 Z-7.209 B-61.042 C78.5 F722.5693 +X33.506 Y-15.333 Z-7.201 B-61.039 C79.115 F975.3862 +X33.498 Y-15.334 C79.121 F57402.8893 +X33.195 Y-15.391 Z-7.191 C79.245 F1698.4022 +X29.913 Y-15.962 Z-7.103 B-61.038 C79.37 F177.5095 +X29.9 Y-15.965 C79.371 F42903.9955 +X26.779 Y-16.495 Z-7.02 B-61.037 C79.635 F183.2093 +X26.773 Y-16.496 C79.636 F84056.4116 +X24.608 Y-16.852 Z-6.961 B-61.036 C79.933 F258.4661 +X24.599 Y-16.853 C79.934 F58805.9918 +X21.931 Y-17.274 Z-6.887 B-61.034 C80.384 F206.5895 +X21.924 Y-17.275 C80.386 F79134.0487 +X19.269 Y-17.669 Z-6.811 B-61.031 C80.954 F203.3013 +X19.262 Y-17.67 C80.955 F78331.6853 +X16.601 Y-18.033 Z-6.732 B-61.027 C81.645 F198.4244 +X16.595 C81.647 F77486.8518 +X16.588 Y-18.034 C81.649 F77478.8564 +X14.369 Y-18.311 Z-6.663 B-61.024 C82.316 F233.0471 +X14.362 Y-18.312 C82.318 F76699.2291 +X12.561 Y-18.513 Z-6.606 B-61.021 C82.928 F281.6598 +X12.554 Y-18.514 C82.93 F76036.2408 +X10.754 Y-18.694 Z-6.547 B-61.017 C83.603 F276.7602 +X10.747 C83.605 F75380.0302 +X9.368 Y-18.818 Z-6.5 B-61.014 C84.166 F354.9834 +X9.361 C84.169 F75074.2271 +X7.819 Y-18.938 Z-6.446 B-61.01 C84.842 F312.4391 +X7.812 Z-6.445 C84.845 F68948.1669 +X6.448 Y-19.027 Z-6.397 B-61.006 C85.483 F347.3647 +X6.441 C85.486 F73568.2523 +X3.92 Y-19.148 Z-6.304 B-60.998 C86.777 F183.1696 +X3.705 Y-19.154 Z-6.297 B-60.997 C86.895 F2120.1861 +X3.699 Z-6.296 C86.898 F72355.6332 +X2.197 Y-19.191 Z-6.238 B-60.991 C87.755 F298.406 +X2.188 C87.76 F53245.2809 +X0.963 Y-19.203 Z-6.189 B-60.986 C88.505 F358.5909 +X0.951 Z-6.188 C88.513 F35259.1052 +X-0.411 Y-19.197 Z-6.132 B-60.98 C89.39 F316.3663 +X-0.423 Z-6.131 C89.398 F34733.705 +X-1.794 Y-19.168 Z-6.073 B-60.973 C90.335 F307.557 +X-1.806 Y-19.167 C90.344 F34230.7262 +X-3.186 Y-19.113 Z-6.012 B-60.965 C91.346 F298.516 +X-3.198 C91.355 F34004.7334 +X-4.578 Y-19.033 Z-5.95 B-60.957 C92.419 F291.4976 +X-4.59 Y-19.032 Z-5.949 C92.428 F33589.3685 +X-6.256 Y-18.9 Z-5.87 B-60.945 C93.802 F234.6183 +X-7.746 Y-18.745 Z-5.797 B-60.934 C95.116 F254.4929 +X-9.21 Y-18.556 Z-5.723 B-60.922 C96.494 F251.2348 +X-10.181 Y-18.404 Z-5.674 B-60.913 C97.457 F369.2441 +X-10.192 Y-18.402 Z-5.673 C97.469 F31620.4581 +X-11.574 Y-18.161 Z-5.599 B-60.9 C98.911 F252.6724 +X-11.579 Y-18.16 Z-5.598 C98.917 F62500.4468 +X-12.964 Y-17.88 Z-5.52 B-60.885 C100.453 F244.0342 +X-12.969 Y-17.879 C100.459 F61357.0911 +X-14.317 Y-17.565 Z-5.44 B-60.869 C102.047 F242.3728 +X-14.349 Y-17.557 Z-5.438 B-60.868 C102.086 F10073.4945 +X-14.354 Y-17.556 C102.093 F60446.3537 +X-15.551 Y-17.243 Z-5.364 B-60.852 C103.588 F263.8053 +X-15.713 Y-17.196 Z-5.355 B-60.85 C103.796 F1917.7209 +X-15.724 Y-17.193 Z-5.354 C103.81 F28796.7965 +X-16.398 Y-17.002 Z-5.31 B-60.84 C104.692 F455.9449 +X-17.084 Y-16.786 Z-5.268 B-60.83 C105.604 F442.0397 +X-17.09 Y-16.784 Z-5.267 C105.613 F46288.3501 +X-17.895 Y-16.524 Z-5.211 B-60.817 C106.715 F370.0679 +X-19.154 Y-16.075 Z-5.125 B-60.796 C108.545 F227.8068 +X-20.397 Y-15.582 Z-5.037 B-60.773 C110.431 F223.5646 +X-21.643 Y-15.039 Z-4.943 B-60.749 C112.324 F220.647 +X-22.777 Y-14.498 Z-4.854 B-60.727 C113.99 F243.9038 +X-23.756 Y-14.0 Z-4.775 B-60.709 C115.372 F285.3105 +X-25.023 Y-13.309 Z-4.668 B-60.686 C117.073 F223.3288 +X-26.205 Y-12.613 Z-4.566 B-60.665 C118.562 F243.1785 +X-26.216 Y-12.607 Z-4.565 C118.574 F28869.107 +X-27.411 Y-11.866 Z-4.455 B-60.645 C119.971 F245.9214 +X-27.421 Y-11.86 Z-4.454 C119.982 F29361.2518 +X-28.583 Y-11.101 Z-4.344 B-60.627 C121.237 F258.3482 +X-28.593 Y-11.094 Z-4.343 C121.248 F29945.0194 +X-29.721 Y-10.321 Z-4.233 B-60.61 C122.375 F271.2503 +X-29.727 Y-10.318 C122.38 F56198.2551 +X-30.852 Y-9.513 Z-4.117 B-60.596 C123.388 F280.0485 +X-30.862 Y-9.505 Z-4.116 B-60.595 C123.397 F30849.292 +X-31.946 Y-8.704 Z-4.006 B-60.581 C124.284 F296.7432 +X-31.951 Y-8.7 Z-4.005 C124.288 F67059.6587 +X-33.034 Y-7.872 Z-3.89 B-60.569 C125.073 F305.6852 +X-33.04 Y-7.868 C125.077 F58020.4028 +X-34.098 Y-7.036 Z-3.774 B-60.559 C125.76 F320.6153 +X-34.108 Y-7.027 Z-3.773 C125.766 F32710.825 +X-34.977 Y-6.33 Z-3.677 B-60.552 C126.267 F399.6095 +X-34.987 Y-6.322 Z-3.676 C126.273 F34597.5041 +X-36.184 Y-5.342 Z-3.542 B-60.542 C126.857 F299.3849 +X-36.189 Y-5.337 C126.86 F67707.9405 +X-37.217 Y-4.479 Z-3.425 B-60.535 C127.276 F359.825 +X-37.222 Y-4.474 Z-3.424 C127.278 F71204.2409 +X-38.421 Y-3.456 Z-3.287 B-60.528 C127.673 F317.8066 +X-38.431 Y-3.447 Z-3.286 C127.676 F36504.5585 +X-38.956 Y-2.998 Z-3.225 B-60.526 C127.818 F744.9287 +X-38.967 Y-2.989 Z-3.224 C127.821 F36540.2718 +X-40.764 Y-1.433 Z-3.013 B-60.522 C128.176 F224.7811 +X-40.941 Y-1.574 Z-3.468 B-67.759 C128.975 F327.2978 +X-41.08 Y-1.669 Z-3.946 B-74.999 C129.696 F331.2074 +X-39.153 Y-3.337 Z-4.171 B-74.998 C129.303 F207.9586 +X-38.684 Y-3.738 Z-4.225 C129.172 F823.5637 +X-38.676 Y-3.746 Z-4.226 C129.169 F45423.6663 +X-37.581 Y-4.674 Z-4.351 C128.804 F344.1268 +X-37.576 Y-4.678 C128.802 F73170.9452 +X-36.499 Y-5.579 Z-4.473 C128.36 F337.931 +X-36.494 Y-5.583 Z-4.474 C128.357 F71120.9147 +X-35.438 Y-6.451 Z-4.591 B-74.999 C127.839 F333.1849 +X-35.433 Y-6.455 C127.837 F70345.2211 +X-34.127 Y-7.505 Z-4.733 B-75.0 C127.077 F259.7551 +X-32.874 Y-8.483 Z-4.866 C126.222 F260.733 +X-31.645 Y-9.41 Z-4.994 B-74.999 C125.265 F256.8601 +X-30.435 Y-10.289 Z-5.116 C124.207 F252.8946 +X-29.349 Y-11.047 Z-5.221 B-75.0 C123.159 F273.3706 +X-28.288 Y-11.758 Z-5.322 B-74.999 C122.048 F272.8927 +X-27.103 Y-12.515 Z-5.432 C120.704 F238.1431 +X-25.92 Y-13.23 Z-5.538 C119.254 F232.2781 +X-24.742 Y-13.899 Z-5.638 C117.708 F227.7205 +X-23.308 Y-14.655 Z-5.749 B-75.0 C115.71 F183.2693 +X-22.062 Y-15.259 Z-5.842 B-75.001 C113.868 F206.4421 +X-20.825 Y-15.809 Z-5.936 B-75.0 C111.975 F205.7057 +X-19.571 Y-16.317 Z-6.027 B-74.999 C110.064 F204.8407 +X-18.291 Y-16.784 Z-6.116 C108.176 F205.6431 +X-16.983 Y-17.215 Z-6.2 C106.334 F207.5408 +X-15.644 Y-17.608 Z-6.281 C104.553 F210.1103 +X-14.282 Y-17.962 Z-6.359 C102.846 F214.0191 +X-12.885 Y-18.278 Z-6.437 B-75.0 C101.199 F216.233 +X-11.468 Y-18.561 Z-6.513 C99.625 F220.3226 +X-10.022 Y-18.807 Z-6.591 C98.108 F222.6403 +X-8.134 Y-19.072 Z-6.691 B-74.999 C96.249 F176.2272 +X-6.275 Y-19.272 Z-6.783 C94.562 F186.3394 +X-4.708 Y-19.398 Z-6.855 C93.244 F228.9034 +X-2.694 Y-19.508 Z-6.943 C91.679 F184.4491 +X-0.34 Y-19.568 Z-7.04 C90.016 F164.1242 +X1.716 Y-19.567 Z-7.122 B-75.0 C88.696 F194.8155 +X4.177 Y-19.505 Z-7.218 B-74.999 C87.261 F168.4565 +X6.45 Y-19.395 Z-7.302 C86.077 F189.0916 +X8.969 Y-19.219 Z-7.388 C84.906 F176.4565 +X11.081 Y-19.032 Z-7.458 C84.027 F216.6899 +X11.088 Y-19.031 Z-7.459 C84.024 F70262.3356 +X14.161 Y-18.706 Z-7.557 B-75.0 C82.905 F153.7403 +X17.009 Y-18.352 Z-7.644 B-74.999 C82.03 F171.7671 +X20.007 Y-17.935 Z-7.731 B-75.0 C81.265 F168.5138 +X23.297 Y-17.434 Z-7.824 C80.597 F158.5507 +X25.081 Y-17.146 Z-7.874 C80.313 F300.1145 +X25.089 Y-17.145 C80.312 F70947.5225 +X27.578 Y-16.731 Z-7.941 C79.997 F219.6646 +X27.584 Y-16.73 Z-7.942 F84014.5721 +X30.286 Y-16.268 Z-8.014 C79.777 F207.9992 +X30.294 Y-16.267 C79.776 F79392.2926 +X33.398 Y-15.726 Z-8.097 C79.642 F185.3541 +X33.937 Y-15.628 Z-8.109 C78.909 F595.1254 +X34.241 Y-15.568 Z-8.116 C77.987 F676.4416 +X34.477 Y-15.517 Z-8.12 B-74.999 C76.98 F688.2285 +X34.798 Y-15.438 Z-8.123 B-75.0 C75.008 F384.6033 +X34.97 Y-15.39 C73.633 F580.519 +X35.123 Y-15.344 Z-8.124 C72.213 F575.4289 +X35.261 Y-15.298 Z-8.125 C70.738 F565.534 +X35.387 Y-15.252 Z-8.126 C69.219 F558.7127 +X35.501 Y-15.207 C67.658 F551.0357 +X35.608 Y-15.161 Z-8.127 C66.056 F542.4096 +X35.76 Y-15.09 C63.57 F352.7002 +X35.906 Y-15.013 Z-8.126 C61.04 F348.3943 +X36.052 Y-14.928 Z-8.125 C58.501 F347.0626 +X36.224 Y-14.817 Z-8.126 C55.626 F305.1871 +X36.552 Y-14.569 Z-8.127 C50.086 F158.3742 +X36.657 Y-14.478 Z-8.126 C48.24 F475.3159 +X36.793 Y-14.351 C45.848 F366.2424 +X36.929 Y-14.212 Z-8.124 C43.469 F367.0293 +X37.081 Y-14.044 Z-8.121 C40.855 F332.4347 +X37.176 Y-13.93 Z-8.119 C39.244 F536.3842 +X37.27 Y-13.811 Z-8.117 C37.661 F543.9049 +X37.363 Y-13.686 Z-8.115 C36.106 F551.1026 +X37.455 Y-13.555 Z-8.113 C34.577 F557.9923 +X37.589 Y-13.351 Z-8.108 C32.399 F388.8621 +X37.722 Y-13.129 Z-8.103 C30.264 F392.7982 +X37.855 Y-12.887 Z-8.095 C28.175 F396.7375 +X37.987 Y-12.625 Z-8.086 B-74.999 C26.137 F401.1251 +X38.117 Y-12.339 Z-8.075 C24.157 F406.1318 +X38.247 Y-12.028 Z-8.061 C22.238 F411.6313 +X38.373 Y-11.691 Z-8.044 B-75.0 C20.387 F417.6424 +X38.496 Y-11.327 Z-8.025 C18.606 F424.1664 +X38.616 Y-10.935 Z-8.004 C16.901 F431.2255 +X38.73 Y-10.515 Z-7.979 C15.275 F438.7898 +X38.834 Y-10.084 Z-7.954 C13.792 F466.0636 +X38.901 Y-9.779 Z-7.935 C12.837 F702.794 +X38.967 Y-9.454 Z-7.915 C11.893 F693.9853 +X39.062 Y-8.925 Z-7.88 B-74.999 C10.511 F456.6914 +X39.15 Y-8.357 Z-7.841 C9.217 F462.5521 +X39.23 Y-7.753 Z-7.798 C8.025 F472.43 +X39.301 Y-7.115 Z-7.75 B-75.0 C6.938 F482.822 +X39.363 Y-6.445 Z-7.7 C5.956 F495.5549 +X39.411 Y-5.808 Z-7.651 C5.148 F556.2817 +X39.439 Y-5.388 Z-7.615 F1419.3661 +G94 +G00 Z-6.321 +X44.25 Y-5.821 +Z5.0 +B0. +B-75.0 C123.636 +X-32.508 Y-14.734 +Z3.0 +G93 +G01 Z-3.879 F43.6112 +X-29.833 Y-10.713 Z-5.173 F60.0 +X-30.089 Y-10.541 C123.878 F1180.5569 +X-30.351 Y-10.365 C124.12 F1163.0988 +X-30.618 Y-10.182 C124.362 F1145.2228 +X-30.892 Y-9.994 C124.605 F1126.8818 +X-31.172 Y-9.8 C124.847 F1107.9838 +X-31.46 Y-9.599 C125.089 F1088.394 +X-31.755 Y-9.391 C125.331 F1068.1098 +X-32.058 Y-9.175 C125.573 F1046.8904 +X-32.37 Y-8.951 C125.815 F1024.5975 +X-32.693 Y-8.717 C126.057 F1000.9989 +X-33.027 Y-8.473 C126.298 F975.8947 +X-33.374 Y-8.216 C126.54 F947.7155 +X-33.737 Y-7.946 C126.782 F917.6999 +X-34.115 Y-7.662 C127.024 F888.7615 +X-34.51 Y-7.362 C127.266 F859.7299 +X-34.925 Y-7.046 C127.508 F829.0027 +X-35.363 Y-6.708 C127.75 F794.3037 +X-35.832 Y-6.343 C127.992 F752.9144 +X-36.337 Y-5.947 C128.233 F709.5073 +X-36.885 Y-5.513 C128.475 F664.6605 +X-37.487 Y-5.033 B-74.999 C128.717 F616.5209 +X-38.159 Y-4.492 C128.958 F562.2998 +X-38.939 Y-3.859 C129.2 F496.3652 +X-39.891 Y-3.079 C129.441 F417.5755 +X-41.192 Y-2.004 C129.682 F316.8149 +X-41.685 Y-2.006 Z-6.356 B-75.0 C129.723 F455.6355 +X-40.235 Y-3.206 B-74.999 C129.473 F285.6982 +X-39.219 Y-4.039 C129.223 F391.9291 +X-38.401 Y-4.704 C128.973 F472.0929 +X-37.701 Y-5.267 C128.723 F538.262 +X-37.078 Y-5.765 C128.473 F592.1264 +X-36.511 Y-6.213 C128.223 F639.7752 +X-35.99 Y-6.622 C127.973 F684.1693 +X-35.509 Y-6.996 Z-6.355 C127.723 F727.797 +X-35.061 Y-7.341 C127.473 F769.6805 +X-34.636 Y-7.665 C127.223 F801.5175 +X-34.229 Y-7.972 B-75.0 C126.973 F828.685 +X-33.838 Y-8.266 C126.723 F854.7232 +X-33.464 Y-8.544 C126.473 F882.1685 +X-33.106 Y-8.807 C126.223 F912.932 +X-32.763 Y-9.057 C125.973 F941.141 +X-32.433 Y-9.296 Z-6.356 C125.723 F966.7132 +X-32.113 Y-9.525 C125.473 F990.5381 +X-31.803 Y-9.745 C125.223 F1012.9539 +X-31.502 Y-9.956 C124.973 F1033.988 +X-31.209 Y-10.16 C124.723 F1053.933 +X-30.923 Y-10.357 C124.473 F1072.793 +X-30.644 Y-10.548 C124.223 F1090.6743 +X-30.371 Y-10.733 C123.973 F1107.7821 +X-30.104 Y-10.913 C123.723 F1124.0724 +X-29.842 Y-11.087 C123.473 F1139.6481 +X-29.584 Y-11.256 C123.223 F1154.5724 +X-29.331 Y-11.421 C122.973 F1168.8884 +X-29.083 Y-11.582 C122.723 F1182.646 +X-28.839 Y-11.738 C122.473 F1199.6102 +X-28.602 Y-11.888 C122.223 F1219.3922 +X-28.369 Y-12.033 C121.973 F1235.856 +X-28.141 Y-12.175 C121.723 F1250.031 +X-27.915 Y-12.314 C121.473 F1262.5378 +X-27.693 Y-12.449 C121.223 F1273.9817 +X-27.473 Y-12.581 C120.973 F1284.5292 +X-27.256 Y-12.711 Z-6.355 C120.723 F1294.4707 +X-27.041 Y-12.839 C120.473 F1304.0175 +X-26.829 Y-12.963 C120.223 F1313.3469 +X-26.618 Y-13.085 C119.973 F1322.6232 +X-26.41 Y-13.205 Z-6.354 C119.723 F1331.9971 +X-26.204 Y-13.322 C119.473 F1341.6735 +X-26.0 Y-13.436 C119.223 F1352.646 +X-25.799 Y-13.548 Z-6.353 C118.973 F1364.3391 +X-25.601 Y-13.657 C118.723 F1375.5932 +X-25.405 Y-13.763 C118.473 F1386.4414 +X-25.211 Y-13.867 C118.223 F1396.9156 +X-25.02 Y-13.969 C117.973 F1407.0365 +X-24.831 Y-14.069 Z-6.354 C117.723 F1416.8168 +X-24.643 Y-14.167 C117.473 F1426.2697 +X-24.458 Y-14.263 C117.223 F1435.3602 +X-24.275 Y-14.357 C116.973 F1444.3041 +X-24.093 Y-14.449 Z-6.355 C116.723 F1452.911 +X-23.913 Y-14.539 C116.473 F1461.2556 +X-23.734 Y-14.627 C116.223 F1469.3571 +X-23.557 Y-14.714 C115.973 F1477.2218 +X-23.382 Y-14.799 Z-6.356 C115.723 F1484.8632 +X-23.208 Y-14.883 C115.473 F1492.2944 +X-23.035 Y-14.965 C115.223 F1500.6606 +X-22.863 Y-15.045 C114.973 F1507.7172 +X-22.693 Y-15.124 C114.723 F1514.5928 +X-22.524 Y-15.202 C114.474 F1521.2871 +X-22.356 Y-15.278 C114.224 F1527.8144 +X-22.189 Y-15.353 C113.974 F1533.8475 +X-22.023 Y-15.427 C113.724 F1539.4857 +X-21.858 Y-15.499 C113.474 F1544.3957 +X-21.693 Y-15.57 C113.225 F1548.752 +X-21.529 Y-15.64 C112.975 F1552.5126 +X-21.365 Y-15.709 C112.725 F1555.7518 +X-21.202 Y-15.777 C112.475 F1558.4593 +X-21.038 Y-15.845 C112.226 F1560.645 +X-20.875 Y-15.911 C111.976 F1562.3566 +X-20.711 Y-15.977 C111.726 F1563.5537 +X-20.548 Y-16.042 C111.477 F1564.2974 +X-20.384 Y-16.106 C111.227 F1564.566 +X-20.219 Y-16.169 C110.977 F1564.3597 +X-20.054 Y-16.232 C110.727 F1563.7123 +X-19.889 Y-16.294 C110.478 F1562.6002 +X-19.722 Y-16.356 C110.228 F1561.0526 +X-19.555 Y-16.417 C109.978 F1559.0528 +X-19.387 Y-16.477 Z-6.355 C109.729 F1556.6052 +X-19.218 Y-16.537 C109.479 F1553.7125 +X-19.048 Y-16.597 C109.229 F1550.3792 +X-18.876 Y-16.656 C108.98 F1546.5945 +X-18.703 Y-16.715 C108.73 F1542.3516 +X-18.529 Y-16.773 C108.481 F1537.9425 +X-18.354 Y-16.831 C108.231 F1535.2798 +X-18.178 Y-16.889 C107.981 F1532.8621 +X-18.001 Y-16.946 C107.732 F1530.2673 +X-17.822 Y-17.003 C107.482 F1527.5246 +X-17.643 Y-17.059 C107.233 F1524.6146 +X-17.463 Y-17.115 C106.983 F1521.545 +X-17.282 Y-17.17 C106.734 F1518.3206 +X-17.099 Y-17.224 C106.484 F1514.9307 +X-16.915 Y-17.279 C106.235 F1511.4099 +X-16.73 Y-17.332 C105.985 F1507.7361 +X-16.543 Y-17.385 C105.736 F1503.9296 +X-16.356 Y-17.438 C105.486 F1500.005 +X-16.166 Y-17.49 C105.237 F1495.9749 +X-15.976 Y-17.541 C104.987 F1491.8348 +X-15.783 Y-17.592 C104.738 F1487.6334 +X-15.59 Y-17.643 C104.489 F1483.3596 +X-15.395 Y-17.692 C104.24 F1479.0533 +X-15.198 Y-17.742 Z-6.356 C103.99 F1474.7372 +X-15.0 Y-17.791 C103.741 F1470.4548 +X-14.8 Y-17.839 C103.492 F1466.266 +X-14.599 Y-17.887 C103.243 F1462.3157 +X-14.396 Y-17.934 C102.995 F1460.5585 +G94 +G00 Z5.0 +C83.102 +X19.203 Y-25.225 +Z3.0 +G93 +G01 X13.583 Y-18.772 Z-7.538 F7.3683 +X12.874 Y-18.856 C83.352 F668.7382 +X12.193 Y-18.933 C83.602 F691.1865 +X11.534 Y-19.006 C83.852 F708.0968 +X10.893 Y-19.074 C84.102 F723.3837 +X10.274 Y-19.136 C84.352 F742.8125 +X9.675 Y-19.194 C84.602 F761.6768 +X9.094 Y-19.248 C84.852 F778.8842 +X8.529 Y-19.297 C85.102 F794.8697 +X7.979 Y-19.343 C85.352 F810.0365 +X7.442 Y-19.386 C85.602 F824.6808 +X6.918 Y-19.425 B-74.999 C85.852 F839.035 +X6.406 Y-19.461 C86.102 F853.3086 +X5.906 Y-19.494 C86.352 F867.7401 +X5.418 Y-19.524 C86.602 F882.273 +X4.942 Y-19.551 C86.852 F897.4364 +X4.477 Y-19.576 C87.102 F911.0538 +X4.02 Y-19.598 C87.352 F923.5564 +X3.573 Y-19.618 C87.602 F935.9191 +X3.134 Y-19.635 C87.852 F948.1363 +X2.704 Y-19.65 C88.102 F960.2057 +X2.281 Y-19.663 C88.352 F972.1238 +X1.867 Y-19.674 C88.602 F983.7571 +X1.46 Y-19.683 C88.852 F995.42 +X1.06 Y-19.691 B-75.0 C89.102 F1006.8628 +X0.667 Y-19.696 C89.352 F1018.5373 +X0.282 Y-19.699 C89.602 F1030.2257 +X-0.097 Y-19.701 C89.852 F1041.1953 +X-0.47 C90.102 F1051.6588 +X-0.837 Y-19.7 C90.352 F1061.7852 +X-1.199 Y-19.697 C90.602 F1071.7177 +X-1.555 Y-19.692 C90.852 F1081.582 +X-1.906 Y-19.686 C91.102 F1091.4913 +X-2.251 Y-19.679 C91.352 F1101.5559 +X-2.591 Y-19.67 C91.602 F1111.9611 +X-2.925 Y-19.66 C91.852 F1122.1765 +X-3.255 Y-19.648 C92.102 F1130.6126 +X-3.581 Y-19.636 C92.352 F1138.8313 +X-3.903 Y-19.622 C92.602 F1147.389 +X-4.221 Y-19.607 C92.852 F1156.1735 +X-4.534 Y-19.591 C93.102 F1165.0615 +X-4.843 Y-19.574 C93.352 F1173.8124 +X-5.147 Y-19.555 C93.602 F1182.6688 +X-5.448 Y-19.536 C93.852 F1191.017 +X-5.745 Y-19.515 C94.102 F1199.3495 +X-6.039 Y-19.493 C94.352 F1206.9629 +X-6.329 Y-19.47 C94.602 F1214.4824 +X-6.616 Y-19.447 C94.852 F1221.1756 +X-6.899 Y-19.422 C95.102 F1228.4427 +X-7.18 Y-19.396 C95.352 F1236.1434 +X-7.457 Y-19.37 C95.602 F1244.0111 +X-7.731 Y-19.343 C95.852 F1251.4196 +X-8.001 Y-19.314 C96.102 F1258.978 +X-8.269 Y-19.285 C96.352 F1266.1353 +X-8.533 Y-19.255 C96.602 F1273.4067 +X-8.795 Y-19.224 C96.852 F1280.4391 +X-9.054 Y-19.193 Z-7.539 C97.102 F1287.2176 +X-9.31 Y-19.16 C97.352 F1294.1663 +X-9.563 Y-19.127 C97.602 F1300.8745 +X-9.813 Y-19.093 C97.852 F1307.4846 +X-10.061 Y-19.058 C98.102 F1314.0111 +X-10.307 Y-19.023 C98.352 F1320.4443 +X-10.55 Y-18.986 C98.602 F1326.7989 +X-10.79 Y-18.949 C98.852 F1333.0724 +X-11.028 Y-18.911 C99.102 F1339.2737 +X-11.264 Y-18.873 C99.352 F1345.4039 +X-11.498 Y-18.833 C99.602 F1351.4693 +X-11.729 Y-18.794 C99.852 F1356.609 +X-11.959 Y-18.754 C100.102 F1361.7168 +X-12.186 Y-18.713 C100.352 F1367.9589 +X-12.411 Y-18.672 C100.602 F1373.968 +X-12.634 Y-18.63 C100.852 F1379.4913 +X-12.855 Y-18.588 Z-7.538 C101.102 F1383.6086 +X-13.074 Y-18.544 C101.352 F1388.3088 +X-13.292 Y-18.5 C101.602 F1394.8505 +X-13.507 Y-18.455 C101.852 F1400.8281 +X-13.72 Y-18.409 C102.102 F1405.8609 +X-13.931 Y-18.363 C102.352 F1410.6661 +X-14.141 Y-18.316 C102.602 F1414.9859 +X-14.349 Y-18.269 C102.852 F1418.8992 +X-14.556 Y-18.221 C103.102 F1422.9329 +X-14.761 Y-18.173 Z-7.537 C103.352 F1426.7304 +X-14.965 Y-18.124 C103.602 F1430.501 +X-15.168 Y-18.075 C103.852 F1434.3148 +X-15.369 Y-18.025 C104.102 F1438.12 +X-15.569 Y-17.975 C104.352 F1442.2604 +X-15.767 Y-17.924 C104.602 F1446.6566 +X-15.963 Y-17.872 Z-7.536 C104.852 F1451.6127 +X-16.157 Y-17.82 C105.102 F1456.9256 +X-16.35 Y-17.767 C105.352 F1461.8621 +X-16.541 Y-17.714 C105.602 F1467.0001 +X-16.731 Y-17.661 C105.852 F1471.9078 +X-16.919 Y-17.607 Z-7.537 C106.102 F1476.7505 +X-17.105 Y-17.553 C106.352 F1481.3551 +X-17.289 Y-17.498 C106.602 F1486.1937 +X-17.473 Y-17.443 C106.852 F1490.6172 +X-17.654 Y-17.387 C107.102 F1495.3571 +X-17.834 Y-17.331 Z-7.538 C107.352 F1499.6187 +X-18.013 Y-17.275 C107.602 F1504.2418 +X-18.19 Y-17.218 C107.852 F1508.4187 +X-18.366 Y-17.161 C108.102 F1512.8765 +X-18.541 Y-17.104 C108.352 F1516.9912 +X-18.714 Y-17.046 Z-7.539 C108.602 F1521.2783 +X-18.886 Y-16.988 C108.852 F1525.076 +X-19.056 Y-16.93 C109.102 F1527.8743 +X-19.226 Y-16.871 C109.352 F1530.2115 +X-19.396 Y-16.811 C109.602 F1532.1559 +X-19.564 Y-16.751 C109.852 F1533.6802 +X-19.732 Y-16.69 C110.102 F1534.7168 +X-19.899 Y-16.628 C110.352 F1535.5891 +X-20.066 Y-16.566 C110.602 F1535.9619 +X-20.232 Y-16.503 C110.852 F1535.8045 +X-20.398 Y-16.439 C111.102 F1535.555 +X-20.564 Y-16.375 C111.352 F1534.6751 +X-20.73 Y-16.31 C111.602 F1533.6266 +X-20.896 Y-16.244 Z-7.538 C111.852 F1531.9829 +X-21.062 Y-16.177 C112.102 F1530.1564 +X-21.228 Y-16.109 C112.352 F1527.7216 +X-21.395 Y-16.04 C112.602 F1525.1169 +X-21.561 Y-15.97 C112.852 F1521.8869 +X-21.729 Y-15.899 C113.102 F1518.4506 +X-21.897 Y-15.827 Z-7.537 C113.352 F1514.4781 +X-22.065 Y-15.754 C113.602 F1509.9669 +X-22.234 Y-15.679 C113.852 F1505.2263 +X-22.405 Y-15.603 C114.102 F1499.8984 +X-22.576 Y-15.526 C114.352 F1494.1015 +X-22.748 Y-15.448 C114.602 F1488.0596 +X-22.921 Y-15.368 C114.852 F1482.6837 +X-23.095 Y-15.287 C115.102 F1477.2218 +X-23.27 Y-15.204 C115.352 F1471.615 +X-23.447 Y-15.12 C115.602 F1465.8138 +X-23.624 Y-15.034 C115.852 F1459.7202 +X-23.802 Y-14.948 C116.102 F1453.661 +X-23.982 Y-14.859 C116.352 F1447.1577 +X-24.163 Y-14.769 Z-7.538 C116.602 F1440.6108 +X-24.345 Y-14.677 C116.852 F1433.5945 +X-24.528 Y-14.584 C117.102 F1426.4671 +X-24.713 Y-14.489 C117.352 F1418.9423 +X-24.899 Y-14.392 C117.6 F1420.1702 +X-25.086 Y-14.294 C117.849 F1411.9889 +X-25.275 Y-14.194 C118.097 F1403.3193 +X-25.466 Y-14.091 C118.345 F1394.0316 +X-25.659 Y-13.987 C118.594 F1384.2472 +X-25.855 Y-13.88 C118.842 F1374.3443 +X-26.052 Y-13.77 C119.09 F1364.2358 +X-26.252 Y-13.658 C119.339 F1354.1178 +X-26.455 Y-13.544 C119.587 F1343.7762 +X-26.66 Y-13.427 C119.835 F1333.2721 +X-26.867 Y-13.307 C120.084 F1322.5935 +X-27.077 Y-13.185 C120.332 F1311.7216 +X-27.29 Y-13.06 C120.58 F1300.6075 +X-27.506 Y-12.932 C120.829 F1289.3788 +X-27.725 Y-12.801 C121.077 F1277.859 +X-27.946 Y-12.666 C121.325 F1266.0531 +X-28.171 Y-12.529 C121.574 F1254.0792 +X-28.4 Y-12.388 C121.822 F1241.754 +X-28.632 Y-12.243 C122.07 F1229.1302 +X-28.867 Y-12.095 C122.318 F1216.1241 +X-29.107 Y-11.942 C122.567 F1202.8301 +X-29.35 Y-11.786 C122.815 F1189.117 +X-29.598 Y-11.625 C123.063 F1175.096 +X-29.851 Y-11.46 C123.311 F1160.637 +X-30.108 Y-11.29 C123.56 F1145.6508 +X-30.37 Y-11.115 C123.808 F1130.0731 +X-30.638 Y-10.935 C124.056 F1113.9819 +X-30.912 Y-10.749 C124.304 F1097.1494 +X-31.193 Y-10.557 C124.552 F1079.7305 +X-31.48 Y-10.358 C124.801 F1061.424 +X-31.775 Y-10.152 C125.049 F1042.3949 +X-32.077 Y-9.939 C125.297 F1022.3321 +X-32.389 Y-9.717 C125.545 F1001.3532 +X-32.711 Y-9.486 C125.793 F979.1354 +X-33.044 Y-9.245 C126.041 F955.726 +X-33.389 Y-8.993 C126.289 F930.8337 +X-33.748 Y-8.728 C126.537 F904.7878 +X-34.122 Y-8.449 C126.785 F878.2101 +X-34.512 Y-8.156 B-74.999 C127.033 F850.3012 +X-34.921 Y-7.846 C127.281 F820.7473 +X-35.352 Y-7.516 C127.529 F789.2752 +X-35.808 Y-7.164 C127.777 F755.4718 +X-36.294 Y-6.786 C128.025 F718.8176 +X-36.818 Y-6.375 C128.273 F678.5538 +X-37.388 Y-5.923 C128.521 F633.5766 +X-38.022 Y-5.416 C128.769 F582.1292 +X-38.737 Y-4.839 C129.017 F526.6719 +X-39.573 Y-4.159 C129.264 F462.102 +X-40.62 Y-3.3 C129.512 F380.6863 +X-42.179 Y-2.008 B-75.0 C129.759 F267.0365 +G94 +G00 Z-6.244 +X-45.268 Y-5.721 +Z5.0 +B0. +B-5.545 C295.605 +X-38.238 Y-4.52 +Z3.977 +X-38.279 Y-4.606 +Z3.0 +G93 +G01 X-38.446 Y-4.956 Z-1.0 F74.6491 +X-35.486 Y-2.406 Z-1.347 F152.9543 +X-32.897 Y-0.251 Z-1.645 F177.4494 +X-30.802 Y1.417 Z-1.879 F223.1904 +X-28.947 Y2.82 Z-2.079 F257.0682 +X-27.436 Y3.902 Z-2.237 F321.5994 +X-25.892 Y4.942 Z-2.393 F321.1754 +X-24.308 Y5.934 Z-2.546 F320.0123 +X-23.095 Y6.639 Z-2.659 F426.1044 +X-21.857 Y7.308 Z-2.77 C295.606 F425.2876 +X-20.595 Y7.936 Z-2.878 F424.1469 +X-19.306 Y8.52 Z-2.983 F423.0298 +X-18.433 Y8.884 Z-3.051 F632.6563 +X-17.55 Y9.226 Z-3.118 F631.5472 +X-16.205 Y9.699 Z-3.216 F420.0519 +X-14.84 Y10.121 Z-3.31 F418.8683 +X-13.274 Y10.539 Z-3.413 F369.4562 +X-12.319 Y10.762 Z-3.472 F610.7992 +X-10.929 Y11.049 Z-3.556 F421.9864 +X-9.063 Y11.37 Z-3.662 F316.3553 +X-7.185 Y11.624 Z-3.763 F316.2401 +X-6.884 Y11.659 Z-3.779 F1974.1809 +X-6.877 F80937.4994 +X-5.772 Y11.773 Z-3.835 C295.607 F539.5796 +X-3.882 Y11.919 Z-3.928 F316.1164 +X-1.785 Y12.018 Z-4.024 F285.4908 +X0.215 Y12.056 Z-4.111 F299.7136 +X2.585 Y12.037 Z-4.209 F252.9498 +X5.214 Y11.947 Z-4.312 F227.9141 +X6.223 Y11.894 Z-4.349 F593.4067 +X6.23 Y11.893 Z-4.35 F80810.615 +X9.008 Y11.701 Z-4.449 F215.3553 +X12.082 Y11.415 Z-4.553 F194.2247 +X14.678 Y11.123 Z-4.637 F229.6195 +X18.207 Y10.663 Z-4.744 F168.4912 +X18.405 Y10.635 Z-4.75 F2994.8533 +X18.413 Y10.634 F80856.7982 +X21.661 Y10.155 Z-4.845 F182.6715 +X21.668 Y10.154 F80931.518 +X24.653 Y9.679 Z-4.929 F198.4514 +X24.66 Y9.678 F81004.2725 +X26.384 Y9.392 Z-4.976 F343.2213 +X26.391 Y9.39 F81034.5562 +X26.559 Y9.362 Z-4.981 F3523.4578 +X26.566 Y9.361 F81049.9485 +X28.267 Y9.072 Z-5.027 F347.7632 +X28.274 Y9.071 F81053.3655 +X28.74 Y8.991 Z-5.04 F1267.2415 +X28.748 Y8.99 F80979.4797 +X33.53 Y8.153 Z-5.167 F123.5382 +X34.152 Y8.002 Z-5.18 C295.608 F937.7009 +X34.288 Y7.908 Z-5.178 C295.61 F3581.4027 +X34.478 Y7.653 Z-5.164 F1889.8795 +X34.828 Y6.939 Z-5.116 C295.611 F752.3068 +X35.09 Y6.154 Z-5.058 F723.4108 +X35.215 Y5.671 Z-5.021 F1199.4997 +X35.323 Y5.171 Z-4.982 F1168.9299 +X35.452 Y4.442 Z-4.923 F807.7575 +X35.579 Y3.505 Z-4.847 F632.4046 +X35.703 Y2.191 Z-4.737 F453.0362 +X35.76 Y1.371 Z-4.667 F727.0279 +X36.26 Y1.4 Z-4.723 B-11.048 C330.498 F20.7254 +X36.749 Y1.423 Z-4.841 B-17.818 C340.903 F37.786 +X36.719 Y1.865 Z-4.878 B-17.819 C340.901 F1346.0015 +X36.64 Y2.844 Z-4.961 B-17.893 C339.779 F351.6821 +X36.581 Y3.426 Z-5.009 B-17.947 C338.964 F541.7247 +X36.439 Y4.483 Z-5.094 B-18.069 C337.089 F265.0356 +X36.33 Y5.111 Z-5.143 B-18.159 C335.664 F389.5788 +X36.219 Y5.657 Z-5.186 B-18.248 C334.183 F403.1438 +X36.07 Y6.269 Z-5.234 B-18.366 C332.149 F316.3557 +X35.906 Y6.822 Z-5.276 B-18.496 C329.799 F296.0736 +X35.725 Y7.312 Z-5.31 B-18.642 C327.049 F272.5643 +X35.578 Y7.643 Z-5.332 B-18.762 C324.62 F328.1436 +X35.441 Y7.912 Z-5.349 B-18.876 C322.118 F334.8327 +X35.315 Y8.13 Z-5.363 B-18.985 C319.523 F337.5923 +X35.093 Y8.442 Z-5.38 B-19.179 C314.079 F170.7355 +X34.914 Y8.626 Z-5.387 B-19.33 C308.477 F176.9345 +X34.758 Y8.749 Z-5.39 B-19.436 C302.174 F165.859 +X34.631 Y8.823 Z-5.396 B-19.473 C296.645 F196.2962 +X34.528 Y8.87 B-19.464 C292.386 F258.5202 +X34.255 Y8.957 Z-5.389 B-19.425 C288.14 F238.4766 +X34.036 Y9.014 Z-5.384 B-19.402 C286.519 F553.3283 +X33.62 Y9.102 Z-5.374 B-19.376 C284.982 F485.515 +X33.32 Y9.159 Z-5.366 B-19.365 C284.45 F1026.389 +X33.029 Y9.21 Z-5.359 B-19.361 C284.238 F1474.54 +X33.014 Y9.213 Z-5.358 C284.232 F33428.9029 +X29.486 Y9.828 Z-5.264 B-19.358 C284.099 F164.5819 +X29.479 Y9.829 Z-5.263 F79853.0038 +X25.55 Y10.493 Z-5.158 B-19.353 C283.813 F146.1768 +X25.542 Y10.495 F78684.0154 +X24.089 Y10.732 Z-5.118 B-19.35 C283.654 F390.477 +X24.082 Y10.733 C283.653 F78528.1632 +X21.469 Y11.144 Z-5.045 B-19.342 C283.3 F216.1909 +X21.462 Y11.145 C283.299 F78268.6198 +X18.841 Y11.532 Z-4.969 B-19.332 C282.858 F214.4649 +X18.834 Y11.533 Z-4.968 C282.856 F81684.4704 +X16.198 Y11.89 Z-4.889 B-19.321 C282.32 F212.3099 +X16.191 Y11.891 C282.319 F77644.3542 +X14.011 Y12.158 Z-4.82 B-19.309 C281.799 F255.5912 +X14.004 Y12.159 C281.797 F77634.0784 +X12.248 Y12.354 Z-4.764 B-19.297 C281.327 F316.1441 +X12.241 Y12.355 C281.325 F77760.1636 +X10.483 Y12.529 Z-4.705 B-19.283 C280.806 F314.7494 +X10.476 Y12.53 C280.804 F77262.9628 +X9.591 Y12.609 Z-4.674 B-19.276 C280.524 F623.7109 +X9.584 Y12.61 C280.521 F77271.1958 +X7.457 Y12.775 Z-4.598 B-19.256 C279.793 F258.6744 +X6.266 Y12.85 Z-4.555 B-19.244 C279.349 F459.2351 +X6.259 B-19.243 C279.346 F77090.4613 +X4.929 Y12.918 Z-4.505 B-19.229 C278.819 F409.8753 +X4.922 C278.816 F77008.305 +X3.591 Y12.968 Z-4.453 B-19.213 C278.252 F406.9836 +X3.584 C278.249 F73846.4474 +X2.257 Y12.999 Z-4.4 B-19.196 C277.649 F405.4405 +X2.25 Y13.0 Z-4.399 B-19.195 C277.645 F76191.0129 +X-0.265 Y13.007 Z-4.295 B-19.157 C276.394 F210.8106 +X-1.77 Y12.974 Z-4.231 B-19.129 C275.571 F346.7971 +X-1.777 C275.567 F74820.0144 +X-3.109 Y12.921 Z-4.171 B-19.102 C274.787 F386.2807 +X-3.116 Y12.92 Z-4.17 C274.783 F73988.7148 +X-4.936 Y12.807 Z-4.083 B-19.06 C273.636 F277.4991 +X-6.249 Y12.692 Z-4.018 B-19.026 C272.743 F376.9021 +X-7.14 Y12.597 Z-3.975 B-19.0 C272.106 F547.2768 +X-7.147 Z-3.974 C272.101 F71364.0271 +X-8.473 Y12.429 Z-3.904 B-18.96 C271.099 F360.8863 +X-8.48 Y12.428 C271.093 F70446.7604 +X-9.794 Y12.228 Z-3.83 B-18.916 C270.032 F355.258 +X-9.801 Y12.226 C270.026 F69282.4317 +X-11.112 Y11.989 Z-3.753 B-18.868 C268.895 F347.1623 +X-11.121 Y11.987 Z-3.752 C268.886 F46764.0042 +X-12.415 Y11.72 Z-3.674 B-18.816 C267.697 F341.9406 +X-12.428 Y11.717 B-18.815 C267.685 F34312.6747 +X-13.716 Y11.417 Z-3.594 B-18.756 C266.425 F333.4722 +X-13.728 Y11.414 Z-3.593 B-18.755 C266.412 F34378.574 +X-15.011 Y11.077 Z-3.512 B-18.689 C265.077 F324.3563 +X-15.023 Y11.074 Z-3.511 C265.064 F33557.1927 +X-16.302 Y10.695 Z-3.426 B-18.615 C263.646 F314.0155 +X-16.314 Y10.691 Z-3.425 C263.632 F32413.0602 +X-17.417 Y10.326 Z-3.346 B-18.546 C262.339 F352.0554 +X-18.179 Y10.049 Z-3.29 B-18.496 C261.409 F496.3687 +X-19.303 Y9.604 Z-3.204 B-18.417 C259.991 F327.3913 +X-20.158 Y9.233 Z-3.135 B-18.355 C258.886 F419.8371 +X-21.616 Y8.538 Z-3.012 B-18.246 C257.001 F240.5038 +X-22.51 Y8.076 Z-2.935 B-18.18 C255.893 F390.8079 +X-22.516 Y8.073 B-18.179 C255.886 F61693.4874 +X-23.714 Y7.424 Z-2.829 B-18.094 C254.53 F295.4973 +X-23.719 Y7.422 B-18.093 C254.525 F72984.8573 +X-24.894 Y6.741 Z-2.722 B-18.013 C253.286 F302.0164 +X-24.9 Y6.737 Z-2.721 C253.28 F60766.152 +X-26.042 Y6.031 Z-2.612 B-17.939 C252.152 F310.6152 +X-26.048 Y6.027 C252.146 F61596.6798 +X-27.165 Y5.296 Z-2.501 B-17.872 C251.123 F318.5311 +X-27.171 Y5.292 B-17.871 C251.117 F62070.5272 +X-28.267 Y4.539 Z-2.389 B-17.81 C250.193 F326.1476 +X-28.273 Y4.535 Z-2.388 B-17.809 C250.188 F63093.2551 +X-29.347 Y3.765 Z-2.276 B-17.754 C249.362 F335.3321 +X-29.353 Y3.76 Z-2.275 C249.358 F63758.6359 +X-30.414 Y2.971 Z-2.161 B-17.703 C248.62 F342.6697 +X-30.42 Y2.967 C248.616 F65051.256 +X-31.049 Y2.487 Z-2.091 B-17.676 C248.216 F583.3806 +X-31.055 Y2.482 B-17.675 C248.213 F64680.7161 +X-32.509 Y1.343 Z-1.929 B-17.618 C247.394 F255.4325 +X-32.515 Y1.338 Z-1.928 C247.391 F66179.6871 +X-33.535 Y0.516 Z-1.813 B-17.584 C246.903 F371.2537 +X-33.54 Y0.512 B-17.583 C246.901 F68071.2105 +X-35.565 Y-1.166 Z-1.581 B-17.528 C246.134 F191.2568 +X-35.57 Y-1.171 C246.132 F70454.6328 +X-37.85 Y-3.116 Z-1.316 B-17.488 C245.57 F176.812 +X-39.113 Y-4.213 Z-1.17 B-17.475 C245.384 F331.2891 +X-39.222 Y-4.098 Z-1.223 B-19.863 C243.22 F310.6544 +X-39.224 Y-4.096 Z-1.224 B-19.891 C243.198 F29956.3675 +X-39.431 Y-3.877 Z-1.339 B-24.517 C240.206 F206.2133 +X-39.598 Y-3.7 Z-1.457 B-28.286 C238.47 F318.4788 +X-39.748 Y-3.54 Z-1.58 B-31.66 C237.247 F410.8414 +X-37.682 Y-1.75 Z-1.822 B-31.68 C237.649 F198.2673 +X-37.672 Y-1.741 Z-1.823 C237.652 F37596.5444 +X-36.22 Y-0.507 Z-1.99 B-31.703 C238.095 F271.0022 +X-36.21 Y-0.498 Z-1.991 C238.099 F36650.4402 +X-34.212 Y1.156 Z-2.218 B-31.747 C238.945 F189.9409 +X-34.164 Y1.194 Z-2.223 B-31.749 C238.968 F7821.1115 +X-34.159 Y1.199 Z-2.224 C238.971 F70377.3058 +X-33.119 Y2.036 Z-2.34 B-31.778 C239.529 F353.2067 +X-33.113 Y2.04 Z-2.341 C239.532 F68895.8317 +X-31.437 Y3.345 Z-2.528 B-31.832 C240.602 F214.3547 +X-31.431 Y3.349 C240.606 F67607.9178 +X-30.985 Y3.687 Z-2.577 B-31.848 C240.928 F788.2881 +X-30.979 Y3.691 Z-2.578 C240.932 F66250.6148 +X-29.906 Y4.487 Z-2.692 B-31.89 C241.77 F324.6218 +X-29.901 Y4.49 Z-2.693 C241.774 F65263.8788 +X-28.809 Y5.271 Z-2.806 B-31.936 C242.72 F314.5489 +X-28.804 Y5.275 Z-2.807 B-31.937 C242.724 F64657.1053 +X-27.696 Y6.035 Z-2.919 B-31.988 C243.779 F306.01 +X-27.69 Y6.038 Z-2.92 C243.784 F63609.8972 +X-26.561 Y6.777 Z-3.031 B-32.044 C244.957 F296.8189 +X-26.555 Y6.78 C244.962 F62492.0477 +X-25.395 Y7.497 Z-3.14 B-32.106 C246.264 F286.5959 +X-25.388 Y7.502 Z-3.141 C246.272 F47745.7468 +X-24.211 Y8.189 Z-3.249 B-32.172 C247.691 F280.1201 +X-24.2 Y8.195 Z-3.25 B-32.173 C247.704 F31356.7842 +X-23.003 Y8.85 Z-3.357 B-32.242 C249.247 F273.8444 +X-22.993 Y8.855 Z-3.358 B-32.243 C249.261 F30946.966 +X-22.015 Y9.355 Z-3.44 B-32.302 C250.589 F334.077 +X-20.644 Y9.998 Z-3.551 B-32.385 C252.531 F239.1373 +X-19.433 Y10.509 Z-3.643 B-32.458 C254.292 F273.3943 +X-19.422 Y10.514 Z-3.644 B-32.459 C254.308 F30215.2688 +X-18.448 Y10.893 Z-3.71 B-32.516 C255.717 F345.7404 +X-17.724 Y11.154 Z-3.763 B-32.555 C256.725 F477.1751 +X-16.607 Y11.523 Z-3.847 B-32.612 C258.212 F319.2321 +X-16.601 Y11.525 C258.22 F62148.6619 +X-15.294 Y11.919 Z-3.936 B-32.673 C259.865 F282.9438 +X-15.288 Y11.92 C259.872 F63395.2384 +X-13.974 Y12.272 Z-4.021 B-32.729 C261.429 F291.7644 +X-13.967 Y12.273 Z-4.022 C261.436 F64276.2948 +X-12.642 Y12.584 Z-4.104 B-32.78 C262.911 F299.8223 +X-12.636 Y12.586 C262.918 F65657.4621 +X-11.31 Y12.857 Z-4.183 B-32.825 C264.305 F309.5964 +X-11.297 Y12.86 Z-4.184 B-32.826 C264.318 F33437.6567 +X-9.969 Y13.094 Z-4.259 B-32.867 C265.625 F318.7286 +X-9.956 Y13.096 Z-4.26 B-32.868 C265.637 F33825.2045 +X-8.613 Y13.297 Z-4.333 B-32.905 C266.878 F324.6057 +X-8.6 Y13.299 Z-4.334 B-32.906 C266.889 F34383.4721 +X-7.264 Y13.465 Z-4.403 B-32.94 C268.048 F335.3516 +X-7.251 Y13.467 Z-4.404 C268.059 F35051.9091 +X-5.743 Y13.618 Z-4.478 B-32.975 C269.285 F304.9292 +X-4.316 Y13.727 Z-4.546 B-33.004 C270.369 F330.3696 +X-3.189 Y13.792 Z-4.599 B-33.025 C271.175 F426.4969 +X-3.176 C271.185 F36373.2644 +X-1.827 Y13.846 Z-4.659 B-33.048 C272.096 F362.9783 +X-1.814 Y13.847 Z-4.66 B-33.049 C272.105 F36615.5389 +X0.188 Y13.883 Z-4.745 B-33.079 C273.356 F250.1464 +X0.198 C273.362 F52942.2217 +X2.243 Y13.873 Z-4.826 B-33.106 C274.525 F250.5828 +X2.256 C274.532 F37524.9532 +X3.593 Y13.84 Z-4.879 B-33.122 C275.233 F389.3896 +X3.607 Z-4.88 C275.24 F38041.7201 +X4.941 Y13.789 Z-4.931 B-33.136 C275.897 F394.5309 +X4.955 Y13.788 C275.904 F38540.3172 +X6.294 Y13.72 Z-4.982 B-33.149 C276.521 F397.3321 +X6.308 Y13.719 C276.527 F38614.1237 +X7.63 Y13.636 Z-5.031 B-33.16 C277.098 F406.4694 +X7.641 Y13.635 B-33.161 C277.102 F48189.2754 +X9.97 Y13.45 Z-5.117 B-33.178 C278.02 F233.3037 +X9.976 C278.022 F79047.3957 +X10.538 Y13.398 Z-5.137 B-33.182 C278.227 F972.9464 +X10.545 Y13.397 C278.23 F79365.5126 +X12.32 Y13.221 Z-5.195 B-33.193 C278.839 F309.845 +X12.327 Y13.22 Z-5.196 C278.842 F79517.8561 +X14.095 Y13.024 Z-5.252 B-33.203 C279.392 F313.1819 +X14.102 Y13.023 C279.395 F79746.2723 +X16.296 Y12.751 Z-5.32 B-33.214 C280.004 F253.8329 +X16.303 C280.006 F79894.2296 +X18.943 Y12.392 Z-5.399 B-33.224 C280.635 F212.3566 +X18.95 Y12.391 C280.636 F80109.6935 +X21.576 Y12.005 Z-5.476 B-33.232 C281.153 F214.7644 +X21.583 Y12.004 C281.155 F79938.2888 +X24.181 Y11.595 Z-5.549 B-33.239 C281.569 F218.2719 +X24.188 Y11.594 C281.57 F80054.3027 +X25.095 Y11.447 Z-5.573 B-33.241 C281.691 F628.8446 +X25.102 Y11.446 C281.692 F80100.2155 +X29.36 Y10.732 Z-5.686 B-33.247 C282.09 F134.8581 +X29.372 Y10.73 C282.091 F46298.7717 +X33.215 Y10.059 Z-5.789 B-33.249 C282.27 F151.2317 +X33.28 Y10.047 Z-5.792 C282.309 F7444.2129 +X33.29 Y10.045 B-33.25 C282.316 F45573.2821 +X33.6 Y9.989 Z-5.8 B-33.255 C282.719 F1290.5704 +X34.181 Y9.87 Z-5.813 B-33.28 C284.705 F447.8888 +X34.479 Y9.794 Z-5.818 B-33.305 C286.834 F539.7039 +X34.684 Y9.733 Z-5.821 B-33.323 C289.12 F561.9617 +X34.817 Y9.686 Z-5.822 B-33.336 C291.409 F604.1866 +X34.911 Y9.647 B-33.344 C293.698 F632.4456 +X35.028 Y9.592 B-33.345 C296.828 F469.9827 +X35.144 Y9.529 B-33.335 C300.075 F448.3535 +X35.254 Y9.457 Z-5.82 B-33.313 C303.324 F441.1247 +X35.345 Y9.389 Z-5.817 B-33.285 C306.038 F519.2526 +X35.439 Y9.314 Z-5.816 B-33.252 C308.675 F524.6673 +X35.535 Y9.231 Z-5.814 B-33.213 C311.24 F528.6034 +X35.633 Y9.138 Z-5.813 B-33.169 C313.735 F531.2854 +X35.796 Y8.96 Z-5.809 B-33.086 C317.609 F331.3806 +X35.965 Y8.74 Z-5.802 B-32.991 C321.333 F330.5507 +X36.139 Y8.471 Z-5.788 B-32.889 C324.879 F331.5044 +X36.315 Y8.148 Z-5.768 B-32.782 C328.214 F335.138 +X36.491 Y7.768 Z-5.743 B-32.675 C331.311 F341.5038 +X36.664 Y7.33 Z-5.713 B-32.57 C334.151 F350.3606 +X36.831 Y6.834 Z-5.679 B-32.469 C336.725 F361.3269 +X36.955 Y6.416 Z-5.65 B-32.395 C338.517 F485.7177 +X37.093 Y5.889 Z-5.61 B-32.311 C340.434 F425.8766 +X37.231 Y5.242 Z-5.562 B-32.224 C342.381 F388.4876 +X37.349 Y4.556 Z-5.51 B-32.146 C344.073 F408.8862 +X37.45 Y3.815 Z-5.455 B-32.076 C345.572 F418.5299 +X37.555 Y2.855 Z-5.375 B-32.003 C347.128 F356.786 +X37.636 Y1.886 Z-5.292 B-31.943 C348.358 F388.8995 +X37.665 Y1.449 Z-5.255 F1365.7334 +X38.078 Y1.452 Z-5.544 B-39.086 C350.177 F52.6613 +X38.45 Y1.449 Z-5.883 B-46.25 C351.509 F53.7496 +X38.42 Y1.891 Z-5.92 C351.506 F1348.0345 +X38.376 Y2.443 Z-5.967 B-46.272 C350.82 F867.6284 +X38.328 Y2.952 Z-6.01 B-46.293 C350.106 F918.4307 +X38.274 Y3.472 Z-6.051 B-46.318 C349.282 F873.2265 +X38.198 Y4.083 Z-6.099 B-46.351 C348.165 F712.8357 +X38.117 Y4.658 Z-6.14 B-46.388 C346.942 F721.6649 +X38.064 Y4.984 Z-6.163 B-46.412 C346.161 F1220.2127 +X37.964 Y5.513 Z-6.201 B-46.455 C344.734 F716.7812 +X37.838 Y6.082 Z-6.242 B-46.505 C342.959 F628.1239 +X37.766 Y6.364 Z-6.264 B-46.532 C341.964 F1199.6724 +X37.622 Y6.882 Z-6.299 B-46.587 C339.885 F611.8848 +X37.487 Y7.308 Z-6.328 B-46.638 C337.878 F684.2958 +X37.346 Y7.695 Z-6.352 B-46.691 C335.743 F687.0505 +X37.2 Y8.047 Z-6.372 B-46.745 C333.469 F686.241 +X37.051 Y8.365 Z-6.389 B-46.799 C331.061 F685.6864 +X36.9 Y8.65 Z-6.403 B-46.853 C328.523 F685.5006 +X36.748 Y8.905 Z-6.413 B-46.905 C325.861 F685.7993 +X36.596 Y9.131 Z-6.421 B-46.955 C323.083 F686.5871 +X36.411 Y9.375 Z-6.43 B-47.014 C319.507 F556.5898 +X36.315 Y9.493 Z-6.432 B-47.043 C317.545 F1049.519 +X36.22 Y9.597 Z-6.436 B-47.069 C315.586 F1073.2523 +X36.127 Y9.691 Z-6.44 B-47.093 C313.629 F1095.6048 +X36.037 Y9.779 Z-6.441 B-47.115 C311.673 F1115.9547 +X35.896 Y9.899 Z-6.443 B-47.144 C308.588 F721.9909 +X35.756 Y10.007 Z-6.444 B-47.167 C305.463 F727.7654 +X35.605 Y10.11 Z-6.445 B-47.185 C302.112 F690.9919 +X35.445 Y10.204 Z-6.446 B-47.195 C298.646 F676.7545 +X35.273 Y10.29 Z-6.445 B-47.198 C295.068 F661.9916 +X35.188 Y10.329 B-47.197 C293.28 F1329.7822 +X35.098 Y10.367 Z-6.446 B-47.193 C291.55 F1343.597 +X34.995 Y10.405 Z-6.445 B-47.187 C289.878 F1335.1958 +X34.748 Y10.484 Z-6.442 B-47.174 C286.972 F700.1299 +X34.586 Y10.528 Z-6.439 B-47.166 C285.629 F1342.9031 +X34.389 Y10.578 Z-6.436 B-47.157 C284.341 F1271.4672 +X34.297 Y10.6 Z-6.435 B-47.153 C283.831 F2981.0689 +X34.076 Y10.649 Z-6.432 B-47.145 C282.831 F1373.9236 +X33.718 Y10.719 Z-6.423 B-47.137 C281.848 F1049.3401 +X33.341 Y10.787 Z-6.414 B-47.132 C281.385 F1248.9188 +X33.333 Y10.789 C281.38 F62183.5684 +X32.664 Y10.904 Z-6.391 C281.309 F866.1672 +X29.55 Y11.45 Z-6.314 B-47.13 C281.184 F188.0019 +X29.543 Y11.452 Z-6.313 F81204.019 +X25.667 Y12.107 Z-6.215 B-47.126 C280.817 F149.4618 +X25.66 Y12.109 C280.816 F81301.7747 +X24.267 Y12.334 Z-6.177 B-47.125 C280.627 F412.2999 +X24.26 Y12.336 C280.626 F81361.4266 +X21.641 Y12.745 Z-6.101 B-47.121 C280.185 F217.466 +X21.634 Y12.746 C280.184 F81302.409 +X19.01 Y13.129 Z-6.023 B-47.117 C279.631 F214.5683 +X19.003 Y13.13 C279.629 F81099.6008 +X16.363 Y13.486 Z-5.941 B-47.11 C278.957 F210.2538 +X16.357 Y13.487 C278.955 F80742.5689 +X14.17 Y13.755 Z-5.871 B-47.103 C278.308 F250.3215 +X14.164 Y13.756 C278.306 F80539.452 +X12.385 Y13.953 Z-5.814 B-47.096 C277.717 F303.7742 +X12.378 Y13.954 C277.715 F79718.6781 +X9.729 Y14.21 Z-5.726 B-47.083 C276.727 F200.3264 +X9.722 Y14.211 Z-5.725 C276.725 F78863.019 +X7.683 Y14.374 Z-5.654 B-47.072 C275.87 F255.3848 +X7.676 Y14.375 C275.867 F78544.8972 +X6.327 Y14.463 Z-5.607 B-47.063 C275.253 F380.4592 +X6.32 C275.25 F77792.722 +X4.961 Y14.535 Z-5.559 B-47.054 C274.591 F372.4438 +X4.954 C274.587 F77489.533 +X3.603 Y14.589 Z-5.509 B-47.044 C273.888 F369.1091 +X3.596 C273.884 F76813.7032 +X2.232 Y14.624 Z-5.456 B-47.033 C273.131 F359.7869 +X2.225 C273.127 F75884.2417 +X0.374 Y14.633 Z-5.382 B-47.018 C272.024 F259.482 +X0.367 C272.02 F74719.4369 +X-1.872 Y14.589 Z-5.283 B-46.997 C270.548 F208.1157 +X-1.885 Z-5.282 B-46.996 C270.54 F36713.6052 +X-3.255 Y14.532 Z-5.22 B-46.981 C269.565 F331.6596 +X-3.267 Y14.531 Z-5.219 C269.556 F36204.2865 +X-5.187 Y14.41 Z-5.129 B-46.956 C268.087 F230.0754 +X-7.122 Y14.231 Z-5.036 B-46.926 C266.474 F220.3745 +X-7.387 Y14.201 Z-5.024 B-46.922 C266.242 F1584.0953 +X-7.399 Y14.199 C266.232 F34912.5051 +X-8.767 Y14.03 Z-4.955 B-46.898 C264.988 F300.4979 +X-8.779 Y14.028 Z-4.954 B-46.897 C264.977 F34298.9779 +X-10.129 Y13.828 Z-4.884 B-46.871 C263.672 F295.9267 +X-10.14 Y13.826 Z-4.883 C263.66 F34039.7562 +X-11.497 Y13.588 Z-4.809 B-46.843 C262.265 F285.3808 +X-11.509 Y13.586 Z-4.808 B-46.842 C262.252 F33519.4292 +X-12.855 Y13.311 Z-4.731 B-46.811 C260.781 F278.5171 +X-12.866 Y13.309 Z-4.73 C260.768 F32887.7837 +X-14.2 Y12.996 Z-4.649 B-46.777 C259.219 F271.716 +X-14.211 Y12.993 Z-4.648 C259.206 F32266.9315 +X-15.549 Y12.636 Z-4.563 B-46.74 C257.558 F261.6144 +X-15.555 Y12.635 C257.551 F63350.8616 +X-16.888 Y12.233 Z-4.473 B-46.7 C255.813 F253.1177 +X-16.894 Y12.231 B-46.699 C255.806 F62202.4905 +X-17.978 Y11.875 Z-4.392 B-46.664 C254.324 F301.9667 +X-19.311 Y11.381 Z-4.297 B-46.616 C252.41 F236.8422 +X-20.857 Y10.741 Z-4.187 B-46.553 C250.071 F196.0762 +X-21.573 Y10.418 Z-4.133 B-46.523 C248.983 F417.4483 +X-22.897 Y9.773 Z-4.024 B-46.469 C247.081 F228.1219 +X-23.412 Y9.503 Z-3.982 B-46.449 C246.373 F590.9343 +X-23.423 Y9.497 Z-3.981 C246.359 F29457.6154 +X-24.652 Y8.827 Z-3.875 B-46.403 C244.741 F249.277 +X-24.657 Y8.825 Z-3.874 B-46.402 C244.734 F62197.117 +X-25.86 Y8.124 Z-3.767 B-46.358 C243.243 F256.977 +X-25.866 Y8.121 Z-3.766 C243.236 F59045.4407 +X-27.036 Y7.395 Z-3.657 B-46.317 C241.884 F267.3592 +X-27.041 Y7.392 Z-3.656 C241.878 F59926.5588 +X-28.188 Y6.641 Z-3.544 B-46.279 C240.653 F276.7075 +X-28.199 Y6.634 Z-3.543 C240.642 F30703.6573 +X-29.32 Y5.866 Z-3.431 B-46.245 C239.545 F288.0194 +X-29.33 Y5.859 Z-3.43 C239.536 F31463.2298 +X-30.43 Y5.073 Z-3.318 B-46.214 C238.557 F298.9587 +X-30.44 Y5.066 Z-3.316 C238.548 F31649.5393 +X-31.521 Y4.266 Z-3.204 B-46.186 C237.681 F310.2516 +X-31.526 Y4.262 Z-3.203 C237.678 F68223.093 +X-32.141 Y3.797 Z-3.137 B-46.171 C237.225 F554.7299 +X-32.146 Y3.793 Z-3.136 C237.222 F66211.8197 +X-33.648 Y2.623 Z-2.97 B-46.139 C236.24 F231.4058 +X-33.653 Y2.619 C236.236 F67469.7409 +X-34.699 Y1.778 Z-2.854 B-46.12 C235.655 F341.7678 +X-34.704 Y1.773 Z-2.853 C235.653 F68866.9361 +X-35.736 Y0.926 Z-2.737 B-46.103 C235.16 F354.6726 +X-35.741 Y0.921 Z-2.736 C235.158 F69850.9816 +X-36.758 Y0.072 Z-2.62 B-46.09 C234.749 F368.9935 +X-36.764 Y0.067 Z-2.619 C234.747 F71311.2967 +X-38.313 Y-1.252 Z-2.442 B-46.073 C234.262 F249.8612 +X-38.318 Y-1.256 Z-2.441 C234.261 F73144.0091 +X-40.311 Y-2.98 Z-2.208 B-46.061 C233.863 F203.5865 +X-40.554 Y-2.753 Z-2.591 B-53.286 C232.747 F296.5346 +X-40.765 Y-2.567 Z-3.013 B-60.521 C231.824 F316.0536 +X-38.974 Y-1.018 Z-3.223 B-60.525 C232.176 F226.0533 +X-38.964 Y-1.009 Z-3.224 C232.179 F37871.5671 +X-38.413 Y-0.537 Z-3.288 B-60.528 C232.329 F709.801 +X-38.408 Y-0.532 Z-3.289 C232.33 F74361.8537 +X-37.215 Y0.48 Z-3.425 B-60.534 C232.725 F319.937 +X-37.21 Y0.485 Z-3.426 C232.726 F72825.2116 +X-36.184 Y1.342 Z-3.542 B-60.54 C233.145 F360.8298 +X-36.179 Y1.346 Z-3.543 C233.148 F72052.5863 +X-35.14 Y2.199 Z-3.659 B-60.549 C233.651 F346.3151 +X-35.135 Y2.204 Z-3.66 C233.654 F70546.049 +X-34.084 Y3.048 Z-3.775 B-60.558 C234.246 F333.4819 +X-34.08 Y3.052 Z-3.776 C234.249 F69960.3217 +X-32.892 Y3.982 Z-3.903 B-60.571 C235.022 F286.7666 +X-32.885 Y3.987 Z-3.904 C235.026 F51550.1838 +X-31.941 Y4.706 Z-4.004 B-60.581 C235.721 F351.5514 +X-31.931 Y4.714 Z-4.005 C235.729 F33212.2844 +X-30.847 Y5.517 Z-4.118 B-60.594 C236.615 F298.9594 +X-30.837 Y5.524 Z-4.119 C236.623 F32728.7448 +X-29.727 Y6.318 Z-4.233 B-60.609 C237.625 F285.4132 +X-29.717 Y6.325 Z-4.234 C237.635 F32185.0029 +X-28.581 Y7.104 Z-4.346 B-60.625 C238.761 F272.7263 +X-28.571 Y7.11 Z-4.347 C238.771 F31680.2604 +X-27.419 Y7.862 Z-4.455 B-60.644 C240.017 F263.3842 +X-27.41 Y7.868 Z-4.456 C240.028 F32105.4451 +X-26.222 Y8.601 Z-4.561 B-60.664 C241.419 F250.5001 +X-26.213 Y8.606 Z-4.562 C241.429 F35506.3416 +X-25.002 Y9.313 Z-4.669 B-60.685 C242.948 F241.5327 +X-24.993 Y9.319 Z-4.67 C242.96 F31195.0905 +X-23.849 Y9.947 Z-4.77 B-60.705 C244.489 F251.5056 +X-23.747 Y10.0 Z-4.779 B-60.707 C244.63 F2794.3152 +X-23.738 Y10.005 Z-4.78 C244.643 F30806.167 +X-22.494 Y10.641 Z-4.882 B-60.73 C246.415 F227.4654 +X-21.287 Y11.202 Z-4.976 B-60.754 C248.207 F232.8878 +X-20.065 Y11.721 Z-5.064 B-60.777 C250.06 F230.3678 +X-18.814 Y12.2 Z-5.148 B-60.801 C251.94 F228.8286 +X-17.525 Y12.644 Z-5.231 B-60.823 C253.804 F228.6546 +X-17.144 Y12.763 Z-5.257 B-60.829 C254.333 F793.695 +X-17.133 Y12.766 C254.347 F29298.4505 +X-16.068 Y13.094 Z-5.325 B-60.845 C255.768 F290.7024 +X-15.777 Y13.175 Z-5.345 B-60.849 C256.142 F1088.4005 +X-15.771 Y13.176 Z-5.346 C256.15 F53346.7462 +X-14.498 Y13.519 Z-5.425 B-60.866 C257.74 F253.3281 +X-14.412 Y13.54 Z-5.431 B-60.867 C257.844 F3804.3334 +X-14.401 Y13.543 Z-5.432 C257.857 F30435.6909 +X-13.11 Y13.848 Z-5.51 B-60.882 C259.379 F258.6362 +X-13.033 Y13.864 Z-5.515 B-60.883 C259.467 F4403.6859 +X-13.022 Y13.867 C259.48 F30827.8978 +X-11.693 Y14.14 Z-5.592 B-60.897 C260.956 F259.9579 +X-11.649 Y14.148 Z-5.595 B-60.898 C261.005 F7808.318 +X-11.637 Y14.15 C261.017 F31231.5074 +X-10.273 Y14.391 Z-5.671 B-60.911 C262.446 F261.3423 +X-10.261 Y14.392 C262.458 F31656.9675 +X-8.884 Y14.599 Z-5.744 B-60.924 C263.818 F266.9961 +X-8.873 Y14.601 Z-5.745 C263.829 F32097.7192 +X-7.497 Y14.773 Z-5.815 B-60.935 C265.11 F275.1332 +X-7.485 Y14.774 C265.12 F32552.0814 +X-6.337 Y14.897 Z-5.869 B-60.944 C266.131 F338.2356 +X-4.801 Y15.023 Z-5.941 B-60.954 C267.409 F259.4851 +X-3.332 Y15.108 Z-6.009 B-60.963 C268.552 F278.9641 +X-3.319 Y15.109 C268.561 F33889.9477 +X-1.94 Y15.164 Z-6.069 B-60.971 C269.569 F304.5848 +X-1.928 Y15.165 C269.578 F34133.5626 +X-0.322 Y15.201 Z-6.135 B-60.98 C270.676 F268.3018 +X2.062 Y15.194 Z-6.23 B-60.99 C272.168 F186.5981 +X2.202 Y15.191 Z-6.236 B-60.991 C272.25 F3224.6653 +X2.215 Y15.19 C272.258 F35542.704 +X3.573 Y15.157 Z-6.289 B-60.996 C273.033 F336.6313 +X3.586 Y15.156 C273.04 F35967.8421 +X4.943 Y15.104 Z-6.34 B-61.001 C273.766 F343.2037 +X4.956 Y15.103 C273.773 F36169.3985 +X6.309 Y15.034 Z-6.39 B-61.005 C274.452 F350.4662 +X6.322 Y15.033 C274.458 F36544.5556 +X7.674 Y14.947 Z-6.439 B-61.009 C275.095 F356.2204 +X7.687 Y14.946 C275.101 F37004.8247 +X9.221 Y14.829 Z-6.493 B-61.013 C275.774 F319.4795 +X9.234 Y14.828 C275.779 F37137.7621 +X10.603 Y14.707 Z-6.541 B-61.016 C276.337 F363.5588 +X10.617 Y14.706 Z-6.542 C276.343 F37477.1621 +X12.401 Y14.53 Z-6.601 B-61.019 C277.014 F283.5738 +X12.415 Y14.529 C277.018 F37802.0097 +X14.196 Y14.332 Z-6.659 B-61.022 C277.627 F289.0293 +X14.202 C277.629 F83396.2845 +X16.413 Y14.058 Z-6.728 B-61.026 C278.302 F237.0327 +X16.42 Y14.057 C278.304 F77240.8248 +X19.077 Y13.696 Z-6.805 B-61.03 C279.0 F201.3043 +X19.084 Y13.695 C279.002 F78390.2213 +X21.726 Y13.305 Z-6.88 B-61.033 C279.576 F206.5627 +X21.732 Y13.304 C279.577 F79387.6531 +X24.39 Y12.887 Z-6.955 B-61.035 C280.036 F209.2549 +X24.398 Y12.886 C280.037 F70229.821 +X26.61 Y12.523 Z-7.016 B-61.036 C280.34 F254.8939 +X26.617 Y12.522 C280.341 F89580.5894 +X29.692 Y12.0 Z-7.097 B-61.037 C280.615 F186.6645 +X29.7 Y11.999 C280.616 F76080.4181 +X32.915 Y11.44 Z-7.183 B-61.038 C280.75 F181.4541 +X32.923 Y11.439 Z-7.184 F69759.7242 +X33.198 Y11.391 Z-7.191 C280.757 F2130.3496 +X33.448 Y11.347 Z-7.197 C280.839 F2149.233 +X33.802 Y11.282 Z-7.206 B-61.04 C281.305 F1191.9857 +X34.172 Y11.21 Z-7.214 B-61.044 C282.329 F870.0243 +X34.407 Y11.159 Z-7.218 B-61.048 C283.365 F1084.7911 +X34.614 Y11.107 Z-7.221 B-61.052 C284.548 F1053.6611 +X34.796 Y11.056 Z-7.224 B-61.057 C285.847 F1040.2992 +X34.956 Y11.01 Z-7.227 B-61.061 C287.249 F1030.6203 +X35.098 Y10.965 Z-7.229 B-61.064 C288.756 F1012.1992 +X35.226 Y10.921 Z-7.23 B-61.067 C290.364 F991.1011 +X35.343 Y10.876 Z-7.231 B-61.069 C292.068 F967.4179 +X35.508 Y10.804 B-61.071 C294.849 F611.7274 +X35.662 Y10.726 Z-7.229 B-61.07 C297.71 F607.1854 +X35.81 Y10.643 Z-7.227 B-61.067 C300.537 F615.7453 +X35.963 Y10.547 Z-7.226 B-61.062 C303.385 F607.4773 +X36.231 Y10.361 B-61.047 C308.243 F354.7907 +X36.339 Y10.272 Z-7.225 B-61.039 C310.274 F845.8101 +X36.446 Y10.177 B-61.03 C312.304 F844.0491 +X36.586 Y10.043 Z-7.222 B-61.016 C314.929 F650.0926 +X36.725 Y9.894 Z-7.219 B-61.0 C317.534 F649.8193 +X36.885 Y9.706 Z-7.214 B-60.98 C320.433 F577.1494 +X37.044 Y9.498 Z-7.208 B-60.959 C323.246 F586.1405 +X37.203 Y9.269 Z-7.202 B-60.937 C325.963 F596.2641 +X37.343 Y9.044 Z-7.195 B-60.916 C328.3 F678.4769 +X37.484 Y8.796 Z-7.186 B-60.895 C330.575 F681.8165 +X37.624 Y8.523 Z-7.175 B-60.873 C332.783 F684.2589 +X37.762 Y8.223 Z-7.161 B-60.85 C334.919 F686.8114 +X37.899 Y7.895 Z-7.145 B-60.827 C336.974 F689.4232 +X38.032 Y7.536 Z-7.125 B-60.804 C338.944 F692.0275 +X38.161 Y7.145 Z-7.102 B-60.782 C340.822 F694.4649 +X38.286 Y6.722 Z-7.076 B-60.76 C342.605 F696.5652 +X38.404 Y6.266 Z-7.046 B-60.738 C344.288 F698.1273 +X38.516 Y5.776 Z-7.013 B-60.718 C345.867 F698.9667 +X38.619 Y5.252 Z-6.978 B-60.698 C347.341 F698.8899 +X38.703 Y4.77 Z-6.944 B-60.681 C348.537 F802.8294 +X38.795 Y4.149 Z-6.9 B-60.662 C349.89 F657.2091 +X38.877 Y3.493 Z-6.851 B-60.644 C351.105 F659.2881 +X38.949 Y2.796 Z-6.797 B-60.629 C352.199 F652.8435 +X39.025 Y1.858 Z-6.723 B-60.612 C353.421 F509.225 +X39.054 Y1.421 Z-6.686 F1365.7332 +X39.277 Y1.398 Z-7.138 B-67.804 C354.173 F52.7173 +X39.441 Y1.369 Z-7.613 B-75.0 C354.852 F52.1148 +X39.411 Y1.811 Z-7.651 C354.85 F1345.5538 +X39.364 Y2.433 Z-7.699 C354.06 F572.0885 +X39.312 Y2.999 Z-7.742 C353.241 F593.7335 +X39.25 Y3.582 Z-7.785 B-74.999 C352.282 F542.6193 +X39.181 Y4.133 Z-7.825 C351.244 F536.3072 +X39.106 Y4.653 Z-7.861 B-75.0 C350.128 F528.9123 +X39.024 Y5.143 Z-7.894 C348.938 F522.2697 +X38.967 Y5.453 Z-7.914 C348.108 F778.22 +X38.905 Y5.76 Z-7.934 C347.226 F751.1826 +X38.841 Y6.053 Z-7.952 C346.318 F748.8457 +X38.776 Y6.333 Z-7.969 C345.384 F746.3243 +X38.708 Y6.6 Z-7.985 C344.425 F743.6188 +X38.595 Y7.007 Z-8.009 C342.814 F454.4602 +X38.477 Y7.387 Z-8.029 C341.126 F447.2511 +X38.355 Y7.741 Z-8.047 C339.359 F439.409 +X38.23 Y8.069 Z-8.062 C337.517 F431.8851 +X38.102 Y8.374 Z-8.075 C335.603 F424.7397 +X37.971 Y8.655 Z-8.086 C333.621 F418.0078 +X37.839 Y8.915 Z-8.095 C331.574 F411.6854 +X37.706 Y9.156 Z-8.102 C329.467 F405.8708 +X37.571 Y9.378 Z-8.108 C327.305 F400.4652 +X37.397 Y9.638 Z-8.114 C324.454 F307.2381 +X37.216 Y9.88 Z-8.119 C321.438 F293.6622 +X37.047 Y10.083 Z-8.122 C318.559 F310.4373 +X36.963 Y10.176 Z-8.124 C317.119 F624.9603 +X36.829 Y10.315 Z-8.125 C314.793 F388.2288 +X36.695 Y10.444 C312.444 F385.9715 +X36.559 Y10.563 Z-8.126 C310.071 F383.1777 +X36.34 Y10.735 C306.257 F238.7935 +X36.114 Y10.89 Z-8.127 C302.362 F234.0536 +X35.699 Y11.119 C295.54 F133.2539 +X35.508 Y11.205 Z-8.126 C292.572 F305.0253 +X35.383 Y11.254 Z-8.127 C290.746 F493.3197 +X35.234 Y11.307 Z-8.126 C288.922 F483.3455 +X35.05 Y11.367 Z-8.125 B-74.999 C286.964 F441.334 +X34.797 Y11.438 Z-8.123 B-75.0 C285.009 F419.6441 +X34.655 Y11.475 Z-8.121 B-74.999 C284.046 F830.2073 +X34.425 Y11.528 Z-8.118 C282.746 F591.1789 +X34.178 Y11.581 Z-8.114 B-75.0 C281.776 F718.2837 +X33.846 Y11.645 Z-8.107 B-75.001 C280.921 F703.5145 +X33.528 Y11.703 Z-8.1 B-74.999 C280.428 F963.4447 +X33.158 Y11.768 Z-8.09 B-75.0 C280.324 F1361.0686 +X30.19 Y12.285 Z-8.011 C280.217 F194.8405 +X30.183 Y12.286 F81083.5478 +X27.776 Y12.698 Z-7.946 C280.021 F233.7338 +X27.769 Y12.7 C280.02 F83018.2242 +X26.286 Y12.949 Z-7.906 C279.852 F372.1054 +X26.278 Y12.95 C279.851 F78036.094 +X25.018 Y13.157 Z-7.871 C279.678 F431.8839 +X25.011 Y13.158 C279.677 F77487.7157 +X21.611 Y13.695 Z-7.777 C279.084 F156.4304 +X21.604 Y13.696 C279.082 F74389.2434 +X18.741 Y14.116 Z-7.694 C278.431 F179.9995 +X15.731 Y14.516 Z-7.604 B-74.999 C277.595 F166.0693 +X13.884 Y14.737 Z-7.548 C277.001 F263.9258 +X13.878 C276.999 F73054.5347 +X12.396 Y14.9 Z-7.501 C276.476 F322.7 +X12.389 Y14.901 C276.473 F72890.7397 +X9.407 Y15.183 Z-7.403 B-75.0 C275.284 F155.9397 +X6.964 Y15.363 Z-7.318 C274.172 F184.1523 +X4.558 Y15.49 Z-7.231 B-74.999 C272.944 F181.076 +X2.56 Y15.553 Z-7.156 C271.816 F211.4404 +X0.226 Y15.573 Z-7.064 B-75.0 C270.362 F175.0341 +X-2.065 Y15.531 Z-6.969 C268.78 F171.7019 +X-4.185 Y15.431 Z-6.875 C267.168 F178.5776 +X-6.338 Y15.265 Z-6.777 C265.376 F169.227 +X-7.78 Y15.114 Z-6.708 B-74.999 C264.082 F244.2709 +X-9.161 Y14.936 Z-6.64 C262.764 F247.5917 +X-10.557 Y14.722 Z-6.568 C261.35 F237.8757 +X-11.93 Y14.475 Z-6.493 C259.876 F234.7003 +X-13.278 Y14.196 Z-6.417 B-75.0 C258.344 F231.6425 +X-14.602 Y13.882 Z-6.339 C256.755 F228.7456 +X-15.921 Y13.528 Z-6.259 C255.093 F223.0826 +X-17.432 Y13.07 Z-6.165 C253.059 F187.1668 +X-18.658 Y12.655 Z-6.087 C251.298 F221.8509 +X-19.861 Y12.204 Z-6.007 C249.492 F219.2315 +X-21.058 Y11.711 Z-5.922 C247.66 F216.7079 +X-22.257 Y11.169 Z-5.832 C245.837 F215.3224 +X-23.467 Y10.574 Z-5.737 C244.057 F215.3179 +X-24.695 Y9.925 Z-5.638 C242.353 F216.7215 +X-25.97 Y9.2 Z-5.532 C240.695 F213.423 +X-27.208 Y8.449 Z-5.421 B-74.999 C239.18 F223.9084 +X-28.271 Y7.769 Z-5.324 B-75.0 C237.977 F267.7079 +X-29.567 Y6.898 Z-5.201 C236.63 F225.5195 +X-30.236 Y6.429 Z-5.136 C235.981 F445.2455 +X-30.246 Y6.422 Z-5.135 C235.971 F30561.4858 +X-31.476 Y5.535 Z-5.011 C234.875 F248.4638 +X-32.905 Y4.459 Z-4.863 B-74.999 C233.755 F221.3797 +X-34.156 Y3.483 Z-4.73 C232.905 F262.276 +X-35.451 Y2.442 Z-4.589 C232.154 F262.7475 +X-36.786 Y1.342 Z-4.441 B-74.998 C231.515 F265.2297 +X-37.553 Y0.698 Z-4.354 C231.207 F476.1052 +X-37.564 Y0.689 Z-4.353 C231.203 F35272.7164 +X-38.656 Y-0.237 Z-4.228 C230.837 F344.7398 +X-38.666 Y-0.246 Z-4.227 C230.833 F35823.702 +X-40.363 Y-1.707 Z-4.03 B-74.999 C230.423 F231.7572 +X-41.081 Y-2.332 Z-3.946 C230.304 F568.6766 +G94 +G00 Z-2.652 +X-44.166 Y1.385 +Z5.0 +B0. +Z10.0 +Z10.818 + +( FINISH2 FLOWLINE SRF_MILL1 ) +G00 G54 X-44.166 Y1.385 Z10.818 +B-74.999 C230.318 +X-44.276 Y1.721 +Z10.0 +Z3.0 +G93 +G01 Z-3.879 F43.6109 +X-41.192 Y-1.996 Z-5.173 F60.0 +X-39.443 Y-0.553 C230.665 F234.1759 +X-38.827 Y-0.051 C230.833 F641.2242 +X-38.817 Y-0.042 C230.836 F37189.8454 +X-37.419 Y1.088 C231.309 F273.4246 +X-36.093 Y2.139 B-75.0 C231.882 F276.5858 +X-35.416 Y2.667 C232.223 F525.2646 +X-35.411 Y2.671 C232.226 F68633.2928 +X-33.833 Y3.874 C233.155 F218.1489 +X-32.509 Y4.85 C234.081 F249.5157 +X-31.246 Y5.749 C235.09 F252.7008 +X-29.831 Y6.714 C236.365 F218.262 +G94 +G00 Z10.0 +C257.016 +X-28.102 Y23.416 +Z3.0 +G93 +G01 X-14.387 Y13.936 Z-6.356 F8.2994 +X-15.962 Y13.543 Z-6.352 B-75.001 C255.048 F187.9741 +X-17.208 Y13.191 C253.377 F227.9221 +X-18.446 Y12.802 Z-6.355 B-75.0 C251.625 F221.5628 +X-19.648 Y12.383 Z-6.357 C249.855 F222.1155 +X-20.861 Y11.917 Z-6.359 C248.033 F216.0646 +X-22.072 Y11.406 Z-6.36 B-74.999 C246.214 F214.6647 +X-23.29 Y10.845 Z-6.358 C244.43 F214.4118 +X-24.521 Y10.231 Z-6.356 B-75.0 C242.709 F215.3624 +X-25.647 Y9.631 Z-6.354 C241.227 F240.5196 +X-26.907 Y8.917 C239.679 F220.0416 +X-28.198 Y8.14 Z-6.356 C238.216 F220.5877 +X-29.512 Y7.304 Z-6.357 C236.847 F222.5519 +X-30.902 Y6.373 Z-6.356 C235.542 F217.0683 +X-32.215 Y5.452 Z-6.355 C234.448 F237.7782 +X-33.539 Y4.488 Z-6.354 C233.479 F244.3166 +X-35.053 Y3.347 Z-6.355 B-74.999 C232.53 F221.9638 +X-36.652 Y2.103 Z-6.356 C231.713 F220.2137 +X-38.368 Y0.731 B-74.998 C231.039 F215.8718 +X-39.017 Y0.203 C230.835 F592.7917 +X-39.028 Y0.194 C230.832 F35513.1376 +X-40.817 Y-1.274 B-74.999 C230.412 F223.7249 +X-41.685 Y-1.994 B-75.0 C230.277 F481.7573 +X-42.179 Y-1.992 Z-7.538 C230.241 F456.6723 +X-40.409 Y-0.526 B-74.999 C230.533 F234.526 +X-39.222 Y0.445 C230.834 F333.1572 +X-39.213 Y0.453 C230.837 F43506.9431 +X-37.812 Y1.585 C231.31 F270.5211 +X-36.496 Y2.629 C231.877 F275.6321 +X-35.13 Y3.687 C232.597 F254.8458 +X-33.625 Y4.819 B-75.0 C233.548 F221.7031 +X-32.361 Y5.737 C234.477 F254.0994 +X-31.119 Y6.607 C235.509 F249.8268 +X-30.125 Y7.279 C236.419 F303.3609 +X-28.843 Y8.11 C237.708 F228.4967 +X-27.868 Y8.713 C238.766 F293.645 +X-26.66 Y9.427 C240.167 F231.7753 +X-25.46 Y10.094 C241.659 F228.0501 +X-24.269 Y10.716 C243.241 F224.5436 +X-23.081 Y11.294 C244.915 F220.3655 +X-21.601 Y11.953 C247.112 F173.9163 +X-20.576 Y12.37 C248.651 F251.4893 +X-19.347 Y12.828 Z-7.539 C250.468 F213.1699 +X-18.089 Y13.252 C252.273 F213.1813 +X-16.8 Y13.642 Z-7.538 C254.045 F214.2141 +X-15.473 Y13.999 Z-7.537 C255.77 F215.5862 +X-14.215 Y14.3 C257.313 F235.5284 +X-12.84 Y14.589 Z-7.538 C258.916 F222.1266 +X-11.436 Y14.845 C260.466 F224.4422 +X-9.644 Y15.116 C262.319 F182.3842 +X-8.005 Y15.314 C263.896 F206.9033 +X-6.513 Y15.456 C265.239 F234.8764 +X-4.999 Y15.564 C266.52 F238.233 +X-2.768 Y15.665 C268.266 F167.5537 +X-0.488 Y15.702 C269.886 F170.7014 +X1.913 Y15.673 C271.426 F168.5031 +X4.332 Y15.583 C272.82 F173.765 +X6.807 Y15.433 C274.095 F175.8975 +X8.998 Y15.257 C275.106 F205.0622 +X11.532 Y15.007 C276.148 F182.6972 +X12.385 Y14.911 C276.47 F553.5682 +X12.398 Y14.91 C276.475 F35736.4591 +X13.593 Y14.77 C276.901 F399.9158 +G94 +G00 Z-6.244 +X14.173 Y19.565 +Z10.0 +B0. +B-75.0 C360.0 +X44.466 Y-5.887 +Z5.0 +Z3.0 +G93 +G01 Z-7.056 F29.8332 +X39.636 Z-8.35 F60.0 +Y-3.578 F259.8332 +X39.638 Y-3.57 F78989.2007 +Y1.887 F109.9529 +G94 +G00 Z-7.055 +X44.468 +Z5.0 +B0. +Z10.0 + +G53 G49 Z30 M09 +G53 Y0. B0 C0 +M30 +% diff --git a/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc new file mode 100644 index 0000000..94c820f --- /dev/null +++ b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc @@ -0,0 +1,4508 @@ +( Impeller 5-axis 12/24/2011) +( This is preceded by cutting the external "conical" shape on a lathe) +( This is only a demo - roughing out in soft non-metal material) +G93 +S600 M3 +( --- Operation 1 ) +G0 X 16.339 Y -25.409 Z 33.353 A -71.841 C -35.930 +G0 X 7.417 Y -13.098 Z 28.366 A -71.841 C -35.930 +G1 X 6.302 Y -11.560 Z 27.743 A -71.841 C -35.930 F 318 +G1 X 6.358 Y -12.418 Z 26.178 A -71.266 C -32.919 F 159 +G1 X 6.346 Y -12.607 Z 25.858 A -71.158 C -32.304 F 159 +G1 X 6.307 Y -12.804 Z 25.552 A -71.093 C -31.715 F 159 +G1 X 6.238 Y -13.009 Z 25.262 A -71.073 C -31.151 F 159 +G1 X 6.140 Y -13.221 Z 24.986 A -71.096 C -30.614 F 159 +G1 X 6.014 Y -13.434 Z 24.729 A -71.164 C -30.107 F 159 +G1 X 5.891 Y -13.609 Z 24.534 A -71.252 C -29.718 F 159 +G1 X 5.476 Y -14.121 Z 23.987 A -71.566 C -28.632 F 159 +G1 X 4.815 Y -14.881 Z 23.162 A -71.965 C -27.052 F 159 +G1 X 4.310 Y -15.426 Z 22.558 A -72.202 C -25.935 F 159 +G1 X 3.785 Y -15.960 Z 21.956 A -72.387 C -24.870 F 159 +G1 X 3.244 Y -16.483 Z 21.354 A -72.522 C -23.855 F 159 +G1 X 2.429 Y -17.222 Z 20.484 A -72.638 C -22.463 F 159 +G1 X 1.632 Y -17.898 Z 19.669 A -72.669 C -21.233 F 159 +G1 X 0.727 Y -18.615 Z 18.778 A -72.625 C -19.964 F 159 +G1 X -0.210 Y -19.310 Z 17.890 A -72.500 C -18.780 F 159 +G1 X -0.850 Y -19.760 Z 17.302 A -72.381 C -18.024 F 159 +G1 X -1.872 Y -20.439 Z 16.396 A -71.935 C -17.384 F 159 +G1 X -2.911 Y -21.087 Z 15.512 A -71.371 C -17.097 F 159 +G1 X -3.972 Y -21.712 Z 14.638 A -70.844 C -16.828 F 159 +G1 X -5.028 Y -22.302 Z 13.797 A -70.367 C -16.583 F 159 +G1 X -6.121 Y -22.881 Z 12.954 A -69.921 C -16.352 F 159 +G1 X -7.239 Y -23.445 Z 12.117 A -69.512 C -16.140 F 159 +G1 X -8.443 Y -24.025 Z 11.258 A -68.408 C -17.485 F 159 +G1 X -9.087 Y -24.329 Z 10.817 A -67.494 C -19.003 F 159 +G1 X -9.731 Y -24.634 Z 10.377 A -66.596 C -20.528 F 159 +G1 X -10.381 Y -24.933 Z 9.946 A -65.737 C -22.068 F 159 +G1 X -11.029 Y -25.234 Z 9.515 A -64.898 C -23.611 F 159 +G1 X -11.683 Y -25.529 Z 9.094 A -64.103 C -25.160 F 159 +G1 X -12.335 Y -25.825 Z 8.674 A -63.332 C -26.705 F 159 +G1 X -13.018 Y -26.127 Z 8.248 A -62.581 C -28.312 F 159 +G1 X -13.699 Y -26.430 Z 7.823 A -61.858 C -29.909 F 159 +G1 X -15.018 Y -27.002 Z 7.027 A -60.593 C -32.959 F 159 +G1 X -16.370 Y -27.574 Z 6.238 A -59.462 C -36.012 F 159 +G1 X -17.703 Y -28.124 Z 5.489 A -58.507 C -38.930 F 159 +G1 X -18.590 Y -28.488 Z 5.002 A -57.948 C -40.822 F 159 +G1 X -19.456 Y -28.875 Z 4.516 A -57.404 C -42.675 F 159 +G1 X -20.304 Y -29.295 Z 4.026 A -56.865 C -44.507 F 159 +G1 X -20.997 Y -29.667 Z 3.618 A -56.426 C -46.020 F 159 +G1 X -21.811 Y -30.137 Z 3.134 A -55.918 C -47.811 F 159 +G1 X -23.728 Y -31.352 Z 1.937 A -54.730 C -52.054 F 159 +G1 X -23.882 Y -31.459 Z 1.837 A -54.607 C -51.977 F 636 +G1 X -24.010 Y -31.567 Z 1.743 A -54.496 C -51.906 F 636 +G1 X -24.113 Y -31.676 Z 1.655 A -54.395 C -51.842 F 636 +G1 X -24.192 Y -31.786 Z 1.574 A -54.304 C -51.784 F 636 +G1 X -24.245 Y -31.897 Z 1.500 A -54.220 C -51.731 F 636 +G1 X -24.275 Y -32.008 Z 1.432 A -54.143 C -51.682 F 636 +G1 X -24.281 Y -32.118 Z 1.371 A -54.070 C -51.635 F 636 +G1 X -24.263 Y -32.228 Z 1.317 A -53.998 C -51.590 F 636 +G1 X -24.223 Y -32.337 Z 1.270 A -53.925 C -51.543 F 636 +G1 X -24.159 Y -32.445 Z 1.230 A -53.850 C -51.494 F 636 +G1 X -24.073 Y -32.550 Z 1.198 A -53.769 C -51.442 F 636 +G1 X -23.965 Y -32.654 Z 1.172 A -53.681 C -51.385 F 636 +G1 X -23.835 Y -32.755 Z 1.154 A -53.585 C -51.323 F 636 +G1 X -23.683 Y -32.853 Z 1.143 A -53.480 C -51.255 F 636 +G1 X -23.510 Y -32.947 Z 1.139 A -53.366 C -51.181 F 636 +G1 X -23.317 Y -33.038 Z 1.143 A -53.243 C -51.100 F 636 +G1 X -23.113 Y -33.121 Z 1.153 A -53.142 C -51.034 F 636 +G1 X -22.912 Y -33.193 Z 1.170 A -53.043 C -50.969 F 636 +G1 X -22.712 Y -33.252 Z 1.192 A -52.947 C -50.905 F 636 +G1 X -22.515 Y -33.299 Z 1.221 A -52.853 C -50.843 F 636 +G1 X -22.320 Y -33.334 Z 1.256 A -52.761 C -50.782 F 636 +G1 X -22.129 Y -33.355 Z 1.297 A -52.671 C -50.722 F 636 +G1 X -21.941 Y -33.363 Z 1.344 A -52.582 C -50.662 F 636 +G1 X -21.756 Y -33.357 Z 1.398 A -52.494 C -50.603 F 636 +G1 X -21.576 Y -33.338 Z 1.457 A -52.407 C -50.545 F 636 +G1 X -21.401 Y -33.303 Z 1.524 A -52.319 C -50.486 F 636 +G1 X -21.230 Y -33.254 Z 1.596 A -52.231 C -50.427 F 636 +G1 X -21.065 Y -33.190 Z 1.676 A -52.142 C -50.367 F 636 +G1 X -20.905 Y -33.109 Z 1.761 A -52.052 C -50.305 F 636 +G1 X -20.751 Y -33.014 Z 1.853 A -51.959 C -50.242 F 636 +G1 X -20.604 Y -32.901 Z 1.952 A -51.863 C -50.176 F 636 +G1 X -20.463 Y -32.772 Z 2.058 A -51.763 C -50.108 F 636 +G1 X -19.254 Y -31.563 Z 3.017 A -53.155 C -46.358 F 159 +G1 X -18.880 Y -31.212 Z 3.301 A -53.584 C -45.229 F 159 +G1 X -18.484 Y -30.874 Z 3.589 A -54.009 C -44.087 F 159 +G1 X -18.115 Y -30.588 Z 3.846 A -54.380 C -43.061 F 159 +G1 X -17.727 Y -30.313 Z 4.104 A -54.744 C -42.018 F 159 +G1 X -17.134 Y -29.941 Z 4.476 A -55.254 C -40.486 F 159 +G1 X -16.074 Y -29.370 Z 5.099 A -56.092 C -37.843 F 159 +G1 X -14.797 Y -28.688 Z 5.868 A -57.235 C -34.613 F 159 +G1 X -14.162 Y -28.344 Z 6.265 A -57.877 C -32.986 F 159 +G1 X -13.525 Y -28.001 Z 6.663 A -58.550 C -31.347 F 159 +G1 X -12.893 Y -27.655 Z 7.073 A -59.277 C -29.710 F 159 +G1 X -12.258 Y -27.310 Z 7.484 A -60.034 C -28.067 F 159 +G1 X -11.674 Y -26.988 Z 7.876 A -60.782 C -26.551 F 159 +G1 X -11.089 Y -26.666 Z 8.268 A -61.554 C -25.036 F 159 +G1 X -10.508 Y -26.342 Z 8.669 A -62.366 C -23.534 F 159 +G1 X -9.926 Y -26.020 Z 9.072 A -63.200 C -22.038 F 159 +G1 X -9.304 Y -25.671 Z 9.514 A -64.138 C -20.448 F 159 +G1 X -8.682 Y -25.323 Z 9.958 A -65.096 C -18.869 F 159 +G1 X -8.065 Y -24.973 Z 10.410 A -66.091 C -17.318 F 159 +G1 X -7.448 Y -24.626 Z 10.864 A -67.099 C -15.784 F 159 +G1 X -6.340 Y -23.980 Z 11.727 A -67.941 C -15.314 F 159 +G1 X -5.281 Y -23.339 Z 12.587 A -68.469 C -15.593 F 159 +G1 X -4.239 Y -22.684 Z 13.460 A -69.036 C -15.890 F 159 +G1 X -3.191 Y -21.997 Z 14.369 A -69.656 C -16.214 F 159 +G1 X -2.187 Y -21.309 Z 15.269 A -70.298 C -16.546 F 159 +G1 X -1.310 Y -20.681 Z 16.081 A -70.898 C -16.861 F 159 +G1 X -0.467 Y -20.047 Z 16.893 A -71.355 C -17.515 F 159 +G1 X 0.439 Y -19.327 Z 17.800 A -71.634 C -18.679 F 159 +G1 X 1.320 Y -18.588 Z 18.715 A -71.841 C -19.915 F 159 +G1 X 2.169 Y -17.832 Z 19.633 A -71.964 C -21.235 F 159 +G1 X 2.887 Y -17.153 Z 20.443 A -72.003 C -22.463 F 159 +G1 X 3.675 Y -16.358 Z 21.371 A -71.958 C -23.956 F 159 +G1 X 4.424 Y -15.546 Z 22.302 A -71.807 C -25.554 F 159 +G1 X 4.903 Y -14.993 Z 22.925 A -71.639 C -26.685 F 159 +G1 X 5.365 Y -14.432 Z 23.549 A -71.425 C -27.853 F 159 +G1 X 5.952 Y -13.669 Z 24.385 A -71.059 C -29.475 F 159 +G1 X 6.126 Y -13.414 Z 24.670 A -70.942 C -30.040 F 159 +G1 X 6.292 Y -13.128 Z 25.013 A -70.850 C -30.717 F 159 +G1 X 6.424 Y -12.845 Z 25.376 A -70.803 C -31.434 F 159 +G1 X 6.521 Y -12.569 Z 25.758 A -70.799 C -32.188 F 159 +G1 X 6.587 Y -12.302 Z 26.157 A -70.837 C -32.977 F 159 +G1 X 6.719 Y -11.084 Z 28.149 A -71.108 C -36.914 F 159 +G1 X 6.718 Y -11.024 Z 28.255 A -71.228 C -36.831 F 636 +G1 X 6.700 Y -10.985 Z 28.343 A -71.325 C -36.765 F 636 +G1 X 6.666 Y -10.965 Z 28.411 A -71.403 C -36.711 F 636 +G1 X 6.643 Y -10.962 Z 28.438 A -71.438 C -36.687 F 636 +G1 X 6.617 Y -10.965 Z 28.461 A -71.472 C -36.664 F 636 +G1 X 6.555 Y -10.983 Z 28.490 A -71.542 C -36.616 F 636 +G1 X 6.481 Y -11.021 Z 28.500 A -71.625 C -36.559 F 636 +G1 X 6.396 Y -11.076 Z 28.490 A -71.726 C -36.490 F 636 +G1 X 6.300 Y -11.148 Z 28.459 A -71.849 C -36.406 F 636 +G1 X 6.205 Y -11.229 Z 28.413 A -71.947 C -36.339 F 636 +G1 X 6.121 Y -11.308 Z 28.358 A -72.042 C -36.274 F 636 +G1 X 6.050 Y -11.386 Z 28.293 A -72.134 C -36.212 F 636 +G1 X 5.992 Y -11.462 Z 28.219 A -72.224 C -36.151 F 636 +G1 X 5.948 Y -11.535 Z 28.134 A -72.312 C -36.091 F 636 +G1 X 5.921 Y -11.605 Z 28.040 A -72.402 C -36.030 F 636 +G1 X 5.910 Y -11.671 Z 27.935 A -72.494 C -35.968 F 636 +G1 X 5.917 Y -11.732 Z 27.820 A -72.591 C -35.902 F 636 +G1 X 6.139 Y -12.524 Z 26.198 A -71.673 C -32.860 F 159 +G1 X 6.161 Y -12.641 Z 25.971 A -71.541 C -32.438 F 159 +G1 X 6.163 Y -12.765 Z 25.751 A -71.439 C -32.028 F 159 +G1 X 6.132 Y -12.961 Z 25.439 A -71.345 C -31.436 F 159 +G1 X 6.059 Y -13.167 Z 25.146 A -71.320 C -30.873 F 159 +G1 X 5.947 Y -13.380 Z 24.877 A -71.361 C -30.348 F 159 +G1 X 5.798 Y -13.593 Z 24.635 A -71.467 C -29.864 F 159 +G1 X 5.388 Y -14.068 Z 24.140 A -71.812 C -28.867 F 159 +G1 X 4.731 Y -14.775 Z 23.390 A -72.274 C -27.404 F 159 +G1 X 4.197 Y -15.311 Z 22.807 A -72.583 C -26.305 F 159 +G1 X 3.645 Y -15.834 Z 22.224 A -72.840 C -25.254 F 159 +G1 X 3.074 Y -16.344 Z 21.643 A -73.047 C -24.254 F 159 +G1 X 2.486 Y -16.841 Z 21.063 A -73.208 C -23.301 F 159 +G1 X 1.882 Y -17.324 Z 20.484 A -73.327 C -22.390 F 159 +G1 X 1.044 Y -17.954 Z 19.707 A -73.428 C -21.225 F 159 +G1 X 0.081 Y -18.626 Z 18.846 A -73.476 C -19.985 F 159 +G1 X -0.916 Y -19.271 Z 17.988 A -73.424 C -18.876 F 159 +G1 X -1.885 Y -19.853 Z 17.182 A -73.237 C -18.065 F 159 +G1 X -2.966 Y -20.457 Z 16.321 A -72.769 C -17.807 F 159 +G1 X -4.072 Y -21.031 Z 15.468 A -72.330 C -17.585 F 159 +G1 X -5.197 Y -21.577 Z 14.628 A -71.930 C -17.383 F 159 +G1 X -6.112 Y -21.993 Z 13.965 A -71.638 C -17.235 F 159 +G1 X -7.039 Y -22.392 Z 13.308 A -71.373 C -17.100 F 159 +G1 X -8.215 Y -22.869 Z 12.499 A -71.076 C -16.948 F 159 +G1 X -9.511 Y -23.377 Z 11.647 A -69.689 C -19.191 F 159 +G1 X -10.182 Y -23.630 Z 11.219 A -68.867 C -20.673 F 159 +G1 X -10.851 Y -23.885 Z 10.793 A -68.063 C -22.154 F 159 +G1 X -11.524 Y -24.131 Z 10.375 A -67.299 C -23.635 F 159 +G1 X -12.197 Y -24.377 Z 9.958 A -66.555 C -25.109 F 159 +G1 X -12.874 Y -24.615 Z 9.550 A -65.855 C -26.578 F 159 +G1 X -13.550 Y -24.854 Z 9.142 A -65.177 C -28.035 F 159 +G1 X -14.856 Y -25.296 Z 8.377 A -63.981 C -30.799 F 159 +G1 X -15.956 Y -25.655 Z 7.749 A -63.077 C -33.068 F 159 +G1 X -16.746 Y -25.901 Z 7.312 A -62.494 C -34.656 F 159 +G1 X -17.533 Y -26.147 Z 6.876 A -61.941 C -36.212 F 159 +G1 X -18.906 Y -26.555 Z 6.142 A -61.101 C -38.833 F 159 +G1 X -20.051 Y -26.885 Z 5.550 A -60.502 C -40.933 F 159 +G1 X -21.192 Y -27.213 Z 4.960 A -59.956 C -42.956 F 159 +G1 X -23.005 Y -27.766 Z 4.036 A -59.193 C -46.067 F 159 +G1 X -24.574 Y -28.263 Z 3.254 A -58.640 C -48.642 F 159 +G1 X -26.697 Y -29.042 Z 2.140 A -57.888 C -52.060 F 159 +G1 X -26.957 Y -29.146 Z 1.999 A -57.699 C -51.996 F 636 +G1 X -27.196 Y -29.258 Z 1.860 A -57.519 C -51.935 F 636 +G1 X -27.413 Y -29.379 Z 1.725 A -57.348 C -51.876 F 636 +G1 X -27.608 Y -29.507 Z 1.592 A -57.185 C -51.820 F 636 +G1 X -27.783 Y -29.642 Z 1.463 A -57.030 C -51.767 F 636 +G1 X -27.937 Y -29.784 Z 1.336 A -56.883 C -51.716 F 636 +G1 X -28.071 Y -29.932 Z 1.213 A -56.741 C -51.666 F 636 +G1 X -28.185 Y -30.086 Z 1.093 A -56.604 C -51.619 F 636 +G1 X -28.279 Y -30.245 Z 0.976 A -56.472 C -51.573 F 636 +G1 X -28.354 Y -30.410 Z 0.863 A -56.344 C -51.528 F 636 +G1 X -28.410 Y -30.578 Z 0.754 A -56.217 C -51.483 F 636 +G1 X -28.447 Y -30.751 Z 0.648 A -56.093 C -51.439 F 636 +G1 X -28.465 Y -30.928 Z 0.547 A -55.970 C -51.396 F 636 +G1 X -28.465 Y -31.107 Z 0.449 A -55.846 C -51.352 F 636 +G1 X -28.448 Y -31.290 Z 0.355 A -55.722 C -51.307 F 636 +G1 X -28.413 Y -31.475 Z 0.265 A -55.596 C -51.263 F 636 +G1 X -28.361 Y -31.661 Z 0.179 A -55.468 C -51.217 F 636 +G1 X -28.291 Y -31.849 Z 0.098 A -55.338 C -51.170 F 636 +G1 X -28.206 Y -32.038 Z 0.021 A -55.204 C -51.122 F 636 +G1 X -28.104 Y -32.228 Z -0.051 A -55.067 C -51.072 F 636 +G1 X -27.985 Y -32.417 Z -0.119 A -54.926 C -51.021 F 636 +G1 X -27.852 Y -32.607 Z -0.182 A -54.781 C -50.968 F 636 +G1 X -27.703 Y -32.795 Z -0.241 A -54.632 C -50.913 F 636 +G1 X -27.538 Y -32.983 Z -0.294 A -54.479 C -50.857 F 636 +G1 X -27.359 Y -33.168 Z -0.342 A -54.321 C -50.799 F 636 +G1 X -27.166 Y -33.352 Z -0.386 A -54.158 C -50.738 F 636 +G1 X -26.958 Y -33.533 Z -0.424 A -53.990 C -50.676 F 636 +G1 X -26.737 Y -33.711 Z -0.457 A -53.818 C -50.612 F 636 +G1 X -26.502 Y -33.885 Z -0.484 A -53.641 C -50.545 F 636 +G1 X -26.253 Y -34.056 Z -0.506 A -53.459 C -50.476 F 636 +G1 X -25.992 Y -34.223 Z -0.522 A -53.272 C -50.406 F 636 +G1 X -25.718 Y -34.384 Z -0.533 A -53.081 C -50.333 F 636 +G1 X -25.437 Y -34.540 Z -0.538 A -52.916 C -50.269 F 636 +G1 X -25.154 Y -34.689 Z -0.538 A -52.751 C -50.206 F 636 +G1 X -24.869 Y -34.830 Z -0.533 A -52.588 C -50.143 F 636 +G1 X -24.583 Y -34.964 Z -0.523 A -52.425 C -50.080 F 636 +G1 X -24.296 Y -35.090 Z -0.508 A -52.264 C -50.017 F 636 +G1 X -24.008 Y -35.207 Z -0.488 A -52.104 C -49.954 F 636 +G1 X -23.721 Y -35.315 Z -0.463 A -51.946 C -49.892 F 636 +G1 X -23.433 Y -35.415 Z -0.433 A -51.789 C -49.830 F 636 +G1 X -23.147 Y -35.504 Z -0.397 A -51.634 C -49.768 F 636 +G1 X -22.862 Y -35.584 Z -0.356 A -51.481 C -49.707 F 636 +G1 X -22.578 Y -35.654 Z -0.310 A -51.329 C -49.647 F 636 +G1 X -22.297 Y -35.713 Z -0.259 A -51.179 C -49.586 F 636 +G1 X -22.018 Y -35.762 Z -0.203 A -51.031 C -49.526 F 636 +G1 X -21.742 Y -35.799 Z -0.141 A -50.885 C -49.467 F 636 +G1 X -21.469 Y -35.824 Z -0.074 A -50.741 C -49.408 F 636 +G1 X -21.200 Y -35.838 Z -0.002 A -50.598 C -49.349 F 636 +G1 X -20.935 Y -35.839 Z 0.075 A -50.456 C -49.291 F 636 +G1 X -20.675 Y -35.827 Z 0.158 A -50.316 C -49.233 F 636 +G1 X -20.419 Y -35.803 Z 0.247 A -50.177 C -49.176 F 636 +G1 X -20.169 Y -35.765 Z 0.340 A -50.039 C -49.118 F 636 +G1 X -19.925 Y -35.713 Z 0.440 A -49.901 C -49.061 F 636 +G1 X -19.687 Y -35.647 Z 0.544 A -49.764 C -49.003 F 636 +G1 X -19.455 Y -35.567 Z 0.654 A -49.627 C -48.945 F 636 +G1 X -19.231 Y -35.472 Z 0.770 A -49.489 C -48.886 F 636 +G1 X -19.013 Y -35.362 Z 0.891 A -49.350 C -48.827 F 636 +G1 X -18.804 Y -35.236 Z 1.017 A -49.209 C -48.767 F 636 +G1 X -18.603 Y -35.094 Z 1.149 A -49.066 C -48.706 F 636 +G1 X -18.411 Y -34.937 Z 1.287 A -48.921 C -48.643 F 636 +G1 X -18.228 Y -34.762 Z 1.430 A -48.772 C -48.579 F 636 +G1 X -18.054 Y -34.571 Z 1.579 A -48.620 C -48.512 F 636 +G1 X -17.891 Y -34.362 Z 1.733 A -48.463 C -48.444 F 636 +G1 X -17.737 Y -34.136 Z 1.893 A -48.302 C -48.373 F 636 +G1 X -16.823 Y -32.682 Z 2.900 A -50.315 C -44.245 F 159 +G1 X -16.704 Y -32.501 Z 3.027 A -50.578 C -43.729 F 159 +G1 X -16.441 Y -32.150 Z 3.283 A -51.085 C -42.682 F 159 +G1 X -16.143 Y -31.818 Z 3.540 A -51.565 C -41.608 F 159 +G1 X -15.809 Y -31.504 Z 3.797 A -52.016 C -40.501 F 159 +G1 X -15.439 Y -31.212 Z 4.051 A -52.433 C -39.363 F 159 +G1 X -14.327 Y -30.471 Z 4.755 A -53.548 C -36.134 F 159 +G1 X -13.615 Y -30.002 Z 5.209 A -54.325 C -34.064 F 159 +G1 X -13.010 Y -29.600 Z 5.611 A -55.055 C -32.299 F 159 +G1 X -12.403 Y -29.198 Z 6.015 A -55.820 C -30.533 F 159 +G1 X -11.801 Y -28.797 Z 6.431 A -56.642 C -28.785 F 159 +G1 X -11.197 Y -28.398 Z 6.849 A -57.496 C -27.043 F 159 +G1 X -10.599 Y -27.998 Z 7.277 A -58.403 C -25.325 F 159 +G1 X -9.999 Y -27.600 Z 7.708 A -59.339 C -23.620 F 159 +G1 X -9.385 Y -27.190 Z 8.164 A -60.355 C -21.890 F 159 +G1 X -8.770 Y -26.782 Z 8.621 A -61.395 C -20.181 F 159 +G1 X -8.179 Y -26.387 Z 9.075 A -62.445 C -18.561 F 159 +G1 X -7.588 Y -25.994 Z 9.530 A -63.512 C -16.964 F 159 +G1 X -7.003 Y -25.602 Z 9.994 A -64.611 C -15.409 F 159 +G1 X -6.425 Y -25.216 Z 10.454 A -65.628 C -14.069 F 159 +G1 X -5.415 Y -24.506 Z 11.322 A -66.256 C -14.411 F 159 +G1 X -4.420 Y -23.790 Z 12.204 A -66.919 C -14.768 F 159 +G1 X -3.442 Y -23.066 Z 13.101 A -67.618 C -15.141 F 159 +G1 X -2.472 Y -22.323 Z 14.021 A -68.358 C -15.533 F 159 +G1 X -1.538 Y -21.584 Z 14.937 A -69.116 C -15.931 F 159 +G1 X -0.645 Y -20.851 Z 15.844 A -69.871 C -16.363 F 159 +G1 X 0.233 Y -20.093 Z 16.777 A -70.391 C -17.361 F 159 +G1 X 1.080 Y -19.327 Z 17.712 A -70.779 C -18.545 F 159 +G1 X 1.898 Y -18.548 Z 18.653 A -71.062 C -19.860 F 159 +G1 X 2.688 Y -17.755 Z 19.599 A -71.271 C -21.233 F 159 +G1 X 3.377 Y -17.024 Z 20.462 A -71.384 C -22.554 F 159 +G1 X 4.082 Y -16.232 Z 21.386 A -71.415 C -24.051 F 159 +G1 X 4.776 Y -15.396 Z 22.348 A -71.336 C -25.712 F 159 +G1 X 5.431 Y -14.549 Z 23.312 A -71.142 C -27.471 F 159 +G1 X 5.906 Y -13.891 Z 24.051 A -70.918 C -28.876 F 159 +G1 X 6.200 Y -13.456 Z 24.540 A -70.740 C -29.831 F 159 +G1 X 6.374 Y -13.167 Z 24.876 A -70.634 C -30.497 F 159 +G1 X 6.530 Y -12.878 Z 25.223 A -70.542 C -31.191 F 159 +G1 X 6.666 Y -12.592 Z 25.580 A -70.462 C -31.912 F 159 +G1 X 6.838 Y -12.169 Z 26.133 A -70.362 C -33.037 F 159 +G1 X 7.180 Y -10.880 Z 28.012 A -70.183 C -36.819 F 159 +G1 X 7.193 Y -10.818 Z 28.107 A -70.304 C -36.780 F 636 +G1 X 7.194 Y -10.765 Z 28.197 A -70.414 C -36.744 F 636 +G1 X 7.185 Y -10.721 Z 28.282 A -70.515 C -36.712 F 636 +G1 X 7.165 Y -10.687 Z 28.360 A -70.607 C -36.682 F 636 +G1 X 7.137 Y -10.661 Z 28.433 A -70.694 C -36.654 F 636 +G1 X 7.099 Y -10.645 Z 28.499 A -70.776 C -36.628 F 636 +G1 X 7.053 Y -10.637 Z 28.559 A -70.856 C -36.602 F 636 +G1 X 6.999 Y -10.638 Z 28.613 A -70.936 C -36.576 F 636 +G1 X 6.937 Y -10.646 Z 28.659 A -71.019 C -36.550 F 636 +G1 X 6.868 Y -10.663 Z 28.699 A -71.104 C -36.523 F 636 +G1 X 6.793 Y -10.688 Z 28.732 A -71.194 C -36.494 F 636 +G1 X 6.712 Y -10.720 Z 28.758 A -71.290 C -36.463 F 636 +G1 X 6.625 Y -10.759 Z 28.777 A -71.393 C -36.430 F 636 +G1 X 6.533 Y -10.806 Z 28.787 A -71.502 C -36.396 F 636 +G1 X 6.437 Y -10.860 Z 28.791 A -71.618 C -36.359 F 636 +G1 X 6.337 Y -10.920 Z 28.786 A -71.741 C -36.319 F 636 +G1 X 6.141 Y -11.049 Z 28.758 A -71.955 C -36.252 F 636 +G1 X 6.050 Y -11.115 Z 28.735 A -72.058 C -36.219 F 636 +G1 X 5.965 Y -11.180 Z 28.706 A -72.159 C -36.187 F 636 +G1 X 5.886 Y -11.246 Z 28.671 A -72.258 C -36.156 F 636 +G1 X 5.813 Y -11.312 Z 28.630 A -72.354 C -36.126 F 636 +G1 X 5.747 Y -11.377 Z 28.583 A -72.448 C -36.096 F 636 +G1 X 5.688 Y -11.441 Z 28.530 A -72.541 C -36.067 F 636 +G1 X 5.638 Y -11.505 Z 28.471 A -72.632 C -36.038 F 636 +G1 X 5.595 Y -11.567 Z 28.405 A -72.722 C -36.010 F 636 +G1 X 5.562 Y -11.628 Z 28.333 A -72.812 C -35.981 F 636 +G1 X 5.538 Y -11.686 Z 28.254 A -72.904 C -35.953 F 636 +G1 X 5.524 Y -11.743 Z 28.170 A -72.997 C -35.923 F 636 +G1 X 5.521 Y -11.798 Z 28.078 A -73.094 C -35.893 F 636 +G1 X 5.528 Y -11.849 Z 27.980 A -73.194 C -35.862 F 636 +G1 X 5.547 Y -11.898 Z 27.875 A -73.300 C -35.829 F 636 +G1 X 5.922 Y -12.627 Z 26.218 A -72.073 C -32.800 F 159 +G1 X 5.972 Y -12.735 Z 25.979 A -71.881 C -32.372 F 159 +G1 X 5.995 Y -12.854 Z 25.747 A -71.735 C -31.951 F 159 +G1 X 5.991 Y -12.982 Z 25.526 A -71.634 C -31.541 F 159 +G1 X 5.962 Y -13.117 Z 25.317 A -71.579 C -31.148 F 159 +G1 X 5.914 Y -13.242 Z 25.140 A -71.566 C -30.809 F 159 +G1 X 5.847 Y -13.370 Z 24.976 A -71.587 C -30.488 F 159 +G1 X 5.714 Y -13.563 Z 24.753 A -71.678 C -30.044 F 159 +G1 X 5.661 Y -13.627 Z 24.685 A -71.725 C -29.906 F 159 +G1 X 5.190 Y -14.129 Z 24.177 A -72.152 C -28.867 F 159 +G1 X 4.646 Y -14.672 Z 23.617 A -72.581 C -27.755 F 159 +G1 X 4.082 Y -15.198 Z 23.057 A -72.966 C -26.676 F 159 +G1 X 3.498 Y -15.708 Z 22.499 A -73.302 C -25.644 F 159 +G1 X 2.895 Y -16.203 Z 21.942 A -73.588 C -24.663 F 159 +G1 X 2.274 Y -16.682 Z 21.386 A -73.829 C -23.729 F 159 +G1 X 1.636 Y -17.144 Z 20.831 A -74.029 C -22.838 F 159 +G1 X 1.000 Y -17.578 Z 20.293 A -74.187 C -22.009 F 159 +G1 X 0.342 Y -18.000 Z 19.751 A -74.313 C -21.208 F 159 +G1 X -0.341 Y -18.414 Z 19.202 A -74.415 C -20.415 F 159 +G1 X -1.040 Y -18.811 Z 18.654 A -74.467 C -19.691 F 159 +G1 X -1.903 Y -19.271 Z 17.993 A -74.490 C -18.861 F 159 +G1 X -2.648 Y -19.641 Z 17.442 A -74.310 C -18.580 F 159 +G1 X -3.794 Y -20.169 Z 16.618 A -73.959 C -18.405 F 159 +G1 X -4.964 Y -20.661 Z 15.803 A -73.645 C -18.248 F 159 +G1 X -6.153 Y -21.115 Z 15.000 A -73.369 C -18.110 F 159 +G1 X -7.362 Y -21.535 Z 14.208 A -73.131 C -17.991 F 159 +G1 X -8.636 Y -21.934 Z 13.397 A -72.921 C -17.886 F 159 +G1 X -9.947 Y -22.321 Z 12.591 A -72.031 C -19.319 F 159 +G1 X -10.639 Y -22.518 Z 12.178 A -71.279 C -20.743 F 159 +G1 X -11.330 Y -22.715 Z 11.765 A -70.545 C -22.160 F 159 +G1 X -12.719 Y -23.085 Z 10.956 A -69.169 C -24.960 F 159 +G1 X -13.891 Y -23.377 Z 10.288 A -68.103 C -27.269 F 159 +G1 X -15.213 Y -23.685 Z 9.550 A -67.007 C -29.802 F 159 +G1 X -16.612 Y -23.985 Z 8.788 A -65.970 C -32.384 F 159 +G1 X -18.158 Y -24.288 Z 7.968 A -64.967 C -35.110 F 159 +G1 X -19.561 Y -24.536 Z 7.245 A -64.181 C -37.458 F 159 +G1 X -20.966 Y -24.760 Z 6.540 A -63.504 C -39.685 F 159 +G1 X -22.372 Y -24.960 Z 5.854 A -62.929 C -41.788 F 159 +G1 X -23.780 Y -25.138 Z 5.185 A -62.447 C -43.771 F 159 +G1 X -25.192 Y -25.295 Z 4.536 A -62.049 C -45.634 F 159 +G1 X -26.606 Y -25.431 Z 3.905 A -61.729 C -47.382 F 159 +G1 X -27.806 Y -25.531 Z 3.385 A -61.511 C -48.776 F 159 +G1 X -30.046 Y -25.823 Z 2.363 A -61.061 C -51.336 F 159 +G1 X -30.293 Y -25.859 Z 2.248 A -60.899 C -51.289 F 636 +G1 X -30.530 Y -25.903 Z 2.133 A -60.743 C -51.244 F 636 +G1 X -30.756 Y -25.953 Z 2.018 A -60.591 C -51.200 F 636 +G1 X -30.972 Y -26.010 Z 1.904 A -60.444 C -51.157 F 636 +G1 X -31.178 Y -26.073 Z 1.790 A -60.301 C -51.115 F 636 +G1 X -31.374 Y -26.142 Z 1.676 A -60.162 C -51.074 F 636 +G1 X -31.559 Y -26.218 Z 1.563 A -60.027 C -51.034 F 636 +G1 X -31.734 Y -26.299 Z 1.451 A -59.896 C -50.996 F 636 +G1 X -31.900 Y -26.386 Z 1.339 A -59.768 C -50.958 F 636 +G1 X -32.056 Y -26.479 Z 1.227 A -59.644 C -50.921 F 636 +G1 X -32.202 Y -26.577 Z 1.116 A -59.522 C -50.885 F 636 +G1 X -32.338 Y -26.680 Z 1.006 A -59.402 C -50.849 F 636 +G1 X -32.465 Y -26.788 Z 0.897 A -59.286 C -50.814 F 636 +G1 X -32.583 Y -26.902 Z 0.788 A -59.171 C -50.779 F 636 +G1 X -32.691 Y -27.020 Z 0.681 A -59.058 C -50.745 F 636 +G1 X -32.790 Y -27.142 Z 0.574 A -58.946 C -50.712 F 636 +G1 X -32.879 Y -27.269 Z 0.468 A -58.836 C -50.679 F 636 +G1 X -32.960 Y -27.401 Z 0.363 A -58.727 C -50.645 F 636 +G1 X -33.032 Y -27.536 Z 0.259 A -58.618 C -50.612 F 636 +G1 X -33.094 Y -27.676 Z 0.156 A -58.510 C -50.580 F 636 +G1 X -33.148 Y -27.819 Z 0.054 A -58.402 C -50.547 F 636 +G1 X -33.194 Y -27.965 Z -0.046 A -58.295 C -50.514 F 636 +G1 X -33.230 Y -28.116 Z -0.146 A -58.187 C -50.481 F 636 +G1 X -33.259 Y -28.269 Z -0.244 A -58.079 C -50.448 F 636 +G1 X -33.278 Y -28.426 Z -0.341 A -57.971 C -50.414 F 636 +G1 X -33.290 Y -28.585 Z -0.436 A -57.862 C -50.381 F 636 +G1 X -33.293 Y -28.747 Z -0.531 A -57.752 C -50.347 F 636 +G1 X -33.288 Y -28.912 Z -0.623 A -57.641 C -50.312 F 636 +G1 X -33.276 Y -29.080 Z -0.715 A -57.529 C -50.277 F 636 +G1 X -33.255 Y -29.249 Z -0.805 A -57.416 C -50.242 F 636 +G1 X -33.226 Y -29.421 Z -0.893 A -57.302 C -50.206 F 636 +G1 X -33.190 Y -29.595 Z -0.980 A -57.186 C -50.170 F 636 +G1 X -33.146 Y -29.770 Z -1.065 A -57.069 C -50.133 F 636 +G1 X -33.094 Y -29.947 Z -1.148 A -56.951 C -50.096 F 636 +G1 X -32.968 Y -30.306 Z -1.309 A -56.709 C -50.020 F 636 +G1 X -32.814 Y -30.669 Z -1.463 A -56.462 C -49.941 F 636 +G1 X -32.631 Y -31.035 Z -1.610 A -56.207 C -49.859 F 636 +G1 X -32.420 Y -31.403 Z -1.748 A -55.946 C -49.775 F 636 +G1 X -32.182 Y -31.772 Z -1.878 A -55.679 C -49.688 F 636 +G1 X -31.918 Y -32.139 Z -1.999 A -55.405 C -49.599 F 636 +G1 X -31.629 Y -32.505 Z -2.111 A -55.125 C -49.507 F 636 +G1 X -31.315 Y -32.868 Z -2.213 A -54.838 C -49.412 F 636 +G1 X -30.978 Y -33.225 Z -2.306 A -54.546 C -49.314 F 636 +G1 X -30.617 Y -33.577 Z -2.388 A -54.248 C -49.214 F 636 +G1 X -30.233 Y -33.922 Z -2.460 A -53.944 C -49.111 F 636 +G1 X -29.828 Y -34.257 Z -2.521 A -53.635 C -49.005 F 636 +G1 X -29.402 Y -34.583 Z -2.570 A -53.321 C -48.897 F 636 +G1 X -28.956 Y -34.897 Z -2.608 A -53.002 C -48.786 F 636 +G1 X -28.491 Y -35.199 Z -2.634 A -52.678 C -48.673 F 636 +G1 X -28.011 Y -35.490 Z -2.649 A -52.394 C -48.572 F 636 +G1 X -27.522 Y -35.771 Z -2.653 A -52.107 C -48.470 F 636 +G1 X -27.026 Y -36.043 Z -2.648 A -51.821 C -48.367 F 636 +G1 X -26.522 Y -36.303 Z -2.633 A -51.533 C -48.263 F 636 +G1 X -26.014 Y -36.551 Z -2.607 A -51.246 C -48.158 F 636 +G1 X -25.501 Y -36.786 Z -2.572 A -50.960 C -48.053 F 636 +G1 X -24.986 Y -37.007 Z -2.527 A -50.675 C -47.947 F 636 +G1 X -24.469 Y -37.213 Z -2.473 A -50.392 C -47.841 F 636 +G1 X -23.952 Y -37.403 Z -2.408 A -50.111 C -47.735 F 636 +G1 X -23.436 Y -37.576 Z -2.333 A -49.833 C -47.629 F 636 +G1 X -22.922 Y -37.732 Z -2.249 A -49.558 C -47.523 F 636 +G1 X -22.411 Y -37.869 Z -2.155 A -49.287 C -47.418 F 636 +G1 X -21.905 Y -37.987 Z -2.052 A -49.019 C -47.313 F 636 +G1 X -21.406 Y -38.084 Z -1.938 A -48.756 C -47.209 F 636 +G1 X -20.913 Y -38.160 Z -1.815 A -48.496 C -47.106 F 636 +G1 X -20.429 Y -38.213 Z -1.682 A -48.241 C -47.004 F 636 +G1 X -19.954 Y -38.243 Z -1.540 A -47.991 C -46.903 F 636 +G1 X -19.490 Y -38.249 Z -1.388 A -47.745 C -46.803 F 636 +G1 X -19.039 Y -38.230 Z -1.226 A -47.503 C -46.703 F 636 +G1 X -18.818 Y -38.210 Z -1.142 A -47.383 C -46.654 F 636 +G1 X -18.601 Y -38.184 Z -1.055 A -47.265 C -46.605 F 636 +G1 X -18.387 Y -38.152 Z -0.966 A -47.147 C -46.556 F 636 +G1 X -18.178 Y -38.112 Z -0.875 A -47.030 C -46.507 F 636 +G1 X -17.972 Y -38.065 Z -0.781 A -46.913 C -46.458 F 636 +G1 X -17.770 Y -38.012 Z -0.684 A -46.798 C -46.409 F 636 +G1 X -17.573 Y -37.951 Z -0.586 A -46.682 C -46.360 F 636 +G1 X -17.380 Y -37.882 Z -0.485 A -46.567 C -46.312 F 636 +G1 X -17.192 Y -37.807 Z -0.381 A -46.453 C -46.263 F 636 +G1 X -17.009 Y -37.723 Z -0.276 A -46.338 C -46.214 F 636 +G1 X -16.830 Y -37.632 Z -0.168 A -46.224 C -46.164 F 636 +G1 X -16.656 Y -37.534 Z -0.057 A -46.109 C -46.115 F 636 +G1 X -16.488 Y -37.427 Z 0.056 A -45.994 C -46.065 F 636 +G1 X -16.325 Y -37.312 Z 0.171 A -45.878 C -46.014 F 636 +G1 X -16.168 Y -37.189 Z 0.288 A -45.761 C -45.963 F 636 +G1 X -16.016 Y -37.058 Z 0.408 A -45.644 C -45.912 F 636 +G1 X -15.871 Y -36.918 Z 0.530 A -45.525 C -45.860 F 636 +G1 X -15.731 Y -36.770 Z 0.655 A -45.405 C -45.807 F 636 +G1 X -15.597 Y -36.614 Z 0.782 A -45.284 C -45.753 F 636 +G1 X -15.470 Y -36.448 Z 0.911 A -45.161 C -45.698 F 636 +G1 X -15.349 Y -36.274 Z 1.043 A -45.035 C -45.641 F 636 +G1 X -15.235 Y -36.091 Z 1.176 A -44.908 C -45.584 F 636 +G1 X -15.128 Y -35.898 Z 1.313 A -44.778 C -45.525 F 636 +G1 X -15.028 Y -35.697 Z 1.451 A -44.645 C -45.465 F 636 +G1 X -14.934 Y -35.486 Z 1.592 A -44.509 C -45.403 F 636 +G1 X -14.848 Y -35.266 Z 1.735 A -44.371 C -45.339 F 636 +G1 X -14.255 Y -33.645 Z 2.774 A -47.126 C -41.069 F 159 +G1 X -14.186 Y -33.458 Z 2.895 A -47.454 C -40.597 F 159 +G1 X -14.049 Y -33.191 Z 3.076 A -47.910 C -39.848 F 159 +G1 X -13.872 Y -32.939 Z 3.255 A -48.321 C -39.052 F 159 +G1 X -13.653 Y -32.705 Z 3.433 A -48.684 C -38.202 F 159 +G1 X -12.741 Y -31.949 Z 4.058 A -49.856 C -35.042 F 159 +G1 X -12.083 Y -31.411 Z 4.511 A -50.764 C -32.788 F 159 +G1 X -11.517 Y -30.947 Z 4.919 A -51.623 C -30.865 F 159 +G1 X -10.949 Y -30.483 Z 5.329 A -52.522 C -28.957 F 159 +G1 X -10.387 Y -30.023 Z 5.752 A -53.481 C -27.088 F 159 +G1 X -9.823 Y -29.564 Z 6.177 A -54.475 C -25.242 F 159 +G1 X -9.264 Y -29.108 Z 6.614 A -55.523 C -23.440 F 159 +G1 X -8.703 Y -28.654 Z 7.053 A -56.599 C -21.668 F 159 +G1 X -8.092 Y -28.159 Z 7.550 A -57.837 C -19.775 F 159 +G1 X -7.480 Y -27.666 Z 8.049 A -59.100 C -17.923 F 159 +G1 X -6.874 Y -27.178 Z 8.561 A -60.408 C -16.135 F 159 +G1 X -6.268 Y -26.692 Z 9.074 A -61.731 C -14.392 F 159 +G1 X -5.244 Y -25.851 Z 9.993 A -63.458 C -12.864 F 159 +G1 X -4.317 Y -25.055 Z 10.886 A -64.269 C -13.319 F 159 +G1 X -3.404 Y -24.257 Z 11.793 A -65.108 C -13.783 F 159 +G1 X -2.507 Y -23.458 Z 12.716 A -65.974 C -14.257 F 159 +G1 X -1.425 Y -22.468 Z 13.872 A -67.078 C -14.852 F 159 +G1 X -0.654 Y -21.744 Z 14.725 A -67.904 C -15.293 F 159 +G1 X 0.184 Y -20.931 Z 15.687 A -68.762 C -15.966 F 159 +G1 X 0.980 Y -20.124 Z 16.647 A -69.338 C -17.166 F 159 +G1 X 1.754 Y -19.311 Z 17.612 A -69.829 C -18.439 F 159 +G1 X 2.503 Y -18.491 Z 18.585 A -70.233 C -19.793 F 159 +G1 X 3.223 Y -17.663 Z 19.563 A -70.546 C -21.227 F 159 +G1 X 3.811 Y -16.955 Z 20.396 A -70.737 C -22.511 F 159 +G1 X 4.258 Y -16.393 Z 21.055 A -70.835 C -23.570 F 159 +G1 X 4.901 Y -15.542 Z 22.047 A -70.885 C -25.253 F 159 +G1 X 5.508 Y -14.683 Z 23.041 A -70.814 C -27.037 F 159 +G1 X 5.965 Y -13.997 Z 23.833 A -70.677 C -28.513 F 159 +G1 X 6.469 Y -13.185 Z 24.763 A -70.411 C -30.325 F 159 +G1 X 6.809 Y -12.598 Z 25.433 A -70.140 C -31.692 F 159 +G1 X 7.131 Y -12.008 Z 26.106 A -69.806 C -33.100 F 159 +G1 X 7.679 Y -10.655 Z 27.850 A -69.177 C -36.669 F 159 +G1 X 12.967 Y -2.280 Z 27.743 A -71.841 C -87.360 F 636 +G1 X 13.673 Y -2.771 Z 26.178 A -71.266 C -84.349 F 159 +G1 X 13.813 Y -2.898 Z 25.858 A -71.158 C -83.734 F 159 +G1 X 13.943 Y -3.052 Z 25.552 A -71.093 C -83.145 F 159 +G1 X 14.060 Y -3.234 Z 25.262 A -71.073 C -82.581 F 159 +G1 X 14.164 Y -3.442 Z 24.986 A -71.096 C -82.044 F 159 +G1 X 14.253 Y -3.674 Z 24.729 A -71.164 C -81.537 F 159 +G1 X 14.313 Y -3.879 Z 24.534 A -71.252 C -81.148 F 159 +G1 X 14.455 Y -4.523 Z 23.987 A -71.566 C -80.062 F 159 +G1 X 14.637 Y -5.513 Z 23.162 A -71.965 C -78.482 F 159 +G1 X 14.747 Y -6.248 Z 22.558 A -72.202 C -77.365 F 159 +G1 X 14.838 Y -6.991 Z 21.956 A -72.387 C -76.300 F 159 +G1 X 14.910 Y -7.740 Z 21.354 A -72.522 C -75.285 F 159 +G1 X 14.980 Y -8.839 Z 20.484 A -72.638 C -73.893 F 159 +G1 X 15.011 Y -9.882 Z 19.669 A -72.669 C -72.663 F 159 +G1 X 15.007 Y -11.037 Z 18.778 A -72.625 C -71.394 F 159 +G1 X 14.966 Y -12.203 Z 17.890 A -72.500 C -70.210 F 159 +G1 X 14.919 Y -12.984 Z 17.302 A -72.381 C -69.454 F 159 +G1 X 14.813 Y -14.206 Z 16.396 A -71.935 C -68.814 F 159 +G1 X 14.672 Y -15.423 Z 15.512 A -71.371 C -68.527 F 159 +G1 X 14.499 Y -16.643 Z 14.638 A -70.844 C -68.258 F 159 +G1 X 14.302 Y -17.836 Z 13.797 A -70.367 C -68.013 F 159 +G1 X 14.073 Y -19.051 Z 12.954 A -69.921 C -67.782 F 159 +G1 X 13.817 Y -20.277 Z 12.117 A -69.512 C -67.570 F 159 +G1 X 13.520 Y -21.580 Z 11.258 A -68.408 C -68.915 F 159 +G1 X 13.355 Y -22.273 Z 10.817 A -67.494 C -70.433 F 159 +G1 X 13.193 Y -22.966 Z 10.377 A -66.596 C -71.958 F 159 +G1 X 13.022 Y -23.661 Z 9.946 A -65.737 C -73.498 F 159 +G1 X 12.853 Y -24.356 Z 9.515 A -64.898 C -75.041 F 159 +G1 X 12.676 Y -25.051 Z 9.094 A -64.103 C -76.590 F 159 +G1 X 12.501 Y -25.745 Z 8.674 A -63.332 C -78.135 F 159 +G1 X 12.311 Y -26.467 Z 8.248 A -62.581 C -79.742 F 159 +G1 X 12.124 Y -27.189 Z 7.823 A -61.858 C -81.339 F 159 +G1 X 11.748 Y -28.577 Z 7.027 A -60.593 C -84.389 F 159 +G1 X 11.352 Y -29.991 Z 6.238 A -59.462 C -87.442 F 159 +G1 X 10.952 Y -31.376 Z 5.489 A -58.507 C -90.360 F 159 +G1 X 10.682 Y -32.296 Z 5.002 A -57.948 C -92.252 F 159 +G1 X 10.445 Y -33.215 Z 4.516 A -57.404 C -94.105 F 159 +G1 X 10.245 Y -34.139 Z 4.026 A -56.865 C -95.937 F 159 +G1 X 10.104 Y -34.913 Z 3.618 A -56.426 C -97.450 F 159 +G1 X 9.964 Y -35.842 Z 3.134 A -55.918 C -99.241 F 159 +G1 X 9.719 Y -38.099 Z 1.937 A -54.730 C -103.484 F 159 +G1 X 9.706 Y -38.286 Z 1.837 A -54.607 C -103.407 F 636 +G1 X 9.711 Y -38.453 Z 1.743 A -54.496 C -103.336 F 636 +G1 X 9.732 Y -38.602 Z 1.655 A -54.395 C -103.272 F 636 +G1 X 9.769 Y -38.732 Z 1.574 A -54.304 C -103.215 F 636 +G1 X 9.822 Y -38.843 Z 1.500 A -54.220 C -103.161 F 636 +G1 X 9.890 Y -38.935 Z 1.432 A -54.143 C -103.112 F 636 +G1 X 9.973 Y -39.009 Z 1.371 A -54.070 C -103.065 F 636 +G1 X 10.070 Y -39.064 Z 1.317 A -53.998 C -103.020 F 636 +G1 X 10.181 Y -39.100 Z 1.270 A -53.926 C -102.973 F 636 +G1 X 10.304 Y -39.117 Z 1.230 A -53.850 C -102.924 F 636 +G1 X 10.441 Y -39.116 Z 1.198 A -53.769 C -102.872 F 636 +G1 X 10.589 Y -39.096 Z 1.172 A -53.681 C -102.815 F 636 +G1 X 10.749 Y -39.057 Z 1.154 A -53.585 C -102.753 F 636 +G1 X 10.920 Y -38.999 Z 1.143 A -53.480 C -102.685 F 636 +G1 X 11.102 Y -38.923 Z 1.139 A -53.366 C -102.611 F 636 +G1 X 11.293 Y -38.828 Z 1.143 A -53.243 C -102.530 F 636 +G1 X 11.485 Y -38.721 Z 1.153 A -53.142 C -102.464 F 636 +G1 X 11.667 Y -38.608 Z 1.170 A -53.043 C -102.399 F 636 +G1 X 11.838 Y -38.489 Z 1.192 A -52.947 C -102.335 F 636 +G1 X 11.998 Y -38.364 Z 1.221 A -52.853 C -102.273 F 636 +G1 X 12.146 Y -38.233 Z 1.256 A -52.761 C -102.212 F 636 +G1 X 12.282 Y -38.097 Z 1.297 A -52.671 C -102.152 F 636 +G1 X 12.406 Y -37.955 Z 1.344 A -52.582 C -102.092 F 636 +G1 X 12.516 Y -37.808 Z 1.398 A -52.494 C -102.033 F 636 +G1 X 12.613 Y -37.654 Z 1.457 A -52.407 C -101.975 F 636 +G1 X 12.695 Y -37.496 Z 1.524 A -52.319 C -101.916 F 636 +G1 X 12.763 Y -37.332 Z 1.596 A -52.231 C -101.857 F 636 +G1 X 12.816 Y -37.162 Z 1.676 A -52.142 C -101.797 F 636 +G1 X 12.853 Y -36.988 Z 1.761 A -52.052 C -101.735 F 636 +G1 X 12.874 Y -36.807 Z 1.853 A -51.959 C -101.672 F 636 +G1 X 12.878 Y -36.622 Z 1.952 A -51.863 C -101.606 F 636 +G1 X 12.865 Y -36.432 Z 2.058 A -51.763 C -101.538 F 636 +G1 X 12.673 Y -34.732 Z 3.017 A -53.155 C -97.788 F 159 +G1 X 12.632 Y -34.221 Z 3.301 A -53.584 C -96.659 F 159 +G1 X 12.615 Y -33.701 Z 3.589 A -54.009 C -95.517 F 159 +G1 X 12.621 Y -33.234 Z 3.846 A -54.380 C -94.491 F 159 +G1 X 12.648 Y -32.759 Z 4.104 A -54.744 C -93.448 F 159 +G1 X 12.727 Y -32.064 Z 4.476 A -55.254 C -91.916 F 159 +G1 X 12.941 Y -30.879 Z 5.099 A -56.092 C -89.273 F 159 +G1 X 13.204 Y -29.455 Z 5.868 A -57.235 C -86.043 F 159 +G1 X 13.331 Y -28.744 Z 6.265 A -57.877 C -84.416 F 159 +G1 X 13.460 Y -28.032 Z 6.663 A -58.550 C -82.777 F 159 +G1 X 13.584 Y -27.322 Z 7.073 A -59.277 C -81.140 F 159 +G1 X 13.710 Y -26.611 Z 7.484 A -60.034 C -79.497 F 159 +G1 X 13.822 Y -25.953 Z 7.876 A -60.782 C -77.981 F 159 +G1 X 13.935 Y -25.295 Z 8.268 A -61.554 C -76.466 F 159 +G1 X 14.044 Y -24.639 Z 8.669 A -62.366 C -74.964 F 159 +G1 X 14.155 Y -23.983 Z 9.072 A -63.200 C -73.468 F 159 +G1 X 14.270 Y -23.280 Z 9.514 A -64.138 C -71.878 F 159 +G1 X 14.386 Y -22.576 Z 9.958 A -65.096 C -70.299 F 159 +G1 X 14.497 Y -21.876 Z 10.410 A -66.091 C -68.748 F 159 +G1 X 14.610 Y -21.176 Z 10.864 A -67.099 C -67.214 F 159 +G1 X 14.796 Y -19.908 Z 11.727 A -67.941 C -66.744 F 159 +G1 X 14.955 Y -18.679 Z 12.587 A -68.469 C -67.023 F 159 +G1 X 15.092 Y -17.457 Z 13.460 A -69.036 C -67.320 F 159 +G1 X 15.209 Y -16.209 Z 14.369 A -69.656 C -67.644 F 159 +G1 X 15.297 Y -14.996 Z 15.269 A -70.298 C -67.976 F 159 +G1 X 15.352 Y -13.918 Z 16.081 A -70.898 C -68.291 F 159 +G1 X 15.383 Y -12.864 Z 16.893 A -71.355 C -68.945 F 159 +G1 X 15.385 Y -11.706 Z 17.800 A -71.634 C -70.109 F 159 +G1 X 15.356 Y -10.558 Z 18.715 A -71.841 C -71.345 F 159 +G1 X 15.294 Y -9.422 Z 19.633 A -71.964 C -72.665 F 159 +G1 X 15.211 Y -8.437 Z 20.443 A -72.003 C -73.893 F 159 +G1 X 15.081 Y -7.326 Z 21.371 A -71.958 C -75.386 F 159 +G1 X 14.913 Y -6.233 Z 22.302 A -71.807 C -76.984 F 159 +G1 X 14.779 Y -5.514 Z 22.925 A -71.639 C -78.115 F 159 +G1 X 14.628 Y -4.803 Z 23.549 A -71.425 C -79.283 F 159 +G1 X 14.398 Y -3.869 Z 24.385 A -71.059 C -80.905 F 159 +G1 X 14.307 Y -3.574 Z 24.670 A -70.942 C -81.470 F 159 +G1 X 14.187 Y -3.266 Z 25.013 A -70.850 C -82.147 F 159 +G1 X 14.047 Y -2.986 Z 25.376 A -70.803 C -82.864 F 159 +G1 X 13.893 Y -2.738 Z 25.758 A -70.799 C -83.618 F 159 +G1 X 13.725 Y -2.520 Z 26.157 A -70.837 C -84.407 F 159 +G1 X 12.855 Y -1.658 Z 28.149 A -71.108 C -88.344 F 159 +G1 X 12.807 Y -1.621 Z 28.255 A -71.228 C -88.261 F 636 +G1 X 12.765 Y -1.610 Z 28.343 A -71.325 C -88.195 F 636 +G1 X 12.729 Y -1.625 Z 28.411 A -71.403 C -88.141 F 636 +G1 X 12.713 Y -1.641 Z 28.438 A -71.438 C -88.117 F 636 +G1 X 12.698 Y -1.662 Z 28.461 A -71.472 C -88.094 F 636 +G1 X 12.674 Y -1.723 Z 28.490 A -71.542 C -88.046 F 636 +G1 X 12.657 Y -1.804 Z 28.500 A -71.625 C -87.989 F 636 +G1 X 12.647 Y -1.905 Z 28.490 A -71.726 C -87.920 F 636 +G1 X 12.644 Y -2.025 Z 28.459 A -71.849 C -87.836 F 636 +G1 X 12.648 Y -2.150 Z 28.413 A -71.947 C -87.769 F 636 +G1 X 12.658 Y -2.265 Z 28.358 A -72.042 C -87.704 F 636 +G1 X 12.674 Y -2.369 Z 28.293 A -72.134 C -87.642 F 636 +G1 X 12.697 Y -2.462 Z 28.219 A -72.224 C -87.581 F 636 +G1 X 12.727 Y -2.541 Z 28.134 A -72.312 C -87.521 F 636 +G1 X 12.765 Y -2.606 Z 28.040 A -72.402 C -87.460 F 636 +G1 X 12.809 Y -2.656 Z 27.935 A -72.494 C -87.398 F 636 +G1 X 12.862 Y -2.689 Z 27.820 A -72.591 C -87.332 F 636 +G1 X 13.620 Y -3.009 Z 26.198 A -71.673 C -84.290 F 159 +G1 X 13.724 Y -3.065 Z 25.971 A -71.541 C -83.868 F 159 +G1 X 13.823 Y -3.140 Z 25.751 A -71.439 C -83.458 F 159 +G1 X 13.957 Y -3.287 Z 25.439 A -71.345 C -82.866 F 159 +G1 X 14.073 Y -3.472 Z 25.146 A -71.320 C -82.303 F 159 +G1 X 14.169 Y -3.692 Z 24.877 A -71.361 C -81.778 F 159 +G1 X 14.243 Y -3.941 Z 24.635 A -71.467 C -81.294 F 159 +G1 X 14.358 Y -4.558 Z 24.140 A -71.812 C -80.297 F 159 +G1 X 14.502 Y -5.513 Z 23.390 A -72.274 C -78.834 F 159 +G1 X 14.588 Y -6.264 Z 22.807 A -72.583 C -77.735 F 159 +G1 X 14.652 Y -7.022 Z 22.224 A -72.840 C -76.684 F 159 +G1 X 14.695 Y -7.787 Z 21.643 A -73.047 C -75.684 F 159 +G1 X 14.717 Y -8.556 Z 21.063 A -73.208 C -74.731 F 159 +G1 X 14.718 Y -9.329 Z 20.484 A -73.327 C -73.820 F 159 +G1 X 14.688 Y -10.378 Z 19.707 A -73.428 C -72.655 F 159 +G1 X 14.613 Y -11.549 Z 18.846 A -73.476 C -71.415 F 159 +G1 X 14.496 Y -12.731 Z 17.988 A -73.424 C -70.306 F 159 +G1 X 14.347 Y -13.852 Z 17.182 A -73.237 C -69.495 F 159 +G1 X 14.145 Y -15.073 Z 16.321 A -72.769 C -69.237 F 159 +G1 X 13.905 Y -16.296 Z 15.468 A -72.330 C -69.015 F 159 +G1 X 13.629 Y -17.516 Z 14.628 A -71.930 C -68.813 F 159 +G1 X 13.385 Y -18.490 Z 13.965 A -71.638 C -68.665 F 159 +G1 X 13.119 Y -19.465 Z 13.308 A -71.373 C -68.530 F 159 +G1 X 12.758 Y -20.681 Z 12.499 A -71.076 C -68.378 F 159 +G1 X 12.347 Y -22.011 Z 11.647 A -69.689 C -70.621 F 159 +G1 X 12.127 Y -22.693 Z 11.219 A -68.867 C -72.103 F 159 +G1 X 11.909 Y -23.375 Z 10.793 A -68.063 C -73.584 F 159 +G1 X 11.681 Y -24.055 Z 10.375 A -67.299 C -75.065 F 159 +G1 X 11.455 Y -24.735 Z 9.958 A -66.555 C -76.539 F 159 +G1 X 11.219 Y -25.413 Z 9.550 A -65.855 C -78.008 F 159 +G1 X 10.984 Y -26.090 Z 9.142 A -65.177 C -79.465 F 159 +G1 X 10.515 Y -27.387 Z 8.377 A -63.981 C -82.229 F 159 +G1 X 10.110 Y -28.470 Z 7.749 A -63.077 C -84.498 F 159 +G1 X 9.810 Y -29.241 Z 7.312 A -62.494 C -86.086 F 159 +G1 X 9.512 Y -30.010 Z 6.876 A -61.941 C -87.642 F 159 +G1 X 8.975 Y -31.338 Z 6.142 A -61.101 C -90.263 F 159 +G1 X 8.519 Y -32.439 Z 5.550 A -60.502 C -92.363 F 159 +G1 X 8.064 Y -33.535 Z 4.960 A -59.956 C -94.386 F 159 +G1 X 7.366 Y -35.297 Z 4.036 A -59.193 C -97.497 F 159 +G1 X 6.776 Y -36.834 Z 3.254 A -58.640 C -100.072 F 159 +G1 X 6.061 Y -38.980 Z 2.140 A -57.888 C -103.490 F 159 +G1 X 5.980 Y -39.248 Z 1.999 A -57.699 C -103.426 F 636 +G1 X 5.920 Y -39.505 Z 1.860 A -57.519 C -103.365 F 636 +G1 X 5.879 Y -39.749 Z 1.725 A -57.348 C -103.306 F 636 +G1 X 5.857 Y -39.982 Z 1.592 A -57.185 C -103.250 F 636 +G1 X 5.853 Y -40.203 Z 1.463 A -57.030 C -103.197 F 636 +G1 X 5.868 Y -40.412 Z 1.336 A -56.883 C -103.146 F 636 +G1 X 5.901 Y -40.609 Z 1.213 A -56.741 C -103.096 F 636 +G1 X 5.950 Y -40.794 Z 1.093 A -56.604 C -103.049 F 636 +G1 X 6.016 Y -40.967 Z 0.976 A -56.472 C -103.003 F 636 +G1 X 6.098 Y -41.128 Z 0.863 A -56.344 C -102.958 F 636 +G1 X 6.195 Y -41.277 Z 0.754 A -56.217 C -102.913 F 636 +G1 X 6.307 Y -41.413 Z 0.648 A -56.093 C -102.869 F 636 +G1 X 6.434 Y -41.538 Z 0.547 A -55.970 C -102.826 F 636 +G1 X 6.574 Y -41.650 Z 0.449 A -55.846 C -102.782 F 636 +G1 X 6.727 Y -41.750 Z 0.355 A -55.722 C -102.737 F 636 +G1 X 6.894 Y -41.838 Z 0.265 A -55.596 C -102.692 F 636 +G1 X 7.072 Y -41.914 Z 0.179 A -55.468 C -102.647 F 636 +G1 X 7.262 Y -41.977 Z 0.098 A -55.338 C -102.600 F 636 +G1 X 7.464 Y -42.027 Z 0.021 A -55.204 C -102.552 F 636 +G1 X 7.675 Y -42.066 Z -0.051 A -55.067 C -102.502 F 636 +G1 X 7.897 Y -42.092 Z -0.119 A -54.926 C -102.451 F 636 +G1 X 8.129 Y -42.105 Z -0.182 A -54.781 C -102.398 F 636 +G1 X 8.369 Y -42.106 Z -0.241 A -54.632 C -102.343 F 636 +G1 X 8.618 Y -42.094 Z -0.294 A -54.479 C -102.287 F 636 +G1 X 8.875 Y -42.070 Z -0.342 A -54.321 C -102.229 F 636 +G1 X 9.139 Y -42.033 Z -0.386 A -54.158 C -102.168 F 636 +G1 X 9.410 Y -41.984 Z -0.424 A -53.990 C -102.106 F 636 +G1 X 9.687 Y -41.922 Z -0.457 A -53.818 C -102.042 F 636 +G1 X 9.970 Y -41.847 Z -0.484 A -53.641 C -101.975 F 636 +G1 X 10.258 Y -41.759 Z -0.506 A -53.459 C -101.906 F 636 +G1 X 10.551 Y -41.659 Z -0.522 A -53.272 C -101.836 F 636 +G1 X 10.849 Y -41.545 Z -0.533 A -53.081 C -101.763 F 636 +G1 X 11.146 Y -41.423 Z -0.538 A -52.916 C -101.699 F 636 +G1 X 11.439 Y -41.294 Z -0.538 A -52.751 C -101.636 F 636 +G1 X 11.727 Y -41.159 Z -0.533 A -52.588 C -101.573 F 636 +G1 X 12.010 Y -41.019 Z -0.523 A -52.425 C -101.510 F 636 +G1 X 12.287 Y -40.873 Z -0.508 A -52.264 C -101.447 F 636 +G1 X 12.558 Y -40.721 Z -0.488 A -52.104 C -101.384 F 636 +G1 X 12.822 Y -40.564 Z -0.463 A -51.946 C -101.322 F 636 +G1 X 13.079 Y -40.401 Z -0.433 A -51.789 C -101.260 F 636 +G1 X 13.328 Y -40.233 Z -0.397 A -51.634 C -101.199 F 636 +G1 X 13.568 Y -40.060 Z -0.356 A -51.481 C -101.137 F 636 +G1 X 13.799 Y -39.882 Z -0.310 A -51.329 C -101.077 F 636 +G1 X 14.021 Y -39.699 Z -0.259 A -51.179 C -101.016 F 636 +G1 X 14.233 Y -39.511 Z -0.203 A -51.031 C -100.956 F 636 +G1 X 14.434 Y -39.318 Z -0.141 A -50.885 C -100.897 F 636 +G1 X 14.624 Y -39.121 Z -0.074 A -50.741 C -100.838 F 636 +G1 X 14.802 Y -38.919 Z -0.002 A -50.598 C -100.779 F 636 +G1 X 14.968 Y -38.712 Z 0.075 A -50.456 C -100.721 F 636 +G1 X 15.122 Y -38.502 Z 0.158 A -50.316 C -100.663 F 636 +G1 X 15.262 Y -38.287 Z 0.247 A -50.177 C -100.606 F 636 +G1 X 15.388 Y -38.067 Z 0.340 A -50.039 C -100.548 F 636 +G1 X 15.500 Y -37.844 Z 0.440 A -49.901 C -100.491 F 636 +G1 X 15.597 Y -37.617 Z 0.544 A -49.764 C -100.433 F 636 +G1 X 15.678 Y -37.386 Z 0.654 A -49.627 C -100.375 F 636 +G1 X 15.744 Y -37.151 Z 0.770 A -49.489 C -100.316 F 636 +G1 X 15.793 Y -36.913 Z 0.891 A -49.350 C -100.257 F 636 +G1 X 15.825 Y -36.671 Z 1.017 A -49.209 C -100.197 F 636 +G1 X 15.840 Y -36.425 Z 1.149 A -49.066 C -100.136 F 636 +G1 X 15.836 Y -36.177 Z 1.287 A -48.921 C -100.073 F 636 +G1 X 15.814 Y -35.925 Z 1.430 A -48.772 C -100.009 F 636 +G1 X 15.773 Y -35.670 Z 1.579 A -48.620 C -99.942 F 636 +G1 X 15.712 Y -35.412 Z 1.733 A -48.463 C -99.874 F 636 +G1 X 15.630 Y -35.151 Z 1.893 A -48.302 C -99.803 F 636 +G1 X 15.064 Y -33.529 Z 2.900 A -50.315 C -95.675 F 159 +G1 X 14.996 Y -33.323 Z 3.027 A -50.578 C -95.160 F 159 +G1 X 14.886 Y -32.899 Z 3.283 A -51.085 C -94.112 F 159 +G1 X 14.812 Y -32.459 Z 3.540 A -51.565 C -93.038 F 159 +G1 X 14.775 Y -32.002 Z 3.797 A -52.016 C -91.931 F 159 +G1 X 14.778 Y -31.531 Z 4.051 A -52.433 C -90.793 F 159 +G1 X 14.892 Y -30.199 Z 4.755 A -53.548 C -87.564 F 159 +G1 X 14.969 Y -29.350 Z 5.209 A -54.325 C -85.493 F 159 +G1 X 15.031 Y -28.626 Z 5.611 A -55.055 C -83.729 F 159 +G1 X 15.096 Y -27.901 Z 6.015 A -55.820 C -81.963 F 159 +G1 X 15.158 Y -27.181 Z 6.431 A -56.642 C -80.215 F 159 +G1 X 15.221 Y -26.460 Z 6.849 A -57.496 C -78.473 F 159 +G1 X 15.282 Y -25.743 Z 7.277 A -58.403 C -76.755 F 159 +G1 X 15.345 Y -25.026 Z 7.708 A -59.339 C -75.050 F 159 +G1 X 15.407 Y -24.290 Z 8.164 A -60.355 C -73.320 F 159 +G1 X 15.472 Y -23.554 Z 8.621 A -61.395 C -71.611 F 159 +G1 X 15.531 Y -22.846 Z 9.075 A -62.445 C -69.991 F 159 +G1 X 15.593 Y -22.139 Z 9.530 A -63.512 C -68.394 F 159 +G1 X 15.651 Y -21.437 Z 9.994 A -64.611 C -66.839 F 159 +G1 X 15.709 Y -20.745 Z 10.454 A -65.628 C -65.499 F 159 +G1 X 15.784 Y -19.512 Z 11.322 A -66.256 C -65.841 F 159 +G1 X 15.844 Y -18.288 Z 12.204 A -66.919 C -66.198 F 159 +G1 X 15.888 Y -17.072 Z 13.101 A -67.618 C -66.571 F 159 +G1 X 15.913 Y -15.850 Z 14.021 A -68.358 C -66.963 F 159 +G1 X 15.917 Y -14.660 Z 14.937 A -69.116 C -67.361 F 159 +G1 X 15.900 Y -13.504 Z 15.844 A -69.871 C -67.793 F 159 +G1 X 15.854 Y -12.345 Z 16.777 A -70.391 C -68.791 F 159 +G1 X 15.783 Y -11.205 Z 17.712 A -70.779 C -69.975 F 159 +G1 X 15.685 Y -10.080 Z 18.653 A -71.062 C -71.290 F 159 +G1 X 15.558 Y -8.968 Z 19.599 A -71.271 C -72.663 F 159 +G1 X 15.416 Y -7.973 Z 20.462 A -71.384 C -73.984 F 159 +G1 X 15.235 Y -6.929 Z 21.386 A -71.415 C -75.481 F 159 +G1 X 15.015 Y -5.865 Z 22.348 A -71.336 C -77.142 F 159 +G1 X 14.761 Y -4.824 Z 23.312 A -71.142 C -78.901 F 159 +G1 X 14.543 Y -4.042 Z 24.051 A -70.918 C -80.306 F 159 +G1 X 14.386 Y -3.542 Z 24.540 A -70.740 C -81.261 F 159 +G1 X 14.268 Y -3.225 Z 24.876 A -70.634 C -81.927 F 159 +G1 X 14.140 Y -2.924 Z 25.223 A -70.542 C -82.621 F 159 +G1 X 14.001 Y -2.639 Z 25.580 A -70.462 C -83.342 F 159 +G1 X 13.778 Y -2.241 Z 26.133 A -70.362 C -84.467 F 159 +G1 X 12.983 Y -1.169 Z 28.012 A -70.183 C -88.249 F 159 +G1 X 12.942 Y -1.121 Z 28.107 A -70.304 C -88.210 F 636 +G1 X 12.901 Y -1.087 Z 28.197 A -70.414 C -88.174 F 636 +G1 X 12.862 Y -1.067 Z 28.282 A -70.515 C -88.142 F 636 +G1 X 12.823 Y -1.061 Z 28.360 A -70.607 C -88.112 F 636 +G1 X 12.785 Y -1.067 Z 28.433 A -70.694 C -88.084 F 636 +G1 X 12.749 Y -1.087 Z 28.499 A -70.776 C -88.058 F 636 +G1 X 12.714 Y -1.118 Z 28.559 A -70.856 C -88.032 F 636 +G1 X 12.680 Y -1.161 Z 28.613 A -70.936 C -88.006 F 636 +G1 X 12.649 Y -1.214 Z 28.659 A -71.019 C -87.980 F 636 +G1 X 12.619 Y -1.278 Z 28.699 A -71.104 C -87.953 F 636 +G1 X 12.591 Y -1.353 Z 28.732 A -71.194 C -87.924 F 636 +G1 X 12.566 Y -1.436 Z 28.758 A -71.290 C -87.893 F 636 +G1 X 12.543 Y -1.528 Z 28.777 A -71.393 C -87.860 F 636 +G1 X 12.522 Y -1.629 Z 28.787 A -71.502 C -87.826 F 636 +G1 X 12.504 Y -1.738 Z 28.791 A -71.618 C -87.789 F 636 +G1 X 12.488 Y -1.854 Z 28.786 A -71.741 C -87.749 F 636 +G1 X 12.467 Y -2.087 Z 28.758 A -71.955 C -87.682 F 636 +G1 X 12.462 Y -2.199 Z 28.735 A -72.058 C -87.649 F 636 +G1 X 12.460 Y -2.307 Z 28.706 A -72.159 C -87.617 F 636 +G1 X 12.462 Y -2.410 Z 28.671 A -72.258 C -87.586 F 636 +G1 X 12.468 Y -2.508 Z 28.630 A -72.354 C -87.556 F 636 +G1 X 12.478 Y -2.600 Z 28.583 A -72.448 C -87.526 F 636 +G1 X 12.492 Y -2.686 Z 28.530 A -72.541 C -87.497 F 636 +G1 X 12.510 Y -2.765 Z 28.471 A -72.632 C -87.468 F 636 +G1 X 12.532 Y -2.837 Z 28.405 A -72.722 C -87.440 F 636 +G1 X 12.559 Y -2.901 Z 28.333 A -72.812 C -87.411 F 636 +G1 X 12.590 Y -2.956 Z 28.254 A -72.904 C -87.383 F 636 +G1 X 12.626 Y -3.002 Z 28.170 A -72.997 C -87.353 F 636 +G1 X 12.666 Y -3.039 Z 28.078 A -73.094 C -87.323 F 636 +G1 X 12.711 Y -3.066 Z 27.980 A -73.194 C -87.292 F 636 +G1 X 12.761 Y -3.082 Z 27.875 A -73.300 C -87.259 F 636 +G1 X 13.564 Y -3.242 Z 26.218 A -72.073 C -84.230 F 159 +G1 X 13.680 Y -3.271 Z 25.979 A -71.881 C -83.802 F 159 +G1 X 13.787 Y -3.327 Z 25.747 A -71.735 C -83.381 F 159 +G1 X 13.885 Y -3.410 Z 25.526 A -71.634 C -82.971 F 159 +G1 X 13.972 Y -3.517 Z 25.317 A -71.579 C -82.578 F 159 +G1 X 14.041 Y -3.633 Z 25.140 A -71.566 C -82.239 F 159 +G1 X 14.099 Y -3.764 Z 24.976 A -71.587 C -81.918 F 159 +G1 X 14.167 Y -3.989 Z 24.753 A -71.678 C -81.474 F 159 +G1 X 14.184 Y -4.070 Z 24.685 A -71.725 C -81.336 F 159 +G1 X 14.283 Y -4.752 Z 24.177 A -72.152 C -80.297 F 159 +G1 X 14.368 Y -5.515 Z 23.617 A -72.581 C -79.185 F 159 +G1 X 14.428 Y -6.284 Z 23.057 A -72.966 C -78.106 F 159 +G1 X 14.463 Y -7.059 Z 22.499 A -73.302 C -77.074 F 159 +G1 X 14.474 Y -7.838 Z 21.942 A -73.588 C -76.093 F 159 +G1 X 14.461 Y -8.622 Z 21.386 A -73.829 C -75.159 F 159 +G1 X 14.424 Y -9.410 Z 20.831 A -74.029 C -74.268 F 159 +G1 X 14.367 Y -10.177 Z 20.293 A -74.187 C -73.439 F 159 +G1 X 14.287 Y -10.955 Z 19.751 A -74.313 C -72.638 F 159 +G1 X 14.184 Y -11.747 Z 19.202 A -74.415 C -71.845 F 159 +G1 X 14.059 Y -12.542 Z 18.654 A -74.467 C -71.121 F 159 +G1 X 13.880 Y -13.503 Z 17.993 A -74.490 C -70.291 F 159 +G1 X 13.706 Y -14.316 Z 17.442 A -74.310 C -70.010 F 159 +G1 X 13.404 Y -15.541 Z 16.618 A -73.959 C -69.835 F 159 +G1 X 13.059 Y -16.762 Z 15.803 A -73.645 C -69.678 F 159 +G1 X 12.673 Y -17.975 Z 15.000 A -73.369 C -69.540 F 159 +G1 X 12.247 Y -19.182 Z 14.208 A -73.131 C -69.421 F 159 +G1 X 11.765 Y -20.427 Z 13.397 A -72.921 C -69.316 F 159 +G1 X 11.250 Y -21.694 Z 12.591 A -72.031 C -70.749 F 159 +G1 X 10.972 Y -22.357 Z 12.178 A -71.279 C -72.173 F 159 +G1 X 10.696 Y -23.021 Z 11.765 A -70.545 C -73.590 F 159 +G1 X 10.119 Y -24.337 Z 10.956 A -69.169 C -76.390 F 159 +G1 X 9.617 Y -25.435 Z 10.288 A -68.103 C -78.699 F 159 +G1 X 9.033 Y -26.661 Z 9.550 A -67.007 C -81.232 F 159 +G1 X 8.396 Y -27.942 Z 8.788 A -65.970 C -83.814 F 159 +G1 X 7.668 Y -29.340 Z 7.968 A -64.967 C -86.540 F 159 +G1 X 6.988 Y -30.592 Z 7.245 A -64.181 C -88.888 F 159 +G1 X 6.287 Y -31.829 Z 6.540 A -63.504 C -91.115 F 159 +G1 X 5.567 Y -33.053 Z 5.854 A -62.929 C -93.218 F 159 +G1 X 4.828 Y -34.266 Z 5.185 A -62.447 C -95.201 F 159 +G1 X 4.070 Y -35.467 Z 4.536 A -62.049 C -97.064 F 159 +G1 X 3.295 Y -36.657 Z 3.905 A -61.729 C -98.812 F 159 +G1 X 2.625 Y -37.658 Z 3.385 A -61.511 C -100.206 F 159 +G1 X 1.457 Y -39.591 Z 2.363 A -61.061 C -102.766 F 159 +G1 X 1.331 Y -39.807 Z 2.248 A -60.899 C -102.719 F 636 +G1 X 1.218 Y -40.019 Z 2.133 A -60.743 C -102.674 F 636 +G1 X 1.116 Y -40.228 Z 2.018 A -60.591 C -102.630 F 636 +G1 X 1.025 Y -40.432 Z 1.904 A -60.444 C -102.587 F 636 +G1 X 0.946 Y -40.632 Z 1.790 A -60.301 C -102.545 F 636 +G1 X 0.879 Y -40.828 Z 1.676 A -60.162 C -102.504 F 636 +G1 X 0.822 Y -41.020 Z 1.563 A -60.027 C -102.464 F 636 +G1 X 0.776 Y -41.208 Z 1.451 A -59.896 C -102.426 F 636 +G1 X 0.741 Y -41.392 Z 1.339 A -59.768 C -102.388 F 636 +G1 X 0.716 Y -41.571 Z 1.227 A -59.644 C -102.351 F 636 +G1 X 0.702 Y -41.747 Z 1.116 A -59.522 C -102.315 F 636 +G1 X 0.698 Y -41.918 Z 1.006 A -59.402 C -102.279 F 636 +G1 X 0.703 Y -42.084 Z 0.897 A -59.286 C -102.244 F 636 +G1 X 0.719 Y -42.247 Z 0.788 A -59.171 C -102.209 F 636 +G1 X 0.744 Y -42.405 Z 0.681 A -59.058 C -102.175 F 636 +G1 X 0.778 Y -42.559 Z 0.574 A -58.946 C -102.142 F 636 +G1 X 0.821 Y -42.708 Z 0.468 A -58.836 C -102.108 F 636 +G1 X 0.874 Y -42.853 Z 0.363 A -58.726 C -102.075 F 636 +G1 X 0.935 Y -42.994 Z 0.259 A -58.618 C -102.042 F 636 +G1 X 1.005 Y -43.130 Z 0.156 A -58.510 C -102.010 F 636 +G1 X 1.083 Y -43.261 Z 0.054 A -58.402 C -101.977 F 636 +G1 X 1.169 Y -43.388 Z -0.046 A -58.295 C -101.944 F 636 +G1 X 1.264 Y -43.510 Z -0.146 A -58.187 C -101.911 F 636 +G1 X 1.366 Y -43.628 Z -0.244 A -58.079 C -101.878 F 636 +G1 X 1.476 Y -43.741 Z -0.341 A -57.971 C -101.844 F 636 +G1 X 1.594 Y -43.850 Z -0.436 A -57.862 C -101.811 F 636 +G1 X 1.719 Y -43.953 Z -0.531 A -57.752 C -101.777 F 636 +G1 X 1.851 Y -44.052 Z -0.623 A -57.641 C -101.742 F 636 +G1 X 1.989 Y -44.147 Z -0.715 A -57.529 C -101.707 F 636 +G1 X 2.135 Y -44.236 Z -0.805 A -57.416 C -101.672 F 636 +G1 X 2.287 Y -44.321 Z -0.893 A -57.302 C -101.636 F 636 +G1 X 2.446 Y -44.401 Z -0.980 A -57.186 C -101.600 F 636 +G1 X 2.610 Y -44.476 Z -1.065 A -57.069 C -101.563 F 636 +G1 X 2.781 Y -44.546 Z -1.148 A -56.951 C -101.526 F 636 +G1 X 3.140 Y -44.671 Z -1.309 A -56.709 C -101.450 F 636 +G1 X 3.520 Y -44.776 Z -1.463 A -56.462 C -101.371 F 636 +G1 X 3.920 Y -44.861 Z -1.610 A -56.207 C -101.289 F 636 +G1 X 4.340 Y -44.926 Z -1.748 A -55.946 C -101.205 F 636 +G1 X 4.776 Y -44.970 Z -1.878 A -55.679 C -101.118 F 636 +G1 X 5.228 Y -44.993 Z -1.999 A -55.405 C -101.029 F 636 +G1 X 5.694 Y -44.995 Z -2.111 A -55.125 C -100.937 F 636 +G1 X 6.173 Y -44.976 Z -2.213 A -54.838 C -100.842 F 636 +G1 X 6.664 Y -44.935 Z -2.306 A -54.546 C -100.744 F 636 +G1 X 7.164 Y -44.872 Z -2.388 A -54.248 C -100.644 F 636 +G1 X 7.672 Y -44.787 Z -2.460 A -53.944 C -100.541 F 636 +G1 X 8.187 Y -44.680 Z -2.521 A -53.635 C -100.435 F 636 +G1 X 8.707 Y -44.550 Z -2.570 A -53.321 C -100.327 F 636 +G1 X 9.231 Y -44.397 Z -2.608 A -53.002 C -100.216 F 636 +G1 X 9.757 Y -44.221 Z -2.634 A -52.678 C -100.103 F 636 +G1 X 10.284 Y -44.027 Z -2.649 A -52.394 C -100.002 F 636 +G1 X 10.808 Y -43.821 Z -2.653 A -52.107 C -99.900 F 636 +G1 X 11.330 Y -43.601 Z -2.648 A -51.820 C -99.797 F 636 +G1 X 11.847 Y -43.370 Z -2.633 A -51.533 C -99.693 F 636 +G1 X 12.358 Y -43.127 Z -2.607 A -51.246 C -99.588 F 636 +G1 X 12.861 Y -42.873 Z -2.572 A -50.960 C -99.483 F 636 +G1 X 13.355 Y -42.608 Z -2.527 A -50.675 C -99.377 F 636 +G1 X 13.839 Y -42.332 Z -2.473 A -50.392 C -99.271 F 636 +G1 X 14.310 Y -42.046 Z -2.408 A -50.111 C -99.165 F 636 +G1 X 14.767 Y -41.751 Z -2.333 A -49.833 C -99.059 F 636 +G1 X 15.210 Y -41.446 Z -2.249 A -49.558 C -98.953 F 636 +G1 X 15.635 Y -41.133 Z -2.155 A -49.287 C -98.848 F 636 +G1 X 16.043 Y -40.810 Z -2.052 A -49.019 C -98.743 F 636 +G1 X 16.430 Y -40.480 Z -1.938 A -48.756 C -98.639 F 636 +G1 X 16.797 Y -40.142 Z -1.815 A -48.496 C -98.536 F 636 +G1 X 17.140 Y -39.797 Z -1.682 A -48.241 C -98.434 F 636 +G1 X 17.460 Y -39.445 Z -1.540 A -47.991 C -98.333 F 636 +G1 X 17.753 Y -39.086 Z -1.388 A -47.745 C -98.233 F 636 +G1 X 18.020 Y -38.721 Z -1.226 A -47.503 C -98.133 F 636 +G1 X 18.142 Y -38.536 Z -1.142 A -47.383 C -98.084 F 636 +G1 X 18.257 Y -38.350 Z -1.055 A -47.265 C -98.035 F 636 +G1 X 18.365 Y -38.163 Z -0.966 A -47.147 C -97.986 F 636 +G1 X 18.464 Y -37.974 Z -0.875 A -47.030 C -97.937 F 636 +G1 X 18.556 Y -37.784 Z -0.781 A -46.913 C -97.888 F 636 +G1 X 18.640 Y -37.593 Z -0.684 A -46.798 C -97.839 F 636 +G1 X 18.715 Y -37.401 Z -0.586 A -46.682 C -97.790 F 636 +G1 X 18.782 Y -37.207 Z -0.485 A -46.567 C -97.742 F 636 +G1 X 18.840 Y -37.013 Z -0.381 A -46.453 C -97.693 F 636 +G1 X 18.890 Y -36.817 Z -0.276 A -46.338 C -97.644 F 636 +G1 X 18.930 Y -36.621 Z -0.168 A -46.224 C -97.594 F 636 +G1 X 18.961 Y -36.424 Z -0.057 A -46.109 C -97.545 F 636 +G1 X 18.982 Y -36.226 Z 0.056 A -45.994 C -97.495 F 636 +G1 X 18.994 Y -36.027 Z 0.171 A -45.878 C -97.445 F 636 +G1 X 18.996 Y -35.827 Z 0.288 A -45.761 C -97.393 F 636 +G1 X 18.988 Y -35.627 Z 0.408 A -45.644 C -97.342 F 636 +G1 X 18.970 Y -35.426 Z 0.530 A -45.525 C -97.290 F 636 +G1 X 18.941 Y -35.224 Z 0.655 A -45.405 C -97.237 F 636 +G1 X 18.902 Y -35.022 Z 0.782 A -45.284 C -97.183 F 636 +G1 X 18.852 Y -34.820 Z 0.911 A -45.161 C -97.128 F 636 +G1 X 18.791 Y -34.617 Z 1.043 A -45.035 C -97.071 F 636 +G1 X 18.719 Y -34.413 Z 1.176 A -44.908 C -97.014 F 636 +G1 X 18.635 Y -34.209 Z 1.313 A -44.778 C -96.955 F 636 +G1 X 18.540 Y -34.005 Z 1.451 A -44.645 C -96.895 F 636 +G1 X 18.433 Y -33.801 Z 1.592 A -44.509 C -96.833 F 636 +G1 X 18.315 Y -33.596 Z 1.735 A -44.371 C -96.769 F 636 +G1 X 17.417 Y -32.122 Z 2.774 A -47.126 C -92.499 F 159 +G1 X 17.315 Y -31.952 Z 2.895 A -47.454 C -92.027 F 159 +G1 X 17.191 Y -31.678 Z 3.076 A -47.910 C -91.279 F 159 +G1 X 17.104 Y -31.383 Z 3.255 A -48.321 C -90.482 F 159 +G1 X 17.058 Y -31.065 Z 3.433 A -48.684 C -89.632 F 159 +G1 X 17.036 Y -29.881 Z 4.058 A -49.856 C -86.472 F 159 +G1 X 17.025 Y -29.031 Z 4.511 A -50.764 C -84.218 F 159 +G1 X 17.015 Y -28.299 Z 4.919 A -51.623 C -82.295 F 159 +G1 X 17.006 Y -27.566 Z 5.329 A -52.522 C -80.387 F 159 +G1 X 16.997 Y -26.839 Z 5.752 A -53.481 C -78.518 F 159 +G1 X 16.990 Y -26.112 Z 6.177 A -54.475 C -76.672 F 159 +G1 X 16.983 Y -25.391 Z 6.614 A -55.523 C -74.870 F 159 +G1 X 16.977 Y -24.670 Z 7.053 A -56.599 C -73.098 F 159 +G1 X 16.971 Y -23.883 Z 7.550 A -57.837 C -71.205 F 159 +G1 X 16.968 Y -23.097 Z 8.049 A -59.100 C -69.353 F 159 +G1 X 16.963 Y -22.319 Z 8.561 A -60.408 C -67.565 F 159 +G1 X 16.961 Y -21.542 Z 9.074 A -61.731 C -65.822 F 159 +G1 X 16.942 Y -20.218 Z 9.993 A -63.458 C -64.294 F 159 +G1 X 16.897 Y -18.996 Z 10.886 A -64.269 C -64.749 F 159 +G1 X 16.843 Y -17.785 Z 11.793 A -65.108 C -65.213 F 159 +G1 X 16.777 Y -16.585 Z 12.716 A -65.974 C -65.687 F 159 +G1 X 16.678 Y -15.122 Z 13.872 A -67.078 C -66.282 F 159 +G1 X 16.592 Y -14.068 Z 14.725 A -67.904 C -66.723 F 159 +G1 X 16.480 Y -12.907 Z 15.687 A -68.762 C -67.396 F 159 +G1 X 16.345 Y -11.780 Z 16.647 A -69.338 C -68.596 F 159 +G1 X 16.192 Y -10.669 Z 17.612 A -69.829 C -69.869 F 159 +G1 X 16.017 Y -9.572 Z 18.585 A -70.233 C -71.223 F 159 +G1 X 15.819 Y -8.492 Z 19.563 A -70.546 C -72.657 F 159 +G1 X 15.632 Y -7.591 Z 20.396 A -70.737 C -73.941 F 159 +G1 X 15.471 Y -6.891 Z 21.055 A -70.835 C -75.000 F 159 +G1 X 15.207 Y -5.858 Z 22.047 A -70.885 C -76.683 F 159 +G1 X 14.914 Y -4.848 Z 23.041 A -70.814 C -78.467 F 159 +G1 X 14.662 Y -4.063 Z 23.833 A -70.677 C -79.943 F 159 +G1 X 14.342 Y -3.163 Z 24.763 A -70.411 C -81.755 F 159 +G1 X 14.095 Y -2.531 Z 25.433 A -70.140 C -83.122 F 159 +G1 X 13.835 Y -1.912 Z 26.106 A -69.806 C -84.530 F 159 +G1 X 13.118 Y -0.639 Z 27.850 A -69.177 C -88.099 F 159 +G1 X 9.867 Y 8.717 Z 27.743 A -71.841 C -138.790 F 636 +G1 X 10.691 Y 8.962 Z 26.178 A -71.266 C -135.779 F 159 +G1 X 10.878 Y 8.993 Z 25.858 A -71.158 C -135.164 F 159 +G1 X 11.080 Y 8.998 Z 25.552 A -71.093 C -134.575 F 159 +G1 X 11.295 Y 8.977 Z 25.262 A -71.073 C -134.011 F 159 +G1 X 11.523 Y 8.928 Z 24.986 A -71.096 C -133.474 F 159 +G1 X 11.759 Y 8.853 Z 24.729 A -71.164 C -132.967 F 159 +G1 X 11.956 Y 8.772 Z 24.534 A -71.252 C -132.578 F 159 +G1 X 12.548 Y 8.482 Z 23.987 A -71.566 C -131.492 F 159 +G1 X 13.436 Y 8.007 Z 23.162 A -71.965 C -129.912 F 159 +G1 X 14.080 Y 7.635 Z 22.558 A -72.202 C -128.795 F 159 +G1 X 14.717 Y 7.242 Z 21.956 A -72.387 C -127.730 F 159 +G1 X 15.347 Y 6.831 Z 21.354 A -72.522 C -126.715 F 159 +G1 X 16.250 Y 6.201 Z 20.484 A -72.638 C -125.323 F 159 +G1 X 17.085 Y 5.575 Z 19.669 A -72.669 C -124.093 F 159 +G1 X 17.986 Y 4.852 Z 18.778 A -72.625 C -122.824 F 159 +G1 X 18.872 Y 4.093 Z 17.890 A -72.500 C -121.640 F 159 +G1 X 19.453 Y 3.569 Z 17.302 A -72.381 C -120.884 F 159 +G1 X 20.343 Y 2.724 Z 16.396 A -71.935 C -120.244 F 159 +G1 X 21.206 Y 1.856 Z 15.512 A -71.371 C -119.957 F 159 +G1 X 22.052 Y 0.960 Z 14.638 A -70.844 C -119.688 F 159 +G1 X 22.861 Y 0.062 Z 13.797 A -70.367 C -119.443 F 159 +G1 X 23.669 Y -0.875 Z 12.954 A -69.921 C -119.212 F 159 +G1 X 24.468 Y -1.839 Z 12.117 A -69.512 C -119.000 F 159 +G1 X 25.302 Y -2.884 Z 11.258 A -68.408 C -120.345 F 159 +G1 X 25.741 Y -3.445 Z 10.817 A -67.494 C -121.863 F 159 +G1 X 26.181 Y -4.004 Z 10.377 A -66.596 C -123.388 F 159 +G1 X 26.618 Y -4.571 Z 9.946 A -65.737 C -124.928 F 159 +G1 X 27.056 Y -5.136 Z 9.515 A -64.898 C -126.471 F 159 +G1 X 27.489 Y -5.708 Z 9.094 A -64.103 C -128.020 F 159 +G1 X 27.923 Y -6.277 Z 8.674 A -63.332 C -129.565 F 159 +G1 X 28.369 Y -6.876 Z 8.248 A -62.581 C -131.172 F 159 +G1 X 28.816 Y -7.472 Z 7.823 A -61.858 C -132.769 F 159 +G1 X 29.667 Y -8.632 Z 7.027 A -60.593 C -135.819 F 159 +G1 X 30.526 Y -9.823 Z 6.238 A -59.462 C -138.872 F 159 +G1 X 31.359 Y -10.999 Z 5.489 A -58.507 C -141.790 F 159 +G1 X 31.911 Y -11.784 Z 5.002 A -57.948 C -143.682 F 159 +G1 X 32.481 Y -12.542 Z 4.516 A -57.404 C -145.535 F 159 +G1 X 33.079 Y -13.275 Z 4.026 A -56.865 C -147.367 F 159 +G1 X 33.596 Y -13.868 Z 3.618 A -56.426 C -148.880 F 159 +G1 X 34.236 Y -14.556 Z 3.134 A -55.918 C -150.671 F 159 +G1 X 35.847 Y -16.155 Z 1.937 A -54.730 C -154.914 F 159 +G1 X 35.985 Y -16.281 Z 1.837 A -54.607 C -154.837 F 636 +G1 X 36.119 Y -16.382 Z 1.743 A -54.496 C -154.766 F 636 +G1 X 36.248 Y -16.458 Z 1.655 A -54.395 C -154.702 F 636 +G1 X 36.373 Y -16.510 Z 1.574 A -54.304 C -154.644 F 636 +G1 X 36.493 Y -16.538 Z 1.500 A -54.220 C -154.591 F 636 +G1 X 36.608 Y -16.542 Z 1.432 A -54.143 C -154.542 F 636 +G1 X 36.717 Y -16.523 Z 1.371 A -54.070 C -154.495 F 636 +G1 X 36.820 Y -16.482 Z 1.317 A -53.998 C -154.449 F 636 +G1 X 36.917 Y -16.418 Z 1.270 A -53.926 C -154.403 F 636 +G1 X 37.008 Y -16.332 Z 1.230 A -53.850 C -154.354 F 636 +G1 X 37.092 Y -16.225 Z 1.198 A -53.769 C -154.302 F 636 +G1 X 37.169 Y -16.096 Z 1.172 A -53.681 C -154.245 F 636 +G1 X 37.238 Y -15.947 Z 1.154 A -53.585 C -154.183 F 636 +G1 X 37.300 Y -15.777 Z 1.143 A -53.480 C -154.115 F 636 +G1 X 37.353 Y -15.588 Z 1.139 A -53.366 C -154.041 F 636 +G1 X 37.399 Y -15.379 Z 1.143 A -53.243 C -153.960 F 636 +G1 X 37.435 Y -15.162 Z 1.153 A -53.142 C -153.894 F 636 +G1 X 37.459 Y -14.949 Z 1.170 A -53.043 C -153.829 F 636 +G1 X 37.473 Y -14.741 Z 1.192 A -52.947 C -153.765 F 636 +G1 X 37.475 Y -14.538 Z 1.221 A -52.853 C -153.703 F 636 +G1 X 37.465 Y -14.341 Z 1.256 A -52.761 C -153.642 F 636 +G1 X 37.444 Y -14.150 Z 1.297 A -52.671 C -153.582 F 636 +G1 X 37.410 Y -13.965 Z 1.344 A -52.582 C -153.522 F 636 +G1 X 37.363 Y -13.786 Z 1.398 A -52.494 C -153.463 F 636 +G1 X 37.304 Y -13.615 Z 1.457 A -52.407 C -153.405 F 636 +G1 X 37.231 Y -13.452 Z 1.524 A -52.319 C -153.346 F 636 +G1 X 37.145 Y -13.297 Z 1.596 A -52.231 C -153.287 F 636 +G1 X 37.045 Y -13.150 Z 1.676 A -52.142 C -153.227 F 636 +G1 X 36.932 Y -13.012 Z 1.761 A -52.052 C -153.165 F 636 +G1 X 36.804 Y -12.883 Z 1.853 A -51.959 C -153.102 F 636 +G1 X 36.662 Y -12.764 Z 1.952 A -51.863 C -153.036 F 636 +G1 X 36.505 Y -12.656 Z 2.058 A -51.763 C -152.968 F 636 +G1 X 35.057 Y -11.746 Z 3.017 A -53.155 C -149.218 F 159 +G1 X 34.631 Y -11.459 Z 3.301 A -53.584 C -148.089 F 159 +G1 X 34.214 Y -11.149 Z 3.589 A -54.009 C -146.947 F 159 +G1 X 33.852 Y -10.853 Z 3.846 A -54.380 C -145.921 F 159 +G1 X 33.498 Y -10.536 Z 4.104 A -54.744 C -144.878 F 159 +G1 X 33.004 Y -10.041 Z 4.476 A -55.254 C -143.346 F 159 +G1 X 32.211 Y -9.134 Z 5.099 A -56.092 C -140.703 F 159 +G1 X 31.262 Y -8.040 Z 5.868 A -57.235 C -137.473 F 159 +G1 X 30.785 Y -7.498 Z 6.265 A -57.877 C -135.846 F 159 +G1 X 30.309 Y -6.953 Z 6.663 A -58.550 C -134.207 F 159 +G1 X 29.831 Y -6.414 Z 7.073 A -59.277 C -132.570 F 159 +G1 X 29.353 Y -5.872 Z 7.484 A -60.034 C -130.927 F 159 +G1 X 28.909 Y -5.375 Z 7.876 A -60.782 C -129.411 F 159 +G1 X 28.465 Y -4.876 Z 8.268 A -61.554 C -127.896 F 159 +G1 X 28.020 Y -4.381 Z 8.669 A -62.366 C -126.394 F 159 +G1 X 27.577 Y -3.886 Z 9.072 A -63.200 C -124.898 F 159 +G1 X 27.098 Y -3.358 Z 9.514 A -64.138 C -123.308 F 159 +G1 X 26.620 Y -2.828 Z 9.958 A -65.096 C -121.729 F 159 +G1 X 26.142 Y -2.305 Z 10.410 A -66.091 C -120.178 F 159 +G1 X 25.666 Y -1.780 Z 10.864 A -67.099 C -118.644 F 159 +G1 X 24.790 Y -0.844 Z 11.727 A -67.941 C -118.174 F 159 +G1 X 23.928 Y 0.046 Z 12.587 A -68.469 C -118.453 F 159 +G1 X 23.058 Y 0.916 Z 13.460 A -69.036 C -118.750 F 159 +G1 X 22.155 Y 1.785 Z 14.369 A -69.656 C -119.074 F 159 +G1 X 21.261 Y 2.610 Z 15.269 A -70.298 C -119.406 F 159 +G1 X 20.454 Y 3.326 Z 16.081 A -70.898 C -119.721 F 159 +G1 X 19.648 Y 4.007 Z 16.893 A -71.355 C -120.375 F 159 +G1 X 18.745 Y 4.730 Z 17.800 A -71.634 C -121.539 F 159 +G1 X 17.828 Y 5.424 Z 18.715 A -71.841 C -122.775 F 159 +G1 X 16.902 Y 6.083 Z 19.633 A -71.964 C -124.095 F 159 +G1 X 16.080 Y 6.632 Z 20.443 A -72.003 C -125.323 F 159 +G1 X 15.130 Y 7.223 Z 21.371 A -71.958 C -126.816 F 159 +G1 X 14.171 Y 7.774 Z 22.302 A -71.807 C -128.414 F 159 +G1 X 13.526 Y 8.117 Z 22.925 A -71.639 C -129.545 F 159 +G1 X 12.876 Y 8.442 Z 23.549 A -71.425 C -130.713 F 159 +G1 X 12.001 Y 8.845 Z 24.385 A -71.059 C -132.335 F 159 +G1 X 11.715 Y 8.958 Z 24.670 A -70.942 C -132.900 F 159 +G1 X 11.398 Y 9.056 Z 25.013 A -70.850 C -133.577 F 159 +G1 X 11.093 Y 9.121 Z 25.376 A -70.803 C -134.294 F 159 +G1 X 10.802 Y 9.155 Z 25.758 A -70.799 C -135.048 F 159 +G1 X 10.527 Y 9.160 Z 26.157 A -70.837 C -135.837 F 159 +G1 X 9.311 Y 9.017 Z 28.149 A -71.108 C -139.774 F 159 +G1 X 9.252 Y 9.003 Z 28.255 A -71.228 C -139.691 F 636 +G1 X 9.218 Y 8.976 Z 28.343 A -71.325 C -139.625 F 636 +G1 X 9.206 Y 8.939 Z 28.411 A -71.403 C -139.571 F 636 +G1 X 9.209 Y 8.917 Z 28.438 A -71.438 C -139.547 F 636 +G1 X 9.217 Y 8.892 Z 28.461 A -71.472 C -139.524 F 636 +G1 X 9.249 Y 8.835 Z 28.490 A -71.542 C -139.476 F 636 +G1 X 9.302 Y 8.771 Z 28.500 A -71.625 C -139.419 F 636 +G1 X 9.374 Y 8.700 Z 28.490 A -71.726 C -139.350 F 636 +G1 X 9.466 Y 8.623 Z 28.459 A -71.849 C -139.266 F 636 +G1 X 9.566 Y 8.548 Z 28.413 A -71.947 C -139.199 F 636 +G1 X 9.662 Y 8.484 Z 28.358 A -72.042 C -139.134 F 636 +G1 X 9.754 Y 8.432 Z 28.293 A -72.134 C -139.072 F 636 +G1 X 9.841 Y 8.392 Z 28.219 A -72.224 C -139.011 F 636 +G1 X 9.922 Y 8.366 Z 28.134 A -72.312 C -138.951 F 636 +G1 X 9.996 Y 8.355 Z 28.040 A -72.402 C -138.890 F 636 +G1 X 10.063 Y 8.359 Z 27.935 A -72.494 C -138.828 F 636 +G1 X 10.121 Y 8.380 Z 27.820 A -72.591 C -138.762 F 636 +G1 X 10.844 Y 8.773 Z 26.198 A -71.673 C -135.720 F 159 +G1 X 10.953 Y 8.820 Z 25.971 A -71.541 C -135.298 F 159 +G1 X 11.073 Y 8.850 Z 25.751 A -71.439 C -134.888 F 159 +G1 X 11.271 Y 8.863 Z 25.439 A -71.345 C -134.296 F 159 +G1 X 11.488 Y 8.838 Z 25.146 A -71.320 C -133.733 F 159 +G1 X 11.720 Y 8.776 Z 24.877 A -71.361 C -133.208 F 159 +G1 X 11.961 Y 8.678 Z 24.635 A -71.467 C -132.724 F 159 +G1 X 12.516 Y 8.384 Z 24.140 A -71.812 C -131.727 F 159 +G1 X 13.352 Y 7.901 Z 23.390 A -72.274 C -130.264 F 159 +G1 X 13.993 Y 7.500 Z 22.807 A -72.583 C -129.165 F 159 +G1 X 14.626 Y 7.078 Z 22.224 A -72.840 C -128.114 F 159 +G1 X 15.250 Y 6.635 Z 21.643 A -73.047 C -127.114 F 159 +G1 X 15.865 Y 6.172 Z 21.063 A -73.208 C -126.161 F 159 +G1 X 16.470 Y 5.691 Z 20.484 A -73.327 C -125.250 F 159 +G1 X 17.271 Y 5.014 Z 19.707 A -73.428 C -124.085 F 159 +G1 X 18.141 Y 4.225 Z 18.846 A -73.476 C -122.845 F 159 +G1 X 18.991 Y 3.396 Z 17.988 A -73.424 C -121.736 F 159 +G1 X 19.775 Y 2.581 Z 17.182 A -73.237 C -120.925 F 159 +G1 X 20.604 Y 1.662 Z 16.321 A -72.769 C -120.667 F 159 +G1 X 21.410 Y 0.711 Z 15.468 A -72.330 C -120.445 F 159 +G1 X 22.192 Y -0.264 Z 14.628 A -71.930 C -120.243 F 159 +G1 X 22.802 Y -1.063 Z 13.965 A -71.638 C -120.095 F 159 +G1 X 23.397 Y -1.879 Z 13.308 A -71.373 C -119.960 F 159 +G1 X 24.124 Y -2.919 Z 12.499 A -71.076 C -119.808 F 159 +G1 X 24.907 Y -4.070 Z 11.647 A -69.689 C -122.051 F 159 +G1 X 25.303 Y -4.667 Z 11.219 A -68.867 C -123.533 F 159 +G1 X 25.701 Y -5.262 Z 10.793 A -68.063 C -125.014 F 159 +G1 X 26.090 Y -5.865 Z 10.375 A -67.299 C -126.495 F 159 +G1 X 26.481 Y -6.465 Z 9.958 A -66.555 C -127.969 F 159 +G1 X 26.863 Y -7.073 Z 9.550 A -65.855 C -129.438 F 159 +G1 X 27.246 Y -7.678 Z 9.142 A -65.177 C -130.895 F 159 +G1 X 27.968 Y -8.854 Z 8.377 A -63.981 C -133.659 F 159 +G1 X 28.563 Y -9.846 Z 7.749 A -63.077 C -135.928 F 159 +G1 X 28.978 Y -10.561 Z 7.312 A -62.494 C -137.516 F 159 +G1 X 29.394 Y -11.274 Z 6.876 A -61.941 C -139.072 F 159 +G1 X 30.097 Y -12.521 Z 6.142 A -61.101 C -141.693 F 159 +G1 X 30.674 Y -13.565 Z 5.550 A -60.502 C -143.793 F 159 +G1 X 31.247 Y -14.603 Z 4.960 A -59.956 C -145.816 F 159 +G1 X 32.190 Y -16.248 Z 4.036 A -59.193 C -148.927 F 159 +G1 X 33.023 Y -17.667 Z 3.254 A -58.640 C -151.502 F 159 +G1 X 34.255 Y -19.564 Z 2.140 A -57.888 C -154.920 F 159 +G1 X 34.415 Y -19.794 Z 1.999 A -57.699 C -154.856 F 636 +G1 X 34.577 Y -20.002 Z 1.860 A -57.519 C -154.795 F 636 +G1 X 34.743 Y -20.186 Z 1.725 A -57.348 C -154.736 F 636 +G1 X 34.911 Y -20.349 Z 1.592 A -57.185 C -154.680 F 636 +G1 X 35.082 Y -20.489 Z 1.463 A -57.030 C -154.627 F 636 +G1 X 35.255 Y -20.608 Z 1.336 A -56.883 C -154.576 F 636 +G1 X 35.429 Y -20.705 Z 1.213 A -56.741 C -154.526 F 636 +G1 X 35.604 Y -20.782 Z 1.093 A -56.604 C -154.479 F 636 +G1 X 35.781 Y -20.838 Z 0.976 A -56.472 C -154.433 F 636 +G1 X 35.957 Y -20.875 Z 0.863 A -56.344 C -154.388 F 636 +G1 X 36.134 Y -20.891 Z 0.754 A -56.218 C -154.343 F 636 +G1 X 36.311 Y -20.889 Z 0.648 A -56.093 C -154.299 F 636 +G1 X 36.487 Y -20.868 Z 0.547 A -55.970 C -154.256 F 636 +G1 X 36.663 Y -20.828 Z 0.449 A -55.846 C -154.212 F 636 +G1 X 36.837 Y -20.770 Z 0.355 A -55.722 C -154.167 F 636 +G1 X 37.009 Y -20.695 Z 0.265 A -55.596 C -154.122 F 636 +G1 X 37.179 Y -20.602 Z 0.179 A -55.468 C -154.077 F 636 +G1 X 37.347 Y -20.493 Z 0.098 A -55.338 C -154.030 F 636 +G1 X 37.512 Y -20.367 Z 0.021 A -55.204 C -153.982 F 636 +G1 X 37.674 Y -20.226 Z -0.051 A -55.067 C -153.932 F 636 +G1 X 37.833 Y -20.068 Z -0.119 A -54.926 C -153.881 F 636 +G1 X 37.988 Y -19.896 Z -0.182 A -54.781 C -153.828 F 636 +G1 X 38.138 Y -19.708 Z -0.241 A -54.632 C -153.773 F 636 +G1 X 38.284 Y -19.507 Z -0.294 A -54.479 C -153.717 F 636 +G1 X 38.426 Y -19.291 Z -0.342 A -54.321 C -153.659 F 636 +G1 X 38.561 Y -19.061 Z -0.386 A -54.158 C -153.598 F 636 +G1 X 38.692 Y -18.819 Z -0.424 A -53.990 C -153.536 F 636 +G1 X 38.816 Y -18.563 Z -0.457 A -53.818 C -153.472 F 636 +G1 X 38.934 Y -18.295 Z -0.484 A -53.641 C -153.405 F 636 +G1 X 39.045 Y -18.015 Z -0.506 A -53.459 C -153.336 F 636 +G1 X 39.149 Y -17.723 Z -0.522 A -53.272 C -153.266 F 636 +G1 X 39.246 Y -17.420 Z -0.533 A -53.081 C -153.193 F 636 +G1 X 39.335 Y -17.112 Z -0.538 A -52.916 C -153.129 F 636 +G1 X 39.417 Y -16.802 Z -0.538 A -52.751 C -153.066 F 636 +G1 X 39.492 Y -16.493 Z -0.533 A -52.588 C -153.003 F 636 +G1 X 39.558 Y -16.184 Z -0.523 A -52.425 C -152.940 F 636 +G1 X 39.617 Y -15.876 Z -0.508 A -52.264 C -152.877 F 636 +G1 X 39.667 Y -15.570 Z -0.488 A -52.104 C -152.814 F 636 +G1 X 39.709 Y -15.265 Z -0.463 A -51.946 C -152.752 F 636 +G1 X 39.742 Y -14.963 Z -0.433 A -51.789 C -152.690 F 636 +G1 X 39.766 Y -14.664 Z -0.397 A -51.634 C -152.628 F 636 +G1 X 39.780 Y -14.368 Z -0.356 A -51.481 C -152.567 F 636 +G1 X 39.785 Y -14.077 Z -0.310 A -51.329 C -152.506 F 636 +G1 X 39.780 Y -13.789 Z -0.259 A -51.179 C -152.446 F 636 +G1 X 39.765 Y -13.506 Z -0.203 A -51.031 C -152.386 F 636 +G1 X 39.740 Y -13.229 Z -0.141 A -50.885 C -152.327 F 636 +G1 X 39.704 Y -12.957 Z -0.074 A -50.741 C -152.268 F 636 +G1 X 39.657 Y -12.692 Z -0.002 A -50.598 C -152.209 F 636 +G1 X 39.599 Y -12.433 Z 0.075 A -50.456 C -152.151 F 636 +G1 X 39.530 Y -12.182 Z 0.158 A -50.316 C -152.093 F 636 +G1 X 39.449 Y -11.938 Z 0.247 A -50.177 C -152.036 F 636 +G1 X 39.357 Y -11.703 Z 0.340 A -50.039 C -151.978 F 636 +G1 X 39.252 Y -11.476 Z 0.440 A -49.901 C -151.921 F 636 +G1 X 39.135 Y -11.259 Z 0.544 A -49.764 C -151.863 F 636 +G1 X 39.005 Y -11.051 Z 0.654 A -49.627 C -151.805 F 636 +G1 X 38.862 Y -10.853 Z 0.770 A -49.489 C -151.746 F 636 +G1 X 38.707 Y -10.666 Z 0.891 A -49.350 C -151.687 F 636 +G1 X 38.537 Y -10.490 Z 1.017 A -49.209 C -151.627 F 636 +G1 X 38.355 Y -10.326 Z 1.149 A -49.066 C -151.566 F 636 +G1 X 38.158 Y -10.174 Z 1.287 A -48.921 C -151.503 F 636 +G1 X 37.947 Y -10.034 Z 1.430 A -48.772 C -151.439 F 636 +G1 X 37.722 Y -9.907 Z 1.579 A -48.620 C -151.372 F 636 +G1 X 37.482 Y -9.794 Z 1.733 A -48.463 C -151.304 F 636 +G1 X 37.227 Y -9.695 Z 1.893 A -48.302 C -151.233 F 636 +G1 X 35.607 Y -9.127 Z 2.900 A -50.315 C -147.105 F 159 +G1 X 35.403 Y -9.051 Z 3.027 A -50.578 C -146.589 F 159 +G1 X 35.003 Y -8.873 Z 3.283 A -51.085 C -145.542 F 159 +G1 X 34.612 Y -8.657 Z 3.540 A -51.565 C -144.468 F 159 +G1 X 34.232 Y -8.401 Z 3.797 A -52.016 C -143.361 F 159 +G1 X 33.866 Y -8.105 Z 4.051 A -52.433 C -142.223 F 159 +G1 X 32.896 Y -7.185 Z 4.755 A -53.548 C -138.994 F 159 +G1 X 32.280 Y -6.596 Z 5.209 A -54.325 C -136.924 F 159 +G1 X 31.753 Y -6.095 Z 5.611 A -55.055 C -135.159 F 159 +G1 X 31.226 Y -5.593 Z 6.015 A -55.820 C -133.393 F 159 +G1 X 30.702 Y -5.096 Z 6.431 A -56.642 C -131.645 F 159 +G1 X 30.178 Y -4.596 Z 6.849 A -57.496 C -129.903 F 159 +G1 X 29.655 Y -4.102 Z 7.277 A -58.403 C -128.185 F 159 +G1 X 29.134 Y -3.605 Z 7.708 A -59.339 C -126.480 F 159 +G1 X 28.597 Y -3.098 Z 8.164 A -60.355 C -124.750 F 159 +G1 X 28.062 Y -2.589 Z 8.621 A -61.395 C -123.041 F 159 +G1 X 27.545 Y -2.101 Z 9.075 A -62.445 C -121.421 F 159 +G1 X 27.031 Y -1.612 Z 9.530 A -63.511 C -119.824 F 159 +G1 X 26.518 Y -1.129 Z 9.994 A -64.611 C -118.269 F 159 +G1 X 26.013 Y -0.652 Z 10.454 A -65.628 C -116.929 F 159 +G1 X 25.097 Y 0.175 Z 11.322 A -66.256 C -117.271 F 159 +G1 X 24.177 Y 0.986 Z 12.204 A -66.919 C -117.628 F 159 +G1 X 23.253 Y 1.778 Z 13.101 A -67.618 C -118.001 F 159 +G1 X 22.314 Y 2.559 Z 14.021 A -68.358 C -118.393 F 159 +G1 X 21.385 Y 3.305 Z 14.937 A -69.116 C -118.791 F 159 +G1 X 20.471 Y 4.012 Z 15.844 A -69.871 C -119.223 F 159 +G1 X 19.537 Y 4.699 Z 16.777 A -70.391 C -120.221 F 159 +G1 X 18.601 Y 5.354 Z 17.712 A -70.779 C -121.405 F 159 +G1 X 17.660 Y 5.979 Z 18.653 A -71.062 C -122.720 F 159 +G1 X 16.712 Y 6.572 Z 19.599 A -71.271 C -124.093 F 159 +G1 X 15.845 Y 7.082 Z 20.462 A -71.384 C -125.414 F 159 +G1 X 14.916 Y 7.592 Z 21.386 A -71.415 C -126.911 F 159 +G1 X 13.947 Y 8.083 Z 22.348 A -71.336 C -128.572 F 159 +G1 X 12.975 Y 8.533 Z 23.312 A -71.142 C -130.331 F 159 +G1 X 12.228 Y 8.850 Z 24.051 A -70.918 C -131.736 F 159 +G1 X 11.739 Y 9.039 Z 24.540 A -70.740 C -132.691 F 159 +G1 X 11.418 Y 9.145 Z 24.876 A -70.634 C -133.357 F 159 +G1 X 11.102 Y 9.232 Z 25.223 A -70.542 C -134.051 F 159 +G1 X 10.793 Y 9.302 Z 25.580 A -70.462 C -134.772 F 159 +G1 X 10.342 Y 9.375 Z 26.133 A -70.362 C -135.897 F 159 +G1 X 9.009 Y 9.422 Z 28.012 A -70.183 C -139.679 F 159 +G1 X 8.945 Y 9.420 Z 28.107 A -70.304 C -139.640 F 636 +G1 X 8.893 Y 9.409 Z 28.197 A -70.414 C -139.604 F 636 +G1 X 8.853 Y 9.391 Z 28.282 A -70.515 C -139.572 F 636 +G1 X 8.824 Y 9.364 Z 28.360 A -70.607 C -139.542 F 636 +G1 X 8.806 Y 9.331 Z 28.433 A -70.694 C -139.514 F 636 +G1 X 8.798 Y 9.290 Z 28.499 A -70.776 C -139.488 F 636 +G1 X 8.801 Y 9.243 Z 28.559 A -70.856 C -139.462 F 636 +G1 X 8.813 Y 9.191 Z 28.613 A -70.936 C -139.436 F 636 +G1 X 8.836 Y 9.132 Z 28.659 A -71.019 C -139.410 F 636 +G1 X 8.867 Y 9.069 Z 28.699 A -71.104 C -139.383 F 636 +G1 X 8.908 Y 9.001 Z 28.732 A -71.194 C -139.354 F 636 +G1 X 8.957 Y 8.929 Z 28.758 A -71.290 C -139.323 F 636 +G1 X 9.015 Y 8.853 Z 28.777 A -71.393 C -139.290 F 636 +G1 X 9.081 Y 8.774 Z 28.787 A -71.502 C -139.256 F 636 +G1 X 9.155 Y 8.692 Z 28.791 A -71.618 C -139.219 F 636 +G1 X 9.236 Y 8.608 Z 28.786 A -71.741 C -139.179 F 636 +G1 X 9.405 Y 8.446 Z 28.758 A -71.955 C -139.112 F 636 +G1 X 9.489 Y 8.372 Z 28.735 A -72.058 C -139.079 F 636 +G1 X 9.572 Y 8.304 Z 28.706 A -72.159 C -139.047 F 636 +G1 X 9.654 Y 8.241 Z 28.671 A -72.258 C -139.016 F 636 +G1 X 9.734 Y 8.185 Z 28.630 A -72.354 C -138.986 F 636 +G1 X 9.813 Y 8.135 Z 28.583 A -72.448 C -138.956 F 636 +G1 X 9.888 Y 8.092 Z 28.530 A -72.541 C -138.927 F 636 +G1 X 9.961 Y 8.057 Z 28.471 A -72.632 C -138.898 F 636 +G1 X 10.031 Y 8.030 Z 28.405 A -72.722 C -138.870 F 636 +G1 X 10.098 Y 8.011 Z 28.333 A -72.812 C -138.841 F 636 +G1 X 10.161 Y 8.000 Z 28.254 A -72.904 C -138.813 F 636 +G1 X 10.219 Y 7.999 Z 28.170 A -72.997 C -138.783 F 636 +G1 X 10.273 Y 8.008 Z 28.078 A -73.094 C -138.753 F 636 +G1 X 10.322 Y 8.027 Z 27.980 A -73.194 C -138.722 F 636 +G1 X 10.366 Y 8.056 Z 27.875 A -73.300 C -138.689 F 636 +G1 X 10.992 Y 8.584 Z 26.218 A -72.073 C -135.660 F 159 +G1 X 11.086 Y 8.656 Z 25.979 A -71.881 C -135.232 F 159 +G1 X 11.198 Y 8.705 Z 25.747 A -71.735 C -134.810 F 159 +G1 X 11.323 Y 8.730 Z 25.526 A -71.634 C -134.401 F 159 +G1 X 11.461 Y 8.731 Z 25.317 A -71.579 C -134.008 F 159 +G1 X 11.594 Y 8.713 Z 25.140 A -71.566 C -133.669 F 159 +G1 X 11.734 Y 8.676 Z 24.976 A -71.587 C -133.348 F 159 +G1 X 11.951 Y 8.589 Z 24.753 A -71.678 C -132.904 F 159 +G1 X 12.025 Y 8.552 Z 24.685 A -71.725 C -132.766 F 159 +G1 X 12.620 Y 8.204 Z 24.177 A -72.152 C -131.727 F 159 +G1 X 13.269 Y 7.795 Z 23.617 A -72.581 C -130.615 F 159 +G1 X 13.908 Y 7.362 Z 23.057 A -72.966 C -129.536 F 159 +G1 X 14.536 Y 6.907 Z 22.499 A -73.302 C -128.504 F 159 +G1 X 15.152 Y 6.429 Z 21.942 A -73.588 C -127.523 F 159 +G1 X 15.757 Y 5.930 Z 21.386 A -73.829 C -126.589 F 159 +G1 X 16.350 Y 5.411 Z 20.831 A -74.029 C -125.698 F 159 +G1 X 16.914 Y 4.887 Z 20.293 A -74.187 C -124.869 F 159 +G1 X 17.473 Y 4.340 Z 19.751 A -74.313 C -124.068 F 159 +G1 X 18.028 Y 3.766 Z 19.202 A -74.415 C -123.275 F 159 +G1 X 18.571 Y 3.173 Z 18.654 A -74.467 C -122.551 F 159 +G1 X 19.211 Y 2.433 Z 17.993 A -74.490 C -121.721 F 159 +G1 X 19.738 Y 1.790 Z 17.442 A -74.310 C -121.440 F 159 +G1 X 20.508 Y 0.791 Z 16.618 A -73.959 C -121.265 F 159 +G1 X 21.247 Y -0.241 Z 15.803 A -73.645 C -121.108 F 159 +G1 X 21.955 Y -1.299 Z 15.000 A -73.369 C -120.970 F 159 +G1 X 22.633 Y -2.385 Z 14.208 A -73.131 C -120.851 F 159 +G1 X 23.306 Y -3.537 Z 13.397 A -72.921 C -120.746 F 159 +G1 X 23.975 Y -4.729 Z 12.591 A -72.031 C -122.179 F 159 +G1 X 24.321 Y -5.361 Z 12.178 A -71.279 C -123.603 F 159 +G1 X 24.667 Y -5.990 Z 11.765 A -70.545 C -125.020 F 159 +G1 X 25.337 Y -7.262 Z 10.956 A -69.169 C -127.820 F 159 +G1 X 25.883 Y -8.339 Z 10.288 A -68.103 C -130.129 F 159 +G1 X 26.477 Y -9.560 Z 9.550 A -67.007 C -132.662 F 159 +G1 X 27.081 Y -10.857 Z 8.788 A -65.970 C -135.244 F 159 +G1 X 27.720 Y -12.297 Z 7.968 A -64.967 C -137.970 F 159 +G1 X 28.275 Y -13.610 Z 7.245 A -64.181 C -140.318 F 159 +G1 X 28.805 Y -14.929 Z 6.540 A -63.504 C -142.545 F 159 +G1 X 29.314 Y -16.255 Z 5.854 A -62.929 C -144.648 F 159 +G1 X 29.801 Y -17.589 Z 5.185 A -62.447 C -146.631 F 159 +G1 X 30.267 Y -18.930 Z 4.536 A -62.049 C -148.494 F 159 +G1 X 30.714 Y -20.278 Z 3.905 A -61.729 C -150.242 F 159 +G1 X 31.079 Y -21.426 Z 3.385 A -61.511 C -151.636 F 159 +G1 X 31.862 Y -23.545 Z 2.363 A -61.061 C -154.196 F 159 +G1 X 31.953 Y -23.778 Z 2.248 A -60.899 C -154.149 F 636 +G1 X 32.048 Y -23.999 Z 2.133 A -60.743 C -154.104 F 636 +G1 X 32.147 Y -24.208 Z 2.018 A -60.591 C -154.060 F 636 +G1 X 32.251 Y -24.406 Z 1.904 A -60.444 C -154.017 F 636 +G1 X 32.358 Y -24.593 Z 1.790 A -60.301 C -153.975 F 636 +G1 X 32.469 Y -24.768 Z 1.676 A -60.162 C -153.934 F 636 +G1 X 32.584 Y -24.932 Z 1.563 A -60.027 C -153.894 F 636 +G1 X 32.702 Y -25.085 Z 1.451 A -59.896 C -153.856 F 636 +G1 X 32.824 Y -25.227 Z 1.339 A -59.768 C -153.818 F 636 +G1 X 32.949 Y -25.358 Z 1.227 A -59.644 C -153.781 F 636 +G1 X 33.077 Y -25.479 Z 1.116 A -59.522 C -153.745 F 636 +G1 X 33.208 Y -25.589 Z 1.006 A -59.403 C -153.709 F 636 +G1 X 33.342 Y -25.689 Z 0.897 A -59.286 C -153.674 F 636 +G1 X 33.479 Y -25.778 Z 0.788 A -59.171 C -153.639 F 636 +G1 X 33.618 Y -25.857 Z 0.681 A -59.058 C -153.605 F 636 +G1 X 33.759 Y -25.926 Z 0.574 A -58.946 C -153.572 F 636 +G1 X 33.903 Y -25.985 Z 0.468 A -58.836 C -153.539 F 636 +G1 X 34.049 Y -26.035 Z 0.363 A -58.726 C -153.505 F 636 +G1 X 34.197 Y -26.074 Z 0.259 A -58.618 C -153.473 F 636 +G1 X 34.347 Y -26.105 Z 0.156 A -58.510 C -153.440 F 636 +G1 X 34.499 Y -26.125 Z 0.054 A -58.402 C -153.407 F 636 +G1 X 34.652 Y -26.137 Z -0.046 A -58.295 C -153.374 F 636 +G1 X 34.806 Y -26.139 Z -0.146 A -58.187 C -153.341 F 636 +G1 X 34.962 Y -26.133 Z -0.244 A -58.079 C -153.308 F 636 +G1 X 35.119 Y -26.117 Z -0.341 A -57.971 C -153.274 F 636 +G1 X 35.277 Y -26.093 Z -0.436 A -57.862 C -153.241 F 636 +G1 X 35.436 Y -26.060 Z -0.531 A -57.752 C -153.207 F 636 +G1 X 35.596 Y -26.018 Z -0.623 A -57.641 C -153.172 F 636 +G1 X 35.756 Y -25.969 Z -0.715 A -57.529 C -153.137 F 636 +G1 X 35.917 Y -25.911 Z -0.805 A -57.416 C -153.102 F 636 +G1 X 36.078 Y -25.844 Z -0.893 A -57.302 C -153.066 F 636 +G1 X 36.239 Y -25.770 Z -0.980 A -57.186 C -153.030 F 636 +G1 X 36.401 Y -25.688 Z -1.065 A -57.069 C -152.993 F 636 +G1 X 36.562 Y -25.599 Z -1.148 A -56.951 C -152.956 F 636 +G1 X 36.883 Y -25.396 Z -1.309 A -56.709 C -152.880 F 636 +G1 X 37.203 Y -25.165 Z -1.463 A -56.462 C -152.801 F 636 +G1 X 37.519 Y -24.905 Z -1.610 A -56.207 C -152.719 F 636 +G1 X 37.831 Y -24.617 Z -1.748 A -55.946 C -152.635 F 636 +G1 X 38.137 Y -24.304 Z -1.878 A -55.679 C -152.548 F 636 +G1 X 38.437 Y -23.964 Z -1.999 A -55.405 C -152.459 F 636 +G1 X 38.730 Y -23.601 Z -2.111 A -55.125 C -152.367 F 636 +G1 X 39.013 Y -23.214 Z -2.213 A -54.838 C -152.272 F 636 +G1 X 39.287 Y -22.806 Z -2.306 A -54.546 C -152.174 F 636 +G1 X 39.549 Y -22.375 Z -2.388 A -54.248 C -152.074 F 636 +G1 X 39.800 Y -21.925 Z -2.460 A -53.944 C -151.971 F 636 +G1 X 40.037 Y -21.456 Z -2.521 A -53.635 C -151.865 F 636 +G1 X 40.260 Y -20.968 Z -2.570 A -53.321 C -151.757 F 636 +G1 X 40.467 Y -20.463 Z -2.608 A -53.002 C -151.646 F 636 +G1 X 40.658 Y -19.942 Z -2.634 A -52.678 C -151.533 F 636 +G1 X 40.834 Y -19.410 Z -2.649 A -52.394 C -151.432 F 636 +G1 X 41.000 Y -18.870 Z -2.653 A -52.107 C -151.330 F 636 +G1 X 41.154 Y -18.326 Z -2.648 A -51.821 C -151.227 F 636 +G1 X 41.295 Y -17.777 Z -2.633 A -51.533 C -151.123 F 636 +G1 X 41.424 Y -17.226 Z -2.607 A -51.246 C -151.018 F 636 +G1 X 41.539 Y -16.674 Z -2.572 A -50.960 C -150.913 F 636 +G1 X 41.639 Y -16.123 Z -2.527 A -50.675 C -150.807 F 636 +G1 X 41.725 Y -15.573 Z -2.473 A -50.392 C -150.701 F 636 +G1 X 41.796 Y -15.026 Z -2.408 A -50.111 C -150.595 F 636 +G1 X 41.850 Y -14.485 Z -2.333 A -49.833 C -150.489 F 636 +G1 X 41.887 Y -13.949 Z -2.249 A -49.558 C -150.383 F 636 +G1 X 41.908 Y -13.421 Z -2.155 A -49.287 C -150.278 F 636 +G1 X 41.910 Y -12.901 Z -2.052 A -49.019 C -150.173 F 636 +G1 X 41.893 Y -12.392 Z -1.938 A -48.756 C -150.069 F 636 +G1 X 41.857 Y -11.895 Z -1.815 A -48.496 C -149.966 F 636 +G1 X 41.801 Y -11.411 Z -1.682 A -48.241 C -149.864 F 636 +G1 X 41.725 Y -10.942 Z -1.540 A -47.991 C -149.763 F 636 +G1 X 41.628 Y -10.488 Z -1.388 A -47.745 C -149.663 F 636 +G1 X 41.508 Y -10.053 Z -1.226 A -47.503 C -149.563 F 636 +G1 X 41.440 Y -9.842 Z -1.142 A -47.383 C -149.514 F 636 +G1 X 41.367 Y -9.636 Z -1.055 A -47.265 C -149.465 F 636 +G1 X 41.287 Y -9.435 Z -0.966 A -47.147 C -149.416 F 636 +G1 X 41.202 Y -9.239 Z -0.875 A -47.030 C -149.367 F 636 +G1 X 41.111 Y -9.049 Z -0.781 A -46.913 C -149.318 F 636 +G1 X 41.013 Y -8.864 Z -0.684 A -46.798 C -149.269 F 636 +G1 X 40.910 Y -8.686 Z -0.586 A -46.682 C -149.220 F 636 +G1 X 40.800 Y -8.513 Z -0.485 A -46.567 C -149.171 F 636 +G1 X 40.685 Y -8.346 Z -0.381 A -46.453 C -149.123 F 636 +G1 X 40.563 Y -8.186 Z -0.276 A -46.338 C -149.074 F 636 +G1 X 40.434 Y -8.032 Z -0.168 A -46.224 C -149.024 F 636 +G1 X 40.299 Y -7.885 Z -0.057 A -46.109 C -148.975 F 636 +G1 X 40.158 Y -7.745 Z 0.056 A -45.994 C -148.925 F 636 +G1 X 40.010 Y -7.611 Z 0.171 A -45.878 C -148.874 F 636 +G1 X 39.855 Y -7.485 Z 0.288 A -45.761 C -148.824 F 636 +G1 X 39.693 Y -7.367 Z 0.408 A -45.644 C -148.772 F 636 +G1 X 39.525 Y -7.256 Z 0.530 A -45.525 C -148.720 F 636 +G1 X 39.349 Y -7.152 Z 0.655 A -45.405 C -148.667 F 636 +G1 X 39.167 Y -7.057 Z 0.782 A -45.284 C -148.613 F 636 +G1 X 38.977 Y -6.970 Z 0.911 A -45.161 C -148.557 F 636 +G1 X 38.780 Y -6.891 Z 1.043 A -45.035 C -148.501 F 636 +G1 X 38.576 Y -6.820 Z 1.176 A -44.908 C -148.444 F 636 +G1 X 38.365 Y -6.759 Z 1.313 A -44.778 C -148.385 F 636 +G1 X 38.146 Y -6.706 Z 1.451 A -44.645 C -148.325 F 636 +G1 X 37.920 Y -6.662 Z 1.592 A -44.509 C -148.263 F 636 +G1 X 37.686 Y -6.627 Z 1.735 A -44.371 C -148.199 F 636 +G1 X 35.974 Y -6.409 Z 2.774 A -47.126 C -143.929 F 159 +G1 X 35.777 Y -6.383 Z 2.895 A -47.454 C -143.457 F 159 +G1 X 35.485 Y -6.310 Z 3.076 A -47.910 C -142.709 F 159 +G1 X 35.201 Y -6.193 Z 3.255 A -48.321 C -141.912 F 159 +G1 X 34.924 Y -6.031 Z 3.433 A -48.684 C -141.062 F 159 +G1 X 33.984 Y -5.310 Z 4.058 A -49.856 C -137.902 F 159 +G1 X 33.312 Y -4.788 Z 4.511 A -50.764 C -135.648 F 159 +G1 X 32.734 Y -4.340 Z 4.919 A -51.623 C -133.725 F 159 +G1 X 32.155 Y -3.890 Z 5.329 A -52.522 C -131.817 F 159 +G1 X 31.581 Y -3.444 Z 5.752 A -53.481 C -129.948 F 159 +G1 X 31.009 Y -2.996 Z 6.177 A -54.475 C -128.102 F 159 +G1 X 30.440 Y -2.553 Z 6.614 A -55.523 C -126.300 F 159 +G1 X 29.873 Y -2.107 Z 7.053 A -56.599 C -124.528 F 159 +G1 X 29.254 Y -1.622 Z 7.550 A -57.837 C -122.635 F 159 +G1 X 28.637 Y -1.134 Z 8.049 A -59.100 C -120.783 F 159 +G1 X 28.026 Y -0.653 Z 8.561 A -60.408 C -118.995 F 159 +G1 X 27.418 Y -0.170 Z 9.074 A -61.731 C -117.252 F 159 +G1 X 26.370 Y 0.641 Z 9.993 A -63.458 C -115.724 F 159 +G1 X 25.387 Y 1.368 Z 10.886 A -64.269 C -116.179 F 159 +G1 X 24.406 Y 2.080 Z 11.793 A -65.108 C -116.643 F 159 +G1 X 23.427 Y 2.777 Z 12.716 A -65.974 C -117.117 F 159 +G1 X 22.222 Y 3.611 Z 13.872 A -67.078 C -117.712 F 159 +G1 X 21.344 Y 4.202 Z 14.725 A -67.904 C -118.153 F 159 +G1 X 20.366 Y 4.838 Z 15.687 A -68.762 C -118.826 F 159 +G1 X 19.401 Y 5.435 Z 16.647 A -69.338 C -120.026 F 159 +G1 X 18.437 Y 6.008 Z 17.612 A -69.829 C -121.299 F 159 +G1 X 17.470 Y 6.556 Z 18.585 A -70.233 C -122.653 F 159 +G1 X 16.503 Y 7.074 Z 19.563 A -70.546 C -124.087 F 159 +G1 X 15.681 Y 7.489 Z 20.396 A -70.737 C -125.371 F 159 +G1 X 15.034 Y 7.799 Z 21.055 A -70.835 C -126.430 F 159 +G1 X 14.061 Y 8.237 Z 22.047 A -70.885 C -128.113 F 159 +G1 X 13.089 Y 8.638 Z 23.041 A -70.814 C -129.897 F 159 +G1 X 12.318 Y 8.930 Z 23.833 A -70.677 C -131.373 F 159 +G1 X 11.415 Y 9.241 Z 24.763 A -70.411 C -133.185 F 159 +G1 X 10.767 Y 9.442 Z 25.433 A -70.140 C -134.552 F 159 +G1 X 10.120 Y 9.625 Z 26.106 A -69.806 C -135.960 F 159 +G1 X 8.679 Y 9.858 Z 27.850 A -69.177 C -139.529 F 159 +G1 X -0.663 Y 13.149 Z 27.743 A -71.841 C -190.220 F 636 +G1 X -0.341 Y 13.947 Z 26.178 A -71.266 C -187.209 F 159 +G1 X -0.249 Y 14.112 Z 25.858 A -71.158 C -186.594 F 159 +G1 X -0.127 Y 14.273 Z 25.552 A -71.093 C -186.005 F 159 +G1 X 0.024 Y 14.428 Z 25.262 A -71.073 C -185.441 F 159 +G1 X 0.203 Y 14.575 Z 24.986 A -71.096 C -184.904 F 159 +G1 X 0.410 Y 14.713 Z 24.729 A -71.164 C -184.397 F 159 +G1 X 0.596 Y 14.817 Z 24.534 A -71.252 C -184.008 F 159 +G1 X 1.192 Y 15.099 Z 23.987 A -71.566 C -182.922 F 159 +G1 X 2.117 Y 15.497 Z 23.162 A -71.965 C -181.342 F 159 +G1 X 2.809 Y 15.768 Z 22.558 A -72.202 C -180.225 F 159 +G1 X 3.513 Y 16.022 Z 21.956 A -72.387 C -179.160 F 159 +G1 X 4.228 Y 16.258 Z 21.354 A -72.522 C -178.145 F 159 +G1 X 5.283 Y 16.571 Z 20.484 A -72.638 C -176.753 F 159 +G1 X 6.293 Y 16.834 Z 19.669 A -72.669 C -175.523 F 159 +G1 X 7.420 Y 17.088 Z 18.778 A -72.625 C -174.254 F 159 +G1 X 8.566 Y 17.307 Z 17.890 A -72.500 C -173.070 F 159 +G1 X 9.338 Y 17.435 Z 17.302 A -72.381 C -172.314 F 159 +G1 X 10.553 Y 17.603 Z 16.396 A -71.935 C -171.674 F 159 +G1 X 11.770 Y 17.737 Z 15.512 A -71.371 C -171.387 F 159 +G1 X 12.998 Y 17.840 Z 14.638 A -70.844 C -171.118 F 159 +G1 X 14.205 Y 17.913 Z 13.797 A -70.367 C -170.873 F 159 +G1 X 15.441 Y 17.960 Z 12.954 A -69.921 C -170.642 F 159 +G1 X 16.693 Y 17.983 Z 12.117 A -69.512 C -170.430 F 159 +G1 X 18.029 Y 17.984 Z 11.258 A -68.408 C -171.775 F 159 +G1 X 18.742 Y 17.978 Z 10.817 A -67.494 C -173.293 F 159 +G1 X 19.454 Y 17.974 Z 10.377 A -66.596 C -174.818 F 159 +G1 X 20.170 Y 17.961 Z 9.946 A -65.737 C -176.358 F 159 +G1 X 20.884 Y 17.951 Z 9.515 A -64.898 C -177.901 F 159 +G1 X 21.601 Y 17.933 Z 9.094 A -64.103 C -179.450 F 159 +G1 X 22.317 Y 17.918 Z 8.674 A -63.332 C -180.995 F 159 +G1 X 23.063 Y 17.893 Z 8.248 A -62.581 C -182.602 F 159 +G1 X 23.808 Y 17.871 Z 7.823 A -61.858 C -184.199 F 159 +G1 X 25.245 Y 17.814 Z 7.027 A -60.593 C -187.249 F 159 +G1 X 26.712 Y 17.743 Z 6.238 A -59.462 C -190.302 F 159 +G1 X 28.151 Y 17.660 Z 5.489 A -58.507 C -193.220 F 159 +G1 X 29.108 Y 17.603 Z 5.002 A -57.948 C -195.112 F 159 +G1 X 30.057 Y 17.576 Z 4.516 A -57.404 C -196.965 F 159 +G1 X 31.003 Y 17.586 Z 4.026 A -56.865 C -198.797 F 159 +G1 X 31.789 Y 17.621 Z 3.618 A -56.426 C -200.310 F 159 +G1 X 32.725 Y 17.692 Z 3.134 A -55.918 C -202.101 F 159 +G1 X 34.980 Y 17.955 Z 1.937 A -54.730 C -206.344 F 159 +G1 X 35.165 Y 17.984 Z 1.837 A -54.607 C -206.267 F 636 +G1 X 35.327 Y 18.026 Z 1.743 A -54.496 C -206.196 F 636 +G1 X 35.468 Y 18.079 Z 1.655 A -54.395 C -206.132 F 636 +G1 X 35.586 Y 18.145 Z 1.574 A -54.304 C -206.075 F 636 +G1 X 35.683 Y 18.221 Z 1.500 A -54.220 C -206.021 F 636 +G1 X 35.757 Y 18.308 Z 1.432 A -54.143 C -205.972 F 636 +G1 X 35.811 Y 18.405 Z 1.371 A -54.070 C -205.925 F 636 +G1 X 35.843 Y 18.512 Z 1.317 A -53.998 C -205.880 F 636 +G1 X 35.853 Y 18.628 Z 1.270 A -53.926 C -205.833 F 636 +G1 X 35.843 Y 18.752 Z 1.230 A -53.850 C -205.784 F 636 +G1 X 35.811 Y 18.885 Z 1.198 A -53.769 C -205.732 F 636 +G1 X 35.758 Y 19.025 Z 1.172 A -53.681 C -205.675 F 636 +G1 X 35.685 Y 19.172 Z 1.154 A -53.585 C -205.613 F 636 +G1 X 35.591 Y 19.326 Z 1.143 A -53.480 C -205.545 F 636 +G1 X 35.476 Y 19.486 Z 1.139 A -53.366 C -205.471 F 636 +G1 X 35.341 Y 19.652 Z 1.143 A -53.243 C -205.390 F 636 +G1 X 35.194 Y 19.815 Z 1.153 A -53.142 C -205.324 F 636 +G1 X 35.043 Y 19.967 Z 1.170 A -53.043 C -205.259 F 636 +G1 X 34.889 Y 20.107 Z 1.192 A -52.947 C -205.195 F 636 +G1 X 34.731 Y 20.235 Z 1.221 A -52.853 C -205.133 F 636 +G1 X 34.571 Y 20.351 Z 1.256 A -52.761 C -205.072 F 636 +G1 X 34.408 Y 20.453 Z 1.297 A -52.671 C -205.012 F 636 +G1 X 34.242 Y 20.542 Z 1.344 A -52.582 C -204.952 F 636 +G1 X 34.074 Y 20.617 Z 1.398 A -52.494 C -204.893 F 636 +G1 X 33.903 Y 20.677 Z 1.457 A -52.407 C -204.835 F 636 +G1 X 33.730 Y 20.722 Z 1.524 A -52.319 C -204.776 F 636 +G1 X 33.555 Y 20.752 Z 1.596 A -52.231 C -204.717 F 636 +G1 X 33.378 Y 20.765 Z 1.676 A -52.142 C -204.657 F 636 +G1 X 33.199 Y 20.763 Z 1.761 A -52.052 C -204.595 F 636 +G1 X 33.019 Y 20.743 Z 1.853 A -51.959 C -204.532 F 636 +G1 X 32.837 Y 20.706 Z 1.952 A -51.863 C -204.466 F 636 +G1 X 32.655 Y 20.651 Z 2.058 A -51.763 C -204.398 F 636 +G1 X 31.040 Y 20.086 Z 3.017 A -53.155 C -200.648 F 159 +G1 X 30.551 Y 19.932 Z 3.301 A -53.584 C -199.519 F 159 +G1 X 30.048 Y 19.799 Z 3.589 A -54.009 C -198.377 F 159 +G1 X 29.591 Y 19.701 Z 3.846 A -54.380 C -197.351 F 159 +G1 X 29.122 Y 19.622 Z 4.104 A -54.744 C -196.308 F 159 +G1 X 28.427 Y 19.544 Z 4.476 A -55.254 C -194.776 F 159 +G1 X 27.224 Y 19.489 Z 5.099 A -56.092 C -192.133 F 159 +G1 X 25.777 Y 19.429 Z 5.868 A -57.235 C -188.903 F 159 +G1 X 25.056 Y 19.395 Z 6.265 A -57.877 C -187.276 F 159 +G1 X 24.333 Y 19.362 Z 6.663 A -58.550 C -185.637 F 159 +G1 X 23.613 Y 19.324 Z 7.073 A -59.277 C -184.000 F 159 +G1 X 22.892 Y 19.289 Z 7.484 A -60.034 C -182.357 F 159 +G1 X 22.226 Y 19.251 Z 7.876 A -60.782 C -180.841 F 159 +G1 X 21.559 Y 19.216 Z 8.268 A -61.554 C -179.326 F 159 +G1 X 20.896 Y 19.176 Z 8.669 A -62.366 C -177.824 F 159 +G1 X 20.231 Y 19.138 Z 9.072 A -63.200 C -176.328 F 159 +G1 X 19.520 Y 19.093 Z 9.514 A -64.138 C -174.738 F 159 +G1 X 18.808 Y 19.050 Z 9.958 A -65.096 C -173.159 F 159 +G1 X 18.101 Y 19.002 Z 10.410 A -66.091 C -171.608 F 159 +G1 X 17.394 Y 18.957 Z 10.864 A -67.099 C -170.074 F 159 +G1 X 16.115 Y 18.856 Z 11.727 A -67.941 C -169.604 F 159 +G1 X 14.882 Y 18.737 Z 12.587 A -68.469 C -169.883 F 159 +G1 X 13.660 Y 18.599 Z 13.460 A -69.036 C -170.180 F 159 +G1 X 12.417 Y 18.435 Z 14.369 A -69.656 C -170.504 F 159 +G1 X 11.215 Y 18.251 Z 15.269 A -70.298 C -170.836 F 159 +G1 X 10.152 Y 18.065 Z 16.081 A -70.898 C -171.151 F 159 +G1 X 9.117 Y 17.860 Z 16.893 A -71.355 C -171.805 F 159 +G1 X 7.989 Y 17.604 Z 17.800 A -71.634 C -172.969 F 159 +G1 X 6.875 Y 17.321 Z 18.715 A -71.841 C -174.205 F 159 +G1 X 5.782 Y 17.007 Z 19.633 A -71.964 C -175.525 F 159 +G1 X 4.840 Y 16.707 Z 20.443 A -72.003 C -176.753 F 159 +G1 X 3.786 Y 16.333 Z 21.371 A -71.958 C -178.246 F 159 +G1 X 2.758 Y 15.926 Z 22.302 A -71.807 C -179.844 F 159 +G1 X 2.086 Y 15.636 Z 22.925 A -71.639 C -180.975 F 159 +G1 X 1.427 Y 15.330 Z 23.549 A -71.425 C -182.143 F 159 +G1 X 0.567 Y 14.897 Z 24.385 A -71.059 C -183.765 F 159 +G1 X 0.300 Y 14.744 Z 24.670 A -70.942 C -184.330 F 159 +G1 X 0.026 Y 14.558 Z 25.013 A -70.850 C -185.007 F 159 +G1 X -0.215 Y 14.360 Z 25.376 A -70.803 C -185.724 F 159 +G1 X -0.423 Y 14.154 Z 25.758 A -70.799 C -186.478 F 159 +G1 X -0.598 Y 13.941 Z 26.157 A -70.837 C -187.267 F 159 +G1 X -1.245 Y 12.902 Z 28.149 A -71.108 C -191.204 F 159 +G1 X -1.270 Y 12.847 Z 28.255 A -71.228 C -191.121 F 636 +G1 X -1.271 Y 12.803 Z 28.343 A -71.325 C -191.055 F 636 +G1 X -1.249 Y 12.771 Z 28.411 A -71.403 C -191.001 F 636 +G1 X -1.230 Y 12.759 Z 28.438 A -71.438 C -190.977 F 636 +G1 X -1.206 Y 12.750 Z 28.461 A -71.472 C -190.954 F 636 +G1 X -1.142 Y 12.740 Z 28.490 A -71.542 C -190.906 F 636 +G1 X -1.059 Y 12.741 Z 28.500 A -71.625 C -190.849 F 636 +G1 X -0.958 Y 12.754 Z 28.490 A -71.726 C -190.780 F 636 +G1 X -0.840 Y 12.777 Z 28.459 A -71.849 C -190.696 F 636 +G1 X -0.719 Y 12.809 Z 28.413 A -71.947 C -190.629 F 636 +G1 X -0.609 Y 12.844 Z 28.358 A -72.042 C -190.564 F 636 +G1 X -0.511 Y 12.884 Z 28.293 A -72.134 C -190.502 F 636 +G1 X -0.426 Y 12.927 Z 28.219 A -72.224 C -190.441 F 636 +G1 X -0.355 Y 12.974 Z 28.134 A -72.312 C -190.381 F 636 +G1 X -0.300 Y 13.025 Z 28.040 A -72.402 C -190.320 F 636 +G1 X -0.262 Y 13.079 Z 27.935 A -72.494 C -190.258 F 636 +G1 X -0.241 Y 13.138 Z 27.820 A -72.591 C -190.192 F 636 +G1 X -0.098 Y 13.948 Z 26.198 A -71.673 C -187.150 F 159 +G1 X -0.067 Y 14.062 Z 25.971 A -71.541 C -186.728 F 159 +G1 X -0.015 Y 14.175 Z 25.751 A -71.439 C -186.318 F 159 +G1 X 0.098 Y 14.338 Z 25.439 A -71.345 C -185.726 F 159 +G1 X 0.253 Y 14.493 Z 25.146 A -71.320 C -185.163 F 159 +G1 X 0.446 Y 14.635 Z 24.877 A -71.361 C -184.638 F 159 +G1 X 0.672 Y 14.763 Z 24.635 A -71.467 C -184.154 F 159 +G1 X 1.248 Y 15.013 Z 24.140 A -71.812 C -183.157 F 159 +G1 X 2.147 Y 15.365 Z 23.390 A -72.274 C -181.694 F 159 +G1 X 2.861 Y 15.616 Z 22.807 A -72.583 C -180.595 F 159 +G1 X 3.585 Y 15.848 Z 22.224 A -72.840 C -179.544 F 159 +G1 X 4.321 Y 16.060 Z 21.643 A -73.047 C -178.544 F 159 +G1 X 5.066 Y 16.252 Z 21.063 A -73.208 C -177.591 F 159 +G1 X 5.819 Y 16.425 Z 20.484 A -73.327 C -176.680 F 159 +G1 X 6.848 Y 16.629 Z 19.707 A -73.428 C -175.515 F 159 +G1 X 8.007 Y 16.817 Z 18.846 A -73.476 C -174.275 F 159 +G1 X 9.185 Y 16.966 Z 17.988 A -73.424 C -173.166 F 159 +G1 X 10.311 Y 17.070 Z 17.182 A -73.237 C -172.355 F 159 +G1 X 11.547 Y 17.145 Z 16.321 A -72.769 C -172.097 F 159 +G1 X 12.792 Y 17.183 Z 15.468 A -72.330 C -171.875 F 159 +G1 X 14.043 Y 17.186 Z 14.628 A -71.930 C -171.673 F 159 +G1 X 15.048 Y 17.164 Z 13.965 A -71.638 C -171.525 F 159 +G1 X 16.057 Y 17.122 Z 13.308 A -71.373 C -171.390 F 159 +G1 X 17.322 Y 17.041 Z 12.499 A -71.076 C -171.238 F 159 +G1 X 18.711 Y 16.936 Z 11.647 A -69.689 C -173.481 F 159 +G1 X 19.425 Y 16.874 Z 11.219 A -68.867 C -174.963 F 159 +G1 X 20.138 Y 16.813 Z 10.793 A -68.063 C -176.444 F 159 +G1 X 20.852 Y 16.742 Z 10.375 A -67.299 C -177.925 F 159 +G1 X 21.565 Y 16.673 Z 9.958 A -66.555 C -179.399 F 159 +G1 X 22.278 Y 16.593 Z 9.550 A -65.855 C -180.868 F 159 +G1 X 22.991 Y 16.515 Z 9.142 A -65.177 C -182.325 F 159 +G1 X 24.360 Y 16.347 Z 8.377 A -63.981 C -185.089 F 159 +G1 X 25.506 Y 16.193 Z 7.749 A -63.077 C -187.358 F 159 +G1 X 26.324 Y 16.072 Z 7.312 A -62.494 C -188.946 F 159 +G1 X 27.140 Y 15.953 Z 6.876 A -61.941 C -190.502 F 159 +G1 X 28.555 Y 15.725 Z 6.142 A -61.101 C -193.123 F 159 +G1 X 29.729 Y 15.525 Z 5.550 A -60.502 C -195.223 F 159 +G1 X 30.899 Y 15.326 Z 4.960 A -59.956 C -197.246 F 159 +G1 X 32.773 Y 15.038 Z 4.036 A -59.193 C -200.357 F 159 +G1 X 34.402 Y 14.804 Z 3.254 A -58.640 C -202.932 F 159 +G1 X 36.653 Y 14.585 Z 2.140 A -57.888 C -206.350 F 159 +G1 X 36.933 Y 14.566 Z 1.999 A -57.699 C -206.286 F 636 +G1 X 37.196 Y 14.564 Z 1.860 A -57.519 C -206.225 F 636 +G1 X 37.444 Y 14.578 Z 1.725 A -57.348 C -206.166 F 636 +G1 X 37.676 Y 14.609 Z 1.592 A -57.185 C -206.110 F 636 +G1 X 37.892 Y 14.655 Z 1.463 A -57.030 C -206.057 F 636 +G1 X 38.092 Y 14.715 Z 1.336 A -56.883 C -206.006 F 636 +G1 X 38.277 Y 14.791 Z 1.213 A -56.741 C -205.956 F 636 +G1 X 38.447 Y 14.880 Z 1.093 A -56.604 C -205.909 F 636 +G1 X 38.600 Y 14.983 Z 0.976 A -56.472 C -205.863 F 636 +G1 X 38.739 Y 15.099 Z 0.863 A -56.344 C -205.818 F 636 +G1 X 38.863 Y 15.227 Z 0.754 A -56.218 C -205.773 F 636 +G1 X 38.971 Y 15.366 Z 0.648 A -56.093 C -205.729 F 636 +G1 X 39.064 Y 15.517 Z 0.547 A -55.970 C -205.686 F 636 +G1 X 39.142 Y 15.679 Z 0.449 A -55.846 C -205.642 F 636 +G1 X 39.206 Y 15.851 Z 0.355 A -55.722 C -205.597 F 636 +G1 X 39.254 Y 16.033 Z 0.265 A -55.596 C -205.552 F 636 +G1 X 39.288 Y 16.223 Z 0.179 A -55.468 C -205.507 F 636 +G1 X 39.307 Y 16.423 Z 0.098 A -55.338 C -205.460 F 636 +G1 X 39.312 Y 16.630 Z 0.021 A -55.204 C -205.412 F 636 +G1 X 39.302 Y 16.845 Z -0.051 A -55.067 C -205.362 F 636 +G1 X 39.278 Y 17.068 Z -0.119 A -54.926 C -205.311 F 636 +G1 X 39.240 Y 17.296 Z -0.182 A -54.781 C -205.258 F 636 +G1 X 39.187 Y 17.531 Z -0.241 A -54.632 C -205.203 F 636 +G1 X 39.120 Y 17.771 Z -0.294 A -54.479 C -205.147 F 636 +G1 X 39.040 Y 18.016 Z -0.342 A -54.321 C -205.089 F 636 +G1 X 38.945 Y 18.265 Z -0.386 A -54.158 C -205.028 F 636 +G1 X 38.836 Y 18.518 Z -0.424 A -53.990 C -204.966 F 636 +G1 X 38.714 Y 18.775 Z -0.457 A -53.818 C -204.902 F 636 +G1 X 38.578 Y 19.034 Z -0.484 A -53.641 C -204.835 F 636 +G1 X 38.428 Y 19.295 Z -0.506 A -53.459 C -204.767 F 636 +G1 X 38.265 Y 19.559 Z -0.522 A -53.272 C -204.696 F 636 +G1 X 38.089 Y 19.823 Z -0.533 A -53.081 C -204.623 F 636 +G1 X 37.903 Y 20.086 Z -0.538 A -52.916 C -204.559 F 636 +G1 X 37.712 Y 20.343 Z -0.538 A -52.751 C -204.496 F 636 +G1 X 37.517 Y 20.594 Z -0.533 A -52.588 C -204.433 F 636 +G1 X 37.317 Y 20.838 Z -0.523 A -52.425 C -204.370 F 636 +G1 X 37.113 Y 21.076 Z -0.508 A -52.264 C -204.307 F 636 +G1 X 36.905 Y 21.306 Z -0.488 A -52.104 C -204.244 F 636 +G1 X 36.693 Y 21.529 Z -0.463 A -51.946 C -204.182 F 636 +G1 X 36.477 Y 21.743 Z -0.433 A -51.789 C -204.120 F 636 +G1 X 36.258 Y 21.948 Z -0.397 A -51.634 C -204.058 F 636 +G1 X 36.036 Y 22.144 Z -0.356 A -51.481 C -203.997 F 636 +G1 X 35.811 Y 22.330 Z -0.310 A -51.329 C -203.937 F 636 +G1 X 35.583 Y 22.505 Z -0.259 A -51.179 C -203.876 F 636 +G1 X 35.352 Y 22.670 Z -0.203 A -51.031 C -203.816 F 636 +G1 X 35.120 Y 22.823 Z -0.141 A -50.885 C -203.757 F 636 +G1 X 34.885 Y 22.964 Z -0.074 A -50.741 C -203.698 F 636 +G1 X 34.648 Y 23.093 Z -0.002 A -50.598 C -203.639 F 636 +G1 X 34.410 Y 23.209 Z 0.075 A -50.456 C -203.581 F 636 +G1 X 34.170 Y 23.312 Z 0.158 A -50.316 C -203.523 F 636 +G1 X 33.929 Y 23.400 Z 0.247 A -50.177 C -203.466 F 636 +G1 X 33.688 Y 23.475 Z 0.340 A -50.039 C -203.408 F 636 +G1 X 33.445 Y 23.534 Z 0.440 A -49.901 C -203.351 F 636 +G1 X 33.202 Y 23.578 Z 0.544 A -49.764 C -203.293 F 636 +G1 X 32.959 Y 23.606 Z 0.654 A -49.627 C -203.235 F 636 +G1 X 32.715 Y 23.618 Z 0.770 A -49.489 C -203.176 F 636 +G1 X 32.472 Y 23.613 Z 0.891 A -49.350 C -203.117 F 636 +G1 X 32.229 Y 23.590 Z 1.017 A -49.209 C -203.057 F 636 +G1 X 31.986 Y 23.550 Z 1.149 A -49.066 C -202.996 F 636 +G1 X 31.744 Y 23.491 Z 1.287 A -48.921 C -202.933 F 636 +G1 X 31.504 Y 23.413 Z 1.430 A -48.772 C -202.869 F 636 +G1 X 31.264 Y 23.316 Z 1.579 A -48.620 C -202.802 F 636 +G1 X 31.026 Y 23.199 Z 1.733 A -48.463 C -202.734 F 636 +G1 X 30.790 Y 23.062 Z 1.893 A -48.302 C -202.663 F 636 +G1 X 29.336 Y 22.149 Z 2.900 A -50.315 C -198.535 F 159 +G1 X 29.150 Y 22.037 Z 3.027 A -50.578 C -198.020 F 159 +G1 X 28.760 Y 21.835 Z 3.283 A -51.085 C -196.972 F 159 +G1 X 28.348 Y 21.664 Z 3.540 A -51.565 C -195.898 F 159 +G1 X 27.911 Y 21.527 Z 3.797 A -52.016 C -194.791 F 159 +G1 X 27.451 Y 21.425 Z 4.051 A -52.433 C -193.653 F 159 +G1 X 26.127 Y 21.239 Z 4.755 A -53.548 C -190.424 F 159 +G1 X 25.282 Y 21.125 Z 5.209 A -54.325 C -188.354 F 159 +G1 X 24.563 Y 21.026 Z 5.611 A -55.055 C -186.589 F 159 +G1 X 23.842 Y 20.927 Z 6.015 A -55.820 C -184.823 F 159 +G1 X 23.126 Y 20.827 Z 6.431 A -56.642 C -183.075 F 159 +G1 X 22.408 Y 20.729 Z 6.849 A -57.496 C -181.333 F 159 +G1 X 21.696 Y 20.628 Z 7.277 A -58.403 C -179.615 F 159 +G1 X 20.983 Y 20.530 Z 7.708 A -59.339 C -177.910 F 159 +G1 X 20.252 Y 20.427 Z 8.164 A -60.355 C -176.180 F 159 +G1 X 19.520 Y 20.326 Z 8.621 A -61.395 C -174.471 F 159 +G1 X 18.817 Y 20.226 Z 9.075 A -62.445 C -172.851 F 159 +G1 X 18.113 Y 20.129 Z 9.530 A -63.511 C -171.254 F 159 +G1 X 17.416 Y 20.029 Z 9.994 A -64.611 C -169.699 F 159 +G1 X 16.728 Y 19.932 Z 10.454 A -65.628 C -168.359 F 159 +G1 X 15.510 Y 19.731 Z 11.322 A -66.256 C -168.701 F 159 +G1 X 14.303 Y 19.517 Z 12.204 A -66.919 C -169.058 F 159 +G1 X 13.108 Y 19.289 Z 13.101 A -67.618 C -169.431 F 159 +G1 X 11.911 Y 19.041 Z 14.021 A -68.358 C -169.823 F 159 +G1 X 10.749 Y 18.780 Z 14.937 A -69.116 C -170.221 F 159 +G1 X 9.626 Y 18.507 Z 15.844 A -69.871 C -170.653 F 159 +G1 X 8.507 Y 18.204 Z 16.777 A -70.391 C -171.651 F 159 +G1 X 7.412 Y 17.882 Z 17.712 A -70.779 C -172.835 F 159 +G1 X 6.336 Y 17.535 Z 18.653 A -71.062 C -174.150 F 159 +G1 X 5.281 Y 17.164 Z 19.599 A -71.271 C -175.523 F 159 +G1 X 4.342 Y 16.804 Z 20.462 A -71.384 C -176.844 F 159 +G1 X 3.364 Y 16.395 Z 21.386 A -71.415 C -178.341 F 159 +G1 X 2.376 Y 15.944 Z 22.348 A -71.336 C -180.002 F 159 +G1 X 1.418 Y 15.464 Z 23.312 A -71.142 C -181.761 F 159 +G1 X 0.704 Y 15.078 Z 24.051 A -70.918 C -183.166 F 159 +G1 X 0.251 Y 14.814 Z 24.540 A -70.740 C -184.121 F 159 +G1 X -0.031 Y 14.628 Z 24.876 A -70.634 C -184.787 F 159 +G1 X -0.296 Y 14.436 Z 25.223 A -70.542 C -185.481 F 159 +G1 X -0.544 Y 14.237 Z 25.580 A -70.462 C -186.202 F 159 +G1 X -0.882 Y 13.931 Z 26.133 A -70.362 C -187.327 F 159 +G1 X -1.750 Y 12.918 Z 28.012 A -70.183 C -191.109 F 159 +G1 X -1.788 Y 12.867 Z 28.107 A -70.304 C -191.070 F 636 +G1 X -1.812 Y 12.820 Z 28.197 A -70.414 C -191.034 F 636 +G1 X -1.822 Y 12.777 Z 28.282 A -70.515 C -191.002 F 636 +G1 X -1.820 Y 12.737 Z 28.360 A -70.607 C -190.972 F 636 +G1 X -1.805 Y 12.702 Z 28.433 A -70.694 C -190.944 F 636 +G1 X -1.778 Y 12.671 Z 28.499 A -70.776 C -190.918 F 636 +G1 X -1.740 Y 12.644 Z 28.559 A -70.856 C -190.892 F 636 +G1 X -1.691 Y 12.621 Z 28.613 A -70.936 C -190.866 F 636 +G1 X -1.631 Y 12.602 Z 28.659 A -71.019 C -190.840 F 636 +G1 X -1.562 Y 12.587 Z 28.699 A -71.104 C -190.813 F 636 +G1 X -1.484 Y 12.577 Z 28.732 A -71.194 C -190.784 F 636 +G1 X -1.397 Y 12.570 Z 28.758 A -71.290 C -190.753 F 636 +G1 X -1.301 Y 12.568 Z 28.777 A -71.393 C -190.720 F 636 +G1 X -1.199 Y 12.570 Z 28.787 A -71.502 C -190.686 F 636 +G1 X -1.089 Y 12.577 Z 28.791 A -71.618 C -190.649 F 636 +G1 X -0.972 Y 12.588 Z 28.786 A -71.741 C -190.609 F 636 +G1 X -0.740 Y 12.619 Z 28.758 A -71.955 C -190.542 F 636 +G1 X -0.630 Y 12.639 Z 28.735 A -72.058 C -190.509 F 636 +G1 X -0.524 Y 12.661 Z 28.706 A -72.159 C -190.477 F 636 +G1 X -0.424 Y 12.686 Z 28.671 A -72.258 C -190.446 F 636 +G1 X -0.330 Y 12.714 Z 28.630 A -72.354 C -190.416 F 636 +G1 X -0.242 Y 12.744 Z 28.583 A -72.448 C -190.386 F 636 +G1 X -0.162 Y 12.776 Z 28.530 A -72.541 C -190.357 F 636 +G1 X -0.089 Y 12.812 Z 28.471 A -72.632 C -190.328 F 636 +G1 X -0.024 Y 12.849 Z 28.405 A -72.722 C -190.300 F 636 +G1 X 0.033 Y 12.889 Z 28.333 A -72.812 C -190.271 F 636 +G1 X 0.080 Y 12.932 Z 28.254 A -72.904 C -190.243 F 636 +G1 X 0.117 Y 12.977 Z 28.170 A -72.997 C -190.213 F 636 +G1 X 0.144 Y 13.025 Z 28.078 A -73.094 C -190.183 F 636 +G1 X 0.160 Y 13.074 Z 27.980 A -73.194 C -190.152 F 636 +G1 X 0.164 Y 13.127 Z 27.875 A -73.300 C -190.119 F 636 +G1 X 0.142 Y 13.946 Z 26.218 A -72.073 C -187.090 F 159 +G1 X 0.144 Y 14.065 Z 25.979 A -71.881 C -186.662 F 159 +G1 X 0.175 Y 14.182 Z 25.747 A -71.735 C -186.241 F 159 +G1 X 0.234 Y 14.296 Z 25.526 A -71.634 C -185.831 F 159 +G1 X 0.319 Y 14.404 Z 25.317 A -71.579 C -185.438 F 159 +G1 X 0.416 Y 14.497 Z 25.140 A -71.566 C -185.099 F 159 +G1 X 0.532 Y 14.583 Z 24.976 A -71.587 C -184.778 F 159 +G1 X 0.736 Y 14.699 Z 24.753 A -71.678 C -184.334 F 159 +G1 X 0.811 Y 14.734 Z 24.685 A -71.725 C -184.196 F 159 +G1 X 1.454 Y 14.982 Z 24.177 A -72.152 C -183.157 F 159 +G1 X 2.179 Y 15.235 Z 23.617 A -72.581 C -182.045 F 159 +G1 X 2.915 Y 15.464 Z 23.057 A -72.966 C -180.966 F 159 +G1 X 3.663 Y 15.671 Z 22.499 A -73.302 C -179.934 F 159 +G1 X 4.420 Y 15.855 Z 21.942 A -73.588 C -178.953 F 159 +G1 X 5.188 Y 16.017 Z 21.386 A -73.829 C -178.019 F 159 +G1 X 5.963 Y 16.157 Z 20.831 A -74.029 C -177.128 F 159 +G1 X 6.725 Y 16.271 Z 20.293 A -74.187 C -176.299 F 159 +G1 X 7.501 Y 16.367 Z 19.751 A -74.313 C -175.498 F 159 +G1 X 8.295 Y 16.443 Z 19.202 A -74.415 C -174.705 F 159 +G1 X 9.098 Y 16.498 Z 18.654 A -74.467 C -173.981 F 159 +G1 X 10.075 Y 16.537 Z 17.993 A -74.490 C -173.151 F 159 +G1 X 10.906 Y 16.548 Z 17.442 A -74.310 C -172.870 F 159 +G1 X 12.168 Y 16.527 Z 16.618 A -73.959 C -172.695 F 159 +G1 X 13.435 Y 16.462 Z 15.803 A -73.645 C -172.538 F 159 +G1 X 14.703 Y 16.356 Z 15.000 A -73.369 C -172.400 F 159 +G1 X 15.975 Y 16.209 Z 14.208 A -73.131 C -172.281 F 159 +G1 X 17.296 Y 16.016 Z 13.397 A -72.921 C -172.176 F 159 +G1 X 18.645 Y 15.797 Z 12.591 A -72.031 C -173.609 F 159 +G1 X 19.354 Y 15.673 Z 12.178 A -71.279 C -175.033 F 159 +G1 X 20.063 Y 15.552 Z 11.765 A -70.545 C -176.450 F 159 +G1 X 21.474 Y 15.282 Z 10.956 A -69.169 C -179.250 F 159 +G1 X 22.657 Y 15.037 Z 10.288 A -68.103 C -181.559 F 159 +G1 X 23.982 Y 14.741 Z 9.550 A -67.007 C -184.092 F 159 +G1 X 25.373 Y 14.404 Z 8.788 A -65.970 C -186.674 F 159 +G1 X 26.897 Y 14.006 Z 7.968 A -64.967 C -189.400 F 159 +G1 X 28.269 Y 13.621 Z 7.245 A -64.181 C -191.748 F 159 +G1 X 29.631 Y 13.214 Z 6.540 A -63.504 C -193.975 F 159 +G1 X 30.985 Y 12.784 Z 5.854 A -62.929 C -196.078 F 159 +G1 X 32.332 Y 12.333 Z 5.185 A -62.447 C -198.060 F 159 +G1 X 33.671 Y 11.862 Z 4.536 A -62.049 C -199.924 F 159 +G1 X 35.004 Y 11.371 Z 3.905 A -61.729 C -201.672 F 159 +G1 X 36.129 Y 10.940 Z 3.385 A -61.511 C -203.066 F 159 +G1 X 38.274 Y 10.232 Z 2.363 A -61.061 C -205.626 F 159 +G1 X 38.512 Y 10.158 Z 2.248 A -60.899 C -205.579 F 636 +G1 X 38.745 Y 10.094 Z 2.133 A -60.743 C -205.534 F 636 +G1 X 38.970 Y 10.041 Z 2.018 A -60.591 C -205.490 F 636 +G1 X 39.189 Y 9.998 Z 1.904 A -60.444 C -205.447 F 636 +G1 X 39.402 Y 9.966 Z 1.790 A -60.301 C -205.405 F 636 +G1 X 39.609 Y 9.944 Z 1.676 A -60.162 C -205.364 F 636 +G1 X 39.808 Y 9.931 Z 1.563 A -60.027 C -205.324 F 636 +G1 X 40.002 Y 9.928 Z 1.451 A -59.896 C -205.286 F 636 +G1 X 40.189 Y 9.935 Z 1.339 A -59.768 C -205.248 F 636 +G1 X 40.369 Y 9.951 Z 1.227 A -59.644 C -205.211 F 636 +G1 X 40.543 Y 9.976 Z 1.116 A -59.522 C -205.175 F 636 +G1 X 40.711 Y 10.010 Z 1.006 A -59.402 C -205.139 F 636 +G1 X 40.872 Y 10.052 Z 0.897 A -59.286 C -205.104 F 636 +G1 X 41.027 Y 10.104 Z 0.788 A -59.171 C -205.069 F 636 +G1 X 41.176 Y 10.163 Z 0.681 A -59.058 C -205.035 F 636 +G1 X 41.318 Y 10.231 Z 0.574 A -58.946 C -205.002 F 636 +G1 X 41.454 Y 10.306 Z 0.468 A -58.836 C -204.969 F 636 +G1 X 41.584 Y 10.390 Z 0.363 A -58.726 C -204.935 F 636 +G1 X 41.707 Y 10.481 Z 0.259 A -58.618 C -204.902 F 636 +G1 X 41.824 Y 10.579 Z 0.156 A -58.510 C -204.870 F 636 +G1 X 41.935 Y 10.684 Z 0.054 A -58.402 C -204.837 F 636 +G1 X 42.039 Y 10.797 Z -0.046 A -58.295 C -204.804 F 636 +G1 X 42.138 Y 10.916 Z -0.146 A -58.187 C -204.771 F 636 +G1 X 42.230 Y 11.042 Z -0.244 A -58.079 C -204.738 F 636 +G1 X 42.315 Y 11.175 Z -0.341 A -57.971 C -204.704 F 636 +G1 X 42.395 Y 11.314 Z -0.436 A -57.862 C -204.671 F 636 +G1 X 42.468 Y 11.458 Z -0.531 A -57.752 C -204.637 F 636 +G1 X 42.536 Y 11.609 Z -0.623 A -57.641 C -204.602 F 636 +G1 X 42.597 Y 11.765 Z -0.715 A -57.529 C -204.567 F 636 +G1 X 42.651 Y 11.927 Z -0.805 A -57.416 C -204.532 F 636 +G1 X 42.700 Y 12.094 Z -0.893 A -57.302 C -204.496 F 636 +G1 X 42.743 Y 12.267 Z -0.980 A -57.186 C -204.460 F 636 +G1 X 42.779 Y 12.444 Z -1.065 A -57.069 C -204.423 F 636 +G1 X 42.809 Y 12.626 Z -1.148 A -56.951 C -204.386 F 636 +G1 X 42.852 Y 13.003 Z -1.309 A -56.709 C -204.310 F 636 +G1 X 42.870 Y 13.397 Z -1.463 A -56.462 C -204.231 F 636 +G1 X 42.864 Y 13.807 Z -1.610 A -56.207 C -204.149 F 636 +G1 X 42.833 Y 14.230 Z -1.748 A -55.946 C -204.065 F 636 +G1 X 42.779 Y 14.665 Z -1.878 A -55.679 C -203.978 F 636 +G1 X 42.701 Y 15.111 Z -1.999 A -55.405 C -203.889 F 636 +G1 X 42.599 Y 15.566 Z -2.111 A -55.125 C -203.797 F 636 +G1 X 42.474 Y 16.029 Z -2.213 A -54.838 C -203.702 F 636 +G1 X 42.325 Y 16.498 Z -2.306 A -54.546 C -203.604 F 636 +G1 X 42.152 Y 16.971 Z -2.388 A -54.248 C -203.504 F 636 +G1 X 41.956 Y 17.448 Z -2.460 A -53.944 C -203.401 F 636 +G1 X 41.737 Y 17.926 Z -2.521 A -53.635 C -203.295 F 636 +G1 X 41.494 Y 18.404 Z -2.570 A -53.321 C -203.187 F 636 +G1 X 41.229 Y 18.881 Z -2.608 A -53.002 C -203.076 F 636 +G1 X 40.940 Y 19.355 Z -2.634 A -52.678 C -202.963 F 636 +G1 X 40.634 Y 19.825 Z -2.649 A -52.394 C -202.862 F 636 +G1 X 40.316 Y 20.291 Z -2.653 A -52.107 C -202.760 F 636 +G1 X 39.986 Y 20.750 Z -2.648 A -51.821 C -202.657 F 636 +G1 X 39.645 Y 21.203 Z -2.633 A -51.533 C -202.553 F 636 +G1 X 39.295 Y 21.647 Z -2.607 A -51.246 C -202.448 F 636 +G1 X 38.935 Y 22.081 Z -2.572 A -50.960 C -202.343 F 636 +G1 X 38.566 Y 22.504 Z -2.527 A -50.675 C -202.237 F 636 +G1 X 38.190 Y 22.914 Z -2.473 A -50.392 C -202.131 F 636 +G1 X 37.807 Y 23.309 Z -2.408 A -50.111 C -202.025 F 636 +G1 X 37.417 Y 23.690 Z -2.333 A -49.833 C -201.919 F 636 +G1 X 37.021 Y 24.053 Z -2.249 A -49.558 C -201.813 F 636 +G1 X 36.621 Y 24.398 Z -2.155 A -49.287 C -201.708 F 636 +G1 X 36.216 Y 24.723 Z -2.052 A -49.019 C -201.603 F 636 +G1 X 35.808 Y 25.028 Z -1.938 A -48.756 C -201.499 F 636 +G1 X 35.397 Y 25.310 Z -1.815 A -48.496 C -201.396 F 636 +G1 X 34.984 Y 25.568 Z -1.682 A -48.241 C -201.294 F 636 +G1 X 34.569 Y 25.801 Z -1.540 A -47.991 C -201.193 F 636 +G1 X 34.154 Y 26.007 Z -1.388 A -47.745 C -201.093 F 636 +G1 X 33.739 Y 26.186 Z -1.226 A -47.503 C -200.993 F 636 +G1 X 33.532 Y 26.264 Z -1.142 A -47.383 C -200.944 F 636 +G1 X 33.325 Y 26.335 Z -1.055 A -47.265 C -200.895 F 636 +G1 X 33.118 Y 26.398 Z -0.966 A -47.147 C -200.846 F 636 +G1 X 32.912 Y 26.453 Z -0.875 A -47.030 C -200.797 F 636 +G1 X 32.706 Y 26.500 Z -0.781 A -46.913 C -200.748 F 636 +G1 X 32.501 Y 26.539 Z -0.684 A -46.798 C -200.699 F 636 +G1 X 32.297 Y 26.570 Z -0.586 A -46.682 C -200.650 F 636 +G1 X 32.094 Y 26.592 Z -0.485 A -46.567 C -200.602 F 636 +G1 X 31.891 Y 26.606 Z -0.381 A -46.453 C -200.553 F 636 +G1 X 31.690 Y 26.610 Z -0.276 A -46.338 C -200.504 F 636 +G1 X 31.489 Y 26.606 Z -0.168 A -46.224 C -200.454 F 636 +G1 X 31.290 Y 26.592 Z -0.057 A -46.109 C -200.405 F 636 +G1 X 31.092 Y 26.569 Z 0.056 A -45.994 C -200.355 F 636 +G1 X 30.896 Y 26.536 Z 0.171 A -45.878 C -200.304 F 636 +G1 X 30.701 Y 26.493 Z 0.288 A -45.761 C -200.254 F 636 +G1 X 30.507 Y 26.441 Z 0.408 A -45.644 C -200.202 F 636 +G1 X 30.315 Y 26.379 Z 0.530 A -45.525 C -200.150 F 636 +G1 X 30.125 Y 26.306 Z 0.655 A -45.405 C -200.097 F 636 +G1 X 29.937 Y 26.223 Z 0.782 A -45.284 C -200.043 F 636 +G1 X 29.750 Y 26.129 Z 0.911 A -45.161 C -199.988 F 636 +G1 X 29.566 Y 26.024 Z 1.043 A -45.035 C -199.931 F 636 +G1 X 29.384 Y 25.908 Z 1.176 A -44.908 C -199.874 F 636 +G1 X 29.204 Y 25.782 Z 1.313 A -44.778 C -199.815 F 636 +G1 X 29.026 Y 25.644 Z 1.451 A -44.645 C -199.755 F 636 +G1 X 28.850 Y 25.494 Z 1.592 A -44.509 C -199.693 F 636 +G1 X 28.677 Y 25.333 Z 1.735 A -44.371 C -199.629 F 636 +G1 X 27.440 Y 24.130 Z 2.774 A -47.126 C -195.359 F 159 +G1 X 27.297 Y 23.992 Z 2.895 A -47.454 C -194.887 F 159 +G1 X 27.057 Y 23.810 Z 3.076 A -47.910 C -194.139 F 159 +G1 X 26.788 Y 23.660 Z 3.255 A -48.321 C -193.342 F 159 +G1 X 26.489 Y 23.545 Z 3.433 A -48.684 C -192.492 F 159 +G1 X 25.340 Y 23.259 Z 4.058 A -49.856 C -189.332 F 159 +G1 X 24.513 Y 23.060 Z 4.511 A -50.764 C -187.078 F 159 +G1 X 23.802 Y 22.887 Z 4.919 A -51.623 C -185.155 F 159 +G1 X 23.089 Y 22.715 Z 5.329 A -52.522 C -183.247 F 159 +G1 X 22.383 Y 22.544 Z 5.752 A -53.481 C -181.378 F 159 +G1 X 21.676 Y 22.376 Z 6.177 A -54.475 C -179.532 F 159 +G1 X 20.974 Y 22.208 Z 6.614 A -55.523 C -177.730 F 159 +G1 X 20.272 Y 22.042 Z 7.053 A -56.599 C -175.958 F 159 +G1 X 19.507 Y 21.861 Z 7.550 A -57.837 C -174.065 F 159 +G1 X 18.741 Y 21.683 Z 8.049 A -59.100 C -172.213 F 159 +G1 X 17.984 Y 21.505 Z 8.561 A -60.408 C -170.425 F 159 +G1 X 17.227 Y 21.330 Z 9.074 A -61.731 C -168.682 F 159 +G1 X 15.940 Y 21.017 Z 9.993 A -63.458 C -167.154 F 159 +G1 X 14.759 Y 20.702 Z 10.886 A -64.269 C -167.609 F 159 +G1 X 13.590 Y 20.379 Z 11.793 A -65.108 C -168.073 F 159 +G1 X 12.435 Y 20.048 Z 12.716 A -65.974 C -168.547 F 159 +G1 X 11.031 Y 19.625 Z 13.872 A -67.078 C -169.142 F 159 +G1 X 10.022 Y 19.307 Z 14.725 A -67.904 C -169.583 F 159 +G1 X 8.915 Y 18.939 Z 15.687 A -68.762 C -170.256 F 159 +G1 X 7.847 Y 18.557 Z 16.647 A -69.338 C -171.456 F 159 +G1 X 6.797 Y 18.160 Z 17.612 A -69.829 C -172.729 F 159 +G1 X 5.766 Y 17.746 Z 18.585 A -70.233 C -174.083 F 159 +G1 X 4.758 Y 17.313 Z 19.563 A -70.546 C -175.517 F 159 +G1 X 3.921 Y 16.929 Z 20.396 A -70.737 C -176.801 F 159 +G1 X 3.275 Y 16.617 Z 21.055 A -70.835 C -177.860 F 159 +G1 X 2.327 Y 16.129 Z 22.047 A -70.885 C -179.543 F 159 +G1 X 1.407 Y 15.619 Z 23.041 A -70.814 C -181.327 F 159 +G1 X 0.698 Y 15.198 Z 23.833 A -70.677 C -182.803 F 159 +G1 X -0.108 Y 14.686 Z 24.763 A -70.411 C -184.615 F 159 +G1 X -0.670 Y 14.305 Z 25.433 A -70.140 C -185.982 F 159 +G1 X -1.216 Y 13.913 Z 26.106 A -69.806 C -187.390 F 159 +G1 X -2.297 Y 12.932 Z 27.850 A -69.177 C -190.959 F 159 +G1 X -10.694 Y 7.679 Z 27.743 A -71.841 C -241.650 F 636 +G1 X -11.117 Y 8.428 Z 26.178 A -71.266 C -238.639 F 159 +G1 X -11.189 Y 8.604 Z 25.858 A -71.158 C -238.024 F 159 +G1 X -11.238 Y 8.799 Z 25.552 A -71.093 C -237.435 F 159 +G1 X -11.265 Y 9.014 Z 25.262 A -71.073 C -236.871 F 159 +G1 X -11.269 Y 9.246 Z 24.986 A -71.096 C -236.334 F 159 +G1 X -11.248 Y 9.494 Z 24.729 A -71.164 C -235.827 F 159 +G1 X -11.213 Y 9.704 Z 24.534 A -71.252 C -235.438 F 159 +G1 X -11.062 Y 10.346 Z 23.987 A -71.566 C -234.352 F 159 +G1 X -10.796 Y 11.317 Z 23.162 A -71.965 C -232.772 F 159 +G1 X -10.577 Y 12.027 Z 22.558 A -72.202 C -231.655 F 159 +G1 X -10.336 Y 12.736 Z 21.956 A -72.387 C -230.590 F 159 +G1 X -10.076 Y 13.442 Z 21.354 A -72.522 C -229.575 F 159 +G1 X -9.662 Y 14.462 Z 20.484 A -72.638 C -228.183 F 159 +G1 X -9.238 Y 15.416 Z 19.669 A -72.669 C -226.953 F 159 +G1 X -8.733 Y 16.455 Z 18.778 A -72.625 C -225.684 F 159 +G1 X -8.191 Y 17.488 Z 17.890 A -72.500 C -224.500 F 159 +G1 X -7.810 Y 18.171 Z 17.302 A -72.381 C -223.744 F 159 +G1 X -7.183 Y 19.226 Z 16.396 A -71.935 C -223.104 F 159 +G1 X -6.529 Y 20.261 Z 15.512 A -71.371 C -222.817 F 159 +G1 X -5.844 Y 21.285 Z 14.638 A -70.844 C -222.548 F 159 +G1 X -5.148 Y 22.274 Z 13.797 A -70.367 C -222.303 F 159 +G1 X -4.415 Y 23.270 Z 12.954 A -69.921 C -222.072 F 159 +G1 X -3.652 Y 24.263 Z 12.117 A -69.512 C -221.860 F 159 +G1 X -2.820 Y 25.309 Z 11.258 A -68.408 C -223.205 F 159 +G1 X -2.371 Y 25.862 Z 10.817 A -67.494 C -224.723 F 159 +G1 X -1.924 Y 26.416 Z 10.377 A -66.596 C -226.248 F 159 +G1 X -1.468 Y 26.968 Z 9.946 A -65.737 C -227.788 F 159 +G1 X -1.014 Y 27.520 Z 9.515 A -64.898 C -229.331 F 159 +G1 X -0.553 Y 28.070 Z 9.094 A -64.103 C -230.880 F 159 +G1 X -0.095 Y 28.620 Z 8.674 A -63.332 C -232.425 F 159 +G1 X 0.390 Y 29.188 Z 8.248 A -62.581 C -234.032 F 159 +G1 X 0.871 Y 29.756 Z 7.823 A -61.858 C -235.629 F 159 +G1 X 1.812 Y 30.844 Z 7.027 A -60.593 C -238.679 F 159 +G1 X 2.782 Y 31.947 Z 6.238 A -59.462 C -241.732 F 159 +G1 X 3.744 Y 33.021 Z 5.489 A -58.507 C -244.650 F 159 +G1 X 4.386 Y 33.733 Z 5.002 A -57.948 C -246.542 F 159 +G1 X 4.998 Y 34.458 Z 4.516 A -57.404 C -248.395 F 159 +G1 X 5.579 Y 35.204 Z 4.026 A -56.865 C -250.227 F 159 +G1 X 6.042 Y 35.840 Z 3.618 A -56.426 C -251.740 F 159 +G1 X 6.571 Y 36.616 Z 3.134 A -55.918 C -253.531 F 159 +G1 X 7.772 Y 38.543 Z 1.937 A -54.730 C -257.774 F 159 +G1 X 7.864 Y 38.706 Z 1.837 A -54.607 C -257.697 F 636 +G1 X 7.932 Y 38.859 Z 1.743 A -54.496 C -257.626 F 636 +G1 X 7.978 Y 39.002 Z 1.655 A -54.395 C -257.563 F 636 +G1 X 8.000 Y 39.135 Z 1.574 A -54.304 C -257.504 F 636 +G1 X 8.001 Y 39.259 Z 1.500 A -54.220 C -257.451 F 636 +G1 X 7.980 Y 39.371 Z 1.432 A -54.143 C -257.402 F 636 +G1 X 7.937 Y 39.474 Z 1.371 A -54.070 C -257.355 F 636 +G1 X 7.873 Y 39.565 Z 1.317 A -53.998 C -257.310 F 636 +G1 X 7.789 Y 39.646 Z 1.270 A -53.926 C -257.263 F 636 +G1 X 7.685 Y 39.715 Z 1.230 A -53.850 C -257.214 F 636 +G1 X 7.562 Y 39.773 Z 1.198 A -53.769 C -257.162 F 636 +G1 X 7.420 Y 39.819 Z 1.172 A -53.681 C -257.105 F 636 +G1 X 7.259 Y 39.853 Z 1.154 A -53.585 C -257.043 F 636 +G1 X 7.080 Y 39.876 Z 1.143 A -53.480 C -256.975 F 636 +G1 X 6.883 Y 39.886 Z 1.139 A -53.366 C -256.901 F 636 +G1 X 6.669 Y 39.884 Z 1.143 A -53.243 C -256.820 F 636 +G1 X 6.450 Y 39.870 Z 1.153 A -53.142 C -256.754 F 636 +G1 X 6.237 Y 39.847 Z 1.170 A -53.043 C -256.689 F 636 +G1 X 6.031 Y 39.814 Z 1.192 A -52.947 C -256.625 F 636 +G1 X 5.833 Y 39.771 Z 1.221 A -52.853 C -256.563 F 636 +G1 X 5.643 Y 39.718 Z 1.256 A -52.761 C -256.502 F 636 +G1 X 5.461 Y 39.654 Z 1.297 A -52.671 C -256.442 F 636 +G1 X 5.288 Y 39.579 Z 1.344 A -52.582 C -256.382 F 636 +G1 X 5.125 Y 39.494 Z 1.398 A -52.494 C -256.323 F 636 +G1 X 4.971 Y 39.398 Z 1.457 A -52.407 C -256.265 F 636 +G1 X 4.828 Y 39.291 Z 1.524 A -52.319 C -256.206 F 636 +G1 X 4.696 Y 39.173 Z 1.596 A -52.231 C -256.147 F 636 +G1 X 4.575 Y 39.043 Z 1.676 A -52.142 C -256.087 F 636 +G1 X 4.465 Y 38.902 Z 1.761 A -52.052 C -256.025 F 636 +G1 X 4.369 Y 38.748 Z 1.853 A -51.959 C -255.962 F 636 +G1 X 4.284 Y 38.583 Z 1.952 A -51.863 C -255.896 F 636 +G1 X 4.213 Y 38.406 Z 2.058 A -51.763 C -255.828 F 636 +G1 X 3.649 Y 36.792 Z 3.017 A -53.155 C -252.078 F 159 +G1 X 3.464 Y 36.313 Z 3.301 A -53.584 C -250.949 F 159 +G1 X 3.254 Y 35.837 Z 3.589 A -54.009 C -249.807 F 159 +G1 X 3.046 Y 35.419 Z 3.846 A -54.380 C -248.781 F 159 +G1 X 2.816 Y 35.003 Z 4.104 A -54.744 C -247.738 F 159 +G1 X 2.443 Y 34.411 Z 4.476 A -55.254 C -246.206 F 159 +G1 X 1.736 Y 33.436 Z 5.099 A -56.092 C -243.563 F 159 +G1 X 0.881 Y 32.267 Z 5.868 A -57.235 C -240.333 F 159 +G1 X 0.458 Y 31.682 Z 6.265 A -57.877 C -238.706 F 159 +G1 X 0.033 Y 31.096 Z 6.663 A -58.550 C -237.067 F 159 +G1 X -0.386 Y 30.510 Z 7.073 A -59.277 C -235.430 F 159 +G1 X -0.808 Y 29.924 Z 7.484 A -60.034 C -233.787 F 159 +G1 X -1.194 Y 29.380 Z 7.876 A -60.782 C -232.271 F 159 +G1 X -1.582 Y 28.836 Z 8.268 A -61.554 C -230.756 F 159 +G1 X -1.965 Y 28.293 Z 8.669 A -62.366 C -229.254 F 159 +G1 X -2.350 Y 27.750 Z 9.072 A -63.200 C -227.758 F 159 +G1 X -2.758 Y 27.165 Z 9.514 A -64.138 C -226.168 F 159 +G1 X -3.168 Y 26.582 Z 9.958 A -65.096 C -224.589 F 159 +G1 X -3.571 Y 25.999 Z 10.410 A -66.091 C -223.038 F 159 +G1 X -3.977 Y 25.418 Z 10.864 A -67.099 C -221.504 F 159 +G1 X -4.695 Y 24.356 Z 11.727 A -67.941 C -221.034 F 159 +G1 X -5.371 Y 23.318 Z 12.587 A -68.469 C -221.313 F 159 +G1 X -6.025 Y 22.276 Z 13.460 A -69.036 C -221.610 F 159 +G1 X -6.671 Y 21.202 Z 14.369 A -69.656 C -221.934 F 159 +G1 X -7.277 Y 20.147 Z 15.269 A -70.298 C -222.266 F 159 +G1 X -7.795 Y 19.201 Z 16.081 A -70.898 C -222.581 F 159 +G1 X -8.279 Y 18.263 Z 16.893 A -71.355 C -223.235 F 159 +G1 X -8.783 Y 17.222 Z 17.800 A -71.634 C -224.399 F 159 +G1 X -9.256 Y 16.174 Z 18.715 A -71.841 C -225.635 F 159 +G1 X -9.692 Y 15.124 Z 19.633 A -71.964 C -226.955 F 159 +G1 X -10.044 Y 14.201 Z 20.443 A -72.003 C -228.183 F 159 +G1 X -10.410 Y 13.143 Z 21.371 A -71.958 C -229.676 F 159 +G1 X -10.733 Y 12.086 Z 22.302 A -71.807 C -231.274 F 159 +G1 X -10.924 Y 11.380 Z 22.925 A -71.639 C -232.405 F 159 +G1 X -11.096 Y 10.674 Z 23.549 A -71.425 C -233.573 F 159 +G1 X -11.294 Y 9.732 Z 24.385 A -71.059 C -235.195 F 159 +G1 X -11.341 Y 9.427 Z 24.670 A -70.942 C -235.760 F 159 +G1 X -11.365 Y 9.097 Z 25.013 A -70.850 C -236.437 F 159 +G1 X -11.361 Y 8.784 Z 25.376 A -70.803 C -237.154 F 159 +G1 X -11.330 Y 8.494 Z 25.758 A -70.799 C -237.908 F 159 +G1 X -11.273 Y 8.224 Z 26.157 A -70.837 C -238.697 F 159 +G1 X -10.863 Y 7.070 Z 28.149 A -71.108 C -242.634 F 159 +G1 X -10.836 Y 7.017 Z 28.255 A -71.228 C -242.551 F 636 +G1 X -10.803 Y 6.989 Z 28.343 A -71.325 C -242.485 F 636 +G1 X -10.764 Y 6.986 Z 28.411 A -71.403 C -242.431 F 636 +G1 X -10.742 Y 6.993 Z 28.438 A -71.438 C -242.407 F 636 +G1 X -10.720 Y 7.007 Z 28.461 A -71.472 C -242.384 F 636 +G1 X -10.672 Y 7.050 Z 28.490 A -71.542 C -242.336 F 636 +G1 X -10.622 Y 7.116 Z 28.500 A -71.625 C -242.279 F 636 +G1 X -10.568 Y 7.203 Z 28.490 A -71.726 C -242.210 F 636 +G1 X -10.514 Y 7.310 Z 28.459 A -71.849 C -242.126 F 636 +G1 X -10.463 Y 7.424 Z 28.413 A -71.947 C -242.059 F 636 +G1 X -10.422 Y 7.532 Z 28.358 A -72.042 C -241.994 F 636 +G1 X -10.392 Y 7.633 Z 28.293 A -72.134 C -241.932 F 636 +G1 X -10.372 Y 7.726 Z 28.219 A -72.224 C -241.871 F 636 +G1 X -10.365 Y 7.811 Z 28.134 A -72.312 C -241.811 F 636 +G1 X -10.370 Y 7.886 Z 28.040 A -72.402 C -241.750 F 636 +G1 X -10.389 Y 7.950 Z 27.935 A -72.494 C -241.688 F 636 +G1 X -10.422 Y 8.002 Z 27.820 A -72.591 C -241.622 F 636 +G1 X -10.966 Y 8.619 Z 26.198 A -71.673 C -238.580 F 159 +G1 X -11.036 Y 8.715 Z 25.971 A -71.541 C -238.158 F 159 +G1 X -11.092 Y 8.826 Z 25.751 A -71.439 C -237.748 F 159 +G1 X -11.149 Y 9.016 Z 25.439 A -71.345 C -237.156 F 159 +G1 X -11.173 Y 9.233 Z 25.146 A -71.320 C -236.593 F 159 +G1 X -11.165 Y 9.473 Z 24.877 A -71.361 C -236.068 F 159 +G1 X -11.123 Y 9.730 Z 24.635 A -71.467 C -235.584 F 159 +G1 X -10.959 Y 10.336 Z 24.140 A -71.812 C -234.587 F 159 +G1 X -10.674 Y 11.258 Z 23.390 A -72.274 C -233.124 F 159 +G1 X -10.426 Y 11.973 Z 22.807 A -72.583 C -232.025 F 159 +G1 X -10.155 Y 12.684 Z 22.224 A -72.840 C -230.974 F 159 +G1 X -9.862 Y 13.391 Z 21.643 A -73.047 C -229.974 F 159 +G1 X -9.548 Y 14.093 Z 21.063 A -73.208 C -229.021 F 159 +G1 X -9.214 Y 14.791 Z 20.484 A -73.327 C -228.110 F 159 +G1 X -8.732 Y 15.722 Z 19.707 A -73.428 C -226.945 F 159 +G1 X -8.156 Y 16.745 Z 18.846 A -73.476 C -225.705 F 159 +G1 X -7.538 Y 17.759 Z 17.988 A -73.424 C -224.596 F 159 +G1 X -6.917 Y 18.704 Z 17.182 A -73.237 C -223.785 F 159 +G1 X -6.206 Y 19.717 Z 16.321 A -72.769 C -223.527 F 159 +G1 X -5.459 Y 20.715 Z 15.468 A -72.330 C -223.305 F 159 +G1 X -4.681 Y 21.694 Z 14.628 A -71.930 C -223.103 F 159 +G1 X -4.038 Y 22.466 Z 13.965 A -71.638 C -222.955 F 159 +G1 X -3.376 Y 23.229 Z 13.308 A -71.373 C -222.820 F 159 +G1 X -2.524 Y 24.168 Z 12.499 A -71.076 C -222.668 F 159 +G1 X -1.576 Y 25.188 Z 11.647 A -69.689 C -224.911 F 159 +G1 X -1.082 Y 25.707 Z 11.219 A -68.867 C -226.393 F 159 +G1 X -0.590 Y 26.227 Z 10.793 A -68.063 C -227.874 F 159 +G1 X -0.089 Y 26.741 Z 10.375 A -67.299 C -229.355 F 159 +G1 X 0.409 Y 27.255 Z 9.958 A -66.555 C -230.829 F 159 +G1 X 0.916 Y 27.764 Z 9.550 A -65.855 C -232.298 F 159 +G1 X 1.422 Y 28.272 Z 9.142 A -65.177 C -233.755 F 159 +G1 X 2.407 Y 29.237 Z 8.377 A -63.981 C -236.519 F 159 +G1 X 3.242 Y 30.038 Z 7.749 A -63.077 C -238.788 F 159 +G1 X 3.846 Y 30.602 Z 7.312 A -62.494 C -240.376 F 159 +G1 X 4.449 Y 31.166 Z 6.876 A -61.941 C -241.932 F 159 +G1 X 5.509 Y 32.129 Z 6.142 A -61.101 C -244.553 F 159 +G1 X 6.397 Y 32.923 Z 5.550 A -60.502 C -246.653 F 159 +G1 X 7.282 Y 33.714 Z 4.960 A -59.956 C -248.676 F 159 +G1 X 8.676 Y 34.999 Z 4.036 A -59.193 C -251.787 F 159 +G1 X 9.874 Y 36.127 Z 3.254 A -58.640 C -254.362 F 159 +G1 X 11.449 Y 37.750 Z 2.140 A -57.888 C -257.780 F 159 +G1 X 11.638 Y 37.957 Z 1.999 A -57.699 C -257.716 F 636 +G1 X 11.804 Y 38.162 Z 1.860 A -57.519 C -257.655 F 636 +G1 X 11.947 Y 38.364 Z 1.725 A -57.348 C -257.596 F 636 +G1 X 12.068 Y 38.565 Z 1.592 A -57.185 C -257.540 F 636 +G1 X 12.167 Y 38.762 Z 1.463 A -57.030 C -257.487 F 636 +G1 X 12.244 Y 38.957 Z 1.336 A -56.883 C -257.436 F 636 +G1 X 12.300 Y 39.149 Z 1.213 A -56.741 C -257.386 F 636 +G1 X 12.336 Y 39.337 Z 1.093 A -56.604 C -257.339 F 636 +G1 X 12.352 Y 39.521 Z 0.976 A -56.472 C -257.293 F 636 +G1 X 12.348 Y 39.702 Z 0.863 A -56.344 C -257.247 F 636 +G1 X 12.325 Y 39.878 Z 0.754 A -56.217 C -257.203 F 636 +G1 X 12.283 Y 40.050 Z 0.648 A -56.093 C -257.159 F 636 +G1 X 12.223 Y 40.217 Z 0.547 A -55.970 C -257.116 F 636 +G1 X 12.146 Y 40.379 Z 0.449 A -55.846 C -257.072 F 636 +G1 X 12.051 Y 40.535 Z 0.355 A -55.722 C -257.027 F 636 +G1 X 11.939 Y 40.687 Z 0.265 A -55.596 C -256.982 F 636 +G1 X 11.811 Y 40.832 Z 0.179 A -55.468 C -256.937 F 636 +G1 X 11.667 Y 40.972 Z 0.098 A -55.338 C -256.890 F 636 +G1 X 11.508 Y 41.105 Z 0.021 A -55.204 C -256.842 F 636 +G1 X 11.333 Y 41.231 Z -0.051 A -55.067 C -256.792 F 636 +G1 X 11.145 Y 41.351 Z -0.119 A -54.926 C -256.741 F 636 +G1 X 10.942 Y 41.463 Z -0.182 A -54.781 C -256.688 F 636 +G1 X 10.726 Y 41.568 Z -0.241 A -54.632 C -256.633 F 636 +G1 X 10.496 Y 41.666 Z -0.294 A -54.479 C -256.577 F 636 +G1 X 10.255 Y 41.755 Z -0.342 A -54.321 C -256.519 F 636 +G1 X 10.001 Y 41.837 Z -0.386 A -54.158 C -256.458 F 636 +G1 X 9.735 Y 41.910 Z -0.424 A -53.990 C -256.396 F 636 +G1 X 9.458 Y 41.974 Z -0.457 A -53.818 C -256.332 F 636 +G1 X 9.171 Y 42.029 Z -0.484 A -53.641 C -256.265 F 636 +G1 X 8.873 Y 42.075 Z -0.506 A -53.459 C -256.196 F 636 +G1 X 8.565 Y 42.112 Z -0.522 A -53.272 C -256.126 F 636 +G1 X 8.249 Y 42.139 Z -0.533 A -53.081 C -256.053 F 636 +G1 X 7.928 Y 42.157 Z -0.538 A -52.916 C -255.989 F 636 +G1 X 7.608 Y 42.168 Z -0.538 A -52.751 C -255.926 F 636 +G1 X 7.290 Y 42.172 Z -0.533 A -52.588 C -255.863 F 636 +G1 X 6.974 Y 42.168 Z -0.523 A -52.425 C -255.800 F 636 +G1 X 6.661 Y 42.157 Z -0.508 A -52.264 C -255.737 F 636 +G1 X 6.351 Y 42.138 Z -0.488 A -52.104 C -255.674 F 636 +G1 X 6.045 Y 42.111 Z -0.463 A -51.946 C -255.612 F 636 +G1 X 5.743 Y 42.075 Z -0.433 A -51.789 C -255.550 F 636 +G1 X 5.446 Y 42.032 Z -0.397 A -51.634 C -255.488 F 636 +G1 X 5.154 Y 41.980 Z -0.356 A -51.481 C -255.427 F 636 +G1 X 4.869 Y 41.920 Z -0.310 A -51.329 C -255.367 F 636 +G1 X 4.589 Y 41.851 Z -0.259 A -51.179 C -255.306 F 636 +G1 X 4.317 Y 41.774 Z -0.203 A -51.031 C -255.246 F 636 +G1 X 4.052 Y 41.688 Z -0.141 A -50.885 C -255.187 F 636 +G1 X 3.795 Y 41.592 Z -0.074 A -50.741 C -255.128 F 636 +G1 X 3.547 Y 41.487 Z -0.002 A -50.598 C -255.069 F 636 +G1 X 3.308 Y 41.373 Z 0.075 A -50.456 C -255.011 F 636 +G1 X 3.078 Y 41.250 Z 0.158 A -50.316 C -254.953 F 636 +G1 X 2.859 Y 41.117 Z 0.247 A -50.177 C -254.896 F 636 +G1 X 2.650 Y 40.974 Z 0.340 A -50.039 C -254.838 F 636 +G1 X 2.452 Y 40.822 Z 0.440 A -49.901 C -254.781 F 636 +G1 X 2.266 Y 40.659 Z 0.544 A -49.764 C -254.723 F 636 +G1 X 2.092 Y 40.486 Z 0.654 A -49.627 C -254.665 F 636 +G1 X 1.931 Y 40.303 Z 0.770 A -49.489 C -254.606 F 636 +G1 X 1.784 Y 40.110 Z 0.891 A -49.350 C -254.547 F 636 +G1 X 1.650 Y 39.906 Z 1.017 A -49.209 C -254.487 F 636 +G1 X 1.530 Y 39.691 Z 1.149 A -49.066 C -254.426 F 636 +G1 X 1.426 Y 39.465 Z 1.287 A -48.921 C -254.363 F 636 +G1 X 1.336 Y 39.229 Z 1.430 A -48.772 C -254.299 F 636 +G1 X 1.263 Y 38.981 Z 1.579 A -48.620 C -254.232 F 636 +G1 X 1.206 Y 38.722 Z 1.733 A -48.463 C -254.164 F 636 +G1 X 1.166 Y 38.451 Z 1.893 A -48.302 C -254.093 F 636 +G1 X 0.973 Y 36.745 Z 2.900 A -50.315 C -249.965 F 159 +G1 X 0.945 Y 36.530 Z 3.027 A -50.578 C -249.449 F 159 +G1 X 0.860 Y 36.100 Z 3.283 A -51.085 C -248.402 F 159 +G1 X 0.736 Y 35.671 Z 3.540 A -51.565 C -247.328 F 159 +G1 X 0.571 Y 35.243 Z 3.797 A -52.016 C -246.221 F 159 +G1 X 0.364 Y 34.820 Z 4.051 A -52.433 C -245.083 F 159 +G1 X -0.316 Y 33.670 Z 4.755 A -53.548 C -241.854 F 159 +G1 X -0.754 Y 32.938 Z 5.209 A -54.325 C -239.783 F 159 +G1 X -1.125 Y 32.313 Z 5.611 A -55.055 C -238.019 F 159 +G1 X -1.497 Y 31.688 Z 6.015 A -55.820 C -236.253 F 159 +G1 X -1.865 Y 31.066 Z 6.431 A -56.642 C -234.505 F 159 +G1 X -2.236 Y 30.444 Z 6.849 A -57.496 C -232.763 F 159 +G1 X -2.602 Y 29.824 Z 7.277 A -58.403 C -231.045 F 159 +G1 X -2.969 Y 29.205 Z 7.708 A -59.339 C -229.340 F 159 +G1 X -3.344 Y 28.569 Z 8.164 A -60.355 C -227.610 F 159 +G1 X -3.722 Y 27.934 Z 8.621 A -61.395 C -225.901 F 159 +G1 X -4.082 Y 27.322 Z 9.075 A -62.445 C -224.281 F 159 +G1 X -4.445 Y 26.712 Z 9.530 A -63.512 C -222.684 F 159 +G1 X -4.801 Y 26.104 Z 9.994 A -64.611 C -221.129 F 159 +G1 X -5.154 Y 25.506 Z 10.454 A -65.628 C -219.789 F 159 +G1 X -5.757 Y 24.428 Z 11.322 A -66.256 C -220.131 F 159 +G1 X -6.342 Y 23.351 Z 12.204 A -66.919 C -220.488 F 159 +G1 X -6.909 Y 22.274 Z 13.101 A -67.618 C -220.861 F 159 +G1 X -7.461 Y 21.184 Z 14.021 A -68.358 C -221.253 F 159 +G1 X -7.982 Y 20.113 Z 14.937 A -69.116 C -221.651 F 159 +G1 X -8.468 Y 19.065 Z 15.844 A -69.871 C -222.083 F 159 +G1 X -8.929 Y 18.001 Z 16.777 A -70.391 C -223.081 F 159 +G1 X -9.360 Y 16.943 Z 17.712 A -70.779 C -224.265 F 159 +G1 X -9.759 Y 15.886 Z 18.653 A -71.062 C -225.580 F 159 +G1 X -10.127 Y 14.830 Z 19.599 A -71.271 C -226.953 F 159 +G1 X -10.431 Y 13.872 Z 20.462 A -71.384 C -228.274 F 159 +G1 X -10.721 Y 12.852 Z 21.386 A -71.415 C -229.771 F 159 +G1 X -10.984 Y 11.798 Z 22.348 A -71.336 C -231.432 F 159 +G1 X -11.207 Y 10.750 Z 23.312 A -71.142 C -233.191 F 159 +G1 X -11.349 Y 9.951 Z 24.051 A -70.918 C -234.596 F 159 +G1 X -11.425 Y 9.432 Z 24.540 A -70.740 C -235.551 F 159 +G1 X -11.457 Y 9.096 Z 24.876 A -70.634 C -236.217 F 159 +G1 X -11.471 Y 8.769 Z 25.223 A -70.542 C -236.911 F 159 +G1 X -11.470 Y 8.452 Z 25.580 A -70.462 C -237.632 F 159 +G1 X -11.442 Y 7.996 Z 26.133 A -70.362 C -238.757 F 159 +G1 X -11.191 Y 6.686 Z 28.012 A -70.183 C -242.539 F 159 +G1 X -11.175 Y 6.624 Z 28.107 A -70.304 C -242.500 F 636 +G1 X -11.153 Y 6.576 Z 28.197 A -70.414 C -242.464 F 636 +G1 X -11.126 Y 6.541 Z 28.282 A -70.515 C -242.432 F 636 +G1 X -11.093 Y 6.518 Z 28.360 A -70.607 C -242.402 F 636 +G1 X -11.056 Y 6.508 Z 28.433 A -70.694 C -242.374 F 636 +G1 X -11.015 Y 6.510 Z 28.499 A -70.776 C -242.348 F 636 +G1 X -10.970 Y 6.523 Z 28.559 A -70.856 C -242.322 F 636 +G1 X -10.922 Y 6.547 Z 28.613 A -70.936 C -242.296 F 636 +G1 X -10.870 Y 6.581 Z 28.659 A -71.019 C -242.270 F 636 +G1 X -10.815 Y 6.626 Z 28.699 A -71.104 C -242.243 F 636 +G1 X -10.758 Y 6.681 Z 28.732 A -71.194 C -242.214 F 636 +G1 X -10.699 Y 6.745 Z 28.758 A -71.290 C -242.183 F 636 +G1 X -10.638 Y 6.818 Z 28.777 A -71.393 C -242.150 F 636 +G1 X -10.575 Y 6.900 Z 28.787 A -71.502 C -242.116 F 636 +G1 X -10.512 Y 6.990 Z 28.791 A -71.618 C -242.079 F 636 +G1 X -10.448 Y 7.088 Z 28.786 A -71.741 C -242.039 F 636 +G1 X -10.327 Y 7.289 Z 28.758 A -71.955 C -241.972 F 636 +G1 X -10.274 Y 7.388 Z 28.735 A -72.058 C -241.939 F 636 +G1 X -10.226 Y 7.484 Z 28.706 A -72.159 C -241.907 F 636 +G1 X -10.183 Y 7.578 Z 28.671 A -72.258 C -241.876 F 636 +G1 X -10.146 Y 7.669 Z 28.630 A -72.354 C -241.845 F 636 +G1 X -10.115 Y 7.756 Z 28.583 A -72.448 C -241.816 F 636 +G1 X -10.090 Y 7.839 Z 28.530 A -72.541 C -241.787 F 636 +G1 X -10.072 Y 7.918 Z 28.471 A -72.632 C -241.758 F 636 +G1 X -10.061 Y 7.993 Z 28.405 A -72.722 C -241.730 F 636 +G1 X -10.057 Y 8.062 Z 28.333 A -72.812 C -241.701 F 636 +G1 X -10.061 Y 8.125 Z 28.254 A -72.904 C -241.673 F 636 +G1 X -10.073 Y 8.182 Z 28.170 A -72.997 C -241.643 F 636 +G1 X -10.094 Y 8.233 Z 28.078 A -73.094 C -241.613 F 636 +G1 X -10.123 Y 8.276 Z 27.980 A -73.194 C -241.582 F 636 +G1 X -10.161 Y 8.313 Z 27.875 A -73.300 C -241.549 F 636 +G1 X -10.815 Y 8.806 Z 26.218 A -72.073 C -238.520 F 159 +G1 X -10.907 Y 8.882 Z 25.979 A -71.881 C -238.092 F 159 +G1 X -10.979 Y 8.979 Z 25.747 A -71.735 C -237.671 F 159 +G1 X -11.031 Y 9.096 Z 25.526 A -71.634 C -237.261 F 159 +G1 X -11.063 Y 9.230 Z 25.317 A -71.579 C -236.868 F 159 +G1 X -11.075 Y 9.364 Z 25.140 A -71.566 C -236.529 F 159 +G1 X -11.070 Y 9.508 Z 24.976 A -71.587 C -236.208 F 159 +G1 X -11.034 Y 9.740 Z 24.753 A -71.678 C -235.764 F 159 +G1 X -11.014 Y 9.820 Z 24.685 A -71.725 C -235.626 F 159 +G1 X -10.807 Y 10.477 Z 24.177 A -72.152 C -234.587 F 159 +G1 X -10.553 Y 11.202 Z 23.617 A -72.581 C -233.475 F 159 +G1 X -10.273 Y 11.921 Z 23.057 A -72.966 C -232.396 F 159 +G1 X -9.969 Y 12.634 Z 22.499 A -73.302 C -231.364 F 159 +G1 X -9.640 Y 13.341 Z 21.942 A -73.588 C -230.383 F 159 +G1 X -9.288 Y 14.042 Z 21.386 A -73.829 C -229.449 F 159 +G1 X -8.914 Y 14.735 Z 20.831 A -74.029 C -228.558 F 159 +G1 X -8.529 Y 15.402 Z 20.293 A -74.187 C -227.729 F 159 +G1 X -8.120 Y 16.069 Z 19.751 A -74.313 C -226.928 F 159 +G1 X -7.684 Y 16.737 Z 19.202 A -74.415 C -226.135 F 159 +G1 X -7.227 Y 17.399 Z 18.654 A -74.467 C -225.411 F 159 +G1 X -6.648 Y 18.188 Z 17.993 A -74.490 C -224.581 F 159 +G1 X -6.138 Y 18.844 Z 17.442 A -74.310 C -224.300 F 159 +G1 X -5.335 Y 19.817 Z 16.618 A -73.959 C -224.125 F 159 +G1 X -4.494 Y 20.768 Z 15.803 A -73.645 C -223.968 F 159 +G1 X -3.620 Y 21.693 Z 15.000 A -73.369 C -223.830 F 159 +G1 X -2.713 Y 22.596 Z 14.208 A -73.131 C -223.711 F 159 +G1 X -1.739 Y 23.509 Z 13.397 A -72.921 C -223.606 F 159 +G1 X -0.726 Y 24.427 Z 12.591 A -72.031 C -225.039 F 159 +G1 X -0.187 Y 24.904 Z 12.178 A -71.279 C -226.463 F 159 +G1 X 0.350 Y 25.382 Z 11.765 A -70.545 C -227.880 F 159 +G1 X 1.440 Y 26.318 Z 10.956 A -69.169 C -230.680 F 159 +G1 X 2.369 Y 27.089 Z 10.288 A -68.103 C -232.989 F 159 +G1 X 3.427 Y 27.940 Z 9.550 A -67.007 C -235.522 F 159 +G1 X 4.557 Y 28.818 Z 8.788 A -65.970 C -238.104 F 159 +G1 X 5.819 Y 29.762 Z 7.968 A -64.967 C -240.830 F 159 +G1 X 6.975 Y 30.594 Z 7.245 A -64.181 C -243.178 F 159 +G1 X 8.143 Y 31.406 Z 6.540 A -63.504 C -245.405 F 159 +G1 X 9.323 Y 32.196 Z 5.854 A -62.929 C -247.508 F 159 +G1 X 10.515 Y 32.968 Z 5.185 A -62.447 C -249.491 F 159 +G1 X 11.719 Y 33.721 Z 4.536 A -62.049 C -251.354 F 159 +G1 X 12.933 Y 34.457 Z 3.905 A -61.729 C -253.102 F 159 +G1 X 13.972 Y 35.068 Z 3.385 A -61.511 C -254.496 F 159 +G1 X 15.862 Y 36.304 Z 2.363 A -61.061 C -257.056 F 159 +G1 X 16.069 Y 36.444 Z 2.248 A -60.899 C -257.009 F 636 +G1 X 16.264 Y 36.586 Z 2.133 A -60.743 C -256.964 F 636 +G1 X 16.446 Y 36.729 Z 2.018 A -60.591 C -256.920 F 636 +G1 X 16.616 Y 36.874 Z 1.904 A -60.444 C -256.877 F 636 +G1 X 16.774 Y 37.020 Z 1.790 A -60.301 C -256.835 F 636 +G1 X 16.920 Y 37.167 Z 1.676 A -60.162 C -256.794 F 636 +G1 X 17.055 Y 37.316 Z 1.563 A -60.027 C -256.755 F 636 +G1 X 17.177 Y 37.465 Z 1.451 A -59.896 C -256.716 F 636 +G1 X 17.289 Y 37.616 Z 1.339 A -59.768 C -256.678 F 636 +G1 X 17.389 Y 37.767 Z 1.227 A -59.644 C -256.641 F 636 +G1 X 17.478 Y 37.918 Z 1.116 A -59.522 C -256.605 F 636 +G1 X 17.556 Y 38.071 Z 1.006 A -59.402 C -256.569 F 636 +G1 X 17.623 Y 38.223 Z 0.897 A -59.286 C -256.534 F 636 +G1 X 17.680 Y 38.376 Z 0.788 A -59.171 C -256.500 F 636 +G1 X 17.726 Y 38.530 Z 0.681 A -59.058 C -256.466 F 636 +G1 X 17.762 Y 38.683 Z 0.574 A -58.946 C -256.432 F 636 +G1 X 17.788 Y 38.836 Z 0.468 A -58.836 C -256.399 F 636 +G1 X 17.803 Y 38.990 Z 0.363 A -58.726 C -256.365 F 636 +G1 X 17.809 Y 39.143 Z 0.259 A -58.618 C -256.333 F 636 +G1 X 17.805 Y 39.296 Z 0.156 A -58.510 C -256.300 F 636 +G1 X 17.792 Y 39.448 Z 0.054 A -58.402 C -256.267 F 636 +G1 X 17.769 Y 39.600 Z -0.046 A -58.295 C -256.234 F 636 +G1 X 17.737 Y 39.751 Z -0.146 A -58.187 C -256.201 F 636 +G1 X 17.696 Y 39.902 Z -0.244 A -58.079 C -256.168 F 636 +G1 X 17.645 Y 40.051 Z -0.341 A -57.971 C -256.134 F 636 +G1 X 17.587 Y 40.200 Z -0.436 A -57.862 C -256.101 F 636 +G1 X 17.519 Y 40.348 Z -0.531 A -57.752 C -256.067 F 636 +G1 X 17.443 Y 40.494 Z -0.623 A -57.641 C -256.032 F 636 +G1 X 17.359 Y 40.639 Z -0.715 A -57.529 C -255.997 F 636 +G1 X 17.267 Y 40.783 Z -0.805 A -57.416 C -255.962 F 636 +G1 X 17.166 Y 40.925 Z -0.893 A -57.302 C -255.926 F 636 +G1 X 17.058 Y 41.066 Z -0.980 A -57.186 C -255.890 F 636 +G1 X 16.942 Y 41.205 Z -1.065 A -57.069 C -255.853 F 636 +G1 X 16.819 Y 41.342 Z -1.148 A -56.951 C -255.816 F 636 +G1 X 16.550 Y 41.611 Z -1.309 A -56.709 C -255.740 F 636 +G1 X 16.253 Y 41.871 Z -1.463 A -56.462 C -255.661 F 636 +G1 X 15.929 Y 42.121 Z -1.610 A -56.207 C -255.579 F 636 +G1 X 15.580 Y 42.361 Z -1.748 A -55.946 C -255.495 F 636 +G1 X 15.206 Y 42.590 Z -1.878 A -55.679 C -255.408 F 636 +G1 X 14.808 Y 42.807 Z -1.999 A -55.405 C -255.319 F 636 +G1 X 14.389 Y 43.011 Z -2.111 A -55.125 C -255.227 F 636 +G1 X 13.949 Y 43.201 Z -2.213 A -54.838 C -255.132 F 636 +G1 X 13.489 Y 43.377 Z -2.306 A -54.546 C -255.034 F 636 +G1 X 13.012 Y 43.537 Z -2.388 A -54.248 C -254.934 F 636 +G1 X 12.517 Y 43.681 Z -2.460 A -53.944 C -254.831 F 636 +G1 X 12.006 Y 43.808 Z -2.521 A -53.635 C -254.725 F 636 +G1 X 11.481 Y 43.917 Z -2.570 A -53.321 C -254.617 F 636 +G1 X 10.943 Y 44.006 Z -2.608 A -53.002 C -254.506 F 636 +G1 X 10.393 Y 44.076 Z -2.634 A -52.678 C -254.393 F 636 +G1 X 9.834 Y 44.130 Z -2.649 A -52.394 C -254.292 F 636 +G1 X 9.272 Y 44.171 Z -2.653 A -52.107 C -254.190 F 636 +G1 X 8.706 Y 44.200 Z -2.648 A -51.821 C -254.087 F 636 +G1 X 8.140 Y 44.216 Z -2.633 A -51.533 C -253.983 F 636 +G1 X 7.575 Y 44.219 Z -2.607 A -51.246 C -253.878 F 636 +G1 X 7.011 Y 44.208 Z -2.572 A -50.960 C -253.773 F 636 +G1 X 6.451 Y 44.183 Z -2.527 A -50.675 C -253.667 F 636 +G1 X 5.896 Y 44.145 Z -2.473 A -50.392 C -253.561 F 636 +G1 X 5.347 Y 44.092 Z -2.408 A -50.111 C -253.455 F 636 +G1 X 4.807 Y 44.024 Z -2.333 A -49.833 C -253.349 F 636 +G1 X 4.276 Y 43.941 Z -2.249 A -49.558 C -253.243 F 636 +G1 X 3.757 Y 43.843 Z -2.155 A -49.287 C -253.138 F 636 +G1 X 3.250 Y 43.730 Z -2.052 A -49.019 C -253.033 F 636 +G1 X 2.757 Y 43.600 Z -1.938 A -48.756 C -252.929 F 636 +G1 X 2.281 Y 43.455 Z -1.815 A -48.496 C -252.826 F 636 +G1 X 1.821 Y 43.293 Z -1.682 A -48.241 C -252.724 F 636 +G1 X 1.381 Y 43.114 Z -1.540 A -47.991 C -252.623 F 636 +G1 X 0.960 Y 42.918 Z -1.388 A -47.745 C -252.523 F 636 +G1 X 0.562 Y 42.705 Z -1.226 A -47.503 C -252.423 F 636 +G1 X 0.372 Y 42.591 Z -1.142 A -47.383 C -252.374 F 636 +G1 X 0.187 Y 42.474 Z -1.055 A -47.265 C -252.325 F 636 +G1 X 0.009 Y 42.351 Z -0.966 A -47.147 C -252.276 F 636 +G1 X -0.163 Y 42.225 Z -0.875 A -47.030 C -252.227 F 636 +G1 X -0.328 Y 42.093 Z -0.781 A -46.913 C -252.178 F 636 +G1 X -0.486 Y 41.958 Z -0.684 A -46.798 C -252.129 F 636 +G1 X -0.638 Y 41.817 Z -0.586 A -46.682 C -252.080 F 636 +G1 X -0.782 Y 41.672 Z -0.485 A -46.567 C -252.032 F 636 +G1 X -0.918 Y 41.522 Z -0.381 A -46.453 C -251.983 F 636 +G1 X -1.048 Y 41.367 Z -0.276 A -46.338 C -251.934 F 636 +G1 X -1.169 Y 41.208 Z -0.168 A -46.224 C -251.884 F 636 +G1 X -1.282 Y 41.043 Z -0.057 A -46.109 C -251.835 F 636 +G1 X -1.388 Y 40.874 Z 0.056 A -45.994 C -251.785 F 636 +G1 X -1.484 Y 40.700 Z 0.171 A -45.878 C -251.734 F 636 +G1 X -1.573 Y 40.521 Z 0.288 A -45.761 C -251.684 F 636 +G1 X -1.653 Y 40.337 Z 0.408 A -45.644 C -251.632 F 636 +G1 X -1.723 Y 40.148 Z 0.530 A -45.525 C -251.580 F 636 +G1 X -1.785 Y 39.954 Z 0.655 A -45.405 C -251.527 F 636 +G1 X -1.837 Y 39.755 Z 0.782 A -45.284 C -251.473 F 636 +G1 X -1.880 Y 39.551 Z 0.911 A -45.161 C -251.418 F 636 +G1 X -1.913 Y 39.341 Z 1.043 A -45.035 C -251.361 F 636 +G1 X -1.937 Y 39.127 Z 1.176 A -44.908 C -251.304 F 636 +G1 X -1.950 Y 38.907 Z 1.313 A -44.778 C -251.245 F 636 +G1 X -1.953 Y 38.682 Z 1.451 A -44.645 C -251.185 F 636 +G1 X -1.945 Y 38.451 Z 1.592 A -44.509 C -251.123 F 636 +G1 X -1.927 Y 38.215 Z 1.735 A -44.371 C -251.059 F 636 +G1 X -1.758 Y 36.498 Z 2.774 A -47.126 C -246.789 F 159 +G1 X -1.739 Y 36.300 Z 2.895 A -47.454 C -246.317 F 159 +G1 X -1.747 Y 36.000 Z 3.076 A -47.910 C -245.568 F 159 +G1 X -1.797 Y 35.696 Z 3.255 A -48.321 C -244.772 F 159 +G1 X -1.893 Y 35.390 Z 3.433 A -48.684 C -243.922 F 159 +G1 X -2.387 Y 34.313 Z 4.058 A -49.856 C -240.762 F 159 +G1 X -2.746 Y 33.543 Z 4.511 A -50.764 C -238.508 F 159 +G1 X -3.054 Y 32.879 Z 4.919 A -51.623 C -236.585 F 159 +G1 X -3.364 Y 32.215 Z 5.329 A -52.522 C -234.677 F 159 +G1 X -3.671 Y 31.556 Z 5.752 A -53.481 C -232.807 F 159 +G1 X -3.980 Y 30.898 Z 6.177 A -54.475 C -230.962 F 159 +G1 X -4.286 Y 30.244 Z 6.614 A -55.523 C -229.160 F 159 +G1 X -4.595 Y 29.592 Z 7.053 A -56.599 C -227.388 F 159 +G1 X -4.930 Y 28.881 Z 7.550 A -57.837 C -225.495 F 159 +G1 X -5.268 Y 28.171 Z 8.049 A -59.100 C -223.643 F 159 +G1 X -5.601 Y 27.468 Z 8.561 A -60.408 C -221.855 F 159 +G1 X -5.936 Y 26.768 Z 9.074 A -61.731 C -220.112 F 159 +G1 X -6.494 Y 25.566 Z 9.993 A -63.458 C -218.584 F 159 +G1 X -6.984 Y 24.446 Z 10.886 A -64.269 C -219.039 F 159 +G1 X -7.460 Y 23.331 Z 11.793 A -65.108 C -219.503 F 159 +G1 X -7.921 Y 22.221 Z 12.716 A -65.974 C -219.977 F 159 +G1 X -8.467 Y 20.861 Z 13.872 A -67.078 C -220.572 F 159 +G1 X -8.847 Y 19.873 Z 14.725 A -67.904 C -221.013 F 159 +G1 X -9.249 Y 18.778 Z 15.687 A -68.762 C -221.686 F 159 +G1 X -9.616 Y 17.705 Z 16.647 A -69.338 C -222.886 F 159 +G1 X -9.961 Y 16.637 Z 17.612 A -69.829 C -224.159 F 159 +G1 X -10.279 Y 15.573 Z 18.585 A -70.233 C -225.513 F 159 +G1 X -10.569 Y 14.514 Z 19.563 A -70.546 C -226.947 F 159 +G1 X -10.791 Y 13.621 Z 20.396 A -70.737 C -228.231 F 159 +G1 X -10.950 Y 12.921 Z 21.055 A -70.835 C -229.290 F 159 +G1 X -11.160 Y 11.875 Z 22.047 A -70.885 C -230.973 F 159 +G1 X -11.335 Y 10.838 Z 23.041 A -70.814 C -232.757 F 159 +G1 X -11.448 Y 10.021 Z 23.833 A -70.677 C -234.233 F 159 +G1 X -11.550 Y 9.072 Z 24.763 A -70.411 C -236.045 F 159 +G1 X -11.602 Y 8.395 Z 25.433 A -70.140 C -237.412 F 159 +G1 X -11.636 Y 7.724 Z 26.106 A -69.806 C -238.820 F 159 +G1 X -11.542 Y 6.267 Z 27.850 A -69.177 C -242.389 F 159 +G1 X -12.672 Y -3.573 Z 27.743 A -71.841 C -293.080 F 636 +G1 X -13.521 Y -3.437 Z 26.178 A -71.266 C -290.069 F 159 +G1 X -13.702 Y -3.384 Z 25.858 A -71.158 C -289.454 F 159 +G1 X -13.886 Y -3.301 Z 25.552 A -71.093 C -288.865 F 159 +G1 X -14.071 Y -3.188 Z 25.262 A -71.073 C -288.301 F 159 +G1 X -14.255 Y -3.046 Z 24.986 A -71.096 C -287.764 F 159 +G1 X -14.435 Y -2.875 Z 24.729 A -71.164 C -287.257 F 159 +G1 X -14.578 Y -2.717 Z 24.534 A -71.252 C -286.868 F 159 +G1 X -14.985 Y -2.198 Z 23.987 A -71.566 C -285.782 F 159 +G1 X -15.579 Y -1.385 Z 23.162 A -71.965 C -284.202 F 159 +G1 X -15.998 Y -0.771 Z 22.558 A -72.202 C -283.085 F 159 +G1 X -16.402 Y -0.141 Z 21.956 A -72.387 C -282.020 F 159 +G1 X -16.792 Y 0.503 Z 21.354 A -72.522 C -281.005 F 159 +G1 X -17.331 Y 1.462 Z 20.484 A -72.638 C -279.613 F 159 +G1 X -17.812 Y 2.389 Z 19.669 A -72.669 C -278.383 F 159 +G1 X -18.311 Y 3.431 Z 18.778 A -72.625 C -277.114 F 159 +G1 X -18.780 Y 4.499 Z 17.890 A -72.500 C -275.930 F 159 +G1 X -19.076 Y 5.223 Z 17.302 A -72.381 C -275.174 F 159 +G1 X -19.511 Y 6.371 Z 16.396 A -71.935 C -274.534 F 159 +G1 X -19.911 Y 7.528 Z 15.512 A -71.371 C -274.247 F 159 +G1 X -20.285 Y 8.702 Z 14.638 A -70.844 C -273.978 F 159 +G1 X -20.625 Y 9.862 Z 13.797 A -70.367 C -273.733 F 159 +G1 X -20.947 Y 11.056 Z 12.954 A -69.921 C -273.502 F 159 +G1 X -21.247 Y 12.272 Z 12.117 A -69.512 C -273.290 F 159 +G1 X -21.546 Y 13.574 Z 11.258 A -68.408 C -274.635 F 159 +G1 X -21.698 Y 14.270 Z 10.817 A -67.494 C -276.153 F 159 +G1 X -21.853 Y 14.966 Z 10.377 A -66.596 C -277.678 F 159 +G1 X -22.000 Y 15.666 Z 9.946 A -65.737 C -279.218 F 159 +G1 X -22.149 Y 16.365 Z 9.515 A -64.898 C -280.761 F 159 +G1 X -22.291 Y 17.068 Z 9.094 A -64.103 C -282.310 F 159 +G1 X -22.435 Y 17.769 Z 8.674 A -63.332 C -283.855 F 159 +G1 X -22.578 Y 18.502 Z 8.248 A -62.581 C -285.462 F 159 +G1 X -22.722 Y 19.234 Z 7.823 A -61.858 C -287.059 F 159 +G1 X -22.986 Y 20.647 Z 7.027 A -60.593 C -290.109 F 159 +G1 X -23.243 Y 22.093 Z 6.238 A -59.462 C -293.162 F 159 +G1 X -23.483 Y 23.514 Z 5.489 A -58.507 C -296.080 F 159 +G1 X -23.640 Y 24.460 Z 5.002 A -57.948 C -297.972 F 159 +G1 X -23.825 Y 25.391 Z 4.516 A -57.404 C -299.825 F 159 +G1 X -24.045 Y 26.311 Z 4.026 A -56.865 C -301.657 F 159 +G1 X -24.254 Y 27.069 Z 3.618 A -56.426 C -303.170 F 159 +G1 X -24.532 Y 27.967 Z 3.134 A -55.918 C -304.961 F 159 +G1 X -25.290 Y 30.107 Z 1.937 A -54.730 C -309.204 F 159 +G1 X -25.359 Y 30.280 Z 1.837 A -54.607 C -309.127 F 636 +G1 X -25.436 Y 30.429 Z 1.743 A -54.496 C -309.056 F 636 +G1 X -25.520 Y 30.554 Z 1.655 A -54.395 C -308.992 F 636 +G1 X -25.610 Y 30.655 Z 1.574 A -54.304 C -308.935 F 636 +G1 X -25.706 Y 30.732 Z 1.500 A -54.220 C -308.881 F 636 +G1 X -25.807 Y 30.786 Z 1.432 A -54.143 C -308.832 F 636 +G1 X -25.914 Y 30.816 Z 1.371 A -54.070 C -308.785 F 636 +G1 X -26.025 Y 30.823 Z 1.317 A -53.998 C -308.740 F 636 +G1 X -26.140 Y 30.808 Z 1.270 A -53.926 C -308.693 F 636 +G1 X -26.259 Y 30.770 Z 1.230 A -53.850 C -308.644 F 636 +G1 X -26.381 Y 30.709 Z 1.198 A -53.769 C -308.592 F 636 +G1 X -26.506 Y 30.627 Z 1.172 A -53.681 C -308.535 F 636 +G1 X -26.634 Y 30.523 Z 1.154 A -53.585 C -308.473 F 636 +G1 X -26.763 Y 30.396 Z 1.143 A -53.480 C -308.405 F 636 +G1 X -26.893 Y 30.249 Z 1.139 A -53.366 C -308.331 F 636 +G1 X -27.025 Y 30.080 Z 1.143 A -53.243 C -308.250 F 636 +G1 X -27.151 Y 29.901 Z 1.153 A -53.142 C -308.184 F 636 +G1 X -27.266 Y 29.720 Z 1.170 A -53.043 C -308.119 F 636 +G1 X -27.368 Y 29.538 Z 1.192 A -52.947 C -308.055 F 636 +G1 X -27.458 Y 29.356 Z 1.221 A -52.853 C -307.993 F 636 +G1 X -27.535 Y 29.174 Z 1.256 A -52.761 C -307.932 F 636 +G1 X -27.598 Y 28.993 Z 1.297 A -52.671 C -307.872 F 636 +G1 X -27.648 Y 28.811 Z 1.344 A -52.582 C -307.812 F 636 +G1 X -27.683 Y 28.630 Z 1.398 A -52.494 C -307.753 F 636 +G1 X -27.704 Y 28.450 Z 1.457 A -52.407 C -307.695 F 636 +G1 X -27.710 Y 28.272 Z 1.524 A -52.319 C -307.636 F 636 +G1 X -27.699 Y 28.094 Z 1.596 A -52.231 C -307.577 F 636 +G1 X -27.673 Y 27.919 Z 1.676 A -52.142 C -307.517 F 636 +G1 X -27.631 Y 27.745 Z 1.761 A -52.052 C -307.455 F 636 +G1 X -27.572 Y 27.574 Z 1.853 A -51.959 C -307.392 F 636 +G1 X -27.495 Y 27.405 Z 1.952 A -51.863 C -307.326 F 636 +G1 X -27.401 Y 27.239 Z 2.058 A -51.763 C -307.258 F 636 +G1 X -26.491 Y 25.791 Z 3.017 A -53.155 C -303.508 F 159 +G1 X -26.231 Y 25.348 Z 3.301 A -53.584 C -302.379 F 159 +G1 X -25.990 Y 24.888 Z 3.589 A -54.009 C -301.237 F 159 +G1 X -25.793 Y 24.464 Z 3.846 A -54.380 C -300.211 F 159 +G1 X -25.612 Y 24.025 Z 4.104 A -54.744 C -299.168 F 159 +G1 X -25.381 Y 23.364 Z 4.476 A -55.254 C -297.636 F 159 +G1 X -25.060 Y 22.203 Z 5.099 A -56.092 C -294.993 F 159 +G1 X -24.679 Y 20.806 Z 5.868 A -57.235 C -291.763 F 159 +G1 X -24.485 Y 20.111 Z 6.265 A -57.877 C -290.136 F 159 +G1 X -24.292 Y 19.414 Z 6.663 A -58.550 C -288.497 F 159 +G1 X -24.095 Y 18.720 Z 7.073 A -59.277 C -286.860 F 159 +G1 X -23.900 Y 18.025 Z 7.484 A -60.034 C -285.217 F 159 +G1 X -23.715 Y 17.384 Z 7.876 A -60.782 C -283.701 F 159 +G1 X -23.532 Y 16.742 Z 8.268 A -61.554 C -282.186 F 159 +G1 X -23.346 Y 16.103 Z 8.669 A -62.366 C -280.684 F 159 +G1 X -23.161 Y 15.464 Z 9.072 A -63.200 C -279.188 F 159 +G1 X -22.959 Y 14.781 Z 9.514 A -64.138 C -277.598 F 159 +G1 X -22.758 Y 14.096 Z 9.958 A -65.096 C -276.019 F 159 +G1 X -22.554 Y 13.417 Z 10.410 A -66.091 C -274.468 F 159 +G1 X -22.352 Y 12.738 Z 10.864 A -67.099 C -272.934 F 159 +G1 X -21.970 Y 11.514 Z 11.727 A -67.941 C -272.464 F 159 +G1 X -21.580 Y 10.339 Z 12.587 A -68.469 C -272.743 F 159 +G1 X -21.173 Y 9.178 Z 13.460 A -69.036 C -273.040 F 159 +G1 X -20.736 Y 8.003 Z 14.369 A -69.656 C -273.364 F 159 +G1 X -20.289 Y 6.872 Z 15.269 A -70.298 C -273.696 F 159 +G1 X -19.872 Y 5.877 Z 16.081 A -70.898 C -274.011 F 159 +G1 X -19.441 Y 4.914 Z 16.893 A -71.355 C -274.665 F 159 +G1 X -18.941 Y 3.870 Z 17.800 A -71.634 C -275.829 F 159 +G1 X -18.416 Y 2.847 Z 18.715 A -71.841 C -277.065 F 159 +G1 X -17.868 Y 1.851 Z 19.633 A -71.964 C -278.385 F 159 +G1 X -17.365 Y 1.000 Z 20.443 A -72.003 C -279.613 F 159 +G1 X -16.766 Y 0.055 Z 21.371 A -71.958 C -281.106 F 159 +G1 X -16.140 Y -0.856 Z 22.302 A -71.807 C -282.704 F 159 +G1 X -15.708 Y -1.446 Z 22.925 A -71.639 C -283.835 F 159 +G1 X -15.263 Y -2.021 Z 23.549 A -71.425 C -285.003 F 159 +G1 X -14.650 Y -2.763 Z 24.385 A -71.059 C -286.625 F 159 +G1 X -14.441 Y -2.989 Z 24.670 A -70.942 C -287.190 F 159 +G1 X -14.198 Y -3.215 Z 25.013 A -70.850 C -287.867 F 159 +G1 X -13.952 Y -3.406 Z 25.376 A -70.803 C -288.584 F 159 +G1 X -13.705 Y -3.563 Z 25.758 A -70.799 C -289.338 F 159 +G1 X -13.459 Y -3.686 Z 26.157 A -70.837 C -290.127 F 159 +G1 X -12.301 Y -4.085 Z 28.149 A -71.108 C -294.064 F 159 +G1 X -12.242 Y -4.098 Z 28.255 A -71.228 C -293.981 F 636 +G1 X -12.199 Y -4.089 Z 28.343 A -71.325 C -293.915 F 636 +G1 X -12.173 Y -4.060 Z 28.411 A -71.403 C -293.861 F 636 +G1 X -12.165 Y -4.039 Z 28.438 A -71.438 C -293.837 F 636 +G1 X -12.162 Y -4.013 Z 28.461 A -71.472 C -293.814 F 636 +G1 X -12.166 Y -3.948 Z 28.490 A -71.542 C -293.766 F 636 +G1 X -12.186 Y -3.868 Z 28.500 A -71.625 C -293.709 F 636 +G1 X -12.221 Y -3.772 Z 28.490 A -71.726 C -293.640 F 636 +G1 X -12.270 Y -3.663 Z 28.459 A -71.849 C -293.556 F 636 +G1 X -12.328 Y -3.552 Z 28.413 A -71.947 C -293.489 F 636 +G1 X -12.387 Y -3.453 Z 28.358 A -72.042 C -293.424 F 636 +G1 X -12.447 Y -3.366 Z 28.293 A -72.134 C -293.362 F 636 +G1 X -12.508 Y -3.292 Z 28.219 A -72.224 C -293.301 F 636 +G1 X -12.569 Y -3.234 Z 28.134 A -72.312 C -293.241 F 636 +G1 X -12.631 Y -3.191 Z 28.040 A -72.402 C -293.180 F 636 +G1 X -12.693 Y -3.166 Z 27.935 A -72.494 C -293.118 F 636 +G1 X -12.754 Y -3.159 Z 27.820 A -72.591 C -293.052 F 636 +G1 X -13.576 Y -3.200 Z 26.198 A -71.673 C -290.010 F 159 +G1 X -13.695 Y -3.195 Z 25.971 A -71.541 C -289.589 F 159 +G1 X -13.816 Y -3.170 Z 25.751 A -71.439 C -289.178 F 159 +G1 X -14.000 Y -3.096 Z 25.439 A -71.345 C -288.586 F 159 +G1 X -14.185 Y -2.979 Z 25.146 A -71.320 C -288.023 F 159 +G1 X -14.367 Y -2.823 Z 24.877 A -71.361 C -287.498 F 159 +G1 X -14.542 Y -2.630 Z 24.635 A -71.467 C -287.014 F 159 +G1 X -14.914 Y -2.124 Z 24.140 A -71.812 C -286.017 F 159 +G1 X -15.457 Y -1.327 Z 23.390 A -72.274 C -284.554 F 159 +G1 X -15.861 Y -0.687 Z 22.807 A -72.583 C -283.455 F 159 +G1 X -16.248 Y -0.032 Z 22.224 A -72.840 C -282.404 F 159 +G1 X -16.618 Y 0.638 Z 21.643 A -73.047 C -281.404 F 159 +G1 X -16.972 Y 1.321 Z 21.063 A -73.208 C -280.451 F 159 +G1 X -17.309 Y 2.018 Z 20.484 A -73.327 C -279.540 F 159 +G1 X -17.737 Y 2.975 Z 19.707 A -73.428 C -278.375 F 159 +G1 X -18.178 Y 4.063 Z 18.846 A -73.476 C -277.135 F 159 +G1 X -18.584 Y 5.178 Z 17.988 A -73.424 C -276.026 F 159 +G1 X -18.937 Y 6.253 Z 17.182 A -73.237 C -275.215 F 159 +G1 X -19.285 Y 7.441 Z 16.321 A -72.769 C -274.957 F 159 +G1 X -19.599 Y 8.647 Z 15.468 A -72.330 C -274.735 F 159 +G1 X -19.880 Y 9.866 Z 14.628 A -71.930 C -274.533 F 159 +G1 X -20.083 Y 10.850 Z 13.965 A -71.638 C -274.385 F 159 +G1 X -20.266 Y 11.843 Z 13.308 A -71.373 C -274.250 F 159 +G1 X -20.469 Y 13.095 Z 12.499 A -71.076 C -274.098 F 159 +G1 X -20.676 Y 14.472 Z 11.647 A -69.689 C -276.341 F 159 +G1 X -20.774 Y 15.182 Z 11.219 A -68.867 C -277.823 F 159 +G1 X -20.874 Y 15.891 Z 10.793 A -68.063 C -279.304 F 159 +G1 X -20.963 Y 16.602 Z 10.375 A -67.299 C -280.785 F 159 +G1 X -21.054 Y 17.313 Z 9.958 A -66.555 C -282.259 F 159 +G1 X -21.136 Y 18.026 Z 9.550 A -65.855 C -283.728 F 159 +G1 X -21.218 Y 18.738 Z 9.142 A -65.177 C -285.185 F 159 +G1 X -21.359 Y 20.110 Z 8.377 A -63.981 C -287.949 F 159 +G1 X -21.464 Y 21.262 Z 7.749 A -63.077 C -290.218 F 159 +G1 X -21.528 Y 22.087 Z 7.312 A -62.494 C -291.806 F 159 +G1 X -21.593 Y 22.909 Z 6.876 A -61.941 C -293.362 F 159 +G1 X -21.686 Y 24.339 Z 6.142 A -61.101 C -295.983 F 159 +G1 X -21.752 Y 25.528 Z 5.550 A -60.502 C -298.083 F 159 +G1 X -21.819 Y 26.713 Z 4.960 A -59.956 C -300.106 F 159 +G1 X -21.955 Y 28.604 Z 4.036 A -59.193 C -303.217 F 159 +G1 X -22.090 Y 30.244 Z 3.254 A -58.640 C -305.792 F 159 +G1 X -22.377 Y 32.487 Z 2.140 A -57.888 C -309.210 F 159 +G1 X -22.421 Y 32.764 Z 1.999 A -57.699 C -309.146 F 636 +G1 X -22.477 Y 33.022 Z 1.860 A -57.519 C -309.085 F 636 +G1 X -22.546 Y 33.260 Z 1.725 A -57.348 C -309.026 F 636 +G1 X -22.628 Y 33.479 Z 1.592 A -57.185 C -308.970 F 636 +G1 X -22.721 Y 33.680 Z 1.463 A -57.030 C -308.917 F 636 +G1 X -22.825 Y 33.862 Z 1.336 A -56.883 C -308.866 F 636 +G1 X -22.939 Y 34.025 Z 1.213 A -56.741 C -308.816 F 636 +G1 X -23.064 Y 34.170 Z 1.093 A -56.604 C -308.769 F 636 +G1 X -23.198 Y 34.298 Z 0.976 A -56.472 C -308.723 F 636 +G1 X -23.342 Y 34.407 Z 0.863 A -56.344 C -308.678 F 636 +G1 X -23.494 Y 34.499 Z 0.754 A -56.218 C -308.633 F 636 +G1 X -23.655 Y 34.573 Z 0.648 A -56.093 C -308.589 F 636 +G1 X -23.823 Y 34.631 Z 0.547 A -55.970 C -308.546 F 636 +G1 X -23.998 Y 34.671 Z 0.449 A -55.846 C -308.502 F 636 +G1 X -24.179 Y 34.694 Z 0.355 A -55.722 C -308.457 F 636 +G1 X -24.367 Y 34.701 Z 0.265 A -55.596 C -308.413 F 636 +G1 X -24.561 Y 34.692 Z 0.179 A -55.468 C -308.367 F 636 +G1 X -24.760 Y 34.666 Z 0.098 A -55.338 C -308.320 F 636 +G1 X -24.963 Y 34.625 Z 0.021 A -55.204 C -308.272 F 636 +G1 X -25.170 Y 34.567 Z -0.051 A -55.067 C -308.222 F 636 +G1 X -25.382 Y 34.494 Z -0.119 A -54.926 C -308.171 F 636 +G1 X -25.596 Y 34.406 Z -0.182 A -54.781 C -308.118 F 636 +G1 X -25.813 Y 34.302 Z -0.241 A -54.632 C -308.063 F 636 +G1 X -26.032 Y 34.184 Z -0.294 A -54.479 C -308.007 F 636 +G1 X -26.253 Y 34.051 Z -0.342 A -54.321 C -307.949 F 636 +G1 X -26.475 Y 33.903 Z -0.386 A -54.158 C -307.888 F 636 +G1 X -26.697 Y 33.741 Z -0.424 A -53.990 C -307.826 F 636 +G1 X -26.920 Y 33.564 Z -0.457 A -53.818 C -307.762 F 636 +G1 X -27.143 Y 33.374 Z -0.484 A -53.641 C -307.695 F 636 +G1 X -27.364 Y 33.170 Z -0.506 A -53.459 C -307.626 F 636 +G1 X -27.585 Y 32.952 Z -0.522 A -53.272 C -307.556 F 636 +G1 X -27.803 Y 32.721 Z -0.533 A -53.081 C -307.483 F 636 +G1 X -28.018 Y 32.482 Z -0.538 A -52.916 C -307.419 F 636 +G1 X -28.226 Y 32.239 Z -0.538 A -52.751 C -307.356 F 636 +G1 X -28.427 Y 31.992 Z -0.533 A -52.588 C -307.293 F 636 +G1 X -28.621 Y 31.743 Z -0.523 A -52.425 C -307.230 F 636 +G1 X -28.808 Y 31.491 Z -0.508 A -52.264 C -307.167 F 636 +G1 X -28.986 Y 31.237 Z -0.488 A -52.104 C -307.104 F 636 +G1 X -29.155 Y 30.981 Z -0.463 A -51.946 C -307.042 F 636 +G1 X -29.316 Y 30.723 Z -0.433 A -51.789 C -306.980 F 636 +G1 X -29.467 Y 30.464 Z -0.397 A -51.634 C -306.918 F 636 +G1 X -29.609 Y 30.203 Z -0.356 A -51.481 C -306.857 F 636 +G1 X -29.740 Y 29.942 Z -0.310 A -51.329 C -306.797 F 636 +G1 X -29.860 Y 29.681 Z -0.259 A -51.179 C -306.736 F 636 +G1 X -29.969 Y 29.420 Z -0.203 A -51.031 C -306.676 F 636 +G1 X -30.067 Y 29.159 Z -0.141 A -50.885 C -306.617 F 636 +G1 X -30.152 Y 28.899 Z -0.074 A -50.741 C -306.558 F 636 +G1 X -30.225 Y 28.639 Z -0.002 A -50.598 C -306.499 F 636 +G1 X -30.285 Y 28.381 Z 0.075 A -50.456 C -306.441 F 636 +G1 X -30.332 Y 28.125 Z 0.158 A -50.316 C -306.383 F 636 +G1 X -30.365 Y 27.870 Z 0.247 A -50.177 C -306.326 F 636 +G1 X -30.384 Y 27.618 Z 0.340 A -50.039 C -306.268 F 636 +G1 X -30.387 Y 27.368 Z 0.440 A -49.901 C -306.211 F 636 +G1 X -30.376 Y 27.121 Z 0.544 A -49.764 C -306.153 F 636 +G1 X -30.349 Y 26.878 Z 0.654 A -49.627 C -306.095 F 636 +G1 X -30.307 Y 26.638 Z 0.770 A -49.489 C -306.036 F 636 +G1 X -30.248 Y 26.402 Z 0.891 A -49.350 C -305.977 F 636 +G1 X -30.171 Y 26.170 Z 1.017 A -49.209 C -305.917 F 636 +G1 X -30.078 Y 25.942 Z 1.149 A -49.066 C -305.856 F 636 +G1 X -29.967 Y 25.720 Z 1.287 A -48.921 C -305.793 F 636 +G1 X -29.838 Y 25.503 Z 1.430 A -48.772 C -305.729 F 636 +G1 X -29.690 Y 25.291 Z 1.579 A -48.620 C -305.662 F 636 +G1 X -29.523 Y 25.085 Z 1.733 A -48.463 C -305.594 F 636 +G1 X -29.336 Y 24.885 Z 1.893 A -48.302 C -305.523 F 636 +G1 X -28.122 Y 23.670 Z 2.900 A -50.315 C -301.395 F 159 +G1 X -27.972 Y 23.514 Z 3.027 A -50.578 C -300.880 F 159 +G1 X -27.689 Y 23.179 Z 3.283 A -51.085 C -299.832 F 159 +G1 X -27.430 Y 22.815 Z 3.540 A -51.565 C -298.758 F 159 +G1 X -27.199 Y 22.420 Z 3.797 A -52.016 C -297.651 F 159 +G1 X -26.997 Y 21.994 Z 4.051 A -52.433 C -296.513 F 159 +G1 X -26.522 Y 20.745 Z 4.755 A -53.548 C -293.284 F 159 +G1 X -26.223 Y 19.946 Z 5.209 A -54.325 C -291.214 F 159 +G1 X -25.965 Y 19.267 Z 5.611 A -55.055 C -289.449 F 159 +G1 X -25.709 Y 18.586 Z 6.015 A -55.820 C -287.683 F 159 +G1 X -25.452 Y 17.910 Z 6.431 A -56.642 C -285.935 F 159 +G1 X -25.196 Y 17.233 Z 6.849 A -57.496 C -284.193 F 159 +G1 X -24.940 Y 16.560 Z 7.277 A -58.403 C -282.475 F 159 +G1 X -24.685 Y 15.887 Z 7.708 A -59.339 C -280.770 F 159 +G1 X -24.422 Y 15.197 Z 8.164 A -60.355 C -279.040 F 159 +G1 X -24.161 Y 14.506 Z 8.621 A -61.395 C -277.331 F 159 +G1 X -23.907 Y 13.843 Z 9.075 A -62.445 C -275.711 F 159 +G1 X -23.655 Y 13.179 Z 9.530 A -63.512 C -274.114 F 159 +G1 X -23.403 Y 12.521 Z 9.994 A -64.611 C -272.559 F 159 +G1 X -23.155 Y 11.872 Z 10.454 A -65.628 C -271.219 F 159 +G1 X -22.688 Y 10.729 Z 11.322 A -66.256 C -271.561 F 159 +G1 X -22.211 Y 9.600 Z 12.204 A -66.919 C -271.918 F 159 +G1 X -21.722 Y 8.486 Z 13.101 A -67.618 C -272.291 F 159 +G1 X -21.215 Y 7.374 Z 14.021 A -68.358 C -272.683 F 159 +G1 X -20.702 Y 6.300 Z 14.937 A -69.116 C -273.081 F 159 +G1 X -20.185 Y 5.266 Z 15.844 A -69.871 C -273.513 F 159 +G1 X -19.641 Y 4.242 Z 16.777 A -70.391 C -274.511 F 159 +G1 X -19.083 Y 3.246 Z 17.712 A -70.779 C -275.695 F 159 +G1 X -18.505 Y 2.274 Z 18.653 A -71.062 C -277.010 F 159 +G1 X -17.909 Y 1.328 Z 19.599 A -71.271 C -278.383 F 159 +G1 X -17.349 Y 0.493 Z 20.462 A -71.384 C -279.704 F 159 +G1 X -16.733 Y -0.370 Z 21.386 A -71.415 C -281.201 F 159 +G1 X -16.073 Y -1.232 Z 22.348 A -71.336 C -282.862 F 159 +G1 X -15.392 Y -2.060 Z 23.312 A -71.142 C -284.621 F 159 +G1 X -14.856 Y -2.669 Z 24.051 A -70.918 C -286.026 F 159 +G1 X -14.498 Y -3.052 Z 24.540 A -70.740 C -286.981 F 159 +G1 X -14.254 Y -3.286 Z 24.876 A -70.634 C -287.647 F 159 +G1 X -14.008 Y -3.502 Z 25.223 A -70.542 C -288.341 F 159 +G1 X -13.759 Y -3.699 Z 25.580 A -70.462 C -289.062 F 159 +G1 X -13.385 Y -3.960 Z 26.133 A -70.362 C -290.187 F 159 +G1 X -12.205 Y -4.581 Z 28.012 A -70.183 C -293.969 F 159 +G1 X -12.146 Y -4.607 Z 28.107 A -70.304 C -293.930 F 636 +G1 X -12.095 Y -4.620 Z 28.197 A -70.414 C -293.894 F 636 +G1 X -12.050 Y -4.620 Z 28.282 A -70.515 C -293.862 F 636 +G1 X -12.013 Y -4.609 Z 28.360 A -70.607 C -293.832 F 636 +G1 X -11.982 Y -4.587 Z 28.433 A -70.694 C -293.804 F 636 +G1 X -11.957 Y -4.554 Z 28.499 A -70.776 C -293.778 F 636 +G1 X -11.939 Y -4.510 Z 28.559 A -70.856 C -293.752 F 636 +G1 X -11.928 Y -4.457 Z 28.613 A -70.936 C -293.726 F 636 +G1 X -11.923 Y -4.395 Z 28.659 A -71.019 C -293.700 F 636 +G1 X -11.924 Y -4.325 Z 28.699 A -71.104 C -293.673 F 636 +G1 X -11.931 Y -4.246 Z 28.732 A -71.194 C -293.644 F 636 +G1 X -11.944 Y -4.159 Z 28.758 A -71.290 C -293.613 F 636 +G1 X -11.963 Y -4.066 Z 28.777 A -71.393 C -293.580 F 636 +G1 X -11.988 Y -3.966 Z 28.787 A -71.502 C -293.546 F 636 +G1 X -12.019 Y -3.860 Z 28.791 A -71.618 C -293.509 F 636 +G1 X -12.056 Y -3.749 Z 28.786 A -71.741 C -293.469 F 636 +G1 X -12.138 Y -3.530 Z 28.758 A -71.955 C -293.402 F 636 +G1 X -12.182 Y -3.427 Z 28.735 A -72.058 C -293.369 F 636 +G1 X -12.227 Y -3.329 Z 28.706 A -72.159 C -293.337 F 636 +G1 X -12.274 Y -3.237 Z 28.671 A -72.258 C -293.306 F 636 +G1 X -12.321 Y -3.151 Z 28.630 A -72.354 C -293.276 F 636 +G1 X -12.370 Y -3.073 Z 28.583 A -72.448 C -293.246 F 636 +G1 X -12.420 Y -3.001 Z 28.530 A -72.541 C -293.217 F 636 +G1 X -12.471 Y -2.938 Z 28.471 A -72.632 C -293.188 F 636 +G1 X -12.522 Y -2.883 Z 28.405 A -72.722 C -293.160 F 636 +G1 X -12.573 Y -2.837 Z 28.333 A -72.812 C -293.131 F 636 +G1 X -12.625 Y -2.801 Z 28.254 A -72.904 C -293.103 F 636 +G1 X -12.678 Y -2.774 Z 28.170 A -72.997 C -293.073 F 636 +G1 X -12.730 Y -2.759 Z 28.078 A -73.094 C -293.043 F 636 +G1 X -12.782 Y -2.754 Z 27.980 A -73.194 C -293.012 F 636 +G1 X -12.834 Y -2.761 Z 27.875 A -73.300 C -292.979 F 636 +G1 X -13.628 Y -2.966 Z 26.218 A -72.073 C -289.950 F 159 +G1 X -13.744 Y -2.990 Z 25.979 A -71.881 C -289.522 F 159 +G1 X -13.865 Y -2.986 Z 25.747 A -71.735 C -289.100 F 159 +G1 X -13.989 Y -2.954 Z 25.526 A -71.634 C -288.691 F 159 +G1 X -14.114 Y -2.895 Z 25.317 A -71.579 C -288.298 F 159 +G1 X -14.226 Y -2.821 Z 25.140 A -71.566 C -287.959 F 159 +G1 X -14.336 Y -2.727 Z 24.976 A -71.587 C -287.638 F 159 +G1 X -14.494 Y -2.554 Z 24.753 A -71.678 C -287.194 F 159 +G1 X -14.545 Y -2.488 Z 24.685 A -71.725 C -287.056 F 159 +G1 X -14.930 Y -1.917 Z 24.177 A -72.152 C -286.017 F 159 +G1 X -15.337 Y -1.267 Z 23.617 A -72.581 C -284.905 F 159 +G1 X -15.725 Y -0.600 Z 23.057 A -72.966 C -283.826 F 159 +G1 X -16.093 Y 0.083 Z 22.499 A -73.302 C -282.794 F 159 +G1 X -16.441 Y 0.781 Z 21.942 A -73.588 C -281.813 F 159 +G1 X -16.770 Y 1.493 Z 21.386 A -73.829 C -280.879 F 159 +G1 X -17.079 Y 2.218 Z 20.831 A -74.029 C -279.988 F 159 +G1 X -17.360 Y 2.934 Z 20.293 A -74.187 C -279.159 F 159 +G1 X -17.626 Y 3.670 Z 19.751 A -74.313 C -278.358 F 159 +G1 X -17.877 Y 4.428 Z 19.202 A -74.415 C -277.565 F 159 +G1 X -18.109 Y 5.198 Z 18.654 A -74.467 C -276.841 F 159 +G1 X -18.365 Y 6.142 Z 17.993 A -74.490 C -276.011 F 159 +G1 X -18.560 Y 6.950 Z 17.442 A -74.310 C -275.730 F 159 +G1 X -18.820 Y 8.184 Z 16.618 A -73.959 C -275.555 F 159 +G1 X -19.039 Y 9.434 Z 15.803 A -73.645 C -275.398 F 159 +G1 X -19.218 Y 10.694 Z 15.000 A -73.369 C -275.260 F 159 +G1 X -19.358 Y 11.967 Z 14.208 A -73.131 C -275.141 F 159 +G1 X -19.464 Y 13.298 Z 13.397 A -72.921 C -275.036 F 159 +G1 X -19.550 Y 14.662 Z 12.591 A -72.031 C -276.469 F 159 +G1 X -19.588 Y 15.381 Z 12.178 A -71.279 C -277.893 F 159 +G1 X -19.627 Y 16.098 Z 11.765 A -70.545 C -279.310 F 159 +G1 X -19.678 Y 17.534 Z 10.956 A -69.169 C -282.110 F 159 +G1 X -19.702 Y 18.742 Z 10.288 A -68.103 C -284.419 F 159 +G1 X -19.708 Y 20.100 Z 9.550 A -67.007 C -286.952 F 159 +G1 X -19.690 Y 21.530 Z 8.788 A -65.970 C -289.534 F 159 +G1 X -19.641 Y 23.105 Z 7.968 A -64.967 C -292.260 F 159 +G1 X -19.571 Y 24.528 Z 7.245 A -64.181 C -294.608 F 159 +G1 X -19.477 Y 25.947 Z 6.540 A -63.504 C -296.835 F 159 +G1 X -19.360 Y 27.363 Z 5.854 A -62.929 C -298.938 F 159 +G1 X -19.220 Y 28.776 Z 5.185 A -62.447 C -300.921 F 159 +G1 X -19.059 Y 30.186 Z 4.536 A -62.049 C -302.784 F 159 +G1 X -18.877 Y 31.595 Z 3.905 A -61.729 C -304.532 F 159 +G1 X -18.707 Y 32.788 Z 3.385 A -61.511 C -305.926 F 159 +G1 X -18.494 Y 35.036 Z 2.363 A -61.061 C -308.486 F 159 +G1 X -18.475 Y 35.285 Z 2.248 A -60.899 C -308.439 F 636 +G1 X -18.464 Y 35.526 Z 2.133 A -60.743 C -308.394 F 636 +G1 X -18.463 Y 35.758 Z 2.018 A -60.591 C -308.350 F 636 +G1 X -18.470 Y 35.981 Z 1.904 A -60.444 C -308.307 F 636 +G1 X -18.486 Y 36.196 Z 1.790 A -60.301 C -308.265 F 636 +G1 X -18.510 Y 36.402 Z 1.676 A -60.162 C -308.224 F 636 +G1 X -18.542 Y 36.599 Z 1.563 A -60.027 C -308.185 F 636 +G1 X -18.582 Y 36.789 Z 1.451 A -59.896 C -308.146 F 636 +G1 X -18.631 Y 36.969 Z 1.339 A -59.768 C -308.108 F 636 +G1 X -18.686 Y 37.142 Z 1.227 A -59.644 C -308.071 F 636 +G1 X -18.749 Y 37.306 Z 1.116 A -59.522 C -308.035 F 636 +G1 X -18.820 Y 37.462 Z 1.006 A -59.403 C -307.999 F 636 +G1 X -18.897 Y 37.610 Z 0.897 A -59.286 C -307.964 F 636 +G1 X -18.982 Y 37.749 Z 0.788 A -59.171 C -307.929 F 636 +G1 X -19.073 Y 37.881 Z 0.681 A -59.058 C -307.896 F 636 +G1 X -19.170 Y 38.005 Z 0.574 A -58.946 C -307.862 F 636 +G1 X -19.274 Y 38.121 Z 0.468 A -58.836 C -307.828 F 636 +G1 X -19.384 Y 38.228 Z 0.363 A -58.726 C -307.795 F 636 +G1 X -19.500 Y 38.328 Z 0.259 A -58.618 C -307.762 F 636 +G1 X -19.622 Y 38.421 Z 0.156 A -58.510 C -307.730 F 636 +G1 X -19.750 Y 38.505 Z 0.054 A -58.402 C -307.697 F 636 +G1 X -19.883 Y 38.582 Z -0.046 A -58.295 C -307.664 F 636 +G1 X -20.021 Y 38.651 Z -0.146 A -58.187 C -307.631 F 636 +G1 X -20.164 Y 38.713 Z -0.244 A -58.079 C -307.598 F 636 +G1 X -20.313 Y 38.767 Z -0.341 A -57.971 C -307.564 F 636 +G1 X -20.466 Y 38.814 Z -0.436 A -57.862 C -307.531 F 636 +G1 X -20.623 Y 38.853 Z -0.531 A -57.752 C -307.497 F 636 +G1 X -20.785 Y 38.885 Z -0.623 A -57.641 C -307.462 F 636 +G1 X -20.951 Y 38.910 Z -0.715 A -57.529 C -307.427 F 636 +G1 X -21.121 Y 38.927 Z -0.805 A -57.416 C -307.392 F 636 +G1 X -21.295 Y 38.937 Z -0.893 A -57.302 C -307.356 F 636 +G1 X -21.472 Y 38.940 Z -0.980 A -57.186 C -307.320 F 636 +G1 X -21.653 Y 38.936 Z -1.065 A -57.069 C -307.283 F 636 +G1 X -21.837 Y 38.925 Z -1.148 A -56.951 C -307.246 F 636 +G1 X -22.215 Y 38.883 Z -1.309 A -56.709 C -307.170 F 636 +G1 X -22.603 Y 38.813 Z -1.463 A -56.462 C -307.091 F 636 +G1 X -23.001 Y 38.716 Z -1.610 A -56.207 C -307.009 F 636 +G1 X -23.406 Y 38.592 Z -1.748 A -55.946 C -306.925 F 636 +G1 X -23.819 Y 38.442 Z -1.878 A -55.679 C -306.838 F 636 +G1 X -24.236 Y 38.267 Z -1.999 A -55.405 C -306.749 F 636 +G1 X -24.657 Y 38.066 Z -2.111 A -55.125 C -306.657 F 636 +G1 X -25.080 Y 37.841 Z -2.213 A -54.838 C -306.562 F 636 +G1 X -25.504 Y 37.591 Z -2.306 A -54.546 C -306.464 F 636 +G1 X -25.927 Y 37.317 Z -2.388 A -54.248 C -306.364 F 636 +G1 X -26.348 Y 37.020 Z -2.460 A -53.944 C -306.261 F 636 +G1 X -26.765 Y 36.700 Z -2.521 A -53.635 C -306.155 F 636 +G1 X -27.178 Y 36.357 Z -2.570 A -53.321 C -306.047 F 636 +G1 X -27.584 Y 35.992 Z -2.608 A -53.002 C -305.936 F 636 +G1 X -27.981 Y 35.606 Z -2.634 A -52.678 C -305.823 F 636 +G1 X -28.371 Y 35.203 Z -2.649 A -52.394 C -305.722 F 636 +G1 X -28.755 Y 34.788 Z -2.653 A -52.107 C -305.620 F 636 +G1 X -29.129 Y 34.365 Z -2.648 A -51.820 C -305.517 F 636 +G1 X -29.495 Y 33.932 Z -2.633 A -51.533 C -305.413 F 636 +G1 X -29.850 Y 33.491 Z -2.607 A -51.246 C -305.308 F 636 +G1 X -30.193 Y 33.044 Z -2.572 A -50.960 C -305.203 F 636 +G1 X -30.523 Y 32.590 Z -2.527 A -50.675 C -305.097 F 636 +G1 X -30.839 Y 32.132 Z -2.473 A -50.392 C -304.991 F 636 +G1 X -31.139 Y 31.670 Z -2.408 A -50.111 C -304.885 F 636 +G1 X -31.423 Y 31.206 Z -2.333 A -49.833 C -304.779 F 636 +G1 X -31.689 Y 30.739 Z -2.249 A -49.558 C -304.673 F 636 +G1 X -31.937 Y 30.272 Z -2.155 A -49.287 C -304.568 F 636 +G1 X -32.164 Y 29.805 Z -2.052 A -49.019 C -304.463 F 636 +G1 X -32.370 Y 29.339 Z -1.938 A -48.756 C -304.359 F 636 +G1 X -32.553 Y 28.876 Z -1.815 A -48.496 C -304.256 F 636 +G1 X -32.713 Y 28.416 Z -1.682 A -48.241 C -304.154 F 636 +G1 X -32.848 Y 27.960 Z -1.540 A -47.991 C -304.053 F 636 +G1 X -32.957 Y 27.509 Z -1.388 A -47.745 C -303.953 F 636 +G1 X -33.038 Y 27.064 Z -1.226 A -47.503 C -303.853 F 636 +G1 X -33.068 Y 26.845 Z -1.142 A -47.383 C -303.804 F 636 +G1 X -33.091 Y 26.627 Z -1.055 A -47.265 C -303.755 F 636 +G1 X -33.107 Y 26.412 Z -0.966 A -47.147 C -303.706 F 636 +G1 X -33.115 Y 26.199 Z -0.875 A -47.030 C -303.657 F 636 +G1 X -33.115 Y 25.988 Z -0.781 A -46.913 C -303.608 F 636 +G1 X -33.108 Y 25.779 Z -0.684 A -46.798 C -303.559 F 636 +G1 X -33.092 Y 25.573 Z -0.586 A -46.682 C -303.510 F 636 +G1 X -33.068 Y 25.370 Z -0.485 A -46.567 C -303.462 F 636 +G1 X -33.036 Y 25.170 Z -0.381 A -46.453 C -303.413 F 636 +G1 X -32.996 Y 24.972 Z -0.276 A -46.338 C -303.364 F 636 +G1 X -32.947 Y 24.778 Z -0.168 A -46.224 C -303.314 F 636 +G1 X -32.889 Y 24.587 Z -0.057 A -46.109 C -303.265 F 636 +G1 X -32.823 Y 24.399 Z 0.056 A -45.994 C -303.215 F 636 +G1 X -32.747 Y 24.215 Z 0.171 A -45.878 C -303.164 F 636 +G1 X -32.662 Y 24.034 Z 0.288 A -45.761 C -303.113 F 636 +G1 X -32.568 Y 23.857 Z 0.408 A -45.644 C -303.062 F 636 +G1 X -32.464 Y 23.684 Z 0.530 A -45.525 C -303.010 F 636 +G1 X -32.351 Y 23.515 Z 0.655 A -45.405 C -302.957 F 636 +G1 X -32.228 Y 23.350 Z 0.782 A -45.284 C -302.903 F 636 +G1 X -32.095 Y 23.189 Z 0.911 A -45.161 C -302.848 F 636 +G1 X -31.952 Y 23.032 Z 1.043 A -45.035 C -302.791 F 636 +G1 X -31.798 Y 22.880 Z 1.176 A -44.908 C -302.734 F 636 +G1 X -31.635 Y 22.733 Z 1.313 A -44.778 C -302.675 F 636 +G1 X -31.461 Y 22.590 Z 1.451 A -44.645 C -302.615 F 636 +G1 X -31.276 Y 22.452 Z 1.592 A -44.509 C -302.553 F 636 +G1 X -31.080 Y 22.319 Z 1.735 A -44.371 C -302.489 F 636 +G1 X -29.632 Y 21.381 Z 2.774 A -47.126 C -298.219 F 159 +G1 X -29.466 Y 21.272 Z 2.895 A -47.454 C -297.747 F 159 +G1 X -29.235 Y 21.079 Z 3.076 A -47.910 C -296.999 F 159 +G1 X -29.029 Y 20.851 Z 3.255 A -48.321 C -296.202 F 159 +G1 X -28.850 Y 20.585 Z 3.433 A -48.684 C -295.352 F 159 +G1 X -28.316 Y 19.527 Z 4.058 A -49.856 C -292.192 F 159 +G1 X -27.937 Y 18.766 Z 4.511 A -50.764 C -289.938 F 159 +G1 X -27.610 Y 18.111 Z 4.919 A -51.623 C -288.015 F 159 +G1 X -27.284 Y 17.455 Z 5.329 A -52.522 C -286.107 F 159 +G1 X -26.961 Y 16.804 Z 5.752 A -53.481 C -284.238 F 159 +G1 X -26.639 Y 16.152 Z 6.177 A -54.475 C -282.392 F 159 +G1 X -26.319 Y 15.505 Z 6.614 A -55.523 C -280.590 F 159 +G1 X -26.001 Y 14.858 Z 7.053 A -56.599 C -278.818 F 159 +G1 X -25.654 Y 14.152 Z 7.550 A -57.837 C -276.925 F 159 +G1 X -25.310 Y 13.445 Z 8.049 A -59.100 C -275.073 F 159 +G1 X -24.968 Y 12.747 Z 8.561 A -60.408 C -273.285 F 159 +G1 X -24.630 Y 12.048 Z 9.074 A -61.731 C -271.542 F 159 +G1 X -24.038 Y 10.862 Z 9.993 A -63.458 C -270.014 F 159 +G1 X -23.467 Y 9.781 Z 10.886 A -64.269 C -270.469 F 159 +G1 X -22.893 Y 8.714 Z 11.793 A -65.108 C -270.933 F 159 +G1 X -22.313 Y 7.661 Z 12.716 A -65.974 C -271.407 F 159 +G1 X -21.588 Y 6.386 Z 13.872 A -67.078 C -272.002 F 159 +G1 X -21.054 Y 5.473 Z 14.725 A -67.904 C -272.443 F 159 +G1 X -20.448 Y 4.476 Z 15.687 A -68.762 C -273.116 F 159 +G1 X -19.838 Y 3.520 Z 16.647 A -69.338 C -274.316 F 159 +G1 X -19.218 Y 2.585 Z 17.612 A -69.829 C -275.589 F 159 +G1 X -18.584 Y 1.672 Z 18.585 A -70.233 C -276.943 F 159 +G1 X -17.938 Y 0.786 Z 19.563 A -70.546 C -278.377 F 159 +G1 X -17.378 Y 0.055 Z 20.396 A -70.737 C -279.661 F 159 +G1 X -16.929 Y -0.505 Z 21.055 A -70.835 C -280.720 F 159 +G1 X -16.242 Y -1.322 Z 22.047 A -70.885 C -282.403 F 159 +G1 X -15.541 Y -2.105 Z 23.041 A -70.814 C -284.187 F 159 +G1 X -14.973 Y -2.702 Z 23.833 A -70.677 C -285.663 F 159 +G1 X -14.294 Y -3.374 Z 24.763 A -70.411 C -287.475 F 159 +G1 X -13.797 Y -3.837 Z 25.433 A -70.140 C -288.842 F 159 +G1 X -13.294 Y -4.282 Z 26.106 A -69.806 C -290.250 F 159 +G1 X -12.096 Y -5.117 Z 27.850 A -69.177 C -293.819 F 159 +G1 X -5.107 Y -12.135 Z 27.743 A -71.841 C -344.510 F 636 +G1 X -5.743 Y -12.714 Z 26.178 A -71.266 C -341.499 F 159 +G1 X -5.897 Y -12.823 Z 25.858 A -71.158 C -340.884 F 159 +G1 X -6.077 Y -12.915 Z 25.552 A -71.093 C -340.295 F 159 +G1 X -6.280 Y -12.989 Z 25.262 A -71.073 C -339.731 F 159 +G1 X -6.506 Y -13.044 Z 24.986 A -71.096 C -339.194 F 159 +G1 X -6.752 Y -13.079 Z 24.729 A -71.164 C -338.687 F 159 +G1 X -6.965 Y -13.092 Z 24.534 A -71.252 C -338.298 F 159 +G1 X -7.624 Y -13.087 Z 23.987 A -71.566 C -337.212 F 159 +G1 X -8.630 Y -13.044 Z 23.162 A -71.965 C -335.632 F 159 +G1 X -9.371 Y -12.989 Z 22.558 A -72.202 C -334.515 F 159 +G1 X -10.116 Y -12.912 Z 21.956 A -72.387 C -333.450 F 159 +G1 X -10.862 Y -12.815 Z 21.354 A -72.522 C -332.435 F 159 +G1 X -11.949 Y -12.639 Z 20.484 A -72.638 C -331.043 F 159 +G1 X -12.973 Y -12.437 Z 19.669 A -72.669 C -329.813 F 159 +G1 X -14.099 Y -12.177 Z 18.778 A -72.625 C -328.544 F 159 +G1 X -15.226 Y -11.878 Z 17.890 A -72.500 C -327.360 F 159 +G1 X -15.977 Y -11.658 Z 17.302 A -72.381 C -326.604 F 159 +G1 X -17.145 Y -11.282 Z 16.396 A -71.935 C -325.964 F 159 +G1 X -18.300 Y -10.875 Z 15.512 A -71.371 C -325.677 F 159 +G1 X -19.451 Y -10.435 Z 14.638 A -70.844 C -325.408 F 159 +G1 X -20.570 Y -9.977 Z 13.797 A -70.367 C -325.163 F 159 +G1 X -21.704 Y -9.484 Z 12.954 A -69.921 C -324.932 F 159 +G1 X -22.842 Y -8.961 Z 12.117 A -69.512 C -324.720 F 159 +G1 X -24.046 Y -8.382 Z 11.258 A -68.408 C -326.065 F 159 +G1 X -24.685 Y -8.067 Z 10.817 A -67.494 C -327.583 F 159 +G1 X -25.325 Y -7.755 Z 10.377 A -66.596 C -329.108 F 159 +G1 X -25.965 Y -7.433 Z 9.946 A -65.737 C -330.648 F 159 +G1 X -26.604 Y -7.114 Z 9.515 A -64.898 C -332.191 F 159 +G1 X -27.243 Y -6.787 Z 9.094 A -64.103 C -333.740 F 159 +G1 X -27.881 Y -6.462 Z 8.674 A -63.332 C -335.285 F 159 +G1 X -28.543 Y -6.117 Z 8.248 A -62.581 C -336.892 F 159 +G1 X -29.204 Y -5.773 Z 7.823 A -61.858 C -338.489 F 159 +G1 X -30.474 Y -5.098 Z 7.027 A -60.593 C -341.539 F 159 +G1 X -31.765 Y -4.398 Z 6.238 A -59.462 C -344.592 F 159 +G1 X -33.026 Y -3.700 Z 5.489 A -58.507 C -347.510 F 159 +G1 X -33.863 Y -3.232 Z 5.002 A -57.948 C -349.402 F 159 +G1 X -34.706 Y -2.797 Z 4.516 A -57.404 C -351.255 F 159 +G1 X -35.563 Y -2.396 Z 4.026 A -56.865 C -353.087 F 159 +G1 X -36.286 Y -2.086 Z 3.618 A -56.426 C -354.600 F 159 +G1 X -37.160 Y -1.744 Z 3.134 A -55.918 C -356.391 F 159 +G1 X -39.306 Y -1.002 Z 1.937 A -54.730 C -360.634 F 159 +G1 X -39.485 Y -0.948 Z 1.837 A -54.607 C -360.557 F 636 +G1 X -39.650 Y -0.915 Z 1.743 A -54.496 C -360.486 F 636 +G1 X -39.799 Y -0.903 Z 1.655 A -54.395 C -360.423 F 636 +G1 X -39.934 Y -0.911 Z 1.574 A -54.304 C -360.365 F 636 +G1 X -40.055 Y -0.938 Z 1.500 A -54.220 C -360.311 F 636 +G1 X -40.160 Y -0.984 Z 1.432 A -54.143 C -360.262 F 636 +G1 X -40.250 Y -1.048 Z 1.371 A -54.070 C -360.215 F 636 +G1 X -40.325 Y -1.130 Z 1.317 A -53.998 C -360.170 F 636 +G1 X -40.385 Y -1.230 Z 1.270 A -53.926 C -360.123 F 636 +G1 X -40.429 Y -1.347 Z 1.230 A -53.850 C -360.074 F 636 +G1 X -40.458 Y -1.480 Z 1.198 A -53.769 C -360.022 F 636 +G1 X -40.472 Y -1.629 Z 1.172 A -53.681 C -359.965 F 636 +G1 X -40.469 Y -1.794 Z 1.154 A -53.585 C -359.903 F 636 +G1 X -40.451 Y -1.973 Z 1.143 A -53.480 C -359.835 F 636 +G1 X -40.417 Y -2.167 Z 1.139 A -53.366 C -359.761 F 636 +G1 X -40.367 Y -2.375 Z 1.143 A -53.243 C -359.680 F 636 +G1 X -40.306 Y -2.586 Z 1.153 A -53.142 C -359.614 F 636 +G1 X -40.236 Y -2.788 Z 1.170 A -53.043 C -359.549 F 636 +G1 X -40.158 Y -2.981 Z 1.192 A -52.947 C -359.485 F 636 +G1 X -40.072 Y -3.165 Z 1.221 A -52.853 C -359.423 F 636 +G1 X -39.977 Y -3.339 Z 1.256 A -52.761 C -359.362 F 636 +G1 X -39.875 Y -3.502 Z 1.297 A -52.671 C -359.302 F 636 +G1 X -39.764 Y -3.654 Z 1.344 A -52.582 C -359.242 F 636 +G1 X -39.644 Y -3.794 Z 1.398 A -52.494 C -359.184 F 636 +G1 X -39.516 Y -3.922 Z 1.457 A -52.407 C -359.125 F 636 +G1 X -39.380 Y -4.038 Z 1.524 A -52.319 C -359.066 F 636 +G1 X -39.235 Y -4.141 Z 1.596 A -52.231 C -359.007 F 636 +G1 X -39.082 Y -4.230 Z 1.676 A -52.142 C -358.947 F 636 +G1 X -38.920 Y -4.305 Z 1.761 A -52.052 C -358.885 F 636 +G1 X -38.749 Y -4.365 Z 1.853 A -51.959 C -358.822 F 636 +G1 X -38.569 Y -4.411 Z 1.952 A -51.863 C -358.756 F 636 +G1 X -38.380 Y -4.440 Z 2.058 A -51.763 C -358.688 F 636 +G1 X -36.681 Y -4.632 Z 3.017 A -53.155 C -354.938 F 159 +G1 X -36.173 Y -4.705 Z 3.301 A -53.584 C -353.809 F 159 +G1 X -35.663 Y -4.804 Z 3.589 A -54.009 C -352.667 F 159 +G1 X -35.208 Y -4.914 Z 3.846 A -54.380 C -351.641 F 159 +G1 X -34.752 Y -5.046 Z 4.104 A -54.744 C -350.598 F 159 +G1 X -34.092 Y -5.277 Z 4.476 A -55.254 C -349.066 F 159 +G1 X -32.984 Y -5.750 Z 5.099 A -56.092 C -346.423 F 159 +G1 X -31.654 Y -6.323 Z 5.868 A -57.235 C -343.193 F 159 +G1 X -30.989 Y -6.605 Z 6.265 A -57.877 C -341.566 F 159 +G1 X -30.324 Y -6.889 Z 6.663 A -58.550 C -339.927 F 159 +G1 X -29.659 Y -7.167 Z 7.073 A -59.277 C -338.290 F 159 +G1 X -28.994 Y -7.448 Z 7.484 A -60.034 C -336.647 F 159 +G1 X -28.377 Y -7.703 Z 7.876 A -60.782 C -335.131 F 159 +G1 X -27.761 Y -7.961 Z 8.268 A -61.554 C -333.616 F 159 +G1 X -27.146 Y -8.213 Z 8.669 A -62.366 C -332.114 F 159 +G1 X -26.531 Y -8.467 Z 9.072 A -63.200 C -330.618 F 159 +G1 X -25.870 Y -8.735 Z 9.514 A -64.138 C -329.028 F 159 +G1 X -25.210 Y -9.005 Z 9.958 A -65.096 C -327.449 F 159 +G1 X -24.552 Y -9.269 Z 10.410 A -66.091 C -325.898 F 159 +G1 X -23.895 Y -9.534 Z 10.864 A -67.099 C -324.364 F 159 +G1 X -22.700 Y -9.998 Z 11.727 A -67.941 C -323.894 F 159 +G1 X -21.538 Y -10.426 Z 12.587 A -68.469 C -324.173 F 159 +G1 X -20.376 Y -10.832 Z 13.460 A -69.036 C -324.470 F 159 +G1 X -19.185 Y -11.223 Z 14.369 A -69.656 C -324.794 F 159 +G1 X -18.022 Y -11.579 Z 15.269 A -70.298 C -325.126 F 159 +G1 X -16.984 Y -11.873 Z 16.081 A -70.898 C -325.441 F 159 +G1 X -15.962 Y -12.136 Z 16.893 A -71.355 C -326.095 F 159 +G1 X -14.835 Y -12.396 Z 17.800 A -71.634 C -327.259 F 159 +G1 X -13.708 Y -12.624 Z 18.715 A -71.841 C -328.495 F 159 +G1 X -12.587 Y -12.815 Z 19.633 A -71.964 C -329.815 F 159 +G1 X -11.609 Y -12.953 Z 20.443 A -72.003 C -331.043 F 159 +G1 X -10.496 Y -13.074 Z 21.371 A -71.958 C -332.536 F 159 +G1 X -9.394 Y -13.153 Z 22.302 A -71.807 C -334.134 F 159 +G1 X -8.663 Y -13.183 Z 22.925 A -71.639 C -335.265 F 159 +G1 X -7.936 Y -13.193 Z 23.549 A -71.425 C -336.433 F 159 +G1 X -6.974 Y -13.177 Z 24.385 A -71.059 C -338.055 F 159 +G1 X -6.666 Y -13.154 Z 24.670 A -70.942 C -338.620 F 159 +G1 X -6.339 Y -13.105 Z 25.013 A -70.850 C -339.297 F 159 +G1 X -6.035 Y -13.032 Z 25.376 A -70.803 C -340.014 F 159 +G1 X -5.759 Y -12.936 Z 25.758 A -70.799 C -340.768 F 159 +G1 X -5.509 Y -12.821 Z 26.157 A -70.837 C -341.557 F 159 +G1 X -4.475 Y -12.165 Z 28.149 A -71.108 C -345.494 F 159 +G1 X -4.429 Y -12.126 Z 28.255 A -71.228 C -345.411 F 636 +G1 X -4.409 Y -12.087 Z 28.343 A -71.325 C -345.345 F 636 +G1 X -4.415 Y -12.049 Z 28.411 A -71.403 C -345.291 F 636 +G1 X -4.427 Y -12.030 Z 28.438 A -71.438 C -345.267 F 636 +G1 X -4.445 Y -12.011 Z 28.461 A -71.472 C -345.244 F 636 +G1 X -4.498 Y -11.974 Z 28.490 A -71.542 C -345.196 F 636 +G1 X -4.574 Y -11.939 Z 28.500 A -71.625 C -345.139 F 636 +G1 X -4.670 Y -11.906 Z 28.490 A -71.726 C -345.070 F 636 +G1 X -4.786 Y -11.877 Z 28.459 A -71.849 C -344.986 F 636 +G1 X -4.909 Y -11.853 Z 28.413 A -71.947 C -344.919 F 636 +G1 X -5.023 Y -11.837 Z 28.358 A -72.042 C -344.854 F 636 +G1 X -5.129 Y -11.830 Z 28.293 A -72.134 C -344.792 F 636 +G1 X -5.224 Y -11.832 Z 28.219 A -72.224 C -344.731 F 636 +G1 X -5.308 Y -11.843 Z 28.134 A -72.312 C -344.671 F 636 +G1 X -5.380 Y -11.865 Z 28.040 A -72.402 C -344.610 F 636 +G1 X -5.438 Y -11.898 Z 27.935 A -72.494 C -344.548 F 636 +G1 X -5.482 Y -11.942 Z 27.820 A -72.591 C -344.482 F 636 +G1 X -5.962 Y -12.610 Z 26.198 A -71.673 C -341.440 F 159 +G1 X -6.040 Y -12.699 Z 25.971 A -71.541 C -341.018 F 159 +G1 X -6.136 Y -12.778 Z 25.751 A -71.439 C -340.608 F 159 +G1 X -6.308 Y -12.876 Z 25.439 A -71.345 C -340.016 F 159 +G1 X -6.515 Y -12.948 Z 25.146 A -71.320 C -339.453 F 159 +G1 X -6.750 Y -12.993 Z 24.877 A -71.361 C -338.928 F 159 +G1 X -7.010 Y -13.009 Z 24.635 A -71.467 C -338.444 F 159 +G1 X -7.638 Y -12.985 Z 24.140 A -71.812 C -337.447 F 159 +G1 X -8.600 Y -12.912 Z 23.390 A -72.274 C -335.984 F 159 +G1 X -9.352 Y -12.829 Z 22.807 A -72.583 C -334.885 F 159 +G1 X -10.105 Y -12.724 Z 22.224 A -72.840 C -333.834 F 159 +G1 X -10.860 Y -12.595 Z 21.643 A -73.047 C -332.834 F 159 +G1 X -11.615 Y -12.446 Z 21.063 A -73.208 C -331.881 F 159 +G1 X -12.369 Y -12.275 Z 20.484 A -73.327 C -330.970 F 159 +G1 X -13.385 Y -12.012 Z 19.707 A -73.428 C -329.805 F 159 +G1 X -14.510 Y -11.679 Z 18.846 A -73.476 C -328.565 F 159 +G1 X -15.636 Y -11.301 Z 17.988 A -73.424 C -327.456 F 159 +G1 X -16.696 Y -10.907 Z 17.182 A -73.237 C -326.645 F 159 +G1 X -17.841 Y -10.438 Z 16.321 A -72.769 C -326.387 F 159 +G1 X -18.980 Y -9.932 Z 15.468 A -72.330 C -326.165 F 159 +G1 X -20.108 Y -9.393 Z 14.628 A -71.930 C -325.963 F 159 +G1 X -21.004 Y -8.937 Z 13.965 A -71.638 C -325.815 F 159 +G1 X -21.895 Y -8.461 Z 13.308 A -71.373 C -325.680 F 159 +G1 X -23.000 Y -7.839 Z 12.499 A -71.076 C -325.528 F 159 +G1 X -24.206 Y -7.142 Z 11.647 A -69.689 C -327.771 F 159 +G1 X -24.822 Y -6.776 Z 11.219 A -68.867 C -329.253 F 159 +G1 X -25.438 Y -6.413 Z 10.793 A -68.063 C -330.734 F 159 +G1 X -26.051 Y -6.039 Z 10.375 A -67.299 C -332.215 F 159 +G1 X -26.663 Y -5.667 Z 9.958 A -66.555 C -333.689 F 159 +G1 X -27.271 Y -5.286 Z 9.550 A -65.855 C -335.158 F 159 +G1 X -27.879 Y -4.907 Z 9.142 A -65.177 C -336.615 F 159 +G1 X -29.040 Y -4.161 Z 8.377 A -63.981 C -339.379 F 159 +G1 X -30.006 Y -3.525 Z 7.749 A -63.077 C -341.648 F 159 +G1 X -30.691 Y -3.061 Z 7.312 A -62.494 C -343.236 F 159 +G1 X -31.374 Y -2.599 Z 6.876 A -61.941 C -344.792 F 159 +G1 X -32.549 Y -1.781 Z 6.142 A -61.101 C -347.413 F 159 +G1 X -33.521 Y -1.091 Z 5.550 A -60.502 C -349.513 F 159 +G1 X -34.489 Y -0.404 Z 4.960 A -59.956 C -351.536 F 159 +G1 X -36.052 Y 0.668 Z 4.036 A -59.193 C -354.647 F 159 +G1 X -37.418 Y 1.585 Z 3.254 A -58.640 C -357.222 F 159 +G1 X -39.352 Y 2.759 Z 2.140 A -57.888 C -360.640 F 159 +G1 X -39.595 Y 2.898 Z 1.999 A -57.699 C -360.576 F 636 +G1 X -39.832 Y 3.014 Z 1.860 A -57.519 C -360.515 F 636 +G1 X -40.061 Y 3.109 Z 1.725 A -57.348 C -360.456 F 636 +G1 X -40.283 Y 3.182 Z 1.592 A -57.185 C -360.400 F 636 +G1 X -40.498 Y 3.234 Z 1.463 A -57.030 C -360.347 F 636 +G1 X -40.705 Y 3.266 Z 1.336 A -56.883 C -360.296 F 636 +G1 X -40.904 Y 3.279 Z 1.213 A -56.741 C -360.246 F 636 +G1 X -41.096 Y 3.272 Z 1.093 A -56.604 C -360.199 F 636 +G1 X -41.279 Y 3.246 Z 0.976 A -56.472 C -360.153 F 636 +G1 X -41.454 Y 3.202 Z 0.863 A -56.344 C -360.108 F 636 +G1 X -41.621 Y 3.140 Z 0.754 A -56.218 C -360.063 F 636 +G1 X -41.779 Y 3.061 Z 0.648 A -56.093 C -360.019 F 636 +G1 X -41.928 Y 2.966 Z 0.547 A -55.970 C -359.976 F 636 +G1 X -42.069 Y 2.854 Z 0.449 A -55.846 C -359.932 F 636 +G1 X -42.201 Y 2.726 Z 0.355 A -55.722 C -359.887 F 636 +G1 X -42.323 Y 2.584 Z 0.265 A -55.596 C -359.842 F 636 +G1 X -42.437 Y 2.427 Z 0.179 A -55.468 C -359.797 F 636 +G1 X -42.540 Y 2.255 Z 0.098 A -55.338 C -359.750 F 636 +G1 X -42.635 Y 2.070 Z 0.021 A -55.204 C -359.702 F 636 +G1 X -42.719 Y 1.872 Z -0.051 A -55.067 C -359.652 F 636 +G1 X -42.794 Y 1.662 Z -0.119 A -54.926 C -359.601 F 636 +G1 X -42.858 Y 1.439 Z -0.182 A -54.781 C -359.548 F 636 +G1 X -42.913 Y 1.205 Z -0.241 A -54.632 C -359.493 F 636 +G1 X -42.957 Y 0.960 Z -0.294 A -54.479 C -359.437 F 636 +G1 X -42.990 Y 0.704 Z -0.342 A -54.321 C -359.379 F 636 +G1 X -43.013 Y 0.438 Z -0.386 A -54.158 C -359.318 F 636 +G1 X -43.025 Y 0.163 Z -0.424 A -53.990 C -359.256 F 636 +G1 X -43.026 Y -0.121 Z -0.457 A -53.818 C -359.192 F 636 +G1 X -43.016 Y -0.414 Z -0.484 A -53.641 C -359.125 F 636 +G1 X -42.995 Y -0.714 Z -0.506 A -53.459 C -359.056 F 636 +G1 X -42.962 Y -1.022 Z -0.522 A -53.272 C -358.986 F 636 +G1 X -42.918 Y -1.337 Z -0.533 A -53.081 C -358.913 F 636 +G1 X -42.864 Y -1.654 Z -0.538 A -52.916 C -358.849 F 636 +G1 X -42.804 Y -1.968 Z -0.538 A -52.751 C -358.786 F 636 +G1 X -42.737 Y -2.279 Z -0.533 A -52.588 C -358.723 F 636 +G1 X -42.663 Y -2.587 Z -0.523 A -52.425 C -358.660 F 636 +G1 X -42.582 Y -2.889 Z -0.508 A -52.264 C -358.597 F 636 +G1 X -42.494 Y -3.187 Z -0.488 A -52.104 C -358.534 F 636 +G1 X -42.400 Y -3.480 Z -0.463 A -51.946 C -358.472 F 636 +G1 X -42.298 Y -3.766 Z -0.433 A -51.789 C -358.410 F 636 +G1 X -42.190 Y -4.046 Z -0.397 A -51.634 C -358.348 F 636 +G1 X -42.075 Y -4.319 Z -0.356 A -51.481 C -358.287 F 636 +G1 X -41.952 Y -4.584 Z -0.310 A -51.329 C -358.227 F 636 +G1 X -41.823 Y -4.841 Z -0.259 A -51.179 C -358.166 F 636 +G1 X -41.687 Y -5.089 Z -0.203 A -51.031 C -358.106 F 636 +G1 X -41.544 Y -5.328 Z -0.141 A -50.885 C -358.047 F 636 +G1 X -41.393 Y -5.557 Z -0.074 A -50.741 C -357.988 F 636 +G1 X -41.236 Y -5.776 Z -0.002 A -50.598 C -357.929 F 636 +G1 X -41.072 Y -5.984 Z 0.075 A -50.456 C -357.871 F 636 +G1 X -40.900 Y -6.180 Z 0.158 A -50.316 C -357.813 F 636 +G1 X -40.722 Y -6.364 Z 0.247 A -50.177 C -357.756 F 636 +G1 X -40.536 Y -6.536 Z 0.340 A -50.039 C -357.698 F 636 +G1 X -40.343 Y -6.695 Z 0.440 A -49.901 C -357.641 F 636 +G1 X -40.144 Y -6.840 Z 0.544 A -49.764 C -357.583 F 636 +G1 X -39.936 Y -6.971 Z 0.654 A -49.627 C -357.525 F 636 +G1 X -39.722 Y -7.087 Z 0.770 A -49.489 C -357.466 F 636 +G1 X -39.501 Y -7.188 Z 0.891 A -49.350 C -357.407 F 636 +G1 X -39.272 Y -7.273 Z 1.017 A -49.209 C -357.347 F 636 +G1 X -39.036 Y -7.342 Z 1.149 A -49.066 C -357.286 F 636 +G1 X -38.793 Y -7.394 Z 1.287 A -48.921 C -357.223 F 636 +G1 X -38.542 Y -7.428 Z 1.430 A -48.772 C -357.159 F 636 +G1 X -38.284 Y -7.445 Z 1.579 A -48.620 C -357.092 F 636 +G1 X -38.019 Y -7.443 Z 1.733 A -48.463 C -357.024 F 636 +G1 X -37.746 Y -7.421 Z 1.893 A -48.302 C -356.953 F 636 +G1 X -36.040 Y -7.230 Z 2.900 A -50.315 C -352.825 F 159 +G1 X -35.824 Y -7.210 Z 3.027 A -50.578 C -352.309 F 159 +G1 X -35.386 Y -7.197 Z 3.283 A -51.085 C -351.262 F 159 +G1 X -34.940 Y -7.222 Z 3.540 A -51.565 C -350.188 F 159 +G1 X -34.487 Y -7.287 Z 3.797 A -52.016 C -349.081 F 159 +G1 X -34.028 Y -7.395 Z 4.051 A -52.433 C -347.943 F 159 +G1 X -32.755 Y -7.802 Z 4.755 A -53.548 C -344.714 F 159 +G1 X -31.944 Y -8.066 Z 5.209 A -54.325 C -342.643 F 159 +G1 X -31.252 Y -8.288 Z 5.611 A -55.055 C -340.879 F 159 +G1 X -30.560 Y -8.513 Z 6.015 A -55.820 C -339.113 F 159 +G1 X -29.871 Y -8.733 Z 6.431 A -56.642 C -337.365 F 159 +G1 X -29.182 Y -8.956 Z 6.849 A -57.496 C -335.623 F 159 +G1 X -28.497 Y -9.174 Z 7.277 A -58.403 C -333.905 F 159 +G1 X -27.812 Y -9.395 Z 7.708 A -59.339 C -332.200 F 159 +G1 X -27.108 Y -9.619 Z 8.164 A -60.355 C -330.470 F 159 +G1 X -26.405 Y -9.846 Z 8.621 A -61.395 C -328.761 F 159 +G1 X -25.728 Y -10.061 Z 9.075 A -62.445 C -327.141 F 159 +G1 X -25.052 Y -10.278 Z 9.530 A -63.512 C -325.544 F 159 +G1 X -24.381 Y -10.491 Z 9.994 A -64.611 C -323.989 F 159 +G1 X -23.719 Y -10.702 Z 10.454 A -65.628 C -322.649 F 159 +G1 X -22.534 Y -11.049 Z 11.322 A -66.256 C -322.991 F 159 +G1 X -21.354 Y -11.380 Z 12.204 A -66.919 C -323.348 F 159 +G1 X -20.178 Y -11.693 Z 13.101 A -67.618 C -323.721 F 159 +G1 X -18.992 Y -11.989 Z 14.021 A -68.358 C -324.113 F 159 +G1 X -17.832 Y -12.258 Z 14.937 A -69.116 C -324.511 F 159 +G1 X -16.702 Y -12.499 Z 15.844 A -69.871 C -324.943 F 159 +G1 X -15.562 Y -12.712 Z 16.777 A -70.391 C -325.941 F 159 +G1 X -14.435 Y -12.896 Z 17.712 A -70.779 C -327.125 F 159 +G1 X -13.316 Y -13.050 Z 18.653 A -71.062 C -328.440 F 159 +G1 X -12.204 Y -13.174 Z 19.599 A -71.271 C -329.813 F 159 +G1 X -11.202 Y -13.257 Z 20.462 A -71.384 C -331.134 F 159 +G1 X -10.144 Y -13.313 Z 21.386 A -71.415 C -332.631 F 159 +G1 X -9.058 Y -13.335 Z 22.348 A -71.336 C -334.292 F 159 +G1 X -7.986 Y -13.319 Z 23.312 A -71.142 C -336.051 F 159 +G1 X -7.176 Y -13.280 Z 24.051 A -70.918 C -337.456 F 159 +G1 X -6.653 Y -13.238 Z 24.540 A -70.740 C -338.411 F 159 +G1 X -6.318 Y -13.194 Z 24.876 A -70.634 C -339.077 F 159 +G1 X -5.995 Y -13.135 Z 25.223 A -70.542 C -339.771 F 159 +G1 X -5.687 Y -13.064 Z 25.580 A -70.462 C -340.492 F 159 +G1 X -5.249 Y -12.935 Z 26.133 A -70.362 C -341.617 F 159 +G1 X -4.028 Y -12.398 Z 28.012 A -70.183 C -345.399 F 159 +G1 X -3.971 Y -12.369 Z 28.107 A -70.304 C -345.360 F 636 +G1 X -3.929 Y -12.337 Z 28.197 A -70.414 C -345.324 F 636 +G1 X -3.901 Y -12.302 Z 28.282 A -70.515 C -345.292 F 636 +G1 X -3.886 Y -12.266 Z 28.360 A -70.607 C -345.262 F 636 +G1 X -3.884 Y -12.228 Z 28.433 A -70.694 C -345.234 F 636 +G1 X -3.895 Y -12.188 Z 28.499 A -70.776 C -345.208 F 636 +G1 X -3.917 Y -12.147 Z 28.559 A -70.856 C -345.182 F 636 +G1 X -3.952 Y -12.105 Z 28.613 A -70.936 C -345.156 F 636 +G1 X -3.997 Y -12.062 Z 28.659 A -71.019 C -345.130 F 636 +G1 X -4.053 Y -12.019 Z 28.699 A -71.104 C -345.103 F 636 +G1 X -4.119 Y -11.975 Z 28.732 A -71.194 C -345.074 F 636 +G1 X -4.195 Y -11.932 Z 28.758 A -71.290 C -345.043 F 636 +G1 X -4.280 Y -11.889 Z 28.777 A -71.393 C -345.010 F 636 +G1 X -4.373 Y -11.846 Z 28.787 A -71.502 C -344.976 F 636 +G1 X -4.475 Y -11.804 Z 28.791 A -71.618 C -344.939 F 636 +G1 X -4.585 Y -11.763 Z 28.786 A -71.741 C -344.899 F 636 +G1 X -4.808 Y -11.691 Z 28.758 A -71.955 C -344.832 F 636 +G1 X -4.916 Y -11.661 Z 28.735 A -72.058 C -344.799 F 636 +G1 X -5.020 Y -11.635 Z 28.706 A -72.159 C -344.767 F 636 +G1 X -5.121 Y -11.614 Z 28.671 A -72.258 C -344.736 F 636 +G1 X -5.218 Y -11.598 Z 28.630 A -72.354 C -344.706 F 636 +G1 X -5.310 Y -11.587 Z 28.583 A -72.448 C -344.676 F 636 +G1 X -5.397 Y -11.582 Z 28.530 A -72.541 C -344.647 F 636 +G1 X -5.478 Y -11.582 Z 28.471 A -72.632 C -344.618 F 636 +G1 X -5.553 Y -11.587 Z 28.405 A -72.722 C -344.590 F 636 +G1 X -5.621 Y -11.599 Z 28.333 A -72.812 C -344.561 F 636 +G1 X -5.682 Y -11.617 Z 28.254 A -72.904 C -344.533 F 636 +G1 X -5.735 Y -11.642 Z 28.170 A -72.997 C -344.503 F 636 +G1 X -5.780 Y -11.673 Z 28.078 A -73.094 C -344.473 F 636 +G1 X -5.816 Y -11.711 Z 27.980 A -73.194 C -344.442 F 636 +G1 X -5.843 Y -11.756 Z 27.875 A -73.300 C -344.409 F 636 +G1 X -6.178 Y -12.504 Z 26.218 A -72.073 C -341.380 F 159 +G1 X -6.231 Y -12.610 Z 25.979 A -71.881 C -340.952 F 159 +G1 X -6.310 Y -12.702 Z 25.747 A -71.735 C -340.530 F 159 +G1 X -6.413 Y -12.779 Z 25.526 A -71.634 C -340.121 F 159 +G1 X -6.536 Y -12.840 Z 25.317 A -71.579 C -339.728 F 159 +G1 X -6.664 Y -12.881 Z 25.140 A -71.566 C -339.389 F 159 +G1 X -6.806 Y -12.909 Z 24.976 A -71.587 C -339.068 F 159 +G1 X -7.040 Y -12.925 Z 24.753 A -71.678 C -338.624 F 159 +G1 X -7.123 Y -12.923 Z 24.685 A -71.725 C -338.486 F 159 +G1 X -7.809 Y -12.868 Z 24.177 A -72.152 C -337.447 F 159 +G1 X -8.572 Y -12.781 Z 23.617 A -72.581 C -336.335 F 159 +G1 X -9.335 Y -12.669 Z 23.057 A -72.966 C -335.256 F 159 +G1 X -10.098 Y -12.531 Z 22.499 A -73.302 C -334.224 F 159 +G1 X -10.861 Y -12.368 Z 21.942 A -73.588 C -333.243 F 159 +G1 X -11.622 Y -12.181 Z 21.386 A -73.829 C -332.309 F 159 +G1 X -12.382 Y -11.970 Z 20.831 A -74.029 C -331.418 F 159 +G1 X -13.118 Y -11.743 Z 20.293 A -74.187 C -330.589 F 159 +G1 X -13.858 Y -11.493 Z 19.751 A -74.313 C -329.788 F 159 +G1 X -14.607 Y -11.216 Z 19.202 A -74.415 C -328.995 F 159 +G1 X -15.354 Y -10.918 Z 18.654 A -74.467 C -328.271 F 159 +G1 X -16.252 Y -10.530 Z 17.993 A -74.490 C -327.441 F 159 +G1 X -17.006 Y -10.178 Z 17.442 A -74.310 C -327.160 F 159 +G1 X -18.133 Y -9.612 Z 16.618 A -73.959 C -326.985 F 159 +G1 X -19.247 Y -9.004 Z 15.803 A -73.645 C -326.828 F 159 +G1 X -20.343 Y -8.358 Z 15.000 A -73.369 C -326.690 F 159 +G1 X -21.425 Y -7.674 Z 14.208 A -73.131 C -326.571 F 159 +G1 X -22.532 Y -6.928 Z 13.397 A -72.921 C -326.466 F 159 +G1 X -23.652 Y -6.144 Z 12.591 A -72.031 C -327.899 F 159 +G1 X -24.238 Y -5.725 Z 12.178 A -71.279 C -329.323 F 159 +G1 X -24.823 Y -5.308 Z 11.765 A -70.545 C -330.740 F 159 +G1 X -25.978 Y -4.453 Z 10.956 A -69.169 C -333.540 F 159 +G1 X -26.937 Y -3.719 Z 10.288 A -68.103 C -335.849 F 159 +G1 X -28.002 Y -2.878 Z 9.550 A -67.007 C -338.382 F 159 +G1 X -29.110 Y -1.971 Z 8.788 A -65.970 C -340.964 F 159 +G1 X -30.311 Y -0.951 Z 7.968 A -64.967 C -343.690 F 159 +G1 X -31.379 Y -0.009 Z 7.245 A -64.181 C -346.038 F 159 +G1 X -32.430 Y 0.949 Z 6.540 A -63.504 C -348.265 F 159 +G1 X -33.464 Y 1.923 Z 5.854 A -62.929 C -350.368 F 159 +G1 X -34.481 Y 2.914 Z 5.185 A -62.447 C -352.351 F 159 +G1 X -35.484 Y 3.919 Z 4.536 A -62.049 C -354.214 F 159 +G1 X -36.472 Y 4.940 Z 3.905 A -61.729 C -355.962 F 159 +G1 X -37.298 Y 5.816 Z 3.385 A -61.511 C -357.356 F 159 +G1 X -38.923 Y 7.384 Z 2.363 A -61.061 C -359.916 F 159 +G1 X -39.106 Y 7.555 Z 2.248 A -60.899 C -359.869 F 636 +G1 X -39.288 Y 7.713 Z 2.133 A -60.743 C -359.824 F 636 +G1 X -39.468 Y 7.859 Z 2.018 A -60.591 C -359.780 F 636 +G1 X -39.647 Y 7.992 Z 1.904 A -60.444 C -359.737 F 636 +G1 X -39.825 Y 8.114 Z 1.790 A -60.301 C -359.695 F 636 +G1 X -40.001 Y 8.223 Z 1.676 A -60.162 C -359.654 F 636 +G1 X -40.176 Y 8.321 Z 1.563 A -60.027 C -359.615 F 636 +G1 X -40.349 Y 8.408 Z 1.451 A -59.896 C -359.576 F 636 +G1 X -40.520 Y 8.483 Z 1.339 A -59.768 C -359.538 F 636 +G1 X -40.690 Y 8.547 Z 1.227 A -59.644 C -359.501 F 636 +G1 X -40.857 Y 8.600 Z 1.116 A -59.522 C -359.465 F 636 +G1 X -41.023 Y 8.642 Z 1.006 A -59.402 C -359.429 F 636 +G1 X -41.187 Y 8.674 Z 0.897 A -59.286 C -359.394 F 636 +G1 X -41.349 Y 8.695 Z 0.788 A -59.171 C -359.359 F 636 +G1 X -41.508 Y 8.706 Z 0.681 A -59.058 C -359.326 F 636 +G1 X -41.666 Y 8.707 Z 0.574 A -58.946 C -359.292 F 636 +G1 X -41.821 Y 8.698 Z 0.468 A -58.836 C -359.258 F 636 +G1 X -41.974 Y 8.679 Z 0.363 A -58.726 C -359.225 F 636 +G1 X -42.125 Y 8.650 Z 0.259 A -58.618 C -359.193 F 636 +G1 X -42.273 Y 8.612 Z 0.156 A -58.510 C -359.160 F 636 +G1 X -42.419 Y 8.565 Z 0.054 A -58.402 C -359.127 F 636 +G1 X -42.561 Y 8.509 Z -0.046 A -58.295 C -359.094 F 636 +G1 X -42.702 Y 8.444 Z -0.146 A -58.187 C -359.061 F 636 +G1 X -42.839 Y 8.371 Z -0.244 A -58.079 C -359.028 F 636 +G1 X -42.974 Y 8.289 Z -0.341 A -57.971 C -358.994 F 636 +G1 X -43.106 Y 8.198 Z -0.436 A -57.862 C -358.961 F 636 +G1 X -43.235 Y 8.100 Z -0.531 A -57.752 C -358.927 F 636 +G1 X -43.361 Y 7.993 Z -0.623 A -57.641 C -358.892 F 636 +G1 X -43.484 Y 7.879 Z -0.715 A -57.529 C -358.857 F 636 +G1 X -43.603 Y 7.756 Z -0.805 A -57.416 C -358.822 F 636 +G1 X -43.720 Y 7.627 Z -0.893 A -57.302 C -358.786 F 636 +G1 X -43.833 Y 7.490 Z -0.980 A -57.186 C -358.750 F 636 +G1 X -43.942 Y 7.346 Z -1.065 A -57.069 C -358.713 F 636 +G1 X -44.049 Y 7.195 Z -1.148 A -56.951 C -358.676 F 636 +G1 X -44.251 Y 6.874 Z -1.309 A -56.709 C -358.600 F 636 +G1 X -44.438 Y 6.526 Z -1.463 A -56.462 C -358.521 F 636 +G1 X -44.610 Y 6.155 Z -1.610 A -56.207 C -358.439 F 636 +G1 X -44.766 Y 5.761 Z -1.748 A -55.946 C -358.355 F 636 +G1 X -44.906 Y 5.345 Z -1.878 A -55.679 C -358.268 F 636 +G1 X -45.029 Y 4.909 Z -1.999 A -55.405 C -358.179 F 636 +G1 X -45.135 Y 4.455 Z -2.111 A -55.125 C -358.087 F 636 +G1 X -45.222 Y 3.984 Z -2.213 A -54.838 C -357.992 F 636 +G1 X -45.291 Y 3.497 Z -2.306 A -54.546 C -357.894 F 636 +G1 X -45.341 Y 2.995 Z -2.388 A -54.248 C -357.794 F 636 +G1 X -45.371 Y 2.481 Z -2.460 A -53.944 C -357.691 F 636 +G1 X -45.381 Y 1.955 Z -2.521 A -53.635 C -357.585 F 636 +G1 X -45.370 Y 1.419 Z -2.570 A -53.321 C -357.477 F 636 +G1 X -45.338 Y 0.874 Z -2.608 A -53.002 C -357.366 F 636 +G1 X -45.284 Y 0.322 Z -2.634 A -52.678 C -357.253 F 636 +G1 X -45.212 Y -0.234 Z -2.649 A -52.394 C -357.152 F 636 +G1 X -45.127 Y -0.792 Z -2.653 A -52.107 C -357.050 F 636 +G1 X -45.029 Y -1.350 Z -2.648 A -51.821 C -356.947 F 636 +G1 X -44.919 Y -1.905 Z -2.633 A -51.533 C -356.843 F 636 +G1 X -44.795 Y -2.457 Z -2.607 A -51.246 C -356.738 F 636 +G1 X -44.659 Y -3.004 Z -2.572 A -50.960 C -356.633 F 636 +G1 X -44.511 Y -3.545 Z -2.527 A -50.675 C -356.527 F 636 +G1 X -44.350 Y -4.078 Z -2.473 A -50.392 C -356.421 F 636 +G1 X -44.176 Y -4.601 Z -2.408 A -50.111 C -356.315 F 636 +G1 X -43.990 Y -5.112 Z -2.333 A -49.833 C -356.209 F 636 +G1 X -43.791 Y -5.611 Z -2.249 A -49.558 C -356.103 F 636 +G1 X -43.580 Y -6.096 Z -2.155 A -49.287 C -355.998 F 636 +G1 X -43.356 Y -6.565 Z -2.052 A -49.019 C -355.893 F 636 +G1 X -43.120 Y -7.016 Z -1.938 A -48.756 C -355.789 F 636 +G1 X -42.872 Y -7.448 Z -1.815 A -48.496 C -355.686 F 636 +G1 X -42.612 Y -7.860 Z -1.682 A -48.241 C -355.584 F 636 +G1 X -42.340 Y -8.250 Z -1.540 A -47.991 C -355.483 F 636 +G1 X -42.055 Y -8.616 Z -1.388 A -47.745 C -355.383 F 636 +G1 X -41.759 Y -8.957 Z -1.226 A -47.503 C -355.283 F 636 +G1 X -41.606 Y -9.117 Z -1.142 A -47.383 C -355.234 F 636 +G1 X -41.450 Y -9.271 Z -1.055 A -47.265 C -355.185 F 636 +G1 X -41.291 Y -9.417 Z -0.966 A -47.147 C -355.136 F 636 +G1 X -41.129 Y -9.557 Z -0.875 A -47.030 C -355.087 F 636 +G1 X -40.965 Y -9.688 Z -0.781 A -46.913 C -355.038 F 636 +G1 X -40.797 Y -9.813 Z -0.684 A -46.798 C -354.989 F 636 +G1 X -40.626 Y -9.929 Z -0.586 A -46.682 C -354.940 F 636 +G1 X -40.453 Y -10.037 Z -0.485 A -46.567 C -354.892 F 636 +G1 X -40.276 Y -10.137 Z -0.381 A -46.453 C -354.843 F 636 +G1 X -40.096 Y -10.228 Z -0.276 A -46.338 C -354.794 F 636 +G1 X -39.914 Y -10.311 Z -0.168 A -46.224 C -354.744 F 636 +G1 X -39.728 Y -10.385 Z -0.057 A -46.109 C -354.695 F 636 +G1 X -39.540 Y -10.450 Z 0.056 A -45.994 C -354.645 F 636 +G1 X -39.349 Y -10.506 Z 0.171 A -45.878 C -354.594 F 636 +G1 X -39.155 Y -10.552 Z 0.288 A -45.761 C -354.544 F 636 +G1 X -38.958 Y -10.589 Z 0.408 A -45.644 C -354.492 F 636 +G1 X -38.758 Y -10.616 Z 0.530 A -45.525 C -354.440 F 636 +G1 X -38.555 Y -10.633 Z 0.655 A -45.405 C -354.387 F 636 +G1 X -38.349 Y -10.639 Z 0.782 A -45.284 C -354.333 F 636 +G1 X -38.140 Y -10.636 Z 0.911 A -45.161 C -354.278 F 636 +G1 X -37.929 Y -10.621 Z 1.043 A -45.035 C -354.221 F 636 +G1 X -37.714 Y -10.596 Z 1.176 A -44.908 C -354.164 F 636 +G1 X -37.497 Y -10.560 Z 1.313 A -44.778 C -354.105 F 636 +G1 X -37.277 Y -10.513 Z 1.451 A -44.645 C -354.045 F 636 +G1 X -37.054 Y -10.455 Z 1.592 A -44.509 C -353.983 F 636 +G1 X -36.828 Y -10.384 Z 1.735 A -44.371 C -353.919 F 636 +G1 X -35.191 Y -9.837 Z 2.774 A -47.126 C -349.649 F 159 +G1 X -35.002 Y -9.775 Z 2.895 A -47.454 C -349.177 F 159 +G1 X -34.708 Y -9.715 Z 3.076 A -47.910 C -348.428 F 159 +G1 X -34.401 Y -9.697 Z 3.255 A -48.321 C -347.632 F 159 +G1 X -34.081 Y -9.722 Z 3.433 A -48.684 C -346.782 F 159 +G1 X -32.921 Y -9.964 Z 4.058 A -49.856 C -343.622 F 159 +G1 X -32.090 Y -10.143 Z 4.511 A -50.764 C -341.368 F 159 +G1 X -31.374 Y -10.295 Z 4.919 A -51.623 C -339.445 F 159 +G1 X -30.658 Y -10.450 Z 5.329 A -52.522 C -337.537 F 159 +G1 X -29.947 Y -10.602 Z 5.752 A -53.481 C -335.668 F 159 +G1 X -29.237 Y -10.757 Z 6.177 A -54.475 C -333.822 F 159 +G1 X -28.532 Y -10.910 Z 6.614 A -55.523 C -332.020 F 159 +G1 X -27.827 Y -11.066 Z 7.053 A -56.599 C -330.248 F 159 +G1 X -27.059 Y -11.234 Z 7.550 A -57.837 C -328.355 F 159 +G1 X -26.292 Y -11.406 Z 8.049 A -59.100 C -326.503 F 159 +G1 X -25.533 Y -11.574 Z 8.561 A -60.408 C -324.715 F 159 +G1 X -24.775 Y -11.745 Z 9.074 A -61.731 C -322.972 F 159 +G1 X -23.479 Y -12.021 Z 9.993 A -63.458 C -321.444 F 159 +G1 X -22.278 Y -12.249 Z 10.886 A -64.269 C -321.899 F 159 +G1 X -21.086 Y -12.466 Z 11.793 A -65.108 C -322.363 F 159 +G1 X -19.901 Y -12.669 Z 12.716 A -65.974 C -322.837 F 159 +G1 X -18.453 Y -12.897 Z 13.872 A -67.078 C -323.432 F 159 +G1 X -17.406 Y -13.048 Z 14.725 A -67.904 C -323.873 F 159 +G1 X -16.248 Y -13.196 Z 15.687 A -68.762 C -324.546 F 159 +G1 X -15.120 Y -13.316 Z 16.647 A -69.338 C -325.746 F 159 +G1 X -14.003 Y -13.414 Z 17.612 A -69.829 C -327.019 F 159 +G1 X -12.894 Y -13.487 Z 18.585 A -70.233 C -328.373 F 159 +G1 X -11.798 Y -13.535 Z 19.563 A -70.546 C -329.807 F 159 +G1 X -10.877 Y -13.552 Z 20.396 A -70.737 C -331.091 F 159 +G1 X -10.160 Y -13.551 Z 21.055 A -70.835 C -332.150 F 159 +G1 X -9.093 Y -13.523 Z 22.047 A -70.885 C -333.833 F 159 +G1 X -8.044 Y -13.463 Z 23.041 A -70.814 C -335.617 F 159 +G1 X -7.222 Y -13.391 Z 23.833 A -70.677 C -337.093 F 159 +G1 X -6.273 Y -13.279 Z 24.763 A -70.411 C -338.905 F 159 +G1 X -5.602 Y -13.179 Z 25.433 A -70.140 C -340.272 F 159 +G1 X -4.941 Y -13.063 Z 26.106 A -69.806 C -341.680 F 159 +G1 X -3.541 Y -12.648 Z 27.850 A -69.177 C -345.249 F 159 +G1 X -4.017 Y -14.455 Z 28.561 A -69.177 C -345.249 F 318 +G0 X -7.689 Y -28.403 Z 34.047 A -69.177 C -345.249 +( --- Operation 2 ) +G0 X 13.646 Y -21.890 Z 36.873 A -43.236 C -43.723 +G0 X 8.468 Y -16.476 Z 28.905 A -43.236 C -43.723 +G1 X 7.522 Y -15.486 Z 27.448 A -43.236 C -43.723 F 318 +G1 X 5.444 Y -17.383 Z 25.201 A -43.236 C -43.723 F 159 +G1 X 5.218 Y -17.603 Z 24.960 A -43.228 C -43.744 F 159 +G1 X 4.518 Y -18.257 Z 24.237 A -43.206 C -43.810 F 159 +G1 X 3.914 Y -18.787 Z 23.640 A -43.188 C -43.866 F 159 +G1 X 3.295 Y -19.301 Z 23.052 A -43.171 C -43.921 F 159 +G1 X 2.659 Y -19.801 Z 22.468 A -43.155 C -43.976 F 159 +G1 X 2.005 Y -20.290 Z 21.889 A -43.139 C -44.032 F 159 +G1 X 1.336 Y -20.759 Z 21.315 A -43.125 C -44.087 F 159 +G1 X 0.620 Y -21.239 Z 20.720 A -43.112 C -44.146 F 159 +G1 X -0.324 Y -21.830 Z 19.965 A -43.095 C -44.221 F 159 +G1 X -1.405 Y -22.455 Z 19.135 A -43.079 C -44.304 F 159 +G1 X -2.513 Y -23.046 Z 18.317 A -43.065 C -44.387 F 159 +G1 X -3.264 Y -23.420 Z 17.781 A -43.057 C -44.442 F 159 +G1 X -4.414 Y -23.953 Z 16.985 A -43.046 C -44.523 F 159 +G1 X -5.193 Y -24.289 Z 16.460 A -43.040 C -44.578 F 159 +G1 X -6.446 Y -24.791 Z 15.642 A -43.031 C -44.663 F 159 +G1 X -7.658 Y -25.233 Z 14.875 A -43.025 C -44.744 F 159 +G1 X -8.884 Y -25.643 Z 14.125 A -43.021 C -44.823 F 159 +G1 X -10.128 Y -26.020 Z 13.385 A -43.018 C -44.901 F 159 +G1 X -11.387 Y -26.366 Z 12.658 A -43.017 C -44.979 F 159 +G1 X -12.662 Y -26.683 Z 11.943 A -43.017 C -45.056 F 159 +G1 X -14.058 Y -26.993 Z 11.181 A -43.019 C -45.138 F 159 +G1 X -15.372 Y -27.253 Z 10.485 A -43.023 C -45.214 F 159 +G1 X -16.692 Y -27.485 Z 9.805 A -43.028 C -45.289 F 159 +G1 X -18.020 Y -27.689 Z 9.139 A -43.034 C -45.362 F 159 +G1 X -19.358 Y -27.869 Z 8.487 A -43.041 C -45.435 F 159 +G1 X -20.708 Y -28.025 Z 7.849 A -43.050 C -45.507 F 159 +G1 X -22.066 Y -28.158 Z 7.224 A -43.060 C -45.578 F 159 +G1 X -23.437 Y -28.269 Z 6.613 A -43.071 C -45.648 F 159 +G1 X -27.224 Y -28.455 Z 4.806 A -43.071 C -45.648 F 159 +G1 X -27.467 Y -28.463 Z 4.686 A -43.071 C -45.649 F 636 +G1 X -27.701 Y -28.460 Z 4.560 A -43.071 C -45.649 F 636 +G1 X -27.927 Y -28.448 Z 4.429 A -43.071 C -45.649 F 636 +G1 X -28.145 Y -28.425 Z 4.293 A -43.071 C -45.649 F 636 +G1 X -28.356 Y -28.393 Z 4.151 A -43.071 C -45.650 F 636 +G1 X -28.558 Y -28.352 Z 4.004 A -43.071 C -45.650 F 636 +G1 X -28.752 Y -28.300 Z 3.851 A -43.071 C -45.650 F 636 +G1 X -28.938 Y -28.239 Z 3.694 A -43.071 C -45.650 F 636 +G1 X -29.116 Y -28.168 Z 3.531 A -43.071 C -45.651 F 636 +G1 X -29.286 Y -28.088 Z 3.363 A -43.071 C -45.651 F 636 +G1 X -29.448 Y -27.998 Z 3.189 A -43.071 C -45.651 F 636 +G1 X -29.602 Y -27.899 Z 3.011 A -43.071 C -45.651 F 636 +G1 X -29.748 Y -27.790 Z 2.827 A -43.071 C -45.652 F 636 +G1 X -29.885 Y -27.672 Z 2.638 A -43.072 C -45.652 F 636 +G1 X -30.015 Y -27.544 Z 2.444 A -43.072 C -45.652 F 636 +G1 X -30.137 Y -27.407 Z 2.245 A -43.072 C -45.653 F 636 +G1 X -30.244 Y -27.269 Z 2.053 A -43.072 C -45.653 F 636 +G1 X -30.328 Y -27.140 Z 1.881 A -43.072 C -45.653 F 636 +G1 X -30.389 Y -27.018 Z 1.729 A -43.072 C -45.654 F 636 +G1 X -30.427 Y -26.904 Z 1.597 A -43.072 C -45.654 F 636 +G1 X -30.442 Y -26.799 Z 1.485 A -43.072 C -45.654 F 636 +G1 X -30.435 Y -26.702 Z 1.393 A -43.072 C -45.654 F 636 +G1 X -30.405 Y -26.613 Z 1.321 A -43.072 C -45.654 F 636 +G1 X -30.381 Y -26.571 Z 1.293 A -43.072 C -45.655 F 636 +G1 X -30.352 Y -26.532 Z 1.269 A -43.072 C -45.655 F 636 +G1 X -30.317 Y -26.495 Z 1.251 A -43.072 C -45.655 F 636 +G1 X -30.277 Y -26.459 Z 1.237 A -43.072 C -45.655 F 636 +G1 X -30.178 Y -26.395 Z 1.225 A -43.072 C -45.655 F 636 +G1 X -30.057 Y -26.339 Z 1.234 A -43.072 C -45.655 F 636 +G1 X -29.913 Y -26.292 Z 1.262 A -43.072 C -45.655 F 636 +G1 X -29.747 Y -26.253 Z 1.311 A -43.072 C -45.656 F 636 +G1 X -29.558 Y -26.222 Z 1.379 A -43.072 C -45.656 F 636 +G1 X -29.346 Y -26.200 Z 1.468 A -43.072 C -45.656 F 636 +G1 X -29.111 Y -26.187 Z 1.577 A -43.072 C -45.657 F 636 +G1 X -25.874 Y -26.064 Z 3.146 A -43.072 C -45.657 F 159 +G1 X -24.501 Y -25.968 Z 3.768 A -43.061 C -45.587 F 159 +G1 X -23.145 Y -25.855 Z 4.405 A -43.051 C -45.518 F 159 +G1 X -21.800 Y -25.722 Z 5.056 A -43.042 C -45.447 F 159 +G1 X -20.461 Y -25.567 Z 5.723 A -43.035 C -45.376 F 159 +G1 X -19.135 Y -25.391 Z 6.404 A -43.029 C -45.304 F 159 +G1 X -17.815 Y -25.192 Z 7.102 A -43.024 C -45.232 F 159 +G1 X -16.570 Y -24.979 Z 7.778 A -43.020 C -45.162 F 159 +G1 X -15.297 Y -24.737 Z 8.489 A -43.018 C -45.089 F 159 +G1 X -14.020 Y -24.466 Z 9.222 A -43.017 C -45.015 F 159 +G1 X -12.762 Y -24.170 Z 9.964 A -43.018 C -44.940 F 159 +G1 X -11.512 Y -23.845 Z 10.723 A -43.019 C -44.864 F 159 +G1 X -10.440 Y -23.540 Z 11.390 A -43.022 C -44.797 F 159 +G1 X -9.382 Y -23.214 Z 12.067 A -43.026 C -44.730 F 159 +G1 X -8.217 Y -22.821 Z 12.831 A -43.032 C -44.655 F 159 +G1 X -7.072 Y -22.401 Z 13.605 A -43.040 C -44.579 F 159 +G1 X -5.908 Y -21.935 Z 14.417 A -43.049 C -44.500 F 159 +G1 X -4.759 Y -21.432 Z 15.245 A -43.060 C -44.419 F 159 +G1 X -3.642 Y -20.899 Z 16.077 A -43.073 C -44.339 F 159 +G1 X -2.909 Y -20.524 Z 16.641 A -43.083 C -44.285 F 159 +G1 X -1.830 Y -19.931 Z 17.497 A -43.099 C -44.204 F 159 +G1 X -0.905 Y -19.379 Z 18.259 A -43.115 C -44.132 F 159 +G1 X -0.007 Y -18.802 Z 19.028 A -43.132 C -44.060 F 159 +G1 X 0.658 Y -18.346 Z 19.616 A -43.146 C -44.006 F 159 +G1 X 1.307 Y -17.876 Z 20.210 A -43.162 C -43.951 F 159 +G1 X 1.941 Y -17.390 Z 20.809 A -43.178 C -43.897 F 159 +G1 X 2.557 Y -16.886 Z 21.410 A -43.195 C -43.842 F 159 +G1 X 3.157 Y -16.371 Z 22.020 A -43.213 C -43.788 F 159 +G1 X 3.734 Y -15.843 Z 22.627 A -43.232 C -43.735 F 159 +G1 X 4.553 Y -15.037 Z 23.533 A -43.262 C -43.656 F 159 +G1 X 6.936 Y -12.838 Z 26.203 A -43.262 C -43.656 F 159 +G1 X 7.883 Y -13.830 Z 27.659 A -43.262 C -43.656 F 318 +G0 X 14.241 Y -20.494 Z 37.446 A -43.262 C -43.656 +G0 X 15.891 Y -18.475 Z 37.831 A -41.984 C -49.766 +G0 X 17.486 Y -16.392 Z 38.086 A -41.045 C -56.144 +G0 X 19.022 Y -14.254 Z 38.210 A -40.470 C -62.719 +G0 X 20.492 Y -12.066 Z 38.203 A -40.274 C -69.398 +G0 X 21.892 Y -9.837 Z 38.065 A -40.463 C -76.077 +G0 X 23.217 Y -7.574 Z 37.797 A -41.032 C -82.655 +G0 X 24.462 Y -5.286 Z 37.399 A -41.964 C -89.037 +G0 X 25.623 Y -2.979 Z 36.873 A -43.236 C -95.153 +G0 X 18.162 Y -3.651 Z 28.905 A -43.236 C -95.153 +G1 X 16.797 Y -3.775 Z 27.448 A -43.236 C -95.153 F 318 +G1 X 16.985 Y -6.581 Z 25.201 A -43.236 C -95.153 F 159 +G1 X 17.016 Y -6.895 Z 24.960 A -43.228 C -95.174 F 159 +G1 X 17.091 Y -7.851 Z 24.237 A -43.206 C -95.240 F 159 +G1 X 17.128 Y -8.653 Z 23.640 A -43.188 C -95.296 F 159 +G1 X 17.145 Y -9.457 Z 23.052 A -43.171 C -95.351 F 159 +G1 X 17.140 Y -10.266 Z 22.468 A -43.155 C -95.406 F 159 +G1 X 17.113 Y -11.082 Z 21.889 A -43.139 C -95.462 F 159 +G1 X 17.064 Y -11.898 Z 21.315 A -43.125 C -95.517 F 159 +G1 X 16.992 Y -12.757 Z 20.720 A -43.112 C -95.576 F 159 +G1 X 16.865 Y -13.863 Z 19.965 A -43.095 C -95.651 F 159 +G1 X 16.681 Y -15.099 Z 19.135 A -43.079 C -95.734 F 159 +G1 X 16.452 Y -16.334 Z 18.317 A -43.065 C -95.817 F 159 +G1 X 16.276 Y -17.154 Z 17.781 A -43.057 C -95.872 F 159 +G1 X 15.976 Y -18.385 Z 16.985 A -43.046 C -95.953 F 159 +G1 X 15.752 Y -19.204 Z 16.460 A -43.040 C -96.008 F 159 +G1 X 15.364 Y -20.496 Z 15.642 A -43.031 C -96.093 F 159 +G1 X 14.954 Y -21.719 Z 14.875 A -43.025 C -96.173 F 159 +G1 X 14.510 Y -22.934 Z 14.125 A -43.021 C -96.253 F 159 +G1 X 14.029 Y -24.141 Z 13.385 A -43.018 C -96.331 F 159 +G1 X 13.515 Y -25.341 Z 12.658 A -43.017 C -96.409 F 159 +G1 X 12.968 Y -26.535 Z 11.943 A -43.017 C -96.486 F 159 +G1 X 12.340 Y -27.821 Z 11.181 A -43.019 C -96.568 F 159 +G1 X 11.724 Y -29.010 Z 10.485 A -43.023 C -96.644 F 159 +G1 X 11.082 Y -30.187 Z 9.805 A -43.028 C -96.719 F 159 +G1 X 10.413 Y -31.352 Z 9.139 A -43.034 C -96.792 F 159 +G1 X 9.720 Y -32.510 Z 8.487 A -43.041 C -96.865 F 159 +G1 X 9.001 Y -33.663 Z 7.849 A -43.050 C -96.937 F 159 +G1 X 8.258 Y -34.807 Z 7.224 A -43.060 C -97.008 F 159 +G1 X 7.489 Y -35.949 Z 6.613 A -43.071 C -97.078 F 159 +G1 X 5.274 Y -39.026 Z 4.806 A -43.071 C -97.078 F 159 +G1 X 5.129 Y -39.220 Z 4.686 A -43.071 C -97.079 F 636 +G1 X 4.981 Y -39.402 Z 4.560 A -43.071 C -97.079 F 636 +G1 X 4.830 Y -39.571 Z 4.429 A -43.071 C -97.079 F 636 +G1 X 4.676 Y -39.728 Z 4.293 A -43.071 C -97.079 F 636 +G1 X 4.520 Y -39.872 Z 4.151 A -43.071 C -97.080 F 636 +G1 X 4.362 Y -40.004 Z 4.004 A -43.071 C -97.080 F 636 +G1 X 4.201 Y -40.124 Z 3.851 A -43.071 C -97.080 F 636 +G1 X 4.037 Y -40.231 Z 3.694 A -43.071 C -97.080 F 636 +G1 X 3.871 Y -40.326 Z 3.531 A -43.071 C -97.081 F 636 +G1 X 3.702 Y -40.409 Z 3.363 A -43.071 C -97.081 F 636 +G1 X 3.531 Y -40.480 Z 3.189 A -43.071 C -97.081 F 636 +G1 X 3.357 Y -40.538 Z 3.011 A -43.071 C -97.081 F 636 +G1 X 3.181 Y -40.584 Z 2.827 A -43.071 C -97.082 F 636 +G1 X 3.002 Y -40.618 Z 2.638 A -43.072 C -97.082 F 636 +G1 X 2.822 Y -40.640 Z 2.444 A -43.072 C -97.082 F 636 +G1 X 2.638 Y -40.650 Z 2.245 A -43.072 C -97.082 F 636 +G1 X 2.464 Y -40.648 Z 2.053 A -43.072 C -97.083 F 636 +G1 X 2.311 Y -40.632 Z 1.881 A -43.072 C -97.083 F 636 +G1 X 2.177 Y -40.604 Z 1.729 A -43.072 C -97.084 F 636 +G1 X 2.065 Y -40.563 Z 1.597 A -43.072 C -97.084 F 636 +G1 X 1.973 Y -40.510 Z 1.485 A -43.072 C -97.084 F 636 +G1 X 1.901 Y -40.443 Z 1.393 A -43.072 C -97.084 F 636 +G1 X 1.851 Y -40.364 Z 1.321 A -43.072 C -97.084 F 636 +G1 X 1.833 Y -40.320 Z 1.293 A -43.072 C -97.085 F 636 +G1 X 1.820 Y -40.273 Z 1.269 A -43.072 C -97.085 F 636 +G1 X 1.813 Y -40.222 Z 1.251 A -43.072 C -97.085 F 636 +G1 X 1.811 Y -40.168 Z 1.237 A -43.072 C -97.085 F 636 +G1 X 1.822 Y -40.051 Z 1.225 A -43.072 C -97.085 F 636 +G1 X 1.854 Y -39.922 Z 1.234 A -43.072 C -97.085 F 636 + +G1 X 1.906 Y -39.780 Z 1.262 A -43.072 C -97.085 F 636 +G1 X 1.979 Y -39.626 Z 1.311 A -43.072 C -97.086 F 636 +G1 X 2.073 Y -39.459 Z 1.379 A -43.072 C -97.086 F 636 +G1 X 2.188 Y -39.279 Z 1.468 A -43.072 C -97.086 F 636 +G1 X 2.324 Y -39.087 Z 1.577 A -43.072 C -97.087 F 636 +G1 X 4.246 Y -36.479 Z 3.146 A -43.072 C -97.087 F 159 +G1 X 5.027 Y -35.346 Z 3.768 A -43.061 C -97.017 F 159 +G1 X 5.785 Y -34.216 Z 4.405 A -43.051 C -96.948 F 159 +G1 X 6.519 Y -33.082 Z 5.056 A -43.042 C -96.877 F 159 +G1 X 7.233 Y -31.937 Z 5.723 A -43.035 C -96.806 F 159 +G1 X 7.921 Y -30.791 Z 6.404 A -43.029 C -96.734 F 159 +G1 X 8.589 Y -29.635 Z 7.102 A -43.024 C -96.662 F 159 +G1 X 9.199 Y -28.529 Z 7.778 A -43.020 C -96.592 F 159 +G1 X 9.803 Y -27.383 Z 8.489 A -43.018 C -96.519 F 159 +G1 X 10.388 Y -26.216 Z 9.222 A -43.017 C -96.445 F 159 +G1 X 10.941 Y -25.047 Z 9.964 A -43.017 C -96.370 F 159 +G1 X 11.466 Y -23.867 Z 10.723 A -43.019 C -96.294 F 159 +G1 X 11.896 Y -22.839 Z 11.390 A -43.022 C -96.227 F 159 +G1 X 12.300 Y -21.809 Z 12.067 A -43.026 C -96.160 F 159 +G1 X 12.720 Y -20.653 Z 12.831 A -43.032 C -96.085 F 159 +G1 X 13.105 Y -19.496 Z 13.605 A -43.040 C -96.009 F 159 +G1 X 13.466 Y -18.294 Z 14.417 A -43.049 C -95.930 F 159 +G1 X 13.790 Y -17.083 Z 15.245 A -43.060 C -95.849 F 159 +G1 X 14.069 Y -15.877 Z 16.077 A -43.073 C -95.769 F 159 +G1 X 14.233 Y -15.071 Z 16.641 A -43.083 C -95.715 F 159 +G1 X 14.442 Y -13.857 Z 17.497 A -43.099 C -95.634 F 159 +G1 X 14.587 Y -12.790 Z 18.259 A -43.115 C -95.562 F 159 +G1 X 14.696 Y -11.728 Z 19.028 A -43.132 C -95.490 F 159 +G1 X 14.754 Y -10.924 Z 19.616 A -43.146 C -95.436 F 159 +G1 X 14.791 Y -10.123 Z 20.210 A -43.162 C -95.381 F 159 +G1 X 14.807 Y -9.325 Z 20.809 A -43.178 C -95.327 F 159 +G1 X 14.797 Y -8.529 Z 21.410 A -43.195 C -95.272 F 159 +G1 X 14.768 Y -7.738 Z 22.020 A -43.213 C -95.218 F 159 +G1 X 14.715 Y -6.958 Z 22.627 A -43.232 C -95.165 F 159 +G1 X 14.596 Y -5.816 Z 23.533 A -43.262 C -95.086 F 159 +G1 X 14.362 Y -2.581 Z 26.203 A -43.262 C -95.086 F 159 +G1 X 15.728 Y -2.460 Z 27.659 A -43.262 C -95.086 F 318 +G0 X 24.902 Y -1.643 Z 37.446 A -43.262 C -95.086 +G0 X 24.352 Y 0.906 Z 37.831 A -41.984 C -101.196 +G0 X 23.718 Y 3.451 Z 38.086 A -41.045 C -107.574 +G0 X 23.004 Y 5.985 Z 38.210 A -40.470 C -114.149 +G0 X 22.210 Y 8.499 Z 38.203 A -40.274 C -120.828 +G0 X 21.340 Y 10.983 Z 38.065 A -40.463 C -127.507 +G0 X 20.397 Y 13.430 Z 37.797 A -41.032 C -134.085 +G0 X 19.384 Y 15.830 Z 37.399 A -41.964 C -140.467 +G0 X 18.304 Y 18.176 Z 36.873 A -43.236 C -146.583 +G0 X 14.178 Y 11.923 Z 28.905 A -43.236 C -146.583 +G1 X 13.424 Y 10.780 Z 27.448 A -43.236 C -146.583 F 318 +G1 X 15.735 Y 9.177 Z 25.201 A -43.236 C -146.583 F 159 +G1 X 16.000 Y 9.005 Z 24.960 A -43.228 C -146.604 F 159 +G1 X 16.794 Y 8.468 Z 24.237 A -43.206 C -146.670 F 159 +G1 X 17.444 Y 7.997 Z 23.640 A -43.188 C -146.726 F 159 +G1 X 18.083 Y 7.508 Z 23.052 A -43.171 C -146.781 F 159 +G1 X 18.713 Y 7.000 Z 22.468 A -43.155 C -146.836 F 159 +G1 X 19.334 Y 6.470 Z 21.889 A -43.139 C -146.892 F 159 +G1 X 19.941 Y 5.923 Z 21.315 A -43.125 C -146.948 F 159 +G1 X 20.568 Y 5.332 Z 20.720 A -43.112 C -147.006 F 159 +G1 X 21.354 Y 4.543 Z 19.965 A -43.095 C -147.081 F 159 +G1 X 22.205 Y 3.628 Z 19.135 A -43.079 C -147.164 F 159 +G1 X 23.028 Y 2.679 Z 18.317 A -43.065 C -147.247 F 159 +G1 X 23.559 Y 2.030 Z 17.781 A -43.057 C -147.302 F 159 +G1 X 24.334 Y 1.028 Z 16.985 A -43.046 C -147.383 F 159 +G1 X 24.836 Y 0.343 Z 16.460 A -43.040 C -147.438 F 159 +G1 X 25.604 Y -0.767 Z 15.642 A -43.031 C -147.523 F 159 +G1 X 26.304 Y -1.850 Z 14.875 A -43.025 C -147.604 F 159 +G1 X 26.977 Y -2.954 Z 14.125 A -43.021 C -147.683 F 159 +G1 X 27.621 Y -4.083 Z 13.385 A -43.018 C -147.761 F 159 +G1 X 28.239 Y -5.233 Z 12.658 A -43.017 C -147.839 F 159 +G1 X 28.832 Y -6.405 Z 11.943 A -43.017 C -147.916 F 159 +G1 X 29.445 Y -7.698 Z 11.181 A -43.019 C -147.998 F 159 +G1 X 29.991 Y -8.920 Z 10.485 A -43.023 C -148.074 F 159 +G1 X 30.511 Y -10.156 Z 9.805 A -43.028 C -148.149 F 159 +G1 X 31.005 Y -11.406 Z 9.139 A -43.034 C -148.222 F 159 +G1 X 31.478 Y -12.669 Z 8.487 A -43.041 C -148.295 F 159 +G1 X 31.931 Y -13.951 Z 7.849 A -43.050 C -148.367 F 159 +G1 X 32.362 Y -15.245 Z 7.224 A -43.060 C -148.438 F 159 +G1 X 32.776 Y -16.558 Z 6.613 A -43.071 C -148.508 F 159 +G1 X 33.801 Y -20.208 Z 4.806 A -43.071 C -148.508 F 159 +G1 X 33.862 Y -20.443 Z 4.686 A -43.071 C -148.508 F 636 +G1 X 33.912 Y -20.672 Z 4.560 A -43.071 C -148.509 F 636 +G1 X 33.950 Y -20.895 Z 4.429 A -43.071 C -148.509 F 636 +G1 X 33.977 Y -21.113 Z 4.293 A -43.071 C -148.509 F 636 +G1 X 33.992 Y -21.325 Z 4.151 A -43.071 C -148.510 F 636 +G1 X 33.997 Y -21.531 Z 4.004 A -43.071 C -148.510 F 636 +G1 X 33.990 Y -21.732 Z 3.851 A -43.071 C -148.510 F 636 +G1 X 33.972 Y -21.927 Z 3.694 A -43.071 C -148.510 F 636 +G1 X 33.942 Y -22.116 Z 3.531 A -43.071 C -148.511 F 636 +G1 X 33.902 Y -22.300 Z 3.363 A -43.071 C -148.511 F 636 +G1 X 33.850 Y -22.477 Z 3.189 A -43.071 C -148.511 F 636 +G1 X 33.788 Y -22.650 Z 3.011 A -43.071 C -148.511 F 636 +G1 X 33.714 Y -22.816 Z 2.827 A -43.071 C -148.512 F 636 +G1 X 33.629 Y -22.977 Z 2.638 A -43.072 C -148.512 F 636 +G1 X 33.534 Y -23.132 Z 2.444 A -43.072 C -148.512 F 636 +G1 X 33.427 Y -23.281 Z 2.245 A -43.072 C -148.513 F 636 +G1 X 33.317 Y -23.416 Z 2.053 A -43.072 C -148.513 F 636 +G1 X 33.209 Y -23.527 Z 1.881 A -43.072 C -148.513 F 636 +G1 X 33.104 Y -23.613 Z 1.729 A -43.072 C -148.514 F 636 +G1 X 33.002 Y -23.676 Z 1.597 A -43.072 C -148.514 F 636 +G1 X 32.902 Y -23.714 Z 1.485 A -43.072 C -148.514 F 636 +G1 X 32.806 Y -23.729 Z 1.393 A -43.072 C -148.514 F 636 +G1 X 32.712 Y -23.719 Z 1.321 A -43.072 C -148.514 F 636 +G1 X 32.667 Y -23.705 Z 1.293 A -43.072 C -148.515 F 636 +G1 X 32.622 Y -23.686 Z 1.269 A -43.072 C -148.515 F 636 +G1 X 32.578 Y -23.660 Z 1.251 A -43.072 C -148.515 F 636 +G1 X 32.534 Y -23.628 Z 1.237 A -43.072 C -148.515 F 636 +G1 X 32.450 Y -23.546 Z 1.225 A -43.072 C -148.515 F 636 +G1 X 32.369 Y -23.441 Z 1.234 A -43.072 C -148.515 F 636 +G1 X 32.290 Y -23.311 Z 1.262 A -43.072 C -148.515 F 636 +G1 X 32.215 Y -23.158 Z 1.311 A -43.072 C -148.516 F 636 +G1 X 32.143 Y -22.980 Z 1.379 A -43.072 C -148.516 F 636 +G1 X 32.075 Y -22.779 Z 1.468 A -43.072 C -148.516 F 636 +G1 X 32.009 Y -22.553 Z 1.577 A -43.072 C -148.517 F 636 +G1 X 31.169 Y -19.424 Z 3.146 A -43.072 C -148.517 F 159 +G1 X 30.770 Y -18.107 Z 3.768 A -43.061 C -148.447 F 159 +G1 X 30.358 Y -16.810 Z 4.405 A -43.051 C -148.378 F 159 +G1 X 29.929 Y -15.528 Z 5.056 A -43.042 C -148.307 F 159 +G1 X 29.479 Y -14.257 Z 5.723 A -43.035 C -148.236 F 159 +G1 X 29.013 Y -13.004 Z 6.404 A -43.029 C -148.164 F 159 +G1 X 28.525 Y -11.761 Z 7.102 A -43.024 C -148.092 F 159 +G1 X 28.041 Y -10.595 Z 7.778 A -43.020 C -148.022 F 159 +G1 X 27.521 Y -9.408 Z 8.489 A -43.018 C -147.949 F 159 +G1 X 26.973 Y -8.223 Z 9.222 A -43.017 C -147.875 F 159 +G1 X 26.404 Y -7.062 Z 9.964 A -43.018 C -147.800 F 159 +G1 X 25.809 Y -5.916 Z 10.723 A -43.019 C -147.724 F 159 +G1 X 25.273 Y -4.939 Z 11.390 A -43.022 C -147.657 F 159 +G1 X 24.720 Y -3.980 Z 12.067 A -43.026 C -147.590 F 159 +G1 X 24.078 Y -2.931 Z 12.831 A -43.032 C -147.515 F 159 +G1 X 23.413 Y -1.909 Z 13.605 A -43.040 C -147.439 F 159 +G1 X 22.699 Y -0.877 Z 14.417 A -43.049 C -147.360 F 159 +G1 X 21.954 Y 0.131 Z 15.245 A -43.060 C -147.279 F 159 +G1 X 21.185 Y 1.101 Z 16.077 A -43.073 C -147.199 F 159 +G1 X 20.657 Y 1.732 Z 16.641 A -43.083 C -147.145 F 159 +G1 X 19.838 Y 2.652 Z 17.497 A -43.099 C -147.064 F 159 +G1 X 19.095 Y 3.431 Z 18.259 A -43.115 C -146.992 F 159 +G1 X 18.332 Y 4.178 Z 19.028 A -43.132 C -146.920 F 159 +G1 X 17.740 Y 4.725 Z 19.616 A -43.146 C -146.866 F 159 +G1 X 17.137 Y 5.253 Z 20.210 A -43.162 C -146.811 F 159 +G1 X 16.522 Y 5.763 Z 20.809 A -43.178 C -146.757 F 159 +G1 X 15.893 Y 6.251 Z 21.410 A -43.195 C -146.702 F 159 +G1 X 15.258 Y 6.722 Z 22.020 A -43.213 C -146.648 F 159 +G1 X 14.615 Y 7.167 Z 22.627 A -43.232 C -146.595 F 159 +G1 X 13.647 Y 7.786 Z 23.533 A -43.262 C -146.516 F 159 +G1 X 10.973 Y 9.620 Z 26.203 A -43.262 C -146.516 F 159 +G1 X 11.729 Y 10.763 Z 27.659 A -43.262 C -146.516 F 318 +G0 X 16.810 Y 18.445 Z 37.446 A -43.262 C -146.516 +G0 X 14.475 Y 19.604 Z 37.831 A -41.984 C -152.626 +G0 X 12.089 Y 20.696 Z 38.086 A -41.045 C -159.004 +G0 X 9.662 Y 21.717 Z 38.210 A -40.470 C -165.579 +G0 X 7.202 Y 22.663 Z 38.203 A -40.274 C -172.258 +G0 X 4.718 Y 23.532 Z 38.065 A -40.463 C -178.937 +G0 X 2.217 Y 24.320 Z 37.797 A -41.032 C -185.515 +G0 X -0.291 Y 25.025 Z 37.399 A -41.964 C -191.897 +G0 X -2.799 Y 25.643 Z 36.873 A -43.236 C -198.013 +G0 X -0.482 Y 18.519 Z 28.905 A -43.236 C -198.013 +G1 X -0.059 Y 17.216 Z 27.448 A -43.236 C -198.013 F 318 +G1 X 2.636 Y 18.024 Z 25.201 A -43.236 C -198.013 F 159 +G1 X 2.935 Y 18.124 Z 24.960 A -43.228 C -198.034 F 159 +G1 X 3.850 Y 18.410 Z 24.237 A -43.206 C -198.100 F 159 +G1 X 4.624 Y 18.625 Z 23.640 A -43.188 C -198.156 F 159 +G1 X 5.404 Y 18.820 Z 23.052 A -43.171 C -198.211 F 159 +G1 X 6.194 Y 18.995 Z 22.468 A -43.155 C -198.266 F 159 +G1 X 6.996 Y 19.151 Z 21.889 A -43.140 C -198.322 F 159 +G1 X 7.802 Y 19.284 Z 21.315 A -43.125 C -198.377 F 159 +G1 X 8.655 Y 19.405 Z 20.720 A -43.112 C -198.436 F 159 +G1 X 9.762 Y 19.528 Z 19.965 A -43.095 C -198.511 F 159 +G1 X 11.007 Y 19.623 Z 19.135 A -43.079 C -198.594 F 159 +G1 X 12.262 Y 19.674 Z 18.317 A -43.065 C -198.677 F 159 +G1 X 13.101 Y 19.685 Z 17.781 A -43.057 C -198.732 F 159 +G1 X 14.368 Y 19.667 Z 16.985 A -43.046 C -198.813 F 159 +G1 X 15.216 Y 19.631 Z 16.460 A -43.040 C -198.868 F 159 +G1 X 16.563 Y 19.540 Z 15.642 A -43.031 C -198.953 F 159 +G1 X 17.846 Y 19.413 Z 14.875 A -43.025 C -199.034 F 159 +G1 X 19.129 Y 19.250 Z 14.125 A -43.021 C -199.113 F 159 +G1 X 20.413 Y 19.050 Z 13.385 A -43.018 C -199.191 F 159 +G1 X 21.698 Y 18.816 Z 12.658 A -43.017 C -199.269 F 159 +G1 X 22.984 Y 18.549 Z 11.943 A -43.017 C -199.346 F 159 +G1 X 24.377 Y 18.223 Z 11.181 A -43.019 C -199.428 F 159 +G1 X 25.673 Y 17.887 Z 10.485 A -43.023 C -199.504 F 159 +G1 X 26.963 Y 17.523 Z 9.805 A -43.028 C -199.579 F 159 +G1 X 28.248 Y 17.130 Z 9.139 A -43.034 C -199.652 F 159 +G1 X 29.531 Y 16.712 Z 8.487 A -43.041 C -199.725 F 159 +G1 X 30.816 Y 16.267 Z 7.849 A -43.050 C -199.797 F 159 +G1 X 32.096 Y 15.798 Z 7.224 A -43.060 C -199.868 F 159 +G1 X 33.380 Y 15.303 Z 6.613 A -43.071 C -199.938 F 159 +G1 X 36.873 Y 13.828 Z 4.806 A -43.071 C -199.938 F 159 +G1 X 37.095 Y 13.729 Z 4.686 A -43.071 C -199.939 F 636 +G1 X 37.305 Y 13.625 Z 4.560 A -43.071 C -199.939 F 636 +G1 X 37.504 Y 13.516 Z 4.429 A -43.071 C -199.939 F 636 +G1 X 37.690 Y 13.401 Z 4.293 A -43.071 C -199.939 F 636 +G1 X 37.866 Y 13.281 Z 4.151 A -43.071 C -199.940 F 636 +G1 X 38.030 Y 13.156 Z 4.004 A -43.071 C -199.940 F 636 +G1 X 38.183 Y 13.026 Z 3.851 A -43.071 C -199.940 F 636 +G1 X 38.324 Y 12.890 Z 3.694 A -43.071 C -199.940 F 636 +G1 X 38.453 Y 12.749 Z 3.531 A -43.071 C -199.941 F 636 +G1 X 38.572 Y 12.603 Z 3.363 A -43.071 C -199.941 F 636 +G1 X 38.679 Y 12.452 Z 3.189 A -43.071 C -199.941 F 636 +G1 X 38.774 Y 12.295 Z 3.011 A -43.071 C -199.941 F 636 +G1 X 38.858 Y 12.134 Z 2.827 A -43.071 C -199.942 F 636 +G1 X 38.931 Y 11.968 Z 2.638 A -43.072 C -199.942 F 636 +G1 X 38.993 Y 11.796 Z 2.444 A -43.072 C -199.942 F 636 +G1 X 39.043 Y 11.620 Z 2.245 A -43.072 C -199.943 F 636 +G1 X 39.080 Y 11.449 Z 2.053 A -43.072 C -199.943 F 636 +G1 X 39.099 Y 11.296 Z 1.881 A -43.072 C -199.943 F 636 +G1 X 39.101 Y 11.160 Z 1.729 A -43.072 C -199.944 F 636 +G1 X 39.086 Y 11.041 Z 1.597 A -43.072 C -199.944 F 636 +G1 X 39.054 Y 10.940 Z 1.485 A -43.072 C -199.944 F 636 +G1 X 39.006 Y 10.855 Z 1.393 A -43.072 C -199.944 F 636 +G1 X 38.940 Y 10.788 Z 1.321 A -43.072 C -199.945 F 636 +G1 X 38.901 Y 10.761 Z 1.293 A -43.072 C -199.945 F 636 +G1 X 38.857 Y 10.738 Z 1.269 A -43.072 C -199.945 F 636 +G1 X 38.810 Y 10.720 Z 1.251 A -43.072 C -199.945 F 636 +G1 X 38.758 Y 10.706 Z 1.237 A -43.072 C -199.945 F 636 +G1 X 38.641 Y 10.690 Z 1.225 A -43.072 C -199.945 F 636 +G1 X 38.508 Y 10.693 Z 1.234 A -43.072 C -199.945 F 636 +G1 X 38.358 Y 10.712 Z 1.262 A -43.072 C -199.945 F 636 +G1 X 38.191 Y 10.749 Z 1.311 A -43.072 C -199.946 F 636 +G1 X 38.007 Y 10.804 Z 1.379 A -43.072 C -199.946 F 636 +G1 X 37.807 Y 10.876 Z 1.468 A -43.072 C -199.946 F 636 +G1 X 37.590 Y 10.965 Z 1.577 A -43.072 C -199.947 F 636 +G1 X 34.619 Y 12.259 Z 3.146 A -43.072 C -199.947 F 159 +G1 X 33.341 Y 12.768 Z 3.768 A -43.061 C -199.877 F 159 +G1 X 32.070 Y 13.255 Z 4.405 A -43.051 C -199.808 F 159 +G1 X 30.801 Y 13.719 Z 5.056 A -43.042 C -199.737 F 159 +G1 X 29.526 Y 14.160 Z 5.723 A -43.035 C -199.666 F 159 +G1 X 28.256 Y 14.576 Z 6.404 A -43.029 C -199.594 F 159 +G1 X 26.980 Y 14.969 Z 7.102 A -43.024 C -199.522 F 159 +G1 X 25.766 Y 15.318 Z 7.778 A -43.020 C -199.452 F 159 +G1 X 24.514 Y 15.652 Z 8.489 A -43.018 C -199.379 F 159 +G1 X 23.246 Y 15.962 Z 9.222 A -43.017 C -199.305 F 159 +G1 X 21.984 Y 16.241 Z 9.964 A -43.018 C -199.230 F 159 +G1 X 20.716 Y 16.490 Z 10.723 A -43.019 C -199.154 F 159 +G1 X 19.619 Y 16.681 Z 11.390 A -43.022 C -199.087 F 159 +G1 X 18.524 Y 16.846 Z 12.067 A -43.026 C -199.020 F 159 +G1 X 17.303 Y 16.997 Z 12.831 A -43.032 C -198.945 F 159 +G1 X 16.090 Y 17.115 Z 13.605 A -43.040 C -198.869 F 159 +G1 X 14.838 Y 17.200 Z 14.417 A -43.049 C -198.790 F 159 +G1 X 13.585 Y 17.246 Z 15.245 A -43.060 C -198.709 F 159 +G1 X 12.347 Y 17.250 Z 16.077 A -43.073 C -198.629 F 159 +G1 X 11.525 Y 17.230 Z 16.641 A -43.083 C -198.575 F 159 +G1 X 10.295 Y 17.164 Z 17.497 A -43.099 C -198.494 F 159 +G1 X 9.223 Y 17.068 Z 18.259 A -43.115 C -198.422 F 159 +G1 X 8.162 Y 16.938 Z 19.028 A -43.132 C -198.350 F 159 +G1 X 7.366 Y 16.816 Z 19.616 A -43.146 C -198.296 F 159 +G1 X 6.577 Y 16.674 Z 20.210 A -43.162 C -198.241 F 159 +G1 X 5.795 Y 16.511 Z 20.809 A -43.178 C -198.187 F 159 +G1 X 5.022 Y 16.324 Z 21.410 A -43.195 C -198.132 F 159 +G1 X 4.257 Y 16.120 Z 22.020 A -43.213 C -198.078 F 159 +G1 X 3.509 Y 15.895 Z 22.627 A -43.232 C -198.025 F 159 +G1 X 2.421 Y 15.524 Z 23.533 A -43.262 C -197.946 F 159 +G1 X -0.680 Y 14.577 Z 26.203 A -43.262 C -197.946 F 159 +G1 X -1.103 Y 15.881 Z 27.659 A -43.262 C -197.946 F 318 +G0 X -3.940 Y 24.643 Z 37.446 A -43.262 C -197.946 +G0 X -6.303 Y 23.540 Z 37.831 A -41.984 C -204.056 +G0 X -8.644 Y 22.355 Z 38.086 A -41.045 C -210.434 +G0 X -10.955 Y 21.094 Z 38.210 A -40.470 C -217.009 +G0 X -13.229 Y 19.761 Z 38.203 A -40.274 C -223.688 +G0 X -15.457 Y 18.360 Z 38.065 A -40.463 C -230.367 +G0 X -17.632 Y 16.896 Z 37.797 A -41.032 C -236.945 +G0 X -19.747 Y 15.374 Z 37.399 A -41.964 C -243.327 +G0 X -21.794 Y 13.799 Z 36.873 A -43.236 C -249.443 +G0 X -14.780 Y 11.169 Z 28.905 A -43.236 C -249.443 +G1 X -13.497 Y 10.688 Z 27.448 A -43.236 C -249.443 F 318 +G1 X -12.449 Y 13.298 Z 25.201 A -43.236 C -249.443 F 159 +G1 X -12.340 Y 13.594 Z 24.960 A -43.228 C -249.464 F 159 +G1 X -11.993 Y 14.488 Z 24.237 A -43.206 C -249.530 F 159 +G1 X -11.679 Y 15.227 Z 23.640 A -43.188 C -249.586 F 159 +G1 X -11.345 Y 15.959 Z 23.052 A -43.171 C -249.641 F 159 +G1 X -10.989 Y 16.685 Z 22.468 A -43.155 C -249.696 F 159 +G1 X -10.611 Y 17.409 Z 21.889 A -43.140 C -249.752 F 159 +G1 X -10.213 Y 18.123 Z 21.315 A -43.125 C -249.807 F 159 +G1 X -9.776 Y 18.865 Z 20.720 A -43.112 C -249.866 F 159 +G1 X -9.181 Y 19.807 Z 19.965 A -43.095 C -249.941 F 159 +G1 X -8.479 Y 20.840 Z 19.135 A -43.079 C -250.024 F 159 +G1 X -7.737 Y 21.854 Z 18.317 A -43.065 C -250.107 F 159 +G1 X -7.223 Y 22.516 Z 17.781 A -43.057 C -250.162 F 159 +G1 X -6.419 Y 23.495 Z 16.985 A -43.046 C -250.244 F 159 +G1 X -5.862 Y 24.136 Z 16.460 A -43.040 C -250.298 F 159 +G1 X -4.951 Y 25.132 Z 15.642 A -43.031 C -250.383 F 159 +G1 X -4.051 Y 26.056 Z 14.875 A -43.025 C -250.464 F 159 +G1 X -3.124 Y 26.958 Z 14.125 A -43.021 C -250.543 F 159 +G1 X -2.167 Y 27.837 Z 13.385 A -43.018 C -250.621 F 159 +G1 X -1.184 Y 28.696 Z 12.658 A -43.017 C -250.699 F 159 +G1 X -0.173 Y 29.534 Z 11.943 A -43.017 C -250.776 F 159 +G1 X 0.951 Y 30.420 Z 11.181 A -43.019 C -250.858 F 159 +G1 X 2.022 Y 31.224 Z 10.485 A -43.023 C -250.934 F 159 +G1 X 3.111 Y 32.006 Z 9.805 A -43.028 C -251.009 F 159 +G1 X 4.219 Y 32.766 Z 9.139 A -43.034 C -251.082 F 159 +G1 X 5.346 Y 33.508 Z 8.487 A -43.041 C -251.155 F 159 +G1 X 6.494 Y 34.235 Z 7.849 A -43.050 C -251.227 F 159 +G1 X 7.660 Y 34.944 Z 7.224 A -43.060 C -251.298 F 159 +G1 X 8.847 Y 35.639 Z 6.613 A -43.071 C -251.368 F 159 +G1 X 12.178 Y 37.451 Z 4.806 A -43.071 C -251.368 F 159 +G1 X 12.393 Y 37.562 Z 4.686 A -43.071 C -251.369 F 636 +G1 X 12.606 Y 37.662 Z 4.560 A -43.071 C -251.369 F 636 +G1 X 12.815 Y 37.749 Z 4.429 A -43.071 C -251.369 F 636 +G1 X 13.021 Y 37.823 Z 4.293 A -43.071 C -251.369 F 636 +G1 X 13.224 Y 37.886 Z 4.151 A -43.071 C -251.370 F 636 +G1 X 13.425 Y 37.936 Z 4.004 A -43.071 C -251.370 F 636 +G1 X 13.622 Y 37.974 Z 3.851 A -43.071 C -251.370 F 636 +G1 X 13.816 Y 38.000 Z 3.694 A -43.071 C -251.370 F 636 +G1 X 14.007 Y 38.013 Z 3.531 A -43.071 C -251.371 F 636 +G1 X 14.195 Y 38.015 Z 3.363 A -43.071 C -251.371 F 636 +G1 X 14.380 Y 38.004 Z 3.189 A -43.071 C -251.371 F 636 +G1 X 14.561 Y 37.981 Z 3.011 A -43.071 C -251.371 F 636 +G1 X 14.740 Y 37.947 Z 2.827 A -43.071 C -251.372 F 636 +G1 X 14.916 Y 37.900 Z 2.638 A -43.072 C -251.372 F 636 +G1 X 15.088 Y 37.841 Z 2.444 A -43.072 C -251.372 F 636 +G1 X 15.258 Y 37.771 Z 2.245 A -43.072 C -251.372 F 636 +G1 X 15.413 Y 37.693 Z 2.053 A -43.072 C -251.373 F 636 +G1 X 15.545 Y 37.612 Z 1.881 A -43.072 C -251.373 F 636 +G1 X 15.653 Y 37.529 Z 1.729 A -43.072 C -251.374 F 636 +G1 X 15.737 Y 37.443 Z 1.597 A -43.072 C -251.374 F 636 +G1 X 15.796 Y 37.355 Z 1.485 A -43.072 C -251.374 F 636 +G1 X 15.832 Y 37.264 Z 1.393 A -43.072 C -251.374 F 636 +G1 X 15.843 Y 37.171 Z 1.321 A -43.072 C -251.375 F 636 +G1 X 15.840 Y 37.123 Z 1.293 A -43.072 C -251.375 F 636 +G1 X 15.831 Y 37.075 Z 1.269 A -43.072 C -251.375 F 636 +G1 X 15.816 Y 37.027 Z 1.251 A -43.072 C -251.375 F 636 +G1 X 15.794 Y 36.977 Z 1.237 A -43.072 C -251.375 F 636 +G1 X 15.733 Y 36.877 Z 1.225 A -43.072 C -251.375 F 636 +G1 X 15.649 Y 36.774 Z 1.234 A -43.072 C -251.375 F 636 +G1 X 15.540 Y 36.669 Z 1.262 A -43.072 C -251.375 F 636 +G1 X 15.407 Y 36.561 Z 1.311 A -43.072 C -251.376 F 636 +G1 X 15.250 Y 36.452 Z 1.379 A -43.072 C -251.376 F 636 +G1 X 15.068 Y 36.340 Z 1.468 A -43.072 C -251.376 F 636 +G1 X 14.863 Y 36.226 Z 1.577 A -43.072 C -251.377 F 636 +G1 X 11.999 Y 34.710 Z 3.146 A -43.072 C -251.377 F 159 +G1 X 10.804 Y 34.028 Z 3.768 A -43.061 C -251.307 F 159 +G1 X 9.631 Y 33.338 Z 4.405 A -43.051 C -251.238 F 159 +G1 X 8.477 Y 32.635 Z 5.056 A -43.042 C -251.167 F 159 +G1 X 7.338 Y 31.913 Z 5.723 A -43.035 C -251.096 F 159 +G1 X 6.220 Y 31.179 Z 6.404 A -43.029 C -251.024 F 159 +G1 X 5.118 Y 30.427 Z 7.102 A -43.024 C -250.952 F 159 +G1 X 4.088 Y 29.695 Z 7.778 A -43.020 C -250.882 F 159 +G1 X 3.046 Y 28.925 Z 8.489 A -43.018 C -250.809 F 159 +G1 X 2.014 Y 28.127 Z 9.222 A -43.017 C -250.735 F 159 +G1 X 1.008 Y 27.314 Z 9.964 A -43.018 C -250.660 F 159 +G1 X 0.023 Y 26.478 Z 10.723 A -43.019 C -250.584 F 159 +G1 X -0.810 Y 25.739 Z 11.390 A -43.022 C -250.517 F 159 +G1 X -1.622 Y 24.986 Z 12.067 A -43.026 C -250.450 F 159 +G1 X -2.501 Y 24.126 Z 12.831 A -43.032 C -250.375 F 159 +G1 X -3.350 Y 23.251 Z 13.605 A -43.040 C -250.299 F 159 +G1 X -4.197 Y 22.325 Z 14.417 A -43.049 C -250.219 F 159 +G1 X -5.014 Y 21.374 Z 15.245 A -43.060 C -250.139 F 159 +G1 X -5.788 Y 20.408 Z 16.077 A -43.073 C -250.059 F 159 +G1 X -6.286 Y 19.753 Z 16.641 A -43.083 C -250.005 F 159 +G1 X -7.001 Y 18.751 Z 17.497 A -43.099 C -249.924 F 159 +G1 X -7.595 Y 17.852 Z 18.259 A -43.115 C -249.852 F 159 +G1 X -8.154 Y 16.942 Z 19.028 A -43.132 C -249.780 F 159 +G1 X -8.555 Y 16.243 Z 19.616 A -43.146 C -249.726 F 159 +G1 X -8.935 Y 15.538 Z 20.210 A -43.162 C -249.671 F 159 +G1 X -9.296 Y 14.825 Z 20.809 A -43.178 C -249.617 F 159 +G1 X -9.632 Y 14.103 Z 21.410 A -43.195 C -249.562 F 159 +G1 X -9.949 Y 13.379 Z 22.020 A -43.213 C -249.508 F 159 +G1 X -10.240 Y 12.653 Z 22.627 A -43.232 C -249.455 F 159 +G1 X -10.628 Y 11.572 Z 23.533 A -43.262 C -249.376 F 159 +G1 X -11.821 Y 8.556 Z 26.203 A -43.262 C -249.376 F 159 +G1 X -13.104 Y 9.039 Z 27.659 A -43.262 C -249.376 F 318 +G0 X -21.724 Y 12.283 Z 37.446 A -43.262 C -249.376 +G0 X -22.334 Y 9.748 Z 37.831 A -41.984 C -255.486 +G0 X -22.868 Y 7.180 Z 38.086 A -41.045 C -261.864 +G0 X -23.323 Y 4.587 Z 38.210 A -40.470 C -268.439 +G0 X -23.698 Y 1.978 Z 38.203 A -40.274 C -275.118 +G0 X -23.992 Y -0.638 Z 38.065 A -40.463 C -281.797 +G0 X -24.203 Y -3.252 Z 37.797 A -41.032 C -288.375 +G0 X -24.332 Y -5.854 Z 37.399 A -41.964 C -294.757 +G0 X -24.377 Y -8.436 Z 36.873 A -43.236 C -300.873 +G0 X -17.947 Y -4.592 Z 28.905 A -43.236 C -300.873 +G1 X -16.771 Y -3.889 Z 27.448 A -43.236 C -300.873 F 318 +G1 X -18.158 Y -1.442 Z 25.201 A -43.236 C -300.873 F 159 +G1 X -18.323 Y -1.172 Z 24.960 A -43.228 C -300.894 F 159 + +G1 X -18.805 Y -0.344 Z 24.237 A -43.206 C -300.960 F 159 +G1 X -19.187 Y 0.363 Z 23.640 A -43.188 C -301.016 F 159 +G1 X -19.550 Y 1.080 Z 23.052 A -43.171 C -301.071 F 159 +G1 X -19.897 Y 1.811 Z 22.468 A -43.155 C -301.126 F 159 +G1 X -20.227 Y 2.558 Z 21.889 A -43.140 C -301.182 F 159 +G1 X -20.537 Y 3.314 Z 21.315 A -43.125 C -301.237 F 159 +G1 X -20.845 Y 4.119 Z 20.720 A -43.112 C -301.296 F 159 +G1 X -21.211 Y 5.171 Z 19.965 A -43.095 C -301.371 F 159 +G1 X -21.581 Y 6.364 Z 19.135 A -43.079 C -301.454 F 159 +G1 X -21.910 Y 7.576 Z 18.317 A -43.065 C -301.537 F 159 +G1 X -22.107 Y 8.391 Z 17.781 A -43.057 C -301.592 F 159 +G1 X -22.372 Y 9.630 Z 16.985 A -43.046 C -301.674 F 159 +G1 X -22.526 Y 10.465 Z 16.460 A -43.040 C -301.728 F 159 +G1 X -22.736 Y 11.798 Z 15.642 A -43.031 C -301.813 F 159 +G1 X -22.898 Y 13.078 Z 14.875 A -43.025 C -301.893 F 159 +G1 X -23.025 Y 14.365 Z 14.125 A -43.021 C -301.973 F 159 +G1 X -23.115 Y 15.661 Z 13.385 A -43.018 C -302.051 F 159 +G1 X -23.174 Y 16.966 Z 12.658 A -43.017 C -302.129 F 159 +G1 X -23.199 Y 18.279 Z 11.943 A -43.017 C -302.206 F 159 +G1 X -23.191 Y 19.709 Z 11.181 A -43.019 C -302.288 F 159 +G1 X -23.152 Y 21.048 Z 10.485 A -43.023 C -302.364 F 159 +G1 X -23.084 Y 22.387 Z 9.805 A -43.028 C -302.439 F 159 +G1 X -22.988 Y 23.727 Z 9.139 A -43.034 C -302.512 F 159 +G1 X -22.866 Y 25.071 Z 8.487 A -43.041 C -302.585 F 159 +G1 X -22.718 Y 26.422 Z 7.849 A -43.050 C -302.657 F 159 +G1 X -22.545 Y 27.775 Z 7.224 A -43.060 C -302.728 F 159 +G1 X -22.348 Y 29.137 Z 6.613 A -43.071 C -302.798 F 159 +G1 X -21.688 Y 32.871 Z 4.806 A -43.071 C -302.798 F 159 +G1 X -21.641 Y 33.109 Z 4.686 A -43.071 C -302.799 F 636 +G1 X -21.587 Y 33.337 Z 4.560 A -43.071 C -302.799 F 636 +G1 X -21.524 Y 33.555 Z 4.429 A -43.071 C -302.799 F 636 +G1 X -21.454 Y 33.762 Z 4.293 A -43.071 C -302.799 F 636 +G1 X -21.376 Y 33.960 Z 4.151 A -43.071 C -302.800 F 636 +G1 X -21.290 Y 34.148 Z 4.004 A -43.071 C -302.800 F 636 +G1 X -21.197 Y 34.326 Z 3.851 A -43.071 C -302.800 F 636 +G1 X -21.096 Y 34.493 Z 3.694 A -43.071 C -302.800 F 636 +G1 X -20.988 Y 34.651 Z 3.531 A -43.071 C -302.801 F 636 +G1 X -20.872 Y 34.799 Z 3.363 A -43.071 C -302.801 F 636 +G1 X -20.748 Y 34.937 Z 3.189 A -43.071 C -302.801 F 636 +G1 X -20.617 Y 35.065 Z 3.011 A -43.071 C -302.801 F 636 +G1 X -20.478 Y 35.183 Z 2.827 A -43.072 C -302.802 F 636 +G1 X -20.332 Y 35.291 Z 2.638 A -43.072 C -302.802 F 636 +G1 X -20.179 Y 35.390 Z 2.444 A -43.072 C -302.802 F 636 +G1 X -20.018 Y 35.478 Z 2.245 A -43.072 C -302.803 F 636 +G1 X -19.860 Y 35.551 Z 2.053 A -43.072 C -302.803 F 636 +G1 X -19.715 Y 35.604 Z 1.881 A -43.072 C -302.803 F 636 +G1 X -19.583 Y 35.636 Z 1.729 A -43.072 C -302.804 F 636 +G1 X -19.464 Y 35.648 Z 1.597 A -43.072 C -302.804 F 636 +G1 X -19.357 Y 35.640 Z 1.485 A -43.072 C -302.804 F 636 +G1 X -19.264 Y 35.611 Z 1.393 A -43.072 C -302.804 F 636 +G1 X -19.184 Y 35.562 Z 1.321 A -43.072 C -302.805 F 636 +G1 X -19.149 Y 35.530 Z 1.293 A -43.072 C -302.805 F 636 +G1 X -19.117 Y 35.493 Z 1.269 A -43.072 C -302.805 F 636 +G1 X -19.089 Y 35.450 Z 1.251 A -43.072 C -302.805 F 636 +G1 X -19.063 Y 35.403 Z 1.237 A -43.072 C -302.805 F 636 +G1 X -19.023 Y 35.293 Z 1.225 A -43.072 C -302.805 F 636 +G1 X -18.995 Y 35.162 Z 1.234 A -43.072 C -302.805 F 636 +G1 X -18.981 Y 35.012 Z 1.262 A -43.072 C -302.805 F 636 +G1 X -18.980 Y 34.841 Z 1.311 A -43.072 C -302.806 F 636 +G1 X -18.992 Y 34.649 Z 1.379 A -43.072 C -302.806 F 636 +G1 X -19.018 Y 34.438 Z 1.468 A -43.072 C -302.806 F 636 +G1 X -19.056 Y 34.206 Z 1.577 A -43.072 C -302.807 F 636 +G1 X -19.657 Y 31.022 Z 3.146 A -43.072 C -302.807 F 159 +G1 X -19.869 Y 29.663 Z 3.768 A -43.061 C -302.737 F 159 +G1 X -20.060 Y 28.315 Z 4.405 A -43.051 C -302.668 F 159 +G1 X -20.230 Y 26.975 Z 5.056 A -43.042 C -302.597 F 159 +G1 X -20.376 Y 25.634 Z 5.723 A -43.035 C -302.526 F 159 +G1 X -20.499 Y 24.303 Z 6.404 A -43.029 C -302.454 F 159 +G1 X -20.599 Y 22.972 Z 7.102 A -43.024 C -302.382 F 159 +G1 X -20.668 Y 21.711 Z 7.778 A -43.020 C -302.312 F 159 +G1 X -20.715 Y 20.416 Z 8.489 A -43.018 C -302.239 F 159 +G1 X -20.735 Y 19.110 Z 9.222 A -43.017 C -302.165 F 159 +G1 X -20.727 Y 17.817 Z 9.964 A -43.018 C -302.090 F 159 +G1 X -20.687 Y 16.526 Z 10.723 A -43.019 C -302.014 F 159 +G1 X -20.629 Y 15.414 Z 11.390 A -43.022 C -301.947 F 159 +G1 X -20.546 Y 14.310 Z 12.067 A -43.026 C -301.880 F 159 +G1 X -20.422 Y 13.086 Z 12.831 A -43.032 C -301.805 F 159 +G1 X -20.267 Y 11.877 Z 13.605 A -43.040 C -301.729 F 159 +G1 X -20.071 Y 10.638 Z 14.417 A -43.049 C -301.650 F 159 +G1 X -19.837 Y 9.406 Z 15.245 A -43.060 C -301.569 F 159 +G1 X -19.565 Y 8.198 Z 16.077 A -43.073 C -301.489 F 159 +G1 X -19.363 Y 7.401 Z 16.641 A -43.083 C -301.435 F 159 +G1 X -19.025 Y 6.217 Z 17.497 A -43.099 C -301.354 F 159 +G1 X -18.693 Y 5.192 Z 18.259 A -43.115 C -301.282 F 159 +G1 X -18.330 Y 4.188 Z 19.028 A -43.132 C -301.210 F 159 +G1 X -18.033 Y 3.439 Z 19.616 A -43.146 C -301.156 F 159 +G1 X -17.719 Y 2.701 Z 20.210 A -43.162 C -301.101 F 159 +G1 X -17.386 Y 1.975 Z 20.809 A -43.178 C -301.047 F 159 +G1 X -17.032 Y 1.262 Z 21.410 A -43.195 C -300.992 F 159 +G1 X -16.663 Y 0.563 Z 22.020 A -43.213 C -300.938 F 159 +G1 X -16.277 Y -0.117 Z 22.627 A -43.232 C -300.885 F 159 +G1 X -15.673 Y -1.095 Z 23.533 A -43.262 C -300.806 F 159 +G1 X -14.060 Y -3.907 Z 26.203 A -43.262 C -300.806 F 159 +G1 X -15.237 Y -4.609 Z 27.659 A -43.262 C -300.806 F 318 +G0 X -23.148 Y -9.326 Z 37.446 A -43.262 C -300.806 +G0 X -21.546 Y -11.384 Z 37.831 A -41.984 C -306.916 +G0 X -19.871 Y -13.403 Z 38.086 A -41.045 C -313.294 +G0 X -18.127 Y -15.375 Z 38.210 A -40.470 C -319.869 +G0 X -16.321 Y -17.295 Z 38.203 A -40.274 C -326.548 +G0 X -14.459 Y -19.156 Z 38.065 A -40.463 C -333.227 +G0 X -12.548 Y -20.951 Z 37.797 A -41.032 C -339.805 +G0 X -10.593 Y -22.674 Z 37.399 A -41.964 C -346.187 +G0 X -8.603 Y -24.319 Z 36.873 A -43.236 C -352.303 +G0 X -7.599 Y -16.895 Z 28.905 A -43.236 C -352.303 +G1 X -7.416 Y -15.537 Z 27.448 A -43.236 C -352.303 F 318 +G1 X -10.194 Y -15.096 Z 25.201 A -43.236 C -352.303 F 159 +G1 X -10.507 Y -15.056 Z 24.960 A -43.228 C -352.324 F 159 +G1 X -11.455 Y -14.917 Z 24.237 A -43.206 C -352.390 F 159 +G1 X -12.246 Y -14.775 Z 23.640 A -43.188 C -352.446 F 159 +G1 X -13.033 Y -14.612 Z 23.052 A -43.171 C -352.501 F 159 +G1 X -13.821 Y -14.427 Z 22.468 A -43.155 C -352.556 F 159 +G1 X -14.611 Y -14.220 Z 21.889 A -43.140 C -352.612 F 159 +G1 X -15.395 Y -13.990 Z 21.315 A -43.125 C -352.667 F 159 +G1 X -16.216 Y -13.729 Z 20.720 A -43.112 C -352.726 F 159 +G1 X -17.267 Y -13.360 Z 19.965 A -43.095 C -352.801 F 159 +G1 X -18.430 Y -12.905 Z 19.135 A -43.079 C -352.884 F 159 +G1 X -19.584 Y -12.407 Z 18.317 A -43.065 C -352.967 F 159 +G1 X -20.344 Y -12.053 Z 17.781 A -43.057 C -353.022 F 159 +G1 X -21.477 Y -11.487 Z 16.985 A -43.046 C -353.104 F 159 +G1 X -22.226 Y -11.087 Z 16.460 A -43.040 C -353.158 F 159 +G1 X -23.400 Y -10.420 Z 15.642 A -43.031 C -353.243 F 159 +G1 X -24.501 Y -9.749 Z 14.875 A -43.025 C -353.324 F 159 +G1 X -25.586 Y -9.046 Z 14.125 A -43.021 C -353.403 F 159 +G1 X -26.656 Y -8.308 Z 13.385 A -43.018 C -353.481 F 159 +G1 X -27.712 Y -7.541 Z 12.658 A -43.017 C -353.559 F 159 +G1 X -28.755 Y -6.742 Z 11.943 A -43.017 C -353.636 F 159 +G1 X -29.869 Y -5.844 Z 11.181 A -43.019 C -353.718 F 159 +G1 X -30.891 Y -4.979 Z 10.485 A -43.023 C -353.794 F 159 +G1 X -31.895 Y -4.091 Z 9.805 A -43.028 C -353.869 F 159 +G1 X -32.883 Y -3.180 Z 9.139 A -43.034 C -353.942 F 159 +G1 X -33.858 Y -2.247 Z 8.487 A -43.041 C -354.015 F 159 +G1 X -34.822 Y -1.289 Z 7.849 A -43.050 C -354.087 F 159 +G1 X -35.772 Y -0.310 Z 7.224 A -43.060 C -354.158 F 159 +G1 X -36.714 Y 0.693 Z 6.613 A -43.071 C -354.228 F 159 +G1 X -39.222 Y 3.537 Z 4.806 A -43.071 C -354.228 F 159 +G1 X -39.379 Y 3.722 Z 4.686 A -43.071 C -354.229 F 636 +G1 X -39.523 Y 3.907 Z 4.560 A -43.071 C -354.229 F 636 +G1 X -39.654 Y 4.092 Z 4.429 A -43.071 C -354.229 F 636 +G1 X -39.773 Y 4.276 Z 4.293 A -43.071 C -354.229 F 636 +G1 X -39.879 Y 4.460 Z 4.151 A -43.071 C -354.230 F 636 +G1 X -39.972 Y 4.644 Z 4.004 A -43.071 C -354.230 F 636 +G1 X -40.053 Y 4.828 Z 3.851 A -43.071 C -354.230 F 636 +G1 X -40.121 Y 5.012 Z 3.694 A -43.071 C -354.230 F 636 +G1 X -40.177 Y 5.195 Z 3.531 A -43.071 C -354.231 F 636 +G1 X -40.220 Y 5.378 Z 3.363 A -43.071 C -354.231 F 636 +G1 X -40.251 Y 5.560 Z 3.189 A -43.071 C -354.231 F 636 +G1 X -40.270 Y 5.743 Z 3.011 A -43.071 C -354.231 F 636 +G1 X -40.275 Y 5.925 Z 2.827 A -43.071 C -354.232 F 636 +G1 X -40.269 Y 6.106 Z 2.638 A -43.072 C -354.232 F 636 +G1 X -40.250 Y 6.287 Z 2.444 A -43.072 C -354.232 F 636 +G1 X -40.219 Y 6.468 Z 2.245 A -43.072 C -354.233 F 636 +G1 X -40.178 Y 6.638 Z 2.053 A -43.072 C -354.233 F 636 +G1 X -40.129 Y 6.784 Z 1.881 A -43.072 C -354.233 F 636 +G1 X -40.072 Y 6.907 Z 1.729 A -43.072 C -354.234 F 636 +G1 X -40.007 Y 7.008 Z 1.597 A -43.072 C -354.234 F 636 +G1 X -39.934 Y 7.086 Z 1.485 A -43.072 C -354.234 F 636 +G1 X -39.853 Y 7.141 Z 1.393 A -43.072 C -354.234 F 636 +G1 X -39.765 Y 7.173 Z 1.321 A -43.072 C -354.235 F 636 +G1 X -39.718 Y 7.180 Z 1.293 A -43.072 C -354.235 F 636 +G1 X -39.669 Y 7.182 Z 1.269 A -43.072 C -354.235 F 636 +G1 X -39.618 Y 7.178 Z 1.251 A -43.072 C -354.235 F 636 +G1 X -39.565 Y 7.168 Z 1.237 A -43.072 C -354.235 F 636 +G1 X -39.454 Y 7.131 Z 1.225 A -43.072 C -354.235 F 636 +G1 X -39.334 Y 7.071 Z 1.234 A -43.072 C -354.235 F 636 +G1 X -39.208 Y 6.989 Z 1.262 A -43.072 C -354.235 F 636 +G1 X -39.073 Y 6.883 Z 1.311 A -43.072 C -354.236 F 636 +G1 X -38.932 Y 6.754 Z 1.379 A -43.072 C -354.236 F 636 +G1 X -38.782 Y 6.602 Z 1.468 A -43.072 C -354.236 F 636 +G1 X -38.625 Y 6.427 Z 1.577 A -43.072 C -354.237 F 636 +G1 X -36.510 Y 3.973 Z 3.146 A -43.072 C -354.237 F 159 +G1 X -35.579 Y 2.959 Z 3.768 A -43.061 C -354.167 F 159 +G1 X -34.645 Y 1.970 Z 4.405 A -43.051 C -354.098 F 159 +G1 X -33.703 Y 1.001 Z 5.056 A -43.042 C -354.027 F 159 +G1 X -32.746 Y 0.051 Z 5.723 A -43.035 C -353.956 F 159 +G1 X -31.782 Y -0.875 Z 6.404 A -43.029 C -353.884 F 159 +G1 X -30.803 Y -1.783 Z 7.102 A -43.024 C -353.812 F 159 +G1 X -29.860 Y -2.623 Z 7.778 A -43.020 C -353.742 F 159 +G1 X -28.877 Y -3.468 Z 8.489 A -43.018 C -353.669 F 159 +G1 X -27.869 Y -4.297 Z 9.222 A -43.017 C -353.595 F 159 +G1 X -26.853 Y -5.096 Z 9.964 A -43.018 C -353.520 F 159 +G1 X -25.819 Y -5.871 Z 10.723 A -43.019 C -353.444 F 159 +G1 X -24.913 Y -6.518 Z 11.390 A -43.022 C -353.377 F 159 +G1 X -23.998 Y -7.142 Z 12.067 A -43.026 C -353.310 F 159 +G1 X -22.964 Y -7.808 Z 12.831 A -43.032 C -353.235 F 159 +G1 X -21.922 Y -8.441 Z 13.605 A -43.040 C -353.159 F 159 +G1 X -20.831 Y -9.060 Z 14.417 A -43.049 C -353.080 F 159 +G1 X -19.722 Y -9.645 Z 15.245 A -43.060 C -352.999 F 159 +G1 X -18.608 Y -10.186 Z 16.077 A -43.073 C -352.919 F 159 +G1 X -17.859 Y -10.525 Z 16.641 A -43.083 C -352.865 F 159 +G1 X -16.722 Y -10.998 Z 17.497 A -43.099 C -352.784 F 159 +G1 X -15.714 Y -11.377 Z 18.259 A -43.115 C -352.712 F 159 +G1 X -14.702 Y -11.720 Z 19.028 A -43.132 C -352.640 F 159 +G1 X -13.932 Y -11.955 Z 19.616 A -43.146 C -352.586 F 159 +G1 X -13.160 Y -12.169 Z 20.210 A -43.162 C -352.531 F 159 +G1 X -12.384 Y -12.362 Z 20.809 A -43.178 C -352.477 F 159 +G1 X -11.606 Y -12.529 Z 21.410 A -43.195 C -352.422 F 159 +G1 X -10.829 Y -12.678 Z 22.020 A -43.213 C -352.368 F 159 +G1 X -10.057 Y -12.799 Z 22.627 A -43.232 C -352.315 F 159 +G1 X -8.916 Y -12.937 Z 23.533 A -43.262 C -352.236 F 159 +G1 X -5.711 Y -13.429 Z 26.203 A -43.262 C -352.236 F 159 +G1 X -5.896 Y -14.787 Z 27.659 A -43.262 C -352.236 F 318 +G0 X -7.140 Y -23.913 Z 37.446 A -43.262 C -352.236 +( --- Operation 3 ) +G0 X -0.023 Y -41.436 Z 17.550 A -46.785 C -89.392 +G0 X -0.021 Y -37.057 Z 15.695 A -46.785 C -89.392 +G0 X -13.138 Y -36.917 Z 3.370 A -46.785 C -89.392 +G1 X -14.596 Y -36.902 Z 2.001 A -46.785 C -89.392 F 318 +G1 X -11.756 Y -34.467 Z 3.910 A -46.785 C -89.392 F 159 +G1 X -10.723 Y -33.651 Z 4.625 A -46.795 C -89.459 F 159 +G1 X -9.693 Y -32.827 Z 5.368 A -46.805 C -89.527 F 159 +G1 X -8.685 Y -32.010 Z 6.121 A -46.813 C -89.594 F 159 +G1 X -7.694 Y -31.195 Z 6.890 A -46.820 C -89.660 F 159 +G1 X -6.715 Y -30.384 Z 7.676 A -46.825 C -89.726 F 159 +G1 X -5.861 Y -29.664 Z 8.385 A -46.829 C -89.785 F 159 +G1 X -4.698 Y -28.665 Z 9.383 A -46.833 C -89.866 F 159 +G1 X -3.758 Y -27.837 Z 10.221 A -46.835 C -89.933 F 159 +G1 X -2.843 Y -27.014 Z 11.065 A -46.835 C -89.999 F 159 +G1 X -1.946 Y -26.189 Z 11.920 A -46.835 C -90.065 F 159 +G1 X -1.063 Y -25.350 Z 12.791 A -46.833 C -90.132 F 159 +G1 X -0.203 Y -24.509 Z 13.671 A -46.830 C -90.200 F 159 +G1 X 0.637 Y -23.653 Z 14.564 A -46.826 C -90.268 F 159 +G1 X 1.487 Y -22.753 Z 15.505 A -46.820 C -90.340 F 159 +G1 X 2.246 Y -21.915 Z 16.382 A -46.813 C -90.406 F 159 +G1 X 2.761 Y -21.325 Z 16.998 A -46.807 C -90.453 F 159 +G1 X 3.511 Y -20.424 Z 17.936 A -46.798 C -90.524 F 159 +G1 X 3.992 Y -19.821 Z 18.562 A -46.791 C -90.572 F 159 +G1 X 4.684 Y -18.907 Z 19.509 A -46.779 C -90.644 F 159 +G1 X 5.347 Y -17.972 Z 20.474 A -46.765 C -90.718 F 159 +G1 X 5.825 Y -17.257 Z 21.212 A -46.753 C -90.774 F 159 +G1 X 6.278 Y -16.537 Z 21.952 A -46.740 C -90.831 F 159 +G1 X 6.659 Y -15.898 Z 22.610 A -46.728 C -90.881 F 159 +G1 X 7.020 Y -15.252 Z 23.273 A -46.715 C -90.932 F 159 +G1 X 7.365 Y -14.605 Z 23.942 A -46.700 C -90.983 F 159 +G1 X 7.688 Y -13.953 Z 24.614 A -46.686 C -91.034 F 159 +G1 X 7.987 Y -13.297 Z 25.289 A -46.670 C -91.086 F 159 +G1 X 8.264 Y -12.634 Z 25.970 A -46.652 C -91.138 F 159 +G1 X 8.528 Y -11.909 Z 26.706 A -46.633 C -91.195 F 159 +G1 X 8.654 Y -11.520 Z 27.099 A -46.622 C -91.225 F 159 +G1 X 9.562 Y -8.114 Z 30.357 A -46.622 C -91.225 F 159 +G1 X 11.015 Y -8.083 Z 31.731 A -46.622 C -91.225 F 318 +G0 X 19.520 Y -7.901 Z 39.769 A -46.622 C -91.225 +G0 X 20.698 Y -9.246 Z 38.873 A -45.997 C -94.174 +G0 X 21.836 Y -10.572 Z 37.900 A -45.450 C -97.182 +G0 X 22.930 Y -11.877 Z 36.853 A -44.983 C -100.243 +G0 X 23.979 Y -13.159 Z 35.733 A -44.600 C -103.349 +G0 X 24.981 Y -14.415 Z 34.542 A -44.301 C -106.493 +G0 X 25.933 Y -15.643 Z 33.283 A -44.090 C -109.666 +G0 X 26.834 Y -16.839 Z 31.959 A -43.967 C -112.858 +G0 X 27.682 Y -18.003 Z 30.571 A -43.933 C -116.059 +G0 X 28.476 Y -19.131 Z 29.123 A -43.989 C -119.259 +G0 X 29.213 Y -20.221 Z 27.618 A -44.133 C -122.447 +G0 X 29.893 Y -21.271 Z 26.058 A -44.366 C -125.614 +G0 X 30.513 Y -22.279 Z 24.446 A -44.685 C -128.749 +G0 X 31.073 Y -23.243 Z 22.786 A -45.089 C -131.845 +G0 X 31.572 Y -24.161 Z 21.081 A -45.576 C -134.894 +G0 X 32.009 Y -25.032 Z 19.335 A -46.142 C -137.888 +G0 X 32.382 Y -25.853 Z 17.550 A -46.785 C -140.822 +G0 X 28.960 Y -23.120 Z 15.695 A -46.785 C -140.822 +G0 X 20.672 Y -33.289 Z 3.370 A -46.785 C -140.822 +G1 X 19.752 Y -34.419 Z 2.001 A -46.785 C -140.822 F 318 +G1 X 19.619 Y -30.681 Z 3.910 A -46.785 C -140.822 F 159 +G1 X 19.624 Y -29.364 Z 4.625 A -46.795 C -140.889 F 159 +G1 X 19.622 Y -28.045 Z 5.368 A -46.805 C -140.957 F 159 +G1 X 19.612 Y -26.747 Z 6.121 A -46.813 C -141.024 F 159 +G1 X 19.593 Y -25.465 Z 6.890 A -46.820 C -141.090 F 159 +G1 X 19.569 Y -24.193 Z 7.676 A -46.825 C -141.156 F 159 +G1 X 19.539 Y -23.077 Z 8.385 A -46.829 C -141.215 F 159 +G1 X 19.482 Y -21.545 Z 9.383 A -46.833 C -141.296 F 159 +G1 X 19.421 Y -20.293 Z 10.221 A -46.835 C -141.363 F 159 +G1 X 19.349 Y -19.065 Z 11.065 A -46.835 C -141.429 F 159 +G1 X 19.263 Y -17.849 Z 11.920 A -46.835 C -141.495 F 159 +G1 X 19.157 Y -16.636 Z 12.791 A -46.833 C -141.562 F 159 +G1 X 19.036 Y -15.439 Z 13.671 A -46.830 C -141.630 F 159 +G1 X 18.891 Y -14.249 Z 14.564 A -46.826 C -141.698 F 159 +G1 X 18.717 Y -13.023 Z 15.505 A -46.820 C -141.770 F 159 +G1 X 18.534 Y -11.907 Z 16.382 A -46.813 C -141.836 F 159 +G1 X 18.394 Y -11.137 Z 16.998 A -46.807 C -141.883 F 159 +G1 X 18.158 Y -9.988 Z 17.936 A -46.798 C -141.954 F 159 +G1 X 17.986 Y -9.237 Z 18.562 A -46.791 C -142.002 F 159 +G1 X 17.703 Y -8.126 Z 19.509 A -46.779 C -142.074 F 159 +G1 X 17.385 Y -7.025 Z 20.474 A -46.765 C -142.148 F 159 +G1 X 17.124 Y -6.205 Z 21.212 A -46.753 C -142.204 F 159 +G1 X 16.844 Y -5.402 Z 21.952 A -46.740 C -142.261 F 159 +G1 X 16.582 Y -4.706 Z 22.610 A -46.728 C -142.311 F 159 +G1 X 16.302 Y -4.021 Z 23.273 A -46.715 C -142.362 F 159 +G1 X 16.010 Y -3.347 Z 23.942 A -46.700 C -142.413 F 159 +G1 X 15.702 Y -2.689 Z 24.614 A -46.686 C -142.464 F 159 +G1 X 15.376 Y -2.046 Z 25.289 A -46.670 C -142.516 F 159 +G1 X 15.030 Y -1.416 Z 25.970 A -46.652 C -142.568 F 159 +G1 X 14.628 Y -0.758 Z 26.706 A -46.633 C -142.625 F 159 +G1 X 14.403 Y -0.417 Z 27.099 A -46.622 C -142.655 F 159 +G1 X 12.306 Y 2.417 Z 30.357 A -46.622 C -142.655 F 159 +G1 X 13.188 Y 3.573 Z 31.731 A -46.622 C -142.655 F 318 +G0 X 18.348 Y 10.335 Z 39.769 A -46.622 C -142.655 +G0 X 20.134 Y 10.418 Z 38.873 A -45.997 C -145.604 +G0 X 21.880 Y 10.481 Z 37.900 A -45.450 C -148.612 +G0 X 23.582 Y 10.522 Z 36.853 A -44.983 C -151.673 +G0 X 25.239 Y 10.543 Z 35.733 A -44.600 C -154.779 +G0 X 26.845 Y 10.543 Z 34.542 A -44.301 C -157.923 +G0 X 28.399 Y 10.523 Z 33.283 A -44.090 C -161.096 +G0 X 29.896 Y 10.481 Z 31.959 A -43.967 C -164.288 +G0 X 31.334 Y 10.419 Z 30.571 A -43.933 C -167.489 +G0 X 32.711 Y 10.336 Z 29.123 A -43.989 C -170.689 +G0 X 34.023 Y 10.233 Z 27.618 A -44.133 C -173.877 +G0 X 35.268 Y 10.110 Z 26.058 A -44.366 C -177.044 +G0 X 36.443 Y 9.966 Z 24.446 A -44.685 C -180.180 +G0 X 37.546 Y 9.803 Z 22.786 A -45.089 C -183.275 +G0 X 38.575 Y 9.621 Z 21.081 A -45.576 C -186.324 +G0 X 39.528 Y 9.420 Z 19.335 A -46.142 C -189.318 +G0 X 40.402 Y 9.200 Z 17.550 A -46.785 C -192.252 +G0 X 36.132 Y 8.227 Z 15.695 A -46.785 C -192.252 +G0 X 38.916 Y -4.592 Z 3.370 A -46.785 C -192.252 +G1 X 39.225 Y -6.016 Z 2.001 A -46.785 C -192.252 F 318 +G1 X 36.219 Y -3.789 Z 3.910 A -46.785 C -192.252 F 159 +G1 X 35.194 Y -2.965 Z 4.625 A -46.795 C -192.319 F 159 +G1 X 34.161 Y -2.144 Z 5.368 A -46.805 C -192.387 F 159 +G1 X 33.140 Y -1.343 Z 6.121 A -46.813 C -192.454 F 159 +G1 X 32.125 Y -0.558 Z 6.890 A -46.820 C -192.520 F 159 +G1 X 31.116 Y 0.216 Z 7.676 A -46.825 C -192.586 F 159 +G1 X 30.224 Y 0.889 Z 8.385 A -46.829 C -192.645 F 159 +G1 X 28.992 Y 1.799 Z 9.383 A -46.833 C -192.726 F 159 +G1 X 27.975 Y 2.532 Z 10.221 A -46.835 C -192.793 F 159 +G1 X 26.969 Y 3.241 Z 11.065 A -46.835 C -192.859 F 159 +G1 X 25.965 Y 3.932 Z 11.920 A -46.835 C -192.925 F 159 +G1 X 24.951 Y 4.606 Z 12.791 A -46.833 C -192.992 F 159 +G1 X 23.939 Y 5.257 Z 13.671 A -46.830 C -193.060 F 159 +G1 X 22.918 Y 5.886 Z 14.564 A -46.826 C -193.128 F 159 +G1 X 21.851 Y 6.514 Z 15.505 A -46.820 C -193.200 F 159 +G1 X 20.865 Y 7.067 Z 16.382 A -46.813 C -193.266 F 159 +G1 X 20.176 Y 7.438 Z 16.998 A -46.807 C -193.313 F 159 +G1 X 19.130 Y 7.969 Z 17.936 A -46.798 C -193.384 F 159 +G1 X 18.436 Y 8.303 Z 18.562 A -46.791 C -193.432 F 159 +G1 X 17.390 Y 8.775 Z 19.509 A -46.779 C -193.504 F 159 +G1 X 16.332 Y 9.213 Z 20.474 A -46.765 C -193.578 F 159 +G1 X 15.527 Y 9.520 Z 21.212 A -46.753 C -193.634 F 159 +G1 X 14.725 Y 9.802 Z 21.952 A -46.740 C -193.691 F 159 +G1 X 14.017 Y 10.030 Z 22.610 A -46.728 C -193.741 F 159 +G1 X 13.307 Y 10.239 Z 23.273 A -46.715 C -193.792 F 159 +G1 X 12.599 Y 10.431 Z 23.942 A -46.701 C -193.843 F 159 +G1 X 11.892 Y 10.600 Z 24.614 A -46.686 C -193.894 F 159 +G1 X 11.186 Y 10.747 Z 25.289 A -46.670 C -193.946 F 159 +G1 X 10.478 Y 10.868 Z 25.970 A -46.652 C -193.998 F 159 +G1 X 9.713 Y 10.964 Z 26.706 A -46.633 C -194.055 F 159 +G1 X 9.305 Y 11.001 Z 27.099 A -46.622 C -194.085 F 159 +G1 X 5.783 Y 11.128 Z 30.357 A -46.622 C -194.085 F 159 +G1 X 5.429 Y 12.538 Z 31.731 A -46.622 C -194.085 F 318 +G0 X 3.359 Y 20.789 Z 39.769 A -46.622 C -194.085 +G0 X 4.407 Y 22.237 Z 38.873 A -45.997 C -197.034 +G0 X 5.447 Y 23.641 Z 37.900 A -45.450 C -200.042 +G0 X 6.476 Y 24.998 Z 36.853 A -44.983 C -203.103 +G0 X 7.492 Y 26.306 Z 35.733 A -44.600 C -206.209 +G0 X 8.494 Y 27.562 Z 34.542 A -44.301 C -209.353 +G0 X 9.479 Y 28.764 Z 33.283 A -44.090 C -212.526 +G0 X 10.445 Y 29.909 Z 31.959 A -43.967 C -215.718 +G0 X 11.390 Y 30.995 Z 30.571 A -43.933 C -218.919 +G0 X 12.313 Y 32.019 Z 29.123 A -43.989 C -222.119 +G0 X 13.211 Y 32.981 Z 27.618 A -44.133 C -225.307 +G0 X 14.084 Y 33.877 Z 26.058 A -44.366 C -228.474 +G0 X 14.929 Y 34.706 Z 24.446 A -44.685 C -231.609 +G0 X 15.744 Y 35.467 Z 22.786 A -45.089 C -234.705 +G0 X 16.528 Y 36.158 Z 21.081 A -45.576 C -237.754 +G0 X 17.280 Y 36.777 Z 19.335 A -46.142 C -240.748 +G0 X 17.997 Y 37.324 Z 17.550 A -46.785 C -243.682 +G0 X 16.095 Y 33.379 Z 15.695 A -46.785 C -243.682 +G0 X 27.853 Y 27.563 Z 3.370 A -46.785 C -243.682 +G1 X 29.160 Y 26.917 Z 2.001 A -46.785 C -243.682 F 318 +G1 X 25.544 Y 25.955 Z 3.910 A -46.785 C -243.682 F 159 +G1 X 24.260 Y 25.668 Z 4.625 A -46.795 C -243.749 F 159 +G1 X 22.974 Y 25.372 Z 5.368 A -46.805 C -243.817 F 159 +G1 X 21.711 Y 25.073 Z 6.121 A -46.813 C -243.884 F 159 +G1 X 20.465 Y 24.769 Z 6.890 A -46.820 C -243.950 F 159 +G1 X 19.231 Y 24.463 Z 7.676 A -46.825 C -244.016 F 159 +G1 X 18.149 Y 24.185 Z 8.385 A -46.829 C -244.075 F 159 +G1 X 16.669 Y 23.789 Z 9.383 A -46.833 C -244.156 F 159 +G1 X 15.462 Y 23.451 Z 10.221 A -46.835 C -244.223 F 159 +G1 X 14.280 Y 23.107 Z 11.065 A -46.835 C -244.289 F 159 + +G1 X 13.115 Y 22.752 Z 11.920 A -46.835 C -244.355 F 159 +G1 X 11.955 Y 22.380 Z 12.791 A -46.833 C -244.422 F 159 +G1 X 10.815 Y 21.995 Z 13.671 A -46.830 C -244.490 F 159 +G1 X 9.687 Y 21.588 Z 14.564 A -46.826 C -244.558 F 159 +G1 X 8.531 Y 21.146 Z 15.505 A -46.820 C -244.630 F 159 +G1 X 7.483 Y 20.719 Z 16.382 A -46.813 C -244.696 F 159 +G1 X 6.764 Y 20.412 Z 16.998 A -46.807 C -244.743 F 159 +G1 X 5.696 Y 19.925 Z 17.936 A -46.798 C -244.814 F 159 +G1 X 5.002 Y 19.591 Z 18.562 A -46.791 C -244.862 F 159 +G1 X 3.982 Y 19.067 Z 19.509 A -46.779 C -244.934 F 159 +G1 X 2.979 Y 18.513 Z 20.474 A -46.765 C -245.008 F 159 +G1 X 2.238 Y 18.075 Z 21.212 A -46.753 C -245.064 F 159 +G1 X 1.517 Y 17.624 Z 21.952 A -46.740 C -245.121 F 159 +G1 X 0.897 Y 17.213 Z 22.610 A -46.728 C -245.171 F 159 +G1 X 0.292 Y 16.788 Z 23.273 A -46.715 C -245.222 F 159 +G1 X -0.300 Y 16.354 Z 23.942 A -46.701 C -245.273 F 159 +G1 X -0.873 Y 15.907 Z 24.614 A -46.686 C -245.324 F 159 +G1 X -1.428 Y 15.446 Z 25.289 A -46.670 C -245.376 F 159 +G1 X -1.965 Y 14.968 Z 25.970 A -46.652 C -245.428 F 159 +G1 X -2.517 Y 14.430 Z 26.706 A -46.633 C -245.485 F 159 +G1 X -2.800 Y 14.134 Z 27.099 A -46.622 C -245.515 F 159 +G1 X -5.095 Y 11.459 Z 30.357 A -46.622 C -245.515 F 159 +G1 X -6.418 Y 12.062 Z 31.731 A -46.622 C -245.515 F 318 +G0 X -14.160 Y 15.587 Z 39.769 A -46.622 C -245.515 +G0 X -14.638 Y 17.310 Z 38.873 A -45.997 C -248.464 +G0 X -15.088 Y 18.998 Z 37.900 A -45.450 C -251.472 +G0 X -15.507 Y 20.649 Z 36.853 A -44.983 C -254.533 +G0 X -15.896 Y 22.259 Z 35.733 A -44.600 C -257.639 +G0 X -16.254 Y 23.825 Z 34.542 A -44.301 C -260.783 +G0 X -16.579 Y 25.344 Z 33.283 A -44.090 C -263.956 +G0 X -16.872 Y 26.813 Z 31.959 A -43.967 C -267.148 +G0 X -17.132 Y 28.229 Z 30.571 A -43.933 C -270.349 +G0 X -17.357 Y 29.590 Z 29.123 A -43.989 C -273.549 +G0 X -17.549 Y 30.892 Z 27.618 A -44.133 C -276.737 +G0 X -17.706 Y 32.133 Z 26.058 A -44.366 C -279.904 +G0 X -17.827 Y 33.310 Z 24.446 A -44.685 C -283.040 +G0 X -17.914 Y 34.422 Z 22.786 A -45.089 C -286.135 +G0 X -17.965 Y 35.466 Z 21.081 A -45.576 C -289.184 +G0 X -17.981 Y 36.440 Z 19.335 A -46.142 C -292.178 +G0 X -17.961 Y 37.341 Z 17.550 A -46.785 C -295.112 +G0 X -16.063 Y 33.394 Z 15.695 A -46.785 C -295.112 +G0 X -4.185 Y 38.962 Z 3.370 A -46.785 C -295.112 +G1 X -2.865 Y 39.580 Z 2.001 A -46.785 C -295.112 F 318 +G1 X -4.367 Y 36.154 Z 3.910 A -46.785 C -295.112 F 159 +G1 X -4.943 Y 34.971 Z 4.625 A -46.795 C -295.179 F 159 +G1 X -5.513 Y 33.781 Z 5.368 A -46.805 C -295.247 F 159 +G1 X -6.067 Y 32.607 Z 6.121 A -46.813 C -295.314 F 159 +G1 X -6.607 Y 31.443 Z 6.890 A -46.820 C -295.380 F 159 +G1 X -7.136 Y 30.288 Z 7.676 A -46.825 C -295.446 F 159 +G1 X -7.593 Y 29.268 Z 8.385 A -46.829 C -295.505 F 159 +G1 X -8.207 Y 27.864 Z 9.383 A -46.833 C -295.586 F 159 +G1 X -8.695 Y 26.710 Z 10.221 A -46.835 C -295.653 F 159 +G1 X -9.163 Y 25.571 Z 11.065 A -46.835 C -295.719 F 159 +G1 X -9.612 Y 24.439 Z 11.920 A -46.835 C -295.785 F 159 +G1 X -10.044 Y 23.300 Z 12.791 A -46.833 C -295.852 F 159 +G1 X -10.454 Y 22.169 Z 13.671 A -46.830 C -295.920 F 159 +G1 X -10.839 Y 21.033 Z 14.564 A -46.826 C -295.988 F 159 +G1 X -11.214 Y 19.853 Z 15.505 A -46.820 C -296.060 F 159 +G1 X -11.534 Y 18.769 Z 16.382 A -46.813 C -296.126 F 159 +G1 X -11.742 Y 18.014 Z 16.998 A -46.807 C -296.173 F 159 +G1 X -12.027 Y 16.876 Z 17.936 A -46.798 C -296.244 F 159 +G1 X -12.198 Y 16.125 Z 18.562 A -46.791 C -296.292 F 159 +G1 X -12.425 Y 15.001 Z 19.509 A -46.779 C -296.364 F 159 +G1 X -12.617 Y 13.871 Z 20.474 A -46.765 C -296.438 F 159 +G1 X -12.737 Y 13.019 Z 21.212 A -46.753 C -296.494 F 159 +G1 X -12.833 Y 12.174 Z 21.952 A -46.740 C -296.551 F 159 +G1 X -12.899 Y 11.433 Z 22.610 A -46.728 C -296.601 F 159 +G1 X -12.944 Y 10.695 Z 23.273 A -46.715 C -296.652 F 159 +G1 X -12.973 Y 9.962 Z 23.942 A -46.701 C -296.703 F 159 +G1 X -12.981 Y 9.235 Z 24.614 A -46.686 C -296.754 F 159 +G1 X -12.967 Y 8.514 Z 25.289 A -46.670 C -296.806 F 159 +G1 X -12.927 Y 7.796 Z 25.970 A -46.652 C -296.858 F 159 +G1 X -12.851 Y 7.029 Z 26.706 A -46.633 C -296.915 F 159 +G1 X -12.796 Y 6.623 Z 27.099 A -46.622 C -296.945 F 159 +G1 X -12.136 Y 3.161 Z 30.357 A -46.622 C -296.945 F 159 +G1 X -13.432 Y 2.502 Z 31.731 A -46.622 C -296.945 F 318 +G0 X -21.015 Y -1.353 Z 39.769 A -46.622 C -296.945 +G0 X -22.660 Y -0.653 Z 38.873 A -45.997 C -299.894 +G0 X -24.260 Y 0.049 Z 37.900 A -45.450 C -302.902 +G0 X -25.813 Y 0.750 Z 36.853 A -44.983 C -305.963 +G0 X -27.314 Y 1.449 Z 35.733 A -44.600 C -309.069 +G0 X -28.762 Y 2.146 Z 34.542 A -44.301 C -312.213 +G0 X -30.152 Y 2.839 Z 33.283 A -44.090 C -315.386 +G0 X -31.483 Y 3.526 Z 31.959 A -43.967 C -318.578 +G0 X -32.752 Y 4.206 Z 30.571 A -43.933 C -321.779 +G0 X -33.957 Y 4.877 Z 29.123 A -43.988 C -324.979 +G0 X -35.094 Y 5.540 Z 27.618 A -44.133 C -328.167 +G0 X -36.162 Y 6.191 Z 26.058 A -44.366 C -331.334 +G0 X -37.158 Y 6.830 Z 24.446 A -44.685 C -334.470 +G0 X -38.082 Y 7.455 Z 22.786 A -45.089 C -337.565 +G0 X -38.930 Y 8.066 Z 21.081 A -45.576 C -340.614 +G0 X -39.701 Y 8.661 Z 19.335 A -46.142 C -343.608 +G0 X -40.394 Y 9.238 Z 17.550 A -46.785 C -346.542 +G0 X -36.124 Y 8.262 Z 15.695 A -46.785 C -346.542 +G0 X -33.071 Y 21.020 Z 3.370 A -46.785 C -346.542 +G1 X -32.732 Y 22.437 Z 2.001 A -46.785 C -346.542 F 318 +G1 X -30.990 Y 19.127 Z 3.910 A -46.785 C -346.542 F 159 +G1 X -30.424 Y 17.939 Z 4.625 A -46.795 C -346.609 F 159 +G1 X -29.849 Y 16.751 Z 5.368 A -46.805 C -346.677 F 159 +G1 X -29.276 Y 15.586 Z 6.121 A -46.813 C -346.744 F 159 +G1 X -28.703 Y 14.439 Z 6.890 A -46.820 C -346.810 F 159 +G1 X -28.130 Y 13.304 Z 7.676 A -46.825 C -346.876 F 159 +G1 X -27.617 Y 12.311 Z 8.385 A -46.829 C -346.935 F 159 +G1 X -26.902 Y 10.956 Z 9.383 A -46.833 C -347.016 F 159 +G1 X -26.304 Y 9.855 Z 10.221 A -46.835 C -347.083 F 159 +G1 X -25.706 Y 8.779 Z 11.065 A -46.835 C -347.149 F 159 +G1 X -25.100 Y 7.722 Z 11.920 A -46.835 C -347.215 F 159 +G1 X -24.479 Y 6.674 Z 12.791 A -46.833 C -347.282 F 159 +G1 X -23.850 Y 5.648 Z 13.671 A -46.830 C -347.350 F 159 +G1 X -23.203 Y 4.639 Z 14.564 A -46.826 C -347.418 F 159 +G1 X -22.514 Y 3.610 Z 15.505 A -46.820 C -347.490 F 159 +G1 X -21.865 Y 2.684 Z 16.382 A -46.813 C -347.556 F 159 +G1 X -21.405 Y 2.051 Z 16.998 A -46.807 C -347.603 F 159 +G1 X -20.693 Y 1.119 Z 17.936 A -46.798 C -347.674 F 159 +G1 X -20.213 Y 0.517 Z 18.562 A -46.791 C -347.722 F 159 +G1 X -19.475 Y -0.362 Z 19.509 A -46.779 C -347.794 F 159 +G1 X -18.711 Y -1.216 Z 20.474 A -46.765 C -347.868 F 159 +G1 X -18.120 Y -1.841 Z 21.212 A -46.753 C -347.924 F 159 +G1 X -17.519 Y -2.443 Z 21.952 A -46.740 C -347.981 F 159 +G1 X -16.981 Y -2.956 Z 22.610 A -46.728 C -348.031 F 159 +G1 X -16.432 Y -3.452 Z 23.273 A -46.715 C -348.082 F 159 +G1 X -15.877 Y -3.932 Z 23.942 A -46.700 C -348.133 F 159 +G1 X -15.314 Y -4.392 Z 24.614 A -46.686 C -348.184 F 159 +G1 X -14.741 Y -4.830 Z 25.289 A -46.670 C -348.236 F 159 +G1 X -14.155 Y -5.247 Z 25.970 A -46.652 C -348.288 F 159 +G1 X -13.508 Y -5.665 Z 26.706 A -46.633 C -348.345 F 159 +G1 X -13.157 Y -5.875 Z 27.099 A -46.622 C -348.375 F 159 +G1 X -10.038 Y -7.518 Z 30.357 A -46.622 C -348.375 F 159 +G1 X -10.331 Y -8.942 Z 31.731 A -46.621 C -348.375 F 318 +G0 X -12.045 Y -17.274 Z 39.769 A -46.622 C -348.375 +G0 X -13.618 Y -18.124 Z 38.873 A -45.997 C -351.324 +G0 X -15.164 Y -18.938 Z 37.900 A -45.450 C -354.332 +G0 X -16.680 Y -19.714 Z 36.853 A -44.983 C -357.393 +G0 X -18.163 Y -20.452 Z 35.733 A -44.600 C -360.499 +G0 X -19.610 Y -21.149 Z 34.542 A -44.301 C -363.643 +G0 X -21.019 Y -21.804 Z 33.283 A -44.090 C -366.816 +G0 X -22.386 Y -22.417 Z 31.959 A -43.967 C -370.008 +G0 X -23.708 Y -22.985 Z 30.571 A -43.933 C -373.209 +G0 X -24.984 Y -23.508 Z 29.123 A -43.989 C -376.409 +G0 X -26.211 Y -23.984 Z 27.618 A -44.133 C -379.597 +G0 X -27.386 Y -24.413 Z 26.058 A -44.366 C -382.764 +G0 X -28.507 Y -24.794 Z 24.446 A -44.685 C -385.900 +G0 X -29.571 Y -25.126 Z 22.786 A -45.089 C -388.995 +G0 X -30.578 Y -25.408 Z 21.081 A -45.576 C -392.044 +G0 X -31.523 Y -25.640 Z 19.335 A -46.142 C -395.038 +G0 X -32.407 Y -25.822 Z 17.550 A -46.785 C -397.972 +G0 X -28.982 Y -23.092 Z 15.695 A -46.785 C -397.972 +G0 X -37.053 Y -12.751 Z 3.370 A -46.785 C -397.972 +G1 X -37.950 Y -11.602 Z 2.001 A -46.785 C -397.972 F 318 +G1 X -34.275 Y -12.304 Z 3.910 A -46.785 C -397.972 F 159 +G1 X -32.993 Y -12.602 Z 4.625 A -46.795 C -398.039 F 159 +G1 X -31.706 Y -12.894 Z 5.368 A -46.805 C -398.107 F 159 +G1 X -30.439 Y -13.172 Z 6.121 A -46.813 C -398.174 F 159 +G1 X -29.184 Y -13.439 Z 6.890 A -46.820 C -398.240 F 159 +G1 X -27.940 Y -13.698 Z 7.676 A -46.825 C -398.306 F 159 +G1 X -26.844 Y -13.917 Z 8.385 A -46.829 C -398.365 F 159 +G1 X -25.339 Y -14.203 Z 9.383 A -46.833 C -398.446 F 159 +G1 X -24.104 Y -14.421 Z 10.221 A -46.835 C -398.513 F 159 +G1 X -22.891 Y -14.624 Z 11.065 A -46.835 C -398.579 F 159 +G1 X -21.686 Y -14.810 Z 11.920 A -46.835 C -398.645 F 159 +G1 X -20.480 Y -14.978 Z 12.791 A -46.833 C -398.712 F 159 +G1 X -19.286 Y -15.126 Z 13.671 A -46.830 C -398.780 F 159 +G1 X -18.093 Y -15.249 Z 14.564 A -46.826 C -398.848 F 159 +G1 X -16.859 Y -15.352 Z 15.505 A -46.820 C -398.920 F 159 +G1 X -15.731 Y -15.422 Z 16.382 A -46.813 C -398.986 F 159 +G1 X -14.949 Y -15.457 Z 16.998 A -46.807 C -399.033 F 159 +G1 X -13.776 Y -15.481 Z 17.936 A -46.798 C -399.104 F 159 +G1 X -13.006 Y -15.481 Z 18.562 A -46.791 C -399.152 F 159 +G1 X -11.859 Y -15.452 Z 19.509 A -46.779 C -399.224 F 159 +G1 X -10.715 Y -15.388 Z 20.474 A -46.765 C -399.298 F 159 +G1 X -9.858 Y -15.315 Z 21.212 A -46.753 C -399.354 F 159 +G1 X -9.013 Y -15.221 Z 21.952 A -46.740 C -399.411 F 159 +G1 X -8.276 Y -15.120 Z 22.610 A -46.728 C -399.461 F 159 +G1 X -7.546 Y -14.999 Z 23.273 A -46.715 C -399.512 F 159 +G1 X -6.824 Y -14.865 Z 23.942 A -46.700 C -399.563 F 159 +G1 X -6.114 Y -14.711 Z 24.614 A -46.686 C -399.614 F 159 +G1 X -5.414 Y -14.536 Z 25.289 A -46.670 C -399.666 F 159 +G1 X -4.723 Y -14.338 Z 25.970 A -46.652 C -399.718 F 159 +G1 X -3.992 Y -14.093 Z 26.706 A -46.633 C -399.775 F 159 +G1 X -3.609 Y -13.949 Z 27.099 A -46.622 C -399.805 F 159 +G1 X -0.380 Y -12.535 Z 30.357 A -46.622 C -399.805 F 159 +G1 X 0.550 Y -13.652 Z 31.731 A -46.622 C -399.805 F 318 +G0 X 5.996 Y -20.187 Z 39.769 A -46.622 C -399.805 +M5 +G0 A 0 C 0 +G0 X 0 Y 0 Z40 +( Rmax 45.44 Zmin -2.65 Zmax 39.77 ) +( Amin -74.49 Amax 0.00 ) +( Cmin -399.81 Cmax 0.00 ) +M30 diff --git a/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc new file mode 100644 index 0000000..c2d961b --- /dev/null +++ b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc @@ -0,0 +1,47 @@ +o sub +(test-xyzac-kins with offsets and tool change) +( 5 AXIS XYZAC MILLING ) + + # = #1 (=20) + # = #2 (=30) + # = #3 (=30) + # = #4 (=10) +# = #5 (=200) + # = #6 (=1 1st Tool) + # = #7 (=2 2nd Tool) + # = #8 (=500) + # = #9 (=600) + +; 'square with 2 rounded corners' +# = # +# = # +# = # + +N40 G00 G17 G40 G90 G94 Z10 +(first tool - no z-offset) +T# M6 +S# M3 +G00 A# C# +G43 H# Z0 +G01 X# F# +G01 Y# +G01 X0 +G03 X-# Y0 I0 J-# +G00 Z# +G00 X0 +M5 +(next tool- with z-offset) +T# M6 +S# M3 +G00 A# C# +G43 H# Z0 +G01 X-# F# +G01 Y-# +G01 X0 +G03 X# Y0 I0 J# +G0 Z# +G0 X0 Y0 +M5 +A0 C0 + +o endsub diff --git a/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc new file mode 100644 index 0000000..4701c94 --- /dev/null +++ b/test_Rtcp/programs/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc @@ -0,0 +1,47 @@ +o sub +(test-xyzbc-trt-kins with offsets and tool change) +( 5 AXIS XYZBC MILLING ) + + # = #1 (=20) + # = #2 (=30) + # = #3 (=30) + # = #4 (=10) +# = #5 (=200) + # = #6 (=1 1st Tool) + # = #7 (=2 2nd Tool) + # = #8 (=500) + # = #9 (=600) + +;'square with 2 rounded corners' +# = # +# = # +# = # + +G00 G17 G40 G90 G94 Z10 +(first tool - no z-offset) +T# M6 +S# M3 +G00 B# C# +G43 H# Z0 +G01 X# F# +G01 Y# +G01 X0 +G03 X-# Y0 I0 J-# +G00 Z# +G00 X0 +M5 +(next tool- with z-offset) +T# M6 +S# M3 +G00 B# C# +G43 H# Z0 +G01 X-# F# +G01 Y-# +G01 X0 +G03 X# Y0 I0 J# +G0 Z# +G0 X0 Y0 +M5 +B0 C0 + +o endsub diff --git a/test_Rtcp/programs/nc_files/cone.ngc b/test_Rtcp/programs/nc_files/cone.ngc new file mode 100644 index 0000000..a5af85c --- /dev/null +++ b/test_Rtcp/programs/nc_files/cone.ngc @@ -0,0 +1,42 @@ +(for the simulated 5 axis machine) +g21 g90 g94 g28 + +o200 sub + +g0 b0 c0 (tool length change must happen with b,c=0) +g91 g28 z0 (could also be done with tool change position) +g90 +g43.1 z#1 (change tool length) +g0z0 (move Z to apply new length) + +x-100 b-45 c-180 +g1 z-100 f2000 + +#100=-180 +o100 while [ #100 le 180 ] + g1 x[100*cos[#100]] y[100*sin[#100]] c#100 + #100=[#100+10] +o100 endwhile +g0 z0 +x0 y0 b0 c0 +o200 endsub + +(cut around the "cone" with different tool lengths) +o200 call [50] +o200 call [80] + +g61 + +g0 x-100 b-45 c-180 +#100=-180 +o101 while [ #100 lt 180 ] + g0 x[150*cos[#100]] y[150*sin[#100]] z-100 c#100 + g1 w100 f2000 (drill) + g0 w0 + #100=[#100+45] +o101 endwhile + +g28 +g49 + +m2 diff --git a/test_Rtcp/rtcp_analysis.md b/test_Rtcp/rtcp_analysis.md new file mode 100644 index 0000000..93bf4a1 --- /dev/null +++ b/test_Rtcp/rtcp_analysis.md @@ -0,0 +1,192 @@ +# LinuxCNC RTCP G-code 特点分析 + +## 1. 实现方式 + +这套 LinuxCNC 源码没有把 RTCP 作为独立的 `G43.4/G43.5` 代码实现。源码中的 RTCP 是运动学层能力: + +- `src/emc/kinematics/trtfuncs.c` 实现 XYZAC 和 XYZBC 的正逆运动学。 +- `src/emc/kinematics/xyzac-trt-kins.c` 和 `xyzbc-trt-kins.c` 将对应运动学注册为 LinuxCNC kinematics。 +- `src/emc/kinematics/5axiskins.c` 实现 XYZBCW Bridge Mill 的 pivot-length、刀长和 W 轴变换。 +- `src/emc/kinematics/genhexkins.c` 的注释明确说明,`tool-offset` 连接到 `motion.tooloffset.Z` 时实现 RTCP。 + +因此,G 代码主要承担四件事: + +1. 选择 TCP 或 identity 运动学。 +2. 设置刀长补偿和工件坐标系。 +3. 给出刀尖/工件坐标和刀具姿态。 +4. 用同步的直线、圆弧和旋转轴运动验证逆运动学结果。 + +## 2. M428/M429/M430 的作用 + +在 TRT、TDR、Bridge Mill 和 Hexapod 的 switchkins 配置中,常见映射如下: + +| 命令 | 作用 | +|---|---| +| `M428` | 选择非平凡 TCP/RTCP kinematics,通常通过 `M68 E3 Q1` 设置 `motion.switchkins-type=1`,然后用 `M66 E0 L0` 同步 | +| `M429` | 选择 identity/trivkins,通常设置 `motion.switchkins-type=0` | +| `M430` | 选择 userk,通常设置 `motion.switchkins-type=2`;它是扩展运动学入口,不等于 RTCP 本身 | + +这几个 M 代码是 remap 出来的用户命令,不是 LinuxCNC 固定的通用 M 代码。使用前必须匹配 INI 中的 `REMAP`、`SUBROUTINE_PATH` 和 HAL 信号。例如 TRT 配置需要把 `motion.analog-out-03` 接到 `motion.switchkins-type`。 + +`428remap.ngc` 和 `429remap.ngc` 都会检查 `motion.switchkins-type` 是否存在,并在 task 模式下检查切换结果;缺少 `HAL_PIN_VARS` 或 HAL 网络时会输出 debug 信息并停止。这说明运动学切换被设计成有确认步骤的同步操作。 + +## 3. TRT 的 XYZAC 与 XYZBC + +### XYZAC + +`xyzac-trt` 表示: + +- 直线轴:X、Y、Z +- 倾转轴:A +- 旋转轴:C +- 典型结构:A 倾转台上安装 C 旋转台 + +`trtfuncs.c` 的正逆变换会使用: + +- C 轴旋转中心:`x-rot-point`、`y-rot-point`、`z-rot-point` +- A 轴相对于 C 轴的偏置:`y-offset`、`z-offset` +- 当前刀长:`tool-offset` + +### XYZBC + +`xyzbc-trt` 表示: + +- 直线轴:X、Y、Z +- 倾转轴:B +- 旋转轴:C +- 典型结构:B 倾转台上安装 C 旋转台 + +它使用 `x-offset`、`z-offset` 描述 B/C 旋转组件之间的几何偏置,并同样使用旋转中心参数和当前刀长。 + +两种运动学的共同点是:G 代码给出的 XYZ 和旋转姿态被当作笛卡尔 pose,逆运动学再计算实际关节位置。RTCP 的核心效果是改变 A/B/C 姿态时,刀尖 TCP 的空间位置仍按程序要求保持。 + +## 4. 刀长和 TCP 偏置 + +典型写法包括: + +```gcode +T1 M6 +G43 H1 Z5.0 +... +G49 +``` + +或: + +```gcode +G43.1 Z#1 +... +G49 +``` + +含义分别是: + +- `G43 Hn`:使用刀具表中第 n 号刀的长度。 +- `G43.1`:从当前 G 代码块的轴字设置动态刀长。 +- `G49`:取消刀长补偿。 + +在 TRT 配置中,`motion.tooloffset.z` 通过 HAL 连接到 `xyzac-trt-kins.tool-offset` 或 `xyzbc-trt-kins.tool-offset`。这使得普通 G43/G43.1 的结果进入运动学变换,而不是只修改显示坐标。 + +`cone.ngc` 特别体现了动态刀长的使用:它先令 B/C 回到零位,再用 `G43.1 Z#1` 设置刀长,随后执行五轴旋转轨迹。这样可以避免切换刀长时旋转姿态带来的大幅关节变化。 + +## 5. 工件坐标系与旋转中心 + +RTCP 程序常见以下组合: + +```gcode +G53 G0 X0 Y0 Z... +G10 L20 P0 X0 Y0 Z... A0 C0 +G54 +``` + +- `G53` 用于在机器坐标下安全定位。 +- `G10 L20 P0` 根据当前姿态建立或重设工件坐标系。 +- `G54` 激活工件坐标系。 + +`centering.ngc`、`helix_ac.ngc`、`helix_bc.ngc` 和 `xyzab-tdr-demo.ngc` 还读取 HAL 变量,例如旋转中心和机械偏置。这类程序不是只验证 G 代码语法,而是验证“配置中的旋转中心、偏置和程序坐标”是否保持一致。 + +## 6. 轨迹类型 + +### CAM 点列轨迹 + +`boat-xyzac.ngc`、`boat-xyzbc.ngc` 和 `impeller-7bl-xyzac.ngc` 是典型后处理器输出: + +- 大量连续的 `G1` 线段。 +- 同一段轨迹同时改变 X/Y/Z 与 A/C 或 B/C。 +- `boat-xyzbc.ngc` 和 impeller 程序使用 `G93` 逆时间进给,并在安全移动时切回 `G94`。 +- 通过高密度姿态点逼近船体、叶轮等复杂曲面。 +- 文件规模较大,适合验证连续五轴轨迹和逆运动学稳定性,不适合作为最小功能测试。 + +### 运动学切换测试 + +`xyzac_switchkins_test_1.ngc`、`xyzac_switchkins_test_2.ngc`、`xyzac_switchkins_test_3.ngc` 的重点是对照: + +- `M429` 下的 identity 坐标。 +- `M428` 下的 TCP 坐标。 +- C 轴旋转后,同一个 X/Y/Z 指令对应的实际关节变化。 +- `(debug,...)` 输出的预期坐标。 +- M1 可选停,用于人工检查切换前后的结果。 + +其中 `test_3` 直接写出切换前后的预期位置,例如 C=90 后进入 TCP 模式时,X/Y 位置会因旋转变换而改变。 + +### 螺旋和四象限测试 + +`helix_ac.ngc` 和 `helix_bc.ngc` 的主要模式是: + +```gcode +M429 +G10 L20 ... +M428 +G0 A... C... +G2 I... Z... P... +M429 +``` + +它们在 TCP 模式下执行带旋转姿态的螺旋,再回到 identity 模式进行安全返回。`xyzac_switchkins_sub.ngc` 和 `xyzbc_switchkins_sub.ngc` 将该动作扩展到四个象限,并用参数传入安全高度、半径、圈数、进给率、姿态角和象限间距。 + +### 旋转中心保持测试 + +`centering.ngc` 先输出 HAL 中的旋转中心,然后进入 TCP 模式,在 C 轴每个角度执行一个小方形轨迹。它用于观察工件坐标中心是否在 C 轴旋转过程中保持固定。 + +### 参数化 Bridge Mill 测试 + +`5axisgui.ngc` 使用 O 代码循环和三角函数: + +- B 轴分层改变倾角。 +- C 轴分段改变方位角。 +- 根据角度计算球面上的 X/Y/Z 位置。 +- 用 W 轴执行钻削和退刀。 +- 使用 `G43` 将当前刀长送入 5axiskins 的 pivot length。 + +它更偏向运动学和可视化演示,代码结构比 CAM 输出更适合阅读和移植。 + +## 7. 这些程序的共同特点 + +1. RTCP 由 kinematics 完成,程序行本身通常仍是普通 `G0/G1/G2/G3` 加旋转轴字。 +2. TCP 模式和 identity 模式经常交替出现,前者用于加工或姿态变换,后者用于机器坐标定位、建立偏置和安全返回。 +3. 刀长不是单独的显示量,而是通过 `motion.tooloffset.z` 进入逆运动学。 +4. 旋转中心、旋转组件偏置和工件坐标系是正确运行的必要条件;参数错误会直接表现为 TCP 漂移。 +5. 连续五轴 CAM 程序经常使用 `G93`,因为 XYZ 直线运动和旋转轴运动必须在同一段时间内完成。 +6. 许多程序明确使用 `G53`、高 Z 安全位置、`G49` 和姿态归零,说明五轴 RTCP 程序对切换点和刀长变化较敏感。 +7. 大型船体和叶轮程序主要验证连续轨迹;小型 switchkins、helix、centering 程序主要验证几何和状态切换。 + +## 8. 筛选边界 + +以下内容没有放入本集合: + +- 只出现普通 `G43/G49`、没有五轴非平凡运动学关联的通用铣削、车削和探测程序。 +- SCARA、Puma、Melfa 等使用 `M428/M429` 进行运动学切换,但源码没有将其定义为 RTCP 的示例。 +- millturn 的 `M428/M429`,其作用是铣削/车削运动学切换,不是 TCP/RTCP。 +- 只有 `XYZAC` 或 `XYZBC` 文字、但配置使用 `trivkins` identity 的普通五轴坐标示例。 +- `G43.1` 工具测量程序本身,除非同时包含五轴姿态和 RTCP 运动学上下文。 + +筛选依据来自源码中的配置和运动学实现,尤其是: + +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/README` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.txt` +- `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.txt` +- `configs/sim/axis/vismach/5axis/table-dual-rotary/README` +- `docs/src/motion/5-axis-kinematics.adoc` +- `src/emc/kinematics/trtfuncs.c` +- `src/emc/kinematics/5axiskins.c` +- `src/emc/kinematics/genhexkins.c` diff --git a/wasm-core/src/sim_interpreter.c b/wasm-core/src/sim_interpreter.c index 5313ae0..3d489ba 100644 --- a/wasm-core/src/sim_interpreter.c +++ b/wasm-core/src/sim_interpreter.c @@ -376,6 +376,7 @@ static int apply_g(sim_interpreter_state *state, interpreter_meta *meta, double } static int apply_m(sim_interpreter_state *state, interpreter_meta *meta, double code, int *groups) { + if (code_is(code, 1)) return SIM_INTERP_OK; if (code_is(code, 3) || code_is(code, 4) || code_is(code, 5)) { if (++groups[4] > 1) return SIM_INTERP_ERR_STATE; state->spindle_mode = (int)code; return SIM_INTERP_OK; } if (code_is(code, 2) || code_is(code, 30)) { if (++groups[5] > 1) return SIM_INTERP_ERR_STATE; state->program_end = 1; return SIM_INTERP_OK; } if (code_is(code, 6)) { if (meta) meta->selected_tool = meta->selected_tool < 0 ? 0 : meta->selected_tool; return SIM_INTERP_OK; } @@ -582,7 +583,9 @@ int sim_interpreter_execute(sim_interpreter *interpreter, const char *block, uin if (next.plane == 18) segment->normal.y = 1.0; else if (next.plane == 19) segment->normal.x = 1.0; else segment->normal.z = 1.0; - if (meta->feed_mode == 93) { + /* LinuxCNC applies inverse-time feed to G1/G2/G3. G0 remains a + * rapid move and does not require an F word while G93 is modal. */ + if (meta->feed_mode == 93 && next.motion_mode != 0) { const double dx = segment->end.tran.x - segment->start.tran.x; const double dy = segment->end.tran.y - segment->start.tran.y; const double dz = segment->end.tran.z - segment->start.tran.z; diff --git a/wasm-core/tests/sim_interpreter_test.c b/wasm-core/tests/sim_interpreter_test.c index 23fcdcc..9a8180a 100644 --- a/wasm-core/tests/sim_interpreter_test.c +++ b/wasm-core/tests/sim_interpreter_test.c @@ -81,6 +81,13 @@ int main(void) { assert(sim_interpreter_execute(&interpreter, "G80 M7", (uint32_t)(sizeof("G80 M7") - 1)) == SIM_INTERP_OK); assert(sim_interpreter_execute(&interpreter, "M8", 2) == SIM_INTERP_OK); assert(sim_interpreter_execute(&interpreter, "M9", 2) == SIM_INTERP_OK); + assert(sim_interpreter_execute(&interpreter, "(debug,optional stop disabled) M1", (uint32_t)(sizeof("(debug,optional stop disabled) M1") - 1)) == SIM_INTERP_OK); + assert(sim_interpreter_reset(&interpreter) == SIM_INTERP_OK); + assert(sim_interpreter_execute(&interpreter, "G93", 3) == SIM_INTERP_OK); + assert(sim_interpreter_execute(&interpreter, "G0 X16.339 Y-25.409 Z33.353 A-71.841 C-35.930", (uint32_t)(sizeof("G0 X16.339 Y-25.409 Z33.353 A-71.841 C-35.930") - 1)) == SIM_INTERP_OK); + assert(sim_interpreter_read_motion(&interpreter, &motion) == SIM_INTERP_OK); + assert(motion.motion_type == SIM_POSEMATH_LINEAR); + assert(fabs(interpreter.state.x - 16.339) < 1e-12 && fabs(interpreter.state.a + 71.841) < 1e-12); assert(sim_interpreter_reset(&interpreter) == SIM_INTERP_OK); assert(sim_interpreter_execute(&interpreter, "G0 X30 A20 C40", sizeof("G0 X30 A20 C40") - 1) == SIM_INTERP_OK); assert(sim_interpreter_execute(&interpreter, "G10 L20 P1 X5", 13) == SIM_INTERP_OK); diff --git a/web/react/public/machines/LICENSE.txt b/web/react/public/machines/LICENSE.txt new file mode 100644 index 0000000..b0812d9 --- /dev/null +++ b/web/react/public/machines/LICENSE.txt @@ -0,0 +1,4 @@ +Original procedural AC/BC machine demonstration assets generated for linuxcncWebWASM. +Dedicated to the public domain under CC0 1.0 Universal. +https://creativecommons.org/publicdomain/zero/1.0/ +No manufacturer affiliation or dimensional calibration is implied. diff --git a/web/react/public/machines/demo-ac-gantry.glb b/web/react/public/machines/demo-ac-gantry.glb new file mode 100644 index 0000000..67f16f3 Binary files /dev/null and b/web/react/public/machines/demo-ac-gantry.glb differ diff --git a/web/react/public/machines/demo-ac-gantry.urdf b/web/react/public/machines/demo-ac-gantry.urdf new file mode 100644 index 0000000..0a172dc --- /dev/null +++ b/web/react/public/machines/demo-ac-gantry.urdf @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/react/public/machines/demo-ac-xyz-head.glb b/web/react/public/machines/demo-ac-xyz-head.glb new file mode 100644 index 0000000..b4ef807 Binary files /dev/null and b/web/react/public/machines/demo-ac-xyz-head.glb differ diff --git a/web/react/public/machines/demo-ac-xyz-head.urdf b/web/react/public/machines/demo-ac-xyz-head.urdf new file mode 100644 index 0000000..b29bc79 --- /dev/null +++ b/web/react/public/machines/demo-ac-xyz-head.urdf @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/react/public/machines/demo-bc-gantry.glb b/web/react/public/machines/demo-bc-gantry.glb new file mode 100644 index 0000000..eda1f9a Binary files /dev/null and b/web/react/public/machines/demo-bc-gantry.glb differ diff --git a/web/react/public/machines/demo-bc-gantry.urdf b/web/react/public/machines/demo-bc-gantry.urdf new file mode 100644 index 0000000..4c0463f --- /dev/null +++ b/web/react/public/machines/demo-bc-gantry.urdf @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/react/public/machines/demo-bc-xyz-head.glb b/web/react/public/machines/demo-bc-xyz-head.glb new file mode 100644 index 0000000..b904da5 Binary files /dev/null and b/web/react/public/machines/demo-bc-xyz-head.glb differ diff --git a/web/react/public/machines/demo-bc-xyz-head.urdf b/web/react/public/machines/demo-bc-xyz-head.urdf new file mode 100644 index 0000000..f380cba --- /dev/null +++ b/web/react/public/machines/demo-bc-xyz-head.urdf @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/react/public/machines/manifest.json b/web/react/public/machines/manifest.json new file mode 100644 index 0000000..5dd4b63 --- /dev/null +++ b/web/react/public/machines/manifest.json @@ -0,0 +1,130 @@ +{ + "schema": "linuxcnc.machine.examples/1", + "generator": "scripts/generate_glb_machines.mjs", + "provenance": "Original procedural demonstration machines; no third-party mesh assets", + "license": "CC0-1.0", + "machines": [ + { + "id": "ac", + "label": "AC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-ac-xyz-head.glb", + "urdf": "demo-ac-xyz-head.urdf", + "bytes": 530848, + "sha256": "93698435206864ae42cdd2121be570538e977e32c6a3a99095a93dd1518f8da1", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + { + "id": "bc", + "label": "BC 示例", + "profile": "trt-xyz-head/1", + "filename": "demo-bc-xyz-head.glb", + "urdf": "demo-bc-xyz-head.urdf", + "bytes": 530532, + "sha256": "394c7cf3c8b246e1fc88e74301d9447f4e0892381ffa4fe1f86653a678efe95b", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "spindle_head", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 71 + }, + { + "id": "ac-gantry", + "label": "AC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-ac-gantry.glb", + "urdf": "demo-ac-gantry.urdf", + "bytes": 526004, + "sha256": "cee9fe5080fac3f87f8daca5d0f89ddb0c3c3eb7657fbdc81a7664ba9c4e4995", + "coordinates": "XYZAC", + "rotation_point_mm": [ + 24, + -12, + 8 + ], + "offsets_mm": [ + 0, + 18, + -45 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + }, + { + "id": "bc-gantry", + "label": "BC 示例桁架型", + "profile": "trt-xyz-gantry/1", + "filename": "demo-bc-gantry.glb", + "urdf": "demo-bc-gantry.urdf", + "bytes": 525688, + "sha256": "d7188520ef1e79576d99861294e9dbdf24deb6fe14697ad5106fe605fa1766b5", + "coordinates": "XYZBC", + "rotation_point_mm": [ + -18, + 14, + 12 + ], + "offsets_mm": [ + 22, + 0, + -40 + ], + "links": [ + "base", + "x_slide", + "y_slide", + "z_slide", + "tilt_table", + "c_table", + "work_frame" + ], + "meshes": 89 + } + ] +} diff --git a/web/react/src/App.tsx b/web/react/src/App.tsx index 276d7b9..0631f84 100644 --- a/web/react/src/App.tsx +++ b/web/react/src/App.tsx @@ -4,6 +4,9 @@ import { ReactWorkerClient } from "./worker-client"; import { XyzacToolPreviewFromSnapshot } from "./XyzacToolPreview"; import { XyzacMachineViewFromSnapshot } from "./XyzacMachineView"; import { WEB_SETTINGS } from "../../workspace/web-settings.mjs"; +import { MachineImportPanel } from "./MachineImportPanel"; +import { loadImportedMachine, configureImportedMachine, updateImportedMachineGeometry, disposeMachineScene, type ImportedMachine } from "./imported-machine"; +import { MAX_MACHINE_BYTES } from "./machine-urdf"; import { TrtGeometryPanel } from "./TrtGeometryPanel"; import { readTrtGeometry } from "../../workspace/trt-geometry.mjs"; import { loadSimulationCase, toWorkerConfiguration } from "../../workspace/sim-case-loader.mjs"; @@ -14,6 +17,8 @@ import { AxisOperationController } from "../../app/axis-operation-controller.mjs import { XyzacDiagnostics, XyzacLiveParameters, XyzacProgramPane, XyzacTrtPanel } from "./XyzacTrtPanel"; import { projectXyzacPanel, type XyzacOperationTrace } from "./xyzac-panel-contract"; import { DEFAULT_MACHINE, MACHINE_DEFINITIONS, machineDefinition } from "../../workspace/machine-definitions.mjs"; +import { RtcpProgramLibrary, type RtcpProgram } from "./RtcpProgramLibrary"; +import { MachineManagerPanel } from "./MachineManagerPanel"; export const SELECTED_XYZAC_CASE = DEFAULT_MACHINE.entrypoint; const DEFAULT_CASE = DEFAULT_MACHINE.entrypoint; @@ -71,7 +76,7 @@ function ManualControl({ action, axes = DEFAULT_MACHINE.axes, canJog, canHome, c const options = ["Continuous", "0.1000", "0.0100", "0.0010", "0.0001"]; const keydown = (event: KeyboardEvent) => { const target = event.target as HTMLElement | null; - if (!active || event.ctrlKey || event.altKey || event.metaKey || event.repeat || target && (["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName) || target.closest('[role="dialog"]'))) return; + if (!active || event.ctrlKey || event.altKey || event.metaKey || event.repeat || target && (["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName) || target.closest('dialog, [role="dialog"]'))) return; if (event.key === "c") { event.preventDefault(); setIncrement("Continuous"); } if (event.key === "i" || event.key === "I") { event.preventDefault(); @@ -260,6 +265,10 @@ export function App() { const lastSourceState = useRef({ on: false, idle: true }); const modeRestorePending = useRef(false); const uiCacheSaveTimer = useRef | null>(null); + const [importedMachine, setImportedMachine] = useState(null); + const configurationPending = useRef(false); + const importedScene = importedMachine?.scene; + useEffect(() => () => { if (importedScene) disposeMachineScene(importedScene); }, [importedScene]); const selectedMachine = machineDefinition(casePath) ?? DEFAULT_MACHINE; const UI_CACHE_KEY = selectedMachine.id; useEffect(() => { @@ -389,7 +398,7 @@ export function App() { if (!jog || jogStepPending.current) return; jogStepPending.current = true; void operationController.execute("SIM_STEP", { cycles: WEB_SETTINGS.ui.jog_cycles, response: "motion_delta" }, { state: axisState, gate: false }) - .catch(() => stopJogTimer()) + .catch((error: Error) => { stopJogTimer(); setCommandStatus(`Jog stopped: ${error.message}`); }) .finally(() => { jogStepPending.current = false; }); }, WEB_SETTINGS.ui.poll_ms); }; @@ -500,6 +509,7 @@ export function App() { const operation = await operationController.execute("LOAD_WORKSPACE", { root_path: "/workspace", configuration: toWorkerConfiguration(bundle) }, { state: axisState, gate: false }); setGeometryBundle(bundle); setCasePath(requestedCasePath); + setImportedMachine(null); const resultPayload = (operation.response as { payload?: { configuration?: { state?: string } } }).payload; markPreviewProgress(28, "wasm", "LinuxCNC WASM 配置已加载,准备解析刀具路径"); setProgramText(normalizedSource); setProgramPath(programPathForCase); @@ -516,27 +526,71 @@ export function App() { } finally { setProgramLoading(false); } }; const setProgramText = (value: string) => { setProgramTextState(value); }; - const applyGeometry = async (source: any) => { - if (programLoading || machineOn || programRunning || programPaused) throw new Error("关机且程序空闲后可修改"); + const applyGeometry = async (source: any, model?: { current: ImportedMachine | null; committed: boolean }) => { + if (configurationPending.current || programLoading || machineOn || programRunning || programPaused) throw new Error("关机且程序空闲后可修改"); + configurationPending.current = true; setProgramLoading(true); - startPreviewProgress("机床参数"); + let workspaceRequested = false; + let workspaceCommitted = false; try { const bundle = typeof source === "function" ? await source() : source; readTrtGeometry(bundle); + const nextModel = model ? model.current : importedMachine ? updateImportedMachineGeometry(importedMachine, bundle) : null; const configuration = toWorkerConfiguration(bundle); + startPreviewProgress("机床参数"); + workspaceRequested = true; await operationController.execute("LOAD_WORKSPACE", { root_path: "/workspace", configuration }, { gate: false }); + workspaceCommitted = true; setGeometryBundle(bundle); + setCasePath(bundle.entrypoint); + setImportedMachine(nextModel); + if (model) model.committed = true; const loaded = await operationController.execute("PROGRAM_LOAD", { source: programText, path: programPath }, { gate: false }); finishPreviewProgress(programPath, loaded.response); setCommandStatus("机床参数已应用,程序已重新解析,待重新回零"); } catch (error) { - failPreviewProgress(error instanceof Error ? error.message : String(error)); + if (workspaceRequested) failPreviewProgress(error instanceof Error ? error.message : String(error)); + else setCommandStatus(`机床配置未应用:${error instanceof Error ? error.message : String(error)}`); + if (workspaceCommitted) throw new Error(`机床已应用,但当前程序无法重新解析:${error instanceof Error ? error.message : String(error)}`); throw error; } finally { + configurationPending.current = false; setOperationTrace(operationController.exportTrace()); setProgramLoading(false); } }; + const importMachine = async (source: File | string) => { + const model: { current: ImportedMachine | null; committed: boolean } = { current: null, committed: false }; + try { + await applyGeometry(async () => { + let bytes: ArrayBuffer; + if (typeof source === "string") { + const response = await fetch(source); + if (!response.ok) throw new Error("示例 GLB 读取失败"); + bytes = await response.arrayBuffer(); + } else { + if (source.size > MAX_MACHINE_BYTES) throw new Error("GLB 最大 32 MiB"); + bytes = await source.arrayBuffer(); + } + model.current = await loadImportedMachine(bytes, typeof source === "string" ? source.split("/").at(-1)! : source.name); + const definition = machineDefinition(model.current.structure.coordinates)!; + const bundle = geometryBundle?.entrypoint === definition.entrypoint ? geometryBundle : await loadSimulationCase({ path: definition.entrypoint, baseUrl: "." }); + if (!bundle || ("status" in bundle && bundle.status !== "ready")) throw new Error("机床运行配置未就绪"); + return configureImportedMachine(bundle, model.current.structure); + }, model); + } finally { if (model.current && !model.committed) disposeMachineScene(model.current.scene); } + }; + const applyManagedMachine = async (candidate: ImportedMachine) => { + const model: { current: ImportedMachine | null; committed: boolean } = { current: candidate, committed: false }; + try { + await applyGeometry(async () => { + const definition = machineDefinition(candidate.structure.coordinates)!; + const bundle = geometryBundle?.entrypoint === definition.entrypoint ? geometryBundle : await loadSimulationCase({ path: definition.entrypoint, baseUrl: "." }); + if (!bundle || ("status" in bundle && bundle.status !== "ready")) throw new Error("机床运行配置未就绪"); + return configureImportedMachine(bundle, candidate.structure); + }, model); + } finally { if (!model.committed) disposeMachineScene(candidate.scene); } + }; const reloadGeometry = () => applyGeometry(async () => { const bundle = await loadSimulationCase({ path: casePath, baseUrl: "." }); if (bundle.status !== "ready") throw new Error(`INI blocked: ${bundle.missing.join(",")}`); @@ -566,6 +620,33 @@ export function App() { setCaseStatus(`blocked: ${error instanceof Error ? error.message : "program_asset_load_failed"}`); } finally { setProgramLoading(false); } }; + const loadRtcpProgram = async (program: RtcpProgram, source: string) => { + if (!canLoad) throw new Error(controlReason("load")); + if (program.role !== "main" || !program.coordinates.includes(selectedMachine.coordinates)) throw new Error(`rtcp_program_incompatible:${program.coordinates.join("/")}`); + const normalizedSource = normalizeProgramSource(source); + setProgramLoading(true); + startPreviewProgress(program.label); + setCommandStatus("PROGRAM_LOAD pending: waiting for LinuxCNC WASM preview"); + setCaseStatus(`${program.path} loading from RTCP library...`); + try { + if (!normalizedSource.trim()) throw new Error("program_asset_empty"); + if (!latestLoadGate.current.enabled) throw new Error(latestLoadGate.current.reason); + setProgramText(normalizedSource); setProgramPath(program.path); + markPreviewProgress(38, "wasm", "LinuxCNC WASM 正在解析 RTCP 刀具路径"); + const programLoad = await operationController.execute("PROGRAM_LOAD", { source: normalizedSource, path: program.path }, { state: axisState, gate: false }); + finishPreviewProgress(program.path, programLoad.response); + setOperationTrace(operationController.exportTrace()); + setCommandStatus("PROGRAM_LOAD acknowledged"); + setCaseStatus(`${selectedMachine.coordinates}: ${program.label} loaded through linuxcnc-wasm`); + } catch (error) { + setOperationTrace(operationController.exportTrace()); + const message = error instanceof Error ? error.message : "rtcp_program_load_failed"; + failPreviewProgress(message); + setCommandStatus(`PROGRAM_LOAD blocked: ${message}`); + setCaseStatus(`blocked: ${message}`); + throw error; + } finally { setProgramLoading(false); } + }; const loadProgram = () => { if (programLoading || !gates.reload.enabled) return; setProgramLoading(true); @@ -649,6 +730,7 @@ export function App() { if (event.key === "Tab") { event.preventDefault(); aboutDialog.current?.querySelector("button")?.focus(); } return; } + if (document.querySelector(".machine-dialog[open]")) return; if (event.key === "Escape") { event.preventDefault(); stopProgram(true); return; } if (target && (["INPUT", "TEXTAREA", "SELECT"].includes(target.tagName) || target.isContentEditable)) return; if (event.altKey || event.metaKey) return; @@ -797,11 +879,11 @@ export function App() {
AXIS AXISLinuxCNC Web/WASM
Connection: {state.status.toUpperCase()}
execute("PROGRAM_STEP")} /> execute(programPaused ? "PROGRAM_RESUME" : "PROGRAM_PAUSE")} pressed={relief.pauseResume} /> stopProgram()} pressed={relief.abort} /> setZoom((value) => Math.min(WEB_SETTINGS.ui.zoom_max, value + WEB_SETTINGS.ui.zoom_step))} /> setZoom((value) => Math.max(WEB_SETTINGS.ui.zoom_min, value - WEB_SETTINGS.ui.zoom_step))} /> { setView("z"); setRightTab("preview"); }} /> { setView("z2"); setRightTab("preview"); }} /> { setView("x"); setRightTab("preview"); }} /> { setView("y"); setRightTab("preview"); }} /> { setView("y2"); setRightTab("preview"); }} /> { setView("p"); setRightTab("preview"); }} /> setRotateMode((value) => !value)} /> xyzacCommand("VISUAL_CLEAR", {}, "vismachClear")} />
-
Load {selectedMachine.coordinates} boat program{programLoading ? "Loading program..." : caseStatus.startsWith("blocked:") ? caseStatus : `Program: ${loadedProgramName}`}{previewProgress &&
{previewProgress.detail}{previewProgress.percent}%{previewProgress.percent}%
}
+
Load {selectedMachine.coordinates} boat program{programLoading ? "Loading program..." : caseStatus.startsWith("blocked:") ? caseStatus : `Program: ${loadedProgramName}`}{previewProgress &&
{previewProgress.detail}{previewProgress.percent}%{previewProgress.percent}%
}
{ void loadCase(path); }} /> -
+
{(["path", "live", "limits", "velocity", "offsets", "extents"] as const).map((layer) => )}
diff --git a/web/react/src/DraggableDialog.tsx b/web/react/src/DraggableDialog.tsx new file mode 100644 index 0000000..276f1be --- /dev/null +++ b/web/react/src/DraggableDialog.tsx @@ -0,0 +1,55 @@ +import { useEffect, useId, useLayoutEffect, useRef, type PointerEvent, type ReactNode } from "react"; + +type Props = { open: boolean; title: string; className?: string; onClose: () => void; children: ReactNode }; + +// Native dialog provides focus containment, inert background, Escape and focus return. +// Keeping children mounted preserves drafts and pending import results when closed. +export function DraggableDialog({ open, title, className = "", onClose, children }: Props) { + const ref = useRef(null); + const titleId = useId(); + const drag = useRef<{ id: number; x: number; y: number; left: number; top: number } | null>(null); + const position = (left: number, top: number) => { + const dialog = ref.current; + if (!dialog) return; + const bounds = dialog.getBoundingClientRect(); + const width = document.documentElement.clientWidth, height = window.innerHeight; + dialog.style.left = `${Math.max(8, Math.min(left, width - bounds.width - 8))}px`; + dialog.style.top = `${Math.max(8, Math.min(top, height - bounds.height - 8))}px`; + }; + useLayoutEffect(() => { + const dialog = ref.current!; + if (!open) { if (dialog.open) dialog.close(); return; } + if (!dialog.open) dialog.showModal(); + const bounds = dialog.getBoundingClientRect(); + position((document.documentElement.clientWidth - bounds.width) / 2, (window.innerHeight - bounds.height) / 2); + const keepVisible = () => { const rect = dialog.getBoundingClientRect(); position(rect.left, rect.top); }; + const observer = new ResizeObserver(keepVisible); + observer.observe(dialog); window.addEventListener("resize", keepVisible); + return () => { observer.disconnect(); window.removeEventListener("resize", keepVisible); drag.current = null; }; + }, [open]); + useEffect(() => () => { if (ref.current?.open) ref.current.close(); }, []); + const start = (event: PointerEvent) => { + if (event.button !== 0 || (event.target as HTMLElement).closest("button")) return; + const bounds = ref.current!.getBoundingClientRect(); + drag.current = { id: event.pointerId, x: event.clientX, y: event.clientY, left: bounds.left, top: bounds.top }; + event.currentTarget.setPointerCapture(event.pointerId); + }; + const move = (event: PointerEvent) => { + const from = drag.current; + if (from?.id !== event.pointerId) return; + position(from.left + event.clientX - from.x, from.top + event.clientY - from.y); + }; + const stop = () => { drag.current = null; }; + return { event.preventDefault(); onClose(); }} onKeyDown={(event) => { + if (event.key !== "Tab") return; + const elements = [...event.currentTarget.querySelectorAll('button:not(:disabled), a[href], input:not(:disabled):not([type="hidden"]), select:not(:disabled), textarea:not(:disabled), summary, [tabindex="0"]')].filter((element) => element.getClientRects().length > 0); + const first = elements[0], last = elements.at(-1); + if (event.shiftKey && (document.activeElement === first || !elements.includes(document.activeElement as HTMLElement))) { event.preventDefault(); last?.focus(); } + else if (!event.shiftKey && (document.activeElement === last || !elements.includes(document.activeElement as HTMLElement))) { event.preventDefault(); first?.focus(); } + }}> +
+ {title} +
+
{children}
+
; +} diff --git a/web/react/src/MachineImportPanel.tsx b/web/react/src/MachineImportPanel.tsx new file mode 100644 index 0000000..41764bd --- /dev/null +++ b/web/react/src/MachineImportPanel.tsx @@ -0,0 +1,32 @@ +import { useRef, useState } from "react"; +import { DraggableDialog } from "./DraggableDialog"; +import type { ImportedMachine } from "./imported-machine"; + +import exampleCatalog from "../public/machines/manifest.json"; +const examples = exampleCatalog.machines; +export function MachineImportPanel({ model, disabled, onImport }: { model: ImportedMachine | null; disabled: boolean; onImport: (source: File | string) => Promise }) { + const file = useRef(null); + const [open, setOpen] = useState(false); + const [message, setMessage] = useState(""); + const run = async (source: File | string) => { + if (disabled) return; + setMessage("正在读取机床结构…"); + try { await onImport(source); setMessage("模型及参数已应用;请重新回零。页面重载后需重新导入 GLB。"); } + catch (error) { setMessage(error instanceof Error ? error.message : String(error)); } + }; + const s = model?.structure; + return
; +} diff --git a/web/react/src/MachineManagerPanel.tsx b/web/react/src/MachineManagerPanel.tsx new file mode 100644 index 0000000..64cfe92 --- /dev/null +++ b/web/react/src/MachineManagerPanel.tsx @@ -0,0 +1,122 @@ +import { useEffect, useRef, useState } from "react"; +import * as THREE from "three"; +import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; +import { TransformControls } from "three/examples/jsm/controls/TransformControls.js"; +import { GLTFExporter } from "three/examples/jsm/exporters/GLTFExporter.js"; +import { DraggableDialog } from "./DraggableDialog"; +import { disposeMachineScene, type ImportedMachine } from "./imported-machine"; +import { buildManagedMachine, cloneMachinePartScene, expectedParentRole, loadMachinePart, MACHINE_PART_ROLES, roleLabel, type MachinePartDraft, type MachinePartRole, type PhysicalZero } from "./machine-manager"; +import type { Vec3 } from "./machine-urdf"; + +type Props = { coordinates: "XYZAC" | "XYZBC"; disabled: boolean; onApply: (machine: ImportedMachine) => Promise }; +const zero3 = (): Vec3 => [0, 0, 0]; +const number = (value: string) => Number.isFinite(Number(value)) ? Number(value) : 0; + +function ManagerPreview({ parts, selectedId, mode, onTransform }: { parts: MachinePartDraft[]; selectedId: string | null; mode: "translate" | "rotate"; onTransform: (id: string, translationMm: Vec3, rotationDeg: Vec3) => void }) { + const host = useRef(null); + const onTransformRef = useRef(onTransform); onTransformRef.current = onTransform; + useEffect(() => { + const element = host.current; if (!element) return; + const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setPixelRatio(Math.min(devicePixelRatio || 1, 2)); renderer.shadowMap.enabled = true; renderer.setSize(Math.max(element.clientWidth, 320), Math.max(element.clientHeight, 360), false); element.appendChild(renderer.domElement); + const scene = new THREE.Scene(); scene.background = new THREE.Color(0x10191d); scene.add(new THREE.HemisphereLight(0xffffff, 0x405057, 2)); + const light = new THREE.DirectionalLight(0xffffff, 3); light.position.set(3, 5, 4); light.castShadow = true; scene.add(light); + const grid = new THREE.GridHelper(4, 40, 0x55777b, 0x294347); scene.add(grid); + const camera = new THREE.PerspectiveCamera(42, 1, .005, 100); camera.position.set(2.4, 1.8, 2.8); + const orbit = new OrbitControls(camera, renderer.domElement); orbit.enableDamping = true; + const root = new THREE.Group(); root.name = "machine-manager-preview"; scene.add(root); + const nodes = new Map(); const disposable: THREE.Object3D[] = []; + for (const part of parts) { + const node = new THREE.Group(); node.name = `draft_${part.id}`; node.visible = part.visible; node.position.fromArray(part.translationMm).multiplyScalar(.001); node.rotation.set(...part.rotationDeg.map(THREE.MathUtils.degToRad) as Vec3); + const visual = cloneMachinePartScene(part.scene); visual.position.fromArray(part.originMm).multiplyScalar(-.001); node.add(visual); disposable.push(visual); + const axes = new THREE.AxesHelper(.12); axes.name = `origin_${part.id}`; axes.visible = part.showOrigin; node.add(axes); root.add(node); nodes.set(part.id, node); + } + const cycle = (child: string, parent: string) => { let cursor: string | null = parent; const seen = new Set([child]); while (cursor) { if (seen.has(cursor)) return true; seen.add(cursor); cursor = parts.find((part) => part.id === cursor)?.parentId ?? null; } return false; }; + for (const part of parts) if (part.parentId && nodes.has(part.parentId) && !cycle(part.id, part.parentId)) nodes.get(part.parentId)!.add(nodes.get(part.id)!); + const bounds = new THREE.Box3().setFromObject(root); const center = bounds.isEmpty() ? new THREE.Vector3() : bounds.getCenter(new THREE.Vector3()); const size = bounds.isEmpty() ? 1 : Math.max(bounds.getSize(new THREE.Vector3()).length(), .2); + orbit.target.copy(center); camera.position.copy(center).add(new THREE.Vector3(size, size * .7, size * 1.15)); orbit.update(); + const transform = new TransformControls(camera, renderer.domElement); transform.setMode(mode); transform.setSpace("local"); scene.add(transform.getHelper()); + const selected = selectedId ? nodes.get(selectedId) : null; if (selected) transform.attach(selected); + transform.addEventListener("dragging-changed", ((event: { value?: boolean }) => { orbit.enabled = !event.value; }) as never); + transform.addEventListener("mouseUp", (() => { + if (!selectedId || !selected) return; + onTransformRef.current(selectedId, selected.position.toArray().map((value) => value * 1000) as Vec3, [THREE.MathUtils.radToDeg(selected.rotation.x), THREE.MathUtils.radToDeg(selected.rotation.y), THREE.MathUtils.radToDeg(selected.rotation.z)]); + }) as never); + const resize = () => { const width = Math.max(element.clientWidth, 1), height = Math.max(element.clientHeight, 1); camera.aspect = width / height; camera.updateProjectionMatrix(); renderer.setSize(width, height, false); }; + const observer = new ResizeObserver(resize); observer.observe(element); resize(); let frame = 0; + const render = () => { orbit.update(); renderer.render(scene, camera); frame = requestAnimationFrame(render); }; render(); + return () => { cancelAnimationFrame(frame); observer.disconnect(); transform.dispose(); orbit.dispose(); for (const object of disposable) disposeMachineScene(object); renderer.dispose(); renderer.domElement.remove(); }; + }, [parts, selectedId, mode]); + return
part.showOrigin).length} data-transform-mode={mode} aria-label="三维机床装配预览" />; +} + +export function MachineManagerPanel({ coordinates, disabled, onApply }: Props) { + const [open, setOpen] = useState(false), [pending, setPending] = useState(false), [message, setMessage] = useState(""); + const [parts, setParts] = useState([]); const partsRef = useRef(parts); partsRef.current = parts; + const [selectedId, setSelectedId] = useState(null); const [mode, setMode] = useState<"translate" | "rotate">("translate"); + const [cOriginMm, setCOriginMm] = useState([0, 0, 0]); const [tiltOffsetMm, setTiltOffsetMm] = useState([0, 0, 0]); + const [physicalZero, setPhysicalZero] = useState({ x: 0, y: 0, z: 0, a: 0, b: 0, c: 0 }); const file = useRef(null); + useEffect(() => () => { for (const part of partsRef.current) disposeMachineScene(part.scene); }, []); + useEffect(() => { setMessage(""); setCOriginMm([0, 0, 0]); setTiltOffsetMm([0, 0, 0]); setPhysicalZero({ x: 0, y: 0, z: 0, a: 0, b: 0, c: 0 }); }, [coordinates]); + const selected = parts.find((part) => part.id === selectedId) ?? null; + const update = (id: string, values: Partial) => setParts((current) => current.map((part) => part.id === id ? { ...part, ...values } : part)); + const vectorInput = (label: string, value: Vec3, set: (value: Vec3) => void, unit: string) =>
{label} ({unit}){["X", "Y", "Z"].map((axis, index) => )}
; + const importFiles = async (list: FileList | File[] | null) => { + if (!list?.length) return; setPending(true); setMessage("正在读取 GLB 部件…"); + try { + const loaded = await Promise.all([...list].map(async (item) => loadMachinePart(await item.arrayBuffer(), item.name))); + setParts((current) => { + const next = [...current]; + for (const source of loaded) { + const role = MACHINE_PART_ROLES.find((candidate) => !next.some((part) => part.role === candidate)) ?? ""; + const parentRole = role ? expectedParentRole(role) : null; + const parentId = parentRole ? next.find((part) => part.role === parentRole)?.id ?? null : null; + next.push({ ...source, role, parentId, visible: true, showOrigin: true, originMm: zero3(), translationMm: zero3(), rotationDeg: zero3() }); + } + return next; + }); + setSelectedId(loaded[0].id); setMessage(`已导入 ${loaded.length} 个部件`); + } catch (error) { setMessage(error instanceof Error ? error.message : String(error)); } + finally { setPending(false); } + }; + const remove = (part: MachinePartDraft) => { disposeMachineScene(part.scene); setParts((current) => current.filter((item) => item.id !== part.id).map((item) => item.parentId === part.id ? { ...item, parentId: null } : item)); if (selectedId === part.id) setSelectedId(null); }; + const apply = async () => { + if (disabled) return; setPending(true); setMessage("正在生成机床层级和 URDF…"); let machine: ImportedMachine | null = null; + try { machine = await buildManagedMachine({ coordinates, parts, cOriginMm, tiltOffsetMm, physicalZero }); await onApply(machine); setMessage("三维机床已应用;请重新回零后运行程序"); } + catch (error) { if (machine) disposeMachineScene(machine.scene); setMessage(error instanceof Error ? error.message : String(error)); } + finally { setPending(false); } + }; + const exportGlb = async () => { + setPending(true); setMessage("正在生成包含 userData 的组合 GLB…"); let machine: ImportedMachine | null = null; + try { + machine = await buildManagedMachine({ coordinates, parts, cOriginMm, tiltOffsetMm, physicalZero }); + const bytes = await new GLTFExporter().parseAsync(machine.scene, { binary: true, trs: true, onlyVisible: false }); + const url = URL.createObjectURL(new Blob([bytes as ArrayBuffer], { type: "model/gltf-binary" })); + const link = document.createElement("a"); link.href = url; link.download = machine.filename; link.click(); setTimeout(() => URL.revokeObjectURL(url), 1000); + setMessage("组合 GLB 已导出,底座和整机场景包含机床标定 userData"); + } catch (error) { setMessage(error instanceof Error ? error.message : String(error)); } + finally { if (machine) disposeMachineScene(machine.scene); setPending(false); } + }; + const roleChange = (part: MachinePartDraft, role: MachinePartRole | "") => { + const parentRole = role ? expectedParentRole(role) : null; + update(part.id, { role, parentId: parentRole ? parts.find((item) => item.role === parentRole)?.id ?? null : null }); + }; + return
+ + setOpen(false)}> +
{parts.length}/8 部件
+
+ update(id, { translationMm, rotationDeg })} /> +
+

部件与层级

{parts.length ? parts.map((part) =>
) :

导入八个 GLB 部件后建立机械链。

}
+ {selected &&

{selected.filename}

{vectorInput("模型局部原点", selected.originMm, (originMm) => update(selected.id, { originMm }), "mm")}{vectorInput("部件平移", selected.translationMm, (translationMm) => update(selected.id, { translationMm }), "mm")}{vectorInput("部件旋转", selected.rotationDeg, (rotationDeg) => update(selected.id, { rotationDeg }), "deg")}
} +
+
+

机床标定

{vectorInput("C 轴原点", cOriginMm, setCOriginMm, "mm")}{vectorInput(`${coordinates === "XYZBC" ? "B" : "A"} 到 C 轴偏置`, tiltOffsetMm, setTiltOffsetMm, "mm")}
机床物理零点 (XYZ mm / ABC deg){["x", "y", "z", coordinates === "XYZBC" ? "b" : "a", "c"].map((axis) => )}
+
{message || (disabled ? "关机且程序空闲后可配置" : "配置写入运行模型和底座 userData")}
+ { const files = event.target.files ? [...event.target.files] : []; event.target.value = ""; void importFiles(files); }} /> +
+
; +} + +// Named wrapper keeps the recursive panel JSX readable while retaining one preview implementation. +const MachineManagerPanelPreview = ManagerPreview; diff --git a/web/react/src/RtcpProgramLibrary.tsx b/web/react/src/RtcpProgramLibrary.tsx new file mode 100644 index 0000000..5ee4cbd --- /dev/null +++ b/web/react/src/RtcpProgramLibrary.tsx @@ -0,0 +1,96 @@ +import { useEffect, useMemo, useState } from "react"; +import catalogJson from "./rtcp-program-manifest.json"; +import { DraggableDialog } from "./DraggableDialog"; + +export type RtcpProgram = { + id: string; + group: string; + label: string; + path: string; + coordinates: string[]; + role: "main" | "support" | "reference"; + features: string[]; + note: string; +}; + +type Catalog = { + schema: string; + total: number; + groups: Array<{ id: string; label: string; count: number }>; + programs: RtcpProgram[]; +}; + +export const RTCP_PROGRAM_CATALOG = catalogJson as Catalog; + +const roleLabel = (role: RtcpProgram["role"]) => role === "main" ? "主程序" : role === "support" ? "支持/子程序" : "参考程序"; +const assetUrl = (path: string) => `${import.meta.env.BASE_URL}${path}`; +const machineLabel = (coordinates: string) => coordinates === "XYZAC" ? "AC(XYZAC)" : coordinates === "XYZBC" ? "BC(XYZBC)" : coordinates; + +export function RtcpProgramLibrary({ coordinates, disabled, disabledReason, onLoad }: { + coordinates: string; + disabled: boolean; + disabledReason: string; + onLoad: (program: RtcpProgram, source: string) => Promise; +}) { + const defaultProgram = RTCP_PROGRAM_CATALOG.programs.find((program) => program.role === "main" && program.coordinates.includes(coordinates)) ?? RTCP_PROGRAM_CATALOG.programs[0]; + const [open, setOpen] = useState(false); + const [scope, setScope] = useState<"machine" | "all">("machine"); + const [selectedId, setSelectedId] = useState(defaultProgram.id); + const [source, setSource] = useState(""); + const [sourcePath, setSourcePath] = useState(""); + const [message, setMessage] = useState(""); + const [pending, setPending] = useState(false); + const selected = RTCP_PROGRAM_CATALOG.programs.find((program) => program.id === selectedId) ?? defaultProgram; + const compatible = selected.role === "main" && selected.coordinates.includes(coordinates); + const machinePrograms = useMemo(() => RTCP_PROGRAM_CATALOG.programs.filter((program) => program.coordinates.includes(coordinates)), [coordinates]); + const visiblePrograms = scope === "machine" ? machinePrograms : RTCP_PROGRAM_CATALOG.programs; + const grouped = RTCP_PROGRAM_CATALOG.groups.map((group) => ({ ...group, programs: visiblePrograms.filter((program) => program.group === group.id) })).filter((group) => group.programs.length > 0); + useEffect(() => { + setScope("machine"); setSelectedId(defaultProgram.id); setSource(""); setSourcePath(""); setMessage(""); + }, [coordinates, defaultProgram.id]); + + const readSource = async () => { + if (sourcePath === selected.path && source) return source; + const response = await fetch(assetUrl(selected.path)); + if (!response.ok) throw new Error(`程序资源读取失败: HTTP ${response.status}`); + const text = (await response.text()).replace(/\r\n/g, "\n").replace(/\r/g, "\n"); + if (!text.trim()) throw new Error("程序资源为空"); + setSource(text); + setSourcePath(selected.path); + return text; + }; + const run = async (action: "source" | "load") => { + setPending(true); setMessage(action === "source" ? "正在读取 LinuxCNC 源程序…" : "正在交给 LinuxCNC WASM 解析…"); + try { + const text = await readSource(); + if (action === "load") { await onLoad(selected, text); setMessage("程序已加载到 LinuxCNC WASM 控制器"); } + else setMessage(`已读取 ${text.split("\n").length} 行`); + } catch (error) { setMessage(error instanceof Error ? error.message : String(error)); } + finally { setPending(false); } + }; + const compatibility = compatible + ? `${coordinates} 当前机型可加载;运动由 LinuxCNC WASM 解释器与运动学执行。` + : selected.role !== "main" + ? `${roleLabel(selected.role)}用于 remap、O-call 或算法查阅,不作为独立主程序加载。` + : `需要 ${selected.coordinates.join("/")} 运动学;当前机型为 ${coordinates}。`; + + return
+ + setOpen(false)}> +
{machineLabel(coordinates)} 程序当前分类:{machinePrograms.length} 个可直接加载:{machinePrograms.filter((program) => program.role === "main").length}完整源程序:{RTCP_PROGRAM_CATALOG.total} 个
+ + +
类型
{roleLabel(selected.role)}
机型
{selected.coordinates.join(" / ")}
特点
{selected.features.join(" · ")}
源路径
{selected.path}
+

{selected.note}

{compatibility}

+
+ + + 下载 .ngc +
+ {message} + {source && sourcePath === selected.path &&
+
+ setOpen(false)}> +
三维机床{s ? `${s.coordinates} · ${model.filename}` : "内置模型"}
+
+ {s &&
{`底座 → X → Y → Z${s.profile === "trt-xyz-gantry/1" ? "" : " → 主轴箱"};底座 → ${s.coordinates[3]} → C`}

旋转中心 (mm):{["x", "y", "z"].map((c) => s.offsets[`${c}_rot_point`].toFixed(3)).join(" / ")}

轴间偏置 (mm):{["x", "y", "z"].map((c) => s.offsets[`${c}_offset`].toFixed(3)).join(" / ")}

运行限位、速度、回零和周期使用匹配的 INI;模型行程已校验。

} + {s && s.urdf !== model.scene.userData.linuxcncMachine?.urdf &&

模型已按当前几何参数调整,原 GLB 文件未改写。

} + {message || (disabled ? "关机且程序空闲后可导入" : "单个 GLB,包含层级模型及 URDF,最大 32 MiB")} + { const selected = event.target.files?.[0]; event.target.value = ""; if (selected) void run(selected); }} /> + +