diff --git a/Deploy.md b/Deploy.md
new file mode 100644
index 0000000..5951295
--- /dev/null
+++ b/Deploy.md
@@ -0,0 +1,83 @@
+# Deploy the model on your real Unitree robot
+
+This version shows an example of how to deploy the model on the Unittree Go1 robot (with Nvidia Jetson NX).
+
+## Install dependencies on Go1
+To deploy the trained model on Go1, please set up a folder on your robot, e.g. `parkour`, and copy the `rsl_rl` folder to it. Then, extract the zip files in `go1_ckpts` to the `parkour` folder. Finally, copy all the files in `onboard_script` to the `parkour` folder.
+
+1. Install ROS and the [unitree ros package for Go1](https://github.com/Tsinghua-MARS-Lab/unitree_ros_real.git) and follow the instructions to set up the robot on branch `go1`
+
+ Assuming the ros workspace is located in `parkour/unitree_ws`
+
+2. Install pytorch on a Python 3 environment. (take the Python3 virtual environment on Nvidia Jetson NX as an example)
+ ```bash
+ sudo apt-get install python3-pip python3-dev python3-venv
+ python3 -m venv parkour_venv
+ source parkour_venv/bin/activate
+ ```
+ Download the pip wheel file from [here](https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048) with v1.10.0. Then install it with
+ ```bash
+ pip install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
+ ```
+
+3. Install other dependencies and `rsl_rl`
+ ```bash
+ pip install numpy==1.16.4 numpy-ros
+ pip install -e ./rsl_rl
+ ```
+
+4. 3D print the camera mount for Go1 using the step file in `go1_ckpts/go1_camMount_30Down.step`. Use the two pairs of screw holes to mount the Intel Realsense D435i camera on the robot, as shown in the picture below.
+
+
+
+
+
+## Run the model on Go1
+
+***Disclaimer:*** *Always put a safety belt on the robot when the robot moves. The robot may fall down and cause damage to itself or the environment.*
+
+1. Put the robot on the ground, power on the robot, and turn the robot into developer mode. Make sure your Intel Realsense D435i camera is connected to the robot and the camera is installed on the mount.
+
+2. Launch 3 terminals onboard (whether 3 ssh connections from your computer or something else), named T_ros, T_visual, T_gru.
+
+
+3. In T_ros, run
+ ```bash
+ cd parkour/unitree_ws
+ source devel/setup.bash
+ roslaunch unitree_legged_real robot.launch
+ ```
+ This will launch the ros node for Go1. Please note that without `dryrun:=False` the robot will not move but do anything else. Set `dryrun:=False` only when you are ready to let the robot move.
+
+4. In T_visual, run
+ ```bash
+ cd parkour
+ source unitree_ws/devel/setup.bash
+ source parkour_venv/bin/activate
+ python go1_visual_embedding.py --logdir Nov02...
+ ```
+ where `Nov02...` is the logdir of the trained model.
+
+ Wait for the script to finish loading the model and get access to the Realsense sensor pipeline. Then, you can see the script prompting you: `"Realsense frame received. Sending embeddings..."`
+
+ Adding the `--enable_vis` option will enable the depth image message as a rostopic. You can visualize the depth image in rviz.
+
+5. In T_gru, run
+ ```bash
+ cd parkour
+ source unitree_ws/devel/setup.bash
+ source parkour_venv/bin/activate
+ python a1_ros_run.py --mode upboard --logdir Nov02...
+ ```
+ where `Nov02...` is the logdir of the trained model.
+
+ If the ros node is launched with `dryrun:=False`, the robot will start standing up. Otherwise, add `--debug` option on `a1_ros_run.py` to see the model output.
+
+ If the ros node is launched with `dryrun:=False`, the script will prompt you: `"Robot stood up! press R1 on the remote control to continue ..."` Press R1 on the remote control to start the standing policy
+
+ Pushing R-Y forward on the remote control to trigger the parkour policy. The robot will start running and jumping. Release the joystick to stop the robot.
+
+ Press R2 on the remote control to shutdown the gru script and the ros node. You can also use it in case of emergency.
+
+ Using the `--walkdir` option to load the walking policy e.g. (Oct24_16...), the standing policy will be replaced by the walking policy. Then you can use L-Y, L-X to control the x/y velocity of the robot and use R-X to control the yaw velocity of the robot.
+
diff --git a/README.md b/README.md
index f56a0f0..3e8c93e 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,8 @@ Conference on Robot Learning (CoRL) 2023, Oral
To install and run the code for training A1 in simulation, please clone this repository and follow the instructions in [legged_gym/README.md](legged_gym/README.md).
## Hardware Deployment ##
-TODO
+To deploy the trained model on your real robot, please follow the instructions in [Deploy.md](Deploy.md).
+
## Trouble Shooting ##
If you cannot run the distillation part or all graphics computing goes to GPU 0 dispite you have multiple GPUs and have set the CUDA_VISIBLE_DEVICES, please use docker to isolate each GPU.
@@ -35,7 +36,7 @@ If you cannot run the distillation part or all graphics computing goes to GPU 0
## To Do (will be done before Nov 2023) ##
- [ ] Go1 training pipeline in simulation
- [ ] A1 deployment code
-- [ ] Go1 deployment code
+- [x] Go1 deployment code
## Citation ##
If you find this project helpful to your research, please consider cite us! This is really important to us.
diff --git a/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip b/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip
new file mode 100644
index 0000000..b52faee
Binary files /dev/null and b/go1_ckpts/Nov02_16-18-16_674k_distill_crawljumpjumpleap_vDelay0.25-0.30_camPitch0.52_depthMax2.0_jumpNov02_11-07-49_leapVel1.5_jumpOffset0.05_oracleResetWhenSkill_fricMax2.0_noTanh_fromOct28_16-16-58.zip differ
diff --git a/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip b/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip
new file mode 100644
index 0000000..f5df556
Binary files /dev/null and b/go1_ckpts/Oct24_16-46-16_107k_WalkByRemote_rLinTrack2.0_pActRate1e-1_softDof0.6_noTanh_zeroResetAction_hackReset_EntropyCoef0.01_actionCliphard_fromOct24_15-05-23.zip differ
diff --git a/go1_ckpts/go1_camMount_30Down.step b/go1_ckpts/go1_camMount_30Down.step
new file mode 100644
index 0000000..bdb9e7d
--- /dev/null
+++ b/go1_ckpts/go1_camMount_30Down.step
@@ -0,0 +1,4211 @@
+ISO-10303-21;
+HEADER;
+
+/* File generated by Shapr3D Version 3.0 */
+
+FILE_DESCRIPTION(('HOOPS Exchange Step'),'2;1');
+
+FILE_NAME('/private/var/mobile/Containers/Data/Application/DA96FF07-AD28-45DC-BFF3-2353ED778072/tmp/export/temp_export',
+'2023-11-07T01:17:47-05:00',
+('mobile'),
+('Shapr3D Limited'),
+'HOOPS Exchange 2023.2',
+'Shapr3D',
+'Authorized');
+
+FILE_SCHEMA( ('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }') );
+
+ENDSEC;
+
+DATA;
+#3=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));
+#4=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(0.0174532925),#3);
+#5=(CONVERSION_BASED_UNIT('DEGREE',#4)NAMED_UNIT(#6)PLANE_ANGLE_UNIT());
+#6=DIMENSIONAL_EXPONENTS(0.,0.,0.,0.,0.,0.,0.);
+#7=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());
+#8=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));
+#9=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.000000E-05),#8,'DISTANCE_ACCURACY_VALUE','Maximum Tolerance applied to model');
+#10=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#9))GLOBAL_UNIT_ASSIGNED_CONTEXT((#8,#5,#7))REPRESENTATION_CONTEXT('','root'));
+#12=CARTESIAN_POINT('',(0.,0.,0.));
+#13=DIRECTION('',(0.,0.,1.));
+#14=DIRECTION('',(1.,0.,0.));
+#15=AXIS2_PLACEMENT_3D('',#12,#13,#14);
+#27=CARTESIAN_POINT('',(20.,0.,0.));
+#28=DIRECTION('',(1.,0.,0.));
+#29=DIRECTION('',(0.,1.,0.));
+#30=AXIS2_PLACEMENT_3D('',#27,#28,#29);
+#31=PLANE('',#30);
+#32=CARTESIAN_POINT('',(20.,2.384358327,8.853797026));
+#33=VERTEX_POINT('',#32);
+#34=CARTESIAN_POINT('',(20.,-15.854009142,26.666750919));
+#35=VERTEX_POINT('',#34);
+#36=CARTESIAN_POINT('',(20.,2.384358327,8.853797026));
+#37=DIRECTION('',(0.,-0.715400991,0.69871412));
+#38=VECTOR('',#37,25.493908573);
+#39=LINE('',#36,#38);
+#40=EDGE_CURVE('',#33,#35,#39,.T.);
+#41=ORIENTED_EDGE('',*,*,#40,.T.);
+#42=CARTESIAN_POINT('',(20.,5.485205765,26.666750919));
+#43=VERTEX_POINT('',#42);
+#44=CARTESIAN_POINT('',(20.,-15.854009142,26.666750919));
+#45=DIRECTION('',(0.,1.,0.));
+#46=VECTOR('',#45,21.339214907);
+#47=LINE('',#44,#46);
+#48=EDGE_CURVE('',#35,#43,#47,.T.);
+#49=ORIENTED_EDGE('',*,*,#48,.T.);
+#50=CARTESIAN_POINT('',(20.,12.062407326,23.810074094));
+#51=VERTEX_POINT('',#50);
+#52=CARTESIAN_POINT('',(20.,5.485205765,17.666750919));
+#53=DIRECTION('',(-1.,-0.,-0.));
+#54=DIRECTION('',(0.,0.,-1.));
+#55=AXIS2_PLACEMENT_3D('',#52,#53,#54);
+#56=CIRCLE('',#55,9.);
+#57=EDGE_CURVE('',#43,#51,#56,.T.);
+#58=ORIENTED_EDGE('',*,*,#57,.T.);
+#59=CARTESIAN_POINT('',(20.,22.857448803,12.25262194));
+#60=VERTEX_POINT('',#59);
+#61=CARTESIAN_POINT('',(20.,12.062407326,23.810074094));
+#62=DIRECTION('',(0.,0.682591464,-0.730800173));
+#63=VECTOR('',#62,15.814791202);
+#64=LINE('',#61,#63);
+#65=EDGE_CURVE('',#51,#60,#64,.T.);
+#66=ORIENTED_EDGE('',*,*,#65,.T.);
+#67=CARTESIAN_POINT('',(20.,28.001846852,8.));
+#68=VERTEX_POINT('',#67);
+#69=CARTESIAN_POINT('',(20.,41.858253313,30.));
+#70=DIRECTION('',(1.,0.,0.));
+#71=DIRECTION('',(0.,0.,-1.));
+#72=AXIS2_PLACEMENT_3D('',#69,#70,#71);
+#73=CIRCLE('',#72,26.);
+#74=EDGE_CURVE('',#60,#68,#73,.T.);
+#75=ORIENTED_EDGE('',*,*,#74,.T.);
+#76=CARTESIAN_POINT('',(20.,4.480500687,8.));
+#77=VERTEX_POINT('',#76);
+#78=CARTESIAN_POINT('',(20.,28.001846852,8.));
+#79=DIRECTION('',(0.,-1.,0.));
+#80=VECTOR('',#79,23.521346166);
+#81=LINE('',#78,#80);
+#82=EDGE_CURVE('',#68,#77,#81,.T.);
+#83=ORIENTED_EDGE('',*,*,#82,.T.);
+#84=CARTESIAN_POINT('',(20.,4.480500687,11.));
+#85=DIRECTION('',(1.,0.,0.));
+#86=DIRECTION('',(0.,0.,-1.));
+#87=AXIS2_PLACEMENT_3D('',#84,#85,#86);
+#88=CIRCLE('',#87,3.);
+#89=EDGE_CURVE('',#33,#77,#88,.T.);
+#90=ORIENTED_EDGE('',*,*,#89,.F.);
+#91=EDGE_LOOP('',(#41,#49,#58,#66,#75,#83,#90));
+#92=FACE_BOUND('',#91,.T.);
+#93=ADVANCED_FACE('',(#92),#31,.F.);
+#94=CARTESIAN_POINT('',(-20.,0.,0.));
+#95=DIRECTION('',(-1.,0.,0.));
+#96=DIRECTION('',(0.,1.,0.));
+#97=AXIS2_PLACEMENT_3D('',#94,#95,#96);
+#98=PLANE('',#97);
+#99=CARTESIAN_POINT('',(-20.,4.480500687,8.));
+#100=VERTEX_POINT('',#99);
+#101=CARTESIAN_POINT('',(-20.,28.001846852,8.));
+#102=VERTEX_POINT('',#101);
+#103=CARTESIAN_POINT('',(-20.,4.480500687,8.));
+#104=DIRECTION('',(-0.,1.,-0.));
+#105=VECTOR('',#104,23.521346166);
+#106=LINE('',#103,#105);
+#107=EDGE_CURVE('',#100,#102,#106,.T.);
+#108=ORIENTED_EDGE('',*,*,#107,.T.);
+#109=CARTESIAN_POINT('',(-20.,22.857448803,12.25262194));
+#110=VERTEX_POINT('',#109);
+#111=CARTESIAN_POINT('',(-20.,41.858253313,30.));
+#112=DIRECTION('',(-1.,0.,0.));
+#113=DIRECTION('',(0.,0.,1.));
+#114=AXIS2_PLACEMENT_3D('',#111,#112,#113);
+#115=CIRCLE('',#114,26.);
+#116=EDGE_CURVE('',#102,#110,#115,.T.);
+#117=ORIENTED_EDGE('',*,*,#116,.T.);
+#118=CARTESIAN_POINT('',(-20.,12.062407326,23.810074094));
+#119=VERTEX_POINT('',#118);
+#120=CARTESIAN_POINT('',(-20.,22.857448803,12.25262194));
+#121=DIRECTION('',(-0.,-0.682591464,0.730800173));
+#122=VECTOR('',#121,15.814791202);
+#123=LINE('',#120,#122);
+#124=EDGE_CURVE('',#110,#119,#123,.T.);
+#125=ORIENTED_EDGE('',*,*,#124,.T.);
+#126=CARTESIAN_POINT('',(-20.,5.485205765,26.666750919));
+#127=VERTEX_POINT('',#126);
+#128=CARTESIAN_POINT('',(-20.,5.485205765,17.666750919));
+#129=DIRECTION('',(1.,-0.,-0.));
+#130=DIRECTION('',(0.,0.,1.));
+#131=AXIS2_PLACEMENT_3D('',#128,#129,#130);
+#132=CIRCLE('',#131,9.);
+#133=EDGE_CURVE('',#119,#127,#132,.T.);
+#134=ORIENTED_EDGE('',*,*,#133,.T.);
+#135=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919));
+#136=VERTEX_POINT('',#135);
+#137=CARTESIAN_POINT('',(-20.,5.485205765,26.666750919));
+#138=DIRECTION('',(-0.,-1.,-0.));
+#139=VECTOR('',#138,21.339214907);
+#140=LINE('',#137,#139);
+#141=EDGE_CURVE('',#127,#136,#140,.T.);
+#142=ORIENTED_EDGE('',*,*,#141,.T.);
+#143=CARTESIAN_POINT('',(-20.,2.384358327,8.853797026));
+#144=VERTEX_POINT('',#143);
+#145=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919));
+#146=DIRECTION('',(0.,0.715400991,-0.69871412));
+#147=VECTOR('',#146,25.493908573);
+#148=LINE('',#145,#147);
+#149=EDGE_CURVE('',#136,#144,#148,.T.);
+#150=ORIENTED_EDGE('',*,*,#149,.T.);
+#151=CARTESIAN_POINT('',(-20.,4.480500687,11.));
+#152=DIRECTION('',(-1.,0.,0.));
+#153=DIRECTION('',(0.,0.,1.));
+#154=AXIS2_PLACEMENT_3D('',#151,#152,#153);
+#155=CIRCLE('',#154,3.);
+#156=EDGE_CURVE('',#100,#144,#155,.T.);
+#157=ORIENTED_EDGE('',*,*,#156,.F.);
+#158=EDGE_LOOP('',(#108,#117,#125,#134,#142,#150,#157));
+#159=FACE_BOUND('',#158,.T.);
+#160=ADVANCED_FACE('',(#159),#98,.F.);
+#161=CARTESIAN_POINT('',(0.,62.,5.));
+#162=DIRECTION('',(-0.,0.,1.));
+#163=DIRECTION('',(1.,0.,0.));
+#164=AXIS2_PLACEMENT_3D('',#161,#162,#163);
+#165=PLANE('',#164);
+#166=CARTESIAN_POINT('',(-10.75,52.,5.));
+#167=VERTEX_POINT('',#166);
+#168=CARTESIAN_POINT('',(-9.,52.,5.));
+#169=DIRECTION('',(0.,0.,-1.));
+#170=DIRECTION('',(-1.,0.,0.));
+#171=AXIS2_PLACEMENT_3D('',#168,#169,#170);
+#172=CIRCLE('',#171,1.75);
+#173=EDGE_CURVE('',#167,#167,#172,.T.);
+#174=ORIENTED_EDGE('',*,*,#173,.T.);
+#175=EDGE_LOOP('',(#174));
+#176=FACE_BOUND('',#175,.T.);
+#177=CARTESIAN_POINT('',(7.25,52.,5.));
+#178=VERTEX_POINT('',#177);
+#179=CARTESIAN_POINT('',(9.,52.,5.));
+#180=DIRECTION('',(0.,0.,-1.));
+#181=DIRECTION('',(-1.,0.,0.));
+#182=AXIS2_PLACEMENT_3D('',#179,#180,#181);
+#183=CIRCLE('',#182,1.75);
+#184=EDGE_CURVE('',#178,#178,#183,.T.);
+#185=ORIENTED_EDGE('',*,*,#184,.T.);
+#186=EDGE_LOOP('',(#185));
+#187=FACE_BOUND('',#186,.T.);
+#188=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#189=VERTEX_POINT('',#188);
+#190=CARTESIAN_POINT('',(-17.,4.480500687,5.));
+#191=VERTEX_POINT('',#190);
+#192=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#193=DIRECTION('',(0.,-1.,0.));
+#194=VECTOR('',#193,37.377752626);
+#195=LINE('',#192,#194);
+#196=EDGE_CURVE('',#189,#191,#195,.T.);
+#197=ORIENTED_EDGE('',*,*,#196,.T.);
+#198=CARTESIAN_POINT('',(17.,4.480500687,5.));
+#199=VERTEX_POINT('',#198);
+#200=CARTESIAN_POINT('',(-17.,4.480500687,5.));
+#201=DIRECTION('',(1.,-0.,0.));
+#202=VECTOR('',#201,34.);
+#203=LINE('',#200,#202);
+#204=EDGE_CURVE('',#191,#199,#203,.T.);
+#205=ORIENTED_EDGE('',*,*,#204,.T.);
+#206=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#207=VERTEX_POINT('',#206);
+#208=CARTESIAN_POINT('',(17.,4.480500687,5.));
+#209=DIRECTION('',(-0.,1.,-0.));
+#210=VECTOR('',#209,37.377752626);
+#211=LINE('',#208,#210);
+#212=EDGE_CURVE('',#199,#207,#211,.T.);
+#213=ORIENTED_EDGE('',*,*,#212,.T.);
+#214=CARTESIAN_POINT('',(23.5,41.858253313,5.));
+#215=VERTEX_POINT('',#214);
+#216=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#217=DIRECTION('',(1.,-0.,0.));
+#218=VECTOR('',#217,6.5);
+#219=LINE('',#216,#218);
+#220=EDGE_CURVE('',#207,#215,#219,.T.);
+#221=ORIENTED_EDGE('',*,*,#220,.T.);
+#222=CARTESIAN_POINT('',(23.5,60.5,5.));
+#223=VERTEX_POINT('',#222);
+#224=CARTESIAN_POINT('',(23.5,41.858253313,5.));
+#225=DIRECTION('',(-0.,1.,-0.));
+#226=VECTOR('',#225,18.641746687);
+#227=LINE('',#224,#226);
+#228=EDGE_CURVE('',#215,#223,#227,.T.);
+#229=ORIENTED_EDGE('',*,*,#228,.T.);
+#230=CARTESIAN_POINT('',(-23.5,60.5,5.));
+#231=VERTEX_POINT('',#230);
+#232=CARTESIAN_POINT('',(23.5,60.5,5.));
+#233=DIRECTION('',(-1.,0.,-0.));
+#234=VECTOR('',#233,47.);
+#235=LINE('',#232,#234);
+#236=EDGE_CURVE('',#223,#231,#235,.T.);
+#237=ORIENTED_EDGE('',*,*,#236,.T.);
+#238=CARTESIAN_POINT('',(-23.5,41.858253313,5.));
+#239=VERTEX_POINT('',#238);
+#240=CARTESIAN_POINT('',(-23.5,60.5,5.));
+#241=DIRECTION('',(0.,-1.,0.));
+#242=VECTOR('',#241,18.641746687);
+#243=LINE('',#240,#242);
+#244=EDGE_CURVE('',#231,#239,#243,.T.);
+#245=ORIENTED_EDGE('',*,*,#244,.T.);
+#246=CARTESIAN_POINT('',(-23.5,41.858253313,5.));
+#247=DIRECTION('',(1.,-0.,0.));
+#248=VECTOR('',#247,6.5);
+#249=LINE('',#246,#248);
+#250=EDGE_CURVE('',#239,#189,#249,.T.);
+#251=ORIENTED_EDGE('',*,*,#250,.T.);
+#252=EDGE_LOOP('',(#197,#205,#213,#221,#229,#237,#245,#251));
+#253=FACE_BOUND('',#252,.T.);
+#254=ADVANCED_FACE('',(#176,#187,#253),#165,.T.);
+#255=CARTESIAN_POINT('',(25.,62.,2.5));
+#256=DIRECTION('',(1.,0.,0.));
+#257=DIRECTION('',(0.,0.,-1.));
+#258=AXIS2_PLACEMENT_3D('',#255,#256,#257);
+#259=PLANE('',#258);
+#260=CARTESIAN_POINT('',(25.,5.485205765,26.166750919));
+#261=VERTEX_POINT('',#260);
+#262=CARTESIAN_POINT('',(25.,-19.224694785,26.166750919));
+#263=VERTEX_POINT('',#262);
+#264=CARTESIAN_POINT('',(25.,5.485205765,26.166750919));
+#265=DIRECTION('',(-0.,-1.,-0.));
+#266=VECTOR('',#265,24.70990055);
+#267=LINE('',#264,#266);
+#268=EDGE_CURVE('',#261,#263,#267,.T.);
+#269=ORIENTED_EDGE('',*,*,#268,.T.);
+#270=CARTESIAN_POINT('',(25.,-19.656977849,26.187562226));
+#271=VERTEX_POINT('',#270);
+#272=CARTESIAN_POINT('',(25.,-19.224694785,30.666750919));
+#273=DIRECTION('',(-1.,-0.,-0.));
+#274=DIRECTION('',(0.,0.,-1.));
+#275=AXIS2_PLACEMENT_3D('',#272,#273,#274);
+#276=CIRCLE('',#275,4.5);
+#277=EDGE_CURVE('',#263,#271,#276,.T.);
+#278=ORIENTED_EDGE('',*,*,#277,.T.);
+#279=CARTESIAN_POINT('',(25.,3.4935706,3.577004957));
+#280=VERTEX_POINT('',#279);
+#281=CARTESIAN_POINT('',(25.,3.4935706,3.577004957));
+#282=DIRECTION('',(0.,-0.715400991,0.69871412));
+#283=VECTOR('',#282,32.360240937);
+#284=LINE('',#281,#283);
+#285=EDGE_CURVE('',#280,#271,#284,.T.);
+#286=ORIENTED_EDGE('',*,*,#285,.F.);
+#287=CARTESIAN_POINT('',(25.,0.302940467,0.31017537));
+#288=VERTEX_POINT('',#287);
+#289=CARTESIAN_POINT('',(25.,3.4935706,3.577004957));
+#290=DIRECTION('',(0.,-0.69871412,-0.715400991));
+#291=VECTOR('',#290,4.566431451);
+#292=LINE('',#289,#291);
+#293=EDGE_CURVE('',#280,#288,#292,.T.);
+#294=ORIENTED_EDGE('',*,*,#293,.T.);
+#295=CARTESIAN_POINT('',(25.,2.036591221,0.));
+#296=VERTEX_POINT('',#295);
+#297=CARTESIAN_POINT('',(25.,2.036591221,5.));
+#298=DIRECTION('',(1.,0.,0.));
+#299=DIRECTION('',(0.,0.,-1.));
+#300=AXIS2_PLACEMENT_3D('',#297,#298,#299);
+#301=CIRCLE('',#300,5.);
+#302=EDGE_CURVE('',#288,#296,#301,.T.);
+#303=ORIENTED_EDGE('',*,*,#302,.T.);
+#304=CARTESIAN_POINT('',(25.,60.5,0.));
+#305=VERTEX_POINT('',#304);
+#306=CARTESIAN_POINT('',(25.,60.5,0.));
+#307=DIRECTION('',(0.,-1.,0.));
+#308=VECTOR('',#307,58.463408779);
+#309=LINE('',#306,#308);
+#310=EDGE_CURVE('',#305,#296,#309,.T.);
+#311=ORIENTED_EDGE('',*,*,#310,.F.);
+#312=CARTESIAN_POINT('',(25.,60.5,3.5));
+#313=VERTEX_POINT('',#312);
+#314=CARTESIAN_POINT('',(25.,60.5,0.));
+#315=DIRECTION('',(0.,0.,1.));
+#316=VECTOR('',#315,3.5);
+#317=LINE('',#314,#316);
+#318=EDGE_CURVE('',#305,#313,#317,.T.);
+#319=ORIENTED_EDGE('',*,*,#318,.T.);
+#320=CARTESIAN_POINT('',(25.,41.858253313,3.5));
+#321=VERTEX_POINT('',#320);
+#322=CARTESIAN_POINT('',(25.,60.5,3.5));
+#323=DIRECTION('',(0.,-1.,0.));
+#324=VECTOR('',#323,18.641746687);
+#325=LINE('',#322,#324);
+#326=EDGE_CURVE('',#313,#321,#325,.T.);
+#327=ORIENTED_EDGE('',*,*,#326,.T.);
+#328=CARTESIAN_POINT('',(25.,22.492048716,11.911326208));
+#329=VERTEX_POINT('',#328);
+#330=CARTESIAN_POINT('',(25.,41.858253313,30.));
+#331=DIRECTION('',(-1.,-0.,-0.));
+#332=DIRECTION('',(0.,0.,-1.));
+#333=AXIS2_PLACEMENT_3D('',#330,#331,#332);
+#334=CIRCLE('',#333,26.5);
+#335=EDGE_CURVE('',#321,#329,#334,.T.);
+#336=ORIENTED_EDGE('',*,*,#335,.T.);
+#337=CARTESIAN_POINT('',(25.,11.69700724,23.468778362));
+#338=VERTEX_POINT('',#337);
+#339=CARTESIAN_POINT('',(25.,22.492048716,11.911326208));
+#340=DIRECTION('',(-0.,-0.682591464,0.730800173));
+#341=VECTOR('',#340,15.814791202);
+#342=LINE('',#339,#341);
+#343=EDGE_CURVE('',#329,#338,#342,.T.);
+#344=ORIENTED_EDGE('',*,*,#343,.T.);
+#345=CARTESIAN_POINT('',(25.,5.485205765,17.666750919));
+#346=DIRECTION('',(1.,0.,0.));
+#347=DIRECTION('',(0.,0.,-1.));
+#348=AXIS2_PLACEMENT_3D('',#345,#346,#347);
+#349=CIRCLE('',#348,8.5);
+#350=EDGE_CURVE('',#338,#261,#349,.T.);
+#351=ORIENTED_EDGE('',*,*,#350,.T.);
+#352=EDGE_LOOP('',(#269,#278,#286,#294,#303,#311,#319,#327,#336,#344,#351));
+#353=FACE_BOUND('',#352,.T.);
+#354=ADVANCED_FACE('',(#353),#259,.T.);
+#355=CARTESIAN_POINT('',(-25.,62.,2.5));
+#356=DIRECTION('',(-1.,0.,0.));
+#357=DIRECTION('',(0.,0.,1.));
+#358=AXIS2_PLACEMENT_3D('',#355,#356,#357);
+#359=PLANE('',#358);
+#360=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226));
+#361=VERTEX_POINT('',#360);
+#362=CARTESIAN_POINT('',(-25.,3.4935706,3.577004957));
+#363=VERTEX_POINT('',#362);
+#364=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226));
+#365=DIRECTION('',(0.,0.715400991,-0.69871412));
+#366=VECTOR('',#365,32.360240937);
+#367=LINE('',#364,#366);
+#368=EDGE_CURVE('',#361,#363,#367,.T.);
+#369=ORIENTED_EDGE('',*,*,#368,.F.);
+#370=CARTESIAN_POINT('',(-25.,-19.224694785,26.166750919));
+#371=VERTEX_POINT('',#370);
+#372=CARTESIAN_POINT('',(-25.,-19.224694785,30.666750919));
+#373=DIRECTION('',(1.,-0.,-0.));
+#374=DIRECTION('',(0.,0.,1.));
+#375=AXIS2_PLACEMENT_3D('',#372,#373,#374);
+#376=CIRCLE('',#375,4.5);
+#377=EDGE_CURVE('',#361,#371,#376,.T.);
+#378=ORIENTED_EDGE('',*,*,#377,.T.);
+#379=CARTESIAN_POINT('',(-25.,5.485205765,26.166750919));
+#380=VERTEX_POINT('',#379);
+#381=CARTESIAN_POINT('',(-25.,-19.224694785,26.166750919));
+#382=DIRECTION('',(0.,1.,0.));
+#383=VECTOR('',#382,24.70990055);
+#384=LINE('',#381,#383);
+#385=EDGE_CURVE('',#371,#380,#384,.T.);
+#386=ORIENTED_EDGE('',*,*,#385,.T.);
+#387=CARTESIAN_POINT('',(-25.,11.69700724,23.468778362));
+#388=VERTEX_POINT('',#387);
+#389=CARTESIAN_POINT('',(-25.,5.485205765,17.666750919));
+#390=DIRECTION('',(-1.,0.,0.));
+#391=DIRECTION('',(0.,0.,1.));
+#392=AXIS2_PLACEMENT_3D('',#389,#390,#391);
+#393=CIRCLE('',#392,8.5);
+#394=EDGE_CURVE('',#380,#388,#393,.T.);
+#395=ORIENTED_EDGE('',*,*,#394,.T.);
+#396=CARTESIAN_POINT('',(-25.,22.492048716,11.911326208));
+#397=VERTEX_POINT('',#396);
+#398=CARTESIAN_POINT('',(-25.,11.69700724,23.468778362));
+#399=DIRECTION('',(0.,0.682591464,-0.730800173));
+#400=VECTOR('',#399,15.814791202);
+#401=LINE('',#398,#400);
+#402=EDGE_CURVE('',#388,#397,#401,.T.);
+#403=ORIENTED_EDGE('',*,*,#402,.T.);
+#404=CARTESIAN_POINT('',(-25.,41.858253313,3.5));
+#405=VERTEX_POINT('',#404);
+#406=CARTESIAN_POINT('',(-25.,41.858253313,30.));
+#407=DIRECTION('',(1.,-0.,-0.));
+#408=DIRECTION('',(0.,0.,1.));
+#409=AXIS2_PLACEMENT_3D('',#406,#407,#408);
+#410=CIRCLE('',#409,26.5);
+#411=EDGE_CURVE('',#397,#405,#410,.T.);
+#412=ORIENTED_EDGE('',*,*,#411,.T.);
+#413=CARTESIAN_POINT('',(-25.,60.5,3.5));
+#414=VERTEX_POINT('',#413);
+#415=CARTESIAN_POINT('',(-25.,41.858253313,3.5));
+#416=DIRECTION('',(-0.,1.,-0.));
+#417=VECTOR('',#416,18.641746687);
+#418=LINE('',#415,#417);
+#419=EDGE_CURVE('',#405,#414,#418,.T.);
+#420=ORIENTED_EDGE('',*,*,#419,.T.);
+#421=CARTESIAN_POINT('',(-25.,60.5,0.));
+#422=VERTEX_POINT('',#421);
+#423=CARTESIAN_POINT('',(-25.,60.5,3.5));
+#424=DIRECTION('',(0.,0.,-1.));
+#425=VECTOR('',#424,3.5);
+#426=LINE('',#423,#425);
+#427=EDGE_CURVE('',#414,#422,#426,.T.);
+#428=ORIENTED_EDGE('',*,*,#427,.T.);
+#429=CARTESIAN_POINT('',(-25.,2.036591221,0.));
+#430=VERTEX_POINT('',#429);
+#431=CARTESIAN_POINT('',(-25.,60.5,0.));
+#432=DIRECTION('',(0.,-1.,0.));
+#433=VECTOR('',#432,58.463408779);
+#434=LINE('',#431,#433);
+#435=EDGE_CURVE('',#422,#430,#434,.T.);
+#436=ORIENTED_EDGE('',*,*,#435,.T.);
+#437=CARTESIAN_POINT('',(-25.,0.302940467,0.31017537));
+#438=VERTEX_POINT('',#437);
+#439=CARTESIAN_POINT('',(-25.,2.036591221,5.));
+#440=DIRECTION('',(-1.,0.,0.));
+#441=DIRECTION('',(0.,0.,1.));
+#442=AXIS2_PLACEMENT_3D('',#439,#440,#441);
+#443=CIRCLE('',#442,5.);
+#444=EDGE_CURVE('',#430,#438,#443,.T.);
+#445=ORIENTED_EDGE('',*,*,#444,.T.);
+#446=CARTESIAN_POINT('',(-25.,3.4935706,3.577004957));
+#447=DIRECTION('',(0.,-0.69871412,-0.715400991));
+#448=VECTOR('',#447,4.566431451);
+#449=LINE('',#446,#448);
+#450=EDGE_CURVE('',#363,#438,#449,.T.);
+#451=ORIENTED_EDGE('',*,*,#450,.F.);
+#452=EDGE_LOOP('',(#369,#378,#386,#395,#403,#412,#420,#428,#436,#445,#451));
+#453=FACE_BOUND('',#452,.T.);
+#454=ADVANCED_FACE('',(#453),#359,.T.);
+#455=CARTESIAN_POINT('',(0.,62.,0.));
+#456=DIRECTION('',(0.,0.,1.));
+#457=DIRECTION('',(1.,0.,0.));
+#458=AXIS2_PLACEMENT_3D('',#455,#456,#457);
+#459=PLANE('',#458);
+#460=CARTESIAN_POINT('',(-10.75,52.,0.));
+#461=VERTEX_POINT('',#460);
+#462=CARTESIAN_POINT('',(-9.,52.,0.));
+#463=DIRECTION('',(0.,0.,-1.));
+#464=DIRECTION('',(-1.,0.,0.));
+#465=AXIS2_PLACEMENT_3D('',#462,#463,#464);
+#466=CIRCLE('',#465,1.75);
+#467=EDGE_CURVE('',#461,#461,#466,.T.);
+#468=ORIENTED_EDGE('',*,*,#467,.F.);
+#469=EDGE_LOOP('',(#468));
+#470=FACE_BOUND('',#469,.T.);
+#471=CARTESIAN_POINT('',(7.25,52.,0.));
+#472=VERTEX_POINT('',#471);
+#473=CARTESIAN_POINT('',(9.,52.,0.));
+#474=DIRECTION('',(0.,0.,-1.));
+#475=DIRECTION('',(-1.,0.,0.));
+#476=AXIS2_PLACEMENT_3D('',#473,#474,#475);
+#477=CIRCLE('',#476,1.75);
+#478=EDGE_CURVE('',#472,#472,#477,.T.);
+#479=ORIENTED_EDGE('',*,*,#478,.F.);
+#480=EDGE_LOOP('',(#479));
+#481=FACE_BOUND('',#480,.T.);
+#482=ORIENTED_EDGE('',*,*,#435,.F.);
+#483=CARTESIAN_POINT('',(-23.5,62.,0.));
+#484=VERTEX_POINT('',#483);
+#485=CARTESIAN_POINT('',(-23.5,60.5,0.));
+#486=DIRECTION('',(-0.,-0.,-1.));
+#487=DIRECTION('',(1.,0.,-0.));
+#488=AXIS2_PLACEMENT_3D('',#485,#486,#487);
+#489=CIRCLE('',#488,1.5);
+#490=EDGE_CURVE('',#422,#484,#489,.T.);
+#491=ORIENTED_EDGE('',*,*,#490,.T.);
+#492=CARTESIAN_POINT('',(23.5,62.,0.));
+#493=VERTEX_POINT('',#492);
+#494=CARTESIAN_POINT('',(23.5,62.,0.));
+#495=DIRECTION('',(-1.,-0.,0.));
+#496=VECTOR('',#495,47.);
+#497=LINE('',#494,#496);
+#498=EDGE_CURVE('',#493,#484,#497,.T.);
+#499=ORIENTED_EDGE('',*,*,#498,.F.);
+#500=CARTESIAN_POINT('',(23.5,60.5,0.));
+#501=DIRECTION('',(-0.,-0.,-1.));
+#502=DIRECTION('',(1.,0.,-0.));
+#503=AXIS2_PLACEMENT_3D('',#500,#501,#502);
+#504=CIRCLE('',#503,1.5);
+#505=EDGE_CURVE('',#493,#305,#504,.T.);
+#506=ORIENTED_EDGE('',*,*,#505,.T.);
+#507=ORIENTED_EDGE('',*,*,#310,.T.);
+#508=CARTESIAN_POINT('',(25.,2.036591221,0.));
+#509=DIRECTION('',(-1.,0.,0.));
+#510=VECTOR('',#509,50.);
+#511=LINE('',#508,#510);
+#512=EDGE_CURVE('',#296,#430,#511,.T.);
+#513=ORIENTED_EDGE('',*,*,#512,.T.);
+#514=EDGE_LOOP('',(#482,#491,#499,#506,#507,#513));
+#515=FACE_BOUND('',#514,.T.);
+#516=ADVANCED_FACE('',(#470,#481,#515),#459,.F.);
+#517=CARTESIAN_POINT('',(0.,62.,0.));
+#518=DIRECTION('',(0.,-1.,0.));
+#519=DIRECTION('',(0.,0.,-1.));
+#520=AXIS2_PLACEMENT_3D('',#517,#518,#519);
+#521=PLANE('',#520);
+#522=ORIENTED_EDGE('',*,*,#498,.T.);
+#523=CARTESIAN_POINT('',(-23.5,62.,3.5));
+#524=VERTEX_POINT('',#523);
+#525=CARTESIAN_POINT('',(-23.5,62.,-0.));
+#526=DIRECTION('',(-0.,-0.,1.));
+#527=VECTOR('',#526,3.5);
+#528=LINE('',#525,#527);
+#529=EDGE_CURVE('',#484,#524,#528,.T.);
+#530=ORIENTED_EDGE('',*,*,#529,.T.);
+#531=CARTESIAN_POINT('',(23.5,62.,3.5));
+#532=VERTEX_POINT('',#531);
+#533=CARTESIAN_POINT('',(-23.5,62.,3.5));
+#534=DIRECTION('',(1.,-0.,0.));
+#535=VECTOR('',#534,47.);
+#536=LINE('',#533,#535);
+#537=EDGE_CURVE('',#524,#532,#536,.T.);
+#538=ORIENTED_EDGE('',*,*,#537,.T.);
+#539=CARTESIAN_POINT('',(23.5,62.,3.5));
+#540=DIRECTION('',(-0.,-0.,-1.));
+#541=VECTOR('',#540,3.5);
+#542=LINE('',#539,#541);
+#543=EDGE_CURVE('',#532,#493,#542,.T.);
+#544=ORIENTED_EDGE('',*,*,#543,.T.);
+#545=EDGE_LOOP('',(#522,#530,#538,#544));
+#546=FACE_BOUND('',#545,.T.);
+#547=ADVANCED_FACE('',(#546),#521,.F.);
+#548=CARTESIAN_POINT('',(9.,52.,5.));
+#549=DIRECTION('',(0.,0.,-1.));
+#550=DIRECTION('',(-1.,0.,0.));
+#551=AXIS2_PLACEMENT_3D('',#548,#549,#550);
+#552=CYLINDRICAL_SURFACE('',#551,1.75);
+#553=CARTESIAN_POINT('',(7.25,52.,0.));
+#554=DIRECTION('',(-0.,-0.,1.));
+#555=VECTOR('',#554,5.);
+#556=LINE('',#553,#555);
+#557=EDGE_CURVE('',#472,#178,#556,.T.);
+#558=ORIENTED_EDGE('',*,*,#557,.F.);
+#559=ORIENTED_EDGE('',*,*,#478,.T.);
+#560=ORIENTED_EDGE('',*,*,#557,.T.);
+#561=ORIENTED_EDGE('',*,*,#184,.F.);
+#562=EDGE_LOOP('',(#558,#559,#560,#561));
+#563=FACE_BOUND('',#562,.T.);
+#564=ADVANCED_FACE('',(#563),#552,.F.);
+#565=CARTESIAN_POINT('',(-9.,52.,5.));
+#566=DIRECTION('',(0.,0.,-1.));
+#567=DIRECTION('',(-1.,0.,0.));
+#568=AXIS2_PLACEMENT_3D('',#565,#566,#567);
+#569=CYLINDRICAL_SURFACE('',#568,1.75);
+#570=CARTESIAN_POINT('',(-10.75,52.,0.));
+#571=DIRECTION('',(-0.,-0.,1.));
+#572=VECTOR('',#571,5.);
+#573=LINE('',#570,#572);
+#574=EDGE_CURVE('',#461,#167,#573,.T.);
+#575=ORIENTED_EDGE('',*,*,#574,.F.);
+#576=ORIENTED_EDGE('',*,*,#467,.T.);
+#577=ORIENTED_EDGE('',*,*,#574,.T.);
+#578=ORIENTED_EDGE('',*,*,#173,.F.);
+#579=EDGE_LOOP('',(#575,#576,#577,#578));
+#580=FACE_BOUND('',#579,.T.);
+#581=ADVANCED_FACE('',(#580),#569,.F.);
+#582=CARTESIAN_POINT('',(0.,3.4935706,3.577004957));
+#583=DIRECTION('',(0.,0.69871412,0.715400991));
+#584=DIRECTION('',(-1.,0.,0.));
+#585=AXIS2_PLACEMENT_3D('',#582,#583,#584);
+#586=PLANE('',#585);
+#587=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338));
+#588=VERTEX_POINT('',#587);
+#589=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338));
+#590=DIRECTION('',(-0.226031883,0.696886345,-0.680631332));
+#591=VECTOR('',#590,34.686653825);
+#592=LINE('',#589,#591);
+#593=EDGE_CURVE('',#588,#280,#592,.T.);
+#594=ORIENTED_EDGE('',*,*,#593,.T.);
+#595=ORIENTED_EDGE('',*,*,#285,.T.);
+#596=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338));
+#597=VERTEX_POINT('',#596);
+#598=CARTESIAN_POINT('',(25.,-19.656977849,26.187562226));
+#599=CARTESIAN_POINT('',(25.,-20.003592331,26.526091855));
+#600=CARTESIAN_POINT('',(24.90831093,-20.341566038,26.856182258));
+#601=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338));
+#602=B_SPLINE_CURVE_WITH_KNOTS('',3,(#598,#599,#600,#601),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001441062),.UNSPECIFIED.);
+#603=EDGE_CURVE('',#271,#597,#602,.T.);
+#604=ORIENTED_EDGE('',*,*,#603,.T.);
+#605=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338));
+#606=DIRECTION('',(-1.,0.,0.));
+#607=VECTOR('',#606,8.028495235);
+#608=LINE('',#605,#607);
+#609=EDGE_CURVE('',#588,#597,#608,.T.);
+#610=ORIENTED_EDGE('',*,*,#609,.F.);
+#611=EDGE_LOOP('',(#594,#595,#604,#610));
+#612=FACE_BOUND('',#611,.T.);
+#613=ADVANCED_FACE('',(#612),#586,.T.);
+#614=CARTESIAN_POINT('',(0.,3.4935706,3.577004957));
+#615=DIRECTION('',(0.,0.69871412,0.715400991));
+#616=DIRECTION('',(-1.,0.,0.));
+#617=AXIS2_PLACEMENT_3D('',#614,#615,#616);
+#618=PLANE('',#617);
+#619=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338));
+#620=VERTEX_POINT('',#619);
+#621=CARTESIAN_POINT('',(17.,0.288215967,6.707594051));
+#622=VERTEX_POINT('',#621);
+#623=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338));
+#624=DIRECTION('',(-0.,0.715400991,-0.69871412));
+#625=VECTOR('',#624,29.308459212);
+#626=LINE('',#623,#625);
+#627=EDGE_CURVE('',#620,#622,#626,.T.);
+#628=ORIENTED_EDGE('',*,*,#627,.T.);
+#629=CARTESIAN_POINT('',(-17.,0.288215967,6.707594051));
+#630=VERTEX_POINT('',#629);
+#631=CARTESIAN_POINT('',(17.,0.288215967,6.707594051));
+#632=DIRECTION('',(-1.,0.,-0.));
+#633=VECTOR('',#632,34.);
+#634=LINE('',#631,#633);
+#635=EDGE_CURVE('',#622,#630,#634,.T.);
+#636=ORIENTED_EDGE('',*,*,#635,.T.);
+#637=CARTESIAN_POINT('',(-17.,-20.679084811,27.185828338));
+#638=VERTEX_POINT('',#637);
+#639=CARTESIAN_POINT('',(-17.,0.288215967,6.707594051));
+#640=DIRECTION('',(-0.,-0.715400991,0.69871412));
+#641=VECTOR('',#640,29.308459212);
+#642=LINE('',#639,#641);
+#643=EDGE_CURVE('',#630,#638,#642,.T.);
+#644=ORIENTED_EDGE('',*,*,#643,.T.);
+#645=CARTESIAN_POINT('',(17.,-20.679084811,27.185828338));
+#646=DIRECTION('',(-1.,0.,0.));
+#647=VECTOR('',#646,34.);
+#648=LINE('',#645,#647);
+#649=EDGE_CURVE('',#620,#638,#648,.T.);
+#650=ORIENTED_EDGE('',*,*,#649,.F.);
+#651=EDGE_LOOP('',(#628,#636,#644,#650));
+#652=FACE_BOUND('',#651,.T.);
+#653=ADVANCED_FACE('',(#652),#618,.T.);
+#654=CARTESIAN_POINT('',(20.,-5.67149291,27.666750919));
+#655=DIRECTION('',(0.,0.,-1.));
+#656=DIRECTION('',(-1.,0.,0.));
+#657=AXIS2_PLACEMENT_3D('',#654,#655,#656);
+#658=PLANE('',#657);
+#659=CARTESIAN_POINT('',(23.5,5.485205765,27.666750919));
+#660=VERTEX_POINT('',#659);
+#661=CARTESIAN_POINT('',(21.,5.485205765,27.666750919));
+#662=VERTEX_POINT('',#661);
+#663=CARTESIAN_POINT('',(23.5,5.485205765,27.666750919));
+#664=DIRECTION('',(-1.,-0.,0.));
+#665=VECTOR('',#664,2.5);
+#666=LINE('',#663,#665);
+#667=EDGE_CURVE('',#660,#662,#666,.T.);
+#668=ORIENTED_EDGE('',*,*,#667,.T.);
+#669=CARTESIAN_POINT('',(21.,-15.854009142,27.666750919));
+#670=VERTEX_POINT('',#669);
+#671=CARTESIAN_POINT('',(21.,5.485205765,27.666750919));
+#672=DIRECTION('',(-0.,-1.,-0.));
+#673=VECTOR('',#672,21.339214907);
+#674=LINE('',#671,#673);
+#675=EDGE_CURVE('',#662,#670,#674,.T.);
+#676=ORIENTED_EDGE('',*,*,#675,.T.);
+#677=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919));
+#678=VERTEX_POINT('',#677);
+#679=CARTESIAN_POINT('',(17.,-15.854009142,27.666750919));
+#680=DIRECTION('',(0.,0.,-1.));
+#681=DIRECTION('',(0.,-1.,0.));
+#682=AXIS2_PLACEMENT_3D('',#679,#680,#681);
+#683=ELLIPSE('',#682,5.724802012,4.);
+#684=EDGE_CURVE('',#670,#678,#683,.T.);
+#685=ORIENTED_EDGE('',*,*,#684,.T.);
+#686=CARTESIAN_POINT('',(23.5,-19.224694785,27.666750919));
+#687=VERTEX_POINT('',#686);
+#688=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919));
+#689=DIRECTION('',(1.,-0.,-0.));
+#690=VECTOR('',#689,3.266845356);
+#691=LINE('',#688,#690);
+#692=EDGE_CURVE('',#678,#687,#691,.T.);
+#693=ORIENTED_EDGE('',*,*,#692,.T.);
+#694=CARTESIAN_POINT('',(23.5,-19.224694785,27.666750919));
+#695=DIRECTION('',(0.,1.,0.));
+#696=VECTOR('',#695,24.70990055);
+#697=LINE('',#694,#696);
+#698=EDGE_CURVE('',#687,#660,#697,.T.);
+#699=ORIENTED_EDGE('',*,*,#698,.T.);
+#700=EDGE_LOOP('',(#668,#676,#685,#693,#699));
+#701=FACE_BOUND('',#700,.T.);
+#702=ADVANCED_FACE('',(#701),#658,.F.);
+#703=CARTESIAN_POINT('',(20.,20.414253545,16.33337546));
+#704=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#705=DIRECTION('',(0.,0.682591464,-0.730800173));
+#706=AXIS2_PLACEMENT_3D('',#703,#704,#705);
+#707=PLANE('',#706);
+#708=CARTESIAN_POINT('',(23.5,23.588248977,12.935213404));
+#709=VERTEX_POINT('',#708);
+#710=CARTESIAN_POINT('',(21.,23.588248977,12.935213404));
+#711=VERTEX_POINT('',#710);
+#712=CARTESIAN_POINT('',(23.5,23.588248977,12.935213404));
+#713=DIRECTION('',(-1.,0.,-0.));
+#714=VECTOR('',#713,2.5);
+#715=LINE('',#712,#714);
+#716=EDGE_CURVE('',#709,#711,#715,.T.);
+#717=ORIENTED_EDGE('',*,*,#716,.T.);
+#718=CARTESIAN_POINT('',(21.,12.7932075,24.492665558));
+#719=VERTEX_POINT('',#718);
+#720=CARTESIAN_POINT('',(21.,23.588248977,12.935213404));
+#721=DIRECTION('',(-0.,-0.682591464,0.730800173));
+#722=VECTOR('',#721,15.814791202);
+#723=LINE('',#720,#722);
+#724=EDGE_CURVE('',#711,#719,#723,.T.);
+#725=ORIENTED_EDGE('',*,*,#724,.T.);
+#726=CARTESIAN_POINT('',(23.5,12.7932075,24.492665558));
+#727=VERTEX_POINT('',#726);
+#728=CARTESIAN_POINT('',(21.,12.7932075,24.492665558));
+#729=DIRECTION('',(1.,0.,-0.));
+#730=VECTOR('',#729,2.5);
+#731=LINE('',#728,#730);
+#732=EDGE_CURVE('',#719,#727,#731,.T.);
+#733=ORIENTED_EDGE('',*,*,#732,.T.);
+#734=CARTESIAN_POINT('',(23.5,12.7932075,24.492665558));
+#735=DIRECTION('',(0.,0.682591464,-0.730800173));
+#736=VECTOR('',#735,15.814791202);
+#737=LINE('',#734,#736);
+#738=EDGE_CURVE('',#727,#709,#737,.T.);
+#739=ORIENTED_EDGE('',*,*,#738,.T.);
+#740=EDGE_LOOP('',(#717,#725,#733,#739));
+#741=FACE_BOUND('',#740,.T.);
+#742=ADVANCED_FACE('',(#741),#707,.F.);
+#743=CARTESIAN_POINT('',(0.,-8.334936491,5.805136271));
+#744=DIRECTION('',(0.,-0.866025404,-0.5));
+#745=DIRECTION('',(0.,0.5,-0.866025404));
+#746=AXIS2_PLACEMENT_3D('',#743,#744,#745);
+#747=PLANE('',#746);
+#748=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338));
+#749=VERTEX_POINT('',#748);
+#750=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338));
+#751=VERTEX_POINT('',#750);
+#752=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338));
+#753=DIRECTION('',(-1.,0.,0.));
+#754=VECTOR('',#753,8.58347895);
+#755=LINE('',#752,#754);
+#756=EDGE_CURVE('',#749,#751,#755,.T.);
+#757=ORIENTED_EDGE('',*,*,#756,.T.);
+#758=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608));
+#759=VERTEX_POINT('',#758);
+#760=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338));
+#761=CARTESIAN_POINT('',(-33.757257255,-20.85386422,27.488555154));
+#762=CARTESIAN_POINT('',(-34.169740667,-20.9956887,27.734202361));
+#763=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608));
+#764=B_SPLINE_CURVE_WITH_KNOTS('',3,(#760,#761,#762,#763),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001499808),.UNSPECIFIED.);
+#765=EDGE_CURVE('',#751,#759,#764,.T.);
+#766=ORIENTED_EDGE('',*,*,#765,.T.);
+#767=CARTESIAN_POINT('',(-35.4,-21.134936491,27.975386608));
+#768=VERTEX_POINT('',#767);
+#769=CARTESIAN_POINT('',(-34.586164628,-21.134936491,27.975386608));
+#770=DIRECTION('',(-1.,-0.,0.));
+#771=VECTOR('',#770,0.813835372);
+#772=LINE('',#769,#771);
+#773=EDGE_CURVE('',#759,#768,#772,.T.);
+#774=ORIENTED_EDGE('',*,*,#773,.T.);
+#775=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323));
+#776=VERTEX_POINT('',#775);
+#777=CARTESIAN_POINT('',(-35.4,-21.134936491,27.975386608));
+#778=DIRECTION('',(0.,-0.5,0.866025404));
+#779=VECTOR('',#778,16.4);
+#780=LINE('',#777,#779);
+#781=EDGE_CURVE('',#768,#776,#780,.T.);
+#782=ORIENTED_EDGE('',*,*,#781,.T.);
+#783=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323));
+#784=VERTEX_POINT('',#783);
+#785=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323));
+#786=DIRECTION('',(1.,0.,-0.));
+#787=VECTOR('',#786,68.4);
+#788=LINE('',#785,#787);
+#789=EDGE_CURVE('',#776,#784,#788,.T.);
+#790=ORIENTED_EDGE('',*,*,#789,.T.);
+#791=CARTESIAN_POINT('',(33.,-20.334936491,26.589745962));
+#792=VERTEX_POINT('',#791);
+#793=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323));
+#794=DIRECTION('',(0.,0.5,-0.866025404));
+#795=VECTOR('',#794,18.);
+#796=LINE('',#793,#795);
+#797=EDGE_CURVE('',#784,#792,#796,.T.);
+#798=ORIENTED_EDGE('',*,*,#797,.T.);
+#799=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962));
+#800=VERTEX_POINT('',#799);
+#801=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962));
+#802=DIRECTION('',(1.,0.,-0.));
+#803=VECTOR('',#802,0.313480131);
+#804=LINE('',#801,#803);
+#805=EDGE_CURVE('',#800,#792,#804,.T.);
+#806=ORIENTED_EDGE('',*,*,#805,.F.);
+#807=CARTESIAN_POINT('',(32.840289696,-20.679084811,27.185828338));
+#808=DIRECTION('',(-0.218031559,0.48797086,-0.845190321));
+#809=VECTOR('',#808,0.705264082);
+#810=LINE('',#807,#809);
+#811=EDGE_CURVE('',#588,#800,#810,.T.);
+#812=ORIENTED_EDGE('',*,*,#811,.F.);
+#813=ORIENTED_EDGE('',*,*,#609,.T.);
+#814=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919));
+#815=VERTEX_POINT('',#814);
+#816=CARTESIAN_POINT('',(24.811794461,-20.679084811,27.185828338));
+#817=CARTESIAN_POINT('',(24.66960432,-20.890528388,27.552059357));
+#818=CARTESIAN_POINT('',(24.467359226,-21.085639936,27.890002471));
+#819=CARTESIAN_POINT('',(24.239042023,-21.273661136,28.215664742));
+#820=CARTESIAN_POINT('',(24.01072482,-21.461682336,28.541327013));
+#821=CARTESIAN_POINT('',(23.755146792,-21.642354388,28.854260188));
+#822=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919));
+#823=B_SPLINE_CURVE_WITH_KNOTS('',3,(#816,#817,#818,#819,#820,#821,#822),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.001318294,0.002636589),.UNSPECIFIED.);
+#824=EDGE_CURVE('',#597,#815,#823,.T.);
+#825=ORIENTED_EDGE('',*,*,#824,.T.);
+#826=CARTESIAN_POINT('',(19.193758872,-21.822770996,29.166750919));
+#827=VERTEX_POINT('',#826);
+#828=CARTESIAN_POINT('',(23.5,-21.822770996,29.166750919));
+#829=DIRECTION('',(-1.,0.,0.));
+#830=VECTOR('',#829,4.306241128);
+#831=LINE('',#828,#830);
+#832=EDGE_CURVE('',#815,#827,#831,.T.);
+#833=ORIENTED_EDGE('',*,*,#832,.T.);
+#834=CARTESIAN_POINT('',(18.461328155,-21.382229488,28.403710644));
+#835=VERTEX_POINT('',#834);
+#836=CARTESIAN_POINT('',(19.193758872,-21.822770996,29.166750919));
+#837=CARTESIAN_POINT('',(19.046023901,-21.760487506,29.058872755));
+#838=CARTESIAN_POINT('',(18.903865491,-21.694218246,28.944091025));
+#839=CARTESIAN_POINT('',(18.778712218,-21.621396065,28.817959308));
+#840=CARTESIAN_POINT('',(18.653558945,-21.548573884,28.69182759));
+#841=CARTESIAN_POINT('',(18.545899074,-21.469516502,28.554896187));
+#842=CARTESIAN_POINT('',(18.461328155,-21.382229488,28.403710644));
+#843=B_SPLINE_CURVE_WITH_KNOTS('',3,(#836,#837,#838,#839,#840,#841,#842),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.00057373,0.00114746),.UNSPECIFIED.);
+#844=EDGE_CURVE('',#827,#835,#843,.T.);
+#845=ORIENTED_EDGE('',*,*,#844,.T.);
+#846=CARTESIAN_POINT('',(17.,-26.230561625,36.801268237));
+#847=DIRECTION('',(-0.,0.866025404,0.5));
+#848=DIRECTION('',(0.,-0.5,0.866025404));
+#849=AXIS2_PLACEMENT_3D('',#846,#847,#848);
+#850=ELLIPSE('',#849,11.102953628,3.);
+#851=EDGE_CURVE('',#835,#620,#850,.T.);
+#852=ORIENTED_EDGE('',*,*,#851,.T.);
+#853=ORIENTED_EDGE('',*,*,#649,.T.);
+#854=CARTESIAN_POINT('',(-18.461328155,-21.382229488,28.403710644));
+#855=VERTEX_POINT('',#854);
+#856=CARTESIAN_POINT('',(-17.,-26.230561625,36.801268237));
+#857=DIRECTION('',(-0.,0.866025404,0.5));
+#858=DIRECTION('',(0.,0.5,-0.866025404));
+#859=AXIS2_PLACEMENT_3D('',#856,#857,#858);
+#860=ELLIPSE('',#859,11.102953628,3.);
+#861=EDGE_CURVE('',#638,#855,#860,.T.);
+#862=ORIENTED_EDGE('',*,*,#861,.T.);
+#863=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919));
+#864=VERTEX_POINT('',#863);
+#865=CARTESIAN_POINT('',(-18.461328155,-21.382229488,28.403710644));
+#866=CARTESIAN_POINT('',(-18.545900321,-21.469517789,28.554898417));
+#867=CARTESIAN_POINT('',(-18.6535603,-21.548574689,28.691828983));
+#868=CARTESIAN_POINT('',(-18.778711358,-21.621395565,28.817958441));
+#869=CARTESIAN_POINT('',(-18.903862416,-21.694216441,28.944087898));
+#870=CARTESIAN_POINT('',(-19.046022775,-21.760487034,29.058871932));
+#871=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919));
+#872=B_SPLINE_CURVE_WITH_KNOTS('',3,(#865,#866,#867,#868,#869,#870,#871),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.000573726,0.001147452),.UNSPECIFIED.);
+#873=EDGE_CURVE('',#855,#864,#872,.T.);
+#874=ORIENTED_EDGE('',*,*,#873,.T.);
+#875=CARTESIAN_POINT('',(-23.5,-21.822770996,29.166750919));
+#876=VERTEX_POINT('',#875);
+#877=CARTESIAN_POINT('',(-19.193758872,-21.822770996,29.166750919));
+#878=DIRECTION('',(-1.,0.,0.));
+#879=VECTOR('',#878,4.306241128);
+#880=LINE('',#877,#879);
+#881=EDGE_CURVE('',#864,#876,#880,.T.);
+#882=ORIENTED_EDGE('',*,*,#881,.T.);
+#883=CARTESIAN_POINT('',(-23.5,-21.822770996,29.166750919));
+#884=CARTESIAN_POINT('',(-23.755146792,-21.642354388,28.854260188));
+#885=CARTESIAN_POINT('',(-24.01072482,-21.461682336,28.541327013));
+#886=CARTESIAN_POINT('',(-24.239042023,-21.273661136,28.215664742));
+#887=CARTESIAN_POINT('',(-24.467359226,-21.085639936,27.890002471));
+#888=CARTESIAN_POINT('',(-24.66960432,-20.890528388,27.552059357));
+#889=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338));
+#890=B_SPLINE_CURVE_WITH_KNOTS('',3,(#883,#884,#885,#886,#887,#888,#889),.UNSPECIFIED.,.F.,.F.,(4,3,4),(0.,0.001318294,0.002636589),.UNSPECIFIED.);
+#891=EDGE_CURVE('',#876,#749,#890,.T.);
+#892=ORIENTED_EDGE('',*,*,#891,.T.);
+#893=EDGE_LOOP('',(#757,#766,#774,#782,#790,#798,#806,#812,#813,#825,#833,#845,#852,#853,#862,#874,#882,#892));
+#894=FACE_BOUND('',#893,.T.);
+#895=CARTESIAN_POINT('',(22.5,-24.459936491,33.734455543));
+#896=VERTEX_POINT('',#895);
+#897=CARTESIAN_POINT('',(22.5,-25.334936491,35.25));
+#898=DIRECTION('',(-0.,0.866025404,0.5));
+#899=DIRECTION('',(0.,0.5,-0.866025404));
+#900=AXIS2_PLACEMENT_3D('',#897,#898,#899);
+#901=CIRCLE('',#900,1.75);
+#902=EDGE_CURVE('',#896,#896,#901,.T.);
+#903=ORIENTED_EDGE('',*,*,#902,.F.);
+#904=EDGE_LOOP('',(#903));
+#905=FACE_BOUND('',#904,.T.);
+#906=CARTESIAN_POINT('',(-22.5,-24.459936491,33.734455543));
+#907=VERTEX_POINT('',#906);
+#908=CARTESIAN_POINT('',(-22.5,-25.334936491,35.25));
+#909=DIRECTION('',(-0.,0.866025404,0.5));
+#910=DIRECTION('',(0.,0.5,-0.866025404));
+#911=AXIS2_PLACEMENT_3D('',#908,#909,#910);
+#912=CIRCLE('',#911,1.75);
+#913=EDGE_CURVE('',#907,#907,#912,.T.);
+#914=ORIENTED_EDGE('',*,*,#913,.F.);
+#915=EDGE_LOOP('',(#914));
+#916=FACE_BOUND('',#915,.T.);
+#917=ADVANCED_FACE('',(#894,#905,#916),#747,.F.);
+#918=CARTESIAN_POINT('',(0.,3.4935706,3.577004957));
+#919=DIRECTION('',(0.,0.69871412,0.715400991));
+#920=DIRECTION('',(-1.,0.,0.));
+#921=AXIS2_PLACEMENT_3D('',#918,#919,#920);
+#922=PLANE('',#921);
+#923=ORIENTED_EDGE('',*,*,#756,.F.);
+#924=CARTESIAN_POINT('',(-24.811794461,-20.679084811,27.185828338));
+#925=CARTESIAN_POINT('',(-24.90831093,-20.341566038,26.856182258));
+#926=CARTESIAN_POINT('',(-25.,-20.003592331,26.526091855));
+#927=CARTESIAN_POINT('',(-25.,-19.656977849,26.187562226));
+#928=B_SPLINE_CURVE_WITH_KNOTS('',3,(#924,#925,#926,#927),.UNSPECIFIED.,.F.,.F.,(4,4),(0.,0.001441062),.UNSPECIFIED.);
+#929=EDGE_CURVE('',#749,#361,#928,.T.);
+#930=ORIENTED_EDGE('',*,*,#929,.T.);
+#931=ORIENTED_EDGE('',*,*,#368,.T.);
+#932=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893));
+#933=VERTEX_POINT('',#932);
+#934=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893));
+#935=DIRECTION('',(0.226031883,0.696886345,-0.680631332));
+#936=VECTOR('',#935,33.398441831);
+#937=LINE('',#934,#936);
+#938=EDGE_CURVE('',#933,#363,#937,.T.);
+#939=ORIENTED_EDGE('',*,*,#938,.F.);
+#940=CARTESIAN_POINT('',(-32.549112713,-19.781347462,26.309030893));
+#941=CARTESIAN_POINT('',(-32.608027878,-19.96299075,26.486437314));
+#942=CARTESIAN_POINT('',(-32.714167354,-20.129119138,26.648690725));
+#943=CARTESIAN_POINT('',(-32.860356046,-20.282089905,26.798093418));
+#944=CARTESIAN_POINT('',(-32.933450393,-20.358575289,26.872794765));
+#945=CARTESIAN_POINT('',(-33.015793095,-20.43040907,26.942953009));
+#946=CARTESIAN_POINT('',(-33.105059959,-20.496528912,27.007530592));
+#947=CARTESIAN_POINT('',(-33.194326823,-20.562648754,27.072108175));
+#948=CARTESIAN_POINT('',(-33.290956957,-20.623576649,27.131614915));
+#949=CARTESIAN_POINT('',(-33.395273411,-20.679084811,27.185828338));
+#950=B_SPLINE_CURVE_WITH_KNOTS('',3,(#940,#941,#942,#943,#944,#945,#946,#947,#948,#949),.UNSPECIFIED.,.F.,.F.,(4,3,3,4),(0.,0.000765971,0.001148957,0.001531942),.UNSPECIFIED.);
+#951=EDGE_CURVE('',#933,#751,#950,.T.);
+#952=ORIENTED_EDGE('',*,*,#951,.T.);
+#953=EDGE_LOOP('',(#923,#930,#931,#939,#952));
+#954=FACE_BOUND('',#953,.T.);
+#955=ADVANCED_FACE('',(#954),#922,.T.);
+#956=CARTESIAN_POINT('',(-20.,-5.67149291,27.666750919));
+#957=DIRECTION('',(0.,0.,-1.));
+#958=DIRECTION('',(1.,0.,0.));
+#959=AXIS2_PLACEMENT_3D('',#956,#957,#958);
+#960=PLANE('',#959);
+#961=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919));
+#962=VERTEX_POINT('',#961);
+#963=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919));
+#964=VERTEX_POINT('',#963);
+#965=CARTESIAN_POINT('',(-17.,-15.854009142,27.666750919));
+#966=DIRECTION('',(0.,0.,-1.));
+#967=DIRECTION('',(0.,1.,0.));
+#968=AXIS2_PLACEMENT_3D('',#965,#966,#967);
+#969=ELLIPSE('',#968,5.724802012,4.);
+#970=EDGE_CURVE('',#962,#964,#969,.T.);
+#971=ORIENTED_EDGE('',*,*,#970,.T.);
+#972=CARTESIAN_POINT('',(-21.,5.485205765,27.666750919));
+#973=VERTEX_POINT('',#972);
+#974=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919));
+#975=DIRECTION('',(0.,1.,0.));
+#976=VECTOR('',#975,21.339214907);
+#977=LINE('',#974,#976);
+#978=EDGE_CURVE('',#964,#973,#977,.T.);
+#979=ORIENTED_EDGE('',*,*,#978,.T.);
+#980=CARTESIAN_POINT('',(-23.5,5.485205765,27.666750919));
+#981=VERTEX_POINT('',#980);
+#982=CARTESIAN_POINT('',(-21.,5.485205765,27.666750919));
+#983=DIRECTION('',(-1.,0.,0.));
+#984=VECTOR('',#983,2.5);
+#985=LINE('',#982,#984);
+#986=EDGE_CURVE('',#973,#981,#985,.T.);
+#987=ORIENTED_EDGE('',*,*,#986,.T.);
+#988=CARTESIAN_POINT('',(-23.5,-19.224694785,27.666750919));
+#989=VERTEX_POINT('',#988);
+#990=CARTESIAN_POINT('',(-23.5,5.485205765,27.666750919));
+#991=DIRECTION('',(-0.,-1.,-0.));
+#992=VECTOR('',#991,24.70990055);
+#993=LINE('',#990,#992);
+#994=EDGE_CURVE('',#981,#989,#993,.T.);
+#995=ORIENTED_EDGE('',*,*,#994,.T.);
+#996=CARTESIAN_POINT('',(-23.5,-19.224694785,27.666750919));
+#997=DIRECTION('',(1.,-0.,-0.));
+#998=VECTOR('',#997,3.266845356);
+#999=LINE('',#996,#998);
+#1000=EDGE_CURVE('',#989,#962,#999,.T.);
+#1001=ORIENTED_EDGE('',*,*,#1000,.T.);
+#1002=EDGE_LOOP('',(#971,#979,#987,#995,#1001));
+#1003=FACE_BOUND('',#1002,.T.);
+#1004=ADVANCED_FACE('',(#1003),#960,.F.);
+#1005=CARTESIAN_POINT('',(-20.,20.414253545,16.33337546));
+#1006=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#1007=DIRECTION('',(0.,0.682591464,-0.730800173));
+#1008=AXIS2_PLACEMENT_3D('',#1005,#1006,#1007);
+#1009=PLANE('',#1008);
+#1010=CARTESIAN_POINT('',(-23.5,12.7932075,24.492665558));
+#1011=VERTEX_POINT('',#1010);
+#1012=CARTESIAN_POINT('',(-21.,12.7932075,24.492665558));
+#1013=VERTEX_POINT('',#1012);
+#1014=CARTESIAN_POINT('',(-23.5,12.7932075,24.492665558));
+#1015=DIRECTION('',(1.,-0.,-0.));
+#1016=VECTOR('',#1015,2.5);
+#1017=LINE('',#1014,#1016);
+#1018=EDGE_CURVE('',#1011,#1013,#1017,.T.);
+#1019=ORIENTED_EDGE('',*,*,#1018,.T.);
+#1020=CARTESIAN_POINT('',(-21.,23.588248977,12.935213404));
+#1021=VERTEX_POINT('',#1020);
+#1022=CARTESIAN_POINT('',(-21.,12.7932075,24.492665558));
+#1023=DIRECTION('',(0.,0.682591464,-0.730800173));
+#1024=VECTOR('',#1023,15.814791202);
+#1025=LINE('',#1022,#1024);
+#1026=EDGE_CURVE('',#1013,#1021,#1025,.T.);
+#1027=ORIENTED_EDGE('',*,*,#1026,.T.);
+#1028=CARTESIAN_POINT('',(-23.5,23.588248977,12.935213404));
+#1029=VERTEX_POINT('',#1028);
+#1030=CARTESIAN_POINT('',(-21.,23.588248977,12.935213404));
+#1031=DIRECTION('',(-1.,0.,-0.));
+#1032=VECTOR('',#1031,2.5);
+#1033=LINE('',#1030,#1032);
+#1034=EDGE_CURVE('',#1021,#1029,#1033,.T.);
+#1035=ORIENTED_EDGE('',*,*,#1034,.T.);
+#1036=CARTESIAN_POINT('',(-23.5,23.588248977,12.935213404));
+#1037=DIRECTION('',(-0.,-0.682591464,0.730800173));
+#1038=VECTOR('',#1037,15.814791202);
+#1039=LINE('',#1036,#1038);
+#1040=EDGE_CURVE('',#1029,#1011,#1039,.T.);
+#1041=ORIENTED_EDGE('',*,*,#1040,.T.);
+#1042=EDGE_LOOP('',(#1019,#1027,#1035,#1041));
+#1043=FACE_BOUND('',#1042,.T.);
+#1044=ADVANCED_FACE('',(#1043),#1009,.F.);
+#1045=CARTESIAN_POINT('',(0.,-24.665063509,24.089745962));
+#1046=DIRECTION('',(0.,-0.5,0.866025404));
+#1047=DIRECTION('',(1.,0.,0.));
+#1048=AXIS2_PLACEMENT_3D('',#1045,#1046,#1047);
+#1049=PLANE('',#1048);
+#1050=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962));
+#1051=VERTEX_POINT('',#1050);
+#1052=CARTESIAN_POINT('',(32.686519869,-20.334936491,26.589745962));
+#1053=DIRECTION('',(0.062573166,-0.864328323,-0.49902019));
+#1054=VECTOR('',#1053,5.009817341);
+#1055=LINE('',#1052,#1054);
+#1056=EDGE_CURVE('',#800,#1051,#1055,.T.);
+#1057=ORIENTED_EDGE('',*,*,#1056,.F.);
+#1058=ORIENTED_EDGE('',*,*,#805,.T.);
+#1059=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962));
+#1060=DIRECTION('',(0.,0.866025404,0.5));
+#1061=VECTOR('',#1060,5.);
+#1062=LINE('',#1059,#1061);
+#1063=EDGE_CURVE('',#1051,#792,#1062,.T.);
+#1064=ORIENTED_EDGE('',*,*,#1063,.F.);
+#1065=EDGE_LOOP('',(#1057,#1058,#1064));
+#1066=FACE_BOUND('',#1065,.T.);
+#1067=ADVANCED_FACE('',(#1066),#1049,.F.);
+#1068=CARTESIAN_POINT('',(-22.5,-21.004809472,37.75));
+#1069=DIRECTION('',(0.,-0.866025404,-0.5));
+#1070=DIRECTION('',(0.,0.5,-0.866025404));
+#1071=AXIS2_PLACEMENT_3D('',#1068,#1069,#1070);
+#1072=CYLINDRICAL_SURFACE('',#1071,1.75);
+#1073=CARTESIAN_POINT('',(-22.5,-28.790063509,31.234455543));
+#1074=VERTEX_POINT('',#1073);
+#1075=CARTESIAN_POINT('',(-22.5,-28.790063509,31.234455543));
+#1076=DIRECTION('',(-0.,0.866025404,0.5));
+#1077=VECTOR('',#1076,5.);
+#1078=LINE('',#1075,#1077);
+#1079=EDGE_CURVE('',#1074,#907,#1078,.T.);
+#1080=ORIENTED_EDGE('',*,*,#1079,.F.);
+#1081=CARTESIAN_POINT('',(-22.5,-29.665063509,32.75));
+#1082=DIRECTION('',(0.,-0.866025404,-0.5));
+#1083=DIRECTION('',(0.,0.5,-0.866025404));
+#1084=AXIS2_PLACEMENT_3D('',#1081,#1082,#1083);
+#1085=CIRCLE('',#1084,1.75);
+#1086=EDGE_CURVE('',#1074,#1074,#1085,.T.);
+#1087=ORIENTED_EDGE('',*,*,#1086,.T.);
+#1088=ORIENTED_EDGE('',*,*,#1079,.T.);
+#1089=ORIENTED_EDGE('',*,*,#913,.T.);
+#1090=EDGE_LOOP('',(#1080,#1087,#1088,#1089));
+#1091=FACE_BOUND('',#1090,.T.);
+#1092=ADVANCED_FACE('',(#1091),#1072,.F.);
+#1093=CARTESIAN_POINT('',(22.5,-21.004809472,37.75));
+#1094=DIRECTION('',(0.,-0.866025404,-0.5));
+#1095=DIRECTION('',(0.,0.5,-0.866025404));
+#1096=AXIS2_PLACEMENT_3D('',#1093,#1094,#1095);
+#1097=CYLINDRICAL_SURFACE('',#1096,1.75);
+#1098=CARTESIAN_POINT('',(22.5,-28.790063509,31.234455543));
+#1099=VERTEX_POINT('',#1098);
+#1100=CARTESIAN_POINT('',(22.5,-28.790063509,31.234455543));
+#1101=DIRECTION('',(-0.,0.866025404,0.5));
+#1102=VECTOR('',#1101,5.);
+#1103=LINE('',#1100,#1102);
+#1104=EDGE_CURVE('',#1099,#896,#1103,.T.);
+#1105=ORIENTED_EDGE('',*,*,#1104,.F.);
+#1106=CARTESIAN_POINT('',(22.5,-29.665063509,32.75));
+#1107=DIRECTION('',(0.,-0.866025404,-0.5));
+#1108=DIRECTION('',(0.,0.5,-0.866025404));
+#1109=AXIS2_PLACEMENT_3D('',#1106,#1107,#1108);
+#1110=CIRCLE('',#1109,1.75);
+#1111=EDGE_CURVE('',#1099,#1099,#1110,.T.);
+#1112=ORIENTED_EDGE('',*,*,#1111,.T.);
+#1113=ORIENTED_EDGE('',*,*,#1104,.T.);
+#1114=ORIENTED_EDGE('',*,*,#902,.T.);
+#1115=EDGE_LOOP('',(#1105,#1112,#1113,#1114));
+#1116=FACE_BOUND('',#1115,.T.);
+#1117=ADVANCED_FACE('',(#1116),#1097,.F.);
+#1118=CARTESIAN_POINT('',(0.,-12.665063509,3.305136271));
+#1119=DIRECTION('',(0.,-0.866025404,-0.5));
+#1120=DIRECTION('',(0.,0.5,-0.866025404));
+#1121=AXIS2_PLACEMENT_3D('',#1118,#1119,#1120);
+#1122=PLANE('',#1121);
+#1123=ORIENTED_EDGE('',*,*,#1111,.F.);
+#1124=EDGE_LOOP('',(#1123));
+#1125=FACE_BOUND('',#1124,.T.);
+#1126=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323));
+#1127=VERTEX_POINT('',#1126);
+#1128=CARTESIAN_POINT('',(-37.,-25.465063509,25.475386608));
+#1129=VERTEX_POINT('',#1128);
+#1130=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323));
+#1131=DIRECTION('',(0.,0.5,-0.866025404));
+#1132=VECTOR('',#1131,16.4);
+#1133=LINE('',#1130,#1132);
+#1134=EDGE_CURVE('',#1127,#1129,#1133,.T.);
+#1135=ORIENTED_EDGE('',*,*,#1134,.T.);
+#1136=CARTESIAN_POINT('',(-35.4,-24.665063509,24.089745962));
+#1137=VERTEX_POINT('',#1136);
+#1138=CARTESIAN_POINT('',(-35.4,-25.465063509,25.475386608));
+#1139=DIRECTION('',(0.,-0.866025404,-0.5));
+#1140=DIRECTION('',(0.,0.5,-0.866025404));
+#1141=AXIS2_PLACEMENT_3D('',#1138,#1139,#1140);
+#1142=CIRCLE('',#1141,1.6);
+#1143=EDGE_CURVE('',#1129,#1137,#1142,.T.);
+#1144=ORIENTED_EDGE('',*,*,#1143,.T.);
+#1145=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962));
+#1146=VERTEX_POINT('',#1145);
+#1147=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962));
+#1148=DIRECTION('',(-1.,-0.,0.));
+#1149=VECTOR('',#1148,1.114941858);
+#1150=LINE('',#1147,#1149);
+#1151=EDGE_CURVE('',#1146,#1137,#1150,.T.);
+#1152=ORIENTED_EDGE('',*,*,#1151,.F.);
+#1153=CARTESIAN_POINT('',(-34.285058142,-24.665063509,24.089745962));
+#1154=DIRECTION('',(1.,0.,-0.));
+#1155=VECTOR('',#1154,67.285058142);
+#1156=LINE('',#1153,#1155);
+#1157=EDGE_CURVE('',#1146,#1051,#1156,.T.);
+#1158=ORIENTED_EDGE('',*,*,#1157,.T.);
+#1159=CARTESIAN_POINT('',(33.,-33.665063509,39.67820323));
+#1160=VERTEX_POINT('',#1159);
+#1161=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962));
+#1162=DIRECTION('',(0.,-0.5,0.866025404));
+#1163=VECTOR('',#1162,18.);
+#1164=LINE('',#1161,#1163);
+#1165=EDGE_CURVE('',#1051,#1160,#1164,.T.);
+#1166=ORIENTED_EDGE('',*,*,#1165,.T.);
+#1167=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038));
+#1168=VERTEX_POINT('',#1167);
+#1169=CARTESIAN_POINT('',(31.,-33.665063509,39.67820323));
+#1170=DIRECTION('',(0.,-0.866025404,-0.5));
+#1171=DIRECTION('',(0.,0.5,-0.866025404));
+#1172=AXIS2_PLACEMENT_3D('',#1169,#1170,#1171);
+#1173=CIRCLE('',#1172,2.);
+#1174=EDGE_CURVE('',#1160,#1168,#1173,.T.);
+#1175=ORIENTED_EDGE('',*,*,#1174,.T.);
+#1176=CARTESIAN_POINT('',(-35.,-34.665063509,41.410254038));
+#1177=VERTEX_POINT('',#1176);
+#1178=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038));
+#1179=DIRECTION('',(-1.,0.,0.));
+#1180=VECTOR('',#1179,66.);
+#1181=LINE('',#1178,#1180);
+#1182=EDGE_CURVE('',#1168,#1177,#1181,.T.);
+#1183=ORIENTED_EDGE('',*,*,#1182,.T.);
+#1184=CARTESIAN_POINT('',(-35.,-33.665063509,39.67820323));
+#1185=DIRECTION('',(0.,-0.866025404,-0.5));
+#1186=DIRECTION('',(0.,0.5,-0.866025404));
+#1187=AXIS2_PLACEMENT_3D('',#1184,#1185,#1186);
+#1188=CIRCLE('',#1187,2.);
+#1189=EDGE_CURVE('',#1177,#1127,#1188,.T.);
+#1190=ORIENTED_EDGE('',*,*,#1189,.T.);
+#1191=EDGE_LOOP('',(#1135,#1144,#1152,#1158,#1166,#1175,#1183,#1190));
+#1192=FACE_BOUND('',#1191,.T.);
+#1193=ORIENTED_EDGE('',*,*,#1086,.F.);
+#1194=EDGE_LOOP('',(#1193));
+#1195=FACE_BOUND('',#1194,.T.);
+#1196=ADVANCED_FACE('',(#1125,#1192,#1195),#1122,.T.);
+#1197=CARTESIAN_POINT('',(0.,-24.665063509,24.089745962));
+#1198=DIRECTION('',(0.,-0.5,0.866025404));
+#1199=DIRECTION('',(1.,0.,0.));
+#1200=AXIS2_PLACEMENT_3D('',#1197,#1198,#1199);
+#1201=PLANE('',#1200);
+#1202=CARTESIAN_POINT('',(-35.4,-21.720577137,25.789745962));
+#1203=VERTEX_POINT('',#1202);
+#1204=CARTESIAN_POINT('',(-34.071891653,-21.720577137,25.789745962));
+#1205=VERTEX_POINT('',#1204);
+#1206=CARTESIAN_POINT('',(-35.4,-21.720577137,25.789745962));
+#1207=DIRECTION('',(1.,0.,-0.));
+#1208=VECTOR('',#1207,1.328108347);
+#1209=LINE('',#1206,#1208);
+#1210=EDGE_CURVE('',#1203,#1205,#1209,.T.);
+#1211=ORIENTED_EDGE('',*,*,#1210,.T.);
+#1212=CARTESIAN_POINT('',(-34.071891653,-21.720577137,25.789745962));
+#1213=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019));
+#1214=VECTOR('',#1213,3.406675792);
+#1215=LINE('',#1212,#1214);
+#1216=EDGE_CURVE('',#1205,#1146,#1215,.T.);
+#1217=ORIENTED_EDGE('',*,*,#1216,.T.);
+#1218=ORIENTED_EDGE('',*,*,#1151,.T.);
+#1219=CARTESIAN_POINT('',(-35.4,-24.665063509,24.089745962));
+#1220=DIRECTION('',(0.,0.866025404,0.5));
+#1221=VECTOR('',#1220,3.4);
+#1222=LINE('',#1219,#1221);
+#1223=EDGE_CURVE('',#1137,#1203,#1222,.T.);
+#1224=ORIENTED_EDGE('',*,*,#1223,.T.);
+#1225=EDGE_LOOP('',(#1211,#1217,#1218,#1224));
+#1226=FACE_BOUND('',#1225,.T.);
+#1227=ADVANCED_FACE('',(#1226),#1201,.F.);
+#1228=CARTESIAN_POINT('',(-37.,-21.004809472,37.75));
+#1229=DIRECTION('',(-1.,0.,0.));
+#1230=DIRECTION('',(0.,-0.5,0.866025404));
+#1231=AXIS2_PLACEMENT_3D('',#1228,#1229,#1230);
+#1232=PLANE('',#1231);
+#1233=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323));
+#1234=VERTEX_POINT('',#1233);
+#1235=CARTESIAN_POINT('',(-37.,-33.665063509,39.67820323));
+#1236=DIRECTION('',(-0.,0.866025404,0.5));
+#1237=VECTOR('',#1236,3.4);
+#1238=LINE('',#1235,#1237);
+#1239=EDGE_CURVE('',#1127,#1234,#1238,.T.);
+#1240=ORIENTED_EDGE('',*,*,#1239,.T.);
+#1241=CARTESIAN_POINT('',(-37.,-22.520577137,27.175386608));
+#1242=VERTEX_POINT('',#1241);
+#1243=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323));
+#1244=DIRECTION('',(-0.,0.5,-0.866025404));
+#1245=VECTOR('',#1244,16.4);
+#1246=LINE('',#1243,#1245);
+#1247=EDGE_CURVE('',#1234,#1242,#1246,.T.);
+#1248=ORIENTED_EDGE('',*,*,#1247,.T.);
+#1249=CARTESIAN_POINT('',(-37.,-22.520577137,27.175386608));
+#1250=DIRECTION('',(-0.,-0.866025404,-0.5));
+#1251=VECTOR('',#1250,3.4);
+#1252=LINE('',#1249,#1251);
+#1253=EDGE_CURVE('',#1242,#1129,#1252,.T.);
+#1254=ORIENTED_EDGE('',*,*,#1253,.T.);
+#1255=ORIENTED_EDGE('',*,*,#1134,.F.);
+#1256=EDGE_LOOP('',(#1240,#1248,#1254,#1255));
+#1257=FACE_BOUND('',#1256,.T.);
+#1258=ADVANCED_FACE('',(#1257),#1232,.T.);
+#1259=CARTESIAN_POINT('',(0.,-26.004809472,46.410254038));
+#1260=DIRECTION('',(0.,-0.5,0.866025404));
+#1261=DIRECTION('',(1.,0.,0.));
+#1262=AXIS2_PLACEMENT_3D('',#1259,#1260,#1261);
+#1263=PLANE('',#1262);
+#1264=ORIENTED_EDGE('',*,*,#1182,.F.);
+#1265=CARTESIAN_POINT('',(31.,-32.066987298,42.910254038));
+#1266=VERTEX_POINT('',#1265);
+#1267=CARTESIAN_POINT('',(31.,-34.665063509,41.410254038));
+#1268=DIRECTION('',(-0.,0.866025404,0.5));
+#1269=VECTOR('',#1268,3.);
+#1270=LINE('',#1267,#1269);
+#1271=EDGE_CURVE('',#1168,#1266,#1270,.T.);
+#1272=ORIENTED_EDGE('',*,*,#1271,.T.);
+#1273=CARTESIAN_POINT('',(-35.,-32.066987298,42.910254038));
+#1274=VERTEX_POINT('',#1273);
+#1275=CARTESIAN_POINT('',(31.,-32.066987298,42.910254038));
+#1276=DIRECTION('',(-1.,-0.,0.));
+#1277=VECTOR('',#1276,66.);
+#1278=LINE('',#1275,#1277);
+#1279=EDGE_CURVE('',#1266,#1274,#1278,.T.);
+#1280=ORIENTED_EDGE('',*,*,#1279,.T.);
+#1281=CARTESIAN_POINT('',(-35.,-32.066987298,42.910254038));
+#1282=DIRECTION('',(0.,-0.866025404,-0.5));
+#1283=VECTOR('',#1282,3.);
+#1284=LINE('',#1281,#1283);
+#1285=EDGE_CURVE('',#1274,#1177,#1284,.T.);
+#1286=ORIENTED_EDGE('',*,*,#1285,.T.);
+#1287=EDGE_LOOP('',(#1264,#1272,#1280,#1286));
+#1288=FACE_BOUND('',#1287,.T.);
+#1289=ADVANCED_FACE('',(#1288),#1263,.T.);
+#1290=CARTESIAN_POINT('',(33.,-21.004809472,37.75));
+#1291=DIRECTION('',(1.,0.,0.));
+#1292=DIRECTION('',(0.,0.5,-0.866025404));
+#1293=AXIS2_PLACEMENT_3D('',#1290,#1291,#1292);
+#1294=PLANE('',#1293);
+#1295=ORIENTED_EDGE('',*,*,#797,.F.);
+#1296=CARTESIAN_POINT('',(33.,-29.334936491,42.17820323));
+#1297=DIRECTION('',(0.,-0.866025404,-0.5));
+#1298=VECTOR('',#1297,5.);
+#1299=LINE('',#1296,#1298);
+#1300=EDGE_CURVE('',#784,#1160,#1299,.T.);
+#1301=ORIENTED_EDGE('',*,*,#1300,.T.);
+#1302=ORIENTED_EDGE('',*,*,#1165,.F.);
+#1303=ORIENTED_EDGE('',*,*,#1063,.T.);
+#1304=EDGE_LOOP('',(#1295,#1301,#1302,#1303));
+#1305=FACE_BOUND('',#1304,.T.);
+#1306=ADVANCED_FACE('',(#1305),#1294,.T.);
+#1307=CARTESIAN_POINT('',(-29.,-8.838961155,15.621877938));
+#1308=DIRECTION('',(-0.974119904,0.161703434,-0.157931669));
+#1309=DIRECTION('',(-0.163758597,-0.986500442,-0.));
+#1310=AXIS2_PLACEMENT_3D('',#1307,#1308,#1309);
+#1311=PLANE('',#1310);
+#1312=ORIENTED_EDGE('',*,*,#450,.T.);
+#1313=CARTESIAN_POINT('',(-25.472564566,-1.456979379,1.422995043));
+#1314=VERTEX_POINT('',#1313);
+#1315=CARTESIAN_POINT('',(-25.472564566,2.036591221,5.));
+#1316=DIRECTION('',(-0.974119904,0.161703434,-0.157931669));
+#1317=DIRECTION('',(-0.226031883,-0.696886345,0.680631332));
+#1318=AXIS2_PLACEMENT_3D('',#1315,#1316,#1317);
+#1319=ELLIPSE('',#1318,5.132838348,5.);
+#1320=EDGE_CURVE('',#438,#1314,#1319,.T.);
+#1321=ORIENTED_EDGE('',*,*,#1320,.T.);
+#1322=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384));
+#1323=VERTEX_POINT('',#1322);
+#1324=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384));
+#1325=DIRECTION('',(0.226031883,0.696886345,-0.680631332));
+#1326=VECTOR('',#1325,31.967835349);
+#1327=LINE('',#1324,#1326);
+#1328=EDGE_CURVE('',#1323,#1314,#1327,.T.);
+#1329=ORIENTED_EDGE('',*,*,#1328,.F.);
+#1330=CARTESIAN_POINT('',(-32.513299806,-21.17930263,24.656795986));
+#1331=VERTEX_POINT('',#1330);
+#1332=CARTESIAN_POINT('',(-32.698314601,-23.734927318,23.181305384));
+#1333=DIRECTION('',(0.062573166,0.864328323,0.49902019));
+#1334=VECTOR('',#1333,2.956775361);
+#1335=LINE('',#1332,#1334);
+#1336=EDGE_CURVE('',#1323,#1331,#1335,.T.);
+#1337=ORIENTED_EDGE('',*,*,#1336,.T.);
+#1338=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094));
+#1339=VERTEX_POINT('',#1338);
+#1340=CARTESIAN_POINT('',(-33.228200065,-22.77930263,27.428077278));
+#1341=DIRECTION('',(0.974119904,-0.161703434,0.157931669));
+#1342=DIRECTION('',(0.226031883,0.696886345,-0.680631332));
+#1343=AXIS2_PLACEMENT_3D('',#1340,#1341,#1342);
+#1344=ELLIPSE('',#1343,3.285016543,3.2);
+#1345=EDGE_CURVE('',#1331,#1339,#1344,.T.);
+#1346=ORIENTED_EDGE('',*,*,#1345,.T.);
+#1347=CARTESIAN_POINT('',(-33.228200065,-22.77930263,27.428077278));
+#1348=DIRECTION('',(0.974119904,-0.161703434,0.157931669));
+#1349=DIRECTION('',(0.226031883,0.696886345,-0.680631332));
+#1350=AXIS2_PLACEMENT_3D('',#1347,#1348,#1349);
+#1351=ELLIPSE('',#1350,3.285016543,3.2);
+#1352=EDGE_CURVE('',#1339,#933,#1351,.T.);
+#1353=ORIENTED_EDGE('',*,*,#1352,.T.);
+#1354=ORIENTED_EDGE('',*,*,#938,.T.);
+#1355=EDGE_LOOP('',(#1312,#1321,#1329,#1337,#1346,#1353,#1354));
+#1356=FACE_BOUND('',#1355,.T.);
+#1357=ADVANCED_FACE('',(#1356),#1311,.T.);
+#1358=CARTESIAN_POINT('',(29.,-8.838961155,15.621877938));
+#1359=DIRECTION('',(-0.974119904,-0.161703434,0.157931669));
+#1360=DIRECTION('',(0.163758597,-0.986500442,-0.));
+#1361=AXIS2_PLACEMENT_3D('',#1358,#1359,#1360);
+#1362=PLANE('',#1361);
+#1363=CARTESIAN_POINT('',(25.472564566,-1.456979379,1.422995043));
+#1364=VERTEX_POINT('',#1363);
+#1365=CARTESIAN_POINT('',(33.,-24.665063509,24.089745962));
+#1366=DIRECTION('',(-0.226031883,0.696886345,-0.680631332));
+#1367=VECTOR('',#1366,33.302538199);
+#1368=LINE('',#1365,#1367);
+#1369=EDGE_CURVE('',#1051,#1364,#1368,.T.);
+#1370=ORIENTED_EDGE('',*,*,#1369,.T.);
+#1371=CARTESIAN_POINT('',(25.472564566,2.036591221,5.));
+#1372=DIRECTION('',(0.974119904,0.161703434,-0.157931669));
+#1373=DIRECTION('',(-0.226031883,0.696886345,-0.680631332));
+#1374=AXIS2_PLACEMENT_3D('',#1371,#1372,#1373);
+#1375=ELLIPSE('',#1374,5.132838348,5.);
+#1376=EDGE_CURVE('',#1364,#288,#1375,.T.);
+#1377=ORIENTED_EDGE('',*,*,#1376,.T.);
+#1378=ORIENTED_EDGE('',*,*,#293,.F.);
+#1379=ORIENTED_EDGE('',*,*,#593,.F.);
+#1380=ORIENTED_EDGE('',*,*,#811,.T.);
+#1381=ORIENTED_EDGE('',*,*,#1056,.T.);
+#1382=EDGE_LOOP('',(#1370,#1377,#1378,#1379,#1380,#1381));
+#1383=FACE_BOUND('',#1382,.T.);
+#1384=ADVANCED_FACE('',(#1383),#1362,.F.);
+#1385=CARTESIAN_POINT('',(0.,-0.,-0.));
+#1386=DIRECTION('',(0.,0.69871412,0.715400991));
+#1387=DIRECTION('',(-1.,0.,0.));
+#1388=AXIS2_PLACEMENT_3D('',#1385,#1386,#1387);
+#1389=PLANE('',#1388);
+#1390=ORIENTED_EDGE('',*,*,#1157,.F.);
+#1391=CARTESIAN_POINT('',(-34.256906448,-23.476201825,22.928614714));
+#1392=DIRECTION('',(0.,0.69871412,0.715400991));
+#1393=DIRECTION('',(-0.226031883,-0.696886345,0.680631332));
+#1394=AXIS2_PLACEMENT_3D('',#1391,#1392,#1393);
+#1395=ELLIPSE('',#1394,1.66507454,1.6);
+#1396=EDGE_CURVE('',#1146,#1323,#1395,.T.);
+#1397=ORIENTED_EDGE('',*,*,#1396,.T.);
+#1398=ORIENTED_EDGE('',*,*,#1328,.T.);
+#1399=CARTESIAN_POINT('',(-25.472564566,-1.456979379,1.422995043));
+#1400=DIRECTION('',(1.,-0.,-0.));
+#1401=VECTOR('',#1400,50.945129132);
+#1402=LINE('',#1399,#1401);
+#1403=EDGE_CURVE('',#1314,#1364,#1402,.T.);
+#1404=ORIENTED_EDGE('',*,*,#1403,.T.);
+#1405=ORIENTED_EDGE('',*,*,#1369,.F.);
+#1406=EDGE_LOOP('',(#1390,#1397,#1398,#1404,#1405));
+#1407=FACE_BOUND('',#1406,.T.);
+#1408=ADVANCED_FACE('',(#1407),#1389,.F.);
+#1409=CARTESIAN_POINT('',(-20.,5.485205765,17.666750919));
+#1410=DIRECTION('',(-1.,0.,0.));
+#1411=DIRECTION('',(0.,0.,1.));
+#1412=AXIS2_PLACEMENT_3D('',#1409,#1410,#1411);
+#1413=CYLINDRICAL_SURFACE('',#1412,10.);
+#1414=ORIENTED_EDGE('',*,*,#986,.F.);
+#1415=CARTESIAN_POINT('',(-21.,5.485205765,17.666750919));
+#1416=DIRECTION('',(-1.,0.,0.));
+#1417=DIRECTION('',(0.,0.,1.));
+#1418=AXIS2_PLACEMENT_3D('',#1415,#1416,#1417);
+#1419=CIRCLE('',#1418,10.);
+#1420=EDGE_CURVE('',#973,#1013,#1419,.T.);
+#1421=ORIENTED_EDGE('',*,*,#1420,.T.);
+#1422=ORIENTED_EDGE('',*,*,#1018,.F.);
+#1423=CARTESIAN_POINT('',(-23.5,5.485205765,17.666750919));
+#1424=DIRECTION('',(1.,-0.,-0.));
+#1425=DIRECTION('',(0.,0.,1.));
+#1426=AXIS2_PLACEMENT_3D('',#1423,#1424,#1425);
+#1427=CIRCLE('',#1426,10.);
+#1428=EDGE_CURVE('',#1011,#981,#1427,.T.);
+#1429=ORIENTED_EDGE('',*,*,#1428,.T.);
+#1430=EDGE_LOOP('',(#1414,#1421,#1422,#1429));
+#1431=FACE_BOUND('',#1430,.T.);
+#1432=ADVANCED_FACE('',(#1431),#1413,.T.);
+#1433=CARTESIAN_POINT('',(20.,5.485205765,17.666750919));
+#1434=DIRECTION('',(1.,0.,0.));
+#1435=DIRECTION('',(0.,0.,-1.));
+#1436=AXIS2_PLACEMENT_3D('',#1433,#1434,#1435);
+#1437=CYLINDRICAL_SURFACE('',#1436,10.);
+#1438=ORIENTED_EDGE('',*,*,#732,.F.);
+#1439=CARTESIAN_POINT('',(21.,5.485205765,17.666750919));
+#1440=DIRECTION('',(1.,0.,0.));
+#1441=DIRECTION('',(0.,0.,-1.));
+#1442=AXIS2_PLACEMENT_3D('',#1439,#1440,#1441);
+#1443=CIRCLE('',#1442,10.);
+#1444=EDGE_CURVE('',#719,#662,#1443,.T.);
+#1445=ORIENTED_EDGE('',*,*,#1444,.T.);
+#1446=ORIENTED_EDGE('',*,*,#667,.F.);
+#1447=CARTESIAN_POINT('',(23.5,5.485205765,17.666750919));
+#1448=DIRECTION('',(-1.,-0.,-0.));
+#1449=DIRECTION('',(0.,0.,-1.));
+#1450=AXIS2_PLACEMENT_3D('',#1447,#1448,#1449);
+#1451=CIRCLE('',#1450,10.);
+#1452=EDGE_CURVE('',#660,#727,#1451,.T.);
+#1453=ORIENTED_EDGE('',*,*,#1452,.T.);
+#1454=EDGE_LOOP('',(#1438,#1445,#1446,#1453));
+#1455=FACE_BOUND('',#1454,.T.);
+#1456=ADVANCED_FACE('',(#1455),#1437,.T.);
+#1457=CARTESIAN_POINT('',(-0.,41.858253313,30.));
+#1458=DIRECTION('',(1.,-0.,0.));
+#1459=DIRECTION('',(0.,-0.,-1.));
+#1460=AXIS2_PLACEMENT_3D('',#1457,#1458,#1459);
+#1461=CYLINDRICAL_SURFACE('',#1460,25.);
+#1462=ORIENTED_EDGE('',*,*,#1034,.F.);
+#1463=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846));
+#1464=VERTEX_POINT('',#1463);
+#1465=CARTESIAN_POINT('',(-21.,41.858253313,30.));
+#1466=DIRECTION('',(1.,-0.,-0.));
+#1467=DIRECTION('',(0.,0.,1.));
+#1468=AXIS2_PLACEMENT_3D('',#1465,#1466,#1467);
+#1469=CIRCLE('',#1468,25.);
+#1470=EDGE_CURVE('',#1021,#1464,#1469,.T.);
+#1471=ORIENTED_EDGE('',*,*,#1470,.T.);
+#1472=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846));
+#1473=CARTESIAN_POINT('',(-21.,29.057908801,8.516671654));
+#1474=CARTESIAN_POINT('',(-20.956795278,29.586215266,8.210931006));
+#1475=CARTESIAN_POINT('',(-20.884026028,30.120695368,7.926719014));
+#1476=CARTESIAN_POINT('',(-20.811256778,30.65517547,7.642507021));
+#1477=CARTESIAN_POINT('',(-20.708584724,31.195799437,7.379868084));
+#1478=CARTESIAN_POINT('',(-20.583706147,31.74319075,7.13768364));
+#1479=CARTESIAN_POINT('',(-20.521266858,32.016886406,7.016591418));
+#1480=CARTESIAN_POINT('',(-20.453283514,32.29227964,6.900622153));
+#1481=CARTESIAN_POINT('',(-20.380302398,32.569421183,6.789709226));
+#1482=CARTESIAN_POINT('',(-20.307321283,32.846562727,6.6787963));
+#1483=CARTESIAN_POINT('',(-20.229189492,33.126026116,6.572748751));
+#1484=CARTESIAN_POINT('',(-20.147420608,33.405031464,6.472504587));
+#1485=CARTESIAN_POINT('',(-19.98388284,33.96304216,6.272016259));
+#1486=CARTESIAN_POINT('',(-19.805364252,34.520747681,6.093983237));
+#1487=CARTESIAN_POINT('',(-19.616116666,35.079205076,5.936656404));
+#1488=CARTESIAN_POINT('',(-19.237621494,36.196119866,5.62200274));
+#1489=CARTESIAN_POINT('',(-18.816548763,37.316053517,5.389695945));
+#1490=CARTESIAN_POINT('',(-18.374224551,38.444963072,5.234107128));
+#1491=CARTESIAN_POINT('',(-18.153062445,39.009417849,5.15631272));
+#1492=CARTESIAN_POINT('',(-17.926439584,39.576096284,5.097837104));
+#1493=CARTESIAN_POINT('',(-17.696369302,40.14568207,5.058726982));
+#1494=CARTESIAN_POINT('',(-17.466299019,40.715267856,5.019616859));
+#1495=CARTESIAN_POINT('',(-17.233016454,41.287024083,5.));
+#1496=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#1497=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1472,#1473,#1474,#1475,#1476,#1477,#1478,#1479,#1480,#1481,#1482,#1483,#1484,#1485,#1486,#1487,#1488,#1489,#1490,#1491,#1492,#1493,#1494,#1495,#1496),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.);
+#1498=EDGE_CURVE('',#1464,#189,#1497,.T.);
+#1499=ORIENTED_EDGE('',*,*,#1498,.T.);
+#1500=ORIENTED_EDGE('',*,*,#250,.F.);
+#1501=CARTESIAN_POINT('',(-23.5,41.858253313,30.));
+#1502=DIRECTION('',(-1.,0.,0.));
+#1503=DIRECTION('',(0.,0.,1.));
+#1504=AXIS2_PLACEMENT_3D('',#1501,#1502,#1503);
+#1505=CIRCLE('',#1504,25.);
+#1506=EDGE_CURVE('',#239,#1029,#1505,.T.);
+#1507=ORIENTED_EDGE('',*,*,#1506,.T.);
+#1508=EDGE_LOOP('',(#1462,#1471,#1499,#1500,#1507));
+#1509=FACE_BOUND('',#1508,.T.);
+#1510=ADVANCED_FACE('',(#1509),#1461,.F.);
+#1511=CARTESIAN_POINT('',(20.,41.858253313,30.));
+#1512=DIRECTION('',(-1.,0.,-0.));
+#1513=DIRECTION('',(-0.,0.,1.));
+#1514=AXIS2_PLACEMENT_3D('',#1511,#1512,#1513);
+#1515=CYLINDRICAL_SURFACE('',#1514,25.);
+#1516=CARTESIAN_POINT('',(21.,28.534785562,8.846153846));
+#1517=VERTEX_POINT('',#1516);
+#1518=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#1519=CARTESIAN_POINT('',(17.233016454,41.287024083,5.));
+#1520=CARTESIAN_POINT('',(17.466299019,40.715267856,5.019616859));
+#1521=CARTESIAN_POINT('',(17.696369302,40.14568207,5.058726982));
+#1522=CARTESIAN_POINT('',(17.926439584,39.576096284,5.097837104));
+#1523=CARTESIAN_POINT('',(18.153062445,39.009417849,5.15631272));
+#1524=CARTESIAN_POINT('',(18.374224551,38.444963072,5.234107128));
+#1525=CARTESIAN_POINT('',(18.816548763,37.316053517,5.389695945));
+#1526=CARTESIAN_POINT('',(19.237621494,36.196119866,5.62200274));
+#1527=CARTESIAN_POINT('',(19.616116666,35.079205076,5.936656404));
+#1528=CARTESIAN_POINT('',(19.805364252,34.520747681,6.093983237));
+#1529=CARTESIAN_POINT('',(19.98388284,33.96304216,6.272016259));
+#1530=CARTESIAN_POINT('',(20.147420608,33.405031464,6.472504587));
+#1531=CARTESIAN_POINT('',(20.229189492,33.126026116,6.572748751));
+#1532=CARTESIAN_POINT('',(20.307321283,32.846562727,6.6787963));
+#1533=CARTESIAN_POINT('',(20.380302398,32.569421183,6.789709226));
+#1534=CARTESIAN_POINT('',(20.453283514,32.29227964,6.900622153));
+#1535=CARTESIAN_POINT('',(20.521266858,32.016886406,7.016591418));
+#1536=CARTESIAN_POINT('',(20.583706147,31.74319075,7.13768364));
+#1537=CARTESIAN_POINT('',(20.708584724,31.195799437,7.379868084));
+#1538=CARTESIAN_POINT('',(20.811256778,30.65517547,7.642507021));
+#1539=CARTESIAN_POINT('',(20.884026028,30.120695368,7.926719014));
+#1540=CARTESIAN_POINT('',(20.956795278,29.586215266,8.210931006));
+#1541=CARTESIAN_POINT('',(21.,29.057908801,8.516671654));
+#1542=CARTESIAN_POINT('',(21.,28.534785562,8.846153846));
+#1543=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1518,#1519,#1520,#1521,#1522,#1523,#1524,#1525,#1526,#1527,#1528,#1529,#1530,#1531,#1532,#1533,#1534,#1535,#1536,#1537,#1538,#1539,#1540,#1541,#1542),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.007599542,0.009499427,0.01044937,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.);
+#1544=EDGE_CURVE('',#207,#1517,#1543,.T.);
+#1545=ORIENTED_EDGE('',*,*,#1544,.T.);
+#1546=CARTESIAN_POINT('',(21.,41.858253313,30.));
+#1547=DIRECTION('',(-1.,-0.,-0.));
+#1548=DIRECTION('',(0.,0.,-1.));
+#1549=AXIS2_PLACEMENT_3D('',#1546,#1547,#1548);
+#1550=CIRCLE('',#1549,25.);
+#1551=EDGE_CURVE('',#1517,#711,#1550,.T.);
+#1552=ORIENTED_EDGE('',*,*,#1551,.T.);
+#1553=ORIENTED_EDGE('',*,*,#716,.F.);
+#1554=CARTESIAN_POINT('',(23.5,41.858253313,30.));
+#1555=DIRECTION('',(1.,0.,0.));
+#1556=DIRECTION('',(0.,0.,-1.));
+#1557=AXIS2_PLACEMENT_3D('',#1554,#1555,#1556);
+#1558=CIRCLE('',#1557,25.);
+#1559=EDGE_CURVE('',#709,#215,#1558,.T.);
+#1560=ORIENTED_EDGE('',*,*,#1559,.T.);
+#1561=ORIENTED_EDGE('',*,*,#220,.F.);
+#1562=EDGE_LOOP('',(#1545,#1552,#1553,#1560,#1561));
+#1563=FACE_BOUND('',#1562,.T.);
+#1564=ADVANCED_FACE('',(#1563),#1515,.F.);
+#1565=CARTESIAN_POINT('',(17.,0.,8.));
+#1566=DIRECTION('',(0.,-1.,0.));
+#1567=DIRECTION('',(0.,0.,-1.));
+#1568=AXIS2_PLACEMENT_3D('',#1565,#1566,#1567);
+#1569=CYLINDRICAL_SURFACE('',#1568,3.);
+#1570=ORIENTED_EDGE('',*,*,#82,.F.);
+#1571=CARTESIAN_POINT('',(20.,28.001846852,8.));
+#1572=CARTESIAN_POINT('',(20.,28.54589502,7.74300389));
+#1573=CARTESIAN_POINT('',(19.967596458,29.095333744,7.504526185));
+#1574=CARTESIAN_POINT('',(19.91301952,29.65119305,7.282840831));
+#1575=CARTESIAN_POINT('',(19.858442583,30.207052357,7.061155477));
+#1576=CARTESIAN_POINT('',(19.781438541,30.769301281,6.856297106));
+#1577=CARTESIAN_POINT('',(19.687779608,31.338588247,6.66739324));
+#1578=CARTESIAN_POINT('',(19.640950142,31.62323173,6.572941307));
+#1579=CARTESIAN_POINT('',(19.589922062,31.909640198,6.482509675));
+#1580=CARTESIAN_POINT('',(19.535187483,32.197867633,6.395997372));
+#1581=CARTESIAN_POINT('',(19.480452904,32.486095069,6.309485069));
+#1582=CARTESIAN_POINT('',(19.421874368,32.776735903,6.22675548));
+#1583=CARTESIAN_POINT('',(19.36054821,33.066901538,6.14856484));
+#1584=CARTESIAN_POINT('',(19.237895893,33.647232809,5.99218356));
+#1585=CARTESIAN_POINT('',(19.104023183,34.227247455,5.85330693));
+#1586=CARTESIAN_POINT('',(18.962087494,34.808043146,5.730592001));
+#1587=CARTESIAN_POINT('',(18.678216116,35.969634528,5.485162143));
+#1588=CARTESIAN_POINT('',(18.362411557,37.134365521,5.303962851));
+#1589=CARTESIAN_POINT('',(18.030668408,38.308431462,5.182603572));
+#1590=CARTESIAN_POINT('',(17.864796834,38.895464433,5.121923933));
+#1591=CARTESIAN_POINT('',(17.69482063,39.484806861,5.076318457));
+#1592=CARTESIAN_POINT('',(17.522276087,40.077179202,5.045811839));
+#1593=CARTESIAN_POINT('',(17.349731543,40.669551542,5.01530522));
+#1594=CARTESIAN_POINT('',(17.174762593,41.264175045,5.));
+#1595=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#1596=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1571,#1572,#1573,#1574,#1575,#1576,#1577,#1578,#1579,#1580,#1581,#1582,#1583,#1584,#1585,#1586,#1587,#1588,#1589,#1590,#1591,#1592,#1593,#1594,#1595),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.);
+#1597=EDGE_CURVE('',#68,#207,#1596,.T.);
+#1598=ORIENTED_EDGE('',*,*,#1597,.T.);
+#1599=ORIENTED_EDGE('',*,*,#212,.F.);
+#1600=CARTESIAN_POINT('',(17.,4.480500687,8.));
+#1601=DIRECTION('',(0.,-1.,0.));
+#1602=DIRECTION('',(0.,0.,-1.));
+#1603=AXIS2_PLACEMENT_3D('',#1600,#1601,#1602);
+#1604=CIRCLE('',#1603,3.);
+#1605=EDGE_CURVE('',#199,#77,#1604,.T.);
+#1606=ORIENTED_EDGE('',*,*,#1605,.T.);
+#1607=EDGE_LOOP('',(#1570,#1598,#1599,#1606));
+#1608=FACE_BOUND('',#1607,.T.);
+#1609=ADVANCED_FACE('',(#1608),#1569,.F.);
+#1610=CARTESIAN_POINT('',(17.,5.58971296,5.723207931));
+#1611=DIRECTION('',(0.,-0.715400991,0.69871412));
+#1612=DIRECTION('',(0.,-0.69871412,-0.715400991));
+#1613=AXIS2_PLACEMENT_3D('',#1610,#1611,#1612);
+#1614=CYLINDRICAL_SURFACE('',#1613,3.);
+#1615=ORIENTED_EDGE('',*,*,#851,.F.);
+#1616=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303));
+#1617=VERTEX_POINT('',#1616);
+#1618=CARTESIAN_POINT('',(18.461329278,-21.382228865,28.403710911));
+#1619=CARTESIAN_POINT('',(18.463116984,-21.280666691,28.30591146));
+#1620=CARTESIAN_POINT('',(18.475007024,-21.176857501,28.213714286));
+#1621=CARTESIAN_POINT('',(18.495184252,-21.071695307,28.127219061));
+#1622=CARTESIAN_POINT('',(18.515361479,-20.966533112,28.040723836));
+#1623=CARTESIAN_POINT('',(18.544059394,-20.858956669,27.959141161));
+#1624=CARTESIAN_POINT('',(18.578285047,-20.751539807,27.883825611));
+#1625=CARTESIAN_POINT('',(18.646736354,-20.536706083,27.733194511));
+#1626=CARTESIAN_POINT('',(18.735522167,-20.323829754,27.607612066));
+#1627=CARTESIAN_POINT('',(18.831556131,-20.107948824,27.500244622));
+#1628=CARTESIAN_POINT('',(18.927590094,-19.892067895,27.392877177));
+#1629=CARTESIAN_POINT('',(19.028810773,-19.678600773,27.306596908));
+#1630=CARTESIAN_POINT('',(19.129191707,-19.463784565,27.238152691));
+#1631=CARTESIAN_POINT('',(19.22957264,-19.248968357,27.169708475));
+#1632=CARTESIAN_POINT('',(19.329361102,-19.032957419,27.1192346));
+#1633=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303));
+#1634=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1618,#1619,#1620,#1621,#1622,#1623,#1624,#1625,#1626,#1627,#1628,#1629,#1630,#1631,#1632,#1633),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,4),(0.,0.000415404,0.000830808,0.001661615,0.002492423,0.003323231),.UNSPECIFIED.);
+#1635=EDGE_CURVE('',#835,#1617,#1634,.T.);
+#1636=ORIENTED_EDGE('',*,*,#1635,.T.);
+#1637=CARTESIAN_POINT('',(17.,-15.854009142,26.666750919));
+#1638=DIRECTION('',(0.,0.140917209,0.990021384));
+#1639=DIRECTION('',(0.,-0.990021384,0.140917209));
+#1640=AXIS2_PLACEMENT_3D('',#1637,#1638,#1639);
+#1641=ELLIPSE('',#1640,5.076746801,3.);
+#1642=EDGE_CURVE('',#1617,#35,#1641,.T.);
+#1643=ORIENTED_EDGE('',*,*,#1642,.T.);
+#1644=ORIENTED_EDGE('',*,*,#40,.F.);
+#1645=CARTESIAN_POINT('',(17.,2.384358327,8.853797026));
+#1646=DIRECTION('',(0.,0.715400991,-0.69871412));
+#1647=DIRECTION('',(0.,0.69871412,0.715400991));
+#1648=AXIS2_PLACEMENT_3D('',#1645,#1646,#1647);
+#1649=CIRCLE('',#1648,3.);
+#1650=EDGE_CURVE('',#33,#622,#1649,.T.);
+#1651=ORIENTED_EDGE('',*,*,#1650,.T.);
+#1652=ORIENTED_EDGE('',*,*,#627,.F.);
+#1653=EDGE_LOOP('',(#1615,#1636,#1643,#1644,#1651,#1652));
+#1654=FACE_BOUND('',#1653,.T.);
+#1655=ADVANCED_FACE('',(#1654),#1614,.F.);
+#1656=CARTESIAN_POINT('',(-17.,62.,8.));
+#1657=DIRECTION('',(0.,-1.,0.));
+#1658=DIRECTION('',(0.,0.,-1.));
+#1659=AXIS2_PLACEMENT_3D('',#1656,#1657,#1658);
+#1660=CYLINDRICAL_SURFACE('',#1659,3.);
+#1661=ORIENTED_EDGE('',*,*,#196,.F.);
+#1662=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#1663=CARTESIAN_POINT('',(-17.174762593,41.264175045,5.));
+#1664=CARTESIAN_POINT('',(-17.349731543,40.669551542,5.01530522));
+#1665=CARTESIAN_POINT('',(-17.522276087,40.077179202,5.045811839));
+#1666=CARTESIAN_POINT('',(-17.69482063,39.484806861,5.076318457));
+#1667=CARTESIAN_POINT('',(-17.864796834,38.895464433,5.121923933));
+#1668=CARTESIAN_POINT('',(-18.030668408,38.308431462,5.182603572));
+#1669=CARTESIAN_POINT('',(-18.362411557,37.134365521,5.303962851));
+#1670=CARTESIAN_POINT('',(-18.678216116,35.969634528,5.485162143));
+#1671=CARTESIAN_POINT('',(-18.962087494,34.808043146,5.730592001));
+#1672=CARTESIAN_POINT('',(-19.104023183,34.227247455,5.85330693));
+#1673=CARTESIAN_POINT('',(-19.237895893,33.647232809,5.99218356));
+#1674=CARTESIAN_POINT('',(-19.36054821,33.066901538,6.14856484));
+#1675=CARTESIAN_POINT('',(-19.421874368,32.776735903,6.22675548));
+#1676=CARTESIAN_POINT('',(-19.480452904,32.486095069,6.309485069));
+#1677=CARTESIAN_POINT('',(-19.535187483,32.197867633,6.395997372));
+#1678=CARTESIAN_POINT('',(-19.589922062,31.909640198,6.482509675));
+#1679=CARTESIAN_POINT('',(-19.640950142,31.62323173,6.572941307));
+#1680=CARTESIAN_POINT('',(-19.687779608,31.338588247,6.66739324));
+#1681=CARTESIAN_POINT('',(-19.781438541,30.769301281,6.856297106));
+#1682=CARTESIAN_POINT('',(-19.858442583,30.207052357,7.061155477));
+#1683=CARTESIAN_POINT('',(-19.91301952,29.65119305,7.282840831));
+#1684=CARTESIAN_POINT('',(-19.967596458,29.095333744,7.504526185));
+#1685=CARTESIAN_POINT('',(-20.,28.54589502,7.74300389));
+#1686=CARTESIAN_POINT('',(-20.,28.001846852,8.));
+#1687=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1662,#1663,#1664,#1665,#1666,#1667,#1668,#1669,#1670,#1671,#1672,#1673,#1674,#1675,#1676,#1677,#1678,#1679,#1680,#1681,#1682,#1683,#1684,#1685,#1686),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,3,4),(0.,0.001899885,0.003799771,0.007599542,0.009499427,0.01044937,0.011399313,0.013299198,0.015199084),.UNSPECIFIED.);
+#1688=EDGE_CURVE('',#189,#102,#1687,.T.);
+#1689=ORIENTED_EDGE('',*,*,#1688,.T.);
+#1690=ORIENTED_EDGE('',*,*,#107,.F.);
+#1691=CARTESIAN_POINT('',(-17.,4.480500687,8.));
+#1692=DIRECTION('',(0.,-1.,0.));
+#1693=DIRECTION('',(0.,0.,-1.));
+#1694=AXIS2_PLACEMENT_3D('',#1691,#1692,#1693);
+#1695=CIRCLE('',#1694,3.);
+#1696=EDGE_CURVE('',#100,#191,#1695,.T.);
+#1697=ORIENTED_EDGE('',*,*,#1696,.T.);
+#1698=EDGE_LOOP('',(#1661,#1689,#1690,#1697));
+#1699=FACE_BOUND('',#1698,.T.);
+#1700=ADVANCED_FACE('',(#1699),#1660,.F.);
+#1701=CARTESIAN_POINT('',(-17.,5.58971296,5.723207931));
+#1702=DIRECTION('',(0.,0.715400991,-0.69871412));
+#1703=DIRECTION('',(0.,0.69871412,0.715400991));
+#1704=AXIS2_PLACEMENT_3D('',#1701,#1702,#1703);
+#1705=CYLINDRICAL_SURFACE('',#1704,3.);
+#1706=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303));
+#1707=VERTEX_POINT('',#1706);
+#1708=CARTESIAN_POINT('',(-17.,-15.854009142,26.666750919));
+#1709=DIRECTION('',(0.,0.140917209,0.990021384));
+#1710=DIRECTION('',(0.,0.990021384,-0.140917209));
+#1711=AXIS2_PLACEMENT_3D('',#1708,#1709,#1710);
+#1712=ELLIPSE('',#1711,5.076746801,3.);
+#1713=EDGE_CURVE('',#136,#1707,#1712,.T.);
+#1714=ORIENTED_EDGE('',*,*,#1713,.T.);
+#1715=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303));
+#1716=CARTESIAN_POINT('',(-19.329361102,-19.032957419,27.1192346));
+#1717=CARTESIAN_POINT('',(-19.22957264,-19.248968357,27.169708475));
+#1718=CARTESIAN_POINT('',(-19.129191707,-19.463784565,27.238152691));
+#1719=CARTESIAN_POINT('',(-19.028810773,-19.678600773,27.306596908));
+#1720=CARTESIAN_POINT('',(-18.927590094,-19.892067895,27.392877177));
+#1721=CARTESIAN_POINT('',(-18.831556131,-20.107948824,27.500244622));
+#1722=CARTESIAN_POINT('',(-18.735522167,-20.323829754,27.607612066));
+#1723=CARTESIAN_POINT('',(-18.646736354,-20.536706083,27.733194511));
+#1724=CARTESIAN_POINT('',(-18.578285047,-20.751539807,27.883825611));
+#1725=CARTESIAN_POINT('',(-18.544059394,-20.858956669,27.959141161));
+#1726=CARTESIAN_POINT('',(-18.515361479,-20.966533112,28.040723836));
+#1727=CARTESIAN_POINT('',(-18.495184252,-21.071695307,28.127219061));
+#1728=CARTESIAN_POINT('',(-18.475007024,-21.176857501,28.213714286));
+#1729=CARTESIAN_POINT('',(-18.463116984,-21.280666691,28.30591146));
+#1730=CARTESIAN_POINT('',(-18.461329278,-21.382228865,28.403710911));
+#1731=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1715,#1716,#1717,#1718,#1719,#1720,#1721,#1722,#1723,#1724,#1725,#1726,#1727,#1728,#1729,#1730),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,4),(-0.,0.000830808,0.001661615,0.002492423,0.002907827,0.003323231),.UNSPECIFIED.);
+#1732=EDGE_CURVE('',#1707,#855,#1731,.T.);
+#1733=ORIENTED_EDGE('',*,*,#1732,.T.);
+#1734=ORIENTED_EDGE('',*,*,#861,.F.);
+#1735=ORIENTED_EDGE('',*,*,#643,.F.);
+#1736=CARTESIAN_POINT('',(-17.,2.384358327,8.853797026));
+#1737=DIRECTION('',(0.,0.715400991,-0.69871412));
+#1738=DIRECTION('',(0.,0.69871412,0.715400991));
+#1739=AXIS2_PLACEMENT_3D('',#1736,#1737,#1738);
+#1740=CIRCLE('',#1739,3.);
+#1741=EDGE_CURVE('',#630,#144,#1740,.T.);
+#1742=ORIENTED_EDGE('',*,*,#1741,.T.);
+#1743=ORIENTED_EDGE('',*,*,#149,.F.);
+#1744=EDGE_LOOP('',(#1714,#1733,#1734,#1735,#1742,#1743));
+#1745=FACE_BOUND('',#1744,.T.);
+#1746=ADVANCED_FACE('',(#1745),#1705,.F.);
+#1747=CARTESIAN_POINT('',(0.,-19.224694785,30.666750919));
+#1748=DIRECTION('',(1.,0.,0.));
+#1749=DIRECTION('',(0.,0.,-1.));
+#1750=AXIS2_PLACEMENT_3D('',#1747,#1748,#1749);
+#1751=CYLINDRICAL_SURFACE('',#1750,3.);
+#1752=ORIENTED_EDGE('',*,*,#692,.F.);
+#1753=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919));
+#1754=CARTESIAN_POINT('',(20.061469153,-19.477685187,27.666750919));
+#1755=CARTESIAN_POINT('',(19.879189926,-19.720524415,27.697815974));
+#1756=CARTESIAN_POINT('',(19.699098932,-19.958858558,27.757970495));
+#1757=CARTESIAN_POINT('',(19.519007937,-20.1971927,27.818125016));
+#1758=CARTESIAN_POINT('',(19.337980773,-20.43278664,27.908411883));
+#1759=CARTESIAN_POINT('',(19.194638955,-20.661564532,28.033235146));
+#1760=CARTESIAN_POINT('',(19.122968046,-20.775953478,28.095646777));
+#1761=CARTESIAN_POINT('',(19.060327383,-20.890470923,28.167948847));
+#1762=CARTESIAN_POINT('',(19.016626246,-21.001028793,28.249182411));
+#1763=CARTESIAN_POINT('',(18.972925108,-21.111586663,28.330415974));
+#1764=CARTESIAN_POINT('',(18.948132009,-21.219184631,28.421263027));
+#1765=CARTESIAN_POINT('',(18.948138016,-21.320876435,28.520586319));
+#1766=CARTESIAN_POINT('',(18.948144024,-21.422568239,28.619909611));
+#1767=CARTESIAN_POINT('',(18.972619847,-21.514983626,28.72419078));
+#1768=CARTESIAN_POINT('',(19.016408724,-21.599157159,28.833194691));
+#1769=CARTESIAN_POINT('',(19.038303163,-21.641243926,28.887696647));
+#1770=CARTESIAN_POINT('',(19.06509424,-21.681237264,28.943420254));
+#1771=CARTESIAN_POINT('',(19.095021711,-21.718432387,28.999036076));
+#1772=CARTESIAN_POINT('',(19.124949183,-21.755627509,29.054651897));
+#1773=CARTESIAN_POINT('',(19.158098122,-21.790309918,29.110526682));
+#1774=CARTESIAN_POINT('',(19.193758876,-21.822770996,29.166750918));
+#1775=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1753,#1754,#1755,#1756,#1757,#1758,#1759,#1760,#1761,#1762,#1763,#1764,#1765,#1766,#1767,#1768,#1769,#1770,#1771,#1772,#1773,#1774),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,4),(0.,0.001120134,0.002240267,0.002800334,0.003360401,0.003920467,0.004200501,0.004480534),.UNSPECIFIED.);
+#1776=EDGE_CURVE('',#678,#827,#1775,.T.);
+#1777=ORIENTED_EDGE('',*,*,#1776,.T.);
+#1778=ORIENTED_EDGE('',*,*,#832,.F.);
+#1779=CARTESIAN_POINT('',(23.5,-19.224694785,30.666750919));
+#1780=DIRECTION('',(1.,0.,0.));
+#1781=DIRECTION('',(0.,0.,-1.));
+#1782=AXIS2_PLACEMENT_3D('',#1779,#1780,#1781);
+#1783=CIRCLE('',#1782,3.);
+#1784=EDGE_CURVE('',#815,#687,#1783,.T.);
+#1785=ORIENTED_EDGE('',*,*,#1784,.T.);
+#1786=EDGE_LOOP('',(#1752,#1777,#1778,#1785));
+#1787=FACE_BOUND('',#1786,.T.);
+#1788=ADVANCED_FACE('',(#1787),#1751,.F.);
+#1789=CARTESIAN_POINT('',(0.,-19.224694785,30.666750919));
+#1790=DIRECTION('',(1.,0.,0.));
+#1791=DIRECTION('',(0.,0.,-1.));
+#1792=AXIS2_PLACEMENT_3D('',#1789,#1790,#1791);
+#1793=CYLINDRICAL_SURFACE('',#1792,3.);
+#1794=ORIENTED_EDGE('',*,*,#881,.F.);
+#1795=CARTESIAN_POINT('',(-19.193758876,-21.822770996,29.166750918));
+#1796=CARTESIAN_POINT('',(-19.158098122,-21.790309918,29.110526682));
+#1797=CARTESIAN_POINT('',(-19.124949183,-21.755627509,29.054651897));
+#1798=CARTESIAN_POINT('',(-19.095021711,-21.718432387,28.999036076));
+#1799=CARTESIAN_POINT('',(-19.06509424,-21.681237264,28.943420254));
+#1800=CARTESIAN_POINT('',(-19.038303163,-21.641243926,28.887696647));
+#1801=CARTESIAN_POINT('',(-19.016408724,-21.599157159,28.833194691));
+#1802=CARTESIAN_POINT('',(-18.972619847,-21.514983626,28.72419078));
+#1803=CARTESIAN_POINT('',(-18.948144024,-21.422568239,28.619909611));
+#1804=CARTESIAN_POINT('',(-18.948138016,-21.320876435,28.520586319));
+#1805=CARTESIAN_POINT('',(-18.948132009,-21.219184631,28.421263027));
+#1806=CARTESIAN_POINT('',(-18.972925108,-21.111586663,28.330415974));
+#1807=CARTESIAN_POINT('',(-19.016626246,-21.001028793,28.249182411));
+#1808=CARTESIAN_POINT('',(-19.060327383,-20.890470923,28.167948847));
+#1809=CARTESIAN_POINT('',(-19.122968046,-20.775953478,28.095646777));
+#1810=CARTESIAN_POINT('',(-19.194638955,-20.661564532,28.033235146));
+#1811=CARTESIAN_POINT('',(-19.337980773,-20.43278664,27.908411883));
+#1812=CARTESIAN_POINT('',(-19.519007937,-20.1971927,27.818125016));
+#1813=CARTESIAN_POINT('',(-19.699098932,-19.958858558,27.757970495));
+#1814=CARTESIAN_POINT('',(-19.879189926,-19.720524415,27.697815974));
+#1815=CARTESIAN_POINT('',(-20.061469153,-19.477685187,27.666750919));
+#1816=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919));
+#1817=B_SPLINE_CURVE_WITH_KNOTS('',3,(#1795,#1796,#1797,#1798,#1799,#1800,#1801,#1802,#1803,#1804,#1805,#1806,#1807,#1808,#1809,#1810,#1811,#1812,#1813,#1814,#1815,#1816),.UNSPECIFIED.,.F.,.F.,(4,3,3,3,3,3,3,4),(-0.,0.000280033,0.000560067,0.001120134,0.0016802,0.002240267,0.003360401,0.004480534),.UNSPECIFIED.);
+#1818=EDGE_CURVE('',#864,#962,#1817,.T.);
+#1819=ORIENTED_EDGE('',*,*,#1818,.T.);
+#1820=ORIENTED_EDGE('',*,*,#1000,.F.);
+#1821=CARTESIAN_POINT('',(-23.5,-19.224694785,30.666750919));
+#1822=DIRECTION('',(-1.,0.,0.));
+#1823=DIRECTION('',(0.,0.,1.));
+#1824=AXIS2_PLACEMENT_3D('',#1821,#1822,#1823);
+#1825=CIRCLE('',#1824,3.);
+#1826=EDGE_CURVE('',#989,#876,#1825,.T.);
+#1827=ORIENTED_EDGE('',*,*,#1826,.T.);
+#1828=EDGE_LOOP('',(#1794,#1819,#1820,#1827));
+#1829=FACE_BOUND('',#1828,.T.);
+#1830=ADVANCED_FACE('',(#1829),#1793,.F.);
+#1831=CARTESIAN_POINT('',(-35.,-25.004809472,44.67820323));
+#1832=DIRECTION('',(0.,-0.866025404,-0.5));
+#1833=DIRECTION('',(0.,0.5,-0.866025404));
+#1834=AXIS2_PLACEMENT_3D('',#1831,#1832,#1833);
+#1835=CYLINDRICAL_SURFACE('',#1834,2.);
+#1836=ORIENTED_EDGE('',*,*,#1285,.F.);
+#1837=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323));
+#1838=DIRECTION('',(-0.196116135,-0.849207776,-0.490290338));
+#1839=DIRECTION('',(-0.980580676,0.169841555,0.098058068));
+#1840=AXIS2_PLACEMENT_3D('',#1837,#1838,#1839);
+#1841=ELLIPSE('',#1840,2.039607805,2.);
+#1842=EDGE_CURVE('',#1274,#1234,#1841,.T.);
+#1843=ORIENTED_EDGE('',*,*,#1842,.T.);
+#1844=ORIENTED_EDGE('',*,*,#1239,.F.);
+#1845=ORIENTED_EDGE('',*,*,#1189,.F.);
+#1846=EDGE_LOOP('',(#1836,#1843,#1844,#1845));
+#1847=FACE_BOUND('',#1846,.T.);
+#1848=ADVANCED_FACE('',(#1847),#1835,.T.);
+#1849=CARTESIAN_POINT('',(31.,-25.004809472,44.67820323));
+#1850=DIRECTION('',(0.,-0.866025404,-0.5));
+#1851=DIRECTION('',(0.,0.5,-0.866025404));
+#1852=AXIS2_PLACEMENT_3D('',#1849,#1850,#1851);
+#1853=CYLINDRICAL_SURFACE('',#1852,2.);
+#1854=ORIENTED_EDGE('',*,*,#1174,.F.);
+#1855=ORIENTED_EDGE('',*,*,#1300,.F.);
+#1856=CARTESIAN_POINT('',(32.,-31.066987298,43.17820323));
+#1857=VERTEX_POINT('',#1856);
+#1858=CARTESIAN_POINT('',(31.,-31.066987298,41.17820323));
+#1859=DIRECTION('',(-0.707106781,0.612372436,0.353553391));
+#1860=DIRECTION('',(-0.707106781,-0.612372436,-0.353553391));
+#1861=AXIS2_PLACEMENT_3D('',#1858,#1859,#1860);
+#1862=ELLIPSE('',#1861,2.828427125,2.);
+#1863=EDGE_CURVE('',#1857,#784,#1862,.T.);
+#1864=ORIENTED_EDGE('',*,*,#1863,.F.);
+#1865=CARTESIAN_POINT('',(31.,-31.066987298,41.17820323));
+#1866=DIRECTION('',(-0.707106781,0.612372436,0.353553391));
+#1867=DIRECTION('',(-0.707106781,-0.612372436,-0.353553391));
+#1868=AXIS2_PLACEMENT_3D('',#1865,#1866,#1867);
+#1869=ELLIPSE('',#1868,2.828427125,2.);
+#1870=EDGE_CURVE('',#1266,#1857,#1869,.T.);
+#1871=ORIENTED_EDGE('',*,*,#1870,.F.);
+#1872=ORIENTED_EDGE('',*,*,#1271,.F.);
+#1873=EDGE_LOOP('',(#1854,#1855,#1864,#1871,#1872));
+#1874=FACE_BOUND('',#1873,.T.);
+#1875=ADVANCED_FACE('',(#1874),#1853,.T.);
+#1876=CARTESIAN_POINT('',(0.,-31.066987298,41.17820323));
+#1877=DIRECTION('',(-1.,0.,0.));
+#1878=DIRECTION('',(0.,0.,1.));
+#1879=AXIS2_PLACEMENT_3D('',#1876,#1877,#1878);
+#1880=CYLINDRICAL_SURFACE('',#1879,2.);
+#1881=CARTESIAN_POINT('',(-35.2,-31.066987298,43.17820323));
+#1882=VERTEX_POINT('',#1881);
+#1883=CARTESIAN_POINT('',(-35.2,-31.066987298,43.17820323));
+#1884=DIRECTION('',(1.,-0.,-0.));
+#1885=VECTOR('',#1884,67.2);
+#1886=LINE('',#1883,#1885);
+#1887=EDGE_CURVE('',#1882,#1857,#1886,.T.);
+#1888=ORIENTED_EDGE('',*,*,#1887,.T.);
+#1889=ORIENTED_EDGE('',*,*,#1863,.T.);
+#1890=ORIENTED_EDGE('',*,*,#789,.F.);
+#1891=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323));
+#1892=DIRECTION('',(0.980580676,0.169841555,0.098058068));
+#1893=DIRECTION('',(-0.196116135,0.849207776,0.490290338));
+#1894=AXIS2_PLACEMENT_3D('',#1891,#1892,#1893);
+#1895=ELLIPSE('',#1894,2.039607805,2.);
+#1896=EDGE_CURVE('',#776,#1882,#1895,.T.);
+#1897=ORIENTED_EDGE('',*,*,#1896,.T.);
+#1898=EDGE_LOOP('',(#1888,#1889,#1890,#1897));
+#1899=FACE_BOUND('',#1898,.T.);
+#1900=ADVANCED_FACE('',(#1899),#1880,.T.);
+#1901=CARTESIAN_POINT('',(0.,2.036591221,5.));
+#1902=DIRECTION('',(-1.,0.,0.));
+#1903=DIRECTION('',(0.,0.,1.));
+#1904=AXIS2_PLACEMENT_3D('',#1901,#1902,#1903);
+#1905=CYLINDRICAL_SURFACE('',#1904,5.);
+#1906=ORIENTED_EDGE('',*,*,#1376,.F.);
+#1907=ORIENTED_EDGE('',*,*,#1403,.F.);
+#1908=ORIENTED_EDGE('',*,*,#1320,.F.);
+#1909=ORIENTED_EDGE('',*,*,#444,.F.);
+#1910=ORIENTED_EDGE('',*,*,#512,.F.);
+#1911=ORIENTED_EDGE('',*,*,#302,.F.);
+#1912=EDGE_LOOP('',(#1906,#1907,#1908,#1909,#1910,#1911));
+#1913=FACE_BOUND('',#1912,.T.);
+#1914=ADVANCED_FACE('',(#1913),#1905,.T.);
+#1915=CARTESIAN_POINT('',(-34.999994244,-32.067012223,42.910239647));
+#1916=CARTESIAN_POINT('',(-34.999994244,-32.067012223,42.910239647));
+#1917=CARTESIAN_POINT('',(-34.999988488,-32.067007238,42.910242525));
+#1918=CARTESIAN_POINT('',(-34.999988488,-32.067007238,42.910242525));
+#1919=CARTESIAN_POINT('',(-34.999982732,-32.067002253,42.910245403));
+#1920=CARTESIAN_POINT('',(-34.999982731,-32.067002253,42.910245404));
+#1921=CARTESIAN_POINT('',(-34.999976975,-32.066997268,42.910248281));
+#1922=CARTESIAN_POINT('',(-34.999976975,-32.066997268,42.910248282));
+#1923=CARTESIAN_POINT('',(-34.999971219,-32.066992283,42.91025116));
+#1924=CARTESIAN_POINT('',(-34.999971219,-32.066992283,42.91025116));
+#1925=CARTESIAN_POINT('',(-34.999996163,-32.067003915,42.910244444));
+#1926=CARTESIAN_POINT('',(-34.999996163,-32.067003915,42.910244444));
+#1927=CARTESIAN_POINT('',(-34.999992325,-32.067000591,42.910246363));
+#1928=CARTESIAN_POINT('',(-34.999992325,-32.067000591,42.910246363));
+#1929=CARTESIAN_POINT('',(-34.999988488,-32.066997268,42.910248282));
+#1930=CARTESIAN_POINT('',(-34.999988488,-32.066997268,42.910248282));
+#1931=CARTESIAN_POINT('',(-34.99998465,-32.066993945,42.9102502));
+#1932=CARTESIAN_POINT('',(-34.99998465,-32.066993945,42.9102502));
+#1933=CARTESIAN_POINT('',(-34.999980813,-32.066990621,42.910252119));
+#1934=CARTESIAN_POINT('',(-34.999980813,-32.066990621,42.910252119));
+#1935=CARTESIAN_POINT('',(-34.999998081,-32.066995606,42.910249241));
+#1936=CARTESIAN_POINT('',(-34.999998081,-32.066995606,42.910249241));
+#1937=CARTESIAN_POINT('',(-34.999996163,-32.066993945,42.9102502));
+#1938=CARTESIAN_POINT('',(-34.999996163,-32.066993945,42.9102502));
+#1939=CARTESIAN_POINT('',(-34.999994244,-32.066992283,42.91025116));
+#1940=CARTESIAN_POINT('',(-34.999994244,-32.066992283,42.91025116));
+#1941=CARTESIAN_POINT('',(-34.999992325,-32.066990621,42.910252119));
+#1942=CARTESIAN_POINT('',(-34.999992325,-32.066990621,42.910252119));
+#1943=CARTESIAN_POINT('',(-34.999990406,-32.06698896,42.910253078));
+#1944=CARTESIAN_POINT('',(-34.999990406,-32.06698896,42.910253078));
+#1945=CARTESIAN_POINT('',(-35.052359878,-31.840262378,43.041153732));
+#1946=CARTESIAN_POINT('',(-35.052359878,-31.840262378,43.041153732));
+#1947=CARTESIAN_POINT('',(-35.104719755,-31.885607362,43.014973793));
+#1948=CARTESIAN_POINT('',(-35.104719755,-31.885607362,43.014973793));
+#1949=CARTESIAN_POINT('',(-35.157079633,-31.930952346,42.988793854));
+#1950=CARTESIAN_POINT('',(-35.157079633,-31.930952346,42.988793854));
+#1951=CARTESIAN_POINT('',(-35.20943951,-31.97629733,42.962613915));
+#1952=CARTESIAN_POINT('',(-35.20943951,-31.97629733,42.962613915));
+#1953=CARTESIAN_POINT('',(-35.261799388,-32.021642314,42.936433977));
+#1954=CARTESIAN_POINT('',(-35.261799388,-32.021642314,42.936433977));
+#1955=CARTESIAN_POINT('',(-35.104699154,-31.58759934,43.126921276));
+#1956=CARTESIAN_POINT('',(-35.139631297,-31.621414668,43.11592267));
+#1957=CARTESIAN_POINT('',(-35.174563644,-31.654350079,43.103266863));
+#1958=CARTESIAN_POINT('',(-35.244424387,-31.718431595,43.074739264));
+#1959=CARTESIAN_POINT('',(-35.279353181,-31.749578045,43.058867391));
+#1960=CARTESIAN_POINT('',(-35.349191153,-31.810059503,43.023948405));
+#1961=CARTESIAN_POINT('',(-35.384100707,-31.839394836,43.004901104));
+#1962=CARTESIAN_POINT('',(-35.453860727,-31.896228448,42.963618321));
+#1963=CARTESIAN_POINT('',(-35.488711533,-31.92372702,42.941382552));
+#1964=CARTESIAN_POINT('',(-35.523495769,-31.950287848,42.917522968));
+#1965=CARTESIAN_POINT('',(-35.201447592,-31.068480025,43.19526463));
+#1966=CARTESIAN_POINT('',(-35.273857342,-31.132987254,43.193318826));
+#1967=CARTESIAN_POINT('',(-35.34626626,-31.197065064,43.183089278));
+#1968=CARTESIAN_POINT('',(-35.489077546,-31.322575396,43.146392649));
+#1969=CARTESIAN_POINT('',(-35.559478268,-31.384006463,43.119926033));
+#1970=CARTESIAN_POINT('',(-35.696314751,-31.502510333,43.051507791));
+#1971=CARTESIAN_POINT('',(-35.762748924,-31.559581762,43.009556961));
+#1972=CARTESIAN_POINT('',(-35.889792374,-31.667772486,42.91132622));
+#1973=CARTESIAN_POINT('',(-35.950400159,-31.71889052,42.855047418));
+#1974=CARTESIAN_POINT('',(-36.007237961,-31.766314954,42.792369446));
+#1975=CARTESIAN_POINT('',(-35.245818688,-30.802227998,43.17781355));
+#1976=CARTESIAN_POINT('',(-35.338393614,-30.878381671,43.187294365));
+#1977=CARTESIAN_POINT('',(-35.430966443,-30.955585135,43.183552206));
+#1978=CARTESIAN_POINT('',(-35.612037421,-31.108455583,43.149936067));
+#1979=CARTESIAN_POINT('',(-35.700531345,-31.184118244,43.120063383));
+#1980=CARTESIAN_POINT('',(-35.869491702,-31.330442205,43.035583205));
+#1981=CARTESIAN_POINT('',(-35.949953831,-31.401099778,42.980977862));
+#1982=CARTESIAN_POINT('',(-36.099151591,-31.534250448,42.849459632));
+#1983=CARTESIAN_POINT('',(-36.167882832,-31.596740406,42.772549756));
+#1984=CARTESIAN_POINT('',(-36.22909344,-31.653768912,42.686176174));
+#1985=CARTESIAN_POINT('',(-35.319866737,-30.296470418,43.042296215));
+#1986=CARTESIAN_POINT('',(-35.45530067,-30.376049692,43.074543918));
+#1987=CARTESIAN_POINT('',(-35.590718906,-30.464081583,43.08450251));
+#1988=CARTESIAN_POINT('',(-35.850127219,-30.649476851,43.059105614));
+#1989=CARTESIAN_POINT('',(-35.974087145,-30.746818152,43.023753435));
+#1990=CARTESIAN_POINT('',(-36.200049717,-30.942507479,42.910772149));
+#1991=CARTESIAN_POINT('',(-36.302025846,-31.040832541,42.8331563));
+#1992=CARTESIAN_POINT('',(-36.475281305,-31.230135092,42.64222131));
+#1993=CARTESIAN_POINT('',(-36.546539863,-31.321090555,42.528924321));
+#1994=CARTESIAN_POINT('',(-36.599333685,-31.404521298,42.402562741));
+#1995=CARTESIAN_POINT('',(-35.349514555,-30.057163859,42.92428328));
+#1996=CARTESIAN_POINT('',(-35.5080088,-30.12770136,42.967213485));
+#1997=CARTESIAN_POINT('',(-35.66647325,-30.212702129,42.983925691));
+#1998=CARTESIAN_POINT('',(-35.966481708,-30.402257508,42.963063975));
+#1999=CARTESIAN_POINT('',(-36.107969094,-30.506774352,42.92549368));
+#2000=CARTESIAN_POINT('',(-36.358803868,-30.724003638,42.800076293));
+#2001=CARTESIAN_POINT('',(-36.468103257,-30.836674512,42.7122532));
+#2002=CARTESIAN_POINT('',(-36.642693889,-31.058134002,42.495815372));
+#2003=CARTESIAN_POINT('',(-36.707950611,-31.166881452,42.367242579));
+#2004=CARTESIAN_POINT('',(-36.747572777,-31.267917795,42.22525417));
+#2005=CARTESIAN_POINT('',(-35.389589071,-29.641765021,42.605536541));
+#2006=CARTESIAN_POINT('',(-35.585701782,-29.67888732,42.645216606));
+#2007=CARTESIAN_POINT('',(-35.781749979,-29.743083982,42.656922488));
+#2008=CARTESIAN_POINT('',(-36.146497659,-29.916447339,42.622702478));
+#2009=CARTESIAN_POINT('',(-36.31507697,-30.02555528,42.576787607));
+#2010=CARTESIAN_POINT('',(-36.601198773,-30.27334403,42.433726705));
+#2011=CARTESIAN_POINT('',(-36.718646456,-30.411942732,42.336628079));
+#2012=CARTESIAN_POINT('',(-36.885893533,-30.699300349,42.104850711));
+#2013=CARTESIAN_POINT('',(-36.935636532,-30.847965107,41.970249231));
+#2014=CARTESIAN_POINT('',(-36.947945353,-30.99134115,41.8263584));
+#2015=CARTESIAN_POINT('',(-35.4,-29.465836184,42.404928151));
+#2016=CARTESIAN_POINT('',(-35.60943951,-29.479543968,42.428670729));
+#2017=CARTESIAN_POINT('',(-35.818796615,-29.526585301,42.426861273));
+#2018=CARTESIAN_POINT('',(-36.205790369,-29.680244693,42.372411023));
+#2019=CARTESIAN_POINT('',(-36.383274752,-29.786802293,42.319791654));
+#2020=CARTESIAN_POINT('',(-36.679466948,-30.043312259,42.171695556));
+#2021=CARTESIAN_POINT('',(-36.798058221,-30.193163699,42.076277097));
+#2022=CARTESIAN_POINT('',(-36.958356283,-30.513472922,41.857081439));
+#2023=CARTESIAN_POINT('',(-37.,-30.683804678,41.733390484));
+#2024=CARTESIAN_POINT('',(-37.,-30.85147683,41.604928151));
+#2025=CARTESIAN_POINT('',(-35.4,-29.334936491,42.17820323));
+#2026=CARTESIAN_POINT('',(-35.60943951,-29.334936491,42.17820323));
+#2027=CARTESIAN_POINT('',(-35.818796615,-29.371001008,42.157381372));
+#2028=CARTESIAN_POINT('',(-36.205790369,-29.509823201,42.077232341));
+#2029=CARTESIAN_POINT('',(-36.383274752,-29.612526256,42.017936704));
+#2030=CARTESIAN_POINT('',(-36.679466948,-29.869036222,41.869840606));
+#2031=CARTESIAN_POINT('',(-36.798058221,-30.022742207,41.781098415));
+#2032=CARTESIAN_POINT('',(-36.958356283,-30.357888629,41.587601538));
+#2033=CARTESIAN_POINT('',(-37.,-30.5391972,41.482922985));
+#2034=CARTESIAN_POINT('',(-37.,-30.720577137,41.37820323));
+#2035=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#1915,#1916,#1917,#1918,#1919,#1920,#1921,#1922,#1923,#1924),(#1925,#1926,#1927,#1928,#1929,#1930,#1931,#1932,#1933,#1934),(#1935,#1936,#1937,#1938,#1939,#1940,#1941,#1942,#1943,#1944),(#1945,#1946,#1947,#1948,#1949,#1950,#1951,#1952,#1953,#1954),(#1955,#1956,#1957,#1958,#1959,#1960,#1961,#1962,#1963,#1964),(#1965,#1966,#1967,#1968,#1969,#1970,#1971,#1972,#1973,#1974),(#1975,#1976,#1977,#1978,#1979,#1980,#1981,#1982,#1983,#1984),(#1985,#1986,#1987,#1988,#1989,#1990,#1991,#1992,#1993,#1994),(#1995,#1996,#1997,#1998,#1999,#2000,#2001,#2002,#2003,#2004),(#2005,#2006,#2007,#2008,#2009,#2010,#2011,#2012,#2013,#2014),(#2015,#2016,#2017,#2018,#2019,#2020,#2021,#2022,#2023,#2024),(#2025,#2026,#2027,#2028,#2029,#2030,#2031,#2032,#2033,#2034)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,4),(4,2,2,2,4),(4.71237459,4.71238898,5.105088062,5.497787144,5.890486225,6.283185307),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#2036=ORIENTED_EDGE('',*,*,#1842,.F.);
+#2037=CARTESIAN_POINT('',(-35.,-31.066987298,41.17820323));
+#2038=DIRECTION('',(0.980580676,0.169841555,0.098058068));
+#2039=DIRECTION('',(-0.196116135,0.849207776,0.490290338));
+#2040=AXIS2_PLACEMENT_3D('',#2037,#2038,#2039);
+#2041=ELLIPSE('',#2040,2.039607805,2.);
+#2042=EDGE_CURVE('',#1882,#1274,#2041,.T.);
+#2043=ORIENTED_EDGE('',*,*,#2042,.F.);
+#2044=ORIENTED_EDGE('',*,*,#1896,.F.);
+#2045=CARTESIAN_POINT('',(-35.4,-30.720577137,41.37820323));
+#2046=DIRECTION('',(-0.,0.5,-0.866025404));
+#2047=DIRECTION('',(0.,0.866025404,0.5));
+#2048=AXIS2_PLACEMENT_3D('',#2045,#2046,#2047);
+#2049=CIRCLE('',#2048,1.6);
+#2050=EDGE_CURVE('',#1234,#776,#2049,.T.);
+#2051=ORIENTED_EDGE('',*,*,#2050,.F.);
+#2052=EDGE_LOOP('',(#2036,#2043,#2044,#2051));
+#2053=FACE_BOUND('',#2052,.T.);
+#2054=ADVANCED_FACE('',(#2053),#2035,.T.);
+#2055=CARTESIAN_POINT('',(-35.4,-9.720577137,5.005136271));
+#2056=DIRECTION('',(0.,0.5,-0.866025404));
+#2057=DIRECTION('',(0.,0.866025404,0.5));
+#2058=AXIS2_PLACEMENT_3D('',#2055,#2056,#2057);
+#2059=CYLINDRICAL_SURFACE('',#2058,1.6);
+#2060=ORIENTED_EDGE('',*,*,#2050,.T.);
+#2061=ORIENTED_EDGE('',*,*,#781,.F.);
+#2062=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608));
+#2063=DIRECTION('',(0.,0.5,-0.866025404));
+#2064=DIRECTION('',(0.,0.866025404,0.5));
+#2065=AXIS2_PLACEMENT_3D('',#2062,#2063,#2064);
+#2066=CIRCLE('',#2065,1.6);
+#2067=EDGE_CURVE('',#1242,#768,#2066,.T.);
+#2068=ORIENTED_EDGE('',*,*,#2067,.F.);
+#2069=ORIENTED_EDGE('',*,*,#1247,.F.);
+#2070=EDGE_LOOP('',(#2060,#2061,#2068,#2069));
+#2071=FACE_BOUND('',#2070,.T.);
+#2072=ADVANCED_FACE('',(#2071),#2059,.T.);
+#2073=CARTESIAN_POINT('',(-35.4,-25.465063509,25.475386608));
+#2074=DIRECTION('',(0.,-0.866025404,-0.5));
+#2075=DIRECTION('',(0.,0.5,-0.866025404));
+#2076=AXIS2_PLACEMENT_3D('',#2073,#2074,#2075);
+#2077=CYLINDRICAL_SURFACE('',#2076,1.6);
+#2078=ORIENTED_EDGE('',*,*,#1143,.F.);
+#2079=ORIENTED_EDGE('',*,*,#1253,.F.);
+#2080=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608));
+#2081=DIRECTION('',(-0.,0.866025404,0.5));
+#2082=DIRECTION('',(0.,0.5,-0.866025404));
+#2083=AXIS2_PLACEMENT_3D('',#2080,#2081,#2082);
+#2084=CIRCLE('',#2083,1.6);
+#2085=EDGE_CURVE('',#1203,#1242,#2084,.T.);
+#2086=ORIENTED_EDGE('',*,*,#2085,.F.);
+#2087=ORIENTED_EDGE('',*,*,#1223,.F.);
+#2088=EDGE_LOOP('',(#2078,#2079,#2086,#2087));
+#2089=FACE_BOUND('',#2088,.T.);
+#2090=ADVANCED_FACE('',(#2089),#2077,.T.);
+#2091=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608));
+#2092=DIRECTION('',(0.,0.,1.));
+#2093=DIRECTION('',(1.,0.,-0.));
+#2094=AXIS2_PLACEMENT_3D('',#2091,#2092,#2093);
+#2095=SPHERICAL_SURFACE('',#2094,1.6);
+#2096=ORIENTED_EDGE('',*,*,#2085,.T.);
+#2097=ORIENTED_EDGE('',*,*,#2067,.T.);
+#2098=CARTESIAN_POINT('',(-35.4,-22.520577137,27.175386608));
+#2099=DIRECTION('',(1.,0.,0.));
+#2100=DIRECTION('',(0.,0.,-1.));
+#2101=AXIS2_PLACEMENT_3D('',#2098,#2099,#2100);
+#2102=CIRCLE('',#2101,1.6);
+#2103=EDGE_CURVE('',#1203,#768,#2102,.T.);
+#2104=ORIENTED_EDGE('',*,*,#2103,.F.);
+#2105=EDGE_LOOP('',(#2096,#2097,#2104));
+#2106=FACE_BOUND('',#2105,.T.);
+#2107=ADVANCED_FACE('',(#2106),#2095,.T.);
+#2108=CARTESIAN_POINT('',(0.,-22.520577137,27.175386608));
+#2109=DIRECTION('',(1.,0.,0.));
+#2110=DIRECTION('',(0.,0.,-1.));
+#2111=AXIS2_PLACEMENT_3D('',#2108,#2109,#2110);
+#2112=CYLINDRICAL_SURFACE('',#2111,1.6);
+#2113=ORIENTED_EDGE('',*,*,#2103,.T.);
+#2114=ORIENTED_EDGE('',*,*,#773,.F.);
+#2115=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016));
+#2116=VERTEX_POINT('',#2115);
+#2117=CARTESIAN_POINT('',(-34.786791912,-22.520577137,27.175386608));
+#2118=DIRECTION('',(0.907082288,-0.301150443,0.294126049));
+#2119=DIRECTION('',(0.420953349,0.648927568,-0.633791203));
+#2120=AXIS2_PLACEMENT_3D('',#2117,#2118,#2119);
+#2121=ELLIPSE('',#2120,1.763897301,1.6);
+#2122=EDGE_CURVE('',#2116,#759,#2121,.T.);
+#2123=ORIENTED_EDGE('',*,*,#2122,.F.);
+#2124=CARTESIAN_POINT('',(-34.786791912,-22.520577137,27.175386608));
+#2125=DIRECTION('',(0.907082288,-0.301150443,0.294126049));
+#2126=DIRECTION('',(0.420953349,0.648927568,-0.633791203));
+#2127=AXIS2_PLACEMENT_3D('',#2124,#2125,#2126);
+#2128=ELLIPSE('',#2127,1.763897301,1.6);
+#2129=EDGE_CURVE('',#1205,#2116,#2128,.T.);
+#2130=ORIENTED_EDGE('',*,*,#2129,.F.);
+#2131=ORIENTED_EDGE('',*,*,#1210,.F.);
+#2132=EDGE_LOOP('',(#2113,#2114,#2123,#2130,#2131));
+#2133=FACE_BOUND('',#2132,.T.);
+#2134=ADVANCED_FACE('',(#2133),#2112,.T.);
+#2135=CARTESIAN_POINT('',(-34.150818388,-22.010798673,23.774665619));
+#2136=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019));
+#2137=DIRECTION('',(0.,0.5,-0.866025404));
+#2138=AXIS2_PLACEMENT_3D('',#2135,#2136,#2137);
+#2139=CYLINDRICAL_SURFACE('',#2138,1.6);
+#2140=ORIENTED_EDGE('',*,*,#1396,.F.);
+#2141=ORIENTED_EDGE('',*,*,#1216,.F.);
+#2142=CARTESIAN_POINT('',(-34.071891653,-20.920577137,24.404105316));
+#2143=DIRECTION('',(-0.062573166,-0.864328323,-0.49902019));
+#2144=DIRECTION('',(0.,0.5,-0.866025404));
+#2145=AXIS2_PLACEMENT_3D('',#2142,#2143,#2144);
+#2146=CIRCLE('',#2145,1.6);
+#2147=EDGE_CURVE('',#1331,#1205,#2146,.T.);
+#2148=ORIENTED_EDGE('',*,*,#2147,.F.);
+#2149=ORIENTED_EDGE('',*,*,#1336,.F.);
+#2150=EDGE_LOOP('',(#2140,#2141,#2148,#2149));
+#2151=FACE_BOUND('',#2150,.T.);
+#2152=ADVANCED_FACE('',(#2151),#2139,.F.);
+#2153=CARTESIAN_POINT('',(-34.044242335,-21.37593555,26.057444016));
+#2154=CARTESIAN_POINT('',(-33.86521349,-21.375933037,26.057441562));
+#2155=CARTESIAN_POINT('',(-33.686222908,-21.35423453,26.036249177));
+#2156=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306));
+#2157=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854));
+#2158=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778));
+#2159=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924));
+#2160=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669));
+#2161=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794));
+#2162=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094));
+#2163=CARTESIAN_POINT('',(-34.044242335,-21.477890788,25.953053857));
+#2164=CARTESIAN_POINT('',(-33.86521349,-21.480535584,25.95034087));
+#2165=CARTESIAN_POINT('',(-33.686222908,-21.463416312,25.924459888));
+#2166=CARTESIAN_POINT('',(-33.34814205,-21.391544373,25.829226843));
+#2167=CARTESIAN_POINT('',(-33.189124105,-21.336804659,25.759892314));
+#2168=CARTESIAN_POINT('',(-32.908765398,-21.195786097,25.585473675));
+#2169=CARTESIAN_POINT('',(-32.78748366,-21.109536938,25.480426287));
+#2170=CARTESIAN_POINT('',(-32.596155901,-20.915117027,25.24629676));
+#2171=CARTESIAN_POINT('',(-32.52615016,-20.806987206,25.117263914));
+#2172=CARTESIAN_POINT('',(-32.485681589,-20.693929013,24.983412718));
+#2173=CARTESIAN_POINT('',(-34.053622998,-21.594279197,25.862816127));
+#2174=CARTESIAN_POINT('',(-33.874327949,-21.600334865,25.858154442));
+#2175=CARTESIAN_POINT('',(-33.695071543,-21.588732199,25.82851274));
+#2176=CARTESIAN_POINT('',(-33.356573322,-21.531505648,25.722564093));
+#2177=CARTESIAN_POINT('',(-33.197404537,-21.485892009,25.646276929));
+#2178=CARTESIAN_POINT('',(-32.916951512,-21.365752303,25.455567475));
+#2179=CARTESIAN_POINT('',(-32.795726821,-21.29125184,25.341185649));
+#2180=CARTESIAN_POINT('',(-32.604772893,-21.121694179,25.0870932));
+#2181=CARTESIAN_POINT('',(-32.535084208,-21.026673096,24.947436487));
+#2182=CARTESIAN_POINT('',(-32.495062298,-20.926704646,24.802937935));
+#2183=CARTESIAN_POINT('',(-34.07189178,-21.720613244,25.789806487));
+#2184=CARTESIAN_POINT('',(-33.892066329,-21.730380291,25.784177208));
+#2185=CARTESIAN_POINT('',(-33.712280296,-21.724784039,25.751941994));
+#2186=CARTESIAN_POINT('',(-33.372951287,-21.683491836,25.637874422));
+#2187=CARTESIAN_POINT('',(-33.213482771,-21.647803064,25.556063836));
+#2188=CARTESIAN_POINT('',(-32.932843808,-21.550346997,25.352074817));
+#2189=CARTESIAN_POINT('',(-32.811733971,-21.488600756,25.22994045));
+#2190=CARTESIAN_POINT('',(-32.621525203,-21.346001932,24.959099936));
+#2191=CARTESIAN_POINT('',(-32.552467353,-21.265180153,24.810452295));
+#2192=CARTESIAN_POINT('',(-32.513331173,-21.179371452,24.656918992));
+#2193=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2153,#2154,#2155,#2156,#2157,#2158,#2159,#2160,#2161,#2162),(#2163,#2164,#2165,#2166,#2167,#2168,#2169,#2170,#2171,#2172),(#2173,#2174,#2175,#2176,#2177,#2178,#2179,#2180,#2181,#2182),(#2183,#2184,#2185,#2186,#2187,#2188,#2189,#2190,#2191,#2192)),.UNSPECIFIED.,.F.,.F.,.U.,(4,4),(4,2,2,2,4),(0.,0.273595742),(0.000014476,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#2194=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094));
+#2195=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794));
+#2196=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669));
+#2197=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924));
+#2198=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778));
+#2199=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854));
+#2200=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306));
+#2201=CARTESIAN_POINT('',(-33.686232696,-21.354236974,26.036251563));
+#2202=CARTESIAN_POINT('',(-33.865234219,-21.37593555,26.057444016));
+#2203=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016));
+#2204=B_SPLINE_CURVE_WITH_KNOTS('',3,(#2194,#2195,#2196,#2197,#2198,#2199,#2200,#2201,#2202,#2203),.UNSPECIFIED.,.F.,.F.,(4,2,2,2,4),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#2205=EDGE_CURVE('',#1339,#2116,#2204,.T.);
+#2206=ORIENTED_EDGE('',*,*,#2205,.F.);
+#2207=ORIENTED_EDGE('',*,*,#1345,.F.);
+#2208=ORIENTED_EDGE('',*,*,#2147,.T.);
+#2209=ORIENTED_EDGE('',*,*,#2129,.T.);
+#2210=EDGE_LOOP('',(#2206,#2207,#2208,#2209));
+#2211=FACE_BOUND('',#2210,.T.);
+#2212=ADVANCED_FACE('',(#2211),#2193,.F.);
+#2213=CARTESIAN_POINT('',(23.5,-19.224694785,30.666750919));
+#2214=DIRECTION('',(1.,0.,0.));
+#2215=DIRECTION('',(0.,0.,-1.));
+#2216=AXIS2_PLACEMENT_3D('',#2213,#2214,#2215);
+#2217=TOROIDAL_SURFACE('',#2216,4.5,1.5);
+#2218=ORIENTED_EDGE('',*,*,#603,.F.);
+#2219=ORIENTED_EDGE('',*,*,#277,.F.);
+#2220=CARTESIAN_POINT('',(23.5,-19.224694785,26.166750919));
+#2221=DIRECTION('',(0.,1.,0.));
+#2222=DIRECTION('',(0.,-0.,1.));
+#2223=AXIS2_PLACEMENT_3D('',#2220,#2221,#2222);
+#2224=CIRCLE('',#2223,1.5);
+#2225=EDGE_CURVE('',#687,#263,#2224,.T.);
+#2226=ORIENTED_EDGE('',*,*,#2225,.F.);
+#2227=ORIENTED_EDGE('',*,*,#1784,.F.);
+#2228=ORIENTED_EDGE('',*,*,#824,.F.);
+#2229=EDGE_LOOP('',(#2218,#2219,#2226,#2227,#2228));
+#2230=FACE_BOUND('',#2229,.T.);
+#2231=ADVANCED_FACE('',(#2230),#2217,.T.);
+#2232=CARTESIAN_POINT('',(23.5,-5.67149291,26.166750919));
+#2233=DIRECTION('',(0.,-1.,0.));
+#2234=DIRECTION('',(0.,0.,-1.));
+#2235=AXIS2_PLACEMENT_3D('',#2232,#2233,#2234);
+#2236=CYLINDRICAL_SURFACE('',#2235,1.5);
+#2237=ORIENTED_EDGE('',*,*,#2225,.T.);
+#2238=ORIENTED_EDGE('',*,*,#268,.F.);
+#2239=CARTESIAN_POINT('',(23.5,5.485205765,26.166750919));
+#2240=DIRECTION('',(0.,1.,0.));
+#2241=DIRECTION('',(0.,-0.,1.));
+#2242=AXIS2_PLACEMENT_3D('',#2239,#2240,#2241);
+#2243=CIRCLE('',#2242,1.5);
+#2244=EDGE_CURVE('',#660,#261,#2243,.T.);
+#2245=ORIENTED_EDGE('',*,*,#2244,.F.);
+#2246=ORIENTED_EDGE('',*,*,#698,.F.);
+#2247=EDGE_LOOP('',(#2237,#2238,#2245,#2246));
+#2248=FACE_BOUND('',#2247,.T.);
+#2249=ADVANCED_FACE('',(#2248),#2236,.T.);
+#2250=CARTESIAN_POINT('',(23.5,5.485205765,17.666750919));
+#2251=DIRECTION('',(1.,0.,0.));
+#2252=DIRECTION('',(0.,0.,-1.));
+#2253=AXIS2_PLACEMENT_3D('',#2250,#2251,#2252);
+#2254=TOROIDAL_SURFACE('',#2253,8.5,1.5);
+#2255=ORIENTED_EDGE('',*,*,#2244,.T.);
+#2256=ORIENTED_EDGE('',*,*,#350,.F.);
+#2257=CARTESIAN_POINT('',(23.5,11.69700724,23.468778362));
+#2258=DIRECTION('',(0.,0.682591464,-0.730800173));
+#2259=DIRECTION('',(0.,0.730800173,0.682591464));
+#2260=AXIS2_PLACEMENT_3D('',#2257,#2258,#2259);
+#2261=CIRCLE('',#2260,1.5);
+#2262=EDGE_CURVE('',#727,#338,#2261,.T.);
+#2263=ORIENTED_EDGE('',*,*,#2262,.F.);
+#2264=ORIENTED_EDGE('',*,*,#1452,.F.);
+#2265=EDGE_LOOP('',(#2255,#2256,#2263,#2264));
+#2266=FACE_BOUND('',#2265,.T.);
+#2267=ADVANCED_FACE('',(#2266),#2254,.T.);
+#2268=CARTESIAN_POINT('',(23.5,19.318053285,15.309488264));
+#2269=DIRECTION('',(0.,-0.682591464,0.730800173));
+#2270=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#2271=AXIS2_PLACEMENT_3D('',#2268,#2269,#2270);
+#2272=CYLINDRICAL_SURFACE('',#2271,1.5);
+#2273=ORIENTED_EDGE('',*,*,#2262,.T.);
+#2274=ORIENTED_EDGE('',*,*,#343,.F.);
+#2275=CARTESIAN_POINT('',(23.5,22.492048716,11.911326208));
+#2276=DIRECTION('',(0.,0.682591464,-0.730800173));
+#2277=DIRECTION('',(0.,0.730800173,0.682591464));
+#2278=AXIS2_PLACEMENT_3D('',#2275,#2276,#2277);
+#2279=CIRCLE('',#2278,1.5);
+#2280=EDGE_CURVE('',#709,#329,#2279,.T.);
+#2281=ORIENTED_EDGE('',*,*,#2280,.F.);
+#2282=ORIENTED_EDGE('',*,*,#738,.F.);
+#2283=EDGE_LOOP('',(#2273,#2274,#2281,#2282));
+#2284=FACE_BOUND('',#2283,.T.);
+#2285=ADVANCED_FACE('',(#2284),#2272,.T.);
+#2286=CARTESIAN_POINT('',(23.5,41.858253313,30.));
+#2287=DIRECTION('',(1.,0.,0.));
+#2288=DIRECTION('',(0.,0.,-1.));
+#2289=AXIS2_PLACEMENT_3D('',#2286,#2287,#2288);
+#2290=TOROIDAL_SURFACE('',#2289,26.5,1.5);
+#2291=ORIENTED_EDGE('',*,*,#2280,.T.);
+#2292=ORIENTED_EDGE('',*,*,#335,.F.);
+#2293=CARTESIAN_POINT('',(23.5,41.858253313,3.5));
+#2294=DIRECTION('',(0.,1.,0.));
+#2295=DIRECTION('',(0.,-0.,1.));
+#2296=AXIS2_PLACEMENT_3D('',#2293,#2294,#2295);
+#2297=CIRCLE('',#2296,1.5);
+#2298=EDGE_CURVE('',#215,#321,#2297,.T.);
+#2299=ORIENTED_EDGE('',*,*,#2298,.F.);
+#2300=ORIENTED_EDGE('',*,*,#1559,.F.);
+#2301=EDGE_LOOP('',(#2291,#2292,#2299,#2300));
+#2302=FACE_BOUND('',#2301,.T.);
+#2303=ADVANCED_FACE('',(#2302),#2290,.T.);
+#2304=CARTESIAN_POINT('',(23.5,60.5,2.5));
+#2305=DIRECTION('',(0.,0.,-1.));
+#2306=DIRECTION('',(-1.,0.,0.));
+#2307=AXIS2_PLACEMENT_3D('',#2304,#2305,#2306);
+#2308=CYLINDRICAL_SURFACE('',#2307,1.5);
+#2309=ORIENTED_EDGE('',*,*,#505,.F.);
+#2310=ORIENTED_EDGE('',*,*,#543,.F.);
+#2311=CARTESIAN_POINT('',(23.5,60.5,3.5));
+#2312=DIRECTION('',(0.,0.,1.));
+#2313=DIRECTION('',(1.,0.,-0.));
+#2314=AXIS2_PLACEMENT_3D('',#2311,#2312,#2313);
+#2315=CIRCLE('',#2314,1.5);
+#2316=EDGE_CURVE('',#313,#532,#2315,.T.);
+#2317=ORIENTED_EDGE('',*,*,#2316,.F.);
+#2318=ORIENTED_EDGE('',*,*,#318,.F.);
+#2319=EDGE_LOOP('',(#2309,#2310,#2317,#2318));
+#2320=FACE_BOUND('',#2319,.T.);
+#2321=ADVANCED_FACE('',(#2320),#2308,.T.);
+#2322=CARTESIAN_POINT('',(23.5,62.,3.5));
+#2323=DIRECTION('',(0.,-1.,0.));
+#2324=DIRECTION('',(0.,0.,-1.));
+#2325=AXIS2_PLACEMENT_3D('',#2322,#2323,#2324);
+#2326=CYLINDRICAL_SURFACE('',#2325,1.5);
+#2327=ORIENTED_EDGE('',*,*,#2298,.T.);
+#2328=ORIENTED_EDGE('',*,*,#326,.F.);
+#2329=CARTESIAN_POINT('',(23.5,60.5,3.5));
+#2330=DIRECTION('',(0.,1.,0.));
+#2331=DIRECTION('',(0.,-0.,1.));
+#2332=AXIS2_PLACEMENT_3D('',#2329,#2330,#2331);
+#2333=CIRCLE('',#2332,1.5);
+#2334=EDGE_CURVE('',#223,#313,#2333,.T.);
+#2335=ORIENTED_EDGE('',*,*,#2334,.F.);
+#2336=ORIENTED_EDGE('',*,*,#228,.F.);
+#2337=EDGE_LOOP('',(#2327,#2328,#2335,#2336));
+#2338=FACE_BOUND('',#2337,.T.);
+#2339=ADVANCED_FACE('',(#2338),#2326,.T.);
+#2340=CARTESIAN_POINT('',(23.5,60.5,3.5));
+#2341=DIRECTION('',(1.,0.,0.));
+#2342=DIRECTION('',(0.,0.,-1.));
+#2343=AXIS2_PLACEMENT_3D('',#2340,#2341,#2342);
+#2344=SPHERICAL_SURFACE('',#2343,1.5);
+#2345=ORIENTED_EDGE('',*,*,#2334,.T.);
+#2346=ORIENTED_EDGE('',*,*,#2316,.T.);
+#2347=CARTESIAN_POINT('',(23.5,60.5,3.5));
+#2348=DIRECTION('',(-1.,-0.,-0.));
+#2349=DIRECTION('',(0.,0.,-1.));
+#2350=AXIS2_PLACEMENT_3D('',#2347,#2348,#2349);
+#2351=CIRCLE('',#2350,1.5);
+#2352=EDGE_CURVE('',#223,#532,#2351,.T.);
+#2353=ORIENTED_EDGE('',*,*,#2352,.F.);
+#2354=EDGE_LOOP('',(#2345,#2346,#2353));
+#2355=FACE_BOUND('',#2354,.T.);
+#2356=ADVANCED_FACE('',(#2355),#2344,.T.);
+#2357=CARTESIAN_POINT('',(-23.5,60.5,2.5));
+#2358=DIRECTION('',(0.,0.,1.));
+#2359=DIRECTION('',(1.,0.,-0.));
+#2360=AXIS2_PLACEMENT_3D('',#2357,#2358,#2359);
+#2361=CYLINDRICAL_SURFACE('',#2360,1.5);
+#2362=ORIENTED_EDGE('',*,*,#490,.F.);
+#2363=ORIENTED_EDGE('',*,*,#427,.F.);
+#2364=CARTESIAN_POINT('',(-23.5,60.5,3.5));
+#2365=DIRECTION('',(0.,0.,1.));
+#2366=DIRECTION('',(1.,0.,-0.));
+#2367=AXIS2_PLACEMENT_3D('',#2364,#2365,#2366);
+#2368=CIRCLE('',#2367,1.5);
+#2369=EDGE_CURVE('',#524,#414,#2368,.T.);
+#2370=ORIENTED_EDGE('',*,*,#2369,.F.);
+#2371=ORIENTED_EDGE('',*,*,#529,.F.);
+#2372=EDGE_LOOP('',(#2362,#2363,#2370,#2371));
+#2373=FACE_BOUND('',#2372,.T.);
+#2374=ADVANCED_FACE('',(#2373),#2361,.T.);
+#2375=CARTESIAN_POINT('',(0.,60.5,3.5));
+#2376=DIRECTION('',(1.,0.,0.));
+#2377=DIRECTION('',(0.,0.,-1.));
+#2378=AXIS2_PLACEMENT_3D('',#2375,#2376,#2377);
+#2379=CYLINDRICAL_SURFACE('',#2378,1.5);
+#2380=ORIENTED_EDGE('',*,*,#2352,.T.);
+#2381=ORIENTED_EDGE('',*,*,#537,.F.);
+#2382=CARTESIAN_POINT('',(-23.5,60.5,3.5));
+#2383=DIRECTION('',(-1.,0.,0.));
+#2384=DIRECTION('',(0.,0.,1.));
+#2385=AXIS2_PLACEMENT_3D('',#2382,#2383,#2384);
+#2386=CIRCLE('',#2385,1.5);
+#2387=EDGE_CURVE('',#231,#524,#2386,.T.);
+#2388=ORIENTED_EDGE('',*,*,#2387,.F.);
+#2389=ORIENTED_EDGE('',*,*,#236,.F.);
+#2390=EDGE_LOOP('',(#2380,#2381,#2388,#2389));
+#2391=FACE_BOUND('',#2390,.T.);
+#2392=ADVANCED_FACE('',(#2391),#2379,.T.);
+#2393=CARTESIAN_POINT('',(-23.5,60.5,3.5));
+#2394=DIRECTION('',(0.,1.,0.));
+#2395=DIRECTION('',(0.,-0.,1.));
+#2396=AXIS2_PLACEMENT_3D('',#2393,#2394,#2395);
+#2397=SPHERICAL_SURFACE('',#2396,1.5);
+#2398=ORIENTED_EDGE('',*,*,#2387,.T.);
+#2399=ORIENTED_EDGE('',*,*,#2369,.T.);
+#2400=CARTESIAN_POINT('',(-23.5,60.5,3.5));
+#2401=DIRECTION('',(-0.,-1.,-0.));
+#2402=DIRECTION('',(0.,-0.,1.));
+#2403=AXIS2_PLACEMENT_3D('',#2400,#2401,#2402);
+#2404=CIRCLE('',#2403,1.5);
+#2405=EDGE_CURVE('',#231,#414,#2404,.T.);
+#2406=ORIENTED_EDGE('',*,*,#2405,.F.);
+#2407=EDGE_LOOP('',(#2398,#2399,#2406));
+#2408=FACE_BOUND('',#2407,.T.);
+#2409=ADVANCED_FACE('',(#2408),#2397,.T.);
+#2410=CARTESIAN_POINT('',(-23.5,62.,3.5));
+#2411=DIRECTION('',(0.,-1.,0.));
+#2412=DIRECTION('',(0.,0.,-1.));
+#2413=AXIS2_PLACEMENT_3D('',#2410,#2411,#2412);
+#2414=CYLINDRICAL_SURFACE('',#2413,1.5);
+#2415=ORIENTED_EDGE('',*,*,#2405,.T.);
+#2416=ORIENTED_EDGE('',*,*,#419,.F.);
+#2417=CARTESIAN_POINT('',(-23.5,41.858253313,3.5));
+#2418=DIRECTION('',(0.,-1.,0.));
+#2419=DIRECTION('',(0.,0.,-1.));
+#2420=AXIS2_PLACEMENT_3D('',#2417,#2418,#2419);
+#2421=CIRCLE('',#2420,1.5);
+#2422=EDGE_CURVE('',#239,#405,#2421,.T.);
+#2423=ORIENTED_EDGE('',*,*,#2422,.F.);
+#2424=ORIENTED_EDGE('',*,*,#244,.F.);
+#2425=EDGE_LOOP('',(#2415,#2416,#2423,#2424));
+#2426=FACE_BOUND('',#2425,.T.);
+#2427=ADVANCED_FACE('',(#2426),#2414,.T.);
+#2428=CARTESIAN_POINT('',(-23.5,41.858253313,30.));
+#2429=DIRECTION('',(-1.,0.,0.));
+#2430=DIRECTION('',(0.,0.,1.));
+#2431=AXIS2_PLACEMENT_3D('',#2428,#2429,#2430);
+#2432=TOROIDAL_SURFACE('',#2431,26.5,1.5);
+#2433=ORIENTED_EDGE('',*,*,#2422,.T.);
+#2434=ORIENTED_EDGE('',*,*,#411,.F.);
+#2435=CARTESIAN_POINT('',(-23.5,22.492048716,11.911326208));
+#2436=DIRECTION('',(-0.,-0.682591464,0.730800173));
+#2437=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#2438=AXIS2_PLACEMENT_3D('',#2435,#2436,#2437);
+#2439=CIRCLE('',#2438,1.5);
+#2440=EDGE_CURVE('',#1029,#397,#2439,.T.);
+#2441=ORIENTED_EDGE('',*,*,#2440,.F.);
+#2442=ORIENTED_EDGE('',*,*,#1506,.F.);
+#2443=EDGE_LOOP('',(#2433,#2434,#2441,#2442));
+#2444=FACE_BOUND('',#2443,.T.);
+#2445=ADVANCED_FACE('',(#2444),#2432,.T.);
+#2446=CARTESIAN_POINT('',(-23.5,45.594758942,-12.823036194));
+#2447=DIRECTION('',(0.,-0.682591464,0.730800173));
+#2448=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#2449=AXIS2_PLACEMENT_3D('',#2446,#2447,#2448);
+#2450=CYLINDRICAL_SURFACE('',#2449,1.5);
+#2451=ORIENTED_EDGE('',*,*,#2440,.T.);
+#2452=ORIENTED_EDGE('',*,*,#402,.F.);
+#2453=CARTESIAN_POINT('',(-23.5,11.69700724,23.468778362));
+#2454=DIRECTION('',(0.,-0.682591464,0.730800173));
+#2455=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#2456=AXIS2_PLACEMENT_3D('',#2453,#2454,#2455);
+#2457=CIRCLE('',#2456,1.5);
+#2458=EDGE_CURVE('',#1011,#388,#2457,.T.);
+#2459=ORIENTED_EDGE('',*,*,#2458,.F.);
+#2460=ORIENTED_EDGE('',*,*,#1040,.F.);
+#2461=EDGE_LOOP('',(#2451,#2452,#2459,#2460));
+#2462=FACE_BOUND('',#2461,.T.);
+#2463=ADVANCED_FACE('',(#2462),#2450,.T.);
+#2464=CARTESIAN_POINT('',(-23.5,5.485205765,17.666750919));
+#2465=DIRECTION('',(-1.,0.,0.));
+#2466=DIRECTION('',(0.,0.,1.));
+#2467=AXIS2_PLACEMENT_3D('',#2464,#2465,#2466);
+#2468=TOROIDAL_SURFACE('',#2467,8.5,1.5);
+#2469=ORIENTED_EDGE('',*,*,#2458,.T.);
+#2470=ORIENTED_EDGE('',*,*,#394,.F.);
+#2471=CARTESIAN_POINT('',(-23.5,5.485205765,26.166750919));
+#2472=DIRECTION('',(0.,-1.,0.));
+#2473=DIRECTION('',(0.,0.,-1.));
+#2474=AXIS2_PLACEMENT_3D('',#2471,#2472,#2473);
+#2475=CIRCLE('',#2474,1.5);
+#2476=EDGE_CURVE('',#981,#380,#2475,.T.);
+#2477=ORIENTED_EDGE('',*,*,#2476,.F.);
+#2478=ORIENTED_EDGE('',*,*,#1428,.F.);
+#2479=EDGE_LOOP('',(#2469,#2470,#2477,#2478));
+#2480=FACE_BOUND('',#2479,.T.);
+#2481=ADVANCED_FACE('',(#2480),#2468,.T.);
+#2482=CARTESIAN_POINT('',(-23.5,62.,26.166750919));
+#2483=DIRECTION('',(0.,-1.,0.));
+#2484=DIRECTION('',(0.,0.,-1.));
+#2485=AXIS2_PLACEMENT_3D('',#2482,#2483,#2484);
+#2486=CYLINDRICAL_SURFACE('',#2485,1.5);
+#2487=ORIENTED_EDGE('',*,*,#2476,.T.);
+#2488=ORIENTED_EDGE('',*,*,#385,.F.);
+#2489=CARTESIAN_POINT('',(-23.5,-19.224694785,26.166750919));
+#2490=DIRECTION('',(0.,-1.,0.));
+#2491=DIRECTION('',(0.,0.,-1.));
+#2492=AXIS2_PLACEMENT_3D('',#2489,#2490,#2491);
+#2493=CIRCLE('',#2492,1.5);
+#2494=EDGE_CURVE('',#989,#371,#2493,.T.);
+#2495=ORIENTED_EDGE('',*,*,#2494,.F.);
+#2496=ORIENTED_EDGE('',*,*,#994,.F.);
+#2497=EDGE_LOOP('',(#2487,#2488,#2495,#2496));
+#2498=FACE_BOUND('',#2497,.T.);
+#2499=ADVANCED_FACE('',(#2498),#2486,.T.);
+#2500=CARTESIAN_POINT('',(-23.5,-19.224694785,30.666750919));
+#2501=DIRECTION('',(-1.,0.,0.));
+#2502=DIRECTION('',(0.,0.,1.));
+#2503=AXIS2_PLACEMENT_3D('',#2500,#2501,#2502);
+#2504=TOROIDAL_SURFACE('',#2503,4.5,1.5);
+#2505=ORIENTED_EDGE('',*,*,#891,.F.);
+#2506=ORIENTED_EDGE('',*,*,#1826,.F.);
+#2507=ORIENTED_EDGE('',*,*,#2494,.T.);
+#2508=ORIENTED_EDGE('',*,*,#377,.F.);
+#2509=ORIENTED_EDGE('',*,*,#929,.F.);
+#2510=EDGE_LOOP('',(#2505,#2506,#2507,#2508,#2509));
+#2511=FACE_BOUND('',#2510,.T.);
+#2512=ADVANCED_FACE('',(#2511),#2504,.T.);
+#2513=CARTESIAN_POINT('',(17.,4.480500687,11.));
+#2514=DIRECTION('',(1.,0.,0.));
+#2515=DIRECTION('',(0.,0.,-1.));
+#2516=AXIS2_PLACEMENT_3D('',#2513,#2514,#2515);
+#2517=DEGENERATE_TOROIDAL_SURFACE('',#2516,3.,3.,.T.);
+#2518=ORIENTED_EDGE('',*,*,#89,.T.);
+#2519=ORIENTED_EDGE('',*,*,#1605,.F.);
+#2520=CARTESIAN_POINT('',(17.,4.480500687,11.));
+#2521=DIRECTION('',(1.,0.,0.));
+#2522=DIRECTION('',(0.,0.,-1.));
+#2523=AXIS2_PLACEMENT_3D('',#2520,#2521,#2522);
+#2524=CIRCLE('',#2523,6.);
+#2525=EDGE_CURVE('',#622,#199,#2524,.T.);
+#2526=ORIENTED_EDGE('',*,*,#2525,.F.);
+#2527=ORIENTED_EDGE('',*,*,#1650,.F.);
+#2528=EDGE_LOOP('',(#2518,#2519,#2526,#2527));
+#2529=FACE_BOUND('',#2528,.T.);
+#2530=ADVANCED_FACE('',(#2529),#2517,.F.);
+#2531=CARTESIAN_POINT('',(-0.,4.480500687,11.));
+#2532=DIRECTION('',(1.,-0.,0.));
+#2533=DIRECTION('',(0.,1.,0.));
+#2534=AXIS2_PLACEMENT_3D('',#2531,#2532,#2533);
+#2535=CYLINDRICAL_SURFACE('',#2534,6.);
+#2536=ORIENTED_EDGE('',*,*,#2525,.T.);
+#2537=ORIENTED_EDGE('',*,*,#204,.F.);
+#2538=CARTESIAN_POINT('',(-17.,4.480500687,11.));
+#2539=DIRECTION('',(1.,-0.,-0.));
+#2540=DIRECTION('',(0.,0.,1.));
+#2541=AXIS2_PLACEMENT_3D('',#2538,#2539,#2540);
+#2542=CIRCLE('',#2541,6.);
+#2543=EDGE_CURVE('',#630,#191,#2542,.T.);
+#2544=ORIENTED_EDGE('',*,*,#2543,.F.);
+#2545=ORIENTED_EDGE('',*,*,#635,.F.);
+#2546=EDGE_LOOP('',(#2536,#2537,#2544,#2545));
+#2547=FACE_BOUND('',#2546,.T.);
+#2548=ADVANCED_FACE('',(#2547),#2535,.F.);
+#2549=CARTESIAN_POINT('',(-17.,4.480500687,11.));
+#2550=DIRECTION('',(-1.,0.,0.));
+#2551=DIRECTION('',(0.,0.,1.));
+#2552=AXIS2_PLACEMENT_3D('',#2549,#2550,#2551);
+#2553=DEGENERATE_TOROIDAL_SURFACE('',#2552,3.,3.,.T.);
+#2554=ORIENTED_EDGE('',*,*,#1696,.F.);
+#2555=ORIENTED_EDGE('',*,*,#156,.T.);
+#2556=ORIENTED_EDGE('',*,*,#1741,.F.);
+#2557=ORIENTED_EDGE('',*,*,#2543,.T.);
+#2558=EDGE_LOOP('',(#2554,#2555,#2556,#2557));
+#2559=FACE_BOUND('',#2558,.T.);
+#2560=ADVANCED_FACE('',(#2559),#2553,.F.);
+#2561=CARTESIAN_POINT('',(-20.233154644,-19.224694785,27.666750919));
+#2562=CARTESIAN_POINT('',(-20.148786426,-19.181754028,27.666750919));
+#2563=CARTESIAN_POINT('',(-20.06442732,-19.13881791,27.653218434));
+#2564=CARTESIAN_POINT('',(-19.902450167,-19.056376659,27.600166937));
+#2565=CARTESIAN_POINT('',(-19.824849615,-19.01688043,27.560653656));
+#2566=CARTESIAN_POINT('',(-19.682608783,-18.944484343,27.45880096));
+#2567=CARTESIAN_POINT('',(-19.617983866,-18.911592303,27.396472548));
+#2568=CARTESIAN_POINT('',(-19.506875188,-18.855041498,27.253978732));
+#2569=CARTESIAN_POINT('',(-19.460403428,-18.83138884,27.17382872));
+#2570=CARTESIAN_POINT('',(-19.424865983,-18.813301404,27.087969303));
+#2571=CARTESIAN_POINT('',(-20.136066749,-19.367760489,27.666750919));
+#2572=CARTESIAN_POINT('',(-20.055913049,-19.325341908,27.664703136));
+#2573=CARTESIAN_POINT('',(-19.975766472,-19.283572473,27.650272131));
+#2574=CARTESIAN_POINT('',(-19.821314357,-19.204375435,27.597703841));
+#2575=CARTESIAN_POINT('',(-19.747022556,-19.166954887,27.55957127));
+#2576=CARTESIAN_POINT('',(-19.609712563,-19.09918955,27.462385719));
+#2577=CARTESIAN_POINT('',(-19.546706617,-19.068850762,27.403341384));
+#2578=CARTESIAN_POINT('',(-19.436584705,-19.017460263,27.268641018));
+#2579=CARTESIAN_POINT('',(-19.389478613,-18.996413074,27.192996945));
+#2580=CARTESIAN_POINT('',(-19.352050062,-18.98077405,27.111806948));
+#2581=CARTESIAN_POINT('',(-20.035680002,-19.507579233,27.676886562));
+#2582=CARTESIAN_POINT('',(-19.959518462,-19.466452863,27.672921518));
+#2583=CARTESIAN_POINT('',(-19.883362577,-19.426441036,27.657707868));
+#2584=CARTESIAN_POINT('',(-19.736121022,-19.351303274,27.605801519));
+#2585=CARTESIAN_POINT('',(-19.665046288,-19.316182906,27.569112694));
+#2586=CARTESIAN_POINT('',(-19.532712716,-19.253167859,27.47670241));
+#2587=CARTESIAN_POINT('',(-19.471463721,-19.225277838,27.420987808));
+#2588=CARTESIAN_POINT('',(-19.36287698,-19.178579319,27.294237237));
+#2589=CARTESIAN_POINT('',(-19.315547337,-19.159774261,27.223210658));
+#2590=CARTESIAN_POINT('',(-19.276760001,-19.146134608,27.146888636));
+#2591=CARTESIAN_POINT('',(-19.832562253,-19.782774395,27.715842646));
+#2592=CARTESIAN_POINT('',(-19.763909549,-19.745311545,27.708682754));
+#2593=CARTESIAN_POINT('',(-19.695260252,-19.709620398,27.692417751));
+#2594=CARTESIAN_POINT('',(-19.561713806,-19.643727496,27.642573276));
+#2595=CARTESIAN_POINT('',(-19.49682329,-19.613528998,27.608996297));
+#2596=CARTESIAN_POINT('',(-19.374350632,-19.560270669,27.526366394));
+#2597=CARTESIAN_POINT('',(-19.31677459,-19.537213456,27.477317563));
+#2598=CARTESIAN_POINT('',(-19.212092048,-19.499494037,27.366424274));
+#2599=CARTESIAN_POINT('',(-19.164990789,-19.484833672,27.304585295));
+#2600=CARTESIAN_POINT('',(-19.124421689,-19.474768808,27.238037281));
+#2601=CARTESIAN_POINT('',(-19.729763615,-19.91812436,27.744655131));
+#2602=CARTESIAN_POINT('',(-19.664630304,-19.883033769,27.736213163));
+#2603=CARTESIAN_POINT('',(-19.59949962,-19.849906622,27.719675718));
+#2604=CARTESIAN_POINT('',(-19.472442605,-19.789200439,27.671225951));
+#2605=CARTESIAN_POINT('',(-19.410521399,-19.761623833,27.639315588));
+#2606=CARTESIAN_POINT('',(-19.292936542,-19.713371201,27.561690155));
+#2607=CARTESIAN_POINT('',(-19.23727764,-19.6926971,27.515978204));
+#2608=CARTESIAN_POINT('',(-19.134965101,-19.659261829,27.41299586));
+#2609=CARTESIAN_POINT('',(-19.088315608,-19.646501986,27.355729598));
+#2610=CARTESIAN_POINT('',(-19.047322711,-19.638010157,27.294090579));
+#2611=CARTESIAN_POINT('',(-19.577879254,-20.119399603,27.802422834));
+#2612=CARTESIAN_POINT('',(-19.517645568,-20.088420938,27.79271703));
+#2613=CARTESIAN_POINT('',(-19.457413645,-20.059552403,27.776292347));
+#2614=CARTESIAN_POINT('',(-19.339468849,-20.007239656,27.730692211));
+#2615=CARTESIAN_POINT('',(-19.281759429,-19.983796971,27.701518092));
+#2616=CARTESIAN_POINT('',(-19.171277123,-19.943316169,27.631639876));
+#2617=CARTESIAN_POINT('',(-19.118507473,-19.926279233,27.590937822));
+#2618=CARTESIAN_POINT('',(-19.020116225,-19.899321932,27.499706278));
+#2619=CARTESIAN_POINT('',(-18.974497511,-19.889402351,27.449179452));
+#2620=CARTESIAN_POINT('',(-18.93340944,-19.883248129,27.394795572));
+#2621=CARTESIAN_POINT('',(-19.52766057,-20.186206081,27.824122401));
+#2622=CARTESIAN_POINT('',(-19.468996264,-20.156690931,27.81410517));
+#2623=CARTESIAN_POINT('',(-19.410333426,-20.129311321,27.797805107));
+#2624=CARTESIAN_POINT('',(-19.295321022,-20.079899565,27.753281707));
+#2625=CARTESIAN_POINT('',(-19.238974448,-20.0578687,27.725059528));
+#2626=CARTESIAN_POINT('',(-19.130819959,-20.020022647,27.657805069));
+#2627=CARTESIAN_POINT('',(-19.079014859,-20.004208441,27.618774536));
+#2628=CARTESIAN_POINT('',(-18.981990038,-19.979418583,27.531442484));
+#2629=CARTESIAN_POINT('',(-18.936772846,-19.970443573,27.483143232));
+#2630=CARTESIAN_POINT('',(-18.895742078,-19.965064385,27.43116075));
+#2631=CARTESIAN_POINT('',(-19.429040963,-20.319590869,27.872785724));
+#2632=CARTESIAN_POINT('',(-19.37337729,-20.293155445,27.862391803));
+#2633=CARTESIAN_POINT('',(-19.317714698,-20.26887065,27.84653623));
+#2634=CARTESIAN_POINT('',(-19.208332177,-20.225446915,27.804454999));
+#2635=CARTESIAN_POINT('',(-19.154614473,-20.206308854,27.778230195));
+#2636=CARTESIAN_POINT('',(-19.050999178,-20.173845428,27.7163258));
+#2637=CARTESIAN_POINT('',(-19.001103697,-20.160520719,27.680647465));
+#2638=CARTESIAN_POINT('',(-18.906877398,-20.140147832,27.601080717));
+#2639=CARTESIAN_POINT('',(-18.8625485,-20.133100064,27.557193918));
+#2640=CARTESIAN_POINT('',(-18.821777395,-20.129312947,27.509967526));
+#2641=CARTESIAN_POINT('',(-19.380728302,-20.386057282,27.899727202));
+#2642=CARTESIAN_POINT('',(-19.326492967,-20.361235986,27.889269331));
+#2643=CARTESIAN_POINT('',(-19.272258607,-20.338554868,27.873734053));
+#2644=CARTESIAN_POINT('',(-19.165568136,-20.298213752,27.833017411));
+#2645=CARTESIAN_POINT('',(-19.113113943,-20.280554474,27.807836779));
+#2646=CARTESIAN_POINT('',(-19.011705837,-20.250834791,27.748654703));
+#2647=CARTESIAN_POINT('',(-18.962753746,-20.238774914,27.714654319));
+#2648=CARTESIAN_POINT('',(-18.869957364,-20.220648155,27.638946829));
+#2649=CARTESIAN_POINT('',(-18.826114743,-20.214581595,27.597241079));
+#2650=CARTESIAN_POINT('',(-18.785546227,-20.211610361,27.552365222));
+#2651=CARTESIAN_POINT('',(-19.242517888,-20.583145768,27.988067784));
+#2652=CARTESIAN_POINT('',(-19.192277329,-20.563279756,27.977827821));
+#2653=CARTESIAN_POINT('',(-19.142037357,-20.545488857,27.963566553));
+#2654=CARTESIAN_POINT('',(-19.042901829,-20.514523902,27.927382338));
+#2655=CARTESIAN_POINT('',(-18.994007434,-20.501350191,27.905459811));
+#2656=CARTESIAN_POINT('',(-18.898873496,-20.479963568,27.854536102));
+#2657=CARTESIAN_POINT('',(-18.852635071,-20.471750888,27.825535505));
+#2658=CARTESIAN_POINT('',(-18.764054064,-20.460498057,27.761225188));
+#2659=CARTESIAN_POINT('',(-18.721712527,-20.457458021,27.725916202));
+#2660=CARTESIAN_POINT('',(-18.681888416,-20.45704138,27.687920738));
+#2661=CARTESIAN_POINT('',(-19.158354579,-20.712219807,28.057058529));
+#2662=CARTESIAN_POINT('',(-19.11041912,-20.69582655,28.047501216));
+#2663=CARTESIAN_POINT('',(-19.062484064,-20.681419196,28.034503088));
+#2664=CARTESIAN_POINT('',(-18.967745483,-20.656908957,28.001928628));
+#2665=CARTESIAN_POINT('',(-18.920942833,-20.646806288,27.982352592));
+#2666=CARTESIAN_POINT('',(-18.829575103,-20.631137186,27.937080036));
+#2667=CARTESIAN_POINT('',(-18.785010867,-20.625570889,27.911383927));
+#2668=CARTESIAN_POINT('',(-18.69917368,-20.619099532,27.854472277));
+#2669=CARTESIAN_POINT('',(-18.657901523,-20.618194524,27.823257253));
+#2670=CARTESIAN_POINT('',(-18.61876338,-20.619627853,27.789647736));
+#2671=CARTESIAN_POINT('',(-19.057282168,-20.904812471,28.180185136));
+#2672=CARTESIAN_POINT('',(-19.012049662,-20.893673958,28.172603611));
+#2673=CARTESIAN_POINT('',(-18.966817421,-20.884410713,28.162256329));
+#2674=CARTESIAN_POINT('',(-18.877254703,-20.869817419,28.136235576));
+#2675=CARTESIAN_POINT('',(-18.832924817,-20.864487465,28.120562274));
+#2676=CARTESIAN_POINT('',(-18.746051318,-20.857865289,28.084200874));
+#2677=CARTESIAN_POINT('',(-18.703508279,-20.85657311,28.063513014));
+#2678=CARTESIAN_POINT('',(-18.621057489,-20.858050572,28.017533604));
+#2679=CARTESIAN_POINT('',(-18.581150283,-20.860820202,27.992242357));
+#2680=CARTESIAN_POINT('',(-18.542959044,-20.865592342,27.96490061));
+#2681=CARTESIAN_POINT('',(-19.028137202,-20.968488425,28.224367419));
+#2682=CARTESIAN_POINT('',(-18.983670779,-20.959099476,28.217602424));
+#2683=CARTESIAN_POINT('',(-18.93920462,-20.951553374,28.208262429));
+#2684=CARTESIAN_POINT('',(-18.851113196,-20.940288219,28.184608158));
+#2685=CARTESIAN_POINT('',(-18.807488456,-20.936569232,28.170294023));
+#2686=CARTESIAN_POINT('',(-18.721905407,-20.933027478,28.136961305));
+#2687=CARTESIAN_POINT('',(-18.679947609,-20.933204731,28.11794292));
+#2688=CARTESIAN_POINT('',(-18.598492505,-20.937450944,28.075560411));
+#2689=CARTESIAN_POINT('',(-18.558995685,-20.941519878,28.052196537));
+#2690=CARTESIAN_POINT('',(-18.521102901,-20.947495617,28.026880206));
+#2691=CARTESIAN_POINT('',(-18.982559961,-21.092743469,28.318039031));
+#2692=CARTESIAN_POINT('',(-18.939282686,-21.086741011,28.313200972));
+#2693=CARTESIAN_POINT('',(-18.896005628,-21.082544957,28.306097371));
+#2694=CARTESIAN_POINT('',(-18.810200547,-21.077836947,28.287481142));
+#2695=CARTESIAN_POINT('',(-18.767672953,-21.077325012,28.275968607));
+#2696=CARTESIAN_POINT('',(-18.684103329,-21.079992863,28.248732845));
+#2697=CARTESIAN_POINT('',(-18.643061715,-21.083172633,28.233009752));
+#2698=CARTESIAN_POINT('',(-18.563174905,-21.093167623,28.197623975));
+#2699=CARTESIAN_POINT('',(-18.524330108,-21.099982791,28.177961466));
+#2700=CARTESIAN_POINT('',(-18.48691997,-21.108556102,28.156498764));
+#2701=CARTESIAN_POINT('',(-18.965959287,-21.153638702,28.367724895));
+#2702=CARTESIAN_POINT('',(-18.923109824,-21.149282184,28.363999929));
+#2703=CARTESIAN_POINT('',(-18.880260562,-21.146727813,28.358129295));
+#2704=CARTESIAN_POINT('',(-18.795279712,-21.145265624,28.342194545));
+#2705=CARTESIAN_POINT('',(-18.753148522,-21.146357813,28.332130503));
+#2706=CARTESIAN_POINT('',(-18.670309871,-21.152169966,28.307977097));
+#2707=CARTESIAN_POINT('',(-18.629602797,-21.156889902,28.293887845));
+#2708=CARTESIAN_POINT('',(-18.55029458,-21.169877974,28.2619196));
+#2709=CARTESIAN_POINT('',(-18.511693809,-21.178146047,28.244040757));
+#2710=CARTESIAN_POINT('',(-18.474469465,-21.188118704,28.224416577));
+#2711=CARTESIAN_POINT('',(-18.947422244,-21.272924215,28.473328594));
+#2712=CARTESIAN_POINT('',(-18.905049964,-21.271712362,28.472123871));
+#2713=CARTESIAN_POINT('',(-18.862677868,-21.272341518,28.468949711));
+#2714=CARTESIAN_POINT('',(-18.778616536,-21.277271208,28.458713225));
+#2715=CARTESIAN_POINT('',(-18.736927666,-21.28157172,28.451650943));
+#2716=CARTESIAN_POINT('',(-18.654905008,-21.293774295,28.43375159));
+#2717=CARTESIAN_POINT('',(-18.614571576,-21.301676304,28.422914596));
+#2718=CARTESIAN_POINT('',(-18.535910176,-21.320953969,28.397640034));
+#2719=CARTESIAN_POINT('',(-18.49758255,-21.332329542,28.383202574));
+#2720=CARTESIAN_POINT('',(-18.460566683,-21.345349984,28.36708095));
+#2721=CARTESIAN_POINT('',(-18.94567896,-21.331579113,28.52960732));
+#2722=CARTESIAN_POINT('',(-18.903351254,-21.331871287,28.529820224));
+#2723=CARTESIAN_POINT('',(-18.861023731,-21.33404857,28.528119665));
+#2724=CARTESIAN_POINT('',(-18.777048391,-21.34213869,28.520919222));
+#2725=CARTESIAN_POINT('',(-18.735400935,-21.348051494,28.515419369));
+#2726=CARTESIAN_POINT('',(-18.653454879,-21.363518,28.50070899));
+#2727=CARTESIAN_POINT('',(-18.613156633,-21.373071635,28.491498527));
+#2728=CARTESIAN_POINT('',(-18.53455648,-21.395666665,28.469515202));
+#2729=CARTESIAN_POINT('',(-18.496254911,-21.408707962,28.456742434));
+#2730=CARTESIAN_POINT('',(-18.459259219,-21.423388556,28.442291222));
+#2731=CARTESIAN_POINT('',(-18.957538664,-21.442015114,28.644416897));
+#2732=CARTESIAN_POINT('',(-18.914906086,-21.445011573,28.647622866));
+#2733=CARTESIAN_POINT('',(-18.872273701,-21.450042027,28.648972461));
+#2734=CARTESIAN_POINT('',(-18.787710744,-21.464088445,28.647937006));
+#2735=CARTESIAN_POINT('',(-18.745780555,-21.473104345,28.645551961));
+#2736=CARTESIAN_POINT('',(-18.66331263,-21.494973497,28.637086793));
+#2737=CARTESIAN_POINT('',(-18.622775268,-21.50782665,28.631006709));
+#2738=CARTESIAN_POINT('',(-18.543760707,-21.537158961,28.615251894));
+#2739=CARTESIAN_POINT('',(-18.505283866,-21.553637988,28.605577236));
+#2740=CARTESIAN_POINT('',(-18.468153997,-21.571794487,28.594185074));
+#2741=CARTESIAN_POINT('',(-18.970958349,-21.494343998,28.703382961));
+#2742=CARTESIAN_POINT('',(-18.927980916,-21.498555772,28.708173936));
+#2743=CARTESIAN_POINT('',(-18.885003689,-21.504906183,28.711110808));
+#2744=CARTESIAN_POINT('',(-18.799776014,-21.521777735,28.713227821));
+#2745=CARTESIAN_POINT('',(-18.757525973,-21.532298797,28.712407953));
+#2746=CARTESIAN_POINT('',(-18.674467585,-21.557334601,28.707026425));
+#2747=CARTESIAN_POINT('',(-18.633659635,-21.571849225,28.702464792));
+#2748=CARTESIAN_POINT('',(-18.55417599,-21.604627647,28.689677954));
+#2749=CARTESIAN_POINT('',(-18.515500675,-21.622891291,28.681452811));
+#2750=CARTESIAN_POINT('',(-18.478218761,-21.642875595,28.671465962));
+#2751=CARTESIAN_POINT('',(-19.010906674,-21.593596665,28.824354335));
+#2752=CARTESIAN_POINT('',(-18.966891148,-21.599950221,28.832440622));
+#2753=CARTESIAN_POINT('',(-18.922875867,-21.608720575,28.83864333));
+#2754=CARTESIAN_POINT('',(-18.835650944,-21.630935218,28.847169209));
+#2755=CARTESIAN_POINT('',(-18.79244179,-21.644379383,28.849492335));
+#2756=CARTESIAN_POINT('',(-18.707620517,-21.675696381,28.850217534));
+#2757=CARTESIAN_POINT('',(-18.666008873,-21.69356904,28.848619606));
+#2758=CARTESIAN_POINT('',(-18.585144808,-21.733416764,28.841532966));
+#2759=CARTESIAN_POINT('',(-18.545892841,-21.755391608,28.836044296));
+#2760=CARTESIAN_POINT('',(-18.508180005,-21.779217002,28.828660974));
+#2761=CARTESIAN_POINT('',(-19.037657276,-21.640813009,28.886798537));
+#2762=CARTESIAN_POINT('',(-18.992942422,-21.648097847,28.896607262));
+#2763=CARTESIAN_POINT('',(-18.948227845,-21.657974555,28.90450034));
+#2764=CARTESIAN_POINT('',(-18.85965878,-21.682722764,28.916305247));
+#2765=CARTESIAN_POINT('',(-18.81580484,-21.697594113,28.920217004));
+#2766=CARTESIAN_POINT('',(-18.7298012,-21.732046674,28.923985644));
+#2767=CARTESIAN_POINT('',(-18.687652031,-21.751627675,28.923842506));
+#2768=CARTESIAN_POINT('',(-18.605869402,-21.79512425,28.919505678));
+#2769=CARTESIAN_POINT('',(-18.566236446,-21.819039556,28.915312017));
+#2770=CARTESIAN_POINT('',(-18.528242957,-21.844892901,28.909134156));
+#2771=CARTESIAN_POINT('',(-19.100687063,-21.728431129,29.012313833));
+#2772=CARTESIAN_POINT('',(-19.054297374,-21.737250886,29.025575369));
+#2773=CARTESIAN_POINT('',(-19.007908044,-21.74907936,29.036842725));
+#2774=CARTESIAN_POINT('',(-18.916128498,-21.778500047,29.055148285));
+#2775=CARTESIAN_POINT('',(-18.870738993,-21.796092033,29.06218635));
+#2776=CARTESIAN_POINT('',(-18.781937457,-21.836661873,29.071883224));
+#2777=CARTESIAN_POINT('',(-18.738526112,-21.859639414,29.074541961));
+#2778=CARTESIAN_POINT('',(-18.654616751,-21.910486689,29.075424368));
+#2779=CARTESIAN_POINT('',(-18.614119384,-21.938356032,29.073648033));
+#2780=CARTESIAN_POINT('',(-18.575515297,-21.968372023,29.069673988));
+#2781=CARTESIAN_POINT('',(-19.136812789,-21.768861653,29.07532019));
+#2782=CARTESIAN_POINT('',(-19.089451597,-21.778287649,29.090310109));
+#2783=CARTESIAN_POINT('',(-19.042090818,-21.790963273,29.103259671));
+#2784=CARTESIAN_POINT('',(-18.948452632,-21.822524724,29.124784182));
+#2785=CARTESIAN_POINT('',(-18.902176043,-21.841410277,29.133358947));
+#2786=CARTESIAN_POINT('',(-18.811765751,-21.884960597,29.145939516));
+#2787=CARTESIAN_POINT('',(-18.767632838,-21.909624987,29.149945213));
+#2788=CARTESIAN_POINT('',(-18.682520586,-21.964170175,29.153297733));
+#2789=CARTESIAN_POINT('',(-18.64154199,-21.994050501,29.15264453));
+#2790=CARTESIAN_POINT('',(-18.602609591,-22.02619811,29.149670155));
+#2791=CARTESIAN_POINT('',(-19.181984147,-21.811930157,29.148090223));
+#2792=CARTESIAN_POINT('',(-19.133383251,-21.821882611,29.165043732));
+#2793=CARTESIAN_POINT('',(-19.08478285,-21.835397618,29.179905697));
+#2794=CARTESIAN_POINT('',(-18.98878073,-21.869219694,29.205080326));
+#2795=CARTESIAN_POINT('',(-18.941379989,-21.889526417,29.215392735));
+#2796=CARTESIAN_POINT('',(-18.848947276,-21.93643083,29.231213647));
+#2797=CARTESIAN_POINT('',(-18.803916246,-21.963028042,29.236721989));
+#2798=CARTESIAN_POINT('',(-18.717334574,-22.021857058,29.24279874));
+#2799=CARTESIAN_POINT('',(-18.675784815,-22.054088264,29.243367086));
+#2800=CARTESIAN_POINT('',(-18.636488109,-22.088739041,29.241458417));
+#2801=CARTESIAN_POINT('',(-19.187835904,-21.817382328,29.157415737));
+#2802=CARTESIAN_POINT('',(-19.139073977,-21.827399014,29.174620283));
+#2803=CARTESIAN_POINT('',(-19.090312556,-21.841019003,29.189726765));
+#2804=CARTESIAN_POINT('',(-18.994003507,-21.875126843,29.215367918));
+#2805=CARTESIAN_POINT('',(-18.946456877,-21.89561434,29.225902322));
+#2806=CARTESIAN_POINT('',(-18.853761979,-21.942946952,29.24213682));
+#2807=CARTESIAN_POINT('',(-18.808614672,-21.969791576,29.247836745));
+#2808=CARTESIAN_POINT('',(-18.721843244,-22.029169824,29.254260219));
+#2809=CARTESIAN_POINT('',(-18.680220023,-22.061702832,29.254983702));
+#2810=CARTESIAN_POINT('',(-18.640876927,-22.096675169,29.253209951));
+#2811=CARTESIAN_POINT('',(-19.193754025,-21.822773919,29.166751537));
+#2812=CARTESIAN_POINT('',(-19.144828777,-21.832851702,29.184206724));
+#2813=CARTESIAN_POINT('',(-19.095904047,-21.846574225,29.199557385));
+#2814=CARTESIAN_POINT('',(-18.999283844,-21.880964246,29.225664275));
+#2815=CARTESIAN_POINT('',(-18.951589393,-21.901631381,29.236420228));
+#2816=CARTESIAN_POINT('',(-18.858629133,-21.949391055,29.253067122));
+#2817=CARTESIAN_POINT('',(-18.813364307,-21.97648309,29.258957887));
+#2818=CARTESIAN_POINT('',(-18.726401616,-22.036411425,29.265726168));
+#2819=CARTESIAN_POINT('',(-18.68470467,-22.069247092,29.266603613));
+#2820=CARTESIAN_POINT('',(-18.645315518,-22.104542097,29.264963349));
+#2821=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2561,#2562,#2563,#2564,#2565,#2566,#2567,#2568,#2569,#2570),(#2571,#2572,#2573,#2574,#2575,#2576,#2577,#2578,#2579,#2580),(#2581,#2582,#2583,#2584,#2585,#2586,#2587,#2588,#2589,#2590),(#2591,#2592,#2593,#2594,#2595,#2596,#2597,#2598,#2599,#2600),(#2601,#2602,#2603,#2604,#2605,#2606,#2607,#2608,#2609,#2610),(#2611,#2612,#2613,#2614,#2615,#2616,#2617,#2618,#2619,#2620),(#2621,#2622,#2623,#2624,#2625,#2626,#2627,#2628,#2629,#2630),(#2631,#2632,#2633,#2634,#2635,#2636,#2637,#2638,#2639,#2640),(#2641,#2642,#2643,#2644,#2645,#2646,#2647,#2648,#2649,#2650),(#2651,#2652,#2653,#2654,#2655,#2656,#2657,#2658,#2659,#2660),(#2661,#2662,#2663,#2664,#2665,#2666,#2667,#2668,#2669,#2670),(#2671,#2672,#2673,#2674,#2675,#2676,#2677,#2678,#2679,#2680),(#2681,#2682,#2683,#2684,#2685,#2686,#2687,#2688,#2689,#2690),(#2691,#2692,#2693,#2694,#2695,#2696,#2697,#2698,#2699,#2700),(#2701,#2702,#2703,#2704,#2705,#2706,#2707,#2708,#2709,#2710),(#2711,#2712,#2713,#2714,#2715,#2716,#2717,#2718,#2719,#2720),(#2721,#2722,#2723,#2724,#2725,#2726,#2727,#2728,#2729,#2730),(#2731,#2732,#2733,#2734,#2735,#2736,#2737,#2738,#2739,#2740),(#2741,#2742,#2743,#2744,#2745,#2746,#2747,#2748,#2749,#2750),(#2751,#2752,#2753,#2754,#2755,#2756,#2757,#2758,#2759,#2760),(#2761,#2762,#2763,#2764,#2765,#2766,#2767,#2768,#2769,#2770),(#2771,#2772,#2773,#2774,#2775,#2776,#2777,#2778,#2779,#2780),(#2781,#2782,#2783,#2784,#2785,#2786,#2787,#2788,#2789,#2790),(#2791,#2792,#2793,#2794,#2795,#2796,#2797,#2798,#2799,#2800),(#2801,#2802,#2803,#2804,#2805,#2806,#2807,#2808,#2809,#2810),(#2811,#2812,#2813,#2814,#2815,#2816,#2817,#2818,#2819,#2820)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(-0.,0.000633434,0.001266868,0.001583585,0.001900302,0.002533736,0.002850452,0.003167169,0.003483886,0.003800603,0.00411732,0.004434037,0.004480535),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#2822=ORIENTED_EDGE('',*,*,#873,.F.);
+#2823=ORIENTED_EDGE('',*,*,#1732,.F.);
+#2824=CARTESIAN_POINT('',(-20.233154644,-19.224694785,26.666750919));
+#2825=DIRECTION('',(-0.453596325,0.891207257,0.));
+#2826=DIRECTION('',(-0.891207257,-0.453596325,0.));
+#2827=AXIS2_PLACEMENT_3D('',#2824,#2825,#2826);
+#2828=CIRCLE('',#2827,1.);
+#2829=EDGE_CURVE('',#962,#1707,#2828,.T.);
+#2830=ORIENTED_EDGE('',*,*,#2829,.F.);
+#2831=ORIENTED_EDGE('',*,*,#1818,.F.);
+#2832=EDGE_LOOP('',(#2822,#2823,#2830,#2831));
+#2833=FACE_BOUND('',#2832,.T.);
+#2834=ADVANCED_FACE('',(#2833),#2821,.T.);
+#2835=CARTESIAN_POINT('',(-19.424860946,-18.81329884,27.087968938));
+#2836=CARTESIAN_POINT('',(-19.442629397,-18.822342478,27.130898684));
+#2837=CARTESIAN_POINT('',(-19.463118754,-18.832770948,27.172410172));
+#2838=CARTESIAN_POINT('',(-19.509127351,-18.856187915,27.251762098));
+#2839=CARTESIAN_POINT('',(-19.53464628,-18.869176254,27.289602));
+#2840=CARTESIAN_POINT('',(-19.590200361,-18.897451539,27.360848964));
+#2841=CARTESIAN_POINT('',(-19.620235137,-18.912738293,27.394255544));
+#2842=CARTESIAN_POINT('',(-19.684216342,-18.945302711,27.455963312));
+#2843=CARTESIAN_POINT('',(-19.718162339,-18.962580155,27.484264083));
+#2844=CARTESIAN_POINT('',(-19.789282672,-18.998778174,27.535190453));
+#2845=CARTESIAN_POINT('',(-19.826456527,-19.017698504,27.557815709));
+#2846=CARTESIAN_POINT('',(-19.903284283,-19.05680144,27.596935518));
+#2847=CARTESIAN_POINT('',(-19.942937662,-19.07698378,27.613429805));
+#2848=CARTESIAN_POINT('',(-20.023926245,-19.118204464,27.639955558));
+#2849=CARTESIAN_POINT('',(-20.0652609,-19.13924253,27.649986843));
+#2850=CARTESIAN_POINT('',(-20.148779962,-19.181751162,27.663384569));
+#2851=CARTESIAN_POINT('',(-20.190963802,-19.20322144,27.666750919));
+#2852=CARTESIAN_POINT('',(-20.233147928,-19.224691864,27.666750919));
+#2853=CARTESIAN_POINT('',(-19.448713801,-18.75844563,27.080161267));
+#2854=CARTESIAN_POINT('',(-19.466391398,-18.767186408,27.123587963));
+#2855=CARTESIAN_POINT('',(-19.486857948,-18.777307374,27.165601144));
+#2856=CARTESIAN_POINT('',(-19.532951271,-18.800103049,27.245943254));
+#2857=CARTESIAN_POINT('',(-19.558577722,-18.8127776,27.284271623));
+#2858=CARTESIAN_POINT('',(-19.614467262,-18.840421384,27.356460958));
+#2859=CARTESIAN_POINT('',(-19.644729962,-18.855390424,27.390321421));
+#2860=CARTESIAN_POINT('',(-19.709273701,-18.887317228,27.452883076));
+#2861=CARTESIAN_POINT('',(-19.743554292,-18.904274769,27.481583832));
+#2862=CARTESIAN_POINT('',(-19.815433436,-18.939831976,27.533239621));
+#2863=CARTESIAN_POINT('',(-19.853031488,-18.958431393,27.556194293));
+#2864=CARTESIAN_POINT('',(-19.930777405,-18.996892194,27.595888852));
+#2865=CARTESIAN_POINT('',(-19.970924727,-19.016753309,27.612628462));
+#2866=CARTESIAN_POINT('',(-20.052948947,-19.057331556,27.63955081));
+#2867=CARTESIAN_POINT('',(-20.094825273,-19.078048406,27.649733361));
+#2868=CARTESIAN_POINT('',(-20.179451939,-19.119914682,27.663333463));
+#2869=CARTESIAN_POINT('',(-20.222201688,-19.141063817,27.666750919));
+#2870=CARTESIAN_POINT('',(-20.264951735,-19.162213099,27.666750919));
+#2871=CARTESIAN_POINT('',(-19.471903453,-18.702783004,27.072238386));
+#2872=CARTESIAN_POINT('',(-19.489470865,-18.711222597,27.116165514));
+#2873=CARTESIAN_POINT('',(-19.509896587,-18.721036608,27.158685021));
+#2874=CARTESIAN_POINT('',(-19.556041471,-18.743210053,27.240028076));
+#2875=CARTESIAN_POINT('',(-19.581760301,-18.755569326,27.278851039));
+#2876=CARTESIAN_POINT('',(-19.637957941,-18.782576828,27.351995694));
+#2877=CARTESIAN_POINT('',(-19.668436348,-18.797224862,27.38631686));
+#2878=CARTESIAN_POINT('',(-19.733520974,-18.828505929,27.449745983));
+#2879=CARTESIAN_POINT('',(-19.768126725,-18.845138737,27.478853484));
+#2880=CARTESIAN_POINT('',(-19.840748274,-18.880044214,27.531251472));
+#2881=CARTESIAN_POINT('',(-19.87876355,-18.898316632,27.554541583));
+#2882=CARTESIAN_POINT('',(-19.957415666,-18.93612217,27.594821642));
+#2883=CARTESIAN_POINT('',(-19.998051941,-18.955655018,27.6118113));
+#2884=CARTESIAN_POINT('',(-20.081103213,-18.995576103,27.63913798));
+#2885=CARTESIAN_POINT('',(-20.123517613,-19.015964053,27.649474804));
+#2886=CARTESIAN_POINT('',(-20.209245405,-19.05717228,27.663281324));
+#2887=CARTESIAN_POINT('',(-20.252558182,-19.077992262,27.666750919));
+#2888=CARTESIAN_POINT('',(-20.29587127,-19.098812394,27.666750919));
+#2889=CARTESIAN_POINT('',(-19.603494797,-18.372836477,27.025274608));
+#2890=CARTESIAN_POINT('',(-19.620303119,-18.37953025,27.072143485));
+#2891=CARTESIAN_POINT('',(-19.640382713,-18.387557526,27.117646557));
+#2892=CARTESIAN_POINT('',(-19.686630933,-18.406095689,27.204898147));
+#2893=CARTESIAN_POINT('',(-19.712799166,-18.416606416,27.24664593));
+#2894=CARTESIAN_POINT('',(-19.770633989,-18.439871648,27.325447188));
+#2895=CARTESIAN_POINT('',(-19.80230009,-18.452625953,27.362499999));
+#2896=CARTESIAN_POINT('',(-19.870416664,-18.48008775,27.431077394));
+#2897=CARTESIAN_POINT('',(-19.906866561,-18.494795006,27.4626014));
+#2898=CARTESIAN_POINT('',(-19.983729464,-18.525827933,27.519411791));
+#2899=CARTESIAN_POINT('',(-20.024141821,-18.542153337,27.544697696));
+#2900=CARTESIAN_POINT('',(-20.108019523,-18.576051191,27.588462911));
+#2901=CARTESIAN_POINT('',(-20.151484161,-18.593623349,27.606941852));
+#2902=CARTESIAN_POINT('',(-20.240487866,-18.629615141,27.636677333));
+#2903=CARTESIAN_POINT('',(-20.286026183,-18.648034467,27.647933622));
+#2904=CARTESIAN_POINT('',(-20.378152186,-18.685301864,27.662970478));
+#2905=CARTESIAN_POINT('',(-20.424739095,-18.704149616,27.666750919));
+#2906=CARTESIAN_POINT('',(-20.471326396,-18.722997529,27.666750919));
+#2907=CARTESIAN_POINT('',(-19.696498881,-18.081326054,26.983781732));
+#2908=CARTESIAN_POINT('',(-19.712216115,-18.08663425,27.03315171));
+#2909=CARTESIAN_POINT('',(-19.731576788,-18.093213045,27.081220209));
+#2910=CARTESIAN_POINT('',(-19.777113703,-18.108750027,27.173593889));
+#2911=CARTESIAN_POINT('',(-19.803289497,-18.117708058,27.217898174));
+#2912=CARTESIAN_POINT('',(-19.861820678,-18.1377834,27.301672596));
+#2913=CARTESIAN_POINT('',(-19.894175492,-18.148900511,27.341141922));
+#2914=CARTESIAN_POINT('',(-19.964280069,-18.173021202,27.414292766));
+#2915=CARTESIAN_POINT('',(-20.002029148,-18.186024541,27.447973576));
+#2916=CARTESIAN_POINT('',(-20.082007864,-18.213598847,27.508733789));
+#2917=CARTESIAN_POINT('',(-20.124236722,-18.228169538,27.535812604));
+#2918=CARTESIAN_POINT('',(-20.212152882,-18.258521465,27.582714811));
+#2919=CARTESIAN_POINT('',(-20.257839329,-18.274302397,27.60253775));
+#2920=CARTESIAN_POINT('',(-20.351565418,-18.306688193,27.634449469));
+#2921=CARTESIAN_POINT('',(-20.39960415,-18.323292732,27.646537939));
+#2922=CARTESIAN_POINT('',(-20.496873006,-18.356919035,27.662688743));
+#2923=CARTESIAN_POINT('',(-20.546102185,-18.373940462,27.666750919));
+#2924=CARTESIAN_POINT('',(-20.595331842,-18.39096206,27.666750919));
+#2925=CARTESIAN_POINT('',(-19.846778314,-17.473493361,26.897264321));
+#2926=CARTESIAN_POINT('',(-19.859407739,-17.476389167,26.951566464));
+#2927=CARTESIAN_POINT('',(-19.876461637,-17.480349363,27.004778056));
+#2928=CARTESIAN_POINT('',(-19.918941451,-17.490285906,27.107543159));
+#2929=CARTESIAN_POINT('',(-19.944366814,-17.49626212,27.157095346));
+#2930=CARTESIAN_POINT('',(-20.002879833,-17.510061343,27.251163997));
+#2931=CARTESIAN_POINT('',(-20.035966731,-17.517884168,27.29567925));
+#2932=CARTESIAN_POINT('',(-20.108880695,-17.535155454,27.378436683));
+#2933=CARTESIAN_POINT('',(-20.148706818,-17.544603687,27.416677798));
+#2934=CARTESIAN_POINT('',(-20.233990304,-17.56485905,27.485824155));
+#2935=CARTESIAN_POINT('',(-20.279446567,-17.575665911,27.516728508));
+#2936=CARTESIAN_POINT('',(-20.37472536,-17.598333693,27.570342514));
+#2937=CARTESIAN_POINT('',(-20.424546662,-17.610194314,27.593051478));
+#2938=CARTESIAN_POINT('',(-20.527169585,-17.634635234,27.629643623));
+#2939=CARTESIAN_POINT('',(-20.579969884,-17.647215211,27.643526334));
+#2940=CARTESIAN_POINT('',(-20.687082281,-17.672740289,27.662080101));
+#2941=CARTESIAN_POINT('',(-20.741393,-17.685685055,27.666750919));
+#2942=CARTESIAN_POINT('',(-20.795704418,-17.698629991,27.666750919));
+#2943=CARTESIAN_POINT('',(-19.904049946,-17.15718612,26.852241926));
+#2944=CARTESIAN_POINT('',(-19.914682252,-17.159055615,26.908974572));
+#2945=CARTESIAN_POINT('',(-19.930147854,-17.161846077,26.964763392));
+#2946=CARTESIAN_POINT('',(-19.970281019,-17.169183952,27.072797143));
+#2947=CARTESIAN_POINT('',(-19.994947981,-17.173731251,27.125040485));
+#2948=CARTESIAN_POINT('',(-20.052745777,-17.184444538,27.224429848));
+#2949=CARTESIAN_POINT('',(-20.085875751,-17.19061036,27.271574408));
+#2950=CARTESIAN_POINT('',(-20.159610668,-17.204373457,27.359364859));
+#2951=CARTESIAN_POINT('',(-20.200214518,-17.211970521,27.400009461));
+#2952=CARTESIAN_POINT('',(-20.287686857,-17.22836557,27.473592159));
+#2953=CARTESIAN_POINT('',(-20.334554052,-17.237163304,27.506529176));
+#2954=CARTESIAN_POINT('',(-20.433157232,-17.255692844,27.563718071));
+#2955=CARTESIAN_POINT('',(-20.484891761,-17.265424364,27.587969111));
+#2956=CARTESIAN_POINT('',(-20.591689607,-17.285526381,27.627065532));
+#2957=CARTESIAN_POINT('',(-20.646751349,-17.295896569,27.641910341));
+#2958=CARTESIAN_POINT('',(-20.758565079,-17.316961502,27.66175318));
+#2959=CARTESIAN_POINT('',(-20.815315419,-17.327655925,27.666750919));
+#2960=CARTESIAN_POINT('',(-20.872066595,-17.338350512,27.666750919));
+#2961=CARTESIAN_POINT('',(-19.980661736,-16.511914374,26.760395532));
+#2962=CARTESIAN_POINT('',(-19.986511805,-16.512335647,26.821726864));
+#2963=CARTESIAN_POINT('',(-19.998013229,-16.51329314,26.882507984));
+#2964=CARTESIAN_POINT('',(-20.031924967,-16.516246239,27.00091523));
+#2965=CARTESIAN_POINT('',(-20.054334621,-16.518241783,27.058539089));
+#2966=CARTESIAN_POINT('',(-20.109299784,-16.523200617,27.168680097));
+#2967=CARTESIAN_POINT('',(-20.141854232,-16.526163806,27.22119514));
+#2968=CARTESIAN_POINT('',(-20.216003092,-16.532954022,27.319340234));
+#2969=CARTESIAN_POINT('',(-20.257596079,-16.536780911,27.364968408));
+#2970=CARTESIAN_POINT('',(-20.348410714,-16.545164698,27.447794919));
+#2971=CARTESIAN_POINT('',(-20.397630619,-16.549721426,27.484991674));
+#2972=CARTESIAN_POINT('',(-20.502030099,-16.559405781,27.549696065));
+#2973=CARTESIAN_POINT('',(-20.557207672,-16.564533212,27.577202464));
+#2974=CARTESIAN_POINT('',(-20.67165221,-16.575180099,27.621594901));
+#2975=CARTESIAN_POINT('',(-20.730916982,-16.580699339,27.63848009));
+#2976=CARTESIAN_POINT('',(-20.851527534,-16.591937402,27.661058315));
+#2977=CARTESIAN_POINT('',(-20.912871004,-16.597655997,27.666750919));
+#2978=CARTESIAN_POINT('',(-20.974215648,-16.603374708,27.666750919));
+#2979=CARTESIAN_POINT('',(-20.,-16.182965825,26.713573805));
+#2980=CARTESIAN_POINT('',(-20.003064551,-16.182965825,26.777072698));
+#2981=CARTESIAN_POINT('',(-20.012189597,-16.183260609,26.84026839));
+#2982=CARTESIAN_POINT('',(-20.042225552,-16.184428447,26.963779687));
+#2983=CARTESIAN_POINT('',(-20.063135793,-16.185301472,27.024092617));
+#2984=CARTESIAN_POINT('',(-20.115982656,-16.187592268,27.139664144));
+#2985=CARTESIAN_POINT('',(-20.147918118,-16.189009983,27.194920239));
+#2986=CARTESIAN_POINT('',(-20.221659409,-16.192335703,27.298386823));
+#2987=CARTESIAN_POINT('',(-20.263463628,-16.194243627,27.346595075));
+#2988=CARTESIAN_POINT('',(-20.355431589,-16.198476466,27.434229106));
+#2989=CARTESIAN_POINT('',(-20.405593329,-16.200801277,27.473652992));
+#2990=CARTESIAN_POINT('',(-20.51246506,-16.20577857,27.542298122));
+#2991=CARTESIAN_POINT('',(-20.569172728,-16.208430928,27.571517882));
+#2992=CARTESIAN_POINT('',(-20.68708976,-16.213961399,27.618702193));
+#2993=CARTESIAN_POINT('',(-20.748296565,-16.216839375,27.636665725));
+#2994=CARTESIAN_POINT('',(-20.873003591,-16.222710492,27.660690347));
+#2995=CARTESIAN_POINT('',(-20.936501107,-16.225703488,27.666750919));
+#2996=CARTESIAN_POINT('',(-21.,-16.228696557,27.666750919));
+#2997=CARTESIAN_POINT('',(-20.,-15.854009142,26.666750919));
+#2998=CARTESIAN_POINT('',(-20.,-15.854009142,26.732200766));
+#2999=CARTESIAN_POINT('',(-20.006446088,-15.854009142,26.797648995));
+#3000=CARTESIAN_POINT('',(-20.031983351,-15.854009142,26.926033488));
+#3001=CARTESIAN_POINT('',(-20.051073895,-15.854009142,26.988966578));
+#3002=CARTESIAN_POINT('',(-20.10116704,-15.854009142,27.109902126));
+#3003=CARTESIAN_POINT('',(-20.132168401,-15.854009142,27.167901593));
+#3004=CARTESIAN_POINT('',(-20.204892374,-15.854009142,27.276740711));
+#3005=CARTESIAN_POINT('',(-20.246613188,-15.854009142,27.32757767));
+#3006=CARTESIAN_POINT('',(-20.339173249,-15.854009142,27.420137731));
+#3007=CARTESIAN_POINT('',(-20.390010208,-15.854009142,27.461858545));
+#3008=CARTESIAN_POINT('',(-20.498849326,-15.854009142,27.534582518));
+#3009=CARTESIAN_POINT('',(-20.556848794,-15.854009142,27.56558388));
+#3010=CARTESIAN_POINT('',(-20.677784342,-15.854009142,27.615677024));
+#3011=CARTESIAN_POINT('',(-20.740717431,-15.854009142,27.634767568));
+#3012=CARTESIAN_POINT('',(-20.869101924,-15.854009142,27.660304831));
+#3013=CARTESIAN_POINT('',(-20.934550153,-15.854009142,27.666750919));
+#3014=CARTESIAN_POINT('',(-21.,-15.854009142,27.666750919));
+#3015=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#2835,#2836,#2837,#2838,#2839,#2840,#2841,#2842,#2843,#2844,#2845,#2846,#2847,#2848,#2849,#2850,#2851,#2852),(#2853,#2854,#2855,#2856,#2857,#2858,#2859,#2860,#2861,#2862,#2863,#2864,#2865,#2866,#2867,#2868,#2869,#2870),(#2871,#2872,#2873,#2874,#2875,#2876,#2877,#2878,#2879,#2880,#2881,#2882,#2883,#2884,#2885,#2886,#2887,#2888),(#2889,#2890,#2891,#2892,#2893,#2894,#2895,#2896,#2897,#2898,#2899,#2900,#2901,#2902,#2903,#2904,#2905,#2906),(#2907,#2908,#2909,#2910,#2911,#2912,#2913,#2914,#2915,#2916,#2917,#2918,#2919,#2920,#2921,#2922,#2923,#2924),(#2925,#2926,#2927,#2928,#2929,#2930,#2931,#2932,#2933,#2934,#2935,#2936,#2937,#2938,#2939,#2940,#2941,#2942),(#2943,#2944,#2945,#2946,#2947,#2948,#2949,#2950,#2951,#2952,#2953,#2954,#2955,#2956,#2957,#2958,#2959,#2960),(#2961,#2962,#2963,#2964,#2965,#2966,#2967,#2968,#2969,#2970,#2971,#2972,#2973,#2974,#2975,#2976,#2977,#2978),(#2979,#2980,#2981,#2982,#2983,#2984,#2985,#2986,#2987,#2988,#2989,#2990,#2991,#2992,#2993,#2994,#2995,#2996),(#2997,#2998,#2999,#3000,#3001,#3002,#3003,#3004,#3005,#3006,#3007,#3008,#3009,#3010,#3011,#3012,#3013,#3014)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,2,2,2,2,4),(4.082831737,4.123340358,4.319689899,4.51603944,4.71238898),(0.,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1.),.UNSPECIFIED.);
+#3016=ORIENTED_EDGE('',*,*,#2829,.T.);
+#3017=ORIENTED_EDGE('',*,*,#1713,.F.);
+#3018=CARTESIAN_POINT('',(-21.,-15.854009142,26.666750919));
+#3019=DIRECTION('',(0.,1.,0.));
+#3020=DIRECTION('',(0.,-0.,1.));
+#3021=AXIS2_PLACEMENT_3D('',#3018,#3019,#3020);
+#3022=CIRCLE('',#3021,1.);
+#3023=EDGE_CURVE('',#964,#136,#3022,.T.);
+#3024=ORIENTED_EDGE('',*,*,#3023,.F.);
+#3025=ORIENTED_EDGE('',*,*,#970,.F.);
+#3026=EDGE_LOOP('',(#3016,#3017,#3024,#3025));
+#3027=FACE_BOUND('',#3026,.T.);
+#3028=ADVANCED_FACE('',(#3027),#3015,.T.);
+#3029=CARTESIAN_POINT('',(-21.,-5.67149291,26.666750919));
+#3030=DIRECTION('',(0.,1.,0.));
+#3031=DIRECTION('',(0.,-0.,1.));
+#3032=AXIS2_PLACEMENT_3D('',#3029,#3030,#3031);
+#3033=CYLINDRICAL_SURFACE('',#3032,1.);
+#3034=ORIENTED_EDGE('',*,*,#3023,.T.);
+#3035=ORIENTED_EDGE('',*,*,#141,.F.);
+#3036=CARTESIAN_POINT('',(-21.,5.485205765,26.666750919));
+#3037=DIRECTION('',(0.,1.,0.));
+#3038=DIRECTION('',(0.,-0.,1.));
+#3039=AXIS2_PLACEMENT_3D('',#3036,#3037,#3038);
+#3040=CIRCLE('',#3039,1.);
+#3041=EDGE_CURVE('',#973,#127,#3040,.T.);
+#3042=ORIENTED_EDGE('',*,*,#3041,.F.);
+#3043=ORIENTED_EDGE('',*,*,#978,.F.);
+#3044=EDGE_LOOP('',(#3034,#3035,#3042,#3043));
+#3045=FACE_BOUND('',#3044,.T.);
+#3046=ADVANCED_FACE('',(#3045),#3033,.T.);
+#3047=CARTESIAN_POINT('',(-21.,5.485205765,17.666750919));
+#3048=DIRECTION('',(-1.,0.,0.));
+#3049=DIRECTION('',(0.,0.,1.));
+#3050=AXIS2_PLACEMENT_3D('',#3047,#3048,#3049);
+#3051=TOROIDAL_SURFACE('',#3050,9.,1.);
+#3052=ORIENTED_EDGE('',*,*,#3041,.T.);
+#3053=ORIENTED_EDGE('',*,*,#133,.F.);
+#3054=CARTESIAN_POINT('',(-21.,12.062407326,23.810074094));
+#3055=DIRECTION('',(-0.,0.682591464,-0.730800173));
+#3056=DIRECTION('',(-0.,0.730800173,0.682591464));
+#3057=AXIS2_PLACEMENT_3D('',#3054,#3055,#3056);
+#3058=CIRCLE('',#3057,1.);
+#3059=EDGE_CURVE('',#1013,#119,#3058,.T.);
+#3060=ORIENTED_EDGE('',*,*,#3059,.F.);
+#3061=ORIENTED_EDGE('',*,*,#1420,.F.);
+#3062=EDGE_LOOP('',(#3052,#3053,#3060,#3061));
+#3063=FACE_BOUND('',#3062,.T.);
+#3064=ADVANCED_FACE('',(#3063),#3051,.T.);
+#3065=CARTESIAN_POINT('',(-20.,28.001846852,8.));
+#3066=CARTESIAN_POINT('',(-20.,28.071608366,8.110761279));
+#3067=CARTESIAN_POINT('',(-20.026027323,28.141342432,8.221478979));
+#3068=CARTESIAN_POINT('',(-20.126213612,28.270244902,8.426139137));
+#3069=CARTESIAN_POINT('',(-20.200333158,28.329362588,8.520001071));
+#3070=CARTESIAN_POINT('',(-20.38545328,28.428020268,8.676641174));
+#3071=CARTESIAN_POINT('',(-20.49638102,28.467521443,8.739357713));
+#3072=CARTESIAN_POINT('',(-20.738252116,28.520914594,8.824130726));
+#3073=CARTESIAN_POINT('',(-20.869100306,28.534785562,8.846153846));
+#3074=CARTESIAN_POINT('',(-21.,28.534785562,8.846153846));
+#3075=CARTESIAN_POINT('',(-20.,28.54589502,7.74300389));
+#3076=CARTESIAN_POINT('',(-20.009488406,28.609698247,7.850379136));
+#3077=CARTESIAN_POINT('',(-20.042568734,28.673481419,7.955490509));
+#3078=CARTESIAN_POINT('',(-20.151281035,28.792341975,8.146847814));
+#3079=CARTESIAN_POINT('',(-20.226877483,28.847381921,8.233033264));
+#3080=CARTESIAN_POINT('',(-20.410164355,28.941188965,8.374703523));
+#3081=CARTESIAN_POINT('',(-20.517796058,28.979926292,8.430143925));
+#3082=CARTESIAN_POINT('',(-20.750321281,29.035766894,8.502731664));
+#3083=CARTESIAN_POINT('',(-20.875140813,29.052852062,8.519856574));
+#3084=CARTESIAN_POINT('',(-21.,29.057908801,8.516671654));
+#3085=CARTESIAN_POINT('',(-19.967596458,29.095333744,7.504526185));
+#3086=CARTESIAN_POINT('',(-19.984988813,29.154137774,7.606773208));
+#3087=CARTESIAN_POINT('',(-20.023509229,29.212926405,7.705310781));
+#3088=CARTESIAN_POINT('',(-20.137955528,29.323190877,7.882754212));
+#3089=CARTESIAN_POINT('',(-20.213850893,29.374637817,7.961613616));
+#3090=CARTESIAN_POINT('',(-20.393525767,29.463781871,8.089850202));
+#3091=CARTESIAN_POINT('',(-20.497257823,29.501455542,8.139193917));
+#3092=CARTESIAN_POINT('',(-20.719620298,29.558321245,8.202238368));
+#3093=CARTESIAN_POINT('',(-20.838192196,29.577498185,8.21592274));
+#3094=CARTESIAN_POINT('',(-20.956795278,29.586215266,8.210931006));
+#3095=CARTESIAN_POINT('',(-19.858442583,30.207052357,7.061155477));
+#3096=CARTESIAN_POINT('',(-19.888510382,30.25697186,7.151686237));
+#3097=CARTESIAN_POINT('',(-19.935107276,30.306882813,7.236610556));
+#3098=CARTESIAN_POINT('',(-20.056564175,30.401651467,7.386668707));
+#3099=CARTESIAN_POINT('',(-20.131402732,30.446492904,7.451776851));
+#3100=CARTESIAN_POINT('',(-20.30167876,30.526557561,7.555594065));
+#3101=CARTESIAN_POINT('',(-20.397086594,30.56176695,7.594285486));
+#3102=CARTESIAN_POINT('',(-20.598765688,30.618965465,7.641351388));
+#3103=CARTESIAN_POINT('',(-20.705002059,30.640944557,7.649717978));
+#3104=CARTESIAN_POINT('',(-20.811256778,30.65517547,7.642507021));
+#3105=CARTESIAN_POINT('',(-19.781438541,30.769301281,6.856297106));
+#3106=CARTESIAN_POINT('',(-19.816291516,30.815346057,6.940218135));
+#3107=CARTESIAN_POINT('',(-19.865531892,30.861384423,7.018084506));
+#3108=CARTESIAN_POINT('',(-19.988267259,30.949268814,7.154648107));
+#3109=CARTESIAN_POINT('',(-20.061744928,30.991102597,7.213326395));
+#3110=CARTESIAN_POINT('',(-20.226214986,31.066751924,7.306162875));
+#3111=CARTESIAN_POINT('',(-20.317184321,31.1005569,7.340308221));
+#3112=CARTESIAN_POINT('',(-20.508310491,31.157048345,7.38096643));
+#3113=CARTESIAN_POINT('',(-20.608440616,31.17972687,7.387473694));
+#3114=CARTESIAN_POINT('',(-20.708584724,31.195799437,7.379868084));
+#3115=CARTESIAN_POINT('',(-19.640950142,31.62323173,6.572941307));
+#3116=CARTESIAN_POINT('',(-19.68090074,31.663996561,6.646706573));
+#3117=CARTESIAN_POINT('',(-19.732372151,31.704757298,6.714203979));
+#3118=CARTESIAN_POINT('',(-19.854377742,31.783130863,6.831466455));
+#3119=CARTESIAN_POINT('',(-19.924899604,31.820735819,6.881219769));
+#3120=CARTESIAN_POINT('',(-20.079539498,31.88988442,6.959142083));
+#3121=CARTESIAN_POINT('',(-20.163641957,31.921421112,6.987303281));
+#3122=CARTESIAN_POINT('',(-20.338927261,31.975987185,7.019860262));
+#3123=CARTESIAN_POINT('',(-20.430092476,31.999011065,7.024252793));
+#3124=CARTESIAN_POINT('',(-20.521266858,32.016886406,7.016591418));
+#3125=CARTESIAN_POINT('',(-19.58991083,31.909631618,6.482488102));
+#3126=CARTESIAN_POINT('',(-19.631215003,31.948727127,6.552823368));
+#3127=CARTESIAN_POINT('',(-19.683140857,31.987819158,6.616897229));
+#3128=CARTESIAN_POINT('',(-19.804460218,32.063161269,6.727878644));
+#3129=CARTESIAN_POINT('',(-19.873842891,32.099404644,6.77477634));
+#3130=CARTESIAN_POINT('',(-20.025015779,32.16640695,6.847988182));
+#3131=CARTESIAN_POINT('',(-20.106792516,32.197159913,6.87429583));
+#3132=CARTESIAN_POINT('',(-20.276791793,32.250937282,6.904409561));
+#3133=CARTESIAN_POINT('',(-20.364999189,32.27395689,6.908212975));
+#3134=CARTESIAN_POINT('',(-20.453214441,32.292270914,6.900625772));
+#3135=CARTESIAN_POINT('',(-19.480437082,32.486085553,6.309463886));
+#3136=CARTESIAN_POINT('',(-19.523806142,32.521988278,6.372955403));
+#3137=CARTESIAN_POINT('',(-19.576117996,32.557888536,6.430314874));
+#3138=CARTESIAN_POINT('',(-19.695275725,32.627391491,6.529110182));
+#3139=CARTESIAN_POINT('',(-19.762113368,32.660989411,6.570539247));
+#3140=CARTESIAN_POINT('',(-19.906030552,32.723731801,6.634818355));
+#3141=CARTESIAN_POINT('',(-19.983100175,32.752871952,6.657663998));
+#3142=CARTESIAN_POINT('',(-20.142535107,32.804827137,6.683311608));
+#3143=CARTESIAN_POINT('',(-20.224889441,32.827638586,6.686111824));
+#3144=CARTESIAN_POINT('',(-20.307249443,32.846553544,6.678799854));
+#3145=CARTESIAN_POINT('',(-19.421868781,32.776726576,6.22674695));
+#3146=CARTESIAN_POINT('',(-19.465949222,32.811103162,6.286817971));
+#3147=CARTESIAN_POINT('',(-19.518191386,32.845477679,6.340880324));
+#3148=CARTESIAN_POINT('',(-19.635869051,32.912167885,6.433759644));
+#3149=CARTESIAN_POINT('',(-19.701297444,32.944479557,6.472571031));
+#3150=CARTESIAN_POINT('',(-19.841417585,33.005104182,6.532620594));
+#3151=CARTESIAN_POINT('',(-19.916100881,33.03341348,6.553855164));
+#3152=CARTESIAN_POINT('',(-20.070246841,33.08433252,6.577476913));
+#3153=CARTESIAN_POINT('',(-20.149700213,33.106939189,6.579862676));
+#3154=CARTESIAN_POINT('',(-20.229158375,33.126016066,6.5727525));
+#3155=CARTESIAN_POINT('',(-19.237887344,33.647222554,5.992175475));
+#3156=CARTESIAN_POINT('',(-19.283209482,33.677232219,6.04222076));
+#3157=CARTESIAN_POINT('',(-19.334547698,33.707240777,6.086747219));
+#3158=CARTESIAN_POINT('',(-19.446781066,33.765828687,6.162660936));
+#3159=CARTESIAN_POINT('',(-19.50767197,33.794405874,6.194045453));
+#3160=CARTESIAN_POINT('',(-19.63608434,33.848765595,6.242192168));
+#3161=CARTESIAN_POINT('',(-19.703601,33.874546108,6.258952639));
+#3162=CARTESIAN_POINT('',(-19.842030926,33.922076185,6.277061324));
+#3163=CARTESIAN_POINT('',(-19.912939043,33.94382396,6.278408898));
+#3164=CARTESIAN_POINT('',(-19.983849792,33.963031429,6.27201984));
+#3165=CARTESIAN_POINT('',(-19.104023183,34.227247455,5.85330693));
+#3166=CARTESIAN_POINT('',(-19.148997216,34.254615096,5.896969411));
+#3167=CARTESIAN_POINT('',(-19.198815495,34.281981978,5.935596044));
+#3168=CARTESIAN_POINT('',(-19.306087775,34.335594166,6.001207815));
+#3169=CARTESIAN_POINT('',(-19.363538778,34.361837985,6.02819116));
+#3170=CARTESIAN_POINT('',(-19.483710413,34.412126154,6.069417129));
+#3171=CARTESIAN_POINT('',(-19.5464277,34.436169108,6.083658628));
+#3172=CARTESIAN_POINT('',(-19.674553176,34.481066321,6.098821072));
+#3173=CARTESIAN_POINT('',(-19.739957806,34.501919328,6.099741604));
+#3174=CARTESIAN_POINT('',(-19.805364252,34.520747681,6.093983237));
+#3175=CARTESIAN_POINT('',(-18.678216116,35.969634528,5.485162143));
+#3176=CARTESIAN_POINT('',(-18.719440238,35.989589867,5.511246186));
+#3177=CARTESIAN_POINT('',(-18.762664501,36.009545143,5.533876901));
+#3178=CARTESIAN_POINT('',(-18.852153456,36.049047453,5.571829704));
+#3179=CARTESIAN_POINT('',(-18.898417716,36.068594357,5.587151802));
+#3180=CARTESIAN_POINT('',(-18.992991549,36.106875384,5.610221905));
+#3181=CARTESIAN_POINT('',(-19.041300731,36.125609365,5.617969928));
+#3182=CARTESIAN_POINT('',(-19.13894729,36.161867901,5.625762453));
+#3183=CARTESIAN_POINT('',(-19.188284303,36.179392295,5.625806973));
+#3184=CARTESIAN_POINT('',(-19.237621494,36.196119866,5.62200274));
+#3185=CARTESIAN_POINT('',(-18.362411557,37.134365521,5.303962851));
+#3186=CARTESIAN_POINT('',(-18.397546444,37.150052172,5.32045691));
+#3187=CARTESIAN_POINT('',(-18.433685618,37.165738782,5.334709057));
+#3188=CARTESIAN_POINT('',(-18.507491737,37.19690561,5.358553728));
+#3189=CARTESIAN_POINT('',(-18.545158488,37.212385747,5.368146198));
+#3190=CARTESIAN_POINT('',(-18.621520644,37.242935574,5.382553234));
+#3191=CARTESIAN_POINT('',(-18.66021585,37.258005185,5.387367767));
+#3192=CARTESIAN_POINT('',(-18.738123726,37.287534718,5.392159652));
+#3193=CARTESIAN_POINT('',(-18.777336194,37.301994562,5.392136994));
+#3194=CARTESIAN_POINT('',(-18.816548763,37.316053517,5.389695945));
+#3195=CARTESIAN_POINT('',(-17.864796834,38.895464433,5.121923933));
+#3196=CARTESIAN_POINT('',(-17.888136684,38.905095237,5.12864173));
+#3197=CARTESIAN_POINT('',(-17.911731643,38.914726039,5.134410322));
+#3198=CARTESIAN_POINT('',(-17.959305567,38.933937036,5.144023532));
+#3199=CARTESIAN_POINT('',(-17.98328452,38.943517226,5.147868149));
+#3200=CARTESIAN_POINT('',(-18.03149906,38.962576535,5.153616464));
+#3201=CARTESIAN_POINT('',(-18.055734634,38.972055647,5.15552016));
+#3202=CARTESIAN_POINT('',(-18.104334294,38.990862624,5.157378305));
+#3203=CARTESIAN_POINT('',(-18.128698366,39.000190483,5.157332752));
+#3204=CARTESIAN_POINT('',(-18.153062445,39.009417849,5.15631272));
+#3205=CARTESIAN_POINT('',(-17.694813089,39.4848025,5.076313522));
+#3206=CARTESIAN_POINT('',(-17.713771803,39.492477166,5.08052868));
+#3207=CARTESIAN_POINT('',(-17.732858261,39.500151831,5.084144508));
+#3208=CARTESIAN_POINT('',(-17.771223466,39.515475816,5.090166346));
+#3209=CARTESIAN_POINT('',(-17.790502206,39.523125134,5.092572356));
+#3210=CARTESIAN_POINT('',(-17.829188194,39.538373149,5.096167135));
+#3211=CARTESIAN_POINT('',(-17.848595437,39.545971845,5.097355903));
+#3212=CARTESIAN_POINT('',(-17.887474273,39.561093493,5.098512531));
+#3213=CARTESIAN_POINT('',(-17.906945861,39.568616443,5.098480392));
+#3214=CARTESIAN_POINT('',(-17.926417452,39.57608907,5.097837849));
+#3215=CARTESIAN_POINT('',(-17.435971844,40.373350675,5.030554679));
+#3216=CARTESIAN_POINT('',(-17.447996575,40.378126794,5.032248667));
+#3217=CARTESIAN_POINT('',(-17.460053381,40.382902912,5.033699564));
+#3218=CARTESIAN_POINT('',(-17.48421515,40.39244884,5.036113577));
+#3219=CARTESIAN_POINT('',(-17.496320112,40.397218649,5.037076693));
+#3220=CARTESIAN_POINT('',(-17.520562161,40.406745655,5.03851408));
+#3221=CARTESIAN_POINT('',(-17.532699246,40.411502851,5.038988352));
+#3222=CARTESIAN_POINT('',(-17.556989485,40.420998335,5.039447529));
+#3223=CARTESIAN_POINT('',(-17.569142638,40.425736622,5.039432434));
+#3224=CARTESIAN_POINT('',(-17.581295792,40.430462315,5.039172665));
+#3225=CARTESIAN_POINT('',(-17.348992519,40.670466956,5.019085013));
+#3226=CARTESIAN_POINT('',(-17.358644009,40.674282362,5.020143765));
+#3227=CARTESIAN_POINT('',(-17.368311517,40.678097767,5.021050351));
+#3228=CARTESIAN_POINT('',(-17.387670584,40.685725427,5.022558493));
+#3229=CARTESIAN_POINT('',(-17.397362141,40.689537682,5.02316005));
+#3230=CARTESIAN_POINT('',(-17.416761299,40.697155892,5.024057669));
+#3231=CARTESIAN_POINT('',(-17.426468899,40.700961847,5.024353732));
+#3232=CARTESIAN_POINT('',(-17.445892124,40.708564316,5.024640136));
+#3233=CARTESIAN_POINT('',(-17.455607748,40.712360828,5.024630477));
+#3234=CARTESIAN_POINT('',(-17.465323372,40.716151051,5.024467961));
+#3235=CARTESIAN_POINT('',(-17.174732277,41.264278325,5.003815996));
+#3236=CARTESIAN_POINT('',(-17.179585951,41.266182087,5.004028214));
+#3237=CARTESIAN_POINT('',(-17.184439627,41.268085849,5.004209747));
+#3238=CARTESIAN_POINT('',(-17.194146979,41.271893375,5.004511541));
+#3239=CARTESIAN_POINT('',(-17.199000655,41.273797139,5.004631802));
+#3240=CARTESIAN_POINT('',(-17.208708002,41.27760467,5.00481112));
+#3241=CARTESIAN_POINT('',(-17.213561675,41.279508437,5.004870176));
+#3242=CARTESIAN_POINT('',(-17.223269017,41.283315973,5.004927117));
+#3243=CARTESIAN_POINT('',(-17.228122687,41.285219743,5.004925002));
+#3244=CARTESIAN_POINT('',(-17.232976357,41.287123513,5.0048923));
+#3245=CARTESIAN_POINT('',(-17.087381297,41.561214179,5.));
+#3246=CARTESIAN_POINT('',(-17.087381297,41.561214179,5.));
+#3247=CARTESIAN_POINT('',(-17.094663029,41.564070309,5.));
+#3248=CARTESIAN_POINT('',(-17.094663029,41.564070309,5.));
+#3249=CARTESIAN_POINT('',(-17.101944762,41.566926438,5.));
+#3250=CARTESIAN_POINT('',(-17.101944762,41.566926438,5.));
+#3251=CARTESIAN_POINT('',(-17.109226495,41.569782568,5.));
+#3252=CARTESIAN_POINT('',(-17.109226495,41.569782568,5.));
+#3253=CARTESIAN_POINT('',(-17.116508227,41.572638698,5.));
+#3254=CARTESIAN_POINT('',(-17.116508227,41.572638698,5.));
+#3255=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3256=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3257=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3258=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3259=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3260=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3261=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3262=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3263=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3264=CARTESIAN_POINT('',(-17.,41.858253313,5.));
+#3265=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3065,#3066,#3067,#3068,#3069,#3070,#3071,#3072,#3073,#3074),(#3075,#3076,#3077,#3078,#3079,#3080,#3081,#3082,#3083,#3084),(#3085,#3086,#3087,#3088,#3089,#3090,#3091,#3092,#3093,#3094),(#3095,#3096,#3097,#3098,#3099,#3100,#3101,#3102,#3103,#3104),(#3105,#3106,#3107,#3108,#3109,#3110,#3111,#3112,#3113,#3114),(#3115,#3116,#3117,#3118,#3119,#3120,#3121,#3122,#3123,#3124),(#3125,#3126,#3127,#3128,#3129,#3130,#3131,#3132,#3133,#3134),(#3135,#3136,#3137,#3138,#3139,#3140,#3141,#3142,#3143,#3144),(#3145,#3146,#3147,#3148,#3149,#3150,#3151,#3152,#3153,#3154),(#3155,#3156,#3157,#3158,#3159,#3160,#3161,#3162,#3163,#3164),(#3165,#3166,#3167,#3168,#3169,#3170,#3171,#3172,#3173,#3174),(#3175,#3176,#3177,#3178,#3179,#3180,#3181,#3182,#3183,#3184),(#3185,#3186,#3187,#3188,#3189,#3190,#3191,#3192,#3193,#3194),(#3195,#3196,#3197,#3198,#3199,#3200,#3201,#3202,#3203,#3204),(#3205,#3206,#3207,#3208,#3209,#3210,#3211,#3212,#3213,#3214),(#3215,#3216,#3217,#3218,#3219,#3220,#3221,#3222,#3223,#3224),(#3225,#3226,#3227,#3228,#3229,#3230,#3231,#3232,#3233,#3234),(#3235,#3236,#3237,#3238,#3239,#3240,#3241,#3242,#3243,#3244),(#3245,#3246,#3247,#3248,#3249,#3250,#3251,#3252,#3253,#3254),(#3255,#3256,#3257,#3258,#3259,#3260,#3261,#3262,#3263,#3264)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.014249141,0.015199084),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#3266=ORIENTED_EDGE('',*,*,#1688,.F.);
+#3267=ORIENTED_EDGE('',*,*,#1498,.F.);
+#3268=CARTESIAN_POINT('',(-21.,28.001846852,8.));
+#3269=DIRECTION('',(0.,-0.846153846,0.53293871));
+#3270=DIRECTION('',(0.,-0.53293871,-0.846153846));
+#3271=AXIS2_PLACEMENT_3D('',#3268,#3269,#3270);
+#3272=CIRCLE('',#3271,1.);
+#3273=EDGE_CURVE('',#102,#1464,#3272,.T.);
+#3274=ORIENTED_EDGE('',*,*,#3273,.F.);
+#3275=EDGE_LOOP('',(#3266,#3267,#3274));
+#3276=FACE_BOUND('',#3275,.T.);
+#3277=ADVANCED_FACE('',(#3276),#3265,.T.);
+#3278=CARTESIAN_POINT('',(-21.,19.683453372,15.650783996));
+#3279=DIRECTION('',(0.,0.682591464,-0.730800173));
+#3280=DIRECTION('',(0.,0.730800173,0.682591464));
+#3281=AXIS2_PLACEMENT_3D('',#3278,#3279,#3280);
+#3282=CYLINDRICAL_SURFACE('',#3281,1.);
+#3283=ORIENTED_EDGE('',*,*,#3059,.T.);
+#3284=ORIENTED_EDGE('',*,*,#124,.F.);
+#3285=CARTESIAN_POINT('',(-21.,22.857448803,12.25262194));
+#3286=DIRECTION('',(-0.,0.682591464,-0.730800173));
+#3287=DIRECTION('',(-0.,0.730800173,0.682591464));
+#3288=AXIS2_PLACEMENT_3D('',#3285,#3286,#3287);
+#3289=CIRCLE('',#3288,1.);
+#3290=EDGE_CURVE('',#1021,#110,#3289,.T.);
+#3291=ORIENTED_EDGE('',*,*,#3290,.F.);
+#3292=ORIENTED_EDGE('',*,*,#1026,.F.);
+#3293=EDGE_LOOP('',(#3283,#3284,#3291,#3292));
+#3294=FACE_BOUND('',#3293,.T.);
+#3295=ADVANCED_FACE('',(#3294),#3282,.T.);
+#3296=CARTESIAN_POINT('',(-21.,41.858253313,30.));
+#3297=DIRECTION('',(-1.,0.,0.));
+#3298=DIRECTION('',(0.,0.,1.));
+#3299=AXIS2_PLACEMENT_3D('',#3296,#3297,#3298);
+#3300=TOROIDAL_SURFACE('',#3299,26.,1.);
+#3301=ORIENTED_EDGE('',*,*,#3273,.T.);
+#3302=ORIENTED_EDGE('',*,*,#1470,.F.);
+#3303=ORIENTED_EDGE('',*,*,#3290,.T.);
+#3304=ORIENTED_EDGE('',*,*,#116,.F.);
+#3305=EDGE_LOOP('',(#3301,#3302,#3303,#3304));
+#3306=FACE_BOUND('',#3305,.T.);
+#3307=ADVANCED_FACE('',(#3306),#3300,.T.);
+#3308=CARTESIAN_POINT('',(19.424865983,-18.813301404,27.087969303));
+#3309=CARTESIAN_POINT('',(19.460403428,-18.83138884,27.17382872));
+#3310=CARTESIAN_POINT('',(19.506875188,-18.855041498,27.253978732));
+#3311=CARTESIAN_POINT('',(19.617983866,-18.911592303,27.396472548));
+#3312=CARTESIAN_POINT('',(19.682608783,-18.944484343,27.45880096));
+#3313=CARTESIAN_POINT('',(19.824849615,-19.01688043,27.560653656));
+#3314=CARTESIAN_POINT('',(19.902450167,-19.056376659,27.600166937));
+#3315=CARTESIAN_POINT('',(20.06442732,-19.13881791,27.653218434));
+#3316=CARTESIAN_POINT('',(20.148786426,-19.181754028,27.666750919));
+#3317=CARTESIAN_POINT('',(20.233154644,-19.224694785,27.666750919));
+#3318=CARTESIAN_POINT('',(19.352050062,-18.98077405,27.111806948));
+#3319=CARTESIAN_POINT('',(19.389478613,-18.996413074,27.192996945));
+#3320=CARTESIAN_POINT('',(19.436584705,-19.017460263,27.268641018));
+#3321=CARTESIAN_POINT('',(19.546706617,-19.068850762,27.403341384));
+#3322=CARTESIAN_POINT('',(19.609712563,-19.09918955,27.462385719));
+#3323=CARTESIAN_POINT('',(19.747022556,-19.166954887,27.55957127));
+#3324=CARTESIAN_POINT('',(19.821314357,-19.204375435,27.597703841));
+#3325=CARTESIAN_POINT('',(19.975766472,-19.283572473,27.650272131));
+#3326=CARTESIAN_POINT('',(20.055913049,-19.325341908,27.664703136));
+#3327=CARTESIAN_POINT('',(20.136066749,-19.367760489,27.666750919));
+#3328=CARTESIAN_POINT('',(19.276760001,-19.146134608,27.146888636));
+#3329=CARTESIAN_POINT('',(19.315547337,-19.159774261,27.223210658));
+#3330=CARTESIAN_POINT('',(19.36287698,-19.178579319,27.294237237));
+#3331=CARTESIAN_POINT('',(19.471463721,-19.225277838,27.420987808));
+#3332=CARTESIAN_POINT('',(19.532712716,-19.253167859,27.47670241));
+#3333=CARTESIAN_POINT('',(19.665046288,-19.316182906,27.569112694));
+#3334=CARTESIAN_POINT('',(19.736121022,-19.351303274,27.605801519));
+#3335=CARTESIAN_POINT('',(19.883362577,-19.426441036,27.657707868));
+#3336=CARTESIAN_POINT('',(19.959518462,-19.466452863,27.672921518));
+#3337=CARTESIAN_POINT('',(20.035680002,-19.507579233,27.676886562));
+#3338=CARTESIAN_POINT('',(19.124421689,-19.474768808,27.238037281));
+#3339=CARTESIAN_POINT('',(19.164990789,-19.484833672,27.304585295));
+#3340=CARTESIAN_POINT('',(19.212092048,-19.499494037,27.366424274));
+#3341=CARTESIAN_POINT('',(19.31677459,-19.537213456,27.477317563));
+#3342=CARTESIAN_POINT('',(19.374350632,-19.560270669,27.526366394));
+#3343=CARTESIAN_POINT('',(19.49682329,-19.613528998,27.608996297));
+#3344=CARTESIAN_POINT('',(19.561713806,-19.643727496,27.642573276));
+#3345=CARTESIAN_POINT('',(19.695260252,-19.709620398,27.692417751));
+#3346=CARTESIAN_POINT('',(19.763909549,-19.745311545,27.708682754));
+#3347=CARTESIAN_POINT('',(19.832562253,-19.782774395,27.715842646));
+#3348=CARTESIAN_POINT('',(19.047322711,-19.638010157,27.294090579));
+#3349=CARTESIAN_POINT('',(19.088315608,-19.646501986,27.355729598));
+#3350=CARTESIAN_POINT('',(19.134965101,-19.659261829,27.41299586));
+#3351=CARTESIAN_POINT('',(19.23727764,-19.6926971,27.515978204));
+#3352=CARTESIAN_POINT('',(19.292936542,-19.713371201,27.561690155));
+#3353=CARTESIAN_POINT('',(19.410521399,-19.761623833,27.639315588));
+#3354=CARTESIAN_POINT('',(19.472442605,-19.789200439,27.671225951));
+#3355=CARTESIAN_POINT('',(19.59949962,-19.849906622,27.719675718));
+#3356=CARTESIAN_POINT('',(19.664630304,-19.883033769,27.736213163));
+#3357=CARTESIAN_POINT('',(19.729763615,-19.91812436,27.744655131));
+#3358=CARTESIAN_POINT('',(18.93340944,-19.883248129,27.394795572));
+#3359=CARTESIAN_POINT('',(18.974497511,-19.889402351,27.449179452));
+#3360=CARTESIAN_POINT('',(19.020116225,-19.899321932,27.499706278));
+#3361=CARTESIAN_POINT('',(19.118507473,-19.926279233,27.590937822));
+#3362=CARTESIAN_POINT('',(19.171277123,-19.943316169,27.631639876));
+#3363=CARTESIAN_POINT('',(19.281759429,-19.983796971,27.701518092));
+#3364=CARTESIAN_POINT('',(19.339468849,-20.007239656,27.730692211));
+#3365=CARTESIAN_POINT('',(19.457413645,-20.059552403,27.776292347));
+#3366=CARTESIAN_POINT('',(19.517645568,-20.088420938,27.79271703));
+#3367=CARTESIAN_POINT('',(19.577879254,-20.119399603,27.802422834));
+#3368=CARTESIAN_POINT('',(18.895742078,-19.965064385,27.43116075));
+#3369=CARTESIAN_POINT('',(18.936772846,-19.970443573,27.483143232));
+#3370=CARTESIAN_POINT('',(18.981990038,-19.979418583,27.531442484));
+#3371=CARTESIAN_POINT('',(19.079014859,-20.004208441,27.618774536));
+#3372=CARTESIAN_POINT('',(19.130819959,-20.020022647,27.657805069));
+#3373=CARTESIAN_POINT('',(19.238974448,-20.0578687,27.725059528));
+#3374=CARTESIAN_POINT('',(19.295321022,-20.079899565,27.753281707));
+#3375=CARTESIAN_POINT('',(19.410333426,-20.129311321,27.797805107));
+#3376=CARTESIAN_POINT('',(19.468996264,-20.156690931,27.81410517));
+#3377=CARTESIAN_POINT('',(19.52766057,-20.186206081,27.824122401));
+#3378=CARTESIAN_POINT('',(18.821777395,-20.129312947,27.509967526));
+#3379=CARTESIAN_POINT('',(18.8625485,-20.133100064,27.557193918));
+#3380=CARTESIAN_POINT('',(18.906877398,-20.140147832,27.601080717));
+#3381=CARTESIAN_POINT('',(19.001103697,-20.160520719,27.680647465));
+#3382=CARTESIAN_POINT('',(19.050999178,-20.173845428,27.7163258));
+#3383=CARTESIAN_POINT('',(19.154614473,-20.206308854,27.778230195));
+#3384=CARTESIAN_POINT('',(19.208332177,-20.225446915,27.804454999));
+#3385=CARTESIAN_POINT('',(19.317714698,-20.26887065,27.84653623));
+#3386=CARTESIAN_POINT('',(19.37337729,-20.293155445,27.862391803));
+#3387=CARTESIAN_POINT('',(19.429040963,-20.319590869,27.872785724));
+#3388=CARTESIAN_POINT('',(18.785546227,-20.211610361,27.552365222));
+#3389=CARTESIAN_POINT('',(18.826114743,-20.214581595,27.597241079));
+#3390=CARTESIAN_POINT('',(18.869957364,-20.220648155,27.638946829));
+#3391=CARTESIAN_POINT('',(18.962753746,-20.238774914,27.714654319));
+#3392=CARTESIAN_POINT('',(19.011705837,-20.250834791,27.748654703));
+#3393=CARTESIAN_POINT('',(19.113113943,-20.280554474,27.807836779));
+#3394=CARTESIAN_POINT('',(19.165568136,-20.298213752,27.833017411));
+#3395=CARTESIAN_POINT('',(19.272258607,-20.338554868,27.873734053));
+#3396=CARTESIAN_POINT('',(19.326492967,-20.361235986,27.889269331));
+#3397=CARTESIAN_POINT('',(19.380728302,-20.386057282,27.899727202));
+#3398=CARTESIAN_POINT('',(18.681888416,-20.45704138,27.687920738));
+#3399=CARTESIAN_POINT('',(18.721712527,-20.457458021,27.725916202));
+#3400=CARTESIAN_POINT('',(18.764054064,-20.460498057,27.761225188));
+#3401=CARTESIAN_POINT('',(18.852635071,-20.471750888,27.825535505));
+#3402=CARTESIAN_POINT('',(18.898873496,-20.479963568,27.854536102));
+#3403=CARTESIAN_POINT('',(18.994007434,-20.501350191,27.905459811));
+#3404=CARTESIAN_POINT('',(19.042901829,-20.514523902,27.927382338));
+#3405=CARTESIAN_POINT('',(19.142037357,-20.545488857,27.963566553));
+#3406=CARTESIAN_POINT('',(19.192277329,-20.563279756,27.977827821));
+#3407=CARTESIAN_POINT('',(19.242517888,-20.583145768,27.988067784));
+#3408=CARTESIAN_POINT('',(18.61876338,-20.619627853,27.789647736));
+#3409=CARTESIAN_POINT('',(18.657901523,-20.618194524,27.823257253));
+#3410=CARTESIAN_POINT('',(18.69917368,-20.619099532,27.854472277));
+#3411=CARTESIAN_POINT('',(18.785010867,-20.625570889,27.911383927));
+#3412=CARTESIAN_POINT('',(18.829575103,-20.631137186,27.937080036));
+#3413=CARTESIAN_POINT('',(18.920942833,-20.646806288,27.982352592));
+#3414=CARTESIAN_POINT('',(18.967745483,-20.656908957,28.001928628));
+#3415=CARTESIAN_POINT('',(19.062484064,-20.681419196,28.034503088));
+#3416=CARTESIAN_POINT('',(19.11041912,-20.69582655,28.047501216));
+#3417=CARTESIAN_POINT('',(19.158354579,-20.712219807,28.057058529));
+#3418=CARTESIAN_POINT('',(18.542959044,-20.865592342,27.96490061));
+#3419=CARTESIAN_POINT('',(18.581150283,-20.860820202,27.992242357));
+#3420=CARTESIAN_POINT('',(18.621057489,-20.858050572,28.017533604));
+#3421=CARTESIAN_POINT('',(18.703508279,-20.85657311,28.063513014));
+#3422=CARTESIAN_POINT('',(18.746051318,-20.857865289,28.084200874));
+#3423=CARTESIAN_POINT('',(18.832924817,-20.864487465,28.120562274));
+#3424=CARTESIAN_POINT('',(18.877254703,-20.869817419,28.136235576));
+#3425=CARTESIAN_POINT('',(18.966817421,-20.884410713,28.162256329));
+#3426=CARTESIAN_POINT('',(19.012049662,-20.893673958,28.172603611));
+#3427=CARTESIAN_POINT('',(19.057282168,-20.904812471,28.180185136));
+#3428=CARTESIAN_POINT('',(18.521102901,-20.947495617,28.026880206));
+#3429=CARTESIAN_POINT('',(18.558995685,-20.941519878,28.052196537));
+#3430=CARTESIAN_POINT('',(18.598492505,-20.937450944,28.075560411));
+#3431=CARTESIAN_POINT('',(18.679947609,-20.933204731,28.11794292));
+#3432=CARTESIAN_POINT('',(18.721905407,-20.933027478,28.136961305));
+#3433=CARTESIAN_POINT('',(18.807488456,-20.936569232,28.170294023));
+#3434=CARTESIAN_POINT('',(18.851113196,-20.940288219,28.184608158));
+#3435=CARTESIAN_POINT('',(18.93920462,-20.951553374,28.208262429));
+#3436=CARTESIAN_POINT('',(18.983670779,-20.959099476,28.217602424));
+#3437=CARTESIAN_POINT('',(19.028137202,-20.968488425,28.224367419));
+#3438=CARTESIAN_POINT('',(18.48691997,-21.108556102,28.156498764));
+#3439=CARTESIAN_POINT('',(18.524330108,-21.099982791,28.177961466));
+#3440=CARTESIAN_POINT('',(18.563174905,-21.093167623,28.197623975));
+#3441=CARTESIAN_POINT('',(18.643061715,-21.083172633,28.233009752));
+#3442=CARTESIAN_POINT('',(18.684103329,-21.079992863,28.248732845));
+#3443=CARTESIAN_POINT('',(18.767672953,-21.077325012,28.275968607));
+#3444=CARTESIAN_POINT('',(18.810200547,-21.077836947,28.287481142));
+#3445=CARTESIAN_POINT('',(18.896005628,-21.082544957,28.306097371));
+#3446=CARTESIAN_POINT('',(18.939282686,-21.086741011,28.313200972));
+#3447=CARTESIAN_POINT('',(18.982559961,-21.092743469,28.318039031));
+#3448=CARTESIAN_POINT('',(18.474469465,-21.188118704,28.224416577));
+#3449=CARTESIAN_POINT('',(18.511693809,-21.178146047,28.244040757));
+#3450=CARTESIAN_POINT('',(18.55029458,-21.169877974,28.2619196));
+#3451=CARTESIAN_POINT('',(18.629602797,-21.156889902,28.293887845));
+#3452=CARTESIAN_POINT('',(18.670309871,-21.152169966,28.307977097));
+#3453=CARTESIAN_POINT('',(18.753148522,-21.146357813,28.332130503));
+#3454=CARTESIAN_POINT('',(18.795279712,-21.145265624,28.342194545));
+#3455=CARTESIAN_POINT('',(18.880260562,-21.146727813,28.358129295));
+#3456=CARTESIAN_POINT('',(18.923109824,-21.149282184,28.363999929));
+#3457=CARTESIAN_POINT('',(18.965959287,-21.153638702,28.367724895));
+#3458=CARTESIAN_POINT('',(18.460566683,-21.345349984,28.36708095));
+#3459=CARTESIAN_POINT('',(18.49758255,-21.332329542,28.383202574));
+#3460=CARTESIAN_POINT('',(18.535910176,-21.320953969,28.397640034));
+#3461=CARTESIAN_POINT('',(18.614571576,-21.301676304,28.422914596));
+#3462=CARTESIAN_POINT('',(18.654905008,-21.293774295,28.43375159));
+#3463=CARTESIAN_POINT('',(18.736927666,-21.28157172,28.451650943));
+#3464=CARTESIAN_POINT('',(18.778616536,-21.277271208,28.458713225));
+#3465=CARTESIAN_POINT('',(18.862677868,-21.272341518,28.468949711));
+#3466=CARTESIAN_POINT('',(18.905049964,-21.271712362,28.472123871));
+#3467=CARTESIAN_POINT('',(18.947422244,-21.272924215,28.473328594));
+#3468=CARTESIAN_POINT('',(18.459259219,-21.423388556,28.442291222));
+#3469=CARTESIAN_POINT('',(18.496254911,-21.408707962,28.456742434));
+#3470=CARTESIAN_POINT('',(18.53455648,-21.395666665,28.469515202));
+#3471=CARTESIAN_POINT('',(18.613156633,-21.373071635,28.491498527));
+#3472=CARTESIAN_POINT('',(18.653454879,-21.363518,28.50070899));
+#3473=CARTESIAN_POINT('',(18.735400935,-21.348051494,28.515419369));
+#3474=CARTESIAN_POINT('',(18.777048391,-21.34213869,28.520919222));
+#3475=CARTESIAN_POINT('',(18.861023731,-21.33404857,28.528119665));
+#3476=CARTESIAN_POINT('',(18.903351254,-21.331871287,28.529820224));
+#3477=CARTESIAN_POINT('',(18.94567896,-21.331579113,28.52960732));
+#3478=CARTESIAN_POINT('',(18.468153997,-21.571794487,28.594185074));
+#3479=CARTESIAN_POINT('',(18.505283866,-21.553637988,28.605577236));
+#3480=CARTESIAN_POINT('',(18.543760707,-21.537158961,28.615251894));
+#3481=CARTESIAN_POINT('',(18.622775268,-21.50782665,28.631006709));
+#3482=CARTESIAN_POINT('',(18.66331263,-21.494973497,28.637086793));
+#3483=CARTESIAN_POINT('',(18.745780555,-21.473104345,28.645551961));
+#3484=CARTESIAN_POINT('',(18.787710744,-21.464088445,28.647937006));
+#3485=CARTESIAN_POINT('',(18.872273701,-21.450042027,28.648972461));
+#3486=CARTESIAN_POINT('',(18.914906086,-21.445011573,28.647622866));
+#3487=CARTESIAN_POINT('',(18.957538664,-21.442015114,28.644416897));
+#3488=CARTESIAN_POINT('',(18.478218761,-21.642875595,28.671465962));
+#3489=CARTESIAN_POINT('',(18.515500675,-21.622891291,28.681452811));
+#3490=CARTESIAN_POINT('',(18.55417599,-21.604627647,28.689677954));
+#3491=CARTESIAN_POINT('',(18.633659635,-21.571849225,28.702464792));
+#3492=CARTESIAN_POINT('',(18.674467585,-21.557334601,28.707026425));
+#3493=CARTESIAN_POINT('',(18.757525973,-21.532298797,28.712407953));
+#3494=CARTESIAN_POINT('',(18.799776014,-21.521777735,28.713227821));
+#3495=CARTESIAN_POINT('',(18.885003689,-21.504906183,28.711110808));
+#3496=CARTESIAN_POINT('',(18.927980916,-21.498555772,28.708173936));
+#3497=CARTESIAN_POINT('',(18.970958349,-21.494343998,28.703382961));
+#3498=CARTESIAN_POINT('',(18.508180005,-21.779217002,28.828660974));
+#3499=CARTESIAN_POINT('',(18.545892841,-21.755391608,28.836044296));
+#3500=CARTESIAN_POINT('',(18.585144808,-21.733416764,28.841532966));
+#3501=CARTESIAN_POINT('',(18.666008873,-21.69356904,28.848619606));
+#3502=CARTESIAN_POINT('',(18.707620517,-21.675696381,28.850217534));
+#3503=CARTESIAN_POINT('',(18.79244179,-21.644379383,28.849492335));
+#3504=CARTESIAN_POINT('',(18.835650944,-21.630935218,28.847169209));
+#3505=CARTESIAN_POINT('',(18.922875867,-21.608720575,28.83864333));
+#3506=CARTESIAN_POINT('',(18.966891148,-21.599950221,28.832440622));
+#3507=CARTESIAN_POINT('',(19.010906674,-21.593596665,28.824354335));
+#3508=CARTESIAN_POINT('',(18.528242957,-21.844892901,28.909134156));
+#3509=CARTESIAN_POINT('',(18.566236446,-21.819039556,28.915312017));
+#3510=CARTESIAN_POINT('',(18.605869402,-21.79512425,28.919505678));
+#3511=CARTESIAN_POINT('',(18.687652031,-21.751627675,28.923842506));
+#3512=CARTESIAN_POINT('',(18.7298012,-21.732046674,28.923985644));
+#3513=CARTESIAN_POINT('',(18.81580484,-21.697594113,28.920217004));
+#3514=CARTESIAN_POINT('',(18.85965878,-21.682722764,28.916305247));
+#3515=CARTESIAN_POINT('',(18.948227845,-21.657974555,28.90450034));
+#3516=CARTESIAN_POINT('',(18.992942422,-21.648097847,28.896607262));
+#3517=CARTESIAN_POINT('',(19.037657276,-21.640813009,28.886798537));
+#3518=CARTESIAN_POINT('',(18.575515297,-21.968372023,29.069673988));
+#3519=CARTESIAN_POINT('',(18.614119384,-21.938356032,29.073648033));
+#3520=CARTESIAN_POINT('',(18.654616751,-21.910486689,29.075424368));
+#3521=CARTESIAN_POINT('',(18.738526112,-21.859639414,29.074541961));
+#3522=CARTESIAN_POINT('',(18.781937457,-21.836661873,29.071883224));
+#3523=CARTESIAN_POINT('',(18.870738993,-21.796092033,29.06218635));
+#3524=CARTESIAN_POINT('',(18.916128498,-21.778500047,29.055148285));
+#3525=CARTESIAN_POINT('',(19.007908044,-21.74907936,29.036842725));
+#3526=CARTESIAN_POINT('',(19.054297374,-21.737250886,29.025575369));
+#3527=CARTESIAN_POINT('',(19.100687063,-21.728431129,29.012313833));
+#3528=CARTESIAN_POINT('',(18.602609591,-22.02619811,29.149670155));
+#3529=CARTESIAN_POINT('',(18.64154199,-21.994050501,29.15264453));
+#3530=CARTESIAN_POINT('',(18.682520586,-21.964170175,29.153297733));
+#3531=CARTESIAN_POINT('',(18.767632838,-21.909624987,29.149945213));
+#3532=CARTESIAN_POINT('',(18.811765751,-21.884960597,29.145939516));
+#3533=CARTESIAN_POINT('',(18.902176043,-21.841410277,29.133358947));
+#3534=CARTESIAN_POINT('',(18.948452632,-21.822524724,29.124784182));
+#3535=CARTESIAN_POINT('',(19.042090818,-21.790963273,29.103259671));
+#3536=CARTESIAN_POINT('',(19.089451597,-21.778287649,29.090310109));
+#3537=CARTESIAN_POINT('',(19.136812789,-21.768861653,29.07532019));
+#3538=CARTESIAN_POINT('',(18.636488109,-22.088739041,29.241458417));
+#3539=CARTESIAN_POINT('',(18.675784815,-22.054088264,29.243367086));
+#3540=CARTESIAN_POINT('',(18.717334574,-22.021857058,29.24279874));
+#3541=CARTESIAN_POINT('',(18.803916246,-21.963028042,29.236721989));
+#3542=CARTESIAN_POINT('',(18.848947276,-21.93643083,29.231213647));
+#3543=CARTESIAN_POINT('',(18.941379989,-21.889526417,29.215392735));
+#3544=CARTESIAN_POINT('',(18.98878073,-21.869219694,29.205080326));
+#3545=CARTESIAN_POINT('',(19.08478285,-21.835397618,29.179905697));
+#3546=CARTESIAN_POINT('',(19.133383251,-21.821882611,29.165043732));
+#3547=CARTESIAN_POINT('',(19.181984147,-21.811930157,29.148090223));
+#3548=CARTESIAN_POINT('',(18.640876927,-22.096675169,29.253209951));
+#3549=CARTESIAN_POINT('',(18.680220023,-22.061702832,29.254983702));
+#3550=CARTESIAN_POINT('',(18.721843244,-22.029169824,29.254260219));
+#3551=CARTESIAN_POINT('',(18.808614672,-21.969791576,29.247836745));
+#3552=CARTESIAN_POINT('',(18.853761979,-21.942946952,29.24213682));
+#3553=CARTESIAN_POINT('',(18.946456877,-21.89561434,29.225902322));
+#3554=CARTESIAN_POINT('',(18.994003507,-21.875126843,29.215367918));
+#3555=CARTESIAN_POINT('',(19.090312556,-21.841019003,29.189726765));
+#3556=CARTESIAN_POINT('',(19.139073977,-21.827399014,29.174620283));
+#3557=CARTESIAN_POINT('',(19.187835904,-21.817382328,29.157415737));
+#3558=CARTESIAN_POINT('',(18.645315518,-22.104542097,29.264963349));
+#3559=CARTESIAN_POINT('',(18.68470467,-22.069247091,29.266603613));
+#3560=CARTESIAN_POINT('',(18.726401616,-22.036411425,29.265726168));
+#3561=CARTESIAN_POINT('',(18.813364307,-21.97648309,29.258957887));
+#3562=CARTESIAN_POINT('',(18.858629133,-21.949391055,29.253067122));
+#3563=CARTESIAN_POINT('',(18.951589393,-21.901631381,29.236420228));
+#3564=CARTESIAN_POINT('',(18.999283844,-21.880964246,29.225664275));
+#3565=CARTESIAN_POINT('',(19.095904047,-21.846574225,29.199557385));
+#3566=CARTESIAN_POINT('',(19.144828777,-21.832851702,29.184206724));
+#3567=CARTESIAN_POINT('',(19.193754025,-21.822773919,29.166751537));
+#3568=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3308,#3309,#3310,#3311,#3312,#3313,#3314,#3315,#3316,#3317),(#3318,#3319,#3320,#3321,#3322,#3323,#3324,#3325,#3326,#3327),(#3328,#3329,#3330,#3331,#3332,#3333,#3334,#3335,#3336,#3337),(#3338,#3339,#3340,#3341,#3342,#3343,#3344,#3345,#3346,#3347),(#3348,#3349,#3350,#3351,#3352,#3353,#3354,#3355,#3356,#3357),(#3358,#3359,#3360,#3361,#3362,#3363,#3364,#3365,#3366,#3367),(#3368,#3369,#3370,#3371,#3372,#3373,#3374,#3375,#3376,#3377),(#3378,#3379,#3380,#3381,#3382,#3383,#3384,#3385,#3386,#3387),(#3388,#3389,#3390,#3391,#3392,#3393,#3394,#3395,#3396,#3397),(#3398,#3399,#3400,#3401,#3402,#3403,#3404,#3405,#3406,#3407),(#3408,#3409,#3410,#3411,#3412,#3413,#3414,#3415,#3416,#3417),(#3418,#3419,#3420,#3421,#3422,#3423,#3424,#3425,#3426,#3427),(#3428,#3429,#3430,#3431,#3432,#3433,#3434,#3435,#3436,#3437),(#3438,#3439,#3440,#3441,#3442,#3443,#3444,#3445,#3446,#3447),(#3448,#3449,#3450,#3451,#3452,#3453,#3454,#3455,#3456,#3457),(#3458,#3459,#3460,#3461,#3462,#3463,#3464,#3465,#3466,#3467),(#3468,#3469,#3470,#3471,#3472,#3473,#3474,#3475,#3476,#3477),(#3478,#3479,#3480,#3481,#3482,#3483,#3484,#3485,#3486,#3487),(#3488,#3489,#3490,#3491,#3492,#3493,#3494,#3495,#3496,#3497),(#3498,#3499,#3500,#3501,#3502,#3503,#3504,#3505,#3506,#3507),(#3508,#3509,#3510,#3511,#3512,#3513,#3514,#3515,#3516,#3517),(#3518,#3519,#3520,#3521,#3522,#3523,#3524,#3525,#3526,#3527),(#3528,#3529,#3530,#3531,#3532,#3533,#3534,#3535,#3536,#3537),(#3538,#3539,#3540,#3541,#3542,#3543,#3544,#3545,#3546,#3547),(#3548,#3549,#3550,#3551,#3552,#3553,#3554,#3555,#3556,#3557),(#3558,#3559,#3560,#3561,#3562,#3563,#3564,#3565,#3566,#3567)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.000633434,0.001266868,0.001583585,0.001900302,0.002533736,0.002850452,0.003167169,0.003483886,0.003800603,0.00411732,0.004434037,0.004480535),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#3569=ORIENTED_EDGE('',*,*,#844,.F.);
+#3570=ORIENTED_EDGE('',*,*,#1776,.F.);
+#3571=CARTESIAN_POINT('',(20.233154644,-19.224694785,26.666750919));
+#3572=DIRECTION('',(0.453596325,0.891207257,0.));
+#3573=DIRECTION('',(-0.891207257,0.453596325,0.));
+#3574=AXIS2_PLACEMENT_3D('',#3571,#3572,#3573);
+#3575=CIRCLE('',#3574,1.);
+#3576=EDGE_CURVE('',#1617,#678,#3575,.T.);
+#3577=ORIENTED_EDGE('',*,*,#3576,.F.);
+#3578=ORIENTED_EDGE('',*,*,#1635,.F.);
+#3579=EDGE_LOOP('',(#3569,#3570,#3577,#3578));
+#3580=FACE_BOUND('',#3579,.T.);
+#3581=ADVANCED_FACE('',(#3580),#3568,.T.);
+#3582=CARTESIAN_POINT('',(20.,-15.854009142,26.666754669));
+#3583=CARTESIAN_POINT('',(20.000000246,-15.854009142,26.732203266));
+#3584=CARTESIAN_POINT('',(20.006446332,-15.854009142,26.797650221));
+#3585=CARTESIAN_POINT('',(20.031983351,-15.854009142,26.926033488));
+#3586=CARTESIAN_POINT('',(20.051073895,-15.854009142,26.988966578));
+#3587=CARTESIAN_POINT('',(20.10116704,-15.854009142,27.109902126));
+#3588=CARTESIAN_POINT('',(20.132168401,-15.854009142,27.167901593));
+#3589=CARTESIAN_POINT('',(20.204892374,-15.854009142,27.276740711));
+#3590=CARTESIAN_POINT('',(20.246613188,-15.854009142,27.32757767));
+#3591=CARTESIAN_POINT('',(20.339173249,-15.854009142,27.420137731));
+#3592=CARTESIAN_POINT('',(20.390010208,-15.854009142,27.461858545));
+#3593=CARTESIAN_POINT('',(20.498849326,-15.854009142,27.534582518));
+#3594=CARTESIAN_POINT('',(20.556848794,-15.854009142,27.56558388));
+#3595=CARTESIAN_POINT('',(20.677784342,-15.854009142,27.615677024));
+#3596=CARTESIAN_POINT('',(20.740717431,-15.854009142,27.634767568));
+#3597=CARTESIAN_POINT('',(20.869101924,-15.854009142,27.660304831));
+#3598=CARTESIAN_POINT('',(20.934550153,-15.854009142,27.666750919));
+#3599=CARTESIAN_POINT('',(21.,-15.854009142,27.666750919));
+#3600=CARTESIAN_POINT('',(20.000000176,-16.182965825,26.713577443));
+#3601=CARTESIAN_POINT('',(20.003064899,-16.182965836,26.777075112));
+#3602=CARTESIAN_POINT('',(20.012189884,-16.18326062,26.840269569));
+#3603=CARTESIAN_POINT('',(20.042225552,-16.184428447,26.963779687));
+#3604=CARTESIAN_POINT('',(20.063135793,-16.185301472,27.024092617));
+#3605=CARTESIAN_POINT('',(20.115982656,-16.187592268,27.139664144));
+#3606=CARTESIAN_POINT('',(20.147918118,-16.189009983,27.194920239));
+#3607=CARTESIAN_POINT('',(20.221659409,-16.192335703,27.298386823));
+#3608=CARTESIAN_POINT('',(20.263463628,-16.194243627,27.346595075));
+#3609=CARTESIAN_POINT('',(20.355431589,-16.198476466,27.434229106));
+#3610=CARTESIAN_POINT('',(20.405593329,-16.200801277,27.473652992));
+#3611=CARTESIAN_POINT('',(20.51246506,-16.20577857,27.542298122));
+#3612=CARTESIAN_POINT('',(20.569172728,-16.208430928,27.571517882));
+#3613=CARTESIAN_POINT('',(20.68708976,-16.213961399,27.618702193));
+#3614=CARTESIAN_POINT('',(20.748296565,-16.216839375,27.636665725));
+#3615=CARTESIAN_POINT('',(20.873003591,-16.222710492,27.660690347));
+#3616=CARTESIAN_POINT('',(20.936501107,-16.225703488,27.666750919));
+#3617=CARTESIAN_POINT('',(21.,-16.228696557,27.666750919));
+#3618=CARTESIAN_POINT('',(19.980662072,-16.511914398,26.760399046));
+#3619=CARTESIAN_POINT('',(19.986512245,-16.512335683,26.821729186));
+#3620=CARTESIAN_POINT('',(19.998013553,-16.513293168,26.882509115));
+#3621=CARTESIAN_POINT('',(20.031924967,-16.516246239,27.00091523));
+#3622=CARTESIAN_POINT('',(20.054334621,-16.518241783,27.058539089));
+#3623=CARTESIAN_POINT('',(20.109299784,-16.523200617,27.168680097));
+#3624=CARTESIAN_POINT('',(20.141854232,-16.526163806,27.22119514));
+#3625=CARTESIAN_POINT('',(20.216003092,-16.532954022,27.319340234));
+#3626=CARTESIAN_POINT('',(20.257596079,-16.536780911,27.364968408));
+#3627=CARTESIAN_POINT('',(20.348410714,-16.545164698,27.447794919));
+#3628=CARTESIAN_POINT('',(20.397630619,-16.549721426,27.484991674));
+#3629=CARTESIAN_POINT('',(20.502030099,-16.559405781,27.549696065));
+#3630=CARTESIAN_POINT('',(20.557207672,-16.564533212,27.577202464));
+#3631=CARTESIAN_POINT('',(20.67165221,-16.575180099,27.621594901));
+#3632=CARTESIAN_POINT('',(20.730916982,-16.580699339,27.63848009));
+#3633=CARTESIAN_POINT('',(20.851527534,-16.591937402,27.661058315));
+#3634=CARTESIAN_POINT('',(20.912871004,-16.597655997,27.666750919));
+#3635=CARTESIAN_POINT('',(20.974215648,-16.603374708,27.666750919));
+#3636=CARTESIAN_POINT('',(19.904050555,-17.157186227,26.852245176));
+#3637=CARTESIAN_POINT('',(19.914682843,-17.159055722,26.908976703));
+#3638=CARTESIAN_POINT('',(19.930148237,-17.161846147,26.964764423));
+#3639=CARTESIAN_POINT('',(19.970281019,-17.169183952,27.072797143));
+#3640=CARTESIAN_POINT('',(19.994947981,-17.173731251,27.125040485));
+#3641=CARTESIAN_POINT('',(20.052745777,-17.184444538,27.224429848));
+#3642=CARTESIAN_POINT('',(20.085875751,-17.19061036,27.271574408));
+#3643=CARTESIAN_POINT('',(20.159610668,-17.204373457,27.359364859));
+#3644=CARTESIAN_POINT('',(20.200214518,-17.211970521,27.400009461));
+#3645=CARTESIAN_POINT('',(20.287686857,-17.22836557,27.473592159));
+#3646=CARTESIAN_POINT('',(20.334554052,-17.237163304,27.506529176));
+#3647=CARTESIAN_POINT('',(20.433157232,-17.255692844,27.563718071));
+#3648=CARTESIAN_POINT('',(20.484891761,-17.265424364,27.587969111));
+#3649=CARTESIAN_POINT('',(20.591689607,-17.285526381,27.627065532));
+#3650=CARTESIAN_POINT('',(20.646751349,-17.295896569,27.641910341));
+#3651=CARTESIAN_POINT('',(20.758565079,-17.316961502,27.66175318));
+#3652=CARTESIAN_POINT('',(20.815315419,-17.327655925,27.666750919));
+#3653=CARTESIAN_POINT('',(20.872066595,-17.338350512,27.666750919));
+#3654=CARTESIAN_POINT('',(19.846779037,-17.473493527,26.897267432));
+#3655=CARTESIAN_POINT('',(19.85940839,-17.476389318,26.951568496));
+#3656=CARTESIAN_POINT('',(19.876462042,-17.480349457,27.004779038));
+#3657=CARTESIAN_POINT('',(19.918941451,-17.490285906,27.107543159));
+#3658=CARTESIAN_POINT('',(19.944366814,-17.49626212,27.157095346));
+#3659=CARTESIAN_POINT('',(20.002879833,-17.510061343,27.251163997));
+#3660=CARTESIAN_POINT('',(20.035966731,-17.517884168,27.29567925));
+#3661=CARTESIAN_POINT('',(20.108880695,-17.535155454,27.378436683));
+#3662=CARTESIAN_POINT('',(20.148706818,-17.544603687,27.416677798));
+#3663=CARTESIAN_POINT('',(20.233990304,-17.56485905,27.485824155));
+#3664=CARTESIAN_POINT('',(20.279446567,-17.575665911,27.516728508));
+#3665=CARTESIAN_POINT('',(20.37472536,-17.598333693,27.570342514));
+#3666=CARTESIAN_POINT('',(20.424546662,-17.610194314,27.593051478));
+#3667=CARTESIAN_POINT('',(20.527169585,-17.634635234,27.629643623));
+#3668=CARTESIAN_POINT('',(20.579969884,-17.647215211,27.643526334));
+#3669=CARTESIAN_POINT('',(20.687082281,-17.672740289,27.662080101));
+#3670=CARTESIAN_POINT('',(20.741393,-17.685685055,27.666750919));
+#3671=CARTESIAN_POINT('',(20.795704418,-17.698629991,27.666750919));
+#3672=CARTESIAN_POINT('',(19.696499782,-18.081326358,26.98378456));
+#3673=CARTESIAN_POINT('',(19.712216854,-18.086634501,27.033153546));
+#3674=CARTESIAN_POINT('',(19.731577222,-18.093213193,27.081221091));
+#3675=CARTESIAN_POINT('',(19.777113703,-18.108750027,27.173593889));
+#3676=CARTESIAN_POINT('',(19.803289497,-18.117708058,27.217898174));
+#3677=CARTESIAN_POINT('',(19.861820678,-18.1377834,27.301672596));
+#3678=CARTESIAN_POINT('',(19.894175492,-18.148900511,27.341141922));
+#3679=CARTESIAN_POINT('',(19.964280069,-18.173021202,27.414292766));
+#3680=CARTESIAN_POINT('',(20.002029148,-18.186024541,27.447973576));
+#3681=CARTESIAN_POINT('',(20.082007864,-18.213598847,27.508733789));
+#3682=CARTESIAN_POINT('',(20.124236722,-18.228169538,27.535812604));
+#3683=CARTESIAN_POINT('',(20.212152882,-18.258521465,27.582714811));
+#3684=CARTESIAN_POINT('',(20.257839329,-18.274302397,27.60253775));
+#3685=CARTESIAN_POINT('',(20.351565418,-18.306688193,27.634449469));
+#3686=CARTESIAN_POINT('',(20.39960415,-18.323292732,27.646537939));
+#3687=CARTESIAN_POINT('',(20.496873006,-18.356919035,27.662688743));
+#3688=CARTESIAN_POINT('',(20.546102185,-18.373940462,27.666750919));
+#3689=CARTESIAN_POINT('',(20.595331842,-18.39096206,27.666750919));
+#3690=CARTESIAN_POINT('',(19.60349576,-18.372836861,27.025277294));
+#3691=CARTESIAN_POINT('',(19.620303886,-18.379530557,27.072145223));
+#3692=CARTESIAN_POINT('',(19.640383155,-18.387557703,27.11764739));
+#3693=CARTESIAN_POINT('',(19.686630933,-18.406095689,27.204898147));
+#3694=CARTESIAN_POINT('',(19.712799166,-18.416606416,27.24664593));
+#3695=CARTESIAN_POINT('',(19.770633989,-18.439871648,27.325447188));
+#3696=CARTESIAN_POINT('',(19.80230009,-18.452625953,27.362499999));
+#3697=CARTESIAN_POINT('',(19.870416664,-18.48008775,27.431077394));
+#3698=CARTESIAN_POINT('',(19.906866561,-18.494795006,27.4626014));
+#3699=CARTESIAN_POINT('',(19.983729464,-18.525827933,27.519411791));
+#3700=CARTESIAN_POINT('',(20.024141821,-18.542153337,27.544697696));
+#3701=CARTESIAN_POINT('',(20.108019523,-18.576051191,27.588462911));
+#3702=CARTESIAN_POINT('',(20.151484161,-18.593623349,27.606941852));
+#3703=CARTESIAN_POINT('',(20.240487866,-18.629615141,27.636677333));
+#3704=CARTESIAN_POINT('',(20.286026183,-18.648034467,27.647933622));
+#3705=CARTESIAN_POINT('',(20.378152186,-18.685301864,27.662970478));
+#3706=CARTESIAN_POINT('',(20.424739095,-18.704149616,27.666750919));
+#3707=CARTESIAN_POINT('',(20.471326396,-18.722997529,27.666750919));
+#3708=CARTESIAN_POINT('',(19.471904459,-18.702783487,27.072240902));
+#3709=CARTESIAN_POINT('',(19.489471645,-18.711222972,27.116167138));
+#3710=CARTESIAN_POINT('',(19.509897028,-18.72103682,27.158685798));
+#3711=CARTESIAN_POINT('',(19.556041471,-18.743210053,27.240028076));
+#3712=CARTESIAN_POINT('',(19.581760301,-18.755569326,27.278851039));
+#3713=CARTESIAN_POINT('',(19.637957941,-18.782576828,27.351995694));
+#3714=CARTESIAN_POINT('',(19.668436348,-18.797224862,27.38631686));
+#3715=CARTESIAN_POINT('',(19.733520974,-18.828505929,27.449745983));
+#3716=CARTESIAN_POINT('',(19.768126725,-18.845138737,27.478853484));
+#3717=CARTESIAN_POINT('',(19.840748274,-18.880044214,27.531251472));
+#3718=CARTESIAN_POINT('',(19.87876355,-18.898316632,27.554541583));
+#3719=CARTESIAN_POINT('',(19.957415666,-18.93612217,27.594821642));
+#3720=CARTESIAN_POINT('',(19.998051941,-18.955655018,27.6118113));
+#3721=CARTESIAN_POINT('',(20.081103213,-18.995576103,27.63913798));
+#3722=CARTESIAN_POINT('',(20.123517613,-19.015964053,27.649474804));
+#3723=CARTESIAN_POINT('',(20.209245405,-19.05717228,27.663281324));
+#3724=CARTESIAN_POINT('',(20.252558182,-19.077992262,27.666750919));
+#3725=CARTESIAN_POINT('',(20.29587127,-19.098812394,27.666750919));
+#3726=CARTESIAN_POINT('',(19.448714814,-18.758446131,27.080163755));
+#3727=CARTESIAN_POINT('',(19.46639218,-18.767186795,27.123589567));
+#3728=CARTESIAN_POINT('',(19.486858389,-18.777307591,27.165601911));
+#3729=CARTESIAN_POINT('',(19.532951271,-18.800103049,27.245943254));
+#3730=CARTESIAN_POINT('',(19.558577722,-18.8127776,27.284271623));
+#3731=CARTESIAN_POINT('',(19.614467262,-18.840421384,27.356460958));
+#3732=CARTESIAN_POINT('',(19.644729962,-18.855390424,27.390321421));
+#3733=CARTESIAN_POINT('',(19.709273701,-18.887317228,27.452883076));
+#3734=CARTESIAN_POINT('',(19.743554292,-18.904274769,27.481583832));
+#3735=CARTESIAN_POINT('',(19.815433436,-18.939831976,27.533239621));
+#3736=CARTESIAN_POINT('',(19.853031488,-18.958431393,27.556194293));
+#3737=CARTESIAN_POINT('',(19.930777405,-18.996892194,27.595888852));
+#3738=CARTESIAN_POINT('',(19.970924727,-19.016753309,27.612628462));
+#3739=CARTESIAN_POINT('',(20.052948947,-19.057331556,27.63955081));
+#3740=CARTESIAN_POINT('',(20.094825273,-19.078048406,27.649733361));
+#3741=CARTESIAN_POINT('',(20.179451939,-19.119914682,27.663333463));
+#3742=CARTESIAN_POINT('',(20.222201688,-19.141063817,27.666750919));
+#3743=CARTESIAN_POINT('',(20.264951735,-19.162213099,27.666750919));
+#3744=CARTESIAN_POINT('',(19.424861964,-18.813299358,27.087971398));
+#3745=CARTESIAN_POINT('',(19.44263018,-18.822342876,27.13090027));
+#3746=CARTESIAN_POINT('',(19.463119194,-18.832771171,27.17241093));
+#3747=CARTESIAN_POINT('',(19.509127351,-18.856187915,27.251762098));
+#3748=CARTESIAN_POINT('',(19.53464628,-18.869176254,27.289602));
+#3749=CARTESIAN_POINT('',(19.590200361,-18.897451539,27.360848964));
+#3750=CARTESIAN_POINT('',(19.620235137,-18.912738293,27.394255544));
+#3751=CARTESIAN_POINT('',(19.684216342,-18.945302711,27.455963312));
+#3752=CARTESIAN_POINT('',(19.718162339,-18.962580155,27.484264083));
+#3753=CARTESIAN_POINT('',(19.789282672,-18.998778174,27.535190453));
+#3754=CARTESIAN_POINT('',(19.826456527,-19.017698504,27.557815709));
+#3755=CARTESIAN_POINT('',(19.903284283,-19.05680144,27.596935518));
+#3756=CARTESIAN_POINT('',(19.942937662,-19.07698378,27.613429805));
+#3757=CARTESIAN_POINT('',(20.023926245,-19.118204464,27.639955558));
+#3758=CARTESIAN_POINT('',(20.0652609,-19.13924253,27.649986843));
+#3759=CARTESIAN_POINT('',(20.148779962,-19.181751162,27.663384569));
+#3760=CARTESIAN_POINT('',(20.190963802,-19.20322144,27.666750919));
+#3761=CARTESIAN_POINT('',(20.233147928,-19.224691864,27.666750919));
+#3762=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3582,#3583,#3584,#3585,#3586,#3587,#3588,#3589,#3590,#3591,#3592,#3593,#3594,#3595,#3596,#3597,#3598,#3599),(#3600,#3601,#3602,#3603,#3604,#3605,#3606,#3607,#3608,#3609,#3610,#3611,#3612,#3613,#3614,#3615,#3616,#3617),(#3618,#3619,#3620,#3621,#3622,#3623,#3624,#3625,#3626,#3627,#3628,#3629,#3630,#3631,#3632,#3633,#3634,#3635),(#3636,#3637,#3638,#3639,#3640,#3641,#3642,#3643,#3644,#3645,#3646,#3647,#3648,#3649,#3650,#3651,#3652,#3653),(#3654,#3655,#3656,#3657,#3658,#3659,#3660,#3661,#3662,#3663,#3664,#3665,#3666,#3667,#3668,#3669,#3670,#3671),(#3672,#3673,#3674,#3675,#3676,#3677,#3678,#3679,#3680,#3681,#3682,#3683,#3684,#3685,#3686,#3687,#3688,#3689),(#3690,#3691,#3692,#3693,#3694,#3695,#3696,#3697,#3698,#3699,#3700,#3701,#3702,#3703,#3704,#3705,#3706,#3707),(#3708,#3709,#3710,#3711,#3712,#3713,#3714,#3715,#3716,#3717,#3718,#3719,#3720,#3721,#3722,#3723,#3724,#3725),(#3726,#3727,#3728,#3729,#3730,#3731,#3732,#3733,#3734,#3735,#3736,#3737,#3738,#3739,#3740,#3741,#3742,#3743),(#3744,#3745,#3746,#3747,#3748,#3749,#3750,#3751,#3752,#3753,#3754,#3755,#3756,#3757,#3758,#3759,#3760,#3761)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,2,2,2,2,4),(4.71238898,4.908738521,5.105088062,5.301437603,5.341946224),(0.000002387,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1.),.UNSPECIFIED.);
+#3763=ORIENTED_EDGE('',*,*,#3576,.T.);
+#3764=ORIENTED_EDGE('',*,*,#684,.F.);
+#3765=CARTESIAN_POINT('',(21.,-15.854009142,26.666750919));
+#3766=DIRECTION('',(0.,1.,0.));
+#3767=DIRECTION('',(0.,-0.,1.));
+#3768=AXIS2_PLACEMENT_3D('',#3765,#3766,#3767);
+#3769=CIRCLE('',#3768,1.);
+#3770=EDGE_CURVE('',#35,#670,#3769,.T.);
+#3771=ORIENTED_EDGE('',*,*,#3770,.F.);
+#3772=ORIENTED_EDGE('',*,*,#1642,.F.);
+#3773=EDGE_LOOP('',(#3763,#3764,#3771,#3772));
+#3774=FACE_BOUND('',#3773,.T.);
+#3775=ADVANCED_FACE('',(#3774),#3762,.T.);
+#3776=CARTESIAN_POINT('',(21.,0.,26.666750919));
+#3777=DIRECTION('',(0.,1.,0.));
+#3778=DIRECTION('',(0.,-0.,1.));
+#3779=AXIS2_PLACEMENT_3D('',#3776,#3777,#3778);
+#3780=CYLINDRICAL_SURFACE('',#3779,1.);
+#3781=ORIENTED_EDGE('',*,*,#3770,.T.);
+#3782=ORIENTED_EDGE('',*,*,#675,.F.);
+#3783=CARTESIAN_POINT('',(21.,5.485205765,26.666750919));
+#3784=DIRECTION('',(0.,1.,0.));
+#3785=DIRECTION('',(0.,-0.,1.));
+#3786=AXIS2_PLACEMENT_3D('',#3783,#3784,#3785);
+#3787=CIRCLE('',#3786,1.);
+#3788=EDGE_CURVE('',#43,#662,#3787,.T.);
+#3789=ORIENTED_EDGE('',*,*,#3788,.F.);
+#3790=ORIENTED_EDGE('',*,*,#48,.F.);
+#3791=EDGE_LOOP('',(#3781,#3782,#3789,#3790));
+#3792=FACE_BOUND('',#3791,.T.);
+#3793=ADVANCED_FACE('',(#3792),#3780,.T.);
+#3794=CARTESIAN_POINT('',(21.,28.534785562,8.846153846));
+#3795=CARTESIAN_POINT('',(20.869100306,28.534785562,8.846153846));
+#3796=CARTESIAN_POINT('',(20.738252116,28.520914594,8.824130726));
+#3797=CARTESIAN_POINT('',(20.49638102,28.467521443,8.739357713));
+#3798=CARTESIAN_POINT('',(20.38545328,28.428020268,8.676641174));
+#3799=CARTESIAN_POINT('',(20.200333158,28.329362588,8.520001071));
+#3800=CARTESIAN_POINT('',(20.126213612,28.270244902,8.426139137));
+#3801=CARTESIAN_POINT('',(20.026027323,28.141342432,8.221478979));
+#3802=CARTESIAN_POINT('',(20.,28.071608366,8.110761279));
+#3803=CARTESIAN_POINT('',(20.,28.001846852,8.));
+#3804=CARTESIAN_POINT('',(21.,29.057908801,8.516671654));
+#3805=CARTESIAN_POINT('',(20.875140813,29.052852062,8.519856574));
+#3806=CARTESIAN_POINT('',(20.750321281,29.035766894,8.502731664));
+#3807=CARTESIAN_POINT('',(20.517796058,28.979926292,8.430143925));
+#3808=CARTESIAN_POINT('',(20.410164355,28.941188965,8.374703523));
+#3809=CARTESIAN_POINT('',(20.226877483,28.847381921,8.233033264));
+#3810=CARTESIAN_POINT('',(20.151281035,28.792341975,8.146847814));
+#3811=CARTESIAN_POINT('',(20.042568734,28.673481419,7.955490509));
+#3812=CARTESIAN_POINT('',(20.009488406,28.609698247,7.850379136));
+#3813=CARTESIAN_POINT('',(20.,28.54589502,7.74300389));
+#3814=CARTESIAN_POINT('',(20.956795278,29.586215266,8.210931006));
+#3815=CARTESIAN_POINT('',(20.838192196,29.577498185,8.21592274));
+#3816=CARTESIAN_POINT('',(20.719620298,29.558321245,8.202238368));
+#3817=CARTESIAN_POINT('',(20.497257823,29.501455542,8.139193917));
+#3818=CARTESIAN_POINT('',(20.393525767,29.463781871,8.089850202));
+#3819=CARTESIAN_POINT('',(20.213850893,29.374637817,7.961613616));
+#3820=CARTESIAN_POINT('',(20.137955528,29.323190877,7.882754212));
+#3821=CARTESIAN_POINT('',(20.023509229,29.212926405,7.705310781));
+#3822=CARTESIAN_POINT('',(19.984988813,29.154137774,7.606773208));
+#3823=CARTESIAN_POINT('',(19.967596458,29.095333744,7.504526185));
+#3824=CARTESIAN_POINT('',(20.811256778,30.65517547,7.642507021));
+#3825=CARTESIAN_POINT('',(20.705002059,30.640944557,7.649717978));
+#3826=CARTESIAN_POINT('',(20.598765688,30.618965465,7.641351388));
+#3827=CARTESIAN_POINT('',(20.397086594,30.56176695,7.594285486));
+#3828=CARTESIAN_POINT('',(20.30167876,30.526557561,7.555594065));
+#3829=CARTESIAN_POINT('',(20.131402732,30.446492904,7.451776851));
+#3830=CARTESIAN_POINT('',(20.056564175,30.401651467,7.386668707));
+#3831=CARTESIAN_POINT('',(19.935107276,30.306882813,7.236610556));
+#3832=CARTESIAN_POINT('',(19.888510382,30.25697186,7.151686237));
+#3833=CARTESIAN_POINT('',(19.858442583,30.207052357,7.061155477));
+#3834=CARTESIAN_POINT('',(20.708584724,31.195799437,7.379868084));
+#3835=CARTESIAN_POINT('',(20.608440616,31.17972687,7.387473694));
+#3836=CARTESIAN_POINT('',(20.508310491,31.157048345,7.38096643));
+#3837=CARTESIAN_POINT('',(20.317184321,31.1005569,7.340308221));
+#3838=CARTESIAN_POINT('',(20.226214986,31.066751924,7.306162875));
+#3839=CARTESIAN_POINT('',(20.061744928,30.991102597,7.213326395));
+#3840=CARTESIAN_POINT('',(19.988267259,30.949268814,7.154648107));
+#3841=CARTESIAN_POINT('',(19.865531892,30.861384423,7.018084506));
+#3842=CARTESIAN_POINT('',(19.816291516,30.815346057,6.940218135));
+#3843=CARTESIAN_POINT('',(19.781438541,30.769301281,6.856297106));
+#3844=CARTESIAN_POINT('',(20.521266858,32.016886406,7.016591418));
+#3845=CARTESIAN_POINT('',(20.430092476,31.999011065,7.024252793));
+#3846=CARTESIAN_POINT('',(20.338927261,31.975987185,7.019860262));
+#3847=CARTESIAN_POINT('',(20.163641957,31.921421112,6.987303281));
+#3848=CARTESIAN_POINT('',(20.079539498,31.88988442,6.959142083));
+#3849=CARTESIAN_POINT('',(19.924899604,31.820735819,6.881219769));
+#3850=CARTESIAN_POINT('',(19.854377742,31.783130863,6.831466455));
+#3851=CARTESIAN_POINT('',(19.732372151,31.704757298,6.714203979));
+#3852=CARTESIAN_POINT('',(19.68090074,31.663996561,6.646706573));
+#3853=CARTESIAN_POINT('',(19.640950142,31.62323173,6.572941307));
+#3854=CARTESIAN_POINT('',(20.453214441,32.292270914,6.900625772));
+#3855=CARTESIAN_POINT('',(20.364999189,32.27395689,6.908212975));
+#3856=CARTESIAN_POINT('',(20.276791793,32.250937282,6.904409561));
+#3857=CARTESIAN_POINT('',(20.106792516,32.197159913,6.87429583));
+#3858=CARTESIAN_POINT('',(20.025015779,32.16640695,6.847988182));
+#3859=CARTESIAN_POINT('',(19.873842891,32.099404644,6.77477634));
+#3860=CARTESIAN_POINT('',(19.804460218,32.063161269,6.727878644));
+#3861=CARTESIAN_POINT('',(19.683140857,31.987819158,6.616897229));
+#3862=CARTESIAN_POINT('',(19.631215003,31.948727127,6.552823368));
+#3863=CARTESIAN_POINT('',(19.58991083,31.909631618,6.482488102));
+#3864=CARTESIAN_POINT('',(20.307249443,32.846553544,6.678799854));
+#3865=CARTESIAN_POINT('',(20.224889441,32.827638586,6.686111824));
+#3866=CARTESIAN_POINT('',(20.142535107,32.804827137,6.683311608));
+#3867=CARTESIAN_POINT('',(19.983100175,32.752871952,6.657663998));
+#3868=CARTESIAN_POINT('',(19.906030552,32.723731801,6.634818355));
+#3869=CARTESIAN_POINT('',(19.762113368,32.660989411,6.570539247));
+#3870=CARTESIAN_POINT('',(19.695275725,32.627391491,6.529110182));
+#3871=CARTESIAN_POINT('',(19.576117996,32.557888536,6.430314874));
+#3872=CARTESIAN_POINT('',(19.523806142,32.521988278,6.372955403));
+#3873=CARTESIAN_POINT('',(19.480437082,32.486085553,6.309463886));
+#3874=CARTESIAN_POINT('',(20.229158375,33.126016066,6.5727525));
+#3875=CARTESIAN_POINT('',(20.149700213,33.106939189,6.579862676));
+#3876=CARTESIAN_POINT('',(20.070246841,33.08433252,6.577476913));
+#3877=CARTESIAN_POINT('',(19.916100881,33.03341348,6.553855164));
+#3878=CARTESIAN_POINT('',(19.841417585,33.005104182,6.532620594));
+#3879=CARTESIAN_POINT('',(19.701297444,32.944479557,6.472571031));
+#3880=CARTESIAN_POINT('',(19.635869051,32.912167885,6.433759644));
+#3881=CARTESIAN_POINT('',(19.518191386,32.845477679,6.340880324));
+#3882=CARTESIAN_POINT('',(19.465949222,32.811103162,6.286817971));
+#3883=CARTESIAN_POINT('',(19.421868781,32.776726576,6.22674695));
+#3884=CARTESIAN_POINT('',(19.983849792,33.963031429,6.27201984));
+#3885=CARTESIAN_POINT('',(19.912939043,33.94382396,6.278408898));
+#3886=CARTESIAN_POINT('',(19.842030926,33.922076185,6.277061324));
+#3887=CARTESIAN_POINT('',(19.703601,33.874546108,6.258952639));
+#3888=CARTESIAN_POINT('',(19.63608434,33.848765595,6.242192168));
+#3889=CARTESIAN_POINT('',(19.50767197,33.794405874,6.194045453));
+#3890=CARTESIAN_POINT('',(19.446781066,33.765828687,6.162660936));
+#3891=CARTESIAN_POINT('',(19.334547698,33.707240777,6.086747219));
+#3892=CARTESIAN_POINT('',(19.283209482,33.677232219,6.04222076));
+#3893=CARTESIAN_POINT('',(19.237887344,33.647222554,5.992175475));
+#3894=CARTESIAN_POINT('',(19.805364252,34.520747681,6.093983237));
+#3895=CARTESIAN_POINT('',(19.739957806,34.501919328,6.099741604));
+#3896=CARTESIAN_POINT('',(19.674553176,34.481066321,6.098821072));
+#3897=CARTESIAN_POINT('',(19.5464277,34.436169108,6.083658628));
+#3898=CARTESIAN_POINT('',(19.483710413,34.412126154,6.069417129));
+#3899=CARTESIAN_POINT('',(19.363538778,34.361837985,6.02819116));
+#3900=CARTESIAN_POINT('',(19.306087775,34.335594166,6.001207815));
+#3901=CARTESIAN_POINT('',(19.198815495,34.281981978,5.935596044));
+#3902=CARTESIAN_POINT('',(19.148997216,34.254615096,5.896969411));
+#3903=CARTESIAN_POINT('',(19.104023183,34.227247455,5.85330693));
+#3904=CARTESIAN_POINT('',(19.237621494,36.196119866,5.62200274));
+#3905=CARTESIAN_POINT('',(19.188284303,36.179392295,5.625806973));
+#3906=CARTESIAN_POINT('',(19.13894729,36.161867901,5.625762453));
+#3907=CARTESIAN_POINT('',(19.041300731,36.125609365,5.617969928));
+#3908=CARTESIAN_POINT('',(18.992991549,36.106875384,5.610221905));
+#3909=CARTESIAN_POINT('',(18.898417716,36.068594357,5.587151802));
+#3910=CARTESIAN_POINT('',(18.852153456,36.049047453,5.571829704));
+#3911=CARTESIAN_POINT('',(18.762664501,36.009545143,5.533876901));
+#3912=CARTESIAN_POINT('',(18.719440238,35.989589867,5.511246186));
+#3913=CARTESIAN_POINT('',(18.678216116,35.969634528,5.485162143));
+#3914=CARTESIAN_POINT('',(18.816548763,37.316053517,5.389695945));
+#3915=CARTESIAN_POINT('',(18.777336194,37.301994562,5.392136994));
+#3916=CARTESIAN_POINT('',(18.738123726,37.287534718,5.392159652));
+#3917=CARTESIAN_POINT('',(18.66021585,37.258005185,5.387367767));
+#3918=CARTESIAN_POINT('',(18.621520644,37.242935574,5.382553234));
+#3919=CARTESIAN_POINT('',(18.545158488,37.212385747,5.368146198));
+#3920=CARTESIAN_POINT('',(18.507491737,37.19690561,5.358553728));
+#3921=CARTESIAN_POINT('',(18.433685618,37.165738782,5.334709057));
+#3922=CARTESIAN_POINT('',(18.397546444,37.150052172,5.32045691));
+#3923=CARTESIAN_POINT('',(18.362411557,37.134365521,5.303962851));
+#3924=CARTESIAN_POINT('',(18.153062445,39.009417849,5.15631272));
+#3925=CARTESIAN_POINT('',(18.128698366,39.000190483,5.157332752));
+#3926=CARTESIAN_POINT('',(18.104334294,38.990862624,5.157378305));
+#3927=CARTESIAN_POINT('',(18.055734634,38.972055647,5.15552016));
+#3928=CARTESIAN_POINT('',(18.03149906,38.962576535,5.153616464));
+#3929=CARTESIAN_POINT('',(17.98328452,38.943517226,5.147868149));
+#3930=CARTESIAN_POINT('',(17.959305567,38.933937036,5.144023532));
+#3931=CARTESIAN_POINT('',(17.911731643,38.914726039,5.134410322));
+#3932=CARTESIAN_POINT('',(17.888136684,38.905095237,5.12864173));
+#3933=CARTESIAN_POINT('',(17.864796834,38.895464433,5.121923933));
+#3934=CARTESIAN_POINT('',(17.926417452,39.57608907,5.097837849));
+#3935=CARTESIAN_POINT('',(17.906945861,39.568616443,5.098480392));
+#3936=CARTESIAN_POINT('',(17.887474273,39.561093493,5.098512531));
+#3937=CARTESIAN_POINT('',(17.848595437,39.545971845,5.097355903));
+#3938=CARTESIAN_POINT('',(17.829188194,39.538373149,5.096167135));
+#3939=CARTESIAN_POINT('',(17.790502206,39.523125134,5.092572356));
+#3940=CARTESIAN_POINT('',(17.771223466,39.515475816,5.090166346));
+#3941=CARTESIAN_POINT('',(17.732858261,39.500151831,5.084144508));
+#3942=CARTESIAN_POINT('',(17.713771803,39.492477166,5.08052868));
+#3943=CARTESIAN_POINT('',(17.694813089,39.4848025,5.076313522));
+#3944=CARTESIAN_POINT('',(17.581295792,40.430462315,5.039172665));
+#3945=CARTESIAN_POINT('',(17.569142638,40.425736622,5.039432434));
+#3946=CARTESIAN_POINT('',(17.556989485,40.420998335,5.039447529));
+#3947=CARTESIAN_POINT('',(17.532699246,40.411502851,5.038988352));
+#3948=CARTESIAN_POINT('',(17.520562161,40.406745655,5.03851408));
+#3949=CARTESIAN_POINT('',(17.496320112,40.397218649,5.037076693));
+#3950=CARTESIAN_POINT('',(17.48421515,40.39244884,5.036113577));
+#3951=CARTESIAN_POINT('',(17.460053381,40.382902912,5.033699564));
+#3952=CARTESIAN_POINT('',(17.447996575,40.378126794,5.032248667));
+#3953=CARTESIAN_POINT('',(17.435971844,40.373350675,5.030554679));
+#3954=CARTESIAN_POINT('',(17.465323372,40.716151051,5.024467961));
+#3955=CARTESIAN_POINT('',(17.455607748,40.712360828,5.024630477));
+#3956=CARTESIAN_POINT('',(17.445892124,40.708564316,5.024640136));
+#3957=CARTESIAN_POINT('',(17.426468899,40.700961847,5.024353732));
+#3958=CARTESIAN_POINT('',(17.416761299,40.697155892,5.024057669));
+#3959=CARTESIAN_POINT('',(17.397362141,40.689537682,5.02316005));
+#3960=CARTESIAN_POINT('',(17.387670584,40.685725427,5.022558493));
+#3961=CARTESIAN_POINT('',(17.368311517,40.678097767,5.021050351));
+#3962=CARTESIAN_POINT('',(17.358644009,40.674282362,5.020143765));
+#3963=CARTESIAN_POINT('',(17.348992519,40.670466956,5.019085013));
+#3964=CARTESIAN_POINT('',(17.232976357,41.287123513,5.0048923));
+#3965=CARTESIAN_POINT('',(17.228122687,41.285219743,5.004925002));
+#3966=CARTESIAN_POINT('',(17.223269017,41.283315973,5.004927117));
+#3967=CARTESIAN_POINT('',(17.213561675,41.279508437,5.004870176));
+#3968=CARTESIAN_POINT('',(17.208708002,41.27760467,5.00481112));
+#3969=CARTESIAN_POINT('',(17.199000655,41.273797139,5.004631802));
+#3970=CARTESIAN_POINT('',(17.194146979,41.271893375,5.004511541));
+#3971=CARTESIAN_POINT('',(17.184439627,41.268085849,5.004209747));
+#3972=CARTESIAN_POINT('',(17.179585951,41.266182087,5.004028214));
+#3973=CARTESIAN_POINT('',(17.174732277,41.264278325,5.003815996));
+#3974=CARTESIAN_POINT('',(17.116508227,41.572638698,5.));
+#3975=CARTESIAN_POINT('',(17.116508227,41.572638698,5.));
+#3976=CARTESIAN_POINT('',(17.109226495,41.569782568,5.));
+#3977=CARTESIAN_POINT('',(17.109226495,41.569782568,5.));
+#3978=CARTESIAN_POINT('',(17.101944762,41.566926438,5.));
+#3979=CARTESIAN_POINT('',(17.101944762,41.566926438,5.));
+#3980=CARTESIAN_POINT('',(17.094663029,41.564070309,5.));
+#3981=CARTESIAN_POINT('',(17.094663029,41.564070309,5.));
+#3982=CARTESIAN_POINT('',(17.087381297,41.561214179,5.));
+#3983=CARTESIAN_POINT('',(17.087381297,41.561214179,5.));
+#3984=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3985=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3986=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3987=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3988=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3989=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3990=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3991=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3992=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3993=CARTESIAN_POINT('',(17.,41.858253313,5.));
+#3994=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#3794,#3795,#3796,#3797,#3798,#3799,#3800,#3801,#3802,#3803),(#3804,#3805,#3806,#3807,#3808,#3809,#3810,#3811,#3812,#3813),(#3814,#3815,#3816,#3817,#3818,#3819,#3820,#3821,#3822,#3823),(#3824,#3825,#3826,#3827,#3828,#3829,#3830,#3831,#3832,#3833),(#3834,#3835,#3836,#3837,#3838,#3839,#3840,#3841,#3842,#3843),(#3844,#3845,#3846,#3847,#3848,#3849,#3850,#3851,#3852,#3853),(#3854,#3855,#3856,#3857,#3858,#3859,#3860,#3861,#3862,#3863),(#3864,#3865,#3866,#3867,#3868,#3869,#3870,#3871,#3872,#3873),(#3874,#3875,#3876,#3877,#3878,#3879,#3880,#3881,#3882,#3883),(#3884,#3885,#3886,#3887,#3888,#3889,#3890,#3891,#3892,#3893),(#3894,#3895,#3896,#3897,#3898,#3899,#3900,#3901,#3902,#3903),(#3904,#3905,#3906,#3907,#3908,#3909,#3910,#3911,#3912,#3913),(#3914,#3915,#3916,#3917,#3918,#3919,#3920,#3921,#3922,#3923),(#3924,#3925,#3926,#3927,#3928,#3929,#3930,#3931,#3932,#3933),(#3934,#3935,#3936,#3937,#3938,#3939,#3940,#3941,#3942,#3943),(#3944,#3945,#3946,#3947,#3948,#3949,#3950,#3951,#3952,#3953),(#3954,#3955,#3956,#3957,#3958,#3959,#3960,#3961,#3962,#3963),(#3964,#3965,#3966,#3967,#3968,#3969,#3970,#3971,#3972,#3973),(#3974,#3975,#3976,#3977,#3978,#3979,#3980,#3981,#3982,#3983),(#3984,#3985,#3986,#3987,#3988,#3989,#3990,#3991,#3992,#3993)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,2,2,2,2,2,4),(4,2,2,2,4),(0.,0.001899885,0.003799771,0.004749714,0.005699656,0.007599542,0.011399313,0.013299198,0.014249141,0.015199084),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#3995=ORIENTED_EDGE('',*,*,#1544,.F.);
+#3996=ORIENTED_EDGE('',*,*,#1597,.F.);
+#3997=CARTESIAN_POINT('',(21.,28.001846852,8.));
+#3998=DIRECTION('',(0.,-0.846153846,0.53293871));
+#3999=DIRECTION('',(-0.,-0.53293871,-0.846153846));
+#4000=AXIS2_PLACEMENT_3D('',#3997,#3998,#3999);
+#4001=CIRCLE('',#4000,1.);
+#4002=EDGE_CURVE('',#1517,#68,#4001,.T.);
+#4003=ORIENTED_EDGE('',*,*,#4002,.F.);
+#4004=EDGE_LOOP('',(#3995,#3996,#4003));
+#4005=FACE_BOUND('',#4004,.T.);
+#4006=ADVANCED_FACE('',(#4005),#3994,.T.);
+#4007=CARTESIAN_POINT('',(21.,5.485205765,17.666750919));
+#4008=DIRECTION('',(1.,0.,0.));
+#4009=DIRECTION('',(0.,0.,-1.));
+#4010=AXIS2_PLACEMENT_3D('',#4007,#4008,#4009);
+#4011=TOROIDAL_SURFACE('',#4010,9.,1.);
+#4012=ORIENTED_EDGE('',*,*,#3788,.T.);
+#4013=ORIENTED_EDGE('',*,*,#1444,.F.);
+#4014=CARTESIAN_POINT('',(21.,12.062407326,23.810074094));
+#4015=DIRECTION('',(0.,0.682591464,-0.730800173));
+#4016=DIRECTION('',(0.,0.730800173,0.682591464));
+#4017=AXIS2_PLACEMENT_3D('',#4014,#4015,#4016);
+#4018=CIRCLE('',#4017,1.);
+#4019=EDGE_CURVE('',#51,#719,#4018,.T.);
+#4020=ORIENTED_EDGE('',*,*,#4019,.F.);
+#4021=ORIENTED_EDGE('',*,*,#57,.F.);
+#4022=EDGE_LOOP('',(#4012,#4013,#4020,#4021));
+#4023=FACE_BOUND('',#4022,.T.);
+#4024=ADVANCED_FACE('',(#4023),#4011,.T.);
+#4025=CARTESIAN_POINT('',(21.,41.858253313,30.));
+#4026=DIRECTION('',(1.,0.,0.));
+#4027=DIRECTION('',(0.,0.,-1.));
+#4028=AXIS2_PLACEMENT_3D('',#4025,#4026,#4027);
+#4029=TOROIDAL_SURFACE('',#4028,26.,1.);
+#4030=ORIENTED_EDGE('',*,*,#4002,.T.);
+#4031=ORIENTED_EDGE('',*,*,#74,.F.);
+#4032=CARTESIAN_POINT('',(21.,22.857448803,12.25262194));
+#4033=DIRECTION('',(0.,-0.682591464,0.730800173));
+#4034=DIRECTION('',(0.,-0.730800173,-0.682591464));
+#4035=AXIS2_PLACEMENT_3D('',#4032,#4033,#4034);
+#4036=CIRCLE('',#4035,1.);
+#4037=EDGE_CURVE('',#711,#60,#4036,.T.);
+#4038=ORIENTED_EDGE('',*,*,#4037,.F.);
+#4039=ORIENTED_EDGE('',*,*,#1551,.F.);
+#4040=EDGE_LOOP('',(#4030,#4031,#4038,#4039));
+#4041=FACE_BOUND('',#4040,.T.);
+#4042=ADVANCED_FACE('',(#4041),#4029,.T.);
+#4043=CARTESIAN_POINT('',(21.,18.319525326,17.111040834));
+#4044=DIRECTION('',(0.,0.682591464,-0.730800173));
+#4045=DIRECTION('',(0.,0.730800173,0.682591464));
+#4046=AXIS2_PLACEMENT_3D('',#4043,#4044,#4045);
+#4047=CYLINDRICAL_SURFACE('',#4046,1.);
+#4048=ORIENTED_EDGE('',*,*,#4019,.T.);
+#4049=ORIENTED_EDGE('',*,*,#724,.F.);
+#4050=ORIENTED_EDGE('',*,*,#4037,.T.);
+#4051=ORIENTED_EDGE('',*,*,#65,.F.);
+#4052=EDGE_LOOP('',(#4048,#4049,#4050,#4051));
+#4053=FACE_BOUND('',#4052,.T.);
+#4054=ADVANCED_FACE('',(#4053),#4047,.T.);
+#4055=CARTESIAN_POINT('',(0.,-31.066987298,41.17820323));
+#4056=DIRECTION('',(-1.,0.,0.));
+#4057=DIRECTION('',(0.,0.,1.));
+#4058=AXIS2_PLACEMENT_3D('',#4055,#4056,#4057);
+#4059=CYLINDRICAL_SURFACE('',#4058,2.);
+#4060=ORIENTED_EDGE('',*,*,#1887,.F.);
+#4061=ORIENTED_EDGE('',*,*,#2042,.T.);
+#4062=ORIENTED_EDGE('',*,*,#1279,.F.);
+#4063=ORIENTED_EDGE('',*,*,#1870,.T.);
+#4064=EDGE_LOOP('',(#4060,#4061,#4062,#4063));
+#4065=FACE_BOUND('',#4064,.T.);
+#4066=ADVANCED_FACE('',(#4065),#4059,.T.);
+#4067=CARTESIAN_POINT('',(-34.586172651,-21.134996607,27.975349798));
+#4068=CARTESIAN_POINT('',(-34.389722684,-21.156940143,28.013342857));
+#4069=CARTESIAN_POINT('',(-34.193338708,-21.14559702,28.070541329));
+#4070=CARTESIAN_POINT('',(-33.828092307,-21.057918083,28.215371134));
+#4071=CARTESIAN_POINT('',(-33.659352573,-20.981611714,28.302953805));
+#4072=CARTESIAN_POINT('',(-33.373174014,-20.774706697,28.496238082));
+#4073=CARTESIAN_POINT('',(-33.25583132,-20.644177551,28.601874743));
+#4074=CARTESIAN_POINT('',(-33.089004639,-20.347170402,28.816401841));
+#4075=CARTESIAN_POINT('',(-33.03957669,-20.180792173,28.925220191));
+#4076=CARTESIAN_POINT('',(-33.027580804,-20.008141571,29.028003658));
+#4077=CARTESIAN_POINT('',(-34.557788376,-21.103214243,27.920354328));
+#4078=CARTESIAN_POINT('',(-34.362361241,-21.123290557,27.958602977));
+#4079=CARTESIAN_POINT('',(-34.166998244,-21.109703221,28.014511995));
+#4080=CARTESIAN_POINT('',(-33.80334002,-21.017077636,28.153942443));
+#4081=CARTESIAN_POINT('',(-33.635164144,-20.938069823,28.237418141));
+#4082=CARTESIAN_POINT('',(-33.349309855,-20.725563244,28.420384455));
+#4083=CARTESIAN_POINT('',(-33.231725266,-20.592134272,28.519815082));
+#4084=CARTESIAN_POINT('',(-33.0634567,-20.289329489,28.720867874));
+#4085=CARTESIAN_POINT('',(-33.012827964,-20.120053116,28.822424137));
+#4086=CARTESIAN_POINT('',(-32.999196529,-19.944576843,28.918012718));
+#4087=CARTESIAN_POINT('',(-34.529876866,-21.074696629,27.863474144));
+#4088=CARTESIAN_POINT('',(-34.335436069,-21.092883705,27.901772378));
+#4089=CARTESIAN_POINT('',(-34.141057653,-21.077125344,27.956191529));
+#4090=CARTESIAN_POINT('',(-33.778932118,-20.979869809,28.089852871));
+#4091=CARTESIAN_POINT('',(-33.611301179,-20.898403869,28.169052218));
+#4092=CARTESIAN_POINT('',(-33.325762488,-20.680908625,28.341394176));
+#4093=CARTESIAN_POINT('',(-33.207946351,-20.544949139,28.434481564));
+#4094=CARTESIAN_POINT('',(-33.038287738,-20.237150797,28.621804112));
+#4095=CARTESIAN_POINT('',(-32.986499709,-20.065410733,28.715979264));
+#4096=CARTESIAN_POINT('',(-32.971285019,-19.887541615,28.804252349));
+#4097=CARTESIAN_POINT('',(-34.412845514,-20.967270888,27.612541738));
+#4098=CARTESIAN_POINT('',(-34.222466004,-20.977456215,27.650129976));
+#4099=CARTESIAN_POINT('',(-34.032141767,-20.952869149,27.697305538));
+#4100=CARTESIAN_POINT('',(-33.676331596,-20.837379759,27.804725448));
+#4101=CARTESIAN_POINT('',(-33.510948988,-20.746511333,27.864939032));
+#4102=CARTESIAN_POINT('',(-33.226720733,-20.510375549,27.990616627));
+#4103=CARTESIAN_POINT('',(-33.107957693,-20.365177171,28.056044928));
+#4104=CARTESIAN_POINT('',(-32.932577033,-20.039430484,28.18367829));
+#4105=CARTESIAN_POINT('',(-32.8760105,-19.858977193,28.245847304));
+#4106=CARTESIAN_POINT('',(-32.854253667,-19.672690133,28.302387537));
+#4107=CARTESIAN_POINT('',(-34.330479618,-20.923159782,27.403690578));
+#4108=CARTESIAN_POINT('',(-34.142771603,-20.927555185,27.438424574));
+#4109=CARTESIAN_POINT('',(-33.95511449,-20.897499762,27.4779395));
+#4110=CARTESIAN_POINT('',(-33.603469886,-20.772274214,27.561598182));
+#4111=CARTESIAN_POINT('',(-33.439577763,-20.677138129,27.605719621));
+#4112=CARTESIAN_POINT('',(-33.15623947,-20.433774564,27.693062341));
+#4113=CARTESIAN_POINT('',(-33.036870173,-20.28561312,27.736260507));
+#4114=CARTESIAN_POINT('',(-32.857729498,-19.954940764,27.8163619));
+#4115=CARTESIAN_POINT('',(-32.798006777,-19.772519531,27.853244103));
+#4116=CARTESIAN_POINT('',(-32.771887771,-19.58446792,27.884685218));
+#4117=CARTESIAN_POINT('',(-34.193024507,-20.918217261,26.984840718));
+#4118=CARTESIAN_POINT('',(-34.009620168,-20.914540326,27.010992725));
+#4119=CARTESIAN_POINT('',(-33.826259936,-20.878344201,27.033138474));
+#4120=CARTESIAN_POINT('',(-33.48133524,-20.745211323,27.06682601));
+#4121=CARTESIAN_POINT('',(-33.319853736,-20.648306672,27.078360074));
+#4122=CARTESIAN_POINT('',(-33.037972277,-20.405300511,27.089501485));
+#4123=CARTESIAN_POINT('',(-32.91764015,-20.259257483,27.089106736));
+#4124=CARTESIAN_POINT('',(-32.732445729,-19.935383546,27.076511559));
+#4125=CARTESIAN_POINT('',(-32.667628051,-19.757630529,27.064314875));
+#4126=CARTESIAN_POINT('',(-32.63443266,-19.574582878,27.046985498));
+#4127=CARTESIAN_POINT('',(-34.137989374,-20.957387791,26.775006817));
+#4128=CARTESIAN_POINT('',(-33.956219738,-20.951452205,26.795478057));
+#4129=CARTESIAN_POINT('',(-33.774491775,-20.914598074,26.807953451));
+#4130=CARTESIAN_POINT('',(-33.432125127,-20.783309337,26.815487797));
+#4131=CARTESIAN_POINT('',(-33.271564935,-20.688904778,26.810545207));
+#4132=CARTESIAN_POINT('',(-32.990250629,-20.453477712,26.783840928));
+#4133=CARTESIAN_POINT('',(-32.869561018,-20.312509081,26.762085626));
+#4134=CARTESIAN_POINT('',(-32.682069219,-20.000341403,26.704321076));
+#4135=CARTESIAN_POINT('',(-32.615310035,-19.829213795,26.668325386));
+#4136=CARTESIAN_POINT('',(-32.579397528,-19.652923938,26.627317695));
+#4137=CARTESIAN_POINT('',(-34.063599204,-21.113108399,26.386148583));
+#4138=CARTESIAN_POINT('',(-33.884011534,-21.107115335,26.395465009));
+#4139=CARTESIAN_POINT('',(-33.704462332,-21.074227598,26.389617966));
+#4140=CARTESIAN_POINT('',(-33.365511825,-20.958335751,26.348268054));
+#4141=CARTESIAN_POINT('',(-33.206183125,-20.875356411,26.312774226));
+#4142=CARTESIAN_POINT('',(-32.925630109,-20.668596864,26.216145986));
+#4143=CARTESIAN_POINT('',(-32.804465896,-20.544860845,26.155032538));
+#4144=CARTESIAN_POINT('',(-32.61390829,-20.270493221,26.014076714));
+#4145=CARTESIAN_POINT('',(-32.544555734,-20.119920256,25.93426485));
+#4146=CARTESIAN_POINT('',(-32.505007357,-19.964365154,25.849601228));
+#4147=CARTESIAN_POINT('',(-34.044273436,-21.229597207,26.207277249));
+#4148=CARTESIAN_POINT('',(-33.865234219,-21.225797557,26.211167644));
+#4149=CARTESIAN_POINT('',(-33.686232696,-21.197526045,26.196705103));
+#4150=CARTESIAN_POINT('',(-33.34814205,-21.095172354,26.132676895));
+#4151=CARTESIAN_POINT('',(-33.189124105,-21.021111725,26.083124708));
+#4152=CARTESIAN_POINT('',(-32.908765398,-20.835430323,25.954435559));
+#4153=CARTESIAN_POINT('',(-32.78748366,-20.723848642,25.87532569));
+#4154=CARTESIAN_POINT('',(-32.596155901,-20.475568844,25.696342347));
+#4155=CARTESIAN_POINT('',(-32.52615016,-20.338922996,25.596506555));
+#4156=CARTESIAN_POINT('',(-32.485681589,-20.197342772,25.49185856));
+#4157=CARTESIAN_POINT('',(-34.044273436,-21.37593555,26.057444016));
+#4158=CARTESIAN_POINT('',(-33.865234219,-21.37593555,26.057444016));
+#4159=CARTESIAN_POINT('',(-33.686232696,-21.354236974,26.036251563));
+#4160=CARTESIAN_POINT('',(-33.34814205,-21.269847311,25.953830306));
+#4161=CARTESIAN_POINT('',(-33.189124105,-21.207173991,25.892618854));
+#4162=CARTESIAN_POINT('',(-32.908765398,-21.047815856,25.73697778));
+#4163=CARTESIAN_POINT('',(-32.78748366,-20.95116459,25.642580924));
+#4164=CARTESIAN_POINT('',(-32.596155901,-20.73462859,25.431095669));
+#4165=CARTESIAN_POINT('',(-32.52615016,-20.614789443,25.314051794));
+#4166=CARTESIAN_POINT('',(-32.485681589,-20.490019458,25.192192094));
+#4167=B_SPLINE_SURFACE_WITH_KNOTS('',3,3,((#4067,#4068,#4069,#4070,#4071,#4072,#4073,#4074,#4075,#4076),(#4077,#4078,#4079,#4080,#4081,#4082,#4083,#4084,#4085,#4086),(#4087,#4088,#4089,#4090,#4091,#4092,#4093,#4094,#4095,#4096),(#4097,#4098,#4099,#4100,#4101,#4102,#4103,#4104,#4105,#4106),(#4107,#4108,#4109,#4110,#4111,#4112,#4113,#4114,#4115,#4116),(#4117,#4118,#4119,#4120,#4121,#4122,#4123,#4124,#4125,#4126),(#4127,#4128,#4129,#4130,#4131,#4132,#4133,#4134,#4135,#4136),(#4137,#4138,#4139,#4140,#4141,#4142,#4143,#4144,#4145,#4146),(#4147,#4148,#4149,#4150,#4151,#4152,#4153,#4154,#4155,#4156),(#4157,#4158,#4159,#4160,#4161,#4162,#4163,#4164,#4165,#4166)),.UNSPECIFIED.,.F.,.F.,.U.,(4,2,2,2,4),(4,2,2,2,4),(4.985986455,5.105088062,5.497787144,5.890486225,6.283185307),(0.,0.25,0.5,0.75,1.),.UNSPECIFIED.);
+#4168=ORIENTED_EDGE('',*,*,#2205,.T.);
+#4169=ORIENTED_EDGE('',*,*,#2122,.T.);
+#4170=ORIENTED_EDGE('',*,*,#765,.F.);
+#4171=ORIENTED_EDGE('',*,*,#951,.F.);
+#4172=ORIENTED_EDGE('',*,*,#1352,.F.);
+#4173=EDGE_LOOP('',(#4168,#4169,#4170,#4171,#4172));
+#4174=FACE_BOUND('',#4173,.T.);
+#4175=ADVANCED_FACE('',(#4174),#4167,.F.);
+#4176=CLOSED_SHELL('',(#93,#160,#254,#354,#454,#516,#547,#564,#581,#613,#653,#702,#742,#917,#955,#1004,#1044,#1067,#1092,#1117,#1196,#1227,#1258,#1289,#1306,#1357,
+#1384,#1408,#1432,#1456,#1510,#1564,#1609,#1655,#1700,#1746,#1788,#1830,#1848,#1875,#1900,#1914,#2054,#2072,#2090,#2107,#2134,#2152,#2212,#2231,#2249,
+#2267,#2285,#2303,#2321,#2339,#2356,#2374,#2392,#2409,#2427,#2445,#2463,#2481,#2499,#2512,#2530,#2548,#2560,#2834,#3028,#3046,#3064,#3277,#3295,#3307,
+#3581,#3775,#3793,#4006,#4024,#4042,#4054,#4066,#4175));
+#4177=MANIFOLD_SOLID_BREP('\X2\5B9E4F53\X0\ 01',#4176);
+#4178=COLOUR_RGB('',0.494117647,0.494117647,0.525490224);
+#4179=FILL_AREA_STYLE_COLOUR('',#4178);
+#4180=FILL_AREA_STYLE('',(#4179));
+#4181=SURFACE_STYLE_FILL_AREA(#4180);
+#4182=SURFACE_SIDE_STYLE('',(#4181));
+#4183=SURFACE_STYLE_USAGE(.BOTH.,#4182);
+#4184=PRESENTATION_STYLE_ASSIGNMENT((#4183));
+#26=STYLED_ITEM('',(#4184),#4177);
+#16=SHAPE_REPRESENTATION('root',(#15),#10);
+#17=ADVANCED_BREP_SHAPE_REPRESENTATION('root',(#4177),#10);
+#4192=SHAPE_REPRESENTATION_RELATIONSHIP('','',#16,#17);
+#4193=APPLICATION_CONTEXT('data for automotive mechanical design processes');
+#4194=APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',1994,#4193);
+#4195=PRODUCT_CONTEXT('',#4193,'mechanical');
+#4196=PRODUCT_DEFINITION_CONTEXT('part definition',#4193,'design');
+#24=PRODUCT('root','root','',(#4195));
+#4197=PRODUCT_RELATED_PRODUCT_CATEGORY('part','',(#24));
+#4198=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('','',#24,.NOT_KNOWN.);
+#25=PRODUCT_DEFINITION('design','',#4198,#4196);
+#23=PRODUCT_DEFINITION_SHAPE('','',#25);
+#4199=SHAPE_DEFINITION_REPRESENTATION(#23,#16);
+#11=DRAUGHTING_MODEL('',(),#10);
+#1=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#26),#10);
+ENDSEC;
+END-ISO-10303-21;
diff --git a/images/go1_camMount_30Down.png b/images/go1_camMount_30Down.png
new file mode 100644
index 0000000..ddc53a8
Binary files /dev/null and b/images/go1_camMount_30Down.png differ
diff --git a/onboard_script/a1_real.py b/onboard_script/a1_real.py
new file mode 100644
index 0000000..36e8274
--- /dev/null
+++ b/onboard_script/a1_real.py
@@ -0,0 +1,489 @@
+import numpy as np
+import torch
+import torch.nn.functional as F
+from torch.autograd import Variable
+import json
+import os
+import os.path as osp
+from collections import OrderedDict
+from typing import Tuple
+
+import rospy
+from unitree_legged_msgs.msg import LowState
+from unitree_legged_msgs.msg import LegsCmd
+from unitree_legged_msgs.msg import Float32MultiArrayStamped
+from std_msgs.msg import Float32MultiArray
+from geometry_msgs.msg import Twist, Pose
+from nav_msgs.msg import Odometry
+from sensor_msgs.msg import Image
+
+import ros_numpy
+
+@torch.no_grad()
+def resize2d(img, size):
+ return (F.adaptive_avg_pool2d(Variable(img), size)).data
+
+@torch.jit.script
+def quat_rotate_inverse(q, v):
+ shape = q.shape
+ q_w = q[:, -1]
+ q_vec = q[:, :3]
+ a = v * (2.0 * q_w ** 2 - 1.0).unsqueeze(-1)
+ b = torch.cross(q_vec, v, dim=-1) * q_w.unsqueeze(-1) * 2.0
+ c = q_vec * \
+ torch.bmm(q_vec.view(shape[0], 1, 3), v.view(
+ shape[0], 3, 1)).squeeze(-1) * 2.0
+ return a - b + c
+
+class UnitreeA1Real:
+ """ This is the handler that works for ROS 1 on unitree. """
+ def __init__(self,
+ robot_namespace= "a112138",
+ low_state_topic= "/low_state",
+ legs_cmd_topic= "/legs_cmd",
+ forward_depth_topic = "/camera/depth/image_rect_raw",
+ forward_depth_embedding_dims = None,
+ odom_topic= "/odom/filtered",
+ lin_vel_deadband= 0.1,
+ ang_vel_deadband= 0.1,
+ move_by_wireless_remote= False, # if True, command will not listen to move_cmd_subscriber, but wireless remote.
+ cfg= dict(),
+ extra_cfg= dict(),
+ model_device= torch.device("cpu"),
+ ):
+ """
+ NOTE:
+ * Must call start_ros() before using this class's get_obs() and send_action()
+ * Joint order of simulation and of real A1 protocol are different, see dof_names
+ * We store all joints values in the order of simulation in this class
+ Args:
+ forward_depth_embedding_dims: If a real number, the obs will not be built as a normal env.
+ The segment of obs will be subsituted by the embedding of forward depth image from the
+ ROS topic.
+ cfg: same config from a1_config but a dict object.
+ extra_cfg: some other configs that is hard to load from file.
+ """
+ self.model_device = model_device
+ self.num_envs = 1
+ self.robot_namespace = robot_namespace
+ self.low_state_topic = low_state_topic
+ self.legs_cmd_topic = legs_cmd_topic
+ self.forward_depth_topic = forward_depth_topic
+ self.forward_depth_embedding_dims = forward_depth_embedding_dims
+ self.odom_topic = odom_topic
+ self.lin_vel_deadband = lin_vel_deadband
+ self.ang_vel_deadband = ang_vel_deadband
+ self.move_by_wireless_remote = move_by_wireless_remote
+ self.cfg = cfg
+ self.extra_cfg = dict(
+ torque_limits= torch.tensor([33.5] * 12, dtype= torch.float32, device= self.model_device, requires_grad= False), # Nm
+ # torque_limits= torch.tensor([1, 5, 5] * 4, dtype= torch.float32, device= self.model_device, requires_grad= False), # Nm
+ dof_map= [ # from isaacgym simulation joint order to URDF order
+ 3, 4, 5,
+ 0, 1, 2,
+ 9, 10,11,
+ 6, 7, 8,
+ ], # real_joint_idx = dof_map[sim_joint_idx]
+ dof_names= [ # NOTE: order matters. This list is the order in simulation.
+ "FL_hip_joint",
+ "FL_thigh_joint",
+ "FL_calf_joint",
+
+ "FR_hip_joint",
+ "FR_thigh_joint",
+ "FR_calf_joint",
+
+ "RL_hip_joint",
+ "RL_thigh_joint",
+ "RL_calf_joint",
+
+ "RR_hip_joint",
+ "RR_thigh_joint",
+ "RR_calf_joint",
+ ],
+ # motor strength is multiplied directly to the action.
+ motor_strength= torch.ones(12, dtype= torch.float32, device= self.model_device, requires_grad= False),
+ ); self.extra_cfg.update(extra_cfg)
+ if "torque_limits" in self.cfg["control"]:
+ if isinstance(self.cfg["control"]["torque_limits"], (tuple, list)):
+ for i in range(len(self.cfg["control"]["torque_limits"])):
+ self.extra_cfg["torque_limits"][i] = self.cfg["control"]["torque_limits"][i]
+ else:
+ self.extra_cfg["torque_limits"][:] = self.cfg["control"]["torque_limits"]
+ self.command_buf = torch.zeros((self.num_envs, 3,), device= self.model_device, dtype= torch.float32) # zeros for initialization
+ self.actions = torch.zeros((1, 12), device= model_device, dtype= torch.float32)
+
+ self.process_configs()
+
+ def start_ros(self):
+ # initialze several buffers so that the system works even without message update.
+ # self.low_state_buffer = LowState() # not initialized, let input message update it.
+ self.base_position_buffer = torch.zeros((self.num_envs, 3), device= self.model_device, requires_grad= False)
+ self.legs_cmd_publisher = rospy.Publisher(
+ self.robot_namespace + self.legs_cmd_topic,
+ LegsCmd,
+ queue_size= 1,
+ )
+ # self.debug_publisher = rospy.Publisher(
+ # "/DNNmodel_debug",
+ # Float32MultiArray,
+ # queue_size= 1,
+ # )
+ # NOTE: this launches the subscriber callback function
+ self.low_state_subscriber = rospy.Subscriber(
+ self.robot_namespace + self.low_state_topic,
+ LowState,
+ self.update_low_state,
+ queue_size= 1,
+ )
+ self.odom_subscriber = rospy.Subscriber(
+ self.robot_namespace + self.odom_topic,
+ Odometry,
+ self.update_base_pose,
+ queue_size= 1,
+ )
+ if not self.move_by_wireless_remote:
+ self.move_cmd_subscriber = rospy.Subscriber(
+ "/cmd_vel",
+ Twist,
+ self.update_move_cmd,
+ queue_size= 1,
+ )
+ if "forward_depth" in self.all_obs_components:
+ if not self.forward_depth_embedding_dims:
+ self.forward_depth_subscriber = rospy.Subscriber(
+ self.robot_namespace + self.forward_depth_topic,
+ Image,
+ self.update_forward_depth,
+ queue_size= 1,
+ )
+ else:
+ self.forward_depth_subscriber = rospy.Subscriber(
+ self.robot_namespace + self.forward_depth_topic,
+ Float32MultiArrayStamped,
+ self.update_forward_depth_embedding,
+ queue_size= 1,
+ )
+ self.pose_cmd_subscriber = rospy.Subscriber(
+ "/body_pose",
+ Pose,
+ self.dummy_handler,
+ queue_size= 1,
+ )
+
+ def wait_untill_ros_working(self):
+ rate = rospy.Rate(100)
+ while not hasattr(self, "low_state_buffer"):
+ rate.sleep()
+ rospy.loginfo("UnitreeA1Real.low_state_buffer acquired, stop waiting.")
+
+ def process_configs(self):
+ self.up_axis_idx = 2 # 2 for z, 1 for y -> adapt gravity accordingly
+ self.gravity_vec = torch.zeros((self.num_envs, 3), dtype= torch.float32)
+ self.gravity_vec[:, self.up_axis_idx] = -1
+
+ self.obs_scales = self.cfg["normalization"]["obs_scales"]
+ self.obs_scales["dof_pos"] = torch.tensor(self.obs_scales["dof_pos"], device= self.model_device, dtype= torch.float32)
+ if not isinstance(self.cfg["control"]["damping"]["joint"], (list, tuple)):
+ self.cfg["control"]["damping"]["joint"] = [self.cfg["control"]["damping"]["joint"]] * 12
+ if not isinstance(self.cfg["control"]["stiffness"]["joint"], (list, tuple)):
+ self.cfg["control"]["stiffness"]["joint"] = [self.cfg["control"]["stiffness"]["joint"]] * 12
+ self.d_gains = torch.tensor(self.cfg["control"]["damping"]["joint"], device= self.model_device, dtype= torch.float32)
+ self.p_gains = torch.tensor(self.cfg["control"]["stiffness"]["joint"], device= self.model_device, dtype= torch.float32)
+ self.default_dof_pos = torch.zeros(12, device= self.model_device, dtype= torch.float32)
+ for i in range(12):
+ name = self.extra_cfg["dof_names"][i]
+ default_joint_angle = self.cfg["init_state"]["default_joint_angles"][name]
+ self.default_dof_pos[i] = default_joint_angle
+
+ self.computer_clip_torque = self.cfg["control"].get("computer_clip_torque", True)
+ rospy.loginfo("Computer Clip Torque (onboard) is " + str(self.computer_clip_torque))
+ if self.computer_clip_torque:
+ self.torque_limits = self.extra_cfg["torque_limits"]
+ rospy.loginfo("[Env] torque limit: {:.1f} {:.1f} {:.1f}".format(*self.torque_limits[:3]))
+
+ self.commands_scale = torch.tensor([
+ self.obs_scales["lin_vel"],
+ self.obs_scales["lin_vel"],
+ self.obs_scales["lin_vel"],
+ ], device= self.model_device, requires_grad= False)
+
+ self.obs_segments = self.get_obs_segment_from_components(self.cfg["env"]["obs_components"])
+ self.num_obs = self.get_num_obs_from_components(self.cfg["env"]["obs_components"])
+ components = self.cfg["env"].get("privileged_obs_components", None)
+ self.privileged_obs_segments = None if components is None else self.get_num_obs_from_components(components)
+ self.num_privileged_obs = None if components is None else self.get_num_obs_from_components(components)
+ self.all_obs_components = self.cfg["env"]["obs_components"] + (self.cfg["env"].get("privileged_obs_components", []) if components is not None else [])
+
+ # store config values to attributes to improve speed
+ self.clip_obs = self.cfg["normalization"]["clip_observations"]
+ self.control_type = self.cfg["control"]["control_type"]
+ self.action_scale = self.cfg["control"]["action_scale"]
+ rospy.loginfo("[Env] action scale: {:.1f}".format(self.action_scale))
+ self.clip_actions = self.cfg["normalization"]["clip_actions"]
+ if self.cfg["normalization"].get("clip_actions_method", None) == "hard":
+ rospy.loginfo("clip_actions_method with hard mode")
+ rospy.loginfo("clip_actions_high: " + str(self.cfg["normalization"]["clip_actions_high"]))
+ rospy.loginfo("clip_actions_low: " + str(self.cfg["normalization"]["clip_actions_low"]))
+ self.clip_actions_method = "hard"
+ self.clip_actions_low = torch.tensor(self.cfg["normalization"]["clip_actions_low"], device= self.model_device, dtype= torch.float32)
+ self.clip_actions_high = torch.tensor(self.cfg["normalization"]["clip_actions_high"], device= self.model_device, dtype= torch.float32)
+ else:
+ rospy.loginfo("clip_actions_method is " + str(self.cfg["normalization"].get("clip_actions_method", None)))
+ self.dof_map = self.extra_cfg["dof_map"]
+
+ # get ROS params for hardware configs
+ self.joint_limits_high = torch.tensor([
+ rospy.get_param(self.robot_namespace + "/joint_limits/{}_max".format(s)) \
+ for s in ["hip", "thigh", "calf"] * 4
+ ])
+ self.joint_limits_low = torch.tensor([
+ rospy.get_param(self.robot_namespace + "/joint_limits/{}_min".format(s)) \
+ for s in ["hip", "thigh", "calf"] * 4
+ ])
+
+ if "forward_depth" in self.all_obs_components:
+ resolution = self.cfg["sensor"]["forward_camera"].get(
+ "output_resolution",
+ self.cfg["sensor"]["forward_camera"]["resolution"],
+ )
+ if not self.forward_depth_embedding_dims:
+ self.forward_depth_buf = torch.zeros(
+ (self.num_envs, *resolution),
+ device= self.model_device,
+ dtype= torch.float32,
+ )
+ else:
+ self.forward_depth_embedding_buf = torch.zeros(
+ (1, self.forward_depth_embedding_dims),
+ device= self.model_device,
+ dtype= torch.float32,
+ )
+
+ def _init_height_points(self):
+ """ Returns points at which the height measurments are sampled (in base frame)
+
+ Returns:
+ [torch.Tensor]: Tensor of shape (num_envs, self.num_height_points, 3)
+ """
+ return None
+
+ def _get_heights(self):
+ """ TODO: get estimated terrain heights around the robot base """
+ # currently return a zero tensor with valid size
+ return torch.zeros(self.num_envs, 187, device= self.model_device, requires_grad= False)
+
+ def clip_action_before_scale(self, actions):
+ actions = torch.clip(actions, -self.clip_actions, self.clip_actions)
+ if getattr(self, "clip_actions_method", None) == "hard":
+ actions = torch.clip(actions, self.clip_actions_low, self.clip_actions_high)
+
+ return actions
+
+ def clip_by_torque_limit(self, actions_scaled):
+ """ Different from simulation, we reverse the process and clip the actions directly,
+ so that the PD controller runs in robot but not our script.
+ """
+ control_type = self.cfg["control"]["control_type"]
+ if control_type == "P":
+ p_limits_low = (-self.torque_limits) + self.d_gains*self.dof_vel
+ p_limits_high = (self.torque_limits) + self.d_gains*self.dof_vel
+ actions_low = (p_limits_low/self.p_gains) - self.default_dof_pos + self.dof_pos
+ actions_high = (p_limits_high/self.p_gains) - self.default_dof_pos + self.dof_pos
+ else:
+ raise NotImplementedError
+
+ return torch.clip(actions_scaled, actions_low, actions_high)
+
+ """ Get obs components and cat to a single obs input """
+ def _get_proprioception_obs(self):
+ # base_ang_vel = quat_rotate_inverse(
+ # torch.tensor(self.low_state_buffer.imu.quaternion).unsqueeze(0),
+ # torch.tensor(self.low_state_buffer.imu.gyroscope).unsqueeze(0),
+ # ).to(self.model_device)
+ # NOTE: Different from the isaacgym.
+ # The anglar velocity is already in base frame, no need to rotate
+ base_ang_vel = torch.tensor(self.low_state_buffer.imu.gyroscope, device= self.model_device).unsqueeze(0)
+ projected_gravity = quat_rotate_inverse(
+ torch.tensor(self.low_state_buffer.imu.quaternion).unsqueeze(0),
+ self.gravity_vec,
+ ).to(self.model_device)
+ self.dof_pos = dof_pos = torch.tensor([
+ self.low_state_buffer.motorState[self.dof_map[i]].q for i in range(12)
+ ], dtype= torch.float32, device= self.model_device).unsqueeze(0)
+ self.dof_vel = dof_vel = torch.tensor([
+ self.low_state_buffer.motorState[self.dof_map[i]].dq for i in range(12)
+ ], dtype= torch.float32, device= self.model_device).unsqueeze(0)
+
+ # rospy.loginfo_throttle(5,
+ # "projected_gravity: " + \
+ # ", ".join([str(i) for i in projected_gravity[0].cpu().tolist()])
+ # )
+ # rospy.loginfo_throttle(5, "Hacking projected_gravity y -= 0.15")
+ # projected_gravity[:, 1] -= 0.15
+
+ return torch.cat([
+ torch.zeros((1, 3), device= self.model_device), # no linear velocity
+ base_ang_vel * self.obs_scales["ang_vel"],
+ projected_gravity,
+ self.command_buf * self.commands_scale,
+ (dof_pos - self.default_dof_pos) * self.obs_scales["dof_pos"],
+ dof_vel * self.obs_scales["dof_vel"],
+ self.actions
+ ], dim= -1)
+
+ def _get_forward_depth_obs(self):
+ if not self.forward_depth_embedding_dims:
+ return self.forward_depth_buf.flatten(start_dim= 1)
+ else:
+ if self.low_state_get_time.to_sec() - self.forward_depth_embedding_stamp.to_sec() > 0.4:
+ rospy.logerr("Getting depth embedding later than low_state later than 0.4s")
+ return self.forward_depth_embedding_buf.flatten(start_dim= 1)
+
+ def compute_observation(self):
+ """ use the updated low_state_buffer to compute observation vector """
+ assert hasattr(self, "legs_cmd_publisher"), "start_ros() not called, ROS handlers are not initialized!"
+ obs_segments = self.obs_segments
+ obs = []
+ for k, v in obs_segments.items():
+ obs.append(
+ getattr(self, "_get_" + k + "_obs")() * \
+ self.obs_scales.get(k, 1.)
+ )
+ obs = torch.cat(obs, dim= 1)
+ self.obs_buf = obs
+
+ """ The methods combined with outer model forms the step function
+ NOTE: the outer user handles the loop frequency.
+ """
+ def send_action(self, actions):
+ """ The function that send commands to the real robot.
+ """
+ self.actions = self.clip_action_before_scale(actions)
+ if self.computer_clip_torque:
+ robot_coordinates_action = self.clip_by_torque_limit(actions * self.action_scale) + self.default_dof_pos.unsqueeze(0)
+ else:
+ rospy.logwarn_throttle(60, "You are using control without any torque clip. The network might output torques larger than the system can provide.")
+ robot_coordinates_action = self.actions * self.action_scale + self.default_dof_pos.unsqueeze(0)
+
+ # debugging and logging
+ # transfered_action = torch.zeros_like(self.actions[0])
+ # for i in range(12):
+ # transfered_action[self.dof_map[i]] = self.actions[0, i] + self.default_dof_pos[i]
+ # self.debug_publisher.publish(Float32MultiArray(data=
+ # transfered_action\
+ # .cpu().numpy().astype(np.float32).tolist()
+ # ))
+
+ # restrict the target action delta in order to avoid robot shutdown (maybe there is another solution)
+ # robot_coordinates_action = torch.clip(
+ # robot_coordinates_action,
+ # self.dof_pos - 0.3,
+ # self.dof_pos + 0.3,
+ # )
+
+ # wrap the message and publish
+ self.publish_legs_cmd(robot_coordinates_action)
+
+ def publish_legs_cmd(self, robot_coordinates_action, kp= None, kd= None):
+ """ publish the joint position directly to the robot. NOTE: The joint order from input should
+ be in simulation order. The value should be absolute value rather than related to dof_pos.
+ """
+ robot_coordinates_action = torch.clip(
+ robot_coordinates_action.cpu(),
+ self.joint_limits_low,
+ self.joint_limits_high,
+ )
+ legs_cmd = LegsCmd()
+ for sim_joint_idx in range(12):
+ real_joint_idx = self.dof_map[sim_joint_idx]
+ legs_cmd.cmd[real_joint_idx].mode = 10
+ legs_cmd.cmd[real_joint_idx].q = robot_coordinates_action[0, sim_joint_idx] if self.control_type == "P" else rospy.get_param(self.robot_namespace + "/PosStopF", (2.146e+9))
+ legs_cmd.cmd[real_joint_idx].dq = 0.
+ legs_cmd.cmd[real_joint_idx].tau = 0.
+ legs_cmd.cmd[real_joint_idx].Kp = self.p_gains[sim_joint_idx] if kp is None else kp
+ legs_cmd.cmd[real_joint_idx].Kd = self.d_gains[sim_joint_idx] if kd is None else kd
+ self.legs_cmd_publisher.publish(legs_cmd)
+
+ def get_obs(self):
+ """ The function that refreshes the buffer and return the observation vector.
+ """
+ self.compute_observation()
+ self.obs_buf = torch.clip(self.obs_buf, -self.clip_obs, self.clip_obs)
+ return self.obs_buf.to(self.model_device)
+
+ """ Copied from legged_robot_field. Please check whether these are consistent. """
+ def get_obs_segment_from_components(self, components):
+ segments = OrderedDict()
+ if "proprioception" in components:
+ segments["proprioception"] = (48,)
+ if "height_measurements" in components:
+ segments["height_measurements"] = (187,)
+ if "forward_depth" in components:
+ resolution = self.cfg["sensor"]["forward_camera"].get(
+ "output_resolution",
+ self.cfg["sensor"]["forward_camera"]["resolution"],
+ )
+ segments["forward_depth"] = (1, *resolution)
+ # The following components are only for rebuilding the non-actor module.
+ # DO NOT use these in actor network and check consistency with simulator implementation.
+ if "base_pose" in components:
+ segments["base_pose"] = (6,) # xyz + rpy
+ if "robot_config" in components:
+ segments["robot_config"] = (1 + 3 + 1 + 12,)
+ if "engaging_block" in components:
+ # This could be wrong, please check the implementation of BarrierTrack
+ segments["engaging_block"] = (1 + (4 + 1) + 2,)
+ if "sidewall_distance" in components:
+ segments["sidewall_distance"] = (2,)
+ return segments
+
+ def get_num_obs_from_components(self, components):
+ obs_segments = self.get_obs_segment_from_components(components)
+ num_obs = 0
+ for k, v in obs_segments.items():
+ num_obs += np.prod(v)
+ return num_obs
+
+ """ ROS callbacks and handlers that update the buffer """
+ def update_low_state(self, ros_msg):
+ self.low_state_buffer = ros_msg
+ if self.move_by_wireless_remote:
+ self.command_buf[0, 0] = self.low_state_buffer.wirelessRemote.ly
+ self.command_buf[0, 1] = -self.low_state_buffer.wirelessRemote.lx # right-moving stick is positive
+ self.command_buf[0, 2] = -self.low_state_buffer.wirelessRemote.rx # right-moving stick is positive
+ # set the command to zero if it is too small
+ if np.linalg.norm(self.command_buf[0, :2]) < self.lin_vel_deadband:
+ self.command_buf[0, :2] = 0.
+ if np.abs(self.command_buf[0, 2]) < self.ang_vel_deadband:
+ self.command_buf[0, 2] = 0.
+ self.low_state_get_time = rospy.Time.now()
+
+ def update_base_pose(self, ros_msg):
+ """ update robot odometry for position """
+ self.base_position_buffer[0, 0] = ros_msg.pose.pose.position.x
+ self.base_position_buffer[0, 1] = ros_msg.pose.pose.position.y
+ self.base_position_buffer[0, 2] = ros_msg.pose.pose.position.z
+
+ def update_move_cmd(self, ros_msg):
+ self.command_buf[0, 0] = ros_msg.linear.x
+ self.command_buf[0, 1] = ros_msg.linear.y
+ self.command_buf[0, 2] = ros_msg.angular.z
+
+ def update_forward_depth(self, ros_msg):
+ # TODO not checked.
+ self.forward_depth_header = ros_msg.header
+ buf = ros_numpy.numpify(ros_msg)
+ self.forward_depth_buf = resize2d(
+ torch.from_numpy(buf.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(self.model_device),
+ self.forward_depth_buf.shape[-2:],
+ )
+
+ def update_forward_depth_embedding(self, ros_msg):
+ rospy.loginfo_once("a1_ros_run recieved forward depth embedding.")
+ self.forward_depth_embedding_stamp = ros_msg.header.stamp
+ self.forward_depth_embedding_buf[:] = torch.tensor(ros_msg.data).unsqueeze(0) # (1, d)
+
+ def dummy_handler(self, ros_msg):
+ """ To meet the need of teleop-legged-robots requirements """
+ pass
diff --git a/onboard_script/a1_ros_run.py b/onboard_script/a1_ros_run.py
new file mode 100644
index 0000000..9e37b32
--- /dev/null
+++ b/onboard_script/a1_ros_run.py
@@ -0,0 +1,402 @@
+#!/home/unitree/agility_ziwenz_venv/bin/python
+import os
+import os.path as osp
+import json
+import numpy as np
+import torch
+from collections import OrderedDict
+from functools import partial
+from typing import Tuple
+
+import rospy
+from std_msgs.msg import Float32MultiArray
+from sensor_msgs.msg import Image
+import ros_numpy
+
+from a1_real import UnitreeA1Real, resize2d
+from rsl_rl import modules
+from rsl_rl.utils.utils import get_obs_slice
+
+@torch.no_grad()
+def handle_forward_depth(ros_msg, model, publisher, output_resolution, device):
+ """ The callback function to handle the forward depth and send the embedding through ROS topic """
+ buf = ros_numpy.numpify(ros_msg).astype(np.float32)
+ forward_depth_buf = resize2d(
+ torch.from_numpy(buf).unsqueeze(0).unsqueeze(0).to(device),
+ output_resolution,
+ )
+ embedding = model(forward_depth_buf)
+ ros_data = embedding.reshape(-1).cpu().numpy().astype(np.float32)
+ publisher.publish(Float32MultiArray(data= ros_data.tolist()))
+
+class StandOnlyModel(torch.nn.Module):
+ def __init__(self, action_scale, dof_pos_scale, tolerance= 0.2, delta= 0.1):
+ rospy.loginfo("Using stand only model, please make sure the proprioception is 48 dim.")
+ rospy.loginfo("Using stand only model, -36 to -24 must be joint position.")
+ super().__init__()
+ if isinstance(action_scale, (tuple, list)):
+ self.register_buffer("action_scale", torch.tensor(action_scale))
+ else:
+ self.action_scale = action_scale
+ if isinstance(dof_pos_scale, (tuple, list)):
+ self.register_buffer("dof_pos_scale", torch.tensor(dof_pos_scale))
+ else:
+ self.dof_pos_scale = dof_pos_scale
+ self.tolerance = tolerance
+ self.delta = delta
+
+ def forward(self, obs):
+ joint_positions = obs[..., -36:-24] / self.dof_pos_scale
+ diff_large_mask = torch.abs(joint_positions) > self.tolerance
+ target_positions = torch.zeros_like(joint_positions)
+ target_positions[diff_large_mask] = joint_positions[diff_large_mask] - self.delta * torch.sign(joint_positions[diff_large_mask])
+ return torch.clip(
+ target_positions / self.action_scale,
+ -1.0, 1.0,
+ )
+
+ def reset(self, *args, **kwargs):
+ pass
+
+def load_walk_policy(env, model_dir):
+ """ Load the walk policy from the model directory """
+ if model_dir == None:
+ model = StandOnlyModel(
+ action_scale= env.action_scale,
+ dof_pos_scale= env.obs_scales["dof_pos"],
+ )
+ policy = torch.jit.script(model)
+
+ else:
+ with open(osp.join(model_dir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ obs_components = config_dict["env"]["obs_components"]
+ privileged_obs_components = config_dict["env"].get("privileged_obs_components", obs_components)
+ model = getattr(modules, config_dict["runner"]["policy_class_name"])(
+ num_actor_obs= env.get_num_obs_from_components(obs_components),
+ num_critic_obs= env.get_num_obs_from_components(privileged_obs_components),
+ num_actions= 12,
+ **config_dict["policy"],
+ )
+ model_names = [i for i in os.listdir(model_dir) if i.startswith("model_")]
+ model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0]))
+ state_dict = torch.load(osp.join(model_dir, model_names[-1]), map_location= "cpu")
+ model.load_state_dict(state_dict["model_state_dict"])
+ model_action_scale = torch.tensor(config_dict["control"]["action_scale"]) if isinstance(config_dict["control"]["action_scale"], (tuple, list)) else torch.tensor([config_dict["control"]["action_scale"]])[0]
+ if not (torch.is_tensor(model_action_scale) and (model_action_scale == env.action_scale).all()):
+ action_rescale_ratio = model_action_scale / env.action_scale
+ print("walk_policy action scaling:", action_rescale_ratio.tolist())
+ else:
+ action_rescale_ratio = 1.0
+ memory_module = model.memory_a
+ actor_mlp = model.actor
+ @torch.jit.script
+ def policy_run(obs):
+ recurrent_embedding = memory_module(obs)
+ actions = actor_mlp(recurrent_embedding.squeeze(0))
+ return actions
+ if (torch.is_tensor(action_rescale_ratio) and (action_rescale_ratio == 1.).all()) \
+ or (not torch.is_tensor(action_rescale_ratio) and action_rescale_ratio == 1.):
+ policy = policy_run
+ else:
+ policy = lambda x: policy_run(x) * action_rescale_ratio
+
+ return policy, model
+
+def standup_procedure(env, ros_rate, angle_tolerance= 0.1,
+ kp= None,
+ kd= None,
+ warmup_timesteps= 25,
+ device= "cpu",
+ ):
+ """
+ Args:
+ warmup_timesteps: the number of timesteps to linearly increase the target position
+ """
+ rospy.loginfo("Robot standing up, please wait ...")
+
+ target_pos = torch.zeros((1, 12), device= device, dtype= torch.float32)
+ standup_timestep_i = 0
+ while not rospy.is_shutdown():
+ dof_pos = [env.low_state_buffer.motorState[env.dof_map[i]].q for i in range(12)]
+ diff = [env.default_dof_pos[i].item() - dof_pos[i] for i in range(12)]
+ direction = [1 if i > 0 else -1 for i in diff]
+ if standup_timestep_i < warmup_timesteps:
+ direction = [standup_timestep_i / warmup_timesteps * i for i in direction]
+ if all([abs(i) < angle_tolerance for i in diff]):
+ break
+ print("max joint error (rad):", max([abs(i) for i in diff]), end= "\r")
+ for i in range(12):
+ target_pos[0, i] = dof_pos[i] + direction[i] * angle_tolerance if abs(diff[i]) > angle_tolerance else env.default_dof_pos[i]
+ env.publish_legs_cmd(target_pos,
+ kp= kp,
+ kd= kd,
+ )
+ ros_rate.sleep()
+ standup_timestep_i += 1
+
+ rospy.loginfo("Robot stood up! press R1 on the remote control to continue ...")
+ while not rospy.is_shutdown():
+ if env.low_state_buffer.wirelessRemote.btn.components.R1:
+ break
+ if env.low_state_buffer.wirelessRemote.btn.components.L2 or env.low_state_buffer.wirelessRemote.btn.components.R2:
+ env.publish_legs_cmd(env.default_dof_pos.unsqueeze(0), kp= 0, kd= 0.5)
+ rospy.signal_shutdown("Controller send stop signal, exiting")
+ exit(0)
+ env.publish_legs_cmd(env.default_dof_pos.unsqueeze(0), kp= kp, kd= kd)
+ ros_rate.sleep()
+ rospy.loginfo("Robot standing up procedure finished!")
+
+class SkilledA1Real(UnitreeA1Real):
+ """ Some additional methods to help the execution of skill policy """
+ def __init__(self, *args,
+ skill_mode_threhold= 0.1,
+ skill_vel_range= [0.0, 1.0],
+ **kwargs,
+ ):
+ self.skill_mode_threhold = skill_mode_threhold
+ self.skill_vel_range = skill_vel_range
+ super().__init__(*args, **kwargs)
+
+ def is_skill_mode(self):
+ if self.move_by_wireless_remote:
+ return self.low_state_buffer.wirelessRemote.ry > self.skill_mode_threhold
+ else:
+ # Not implemented yet
+ return False
+
+ def update_low_state(self, ros_msg):
+ self.low_state_buffer = ros_msg
+ if self.move_by_wireless_remote and ros_msg.wirelessRemote.ry > self.skill_mode_threhold:
+ skill_vel = (self.low_state_buffer.wirelessRemote.ry - self.skill_mode_threhold) / (1.0 - self.skill_mode_threhold)
+ skill_vel *= self.skill_vel_range[1] - self.skill_vel_range[0]
+ skill_vel += self.skill_vel_range[0]
+ self.command_buf[0, 0] = skill_vel
+ self.command_buf[0, 1] = 0.
+ self.command_buf[0, 2] = 0.
+ return
+ return super().update_low_state(ros_msg)
+
+def main(args):
+ log_level = rospy.DEBUG if args.debug else rospy.INFO
+ rospy.init_node("a1_legged_gym_" + args.mode, log_level= log_level)
+
+ """ Not finished this modification yet """
+ # if args.logdir is not None:
+ # rospy.loginfo("Use logdir/config.json to initialize env proxy.")
+ # with open(osp.join(args.logdir, "config.json"), "r") as f:
+ # config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ # else:
+ # assert args.walkdir is not None, "You must provide at least a --logdir or --walkdir"
+ # rospy.logwarn("You did not provide logdir, use walkdir/config.json for initializing env proxy.")
+ # with open(osp.join(args.walkdir, "config.json"), "r") as f:
+ # config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ assert args.logdir is not None
+ with open(osp.join(args.logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+
+ duration = config_dict["sim"]["dt"] * config_dict["control"]["decimation"] # in sec
+ # config_dict["control"]["stiffness"]["joint"] -= 2.5 # kp
+
+ model_device = torch.device("cpu") if args.mode == "upboard" else torch.device("cuda")
+
+ unitree_real_env = SkilledA1Real(
+ robot_namespace= args.namespace,
+ cfg= config_dict,
+ forward_depth_topic= "/visual_embedding" if args.mode == "upboard" else "/camera/depth/image_rect_raw",
+ forward_depth_embedding_dims= config_dict["policy"]["visual_latent_size"] if args.mode == "upboard" else None,
+ move_by_wireless_remote= True,
+ skill_vel_range= config_dict["commands"]["ranges"]["lin_vel_x"],
+ model_device= model_device,
+ # extra_cfg= dict(
+ # motor_strength= torch.tensor([
+ # 1., 1./0.9, 1./0.9,
+ # 1., 1./0.9, 1./0.9,
+ # 1., 1., 1.,
+ # 1., 1., 1.,
+ # ], dtype= torch.float32, device= model_device, requires_grad= False),
+ # ),
+ )
+
+ model = getattr(modules, config_dict["runner"]["policy_class_name"])(
+ num_actor_obs= unitree_real_env.num_obs,
+ num_critic_obs= unitree_real_env.num_privileged_obs,
+ num_actions= 12,
+ obs_segments= unitree_real_env.obs_segments,
+ privileged_obs_segments= unitree_real_env.privileged_obs_segments,
+ **config_dict["policy"],
+ )
+ config_dict["terrain"]["measure_heights"] = False
+ # load the model with the latest checkpoint
+ model_names = [i for i in os.listdir(args.logdir) if i.startswith("model_")]
+ model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0]))
+ state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu")
+ model.load_state_dict(state_dict["model_state_dict"])
+ model.to(model_device)
+ model.eval()
+
+ rospy.loginfo("duration: {}, motor Kp: {}, motor Kd: {}".format(
+ duration,
+ config_dict["control"]["stiffness"]["joint"],
+ config_dict["control"]["damping"]["joint"],
+ ))
+ # rospy.loginfo("[Env] motor strength: {}".format(unitree_real_env.motor_strength))
+
+ if args.mode == "jetson":
+ embeding_publisher = rospy.Publisher(
+ args.namespace + "/visual_embedding",
+ Float32MultiArray,
+ queue_size= 1,
+ )
+ # extract and build the torch ScriptFunction
+ visual_encoder = model.visual_encoder
+ visual_encoder = torch.jit.script(visual_encoder)
+
+ forward_depth_subscriber = rospy.Subscriber(
+ args.namespace + "/camera/depth/image_rect_raw",
+ Image,
+ partial(handle_forward_depth,
+ model= visual_encoder,
+ publisher= embeding_publisher,
+ output_resolution= config_dict["sensor"]["forward_camera"].get(
+ "output_resolution",
+ config_dict["sensor"]["forward_camera"]["resolution"],
+ ),
+ device= model_device,
+ ),
+ queue_size= 1,
+ )
+ rospy.spin()
+ elif args.mode == "upboard":
+ # extract and build the torch ScriptFunction
+ memory_module = model.memory_a
+ actor_mlp = model.actor
+ @torch.jit.script
+ def policy(obs):
+ recurrent_embedding = memory_module(obs)
+ actions = actor_mlp(recurrent_embedding.squeeze(0))
+ return actions
+
+ walk_policy, walk_model = load_walk_policy(unitree_real_env, args.walkdir)
+
+ using_walk_policy = True # switch between skill policy and walk policy
+ unitree_real_env.start_ros()
+ unitree_real_env.wait_untill_ros_working()
+ rate = rospy.Rate(1 / duration)
+ with torch.no_grad():
+ if not args.debug:
+ standup_procedure(unitree_real_env, rate,
+ angle_tolerance= 0.2,
+ kp= 40,
+ kd= 0.5,
+ warmup_timesteps= 50,
+ device= model_device,
+ )
+ while not rospy.is_shutdown():
+ # inference_start_time = rospy.get_time()
+ # check remote controller and decide which policy to use
+ if unitree_real_env.is_skill_mode():
+ if using_walk_policy:
+ rospy.loginfo_throttle(0.1, "switch to skill policy")
+ using_walk_policy = False
+ model.reset()
+ else:
+ if not using_walk_policy:
+ rospy.loginfo_throttle(0.1, "switch to walk policy")
+ using_walk_policy = True
+ walk_model.reset()
+ if not using_walk_policy:
+ obs = unitree_real_env.get_obs()
+ actions = policy(obs)
+ else:
+ walk_obs = unitree_real_env._get_proprioception_obs()
+ actions = walk_policy(walk_obs)
+ unitree_real_env.send_action(actions)
+ # unitree_real_env.send_action(torch.zeros((1, 12)))
+ # inference_duration = rospy.get_time() - inference_start_time
+ # rospy.loginfo("inference duration: {:.3f}".format(inference_duration))
+ # rospy.loginfo("visual_latency: %f", rospy.get_time() - unitree_real_env.forward_depth_embedding_stamp.to_sec())
+ # motor_temperatures = [motor_state.temperature for motor_state in unitree_real_env.low_state_buffer.motorState]
+ # rospy.loginfo_throttle(10, " ".join(["motor_temperatures:"] + ["{:d},".format(t) for t in motor_temperatures[:12]]))
+ rate.sleep()
+ if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.down:
+ rospy.loginfo_throttle(0.1, "model reset")
+ model.reset()
+ walk_model.reset()
+ if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.L2 or unitree_real_env.low_state_buffer.wirelessRemote.btn.components.R2:
+ unitree_real_env.publish_legs_cmd(unitree_real_env.default_dof_pos.unsqueeze(0), kp= 2, kd= 0.5)
+ rospy.signal_shutdown("Controller send stop signal, exiting")
+ elif args.mode == "full":
+ # extract and build the torch ScriptFunction
+ visual_obs_slice = get_obs_slice(unitree_real_env.obs_segments, "forward_depth")
+ visual_encoder = model.visual_encoder
+ memory_module = model.memory_a
+ actor_mlp = model.actor
+ @torch.jit.script
+ def policy(observations: torch.Tensor, obs_start: int, obs_stop: int, obs_shape: Tuple[int, int, int]):
+ visual_latent = visual_encoder(
+ observations[..., obs_start:obs_stop].reshape(-1, *obs_shape)
+ ).reshape(1, -1)
+ obs = torch.cat([
+ observations[..., :obs_start],
+ visual_latent,
+ observations[..., obs_stop:],
+ ], dim= -1)
+ recurrent_embedding = memory_module(obs)
+ actions = actor_mlp(recurrent_embedding.squeeze(0))
+ return actions
+
+ unitree_real_env.start_ros()
+ unitree_real_env.wait_untill_ros_working()
+ rate = rospy.Rate(1 / duration)
+ with torch.no_grad():
+ while not rospy.is_shutdown():
+ # inference_start_time = rospy.get_time()
+ obs = unitree_real_env.get_obs()
+ actions = policy(obs,
+ obs_start= visual_obs_slice[0].start.item(),
+ obs_stop= visual_obs_slice[0].stop.item(),
+ obs_shape= visual_obs_slice[1],
+ )
+ unitree_real_env.send_action(actions)
+ # inference_duration = rospy.get_time() - inference_start_time
+ motor_temperatures = [motor_state.temperature for motor_state in unitree_real_env.low_state_buffer.motorState]
+ rospy.loginfo_throttle(10, " ".join(["motor_temperatures:"] + ["{:d},".format(t) for t in motor_temperatures[:12]]))
+ rate.sleep()
+ if unitree_real_env.low_state_buffer.wirelessRemote.btn.components.L2 or unitree_real_env.low_state_buffer.wirelessRemote.btn.components.R2:
+ unitree_real_env.publish_legs_cmd(unitree_real_env.default_dof_pos.unsqueeze(0), kp= 20, kd= 0.5)
+ rospy.signal_shutdown("Controller send stop signal, exiting")
+ else:
+ rospy.logfatal("Unknown mode, exiting")
+
+if __name__ == "__main__":
+ """ The script to run the A1 script in ROS.
+ It's designed as a main function and not designed to be a scalable code.
+ """
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--namespace",
+ type= str,
+ default= "/a112138",
+ )
+ parser.add_argument("--logdir",
+ type= str,
+ help= "The log directory of the trained model",
+ default= None,
+ )
+ parser.add_argument("--walkdir",
+ type= str,
+ help= "The log directory of the walking model, not for the skills.",
+ default= None,
+ )
+ parser.add_argument("--mode",
+ type= str,
+ help= "The mode to determine which computer to run on.",
+ choices= ["jetson", "upboard", "full"],
+ )
+ parser.add_argument("--debug",
+ action= "store_true",
+ )
+
+ args = parser.parse_args()
+ main(args)
\ No newline at end of file
diff --git a/onboard_script/a1_visual_embedding.py b/onboard_script/a1_visual_embedding.py
new file mode 100644
index 0000000..b838b8b
--- /dev/null
+++ b/onboard_script/a1_visual_embedding.py
@@ -0,0 +1,317 @@
+import os
+import os.path as osp
+import numpy as np
+import torch
+import json
+from functools import partial
+from collections import OrderedDict
+
+from a1_real import UnitreeA1Real, resize2d
+from rsl_rl import modules
+
+import rospy
+from unitree_legged_msgs.msg import Float32MultiArrayStamped
+from sensor_msgs.msg import Image
+import ros_numpy
+
+import pyrealsense2 as rs
+
+def get_encoder_script(logdir):
+ with open(osp.join(logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+
+ model_device = torch.device("cuda")
+
+ unitree_real_env = UnitreeA1Real(
+ robot_namespace= "a112138",
+ cfg= config_dict,
+ forward_depth_topic= "", # this env only computes parameters to build the model
+ forward_depth_embedding_dims= None,
+ model_device= model_device,
+ )
+
+ model = getattr(modules, config_dict["runner"]["policy_class_name"])(
+ num_actor_obs= unitree_real_env.num_obs,
+ num_critic_obs= unitree_real_env.num_privileged_obs,
+ num_actions= 12,
+ obs_segments= unitree_real_env.obs_segments,
+ privileged_obs_segments= unitree_real_env.privileged_obs_segments,
+ **config_dict["policy"],
+ )
+ model_names = [i for i in os.listdir(logdir) if i.startswith("model_")]
+ model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0]))
+ state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu")
+ model.load_state_dict(state_dict["model_state_dict"])
+ model.to(model_device)
+ model.eval()
+
+ visual_encoder = model.visual_encoder
+ script = torch.jit.script(visual_encoder)
+
+ return script, model_device
+
+def get_input_filter(args):
+ """ This is the filter different from the simulator, but try to close the gap. """
+ with open(osp.join(args.logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ image_resolution = config_dict["sensor"]["forward_camera"].get(
+ "output_resolution",
+ config_dict["sensor"]["forward_camera"]["resolution"],
+ )
+ depth_range = config_dict["sensor"]["forward_camera"].get(
+ "depth_range",
+ [0.0, 3.0],
+ )
+ depth_range = (depth_range[0] * 1000, depth_range[1] * 1000) # [m] -> [mm]
+ crop_top, crop_bottom, crop_left, crop_right = args.crop_top, args.crop_bottom, args.crop_left, args.crop_right
+ crop_far = args.crop_far * 1000
+
+ def input_filter(depth_image: torch.Tensor,
+ crop_top: int,
+ crop_bottom: int,
+ crop_left: int,
+ crop_right: int,
+ crop_far: float,
+ depth_min: int,
+ depth_max: int,
+ output_height: int,
+ output_width: int,
+ ):
+ """ depth_image must have shape [1, 1, H, W] """
+ depth_image = depth_image[:, :,
+ crop_top: -crop_bottom-1,
+ crop_left: -crop_right-1,
+ ]
+ depth_image[depth_image > crop_far] = depth_max
+ depth_image = torch.clip(
+ depth_image,
+ depth_min,
+ depth_max,
+ ) / (depth_max - depth_min)
+ depth_image = resize2d(depth_image, (output_height, output_width))
+ return depth_image
+ # input_filter = torch.jit.script(input_filter)
+
+ return partial(input_filter,
+ crop_top= crop_top,
+ crop_bottom= crop_bottom,
+ crop_left= crop_left,
+ crop_right= crop_right,
+ crop_far= crop_far,
+ depth_min= depth_range[0],
+ depth_max= depth_range[1],
+ output_height= image_resolution[0],
+ output_width= image_resolution[1],
+ ), depth_range
+
+def get_started_pipeline(
+ height= 480,
+ width= 640,
+ fps= 30,
+ enable_rgb= False,
+ ):
+ # By default, rgb is not used.
+ pipeline = rs.pipeline()
+ config = rs.config()
+ config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps)
+ if enable_rgb:
+ config.enable_stream(rs.stream.color, width, height, rs.format.rgb8, fps)
+ profile = pipeline.start(config)
+
+ # build the sensor filter
+ hole_filling_filter = rs.hole_filling_filter(2)
+ spatial_filter = rs.spatial_filter()
+ spatial_filter.set_option(rs.option.filter_magnitude, 5)
+ spatial_filter.set_option(rs.option.filter_smooth_alpha, 0.75)
+ spatial_filter.set_option(rs.option.filter_smooth_delta, 1)
+ spatial_filter.set_option(rs.option.holes_fill, 4)
+ temporal_filter = rs.temporal_filter()
+ temporal_filter.set_option(rs.option.filter_smooth_alpha, 0.75)
+ temporal_filter.set_option(rs.option.filter_smooth_delta, 1)
+ # decimation_filter = rs.decimation_filter()
+ # decimation_filter.set_option(rs.option.filter_magnitude, 2)
+
+ def filter_func(frame):
+ frame = hole_filling_filter.process(frame)
+ frame = spatial_filter.process(frame)
+ frame = temporal_filter.process(frame)
+ # frame = decimation_filter.process(frame)
+ return frame
+
+ return pipeline, filter_func
+
+def main(args):
+ rospy.init_node("a1_legged_gym_jetson")
+
+ input_filter, depth_range = get_input_filter(args)
+ model_script, model_device = get_encoder_script(args.logdir)
+ with open(osp.join(args.logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ if config_dict.get("sensor", dict()).get("forward_camera", dict()).get("refresh_duration", None) is not None:
+ refresh_duration = config_dict["sensor"]["forward_camera"]["refresh_duration"]
+ ros_rate = rospy.Rate(1.0 / refresh_duration)
+ rospy.loginfo("Using refresh duration {}s".format(refresh_duration))
+ else:
+ ros_rate = rospy.Rate(args.fps)
+
+ rs_pipeline, rs_filters = get_started_pipeline(
+ height= args.height,
+ width= args.width,
+ fps= args.fps,
+ enable_rgb= args.enable_rgb,
+ )
+
+ # gyro_pipeline = rs.pipeline()
+ # gyro_config = rs.config()
+ # gyro_config.enable_stream(rs.stream.gyro, rs.format.motion_xyz32f, 200)
+ # gyro_profile = gyro_pipeline.start(gyro_config)
+
+ embedding_publisher = rospy.Publisher(
+ args.namespace + "/visual_embedding",
+ Float32MultiArrayStamped,
+ queue_size= 1,
+ )
+
+ if args.enable_vis:
+ depth_image_publisher = rospy.Publisher(
+ args.namespace + "/camera/depth/image_rect_raw",
+ Image,
+ queue_size= 1,
+ )
+ network_input_publisher = rospy.Publisher(
+ args.namespace + "/camera/depth/network_input_raw",
+ Image,
+ queue_size= 1,
+ )
+ if args.enable_rgb:
+ rgb_image_publisher = rospy.Publisher(
+ args.namespace + "/camera/color/image_raw",
+ Image,
+ queue_size= 1,
+ )
+
+ rospy.loginfo("Depth range is clipped to [{}, {}] and normalized".format(depth_range[0], depth_range[1]))
+ rospy.loginfo("ROS, model, realsense have been initialized.")
+ if args.enable_vis:
+ rospy.loginfo("Visualization enabled, sending depth{} images".format(", rgb" if args.enable_rgb else ""))
+ try:
+ embedding_msg = Float32MultiArrayStamped()
+ embedding_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ frame_got = False
+ while not rospy.is_shutdown():
+ # Wait for the depth image
+ frames = rs_pipeline.wait_for_frames(int( \
+ config_dict["sensor"]["forward_camera"]["latency_range"][1] \
+ * 1000)) # ms
+ embedding_msg.header.stamp = rospy.Time.now()
+ depth_frame = frames.get_depth_frame()
+ if not depth_frame:
+ continue
+ if not frame_got:
+ frame_got = True
+ rospy.loginfo("Realsense frame recieved. Sending embeddings...")
+ if args.enable_rgb:
+ color_frame = frames.get_color_frame()
+ # Use this branch to log the time when image is acquired
+ if args.enable_vis and not color_frame is None:
+ color_frame = np.asanyarray(color_frame.get_data())
+ rgb_image_msg = ros_numpy.msgify(Image, color_frame, encoding= "rgb8")
+ rgb_image_msg.header.stamp = rospy.Time.now()
+ rgb_image_msg.header.frame_id = args.namespace + "/camera_color_optical_frame"
+ rgb_image_publisher.publish(rgb_image_msg)
+
+ # Process the depth image and publish
+ depth_frame = rs_filters(depth_frame)
+ depth_image_ = np.asanyarray(depth_frame.get_data())
+ depth_image = torch.from_numpy(depth_image_.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(model_device)
+ depth_image = input_filter(depth_image)
+ with torch.no_grad():
+ depth_embedding = model_script(depth_image).reshape(-1).cpu().numpy()
+ embedding_msg.header.seq += 1
+ embedding_msg.data = depth_embedding.tolist()
+ embedding_publisher.publish(embedding_msg)
+
+ # Publish the acquired image if needed
+ if args.enable_vis:
+ depth_image_msg = ros_numpy.msgify(Image, depth_image_, encoding= "16UC1")
+ depth_image_msg.header.stamp = rospy.Time.now()
+ depth_image_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ depth_image_publisher.publish(depth_image_msg)
+ network_input_np = (\
+ depth_image.detach().cpu().numpy()[0, 0] * (depth_range[1] - depth_range[0]) \
+ + depth_range[0]
+ ).astype(np.uint16)
+ network_input_msg = ros_numpy.msgify(Image, network_input_np, encoding= "16UC1")
+ network_input_msg.header.stamp = rospy.Time.now()
+ network_input_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ network_input_publisher.publish(network_input_msg)
+
+ ros_rate.sleep()
+ finally:
+ rs_pipeline.stop()
+
+if __name__ == "__main__":
+ """ This script is designed to load the model and process the realsense image directly
+ from realsense SDK without realsense ROS wrapper
+ """
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--namespace",
+ type= str,
+ default= "/a112138",
+ )
+ parser.add_argument("--logdir",
+ type= str,
+ help= "The log directory of the trained model",
+ )
+ parser.add_argument("--height",
+ type= int,
+ default= 240,
+ help= "The height of the realsense image",
+ )
+ parser.add_argument("--width",
+ type= int,
+ default= 424,
+ help= "The width of the realsense image",
+ )
+ parser.add_argument("--fps",
+ type= int,
+ default= 30,
+ help= "The fps of the realsense image",
+ )
+ parser.add_argument("--crop_left",
+ type= int,
+ default= 60,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_right",
+ type= int,
+ default= 46,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_top",
+ type= int,
+ default= 0,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_bottom",
+ type= int,
+ default= 0,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_far",
+ type= float,
+ default= 3.0,
+ help= "asside from the config far limit, make all depth readings larger than this value to be 3.0 in un-normalized network input."
+ )
+ parser.add_argument("--enable_rgb",
+ action= "store_true",
+ help= "Whether to enable rgb image",
+ )
+ parser.add_argument("--enable_vis",
+ action= "store_true",
+ help= "Whether to publish realsense image",
+ )
+
+ args = parser.parse_args()
+ main(args)
diff --git a/onboard_script/go1_visual_embedding.py b/onboard_script/go1_visual_embedding.py
new file mode 100644
index 0000000..3043d16
--- /dev/null
+++ b/onboard_script/go1_visual_embedding.py
@@ -0,0 +1,317 @@
+import os
+import os.path as osp
+import numpy as np
+import torch
+import json
+from functools import partial
+from collections import OrderedDict
+
+from a1_real import UnitreeA1Real, resize2d
+from rsl_rl import modules
+
+import rospy
+from unitree_legged_msgs.msg import Float32MultiArrayStamped
+from sensor_msgs.msg import Image
+import ros_numpy
+
+import pyrealsense2 as rs
+
+def get_encoder_script(logdir):
+ with open(osp.join(logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+
+ model_device = torch.device("cuda")
+
+ unitree_real_env = UnitreeA1Real(
+ robot_namespace= "a112138",
+ cfg= config_dict,
+ forward_depth_topic= "", # this env only computes parameters to build the model
+ forward_depth_embedding_dims= None,
+ model_device= model_device,
+ )
+
+ model = getattr(modules, config_dict["runner"]["policy_class_name"])(
+ num_actor_obs= unitree_real_env.num_obs,
+ num_critic_obs= unitree_real_env.num_privileged_obs,
+ num_actions= 12,
+ obs_segments= unitree_real_env.obs_segments,
+ privileged_obs_segments= unitree_real_env.privileged_obs_segments,
+ **config_dict["policy"],
+ )
+ model_names = [i for i in os.listdir(logdir) if i.startswith("model_")]
+ model_names.sort(key= lambda x: int(x.split("_")[-1].split(".")[0]))
+ state_dict = torch.load(osp.join(args.logdir, model_names[-1]), map_location= "cpu")
+ model.load_state_dict(state_dict["model_state_dict"])
+ model.to(model_device)
+ model.eval()
+
+ visual_encoder = model.visual_encoder
+ script = torch.jit.script(visual_encoder)
+
+ return script, model_device
+
+def get_input_filter(args):
+ """ This is the filter different from the simulator, but try to close the gap. """
+ with open(osp.join(args.logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ image_resolution = config_dict["sensor"]["forward_camera"].get(
+ "output_resolution",
+ config_dict["sensor"]["forward_camera"]["resolution"],
+ )
+ depth_range = config_dict["sensor"]["forward_camera"].get(
+ "depth_range",
+ [0.0, 3.0],
+ )
+ depth_range = (depth_range[0] * 1000, depth_range[1] * 1000) # [m] -> [mm]
+ crop_top, crop_bottom, crop_left, crop_right = args.crop_top, args.crop_bottom, args.crop_left, args.crop_right
+ crop_far = args.crop_far * 1000
+
+ def input_filter(depth_image: torch.Tensor,
+ crop_top: int,
+ crop_bottom: int,
+ crop_left: int,
+ crop_right: int,
+ crop_far: float,
+ depth_min: int,
+ depth_max: int,
+ output_height: int,
+ output_width: int,
+ ):
+ """ depth_image must have shape [1, 1, H, W] """
+ depth_image = depth_image[:, :,
+ crop_top: -crop_bottom-1,
+ crop_left: -crop_right-1,
+ ]
+ depth_image[depth_image > crop_far] = depth_max
+ depth_image = torch.clip(
+ depth_image,
+ depth_min,
+ depth_max,
+ ) / (depth_max - depth_min)
+ depth_image = resize2d(depth_image, (output_height, output_width))
+ return depth_image
+ # input_filter = torch.jit.script(input_filter)
+
+ return partial(input_filter,
+ crop_top= crop_top,
+ crop_bottom= crop_bottom,
+ crop_left= crop_left,
+ crop_right= crop_right,
+ crop_far= crop_far,
+ depth_min= depth_range[0],
+ depth_max= depth_range[1],
+ output_height= image_resolution[0],
+ output_width= image_resolution[1],
+ ), depth_range
+
+def get_started_pipeline(
+ height= 480,
+ width= 640,
+ fps= 30,
+ enable_rgb= False,
+ ):
+ # By default, rgb is not used.
+ pipeline = rs.pipeline()
+ config = rs.config()
+ config.enable_stream(rs.stream.depth, width, height, rs.format.z16, fps)
+ if enable_rgb:
+ config.enable_stream(rs.stream.color, width, height, rs.format.rgb8, fps)
+ profile = pipeline.start(config)
+
+ # build the sensor filter
+ hole_filling_filter = rs.hole_filling_filter(2)
+ spatial_filter = rs.spatial_filter()
+ spatial_filter.set_option(rs.option.filter_magnitude, 5)
+ spatial_filter.set_option(rs.option.filter_smooth_alpha, 0.75)
+ spatial_filter.set_option(rs.option.filter_smooth_delta, 1)
+ spatial_filter.set_option(rs.option.holes_fill, 4)
+ temporal_filter = rs.temporal_filter()
+ temporal_filter.set_option(rs.option.filter_smooth_alpha, 0.75)
+ temporal_filter.set_option(rs.option.filter_smooth_delta, 1)
+ # decimation_filter = rs.decimation_filter()
+ # decimation_filter.set_option(rs.option.filter_magnitude, 2)
+
+ def filter_func(frame):
+ frame = hole_filling_filter.process(frame)
+ frame = spatial_filter.process(frame)
+ frame = temporal_filter.process(frame)
+ # frame = decimation_filter.process(frame)
+ return frame
+
+ return pipeline, filter_func
+
+def main(args):
+ rospy.init_node("a1_legged_gym_jetson")
+
+ input_filter, depth_range = get_input_filter(args)
+ model_script, model_device = get_encoder_script(args.logdir)
+ with open(osp.join(args.logdir, "config.json"), "r") as f:
+ config_dict = json.load(f, object_pairs_hook= OrderedDict)
+ if config_dict.get("sensor", dict()).get("forward_camera", dict()).get("refresh_duration", None) is not None:
+ refresh_duration = config_dict["sensor"]["forward_camera"]["refresh_duration"]
+ ros_rate = rospy.Rate(1.0 / refresh_duration)
+ rospy.loginfo("Using refresh duration {}s".format(refresh_duration))
+ else:
+ ros_rate = rospy.Rate(args.fps)
+
+ rs_pipeline, rs_filters = get_started_pipeline(
+ height= args.height,
+ width= args.width,
+ fps= args.fps,
+ enable_rgb= args.enable_rgb,
+ )
+
+ # gyro_pipeline = rs.pipeline()
+ # gyro_config = rs.config()
+ # gyro_config.enable_stream(rs.stream.gyro, rs.format.motion_xyz32f, 200)
+ # gyro_profile = gyro_pipeline.start(gyro_config)
+
+ embedding_publisher = rospy.Publisher(
+ args.namespace + "/visual_embedding",
+ Float32MultiArrayStamped,
+ queue_size= 1,
+ )
+
+ if args.enable_vis:
+ depth_image_publisher = rospy.Publisher(
+ args.namespace + "/camera/depth/image_rect_raw",
+ Image,
+ queue_size= 1,
+ )
+ network_input_publisher = rospy.Publisher(
+ args.namespace + "/camera/depth/network_input_raw",
+ Image,
+ queue_size= 1,
+ )
+ if args.enable_rgb:
+ rgb_image_publisher = rospy.Publisher(
+ args.namespace + "/camera/color/image_raw",
+ Image,
+ queue_size= 1,
+ )
+
+ rospy.loginfo("Depth range is clipped to [{}, {}] and normalized".format(depth_range[0], depth_range[1]))
+ rospy.loginfo("ROS, model, realsense have been initialized.")
+ if args.enable_vis:
+ rospy.loginfo("Visualization enabled, sending depth{} images".format(", rgb" if args.enable_rgb else ""))
+ try:
+ embedding_msg = Float32MultiArrayStamped()
+ embedding_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ frame_got = False
+ while not rospy.is_shutdown():
+ # Wait for the depth image
+ frames = rs_pipeline.wait_for_frames(int( \
+ config_dict["sensor"]["forward_camera"]["latency_range"][1] \
+ * 1000)) # ms
+ embedding_msg.header.stamp = rospy.Time.now()
+ depth_frame = frames.get_depth_frame()
+ if not depth_frame:
+ continue
+ if not frame_got:
+ frame_got = True
+ rospy.loginfo("Realsense frame recieved. Sending embeddings...")
+ if args.enable_rgb:
+ color_frame = frames.get_color_frame()
+ # Use this branch to log the time when image is acquired
+ if args.enable_vis and not color_frame is None:
+ color_frame = np.asanyarray(color_frame.get_data())
+ rgb_image_msg = ros_numpy.msgify(Image, color_frame, encoding= "rgb8")
+ rgb_image_msg.header.stamp = rospy.Time.now()
+ rgb_image_msg.header.frame_id = args.namespace + "/camera_color_optical_frame"
+ rgb_image_publisher.publish(rgb_image_msg)
+
+ # Process the depth image and publish
+ depth_frame = rs_filters(depth_frame)
+ depth_image_ = np.asanyarray(depth_frame.get_data())
+ depth_image = torch.from_numpy(depth_image_.astype(np.float32)).unsqueeze(0).unsqueeze(0).to(model_device)
+ depth_image = input_filter(depth_image)
+ with torch.no_grad():
+ depth_embedding = model_script(depth_image).reshape(-1).cpu().numpy()
+ embedding_msg.header.seq += 1
+ embedding_msg.data = depth_embedding.tolist()
+ embedding_publisher.publish(embedding_msg)
+
+ # Publish the acquired image if needed
+ if args.enable_vis:
+ depth_image_msg = ros_numpy.msgify(Image, depth_image_, encoding= "16UC1")
+ depth_image_msg.header.stamp = rospy.Time.now()
+ depth_image_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ depth_image_publisher.publish(depth_image_msg)
+ network_input_np = (\
+ depth_image.detach().cpu().numpy()[0, 0] * (depth_range[1] - depth_range[0]) \
+ + depth_range[0]
+ ).astype(np.uint16)
+ network_input_msg = ros_numpy.msgify(Image, network_input_np, encoding= "16UC1")
+ network_input_msg.header.stamp = rospy.Time.now()
+ network_input_msg.header.frame_id = args.namespace + "/camera_depth_optical_frame"
+ network_input_publisher.publish(network_input_msg)
+
+ ros_rate.sleep()
+ finally:
+ rs_pipeline.stop()
+
+if __name__ == "__main__":
+ """ This script is designed to load the model and process the realsense image directly
+ from realsense SDK without realsense ROS wrapper
+ """
+ import argparse
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--namespace",
+ type= str,
+ default= "/a112138",
+ )
+ parser.add_argument("--logdir",
+ type= str,
+ help= "The log directory of the trained model",
+ )
+ parser.add_argument("--height",
+ type= int,
+ default= 270,
+ help= "The height of the realsense image",
+ )
+ parser.add_argument("--width",
+ type= int,
+ default= 480,
+ help= "The width of the realsense image",
+ )
+ parser.add_argument("--fps",
+ type= int,
+ default= 30,
+ help= "The fps of the realsense image",
+ )
+ parser.add_argument("--crop_left",
+ type= int,
+ default= 60,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_right",
+ type= int,
+ default= 46,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_top",
+ type= int,
+ default= 0,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_bottom",
+ type= int,
+ default= 0,
+ help= "num of pixel to crop in the original pyrealsense readings."
+ )
+ parser.add_argument("--crop_far",
+ type= float,
+ default= 3.0,
+ help= "asside from the config far limit, make all depth readings larger than this value to be 3.0 in un-normalized network input."
+ )
+ parser.add_argument("--enable_rgb",
+ action= "store_true",
+ help= "Whether to enable rgb image",
+ )
+ parser.add_argument("--enable_vis",
+ action= "store_true",
+ help= "Whether to publish realsense image",
+ )
+
+ args = parser.parse_args()
+ main(args)
diff --git a/rsl_rl/rsl_rl/algorithms/tppo.py b/rsl_rl/rsl_rl/algorithms/tppo.py
index bad18a3..ed53c5b 100644
--- a/rsl_rl/rsl_rl/algorithms/tppo.py
+++ b/rsl_rl/rsl_rl/algorithms/tppo.py
@@ -164,6 +164,12 @@ class TPPO(PPO):
self.actor_critic.action_mean - minibatch.action_labels,
dim= -1
)
+ elif self.distill_target == "l1":
+ dist_loss = torch.norm(
+ self.actor_critic.action_mean - minibatch.action_labels,
+ dim= -1,
+ p= 1,
+ )
elif self.distill_target == "tanh":
# for tanh, similar to loss function for sigmoid, refer to https://stats.stackexchange.com/questions/12754/matching-loss-function-for-tanh-units-in-a-neural-net
dist_loss = F.binary_cross_entropy(
diff --git a/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py b/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py
index 550760e..e5c16f9 100644
--- a/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py
+++ b/rsl_rl/rsl_rl/modules/actor_critic_field_mutex.py
@@ -15,6 +15,8 @@ class ActorCriticFieldMutex(ActorCriticMutex):
def __init__(self,
*args,
cmd_vel_mapping = dict(),
+ reset_non_selected = "all",
+ action_smoothing_buffer_len = 1,
**kwargs,
):
""" NOTE: This implementation only supports subpolicy output to (-1., 1.) range.
@@ -24,6 +26,9 @@ class ActorCriticFieldMutex(ActorCriticMutex):
"""
super().__init__(*args, **kwargs)
self.cmd_vel_mapping = cmd_vel_mapping
+ self.reset_non_selected = reset_non_selected
+ self.action_smoothing_buffer_len = action_smoothing_buffer_len
+ self.action_smoothing_buffer = None
# load cmd_scale to assign the cmd_vel during overriding
self.cmd_scales = []
@@ -101,18 +106,33 @@ class ActorCriticFieldMutex(ActorCriticMutex):
def act_inference(self, observations):
# run entire batch for each sub policy in case the batch size and length problem.
policy_selection = self.get_policy_selection(observations)
+ if self.action_smoothing_buffer is None:
+ self.action_smoothing_buffer = torch.zeros(
+ self.action_smoothing_buffer_len,
+ *policy_selection.shape,
+ device= policy_selection.device,
+ dtype= torch.float,
+ ) # (len, N, ..., selection)
+ self.action_smoothing_buffer = torch.cat([
+ self.action_smoothing_buffer[1:],
+ policy_selection.unsqueeze(0),
+ ], dim= 0) # put the new one at the end
observations = self.recover_last_action(observations, policy_selection)
if self.cmd_vel_mapping:
observations = self.override_cmd_vel(observations, policy_selection)
outputs = [p.act_inference(observations) for p in self.submodules]
- output = torch.empty_like(outputs[0])
+ output = torch.zeros_like(outputs[0])
for idx, out in enumerate(outputs):
- output[policy_selection[..., idx]] = torch.clip(
- out[policy_selection[..., idx]] * getattr(self, "subpolicy_action_scale_{:d}".format(idx)) / self.env_action_scale,
- -1., 1.,
- )
+ output += out * getattr(self, "subpolicy_action_scale_{:d}".format(idx)) / self.env_action_scale \
+ * self.action_smoothing_buffer[..., idx].mean(dim= 0).unsqueeze(-1)
# choose one or none reset method
- self.submodules[idx].reset(~policy_selection[..., idx])
+ if self.reset_non_selected == "all" or self.reset_non_selected == True:
+ self.submodules[idx].reset(self.action_smoothing_buffer[..., idx].sum(0) == 0)
+ elif self.reset_non_selected == "when_skill" and idx > 0:
+ self.submodules[idx].reset(torch.logical_and(
+ ~policy_selection[..., idx],
+ ~policy_selection[..., 0],
+ ))
# self.submodules[idx].reset(torch.ones(observations.shape[0], dtype= bool, device= observations.device))
return output
@@ -122,16 +142,18 @@ class ActorCriticFieldMutex(ActorCriticMutex):
return super().reset(dones)
class ActorCriticClimbMutex(ActorCriticFieldMutex):
- """ A variant to handle climb-up and climb-down with seperate policies
- Climb-down policy will be the last submodule in the list
+ """ A variant to handle jump-up and jump-down with seperate policies
+ Jump-down policy will be the last submodule in the list
"""
JUMP_OBSTACLE_ID = 3 # starting from 0, referring to barrker_track.py:BarrierTrack.track_options_id_dict
def __init__(self,
*args,
sub_policy_paths: list = None,
- climb_down_policy_path: str = None,
+ jump_down_policy_path: str = None,
+ jump_down_vel: float = None, # can be tuple/list, use it to stop using jump up velocity command
**kwargs,):
- sub_policy_paths = sub_policy_paths + [climb_down_policy_path]
+ sub_policy_paths = sub_policy_paths + [jump_down_policy_path]
+ self.jump_down_vel = jump_down_vel
super().__init__(
*args,
sub_policy_paths= sub_policy_paths,
@@ -140,23 +162,28 @@ class ActorCriticClimbMutex(ActorCriticFieldMutex):
def resample_cmd_vel_current(self, dones=None):
return_ = super().resample_cmd_vel_current(dones)
- self.cmd_vel_current[len(self.submodules) - 1] = self.cmd_vel_current[self.JUMP_OBSTACLE_ID]
+ if self.jump_down_vel is None:
+ self.cmd_vel_current[len(self.submodules) - 1] = self.cmd_vel_current[self.JUMP_OBSTACLE_ID]
+ elif isinstance(self.jump_down_vel, (tuple, list)):
+ self.cmd_vel_current[len(self.submodules) - 1] = np.random.uniform(*self.jump_down_vel)
+ else:
+ self.cmd_vel_current[len(self.submodules) - 1] = self.jump_down_vel
return return_
def get_policy_selection(self, observations):
obstacle_id_onehot = super().get_policy_selection(observations)
obs_slice = get_obs_slice(self.obs_segments, "engaging_block")
engaging_block_obs = observations[..., obs_slice[0]].reshape(*observations.shape[:-1], *obs_slice[1])
- climb_up_mask = engaging_block_obs[..., -1] > 0 # climb-up or climb-down
+ jump_up_mask = engaging_block_obs[..., -1] > 0 # jump-up or jump-down
obstacle_id_onehot = torch.cat([
obstacle_id_onehot,
torch.logical_and(
obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID],
- torch.logical_not(climb_up_mask),
+ torch.logical_not(jump_up_mask),
).unsqueeze(-1)
], dim= -1)
obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID] = torch.logical_and(
obstacle_id_onehot[..., self.JUMP_OBSTACLE_ID],
- climb_up_mask,
+ jump_up_mask,
)
return obstacle_id_onehot.to(torch.bool) # (N, ..., selection)
diff --git a/rsl_rl/rsl_rl/runners/on_policy_runner.py b/rsl_rl/rsl_rl/runners/on_policy_runner.py
index 8ae84e6..7d9c043 100644
--- a/rsl_rl/rsl_rl/runners/on_policy_runner.py
+++ b/rsl_rl/rsl_rl/runners/on_policy_runner.py
@@ -76,6 +76,7 @@ class OnPolicyRunner:
self.tot_timesteps = 0
self.tot_time = 0
self.current_learning_iteration = 0
+ self.log_interval = self.cfg.get("log_interval", 1)
_, _ = self.env.reset()
@@ -130,7 +131,7 @@ class OnPolicyRunner:
losses, stats = self.alg.update(self.current_learning_iteration)
stop = time.time()
learn_time = stop - start
- if self.log_dir is not None:
+ if self.log_dir is not None and self.current_learning_iteration % self.log_interval == 0:
self.log(locals())
if self.current_learning_iteration % self.save_interval == 0 and self.current_learning_iteration > start_iter:
self.save(os.path.join(self.log_dir, 'model_{}.pt'.format(self.current_learning_iteration)))
@@ -238,7 +239,7 @@ class OnPolicyRunner:
def load(self, path, load_optimizer=True):
loaded_dict = torch.load(path)
self.alg.actor_critic.load_state_dict(loaded_dict['model_state_dict'])
- if load_optimizer:
+ if load_optimizer and "optimizer_state_dict" in loaded_dict:
self.alg.optimizer.load_state_dict(loaded_dict['optimizer_state_dict'])
if "lr_scheduler_state_dict" in loaded_dict:
if not hasattr(self.alg, "lr_scheduler"):
diff --git a/rsl_rl/rsl_rl/runners/two_stage_runner.py b/rsl_rl/rsl_rl/runners/two_stage_runner.py
index 1629dac..0333fbd 100644
--- a/rsl_rl/rsl_rl/runners/two_stage_runner.py
+++ b/rsl_rl/rsl_rl/runners/two_stage_runner.py
@@ -12,6 +12,7 @@ class TwoStageRunner(OnPolicyRunner):
# load some configs and their default values
self.pretrain_iterations = self.cfg.get("pretrain_iterations", 0)
+ self.log_interval = self.cfg.get("log_interval", 50)
assert "pretrain_dataset" in self.cfg, "pretrain_dataset is not defined in the runner cfg object"
self.rollout_dataset = RolloutDataset(
**self.cfg["pretrain_dataset"],